From c9423cae7bb694217994fd18214385b4cd075400 Mon Sep 17 00:00:00 2001 From: Eduard Kuzmenko Date: Sat, 28 Jan 2023 15:53:18 +0400 Subject: [PATCH] Build --- .env | 4 ++-- ...b4ddd68a9d8.chunk.js => 104.e24e7fdd92837aca2688.chunk.js} | 4 ++-- public/104.e24e7fdd92837aca2688.chunk.js.map | 1 + public/104.f1e35ff90b4ddd68a9d8.chunk.js.map | 1 - ...012e83665e1.chunk.js => 231.32da54109dc94ecb5e46.chunk.js} | 2 +- ...5e1.chunk.js.map => 231.32da54109dc94ecb5e46.chunk.js.map} | 2 +- public/460.045a47588277eda9214e.chunk.js | 2 ++ public/460.045a47588277eda9214e.chunk.js.map | 1 + public/460.ecea63a28e50b5f10803.chunk.js | 2 -- public/460.ecea63a28e50b5f10803.chunk.js.map | 1 - ...d721f25f9ec.chunk.js => 508.37ca243cfb33b5edd94a.chunk.js} | 2 +- ...9ec.chunk.js.map => 508.37ca243cfb33b5edd94a.chunk.js.map} | 2 +- ...26ac11c98a86.chunk.js => 61.b4b665c9d61c26575ebe.chunk.js} | 2 +- ...8a86.chunk.js.map => 61.b4b665c9d61c26575ebe.chunk.js.map} | 2 +- ...834179a6a.bundle.js => 946.e994ab75ad6a5d27ca15.bundle.js} | 4 ++-- ...a.bundle.js.map => 946.e994ab75ad6a5d27ca15.bundle.js.map} | 2 +- ...3.chunk.js => crypto.worker.fe5845cc2133b5405cac.chunk.js} | 2 +- ...js.map => crypto.worker.fe5845cc2133b5405cac.chunk.js.map} | 2 +- public/index.html | 4 ++-- public/main.221edcc4de2837115246.bundle.js | 2 ++ public/main.221edcc4de2837115246.bundle.js.map | 1 + public/main.8a30f1b9c0bab91e44e9.css | 4 ---- public/main.8a30f1b9c0bab91e44e9.css.map | 1 - public/main.ae7615ad31a2454bfc82.css | 4 ++++ public/main.ae7615ad31a2454bfc82.css.map | 1 + public/main.bbbd3ab7eee67888ee7a.bundle.js | 2 -- public/main.bbbd3ab7eee67888ee7a.bundle.js.map | 1 - public/mtproto.worker.5f4ea67830e476bd70ac.chunk.js | 2 -- public/mtproto.worker.5f4ea67830e476bd70ac.chunk.js.map | 1 - public/mtproto.worker.d525550e01869ae11a4b.chunk.js | 2 ++ public/mtproto.worker.d525550e01869ae11a4b.chunk.js.map | 1 + public/report.html | 4 ++-- public/style-desktop.7ec8ed3b19fabb19d057.css | 2 ++ public/style-desktop.7ec8ed3b19fabb19d057.css.map | 1 + public/style-desktop.de205d0ae0e0c2493363.css | 2 -- public/style-desktop.de205d0ae0e0c2493363.css.map | 1 - ...396f7e4e1890.chunk.js => sw.04ffa51e8d749197145b.chunk.js} | 2 +- ...1890.chunk.js.map => sw.04ffa51e8d749197145b.chunk.js.map} | 2 +- public/version | 2 +- 39 files changed, 40 insertions(+), 40 deletions(-) rename public/{104.f1e35ff90b4ddd68a9d8.chunk.js => 104.e24e7fdd92837aca2688.chunk.js} (61%) create mode 100644 public/104.e24e7fdd92837aca2688.chunk.js.map delete mode 100644 public/104.f1e35ff90b4ddd68a9d8.chunk.js.map rename public/{231.4dbf43eb5012e83665e1.chunk.js => 231.32da54109dc94ecb5e46.chunk.js} (96%) rename public/{231.4dbf43eb5012e83665e1.chunk.js.map => 231.32da54109dc94ecb5e46.chunk.js.map} (96%) create mode 100644 public/460.045a47588277eda9214e.chunk.js create mode 100644 public/460.045a47588277eda9214e.chunk.js.map delete mode 100644 public/460.ecea63a28e50b5f10803.chunk.js delete mode 100644 public/460.ecea63a28e50b5f10803.chunk.js.map rename public/{508.52f2ca7abd721f25f9ec.chunk.js => 508.37ca243cfb33b5edd94a.chunk.js} (98%) rename public/{508.52f2ca7abd721f25f9ec.chunk.js.map => 508.37ca243cfb33b5edd94a.chunk.js.map} (99%) rename public/{61.5322bb4d26ac11c98a86.chunk.js => 61.b4b665c9d61c26575ebe.chunk.js} (99%) rename public/{61.5322bb4d26ac11c98a86.chunk.js.map => 61.b4b665c9d61c26575ebe.chunk.js.map} (99%) rename public/{946.0a86ee06cd8834179a6a.bundle.js => 946.e994ab75ad6a5d27ca15.bundle.js} (99%) rename public/{946.0a86ee06cd8834179a6a.bundle.js.map => 946.e994ab75ad6a5d27ca15.bundle.js.map} (99%) rename public/{crypto.worker.574dd04f2dfaff484dc3.chunk.js => crypto.worker.fe5845cc2133b5405cac.chunk.js} (99%) rename public/{crypto.worker.574dd04f2dfaff484dc3.chunk.js.map => crypto.worker.fe5845cc2133b5405cac.chunk.js.map} (99%) create mode 100644 public/main.221edcc4de2837115246.bundle.js create mode 100644 public/main.221edcc4de2837115246.bundle.js.map delete mode 100644 public/main.8a30f1b9c0bab91e44e9.css delete mode 100644 public/main.8a30f1b9c0bab91e44e9.css.map create mode 100644 public/main.ae7615ad31a2454bfc82.css create mode 100644 public/main.ae7615ad31a2454bfc82.css.map delete mode 100644 public/main.bbbd3ab7eee67888ee7a.bundle.js delete mode 100644 public/main.bbbd3ab7eee67888ee7a.bundle.js.map delete mode 100644 public/mtproto.worker.5f4ea67830e476bd70ac.chunk.js delete mode 100644 public/mtproto.worker.5f4ea67830e476bd70ac.chunk.js.map create mode 100644 public/mtproto.worker.d525550e01869ae11a4b.chunk.js create mode 100644 public/mtproto.worker.d525550e01869ae11a4b.chunk.js.map create mode 100644 public/style-desktop.7ec8ed3b19fabb19d057.css create mode 100644 public/style-desktop.7ec8ed3b19fabb19d057.css.map delete mode 100644 public/style-desktop.de205d0ae0e0c2493363.css delete mode 100644 public/style-desktop.de205d0ae0e0c2493363.css.map rename public/{sw.ba14f2a9396f7e4e1890.chunk.js => sw.04ffa51e8d749197145b.chunk.js} (99%) rename public/{sw.ba14f2a9396f7e4e1890.chunk.js.map => sw.04ffa51e8d749197145b.chunk.js.map} (99%) diff --git a/.env b/.env index 7ca9d09e..ced82cd9 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ API_ID=1025907 API_HASH=452b0359b988148995f22ff0f4229750 VERSION=1.7.1 -VERSION_FULL=1.7.1 (293) -BUILD=293 +VERSION_FULL=1.7.1 (294) +BUILD=294 diff --git a/public/104.f1e35ff90b4ddd68a9d8.chunk.js b/public/104.e24e7fdd92837aca2688.chunk.js similarity index 61% rename from public/104.f1e35ff90b4ddd68a9d8.chunk.js rename to public/104.e24e7fdd92837aca2688.chunk.js index a879ff1b..e6b197ba 100644 --- a/public/104.f1e35ff90b4ddd68a9d8.chunk.js +++ b/public/104.e24e7fdd92837aca2688.chunk.js @@ -1,2 +1,2 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[104],{9104:(e,t,o)=>{o.r(t),o.d(t,{default:()=>a});const a={Animations:"Animations",AttachAlbum:"Album","Appearance.Color.Hex":"HEX","Appearance.Color.RGB":"RGB","BlockModal.Search.Placeholder":"Block user...",DarkMode:"Dark Mode",FilterIncludeExcludeInfo:"Choose chats and types of chats that will\nappear and never appear in this folder.",FilterMenuDelete:"Delete Folder",FilterHeaderEdit:"Edit Folder",FilterAllGroups:"All Groups",FilterAllContacts:"All Contacts",FilterAllNonContacts:"All Non-Contacts",FilterAllChannels:"All Channels",FilterAllBots:"All Bots","EditContact.OriginalName":"original name","EditProfile.FirstNameLabel":"Name","EditProfile.BioLabel":"Bio (optional)","EditProfile.Username.Label":"Username (optional)","EditProfile.Username.Available":"Username is available","EditProfile.Username.Taken":"Username is already taken","EditProfile.Username.Invalid":"Username is invalid","ExceptionModal.Search.Placeholder":"Add exception...","Chat.Menu.SelectMessages":"Select Messages","Chat.Menu.ClearSelection":"Clear Selection","Chat.Menu.Hint":"To **edit** or **reply**, close this menu.\nThen tap next to a message.","Chat.Input.UnpinAll":"Unpin All Messages","Chat.Input.Attach.PhotoOrVideo":"Photo or Video","Chat.Input.Attach.Document":"Document","Chat.Subscribe":"SUBSCRIBE","Chat.Selection.LimitToast":"Max selection count reached.","Chat.Search.MessagesFound":{one_value:"%d message found",other_value:"%d messages found"},"Chat.Search.NoMessagesFound":"No messages found","Chat.Search.PrivateSearch":"Private Search","Chat.Service.TopicEdited.Mixed":"%1$@ changed the topic name and icon to %2$@","Chat.Service.TopicEdited.You.Mixed":"You changed the topic name and icon to %2$@","Chat.Service.TopicEdited.Mixed.IconRemoved":'%1$@ changed the topic name to "%1$@" and removed icon',"Chat.Service.TopicEdited.You.Mixed.IconRemoved":'You changed the topic name to "%1$@" and removed icon',"ChatList.Main.EmptyPlaceholder.Title":"Your chats will appear here","ChatList.Main.EmptyPlaceholder.Subtitle":"You have %s on Telegram","ChatList.Main.EmptyPlaceholder.SubtitleNoContacts":"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts","ChatList.Menu.SwitchTo.Webogram":"Switch to Old Version","ChatList.Menu.SwitchTo.Z":"Switch to Z version","ChatMigration.From":"Migrated from %s","ChatMigration.To":"Migrated to %s","ConnectionStatus.ForceReconnect":"force reconnect","ConnectionStatus.ReconnectIn":"Reconnect in %ds, %s","ConnectionStatus.Reconnect":"reconnect","ConnectionStatus.Reconnecting":"Reconnecting...","ConnectionStatus.TimedOut":"Request timed out, %s","ConnectionStatus.Waiting":"Waiting for network...","Contacts.Count":{one_value:"%d contact",other_value:"%d contacts"},"Deactivated.Title":"Too many tabs...","Deactivated.Subtitle":"Telegram supports only one active tab with the app.\nClick anywhere to continue using this tab.","Deactivated.Version.Title":"WebK has updated...","Deactivated.Version.Subtitle":"Another tab is running a newer version of Telegram.\nClick anywhere to reload this tab.","General.Keyboard":"Keyboard","General.SendShortcut.Enter":"Send by Enter","General.SendShortcut.CtrlEnter":"Send by %s + Enter","General.SendShortcut.NewLine.ShiftEnter":"New line by Shift + Enter","General.SendShortcut.NewLine.Enter":"New line by Enter","General.TimeFormat":"Time Format","General.TimeFormat.h12":"12-hour","General.TimeFormat.h23":"24-hour","ChatBackground.UploadWallpaper":"Upload Wallpaper","ChatBackground.Blur":"Blur Wallpaper Image","Notifications.Sound":"Notification Sound",NewPrivateChat:"New Private Chat","NewPoll.OptionLabel":"Option %d","Message.Context.Selection.Copy":"Copy selected","Message.Context.Selection.Clear":"Clear selection","Message.Context.Selection.Delete":"Delete selected","Message.Context.Selection.Forward":"Forward selected","Message.Context.Selection.SendNow":"Send Now selected","Message.Unsupported.Desktop":"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__","Message.Unsupported.Mobile":"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__","Checkbox.Enabled":"Enabled","Checkbox.Disabled":"Disabled","Error.PreviewSender.CaptionTooLong":"Caption is too long.","PreviewSender.GroupItems":"Group items","PreviewSender.SendAlbum":{one_value:"Send Album",other_value:"Send %d Albums"},"Presence.YourChat":"chat with yourself","Privacy.Devices":{one_value:"%1$d device",other_value:"%1$d devices"},"Privacy.Websites":{one_value:"%1$d website",other_value:"%1$d websites"},"Privacy.SensitiveContent":"Sensitive Content","PrivacyModal.Search.Placeholder":"Add Users or Groups...","Permissions.NoExceptions":"No exceptions","Permissions.ExceptionsCount":{one_value:"%d exception",other_value:"%d exceptions"},"PWA.Install":"Install App","Link.Available":"Link is available","Link.Taken":"Link is already taken","Link.Invalid":"Link is invalid","StickersTab.SearchPlaceholder":"Search Stickers",ForwardedFrom:"Forwarded from %s","Popup.Avatar.Title":"Drag to Reposition","Popup.Unpin.AllTitle":"Unpin all messages","Popup.Unpin.HideTitle":"Hide pinned messages","Popup.Unpin.HideDescription":"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.","Popup.Unpin.Hide":"Hide","Popup.Attach.GroupMedia":"Group all media","Popup.Attach.UngroupMedia":"Ungroup all media","Popup.Attach.AsMedia":"Send as media","Popup.Attach.EnableSpoilers":"Hide all with spoilers","Popup.Attach.RemoveSpoilers":"Remove all spoilers","TwoStepAuth.EmailCodeChangeEmail":"Change Email","MarkupTooltip.LinkPlaceholder":"Enter URL...","MediaViewer.Context.Download":"Download",Profile:"Profile",Saved:"Saved",Deleted:"Deleted",ReportBug:"Report Bug","Notifications.Count":{one_value:"%d notification",other_value:"%d notifications"},"Notifications.Forwarded":{one_value:"Forwarded %d message",other_value:"Forwarded %d messages"},"Notifications.New":"New notification","PushNotification.Action.Mute1d":"Mute background alerts for 1 day","PushNotification.Action.Settings":"Background alerts settings","PushNotification.Action.Mute1d.Mobile":"Mute for 24H","PushNotification.Action.Settings.Mobile":"Alerts settings","PushNotification.Message.NoPreview":"You have a new message","LogOut.Description":"Are you sure you want to log out?\n\nNote that you can seamlessly use Telegram on all your devices at once.","VoiceChat.DiscussionGroup":"discussion group","PaymentInfo.CVV":"CVV Code","PaymentInfo.Card.Title":"Enter your card information","PaymentInfo.Billing.Title":"Enter your billing address","PaymentInfo.Done":"PROCEED TO CHECKOUT","PaymentCard.Error.Invalid":"Invalid card number","PaymentCard.Error.Incomplete":"Incomplete card number","LimitReached.Ok":"OK, GOT IT","Username.Purchase":"**This username is already taken.** However, it is currently available for purchase. [Learn more…]()","Video.Unsupported.Desktop":"__Unfortunately, this video can't be played on Telegram Web. Try opening it with our [desktop app](https://getdesktop.telegram.org/) instead.__","Video.Unsupported.Mobile":"__Unfortunately, this video can't be played on Telegram Web. Try opening it with our [mobile app](https://telegram.org/dl/) instead.__",AccDescrEditing:"Editing",ActionCreateChannel:"Channel created",ActionCreateGroup:"un1 created the group",ActionChangedTitle:"un1 changed the group name to un2",ActionRemovedPhoto:"un1 removed the group photo",ActionChangedPhoto:"un1 changed the group photo",ActionChangedVideo:"un1 changed the group video",ActionAddUser:"un1 added un2",ActionAddUserSelf:"un1 returned to the group",ActionAddUserSelfYou:"You returned to the group",ActionAddUserSelfMega:"un1 joined the group",ActionLeftUser:"un1 left the group",ActionKickUser:"un1 removed un2",ActionInviteUser:"un1 joined the group via invite link",ActionPinnedNoText:"un1 pinned a message",ActionMigrateFromGroup:"This group was upgraded to a supergroup",ActionYouScored:"You scored %1$s",ActionUserScored:"un1 scored %1$s",ActionYouScoredInGame:"You scored %1$s in un2",ActionUserScoredInGame:"un1 scored %1$s in un2",AndOther:{one_value:"and %1$d other",other_value:"and %1$d others"},AttachPhoto:"Photo",AttachVideo:"Video",AttachGif:"GIF",AttachLocation:"Location",AttachLiveLocation:"Live Location",AttachContact:"Contact",AttachSticker:"Sticker",AttachAudio:"Voice message",AttachRound:"Video message",AttachGame:"Game",Bot:"bot",ChannelMegaJoined:"You joined this group",EnterChannelName:"Channel name",DescriptionOptionalPlaceholder:"Description (optional)",DescriptionPlaceholder:"Description",DiscussionStarted:"Discussion started",Draft:"Draft",FilterAlwaysShow:"Include Chats",FilterNeverShow:"Exclude Chats",FilterInclude:"Included Chats",FilterExclude:"Excluded Chats",FilterChatTypes:"Chat types",FilterChats:"Chats",FilterNew:"New Folder",Filters:"Folders",FilterRecommended:"Recommended Folders",FilterShowMoreChats:{one_value:"Show %1$d More Chat",other_value:"Show %1$d More Chats"},ForwardedMessageCount:{one_value:"Forwarded message",other_value:"%1$d forwarded messages"},FromYou:"You",Add:"Add",Chats:{one_value:"%1$d chat",other_value:"%1$d chats"},Channels:{one_value:"%1$d channel",other_value:"%1$d channels"},Comments:{one_value:"%1$d Comment",other_value:"%1$d Comments"},Groups:{one_value:"%1$d group",other_value:"%1$d groups"},Users:{one_value:"%1$d user",other_value:"%1$d users"},Members:{one_value:"%1$d member",other_value:"%1$d members"},messages:{one_value:"%1$d message",other_value:"%1$d messages"},UsernameHelpLink:"This link opens a chat with you:\n%1$s",NewChannel:"New Channel",NewGroup:"New Group",Contacts:"Contacts",SavedMessages:"Saved Messages",Settings:"Settings",SettingsHelp:"Help",General:"General",TextSize:"Message Text Size",ChatBackground:"Chat Background",EnableAnimations:"Enable Animations",AutoDownloadMedia:"Auto-Download Media",AutodownloadContacts:"Contacts",AutodownloadPrivateChats:"Private Chats",AutodownloadGroupChats:"Group Chats",AutodownloadChannels:"Channels",AutoplayGIF:"GIFs",AutoplayVideo:"Videos",NotificationsForGroups:"Notifications for groups",NotificationsForPrivateChats:"Notifications for private chats",NotificationsForChannels:"Notifications for channels",NotificationsPrivateChats:"Private Chats",NotificationsGroups:"Groups",NotificationsChannels:"Channels",NotificationsOther:"Other",MarkAsUnread:"Mark as unread",MarkAsRead:"Mark as read",ContactJoined:"Contact joined Telegram",Loading:"Loading...",Unblock:"Unblock",BlockedUsers:"Blocked Users",BlockedUsersInfo:"Blocked users will not be able to contact you and will not see your Last Seen time.",BlockedEmpty:"None",TwoStepVerification:"Two-Step Verification",TwoStepVerificationTitle:"Two-Step Verification",PinnedMessage:"Pinned Message",PinnedMessagesCount:{one_value:"Pinned Message",other_value:"%1$d Pinned Messages"},PrivacyExceptions:"Exceptions",PrivacyLastSeen:"Last Seen & Online",PrivacySettings:"Privacy and Security",PrivacyTitle:"Privacy",PrivacyPhone:"Phone Number",PrivacyPhoneTitle:"Who can see my phone number?",PrivacyPhoneTitle2:"Who can find me by my number?",PrivacyPhoneInfo:"Users who have your number saved in their contacts will also see it on Telegram.",PrivacyPhoneInfo3:"Users who add your number to their contacts will see it on Telegram only if they are your contacts.",PrivacyProfilePhoto:"Profile Photos",PrivacyProfilePhotoTitle:"Who can see my profile photos & videos?",PrivacyP2PHeader:"Peer-to-Peer",PrivacyForwardsTitle:"Who can add a link to my account when forwarding my messages?",Reminders:"Reminders",ScheduledMessages:"Scheduled Messages",LastSeenTitle:"Who can see your Last Seen time?",SessionsTitle:"Active Sessions",CurrentSession:"This device",TerminateAllSessions:"Terminate All Other Sessions",TerminateSessionText:"Are you sure you want to terminate this session?",OtherSessions:"Active sessions",AreYouSureDeleteSingleMessage:"Are you sure you want to delete this message?",AreYouSureDeleteFewMessages:"Are you sure you want to delete these messages?",AreYouSureDeleteSingleMessageMega:"Are you sure you want to delete this message for everyone?",AreYouSureDeleteFewMessagesMega:"Are you sure you want to delete these messages for everyone?",AreYouSureDeleteAndExitName:"Are you sure you want to delete and leave the group **%1$s**?",AreYouSureDeleteThisChatSavedMessages:"Are you sure you want to delete **Saved Messages**?",AreYouSureDeleteThisChatWithUser:"Are you sure you want to delete the chat with **%1$s**?",AreYouSureSessionTitle:"Terminate session",AreYouSureSessionsTitle:"Terminate sessions",AreYouSureSessions:"Are you sure you want to terminate all other sessions?",Terminate:"Terminate",WhoCanCallMe:"Who can call me?",WhoCanAddMe:"Who can add me to group chats?",ArchivedChats:"Archived Chats",Cancel:"Cancel",HistoryCleared:"History was cleared",Archive:"Archive",Unarchive:"Unarchive",Delete:"Delete",Reply:"Reply",Edit:"Edit",Forward:"Forward",CopyLink:"Copy Link",Copy:"Copy",Search:"Search",LinkCopied:"Link copied to clipboard",LinkCopiedPrivateInfo:"This link will only work for members of this chat.",GroupAddMembers:"Add Members",SendMessageTo:"Add people...",JumpToDate:"Jump to Date",Caption:"Caption",Message:"Message",Poll:"Poll",SharedFilesTab2:"Files",SharedMediaTab2:"Media",SharedLinksTab2:"Links",SharedMusicTab2:"Music",SharedVoiceTab2:"Voice",NewPoll:"New Poll",PollOptions:"Poll options",AskAQuestion:"Ask a Question",AddAnExplanationInfo:"Users will see this text after choosing the wrong answer, good for educational purposes.",AccDescrQuizExplanation:"Explanation",PhoneCopied:"Phone copied to clipboard",UsernameCopied:"Username copied to clipboard.",BioCopied:"Bio copied to clipboard.",UserBio:"Bio",Username:"Username",UsernameAlso:"also %1$s",UsernameHelp:"You can choose a username on **Telegram**. If you do, people will be able to find you by this username and contact you without needing your phone number.\n\nYou can use **a–z**, **0–9** and underscores. Minimum length is **5** characters.",Phone:"Phone",Notifications:"Notifications",AreYouSureDeleteContact:"Are you sure you want to delete this contact?",AreYouSureDeleteAndExit:"Are you sure you want to delete and leave the group?",AreYouSureDeleteAndExitChannel:"Do you want to delete and leave the channel?",DeleteContact:"Delete contact",GroupType:"Group Type",ChannelType:"Channel Type",TypePrivate:"Private",TypePublic:"Public",TypePrivateGroup:"Private",TypePublicGroup:"Public",GroupMembers:"Members",DeleteMega:"Delete Group",DeleteMegaMenu:"Delete group",DeleteAndExitButton:"Delete and Leave Group",ChannelDelete:"Delete Channel",ChannelDeleteMenu:"Delete channel",ChannelPermissions:"Permissions",ChannelPermissionsHeader:"What can members of this group do?",ChannelAddException:"Add Exception",ChannelBlockedUsers:"Removed users",NoBlockedUsers:"No removed users",UserRestrictions:"User Permissions",UserRestrictionsDisabled:"This option is disabled for all members in Group Permissions",UserRestrictionsCanDo:"What can this user do?",UserRestrictionsRead:"Read Messages",UserRestrictionsSend:"Send Messages",UserRestrictionsSendMedia:"Send Media",UserRestrictionsSendPolls:"Send Polls",UserRestrictionsSendStickers:"Send Stickers and GIFs",UserRestrictionsEmbedLinks:"Embed Links",UserRestrictionsChangeInfo:"Change Chat Info",UserRestrictionsPinMessages:"Pin Messages",UserRestrictionsInviteUsers:"Add Users",UserRestrictionsNoSend:"can't send messages",UserRestrictionsNoSendMedia:"no media",UserRestrictionsNoSendPolls:"no polls",UserRestrictionsNoSendStickers:"no stickers & GIFs",UserRestrictionsNoEmbedLinks:"no embed links",UserRestrictionsNoChangeInfo:"can't change Info",UserRestrictionsNoPinMessages:"no pins",UserRestrictionsNoInviteUsers:"can't add users",UserRestrictionsBlock:"Ban and remove from group",ChannelPublic:"Public Channel",MegaPublic:"Public Group",ChannelPublicInfo:"Public channels can be found in search, anyone can join them.",MegaPublicInfo:"Public groups can be found in search, chat history is available to everyone and anyone can join.",ChannelPrivate:"Private Channel",MegaPrivate:"Private Group",ChannelPrivateInfo:"Private channels can only be joined via an invite link.",MegaPrivateInfo:"Private groups can only be joined if you were invited or have an invite link.",ChannelPrivateLinkHelp:"People can join your channel by following this link. You can revoke the link any time.",MegaPrivateLinkHelp:"People can join your group by following this link. You can revoke the link any time.",RevokeButton:"Revoke",RevokeLink:"Revoke Link",RevokeAlert:"Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.",SetUrlPlaceholder:"Link",Subscribers:{one_value:"%1$d subscriber",other_value:"%1$d subscribers"},SearchGifsTitle:"Search GIFs",PinMessageAlert:"Pin this message in the group?",PinMessageAlertTitle:"Pin message",PinMessageAlertChannel:"Do you want to pin this message in this channel?",PinMessageAlertChat:"Do you want to pin this message at the top of the chat?",UnpinMessageAlertTitle:"Unpin message",UnpinMessageAlert:"Do you want to unpin this message?",PinNotify:"Notify all members",PinMessage:"Pin",UnpinMessage:"Unpin",PinAlsoFor:"Also pin for %1$s",DeleteMessagesTitle:"Delete %1$s",DeleteSingleMessagesTitle:"Delete message",DeleteMessagesOption:"Unsend My Messages",DeleteMessagesOptionAlso:"Also delete for %1$s",DeleteForAll:"Delete for all members",DeleteMessagesTextGroup:'You can also delete the %1$s you sent from the inboxes of other group members by checking "Unsend my messages".',LeaveChannel:"Leave Channel",LeaveChannelMenu:"Leave channel",ChannelLeaveAlertWithName:"Are you sure you want to leave **%1$s**?",LeaveMegaMenu:"Leave group",DeleteChatUser:"Delete chat",PleaseEnterCurrentPassword:"Enter your password",PleaseEnterFirstPassword:"Enter a password",PleaseReEnterPassword:"Re-enter your password",Continue:"Continue",YourEmailSkip:"Skip",YourEmailSkipWarning:"Warning",YourEmailSkipWarningText:"No, seriously.\n\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.",TurnPasswordOffQuestionTitle:"Disable password",TurnPasswordOffQuestion:"Are you sure you want to disable your password?",Disable:"Disable",TwoStepVerificationSetPassword:"Set Password",TwoStepVerificationPasswordSet:"Password Set!",TwoStepVerificationPasswordSetInfo:"This password will be required when you log in on a new device in addition to the code you get in the SMS.",TwoStepVerificationPasswordReturnSettings:"Return to Settings",RecoveryEmail:"Recovery email",RecoveryEmailTitle:"Recovery Email",ResendCode:"Resend code",PasswordAsHintError:"Hint must be different from your password",AddStickersCount:"ADD %1$s",RemoveStickersCount:"REMOVE %1$s",Stickers:{one_value:"%1$d sticker",other_value:"%1$d stickers"},HidAccount:"The account was hidden by the user",TelegramFeatures:"Telegram Features",SetColor:"Set a color",Open:"Open",OpenUrlTitle:"Open Link",OpenUrlAlert2:"Do you want to open %1$s?",FilterNoChatsToDisplay:"Folder is empty",FilterNoChatsToDisplayInfo:"No chats currently belong to this folder.",SupportStatus:"support",Lately:"last seen recently",WithinAWeek:"last seen within a week",WithinAMonth:"last seen within a month",ALongTimeAgo:"last seen a long time ago",Online:"online",MessageScheduleSend:"Send Now",MessageScheduleEditTime:"Reschedule",YouLeft:"You left this group",Recent:"Recent",Of:"%1$d of %2$d",NoResult:"No results",Updating:"Updating...",Emoji:"Emoji",AddContactTitle:"Add Contact",HiddenName:"Deleted Account",Seconds:{one_value:"%1$d second",other_value:"%1$d seconds"},Minutes:{one_value:"%1$d minute",other_value:"%1$d minutes"},Hours:{one_value:"%1$d hour",other_value:"%1$d hours"},Days:{one_value:"%1$d day",other_value:"%1$d days"},Weeks:{one_value:"%1$d week",other_value:"%1$d weeks"},Months:{one_value:"%1$d month",other_value:"%1$d months"},Years:{one_value:"%1$d year",other_value:"%1$d years"},TodayAtFormattedWithToday:"today at %1$s",formatDateAtTime:"%1$s at %2$s",JoinByPeekChannelTitle:"Join Channel",JoinByPeekGroupTitle:"Join Group",YouWereKicked:"you were removed",ViaBot:"via",InviteExpired:"This invite link has expired.",NoUsernameFound:"There is no Telegram account with this username.",PrivacyDeleteCloudDrafts:"Delete All Cloud Drafts",AreYouSureClearDraftsTitle:"Delete cloud drafts",AreYouSureClearDrafts:"Are you sure you want to delete all cloud drafts?",BotInfoTitle:"What can this bot do?",ChatYourSelf:"forward here to save",GroupEmptyTitle1:"You have created a **group**.",GroupEmptyTitle2:"Groups can have:",GroupDescription1:"Up to 200,000 members",GroupDescription2:"Persistent chat history",GroupDescription3:"Public links such as t.me/title",GroupDescription4:"Admins with different rights",ChatYourSelfDescription1:"Forward messages here to save them",ChatYourSelfDescription2:"Send media and files to store them",ChatYourSelfDescription3:"Access this chat from any device",ChatYourSelfDescription4:"Use search to quickly find things",ChatYourSelfTitle:"Your cloud storage",ActionYouCreateGroup:"You created the group",NoMessages:"No messages here yet...",NoScheduledMessages:"No scheduled messages here yet...",NoMessagesGreetingsDescription:"Send a message or tap the greeting below.",InviteToGroupError:"Sorry, you can't add this user to groups because of user's privacy settings.",InviteToChannelError:"Sorry, you can't add this user to channels because of user's privacy settings.",AddMembersAlertTitle:"Add %1$s",AddOneMemberAlertTitle:"Add member",AddMembersAlertNamesText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersAlertCountText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersForwardMessages:"Show the last 100 messages to the new members",AddOneMemberForwardMessages:"Show the last 100 messages to **%1$s**",PinToTopLimitReached2:"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.",FiltersSetupPinAlert:"Set Up Folders",AppName:"Telegram",OK:"OK",PinFolderLimitReached:"Sorry, you can't pin any more chats to the top.",Send:"Send",ChannelJoin:"JOIN",Yesterday:"yesterday",LeaveAComment:"Leave a comment",ViewInChat:"View in chat",LinkNotFound:"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.",Create:"Create",ViewDiscussion:"View discussion",MessageScheduledUntilOnline:"Scheduled until online",ReportChat:"Report",ReportChatSpam:"Spam",ReportChatViolence:"Violence",ReportChatPornography:"Pornography",ReportChatChild:"Child Abuse",ReportChatOther:"Other",ReportChatDescription:"Description",ReportInfo:"Please enter any additional details relevant to your report.",ReportSentInfo:"Telegram moderators will review your report.\nThank you for your cooperation!",ReportHint:"Additional details...",ChatHistory:"Chat history for new members",ShareContact:"Share contact",SendMessageTitle:"Send message",SendContactToGroupText:"Do you want to send this contact to **%1$s**?",ChannelBroadcast:"Broadcast",ChannelSilentBroadcast:"Silent Broadcast",Comment:"Comment",SendAnonymously:"Send anonymously",DiscardVoiceMessageTitle:"Discard Voice Message",DiscardVoiceMessageDescription:"Are you sure you want to stop recording and discard your voice message?",DiscardVoiceMessageAction:"Discard",AddContact:"Add to contacts",BlockUser:"Block user",MobileHidden:"Mobile hidden",MobileHiddenExceptionInfo:"Phone number will be visible once %1$s adds you as a contact.",FirstName:"First name (required)",LastName:"Last name (optional)",AreYouSureBlockContact2:"Are you sure you want to block **%1$s**?",UserBlocked:"User blocked",UserUnblocked:"User unblocked",AudioUnknownArtist:"Unknown artist",AudioUnknownTitle:"Unknown title",LogOut:"Log out",OnlineCount:{one_value:"%1$d online",other_value:"%1$d online"},EditedMessage:"edited",GlobalSearch:"Global search",SearchMessages:"Messages",SearchAllChatsShort:"Chats",ClearButton:"Clear",FilterAllChats:"All Chats",FilterAllChatsShort:"All",Call:"Call",VideoCall:"Video Call",CallMessageOutgoing:"Outgoing Call",CallMessageIncoming:"Incoming Call",CallMessageVideoOutgoing:"Outgoing Video Call",CallMessageVideoIncoming:"Incoming Video Call",VoipExchangingKeys:"Exchanging encryption keys",VoipUnmute:"Unmute",SavingContentTitle:"Saving content",RestrictSavingContent:"Restrict saving content",RestrictSavingContentInfoGroup:"Members won't be able to copy, save and forward content from this group.",RestrictSavingContentInfoChannel:"Subscribers won't be able to copy, save and forward content from this channel.",ClearOtherSessionsHelp:"Logs out all devices except for this one.",SessionsListInfo:"The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.",SponsoredMessage:"sponsored",OpenChannelPost:"VIEW POST",FilterNameHint:"Folder name",BotStart:"START",BotUnblock:"RESTART",BotStop:"Stop bot",BotRestart:"Restart bot",ShareYouPhoneNumberTitle:"Share your phone number?",AreYouSureShareMyContactInfoBot:"The bot will know your phone number. This can be useful for integration with other services.",DistanceUnitsTitle:"Distance units",DistanceUnitsKilometers:"Kilometers",DistanceUnitsMiles:"Miles",PeopleNearby:"People Nearby",MakeMyselfVisible:"Make Myself Visible",MakeMyselfVisibleTitle:"Show Your Profile?",MakeMyselfVisibleInfo:"Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\n\nYour phone number will remain hidden.",StopShowingMe:"Stop Showing Me",PeopleNearbyInfo2:"Exchange contact info with people nearby and find new friends.",NearbyCreateGroup:"Create a Local group",AwayTo:"%1$s away",MessagePreview:"Message Preview",KMetersAway2:"%1$s km away",MetersAway2:"%1$s m away",MilesAway:"%1$s mi away",FootsAway:"%1$s ft away",PeopleNearbyHeader:"People nearby",ChatsNearbyHeader:"Groups nearby",ChatLocation:"Location",RequestToJoinGroupDescription:"This group accepts new members only after they are approved by its admins.",RequestToJoinChannelDescription:"This channel accepts new subscribers only after they are approved by its admins.",RequestToJoinSent:"Join request sent",RequestToJoinGroupApproved:"Your request to join the group was approved",RequestToJoinChannelApproved:"Your request to join the channel was approved",Update:"UPDATE",Reactions:"Reactions",DoubleTapSetting:"Quick Reaction",EnableReactions:"Enable Reactions",EnableReactionsChannelInfo:"Allow subscribers to react to channel posts.",EnableReactionsGroupInfo:"Allow members to react to group messages.",AvailableReactions:"Available reactions",NobodyViewed:"Nobody viewed",MessageSeen:{one_value:"Seen",other_value:"%1$d Seen"},DataSettings:"Data and Storage",GroupsAndChannelsHelp:"Change who can add you to groups and channels.",SessionsInfo:"Control your sessions on other devices.",StickersBotInfo:"Artists are welcome to add their own sticker sets using our @stickers bot.",AutomaticMediaDownload:"Automatic media download",AutoDownloadPhotos:"Photos",AutoDownloadVideos:"Videos",AutoDownloadFiles:"Files",AutoDownloadOnAllChats:"On in all chats",AutoDownloadUpToOnAllChats:"Up to %1$s in all chats",AutoDownloadOff:"Off",AutoDownloadOnUpToFor:"Up to %1$s for %2$s",AutoDownloadOnFor:"On for %1$s",AutoDownloadContacts:"Contacts",AutoDownloadPm:"PM",AutoDownloadGroups:"Groups",AutoDownloadChannels:"Channels",AutoDownloadAudioInfo:"Voice messages are tiny, so they're always downloaded automatically.",AutoplayMedia:"Auto-play media",AutoDownloadPhotosTitle:"Auto-download photos",AutoDownloadVideosTitle:"Auto-download videos and GIFs",AutoDownloadFilesTitle:"Auto-download files and music",AutoDownloadMaxFileSize:"Maximum file size",AutodownloadSizeLimitUpTo:"up to %1$s",ResetAutomaticMediaDownload:"Reset Auto-Download Settings",ResetAutomaticMediaDownloadAlertTitle:"Reset settings",ResetAutomaticMediaDownloadAlert:"Are you sure you want to reset auto-download settings?",Reset:"Reset",SendMessageAsTitle:"Send message as...",Devices:"Devices",LanguageName:"English",EditCantEditPermissionsPublic:"This permission is not available in public groups.",VoipUserMicrophoneIsOff:"%s's microphone is off",VoipUserCameraIsOff:"%s's camera is off",PrivacyPhoneInfo4:"This public link opens a chat with you:",ReportChatIllegalDrugs:"Illegal Drugs",ReportChatPersonalDetails:"Personal Details",VoipPeerIncompatible:"**%1$s**'s app is using an incompatible protocol. They need to update their app before you can call them.",TelegramFeaturesUrl:"https://t.me/TelegramTips",ScamMessage:"SCAM",FakeMessage:"FAKE",TextCopied:"Text copied to clipboard",PaymentInvoice:"INVOICE",PaymentTestInvoice:"TEST INVOICE",PaymentReceipt:"Receipt",PaymentCheckout:"Checkout",PaymentTransactionTotal:"Total",PaymentTip:"Tip",PaymentTipOptional:"Tip (Optional)",PaymentCheckoutPay:"PAY %1$s",PaymentCheckoutMethod:"Payment method",PaymentCheckoutProvider:"Payment provider",PaymentCardNumber:"Card Number",PaymentCardSavePaymentInformation:"Save Payment Information",PaymentCardInfo:"Payment info",PaymentCardSavePaymentInformationInfoLine1:"You can save your payment info for future use. It will be stored directly with the payment provider. Telegram has no access to your credit card data.",Done:"Done",PaymentShippingMethod:"Shipping methods",PaymentNoShippingMethod:"Sorry, it is not possible to deliver to your address.",PaymentShippingInfo:"Shipping Information",PaymentShippingAddress:"Shipping address",PaymentShippingAddress1Placeholder:"Address 1 (Street)",PaymentShippingAddress2Placeholder:"Address 2 (Street)",PaymentShippingCityPlaceholder:"City",PaymentShippingStatePlaceholder:"State",PaymentShippingCountry:"Country",PaymentShippingZipPlaceholder:"Postcode",PaymentShippingReceiver:"Receiver",PaymentShippingName:"Full Name",PaymentShippingEmailPlaceholder:"Email",PaymentCheckoutPhoneNumber:"Phone number",PaymentCheckoutShippingMethod:"Shipping method",PaymentShippingSave:"Save Shipping Information",PaymentShippingSaveInfo:"You can save your shipping info for future use.",PaymentInfoHint:"You paid **%1$s** for **%2$s**.",PrivacyPayments:"Payments",PrivacyPaymentsClearInfo:"You can delete your shipping info and instruct all payment providers to remove your saved credit cards. Note that Telegram never stores your credit card data.",PrivacyPaymentsClear:"Clear Payment and Shipping Info",PrivacyPaymentsClearAlertTitle:"Clear payment info",PrivacyPaymentsClearAlertText:"Are you sure you want to clear your payment and shipping info?",PrivacyPaymentsPaymentInfoCleared:"Payment info cleared.",PrivacyPaymentsShippingInfoCleared:"Shipping info cleared.",PrivacyPaymentsPaymentShippingCleared:"Payment and shipping info cleared.",PrivacyClearShipping:"Shipping info",PrivacyClearPayment:"Payment info",Clear:"Clear",Save:"Save",PaymentCheckoutName:"Name",ClearRecentStickersAlertTitle:"Clear recent stickers",ClearRecentStickersAlertMessage:"Do you want to clear all your recent stickers?",PremiumStickersShort:"Premium",FavoriteStickers:"Favorites",AddToFavorites:"Add to Favorites",AddedToFavorites:"Sticker added to Favorites.",RemovedFromFavorites:"Sticker was removed from Favorites",RemovedFromRecent:"Sticker was removed from Recent",DeleteFromFavorites:"Delete from Favorites",DeleteFromRecent:"Remove from Recent",NewChatsFromNonContacts:"New chats from unknown users",ArchiveAndMute:"Archive and Mute",ArchiveAndMuteInfo:"Automatically archive and mute new chats, groups and channels from non-contacts.",PrivacyVoiceMessages:"Voice Messages",PrivacyVoiceMessagesTitle:"Who can send me voice or video messages?",PrivacyVoiceMessagesInfo:"You can restrict who can send you voice or video messages with granular precision.",PrivacyVoiceMessagesPremiumOnly:"Only subscribers of *Telegram Premium* can restrict receiving voice messages.",EmojiCount:{other_value:"%1$d emoji"},AddEmojiNotFound:"Emoji pack not found.",MessageContainsEmojiPack:"This message contains emoji from %s pack.",MessageContainsEmojiPacks:{other_value:"This message contains emoji from **%d Packs**."},EmojiPackCount:{one_value:"%1$d Emoji Pack",other_value:"%1$d Emoji Packs"},ReactionsAll:"All",EnableSomeReactionsInfo:"Members of the group can use only certain approved emoji as reactions to messages.",EnableAllReactionsInfo:"Members of the group can use any emoji as reactions to messages.",DisableReactionsInfo:"Members of the group can’t add any reactions to messages.",OnlyAllowThisReactions:"Only allow these reactions",AllReactions:"All reactions",SomeReactions:"Some reactions",NoReactions:"No reactions",LimitReached:"Limit Reached",LimitReachedPinDialogs:"You can't pin more than %1$d chats to the top. Unpin some that are currently pinned – or subscribe to **Telegram Premium** to double the limit to **%2$d** chats.",LimitReachedPinDialogsPremium:"Sorry, you can't pin more than %1$d chats to the top. Unpin some that are currently pinned.",LimitReachedPinDialogsLocked:"Sorry, you can't pin more than %1$d chats to the top. Unpin some that are currently pinned. We are working to let you increase this limit in the future.",IncreaseLimit:"Increase Limit",LimitFree:"Free",LimitPremium:"Premium",ActionTTLChanged:"un1 set messages to auto-delete in %1$s",ActionTTLYouChanged:"You set messages to auto-delete in %1$s",ActionTTLChannelChanged:"Messages in this channel will be automatically deleted after %1$s",ActionTTLChannelDisabled:"Messages in this channel will no longer be automatically deleted",ActionTTLDisabled:"un1 disabled the auto-delete timer",ActionTTLYouDisabled:"You disabled the auto-delete timer",UsernamesProfileHeader:"Username order",UsernamesProfileHelp:"Drag and drop links to change the order in which they will be displayed on your info page.",UsernamesChannelHelp:"Drag and drop links to change the order in which they will be displayed on the channel info page.",UsernameLinkEditable:"tap to edit",UsernameLinkActive:"active",UsernameLinkInactive:"not active",UsernameActivateLink:"Activate link",UsernameDeactivateLink:"Deactivate link",UsernameActivateLinkProfileMessage:"Do you want to show this link on your info page?",UsernameDeactivateLinkProfileMessage:"Do you want to hide this link from your info page?",UsernameActivateLinkChannelMessage:"Do you want to show this link on the channel info page?",UsernameDeactivateLinkChannelMessage:"Do you want to hide this link from the channel info page?",Hide:"Hide",Show:"Show",UsernameActivateErrorTitle:"Too many active links",UsernameActivateErrorMessage:"Sorry, you have too many active public links already. Please hide one of your active public links first.",ChannelSignMessages:"Sign Messages",TopicWasCreatedAction:"%s was created",Topics:"Topics",ForumToggleDescription:"The group chat will be divided into topics created by admins or users.",AnonymousNumber:"Anonymous Number",Info:"Info",BotSettings:"Settings",OpenMessage:"VIEW MESSAGE",OpenGroup:"VIEW GROUP",CloseTopic:"Close topic",RestartTopic:"Reopen topic",LimitReachedPinnedTopics:"Sorry, you can't pin more than %d topics to the top.",TopicProfileStatus:"In %s",AccDescrTopic:"Topic",DeleteTopics:{one_value:"Delete topic",other_value:"Delete topics"},DeleteSelectedTopic:"Are you sure you want delete %s?",NewTopic:"New Topic",CreateTopicTitle:"Choose a topic name and icon",CreateGeneralTopicTitle:"Choose topic name",EditTopicHide:"Show in Topics",EditTopicHideInfo:"If the 'General' topic is hidden, group members can pull down in the topic list to view it.",OpenUrlOption1:"Log in to %1$s as **%2$s**",OpenUrlOption2:"Allow **%1$s** to send me messages",OtherWebSessions:"Connected websites",WebSessionsTitle:"Logged In with Telegram",TerminateWebSessionText:"Are you sure you want to disconnect %1$s?",Disconnect:"Disconnect",TerminateAllWebSessions:"Disconnect All Websites",AreYouSureWebSessions:"Are you sure you want to disconnect all websites where you logged in with Telegram?",ClearOtherWebSessionsHelp:"You can log in on websites that support signing in with Telegram.",TerminateWebSessionInfo:"Tap to disconnect from your Telegram account.",EnablePhotoSpoiler:"Hide with spoiler",DisablePhotoSpoiler:"Remove spoiler",LimitReachedFolders:"You have reached the limit of **%1$d** folders. You can double the limit to **%2$d** folders by subscribing to **Telegram Premium**.",LimitReachedFoldersPremium:"You have reached the limit of **%1$d** folders for this account.",LimitReachedFoldersLocked:"You have reached the limit of **%1$d** folders for this account. We are working to let you increase this limit in the future.",FwdMessageToSavedMessages:"Message forwarded to **Saved Messages**.",FwdMessagesToSavedMessages:"Messages forwarded to **Saved Messages**.",ColorTheme:"Color theme",SendAsFile:"Send as file",SendAsFiles:"Send as files","AccountSettings.Filters":"Chat Folders","AccountSettings.Notifications":"Notifications and Sounds","AccountSettings.PrivacyAndSecurity":"Privacy and Security","AccountSettings.Language":"Language","Alert.UserDoesntExists":"Sorry, this user doesn't seem to exist.","Alert.Confirm.Discard":"Discard","Appearance.Reset":"Reset to Defaults","AutoDownloadSettings.Delimeter":", ","AutoDownloadSettings.LastDelimeter":" and ","Bio.Description":"Any details such as age, occupation or city.\nExample: 23 y.o. designer from San Francisco","Call.Accept":"Accept","Call.Decline":"Decline","Call.End":"End","Call.Camera":"Camera","Call.Mute":"Mute","Call.Recall":"Recall","Call.Close":"Close","Call.Screen":"Screen","Call.Confirm.Discard.Voice.Header":"Video Chat in Progress","Call.Confirm.Discard.Voice.ToVoice.Text":'Leave video chat in "%1$@" and start a new one in "%2$@"?',"Call.Confirm.Discard.Voice.ToCall.Text":'Leave video chat in "%1$@" and start a call with "%2$@"?',"Call.Confirm.Discard.Call.Header":"Call in Progress","Call.Confirm.Discard.Call.ToVoice.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.Confirm.Discard.Call.ToCall.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.PrivacyErrorMessage":"Sorry, you cannot call %@ because of their privacy settings.","Call.StatusRequesting":"Contacting...","Call.StatusRinging":"Ringing...","Call.StatusConnecting":"Connecting...","Call.StatusEnded":"Call Ended","Call.StatusFailed":"Call Failed","Call.StatusBusy":"Busy","Call.StatusCalling":"is calling you...","Contacts.PhoneNumber.NotRegistred":"The person with this phone number is not registered on Telegram yet.","Channel.UsernameAboutChannel":"People can share this link with others and can find your channel using Telegram search.","Channel.UsernameAboutGroup":"People can share this link with others and find your group using Telegram search.","Chat.Accessory.Forward":{one_value:"Forward Message",other_value:"Forward %d Messages"},"Chat.Accessory.Forward.You":"You","Chat.Accessory.Forward.From":"From","Chat.Accessory.Hidden":{one_value:"Forward Message (sender's name hidden)",other_value:"Forward %d Messages (senders' names hidden)"},"Chat.Alert.Forward.Action.Another":"Forward to Another Chat","Chat.Alert.Forward.Action.Hide1":{one_value:"Hide Sender's Name",other_value:"Hide Senders' Names"},"Chat.Alert.Forward.Action.Show1":{one_value:"Show Sender's Name",other_value:"Show Senders' Names"},"Chat.Alert.Forward.Action.ShowCaption":{one_value:"Show Caption",other_value:"Show Captions"},"Chat.Alert.Forward.Action.HideCaption":{one_value:"Hide Caption",other_value:"Hide Captions"},"Chat.CopySelectedText":"Copy Selected Text","Chat.Confirm.Unpin":"Would you like to unpin this message?","Chat.Context.Reacted":"%1$@/%2$@ Reacted","Chat.Context.ReactedFast":{other_value:"%d Reacted"},"Chat.Date.ScheduledFor":"Scheduled for %@","Chat.Date.ScheduledForToday":"Scheduled for today","Chat.DropTitle":"Drop files here to send them","Chat.DropQuickDesc":"in a quick way","Chat.DropAsFilesDesc":"without compression","Chat.Edit.Cancel.Text":"Are you sure you want to discard all changes?","Chat.Input.ReplyToAnswer":"Reply to message in topics","Chat.SendVoice.PrivacyError":"%@ doesn't accept voice and video messages","Chat.Service.Call.Cancelled":"Cancelled","Chat.Service.Call.Missed":"Missed","Chat.Service.PeerJoinedTelegram":"%@ joined Telegram","Chat.Service.Channel.UpdatedTitle":'Channel renamed to "%@"',"Chat.Service.Channel.UpdatedPhoto":"Channel photo updated","Chat.Service.Channel.RemovedPhoto":"Channel photo removed","Chat.Service.Channel.UpdatedVideo":"Channel video updated","Chat.Service.BotPermissionAllowed":"You allowed this bot to message you when you logged in on %@","Chat.Service.Group.UpdatedPinnedMessage":'%@ pinned "%@"',"Chat.Service.Group.TopicEdited.Icon":"%1$@ changed topic icon to %2$@","Chat.Service.Group.TopicEdited.Icon.Removed":"%1$@ removed icon","Chat.Service.Group.TopicEdited.Title":'%1$@ changed topic name to "%2$@"',"Chat.Service.Group.TopicEdited.Paused":"%1$@ closed topic","Chat.Service.Group.TopicEdited.Resumed":"%1$@ restarted topic","Chat.Service.Group.TopicEdited.You.Icon":"You changed topic icon to %1$@","Chat.Service.Group.TopicEdited.You.Icon.Removed":"You removed icon","Chat.Service.Group.TopicEdited.You.Title":'You changed topic name to "%1$@"',"Chat.Service.Group.TopicEdited.You.Paused":"You closed topic","Chat.Service.Group.TopicEdited.You.Resumed":"You restarted topic","Chat.Service.Group.TopicEdited.You.Hided":"You hid the general topic","Chat.Service.Group.TopicEdited.You.Unhided":"You unhid the general topic","Chat.Service.Group.TopicEdited.Hided":"%1$@ hid the general topic","Chat.Service.Group.TopicEdited.Unhided":"%1$@ unhid the general topic","Chat.Service.PaymentSent1":"You have successfully transferred **%1$@** to **%2$@** for **%3$@**","Chat.Service.PaymentSent1NoTitle":"You have successfully transferred **%1$@** to **%2$@**","Chat.Service.PaymentSentRecurringInit":"You successfully transferred **%1$@** to **%2$@** for **%3$@** and allowed future recurring payments","Chat.Service.PaymentSentRecurringInitNoTitle":"You successfully transferred **%1$@** to **%2$@** and allowed future recurring payments","Chat.Service.PaymentSentRecurringUsed":"You have just successfully transferred **%1$@** to **%2$@** for **%3$@** via recurrent payments","Chat.Service.PaymentSentRecurringUsedNoTitle":"You have just successfully transferred **%1$@** to **%2$@** via recurrent payments","Chat.Service.VoiceChatStarted":"%1$@ started a [video chat](open)","Chat.Service.VoiceChatStartedYou":"You started a [video chat](open)","Chat.Service.VoiceChatStarted.Channel":"[Live Stream](open) started","Chat.Service.VoiceChatFinished":"%1$@ ended the video chat (%2$@)","Chat.Service.VoiceChatFinishedYou":"You ended the video chat (%@)","Chat.Service.VoiceChatFinished.Channel":"Live Stream ended (%1$@)","Chat.Service.VoiceChatInvitation":"%1$@ invited %2$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationByYou":"You invited %1$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationForYou":"%1$@ invited you to the [video chat](open)","ChatService.UserJoinedGroupByRequest":"%@ was accepted to the group","ChatService.UserJoinedChannelByRequest":"%@ joined the channel by request","ChatList.Service.VoiceChatScheduled":"%1$@ scheduled a video chat for %2$@","ChatList.Service.VoiceChatScheduledYou":"You scheduled a video chat for %2$@","Chat.Poll.Unvote":"Retract Vote","Chat.Poll.Stop":"Stop Poll","Chat.Poll.ViewResults":"View Results","Chat.Poll.SubmitVote":"Vote","Chat.Poll.Type.Anonymous":"Anonymous Poll","Chat.Poll.Type.Public":"Poll","Chat.Poll.Type.AnonymousQuiz":"Anonymous Quiz","Chat.Poll.Type.Quiz":"Quiz","Chat.Poll.Type.Closed":"Final Results","Chat.Poll.TotalVotes1":{one_value:"%d vote",other_value:"%d votes"},"Chat.Quiz.TotalVotes":{one_value:"%d answer",other_value:"%d answers"},"Chat.Poll.TotalVotesEmpty":"No votes yet","Chat.Poll.TotalVotesResultEmpty":"No votes","Chat.Quiz.TotalVotesEmpty":"No answers yet","Chat.Quiz.TotalVotesResultEmpty":"No answers","Chat.Pinned.DontShow":"Don't Show Pinned Messages","Chat.Title.Comments":{one_value:"%d Comment",other_value:"%d Comments"},"ChatTitle.ReportMessages":"Report Messages","Chat.Send.WithoutSound":"Send Without Sound","Chat.Send.SetReminder":"Set a Reminder","Chat.Send.ScheduledMessage":"Schedule Message","Chat.SendAs.PersonalAccount":"personal account","Chat.UnpinAllMessagesConfirmation":{one_value:"Do you want to unpin %d message in this chat?",other_value:"Do you want to unpin all %d messages in this chat?"},"Chat.Message.Ad.Text":"Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\n\nUnlike other apps, Telegram doesn't track whether you tapped on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\n\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\n\n%@\n\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\n\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.","Chat.Message.Ad.ReadMore":"Read More","Chat.Message.ViewChannel":"VIEW CHANNEL","Chat.Message.ViewBot":"VIEW BOT","Chat.Message.ViewGroup":"VIEW GROUP","Chat.Message.Sponsored.What":"What are sponsored messages?","Chat.Message.Sponsored.Link":"https://promote.telegram.org","Checkout.2FA.Text":"Saving payment details is only available with 2-Step Verification.","Checkout.NewCard.CardholderNamePlaceholder":"Cardholder Name","Checkout.PasswordEntry.Title":"Payment Confirmation","Checkout.PasswordEntry.Pay":"Pay","Checkout.PasswordEntry.Text":"Your card %@ is on file. To pay with this card, please enter your 2-Step-Verification password.","Checkout.PayPrice":"Pay %@","Checkout.WebConfirmation.Title":"Complete Payment","ChatList.Context.Mute":"Mute","ChatList.Context.Unmute":"Unmute","ChatList.Context.Pin":"Pin","ChatList.Context.Unpin":"Unpin","ChatList.Context.DeleteChat":"Delete Chat","ChatList.Context.DeleteAndExit":"Delete and Leave","ChatList.Context.LeaveChannel":"Leave Channel","ChatList.Context.LeaveGroup":"Leave Group","ChatList.Service.Call.incoming":"Incoming Call (%@)","ChatList.Service.Call.outgoing":"Outgoing Call (%@)","ChatList.Service.VideoCall.incoming":"Incoming Video Call (%@)","ChatList.Service.VideoCall.outgoing":"Outgoing Video Call (%@)","ChatList.Service.Call.Cancelled":"Cancelled Call","ChatList.Service.Call.Missed":"Missed Call","ChatList.Service.VideoCall.Cancelled":"Cancelled Video Call","ChatList.Service.VideoCall.Missed":"Missed Video Call","ChatList.Service.VoiceChatScheduled.Channel":"Voice chat scheduled for %@","ChatList.Filter.Header":"Create folders for different groups of chats and quickly switch between them.","ChatList.Filter.NewTitle":"Create Folder","ChatList.Filter.List.Title":"Chat Folders","ChatList.Filter.Include.AddChat":"Add Chats","ChatList.Filter.Exclude.AddChat":"Add Chats","ChatList.Filter.Contacts":"Contacts","ChatList.Filter.NonContacts":"Non-Contacts","ChatList.Filter.Groups":"Groups","ChatList.Filter.Channels":"Channels","ChatList.Filter.Bots":"Bots","ChatList.Filter.MutedChats":"Muted","ChatList.Filter.ReadChats":"Read","ChatList.Filter.Archive":"Archived","ChatList.Filter.Include.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Exclude.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Confirm.Remove.Header":"Remove Folder","ChatList.Filter.Confirm.Remove.Text":"Are you sure you want to remove this folder? Your chats will not be deleted.","ChatList.Mute.1Hour":"For 1 Hour","ChatList.Mute.4Hours":"For 4 Hours","ChatList.Mute.8Hours":"For 8 Hours","ChatList.Mute.1Day":"For 1 Day","ChatList.Mute.3Days":"For 3 Days","ChatList.Mute.Forever":"Forever","Channel.DescriptionHolderDescrpiton":"You can provide an optional description for your channel.","ChannelVisibility.Confirm.MakePrivate.Channel":"If you make this channel private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.","ChannelVisibility.Confirm.MakePrivate.Group":"If you make this group private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.","Context.ViewStickerSet":"View Sticker Set","CreateGroup.NameHolder":"Group Name","CustomEmoji.PremiumAlert":"Subscribe to Telegram Premium to unlock this emoji. [Read More]()","Date.Today":"Today","DeleteChat.DeleteGroupForAll":"Delete for all members",DeleteChannelForAll:"Delete for all subscribers","ForumTopic.Context.Info":"Group Info","ForumTopic.Context.AddMember":"Add Members","ForumTopic.Context.ShowAsMessages":"View as Messages","ForumTopic.Context.New":"Create Topic","ForumTopic.Name.Placeholder":"Topic Name","ForumTopic.Title.Edit":"Edit Topic","EditAccount.Username":"Username","EditAccount.Title":"Edit Profile","EditAccount.Logout":"Log Out","Emoji.Recent":"Frequently Used","Emoji.SmilesAndPeople":"Smileys & People","Emoji.AnimalsAndNature":"Animals & Nature","Emoji.FoodAndDrink":"Food & Drink","Emoji.ActivityAndSport":"Activity & Sport","Emoji.TravelAndPlaces":"Travel & Places","Emoji.Objects":"Objects","Emoji.Flags":"Flags","Error.AnError":"An error occurred. Please try again later.","FileSize.B":"%@ B","FileSize.KB":"%@ KB","FileSize.MB":"%@ MB","FileSize.GB":"%@ GB","InstalledStickers.LoopAnimated":"Loop Animated Stickers","LastSeen.HoursAgo":{one_value:"last seen %d hour ago",other_value:"last seen %d hours ago"},"Login.Register.LastName.Placeholder":"Last Name","Message.Context.Select":"Select","Message.Context.Pin":"Pin","Message.Context.Unpin":"Unpin","Message.Context.Goto":"Show Message","Message.ReplyActionButtonShowReceipt":"Show Receipt","MessageContext.CopyMessageLink1":"Copy Message Link","Modal.Send":"Send","NewContact.Exception.ShareMyPhoneNumber":"Share My Phone Number","NewContact.Exception.ShareMyPhoneNumber.Desc":"You can make your phone visible to %@.","NewPoll.Anonymous":"Anonymous Voting","NewPoll.Explanation.Placeholder":"Add a Comment (Optional)","NewPoll.OptionsAddOption":"Add an Option","NewPoll.MultipleChoice":"Multiple Answers","NewPoll.Quiz":"Quiz Mode","Notification.Contact.Reacted":'%1$@ to your "%2$@"',"Payments.Recurrent.Accept":"I accept [Terms of Service]() of **%@**.","Peer.Activity.User.PlayingGame":"playing a game","Peer.Activity.User.TypingText":"typing","Peer.Activity.User.SendingPhoto":"sending a photo","Peer.Activity.User.RecordingVideo":"recording video","Peer.Activity.User.SendingVideo":"sending a video","Peer.Activity.User.RecordingAudio":"recording voice","Peer.Activity.User.SendingFile":"sending file","Peer.Activity.User.ChoosingSticker":"choosing a sticker","Peer.Activity.User.EnjoyingAnimations":"watching %@","Peer.Activity.Chat.PlayingGame":"%@ is playing a game","Peer.Activity.Chat.TypingText":"%@ is typing","Peer.Activity.Chat.SendingPhoto":"%@ is sending a photo","Peer.Activity.Chat.RecordingVideo":"%@ is recording video","Peer.Activity.Chat.SendingVideo":"%@ is sending a video","Peer.Activity.Chat.RecordingAudio":"%@ is recording voice","Peer.Activity.Chat.SendingFile":"%@ is sending a file","Peer.Activity.Chat.ChoosingSticker":"%@ is choosing a sticker","Peer.Activity.Chat.EnjoyingAnimations":"%@ is watching %@","Peer.Activity.Chat.Multi.PlayingGame1":"%@ and %d others are playing a game","Peer.Activity.Chat.Multi.TypingText1":"%@ and %d others are typing","Peer.Activity.Chat.Multi.SendingPhoto1":"%@ and %d others are sending photos","Peer.Activity.Chat.Multi.RecordingVideo1":"%@ and %d others are recording video","Peer.Activity.Chat.Multi.SendingVideo1":"%@ and %d others are sending videos","Peer.Activity.Chat.Multi.RecordingAudio1":"%@ and %d others are recording voice","Peer.Activity.Chat.Multi.SendingFile1":"%@ and %d others are sending files","Peer.Activity.Chat.Multi.ChoosingSticker1":"%@ and %d others are choosing stickers","Peer.ServiceNotifications":"service notifications","Peer.RepliesNotifications":"Reply Notifications","Peer.Status.justNow":"last seen just now","Peer.Status.Today":"today","Peer.Status.Yesterday":"yesterday","Peer.Status.LastSeenAt":"last seen %@ at %@","Peer.Status.minAgo":{one_value:"last seen %d minute ago",other_value:"last seen %d minutes ago"},"Peer.Status.Member":{one_value:"%d member",other_value:"%d members"},"Peer.Status.Subscribers":{one_value:"%d subscriber",other_value:"%d subscribers"},"PeerInfo.Administrators":"Administrators","PeerInfo.DeleteChannel":"Delete Channel","PeerInfo.Discussion":"Discussion","PeerInfo.Discussion.Add":"Add","PeerInfo.SharedMedia":"Shared Media","PeerInfo.Subscribers":"Subscribers","PeerInfo.DeleteContact":"Delete Contact","PeerInfo.Action.VoiceChat":"Video Chat","PeerInfo.Action.LiveStream":"Live Stream","PeerInfo.Phone.AnonymousInfo":"This number is not tied to a SIM card and was acquired on [Fragment]().","PeerMedia.Members":"Members","PollResults.Title.Poll":"Poll Results","PollResults.Title.Quiz":"Quiz Results","PollResults.LoadMore":{other_value:"Show More (%d)"},"Preview.Dragging.AddItems":{one_value:"Add Item",other_value:"Add Items"},"PreviewSender.CaptionPlaceholder":"Add a caption...","PreviewSender.CompressFile":"Send compressed","PreviewSender.SendFile":{one_value:"Send File",other_value:"Send %d Files"},"PreviewSender.SendPhoto":{one_value:"Send Photo",other_value:"Send %d Photos"},"PreviewSender.SendVideo":{one_value:"Send Video",other_value:"Send %d Videos"},"PrivacyAndSecurity.Item.On":"On","PrivacyAndSecurity.Item.Off":"Off","PrivacyAndSecurity.SensitiveText":"Disable filtering","PrivacyAndSecurity.SensitiveDesc":"Display sensitive media in public channels on all your Telegram devices.","PrivacySettings.VoiceCalls":"Calls","PrivacySettings.Forwards":"Forwarded Messages","PrivacySettings.Groups":"Groups and Channels","PrivacySettingsController.AddUsers":"Add Users","PrivacySettingsController.GroupDescription":"You can restrict who can add you to groups and channels with granular precision.","PrivacySettingsController.Forwards.CustomHelp":"You can restrict who can add a link to your account when forwarding your messages.","PrivacySettingsController.P2p.Desc":"Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.","PrivacySettingsController.PhoneCallDescription":"You can restrict who can call you with granular precision.","PrivacySettingsController.ProfilePhoto.CustomHelp":"You can restrict who can see your profile photo with granular precision.","PrivacySettingsController.LastSeenDescription":"You won't see Last Seen and Online statuses for people with whom you don't share yours. Approximate last seen will be shown instead (recently, within a week, within a month).","PrivacySettingsController.PeerInfo":"You can add users or entire groups as exceptions that will override the settings above.","PrivacySettingsController.Everbody":"Everybody","PrivacySettingsController.MyContacts":"My Contacts","PrivacySettingsController.Nobody":"Nobody","PrivacySettingsController.NeverShare":"Never Share With","PrivacySettingsController.AlwaysShare":"Always Share With","PrivacySettingsController.NeverAllow":"Never Allow","PrivacySettingsController.AlwaysAllow":"Always Allow","PrivacySettingsController.UserCount":{one_value:"%d user",other_value:"%d users"},"RecentSessions.Error.FreshReset":"For security reasons, you can't terminate older sessions from a device that you've just connected. Please use an earlier connection or wait for a few hours.","RequestJoin.Button":"Request to Join","Stickers.SearchAdd":"Add","Stickers.SearchAdded":"Added","Stickers.SuggestStickers":"Suggest Stickers by Emoji","ShareModal.Search.Placeholder":"Share to...","ShareModal.Search.ForwardPlaceholder":"Forward to...","Telegram.GeneralSettingsViewController":"General Settings","Telegram.InstalledStickerPacksController":"Stickers","Telegram.NotificationSettingsViewController":"Notifications","Telegram.LanguageViewController":"Language","Text.CopyLabel_About":"Copy About","Text.CopyLabel_Bio":"Copy Bio","Text.CopyLabel_PhoneNumber":"Copy Phone Number","Text.CopyLabel_Username":"Copy Username","Text.CopyLabel_ShareLink":"Copy Share Link","GeneralSettings.BigEmoji":"Large Emoji","GeneralSettings.EmojiPrediction":"Suggest Emoji","GroupPermission.Delete":"Delete Exception","Search.Confirm.ClearHistory":"Are you sure you want to clear your search history?","SecureId.Identity.Placeholder.ExpiryDate":"Expiry Date","Separator.ShowMore":"show more","Separator.ShowLess":"show less","ScheduleController.at":"at","Schedule.SendToday":"Send today at %@","Schedule.SendDate":"Send on %@ at %@","Schedule.SendWhenOnline":"Send When Online","Sticker.Premium.Click.Info":"This pack contains premium stickers like this one. [View Pack]()","Stickers.Recent":"Recent","StickerSet.DontExist":"Sorry, this sticker set doesn't seem to exist.","Text.Context.Copy.Username":"Copy Username","Text.Context.Copy.Hashtag":"Copy Hashtag","Time.TomorrowAt":"tomorrow at %@","TwoStepAuth.SetPasswordHelp":"You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.","TwoStepAuth.GenericHelp":"You have enabled Two-Step verification.\nYou'll need the password you set up here to log in to your Telegram account.","TwoStepAuth.ChangePassword":"Change Password","TwoStepAuth.RemovePassword":"Turn Password Off","TwoStepAuth.SetupEmail":"Set Recovery Email","TwoStepAuth.ChangeEmail":"Change Recovery Email","TwoStepAuth.ConfirmEmailCodeDesc":"Please enter the code we've just emailed to %@.","TwoStepAuth.RecoveryTitle":"Email Code","TwoStepAuth.RecoveryCode":"Code","TwoStepAuth.RecoveryCodeInvalid":"Invalid code. Please try again.","TwoStepAuth.RecoveryCodeExpired":"Code Expired","TwoStepAuth.SetupHintTitle":"Password Hint","TwoStepAuth.SetupHintPlaceholder":"Hint","VoiceChat.Chat.StartNew":"Video chat ended. Start a new one?","VoiceChat.Chat.StartNew.OK":"Start","VoiceChat.Chat.Ended":"Video chat ended.","VoiceChat.Invite.InviteMembers":"Invite members","VoiceChat.Status.Connecting":"Connecting...","VoiceChat.Status.Members":{one_value:"%d participant",other_value:"%d participants"},"VoiceChat.Status.MutedForYou":"muted for you","VoiceChat.Status.Speaking":"speaking","VoiceChat.Status.Listening":"listening","VoiceChat.Status.WantsSpeak":"wants to speak","VoiceChat.Status.Muted":"muted","VoiceChat.Status.You":"This is you","VoiceChat.Video.Stream.Video":"video","VoiceChat.Video.Stream.Screencast":"screen","VoiceChat.Video.Stream.More":"more","VoiceChat.Leave":"Leave","VoiceChat.End.Title":"Leave video chat","VoiceChat.End.Text":"Are you sure you want to leave this video chat?","VoiceChat.End.Third":"End Video Chat","VoiceChat.End.OK":"Leave","VoiceChat.MutePeer":"Mute","VoiceChat.UnmutePeer":"Allow To Speak","VoiceChat.RemovePeer":"Remove","VoiceChat.OpenProfile":"Open Profile","VoiceChat.MuteForMe":"Mute For Me","VoiceChat.UnmuteForMe":"Unmute For Me","VoiceChat.RemovePeer.Confirm.Channel":"Do you want to remove %1$@ from the channel?","VoiceChat.RemovePeer.Confirm":"Are you sure you want to remove %1$@ from the group?","VoiceChat.RemovePeer.Confirm.OK":"Remove"}}}]); -//# sourceMappingURL=104.f1e35ff90b4ddd68a9d8.chunk.js.map \ No newline at end of file +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[104],{9104:(e,t,o)=>{o.r(t),o.d(t,{default:()=>a});const a={Animations:"Animations",AttachAlbum:"Album","Appearance.Color.Hex":"HEX","Appearance.Color.RGB":"RGB","BlockModal.Search.Placeholder":"Block user...",DarkMode:"Dark Mode",FilterIncludeExcludeInfo:"Choose chats and types of chats that will\nappear and never appear in this folder.",FilterMenuDelete:"Delete Folder",FilterHeaderEdit:"Edit Folder",FilterAllGroups:"All Groups",FilterAllContacts:"All Contacts",FilterAllNonContacts:"All Non-Contacts",FilterAllChannels:"All Channels",FilterAllBots:"All Bots","EditContact.OriginalName":"original name","EditProfile.FirstNameLabel":"Name","EditProfile.BioLabel":"Bio (optional)","EditProfile.Username.Label":"Username (optional)","EditProfile.Username.Available":"Username is available","EditProfile.Username.Taken":"Username is already taken","EditProfile.Username.Invalid":"Username is invalid","ExceptionModal.Search.Placeholder":"Add exception...","Chat.Menu.SelectMessages":"Select Messages","Chat.Menu.ClearSelection":"Clear Selection","Chat.Menu.Hint":"To **edit** or **reply**, close this menu.\nThen tap next to a message.","Chat.Input.UnpinAll":"Unpin All Messages","Chat.Input.Attach.PhotoOrVideo":"Photo or Video","Chat.Input.Attach.Document":"Document","Chat.Subscribe":"SUBSCRIBE","Chat.Selection.LimitToast":"Max selection count reached.","Chat.Search.MessagesFound":{one_value:"%d message found",other_value:"%d messages found"},"Chat.Search.NoMessagesFound":"No messages found","Chat.Search.PrivateSearch":"Private Search","Chat.Service.TopicEdited.Mixed":"%1$@ changed the topic name and icon to %2$@","Chat.Service.TopicEdited.You.Mixed":"You changed the topic name and icon to %2$@","Chat.Service.TopicEdited.Mixed.IconRemoved":'%1$@ changed the topic name to "%1$@" and removed icon',"Chat.Service.TopicEdited.You.Mixed.IconRemoved":'You changed the topic name to "%1$@" and removed icon',"ChatList.Main.EmptyPlaceholder.Title":"Your chats will appear here","ChatList.Main.EmptyPlaceholder.Subtitle":"You have %s on Telegram","ChatList.Main.EmptyPlaceholder.SubtitleNoContacts":"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts","ChatList.Menu.SwitchTo.Webogram":"Switch to Old Version","ChatList.Menu.SwitchTo.Z":"Switch to Z version","ChatMigration.From":"Migrated from %s","ChatMigration.To":"Migrated to %s","ConnectionStatus.ForceReconnect":"force reconnect","ConnectionStatus.ReconnectIn":"Reconnect in %ds, %s","ConnectionStatus.Reconnect":"reconnect","ConnectionStatus.Reconnecting":"Reconnecting...","ConnectionStatus.TimedOut":"Request timed out, %s","ConnectionStatus.Waiting":"Waiting for network...","Contacts.Count":{one_value:"%d contact",other_value:"%d contacts"},"Deactivated.Title":"Too many tabs...","Deactivated.Subtitle":"Telegram supports only one active tab with the app.\nClick anywhere to continue using this tab.","Deactivated.Version.Title":"WebK has updated...","Deactivated.Version.Subtitle":"Another tab is running a newer version of Telegram.\nClick anywhere to reload this tab.","General.Keyboard":"Keyboard","General.SendShortcut.Enter":"Send by Enter","General.SendShortcut.CtrlEnter":"Send by %s + Enter","General.SendShortcut.NewLine.ShiftEnter":"New line by Shift + Enter","General.SendShortcut.NewLine.Enter":"New line by Enter","General.TimeFormat":"Time Format","General.TimeFormat.h12":"12-hour","General.TimeFormat.h23":"24-hour","ChatBackground.UploadWallpaper":"Upload Wallpaper","ChatBackground.Blur":"Blur Wallpaper Image","Notifications.Sound":"Notification Sound",NewPrivateChat:"New Private Chat","NewPoll.OptionLabel":"Option %d","Message.Context.Selection.Copy":"Copy selected","Message.Context.Selection.Clear":"Clear selection","Message.Context.Selection.Delete":"Delete selected","Message.Context.Selection.Forward":"Forward selected","Message.Context.Selection.SendNow":"Send Now selected","Message.Unsupported.Desktop":"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__","Message.Unsupported.Mobile":"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__","Checkbox.Enabled":"Enabled","Checkbox.Disabled":"Disabled","Error.PreviewSender.CaptionTooLong":"Caption is too long.","PreviewSender.GroupItems":"Group items","PreviewSender.SendAlbum":{one_value:"Send Album",other_value:"Send %d Albums"},"Presence.YourChat":"chat with yourself","Privacy.Devices":{one_value:"%1$d device",other_value:"%1$d devices"},"Privacy.Websites":{one_value:"%1$d website",other_value:"%1$d websites"},"Privacy.SensitiveContent":"Sensitive Content","PrivacyModal.Search.Placeholder":"Add Users or Groups...","Permissions.NoExceptions":"No exceptions","Permissions.ExceptionsCount":{one_value:"%d exception",other_value:"%d exceptions"},"PWA.Install":"Install App","Link.Available":"Link is available","Link.Taken":"Link is already taken","Link.Invalid":"Link is invalid","StickersTab.SearchPlaceholder":"Search Stickers",ForwardedFrom:"Forwarded from %s","Popup.Avatar.Title":"Drag to Reposition","Popup.Unpin.AllTitle":"Unpin all messages","Popup.Unpin.HideTitle":"Hide pinned messages","Popup.Unpin.HideDescription":"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.","Popup.Unpin.Hide":"Hide","Popup.Attach.GroupMedia":"Group all media","Popup.Attach.UngroupMedia":"Ungroup all media","Popup.Attach.AsMedia":"Send as media","Popup.Attach.EnableSpoilers":"Hide all with spoilers","Popup.Attach.RemoveSpoilers":"Remove all spoilers","TwoStepAuth.EmailCodeChangeEmail":"Change Email","MarkupTooltip.LinkPlaceholder":"Enter URL...","MediaViewer.Context.Download":"Download",Profile:"Profile",Saved:"Saved",Deleted:"Deleted",ReportBug:"Report Bug","Notifications.Count":{one_value:"%d notification",other_value:"%d notifications"},"Notifications.Forwarded":{one_value:"Forwarded %d message",other_value:"Forwarded %d messages"},"Notifications.New":"New notification","PushNotification.Action.Mute1d":"Mute background alerts for 1 day","PushNotification.Action.Settings":"Background alerts settings","PushNotification.Action.Mute1d.Mobile":"Mute for 24H","PushNotification.Action.Settings.Mobile":"Alerts settings","PushNotification.Message.NoPreview":"You have a new message","LogOut.Description":"Are you sure you want to log out?\n\nNote that you can seamlessly use Telegram on all your devices at once.","VoiceChat.DiscussionGroup":"discussion group","PaymentInfo.CVV":"CVV Code","PaymentInfo.Card.Title":"Enter your card information","PaymentInfo.Billing.Title":"Enter your billing address","PaymentInfo.Done":"PROCEED TO CHECKOUT","PaymentCard.Error.Invalid":"Invalid card number","PaymentCard.Error.Incomplete":"Incomplete card number","LimitReached.Ok":"OK, GOT IT","Username.Purchase":"**This username is already taken.** However, it is currently available for purchase. [Learn more…]()","Video.Unsupported.Desktop":"__Unfortunately, this video can't be played on Telegram Web. Try opening it with our [desktop app](https://getdesktop.telegram.org/) instead.__","Video.Unsupported.Mobile":"__Unfortunately, this video can't be played on Telegram Web. Try opening it with our [mobile app](https://telegram.org/dl/) instead.__",AccDescrEditing:"Editing",ActionCreateChannel:"Channel created",ActionCreateGroup:"un1 created the group",ActionChangedTitle:"un1 changed the group name to un2",ActionRemovedPhoto:"un1 removed the group photo",ActionChangedPhoto:"un1 changed the group photo",ActionChangedVideo:"un1 changed the group video",ActionAddUser:"un1 added un2",ActionAddUserSelf:"un1 returned to the group",ActionAddUserSelfYou:"You returned to the group",ActionAddUserSelfMega:"un1 joined the group",ActionLeftUser:"un1 left the group",ActionKickUser:"un1 removed un2",ActionInviteUser:"un1 joined the group via invite link",ActionPinnedNoText:"un1 pinned a message",ActionMigrateFromGroup:"This group was upgraded to a supergroup",ActionYouScored:"You scored %1$s",ActionUserScored:"un1 scored %1$s",ActionYouScoredInGame:"You scored %1$s in un2",ActionUserScoredInGame:"un1 scored %1$s in un2",AndOther:{one_value:"and %1$d other",other_value:"and %1$d others"},AttachPhoto:"Photo",AttachVideo:"Video",AttachGif:"GIF",AttachLocation:"Location",AttachLiveLocation:"Live Location",AttachContact:"Contact",AttachSticker:"Sticker",AttachAudio:"Voice message",AttachRound:"Video message",AttachGame:"Game",Bot:"bot",ChannelMegaJoined:"You joined this group",EnterChannelName:"Channel name",DescriptionOptionalPlaceholder:"Description (optional)",DescriptionPlaceholder:"Description",DiscussionStarted:"Discussion started",Draft:"Draft",FilterAlwaysShow:"Include Chats",FilterNeverShow:"Exclude Chats",FilterInclude:"Included Chats",FilterExclude:"Excluded Chats",FilterChatTypes:"Chat types",FilterChats:"Chats",FilterNew:"New Folder",Filters:"Folders",FilterRecommended:"Recommended Folders",FilterShowMoreChats:{one_value:"Show %1$d More Chat",other_value:"Show %1$d More Chats"},ForwardedMessageCount:{one_value:"Forwarded message",other_value:"%1$d forwarded messages"},FromYou:"You",Add:"Add",Chats:{one_value:"%1$d chat",other_value:"%1$d chats"},Channels:{one_value:"%1$d channel",other_value:"%1$d channels"},Comments:{one_value:"%1$d Comment",other_value:"%1$d Comments"},Groups:{one_value:"%1$d group",other_value:"%1$d groups"},Users:{one_value:"%1$d user",other_value:"%1$d users"},Members:{one_value:"%1$d member",other_value:"%1$d members"},messages:{one_value:"%1$d message",other_value:"%1$d messages"},UsernameHelpLink:"This link opens a chat with you:\n%1$s",NewChannel:"New Channel",NewGroup:"New Group",Contacts:"Contacts",SavedMessages:"Saved Messages",Settings:"Settings",SettingsHelp:"Help",General:"General",TextSize:"Message Text Size",ChatBackground:"Chat Background",EnableAnimations:"Enable Animations",AutoDownloadMedia:"Auto-Download Media",AutodownloadContacts:"Contacts",AutodownloadPrivateChats:"Private Chats",AutodownloadGroupChats:"Group Chats",AutodownloadChannels:"Channels",AutoplayGIF:"GIFs",AutoplayVideo:"Videos",NotificationsForGroups:"Notifications for groups",NotificationsForPrivateChats:"Notifications for private chats",NotificationsForChannels:"Notifications for channels",NotificationsPrivateChats:"Private Chats",NotificationsGroups:"Groups",NotificationsChannels:"Channels",NotificationsOther:"Other",MarkAsUnread:"Mark as unread",MarkAsRead:"Mark as read",ContactJoined:"Contact joined Telegram",Loading:"Loading...",Unblock:"Unblock",BlockedUsers:"Blocked Users",BlockedUsersInfo:"Blocked users will not be able to contact you and will not see your Last Seen time.",BlockedEmpty:"None",TwoStepVerification:"Two-Step Verification",TwoStepVerificationTitle:"Two-Step Verification",PinnedMessage:"Pinned Message",PinnedMessagesCount:{one_value:"Pinned Message",other_value:"%1$d Pinned Messages"},PrivacyExceptions:"Exceptions",PrivacyLastSeen:"Last Seen & Online",PrivacySettings:"Privacy and Security",PrivacyTitle:"Privacy",PrivacyPhone:"Phone Number",PrivacyPhoneTitle:"Who can see my phone number?",PrivacyPhoneTitle2:"Who can find me by my number?",PrivacyPhoneInfo:"Users who have your number saved in their contacts will also see it on Telegram.",PrivacyPhoneInfo3:"Users who add your number to their contacts will see it on Telegram only if they are your contacts.",PrivacyProfilePhoto:"Profile Photos",PrivacyProfilePhotoTitle:"Who can see my profile photos & videos?",PrivacyP2PHeader:"Peer-to-Peer",PrivacyForwardsTitle:"Who can add a link to my account when forwarding my messages?",Reminders:"Reminders",ScheduledMessages:"Scheduled Messages",LastSeenTitle:"Who can see your Last Seen time?",SessionsTitle:"Active Sessions",CurrentSession:"This device",TerminateAllSessions:"Terminate All Other Sessions",TerminateSessionText:"Are you sure you want to terminate this session?",OtherSessions:"Active sessions",AreYouSureDeleteSingleMessage:"Are you sure you want to delete this message?",AreYouSureDeleteFewMessages:"Are you sure you want to delete these messages?",AreYouSureDeleteSingleMessageMega:"Are you sure you want to delete this message for everyone?",AreYouSureDeleteFewMessagesMega:"Are you sure you want to delete these messages for everyone?",AreYouSureDeleteAndExitName:"Are you sure you want to delete and leave the group **%1$s**?",AreYouSureDeleteThisChatSavedMessages:"Are you sure you want to delete **Saved Messages**?",AreYouSureDeleteThisChatWithUser:"Are you sure you want to delete the chat with **%1$s**?",AreYouSureSessionTitle:"Terminate session",AreYouSureSessionsTitle:"Terminate sessions",AreYouSureSessions:"Are you sure you want to terminate all other sessions?",Terminate:"Terminate",WhoCanCallMe:"Who can call me?",WhoCanAddMe:"Who can add me to group chats?",ArchivedChats:"Archived Chats",Cancel:"Cancel",HistoryCleared:"History was cleared",Archive:"Archive",Unarchive:"Unarchive",Delete:"Delete",Reply:"Reply",Edit:"Edit",Forward:"Forward",CopyLink:"Copy Link",Copy:"Copy",Search:"Search",LinkCopied:"Link copied to clipboard",LinkCopiedPrivateInfo:"This link will only work for members of this chat.",GroupAddMembers:"Add Members",SendMessageTo:"Add people...",JumpToDate:"Jump to Date",Caption:"Caption",Message:"Message",Poll:"Poll",SharedFilesTab2:"Files",SharedMediaTab2:"Media",SharedLinksTab2:"Links",SharedMusicTab2:"Music",SharedVoiceTab2:"Voice",NewPoll:"New Poll",PollOptions:"Poll options",AskAQuestion:"Ask a Question",AddAnExplanationInfo:"Users will see this text after choosing the wrong answer, good for educational purposes.",AccDescrQuizExplanation:"Explanation",PhoneCopied:"Phone copied to clipboard",UsernameCopied:"Username copied to clipboard.",BioCopied:"Bio copied to clipboard.",UserBio:"Bio",Username:"Username",UsernameAlso:"also %1$s",UsernameHelp:"You can choose a username on **Telegram**. If you do, people will be able to find you by this username and contact you without needing your phone number.\n\nYou can use **a–z**, **0–9** and underscores. Minimum length is **5** characters.",Phone:"Phone",Notifications:"Notifications",AreYouSureDeleteContact:"Are you sure you want to delete this contact?",AreYouSureDeleteAndExit:"Are you sure you want to delete and leave the group?",AreYouSureDeleteAndExitChannel:"Do you want to delete and leave the channel?",DeleteContact:"Delete contact",GroupType:"Group Type",ChannelType:"Channel Type",TypePrivate:"Private",TypePublic:"Public",TypePrivateGroup:"Private",TypePublicGroup:"Public",GroupMembers:"Members",DeleteMega:"Delete Group",DeleteMegaMenu:"Delete group",DeleteAndExitButton:"Delete and Leave Group",ChannelDelete:"Delete Channel",ChannelDeleteMenu:"Delete channel",ChannelPermissions:"Permissions",ChannelPermissionsHeader:"What can members of this group do?",ChannelAddException:"Add Exception",ChannelBlockedUsers:"Removed users",NoBlockedUsers:"No removed users",UserRestrictions:"User Permissions",UserRestrictionsDisabled:"This option is disabled for all members in Group Permissions",UserRestrictionsCanDo:"What can this user do?",UserRestrictionsRead:"Read Messages",UserRestrictionsSend:"Send Messages",UserRestrictionsSendMedia:"Send Media",UserRestrictionsSendPolls:"Send Polls",UserRestrictionsSendStickers:"Send Stickers and GIFs",UserRestrictionsEmbedLinks:"Embed Links",UserRestrictionsChangeInfo:"Change Chat Info",UserRestrictionsPinMessages:"Pin Messages",UserRestrictionsInviteUsers:"Add Users",UserRestrictionsNoSend:"can't send messages",UserRestrictionsNoSendMedia:"no media",UserRestrictionsNoSendPolls:"no polls",UserRestrictionsNoSendStickers:"no stickers & GIFs",UserRestrictionsNoEmbedLinks:"no embed links",UserRestrictionsNoChangeInfo:"can't change Info",UserRestrictionsNoPinMessages:"no pins",UserRestrictionsNoInviteUsers:"can't add users",UserRestrictionsBlock:"Ban and remove from group",ChannelPublic:"Public Channel",MegaPublic:"Public Group",ChannelPublicInfo:"Public channels can be found in search, anyone can join them.",MegaPublicInfo:"Public groups can be found in search, chat history is available to everyone and anyone can join.",ChannelPrivate:"Private Channel",MegaPrivate:"Private Group",ChannelPrivateInfo:"Private channels can only be joined via an invite link.",MegaPrivateInfo:"Private groups can only be joined if you were invited or have an invite link.",ChannelPrivateLinkHelp:"People can join your channel by following this link. You can revoke the link any time.",MegaPrivateLinkHelp:"People can join your group by following this link. You can revoke the link any time.",RevokeButton:"Revoke",RevokeLink:"Revoke Link",RevokeAlert:"Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.",SetUrlPlaceholder:"Link",Subscribers:{one_value:"%1$d subscriber",other_value:"%1$d subscribers"},SearchGifsTitle:"Search GIFs",PinMessageAlert:"Pin this message in the group?",PinMessageAlertTitle:"Pin message",PinMessageAlertChannel:"Do you want to pin this message in this channel?",PinMessageAlertChat:"Do you want to pin this message at the top of the chat?",UnpinMessageAlertTitle:"Unpin message",UnpinMessageAlert:"Do you want to unpin this message?",PinNotify:"Notify all members",PinMessage:"Pin",UnpinMessage:"Unpin",PinAlsoFor:"Also pin for %1$s",DeleteMessagesTitle:"Delete %1$s",DeleteSingleMessagesTitle:"Delete message",DeleteMessagesOption:"Unsend My Messages",DeleteMessagesOptionAlso:"Also delete for %1$s",DeleteForAll:"Delete for all members",DeleteMessagesTextGroup:'You can also delete the %1$s you sent from the inboxes of other group members by checking "Unsend my messages".',LeaveChannel:"Leave Channel",LeaveChannelMenu:"Leave channel",ChannelLeaveAlertWithName:"Are you sure you want to leave **%1$s**?",LeaveMegaMenu:"Leave group",DeleteChatUser:"Delete chat",PleaseEnterCurrentPassword:"Enter your password",PleaseEnterFirstPassword:"Enter a password",PleaseReEnterPassword:"Re-enter your password",Continue:"Continue",YourEmailSkip:"Skip",YourEmailSkipWarning:"Warning",YourEmailSkipWarningText:"No, seriously.\n\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.",TurnPasswordOffQuestionTitle:"Disable password",TurnPasswordOffQuestion:"Are you sure you want to disable your password?",Disable:"Disable",TwoStepVerificationSetPassword:"Set Password",TwoStepVerificationPasswordSet:"Password Set!",TwoStepVerificationPasswordSetInfo:"This password will be required when you log in on a new device in addition to the code you get in the SMS.",TwoStepVerificationPasswordReturnSettings:"Return to Settings",RecoveryEmail:"Recovery email",RecoveryEmailTitle:"Recovery Email",ResendCode:"Resend code",PasswordAsHintError:"Hint must be different from your password",AddStickersCount:"ADD %1$s",RemoveStickersCount:"REMOVE %1$s",Stickers:{one_value:"%1$d sticker",other_value:"%1$d stickers"},HidAccount:"The account was hidden by the user",TelegramFeatures:"Telegram Features",SetColor:"Set a color",Open:"Open",OpenUrlTitle:"Open Link",OpenUrlAlert2:"Do you want to open %1$s?",FilterNoChatsToDisplay:"Folder is empty",FilterNoChatsToDisplayInfo:"No chats currently belong to this folder.",SupportStatus:"support",Lately:"last seen recently",WithinAWeek:"last seen within a week",WithinAMonth:"last seen within a month",ALongTimeAgo:"last seen a long time ago",Online:"online",MessageScheduleSend:"Send Now",MessageScheduleEditTime:"Reschedule",YouLeft:"You left this group",Recent:"Recent",Of:"%1$d of %2$d",NoResult:"No results",Updating:"Updating...",Emoji:"Emoji",AddContactTitle:"Add Contact",HiddenName:"Deleted Account",Seconds:{one_value:"%1$d second",other_value:"%1$d seconds"},Minutes:{one_value:"%1$d minute",other_value:"%1$d minutes"},Hours:{one_value:"%1$d hour",other_value:"%1$d hours"},Days:{one_value:"%1$d day",other_value:"%1$d days"},Weeks:{one_value:"%1$d week",other_value:"%1$d weeks"},Months:{one_value:"%1$d month",other_value:"%1$d months"},Years:{one_value:"%1$d year",other_value:"%1$d years"},TodayAtFormattedWithToday:"today at %1$s",formatDateAtTime:"%1$s at %2$s",JoinByPeekChannelTitle:"Join Channel",JoinByPeekGroupTitle:"Join Group",YouWereKicked:"you were removed",ViaBot:"via",InviteExpired:"This invite link has expired.",NoUsernameFound:"There is no Telegram account with this username.",PrivacyDeleteCloudDrafts:"Delete All Cloud Drafts",AreYouSureClearDraftsTitle:"Delete cloud drafts",AreYouSureClearDrafts:"Are you sure you want to delete all cloud drafts?",BotInfoTitle:"What can this bot do?",ChatYourSelf:"forward here to save",GroupEmptyTitle1:"You have created a **group**.",GroupEmptyTitle2:"Groups can have:",GroupDescription1:"Up to 200,000 members",GroupDescription2:"Persistent chat history",GroupDescription3:"Public links such as t.me/title",GroupDescription4:"Admins with different rights",ChatYourSelfDescription1:"Forward messages here to save them",ChatYourSelfDescription2:"Send media and files to store them",ChatYourSelfDescription3:"Access this chat from any device",ChatYourSelfDescription4:"Use search to quickly find things",ChatYourSelfTitle:"Your cloud storage",ActionYouCreateGroup:"You created the group",NoMessages:"No messages here yet...",NoScheduledMessages:"No scheduled messages here yet...",NoMessagesGreetingsDescription:"Send a message or tap the greeting below.",InviteToGroupError:"Sorry, you can't add this user to groups because of user's privacy settings.",InviteToChannelError:"Sorry, you can't add this user to channels because of user's privacy settings.",AddMembersAlertTitle:"Add %1$s",AddOneMemberAlertTitle:"Add member",AddMembersAlertNamesText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersAlertCountText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersForwardMessages:"Show the last 100 messages to the new members",AddOneMemberForwardMessages:"Show the last 100 messages to **%1$s**",PinToTopLimitReached2:"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.",FiltersSetupPinAlert:"Set Up Folders",AppName:"Telegram",OK:"OK",PinFolderLimitReached:"Sorry, you can't pin any more chats to the top.",Send:"Send",ChannelJoin:"JOIN",Yesterday:"yesterday",LeaveAComment:"Leave a comment",ViewInChat:"View in chat",LinkNotFound:"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.",Create:"Create",ViewDiscussion:"View discussion",MessageScheduledUntilOnline:"Scheduled until online",ReportChat:"Report",ReportChatSpam:"Spam",ReportChatViolence:"Violence",ReportChatPornography:"Pornography",ReportChatChild:"Child Abuse",ReportChatOther:"Other",ReportChatDescription:"Description",ReportInfo:"Please enter any additional details relevant to your report.",ReportSentInfo:"Telegram moderators will review your report.\nThank you for your cooperation!",ReportHint:"Additional details...",ChatHistory:"Chat history for new members",ShareContact:"Share contact",SendMessageTitle:"Send message",SendContactToGroupText:"Do you want to send this contact to **%1$s**?",ChannelBroadcast:"Broadcast",ChannelSilentBroadcast:"Silent Broadcast",Comment:"Comment",SendAnonymously:"Send anonymously",DiscardVoiceMessageTitle:"Discard Voice Message",DiscardVoiceMessageDescription:"Are you sure you want to stop recording and discard your voice message?",DiscardVoiceMessageAction:"Discard",AddContact:"Add to contacts",BlockUser:"Block user",MobileHidden:"Mobile hidden",MobileHiddenExceptionInfo:"Phone number will be visible once %1$s adds you as a contact.",FirstName:"First name (required)",LastName:"Last name (optional)",AreYouSureBlockContact2:"Are you sure you want to block **%1$s**?",UserBlocked:"User blocked",UserUnblocked:"User unblocked",AudioUnknownArtist:"Unknown artist",AudioUnknownTitle:"Unknown title",LogOut:"Log out",OnlineCount:{one_value:"%1$d online",other_value:"%1$d online"},EditedMessage:"edited",GlobalSearch:"Global search",SearchMessages:"Messages",SearchAllChatsShort:"Chats",ClearButton:"Clear",FilterAllChats:"All Chats",FilterAllChatsShort:"All",Call:"Call",VideoCall:"Video Call",CallMessageOutgoing:"Outgoing Call",CallMessageIncoming:"Incoming Call",CallMessageVideoOutgoing:"Outgoing Video Call",CallMessageVideoIncoming:"Incoming Video Call",VoipExchangingKeys:"Exchanging encryption keys",VoipUnmute:"Unmute",SavingContentTitle:"Saving content",RestrictSavingContent:"Restrict saving content",RestrictSavingContentInfoGroup:"Members won't be able to copy, save and forward content from this group.",RestrictSavingContentInfoChannel:"Subscribers won't be able to copy, save and forward content from this channel.",ClearOtherSessionsHelp:"Logs out all devices except for this one.",SessionsListInfo:"The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.",SponsoredMessage:"sponsored",OpenChannelPost:"VIEW POST",FilterNameHint:"Folder name",BotStart:"START",BotUnblock:"RESTART",BotStop:"Stop bot",BotRestart:"Restart bot",ShareYouPhoneNumberTitle:"Share your phone number?",AreYouSureShareMyContactInfoBot:"The bot will know your phone number. This can be useful for integration with other services.",DistanceUnitsTitle:"Distance units",DistanceUnitsKilometers:"Kilometers",DistanceUnitsMiles:"Miles",PeopleNearby:"People Nearby",MakeMyselfVisible:"Make Myself Visible",MakeMyselfVisibleTitle:"Show Your Profile?",MakeMyselfVisibleInfo:"Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\n\nYour phone number will remain hidden.",StopShowingMe:"Stop Showing Me",PeopleNearbyInfo2:"Exchange contact info with people nearby and find new friends.",NearbyCreateGroup:"Create a Local group",AwayTo:"%1$s away",MessagePreview:"Message Preview",KMetersAway2:"%1$s km away",MetersAway2:"%1$s m away",MilesAway:"%1$s mi away",FootsAway:"%1$s ft away",PeopleNearbyHeader:"People nearby",ChatsNearbyHeader:"Groups nearby",ChatLocation:"Location",RequestToJoinGroupDescription:"This group accepts new members only after they are approved by its admins.",RequestToJoinChannelDescription:"This channel accepts new subscribers only after they are approved by its admins.",RequestToJoinSent:"Join request sent",RequestToJoinGroupApproved:"Your request to join the group was approved",RequestToJoinChannelApproved:"Your request to join the channel was approved",Update:"UPDATE",Reactions:"Reactions",DoubleTapSetting:"Quick Reaction",EnableReactions:"Enable Reactions",EnableReactionsChannelInfo:"Allow subscribers to react to channel posts.",EnableReactionsGroupInfo:"Allow members to react to group messages.",AvailableReactions:"Available reactions",NobodyViewed:"Nobody viewed",MessageSeen:{one_value:"Seen",other_value:"%1$d Seen"},DataSettings:"Data and Storage",GroupsAndChannelsHelp:"Change who can add you to groups and channels.",SessionsInfo:"Control your sessions on other devices.",StickersBotInfo:"Artists are welcome to add their own sticker sets using our @stickers bot.",AutomaticMediaDownload:"Automatic media download",AutoDownloadPhotos:"Photos",AutoDownloadVideos:"Videos",AutoDownloadFiles:"Files",AutoDownloadOnAllChats:"On in all chats",AutoDownloadUpToOnAllChats:"Up to %1$s in all chats",AutoDownloadOff:"Off",AutoDownloadOnUpToFor:"Up to %1$s for %2$s",AutoDownloadOnFor:"On for %1$s",AutoDownloadContacts:"Contacts",AutoDownloadPm:"PM",AutoDownloadGroups:"Groups",AutoDownloadChannels:"Channels",AutoDownloadAudioInfo:"Voice messages are tiny, so they're always downloaded automatically.",AutoplayMedia:"Auto-play media",AutoDownloadPhotosTitle:"Auto-download photos",AutoDownloadVideosTitle:"Auto-download videos and GIFs",AutoDownloadFilesTitle:"Auto-download files and music",AutoDownloadMaxFileSize:"Maximum file size",AutodownloadSizeLimitUpTo:"up to %1$s",ResetAutomaticMediaDownload:"Reset Auto-Download Settings",ResetAutomaticMediaDownloadAlertTitle:"Reset settings",ResetAutomaticMediaDownloadAlert:"Are you sure you want to reset auto-download settings?",Reset:"Reset",SendMessageAsTitle:"Send message as...",Devices:"Devices",LanguageName:"English",EditCantEditPermissionsPublic:"This permission is not available in public groups.",VoipUserMicrophoneIsOff:"%s's microphone is off",VoipUserCameraIsOff:"%s's camera is off",PrivacyPhoneInfo4:"This public link opens a chat with you:",ReportChatIllegalDrugs:"Illegal Drugs",ReportChatPersonalDetails:"Personal Details",VoipPeerIncompatible:"**%1$s**'s app is using an incompatible protocol. They need to update their app before you can call them.",TelegramFeaturesUrl:"https://t.me/TelegramTips",ScamMessage:"SCAM",FakeMessage:"FAKE",TextCopied:"Text copied to clipboard",PaymentInvoice:"INVOICE",PaymentTestInvoice:"TEST INVOICE",PaymentReceipt:"Receipt",PaymentCheckout:"Checkout",PaymentTransactionTotal:"Total",PaymentTip:"Tip",PaymentTipOptional:"Tip (Optional)",PaymentCheckoutPay:"PAY %1$s",PaymentCheckoutMethod:"Payment method",PaymentCheckoutProvider:"Payment provider",PaymentCardNumber:"Card Number",PaymentCardSavePaymentInformation:"Save Payment Information",PaymentCardInfo:"Payment info",PaymentCardSavePaymentInformationInfoLine1:"You can save your payment info for future use. It will be stored directly with the payment provider. Telegram has no access to your credit card data.",Done:"Done",PaymentShippingMethod:"Shipping methods",PaymentNoShippingMethod:"Sorry, it is not possible to deliver to your address.",PaymentShippingInfo:"Shipping Information",PaymentShippingAddress:"Shipping address",PaymentShippingAddress1Placeholder:"Address 1 (Street)",PaymentShippingAddress2Placeholder:"Address 2 (Street)",PaymentShippingCityPlaceholder:"City",PaymentShippingStatePlaceholder:"State",PaymentShippingCountry:"Country",PaymentShippingZipPlaceholder:"Postcode",PaymentShippingReceiver:"Receiver",PaymentShippingName:"Full Name",PaymentShippingEmailPlaceholder:"Email",PaymentCheckoutPhoneNumber:"Phone number",PaymentCheckoutShippingMethod:"Shipping method",PaymentShippingSave:"Save Shipping Information",PaymentShippingSaveInfo:"You can save your shipping info for future use.",PaymentInfoHint:"You paid **%1$s** for **%2$s**.",PrivacyPayments:"Payments",PrivacyPaymentsClearInfo:"You can delete your shipping info and instruct all payment providers to remove your saved credit cards. Note that Telegram never stores your credit card data.",PrivacyPaymentsClear:"Clear Payment and Shipping Info",PrivacyPaymentsClearAlertTitle:"Clear payment info",PrivacyPaymentsClearAlertText:"Are you sure you want to clear your payment and shipping info?",PrivacyPaymentsPaymentInfoCleared:"Payment info cleared.",PrivacyPaymentsShippingInfoCleared:"Shipping info cleared.",PrivacyPaymentsPaymentShippingCleared:"Payment and shipping info cleared.",PrivacyClearShipping:"Shipping info",PrivacyClearPayment:"Payment info",Clear:"Clear",Save:"Save",PaymentCheckoutName:"Name",ClearRecentStickersAlertTitle:"Clear recent stickers",ClearRecentStickersAlertMessage:"Do you want to clear all your recent stickers?",PremiumStickersShort:"Premium",FavoriteStickers:"Favorites",AddToFavorites:"Add to Favorites",AddedToFavorites:"Sticker added to Favorites.",RemovedFromFavorites:"Sticker was removed from Favorites",RemovedFromRecent:"Sticker was removed from Recent",DeleteFromFavorites:"Delete from Favorites",DeleteFromRecent:"Remove from Recent",NewChatsFromNonContacts:"New chats from unknown users",ArchiveAndMute:"Archive and Mute",ArchiveAndMuteInfo:"Automatically archive and mute new chats, groups and channels from non-contacts.",PrivacyVoiceMessages:"Voice Messages",PrivacyVoiceMessagesTitle:"Who can send me voice or video messages?",PrivacyVoiceMessagesInfo:"You can restrict who can send you voice or video messages with granular precision.",PrivacyVoiceMessagesPremiumOnly:"Only subscribers of *Telegram Premium* can restrict receiving voice messages.",EmojiCount:{other_value:"%1$d emoji"},AddEmojiNotFound:"Emoji pack not found.",MessageContainsEmojiPack:"This message contains emoji from %s pack.",MessageContainsEmojiPacks:{other_value:"This message contains emoji from **%d Packs**."},EmojiPackCount:{one_value:"%1$d Emoji Pack",other_value:"%1$d Emoji Packs"},ReactionsAll:"All",EnableSomeReactionsInfo:"Members of the group can use only certain approved emoji as reactions to messages.",EnableAllReactionsInfo:"Members of the group can use any emoji as reactions to messages.",DisableReactionsInfo:"Members of the group can’t add any reactions to messages.",OnlyAllowThisReactions:"Only allow these reactions",AllReactions:"All reactions",SomeReactions:"Some reactions",NoReactions:"No reactions",LimitReached:"Limit Reached",LimitReachedPinDialogs:"You can't pin more than %1$d chats to the top. Unpin some that are currently pinned – or subscribe to **Telegram Premium** to double the limit to **%2$d** chats.",LimitReachedPinDialogsPremium:"Sorry, you can't pin more than %1$d chats to the top. Unpin some that are currently pinned.",LimitReachedPinDialogsLocked:"Sorry, you can't pin more than %1$d chats to the top. Unpin some that are currently pinned. We are working to let you increase this limit in the future.",IncreaseLimit:"Increase Limit",LimitFree:"Free",LimitPremium:"Premium",ActionTTLChanged:"un1 set messages to auto-delete in %1$s",ActionTTLYouChanged:"You set messages to auto-delete in %1$s",ActionTTLChannelChanged:"Messages in this channel will be automatically deleted after %1$s",ActionTTLChannelDisabled:"Messages in this channel will no longer be automatically deleted",ActionTTLDisabled:"un1 disabled the auto-delete timer",ActionTTLYouDisabled:"You disabled the auto-delete timer",UsernamesProfileHeader:"Username order",UsernamesProfileHelp:"Drag and drop links to change the order in which they will be displayed on your info page.",UsernamesChannelHelp:"Drag and drop links to change the order in which they will be displayed on the channel info page.",UsernameLinkEditable:"tap to edit",UsernameLinkActive:"active",UsernameLinkInactive:"not active",UsernameActivateLink:"Activate link",UsernameDeactivateLink:"Deactivate link",UsernameActivateLinkProfileMessage:"Do you want to show this link on your info page?",UsernameDeactivateLinkProfileMessage:"Do you want to hide this link from your info page?",UsernameActivateLinkChannelMessage:"Do you want to show this link on the channel info page?",UsernameDeactivateLinkChannelMessage:"Do you want to hide this link from the channel info page?",Hide:"Hide",Show:"Show",UsernameActivateErrorTitle:"Too many active links",UsernameActivateErrorMessage:"Sorry, you have too many active public links already. Please hide one of your active public links first.",ChannelSignMessages:"Sign Messages",TopicWasCreatedAction:"%s was created",Topics:"Topics",ForumToggleDescription:"The group chat will be divided into topics created by admins or users.",AnonymousNumber:"Anonymous Number",Info:"Info",BotSettings:"Settings",OpenMessage:"VIEW MESSAGE",OpenGroup:"VIEW GROUP",CloseTopic:"Close topic",RestartTopic:"Reopen topic",LimitReachedPinnedTopics:"Sorry, you can't pin more than %d topics to the top.",TopicProfileStatus:"In %s",AccDescrTopic:"Topic",DeleteTopics:{one_value:"Delete topic",other_value:"Delete topics"},DeleteSelectedTopic:"Are you sure you want delete %s?",NewTopic:"New Topic",CreateTopicTitle:"Choose a topic name and icon",CreateGeneralTopicTitle:"Choose topic name",EditTopicHide:"Show in Topics",EditTopicHideInfo:"If the 'General' topic is hidden, group members can pull down in the topic list to view it.",OpenUrlOption1:"Log in to %1$s as **%2$s**",OpenUrlOption2:"Allow **%1$s** to send me messages",OtherWebSessions:"Connected websites",WebSessionsTitle:"Logged In with Telegram",TerminateWebSessionText:"Are you sure you want to disconnect %1$s?",Disconnect:"Disconnect",TerminateAllWebSessions:"Disconnect All Websites",AreYouSureWebSessions:"Are you sure you want to disconnect all websites where you logged in with Telegram?",ClearOtherWebSessionsHelp:"You can log in on websites that support signing in with Telegram.",TerminateWebSessionInfo:"Tap to disconnect from your Telegram account.",EnablePhotoSpoiler:"Hide with spoiler",DisablePhotoSpoiler:"Remove spoiler",LimitReachedFolders:"You have reached the limit of **%1$d** folders. You can double the limit to **%2$d** folders by subscribing to **Telegram Premium**.",LimitReachedFoldersPremium:"You have reached the limit of **%1$d** folders for this account.",LimitReachedFoldersLocked:"You have reached the limit of **%1$d** folders for this account. We are working to let you increase this limit in the future.",FwdMessageToSavedMessages:"Message forwarded to **Saved Messages**.",FwdMessagesToSavedMessages:"Messages forwarded to **Saved Messages**.",ColorTheme:"Color theme",SendAsFile:"Send as file",SendAsFiles:"Send as files",ChatThemeChangedYou:"You changed the chat theme to %1$s",ChatThemeChangedTo:"%1$s changed the chat theme to %2$s",ChatThemeDisabled:"%1$s disabled the chat theme",ChatThemeDisabledYou:"You disabled the chat theme","AccountSettings.Filters":"Chat Folders","AccountSettings.Notifications":"Notifications and Sounds","AccountSettings.PrivacyAndSecurity":"Privacy and Security","AccountSettings.Language":"Language","Alert.UserDoesntExists":"Sorry, this user doesn't seem to exist.","Alert.Confirm.Discard":"Discard","Appearance.Reset":"Reset to Defaults","AutoDownloadSettings.Delimeter":", ","AutoDownloadSettings.LastDelimeter":" and ","Bio.Description":"Any details such as age, occupation or city.\nExample: 23 y.o. designer from San Francisco","Call.Accept":"Accept","Call.Decline":"Decline","Call.End":"End","Call.Camera":"Camera","Call.Mute":"Mute","Call.Recall":"Recall","Call.Close":"Close","Call.Screen":"Screen","Call.Confirm.Discard.Voice.Header":"Video Chat in Progress","Call.Confirm.Discard.Voice.ToVoice.Text":'Leave video chat in "%1$@" and start a new one in "%2$@"?',"Call.Confirm.Discard.Voice.ToCall.Text":'Leave video chat in "%1$@" and start a call with "%2$@"?',"Call.Confirm.Discard.Call.Header":"Call in Progress","Call.Confirm.Discard.Call.ToVoice.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.Confirm.Discard.Call.ToCall.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.PrivacyErrorMessage":"Sorry, you cannot call %@ because of their privacy settings.","Call.StatusRequesting":"Contacting...","Call.StatusRinging":"Ringing...","Call.StatusConnecting":"Connecting...","Call.StatusEnded":"Call Ended","Call.StatusFailed":"Call Failed","Call.StatusBusy":"Busy","Call.StatusCalling":"is calling you...","Contacts.PhoneNumber.NotRegistred":"The person with this phone number is not registered on Telegram yet.","Channel.UsernameAboutChannel":"People can share this link with others and can find your channel using Telegram search.","Channel.UsernameAboutGroup":"People can share this link with others and find your group using Telegram search.","Chat.Accessory.Forward":{one_value:"Forward Message",other_value:"Forward %d Messages"},"Chat.Accessory.Forward.You":"You","Chat.Accessory.Forward.From":"From","Chat.Accessory.Hidden":{one_value:"Forward Message (sender's name hidden)",other_value:"Forward %d Messages (senders' names hidden)"},"Chat.Alert.Forward.Action.Another":"Forward to Another Chat","Chat.Alert.Forward.Action.Hide1":{one_value:"Hide Sender's Name",other_value:"Hide Senders' Names"},"Chat.Alert.Forward.Action.Show1":{one_value:"Show Sender's Name",other_value:"Show Senders' Names"},"Chat.Alert.Forward.Action.ShowCaption":{one_value:"Show Caption",other_value:"Show Captions"},"Chat.Alert.Forward.Action.HideCaption":{one_value:"Hide Caption",other_value:"Hide Captions"},"Chat.CopySelectedText":"Copy Selected Text","Chat.Confirm.Unpin":"Would you like to unpin this message?","Chat.Context.Reacted":"%1$@/%2$@ Reacted","Chat.Context.ReactedFast":{other_value:"%d Reacted"},"Chat.Date.ScheduledFor":"Scheduled for %@","Chat.Date.ScheduledForToday":"Scheduled for today","Chat.DropTitle":"Drop files here to send them","Chat.DropQuickDesc":"in a quick way","Chat.DropAsFilesDesc":"without compression","Chat.Edit.Cancel.Text":"Are you sure you want to discard all changes?","Chat.Input.ReplyToAnswer":"Reply to message in topics","Chat.SendVoice.PrivacyError":"%@ doesn't accept voice and video messages","Chat.Service.Call.Cancelled":"Cancelled","Chat.Service.Call.Missed":"Missed","Chat.Service.PeerJoinedTelegram":"%@ joined Telegram","Chat.Service.Channel.UpdatedTitle":'Channel renamed to "%@"',"Chat.Service.Channel.UpdatedPhoto":"Channel photo updated","Chat.Service.Channel.RemovedPhoto":"Channel photo removed","Chat.Service.Channel.UpdatedVideo":"Channel video updated","Chat.Service.BotPermissionAllowed":"You allowed this bot to message you when you logged in on %@","Chat.Service.Group.UpdatedPinnedMessage":'%@ pinned "%@"',"Chat.Service.Group.TopicEdited.Icon":"%1$@ changed topic icon to %2$@","Chat.Service.Group.TopicEdited.Icon.Removed":"%1$@ removed icon","Chat.Service.Group.TopicEdited.Title":'%1$@ changed topic name to "%2$@"',"Chat.Service.Group.TopicEdited.Paused":"%1$@ closed topic","Chat.Service.Group.TopicEdited.Resumed":"%1$@ restarted topic","Chat.Service.Group.TopicEdited.You.Icon":"You changed topic icon to %1$@","Chat.Service.Group.TopicEdited.You.Icon.Removed":"You removed icon","Chat.Service.Group.TopicEdited.You.Title":'You changed topic name to "%1$@"',"Chat.Service.Group.TopicEdited.You.Paused":"You closed topic","Chat.Service.Group.TopicEdited.You.Resumed":"You restarted topic","Chat.Service.Group.TopicEdited.You.Hided":"You hid the general topic","Chat.Service.Group.TopicEdited.You.Unhided":"You unhid the general topic","Chat.Service.Group.TopicEdited.Hided":"%1$@ hid the general topic","Chat.Service.Group.TopicEdited.Unhided":"%1$@ unhid the general topic","Chat.Service.PaymentSent1":"You have successfully transferred **%1$@** to **%2$@** for **%3$@**","Chat.Service.PaymentSent1NoTitle":"You have successfully transferred **%1$@** to **%2$@**","Chat.Service.PaymentSentRecurringInit":"You successfully transferred **%1$@** to **%2$@** for **%3$@** and allowed future recurring payments","Chat.Service.PaymentSentRecurringInitNoTitle":"You successfully transferred **%1$@** to **%2$@** and allowed future recurring payments","Chat.Service.PaymentSentRecurringUsed":"You have just successfully transferred **%1$@** to **%2$@** for **%3$@** via recurrent payments","Chat.Service.PaymentSentRecurringUsedNoTitle":"You have just successfully transferred **%1$@** to **%2$@** via recurrent payments","Chat.Service.VoiceChatStarted":"%1$@ started a [video chat](open)","Chat.Service.VoiceChatStartedYou":"You started a [video chat](open)","Chat.Service.VoiceChatStarted.Channel":"[Live Stream](open) started","Chat.Service.VoiceChatFinished":"%1$@ ended the video chat (%2$@)","Chat.Service.VoiceChatFinishedYou":"You ended the video chat (%@)","Chat.Service.VoiceChatFinished.Channel":"Live Stream ended (%1$@)","Chat.Service.VoiceChatInvitation":"%1$@ invited %2$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationByYou":"You invited %1$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationForYou":"%1$@ invited you to the [video chat](open)","ChatService.UserJoinedGroupByRequest":"%@ was accepted to the group","ChatService.UserJoinedChannelByRequest":"%@ joined the channel by request","ChatList.Service.VoiceChatScheduled":"%1$@ scheduled a video chat for %2$@","ChatList.Service.VoiceChatScheduledYou":"You scheduled a video chat for %2$@","Chat.Poll.Unvote":"Retract Vote","Chat.Poll.Stop":"Stop Poll","Chat.Poll.ViewResults":"View Results","Chat.Poll.SubmitVote":"Vote","Chat.Poll.Type.Anonymous":"Anonymous Poll","Chat.Poll.Type.Public":"Poll","Chat.Poll.Type.AnonymousQuiz":"Anonymous Quiz","Chat.Poll.Type.Quiz":"Quiz","Chat.Poll.Type.Closed":"Final Results","Chat.Poll.TotalVotes1":{one_value:"%d vote",other_value:"%d votes"},"Chat.Quiz.TotalVotes":{one_value:"%d answer",other_value:"%d answers"},"Chat.Poll.TotalVotesEmpty":"No votes yet","Chat.Poll.TotalVotesResultEmpty":"No votes","Chat.Quiz.TotalVotesEmpty":"No answers yet","Chat.Quiz.TotalVotesResultEmpty":"No answers","Chat.Pinned.DontShow":"Don't Show Pinned Messages","Chat.Title.Comments":{one_value:"%d Comment",other_value:"%d Comments"},"ChatTitle.ReportMessages":"Report Messages","Chat.Send.WithoutSound":"Send Without Sound","Chat.Send.SetReminder":"Set a Reminder","Chat.Send.ScheduledMessage":"Schedule Message","Chat.SendAs.PersonalAccount":"personal account","Chat.UnpinAllMessagesConfirmation":{one_value:"Do you want to unpin %d message in this chat?",other_value:"Do you want to unpin all %d messages in this chat?"},"Chat.Message.Ad.Text":"Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\n\nUnlike other apps, Telegram doesn't track whether you tapped on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\n\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\n\n%@\n\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\n\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.","Chat.Message.Ad.ReadMore":"Read More","Chat.Message.ViewChannel":"VIEW CHANNEL","Chat.Message.ViewBot":"VIEW BOT","Chat.Message.ViewGroup":"VIEW GROUP","Chat.Message.Sponsored.What":"What are sponsored messages?","Chat.Message.Sponsored.Link":"https://promote.telegram.org","Checkout.2FA.Text":"Saving payment details is only available with 2-Step Verification.","Checkout.NewCard.CardholderNamePlaceholder":"Cardholder Name","Checkout.PasswordEntry.Title":"Payment Confirmation","Checkout.PasswordEntry.Pay":"Pay","Checkout.PasswordEntry.Text":"Your card %@ is on file. To pay with this card, please enter your 2-Step-Verification password.","Checkout.PayPrice":"Pay %@","Checkout.WebConfirmation.Title":"Complete Payment","ChatList.Context.Mute":"Mute","ChatList.Context.Unmute":"Unmute","ChatList.Context.Pin":"Pin","ChatList.Context.Unpin":"Unpin","ChatList.Context.DeleteChat":"Delete Chat","ChatList.Context.DeleteAndExit":"Delete and Leave","ChatList.Context.LeaveChannel":"Leave Channel","ChatList.Context.LeaveGroup":"Leave Group","ChatList.Service.Call.incoming":"Incoming Call (%@)","ChatList.Service.Call.outgoing":"Outgoing Call (%@)","ChatList.Service.VideoCall.incoming":"Incoming Video Call (%@)","ChatList.Service.VideoCall.outgoing":"Outgoing Video Call (%@)","ChatList.Service.Call.Cancelled":"Cancelled Call","ChatList.Service.Call.Missed":"Missed Call","ChatList.Service.VideoCall.Cancelled":"Cancelled Video Call","ChatList.Service.VideoCall.Missed":"Missed Video Call","ChatList.Service.VoiceChatScheduled.Channel":"Voice chat scheduled for %@","ChatList.Filter.Header":"Create folders for different groups of chats and quickly switch between them.","ChatList.Filter.NewTitle":"Create Folder","ChatList.Filter.List.Title":"Chat Folders","ChatList.Filter.Include.AddChat":"Add Chats","ChatList.Filter.Exclude.AddChat":"Add Chats","ChatList.Filter.Contacts":"Contacts","ChatList.Filter.NonContacts":"Non-Contacts","ChatList.Filter.Groups":"Groups","ChatList.Filter.Channels":"Channels","ChatList.Filter.Bots":"Bots","ChatList.Filter.MutedChats":"Muted","ChatList.Filter.ReadChats":"Read","ChatList.Filter.Archive":"Archived","ChatList.Filter.Include.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Exclude.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Confirm.Remove.Header":"Remove Folder","ChatList.Filter.Confirm.Remove.Text":"Are you sure you want to remove this folder? Your chats will not be deleted.","ChatList.Mute.1Hour":"For 1 Hour","ChatList.Mute.4Hours":"For 4 Hours","ChatList.Mute.8Hours":"For 8 Hours","ChatList.Mute.1Day":"For 1 Day","ChatList.Mute.3Days":"For 3 Days","ChatList.Mute.Forever":"Forever","Channel.DescriptionHolderDescrpiton":"You can provide an optional description for your channel.","ChannelVisibility.Confirm.MakePrivate.Channel":"If you make this channel private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.","ChannelVisibility.Confirm.MakePrivate.Group":"If you make this group private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.","Context.ViewStickerSet":"View Sticker Set","CreateGroup.NameHolder":"Group Name","CustomEmoji.PremiumAlert":"Subscribe to Telegram Premium to unlock this emoji. [Read More]()","Date.Today":"Today","DeleteChat.DeleteGroupForAll":"Delete for all members",DeleteChannelForAll:"Delete for all subscribers","ForumTopic.Context.Info":"Group Info","ForumTopic.Context.AddMember":"Add Members","ForumTopic.Context.ShowAsMessages":"View as Messages","ForumTopic.Context.New":"Create Topic","ForumTopic.Name.Placeholder":"Topic Name","ForumTopic.Title.Edit":"Edit Topic","EditAccount.Username":"Username","EditAccount.Title":"Edit Profile","EditAccount.Logout":"Log Out","Emoji.Recent":"Frequently Used","Emoji.SmilesAndPeople":"Smileys & People","Emoji.AnimalsAndNature":"Animals & Nature","Emoji.FoodAndDrink":"Food & Drink","Emoji.ActivityAndSport":"Activity & Sport","Emoji.TravelAndPlaces":"Travel & Places","Emoji.Objects":"Objects","Emoji.Flags":"Flags","Error.AnError":"An error occurred. Please try again later.","FileSize.B":"%@ B","FileSize.KB":"%@ KB","FileSize.MB":"%@ MB","FileSize.GB":"%@ GB","InstalledStickers.LoopAnimated":"Loop Animated Stickers","LastSeen.HoursAgo":{one_value:"last seen %d hour ago",other_value:"last seen %d hours ago"},"Login.Register.LastName.Placeholder":"Last Name","Message.Context.Select":"Select","Message.Context.Pin":"Pin","Message.Context.Unpin":"Unpin","Message.Context.Goto":"Show Message","Message.ReplyActionButtonShowReceipt":"Show Receipt","MessageContext.CopyMessageLink1":"Copy Message Link","Modal.Send":"Send","NewContact.Exception.ShareMyPhoneNumber":"Share My Phone Number","NewContact.Exception.ShareMyPhoneNumber.Desc":"You can make your phone visible to %@.","NewPoll.Anonymous":"Anonymous Voting","NewPoll.Explanation.Placeholder":"Add a Comment (Optional)","NewPoll.OptionsAddOption":"Add an Option","NewPoll.MultipleChoice":"Multiple Answers","NewPoll.Quiz":"Quiz Mode","Notification.Contact.Reacted":'%1$@ to your "%2$@"',"Payments.Recurrent.Accept":"I accept [Terms of Service]() of **%@**.","Peer.Activity.User.PlayingGame":"playing a game","Peer.Activity.User.TypingText":"typing","Peer.Activity.User.SendingPhoto":"sending a photo","Peer.Activity.User.RecordingVideo":"recording video","Peer.Activity.User.SendingVideo":"sending a video","Peer.Activity.User.RecordingAudio":"recording voice","Peer.Activity.User.SendingFile":"sending file","Peer.Activity.User.ChoosingSticker":"choosing a sticker","Peer.Activity.User.EnjoyingAnimations":"watching %@","Peer.Activity.Chat.PlayingGame":"%@ is playing a game","Peer.Activity.Chat.TypingText":"%@ is typing","Peer.Activity.Chat.SendingPhoto":"%@ is sending a photo","Peer.Activity.Chat.RecordingVideo":"%@ is recording video","Peer.Activity.Chat.SendingVideo":"%@ is sending a video","Peer.Activity.Chat.RecordingAudio":"%@ is recording voice","Peer.Activity.Chat.SendingFile":"%@ is sending a file","Peer.Activity.Chat.ChoosingSticker":"%@ is choosing a sticker","Peer.Activity.Chat.EnjoyingAnimations":"%@ is watching %@","Peer.Activity.Chat.Multi.PlayingGame1":"%@ and %d others are playing a game","Peer.Activity.Chat.Multi.TypingText1":"%@ and %d others are typing","Peer.Activity.Chat.Multi.SendingPhoto1":"%@ and %d others are sending photos","Peer.Activity.Chat.Multi.RecordingVideo1":"%@ and %d others are recording video","Peer.Activity.Chat.Multi.SendingVideo1":"%@ and %d others are sending videos","Peer.Activity.Chat.Multi.RecordingAudio1":"%@ and %d others are recording voice","Peer.Activity.Chat.Multi.SendingFile1":"%@ and %d others are sending files","Peer.Activity.Chat.Multi.ChoosingSticker1":"%@ and %d others are choosing stickers","Peer.ServiceNotifications":"service notifications","Peer.RepliesNotifications":"Reply Notifications","Peer.Status.justNow":"last seen just now","Peer.Status.Today":"today","Peer.Status.Yesterday":"yesterday","Peer.Status.LastSeenAt":"last seen %@ at %@","Peer.Status.minAgo":{one_value:"last seen %d minute ago",other_value:"last seen %d minutes ago"},"Peer.Status.Member":{one_value:"%d member",other_value:"%d members"},"Peer.Status.Subscribers":{one_value:"%d subscriber",other_value:"%d subscribers"},"PeerInfo.Administrators":"Administrators","PeerInfo.DeleteChannel":"Delete Channel","PeerInfo.Discussion":"Discussion","PeerInfo.Discussion.Add":"Add","PeerInfo.SharedMedia":"Shared Media","PeerInfo.Subscribers":"Subscribers","PeerInfo.DeleteContact":"Delete Contact","PeerInfo.Action.VoiceChat":"Video Chat","PeerInfo.Action.LiveStream":"Live Stream","PeerInfo.Phone.AnonymousInfo":"This number is not tied to a SIM card and was acquired on [Fragment]().","PeerMedia.Members":"Members","PollResults.Title.Poll":"Poll Results","PollResults.Title.Quiz":"Quiz Results","PollResults.LoadMore":{other_value:"Show More (%d)"},"Preview.Dragging.AddItems":{one_value:"Add Item",other_value:"Add Items"},"PreviewSender.CaptionPlaceholder":"Add a caption...","PreviewSender.CompressFile":"Send compressed","PreviewSender.SendFile":{one_value:"Send File",other_value:"Send %d Files"},"PreviewSender.SendPhoto":{one_value:"Send Photo",other_value:"Send %d Photos"},"PreviewSender.SendVideo":{one_value:"Send Video",other_value:"Send %d Videos"},"PrivacyAndSecurity.Item.On":"On","PrivacyAndSecurity.Item.Off":"Off","PrivacyAndSecurity.SensitiveText":"Disable filtering","PrivacyAndSecurity.SensitiveDesc":"Display sensitive media in public channels on all your Telegram devices.","PrivacySettings.VoiceCalls":"Calls","PrivacySettings.Forwards":"Forwarded Messages","PrivacySettings.Groups":"Groups and Channels","PrivacySettingsController.AddUsers":"Add Users","PrivacySettingsController.GroupDescription":"You can restrict who can add you to groups and channels with granular precision.","PrivacySettingsController.Forwards.CustomHelp":"You can restrict who can add a link to your account when forwarding your messages.","PrivacySettingsController.P2p.Desc":"Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.","PrivacySettingsController.PhoneCallDescription":"You can restrict who can call you with granular precision.","PrivacySettingsController.ProfilePhoto.CustomHelp":"You can restrict who can see your profile photo with granular precision.","PrivacySettingsController.LastSeenDescription":"You won't see Last Seen and Online statuses for people with whom you don't share yours. Approximate last seen will be shown instead (recently, within a week, within a month).","PrivacySettingsController.PeerInfo":"You can add users or entire groups as exceptions that will override the settings above.","PrivacySettingsController.Everbody":"Everybody","PrivacySettingsController.MyContacts":"My Contacts","PrivacySettingsController.Nobody":"Nobody","PrivacySettingsController.NeverShare":"Never Share With","PrivacySettingsController.AlwaysShare":"Always Share With","PrivacySettingsController.NeverAllow":"Never Allow","PrivacySettingsController.AlwaysAllow":"Always Allow","PrivacySettingsController.UserCount":{one_value:"%d user",other_value:"%d users"},"RecentSessions.Error.FreshReset":"For security reasons, you can't terminate older sessions from a device that you've just connected. Please use an earlier connection or wait for a few hours.","RequestJoin.Button":"Request to Join","Stickers.SearchAdd":"Add","Stickers.SearchAdded":"Added","Stickers.SuggestStickers":"Suggest Stickers by Emoji","ShareModal.Search.Placeholder":"Share to...","ShareModal.Search.ForwardPlaceholder":"Forward to...","Telegram.GeneralSettingsViewController":"General Settings","Telegram.InstalledStickerPacksController":"Stickers","Telegram.NotificationSettingsViewController":"Notifications","Telegram.LanguageViewController":"Language","Text.CopyLabel_About":"Copy About","Text.CopyLabel_Bio":"Copy Bio","Text.CopyLabel_PhoneNumber":"Copy Phone Number","Text.CopyLabel_Username":"Copy Username","Text.CopyLabel_ShareLink":"Copy Share Link","GeneralSettings.BigEmoji":"Large Emoji","GeneralSettings.EmojiPrediction":"Suggest Emoji","GroupPermission.Delete":"Delete Exception","Search.Confirm.ClearHistory":"Are you sure you want to clear your search history?","SecureId.Identity.Placeholder.ExpiryDate":"Expiry Date","Separator.ShowMore":"show more","Separator.ShowLess":"show less","ScheduleController.at":"at","Schedule.SendToday":"Send today at %@","Schedule.SendDate":"Send on %@ at %@","Schedule.SendWhenOnline":"Send When Online","Sticker.Premium.Click.Info":"This pack contains premium stickers like this one. [View Pack]()","Stickers.Recent":"Recent","StickerSet.DontExist":"Sorry, this sticker set doesn't seem to exist.","Text.Context.Copy.Username":"Copy Username","Text.Context.Copy.Hashtag":"Copy Hashtag","Time.TomorrowAt":"tomorrow at %@","TwoStepAuth.SetPasswordHelp":"You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.","TwoStepAuth.GenericHelp":"You have enabled Two-Step verification.\nYou'll need the password you set up here to log in to your Telegram account.","TwoStepAuth.ChangePassword":"Change Password","TwoStepAuth.RemovePassword":"Turn Password Off","TwoStepAuth.SetupEmail":"Set Recovery Email","TwoStepAuth.ChangeEmail":"Change Recovery Email","TwoStepAuth.ConfirmEmailCodeDesc":"Please enter the code we've just emailed to %@.","TwoStepAuth.RecoveryTitle":"Email Code","TwoStepAuth.RecoveryCode":"Code","TwoStepAuth.RecoveryCodeInvalid":"Invalid code. Please try again.","TwoStepAuth.RecoveryCodeExpired":"Code Expired","TwoStepAuth.SetupHintTitle":"Password Hint","TwoStepAuth.SetupHintPlaceholder":"Hint","VoiceChat.Chat.StartNew":"Video chat ended. Start a new one?","VoiceChat.Chat.StartNew.OK":"Start","VoiceChat.Chat.Ended":"Video chat ended.","VoiceChat.Invite.InviteMembers":"Invite members","VoiceChat.Status.Connecting":"Connecting...","VoiceChat.Status.Members":{one_value:"%d participant",other_value:"%d participants"},"VoiceChat.Status.MutedForYou":"muted for you","VoiceChat.Status.Speaking":"speaking","VoiceChat.Status.Listening":"listening","VoiceChat.Status.WantsSpeak":"wants to speak","VoiceChat.Status.Muted":"muted","VoiceChat.Status.You":"This is you","VoiceChat.Video.Stream.Video":"video","VoiceChat.Video.Stream.Screencast":"screen","VoiceChat.Video.Stream.More":"more","VoiceChat.Leave":"Leave","VoiceChat.End.Title":"Leave video chat","VoiceChat.End.Text":"Are you sure you want to leave this video chat?","VoiceChat.End.Third":"End Video Chat","VoiceChat.End.OK":"Leave","VoiceChat.MutePeer":"Mute","VoiceChat.UnmutePeer":"Allow To Speak","VoiceChat.RemovePeer":"Remove","VoiceChat.OpenProfile":"Open Profile","VoiceChat.MuteForMe":"Mute For Me","VoiceChat.UnmuteForMe":"Unmute For Me","VoiceChat.RemovePeer.Confirm.Channel":"Do you want to remove %1$@ from the channel?","VoiceChat.RemovePeer.Confirm":"Are you sure you want to remove %1$@ from the group?","VoiceChat.RemovePeer.Confirm.OK":"Remove"}}}]); +//# sourceMappingURL=104.e24e7fdd92837aca2688.chunk.js.map \ No newline at end of file diff --git a/public/104.e24e7fdd92837aca2688.chunk.js.map b/public/104.e24e7fdd92837aca2688.chunk.js.map new file mode 100644 index 00000000..360b8b90 --- /dev/null +++ b/public/104.e24e7fdd92837aca2688.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"104.e24e7fdd92837aca2688.chunk.js","mappings":"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","sources":["webpack://tweb/./src/lang.ts"],"sourcesContent":["const lang = {\n 'Animations': 'Animations',\n 'AttachAlbum': 'Album',\n 'Appearance.Color.Hex': 'HEX',\n 'Appearance.Color.RGB': 'RGB',\n 'BlockModal.Search.Placeholder': 'Block user...',\n 'DarkMode': 'Dark Mode',\n 'FilterIncludeExcludeInfo': 'Choose chats and types of chats that will\\nappear and never appear in this folder.',\n 'FilterMenuDelete': 'Delete Folder',\n 'FilterHeaderEdit': 'Edit Folder',\n 'FilterAllGroups': 'All Groups',\n 'FilterAllContacts': 'All Contacts',\n 'FilterAllNonContacts': 'All Non-Contacts',\n 'FilterAllChannels': 'All Channels',\n 'FilterAllBots': 'All Bots',\n 'EditContact.OriginalName': 'original name',\n 'EditProfile.FirstNameLabel': 'Name',\n 'EditProfile.BioLabel': 'Bio (optional)',\n 'EditProfile.Username.Label': 'Username (optional)',\n 'EditProfile.Username.Available': 'Username is available',\n 'EditProfile.Username.Taken': 'Username is already taken',\n 'EditProfile.Username.Invalid': 'Username is invalid',\n 'ExceptionModal.Search.Placeholder': 'Add exception...',\n 'Chat.Menu.SelectMessages': 'Select Messages',\n 'Chat.Menu.ClearSelection': 'Clear Selection',\n 'Chat.Menu.Hint': 'To **edit** or **reply**, close this menu.\\nThen tap next to a message.',\n 'Chat.Input.UnpinAll': 'Unpin All Messages',\n 'Chat.Input.Attach.PhotoOrVideo': 'Photo or Video',\n 'Chat.Input.Attach.Document': 'Document',\n 'Chat.Subscribe': 'SUBSCRIBE',\n 'Chat.Selection.LimitToast': 'Max selection count reached.',\n 'Chat.Search.MessagesFound': {\n 'one_value': '%d message found',\n 'other_value': '%d messages found'\n },\n 'Chat.Search.NoMessagesFound': 'No messages found',\n 'Chat.Search.PrivateSearch': 'Private Search',\n 'Chat.Service.TopicEdited.Mixed': '%1$@ changed the topic name and icon to %2$@',\n 'Chat.Service.TopicEdited.You.Mixed': 'You changed the topic name and icon to %2$@',\n 'Chat.Service.TopicEdited.Mixed.IconRemoved': '%1$@ changed the topic name to \"%1$@\" and removed icon',\n 'Chat.Service.TopicEdited.You.Mixed.IconRemoved': 'You changed the topic name to \"%1$@\" and removed icon',\n 'ChatList.Main.EmptyPlaceholder.Title': 'Your chats will appear here',\n 'ChatList.Main.EmptyPlaceholder.Subtitle': 'You have %s on Telegram',\n 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts': 'Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts',\n // \"ChatList.Menu.Archived\": \"Archived\",\n 'ChatList.Menu.SwitchTo.Webogram': 'Switch to Old Version',\n 'ChatList.Menu.SwitchTo.Z': 'Switch to Z version',\n 'ChatMigration.From': 'Migrated from %s',\n 'ChatMigration.To': 'Migrated to %s',\n 'ConnectionStatus.ForceReconnect': 'force reconnect',\n 'ConnectionStatus.ReconnectIn': 'Reconnect in %ds, %s',\n 'ConnectionStatus.Reconnect': 'reconnect',\n 'ConnectionStatus.Reconnecting': 'Reconnecting...',\n 'ConnectionStatus.TimedOut': 'Request timed out, %s',\n 'ConnectionStatus.Waiting': 'Waiting for network...',\n 'Contacts.Count': {\n 'one_value': '%d contact',\n 'other_value': '%d contacts'\n },\n 'Deactivated.Title': 'Too many tabs...',\n 'Deactivated.Subtitle': 'Telegram supports only one active tab with the app.\\nClick anywhere to continue using this tab.',\n 'Deactivated.Version.Title': 'WebK has updated...',\n 'Deactivated.Version.Subtitle': 'Another tab is running a newer version of Telegram.\\nClick anywhere to reload this tab.',\n // \"Drafts\": {\n // \"one_value\": \"%d draft\",\n // \"other_value\": \"%d drafts\",\n // },\n 'General.Keyboard': 'Keyboard',\n 'General.SendShortcut.Enter': 'Send by Enter',\n 'General.SendShortcut.CtrlEnter': 'Send by %s + Enter',\n 'General.SendShortcut.NewLine.ShiftEnter': 'New line by Shift + Enter',\n 'General.SendShortcut.NewLine.Enter': 'New line by Enter',\n 'General.TimeFormat': 'Time Format',\n 'General.TimeFormat.h12': '12-hour',\n 'General.TimeFormat.h23': '24-hour',\n 'ChatBackground.UploadWallpaper': 'Upload Wallpaper',\n 'ChatBackground.Blur': 'Blur Wallpaper Image',\n 'Notifications.Sound': 'Notification Sound',\n 'NewPrivateChat': 'New Private Chat',\n 'NewPoll.OptionLabel': 'Option %d',\n 'Message.Context.Selection.Copy': 'Copy selected',\n 'Message.Context.Selection.Clear': 'Clear selection',\n 'Message.Context.Selection.Delete': 'Delete selected',\n 'Message.Context.Selection.Forward': 'Forward selected',\n 'Message.Context.Selection.SendNow': 'Send Now selected',\n 'Message.Unsupported.Desktop': '__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__',\n 'Message.Unsupported.Mobile': '__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__',\n 'Checkbox.Enabled': 'Enabled',\n 'Checkbox.Disabled': 'Disabled',\n 'Error.PreviewSender.CaptionTooLong': 'Caption is too long.',\n 'PreviewSender.GroupItems': 'Group items',\n 'PreviewSender.SendAlbum': {\n 'one_value': 'Send Album',\n 'other_value': 'Send %d Albums'\n },\n 'Presence.YourChat': 'chat with yourself',\n 'Privacy.Devices': {\n 'one_value': '%1$d device',\n 'other_value': '%1$d devices'\n },\n 'Privacy.Websites': {\n 'one_value': '%1$d website',\n 'other_value': '%1$d websites'\n },\n 'Privacy.SensitiveContent': 'Sensitive Content',\n 'PrivacyModal.Search.Placeholder': 'Add Users or Groups...',\n 'Permissions.NoExceptions': 'No exceptions',\n 'Permissions.ExceptionsCount': {\n 'one_value': '%d exception',\n 'other_value': '%d exceptions'\n },\n 'PWA.Install': 'Install App',\n 'Link.Available': 'Link is available',\n 'Link.Taken': 'Link is already taken',\n 'Link.Invalid': 'Link is invalid',\n 'StickersTab.SearchPlaceholder': 'Search Stickers',\n 'ForwardedFrom': 'Forwarded from %s',\n 'Popup.Avatar.Title': 'Drag to Reposition',\n 'Popup.Unpin.AllTitle': 'Unpin all messages',\n 'Popup.Unpin.HideTitle': 'Hide pinned messages',\n 'Popup.Unpin.HideDescription': 'Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.',\n 'Popup.Unpin.Hide': 'Hide',\n 'Popup.Attach.GroupMedia': 'Group all media',\n 'Popup.Attach.UngroupMedia': 'Ungroup all media',\n 'Popup.Attach.AsMedia': 'Send as media',\n 'Popup.Attach.EnableSpoilers': 'Hide all with spoilers',\n 'Popup.Attach.RemoveSpoilers': 'Remove all spoilers',\n 'TwoStepAuth.EmailCodeChangeEmail': 'Change Email',\n 'MarkupTooltip.LinkPlaceholder': 'Enter URL...',\n 'MediaViewer.Context.Download': 'Download',\n 'Profile': 'Profile',\n 'Saved': 'Saved',\n 'Deleted': 'Deleted',\n 'ReportBug': 'Report Bug',\n 'Notifications.Count': {\n 'one_value': '%d notification',\n 'other_value': '%d notifications'\n },\n 'Notifications.Forwarded': {\n 'one_value': 'Forwarded %d message',\n 'other_value': 'Forwarded %d messages'\n },\n 'Notifications.New': 'New notification',\n 'PushNotification.Action.Mute1d': 'Mute background alerts for 1 day',\n 'PushNotification.Action.Settings': 'Background alerts settings',\n 'PushNotification.Action.Mute1d.Mobile': 'Mute for 24H',\n 'PushNotification.Action.Settings.Mobile': 'Alerts settings',\n 'PushNotification.Message.NoPreview': 'You have a new message',\n 'LogOut.Description': 'Are you sure you want to log out?\\n\\nNote that you can seamlessly use Telegram on all your devices at once.',\n // \"PushNotification.Action.Mute1d.Success\": \"Notification settings were successfully saved.\",\n // it is from iOS\n 'VoiceChat.DiscussionGroup': 'discussion group',\n 'PaymentInfo.CVV': 'CVV Code',\n 'PaymentInfo.Card.Title': 'Enter your card information',\n 'PaymentInfo.Billing.Title': 'Enter your billing address',\n 'PaymentInfo.Done': 'PROCEED TO CHECKOUT',\n 'PaymentCard.Error.Invalid': 'Invalid card number',\n 'PaymentCard.Error.Incomplete': 'Incomplete card number',\n 'LimitReached.Ok': 'OK, GOT IT',\n 'Username.Purchase': '**This username is already taken.** However, it is currently available for purchase. [Learn more…]()',\n 'Video.Unsupported.Desktop': '__Unfortunately, this video can\\'t be played on Telegram Web. Try opening it with our [desktop app](https://getdesktop.telegram.org/) instead.__',\n 'Video.Unsupported.Mobile': '__Unfortunately, this video can\\'t be played on Telegram Web. Try opening it with our [mobile app](https://telegram.org/dl/) instead.__',\n\n // * android\n 'AccDescrEditing': 'Editing',\n 'ActionCreateChannel': 'Channel created',\n 'ActionCreateGroup': 'un1 created the group',\n 'ActionChangedTitle': 'un1 changed the group name to un2',\n 'ActionRemovedPhoto': 'un1 removed the group photo',\n 'ActionChangedPhoto': 'un1 changed the group photo',\n 'ActionChangedVideo': 'un1 changed the group video',\n 'ActionAddUser': 'un1 added un2',\n 'ActionAddUserSelf': 'un1 returned to the group',\n 'ActionAddUserSelfYou': 'You returned to the group',\n 'ActionAddUserSelfMega': 'un1 joined the group',\n 'ActionLeftUser': 'un1 left the group',\n 'ActionKickUser': 'un1 removed un2',\n 'ActionInviteUser': 'un1 joined the group via invite link',\n 'ActionPinnedNoText': 'un1 pinned a message',\n 'ActionMigrateFromGroup': 'This group was upgraded to a supergroup',\n 'ActionYouScored': 'You scored %1$s',\n 'ActionUserScored': 'un1 scored %1$s',\n 'ActionYouScoredInGame': 'You scored %1$s in un2',\n 'ActionUserScoredInGame': 'un1 scored %1$s in un2',\n 'AndOther': {\n 'one_value': 'and %1$d other',\n 'other_value': 'and %1$d others'\n },\n 'AttachPhoto': 'Photo',\n 'AttachVideo': 'Video',\n 'AttachGif': 'GIF',\n 'AttachLocation': 'Location',\n 'AttachLiveLocation': 'Live Location',\n 'AttachContact': 'Contact',\n // \"AttachDocument\": \"File\",\n 'AttachSticker': 'Sticker',\n 'AttachAudio': 'Voice message',\n 'AttachRound': 'Video message',\n 'AttachGame': 'Game',\n 'Bot': 'bot',\n // \"ChannelJoined\": \"You joined this channel\",\n 'ChannelMegaJoined': 'You joined this group',\n 'EnterChannelName': 'Channel name',\n 'DescriptionOptionalPlaceholder': 'Description (optional)',\n 'DescriptionPlaceholder': 'Description',\n 'DiscussionStarted': 'Discussion started',\n 'Draft': 'Draft',\n 'FilterAlwaysShow': 'Include Chats',\n 'FilterNeverShow': 'Exclude Chats',\n 'FilterInclude': 'Included Chats',\n 'FilterExclude': 'Excluded Chats',\n 'FilterChatTypes': 'Chat types',\n 'FilterChats': 'Chats',\n 'FilterNew': 'New Folder',\n 'Filters': 'Folders',\n 'FilterRecommended': 'Recommended Folders',\n 'FilterShowMoreChats': {\n 'one_value': 'Show %1$d More Chat',\n 'other_value': 'Show %1$d More Chats'\n },\n 'ForwardedMessageCount': {\n 'one_value': 'Forwarded message',\n 'other_value': '%1$d forwarded messages'\n },\n 'FromYou': 'You',\n 'Add': 'Add',\n 'Chats': {\n 'one_value': '%1$d chat',\n 'other_value': '%1$d chats'\n },\n 'Channels': {\n 'one_value': '%1$d channel',\n 'other_value': '%1$d channels'\n },\n 'Comments': {\n 'one_value': '%1$d Comment',\n 'other_value': '%1$d Comments'\n },\n 'Groups': {\n 'one_value': '%1$d group',\n 'other_value': '%1$d groups'\n },\n 'Users': {\n 'one_value': '%1$d user',\n 'other_value': '%1$d users'\n },\n 'Members': {\n 'one_value': '%1$d member',\n 'other_value': '%1$d members'\n },\n 'messages': {\n 'one_value': '%1$d message',\n 'other_value': '%1$d messages'\n },\n 'UsernameHelpLink': 'This link opens a chat with you:\\n%1$s',\n 'NewChannel': 'New Channel',\n 'NewGroup': 'New Group',\n 'Contacts': 'Contacts',\n 'SavedMessages': 'Saved Messages',\n 'Settings': 'Settings',\n 'SettingsHelp': 'Help',\n 'General': 'General',\n 'TextSize': 'Message Text Size',\n 'ChatBackground': 'Chat Background',\n 'EnableAnimations': 'Enable Animations',\n 'AutoDownloadMedia': 'Auto-Download Media',\n 'AutodownloadContacts': 'Contacts',\n 'AutodownloadPrivateChats': 'Private Chats',\n 'AutodownloadGroupChats': 'Group Chats',\n 'AutodownloadChannels': 'Channels',\n 'AutoplayGIF': 'GIFs',\n 'AutoplayVideo': 'Videos',\n 'NotificationsForGroups': 'Notifications for groups',\n 'NotificationsForPrivateChats': 'Notifications for private chats',\n 'NotificationsForChannels': 'Notifications for channels',\n 'NotificationsPrivateChats': 'Private Chats',\n 'NotificationsGroups': 'Groups',\n 'NotificationsChannels': 'Channels',\n 'NotificationsOther': 'Other',\n 'MarkAsUnread': 'Mark as unread',\n 'MarkAsRead': 'Mark as read',\n 'ContactJoined': 'Contact joined Telegram',\n 'Loading': 'Loading...',\n 'Unblock': 'Unblock',\n 'BlockedUsers': 'Blocked Users',\n 'BlockedUsersInfo': 'Blocked users will not be able to contact you and will not see your Last Seen time.',\n 'BlockedEmpty': 'None',\n 'TwoStepVerification': 'Two-Step Verification',\n 'TwoStepVerificationTitle': 'Two-Step Verification',\n 'PinnedMessage': 'Pinned Message',\n 'PinnedMessagesCount': {\n 'one_value': 'Pinned Message',\n 'other_value': '%1$d Pinned Messages'\n },\n // \"PreviousPinnedMessage\": \"Previous Message\",\n 'PrivacyExceptions': 'Exceptions',\n 'PrivacyLastSeen': 'Last Seen & Online',\n 'PrivacySettings': 'Privacy and Security',\n 'PrivacyTitle': 'Privacy',\n 'PrivacyPhone': 'Phone Number',\n 'PrivacyPhoneTitle': 'Who can see my phone number?',\n 'PrivacyPhoneTitle2': 'Who can find me by my number?',\n 'PrivacyPhoneInfo': 'Users who have your number saved in their contacts will also see it on Telegram.',\n 'PrivacyPhoneInfo3': 'Users who add your number to their contacts will see it on Telegram only if they are your contacts.',\n 'PrivacyProfilePhoto': 'Profile Photos',\n 'PrivacyProfilePhotoTitle': 'Who can see my profile photos & videos?',\n 'PrivacyP2PHeader': 'Peer-to-Peer',\n 'PrivacyForwardsTitle': 'Who can add a link to my account when forwarding my messages?',\n 'Reminders': 'Reminders',\n 'ScheduledMessages': 'Scheduled Messages',\n 'LastSeenTitle': 'Who can see your Last Seen time?',\n 'SessionsTitle': 'Active Sessions',\n 'CurrentSession': 'This device',\n 'TerminateAllSessions': 'Terminate All Other Sessions',\n 'TerminateSessionText': 'Are you sure you want to terminate this session?',\n 'OtherSessions': 'Active sessions',\n 'AreYouSureDeleteSingleMessage': 'Are you sure you want to delete this message?',\n 'AreYouSureDeleteFewMessages': 'Are you sure you want to delete these messages?',\n 'AreYouSureDeleteSingleMessageMega': 'Are you sure you want to delete this message for everyone?',\n 'AreYouSureDeleteFewMessagesMega': 'Are you sure you want to delete these messages for everyone?',\n 'AreYouSureDeleteAndExitName': 'Are you sure you want to delete and leave the group **%1$s**?',\n 'AreYouSureDeleteThisChatSavedMessages': 'Are you sure you want to delete **Saved Messages**?',\n 'AreYouSureDeleteThisChatWithUser': 'Are you sure you want to delete the chat with **%1$s**?',\n 'AreYouSureSessionTitle': 'Terminate session',\n 'AreYouSureSessionsTitle': 'Terminate sessions',\n 'AreYouSureSessions': 'Are you sure you want to terminate all other sessions?',\n 'Terminate': 'Terminate',\n 'WhoCanCallMe': 'Who can call me?',\n 'WhoCanAddMe': 'Who can add me to group chats?',\n 'ArchivedChats': 'Archived Chats',\n 'Cancel': 'Cancel',\n 'HistoryCleared': 'History was cleared',\n 'Archive': 'Archive',\n 'Unarchive': 'Unarchive',\n 'Delete': 'Delete',\n 'Reply': 'Reply',\n 'Edit': 'Edit',\n 'Forward': 'Forward',\n 'CopyLink': 'Copy Link',\n 'Copy': 'Copy',\n 'Search': 'Search',\n 'LinkCopied': 'Link copied to clipboard',\n 'LinkCopiedPrivateInfo': 'This link will only work for members of this chat.',\n 'GroupAddMembers': 'Add Members',\n 'SendMessageTo': 'Add people...',\n // \"SelectChat\": \"Select Chat\",\n 'JumpToDate': 'Jump to Date',\n 'Caption': 'Caption',\n 'Message': 'Message',\n 'Poll': 'Poll',\n 'SharedFilesTab2': 'Files',\n 'SharedMediaTab2': 'Media',\n // \"SharedMediaTabFull2\": \"Shared Media\",\n // \"SharedGroupsTab2\": \"Groups\",\n 'SharedLinksTab2': 'Links',\n 'SharedMusicTab2': 'Music',\n 'SharedVoiceTab2': 'Voice',\n // \"SharedGIFsTab2\": \"GIFs\",\n 'NewPoll': 'New Poll',\n 'PollOptions': 'Poll options',\n 'AskAQuestion': 'Ask a Question',\n 'AddAnExplanationInfo': 'Users will see this text after choosing the wrong answer, good for educational purposes.',\n 'AccDescrQuizExplanation': 'Explanation',\n 'PhoneCopied': 'Phone copied to clipboard',\n 'UsernameCopied': 'Username copied to clipboard.',\n // \"HashtagCopied\": \"Hashtag copied to clipboard.\",\n 'BioCopied': 'Bio copied to clipboard.',\n 'UserBio': 'Bio',\n 'Username': 'Username',\n 'UsernameAlso': 'also %1$s',\n 'UsernameHelp': 'You can choose a username on **Telegram**. If you do, people will be able to find you by this username and contact you without needing your phone number.\\n\\nYou can use **a–z**, **0–9** and underscores. Minimum length is **5** characters.',\n 'Phone': 'Phone',\n 'Notifications': 'Notifications',\n 'AreYouSureDeleteContact': 'Are you sure you want to delete this contact?',\n 'AreYouSureDeleteAndExit': 'Are you sure you want to delete and leave the group?',\n 'AreYouSureDeleteAndExitChannel': 'Do you want to delete and leave the channel?',\n 'DeleteContact': 'Delete contact',\n 'GroupType': 'Group Type',\n 'ChannelType': 'Channel Type',\n 'TypePrivate': 'Private',\n 'TypePublic': 'Public',\n 'TypePrivateGroup': 'Private',\n 'TypePublicGroup': 'Public',\n 'GroupMembers': 'Members',\n 'DeleteMega': 'Delete Group',\n 'DeleteMegaMenu': 'Delete group',\n 'DeleteAndExitButton': 'Delete and Leave Group',\n 'ChannelDelete': 'Delete Channel',\n 'ChannelDeleteMenu': 'Delete channel',\n 'ChannelPermissions': 'Permissions',\n 'ChannelPermissionsHeader': 'What can members of this group do?',\n 'ChannelAddException': 'Add Exception',\n 'ChannelBlockedUsers': 'Removed users',\n 'NoBlockedUsers': 'No removed users',\n 'UserRestrictions': 'User Permissions',\n 'UserRestrictionsDisabled': 'This option is disabled for all members in Group Permissions',\n 'UserRestrictionsCanDo': 'What can this user do?',\n 'UserRestrictionsRead': 'Read Messages',\n 'UserRestrictionsSend': 'Send Messages',\n 'UserRestrictionsSendMedia': 'Send Media',\n 'UserRestrictionsSendPolls': 'Send Polls',\n 'UserRestrictionsSendStickers': 'Send Stickers and GIFs',\n 'UserRestrictionsEmbedLinks': 'Embed Links',\n 'UserRestrictionsChangeInfo': 'Change Chat Info',\n 'UserRestrictionsPinMessages': 'Pin Messages',\n 'UserRestrictionsInviteUsers': 'Add Users',\n // \"UserRestrictionsNoRead\": \"can't read\",\n 'UserRestrictionsNoSend': 'can\\'t send messages',\n 'UserRestrictionsNoSendMedia': 'no media',\n 'UserRestrictionsNoSendPolls': 'no polls',\n 'UserRestrictionsNoSendStickers': 'no stickers & GIFs',\n 'UserRestrictionsNoEmbedLinks': 'no embed links',\n 'UserRestrictionsNoChangeInfo': 'can\\'t change Info',\n 'UserRestrictionsNoPinMessages': 'no pins',\n 'UserRestrictionsNoInviteUsers': 'can\\'t add users',\n 'UserRestrictionsBlock': 'Ban and remove from group',\n 'ChannelPublic': 'Public Channel',\n 'MegaPublic': 'Public Group',\n // \"MegaLocation\": \"Location-based Group\",\n 'ChannelPublicInfo': 'Public channels can be found in search, anyone can join them.',\n 'MegaPublicInfo': 'Public groups can be found in search, chat history is available to everyone and anyone can join.',\n 'ChannelPrivate': 'Private Channel',\n 'MegaPrivate': 'Private Group',\n 'ChannelPrivateInfo': 'Private channels can only be joined via an invite link.',\n 'MegaPrivateInfo': 'Private groups can only be joined if you were invited or have an invite link.',\n 'ChannelPrivateLinkHelp': 'People can join your channel by following this link. You can revoke the link any time.',\n 'MegaPrivateLinkHelp': 'People can join your group by following this link. You can revoke the link any time.',\n 'RevokeButton': 'Revoke',\n 'RevokeLink': 'Revoke Link',\n 'RevokeAlert': 'Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.',\n 'SetUrlPlaceholder': 'Link',\n 'Subscribers': {\n 'one_value': '%1$d subscriber',\n 'other_value': '%1$d subscribers'\n },\n 'SearchGifsTitle': 'Search GIFs',\n 'PinMessageAlert': 'Pin this message in the group?',\n 'PinMessageAlertTitle': 'Pin message',\n 'PinMessageAlertChannel': 'Do you want to pin this message in this channel?',\n 'PinMessageAlertChat': 'Do you want to pin this message at the top of the chat?',\n 'UnpinMessageAlertTitle': 'Unpin message',\n 'UnpinMessageAlert': 'Do you want to unpin this message?',\n 'PinNotify': 'Notify all members',\n 'PinMessage': 'Pin',\n 'UnpinMessage': 'Unpin',\n 'PinAlsoFor': 'Also pin for %1$s',\n 'DeleteMessagesTitle': 'Delete %1$s',\n 'DeleteSingleMessagesTitle': 'Delete message',\n 'DeleteMessagesOption': 'Unsend My Messages',\n 'DeleteMessagesOptionAlso': 'Also delete for %1$s',\n 'DeleteForAll': 'Delete for all members',\n 'DeleteMessagesTextGroup': 'You can also delete the %1$s you sent from the inboxes of other group members by checking \"Unsend my messages\".',\n 'LeaveChannel': 'Leave Channel',\n 'LeaveChannelMenu': 'Leave channel',\n 'ChannelLeaveAlertWithName': 'Are you sure you want to leave **%1$s**?',\n 'LeaveMegaMenu': 'Leave group',\n 'DeleteChatUser': 'Delete chat',\n 'PleaseEnterCurrentPassword': 'Enter your password',\n 'PleaseEnterFirstPassword': 'Enter a password',\n 'PleaseReEnterPassword': 'Re-enter your password',\n 'Continue': 'Continue',\n 'YourEmailSkip': 'Skip',\n 'YourEmailSkipWarning': 'Warning',\n 'YourEmailSkipWarningText': 'No, seriously.\\n\\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.',\n 'TurnPasswordOffQuestionTitle': 'Disable password',\n 'TurnPasswordOffQuestion': 'Are you sure you want to disable your password?',\n 'Disable': 'Disable',\n 'TwoStepVerificationSetPassword': 'Set Password',\n 'TwoStepVerificationPasswordSet': 'Password Set!',\n 'TwoStepVerificationPasswordSetInfo': 'This password will be required when you log in on a new device in addition to the code you get in the SMS.',\n 'TwoStepVerificationPasswordReturnSettings': 'Return to Settings',\n 'RecoveryEmail': 'Recovery email',\n 'RecoveryEmailTitle': 'Recovery Email',\n 'ResendCode': 'Resend code',\n 'PasswordAsHintError': 'Hint must be different from your password',\n 'AddStickersCount': 'ADD %1$s',\n 'RemoveStickersCount': 'REMOVE %1$s',\n 'Stickers': {\n 'one_value': '%1$d sticker',\n 'other_value': '%1$d stickers'\n },\n 'HidAccount': 'The account was hidden by the user',\n 'TelegramFeatures': 'Telegram Features',\n 'SetColor': 'Set a color',\n 'Open': 'Open',\n 'OpenUrlTitle': 'Open Link',\n 'OpenUrlAlert2': 'Do you want to open %1$s?',\n 'FilterNoChatsToDisplay': 'Folder is empty',\n 'FilterNoChatsToDisplayInfo': 'No chats currently belong to this folder.',\n 'SupportStatus': 'support',\n 'Lately': 'last seen recently',\n 'WithinAWeek': 'last seen within a week',\n 'WithinAMonth': 'last seen within a month',\n 'ALongTimeAgo': 'last seen a long time ago',\n 'Online': 'online',\n 'MessageScheduleSend': 'Send Now',\n 'MessageScheduleEditTime': 'Reschedule',\n 'YouLeft': 'You left this group',\n 'Recent': 'Recent',\n 'Of': '%1$d of %2$d',\n 'NoResult': 'No results',\n 'Updating': 'Updating...',\n 'Emoji': 'Emoji',\n 'AddContactTitle': 'Add Contact',\n 'HiddenName': 'Deleted Account',\n 'Seconds': {\n 'one_value': '%1$d second',\n 'other_value': '%1$d seconds'\n },\n 'Minutes': {\n 'one_value': '%1$d minute',\n 'other_value': '%1$d minutes'\n },\n 'Hours': {\n 'one_value': '%1$d hour',\n 'other_value': '%1$d hours'\n },\n 'Days': {\n 'one_value': '%1$d day',\n 'other_value': '%1$d days'\n },\n 'Weeks': {\n 'one_value': '%1$d week',\n 'other_value': '%1$d weeks'\n },\n 'Months': {\n 'one_value': '%1$d month',\n 'other_value': '%1$d months'\n },\n 'Years': {\n 'one_value': '%1$d year',\n 'other_value': '%1$d years'\n },\n 'TodayAtFormattedWithToday': 'today at %1$s',\n 'formatDateAtTime': '%1$s at %2$s',\n 'JoinByPeekChannelTitle': 'Join Channel',\n 'JoinByPeekGroupTitle': 'Join Group',\n 'YouWereKicked': 'you were removed',\n 'ViaBot': 'via',\n 'InviteExpired': 'This invite link has expired.',\n 'NoUsernameFound': 'There is no Telegram account with this username.',\n 'PrivacyDeleteCloudDrafts': 'Delete All Cloud Drafts',\n 'AreYouSureClearDraftsTitle': 'Delete cloud drafts',\n 'AreYouSureClearDrafts': 'Are you sure you want to delete all cloud drafts?',\n 'BotInfoTitle': 'What can this bot do?',\n 'ChatYourSelf': 'forward here to save',\n 'GroupEmptyTitle1': 'You have created a **group**.',\n 'GroupEmptyTitle2': 'Groups can have:',\n 'GroupDescription1': 'Up to 200,000 members',\n 'GroupDescription2': 'Persistent chat history',\n 'GroupDescription3': 'Public links such as t.me/title',\n 'GroupDescription4': 'Admins with different rights',\n 'ChatYourSelfDescription1': 'Forward messages here to save them',\n 'ChatYourSelfDescription2': 'Send media and files to store them',\n 'ChatYourSelfDescription3': 'Access this chat from any device',\n 'ChatYourSelfDescription4': 'Use search to quickly find things',\n 'ChatYourSelfTitle': 'Your cloud storage',\n 'ActionYouCreateGroup': 'You created the group',\n 'NoMessages': 'No messages here yet...',\n 'NoScheduledMessages': 'No scheduled messages here yet...',\n 'NoMessagesGreetingsDescription': 'Send a message or tap the greeting below.',\n 'InviteToGroupError': 'Sorry, you can\\'t add this user to groups because of user\\'s privacy settings.',\n 'InviteToChannelError': 'Sorry, you can\\'t add this user to channels because of user\\'s privacy settings.',\n 'AddMembersAlertTitle': 'Add %1$s',\n 'AddOneMemberAlertTitle': 'Add member',\n 'AddMembersAlertNamesText': 'Are you sure you want to add %1$s to **%2$s**?',\n 'AddMembersAlertCountText': 'Are you sure you want to add %1$s to **%2$s**?',\n 'AddMembersForwardMessages': 'Show the last 100 messages to the new members',\n 'AddOneMemberForwardMessages': 'Show the last 100 messages to **%1$s**',\n 'PinToTopLimitReached2': 'Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.',\n 'FiltersSetupPinAlert': 'Set Up Folders',\n 'AppName': 'Telegram',\n 'OK': 'OK',\n 'PinFolderLimitReached': 'Sorry, you can\\'t pin any more chats to the top.',\n 'Send': 'Send',\n 'ChannelJoin': 'JOIN',\n 'Yesterday': 'yesterday',\n 'LeaveAComment': 'Leave a comment',\n 'ViewInChat': 'View in chat',\n 'LinkNotFound': 'Unfortunately, you can\\'t access this message. You are not a member of the chat where it was posted.',\n 'Create': 'Create',\n 'ViewDiscussion': 'View discussion',\n 'MessageScheduledUntilOnline': 'Scheduled until online',\n 'ReportChat': 'Report',\n 'ReportChatSpam': 'Spam',\n // \"ReportChatFakeAccount\": \"Fake Account\",\n 'ReportChatViolence': 'Violence',\n 'ReportChatPornography': 'Pornography',\n 'ReportChatChild': 'Child Abuse',\n 'ReportChatOther': 'Other',\n 'ReportChatDescription': 'Description',\n 'ReportInfo': 'Please enter any additional details relevant to your report.',\n 'ReportSentInfo': 'Telegram moderators will review your report.\\nThank you for your cooperation!',\n 'ReportHint': 'Additional details...',\n 'ChatHistory': 'Chat history for new members',\n 'ShareContact': 'Share contact',\n 'SendMessageTitle': 'Send message',\n 'SendContactToGroupText': 'Do you want to send this contact to **%1$s**?',\n 'ChannelBroadcast': 'Broadcast',\n 'ChannelSilentBroadcast': 'Silent Broadcast',\n 'Comment': 'Comment',\n 'SendAnonymously': 'Send anonymously',\n 'DiscardVoiceMessageTitle': 'Discard Voice Message',\n 'DiscardVoiceMessageDescription': 'Are you sure you want to stop recording and discard your voice message?',\n 'DiscardVoiceMessageAction': 'Discard',\n 'AddContact': 'Add to contacts',\n 'BlockUser': 'Block user',\n 'MobileHidden': 'Mobile hidden',\n 'MobileHiddenExceptionInfo': 'Phone number will be visible once %1$s adds you as a contact.',\n 'FirstName': 'First name (required)',\n 'LastName': 'Last name (optional)',\n 'AreYouSureBlockContact2': 'Are you sure you want to block **%1$s**?',\n 'UserBlocked': 'User blocked',\n 'UserUnblocked': 'User unblocked',\n 'AudioUnknownArtist': 'Unknown artist',\n 'AudioUnknownTitle': 'Unknown title',\n 'LogOut': 'Log out',\n 'OnlineCount': {\n 'one_value': '%1$d online',\n 'other_value': '%1$d online'\n },\n 'EditedMessage': 'edited',\n 'GlobalSearch': 'Global search',\n 'SearchMessages': 'Messages',\n 'SearchAllChatsShort': 'Chats',\n 'ClearButton': 'Clear',\n 'FilterAllChats': 'All Chats',\n 'FilterAllChatsShort': 'All',\n 'Call': 'Call',\n 'VideoCall': 'Video Call',\n 'CallMessageOutgoing': 'Outgoing Call',\n 'CallMessageIncoming': 'Incoming Call',\n 'CallMessageVideoOutgoing': 'Outgoing Video Call',\n 'CallMessageVideoIncoming': 'Incoming Video Call',\n 'VoipExchangingKeys': 'Exchanging encryption keys',\n 'VoipUnmute': 'Unmute',\n 'SavingContentTitle': 'Saving content',\n 'RestrictSavingContent': 'Restrict saving content',\n 'RestrictSavingContentInfoGroup': 'Members won\\'t be able to copy, save and forward content from this group.',\n 'RestrictSavingContentInfoChannel': 'Subscribers won\\'t be able to copy, save and forward content from this channel.',\n 'ClearOtherSessionsHelp': 'Logs out all devices except for this one.',\n 'SessionsListInfo': 'The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.',\n 'SponsoredMessage': 'sponsored',\n 'OpenChannelPost': 'VIEW POST',\n 'FilterNameHint': 'Folder name',\n 'BotStart': 'START',\n 'BotUnblock': 'RESTART',\n 'BotStop': 'Stop bot',\n 'BotRestart': 'Restart bot',\n 'ShareYouPhoneNumberTitle': 'Share your phone number?',\n 'AreYouSureShareMyContactInfoBot': 'The bot will know your phone number. This can be useful for integration with other services.',\n 'DistanceUnitsTitle': 'Distance units',\n 'DistanceUnitsKilometers': 'Kilometers',\n 'DistanceUnitsMiles': 'Miles',\n 'PeopleNearby': 'People Nearby',\n 'MakeMyselfVisible': 'Make Myself Visible',\n 'MakeMyselfVisibleTitle': 'Show Your Profile?',\n 'MakeMyselfVisibleInfo': 'Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\\n\\nYour phone number will remain hidden.',\n 'StopShowingMe': 'Stop Showing Me',\n 'PeopleNearbyInfo2': 'Exchange contact info with people nearby and find new friends.',\n 'NearbyCreateGroup': 'Create a Local group',\n 'AwayTo': '%1$s away',\n 'MessagePreview': 'Message Preview',\n 'KMetersAway2': '%1$s km away',\n 'MetersAway2': '%1$s m away',\n 'MilesAway': '%1$s mi away',\n 'FootsAway': '%1$s ft away',\n 'PeopleNearbyHeader': 'People nearby',\n 'ChatsNearbyHeader': 'Groups nearby',\n 'ChatLocation': 'Location',\n 'RequestToJoinGroupDescription': 'This group accepts new members only after they are approved by its admins.',\n 'RequestToJoinChannelDescription': 'This channel accepts new subscribers only after they are approved by its admins.',\n 'RequestToJoinSent': 'Join request sent',\n 'RequestToJoinGroupApproved': 'Your request to join the group was approved',\n 'RequestToJoinChannelApproved': 'Your request to join the channel was approved',\n 'Update': 'UPDATE',\n 'Reactions': 'Reactions',\n 'DoubleTapSetting': 'Quick Reaction',\n 'EnableReactions': 'Enable Reactions',\n 'EnableReactionsChannelInfo': 'Allow subscribers to react to channel posts.',\n 'EnableReactionsGroupInfo': 'Allow members to react to group messages.',\n 'AvailableReactions': 'Available reactions',\n 'NobodyViewed': 'Nobody viewed',\n 'MessageSeen': {\n 'one_value': 'Seen',\n 'other_value': '%1$d Seen'\n },\n // \"Close\": \"Close\",\n 'DataSettings': 'Data and Storage',\n 'GroupsAndChannelsHelp': 'Change who can add you to groups and channels.',\n 'SessionsInfo': 'Control your sessions on other devices.',\n 'StickersBotInfo': 'Artists are welcome to add their own sticker sets using our @stickers bot.',\n 'AutomaticMediaDownload': 'Automatic media download',\n 'AutoDownloadPhotos': 'Photos',\n 'AutoDownloadVideos': 'Videos',\n 'AutoDownloadFiles': 'Files',\n 'AutoDownloadOnAllChats': 'On in all chats',\n 'AutoDownloadUpToOnAllChats': 'Up to %1$s in all chats',\n 'AutoDownloadOff': 'Off',\n 'AutoDownloadOnUpToFor': 'Up to %1$s for %2$s',\n 'AutoDownloadOnFor': 'On for %1$s',\n 'AutoDownloadContacts': 'Contacts',\n 'AutoDownloadPm': 'PM',\n 'AutoDownloadGroups': 'Groups',\n 'AutoDownloadChannels': 'Channels',\n 'AutoDownloadAudioInfo': 'Voice messages are tiny, so they\\'re always downloaded automatically.',\n 'AutoplayMedia': 'Auto-play media',\n 'AutoDownloadPhotosTitle': 'Auto-download photos',\n 'AutoDownloadVideosTitle': 'Auto-download videos and GIFs',\n 'AutoDownloadFilesTitle': 'Auto-download files and music',\n 'AutoDownloadMaxFileSize': 'Maximum file size',\n 'AutodownloadSizeLimitUpTo': 'up to %1$s',\n 'ResetAutomaticMediaDownload': 'Reset Auto-Download Settings',\n 'ResetAutomaticMediaDownloadAlertTitle': 'Reset settings',\n 'ResetAutomaticMediaDownloadAlert': 'Are you sure you want to reset auto-download settings?',\n 'Reset': 'Reset',\n 'SendMessageAsTitle': 'Send message as...',\n 'Devices': 'Devices',\n 'LanguageName': 'English',\n 'EditCantEditPermissionsPublic': 'This permission is not available in public groups.',\n 'VoipUserMicrophoneIsOff': '%s\\'s microphone is off',\n 'VoipUserCameraIsOff': '%s\\'s camera is off',\n 'PrivacyPhoneInfo4': 'This public link opens a chat with you:',\n 'ReportChatIllegalDrugs': 'Illegal Drugs',\n 'ReportChatPersonalDetails': 'Personal Details',\n 'VoipPeerIncompatible': '**%1$s**\\'s app is using an incompatible protocol. They need to update their app before you can call them.',\n 'TelegramFeaturesUrl': 'https://t.me/TelegramTips',\n 'ScamMessage': 'SCAM',\n 'FakeMessage': 'FAKE',\n 'TextCopied': 'Text copied to clipboard',\n 'PaymentInvoice': 'INVOICE',\n 'PaymentTestInvoice': 'TEST INVOICE',\n 'PaymentReceipt': 'Receipt',\n 'PaymentCheckout': 'Checkout',\n 'PaymentTransactionTotal': 'Total',\n 'PaymentTip': 'Tip',\n 'PaymentTipOptional': 'Tip (Optional)',\n 'PaymentCheckoutPay': 'PAY %1$s',\n 'PaymentCheckoutMethod': 'Payment method',\n 'PaymentCheckoutProvider': 'Payment provider',\n 'PaymentCardNumber': 'Card Number',\n 'PaymentCardSavePaymentInformation': 'Save Payment Information',\n 'PaymentCardInfo': 'Payment info',\n 'PaymentCardSavePaymentInformationInfoLine1': 'You can save your payment info for future use. It will be stored directly with the payment provider. Telegram has no access to your credit card data.',\n 'Done': 'Done',\n 'PaymentShippingMethod': 'Shipping methods',\n 'PaymentNoShippingMethod': 'Sorry, it is not possible to deliver to your address.',\n 'PaymentShippingInfo': 'Shipping Information',\n 'PaymentShippingAddress': 'Shipping address',\n 'PaymentShippingAddress1Placeholder': 'Address 1 (Street)',\n 'PaymentShippingAddress2Placeholder': 'Address 2 (Street)',\n 'PaymentShippingCityPlaceholder': 'City',\n 'PaymentShippingStatePlaceholder': 'State',\n 'PaymentShippingCountry': 'Country',\n 'PaymentShippingZipPlaceholder': 'Postcode',\n 'PaymentShippingReceiver': 'Receiver',\n 'PaymentShippingName': 'Full Name',\n 'PaymentShippingEmailPlaceholder': 'Email',\n 'PaymentCheckoutPhoneNumber': 'Phone number',\n 'PaymentCheckoutShippingMethod': 'Shipping method',\n 'PaymentShippingSave': 'Save Shipping Information',\n 'PaymentShippingSaveInfo': 'You can save your shipping info for future use.',\n 'PaymentInfoHint': 'You paid **%1$s** for **%2$s**.',\n 'PrivacyPayments': 'Payments',\n 'PrivacyPaymentsClearInfo': 'You can delete your shipping info and instruct all payment providers to remove your saved credit cards. Note that Telegram never stores your credit card data.',\n 'PrivacyPaymentsClear': 'Clear Payment and Shipping Info',\n 'PrivacyPaymentsClearAlertTitle': 'Clear payment info',\n 'PrivacyPaymentsClearAlertText': 'Are you sure you want to clear your payment and shipping info?',\n 'PrivacyPaymentsPaymentInfoCleared': 'Payment info cleared.',\n 'PrivacyPaymentsShippingInfoCleared': 'Shipping info cleared.',\n 'PrivacyPaymentsPaymentShippingCleared': 'Payment and shipping info cleared.',\n 'PrivacyClearShipping': 'Shipping info',\n 'PrivacyClearPayment': 'Payment info',\n 'Clear': 'Clear',\n 'Save': 'Save',\n 'PaymentCheckoutName': 'Name',\n 'ClearRecentStickersAlertTitle': 'Clear recent stickers',\n 'ClearRecentStickersAlertMessage': 'Do you want to clear all your recent stickers?',\n 'PremiumStickersShort': 'Premium',\n 'FavoriteStickers': 'Favorites',\n 'AddToFavorites': 'Add to Favorites',\n 'AddedToFavorites': 'Sticker added to Favorites.',\n 'RemovedFromFavorites': 'Sticker was removed from Favorites',\n 'RemovedFromRecent': 'Sticker was removed from Recent',\n 'DeleteFromFavorites': 'Delete from Favorites',\n 'DeleteFromRecent': 'Remove from Recent',\n 'NewChatsFromNonContacts': 'New chats from unknown users',\n 'ArchiveAndMute': 'Archive and Mute',\n 'ArchiveAndMuteInfo': 'Automatically archive and mute new chats, groups and channels from non-contacts.',\n 'PrivacyVoiceMessages': 'Voice Messages',\n 'PrivacyVoiceMessagesTitle': 'Who can send me voice or video messages?',\n 'PrivacyVoiceMessagesInfo': 'You can restrict who can send you voice or video messages with granular precision.',\n 'PrivacyVoiceMessagesPremiumOnly': 'Only subscribers of *Telegram Premium* can restrict receiving voice messages.',\n 'EmojiCount': {\n 'other_value': '%1$d emoji'\n },\n 'AddEmojiNotFound': 'Emoji pack not found.',\n 'MessageContainsEmojiPack': 'This message contains emoji from %s pack.',\n 'MessageContainsEmojiPacks': {\n 'other_value': 'This message contains emoji from **%d Packs**.'\n },\n 'EmojiPackCount': {\n 'one_value': '%1$d Emoji Pack',\n 'other_value': '%1$d Emoji Packs'\n },\n 'ReactionsAll': 'All',\n 'EnableSomeReactionsInfo': 'Members of the group can use only certain approved emoji as reactions to messages.',\n 'EnableAllReactionsInfo': 'Members of the group can use any emoji as reactions to messages.',\n 'DisableReactionsInfo': 'Members of the group can’t add any reactions to messages.',\n 'OnlyAllowThisReactions': 'Only allow these reactions',\n 'AllReactions': 'All reactions',\n 'SomeReactions': 'Some reactions',\n 'NoReactions': 'No reactions',\n 'LimitReached': 'Limit Reached',\n 'LimitReachedPinDialogs': 'You can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned – or subscribe to **Telegram Premium** to double the limit to **%2$d** chats.',\n 'LimitReachedPinDialogsPremium': 'Sorry, you can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned.',\n 'LimitReachedPinDialogsLocked': 'Sorry, you can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned. We are working to let you increase this limit in the future.',\n 'IncreaseLimit': 'Increase Limit',\n 'LimitFree': 'Free',\n 'LimitPremium': 'Premium',\n 'ActionTTLChanged': 'un1 set messages to auto-delete in %1$s',\n 'ActionTTLYouChanged': 'You set messages to auto-delete in %1$s',\n 'ActionTTLChannelChanged': 'Messages in this channel will be automatically deleted after %1$s',\n 'ActionTTLChannelDisabled': 'Messages in this channel will no longer be automatically deleted',\n 'ActionTTLDisabled': 'un1 disabled the auto-delete timer',\n 'ActionTTLYouDisabled': 'You disabled the auto-delete timer',\n 'UsernamesProfileHeader': 'Username order',\n 'UsernamesProfileHelp': 'Drag and drop links to change the order in which they will be displayed on your info page.',\n 'UsernamesChannelHelp': 'Drag and drop links to change the order in which they will be displayed on the channel info page.',\n 'UsernameLinkEditable': 'tap to edit',\n 'UsernameLinkActive': 'active',\n 'UsernameLinkInactive': 'not active',\n 'UsernameActivateLink': 'Activate link',\n 'UsernameDeactivateLink': 'Deactivate link',\n 'UsernameActivateLinkProfileMessage': 'Do you want to show this link on your info page?',\n 'UsernameDeactivateLinkProfileMessage': 'Do you want to hide this link from your info page?',\n 'UsernameActivateLinkChannelMessage': 'Do you want to show this link on the channel info page?',\n 'UsernameDeactivateLinkChannelMessage': 'Do you want to hide this link from the channel info page?',\n 'Hide': 'Hide',\n 'Show': 'Show',\n 'UsernameActivateErrorTitle': 'Too many active links',\n 'UsernameActivateErrorMessage': 'Sorry, you have too many active public links already. Please hide one of your active public links first.',\n 'ChannelSignMessages': 'Sign Messages',\n // 'ChannelSignMessagesInfo': 'Add names of admins to the messages they post',\n 'TopicWasCreatedAction': '%s was created',\n 'Topics': 'Topics',\n 'ForumToggleDescription': 'The group chat will be divided into topics created by admins or users.',\n 'AnonymousNumber': 'Anonymous Number',\n 'Info': 'Info',\n 'BotSettings': 'Settings',\n 'OpenMessage': 'VIEW MESSAGE',\n 'OpenGroup': 'VIEW GROUP',\n 'CloseTopic': 'Close topic',\n 'RestartTopic': 'Reopen topic',\n 'LimitReachedPinnedTopics': 'Sorry, you can\\'t pin more than %d topics to the top.',\n 'TopicProfileStatus': 'In %s',\n 'AccDescrTopic': 'Topic',\n 'DeleteTopics': {\n 'one_value': 'Delete topic',\n 'other_value': 'Delete topics'\n },\n 'DeleteSelectedTopic': 'Are you sure you want delete %s?',\n 'NewTopic': 'New Topic',\n 'CreateTopicTitle': 'Choose a topic name and icon',\n 'CreateGeneralTopicTitle': 'Choose topic name',\n 'EditTopicHide': 'Show in Topics',\n 'EditTopicHideInfo': 'If the \\'General\\' topic is hidden, group members can pull down in the topic list to view it.',\n 'OpenUrlOption1': 'Log in to %1$s as **%2$s**',\n 'OpenUrlOption2': 'Allow **%1$s** to send me messages',\n 'OtherWebSessions': 'Connected websites',\n 'WebSessionsTitle': 'Logged In with Telegram',\n 'TerminateWebSessionText': 'Are you sure you want to disconnect %1$s?',\n 'Disconnect': 'Disconnect',\n 'TerminateAllWebSessions': 'Disconnect All Websites',\n 'AreYouSureWebSessions': 'Are you sure you want to disconnect all websites where you logged in with Telegram?',\n 'ClearOtherWebSessionsHelp': 'You can log in on websites that support signing in with Telegram.',\n 'TerminateWebSessionInfo': 'Tap to disconnect from your Telegram account.',\n 'EnablePhotoSpoiler': 'Hide with spoiler',\n 'DisablePhotoSpoiler': 'Remove spoiler',\n 'LimitReachedFolders': 'You have reached the limit of **%1$d** folders. You can double the limit to **%2$d** folders by subscribing to **Telegram Premium**.',\n 'LimitReachedFoldersPremium': 'You have reached the limit of **%1$d** folders for this account.',\n 'LimitReachedFoldersLocked': 'You have reached the limit of **%1$d** folders for this account. We are working to let you increase this limit in the future.',\n 'FwdMessageToSavedMessages': 'Message forwarded to **Saved Messages**.',\n 'FwdMessagesToSavedMessages': 'Messages forwarded to **Saved Messages**.',\n 'ColorTheme': 'Color theme',\n 'SendAsFile': 'Send as file',\n 'SendAsFiles': 'Send as files',\n 'ChatThemeChangedYou': 'You changed the chat theme to %1$s',\n 'ChatThemeChangedTo': '%1$s changed the chat theme to %2$s',\n 'ChatThemeDisabled': '%1$s disabled the chat theme',\n 'ChatThemeDisabledYou': 'You disabled the chat theme',\n\n // * macos\n 'AccountSettings.Filters': 'Chat Folders',\n 'AccountSettings.Notifications': 'Notifications and Sounds',\n 'AccountSettings.PrivacyAndSecurity': 'Privacy and Security',\n 'AccountSettings.Language': 'Language',\n 'Alert.UserDoesntExists': 'Sorry, this user doesn\\'t seem to exist.',\n 'Alert.Confirm.Discard': 'Discard',\n 'Appearance.Reset': 'Reset to Defaults',\n 'AutoDownloadSettings.Delimeter': ', ',\n 'AutoDownloadSettings.LastDelimeter': ' and ',\n 'Bio.Description': 'Any details such as age, occupation or city.\\nExample: 23 y.o. designer from San Francisco',\n 'Call.Accept': 'Accept',\n 'Call.Decline': 'Decline',\n 'Call.End': 'End',\n 'Call.Camera': 'Camera',\n 'Call.Mute': 'Mute',\n 'Call.Recall': 'Recall',\n 'Call.Close': 'Close',\n 'Call.Screen': 'Screen',\n 'Call.Confirm.Discard.Voice.Header': 'Video Chat in Progress',\n 'Call.Confirm.Discard.Voice.ToVoice.Text': 'Leave video chat in \"%1$@\" and start a new one in \"%2$@\"?',\n 'Call.Confirm.Discard.Voice.ToCall.Text': 'Leave video chat in \"%1$@\" and start a call with \"%2$@\"?',\n 'Call.Confirm.Discard.Call.Header': 'Call in Progress',\n 'Call.Confirm.Discard.Call.ToVoice.Text': 'End call with \"%1$@\" and start a video chat in \"%2$@\"?',\n 'Call.Confirm.Discard.Call.ToCall.Text': 'End call with \"%1$@\" and start a video chat in \"%2$@\"?',\n 'Call.PrivacyErrorMessage': 'Sorry, you cannot call %@ because of their privacy settings.',\n 'Call.StatusRequesting': 'Contacting...',\n 'Call.StatusRinging': 'Ringing...',\n 'Call.StatusConnecting': 'Connecting...',\n 'Call.StatusEnded': 'Call Ended',\n 'Call.StatusFailed': 'Call Failed',\n 'Call.StatusBusy': 'Busy',\n 'Call.StatusCalling': 'is calling you...',\n 'Contacts.PhoneNumber.NotRegistred': 'The person with this phone number is not registered on Telegram yet.',\n 'Channel.UsernameAboutChannel': 'People can share this link with others and can find your channel using Telegram search.',\n 'Channel.UsernameAboutGroup': 'People can share this link with others and find your group using Telegram search.',\n 'Chat.Accessory.Forward': {\n 'one_value': 'Forward Message',\n 'other_value': 'Forward %d Messages'\n },\n 'Chat.Accessory.Forward.You': 'You',\n 'Chat.Accessory.Forward.From': 'From',\n 'Chat.Accessory.Hidden': {\n 'one_value': 'Forward Message (sender\\'s name hidden)',\n 'other_value': 'Forward %d Messages (senders\\' names hidden)'\n },\n 'Chat.Alert.Forward.Action.Another': 'Forward to Another Chat',\n 'Chat.Alert.Forward.Action.Hide1': {\n 'one_value': 'Hide Sender\\'s Name',\n 'other_value': 'Hide Senders\\' Names'\n },\n 'Chat.Alert.Forward.Action.Show1': {\n 'one_value': 'Show Sender\\'s Name',\n 'other_value': 'Show Senders\\' Names'\n },\n 'Chat.Alert.Forward.Action.ShowCaption': {\n 'one_value': 'Show Caption',\n 'other_value': 'Show Captions'\n },\n 'Chat.Alert.Forward.Action.HideCaption': {\n 'one_value': 'Hide Caption',\n 'other_value': 'Hide Captions'\n },\n 'Chat.CopySelectedText': 'Copy Selected Text',\n 'Chat.Confirm.Unpin': 'Would you like to unpin this message?',\n 'Chat.Context.Reacted': '%1$@/%2$@ Reacted',\n 'Chat.Context.ReactedFast': {\n 'other_value': '%d Reacted'\n },\n 'Chat.Date.ScheduledFor': 'Scheduled for %@',\n 'Chat.Date.ScheduledForToday': 'Scheduled for today',\n 'Chat.DropTitle': 'Drop files here to send them',\n 'Chat.DropQuickDesc': 'in a quick way',\n 'Chat.DropAsFilesDesc': 'without compression',\n 'Chat.Edit.Cancel.Text': 'Are you sure you want to discard all changes?',\n 'Chat.Input.ReplyToAnswer': 'Reply to message in topics',\n 'Chat.SendVoice.PrivacyError': '%@ doesn\\'t accept voice and video messages',\n 'Chat.Service.Call.Cancelled': 'Cancelled',\n 'Chat.Service.Call.Missed': 'Missed',\n 'Chat.Service.PeerJoinedTelegram': '%@ joined Telegram',\n 'Chat.Service.Channel.UpdatedTitle': 'Channel renamed to \"%@\"',\n 'Chat.Service.Channel.UpdatedPhoto': 'Channel photo updated',\n 'Chat.Service.Channel.RemovedPhoto': 'Channel photo removed',\n 'Chat.Service.Channel.UpdatedVideo': 'Channel video updated',\n 'Chat.Service.BotPermissionAllowed': 'You allowed this bot to message you when you logged in on %@',\n 'Chat.Service.Group.UpdatedPinnedMessage': '%@ pinned \"%@\"',\n 'Chat.Service.Group.TopicEdited.Icon': '%1$@ changed topic icon to %2$@',\n 'Chat.Service.Group.TopicEdited.Icon.Removed': '%1$@ removed icon',\n 'Chat.Service.Group.TopicEdited.Title': '%1$@ changed topic name to \"%2$@\"',\n 'Chat.Service.Group.TopicEdited.Paused': '%1$@ closed topic',\n 'Chat.Service.Group.TopicEdited.Resumed': '%1$@ restarted topic',\n 'Chat.Service.Group.TopicEdited.You.Icon': 'You changed topic icon to %1$@',\n 'Chat.Service.Group.TopicEdited.You.Icon.Removed': 'You removed icon',\n 'Chat.Service.Group.TopicEdited.You.Title': 'You changed topic name to \"%1$@\"',\n 'Chat.Service.Group.TopicEdited.You.Paused': 'You closed topic',\n 'Chat.Service.Group.TopicEdited.You.Resumed': 'You restarted topic',\n 'Chat.Service.Group.TopicEdited.You.Hided': 'You hid the general topic',\n 'Chat.Service.Group.TopicEdited.You.Unhided': 'You unhid the general topic',\n 'Chat.Service.Group.TopicEdited.Hided': '%1$@ hid the general topic',\n 'Chat.Service.Group.TopicEdited.Unhided': '%1$@ unhid the general topic',\n 'Chat.Service.PaymentSent1': 'You have successfully transferred **%1$@** to **%2$@** for **%3$@**',\n 'Chat.Service.PaymentSent1NoTitle': 'You have successfully transferred **%1$@** to **%2$@**',\n 'Chat.Service.PaymentSentRecurringInit': 'You successfully transferred **%1$@** to **%2$@** for **%3$@** and allowed future recurring payments',\n 'Chat.Service.PaymentSentRecurringInitNoTitle': 'You successfully transferred **%1$@** to **%2$@** and allowed future recurring payments',\n 'Chat.Service.PaymentSentRecurringUsed': 'You have just successfully transferred **%1$@** to **%2$@** for **%3$@** via recurrent payments',\n 'Chat.Service.PaymentSentRecurringUsedNoTitle': 'You have just successfully transferred **%1$@** to **%2$@** via recurrent payments',\n 'Chat.Service.VoiceChatStarted': '%1$@ started a [video chat](open)',\n 'Chat.Service.VoiceChatStartedYou': 'You started a [video chat](open)',\n 'Chat.Service.VoiceChatStarted.Channel': '[Live Stream](open) started',\n 'Chat.Service.VoiceChatFinished': '%1$@ ended the video chat (%2$@)',\n 'Chat.Service.VoiceChatFinishedYou': 'You ended the video chat (%@)',\n 'Chat.Service.VoiceChatFinished.Channel': 'Live Stream ended (%1$@)',\n 'Chat.Service.VoiceChatInvitation': '%1$@ invited %2$@ to the [video chat](open)',\n 'Chat.Service.VoiceChatInvitationByYou': 'You invited %1$@ to the [video chat](open)',\n 'Chat.Service.VoiceChatInvitationForYou': '%1$@ invited you to the [video chat](open)',\n 'ChatService.UserJoinedGroupByRequest': '%@ was accepted to the group',\n 'ChatService.UserJoinedChannelByRequest': '%@ joined the channel by request',\n 'ChatList.Service.VoiceChatScheduled': '%1$@ scheduled a video chat for %2$@',\n 'ChatList.Service.VoiceChatScheduledYou': 'You scheduled a video chat for %2$@',\n 'Chat.Poll.Unvote': 'Retract Vote',\n 'Chat.Poll.Stop': 'Stop Poll',\n 'Chat.Poll.ViewResults': 'View Results',\n 'Chat.Poll.SubmitVote': 'Vote',\n 'Chat.Poll.Type.Anonymous': 'Anonymous Poll',\n 'Chat.Poll.Type.Public': 'Poll',\n 'Chat.Poll.Type.AnonymousQuiz': 'Anonymous Quiz',\n 'Chat.Poll.Type.Quiz': 'Quiz',\n 'Chat.Poll.Type.Closed': 'Final Results',\n 'Chat.Poll.TotalVotes1': {\n 'one_value': '%d vote',\n 'other_value': '%d votes'\n },\n 'Chat.Quiz.TotalVotes': {\n 'one_value': '%d answer',\n 'other_value': '%d answers'\n },\n 'Chat.Poll.TotalVotesEmpty': 'No votes yet',\n 'Chat.Poll.TotalVotesResultEmpty': 'No votes',\n 'Chat.Quiz.TotalVotesEmpty': 'No answers yet',\n 'Chat.Quiz.TotalVotesResultEmpty': 'No answers',\n // \"Chat.Poll.Stop.Confirm.Header\": \"Stop Poll?\",\n // \"Chat.Poll.Stop.Confirm.Text\": \"If you stop this poll now, nobody will be able to vote in it anymore. This action cannot be undone.\",\n // \"Chat.Pinned.UnpinAll\": {\n // \"one_value\": \"Unpin %d Message\",\n // \"other_value\": \"Unpin All %d Messages\"\n // },\n 'Chat.Pinned.DontShow': 'Don\\'t Show Pinned Messages',\n 'Chat.Title.Comments': {\n 'one_value': '%d Comment',\n 'other_value': '%d Comments'\n },\n 'ChatTitle.ReportMessages': 'Report Messages',\n 'Chat.Send.WithoutSound': 'Send Without Sound',\n 'Chat.Send.SetReminder': 'Set a Reminder',\n 'Chat.Send.ScheduledMessage': 'Schedule Message',\n 'Chat.SendAs.PersonalAccount': 'personal account',\n 'Chat.UnpinAllMessagesConfirmation': {\n 'one_value': 'Do you want to unpin %d message in this chat?',\n 'other_value': 'Do you want to unpin all %d messages in this chat?'\n },\n 'Chat.Message.Ad.Text': 'Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\\n\\nUnlike other apps, Telegram doesn\\'t track whether you tapped on a sponsored message and doesn\\'t profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\\n\\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\\n\\n%@\\n\\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\\n\\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.',\n 'Chat.Message.Ad.ReadMore': 'Read More',\n 'Chat.Message.ViewChannel': 'VIEW CHANNEL',\n 'Chat.Message.ViewBot': 'VIEW BOT',\n 'Chat.Message.ViewGroup': 'VIEW GROUP',\n 'Chat.Message.Sponsored.What': 'What are sponsored messages?',\n 'Chat.Message.Sponsored.Link': 'https://promote.telegram.org',\n 'Checkout.2FA.Text': 'Saving payment details is only available with 2-Step Verification.',\n 'Checkout.NewCard.CardholderNamePlaceholder': 'Cardholder Name',\n 'Checkout.PasswordEntry.Title': 'Payment Confirmation',\n 'Checkout.PasswordEntry.Pay': 'Pay',\n 'Checkout.PasswordEntry.Text': 'Your card %@ is on file. To pay with this card, please enter your 2-Step-Verification password.',\n 'Checkout.PayPrice': 'Pay %@',\n 'Checkout.WebConfirmation.Title': 'Complete Payment',\n 'ChatList.Context.Mute': 'Mute',\n 'ChatList.Context.Unmute': 'Unmute',\n 'ChatList.Context.Pin': 'Pin',\n 'ChatList.Context.Unpin': 'Unpin',\n 'ChatList.Context.DeleteChat': 'Delete Chat',\n 'ChatList.Context.DeleteAndExit': 'Delete and Leave',\n 'ChatList.Context.LeaveChannel': 'Leave Channel',\n 'ChatList.Context.LeaveGroup': 'Leave Group',\n 'ChatList.Service.Call.incoming': 'Incoming Call (%@)',\n 'ChatList.Service.Call.outgoing': 'Outgoing Call (%@)',\n 'ChatList.Service.VideoCall.incoming': 'Incoming Video Call (%@)',\n 'ChatList.Service.VideoCall.outgoing': 'Outgoing Video Call (%@)',\n 'ChatList.Service.Call.Cancelled': 'Cancelled Call',\n 'ChatList.Service.Call.Missed': 'Missed Call',\n 'ChatList.Service.VideoCall.Cancelled': 'Cancelled Video Call',\n 'ChatList.Service.VideoCall.Missed': 'Missed Video Call',\n 'ChatList.Service.VoiceChatScheduled.Channel': 'Voice chat scheduled for %@',\n 'ChatList.Filter.Header': 'Create folders for different groups of chats and quickly switch between them.',\n 'ChatList.Filter.NewTitle': 'Create Folder',\n 'ChatList.Filter.List.Title': 'Chat Folders',\n 'ChatList.Filter.Include.AddChat': 'Add Chats',\n 'ChatList.Filter.Exclude.AddChat': 'Add Chats',\n // \"ChatList.Filter.All\": \"All\",\n 'ChatList.Filter.Contacts': 'Contacts',\n 'ChatList.Filter.NonContacts': 'Non-Contacts',\n 'ChatList.Filter.Groups': 'Groups',\n 'ChatList.Filter.Channels': 'Channels',\n 'ChatList.Filter.Bots': 'Bots',\n 'ChatList.Filter.MutedChats': 'Muted',\n 'ChatList.Filter.ReadChats': 'Read',\n 'ChatList.Filter.Archive': 'Archived',\n 'ChatList.Filter.Include.LimitReached': 'Sorry, you can only add up to 100 individual chats. Try using chat types.',\n 'ChatList.Filter.Exclude.LimitReached': 'Sorry, you can only add up to 100 individual chats. Try using chat types.',\n 'ChatList.Filter.Confirm.Remove.Header': 'Remove Folder',\n 'ChatList.Filter.Confirm.Remove.Text': 'Are you sure you want to remove this folder? Your chats will not be deleted.',\n 'ChatList.Mute.1Hour': 'For 1 Hour',\n 'ChatList.Mute.4Hours': 'For 4 Hours',\n 'ChatList.Mute.8Hours': 'For 8 Hours',\n 'ChatList.Mute.1Day': 'For 1 Day',\n 'ChatList.Mute.3Days': 'For 3 Days',\n 'ChatList.Mute.Forever': 'Forever',\n 'Channel.DescriptionHolderDescrpiton': 'You can provide an optional description for your channel.',\n 'ChannelVisibility.Confirm.MakePrivate.Channel': 'If you make this channel private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.',\n 'ChannelVisibility.Confirm.MakePrivate.Group': 'If you make this group private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.',\n 'Context.ViewStickerSet': 'View Sticker Set',\n 'CreateGroup.NameHolder': 'Group Name',\n 'CustomEmoji.PremiumAlert': 'Subscribe to Telegram Premium to unlock this emoji. [Read More]()',\n 'Date.Today': 'Today',\n 'DeleteChat.DeleteGroupForAll': 'Delete for all members',\n 'DeleteChannelForAll': 'Delete for all subscribers',\n 'ForumTopic.Context.Info': 'Group Info',\n 'ForumTopic.Context.AddMember': 'Add Members',\n 'ForumTopic.Context.ShowAsMessages': 'View as Messages',\n 'ForumTopic.Context.New': 'Create Topic',\n 'ForumTopic.Name.Placeholder': 'Topic Name',\n 'ForumTopic.Title.Edit': 'Edit Topic',\n 'EditAccount.Username': 'Username',\n 'EditAccount.Title': 'Edit Profile',\n 'EditAccount.Logout': 'Log Out',\n 'Emoji.Recent': 'Frequently Used',\n 'Emoji.SmilesAndPeople': 'Smileys & People',\n 'Emoji.AnimalsAndNature': 'Animals & Nature',\n 'Emoji.FoodAndDrink': 'Food & Drink',\n 'Emoji.ActivityAndSport': 'Activity & Sport',\n 'Emoji.TravelAndPlaces': 'Travel & Places',\n 'Emoji.Objects': 'Objects',\n // \"Emoji.Symbols\": \"Symbols\",\n 'Emoji.Flags': 'Flags',\n 'Error.AnError': 'An error occurred. Please try again later.',\n 'FileSize.B': '%@ B',\n 'FileSize.KB': '%@ KB',\n 'FileSize.MB': '%@ MB',\n 'FileSize.GB': '%@ GB',\n 'InstalledStickers.LoopAnimated': 'Loop Animated Stickers',\n 'LastSeen.HoursAgo': {\n 'one_value': 'last seen %d hour ago',\n 'other_value': 'last seen %d hours ago'\n },\n 'Login.Register.LastName.Placeholder': 'Last Name',\n 'Message.Context.Select': 'Select',\n 'Message.Context.Pin': 'Pin',\n 'Message.Context.Unpin': 'Unpin',\n 'Message.Context.Goto': 'Show Message',\n 'Message.ReplyActionButtonShowReceipt': 'Show Receipt',\n 'MessageContext.CopyMessageLink1': 'Copy Message Link',\n 'Modal.Send': 'Send',\n 'NewContact.Exception.ShareMyPhoneNumber': 'Share My Phone Number',\n 'NewContact.Exception.ShareMyPhoneNumber.Desc': 'You can make your phone visible to %@.',\n 'NewPoll.Anonymous': 'Anonymous Voting',\n 'NewPoll.Explanation.Placeholder': 'Add a Comment (Optional)',\n 'NewPoll.OptionsAddOption': 'Add an Option',\n 'NewPoll.MultipleChoice': 'Multiple Answers',\n 'NewPoll.Quiz': 'Quiz Mode',\n 'Notification.Contact.Reacted': '%1$@ to your \"%2$@\"',\n // \"Notification.Group.Reacted\": \"%1$@: %2$@ to your \"%3$@\"\",\n 'Payments.Recurrent.Accept': 'I accept [Terms of Service]() of **%@**.',\n 'Peer.Activity.User.PlayingGame': 'playing a game',\n 'Peer.Activity.User.TypingText': 'typing',\n 'Peer.Activity.User.SendingPhoto': 'sending a photo',\n 'Peer.Activity.User.RecordingVideo': 'recording video',\n 'Peer.Activity.User.SendingVideo': 'sending a video',\n 'Peer.Activity.User.RecordingAudio': 'recording voice',\n 'Peer.Activity.User.SendingFile': 'sending file',\n 'Peer.Activity.User.ChoosingSticker': 'choosing a sticker',\n 'Peer.Activity.User.EnjoyingAnimations': 'watching %@',\n 'Peer.Activity.Chat.PlayingGame': '%@ is playing a game',\n 'Peer.Activity.Chat.TypingText': '%@ is typing',\n 'Peer.Activity.Chat.SendingPhoto': '%@ is sending a photo',\n 'Peer.Activity.Chat.RecordingVideo': '%@ is recording video',\n 'Peer.Activity.Chat.SendingVideo': '%@ is sending a video',\n 'Peer.Activity.Chat.RecordingAudio': '%@ is recording voice',\n 'Peer.Activity.Chat.SendingFile': '%@ is sending a file',\n 'Peer.Activity.Chat.ChoosingSticker': '%@ is choosing a sticker',\n 'Peer.Activity.Chat.EnjoyingAnimations': '%@ is watching %@',\n 'Peer.Activity.Chat.Multi.PlayingGame1': '%@ and %d others are playing a game',\n 'Peer.Activity.Chat.Multi.TypingText1': '%@ and %d others are typing',\n 'Peer.Activity.Chat.Multi.SendingPhoto1': '%@ and %d others are sending photos',\n 'Peer.Activity.Chat.Multi.RecordingVideo1': '%@ and %d others are recording video',\n 'Peer.Activity.Chat.Multi.SendingVideo1': '%@ and %d others are sending videos',\n 'Peer.Activity.Chat.Multi.RecordingAudio1': '%@ and %d others are recording voice',\n // \"Peer.Activity.Chat.Multi.SendingAudio1\": \"%@ and %d others are sending audio\",\n 'Peer.Activity.Chat.Multi.SendingFile1': '%@ and %d others are sending files',\n 'Peer.Activity.Chat.Multi.ChoosingSticker1': '%@ and %d others are choosing stickers',\n 'Peer.ServiceNotifications': 'service notifications',\n 'Peer.RepliesNotifications': 'Reply Notifications',\n 'Peer.Status.justNow': 'last seen just now',\n 'Peer.Status.Today': 'today',\n 'Peer.Status.Yesterday': 'yesterday',\n 'Peer.Status.LastSeenAt': 'last seen %@ at %@',\n 'Peer.Status.minAgo': {\n 'one_value': 'last seen %d minute ago',\n 'other_value': 'last seen %d minutes ago'\n },\n 'Peer.Status.Member': {\n 'one_value': '%d member',\n 'other_value': '%d members'\n },\n 'Peer.Status.Subscribers': {\n 'one_value': '%d subscriber',\n 'other_value': '%d subscribers'\n },\n 'PeerInfo.Administrators': 'Administrators',\n 'PeerInfo.DeleteChannel': 'Delete Channel',\n 'PeerInfo.Discussion': 'Discussion',\n 'PeerInfo.Discussion.Add': 'Add',\n 'PeerInfo.SharedMedia': 'Shared Media',\n 'PeerInfo.Subscribers': 'Subscribers',\n 'PeerInfo.DeleteContact': 'Delete Contact',\n // \"PeerInfo.Confirm.RemovePeer\": \"Remove %@ from the group?\",\n 'PeerInfo.Action.VoiceChat': 'Video Chat',\n 'PeerInfo.Action.LiveStream': 'Live Stream',\n 'PeerInfo.Phone.AnonymousInfo': 'This number is not tied to a SIM card and was acquired on [Fragment]().',\n 'PeerMedia.Members': 'Members',\n 'PollResults.Title.Poll': 'Poll Results',\n 'PollResults.Title.Quiz': 'Quiz Results',\n 'PollResults.LoadMore': {\n 'other_value': 'Show More (%d)'\n },\n // \"PeerInfo.Confirm.DeleteGroupConfirmation\": \"Wait! Deleting this group will remove all members and all messages will be lost. Delete the group anyway?\",\n 'Preview.Dragging.AddItems': {\n 'one_value': 'Add Item',\n 'other_value': 'Add Items'\n },\n 'PreviewSender.CaptionPlaceholder': 'Add a caption...',\n 'PreviewSender.CompressFile': 'Send compressed',\n 'PreviewSender.SendFile': {\n 'one_value': 'Send File',\n 'other_value': 'Send %d Files'\n },\n 'PreviewSender.SendPhoto': {\n 'one_value': 'Send Photo',\n 'other_value': 'Send %d Photos'\n },\n 'PreviewSender.SendVideo': {\n 'one_value': 'Send Video',\n 'other_value': 'Send %d Videos'\n },\n 'PrivacyAndSecurity.Item.On': 'On',\n 'PrivacyAndSecurity.Item.Off': 'Off',\n 'PrivacyAndSecurity.SensitiveText': 'Disable filtering',\n 'PrivacyAndSecurity.SensitiveDesc': 'Display sensitive media in public channels on all your Telegram devices.',\n 'PrivacySettings.VoiceCalls': 'Calls',\n 'PrivacySettings.Forwards': 'Forwarded Messages',\n 'PrivacySettings.Groups': 'Groups and Channels',\n 'PrivacySettingsController.AddUsers': 'Add Users',\n 'PrivacySettingsController.GroupDescription': 'You can restrict who can add you to groups and channels with granular precision.',\n 'PrivacySettingsController.Forwards.CustomHelp': 'You can restrict who can add a link to your account when forwarding your messages.',\n 'PrivacySettingsController.P2p.Desc': 'Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.',\n 'PrivacySettingsController.PhoneCallDescription': 'You can restrict who can call you with granular precision.',\n 'PrivacySettingsController.ProfilePhoto.CustomHelp': 'You can restrict who can see your profile photo with granular precision.',\n 'PrivacySettingsController.LastSeenDescription': 'You won\\'t see Last Seen and Online statuses for people with whom you don\\'t share yours. Approximate last seen will be shown instead (recently, within a week, within a month).',\n 'PrivacySettingsController.PeerInfo': 'You can add users or entire groups as exceptions that will override the settings above.',\n 'PrivacySettingsController.Everbody': 'Everybody',\n 'PrivacySettingsController.MyContacts': 'My Contacts',\n 'PrivacySettingsController.Nobody': 'Nobody',\n 'PrivacySettingsController.NeverShare': 'Never Share With',\n 'PrivacySettingsController.AlwaysShare': 'Always Share With',\n 'PrivacySettingsController.NeverAllow': 'Never Allow',\n 'PrivacySettingsController.AlwaysAllow': 'Always Allow',\n 'PrivacySettingsController.UserCount': {\n 'one_value': '%d user',\n 'other_value': '%d users'\n },\n 'RecentSessions.Error.FreshReset': 'For security reasons, you can\\'t terminate older sessions from a device that you\\'ve just connected. Please use an earlier connection or wait for a few hours.',\n 'RequestJoin.Button': 'Request to Join',\n 'Stickers.SearchAdd': 'Add',\n 'Stickers.SearchAdded': 'Added',\n 'Stickers.SuggestStickers': 'Suggest Stickers by Emoji',\n 'ShareModal.Search.Placeholder': 'Share to...',\n 'ShareModal.Search.ForwardPlaceholder': 'Forward to...',\n 'Telegram.GeneralSettingsViewController': 'General Settings',\n 'Telegram.InstalledStickerPacksController': 'Stickers',\n 'Telegram.NotificationSettingsViewController': 'Notifications',\n 'Telegram.LanguageViewController': 'Language',\n 'Text.CopyLabel_About': 'Copy About',\n 'Text.CopyLabel_Bio': 'Copy Bio',\n 'Text.CopyLabel_PhoneNumber': 'Copy Phone Number',\n 'Text.CopyLabel_Username': 'Copy Username',\n 'Text.CopyLabel_ShareLink': 'Copy Share Link',\n 'GeneralSettings.BigEmoji': 'Large Emoji',\n 'GeneralSettings.EmojiPrediction': 'Suggest Emoji',\n 'GroupPermission.Delete': 'Delete Exception',\n 'Search.Confirm.ClearHistory': 'Are you sure you want to clear your search history?',\n 'SecureId.Identity.Placeholder.ExpiryDate': 'Expiry Date',\n 'Separator.ShowMore': 'show more',\n 'Separator.ShowLess': 'show less',\n 'ScheduleController.at': 'at',\n 'Schedule.SendToday': 'Send today at %@',\n 'Schedule.SendDate': 'Send on %@ at %@',\n 'Schedule.SendWhenOnline': 'Send When Online',\n 'Sticker.Premium.Click.Info': 'This pack contains premium stickers like this one. [View Pack]()',\n 'Stickers.Recent': 'Recent',\n // \"Stickers.Favorite\": \"Favorite\",\n 'StickerSet.DontExist': 'Sorry, this sticker set doesn\\'t seem to exist.',\n 'Text.Context.Copy.Username': 'Copy Username',\n 'Text.Context.Copy.Hashtag': 'Copy Hashtag',\n 'Time.TomorrowAt': 'tomorrow at %@',\n 'TwoStepAuth.SetPasswordHelp': 'You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.',\n 'TwoStepAuth.GenericHelp': 'You have enabled Two-Step verification.\\nYou\\'ll need the password you set up here to log in to your Telegram account.',\n 'TwoStepAuth.ChangePassword': 'Change Password',\n 'TwoStepAuth.RemovePassword': 'Turn Password Off',\n 'TwoStepAuth.SetupEmail': 'Set Recovery Email',\n 'TwoStepAuth.ChangeEmail': 'Change Recovery Email',\n 'TwoStepAuth.ConfirmEmailCodeDesc': 'Please enter the code we\\'ve just emailed to %@.',\n 'TwoStepAuth.RecoveryTitle': 'Email Code',\n 'TwoStepAuth.RecoveryCode': 'Code',\n 'TwoStepAuth.RecoveryCodeInvalid': 'Invalid code. Please try again.',\n 'TwoStepAuth.RecoveryCodeExpired': 'Code Expired',\n 'TwoStepAuth.SetupHintTitle': 'Password Hint',\n 'TwoStepAuth.SetupHintPlaceholder': 'Hint',\n 'VoiceChat.Chat.StartNew': 'Video chat ended. Start a new one?',\n 'VoiceChat.Chat.StartNew.OK': 'Start',\n 'VoiceChat.Chat.Ended': 'Video chat ended.',\n 'VoiceChat.Invite.InviteMembers': 'Invite members',\n 'VoiceChat.Status.Connecting': 'Connecting...',\n 'VoiceChat.Status.Members': {\n 'one_value': '%d participant',\n 'other_value': '%d participants'\n },\n 'VoiceChat.Status.MutedForYou': 'muted for you',\n 'VoiceChat.Status.Speaking': 'speaking',\n 'VoiceChat.Status.Listening': 'listening',\n 'VoiceChat.Status.WantsSpeak': 'wants to speak',\n 'VoiceChat.Status.Muted': 'muted',\n 'VoiceChat.Status.You': 'This is you',\n 'VoiceChat.Video.Stream.Video': 'video',\n 'VoiceChat.Video.Stream.Screencast': 'screen',\n 'VoiceChat.Video.Stream.More': 'more',\n 'VoiceChat.Leave': 'Leave',\n 'VoiceChat.End.Title': 'Leave video chat',\n 'VoiceChat.End.Text': 'Are you sure you want to leave this video chat?',\n 'VoiceChat.End.Third': 'End Video Chat',\n 'VoiceChat.End.OK': 'Leave',\n 'VoiceChat.MutePeer': 'Mute',\n 'VoiceChat.UnmutePeer': 'Allow To Speak',\n 'VoiceChat.RemovePeer': 'Remove',\n 'VoiceChat.OpenProfile': 'Open Profile',\n 'VoiceChat.MuteForMe': 'Mute For Me',\n 'VoiceChat.UnmuteForMe': 'Unmute For Me',\n 'VoiceChat.RemovePeer.Confirm.Channel': 'Do you want to remove %1$@ from the channel?',\n 'VoiceChat.RemovePeer.Confirm': 'Are you sure you want to remove %1$@ from the group?',\n 'VoiceChat.RemovePeer.Confirm.OK': 'Remove'\n};\n\nexport default lang;\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/104.f1e35ff90b4ddd68a9d8.chunk.js.map b/public/104.f1e35ff90b4ddd68a9d8.chunk.js.map deleted file mode 100644 index bbc4615b..00000000 --- a/public/104.f1e35ff90b4ddd68a9d8.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"104.f1e35ff90b4ddd68a9d8.chunk.js","mappings":"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","sources":["webpack://tweb/./src/lang.ts"],"sourcesContent":["const lang = {\n 'Animations': 'Animations',\n 'AttachAlbum': 'Album',\n 'Appearance.Color.Hex': 'HEX',\n 'Appearance.Color.RGB': 'RGB',\n 'BlockModal.Search.Placeholder': 'Block user...',\n 'DarkMode': 'Dark Mode',\n 'FilterIncludeExcludeInfo': 'Choose chats and types of chats that will\\nappear and never appear in this folder.',\n 'FilterMenuDelete': 'Delete Folder',\n 'FilterHeaderEdit': 'Edit Folder',\n 'FilterAllGroups': 'All Groups',\n 'FilterAllContacts': 'All Contacts',\n 'FilterAllNonContacts': 'All Non-Contacts',\n 'FilterAllChannels': 'All Channels',\n 'FilterAllBots': 'All Bots',\n 'EditContact.OriginalName': 'original name',\n 'EditProfile.FirstNameLabel': 'Name',\n 'EditProfile.BioLabel': 'Bio (optional)',\n 'EditProfile.Username.Label': 'Username (optional)',\n 'EditProfile.Username.Available': 'Username is available',\n 'EditProfile.Username.Taken': 'Username is already taken',\n 'EditProfile.Username.Invalid': 'Username is invalid',\n 'ExceptionModal.Search.Placeholder': 'Add exception...',\n 'Chat.Menu.SelectMessages': 'Select Messages',\n 'Chat.Menu.ClearSelection': 'Clear Selection',\n 'Chat.Menu.Hint': 'To **edit** or **reply**, close this menu.\\nThen tap next to a message.',\n 'Chat.Input.UnpinAll': 'Unpin All Messages',\n 'Chat.Input.Attach.PhotoOrVideo': 'Photo or Video',\n 'Chat.Input.Attach.Document': 'Document',\n 'Chat.Subscribe': 'SUBSCRIBE',\n 'Chat.Selection.LimitToast': 'Max selection count reached.',\n 'Chat.Search.MessagesFound': {\n 'one_value': '%d message found',\n 'other_value': '%d messages found'\n },\n 'Chat.Search.NoMessagesFound': 'No messages found',\n 'Chat.Search.PrivateSearch': 'Private Search',\n 'Chat.Service.TopicEdited.Mixed': '%1$@ changed the topic name and icon to %2$@',\n 'Chat.Service.TopicEdited.You.Mixed': 'You changed the topic name and icon to %2$@',\n 'Chat.Service.TopicEdited.Mixed.IconRemoved': '%1$@ changed the topic name to \"%1$@\" and removed icon',\n 'Chat.Service.TopicEdited.You.Mixed.IconRemoved': 'You changed the topic name to \"%1$@\" and removed icon',\n 'ChatList.Main.EmptyPlaceholder.Title': 'Your chats will appear here',\n 'ChatList.Main.EmptyPlaceholder.Subtitle': 'You have %s on Telegram',\n 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts': 'Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts',\n // \"ChatList.Menu.Archived\": \"Archived\",\n 'ChatList.Menu.SwitchTo.Webogram': 'Switch to Old Version',\n 'ChatList.Menu.SwitchTo.Z': 'Switch to Z version',\n 'ChatMigration.From': 'Migrated from %s',\n 'ChatMigration.To': 'Migrated to %s',\n 'ConnectionStatus.ForceReconnect': 'force reconnect',\n 'ConnectionStatus.ReconnectIn': 'Reconnect in %ds, %s',\n 'ConnectionStatus.Reconnect': 'reconnect',\n 'ConnectionStatus.Reconnecting': 'Reconnecting...',\n 'ConnectionStatus.TimedOut': 'Request timed out, %s',\n 'ConnectionStatus.Waiting': 'Waiting for network...',\n 'Contacts.Count': {\n 'one_value': '%d contact',\n 'other_value': '%d contacts'\n },\n 'Deactivated.Title': 'Too many tabs...',\n 'Deactivated.Subtitle': 'Telegram supports only one active tab with the app.\\nClick anywhere to continue using this tab.',\n 'Deactivated.Version.Title': 'WebK has updated...',\n 'Deactivated.Version.Subtitle': 'Another tab is running a newer version of Telegram.\\nClick anywhere to reload this tab.',\n // \"Drafts\": {\n // \"one_value\": \"%d draft\",\n // \"other_value\": \"%d drafts\",\n // },\n 'General.Keyboard': 'Keyboard',\n 'General.SendShortcut.Enter': 'Send by Enter',\n 'General.SendShortcut.CtrlEnter': 'Send by %s + Enter',\n 'General.SendShortcut.NewLine.ShiftEnter': 'New line by Shift + Enter',\n 'General.SendShortcut.NewLine.Enter': 'New line by Enter',\n 'General.TimeFormat': 'Time Format',\n 'General.TimeFormat.h12': '12-hour',\n 'General.TimeFormat.h23': '24-hour',\n 'ChatBackground.UploadWallpaper': 'Upload Wallpaper',\n 'ChatBackground.Blur': 'Blur Wallpaper Image',\n 'Notifications.Sound': 'Notification Sound',\n 'NewPrivateChat': 'New Private Chat',\n 'NewPoll.OptionLabel': 'Option %d',\n 'Message.Context.Selection.Copy': 'Copy selected',\n 'Message.Context.Selection.Clear': 'Clear selection',\n 'Message.Context.Selection.Delete': 'Delete selected',\n 'Message.Context.Selection.Forward': 'Forward selected',\n 'Message.Context.Selection.SendNow': 'Send Now selected',\n 'Message.Unsupported.Desktop': '__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__',\n 'Message.Unsupported.Mobile': '__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__',\n 'Checkbox.Enabled': 'Enabled',\n 'Checkbox.Disabled': 'Disabled',\n 'Error.PreviewSender.CaptionTooLong': 'Caption is too long.',\n 'PreviewSender.GroupItems': 'Group items',\n 'PreviewSender.SendAlbum': {\n 'one_value': 'Send Album',\n 'other_value': 'Send %d Albums'\n },\n 'Presence.YourChat': 'chat with yourself',\n 'Privacy.Devices': {\n 'one_value': '%1$d device',\n 'other_value': '%1$d devices'\n },\n 'Privacy.Websites': {\n 'one_value': '%1$d website',\n 'other_value': '%1$d websites'\n },\n 'Privacy.SensitiveContent': 'Sensitive Content',\n 'PrivacyModal.Search.Placeholder': 'Add Users or Groups...',\n 'Permissions.NoExceptions': 'No exceptions',\n 'Permissions.ExceptionsCount': {\n 'one_value': '%d exception',\n 'other_value': '%d exceptions'\n },\n 'PWA.Install': 'Install App',\n 'Link.Available': 'Link is available',\n 'Link.Taken': 'Link is already taken',\n 'Link.Invalid': 'Link is invalid',\n 'StickersTab.SearchPlaceholder': 'Search Stickers',\n 'ForwardedFrom': 'Forwarded from %s',\n 'Popup.Avatar.Title': 'Drag to Reposition',\n 'Popup.Unpin.AllTitle': 'Unpin all messages',\n 'Popup.Unpin.HideTitle': 'Hide pinned messages',\n 'Popup.Unpin.HideDescription': 'Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.',\n 'Popup.Unpin.Hide': 'Hide',\n 'Popup.Attach.GroupMedia': 'Group all media',\n 'Popup.Attach.UngroupMedia': 'Ungroup all media',\n 'Popup.Attach.AsMedia': 'Send as media',\n 'Popup.Attach.EnableSpoilers': 'Hide all with spoilers',\n 'Popup.Attach.RemoveSpoilers': 'Remove all spoilers',\n 'TwoStepAuth.EmailCodeChangeEmail': 'Change Email',\n 'MarkupTooltip.LinkPlaceholder': 'Enter URL...',\n 'MediaViewer.Context.Download': 'Download',\n 'Profile': 'Profile',\n 'Saved': 'Saved',\n 'Deleted': 'Deleted',\n 'ReportBug': 'Report Bug',\n 'Notifications.Count': {\n 'one_value': '%d notification',\n 'other_value': '%d notifications'\n },\n 'Notifications.Forwarded': {\n 'one_value': 'Forwarded %d message',\n 'other_value': 'Forwarded %d messages'\n },\n 'Notifications.New': 'New notification',\n 'PushNotification.Action.Mute1d': 'Mute background alerts for 1 day',\n 'PushNotification.Action.Settings': 'Background alerts settings',\n 'PushNotification.Action.Mute1d.Mobile': 'Mute for 24H',\n 'PushNotification.Action.Settings.Mobile': 'Alerts settings',\n 'PushNotification.Message.NoPreview': 'You have a new message',\n 'LogOut.Description': 'Are you sure you want to log out?\\n\\nNote that you can seamlessly use Telegram on all your devices at once.',\n // \"PushNotification.Action.Mute1d.Success\": \"Notification settings were successfully saved.\",\n // it is from iOS\n 'VoiceChat.DiscussionGroup': 'discussion group',\n 'PaymentInfo.CVV': 'CVV Code',\n 'PaymentInfo.Card.Title': 'Enter your card information',\n 'PaymentInfo.Billing.Title': 'Enter your billing address',\n 'PaymentInfo.Done': 'PROCEED TO CHECKOUT',\n 'PaymentCard.Error.Invalid': 'Invalid card number',\n 'PaymentCard.Error.Incomplete': 'Incomplete card number',\n 'LimitReached.Ok': 'OK, GOT IT',\n 'Username.Purchase': '**This username is already taken.** However, it is currently available for purchase. [Learn more…]()',\n 'Video.Unsupported.Desktop': '__Unfortunately, this video can\\'t be played on Telegram Web. Try opening it with our [desktop app](https://getdesktop.telegram.org/) instead.__',\n 'Video.Unsupported.Mobile': '__Unfortunately, this video can\\'t be played on Telegram Web. Try opening it with our [mobile app](https://telegram.org/dl/) instead.__',\n\n // * android\n 'AccDescrEditing': 'Editing',\n 'ActionCreateChannel': 'Channel created',\n 'ActionCreateGroup': 'un1 created the group',\n 'ActionChangedTitle': 'un1 changed the group name to un2',\n 'ActionRemovedPhoto': 'un1 removed the group photo',\n 'ActionChangedPhoto': 'un1 changed the group photo',\n 'ActionChangedVideo': 'un1 changed the group video',\n 'ActionAddUser': 'un1 added un2',\n 'ActionAddUserSelf': 'un1 returned to the group',\n 'ActionAddUserSelfYou': 'You returned to the group',\n 'ActionAddUserSelfMega': 'un1 joined the group',\n 'ActionLeftUser': 'un1 left the group',\n 'ActionKickUser': 'un1 removed un2',\n 'ActionInviteUser': 'un1 joined the group via invite link',\n 'ActionPinnedNoText': 'un1 pinned a message',\n 'ActionMigrateFromGroup': 'This group was upgraded to a supergroup',\n 'ActionYouScored': 'You scored %1$s',\n 'ActionUserScored': 'un1 scored %1$s',\n 'ActionYouScoredInGame': 'You scored %1$s in un2',\n 'ActionUserScoredInGame': 'un1 scored %1$s in un2',\n 'AndOther': {\n 'one_value': 'and %1$d other',\n 'other_value': 'and %1$d others'\n },\n 'AttachPhoto': 'Photo',\n 'AttachVideo': 'Video',\n 'AttachGif': 'GIF',\n 'AttachLocation': 'Location',\n 'AttachLiveLocation': 'Live Location',\n 'AttachContact': 'Contact',\n // \"AttachDocument\": \"File\",\n 'AttachSticker': 'Sticker',\n 'AttachAudio': 'Voice message',\n 'AttachRound': 'Video message',\n 'AttachGame': 'Game',\n 'Bot': 'bot',\n // \"ChannelJoined\": \"You joined this channel\",\n 'ChannelMegaJoined': 'You joined this group',\n 'EnterChannelName': 'Channel name',\n 'DescriptionOptionalPlaceholder': 'Description (optional)',\n 'DescriptionPlaceholder': 'Description',\n 'DiscussionStarted': 'Discussion started',\n 'Draft': 'Draft',\n 'FilterAlwaysShow': 'Include Chats',\n 'FilterNeverShow': 'Exclude Chats',\n 'FilterInclude': 'Included Chats',\n 'FilterExclude': 'Excluded Chats',\n 'FilterChatTypes': 'Chat types',\n 'FilterChats': 'Chats',\n 'FilterNew': 'New Folder',\n 'Filters': 'Folders',\n 'FilterRecommended': 'Recommended Folders',\n 'FilterShowMoreChats': {\n 'one_value': 'Show %1$d More Chat',\n 'other_value': 'Show %1$d More Chats'\n },\n 'ForwardedMessageCount': {\n 'one_value': 'Forwarded message',\n 'other_value': '%1$d forwarded messages'\n },\n 'FromYou': 'You',\n 'Add': 'Add',\n 'Chats': {\n 'one_value': '%1$d chat',\n 'other_value': '%1$d chats'\n },\n 'Channels': {\n 'one_value': '%1$d channel',\n 'other_value': '%1$d channels'\n },\n 'Comments': {\n 'one_value': '%1$d Comment',\n 'other_value': '%1$d Comments'\n },\n 'Groups': {\n 'one_value': '%1$d group',\n 'other_value': '%1$d groups'\n },\n 'Users': {\n 'one_value': '%1$d user',\n 'other_value': '%1$d users'\n },\n 'Members': {\n 'one_value': '%1$d member',\n 'other_value': '%1$d members'\n },\n 'messages': {\n 'one_value': '%1$d message',\n 'other_value': '%1$d messages'\n },\n 'UsernameHelpLink': 'This link opens a chat with you:\\n%1$s',\n 'NewChannel': 'New Channel',\n 'NewGroup': 'New Group',\n 'Contacts': 'Contacts',\n 'SavedMessages': 'Saved Messages',\n 'Settings': 'Settings',\n 'SettingsHelp': 'Help',\n 'General': 'General',\n 'TextSize': 'Message Text Size',\n 'ChatBackground': 'Chat Background',\n 'EnableAnimations': 'Enable Animations',\n 'AutoDownloadMedia': 'Auto-Download Media',\n 'AutodownloadContacts': 'Contacts',\n 'AutodownloadPrivateChats': 'Private Chats',\n 'AutodownloadGroupChats': 'Group Chats',\n 'AutodownloadChannels': 'Channels',\n 'AutoplayGIF': 'GIFs',\n 'AutoplayVideo': 'Videos',\n 'NotificationsForGroups': 'Notifications for groups',\n 'NotificationsForPrivateChats': 'Notifications for private chats',\n 'NotificationsForChannels': 'Notifications for channels',\n 'NotificationsPrivateChats': 'Private Chats',\n 'NotificationsGroups': 'Groups',\n 'NotificationsChannels': 'Channels',\n 'NotificationsOther': 'Other',\n 'MarkAsUnread': 'Mark as unread',\n 'MarkAsRead': 'Mark as read',\n 'ContactJoined': 'Contact joined Telegram',\n 'Loading': 'Loading...',\n 'Unblock': 'Unblock',\n 'BlockedUsers': 'Blocked Users',\n 'BlockedUsersInfo': 'Blocked users will not be able to contact you and will not see your Last Seen time.',\n 'BlockedEmpty': 'None',\n 'TwoStepVerification': 'Two-Step Verification',\n 'TwoStepVerificationTitle': 'Two-Step Verification',\n 'PinnedMessage': 'Pinned Message',\n 'PinnedMessagesCount': {\n 'one_value': 'Pinned Message',\n 'other_value': '%1$d Pinned Messages'\n },\n // \"PreviousPinnedMessage\": \"Previous Message\",\n 'PrivacyExceptions': 'Exceptions',\n 'PrivacyLastSeen': 'Last Seen & Online',\n 'PrivacySettings': 'Privacy and Security',\n 'PrivacyTitle': 'Privacy',\n 'PrivacyPhone': 'Phone Number',\n 'PrivacyPhoneTitle': 'Who can see my phone number?',\n 'PrivacyPhoneTitle2': 'Who can find me by my number?',\n 'PrivacyPhoneInfo': 'Users who have your number saved in their contacts will also see it on Telegram.',\n 'PrivacyPhoneInfo3': 'Users who add your number to their contacts will see it on Telegram only if they are your contacts.',\n 'PrivacyProfilePhoto': 'Profile Photos',\n 'PrivacyProfilePhotoTitle': 'Who can see my profile photos & videos?',\n 'PrivacyP2PHeader': 'Peer-to-Peer',\n 'PrivacyForwardsTitle': 'Who can add a link to my account when forwarding my messages?',\n 'Reminders': 'Reminders',\n 'ScheduledMessages': 'Scheduled Messages',\n 'LastSeenTitle': 'Who can see your Last Seen time?',\n 'SessionsTitle': 'Active Sessions',\n 'CurrentSession': 'This device',\n 'TerminateAllSessions': 'Terminate All Other Sessions',\n 'TerminateSessionText': 'Are you sure you want to terminate this session?',\n 'OtherSessions': 'Active sessions',\n 'AreYouSureDeleteSingleMessage': 'Are you sure you want to delete this message?',\n 'AreYouSureDeleteFewMessages': 'Are you sure you want to delete these messages?',\n 'AreYouSureDeleteSingleMessageMega': 'Are you sure you want to delete this message for everyone?',\n 'AreYouSureDeleteFewMessagesMega': 'Are you sure you want to delete these messages for everyone?',\n 'AreYouSureDeleteAndExitName': 'Are you sure you want to delete and leave the group **%1$s**?',\n 'AreYouSureDeleteThisChatSavedMessages': 'Are you sure you want to delete **Saved Messages**?',\n 'AreYouSureDeleteThisChatWithUser': 'Are you sure you want to delete the chat with **%1$s**?',\n 'AreYouSureSessionTitle': 'Terminate session',\n 'AreYouSureSessionsTitle': 'Terminate sessions',\n 'AreYouSureSessions': 'Are you sure you want to terminate all other sessions?',\n 'Terminate': 'Terminate',\n 'WhoCanCallMe': 'Who can call me?',\n 'WhoCanAddMe': 'Who can add me to group chats?',\n 'ArchivedChats': 'Archived Chats',\n 'Cancel': 'Cancel',\n 'HistoryCleared': 'History was cleared',\n 'Archive': 'Archive',\n 'Unarchive': 'Unarchive',\n 'Delete': 'Delete',\n 'Reply': 'Reply',\n 'Edit': 'Edit',\n 'Forward': 'Forward',\n 'CopyLink': 'Copy Link',\n 'Copy': 'Copy',\n 'Search': 'Search',\n 'LinkCopied': 'Link copied to clipboard',\n 'LinkCopiedPrivateInfo': 'This link will only work for members of this chat.',\n 'GroupAddMembers': 'Add Members',\n 'SendMessageTo': 'Add people...',\n // \"SelectChat\": \"Select Chat\",\n 'JumpToDate': 'Jump to Date',\n 'Caption': 'Caption',\n 'Message': 'Message',\n 'Poll': 'Poll',\n 'SharedFilesTab2': 'Files',\n 'SharedMediaTab2': 'Media',\n // \"SharedMediaTabFull2\": \"Shared Media\",\n // \"SharedGroupsTab2\": \"Groups\",\n 'SharedLinksTab2': 'Links',\n 'SharedMusicTab2': 'Music',\n 'SharedVoiceTab2': 'Voice',\n // \"SharedGIFsTab2\": \"GIFs\",\n 'NewPoll': 'New Poll',\n 'PollOptions': 'Poll options',\n 'AskAQuestion': 'Ask a Question',\n 'AddAnExplanationInfo': 'Users will see this text after choosing the wrong answer, good for educational purposes.',\n 'AccDescrQuizExplanation': 'Explanation',\n 'PhoneCopied': 'Phone copied to clipboard',\n 'UsernameCopied': 'Username copied to clipboard.',\n // \"HashtagCopied\": \"Hashtag copied to clipboard.\",\n 'BioCopied': 'Bio copied to clipboard.',\n 'UserBio': 'Bio',\n 'Username': 'Username',\n 'UsernameAlso': 'also %1$s',\n 'UsernameHelp': 'You can choose a username on **Telegram**. If you do, people will be able to find you by this username and contact you without needing your phone number.\\n\\nYou can use **a–z**, **0–9** and underscores. Minimum length is **5** characters.',\n 'Phone': 'Phone',\n 'Notifications': 'Notifications',\n 'AreYouSureDeleteContact': 'Are you sure you want to delete this contact?',\n 'AreYouSureDeleteAndExit': 'Are you sure you want to delete and leave the group?',\n 'AreYouSureDeleteAndExitChannel': 'Do you want to delete and leave the channel?',\n 'DeleteContact': 'Delete contact',\n 'GroupType': 'Group Type',\n 'ChannelType': 'Channel Type',\n 'TypePrivate': 'Private',\n 'TypePublic': 'Public',\n 'TypePrivateGroup': 'Private',\n 'TypePublicGroup': 'Public',\n 'GroupMembers': 'Members',\n 'DeleteMega': 'Delete Group',\n 'DeleteMegaMenu': 'Delete group',\n 'DeleteAndExitButton': 'Delete and Leave Group',\n 'ChannelDelete': 'Delete Channel',\n 'ChannelDeleteMenu': 'Delete channel',\n 'ChannelPermissions': 'Permissions',\n 'ChannelPermissionsHeader': 'What can members of this group do?',\n 'ChannelAddException': 'Add Exception',\n 'ChannelBlockedUsers': 'Removed users',\n 'NoBlockedUsers': 'No removed users',\n 'UserRestrictions': 'User Permissions',\n 'UserRestrictionsDisabled': 'This option is disabled for all members in Group Permissions',\n 'UserRestrictionsCanDo': 'What can this user do?',\n 'UserRestrictionsRead': 'Read Messages',\n 'UserRestrictionsSend': 'Send Messages',\n 'UserRestrictionsSendMedia': 'Send Media',\n 'UserRestrictionsSendPolls': 'Send Polls',\n 'UserRestrictionsSendStickers': 'Send Stickers and GIFs',\n 'UserRestrictionsEmbedLinks': 'Embed Links',\n 'UserRestrictionsChangeInfo': 'Change Chat Info',\n 'UserRestrictionsPinMessages': 'Pin Messages',\n 'UserRestrictionsInviteUsers': 'Add Users',\n // \"UserRestrictionsNoRead\": \"can't read\",\n 'UserRestrictionsNoSend': 'can\\'t send messages',\n 'UserRestrictionsNoSendMedia': 'no media',\n 'UserRestrictionsNoSendPolls': 'no polls',\n 'UserRestrictionsNoSendStickers': 'no stickers & GIFs',\n 'UserRestrictionsNoEmbedLinks': 'no embed links',\n 'UserRestrictionsNoChangeInfo': 'can\\'t change Info',\n 'UserRestrictionsNoPinMessages': 'no pins',\n 'UserRestrictionsNoInviteUsers': 'can\\'t add users',\n 'UserRestrictionsBlock': 'Ban and remove from group',\n 'ChannelPublic': 'Public Channel',\n 'MegaPublic': 'Public Group',\n // \"MegaLocation\": \"Location-based Group\",\n 'ChannelPublicInfo': 'Public channels can be found in search, anyone can join them.',\n 'MegaPublicInfo': 'Public groups can be found in search, chat history is available to everyone and anyone can join.',\n 'ChannelPrivate': 'Private Channel',\n 'MegaPrivate': 'Private Group',\n 'ChannelPrivateInfo': 'Private channels can only be joined via an invite link.',\n 'MegaPrivateInfo': 'Private groups can only be joined if you were invited or have an invite link.',\n 'ChannelPrivateLinkHelp': 'People can join your channel by following this link. You can revoke the link any time.',\n 'MegaPrivateLinkHelp': 'People can join your group by following this link. You can revoke the link any time.',\n 'RevokeButton': 'Revoke',\n 'RevokeLink': 'Revoke Link',\n 'RevokeAlert': 'Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.',\n 'SetUrlPlaceholder': 'Link',\n 'Subscribers': {\n 'one_value': '%1$d subscriber',\n 'other_value': '%1$d subscribers'\n },\n 'SearchGifsTitle': 'Search GIFs',\n 'PinMessageAlert': 'Pin this message in the group?',\n 'PinMessageAlertTitle': 'Pin message',\n 'PinMessageAlertChannel': 'Do you want to pin this message in this channel?',\n 'PinMessageAlertChat': 'Do you want to pin this message at the top of the chat?',\n 'UnpinMessageAlertTitle': 'Unpin message',\n 'UnpinMessageAlert': 'Do you want to unpin this message?',\n 'PinNotify': 'Notify all members',\n 'PinMessage': 'Pin',\n 'UnpinMessage': 'Unpin',\n 'PinAlsoFor': 'Also pin for %1$s',\n 'DeleteMessagesTitle': 'Delete %1$s',\n 'DeleteSingleMessagesTitle': 'Delete message',\n 'DeleteMessagesOption': 'Unsend My Messages',\n 'DeleteMessagesOptionAlso': 'Also delete for %1$s',\n 'DeleteForAll': 'Delete for all members',\n 'DeleteMessagesTextGroup': 'You can also delete the %1$s you sent from the inboxes of other group members by checking \"Unsend my messages\".',\n 'LeaveChannel': 'Leave Channel',\n 'LeaveChannelMenu': 'Leave channel',\n 'ChannelLeaveAlertWithName': 'Are you sure you want to leave **%1$s**?',\n 'LeaveMegaMenu': 'Leave group',\n 'DeleteChatUser': 'Delete chat',\n 'PleaseEnterCurrentPassword': 'Enter your password',\n 'PleaseEnterFirstPassword': 'Enter a password',\n 'PleaseReEnterPassword': 'Re-enter your password',\n 'Continue': 'Continue',\n 'YourEmailSkip': 'Skip',\n 'YourEmailSkipWarning': 'Warning',\n 'YourEmailSkipWarningText': 'No, seriously.\\n\\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.',\n 'TurnPasswordOffQuestionTitle': 'Disable password',\n 'TurnPasswordOffQuestion': 'Are you sure you want to disable your password?',\n 'Disable': 'Disable',\n 'TwoStepVerificationSetPassword': 'Set Password',\n 'TwoStepVerificationPasswordSet': 'Password Set!',\n 'TwoStepVerificationPasswordSetInfo': 'This password will be required when you log in on a new device in addition to the code you get in the SMS.',\n 'TwoStepVerificationPasswordReturnSettings': 'Return to Settings',\n 'RecoveryEmail': 'Recovery email',\n 'RecoveryEmailTitle': 'Recovery Email',\n 'ResendCode': 'Resend code',\n 'PasswordAsHintError': 'Hint must be different from your password',\n 'AddStickersCount': 'ADD %1$s',\n 'RemoveStickersCount': 'REMOVE %1$s',\n 'Stickers': {\n 'one_value': '%1$d sticker',\n 'other_value': '%1$d stickers'\n },\n 'HidAccount': 'The account was hidden by the user',\n 'TelegramFeatures': 'Telegram Features',\n 'SetColor': 'Set a color',\n 'Open': 'Open',\n 'OpenUrlTitle': 'Open Link',\n 'OpenUrlAlert2': 'Do you want to open %1$s?',\n 'FilterNoChatsToDisplay': 'Folder is empty',\n 'FilterNoChatsToDisplayInfo': 'No chats currently belong to this folder.',\n 'SupportStatus': 'support',\n 'Lately': 'last seen recently',\n 'WithinAWeek': 'last seen within a week',\n 'WithinAMonth': 'last seen within a month',\n 'ALongTimeAgo': 'last seen a long time ago',\n 'Online': 'online',\n 'MessageScheduleSend': 'Send Now',\n 'MessageScheduleEditTime': 'Reschedule',\n 'YouLeft': 'You left this group',\n 'Recent': 'Recent',\n 'Of': '%1$d of %2$d',\n 'NoResult': 'No results',\n 'Updating': 'Updating...',\n 'Emoji': 'Emoji',\n 'AddContactTitle': 'Add Contact',\n 'HiddenName': 'Deleted Account',\n 'Seconds': {\n 'one_value': '%1$d second',\n 'other_value': '%1$d seconds'\n },\n 'Minutes': {\n 'one_value': '%1$d minute',\n 'other_value': '%1$d minutes'\n },\n 'Hours': {\n 'one_value': '%1$d hour',\n 'other_value': '%1$d hours'\n },\n 'Days': {\n 'one_value': '%1$d day',\n 'other_value': '%1$d days'\n },\n 'Weeks': {\n 'one_value': '%1$d week',\n 'other_value': '%1$d weeks'\n },\n 'Months': {\n 'one_value': '%1$d month',\n 'other_value': '%1$d months'\n },\n 'Years': {\n 'one_value': '%1$d year',\n 'other_value': '%1$d years'\n },\n 'TodayAtFormattedWithToday': 'today at %1$s',\n 'formatDateAtTime': '%1$s at %2$s',\n 'JoinByPeekChannelTitle': 'Join Channel',\n 'JoinByPeekGroupTitle': 'Join Group',\n 'YouWereKicked': 'you were removed',\n 'ViaBot': 'via',\n 'InviteExpired': 'This invite link has expired.',\n 'NoUsernameFound': 'There is no Telegram account with this username.',\n 'PrivacyDeleteCloudDrafts': 'Delete All Cloud Drafts',\n 'AreYouSureClearDraftsTitle': 'Delete cloud drafts',\n 'AreYouSureClearDrafts': 'Are you sure you want to delete all cloud drafts?',\n 'BotInfoTitle': 'What can this bot do?',\n 'ChatYourSelf': 'forward here to save',\n 'GroupEmptyTitle1': 'You have created a **group**.',\n 'GroupEmptyTitle2': 'Groups can have:',\n 'GroupDescription1': 'Up to 200,000 members',\n 'GroupDescription2': 'Persistent chat history',\n 'GroupDescription3': 'Public links such as t.me/title',\n 'GroupDescription4': 'Admins with different rights',\n 'ChatYourSelfDescription1': 'Forward messages here to save them',\n 'ChatYourSelfDescription2': 'Send media and files to store them',\n 'ChatYourSelfDescription3': 'Access this chat from any device',\n 'ChatYourSelfDescription4': 'Use search to quickly find things',\n 'ChatYourSelfTitle': 'Your cloud storage',\n 'ActionYouCreateGroup': 'You created the group',\n 'NoMessages': 'No messages here yet...',\n 'NoScheduledMessages': 'No scheduled messages here yet...',\n 'NoMessagesGreetingsDescription': 'Send a message or tap the greeting below.',\n 'InviteToGroupError': 'Sorry, you can\\'t add this user to groups because of user\\'s privacy settings.',\n 'InviteToChannelError': 'Sorry, you can\\'t add this user to channels because of user\\'s privacy settings.',\n 'AddMembersAlertTitle': 'Add %1$s',\n 'AddOneMemberAlertTitle': 'Add member',\n 'AddMembersAlertNamesText': 'Are you sure you want to add %1$s to **%2$s**?',\n 'AddMembersAlertCountText': 'Are you sure you want to add %1$s to **%2$s**?',\n 'AddMembersForwardMessages': 'Show the last 100 messages to the new members',\n 'AddOneMemberForwardMessages': 'Show the last 100 messages to **%1$s**',\n 'PinToTopLimitReached2': 'Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.',\n 'FiltersSetupPinAlert': 'Set Up Folders',\n 'AppName': 'Telegram',\n 'OK': 'OK',\n 'PinFolderLimitReached': 'Sorry, you can\\'t pin any more chats to the top.',\n 'Send': 'Send',\n 'ChannelJoin': 'JOIN',\n 'Yesterday': 'yesterday',\n 'LeaveAComment': 'Leave a comment',\n 'ViewInChat': 'View in chat',\n 'LinkNotFound': 'Unfortunately, you can\\'t access this message. You are not a member of the chat where it was posted.',\n 'Create': 'Create',\n 'ViewDiscussion': 'View discussion',\n 'MessageScheduledUntilOnline': 'Scheduled until online',\n 'ReportChat': 'Report',\n 'ReportChatSpam': 'Spam',\n // \"ReportChatFakeAccount\": \"Fake Account\",\n 'ReportChatViolence': 'Violence',\n 'ReportChatPornography': 'Pornography',\n 'ReportChatChild': 'Child Abuse',\n 'ReportChatOther': 'Other',\n 'ReportChatDescription': 'Description',\n 'ReportInfo': 'Please enter any additional details relevant to your report.',\n 'ReportSentInfo': 'Telegram moderators will review your report.\\nThank you for your cooperation!',\n 'ReportHint': 'Additional details...',\n 'ChatHistory': 'Chat history for new members',\n 'ShareContact': 'Share contact',\n 'SendMessageTitle': 'Send message',\n 'SendContactToGroupText': 'Do you want to send this contact to **%1$s**?',\n 'ChannelBroadcast': 'Broadcast',\n 'ChannelSilentBroadcast': 'Silent Broadcast',\n 'Comment': 'Comment',\n 'SendAnonymously': 'Send anonymously',\n 'DiscardVoiceMessageTitle': 'Discard Voice Message',\n 'DiscardVoiceMessageDescription': 'Are you sure you want to stop recording and discard your voice message?',\n 'DiscardVoiceMessageAction': 'Discard',\n 'AddContact': 'Add to contacts',\n 'BlockUser': 'Block user',\n 'MobileHidden': 'Mobile hidden',\n 'MobileHiddenExceptionInfo': 'Phone number will be visible once %1$s adds you as a contact.',\n 'FirstName': 'First name (required)',\n 'LastName': 'Last name (optional)',\n 'AreYouSureBlockContact2': 'Are you sure you want to block **%1$s**?',\n 'UserBlocked': 'User blocked',\n 'UserUnblocked': 'User unblocked',\n 'AudioUnknownArtist': 'Unknown artist',\n 'AudioUnknownTitle': 'Unknown title',\n 'LogOut': 'Log out',\n 'OnlineCount': {\n 'one_value': '%1$d online',\n 'other_value': '%1$d online'\n },\n 'EditedMessage': 'edited',\n 'GlobalSearch': 'Global search',\n 'SearchMessages': 'Messages',\n 'SearchAllChatsShort': 'Chats',\n 'ClearButton': 'Clear',\n 'FilterAllChats': 'All Chats',\n 'FilterAllChatsShort': 'All',\n 'Call': 'Call',\n 'VideoCall': 'Video Call',\n 'CallMessageOutgoing': 'Outgoing Call',\n 'CallMessageIncoming': 'Incoming Call',\n 'CallMessageVideoOutgoing': 'Outgoing Video Call',\n 'CallMessageVideoIncoming': 'Incoming Video Call',\n 'VoipExchangingKeys': 'Exchanging encryption keys',\n 'VoipUnmute': 'Unmute',\n 'SavingContentTitle': 'Saving content',\n 'RestrictSavingContent': 'Restrict saving content',\n 'RestrictSavingContentInfoGroup': 'Members won\\'t be able to copy, save and forward content from this group.',\n 'RestrictSavingContentInfoChannel': 'Subscribers won\\'t be able to copy, save and forward content from this channel.',\n 'ClearOtherSessionsHelp': 'Logs out all devices except for this one.',\n 'SessionsListInfo': 'The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.',\n 'SponsoredMessage': 'sponsored',\n 'OpenChannelPost': 'VIEW POST',\n 'FilterNameHint': 'Folder name',\n 'BotStart': 'START',\n 'BotUnblock': 'RESTART',\n 'BotStop': 'Stop bot',\n 'BotRestart': 'Restart bot',\n 'ShareYouPhoneNumberTitle': 'Share your phone number?',\n 'AreYouSureShareMyContactInfoBot': 'The bot will know your phone number. This can be useful for integration with other services.',\n 'DistanceUnitsTitle': 'Distance units',\n 'DistanceUnitsKilometers': 'Kilometers',\n 'DistanceUnitsMiles': 'Miles',\n 'PeopleNearby': 'People Nearby',\n 'MakeMyselfVisible': 'Make Myself Visible',\n 'MakeMyselfVisibleTitle': 'Show Your Profile?',\n 'MakeMyselfVisibleInfo': 'Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\\n\\nYour phone number will remain hidden.',\n 'StopShowingMe': 'Stop Showing Me',\n 'PeopleNearbyInfo2': 'Exchange contact info with people nearby and find new friends.',\n 'NearbyCreateGroup': 'Create a Local group',\n 'AwayTo': '%1$s away',\n 'MessagePreview': 'Message Preview',\n 'KMetersAway2': '%1$s km away',\n 'MetersAway2': '%1$s m away',\n 'MilesAway': '%1$s mi away',\n 'FootsAway': '%1$s ft away',\n 'PeopleNearbyHeader': 'People nearby',\n 'ChatsNearbyHeader': 'Groups nearby',\n 'ChatLocation': 'Location',\n 'RequestToJoinGroupDescription': 'This group accepts new members only after they are approved by its admins.',\n 'RequestToJoinChannelDescription': 'This channel accepts new subscribers only after they are approved by its admins.',\n 'RequestToJoinSent': 'Join request sent',\n 'RequestToJoinGroupApproved': 'Your request to join the group was approved',\n 'RequestToJoinChannelApproved': 'Your request to join the channel was approved',\n 'Update': 'UPDATE',\n 'Reactions': 'Reactions',\n 'DoubleTapSetting': 'Quick Reaction',\n 'EnableReactions': 'Enable Reactions',\n 'EnableReactionsChannelInfo': 'Allow subscribers to react to channel posts.',\n 'EnableReactionsGroupInfo': 'Allow members to react to group messages.',\n 'AvailableReactions': 'Available reactions',\n 'NobodyViewed': 'Nobody viewed',\n 'MessageSeen': {\n 'one_value': 'Seen',\n 'other_value': '%1$d Seen'\n },\n // \"Close\": \"Close\",\n 'DataSettings': 'Data and Storage',\n 'GroupsAndChannelsHelp': 'Change who can add you to groups and channels.',\n 'SessionsInfo': 'Control your sessions on other devices.',\n 'StickersBotInfo': 'Artists are welcome to add their own sticker sets using our @stickers bot.',\n 'AutomaticMediaDownload': 'Automatic media download',\n 'AutoDownloadPhotos': 'Photos',\n 'AutoDownloadVideos': 'Videos',\n 'AutoDownloadFiles': 'Files',\n 'AutoDownloadOnAllChats': 'On in all chats',\n 'AutoDownloadUpToOnAllChats': 'Up to %1$s in all chats',\n 'AutoDownloadOff': 'Off',\n 'AutoDownloadOnUpToFor': 'Up to %1$s for %2$s',\n 'AutoDownloadOnFor': 'On for %1$s',\n 'AutoDownloadContacts': 'Contacts',\n 'AutoDownloadPm': 'PM',\n 'AutoDownloadGroups': 'Groups',\n 'AutoDownloadChannels': 'Channels',\n 'AutoDownloadAudioInfo': 'Voice messages are tiny, so they\\'re always downloaded automatically.',\n 'AutoplayMedia': 'Auto-play media',\n 'AutoDownloadPhotosTitle': 'Auto-download photos',\n 'AutoDownloadVideosTitle': 'Auto-download videos and GIFs',\n 'AutoDownloadFilesTitle': 'Auto-download files and music',\n 'AutoDownloadMaxFileSize': 'Maximum file size',\n 'AutodownloadSizeLimitUpTo': 'up to %1$s',\n 'ResetAutomaticMediaDownload': 'Reset Auto-Download Settings',\n 'ResetAutomaticMediaDownloadAlertTitle': 'Reset settings',\n 'ResetAutomaticMediaDownloadAlert': 'Are you sure you want to reset auto-download settings?',\n 'Reset': 'Reset',\n 'SendMessageAsTitle': 'Send message as...',\n 'Devices': 'Devices',\n 'LanguageName': 'English',\n 'EditCantEditPermissionsPublic': 'This permission is not available in public groups.',\n 'VoipUserMicrophoneIsOff': '%s\\'s microphone is off',\n 'VoipUserCameraIsOff': '%s\\'s camera is off',\n 'PrivacyPhoneInfo4': 'This public link opens a chat with you:',\n 'ReportChatIllegalDrugs': 'Illegal Drugs',\n 'ReportChatPersonalDetails': 'Personal Details',\n 'VoipPeerIncompatible': '**%1$s**\\'s app is using an incompatible protocol. They need to update their app before you can call them.',\n 'TelegramFeaturesUrl': 'https://t.me/TelegramTips',\n 'ScamMessage': 'SCAM',\n 'FakeMessage': 'FAKE',\n 'TextCopied': 'Text copied to clipboard',\n 'PaymentInvoice': 'INVOICE',\n 'PaymentTestInvoice': 'TEST INVOICE',\n 'PaymentReceipt': 'Receipt',\n 'PaymentCheckout': 'Checkout',\n 'PaymentTransactionTotal': 'Total',\n 'PaymentTip': 'Tip',\n 'PaymentTipOptional': 'Tip (Optional)',\n 'PaymentCheckoutPay': 'PAY %1$s',\n 'PaymentCheckoutMethod': 'Payment method',\n 'PaymentCheckoutProvider': 'Payment provider',\n 'PaymentCardNumber': 'Card Number',\n 'PaymentCardSavePaymentInformation': 'Save Payment Information',\n 'PaymentCardInfo': 'Payment info',\n 'PaymentCardSavePaymentInformationInfoLine1': 'You can save your payment info for future use. It will be stored directly with the payment provider. Telegram has no access to your credit card data.',\n 'Done': 'Done',\n 'PaymentShippingMethod': 'Shipping methods',\n 'PaymentNoShippingMethod': 'Sorry, it is not possible to deliver to your address.',\n 'PaymentShippingInfo': 'Shipping Information',\n 'PaymentShippingAddress': 'Shipping address',\n 'PaymentShippingAddress1Placeholder': 'Address 1 (Street)',\n 'PaymentShippingAddress2Placeholder': 'Address 2 (Street)',\n 'PaymentShippingCityPlaceholder': 'City',\n 'PaymentShippingStatePlaceholder': 'State',\n 'PaymentShippingCountry': 'Country',\n 'PaymentShippingZipPlaceholder': 'Postcode',\n 'PaymentShippingReceiver': 'Receiver',\n 'PaymentShippingName': 'Full Name',\n 'PaymentShippingEmailPlaceholder': 'Email',\n 'PaymentCheckoutPhoneNumber': 'Phone number',\n 'PaymentCheckoutShippingMethod': 'Shipping method',\n 'PaymentShippingSave': 'Save Shipping Information',\n 'PaymentShippingSaveInfo': 'You can save your shipping info for future use.',\n 'PaymentInfoHint': 'You paid **%1$s** for **%2$s**.',\n 'PrivacyPayments': 'Payments',\n 'PrivacyPaymentsClearInfo': 'You can delete your shipping info and instruct all payment providers to remove your saved credit cards. Note that Telegram never stores your credit card data.',\n 'PrivacyPaymentsClear': 'Clear Payment and Shipping Info',\n 'PrivacyPaymentsClearAlertTitle': 'Clear payment info',\n 'PrivacyPaymentsClearAlertText': 'Are you sure you want to clear your payment and shipping info?',\n 'PrivacyPaymentsPaymentInfoCleared': 'Payment info cleared.',\n 'PrivacyPaymentsShippingInfoCleared': 'Shipping info cleared.',\n 'PrivacyPaymentsPaymentShippingCleared': 'Payment and shipping info cleared.',\n 'PrivacyClearShipping': 'Shipping info',\n 'PrivacyClearPayment': 'Payment info',\n 'Clear': 'Clear',\n 'Save': 'Save',\n 'PaymentCheckoutName': 'Name',\n 'ClearRecentStickersAlertTitle': 'Clear recent stickers',\n 'ClearRecentStickersAlertMessage': 'Do you want to clear all your recent stickers?',\n 'PremiumStickersShort': 'Premium',\n 'FavoriteStickers': 'Favorites',\n 'AddToFavorites': 'Add to Favorites',\n 'AddedToFavorites': 'Sticker added to Favorites.',\n 'RemovedFromFavorites': 'Sticker was removed from Favorites',\n 'RemovedFromRecent': 'Sticker was removed from Recent',\n 'DeleteFromFavorites': 'Delete from Favorites',\n 'DeleteFromRecent': 'Remove from Recent',\n 'NewChatsFromNonContacts': 'New chats from unknown users',\n 'ArchiveAndMute': 'Archive and Mute',\n 'ArchiveAndMuteInfo': 'Automatically archive and mute new chats, groups and channels from non-contacts.',\n 'PrivacyVoiceMessages': 'Voice Messages',\n 'PrivacyVoiceMessagesTitle': 'Who can send me voice or video messages?',\n 'PrivacyVoiceMessagesInfo': 'You can restrict who can send you voice or video messages with granular precision.',\n 'PrivacyVoiceMessagesPremiumOnly': 'Only subscribers of *Telegram Premium* can restrict receiving voice messages.',\n 'EmojiCount': {\n 'other_value': '%1$d emoji'\n },\n 'AddEmojiNotFound': 'Emoji pack not found.',\n 'MessageContainsEmojiPack': 'This message contains emoji from %s pack.',\n 'MessageContainsEmojiPacks': {\n 'other_value': 'This message contains emoji from **%d Packs**.'\n },\n 'EmojiPackCount': {\n 'one_value': '%1$d Emoji Pack',\n 'other_value': '%1$d Emoji Packs'\n },\n 'ReactionsAll': 'All',\n 'EnableSomeReactionsInfo': 'Members of the group can use only certain approved emoji as reactions to messages.',\n 'EnableAllReactionsInfo': 'Members of the group can use any emoji as reactions to messages.',\n 'DisableReactionsInfo': 'Members of the group can’t add any reactions to messages.',\n 'OnlyAllowThisReactions': 'Only allow these reactions',\n 'AllReactions': 'All reactions',\n 'SomeReactions': 'Some reactions',\n 'NoReactions': 'No reactions',\n 'LimitReached': 'Limit Reached',\n 'LimitReachedPinDialogs': 'You can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned – or subscribe to **Telegram Premium** to double the limit to **%2$d** chats.',\n 'LimitReachedPinDialogsPremium': 'Sorry, you can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned.',\n 'LimitReachedPinDialogsLocked': 'Sorry, you can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned. We are working to let you increase this limit in the future.',\n 'IncreaseLimit': 'Increase Limit',\n 'LimitFree': 'Free',\n 'LimitPremium': 'Premium',\n 'ActionTTLChanged': 'un1 set messages to auto-delete in %1$s',\n 'ActionTTLYouChanged': 'You set messages to auto-delete in %1$s',\n 'ActionTTLChannelChanged': 'Messages in this channel will be automatically deleted after %1$s',\n 'ActionTTLChannelDisabled': 'Messages in this channel will no longer be automatically deleted',\n 'ActionTTLDisabled': 'un1 disabled the auto-delete timer',\n 'ActionTTLYouDisabled': 'You disabled the auto-delete timer',\n 'UsernamesProfileHeader': 'Username order',\n 'UsernamesProfileHelp': 'Drag and drop links to change the order in which they will be displayed on your info page.',\n 'UsernamesChannelHelp': 'Drag and drop links to change the order in which they will be displayed on the channel info page.',\n 'UsernameLinkEditable': 'tap to edit',\n 'UsernameLinkActive': 'active',\n 'UsernameLinkInactive': 'not active',\n 'UsernameActivateLink': 'Activate link',\n 'UsernameDeactivateLink': 'Deactivate link',\n 'UsernameActivateLinkProfileMessage': 'Do you want to show this link on your info page?',\n 'UsernameDeactivateLinkProfileMessage': 'Do you want to hide this link from your info page?',\n 'UsernameActivateLinkChannelMessage': 'Do you want to show this link on the channel info page?',\n 'UsernameDeactivateLinkChannelMessage': 'Do you want to hide this link from the channel info page?',\n 'Hide': 'Hide',\n 'Show': 'Show',\n 'UsernameActivateErrorTitle': 'Too many active links',\n 'UsernameActivateErrorMessage': 'Sorry, you have too many active public links already. Please hide one of your active public links first.',\n 'ChannelSignMessages': 'Sign Messages',\n // 'ChannelSignMessagesInfo': 'Add names of admins to the messages they post',\n 'TopicWasCreatedAction': '%s was created',\n 'Topics': 'Topics',\n 'ForumToggleDescription': 'The group chat will be divided into topics created by admins or users.',\n 'AnonymousNumber': 'Anonymous Number',\n 'Info': 'Info',\n 'BotSettings': 'Settings',\n 'OpenMessage': 'VIEW MESSAGE',\n 'OpenGroup': 'VIEW GROUP',\n 'CloseTopic': 'Close topic',\n 'RestartTopic': 'Reopen topic',\n 'LimitReachedPinnedTopics': 'Sorry, you can\\'t pin more than %d topics to the top.',\n 'TopicProfileStatus': 'In %s',\n 'AccDescrTopic': 'Topic',\n 'DeleteTopics': {\n 'one_value': 'Delete topic',\n 'other_value': 'Delete topics'\n },\n 'DeleteSelectedTopic': 'Are you sure you want delete %s?',\n 'NewTopic': 'New Topic',\n 'CreateTopicTitle': 'Choose a topic name and icon',\n 'CreateGeneralTopicTitle': 'Choose topic name',\n 'EditTopicHide': 'Show in Topics',\n 'EditTopicHideInfo': 'If the \\'General\\' topic is hidden, group members can pull down in the topic list to view it.',\n 'OpenUrlOption1': 'Log in to %1$s as **%2$s**',\n 'OpenUrlOption2': 'Allow **%1$s** to send me messages',\n 'OtherWebSessions': 'Connected websites',\n 'WebSessionsTitle': 'Logged In with Telegram',\n 'TerminateWebSessionText': 'Are you sure you want to disconnect %1$s?',\n 'Disconnect': 'Disconnect',\n 'TerminateAllWebSessions': 'Disconnect All Websites',\n 'AreYouSureWebSessions': 'Are you sure you want to disconnect all websites where you logged in with Telegram?',\n 'ClearOtherWebSessionsHelp': 'You can log in on websites that support signing in with Telegram.',\n 'TerminateWebSessionInfo': 'Tap to disconnect from your Telegram account.',\n 'EnablePhotoSpoiler': 'Hide with spoiler',\n 'DisablePhotoSpoiler': 'Remove spoiler',\n 'LimitReachedFolders': 'You have reached the limit of **%1$d** folders. You can double the limit to **%2$d** folders by subscribing to **Telegram Premium**.',\n 'LimitReachedFoldersPremium': 'You have reached the limit of **%1$d** folders for this account.',\n 'LimitReachedFoldersLocked': 'You have reached the limit of **%1$d** folders for this account. We are working to let you increase this limit in the future.',\n 'FwdMessageToSavedMessages': 'Message forwarded to **Saved Messages**.',\n 'FwdMessagesToSavedMessages': 'Messages forwarded to **Saved Messages**.',\n 'ColorTheme': 'Color theme',\n 'SendAsFile': 'Send as file',\n 'SendAsFiles': 'Send as files',\n\n // * macos\n 'AccountSettings.Filters': 'Chat Folders',\n 'AccountSettings.Notifications': 'Notifications and Sounds',\n 'AccountSettings.PrivacyAndSecurity': 'Privacy and Security',\n 'AccountSettings.Language': 'Language',\n 'Alert.UserDoesntExists': 'Sorry, this user doesn\\'t seem to exist.',\n 'Alert.Confirm.Discard': 'Discard',\n 'Appearance.Reset': 'Reset to Defaults',\n 'AutoDownloadSettings.Delimeter': ', ',\n 'AutoDownloadSettings.LastDelimeter': ' and ',\n 'Bio.Description': 'Any details such as age, occupation or city.\\nExample: 23 y.o. designer from San Francisco',\n 'Call.Accept': 'Accept',\n 'Call.Decline': 'Decline',\n 'Call.End': 'End',\n 'Call.Camera': 'Camera',\n 'Call.Mute': 'Mute',\n 'Call.Recall': 'Recall',\n 'Call.Close': 'Close',\n 'Call.Screen': 'Screen',\n 'Call.Confirm.Discard.Voice.Header': 'Video Chat in Progress',\n 'Call.Confirm.Discard.Voice.ToVoice.Text': 'Leave video chat in \"%1$@\" and start a new one in \"%2$@\"?',\n 'Call.Confirm.Discard.Voice.ToCall.Text': 'Leave video chat in \"%1$@\" and start a call with \"%2$@\"?',\n 'Call.Confirm.Discard.Call.Header': 'Call in Progress',\n 'Call.Confirm.Discard.Call.ToVoice.Text': 'End call with \"%1$@\" and start a video chat in \"%2$@\"?',\n 'Call.Confirm.Discard.Call.ToCall.Text': 'End call with \"%1$@\" and start a video chat in \"%2$@\"?',\n 'Call.PrivacyErrorMessage': 'Sorry, you cannot call %@ because of their privacy settings.',\n 'Call.StatusRequesting': 'Contacting...',\n 'Call.StatusRinging': 'Ringing...',\n 'Call.StatusConnecting': 'Connecting...',\n 'Call.StatusEnded': 'Call Ended',\n 'Call.StatusFailed': 'Call Failed',\n 'Call.StatusBusy': 'Busy',\n 'Call.StatusCalling': 'is calling you...',\n 'Contacts.PhoneNumber.NotRegistred': 'The person with this phone number is not registered on Telegram yet.',\n 'Channel.UsernameAboutChannel': 'People can share this link with others and can find your channel using Telegram search.',\n 'Channel.UsernameAboutGroup': 'People can share this link with others and find your group using Telegram search.',\n 'Chat.Accessory.Forward': {\n 'one_value': 'Forward Message',\n 'other_value': 'Forward %d Messages'\n },\n 'Chat.Accessory.Forward.You': 'You',\n 'Chat.Accessory.Forward.From': 'From',\n 'Chat.Accessory.Hidden': {\n 'one_value': 'Forward Message (sender\\'s name hidden)',\n 'other_value': 'Forward %d Messages (senders\\' names hidden)'\n },\n 'Chat.Alert.Forward.Action.Another': 'Forward to Another Chat',\n 'Chat.Alert.Forward.Action.Hide1': {\n 'one_value': 'Hide Sender\\'s Name',\n 'other_value': 'Hide Senders\\' Names'\n },\n 'Chat.Alert.Forward.Action.Show1': {\n 'one_value': 'Show Sender\\'s Name',\n 'other_value': 'Show Senders\\' Names'\n },\n 'Chat.Alert.Forward.Action.ShowCaption': {\n 'one_value': 'Show Caption',\n 'other_value': 'Show Captions'\n },\n 'Chat.Alert.Forward.Action.HideCaption': {\n 'one_value': 'Hide Caption',\n 'other_value': 'Hide Captions'\n },\n 'Chat.CopySelectedText': 'Copy Selected Text',\n 'Chat.Confirm.Unpin': 'Would you like to unpin this message?',\n 'Chat.Context.Reacted': '%1$@/%2$@ Reacted',\n 'Chat.Context.ReactedFast': {\n 'other_value': '%d Reacted'\n },\n 'Chat.Date.ScheduledFor': 'Scheduled for %@',\n 'Chat.Date.ScheduledForToday': 'Scheduled for today',\n 'Chat.DropTitle': 'Drop files here to send them',\n 'Chat.DropQuickDesc': 'in a quick way',\n 'Chat.DropAsFilesDesc': 'without compression',\n 'Chat.Edit.Cancel.Text': 'Are you sure you want to discard all changes?',\n 'Chat.Input.ReplyToAnswer': 'Reply to message in topics',\n 'Chat.SendVoice.PrivacyError': '%@ doesn\\'t accept voice and video messages',\n 'Chat.Service.Call.Cancelled': 'Cancelled',\n 'Chat.Service.Call.Missed': 'Missed',\n 'Chat.Service.PeerJoinedTelegram': '%@ joined Telegram',\n 'Chat.Service.Channel.UpdatedTitle': 'Channel renamed to \"%@\"',\n 'Chat.Service.Channel.UpdatedPhoto': 'Channel photo updated',\n 'Chat.Service.Channel.RemovedPhoto': 'Channel photo removed',\n 'Chat.Service.Channel.UpdatedVideo': 'Channel video updated',\n 'Chat.Service.BotPermissionAllowed': 'You allowed this bot to message you when you logged in on %@',\n 'Chat.Service.Group.UpdatedPinnedMessage': '%@ pinned \"%@\"',\n 'Chat.Service.Group.TopicEdited.Icon': '%1$@ changed topic icon to %2$@',\n 'Chat.Service.Group.TopicEdited.Icon.Removed': '%1$@ removed icon',\n 'Chat.Service.Group.TopicEdited.Title': '%1$@ changed topic name to \"%2$@\"',\n 'Chat.Service.Group.TopicEdited.Paused': '%1$@ closed topic',\n 'Chat.Service.Group.TopicEdited.Resumed': '%1$@ restarted topic',\n 'Chat.Service.Group.TopicEdited.You.Icon': 'You changed topic icon to %1$@',\n 'Chat.Service.Group.TopicEdited.You.Icon.Removed': 'You removed icon',\n 'Chat.Service.Group.TopicEdited.You.Title': 'You changed topic name to \"%1$@\"',\n 'Chat.Service.Group.TopicEdited.You.Paused': 'You closed topic',\n 'Chat.Service.Group.TopicEdited.You.Resumed': 'You restarted topic',\n 'Chat.Service.Group.TopicEdited.You.Hided': 'You hid the general topic',\n 'Chat.Service.Group.TopicEdited.You.Unhided': 'You unhid the general topic',\n 'Chat.Service.Group.TopicEdited.Hided': '%1$@ hid the general topic',\n 'Chat.Service.Group.TopicEdited.Unhided': '%1$@ unhid the general topic',\n 'Chat.Service.PaymentSent1': 'You have successfully transferred **%1$@** to **%2$@** for **%3$@**',\n 'Chat.Service.PaymentSent1NoTitle': 'You have successfully transferred **%1$@** to **%2$@**',\n 'Chat.Service.PaymentSentRecurringInit': 'You successfully transferred **%1$@** to **%2$@** for **%3$@** and allowed future recurring payments',\n 'Chat.Service.PaymentSentRecurringInitNoTitle': 'You successfully transferred **%1$@** to **%2$@** and allowed future recurring payments',\n 'Chat.Service.PaymentSentRecurringUsed': 'You have just successfully transferred **%1$@** to **%2$@** for **%3$@** via recurrent payments',\n 'Chat.Service.PaymentSentRecurringUsedNoTitle': 'You have just successfully transferred **%1$@** to **%2$@** via recurrent payments',\n 'Chat.Service.VoiceChatStarted': '%1$@ started a [video chat](open)',\n 'Chat.Service.VoiceChatStartedYou': 'You started a [video chat](open)',\n 'Chat.Service.VoiceChatStarted.Channel': '[Live Stream](open) started',\n 'Chat.Service.VoiceChatFinished': '%1$@ ended the video chat (%2$@)',\n 'Chat.Service.VoiceChatFinishedYou': 'You ended the video chat (%@)',\n 'Chat.Service.VoiceChatFinished.Channel': 'Live Stream ended (%1$@)',\n 'Chat.Service.VoiceChatInvitation': '%1$@ invited %2$@ to the [video chat](open)',\n 'Chat.Service.VoiceChatInvitationByYou': 'You invited %1$@ to the [video chat](open)',\n 'Chat.Service.VoiceChatInvitationForYou': '%1$@ invited you to the [video chat](open)',\n 'ChatService.UserJoinedGroupByRequest': '%@ was accepted to the group',\n 'ChatService.UserJoinedChannelByRequest': '%@ joined the channel by request',\n 'ChatList.Service.VoiceChatScheduled': '%1$@ scheduled a video chat for %2$@',\n 'ChatList.Service.VoiceChatScheduledYou': 'You scheduled a video chat for %2$@',\n 'Chat.Poll.Unvote': 'Retract Vote',\n 'Chat.Poll.Stop': 'Stop Poll',\n 'Chat.Poll.ViewResults': 'View Results',\n 'Chat.Poll.SubmitVote': 'Vote',\n 'Chat.Poll.Type.Anonymous': 'Anonymous Poll',\n 'Chat.Poll.Type.Public': 'Poll',\n 'Chat.Poll.Type.AnonymousQuiz': 'Anonymous Quiz',\n 'Chat.Poll.Type.Quiz': 'Quiz',\n 'Chat.Poll.Type.Closed': 'Final Results',\n 'Chat.Poll.TotalVotes1': {\n 'one_value': '%d vote',\n 'other_value': '%d votes'\n },\n 'Chat.Quiz.TotalVotes': {\n 'one_value': '%d answer',\n 'other_value': '%d answers'\n },\n 'Chat.Poll.TotalVotesEmpty': 'No votes yet',\n 'Chat.Poll.TotalVotesResultEmpty': 'No votes',\n 'Chat.Quiz.TotalVotesEmpty': 'No answers yet',\n 'Chat.Quiz.TotalVotesResultEmpty': 'No answers',\n // \"Chat.Poll.Stop.Confirm.Header\": \"Stop Poll?\",\n // \"Chat.Poll.Stop.Confirm.Text\": \"If you stop this poll now, nobody will be able to vote in it anymore. This action cannot be undone.\",\n // \"Chat.Pinned.UnpinAll\": {\n // \"one_value\": \"Unpin %d Message\",\n // \"other_value\": \"Unpin All %d Messages\"\n // },\n 'Chat.Pinned.DontShow': 'Don\\'t Show Pinned Messages',\n 'Chat.Title.Comments': {\n 'one_value': '%d Comment',\n 'other_value': '%d Comments'\n },\n 'ChatTitle.ReportMessages': 'Report Messages',\n 'Chat.Send.WithoutSound': 'Send Without Sound',\n 'Chat.Send.SetReminder': 'Set a Reminder',\n 'Chat.Send.ScheduledMessage': 'Schedule Message',\n 'Chat.SendAs.PersonalAccount': 'personal account',\n 'Chat.UnpinAllMessagesConfirmation': {\n 'one_value': 'Do you want to unpin %d message in this chat?',\n 'other_value': 'Do you want to unpin all %d messages in this chat?'\n },\n 'Chat.Message.Ad.Text': 'Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\\n\\nUnlike other apps, Telegram doesn\\'t track whether you tapped on a sponsored message and doesn\\'t profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\\n\\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\\n\\n%@\\n\\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\\n\\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.',\n 'Chat.Message.Ad.ReadMore': 'Read More',\n 'Chat.Message.ViewChannel': 'VIEW CHANNEL',\n 'Chat.Message.ViewBot': 'VIEW BOT',\n 'Chat.Message.ViewGroup': 'VIEW GROUP',\n 'Chat.Message.Sponsored.What': 'What are sponsored messages?',\n 'Chat.Message.Sponsored.Link': 'https://promote.telegram.org',\n 'Checkout.2FA.Text': 'Saving payment details is only available with 2-Step Verification.',\n 'Checkout.NewCard.CardholderNamePlaceholder': 'Cardholder Name',\n 'Checkout.PasswordEntry.Title': 'Payment Confirmation',\n 'Checkout.PasswordEntry.Pay': 'Pay',\n 'Checkout.PasswordEntry.Text': 'Your card %@ is on file. To pay with this card, please enter your 2-Step-Verification password.',\n 'Checkout.PayPrice': 'Pay %@',\n 'Checkout.WebConfirmation.Title': 'Complete Payment',\n 'ChatList.Context.Mute': 'Mute',\n 'ChatList.Context.Unmute': 'Unmute',\n 'ChatList.Context.Pin': 'Pin',\n 'ChatList.Context.Unpin': 'Unpin',\n 'ChatList.Context.DeleteChat': 'Delete Chat',\n 'ChatList.Context.DeleteAndExit': 'Delete and Leave',\n 'ChatList.Context.LeaveChannel': 'Leave Channel',\n 'ChatList.Context.LeaveGroup': 'Leave Group',\n 'ChatList.Service.Call.incoming': 'Incoming Call (%@)',\n 'ChatList.Service.Call.outgoing': 'Outgoing Call (%@)',\n 'ChatList.Service.VideoCall.incoming': 'Incoming Video Call (%@)',\n 'ChatList.Service.VideoCall.outgoing': 'Outgoing Video Call (%@)',\n 'ChatList.Service.Call.Cancelled': 'Cancelled Call',\n 'ChatList.Service.Call.Missed': 'Missed Call',\n 'ChatList.Service.VideoCall.Cancelled': 'Cancelled Video Call',\n 'ChatList.Service.VideoCall.Missed': 'Missed Video Call',\n 'ChatList.Service.VoiceChatScheduled.Channel': 'Voice chat scheduled for %@',\n 'ChatList.Filter.Header': 'Create folders for different groups of chats and quickly switch between them.',\n 'ChatList.Filter.NewTitle': 'Create Folder',\n 'ChatList.Filter.List.Title': 'Chat Folders',\n 'ChatList.Filter.Include.AddChat': 'Add Chats',\n 'ChatList.Filter.Exclude.AddChat': 'Add Chats',\n // \"ChatList.Filter.All\": \"All\",\n 'ChatList.Filter.Contacts': 'Contacts',\n 'ChatList.Filter.NonContacts': 'Non-Contacts',\n 'ChatList.Filter.Groups': 'Groups',\n 'ChatList.Filter.Channels': 'Channels',\n 'ChatList.Filter.Bots': 'Bots',\n 'ChatList.Filter.MutedChats': 'Muted',\n 'ChatList.Filter.ReadChats': 'Read',\n 'ChatList.Filter.Archive': 'Archived',\n 'ChatList.Filter.Include.LimitReached': 'Sorry, you can only add up to 100 individual chats. Try using chat types.',\n 'ChatList.Filter.Exclude.LimitReached': 'Sorry, you can only add up to 100 individual chats. Try using chat types.',\n 'ChatList.Filter.Confirm.Remove.Header': 'Remove Folder',\n 'ChatList.Filter.Confirm.Remove.Text': 'Are you sure you want to remove this folder? Your chats will not be deleted.',\n 'ChatList.Mute.1Hour': 'For 1 Hour',\n 'ChatList.Mute.4Hours': 'For 4 Hours',\n 'ChatList.Mute.8Hours': 'For 8 Hours',\n 'ChatList.Mute.1Day': 'For 1 Day',\n 'ChatList.Mute.3Days': 'For 3 Days',\n 'ChatList.Mute.Forever': 'Forever',\n 'Channel.DescriptionHolderDescrpiton': 'You can provide an optional description for your channel.',\n 'ChannelVisibility.Confirm.MakePrivate.Channel': 'If you make this channel private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.',\n 'ChannelVisibility.Confirm.MakePrivate.Group': 'If you make this group private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.',\n 'Context.ViewStickerSet': 'View Sticker Set',\n 'CreateGroup.NameHolder': 'Group Name',\n 'CustomEmoji.PremiumAlert': 'Subscribe to Telegram Premium to unlock this emoji. [Read More]()',\n 'Date.Today': 'Today',\n 'DeleteChat.DeleteGroupForAll': 'Delete for all members',\n 'DeleteChannelForAll': 'Delete for all subscribers',\n 'ForumTopic.Context.Info': 'Group Info',\n 'ForumTopic.Context.AddMember': 'Add Members',\n 'ForumTopic.Context.ShowAsMessages': 'View as Messages',\n 'ForumTopic.Context.New': 'Create Topic',\n 'ForumTopic.Name.Placeholder': 'Topic Name',\n 'ForumTopic.Title.Edit': 'Edit Topic',\n 'EditAccount.Username': 'Username',\n 'EditAccount.Title': 'Edit Profile',\n 'EditAccount.Logout': 'Log Out',\n 'Emoji.Recent': 'Frequently Used',\n 'Emoji.SmilesAndPeople': 'Smileys & People',\n 'Emoji.AnimalsAndNature': 'Animals & Nature',\n 'Emoji.FoodAndDrink': 'Food & Drink',\n 'Emoji.ActivityAndSport': 'Activity & Sport',\n 'Emoji.TravelAndPlaces': 'Travel & Places',\n 'Emoji.Objects': 'Objects',\n // \"Emoji.Symbols\": \"Symbols\",\n 'Emoji.Flags': 'Flags',\n 'Error.AnError': 'An error occurred. Please try again later.',\n 'FileSize.B': '%@ B',\n 'FileSize.KB': '%@ KB',\n 'FileSize.MB': '%@ MB',\n 'FileSize.GB': '%@ GB',\n 'InstalledStickers.LoopAnimated': 'Loop Animated Stickers',\n 'LastSeen.HoursAgo': {\n 'one_value': 'last seen %d hour ago',\n 'other_value': 'last seen %d hours ago'\n },\n 'Login.Register.LastName.Placeholder': 'Last Name',\n 'Message.Context.Select': 'Select',\n 'Message.Context.Pin': 'Pin',\n 'Message.Context.Unpin': 'Unpin',\n 'Message.Context.Goto': 'Show Message',\n 'Message.ReplyActionButtonShowReceipt': 'Show Receipt',\n 'MessageContext.CopyMessageLink1': 'Copy Message Link',\n 'Modal.Send': 'Send',\n 'NewContact.Exception.ShareMyPhoneNumber': 'Share My Phone Number',\n 'NewContact.Exception.ShareMyPhoneNumber.Desc': 'You can make your phone visible to %@.',\n 'NewPoll.Anonymous': 'Anonymous Voting',\n 'NewPoll.Explanation.Placeholder': 'Add a Comment (Optional)',\n 'NewPoll.OptionsAddOption': 'Add an Option',\n 'NewPoll.MultipleChoice': 'Multiple Answers',\n 'NewPoll.Quiz': 'Quiz Mode',\n 'Notification.Contact.Reacted': '%1$@ to your \"%2$@\"',\n // \"Notification.Group.Reacted\": \"%1$@: %2$@ to your \"%3$@\"\",\n 'Payments.Recurrent.Accept': 'I accept [Terms of Service]() of **%@**.',\n 'Peer.Activity.User.PlayingGame': 'playing a game',\n 'Peer.Activity.User.TypingText': 'typing',\n 'Peer.Activity.User.SendingPhoto': 'sending a photo',\n 'Peer.Activity.User.RecordingVideo': 'recording video',\n 'Peer.Activity.User.SendingVideo': 'sending a video',\n 'Peer.Activity.User.RecordingAudio': 'recording voice',\n 'Peer.Activity.User.SendingFile': 'sending file',\n 'Peer.Activity.User.ChoosingSticker': 'choosing a sticker',\n 'Peer.Activity.User.EnjoyingAnimations': 'watching %@',\n 'Peer.Activity.Chat.PlayingGame': '%@ is playing a game',\n 'Peer.Activity.Chat.TypingText': '%@ is typing',\n 'Peer.Activity.Chat.SendingPhoto': '%@ is sending a photo',\n 'Peer.Activity.Chat.RecordingVideo': '%@ is recording video',\n 'Peer.Activity.Chat.SendingVideo': '%@ is sending a video',\n 'Peer.Activity.Chat.RecordingAudio': '%@ is recording voice',\n 'Peer.Activity.Chat.SendingFile': '%@ is sending a file',\n 'Peer.Activity.Chat.ChoosingSticker': '%@ is choosing a sticker',\n 'Peer.Activity.Chat.EnjoyingAnimations': '%@ is watching %@',\n 'Peer.Activity.Chat.Multi.PlayingGame1': '%@ and %d others are playing a game',\n 'Peer.Activity.Chat.Multi.TypingText1': '%@ and %d others are typing',\n 'Peer.Activity.Chat.Multi.SendingPhoto1': '%@ and %d others are sending photos',\n 'Peer.Activity.Chat.Multi.RecordingVideo1': '%@ and %d others are recording video',\n 'Peer.Activity.Chat.Multi.SendingVideo1': '%@ and %d others are sending videos',\n 'Peer.Activity.Chat.Multi.RecordingAudio1': '%@ and %d others are recording voice',\n // \"Peer.Activity.Chat.Multi.SendingAudio1\": \"%@ and %d others are sending audio\",\n 'Peer.Activity.Chat.Multi.SendingFile1': '%@ and %d others are sending files',\n 'Peer.Activity.Chat.Multi.ChoosingSticker1': '%@ and %d others are choosing stickers',\n 'Peer.ServiceNotifications': 'service notifications',\n 'Peer.RepliesNotifications': 'Reply Notifications',\n 'Peer.Status.justNow': 'last seen just now',\n 'Peer.Status.Today': 'today',\n 'Peer.Status.Yesterday': 'yesterday',\n 'Peer.Status.LastSeenAt': 'last seen %@ at %@',\n 'Peer.Status.minAgo': {\n 'one_value': 'last seen %d minute ago',\n 'other_value': 'last seen %d minutes ago'\n },\n 'Peer.Status.Member': {\n 'one_value': '%d member',\n 'other_value': '%d members'\n },\n 'Peer.Status.Subscribers': {\n 'one_value': '%d subscriber',\n 'other_value': '%d subscribers'\n },\n 'PeerInfo.Administrators': 'Administrators',\n 'PeerInfo.DeleteChannel': 'Delete Channel',\n 'PeerInfo.Discussion': 'Discussion',\n 'PeerInfo.Discussion.Add': 'Add',\n 'PeerInfo.SharedMedia': 'Shared Media',\n 'PeerInfo.Subscribers': 'Subscribers',\n 'PeerInfo.DeleteContact': 'Delete Contact',\n // \"PeerInfo.Confirm.RemovePeer\": \"Remove %@ from the group?\",\n 'PeerInfo.Action.VoiceChat': 'Video Chat',\n 'PeerInfo.Action.LiveStream': 'Live Stream',\n 'PeerInfo.Phone.AnonymousInfo': 'This number is not tied to a SIM card and was acquired on [Fragment]().',\n 'PeerMedia.Members': 'Members',\n 'PollResults.Title.Poll': 'Poll Results',\n 'PollResults.Title.Quiz': 'Quiz Results',\n 'PollResults.LoadMore': {\n 'other_value': 'Show More (%d)'\n },\n // \"PeerInfo.Confirm.DeleteGroupConfirmation\": \"Wait! Deleting this group will remove all members and all messages will be lost. Delete the group anyway?\",\n 'Preview.Dragging.AddItems': {\n 'one_value': 'Add Item',\n 'other_value': 'Add Items'\n },\n 'PreviewSender.CaptionPlaceholder': 'Add a caption...',\n 'PreviewSender.CompressFile': 'Send compressed',\n 'PreviewSender.SendFile': {\n 'one_value': 'Send File',\n 'other_value': 'Send %d Files'\n },\n 'PreviewSender.SendPhoto': {\n 'one_value': 'Send Photo',\n 'other_value': 'Send %d Photos'\n },\n 'PreviewSender.SendVideo': {\n 'one_value': 'Send Video',\n 'other_value': 'Send %d Videos'\n },\n 'PrivacyAndSecurity.Item.On': 'On',\n 'PrivacyAndSecurity.Item.Off': 'Off',\n 'PrivacyAndSecurity.SensitiveText': 'Disable filtering',\n 'PrivacyAndSecurity.SensitiveDesc': 'Display sensitive media in public channels on all your Telegram devices.',\n 'PrivacySettings.VoiceCalls': 'Calls',\n 'PrivacySettings.Forwards': 'Forwarded Messages',\n 'PrivacySettings.Groups': 'Groups and Channels',\n 'PrivacySettingsController.AddUsers': 'Add Users',\n 'PrivacySettingsController.GroupDescription': 'You can restrict who can add you to groups and channels with granular precision.',\n 'PrivacySettingsController.Forwards.CustomHelp': 'You can restrict who can add a link to your account when forwarding your messages.',\n 'PrivacySettingsController.P2p.Desc': 'Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.',\n 'PrivacySettingsController.PhoneCallDescription': 'You can restrict who can call you with granular precision.',\n 'PrivacySettingsController.ProfilePhoto.CustomHelp': 'You can restrict who can see your profile photo with granular precision.',\n 'PrivacySettingsController.LastSeenDescription': 'You won\\'t see Last Seen and Online statuses for people with whom you don\\'t share yours. Approximate last seen will be shown instead (recently, within a week, within a month).',\n 'PrivacySettingsController.PeerInfo': 'You can add users or entire groups as exceptions that will override the settings above.',\n 'PrivacySettingsController.Everbody': 'Everybody',\n 'PrivacySettingsController.MyContacts': 'My Contacts',\n 'PrivacySettingsController.Nobody': 'Nobody',\n 'PrivacySettingsController.NeverShare': 'Never Share With',\n 'PrivacySettingsController.AlwaysShare': 'Always Share With',\n 'PrivacySettingsController.NeverAllow': 'Never Allow',\n 'PrivacySettingsController.AlwaysAllow': 'Always Allow',\n 'PrivacySettingsController.UserCount': {\n 'one_value': '%d user',\n 'other_value': '%d users'\n },\n 'RecentSessions.Error.FreshReset': 'For security reasons, you can\\'t terminate older sessions from a device that you\\'ve just connected. Please use an earlier connection or wait for a few hours.',\n 'RequestJoin.Button': 'Request to Join',\n 'Stickers.SearchAdd': 'Add',\n 'Stickers.SearchAdded': 'Added',\n 'Stickers.SuggestStickers': 'Suggest Stickers by Emoji',\n 'ShareModal.Search.Placeholder': 'Share to...',\n 'ShareModal.Search.ForwardPlaceholder': 'Forward to...',\n 'Telegram.GeneralSettingsViewController': 'General Settings',\n 'Telegram.InstalledStickerPacksController': 'Stickers',\n 'Telegram.NotificationSettingsViewController': 'Notifications',\n 'Telegram.LanguageViewController': 'Language',\n 'Text.CopyLabel_About': 'Copy About',\n 'Text.CopyLabel_Bio': 'Copy Bio',\n 'Text.CopyLabel_PhoneNumber': 'Copy Phone Number',\n 'Text.CopyLabel_Username': 'Copy Username',\n 'Text.CopyLabel_ShareLink': 'Copy Share Link',\n 'GeneralSettings.BigEmoji': 'Large Emoji',\n 'GeneralSettings.EmojiPrediction': 'Suggest Emoji',\n 'GroupPermission.Delete': 'Delete Exception',\n 'Search.Confirm.ClearHistory': 'Are you sure you want to clear your search history?',\n 'SecureId.Identity.Placeholder.ExpiryDate': 'Expiry Date',\n 'Separator.ShowMore': 'show more',\n 'Separator.ShowLess': 'show less',\n 'ScheduleController.at': 'at',\n 'Schedule.SendToday': 'Send today at %@',\n 'Schedule.SendDate': 'Send on %@ at %@',\n 'Schedule.SendWhenOnline': 'Send When Online',\n 'Sticker.Premium.Click.Info': 'This pack contains premium stickers like this one. [View Pack]()',\n 'Stickers.Recent': 'Recent',\n // \"Stickers.Favorite\": \"Favorite\",\n 'StickerSet.DontExist': 'Sorry, this sticker set doesn\\'t seem to exist.',\n 'Text.Context.Copy.Username': 'Copy Username',\n 'Text.Context.Copy.Hashtag': 'Copy Hashtag',\n 'Time.TomorrowAt': 'tomorrow at %@',\n 'TwoStepAuth.SetPasswordHelp': 'You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.',\n 'TwoStepAuth.GenericHelp': 'You have enabled Two-Step verification.\\nYou\\'ll need the password you set up here to log in to your Telegram account.',\n 'TwoStepAuth.ChangePassword': 'Change Password',\n 'TwoStepAuth.RemovePassword': 'Turn Password Off',\n 'TwoStepAuth.SetupEmail': 'Set Recovery Email',\n 'TwoStepAuth.ChangeEmail': 'Change Recovery Email',\n 'TwoStepAuth.ConfirmEmailCodeDesc': 'Please enter the code we\\'ve just emailed to %@.',\n 'TwoStepAuth.RecoveryTitle': 'Email Code',\n 'TwoStepAuth.RecoveryCode': 'Code',\n 'TwoStepAuth.RecoveryCodeInvalid': 'Invalid code. Please try again.',\n 'TwoStepAuth.RecoveryCodeExpired': 'Code Expired',\n 'TwoStepAuth.SetupHintTitle': 'Password Hint',\n 'TwoStepAuth.SetupHintPlaceholder': 'Hint',\n 'VoiceChat.Chat.StartNew': 'Video chat ended. Start a new one?',\n 'VoiceChat.Chat.StartNew.OK': 'Start',\n 'VoiceChat.Chat.Ended': 'Video chat ended.',\n 'VoiceChat.Invite.InviteMembers': 'Invite members',\n 'VoiceChat.Status.Connecting': 'Connecting...',\n 'VoiceChat.Status.Members': {\n 'one_value': '%d participant',\n 'other_value': '%d participants'\n },\n 'VoiceChat.Status.MutedForYou': 'muted for you',\n 'VoiceChat.Status.Speaking': 'speaking',\n 'VoiceChat.Status.Listening': 'listening',\n 'VoiceChat.Status.WantsSpeak': 'wants to speak',\n 'VoiceChat.Status.Muted': 'muted',\n 'VoiceChat.Status.You': 'This is you',\n 'VoiceChat.Video.Stream.Video': 'video',\n 'VoiceChat.Video.Stream.Screencast': 'screen',\n 'VoiceChat.Video.Stream.More': 'more',\n 'VoiceChat.Leave': 'Leave',\n 'VoiceChat.End.Title': 'Leave video chat',\n 'VoiceChat.End.Text': 'Are you sure you want to leave this video chat?',\n 'VoiceChat.End.Third': 'End Video Chat',\n 'VoiceChat.End.OK': 'Leave',\n 'VoiceChat.MutePeer': 'Mute',\n 'VoiceChat.UnmutePeer': 'Allow To Speak',\n 'VoiceChat.RemovePeer': 'Remove',\n 'VoiceChat.OpenProfile': 'Open Profile',\n 'VoiceChat.MuteForMe': 'Mute For Me',\n 'VoiceChat.UnmuteForMe': 'Unmute For Me',\n 'VoiceChat.RemovePeer.Confirm.Channel': 'Do you want to remove %1$@ from the channel?',\n 'VoiceChat.RemovePeer.Confirm': 'Are you sure you want to remove %1$@ from the group?',\n 'VoiceChat.RemovePeer.Confirm.OK': 'Remove'\n};\n\nexport default lang;\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/231.4dbf43eb5012e83665e1.chunk.js b/public/231.32da54109dc94ecb5e46.chunk.js similarity index 96% rename from public/231.4dbf43eb5012e83665e1.chunk.js rename to public/231.32da54109dc94ecb5e46.chunk.js index 4df03a63..ba8715d9 100644 --- a/public/231.4dbf43eb5012e83665e1.chunk.js +++ b/public/231.32da54109dc94ecb5e46.chunk.js @@ -1,2 +1,2 @@ "use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[231],{3231:(t,e,a)=>{a.r(e),a.d(e,{default:()=>u});var n=a(279),i=a(4159),o=a(236),r=a(3512),h=a(4874);let d;const s=new h.Z("page-signImport",!0,(()=>{var t,e,h,u;(0,n.y)(s.pageEl.firstElementChild,!0),t=void 0,e=void 0,u=function*(){const{dcId:t,token:e,tgAddr:n}=d;let h;try{r.Z.managers.apiManager.setBaseDcId(t);const n=yield r.Z.managers.apiManager.invokeApi("auth.importWebTokenAuthorization",{api_id:i.Z.id,api_hash:i.Z.hash,web_auth_token:e},{dcId:t,ignoreErrors:!0});"auth.authorization"===n._&&(r.Z.managers.apiManager.setUser(n.user),h=a.e(781).then(a.bind(a,5436)))}catch(t){switch(t.type){case"SESSION_PASSWORD_NEEDED":t.handled=!0,h=a.e(442).then(a.bind(a,9437));break;default:{console.error("authorization import error:",t);const e=o.h.authState._;"authStateSignIn"===e?h=a.e(641).then(a.bind(a,810)):"authStateSignQr"===e&&(h=a.e(776).then(a.bind(a,9709)));break}}}location.hash=(null==n?void 0:n.trim())?"#?tgaddr="+encodeURIComponent(n):"",h&&h.then((t=>t.default.mount()))},new((h=void 0)||(h=Promise))((function(a,n){function i(t){try{r(u.next(t))}catch(t){n(t)}}function o(t){try{r(u.throw(t))}catch(t){n(t)}}function r(t){var e;t.done?a(t.value):(e=t.value,e instanceof h?e:new h((function(t){t(e)}))).then(i,o)}r((u=u.apply(t,e||[])).next())}))}),(t=>{d=t,r.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignImport",data:d})})),u=s}}]); -//# sourceMappingURL=231.4dbf43eb5012e83665e1.chunk.js.map \ No newline at end of file +//# sourceMappingURL=231.32da54109dc94ecb5e46.chunk.js.map \ No newline at end of file diff --git a/public/231.4dbf43eb5012e83665e1.chunk.js.map b/public/231.32da54109dc94ecb5e46.chunk.js.map similarity index 96% rename from public/231.4dbf43eb5012e83665e1.chunk.js.map rename to public/231.32da54109dc94ecb5e46.chunk.js.map index c70c13a4..ea4aaad4 100644 --- a/public/231.4dbf43eb5012e83665e1.chunk.js.map +++ b/public/231.32da54109dc94ecb5e46.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"231.4dbf43eb5012e83665e1.chunk.js","mappings":"6KAaA,IAAIA,EAEJ,MAwCMC,EAAO,IAAI,IAAK,mBAAmB,GAAM,K,aAC7C,OAAaA,EAAKC,OAAOC,mBAAmB,G,OAzCb,E,OAAA,E,EAAA,YAC/B,MAAM,KAACC,EAAI,MAAEC,EAAK,OAAEC,GAAUN,EAC9B,IAAIO,EACJ,IACE,oCAA0CH,GAC1C,MAAMI,QAAsB,kCAAwC,mCAAoC,CACtGC,OAAQ,OACRC,SAAU,SACVC,eAAgBN,GACf,CAACD,OAAMQ,cAAc,IAED,uBAApBJ,EAAcK,IACf,gCAAsCL,EAAcM,MACpDP,EAAiB,8B,CAGnB,MAAMQ,GACN,OAAQA,EAAiBC,MACvB,IAAK,0BACFD,EAAiBE,SAAU,EAC5BV,EAAiB,8BACjB,MAGF,QAAS,CACPW,QAAQC,MAAM,8BAA+BJ,GAC7C,MAAMK,EAAe,gBACD,oBAAjBA,EAAoCb,EAAiB,6BAC/B,oBAAjBa,IAAoCb,EAAiB,+BAC7D,K,GAKNc,SAASC,MAAOhB,aAAM,EAANA,EAAQiB,QAAS,YAAcC,mBAAmBlB,GAAU,GACzEC,GACDA,EAAekB,MAAMC,GAAMA,EAAEC,QAAQC,SAEzC,E,YAtCiC,K,iQA0Cf,IACdC,IACF7B,EAAO6B,EACP,yCAA+C,YAAa,CAAChB,EAAG,sBAAuBb,QAAM,IAG/F,G","sources":["webpack://tweb/./src/pages/pageSignImport.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {putPreloader} from '../components/putPreloader';\nimport App from '../config/app';\nimport {STATE_INIT} from '../config/state';\nimport rootScope from '../lib/rootScope';\nimport {AuthState} from '../types';\nimport Page from './page';\n\nlet data: AuthState.signImport['data'];\n\nconst importWebToken = async() => {\n const {dcId, token, tgAddr} = data;\n let mountPageAfter: Promise<{default: Page}>;\n try {\n rootScope.managers.apiManager.setBaseDcId(dcId);\n const authorization = await rootScope.managers.apiManager.invokeApi('auth.importWebTokenAuthorization', {\n api_id: App.id,\n api_hash: App.hash,\n web_auth_token: token\n }, {dcId, ignoreErrors: true});\n\n if(authorization._ === 'auth.authorization') {\n rootScope.managers.apiManager.setUser(authorization.user);\n mountPageAfter = import('./pageIm');\n // return;\n }\n } catch(err) {\n switch((err as ApiError).type) {\n case 'SESSION_PASSWORD_NEEDED': {\n (err as ApiError).handled = true;\n mountPageAfter = import('./pagePassword');\n break;\n }\n\n default: {\n console.error('authorization import error:', err);\n const defaultState = STATE_INIT.authState._;\n if(defaultState === 'authStateSignIn') mountPageAfter = import('./pageSignIn');\n else if(defaultState === 'authStateSignQr') mountPageAfter = import('./pageSignQR');\n break;\n }\n }\n }\n\n location.hash = tgAddr?.trim() ? '#?tgaddr=' + encodeURIComponent(tgAddr) : '';\n if(mountPageAfter) {\n mountPageAfter.then((m) => m.default.mount());\n }\n};\n\nconst page = new Page('page-signImport', true, () => {\n putPreloader(page.pageEl.firstElementChild, true);\n importWebToken();\n}, (_data: typeof data) => {\n data = _data;\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignImport', data});\n});\n\nexport default page;\n"],"names":["data","page","pageEl","firstElementChild","dcId","token","tgAddr","mountPageAfter","authorization","api_id","api_hash","web_auth_token","ignoreErrors","_","user","err","type","handled","console","error","defaultState","location","hash","trim","encodeURIComponent","then","m","default","mount","_data"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"231.32da54109dc94ecb5e46.chunk.js","mappings":"6KAaA,IAAIA,EAEJ,MAwCMC,EAAO,IAAI,IAAK,mBAAmB,GAAM,K,aAC7C,OAAaA,EAAKC,OAAOC,mBAAmB,G,OAzCb,E,OAAA,E,EAAA,YAC/B,MAAM,KAACC,EAAI,MAAEC,EAAK,OAAEC,GAAUN,EAC9B,IAAIO,EACJ,IACE,oCAA0CH,GAC1C,MAAMI,QAAsB,kCAAwC,mCAAoC,CACtGC,OAAQ,OACRC,SAAU,SACVC,eAAgBN,GACf,CAACD,OAAMQ,cAAc,IAED,uBAApBJ,EAAcK,IACf,gCAAsCL,EAAcM,MACpDP,EAAiB,8B,CAGnB,MAAMQ,GACN,OAAQA,EAAiBC,MACvB,IAAK,0BACFD,EAAiBE,SAAU,EAC5BV,EAAiB,8BACjB,MAGF,QAAS,CACPW,QAAQC,MAAM,8BAA+BJ,GAC7C,MAAMK,EAAe,gBACD,oBAAjBA,EAAoCb,EAAiB,6BAC/B,oBAAjBa,IAAoCb,EAAiB,+BAC7D,K,GAKNc,SAASC,MAAOhB,aAAM,EAANA,EAAQiB,QAAS,YAAcC,mBAAmBlB,GAAU,GACzEC,GACDA,EAAekB,MAAMC,GAAMA,EAAEC,QAAQC,SAEzC,E,YAtCiC,K,iQA0Cf,IACdC,IACF7B,EAAO6B,EACP,yCAA+C,YAAa,CAAChB,EAAG,sBAAuBb,QAAM,IAG/F,G","sources":["webpack://tweb/./src/pages/pageSignImport.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {putPreloader} from '../components/putPreloader';\nimport App from '../config/app';\nimport {STATE_INIT} from '../config/state';\nimport rootScope from '../lib/rootScope';\nimport {AuthState} from '../types';\nimport Page from './page';\n\nlet data: AuthState.signImport['data'];\n\nconst importWebToken = async() => {\n const {dcId, token, tgAddr} = data;\n let mountPageAfter: Promise<{default: Page}>;\n try {\n rootScope.managers.apiManager.setBaseDcId(dcId);\n const authorization = await rootScope.managers.apiManager.invokeApi('auth.importWebTokenAuthorization', {\n api_id: App.id,\n api_hash: App.hash,\n web_auth_token: token\n }, {dcId, ignoreErrors: true});\n\n if(authorization._ === 'auth.authorization') {\n rootScope.managers.apiManager.setUser(authorization.user);\n mountPageAfter = import('./pageIm');\n // return;\n }\n } catch(err) {\n switch((err as ApiError).type) {\n case 'SESSION_PASSWORD_NEEDED': {\n (err as ApiError).handled = true;\n mountPageAfter = import('./pagePassword');\n break;\n }\n\n default: {\n console.error('authorization import error:', err);\n const defaultState = STATE_INIT.authState._;\n if(defaultState === 'authStateSignIn') mountPageAfter = import('./pageSignIn');\n else if(defaultState === 'authStateSignQr') mountPageAfter = import('./pageSignQR');\n break;\n }\n }\n }\n\n location.hash = tgAddr?.trim() ? '#?tgaddr=' + encodeURIComponent(tgAddr) : '';\n if(mountPageAfter) {\n mountPageAfter.then((m) => m.default.mount());\n }\n};\n\nconst page = new Page('page-signImport', true, () => {\n putPreloader(page.pageEl.firstElementChild, true);\n importWebToken();\n}, (_data: typeof data) => {\n data = _data;\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignImport', data});\n});\n\nexport default page;\n"],"names":["data","page","pageEl","firstElementChild","dcId","token","tgAddr","mountPageAfter","authorization","api_id","api_hash","web_auth_token","ignoreErrors","_","user","err","type","handled","console","error","defaultState","location","hash","trim","encodeURIComponent","then","m","default","mount","_data"],"sourceRoot":""} \ No newline at end of file diff --git a/public/460.045a47588277eda9214e.chunk.js b/public/460.045a47588277eda9214e.chunk.js new file mode 100644 index 00000000..72f59a54 --- /dev/null +++ b/public/460.045a47588277eda9214e.chunk.js @@ -0,0 +1,2 @@ +(this.webpackChunktweb=this.webpackChunktweb||[]).push([[460],{5814:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m});var s=i(5400),n=i(3512),a=i(4762),o=i(410),r=i(8487),d=i(3772),l=i(1655),c=i(7625),h=i(2586),u=i(3013),p=i(3035);const f=new class{constructor(){this.observer=new IntersectionObserver((e=>{for(const t of e){const e=t.target;for(const i in this.byGroups){if(this.intersectionLockedGroups[i])continue;const s=this.byGroups[i].find((t=>t.el===e));if(s){if(t.isIntersecting)this.visible.add(s),this.checkAnimation(s,!1);else{this.visible.delete(s),this.checkAnimation(s,!0);const e=s.animation;e instanceof d.Z&&e.clearCache()}break}}}})),this.visible=new Set,this.overrideIdleGroups=new Set,this.byGroups={},this.byPlayer=new Map,this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,u.Z.addEventListener("play",(({doc:e})=>{"round"===e.type&&(this.videosLocked=!0,this.checkAnimations2())})),u.Z.addEventListener("pause",(()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations2())})),h.Z.addEventListener("change",(e=>{this.checkAnimations2(e)}))}setOverrideIdleGroup(e,t){t?this.overrideIdleGroups.add(e):this.overrideIdleGroups.delete(e)}getAnimations(e){const t=[];for(const i in this.byGroups)for(const s of this.byGroups[i])s.el===e&&t.push(s);return t}removeAnimation(e){const{el:t,animation:i}=e;i.remove(),i instanceof HTMLVideoElement&&a.IS_SAFARI&&setTimeout((()=>{i.src="",i.load()}),1e3);const s=this.byGroups[e.group];s&&((0,l.Z)(s,e),s.length||delete this.byGroups[e.group]),this.observer.unobserve(t),this.visible.delete(e),this.byPlayer.delete(i)}removeAnimationByPlayer(e){const t=this.byPlayer.get(e);t&&this.removeAnimation(t)}addAnimation(e,t="",i,a){var o,r,l,c;if("none"===t||this.byPlayer.has(e))return;i||(e instanceof d.Z?i=e.el[0]:e instanceof s.KZ?i=e.canvas:e instanceof s.LD?i=null!==(o=e.placeholder)&&void 0!==o?o:e:e instanceof HTMLElement&&(i=e));const h={el:i,animation:e,group:t,controlled:a};a&&"boolean"!=typeof a&&a.onClean((()=>{this.removeAnimationByPlayer(e)})),e instanceof d.Z&&!n.Z.settings.stickers.loop&&e.loop&&(e.loop=n.Z.settings.stickers.loop),(null!==(r=(l=this.byGroups)[c=t])&&void 0!==r?r:l[c]=[]).push(h),this.observer.observe(h.el),this.byPlayer.set(e,h)}checkAnimations(e,t,i,s){if(void 0!==t&&!this.byGroups[t])return;const n=void 0!==t?[t]:Object.keys(this.byGroups);for(const t of n){if(s&&this.intersectionLockedGroups[t])continue;const n=this.byGroups[t];(0,c.Z)(n,(t=>{this.checkAnimation(t,e,i)}))}}checkAnimations2(e){this.checkAnimations(e,void 0,void 0,!0)}checkAnimation(e,t,i){const{el:s,animation:n,group:a}=e;i||!this.lockedGroups[a]&&!(0,r.Z)(s)?e.controlled&&!i||this.removeAnimation(e):t||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||n instanceof HTMLVideoElement&&this.videosLocked?n.paused||n.pause():!(n.paused&&this.visible.has(e)&&n.autoplay)||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||h.Z.isIdle&&!this.overrideIdleGroups.has(e.group)||n.play()}getOnlyOnePlayableGroup(){return this.onlyOnePlayableGroup}setOnlyOnePlayableGroup(e=""){this.onlyOnePlayableGroup=e}lockGroup(e){this.lockedGroups[e]=!0}unlockGroup(e){delete this.lockedGroups[e],this.checkAnimations(void 0,e)}refreshGroup(e){const t=this.byGroups[e];(null==t?void 0:t.length)&&(t.forEach((e=>{this.observer.unobserve(e.el)})),(0,p.T2)((()=>{t.forEach((e=>{this.observer.observe(e.el)}))})))}lockIntersectionGroup(e){this.intersectionLockedGroups[e]=!0}unlockIntersectionGroup(e){delete this.intersectionLockedGroups[e],this.refreshGroup(e)}toggleIntersectionGroup(e,t){t?this.lockIntersectionGroup(e):this.unlockIntersectionGroup(e)}};o.GO&&(o.GO.animationIntersector=f);const m=f},3013:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L});var s=i(3512),n=i(3725),a=i(4762),o=i(410),r=i(6669),d=i(5432),l=i(2325),c=i(3719),h=i(8479),u=i(6848),p=i(3699),f=i(7530),m=i(493),g=i(2312),v=i(925),b=i(3241),y=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const w=(()=>{try{return a.IS_SAFARI&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(e){return!1}})();class S extends b.Z{constructor(){super(...arguments),this.media=new Map,this.scheduled=new Map,this.mediaDetails=new Map,this.waitingMediaForLoad=new Map,this.waitingScheduledMediaForLoad=new Map,this.waitingDocumentsForLoad={},this.playbackRates={voice:1,video:1,audio:1},this.seekBackward=(e,t=this.playingMedia)=>{t&&(t.currentTime=Math.max(0,t.currentTime-(e.seekOffset||10)))},this.seekForward=(e,t=this.playingMedia)=>{t&&(t.currentTime=Math.min(t.duration,t.currentTime+(e.seekOffset||10)))},this.seekTo=(e,t=this.playingMedia)=>{t&&(t.currentTime=e.seekTime)},this.onMediaDocumentLoad=e=>y(this,void 0,void 0,(function*(){const t=this.mediaDetails.get(e),i=yield this.managers.appDocsManager.getDoc(t.docId);"audio"===i.type&&i.supportsStreaming&&w&&this.handleSafariStreamable(e);const s=yield this.managers.thumbsStorage.getCacheContext(i);e.src=s.url,this.playingMedia===e&&(e.playbackRate=this.playbackRate,"audio"===i.type&&(e.loop=this.loop));const n=this.waitingDocumentsForLoad[i.id];n&&(n.delete(e),n.size||delete this.waitingDocumentsForLoad[i.id])})),this.onPlay=e=>{const t=e.target,i=this.mediaDetails.get(t),{peerId:s,mid:n}=i,a=this.pip;a&&a.pause();const o=this.getMessageByMedia(t);if(this.playingMedia!==t){this.stop(),this.setMedia(t,o);const e=e=>e.mid===n&&e.peerId===s,i=this.listLoader,a=i.getCurrent();if(!a||!e(a)){let t;for(const s of[!1,!0]){const n=i.getPrevious(s);let a=n.findIndex(e);if(-1!==a?t=-(n.length-a):(a=i.getNext(s).findIndex(e),-1!==a&&(t=a+1)),void 0!==t)break}t?this.go(t,!1):this.setTargets({peerId:s,mid:n})}}setTimeout((()=>{this.playingMedia===t&&(this.dispatchEvent("play",this.getPlayingDetails()),this.pauseMediaInOtherTabs())}),0)},this.onPause=e=>{this.dispatchEvent("pause")},this.onEnded=e=>{if(!e.isTrusted)return;this.onPause(e);const t=this.listLoader;!this.lockedSwitchers&&(this.round||!t.current||t.next.length)&&t.getNext(!0).length&&this.next()||(this.stop(),this.dispatchEvent("stop"))},this.play=()=>this.toggle(!0),this.pause=()=>this.toggle(!1),this.stop=(e=this.playingMedia)=>{if(!e)return!1;if(e.paused||e.pause(),e.currentTime=0,(0,r.Z)(e,"ended"),e===this.playingMedia){const t=this.mediaDetails.get(e);if(null==t?void 0:t.clean){e.src="";const i=t.peerId,s=t.isScheduled?this.scheduled:this.media,n=s.get(i);n&&(n.delete(t.mid),n.size||s.delete(i)),e.remove(),this.mediaDetails.delete(e)}this.playingMedia=void 0,this.playingMediaType=void 0}return!0},this.playItem=e=>{const{peerId:t,mid:i}=e,s=this.searchContext.isScheduled;this.getMedia(t,i,s).play(),setTimeout((()=>{this.resolveWaitingForLoadMedia(t,i,s)}),0)},this.go=(e,t)=>{const i=this.listLoader;if(!this.lockedSwitchers&&i)return"audio"===this.playingMediaType?i.goRound(e,t):i.go(e,t)},this.browserPlay=this.bindBrowserCallback((e=>this.toggle(!0,e))),this.browserPause=this.bindBrowserCallback((e=>this.toggle(!1,e))),this.browserStop=this.bindBrowserCallback((e=>this.stop(e))),this.browserSeekBackward=this.bindBrowserCallback(((e,t)=>this.seekBackward(t,e))),this.browserSeekForward=this.bindBrowserCallback(((e,t)=>this.seekForward(t,e))),this.browserSeekTo=this.bindBrowserCallback(((e,t)=>this.seekTo(t,e))),this.browserNext=this.bindBrowserCallback((e=>e||this.next())),this.browserPrevious=this.bindBrowserCallback((e=>e?this.seekToStart(e):this.previous())),this.next=()=>this.go(1),this.previous=()=>{if(!this.seekToStart(this.playingMedia))return this.go(-1)}}construct(e){if(this.managers=e,this.container=document.createElement("div"),this.container.style.cssText="display: none;",document.body.append(this.container),navigator.mediaSession){const e={play:this.browserPlay,pause:this.browserPause,stop:this.browserStop,seekbackward:this.browserSeekBackward,seekforward:this.browserSeekForward,seekto:this.browserSeekTo,previoustrack:this.browserPrevious,nexttrack:this.browserNext};for(const t in e)try{navigator.mediaSession.setActionHandler(t,e[t])}catch(e){console.warn("MediaSession action is not supported:",t)}}s.Z.addEventListener("document_downloaded",(e=>{const t=this.waitingDocumentsForLoad[e];if(t)for(const e of t)this.onMediaDocumentLoad(e)})),s.Z.addEventListener("media_play",(()=>{this.skipMediaPlayEvent?this.skipMediaPlayEvent=!1:!this.pause()&&this.pip&&this.pip.pause()}));const t={};["volume","muted","playbackRate","loop","round"].forEach((e=>{const i="_"+e;t[e]={get:()=>this[i],set:t=>{this[i]!==t&&(this[i]=t,!this.playingMedia||"loop"===e&&"audio"!==this.playingMediaType||"round"===e||(this.playingMedia[e]=t),"playbackRate"===e&&void 0!==this.playingMediaType&&(this.playbackRates[this.playingMediaType]=t),this.dispatchPlaybackParams())}}})),Object.defineProperties(this,t)}dispatchPlaybackParams(){this.dispatchEvent("playbackParams",this.getPlaybackParams())}getPlaybackParams(){const{volume:e,muted:t,playbackRate:i,playbackRates:s,loop:n,round:a}=this;return{volume:e,muted:t,playbackRate:i,playbackRates:s,loop:n,round:a}}setPlaybackParams(e){this.playbackRates=e.playbackRates,this._volume=e.volume,this._muted=e.muted,this._playbackRate=e.playbackRate,this._loop=e.loop,this._round=e.round}addMedia(e,t,i){const{peerId:a,mid:o}=e,r=e.pFlags.is_scheduled?this.scheduled:this.media;let d=r.get(e.peerId);d||r.set(e.peerId,d=new Map);let l=d.get(o);if(l)return l;const c=(0,f.Z)(e);d.set(o,l=document.createElement("round"===c.type||"video"===c.type?"video":"audio")),"round"===c.type&&l.setAttribute("playsinline","true");const h={peerId:a,mid:o,docId:c.id,doc:c,message:e,clean:i,isScheduled:e.pFlags.is_scheduled};this.mediaDetails.set(l,h),l.volume=1,this.container.append(l),l.addEventListener("play",this.onPlay),l.addEventListener("pause",this.onPause),l.addEventListener("ended",this.onEnded),"audio"!==c.type&&(null==e?void 0:e.pFlags.media_unread)&&e.fromId!==s.Z.myId&&l.addEventListener("timeupdate",(()=>{this.managers.appMessagesManager.readMessages(a,[o])}),{once:!0});const u=(0,n.Z)();if(t)u.resolve();else{const t=e.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let i=t.get(a);i||t.set(a,i=new Map),i.set(o,u)}return u.then((()=>y(this,void 0,void 0,(function*(){if(c.supportsStreaming||(yield this.managers.thumbsStorage.getCacheContext(c)).url)this.onMediaDocumentLoad(l);else{let e=this.waitingDocumentsForLoad[c.id];e||(e=this.waitingDocumentsForLoad[c.id]=new Set),e.add(l),g.Z.downloadMediaURL({media:c})}})))),l}getMedia(e,t,i){const s=(i?this.scheduled:this.media).get(e);return null==s?void 0:s.get(t)}handleSafariStreamable(e){e.addEventListener("play",(()=>{const t=e.currentTime;e.addEventListener("progress",(()=>{e.currentTime=e.duration-1,e.addEventListener("progress",(()=>{e.currentTime=t,e.paused||e.play()}),{once:!0})}),{once:!0})}))}resolveWaitingForLoadMedia(e,t,i){const s=i?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,n=s.get(e);if(!n)return;const a=n.get(t);a&&(a.resolve(),n.delete(t),n.size||s.delete(e))}isSafariBuffering(e){return!!e.safariBuffering}setSafariBuffering(e,t){e.safariBuffering=t}setNewMediadata(e,t=this.playingMedia){var i,s;return y(this,void 0,void 0,(function*(){if(document.pictureInPictureElement)return;yield(0,v.Z)(t,void 0,!1);const n=(0,f.Z)(e),o=[],r="voice"===n.type||"round"===n.type;let c="",h="";if(null===(i=n.thumbs)||void 0===i?void 0:i.length){const i=n.thumbs[n.thumbs.length-1];if(!i.bytes){const s=yield this.managers.thumbsStorage.getCacheContext(n,i.type);s.url?o.push({src:s.url,sizes:`${i.w}x${i.h}`,type:"image/jpeg"}):g.Z.downloadMediaURL({media:n,thumb:i}).then((()=>{this.playingMedia===t&&s.url&&this.setNewMediadata(e)}))}}else if(r){const t=e.fromId||e.peerId;yield this.managers.appPeersManager.getPeerPhoto(t),c=yield(0,m.Z)({peerId:t,plainText:!0,onlyFirstName:!1}),h=l.ZP.format("voice"===n.type?"AttachAudio":"AttachRound",!0)}if(!r){const e=n.attributes.find((e=>"documentAttributeAudio"===e._));c=null!==(s=null==e?void 0:e.title)&&void 0!==s?s:n.file_name,h=null==e?void 0:e.performer}o.length||(a.IS_APPLE?d.Z?o.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):o.push({src:"assets/img/apple-touch-icon.png",sizes:"180x180",type:"image/png"}):[72,96,144,192,256,384,512].forEach((e=>{const t=`${e}x${e}`;o.push({src:`assets/img/android-chrome-${t}.png`,sizes:t,type:"image/png"})})));const u=new MediaMetadata({title:c,artist:h,artwork:o});navigator.mediaSession.metadata=u}))}setCurrentMediadata(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);this.setNewMediadata(t,e)}getMessageByMedia(e){return this.mediaDetails.get(e).message}getPlayingDetails(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);return{doc:(0,f.Z)(t),message:t,media:e,playbackParams:this.getPlaybackParams()}}pauseMediaInOtherTabs(){this.skipMediaPlayEvent=!0,s.Z.dispatchEvent("media_play")}toggle(e,t=this.playingMedia){return!!t&&(void 0===e&&(e=t.paused),t.paused===e&&(e?t.play():t.pause(),!0))}bindBrowserCallback(e){return t=>{e(this.pip,t)}}seekToStart(e){return(null==e?void 0:e.currentTime)>5&&(e.currentTime=0,this.toggle(!0,e),!0)}willBePlayed(e){this.willBePlayedMedia=e}setSearchContext(e){return!(0,u.Z)(this.searchContext,e)&&(this.searchContext=(0,h.Z)(e),!0)}getSearchContext(){return this.searchContext}setTargets(e,t,i){let s=this.listLoader;s?s.reset():s=this.listLoader=new c.Z({loadCount:10,loadWhenLeft:5,processItem:e=>(this.addMedia(e,!1),{peerId:e.peerId,mid:e.mid}),onJump:(e,t)=>{this.playItem(e)},onEmptied:()=>{this.dispatchEvent("stop"),this.stop()}});const n=void 0===this.searchContext.folderId;t?s.setTargets(t,i,n):s.reverse=n,s.setSearchContext(this.searchContext),s.current=e,s.load(!0),s.load(!1)}getPlaybackMediaTypeFromMessage(e){const t=(0,f.Z)(e);let i="audio";return(null==t?void 0:t.type)&&("voice"===t.type||"round"===t.type?i="voice":"video"===t.type&&(i="video")),i}setMedia(e,t){const i=this.getPlaybackMediaTypeFromMessage(t);this._playbackRate=this.playbackRates[i],this.playingMedia=e,this.playingMediaType=i,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"audio"===i&&(this.playingMedia.loop=this.loop),"mediaSession"in navigator&&this.setNewMediadata(t)}setSingleMedia(e,t){const i=this.playingMedia,s=this.pause();let n;return e?(n=()=>{const e=this.pip;e&&e.pause(),this.pauseMediaInOtherTabs()},e.paused||n(),e.addEventListener("play",n)):this.pauseMediaInOtherTabs(),this.willBePlayed(void 0),e?this.setMedia(e,t):this.playingMedia=void 0,this.toggleSwitchers(!1),(t=s)=>{this.toggleSwitchers(!0),i&&(this.mediaDetails.get(i)?this.setMedia(i,this.getMessageByMedia(i)):this.next()||this.previous()),this.playingMedia===e&&(this.playingMedia=void 0,this.playingMediaType=void 0),e&&e.removeEventListener("play",n),t&&this.play()}}toggleSwitchers(e){this.lockedSwitchers=!e}setPictureInPicture(e){this.pip=e;const t=new p.Z;t.add(e)("leavepictureinpicture",(()=>{this.pip===e&&(this.pip=void 0,t.removeAll())}),{once:!0}),t.add(e)("play",(t=>{this.playingMedia!==e&&this.pause(),this.pauseMediaInOtherTabs()}))}}const C=new S;o.GO.appMediaPlaybackController=C;const L=C},1784:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L});var s=i(2341),n=i(3910),a=i(2738),o=i(8497),r=i(4668),d=i(130),l=i(4755),c=i(3719),h=i(2312),u=i(4271),p=i(3709),f=i(7530),m=i(5400),g=i(5824),v=i(5128),b=i(4524),y=i(8805),w=i(4332),S=i(1669),C=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class L extends g.Z{get searchContext(){return this.listLoader.searchContext}constructor(){let e;super(new c.Z({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:i,peerId:s}=e,n=(0,f.Z)(e);if(n&&(!t||L.isMediaCompatibleForDocumentViewer(n)))return{element:null,mid:i,peerId:s}}}),["delete","forward"]),this.onPrevClick=e=>C(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,-1)})),this.onNextClick=e=>C(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,1)})),this.onDeleteClick=()=>{const e=this.target;new v.Z(e.peerId,[e.mid],"chat",(()=>{this.target={element:this.content.media},this.close()}))},this.onForwardClick=()=>{const e=this.target;e.mid&&new b.Z({[e.peerId]:[e.mid]},(()=>this.close()))},this.onAuthorClick=e=>C(this,void 0,void 0,(function*(){const{mid:t,peerId:i}=this.target;if(t&&t!==Number.MAX_SAFE_INTEGER){const s=this.searchContext.threadId,n=yield this.getMessageByPeer(i,t);this.close(e).then((()=>C(this,void 0,void 0,(function*(){if(l.Z.isMobile){const e=w.ZP.getTab(S.Z);e&&e.close()}u.ZP.setInnerPeer({peerId:n.peerId,lastMsgId:t,type:s?"discussion":void 0,threadId:s})}))))}})),this.onDownloadClick=()=>C(this,void 0,void 0,(function*(){const{peerId:e,mid:t}=this.target,i=yield this.getMessageByPeer(e,t),s=(0,f.Z)(i);s&&h.Z.downloadToDisc({media:s,queueId:u.ZP.chat.bubbles.lazyLoadQueue.queueId})})),this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add(g.x+"-caption","spoilers-container");const t=()=>{e&&clearTimeout(e),e=window.setTimeout((()=>{e=void 0,this.content.caption.classList.remove("is-focused")}),800)};this.content.caption.addEventListener("touchstart",(()=>{l.Z.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))})),new y.ZP(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),(0,a.fc)(this.buttons.delete,this.onDeleteClick);const i=[this.btnMenuForward={icon:"forward",text:"Forward",onClick:this.onForwardClick},this.btnMenuDownload={icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick},this.btnMenuDelete={icon:"delete danger",text:"Delete",onClick:this.onDeleteClick}];this.setBtnMenuToggle(i),this.setListeners()}setListeners(){super.setListeners(),(0,a.fc)(this.buttons.forward,this.onForwardClick),(0,a.fc)(this.author.container,this.onAuthorClick);const e=t=>{const i=(0,r.Z)(t.target,"A"),s=(0,o.Z)(t.target,"spoiler");if(i instanceof HTMLAnchorElement&&(!s||this.content.caption.classList.contains("is-spoiler-visible"))){const s=i.getAttribute("onclick");if(!s||s.includes("showMaskedAlert"))return;return(0,n.Z)(t),this.close().then((()=>{this.content.caption.removeEventListener("click",e,{capture:!0}),i.click()})),!1}};this.content.caption.addEventListener("click",e,{capture:!0})}getMessageByPeer(e,t){return this.searchContext.isScheduled?this.managers.appMessagesManager.getScheduledMessageByPeer(e,t):this.managers.appMessagesManager.getMessageByPeer(e,t)}setCaption(e){const t=e.message;let i="";t&&(i=(0,m.ZP)(t,{entities:e.totalEntities})),(0,d.Z)(this.content.caption.firstElementChild,i),this.content.caption.classList.toggle("hide",!t)}setSearchContext(e){return this.listLoader.setSearchContext(e),this}openMedia(e,t,i=0,s=!1,n=[],a=[]){const o=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return C(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const r=e.mid,d=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,l=(0,f.Z)(e),c=yield this.managers.appPeersManager.noForwards(e.peerId),h="messageService"===e._,u=h||!(yield this.managers.appMessagesManager.canForward(e)),m=(h?c:u)||!(0,p.Z)(e);[[[this.buttons.forward,this.btnMenuForward],u],[[this.buttons.download,this.btnMenuDownload],m],[[this.buttons.delete,this.btnMenuDelete],!(yield this.managers.appMessagesManager.canDeleteMessage(e))]].forEach((([e,t])=>{e.forEach((e=>{e instanceof HTMLElement?e.classList.toggle("hide",t):e.verify=()=>!t}))})),this.wholeDiv.classList.toggle("no-forwards",m),this.setCaption(e);const g=o._openMedia.call(this,l,e.date,d,i,t,s,n,a,e);return this.target.mid=r,this.target.peerId=e.peerId,g}))}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||s.Z.has(e.mime_type)}}},5824:(e,t,i)=>{"use strict";i.d(t,{x:()=>Q,Z:()=>Y});var s=i(3725),n=i(4755),a=i(5432),o=i(4762),r=i(5003),d=i(3013),l=i(3910),c=i(3699),h=i(3003),u=i(5322),p=i(7529),f=i(6733),m=i(5157),g=i(7207),v=i(8427),b=i(5701),y=i(3815),w=i(925),S=i(2738);class C extends p.Z{constructor({video:e,play:t=!1,streamable:i=!1,duration:s,onPlaybackRackMenuToggle:n,onPip:a,onPipClose:o}){if(super(),this.video=e,this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.onPlaybackRackMenuToggle=n,this.onPip=a,this.onPipClose=o,this.listenerSetter=new c.Z,this.setup({element:this.wrapper,listenerSetter:this.listenerSetter,canHideControls:()=>!(this.video.paused||this.playbackRateButton&&this.playbackRateButton.classList.contains("menu-open")),showOnLeaveToClassName:"media-viewer-caption",ignoreClickClassName:"ckin__controls"}),e.parentNode.insertBefore(this.wrapper,e),this.wrapper.appendChild(e),this.skin="default",this.stylePlayer(s),this.setBtnMenuToggle(),"default"===this.skin){const t=this.wrapper.querySelector(".default__controls.ckin__controls");this.progress=new g.Z(e,i),t.prepend(this.progress.container)}t&&e.play().catch((t=>{"NotAllowedError"===t.name&&(e.muted=!0,e.autoplay=!0,e.play())})).finally((()=>{this.wrapper.classList.toggle("is-playing",!this.video.paused)}))}stylePlayer(e){const{wrapper:t,video:i,skin:s,listenerSetter:n}=this;t.classList.add(s);const o=this.buildControls();let r;if(t.insertAdjacentHTML("beforeend",o),"default"===s){this.playbackRateButton=this.wrapper.querySelector(".playback-rate"),this.pipButton=this.wrapper.querySelector(".pip");const e=t.querySelectorAll(".toggle"),s=t.querySelector(".fullscreen"),o=t.querySelector("#time-elapsed");r=t.querySelector("#time-duration"),r.textContent=(0,m.Z)(0|i.duration);const c=new v.Z(n),h=t.querySelector(".left-controls");if(c.btn.classList.remove("btn-icon"),h.insertBefore(c.btn,o.parentElement),Array.from(e).forEach((e=>{(0,S.fc)(e,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter})})),this.pipButton){(0,S.fc)(this.pipButton,(()=>{this.video.requestPictureInPicture()}),{listenerSetter:this.listenerSetter});const e=e=>{this.wrapper.style.visibility=e?"hidden":"",this.onPip&&this.onPip(e)},t=20,s=(0,b.Z)(e,t,!1,!0);n.add(i)("enterpictureinpicture",(()=>{s(!0),n.add(i)("leavepictureinpicture",(()=>{const e=n.add(i)("pause",(()=>{clearTimeout(s),this.onPipClose&&this.onPipClose()}),{once:!0}),s=setTimeout((()=>{n.remove(e)}),t)}),{once:!0})})),n.add(i)("leavepictureinpicture",(()=>{s(!1)}))}a.Z||((0,S.fc)(i,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter}),n.add(document)("keydown",(e=>{if(y.Z.overlaysActive>1||document.pictureInPictureElement===i)return;const{key:s,code:n}=e;let a=!0;if("KeyF"===n)this.toggleFullScreen();else if("KeyM"===n)d.Z.muted=!d.Z.muted;else if("Space"===n)this.togglePlay();else if(!e.altKey||"Equal"!==n&&"Minus"!==n)!t.classList.contains("ckin__fullscreen")||"ArrowLeft"!==s&&"ArrowRight"!==s?a=!1:"ArrowLeft"===s?d.Z.seekBackward({action:"seekbackward"}):d.Z.seekForward({action:"seekforward"});else{const e="Equal"===n?1:-1,t=d.Z.playbackRate,i=C.PLAYBACK_RATES.indexOf(t)+e;i>=0&&i{a.Z||this.toggleFullScreen()})),(0,S.fc)(s,(()=>{this.toggleFullScreen()}),{listenerSetter:this.listenerSetter}),(0,f.Ms)(t,this.onFullScreen.bind(this,s),n),n.add(i)("timeupdate",(()=>{o.textContent=(0,m.Z)(0|i.currentTime)})),n.add(i)("play",(()=>{t.classList.add("played"),a.Z||n.add(i)("play",(()=>{this.hideControls(!0)}))}),{once:!0}),n.add(i)("pause",(()=>{this.showControls(!1)})),n.add(d.Z)("playbackParams",(()=>{this.setPlaybackRateIcon()}))}n.add(i)("play",(()=>{t.classList.add("is-playing")})),n.add(i)("pause",(()=>{t.classList.remove("is-playing")})),i.duration||e?r.textContent=(0,m.Z)(Math.round(i.duration||e)):(0,w.Z)(i).then((()=>{r.textContent=(0,m.Z)(Math.round(i.duration))}))}togglePlay(){this.video[this.video.paused?"play":"pause"]()}buildControls(){const e=this.skin;if("default"===e)return`\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n ${!o.IS_MOBILE&&document.pictureInPictureEnabled?``:""}\n \n
\n
\n
`}setBtnMenuToggle(){const e=C.PLAYBACK_RATES.map(((e,t)=>({regularText:e+"x",onClick:()=>{d.Z.playbackRate=e}}))),t=(0,h.b)({buttons:e});t.classList.add("top-left"),(0,u.v)({el:this.playbackRateButton,onOpen:this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!0)}:void 0,onClose:this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!1)}:void 0}),this.playbackRateButton.append(t),this.setPlaybackRateIcon()}setPlaybackRateIcon(){const e=this.playbackRateButton;C.PLAYBACK_RATES_ICONS.forEach((t=>{t="tgico-"+t,e.classList.remove(t)}));let t=C.PLAYBACK_RATES.indexOf(d.Z.playbackRate);-1===t&&(t=C.PLAYBACK_RATES.indexOf(1)),e.classList.add("tgico-"+C.PLAYBACK_RATES_ICONS[t])}toggleFullScreen(){const e=this.wrapper;if(o.IS_APPLE_MOBILE){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}(0,f.rB)()?(0,f.C8)():(0,f.Dj)(e)}onFullScreen(e){const t=(0,f.rB)();this.wrapper.classList.toggle("ckin__fullscreen",t),t?(e.classList.remove("tgico-fullscreen"),e.classList.add("tgico-smallscreen"),e.setAttribute("title","Exit Full Screen")):(e.classList.remove("tgico-smallscreen"),e.classList.add("tgico-fullscreen"),e.setAttribute("title","Full Screen"))}cleanup(){super.cleanup(),this.listenerSetter.removeAll(),this.progress.removeListeners(),this.onPlaybackRackMenuToggle=this.onPip=void 0}}C.PLAYBACK_RATES=[.5,1,1.5,2],C.PLAYBACK_RATES_ICONS=["playback_05","playback_1x","playback_15","playback_2x"];var L=i(3512),E=i(5814),I=i(9331),M=i(2230),P=i(3442),Z=i(3757),T=i(632),k=i(6385),x=i(8497),A=i(6740),_=i(8204),F=i(9171),D=i(5565),R=i(3035),B=i(65),N=i(241),O=i(3241),U=i(1507),H=i(7660),z=i(8580),j=i(1713),G=i(8115),V=i(4421),K=i(2312),W=i(7362),$=i(2796),q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Q="media-viewer";class Y extends O.Z{get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}constructor(e,t){super(!1),this.listLoader=e,this.author={},this.content={},this.buttons={},this.tempId=0,this.preloader=null,this.preloaderStreamable=null,this.isFirstOpen=!0,this.pageEl=document.getElementById("page-chats"),this.zoomElements={},this.zoomSwipeStartX=0,this.zoomSwipeStartY=0,this.zoomSwipeX=0,this.zoomSwipeY=0,this.setZoomValue=(e=this.zoomElements.rangeSelector.value)=>{1===e&&(this.zoomSwipeX=0,this.zoomSwipeY=0),this.moversContainer.style.transform=`matrix(${e}, 0, 0, ${e}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`,this.zoomElements.btnOut.classList.toggle("inactive",.5===e),this.zoomElements.btnIn.classList.toggle("inactive",4===e),this.toggleZoom(1!==e)},this.onClick=e=>{if(this.setMoverAnimationPromise)return;const t=e.target;if("A"===t.tagName)return;if((0,l.Z)(e),a.Z)return this.highlightSwitchersTimeout?clearTimeout(this.highlightSwitchersTimeout):this.wholeDiv.classList.add("highlight-switchers"),void(this.highlightSwitchersTimeout=window.setTimeout((()=>{this.wholeDiv.classList.remove("highlight-switchers"),this.highlightSwitchersTimeout=0}),3e3));const i=this.isZooming();let s=null;const n=["ckin__player","media-viewer-buttons","media-viewer-author","media-viewer-caption","zoom-container"];i&&n.push("media-viewer-movers"),n.find((e=>{try{if(s=(0,x.Z)(t,e),s)return!0}catch(e){return!1}})),s&&(i||"IMG"!==t.tagName&&"image"!==t.tagName)||this.close()},this.onKeyDown=e=>{if(y.Z.overlaysActive>1)return;const t=e.key;let i=!0;"ArrowRight"===t?this.buttons.next.click():"ArrowLeft"===t?this.buttons.prev.click():"-"===t||"="===t?this.ctrlKeyDown&&this.changeZoom("="===t):i=!1,(e.ctrlKey||e.metaKey)&&(this.ctrlKeyDown=!0),i&&(0,l.Z)(e)},this.onKeyUp=e=>{y.Z.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming()&&this.setZoomValue())},this.onWheel=e=>{if(!(y.Z.overlaysActive>1||(0,x.Z)(e.target,"media-viewer-caption")&&!this.ctrlKeyDown)&&((0,l.Z)(e),this.ctrlKeyDown)){const t=e.deltaY<0;this.changeZoom(!!t)}},this.managers=L.Z.managers,this.log=(0,r.kg)("AMV"),this.preloader=new P.Z,this.preloaderStreamable=new P.Z({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new V.Z,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add(Q+"-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const i=document.createElement("div");i.classList.add(Q);const s=this.topbar=document.createElement("div");s.classList.add(Q+"-topbar",Q+"-appear");const n=document.createElement("div");n.classList.add(Q+"-topbar-left"),this.buttons["mobile-close"]=(0,M.Z)("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add(Q+"-author","no-select");const o=document.createElement("div");this.author.avatarEl=new I.Z,this.author.avatarEl.classList.add(Q+"-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add(Q+"-name"),this.author.date=document.createElement("div"),this.author.date.classList.add(Q+"-date"),o.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,o);const d=document.createElement("div");d.classList.add(Q+"-buttons"),t.concat(["download","zoom","close"]).forEach((e=>{const t=(0,M.Z)(e,{noRipple:!0});this.buttons[e]=t,d.append(t)})),this.buttons.zoom.classList.add("zoom-in"),this.zoomElements.container=document.createElement("div"),this.zoomElements.container.classList.add("zoom-container"),this.zoomElements.btnOut=(0,M.Z)("zoomout",{noRipple:!0}),(0,S.fc)(this.zoomElements.btnOut,(()=>this.changeZoom(!1))),this.zoomElements.btnIn=(0,M.Z)("zoomin",{noRipple:!0}),(0,S.fc)(this.zoomElements.btnIn,(()=>this.changeZoom(!0))),this.zoomElements.rangeSelector=new B.Z({step:.5,min:.5,max:4,withTransition:!0},1),this.zoomElements.rangeSelector.setListeners(),this.zoomElements.rangeSelector.setHandlers({onScrub:this.setZoomValue,onMouseUp:()=>this.setZoomValue()}),this.zoomElements.container.append(this.zoomElements.btnOut,this.zoomElements.rangeSelector.container,this.zoomElements.btnIn),this.wholeDiv.append(this.zoomElements.container),this.content.main=document.createElement("div"),this.content.main.classList.add(Q+"-content"),this.content.container=document.createElement("div"),this.content.container.classList.add(Q+"-container"),this.content.media=document.createElement("div"),this.content.media.classList.add(Q+"-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),i.append(this.content.main),this.overlaysDiv.append(i),n.append(this.buttons["mobile-close"],this.author.container),s.append(n,d),this.buttons.prev=document.createElement("div"),this.buttons.prev.className=`${Q}-switcher ${Q}-switcher-left`,this.buttons.prev.innerHTML=``,this.buttons.next=document.createElement("div"),this.buttons.next.className=`${Q}-switcher ${Q}-switcher-right`,this.buttons.next.innerHTML=``,this.moversContainer=document.createElement("div"),this.moversContainer.classList.add(Q+"-movers"),this.wholeDiv.append(this.overlaysDiv,this.buttons.prev,this.buttons.next,this.topbar,this.moversContainer),this.listLoader.onLoadedMore=()=>{this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length)},this.setNewMover()}setListeners(){(0,S.fc)(this.buttons.download,this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach((e=>{(0,S.fc)(e,this.close.bind(this))})),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach((([e,t])=>{t.addEventListener("click",(t=>{(0,l.Z)(t),this.setMoverPromise||this.listLoader.go(e)}))})),(0,S.fc)(this.buttons.zoom,(()=>{this.isZooming()?this.toggleZoom(!1):this.changeZoom(!0)})),this.wholeDiv.addEventListener("click",this.onClick),this.listLoader.onJump=(e,t)=>{t?this.onNextClick(e):this.onPrevClick(e)},a.Z&&new Z.Z({element:this.wholeDiv,onSwipe:(e,t)=>{if(!(0,f.rB)())return Math.abs(e)/N.Z.width>.2||e>125?(e>0?this.buttons.prev.click():this.buttons.next.click(),!0):(Math.abs(t)/N.Z.height>.2||t>125)&&(this.close(),!0)},verifyTouchTarget:e=>(console.log("verify"),"INPUT"!==e.target.tagName&&!(0,x.Z)(e.target,"media-viewer-caption"))})}toggleZoom(e){const t=this.isZooming();if((this.zoomElements.rangeSelector.mousedown||this.ctrlKeyDown)&&(e=!0),t===e)return;void 0===e&&(e=!t),this.buttons.zoom.classList.toggle("zoom-in",!e),this.zoomElements.container.classList.toggle("is-visible",e);const i=e?this.zoomElements.rangeSelector.value:1;if(this.setZoomValue(i),this.zoomElements.rangeSelector.setProgress(i),this.videoPlayer&&this.videoPlayer.lockControls(!e&&void 0),e){if(this.zoomSwipeHandler)this.zoomSwipeHandler.setListeners();else{let e,t;const i=1;this.zoomSwipeHandler=new Z.Z({element:this.moversContainer,onFirstSwipe:()=>{e=t=0,this.moversContainer.classList.add("no-transition")},onSwipe:(s,n)=>{[s,n]=[s*i,n*i],this.zoomSwipeX+=s-e,this.zoomSwipeY+=n-t,[e,t]=[s,n],this.setZoomValue()},onReset:()=>{this.moversContainer.classList.remove("no-transition")},cursor:"move"})}this.zoomElements.rangeSelector.setProgress(i)}else e||this.zoomSwipeHandler.removeListeners()}changeZoom(e){this.zoomElements.rangeSelector.addProgress(.5*(e?1:-1)),this.setZoomValue()}isZooming(){return this.zoomElements.container.classList.contains("is-visible")}setBtnMenuToggle(e){const t=(0,u.Z)({buttonOptions:{onlyMobile:!0},direction:"bottom-left",buttons:e});this.topbar.append(t)}close(e){var t;if(e&&(0,l.Z)(e),this.setMoverAnimationPromise)return Promise.reject();this.navigationItem&&k.Z.removeItem(this.navigationItem),this.lazyLoadQueue.clear();const i=this.setMoverToTarget(null===(t=this.target)||void 0===t?void 0:t.element,!0).then((({onAnimationEnd:e})=>e));return this.listLoader.reset(),this.listLoader.cleanup&&this.listLoader.cleanup(),this.setMoverPromise=null,this.tempId=-1,window.appMediaViewer===this&&(window.appMediaViewer=void 0),this.removeGlobalListeners(),this.zoomSwipeHandler=void 0,i.finally((()=>{this.wholeDiv.remove(),this.toggleOverlay(!1)})),i}toggleOverlay(e){y.Z.isOverlayActive=e,E.Z.checkAnimations2(e)}toggleGlobalListeners(e){e?this.setGlobalListeners():this.removeGlobalListeners()}removeGlobalListeners(){this.zoomSwipeHandler&&this.zoomSwipeHandler.removeListeners(),window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp),window.removeEventListener("wheel",this.onWheel,{capture:!0})}setGlobalListeners(){this.isZooming()&&this.zoomSwipeHandler.setListeners(),window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp),a.Z||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0})}setMoverToTarget(e,t=!1,i=0){return q(this,void 0,void 0,(function*(){this.dispatchEvent("setMoverBefore");const n=this.content.mover;t||(n.innerHTML="");const a=this.isZooming()&&t?this.zoomElements.rangeSelector.value:1;this.removeCenterFromMover(n);const o=0!==i,r=L.Z.settings.animationsEnabled?o?350:200:0;let d,l;e&&(e instanceof I.Z||e.classList.contains("grid-item")?(d=e,l=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(d=(0,x.Z)(e,"attachment"),l=d.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(d=(0,x.Z)(e,"profile-avatars-container"),l=d.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==l.left&&(e=d=l=void 0))),e||(e=this.content.media),l||(d=e.parentElement,l=e.getBoundingClientRect());let c=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const i=(0,x.Z)(d,"scrollable"),s=(0,_.Z)(d,i,!0);!t||s&&2!==s.overflow.vertical&&2!==s.overflow.horizontal?!s||1!==s.overflow.vertical&&1!==s.overflow.horizontal||(c=!0):(d=(e=this.content.media).parentElement,l=e.getBoundingClientRect())}const h=this.content.media.getBoundingClientRect();let u,p,f,m="";if(o?(u=1===i?N.Z.width:-h.width,p=h.top):(u=l.left,p=l.top),m+=`translate3d(${u}px,${p}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(n.firstElementChild&&n.firstElementChild.classList.contains("media-viewer-aspecter")){f=n.firstElementChild;const e=f.querySelector(".ckin__player");if(e){const t=e.firstElementChild;f.append(t),e.remove()}f.style.cssText||(n.classList.remove("active"),this.setFullAspect(f,h,l),n.offsetLeft,n.classList.add("active"))}else f=document.createElement("div"),f.classList.add("media-viewer-aspecter"),n.prepend(f);f.style.cssText=`width: ${l.width}px; height: ${l.height}px; transform: scale3d(${h.width/l.width}, ${h.height/l.height}, 1);`}n.style.width=h.width+"px",n.style.height=h.height+"px";const g=l.width/h.width,v=l.height/h.height;o||(m+=`scale3d(${g},${v},1) `);let b=window.getComputedStyle(d).getPropertyValue("border-radius");const y=function(e){const t=e.split(" ");if(4!==t.length){t[0]||(t[0]="0px");for(let e=t.length;e<4;++e)t[e]=t[e%2]||t[0]||"0px"}return t}(b);if(b=y.map((e=>parseInt(e)/g+"px")).join(" "),o||(n.style.borderRadius=b),t&&1!==a){const e=N.Z.width/2-l.width/2,t=N.Z.height/2-l.height/2,i=l.left-e,s=l.top-t;this.moversContainer.style.transform=`matrix(${g}, 0, 0, ${v}, ${i}, ${s})`}else n.style.transform=m;let w;c&&(n.style.opacity="0");const S=e.classList.contains("is-out"),C=this.setMoverAnimationPromise=(0,s.Z)(),E={onAnimationEnd:C},M=setTimeout((()=>{C.isFulfilled||C.isRejected||C.resolve()}),1e3);if(C.finally((()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===C&&(this.setMoverAnimationPromise=null),clearTimeout(M)})),t)return e instanceof SVGSVGElement&&(w=n.querySelector("path"),w&&this.sizeTailPath(w,h,g,r,!1,S,b)),e.classList.contains("media-viewer-media")&&n.classList.add("hiding"),this.toggleWholeActive(!1),setTimeout((()=>{n.style.borderRadius=b,n.firstElementChild&&(n.firstElementChild.style.borderRadius=b)}),r/2),setTimeout((()=>{n.innerHTML="",n.classList.remove("moving","active","hiding"),n.style.cssText="display: none;",C.resolve()}),r),n.classList.remove("opening"),E;{let t,i;const s="video, img, .canvas-thumbnail",a=e.matches(s)?e.parentElement:e,r=Array.from(a.querySelectorAll(s));if(r.length){e=r.pop();const t=document.createElement("canvas"),i=t.getContext("2d");e instanceof HTMLImageElement?(t.width=e.naturalWidth,t.height=e.naturalHeight):e instanceof HTMLVideoElement?(t.width=e.videoWidth,t.height=e.videoHeight):e instanceof HTMLCanvasElement&&(t.width=e.width,t.height=e.height),t.className="canvas-thumbnail thumbnail media-photo",i.drawImage(e,0,0),e=t}if("DIV"===e.tagName||"AVATAR-ELEMENT"===e.tagName){const s=Array.from(e.querySelectorAll("img")).pop();s&&(t=new Image,i=s.src,n.append(t))}else if(e instanceof HTMLImageElement)t=new Image,i=e.src;else if(e instanceof HTMLVideoElement)t=(0,H.Z)(),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,i=t+"-mv",{width:s,height:a}=h,o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttributeNS(null,"width",""+s),o.setAttributeNS(null,"height",""+a),o.setAttributeNS(null,"viewBox",`0 0 ${s} ${a}`),o.setAttributeNS(null,"preserveAspectRatio","xMidYMid meet"),o.insertAdjacentHTML("beforeend",e.firstElementChild.outerHTML.replace(t,i)),o.insertAdjacentHTML("beforeend",e.lastElementChild.outerHTML.replace(t,i));const r=o.firstElementChild,d=r.firstElementChild.firstElementChild;if(d instanceof SVGUseElement){let e,t=d.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,((e,t,i,n,o)=>`translate(${t=2!=(t=+t)?s-2/g:2/g}, ${a}) scale(${+n/g}, ${+o/v})`)),d.setAttributeNS(null,"transform",t),w=r.firstElementChild.lastElementChild;const i=b.split(" ").map((e=>parseInt(e)));e=S?(0,F.Z)(0,0,s-9/g,a,...i):(0,F.Z)(9/g,0,s-9/g,a,...i),w.setAttributeNS(null,"d",e)}const l=o.lastElementChild;l.setAttributeNS(null,"width",""+h.width),l.setAttributeNS(null,"height",""+h.height),n.prepend(o)}else e instanceof HTMLCanvasElement&&(t=e);f&&(f.style.borderRadius=b,t&&f.append(t)),t=n.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),f||(t.style.width=h.width+"px",t.style.height=h.height+"px"),i&&(yield(0,A.cj)(t,i))),n.style.display="",(0,R.T2)((()=>{n.classList.add(o?"moving":"active")}))}return n.classList.add("opening"),yield(0,R.d1)(),n.style.transform=`translate3d(${h.left}px,${h.top}px,0) scale3d(1,1,1)`,c&&(n.style.opacity=""),f&&this.setFullAspect(f,h,l),setTimeout((()=>{n.style.borderRadius="",n.firstElementChild&&(n.firstElementChild.style.borderRadius="")}),0),n.dataset.timeout=""+setTimeout((()=>{n.classList.remove("moving","opening"),f&&(n.querySelector("video"),n.classList.remove("active"),f.style.cssText="",n.offsetLeft),n.classList.add("center","no-transition"),n.classList.add("active"),delete n.dataset.timeout,C.resolve()}),r),w&&this.sizeTailPath(w,h,g,r,!0,S,b),E}))}toggleWholeActive(e){e?this.wholeDiv.classList.add("active"):(this.wholeDiv.classList.add("backwards"),setTimeout((()=>{this.wholeDiv.classList.remove("active")}),0))}setFullAspect(e,t,i){const s=t.width/t.height;let{width:n,height:a}=i;s>0?n=a*s:a=n*s,e.style.cssText=`width: ${n}px; height: ${a}px; transform: scale3d(${t.width/n}, ${t.height/a}, 1);`}sizeTailPath(e,t,i,s,n,a,o){const r=Date.now(),{width:d,height:l}=t;s/=2;const c=o.split(" ").map((e=>parseInt(e))),h=()=>{const t=Date.now()-r;let o=s?t/s:1;o>1&&(o=1),n&&(o=1-o);const u=c.map((e=>e*o));let p;p=a?(0,F.Z)(0,0,d-9/i*o,l,...u):(0,F.Z)(9/i*o,0,d,l,...u),e.setAttributeNS(null,"d",p),t{const a=t?-s.width:i;return e.replace(n,a+"px")}));e.style.transform=n,setTimeout((()=>{e.remove()}),350)}setNewMover(){const e=document.createElement("div");return e.classList.add("media-viewer-mover"),e.style.display="none",this.content.mover?this.content.mover.parentElement.append(e):this.moversContainer.append(e),this.content.mover=e}updateMediaSource(e,t,i){const s=e.tagName.toLowerCase()===i?e:e.querySelector(i);if(s&&!(0,x.Z)(e,"document")){if((0,x.Z)(e,"attachment")){const t=e.parentElement.parentElement.querySelector(".preloader-container");if(t){if("video"===i)return void(t.classList.contains("manual")&&t.click());t.remove()}}s.src!==t&&(0,A.ZP)(s,t),s.classList.contains("thumbnail")&&s.parentElement.classList.contains("media-container-aspecter")&&s.classList.remove("thumbnail")}}setAuthorInfo(e,t){const i=e.isPeerId();let s;if(i)s=(0,W.Z)({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1});else{const t=s=document.createElement("span");t.append((0,G.Z)(e)),t.classList.add("peer-title")}const n=this.author.avatarEl,a=this.author.avatarEl=n.cloneNode();return Promise.all([this.author.avatarEl.updateWithOptions({peerId:e||U.NM,peerTitle:i?void 0:""+e}),s]).then((([e,i])=>{this.author.avatarEl===a&&((0,D.Z)(this.author.date,(0,T.OD)(t)),(0,D.Z)(this.author.nameEl,i),n.replaceWith(this.author.avatarEl))}))}_openMedia(e,t,i,s,a,r=!1,c=[],h=[],u){return q(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const p=this.setAuthorInfo(i,t),f="document"===e._,m=f&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(c,h,r),window.appMediaViewer=this),this.listLoader.next.length<10&&setTimeout((()=>{this.listLoader.load(!0)}),0),this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length);const g=this.content.media,v=!a||a===g;v&&(a=g),this.target={element:a};const b=++this.tempId;g.firstElementChild&&(g.innerHTML=""),0!==s?(this.moveTheMover(this.content.mover,1===s),this.setNewMover()):(this.toggleOverlay(!0),this.setGlobalListeners(),yield p,this.wholeDiv.parentElement||(this.pageEl.insertBefore(this.wholeDiv,document.getElementById("main-columns")),this.wholeDiv.offsetLeft),this.toggleWholeActive(!0),o.IS_MOBILE_SAFARI||(this.navigationItem={type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}},k.Z.pushItem(this.navigationItem)));const y=this.content.mover,w=N.Z.width;let S=0;const L=N.Z.height;L<1e6&&!n.Z.isMobile&&(S=120);const E=L-120-S;let I=Promise.resolve();const M=(0,j.Z)(e,g,w,E,!n.Z.isMobile,void 0,!!(f&&e.w&&e.h)).photoSize;if(v){const t=yield this.managers.thumbsStorage.getCacheContext(e,M.type);let i;if(t.downloaded)i=new Image,i.src=t.url;else{const s=(0,z.Z)(e,t,!0);s&&(I=s.loadPromise,i=s.image)}i&&(i.classList.add("thumbnail"),g.append(i))}const P=!(!f||!e.supportsStreaming),Z=P?this.preloaderStreamable:this.preloader,T=()=>this.managers.thumbsStorage.getCacheContext(e,null==M?void 0:M.type);let x;if(m){const t=u&&"gif"!==e.type,i=(0,H.Z)({pip:t});this.wholeDiv.classList.contains("no-forwards")&&i.addEventListener("contextmenu",l.Z);const n=()=>this.setMoverToTarget(a,!1,s).then((({onAnimationEnd:s})=>{const n=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,r=y.querySelector("video");r&&r.remove(),i.setAttribute("playsinline","true"),i.addEventListener("timeupdate",(()=>{this.tempId!==b&&i.pause()})),this.addEventListener("setMoverAfter",(()=>{i.src="",i.load()}),{once:!0}),o.IS_SAFARI&&(i.autoplay=!0),"gif"===e.type?(i.muted=!0,i.autoplay=!0,i.loop=!0):e.duration<60&&(i.loop=!0),n.append(i);const c=new Promise((e=>{i.addEventListener("canplay",e,{once:!0})})),h=()=>{"gif"!==e.type&&(i.dataset.ckin="default",i.dataset.overlay="1",Promise.all([c,s]).then((()=>{this.tempId===b&&((this.videoPlayer=new C({video:i,play:!0,streamable:P,onPlaybackRackMenuToggle:e=>{this.wholeDiv.classList.toggle("hide-caption",!!e)},onPip:e=>{const s=window.appMediaViewer;if(!e&&s&&s!==this)return this.releaseSingleMedia=void 0,void this.close();this.moversContainer.lastElementChild.classList.toggle("hiding",e),this.toggleWholeActive(!e),this.toggleOverlay(!e),this.toggleGlobalListeners(!e),this.navigationItem&&(e?k.Z.removeItem(this.navigationItem):k.Z.pushItem(this.navigationItem)),t&&(e?(this.releaseSingleMedia(!1),this.releaseSingleMedia=void 0,d.Z.setPictureInPicture(i)):this.releaseSingleMedia=d.Z.setSingleMedia(i,u))},onPipClose:()=>{this.close()}})).addEventListener("toggleControls",(e=>{this.wholeDiv.classList.toggle("has-video-controls",e)})),this.addEventListener("setMoverBefore",(()=>{this.wholeDiv.classList.remove("has-video-controls"),this.videoPlayer.cleanup(),this.videoPlayer=void 0}),{once:!0}),this.isZooming()&&this.videoPlayer.lockControls(!1))})))};if(P){s.then((()=>{i.readyState{i.addEventListener("canplay",(()=>{Z.detach(),i.parentElement.classList.remove("is-buffering")}),{once:!0})};i.addEventListener("waiting",(()=>{const t=i.networkState===i.NETWORK_LOADING,s=i.readyState{(0,l.Z)(e)})),e()}this.lazyLoadQueue.unshift({load:()=>q(this,void 0,void 0,(function*(){const r=P?Promise.resolve():K.Z.downloadMediaURL({media:e});return P||s.then((()=>q(this,void 0,void 0,(function*(){(yield T()).url||Z.attach(y,!0,r)})))),Promise.all([r,s]).then((()=>q(this,void 0,void 0,(function*(){if(this.tempId!==b)return void this.log.warn("media viewer changed video");const e=(yield T()).url;i.addEventListener("error",(()=>{(0,$.bC)({langPackKey:o.IS_MOBILE?"Video.Unsupported.Mobile":"Video.Unsupported.Desktop"}),4!==i.error.code&&this.log.error("Error "+i.error.code+"; details: "+i.error.message),null==Z||Z.detach()}),{once:!0}),a instanceof SVGSVGElement?n.firstElementChild.lastElementChild.append(i):(0,A.ZP)(i,e),t&&(this.releaseSingleMedia=d.Z.setSingleMedia(i,u),this.addEventListener("setMoverBefore",(()=>{this.releaseSingleMedia&&(this.releaseSingleMedia(),this.releaseSingleMedia=void 0)}),{once:!0})),this.updateMediaSource(a,e,"video"),h()})))),r}))})}));x=I.then(n)}else{const t=()=>this.setMoverToTarget(a,!1,s).then((({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>q(this,void 0,void 0,(function*(){const i=f?K.Z.downloadMediaURL({media:e}):K.Z.downloadMediaURL({media:e,thumb:M});return t.then((()=>q(this,void 0,void 0,(function*(){(yield T()).url||this.preloader.attachPromise(i)})))),Promise.all([t,i]).then((()=>q(this,void 0,void 0,(function*(){var e;if(this.tempId!==b)return void this.log.warn("media viewer changed photo");const t=(yield T()).url;if(a instanceof SVGSVGElement){if(this.updateMediaSource(a,t,"img"),this.updateMediaSource(y,t,"img"),n.Z.isMobile){const e=y.querySelectorAll("img");e&&e.length&&e.forEach((e=>{e.classList.remove("thumbnail")}))}}else{const i=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,s="IMG"===(null===(e=i.firstElementChild)||void 0===e?void 0:e.tagName)?i.firstElementChild:null;if(!s||s.src!==t){const e=new Image;e.classList.add("thumbnail"),(0,A.ZP)(e,t,(()=>{this.updateMediaSource(a,t,"img"),s&&(0,R.T2)((()=>{s.remove()})),i.append(e)}))}}})))).catch((e=>{this.log.error(e),this.preloader.attach(y),this.preloader.setManual()})),i}))})}));x=I.then(t)}return this.setMoverPromise=x.catch((()=>{this.setMoverAnimationPromise=null})).finally((()=>{this.setMoverPromise=null}))}))}}},6385:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(410),n=i(4762),a=i(5003),o=i(8799),r=i(3910),d=i(3444),l=i(1655);const c=new class{constructor(){if(this.onPopState=e=>{const t=window.location.hash,i=e.state;if(this.debug&&this.log("popstate",e,this.isPossibleSwipe,t),t!==this.currentHash)if(this.debug&&this.log.warn(`hash changed, new=${t}, current=${this.currentHash}, overridden=${this.overriddenHash}`),i===this.id&&this.overriddenHash&&this.overriddenHash!==t)this.overrideHash(this.overriddenHash);else{if(!i||this.overriddenHash||!t)return this.currentHash=t,void(this.onHashChange&&this.onHashChange());this.overrideHash()}if(i!==this.id&&(this.pushState(),!this.navigations.length))return;const s=this.navigations.pop();s?(this.manual=!this.isPossibleSwipe,this.handleItem(s)):this.pushState()},this.onKeyDown=e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||((0,r.Z)(e),this.back(t.type)))},this.onTouchStart=e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),(0,d.Z)(e)&&(this.isPossibleSwipe=!0,window.addEventListener("touchend",(()=>{setTimeout((()=>{this.isPossibleSwipe=!1}),100)}),{passive:!0,once:!0})))},this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=(0,a.kg)("NC"),this.debug=!0,this.currentHash=window.location.hash,this.overriddenHash="",this.isPossibleSwipe=!1,window.addEventListener("popstate",this.onPopState),window.addEventListener("keydown",this.onKeyDown,{capture:!0,passive:!1}),n.IS_MOBILE_SAFARI){const e={passive:!0};window.addEventListener("touchstart",this.onTouchStart,e)}history.scrollRestoration="manual",this.pushState()}overrideHash(e=""){e&&"#"!==e[0]?e="#"+e:"#"===e&&(e=""),this.currentHash!==e&&(this.overriddenHash=this.currentHash=e,this.replaceState(),this.pushState())}handleItem(e){const t=e.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",e,this.navigations),!1===t?this.pushItem(e):e.noBlurOnPop||(0,o.Z)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const i=this.navigations[t];if(i.type===e)return{item:i,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}onItemAdded(e){this.debug&&this.log("onItemAdded",e,this.navigations),e.noHistory||this.pushState()}pushItem(e){this.navigations.push(e),this.onItemAdded(e)}unshiftItem(e){this.navigations.unshift(e),this.onItemAdded(e)}spliceItems(e,t,...i){this.navigations.splice(e,t,...i),i.forEach((e=>{this.onItemAdded(e)}))}pushState(){this.debug&&this.log("push"),this.manual=!1,history.pushState(this.id,"")}replaceState(){this.debug&&this.log.warn("replace");const e=location.origin+location.pathname+location.search+this.overriddenHash;history.replaceState(this.id,"",e)}removeItem(e){e&&(0,l.Z)(this.navigations,e)}removeByType(e,t=!1){for(let i=this.navigations.length-1;i>=0&&(this.navigations[i].type!==e||(this.navigations.splice(i,1),!t));--i);}};s.GO.appNavigationController=c;const h=c},5884:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,z:()=>d});var s=i(8130),n=i(8805),a=i(5565),o=i(2325),r=i(3512);class d{constructor(e,t,i=!0,n,a=!0,r=!0,d,l){this.name=e,this.type=t,this.clearable=i,this.autonomous=r,this.onFound=d,this.noIcons=l,this.list=s.default.createChatList(),this.container=document.createElement("div"),n&&(this.container.className=n),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append((0,o.ag)(e)),this.container.append(this.nameEl)),this.container.classList.add("search-group","search-group-"+t),this.container.append(this.list),this.container.style.display="none",a&&s.default.setListClickListener(this.list,d,void 0,r)}clear(){this.container.style.display="none",this.clearable&&(this.list.innerHTML="")}setActive(){this.container.style.display=""}toggle(){this.list.childElementCount?this.setActive():this.clear()}}class l{constructor(e,t,i,s,a){this.container=e,this.searchInput=t,this.searchGroups=i,this.onSearch=s,this.noIcons=a,this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1,this.searchPromise=null,this.searchTimeout=0,this.query="",this.listsContainer=null,this.threadId=0,this.scrollable=new n.ZP(this.container),this.listsContainer=this.scrollable.container;for(const e in this.searchGroups)this.listsContainer.append(this.searchGroups[e].container);this.searchGroups.messages&&this.scrollable.setVirtualContainer(this.searchGroups.messages.list),this.searchInput.onChange=e=>{this.query=e,this.reset(!1),this.searchMore()},this.scrollable.onScrolledBottom=()=>{this.query.trim()&&(this.searchTimeout||(this.searchTimeout=window.setTimeout((()=>{this.searchMore(),this.searchTimeout=0}),0)))}}reset(e=!0){e&&(this.searchInput.value="",this.query="",this.peerId=void 0,this.threadId=0),this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1;for(const e in this.searchGroups)this.searchGroups[e].clear();this.searchPromise=null}beginSearch(e,t=0,i=""){this.peerId=e,this.threadId=t,this.query!==i&&(this.searchInput.inputField.value=i),this.searchInput.input.focus()}searchMore(){if(this.searchPromise)return this.searchPromise;const e=this.query;if(!e.trim())return void(this.onSearch&&this.onSearch(0));if(-1!==this.foundCount&&this.loadedCount>=this.foundCount)return Promise.resolve();const t=this.minMsgId||0;return this.searchPromise=r.Z.managers.appMessagesManager.getSearch({peerId:this.peerId,query:e,inputFilter:{_:"inputMessagesFilterEmpty"},maxId:t,limit:20,threadId:this.threadId}).then((t=>{if(this.searchPromise=null,this.searchInput.value!==e)return;const{count:i,history:n}=t;n.length&&n[0].mid===this.minMsgId&&n.shift();const r=this.searchGroups.messages;n.forEach((t=>{try{const i=this.peerId?t.fromId:t.peerId;s.default.addDialogAndSetLastMessage({peerId:i,container:this.scrollable,avatarSize:"bigger",meAsSaved:!1,message:t,query:e,noIcons:this.noIcons})}catch(e){console.error("[appSearch] render search result",e)}})),r.toggle(),this.minMsgId=n.length&&n[n.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=n.length,-1===this.foundCount&&(this.foundCount=i,r.nameEl&&(0,a.Z)(r.nameEl,(0,o.ag)(i?"Chat.Search.MessagesFound":"Chat.Search.NoMessagesFound",[i])),this.onSearch&&this.onSearch(this.foundCount))})).catch((e=>{console.error("search error",e),this.searchPromise=null}))}}},6360:(e,t,i)=>{"use strict";i.d(t,{Z:()=>fe});var s=i(8130),n=i(5003),a=i(3512),o=i(5884),r=i(6008),d=i(2153),l=i(279),c=i(1405),h=i(8805),u=i(8594),p=i(2325),f=i(8497),m=i(3624),g=i(2894),v=i(4668),b=i(4332),y=i(4755),w=i(4271),S=i(4484),C=i(467),L=i(5432),E=i(1154),I=i(241),M=i(6272),P=i(3003),Z=i(4524),T=i(5128),k=i(7479),x=i(5705),A=i(6054),_=i(3910),F=i(2738),D=i(1784),R=i(8479),B=i(7401),N=i(5953),O=i(3738),U=i(4064),H=i(130),z=i(7030),j=i(2498),G=i(1336),V=i(5798),K=i(2342),W=i(2491),$=i(5400),q=i(5671),Q=i(1604),Y=i(7530),X=i(6566),J=i(177),ee=i(3061),te=i(2566),ie=i(6976),se=i(3416),ne=i(1483),ae=i(3855),oe=i(3699),re=i(296),de=i(9492),le=i(2887),ce=i(319),he=i(6131),ue=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class pe{constructor(e,t,i){this.attachTo=e,this.searchSuper=t,this.listenerSetter=i,this.onGotoClick=()=>{w.ZP.setInnerPeer({peerId:this.peerId,lastMsgId:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?(0,F.tH)(this.searchSuper.selection.selectionForwardBtn):new Z.Z({[this.peerId]:[this.mid]})},this.onSelectClick=()=>{this.searchSuper.selection.toggleByElement(this.target)},this.onClearSelectionClick=()=>{this.searchSuper.selection.cancelSelection()},this.onDeleteClick=()=>{this.searchSuper.selection.isSelecting?(0,F.tH)(this.searchSuper.selection.selectionDeleteBtn):new T.Z(this.peerId,[this.mid],"chat")},this.managers=t.managers;L.Z||(0,ie.E)({element:e,callback:e=>{let i;this.init&&(this.init(),this.init=null);try{i=(0,f.Z)(e.target,"search-super-item")}catch(e){}if(i){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),(()=>{ue(this,void 0,void 0,(function*(){this.target=i,this.peerId=i.dataset.peerId.toPeerId(),this.mid=+i.dataset.mid,this.isSelected=t.selection.isMidSelected(this.peerId,this.mid),yield Promise.all(this.buttons.map((e=>ue(this,void 0,void 0,(function*(){let t;t=!(this.isSelected&&!e.withSelection)&&(!e.verify||(yield e.verify())),e.element.classList.toggle("hide",!t)}))))),i.classList.add("menu-open"),(0,ne.Z)(e,this.element),se.Z.openBtnMenu(this.element,(()=>{i.classList.remove("menu-open")}))}))})()}},listenerSetter:i})}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>ue(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canForward(yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,this.mid))}))},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionForwardBtn.classList.contains("hide"),withSelection:!0},{icon:"message",text:"Message.Context.Goto",onClick:this.onGotoClick,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>ue(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canDeleteMessage(yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,this.mid))}))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionDeleteBtn.classList.contains("hide"),withSelection:!0}],this.element=(0,P.b)({buttons:this.buttons,listenerSetter:this.listenerSetter}),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class fe{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new d.Z,this.middleware=(0,m.k)(),this.historyStorage={},this.usedFromHistory={},this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=(0,n.kg)("SEARCH-SUPER"),this.monthContainers={},this.mediaTabsMap=new Map,this.asChatList=!1,this.groupByMonth=!0,this.hideEmptyTabs=!0,this.showSender=!1,this.onTransitionStart=()=>{this.container.classList.add("sliding")},this.onTransitionEnd=()=>{this.container.classList.remove("sliding")},(0,N.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.listenerSetter=new oe.Z,this.searchContextMenu=new pe(this.container,this,this.listenerSetter),this.selection=new A.e(this,this.managers,this.listenerSetter);const t=this.navScrollableContainer=document.createElement("div");t.classList.add("search-super-tabs-scrollable","menu-horizontal-scrollable","sticky");const i=this.navScrollable=new h.v7(t);i.container.classList.add("search-super-nav-scrollable");const s=this.nav=document.createElement("nav");s.classList.add("search-super-tabs","menu-horizontal-div"),this.tabsMenu=s,i.container.append(s);for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const i=document.createElement("span"),s=document.createElement("i");i.append((0,p.ag)(e.name)),i.append(s),t.append(i),(0,c.Z)(t),this.tabsMenu.append(t),this.mediaTabsMap.set(e.type,e),e.menuTab=t}let a;this.tabsContainer=document.createElement("div"),this.tabsContainer.classList.add("search-super-tabs-container","tabs-container"),L.Z&&(this.swipeHandler=(0,E.Z)({element:this.tabsContainer,onSwipe:(e,t,i)=>{e*=-1;const s=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let o;if(e>0){for(let e=s+1;e=0;--e)if(!n[e].classList.contains("hide")){o=e;break}void 0!==o&&(a=function(e){const t=e=>{(0,_.Z)(e)};let i=2;const s=()=>{--i||e.removeEventListener("touchmove",t,{capture:!0})};return e.addEventListener("touchmove",t,{capture:!0,passive:!1}),e.addEventListener("touchend",s,{once:!0}),s}(this.tabsContainer),this.selectTab(o))}}));for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("search-super-container-"+e.type,"tabs-tab");const i=document.createElement("div");i.classList.add("search-super-content-"+e.type),t.append(i),this.tabsContainer.append(t),this.tabs[e.inputFilter]=i,e.contentTab=i}this.container.append(t,this.tabsContainer),this.searchGroupMedia=new o.z(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&this.canLoadMediaTab(this.mediaTab)&&this.load(!0)},this.selectTab=(0,r.X)(this.tabsMenu,this.tabsContainer,((e,t,i)=>{if(this.prevTabId===e&&!this.skipScroll)return void this.scrollable.scrollIntoViewNew({element:this.container,position:"start",startCallback:this.scrollStartCallback});const s=this.mediaTabs[e];this.onChangeTab&&this.onChangeTab(s);const n=this.mediaTab;if(this.mediaTab=s,-1!==this.prevTabId&&i&&this.onTransitionStart(),this.skipScroll)this.skipScroll=!1;else{const e=this.container.offsetTop;let t=this.scrollable.scrollTop;if(tn&&(s.scroll={scrollTop:n,scrollHeight:0})}if(s.scroll){const e=n.scroll.scrollTop-s.scroll.scrollTop;e&&(s.contentTab.style.transform=`translateY(${e}px)`)}}-1===this.prevTabId||s.contentTab.childElementCount||this.load(!0),this.prevTabId=e}),(()=>{this.scrollable.onScroll(),void 0!==this.mediaTab.scroll&&(this.mediaTab.contentTab.style.transform="",this.scrollable.scrollTop=this.mediaTab.scroll.scrollTop),a&&(a(),a=void 0),this.onTransitionEnd()}),void 0,i,this.listenerSetter),(0,F.fc)(this.tabsContainer,(e=>{this.selection.isSelecting&&((0,_.Z)(e),this.selection.toggleByElement((0,f.Z)(e.target,"search-super-item")))}),{capture:!0,passive:!1,listenerSetter:this.listenerSetter});const l=(e,t,i,s)=>ue(this,void 0,void 0,(function*(){const n=(0,f.Z)(s.target,e);if(!n)return;const a=+n.dataset.mid;if(!a)return void this.log.warn("no messageId by click on target:",n);const o=n.querySelector(".media-spoiler-container");if(o)return void(0,he.kN)({event:s,mediaSpoiler:o});const r=n.dataset.peerId.toPeerId(),d=Array.from(this.tabs[i].querySelectorAll("."+t)).map((t=>{const i=(0,f.Z)(t,e);return{element:t,mid:+i.dataset.mid,peerId:i.dataset.peerId.toPeerId()}})),l=d.findIndex((e=>e.mid===a&&e.peerId===r)),c=yield this.managers.appMessagesManager.getMessageByPeer(r,a);(new D.Z).setSearchContext(this.copySearchContext(i)).openMedia(c,d[l].element,0,!1,d.slice(0,l),d.slice(l+1))}));(0,F.fc)(this.tabs.inputMessagesFilterPhotoVideo,l.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo"),{listenerSetter:this.listenerSetter}),(0,F.fc)(this.tabs.inputMessagesFilterDocument,l.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument"),{listenerSetter:this.listenerSetter}),this.mediaTab=this.mediaTabs[0],(0,u.ZP)((()=>{this.lazyLoadQueue.lock()}),(()=>{this.lazyLoadQueue.unlockAndRefresh()}),this.listenerSetter)}filterMessagesByType(e,t){return(0,X.Z)(t,e,e.length)}processEmptyFilter({message:e,searchGroup:t}){const i=[],n=s.default.addDialogNew({peerId:e.peerId,container:t.list,avatarSize:"bigger",loadPromises:i}),a=s.default.setLastMessageN({dialog:{_:"dialog",peerId:e.peerId},lastMessage:e,dialogElement:n,highlightWord:this.searchContext.query});return i.push(a),Promise.all(i).then(ce.Z)}processPhotoVideoFilter({message:e,promises:t,middleware:i}){return ue(this,void 0,void 0,(function*(){const s=(0,Y.Z)(e),n=document.createElement("div");let a;n.classList.add("grid-item");const o=(0,z.Z)(s,200,200);if(a="photo"!==s._?yield(yield(0,le.Z)({doc:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,photoSize:o})).thumb:yield(0,de.Z)({photo:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,withoutPreloader:!0,noBlur:!0,size:o}),e.media.pFlags.spoiler){const e=yield(0,he.ZP)({animationGroup:"chat",media:s,middleware:i,width:140,height:140,multiply:.3});n.append(e)}return[a.images.thumb,a.images.full].filter(Boolean).forEach((e=>{e.classList.add("grid-item-media")})),t.push(a.loadPromises.thumb),{element:n,message:e}}))}processDocumentFilter({message:e,inputFilter:t}){return ue(this,void 0,void 0,(function*(){const i=(0,Y.Z)(e),s=this.showSender||["voice","round"].includes(i.type),n=yield(0,re.Z)({message:e,withTime:!s,fontWeight:400,voiceAsMusic:!0,showSender:s,searchContext:this.copySearchContext(t),lazyLoadQueue:this.lazyLoadQueue,autoDownloadSize:0});return["audio","voice","round"].includes(i.type)&&n.classList.add("audio-48"),{message:e,element:n}}))}processUrlFilter({message:e,promises:t,middleware:i}){var s;return ue(this,void 0,void 0,(function*(){let n=null===(s=e.media)||void 0===s?void 0:s.webpage;if(!n){const t=e.totalEntities?e.totalEntities.find((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._)):null;let i,s,a;if(t)a=e.message.slice(t.offset,t.offset+t.length);else{const t=(0,K.Z)(e.message);if(!t)return;i=t[0]}i="messageEntityTextUrl"===(null==t?void 0:t._)?t.url:i||a,s=i;const o=e.message===i;i.match(/^(ftp|http|https):\/\//)||(s="https://"+i,i=i.includes("@")?i:"https://"+i),s=new URL(s).hostname,n={_:"webPage",url:i,display_url:s,id:"",hash:0},o||(n.description=e.message)}if("webPageEmpty"===n._)return;const a=document.createElement("div");a.classList.add("preview"),n.photo?(0,de.Z)({container:a,message:null,photo:n.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,size:(0,z.Z)(n.photo,60,60,!1),loadPromises:t,noBlur:!0}):(a.classList.add("empty"),(0,H.Z)(a,(0,V.Z)(n.title||n.display_url||n.description||n.url,!0)));const o=(0,G.Z)(n),r=(0,j.Z)(n),d=(0,x.Z)((0,$.ZP)(n.url||"")).firstElementChild;if(d instanceof HTMLAnchorElement)try{d.innerText=decodeURIComponent(d.href)}catch(e){}r.firstChild&&r.append("\n"),r.append(d),this.showSender&&r.append("\n",yield(0,q.Z)(e)),o.textContent||o.append((0,W.Z)(n.display_url.split("/",1)[0]));const l=new k.ZP({title:o,titleRight:(0,Q.Z)(e),subtitle:r,havePadding:!0,clickable:!0,noRipple:!0});return l.applyMediaElement(a,"big"),l.container.innerText.trim().length?{message:e,element:l.container}:void 0}))}performSearchResult(e,t,i=!0){return ue(this,void 0,void 0,(function*(){const s=[],n=t.contentTab,a=[],o=this.middleware.get();let r,d=t.inputFilter;yield(0,u.e9)(),"inputMessagesFilterPhotoVideo"===d&&this.searchContext.query.trim()?(d="inputMessagesFilterEmpty",r=this.searchGroupMedia,n.append(r.container)):"inputMessagesFilterEmpty"===d&&(r=this.searchGroups.messages);const l={elemsToAppend:s,inputFilter:d,message:void 0,middleware:o,promises:a,searchGroup:r};let c;switch(d){case"inputMessagesFilterEmpty":c=this.processEmptyFilter;break;case"inputMessagesFilterPhotoVideo":c=this.processPhotoVideoFilter;break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":c=this.processDocumentFilter;break;case"inputMessagesFilterUrl":c=this.processUrlFilter}if(c){c=c.bind(this);const t=e.map((e=>ue(this,void 0,void 0,(function*(){try{return l.message=e,yield c(l)}catch(t){this.log.error("error rendering filter",d,l,e,t)}})))),i=(yield Promise.all(t)).filter(Boolean);s.push(...i)}if(r&&r.list.childElementCount&&r.setActive(),this.loadMutex&&a.push(this.loadMutex),!a.length||(yield Promise.all(a),o())){if(s.length){const e=i?"append":"prepend";s.forEach((t=>{var i;const{element:s,message:n}=t,a=this.getMonthContainerByTimestamp(this.groupByMonth?n.date:0,d);s.classList.add("search-super-item"),s.dataset.mid=""+n.mid,s.dataset.peerId=""+n.peerId,a.items[e](s),(null===(i=this.selection)||void 0===i?void 0:i.isSelecting)&&this.selection.toggleElementCheckbox(s,!0)}))}this.afterPerforming("inputMessagesFilterEmpty"===d?1:s.length,n)}}))}afterPerforming(e,t){if(t){const i=t.parentElement;if(Array.from(i.children).slice(1).forEach((e=>{e.remove()})),!e&&!t.childElementCount){const e=document.createElement("div");e.innerText="Nothing interesting here yet...",e.classList.add("position-center","text-center","content-empty","no-select"),i.append(e)}}}loadChats(){const e=new Set,t=this.middleware.get();for(const e in this.searchGroups){const t=this.searchGroups[e];this.tabs.inputMessagesFilterEmpty.append(t.container),t.clear()}const i=this.searchContext.query;if(i){const n=(t,n,o=!1)=>{t.map((t=>{if(e.has(t))return;e.add(t);const{dom:i}=s.default.addDialogNew({peerId:t,container:n.list,avatarSize:"abitbigger",autonomous:n.autonomous});return{dom:i,peerId:t}})).filter(Boolean).forEach((({dom:e,peerId:t})=>ue(this,void 0,void 0,(function*(){const s=yield this.managers.appPeersManager.getPeer(t);if(o&&(s.participants_count||s.participants)){const s=new RegExp(`(${(0,O.Z)(i)}|${(0,O.Z)((0,C.ZP)(i))})`,"gi");e.titleSpan.innerHTML=e.titleSpan.innerHTML.replace(s,"$1"),e.lastMessageSpan.append(yield(0,J.Z)(t.toChatId()))}else if(t===a.Z.myId)e.lastMessageSpan.append((0,p.ag)("Presence.YourChat"));else{let i=yield this.managers.appPeersManager.getPeerUsername(t);if(i)i="@"+i;else{const e=yield this.managers.appUsersManager.getUser(t);e&&e.phone&&(i="+"+(0,M.u)(e.phone).formatted)}e.lastMessageSpan.textContent=i}})))),n.toggle()},o=e=>{if(t())return e};return Promise.all([this.managers.appUsersManager.getContactsPeerIds(i,!0,void 0,10).then(o).then((e=>{e&&n(e,this.searchGroups.contacts,!0)})),this.managers.appUsersManager.searchContacts(i,20).then(o).then((e=>{if(e&&(n(e.my_results,this.searchGroups.contacts,!0),n(e.results,this.searchGroups.globalContacts),this.searchGroups.globalContacts.container.classList.add("is-short"),this.searchGroups.globalContacts.nameEl.lastElementChild!==this.searchGroups.globalContacts.nameEl.firstElementChild&&this.searchGroups.globalContacts.nameEl.lastElementChild.remove(),this.searchGroups.globalContacts.list.childElementCount>3)){const e=document.createElement("div");e.classList.add("search-group__show-more");const t=new p.ZP.IntlElement({key:"Separator.ShowMore"});e.append(t.element),this.searchGroups.globalContacts.nameEl.append(e),(0,F.fc)(e,(()=>{const e=this.searchGroups.globalContacts.container.classList.toggle("is-short");t.key=e?"Separator.ShowMore":"Separator.ShowLess",t.update()}))}})),this.managers.dialogsStorage.getDialogs({query:i,offsetIndex:0,limit:20,filterId:0}).then(o).then((e=>{e&&n(e.dialogs.map((e=>e.peerId)),this.searchGroups.contacts,!0)}))])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>ae.Z.getState().then((i=>{t()&&(this.searchGroups.recent.list.replaceChildren(),i.recentSearch.slice(0,20).forEach((e=>ue(this,void 0,void 0,(function*(){const{dom:t}=s.default.addDialogNew({peerId:e,container:this.searchGroups.recent.list,meAsSaved:!0,avatarSize:"abitbigger",autonomous:!0});t.lastMessageSpan.append(yield e.isUser()?(0,ee.Z)(yield this.managers.appUsersManager.getUser(e.toUserId())):(0,J.Z)(e.toChatId()))})))),i.recentSearch.length?e&&this.searchGroups.recent.setActive():this.searchGroups.recent.clear())}));return Promise.all([this.managers.appUsersManager.getTopPeers("correspondents").then((e=>{if(!t())return;const i=e.findIndex((e=>e.id===a.Z.myId));-1!==i&&(e=e.slice()).splice(i,1),e.forEach((e=>{const{dom:t}=s.default.addDialogNew({peerId:e.id,container:this.searchGroups.people.list,onlyFirstName:!0,avatarSize:"bigger",autonomous:!1,noIcons:this.searchGroups.people.noIcons});t.subtitleEl.remove()})),this.searchGroups.people.toggle()})),e()])}}loadMembers(e){return ue(this,void 0,void 0,(function*(){const t=this.searchContext.peerId.toChatId(),i=this.middleware.get();let n;const a=t=>ue(this,void 0,void 0,(function*(){if(!this.loadMutex||(yield this.loadMutex,i())){this.membersList||(this.membersList=new g.Z({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1,managers:this.managers}),(0,F.fc)(this.membersList.list,(e=>{const t=(0,v.Z)(e.target,s.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=t.dataset.peerId.toPeerId();let n=Promise.resolve();y.Z.isMobile&&(n=b.ZP.toggleSidebar(!1)),n.then((()=>{w.ZP.setInnerPeer({peerId:i})}))})),e.contentTab.append(this.membersList.list),this.afterPerforming(1,e.contentTab));for(const e of t){const t=(0,te.Z)(e);t.isAnyChat()||((yield this.managers.appUsersManager.getUser(t)).pFlags.deleted||this.membersList.add(t))}}}));if(yield this.managers.appChatsManager.isChannel(t)){const s=this.membersList?200:50;n=this.managers.appProfileManager.getChannelParticipants(t,void 0,s,this.nextRates[e.inputFilter]).then((t=>{if(!i())return;const n=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(n?n.childElementCount:0)+t.participants.length,t.participants.length{if(!i())return;this.loaded[e.inputFilter]=!0;const s=t.participants;return"chatParticipantsForbidden"!==s._?a(s.participants):void 0}));return this.loadPromises[e.inputFilter]=n.finally((()=>{i()&&(this.loadPromises[e.inputFilter]=null)}))}))}loadType(e,t,i,s){var n,a;const o=e.inputFilter;if(this.loadPromises[o])return this.loadPromises[o];if("members"===e.type)return this.loadMembers(e);const r=null!==(n=(a=this.historyStorage)[o])&&void 0!==n?n:a[o]=[];if(!("inputMessagesFilterEmpty"!==o||r.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[o]=!0,Promise.resolve();const d=this.loadPromises[o]=Promise.resolve().then((()=>ue(this,void 0,void 0,(function*(){var n,a;if(r.length&&this.usedFromHistory[o]this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.mid))));t.push(...this.filterMessagesByType(a,o))}while(n{setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}const l=r.length?r[r.length-1].mid:0,c=yield this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:o},maxId:l,limit:i,nextRate:null!==(n=(a=this.nextRates)[o])&&void 0!==n?n:a[o]=0}));if(r.push(...c.history.map((e=>({mid:e.mid,peerId:e.peerId})))),s()&&((c.history.length{setTimeout((()=>{if(s()&&this.mediaTab===e){const e=this.load(!0,!0);e&&e.then((()=>{s()&&setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}}),0)})),this.performSearchResult(this.filterMessagesByType(c.history,o),e)})))).catch((e=>{this.log.error("load error:",e)})).finally((()=>{this.loadPromises[o]=null}));return d}canLoadMediaTab(e){const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"inputMessagesFilterEmpty"!==e.inputFilter)),n=s.map((e=>({_:e.inputFilter}))),[a,o]=yield Promise.all([this.managers.appMessagesManager.getSearchCounters(t,n,void 0,i),this.canViewMembers()]);if(!e())return;if(this.loadMutex&&(yield this.loadMutex,!e()))return;let r,d=0;s.forEach((e=>{const t=a.find((t=>t.filter._===e.inputFilter));e.menuTab.classList.toggle("hide",!t.count),e.menuTab.classList.remove("active"),t.count&&(void 0===r&&(r=e),++d)}));const l=this.mediaTabsMap.get("members");l.menuTab.classList.toggle("hide",!o),o&&(r=l,++d),this.container.classList.toggle("hide",!r),this.container.parentElement.classList.toggle("search-empty",!r),r&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(r),!1),this.navScrollableContainer.classList.toggle("hide",d<=1))}))}load(e=!1,t=!1){var i;return ue(this,void 0,void 0,(function*(){const s=this.searchContext.peerId;this.log("load",e,s,this.loadPromises);const n=this.middleware.get();if(this.firstLoad){if(yield null!==(i=this.loadFirstTimePromise)&&void 0!==i?i:this.loadFirstTimePromise=this.loadFirstTime(),!n())return;this.loadFirstTimePromise=void 0,this.firstLoad=!1}let a=e?[this.mediaTab]:this.mediaTabs.filter((e=>e!==this.mediaTab));if(a=a.filter((e=>this.canLoadMediaTab(e))),s.isUser()&&(0,U.Z)(a,(e=>"members"===e.type)),!a.length)return;const o=t?50:Math.round(3*(I.Z.height/130|0)*1.25),r=a.map((e=>this.loadType(e,t,o,n)));return Promise.all(r).catch((e=>{this.log.error("Load error all promises:",e)}))}))}getMonthContainerByTimestamp(e,t){var i;const s=new Date(1e3*e);s.setHours(0,0,0),s.setDate(1);const n=s.getTime(),a=null!==(i=this.monthContainers[t])&&void 0!==i?i:this.monthContainers[t]={};if(!(n in a)){const e=document.createElement("div");e.className="search-super-month";const i=document.createElement("div");i.classList.add("search-super-month-name");const o={month:"long"};s.getFullYear()!==(new Date).getFullYear()&&(o.year="numeric");const r=new p.ZP.IntlDateElement({date:s,options:o}).element;i.append(r),e.append(i);const d=document.createElement("div");d.classList.add("search-super-month-items"),e.append(i,d);const l=(0,B.Z)(a,"desc");let c=0;for(;cl[c]);++c);a[n]={container:e,items:d},(0,S.Z)(e,this.tabs[t],c)}return a[n]}canViewMembers(){const{peerId:e}=this.searchContext;if(!e.isAnyChat())return Promise.resolve(!1);const t=e.toChatId();return Promise.all([this.managers.appChatsManager.isBroadcast(t),this.managers.appChatsManager.hasRights(t,"view_participants"),this.managers.appChatsManager.isForum(t)]).then((([e,t,i])=>!e&&t&&(!this.searchContext.threadId||!i)))}cleanup(){var e;this.loadPromises={},this.loaded={},this.loadedChats=!1,this.nextRates={},this.firstLoad=!0,this.prevTabId=-1,this.lazyLoadQueue.clear(),this.mediaTabs.forEach((e=>{this.usedFromHistory[e.inputFilter]=-1})),(null===(e=this.selection)||void 0===e?void 0:e.isSelecting)&&this.selection.cancelSelection(),this.middleware.clean(),this.loadFirstTimePromise=void 0,this.cleanScrollPositions(),this.membersList=void 0}cleanScrollPositions(){this.mediaTabs.forEach((e=>{e.scroll=void 0}))}cleanupHTML(e=!1){this.mediaTabs.forEach((e=>{if(e.contentTab.replaceChildren(),this.hideEmptyTabs&&(this.container.classList.add("hide"),this.container.parentElement.classList.add("search-empty")),"chats"!==e.type&&!this.historyStorage[e.inputFilter]){const t=e.contentTab.parentElement;t.querySelector(".preloader")||(0,l.y)(t,!0);const i=t.querySelector(".content-empty");i&&i.remove()}})),this.monthContainers={},this.searchGroupMedia.clear(),this.scrollable.scrollTop=0}copySearchContext(e){const t=(0,R.Z)(this.searchContext);return t.inputFilter={_:e},t.nextRate=this.nextRates[e],t}setQuery({peerId:e,query:t,threadId:i,historyStorage:s,folderId:n,minDate:a,maxDate:o}){this.searchContext={peerId:e,query:t||"",inputFilter:{_:this.mediaTab.inputFilter},threadId:i,folderId:n,minDate:a,maxDate:o},this.historyStorage=null!=s?s:{},this.cleanup()}destroy(){var e,t;this.cleanup(),this.listenerSetter.removeAll(),this.scrollable.destroy(),null===(e=this.swipeHandler)||void 0===e||e.removeListeners(),null===(t=this.selection)||void 0===t||t.cleanup(),this.scrollStartCallback=void 0,this.onChangeTab=void 0,this.selectTab=void 0,this.searchContextMenu=void 0,this.swipeHandler=void 0,this.selection=void 0}}},5644:(e,t,i)=>{"use strict";i.d(t,{Z:()=>A});var s=i(8130),n=i(3512),a=i(8805),o=i(4789),r=i(9807),d=i(2325),l=i(8763),c=i(8497),h=i(8842),u=i(3910),p=i(5565),f=i(5701),m=i(241),g=i(2738),v=i(6690),b=i(1655),y=i(5953),w=i(4064),S=i(9331),C=i(2353),L=i(2566),E=i(177),I=i(3061),M=i(8493),P=i(7120),Z=i(8050),T=i(36),k=i(5029),x=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class A{constructor(e){this.container=document.createElement("div"),this.list=s.default.createChatList(),this.chatsContainer=document.createElement("div"),this.selected=new Set,this.freezed=!1,this.folderId=0,this.offsetIndex=0,this.query="",this.loadedWhat={},this.renderedPeerIds=new Set,this.peerType=["dialogs"],this.multiSelect=!0,this.rippleEnabled=!0,this.avatarSize="abitbigger",this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.design="round",this.onInput=()=>{const e=this.input.value;if(this.query!==e){(this.peerType.includes("contacts")||this.peerType.includes("dialogs"))&&(this.cachedContacts=void 0),this.peerType.includes("dialogs")&&(this.folderId=0,this.offsetIndex=0);for(const e in this.tempIds)++this.tempIds[e];this.list=s.default.createChatList(),this.promise=void 0,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},(0,y.Z)(this,e),this.container.classList.add("selector","selector-"+this.design);const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>x(this,void 0,void 0,(function*(){return this.needSwitchList&&(this.scrollable.splitUp.replaceWith(this.list),this.scrollable.setVirtualContainer(this.list),this.needSwitchList=!1),e=e.filter((e=>{const t=!this.renderedPeerIds.has(e);return t&&this.renderedPeerIds.add(e),t})),this.filterPeerTypeBy&&(e=yield(0,C.Z)(e,(e=>x(this,void 0,void 0,(function*(){if(e.isPeerId()&&(yield this.managers.appPeersManager.getPeer(e)))for(const t of this.filterPeerTypeBy)if(yield this.managers.appPeersManager[t](e))return!0;return!0}))))),t(e)})),this.input=document.createElement("input"),this.input.classList.add("selector-search-input"),this.placeholder?(0,d.$d)(this.input,this.placeholder,void 0,"placeholder"):(0,d.$d)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){const e=new k.Z({});e.innerContainer.classList.add("selector-search-section");const t=document.createElement("div");t.classList.add("selector-search-container"),this.selectedContainer=document.createElement("div"),this.selectedContainer.classList.add("selector-search"),this.selectedContainer.append(this.input),t.append(this.selectedContainer),this.selectedScrollable=new a.ZP(t),(0,g.fc)(this.selectedContainer,(e=>{if(this.freezed)return;let t=e.target;if(t=(0,c.Z)(t,"selector-user"),!t)return;const i=t.dataset.key,s=this.chatsContainer.querySelector('[data-peer-id="'+i+'"]');s?(0,g.tH)(s):this.remove(i.toPeerId())})),e.content.append(t),this.container.append(e.container)}this.chatsContainer.classList.add("chatlist-container");const i=new k.Z({name:this.sectionNameLangPackKey,noShadow:!0});i.content.append(this.list),this.chatsContainer.append(i.container),this.scrollable=new a.ZP(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),(0,g.fc)(this.chatsContainer,(e=>{const t=(0,l.Z)(e.target,"data-peer-id");if((0,u.Z)(e),!t)return;if(this.freezed)return;let i=t.dataset.peerId;if(i=i.isPeerId()?i.toPeerId():i,!this.multiSelect)return void this.add(i);this.selected.has(i)?this.remove(i):this.add(i);const s=t.querySelector("input");s.checked=!s.checked}));const n=(0,f.Z)(this.onInput,200,!1,!0);this.input.addEventListener("input",n),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend((0,T.G)()),this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout((()=>{const t=this.getMoreResults();e.onFirstRender&&t.then((()=>{e.onFirstRender()}))}),0)}renderSaved(){return x(this,void 0,void 0,(function*(){this.exceptSelf||this.offsetIndex||0!==this.folderId||!this.peerType.includes("dialogs")||this.query&&!(yield this.managers.appUsersManager.testSelfSearch(this.query))||(yield this.renderResultsFunc([n.Z.myId]))}))}getTempId(e){var t,i;null!==(t=(i=this.tempIds)[e])&&void 0!==t||(i[e]=0);const s=++this.tempIds[e];return{tempId:s,middleware:()=>this.tempIds[e]===s}}getMoreDialogs(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=m.Z.height/56*1.25|0,{middleware:t}=this.getTempId("dialogs"),i=this.managers.dialogsStorage.getDialogs({query:this.query,offsetIndex:this.offsetIndex,limit:e,filterId:this.folderId,skipMigrated:!0});i.catch((()=>{t()&&(this.loadedWhat[this.loadedWhat.dialogs?"archived":"dialogs"]=!0)}));const s=yield i;if(!t())return;let a=s.dialogs;if(a.length){const e=(0,Z.Z)(a[a.length-1])||0;if(a=a.slice(),(0,w.Z)(a,(e=>e.peerId===n.Z.myId)),this.chatRightsAction&&(a=yield(0,C.Z)(a,(e=>this.filterByRights(e.peerId))),!t()))return;if(yield this.renderSaved(),!t())return;this.offsetIndex=e}if(this.renderResultsFunc(a.map((e=>e.peerId))),s.isEnd){if(!this.loadedWhat.dialogs){if(yield this.renderSaved(),!t())return;return this.loadedWhat.dialogs=!0,this.offsetIndex=0,this.folderId=1,this.getMoreDialogs()}if(this.loadedWhat.archived=!0,!this.loadedWhat.contacts)return this.getMoreContacts()}}))}filterByRights(e){return x(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.getPeer(e);return e.isUser()?"send_messages"!==this.chatRightsAction||(0,M.Z)(t):!!(0,P.Z)(t,this.chatRightsAction)||void 0}))}getMoreContacts(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.contacts)return;const e=this.peerType.includes("contacts");if(!this.cachedContacts){const{middleware:t}=this.getTempId("contacts"),i=Promise.all([e?this.managers.appUsersManager.getContactsPeerIds(this.query):[],this.query?this.managers.appUsersManager.searchContacts(this.query):void 0]);i.catch((()=>{t()&&(this.loadedWhat.contacts=!0)}));const[s,a]=yield i;if(!t())return;if(a){let i=e?a.my_results.concat(a.results):a.my_results;if(this.chatRightsAction&&(i=yield(0,C.Z)(i,(e=>this.filterByRights(e))),!t()))return;this.peerType.includes("dialogs")||(i=i.filter((e=>e.isUser()))),this.cachedContacts=(0,v.Z)(s.concat(i))}else this.cachedContacts=s.slice();(0,b.Z)(this.cachedContacts,n.Z.myId)}const t=m.Z.height/56*1.25|0,i=this.cachedContacts.splice(0,t);this.renderResultsFunc(i),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.channelParticipants)return;const{middleware:e}=this.getTempId("channelParticipants"),t=this.managers.appProfileManager.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount);t.catch((()=>{e()&&(this.loadedWhat.channelParticipants=!0)}));const i=yield t;if(!e())return;const s=i.participants.map((e=>(0,L.Z)(e)));(0,b.Z)(s,n.Z.myId),this.renderResultsFunc(s),(this.list.childElementCount>=i.count||i.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){if(this.promise)return this.promise;const e=(()=>this.peerType.includes("dialogs")&&!this.loadedWhat.archived?this.getMoreSomething("dialogs"):!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts?this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants?this.getMoreSomething("channelParticipants"):void 0:this.getMoreSomething("contacts"))();if(!e)return Promise.resolve();const t=this.promise=e.catch((e=>{console.error("get more result error",e)})).finally((()=>{this.promise===t&&(this.promise=void 0),this.checkForTriggers()}));return t}getMoreSomething(e){return{dialogs:this.getMoreDialogs,contacts:this.getMoreContacts,channelParticipants:this.getMoreChannelParticipants}[e].call(this)}renderResults(e){return x(this,void 0,void 0,(function*(){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=yield(0,C.Z)(e,(e=>this.managers.appUsersManager.isNonContactUser(e)))),e.forEach((e=>x(this,void 0,void 0,(function*(){const{dom:t}=s.default.addDialogNew({peerId:e,container:this.scrollable,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const i=this.selected.has(e),s=new r.Z;i&&(s.input.checked=!0),t.containerEl.prepend(s.label)}let i;i=e.isAnyChat()?yield(0,E.Z)(e.toChatId()):e===n.Z.myId?(0,d.ag)(this.selfPresence):(0,I.Z)(yield this.managers.appUsersManager.getUser(e.toUserId())),t.lastMessageSpan.append(i)}))))}))}add(e,t,i=!0){var s;if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const n=document.createElement("div");n.classList.add("selector-user","scale-in");const a=new S.Z;if(a.classList.add("selector-user-avatar","tgico","avatar-32"),a.isDialog=!0,n.dataset.key=""+e,e.isPeerId()){if(void 0===t){const i=new h.Z;i.update({peerId:e.toPeerId(),dialog:!0}),t=i.element}a.updateWithOptions({peerId:e})}return t&&("string"==typeof t?n.innerHTML=t:((0,p.Z)(n,t),n.append(t))),n.insertAdjacentElement("afterbegin",a),this.selectedContainer.insertBefore(n,this.input),null===(s=this.onChange)||void 0===s||s.call(this,this.selected.size),i&&this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center"}),n}remove(e){if(!this.multiSelect)return;const t=this.selectedContainer.querySelector(`[data-key="${e}"]`);t.classList.remove("scale-in"),t.offsetWidth,t.classList.add("scale-out");const i=()=>{this.selected.delete(e),t.remove(),this.onChange&&this.onChange(this.selected.size)};n.Z.settings.animationsEnabled?t.addEventListener("animationend",i,{once:!0}):i()}getSelected(){return[...this.selected]}addInitial(e){e.forEach((e=>{this.add(e,void 0,!1)})),window.requestAnimationFrame((()=>{this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center",forceDirection:o.f.Static})}))}}},8448:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>F,ns:()=>_});var s=i(3442),n=i(3013),a=i(4755),o=i(4762),r=i(3512),d=i(3910),l=i(2738),c=i(3725),h=i(3699),u=i(319),p=i(8497),f=i(2325),m=i(3251),g=i(632),v=i(9966),b=i(1507),y=i(4081),w=i(5296),S=i(3228),C=i(5157),L=i(7207),E=i(130),I=i(8115),M=i(5671),P=i(1604),Z=i(7530),T=i(2312),k=i(9492),x=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function A(e=!0){const t=new s.Z({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}r.Z.addEventListener("messages_media_read",(({mids:e,peerId:t})=>{e.forEach((e=>{const i=`[data-mid="${e}"][data-peer-id="${t}"]`;Array.from(document.querySelectorAll(`audio-element.is-unread${i}, .media-round.is-unread${i}`)).forEach((e=>{e.classList.remove("is-unread")}))}))}));const _=(e,t)=>{let i,s;const n=!e.classList.contains("search-super-item"),a=(0,p.Z)(e,n?"bubbles-inner":"tabs-tab");if(a){const t=':not([data-is-outgoing="1"])',o=`.audio:not(.is-voice)${t}`;let r;if(r=e.matches(o)?[o]:[`.audio.is-voice${t}`,`.media-round${t}`],n){const e=".bubble:not(.webpage) ";r=r.map((t=>e+t))}const d=r.join(", "),l=Array.from(a.querySelectorAll(d)),c=l.indexOf(e),h=l.map((e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid})));i=h.slice(0,c),s=h.slice(c+1)}return(s.length&&s[0].midt)&&([i,s]=[s.reverse(),i.reverse()]),[i,s]};class F extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new h.Z}render(){var e,t,i;return x(this,void 0,void 0,(function*(){this.classList.add("audio"),this.managers=r.Z.managers,this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const s=(0,Z.Z)(this.message),h="voice"===s.type,p=!this.voiceAsMusic&&h,F=this.message.pFlags.is_outgoing,D=null===(e=this.message)||void 0===e?void 0:e.uploadingFileName,R=(0,C.Z)(0|s.duration);this.innerHTML='\n
\n
\n
\n
\n
\n
';const B=this.firstElementChild,N=document.createElement("div");N.classList.add("audio-download"),"audio"!==s.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),D&&(this.classList.add("is-outgoing"),this.append(N));const O=yield p?function(e){return x(this,void 0,void 0,(function*(){e.classList.add("is-voice");const t=e.message,i=(0,Z.Z)(t);t.pFlags.out&&e.classList.add("is-out");let s=i.attributes.find((e=>"documentAttributeAudio"===e._)).waveform||new Uint8Array([]);s=function(e){e instanceof Uint8Array||(e=new Uint8Array(e));const t=8*e.length/5|0;if(!t)return new Uint8Array([]);let i;try{const s=new DataView(e.buffer);i=new Uint8Array(t);for(let e=0;e>n&31}}catch(e){i=new Uint8Array([])}return i}(s.slice(0,63));const{svg:n,container:o,availW:r}=function(e,t){const i=a.Z.isMobile?16:23,s=a.Z.isMobile?152:190,n=a.Z.isMobile?190:256,o=(0,S.Z)(t/60*n,s,n),r=document.createElementNS("http://www.w3.org/2000/svg","svg");r.classList.add("audio-waveform-bars"),r.setAttributeNS(null,"width",""+o),r.setAttributeNS(null,"height",""+i),r.setAttributeNS(null,"viewBox",`0 0 ${o} ${i}`);const d=Math.max(...e),l=e.length?e.length:100,c=Math.min(o/4|0,l);let h=0;const u=i-4;let p="";for(let t=0,s=0,n=0;t=l){n=n+c-l,n<(c+1)/2&&h\n `,s+=4,h=n<(c+1)/2?0:a}else h{let t=e.audio;const i=()=>{c.style.width=t.currentTime/t.duration*100+"%"};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&i();const s=(0,v.Z)(i);return e.addAudioListener("timeupdate",s),e.addAudioListener("ended",s),e.addAudioListener("play",(()=>{(0,w.cK)((()=>!!t&&(i(),!t.paused)),e)})),e.readyPromise.then((()=>{let e=!1,i=!1;function s(e){let i;if(e instanceof MouseEvent)i=e.offsetX;else{const t=e.target.getBoundingClientRect();i=e.targetTouches[0].pageX-t.left}const s=i/r*t.duration;t.currentTime=s}f.addEventListener("mouseleave",(s=>{e&&(t.play(),e=!1),i=!1})),f.addEventListener("mousemove",(t=>{i=!0,e&&s(t)})),f.addEventListener("mousedown",(i=>{i.preventDefault(),0===i.button&&(t.paused||t.pause(),s(i),e=!0)})),f.addEventListener("mouseup",(s=>{i&&e&&(t.play(),e=!1)})),(0,l.fc)(f,(e=>{(0,d.Z)(e),t.paused||s(e)}))}),u.Z),()=>{f.remove(),f=null,t=null}}}))}(this):function(e){var t;return x(this,void 0,void 0,(function*(){const i=e.withTime,s=e.message,n=(0,Z.Z)(s),a="voice"===n.type||"round"===n.type,o=document.createElement("div");o.classList.add("audio-description");const r=n.attributes.find((e=>"documentAttributeAudio"===e._));if(!a){const t=[];(null==r?void 0:r.performer)&&t.push((0,I.Z)(r.performer)),i?t.push((0,g.OD)(s.date)):t.length||t.push((0,y.Z)(n.size)),e.showSender&&t.push(yield(0,M.Z)(s)),o.append(...(0,f.A1)(t," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const d=e.querySelector(".audio-title"),l=new m.I;l.dataset.fontWeight=e.dataset.fontWeight,l.dataset.fontSize=e.dataset.fontSize,l.dataset.sizeType=e.dataset.sizeType,a?l.append(yield(0,M.Z)(s)):(0,E.Z)(l,(0,I.Z)(null!==(t=null==r?void 0:r.title)&&void 0!==t?t:n.file_name)),d.append(l),e.showSender&&d.append((0,P.Z)(s));const c=e.querySelector(".audio-subtitle");return c.append(o),()=>{let t=!1,i=new L.Z(e.audio,n.supportsStreaming);e.addAudioListener("ended",(()=>{e.classList.remove("audio-show-progress"),c.lastChild.replaceWith(o),t=!1}));const s=()=>{t||(e.classList.add("audio-show-progress"),t=!0,i&&c.lastChild.replaceWith(i.container))};return e.addAudioListener("play",s),(!e.audio.paused||e.audio.currentTime>0)&&s(),()=>{i.removeListeners(),i.container.remove(),i=null}}}))}(this),U=this.querySelector(".audio-time");U.innerHTML=R;const H=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=n.Z.addMedia(this.message,e),i=this.readyPromise=(0,c.Z)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?i.resolve():this.addAudioListener("canplay",(()=>i.resolve()),{once:!0}),this.onTypeDisconnect=O();const s=()=>(0,C.Z)(0|t.currentTime)+(p?" / "+R:""),a=()=>{U.innerText=s(),B.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&a();const o=(e,i=t.paused)=>{if(e&&(0,d.Z)(e),i){const e=!!this.searchContext;if(n.Z.setSearchContext(this.searchContext||{peerId:b.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,i]=e?_(this,this.message.mid):[];n.Z.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,i)}t.play().catch((()=>{}))}else t.pause()};return(0,l.fc)(B,(e=>o(e)),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",(()=>{B.classList.remove("playing"),U.innerText=R})),this.addAudioListener("timeupdate",(()=>{!t.currentTime&&t.paused||n.Z.isSafariBuffering(t)||(U.innerText=s())})),this.addAudioListener("pause",(()=>{B.classList.remove("playing")})),this.addAudioListener("play",a),o};if(null===(t=s.thumbs)||void 0===t?void 0:t.length){const e=[],t=yield(0,k.Z)({photo:s,message:null,container:B,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});B.style.width=B.style.height="",t.images.thumb&&e.push(t.images.thumb),t.images.full&&e.push(t.images.full),this.classList.add("audio-with-thumb"),e.forEach((e=>e.classList.add("audio-thumb")))}if(F)D&&(this.preloader=A(!1),this.preloader.attachPromise(T.Z.getUpload(D)),this.dataset.isOutgoing="1",this.preloader.attach(N,!1));else{let e=this.preloader;const t="audio"!==s.type;H(t);const a=t=>{if(this.audio.src)return;n.Z.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(n.Z.willBePlayed(this.audio),o.IS_SAFARI&&!this.audio.autoplay&&(this.audio.autoplay=!0))};if(i(),!e)if(s.supportsStreaming){let e;this.classList.add("corner-download");const t=()=>{const t=A(!1),s=(0,c.Z)();s.notifyAll({done:75,total:100}),s.catch((()=>{this.audio.pause(),n.Z.willBePlayed(void 0)})),s.cancel=()=>{s.cancel=u.Z;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(N,!1,s),e=this.addAudioListener("pause",(()=>{s.cancel()}),{once:!0}),i()},s=this.addAudioListener("play",t);this.readyPromise.then((()=>{this.listenerSetter.remove(s),this.listenerSetter.remove(e)}))}else{e=A(),t||(this.readyPromise=(0,c.Z)());const n=()=>{i();const n=T.Z.downloadMediaURL({media:s});return t||n.then((()=>{this.readyPromise.resolve()})),e.attach(N,!1,n),{download:n}};e.setDownloadFunction(n),n()}this.classList.contains("corner-download")?B.append(N):this.append(N),this.classList.add("downloading"),this.readyPromise.then((()=>{this.classList.remove("downloading"),N.classList.add("downloaded"),setTimeout((()=>{N.remove()}),200),n.Z.willBePlayedMedia===this.audio&&(this.audio.play(),n.Z.willBePlayed(void 0))}))};(null===(i=this.audio)||void 0===i?void 0:i.src)||(t?a(!1):(0,l.fc)(B,(()=>{a(!0)}),{once:!0,capture:!0,passive:!1,listenerSetter:this.listenerSetter}))}}))}get addAudioListener(){return this.listenerSetter.add(this.audio)}disconnectedCallback(){setTimeout((()=>{this.isConnected||(this.onTypeDisconnect&&(this.onTypeDisconnect(),this.onTypeDisconnect=null),this.readyPromise&&this.readyPromise.reject(),this.listenerSetter&&(this.listenerSetter.removeAll(),this.listenerSetter=null),this.preloader&&(this.preloader=null))}),100)}}customElements.define("audio-element",F)},9331:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L,C:()=>y});var s=i(3512),n=i(2738),a=i(3910),o=i(1784),r=i(6074);class d extends r.Z{constructor(e){super(Object.assign(Object.assign({},e),{loadMore:(e,t,i)=>{if(this.peerId.isAnyChat()||!t)return Promise.resolve({count:0,items:[]});const s=null==e?void 0:e.photoId;return this.managers.appPhotosManager.getUserPhotos(this.peerId,s,i).then((e=>{const t=e.photos.map((e=>({element:null,photoId:e})));return{count:e.count,items:t}}))}})),this.loadedAllUp=!0,this.peerId=e.peerId}}var l=i(2312),c=i(4271),h=i(5824),u=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class p extends h.Z{constructor(e){super(new d({peerId:e,managers:s.Z.managers}),[]),this.onPrevClick=e=>{this.openMedia(e.photoId,e.element,-1)},this.onNextClick=e=>{this.openMedia(e.photoId,e.element,1)},this.onDownloadClick=()=>u(this,void 0,void 0,(function*(){l.Z.downloadToDisc({media:yield this.managers.appPhotosManager.getPhoto(this.target.photoId),queueId:c.ZP.chat.bubbles.lazyLoadQueue.queueId})})),this.peerId=e,this.setBtnMenuToggle([{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick}]),this.setListeners()}openMedia(e,t,i=0,s,n){const a=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return u(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const o=yield this.managers.appPhotosManager.getPhoto(e),r=a._openMedia.call(this,o,o.date,this.peerId,i,t,!1,s,n);return this.target.photoId=o.id,r}))}}var f=i(5880),m=i(9931),g=i(3624),v=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const b=({peerId:e,threadId:t})=>{let i='avatar-element[data-peer-id="'+e+'"]';t&&(i+='[data-thread-id="'+t+'"]'),Array.from(document.querySelectorAll(i)).forEach((e=>{e.update()}))};function y(e,t,i,n,a,r){return v(this,void 0,void 0,(function*(){let d=yield s.Z.managers.appProfileManager.getFullPhoto(t);if(!i()||!d)return;const l=()=>Array.from(e.querySelectorAll("img")).find((e=>!e.classList.contains("emoji")))?e:null;if(t.isAnyChat()){const e=!!n,c="inputMessagesFilterChatPhotos";if(!n&&(n=yield s.Z.managers.appMessagesManager.getSearch({peerId:t,inputFilter:{_:c},maxId:0,limit:1}).then((e=>e.history[0])),!i()))return;if(n){n.action.photo.id!==d.id&&(e||(n=s.Z.managers.appMessagesManager.generateFakeAvatarMessage(t,d)));const i=e=>e.map((e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId})));return void(new o.Z).setSearchContext({peerId:t,inputFilter:{_:c}}).openMedia(n,l(),void 0,void 0,a?i(a):void 0,r?i(r):void 0)}}if(d){!(0,f.Z)(n)&&n&&(d=yield s.Z.managers.appPhotosManager.getPhoto(n));const e=e=>e.map((e=>({element:e.element,photoId:e.item})));new p(t).openMedia(d.id,l(),void 0,a?e(a):void 0,r?e(r):void 0)}}))}s.Z.addEventListener("avatar_update",b),s.Z.addEventListener("peer_title_edit",(e=>v(void 0,void 0,void 0,(function*(){(yield s.Z.managers.appAvatarsManager.isAvatarCached(e.peerId))||b(e)}))));const w=new Map,S=new Set;function C(e,t){return e+(t?"_"+t:"")}class L extends HTMLElement{constructor(){super(),this.addedToQueue=!1,this.classList.add("avatar-like"),this.middlewareHelper=(0,g.k)()}disconnectedCallback(){var e;const t=C(this.peerId,this.threadId),i=w.get(t);(null==i?void 0:i.has(this))&&(i.delete(this),i.size||w.delete(t)),null===(e=this.lazyLoadQueue)||void 0===e||e.delete({div:this})}attachClickEvent(){let e=!1;(0,n.fc)(this,(t=>v(this,void 0,void 0,(function*(){if((0,a.Z)(t),e)return;const i=this.peerId;e=!0,yield y(this,this.peerId,(()=>this.peerId===i)),e=!1}))))}updateOptions(e){for(const t in e)this[t]=e[t]}updateWithOptions(e){var t;const i=this.peerId,s=this.threadId;this.updateOptions(e);const n=this.peerId,a=this.threadId;if(i===n&&s===a)return;if(this.dataset.peerId=""+n,a?this.dataset.threadId=""+a:s&&delete this.dataset.threadId,i){const e=C(i,s),t=w.get(e);t&&(t.delete(this),t.size||w.delete(e))}const o=null===(t=e.wrapOptions)||void 0===t?void 0:t.middleware;return this.middlewareHelper.destroy(),o?this.middlewareHelper=o.create():this.middlewareHelper.destroy(),this.update()}remove(){this.middlewareHelper.destroy(),super.remove()}r(e=!1){const t=(0,m.Z)({div:this,peerId:this.peerId,isDialog:this.isDialog,title:this.peerTitle,onlyThumb:e,isBig:this.isBig,threadId:this.threadId,wrapOptions:Object.assign({middleware:this.middlewareHelper.get()},this.wrapOptions||{})});return this.loadPromises&&(this.loadPromises.push(t),t.finally((()=>{this.loadPromises=void 0}))),t}update(){if(this.lazyLoadQueue){if(!S.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;const e=C(this.peerId,this.threadId);let t=w.get(e);return t||w.set(e,t=new Set),t.add(this),this.lazyLoadQueue.push({div:this,load:()=>(S.add(this.peerId),this.update())}),this.r(!0)}this.addedToQueue&&this.lazyLoadQueue.delete({div:this})}S.add(this.peerId);const e=this.r();this.addedToQueue&&e.finally((()=>{this.addedToQueue=!1}));const t=C(this.peerId,this.threadId),i=w.get(t);if(i){i.delete(this);const e=Array.from(i);w.delete(t);for(let t=0,i=e.length;t{"use strict";i.d(t,{Z:()=>o});var s=i(2738),n=i(1168),a=i(6765);class o{constructor(e,t){this.container=document.createElement("div"),this.container.classList.add("avatar-edit"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("avatar-edit-canvas"),this.icon=document.createElement("span"),this.icon.classList.add("tgico","tgico-cameraadd"),this.container.append(this.canvas,this.icon),(0,s.fc)(this.container,(()=>{n.Z.createPopup(a.Z,t).open(this.canvas,e)}))}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}},4494:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325),n=i(1405);function a(e,t={}){const i=document.createElement(t.asLink?"a":t.asDiv?"div":"button");return i.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&i.classList.add("rp-square"),(0,n.Z)(i)),t.onlyMobile&&i.classList.add("only-handhelds"),t.disabled&&i.setAttribute("disabled","true"),t.text&&i.append((0,s.ag)(t.text)),i}},8119:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4494);const n=(e={})=>(0,s.Z)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e)},2230:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4494);const n=(e,t={})=>(0,s.Z)("btn-icon",Object.assign({icon:e||void 0},t))},3003:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v,b:()=>g});var s=i(7238),n=i(3416),a=i(3910),o=i(2738),r=i(8497),d=i(130),l=i(2325),c=i(9492),h=i(8812),u=i(8222),p=i(4762),f=i(1405);function m(e){if(e.element)return[e.separator,e.element].filter(Boolean);const{icon:t,iconDoc:i,text:s,onClick:m,checkboxField:g,noCheckboxClickListener:v}=e,b=document.createElement("div");b.className="btn-menu-item rp-overflow"+(t?" tgico-"+t:""),p.IS_MOBILE&&(0,f.Z)(b);let y=e.textElement;if(y||(y=e.textElement=s?(0,l.ag)(s,e.textArgs):document.createElement("span"),e.regularText&&(0,d.Z)(y,e.regularText)),i){const t=document.createElement("span");t.classList.add("btn-menu-item-icon"),b.append(t),e.loadPromise=(0,c.Z)({container:t,photo:i,boxWidth:24,boxHeight:24,withoutPreloader:!0,noFadeIn:!0,noBlur:!0,processUrl:e=>fetch(e).then((e=>e.text())).then((e=>{const t=u.Z.getProperty("primary-text-color"),i=(new DOMParser).parseFromString(e,"image/svg+xml").firstElementChild;return i.querySelectorAll("path").forEach((e=>{e.setAttributeNS(null,"fill",t),e.style.stroke=t,e.style.strokeWidth=".25px"})),(0,h.Z)(i.outerHTML)}))}).then((e=>e.loadPromises.thumb))}y.classList.add("btn-menu-item-text"),b.append(y);const w=!!g||!!e.keepOpen;return m&&(0,o.fc)(b,(t=>{var i;(0,a.Z)(t);const s=(0,r.Z)(t.target,"btn-menu");s&&!s.classList.contains("active")||(m(t),!1!==(null===(i=e.checkForClose)||void 0===i?void 0:i.call(e))&&(w||n.Z.close(),g&&!v&&(g.checked="radio"===g.input.type||!g.checked)))}),e.options),g&&b.append(g.label),!0===e.separator&&(e.separator=document.createElement("hr")),e.multiline&&b.classList.add("is-multiline"),[e.separator,e.element=b].filter(Boolean)}function g({listenerSetter:e,buttons:t}){const i=document.createElement("div");i.classList.add("btn-menu"),e&&t.forEach((t=>{t.options?t.options.listenerSetter=e:t.options={listenerSetter:e}}));const n=t.map(m);return i.append(...(0,s.Z)(n)),i}function v(e){return t=this,i=void 0,n=function*(){const t=g(e);return yield Promise.all(e.buttons.map((({loadPromise:e})=>e))),t},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}},5322:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,v:()=>h});var s=i(3416),n=i(3910),a=i(2738),o=i(3699),r=i(2230),d=i(3003),l=i(2353),c=i(3035);function h({el:e,onOpen:t,options:i,onClose:o}){((null==i?void 0:i.listenerSetter)?i.listenerSetter.add(e):e.addEventListener.bind(e))(a.pf,(i=>{if(!e.classList.contains("btn-menu-toggle"))return!1;if((0,n.Z)(i),e.classList.contains("menu-open"))s.Z.close();else{const n=null==t?void 0:t(i),a=()=>{const t=e.querySelector(".btn-menu");s.Z.openBtnMenu(t,o)};n instanceof Promise?n.then(a):a()}}))}function u({buttonOptions:e,listenerSetter:t,container:i,direction:s,buttons:n,onOpenBefore:a,onOpen:u,onClose:p,onCloseAfter:f}){e&&(e.asDiv=!0);const m=null!=i?i:(0,r.Z)("more",e);m.classList.add("btn-menu-toggle");const g=new o.Z;let v,b;return h({el:m,onOpen:e=>{return t=this,i=void 0,r=function*(){if(yield null==a?void 0:a(e),b)return clearTimeout(b),void(b=void 0);const t=yield(i=n,(0,l.Z)(i,(e=>{var t,i;return null===(i=null===(t=null==e?void 0:e.verify)||void 0===t?void 0:t.call(e))||void 0===i||i})));var i;if(!t.length)return;const o=v=yield(0,d.Z)({buttons:t,listenerSetter:g});o.classList.add(s),yield null==u?void 0:u(e,o),m.append(o),yield(0,c.d1)()},new((o=void 0)||(o=Promise))((function(e,s){function n(e){try{d(r.next(e))}catch(e){s(e)}}function a(e){try{d(r.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(t,i||[])).next())}));var t,i,o,r},options:{listenerSetter:t},onClose:()=>{null==p||p(),b=window.setTimeout((()=>{null==f||f(),b=void 0,g.removeAll(),n.forEach((e=>e.element=void 0)),v.remove()}),300)}}),m}},1571:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(5296),n=i(2064);class a{constructor(){this._width=50,this._height=50,this._tails=90,this._scrollTails=50,this._curve=[0,.25,.5,.75,1,1.5,2,2.5,3,3.5,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18.3,18.6,18.9,19.2,19.5,19.8,20.1,20.4,20.7,21,21.3,21.6,21.9,22.2,22.5,22.8,23.1,23.4,23.7,24,24.3,24.6,24.9,25.2,25.5,25.8,26.1,26.3,26.4,26.5,26.6,26.7,26.8,26.9,27],this._positions=[{x:.8,y:.1},{x:.6,y:.2},{x:.35,y:.25},{x:.25,y:.6},{x:.2,y:.9},{x:.4,y:.8},{x:.65,y:.75},{x:.75,y:.4}],this._phases=this._positions.length,this.onWheel=e=>{this._animatingToNextPosition||(this._scrollDelta+=e.deltaY,void 0===this._onWheelRAF&&(this._onWheelRAF=requestAnimationFrame(this.drawOnWheel)))},this.drawOnWheel=()=>{const e=this._scrollDelta/this._scrollTails;this._scrollDelta%=this._scrollTails;const t=e>0?Math.floor(e):Math.ceil(e);t&&this.changeTailAndDraw(t),this._onWheelRAF=void 0},this.drawNextPositionAnimated=e=>{var t;let i,s;if(e){const s=e();i=s>=1;const a=-1*(n=s)*(n-2),o=null!==(t=this._nextPositionTail)&&void 0!==t?t:0,r=(this._nextPositionTail=this._nextPositionTails*a)-o;r&&(this._nextPositionLeft-=r,this.changeTailAndDraw(r))}else{const e=this._frames;s=e.shift(),i=!e.length}var n;return s&&this.drawImageData(s),i&&(this._nextPositionLeft=void 0,this._nextPositionTails=void 0,this._nextPositionTail=void 0,this._animatingToNextPosition=void 0),!i};const e=this._tails/this._curve[this._curve.length-1];for(let t=0,i=this._curve.length;t{var s;return e-(null!==(s=i[t-1])&&void 0!==s?s:0)}))}hexToRgb(e){const t=(0,n.oo)(e);return{r:t[0],g:t[1],b:t[2]}}getPositions(e){const t=this._positions.slice();t.push(...t.splice(0,e));const i=[];for(let e=0;e({x:(e.x-s[i].x)/t,y:(e.y-s[i].y)/t})));return i.map((e=>n.map(((t,i)=>({x:s[i].x+t.x*e,y:s[i].y+t.y*e})))))}curPosition(e,t){return this.getNextPositions(e,this._tails,[t])[0]}changeTail(e){for(this._tail+=e;this._tail>=this._tails;)this._tail-=this._tails,++this._phase>=this._phases&&(this._phase-=this._phases);for(;this._tail<0;)this._tail+=this._tails,--this._phase<0&&(this._phase+=this._phases)}changeTailAndDraw(e){this.changeTail(e);const t=this.curPosition(this._phase,this._tail);this.drawGradient(t)}getGradientImageData(e){const t=this._hctx.createImageData(this._width,this._height),i=t.data;let s=0;for(let t=0;tthis.hexToRgb(e))),this._hc||(this._hc=document.createElement("canvas"),this._hc.width=this._width,this._hc.height=this._height,this._hctx=this._hc.getContext("2d",{alpha:!1})),this._canvas=e,this._ctx=this._canvas.getContext("2d",{alpha:!1}),this.update()}update(){if(this._colors.length<2){const e=this._colors[0];return this._ctx.fillStyle=`rgb(${e.r}, ${e.g}, ${e.b})`,void this._ctx.fillRect(0,0,this._width,this._height)}const e=this.curPosition(this._phase,this._tail);this.drawGradient(e)}toNextPosition(e){var t,i;if(this._colors.length<2)return;if(e)return this._nextPositionLeft=this._tails+(null!==(t=this._nextPositionLeft)&&void 0!==t?t:0),this._nextPositionTails=this._nextPositionLeft,this._nextPositionTail=void 0,this._animatingToNextPosition=!0,void(0,s.cK)(this.drawNextPositionAnimated.bind(this,e),this);const n=this._tail,a=this._tails;let o;const r=[];for(let e=0,t=this._incrementalCurve.length;ea&&void 0===o&&(o=e,s%=a),r.push(s)}[r.slice(0,o),void 0!==o?r.slice(o):[]].forEach(((e,t,i)=>{const s=e[e.length-1];if(void 0!==s&&s>a&&(e[e.length-1]=+s.toFixed(2)),this._tail=null!=s?s:0,!e.length)return;const n=this.getNextPositions(this._phase,a,e);t!==i.length-1&&++this._phase>=this._phases&&(this._phase-=this._phases);const o=n.map((e=>this.getGradientImageData(e)));this._frames.push(...o)})),this._animatingToNextPosition=!0,(0,s.cK)(this.drawNextPositionAnimated,this)}scrollAnimate(e){}cleanup(){this.scrollAnimate(!1)}static createCanvas(e){const t=document.createElement("canvas");return t.width=50,t.height=50,void 0!==e&&(t.dataset.colors=e),t}static create(e){const t=this.createCanvas(e),i=new a;return i.init(t),{gradientRenderer:i,canvas:t}}}},6054:(e,t,i)=>{"use strict";i.d(t,{e:()=>k,Z:()=>x});var s=i(5432),n=i(4494),a=i(2230),o=i(9807),r=i(5128),d=i(4524),l=i(9099),c=i(1962),h=i(6385),u=i(4762),p=i(2325),f=i(8497),m=i(8799),g=i(3910),v=i(6760),b=i(5565),y=i(8487),w=i(144),S=i(2738),C=i(5975),L=i(3241),E=i(5953),I=i(6976),M=(i(6690),i(4271)),P=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Z=e=>[...e.values()].reduce(((e,t)=>e+t.size),0);class T extends L.Z{constructor(e){super(!1),this.selectedMids=new Map,this.isSelecting=!1,this.onMouseDown=e=>{const t=(0,f.Z)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,t))return;const i=new Map;let s,n=t;const a=(e,t=!0)=>{const o=+e.dataset.mid;if(!o||!e.dataset.peerId)return;const r=e.dataset.peerId.toPeerId();(0,y.Z)(n)||(n=e);let d=i.get(r);if(d||i.set(r,d=new Set),d.has(o))return;const l=this.isMidSelected(r,o);if(void 0===s&&(s=!l),d.add(o),s&&!l||!s&&l){const s=Z(i);if(this.toggleByElement&&t){s<2&&(0,C.Z)(e,n)&&(n=e);const t=this.getElementsBetween(n,e);t.length&&t.forEach((e=>{a(e,!1)}))}if(this.selectedMids.size)this.toggleByElement&&this.toggleByElement(e);else if(2===s&&this.toggleByMid)for(const[e,t]of i)for(const i of t)this.toggleByMid(e,i)}};let o=!1;const r=e=>{o||((0,v.Z)(),o=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,s)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",r),void this.listenerSetter.removeManual(document,"mouseup",d,l)):void a(t)},d=e=>{i.size&&(0,S.fc)(window,g.Z,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",r),(0,v.Z)()},l={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",r),this.listenerSetter.add(document)("mouseup",d,l)},this.getElementsBetween=(e,t)=>{if(e===t)return[];const i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),n=(i.top-s.top||i.left-s.left)<0,a=(0,f.Z)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let r=o.indexOf(e),d=o.indexOf(t);return n||([d,r]=[r,d]),o.slice(r+1,d)},this.cancelSelection=e=>P(this,void 0,void 0,(function*(){e&&(this.doNotAnimate=!0),this.onCancelSelection&&(yield this.onCancelSelection()),this.selectedMids.clear(),this.toggleSelection(),(0,v.Z)(),e&&(this.doNotAnimate=void 0)})),(0,E.Z)(this,e),this.navigationType="multiselect-"+(0,w.a)()}attachListeners(e,t){if(this.listenElement&&this.listenerSetter.removeAll(),this.listenElement=e,this.listenerSetter=t,e)return s.Z?(t.add(e)("touchend",(()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")})),void(0,I.E)({element:e,callback:t=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),e.addEventListener("touchend",(e=>{(0,g.Z)(e),document.body.classList.remove("no-select")}),{once:!0,capture:!0}),(0,v.Z)();const i=this.getElementFromTarget(t.target);i&&this.toggleByElement(i)},listenerSetter:t})):void t.add(e)("mousedown",this.onMouseDown)}isElementShouldBeSelected(e){return this.isMidSelected(e.dataset.peerId.toPeerId(),+e.dataset.mid)}appendCheckbox(e,t){e.prepend(t.label)}toggleElementCheckbox(e,t){const i=!!this.getCheckboxInputFromElement(e);if(t){if(i)return!1;const t=new o.Z({name:e.dataset.mid,round:!0});this.isSelecting&&this.isElementShouldBeSelected(e)&&(t.input.checked=!0,e.classList.add("is-selected")),this.appendCheckbox(e,t)}else i&&(this.getCheckboxInputFromElement(e).parentElement.remove(),(0,l.Z)({element:e,className:"is-selected",forwards:!1,duration:200}));return!0}getCheckboxInputFromElement(e){var t;return"LABEL"===(null===(t=e.firstElementChild)||void 0===t?void 0:t.tagName)&&e.firstElementChild.firstElementChild}updateContainer(e=!1){var t;return P(this,void 0,void 0,(function*(){const i=this.selectedMids.size;if(!i&&!e)return;let s=!i,n=!i;const a=!i;for(const[e,t]of this.selectedMids){const i=`${e}_${this.isScheduled?"scheduled":"history"}`,a=yield this.managers.appMessagesManager.cantForwardDeleteMids(i,Array.from(t));if(s=a.cantForward,n=a.cantDelete,s&&n)break}null===(t=this.onUpdateContainer)||void 0===t||t.call(this,s,n,a)}))}toggleSelection(e=!0,t=!1){var i;const n=this.isSelecting,a=this.selectedMids.size;if(this.isSelecting=!!a||t,n===this.isSelecting)return!1;this.dispatchEvent("toggle",this.isSelecting),s.Z||(this.listenElement.classList.toggle("no-select",this.isSelecting),n&&(0,v.Z)()),(0,m.Z)();const o=!!a||t,r=null===(i=this.onToggleSelection)||void 0===i?void 0:i.call(this,o,!this.doNotAnimate);return u.IS_MOBILE_SAFARI||(o?h.Z.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):h.Z.removeByType(this.navigationType)),t&&(r||Promise.resolve()).then((()=>this.updateContainer(t))),!0}cleanup(){this.doNotAnimate=!0,this.selectedMids.clear(),this.toggleSelection(!1),this.doNotAnimate=void 0}updateElementSelection(e,t){this.toggleElementCheckbox(e,!0),this.getCheckboxInputFromElement(e).checked=t,this.toggleSelection(),this.updateContainer(),(0,l.Z)({element:e,className:"is-selected",forwards:t,duration:200})}isMidSelected(e,t){const i=this.selectedMids.get(e);return null==i?void 0:i.has(t)}length(){return Z(this.selectedMids)}toggleMid(e,t,i){let s=this.selectedMids.get(e);return i||void 0===i&&(null==s?void 0:s.has(t))?s&&(s.delete(t),s.size||this.selectedMids.delete(e)):(s||(s=new Set,this.selectedMids.set(e,s)),s.add(t)),!0}deleteSelectedMids(e,t){const i=this.selectedMids.get(e);i&&(t.forEach((e=>{i.delete(e)})),i.size||this.selectedMids.delete(e),this.updateContainer(),this.toggleSelection())}}class k extends T{constructor(e,t,i){super({managers:t,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>(0,f.Z)(e,"search-super-item"),targetLookupClassName:"search-super-item",lookupBetweenParentClassName:"tabs-tab",lookupBetweenElementsQuery:".search-super-item"}),this.searchSuper=e,this.toggleByElement=e=>{const t=+e.dataset.mid,i=e.dataset.peerId.toPeerId();this.toggleMid(i,t)&&this.updateElementSelection(e,this.isMidSelected(i,t))},this.toggleByMid=(e,t)=>{const i=this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id="${e}"][data-mid="${t}"]`);this.toggleByElement(i)},this.onUpdateContainer=(e,t,i)=>{const s=this.length();(0,b.Z)(this.selectionCountEl,(0,p.ag)("messages",[s])),this.selectionGotoBtn.classList.toggle("hide",1!==s),this.selectionForwardBtn.classList.toggle("hide",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.classList.toggle("hide",t)},this.onToggleSelection=(e,t)=>{if((0,l.Z)({element:this.searchSuper.navScrollableContainer,className:"is-selecting",forwards:e,duration:t?200:0,onTransitionEnd:()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)}}),(0,l.Z)({element:this.searchSuper.container,className:"is-selecting",forwards:e,duration:200}),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=(0,a.Z)(`close ${e}-cancel`,{noRipple:!0});(0,S.fc)(t,(()=>this.cancelSelection()),{listenerSetter:this.listenerSetter,once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=(0,a.Z)(`message ${e}-goto`);const i={listenerSetter:this.listenerSetter};(0,S.fc)(this.selectionGotoBtn,(()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),M.ZP.setInnerPeer({peerId:e,lastMsgId:t})}),i),this.selectionForwardBtn=(0,a.Z)(`forward ${e}-forward`),(0,S.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new d.Z(e,(()=>{this.cancelSelection()}))}),i),this.isPrivate&&(this.selectionDeleteBtn=(0,a.Z)(`delete danger ${e}-delete`),(0,S.fc)(this.selectionDeleteBtn,(()=>{const e=[...this.selectedMids.keys()][0];new r.Z(e,[...this.selectedMids.get(e)],"chat",(()=>{this.cancelSelection()}))}),i)),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionGotoBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean));const s=this.selectionContainer;s.style.opacity="0",this.searchSuper.navScrollableContainer.append(s),s.offsetLeft,s.style.opacity=""}},this.isPrivate=!e.showSender,this.attachListeners(e.container,i)}toggleSelection(e=!0,t=!1){const i=super.toggleSelection(e,t);return i&&e&&Array.from(this.searchSuper.tabsContainer.querySelectorAll(".search-super-item")).forEach((e=>{this.toggleElementCheckbox(e,this.isSelecting)})),i}}class x extends T{constructor(e,t,i,s){super({managers:s,getElementFromTarget:e=>(0,f.Z)(e,"grouped-item")||(0,f.Z)(e,"bubble"),verifyTarget:(e,t)=>!(!this.selectedMids.size&&!e.target.classList.contains("bubble")&&!e.target.classList.contains("document-selection")&&t),verifyMouseMoveTarget:(e,t,i)=>!(e.target!==t&&!e.target.classList.contains("document-selection")&&void 0===i&&!this.selectedMids.size),verifyTouchLongPress:()=>!this.chat.input.recording,targetLookupClassName:"bubble",lookupBetweenParentClassName:"bubbles-inner",lookupBetweenElementsQuery:".bubble:not(.is-multiple-documents), .grouped-item",isScheduled:"scheduled"===e.type}),this.chat=e,this.bubbles=t,this.input=i,this.toggleByElement=e=>{if(!this.canSelectBubble(e))return;const t=+e.dataset.mid;if(e.classList.contains("is-grouped")){if(!this.isGroupedBubbleSelected(e)){const t=this.selectedMids.get(this.chat.peerId);t&&this.getMidsFromGroupContainer(e).forEach((e=>t.delete(e)))}this.bubbles.getBubbleGroupedItems(e).map(this.toggleByElement)}else if(this.toggleMid(this.chat.peerId,t)){if(e.classList.contains("grouped-item")){const t=(0,f.Z)(e,"bubble"),i=this.isGroupedBubbleSelected(t),s=this.isGroupedMidsSelected(t);(s||i)&&this.updateElementSelection(t,s)}this.updateElementSelection(e,this.isMidSelected(this.chat.peerId,t))}},this.toggleByMid=(e,t)=>P(this,void 0,void 0,(function*(){const e=yield this.bubbles.getMountedBubble(t);e&&this.toggleByElement(e.bubble)})),this.onToggleSelection=(e,t)=>P(this,void 0,void 0,(function*(){const{needTranslateX:i,widthFrom:s,widthTo:o}=yield this.chat.input.center(t);(0,l.Z)({element:this.listenElement,className:"is-selecting",forwards:e,duration:t?200:0,onTransitionEnd:()=>{this.isSelecting||(this.selectionInputWrapper.remove(),this.selectionInputWrapper=this.selectionContainer=this.selectionSendNowBtn=this.selectionForwardBtn=this.selectionDeleteBtn=this.selectionLeft=this.selectionRight=null,this.selectedText=void 0)}});const h=sthis.cancelSelection()),{once:!0,listenerSetter:this.listenerSetter}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add("selection-container-count"),"scheduled"===this.chat.type?(this.selectionSendNowBtn=(0,n.Z)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append((0,p.ag)("MessageScheduleSend")),(0,S.fc)(this.selectionSendNowBtn,(()=>{new c.Z(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],(()=>{this.cancelSelection()}))}),e)):(this.selectionForwardBtn=(0,n.Z)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append((0,p.ag)("Forward")),(0,S.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new d.Z(e,(()=>{this.cancelSelection()}))}),e)),this.selectionDeleteBtn=(0,n.Z)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append((0,p.ag)("Delete")),(0,S.fc)(this.selectionDeleteBtn,(()=>{new r.Z(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],this.chat.type,(()=>{this.cancelSelection()}))}),e);const i=this.selectionLeft=document.createElement("div");i.classList.add("selection-container-left"),i.append(t,this.selectionCountEl);const s=this.selectionRight=document.createElement("div");s.classList.add("selection-container-right"),s.append(...[this.selectionSendNowBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean)),void 0!==h&&(i.style.transform=`translateX(${-h}px)`,s.style.transform=`translateX(${h}px)`),this.selectionContainer.append(i,s),this.selectionInputWrapper.style.opacity="0",this.selectionInputWrapper.append(this.selectionContainer),this.input.inputContainer.append(this.selectionInputWrapper),this.selectionInputWrapper.offsetLeft,this.selectionInputWrapper.style.opacity="",i.style.transform="",s.style.transform=""}}else this.selectionLeft&&void 0!==h&&(this.selectionLeft.style.transform=`translateX(-${h}px)`,this.selectionRight.style.transform=`translateX(${h}px)`)})),this.onUpdateContainer=(e,t,i)=>{(0,b.Z)(this.selectionCountEl,(0,p.ag)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",i),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>P(this,void 0,void 0,(function*(){}))}appendCheckbox(e,t){t.label.classList.add("bubble-select-checkbox"),e.classList.contains("document-container")?e.querySelector(".document, audio-element").append(t.label):super.appendCheckbox(e,t)}toggleSelection(e=!0,t=!1){const i=super.toggleSelection(e,t);if(i&&e)for(const e in this.bubbles.bubbles){if(this.bubbles.skippedMids.has(+e))continue;const t=this.bubbles.bubbles[e];this.toggleElementCheckbox(t,this.isSelecting)}return i}toggleElementCheckbox(e,t){if(!this.canSelectBubble(e))return;const i=super.toggleElementCheckbox(e,t);return i&&e.classList.contains("is-grouped")&&this.bubbles.getBubbleGroupedItems(e).forEach((e=>this.toggleElementCheckbox(e,t))),i}isElementShouldBeSelected(e){const t=e.classList.contains("is-grouped");return super.isElementShouldBeSelected(e)&&(!t||this.isGroupedMidsSelected(e))}isGroupedBubbleSelected(e){const t=this.getCheckboxInputFromElement(e);return null==t?void 0:t.checked}getMidsFromGroupContainer(e){const t=this.chat.bubbles.getBubbleGroupedItems(e);return t.length||t.push(e),t.map((e=>+e.dataset.mid))}isGroupedMidsSelected(e){const t=this.getMidsFromGroupContainer(e),i=t.filter((e=>this.isMidSelected(this.chat.peerId,e)));return t.length===i.length}getCheckboxInputFromElement(e){return e.classList.contains("document-container")?e.querySelector("label input"):super.getCheckboxInputFromElement(e)}canSelectBubble(e){return!(e.classList.contains("service")||e.classList.contains("is-outgoing")||e.classList.contains("is-error")||e.classList.contains("bubble-first")||e.classList.contains("avoid-selection"))}}},9807:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(1405),n=i(2325),a=i(9750),o=i(3512),r=i(3855);class d{constructor(e={}){const t=this.label=document.createElement("label");t.classList.add("checkbox-field"),e.restriction&&t.classList.add("checkbox-field-restriction"),e.round&&t.classList.add("checkbox-field-round"),e.disabled&&this.toggleDisability(!0),this.listenerSetter=e.listenerSetter;const i=this.input=document.createElement("input");if(i.classList.add("checkbox-field-input"),i.type="checkbox",e.name&&(i.id="input-"+e.name),e.checked&&(i.checked=!0),e.stateKey){let t=!1;const s=()=>{if(!t)return;let s;s=e.stateValues?e.stateValues[i.checked?1:0]:i.checked,o.Z.managers.appStateManager.setByKey(e.stateKey,s)};r.Z.getState().then((i=>{t=!0;const s=(0,a.Z)(i,e.stateKey);let n;n=e.stateValues?1===e.stateValues.indexOf(s):s,this.setValueSilently(n)})),e.listenerSetter?e.listenerSetter.add(i)("change",s):i.addEventListener("change",s)}let d;if(e.text?(d=this.span=document.createElement("span"),d.classList.add("checkbox-caption"),(0,n.$d)(d,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(i),e.toggle){t.classList.add("checkbox-field-toggle");const e=document.createElement("div");e.classList.add("checkbox-toggle"),t.append(e)}else{const e=document.createElement("div");e.classList.add("checkbox-box");const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("checkbox-box-check"),i.setAttributeNS(null,"viewBox","0 0 24 24");const s=document.createElementNS("http://www.w3.org/2000/svg","use");s.setAttributeNS(null,"href","#check"),s.setAttributeNS(null,"x","-1"),i.append(s);const n=document.createElement("div");n.classList.add("checkbox-box-background");const a=document.createElement("div");a.classList.add("checkbox-box-border"),e.append(a,n,i),t.append(e)}d&&t.append(d),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),(0,s.Z)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},4489:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n extends s.ZP{constructor(e){super(Object.assign(e,{plainText:!0})),this.options=e;const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let i=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const s=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(s);const n=this.value.length;if(n===e.length)e.onFill(this.value);else if(n===i)return;i=n}))}}},5592:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(1168),n=i(8127);function a(e){return new Promise(((t,i)=>{var a;const{button:o,checkbox:r}=e;o.callback=i=>{t(r||!i?i?!!i.size:void 0:e.checkboxes.map((e=>i.has(e.text))))};const d=(0,s.x)(e.buttons||[o]),l=d.find((e=>e.isCancel));l.callback=()=>{i()},e.buttons=d,null!==(a=e.checkboxes)&&void 0!==a||(e.checkboxes=r&&[r]),new n.Z("popup-confirmation",e).show()}))}},5431:(e,t,i)=>{"use strict";i.d(t,{Z:()=>S});var s=i(9976),n=i(3910),a=i(8497),o=i(4668),r=i(5565),d=i(130),l=i(4789),c=i(144),h=i(2325),u=i(8115),p=i(3512),f=i(671),m=i(503),g=i(8805);let v;const b=()=>{v=h.ZP.countriesList.filter((e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)})).sort(((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name)))};let y=()=>{b(),p.Z.addEventListener("language_change",(()=>{b()}))};const w=new Set(["FT"]);class S extends m.ZP{constructor(e={}){super(Object.assign({label:"Country",name:(0,c.a)()},e)),this.options=e,this.hidePicker=()=>{void 0===this.hideTimeout&&(this.selectWrapper.classList.remove("active"),this.hideTimeout=window.setTimeout((()=>{this.selectWrapper.classList.add("hide"),this.hideTimeout=void 0}),200))},this.selectCountryByTarget=e=>{var t,i;const s=e.querySelector("[data-default-name]").dataset.defaultName,n=e.querySelector(".phone-code"),a=null==n?void 0:n.innerText,o=a&&a.replace(/\D/g,"");(0,r.Z)(this.input,(0,h.ag)(s)),this.simulateInputEvent(),this.lastCountrySelected=v.find((e=>e.default_name===s)),this.lastCountryCodeSelected=o&&this.lastCountrySelected.country_codes.find((e=>e.country_code===o)),null===(i=(t=this.options).onCountryChange)||void 0===i||i.call(t,this.lastCountrySelected,this.lastCountryCodeSelected),this.hidePicker()},y&&(y(),y=void 0),this.liMap=new Map,this.container.classList.add("input-select");const t=this.selectWrapper=document.createElement("div");t.classList.add("select-wrapper","z-depth-3","hide");const i=document.createElement("span");i.classList.add("arrow","arrow-down"),this.container.append(i);const p=document.createElement("ul");t.appendChild(p),new g.ZP(t);let m=()=>{m=null,v.forEach((t=>{if(e.noPhoneCodes&&w.has(t.iso2))return;const i=(0,f.Ml)(t.iso2),n=[];for(let a=0,o=Math.min(t.country_codes.length,e.noPhoneCodes?1:1/0);a{if(0!==e.button)return;const t=(0,o.Z)(e.target,"LI");this.selectCountryByTarget(t)})),this.container.appendChild(t)};m(),this.input.addEventListener("focus",(e=>{m?m():v.forEach((e=>{const t=this.liMap.get(e.iso2);t&&t.forEach((e=>e.style.display=""))})),clearTimeout(this.hideTimeout),this.hideTimeout=void 0,t.classList.remove("hide"),t.offsetWidth,t.classList.add("active"),this.select(),(0,l.Z)({container:(0,a.Z)(this.container,"scrollable-y"),element:this.input,position:"start",margin:4}),setTimeout((()=>{b||(document.addEventListener("mousedown",S,{capture:!0}),b=!0)}),0)}));let b=!1;const S=e=>{(0,a.Z)(e.target,"input-select")||e.target!==this.input&&(this.hidePicker(),document.removeEventListener("mousedown",S,{capture:!0}),b=!1)},C=e=>{const t=e.key;if(e.ctrlKey||"Control"===t)return!1;const i=this.value.toLowerCase(),s=[];v.forEach((e=>{const t=this.liMap.get(e.iso2);if(!t)return;const n=[e.name,e.default_name,e.iso2];n.filter(Boolean).forEach((e=>{const t=e.split(" ").filter((e=>/\w/.test(e))).map((e=>e[0])).join("");t.length>1&&n.push(t)}));const a=!!n.filter(Boolean).find((e=>-1!==e.toLowerCase().indexOf(i)));t.forEach((e=>e.style.display=a?"":"none")),a&&s.push(e)})),0===s.length?v.forEach((e=>{const t=this.liMap.get(e.iso2);t&&t.forEach((e=>e.style.display=""))})):1===s.length&&"Enter"===t&&((0,n.Z)(e),this.selectCountryByTarget(this.liMap.get(s[0].iso2)[0]))};this.input.addEventListener("keyup",C),this.input.addEventListener("keydown",(e=>{"Enter"===e.key&&C(e)})),i.addEventListener("mousedown",(e=>{this.input.matches(":focus")?(this.hidePicker(),this.input.blur()):(e.cancelBubble=!0,e.preventDefault(),this.input.focus())}))}getSelected(){return{country:this.lastCountrySelected,code:this.lastCountryCodeSelected}}selectCountryByIso2(e){this.selectCountryByTarget(this.liMap.get(e)[0])}override(e,t,i){var s,n;(0,r.Z)(this.input,e?(0,h.ag)(e.default_name):i),this.lastCountrySelected=e,this.lastCountryCodeSelected=t,null===(n=(s=this.options).onCountryChange)||void 0===n||n.call(s,this.lastCountrySelected,this.lastCountryCodeSelected)}}},6628:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(4762),n=i(5296),a=i(3228),o=i(5814);class r{constructor(e,t,i){this.width=e,this.height=t,this.multiply=i;const s=this.canvas=document.createElement("canvas"),n=this.dpr=window.devicePixelRatio;s.width=e*n,s.height=t*n,s.classList.add("canvas-thumbnail","canvas-dots"),this.paused=!0,this.autoplay=!0,this.tempId=0,this.context=s.getContext("2d")}prepare(){let e=Math.round(this.width*this.height/(35*(s.IS_MOBILE?2:1)));e*=this.multiply||1,e=Math.min(s.IS_MOBILE?1e3:2200,e),e=Math.round(e);const t=this.dots=new Array(e);for(let i=0;i=.8?1:.5)*this.dpr,a=new Path2D;return a.arc(t,i,n,0,2*Math.PI,!1),{x:t,y:i,opacity:s,radius:n,mOpacity:s,adding:null!=e?e:Math.random()>=.5,counter:0,path:a}}draw(){const{context:e,canvas:t,dots:i}=this;e.clearRect(0,0,t.width,t.height),e.fillStyle="#fff";for(let t=0,s=i.length;t=1&&(i[t]=this.generateDot(s.adding))):s.mOpacity>=1&&(s.adding=!1)}}remove(){this.pause()}pause(){this.paused||(this.paused=!0,++this.tempId)}renderFirstFrame(){this.dots||this.prepare(),this.draw()}play(){if(!this.paused)return;this.paused=!1;const e=++this.tempId;this.dots||this.prepare(),(0,n.jt)((()=>this.tempId===e&&!this.paused&&(this.draw(),!0)))}static create({width:e,height:t,middleware:i,animationGroup:s,multiply:n}){const a=new r(e,t,n);return a.renderFirstFrame(),o.Z.addAnimation(a,s,a.canvas,i),a}}},2621:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(187),n=i(9331),a=i(8119),o=i(5953),r=i(1507);class d{constructor(e){this._disabled=!1,this.avatarSize=120,this.isChanged=()=>{if(this.uploadAvatar)return!0;let e=0,t=0,i=0;return this.inputFields.forEach((s=>{s.isValid()&&(s.isChanged()&&++e,s.required&&++i),s.required&&++t})),t===i&&e>0},this.handleChange=()=>{this.nextBtn.classList.toggle("is-visible",this.isChanged())},(0,o.Z)(this,e),this.peerId||(this.peerId=r.NM),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=(0,a.Z)({icon:"check"}),e.withoutAvatar||(this.avatarElem=new n.Z,this.avatarElem.classList.add("avatar-placeholder","avatar-"+this.avatarSize),this.avatarElem.updateWithOptions({peerId:this.peerId}),e.doNotEditAvatar||(this.avatarEdit=new s.Z((e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()}),e.popupOptions),this.avatarEdit.container.append(this.avatarElem))),this.inputFields.forEach((e=>{this.listenerSetter.add(e.input)("input",this.handleChange)})),this.handleChange()}get disabled(){return this._disabled}set disabled(e){this._disabled=e,this.inputFields.forEach((t=>t.input.toggleAttribute("disabled",e))),this.handleChange()}lockWithPromise(e,t=!1){this.disabled=!0,e.then((()=>{t&&(this.disabled=!1)}),(()=>{this.disabled=!1}))}}},3173:(e,t,i)=>{"use strict";i.d(t,{Yd:()=>Y,Jo:()=>J,ZP:()=>te});var s=i(5432),n=i(4271),a=i(3512),o=i(5814),r=i(6008),d=i(2153),l=i(4332),c=i(5117),h=i(6039),u=i(1080),p=i(8805),f=i(279),m=i(2738);class g{constructor(e){this.managers=e}init(){this.content=document.getElementById("content-gifs");const e=this.content.firstElementChild;(0,m.fc)(e,J.onMediaClick);const t=this.scrollable=new p.ZP(this.content,"GIFS"),i=new u.Z(e,Y,t),s=(0,f.y)(this.content,!0);this.managers.appDocsManager.getGifs().then((e=>{e.forEach((e=>{i.add(e)})),s.remove()})),te.addLazyLoadQueueRepeat(i.lazyLoadQueue,i.processInvisibleDiv),this.init=null}onClose(){}}var v=i(6057),b=i(410),y=i(3552),w=i(3607),S=i(4755),C=i(8497),L=i(1507),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const I="GIFS-SEARCH";class M extends y._{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>E(this,void 0,void 0,(function*(){const t=(0,C.Z)(e.target,"gif");if(!t)return;const i=t.dataset.docId;(yield n.ZP.chat.input.sendMessageWithDocument(i))?S.Z.isMobile&&l.ZP.onCloseBtnClick():console.warn("got no doc by id:",i)}))}init(){this.container.id="search-gifs-container",this.inputSearch=new w.Z("SearchGifsTitle",(e=>{this.reset(),this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.gifsDiv=document.createElement("div"),this.gifsDiv.classList.add("gifs-masonry"),(0,m.fc)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new u.Z(this.gifsDiv,I,this.scrollable),l.ZP.toggleSidebar(!0).then((()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}}))}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",o.Z.checkAnimations(void 0,I),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}search(e,t=!0){return E(this,void 0,void 0,(function*(){if(!this.searchPromise&&!this.loadedAll){this.gifBotPeerId||(this.gifBotPeerId=(yield this.managers.appUsersManager.resolveUsername("gif")).id.toPeerId(!1));try{this.searchPromise=this.managers.appInlineBotsManager.getInlineResults(L.NM,this.gifBotPeerId,e,this.nextOffset);const{results:i,next_offset:s}=yield this.searchPromise;if(this.inputSearch.value!==e)return;this.searchPromise=null,this.nextOffset=s,t&&(this.gifsDiv.innerHTML=""),i.length?i.forEach((e=>{"botInlineMediaResult"===e._&&e.document&&this.masonry.add(e.document)})):this.loadedAll=!0,this.scrollable.onScroll()}catch(e){throw this.searchPromise=null,console.error("gifs loading error:",e),e}}}))}}var P=i(6787),Z=i(2325),T=i(7625),k=i(130),x=i(8115),A=i(9259),_=i(3541);class F extends y._{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new d.Z,this.inputSearch=new w.Z("StickersTab.SearchPlaceholder",(e=>{this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.setsDiv=document.createElement("div"),this.setsDiv.classList.add("sticker-sets"),this.scrollable.append(this.setsDiv),(0,A.Z)({listenTo:this.setsDiv,listenerSetter:this.listenerSetter}),(0,m.fc)(this.setsDiv,(e=>{const t=(0,C.Z)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void n.ZP.chat.input.sendMessageWithDocument(e)}const i=(0,C.Z)(e.target,"sticker-set");if(!i)return;const s=i.dataset.stickerSet,a=i.dataset.access_hash,o=(0,C.Z)(e.target,"sticker-set-button");o?(e.preventDefault(),e.cancelBubble=!0,o.setAttribute("disabled","true"),this.managers.appStickersManager.getStickerSet({id:s,access_hash:a}).then((e=>{this.managers.appStickersManager.toggleStickerSet(e.set).then((t=>{t&&(o.textContent="",o.append((0,Z.ag)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),o.classList.toggle("gray",!!e.set.installed_date))})).finally((()=>{o.removeAttribute("disabled")}))}))):this.managers.appStickersManager.getStickerSet({id:s,access_hash:a}).then((e=>{new P.Z(e.set).show()}))}),{listenerSetter:this.listenerSetter}),l.ZP.toggleSidebar(!0).then((()=>{this.renderFeatured()}))}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",o.Z.checkAnimations(void 0,"STICKERS-SEARCH"),super.onCloseAfterTimeout()}renderSet(e){const t=document.createElement("div");t.classList.add("sticker-set");const i=document.createElement("div");i.classList.add("sticker-set-header");const s=document.createElement("div");s.classList.add("sticker-set-details"),s.innerHTML='
',(0,k.Z)(s.firstElementChild,(0,x.Z)(e.title));const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append((0,Z.ag)("Stickers",[e.count])),s.append(n);const a=document.createElement("button");a.classList.add("btn-primary","btn-color-primary","sticker-set-button"),a.append((0,Z.ag)(e.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),e.installed_date&&a.classList.add("gray"),i.append(s,a);const o=document.createElement("div");o.classList.add("sticker-set-stickers");const r=Math.min(5,e.count);for(let e=0;e{for(let t=0;t{this.inputSearch.value||(e=this.filterRendered("",e)).forEach((e=>{this.renderSet(e.set)}))}))}filterRendered(e,t){t=t.slice();const i=Array.from(this.setsDiv.children);return(0,T.Z)(i,(i=>{const s=i.dataset.stickerSet,n=t.findIndex((e=>e.set.id===s));-1!==n?t.splice(n,1):e&&i.dataset.title.toLowerCase().includes(e.toLowerCase())||i.remove()})),o.Z.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?this.managers.appStickersManager.searchStickerSets(e,!1).then((t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach((e=>{this.renderSet(e.set)}))})):this.renderFeatured()}}var D,R=i(4668),B=i(8799),N=i(2648),O=i(3910),U=i(6339),H=i(5418),z=i(4762),j=i(3815),G=i(319),V=i(4789),K=i(6802),W=i.n(K),$=i(669),q=i(3299),Q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Y="emoticons-dropdown",X={forceDuration:200,transitionFunction:W()(.42,0,.58,1)};class J extends U.Z{constructor(){super({element:document.getElementById("emoji-dropdown"),ignoreOutClickClassName:"input-message-input"}),this.tabId=-1,this.onSelectTabClick=e=>{if(this.tabId!==e)o.Z.checkAnimations(!0,Y),this.tabId=e,this.searchButton.classList.toggle("hide",this.tabId===this.emojiTab.tabId),this.deleteBtn.classList.toggle("hide",this.tabId!==this.emojiTab.tabId);else{const{tab:e}=this;this.scrollTo(e,e.scrollable.container.firstElementChild)}},this.checkRights=()=>Q(this,void 0,void 0,(function*(){const{peerId:e,threadId:t}=n.ZP.chat,i=this.tabsEl.children,s=Array.from(i),[a,o]=yield Promise.all([this.managers.appMessagesManager.canSendToPeer(e,t,"send_stickers"),this.managers.appMessagesManager.canSendToPeer(e,t,"send_gifs")]);s[this.stickersTab.tabId+1].toggleAttribute("disabled",!a),s[this.gifsTab.tabId+1].toggleAttribute("disabled",!o);const r=this.tabsEl.querySelector(".active");!r||(0,N.Z)(r)===this.emojiTab.tabId+1||a&&o||this.selectTab(this.emojiTab.tabId,!1)})),this.addEventListener("open",(()=>Q(this,void 0,void 0,(function*(){var e;s.Z&&(0,B.Z)()&&(yield(0,H.Z)(100)),this.element.parentElement!==n.ZP.chat.input.chatInput&&n.ZP.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),J.lazyLoadQueue.lock(),o.Z.lockIntersectionGroup(Y);const t=this.tab;null===(e=t.onOpen)||void 0===e||e.call(t)})))),this.addEventListener("opened",(()=>{var e;o.Z.unlockIntersectionGroup(Y),J.lazyLoadQueue.unlockAndRefresh();const t=this.tab;null===(e=t.onOpened)||void 0===e||e.call(t)})),this.addEventListener("close",(()=>{var e;J.lazyLoadQueue.lock(),o.Z.lockIntersectionGroup(Y),o.Z.checkAnimations(!0,Y);const t=this.tab;null===(e=t.onClose)||void 0===e||e.call(t)})),this.addEventListener("closed",(()=>{var e;o.Z.unlockIntersectionGroup(Y),J.lazyLoadQueue.unlock(),J.lazyLoadQueue.refresh(),this.savedRange=void 0;const t=this.tab;null===(e=t.onClosed)||void 0===e||e.call(t)}))}get tab(){return this.tabs[this.tabId]}init(){this.managers=a.Z.managers,this.emojiTab=new h.ZP({managers:this.managers}),this.stickersTab=new v.ZP(this.managers),this.gifsTab=new g(this.managers),this.tabs={},[this.emojiTab,this.stickersTab,this.gifsTab].forEach(((e,t)=>{e.tabId=t,this.tabs[t]=e})),this.container=this.element.querySelector(".emoji-container .tabs-container"),this.container.prepend(this.emojiTab.container,this.stickersTab.container),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=(0,r.X)(this.tabsEl,this.container,this.onSelectTabClick,(()=>{var e;const{tab:t}=this;null===(e=t.init)||void 0===e||e.call(t),o.Z.checkAnimations(!1,Y)})),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",(()=>{this.tabId===this.stickersTab.tabId?l.ZP.isTabExists(F)||l.ZP.createTab(F).open():l.ZP.isTabExists(M)||l.ZP.createTab(M).open()})),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),(0,m.fc)(this.deleteBtn,(e=>{(0,O.Z)(e);const t=n.ZP.chat.input.messageInput;let i=$.Z.getInstance().getSavedRange(t);i||(i=document.createRange(),i.setStartAfter(t.lastChild));const s=i.cloneRange();if(i.collapsed){const{node:e,offset:n}=(0,q.q)(t,i.endContainer,i.endOffset);let a;if(n)a=e;else{if(a=e.previousSibling,!a)return;for(;a.nodeType===a.TEXT_NODE&&!a.nodeValue&&(a=a.previousSibling););if(a.nodeType===a.ELEMENT_NODE&&!a.isContentEditable)return}if(a.nodeType===a.ELEMENT_NODE&&"IMG"===a.tagName)s.selectNode(a);else{const e=[...a.textContent];let t;if(n){let i=0;t=e.find((e=>(i+=e.length,i>=n)))}else t=e.pop()||"";const i=n?n-t.length:a.textContent.length-t.length;s.setStart(a,i)}}s.deleteContents(),n.ZP.chat.input.messageInputField.simulateInputEvent()}));const e=z.IS_APPLE_MOBILE&&!1,t=e?this.stickersTab.tabId:this.emojiTab.tabId;if(e&&this.tabsEl.children[1].classList.add("hide"),(0,m.tH)(this.tabsEl.children[t+1]),this.tabs[t].init&&this.tabs[t].init(),!s.Z){let e,t=!1;const i=t=>{e=t};j.Z.addEventListener("change",(s=>{s?t||(document.body.addEventListener("mousemove",i),t=!0):t&&(document.body.removeEventListener("mousemove",i),e&&this.onMouseOut(e))}))}return n.ZP.addEventListener("peer_changing",(()=>{this.toggle(!1)})),n.ZP.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}getElement(){return this.element}scrollTo(e,t){e.scrollable.scrollIntoViewNew(Object.assign({element:t,axis:"y",position:"start"},X))}static sendDocId(e,t,i){return Q(this,void 0,void 0,(function*(){return(yield n.ZP.chat.input.sendMessageWithDocument(e,void 0,t,i))?(ee.container&&(ee.forceClose=!0,ee.toggle(!1)),!0):(console.warn("got no doc by id:",e),!1)}))}addLazyLoadQueueRepeat(e,t){this.addEventListener("close",(()=>{e.lock()})),this.addEventListener("closed",(()=>{const i=e.intersector.getVisible();for(const e of i)t(e);e.intersector.clearVisible()})),this.addEventListener("opened",(()=>{e.unlockAndRefresh()}))}getSavedRange(){return this.getGoodRange()||this.savedRange}getGoodRange(){const e=document.getSelection();if(e.rangeCount&&document.activeElement===n.ZP.chat.input.messageInput)return e.getRangeAt(0)}}D=J,J.lazyLoadQueue=new d.Z(1),J.menuOnClick=(e,t,i,s,n,a)=>{let o=-1;const r=(e,t=!0)=>{if(e===n)return!1;let i=!1;return n&&(n.elements.menuTab.classList.remove("active"),n.menuScroll&&n.menuScroll!==e.menuScroll&&(i=!0,n.menuScroll.container.parentElement.classList.remove("active"),n.menuScroll.scrollIntoViewNew(Object.assign({element:n.menuScroll.container.firstElementChild,forceDirection:t?void 0:V.f.Static,position:"center",axis:"x"},X)))),e.elements.menuTab.classList.add("active"),e.menuScroll&&(e.menuScroll.container.parentElement.classList.add("active"),t&&s.scrollIntoViewNew(Object.assign({element:e.menuScroll.container.parentElement,position:"center",axis:"x"},X))),n&&((e,t)=>{const i=e.menuScroll||s;i&&i.scrollIntoViewNew(Object.assign({element:e.elements.menuTab,position:"center",axis:"x",getElementPosition:t?({elementPosition:e})=>e-106:void 0},X))})(e,i),n=e,!0};let d=!1;const l=new c.Z(i.container,((t,s)=>{if(d)return;if(Math.abs(o-i.container.scrollTop)<=1)return;o=-1;const n=e.getCategoryByContainer(s),a=(0,N.Z)(s);(t||!a&&!n.menuScroll)&&r(n)}));(0,m.fc)(t,(t=>{let s=(0,C.Z)(t.target,"menu-horizontal-div-item");if(!s){if(s=(0,C.Z)(t.target,"menu-horizontal-inner"),!s||s.classList.contains("active"))return;s=s.firstElementChild.firstElementChild}const n=(0,N.Z)(s),a=e.getCategoryByMenuTab(s);r(a);let l=0,c=0;if(n>0||a.menuScroll){const e=a.elements.container;c=1,l=e.offsetTop+c}o=l,d=!0,i.scrollIntoViewNew(Object.assign({element:l?a.elements.container:i.container.firstElementChild,position:"start",axis:"y",getElementPosition:l?({elementPosition:e})=>e+c:void 0},X)).finally((()=>{r(a),d=!1}))}),{listenerSetter:a});const h=i.onAdditionalScroll?i.onAdditionalScroll.bind(i):G.Z;return i.onAdditionalScroll=()=>{e.content.parentElement.classList.toggle("scrolled-top",!i.scrollTop),h()},{stickyIntersector:l,setActive:r,setActiveStatic:t=>{if(null==n?void 0:n.local)return;e.scrollable.scrollTop=t.elements.container.offsetTop+1;const i=e.menuScroll.container,s=t.elements.menuTab;i.scrollLeft=s.offsetLeft-i.clientWidth/2+s.offsetWidth/2,r(t,!1)}}},J.onMediaClick=(e,t=!1,i)=>Q(void 0,void 0,void 0,(function*(){const s=(0,R.Z)(e.target,"DIV");if(!s)return!1;const n=s.dataset.docId;return!!n&&D.sendDocId(n,t,i)}));const ee=new J;b.GO.emoticonsDropdown=ee;const te=ee},6039:(e,t,i)=>{"use strict";i.d(t,{IA:()=>F,ZP:()=>j,xG:()=>D});var s=i(3173),n=i(3910),a=i(8497),o=i(3035),r=i(5418),d=i(4271),l=i(3512),c=i(671),h=i(279),u=i(8805),p=i(9976),f=i(5432),m=i(8799),g=i(3447),v=i(7746),b=i(8115),y=i(7197),w=i(5400),S=i(2738),C=i(6057),L=i(9405),E=i(2940),I=i(4755),M=i(1273),P=i(9259),Z=i(4064),T=i(4484),k=i(6787),x=i(2796),A=i(5953);const _=new Set;function F(e,t,i=!1,s=!1){var n;const a=document.createElement("span");let r;if(a.classList.add("super-emoji"),s&&!p.Z?r=function(e){return(0,w.ZP)(e,{entities:[(0,y.Z)(e)]})}(e):(e=(0,v.Z)(e),r=(0,b.Z)(e)),a.append(r),a.children.length>1){const e=a.firstElementChild;a.innerHTML="",a.append(e)}if("IMG"===(null===(n=a.firstElementChild)||void 0===n?void 0:n.tagName)){const e=a.firstElementChild,t=e.src;if(!_.has(t)){e.setAttribute("loading","lazy");const i=document.createElement("span");i.classList.add("emoji-placeholder"),l.Z.settings.animationsEnabled&&(e.style.opacity="0",i.style.opacity="1"),e.addEventListener("load",(()=>{(0,o.T2)((()=>{l.Z.settings.animationsEnabled&&(e.style.opacity="",i.style.opacity=""),a.classList.remove("empty"),_.add(t)}))}),{once:!0}),a.append(i)}}return t&&(i?t.prepend(a):t.appendChild(a)),a}function D(e){const t=(0,a.Z)(e,"super-emoji");if(!t)return;const i=t.firstElementChild;return i&&i.classList.contains("custom-emoji")?{emoji:i.dataset.stickerEmoji,docId:i.dataset.docId}:e.nodeType===e.TEXT_NODE?{emoji:e.nodeValue}:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),{emoji:e.getAttribute("alt")||e.innerText})}const R="Emoji.Recent",B=[R,"recent"],N=["",""],O=[["Emoji.SmilesAndPeople","smile"],["Emoji.AnimalsAndNature","animals"],["Emoji.FoodAndDrink","eats"],["Emoji.TravelAndPlaces","car"],["Emoji.ActivityAndSport","sport"],["Emoji.Objects","lamp"],["Emoji.Flags","flag"],["Skin Tones",""]];let U;function H(){if(U)return U;U=new Map([[N,[]],[B,[]]]);for(const e in g.Z){const t=""+g.Z[e],i=O[+t[0]-1];if(!i)continue;let s=U.get(i);s||(s=[],U.set(i,s)),s[+t.slice(1)||0]=e}U.delete(O.pop()),O.unshift(N,B);const e=O.map((([e])=>e)),t=[...U.entries()].sort(((t,i)=>e.indexOf(t[0][0])-e.indexOf(i[0][0])));return U=new Map(t),U}const z=(0,L.C)(42,42);class j extends C.pw{constructor(e){super(e.managers,"super-emojis",(()=>z),16,4,0),this.onCategoryVisibility=({target:e,visible:t})=>{const i=this.categoriesMap.get(e),s=i.elements.renderer,n=[];if(s){n.push(s);const e=new Map;t?(n.push(...i.items.map((({docId:t,element:i})=>{if(!t)return i;const s=i.firstElementChild;return s.clear(!1),e.set(s.docId,new Set([s])),i}))),s.add(e,void 0,void 0,!1)):(s.clearCanvas(),s.middlewareHelper.clean())}else t&&n.push(...i.items.map((({element:e})=>e)));if(i.elements.items.replaceChildren(...n),s&&!t){const e=new Map;i.items.forEach((({docId:t,element:i})=>{if(!t)return;const s=i.firstElementChild;s.clear(),e.set(s.docId,new Set([s]))})),s.add(e,void 0,!0)}},this.onContentClick=e=>{(0,n.Z)(e);const{target:t}=e,i=(0,a.Z)(t,"emoji-category"),s=this.categoriesMap.get(i);if((0,a.Z)(t,"category-title")){if(s.local)return;return void new k.Z({id:s.set.id,access_hash:s.set.access_hash},!0).show()}const o=D(t);if(o){if(o.docId&&!l.Z.premium&&(this.isStandalone?""!==s.id:this.peerId!==l.Z.myId)){const e=document.createElement("a");return e.onclick=()=>{d.ZP.openPremiumBot(),(0,x.PE)()},void(0,x.bC)({langPackKey:"CustomEmoji.PremiumAlert",langPackArguments:[e]})}this.onClick?this.onClick(Object.assign(Object.assign({},o),{element:(0,a.Z)(t,"super-emoji").firstElementChild})):d.ZP.chat.input.onEmojiSelected(o,!1),f.Z&&(0,m.Z)()}},(0,A.Z)(this,e),this.container.classList.add("emoji-padding"),this.content.id="content-emoji",this.activeElements=[]}destroy(){var e;super.destroy(),null===(e=this.menuInnerScroll)||void 0===e||e.destroy()}init(){super.init(),this.init=void 0;const e={root:this.isStandalone?this.content:s.ZP.getElement()};this.categoriesIntersector=new E.Z(this.onCategoryVisibility,e),this.menuOnClickResult=s.Jo.menuOnClick(this,this.menu,this.scrollable,this.menuScroll,void 0,this.listenerSetter);const t=(0,h.y)(this.content,!0);let i,n;if(!this.isStandalone){const e=this.menuInnerScroll=new u.v7(void 0);e.container.classList.add("menu-horizontal-inner-scroll"),i=document.createElement("div"),i.classList.add("menu-horizontal-inner"),i.append(e.container)}H(),n=this.noRegularEmoji?new Map([[[N[0],"recent"],[]]]):H(),n.forEach(((e,[t,i])=>{const s=this.createLocalCategory(t,t,i,!i);s.elements.container.classList.remove("hide"),s.elements.items.classList.add(i&&!this.isStandalone?"is-local":"not-local"),e.forEach((e=>{const t=(0,c.zu)(e);this.addEmojiToCategory({category:s,emoji:{emoji:t},batch:!0})}))}));const a=Promise.all([this.isStandalone?void 0:(0,r.Z)(200),!this.noRegularEmoji&&this.managers.appEmojiManager.getRecentEmojis("native"),!this.isStandalone&&this.managers.appEmojiManager.getRecentEmojis("custom"),this.stickerSetId&&this.managers.appStickersManager.getLocalStickerSet(this.stickerSetId),this.managers.appEmojiManager.getCustomEmojis()]).then((([e,n,a,o,r])=>{t.remove(),o&&(a=o.documents.map((e=>e.id)));const c=this.categories[R],h=this.categories[""];if(this.isStandalone||[c&&[c,n],h&&[h,a]].filter(Boolean).forEach((([e,t])=>{e.limit=32,t.splice(32,t.length-32)})),c&&n)for(const e of n)this.addEmojiToCategory({category:c,emoji:{emoji:e},batch:!0});if(h){if(this.createRendererForCategory(h),a)for(const e of a)this.addEmojiToCategory({category:h,emoji:{emoji:"",docId:e},batch:!0});h.elements.container.style.paddingTop=".5rem"}O.forEach((([e])=>{const t=this.categories[e];t&&(this.toggleLocalCategory(t,!0),e!==R&&""!==e&&(t.menuScroll=this.menuInnerScroll,this.menuInnerScroll.container.append(t.elements.menuTab)))})),this.resizeCategories(),c&&i&&c.elements.menuTab.after(i),r.sets.forEach((e=>{this.renderStickerSet(e)})),this.listenerSetter.add(l.Z)("premium_toggle",(()=>{this.toggleCustomCategory()})),this.listenerSetter.add(l.Z)("stickers_top",this.postponedEvent((e=>{const t=this.categories[e];t&&(this.positionCategory(t,!0),this.listenerSetter.add(s.ZP)("openAfterLayout",(()=>{this.menuOnClickResult.setActiveStatic(t)}),{once:!0}))})));const u=e=>{for(const t in this.categories){const i=this.categories[t].elements.renderer;i&&(i.ignoreSettingDimensions=e,e||i.setDimensionsFromRect(void 0,!0))}};!this.isStandalone&&this.listenerSetter.add(s.ZP)("opened",(()=>{u(!1)})),!this.isStandalone&&this.listenerSetter.add(s.ZP)("close",(()=>{u(!0)})),this.listenerSetter.add(l.Z)("stickers_installed",(e=>{!this.categories[e.id]&&e.pFlags.emojis&&this.renderStickerSet(e,!0)})),this.listenerSetter.add(l.Z)("stickers_deleted",(e=>{const t=this.categories[e.id];if(this.deleteCategory(t)){const{renderer:e}=t.elements;e&&e.middlewareHelper.clean()}})),!this.isStandalone&&this.listenerSetter.add(l.Z)("emoji_recent",this.postponedEvent((e=>{const t=this.categories[e.docId?"":R];if(!t)return;const i=e.docId?t=>t.docId===e.docId:t=>t.emoji===e.emoji,s=(0,Z.Z)(t.items,i);if(s){if(t.items.unshift(s),this.isCategoryVisible(t)){const{renderer:e}=t.elements;(0,T.Z)(s.element,t.elements.items,e?1:0,-1),null==e||e.forceRender()}}else this.addEmojiToCategory({category:t,emoji:e,batch:!1,prepend:!0});0===this.closeScrollTop&&this.menuOnClickResult.setActive(e.docId?this.categories[R]:t)}))),!this.isStandalone&&this.listenerSetter.add(d.ZP)("peer_changed",(()=>{this.toggleCustomCategory()})),this.toggleCustomCategory(),this.menuOnClickResult.setActive(null!=c?c:h)}));return(0,S.fc)(this.content,this.onContentClick,{listenerSetter:this.listenerSetter}),(0,P.Z)({listenTo:this.content,listenerSetter:this.listenerSetter}),a}renderStickerSet(e,t){const i=this.createCategory(e,(0,b.Z)(e.title));this.positionCategory(i,t);const{container:n,menuTabPadding:a}=i.elements;i.elements.items.classList.add("not-local"),i.elements.container.classList.add("is-premium-set"),i.elements.title.classList.add("tgico"),this.createRendererForCategory(i),this.managers.appStickersManager.getStickerSet(e).then((({documents:e})=>{e.forEach((e=>{this.addEmojiToCategory({category:i,emoji:{docId:e.id,emoji:e.stickerEmojiRaw},batch:!0})})),this.onCategoryVisibility({target:i.elements.container,visible:this.isCategoryVisible(i)}),i.setCategoryItemsHeight(),n.classList.remove("hide")})),(0,M.Z)({set:e,container:a,group:s.Yd,lazyLoadQueue:s.Jo.lazyLoadQueue,width:32,height:32,autoplay:!1})}get peerId(){return d.ZP.chat.peerId}getCustomCategory(){return this.categories[""]}toggleCustomCategory(){const e=this.categories[""],t=l.Z.premium||this.peerId===l.Z.myId,i=t||this.isStandalone;super.toggleLocalCategory(e,!!e.items.length&&i),this.content.classList.toggle("has-premium",t)}toggleLocalCategory(e,t){""!==e.id?super.toggleLocalCategory(e,t):this.toggleCustomCategory()}createRendererForCategory(e){const t=w.KZ.create({animationGroup:s.Yd,customEmojiSize:I.Z.active.esgCustomEmoji});e.elements.renderer=t,e.elements.items.append(t)}addEmojiToCategory(e){const{category:t,emoji:i,batch:s,prepend:n}=e;let a=e.element;if(a){const e=document.createElement("span");e.classList.add("super-emoji"),e.append(a),a=e}else if(i.docId){const e=w.LD.create(i.docId),t=document.createElement("span");t.classList.add("super-emoji"),t.append(e),a=t}else a=F(i.emoji,void 0,!1);const o=Object.assign(Object.assign({},i||{emoji:void 0}),{element:a});(e.active||this.activeEmoji&&(o.docId?this.activeEmoji.docId===o.docId:this.activeEmoji.emoji===o.emoji))&&(this.activeEmoji,this.activeElements.push(o),a.classList.add("active")),t.items[n?"unshift":"push"](o),s||this.spliceExceed(t)||this.onLocalCategoryUpdate(t)}setActive(e){var t,i;(e===this.activeEmoji||(null==e?void 0:e.docId)?e.docId!==(null===(t=this.activeEmoji)||void 0===t?void 0:t.docId):(null==e?void 0:e.emoji)!==(null===(i=this.activeEmoji)||void 0===i?void 0:i.emoji))&&(this.activeEmoji=e,this.activeElements.forEach((e=>{e.element.classList.remove("active")})),this.activeElements.length=0,this.categoriesMap.forEach((t=>{t.items.forEach((t=>{(e.docId?t.docId===e.docId:t.emoji===e.emoji)&&(t.element.classList.add("active"),this.activeElements.push(t))}))})))}onClose(){this.closeScrollTop=this.scrollable.scrollTop}}},6057:(e,t,i)=>{"use strict";i.d(t,{pw:()=>_,vT:()=>x,ZP:()=>F});var s=i(3173),n=i(8497),a=i(4755),o=i(2325),r=i(8115),d=i(3512),l=i(5814),c=i(1655),h=i(7009),u=i(2940);class p extends h.Z{constructor(e,t,i){super(e),this.onVisibilityChange=t,this.elementsMap=new Map,this.intersector=new u.Z((e=>{var t;const{target:i,visible:s}=e,n=this.elementsMap.get(i);n.visible=s,s?(n.wasSeen=!0,this.queue.includes(n)||this.queue.push(n)):(0,c.Z)(this.queue,n),null===(t=this.onVisibilityChange)||void 0===t||t.call(this,e),this.setProcessQueueTimeout()}),i)}clear(){super.clear(),this.elementsMap.clear()}observe(e){this.elementsMap.set(e.div,e),super.observe(e)}unobserve(e){this.elementsMap.delete(e.div),super.unobserve(e)}}var f=i(279),m=i(6787),g=i(8805),v=i(4064),b=i(2738),y=i(4484),w=i(319),S=i(2230),C=i(5592),L=i(3163),E=i(5975),I=i(7625),M=i(9259),P=i(3699),Z=i(3541),T=i(1273),k=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class x{constructor(e,t,i,s){this.regularLazyLoadQueue=e,this.group=t,this.managers=i,this.options=s,this.animated=new Set,this.checkAnimationContainer=(e,t)=>{l.Z.getAnimations(e).forEach((e=>{t?l.Z.checkAnimation(e,!1):l.Z.removeAnimation(e)}))},this.processVisible=e=>k(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t),s=a.Z.active.esgSticker.width,n=(0,Z.ZP)({doc:i,div:e,width:s,height:s,lazyLoadQueue:null,group:this.group,onlyThumb:!1,play:!0,loop:!0,withLock:!0}).then((({render:e})=>e));return n.then((()=>{this.checkAnimationContainer(e,this.lazyLoadQueue.intersector.isVisible(e))})),n})),this.processInvisible=e=>k(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t);this.checkAnimationContainer(e,!1),e.textContent="",this.renderSticker(i,e)})),this.lazyLoadQueue=new p(void 0,(({target:e,visible:t})=>{t||this.processInvisible(e)}),s)}clear(){this.lazyLoadQueue.clear()}renderSticker(e,t,i){return t||((t=document.createElement("div")).classList.add("grid-item","super-sticker"),t.dataset.docId=""+e.id,e.animated&&this.observeAnimated(t)),(0,Z.ZP)({doc:e,div:t,lazyLoadQueue:this.regularLazyLoadQueue,group:this.group,onlyThumb:e.animated,loadPromises:i}),t}observeAnimated(e){this.animated.add(e),this.lazyLoadQueue.observe({div:e,load:this.processVisible})}unobserveAnimated(e){this.animated.delete(e),this.lazyLoadQueue.delete({div:e})}}class A{constructor(e){var t,i;const s=document.createElement("div");s.classList.add("emoji-category");const n=document.createElement("div");let a,o,r;n.classList.add("category-items"),e.title&&(a=document.createElement("div"),a.classList.add("category-title"),a.append(e.title)),e.noMenuTab||(o=(0,S.Z)(void 0,{noRipple:!0}),o.classList.add("menu-horizontal-div-item"),r=document.createElement("div"),r.classList.add("menu-horizontal-div-item-padding"),o.append(r)),a&&s.append(a),s.append(n),this.elements={container:s,title:a,items:n,menuTab:o,menuTabPadding:r},this.id=e.id,this.items=[],this.getContainerSize=e.getContainerSize,this.getElementMediaSize=e.getElementMediaSize,this.gapX=null!==(t=e.gapX)&&void 0!==t?t:0,this.gapY=null!==(i=e.gapY)&&void 0!==i?i:0}setCategoryItemsHeight(){const{width:e}=this.getContainerSize(),t=this.getElementMediaSize().width;let i=e/t;this.gapX&&(i-=Math.floor(i-1)*this.gapX/t),i=Math.floor(i);const s=Math.ceil(this.items.length/i);let n=s*t;this.gapY&&(n+=(s-1)*this.gapY),this.elements.items.style.minHeight=n+"px"}}class _{constructor(e,t,i,n,a,o){this.managers=e,this.categoryItemsClassName=t,this.getElementMediaSize=i,this.padding=n,this.gapX=a,this.gapY=o,this.mounted=!1,this.resizeCategories=()=>{for(const[e,t]of this.categoriesMap)t.setCategoryItemsHeight()},this.postponedEvent=e=>(...t)=>{s.ZP.isActive()?this.postponedEvents.push({cb:e,args:t}):e(...t)},this.categories={},this.categoriesMap=new Map,this.categoriesByMenuTabMap=new Map,this.localCategories=[],this.postponedEvents=[],this.listenerSetter=new P.Z,this.container=document.createElement("div"),this.container.classList.add("tabs-tab","emoticons-container"),this.menuWrapper=document.createElement("div"),this.menuWrapper.classList.add("menu-wrapper","emoticons-menu-wrapper"),this.menu=document.createElement("nav"),this.menu.className="menu-horizontal-div no-stripe justify-start emoticons-menu",this.menuWrapper.append(this.menu),this.menuScroll=new g.v7(this.menuWrapper),this.content=document.createElement("div"),this.content.classList.add("emoticons-content"),this.container.append(this.menuWrapper,this.content),this.scrollable=new g.ZP(this.content,"STICKERS")}getCategoryByContainer(e){return this.categoriesMap.get(e)}getCategoryByMenuTab(e){return this.categoriesByMenuTabMap.get(e)}createCategory(e,t,i,s){const n=new A({id:""+e.id,title:t,overflowElement:this.content,getContainerSize:()=>{var e,t;const{width:i,height:s}=null!==(t=null===(e=this.getContainerSize)||void 0===e?void 0:e.call(this))&&void 0!==t?t:this.content.getBoundingClientRect();return{width:i-this.padding,height:s}},getElementMediaSize:this.getElementMediaSize,gapX:this.gapX,gapY:this.gapY,noMenuTab:s});this.categoryItemsClassName&&n.elements.items.classList.add(this.categoryItemsClassName);const a=n.elements.container;return a.classList.add("hide"),n.set=e,this.categories[e.id]=n,this.categoriesMap.set(a,n),!s&&this.categoriesByMenuTabMap.set(n.elements.menuTab,n),this.categoriesIntersector.observe(a),!s&&this.menuOnClickResult.stickyIntersector.observeStickyHeaderChanges(a),i||!s&&n.elements.menuTab.classList.add("not-local"),n}positionCategory(e,t){const{menuTab:i,container:s}=e.elements,n=t?this.localCategories.filter((e=>e.mounted)).length:65535;let a=!1;const o=t?this.localCategories.filter((e=>e.menuScroll&&!a?(a=!0,!0):e.mounted&&!e.menuScroll&&e.elements.menuTab)).length:65535;(0,y.Z)(s,this.scrollable.container,n),(0,y.Z)(i,this.menu,o)}isCategoryVisible(e){return this.categoriesIntersector.getVisible().includes(e.elements.container)}toggleLocalCategory(e,t){var i;if(t){const t=this.localCategories.indexOf(e),i=this.localCategories.slice(0,t);let s=0,n=0;i.forEach((e=>{e.mounted?e.elements.menuTab&&!e.menuScroll||++n:(++s,++n)}));const a=t-s,o=t-n;e.elements.menuTab&&(0,y.Z)(e.elements.menuTab,this.menu,o),(0,y.Z)(e.elements.container,this.scrollable.container,a)}else null===(i=e.elements.menuTab)||void 0===i||i.remove(),e.elements.container.remove();e.mounted=t}createLocalCategory(e,t,i,s){const n=this.createCategory({id:e},t&&(0,o.ag)(t),!0,s);return n.local=!0,this.localCategories.push(n),n.elements.title&&n.elements.title.classList.add("disable-hover"),s||(i&&n.elements.menuTab.classList.add("tgico","tgico-"+i),n.elements.menuTabPadding.remove()),this.toggleLocalCategory(n,!1),n}onLocalCategoryUpdate(e){e.setCategoryItemsHeight(),this.toggleLocalCategory(e,!!e.items.length)}deleteCategory(e){return!!e&&(e.elements.container.remove(),e.elements.menuTab.remove(),this.categoriesIntersector.unobserve(e.elements.container),delete this.categories[e.id],this.categoriesMap.delete(e.elements.container),this.categoriesByMenuTabMap.delete(e.elements.menuTab),!0)}spliceExceed(e){if(void 0===e.limit)return!1;const{items:t,limit:i}=e;return t.splice(i,t.length-i).forEach((({element:e})=>{e.remove()})),this.onLocalCategoryUpdate(e),!0}init(){this.listenerSetter.add(s.ZP)("closed",(()=>{this.postponedEvents.forEach((({cb:e,args:t})=>{e(...t)})),this.postponedEvents.length=0}))}destroy(){var e,t,i,s;this.getContainerSize=void 0,this.postponedEvents.length=0,null===(e=this.categoriesIntersector)||void 0===e||e.disconnect(),this.listenerSetter.removeAll(),this.scrollable.destroy(),null===(t=this.menuScroll)||void 0===t||t.destroy(),null===(s=null===(i=this.menuOnClickResult)||void 0===i?void 0:i.stickyIntersector)||void 0===s||s.disconnect()}}class F extends _{constructor(e){super(e,"super-stickers",(()=>a.Z.active.esgSticker),6,4,4),this.onCategoryVisibility=({target:e,visible:t,entry:i})=>{const s=this.categoriesMap.get(e);s.elements.items.replaceChildren(...t?s.items.map((({element:e})=>e)):[])},this.setTyping=(e=!1)=>{(e||s.ZP.isActive()&&s.ZP.tab===this)&&d.Z.dispatchEvent("choosing_sticker",!e)},this.container.classList.add("stickers-padding"),this.content.id="content-stickers"}setFavedLimit(e){this.categories.faved.limit=e}categoryAppendStickers(e,t){const{container:i}=e.elements;t.then((t=>{const s=this.isCategoryVisible(e);t.forEach((t=>{const i=this.superStickerRenderer.renderSticker(t);e.items.push({document:t,element:i}),s&&e.elements.items.append(i)})),e.setCategoryItemsHeight(),i.classList.remove("hide")}))}renderStickerSet(e,t=!1){return k(this,void 0,void 0,(function*(){const i=this.createCategory(e,(0,r.Z)(e.title)),{menuTabPadding:n}=i.elements,a=this.managers.appStickersManager.getStickerSet(e);this.categoryAppendStickers(i,a.then((e=>e.documents))),this.positionCategory(i,t),(0,T.Z)({set:e,container:n,group:s.Yd,lazyLoadQueue:s.Jo.lazyLoadQueue,width:32,height:32,autoplay:!1})}))}init(){super.init(),this.scrollable.onAdditionalScroll=()=>{this.setTyping()};const e={root:s.ZP.getElement()};this.categoriesIntersector=new u.Z(this.onCategoryVisibility,e);const t=e=>{e.elements.items.replaceChildren(),e.items.forEach((({element:e})=>this.superStickerRenderer.unobserveAnimated(e))),e.items.length=0};this.scrollable.container.addEventListener("click",(e=>{const t=e.target;if((0,n.Z)(t,"category-title")){const e=(0,n.Z)(t,"emoji-category"),i=this.categoriesMap.get(e);if(i.local)return;new m.Z({id:i.set.id,access_hash:i.set.access_hash}).show()}else s.Jo.onMediaClick(e)})),this.menuOnClickResult=s.Jo.menuOnClick(this,this.menu,this.scrollable,this.menuScroll);const i=(0,f.y)(this.content,!0),o=(e,t)=>{e.limit&&(t=t.slice(0,e.limit));const i=new Set(t.map((e=>e.id)));(0,I.Z)(e.items,(t=>{i.has(t.document.id)||this.deleteSticker(e,t.document,!0)})),this.toggleLocalCategory(e,!!t.length),(0,I.Z)(t,((t,i)=>{this.unshiftSticker(e,t,!0,i)})),this.spliceExceed(e),e.elements.container.classList.remove("hide")},r=this.createLocalCategory("faved","FavoriteStickers","savedmessages"),l=this.createLocalCategory("recent","Stickers.Recent","recent");l.limit=20;const c=(0,S.Z)("close",{noRipple:!0});l.elements.title.append(c),(0,b.fc)(c,(()=>{(0,C.Z)({titleLangKey:"ClearRecentStickersAlertTitle",descriptionLangKey:"ClearRecentStickersAlertMessage",button:{langKey:"Clear"}}).then((()=>{this.managers.appStickersManager.clearRecentStickers()}),w.Z)}));const h=this.createLocalCategory("premium","PremiumStickersShort"),p=document.createElement("span");p.classList.add("tgico-star","color-premium"),h.elements.menuTab.append(p);const g=[Promise.all([this.managers.apiManager.getLimit("favedStickers"),this.managers.appStickersManager.getFavedStickersStickers()]).then((([e,t])=>{this.setFavedLimit(e),o(r,t)})),this.managers.appStickersManager.getRecentStickersStickers().then((e=>{o(l,e)})),this.managers.appStickersManager.getAllStickers().then((e=>{for(const t of e.sets)this.renderStickerSet(t)})),this.managers.appStickersManager.getPremiumStickers().then((e=>{const t=e.length;this.toggleLocalCategory(h,d.Z.premium&&!!t),this.categoryAppendStickers(h,Promise.resolve(e)),d.Z.addEventListener("premium_toggle",(e=>{this.toggleLocalCategory(this.categories.premium,e&&!!t)}))}))];Promise.race(g).finally((()=>{i.remove()})),Promise.all(g).finally((()=>{this.mounted=!0,this.setTyping();const e=this.categories.faved,t=this.categories.recent;this.menuOnClickResult.setActive(e.items.length?e:t),d.Z.addEventListener("stickers_installed",(e=>{this.categories[e.id]||this.renderStickerSet(e,!0)}))})),this.superStickerRenderer=new x(s.Jo.lazyLoadQueue,s.Yd,this.managers,e);const v=this.superStickerRenderer.lazyLoadQueue;s.ZP.addLazyLoadQueueRepeat(v,this.superStickerRenderer.processInvisible),d.Z.addEventListener("sticker_updated",(({type:e,document:t,faved:i})=>{const s=this.categories["faved"===e?"faved":"recent"];s&&(i?this.unshiftSticker(s,t):this.deleteSticker(s,t))})),d.Z.addEventListener("stickers_deleted",(({id:e})=>{const i=this.categories[e];this.deleteCategory(i)&&t(i)})),d.Z.addEventListener("stickers_top",this.postponedEvent((e=>{const t=this.categories[e];t&&(this.positionCategory(t,!0),s.ZP.addEventListener("openAfterLayout",(()=>{this.menuOnClickResult.setActiveStatic(t)}),{once:!0}))}))),d.Z.addEventListener("stickers_updated",(({type:e,stickers:t})=>{const i=this.categories["faved"===e?"faved":"recent"];i&&o(i,t)})),d.Z.addEventListener("app_config",(()=>{this.managers.apiManager.getLimit("favedStickers").then((e=>{this.setFavedLimit(e)}))})),a.Z.addEventListener("resize",this.resizeCategories),(0,M.Z)({listenTo:this.content,listenerSetter:new P.Z});const y="menu";(0,L.Z)({listenTo:this.content,verifyRecent:e=>!!(0,E.Z)(e,this.categories.recent.elements.items),onOpen:()=>{s.ZP.setIgnoreMouseOut(y,!0)},onClose:()=>{s.ZP.setIgnoreMouseOut(y,!1)}}),this.init=null}deleteSticker(e,t,i){const s=(0,v.Z)(e.items,(e=>e.document.id===t.id));s&&(s.element.remove(),i||this.onLocalCategoryUpdate(e))}unshiftSticker(e,t,i,s){if(void 0!==s){const i=e.items[s];if(i&&i.document.id===t.id)return}let n=(0,v.Z)(e.items,(e=>e.document.id===t.id));n||(n={element:this.superStickerRenderer.renderSticker(t),document:t}),e.items.unshift(n),e.elements.items.prepend(n.element),i||this.spliceExceed(e)}unshiftRecentSticker(e){this.managers.appStickersManager.saveRecentSticker(e.id)}deleteRecentSticker(e){this.managers.appStickersManager.saveRecentSticker(e.id,!0)}onClosed(){this.setTyping(!0)}onOpened(){this.setTyping(),this.resizeCategories()}}},36:(e,t,i)=>{"use strict";i.d(t,{G:()=>s});const s=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e}},5948:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2325);function n(e){const t=document.createElement("span");return t.classList.add("badge-fake"),(0,s.$d)(t,e?"ScamMessage":"FakeMessage"),t}},1080:(e,t,i)=>{"use strict";i.d(t,{Z:()=>f});var s=i(5814),n=i(3725),a=i(3035),o=i(3512),r=i(8847),d=i(7009),l=i(2940);class c extends d.Z{constructor(e,t){super(e),this.onVisibilityChange=t,this.intersector=new l.Z((e=>{const{target:t,visible:i}=e,s=(0,r.Z)(this.queue,(e=>e.div===t));i&&s.length&&s.forEach((e=>{this.queue.unshift(e)})),this.onVisibilityChange&&this.onVisibilityChange(e),this.setProcessQueueTimeout()}))}observe(e){super.observe(e)}}var h=i(2887),u=i(319),p=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class f{constructor(e,t,i,r=!0){this.element=e,this.group=t,this.scrollable=i,this.scrollPromise=Promise.resolve(),this.timeout=0,this.onScroll=()=>{this.timeout?clearTimeout(this.timeout):this.scrollPromise=(0,n.Z)(),this.timeout=window.setTimeout((()=>{this.timeout=0,this.scrollPromise.resolve()}),150)},this.processInvisibleDiv=e=>this.scrollPromise.then((()=>p(this,void 0,void 0,(function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),i=e.querySelector("img, canvas");i&&(i.classList.remove("hide"),yield(0,a.d1)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t&&(t.remove(),t.src="",t.load(),s.Z.getAnimations(t).forEach((e=>{s.Z.removeAnimation(e)})))})))),this.managers=o.Z.managers,this.lazyLoadQueue=new c(void 0,(({target:e,visible:t})=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)})),r&&this.attach()}attach(){this.scrollable.container.addEventListener("scroll",this.onScroll)}detach(){this.clear(),this.scrollable.container.removeEventListener("scroll",this.onScroll)}clear(){this.lazyLoadQueue.clear()}processVisibleDiv(e){e.querySelector("video")||this.lazyLoadQueue.push({div:e,load:()=>{const t=e.dataset.docId;return Promise.all([this.managers.appDocsManager.getDoc(t),this.scrollPromise]).then((([t])=>p(this,void 0,void 0,(function*(){const i=(yield(0,h.Z)({doc:t,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0,noPreview:!0})).loadPromise;return i.finally((()=>{const t=e.querySelector("video"),i=e.querySelector("img, canvas");i&&i.classList.add("hide"),t&&!t.parentElement&&setTimeout((()=>{t.src="",t.load(),s.Z.getAnimations(t).forEach((e=>{s.Z.removeAnimation(e)}))}),0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)})),i}))))}})}add(e,t=this.element){const i=document.createElement("div");i.classList.add("gif","grid-item"),i.dataset.docId=""+e.id,t.append(i),this.lazyLoadQueue.observe({div:i,load:u.Z}),(0,h.Z)({doc:e,container:i,lazyLoadQueue:null,noInfo:!0,onlyPreview:!0})}}},6008:(e,t,i)=>{"use strict";i.d(t,{X:()=>c});var s=i(426),n=i(3512),a=i(3035),o=i(4789),r=i(5975),d=i(2648),l=i(2738);function c(e,t,i,c,h=200,u,p){const f=(0,s.Z)({content:t,type:e||"tabs"===t.dataset.animation?"tabs":"navigation",transitionTime:h,onTransitionEnd:c,listenerSetter:p});if(!e)return f;const m=new Proxy(f,{apply:(t,i,s)=>{const n=+s[0],a=void 0===s[1]||s[1],o=e.querySelector(`[data-tab="${n}"]`)||e.children[n];g(o,n,a)}}),g=(s,r,d=!0)=>{return l=this,c=void 0,m=function*(){const l=t.children[r];if(i){const e=i(r,l,d),t=e instanceof Promise?yield e:e;if(void 0!==t&&!t)return}u&&u.scrollIntoViewNew({element:s.parentElement.children[r],position:"center",forceDirection:d?void 0:o.f.Static,forceDuration:h,axis:"x"}),n.Z.settings.animationsEnabled||(d=!1);const c=f.prevId();if(s.classList.contains("active")||r===c)return!1;const p=d?a.T2:e=>e(),m=e.querySelector(b.toLowerCase()+".active");m&&p((()=>{m.classList.remove("active")})),v&&-1!==c&&d&&p((()=>{const e=s.querySelector("i"),t=s.parentElement.children[c].querySelector("i");t.classList.remove("animate"),e.classList.remove("animate");const i=t.parentElement.parentElement.offsetLeft-e.parentElement.parentElement.offsetLeft,n=t.clientWidth/e.clientWidth;e.style.transform=`translate3d(${i}px, 0, 0) scale3d(${n}, 1, 1)`,(0,a.T2)((()=>{e.classList.add("animate"),e.style.transform="none"}))})),p((()=>{s.classList.add("active")})),f(r,d)},new((p=void 0)||(p=Promise))((function(e,t){function i(e){try{n(m.next(e))}catch(e){t(e)}}function s(e){try{n(m.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof p?n:new p((function(e){e(n)}))).then(i,s)}n((m=m.apply(l,c||[])).next())}));var l,c,p,m},v=!e.classList.contains("no-stripe"),b=e.firstElementChild.tagName;return(0,l.fc)(e,(t=>{let i,s=t.target;if(s=(0,r.Z)(s,e),!s)return!1;if(s.dataset.tab){if(i=+s.dataset.tab,-1===i)return!1}else i=(0,d.Z)(s);g(s,i)}),{listenerSetter:p}),m}},503:(e,t,i)=>{"use strict";i.d(t,{I1:()=>C,ZP:()=>I,rf:()=>w});var s=i(3910),n=i(6669),a=i(1544),o=i(8763),r=i(4668),d=i(3299),l=i(9336),c=i(1293),h=i(5565),u=i(669),p=i(130),f=i(2325),m=i(1507),g=i(6241),v=i(6535),b=i(3066),y=i(5400);function w(e,t,i,o){return r=this,l=void 0,h=function*(){const r=[],l=(null==i?void 0:i.some((e=>"messageEntityCustomEmoji"===e._)))?L():void 0,c=(0,b.Z)(t,{entities:i,wrappingForPeerId:o,loadPromises:r,customEmojiRenderer:l});c.querySelectorAll('[contenteditable="false"]').forEach((e=>{e.contentEditable="inherit",e.classList.add("pc")})),r.length&&(yield Promise.all(r)),c.querySelectorAll(".input-selectable").forEach((e=>{e.prepend((0,y.SZ)(!0))}));const h=u.Y?u.Z.getInstance():void 0,p=Array.from(c.querySelectorAll(".custom-emoji-placeholder")).map((e=>(e.dataset.ces="1",e.customEmojiElement))),f=(0,a.Z)(c);null==l||l.destroy();const m=(0,d.Z)(e);if(m.node);else{const t=document.createRange();let i=e.lastChild;i||e.append(i=document.createTextNode("")),t.setStartAfter(i),t.collapse(!0),m.selection.removeAllRanges(),m.selection.addRange(t)}e.addEventListener("input",s.Z,{capture:!0,once:!0}),null==h||h.onBeforeInput({inputType:"insertContent"}),window.document.execCommand("insertHTML",!1,f),Array.from(e.querySelectorAll("[data-ces]")).forEach(((e,t)=>{delete e.dataset.ces;const i=p[t];e.customEmojiElement=i,i.placeholder=e})),e.querySelectorAll(".pc").forEach((e=>{e.contentEditable="false"})),null==h||h.removeExtraBOMs(e),(0,n.Z)(e,"input")},new((c=void 0)||(c=Promise))((function(e,t){function i(e){try{n(h.next(e))}catch(e){t(e)}}function s(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(i,s)}n((h=h.apply(r,l||[])).next())}));var r,l,c,h}let S=()=>{document.addEventListener("paste",(e=>{const t=(0,o.Z)(e.target,'contenteditable="true"');if(!t)return;const i=!!t.dataset.noLinebreaks;let s,n;e.preventDefault();let a=(e.originalEvent||e).clipboardData.getData("text/plain"),r=!0,d=(e.originalEvent||e).clipboardData.getData("text/html");const c=e=>"messageEntityEmoji"===e._||"messageEntityLinebreak"===e._&&!i;if(i){const e=/[\r\n]/g;a=a.replace(e,""),d=d.replace(e,"")}const h=(t.dataset.peerId||m.NM).toPeerId();if(d.trim()){d=d.replace(//,""),d=d.replace(//,""),d=d.replace('
',"");const e=d.match(/([\s\S]*)<\/body>/);e&&(d=e[1].trim());const t=(new DOMParser).parseFromString(d,"text/html").body||document.createElement("body");let i=t.firstChild;for(;i;){const e=i.nextSibling;i.nodeType===i.TEXT_NODE&&(i.nodeValue.trim()||i.remove()),i=e}const o=(0,l.Z)(t,!0,!1);h||(o.entities=o.entities.filter((e=>"messageEntityCustomEmoji"!==e._)));{const e=o.value.split("\n");let t=0;for(let i=0;i"messageEntityCustomEmoji"===e._))){s=o.value,n=o.entities,r=!1;let e=(0,v.Z)(s);e=e.filter(c),(0,g.Z)(n,e)}}r&&(s=a,n=(0,v.Z)(s),n=n.filter(c)),w(t,s,n,h)})),S=null};var C;function L(){return y.KZ.create({wrappingDraft:!0,isSelectable:!0})}function E(e){const t=Array.from(e.querySelectorAll(".custom-emoji, .custom-emoji-placeholder"));let i=e.querySelector(".custom-emoji-renderer");if(!i&&t.length)i=L(),e.prepend(i);else if(i&&!t.length)return void i.remove();if(!i)return;const s=new Map;t.forEach((e=>{const t=e instanceof y.LD?e:e.customEmojiElement,{docId:i}=t;let n=s.get(i);n||s.set(i,n=new Set),n.add(t)}));for(const[e,t]of s){let s=i.customEmojis.get(e);if(s)for(const e of s)t.has(e)||e.destroy();else s=new Set;for(const e of t)s.has(e)||e.connectedCallback()}i.add(s,!1),i.forceRender()}!function(e){e[e.Neutral=0]="Neutral",e[e.Valid=1]="Valid",e[e.Error=2]="Error"}(C||(C={}));class I{constructor(e={}){this.options=e,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=e.required,this.validate=e.validate,void 0!==e.maxLength&&void 0===e.showLengthOn&&(e.showLengthOn=Math.min(40,Math.round(e.maxLength/3)));const{placeholder:t,maxLength:i,showLengthOn:s,name:n,plainText:a,canBeEdited:o=!0,autocomplete:d}=e,h=e.label||e.labelText,m=[];let g;if(a?(this.container.innerHTML=`\n \n `,g=this.container.firstElementChild):(S&&S(),this.container.innerHTML='
',g=this.container.firstElementChild,g.contentEditable=""+!!o,u.Z.getInstance(),g.addEventListener("mousedown",(e=>{var t;const i=document.getSelection();if(!i.isCollapsed)return;const s=(0,r.Z)(e.target,"IMG");if(!s)return;const n=s.getBoundingClientRect(),a=n.left+n.width/2,o=e.clientX>=a,d=document.createRange();d.setStartAfter(o?s:null!==(t=s.previousSibling)&&void 0!==t?t:s),i.removeAllRanges(),i.addRange(d)})),m.push((()=>{(0,c.Z)(g)&&g.replaceChildren(),u.Y&&Array.from(g.querySelectorAll("br:not(.br-not-br)")).forEach((e=>{e.remove()})),(0,y.Cx)(Array.from(g.querySelectorAll(".input-something"))),E(g)}))),(0,p.m)(g),e.inputMode&&(g.inputMode=e.inputMode),t&&(0,f.$d)(g,t,void 0,"placeholder"),h||t){const e=document.createElement("div");e.classList.add("input-field-border"),this.container.append(e)}if(h&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const e=this.container.lastElementChild;let t=!1;const n=()=>{const n=g.classList.contains("error"),o=a?g.value.length:[...(0,l.Z)(g,!1,!1).value].length,r=i-o,d=r<0;g.classList.toggle("error",d),d||r<=s?(this.setLabel(),e.append(` (${i-o})`),t||(t=!0)):(n&&!d||t)&&(this.setLabel(),t=!1)};m.push(n)}!e.withLinebreaks&&!a&&(g.dataset.noLinebreaks="1",g.addEventListener("keypress",(e=>{if("Enter"===e.key)return e.preventDefault(),!1}))),m.length&&g.addEventListener("input",(()=>{m.forEach((e=>e()))})),this.input=g}select(){this.value&&(this.options.plainText?this.input.select():function(e){const t=document.createRange();t.selectNodeContents(e);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?(0,p.Z)(this.label,this.options.labelText):this.label.append((0,f.ag)(this.options.label,this.options.labelOptions))}get value(){return this.options.plainText?this.input.value:(0,l.Z)(this.input,!1,!1).value}set value(e){this.setValueSilently(e,!0),this.simulateInputEvent()}simulateInputEvent(){(0,n.Z)(this.input,"input")}setValueSilently(e,t){this.options.plainText?this.input.value=e:((0,h.Z)(this.input,e),E(this.input))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!(0,c.Z)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(e="",t){this.options.plainText||(e=(0,a.Z)((0,b.Z)(e))),t?this.setValueSilently(e,!1):this.value=e}setOriginalValue(e="",t){this.originalValue=e,this.setDraftValue(e,t)}setState(e,t){t?(this.label.textContent="",this.label.append((0,f.ag)(t,this.options.labelOptions))):this.setLabel(),this.input.classList.toggle("error",!!(e&C.Error)),this.input.classList.toggle("valid",!!(e&C.Valid))}setError(e){this.setState(C.Error,e)}}},3607:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n{constructor(e,t){this.prevValue="",this.timeout=0,this.onInput=()=>{if(!this.onChange)return;const e=this.value;e!==this.prevValue&&(this.prevValue=e,clearTimeout(this.timeout),this.timeout=window.setTimeout((()=>{this.onChange(e)}),200))},this.onClearClick=()=>{this.value="",this.onChange&&this.onChange(""),this.onClear&&this.onClear()},this.inputField=new s.ZP({placeholder:e,plainText:!0}),this.container=this.inputField.container,this.container.classList.remove("input-field"),this.container.classList.add("input-search"),this.onChange=t,this.input=this.inputField.input,this.input.classList.add("input-search-input");const i=document.createElement("i");i.classList.add("tgico","tgico-search"),this.clearBtn=document.createElement("i"),this.clearBtn.classList.add("tgico","btn-icon","tgico-close"),this.input.addEventListener("input",this.onInput),this.clearBtn.addEventListener("click",this.onClearClick),this.container.append(i,this.clearBtn)}get value(){return this.inputField.value}set value(e){this.prevValue=e,clearTimeout(this.timeout),this.inputField.value=e}remove(){clearTimeout(this.timeout),this.input.removeEventListener("input",this.onInput),this.clearBtn.removeEventListener("click",this.onClearClick)}}},2153:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(2940),n=i(8847),a=i(4064),o=i(7009),r=i(8594);class d extends o.Z{constructor(e,t){super(e),this.onVisibilityChange=({target:e,visible:t})=>{(0,n.Z)(this.queue,(t=>t.div===e)).forEach((e=>{t&&(e.wasSeen=!0),e.visible=t;const i=this.queue.findIndex((e=>!e.visible));this.queue.splice(Math.max(0,i),0,e)})),this.setProcessQueueTimeout()},this.intersector=new s.Z(this.onVisibilityChange),!t&&(0,r.ZP)((()=>{this.lock()}),(()=>{this.unlockAndRefresh()}))}getItem(){return(0,a.Z)(this.queue,(e=>e.wasSeen))}processItem(e){const t=Object.create(null,{processItem:{get:()=>super.processItem}});return i=this,s=void 0,a=function*(){yield t.processItem.call(this,e),this.intersector.unobserve(e.div)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}addElement(e,t){var i;return!!super.addElement(e,t)&&(this.observe(t),null!==(i=t.wasSeen)&&void 0!==i||(t.wasSeen=!1),!0)}}},7009:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8847),n=i(4421);class a extends n.Z{constructor(e){super(e),this.queue=[],this.inProcess=new Set}lock(){super.lock(),this.intersector.lock()}unlock(){super.unlock(),this.intersector.unlock()}unlockAndRefresh(){super.unlock(),this.intersector.unlockAndRefresh()}clear(){super.clear(),this.intersector.disconnect()}refresh(){this.intersector.refresh()}loadItem(e){return e.load(e.div)}addElement(e,t){if(this.queue.find((e=>e.div===t.div&&e.load===t.load)))return!1;for(const e of this.inProcess)if(e.div===t.div&&e.load===t.load)return!1;return this.queue[e](t),!0}setProcessQueueTimeout(){var e;null!==(e=this.intersectorTimeout)&&void 0!==e||(this.intersectorTimeout=window.setTimeout((()=>{this.intersectorTimeout=void 0,this.processQueue()}),0))}push(e){super.push(e)}unshift(e){super.unshift(e)}delete(e){(0,s.Z)(this.queue,(t=>t.div===e.div)),this.unobserve(e)}observe(e){this.intersector.observe(e.div)}unobserve(e){this.intersector.unobserve(e.div)}}},7207:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3013),n=i(65);class a extends n.Z{constructor(e,t,i,s){super({step:1e3/60/1e3,min:0,max:1,withTransition:i,useTransform:s},0),this.progressRAF=0,this.onLoadedData=()=>{this.max=this.media.duration,this.seek.setAttribute("max",""+this.max)},this.onEnded=()=>{this.setProgress()},this.onPlay=()=>{const e=()=>{this.setProgress(),this.progressRAF=this.media.paused?0:window.requestAnimationFrame(e)};this.progressRAF&&window.cancelAnimationFrame(this.progressRAF),this.streamable&&this.setLoadProgress(),this.progressRAF=window.requestAnimationFrame(e)},this.onTimeUpdate=()=>{this.media.paused&&(this.setProgress(),this.streamable&&this.setLoadProgress())},this.onProgress=e=>{this.setLoadProgress()},e&&this.setMedia(e,t)}setMedia(e,t=!1){this.media&&this.removeListeners(),t&&!this.filledLoad?(this.filledLoad=document.createElement("div"),this.filledLoad.classList.add("progress-line__filled","progress-line__loaded"),this.container.prepend(this.filledLoad)):this.filledLoad&&this.filledLoad.classList.toggle("hide",!t),this.media=e,this.streamable=t,(!e.paused||e.currentTime>0)&&this.onPlay();let i=!1;this.setSeekMax(),this.setListeners(),this.setHandlers({onMouseDown:()=>{i=!this.media.paused,i&&this.media.pause()},onMouseUp:e=>{i&&this.media.play()}})}scrub(e){const t=super.scrub(e);return this.media.currentTime=t,t}setLoadProgress(){if(s.Z.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,i=this.media.currentTime;let n=0,a=0;for(let s=0;s=t&&t>=n&&(n=t,a=e.end(s))}const o=this.media.duration?a/this.media.duration:0;this.filledLoad.style.width=100*o+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(s.Z.isSafariBuffering(this.media))return;const e=this.media.currentTime;super.setProgress(e)}setListeners(){super.setListeners(),this.media.addEventListener("ended",this.onEnded),this.media.addEventListener("play",this.onPlay),this.media.addEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.addEventListener("progress",this.onProgress)}removeListeners(){super.removeListeners(),this.media&&(this.media.removeEventListener("loadeddata",this.onLoadedData),this.media.removeEventListener("ended",this.onEnded),this.media.removeEventListener("play",this.onPlay),this.media.removeEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.removeEventListener("progress",this.onProgress)),this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=0)}}},3251:(e,t,i)=>{"use strict";i.d(t,{I:()=>f});var s=i(3189),n=i(8097),a=i(4755),o=i(3228),r=i(3035);const d=new Map,l=new Set;let c=!1;function h(){c||(c=!0,(0,r.T2)((()=>{c=!1,l.forEach(p),l.clear()})))}function u(e){const t=e.dataset.sizeType;return t?a.Z.active[t].width:e.getBoundingClientRect().width}function p(e){let t=d.get(e);const i=!t;let{text:a,textLength:r,from:l,multiplier:c,font:h,textWidth:p,elementWidth:f}=t||{};if(i){a=e.textContent,r=a.length,l=50,c=l>0&&l/100;let i=e.dataset.fontSize;i&&+i&&(i+="px"),h=`${e.dataset.fontWeight||s.U9} ${i||s.Bf} ${s.bt}`,p=(0,n.Z)(a,h),f=u(e),t={text:a,textLength:r,from:l,multiplier:c,font:h,textWidth:p,elementWidth:f},d.set(e,t)}const m=u(e),g=i||f!==m;if(!i&&g&&(t.elementWidth=f=m),g)if(p>f){e.setAttribute("title",a);let i=a,s=f;for(;i.length>3;){const t=i.length,a=c&&(0,o.Z)(c*t<<0,1,t-2)||Math.max(t+l-1,1),r=i.substr(0,a).replace(/\s*$/,""),d=i.substr(a+1).replace(/^\s*/,"");if(i=r+d,s=(0,n.Z)(i+"…",h),s{for(const[e]of d)l.add(e);h()}),{capture:!0,passive:!0});class f extends HTMLElement{connectedCallback(){d.set(this,null),this.dataset.sizeType?p(this):(l.add(this),h())}disconnectedCallback(){d.delete(this),l.delete(this)}}customElements.define("middle-ellipsis-element",f)},4425:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1447);class n{constructor(e,t){this.passwordInputField=e,this.size=t,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then((e=>(this.animation=e,this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())})),this.passwordInputField.helpers.onVisibilityClickAdditional=()=>{this.passwordInputField.helpers.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},s.Z.waitForFirstFrame(e))))}remove(){this.animation&&this.animation.remove()}}},3083:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1447);class n{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const i=e.input;i.addEventListener("blur",(()=>{this.playAnimation(0)})),i.addEventListener("input",(t=>{this.playAnimation(e.value.length)}))}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas[0].style.display="none"),this.animation.canvas[0].style.display=""):t=0;const i=this.needFrame>t?-1:1;this.animation.setDirection(i),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([s.Z.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then((e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),s.Z.waitForFirstFrame(e)))),s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then((e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas[0].style.display="none"),this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas[0].style.display="",this.idleAnimation.play(),this.animation.canvas[0].style.display="none")})),s.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},6830:(e,t,i)=>{"use strict";i.d(t,{T:()=>a,Z:()=>o});var s=i(3910),n=i(503);class a{constructor(e,t){this.container=e,this.input=t,this.passwordVisible=!1,this.onVisibilityClick=e=>{(0,s.Z)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()},t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",t.parentElement.prepend(i),t.parentElement.insertBefore(i.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),e.classList.add("input-field-password"),e.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}class o extends n.ZP{constructor(e={}){super(Object.assign({plainText:!0},e)),this.helpers=new a(this.container,this.input)}}},8261:(e,t,i)=>{"use strict";i.d(t,{Z:()=>G});var s=i(2365),n=i(3725),a=i(2166),o=i(3532),r=i(2738),d=i(5565),l=i(130),c=i(3699),h=i(5471),u=i(9405),p=i(3624),f=i(8631),m=i(4271),g=i(2790),v=i(5102),b=i(2325),y=i(5400),w=i(3512),S=i(9331),C=i(9807),L=i(36),E=i(5432),I=i(4064),M=i(3910),P=i(1708),Z=i(6074),T=i(3035),k=i(7030),x=i(9931),A=i(3757),_=i(9492),F=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class D{constructor(e,t){this.scrollable=e,this.managers=t,this.processItem=e=>F(this,void 0,void 0,(function*(){const t=document.createElement("div");let i;t.classList.add(D.BASE_CLASS+"-avatar","media-container","hide"),this.avatars.append(t),e&&(i="object"!=typeof e?yield this.managers.appPhotosManager.getPhoto(e):e.action.photo);const s=new Image;s.classList.add("avatar-photo"),s.draggable=!1;const n=()=>F(this,void 0,void 0,(function*(){if(i){const e=yield(0,_.Z)({container:t,photo:i,size:(0,k.Z)(i,420,420,!1),withoutPreloader:!0});[e.images.thumb,e.images.full].filter(Boolean).forEach((e=>{e.classList.add("avatar-photo")}))}else{const e=yield this.managers.appPeersManager.getPeerPhoto(this.peerId);yield(0,x.Y)(t,this.peerId,e,"photo_big",s)}t.classList.remove("hide")}));return this.avatars.childElementCount<=3?yield n():(this.intersectionObserver.observe(t),this.loadCallbacks.set(t,n)),this.addTab(),e})),this.container=document.createElement("div"),this.container.classList.add(D.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(D.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(D.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(D.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(D.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(D.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(D.BASE_CLASS+"-arrow",D.BASE_CLASS+"-arrow-next","tgico-avatarnext"),this.container.append(this.avatars,this.gradient,this.info,this.tabs,this.arrowPrevious,this.arrowNext),this.loadCallbacks=new Map,this.listenerSetter=new c.Z;const i=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),!1),s=1/3;let n=!1,a=!1;(0,r.fc)(this.container,(e=>F(this,void 0,void 0,(function*(){if(a)return void(0,M.Z)(e);if(n)return void(n=!1);if(!i())return;const t=this.container.getBoundingClientRect(),o=e.pageX,r=o-t.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||r>t.width*s&&r{t.push({element:this.avatars.children[i],item:e})}));const i=t.slice(0,this.listLoader.previous.length),s=t.slice(this.listLoader.previous.length+1),n=this.avatars.children[this.listLoader.previous.length];a=!0,(0,S.C)(n,e,(()=>e===this.peerId),this.listLoader.current,i,s),a=!1}else{const e=o>t.right-t.width/2;let i;this.avatars.classList.add("no-transition"),this.avatars.offsetLeft,i=0!==this.listLoader.index||e?this.listLoader.index===this.listLoader.count-1&&e?-(this.listLoader.count-1):e?1:-1:this.listLoader.count-1,this.listLoader.go(i),(0,T.T2)((()=>{this.avatars.classList.remove("no-transition")}))}}))),{listenerSetter:this.listenerSetter});const o=()=>{n=!0,document.body.addEventListener(E.Z?"touchend":"click",(e=>{n=!1}),{once:!0})};let d=0,l=0,h=0,u=0;this.swipeHandler=new A.Z({element:this.avatars,onSwipe:(e,t)=>{h=e*=-1;let i=l+e*-D.SCALE;return i>0?i=0:ii()?!this.container.classList.contains("is-single")&&!a:(o(),(0,M.Z)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();d=e.width,u=-d*(this.tabs.childElementCount-1),l=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=D.TRANSLATE_TEMPLATE.replace("{x}",l+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(h)/(d/D.SCALE))*(h>=0?1:-1);o(),this.avatars.classList.remove("no-transition"),(0,T.T2)((()=>{this.listLoader.go(e),this.container.classList.remove("is-swiping")}))}}),this.intersectionObserver=new IntersectionObserver((e=>{e.forEach((e=>{e.isIntersecting&&this.loadNearestToTarget(e.target)}))}))}setPeer(e){return F(this,void 0,void 0,(function*(){this.peerId=e;const t=yield this.managers.appPeersManager.getPeerPhoto(e);if(!t)return;const i=this.listLoader=new Z.Z({loadCount:50,loadMore:(t,s,n)=>{if(!s)return Promise.resolve({count:void 0,items:[]});if(e.isUser()){const i=t;return this.managers.appPhotosManager.getUserPhotos(e,i,n).then((e=>({count:e.count,items:e.photos})))}{const t=[];return i.current||t.push(this.managers.appProfileManager.getChatFull(e.toChatId())),t.push(this.managers.appMessagesManager.getSearch({peerId:e,maxId:Number.MAX_SAFE_INTEGER,inputFilter:{_:"inputMessagesFilterChatPhotos"},limit:n,backLimit:0})),Promise.all(t).then((e=>F(this,void 0,void 0,(function*(){const t=e.pop();if((0,P.Z)(t),!i.current){const s=e[0],n=(0,I.Z)(t.history,(e=>e.action.photo.id===s.chat_photo.id));i.current=n||(yield this.managers.appMessagesManager.generateFakeAvatarMessage(this.peerId,s.chat_photo))}return{count:t.count,items:t.history}}))))}},processItem:this.processItem,onJump:(e,t)=>{const i=this.listLoader.index,s=100*D.SCALE*i;this.avatars.style.transform=D.TRANSLATE_TEMPLATE.replace("{x}",`-${s}%`);const n=this.tabs.querySelector(".active");n&&n.classList.remove("active"),this.tabs.children[i].classList.add("active"),this.loadNearestToTarget(this.avatars.children[i])}});"userProfilePhoto"===t._&&(i.current=t.photo_id),yield this.processItem(i.current),i.load(!0)}))}addTab(){const e=document.createElement("div");e.classList.add(D.BASE_CLASS+"-tab"),this.tabs.append(e),1===this.tabs.childElementCount&&e.classList.add("active"),this.container.classList.toggle("is-single",this.tabs.childElementCount<=1)}loadNearestToTarget(e){const t=Array.from(e.parentElement.children),i=t.indexOf(e);t.slice(Math.max(0,i-3),Math.min(t.length,i+3)).forEach((e=>{const t=this.loadCallbacks.get(e);t&&(t(),this.loadCallbacks.delete(e),this.intersectionObserver.unobserve(e))}))}cleanup(){var e;this.listenerSetter.removeAll(),this.swipeHandler.removeListeners(),null===(e=this.intersectionObserver)||void 0===e||e.disconnect()}}D.BASE_CLASS="profile-avatars",D.SCALE=s.Z?2:1,D.TRANSLATE_TEMPLATE=s.Z?`translate3d({x}, 0, -1px) scale(${D.SCALE})`:"translate({x}, 0)";var R=i(7479),B=i(5029),N=i(2796),O=i(8210),U=i(7362),H=i(9102),z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const j=(e,t)=>{(0,l.Z)(t.title,e||""),t.container.style.display=e?"":"none"};class G{constructor(e,t,i,n=!0){this.managers=e,this.scrollable=t,this.listenerSetter=i,this.isDialog=n,s.Z||this.scrollable.container.classList.add("no-parallax"),i||(this.listenerSetter=new c.Z),this.middlewareHelper=(0,p.k)()}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new B.Z({noDelimiter:!0}),this.name=document.createElement("div"),this.name.classList.add("profile-name"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("profile-subtitle"),this.bio=new R.ZP({title:" ",subtitle:!0,icon:"info",clickable:e=>{"A"!==e.target.tagName&&((0,a.T)(this.bio.title.textContent),(0,N.Am)(b.ZP.format("BioCopied",!0)))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_About",onClick:()=>{(0,r.tH)(this.bio.container)},verify:()=>!this.peerId.isUser()},{icon:"copy",text:"Text.CopyLabel_Bio",onClick:()=>{(0,r.tH)(this.bio.container)},verify:()=>this.peerId.isUser()}]}}),this.bio.title.classList.add("pre-wrap"),this.username=new R.ZP({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>{(0,a.T)("@"+this.username.title.textContent),(0,N.Am)(b.ZP.format("UsernameCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_Username",onClick:()=>{(0,r.tH)(this.username.container)}}]}}),this.phone=new R.ZP({title:" ",subtitle:!0,icon:"phone",clickable:()=>{(0,a.T)(this.phone.title.textContent.replace(/\s/g,"")),(0,N.Am)(b.ZP.format("PhoneCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_PhoneNumber",onClick:()=>{(0,r.tH)(this.phone.container)}},{icon:"info",text:"PeerInfo.Phone.AnonymousInfo",textArgs:[document.createElement("a")],onClick:()=>{window.open("https://fragment.com/numbers","_blank")},separator:!0,multiline:!0,verify:()=>z(this,void 0,void 0,(function*(){const{isAnonymous:e}=(yield this.managers.appUsersManager.getUserPhone(this.peerId.toUserId()))||{};return e}))}]}}),this.link=new R.ZP({title:" ",subtitleLangKey:"SetUrlPlaceholder",icon:"link",clickable:()=>{const e=this.link.title.textContent;(0,a.T)(e);const t=e.includes("/c/");(0,N.Am)(b.ZP.format(t?"LinkCopiedPrivateInfo":"LinkCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_ShareLink",onClick:()=>{(0,r.tH)(this.link.container)}}]}}),this.location=new R.ZP({title:" ",subtitleLangKey:"ChatLocation",icon:"location"}),this.section.content.append(this.phone.container,this.username.container,this.location.container,this.bio.container,this.link.container);const{listenerSetter:e}=this;this.isDialog&&(this.notifications=new R.ZP({checkboxField:new C.Z({toggle:!0}),titleLangKey:"Notifications",icon:"unmute",listenerSetter:this.listenerSetter}),e.add(this.notifications.checkboxField.input)("change",(e=>{e.isTrusted&&this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,threadId:this.threadId})})),e.add(w.Z)("dialog_notify_settings",(e=>z(this,void 0,void 0,(function*(){if(this.peerId===e.peerId){const e=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.threadId});this.notifications.checkboxField.checked=!e}})))),this.section.content.append(this.notifications.container)),this.element.append(this.section.container),s.Z&&this.element.append((0,L.G)()),e.add(w.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),e.add(w.Z)("peer_bio_edit",(e=>{e===this.peerId&&this.setMoreDetails(!0)}));const t=({peerId:e,threadId:t})=>z(this,void 0,void 0,(function*(){return this.peerId===e&&(!(yield this.managers.appPeersManager.isForum(this.peerId))||!this.threadId||this.threadId===t)}));e.add(w.Z)("peer_title_edit",(e=>z(this,void 0,void 0,(function*(){(yield t(e))&&(this.fillUsername(),this.setMoreDetails(!0))})))),e.add(w.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),e.add(w.Z)("contacts_update",(e=>z(this,void 0,void 0,(function*(){this.peerId===e.toPeerId()&&((yield this.managers.appUsersManager.getUser(e)).pFlags.self&&this.isDialog||this.fillUserPhone())})))),e.add(w.Z)("avatar_update",(e=>z(this,void 0,void 0,(function*(){(yield t(e))&&this.setAvatar()})))),this.setPeerStatusInterval=window.setInterval((()=>this.setPeerStatus()),6e4)}setPeerStatus(e=!1,t){return z(this,void 0,void 0,(function*(){const i=this.peerId,s=[];s.push((()=>{this.element.classList.toggle("is-me",i===w.Z.myId)}));let n=Promise.resolve();if(i&&(w.Z.myId!==i||!this.isDialog)){const t=yield this.managers.appPeersManager.isForum(this.peerId),a=this.middlewareHelper.get();n=t&&this.threadId?(0,H.Z)({peerId:i,wrapOptions:{middleware:a}}).then((({element:e})=>{this.subtitle.replaceChildren(e)})):m.ZP.setPeerStatus({peerId:i,element:this.subtitle,needClear:e,useWhitespace:!0,middleware:a,ignoreSelf:!this.isDialog}),n.then((e=>e&&s.push(e)))}const a=()=>s.forEach((e=>e()));return n.then((()=>{if(t)return a;a()}))}))}cleanupHTML(){[this.bio,this.phone,this.username,this.location,this.link].forEach((e=>{e.container.style.display="none"})),this.notifications&&(this.notifications.container.style.display="",this.notifications.checkboxField.checked=!0),this.clearSetMoreDetailsTimeout()}canBeDetailed(){return this.peerId!==w.Z.myId||!this.isDialog}createAvatar(){const e=new S.Z;return e.classList.add("profile-avatar","avatar-120"),e.isDialog=this.isDialog,e.attachClickEvent(),e}_setAvatar(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this,t=!(!this.threadId||!(yield this.managers.appPeersManager.isForum(e)));if(this.canBeDetailed()&&!t&&(yield this.managers.appPeersManager.getPeerPhoto(e))){const t=this.avatars;return this.avatars=new D(this.scrollable,this.managers),yield this.avatars.setPeer(e),()=>{var e;this.avatars.info.append(this.name,this.subtitle),null===(e=this.avatar)||void 0===e||e.remove(),this.avatar=void 0,t?t.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),s.Z&&this.scrollable.container.classList.add("parallax")}}const i=this.createAvatar();return yield i.updateWithOptions({peerId:e,threadId:t?this.threadId:void 0,wrapOptions:{customEmojiSize:(0,u.C)(120,120),middleware:this.middlewareHelper.get()}}),()=>{var e;s.Z&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars.cleanup(),this.avatars=void 0),null===(e=this.avatar)||void 0===e||e.remove(),this.avatar=i,this.section.content.prepend(this.avatar,this.name,this.subtitle)}}))}setAvatar(e){const t=this._setAvatar();return e?t:t.then((e=>e()))}getUsernamesAlso(e){const t=e.slice(1);if(t.length){const e=t.map((e=>(0,o.Z)({username:e})));return(0,b.ag)("UsernameAlso",[(0,b.v_)(e,!1)])}}fillUsername(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=yield this.managers.appPeersManager.getPeerActiveUsernames(e),i=this.getUsernamesAlso(t);return()=>{this.username.subtitle.replaceChildren(i||(0,b.ag)("Username")),j(t[0],this.username)}}}))}fillUserPhone(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const{phone:t,isAnonymous:i}=(yield this.managers.appUsersManager.getUserPhone(e.toUserId()))||{};return()=>{this.phone.subtitle.replaceChildren((0,b.ag)(i?"AnonymousNumber":"Phone")),j(t?(0,O.Z)(t):void 0,this.phone)}}}))}fillNotifications(){return z(this,void 0,void 0,(function*(){const e=this.notifications;if(e){if(this.canBeDetailed()){const t=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.threadId});return()=>{e.checkboxField.checked=!t}}return()=>{e.container.style.display="none"}}}))}fillName(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this,[t]=yield Promise.all([(0,U.Z)({peerId:e,dialog:this.isDialog,withIcons:!this.threadId,threadId:this.threadId})]);return()=>{(0,d.Z)(this.name,t)}}))}fillRows(e){return z(this,void 0,void 0,(function*(){return Promise.all([this.fillName(),this.fillUsername(),this.fillUserPhone(),this.fillNotifications(),this.setMoreDetails(void 0,e),this.setPeerStatus(!0,!0)]).then((e=>()=>{e.forEach((e=>null==e?void 0:e()))}))}))}fillProfileElements(){return z(this,void 0,void 0,(function*(){if(!this.cleaned)return;this.cleaned=!1,this.cleanupHTML();const e=(0,n.Z)();this.middlewareHelper.get().onClean((()=>{e.reject()}));const t=yield Promise.all([this.setAvatar(!0),this.fillRows(e)]);return()=>{e.resolve(),t.forEach((e=>null==e?void 0:e()))}}))}_setMoreDetails(e,t){return z(this,void 0,void 0,(function*(){const i=this.getMiddlewarePromise();if(this.threadId&&(yield i(this.managers.appPeersManager.isForum(e)))){let t="https://t.me/";const s=(0,g.Z)(this.threadId),n=yield i(this.managers.appPeersManager.getPeerUsername(e));return t+=n?`${n}/${s}`:`c/${e.toChatId()}/${s}`,()=>{j(t,this.link)}}const s=[];if(s.push((()=>{this.bio.subtitle.replaceChildren((0,b.ag)(e.isUser()?"UserBio":"Info")),j(t.about?(0,y.ZP)(t.about):void 0,this.bio)})),!e.isUser()){const n=yield i(this.managers.appChatsManager.getChat(e.toChatId())),a=(0,v.Z)(n);let o;if(a.length)o=this.getUsernamesAlso(a),s.push((()=>j("https://t.me/"+a[0],this.link)));else{const e=t.exported_invite;"chatInviteExported"===(null==e?void 0:e._)&&s.push((()=>j(e.link,this.link)))}s.push((()=>this.link.subtitle.replaceChildren(o||(0,b.ag)("SetUrlPlaceholder"))))}const n=t.location;return"channelLocation"==(null==n?void 0:n._)&&s.push((()=>j(n.address,this.location))),this.setMoreDetailsTimeout=window.setTimeout((()=>this.setMoreDetails(!0)),6e4),()=>{s.forEach((e=>e()))}}))}setMoreDetails(e,t){return z(this,void 0,void 0,(function*(){this.clearSetMoreDetailsTimeout();const{peerId:i}=this,s=this.getMiddlewarePromise();if(!i||!this.canBeDetailed()||(yield s(this.managers.appPeersManager.isPeerRestricted(i))))return;const n=yield s(this.managers.acknowledged.appProfileManager.getProfileByPeerId(i,e)),a=s(n.result).then((e=>z(this,void 0,void 0,(function*(){if(!(yield s(this.managers.appPeersManager.isPeerRestricted(i))))return yield s(this._setMoreDetails(i,e))}))));if(n.cached&&t)return a;(t||Promise.resolve()).then((()=>a)).then((e=>{null==e||e()}))}))}getMiddlewarePromise(){return(0,f.Z)(this.middlewareHelper.get(),(0,h.Z)("MIDDLEWARE"))}setPeer(e,t){var i;this.peerId===e&&this.threadId===t||(null===(i=this.init)||void 0===i||i.call(this),this.peerId=e,this.threadId=t,this.middlewareHelper.clean(),this.cleaned=!0)}clearSetMoreDetailsTimeout(){void 0!==this.setMoreDetailsTimeout&&(clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=void 0)}destroy(){var e;this.peerId=this.threadId=void 0,this.clearSetMoreDetailsTimeout(),clearInterval(this.setPeerStatusInterval),null===(e=this.avatars)||void 0===e||e.cleanup(),this.middlewareHelper.destroy()}}},8842:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(3512),n=i(2325),a=i(5565),o=i(1507),r=i(8456),d=i(130),l=i(5953),c=i(8115),h=i(493),u=(i(4755),i(5948));i(3541);function p(e,t,i,n,a){return o=this,r=void 0,l=function*(){const t=[],o=yield s.Z.managers.appPeersManager.getPeer(e);if(o.pFlags.verified&&!i&&t.push(function(){const e=document.createElement("span");e.classList.add("verified-icon","tgico");const t=document.createElementNS("http://www.w3.org/2000/svg","svg");t.setAttributeNS(null,"viewBox","0 0 26 26"),t.setAttributeNS(null,"width","26"),t.setAttributeNS(null,"height","26"),t.classList.add("verified-icon-svg");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#verified-icon-background"),i.classList.add("verified-icon-background");const s=document.createElementNS("http://www.w3.org/2000/svg","use");return s.setAttributeNS(null,"href","#verified-icon-check"),s.classList.add("verified-icon-check"),t.append(s,i),e.append(t),e}()),!o.pFlags.fake&&!o.pFlags.scam||n||t.push((0,u.Z)(o.pFlags.scam)),o.pFlags.premium&&!a){const e=o.emoji_status;e&&e._,t.push(function(){const e=document.createElement("span");return e.classList.add("premium-icon","tgico-star"),e}())}return t},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}var f=i(9345);const m=new WeakMap;s.Z.addEventListener("peer_title_edit",(({peerId:e,threadId:t})=>{let i=`.peer-title[data-peer-id="${e}"]`;t&&(i+=`[data-thread-id="${t}"]`),Array.from(document.querySelectorAll(i)).forEach((e=>{const t=m.get(e);null==t||t.update()}))}));class g{constructor(e){this.element=document.createElement("span"),this.element.classList.add("peer-title"),(0,d.m)(this.element),this.options={},e&&this.update(e),m.set(this.element,this)}setOptions(e){if(e){(0,l.Z)(this.options,e);for(const t in e){const i=e[t];"object"!=typeof i&&"function"!=typeof i&&(this.element.dataset[t]=i?""+("boolean"==typeof i?+i:i):"0")}}}setHasInner(e){this.hasInner!==e&&(this.hasInner=e,this.element.classList.toggle("with-icons",e))}update(e){var t,i,l,u,m,g,v,b;return m=this,g=void 0,b=function*(){this.setOptions(e);let m,g=this.options.fromName;if(void 0!==g)return void 0!==this.options.limitSymbols&&(g=(0,r.Z)(g,this.options.limitSymbols,this.options.limitSymbols)),void(0,d.Z)(this.element,(0,c.Z)(g));null!==(t=(u=this.options).peerId)&&void 0!==t||(u.peerId=o.NM);const{peerId:v,threadId:b}=this.options;if(v===s.Z.myId&&this.options.dialog)(0,a.Z)(this.element,(0,n.ag)(this.options.onlyFirstName?"Saved":"SavedMessages"));else{if(b){const[e,t]=yield Promise.all([s.Z.managers.dialogsStorage.getForumTopic(v,b),s.Z.managers.appPeersManager.isForum(v)]);if(!e&&t)return s.Z.managers.dialogsStorage.getForumTopicById(v,b).then((e=>{if(!e&&this.options.threadId===b)return this.options.threadId=void 0,void this.update({threadId:void 0});this.update()}),(()=>{this.options.threadId===b&&(this.options.threadId=void 0,this.update({threadId:void 0}))})),(0,d.Z)(this.element,(0,n.ag)("Loading")),void this.setHasInner(!1)}const e=b&&this.options.withIcons?s.Z.managers.dialogsStorage.getForumTopic(v,b).then((e=>{var t;return(0,f.e)(Object.assign(Object.assign({},null!==(t=this.options.wrapOptions)&&void 0!==t?t:{}),{topic:e}))})):void 0,[t,a,o]=yield Promise.all([(0,h.Z)(this.options),this.options.withIcons&&p(v,null===(i=this.options.wrapOptions)||void 0===i||i.middleware)||this.options.withPremiumIcon&&p(v,null===(l=this.options.wrapOptions)||void 0===l||l.middleware,!0,!0),e]);if((null==a?void 0:a.length)||o){const e=document.createElement("span");e.classList.add("peer-title-inner"),m=!0,(0,d.Z)(e,t);const i=document.createDocumentFragment();i.append(...[o,e,...null!=a?a:[]].filter(Boolean)),(0,d.Z)(this.element,i)}else(0,d.Z)(this.element,t)}this.setHasInner(m)},new((v=void 0)||(v=Promise))((function(e,t){function i(e){try{n(b.next(e))}catch(e){t(e)}}function s(e){try{n(b.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof v?n:new v((function(e){e(n)}))).then(i,s)}n((b=b.apply(m,g||[])).next())}))}}},6765:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(1168),n=i(2325),a=i(2738),o=i(8678),r=i(2312);class d extends s.Z{constructor(e={}){super("popup-avatar",{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),(0,n.$d)(this.h6,"Popup.Avatar.Title"),this.btnClose.classList.remove("btn-icon"),this.header.append(this.h6),this.cropContainer=document.createElement("div"),this.cropContainer.classList.add("crop"),this.cropContainer.append(this.image),e.isForum&&this.cropContainer.classList.add("is-forum"),this.input=document.createElement("input"),this.input.type="file",this.input.style.display="none",this.listenerSetter.add(this.input)("change",(e=>{const t=e.target.files[0];t&&(0,o.Z)(t).then((e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=function(e,t){let i,s,n,a={},o=0,r=0,d=0,l=0,c=0;function h(){e.classList.add("crop-blur"),e.draggable=!1,n=new Image,n.src=e.src,n.draggable=!1,n.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),i=document.createElement("div"),i.classList.add("crop-component"),s=document.createElement("div"),s.classList.add("crop-overlay");const a=document.createElement("div");a.classList.add("crop-overlay-color"),i.appendChild(s),e.parentNode.appendChild(i),i.appendChild(n),i.appendChild(e),i.appendChild(a),s.appendChild(n),n.style.maxWidth=e.width+"px",c=e.naturalWidth/e.offsetWidth;const o=e.offsetWidth/2-100,r=e.offsetHeight/2-100;u(200,200),p(o,r),f(o,r),s.addEventListener("mousedown",b,!1),s.addEventListener("touchstart",b,!1),s.addEventListener("wheel",v,!1),document.addEventListener("keypress",g,!1)}function u(e,t){d=e*c,l=t*c,s.style.width=e+"px",s.style.height=t+"px"}function p(e,t){r=t*c,o=e*c,n.style.top=-t+"px",n.style.left=-e+"px"}function f(e,t){s.style.top=t+"px",s.style.left=e+"px"}function m(e){e=e*Math.PI*2;let t,i,a,o,r=Math.floor(s.clientWidth+e),d=Math.floor(s.clientHeight+e),l=n.clientWidth,c=n.clientHeight;r<50||r>l||(t=s.offsetLeft-e/2,i=s.offsetTop-e/2,a=t+r,o=i+d,t<0&&(t=0),i<0&&(i=0),a>l||o>c||(u(r,r),p(t,i),f(t,i)))}function g(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":m(4);break;case"-":m(-4)}}function v(e){e.preventDefault(),m(e.deltaY>0?1:-1)}function b(e){e.preventDefault(),e.stopPropagation(),function(e){a.container_width=s.offsetWidth,a.container_height=s.offsetHeight,a.container_left=s.offsetLeft,a.container_top=s.offsetTop,a.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,a.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",w),document.addEventListener("touchmove",w),document.addEventListener("mouseup",y),document.addEventListener("touchend",y)}function y(e){e.preventDefault(),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w)}function w(e){let t,i,o,r,d={x:0,y:0};e.preventDefault(),e.stopPropagation(),d.x=e.pageX||e.touches&&e.touches[0].pageX,d.y=e.pageY||e.touches&&e.touches[0].pageY,t=d.x-(a.mouse_x-a.container_left),i=d.y-(a.mouse_y-a.container_top),o=s.offsetWidth,r=s.offsetHeight,t<0?t=0:t>n.offsetWidth-o&&(t=n.offsetWidth-o),i<0?i=0:i>n.offsetHeight-r&&(i=n.offsetHeight-r),p(t,i),f(t,i)}return e.complete?h():e.onload=h,{crop:function(){t.width=d,t.height=l,t.getContext("2d").drawImage(e,o,r,d,l,0,0,d,l)},removeHandlers:function(){s.removeEventListener("mousedown",b),s.removeEventListener("touchstart",b),s.removeEventListener("wheel",v),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w),document.removeEventListener("keypress",g),i.remove(),s.remove(),n.remove()}}}(this.image,this.canvas),this.input.value=""}}))}),!1),this.btnConfirm.className="btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1",(0,a.fc)(this.btnConfirm,(()=>{this.cropper.crop(),this.hide(),this.canvas.toBlob((e=>{this.blob=e,this.darkenCanvas(),this.resolve()}),"image/jpeg",1)}),{listenerSetter:this.listenerSetter}),this.container.append(this.cropContainer,this.btnConfirm,this.input),this.addEventListener("closeAfterTimeout",(()=>{this.cropper.removeHandlers(),this.image&&this.image.remove()}))}resolve(){this.onCrop((()=>r.Z.upload(this.blob)))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){const e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},6194:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(1168),n=i(7362),a=i(8127);class o{constructor(e,t,i,s){this.peerId=e,this.peerType=t,this.onSelect=i,this.threadId=s,this.construct()}construct(){return e=this,t=void 0,o=function*(){let{peerId:e,peerType:t,onSelect:i,threadId:o}=this;const r=yield(0,n.Z)({peerId:e,threadId:o}),d=s.Z.MANAGERS;void 0===t&&(t=yield d.appPeersManager.getDialogType(e));const l=(t,s=g&&!!t.size)=>{let n=d.appChatsManager.leave(e.toChatId());s&&(n=n.then((()=>d.appMessagesManager.flushHistory(e)))),null==i||i(n)},c=t=>{let s;if(o)s=d.appMessagesManager.flushHistory(e,!1,!0,o);else if(e.isUser())s=d.appMessagesManager.flushHistory(e,!1,g?!!t.size:void 0);else{if(!t.size)return l(t);s=d.appChatsManager.delete(e.toChatId())}null==i||i(s)};let h,u,p,f,m,g;switch(t){case"channel":(yield d.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(h="ChannelDeleteMenu",p="AreYouSureDeleteAndExitChannel",m=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:c}],g=[{text:"DeleteChannelForAll"}]):(h="LeaveChannelMenu",p="ChannelLeaveAlertWithName",f=[r],m=[{langKey:"LeaveChannel",isDanger:!0,callback:l}]);break;case"chat":h="DeleteChatUser",p="AreYouSureDeleteThisChatWithUser",f=[r],m=[{langKey:"DeleteChatUser",isDanger:!0,callback:c}],g=[{text:"DeleteMessagesOptionAlso",textArgs:[yield(0,n.Z)({peerId:e})]}];break;case"saved":h="DeleteChatUser",p="AreYouSureDeleteThisChatSavedMessages",m=[{langKey:"DeleteChatUser",isDanger:!0,callback:c}];break;case"megagroup":case"group":o?(h="DeleteTopics",u=[1],p="DeleteSelectedTopic",f=[r],m=[{langKey:"Delete",isDanger:!0,callback:c}]):(yield d.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(h="DeleteMegaMenu",p="AreYouSureDeleteAndExit",m=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:c}],g=[{text:"DeleteChat.DeleteGroupForAll"}]):(h="LeaveMegaMenu",p="AreYouSureDeleteAndExitName",f=[r],m=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>l(e,!0)}])}new a.Z("popup-delete-chat",{peerId:e,threadId:o,titleLangKey:h,titleLangArgs:u,descriptionLangKey:p,descriptionLangArgs:f,buttons:m,checkboxes:g}).show()},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{d(o.next(e))}catch(e){n(e)}}function r(e){try{d(o.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,r)}d((o=o.apply(e,t||[])).next())}));var e,t,i,o}}},5128:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(3512),n=i(1168),a=i(8127),o=i(2325),r=i(7120),d=i(2353),l=i(7362),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class h{constructor(e,t,i,s,n){this.peerId=e,this.mids=t,this.type=i,this.onConfirm=s,this.threadId=n,this.construct()}construct(){return c(this,void 0,void 0,(function*(){let{peerId:e,mids:t,type:i,onConfirm:h,threadId:u}=this;const p=yield(0,l.Z)({peerId:e,threadId:u}),f=n.Z.MANAGERS;t=t.slice();const m=(s,n)=>{h&&h(),"scheduled"===i?f.appMessagesManager.deleteScheduledMessages(e,t):f.appMessagesManager.deleteMessages(e,t,!!s.size||n)},g=[{langKey:"Delete",isDanger:!0,callback:m}],v=[];let b,y,w,S;if(1===t.length?b="DeleteSingleMessagesTitle":(b="DeleteMessagesTitle",y=[(0,o.ag)("messages",[t.length])]),w=(yield f.appPeersManager.isMegagroup(e))?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",e===s.Z.myId||"scheduled"===i);else if(e.isUser())v.push({text:"DeleteMessagesOptionAlso",textArgs:[p]});else{const i=yield f.appChatsManager.getChat(e.toChatId()),n=(0,r.Z)(i,"delete_messages");if("chat"===i._){const i=n?t.slice():yield(0,d.Z)(t,(t=>c(this,void 0,void 0,(function*(){return(yield f.appMessagesManager.getMessageByPeer(e,t)).fromId===s.Z.myId}))));i.length&&(i.length===t.length?v.push({text:"DeleteForAll"}):(v.push({text:"DeleteMessagesOption"}),w="DeleteMessagesTextGroup",S=[(0,o.ag)("messages",[i.length])]))}else g[0].callback=e=>m(e,!0)}(0,n.x)(g),new a.Z("popup-delete-chat",{peerId:e,threadId:u,titleLangKey:b,titleLangArgs:y,descriptionLangKey:w,descriptionLangArgs:S,buttons:g,checkboxes:v}).show()}))}}},4524:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(4271),n=i(3512),a=i(2796),o=i(2995);class r extends o.Z{constructor(e,t){super({peerTypes:["dialogs","contacts"],onSelect:!e&&t?t:i=>{return o=this,r=void 0,l=function*(){if(t){const e=t(i);e instanceof Promise&&(yield e)}if(i!==n.Z.myId)s.ZP.setInnerPeer({peerId:i}),s.ZP.chat.input.initMessagesForward(e);else{let t=0;for(const s in e){const n=e[s];t+=n.length,this.managers.appMessagesManager.forwardMessages(i,s.toPeerId(),n)}(0,a.bC)({langPackKey:t>0?"FwdMessagesToSavedMessages":"FwdMessageToSavedMessages"})}},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l},placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}},1168:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L,x:()=>E});var s=i(1405),n=i(5814),a=i(6385),o=i(2325),r=i(8497),d=i(8799),l=i(3699),c=i(2738),h=i(6299),u=i(3910),p=i(3241),f=i(6733),m=i(1655),g=i(3815),v=i(8805),b=i(3624),y=i(8115);const w=document.body;let S=w;const C=()=>{S=(0,f.W7)()||w,L.reAppend()};(0,f.Ms)(w,C);class L extends p.Z{constructor(e,t={}){if(super(!1),this.element=document.createElement("div"),this.container=document.createElement("div"),this.header=document.createElement("div"),this.title=document.createElement("div"),this.onEscape=()=>!0,this.hide=()=>{a.Z.backByItem(this.navigationItem)},this.element.classList.add("popup"),this.element.className="popup"+(e?" "+e:""),this.container.classList.add("popup-container","z-depth-1"),this.header.classList.add("popup-header"),(t.title||t.titleRaw)&&(this.title.classList.add("popup-title"),"string"==typeof t.title?(0,o.$d)(this.title,t.title):t.titleRaw&&this.title.append((0,y.Z)(t.titleRaw)),this.header.append(this.title)),this.middlewareHelper=(0,b.k)(),this.listenerSetter=new l.Z,this.managers=L.MANAGERS,this.confirmShortcutIsSendShortcut=t.confirmShortcutIsSendShortcut,t.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),(0,c.fc)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=t.withoutOverlay,this.withoutOverlay&&this.element.classList.add("no-overlay"),t.overlayClosable&&(0,c.fc)(this.element,(e=>{(0,r.Z)(e.target,"popup-container")||this.hide()}),{listenerSetter:this.listenerSetter}),t.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==t.withConfirm&&this.btnConfirm.append((0,o.ag)(t.withConfirm)),this.header.append(this.btnConfirm),(0,s.Z)(this.btnConfirm)),this.container.append(this.header),t.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body)),t.scrollable){const e=this.scrollable=new v.ZP(this.body);this.attachScrollableListeners(),this.body||this.container.insertBefore(e.container,this.header.nextSibling)}let i=this.btnConfirm;const n=this.buttons=t.buttons;if(null==n?void 0:n.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons");const t=n.map((e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),e.noRipple||(0,s.Z)(t),e.text?t.textContent=e.text:t.append((0,o.ag)(e.langKey,e.langArgs)),(0,c.fc)(t,(()=>{var t;null===(t=e.callback)||void 0===t||t.call(e),this.destroy()}),{listenerSetter:this.listenerSetter,once:!0}),e.element=t}));if(!i&&2===n.length){const e=n.find((e=>!e.isCancel));e&&(i=e.element)}e.append(...t),this.container.append(e)}this.btnConfirmOnEnter=i,this.element.append(this.container),L.POPUPS.push(this)}attachScrollableListeners(e){return this.scrollable.attachBorderListeners(e)}onContentUpdate(){this.scrollable&&this.scrollable.onAdditionalScroll()}show(){this.navigationItem={type:"popup",onPop:()=>this.destroy(),onEscape:this.onEscape},a.Z.pushItem(this.navigationItem),(0,d.Z)(),S.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.onContentUpdate(),this.withoutOverlay||(g.Z.isOverlayActive=!0,n.Z.checkAnimations2(!0)),setTimeout((()=>{this.element.classList.contains("active")&&this.listenerSetter.add(document.body)("keydown",(e=>{L.POPUPS[L.POPUPS.length-1]===this&&(this.confirmShortcutIsSendShortcut?(0,h.Z)(e):"Enter"===e.key)&&((0,c.tH)(this.btnConfirmOnEnter),(0,u.Z)(e))}))}),0)}destroy(){this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.middlewareHelper.destroy(),this.withoutOverlay||(g.Z.isOverlayActive=!1),a.Z.removeItem(this.navigationItem),this.navigationItem=void 0,(0,m.Z)(L.POPUPS,this),C(),setTimeout((()=>{var e;this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),null===(e=this.scrollable)||void 0===e||e.destroy(),this.withoutOverlay||n.Z.checkAnimations2(!1)}),150)}static reAppend(){this.POPUPS.forEach((e=>{const{element:t,container:i}=e,s=t.parentElement;s&&s!==S&&S!==i&&S.append(t)}))}static getPopups(e){return this.POPUPS.filter((t=>t instanceof e))}static createPopup(e,...t){return new e(...t)}}L.POPUPS=[];const E=e=>(e.find((e=>e.isCancel))||e.push({langKey:"Cancel",isCancel:!0}),e)},3186:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3035),n=i(4271),a=i(2325),o=i(3512),r=i(8127);const d={pin:{title:"LimitReached",description:"LimitReachedPinDialogs",descriptionPremium:"LimitReachedPinDialogsPremium",descriptionLocked:"LimitReachedPinDialogsLocked",icon:"limit_pin"},folders:{title:"LimitReached",description:"LimitReachedFolders",descriptionPremium:"LimitReachedFoldersPremium",descriptionLocked:"LimitReachedFoldersLocked",icon:"limit_folders"}};class l extends r.Z{constructor(e,t){super("popup-limit",{buttons:void 0===e.isPremium?[{langKey:"LimitReached.Ok",isCancel:!0}]:e.isPremium?[{langKey:"OK",isCancel:!0}]:[{langKey:"IncreaseLimit",callback:()=>{n.ZP.openPremiumBot()},noRipple:!0},{langKey:"Cancel",isCancel:!0}],descriptionLangKey:void 0===e.isPremium?t.descriptionLocked:e.isPremium?t.descriptionPremium:t.description,descriptionLangArgs:e.isPremium?[e.limitPremium]:[e.limit,e.limitPremium],titleLangKey:t.title});const i=void 0===e.isPremium;if(i)this.element.classList.add("is-locked");else if(e.isPremium)this.element.classList.add("is-premium");else{const e=this.buttons.find((e=>!e.isCancel));e.element.classList.add("popup-limit-button");const t=document.createElement("i");t.classList.add("popup-limit-button-icon","tgico-premium_double"),e.element.append(t)}const r=document.createElement("div");r.classList.add("popup-limit-line");const d=document.createElement("div");d.classList.add("popup-limit-hint");const l=document.createElement("span");if(l.classList.add("popup-limit-hint-icon","tgico-"+t.icon),d.append(l,""+(e.isPremium?e.limitPremium:e.limit)),r.append(d),!i){const t=document.createElement("div");t.classList.add("limit-line");const i=document.createElement("div");i.classList.add("limit-line-free");const s=document.createElement("div");s.classList.add("limit-line-premium"),t.append(i,s),(0,a.$d)(i,"LimitFree"),s.append((0,a.ag)("LimitPremium"),""+e.limitPremium),r.append(t)}this.container.insertBefore(r,this.description);const c=()=>{d.classList.add("active")};o.Z.settings.animationsEnabled?(0,s.d1)().then(c):c()}}function c(e){return function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))}(this,void 0,void 0,(function*(){const t=d[e],[i,s,n]=yield Promise.all([o.Z.managers.apiManager.getAppConfig(),...[!1,!0].map((t=>o.Z.managers.apiManager.getLimit(e,t)))]),a=i.premium_purchase_blocked;new l({isPremium:a?void 0:o.Z.premium,limit:s,limitPremium:n},t).show()}))}},3897:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(7298),n=i(1507),a=i(7479),o=i(8127);const r=[{value:3600,langPackKey:"ChatList.Mute.1Hour"},{value:14400,langPackKey:"ChatList.Mute.4Hours"},{value:28800,langPackKey:"ChatList.Mute.8Hours"},{value:86400,langPackKey:"ChatList.Mute.1Day"},{value:259200,langPackKey:"ChatList.Mute.3Days"},{value:-1,langPackKey:"ChatList.Mute.Forever",checked:!0}];class d extends o.Z{constructor(e,t){let i;super("popup-mute",{peerId:e,titleLangKey:"Notifications",buttons:[{langKey:"ChatList.Context.Mute",callback:()=>{this.managers.appMessagesManager.mutePeer({peerId:e,muteUntil:-1===i?n.rU:(0,s.Z)(!0)+i,threadId:t})}}],body:!0});const o=(0,a.ZC)(r,(e=>{i=+e}));this.body.append(o),this.show()}}},8127:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(9331),n=i(1168),a=i(2325),o=i(9807),r=i(130);class d extends n.Z{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),Object.assign(Object.assign({overlayClosable:!0},t),{title:!0,buttons:t.buttons&&(0,n.x)(t.buttons)})),this.className=e,t.peerId){const e=new s.Z;e.classList.add("avatar-32"),e.updateWithOptions({isDialog:!0,peerId:t.peerId,threadId:t.threadId,wrapOptions:{middleware:this.middlewareHelper.get()}}),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append((0,a.ag)(t.titleLangKey||"AppName",t.titleLangArgs)):t.title instanceof HTMLElement?this.title.append(t.title):this.title.innerText=t.title||"");const i=document.createDocumentFragment();if(t.descriptionLangKey||t.description){const e=this.description=document.createElement("p");e.classList.add("popup-description"),t.descriptionLangKey?e.append((0,a.ag)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&(0,r.Z)(e,t.description),i.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach((e=>{e.withRipple=!0;const t=new o.Z(e);e.checkboxField=t,i.append(t.label)})),t.buttons.forEach((e=>{if(e.callback){const i=e.callback;e.callback=()=>{const e=new Set;t.checkboxes.forEach((t=>{t.checkboxField.checked&&e.add(t.text)})),i(e)}}}))),this.container.insertBefore(i,this.header.nextElementSibling)}}},2995:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5432),n=i(5644),a=i(1168);class o extends a.Z{constructor(e){super("popup-forward",{closable:!0,overlayClosable:!0,body:!0,title:!0}),this.selector=new n.Z({appendTo:this.body,onChange:()=>{return t=this,i=void 0,n=function*(){const t=this.selector.getSelected(),i=t[t.length-1].toPeerId();if(e.onSelect){const t=e.onSelect(i);if(t instanceof Promise)try{yield t}catch(e){return}}this.selector=null,this.hide()},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n},peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),s.Z||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:"abitbigger",peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence,managers:this.managers}),this.scrollable=this.selector.scrollable,this.attachScrollableListeners(),this.title.append(this.selector.input)}}},1962:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(8127);class n extends s.Z{constructor(e,t,i){super("popup-delete-chat",{title:`Send Message${t.length>1?"s":""} Now`,description:t.length>1?"Send "+t.length+" messages now?":"Send message now?",buttons:[{langKey:"Send",callback:()=>{i&&i(),this.managers.appMessagesManager.sendScheduledMessages(e,t)}}]}),this.show()}}},6787:(e,t,i)=>{"use strict";i.d(t,{Z:()=>P});var s=i(1168),n=i(3541),a=i(2153),o=i(279),r=i(5814),d=i(4271),l=i(4755),c=i(2325),h=i(4494),u=i(8497),p=i(1656),f=i(2738),m=i(2796),g=i(130),v=i(8115),b=i(3163),y=i(9259),w=i(7479),S=i(5565),C=i(3512),L=i(9083),E=i(3173),I=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const M="STICKERS-POPUP";class P extends s.Z{constructor(e,t){super("popup-stickers",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.stickerSetInput=e,this.isEmojis=t,this.onStickersClick=e=>I(this,void 0,void 0,(function*(){const t=(0,u.Z)(e.target,"sticker-set-sticker");if(!t)return;const i=t.dataset.docId;(yield d.ZP.chat.input.sendMessageWithDocument(i))&&this.hide()})),this.title.append((0,c.ag)("Loading")),this.updateAdded={},E.ZP.setIgnoreMouseOut("popup",!0),this.addEventListener("close",(()=>{E.ZP.setIgnoreMouseOut("popup",!1),r.Z.setOnlyOnePlayableGroup()})),this.appendTo=this.scrollable.container,this.appendTo.classList.add("is-loading"),(0,o.y)(this.appendTo,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer");const i=(0,h.Z)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(i),this.body.append(this.stickersFooter),(0,y.Z)({listenTo:this.appendTo,listenerSetter:this.listenerSetter});const s=e=>{const t=this.sets.findIndex((t=>t.id===e.id));if(-1===t)return;this.sets[t]=e;const i=this.updateAdded[e.id];null==i||i(!!e.installed_date),this.updateButton()};this.listenerSetter.add(C.Z)("stickers_installed",s),this.listenerSetter.add(C.Z)("stickers_deleted",s),this.loadStickerSet()}createStickerSetElements(e){const t=document.createElement("div");let i,s;t.classList.add("sticker-set"),e&&(i=new w.ZP({title:(0,v.Z)(e.title),subtitle:(0,c.ag)(e.pFlags.emojis?"EmojiCount":"Stickers",[e.count]),buttonRight:!0}),s=e=>{(0,S.Z)(i.buttonRight,(0,c.ag)(e?"Stickers.SearchAdded":"Stickers.SearchAdd")),i.buttonRight.classList.toggle("active",e)},s(!!e.installed_date),t.append(i.container));const n=document.createElement("div");return n.classList.add("sticker-set-stickers"),t.append(n),{container:t,headerRow:i,updateAdded:s,itemsContainer:n}}loadStickerSet(){var e;return I(this,void 0,void 0,(function*(){const t=this.middlewareHelper.get(),i=(Array.isArray(this.stickerSetInput)?this.stickerSetInput:[this.stickerSetInput]).map((e=>this.managers.appStickersManager.getStickerSet(e)));let s=yield Promise.all(i);if(!t())return;let o=s[0];if(1===s.length&&!o)return(0,m.bC)({langPackKey:this.isEmojis?"AddEmojiNotFound":"StickerSet.DontExist"}),void this.hide();s=s.filter(Boolean),o=s[0],this.sets=s.map((e=>e.set));const d=null!==(e=this.isEmojis)&&void 0!==e?e:this.isEmojis=!!o.set.pFlags.emojis;if(!d){(0,f.fc)(this.appendTo,this.onStickersClick,{listenerSetter:this.listenerSetter});const{destroy:e}=(0,b.Z)({listenTo:this.appendTo,isStickerPack:!0,onSend:()=>this.hide()});this.addEventListener("close",e)}r.Z.setOnlyOnePlayableGroup(M);const u=new a.Z,y=[],w=s.map((e=>I(this,void 0,void 0,(function*(){const{container:i,itemsContainer:a,headerRow:o,updateAdded:r}=this.createStickerSetElements(s.length>1?e.set:void 0);let c;o&&(0,f.fc)(o.buttonRight,(()=>{this.managers.appStickersManager.toggleStickerSet(e.set)}),{listenerSetter:this.listenerSetter}),this.updateAdded[e.set.id]=r;const h=e.documents.filter((e=>"document"===(null==e?void 0:e._)));if(d){const e=(0,L.Z)({docIds:h.map((e=>e.id)),loadPromises:y,animationGroup:M,customEmojiSize:l.Z.active.esgCustomEmoji,middleware:t});Array.from(e.children).slice(1).forEach((e=>{const t=document.createElement("span");t.classList.add("super-emoji"),e.replaceWith(t),t.append(e)})),c=[e],a.classList.replace("sticker-set-stickers","super-emojis"),a.classList.add("is-emojis","not-local")}else c=yield Promise.all(h.map((e=>I(this,void 0,void 0,(function*(){const i=document.createElement("div");i.classList.add("sticker-set-sticker");const s=l.Z.active.popupSticker.width;return yield(0,n.ZP)({doc:e,div:i,lazyLoadQueue:u,group:M,play:!0,loop:!0,width:s,height:s,withLock:!0,loadPromises:y,middleware:t}),i})))));return a.append(...c.filter(Boolean)),i})))),S=yield Promise.all(w);yield Promise.all(y);const C=this.button=(0,h.Z)("",{noRipple:!0});this.updateButton(),(0,f.fc)(C,(()=>{const e=(0,p.Z)([C],!0);this.managers.appStickersManager.toggleStickerSets(s.map((e=>e.set))).then((()=>{this.hide()})).catch((()=>{e()}))}),{listenerSetter:this.listenerSetter}),1===s.length?(0,g.Z)(this.title,(0,v.Z)(o.set.title)):(0,g.Z)(this.title,(0,c.ag)("Emoji")),this.stickersFooter.textContent="",this.stickersFooter.append(C),this.appendTo.classList.remove("is-loading"),this.appendTo.textContent="",this.appendTo.append(...S),this.scrollable.onAdditionalScroll()}))}updateButton(){const{sets:e,isEmojis:t}=this;let i,s;if(1===e.length){const n=e[0];s=(0,c.ag)(t?"EmojiCount":"Stickers",[n.count]),i=!n.installed_date}else{const t=e.filter((e=>e.installed_date));let n;e.length===t.length?(i=!1,n=e.length):(i=!0,n=e.length-t.length),s=(0,c.ag)("EmojiPackCount",[n])}this.button.className=i?"btn-primary btn-color-primary":"btn-primary btn-primary-transparent danger",(0,S.Z)(this.button,(0,c.ag)(i?"AddStickersCount":"RemoveStickersCount",[s]))}}},3442:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(9099),n=i(3035),a=i(3910),o=i(2738),r=i(8487),d=i(5953);class l{constructor(e){this.tempId=0,this.detached=!0,this.promise=null,this.isUpload=!1,this.cancelable=!0,this.streamable=!1,this.tryAgainOnFail=!0,this.attachMethod="append",this.onClick=e=>{e&&(0,a.Z)(e),this.preloader.classList.contains("manual")?this.loadFunc&&this.loadFunc(e):this.promise&&this.promise.cancel&&this.promise.cancel()},e&&(0,d.Z)(this,e),this.isUpload&&(this.tryAgainOnFail=!1)}constructContainer(e={}){this.preloader||(this.preloader=document.createElement("div"),this.preloader.classList.add("preloader-container"),e.color&&this.preloader.classList.add("preloader-"+e.color),e.bold&&this.preloader.classList.add("preloader-bold"),this.streamable&&this.preloader.classList.add("preloader-streamable"))}constructDownloadIcon(){this.constructContainer()}construct(){this.construct=null,this.constructContainer(),this.preloader.innerHTML=`\n
\n \n \n \n
`,this.streamable?this.totalLength=118.61124420166016:this.totalLength=149.82473754882812,this.cancelable?(this.preloader.innerHTML+='\n \n \n \n \n \n \n \n \n \n \n \n ',this.downloadSvg=this.preloader.lastElementChild,this.cancelSvg=this.downloadSvg.previousElementSibling):this.preloader.classList.add("preloader-swing"),this.circle=this.preloader.firstElementChild.firstElementChild.firstElementChild,this.cancelable&&(0,o.fc)(this.preloader,this.onClick)}setDownloadFunction(e){this.loadFunc=e}setManual(){this.preloader.classList.add("manual"),this.setProgress(0)}attachPromise(e){if(this.isUpload&&this.promise)return;this.promise=e;const t=--this.tempId,i=Date.now(),s=s=>{if(e.notify=e.notifyAll=null,t!==this.tempId)return;const a=Date.now()-i;if(!s&&this.cancelable){this.setProgress(100);const e=150;a{t===this.tempId&&this.detach()}),e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),(0,n.T2)((()=>{this.setManual()}))):this.detach();this.promise=e=null};e.then((()=>s(null))).catch((e=>s(e))),e.addNotifyListener&&e.addNotifyListener((e=>{if(t!==this.tempId)return;const i=e.done/e.total*100;this.setProgress(i)}))}attach(e,t=!1,i){this.construct&&this.construct(),this.preloader.parentElement&&this.preloader.classList.remove("manual"),this.detached=!1,i&&this.attachPromise(i);let n=0;(this.detached||this.preloader.parentElement!==e)&&(n=(0,r.Z)(this.preloader)?1:2,this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader)),(0,s.Z)({element:this.preloader,className:"is-visible",forwards:!0,duration:200,useRafs:n}),this.cancelable&&t&&this.setProgress(0)}detach(){var e;this.detached||(this.detached=!0,(null===(e=this.preloader)||void 0===e?void 0:e.parentElement)&&(0,s.Z)({element:this.preloader,className:"is-visible",forwards:!1,duration:200,onTransitionEnd:()=>{this.preloader.remove()},useRafs:1}))}setProgress(e){if(this.totalLength||(0,r.Z)(this.circle))if(0!==e)try{this.totalLength||(this.totalLength=this.circle.getTotalLength()),this.circle.style.strokeDasharray=Math.max(5,e/100*this.totalLength)+", "+this.totalLength}catch(e){}else this.circle.style.strokeDasharray=""}}},9931:(e,t,i)=>{"use strict";i.d(t,{Z:()=>b,Y:()=>g});var s=i(4059),n=i(6740),a=i(5565),o=i(130),r=i(9674),d=i(5990),l=i(7256),c=i(1507),h=i(5798),u=i(3512),p=i(9345),f=i(319),m=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function g(e,t,i,o,d=new Image,l=!1){return m(this,void 0,void 0,(function*(){const l=yield u.Z.managers.acknowledged.appAvatarsManager.loadAvatar(t,i,o),c=l.result,h=l.cached;let p,m,v;if(d.classList.add("avatar-photo"),h)m=()=>{(0,a.Z)(e,d),e.dataset.color=""};else{const l=u.Z.settings.animationsEnabled;l&&d.classList.add("fade-in");let c=!1;if("photo_big"===o){const s=yield g(e,t,i,"photo_small");p=s.loadThumbPromise||s.loadPromise,v=s.thumbImage}else if(i.stripped_thumb){v=new Image,e.classList.add("avatar-relative"),v.classList.add("avatar-photo","avatar-photo-thumbnail");const t=(0,s.Z)(i.stripped_thumb);p=(0,n.cj)(v,t).then((()=>{c||(0,a.Z)(e,v)}))}m=()=>{c=!0,v?e.append(d):(0,a.Z)(e,d),setTimeout((()=>{e.childElementCount&&r.Z.mutateElement(d,(()=>{e.dataset.color="",l&&d.classList.remove("fade-in"),null==v||v.remove()}))}),l?200:0)}}const b=c.then((e=>(0,n.cj)(d,e))).then(m);return p&&(yield p.catch(f.Z)),{cached:h,loadPromise:b,loadThumbPromise:h?b:p||Promise.resolve(),thumbImage:v}}))}function v(e,t,i,s,n,a){(0,o.Z)(e,t),e.dataset.color=i,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled","is-forum","is-topic"),s&&e.classList.add(s),n&&e.classList.add("is-forum"),a&&e.classList.add("is-topic")}function b({div:e,peerId:t,isDialog:i=!1,title:s="",onlyThumb:n=!1,isBig:a,threadId:o,wrapOptions:r={}}){var f,b;return m(this,void 0,void 0,(function*(){const m=u.Z.myId;if(t===m&&i)return void v(e,"","","tgico-saved");const y=u.Z.managers;if(o){const i=yield y.dialogsStorage.getForumTopic(t,o);return v(e,"","",void 0,void 0,!0),r.customEmojiSize&&e.style.setProperty("--size",r.customEmojiSize.width+"px"),(0,p.e)(Object.assign(Object.assign({},r),{topic:i,lazyLoadQueue:!1})).then((t=>{e.replaceChildren(t)}))}const w=yield y.appPeersManager.getPeer(t);if(t!==c.NM&&t.isUser()&&(null===(f=null==w?void 0:w.pFlags)||void 0===f?void 0:f.deleted))return void v(e,"",(0,d.Z)(t),"tgico-deletedaccount");const S=!!(null===(b=null==w?void 0:w.pFlags)||void 0===b?void 0:b.forum),C=a?"photo_big":"photo_small",L=(0,l.Z)(w),E=!!L,I=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!E||!I||!(yield y.appAvatarsManager.isAvatarCached(t,C))){let n="";if(!t||t===m&&i||(n=(0,d.Z)(t)),t===c.hj)return void v(e,"",n,"tgico-reply_filled");const a=s?(0,h.Z)(s):function(e){var t;let i="";return e&&(i=null!==(t=e.title)&&void 0!==t?t:[e.first_name,e.last_name].filter(Boolean).join(" ")),(0,h.Z)(i)}(w);v(e,a,n,"",S)}return E?g(e,t,L,C,void 0,n):void 0}))}},279:(e,t,i)=>{"use strict";function s(e,t=!1){const i='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=i,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",i),e.lastElementChild}function n(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,s(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.d(t,{p:()=>n,y:()=>s}),i(410).GO.putPreloader=s},1218:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(9750),n=i(2325),a=i(3855),o=i(3512);class r{constructor(e){const t=this.label=document.createElement("label");t.classList.add("radio-field"),e.alignRight&&t.classList.add("radio-field-right");const i=this.input=document.createElement("input");i.type="radio",i.name="input-radio-"+e.name,e.value&&(i.value=e.value,e.stateKey&&(a.Z.getState().then((t=>{i.checked=(0,s.Z)(t,e.stateKey)===e.value})),i.addEventListener("change",(()=>{o.Z.managers.appStateManager.setByKey(e.stateKey,e.value)}))));const r=this.main=document.createElement("div");r.classList.add("radio-field-main"),e.text?r.innerHTML=e.text:e.langKey&&(0,n.$d)(r,e.langKey),t.append(i,r)}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}}},5133:(e,t,i)=>{"use strict";function s(e,t){const i=document.createElement("form");return e.forEach((e=>{const{container:s,input:n}=e;i.append(s),n.addEventListener("change",(e=>{n.checked&&t(n.value,e)}))})),i}i.d(t,{Z:()=>s})},65:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5077),n=i(3228),a=i(5953);class o{constructor(e,t=0){this.mousedown=!1,this.events={},this.withTransition=!1,this.useTransform=!1,this.vertical=!1,this.onMouseMove=e=>{this.scrub(e)},this.onMouseDown=e=>{var t;this.rect=this.container.getBoundingClientRect(),this.mousedown=!0,this.scrub(e),this.container.classList.add("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseDown)&&this.events.onMouseDown(e)},this.onMouseUp=e=>{var t;this.mousedown=!1,this.container.classList.remove("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseUp)&&this.events.onMouseUp(e)},this.onInput=()=>{var e;const t=+this.seek.value;this.setFilled(t),(null===(e=this.events)||void 0===e?void 0:e.onScrub)&&this.events.onScrub(t)},(0,a.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("progress-line"),this.useTransform?this.container.classList.add("use-transform"):this.withTransition&&this.container.classList.add("with-transition"),this.filled=document.createElement("div"),this.filled.classList.add("progress-line__filled");const i=this.seek=document.createElement("input");i.classList.add("progress-line__seek"),i.type="range",i.step=""+this.step,i.min=""+this.min,i.max=""+this.max,i.value=""+t,t&&this.setProgress(t);const s=""+this.step,n=s.indexOf(".");this.decimals=-1===n?0:s.length-n-1,this.container.append(this.filled,i)}get value(){return+this.seek.value}setHandlers(e){this.events=e}setListeners(){this.seek.addEventListener("input",this.onInput),this._removeListeners=(0,s.Z)(this.container,this.onMouseDown,this.onMouseMove,this.onMouseUp)}setProgress(e){this.seek.value=""+e,this.setFilled(+this.seek.value)}addProgress(e){this.seek.value=""+(+this.seek.value+e),this.setFilled(+this.seek.value)}setFilled(e){let t=(e-this.min)/(this.max-this.min);t=(0,n.Z)(t,0,1),this.useTransform?this.filled.style.transform=`scaleX(${t})`:this.filled.style.width=100*t+"%"}scrub(e){var t;const i=this.vertical?this.rect.height:this.rect.width,s=(0,n.Z)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,i);let a=this.min+s/i*(this.max-this.min);return a-this.min<(this.max-this.min)/2&&(a-=this.step/10),a=+a.toFixed(this.decimals),a=(0,n.Z)(a,this.min,this.max),this.setProgress(a),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(a),a}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}},1405:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(8497),n=i(9674),a=i(5432),o=i(3512),r=i(5975),d=i(3035);let l=0;function c(e,t=(()=>Promise.resolve()),i=null,c=!1,h=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");const u=document.createElement("div");let p;u.classList.add("c-ripple"),e.classList.contains("rp-square")&&u.classList.add("is-square"),e[c?"prepend":"append"](u);const f=(e,s)=>{const o=Date.now(),r=document.createElement("div"),c=l++,h=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s",""),f=p=()=>{const e=Date.now()-o,t=()=>{n.Z.mutate((()=>{r.remove()})),null==i||i(c)};if(er.classList.add("hiding")),Math.max(i-h/2,0)),setTimeout(t,i)}else r.classList.add("hiding"),setTimeout(t,h/2);a.Z||(window.removeEventListener("contextmenu",p),window.removeEventListener("mousemove",p)),p=null,g=!1};null==t||t(c),(0,d.T2)((()=>{if(f!==p)return;const t=u.getBoundingClientRect();r.classList.add("c-ripple__circle");const i=e-t.left,n=s-t.top,a=Math.sqrt(Math.pow(Math.abs(n-t.height/2)+t.height/2,2)+Math.pow(Math.abs(i-t.width/2)+t.width/2,2)),o=i-a/2,d=n-a/2;r.style.width=r.style.height=a+"px",r.style.left=o+"px",r.style.top=d+"px",u.append(r)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,s.Z)(t.target,"c-ripple")!==u)&&(h===e||!(0,r.Z)(t.target,h));let g=!1;if(a.Z){const e=()=>{null==p||p()};h.addEventListener("touchstart",(t=>{if(!o.Z.settings.animationsEnabled)return;if(t.touches.length>1||g||m(t))return;g=!0;const{clientX:i,clientY:s}=t.touches[0];f(i,s),h.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),h.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else h.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!o.Z.settings.animationsEnabled)return;if("0"===h.dataset.ripple||m(e))return;if(g)return void(g=!1);const{clientX:t,clientY:i}=e;f(t,i),window.addEventListener("mouseup",p,{once:!0,passive:!0}),window.addEventListener("contextmenu",p,{once:!0,passive:!0})}),{passive:!0})}},7479:(e,t,i)=>{"use strict";i.d(t,{De:()=>g,ZC:()=>v,ZP:()=>f,tG:()=>m});var s=i(9807),n=i(1218),a=i(1405),o=i(5133),r=i(2325),d=i(5565),l=i(130),c=i(2738),h=i(4494),u=i(4531);const p=(e,t)=>{!0===t||("string"==typeof t?(0,l.Z)(e,t):e.append(t))};class f{constructor(e={}){this.freezed=!1,e.checkboxFieldOptions&&(e.checkboxField=new s.Z(Object.assign({listenerSetter:e.listenerSetter},e.checkboxFieldOptions)));const t=e.asLink?"a":e.radioField||e.checkboxField?"label":"div";if(this.container=document.createElement(t),this.container.classList.add("row","no-subtitle"),e.noWrap&&this.container.classList.add("no-wrap"),e.subtitle){const t=this.subtitle;if(p(t,e.subtitle),e.noWrap&&t.classList.add("no-wrap"),e.subtitleRight){this.container.append(this.subtitleRow=this.createRow()),this.subtitleRow.classList.add("row-subtitle-row");const i=this.subtitleRight=document.createElement("div");i.classList.add("row-subtitle","row-subtitle-right"),p(i,e.subtitleRight),this.subtitleRow.append(t,i)}}else e.subtitleLangKey&&this.subtitle.append((0,r.ag)(e.subtitleLangKey,e.subtitleLangArgs));let i=!!e.havePadding;if(e.radioField||e.checkboxField){if(e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label),i=!0),e.checkboxField){this.checkboxField=e.checkboxField;const t=e.checkboxField.label.classList.contains("checkbox-field-toggle");if(t?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):(i=!0,this.container.append(this.checkboxField.label)),e.withCheckboxSubtitle&&!t){const t=()=>{(0,d.Z)(this.subtitle,(0,r.ag)(this.checkboxField.input.checked?"Checkbox.Enabled":"Checkbox.Disabled"))};e.listenerSetter?e.listenerSetter.add(this.checkboxField.input)("change",t):this.checkboxField.input.addEventListener("change",t)}}(e.radioField||e.checkboxField).label.classList.add("disable-hover")}if(e.title||e.titleLangKey){let t;const i=e.titleRight||e.titleRightSecondary;if(i?(this.container.append(t=this.titleRow=this.createRow()),this.titleRow.classList.add("row-title-row")):t=this.container,this.title=this.createTitle(),e.noWrap&&this.title.classList.add("no-wrap"),e.title?p(this.title,e.title):e.titleLangKey&&this.title.append((0,r.ag)(e.titleLangKey)),t.append(this.title),i){const s=this.titleRight=document.createElement("div");s.classList.add("row-title","row-title-right"),e.titleRightSecondary&&s.classList.add("row-title-right-secondary"),p(s,i),t.append(s)}}e.icon&&(i=!0,this.container.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),i&&this.container.classList.add("row-with-padding"),e.navigationTab&&(e.clickable=()=>e.navigationTab.open()),(e.clickable||e.radioField||e.checkboxField)&&("function"==typeof e.clickable&&(0,c.fc)(this.container,(t=>{this.freezed||e.clickable(t)}),{listenerSetter:e.listenerSetter}),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||(0,a.Z)(this.container,void 0,void 0,!0)),(e.buttonRight||e.buttonRightLangKey)&&(this.buttonRight=e.buttonRight instanceof HTMLElement?e.buttonRight:(0,h.Z)("btn-primary btn-color-primary",{text:e.buttonRightLangKey}),this.container.append(this.buttonRight)),e.contextMenu&&(0,u.Z)(Object.assign(Object.assign({},e.contextMenu),{listenTo:this.container,listenerSetter:e.listenerSetter}))}get subtitle(){var e;return null!==(e=this._subtitle)&&void 0!==e?e:this._subtitle=this.createSubtitle()}get midtitle(){var e;return null!==(e=this._midtitle)&&void 0!==e?e:this._midtitle=this.createMidtitle()}createRow(){const e=document.createElement("div");return e.classList.add("row-row"),e}createTitle(){const e=document.createElement("div");return e.classList.add("row-title"),(0,l.m)(e),e}createSubtitle(){const e=document.createElement("div");return e.classList.add("row-subtitle"),(0,l.m)(e),this.title?this.title.after(e):this.container.prepend(e),this.container.classList.remove("no-subtitle"),e}createMidtitle(){const e=document.createElement("div");return e.classList.add("row-midtitle"),this.subtitle.parentElement.insertBefore(e,this.subtitle),e}createMedia(e){const t=document.createElement("div");return this.applyMediaElement(t,e)}applyMediaElement(e,t){return this.container.classList.add("row-with-padding"),this.media=e,e.classList.add("row-media"),t&&e.classList.add("row-media-"+t),this.container.append(e),e}disableWithPromise(e){this.container.classList.add("is-disabled"),e.finally((()=>{this.container.classList.remove("is-disabled")}))}makeSortable(){const e=document.createElement("span");this.container.classList.add("row-sortable","tgico"),e.classList.add("row-sortable-icon","tgico-menu"),this.container.append(e)}toggleSorting(e){this.container.classList.toggle("cant-sort",!e)}}const m=e=>new f({checkboxField:e,listenerSetter:e.listenerSetter}),g=(e,t)=>(0,o.Z)(e.map((e=>({container:e.container,input:e.radioField.input}))),t),v=(e,t)=>{const i="name-"+(8388607*Math.random()|0);let s;const a=e.map((({langPackKey:e,value:t,checked:a})=>{const o=new f({radioField:new n.Z({langKey:e,name:i,value:""+t})});return a&&(s=o.radioField),o})),o=g(a,t);return s&&(s.checked=!0),o}},8805:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>l,v7:()=>c});var s=i(5432),n=i(5003),a=i(4789),o=i(8594),r=i(3910);class d{constructor(e,t="",i=document.createElement("div")){this.el=e,this.container=i,this.onScrollMeasure=0,this.lastScrollPosition=0,this.lastScrollDirection=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.cancelMeasure(),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure||(this.onScrollMeasure=window.setTimeout((()=>{this.onScrollMeasure=0;const e=this.container[this.scrollProperty];this.lastScrollDirection=this.lastScrollPosition===e?0:this.lastScrollPositionthis.container.append(e))),e.append(this.container))}addScrollListener(){this.addedScrollListener||(this.addedScrollListener=!0,this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}))}removeScrollListener(){this.addedScrollListener&&(this.addedScrollListener=!1,this.container.removeEventListener("scroll",this.onScroll,{capture:!0}))}setListeners(){this.removeHeavyAnimationListener||(window.addEventListener("resize",this.onScroll,{passive:!0}),this.addScrollListener(),this.removeHeavyAnimationListener=(0,o.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.cancelMeasure(),this.needCheckAfterAnimation=!0)}),(()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})))}removeListeners(){this.removeHeavyAnimationListener&&(window.removeEventListener("resize",this.onScroll),this.removeScrollListener(),this.removeHeavyAnimationListener(),this.removeHeavyAnimationListener=void 0)}destroy(){this.removeListeners(),this.onAdditionalScroll=void 0,this.onScrolledTop=void 0,this.onScrolledBottom=void 0}append(...e){this.container.append(...e)}scrollIntoViewNew(e){return(0,a.Z)(Object.assign(Object.assign({},e),{container:this.container}))}cancelMeasure(){this.onScrollMeasure&&(clearTimeout(this.onScrollMeasure),this.onScrollMeasure=0)}}class l extends d{constructor(e,t="",i=300,s){super(e,t),this.onScrollOffset=i,this.loadedAll={top:!0,bottom:!1},this.checkForTriggers=()=>{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const e=this.container.scrollHeight;if(!e)return;const t=e-this.container.clientHeight,i=this.lastScrollPosition;this.onScrolledTop&&i<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-i<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners(),this.scrollProperty="scrollTop"}attachBorderListeners(e=this.container){const t=this.onAdditionalScroll;this.onAdditionalScroll=()=>{null==t||t(),e.classList.toggle("scrolled-top",!this.scrollTop),e.classList.toggle("scrolled-bottom",this.isScrolledDown)},e.classList.add("scrolled-top","scrolled-bottom","scrollable-y-bordered")}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}setScrollTopSilently(e){this.lastScrollPosition=e,this.ignoreNextScrollEvent(),this.scrollTop=e}ignoreNextScrollEvent(){this.removeHeavyAnimationListener&&(this.removeScrollListener(),this.container.addEventListener("scroll",(e=>{(0,r.Z)(e),this.addScrollListener()}),{capture:!0,passive:!1,once:!0}))}get scrollHeight(){return this.container.scrollHeight}}class c extends d{constructor(e,t="",i=300,n=15,a=document.createElement("div")){if(super(e,t,a),this.onScrollOffset=i,this.splitCount=n,this.container=a,this.container.classList.add("scrollable-x"),!s.Z){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,(0,r.Z)(e))};this.container.addEventListener("wheel",e,{passive:!1})}this.scrollProperty="scrollLeft"}}},5029:(e,t,i)=>{"use strict";i.d(t,{R:()=>r,Z:()=>o});var s=i(2325),n=i(36);const a="sidebar-left-section";class o{constructor(e={}){var t;const i=this.container=document.createElement("div");i.classList.add(a+"-container");const o=this.innerContainer=document.createElement("div");if(o.classList.add(a),e.noShadow&&o.classList.add("no-shadow"),e.fakeGradientDelimiter)o.append((0,n.G)()),o.classList.add("with-fake-delimiter");else if(e.noDelimiter)o.classList.add("no-delimiter");else{const e=document.createElement("hr");o.append(e)}const r=this.content=this.generateContentElement();if(e.name){const t=this.title=document.createElement("div");t.classList.add("sidebar-left-h2",a+"-name"),(0,s.XZ)({element:t,key:e.name,args:e.nameArgs}),r.append(t)}i.append(o);const d=null!==(t=e.caption)&&void 0!==t?t:e.captionOld;if(d){const t=this.caption=this.generateContentElement();t.classList.add(a+"-caption"),e.captionOld||i.append(t),!0!==d&&(0,s.XZ)({element:t,key:d,args:e.captionArgs})}}generateContentElement(){const e=document.createElement("div");return e.classList.add(a+"-content"),this.innerContainer.append(e),e}}const r=(e,t,i)=>{const s=new o({name:t,caption:i});return e.append(s.container),s.content}},744:(e,t,i)=>{"use strict";i.d(t,{ir:()=>Gt,ZP:()=>Wt});var s=i(4271),n=i(3512),a=i(5884),o=i(9331),r=i(8805),d=i(3607),l=i(3552),c=i(426),h=i(8130),u=i(503),p=i(187),f=i(2325),m=i(8119),g=i(3061),v=i(2738),b=i(5029);class y extends l._{constructor(){super(...arguments),this.uploadAvatar=null,this.isGeoChat=!1}init(e,t=!1){this.isGeoChat=t,this.peerIds=e,this.container.classList.add("new-group-container"),this.setTitle("NewGroup"),this.avatarEdit=new p.Z((e=>{this.uploadAvatar=e}));const i=new b.Z({}),n=document.createElement("div");n.classList.add("input-wrapper"),this.groupNameInputField=new u.ZP({label:"CreateGroup.NameHolder",maxLength:128}),this.groupLocationInputField=new u.ZP({label:"ChatLocation",name:"location",canBeEdited:!1}),n.append(this.groupNameInputField.container,this.groupLocationInputField.container),this.listenerSetter.add(this.groupNameInputField.input)("input",(()=>{let e=!!this.groupNameInputField.value.length&&!this.groupNameInputField.input.classList.contains("error");this.isGeoChat&&(e=e&&!!this.userLocationCoords&&!!this.userLocationAddress),this.nextBtn.classList.toggle("is-visible",!!e)})),this.nextBtn=(0,m.Z)({icon:"arrow_next"}),(0,v.fc)(this.nextBtn,(()=>{const e=this.groupNameInputField.value;let t;if(this.isGeoChat){if(!this.userLocationAddress||!this.userLocationCoords)return;t=this.managers.appChatsManager.createChannel({title:e,about:"",geo_point:Object.assign({_:"inputGeoPoint"},this.userLocationCoords),address:this.userLocationAddress,megagroup:!0}).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),this.peerIds.length&&this.managers.appChatsManager.inviteToChannel(e,this.peerIds),e)))}else this.nextBtn.disabled=!0,t=this.managers.appChatsManager.createChat(e,this.peerIds.map((e=>e.toUserId()))).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),e)));t&&t.then((e=>{this.close(),s.ZP.setInnerPeer({peerId:e.toPeerId(!0)})}))}),{listenerSetter:this.listenerSetter});const a=new b.Z({name:"Members",nameArgs:[this.peerIds.length]}),o=this.list=h.default.createChatList({new:!0});return a.content.append(o),i.content.append(this.avatarEdit.container,n),this.content.append(this.nextBtn),this.scrollable.append(i.container,a.container),t?(this.setTitle("NearbyCreateGroup"),this.groupLocationInputField.container.classList.remove("hide"),this.groupLocationInputField.setValueSilently(f.ZP.format("Loading",!0)),this.startLocating()):this.groupLocationInputField.container.classList.add("hide"),Promise.all(this.peerIds.map((e=>{return t=this,i=void 0,n=function*(){const{dom:t}=h.default.addDialogNew({peerId:e,container:this.list,rippleEnabled:!1,avatarSize:"abitbigger"});t.lastMessageSpan.append((0,g.Z)(yield this.managers.appUsersManager.getUser(e)))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n})))}onCloseAfterTimeout(){this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.groupLocationInputField.container.classList.add("hide"),this.nextBtn.disabled=!1}startLocating(){navigator.geolocation.getCurrentPosition((e=>{this.userLocationCoords={lat:e.coords.latitude,long:e.coords.longitude};let t="https://nominatim.openstreetmap.org/reverse";t+="?lat="+e.coords.latitude,t+="&lon="+e.coords.longitude,t+="&format=json",t+="&addressdetails=1",t+="&accept-language=en",fetch(t).then((e=>e.json())).then((e=>{this.userLocationAddress=e.display_name,this.groupLocationInputField.setValueSilently(e.display_name)}))}),(e=>{e instanceof GeolocationPositionError?this.groupLocationInputField.setValueSilently("Location permission denied. Please retry later."):this.groupLocationInputField.setValueSilently("An error has occurred. Please retry later.")}))}}var w,S=i(6360),C=i(632),L=i(410),E=i(5322),I=i(4494),M=i(6024),P=i(7479),Z=i(5565),T=i(144);function k(e){const t=[],i={users:[],chats:[]},s={users:[],chats:[]};return e.forEach((e=>{switch(e._){case"privacyValueAllowAll":t.push(2);break;case"privacyValueDisallowAll":t.push(0);break;case"privacyValueAllowContacts":t.push(1);break;case"privacyValueAllowChatParticipants":i.chats.push(...e.chats);break;case"privacyValueAllowUsers":i.users.push(...e.users);break;case"privacyValueDisallowChatParticipants":s.chats.push(...e.chats);break;case"privacyValueDisallowUsers":s.users.push(...e.users)}})),{type:t[0],disallowPeers:s,allowPeers:i}}!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(w||(w={}));const x=w;var A=i(1218),_=i(5670);class F{constructor(e){this.options=e,this.onRadioChange=e=>{e=+e,this.type=e;const t=this.options.captions[this.type],i=this.radioSection.caption;t?t instanceof HTMLElement?(0,Z.Z)(i,t):(0,f.$d)(i,t):i.innerHTML="",i.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===x.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===x.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse();const t=e.managers;this.radioSection=new b.Z({name:e.title,caption:!0}),this.radioRows=new Map;let i=[{type:x.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:x.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:x.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(i=i.filter((t=>!e.skipTypes.includes(t.type))));const s=(0,T.a)();i.forEach((({type:e,langKey:t})=>{const i=new P.ZP({radioField:new A.Z({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)}));const n=(0,P.De)([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(n),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=(0,b.R)(e.appendTo,"PrivacyExceptions","PrivacySettingsController.PeerInfo");this.exceptions=new Map([["disallow",{titleLangKey:e.exceptionTexts[0],key:"disallow",row:null,icon:"deleteuser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}],["allow",{titleLangKey:e.exceptionTexts[1],key:"allow",row:null,icon:"adduser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}]]),this.exceptions.forEach((i=>{i.row=new P.ZP(i),i.row.container.addEventListener("click",(()=>{a.then((()=>{const t=this.peerIds[i.key];e.tab.slider.createTab(_.Z).open({type:"privacy",skippable:!0,title:i.titleLangKey,placeholder:"PrivacyModal.Search.Placeholder",takeOut:e=>{t.length=0,t.push(...e),i.row.subtitle.innerHTML="",i.row.subtitle.append(...this.generateStr(this.splitPeersByType(e)))},selectedPeerIds:t})}))})),t.append(i.row.container)}))}const a=t.appPrivacyManager.getPrivacy(e.inputKey).then((i=>{const s=k(i);this.setRadio(s.type),this.exceptions&&(this.peerIds={},["allow","disallow"].forEach((e=>{const t=[],i="allow"===e?s.allowPeers:s.disallowPeers;t.push(...i.users.map((e=>e.toPeerId()))),t.push(...i.chats.map((e=>e.toPeerId(!0)))),this.peerIds[e]=t;const n=this.exceptions.get(e).row.subtitle;n.innerHTML="",n.append(...this.generateStr(i))}))),e.tab.eventListener.addEventListener("destroy",(()=>{return i=this,s=void 0,a=function*(){const i=[];switch(this.type){case x.Everybody:i.push({_:"inputPrivacyValueAllowAll"});break;case x.Contacts:i.push({_:"inputPrivacyValueAllowContacts"});break;case x.Nobody:i.push({_:"inputPrivacyValueDisallowAll"})}if(this.exceptions){const e=[["allow","inputPrivacyValueAllowChatParticipants","inputPrivacyValueAllowUsers"],["disallow","inputPrivacyValueDisallowChatParticipants","inputPrivacyValueDisallowUsers"]];for(const[s,n,a]of e){if(this.exceptions.get(s).row.container.classList.contains("hide"))continue;const e=this.peerIds[s];if(e){const s=this.splitPeersByType(e);s.chats.length&&i.push({_:n,chats:s.chats}),s.users.length&&i.push({_:a,users:yield Promise.all(s.users.map((e=>t.appUsersManager.getUserInput(e))))})}}}t.appPrivacyManager.setPrivacy(e.inputKey,i)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}),{once:!0})}))}setRadio(e){const t=this.radioRows.get(e);this.onRadioChange(e),t.radioField.input.checked=!0}splitPeersByType(e){const t={users:[],chats:[]};return e.forEach((e=>{t[e.isAnyChat()?"chats":"users"].push(e.isAnyChat()?e.toChatId():e)})),t}generateStr(e){return e.users.length||e.chats.length?(0,f.v_)([e.users.length?(0,f.ag)("Users",[e.users.length]):null,e.chats.length?(0,f.ag)("Chats",[e.chats.length]):null].filter(Boolean),!1):[(0,f.ag)("PrivacySettingsController.AddUsers")]}}var D=i(3532);class R extends M.h{init(){return e=this,t=void 0,s=function*(){this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e="+"+(yield this.managers.appUsersManager.getSelf()).phone,t=document.createElement("div");t.append((0,f.ag)("PrivacyPhoneInfo"),document.createElement("br"),document.createElement("br"),(0,f.ag)("PrivacyPhoneInfo4"),document.createElement("br"),(0,D.Z)({mePath:e}));const i=new F({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:[t,t,""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{n.setRadio(x.Everybody),n.radioSection.container.classList.toggle("hide",e!==x.Nobody)},managers:this.managers}),s="PrivacyPhoneInfo3",n=new F({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:[s,s,""],noExceptions:!0,skipTypes:[x.Nobody],managers:this.managers});this.scrollable.container.insertBefore(n.radioSection.container,i.radioSection.container.nextSibling)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var B=i(8127),N=i(5772),O=i(279);class U extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new b.Z({captionOld:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({emoji:"🥳",div:t,width:160,height:160}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=(0,I.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});(0,v.fc)(n,(e=>{this.close()})),this.slider.sliceTabsUntilTab(Ct,this),s.append(n),i.append(s),this.scrollable.container.append(e.container)}}var H=i(4489),z=i(4762);function j(e){return!z.IS_MOBILE_SAFARI||!e}var G=i(1656);class V extends l._{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email-confirmation"),this.setTitle("TwoStepAuth.RecoveryTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0});(0,f.$d)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"📬"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=this.codeInputField=new H.Z({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{d(!0),this.managers.passwordManager.confirmPasswordEmail(""+e).then((e=>{r()})).catch((e=>{switch(e.type){case"CODE_INVALID":n.input.classList.add("error"),(0,Z.Z)(n.label,(0,f.ag)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":n.input.classList.add("error"),(0,Z.Z)(n.label,(0,f.ag)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}d(!1)}))}}),a=(0,I.Z)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),r=()=>{this.slider.createTab(U).open()},d=e=>{(0,G.Z)([n.input,a,o],e)};(0,v.fc)(a,(e=>{d(!0),this.managers.passwordManager.cancelPasswordEmail().then((e=>{this.slider.sliceTabsUntilTab($,this),this.close()}),(()=>{d(!1)}))})),(0,v.fc)(o,(e=>{d(!0);const t=(0,O.y)(o);this.managers.passwordManager.resendPasswordEmail().then((e=>{t.remove(),d(!1)}))})),s.append(n.container,a,o),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){j(this.isFirst)&&this.codeInputField.input.focus()}}var K=i(3910),W=i(1171);class $ extends l._{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"💌"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=this.inputField=new u.ZP({name:"recovery-email",label:"RecoveryEmail",plainText:!0});n.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,K.Z)(e),d()})),n.input.addEventListener("input",(e=>{n.input.classList.remove("error")}));const a=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),r=()=>{this.slider.createTab(U).open()},d=()=>{const e=n.value.trim(),t=(0,W.Z)(e);if(!t||t[0].length!==e.length)return void n.input.classList.add("error");l(!0);const i=(0,O.y)(a);this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then((e=>{r()}),(t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const i=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],s=this.slider.createTab(V);s.state=this.state,s.email=e,s.length=i,s.open()}else console.log("password set error",t);l(!1),i.remove()}))};(0,v.fc)(a,d);const l=e=>{e?(a.setAttribute("disabled","true"),o.setAttribute("disabled","true")):(a.removeAttribute("disabled"),o.removeAttribute("disabled"))};(0,v.fc)(o,(e=>{new B.Z("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{l(!0),(0,O.y)(o),this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then((()=>{r()}),(e=>{l(!1)}))},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()})),s.append(n.container,a,o),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){j(this.isFirst)&&this.inputField.input.focus()}}var q=i(130),Q=i(8115),Y=i(4425),X=i(6830),J=i(3083),ee=i(2796);class te extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new b.Z({noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"💡"}),e.content.append(t);const i=document.createElement("div");i.classList.add("input-wrapper");const s=this.inputField=new u.ZP({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});s.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,K.Z)(e),s.value?r():d()}));const n=(e,t)=>{e&&(0,K.Z)(e);const i=t?s.value:void 0;if(i&&this.newPassword===i)return void(0,ee.Am)(f.ZP.format("PasswordAsHintError",!0));const n=this.slider.createTab($);n.state=this.state,n.plainPassword=this.plainPassword,n.newPassword=this.newPassword,n.hint=i,n.open()},a=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),r=e=>n(e,!0),d=e=>n(e,!1);(0,v.fc)(a,r),(0,v.fc)(o,d),i.append(s.container,a,o),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class ie extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-enter-password","two-step-verification-re-enter-password"),this.setTitle("PleaseReEnterPassword");const e=new b.Z({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const i=this.passwordInputField=new X.Z({name:"re-enter-password",label:"PleaseReEnterPassword"}),s=new J.Z(i,157),n=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"});t.append(i.container,n),e.content.append(s.container,t),this.scrollable.container.append(e.container),i.input.addEventListener("keypress",(e=>{if(i.input.classList.contains("error")&&i.setState(u.I1.Neutral),"Enter"===e.key)return o()}));const a=()=>this.newPassword===i.value||(i.setError(),!1),o=e=>{if(e&&(0,K.Z)(e),!a())return;const t=this.slider.createTab(te);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return(0,v.fc)(n,o),s.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class se extends l._{constructor(){super(...arguments),this.isFirst=!0}init(){const e=!this.state.pFlags.has_password||this.plainPassword;this.container.classList.add("two-step-verification","two-step-verification-enter-password"),this.setTitle(e?"PleaseEnterFirstPassword":"PleaseEnterCurrentPassword");const t=new b.Z({noDelimiter:!0}),i=document.createElement("div");i.classList.add("input-wrapper");const s=this.passwordInputField=new X.Z({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?(0,Q.Z)(this.state.hint):void 0}),n=new Y.Z(s,157),a=(0,I.Z)("btn-primary btn-color-primary"),o=new f.ZP.IntlElement({key:"Continue"});a.append(o.element),i.append(s.container,a),t.content.append(n.container,i),this.scrollable.container.append(t.container),s.input.addEventListener("keypress",(e=>{if(s.input.classList.contains("error")&&(s.input.classList.remove("error"),o.key="Continue",o.update()),"Enter"===e.key)return d()}));const r=()=>!!s.value.length||(s.input.classList.add("error"),!1);let d;if(e)d=e=>{if(e&&(0,K.Z)(e),!r())return;const t=this.slider.createTab(ie);t.state=this.state,t.newPassword=s.value,t.plainPassword=this.plainPassword,t.open()};else{let e;const t=()=>(e||(e=window.setInterval(t,1e4)),this.managers.passwordManager.getState().then((e=>{this.state=e,this.state.hint?(0,q.Z)(s.label,(0,Q.Z)(this.state.hint)):(0,Z.Z)(s.label,(0,f.ag)("LoginPassword"))})));d=i=>{if(!r())return void(0,K.Z)(i);a.setAttribute("disabled","true"),o.key="PleaseWait",o.update();const d=(0,O.y)(a),l=s.value;this.managers.passwordManager.check(s.value,this.state).then((t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),n&&n.remove();const t=this.slider.createTab(ne);t.state=this.state,t.plainPassword=l,t.open(),this.slider.removeTabFromHistory(this)}}),(e=>{a.removeAttribute("disabled"),s.input.classList.add("error"),e.type,o.key="PASSWORD_HASH_INVALID",o.update(),d.remove(),s.select(),t()}))},t()}return(0,v.fc)(a,d),n.load()}onOpenAfterTimeout(){j(this.isFirst)&&this.passwordInputField.input.focus()}}class ne extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:168,height:168,emoji:"🔐"}),e.content.append(t);const i=e.generateContentElement();if(this.state.pFlags.has_password){(0,f.$d)(e.caption,"TwoStepAuth.GenericHelp");const t=(0,I.Z)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=(0,I.Z)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),n=(0,I.Z)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});(0,v.fc)(t,(()=>{const e=this.slider.createTab(se);e.state=this.state,e.plainPassword=this.plainPassword,e.open()})),(0,v.fc)(s,(()=>{new B.Z("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{this.managers.passwordManager.updateSettings({currentPassword:this.plainPassword}).then((()=>{this.slider.sliceTabsUntilTab(Ct,this),this.close()}))},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()})),(0,v.fc)(n,(()=>{const e=this.slider.createTab($);e.state=this.state,e.hint=this.state.hint,e.plainPassword=this.plainPassword,e.newPassword=this.plainPassword,e.isFirst=!0,e.open()})),i.append(t,s,n)}else{(0,f.$d)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=(0,I.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),(0,v.fc)(s,(e=>{const t=this.slider.createTab(se);t.state=this.state,t.open()}))}this.scrollable.container.append(e.container)}}class ae extends M.h{init(){this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new F({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,managers:this.managers})}}class oe extends M.h{init(){this.container.classList.add("privacy-tab","privacy-profile-photo"),this.setTitle("PrivacyProfilePhoto");const e="PrivacySettingsController.ProfilePhoto.CustomHelp";new F({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[x.Nobody],managers:this.managers})}}class re extends M.h{init(){this.container.classList.add("privacy-tab","privacy-forward-messages"),this.setTitle("PrivacySettings.Forwards");const e="PrivacySettingsController.Forwards.CustomHelp";new F({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}class de extends M.h{init(){this.container.classList.add("privacy-tab","privacy-add-to-groups"),this.setTitle("PrivacySettings.Groups");const e="PrivacySettingsController.GroupDescription";new F({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[x.Nobody],managers:this.managers})}}class le extends M.h{init(){this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new F({tab:this,title:"WhoCanCallMe",inputKey:"inputPrivacyKeyPhoneCall",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers});{const e="PrivacySettingsController.P2p.Desc";new F({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}}var ce=i(3003),he=i(8497),ue=i(4064),pe=i(6976),fe=i(1483),me=i(3416);class ge extends M.h{init(){this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new P.ZP({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:(0,C.zM)(new Date(1e3*Math.max(e.date_active,e.date_created)))});return t.container.dataset.hash=""+e.hash,t.midtitle.textContent=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t},t=this.authorizations.slice();{const n=new b.Z({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),a=(0,ue.Z)(t,(e=>e.pFlags.current)),o=e(a);if(n.content.append(o.container),t.length){const e=(0,I.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});(0,v.fc)(e,(t=>{new B.Z("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=(0,G.Z)([e],!0);this.managers.apiManager.invokeApi("auth.resetAuthorizations").then((t=>{e.remove(),i.container.remove()}),s).finally((()=>{t()}))}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()}),{listenerSetter:this.listenerSetter}),n.content.append(e)}this.scrollable.append(n.container)}if(!t.length)return;const i=new b.Z({name:"OtherSessions",caption:"SessionsListInfo"});t.forEach((t=>{i.content.append(e(t).container)})),this.scrollable.append(i.container);const s=e=>{"FRESH_RESET_AUTHORISATION_FORBIDDEN"===e.type&&(0,ee.Am)(f.ZP.format("RecentSessions.Error.FreshReset",!0))};let n;const a=()=>{const e=n.dataset.hash;new B.Z("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{this.managers.apiManager.invokeApi("account.resetAuthorization",{hash:e}).then((e=>{e&&n.remove()}),s)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},o=this.menuElement=(0,ce.b)({buttons:[{icon:"stop",text:"Terminate",onClick:a}]});o.id="active-sessions-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),(0,pe.E)({element:this.scrollable.container,callback:e=>{n=(0,he.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,fe.Z)(e,o),me.Z.openBtnMenu(o))},listenerSetter:this.listenerSetter}),(0,v.fc)(this.scrollable.container,(e=>{n=(0,he.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&a()}),{listenerSetter:this.listenerSetter})}onCloseAfterTimeout(){var e;return null===(e=this.menuElement)||void 0===e||e.remove(),super.onCloseAfterTimeout()}}var ve=i(2995),be=i(4668),ye=i(8210),we=i(5102);class Se extends l._{init(){this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");const e=new b.Z({caption:"BlockedUsersInfo"});e.caption.parentElement.prepend(e.caption),this.scrollable.append(e.container);const t=(0,m.Z)({icon:"add",className:"is-visible"});this.content.append(t),(0,v.fc)(t,(e=>{new ve.Z({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{this.managers.appUsersManager.toggleBlock(e,!0)}})}),{listenerSetter:this.listenerSetter});const i=h.default.createChatList();this.scrollable.container.classList.add("chatlist-container"),e.content.append(i);const s=(e,t)=>{return s=this,n=void 0,o=function*(){const{dom:s}=h.default.addDialogNew({peerId:e,container:i,rippleEnabled:!0,avatarSize:"abitbigger",append:t}),n=yield this.managers.appUsersManager.getUser(e.toUserId());if(!n)return;const a=(0,we.Z)(n)[0];n.pFlags.bot?s.lastMessageSpan.append("@"+a):n.phone?s.lastMessageSpan.innerHTML=(0,ye.Z)(n.phone):s.lastMessageSpan.append(a?"@"+a:(0,g.Z)(n))},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}d((o=o.apply(s,n||[])).next())}));var s,n,a,o};for(const e of this.peerIds)s(e,!0);let a;const o=this.menuElement=(0,ce.b)({buttons:[{icon:"lockoff",text:"Unblock",onClick:()=>{const e=a.dataset.peerId.toPeerId();this.managers.appUsersManager.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]});o.id="blocked-users-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),(0,pe.E)({element:this.scrollable.container,callback:e=>{a=(0,be.Z)(e.target,h.DIALOG_LIST_ELEMENT_TAG),a&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,fe.Z)(e,o),me.Z.openBtnMenu(o))},listenerSetter:this.listenerSetter}),this.listenerSetter.add(n.Z)("peer_block",(e=>{const{peerId:t,blocked:n}=e,a=i.querySelector(`[data-peer-id="${t}"]`);n?a||s(t,!1):a&&a.remove()}));let r=!1;this.scrollable.onScrolledBottom=()=>{r||(r=!0,this.managers.appUsersManager.getBlocked(i.childElementCount,50).then((e=>{for(const t of e.peerIds)s(t,!0);(e.peerIds.length<50||i.childElementCount===e.count)&&(this.scrollable.onScrolledBottom=null),this.scrollable.checkForTriggers()})).finally((()=>{r=!1})))}}onOpenAfterTimeout(){this.scrollable.onScroll()}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}var Ce=i(9807);function Le(e){return"input"+(e[0].toUpperCase()+e.slice(1))}var Ee=i(5592),Ie=i(319);class Me extends M.h{init(){this.container.classList.add("privacy-tab","privacy-voices"),this.setTitle("PrivacyVoiceMessages");const e="PrivacyVoiceMessagesInfo";new F({tab:this,title:"PrivacyVoiceMessagesTitle",inputKey:"inputPrivacyKeyVoiceMessages",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}var Pe=i(7362),Ze=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Te extends M.h{init(e){return Ze(this,void 0,void 0,(function*(){this.container.classList.add("active-sessions-container"),this.setTitle("WebSessionsTitle");const t=e=>Ze(this,void 0,void 0,(function*(){const t=e.bot_id.toPeerId(),i=new P.ZP({title:yield(0,Pe.Z)({peerId:t}),subtitle:[e.ip,e.region].join(" - "),clickable:!0,titleRight:(0,C.zM)(new Date(1e3*Math.max(e.date_active,e.date_created)))}),s=i.createMedia("big"),n=new o.Z;return n.classList.add("avatar-48"),yield n.updateWithOptions({peerId:t}),s.append(n),i.container.dataset.hash=""+e.hash,i.container.dataset.peerId=""+t,i.midtitle.textContent=[e.domain,e.browser,e.platform].filter(Boolean).join(", "),i}));{const e=new b.Z({caption:"ClearOtherWebSessionsHelp"}),t=(0,I.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllWebSessions"});(0,v.fc)(t,(()=>Ze(this,void 0,void 0,(function*(){yield(0,Ee.Z)({descriptionLangKey:"AreYouSureWebSessions",button:{langKey:"Disconnect",isDanger:!0}}),(0,G.Z)([t],!0),this.managers.appSeamlessLoginManager.resetWebAuthorizations().then((()=>{this.close()}))}))),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}{const i=new b.Z({name:"OtherWebSessions",caption:"TerminateWebSessionInfo"}),s=yield Promise.all(e.map(t));i.content.append(...s.map((e=>e.container)));let n=s.length;(0,v.fc)(i.content,(e=>Ze(this,void 0,void 0,(function*(){const t=(0,he.Z)(e.target,"row");if(!t)return;yield(0,Ee.Z)({descriptionLangKey:"TerminateWebSessionText",descriptionLangArgs:[yield(0,Pe.Z)({peerId:t.dataset.peerId.toPeerId()})],button:{langKey:"Disconnect",isDanger:!0}});const i=t.dataset.hash;t.classList.add("is-disabled"),this.managers.appSeamlessLoginManager.resetWebAuthorization(i).then((()=>{--n?t.remove():this.close()}))}))),{listenerSetter:this.listenerSetter}),this.scrollable.append(i.container)}}))}}class ke extends M.h{static getInitArgs(e){return{appConfig:e.managers.apiManager.getAppConfig(),globalPrivacy:e.managers.appPrivacyManager.getGlobalPrivacySettings(),contentSettings:e.managers.apiManager.invokeApi("account.getContentSettings"),webAuthorizations:e.managers.appSeamlessLoginManager.getWebAuthorizations()}}init(e){this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");const t="Loading",i=[];{const s=new b.Z({noDelimiter:!0,caption:"SessionsInfo"});let a;const o=new P.ZP({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(Se);e.peerIds=a,e.open()},listenerSetter:this.listenerSetter});let r;o.freezed=!0;const d={icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:t,clickable:e=>{let t;r.pFlags.has_password?t=this.slider.createTab(se):r.email_unconfirmed_pattern?(t=this.slider.createTab(V),t.email=r.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,this.managers.passwordManager.resendPasswordEmail()):t=this.slider.createTab(ne),t.state=r,t.open()},listenerSetter:this.listenerSetter},l=new P.ZP(d);l.freezed=!0;const c=this.activeSessionsRow=new P.ZP({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(ge);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.updateActiveSessions()}),{once:!0}),e.open()},listenerSetter:this.listenerSetter});c.freezed=!0;const h=this.websitesRow=new P.ZP({icon:"mention",titleLangKey:"OtherWebSessions",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(Te);e.eventListener.addEventListener("destroy",(()=>{this.updateActiveWebsites()})),e.open(this.websites)},listenerSetter:this.listenerSetter});h.freezed=!0,s.content.append(o.container,l.container,c.container,h.container),this.scrollable.append(s.container);const u=e=>{e?(0,Z.Z)(o.subtitle,(0,f.ag)("PrivacySettingsController.UserCount",[e])):(0,Z.Z)(o.subtitle,(0,f.ag)("BlockedEmpty",[e]))};this.listenerSetter.add(n.Z)("peer_block",(()=>{p()}));const p=()=>{this.managers.appUsersManager.getBlocked().then((e=>{o.freezed=!1,u(e.count),a=e.peerIds}))};p(),this.managers.passwordManager.getState().then((e=>{r=e,(0,Z.Z)(l.subtitle,(0,f.ag)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),l.freezed=!1})),this.updateActiveSessions(),i.push(this.updateActiveWebsites(e.webAuthorizations))}{const e=new b.Z({name:"PrivacyTitle",caption:"GroupsAndChannelsHelp"});e.content.classList.add("privacy-navigation-container");const i={},s=i.inputPrivacyKeyPhoneNumber=new P.ZP({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(R).open()},listenerSetter:this.listenerSetter}),a=i.inputPrivacyKeyStatusTimestamp=new P.ZP({titleLangKey:"LastSeenTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(ae).open()},listenerSetter:this.listenerSetter}),o=i.inputPrivacyKeyProfilePhoto=new P.ZP({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(oe).open()},listenerSetter:this.listenerSetter}),r=i.inputPrivacyKeyPhoneCall=new P.ZP({titleLangKey:"WhoCanCallMe",subtitleLangKey:t,clickable:()=>{this.slider.createTab(le).open()},listenerSetter:this.listenerSetter}),d=i.inputPrivacyKeyForwards=new P.ZP({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(re).open()},listenerSetter:this.listenerSetter}),l=i.inputPrivacyKeyChatInvite=new P.ZP({titleLangKey:"WhoCanAddMe",subtitleLangKey:t,clickable:()=>{this.slider.createTab(de).open()},listenerSetter:this.listenerSetter}),c=i.inputPrivacyKeyVoiceMessages=new P.ZP({titleLangKey:"PrivacyVoiceMessagesTitle",subtitleLangKey:t,clickable:()=>{n.Z.premium?this.slider.createTab(Me).open():(0,ee.bC)({langPackKey:"PrivacyVoiceMessagesPremiumOnly"})},listenerSetter:this.listenerSetter}),h=e=>{const t=i[e];t&&this.managers.appPrivacyManager.getPrivacy(e).then((e=>{const i=k(e),s=i.type===x.Everybody?"PrivacySettingsController.Everbody":i.type===x.Contacts?"PrivacySettingsController.MyContacts":"PrivacySettingsController.Nobody",n=i.disallowPeers.users.length+i.disallowPeers.chats.length,a=i.allowPeers.users.length+i.allowPeers.chats.length;t.subtitle.innerHTML="";const o=(0,f.ag)(s);t.subtitle.append(o),(n||a)&&t.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)}))};e.content.append(s.container,a.container,o.container,r.container,d.container,l.container,c.container),this.scrollable.append(e.container);for(const e in i)h(e);n.Z.addEventListener("privacy_update",(e=>{h(Le(e.key._))}))}{const t=new b.Z({name:"NewChatsFromNonContacts",caption:"ArchiveAndMuteInfo"}),s=new Ce.Z({text:"ArchiveAndMute"}),a=new P.ZP({checkboxField:s});let o,r;t.content.append(a.container),this.eventListener.addEventListener("destroy",(()=>{if(r=!0,void 0!==o&&o!==s.checked)return this.managers.appPrivacyManager.setGlobalPrivacySettings({_:"globalPrivacySettings",archive_and_mute_new_noncontact_peers:s.checked})}),{once:!0});const d=Promise.all([e.appConfig,e.globalPrivacy]).then((([e,i])=>{if(r)return;const a=i=>{t.container.classList.toggle("hide",!i&&!e.autoarchive_setting_available)};this.listenerSetter.add(n.Z)("premium_toggle",a),a(n.Z.premium),o=!!i.archive_and_mute_new_noncontact_peers,s.setValueSilently(o)}));i.push(d),this.scrollable.append(t.container)}{const t=new b.Z({name:"Privacy.SensitiveContent",caption:"PrivacyAndSecurity.SensitiveDesc"});t.container.classList.add("hide");const s=new Ce.Z({text:"PrivacyAndSecurity.SensitiveText"}),n=new P.ZP({checkboxField:s});let a;t.content.append(n.container),this.eventListener.addEventListener("destroy",(()=>{if(void 0===a)return;const e=n.checkboxField.checked;return e!==a?this.managers.apiManager.invokeApi("account.setContentSettings",{sensitive_enabled:e}):void 0}),{once:!0});const o=e.contentSettings.then((e=>{e.pFlags.sensitive_can_change&&(a=!!e.pFlags.sensitive_enabled,s.setValueSilently(a),t.container.classList.remove("hide"))}));i.push(o),this.scrollable.append(t.container)}{const e=new b.Z({name:"PrivacyPayments",caption:"PrivacyPaymentsClearInfo"}),t=()=>{const e={titleLangKey:"PrivacyPaymentsClearAlertTitle",descriptionLangKey:"PrivacyPaymentsClearAlertText",button:{langKey:"Clear"},checkboxes:[{text:"PrivacyClearShipping",checked:!0},{text:"PrivacyClearPayment",checked:!0}]};(0,Ee.Z)(e).then((()=>{const[t,s]=e.checkboxes.map((e=>e.checkboxField.checked)),n=(0,G.Z)([i],!0);this.managers.appPaymentsManager.clearSavedInfo(t,s).then((()=>{(t||s)&&(n(),(0,ee.bC)({langPackKey:t&&s?"PrivacyPaymentsPaymentShippingCleared":t?"PrivacyPaymentsShippingInfoCleared":"PrivacyPaymentsPaymentInfoCleared"}))}))}),Ie.Z)},i=(0,I.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyPaymentsClear"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}{const e=new b.Z({name:"FilterChats"}),t=()=>{new B.Z("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=(0,G.Z)([i],!0);this.managers.appDraftsManager.clearAllDrafts().then((()=>{e()}))},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},i=(0,I.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyDeleteCloudDrafts"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}return Promise.all(i)}updateActiveSessions(){return this.managers.apiManager.invokeApi("account.getAuthorizations").then((e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,(0,f.$d)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])}))}updateActiveWebsites(e=this.managers.appSeamlessLoginManager.getWebAuthorizations()){return e.then((e=>{this.websitesRow.freezed=!1,this.websites=e,(0,f.$d)(this.websitesRow.subtitle,"Privacy.Websites",[this.websites.length]),this.websitesRow.container.classList.toggle("hide",!this.websites.length)}))}}var xe=i(65),Ae=i(9439),_e=i(8938),Fe=i(2153),De=i(6787),Re=i(6761);var Be=i(3731),Ne=i(62);class Oe extends M.Z{init(){return this.setTitle("DoubleTapSetting"),this.container.classList.add("quick-reaction-container"),Promise.all([this.managers.appReactionsManager.getQuickReaction(),this.managers.appReactionsManager.getAvailableReactions()]).then((([e,t])=>{t=t.filter((e=>!e.pFlags.inactive));const i=new b.Z,s=t.map((t=>{const i=new A.Z({name:"quick-reaction",text:t.title,value:t.reaction,alignRight:!0}),s=new P.ZP({radioField:i,havePadding:!0});return i.main.classList.add("quick-reaction-title"),(0,Ne.Z)({row:s,doc:t.static_icon,size:"small"}),t.reaction===e.reaction&&i.setValueSilently(!0),s})),n=(0,P.De)(s,(e=>{this.managers.appReactionsManager.setDefaultReaction({_:"reactionEmoji",emoticon:e})}));i.content.append(n),this.scrollable.append(i.container)}))}}var Ue=i(236),He=i(1273),ze=i(6714),je=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ge{constructor(e,t,i,s,n,a=!0){const o="range-setting-selector";this.container=document.createElement("div"),this.container.classList.add(o);const r=document.createElement("div");r.classList.add(o+"-details");const d=document.createElement("div");d.classList.add(o+"-name"),(0,f.$d)(d,e);const l=this.valueContainer=document.createElement("div");l.classList.add(o+"-value"),a&&(l.innerHTML=""+i),r.append(d,l),this.range=new xe.Z({step:t,min:s,max:n},i),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),a&&(l.innerText=""+e)}}),this.container.append(r,this.range.container)}}class Ve extends M.h{static getInitArgs(){return{themes:n.Z.managers.appThemesManager.getThemes(),allStickers:n.Z.managers.appStickersManager.getAllStickers(),quickReaction:n.Z.managers.appReactionsManager.getQuickReaction()}}init(e){this.container.classList.add("general-settings-container"),this.setTitle("General");const t=b.R.bind(null,this.scrollable),i=[];{const e=t("Settings"),i=new Ge("TextSize",1,n.Z.settings.messagesTextSize,12,20);i.onChange=e=>{n.Z.managers.appStateManager.setByKey("settings.messagesTextSize",e)};const s=(0,I.Z)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"}),a=Ae.Z.getInitArgs();(0,v.fc)(s,(()=>{this.slider.createTab(Ae.Z).open(a)}));const o=new Ce.Z({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",listenerSetter:this.listenerSetter});e.append(i.container,s,(0,P.tG)(o).container)}{const s=t("ColorTheme"),a=new r.v7(null),o=a.container;o.classList.add("themes-container");const d=new Map;let l;(0,v.fc)(o,(e=>je(this,void 0,void 0,(function*(){const t=(0,he.Z)(e.target,"theme-container");if(!t)return;const i=o.querySelector(".active");i&&i.classList.remove("active");const s=d.get(t);if(t.classList.add("active"),yield ze.Z.applyNewTheme(s.theme),null==l||l(-1),s.player&&n.Z.settings.animationsEnabled){s.player.paused&&s.player.stop(!0);const e="translateX(-50%) ";s.player.el[0].style.transform=e+"scale(2)";const t=l=e=>{s.player.maxFrame!==e&&-1!==e||(s.player.el[0].style.transform="",s.player.removeEventListener("enterFrame",t),l===t&&(l=void 0))};setTimeout((()=>{l===t&&(s.player.play(),s.player.addEventListener("enterFrame",t))}),250)}}))),{listenerSetter:this.listenerSetter});const c=e.themes.then((e=>je(this,void 0,void 0,(function*(){const t=ze.Z.getTheme(),i=ze.Z.isNight(),s=e.filter((e=>e.pFlags.default));s.unshift(Ue.t);const o=s.map((e=>je(this,void 0,void 0,(function*(){const s=i?"baseThemeNight":"baseThemeClassic",a=e.settings.find((e=>e.base_theme._===s)).wallpaper,o=Ae.Z.addWallPaper(a),r=o.container,l={theme:e};d.set(r,l),ze.Z.applyTheme(e,r),e.id===t.id&&r.classList.add("active");const c=[];let h;if(e.emoticon){h=document.createElement("div"),h.classList.add("theme-emoticon");const t=49;(0,N.Z)({div:h,width:t,height:t,emoji:e.emoticon,managers:this.managers,loadPromises:c,middleware:this.middlewareHelper.get(),play:n.Z.settings.animationsEnabled}).then((({render:e})=>e)).then((e=>{l.player=e}))}const u=document.createElement("div");u.classList.add("theme-bubble");const p=u.cloneNode();return p.classList.add("is-in"),u.classList.add("is-out"),c.push(o.loadPromise),r.classList.add("theme-container"),yield Promise.all(c),h&&r.append(h),r.append(p,u),r})))),r=yield Promise.all(o);a.append(...r)}))));i.push(c),s.append(o)}{const e=t("General.Keyboard"),i=document.createElement("form"),s="send-shortcut",n="settings.sendShortcut",a=new P.ZP({radioField:new A.Z({langKey:"General.SendShortcut.Enter",name:s,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new P.ZP({radioField:new A.Z({name:s,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});(0,f.$d)(o.radioField.main,"General.SendShortcut.CtrlEnter",[z.IS_APPLE?"⌘":"Ctrl"]),i.append(a.container,o.container),e.append(i)}if(Be.Z){const e=t("DistanceUnitsTitle"),i=document.createElement("form"),s="distance-unit",n="settings.distanceUnit",a=new P.ZP({radioField:new A.Z({langKey:"DistanceUnitsKilometers",name:s,value:"kilometers",stateKey:n})}),o=new P.ZP({radioField:new A.Z({langKey:"DistanceUnitsMiles",name:s,value:"miles",stateKey:n})});i.append(a.container,o.container),e.append(i)}{const e=t("General.TimeFormat"),i=document.createElement("form"),s="time-format",n="settings.timeFormat",a=[["h12","General.TimeFormat.h12"],["h23","General.TimeFormat.h23"]],o=a.map((([e,t])=>new P.ZP({radioField:new A.Z({langKey:t,name:s,value:e,stateKey:n})}))),r=function(e,t=!0){return function(e,t,i=!0){const s=e;let n;return i||(e=Ie.Z),function i(){e(),n=Re.Z.setTimeout(i,t())}(),e=s,()=>{clearTimeout(n)}}(e,(()=>1e3*(60-(new Date).getSeconds())),t)}((()=>{const e=new Date;a.forEach((([t],i)=>{const s=e.toLocaleTimeString("en-us-u-hc-"+t,{hour:"2-digit",minute:"2-digit"});o[i].subtitle.textContent=s}))}));this.eventListener.addEventListener("destroy",r),i.append(...o.map((e=>e.container))),e.append(i)}{const e=t("Emoji"),i=new Ce.Z({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",listenerSetter:this.listenerSetter}),s=new Ce.Z({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",listenerSetter:this.listenerSetter});e.append((0,P.tG)(i).container,(0,P.tG)(s).container)}{const t=new b.Z({name:"Telegram.InstalledStickerPacksController",caption:"StickersBotInfo"}),s=new P.ZP({titleLangKey:"DoubleTapSetting",havePadding:!0,clickable:()=>{this.slider.createTab(Oe).open()},listenerSetter:this.listenerSetter}),a=()=>{e.quickReaction.then((e=>"availableReaction"===e._?e.static_icon:this.managers.appEmojiManager.getCustomEmojiDocument(e.document_id))).then((e=>{(0,Ne.Z)({row:s,doc:e,size:"small"})}))};a(),this.listenerSetter.add(n.Z)("quick_reaction",a);const o=new Ce.Z({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",listenerSetter:this.listenerSetter}),r=new Ce.Z({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",listenerSetter:this.listenerSetter}),d={},l=t.generateContentElement(),c=new Fe.Z,h=(e,t="append")=>{const i=new P.ZP({title:(0,Q.Z)(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new De.Z({id:e.id,access_hash:e.access_hash}).show()},listenerSetter:this.listenerSetter});d[e.id]=i;const s=document.createElement("div");s.classList.add("row-media"),(0,He.Z)({set:e,container:s,group:"GENERAL-SETTINGS",lazyLoadQueue:c,width:36,height:36,autoplay:!0,middleware:this.middlewareHelper.get()}),i.container.append(s),l[t](i.container)},u=e.allStickers.then((e=>{(0,_e.Z)(e);const t=e.sets.map((e=>h(e)));return Promise.all(t)}));i.push(u),this.listenerSetter.add(n.Z)("stickers_installed",(e=>{d[e.id]||h(e,"prepend")})),this.listenerSetter.add(n.Z)("stickers_deleted",(e=>{d[e.id]&&(d[e.id].container.remove(),delete d[e.id])})),t.content.append(s.container,(0,P.tG)(o).container,(0,P.tG)(r).container),this.scrollable.append(t.container)}return Promise.all(i)}}var Ke=i(2010),We=i(1447),$e=i(534),qe=i(4484),Qe=i(1507),Ye=i(2914),Xe=i(2648),Je=i(1655),et=i(3186),tt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class it extends l._{constructor(){super(...arguments),this.filtersRendered={}}static getInitArgs(){return{animationData:We.Z.loadAnimationFromURLManually("Folders_1"),filters:n.Z.managers.filtersStorage.getDialogFilters()}}renderFolder(e,t,i,s){return tt(this,void 0,void 0,(function*(){let n,a="";const o=[];if("dialogFilterSuggested"===e._)n=e.filter,a=e.description;else{if(n=e,1===Object.keys(n.pFlags).length){const e=n.pFlags;let t;e.contacts?t="FilterAllContacts":e.non_contacts?t="FilterAllNonContacts":e.groups?t="FilterAllGroups":e.broadcasts?t="FilterAllChannels":e.bots&&(t="FilterAllBots"),t&&o.push((0,f.ag)(t))}if(!o.length){const e=yield this.managers.dialogsStorage.getFolderDialogs(n.id);let t=0,i=0,s=0;yield Promise.all(e.map((e=>tt(this,void 0,void 0,(function*(){(yield this.managers.appPeersManager.isAnyGroup(e.peerId))?s++:(yield this.managers.appPeersManager.isBroadcast(e.peerId))?i++:t++}))))),t&&o.push((0,f.ag)("Chats",[t])),i&&o.push((0,f.ag)("Channels",[i])),s&&o.push((0,f.ag)("Groups",[s]))}}if(i)n.id!==Qe.J$&&(0,Z.Z)(i.title,(0,Q.Z)(n.title)),i.subtitle.textContent="",i.subtitle.append(...(0,f.v_)(o));else if(i=new P.ZP({title:n.id===Qe.J$?(0,f.ag)("FilterAllChats"):(0,Q.Z)(n.title),subtitle:a,clickable:!0,buttonRightLangKey:"dialogFilterSuggested"===e._?"Add":void 0}),o.length&&i.subtitle.append(...(0,f.v_)(o)),"dialogFilter"===e._){const e=n.id;if(!this.filtersRendered[n.id]&&n.id!==Qe.J$){const t=$e.Z.getInitArgs();(0,v.fc)(i.container,(()=>tt(this,void 0,void 0,(function*(){const i=yield this.managers.filtersStorage.getFilter(e),s=this.slider.createTab($e.Z);s.setInitFilter(i),s.open(t)}))),{listenerSetter:this.listenerSetter})}this.filtersRendered[n.id]=i,i.makeSortable()}const r=i.container;if(s){const e=n.localId;void 0!==e?(0,qe.Z)(r,r.parentElement||t,e):t&&t.append(r)}return i}))}init(e=it.getInitArgs()){this.container.classList.add("chat-folders-container"),this.setTitle("ChatList.Filter.List.Title"),this.scrollable.container.classList.add("chat-folders"),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container");const t=document.createElement("div");t.classList.add("caption"),(0,f.XZ)({element:t,key:"ChatList.Filter.Header"}),this.createFolderBtn=(0,I.Z)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new b.Z({name:"Filters"}),this.foldersSection.container.classList.add("hide"),this.list=document.createElement("div"),this.foldersSection.content.append(this.list),this.suggestedSection=new b.Z({name:"FilterRecommended"}),this.suggestedSection.container.classList.add("hide"),this.scrollable.append(this.stickerContainer,t,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),(0,v.fc)(this.createFolderBtn,(()=>tt(this,void 0,void 0,(function*(){(yield this.canCreateFolder())?this.slider.createTab($e.Z).open():(0,et.Z)("folders")}))),{listenerSetter:this.listenerSetter});const i=()=>{this.foldersSection.container.classList.toggle("hide",!Object.keys(this.filtersRendered).length)},s=[],a=e.filters.then((e=>tt(this,void 0,void 0,(function*(){for(const t of e)t.id!==Qe.Zi&&(yield this.renderFolder(t,this.list,void 0,!0));this.toggleAllChats(),i()}))));return s.push(a),this.listenerSetter.add(n.Z)("filter_update",(e=>tt(this,void 0,void 0,(function*(){const t=this.filtersRendered[e.id];t?yield this.renderFolder(e,null,t):e.id!==Qe.Zi&&(yield this.renderFolder(e,this.list,void 0,!0)),i(),this.getSuggestedFilters()})))),this.listenerSetter.add(n.Z)("filter_delete",(e=>{const t=this.filtersRendered[e.id];t&&(this.getSuggestedFilters(),t.container.remove(),delete this.filtersRendered[e.id]),i()})),this.listenerSetter.add(n.Z)("filter_order",(e=>{e.filter((e=>!!this.filtersRendered[e])).forEach(((e,t)=>{const i=this.filtersRendered[e].container;(0,qe.Z)(i,i.parentElement,t+1)}))})),this.listenerSetter.add(n.Z)("premium_toggle",(()=>{this.toggleAllChats()})),this.loadAnimationPromise=e.animationData.then((e=>tt(this,void 0,void 0,(function*(){const t=yield e({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86});return this.animation=t,We.Z.waitForFirstFrame(t)})))),s.push(this.loadAnimationPromise),new Ye.Z({list:this.list,middleware:this.middlewareHelper.get(),onSort:(e,t)=>{let i=[];for(const e in this.filtersRendered){const t=this.filtersRendered[e];i[(0,Xe.Z)(t.container)]=+e}i=i.filter((e=>void 0!==e)),n.Z.premium||(0,Je.Z)(i,Qe.J$),this.managers.filtersStorage.updateDialogFiltersOrder(i)},scrollable:this.scrollable}),this.getSuggestedFilters(),Promise.all(s)}onOpenAfterTimeout(){return this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()})),super.onOpenAfterTimeout()}toggleAllChats(){this.filtersRendered[Qe.J$].container.classList.toggle("hide",!n.Z.premium)}canCreateFolder(){return tt(this,void 0,void 0,(function*(){const[e,t]=yield Promise.all([this.managers.apiManager.getLimit("folders"),this.managers.filtersStorage.getDialogFilters()]);return t.filter((e=>!Qe.DZ.has(e.id))).lengthtt(this,void 0,void 0,(function*(){this.suggestedSection.container.classList.toggle("hide",!e.length),Array.from(this.suggestedSection.content.children).slice(1).forEach((e=>e.remove()));for(const t of e){const e=yield this.renderFolder(t);this.suggestedSection.content.append(e.container);const i=e.buttonRight;(0,v.fc)(i,(s=>tt(this,void 0,void 0,(function*(){if((0,K.Z)(s),!(yield this.canCreateFolder()))return void(0,et.Z)("folders");i.setAttribute("disabled","true");const n=t.filter;n.includePeerIds=[],n.excludePeerIds=[],n.pinnedPeerIds=[],this.managers.filtersStorage.createDialogFilter(n,!0).then((()=>{e.container.remove(),this.suggestedSection.container.classList.toggle("hide",1===this.suggestedSection.content.childElementCount)})).finally((()=>{i.removeAttribute("disabled")}))}))),{listenerSetter:this.listenerSetter})}}))))}}var st=i(8479),nt=i(3855),at=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class ot extends M.h{init(){this.container.classList.add("notifications-container"),this.setTitle("Telegram.NotificationSettingsViewController");const e=e=>{const t=new b.Z({name:e.name}),i=new P.ZP({checkboxField:new Ce.Z({text:e.typeText,checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0}),s=new P.ZP({checkboxField:new Ce.Z({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0});t.content.append(i.container,s.container),this.scrollable.append(t.container);const a={_:e.inputKey},o=this.managers.appNotificationsManager.getNotifySettings(a);(o instanceof Promise?o:Promise.resolve(o)).then((t=>{const o=()=>at(this,void 0,void 0,(function*(){const e=yield this.managers.appNotificationsManager.isMuted(t);return i.checkboxField.checked=!e,s.checkboxField.checked=t.show_previews,e}));o(),this.eventListener.addEventListener("destroy",(()=>at(this,void 0,void 0,(function*(){const e=!i.checkboxField.checked,n=s.checkboxField.checked;if(e===(yield this.managers.appNotificationsManager.isMuted(t))&&n===t.show_previews)return;const o=(0,st.Z)(t);o._="inputPeerNotifySettings",o.mute_until=e?Qe.rU:0,o.show_previews=n,delete o.flags,this.managers.appNotificationsManager.updateNotifySettings(a,o)}))),{once:!0}),this.listenerSetter.add(n.Z)("notify_settings",(i=>{const s=Le(i.peer._);e.inputKey===s&&(t=i.notify_settings,o())}))}))};e({name:"NotificationsPrivateChats",typeText:"NotificationsForPrivateChats",inputKey:"inputNotifyUsers"}),e({name:"NotificationsGroups",typeText:"NotificationsForGroups",inputKey:"inputNotifyChats"}),e({name:"NotificationsChannels",typeText:"NotificationsForChannels",inputKey:"inputNotifyBroadcasts"});{const e=new b.Z({name:"NotificationsOther"}),t=new P.ZP({checkboxField:new Ce.Z({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0}),i=new P.ZP({checkboxField:new Ce.Z({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound",listenerSetter:this.listenerSetter}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0});nt.Z.getState().then((e=>{i.checkboxField.checked=e.settings.notifications.sound})),e.content.append(t.container,i.container),this.scrollable.append(e.container),this.managers.appNotificationsManager.getContactSignUpNotification().then((e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",(()=>{const i=t.checkboxField.checked;e!==i&&this.managers.appNotificationsManager.setContactSignUpNotification(!i)}),{once:!0})}))}}}class rt extends l._{static getInitArgs(){return{languages1:n.Z.managers.apiManager.invokeApiCacheable("langpack.getLanguages",{lang_pack:"web"}),languages2:Promise.resolve([])}}init(e){this.header.classList.add("with-border"),this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const t=new b.Z({}),i=new Map,s=Promise.all([e.languages1,e.languages2]).then((([e,s])=>{const n=new Set,a=e.map((e=>e.lang_code)),o=(0,T.a)();e.concat(s).forEach((e=>{if(n.has(e.lang_code))return;n.add(e.lang_code);const t=new P.ZP({radioField:new A.Z({text:e.name,name:o,value:e.lang_code}),subtitle:e.native_name});i.set(e.lang_code,t)}));const r=(0,P.De)([...i.values()],(e=>{f.ZP.getLangPack(e,a.includes(e))}));f.ZP.getCacheLangPack().then((e=>{const t=i.get(e.lang_code);t?t.radioField.setValueSilently(!0):console.error("no row",t,e)})),t.content.append(r)}));return this.scrollable.append(t.container),s}}var dt=i(4081),lt=i(6848),ct=i(5701);function ht(e,t,i){const s=new b.Z({name:t}),n="settings.autoDownload."+e+".",a=new Ce.Z({text:"AutodownloadContacts",name:"contacts",stateKey:n+"contacts",listenerSetter:i}),o=new Ce.Z({text:"AutodownloadPrivateChats",name:"private",stateKey:n+"private",listenerSetter:i}),r=new Ce.Z({text:"AutodownloadGroupChats",name:"groups",stateKey:n+"groups",listenerSetter:i}),d=new Ce.Z({text:"AutodownloadChannels",name:"channels",stateKey:n+"channels",listenerSetter:i});return s.content.append((0,P.tG)(a).container,(0,P.tG)(o).container,(0,P.tG)(r).container,(0,P.tG)(d).container),s}class ut extends M.h{init(){this.setTitle("AutoDownloadPhotos");const e=ht("photo","AutoDownloadPhotosTitle",this.listenerSetter);this.scrollable.append(e.container)}}class pt extends M.h{init(){this.setTitle("AutoDownloadFiles");const e=(0,ct.Z)((e=>{this.managers.appStateManager.setByKey("settings.autoDownloadNew.file_size_max",e)}),200,!1,!0),t=ht("file","AutoDownloadFilesTitle",this.listenerSetter),i=524288,s=20447232,a=n.Z.settings.autoDownloadNew.file_size_max,o=Math.sqrt(Math.sqrt((a-i)/s)),r=new f.ZP.IntlElement({key:"AutodownloadSizeLimitUpTo",args:[(0,dt.Z)(a)]}),d=new Ge("AutoDownloadMaxFileSize",.01,o,0,1,!1);d.onChange=t=>{const n=Math.pow(t,4)*s+i|0;r.compareAndUpdate({args:[(0,dt.Z)(n)]}),e(n)},d.valueContainer.append(r.element),t.content.append(d.container),this.scrollable.append(t.container)}}class ft extends M.h{init(){this.setTitle("AutoDownloadVideos");const e=ht("video","AutoDownloadVideosTitle",this.listenerSetter);this.scrollable.append(e.container)}}const mt={contacts:"AutoDownloadContacts",private:"AutoDownloadPm",groups:"AutoDownloadGroups",channels:"AutoDownloadChannels"};class gt extends M.h{init(){return e=this,t=void 0,s=function*(){this.setTitle("DataSettings");{const e=new b.Z({name:"AutomaticMediaDownload",caption:"AutoDownloadAudioInfo"}),t=yield nt.Z.getState(),i=new Ce.Z({text:"AutoDownloadMedia",name:"auto",checked:!t.settings.autoDownloadNew.pFlags.disabled,listenerSetter:this.listenerSetter}),s=new P.ZP({checkboxField:i,listenerSetter:this.listenerSetter}),a=()=>{(0,G.Z)([h],(0,lt.Z)(t.settings.autoDownload,Ue.h.settings.autoDownload)&&(0,lt.Z)(t.settings.autoDownloadNew,Ue.h.settings.autoDownloadNew))},o=()=>{this.setAutoDownloadSubtitle(d,t.settings.autoDownload.photo),this.setAutoDownloadSubtitle(l,t.settings.autoDownload.video),this.setAutoDownloadSubtitle(c,t.settings.autoDownload.file,t.settings.autoDownloadNew.file_size_max)},r=e=>{const t=this.slider.createTab(e);t.open(),this.listenerSetter.add(t.eventListener)("destroy",(()=>{o(),a()}),{once:!0})},d=new P.ZP({titleLangKey:"AutoDownloadPhotos",subtitle:"",clickable:()=>{r(ut)},listenerSetter:this.listenerSetter}),l=new P.ZP({titleLangKey:"AutoDownloadVideos",subtitle:"",clickable:()=>{r(ft)},listenerSetter:this.listenerSetter}),c=new P.ZP({titleLangKey:"AutoDownloadFiles",subtitle:"",clickable:()=>{r(pt)},listenerSetter:this.listenerSetter}),h=(0,I.Z)("btn-primary btn-transparent primary",{icon:"delete",text:"ResetAutomaticMediaDownload"});(0,v.fc)(h,(()=>{(0,Ee.Z)({titleLangKey:"ResetAutomaticMediaDownloadAlertTitle",descriptionLangKey:"ResetAutomaticMediaDownloadAlert",button:{langKey:"Reset"}}).then((()=>{const e=n.Z.settings;e.autoDownloadNew=(0,st.Z)(Ue.h.settings.autoDownloadNew),e.autoDownload=(0,st.Z)(Ue.h.settings.autoDownload),t.settings=e,this.managers.appStateManager.setByKey("settings",e),o(),i.checked=!t.settings.autoDownloadNew.pFlags.disabled}))}));const u=()=>{const e=!i.checked,t=n.Z.settings;e?t.autoDownloadNew.pFlags.disabled=!0:delete t.autoDownloadNew.pFlags.disabled,[d,l,c].forEach((t=>{t.container.classList.toggle("is-disabled",e)})),this.managers.appStateManager.setByKey("settings",t),a()};i.input.addEventListener("change",u),u(),o(),e.content.append(s.container,d.container,l.container,c.container,h),this.scrollable.append(e.container)}{const e=new b.Z({name:"AutoplayMedia"});e.content.append(new P.ZP({checkboxField:new Ce.Z({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",listenerSetter:this.listenerSetter}),listenerSetter:this.listenerSetter}).container,new P.ZP({checkboxField:new Ce.Z({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",listenerSetter:this.listenerSetter}),listenerSetter:this.listenerSetter}).container),this.scrollable.append(e.container)}},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}setAutoDownloadSubtitle(e,t,i){let s;const n=[],a=Object.keys(t),o=a.map((e=>t[e]?mt[e]:void 0)).filter(Boolean);if(o.length&&0!==i){const e=o.length===a.length;if(void 0!==i?(s=e?"AutoDownloadUpToOnAllChats":"AutoDownloadOnUpToFor",n.push((0,dt.Z)(i))):s=e?"AutoDownloadOnAllChats":"AutoDownloadOnFor",!e){const e=document.createElement("span");e.append(...(0,f.v_)(o.map((e=>(0,f.ag)(e))),!0,!1)),n.push(e)}}else s="AutoDownloadOff";(0,Z.Z)(e.subtitle,(0,f.ag)(s,n))}}var vt=i(2230),bt=i(8261),yt=i(6765),wt=i(1168),St=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ct extends l._{constructor(){super(...arguments),this.buttons={}}init(){return St(this,void 0,void 0,(function*(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=(0,E.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new B.Z("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{this.managers.apiManager.logOut()},isDanger:!0}]}).show()}}]});this.buttons.edit=(0,vt.Z)("edit"),this.header.append(this.buttons.edit,e),this.profile=new bt.Z(this.managers,this.scrollable,this.listenerSetter,!1),this.profile.init(),this.profile.setPeer(n.Z.myId);const t=this.profile.fillProfileElements(),i=(0,I.Z)("btn-circle btn-corner z-depth-1 profile-change-avatar",{icon:"cameraadd"});(0,v.fc)(i,(()=>{const e=document.createElement("canvas");wt.Z.createPopup(yt.Z).open(e,(e=>{e().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))}))}),{listenerSetter:this.listenerSetter}),this.profile.element.lastElementChild.firstElementChild.append(i);const s=()=>St(this,void 0,void 0,(function*(){var e;const t=yield this.managers.appUsersManager.getSelf();i.classList.toggle("hide","userProfilePhoto"!==(null===(e=t.photo)||void 0===e?void 0:e._))}));s(),this.listenerSetter.add(n.Z)("avatar_update",(({peerId:e})=>{n.Z.myId===e&&s()}));const a=document.createElement("div");a.classList.add("profile-buttons");const o=(e,t,i,s)=>{if(!s){const e=i.getInitArgs;e&&(s=()=>[e(this)])}return{icon:e,text:t,tabConstructor:i,getInitArgs:s,args:null==s?void 0:s()}},r=[o("unmute","AccountSettings.Notifications",ot),o("data","DataSettings",gt),o("lock","AccountSettings.PrivacyAndSecurity",ke),o("settings","Telegram.GeneralSettingsViewController",Ve),o("folder","AccountSettings.Filters",it)].map((e=>{const{icon:t,text:i,tabConstructor:s,getInitArgs:n}=e;return new P.ZP({titleLangKey:i,icon:t,clickable:()=>St(this,void 0,void 0,(function*(){const t=e.args?yield e.args:[],i=this.slider.createTab(s);i.open(...t),i instanceof M.h&&n&&i.eventListener.addEventListener("destroyAfter",(t=>{e.args=t.then((()=>n()))}))})),listenerSetter:this.listenerSetter})})),d=rt.getInitArgs();r.push(this.devicesRow=new P.ZP({titleLangKey:"Devices",titleRightSecondary:" ",icon:"activesessions",clickable:()=>St(this,void 0,void 0,(function*(){this.authorizations||(yield this.updateActiveSessions());const e=this.slider.createTab(ge);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.authorizations=void 0,this.updateActiveSessions(!0)}),{once:!0}),e.open()})),listenerSetter:this.listenerSetter}),this.languageRow=new P.ZP({titleLangKey:"AccountSettings.Language",titleRightSecondary:(0,f.ag)("LanguageName"),icon:"language",clickable:()=>{this.slider.createTab(rt).open(d)},listenerSetter:this.listenerSetter})),a.append(...r.map((e=>e.container)));const l=new b.Z;l.content.append(a),this.scrollable.append(this.profile.element,l.container);const c=()=>{h=Ke.Z.getInitArgs()};let h;(0,v.fc)(this.buttons.edit,(()=>{this.slider.createTab(Ke.Z).open(h)}),{listenerSetter:this.listenerSetter}),c(),this.listenerSetter.add(n.Z)("user_update",(e=>{n.Z.myId.toUserId()===e&&c()})),We.Z.loadLottieWorkers(),this.updateActiveSessions(),(yield t)()}))}getAuthorizations(e){if(this.getAuthorizationsPromise&&!e)return this.getAuthorizationsPromise;const t=this.getAuthorizationsPromise=this.managers.apiManager.invokeApi("account.getAuthorizations").finally((()=>{this.getAuthorizationsPromise===t&&(this.getAuthorizationsPromise=void 0)}));return t}updateActiveSessions(e){return this.getAuthorizations(e).then((e=>{this.authorizations=e.authorizations,this.devicesRow.titleRight.textContent=""+this.authorizations.length}))}onCloseAfterTimeout(){return this.profile.destroy(),super.onCloseAfterTimeout()}}class Lt extends l._{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new p.Z((e=>{this.uploadAvatar=e}));const e=new b.Z({caption:"Channel.DescriptionHolderDescrpiton"}),t=document.createElement("div");t.classList.add("input-wrapper"),this.channelNameInputField=new u.ZP({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new u.ZP({label:"DescriptionOptionalPlaceholder",maxLength:255}),t.append(this.channelNameInputField.container,this.channelDescriptionInputField.container);const i=()=>{this.nextBtn.classList.toggle("is-visible",!!this.channelNameInputField.value.length&&!this.channelNameInputField.input.classList.contains("error")&&!this.channelDescriptionInputField.input.classList.contains("error"))};this.channelNameInputField.input.addEventListener("input",i),this.channelDescriptionInputField.input.addEventListener("input",i),this.nextBtn=(0,m.Z)({icon:"arrow_next"}),(0,v.fc)(this.nextBtn,(()=>{const e=this.channelNameInputField.value,t=this.channelDescriptionInputField.value;this.nextBtn.disabled=!0,this.managers.appChatsManager.createChannel({title:e,about:t,broadcast:!0}).then((e=>{this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),s.ZP.setInnerPeer({peerId:e.toPeerId(!0)}),Wt.removeTabFromHistory(this),this.slider.createTab(_.Z).open({type:"channel",skippable:!0,title:"GroupAddMembers",placeholder:"SendMessageTo",takeOut:t=>this.managers.appChatsManager.inviteToChannel(e,t)})}))}),{listenerSetter:this.listenerSetter}),this.content.append(this.nextBtn),e.content.append(this.avatarEdit.container,t),this.scrollable.append(e.container)}onCloseAfterTimeout(){return this.avatarEdit.clear(),this.uploadAvatar=null,this.channelNameInputField.value="",this.channelDescriptionInputField.value="",this.nextBtn.disabled=!1,super.onCloseAfterTimeout()}}var Et=i(241),It=i(2621),Mt=i(709),Pt=i(6272);class Zt extends wt.Z{constructor(){super("popup-create-contact popup-send-photo popup-new-media",{closable:!0,withConfirm:"Add",title:"AddContactTitle"}),this.construct()}construct(){return e=this,t=void 0,s=function*(){(0,v.fc)(this.btnConfirm,(()=>{const e=this.managers.appUsersManager.importContact(i.value,s.value,n.value);e.then((()=>{this.hide()}),(e=>{"NO_USER"===e.type&&((0,ee.bC)({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),d.disabled=!1)})),d.lockWithPromise(e)}),{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const i=new u.ZP({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),s=new u.ZP({label:"LastName",name:"create-contact-lastname",maxLength:70}),n=new Mt.Z({required:!0});e.push(i,s,n);const a=()=>{const e=i.value+" "+s.value;d.avatarElem.peerTitle=e,d.avatarElem.update()};this.listenerSetter.add(i.input)("input",a),this.listenerSetter.add(s.input)("input",a),n.validate=()=>!!n.value.match(/\d/);const o=yield this.managers.appUsersManager.getSelf(),r=(0,Pt.u)(o.phone);r.code&&(n.value="+"+r.code.country_code);const d=new It.Z({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(i.container,s.container,d.avatarElem),this.container.append(t,n.container),this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var Tt=i(2894),kt=i(3624);class xt extends l._{init(){this.container.id="contacts-container";const e=(0,m.Z)({icon:"add",className:"is-visible"});this.content.append(e),(0,v.fc)(e,(()=>{wt.Z.createPopup(Zt)}),{listenerSetter:this.listenerSetter}),this.inputSearch=new d.Z("Search",(e=>{this.openContacts(e)})),this.listenerSetter.add(n.Z)("contacts_update",(e=>{return t=this,i=void 0,n=function*(){const t=yield this.managers.appUsersManager.isContact(e),i=e.toPeerId();t?this.sortedUserList.add(i):this.sortedUserList.delete(i)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n})),this.title.replaceWith(this.inputSearch.container),this.middleware=(0,kt.k)(),this.openContacts()}createList(){const e=new Tt.Z({managers:this.managers}),t=e.list;return t.id="contacts",t.classList.add("contacts-container"),h.default.setListClickListener(t,(()=>{this.close()}),void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!z.IS_MOBILE&&j(!0)&&this.inputSearch.input.focus()}openContacts(e){this.middleware.clean();const t=this.middleware.get();this.scrollable.onScrolledBottom=null,this.scrollable.container.textContent="",this.managers.appUsersManager.getContactsPeerIds(e,void 0,"online").then((e=>{if(!t())return;const i=this.sortedUserList=this.createList();let s=()=>{const t=Et.Z.height/56*1.25|0;e.splice(0,t).forEach((e=>{i.add(e)})),e.length||(s=void 0,this.scrollable.onScrolledBottom=null)};s(),this.scrollable.onScrolledBottom=()=>{s?s():this.scrollable.onScrolledBottom=null},(0,Z.Z)(this.scrollable.container,i.list)}))}}class At extends l._{init(){if(this.wasFilterId=h.default.filterId,this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),this.header.classList.add("can-have-forum"),this.content.classList.add("can-have-forum"),!h.default.xds[At.filterId]){const{ul:e,scrollable:t}=h.default.l({title:void 0,id:At.filterId,localId:Qe.Zi});t.container.append(e)}const e=h.default.xds[At.filterId].scrollable;return this.scrollable.container.replaceWith(e.container),e.attachBorderListeners(this.container),h.default.setFilterIdAndChangeTab(At.filterId).then((({cached:e,renderPromise:t})=>{if(e)return t}))}onOpenAfterTimeout(){h.default.xds[this.wasFilterId].clear()}onClose(){this.scrollable.onAdditionalScroll=void 0,h.default.setFilterIdAndChangeTab(this.wasFilterId)}onCloseAfterTimeout(){return h.default.xds[At.filterId].clear(),super.onCloseAfterTimeout()}}At.filterId=Qe.Zi;class _t extends l._{constructor(){super(...arguments),this.isLocationWatched=!1}parseDistance(e){return"miles"===n.Z.settings.distanceUnit?e>1609.34?(0,f.ag)("MilesAway",[Math.round(e/1609)]):(0,f.ag)("FootsAway",[Math.round(3.281*e)]):e>=1e3?(0,f.ag)("KMetersAway2",[e/1e3]):(0,f.ag)("MetersAway2",[e])}startWatching(){this.latestLocationSaved&&!this.isLocationWatched&&(this.isLocationWatched=!0,(0,ee.Am)("Your position is now being shared. Do not close the page or it will be suspended."),this.managers.appUsersManager.getLocated(this.latestLocationSaved.latitude,this.latestLocationSaved.longitude,this.latestLocationSaved.accuracy,!0,2147483647),navigator.geolocation.watchPosition((e=>{const t=e.coords.longitude!==this.latestLocationSaved.longitude,i=e.coords.latitude!==this.latestLocationSaved.latitude,s=this.calculateDistance(e.coords.latitude,e.coords.longitude,this.latestLocationSaved.latitude,this.latestLocationSaved.longitude)>100;(i||t)&&s&&(this.managers.appUsersManager.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy,!0,2147483647),this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy})})))}stopWatching(){this.isLocationWatched&&(this.isLocationWatched=!1,(0,ee.Am)("The sharing of your position has been stopped. You will no longer be visible to other users."),this.managers.appUsersManager.getLocated(0,0,0,!1,0))}calculateDistance(e,t,i,s){const n=.017453292519943295;return 12742*Math.asin(Math.sqrt(.5-Math.cos((i-e)*n)+Math.cos(e*n)*Math.cos(i*n)*(1-Math.cos((s-t)*n)/2)))}}var Ft=i(6385),Dt=i(8842),Rt=i(4159),Bt=i(7487),Nt=i(1405),Ot=i(2559),Ut=i(4755),Ht=i(3035),zt=i(6472),jt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Gt="is-left-column-shown";class Vt extends l.Z{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={}}construct(e){this.managers=e,this.inputSearch=new d.Z("Search");const t=this.sidebarEl.querySelector(".item-main .sidebar-header");t.append(this.inputSearch.container);const i=()=>{this.createTab(xt).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const a={icon:"archive",text:"ArchivedChats",onClick:()=>{this.createTab(At).open()},verify:()=>jt(this,void 0,void 0,(function*(){return!!(yield this.managers.dialogsStorage.getFolderDialogs(Qe.Zi,!1)).length||!(yield this.managers.dialogsStorage.isDialogsLoaded(Qe.Zi))}))},o=new Ce.Z({toggle:!0,checked:"night"===ze.Z.getTheme().name});o.input.addEventListener("change",(()=>jt(this,void 0,void 0,(function*(){ze.Z.switchTheme(o.input.checked?"night":"day")})))),n.Z.addEventListener("theme_change",(()=>{o.setValueSilently("night"===ze.Z.getTheme().name)}));const r=[{icon:"savedmessages",text:"SavedMessages",onClick:()=>{setTimeout((()=>{s.ZP.setPeer({peerId:s.ZP.myId})}),0)}},a,{icon:"user",text:"Contacts",onClick:i},Be.Z?{icon:"group",text:"PeopleNearby",onClick:()=>{this.createTab(_t).open()}}:void 0,{icon:"settings",text:"Settings",onClick:()=>{this.createTab(Ct).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:o},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new Ce.Z({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{const e=f.ZP.format("TelegramFeaturesUrl",!0);s.ZP.openUrl(e)}},{icon:"bug",text:"ReportBug",onClick:()=>{const e=document.createElement("a");e.target="_blank",e.href="https://bugs.telegram.org/?tag_ids=40&sort=time",document.body.append(e),e.click(),setTimeout((()=>{e.remove()}),0)}},{icon:"char z",text:"ChatList.Menu.SwitchTo.Z",onClick:()=>{Promise.all([Bt.Z.set({kz_version:"Z"}),Bt.Z.delete("tgme_sync")]).then((()=>{location.href="https://web.telegram.org/z/"}))},verify:()=>Rt.Z.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{Bt.Z.delete("tgme_sync").then((()=>{location.href="https://web.telegram.org/?legacy=1"}))},verify:()=>Rt.Z.isMainDomain},{icon:"download",text:"PWA.Install",onClick:()=>{const e=(0,zt.B)();null==e||e()},verify:()=>!!(0,zt.B)()}].filter(Boolean);this.toolsBtn=(0,E.Z)({direction:"bottom-right",buttons:r,onOpen:(e,t)=>{var i;const s=document.createElement("a");s.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",s.target="_blank",s.rel="noopener noreferrer",s.classList.add("btn-menu-footer"),s.addEventListener(v.pf,(e=>{e.stopPropagation(),me.Z.close()}));const n=document.createElement("span");n.classList.add("btn-menu-footer-text"),n.innerHTML="Telegram Web"+Rt.Z.suffix+" "+Rt.Z.versionFull,s.append(n),t.classList.add("has-footer"),t.append(s),null===(i=a.element)||void 0===i||i.append(this.archivedCount)}}),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn),this.newBtnMenu=(0,E.Z)({direction:"top-left",buttons:[{icon:"newchannel",text:"NewChannel",onClick:()=>{this.createTab(Lt).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{this.createTab(_.Z).open({type:"chat",skippable:!1,takeOut:e=>this.createTab(y).open(e),title:"GroupAddMembers",placeholder:"SendMessageTo"})}},{icon:"newprivate",text:"NewPrivateChat",onClick:i}]}),this.newBtnMenu.className="btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon",this.newBtnMenu.insertAdjacentHTML("afterbegin",'\n \n \n '),this.newBtnMenu.id="new-menu",t.nextElementSibling.append(this.newBtnMenu),this.updateBtn=document.createElement("div"),this.updateBtn.className="btn-circle rp btn-corner z-depth-1 btn-update is-hidden",(0,Nt.Z)(this.updateBtn),this.updateBtn.append((0,f.ag)("Update")),(0,v.fc)(this.updateBtn,(()=>{this.updateBtn.classList.contains("is-hidden")||location.reload()})),t.nextElementSibling.append(this.updateBtn),this.inputSearch.input.addEventListener("focus",(()=>this.initSearch()),{once:!0}),this.archivedCount=document.createElement("span"),this.archivedCount.className="archived-count badge badge-24 badge-gray",n.Z.addEventListener("folder_unread",(e=>{if(e.id===Qe.Zi){const t=e.unreadPeerIds.size;this.archivedCount.textContent=""+(0,Ot.Z)(t,1),this.archivedCount.classList.toggle("hide",!t)}})),this.managers.appUsersManager.getTopPeers("correspondents");const l={type:"global-search-focus",onPop:()=>(setTimeout((()=>{this.inputSearch.input.focus()}),0),!1),noHistory:!0};Ft.Z.pushItem(l),nt.Z.getState().then((()=>{const e=setInterval((()=>{fetch("version",{cache:"no-cache"}).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((t=>{t!==Rt.Z.versionFull&&(this.hasUpdate=!0,clearInterval(e),this.newBtnMenu.classList.contains("is-hidden")||this.updateBtn.classList.remove("is-hidden"))})).catch(Ie.Z)}),18e5)}));const c=()=>{const e=this.rect=this.tabsContainer.getBoundingClientRect();document.documentElement.style.setProperty("--left-column-width",e.width+"px")};(0,Ht.T2)(c),Ut.Z.addEventListener("resize",c)}initSearch(){const e=this.sidebarEl.querySelector("#search-container"),t=new r.ZP(e),i=()=>{(0,v.tH)(this.backBtn)};this.searchGroups={contacts:new a.z("SearchAllChatsShort","contacts",void 0,void 0,void 0,void 0,i),globalContacts:new a.z("GlobalSearch","contacts",void 0,void 0,void 0,void 0,i),messages:new a.z("SearchMessages","messages"),people:new a.z(!1,"contacts",!0,"search-group-people",!0,!1,i,!0),recent:new a.z("Recent","contacts",!0,"search-group-recent",!0,!0,i)};const s=this.searchSuper=new S.Z({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"FilterChats",type:"chats"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:t,searchGroups:this.searchGroups,asChatList:!0,hideEmptyTabs:!1,showSender:!0,managers:this.managers});e.prepend(s.nav.parentElement.parentElement),t.container.append(s.container),s.setQuery({peerId:"".toPeerId(),folderId:0}),s.selectTab(0),s.load(!0);const n=[];let d="".toPeerId(),l=0,u=0;const p=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===n.length),this.inputSearch.container.classList.toggle("is-picked",!!n.length),n.length?this.inputSearch.input.style.setProperty("--paddingLeft",n[n.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},f=document.createElement("div");f.classList.add("search-helper"),f.addEventListener("click",(e=>{const t=(0,he.Z)(e.target,"selector-user");if(!t)return;const i=t.dataset.key;if(0===i.indexOf("date_")){const[e,t,s]=i.split("_");l=+t,u=+s}else d=i.toPeerId();t.addEventListener("click",(()=>{g(t)})),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),n.push(t),p()})),s.nav.parentElement.append(f);const m=(e,t)=>{const i=document.createElement("div");i.classList.add("selector-user");const s=new o.Z;return s.classList.add("selector-user-avatar","tgico","avatar-32"),s.isDialog=!0,i.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new Dt.Z({peerId:e.toPeerId()}).element),s.updateWithOptions({peerId:e})):s.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?i.innerHTML=t:((0,Z.Z)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",s),i},g=e=>{0===e.dataset.key.indexOf("date_")?l=u=0:d="".toPeerId(),e.remove(),(0,Je.Z)(n,e),setTimeout((()=>{p(),this.inputSearch.onChange(this.inputSearch.value)}),0)};this.inputSearch.onClear=()=>{n.forEach((e=>{g(e)}))},this.inputSearch.onChange=e=>{if(s.cleanupHTML(),s.setQuery({peerId:d,folderId:d?void 0:0,query:e,minDate:l,maxDate:u}),s.load(!0),f.innerHTML="",s.nav.classList.remove("hide"),!d&&e.trim()){const t=s.middleware.get();Promise.all([this.managers.dialogsStorage.getDialogs({query:e}).then((({dialogs:e})=>e.map((e=>e.peerId)))),this.managers.appUsersManager.getContactsPeerIds(e,!0)]).then((e=>{t()&&(new Set(e[0].concat(e[1])).forEach((e=>{f.append(m(e))})),s.nav.classList.toggle("hide",!!f.innerHTML))}))}if(!l&&e.trim()){const t=[];(0,C.fl)(e,t),t.forEach((e=>{f.append(m("date_"+e.minDate+"_"+e.maxDate,e.title))})),s.nav.classList.toggle("hide",!!f.innerHTML)}},s.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",(e=>{const t=(0,be.Z)(e.target,h.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=(0,he.Z)(t,"search-group");if(!i||i.classList.contains("search-group-recent")||i.classList.contains("search-group-people"))return;const s=t.getAttribute("data-peer-id").toPeerId();this.managers.appUsersManager.pushRecentSearch(s)}),{capture:!0});const b=document.createElement("div");b.classList.add("search-group-scrollable"),b.append(this.searchGroups.people.list),this.searchGroups.people.container.append(b),new r.v7(b);let y,w=!0;const L=(0,c.Z)({content:e.parentElement,type:"zoom-fade",transitionTime:150,onTransitionEnd:e=>{y&&clearTimeout(y),0!==e||w||(s.selectTab(0,!1),this.inputSearch.onClearClick(),y=window.setTimeout((()=>{y=0,this.newBtnMenu.classList.remove("is-hidden"),this.hasUpdate&&this.updateBtn.classList.remove("is-hidden")}),150)),w=!1}});L(0);const E="is-visible",I=()=>{this.toolsBtn.classList.remove(E),this.backBtn.classList.add(E),this.newBtnMenu.classList.add("is-hidden"),this.updateBtn.classList.add("is-hidden"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!0);const e="global-search";z.IS_MOBILE_SAFARI||Ft.Z.findItemByType(e)||Ft.Z.pushItem({onPop:()=>{i()},type:e}),L(1)};this.inputSearch.input.addEventListener("focus",I),I(),(0,v.fc)(this.backBtn,(e=>{this.toolsBtn.classList.add(E),this.backBtn.classList.remove(E),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),Ft.Z.removeByType("global-search"),L(0)}));const M=(0,vt.Z)("close");this.searchGroups.recent.nameEl.append(M),M.addEventListener("click",(()=>{(0,Ee.Z)({descriptionLangKey:"Search.Confirm.ClearHistory",button:{langKey:"ClearButton",isDanger:!0}}).then((()=>this.managers.appUsersManager.clearRecentSearch().then((()=>{this.searchGroups.recent.clear()}))))}))}}const Kt=new Vt;L.GO.appSidebarLeft=Kt;const Wt=Kt},5670:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(3552),n=i(5644),a=i(279),o=i(8119);class r extends s._{init(e){this.container.classList.add("add-members-container"),this.nextBtn=(0,o.Z)({icon:"arrow_next"}),this.content.append(this.nextBtn),this.scrollable.container.remove(),this.nextBtn.addEventListener("click",(()=>{const e=this.selector.getSelected().map((e=>e.toPeerId())),t=this.takeOut(e);this.skippable?this.close():t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()})),this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const t="privacy"===this.peerType;this.selector=new n.Z({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[t?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:t,filterPeerTypeBy:t?["isAnyGroup","isUser"]:void 0,managers:this.managers,design:"square"}),e.selectedPeerIds&&this.selector.addInitial(e.selectedPeerIds),this.nextBtn.classList.add("tgico-arrow_next"),this.nextBtn.innerHTML="",this.nextBtn.disabled=!1,this.nextBtn.classList.toggle("is-visible",this.skippable)}attachToPromise(e){const t=(0,a.p)(this.nextBtn,"arrow_next");e.then((()=>{this.close()}),(()=>{t()}))}}},9439:(e,t,i)=>{"use strict";i.d(t,{Z:()=>B});var s=i(6740);function n(e){const t=e.getContext("2d"),i=new Array(4).fill(0),s=t.getImageData(0,0,e.width,e.height).data,n=s.length/4;for(let e=0;e0&&(i=Math.min(100,i+5+.1*(100-i))),s=Math.max(0,.65*s),`hsla(${t}, ${i}%, ${s}%, .4)`}var h=i(8479),u=i(9674),p=i(1571),f=i(2312),m=i(4271),g=i(3512),v=i(4494),b=i(9807),y=i(3442),w=i(3552),S=i(6724),C=i(6714),L=i(5077),E=i(3228),I=i(503);class M{constructor(){this.hue=0,this.saturation=100,this.lightness=50,this.alpha=1,this.elements={},this.onGrabStart=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor="grabbing"},this.onGrabEnd=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor=""},this.container=document.createElement("div"),this.container.classList.add(M.BASE_CLASS);const e=`\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 `;this.container.innerHTML=e,this.elements.box=this.container.firstElementChild,this.elements.boxDragger=this.elements.box.lastElementChild,this.elements.saturation=this.elements.box.firstElementChild.firstElementChild,this.elements.sliders=this.elements.box.nextElementSibling,this.elements.hue=this.elements.sliders.firstElementChild,this.elements.hueDragger=this.elements.hue.lastElementChild,this.hexInputField=new I.ZP({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new I.ZP({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=M.BASE_CLASS+"-inputs",t.append(this.hexInputField.container,this.rgbInputField.container),this.container.append(t),this.hexInputField.input.addEventListener("input",(()=>{let e=this.hexInputField.value.replace(/#/g,"").slice(0,6);const t=e.match(/([a-fA-F\d]+)/),i=t&&t[0].length===e.length&&[6].includes(e.length);this.hexInputField.setState(i?I.I1.Neutral:I.I1.Error),e="#"+e,this.hexInputField.setValueSilently(e),i&&this.setColor(e,!1,!0)}));const i=/^(?:rgb)?\(?([01]?\d\d?|2[0-4]\d|25[0-5])(?:\W+)([01]?\d\d?|2[0-4]\d|25[0-5])\W+(?:([01]?\d\d?|2[0-4]\d|25[0-5])\)?)$/;this.rgbInputField.input.addEventListener("input",(()=>{const e=this.rgbInputField.value.match(i);this.rgbInputField.setState(e?I.I1.Neutral:I.I1.Error),e&&this.setColor((0,l.dI)(+e[1],+e[2],+e[3]),!0,!1)})),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){(0,L.Z)(this.elements.box,(()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()}),(e=>{this.saturationHandler(e.x,e.y)}),(()=>{this.onGrabEnd()}))}attachHueListeners(){(0,L.Z)(this.elements.hue,(()=>{this.onGrabStart(),this.hueRect=this.elements.hue.getBoundingClientRect()}),(e=>{this.hueHandler(e.x)}),(()=>{this.onGrabEnd()}))}setColor(e,t=!0,i=!0){if(void 0===e)e={h:0,s:100,l:50,a:1};else if("string"==typeof e)if("#"===e[0])e=(0,l.cw)(e);else{const t=e.match(/[.?\d]+/g);e=(0,l.dI)(+t[0],+t[1],+t[2],void 0===t[3]?1:+t[3])}this.boxRect=this.elements.box.getBoundingClientRect();const s=this.boxRect.width/100*e.s,n=100-e.l/(100-e.s/2)*100,a=this.boxRect.height/100*n;this.saturationHandler(this.boxRect.left+s,this.boxRect.top+a,!1),this.hueRect=this.elements.hue.getBoundingClientRect();const o=e.h/360,r=this.hueRect.left+this.hueRect.width*o;this.hueHandler(r,!1),this.hue=e.h,this.saturation=e.s,this.lightness=e.l,this.alpha=e.a,this.updatePicker(t,i)}getCurrentColor(){const e=(0,l.Y6)(this.hue,this.saturation,this.lightness,this.alpha),t=(0,l.t1)(e),i=t.slice(0,-2);return{hsl:`hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,rgb:`rgb(${e[0]}, ${e[1]}, ${e[2]})`,hex:i,hsla:`hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,rgba:`rgba(${e[0]}, ${e[1]}, ${e[2]}, ${e[3]})`,hexa:t,rgbaArray:e}}updatePicker(e=!0,t=!0){const i=this.getCurrentColor();this.elements.boxDragger.setAttributeNS(null,"fill",i.hex),e&&(this.hexInputField.setValueSilently(i.hex),this.hexInputField.setState(I.I1.Neutral)),t&&(this.rgbInputField.setValueSilently(i.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(I.I1.Neutral)),this.onChange&&this.onChange(i)}hueHandler(e,t=!0){const i=(0,E.Z)(e-this.hueRect.left,0,this.hueRect.width)/this.hueRect.width;this.hue=Math.round(360*i);const s=`hsla(${this.hue}, 100%, 50%, ${this.alpha})`;this.elements.hueDragger.setAttributeNS(null,"x",100*i+"%"),this.elements.hueDragger.setAttributeNS(null,"fill",s),this.elements.saturation.lastElementChild.setAttributeNS(null,"stop-color",s),t&&this.updatePicker()}saturationHandler(e,t,i=!0){const s=this.boxRect.width,n=this.boxRect.height,a=(0,E.Z)(e-this.boxRect.left,0,s)/s*100,o=(0,E.Z)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const d=(0,E.Z)(a,0,100),l=100-d/2,c=100-(0,E.Z)(o,0,100),h=(0,E.Z)(c/100*l,0,100);this.saturation=d,this.lightness=h,i&&this.updatePicker()}}M.BASE_CLASS="color-picker";var P=i(5029);class Z extends w._{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=(0,l.Pi)(e),i=this.theme.settings,s=c(t),n={_:"wallPaperNoFile",id:0,pFlags:{},settings:{_:"wallPaperSettings",background_color:parseInt(e.slice(1),16)}};i.wallpaper=n,i.highlightningColor=s,this.managers.appStateManager.pushToState("settings",g.Z.settings),m.ZP.applyCurrentTheme(void 0,void 0,!0),this.setActive()}},this.onColorChange=e=>{this.applyColor(e.hex,!1)}}init(){this.container.classList.add("background-container","background-color-container"),this.setTitle("SetColor"),this.theme=C.Z.getTheme();const e=new P.Z({});this.colorPicker=new M,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new P.Z({}),i=this.grid=document.createElement("div");i.classList.add("grid"),["#E6EBEE","#B2CEE1","#008DD0","#C6E7CB","#C4E1A6","#60B16E","#CCD0AF","#A6A997","#7A7072","#FDD7AF","#FDB76E","#DD8851"].forEach((e=>{const t=document.createElement("div");t.classList.add("grid-item"),t.dataset.color=e.toLowerCase();const s=document.createElement("div");s.classList.add("grid-item-media"),s.style.backgroundColor=e,t.append(s),i.append(t)})),(0,r.fc)(i,(e=>{const t=(0,d.Z)(e.target,"grid-item");if(!t||t.classList.contains("active"))return;const i=t.dataset.color;i&&this.applyColor(i)}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container),this.applyColor=(0,S.Z)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.settings.wallpaper.settings.background_color,i=t?this.grid.querySelector(`.grid-item[data-color="${t}"]`):null;e!==i&&(e&&e.classList.remove("active"),i&&i.classList.add("active"))}onOpen(){setTimeout((()=>{var e,t;const i=this.theme.settings,s=null===(t=null===(e=null==i?void 0:i.wallpaper)||void 0===e?void 0:e.settings)||void 0===t?void 0:t.background_color,n=!!s&&"wallPaperNoFile"===i.wallpaper._;n&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(s&&"#"+s.toString(16)||"#cccccc"),n||(this.colorPicker.onChange=this.onColorChange)}),0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}var T,k=i(7030),x=i(236),A=i(7814),_=i(9405),F=i(9492),D=i(7479),R=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class B extends w._{constructor(){super(...arguments),this.clicked=new Set,this.wallPapersByElement=new Map,this.elementsByKey=new Map,this.onUploadClick=()=>{(function(e){const t=document.createElement("input");t.type="file",t.style.display="none",e&&(t.accept=e),document.body.append(t);const i=new Promise(((e,i)=>{t.addEventListener("change",(t=>{const s=t.target.files[0];s?e(s):i("NO_FILE_SELECTED")}),{once:!0})})).finally((()=>{t.remove()}));return t.click(),i})("image/x-png,image/png,image/jpeg").then((e=>R(this,void 0,void 0,(function*(){if(e.name.endsWith(".png")){const t=document.createElement("img"),i=URL.createObjectURL(e);yield(0,s.cj)(t,i,!1);const n="image/jpeg",{blob:a}=yield(0,A.Z)({media:t,size:new _.c(t.naturalWidth,t.naturalHeight),mimeType:n});e=new File([a],e.name.replace(/\.png$/,".jpg"),{type:n})}const t=yield this.managers.appDocsManager.prepareWallPaperUpload(e),i=this.managers.appDocsManager.uploadWallPaper(t.id),n=f.Z.getNewDeferredForUpload(e.name,i),a=(0,o.Z)();a.addNotifyListener=n.addNotifyListener,a.cancel=n.cancel,n.then((e=>{this.clicked.delete(r),this.elementsByKey.delete(r),this.wallPapersByElement.set(l,e);const t=this.getWallPaperKey(e);this.elementsByKey.set(t,l),B.setBackgroundDocument(e).then(a.resolve,a.reject)}),a.reject);const r=this.getWallPaperKey(t);a.catch((()=>{l.remove()}));const d=new y.Z({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),{container:l}=yield this.addWallPaper(t,!1);this.clicked.add(r),d.attach(l,!1,a)}))))},this.onResetClick=()=>{var e,t,i,s;const n=x.h.settings.themes.find((e=>e.name===this.theme.name));n&&(++B.tempId,this.theme.settings=(0,h.Z)(n.settings),this.managers.appStateManager.pushToState("settings",g.Z.settings),m.ZP.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(null===(s=null===(i=null===(t=null===(e=this.theme.settings)||void 0===e?void 0:e.wallpaper)||void 0===t?void 0:t.settings)||void 0===i?void 0:i.pFlags)||void 0===s?void 0:s.blur))},this.onGridClick=e=>{const t=(0,d.Z)(e.target,"grid-item");if(!t)return;const i=this.wallPapersByElement.get(t);if("wallPaperNoFile"===i._)return void B.setBackgroundDocument(i);const s=this.getWallPaperKey(i);if(this.clicked.has(s))return;this.clicked.add(s);const n=i.document,a=new y.Z({cancelable:!0,tryAgainOnFail:!1}),o=()=>R(this,void 0,void 0,(function*(){var e,s,o,r;const d=B.setBackgroundDocument(i);(yield this.managers.thumbsStorage.getCacheContext(n)).url&&!(null===(r=null===(o=null===(s=null===(e=this.theme.settings)||void 0===e?void 0:e.wallpaper)||void 0===s?void 0:s.settings)||void 0===o?void 0:o.pFlags)||void 0===r?void 0:r.blur)||a.attach(t,!0,d)}));a.construct(),(0,r.fc)(t,(e=>{a.preloader.parentElement?(a.onClick(e),a.detach()):o()}),{listenerSetter:this.listenerSetter}),o()},this.setActive=()=>{const e=this.grid.querySelector(".active"),t=this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));e!==t&&(e&&e.classList.remove("active"),t&&t.classList.add("active"))}}static getInitArgs(){return{backgrounds:g.Z.managers.appThemesManager.getWallPapers()}}get theme(){return C.Z.getTheme()}init(e=B.getInitArgs()){var t,i,s;this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground");{const e=(0,P.R)(this.scrollable),n=(0,v.Z)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),a=(0,v.Z)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),d=(0,v.Z)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});(0,r.fc)(n,this.onUploadClick,{listenerSetter:this.listenerSetter}),(0,r.fc)(a,(()=>{this.slider.createTab(Z).open()}),{listenerSetter:this.listenerSetter}),(0,r.fc)(d,this.onResetClick,{listenerSetter:this.listenerSetter});const l=null===(t=this.theme.settings)||void 0===t?void 0:t.wallpaper,c=this.blurCheckboxField=new b.Z({text:"ChatBackground.Blur",name:"blur",checked:null===(s=null===(i=null==l?void 0:l.settings)||void 0===i?void 0:i.pFlags)||void 0===s?void 0:s.blur});this.listenerSetter.add(c.input)("change",(()=>R(this,void 0,void 0,(function*(){this.theme.settings.wallpaper.settings.pFlags.blur=c.input.checked||void 0,yield this.managers.appStateManager.pushToState("settings",g.Z.settings),setTimeout((()=>{const e=o.querySelector(".active");if(!e)return;const t=this.wallPapersByElement.get(e);t.pFlags.pattern||"wallPaperNoFile"===t._||B.setBackgroundDocument(t)}),100)})))),e.append(n,a,d,(0,D.tG)(c).container)}g.Z.addEventListener("background_change",this.setActive);const n=e.backgrounds.then((e=>{const t=e.map((e=>this.addWallPaper(e)));return Promise.all(t)})),a=(0,P.R)(this.scrollable),o=this.grid=document.createElement("div");return o.classList.add("grid"),(0,r.fc)(o,this.onGridClick,{listenerSetter:this.listenerSetter}),a.append(o),n}getWallPaperKey(e){return""+e.id}getWallPaperKeyFromTheme(e){var t;return""+(this.getWallPaperKey(null===(t=e.settings)||void 0===t?void 0:t.wallpaper)||"")}static addWallPaper(e,t=document.createElement("div")){var i;const s=(0,l.EM)(e),n="wallPaper"===e._;if(n&&e.pFlags.pattern&&!s)return;const a=!!e.pFlags.dark;let o=n?e.document:void 0;n&&!o&&(o={_:"webDocumentNoProxy",attributes:[],size:1e5,url:"assets/img/pattern.svg",w:1440,h:2960,mime_type:"image/svg+xml"}),t.classList.add("background-item"),t.dataset.id=""+e.id;const r=document.createElement("div");r.classList.add("background-item-media");const d=[];let c,h;if(n){h=(0,k.Z)(o,200,200),c=(0,F.Z)({photo:o,message:null,container:r,withoutPreloader:!0,size:h,noFadeIn:e.pFlags.pattern}),e.pFlags.pattern&&r.classList.add("is-pattern");const i=c.then((({loadPromises:e,images:t})=>R(this,void 0,void 0,(function*(){return(yield e.thumb)||e.full,t})))).then((i=>{var s;return e.pFlags.pattern&&(a?(i.full.style.display="none",i.thumb&&(i.thumb.style.display="none")):(null===(s=e.settings)||void 0===s?void 0:s.intensity)&&(i.full.style.opacity=""+Math.abs(e.settings.intensity)/100)),u.Z.mutate((()=>{t.append(r)}))}));d.push(i)}else t.append(r);if(null===(i=e.settings)||void 0===i?void 0:i.background_color){const{canvas:t}=p.Z.create(s);if(t.classList.add("background-colors-canvas"),a&&n){const i=c.then((({loadPromises:i})=>i.full.then((()=>R(this,void 0,void 0,(function*(){const i=yield g.Z.managers.thumbsStorage.getCacheContext(o,h.type);t.style.webkitMaskImage=`url(${i.url})`,t.style.opacity=""+(e.pFlags.dark?100+e.settings.intensity:e.settings.intensity)/100,r.append(t)}))))));d.push(i)}else r.append(t)}return{container:t,media:r,loadPromise:Promise.all(d)}}addWallPaper(e,t=!0){const i=B.addWallPaper(e);if(i){const{container:s,media:n}=i;s.classList.add("grid-item"),n.classList.add("grid-item-media");const a=this.getWallPaperKey(e);this.wallPapersByElement.set(s,e),this.elementsByKey.set(a,s),this.getWallPaperKeyFromTheme(this.theme)===a&&s.classList.add("active"),this.grid[t?"append":"prepend"](s)}return i&&i.loadPromise.then((()=>i))}}T=B,B.tempId=0,B.setBackgroundDocument=(e,t)=>{const i=++T.tempId,r=()=>i===T.tempId,d=e.document,h=(0,o.Z)();let u;d?(u=f.Z.downloadMediaURL({media:d,queueId:m.ZP.chat.bubbles?m.ZP.chat.bubbles.lazyLoadQueue.queueId:0}),h.addNotifyListener=u.addNotifyListener,h.cancel=u.cancel):u=Promise.resolve();const v=(e,t)=>{fetch(t).then((t=>{m.ZP.cacheStorage.save("backgrounds/"+e,t)}))};return u.then((()=>R(void 0,void 0,void 0,(function*(){var i,o,u;if(!r())return void h.resolve();const f=!!t;null!=t||(t=C.Z.getTheme().settings);const b=i=>{var a;let o;const d=(0,l.EM)(e);if(i&&!d)o=function(e){const t=document.createElement("img");return(0,s.cj)(t,e,!1).then((()=>function(e,t,i){const s=document.createElement("canvas"),a=t/i;return 1===a?(s.width=50,s.height=s.width/a):a>1?(s.height=50,s.width=s.height/a):s.width=s.height=50,s.getContext("2d").drawImage(e,0,0,t,i,0,0,s.width,s.height),n(s)}(t,t.naturalWidth,t.naturalHeight)))}(i);else{const{canvas:e}=p.Z.create(d);o=Promise.resolve(n(e))}const u=null!==(a=e.slug)&&void 0!==a?a:"";Promise.all([o,u&&v(u,i)]).then((([s])=>{if(!r())return void h.resolve();const n=c(Array.from(s));t.wallpaper=e,t.highlightningColor=n,f||g.Z.managers.appStateManager.pushToState("settings",g.Z.settings),m.ZP.applyCurrentTheme(u,i,!0).then(h.resolve)}))};if(!d)return void b();const y=yield g.Z.managers.thumbsStorage.getCacheContext(d);(null===(u=null===(o=null===(i=t.wallpaper)||void 0===i?void 0:i.settings)||void 0===o?void 0:o.pFlags)||void 0===u?void 0:u.blur)?setTimeout((()=>{const{canvas:e,promise:t}=(0,a.Z)(y.url,12,4);t.then((()=>{r()?b(e.toDataURL()):h.resolve()}))}),200):r()&&b(y.url)})))),h}},534:(e,t,i)=>{"use strict";i.d(t,{Z:()=>T});var s=i(8130),n=i(1447),a=i(3552),o=i(2796),r=i(503),d=i(2230),l=i(5322),c=i(4494),h=i(5644),u=i(9807),p=i(2325),f=i(8479),m=i(7625),g=i(130),v=i(8115),b=i(1507),y=i(3512),w=i(2738),S=i(5029),C=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class L extends a._{constructor(){super(...arguments),this.renderResults=e=>C(this,void 0,void 0,(function*(){yield this.managers.appUsersManager.getContacts(),e.forEach((e=>{const{dom:t}=s.default.addDialogNew({peerId:e,container:this.selector.scrollable,rippleEnabled:!0,avatarSize:"abitbigger"}),i=this.selector.selected.has(e);t.containerEl.append(this.checkbox(i));const n=[];this.dialogsByFilters.forEach(((t,i)=>{if(t.has(e)){const e=document.createElement("span");(0,g.Z)(e,(0,v.Z)(i.title)),n.push(e)}})),(0,p.v_)(n,!1).forEach((e=>{t.lastMessageSpan.append(e)}))}))})),this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(e,t,i){this.originalFilter=e,this.filter=(0,f.Z)(this.originalFilter),this.type=t,this.editFolderTab=i,this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=(0,d.Z)("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),(0,w.fc)(this.confirmBtn,(()=>C(this,void 0,void 0,(function*(){const e=this.selector.getSelected();if("included"===this.type)for(const e in this.filter.pFlags)0!==e.indexOf("exclude_")&&delete this.filter.pFlags[e];else for(const e in this.filter.pFlags)0===e.indexOf("exclude_")&&delete this.filter.pFlags[e];const t=[];for(const i of e)i.isPeerId()?t.push(i.toPeerId()):this.filter.pFlags[i]=!0;let i;i="included"===this.type?e=>t.includes(e):e=>!t.includes(e),(0,m.Z)(this.filter.pinnedPeerIds,((e,t)=>{i(e)||(this.filter.pinnedPeerIds.splice(t,1),this.filter.pinned_peers.splice(t,1))}));const s="included"===this.type?"excludePeerIds":"includePeerIds",n="included"===this.type?"exclude_peers":"include_peers";(0,m.Z)(this.filter[s],((e,i)=>{t.includes(e)&&(this.filter[s].splice(i,1),this.filter[n].splice(i,1))})),this.filter["included"===this.type?"includePeerIds":"excludePeerIds"]=t,this.filter["included"===this.type?"include_peers":"exclude_peers"]=yield Promise.all(t.map((e=>this.managers.appPeersManager.getInputPeerById(e)))),this.editFolderTab.setFilter(this.filter,!1),this.close()}))),{listenerSetter:this.listenerSetter});const s=e=>{this.limit=y.Z.premium?e.dialog_filters_chats_limit_premium:e.dialog_filters_chats_limit_default};return this.listenerSetter.add(y.Z)("app_config",s),this.dialogsByFilters=new Map,Promise.all([this.managers.filtersStorage.getDialogFilters().then((e=>C(this,void 0,void 0,(function*(){yield Promise.all(e.filter((e=>!b.DZ.has(e.id))).map((e=>C(this,void 0,void 0,(function*(){const t=(yield this.managers.dialogsStorage.getFolderDialogs(e.id)).map((e=>e.peerId));this.dialogsByFilters.set(e,new Set(t))})))))})))),this.managers.apiManager.getAppConfig().then((e=>{s(e)}))])}checkbox(e){const t=new u.Z({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=new S.Z({noDelimiter:!0,name:"FilterChatTypes"});let i;t.container.classList.add("folder-categories"),i="excluded"===this.type?{exclude_muted:{ico:"mute",text:"ChatList.Filter.MutedChats"},exclude_archived:{ico:"archive",text:"ChatList.Filter.Archive"},exclude_read:{ico:"readchats",text:"ChatList.Filter.ReadChats"}}:{contacts:{ico:"newprivate",text:"ChatList.Filter.Contacts"},non_contacts:{ico:"noncontacts",text:"ChatList.Filter.NonContacts"},groups:{ico:"group",text:"ChatList.Filter.Groups"},broadcasts:{ico:"newchannel",text:"ChatList.Filter.Channels"},bots:{ico:"bots",text:"ChatList.Filter.Bots"}};const s=document.createDocumentFragment();for(const e in i){const t=(0,c.Z)("btn-primary btn-transparent folder-category-button",{icon:i[e].ico,text:i[e].text});t.dataset.peerId=e,t.append(this.checkbox()),s.append(t)}t.content.append(s);const n=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new h.Z({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search",sectionNameLangPackKey:"FilterChats",managers:this.managers}),this.selector.selected=new Set(n);let a=!1;const r=this.selector.add.bind(this.selector);this.selector.add=(e,t,s)=>{if(this.selector.selected.size>=this.limit&&a&&!i[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);t&&setTimeout((()=>{t.checked=!1}),0);const i=p.ZP.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0);return void(0,o.Am)(i)}const n=r(e,i[e]?(0,p.ag)(i[e].text):void 0,s);return i[e]&&n.querySelector("avatar-element").classList.add("tgico-"+i[e].ico),n},this.selector.scrollable.container.append(t.container,this.selector.scrollable.container.lastElementChild),this.selector.addInitial(n),a=!0;for(const s in e.pFlags)i.hasOwnProperty(s)&&e.pFlags[s]&&(0,w.tH)(t.content.querySelector(`[data-peer-id="${s}"]`))}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}}var E=i(8127),I=i(6848),M=i(3066),P=i(2353),Z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class T extends a._{constructor(){super(...arguments),this.flags={}}static getInitArgs(){return{animationData:n.Z.loadAnimationFromURLManually("Folders_2")}}init(e=T.getInitArgs()){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append((0,p.ag)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=(0,d.Z)("check btn-confirm hide blue");let t=!1;const i={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new E.Z("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{t||(t=!0,this.managers.filtersStorage.updateDialogFilter(this.filter,!0).then((e=>{this.close()})).finally((()=>{t=!1})))},isDanger:!0}]}).show()}};this.menuBtn=(0,l.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[i]}),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const s=new S.Z({}),a=document.createElement("div");a.classList.add("input-wrapper"),this.nameInputField=new r.ZP({label:"FilterNameHint",maxLength:12}),a.append(this.nameInputField.container),s.content.append(a);const h=(e,t,i,s)=>{const n=new S.Z({name:t,noDelimiter:!0});n.container.classList.add("folder-list",e);const a=n.generateContentElement();return a.classList.add("folder-categories"),i.forEach((e=>{const t=(0,c.Z)("folder-category-button btn btn-primary btn-transparent",{icon:e.icon,text:e.text,noRipple:!e.withRipple||void 0});e.name&&(s[e.name]=t),a.append(t)})),n};this.includePeerIds=h("folder-list-included","FilterInclude",[{icon:"add primary",text:"ChatList.Filter.Include.AddChat",withRipple:!0},{text:"ChatList.Filter.Contacts",icon:"newprivate",name:"contacts"},{text:"ChatList.Filter.NonContacts",icon:"noncontacts",name:"non_contacts"},{text:"ChatList.Filter.Groups",icon:"group",name:"groups"},{text:"ChatList.Filter.Channels",icon:"channel",name:"broadcasts"},{text:"ChatList.Filter.Bots",icon:"bots",name:"bots"}],this.flags),this.excludePeerIds=h("folder-list-excluded","FilterExclude",[{icon:"minus primary",text:"ChatList.Filter.Exclude.AddChat",withRipple:!0},{text:"ChatList.Filter.MutedChats",icon:"mute",name:"exclude_muted"},{text:"ChatList.Filter.Archive",icon:"archive",name:"exclude_archived"},{text:"ChatList.Filter.ReadChats",icon:"readchats",name:"exclude_read"}],this.flags),this.scrollable.append(this.stickerContainer,this.caption,s.container,this.includePeerIds.container,this.excludePeerIds.container);const u=this.includePeerIds.container.querySelector(".folder-categories"),f=this.excludePeerIds.container.querySelector(".folder-categories");(0,w.fc)(u.querySelector(".btn"),(()=>{this.slider.createTab(L).open(this.filter,"included",this)}),{listenerSetter:this.listenerSetter}),(0,w.fc)(f.querySelector(".btn"),(()=>{this.slider.createTab(L).open(this.filter,"excluded",this)}),{listenerSetter:this.listenerSetter}),(0,w.fc)(this.confirmBtn,(()=>{if(this.nameInputField.input.classList.contains("error"))return;if(!this.nameInputField.value.trim())return void this.nameInputField.input.classList.add("error");let e,t=Array.from(u.children).slice(1).reduce(((e,t)=>e+ +!t.style.display),0);t+=this.filter.include_peers.length,t?(this.confirmBtn.setAttribute("disabled","true"),e=this.filter.id?this.managers.filtersStorage.updateDialogFilter(this.filter):this.managers.filtersStorage.createDialogFilter(this.filter),e.then((e=>{this.close()})).catch((e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?(0,o.Am)("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)})).finally((()=>{this.confirmBtn.removeAttribute("disabled")}))):(0,o.Am)("Please choose at least one chat for this folder.")}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.nameInputField.input)("input",(()=>{this.filter.title=this.nameInputField.value,this.editCheckForChange()}));const m="edit"===this.type?[this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"pinned_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"include_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"exclude_peers")]:[];return Promise.all([this.loadAnimationPromise=e.animationData.then((e=>Z(this,void 0,void 0,(function*(){const t=yield e({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86});return this.animation=t,n.Z.waitForFirstFrame(t)})))),...m]).then((()=>{"edit"===this.type?(this.setFilter(this.originalFilter,!0),this.onEditOpen()):(this.setInitFilter(),this.onCreateOpen())}))}onOpenAfterTimeout(){this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()}))}onCreateOpen(){this.setTitle("FilterNew"),this.menuBtn.classList.add("hide"),this.confirmBtn.classList.remove("hide");for(const e in this.flags)this.flags[e].style.display="none"}onEditOpen(){this.setTitle("create"===this.type?"FilterNew":"FilterHeaderEdit"),"edit"===this.type&&(this.menuBtn.classList.remove("hide"),this.confirmBtn.classList.add("hide"));const e=this.filter;this.nameInputField.value=(0,M.Z)(e.title);for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach((t=>Z(this,void 0,void 0,(function*(){const i=this[t],n=s.default.createChatList({ignoreClick:!0});let a=e[t];const o=e=>Z(this,void 0,void 0,(function*(){return!!(yield this.managers.appMessagesManager.getDialogOnly(e))||!!e.isUser()&&"user"===(yield this.managers.appUsersManager.getUser(e.toUserId()))._})),r=yield(0,P.Z)(a,(e=>o(e)));a.length=0,a.push(...r),a=a.slice();const d=e=>Z(this,void 0,void 0,(function*(){for(let t=0,i=Math.min(a.length,e);td(20)),{listenerSetter:this.listenerSetter}),l.append((0,p.ag)("FilterShowMoreChats",[a.length])),e.append(l)}d(4)}))))}editCheckForChange(){if("edit"===this.type){const e=!(0,I.Z)(this.originalFilter,this.filter);this.confirmBtn.classList.toggle("hide",!e),this.menuBtn.classList.toggle("hide",e)}}setFilter(e,t){this.container&&Array.from(this.container.querySelectorAll("ul, .load-more")).forEach((e=>e.remove())),t?(this.originalFilter=e,this.filter=(0,f.Z)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}setInitFilter(e){void 0===e?(this.setFilter({_:"dialogFilter",id:0,title:"",pFlags:{},pinned_peers:[],include_peers:[],exclude_peers:[],pinnedPeerIds:[],includePeerIds:[],excludePeerIds:[]},!0),this.type="create"):(this.setFilter(e,!0),this.type="edit")}}},2010:(e,t,i)=>{"use strict";i.d(t,{J:()=>f,Z:()=>m});var s=i(503),n=i(3552),a=i(2621),o=i(6726),r=i(2325),d=i(2738),l=i(3512),c=i(2521),h=i(6082),u=i(5029),p=i(9522);function f(){const e=document.createElement("div"),t=(0,c.Z)(document.createElement("a")),i=(0,r.ag)("Username.Purchase",[t]);return i.classList.add("username-purchase-help"),e.append(i,document.createElement("br"),document.createElement("br")),e.classList.add("hide"),{element:e,setUsername:i=>{i&&(t.href="https://fragment.com/username/"+i),e.classList.toggle("hide",!i)}}}class m extends n._{static getInitArgs(){return{bioMaxLength:l.Z.managers.apiManager.getLimit("bio"),user:l.Z.managers.appUsersManager.getSelf(),userFull:l.Z.managers.appProfileManager.getProfile(l.Z.myId.toUserId())}}init(e){return t=this,i=void 0,c=function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const t=[],[i,n,c]=yield Promise.all([e.bioMaxLength,e.user,e.userFull]);{const e=(0,u.R)(this.scrollable,void 0,"Bio.Description"),n=document.createElement("div");n.classList.add("input-wrapper"),this.firstNameInputField=new s.ZP({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new s.ZP({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new s.ZP({label:"EditProfile.BioLabel",name:"bio",maxLength:i}),n.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const o=document.createElement("div");o.classList.add("caption"),(0,r.XZ)({element:o,key:"Bio.Description"}),t.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.editPeer=new a.Z({peerId:l.Z.myId,inputFields:t,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),e.append(this.editPeer.avatarEdit.container,n)}{const e=new u.Z({name:"EditAccount.Username",caption:!0}),i=document.createElement("div");i.classList.add("input-wrapper"),this.usernameInputField=new o.l({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange();const{error:e}=this.usernameInputField,t="USERNAME_PURCHASE_AVAILABLE"===(null==e?void 0:e.type);n(t?this.usernameInputField.value:void 0)},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"},this.managers),i.append(this.usernameInputField.container);const s=e.caption,{setUsername:n,element:a}=f();s.append(a,(0,r.ag)("UsernameHelp")),t.push(this.usernameInputField),e.content.append(i),this.scrollable.append(e.container)}{const e=new p.Z({peerId:l.Z.myId,peer:n,listenerSetter:this.listenerSetter,usernameInputField:this.usernameInputField,middleware:this.middlewareHelper.get()});this.scrollable.append(e.container)}(0,d.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;const e=[],t=this.managers.appProfileManager.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value);e.push(t.then((()=>{this.close()}),(e=>{console.error("updateProfile error:",e)}))),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))),this.usernameInputField.isValidToChange()&&e.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value)),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled")}))}),{listenerSetter:this.listenerSetter}),this.firstNameInputField.setOriginalValue(n.first_name,!0),this.lastNameInputField.setOriginalValue(n.last_name,!0),this.bioInputField.setOriginalValue(c.about,!0),this.usernameInputField.setOriginalValue((0,h.Z)(n),!0),this.editPeer.handleChange()},new((n=void 0)||(n=Promise))((function(e,s){function a(e){try{r(c.next(e))}catch(e){s(e)}}function o(e){try{r(c.throw(e))}catch(e){s(e)}}function r(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(a,o)}r((c=c.apply(t,i||[])).next())}));var t,i,n,c}}},4332:(e,t,i)=>{"use strict";i.d(t,{HQ:()=>d,ZP:()=>h});var s=i(4271),n=i(3552),a=i(4755),o=i(1669),r=i(410);const d="is-right-column-shown";class l extends n.Z{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1}construct(e){this.managers=e,a.Z.addEventListener("changeScreen",((e,t)=>{t===a._.medium&&e!==a._.mobile&&this.toggleSidebar(!1)})),a.Z.addEventListener("resize",(()=>{this.setColumnProportion()}))}createSharedMediaTab(){const e=this.createTab(o.Z,!1,!0);return e.slider=this,e}replaceSharedMediaTab(e){const t=this.sharedMediaTab;if(t){const i=this.historyTabIds.indexOf(t);this._selectTab.getFrom()===t.container&&this._selectTab.setFrom(null==e?void 0:e.container),e?(-1!==i&&(this.historyTabIds[i]=e),t.container.classList.contains("active")&&e.container.classList.add("active"),t.container.replaceWith(e.container)):(-1!==i&&this.historyTabIds.splice(i,1),t.container.remove())}else this.tabsContainer.prepend(e.container);this.sharedMediaTab=e}onCloseTab(e,t,i){this.historyTabIds.length||this.toggleSidebar(!1,t),super.onCloseTab(e,t,i)}setColumnProportion(){const e=this.sidebarEl.scrollWidth/this.sidebarEl.previousElementSibling.scrollWidth;document.documentElement.style.setProperty("--right-column-proportion",""+e)}toggleSidebar(e,t){const i=document.body.classList.contains(d);let n;if(void 0!==e?e?i||(n=!0):i&&(n=!0):n=!0,!n)return Promise.resolve();i||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const a=s.ZP.selectTab(i?s.oo.CHAT:s.oo.PROFILE,t);return document.body.classList.toggle(d,e),a}}const c=new l;r.GO.appSidebarRight=c;const h=c},4240:(e,t,i)=>{"use strict";i.d(t,{Z:()=>S});var s=i(3552),n=i(503),a=i(2621),o=i(7479),r=i(9807),d=i(4494),l=i(8842),c=i(3512),h=i(8127),u=i(1168),p=i(2325),f=i(2738),m=i(1656),g=i(2946),v=i(8210),b=i(5029),y=i(7362),w=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class S extends s._{init(){return w(this,void 0,void 0,(function*(){const{peerId:e}=this,t=e.toUserId();this.container.classList.add("edit-peer-container","edit-contact-container");const[i,s]=yield Promise.all([this.managers.appUsersManager.isContact(t),this.managers.appPrivacyManager.getPrivacy("inputPrivacyKeyPhoneNumber")]),S=!i;this.setTitle(S?"AddContactTitle":"Edit");{const i=new b.Z({noDelimiter:!0}),s=[],d=document.createElement("div");if(d.classList.add("input-wrapper"),this.nameInputField=new n.ZP({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new n.ZP({label:"LastName",name:"contact-lastname",maxLength:70}),t){const e=yield this.managers.appUsersManager.getUser(t);S?(this.nameInputField.setDraftValue(e.first_name),this.lastNameInputField.setDraftValue(e.last_name)):(this.nameInputField.setOriginalValue(e.first_name),this.lastNameInputField.setOriginalValue(e.last_name))}if(d.append(this.nameInputField.container,this.lastNameInputField.container),s.push(this.nameInputField,this.lastNameInputField),this.editPeer=new a.Z({peerId:e,inputFields:s,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),e){const s=document.createElement("div");s.classList.add("avatar-edit"),s.append(this.editPeer.avatarElem);const n=new r.Z({text:"Notifications"});n.input.addEventListener("change",(t=>{t.isTrusted&&this.managers.appMessagesManager.togglePeerMute({peerId:e})})),this.listenerSetter.add(c.Z)("notify_settings",(e=>w(this,void 0,void 0,(function*(){if("notifyPeer"!==e.peer._)return;const t=(0,g.Z)(e.peer.peer);if(t==t){const t=!(yield this.managers.appNotificationsManager.isMuted(e.notify_settings));t!==n.checked&&(n.checked=t)}}))));const a=document.createElement("div");a.classList.add("profile-name"),a.append(new l.Z({peerId:e}).element);const h=document.createElement("div");if(h.classList.add("profile-subtitle"),h.append((0,p.ag)("EditContact.OriginalName")),i.content.append(s,a,h,d),S){const s=yield this.managers.appUsersManager.getUser(t),n=new o.ZP({icon:"phone",titleLangKey:s.phone?void 0:"MobileHidden",title:s.phone?(0,v.Z)(s.phone):void 0,subtitleLangKey:s.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:s.phone?void 0:[new l.Z({peerId:e}).element]});i.content.append(n.container)}else{const t=new o.ZP({checkboxField:n,withCheckboxSubtitle:!0,listenerSetter:this.listenerSetter}),s=!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1}));n.checked=s,i.content.append(t.container)}}else i.content.append(d);this.scrollable.append(i.container)}if(S){if(s.some((e=>"privacyValueDisallowAll"===e._))&&!s.some((e=>"privacyValueAllowUsers"===e._&&e.users.includes(t)))){const e=new b.Z({caption:"NewContact.Exception.ShareMyPhoneNumber.Desc",captionArgs:[yield(0,y.Z)({peerId:this.peerId})]}),t=this.sharePhoneCheckboxField=new r.Z({text:"NewContact.Exception.ShareMyPhoneNumber",checked:!0}),i=(0,o.tG)(t);e.content.append(i.container),this.scrollable.append(e.container)}}else{const i=new b.Z,s=(0,d.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});(0,f.fc)(s,(()=>{new h.Z("popup-delete-contact",{peerId:e,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:(0,u.x)([{langKey:"Delete",callback:()=>{const e=(0,m.Z)([s],!0);this.managers.appUsersManager.deleteContacts([t]).then((()=>{this.close()}),(()=>{e()}))},isDanger:!0}])}).show()}),{listenerSetter:this.listenerSetter}),i.content.append(s),this.scrollable.append(i.container)}(0,f.fc)(this.editPeer.nextBtn,(()=>w(this,void 0,void 0,(function*(){var e;this.editPeer.nextBtn.disabled=!0,this.managers.appUsersManager.addContact(t,this.nameInputField.value,this.lastNameInputField.value,(yield this.managers.appUsersManager.getUser(t)).phone,null===(e=this.sharePhoneCheckboxField)||void 0===e?void 0:e.checked).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}))),{listenerSetter:this.listenerSetter})}))}}},730:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C});var s=i(2738),n=i(1656),a=i(9405),o=i(8479),r=i(6848),d=i(4271),l=i(1507),c=i(3785),h=i(2230),u=i(9807),p=i(6039),f=i(503),m=i(7479),g=i(5029),v=i(744),b=i(6024),y=i(9345),w=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const S=(0,a.C)(64,64);class C extends b.Z{init(e,t){return w(this,void 0,void 0,(function*(){this.colorIndex=0;const i=!t,a=t===l.Ox;this.container.classList.add("edit-topic-container"),this.setTitle(i?"NewTopic":"ForumTopic.Title.Edit");const r=e.toChatId();t&&(this.topic=this.originalTopic=(0,o.Z)(yield this.managers.dialogsStorage.getForumTopic(e,t)));{const i=new g.Z({name:a?"CreateGeneralTopicTitle":"CreateTopicTitle"}),o=this.iconDiv=document.createElement("div");o.classList.add("edit-topic-icon-container"),!t&&(0,s.fc)(o,(()=>{this.topic.icon_emoji_id||(this.colorIndex=(this.colorIndex+1)%l.OS.length,this.setIcon())}),{listenerSetter:this.listenerSetter}),t&&o.classList.add("disable-hover");const c=document.createElement("div");c.classList.add("input-wrapper");const u=this.nameInputField=new f.ZP({label:"ForumTopic.Name.Placeholder",withLinebreaks:!1,name:"topic-name",maxLength:70,required:!0});this.topic&&u.setOriginalValue(this.topic.title,!0);const p=this.confirmBtn=(0,h.Z)("check btn-confirm blue hide",{noRipple:!0});this.header.append(p),(0,s.fc)(p,(()=>{const i=(0,n.Z)([p],!0);t?this.managers.appChatsManager.editForumTopic({chatId:r,topicId:t,title:u.value,iconEmojiId:this.topic.icon_emoji_id||0}).then((()=>{this.close()})).catch((e=>{console.error("edit topic error",e),i()})):this.managers.appChatsManager.createForumTopic({chatId:r,iconColor:l.OS[this.colorIndex],iconEmojiId:this.topic.icon_emoji_id,title:u.value}).then((t=>{this.close(),d.ZP.setInnerPeer({peerId:e,threadId:t})})).catch((e=>{console.error("create topic error",e),i()}))}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(u.input)("input",(()=>{var e;this.validate(),this.setIcon(null===(e=this.topic)||void 0===e?void 0:e.icon_emoji_id)})),c.append(u.container),i.content.append(o,c),this.scrollable.append(i.container)}const c=[];if(a){const e=new g.Z({caption:"EditTopicHideInfo"}),i=new u.Z({checked:!this.topic.pFlags.hidden,text:"EditTopicHide"});this.listenerSetter.add(i.input)("change",(()=>{const e=this.managers.appChatsManager.editForumTopic({chatId:r,topicId:t,hidden:!i.checked});s.disableWithPromise(e)}));const s=new m.ZP({checkboxField:i});e.content.append(s.container),this.scrollable.append(e.container)}else{const e=new g.Z({});e.container.classList.add("edit-topic-emoticons-container");const t=new p.ZP({managers:this.managers,isStandalone:!0,noRegularEmoji:!0,stickerSetId:"inputStickerSetEmojiDefaultTopicIcons",onClick:e=>{t.setActive(e.docId?e:{emoji:void 0,docId:void 0}),this.setIcon(e.docId)}});t.getContainerSize=()=>({width:v.ZP.rect.width,height:400}),this.middlewareHelper.onDestroy((()=>{t.destroy()})),t.container.classList.remove("tabs-tab"),this.emojiElement=document.createElement("span"),this.emojiElement.classList.add("super-emoji-topic-icon");const i=t.init().then((()=>w(this,void 0,void 0,(function*(){var e;const i=t.getCustomCategory(),s=null===(e=this.topic)||void 0===e?void 0:e.icon_emoji_id;t.addEmojiToCategory({category:i,element:this.emojiElement,batch:!1,prepend:!0,active:!s}),s&&t.setActive({docId:s,emoji:""})}))));c.push(i),e.content.replaceWith(t.container),this.scrollable.append(e.container)}return Promise.all(c).then((()=>this.s()))}))}validate(){let e=this.nameInputField.isValidToChange();!e&&this.originalTopic&&(e=this.topic.icon_emoji_id!==this.originalTopic.icon_emoji_id),this.confirmBtn.classList.toggle("hide",!e)}s(){var e,t;return(null===(e=this.topic)||void 0===e?void 0:e.icon_color)&&(this.colorIndex=l.OS.indexOf(this.topic.icon_color)),this.setIcon(null===(t=this.topic)||void 0===t?void 0:t.icon_emoji_id,void 0,!0)}setIcon(e,t=this.iconDiv,i){var s;return w(this,void 0,void 0,(function*(){const n=this.nameInputField.value,a=t===this.iconDiv;if(a){const t={id:null===(s=this.topic)||void 0===s?void 0:s.id,icon_color:l.OS[this.colorIndex],title:(0,c.Z)(n,!0).text||"A",icon_emoji_id:e},a=this.topic;if(this.topic=t,!i&&a&&a.icon_color===t.icon_color&&a.title===t.title||this.setIcon(void 0,this.emojiElement),(0,r.Z)(a,t)&&!i)return;this.validate()}const o=yield(0,y.e)({topic:a?this.topic:Object.assign(Object.assign({},this.topic),{icon_emoji_id:void 0}),customEmojiSize:S,middleware:this.middlewareHelper.get()}),d=document.createElement("div");d.classList.add("edit-topic-icon"),d.append(o);const h=t.lastElementChild;t.append(d);const u=(e,t)=>{const i=e.animate([{opacity:"0",transform:"scale(0.8)"},{opacity:"1",transform:"scale(1)"}],{duration:200,iterations:1,easing:"ease-in-out",fill:"forwards",direction:t?"normal":"reverse"});return new Promise((e=>{i.addEventListener("finish",(()=>{e()}),{once:!0})}))};h&&u(h,!1).then((()=>h.remove())),u(d,!0)}))}}},1669:(e,t,i)=>{"use strict";i.d(t,{Z:()=>de});var s=i(3512),n=i(6360),a=i(3552),o=i(426),r=i(503),d=i(2621),l=i(7479),c=i(4494),h=i(2166),u=i(144),p=i(279),f=i(1218),m=i(2796),g=i(6726),v=i(6024),b=i(2325),y=i(8127),w=i(8119),S=i(2738),C=i(1656),L=i(9807),E=i(5029),I=i(9522),M=i(6082),P=i(5102),Z=i(2010),T=i(5592),k=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class x extends v.h{init(){return k(this,void 0,void 0,(function*(){this.container.classList.add("edit-peer-container","group-type-container");const e=yield this.managers.appChatsManager.isBroadcast(this.chatId);this.setTitle(e?"ChannelType":"GroupType");const t=new E.Z({name:e?"ChannelType":"GroupType"}),i=(0,u.a)(),n=new l.ZP({radioField:new f.Z({langKey:e?"ChannelPrivate":"MegaPrivate",name:i,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),a=new l.ZP({radioField:new f.Z({langKey:e?"ChannelPublic":"MegaPublic",name:i,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),o=(0,l.De)([n,a],(e=>{const t=[[v.container],[H]];"public"===e&&t.reverse(),t[0].forEach((e=>e.classList.remove("hide"))),t[1].forEach((e=>e.classList.add("hide"))),R()}));let r=yield this.managers.appChatsManager.getChat(this.chatId);const d={basic:[]};this.listenerSetter.add(s.Z)("chat_update",(e=>k(this,void 0,void 0,(function*(){this.chatId===e&&(r=yield this.managers.appChatsManager.getChat(this.chatId),d.basic.forEach((e=>e())))})))),t.content.append(o);const v=new E.Z({}),x=new l.ZP({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{(0,h.T)(this.chatFull.exported_invite.link),(0,m.Am)(b.ZP.format("LinkCopied",!0))},listenerSetter:this.listenerSetter}),A=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});(0,S.fc)(A,(()=>{new y.Z("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=(0,C.Z)([A],!0);this.managers.appProfileManager.getChatInviteLink(this.chatId,!0).then((t=>{e(),x.title.innerHTML=t}))}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()}),{listenerSetter:this.listenerSetter}),v.content.append(x.container,A);const _=new E.Z({caption:!0,noDelimiter:!0}),F=document.createElement("div");F.classList.add("input-wrapper");const D="t.me/",R=()=>{const e=n.radioField.checked&&z!==D||B.isValidToChange()&&B.input.classList.contains("valid");j.classList.toggle("is-visible",e);const{error:t}=B,i="USERNAME_PURCHASE_AVAILABLE"===(null==t?void 0:t.type);N(i?B.getValue():void 0)},B=new g.l({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:R,peerId:this.chatId.toPeerId(!0),head:D},this.managers),{setUsername:N,element:O}=(0,Z.J)();_.caption.append(O,(0,b.ag)(e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup"));const U=new I.Z({peerId:this.chatId.toPeerId(!0),peer:r,listenerSetter:this.listenerSetter,usernameInputField:B,middleware:this.middlewareHelper.get()}),H=document.createElement("div");H.append(_.container,U.container);const z=D+((0,M.Z)(r)||"");F.append(B.container),_.content.append(F);const j=(0,w.Z)({icon:"check",className:"is-visible"});this.content.append(j),(0,S.fc)(j,(()=>k(this,void 0,void 0,(function*(){const t=a.radioField.checked?B.getValue():"";if(!t){const t=yield this.managers.appChatsManager.getChat(this.chatId),i=(0,M.Z)(t);i&&(yield(0,T.Z)({descriptionLangKey:e?"ChannelVisibility.Confirm.MakePrivate.Channel":"ChannelVisibility.Confirm.MakePrivate.Group",descriptionLangArgs:[i],button:{langKey:"OK"}}))}(0,p.p)(j),this.managers.appChatsManager.migrateChat(this.chatId).then((e=>t?this.managers.appChatsManager.updateUsername(e,t):this.managers.appChatsManager.makeChannelPrivate(e))).then((()=>{this.close()}))}))),{listenerSetter:this.listenerSetter}),(z!==D||(0,P.Z)(r).length?a:n).radioField.checked=!0,B.setOriginalValue(z,!0),this.scrollable.append(t.container,v.container,H);{const t=new E.Z({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),i=new L.Z({text:"RestrictSavingContent",withRipple:!0});this.listenerSetter.add(i.input)("change",(()=>{const e=i.toggleDisability(!0);this.managers.appChatsManager.toggleNoForwards(this.chatId,i.checked).then((()=>{e()}))}));const s=()=>{i.setValueSilently(!!r.pFlags.noforwards)};((e,t="basic")=>{d[t].push(e)})(s),s(),t.content.append(i.label),this.scrollable.append(t.container)}}))}}var A=i(4668),_=i(5565),F=i(8936),D=i(8130),R=i(8479),B=i(7120),N=i(2946),O=i(2995),U=i(6848),H=i(3061);class z extends v.h{init(){return e=this,t=void 0,s=function*(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new E.Z({name:"UserRestrictionsCanDo"}),i=document.createElement("div");i.classList.add("chatlist-container"),t.content.insertBefore(i,t.title);const s=D.default.createChatList({new:!0});i.append(s);const{dom:n}=D.default.addDialogNew({peerId:this.userId.toPeerId(!1),container:s,rippleEnabled:!0,avatarSize:"abitbigger"});n.lastMessageSpan.append((0,H.Z)(yield this.managers.appUsersManager.getUser(this.userId)));const a=new G({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content,participant:"channelParticipantBanned"===this.participant._?this.participant:void 0},this.managers);e=()=>{const e=a.takeOut();"channelParticipantBanned"===this.participant._&&(0,U.Z)(this.participant.banned_rights.pFlags,e.pFlags)||this.managers.appChatsManager.editBanned(this.chatId,this.participant,e)},this.eventListener.addEventListener("destroy",e,{once:!0}),this.scrollable.append(t.container)}{const t=new E.Z({});if("channelParticipantBanned"===this.participant._){const i=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});(0,S.fc)(i,(()=>{const t=(0,C.Z)([i],!0);this.managers.appChatsManager.clearChannelParticipantBannedRights(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}),(()=>{t()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i)}const i=(0,c.Z)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});(0,S.fc)(i,(()=>{(0,C.Z)([i],!0),this.managers.appChatsManager.kickFromChannel(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container)}},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var j=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class G{constructor(e,t){this.options=e,this.managers=t,this.construct()}construct(){return j(this,void 0,void 0,(function*(){this.v=[{flags:["send_messages"],text:"UserRestrictionsSend",exceptionText:"UserRestrictionsNoSend"},{flags:["send_media"],text:"UserRestrictionsSendMedia",exceptionText:"UserRestrictionsNoSendMedia"},{flags:["send_stickers","send_gifs"],text:"UserRestrictionsSendStickers",exceptionText:"UserRestrictionsNoSendStickers"},{flags:["send_polls"],text:"UserRestrictionsSendPolls",exceptionText:"UserRestrictionsNoSendPolls"},{flags:["embed_links"],text:"UserRestrictionsEmbedLinks",exceptionText:"UserRestrictionsNoEmbedLinks"},{flags:["invite_users"],text:"UserRestrictionsInviteUsers",exceptionText:"UserRestrictionsNoInviteUsers"},{flags:["pin_messages"],text:"UserRestrictionsPinMessages",exceptionText:"UserRestrictionsNoPinMessages"},{flags:["change_info"],text:"UserRestrictionsChangeInfo",exceptionText:"UserRestrictionsNoChangeInfo"}],this.toggleWith={send_messages:["send_media","send_stickers","send_polls","embed_links"]};const e=this.options,t=yield this.managers.appChatsManager.getChat(e.chatId),i=t.default_banned_rights,s=e.participant?function(e,t){if(e.default_banned_rights){t=(0,R.Z)(t);const i=e.default_banned_rights.pFlags;for(const e in i)t.pFlags[e]=i[e]}return t}(t,e.participant.banned_rights):i,n=e.participant?"UserRestrictionsDisabled":"EditCantEditPermissionsPublic";for(const a of this.v){const o=a.flags[0],r=(0,l.tG)(a.checkboxField=new L.Z({text:a.text,checked:(0,B.Z)(t,o,s),restriction:!0,listenerSetter:e.listenerSetter}));(e.participant&&i.pFlags[o]||(0,P.Z)(t)[0]&&(a.flags.includes("pin_messages")||a.flags.includes("change_info")))&&(a.checkboxField.input.disabled=!0,(0,S.fc)(a.checkboxField.label,(e=>{(0,m.Am)(b.ZP.format(n,!0))}),{listenerSetter:e.listenerSetter})),this.toggleWith[o]&&e.listenerSetter.add(a.checkboxField.input)("change",(()=>{a.checkboxField.checked||this.v.filter((e=>this.toggleWith[o].includes(e.flags[0]))).forEach((e=>{e.checkboxField.checked=!1}))})),e.appendTo.append(r.container)}}))}takeOut(){const e={_:"chatBannedRights",until_date:2147483647,pFlags:{}};for(const t of this.v)!t.checkboxField.checked&&t.flags.forEach((t=>{e.pFlags[t]=!0}));return e}}class V extends v.h{init(){return j(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new E.Z({name:"ChannelPermissionsHeader"});e=new G({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content},this.managers),this.eventListener.addEventListener("destroy",(()=>{this.managers.appChatsManager.editChatDefaultBannedRights(this.chatId,e.takeOut())}),{once:!0}),this.scrollable.append(t.container)}{const t=new E.Z({name:"PrivacyExceptions"}),i=new l.ZP({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new O.Z({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout((()=>{n(e)}),0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})},listenerSetter:this.listenerSetter}),n=e=>j(this,void 0,void 0,(function*(){let t;try{t=yield this.managers.appProfileManager.getChannelParticipant(this.chatId,e)}catch(e){return void(0,m.Am)("User is no longer participant")}const i=this.slider.createTab(z);i.participant=t,i.chatId=this.chatId,i.userId=e,i.open()}));t.content.append(i.container);const a=t.generateContentElement();a.classList.add("chatlist-container");const o=D.default.createChatList({new:!0});a.append(o),(0,S.fc)(o,(e=>{const t=(0,A.Z)(e.target,D.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=t.dataset.peerId.toPeerId();n(i)}),{listenerSetter:this.listenerSetter});const r=(t,i)=>j(this,void 0,void 0,(function*(){const s=i.banned_rights,n=(yield this.managers.appChatsManager.getChat(this.chatId)).default_banned_rights,a=[];e.v.forEach((e=>{const t=e.flags[0];s.pFlags[t]&&!n.pFlags[t]&&a.push(e.exceptionText)}));const o=t.lastMessageSpan;a.length&&o.replaceChildren(...(0,b.v_)(a.map((e=>(0,b.ag)(e))),!1)),o.classList.toggle("hide",!a.length)})),d=(e,t)=>{const{dom:i}=D.default.addDialogNew({peerId:(0,N.Z)(e.peer),container:o,rippleEnabled:!0,avatarSize:"abitbigger",append:t});r(i,e)},c=()=>{(0,_.Z)(i.subtitle,(0,b.ag)(u?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[u]))};let h,u=0;const p=()=>(h=new F.Z({scrollable:this.scrollable,getPromise:()=>this.managers.appProfileManager.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,o.childElementCount).then((e=>{for(const t of e.participants)d(t,!0);return u=e.count,c(),e.participants.length<50||e.count===o.childElementCount}))}),h.load());this.scrollable.append(t.container),(yield this.managers.appChatsManager.isChannel(this.chatId))?yield p():(c(),this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,p())})))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}var K=i(6194),W=i(5701),$=i(62),q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Q extends v.h{init(){var e;return q(this,void 0,void 0,(function*(){this.setTitle("Reactions");const t=yield this.managers.appReactionsManager.getActiveAvailableReactions(),i=yield this.managers.appProfileManager.getChatFull(this.chatId),s=yield this.managers.appChatsManager.isBroadcast(this.chatId);let n=null!==(e=i.available_reactions)&&void 0!==e?e:{_:"chatReactionsNone"},a=n,o=new Set("chatReactionsSome"===n._?n.reactions.map((e=>e.emoticon)):[]);const r=e=>e.map((e=>({_:"reactionEmoji",emoticon:e}))),d=()=>s?"EnableReactionsChannelInfo":"chatReactionsAll"===a._?"EnableAllReactionsInfo":"chatReactionsNone"===a._?"DisableReactionsInfo":"EnableSomeReactionsInfo",c=new E.Z({name:s?void 0:"AvailableReactions",caption:d()}),h=new E.Z({name:"OnlyAllowThisReactions"}),u=()=>{var e;const t=null!==(e=a.reactions)&&void 0!==e?e:[];o=new Set(t.map((({emoticon:e})=>e))),f.forEach(((e,t)=>{e.setValueSilently(o.has(t))}))};let p;if(s){p=new L.Z({toggle:!0,checked:"chatReactionsSome"===n._});const e=new l.ZP({checkboxField:p,titleLangKey:"EnableReactions",listenerSetter:this.listenerSetter});c.content.append(e.container),this.listenerSetter.add(p.input)("change",(()=>{let e=!0;p.checked?m.every((e=>!e.checked))?a={_:"chatReactionsSome",reactions:r(t.map((({reaction:e})=>e)))}:"chatReactionsSome"!==a._?a={_:"chatReactionsSome",reactions:r(Array.from(o))}:e=!1:a={_:"chatReactionsNone"},e&&(u(),v())}))}else{const e=[["chatReactionsAll","AllReactions"],["chatReactionsSome","SomeReactions"],["chatReactionsNone","NoReactions"]],t=()=>{h.container.classList.toggle("hide","chatReactionsSome"!==a._)};let i=n._;const s=(0,l.ZC)(e.map((([e,t])=>({langPackKey:t,value:e,checked:n._===e}))),(e=>{i=e,a="chatReactionsAll"===i?{_:i,pFlags:{allow_custom:!0}}:"chatReactionsNone"===i?{_:i}:{_:i,reactions:r(["👍","👎"])},(0,_.Z)(c.caption,(0,b.ag)(d())),u(),v(),t()}));c.content.append(s),t()}const f=new Map,m=t.map((e=>{const t=e.reaction,i=new L.Z({toggle:!0,checked:o.has(t)});f.set(t,i),this.listenerSetter.add(i.input)("change",(()=>{i.checked?(o.add(t),p&&!p.checked&&(p.checked=!0)):(o.delete(t),(null==p?void 0:p.checked)&&!o.size&&(p.checked=!1)),v()}));const s=new l.ZP({checkboxField:i,title:e.title,havePadding:!0,listenerSetter:this.listenerSetter});return(0,$.Z)({row:s,doc:e.static_icon,size:"small"}),h.content.append(s.container),i})),g=()=>q(this,void 0,void 0,(function*(){v.clearTimeout(),"chatReactionsSome"===a._&&(a.reactions=r(Array.from(o))),this.managers.appChatsManager.setChatAvailableReactions(this.chatId,a),n=a})),v=(0,W.Z)(g,3e3,!1,!0);this.eventListener.addEventListener("destroy",(()=>{v.isDebounced()&&g()}),{once:!0}),this.scrollable.append(c.container,h.container)}))}}var Y=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class X extends a._{_init(){return Y(this,void 0,void 0,(function*(){this.listenerSetter.removeAll(),this.scrollable.container.replaceChildren(),this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");let[e,t,i,n,a,o,h,u]=yield Promise.all([this.managers.appProfileManager.getChatFull(this.chatId,!0),this.managers.appChatsManager.getChat(this.chatId),this.managers.appChatsManager.isBroadcast(this.chatId),this.managers.appChatsManager.isChannel(this.chatId),this.managers.appChatsManager.hasRights(this.chatId,"change_type"),this.managers.appChatsManager.hasRights(this.chatId,"change_permissions"),this.managers.appChatsManager.hasRights(this.chatId,"manage_topics"),this.managers.apiManager.getAppConfig()]);const p={full:[],basic:[]},f=(e,t="basic")=>{p[t].push(e)};this.listenerSetter.add(s.Z)("chat_update",(e=>Y(this,void 0,void 0,(function*(){this.chatId===e&&(t=yield this.managers.appChatsManager.getChat(this.chatId),p.basic.forEach((e=>e())))})))),this.listenerSetter.add(s.Z)("chat_full_update",(t=>Y(this,void 0,void 0,(function*(){this.chatId===t&&(e=(yield this.managers.appProfileManager.getCachedFullChat(t))||e,p.full.forEach((e=>e())))}))));const m=this.chatId.toPeerId(!0);{const s=new E.Z({noDelimiter:!0,caption:!0}),n=[],c=document.createElement("div");if(c.classList.add("input-wrapper"),this.chatNameInputField=new r.ZP({label:i?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new r.ZP({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(t.title),this.descriptionInputField.setOriginalValue(e.about),c.append(this.chatNameInputField.container,this.descriptionInputField.container),n.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new d.Z({peerId:m,inputFields:n,listenerSetter:this.listenerSetter,popupOptions:{isForum:t.pFlags.forum}}),this.content.append(this.editPeer.nextBtn),s.content.append(this.editPeer.avatarEdit.container,c),a){const n=new l.ZP({titleLangKey:i?"ChannelType":"GroupType",clickable:()=>{const t=this.slider.createTab(x);t.chatId=this.chatId,t.chatFull=e,t.open()},icon:"lock",listenerSetter:this.listenerSetter}),a=()=>{let e;const s=(0,P.Z)(t)[0];e=i?s?"TypePublic":"TypePrivate":s?"TypePublicGroup":"TypePrivateGroup",n.subtitle.replaceChildren((0,b.ag)(e))};a(),f(a),s.content.append(n.container)}if(a||o){const t=new l.ZP({titleLangKey:"Reactions",icon:"reactions",clickable:()=>{const e=this.slider.createTab(Q);e.chatId=this.chatId,e.open()},listenerSetter:this.listenerSetter}),i=(yield this.managers.appReactionsManager.getAvailableReactions()).filter((e=>!e.pFlags.inactive)).length,n=()=>{var s;const n=null!==(s=e.available_reactions)&&void 0!==s?s:{_:"chatReactionsNone"};if("chatReactionsSome"===n._){const e=n.reactions.length;e===i?(0,_.Z)(t.subtitle,(0,b.ag)("ReactionsAll")):t.subtitle.textContent=e+"/"+i}else(0,_.Z)(t.subtitle,(0,b.ag)("chatReactionsAll"===n._?"ReactionsAll":"Checkbox.Disabled"))};n(),f(n,"full"),s.content.append(t.container)}if(o&&!i){const e=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],i=new l.ZP({titleLangKey:"ChannelPermissions",clickable:()=>{const e=this.slider.createTab(V);e.chatId=this.chatId,e.open()},icon:"permissions",listenerSetter:this.listenerSetter}),n=()=>{i.subtitle.textContent=e.reduce(((e,i)=>e+ +(0,B.Z)(t,i,t.default_banned_rights)),0)+"/"+e.length};n(),f(n),s.content.append(i.container)}if(h&&(t.participants_count>=u.forum_upgrade_participants_min||t.pFlags.forum)&&!i){const e=new l.ZP({checkboxField:new L.Z({toggle:!0}),titleLangKey:"Topics",clickable:()=>{},icon:"topics",listenerSetter:this.listenerSetter}),i=()=>{const i=!!t.pFlags.forum;this.editPeer.avatarElem.parentElement.classList.toggle("is-forum",i),e.checkboxField.setValueSilently(i)};this.listenerSetter.add(e.checkboxField.input)("change",(t=>{if(!t.isTrusted)return;const i=this.managers.appChatsManager.toggleForum(this.chatId,e.checkboxField.checked);e.disableWithPromise(i)})),i(),f(i),s.caption.replaceChildren((0,b.ag)("ForumToggleDescription")),s.content.append(e.container)}if(s.caption.classList.toggle("hide",!s.caption.childElementCount),this.scrollable.append(s.container),(0,S.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;const e=[],t=this.chatId;this.chatNameInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editTitle(t,this.chatNameInputField.value)),this.descriptionInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editAbout(t,this.descriptionInputField.value)),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appChatsManager.editPhoto(t,e)))),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}),{listenerSetter:this.listenerSetter}),i&&(yield this.managers.appChatsManager.hasRights(this.chatId,"change_info"))){const e=new L.Z({text:"ChannelSignMessages",checked:!!t.pFlags.signatures});this.listenerSetter.add(e.input)("change",(()=>{const t=e.toggleDisability(!0);this.managers.appChatsManager.toggleSignatures(this.chatId,e.checked).then((()=>{t()}))})),f((()=>{e.setValueSilently(!!t.pFlags.signatures)})),s.content.append((0,l.tG)(e).container)}}if(!i){const t=new E.Z({});if(!i&&a){const i=new L.Z({text:"ChatHistory"});this.listenerSetter.add(i.input)("change",(()=>{const e=i.toggleDisability(!0);this.managers.appChatsManager.togglePreHistoryHidden(this.chatId,!i.checked).then((()=>{e()}))}));const s=()=>{i.setValueSilently(n&&!e.pFlags.hidden_prehistory)};s(),f(s),t.content.append((0,l.tG)(i).container)}t.content.childElementCount&&this.scrollable.append(t.container)}if(yield this.managers.appChatsManager.hasRights(this.chatId,"delete_chat")){const e=new E.Z({}),t=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:i?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});(0,S.fc)(t,(()=>{new K.Z(m,void 0,(e=>{const i=(0,C.Z)([t],!0);e.then((()=>{this.close()}),(()=>{i()}))}))}),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}n||this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{m===e&&(this.chatId=t.toChatId(),this._init())}))}))}init(){return this._init()}}var J=i(8842),ee=i(4240),te=i(2230),ie=i(5670),se=i(8261),ne=i(4993),ae=i(730),oe=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const re={};class de extends a._{init(){this.container.classList.add("shared-media-container","profile-container");const e=(0,c.Z)("btn-icon sidebar-close-button",{noRipple:!0});this.closeBtn.replaceWith(e),this.closeBtn=e;const t=document.createElement("div");t.classList.add("animated-close-icon"),e.append(t),this.isFirst&&t.classList.add("state-back");const i=document.createElement("div");i.className="transition slide-fade";const a=document.createElement("div");a.classList.add("transition-item"),this.titleI18n=new b.ZP.IntlElement,this.title.append(this.titleI18n.element),this.editBtn=(0,te.Z)("edit"),a.append(this.title,this.editBtn);const r=document.createElement("div");r.classList.add("transition-item");const d=this.title.cloneNode();d.append((0,b.ag)("PeerInfo.SharedMedia")),r.append(d),i.append(a,r),this.header.append(i),this.profile=new se.Z(this.managers,this.scrollable,this.listenerSetter),this.profile.init(),this.scrollable.append(this.profile.element),this.scrollable.onAdditionalScroll=()=>{const e=this.searchSuper.nav.getBoundingClientRect();if(!e.width)return;const t=e.top-1;l(t<=56)};const l=e=>{t.classList.toggle("state-back",this.isFirst||e),this.searchSuper.container.classList.toggle("is-full-viewport",e),h(+e),e||this.searchSuper.cleanScrollPositions()},h=(0,o.Z)({content:i,type:"slide-fade",transitionTime:400,isHeavy:!1});h(0),(0,S.fc)(this.closeBtn,(e=>{h.prevId()?(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),h(0),this.isFirst||t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()}),{listenerSetter:this.listenerSetter}),(0,S.fc)(this.editBtn,(()=>oe(this,void 0,void 0,(function*(){let e;const{peerId:t,threadId:i}=this;e=i&&(yield this.managers.appPeersManager.isForum(t))?this.slider.createTab(ae.Z):t.isAnyChat()?this.slider.createTab(X):this.slider.createTab(ee.Z),e&&(e instanceof ae.Z?e.open(t,this.threadId):(e instanceof X?e.chatId=t.toChatId():e.peerId=t,e.open()))}))),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(s.Z)("contacts_update",(e=>{this.peerId===e&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("chat_update",(e=>{this.peerId===e.toPeerId(!0)&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("history_multiappend",(e=>{this.renderNewMessage(e)})),this.listenerSetter.add(s.Z)("history_delete",(({peerId:e,msgs:t})=>{this.deleteDeletedMessages(e,Array.from(t))})),this.listenerSetter.add(s.Z)("message_sent",(({message:e})=>{this.renderNewMessage(e)})),this.searchSuper=new n.Z({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"PeerMedia.Members",type:"members"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:this.scrollable,onChangeTab:e=>{const t="members"===e.type&&s.Z.settings.animationsEnabled?250:0;setTimeout((()=>{u.classList.toggle("is-hidden","members"!==e.type)}),t)},managers:this.managers}),this.searchSuper.scrollStartCallback=()=>{l(!0)},this.profile.element.append(this.searchSuper.container);const u=(0,w.Z)({icon:"addmember_filled"});this.content.append(u),(0,S.fc)(u,(()=>oe(this,void 0,void 0,(function*(){const e=this.peerId,t=this.peerId.toChatId(),i=yield this.managers.appChatsManager.isChannel(t),s=(t,s)=>{let n,a,o,r,d;if(t.length>1)n="AddMembersAlertTitle",a=[(0,b.ag)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map((e=>{const t=document.createElement("b");return t.append(new J.Z({peerId:e}).element),t})),i||(d=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new J.Z({peerId:t[0]}).element),r=[e],i||(d=[{text:"AddOneMemberForwardMessages",textArgs:[new J.Z({peerId:t[0]}).element],checked:!0}])}r.push(new J.Z({peerId:e}).element),new y.Z("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:s}],checkboxes:d}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&&(0,m.bC)({langPackKey:"InviteToGroupError"})};if(i){const e=this.slider.createTab(ie.Z);e.open({type:"channel",skippable:!1,takeOut:i=>(s(i,(()=>{const s=this.managers.appChatsManager.inviteToChannel(t,i);s.catch(n),e.attachToPromise(s)})),!1),title:"GroupAddMembers",placeholder:"SendMessageTo"})}else new O.Z({peerTypes:["contacts"],placeholder:"Search",onSelect:e=>{setTimeout((()=>{s([e],(i=>{this.managers.appChatsManager.addChatUser(t,e,i.size?void 0:0).catch(n)}))}),0)}})}))),{listenerSetter:this.listenerSetter})}_renderNewMessage(e,t){var i;const s=null===(i=re[e.peerId])||void 0===i?void 0:i[t];if(s)for(const t of this.searchSuper.mediaTabs){const i=t.inputFilter,n=s[i];if(!n)continue;const a=this.searchSuper.filterMessagesByType([e],i).filter((e=>!n.find((t=>t.mid===e.mid&&t.peerId===e.peerId))));a.length&&(n.unshift(...a.map((e=>({mid:e.mid,peerId:e.peerId})))),this.peerId===e.peerId&&-1!==this.searchSuper.usedFromHistory[i]&&(this.searchSuper.usedFromHistory[i]+=a.length,this.searchSuper.performSearchResult(a,t,!1)))}}renderNewMessage(e){return oe(this,void 0,void 0,(function*(){if(this.init)return;const{peerId:t}=e,i=yield this.managers.appPeersManager.isForum(t),s=(0,ne.Z)(e,i);this._renderNewMessage(e),s&&this._renderNewMessage(e,s)}))}_deleteDeletedMessages(e,t,i){for(const s of i)for(const i of this.searchSuper.mediaTabs){const n=i.inputFilter,a=e[n];if(!a)continue;const o=a.findIndex((e=>e.mid===s));if(-1!==o&&(a.splice(o,1),this.peerId===t)){const e=this.searchSuper.tabs[n].querySelector(`[data-mid="${s}"][data-peer-id="${t}"]`);e&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(e),e.remove()),this.searchSuper.usedFromHistory[n]>=o+1&&--this.searchSuper.usedFromHistory[n]}}}deleteDeletedMessages(e,t){if(this.init)return;const i=re[e];if(i){for(const s in i)this._deleteDeletedMessages(i[s],e,t);this.scrollable.onScroll()}}cleanupHTML(){return oe(this,void 0,void 0,(function*(){const e=this.peerId.isAnyChat(),[t,i]=yield Promise.all([!!e&&this.searchSuper.canViewMembers(),!!e&&this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"invite_users")]);return()=>{this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",t&&i)}}))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t){var i,s,n;return(this.peerId!==e||this.threadId!==t)&&(this.peerId=e,this.threadId=t,this.peerChanged=!0,this.init&&(this.init(),this.init=null),this.searchSuper.setQuery({peerId:e,threadId:t,historyStorage:null!==(s=(n=null!==(i=re[e])&&void 0!==i?i:re[e]={})[t])&&void 0!==s?s:n[t]={}}),this.profile.setPeer(e,t),!0)}changeTitleKey(){return oe(this,void 0,void 0,(function*(){const e=this.managers.appPeersManager.isForum(this.peerId);return()=>{this.titleI18n.compareAndUpdate({key:this.threadId&&e?"AccDescrTopic":"Profile"})}}))}fillProfileElements(){return oe(this,void 0,void 0,(function*(){if(!this.peerChanged)return;this.peerChanged=!1;const e=yield Promise.all([this.cleanupHTML(),this.toggleEditBtn(!0),this.profile.fillProfileElements(),this.changeTitleKey()]);return()=>{e.forEach((e=>{null==e||e()}))}}))}toggleEditBtn(e){return oe(this,void 0,void 0,(function*(){let t;if(this.peerId.isUser())t=this.peerId!==s.Z.myId&&(yield this.managers.appUsersManager.isContact(this.peerId.toUserId()));else{const e=this.peerId.toChatId(),i=this.threadId&&(yield this.managers.appChatsManager.isForum(e));t=yield this.managers.appChatsManager.hasRights(e,i?"manage_topics":"change_info")}const i=()=>{this.editBtn.classList.toggle("hide",!t)};return e?i:i()}))}loadSidebarMedia(e,t){this.searchSuper.load(e,t)}onOpenAfterTimeout(){super.onOpenAfterTimeout(),this.scrollable.onScroll()}onCloseAfterTimeout(){super.onCloseAfterTimeout(),this.destroyable&&(this.profile.destroy(),this.searchSuper.destroy())}destroy(){this.destroyable=!0,this.onCloseAfterTimeout()}}},9099:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512);const n=e=>{const{element:t,className:i,forwards:a,duration:o,onTransitionEnd:r,onTransitionStart:d,useRafs:l}=e,{timeout:c,raf:h}=t.dataset;if(void 0!==c&&clearTimeout(+c),void 0!==h&&(window.cancelAnimationFrame(+h),l||delete t.dataset.raf),l&&s.Z.settings.animationsEnabled&&o)return void(t.dataset.raf=""+window.requestAnimationFrame((()=>{delete t.dataset.raf,n(Object.assign(Object.assign({},e),{useRafs:l-1}))})));a&&i&&t.classList.add(i);const u=()=>{delete t.dataset.timeout,!a&&i&&t.classList.remove("backwards",i),t.classList.remove("animating"),null==r||r()};if(null==d||d(),!s.Z.settings.animationsEnabled||!o)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!a),t.dataset.timeout=""+setTimeout(u,o)},a=n},3552:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,_:()=>a.Z});var s=i(426),n=i(6385),a=i(6024),o=i(1655),r=i(5953),d=i(3624);class l{constructor(e){var t;this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{n.Z.findItemByType(this.navigationType)?n.Z.back(this.navigationType):this.historyTabIds.length&&this.closeTab(this.historyTabIds[this.historyTabIds.length-1])},this.closeTab=(e,t,i)=>{if(void 0!==e&&this.historyTabIds[this.historyTabIds.length-1]!==e)return this.removeTabFromHistory(e),!1;const s=this.historyTabIds.pop();this.onCloseTab(s,t,i);const n=this.historyTabIds[this.historyTabIds.length-1];return this._selectTab(void 0!==n?n instanceof a.Z?n.container:n:this.canHideFirst?-1:0,t),!0},(0,r.Z)(this,e),null!==(t=this.tabs)&&void 0!==t||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=(0,s.Z)({content:this.tabsContainer,type:"navigation",transitionTime:250}),this.canHideFirst||this._selectTab(0),this.middlewareHelper=(0,d.k)()}getMiddleware(){return this.middlewareHelper.get()}selectTab(e){var t,i,s,o,r;return i=this,s=void 0,r=function*(){if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const i=e instanceof a.Z?e:this.tabs.get(e);return this.onOpenTab&&(yield this.onOpenTab()),i&&(null===(t=i.onOpen)||void 0===t||t.call(i),i.onOpenAfterTimeout&&setTimeout((()=>{i.onOpenAfterTimeout()}),250)),n.Z.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof a.Z?e.container:e),!0},new((o=void 0)||(o=Promise))((function(e,t){function n(e){try{d(r.next(e))}catch(e){t(e)}}function a(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(i,s||[])).next())}))}removeTabFromHistory(e){(0,o.Z)(this.historyTabIds,e),this.onCloseTab(e,void 0)}sliceTabsUntilTab(e,t){for(let i=this.historyTabIds.length-1;i>=0;--i){const s=this.historyTabIds[i];if(s!==t){if(s instanceof e)break;this.removeTabFromHistory(s)}}}getTab(e){return this.historyTabIds.find((t=>t instanceof e))}getHistory(){return this.historyTabIds}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,i){var s;i||n.Z.removeByType(this.navigationType,!0);const o=e instanceof a.Z?e:this.tabs.get(e);if(o){try{null===(s=o.onClose)||void 0===s||s.call(o)}catch(e){console.error("tab onClose error",o)}o.onCloseAfterTimeout&&setTimeout((()=>{o.onCloseAfterTimeout()}),280)}}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}deleteTab(e){this.tabs.delete(e)}createTab(e,t=!0,i){const s=new e(i?void 0:this,t);return s.managers=this.managers,s}}},6024:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c,h:()=>h});var s=i(3241),n=i(3699),a=i(3624),o=i(319),r=i(2325),d=i(2230),l=i(8805);class c{constructor(e,t){this._constructor(e,t)}_constructor(e,t=!0){var i;this.slider=e,this.middlewareHelper=e?e.getMiddleware().create():(0,a.k)(),this.destroyable=t,this.container=document.createElement("div"),this.container.classList.add("tabs-tab","sidebar-slider-item"),this.header=document.createElement("div"),this.header.classList.add("sidebar-header"),this.closeBtn=(0,d.Z)("left sidebar-close-button",{noRipple:!0}),this.title=document.createElement("div"),this.title.classList.add("sidebar-header__title"),this.header.append(this.closeBtn,this.title),this.content=document.createElement("div"),this.content.classList.add("sidebar-content"),this.scrollable=new l.ZP(this.content,void 0,void 0,!0),this.scrollable.attachBorderListeners(this.container),this.container.append(this.header,this.content),null===(i=this.slider)||void 0===i||i.addTab(this),this.listenerSetter=new n.Z}close(){return this.slider.closeTab(this)}open(...e){return t=this,i=void 0,n=function*(){if(this.init)try{const t=this.init(...e);this.init=null,t instanceof Promise&&(yield t)}catch(e){console.error("open tab error",e)}this.slider.selectTab(this)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}init(...e){}onOpen(){}onOpenAfterTimeout(){}onClose(){}onCloseAfterTimeout(){var e,t,i;this.destroyable&&(null===(e=this.slider)||void 0===e||e.deleteTab(this),this.container.remove(),this.scrollable.destroy(),null===(t=this.listenerSetter)||void 0===t||t.removeAll(),null===(i=this.middlewareHelper)||void 0===i||i.destroy())}setTitle(e){this.title.replaceChildren((0,r.ag)(e))}}class h extends c{constructor(e){super(e),this.eventListener=new s.Z}onClose(){this.eventListener.dispatchEvent("close")}onCloseAfterTimeout(){const e=this.eventListener.dispatchResultableEvent("destroy");return this.eventListener.dispatchEvent("destroyAfter",Promise.all(e).then(o.Z,o.Z)),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}},2894:(e,t,i)=>{"use strict";i.d(t,{Z:()=>p});var s=i(8130),n=i(8594),a=i(8487),o=i(4484),r=i(5565),d=i(3035),l=i(5345),c=i(5953),h=i(3061),u=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class p extends l.Z{constructor(e){let t;super({getIndex:e.getIndex||(e=>this.managers.appUsersManager.getUserStatusForSort(e.id)),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onUpdate:e.onUpdate||(e=>u(this,void 0,void 0,(function*(){const t=(0,h.Z)(yield this.managers.appUsersManager.getUser(e.id));(0,r.Z)(e.dom.lastMessageSpan,t)}))),onSort:(e,t)=>{const i=e.dom.listEl.parentElement!==this.list;(0,o.Z)(e.dom.listEl,this.list,t),i&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=s.default.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,wrapOptions:{lazyLoadQueue:this.lazyLoadQueue}});return e.dom=t,e},updateElementWith:d.T2,updateListWith:e=>u(this,void 0,void 0,(function*(){return(0,a.Z)(this.list)?(yield(0,n.e9)(),(0,a.Z)(this.list)?void e(!0):e(!1)):e(!1)}))}),this.avatarSize="abitbigger",this.rippleEnabled=!0,this.autonomous=!0,(0,c.Z)(this,e),this.list=s.default.createChatList(this.createChatListOptions);const i=()=>{t=window.setTimeout((()=>{this.updateList((e=>{e&&i()}))}),p.SORT_INTERVAL)};i()}}p.SORT_INTERVAL=3e4},9259:(e,t,i)=>{"use strict";i.d(t,{Z:()=>I});var s=i(5432),n=i(3910),a=i(2738),o=i(5975),r=i(8497),d=i(8204),l=i(9405),c=i(3624),h=i(3035),u=i(5418),p=i(241),f=i(13),m=i(8115),g=i(5400),v=i(1447),b=i(3772),y=i(3512),w=i(5814),S=i(9099),C=i(3541),L=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let E=!1;function I({listenTo:e,listenerSetter:t,selector:i,findTarget:I}){if(s.Z)return;const M=(t,s)=>{let n;if(I)n=I(t);else{const e=i||".media-sticker-wrapper";n=t.target.closest(e)}return!n||s&&!(0,o.Z)(n,e)?void 0:n},P=y.Z.managers;t.add(e)("mousedown",(e=>{if(E||e.buttons>1||0!==e.button)return;let t=M(e);if(!t)return;const i=t.dataset.docId;if(!i)return;const s="sticker-viewer",y="STICKER-VIEWER",I=w.Z.getOnlyOnePlayableGroup(),Z=(0,c.k)();let T,k;const x=({mediaContainer:e,doc:t,middleware:i,lockGroups:n,isSwitching:o})=>L(this,void 0,void 0,(function*(){const c=(0,f.Z)(t),S=e.getBoundingClientRect(),L=(0,l.C)(t.w,t.h),E=c?280:360,I=(0,l.C)(E,E),M=S.width===S.height?I:L.aspectFitted(I),Z=(0,r.Z)(e,"bubble"),k=!Z||Z.classList.contains("is-out"),x=document.createElement("div");x.classList.add(s+"-transformer");const A=document.createElement("div");A.classList.add(s+"-sticker"),A.style.width=M.width+"px",A.style.height=M.height+"px";const _=document.createElement("div");if(_.classList.add(s+"-emoji"),_.append((0,m.Z)(t.stickerEmojiRaw)),c){const e=(E*C.Vp-E)/3*(k?1:-1);x.classList.add("has-effect"),x.style.setProperty("--translateX",`${e}px`),_.style.setProperty("--translateX",-e+"px")}const F=(0,r.Z)(e,"scrollable"),D=(0,d.Z)(e,F,!0,S);(D.overflow.vertical||D.overflow.horizontal)&&A.classList.add("is-overflow");const R=e.getBoundingClientRect(),B=R.width/M.width,N=R.height/M.height,O=R.left-(p.Z.width-R.width)/2,U=R.top-(p.Z.height-R.height)/2;x.style.transform=`translate(${O}px, ${U}px) scale(${B}, ${N})`,o&&x.classList.add("is-switching"),x.append(A,_),T.append(x);const H=yield(0,C.ZP)({doc:t,div:A,group:y,width:M.width,height:M.height,play:!1,loop:!0,middleware:i,managers:P,needFadeIn:!1,isOut:k,withThumb:!1,relativeEffect:!0,loopEffect:!0}).then((({render:e})=>e));if(!i())return;T.parentElement||document.body.append(T);const z=Array.isArray(H)?H[0]:H,j=z instanceof b.Z?new Promise((e=>z.addEventListener("firstFrame",e,{once:!0}))):Promise.resolve();if(yield Promise.all([j,(0,h.d1)()]),yield(0,u.Z)(0),i()){if(n&&(w.Z.setOnlyOnePlayableGroup(y),w.Z.checkAnimations2(!0)),z instanceof b.Z){const t=e instanceof g.LD?e.player:v.Z.getAnimation(e);if(t){if(z.curFrame=t.curFrame,z.play(),yield new Promise((e=>{let t=0;const i=()=>{2==++t&&(e(),z.removeEventListener("enterFrame",i))};z.addEventListener("enterFrame",i)})),!i())return;z.pause()}}else if(z instanceof HTMLVideoElement){const t=e.querySelector("video");t&&(z.currentTime=t.currentTime)}return{ready:()=>{(z instanceof b.Z||z instanceof HTMLVideoElement)&&z.play(),c&&(0,a.tH)(A)},transformer:x}}})),A=window.setTimeout((()=>L(this,void 0,void 0,(function*(){document.removeEventListener("mousemove",F),T=document.createElement("div"),T.classList.add(s),E=!0;const e=Z.get(),n=yield P.appDocsManager.getDoc(i);if(!e())return;let a;try{if(a=yield x({doc:n,mediaContainer:t,middleware:e,lockGroups:!0}),!a)return}catch(e){return}const{ready:o,transformer:r}=a;k=r,(0,S.Z)({element:T,className:"is-visible",forwards:!0,duration:200,onTransitionEnd:()=>{e()&&o()}}),document.addEventListener("mousemove",_)}))),125),_=e=>L(this,void 0,void 0,(function*(){const i=M(e,!0);if(!i||t===i)return;const s=i.dataset.docId;if(!s)return;t=i,Z.clean();const n=Z.get(),a=yield P.appDocsManager.getDoc(s);if(!n())return;let o;try{if(o=yield x({doc:a,mediaContainer:t,middleware:n,isSwitching:!0}),!o)return}catch(e){return void console.error("sticker viewer error",e)}const{ready:r,transformer:d}=o,l=k;(0,S.Z)({element:l,className:"is-switching",forwards:!0,duration:200,onTransitionEnd:()=>{l.remove()}}),k=d,(0,S.Z)({element:d,className:"is-switching",forwards:!1,duration:200,onTransitionEnd:()=>{n()&&r()}})})),F=e=>{(0,o.Z)(e.target,t)||D()},D=()=>{clearTimeout(A),Z.clean(),T&&((0,S.Z)({element:T,className:"is-visible",forwards:!1,duration:200,onTransitionEnd:()=>{T.remove(),w.Z.setOnlyOnePlayableGroup(I),w.Z.checkAnimations2(!1),E=!1}}),(0,a.fc)(document.body,n.Z,{capture:!0,once:!0})),document.removeEventListener("mousemove",F),document.removeEventListener("mousemove",_),document.removeEventListener("mouseup",D,{capture:!0})};document.addEventListener("mousemove",F),document.addEventListener("mouseup",D,{once:!0,capture:!0})}))}},5117:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e,t){this.container=e,this.handler=t,this.observeHeaders(),this.observeElements()}observeHeaders(){this.headersObserver=new IntersectionObserver((e=>{for(const t of e){const e=t.boundingClientRect,i=t.target.parentElement,s=t.rootBounds;e.bottom=s.top&&e.bottom{const t=e.filter((e=>e.boundingClientRect.tope.boundingClientRect.top-t.boundingClientRect.top))[0];if(!t)return;const i=t.isIntersecting?t.target:t.target.nextElementSibling;this.handler(!0,i)}),{root:this.container})}addSentinel(e,t){const i=document.createElement("div");return i.classList.add("sticky_sentinel",t),e.appendChild(i)}observeStickyHeaderChanges(e){const t=this.addSentinel(e,"sticky_sentinel--top");this.headersObserver.observe(t),this.elementsObserver.observe(e)}disconnect(){this.headersObserver.disconnect(),this.elementsObserver.disconnect()}unobserve(e,t){this.elementsObserver.unobserve(e),this.headersObserver.unobserve(t)}}},3757:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(3910),n=i(5432),a=i(5953),o=i(3416),r=i(3699),d=i(6976),l=i(5418),c=i(3725);const h=e=>"touches"in e?e.touches[0]:e,u=document;let p=!1;o.Z.addEventListener("toggle",(e=>{p=e}));const f={passive:!1},m=!1;class g{constructor(e){var t,i,o,d,g;this.reset=e=>{var t;n.Z?this.listenerSetter.removeManual(u,"touchmove",this.handleMove,f):(this.listenerSetter.removeManual(u,"mousemove",this.handleMove,m),this.setCursorTo.style.cursor=""),this.hadMove&&(null===(t=this.onReset)||void 0===t||t.call(this)),this.resetValues()},this.handleStart=e=>{return t=this,i=void 0,a=function*(){var t;if(this.isMouseDown)return;const i=h(e);if(0!==Math.max(0,null!==(t=i.button)&&void 0!==t?t:0))return;if(this.verifyTouchTarget&&!(yield this.verifyTouchTarget(e)))return this.reset();const s=++this.tempId;if(this.isMouseDown=!0,this.withDelay&&!n.Z){const e=Object.assign(Object.assign({},m),{once:!0}),t=(0,c.Z)(),i=()=>t.resolve(),n=this.listenerSetter.add(u)("mousemove",i,e);if(yield Promise.race([(0,l.Z)(300),t]),t.resolve(),this.listenerSetter.remove(n),this.tempId!==s)return}this.xDown=i.clientX,this.yDown=i.clientY,this.eventUp=i,n.Z?this.listenerSetter.add(u)("touchmove",this.handleMove,f):this.listenerSetter.add(u)("mousemove",this.handleMove,m),this.onStart&&(this.onStart(),this.hadMove=!0,this.handleMove(i))},new((s=void 0)||(s=Promise))((function(e,n){function o(e){try{d(a.next(e))}catch(e){n(e)}}function r(e){try{d(a.throw(e))}catch(e){n(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,s,a},this.handleMove=e=>{var t;if(void 0===this.xDown||void 0===this.yDown||p)return void this.reset();this.cancelEvent&&(0,s.Z)(e);const i=this.eventUp=h(e),a=i.clientX,o=i.clientY,r=a-this.xDown+this.xAdded,d=o-this.yDown+this.yAdded;if(!this.hadMove){if(!r&&!d)return;this.hadMove=!0,n.Z||this.setCursorTo.style.setProperty("cursor",this.cursor,"important"),null===(t=this.onFirstSwipe)||void 0===t||t.call(this,e)}const l=this.onSwipe(r,d,e);void 0!==l&&l&&this.reset()},(0,a.Z)(this,e),null!==(t=this.cursor)&&void 0!==t||(this.cursor="grabbing"),null!==(i=this.cancelEvent)&&void 0!==i||(this.cancelEvent=!0),null!==(o=this.listenerOptions)&&void 0!==o||(this.listenerOptions=f),null!==(d=this.setCursorTo)&&void 0!==d||(this.setCursorTo=this.element),this.listenerSetter=new r.Z,this.setListeners(),this.resetValues(),this.tempId=0,null===(g=e.middleware)||void 0===g||g.onDestroy((()=>{this.reset(),this.removeListeners()}))}setListeners(){n.Z?(this.withDelay?(0,d.E)({element:this.element,callback:e=>{(0,s.Z)(e),this.handleStart(e)},listenerSetter:this.listenerSetter,listenerOptions:this.listenerOptions}):this.listenerSetter.add(this.element)("touchstart",this.handleStart,this.listenerOptions),this.listenerSetter.add(u)("touchend",this.reset)):(this.listenerSetter.add(this.element)("mousedown",this.handleStart,this.listenerOptions),this.listenerSetter.add(u)("mouseup",this.reset))}removeListeners(){this.listenerSetter.removeAll()}setCursor(e=""){this.cursor=e,!n.Z&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}add(e,t){this.xAdded=e,this.yAdded=t,this.handleMove({clientX:this.eventUp.clientX,clientY:this.eventUp.clientY,target:this.eventUp.target})}resetValues(){++this.tempId,this.hadMove=!1,this.xAdded=this.yAdded=0,this.xDown=this.yDown=this.eventUp=this.isMouseDown=void 0}}},709:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(2398),n=i(6272),a=i(4762),o=i(503);class r extends o.ZP{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");const t=this.input;if(t instanceof HTMLInputElement)t.type="tel",t.autocomplete="rr55RandomRR55";else{t.inputMode="decimal";const e=window.devicePixelRatio;if(e>1){let i;a.IS_APPLE?i=-.16*e:a.IS_ANDROID&&(i=0),t.style.setProperty("--letter-spacing",i+"px")}const i=this.setValueSilently.bind(this);this.setValueSilently=e=>{i(e),(0,s.Z)(this.input,!0)}}t.addEventListener("input",(()=>{t.classList.remove("error");const i=this.value;let s;Math.abs(i.length-this.lastValue.length)>1&&!this.pasted&&a.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+i),this.pasted=!1,this.setLabel();let o,r,d,l="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(s=(0,n.u)(this.value),o=s.formatted,r=s.country,l=s.leftPattern,d=s.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),t.dataset.leftPattern=l,e.onInput&&e.onInput(s)})),t.addEventListener("paste",(()=>{this.pasted=!0})),t.addEventListener("keypress",(e=>{const t=e.key;if(/\D/.test(t)&&!e.metaKey&&!e.ctrlKey&&"Backspace"!==t&&("+"!==t||!e.shiftKey))return e.preventDefault(),!1}))}}},2796:(e,t,i)=>{"use strict";i.d(t,{Am:()=>c,PE:()=>l,bC:()=>h});var s=i(5565),n=i(2296),a=i(2325);const o=document.createElement("div");let r;o.classList.add("toast");const d=new n.Z("toast");function l(){d.close(),o.classList.remove("is-visible"),r&&clearTimeout(+r),r=window.setTimeout((()=>{o.remove(),r=void 0}),200)}function c(e,t){d.close(),(0,s.Z)(o,e),o.parentElement||(document.body.append(o),o.offsetLeft),o.classList.add("is-visible"),r&&clearTimeout(+r),d.open(o),r=window.setTimeout(l,3e3),t&&d.addEventListener("toggle",t,{once:!0})}function h(e){c((0,a.ag)(e.langPackKey,e.langPackArguments),e.onClose)}d.addEventListener("toggle",(e=>{e||l()}))},426:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(3512),n=i(3725),a=i(8594),o=i(2648),r=i(3910);const d={navigation:{callback:(e,t,i)=>{const s=t.getBoundingClientRect().width,n=[e,t];return i&&n.reverse(),n[0].style.filter="brightness(80%)",n[0].style.transform=`translate3d(${.25*-s}px, 0, 0)`,n[1].style.transform=`translate3d(${s}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",e.style.filter="",()=>{t.style.transform=t.style.filter=""}},animateFirst:!1},tabs:{callback:(e,t,i)=>{const s=t.getBoundingClientRect().width,n=[e,t];return i&&n.reverse(),n[0].style.transform=`translate3d(${-s}px, 0, 0)`,n[1].style.transform=`translate3d(${s}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",()=>{t.style.transform=""}},animateFirst:!1}},l=e=>{let{content:t,type:i,transitionTime:l,onTransitionEnd:c,isHeavy:h=!0,once:u=!1,withAnimationListener:p=!0,listenerSetter:f,animateFirst:m=!1}=e;const{callback:g,animateFirst:v}=d[i]||{};t.dataset.animation=i,void 0!==v&&(m=v);const b=new Map;let y,w=null;if(p){const e=g?"transitionend":"animationend",i=s=>{if((0,r.Z)(s),s.target.parentElement!==t)return;const n=b.get(s.target);null==n||n(),s.target===w&&(!y&&h||(y&&(y.resolve(),y=void 0),null==c||c(S.prevId()),t.classList.remove("animating","backwards","disable-hover"),u&&(f?f.removeManual(t,e,i):t.removeEventListener(e,i),w=y=void 0,b.clear())))};f?f.add(t)(e,i):t.addEventListener(e,i)}function S(e,i=!0,r){r&&(w=r),e instanceof HTMLElement&&(e=(0,o.Z)(e));const d=S.prevId();if(e===d)return!1;const u=t.children[e];if(s.Z.settings.animationsEnabled&&(-1!==d||m)||(i=!1),!p){const e=t.dataset.timeout;void 0!==e&&clearTimeout(+e),delete t.dataset.timeout}if(!i){if(w)w.classList.remove("active","to","from");else if(u){const e=b.get(u);null==e||e()}return u&&(u.classList.remove("to","from"),u.classList.add("active")),t.classList.remove("animating","backwards","disable-hover"),w=u,void(null==c||c(e))}p||(t.dataset.timeout=""+window.setTimeout((()=>{u.classList.remove("to"),w&&w.classList.remove("from"),t.classList.remove("animating","backwards","disable-hover"),delete t.dataset.timeout}),l)),w&&(w.classList.remove("to"),w.classList.add("from")),t.classList.add("animating");const f=d{u.classList.remove("to"),b.delete(u)}))}if(w){let e;const t=w,i=()=>{clearTimeout(e),t.classList.remove("active","from"),null==v||v(),b.delete(t)};u?(e=window.setTimeout(i,l+100),b.set(t,i)):(e=window.setTimeout(i,l),b.set(t,(()=>{clearTimeout(e),b.delete(t)}))),t.dataset.transitionTimeout=""+e,h&&(y||(y=(0,n.Z)()),(0,a.YW)(y,2*l))}w=u}return S.prevId=()=>w?(0,o.Z)(w):-1,S.getFrom=()=>w,S.setFrom=e=>w=e,S}},6726:(e,t,i)=>{"use strict";i.d(t,{l:()=>o});var s=i(5701),n=i(503);function a(e){return(e.length>=3&&e.length<=32||!e.length)&&/^[a-zA-Z0-9_]*$/.test(e)}class o extends n.ZP{constructor(e,t){super(e),this.managers=t,this.checkUsernameDebounced=(0,s.Z)(this.checkUsername.bind(this),150,!1,!0),e.listenerSetter.add(this.input)("input",(()=>{var e,t,i,s;const o=this.getValue();if(this.error=void 0,o===this.originalValue||!o.length)return this.setState(n.I1.Neutral),void(null===(t=(e=this.options).onChange)||void 0===t||t.call(e));a(o)?this.setState(n.I1.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?null===(s=(i=this.options).onChange)||void 0===s||s.call(i):this.checkUsernameDebounced(o)}))}getValue(){let e=this.value;return this.options.head&&(e=e.slice(this.options.head.length),this.setValueSilently(this.options.head+e)),e}checkUsername(e){if(this.checkUsernamePromise)return;let t;this.error=void 0,t=this.options.peerId?this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(),e):this.managers.appUsersManager.checkUsername(e);const i=this.checkUsernamePromise=t.then((t=>{this.getValue()===e&&(t?this.setState(n.I1.Valid,this.options.availableText):this.setError(this.options.takenText))}),(t=>{this.getValue()===e&&(this.error=t,"USERNAME_PURCHASE_AVAILABLE"===t.type?this.setError(this.options.takenText):this.setError(this.options.invalidText))})).then((()=>{var t,s;this.checkUsernamePromise===i&&(this.checkUsernamePromise=void 0),null===(s=(t=this.options).onChange)||void 0===s||s.call(t);const n=this.getValue();n!==e&&this.isValidToChange()&&a(n)&&this.checkUsername(n)}))}}},9522:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(2738),n=i(5975),a=i(2398),o=i(4484),r=i(2914),d=i(319),l=i(5345),c=i(2325),h=i(3512),u=i(5592),p=i(7479),f=i(5029),m=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class g extends f.Z{constructor(e){super({name:"UsernamesProfileHeader",caption:e.peerId.isUser()?"UsernamesProfileHelp":"UsernamesChannelHelp"});const{peerId:t,peer:i,usernameInputField:f,listenerSetter:g,middleware:v}=e,b=h.Z.managers,y=t.isUser()?void 0:t.toChatId(),w=this,S="usernames",C=document.createElement("div");let L;C.classList.add(S);const E=new l.Z({getIndex:e=>L.length-L.findIndex((t=>t.username===e.id)),onDelete:e=>{e.row.container.remove()},onSort:(e,t)=>{(0,o.Z)(e.row.container,C,t)},onElementCreate:e=>{const t=L.find((t=>t.username===e.id)),i=new p.ZP({title:"@"+t.username,subtitle:!0,clickable:!0}),s=!!t.pFlags.editable,n=!!t.pFlags.active;return s&&(i.container.dataset.editable="1"),i.container.dataset.username=t.username,i.container.classList.add(S+"-username"),i.subtitle.classList.add(S+"-username-status"),i.createMedia("medium").classList.add(S+"-username-icon","tgico"),i.makeSortable(),I(i,n),e.row=i,e}}),I=(e,t)=>{e.subtitle.replaceChildren((0,c.ag)(e.container.dataset.editable?"UsernameLinkEditable":t?"UsernameLinkActive":"UsernameLinkInactive")),e.container.classList.toggle("active",t),e.toggleSorting(t)},M=(e=[])=>{L=e,E.getAll().forEach((t=>{e.some((e=>e.username===t.id))||E.delete(t.id)})),e.forEach((e=>{if(E.has(e.username)){const t=E.get(e.username);E.update(e.username,t),I(t.row,!!e.pFlags.active)}else E.add(e.username)})),w.container.classList.toggle("hide",!E.getAll().size)};M(i.usernames),g.add(h.Z)("peer_title_edit",(({peerId:e})=>m(this,void 0,void 0,(function*(){if(e!==t)return;const i=yield b.appPeersManager.getPeer(t);M(i.usernames)}))));let P=!1;(0,s.fc)(C,(e=>m(this,void 0,void 0,(function*(){if(P)return void(P=!1);const t=(0,n.Z)(e.target,C);if(!t)return;if(t.dataset.editable)return void(0,a.Z)(f.input,!0,!0);const i=t.dataset.username,s=t.classList.contains("active");let o,r;s?(o="UsernameDeactivateLink",r=y?"UsernameDeactivateLinkChannelMessage":"UsernameDeactivateLinkProfileMessage"):(o="UsernameActivateLink",r=y?"UsernameActivateLinkChannelMessage":"UsernameActivateLinkProfileMessage");try{yield(0,u.Z)({titleLangKey:o,descriptionLangKey:r,button:{langKey:s?"Hide":"Show"}})}catch(e){return}const l=!s;let c;c=y?b.appChatsManager.toggleUsername(y,i,l):b.appUsersManager.toggleUsername(i,l),c.catch((e=>{"USERNAMES_ACTIVE_TOO_MUCH"===e.type?(0,u.Z)({titleLangKey:"UsernameActivateErrorTitle",descriptionLangKey:"UsernameActivateErrorMessage",button:{langKey:"OK",isCancel:!0}}).catch(d.Z):console.error("turn username error",e)}))})))),new r.Z({list:C,middleware:v,onSort:(e,t)=>{const i=L.splice(e,1)[0];L.splice(t,0,i),E.updateList();const s=L.filter((e=>e.pFlags.active)).map((e=>e.username));y?b.appChatsManager.reorderUsernames(y,s):b.appUsersManager.reorderUsernames(s)}}),w.content.append(C)}}},2940:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e,t){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver((t=>{if(this.locked)return;const i=[];t.forEach(((e,t)=>{const s=e.target;if(this.items.get(s)===e.isIntersecting)return;this.items.set(s,e.isIntersecting);const n={target:s,visible:e.isIntersecting,entry:e,index:t};i.push(n)})),i.forEach((t=>{e(t)}))}),t)}getVisible(){const e=[];return this.items.forEach(((t,i)=>{t&&e.push(i)})),e}clearVisible(){const e=this.getVisible();for(const t of e)this.items.set(t,!1)}isVisible(e){return this.items.get(e)}disconnect(){this.observer.disconnect(),this.items.clear()}refresh(){this.observer.disconnect();const e=[...this.items.keys()];for(const t of e)this.observer.observe(t)}refreshVisible(){const e=this.getVisible();for(const t of e)this.observer.unobserve(t);for(const t of e)this.observer.observe(t)}observe(e){this.items.set(e,!1),this.observer.observe(e)}unobserve(e){this.observer.unobserve(e),this.items.delete(e)}unlock(){this.locked=!1}unlockAndRefresh(){this.unlock(),this.refresh()}lock(){this.locked=!0}}},8427:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(3910),n=i(2738),a=i(3013),o=i(65);class r extends o.Z{constructor(e,t=!1){super({step:.01,min:0,max:1,vertical:t},1),this.listenerSetter=e,this.vertical=t,this.onMuteClick=e=>{e&&(0,s.Z)(e),a.Z.muted=!a.Z.muted},this.setVolume=()=>{const{volume:e,muted:t}=a.Z;let i;i=!e||t?0:e>.5?3:e>0&&e<.25?1:2,r.ICONS.forEach((e=>this.icon.classList.remove("tgico-"+e))),this.icon.classList.add("tgico-"+r.ICONS[i]),this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);a.Z.muted=!1,a.Z.volume=t}});const i="player-volume",o=this.btn=document.createElement("div");o.classList.add("btn-icon",i);const d=this.icon=document.createElement("span");d.classList.add(i+"__icon"),o.append(d,this.container),(0,n.fc)(d,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.Z)("playbackParams",this.setVolume),this.setVolume()}}r.ICONS=["volume_off","volume_mute","volume_down","volume_up"]},9083:(e,t,i)=>{"use strict";i.d(t,{N:()=>a,Z:()=>n});var s=i(5400);function n({docIds:e,loadPromises:t,middleware:i,lazyLoadQueue:n,customEmojiSize:a,animationGroup:o}){const r=" ".repeat(e.length),d=[];return e.forEach(((e,t)=>{d.push({_:"messageEntityCustomEmoji",offset:t,length:1,document_id:e})})),(0,s.ZP)(r,{entities:d,loadPromises:t,animationGroup:o,customEmojiSize:a,middleware:i,lazyLoadQueue:n})}function a(e){var t;const i=null!==(t=e.loadPromises)&&void 0!==t?t:e.loadPromises=[],s=n(e);return Promise.all(i).then((()=>s))}},296:(e,t,i)=>{"use strict";i.d(t,{Z:()=>I});var s=i(2341),n=i(467),a=i(632),o=i(2738),r=i(8497),d=i(4081),l=i(319),c=i(2312),h=i(4271),u=i(1243),p=i(7030),f=i(2325),m=i(1507),g=i(2491),v=i(3512),b=i(8448),y=i(3251),w=i(3442),S=i(9492),C=i(5671),L=i(1604),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function I({message:e,withTime:t,fontWeight:i,voiceAsMusic:I,showSender:M,searchContext:P,loadPromises:Z,autoDownloadSize:T,lazyLoadQueue:k,sizeType:x,managers:A=v.Z.managers,cacheContext:_,fontSize:F}){var D;return E(this,void 0,void 0,(function*(){null!=i||(i=500),null!=x||(x=""),null!=F||(F=0);const R=0===T,B=e.media.document||e.media.webpage.document,N=null==e?void 0:e.uploadingFileName;if("audio"===B.type||"voice"===B.type||"round"===B.type){const s=new b.ZP;return s.withTime=t,s.message=e,s.noAutoDownload=R,s.lazyLoadQueue=k,s.loadPromises=Z,I&&(s.voiceAsMusic=I),P&&(s.searchContext=P),M&&(s.showSender=M),s.dataset.fontWeight=""+i,s.dataset.fontSize=""+F,s.dataset.sizeType=x,yield s.render(),s}const O=B.file_name?B.file_name.split("."):"";let U="";U=O.length>1&&Array.isArray(O)?(0,n.ST)(O.pop().split(" ",1)[0].toLowerCase()):"file";const H=document.createElement("div");H.classList.add("document",`ext-${U}`),H.dataset.docId=""+B.id,H.doc=B;const z=document.createElement("div");let j;z.classList.add("document-ico");const G=!!_,V=()=>G?_:A.thumbsStorage.getCacheContext(B);_=yield V();let K=!1;if((null===(D=B.thumbs)||void 0===D?void 0:D.length)||e.pFlags.is_outgoing&&_.url&&"photo"===B.type){H.classList.add("document-with-thumb"),K=!0;const t=[];if(e.pFlags.is_outgoing&&["photo","video"].includes(B.type)&&_.url)z.innerHTML=``,t.push(z.firstElementChild);else{performance.now();const e=yield(0,S.Z)({photo:B,message:null,container:z,boxWidth:54,boxHeight:54,loadPromises:Z,withoutPreloader:!0,lazyLoadQueue:k,size:(0,p.Z)(B,54,54,!0),managers:A});z.style.width=z.style.height="",e.images.thumb&&t.push(e.images.thumb),e.images.full&&t.push(e.images.full)}t.forEach((e=>e.classList.add("document-thumb")))}else j=document.createElement("span"),j.classList.add("document-ico-text"),j.innerText=U,z.append(j);const W=B.file_name?(0,g.Z)(B.file_name):"Unknown.file";document.createElement("div").classList.add("document-description");const $=document.createElement("span"),q=[(0,d.Z)(B.size)];if(t&&q.push((0,a.OD)(e.date)),M&&q.push(yield(0,C.Z)(e)),!t&&!M){const e=document.createElement("span"),t=(0,d.Z)(B.size);e.append(" / ",t),e.style.visibility="hidden",q.push(e)}H.innerHTML=`\n ${_.downloaded&&!N||!e.mid||!K?"":'
'}\n
\n
\n `;const Q=H.querySelector(".document-name"),Y=new y.I;Y.dataset.fontWeight=""+i,Y.dataset.fontSize=""+F,Y.dataset.sizeType=x,Y.textContent=W,e.mid||H.classList.add("downloaded"),Q.append(Y),M&&Q.append((0,L.Z)(e));const X=H.querySelector(".document-size");if($.append(...(0,f.A1)(q," · ")),X.append($),H.prepend(z),!N&&e.pFlags.is_outgoing&&!e.mid)return H;let J,ee=null;const te=()=>{if(H.classList.remove("downloading"),B.size>m.Iw&&!N)return ee.setManual(),ee.attach(J),ee.preloader.classList.add("manual"),void ee.setDownloadFunction(se);if(B.size<=m.Iw&&H.classList.add("downloaded"),J){if(J!==z){const e=J;setTimeout((()=>{e.remove()}),200)}J=null}ee&&(ee=null)},ie=e=>{H.classList.add("downloading");const t=document.createElement("span"),i=(0,d.Z)(B.size);t.style.position="absolute",t.style.left="0",e.then(te,l.Z).finally((()=>{$.style.visibility="",t.remove()}));const s=e=>(0,d.Z)(e);let n=s(0);$.style.visibility="hidden",t.append(n," / ",i),$.parentElement.append(t),e.addNotifyListener((e=>{const t=s(e.done);n.replaceWith(t),n=t}))},se=e=>{var t;const i=!e||e.isTrusted,n=H.doc;let a;const o=h.ZP.chat.bubbles?h.ZP.chat.bubbles.lazyLoadQueue.queueId:void 0;if(i)if("pdf"===n.type){const e=!ee||ee.detached;a=c.Z.downloadMediaURL({media:n,queueId:o}),e&&a.then((()=>{setTimeout((()=>E(this,void 0,void 0,(function*(){const e=(yield V()).url;window.open(e)}))),v.Z.settings.animationsEnabled?250:0)}))}else a=s.Z.has(n.mime_type)&&(null===(t=n.thumbs)||void 0===t?void 0:t.length)?c.Z.downloadMediaURL({media:n,queueId:o}):c.Z.downloadToDisc({media:n,queueId:o});else a=c.Z.downloadToDisc({media:n,queueId:o},!0);a.catch((()=>{H.classList.remove("downloading")})),J&&(ee.attach(J,!0,a),ie(a))},{fileName:ne}=(0,u.Z)({media:B,downloadId:"1"});if(yield A.apiFileManager.isDownloading(ne)){J=H.querySelector(".document-download")||z;const e=c.Z.downloadToDisc({media:B},!0);ee=new w.Z,ee.attach(J,!1,e),ee.setDownloadFunction(se),ie(e)}else if(!_.downloaded||N)if(J=H.querySelector(".document-download")||z,ee=new w.Z({isUpload:!!N}),N){const e=c.Z.getUpload(N);ee.attachPromise(e),ee.attach(J),ie(e)}else ee.construct(),ee.setManual(),ee.attach(J),ee.setDownloadFunction(se),void 0!==T&&T>=B.size&&(0,o.tH)(ee.preloader);return(0,o.fc)(H,(e=>{(0,r.Z)(e.target,"time")||(ee?ee.onClick(e):se(e))})),H}))}v.Z.addEventListener("document_downloading",(e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach((e=>{e.querySelector(".preloader-container.manual")&&(0,o.tH)(e)}))}))},8210:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(6272);function n(e){return"+"+(0,s.u)(e).formatted}},177:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(2575),n=i(2325),a=i(3512);function o(e,t=a.Z.managers){var i,o,r,d,l,c;return r=this,d=void 0,c=function*(){const a=yield t.appChatsManager.getChat(e);if("chatForbidden"===a._)return(0,n.ag)("YouWereKicked");const r=yield t.appProfileManager.getCachedFullChat(e);let d;d=r?"channelFull"===r._?r.participants_count:null===(i=r.participants.participants)||void 0===i?void 0:i.length:a.participants_count||(null===(o=a.participants)||void 0===o?void 0:o.participants.length),d=d||1;const l=a.pFlags.broadcast?"Peer.Status.Subscribers":"Peer.Status.Member";return(0,n.ag)(l,[(0,s.Z)(d)])},new((l=void 0)||(l=Promise))((function(e,t){function i(e){try{n(c.next(e))}catch(e){t(e)}}function s(e){try{n(c.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof l?n:new l((function(e){e(n)}))).then(i,s)}n((c=c.apply(r,d||[])).next())}))}},493:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(8456),n=i(5102),a=i(2325),o=i(8115),r=i(3512);function d(e){return t=this,i=void 0,l=function*(){const{peerId:t=r.Z.myId,plainText:i,onlyFirstName:d,limitSymbols:l,managers:c=r.Z.managers,threadId:h}=e;let u="";if(t.isUser()){const e=yield c.appUsersManager.getUser(t.toUserId());e&&(e.first_name&&(u+=e.first_name),!e.last_name||d&&u||(u+=" "+e.last_name)),u=u?u.trim():!e||e.pFlags.deleted?a.ZP.format(d?"Deleted":"HiddenName",!0):(0,n.Z)(e)[0]||""}else{if(h){const e=yield c.dialogsStorage.getForumTopic(t,h);u=(null==e?void 0:e.title)||""}if(!u){const e=yield c.appChatsManager.getChat(t.toChatId());u=(null==e?void 0:e.title)||""}d&&(u=u.split(" ")[0])}return void 0!==l&&(u=(0,s.Z)(u,l,l)),i?u:(0,o.Z)(u)},new((d=void 0)||(d=Promise))((function(e,s){function n(e){try{o(l.next(e))}catch(e){s(e)}}function a(e){try{o(l.throw(e))}catch(e){s(e)}}function o(t){var i;t.done?e(t.value):(i=t.value,i instanceof d?i:new d((function(e){e(i)}))).then(n,a)}o((l=l.apply(t,i||[])).next())}));var t,i,d,l}},3061:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(632),n=i(2325),a=i(1507);function o(e){var t;if(!e)return document.createElement("span");let i,o;switch(e.id){case a.hj.toUserId():i="Peer.RepliesNotifications";break;case a.yF.toUserId():i="Peer.ServiceNotifications";break;default:if(e.pFlags.bot){i="Bot";break}if(e.pFlags.support){i="SupportStatus";break}switch(null===(t=e.status)||void 0===t?void 0:t._){case"userStatusRecently":i="Lately";break;case"userStatusLastWeek":i="WithinAWeek";break;case"userStatusLastMonth":i="WithinAMonth";break;case"userStatusOffline":{const t=e.status.was_online,n=new Date,a=(n.getTime()/1e3|0)-t;if(a<60)i="Peer.Status.justNow";else if(a<3600)i="Peer.Status.minAgo",o=[a/60|0];else if(a<86400&&n.getDate()===new Date(1e3*t).getDate())i="LastSeen.HoursAgo",o=[a/3600|0];else{i="Peer.Status.LastSeenAt";const{dateEl:e,timeEl:n}=(0,s.rz)(t);o=[e,n]}break}case"userStatusOnline":i="Online";break;default:i="ALongTimeAgo"}}return(0,n.ag)(i,o)}},6131:(e,t,i)=>{"use strict";i.d(t,{MR:()=>d,ZP:()=>c,kN:()=>l});var s=i(3910),n=i(1046),a=i(319),o=i(6628),r=i(9099);function d(e){const{mediaSpoiler:t,reveal:i,destroyAfter:s}=e;(0,r.Z)({element:t,forwards:i,className:"is-revealing",duration:250,onTransitionEnd:()=>{i&&s&&(t.remove(),t.middlewareHelper.destroy())}})}function l(e){const{mediaSpoiler:t,event:i}=e;if((0,s.Z)(i),t.classList.contains("is-revealing"))return;const n=t.parentElement.querySelector("video");n&&!t.parentElement.querySelector(".video-play")&&(n.autoplay=!0,n.play().catch(a.Z)),d({mediaSpoiler:t,reveal:!0,destroyAfter:!0})}function c(e){return t=this,i=void 0,a=function*(){const{media:t}=e,i=(t.sizes||t.thumbs).find((e=>"photoStrippedSize"===e._));if(!i)return;const{image:s,loadPromise:a}=(0,n.Z)(t,i,!0);return yield a,function(e){const{middleware:t,image:i}=e;if(!t())return;i.classList.add("media-spoiler-thumbnail");const s=document.createElement("div");s.classList.add("media-spoiler-container"),s.middlewareHelper=t.create();const n=o.Z.create(Object.assign(Object.assign({},e),{middleware:s.middlewareHelper.get()}));return s.append(i,n.canvas),s}(Object.assign(Object.assign({},e),{image:s}))},new((s=void 0)||(s=Promise))((function(e,n){function o(e){try{d(a.next(e))}catch(e){n(e)}}function r(e){try{d(a.throw(e))}catch(e){n(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,s,a}},6239:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(9345);function n(e){return t=this,i=void 0,a=function*(){try{return yield(0,s.Z)(e)}catch(t){return console.error("wrapMessageActionTextNewUnsafe error:",t),e.plain?"":document.createElement("span")}},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}},9345:(e,t,i)=>{"use strict";i.d(t,{Z:()=>F,e:()=>x});var s=i(1655),n=i(632),a=i(2614),o=i(130),r=i(8939),d=i(5180),l=i(2946),c=i(2325),h=i(1507),u=i(8115),p=i(2491),f=i(5400),m=i(3512),g=i(2064),v=i(5798);let b,y,w;const S=new Map;var C=i(9083),L=i(493),E=i(3591);function I(e){const t=e.action,{onclick:i,url:s}=(0,E.Z)(`tg://voicechat?chat_id=${e.peerId.toChatId()}&id=${t.call.id}&access_hash=${t.call.access_hash}`);if(!i)return document.createElement("span");const n=document.createElement("a");return n.href=s,n.setAttribute("onclick",i+"(this)"),n}var M=i(496),P=i(7362),Z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function T(e){return Z(this,void 0,void 0,(function*(){const t=yield(0,M.Z)(e);if(e.plain)return t;const i=document.createElement("i");return i.dataset.savedFrom=e.message.peerId+"_"+e.message.mid,i.dir="auto",i.append(t),i}))}function k(e,t){return t?e:(0,a.Z)((0,u.Z)(e))}function x(e){return Z(this,void 0,void 0,(function*(){const t=e.topic;let i=null==t?void 0:t.icon_emoji_id;return(null==t?void 0:t.id)===h.Ox&&(i="5390854796011906616"),i?e.plain?m.Z.managers.appEmojiManager.getCustomEmojiDocument(i).then((e=>e.stickerEmojiRaw)):(0,C.N)(Object.assign(Object.assign({},e),{docIds:[i]})).then((e=>(e.lastElementChild.classList.add("topic-icon"),e))):e.plain?"":function(e,t){if(!b){w=document.getElementById("svg-defs");const e="http://www.w3.org/2000/svg";b=document.createElementNS(e,"svg"),b.setAttributeNS(null,"width","26"),b.setAttributeNS(null,"height","26"),b.setAttributeNS(null,"viewBox","0 0 26 26"),b.classList.add("topic-icon-svg");const t=document.createElementNS(e,"use");t.setAttributeNS(null,"href","#topic-icon"),b.append(t),y=document.createElement("span"),y.classList.add("topic-icon","avatar-like");const i=document.createElement("span");i.classList.add("topic-icon-content"),y.append(b,i)}e||(console.error("NO TOPIC ICON COLOR!"),e=h.OS[0]),t||(console.error("NO TOPIC NAME!"),t="");const i=e.toString(16),s=`topic-icon-gradient-${e}`;let n=S.get(e);if(!n){const{h:t,s:a,l:o,a:r}=(0,g.cw)("#"+i);w.insertAdjacentHTML("beforeend",`\n \n \n \n \n `),S.set(e,n=`hsla(${t}, ${a}%, ${Math.max(0,o-40)}%, ${r})`)}const a=y.cloneNode(!0);return a.firstElementChild.style.fill=`url(#${s})`,a.firstElementChild.style.stroke=n,a.lastElementChild.append((0,v.Z)(t,!0)),a}(null==t?void 0:t.icon_color,null==t?void 0:t.title)}))}function A(e){const t=e.message.action;return x(Object.assign(Object.assign({},e),{topic:t}))}function _(e){return Z(this,void 0,void 0,(function*(){const t=e.message.action,i=document.createElement("span");return i.classList.add("topic-name"),i.append(yield A(e),k(t.title,e.plain)),i}))}function F(e){var t;return Z(this,void 0,void 0,(function*(){const{plain:i,message:h,middleware:g,lazyLoadQueue:v,customEmojiSize:b,animationGroup:y}=e,w=i?void 0:document.createElement("span"),S="action"in h&&h.action;if(S.message){const e=S.message;return i?(0,p.Z)(e):((0,o.Z)(w,(0,f.ZP)(e,{noLinebreaks:!0})),w)}{let o,p,g=S._;const v=m.Z.managers,b=(e,t)=>t?(0,L.Z)({peerId:e,plainText:t}):(0,P.Z)({peerId:e});switch(S._){case"messageActionPhoneCall":g+="."+S.type,p=[(0,r.Z)(S.duration,i)];break;case"messageActionGroupCall":g+="."+S.type,p=[],g.endsWith("You")||h.pFlags.post||p.push(b(h.fromId,i)),void 0!==S.duration?p.push((0,r.Z)(S.duration,i)):p.push(I(h));break;case"messageActionInviteToGroupCall":{const e=[h.fromId,S.users[0].toPeerId()];let t="Chat.Service.VoiceChatInvitation";const n=m.Z.myId;e[0]===n?t+="ByYou":e[1]===n&&(t+="ForYou"),(0,s.Z)(e,n),o=t,p=e.map((e=>b(e,i))),p.push(I(h));break}case"messageActionGroupCallScheduled":{const e=new Date,t=new Date(1e3*S.schedule_date),s=(t.getTime()-e.getTime())/864e5,a=new Date(e);a.setDate(a.getDate()+1);const r=yield v.appPeersManager.isBroadcast(h.peerId);o=r?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",p=[];const d=m.Z.myId;let l;h.fromId===d?o+="You":r||p.push(b(h.fromId,i));const u=[];s<1&&t.getDate()===e.getDate()?l="TodayAtFormattedWithToday":s<2&&t.getDate()===a.getDate()?l="Time.TomorrowAt":(l="formatDateAtTime",u.push(new c.ZP.IntlDateElement({date:t,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),u.push((0,n.mr)(t));const f=(0,c.ag)(l,u);p.push(f);break}case"messageActionChatCreate":{const e=m.Z.myId;h.fromId===e?g+="You":p=[b(h.fromId,i)];break}case"messageActionPinMessage":{const t=h.peerId,s=yield v.appMessagesManager.getMessageByPeer(t,h.reply_to_mid);p=[b(h.fromId,i)],s?p.push(T(Object.assign(Object.assign({},e),{message:s}))):(o="ActionPinnedNoText",h.reply_to_mid&&v.appMessagesManager.fetchMessageReplyTo(h));break}case"messageActionChatJoinedByRequest":{const e=yield v.appPeersManager.isBroadcast(h.peerId);h.pFlags.out?o=e?"RequestToJoinChannelApproved":"RequestToJoinGroupApproved":(o=e?"ChatService.UserJoinedChannelByRequest":"ChatService.UserJoinedGroupByRequest",p=[b(h.fromId,i)]);break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":p=[b(h.fromId,i)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":p=[],"messageActionChatEditTitle"===S._&&p.push(b(h.fromId,i)),p.push(k(S.title));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const e=S.users||[S.user_id];if(p=[b(h.fromId,i)],e.length>1){const t=(0,c.v_)(yield Promise.all(e.map((e=>b(e.toPeerId(),i)))),!1,i);if(i)p.push(...t);else{const e=document.createElement("span");e.append(...t),p.push(e)}}else p.push(b(e[0].toPeerId(),i));break}case"messageActionBotAllowed":{const e=(0,f.ZP)(S.domain,{entities:[{_:"messageEntityUrl",length:S.domain.length,offset:0}]});p=[(0,a.Z)(e)];break}case"messageActionPaymentSent":{const s=S.pFlags.recurring_init,n=S.pFlags.recurring_used;if(o=n?"Chat.Service.PaymentSentRecurringUsedNoTitle":s?"Chat.Service.PaymentSentRecurringInitNoTitle":"Chat.Service.PaymentSent1NoTitle",p=[(0,d.Z)(S.total_amount,S.currency),b(h.peerId,i)],h.reply_to_mid){const i=yield v.appMessagesManager.getMessageByPeer((null===(t=h.reply_to)||void 0===t?void 0:t.reply_to_peer_id)?(0,l.Z)(h.reply_to.reply_to_peer_id):h.peerId,h.reply_to_mid);i?(o=n?"Chat.Service.PaymentSentRecurringUsed":s?"Chat.Service.PaymentSentRecurringInit":"Chat.Service.PaymentSent1",p.push(T(Object.assign(Object.assign({},e),{message:i})).then((e=>(e instanceof HTMLElement&&e.classList.add("is-receipt-link"),e))))):v.appMessagesManager.fetchMessageReplyTo(h)}break}case"messageActionSetMessagesTTL":{p=[];const e=yield v.appPeersManager.isBroadcast(h.peerId);if(S.period){let t;if(e?o="ActionTTLChannelChanged":h.fromId===m.Z.myId?o="ActionTTLYouChanged":(o="ActionTTLChanged",p.push(b(h.fromId,i))),S.period>1814400){let e;const s=[],a=31536e3;S.period>=a?(e="Years",s.push(S.period/a|0)):(e="Months",s.push(S.period/(30*n.s2)|0)),t=i?c.ZP.format(e,!0,s):(0,c.ag)(e,s)}else t=(0,r.Z)(S.period,i);p.push(t)}else e?o="ActionTTLChannelDisabled":h.fromId===m.Z.myId?o="ActionTTLYouDisabled":(o="ActionTTLDisabled",p.push(b(h.fromId,i)));break}case"messageActionTopicEdit":{let t,s,n;const a=!!h.pFlags.out,r=void 0!==S.icon_emoji_id,d=r&&!+S.icon_emoji_id,l=void 0!==S.title,c=void 0!==S.hidden;a||(n=b(h.fromId,i)),l&&(s=k(S.title)),r&&!d&&(t=A(e)),p=n?[n]:[],S.closed?o=a?"Chat.Service.Group.TopicEdited.You.Paused":"Chat.Service.Group.TopicEdited.Paused":!1===S.closed?o=a?"Chat.Service.Group.TopicEdited.You.Resumed":"Chat.Service.Group.TopicEdited.Resumed":d&&l?(o=a?"Chat.Service.TopicEdited.You.Mixed.IconRemoved":"Chat.Service.TopicEdited.Mixed.IconRemoved",p.push(s)):r&&l?(o=a?"Chat.Service.TopicEdited.You.Mixed":"Chat.Service.TopicEdited.Mixed",p.push(_(e))):d?o=a?"Chat.Service.Group.TopicEdited.You.Icon.Removed":"Chat.Service.Group.TopicEdited.Icon.Removed":l?(o=a?"Chat.Service.Group.TopicEdited.You.Title":"Chat.Service.Group.TopicEdited.Title",p.push(s)):r?(o=a?"Chat.Service.Group.TopicEdited.You.Icon":"Chat.Service.Group.TopicEdited.Icon",p.push(t)):c&&(o=a?S.hidden?"Chat.Service.Group.TopicEdited.You.Hided":"Chat.Service.Group.TopicEdited.You.Unhided":S.hidden?"Chat.Service.Group.TopicEdited.Hided":"Chat.Service.Group.TopicEdited.Unhided");break}case"messageActionTopicCreate":p=[_(e)],o="TopicWasCreatedAction";break;case"messageActionSetChatTheme":{const e=!!h.pFlags.out;let t;e||(t=b(h.fromId,i)),p=t?[t]:[],S.emoticon?(p.push((0,u.Z)(S.emoticon)),o=e?"ChatThemeChangedYou":"ChatThemeChangedTo"):o=e?"ChatThemeDisabledYou":"ChatThemeDisabled";break}default:o=c.Hz[g]||`[${S._}]`}o||(o=c.Hz[g],void 0===o&&(o="["+g+"]"));const y=p&&(yield Promise.all(p));return i?c.ZP.format(o,!0,y):(0,c.$d)(w,o,y)}}))}},496:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(8938),n=i(5705),a=i(677),o=i(3738),r=i(8456),d=i(5381),l=i(2325),c=i(1346),h=i(8115),u=i(2491),p=i(5400),f=i(3512),m=i(6239);function g(e){var t,i,g,v,b,y;return g=this,v=void 0,y=function*(){let{message:g,text:v,usingMids:b,plain:y,highlightWord:w,withoutMediaType:S}=e;null!=v||(v=g.message);const C=[];let L=!1;const E=(e,t)=>{if(e){if(void 0===t&&L)return;t=y?l.ZP.format(e,!0):(0,l.ag)(e)}if(y)C.push(t);else{const e=document.createElement("span");"string"==typeof t?e.innerHTML=t:e.append(t),C.push(e)}},I=f.Z.managers.appMessagesManager,M=(0,d.Z)(g);let P=null!==(t=g.totalEntities)&&void 0!==t?t:g.entities;if(g.media&&!M){(0,s.Z)(g);let e=!0;if(g.grouped_id){if(b){const t=yield I.getMidsByMessage(g);if(b.length===t.length){for(const i of t)if(!b.includes(i)){e=!1;break}}else e=!1}if(e){const e=yield I.getAlbumText(g.grouped_id);v=(null==e?void 0:e.message)||"",P=(null==e?void 0:e.totalEntities)||[],S||(E("AttachAlbum"),L=!0)}}else e=!1;if(!e&&!S||!v){const e=g.media;switch(e._){case"messageMediaPhoto":E("AttachPhoto");break;case"messageMediaDice":E(void 0,y?e.emoticon:(0,h.Z)(e.emoticon));break;case"messageMediaVenue":v=e.title,E("AttachLocation");break;case"messageMediaGeo":E("AttachLocation");break;case"messageMediaGeoLive":E("AttachLiveLocation");break;case"messageMediaPoll":const t="📊 "+(e.poll.question||"poll");E(void 0,y?t:(0,h.Z)(t));break;case"messageMediaContact":E("AttachContact");break;case"messageMediaGame":{const t="🎮 "+e.game.title;E(void 0,y?t:(0,h.Z)(t));break}case"messageMediaDocument":{const t=e.document;if("video"===t.type)E("AttachVideo");else if("voice"===t.type)E("AttachAudio");else if("gif"===t.type)E("AttachGif");else if("round"===t.type)E("AttachRound");else if("sticker"===t.type){const e=C.length;if(t.stickerEmojiRaw){const e=t.stickerEmojiRaw+" ";E(void 0,y?e:(0,h.Z)(e))}E("AttachSticker");const i=C.splice(e,2);if(y)C.push(i[0]+(i[1]?i[1]:""));else{const e=window.document.createElement("span");e.append(...i),C.push(e)}v=""}else if("audio"===t.type){const e=t.attributes.find((e=>"documentAttributeAudio"===e._&&(e.title||e.performer))),i="🎵 "+(e?[e.title,e.performer].filter(Boolean).join(" - "):t.file_name);E(void 0,y?i:(0,h.Z)(i))}else E(void 0,y?t.file_name:(0,h.Z)(t.file_name));break}case"messageMediaInvoice":"messageExtendedMediaPreview"===(null===(i=e.extended_media)||void 0===i?void 0:i._)?E(void 0,y?e.description:(0,h.Z)(e.description)):E(void 0,y?e.title:(0,h.Z)(e.title));break;case"messageMediaUnsupported":E(l.nK)}}const t=C.length;for(let e=1;e{"use strict";i.d(t,{Z:()=>n});var s=i(8842);function n(e){return t=this,i=void 0,a=function*(){const t=new s.Z;return yield t.update(e),t.element},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}},9492:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(2830),n=i(4755),a=i(3512),o=i(3442),r=i(6705),d=i(8580),l=i(1713),c=i(7030),h=i(2312),u=i(3114),p=i(7660),f=i(319),m=i(1507),g=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function v({photo:e,message:t,container:i,boxWidth:b,boxHeight:y,withTail:w,isOut:S,lazyLoadQueue:C,middleware:L,size:E,withoutPreloader:I,loadPromises:M,autoDownloadSize:P,noBlur:Z,noThumb:T,noFadeIn:k,blurAfter:x,managers:A=a.Z.managers,processUrl:_}){return g(this,void 0,void 0,(function*(){const F={loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null},D="document"===e._,R=D&&e.mime_type.startsWith("image/")&&!E,B=(0,u.Z)(e);if(!(e.sizes||e.thumbs||B||R))return b&&y&&!E&&D&&(0,l.Z)(e,i,b,y,void 0,t),F;let N=0===P;E||(void 0===b&&(b=n.Z.active.regular.width),void 0===y&&(y=n.Z.active.regular.height)),i.classList.add("media-container");let O,U,H,z=i,j=!0,G=Promise.resolve();if(b&&y&&!E){const s=(0,l.Z)(e,i,b,y,void 0,t,void 0,R?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:m.Pt}:void 0);if(E=s.photoSize,j=s.isFit,U=yield A.thumbsStorage.getCacheContext(e,E.type),!j&&!B){z=document.createElement("div"),z.classList.add("media-container-aspecter"),z.style.width=s.size.width+"px",z.style.height=s.size.height+"px";const n=(0,d.Z)(e,U,!Z,!0);if(n){G=n.loadPromise;const e=n.image;e.classList.add("media-photo"),i.append(e)}else(yield v({container:i,message:t,photo:e,boxWidth:0,boxHeight:0,size:E,lazyLoadQueue:C,isOut:S,loadPromises:M,middleware:L,withoutPreloader:I,withTail:w,autoDownloadSize:P,noBlur:Z,noThumb:!0,blurAfter:!0,managers:A})).images.full.classList.add("media-photo","thumbnail");i.classList.add("media-container-fitted"),i.append(z)}}else E||(E=(0,c.Z)(e,b,y,!0)),U=yield A.thumbsStorage.getCacheContext(e,null==E?void 0:E.type);if(!T&&!B){const t=(0,d.Z)(e,U,!Z);t&&(G=Promise.all([G,t.loadPromise]),F.loadPromises.thumb=F.loadPromises.full=G,O=F.images.thumb=t.image,O.classList.add("media-photo"),z.append(O))}if(F.aspecter=z,"photoSizeEmpty"===(null==E?void 0:E._)&&D||(null==E?void 0:E.bytes))return F;"videoSize"===(null==E?void 0:E._)?(H=F.images.full=(0,p.Z)(),H.autoplay=!0,H.loop=!0,H.muted=!0,H.classList.add("media-photo")):(H=F.images.full=new Image,H.classList.add("media-photo"));const V=(O||!U.downloaded)&&a.Z.settings.animationsEnabled&&!k;let K;const W=null==t?void 0:t.uploadingFileName;I||(U.downloaded&&!W||(K=new o.Z({attachMethod:"prepend",isUpload:!!W})),W&&(K.attachPromise(h.Z.getUpload(W)),K.attach(i),N=void 0));const $=e=>(0,s.Z)(i,H,e,V,z,O),q=e=>g(this,void 0,void 0,(function*(){if(!L||L()){if(_&&(e=yield _(e)),x){const t=(0,r.Z)(e,12);return t.promise.then((()=>$(t.canvas.toDataURL())))}return $(e)}}));let Q;const Y=E.w>=150&&E.h>=150||N,X=()=>g(this,void 0,void 0,(function*(){N&&!I&&K&&(K.construct(),K.setManual());const t=(()=>{const t=R&&!E;return h.Z.downloadMediaURL({media:e,thumb:E,queueId:null==C?void 0:C.queueId,onlyCache:t?void 0:N})})(),s=yield A.thumbsStorage.getCacheContext(e,null==E?void 0:E.type);K&&!s.downloaded&&!I&&Y&&K.attach(i,!1,t),N=void 0;const n=t.then(q);return n.catch(f.Z),{download:t,render:n}}));return K&&K.setDownloadFunction(X),U.downloaded?G=Q=(yield X()).render:C?C.push({div:i,load:()=>X().then((({download:e})=>e))}):Q=(yield X()).render,M&&G&&M.push(G),yield G,F.loadPromises.thumb=G,F.loadPromises.full=Q||Promise.resolve(),F.preloader=K,F}))}},5671:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(2291),n=i(2325),a=i(3512),o=i(7362);function r(e){return t=this,i=void 0,d=function*(){const t=document.createElement("span");t.classList.add("sender-title");const i=e.fromId===a.Z.myId&&e.peerId!==a.Z.myId;if(t.append(i?(0,n.ag)("FromYou"):yield(0,o.Z)(Object.assign(Object.assign({},(0,s.Z)(e)),{dialog:e.peerId===a.Z.myId}))),(yield a.Z.managers.appPeersManager.isAnyGroup(e.peerId))||i){const i=yield(0,o.Z)({peerId:e.peerId});t.append(" ➝ ",i)}return t},new((r=void 0)||(r=Promise))((function(e,s){function n(e){try{o(d.next(e))}catch(e){s(e)}}function a(e){try{o(d.throw(e))}catch(e){s(e)}}function o(t){var i;t.done?e(t.value):(i=t.value,i instanceof r?i:new r((function(e){e(i)}))).then(n,a)}o((d=d.apply(t,i||[])).next())}));var t,i,r,d}},1604:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(632);function n(e){const t=document.createElement("span");return t.classList.add("sent-time"),t.append((0,s.zM)(new Date(1e3*e.date))),t}},3541:(e,t,i)=>{"use strict";i.d(t,{Vp:()=>F,ZP:()=>B,_2:()=>N,_i:()=>R});var s=i(5269),n=i(3725),a=i(3910),o=i(2738),r=i(7660),d=i(8497),l=i(6740),c=i(1046),h=i(1185),u=i(5471),p=i(9405),f=i(4755),m=i(925),g=i(3174),v=i(6724),b=i(9674),y=i(2312),w=i(4271),S=i(2790),C=i(7030),L=i(13),E=i(1447),I=i(3512),M=i(7730),P=i(671),Z=i(5814),T=i(6787),k=i(2796),x=i(6775),A=i(645),_=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const F=1.49,D={},R={};function B({doc:e,div:t,middleware:i,loadStickerMiddleware:d,lazyLoadQueue:m,exportLoad:v,group:w,play:S,onlyThumb:B,emoji:N,width:O,height:U,withThumb:H,loop:z,loadPromises:j,needFadeIn:G,needUpscale:V,skipRatio:K,static:W,managers:$=I.Z.managers,fullThumb:q,isOut:Q,noPremium:Y,withLock:X,relativeEffect:J,loopEffect:ee,isCustomEmoji:te,syncedVideo:ie}){var se;return _(this,void 0,void 0,(function*(){t=Array.isArray(t)?t:[t],te&&(N=e.stickerEmojiRaw);const ne=e.sticker;if(1===ne&&(W=!0),!O&&!U){const t=f.Z.active,i=N?t.emojiSticker:e.animated?t.animatedSticker:t.staticSticker,s=(0,p.C)(e.w,e.h).aspectFitted(i);O=s.width,U=s.height}let ae;2===ne&&E.Z.loadLottieWorkers(),t.forEach((t=>{t.dataset.docId=""+e.id,N&&(t.dataset.stickerEmoji=N),t.classList.add("media-sticker-wrapper")}));const oe=(t=(null==ae?void 0:ae.type))=>_(this,void 0,void 0,(function*(){return ae=yield $.thumbsStorage.getCacheContext(e,t)})),re=!W&&(2===ne||3===ne),de=(0,L.Z)(e);void 0!==Q&&de&&!Q&&t.forEach((e=>e.classList.add("reflect-x")));const le=de&&X;if(le){const i=D[e.id];t.forEach((e=>{e.classList.add("is-premium-sticker","tgico-premium_lock"),i&&e.style.setProperty("--lock-url",`url(${i})`)}))}if(W&&1!==ne){const t=(0,C.Z)(e,O,U,!1);yield oe(t.type)}else yield oe(null==q?void 0:q.type);const ce=N&&!te?(0,P.tB)(N):-1,he=ae.downloaded&&!G,ue=re,pe=2===ne||3===ne?yield $.appDocsManager.getLottieCachedThumb(e.id,ce):void 0,fe={render:void 0,load:void 0};let me=(0,n.Z)(),ge=!1;if(((null===(se=e.thumbs)||void 0===se?void 0:se.length)||pe)&&!t[0].firstElementChild&&(!he||ue||B)&&!1!==H){let n=pe||e.thumbs[0];const a=(e,t)=>{e.childElementCount?me.resolve():(t.classList.add("media-sticker","thumbnail"),b.Z.mutateElement(e,(()=>{e.append(t),me.resolve()})))};if("url"in n)ge=!0,t.forEach((e=>{const t=new Image;(0,l.ZP)(t,n.url,(()=>a(e,t)))}));else if("bytes"in n){if("photoPathSize"===n._){n.bytes.length||(n=e.thumbs.find((e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length}))||n);const i=function(e){let t="M";for(let i=0,s=e.length;i=192?t+="AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,"[s-128-64]:(s>=128?t+=",":s>=64&&(t+="-"),t+=""+(63&s))}return t+="z",t}(n.bytes),s="http://www.w3.org/2000/svg",a=document.createElementNS(s,"svg");a.classList.add("rlottie-vector","media-sticker","thumbnail"),a.setAttributeNS(null,"viewBox",`0 0 ${e.w||512} ${e.h||512}`);const o=document.createElementNS(s,"path");o.setAttributeNS(null,"d",i),I.Z.settings.animationsEnabled&&!te&&o.setAttributeNS(null,"fill","url(#g)"),a.append(o),t.forEach(((e,t)=>e.append(t>0?a.cloneNode(!0):a))),ge=!0,me.resolve()}else if(ce<=0){const o=()=>{t.forEach((t=>{const i=new Image,s=(0,h.Z)(e,n,!0);(0,l.ZP)(i,s,(()=>a(t,i)))}))};s.Z||e.pFlags.stickerThumbConverted||ae.url?(ge=!0,o()):(ge=!0,M.Z.convert("main-"+e.id,n.bytes).then((s=>{$.appDocsManager.saveWebPConvertedStrippedThumb(e.id,s),n.bytes=s,e.pFlags.stickerThumbConverted=!0,i&&!i()||t[0].childElementCount?me.resolve():o()})).catch((()=>me.resolve())))}}else if((2===ne&&ce<=0||3===ne)&&(H||B)){const s=()=>_(this,void 0,void 0,(function*(){if(t[0].childElementCount||i&&!i())return void me.resolve();const s=(e,t,s)=>{e.childElementCount||i&&!i()?me.resolve():s?(0,l.ZP)(t,s,(()=>a(e,t))):a(e,t)};yield oe(),t.forEach((t=>{if(ae.url)s(t,new Image,ae.url);else if("bytes"in n){const i=(0,c.Z)(e,n,!0);i.loadPromise.then((()=>s(t,i.image,"")))}else y.Z.downloadMediaURL({media:e,thumb:n}).then((e=>_(this,void 0,void 0,(function*(){return s(t,new Image,e)}))))}))}));if(m&&B)return m.push({div:t[0],load:s}),me.resolve(),fe;s(),n.url&&(ge=!0)}}if(j&&ge&&j.push(me),B)return fe;const ve=(0,u.Z)("MIDDLEWARE"),be=()=>_(this,void 0,void 0,(function*(){if(i&&!i())throw ve;if(2===ne&&!W)return y.Z.downloadMedia({media:e,queueId:null==m?void 0:m.queueId,thumb:q}).then((s=>_(this,void 0,void 0,(function*(){if(i&&!i())throw ve;const n=yield E.Z.loadAnimationWorker({container:t[0],loop:!(N&&!te)&&z,autoplay:S,animationData:s,width:O,height:U,name:"doc"+e.id,needUpscale:V,skipRatio:K,toneIndex:ce,sync:te,middleware:null!=d?d:i,group:w}),a=le?()=>{var i,s;const a=null!==(i=D[s=e.id])&&void 0!==i?i:D[s]=function(e){var t;const i=e.getContext("2d"),s=20*(null!==(t=e.dpr)&&void 0!==t?t:1),n=s,a=s,o=(e.width-n)/2,r=e.height-a-0,d=i.getImageData(o,r,n,a).data;let l=0,c=0,h=0,u=0;for(let e=0;ee.style.setProperty("--lock-url",`url(${a})`)))}:void 0;return n.addEventListener("firstFrame",(()=>{const i=n.canvas[0];(!1!==H||te)&&(0,g.O)(e,i,ce),le&&a(),te||t.forEach(((e,t)=>{((e,t)=>{const i=e.firstElementChild;!1!==G&&(G=(G||!i||"svg"===i.tagName)&&I.Z.settings.animationsEnabled);const s=()=>{i&&i!==t&&"DIV"!==i.tagName&&i.remove()};G?b.Z.mutate((()=>{t&&t.classList.add("fade-in"),i&&i.classList.add("fade-out"),(t||i).addEventListener("animationend",(()=>{b.Z.mutate((()=>{t&&t.classList.remove("fade-in"),s()}))}),{once:!0})})):i&&b.Z.mutate(s)})(e,n.canvas[t])}))}),{once:!0}),N&&$.appStickersManager.preloadAnimatedEmojiStickerAnimation(N),n}))));if(W||3===ne){const s=re&&ie,n=s?A.Z.generateName(""+e.id,0,0,void 0,void 0):void 0,a=R[n];if(a)return a;const o=(s?t.slice(0,1):t).map((()=>{let e;if(W)e=new Image;else{const t=e=(0,r.Z)();if(t.muted=!0,S&&(t.autoplay=!0),z&&(t.loop=!0),z&&"number"==typeof z){let i=0,s=0;function n(){i>this.currentTime&&++s===z&&(this.autoplay=!1,this.loop=!1,this.pause(),t.removeEventListener("timeupdate",n)),i=this.currentTime}t.addEventListener("timeupdate",n)}}return e.classList.add("media-sticker"),e})),c=t.map(((e,t)=>e.firstElementChild!==o[t]&&e.firstElementChild));!1!==G&&(G=(G||!he||(W?c[0]:!c[0]||"svg"===c[0].tagName))&&I.Z.settings.animationsEnabled),G&&o.forEach((e=>e.classList.add("fade-in")));const h=new Promise(((n,a)=>_(this,void 0,void 0,(function*(){const r=()=>_(this,void 0,void 0,(function*(){if(i&&!i())return void a(ve);const r=o.length,d=[];let h;yield oe(),t.forEach(((t,u)=>{const p=o[u];p&&(h=(0,l.cj)(p,ae.url)),h.then((()=>((t,o,l)=>{b.Z.mutateElement(t,(()=>{if(!i||i())if(o){if(o){const t=O*window.devicePixelRatio,i=U*window.devicePixelRatio;if(!(0,g.k)(e,ce,t,i)){const s=document.createElement("canvas");s.width=t,s.height=i,s.getContext("2d").drawImage(o,0,0,s.width,s.height),(0,g.O)(e,s,ce)}}s?n(o):(t.append(o),G?(l&&l.classList.add("fade-out"),o.addEventListener("animationend",(()=>{o.classList.remove("fade-in"),null==l||l.remove()}),{once:!0})):null==l||l.remove(),re&&Z.Z.addAnimation(o,w,void 0,i),d.push(o)===r&&n(d))}else s&&re||null==l||l.remove();else a(ve)}))})(t,p,c[u])))}))}));if(yield oe(),ae.url)r();else{let t;if(1!==ne&&W){const i=(0,C.Z)(e,O,U,!1);t=y.Z.downloadMediaURL({media:e,thumb:i,queueId:null==m?void 0:m.queueId})}else t=y.Z.downloadMediaURL({media:e,queueId:null==m?void 0:m.queueId});t.then(r,a)}}))));return n&&(R[n]=h,d&&h.finally((()=>{d()||delete R[n]}))),h}}));if(v&&(1===v&&(!he||re)||2===v))return fe.load=be,fe;const ye=!m||he&&!re?be():(m.push({div:t[0],load:be}),Promise.resolve());return he&&W&&(me=ye,j&&j.push(me)),2===ne&&de&&void 0!==Q&&!Y&&function({container:e,doc:t,managers:i,middleware:s,isOut:n,width:r,loadPromise:d,relativeEffect:l,loopEffect:c}){i.appStickersManager.preloadSticker(t.id,!0);let h=!1;(0,o.fc)(e,(i=>_(this,void 0,void 0,(function*(){if((0,a.Z)(i),h){const e=document.createElement("a");return e.onclick=()=>{(0,k.PE)(),new T.Z(t.stickerSetInput).show()},void(0,k.bC)({langPackKey:"Sticker.Premium.Click.Info",langPackArguments:[e]})}h=!0,yield d;const{animationDiv:o,stickerPromise:u}=(0,x.Z)({doc:t,middleware:s,side:n?"right":"left",size:r*F,target:e,play:!0,fullThumb:(0,L.Z)(t),relativeEffect:l,loopEffect:c});void 0===n||n||o.classList.add("reflect-x"),u.then((e=>{e.addEventListener("destroy",(()=>{h=!1}))}))}))))}({container:t[0],doc:e,managers:$,middleware:i,isOut:Q,width:O,loadPromise:ye,relativeEffect:J,loopEffect:ee}),fe.render=ye,fe}))}function N({event:e,container:t,managers:i,peerId:s,middleware:n}){var o,r;return _(this,void 0,void 0,(function*(){(0,a.Z)(e);const l=(0,d.Z)(t,"bubble"),c=t.dataset.stickerEmoji,h=t.classList.contains("custom-emoji")?void 0:E.Z.getAnimation(t);if(null==h?void 0:h.paused){const e=yield i.appStickersManager.getAnimatedEmojiSoundDocument(c);if(e){const i=document.createElement("audio");i.style.display="none",t.parentElement.append(i);try{const t=yield y.Z.downloadMediaURL({media:e});i.src=t,i.play(),yield(0,m.Z)(i,void 0,!0),i.addEventListener("ended",(()=>{i.src="",i.remove()}),{once:!0})}catch(e){}}h.autoplay=!0,h.restart()}if(!s.isUser())return;const u=yield i.appStickersManager.getAnimatedEmojiSticker(c,!0);if(!u)return;const p=null!==(o=(r=t).emojiData)&&void 0!==o?o:r.emojiData={a:[],v:1},f=t.sendInteractionThrottled=(0,v.Z)((()=>{if(!p.a.length)return;const e=p.a[0].t;p.a.forEach((t=>{t.t=(t.t-e)/1e3}));const s=(0,d.Z)(t,"bubble");i.appMessagesManager.setTyping(w.ZP.chat.peerId,{_:"sendMessageEmojiInteraction",msg_id:(0,S.Z)(+s.dataset.mid),emoticon:c,interaction:{_:"dataJSON",data:JSON.stringify(p)}},!0,w.ZP.chat.threadId),p.a.length=0}),1e3,!1),g=l?l.classList.contains("is-out"):void 0,{animationDiv:b}=(0,x.Z)({doc:u,middleware:n,side:g?"right":"left",size:360,target:t,play:!0,withRandomOffset:!0});void 0===g||g||b.classList.add("reflect-x"),e.isTrusted&&(p.a.push({i:1,t:Date.now()}),f())}))}},6775:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u});var s=i(2131),n=i(8938),a=i(8487),o=i(5471),r=i(3624),d=i(9966),l=i(241),c=i(4271),h=i(3541);function u({size:e,doc:t,middleware:i,target:u,side:p,skipRatio:f,play:m,managers:g,fullThumb:v,withRandomOffset:b,relativeEffect:y,loopEffect:w}){var S;const C=document.createElement("div");let L;C.classList.add("emoji-animation"),C.style.width=e+"px",C.style.height=e+"px";const E=()=>{I.clean(),null==L||L.remove(),C.remove(),c.ZP.chat.bubbles.scrollable.container.removeEventListener("scroll",x)},I=null!==(S=null==i?void 0:i.create())&&void 0!==S?S:(0,r.k)();i=I.get();const M=(0,h.ZP)({div:C,doc:t,middleware:i,withThumb:!1,needFadeIn:!1,loop:!!w,width:e,height:e,play:m,group:"none",skipRatio:f,managers:g,fullThumb:v}).then((({render:e})=>e)).then((e=>{if((0,n.Z)(e),!i())throw e.remove(),(0,o.Z)("MIDDLEWARE");return L=e,L.addEventListener("enterFrame",(e=>{(w||e!==L.maxFrame)&&(0,a.Z)(u)||E()})),s.Z&&L.addEventListener("firstFrame",(()=>{navigator.vibrate(100)}),{once:!0}),L})),P=e=>{const t=Math.random()*e*2;return t>e?-t%e:t},Z=b?P(16):0,T=b?P(4):0,k=()=>{if(!(0,a.Z)(u))return void E();const t=u.getBoundingClientRect(),i=t.width/200,s="center"===p?0:16*("right"===p?1:-1)*i,n="center"===p?0:0*i,o="right"===p?t.right:t.left,r=t.top,d=("center"===p?(t.width-e)/2:"right"===p?-e:0)+s+Z,c=(t.height-e)/2+n+T,h=o+d,f=r+c;f<=-e||f>=l.Z.height?E():y?("center"!==p?C.style[p]=-1*Math.abs(s)+"px":C.style.left=d+"px",C.style.top=c+"px"):(C.style.top=f+"px",C.style.left=h+"px")},x=(0,d.Z)(k);return c.ZP.chat.bubbles.scrollable.container.addEventListener("scroll",x),k(),y?(C.classList.add("is-relative"),u.parentElement.append(C)):c.ZP.emojiAnimationContainer.append(C),{animationDiv:C,stickerPromise:M}}},5772:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(3541);function a(e){return t=this,i=void 0,o=function*(){const{emoji:t,div:i,managers:a=s.Z.managers}=e,o=yield a.appStickersManager.getAnimatedEmojiSticker(t);if(!o)throw i.classList.add("media-sticker-wrapper"),new Error("no sticker");return(0,n.ZP)(Object.assign(Object.assign({},e),{doc:o,loop:!1,play:!0}))},new((a=void 0)||(a=Promise))((function(e,s){function n(e){try{d(o.next(e))}catch(e){s(e)}}function r(e){try{d(o.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(n,r)}d((o=o.apply(t,i||[])).next())}));var t,i,a,o}},1273:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(7660),n=i(6740),a=i(2312),o=i(1447),r=i(3512),d=i(5814),l=i(3541),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function h({set:e,lazyLoadQueue:t,container:i,group:h,autoplay:u,width:p,height:f,managers:m=r.Z.managers,middleware:g}){var v;return c(this,void 0,void 0,(function*(){if(null===(v=e.thumbs)||void 0===v?void 0:v.length)return i.classList.add("media-sticker-wrapper"),void t.push({div:i,load:()=>c(this,void 0,void 0,(function*(){const t=yield m.appStickersManager.getStickerSetThumbDownloadOptions(e),r=a.Z.download(t);if(e.pFlags.animated&&!e.pFlags.videos)return r.then((t=>{o.Z.loadAnimationWorker({container:i,loop:!0,autoplay:u,animationData:t,width:p,height:f,needUpscale:!0,name:"setThumb"+e.id,group:h,middleware:g})}));{let t;return e.pFlags.videos?(t=(0,s.Z)(),t.autoplay=!0,t.muted=!0,t.loop=!0):t=new Image,t.classList.add("media-sticker"),r.then((s=>{(0,n.ZP)(t,URL.createObjectURL(s),(()=>{i.append(t),e.pFlags.videos&&d.Z.addAnimation(t,h)}))}))}}))});let r;r=e.thumb_document_id?m.appEmojiManager.getCustomEmojiDocument(e.thumb_document_id):m.appStickersManager.getStickerSet(e).then((e=>e.documents[0]));const b=yield r;"documentEmpty"!==b._&&(0,l.ZP)({doc:b,div:i,group:h,lazyLoadQueue:t,managers:m,width:p,height:f,middleware:g})}))}},62:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3541);function n({doc:e,row:t,size:i,managers:n}){const a=t.media,o=t.createMedia("small");a&&o.classList.add("hide");const r=a?[]:void 0,d="small"===i?32:48,l=(0,s.ZP)({div:o,doc:e,width:d,height:d,loadPromises:r,managers:n}).then((({render:e})=>e));return r&&Promise.all(r).then((()=>{o.classList.remove("hide"),a.remove()})),l}},9102:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(2790),n=i(4497),a=i(7362);function o(e){return t=this,i=void 0,r=function*(){const{peerId:t,threadId:i,lastMsgId:o}=e,r=Promise.resolve(),d=(0,n.Z)("t.me/c/"+t.toChatId()+(i?"/"+(0,s.Z)(i):"")+(o?"/"+(0,s.Z)(o):""));return d.classList.add("topic-name","topic-name-button"),d.append(yield(0,a.Z)(e)),{cached:!0,element:d,loadPromise:r}},new((o=void 0)||(o=Promise))((function(e,s){function n(e){try{d(r.next(e))}catch(e){s(e)}}function a(e){try{d(r.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(t,i||[])).next())}));var t,i,o,r}},2887:(e,t,i)=>{"use strict";i.d(t,{Z:()=>x});var s=i(4762),n=i(5296),a=i(3725),o=i(3910),r=i(2738),d=i(7660),l=i(8487),c=i(6740),h=i(8580),u=i(5471),p=i(4755),f=i(319),m=i(925),g=i(3035),v=i(6724),b=i(9674),y=i(5157),w=i(2312),S=i(4271),C=i(1507),L=i(3512),E=i(5814),I=i(3013),M=i(8448),P=i(3442),Z=i(9492),T=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let k=0;function x({doc:e,container:t,message:i,boxWidth:x,boxHeight:A,withTail:_,isOut:F,middleware:D,lazyLoadQueue:R,noInfo:B,group:N,onlyPreview:O,noPreview:U,withoutPreloader:H,loadPromises:z,noPlayButton:j,photoSize:G,videoSize:V,searchContext:K,autoDownload:W,managers:$=L.Z.managers,noAutoplayAttribute:q}){var Q;return T(this,void 0,void 0,(function*(){const Y=null==W?void 0:W.video;let X=0===Y;const J=!(x&&A),ee=("video"!==e.type||e.size<=52428800&&!J)&&("gif"===e.type?L.Z.settings.autoPlay.gifs:L.Z.settings.autoPlay.videos);let te,ie;if(!B){te=document.createElement("span"),te.classList.add("video-time"),t.append(te);let i=!1;"gif"!==e.type?(te.innerText=(0,y.Z)(e.duration,!1),j||"round"===e.type||(ee&&!X?te.classList.add("tgico","can-autoplay"):i=!0)):(te.innerText="GIF",ee||j||(i=!0,X=void 0)),i&&(ie=document.createElement("span"),ie.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(ie))}const se={};if("image/gif"===e.mime_type){const s=yield(0,Z.Z)({photo:e,message:i,container:t,boxWidth:x,boxHeight:A,withTail:_,isOut:F,lazyLoadQueue:R,middleware:D,withoutPreloader:H,loadPromises:z,autoDownloadSize:Y,size:G,managers:$});return se.thumb=s,se.loadPromise=s.loadPromises.full,se}let ne;const ae=(0,d.Z)();if(ae.classList.add("media-video"),ae.muted=!0,"round"===e.type){const s=document.createElement("div");s.classList.add("media-round","z-depth-1"),s.dataset.mid=""+i.mid,s.dataset.peerId=""+i.peerId,s.message=i;const a=p.Z.active.round,d=a.width/2,c=3.5,h=d-2*c;s.innerHTML=`\n \n `;const u=s.firstElementChild.firstElementChild;k||(k=2*Math.PI*h),u.style.strokeDasharray=k+" "+k,u.style.strokeDashoffset=""+k,te.classList.add("tgico"),i.pFlags.media_unread&&s.classList.add("is-unread");const f=document.createElement("canvas");f.width=f.height=e.w,s.prepend(f,te),s.append(ae),t.append(s);const m=f.getContext("2d"),b=()=>{const e=s.message,t=I.Z.addMedia(e,!X),i=()=>{(S.ZP.chat.setPeerPromise||Promise.resolve()).finally((()=>{(0,l.Z)(t)||(t.removeEventListener("play",h),t.removeEventListener("timeupdate",c),t.removeEventListener("pause",p),t.removeEventListener("ended",b))}))},a=()=>{m.drawImage(t,0,0);const e=k-t.currentTime/t.duration*k;return u.style.strokeDashoffset=""+e,!t.paused},d=()=>{t.duration&&((0,l.Z)(t)?(t.paused&&a(),te.innerText=(0,y.Z)(t.duration-t.currentTime,!1)):i())},c=(0,v.Z)((()=>{(0,g.T2)(d)}),1e3,!1),h=()=>{ae.classList.add("hide"),s.classList.remove("is-paused"),(0,n.cK)(a,f),ne&&ne.preloader&&ne.preloader.classList.contains("manual")&&ne.onClick()},p=()=>{(0,l.Z)(t)?s.classList.add("is-paused"):i()},b=()=>{ae.classList.remove("hide"),s.classList.add("is-paused"),ae.currentTime=0,te.innerText=(0,y.Z)(t.duration,!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",h),t.addEventListener("timeupdate",c),t.addEventListener("pause",p),t.addEventListener("ended",b),(0,r.fc)(f,(i=>{if((0,o.Z)(i),ne&&!ne.detached&&ne.onClick(),t.paused){const i=!!K;if(I.Z.setSearchContext(K||{peerId:C.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=i?(0,M.ns)(s,e.mid):[];I.Z.setTargets({peerId:e.peerId,mid:e.mid},t,n)}t.play()}else t.pause()})),t.paused?t.duration&&t.currentTime!==t.duration&&t.currentTime>0?(a(),d(),ae.classList.add("hide")):p():h()};i.pFlags.is_outgoing?(s.onLoad=b,s.dataset.isOutgoing="1"):b()}else q||(ae.autoplay=!0);let oe,re;if(i){if(oe=yield(0,Z.Z)({photo:e,message:i,container:t,boxWidth:x,boxHeight:A,withTail:_,isOut:F,lazyLoadQueue:R,middleware:D,withoutPreloader:!0,loadPromises:z,autoDownloadSize:null==W?void 0:W.photo,size:G,managers:$}),se.thumb=oe,!ee&&"gif"!==e.type||O)return se.loadPromise=oe.loadPromises.full,se;if(_){const e=(oe.images.thumb||oe.images.full).parentElement;ae.width=+e.getAttributeNS(null,"width"),ae.height=+e.getAttributeNS(null,"height"),e.append(ae)}}else if(!U){const i=(0,h.Z)(e,{},!0);if(i){const e=i.image;e.classList.add("media-poster"),t.append(e),se.thumb={loadPromises:{thumb:i.loadPromise,full:Promise.resolve()},images:{thumb:e,full:null},preloader:null,aspecter:null},null==z||z.push(i.loadPromise),se.loadPromise=i.loadPromise}}if(O)return se;!ae.parentElement&&t&&((null==oe?void 0:oe.aspecter)||t).append(ae);const de=()=>T(this,void 0,void 0,(function*(){return re=yield $.thumbsStorage.getCacheContext(e,null==V?void 0:V.type)}));yield de();const le=null==i?void 0:i.uploadingFileName;le?(ne=new P.Z({attachMethod:"prepend",isUpload:!0}),ne.attachPromise(w.Z.getUpload(le)),ne.attach(t,!1),X=void 0):re.downloaded||e.supportsStreaming||H?e.supportsStreaming&&(ne=new P.Z({cancelable:!1,attachMethod:"prepend"})):ne=new P.Z({attachMethod:"prepend"});const ce=(0,a.Z)();if(ae.addEventListener("error",(e=>{4!==ae.error.code&&console.error("Error "+ae.error.code+"; details: "+ae.error.message),ne&&!le&&ne.detach(),ce.isFulfilled||ce.resolve()}),{once:!0}),"video"===e.type){const e=()=>{ae.duration&&(te.innerText=(0,y.Z)(ae.duration-ae.currentTime,!1))},t=(0,v.Z)((()=>{(0,g.T2)(e)}),1e3,!1);ae.addEventListener("timeupdate",t),ie&&ae.addEventListener("timeupdate",(()=>{b.Z.mutateElement(ie,(()=>{ie.remove()}))}),{once:!0})}ae.muted=!0,ae.loop=!0,q||(ae.autoplay=!0);let he=X&&(null===(Q=null==oe?void 0:oe.preloader)||void 0===Q?void 0:Q.loadFunc);const ue=()=>T(this,void 0,void 0,(function*(){ne&&X&&!H&&(ne.construct(),ne.setManual()),yield de();let n=Promise.resolve();if(ne&&!le||H)if(re.downloaded||e.supportsStreaming)e.supportsStreaming&&(X?n=Promise.reject((0,u.Z)("NO_AUTO_DOWNLOAD")):!re.downloaded&&ne&&(ne.attach(t,!1,null),ae.addEventListener(s.IS_SAFARI?"timeupdate":"canplay",(()=>{ne.detach()}),{once:!0})));else{const i=n=w.Z.downloadMediaURL({media:e,queueId:null==R?void 0:R.queueId,onlyCache:X,thumb:V});ne&&ne.attach(t,!1,i)}return!X&&he&&(he(),he=null),X=void 0,n.then((()=>T(this,void 0,void 0,(function*(){!D||D()?("round"===e.type&&I.Z.resolveWaitingForLoadMedia(i.peerId,i.mid,i.pFlags.is_scheduled),yield de(),(0,m.Z)(ae).then((()=>{N&&E.Z.addAnimation(ae,N),ne&&!le&&ne.detach(),ce.resolve()}),(e=>{console.error("video load error",e),te&&te.classList.add("is-error"),ce.reject(e)})),(0,c.ZP)(ae,re.url)):ce.resolve()}))),f.Z),{download:n,render:Promise.all([n,ce])}}));return ne&&!le&&ne.setDownloadFunction(ue),"gif"!==e.type||ee?se.loadPromise=R?(R.push({div:t,load:()=>ue().then((({render:e})=>e))}),Promise.resolve()):(yield ue()).render:(0,r.fc)(t,(e=>{(0,o.Z)(e),ie.remove(),ue()}),{capture:!0,once:!0}),se.thumb&&(yield se.thumb.loadPromises.thumb),se}))}p.Z.addEventListener("changeScreen",((e,t)=>{if(t===p._.mobile||e===p._.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=p.Z.active.round.width,i=t/2,s=i-7;k=2*Math.PI*s,e.forEach((e=>{e.setAttributeNS(null,"width",""+t),e.setAttributeNS(null,"height",""+t);const n=e.firstElementChild;n.setAttributeNS(null,"cx",""+i),n.setAttributeNS(null,"cy",""+i),n.setAttributeNS(null,"r",""+s),n.style.strokeDasharray=k+" "+k,n.style.strokeDashoffset=""+k}))}}))},2498:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8456),n=i(5400);function a(e){const t=(0,s.Z)(e.description||"",150,180);return(0,n.ZP)(t)}},1336:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8456),n=i(5400);function a(e){let t=e.title||e.author||e.site_name||"";return t=(0,s.Z)(t,80,100),(0,n.ZP)(t,{noLinks:!0,noLinebreaks:!0})}},7445:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s={AED:{code:"AED",title:"United Arab Emirates Dirham",symbol:"AED",native:"د.إ.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"367",max_amount:"3673030"},AFN:{code:"AFN",title:"Afghan Afghani",symbol:"AFN",native:"؋",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8729",max_amount:"87299487"},ALL:{code:"ALL",title:"Albanian Lek",symbol:"ALL",native:"Lek",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"11842",max_amount:"118421187"},AMD:{code:"AMD",title:"Armenian Dram",symbol:"AMD",native:"դր.",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"40943",max_amount:"409436718"},ARS:{code:"ARS",title:"Argentine Peso",symbol:"ARS",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"14705",max_amount:"147059002"},AUD:{code:"AUD",title:"Australian Dollar",symbol:"AU$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"153",max_amount:"1536825"},AZN:{code:"AZN",title:"Azerbaijani Manat",symbol:"AZN",native:"ман.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"169",max_amount:"1699858"},BAM:{code:"BAM",title:"Bosnia & Herzegovina Convertible Mark",symbol:"BAM",native:"KM",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"199",max_amount:"1990677"},BDT:{code:"BDT",title:"Bangladeshi Taka",symbol:"BDT",native:"৳",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"10009",max_amount:"100094046"},BGN:{code:"BGN",title:"Bulgarian Lev",symbol:"BGN",native:"лв.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"199",max_amount:"1993315"},BND:{code:"BND",title:"Brunei Dollar",symbol:"BND",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"142",max_amount:"1421883"},BOB:{code:"BOB",title:"Bolivian Boliviano",symbol:"BOB",native:"Bs",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"683",max_amount:"6832607"},BRL:{code:"BRL",title:"Brazilian Real",symbol:"R$",native:"R$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"539",max_amount:"5397799"},BYN:{code:"BYN",title:"Belarusian ruble",symbol:"BYN",native:"BYN",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"249",max_amount:"2495801"},CAD:{code:"CAD",title:"Canadian Dollar",symbol:"CA$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"136",max_amount:"1366860"},CHF:{code:"CHF",title:"Swiss Franc",symbol:"CHF",native:"CHF",thousands_sep:"'",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"97",max_amount:"976705"},CLP:{code:"CLP",title:"Chilean Peso",symbol:"CLP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"963",max_amount:"9637495"},CNY:{code:"CNY",title:"Chinese Renminbi Yuan",symbol:"CN¥",native:"CN¥",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"709",max_amount:"7094102"},COP:{code:"COP",title:"Colombian Peso",symbol:"COP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"452870",max_amount:"4528700000"},CRC:{code:"CRC",title:"Costa Rican Colón",symbol:"CRC",native:"₡",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"62506",max_amount:"625061070"},CZK:{code:"CZK",title:"Czech Koruna",symbol:"CZK",native:"Kč",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"2497",max_amount:"24975029"},DKK:{code:"DKK",title:"Danish Krone",symbol:"DKK",native:"kr",thousands_sep:"",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"755",max_amount:"7555990"},DOP:{code:"DOP",title:"Dominican Peso",symbol:"DOP",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5275",max_amount:"52757308"},DZD:{code:"DZD",title:"Algerian Dinar",symbol:"DZD",native:"د.ج.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"14035",max_amount:"140353307"},EGP:{code:"EGP",title:"Egyptian Pound",symbol:"EGP",native:"ج.م.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1953",max_amount:"19537405"},ETB:{code:"ETB",title:"Ethiopian Birr",symbol:"ETB",native:"ብር",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5224",max_amount:"52247069"},EUR:{code:"EUR",title:"Euro",symbol:"€",native:"€",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"101",max_amount:"1016045"},GBP:{code:"GBP",title:"British Pound",symbol:"£",native:"£",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"89",max_amount:"894445"},GEL:{code:"GEL",title:"Georgian Lari",symbol:"GEL",native:"GEL",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"283",max_amount:"2830234"},GTQ:{code:"GTQ",title:"Guatemalan Quetzal",symbol:"GTQ",native:"Q",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"778",max_amount:"7781323"},HKD:{code:"HKD",title:"Hong Kong Dollar",symbol:"HK$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"784",max_amount:"7849750"},HNL:{code:"HNL",title:"Honduran Lempira",symbol:"HNL",native:"L",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"2441",max_amount:"24413729"},HRK:{code:"HRK",title:"Croatian Kuna",symbol:"HRK",native:"kn",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"764",max_amount:"7648805"},HUF:{code:"HUF",title:"Hungarian Forint",symbol:"HUF",native:"Ft",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"42685",max_amount:"426850229"},IDR:{code:"IDR",title:"Indonesian Rupiah",symbol:"IDR",native:"Rp",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"1523370",max_amount:"15233700000"},ILS:{code:"ILS",title:"Israeli New Sheqel",symbol:"₪",native:"₪",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"354",max_amount:"3543350"},INR:{code:"INR",title:"Indian Rupee",symbol:"₹",native:"₹",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8155",max_amount:"81555550"},ISK:{code:"ISK",title:"Icelandic Króna",symbol:"ISK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"142",max_amount:"1425603"},JMD:{code:"JMD",title:"Jamaican Dollar",symbol:"JMD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"15013",max_amount:"150131044"},JPY:{code:"JPY",title:"Japanese Yen",symbol:"¥",native:"¥",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"144",max_amount:"1443065"},KES:{code:"KES",title:"Kenyan Shilling",symbol:"KES",native:"Ksh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12075",max_amount:"120750271"},KGS:{code:"KGS",title:"Kyrgyzstani Som",symbol:"KGS",native:"KGS",thousands_sep:" ",decimal_sep:"-",symbol_left:!1,space_between:!0,exp:2,min_amount:"8018",max_amount:"80182898"},KRW:{code:"KRW",title:"South Korean Won",symbol:"₩",native:"₩",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"1431",max_amount:"14315201"},KZT:{code:"KZT",title:"Kazakhstani Tenge",symbol:"KZT",native:"₸",thousands_sep:" ",decimal_sep:"-",symbol_left:!0,space_between:!1,exp:2,min_amount:"47186",max_amount:"471867112"},LBP:{code:"LBP",title:"Lebanese Pound",symbol:"LBP",native:"ل.ل.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"150999",max_amount:"1509998778"},LKR:{code:"LKR",title:"Sri Lankan Rupee",symbol:"LKR",native:"රු.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"35546",max_amount:"355469651"},MAD:{code:"MAD",title:"Moroccan Dirham",symbol:"MAD",native:"د.م.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1093",max_amount:"10938136"},MDL:{code:"MDL",title:"Moldovan Leu",symbol:"MDL",native:"MDL",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1926",max_amount:"19264439"},MNT:{code:"MNT",title:"Mongolian Tögrög",symbol:"MNT",native:"MNT",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"322444",max_amount:"3224442056"},MUR:{code:"MUR",title:"Mauritian Rupee",symbol:"MUR",native:"MUR",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"4453",max_amount:"44535174"},MVR:{code:"MVR",title:"Maldivian Rufiyaa",symbol:"MVR",native:"MVR",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1546",max_amount:"15460397"},MXN:{code:"MXN",title:"Mexican Peso",symbol:"MX$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"2012",max_amount:"20122860"},MYR:{code:"MYR",title:"Malaysian Ringgit",symbol:"MYR",native:"RM",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"463",max_amount:"4632502"},MZN:{code:"MZN",title:"Mozambican Metical",symbol:"MZN",native:"MTn",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"6382",max_amount:"63829729"},NGN:{code:"NGN",title:"Nigerian Naira",symbol:"NGN",native:"₦",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"43203",max_amount:"432039828"},NIO:{code:"NIO",title:"Nicaraguan Córdoba",symbol:"NIO",native:"C$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"3556",max_amount:"35566412"},NOK:{code:"NOK",title:"Norwegian Krone",symbol:"NOK",native:"kr",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"1069",max_amount:"10690975"},NPR:{code:"NPR",title:"Nepalese Rupee",symbol:"NPR",native:"नेरू",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12954",max_amount:"129546657"},NZD:{code:"NZD",title:"New Zealand Dollar",symbol:"NZ$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"174",max_amount:"1746220"},PAB:{code:"PAB",title:"Panamanian Balboa",symbol:"PAB",native:"B/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"98",max_amount:"988722"},PEN:{code:"PEN",title:"Peruvian Nuevo Sol",symbol:"PEN",native:"S/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"390",max_amount:"3902208"},PHP:{code:"PHP",title:"Philippine Peso",symbol:"PHP",native:"₱",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5862",max_amount:"58627496"},PKR:{code:"PKR",title:"Pakistani Rupee",symbol:"PKR",native:"₨",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"22642",max_amount:"226426805"},PLN:{code:"PLN",title:"Polish Złoty",symbol:"PLN",native:"zł",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"493",max_amount:"4932350"},PYG:{code:"PYG",title:"Paraguayan Guaraní",symbol:"PYG",native:"₲",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"6977",max_amount:"69772317"},QAR:{code:"QAR",title:"Qatari Riyal",symbol:"QAR",native:"ر.ق.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"364",max_amount:"3640989"},RON:{code:"RON",title:"Romanian Leu",symbol:"RON",native:"RON",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"502",max_amount:"5028645"},RSD:{code:"RSD",title:"Serbian Dinar",symbol:"RSD",native:"дин.",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"11918",max_amount:"119184990"},RUB:{code:"RUB",title:"Russian Ruble",symbol:"RUB",native:"₽",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"7128",max_amount:"71281218"},SAR:{code:"SAR",title:"Saudi Riyal",symbol:"SAR",native:"ر.س.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"375",max_amount:"3756546"},SEK:{code:"SEK",title:"Swedish Krona",symbol:"SEK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1109",max_amount:"11094972"},SGD:{code:"SGD",title:"Singapore Dollar",symbol:"SGD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"143",max_amount:"1430495"},THB:{code:"THB",title:"Thai Baht",symbol:"฿",native:"฿",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3780",max_amount:"37800497"},TJS:{code:"TJS",title:"Tajikistani Somoni",symbol:"TJS",native:"TJS",thousands_sep:" ",decimal_sep:";",symbol_left:!1,space_between:!0,exp:2,min_amount:"975",max_amount:"9753854"},TRY:{code:"TRY",title:"Turkish Lira",symbol:"TRY",native:"TL",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1854",max_amount:"18543598"},TTD:{code:"TTD",title:"Trinidad and Tobago Dollar",symbol:"TTD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"672",max_amount:"6722681"},TWD:{code:"TWD",title:"New Taiwan Dollar",symbol:"NT$",native:"NT$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3173",max_amount:"31738502"},TZS:{code:"TZS",title:"Tanzanian Shilling",symbol:"TZS",native:"TSh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"233199",max_amount:"2331999890"},UAH:{code:"UAH",title:"Ukrainian Hryvnia",symbol:"UAH",native:"₴",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"3633",max_amount:"36338830"},UGX:{code:"UGX",title:"Ugandan Shilling",symbol:"UGX",native:"USh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"3816",max_amount:"38166726"},USD:{code:"USD",title:"United States Dollar",symbol:"$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"100",max_amount:1e6},UYU:{code:"UYU",title:"Uruguayan Peso",symbol:"UYU",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"4080",max_amount:"40801205"},UZS:{code:"UZS",title:"Uzbekistani Som",symbol:"UZS",native:"UZS",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1089058",max_amount:"10890583014"},VND:{code:"VND",title:"Vietnamese Đồng",symbol:"₫",native:"₫",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"23862",max_amount:"238625000"},YER:{code:"YER",title:"Yemeni Rial",symbol:"YER",native:"ر.ي.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"25030",max_amount:"250300677"},ZAR:{code:"ZAR",title:"South African Rand",symbol:"ZAR",native:"R",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1789",max_amount:"17894299"}}},3447:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a,i:()=>s});const s={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0}},n=s[""];for(const e in s)e&&Object.assign(n,s[e]);const a=n},3189:(e,t,i)=>{"use strict";i.d(t,{Bf:()=>n,U9:()=>a,bt:()=>s});const s='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif',n="16px",a="400"},356:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s="undefined"!=typeof ImageBitmap},5296:(e,t,i)=>{"use strict";i.d(t,{Kx:()=>r,cK:()=>d,jt:()=>l});var s=i(3035),n=i(3725);const a=new Map;function o(e){return a.get(e)}function r(e){const t=o(e);t&&(t.isCancelled=!0,t.deferred.resolve())}function d(e,t,i){return i||(i=function(e){r(e);const t={isCancelled:!1,deferred:(0,n.Z)()};return a.set(e,t),t.deferred.then((()=>{o(e)===t&&a.delete(e)})),t}(t)),(0,s.T2)((()=>{i.isCancelled||(e()?d(e,t,i):i.deferred.resolve())})),i.deferred}function l(e){(0,s.T2)((()=>{e()&&l(e)}))}},2353:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function n(e,t){return s(this,void 0,void 0,(function*(){const i=e.map(((e,i,n)=>s(this,void 0,void 0,(function*(){if(yield t(e,i,n))return e}))));return(yield Promise.all(i)).filter(Boolean)}))}},8847:(e,t,i)=>{"use strict";function s(e,t){const i=[];let s=-1;for(;-1!==(s=e.findIndex(t));)i.push(e.splice(s,1)[0]);return i}i.d(t,{Z:()=>s})},5916:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e){this.assets=e,this.tempId=0}playSound(e,t=!1){++this.tempId,this.assetName=e;try{const i=this.createAudio();i.autoplay=!0,i.src="assets/audio/"+e,i.loop=t,i.play()}catch(t){console.error("playSound",e,t)}}playSoundIfDifferent(e,t){this.assetName!==e&&this.playSound(e,t)}createAudio(){let{audio:e}=this;return e||(e=this.audio=new Audio,e.play(),e)}stopSound(){this.audio&&this.audio.pause()}cancelDelayedPlay(){++this.tempId}playSoundWithTimeout(e,t,i){const s=++this.tempId;setTimeout((()=>{this.tempId===s&&this.playSound(e,t)}),i)}}},8678:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3019);function n(e){return(0,s.Z)(e,"readAsDataURL")}},6705:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m});var s=i(3725),n=i(8594),a=i(3035);const o=[];let r=!1;function d(e,t="push"){if(!e.items.length)return Promise.resolve([]);const i=e.promise=(0,s.Z)();return o[t](e),l(),i}function l(){r||function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),i=[];return new Promise(((s,o)=>{const r=()=>{return d=this,l=void 0,h=function*(){const d=performance.now();do{yield(0,n.e9)();const s=e.process.apply(e.context,t.shift());let a;if(s instanceof Promise)try{a=yield s}catch(e){return void o(e)}else a=s;i.push(a)}while(t.length>0&&performance.now()-d<6);t.length>0?(0,a.T2)(r):s(i)},new((c=void 0)||(c=Promise))((function(e,t){function i(e){try{n(h.next(e))}catch(e){t(e)}}function s(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(i,s)}n((h=h.apply(d,l||[])).next())}));var d,l,c,h};(0,a.T2)(r)})).then(e.promise.resolve,e.promise.reject)}(o.shift()).finally((()=>{r=!1,o.length&&l()}))}var c=i(6663);let h,u;function p(e,t,i,s=document.createElement("canvas")){s.width=e.width,s.height=e.height;const n=s.getContext("2d",{alpha:!1});return c.Z?(n.filter=`blur(${t}px)`,n.drawImage(e,2*-t,2*-t,s.width+4*t,s.height+4*t)):(n.drawImage(e,0,0),u(n,0,0,s.width,s.height,t,i)),s}h=c.Z?Promise.resolve():i.e(77).then(i.bind(i,7077)).then((e=>{u=e.default}));const f=new Map;function m(e,t=2,i=2){if(!e)throw"no dataUri for blur: "+e;f.size>150&&f.clear();const s=document.createElement("canvas");s.className="canvas-thumbnail";let n=f.get(e);if(n)s.width=n.canvas.width,s.height=n.canvas.height,n.promise.then((()=>{s.getContext("2d").drawImage(n.canvas,0,0,s.width,s.height)}));else{const a=new Promise((n=>{h.then((()=>{const a=new Image;a.onload=()=>{d({items:[[a,t,i,s]],context:null,process:p},"unshift").then((()=>{n()}))},a.src=e}))}));f.set(e,n={canvas:s,promise:a})}return Object.assign(Object.assign({},n),{canvas:s})}},4059:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,o:()=>d});var s=i(4762),n=i(3306),a=i(9818);const o=(0,n.Z)("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),r=(0,n.Z)("ffd9");function d(e){const t="base64,",i=e.slice(e.indexOf(t)+t.length),s=[...atob(i)].map((e=>e.charCodeAt(0)));return new Uint8Array(s)}function l(e,t=!1){let i,n;t||1!==e[0]?i=(0,a.Z)(e):(i=new Uint8Array(o.concat(Array.from(e.slice(3)),r)),i[164]=e[1],i[166]=e[2]),n=t?s.IS_SAFARI?"image/png":"image/webp":"image/jpeg";const d=function(e,t="image/jpeg"){return`data:${t};base64,${btoa(String.fromCharCode(...e))}`}(i,n);return d}},9897:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(410),n=i(9405);function a(e,t,i,s,a=!0){if(ei/s?r=t*i/e|0:(o=e*s/t|0,o>i&&(r=r*i/o|0,o=i)),a&&o>=e&&r>=t&&(o=e,r=t),(0,n.C)(o,r)}s.GO.calcImageInBox=a},8097:(e,t,i)=>{"use strict";let s;function n(e,t){if(!s){const e=document.createElement("canvas");s=e.getContext("2d",{alpha:!1})}return s.font!==t&&(s.font=t),s.measureText(e).width}i.d(t,{Z:()=>n})},7814:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(356);function n(e){return new Promise((t=>{return i=this,n=void 0,o=function*(){var i,n,a;const o=document.createElement("canvas"),r=null!==(i=e.size)&&void 0!==i?i:e.mediaSize.aspectFitted(e.boxSize),d=window.devicePixelRatio&&1;o.width=r.width*d,o.height=r.height*d;const l=o.getContext("2d");let c;c=s.Z?yield createImageBitmap(e.media,{resizeWidth:r.width,resizeHeight:r.height}):e.media,l.drawImage(c,0,0,o.width,o.height),s.Z&&(null==c||c.close());const h=null!==(n=e.mimeType)&&void 0!==n?n:"image/jpeg",u=null!==(a=e.quality)&&void 0!==a?a:1;if(e.toDataURL){const e=o.toDataURL(h,u);t({url:e,size:r})}else o.toBlob((e=>{t({blob:e,size:r})}),h,u)},new((a=void 0)||(a=Promise))((function(e,t){function s(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}d((o=o.apply(i,n||[])).next())}));var i,n,a,o}))}},467:(e,t,i)=>{"use strict";i.d(t,{ST:()=>r,ZP:()=>d,gV:()=>l});var s=i(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,a=/^\s+|\s$/g,o={й:"q",ц:"w",у:"e",к:"r",е:"t",н:"y",г:"u",ш:"i",щ:"o",з:"p",х:"[",ъ:"]",ф:"a",ы:"s",в:"d",а:"f",п:"g",р:"h",о:"j",л:"k",д:"l",ж:";",э:"'",я:"z",ч:"x",с:"c",м:"v",и:"b",т:"n",ь:"m",б:",",ю:".",".":"/"};function r(e){return e.replace(n,"").replace(a,"")}function d(e,t=!0){return l(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function l(e,t={}){const i=t.includeTag&&"%"===e.charAt(0),n=e;return t.clearBadChars&&(e=r(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),i&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wа-я]/g,(e=>{const t=o[e];return null!=t?t:e}))}(n)),e}},2166:(e,t,i)=>{"use strict";function s(e){var t=document.createElement("textarea");t.value=e,t.style.top="0",t.style.left="0",t.style.position="fixed",document.body.appendChild(t),t.focus(),t.select();try{document.execCommand("copy")}catch(e){}document.body.removeChild(t)}function n(e){navigator.clipboard?navigator.clipboard.writeText(e).catch((t=>{console.error("clipboard error",t),s(e)})):s(e)}i.d(t,{T:()=>n})},3416:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(5432),n=i(4755),a=i(2296);class o extends a.Z{constructor(){super("menu",!0),this.onMouseMove=e=>{const t=this.element.getBoundingClientRect(),{clientX:i,clientY:s}=e,n=i>=t.right?i-t.right:t.left-i,a=s>=t.bottom?s-t.bottom:t.top-s;(n>=100||a>=100)&&this.close()},n.Z.addEventListener("resize",(()=>{this.element&&this.close()}))}isOpened(){return!!this.element}close(){this.element&&(this.element.classList.remove("active"),this.element.parentElement.classList.remove("menu-open")),super.close(),s.Z||window.removeEventListener("mousemove",this.onMouseMove)}openBtnMenu(e,t){super.open(e),this.element.classList.add("active","was-open"),this.element.parentElement.classList.add("menu-open"),t&&this.addEventListener("toggle",t,{once:!0}),s.Z||window.addEventListener("mousemove",this.onMouseMove)}}const r=new o},632:(e,t,i)=>{"use strict";i.d(t,{OD:()=>h,fl:()=>S,mr:()=>u,rz:()=>c,s2:()=>r,xE:()=>p,zM:()=>l});var s=i(410),n=i(2325);const a=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],r=86400,d=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),i=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-i);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/r+1)/7)};function l(e){const t=new Date,i=t.getTime()/1e3|0,s=e.getTime()/1e3|0,a={};return i-s{const i=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+i+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):a[e.getMonth()])+i+e.getFullYear()+(t.noTime?"":", "+s)},f=2013,m=new RegExp("20[0-9]{1,2}"),g=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),v=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),b=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),y=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),w=[31,29,31,30,31,30,31,31,30,31,30,31];function S(e,t){const i=e.trim().toLowerCase();if(i.length<3)return;if(0==="today".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-1;return void t.push({title:"Today",minDate:a,maxDate:o})}if(0==="yesterday".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime()-864e5;e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:a,maxDate:o})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let i=0;i<7;i++)if(t.setDate(t.getDate()+1),0===P(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(i);if(s>=0){const e=new Date,i=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>i&&e.setTime(e.getTime()-6048e5);const a=e.getFullYear(),o=e.getMonth(),r=e.getDate();e.setFullYear(a,o,r),e.setHours(0,0,0);const d=e.getTime();e.setFullYear(a,o,r+1),e.setHours(0,0,0);const l=e.getTime()-1;return void t.push({title:P(d),minDate:d,maxDate:l})}let n;if(null===(n=b.exec(i)))if(null===(n=y.exec(i)))if(null===(n=m.exec(i))){if(null!==(n=g.exec(i))){const e=n[1],i=n[2],s=T(e);if(s>=0){const e=+i;if(e>0&&e<=31)return void L(t,e-1,s);if(e>=f)return void C(t,s,e)}}if(null!==(n=v.exec(i))){const e=n[1],i=T(n[2]);if(i>=0){const s=+e;if(s>0&&s<=31)return void L(t,s-1,i);s>=f&&C(t,i,s)}}}else{let e=+i;const s=(new Date).getFullYear();if(e=e;i--){const e=new Date;e.setFullYear(i,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(i+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+i,minDate:s,maxDate:n})}}else if(e<=s){const i=new Date;i.setFullYear(e,0,1),i.setHours(0,0,0);const s=i.getTime();i.setFullYear(e+1,0,1),i.setHours(0,0,0);const n=i.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],i=n[3],s=n[5];if(!n[2]===n[4])return;const a=parseInt(e),o=parseInt(i)-1;let r=parseInt(s);r>=10&&r<=99&&(r+=2e3);const d=(new Date).getFullYear();if(Z(a-1,o)&&r>=f&&r<=d){const e=new Date;e.setFullYear(r,o,a),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(r,o,a+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:M(i),minDate:i,maxDate:s})}}else{const e=n[1],i=n[3],s=parseInt(e),a=parseInt(i);if(s>0&&s<=31){if(a>=f&&s<=12)return void C(t,s-1,a);a<=12&&L(t,s-1,a-1)}else s>=f&&a<=12&&C(t,a-1,s)}}function C(e,t,i){const s=(new Date).getFullYear(),n=Date.now();if(i>=f&&i<=s){const s=new Date;s.setFullYear(i,t,1),s.setHours(0,0,0);const a=s.getTime();if(a>n)return;s.setMonth(s.getMonth()+1);const o=s.getTime()-1;e.push({title:E(a),minDate:a,maxDate:o})}}function L(e,t,i){if(Z(t,i)){const n=(new Date).getFullYear(),a=Date.now();for(let o=n;o>=f;o--){if(1===i&&28===t&&((s=o)%4!=0||s%100==0)&&s%400!=0)continue;const r=new Date;r.setFullYear(o,i,t+1),r.setHours(0,0,0);const d=r.getTime();if(d>a)continue;r.setFullYear(o,i,t+2),r.setHours(0,0,0);const l=r.getTime()-1;o===n?e.push({title:I(d),minDate:d,maxDate:l}):e.push({title:M(d),minDate:d,maxDate:l})}}var s}function E(e){const t=new Date(e);return a[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function I(e){const t=new Date(e);return a[t.getMonth()].slice(0,3)+" "+t.getDate()}function M(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function P(e){const t=new Date(e);return o[t.getDay()]}function Z(e,t){return t>=0&&t<12&&e>=0&&e{"use strict";i.d(t,{Z:()=>d});var s=i(2796),n=i(2166),a=i(3910),o=i(2738);const r="https://t.me/";function d(e={}){const t=document.createElement("a");t.classList.add("anchor-copy");let i,d="LinkCopied";if(e.mePath){const s=r+e.mePath;i=t.href=t.innerText=s}if(e.username){const s=r+e.username;t.href=s,i=t.innerText="@"+e.username,d="UsernameCopied"}return(0,o.fc)(t,(e=>{(0,a.Z)(e),(0,n.T)(null!=i?i:t.href),(0,s.bC)({langPackKey:d})})),t}},6976:(e,t,i)=>{"use strict";i.d(t,{E:()=>c,s:()=>l});var s=i(5432),n=i(4762),a=i(3416),o=i(3910);let r=!1,d=0;function l(){d&&clearTimeout(d),d=window.setTimeout((()=>{d=0,r=!1}),400),r=!0}function c({element:e,callback:t,listenerSetter:i,listenerOptions:d}){const l=i?i.add(e):e.addEventListener.bind(e),c=i?i.removeManual.bind(i,e):e.removeEventListener.bind(e);if(n.IS_APPLE&&s.Z||d){let e;const i=Object.assign(Object.assign({},d||{}),{capture:!0}),s=()=>{clearTimeout(e),c("touchmove",s,i),c("touchend",s,i),c("touchcancel",s,i)};l("touchstart",(n=>{n.touches.length>1?s():(l("touchmove",s,i),l("touchend",s,i),l("touchcancel",s,i),e=window.setTimeout((()=>{r?s():(t(n),s(),a.Z.isOpened()&&l("touchend",o.Z,{once:!0}))}),400))}),d)}else l("contextmenu",s.Z?e=>{t(e),a.Z.isOpened()&&l("touchend",o.Z,{once:!0})}:t,d)}},5077:(e,t,i)=>{"use strict";function s(e,t,i,s){const n=e=>{i({x:e.pageX,y:e.pageY,event:e})},a=t=>{document.removeEventListener("mousemove",n),e.addEventListener("mousedown",o,{once:!0}),s&&s({x:t.pageX,y:t.pageY,event:t})},o=i=>{0===i.button?(t({x:i.pageX,y:i.pageY,event:i}),n(i),document.addEventListener("mousemove",n),document.addEventListener("mouseup",a,{once:!0})):e.addEventListener("mousedown",o,{once:!0})};e.addEventListener("mousedown",o,{once:!0});const r=e=>{e.preventDefault(),i({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e})},d=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",l,{passive:!1,once:!0}),s&&s({x:t.touches[0].clientX,y:t.touches[0].clientY,isTouch:!0,event:t})},l=e=>{t({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e}),r(e),document.addEventListener("touchmove",r,{passive:!1}),document.addEventListener("touchend",d,{passive:!1,once:!0})};return e.addEventListener("touchstart",l,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",l),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",d)}}i.d(t,{Z:()=>s})},6760:(e,t,i)=>{"use strict";function s(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}i.d(t,{Z:()=>s})},2738:(e,t,i)=>{"use strict";i.d(t,{EN:()=>r,fc:()=>o,pf:()=>a,tH:()=>d});var s=i(5432),n=i(6669);const a=s.Z?"mousedown":"click";function o(e,t,i={}){const s=i.listenerSetter?i.listenerSetter.add(e):e.addEventListener.bind(e),n=i.listenerSetter?i.listenerSetter.removeManual.bind(i.listenerSetter,e):e.removeEventListener.bind(e);return i.touchMouseDown=!0,s(a,t,i),()=>n(a,t,i)}function r(e,t,i){e.removeEventListener(a,t,i)}function d(e){(0,n.Z)(e,a)}},7529:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(5432),n=i(3241),a=i(5953),o=i(8497);class r extends n.Z{constructor(){super(!1),this.hideControls=(e=!1)=>{if(e)return void(this.hideControlsTimeout||(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3)));clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0;const t=this.element.classList.contains("show-controls");if(!1!==this.controlsLocked){if(this.canHideControls&&!this.canHideControls()||!t||this.controlsLocked)return}else if(!t)return;this.dispatchEvent("toggleControls",!1),this.element.classList.remove("show-controls")},this.showControls=(e=!0)=>{this.hideControlsTimeout?(clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0):this.element.classList.contains("show-controls")||!1===this.controlsLocked||(this.dispatchEvent("toggleControls",!0),this.element.classList.add("show-controls")),e&&!this.controlsLocked&&(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3))},this.toggleControls=e=>{const t=this.element.classList.contains("show-controls");if(void 0===e)t?this.hideControls():this.showControls();else{if(e===t)return;!1===e?this.hideControls():this.showControls()}},this.hideControlsTimeout=0}setup(e){(0,a.Z)(this,e);const{listenerSetter:t,element:i}=this;s.Z?t.add(i)("click",(e=>{this.ignoreClickClassName&&(0,o.Z)(e.target,this.ignoreClickClassName)||this.toggleControls()})):(t.add(i)("mousemove",(()=>{this.showControls()})),t.add(i)("mouseenter",(()=>{this.showControls(!1)})),t.add(i)("mouseleave",(e=>{e.relatedTarget&&this.showOnLeaveToClassName&&(0,o.Z)(e.relatedTarget,this.showOnLeaveToClassName)?this.showControls(!1):this.hideControls()})))}lockControls(e){this.controlsLocked=e,this.element.classList.toggle("disable-hover",!1===e),this.toggleControls(e)}}},4531:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(3003),n=i(2353),a=i(3416),o=i(3699),r=i(3624),d=i(1483),l=i(6976),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function h({buttons:e,findElement:t,listenTo:i,appendTo:h,filterButtons:u,onOpen:p,onClose:f,onBeforeOpen:m,listenerSetter:g}){null!=h||(h=document.body),null!=g||(g=new o.Z);const v=new o.Z,b=(0,r.k)();let y;(0,l.E)({element:i,callback:e=>{const s=t?t(e):i;if(!s)return;let n=y;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),n&&n.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0),(()=>{c(this,void 0,void 0,(function*(){yield null==p?void 0:p(s);const t=yield S();if(!t)return;n=t.element;const{cleanup:i,destroy:o}=t;(0,d.Z)(e,n),a.Z.openBtnMenu(n,(()=>{null==f||f(),i(),setTimeout((()=>{o()}),300)}))}))})()},listenerSetter:g});const w=()=>{v.removeAll(),b.clean()},S=()=>c(this,void 0,void 0,(function*(){w(),e.forEach((e=>e.element=void 0));const t=u||(e=>(0,n.Z)(e,(e=>{var t,i;return null===(i=null===(t=null==e?void 0:e.verify)||void 0===t?void 0:t.call(e))||void 0===i||i}))),i=yield t(e);if(!i.length)return;const a=y=yield(0,s.Z)({buttons:i,listenerSetter:v});return a.classList.add("contextmenu"),yield null==m?void 0:m(),h.append(a),{element:a,cleanup:w,destroy:()=>{a.remove()}}}));return{element:y,destroy:()=>{w(),g.removeAll()}}}},3163:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(6787),n=i(4271),a=i(3512),o=i(4531),r=i(8497),d=i(3173),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function c(e){const{listenTo:t,isStickerPack:i,verifyRecent:c,appendTo:h,onOpen:u,onClose:p,onSend:f}=e;let m,g;const v=e=>l(this,void 0,void 0,(function*(){const t=yield a.Z.managers.acknowledged.appStickersManager.getFavedStickersStickers();if(!t.cached)return!1;const i=(yield t.result).some((e=>e.id===g.id));return e?!i:i}));return(0,o.Z)({listenTo:t,appendTo:h,findElement:e=>m=(0,r.Z)(e.target,"media-sticker-wrapper"),onOpen:()=>l(this,void 0,void 0,(function*(){return g=yield a.Z.managers.appDocsManager.getDoc(m.dataset.docId),null==u?void 0:u()})),onClose:p,buttons:[{icon:"stickers",text:"Context.ViewStickerSet",onClick:()=>new s.Z(g.stickerSetInput).show(),verify:()=>!i},{icon:"favourites",text:"AddToFavorites",onClick:()=>a.Z.managers.appStickersManager.faveSticker(g.id,!1),verify:()=>v(!0)},{icon:"favourites",text:"DeleteFromFavorites",onClick:()=>a.Z.managers.appStickersManager.faveSticker(g.id,!0),verify:()=>v(!1)},{icon:"delete",text:"DeleteFromRecent",onClick:()=>a.Z.managers.appStickersManager.saveRecentSticker(g.id,!0),verify:()=>{var e;return null!==(e=null==c?void 0:c(m))&&void 0!==e&&e}},{icon:"mute",text:"Chat.Send.WithoutSound",onClick:()=>(null==f||f(),d.Jo.sendDocId(g.id,!1,!0)),verify:()=>!(!n.ZP.chat.peerId||n.ZP.chat.peerId===a.Z.myId)},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:()=>n.ZP.chat.input.scheduleSending((()=>n.ZP.chat.input.sendMessageWithDocument(g))),verify:()=>!!n.ZP.chat.peerId}]})}},7660:(e,t,i)=>{"use strict";function s(e={}){const t=document.createElement("video");return e.pip||(t.disablePictureInPicture=!0),t.setAttribute("playsinline","true"),t}i.d(t,{Z:()=>s})},8222:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3512);const n=new class{constructor(){this.cache={},s.Z.addEventListener("theme_change",(()=>{this.computedStyle=void 0;const e=this.cache;this.cache={};for(const t in e)this.getProperty(t)}))}getProperty(e){let t=this.cache[e];return t||(this.computedStyle||(this.computedStyle=window.getComputedStyle(document.documentElement)),t=this.computedStyle.getPropertyValue("--"+e).trim(),this.cache[e]=t)}}},6669:(e,t,i)=>{"use strict";function s(e,t){const i=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(i)}i.d(t,{Z:()=>s})},1544:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4056);function n(e){return Array.from(e.childNodes).map((e=>e.nodeType===e.TEXT_NODE?(0,s.Z)(e.textContent):e.outerHTML)).join("")}},5975:(e,t,i)=>{"use strict";function s(e,t){if(!e)return null;if(e.parentElement===t)return e;for(;e.parentElement;)if((e=e.parentElement).parentElement===t)return e;return null}i.d(t,{Z:()=>s})},8763:(e,t,i)=>{"use strict";function s(e,t){return e.closest(`[${t}]`)}i.d(t,{Z:()=>s})},4668:(e,t,i)=>{"use strict";function s(e,t){return e.closest(t)}i.d(t,{Z:()=>s})},6733:(e,t,i)=>{"use strict";function s(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function n(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function a(e,t,i){const s=i?i.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach((e=>{s(e,t,!1)}))}function o(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function r(){return!!o()}i.d(t,{C8:()=>n,Dj:()=>s,Ms:()=>a,W7:()=>o,rB:()=>r})},3299:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n,q:()=>a});var s=i(5975);function n(e,t){const i=document.getSelection(),n=i[t?"anchorNode":"focusNode"],o=i[t?"anchorOffset":"focusOffset"];return(0,s.Z)(n,e)||n===e?Object.assign(Object.assign({},a(e,n,o)),{selection:i}):{selection:i}}function a(e,t,i){if(t===e){const s=e.childNodes,n=s.length;n&&i>=n?i=((t=s[n-1]).textContent||t.alt||"").length:(t=s[i],i=0)}return{node:t,offset:i}}},9041:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d,o:()=>n});var s=i(6854);const n={bold:{match:'[style*="bold"], [style*="font-weight: 700"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight:600"], b, strong',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u, ins',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i, em',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face*="monospace"], pre',entityName:"messageEntityCode"},strikethrough:{match:'[style*="line-through"], [style*="strikethrough"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},a=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR","OL","UL"]),o=(new Set(["OL","UL"]),new RegExp(s.Z,"g"));function r(e,t,i,s){const a=e.parentElement;for(const e in n){const o=n[e],r=a.closest(o.match+', [contenteditable="true"]');null===(null==r?void 0:r.getAttribute("contenteditable"))&&("messageEntityTextUrl"===o.entityName?i.push({_:o.entityName,url:r.href,offset:s.offset,length:t.length}):"messageEntityMentionName"===o.entityName?i.push({_:o.entityName,offset:s.offset,length:t.length,user_id:r.dataset.follow.toUserId()}):i.push({_:o.entityName,offset:s.offset,length:t.length}))}}function d(e,t,i,s,n,l,c={offset:0}){if(e.nodeType===e.TEXT_NODE){let t=e.nodeValue;return t=t.replace(o,""),t?s===e?i.push(t.substr(0,n)+""+t.substr(n)):i.push(t):s===e&&i.push(""),l&&t.length&&e.parentNode&&r(e,t,l,c),void(c.offset+=t.length)}if(e.nodeType!==e.ELEMENT_NODE)return;const h=s===e,u=a.has(e.tagName);if(u&&(i.length||"BR"===e.tagName))t.push(i.join("")),i.length=0,++c.offset;else{const t=e.dataset.stickerEmoji||e.alt,s=e.dataset.stickerEmoji;t&&l&&r(e,t,l,c),s&&l&&l.push({_:"messageEntityCustomEmoji",document_id:e.dataset.docId,offset:c.offset,length:t.length}),t&&(i.push(t),c.offset+=t.length)}h&&!n&&i.push("");const p=e.matches('[style*="table-cell"], th, td'),f=null==l?void 0:l.length;let m=e.firstChild;for(;m;)d(m,t,i,s,n,l,c),m=m.nextSibling;if(h&&n&&i.push(""),p&&e.nextSibling&&i.length&&(i.push(" "),++c.offset,void 0!==f))for(let e=f,t=l.length;e{"use strict";i.d(t,{Z:()=>r});var s=i(410),n=i(6875),a=i(1346),o=i(9041);function r(e,t=!0,i=!0){const s=[],r=[],{node:d,offset:l}=!(e instanceof DocumentFragment)&&i&&function(e){const t=window.getSelection();let i,s;if(null==t?void 0:t.rangeCount){const n=t.getRangeAt(0),a=n.startOffset;if(n.startContainer&&n.startContainer==n.endContainer&&a==n.endOffset){const t=a-1,o=e.childNodes;if(n.startContainer===e&&o[t]){i=o[t],s=0;for(let e=0;e{"use strict";i.d(t,{Z:()=>n});var s=i(8204);function n({overflowElement:e,overflowRect:t,selector:i,extraSize:n,elements:a}){null!=t||(t=e.getBoundingClientRect()),null!=a||(a=Array.from(e.querySelectorAll(i))),n&&(t={top:t.top-n,right:t.right+n,bottom:t.bottom+n,left:t.left-n});const o=[],r=[],d=[];let l=!1;for(const i of a){const n=i.getBoundingClientRect(),a=(0,s.Z)(i,e,!1,n,t);let c;a?(l=!0,c=r):c=l?d:o,c.push({element:i,rect:n,visibleRect:a})}return{invisibleTop:o,visible:r,invisibleBottom:d}}},8204:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(241);function n(e,t,i,n=e.getBoundingClientRect(),a=t.getBoundingClientRect()){let{top:o,right:r,bottom:d,left:l}=a;if(i){const e=t.querySelector(".sticky");e&&(o=e.getBoundingClientRect().bottom)}if(n.top>=d||n.bottom<=o||n.right<=l||n.left>=r)return null;const c={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},h=s.Z.width,u=s.Z.height;return{rect:{top:n.topr&&r!==h?(c.right=!0,++c.horizontal,r):n.right,bottom:n.bottom>d&&d!==u?(c.bottom=!0,++c.vertical,d):n.bottom,left:n.left{"use strict";i.d(t,{Z:()=>r});var s=i(3757),n=i(3910),a=i(8497),o=i(3444);function r(e){let t=!1;return new s.Z(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!(0,a.Z)(t.target,"progress-line")&&!(0,o.Z)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(i,s,a)=>{if(i*=-1,s*=-1,!t&&Math.abs(s)>20)return!0;if(Math.abs(i)>Math.abs(s))(0,n.Z)(a),t=!0;else if(!t&&Math.abs(s)>Math.abs(i))return!0;return e.onSwipe(i,s,a)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}},1154:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(6976),n=i(2416);function a(e){return(0,n.Z)(Object.assign(Object.assign({},e),{onSwipe:(t,i,n)=>{if(t*=-1,i*=-1,Math.abs(t)>50)return e.onSwipe(t,i,n),(0,s.s)(),!0}}))}},5705:(e,t,i)=>{"use strict";function s(e){if(e instanceof DocumentFragment)return e;const t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}i.d(t,{Z:()=>s})},2614:(e,t,i)=>{"use strict";function s(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}i.d(t,{Z:()=>s})},8487:(e,t,i)=>{"use strict";function s(e){return null==e?void 0:e.isConnected}i.d(t,{Z:()=>s})},1293:(e,t,i)=>{"use strict";function s(e){return e.isContentEditable||"INPUT"!==e.tagName?!e.textContent.trim()&&!e.querySelector(".emoji, .custom-emoji, .custom-emoji-placeholder"):!e.value.trim()}i.d(t,{Z:()=>s})},6299:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(4762);function a(e){if("Enter"===e.key&&!n.IS_MOBILE&&!e.isComposing){if("enter"===s.Z.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=n.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(n.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},3444:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4762);function n(e){return s.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},2398:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(5432);function n(e,t=!1,i=!0){if(!s.Z||t&&("INPUT"===document.activeElement.tagName||document.activeElement.isContentEditable))if(i&&e.focus(),e instanceof HTMLInputElement){const t=e.value.length;e.selectionStart=t,e.selectionEnd=t}else{const t=document.createRange();t.selectNodeContents(e),t.collapse(!1);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}}window.placeCaretAtEnd=n},4484:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2648);function n(e,t,i,n){return void 0===n&&(n=e.parentElement===t?(0,s.Z)(e):-1),n!==i&&(-1!==n&&ni?t.insertBefore(e,t.children[i]):t.append(e):t.prepend(e),!0)}},6740:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>o,cj:()=>r});var s=i(925);const n={},a=(e,t)=>{e instanceof HTMLImageElement||e instanceof HTMLVideoElement?e.src=t:e instanceof SVGImageElement?e.setAttributeNS(null,"href",t):e.style.backgroundImage="url("+t+")"};function o(e,t,i,o=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(null==i||i());const r=e instanceof HTMLVideoElement;if(n[t]&&o||r)e&&a(e,t),i&&(r?(0,s.Z)(e).then(i):null==i||i());else{const s=e instanceof HTMLImageElement,o=s?e:new Image;o.src=t;const r=()=>{!s&&e&&a(e,t),n[t]=!0,null==i||i(),o.removeEventListener("error",d)},d=e=>{console.error("Render image from url failed:",e,t,o),o.removeEventListener("load",r),null==i||i()};o.addEventListener("load",r,{once:!0}),o.addEventListener("error",d,{once:!0})}}function r(e,t,i){return new Promise((s=>{o(e,t,s,i)}))}},2830:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(9674),n=i(6740);function a(e,t,i,a,o=e,r){return a&&t.classList.add("fade-in"),(0,n.cj)(t,i).then((()=>s.Z.mutateElement(e,(()=>{o.append(t),a?t.addEventListener("animationend",(()=>{s.Z.mutate((()=>{t.classList.remove("fade-in"),null==r||r.remove()}))}),{once:!0}):null==r||r.remove()}))))}},5565:(e,t,i)=>{"use strict";function s(e,t){if("string"==typeof t)return void(e.innerHTML=t);const i=e.firstChild;i?e.lastChild===i?i.replaceWith(t):(e.textContent="",e.append(t)):e.append(t)}i.d(t,{Z:()=>s})},669:(e,t,i)=>{"use strict";i.d(t,{Y:()=>m,Z:()=>g});var s=i(4762),n=i(5003),a=i(5400),o=i(3699),r=i(6854),d=i(3228),l=i(5975),c=i(2648);function h(e,t,i,s){let n;if(e===i)n=t-s;else if(e.parentElement===i.parentElement)n=(0,c.Z)(e,!0)-(0,c.Z)(i,!0);else{const t=[];let s=e.parentElement;do{t.push(s)}while(s=s.parentElement);s=i.parentElement;do{if(t.includes(s))break}while(s=s.parentElement);const a=s;e=(0,l.Z)(e,a),i=(0,l.Z)(i,a),n=(0,c.Z)(e,!0)-(0,c.Z)(i,!0)}return(0,d.Z)(n,-1,1)}window.compareNodes=h;var u=i(3299),p=i(2398);const f=new RegExp(`[^${r.Z}]`),m=!1;class g{constructor(){this.saveSelectionOnChange=e=>{const t=document.activeElement;this.saveRangeForElement(t)},this.onFocusOut=e=>{this.lastNode=this.lastOffset=void 0},this.onSelectionChange=e=>{var t;const{input:i}=this;if(!i)return void this.setSelectionClassName(document.getSelection());let s=this.getCaretPosN();for(;;){const{node:e,offset:n,selection:a,move:o}=s;if((null==e?void 0:e.nodeValue)!==r.Z||!this.lastNode)break;const d=h(e,n,this.lastNode,this.lastOffset)<0;void 0!==d&&(a.isCollapsed?this.superMove(i,s,d,!0):a.modify(a.isCollapsed?"move":"extend",d?"backward":"forward","character")),this.log("selectionchange",e,n,this.lastNode,this.lastOffset,e===this.lastNode,(0,c.Z)(this.getFiller(e)),(0,c.Z)(this.getFiller(this.lastNode)),d,a,document.getSelection(),document.getSelection().getRangeAt(0),null==e?void 0:e.parentNode,null===(t=this.lastNode)||void 0===t?void 0:t.parentNode),s=this.getCaretPosN(),this.lastNode=e,this.lastOffset=n;break}this.lastNode=this.lastOffset=void 0,this.setSelectionClassName(s.selection,i)},this.onBeforeInput=e=>{var t;const{input:i,log:s}=this;if(!i)return;const n=this.addInputCallback.bind(this,i),a=this.getCaretPosN();let{node:o,offset:d,selection:l,move:c}=a;if(s("beforeinput",e,o,d,l,a),this.lastNode=this.lastOffset=void 0,e.inputType.startsWith("delete")){if(n((()=>{this.processEmptiedFillers(i),this.removeExtraBOMs(i),this.fixInsertedLineBreaks(i)})),(null==o?void 0:o.nodeValue)===r.Z&&l.isCollapsed&&e.inputType.includes("deleteContent")){const t=e.inputType.includes("Backward"),s=d===r.Z.length&&t||!d&&!t;this.superMove(i,a,t,s)}}else{if(e.inputType.startsWith("insert")){if(null===(t=null==o?void 0:o.classList)||void 0===t?void 0:t.contains("input-something")){o=o.previousSibling.firstChild;const e=l.getRangeAt(0);e.setStart(o,0),e.setEnd(o,0),e.collapse(!0);const t=this.getCaretPosN();o=t.node,l=t.selection,d=t.offset}if(o&&o.textContent===r.Z&&d===r.Z.length){l.modify("move","backward","character");const e=this.getCaretPosN();o=e.node,l=e.selection,d=e.offset}e.inputType;{o&&o.nodeType===o.ELEMENT_NODE&&(o=o.firstChild,s.warn("fixing focus on span"));const t=(null==o?void 0:o.nodeValue)===r.Z;if(s("inserting line break",t,o,`"${null==o?void 0:o.nodeValue}"`,(null==o?void 0:o.parentElement)?Array.from(o.parentElement.childNodes).slice():[]),t){const e=o.parentElement;e.classList.replace("input-filler","input-filler-text"),e.childNodes.length,n((()=>{e.childNodes.length>1?(s("inserting line break, remove"),o=Array.from(e.childNodes).find((e=>e.nodeValue===r.Z)),e.t=o):o.nodeValue!==r.Z&&(s("inserting line break, deleteData"),o.deleteData(o.nodeValue.indexOf(r.Z),r.Z.length)),this.fixInsertedLineBreaks(i)}))}else"insertLineBreak"===e.inputType&&n((()=>{this.fixInsertedLineBreaks(i)}))}return}"historyUndo"===e.inputType?n((()=>{this.processFilledFillers(i),this.processEmptiedFillers(i),this.removeExtraBOMs(i),this.removeEmptyTextNodes(i),this.fixBuggedCaret()})):"historyRedo"===e.inputType&&n((()=>{this.processFilledFillers(i),this.processEmptiedFillers(i),i.querySelectorAll(".input-something:not([contenteditable])").forEach((e=>{e.contentEditable="false"})),this.removeExtraBOMs(i),this.fixBuggedCaret()}))}},this.onKeyDown=e=>{var t;const i=e.key;if("ArrowDown"===i||"ArrowUp"===i)this.lastNode=this.lastOffset=void 0;else{const{node:e,offset:t}=this.getCaretPosN();this.lastNode=e,this.lastOffset=t,this.lastNode===this.input&&(this.lastNode=this.lastOffset=void 0)}this.log("keydown",this.lastNode,null===(t=this.lastNode)||void 0===t?void 0:t.parentNode,this.lastOffset,this.getCaretPosN(),e)},this.log=(0,n.kg)("RICH-INPUT"),this.listenerSetter=new o.Z,this.savedRanges=new WeakMap,this.listenerSetter.add(document)("selectionchange",this.saveSelectionOnChange),m&&(this.listenerSetter.add(document)("focusout",this.onFocusOut),this.listenerSetter.add(document)("selectionchange",this.onSelectionChange),this.listenerSetter.add(document)("beforeinput",this.onBeforeInput),this.listenerSetter.add(document)("keydown",this.onKeyDown,{capture:!0}),s.IS_FIREFOX&&(this.inputCaptureCallbacks=[],this.listenerSetter.add(document)("input",(()=>{this.inputCaptureCallbacks.forEach((e=>e())),this.inputCaptureCallbacks.length=0}),{capture:!0})))}get input(){const e=document.getSelection(),{anchorNode:t}=e;if(t)return(t.closest?t:t.parentElement).closest('[contenteditable="true"]')}saveRangeForElement(e){e&&(e.isContentEditable||"INPUT"===e.tagName)&&document.getSelection().rangeCount&&this.savedRanges.set(e,document.getSelection().getRangeAt(0))}findPreviousSmthIndex(e,t,i){const s=Array.from(null!=i?i:e.querySelectorAll(".input-something")),n=s.findIndex((e=>h(e,0,t,0)>=0));return-1===n?s.length-1:Math.max(0,n-1)}superMove(e,t,i,s){var n,a;const{node:o,offset:d,move:l}=t,c=e.querySelectorAll(".input-something"),h=this.findPreviousSmthIndex(e,o,c),u=document.createRange();u[i?"setEnd":"setStart"](o,d),s&&l(i);const p=this.getCaretPosN();if((null===(n=p.node)||void 0===n?void 0:n.nodeValue)===r.Z&&(!s||o===this.lastNode)){const t=this.findPreviousSmthIndex(e,p.node,c);let n=!s;for(;;){const s=this.getCaretPosN(),d=this.findPreviousSmthIndex(e,s.node,c);u[i?"setStart":"setEnd"](s.node,s.offset);const p=u.toString(),m=!f.test(p);if(this.log("test cursor",p,m,t,d),!m||(null===(a=s.node)||void 0===a?void 0:a.nodeValue)!==r.Z||d!==t||!d&&!s.offset||!(d{e.classList.add("br-not-br")}))}fixBuggedCaret(){const e=document.getSelection(),t=e.getRangeAt(0);e.removeAllRanges(),e.addRange(t)}addInputCallback(e,t,i=!0){const n=()=>{this.log("input modify callback"),t()};i&&s.IS_FIREFOX?this.inputCaptureCallbacks.push(n):this.listenerSetter.add(e)("input",n,{once:!0,capture:i})}removeExtraBOMs(e){const t=e=>{var t;return null===(t=null==e?void 0:e.classList)||void 0===t?void 0:t.contains("input-something")};e.querySelectorAll(".input-filler").forEach((e=>{var i;const{previousSibling:s,nextSibling:n}=e;let o=!1;!(null===(i=null==n?void 0:n.classList)||void 0===i?void 0:i.contains("input-filler"))&&(0,a.Hc)(n)&&(o=t(s)||t(n)),o||(this.log.warn("removing empty bom node",e),e.remove())}))}getFiller(e){return e&&e.nodeType===e.TEXT_NODE&&e.parentElement!==this.input?e.parentElement:e}getCaretPosN(){const e=(0,u.Z)(this.input);return Object.assign(Object.assign({},e),{move:this.move.bind(this,e.selection)})}removeEmptyTextNodes(e){const{log:t}=this,i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:t=>t.parentElement!==e||t.nodeValue?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT});let s;for(;s=i.nextNode();)t.warn("removing empty text node",s),s.remove()}removePossibleBOMSiblings(e,t){[e,t].forEach((e=>{var t;(null===(t=null==e?void 0:e.classList)||void 0===t?void 0:t.contains("input-filler"))&&e.remove()}))}removePossibleBOMSiblingsByNode(e){const{previousSibling:t,nextSibling:i}=e;this.removePossibleBOMSiblings(t,i)}processEmptiedFillers(e){e.querySelectorAll(".input-filler-text").forEach((e=>{var t;this.removeExtraBOMs(e);let i=!0;if(e.textContent)f.test(e.textContent)||e.querySelector(".input-something")?i=!1:e.classList.replace("input-filler-text","input-filler");else{e.classList.replace("input-filler-text","input-filler");const i=Array.from(e.childNodes).find((e=>e.nodeType===e.TEXT_NODE));i?i.insertData(0,r.Z):(null===(t=e.t)||void 0===t?void 0:t.nodeValue)?e.append(e.t):e.append(document.createTextNode(r.Z))}i&&this.removePossibleBOMSiblingsByNode(e)}))}processFilledFillers(e){e.querySelectorAll(".input-filler").forEach((e=>{if(e.textContent!==r.Z){e.classList.replace("input-filler","input-filler-text");const t=e.t,i=Array.from(e.childNodes).find((e=>e.nodeType===e.TEXT_NODE&&e.nodeValue.includes(r.Z)));if(i&&!(null==t?void 0:t.nodeValue)){const e=i.nodeValue.indexOf(r.Z);-1!==e&&i.deleteData(e,r.Z.length)}}}))}setSelectionClassName(e,t){if(e.rangeCount){const i=e.getRangeAt(0);t?Array.from(t.querySelectorAll(".input-selectable")).forEach((e=>{e.classList.toggle("selection",!i.collapsed&&i.intersectsNode(e))})):Array.from(document.querySelectorAll(".input-selectable.selection")).forEach((e=>e.classList.remove("selection")))}}move(e,t){const{focusNode:i,focusOffset:s}=e;e.modify("extend",t?"backward":"forward","character"),t?e.collapseToStart():e.collapseToEnd();const{focusNode:n,focusOffset:a}=e;this.log("moving cursor",t,i,i.nodeType===i.ELEMENT_NODE?i:i.parentElement,s,n,n.nodeType===n.ELEMENT_NODE?n:n.parentElement,a)}prepareApplyingMarkdown(){const{input:e}=this,t=e.querySelectorAll(".input-filler"),i=e.querySelectorAll(".input-something");return i.forEach((e=>{e.contentEditable="inherit"})),()=>{t.forEach((e=>{e.contentEditable="inherit"})),i.forEach((e=>{e.contentEditable="false"})),this.removeExtraBOMs(e)}}static getInstance(){var e;return null!==(e=this.INSTANCE)&&void 0!==e?e:this.INSTANCE=new g}}},2914:(e,t,i)=>{"use strict";i.d(t,{Z:()=>f});var s=i(3757),n=i(5432),a=i(3512),o=i(3228),r=i(5953),d=i(5418),l=i(3910),c=i(2738),h=i(5975),u=i(4484),p=i(2648);class f{constructor(e){this.onSwipe=(e,t)=>{t=(0,o.Z)(t,this.minY,this.maxY),this.element.style.transform=`translateY(${t}px)`;const i=Math.round(Math.abs(t)/this.elementRect.height),s=this.siblings;this.siblings=[];const n=t<0?"previousElementSibling":"nextElementSibling";let a=this.element[n];for(let e=0;e{this.siblings.includes(e)||(e.style.transform="")})),this.siblings.forEach((e=>{const i=this.elementRect.height*(t<0?1:-1);e.style.transform=`translateY(${i}px)`})),this.scrollableRect){const e=t,i=e>0,s=(i?this.elementRect.bottom:this.elementRect.top)+e-this.addScrollPos;let n=2;s+(i?0:this.elementRect.height)>=this.scrollableRect.bottom||(s-(i?this.elementRect.height:0)<=this.scrollableRect.top?n*=-1:n=void 0),void 0!==n&&(this.scrollable.container[this.scrollable.scrollProperty]+=n)}},this.verifyTouchTarget=e=>!this.list.classList.contains("is-reordering")&&(this.element=this.getSortableTarget(e.target),!!this.element),this.onScroll=()=>{const e=this.scrollable.container[this.scrollable.scrollProperty],t=this.addScrollPos=e-this.startScrollPos,i="scrollTop"===this.scrollable.scrollProperty;this.swipeHandler.add(i?0:t,i?t:0)},this.onStart=()=>{this.list.classList.add("is-reordering"),this.element.classList.add("is-dragging","no-transition"),this.swipeHandler.setCursor("grabbing"),this.elementRect=this.element.getBoundingClientRect(),this.containerRect=this.list.getBoundingClientRect(),this.minY=this.containerRect.top-this.elementRect.top,this.maxY=this.containerRect.bottom-this.elementRect.bottom,this.addScrollPos=0,this.scrollable&&(this.startScrollPos=this.scrollable.container[this.scrollable.scrollProperty],this.scrollableRect=this.scrollable.container.getBoundingClientRect(),this.scrollable.container.addEventListener("scroll",this.onScroll))},this.onReset=()=>{return e=this,t=void 0,s=function*(){const e=this.siblings.length,t=e&&e*(this.siblings[0].previousElementSibling===this.element?1:-1),i=(0,p.Z)(this.element),s=i+t;this.element.classList.remove("no-transition"),this.element.style.transform=t?`translateY(${t*this.elementRect.height}px)`:"",this.swipeHandler.setCursor(""),this.scrollable&&this.scrollable.container.removeEventListener("scroll",this.onScroll),n.Z||(0,c.fc)(document.body,l.Z,{capture:!0,once:!0}),a.Z.settings.animationsEnabled&&(yield(0,d.Z)(250)),this.list.classList.remove("is-reordering"),this.element.classList.remove("is-dragging"),(0,u.Z)(this.element,this.list,s,i),[this.element,...this.siblings].forEach((e=>{e.style.transform=""})),this.element=this.siblings=this.elementRect=this.containerRect=this.minY=this.maxY=this.startScrollPos=this.addScrollPos=void 0,t&&this.onSort(i,s)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s},(0,r.Z)(this,e),this.swipeHandler=new s.Z({element:this.list,onSwipe:this.onSwipe,verifyTouchTarget:this.verifyTouchTarget,onStart:this.onStart,onReset:this.onReset,setCursorTo:document.body,middleware:this.middleware,withDelay:!0})}getSortableTarget(e){if(!e)return;let t=(0,h.Z)(e,this.list);return t&&t.classList.contains("cant-sort")&&(t=void 0),t}}},1656:(e,t,i)=>{"use strict";function s(e,t){return t?e.forEach((e=>e.setAttribute("disabled","true"))):e.forEach((e=>e.removeAttribute("disabled"))),()=>s(e,!t)}i.d(t,{Z:()=>s})},2648:(e,t,i)=>{"use strict";function s(e,t){if(!e.parentNode)return-1;if(t)return Array.from(e.parentNode.childNodes).indexOf(e);let i=0;for(;null!==(e=e.previousElementSibling);)++i;return i}i.d(t,{Z:()=>s})},6339:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(2738),n=i(5975),a=i(3241),o=i(5432),r=i(5953),d=i(6385),l=i(8497),c=i(3512);class h extends a.Z{constructor(e){super(!1),this.onClickOut=e=>{const t=e.target;(0,n.Z)(t,this.element)||Array.from(this.ignoreButtons).some((e=>(0,n.Z)(t,e)||t===e))||!(this.ignoreMouseOut.size<=1)||this.ignoreOutClickClassName&&(0,l.Z)(t,this.ignoreOutClickClassName)||this.toggle(!1)},this.onMouseOut=e=>{if(!this.isActive())return;if(this.clearTimeout("toggle"),this.ignoreMouseOut.size)return;const t=e.toElement;t&&(0,n.Z)(t,this.element)||this.setTimeout("toggle",(()=>{this.toggle(!1)}),200)},this.toggle=e=>{return t=this,i=void 0,a=function*(){const t=!!this.element.style.display&&void 0===e||e;if(this.init){if(!t)return;this.init(),this.init=null}if(t===this.isActive())return;const i=o.Z||!c.Z.settings.animationsEnabled?0:200;if(this.element.style.display&&void 0===e||e){const e=this.dispatchResultableEvent("open");yield Promise.all(e),this.element.style.display="",this.element.offsetLeft,this.element.classList.add("active"),this.dispatchEvent("openAfterLayout"),d.Z.pushItem(this.navigationItem={type:"dropdown",onPop:()=>{this.toggle(!1)}}),this.clearTimeout("toggle"),this.setTimeout("done",(()=>{this.forceClose=!1,this.dispatchEvent("opened")}),i)}else this.dispatchEvent("close"),this.ignoreMouseOut.clear(),this.ignoreButtons.clear(),this.element.classList.remove("active"),d.Z.removeItem(this.navigationItem),(0,s.EN)(window,this.onClickOut,{capture:!0}),this.clearTimeout("toggle"),this.setTimeout("done",(()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")}),i)},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a},(0,r.Z)(this,e),this.forceClose=!1,this.inited=!1,this.ignoreMouseOut=new Set,this.ignoreButtons=new Set,this.timeouts={}}attachButtonListener(e,t){let i=!0;o.Z?(0,s.fc)(e,(()=>{i?(i=!1,this.toggle(!0)):this.toggle()}),{listenerSetter:t}):(t.add(e)("mouseover",(s=>{i&&(t.add(e)("mouseout",(e=>{this.clearTimeout("toggle"),this.onMouseOut(e)})),i=!1),this.setTimeout("toggle",(()=>{this.toggle(!0)}),200)})),(0,s.fc)(e,(()=>{const t="click",i=!this.ignoreMouseOut.has(t);i&&!this.ignoreMouseOut.size&&(this.ignoreButtons.add(e),setTimeout((()=>{(0,s.fc)(window,this.onClickOut,{capture:!0})}),0)),this.setIgnoreMouseOut(t,i),this.toggle(i)}),{listenerSetter:t}))}clearTimeout(e){void 0!==this.timeouts[e]&&(clearTimeout(this.timeouts[e]),delete this.timeouts[e])}setTimeout(e,t,i){this.clearTimeout(e),this.timeouts[e]=window.setTimeout((()=>{this.clearTimeout(e),t()}),i)}init(){o.Z||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||this.clearTimeout("toggle")})}isActive(){return this.element.classList.contains("active")}setIgnoreMouseOut(e,t){t?this.ignoreMouseOut.add(e):this.ignoreMouseOut.delete(e)}}},4789:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,f:()=>s});var s,n=i(8594),a=i(3035),o=i(5296),r=i(3512),d=i(8487);function l(e){var t,i,o;if(null!==(t=e.margin)&&void 0!==t||(e.margin=0),null!==(i=e.maxDistance)&&void 0!==i||(e.maxDistance=1500),null!==(o=e.axis)&&void 0!==o||(e.axis="y"),r.Z.settings.animationsEnabled&&0!==e.forceDuration||(e.forceDirection=s.Static),e.forceDirection===s.Static)return e.forceDuration=0,c(e);const d=(0,a.AD)().then((()=>c(e)));return"y"===e.axis?(0,n.YW)(d):d}function c(e){const{element:t,container:i,getNormalSize:s,getElementPosition:n,transitionFunction:a,axis:r,margin:l,position:p,forceDirection:f,maxDistance:m,forceDuration:g}=e;if(!(0,d.Z)(t))return(0,o.Kx)(i),Promise.resolve();const v="y"===r?"top":"left",b="y"===r?"bottom":"right",y="y"===r?"height":"width",w="y"===r?"scrollHeight":"scrollWidth",S="y"===r?"scrollHeight":"offsetWidth",C="y"===r?"scrollTop":"scrollLeft",L=t.getBoundingClientRect(),E=i.getBoundingClientRect?i.getBoundingClientRect():document.body.getBoundingClientRect(),I=L[v]-E[v],M=n?n({elementRect:L,containerRect:E,elementPosition:I}):I,P=t[S],Z=s?s({rect:E}):E[y];let T=i[C];const k=i[w];let x;switch(p){case"start":x=M-l;break;case"end":x=L[b]-E[b]+l;break;case"nearest":case"center":if(Pm?(T=i.scrollTop+=x-m,x=m):x<-m&&(T=i.scrollTop+=x+m,x=-m)),x<0){const e=-T;x=Math.max(x,e)}else if(x>0){const e=k-(T+Z);x=Math.min(x,e)}const A=i[C]+x,_=Math.abs(x),F=null!=g?g:250+_/1500*350,D=Date.now(),R=null!=a?a:_<500?u:h,B=()=>F?Math.min((Date.now()-D)/F,1):1,N=()=>{const e=B(),t=R(e),s=x*(1-t);return i[C]=Math.round(A-s),e<1};if(!F||!x)return(0,o.Kx)(i),N(),Promise.resolve();if(e.startCallback){const t=k-Math.round(A+i["y"===r?"offsetHeight":"offsetWidth"]);e.startCallback({scrollSize:k,scrollPosition:T,distanceToEnd:t,path:x,duration:F,containerRect:E,elementRect:L,getProgress:B})}return(0,o.cK)(N,i)}function h(e){return 1-Math.pow(1-e,5)}function u(e){return 1-Math.pow(1-e,3.5)}!function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Static=2]="Static"}(s||(s={}))},8801:(e,t,i)=>{"use strict";i.d(t,{P:()=>n});const s="_";function n(e,t){const i=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(s);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(s);break;case"inputFileLocation":n=[e.volume_id,e.local_id].join(s);break;case"inputWebFileLocation":n=["webFile",e.url].join(s);break;default:console.error("Unrecognized location:",e),n=""}return n+((null==t?void 0:t.downloadId)?"_download":"")+(i?"."+i:i)}},1708:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(7625);function n(e){(0,s.Z)(e.history,((t,i,s)=>{t.action.photo||(s.splice(i,1),void 0!==e.count&&--e.count)}))}},4081:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2325);function n(e,t="auto"){if(0===e)return(0,s.ag)("FileSize.B",[0]);const i="auto"===t,n=Math.floor(Math.log(e)/Math.log(1024)),a="auto"===t?Math.max(0,n-1):t,o=Math.max(0,a),r=(e/Math.pow(1024,n)).toFixed(o);return(0,s.ag)(["FileSize.B","FileSize.KB","FileSize.MB","FileSize.GB"][n],[i?r:parseFloat(r)])}},8939:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325);const n={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks",mm:"Months",y:"Years"};function a(e,t){const i=function(e,t=2){e||(e=1);const i=[],s=[{m:1,t:"s"},{m:60,t:"m"},{m:60,t:"h"},{m:24,t:"d"},{m:7,t:"w"}];let n=1;s.forEach(((t,a)=>{if(n=Math.round(n*t.m),e=0;--e)0===a[e].duration&&a.splice(e,1);return a}(e,2);if(t){const e=i.map((e=>s.ZP.format(n[e.type],!0,[e.duration])));return(0,s.v_)(e,!1,t)}const a=i.map((e=>(0,s.ag)(n[e.type],[e.duration]))),o=document.createElement("span");return o.append(...(0,s.v_)(a,!1)),o}},6272:(e,t,i)=>{"use strict";i.d(t,{u:()=>r});var s=i(2325);const n=new Map;let a=0;const o=(e,t,i="")=>{i=t.country_code+i,a=Math.max(a,i.length),n.set(i,{country:e,code:t})};function r(e){e=e||"",n.size||s.ZP.countriesList.forEach((e=>{e.country_codes.forEach((t=>{t.prefixes?t.prefixes.forEach((i=>{o(e,t,i)})):o(e,t)}))}));let t=e.replace(/\D/g,"");const i=t.slice(0,a);let r;for(let e=i.length-1;e>=0&&(r=n.get(i.slice(0,e+1)),!r);--e);if(!r)return{formatted:t,country:void 0,code:void 0,leftPattern:""};const d=r.country,l=r.code.patterns||[],c=t.slice(r.code.country_code.length);let h="",u=0,p="";for(let e=l.length-1;e>=0;--e){h=l[e];const t=h.replace(/ /g,"");let i=0;for(let e=0,s=Math.min(c.length,t.length);eu&&(u=i,p=h)}h=p||h,h=h.replace(/\d/g,"X"),h=r.code.country_code+" "+h,h.split("").forEach(((e,i)=>{" "===e&&" "!==t[i]&&t.length>i&&(t=t.slice(0,i)+" "+t.slice(i))}));let f=h&&h.length>t.length?h.slice(t.length):"";return f&&(f=f.replace(/X/g,"‒")),{formatted:t,country:d,code:r.code,leftPattern:f}}},645:(e,t,i)=>{"use strict";i.d(t,{M:()=>s,Z:()=>n});class s{constructor(){this.cache=new Map}static createCache(){const e={frames:new Map,framesNew:new Map,framesURLs:new Map,clearCache:()=>{e.framesNew.forEach((e=>{var t,i;null===(i=(t=e).close)||void 0===i||i.call(t)})),e.frames.clear(),e.framesNew.clear(),e.framesURLs.clear()},counter:0};return e}getCache(e){let t=this.cache.get(e);return t||this.cache.set(e,t=s.createCache()),++t.counter,t}releaseCache(e){const t=this.cache.get(e);t&&!--t.counter&&this.cache.delete(e)}getCacheCounter(e){const t=this.cache.get(e);return null==t?void 0:t.counter}generateName(e,t,i,s,n){return[e,t,i,s?"colored":"",n||""].filter(Boolean).join("-")}}const n=new s},9171:(e,t,i)=>{"use strict";function s(e,t,i,s,n,a,o){return[e,",",t," ",i," ",s,",",n," ",a,",",o].join("")}function n(e,t,i,n,a,o,r,d){const l=[];return l.push("M"+(e+i/2)+","+t),l.push("H"+(e+i-o)),o>0&&l.push("A"+s(o,o,0,0,1,e+i,t+o)),l.push("V"+(t+n-r)),r>0&&l.push("A"+s(r,r,0,0,1,e+i-r,t+n)),l.push("H"+(e+d)),d>0&&l.push("A"+s(d,d,0,0,1,e+0,t+n-d)),l.push("V"+(t+a)),a>0&&l.push("A"+s(a,a,0,0,1,e+a,t+0)),l.push("Z"),l.join(" ")}i.d(t,{Z:()=>n}),i(410).GO.generatePathData=n},1046:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(6740),n=i(1185),a=i(6705);function o(e,t,i){const o=(0,n.Z)(e,t,!1);let r,d;if(i){const e=(0,a.Z)(o);r=e.canvas,d=e.promise}else r=new Image,d=(0,s.cj)(r,o);return r.classList.add("thumbnail"),{image:r,loadPromise:d}}},1185:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4059);function n(e,t,i=!1){return(0,s.Z)(t.bytes,i)}},8580:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(1507),n=i(1046);function a(e,t,i,a=!1){const o=["video","gif"].includes(e.type);if(!t.downloaded||o||a){if("document"===e._&&t.downloaded&&!a&&(!o||t.type!==s.Pt))return null;const r=e.sizes||e.thumbs,d=(null==r?void 0:r.length)?r.find((e=>"photoStrippedSize"===e._)):null;if(d&&"bytes"in d)return(0,n.Z)(e,d,i)}return null}},6074:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(7625),n=i(5953);class a{constructor(e){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,(0,n.Z)(this,e)}setTargets(e,t,i){this.previous=e,this.next=t,this.reverse=i}get index(){return void 0!==this.count?this.previous.length:-1}reset(e=!1){this.current=void 0,this.previous=[],this.next=[],this.setLoaded(!0,e),this.setLoaded(!1,e)}go(e,t=!0){let i,s;if(e>0){if(i=this.next.splice(0,e),s=i.pop(),!s)return;void 0!==this.current&&i.unshift(this.current),this.previous.push(...i)}else{if(i=this.previous.splice(Math.max(0,this.previous.length+e),-e),s=i.shift(),!s)return;void 0!==this.current&&i.push(this.current),this.next.unshift(...i)}return this.next.length0),this.current}unsetCurrent(e){e?this.previous.push(this.current):this.next.unshift(this.current),this.current=void 0}goUnsafe(e,t){const i=e>0?Math.max(0,e-this.next.length):Math.min(0,e+this.previous.length),s=this.go(e,!i&&t);return{item:i?void 0:s,leftLength:i}}setLoaded(e,t){return(e?this.loadedAllDown:this.loadedAllUp)!==t&&(e?this.loadedAllDown=t:this.loadedAllUp=t,t||(e?this.loadPromiseDown=null:this.loadPromiseUp=null),!0)}load(e){if(e?this.loadedAllDown:this.loadedAllUp)return Promise.resolve();let t,i=e?this.loadPromiseDown:this.loadPromiseUp;return i||(t=e?this.reverse?this.previous[0]:this.next[this.next.length-1]:this.reverse?this.next[this.next.length-1]:this.previous[0],null!=t||(t=this.current),i=this.loadMore(t,e,this.loadCount).then((t=>{return n=this,a=void 0,r=function*(){if((e?this.loadPromiseDown:this.loadPromiseUp)!==i)return;t.items.length{const t=this.processItem?this.processItem(e):e;t&&n.push(t)}));const a=yield Promise.all(n);e?this.reverse?this.previous.unshift(...a):this.next.push(...a):this.reverse?this.next.push(...a):this.previous.unshift(...a),this.onLoadedMore&&this.onLoadedMore()},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r}),(()=>{})).then((()=>{e?this.loadPromiseDown=null:this.loadPromiseUp=null})),e?this.loadPromiseDown=i:this.loadPromiseUp=i,i)}}},3699:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(){this.listeners=new Set}add(e){return(t,i,s)=>{const n={element:e,event:t,callback:i,options:s};return this.addManual(n),n}}addManual(e){var t;e.element.addEventListener(e.event,e.callback,e.options),(null===(t=e.options)||void 0===t?void 0:t.once)&&(e.onceCallback=()=>{this.remove(e),e.onceFired=!0},e.element.addEventListener(e.event,e.onceCallback,e.options)),this.listeners.add(e)}remove(e){e.onceFired||(e.element.removeEventListener(e.event,e.callback,e.options),e.onceCallback&&e.element.removeEventListener(e.event,e.onceCallback,e.options)),this.listeners.delete(e)}removeManual(e,t,i,s){let n;for(const a of this.listeners)if(a.element===e&&a.event===t&&a.callback===i&&a.options===s){n=a;break}n&&this.remove(n)}removeAll(){this.listeners.forEach((e=>{this.remove(e)}))}}},9405:(e,t,i)=>{"use strict";i.d(t,{C:()=>a,c:()=>n});var s=i(9897);class n{constructor(e=0,t=e){this.width=e,this.height=t}aspect(e,t){return(0,s.Z)(this.width,this.height,e.width,e.height,t)}aspectFitted(e){return this.aspect(e,!0)}aspectCovered(e){return this.aspect(e,!1)}}function a(e,t){return new n(e,t)}},4755:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,_:()=>s});var s,n=i(410),a=i(3241),o=i(9405);!function(e){e[e.mobile=0]="mobile",e[e.medium=1]="medium",e[e.large=2]="large"}(s||(s={}));const r=(0,o.C)(20,20),d=(0,o.C)(36,36),l=(0,o.C)(18,18);class c extends a.Z{constructor(){super(),this.screenSizes=[{key:s.mobile,value:600},{key:s.medium,value:1275},{key:s.large,value:1680}],this.sizes={handhelds:{regular:(0,o.C)(270,270),webpage:(0,o.C)(270,200),album:(0,o.C)(270,0),esgSticker:(0,o.C)(68,68),animatedSticker:(0,o.C)(180,180),staticSticker:(0,o.C)(180,180),emojiSticker:(0,o.C)(112,112),poll:(0,o.C)(240,0),round:(0,o.C)(200,200),documentName:(0,o.C)(200,0),invoice:(0,o.C)(270,270),extendedInvoice:(0,o.C)(270,270),customEmoji:r,esgCustomEmoji:d,emojiStatus:l,popupSticker:(0,o.C)(68,68)},desktop:{regular:(0,o.C)(420,340),webpage:(0,o.C)(420,340),album:(0,o.C)(420,0),esgSticker:(0,o.C)(72,72),animatedSticker:(0,o.C)(200,200),staticSticker:(0,o.C)(200,200),emojiSticker:(0,o.C)(112,112),poll:(0,o.C)(330,0),round:(0,o.C)(280,280),documentName:(0,o.C)(240,0),invoice:(0,o.C)(320,320),extendedInvoice:(0,o.C)(420,340),customEmoji:r,esgCustomEmoji:d,emojiStatus:l,popupSticker:(0,o.C)(80,80)}},this.isMobile=!1,this.handleResize=()=>{const e=window.innerWidth;let t=this.screenSizes[0].key;for(let i=this.screenSizes.length-1;i>=0;--i)if(this.screenSizes[i].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame((()=>{this.handleResize(),this.rAF=0}))})),this.handleResize()}}const h=new c;n.GO.mediaSizes=h;const u=h},8631:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});const s=(0,i(5471).Z)("MIDDLEWARE");function n(e,t=s){return i=>{if(!(i instanceof Promise)){if(i instanceof Error)throw i;return i}return i.then((i=>{if(!e())throw t;return i}))}}},3228:(e,t,i)=>{"use strict";function s(e,t,i){return ei?i:e}i.d(t,{Z:()=>s})},2559:(e,t,i)=>{"use strict";function s(e,t=2){if(0===e)return"0";const i=t<0?0:t,s=Math.floor(Math.log(e)/Math.log(1e3));return parseFloat((e/Math.pow(1e3,s)).toFixed(i))+["","K","M","B","T"][s]}i.d(t,{Z:()=>s})},2575:(e,t,i)=>{"use strict";function s(e,t=" "){const i=e.toString().split(".");return i[0]=i[0].replace(/\B(?=(\d{3})+(?!\d))/g,t),i.join(".")}i.d(t,{Z:()=>s})},925:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4762);function n(e,t=e.HAVE_METADATA,i){return new Promise(((n,a)=>{if(e.readyState>=t)return void n();const o=s.IS_APPLE_MOBILE&&!i?"loadeddata":"canplay",r="error",d=()=>{e.removeEventListener(r,l),n()},l=t=>{e.removeEventListener(o,d),a(e.error)};e.addEventListener(o,d,{once:!0}),e.addEventListener(r,l,{once:!0})}))}},2296:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(6385),n=i(5432),a=i(4762),o=i(3910),r=i(2738),d=i(5975),l=i(3241);class c extends l.Z{constructor(e,t){super(!1),this.navigationType=e,this.withOverlay=t,this.onClick=e=>{var t;this.element&&(0,d.Z)(e.target,this.element)||((null===(t=this.listenerOptions)||void 0===t?void 0:t.capture)&&(0,o.Z)(e),this.close())},this.listenerOptions=t?{}:{capture:!0}}close(){var e;this.element&&(null===(e=this.overlay)||void 0===e||e.remove(),this.element=void 0,this.dispatchEvent("toggle",!1)),n.Z||window.removeEventListener("contextmenu",this.onClick,this.listenerOptions),document.removeEventListener(r.pf,this.onClick,this.listenerOptions),a.IS_MOBILE_SAFARI||s.Z.removeByType(this.navigationType)}open(e){this.close(),a.IS_MOBILE_SAFARI||s.Z.pushItem({type:this.navigationType,onPop:e=>{this.close()}}),this.element=e,!this.overlay&&this.withOverlay&&(this.overlay=document.createElement("div"),this.overlay.classList.add("btn-menu-overlay"),this.overlay.addEventListener(r.pf,(e=>{(0,o.Z)(e),this.onClick(e)}))),this.overlay&&this.element.parentElement.insertBefore(this.overlay,this.element),n.Z||window.addEventListener("contextmenu",this.onClick,Object.assign(Object.assign({},this.listenerOptions),{once:!0})),document.addEventListener(r.pf,this.onClick,this.listenerOptions),this.dispatchEvent("toggle",!0)}}},5180:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(7445);function n(e,t,i){const n=(e=+e)<0,a=s.Z[t];if(!a)throw new Error("CURRENCY_WRAP_INVALID");const o=e/Math.pow(10,a.exp);let r=a.exp;"IRR"==t&&Math.floor(o)==o&&(r=0);let d=function(e,t,i,s){e=(e+"").replace(/[^0-9+\-Ee.]/g,"");var n=isFinite(+e)?+e:0,a=isFinite(+t)?Math.abs(t):0,o=void 0===s?",":s,r=void 0===i?".":i,d="";return(d=(a?function(e,t){var i=Math.pow(10,t);return""+Math.round(e*i)/i}(n,a):""+Math.round(n)).split("."))[0].length>3&&(d[0]=d[0].replace(/\B(?=(?:\d{3})+(?!\d))/g,o)),(d[1]||"").length{"use strict";i.d(t,{Z:()=>n});var s=i(4755);function n(e,t,i,n){e.touches&&(e=e.touches[0]);const{pageX:a,pageY:o}=e,r=Array.from(t.children).find((e=>e.classList.contains("btn-menu-item")&&!e.classList.contains("hide")))||t;let{scrollWidth:d}=r;const{scrollHeight:l}=t,c=document.body.getBoundingClientRect(),h=c.width,u=c.height;d+=2*r.offsetLeft;let p=8,f=8,m=8,g=8;n&&(n.top&&n.top,n.right&&(f+=n.right),n.bottom&&(m+=n.bottom),n.left&&(g+=n.left)),i=s.Z.isMobile?"right":"left";let v="top";const b=u-l-m,y=h-d-f,w=g,S={x:{left:a,right:Math.min(y,a-d)},intermediateX:"right"===i?w:y,y:{top:o,bottom:o-l},intermediateY:b},C={left:S.x.left+d+f<=h,right:S.x.right>=g},L={top:S.y.top+l+m<=u,bottom:S.y.bottom-m>=m};{const e=C[i]?S.x[i]:(i="center",S.intermediateX);t.style.left=e+"px"}{const e=L[v]?S.y[v]:(v="center",S.intermediateY);t.style.top=e+"px"}return t.className=t.className.replace(/(top|center|bottom)-(left|center|right)/g,""),t.classList.add(("center"===v?v:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left")),{width:d,height:l}}},677:(e,t,i)=>{"use strict";i.d(t,{RP:()=>a,X:()=>o});const s=new Set(["all","web","webk"]),n=new Set;function a(e){return e.find((e=>s.has(e.platform)&&!n.has(e.reason)))}function o(e){return!!a(e)}},3174:(e,t,i)=>{"use strict";i.d(t,{O:()=>o,k:()=>a});var s=i(3512);const n={};function a(e,t,i,s){const a=e.id+"-"+t,o=n[a];return o&&o.width>=i&&o.height>=s}function o(e,t,i){return o=this,r=void 0,l=function*(){const o=e.id+"-"+i,{width:r,height:d}=t;if(a(e,i,r,d))return;const l=n[o]={width:r,height:d},c=yield s.Z.managers.appDocsManager.getLottieCachedThumb(e.id,i);if(n[o]!==l)return;if(c&&c.w>=r&&c.h>=d)return;const h=new Promise((e=>{t.toBlob((t=>e(t)))})),u=yield h;n[o]===l&&s.Z.managers.appDocsManager.saveLottiePreview(e.id,u,r,d,i)},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}},9966:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3035);function n(e){return function(e,t){let i,s=!1;return(...n)=>{i=n,s||(s=!0,e((()=>{s=!1,t(...i)})))}}(s.T2,e)}},8936:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(5953);class n{constructor(e){this.loading=!1,this.loaded=!1,(0,s.Z)(this,e),e.scrollable.onScrolledBottom=()=>{this.load()}}load(){return this.loaded?Promise.resolve():this.loading?this.promise:(this.loading=!0,void(this.promise=this.getPromise().then((e=>{this.loading=!1,this.promise=void 0,e?(this.loaded=!0,this.scrollable.onScrolledBottom=null):this.scrollable.checkForTriggers()}),(()=>{this.promise=void 0,this.loading=!1}))))}}},3719:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3781),n=i(2790),a=i(3512),o=i(7625),r=i(1708),d=i(6074),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class c extends d.Z{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{loadMore:(e,t,i)=>{const a=t?0:i;let o=null==e?void 0:e.mid;var d;return void 0===o&&(o=this.searchContext.maxId),t||(d=o,1,o=(0,s.Z)((0,n.Z)(d)+1)),this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==e?void 0:e.peerId),maxId:o,limit:a?0:i,backLimit:a})).then((e=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(0,r.Z)(e),e.next_rate&&(this.searchContext.nextRate=e.next_rate),{count:e.count,items:e.history})))},processItem:t=>l(this,void 0,void 0,(function*(){if((yield this.filterMids([t.mid])).length)return e.processItem(t)}))})),this.onHistoryDelete=({peerId:e,msgs:t})=>{const i=i=>i.peerId===e&&t.has(i.mid),s=(e,t,s)=>{i(e)&&s.splice(t,1)};(0,o.Z)(this.previous,s),(0,o.Z)(this.next,s),this.current&&i(this.current)&&(this.current=void 0,this.onEmptied&&this.onEmptied())},this.onHistoryMultiappend=e=>l(this,void 0,void 0,(function*(){if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;if(e.peerId!==this.searchContext.peerId)return;const t=yield this.filterMids([e.mid]),i=(yield Promise.all(t.map((e=>this.processItem(e))))).filter(Boolean);i.length&&(this.current?this.next.push(...i):this.previous.push(...i))})),this.onMessageSent=({message:e})=>{this.onHistoryMultiappend(e)},null!==(t=this.managers)&&void 0!==t||(this.managers=a.Z.managers),a.Z.addEventListener("history_delete",this.onHistoryDelete),a.Z.addEventListener("history_multiappend",this.onHistoryMultiappend),a.Z.addEventListener("message_sent",this.onMessageSent),e.isInner||(this.otherSideLoader=new c(Object.assign(Object.assign({},e),{isInner:!0})))}filterMids(e){return l(this,void 0,void 0,(function*(){const t=`${this.searchContext.peerId}_${this.searchContext.isScheduled?"scheduled":"history"}`;return yield this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._,e,t,e.length)}))}setSearchContext(e){this.searchContext=e,void 0!==this.searchContext.folderId&&(this.loadedAllUp=!0,void 0===this.searchContext.nextRate&&(this.loadedAllDown=!0)),"inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(this.loadedAllUp=!0),!1===this.searchContext.useSearch&&(this.loadedAllDown=this.loadedAllUp=!0),this.otherSideLoader&&this.otherSideLoader.setSearchContext(e)}reset(){super.reset(),this.searchContext=void 0,this.otherSideLoader&&this.otherSideLoader.reset()}getPrevious(e){let t=this.previous;return this.otherSideLoader&&e&&(t=t.concat(this.otherSideLoader.previous)),t}getNext(e){let t=this.next;return this.otherSideLoader&&e&&(t=t.concat(this.otherSideLoader.next)),t}getCurrent(){var e;return this.current||(null===(e=this.otherSideLoader)||void 0===e?void 0:e.current)}goToOtherEnd(e){return e>0?this.go(-this.previous.length):this.go(this.next.length)}goRound(e,t){var i;let s;if(null===(i=this.otherSideLoader)||void 0===i?void 0:i.current){if(s=this.otherSideLoader.goUnsafe(e,t),s.item)return s.item;if(!((e=s.leftLength)>0?this.otherSideLoader.next:this.otherSideLoader.previous).length){if(!(e>0?this.otherSideLoader.loadedAllUp:this.otherSideLoader.loadedAllDown))return;if(e>0&&(1===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllDown)||e<0&&(0===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllUp))return this.otherSideLoader.goToOtherEnd(e);this.otherSideLoader.unsetCurrent(e>0)}}if(s=this.goUnsafe(e,t),!s.item){if(this.loadedAllUp&&this.loadedAllDown)return this.goToOtherEnd(e);this.otherSideLoader&&(e=s.leftLength,s=this.otherSideLoader.goUnsafe(e,t),s.item&&this.unsetCurrent(e>0))}return null==s?void 0:s.item}setLoaded(e,t){var i;const s=super.setLoaded(e,t);if(s&&this.otherSideLoader&&t&&!1!==(null===(i=this.searchContext)||void 0===i?void 0:i.useSearch)){const e=this.loadedAllUp;this.otherSideLoader.setSearchContext(Object.assign(Object.assign({},this.searchContext),{maxId:e?1:0})),this.otherSideLoader.reverse=this.reverse,this.otherSideLoader.setLoaded(e,!0),this.otherSideLoader.load(!e)}return s}cleanup(){this.reset(),a.Z.removeEventListener("history_delete",this.onHistoryDelete),a.Z.removeEventListener("history_multiappend",this.onHistoryMultiappend),a.Z.removeEventListener("message_sent",this.onMessageSent),this.onEmptied=void 0,this.otherSideLoader&&(this.otherSideLoader.cleanup(),this.otherSideLoader=void 0)}}},9674:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(3035),n=i(3725),a=i(410),o=i(8487);const r=new class{constructor(){this.promises={},this.raf=s.T2.bind(null),this.scheduled=!1}do(e,t){let i=this.promises[e];return i||(this.scheduleFlush(),i=this.promises[e]=(0,n.Z)()),void 0!==t&&i.then((()=>t())),i}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const i=(0,o.Z)(e),s=i?this.mutate():Promise.resolve();return void 0!==t&&(i?s.then((()=>t())):t()),s}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf((()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}})))}};a.GO&&(a.GO.sequentialDom=r);const d=r},1713:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(1507),n=i(7030),a=i(9405),o=i(3114);function r(e,t,i,r,d=!0,l,c,h){const u=(0,o.Z)(e);let p;h||(h=(0,n.Z)(e,i,r,void 0,c));const f="document"===e._;p=f||u?(0,a.C)(e.w||h.w||512,e.h||h.h||512):(0,a.C)(h.w||100,h.h||100);let m=(0,a.C)(i,r);m=p=p.aspect(m,d);let g=!0;return(!f||["video","gif"].includes(e.type)||u)&&(m.width<200&&m.height<200&&(m=p=p.aspectCovered((0,a.C)(200,200))),l&&(l.message||l.reply_to_mid||l.media.webpage||l.replies&&l.replies.pFlags.comments&&l.replies.channel_id.toChatId()!==s.IA)&&m.width<320&&(m=(0,a.C)(320,m.height),g=!1),g&&m.width<120&&l&&(m=(0,a.C)(120,m.height),g=!1)),t.style.width=m.width+"px",t.style.height=m.height+"px",{photoSize:h,size:p,isFit:g}}},5345:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,s:()=>h});var s=i(5003),n=i(6519),a=i(3624),o=i(8631),r=i(5953),d=i(5418),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let c=0;class h{constructor(e){var t;(0,r.Z)(this,e),this.queue=[],null!==(t=this.middlewareHelper)&&void 0!==t||(this.middlewareHelper=(0,a.k)());const i="BATCH-PROCESSOR-"+ ++c;this.log?this.log=this.log.bindPrefix(i):this.log=(0,s.kg)(i)}get queuePromise(){return this.promise}clear(){this.log("clear"),this.queue.length=0,this.promise=void 0,this.middlewareHelper.clean()}addToQueue(e){return this.queue.push(e),this.setQueue()}setQueue(){if(!this.queue.length)return Promise.resolve();if(this.promise)return this.promise;const e=this.middlewareHelper.get(),t=this.log.bindPrefix("queue"),i=(0,o.Z)(e,this.possibleError),s=()=>l(this,void 0,void 0,(function*(){t("start",this.queue.length);const e=this.queue.splice(0,this.queue.length),n=performance.now(),a=e.map((e=>(e.then((e=>{t("render item time",performance.now()-n,e)})),e))),o=yield i(Promise.all(a));if(yield i(this.process(o,i,t)),t("queue rendered"),this.queue.length)return t("have new items to render"),s();t("end")}));t("setting pause");const n=this.promise=i((0,d.Z)(0)).then((()=>s().catch((e=>{throw e!==this.possibleError&&t.error("process queue error",e),e}))),(e=>{throw t("pause has been cleared"),e})).finally((()=>{this.promise===n&&(this.promise=void 0)}));return n}}class u{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),(0,r.Z)(this,e),this.elements=new Map,this.sorted=[],this.middleware=(0,a.k)(),this.batchProcessor=new h({log:this.log,process:(e,t,i)=>l(this,void 0,void 0,(function*(){const i=e.map((e=>this.update(e.id,e)));yield t(Promise.all(i))}))})}clear(){this.batchProcessor.clear(),this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach((e=>{this.update(e.id)})),this.onSort&&this.sorted.forEach(((e,t)=>{this.onSort(e,t)}))}updateList(e){const t=this.middleware.get();this.updateListWith((i=>{t()&&(void 0===i||i)?(this._updateList(),null==e||e(!0)):null==e||e(!1)}))}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e){return l(this,void 0,void 0,(function*(){if(this.get(e))return;const t={id:e,index:0};this.elements.set(e,t);const i=Promise.resolve(this.onElementCreate(t));return this.batchProcessor.addToQueue(i)}))}delete(e,t){const i=this.elements.get(e);if(!i)return!1;this.elements.delete(e);const s=this.sorted.indexOf(i);if(-1!==s&&this.sorted.splice(s,1),this.onDelete)if(t)this.onDelete(i);else{const e=this.middleware.get();this.updateElementWith((()=>{e()&&this.onDelete(i)}))}return!0}update(e,t=this.get(e)){var i;return l(this,void 0,void 0,(function*(){if(!t)return;if(t.index=yield this.getIndex(t),this.get(e)!==t)return;null===(i=this.onUpdate)||void 0===i||i.call(this,t);const s=(0,n.Z)(this.sorted,t,"index");this.onSort(t,s)}))}}},6854:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s="\ufeff"},4056:(e,t,i)=>{"use strict";function s(e){return e.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,(e=>"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";")).replace(/([^\#-~| |!])/g,(e=>"&#"+e.charCodeAt(0)+";")).replace(//g,">")}i.d(t,{Z:()=>s})},3738:(e,t,i)=>{"use strict";function s(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}i.d(t,{Z:()=>s})},8456:(e,t,i)=>{"use strict";function s(e,t,i=t+10){return(e=e.trim()).length>i&&(e=e.slice(0,t)+"..."),e}i.d(t,{Z:()=>s})},5157:(e,t,i)=>{"use strict";function s(e,t=!1){const i=parseInt(e+"",10),s=Math.floor(i/3600);let n=Math.floor((i-3600*s)/60),a=i-3600*s-60*n;return s&&(t=!0),n<10&&(n=t?"0"+n:n),a<10&&(a="0"+a),(s?s+":":"")+n+":"+a}i.d(t,{Z:()=>s})},8812:(e,t,i)=>{"use strict";function s(e){const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise((e=>{const i=new FileReader;i.onload=t=>{e(t.target.result)},i.readAsDataURL(t)}))}i.d(t,{Z:()=>s})},241:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1352);const n=new class{constructor(){if(s.kC)return;const e="visualViewport"in window?window.visualViewport:window,t=()=>{this.width=e.width||e.innerWidth,this.height=e.height||e.innerHeight};e.addEventListener("resize",t),t()}}},8594:(e,t,i)=>{"use strict";i.d(t,{YW:()=>p,ZP:()=>v,e9:()=>g,gp:()=>m});var s=i(3725),n=i(410),a=i(5418);const o=new(i(3241).Z),r="start",d="end";let l=!1,c=(0,s.Z)(),h=0;c.resolve();const u=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function p(e,t){l||(c=(0,s.Z)(),o.dispatchEvent(r),l=!0,n.ZP&&u("start")),++h,n.ZP&&u("attach promise, length:",h,t);const i=[void 0!==t?(0,a.Z)(t):void 0,e.finally((()=>{}))].filter(Boolean),d=performance.now(),p=c;return Promise.race(i).then((()=>{c!==p||c.isFulfilled||(--h,n.ZP&&u("promise end, length:",h,performance.now()-d),h<=0&&f())})),c}function f(){c.isFulfilled||(l=!1,h=0,o.dispatchEvent(d),c.resolve(),n.ZP&&u("end"))}function m(){f()}function g(){return c}function v(e,t,i){l&&e();const s=i?i.add(o):o.addEventListener.bind(o),n=i?i.removeManual.bind(i,o):o.removeEventListener.bind(o);return s(r,e),s(d,t),()=>{n(d,t),n(r,e)}}window.dispatchHeavyAnimationEvent=p},8130:(e,t,i)=>{"use strict";i.r(t),i.d(t,{AppDialogsManager:()=>ht,DIALOG_LIST_ELEMENT_TAG:()=>it,default:()=>pt});var s=i(9331),n=i(3512),a=i(3003),o=i(6194),r=i(2325),d=i(4668),l=i(2796),c=i(3897),h=i(1483),u=i(3416),p=i(1507),f=i(3186),m=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class g{constructor(e){this.managers=e,this.onArchiveClick=()=>m(this,void 0,void 0,(function*(){const e=yield this.managers.appMessagesManager.getDialogOnly(this.peerId);e&&this.managers.appMessagesManager.editPeerFolders([e.peerId],+!e.folder_id)})),this.hideTopic=()=>{this.managers.appChatsManager.editForumTopic({chatId:this.peerId.toChatId(),topicId:this.threadId,hidden:!0})},this.toggleTopic=()=>{this.managers.appChatsManager.editForumTopic({chatId:this.peerId.toChatId(),topicId:this.threadId,closed:!this.dialog.pFlags.closed})},this.onPinClick=()=>{const{peerId:e,filterId:t,threadId:i}=this;this.managers.appMessagesManager.toggleDialogPin({peerId:e,filterId:t,topicId:i}).catch((e=>m(this,void 0,void 0,(function*(){"PINNED_DIALOGS_TOO_MUCH"!==e.type&&"PINNED_TOO_MUCH"!==e.type||(i?this.managers.apiManager.getLimit("topicPin").then((e=>{(0,l.bC)({langPackKey:"LimitReachedPinnedTopics",langPackArguments:[e]})})):t>=1?(0,l.bC)({langPackKey:"PinFolderLimitReached"}):(0,f.Z)("pin"))}))))},this.onUnmuteClick=()=>{this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,mute:!1,threadId:this.threadId})},this.onMuteClick=()=>{new c.Z(this.peerId,this.threadId)},this.onUnreadClick=()=>m(this,void 0,void 0,(function*(){const{peerId:e,dialog:t}=this;t.unread_count?(this.managers.appMessagesManager.readHistory(e,t.top_message,this.threadId),this.threadId||this.managers.appMessagesManager.markDialogUnread(e,!0)):this.threadId||this.managers.appMessagesManager.markDialogUnread(e)})),this.onDeleteClick=()=>{new o.Z(this.peerId,void 0,void 0,this.threadId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=(0,d.Z)(e.target,it)}catch(e){}if(t){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),(()=>{m(this,void 0,void 0,(function*(){this.peerId=t.dataset.peerId.toPeerId(),this.threadId=+t.dataset.threadId||void 0,this.dialog=yield this.managers.dialogsStorage.getDialogOrTopic(this.peerId,this.threadId),this.filterId=this.threadId?void 0:pt.filterId,this.canManageTopics=this.threadId?yield this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"manage_topics"):void 0,yield Promise.all(this.buttons.map((e=>m(this,void 0,void 0,(function*(){const t=yield e.verify();e.element.classList.toggle("hide",!t)})))));const i=this.threadId?"Delete":yield this.managers.appPeersManager.getDeleteButtonText(this.peerId);this.buttons[this.buttons.length-1].element.lastChild.replaceWith((0,r.ag)(i)),t.classList.add("menu-open"),(0,h.Z)(e,this.element),u.Z.openBtnMenu(this.element,(()=>{t.classList.remove("menu-open"),this.peerId=this.dialog=this.filterId=this.threadId=this.canManageTopics=void 0}))}))})()}}}init(){this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>m(this,void 0,void 0,(function*(){return!this.threadId&&!(yield this.managers.appMessagesManager.isDialogUnread(this.dialog))}))},{icon:"readchats",text:"MarkAsRead",onClick:this.onUnreadClick,verify:()=>this.managers.appMessagesManager.isDialogUnread(this.dialog)},{icon:"pin",text:"ChatList.Context.Pin",onClick:this.onPinClick,verify:()=>m(this,void 0,void 0,(function*(){var e;return!(this.threadId&&!this.canManageTopics)&&!(void 0!==this.filterId&&this.filterId>1?(yield this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId):null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned)}))},{icon:"unpin",text:"ChatList.Context.Unpin",onClick:this.onPinClick,verify:()=>m(this,void 0,void 0,(function*(){var e;return!(this.threadId&&!this.canManageTopics)&&(void 0!==this.filterId&&this.filterId>1?(yield this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned))}))},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>m(this,void 0,void 0,(function*(){return this.peerId!==n.Z.myId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.dialog.peerId,threadId:this.threadId}))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>m(this,void 0,void 0,(function*(){return this.peerId!==n.Z.myId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.dialog.peerId,threadId:this.threadId}))}))},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.peerId!==n.Z.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.peerId!==n.Z.myId},{icon:"hide",text:"Hide",onClick:this.hideTopic,verify:()=>m(this,void 0,void 0,(function*(){return this.canManageTopics&&this.dialog.id===p.Ox}))},{icon:"lock",text:"CloseTopic",onClick:this.toggleTopic,verify:()=>this.canManageTopics&&!this.dialog.pFlags.closed},{icon:"lockoff",text:"RestartTopic",onClick:this.toggleTopic,verify:()=>this.canManageTopics&&!!this.dialog.pFlags.closed},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>m(this,void 0,void 0,(function*(){return!this.threadId||!!this.canManageTopics&&this.dialog.id!==p.Ox}))}],this.element=(0,a.b)({buttons:this.buttons}),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var v=i(6008),b=i(1405),y=i(8805),w=i(632),S=i(4762),C=i(5003),L=i(4271),E=i(4494),I=i(9099),M=i(410),P=i(8842),Z=i(1447),T=i(9492),k=i(534),x=i(744),A=i(2738),_=i(4484),F=i(5565),D=i(4159),R=i(3442),B=i(7487),N=i(9174),O=i(3910),U=i(490);class H{constructor(e,t){this.managers=e,this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=e=>{Promise.all([B.Z.get("dc"),n.Z.managers.rootScope.getConnectionStatus()]).then((([t,i])=>{t||(t=D.Z.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const s=i["NET-"+t],n=s&&(e||s.status)===N.Q.Connected;this.connecting&&n&&this.managers.apiUpdatesManager.forceGetDifference(),n&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=s&&(e||s.status)===N.Q.TimedOut,this.connecting=!n,this.retryAt=s&&s.retryAt,M.ZP&&this.log("connecting",this.connecting),this.setState()}))},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,(0,F.Z)(this.statusEl,(0,r.ag)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{if(U.Z.deactivatedReason)return;const e=H.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",(()=>this.managers.networkerFactory.forceReconnect()));this.setStatusText("ConnectionStatus.TimedOut",[e])}else if(this.hadConnect)if(void 0!==this.retryAt){const e=document.createElement("span"),t=this.retryAt,i=()=>{const i=Date.now();e.innerText=""+Math.max(0,Math.round((t-i)/1e3)),i>t&&clearInterval(s)},s=setInterval(i,1e3);i();const n=this.getA("ConnectionStatus.Reconnect",(()=>this.managers.networkerFactory.forceReconnectTimeout()));this.setStatusText("ConnectionStatus.ReconnectIn",[e,n])}else this.setStatusText("ConnectionStatus.Reconnecting");else this.setStatusText("ConnectionStatus.Waiting");else this.updating&&this.setStatusText("Updating");M.ZP&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame((()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout),this.setStateTimeout=window.setTimeout((()=>{(0,I.Z)({element:this.statusContainer,className:"is-shown",forwards:this.connecting||this.updating,duration:200}),this.setStateTimeout=0,M.ZP&&this.log("setState: isShown:",this.connecting||this.updating)}),e)}))},this.log=(0,C.kg)("CS",void 0,void 0),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=(0,E.Z)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new R.Z({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),t.prepend(this.statusContainer),n.Z.addEventListener("connection_status_change",(e=>{this.setConnectionStatus()})),n.Z.addEventListener("state_synchronizing",(e=>{e||(this.updating=!0,M.ZP&&this.log("updating",this.updating),this.setState())})),n.Z.addEventListener("state_synchronized",(e=>{M.ZP&&this.log("state_synchronized",e),e||(this.updating=!1,M.ZP&&this.log("updating",this.updating),this.setState())})),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,H.CHANGE_STATE_DELAY+1e3)}getA(e,t){const i=document.createElement("a");return i.classList.add("force-reconnect"),i.append((0,r.ag)(e)),(0,A.fc)(i,(e=>{(0,O.Z)(e),t()})),i}}H.CHANGE_STATE_DELAY=1e3;var z,j=i(6740),G=i(3035),V=i(2894),K=i(5432),W=i(1154),$=i(241),q=i(8487);!function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(z||(z={}));var Q=i(5345),Y=i(5701),X=i(5296),J=i(8222);function ee(e,t,i,s){return e>=s?t+i:function(e,t){return-t/2*(Math.cos(Math.PI*e)-1)}(e/s,i)+t}var te=i(4755);function ie(e,t,i,s,n,a,o,r){const d=e.canvas.dpr;if(d&&(t*=d,i*=d,s*=d,n*=d),"number"==typeof a)d&&(a*=d),a={tl:a,tr:a,br:a,bl:a};else{const e={tl:0,tr:0,br:0,bl:0};for(const t in e)a[t]=a[t]?d?a[t]*d:a[t]:e[t]}e.beginPath(),e.moveTo(t+a.tl,i),e.lineTo(t+s-a.tr,i),e.quadraticCurveTo(t+s,i,t+s,i+a.tr),e.lineTo(t+s,i+n-a.br),e.quadraticCurveTo(t+s,i+n,t+s-a.br,i+n),e.lineTo(t+a.bl,i+n),e.quadraticCurveTo(t,i+n,t,i+n-a.bl),e.lineTo(t,i+a.tl),e.quadraticCurveTo(t,i,t+a.tl,i),e.closePath(),o&&e.fill(),r&&e.stroke()}const se=window.devicePixelRatio,ne=20*se,ae=2.5*se,oe=2*se,re=1*se;var de=i(6818),le=i(6385),ce=i(3013),he=i(130),ue=i(4332),pe=i(1168),fe=i(7030),me=i(8115),ge=i(496),ve=i(5381),be=i(7530),ye=i(2291),we=i(5772),Se=i(3385),Ce=i(2554),Le=i(8050),Ee=i(6976),Ie=i(3725),Me=i(7362),Pe=i(8631),Ze=i(2312),Te=i(2059),ke=i(2493),xe=i(319);var Ae=i(3228);class _e{constructor(){this.font="30pt Helvetica",this.currTime=Date.now(),this.diffTime=0,this.spread=0,this.paused=!1,this.pausedTime=0,this.pauseInterval=850,this.lightSource=0,this.inc=.032,this.lightSpread=.55,this.animations=["slide","slide","slide","slide"],this.currentAnimationIndex=0}keepTime(){this.diffTime=Date.now()-this.currTime,this.currTime=Date.now()}cycleAnimation(){++this.currentAnimationIndex,this.currentAnimationIndex>=this.animations.length&&(this.currentAnimationIndex=0)}animate(){const e=this.animations[this.currentAnimationIndex];return"glow"===e?this.animateGlow():"slide"===e?this.animateSlide():void console.log("unknown animation type: "+String(e))}animateGlow(){var e=68;return()=>{var t=this.diffTime/(1e3/60)*10;return this.paused?Date.now()-this.pausedTime>800&&(e=68,this.cycleAnimation(),this.paused=!1):(e=parseInt(""+(e+t)))>=255&&(this.paused=!0,this.pausedTime=Date.now()),"rgb("+e+","+e+","+e+")"}}animateSlide(){var e,t,i,s=this.ctx.createLinearGradient(0,0,this.canvas.width,0),n=this.inc*(this.diffTime/(1e3/60));if(this.paused){if(Date.now()-this.pausedTime>this.pauseInterval)return this.lightSource=-.6,this.cycleAnimation(),this.paused=!1,this.animateSlide()}else this.lightSource+=n,this.lightSource>1+this.lightSpread&&(this.paused=!0,this.pausedTime=Date.now());i=(0,Ae.Z)(this.lightSource,0,1),e=(0,Ae.Z)(this.lightSource-this.lightSpread,0,1),t=(0,Ae.Z)(this.lightSource+this.lightSpread,0,1);const a=J.Z.getProperty("background-color-true"),o=J.Z.getProperty("surface-color");return s.addColorStop(e,a),s.addColorStop(i,o),s.addColorStop(t,a),s}settings(e={}){var t,i,s,n,a,o;this.canvas=null!==(t=e.canvas)&&void 0!==t?t:document.createElement("canvas"),this.ctx=this.canvas.getContext("2d"),this.font=null!==(i=e.font)&&void 0!==i?i:this.font,this.lightSpread=null!==(s=e.lightSpread)&&void 0!==s?s:this.lightSpread,this.inc=null!==(n=e.inc)&&void 0!==n?n:this.inc,this.animations=null!==(a=e.animations)&&void 0!==a?a:this.animations,this.text=null!==(o=e.text)&&void 0!==o?o:this.text,this.fillStyle=e.fillStyle,this.canvas.classList.add("shimmer-canvas")}on(){const{width:e,height:t}=this.canvas;this.keepTime(),this.ctx.clearRect(0,0,e,t),this.font&&(this.ctx.font=this.font),this.ctx.fillStyle=this.animate(),this.ctx.fillRect(0,0,e,t),this.fillStyle&&(this.ctx.fillStyle=this.fillStyle,this.ctx.fillRect(0,0,e,t)),this.text&&this.ctx.fillText(this.text,50,50)}}class Fe{constructor(e={}){var t,i,s;this.onThemeChange=()=>{this.stopAnimation(),this.startAnimation()},this.onResize=()=>{const{canvas:e}=this,{width:t,height:i,dpr:s}=e;this.updateCanvasSize(),e.width===t&&e.height===i&&e.dpr===s||(this.stopAnimation(),this.startAnimation())},this.shimmer=new _e,this.tempId=0,this.canvas=document.createElement("canvas"),this.canvas.classList.add("dialogs-placeholder-canvas"),this.ctx=this.canvas.getContext("2d"),this.generatedValues=[],this.avatarSize=null!==(t=e.avatarSize)&&void 0!==t?t:54,this.marginVertical=null!==(i=e.marginVertical)&&void 0!==i?i:9,this.totalHeight=null!==(s=e.totalHeight)&&void 0!==s?s:this.avatarSize+2*this.marginVertical,this.lineHeight=10,this.lineBorderRadius=6,this.lineMarginVertical=8,this.statusWidth=24}attach({container:e,rect:t,getRectFrom:i,onRemove:s,blockScrollable:n}){const{canvas:a}=this;this.onRemove=s,this.getRectFrom="function"==typeof i?i:(i||e).getBoundingClientRect.bind(i||e),(this.blockScrollable=n)&&(n.container.style.overflowY="hidden"),this.updateCanvasSize(t),this.startAnimation(),e.append(a)}detach(e){this.detachTime||(this.availableLength=e,this.detachTime=Date.now(),n.Z.settings.animationsEnabled||this.remove())}remove(){var e;this.stopAnimation(),this.canvas.parentElement&&(this.canvas.remove(),this.blockScrollable&&(this.blockScrollable.container.style.overflowY="",this.blockScrollable=void 0)),null===(e=this.onRemove)||void 0===e||e.call(this),this.onRemove=void 0}updateCanvasSize(e=this.getRectFrom()){const{canvas:t}=this,i=t.dpr=window.devicePixelRatio;t.width=e.width*i,t.height=e.height*i,t.style.width=e.width+"px",t.style.height=e.height+"px"}renderDetachAnimationFrame(){const{canvas:e,ctx:t,detachTime:i,length:s,availableLength:a}=this;if(!i)return;if(!n.Z.settings.animationsEnabled)return void this.remove();const{width:o}=e;t.globalCompositeOperation="destination-out";const r=Date.now()-i;let d=!0;for(let e=0;e=a?15*(a-1):15*e);if(i<=0){d=!1;continue}const n=ee(i,0,1,150);t.beginPath(),t.rect(0,this.dialogHeight*e,o,this.dialogHeight),t.fillStyle=`rgba(0, 0, 0, ${n})`,t.fill(),n<1&&(d=!1)}t.globalCompositeOperation="source-over",d&&this.remove()}renderFrame(){this.shimmer.on(),this.renderDetachAnimationFrame()}startAnimation(){const{canvas:e,shimmer:t}=this,i=++this.tempId,s=this.createPattern();t.settings({canvas:e,fillStyle:s});const a=()=>this.tempId===i;this.renderFrame(),(0,X.jt)((()=>!!a()&&(n.Z.settings.animationsEnabled&&this.renderFrame(),a()))),n.Z.addEventListener("theme_change",this.onThemeChange),te.Z.addEventListener("resize",this.onResize)}stopAnimation(){++this.tempId,n.Z.removeEventListener("theme_change",this.onThemeChange),te.Z.removeEventListener("resize",this.onResize)}createPattern(){const{canvas:e,ctx:t}=this,i=document.createElement("canvas"),s=i.getContext("2d"),n=e.dpr;i.dpr=n,i.width=e.width,i.height=e.height,s.fillStyle=J.Z.getProperty("surface-color"),s.fillRect(0,0,i.width,i.height),s.fillStyle="#000",s.globalCompositeOperation="destination-out";const a=this.dialogHeight=this.totalHeight*n,o=this.length=Math.ceil(e.height/a);for(let e=0;e{})).finally((()=>{e[t]===s&&delete e[t]}));const n=(0,Pe.Z)((()=>e[t]===s));return{deferred:s,middleware:n}}class nt extends Q.Z{constructor(e){super({getIndex:e=>{var t;return this.managers.dialogsStorage.getDialogIndex(null!==(t=this.forumPeerId)&&void 0!==t?t:e.id,this.indexKey,this.forumPeerId?e.id:void 0)},onDelete:e=>{var t;e.dom.listEl.remove(),null===(t=this.onListLengthChange)||void 0===t||t.call(this)},onSort:(e,t)=>{var i;const s=e.dom.listEl.parentElement!==this.list;(0,_.Z)(e.dom.listEl,this.list,t),s&&(null===(i=this.onListLengthChange)||void 0===i||i.call(this))},onElementCreate:e=>tt(this,void 0,void 0,(function*(){var t;const i=[],s=ut.addListDialog({peerId:null!==(t=this.forumPeerId)&&void 0!==t?t:e.id,loadPromises:i,isBatch:!0,threadId:this.forumPeerId?e.id:void 0,isMainList:"index_0"===this.indexKey});return e.dom=s.dom,e.dialogElement=s,yield Promise.all(i),e})),updateElementWith:G.TR,log:e.log}),(0,Ve.Z)(this,e)}clear(){this.list.replaceChildren(),super.clear()}}class at extends ze.ZP{constructor({peerId:e,rippleEnabled:t=!0,onlyFirstName:i=!1,meAsSaved:n=!0,avatarSize:a="bigger",autonomous:o,loadPromises:r,fromName:d,noIcons:l,threadId:c,wrapOptions:h={},isMainList:u}){var p;super({clickable:!0,noRipple:!t,havePadding:!c,title:!0,titleRightSecondary:!0,subtitle:!0,subtitleRight:!0,noWrap:!0,asLink:!0}),this.subtitleRight.remove();const f=c?void 0:new s.Z;if(f){const t={bigger:54,abitbigger:42,small:32}[a];f.classList.add("dialog-avatar","avatar-"+t),f.updateWithOptions({loadPromises:r,lazyLoadQueue:h.lazyLoadQueue,isDialog:!!n,peerId:e,peerTitle:d}),this.applyMediaElement(f,a)}const m=this.container,g=this.title;g.classList.add("user-title"),this.titleRow.classList.add("dialog-title");const v=new P.Z,b=v.update({peerId:e,fromName:d,dialog:n,onlyFirstName:i,withIcons:!l,threadId:c});null==r||r.push(b),g.append(v.element),g.classList.add("tgico");const y=this.subtitle,w=this.container;w.classList.add("chatlist-chat","chatlist-chat-"+a),o||(w.href="#"+e),"bigger"===a?this.container.classList.add("row-big"):"small"===a&&this.container.classList.add("row-small"),w.dataset.peerId=""+e,c&&(w.dataset.threadId=""+c);const S=document.createElement("span");S.classList.add("message-status","sending-status");const C=document.createElement("span");C.classList.add("message-time");const E=this.titleRight;E.classList.add("dialog-title-details"),E.append(S,C),this.subtitleRow.classList.add("dialog-subtitle");const I=this.dom={avatarEl:f,captionDiv:m,titleSpan:v.element,titleSpanContainer:g,statusSpan:S,lastTimeSpan:C,lastMessageSpan:y,containerEl:w,listEl:w,subtitleEl:this.subtitleRow};if(!o){w.dialogDom=I;const t=L.ZP.chat;t&&L.ZP.isSamePeer(t,{peerId:e,threadId:c,type:"chat"})&&ut.setDialogActive(w,!0),u&&(null===(p=ut.forumTab)||void 0===p?void 0:p.peerId)===e&&!c&&w.classList.add("is-forum-open")}}createUnreadBadge(){if(this.dom.unreadBadge)return;const e=this.dom.unreadBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22",this.dom.subtitleEl.append(e)}createUnreadAvatarBadge(){if(this.dom.unreadAvatarBadge)return;const e=this.dom.unreadAvatarBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22 avatar-badge",this.dom.listEl.append(e)}createMentionsBadge(){if(this.dom.mentionsBadge)return;const e=this.dom.mentionsBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22 mention mention-badge",e.innerText="@",this.dom.lastMessageSpan.after(e)}toggleBadgeByKey(e,t,i,s){(0,I.Z)({element:this.dom[e],className:"is-visible",forwards:t,duration:s?0:250,onTransitionEnd:t?void 0:()=>{this.dom[e].remove(),delete this.dom[e]},useRafs:i&&(0,q.Z)(this.dom[e])?0:2})}}class ot extends Ge.h{toggle(e){return tt(this,void 0,void 0,(function*(){this.init2&&(yield this.init2()),(0,I.Z)({element:this.container,className:"is-visible",forwards:e,duration:300,onTransitionEnd:e?void 0:()=>{this.onCloseAfterTimeout()},useRafs:this.firstTime?(this.firstTime=void 0,2):void 0})}))}init(e){(0,Ve.Z)(this,e),this.log=(0,C.kg)("FORUM"),this.firstTime=!0,this.container.classList.add("topics-container");const t=!this.slider;t&&(this.closeBtn.classList.replace("tgico-left","tgico-close"),this.container.classList.add("active","is-floating"),(0,A.fc)(this.closeBtn,(()=>{ut.toggleForumTab(void 0,this)}),{listenerSetter:this.listenerSetter})),this.rows=document.createElement("div"),this.rows.classList.add("sidebar-header__rows"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("sidebar-header__subtitle"),this.title.replaceWith(this.rows),this.rows.append(this.title,this.subtitle);const i=ut.createChatList();ut.setListClickListener(i,null,!0),this.scrollable.append(i),this.xd=new lt(this.peerId,t?80:0),this.xd.scrollable=this.scrollable,this.xd.sortedList=new nt({managers:this.managers,log:this.log,list:i,indexKey:"index_0",forumPeerId:this.peerId}),this.xd.bindScrollable();const s=()=>({peerId:this.peerId,type:"chat"}),a=(0,We.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"info",text:"ForumTopic.Context.Info",onClick:()=>tt(this,void 0,void 0,(function*(){const e=x.ZP.createTab(Qe.Z,!0);e.isFirst=!0,e.setPeer(this.peerId),(yield e.fillProfileElements())(),e.loadSidebarMedia(!0),e.open()}))},{icon:"message",text:"ForumTopic.Context.ShowAsMessages",onClick:()=>{const e=L.ZP.chat;L.ZP[(null==e?void 0:e.peerId)===this.peerId?"setPeer":"setInnerPeer"](s())},verify:()=>{const e=L.ZP.chat;return!e||!L.ZP.isSamePeer(e,s())}},{icon:"adduser",text:"ForumTopic.Context.AddMember",onClick:()=>{},verify:()=>!1},{icon:"add",text:"ForumTopic.Context.New",onClick:()=>{x.ZP.createTab(Je.Z).open(this.peerId)},separator:!0,verify:()=>this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"manage_topics")}]});if(this.listenerSetter.add(n.Z)("history_reload",(e=>{this.peerId===e&&this.xd.fullReset()})),this.listenerSetter.add(n.Z)("chat_update",(e=>tt(this,void 0,void 0,(function*(){this.peerId===e.toPeerId(!0)&&((yield this.managers.appChatsManager.getChat(e)).pFlags.forum||ut.toggleForumTab(void 0,this))})))),K.Z&&(0,W.Z)({element:this.container,onSwipe:()=>{ut.toggleForumTab(void 0,this)},middleware:this.middlewareHelper.get()}),this.header.append(a),!t)return this.init2()}init2(){return tt(this,void 0,void 0,(function*(){this.init2=void 0;const e=this.middlewareHelper.get(),t=this.peerId;this.managers.apiUpdatesManager.subscribeToChannelUpdates(this.peerId.toChatId()),e.onDestroy((()=>{this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(this.peerId.toChatId())}));const i=(0,Me.Z)({peerId:t,dialog:!0,wrapOptions:{middleware:e}}),s=L.ZP.setPeerStatus({peerId:t,element:this.subtitle,needClear:!0,useWhitespace:!1,middleware:e,noTyping:!0});return Promise.all([i,s,this.xd.onChatsScroll().then((e=>e.cached?e.renderPromise:void 0))]).then((([t,i,s])=>{e()&&(this.title.append(t),null==i||i())}))}))}onCloseAfterTimeout(){super.onCloseAfterTimeout(),this.xd.destroy()}}const rt=new Error("not implemented");class dt{constructor(){this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout((()=>{this.sliceTimeout=void 0,this.sortedList.list.childElementCount&&!ut.processContact&&(0,G.TR)((()=>{const e=performance.now(),t=this.scrollable.scrollTop,i=this.sortedList.list.firstElementChild,s=this.scrollable.container.getBoundingClientRect(),n=i.getBoundingClientRect(),a=Array.from(this.scrollable.splitUp.children);let o=this.scrollable.splitUp.offsetTop;o&&t{this.deleteDialogByKey(this.getDialogKeyFromElement(e))})),this.setOffsets(),this.scrollable.scrollTop=c.offsetTop-u,this.log("slice time",performance.now()-e)}))}),200)},this.log=(0,C.kg)("CL"),this.offsets={top:0,bottom:0},this.managers=n.Z.managers,this.listenerSetter=new Ke.Z}getOffsetIndex(e){return{index:this.scrollable.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){const t=this.getOffsetIndex("top"),i=this.getOffsetIndex("bottom");if(!t.index&&!i.index)return!0;const s=(0,Le.Z)(e,this.indexKey);return(!t.index||s<=t.index)&&(!i.index||s>=i.index)}setIndexKey(e){this.indexKey=e,this.sortedList.indexKey=e}deleteDialogByKey(e){this.sortedList.delete(e)}deleteDialog(e){return this.deleteDialogByKey(this.getDialogKey(e))}updateDialog(e){const t=this.getDialogKey(e);if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e);if(!this.sortedList.has(t)&&this.loadedDialogsAtLeastOnce)return void this.sortedList.add(t);const i=this.getDialogElement(t);i&&(ut.setLastMessageN({dialog:e,dialogElement:i,setUnread:!0}),this.sortedList.update(t))}onChatsScrollTop(){return this.onChatsScroll("top")}onChatsScroll(e="bottom"){return this.loadDialogs(e)}createPlaceholder(){const e=this.placeholder=new Fe(this.placeholderOptions),t=this.getRectFromForPlaceholder();return e.attach({container:this.sortedList.list.parentElement,getRectFrom:t,onRemove:()=>{this.placeholder===e&&(this.placeholder=void 0)},blockScrollable:this.scrollable}),e}loadDialogs(e){const t=this.log.bindPrefix("load-"+(i=1e3,s=9999,i=Math.ceil(i),s=Math.floor(s),Math.floor(Math.random()*(s-i+1))+i));var i,s;if(t("try",e),this.loadDialogsPromise||this.loadDialogsRenderPromise)return this.loadDialogsPromise;if(this.scrollable.loadedAll[e])return Promise.resolve({cached:!0,renderPromise:Promise.resolve()});t.warn("start",e);const n=(0,He.Z)("MIDDLEWARE"),a=(0,Ie.Z)(),o=new Promise(((i,s)=>tt(this,void 0,void 0,(function*(){const r=this.sortedList.list;let d=this.placeholder;try{const i=this.loadDialogsInner(e),s=yield i;if(!r.childElementCount&&!d&&(!this.loadedDialogsAtLeastOnce&&this.needPlaceholderAtFirstTime||!s.cached)){if(this.loadDialogsRenderPromise!==o)throw n;d=this.createPlaceholder(),a.resolve(!1)}const l=yield s.result;if(this.loadDialogsRenderPromise!==o)throw n;a.resolve(s.cached),"bottom"===e?l.isEnd&&(this.scrollable.loadedAll[e]=!0):l.isTopEnd&&(this.scrollable.loadedAll[e]=!0);const c=l.dialogs.length;if(t(`will render ${c} dialogs`),c){const t=("top"===e?l.dialogs.slice().reverse():l.dialogs).map((e=>this.sortedList.add(this.getDialogKey(e))));if(yield Promise.all(t).catch(),this.loadDialogsRenderPromise!==o)throw n}const h=l.dialogs["top"===e?0:c-1];h&&(this.offsets[e]=(0,Le.Z)(h,this.indexKey)),this.loadedDialogsAtLeastOnce=!0,ut.onListLengthChange(),t("getDialogs",l,r.childElementCount),setTimeout((()=>{this.scrollable.onScroll()}),0),d&&d.detach(r.childElementCount)}catch(e){return"MIDDLEWARE"!==(null==e?void 0:e.type)&&t.error(e),s(e),void a.reject(e)}i()})))).finally((()=>{this.loadDialogsRenderPromise===o?(t("end"),this.loadDialogsRenderPromise=void 0):t("has been cleared")}));this.loadDialogsRenderPromise=o;const r=this.loadDialogsPromise=a.then((e=>({cached:e,renderPromise:o}))).finally((()=>{this.loadDialogsPromise===r&&(this.loadDialogsPromise=void 0)}));return r}setOffsets(){return tt(this,void 0,void 0,(function*(){const e=this.sortedList.list,[t,i]=yield Promise.all([this.getDialogFromElement(e.firstElementChild),this.getDialogFromElement(e.lastElementChild)]),{indexKey:s}=this;this.offsets.top=(0,Le.Z)(t,s),this.offsets.bottom=(0,Le.Z)(i,s)}))}getDialogKey(e){throw rt}getDialogKeyFromElement(e){throw rt}getRectFromForPlaceholder(){throw rt}getDialogFromElement(e){throw rt}loadDialogsInner(e){throw rt}setTyping(e){return tt(this,void 0,void 0,(function*(){const t=this.getDialogKey(e),i=this.getDialogDom(t);if(!i)return;const s=i.lastMessageSpan.querySelector(".peer-typing-container"),n=yield L.ZP.getPeerTyping(e.peerId,s,"forumTopic"===e._?e.id:void 0);!s&&n&&((0,F.Z)(i.lastMessageSpan,n),i.lastMessageSpan.classList.add("user-typing"))}))}unsetTyping(e){const t=this.getDialogKey(e),i=this.getDialogElement(t);i&&(i.dom.lastMessageSpan.classList.remove("user-typing"),ut.setLastMessageN({dialog:e,lastMessage:null,dialogElement:i,setUnread:null}))}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialogElement(e){const t=this.sortedList.get(e);return null==t?void 0:t.dialogElement}bindScrollable(){this.scrollable.container.addEventListener("scroll",this.onChatsRegularScroll),this.scrollable.onScrolledTop=this.onChatsScrollTop.bind(this),this.scrollable.onScrolledBottom=this.onChatsScroll.bind(this),this.scrollable.setVirtualContainer(this.sortedList.list)}clear(){var e;this.sortedList.clear(),null===(e=this.placeholder)||void 0===e||e.remove()}reset(){this.scrollable.loadedAll.top=!0,this.scrollable.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsRenderPromise=void 0,this.loadDialogsPromise=void 0}fullReset(){return this.reset(),this.clear(),this.onChatsScroll()}destroy(){this.clear(),this.scrollable.destroy(),this.listenerSetter.removeAll()}}class lt extends dt{constructor(e,t){super(),this.peerId=e,this.paddingX=t,this.placeholderOptions={avatarSize:0,marginVertical:5,totalHeight:64},this.listenerSetter.add(n.Z)("peer_typings",(({peerId:e,threadId:t,typings:i})=>tt(this,void 0,void 0,(function*(){if(!t||this.peerId!==e)return;const s=yield this.managers.dialogsStorage.getForumTopic(e,t);s&&(i.length?this.setTyping(s):this.unsetTyping(s))})))),this.listenerSetter.add(n.Z)("dialogs_multiupdate",(e=>{for(const[t,{dialog:i,topics:s}]of e)t===this.peerId&&(null==s?void 0:s.size)&&s.forEach((e=>{this.updateDialog(e)}))})),this.listenerSetter.add(n.Z)("dialog_unread",(({dialog:e})=>{"forumTopic"===(null==e?void 0:e._)&&e.peerId===this.peerId&&ut.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))})})),this.listenerSetter.add(n.Z)("dialog_notify_settings",(e=>tt(this,void 0,void 0,(function*(){if(e.peerId===this.peerId)if("dialog"!==e._)ut.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))});else{const e=[...this.sortedList.getAll().entries()],t=e.map((([e])=>this.managers.dialogsStorage.getForumTopic(this.peerId,e))),i=yield Promise.all(t);e.forEach((([e,t],s)=>{ut.setUnreadMessagesN({dialog:i[s],dialogElement:t.dialogElement})}))}})))),this.listenerSetter.add(n.Z)("dialog_drop",(e=>{"forumTopic"===e._&&e.peerId===this.peerId&&this.deleteDialogByKey(this.getDialogKey(e))})),this.listenerSetter.add(n.Z)("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{"forumTopic"===e._&&e.peerId===this.peerId&&(t?this.deleteDialog(e):this.updateDialog(e))}))}isDialogMustBeInViewport(e){return!e.pFlags.hidden&&super.isDialogMustBeInViewport(e)}getDialogKey(e){return e.id}getDialogKeyFromElement(e){return+e.dataset.threadId}getRectFromForPlaceholder(){return()=>{const e=x.ZP.rect;return{top:56,right:e.right,bottom:0,left:this.paddingX,width:e.width-this.paddingX,height:e.height-56}}}getDialogFromElement(e){return this.managers.dialogsStorage.getForumTopic(+e.dataset.peerId,+e.dataset.threadId)}loadDialogsInner(e){return tt(this,void 0,void 0,(function*(){const{indexKey:t}=this;let i=$.Z.height/64*1.25|0,s=0;const n=this.peerId,{index:a}=this.getOffsetIndex(e);if(s=a,a)if("top"===e){const e=yield this.managers.dialogsStorage.getFolderDialogs(n,!0),o=e.findIndex((e=>(0,Le.Z)(e,t)<=a)),r=Math.max(0,o-i);i=o-r,s=(0,Le.Z)(e[r],t)+1}else s=a;return this.managers.acknowledged.dialogsStorage.getDialogs({offsetIndex:s,limit:i,filterId:n,skipMigrated:!0})}))}}class ct extends dt{constructor(e){super(),this.filterId=e,this.needPlaceholderAtFirstTime=!0,this.listenerSetter.add(n.Z)("peer_typings",(({peerId:e,typings:t})=>tt(this,void 0,void 0,(function*(){const[i,s]=yield Promise.all([this.managers.appMessagesManager.getDialogOnly(e),this.managers.appPeersManager.isForum(e)]);i&&!s&&(t.length?this.setTyping(i):this.unsetTyping(i))})))),this.listenerSetter.add(n.Z)("user_update",(e=>tt(this,void 0,void 0,(function*(){if(!this.isActive)return;const t=e.toPeerId(),i=this.getDialogDom(t);if(!i)return;const s=yield this.managers.appUsersManager.getUserStatus(e),n="userStatusOnline"===(null==s?void 0:s._);this.setOnlineStatus(i.avatarEl,n)})))),this.listenerSetter.add(n.Z)("chat_update",(e=>tt(this,void 0,void 0,(function*(){const t=e.toPeerId(!0);this.processDialogForCallStatus(t)})))),this.listenerSetter.add(n.Z)("dialog_flush",(({dialog:e})=>{this.isActive&&e&&(ut.setLastMessageN({dialog:e,setUnread:!0}),this.validateDialogForFilter(e))})),this.listenerSetter.add(n.Z)("dialogs_multiupdate",(e=>{var t;if(this.isActive)for(const[i,{dialog:s,topics:n}]of e)"dialog"===(null==s?void 0:s._)&&(this.updateDialog(s),null===(t=ut.processContact)||void 0===t||t.call(ut,i.toPeerId()),this.validateDialogForFilter(s))})),this.listenerSetter.add(n.Z)("dialog_drop",(e=>{var t;this.isActive&&"dialog"===e._&&(this.deleteDialogByKey(e.peerId),null===(t=ut.processContact)||void 0===t||t.call(ut,e.peerId))})),this.listenerSetter.add(n.Z)("dialog_unread",(({dialog:e})=>{this.isActive&&"dialog"===(null==e?void 0:e._)&&(ut.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))}),this.validateDialogForFilter(e))})),this.listenerSetter.add(n.Z)("dialog_notify_settings",(e=>{this.isActive&&"forumTopic"!==e._&&(this.validateDialogForFilter(e),ut.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))}))})),this.listenerSetter.add(n.Z)("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{var s;this.isActive&&"forumTopic"!==e._&&(t?this.deleteDialog(e):this.updateDialog(e),null===(s=ut.processContact)||void 0===s||s.call(ut,i))})),this.listenerSetter.add(n.Z)("filter_update",(e=>tt(this,void 0,void 0,(function*(){if(this.isActive&&e.id===this.filterId&&!p.DZ.has(e.id)){const e=yield this.managers.dialogsStorage.getCachedDialogs(!0);yield this.validateListForFilter();for(let t=0,i=e.length;t(0,Le.Z)(e,i)<=o)),r=Math.max(0,a-s);s=a-r,n=(0,Le.Z)(e[r],i)+1}else n=o;const r=this.managers.acknowledged.dialogsStorage.getDialogs({offsetIndex:n,limit:s,filterId:t,skipMigrated:!0}),d=yield r;return a&&(d.result=Promise.reject((0,He.Z)("MIDDLEWARE"))),d}))}setOnlineStatus(e,t){const i="is-online",s=e.classList.contains(i);!s&&t&&e.classList.add(i),(0,I.Z)({element:e,className:"is-visible",forwards:t,duration:250,onTransitionEnd:t?void 0:()=>{e.classList.remove(i)},useRafs:t&&!s?2:0})}generateScrollable(e,t){const i=t.id,s=new y.ZP(null,"CL",500);s.container.dataset.filterId=""+i;const a=(0,Se.Z)(t.localId),o=new nt({managers:n.Z.managers,log:this.log,list:e,indexKey:a,onListLengthChange:ut.onListLengthChange});return this.scrollable=s,this.sortedList=o,this.setIndexKey(a),this.bindScrollable(),s}testDialogForFilter(e){return p.DZ.has(this.filterId)?this.filterId===e.folder_id:void 0!==(0,Le.Z)(e,this.indexKey)}isDialogMustBeInViewport(e){return!(void 0!==e.migratedTo||!this.testDialogForFilter(e))&&super.isDialogMustBeInViewport(e)}validateListForFilter(){return tt(this,void 0,void 0,(function*(){this.sortedList.getAll().forEach((e=>tt(this,void 0,void 0,(function*(){const t=yield n.Z.managers.appMessagesManager.getDialogOnly(e.id);this.testDialogForFilter(t)||this.deleteDialog(t)}))))}))}validateDialogForFilter(e){this.getDialogElement(e.peerId)&&(this.testDialogForFilter(e)||this.deleteDialog(e))}setCallStatus(e,t){let{callIcon:i,listEl:s}=e;if(!i&&t){const{canvas:t,startAnimation:n}=e.callIcon=i=function(e=!1){const t=document.createElement("canvas");t.width=t.height=ne;const i=t.getContext("2d"),s=(ne-(3*oe+2*ae))/2,n=Date.now();let a=!1;const o=()=>{if(t.isConnected)a||(a=t.isConnected);else if(a)return!1;const o=ee((Date.now()-n)%1e3,0,1,1e3);i.clearRect(0,0,ne,ne),i.fillStyle=e&&!te.Z.isMobile?J.Z.getProperty("primary-color"):"#fff";for(let e=0;e<3;++e){let t;t=o>=.5?e%2?2-2*o:2*(o-.5):e%2?2*o:1-2*o;let n=4+8*t;n*=se,ie(i,s+e*oe+e*ae,(ne-n)/2,oe,n,re,!0)}return!0};return{canvas:t,startAnimation:()=>{(0,X.jt)(o),o()},setActive:t=>{e=t,o()}}}(s.classList.contains("active"));t.classList.add("dialog-group-call-icon"),s.append(t),n()}i&&(0,I.Z)({element:e.callIcon.canvas,className:"is-visible",forwards:t,duration:250,onTransitionEnd:t?void 0:()=>{e.callIcon.canvas.remove(),e.callIcon=void 0},useRafs:t?2:0})}processDialogForCallStatus(e,t){return tt(this,void 0,void 0,(function*(){if(!de.Z)return;if(t||(t=this.getDialogDom(e)),!t)return;const i=yield n.Z.managers.appChatsManager.getChat(e.toChatId());this.setCallStatus(t,!(!i.pFlags.call_active||!i.pFlags.call_not_empty))}))}onChatsScroll(e="bottom"){var t;return this.scrollable.loadedAll[e]&&(null===(t=ut.loadContacts)||void 0===t||t.call(ut)),this.log("onChatsScroll",e),super.onChatsScroll(e)}toggleAvatarUnreadBadges(e,t){if(!e)return void this.sortedList.getAll().forEach((e=>{const{dom:t,dialogElement:i}=e;t.unreadAvatarBadge&&i.toggleBadgeByKey("unreadAvatarBadge",!1,!1,!1)}));const i=["unread","mention"];this.sortedList.getAll().forEach((e=>{var t;const{dom:s,dialogElement:n}=e,a=null===(t=s.unreadBadge)||void 0===t?void 0:t.textContent;if(!a||s.unreadBadge.classList.contains("backwards"))return;const o=!!s.unreadAvatarBadge;n.createUnreadAvatarBadge(),n.toggleBadgeByKey("unreadAvatarBadge",!0,o),s.unreadAvatarBadge.textContent=a;const r=s.unreadAvatarBadge.classList,d=s.unreadBadge.classList;i.forEach((e=>{r.toggle(e,d.contains(e))}))}))}getDialogKey(e){return e.peerId}getDialogKeyFromElement(e){return+e.dataset.peerId}getDialogFromElement(e){return n.Z.managers.appMessagesManager.getDialogOnly(e.dataset.peerId.toPeerId())}}class ht{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.log=(0,C.kg)("DIALOGS",C.v9.Log|C.v9.Error|C.v9.Warn|C.v9.Debug),this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.initedListeners=!1,this.xds={},this.onTabChange=()=>(this.xd=this.xds[this.filterId],this.xd.reset(),this.xd.onChatsScroll()),this._onListLengthChange=()=>{if(!this.xd.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId!==p.J$)return;const e=this.chatList,t=e.childElementCount,i=e.parentElement.parentElement,s=e.parentElement.nextElementSibling,n=!!s.childElementCount;if(t>=10)return void(n&&this.removeContactsPlaceholder());if(n)return;i.classList.add("with-contacts");const a=new je.Z({name:"Contacts",noDelimiter:!0,fakeGradientDelimiter:!0});a.container.classList.add("hide"),this.managers.appUsersManager.getContactsPeerIds(void 0,void 0,"online").then((e=>{let t=!1;const i=()=>{t&&a.container.classList.toggle("hide",!s.list.childElementCount),this.updateContactsLength(!0)},s=new V.Z({avatarSize:"abitbigger",createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:i,managers:this.managers});this.loadContacts=()=>{const t=$.Z.height/60|0;(0,Be.Z)(e.splice(0,t),this.verifyPeerIdForContacts).then((e=>{e.forEach((e=>{s.add(e)}))})),e.length||(this.loadContacts=void 0)},this.loadContacts(),this.processContact=e=>tt(this,void 0,void 0,(function*(){if(e.isAnyChat())return;const t=yield this.verifyPeerIdForContacts(e),i=s.has(e);!i&&t?s.add(e):i&&!t&&s.delete(e)}));const n=s.list;n.classList.add("chatlist-new"),this.setListClickListener(n),a.content.append(n),t=!0,i()})),s.append(a.container)},this.verifyPeerIdForContacts=e=>tt(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([this.managers.appPeersManager.isContact(e),this.managers.appMessagesManager.getDialogOnly(e)]);return t&&!i}))}start(){const e=this.managers=(0,Ce.Z)();this.contextMenu=new g(e),this.stateMiddlewareHelper=(0,Ue.k)(),this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=(0,Y.Z)(this._onListLengthChange,100,!1,!0);const t=document.createElement("div");t.classList.add("connection-status-bottom"),t.append(this.folders.container),this.forumsTabs=new Map,this.forumsSlider=document.createElement("div"),this.forumsSlider.classList.add("topics-slider"),this.chatsContainer.parentElement.parentElement.append(this.forumsSlider),K.Z&&(0,W.Z)({element:this.folders.container,onSwipe:e=>{const t=s.prevId();s(e<0?t+1:t-1)},verifyTouchTarget:()=>!this.forumTab}),this.allChatsIntlElement=new r.ZP.IntlElement({key:"FilterAllChatsShort"}),n.Z.addEventListener("premium_toggle",(e=>tt(this,void 0,void 0,(function*(){e||(yield this.managers.filtersStorage.isFilterIdAvailable(this.filterId))||s((0,Oe.Z)(this.filtersRendered[p.J$].menu),!1)})))),n.Z.addEventListener("state_cleared",(()=>{const e=p.DZ.has(this.filterId);Re.Z.getState().then((t=>tt(this,void 0,void 0,(function*(){this.xd.loadedDialogsAtLeastOnce=!1,this.showFiltersPromise=void 0,e&&(this.xd.clear(),this.onTabChange()),this.onStateLoaded(t)}))))})),this.setFilterId(p.J$,p.J$),this.addFilter({id:p.J$,title:"",localId:p.J$});const i=new y.v7(this.folders.menuScrollContainer);t.prepend(this.folders.menuScrollContainer);const s=this.selectTab=(0,v.X)(this.folders.menu,this.folders.container,((e,t)=>tt(this,void 0,void 0,(function*(){const i=e;if(e=+t.dataset.filterId||p.J$,-1!==this.filterId&&!p.DZ.has(e)&&!(yield this.managers.filtersStorage.isFilterIdAvailable(e)))return!1;const n=this.filterId;if(S.IS_MOBILE_SAFARI||(i?this.filtersNavigationItem||(this.filtersNavigationItem={type:"filters",onPop:()=>{s(0),this.filtersNavigationItem=void 0}},le.Z.spliceItems(1,0,this.filtersNavigationItem)):this.filtersNavigationItem&&(le.Z.removeItem(this.filtersNavigationItem),this.filtersNavigationItem=void 0)),n===e)return;this.xds[e].clear();const a=this.setFilterIdAndChangeTab(e).then((({cached:e,renderPromise:t})=>{if(e)return t}));return-1!==n?a:void 0}))),(()=>{for(const e in this.xds)+e!==this.filterId&&this.xds[e].clear()}),void 0,i);Re.Z.getState().then((e=>(ce.Z.setPlaybackParams(e.playbackParams),ce.Z.addEventListener("playbackParams",(e=>{this.managers.appStateManager.pushToState("playbackParams",e)})),this.onStateLoaded(e)))),te.Z.addEventListener("resize",(()=>{this.changeFiltersAllChatsKey()})),new H(this.managers,this.chatsContainer),this.chatsContainer.append(t),setTimeout((()=>{Z.Z.loadLottieWorkers()}),200),pe.Z.MANAGERS=n.Z.managers=e,Ze.Z.construct(e),x.ZP.construct(e),ue.ZP.construct(e),Te.ZP.construct(e),ke.Z.construct(e),L.ZP.construct(e),this.xd=this.xds[this.filterId]}get chatList(){return this.xd.sortedList.list}setFilterId(e,t){this.filterId=e}setFilterIdAndChangeTab(e){return tt(this,void 0,void 0,(function*(){return this.filterId=e,this.onTabChange()}))}initListeners(){n.Z.addEventListener("dialog_flush",(({dialog:e})=>{e&&this.setFiltersUnreadCount()})),n.Z.addEventListener("folder_unread",(e=>tt(this,void 0,void 0,(function*(){if(e.id<0){const t=this.xd.getDialogElement(e.id);if(!t)return;this.setUnreadMessagesN({dialog:yield this.managers.dialogsStorage.getDialogOnly(e.id),dialogElement:t})}else this.setFilterUnreadCount(e.id)})))),n.Z.addEventListener("contacts_update",(e=>{var t;null===(t=this.processContact)||void 0===t||t.call(this,e.toPeerId())})),L.ZP.addEventListener("peer_changed",(({peerId:e,threadId:t,isForum:i})=>{const s={peerId:e,threadId:i?t:void 0};for(const e of this.lastActiveElements){const t=+e.dataset.threadId||void 0,i=e.dataset.peerId.toPeerId();L.ZP.isSamePeer({peerId:i,threadId:t},s)||this.setDialogActive(e,!1)}Array.from(document.querySelectorAll(`[data-autonomous="0"] .chatlist-chat[data-peer-id="${e}"]`)).forEach((t=>{const i=+t.dataset.threadId||void 0;L.ZP.isSamePeer({peerId:e,threadId:i},s)&&this.setDialogActive(t,!0)}))})),n.Z.addEventListener("filter_update",(e=>tt(this,void 0,void 0,(function*(){if(p.DZ.has(e.id))return;if(!this.filtersRendered[e.id])return void this.addFilter(e);const t=this.filtersRendered[e.id];(0,he.Z)(t.title,(0,me.Z)(e.title))})))),n.Z.addEventListener("filter_delete",(e=>{const t=this.filtersRendered[e.id];t&&(t.container.remove(),t.menu.remove(),this.xds[e.id].destroy(),delete this.xds[e.id],delete this.filtersRendered[e.id],this.onFiltersLengthChange(),this.filterId===e.id&&this.selectTab(0,!1))})),n.Z.addEventListener("filter_order",(e=>tt(this,void 0,void 0,(function*(){e=e.slice(),(0,Ne.Z)(e,p.Zi);const t=this.folders.menu,i=yield Promise.all(e.map((e=>tt(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([this.managers.dialogsStorage.getDialogIndexKeyByFilterId(e),this.managers.filtersStorage.getFilter(e)]);return{indexKey:t,filter:i}})))));e.forEach(((e,s)=>{const{indexKey:n,filter:a}=i[s],o=this.filtersRendered[e];this.xds[e].setIndexKey(n),(0,_.Z)(o.menu,t,a.localId),(0,_.Z)(o.container,this.folders.container,a.localId)}))}))))}setDialogActive(e,t){var i;const s=e.dialogDom;e.classList.toggle("active",t),e.classList.toggle("is-forum-open",(null===(i=this.forumTab)||void 0===i?void 0:i.peerId)===e.dataset.peerId.toPeerId()&&!e.dataset.threadId),t?this.lastActiveElements.add(e):this.lastActiveElements.delete(e),(null==s?void 0:s.callIcon)&&s.callIcon.setActive(t)}onStateLoaded(e){return tt(this,void 0,void 0,(function*(){this.stateMiddlewareHelper.clean();const t=this.stateMiddlewareHelper.get(),i=e.filtersArr,s=i.length>p.DZ.size,n=e=>{for(const t of e)this.addFilter(t)};let a;s?n(i):a=this.managers.filtersStorage.getDialogFilters().then(n),this.doNotRenderChatList=!0;const o=this.xd.onChatsScroll(),r=(0,Pe.Z)(t);try{yield r(o)}catch(e){}s||this.selectTab(0,!1),a&&(yield r(a)),this.doNotRenderChatList=void 0,this.filterId=-1,this.selectTab(0,!1),this.initedListeners||(this.initListeners(),this.initedListeners=!0),s&&this.showFiltersPromise&&(yield r(this.showFiltersPromise)),this.managers.appNotificationsManager.getNotifyPeerTypeSettings(),yield(yield r(o)).renderPromise.catch(xe.Z),this.managers.appMessagesManager.fillConversations()}))}setFilterUnreadCount(e){var t;return tt(this,void 0,void 0,(function*(){const i=null===(t=this.filtersRendered[e])||void 0===t?void 0:t.unread;if(!i)return;const{unreadUnmutedCount:s,unreadCount:n}=yield this.managers.dialogsStorage.getFolderUnreadCount(e);i.classList.toggle("badge-gray",!s);const a=e===p.J$?s:n;i.innerText=a?""+a:""}))}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e)}l(e){const t=this.createChatList(),i=this.xds[e.id]=new ct(e.id),s=i.generateScrollable(t,e);return this.setListClickListener(t,null,!0),{ul:t,xd:i,scrollable:s}}addFilter(e){if(e.id===p.Zi)return;const t=this.folders.menu,i=this.filtersRendered[e.id];if(i)return(0,_.Z)(i.menu,t,e.localId),void(0,_.Z)(i.container,this.folders.container,e.localId);const s=document.createElement("div");s.classList.add("menu-horizontal-div-item");const n=document.createElement("span"),a=document.createElement("span");a.classList.add("text-super"),e.id===p.J$?a.append(this.allChatsIntlElement.element):(0,he.Z)(a,(0,me.Z)(e.title));const o=document.createElement("div");o.classList.add("badge","badge-20","badge-primary");const r=document.createElement("i");n.append(a,o,r),(0,b.Z)(s),s.append(n),s.dataset.filterId=""+e.id,(0,_.Z)(s,t,e.localId);const{ul:d,scrollable:l}=this.l(e);l.container.classList.add("tabs-tab","chatlist-parts");const c=document.createElement("div");c.classList.add("chatlist-top");const h=document.createElement("div");h.classList.add("chatlist-bottom"),c.append(d),l.container.append(c,h);const u=l.container;(0,_.Z)(l.container,this.folders.container,e.localId),this.filtersRendered[e.id]={menu:s,container:u,unread:o,title:a},this.onFiltersLengthChange()}changeFiltersAllChatsKey(){const e=this.folders.menuScrollContainer.firstElementChild,t=e.scrollWidth>e.clientWidth?"FilterAllChatsShort":"FilterAllChats";this.allChatsIntlElement.compareAndUpdate({key:t})}onFiltersLengthChange(){let e=this.showFiltersPromise;return null!=e?e:e=this.showFiltersPromise=(0,De.Z)(0).then((()=>{if(this.showFiltersPromise!==e)return;const t=Object.keys(this.filtersRendered).length>1,i=!this.folders.menuScrollContainer.classList.contains("hide");t!==i&&(this.folders.menuScrollContainer.classList.toggle("hide",!t),t&&!i&&this.setFiltersUnreadCount(),this.chatsContainer.classList.toggle("has-filters",t)),this.changeFiltersAllChatsKey(),this.showFiltersPromise=void 0}))}generateEmptyPlaceholder(e){const t="empty-placeholder",i=document.createElement("div");i.classList.add(t,t+"-"+e.classNameType);const s=document.createElement("div");s.classList.add(t+"-header"),(0,r.$d)(s,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&(0,r.$d)(n,e.subtitle,e.subtitleArgs),i.append(s,n),{container:i,header:s,subtitle:n}}checkIfPlaceholderNeeded(){if(this.filterId===p.Zi)return;const e=this.chatList,t=e.parentElement;let i=Array.from(t.children).find((e=>e.matches(".empty-placeholder")));const s=this.xd.scrollable.loadedAll.bottom&&!e.childElementCount;if(s&&i)return;if(!s)return void(i&&(t.classList.remove("with-placeholder"),i.remove()));let n,a;if(this.filterId){n=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:a="folder"}),i=n.container;const e=document.createElement("div"),t="📂",s=128;(0,we.Z)({div:e,emoji:t,width:s,height:s}),i.prepend(e);const o=(0,E.Z)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});(0,A.fc)(o,(()=>tt(this,void 0,void 0,(function*(){const e=x.ZP.createTab(k.Z);e.setInitFilter(yield this.managers.filtersStorage.getFilter(this.filterId)),e.open()})))),i.append(o)}else{n=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:a="dialogs"}),i=n.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),this.emptyDialogsPlaceholderSubtitle=new r.ZP.IntlElement({element:n.subtitle}),Promise.all([this.updateContactsLength(!1),(0,j.cj)(e,"assets/img/EmptyChats.svg"),(0,G.AD)()]).then((([e])=>{i.classList.add("visible"),t.classList.toggle("has-contacts",!!e)})),i.prepend(e)}t.append(i),t.classList.add("with-placeholder"),t.dataset.placeholderType=a}updateContactsLength(e){var t;return null!==(t=this.updateContactsLengthPromise)&&void 0!==t?t:this.updateContactsLengthPromise=this.managers.appUsersManager.getContacts().then((t=>{const i=this.emptyDialogsPlaceholderSubtitle;if(i){let e,s;t.length?(e="ChatList.Main.EmptyPlaceholder.Subtitle",s=[(0,r.ag)("Contacts.Count",[t.length])]):(e="ChatList.Main.EmptyPlaceholder.SubtitleNoContacts",s=[]),i.compareAndUpdate({key:e,args:s})}return e&&this.chatList.parentElement.classList.toggle("has-contacts",!!t.length),this.updateContactsLengthPromise=void 0,t.length}))}removeContactsPlaceholder(){const e=this.chatList,t=e.parentElement.parentElement,i=e.parentElement.nextElementSibling;t.classList.remove("with-contacts"),i.replaceChildren(),this.loadContacts=void 0,this.processContact=void 0}toggleForumTab(e,t=this.forumTab){return tt(this,void 0,void 0,(function*(){if(!t&&!e)return;if(t){const e=this.xd.getDialogElement(t.peerId);e&&e.dom.listEl.classList.remove("is-forum-open")}t===e&&(e=void 0),null==t||t.toggle(!1);const i=null==e?void 0:e.toggle(!0);if(t===this.forumTab&&(this.forumTab=e),e){const t=this.xd.getDialogElement(e.peerId);t&&t.dom.listEl.classList.add("is-forum-open"),L.ZP.selectTab(L.oo.CHATLIST)}i&&(yield i),e&&!this.forumNavigationItem?(this.forumNavigationItem={type:"forum",onPop:()=>{this.forumNavigationItem=void 0,this.toggleForumTab()}},le.Z.pushItem(this.forumNavigationItem)):!e&&this.forumNavigationItem&&(le.Z.removeItem(this.forumNavigationItem),this.forumNavigationItem=void 0);const s=!!e,n=i?2:void 0;this.xd.toggleAvatarUnreadBadges(s,n);const a=(0,Ie.Z)();(0,I.Z)({element:this.forumsSlider.parentElement,className:"is-forum-visible",duration:300,forwards:s,useRafs:n,onTransitionEnd:()=>{a.resolve()}}),(0,Ye.YW)(a,300).then((()=>a.resolve()))}))}toggleForumTabByPeerId(e,t){const{managers:i}=this,s=x.ZP.getHistory(),n=s[s.length-1];let a;if(n)return n instanceof ot&&n.peerId===e&&t?void Xe(n.container):(a=x.ZP.createTab(ot),void a.open({peerId:e,managers:i}));a=this.forumsTabs.get(e);const o=this.forumTab&&this.forumTab===a;if(null!=t||(t=!o),t!==o)return t&&!a&&(a=new ot(void 0),a.init({peerId:e,managers:i}),this.forumsTabs.set(e,a),this.forumsSlider.append(a.container),a.managers=this.managers,a.eventListener.addEventListener("destroy",(()=>{this.forumsTabs.delete(e)}))),this.toggleForumTab(a);t&&Xe(a.container)}setListClickListener(e,t,i=!1,s=!1,n=!1){let a;const o=(n?L.ZP.setInnerPeer:L.ZP.setPeer).bind(L.ZP);e.dataset.autonomous=""+ +s,e.addEventListener("mousedown",(i=>{if(0!==i.button)return;this.log("dialogs click list");const n=i.target,r=(0,d.Z)(n,it);if(!r)return;const l=r.dataset.peerId.toPeerId(),c=+r.dataset.mid||void 0,h=+r.dataset.threadId||void 0;if(null==t||t(),!r.querySelector(".is-forum")||i.shiftKey||c){if(i.ctrlKey||i.metaKey)return window.open(r.href||"#"+l,"_blank"),void(0,O.Z)(i);s&&(a&&!(a===r)&&a.classList.remove("active"),r&&(r.classList.add("active"),a=r,this.lastActiveElements.add(r))),h&&!c||this.xd.sortedList.list!==e||this.xd===this.xds[p.Zi]||this.toggleForumTab(),o({peerId:l,lastMsgId:c,threadId:h})}else this.toggleForumTabByPeerId(l)}),{capture:!0}),e.addEventListener("click",(e=>{0===e.button&&(0,O.Z)(e)}),{capture:!0}),i&&(0,Ee.E)({element:e,callback:this.contextMenu.onContextMenu})}createChatList(e={}){const t=document.createElement("ul");return t.classList.add("chatlist"),e.new&&t.classList.add("chatlist-new"),e.dialogSize&&t.classList.add("chatlist-"+e.dialogSize),t}setLastMessageN(e){return this.setLastMessage(e).catch((e=>{"MIDDLEWARE"!==(null==e?void 0:e.type)&&this.log.error("set last message error",e)}))}setLastMessage({dialog:e,lastMessage:t,dialogElement:i,highlightWord:s,isBatch:a=!1,setUnread:o=!1}){var d,l;return tt(this,void 0,void 0,(function*(){if(!i&&!(i=this.xd.getDialogElement(e.peerId)))return;const{dom:c}=i,{peerId:h}=e,{deferred:u,middleware:p}=st(c,"setLastMessagePromise");let f;if(!t&&("draftMessage"!==(null===(d=e.draft)||void 0===d?void 0:d._)||h.isAnyChat()&&"forumTopic"!==e._&&(yield this.managers.appPeersManager.isForum(h))||(f=e.draft),(null==(t=e.topMessage)?void 0:t.mid)!==e.top_message)){const i=this.managers.appMessagesManager.getMessageByPeer(h,e.top_message);t=yield p(i)}if(this.setUnreadMessagesN({dialog:e,dialogElement:i,isBatch:a,setLastMessagePromise:u}),!t)return c.lastMessageSpan.replaceChildren(),c.lastTimeSpan.replaceChildren(),delete c.listEl.dataset.mid,void u.resolve();const m=t&&(0,ve.Z)(t);{let e;const i=[];if(t&&!f&&!m){const s=(0,be.Z)(t),n=new Set(["video","gif","round"]);if(s&&("photo"===s._||n.has(s.type))){const a=(0,fe.Z)(s,20,20);if("photoSizeEmpty"!==a._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),"round"===s.type&&e.classList.add("is-round"),i.push((0,T.Z)({photo:s,message:t,container:e,withoutPreloader:!0,size:a}).then((()=>e))),n.has(s.type))){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}if(f){const e=document.createElement("span");e.classList.add("danger"),e.append((0,r.ag)("Draft"),": "),i.unshift(e)}else if(h.isAnyChat()&&h!==t.fromId&&!t.action){const e=document.createElement("span");if(e.classList.add("primary-text"),t.fromId===n.Z.myId)e.append((0,r.ag)("FromYou")),i.unshift(e);else{const s=p((0,Me.Z)({peerId:t.fromId,onlyFirstName:!0})).then((t=>(e.prepend(t),e)),xe.Z);i.unshift(s)}e.append(": ")}const a=!!e&&!!(null==t?void 0:t.message);let o;if(o=s&&t.message?yield p((0,ge.Z)({message:t,highlightWord:s,withoutMediaType:a})):f?yield p((0,ge.Z)({message:f})):t?yield p((0,ge.Z)({message:t,withoutMediaType:a})):document.createDocumentFragment(),i.length){const e=yield p(Promise.all(i));o.prepend(...e)}(0,F.Z)(c.lastMessageSpan,o)}if(t||f){const e=f?Math.max(f.date,t.date||0):t.date;(0,F.Z)(c.lastTimeSpan,(0,w.zM)(new Date(1e3*e)))}else c.lastTimeSpan.textContent="";if(null!==o&&!o){c.listEl.dataset.mid=""+t.mid;const e=t.reply_to;(null===(l=null==e?void 0:e.pFlags)||void 0===l?void 0:l.forum_topic)&&(c.listEl.dataset.threadId=""+(0,$e.Z)(t))}u.resolve()}))}setUnreadMessagesN(e){return this.setUnreadMessages(e).catch((()=>{}))}setUnreadMessages({dialog:e,dialogElement:t,isBatch:i=!1,setLastMessagePromise:s}){var a;return tt(this,void 0,void 0,(function*(){const{dom:o}=t;if(!o)return;const r="forumTopic"===e._,{deferred:d,middleware:l}=st(o,"setUnreadMessagePromise"),{peerId:c}=e,h=Promise.all([this.managers.appNotificationsManager.isPeerLocalMuted({peerId:c,respectType:!0,threadId:r?e.id:void 0}),"draftMessage"!==(null===(a=e.draft)||void 0===a?void 0:a._)?this.managers.appMessagesManager.getMessageByPeer(c,e.top_message):void 0,r?!!e.pFlags.pinned:this.managers.dialogsStorage.isDialogPinned(c,this.filterId),this.managers.appMessagesManager.isDialogUnread(e),c.isAnyChat()&&!r?this.managers.acknowledged.dialogsStorage.getForumUnreadCount(c).then((i=>i.cached?i.result:(i.result.then((()=>{this.setUnreadMessagesN({dialog:e,dialogElement:t})})),{count:0,hasUnmuted:!1}))).catch((()=>{})):void 0]);let[u,f,m,g,v]=yield l(h);const b=o.listEl.classList.contains("is-muted"),{count:y,hasUnmuted:w}=v||{};let S;f&&f.pFlags.out&&f.peerId!==n.Z.myId&&(S=f);const C=null!=y?y:e.unread_count;void 0!==y&&(g=!!C),r&&!g&&(g=!(0,et.Z)(e.read_inbox_max_id));const L=m||g,E=this.xd!==this.xds[p.Zi]&&!r&&!!this.forumTab&&this.xd.getDialogElement(c)===t&&g;if(s)try{yield l(s)}catch(e){return}const M=i?0:250;o.listEl.classList.toggle("no-unmuted-topic",!u&&void 0!==w&&!w),u!==b&&(0,I.Z)({element:o.listEl,className:"is-muted",forwards:u,duration:M}),function(e,t,i){let s;if("string"==typeof t?s=t:(null==t?void 0:t.pFlags.out)&&(s=t.error?"sendingerror":t.pFlags.is_outgoing?"sending":t.pFlags.unread?"check":"checks"),!s)return void(e.textContent="");const n="tgico-"+s,a=e.lastElementChild;if(a&&a.classList.contains(n))return;const o=document.createElement("i");o.classList.add("sending-status-icon",n),e.append(o),a&&a.remove()}(o.statusSpan,r&&e.pFlags.closed?"premium_lock":S);const P=!!o.unreadBadge;L&&t.createUnreadBadge();const Z=!!o.unreadAvatarBadge;E&&t.createUnreadAvatarBadge();const T=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),k=!!o.mentionsBadge;if(T&&t.createMentionsBadge(),[["unreadBadge",L,P],["unreadAvatarBadge",E,Z],["mentionsBadge",T,k]].forEach((([e,s,n])=>{o[e]&&t.toggleBadgeByKey(e,s,n,i)})),!L)return void d.resolve();m?o.unreadBadge.classList.add("tgico-chatspinned","tgico"):o.unreadBadge&&o.unreadBadge.classList.remove("tgico-chatspinned","tgico");let x,A=!0,_=!1;if(e.unread_mentions_count&&1===C?(x="@",_=!0):g?x=""+(C?(0,qe.Z)(C,1):" "):(x="",A=!1),r){const e=g&&" "===x;o.unreadBadge.classList.toggle("not-visited",e)}[[o.unreadBadge,x],[o.unreadAvatarBadge,x||void 0]].filter(Boolean).forEach((([e,t])=>{void 0!==t&&(e.innerText=x),e.classList.toggle("unread",A),e.classList.toggle("mention",_)})),d.resolve()}))}getDialog(e,t){return tt(this,void 0,void 0,(function*(){if("object"!=typeof e){let i;if(t){if(i=yield this.managers.dialogsStorage.getForumTopic(e,t),!i)return{peerId:e||p.NM,pFlags:{}}}else if(i=yield this.managers.appMessagesManager.getDialogOnly(e),!i){const t=e||p.NM;return{peerId:t,peer:yield this.managers.appPeersManager.getOutputPeer(t),pFlags:{}}}return i}return e}))}addListDialog(e){var t;e.autonomous=!1;const i=this.addDialogNew(e);if(i){const{peerId:s}=e,a=this.getDialog(s,e.threadId).then((t=>{const a=[],o=s.isUser();return o||"dialog"!==t._||a.push(this.xd.processDialogForCallStatus(s,i.dom)),s!==n.Z.myId&&o&&a.push(this.managers.appUsersManager.getUserStatus(s.toUserId()).then((e=>{"userStatusOnline"===(null==e?void 0:e._)&&this.xd.setOnlineStatus(i.dom.avatarEl,!0)}))),a.push(this.setLastMessageN({dialog:t,dialogElement:i,isBatch:e.isBatch,setUnread:!0})),Promise.all(a)}));null===(t=e.loadPromises)||void 0===t||t.push(a)}return i}addDialogAndSetLastMessage(e){const{peerId:t,message:i,query:s}=e,n=this.addDialogNew(Object.assign(Object.assign(Object.assign({},e),(0,ye.Z)(i)),{peerId:t}));return this.setLastMessageN({dialog:{_:"dialog",peerId:t},lastMessage:i,dialogElement:n,highlightWord:s}),i.peerId!==t&&(n.dom.listEl.dataset.peerId=""+i.peerId),n}addDialogNew(e){const t=new at(Object.assign({autonomous:!!e.container,avatarSize:"bigger"},e));if(e.container){const i=e.append?"prepend":"append";e.container[i](t.container)}return t}}const ut=new ht;M.GO.appDialogsManager=ut;const pt=ut},2312:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(3725),n=i(2202),a=i(3512),o=i(410),r=i(319),d=i(1243),l=i(7086),c=i(1655),h=i(5471),u=i(8801),p=i(6658),f=i(7667),m=i(3855);const g=new class{constructor(){this.downloads={},this.progress={}}construct(e){this.managers=e,a.Z.addEventListener("download_progress",(e=>{var t;const i=this.downloads[e.fileName];(null===(t=null==i?void 0:i.main)||void 0===t?void 0:t.notifyAll)&&(this.progress[e.fileName]=e,i.main.notifyAll(e))}))}getNewDeferred(e,t){const i=(0,s.Z)();let n=this.downloads[e];if(n){const e=n.main;["cancel","addNotifyListener","notify","notifyAll"].forEach((t=>{e[t]&&(i[t]=e[t].bind(e))}))}else n=this.downloads[e]={main:i},i.cancel=()=>{const t=(0,h.Z)("DOWNLOAD_CANCELED");this.managers.apiFileManager.cancelDownload(e),i.reject(t),i.cancel=r.Z},i.catch((()=>{this.clearDownload(e,t)})).finally((()=>{delete this.progress[e]}));return"disc"===t&&i.catch(r.Z).finally((()=>{this.clearDownload(e,t)})),n[t]=i}getNewDeferredForUpload(e,t){const i=this.getNewDeferred(e);return t.then(i.resolve,i.reject),i.finally((()=>{this.clearDownload(e)})),i}clearDownload(e,t){const i=this.downloads[e];if(!i)return;delete i[t];const s=Object.keys(i).length;(!s||i.main&&1===s)&&delete this.downloads[e]}getUpload(e){let t=this.getDownload(e);return t||(t=this.getNewDeferred(e),this.managers.appMessagesManager.getUploadPromise(e).then(t.resolve,t.reject),t)}d(e,t,i){let s=this.getDownload(e,i);return s||(s=this.getNewDeferred(e,i),t().then(s.resolve,s.reject),s)}download(e){const t=(0,l.Z)(e);return this.d(t,(()=>this.managers.apiFileManager.download(e)),"blob")}downloadMedia(e,t="blob",i){const{downloadOptions:s,fileName:n}=(0,d.Z)(e);return this.d(n,(()=>{let s;return s="url"===t?this.managers.apiFileManager.downloadMediaURL:"void"===t?this.managers.apiFileManager.downloadMediaVoid:this.managers.apiFileManager.downloadMedia,i?i.then((()=>s(e))):s(e)}),t)}downloadMediaURL(e){return this.downloadMedia(e,"url")}downloadMediaVoid(e){return this.downloadMedia(e,"void")}upload(e,t,i){return t||(t=(0,n.Z)(e)),i||(i=this.managers.apiFileManager.upload({file:e,fileName:t})),this.getNewDeferredForUpload(t,i)}getDownload(e,t){const i=this.downloads[e];return i&&i[t]}downloadToDisc(e,t){const i=e.media,s="document"===i._;s||e.thumb||(e.thumb=i.sizes.slice().pop());const n=""+(2147483647*Math.random()|0),a=`download/${n}`;e.downloadId=n;const o=m.Z.pingServiceWorkerWithIframe(),d=this.downloadMedia(e,"disc",o);if(t)return d;const l=document.createElement("iframe");l.hidden=!0,o.then((()=>{l.src=a,document.body.append(l)}));let h,g=!1;const v=()=>{g||(g=!0,h=l,(0,c.Z)(d.listeners,v))};return d.addNotifyListener(v),d.then((t=>{if(!t)return;const n=URL.createObjectURL(t),a=s?(0,p.Z)(i):(0,f.Z)(i,e.thumb),o=e.media.file_name||(0,u.P)(a.location);!function(e,t,i){const s=document.createElement("a");s.href=e,s.download=t,s.target="_blank",s.style.position="absolute",s.style.top="1px",s.style.left="1px",document.body.append(s);try{const e=document.createEvent("MouseEvents");e.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),s.dispatchEvent(e)}catch(t){console.error("Download click error",t);try{s.click()}catch(t){window.open(e,"_blank")}}setTimeout((()=>{s.remove(),i&&i()}),100)}(n,a.fileName||o,(()=>{URL.revokeObjectURL(n)}))})).catch(r.Z).finally((()=>{g||v(),setTimeout((()=>{null==h||h.remove()}),1e3)})),d}};o.GO&&(o.GO.appDownloadManager=g);const v=g},4271:(e,t,i)=>{"use strict";i.d(t,{oo:()=>Qr,ZP:()=>td});var s=i(5814),n=i(744),a=i(4332),o=i(4755),r=i(5003),d=i(3512),l=i(3241),c=i(5432),h=i(1655),u=i(6519),p=i(4484),f=i(9331),m=i(1507),g=i(7625);function v(e,t){const i=[],s=[];for(let n=0,a=e.length;n{this.mountItem(e,s-1-i,t)})),e&&this.updateClassNames(),this.onItemMount()}mountItem(e,t=this.items.indexOf(e),i=this.offset){e.mounted||((0,p.Z)(e.bubble,this.container,i+t),e.mounted=!0)}unmountItem(e){e.mounted&&(e.bubble.remove(),e.mounted=!1,this.onItemUnmount())}onItemMount(){if(this.mounted)return;const e=this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp/1e3),t=this.groups.groups.filter((e=>e.dateTimestamp===this.dateTimestamp)),i=t.length,s=t.indexOf(this),n=t.slice(s+1).reduce(((e,t)=>e+(t.mounted?0:1)),0);(0,p.Z)(this.container,e.container,Ls+i-1-s-n),this.mounted=!0}onItemUnmount(){this.mounted&&(this.items.length?this.updateClassNames():(this.container.remove(),this.chat.bubbles.deleteEmptyDateGroups(),this.mounted=!1))}}class w{constructor(e){this.chat=e,this.itemsArr=[],this.itemsMap=new Map,this.groups=[],this.newGroupDiff=121,this.sortItemsKey="scheduled"===e.type?"timestamp":"mid",this.sortGroupsKey="scheduled"===e.type?"lastTimestamp":"lastMid",this.sortGroupItemsKey="groupMid"}removeItem(e){var t;null===(t=e.group)||void 0===t||t.removeItem(e),this.removeItemFromCache(e)}removeAndUnmountBubble(e){const t=this.getItemByBubble(e);if(!t)return e.parentElement&&e.remove(),!1;const i=this.itemsArr,s=i.indexOf(t),n=this.getSiblingsAtIndex(s,i),a=t.group;this.removeItem(t);const o=new Set;a&&(a.unmountItem(t),o.add(a));const[r,d]=n;if(r&&d&&this.canItemsBeGrouped(r,d)&&r.group!==d.group){const e=d.group;this.f(d.group.items),e.onItemUnmount(),o.add(r.group),this.groupUngrouped()}return this.mountUnmountGroups(Array.from(o)),!0}mountUnmountGroups(e){const[t,i]=v(e,(e=>!!e.items.length));i.forEach((e=>{e.onItemUnmount()})),t.forEach((e=>{e.mount(!0)}))}f(e,t=0,i=e.length){for(;ts.add(e)))}}return s}cleanup(){this.itemsArr=[],this.groups=[],this.itemsMap.clear()}}var S=i(1168),C=i(2738),L=i(2325),E=i(503);class I extends S.Z{constructor(e,t,i={}){if(super("popup-date-picker",Object.assign({body:!0,overlayClosable:!0,buttons:i.noButtons?[]:[{langKey:"JumpToDate",callback:()=>{this.onPick&&this.onPick(this.selectedDate.getTime()/1e3|0)}},{langKey:"Cancel",isCancel:!0}],title:!0},i)),this.onPick=t,this.options=i,this.onPrevClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()-1),this.setMonth(),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.nextBtn.removeAttribute("disabled")},this.onNextClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()+1),this.setMonth(),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),this.prevBtn.removeAttribute("disabled")},this.onDateClick=e=>{const t=e.target;if(!t.dataset.timestamp)return;if(this.selectedEl){if(this.selectedEl===t)return;this.selectedEl.classList.remove("active")}this.selectedEl=t,t.classList.add("active");const i=+t.dataset.timestamp;this.selectedDate=new Date(i),this.setTitle(),this.setTimeTitle()},this.minDate=i.minDate||new Date("2013-08-01T00:00:00"),e{const n=""+e;this.listenerSetter.add(t.input)("input",(a=>{let o=t.value.replace(/\D/g,"");o.length>2?o=o.slice(0,2):(1===o.length&&+o[0]>+n[0]||2===o.length&&+o>e)&&(2===o.length&&s&&s(+o[1]),o="0"+o[0]),t.setValueSilently(o),i(o.length)}))};this.hoursInputField=new E.ZP({plainText:!0}),this.minutesInputField=new E.ZP({plainText:!0}),i(23,this.hoursInputField,(e=>{2===e&&this.minutesInputField.input.focus(),this.setTimeTitle()}),(e=>{this.minutesInputField.value=(e+this.minutesInputField.value).slice(0,2)})),i(59,this.minutesInputField,(e=>{e||this.hoursInputField.input.focus(),this.setTimeTitle()})),this.selectedDate=e,e.setMinutes(e.getMinutes()+10),this.hoursInputField.setValueSilently(("0"+e.getHours()).slice(-2)),this.minutesInputField.setValueSilently(("0"+e.getMinutes()).slice(-2)),e.setHours(0,0,0,0),this.timeDiv.append(this.hoursInputField.container,t,this.minutesInputField.container),(0,C.fc)(this.btnConfirm,(()=>{this.onPick&&(this.selectedDate.setHours(+this.hoursInputField.value||0,+this.minutesInputField.value||0,0,0),this.onPick(this.selectedDate.getTime()/1e3|0)),this.hide()}),{listenerSetter:this.listenerSetter}),this.body.append(this.timeDiv),this.prevBtn.classList.add("primary"),this.nextBtn.classList.add("primary")}const s=document.createElement("div");s.classList.add("popup-centerer"),s.append(this.container),this.element.append(s),e.setHours(0,0,0,0),this.selectedDate=e,this.maxDate=i.maxDate||new Date,this.maxDate.setHours(0,0,0,0),this.selectedMonth=new Date(this.selectedDate),this.selectedMonth.setDate(1),this.maxMonth=new Date(this.maxDate),this.maxMonth.setDate(1),this.minMonth=new Date(this.minDate),this.minMonth.setHours(0,0,0,0),this.minMonth.setDate(1),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),i.noTitle&&(this.setTitle=()=>{}),this.setTimeTitle(),this.setTitle(),this.setMonth()}setTimeTitle(){if(this.btnConfirm&&this.selectedDate){let e;const t=[],i=new Date;i.setHours(0,0,0,0);const s={minute:"2-digit",hour:"2-digit"},n=new Date(this.selectedDate.getTime());if(n.setHours(+this.hoursInputField.value,+this.minutesInputField.value),this.selectedDate.getTime()===i.getTime())e="Schedule.SendToday";else{e="Schedule.SendDate";const s={month:"short",day:"numeric"};n.getFullYear()!==i.getFullYear()&&(s.year="numeric"),t.push(new L.ZP.IntlDateElement({date:n,options:s}).element)}t.push(new L.ZP.IntlDateElement({date:n,options:s}).element),this.btnConfirm.firstChild.replaceWith((0,L.ag)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new L.ZP.IntlDateElement({date:this.selectedDate,options:{day:"numeric",month:"long",weekday:"short"}}).element)}renderElement(e,t=""){const i=document.createElement("button");return i.classList.add("btn-icon","date-picker-month-date"),e&&i.setAttribute("disabled","true"),t&&i.append(t),i}setMonth(){const e=new Date(this.selectedMonth),t={year:"numeric",month:this.timeDiv&&o.Z.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new L.ZP.IntlDateElement({date:e,options:t}).element),this.month&&this.month.remove(),this.month=document.createElement("div"),this.month.classList.add("date-picker-month");const i=new Date,s=i.getDay();1!==s&&i.setHours(-24*(s-1));for(let e=0;e<7;++e){const e=this.renderElement(!0,new L.ZP.IntlDateElement({date:i,options:{weekday:"narrow"}}).element);e.classList.remove("date-picker-month-date"),e.classList.add("date-picker-month-day"),this.month.append(e),i.setDate(i.getDate()+1)}let n=e.getDay()-1;-1===n&&(n=6);const a=new Date(e.getTime());a.setDate(a.getDate()-n-1);for(let e=0;ethis.maxDate||e{f&&!f()||(p.forEach((e=>e.remove())),o&&o.classList.toggle("is-round",u))})),h}))}class X extends G{constructor(e,t){super(e,((e,i="",s)=>q(this,void 0,void 0,(function*(){this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const n=yield Y({title:e,titleEl:this.title,subtitle:i,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:s,animationGroup:t});this.container.classList.toggle("is-media",n),n?this.content.prepend(this.mediaEl):this.mediaEl.remove()})))),this.className=e,this.animationGroup=t}}function J(e,t,i,s,n){const a=new X("reply",i),o=a.fill(e,t,s);if(n){const e=(0,U.Z)(n,!1),[t,i,s]=(0,O.oo)(e);a.container.style.setProperty("--override-color",`${t}, ${i}, ${s}`),a.container.classList.add("is-overriding-color")}return{container:a.container,fillPromise:o}}const ee="stacked-avatars",te=ee+"-avatar",ie=te+"-container";class se{constructor(e){this.lazyLoadQueue=e.lazyLoadQueue,this.avatarSize=e.avatarSize,this.container=document.createElement("div"),this.container.classList.add(ee),this.container.style.setProperty("--avatar-size",e.avatarSize+"px")}render(e,t){const i=this.container.children;(e=e.slice().reverse()).length>3&&(e=e.slice(-3)),e.forEach(((e,s)=>{let n=i[s];n||(n=document.createElement("div"),n.classList.add(ie));let a=n.firstElementChild;a||(a=new f.Z,a.classList.add("avatar-"+this.avatarSize,te),a.updateOptions({isDialog:!1,loadPromises:t})),a.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e}),a.parentNode||n.append(a),n.parentNode||this.container.append(n)})),Array.from(i).slice(e.length).forEach((e=>e.remove()))}}const ne="replies-element";d.Z.addEventListener("replies_updated",(e=>{Array.from(document.querySelectorAll(ne+`[data-post-key="${e.peerId}_${e.mid}"]`)).forEach((t=>{t.message=e,t.render()}))}));class ae extends HTMLElement{constructor(){super(),this.updated=!1,this.managers=d.Z.managers}init(){this.render(),this.dataset.postKey=this.message.peerId+"_"+this.message.mid,this.classList.add("replies","replies-"+this.type)}render(){const e=this.message.replies;if("footer"===this.type){let t;this.firstElementChild&&(t=this.firstElementChild),(null==e?void 0:e.recent_repliers)?(t&&!t.classList.contains("replies-footer-avatars")&&(this.innerHTML="",t=null),this.stackedAvatars||(this.stackedAvatars=new se({lazyLoadQueue:this.lazyLoadQueue,avatarSize:30}),this.stackedAvatars.container.classList.add("replies-footer-avatars")),t=this.stackedAvatars.container,this.stackedAvatars.render(e.recent_repliers.map((e=>(0,R.Z)(e))),this.loadPromises)):(t&&!t.classList.contains("tgico-comments")&&(t.remove(),t=null),t||(t=document.createElement("span"),t.classList.add("tgico-comments"))),t.parentElement||this.prepend(t),this.text||(this.text=new L.ZP.IntlElement);const i=this.text;if(e?e.replies?i.compareAndUpdate({key:"Comments",args:[e.replies]}):i.compareAndUpdate({key:"LeaveAComment"}):i.compareAndUpdate({key:"ViewInChat"}),e){let t=!1;e.replies&&void 0!==e.read_max_id&&void 0!==e.max_id&&(t=e.read_max_id${(null==e?void 0:e.replies)?(0,D.Z)(e.replies,0):""}`;!e||this.updated||this.message.pFlags.is_outgoing||(this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId,this.message.mid),this.managers.appMessagesManager.updateMessage(this.message.peerId,this.message.mid,"replies_updated"),this.updated=!0),this.loadPromises&&(this.loadPromises=void 0)}}customElements.define(ne,ae);const oe=()=>{const e=document.createElement("i");return e.classList.add("edited"),(0,L.$d)(e,"EditedMessage"),e},re=()=>(0,L.ag)("SponsoredMessage");var de;!function(e){e.setTime=e=>{var t;const{chatType:i,message:s}=e,n=new Date(1e3*s.date),a=[];let o,r;const d=!!s.pFlags.sponsored,l=!("action"in s)&&!d,c=d?void 0:(0,_.mr)(n);if(l){if(s.views){const e=s.post_author||(null===(t=s.fwd_from)||void 0===t?void 0:t.post_author),i=document.createElement("span");i.classList.add("post-views"),i.innerHTML=(0,D.Z)(s.views,1);const n=document.createElement("i");if(n.classList.add("tgico-channelviews","time-icon"),a.push(i,n),e){const t=document.createElement("span");(0,F.Z)(t,(0,B.Z)(e)),t.insertAdjacentHTML("beforeend",", "),a.push(t)}}if(s.edit_date&&"scheduled"!==i&&!s.pFlags.edit_hide&&a.unshift(o=oe()),"pinned"!==i&&s.pFlags.pinned){const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),a.unshift(e)}}else d&&a.push(r=re());c&&a.push(c);let h=d?void 0:(0,_.xE)(n);l&&(h+=(s.edit_date&&!s.pFlags.edit_hide?`\nEdited: ${(0,_.xE)(new Date(1e3*s.edit_date))}`:"")+(s.fwd_from?`\nOriginal: ${(0,_.xE)(new Date(1e3*s.fwd_from.date))}`:""));const u=document.createElement("span");u.classList.add("time","tgico"),u.append(...a);const p=document.createElement("div");p.classList.add("inner","tgico"),h&&(p.title=h);let f=a;return o&&(f[f.indexOf(o)]=oe()),r&&(f[f.indexOf(r)]=re()),f=f.map((e=>e instanceof HTMLElement&&!e.classList.contains("i18n")&&!e.classList.contains("reactions")?e.cloneNode(!0):e)),c&&(f[f.length-1]=(0,_.mr)(n)),p.append(...f),u.append(p),u},e.renderReplies=({bubble:e,bubbleContainer:t,message:i,messageDiv:s,loadPromises:n,lazyLoadQueue:a})=>{const o=!e.classList.contains("sticker")&&!e.classList.contains("emoji-big")&&!e.classList.contains("round"),r=new ae;return r.message=i,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},e.setReply=({chat:e,bubble:t,bubbleContainer:i,message:s})=>{return n=this,a=void 0,r=function*(){const n=!i;n&&(i=t.querySelector(".bubble-content"));const a=n?i.querySelector(".reply"):null;if(!s.reply_to_mid)return null==a||a.remove(),void t.classList.remove("is-reply");const o=s.reply_to.reply_to_peer_id?(0,R.Z)(s.reply_to.reply_to_peer_id):e.peerId,r=yield d.Z.managers.appMessagesManager.getMessageByPeer(o,s.reply_to_mid);let l,c;if(r){const e=r.fwdFromId;c=s.fwdFromId&&s.fwdFromId===e?s.fwdFromId:r.fromId||e,l=new N.Z({peerId:c,dialog:!1,onlyFirstName:!1,plainText:!1}).element}else d.Z.managers.appMessagesManager.fetchMessageReplyTo(s),e.bubbles.needUpdate.push({replyToPeerId:o,replyMid:s.reply_to_mid,mid:s.mid}),l=(0,L.ag)("Loading");const{container:h,fillPromise:u}=J(l,void 0,e.animationGroup,r,e.isAnyGroup?c:void 0);return yield u,a?(a.classList.contains("floating-part")&&h.classList.add("floating-part"),a.replaceWith(h)):i.append(h),t.classList.add("is-reply"),h},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r}}(de||(de={}));var le=i(2153),ce=i(3699),he=i(8448),ue=i(4789),pe=i(8594),fe=i(3035),me=i(3725),ge=i(410),ve=i(252),be=i(8497),ye=i(4668),we=i(2796);function Se(e,t,i){const s=e.getBoundingClientRect(),n="center"===i?Math.ceil(s.left+(s.right-s.left)/2+1):Math.ceil(s.left+1),a="bottom"===t?Math.floor(s.top+s.height-1):Math.ceil(s.top+1);return document.elementFromPoint(n,a)}ge.GO.getElementByPoint=Se;var Ce=i(3624),Le=i(3910),Ee=i(5705);function Ie(e){e.style.display="none",e.offsetLeft,e.style.display=""}var Me=i(2648),Pe=i(5296),Ze=i(8938),Te=i(5701);const ke=2147483646;var xe,Ae=i(241),_e=i(6272),Fe=i(1784),De=i(9099),Re=i(2416),Be=i(8763),Ne=i(5975),Oe=i(8939),Ue=i(993),He=i(4494),ze=i(8204),je=i(2575),Ge=i(9931);class Ve extends S.Z{constructor(e,t){super("popup-join-chat-invite",{closable:!0,overlayClosable:!0,body:!0,buttons:(0,S.x)([{langKey:t.pFlags.request_needed?"RequestJoin.Button":t.pFlags.broadcast?"JoinByPeekChannelTitle":"JoinByPeekGroupTitle",callback:()=>{this.managers.appChatsManager.importChatInvite(e).then((e=>{const t=e.toPeerId(!0);td.setInnerPeer({peerId:t})}),(e=>{"INVITE_REQUEST_SENT"===e.type&&(0,we.bC)({langPackKey:"RequestToJoinSent"})}))}}])}),this.hash=e,this.chatInvite=t,this.construct()}construct(){return e=this,t=void 0,s=function*(){this.header.remove();const{chatInvite:e,managers:t,hash:i}=this,s=new f.Z;s.classList.add("avatar-100"),s.isDialog=!1,"photo"===e.photo._?(e.photo=yield t.appPhotosManager.savePhoto(e.photo),(0,K.Z)({container:s,message:null,photo:e.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):(0,Ge.Z)({div:s,peerId:m.NM,isDialog:!1,title:e.title});const n=document.createElement("div");n.classList.add("chat-title"),(0,F.Z)(n,(0,B.Z)(e.title));const a=e.pFlags.broadcast,o=(0,L.ag)(a?"Subscribers":"Members",[(0,je.Z)(e.participants_count)]);if(o.classList.add("chat-participants-count"),this.body.append(s,n,o),e.pFlags.request_needed){const e=document.createElement("div");(0,L.$d)(e,a?"RequestToJoinChannelDescription":"RequestToJoinGroupDescription"),e.classList.add("chat-participants-count","request-caption"),this.body.append(e)}this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}!function(e){e[e.MESSAGE=0]="MESSAGE",e[e.PRIVATE_POST=1]="PRIVATE_POST",e[e.STICKER_SET=2]="STICKER_SET",e[e.JOIN_CHAT=3]="JOIN_CHAT",e[e.VOICE_CHAT=4]="VOICE_CHAT",e[e.USER_PHONE_NUMBER=5]="USER_PHONE_NUMBER",e[e.INVOICE=6]="INVOICE",e[e.EMOJI_SET=7]="EMOJI_SET"}(xe||(xe={}));var Ke=i(5285),We=i(6654),$e=i(9083),qe=i(6775),Qe=i(9405),Ye=i(319);const Xe="reaction",Je=Xe+"-element";class et extends HTMLElement{constructor(){super(),this.classList.add(Xe),this.managers=d.Z.managers}get reactionCount(){return this._reactionCount}set reactionCount(e){this._reactionCount=e}get count(){return this.reactionCount.count}init(e,t){this.type=e,this.classList.add(Xe+"-"+e),this.middleware=t}setCanRenderAvatars(e){this.canRenderAvatars=e}render(e){const t=!!this.stickerContainer;t||(this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add(Xe+"-sticker"),this.append(this.stickerContainer));const i=this.reactionCount;if(!e&&!t){const e=i.reaction;if("reactionEmoji"===e._){const t=this.managers.appReactionsManager.getReaction(e.emoticon);(0,We.Z)(t,(e=>{var t;e.center_icon||this.stickerContainer.classList.add("is-static"),e.pFlags.inactive&&this.classList.add("is-inactive"),this.renderDoc(null!==(t=e.center_icon)&&void 0!==t?t:e.static_icon)}))}else if("reactionCustomEmoji"===e._){this.stickerContainer.classList.add("is-custom");const t=(0,$e.Z)({docIds:[e.document_id],customEmojiSize:(0,Qe.C)(22,22)});this.stickerContainer.append(t)}}}renderDoc(e){const t="inline"===this.type?14:22,i=this.wrapStickerPromise=(0,W.ZP)({div:this.stickerContainer,doc:e,width:t,height:t,static:!0,managers:this.managers,middleware:this.middleware}).then((({render:e})=>e)).finally((()=>{this.wrapStickerPromise===i&&(this.wrapStickerPromise=void 0)}))}renderCounter(){var e;const t=this.reactionCount,i="inline"===this.type?2:4;if(t.count>=i||"block"===this.type&&!this.canRenderAvatars){this.counter||(this.counter=document.createElement("inline"===this.type?"i":"span"),this.counter.classList.add(Xe+"-counter"));const e=(0,D.Z)(t.count);this.counter.textContent!==e&&(this.counter.textContent=e),this.counter.parentElement||this.append(this.counter)}else(null===(e=this.counter)||void 0===e?void 0:e.parentElement)&&(this.counter.remove(),this.counter=void 0)}renderAvatars(e){"inline"!==this.type&&(this.reactionCount.count>=4||!this.canRenderAvatars?this.stackedAvatars&&(this.stackedAvatars.container.remove(),this.stackedAvatars=void 0):(this.stackedAvatars||(this.stackedAvatars=new se({avatarSize:24}),this.append(this.stackedAvatars.container)),this.stackedAvatars.render(e.map((e=>(0,R.Z)(e.peer_id))))))}setIsChosen(e=void 0!==this.reactionCount.chosen_order){"inline"!==this.type&&(this.classList.contains("is-chosen")&&!this.classList.contains("backwards"))!==e&&(0,De.Z)({element:this,className:"is-chosen",forwards:e,duration:this.isConnected?300:0})}fireAroundAnimation(){const e=this.reactionCount.reaction;"reactionEmoji"===e._&&(0,We.Z)(this.managers.appReactionsManager.getReaction(e.emoticon),(e=>{const t="inline"===this.type?28:40,i=document.createElement("div");i.classList.add(Xe+"-sticker-activate"),Promise.all([(0,W.ZP)({div:i,doc:e.center_icon,width:t,height:t,withThumb:!1,needUpscale:!0,play:!1,skipRatio:1,group:"none",needFadeIn:!1,managers:this.managers,middleware:this.middleware}).then((({render:e})=>e)),(0,qe.Z)({doc:e.around_animation,size:80,target:this.stickerContainer,side:"center",skipRatio:1,play:!1,managers:this.managers,middleware:this.middleware}).stickerPromise.catch(Ye.Z)]).then((([e,t])=>{const s=()=>{e.remove(),i.remove(),this.stickerContainer.classList.remove("has-animation")};if(!t)return void s();const n=()=>{(0,fe.T2)(s)};e.addEventListener("enterFrame",(t=>{t===e.maxFrame&&(this.wrapStickerPromise?this.wrapStickerPromise.then((()=>{setTimeout(n,1e3)})):n())})),e.addEventListener("firstFrame",(()=>{this.stickerContainer.append(i),this.stickerContainer.classList.add("has-animation"),e.play(),t.play()}),{once:!0})}))}))}}customElements.define(Je,et);const tt="reactions",it=tt+"-element",st=new Map;class nt extends HTMLElement{constructor(){super(),this.classList.add(tt),this.sorted=[],this.middlewareHelpers=new Map,this.managers=d.Z.managers}connectedCallback(){let e=st.get(this.key);e||st.set(this.key,e=new Set),e.add(this),this.onConnectCallback&&this.isConnected&&(this.onConnectCallback(),this.onConnectCallback=void 0)}disconnectedCallback(){const e=st.get(this.key);e.delete(this),e.size||st.delete(this.key)}getReactionCount(e){return this.sorted[this.sorted.indexOf(e)].reactionCount}getMessage(){return this.message}init(e,t,i,s=this.isPlaceholder){void 0!==this.key&&this.disconnectedCallback(),this.middleware!==i&&i.onDestroy((()=>{this.middlewareHelpers.clear()})),this.message=e,this.key=this.message.peerId+"_"+this.message.mid,this.middleware=i,this.isPlaceholder=s,this.type!==t&&(this.type=t,this.classList.add(tt+"-"+t)),this.connectedCallback()}changeMessage(e){return this.init(e,this.type,this.middleware)}update(e,t){this.message=e,this.render(t)}render(e){const t=this.message.reactions,i=!(!t||!t.results.length);if(this.classList.toggle("has-no-reactions",!i),!i&&!this.sorted.length)return;this.managers.appReactionsManager.getAvailableReactions();const s=i?t.results:[];s.sort(((e,t)=>{var i,s;return t.count-e.count||(null!==(i=e.chosen_order)&&void 0!==i?i:0)-(null!==(s=t.chosen_order)&&void 0!==s?s:0)})),(0,g.Z)(this.sorted,((e,t,i)=>{const n=e.reactionCount.reaction;s.some((e=>(0,Ke.Z)(e.reaction,n)))||(this.middlewareHelpers.get(e).destroy(),this.middlewareHelpers.delete(e),i.splice(t,1),e.remove())}));const n=s.reduce(((e,t)=>e+t.count),0),a=t&&(!!t.pFlags.can_see_list||this.message.peerId.isUser())&&n<4;if(this.sorted=s.map(((e,i)=>{let s=this.sorted.find((t=>(0,Ke.Z)(t.reactionCount.reaction,e.reaction)));if(!s){const e=this.middleware.create();s=new et,s.init(this.type,e.get()),this.middlewareHelpers.set(s,e)}(0,p.Z)(s,this,i);const n=t.recent_reactions?t.recent_reactions.filter((t=>(0,Ke.Z)(t.reaction,e.reaction))):[];return s.reactionCount=Object.assign({},e),s.setCanRenderAvatars(a),s.render(this.isPlaceholder),s.renderCounter(),s.renderAvatars(n),s.setIsChosen(),s})),!this.isPlaceholder&&(null==e?void 0:e.length)&&(this.isConnected?this.handleChangedResults(e):this.onConnectCallback=()=>{this.handleChangedResults(e)}),!this.sorted.length&&"block"===this.type){const e=this.parentElement;if(this.remove(),e.classList.contains("document-message")&&!e.childNodes.length)return void e.remove();const t=this.querySelector(".time");t&&e.append(t)}}handleChangedResults(e){this.message.peerId===td.chat.peerId&&e.forEach((e=>{const t=this.sorted.find((t=>(0,Ke.Z)(t.reactionCount.reaction,e.reaction)));null==t||t.fireAroundAnimation()}))}}customElements.define(it,nt);var at=i(5418);class ot{constructor(e,t,i){this.scrollable=e,this.query=t,this.reverse=i}get container(){return this.scrollable.container}getSaved(){return{scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,clientHeight:this.clientHeight}}findElements(){if(!this.query)return[];const{container:e}=this,t=e.getBoundingClientRect(),i=Array.from(e.querySelectorAll(this.query)),s=[];for(const n of i){const i=n.getBoundingClientRect();if((0,ze.Z)(n,e,void 0,i,t))s.push({element:n,rect:i});else if(s.length)break}if(!s.length){const e=i[0];e&&s.push({element:e,rect:e.getBoundingClientRect()})}return s}replaceSaved(e,t){if(!this.elements)return;const i=this.elements.findIndex((({element:t})=>e===t));-1!==i&&(this.elements[i].element=t)}findAndSetElements(){this.elements=this.findElements()}save(){this.findAndSetElements(),this._save()}_save(){const{scrollTop:e,scrollHeight:t,clientHeight:i}=this.container;this.scrollHeight=t,this.scrollTop=e,this.clientHeight=i,this.scrollHeightMinusTop=this.reverse?t-e:e}onRestore(e){x.IS_SAFARI&&e&&Ie(this.container)}setScrollTop(e,t){this.scrollable.setScrollTopSilently(this.scrollTop=e),this.onRestore(t)}restore(e){var t;const{scrollTop:i,scrollHeight:s}=this.scrollable;if(this.scrollHeight=s,!this.elements.length)return void this._restore(e);let n;if(n=this.elements[this.elements.length-1],!(null===(t=null==n?void 0:n.element)||void 0===t?void 0:t.parentElement)&&(this.findAndSetElements(),n=this.elements[this.elements.length-1],!n))return void this._restore(e);const{element:a,rect:o}=n,r=a.getBoundingClientRect().bottom-o.bottom;this.setScrollTop(i+r,e)}_restore(e){const{scrollHeightMinusTop:t,scrollable:i}=this,s=this.scrollHeight,n=this.reverse?s-t:t;this.setScrollTop(n,e)}}ge.GO&&(ge.GO.ScrollSaver=ot);var rt=i(7401),dt=i(4881);class lt{constructor(e){this.observing=new Map,this.observingQueue=new Map,this.freezedObservingNew=!1,this.observer=new IntersectionObserver((e=>{const t=this.observing;for(let i=0,s=e.length;ie+t),t)}var At=i(8097);const _t=function(e){const t={},i={};return s=>{var n,a;const o="_"+s;return null!==(n=(a="string"==typeof s?t:i)[o])&&void 0!==n?n:a[o]=e(s)}};function Ft(e){return e.replace(/\D/g,"")}const Dt={visa:/^4/,mastercard:/^(51|52|53|54|55|222|23|24|25|26|27)/,amex:/^(34|37)/,discover:/^(60|64|65)/,diners:/^(30|38|39)/,diners14:/^(36)/,jcb:/^(35)/,unionpay:/^(62[0-6,8-9]|627[0-6,8-9]|6277[0-7,9]|62778[1-9]|81)/,elo:/^(5067|509|636368|627780)/,mir:/^(220[0-4])/},Rt={visa:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},mastercard:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},amex:{minLength:15,maxLength:15,cvcMaxLength:4,cvcMinLength:3},unionpay:{minLength:13,maxLength:19,cvcMaxLength:3,cvcMinLength:null},diners:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},diners14:{minLength:14,maxLength:14,cvcMaxLength:3,cvcMinLength:null},discover:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},jcb:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},elo:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},mir:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},unknown:{minLength:16,maxLength:16,cvcMaxLength:4,cvcMinLength:3}},Bt=_t(((e="")=>{const t=Object.keys(Dt),i=Ft(e);let s,n=0;return t.forEach((e=>{const t=Dt[e],a=i.match(t);if(a){const t=a[0];t&&t.length>n&&(s=e,n=t.length)}})),s||"unknown"}));function Nt(e=""){return"diners14"===(t=Bt(e))?"diners":t;var t}var Ot=i(2398),Ut=i(6740),Ht=i(1656),zt=i(7298),jt=i(9807),Gt=i(279),Vt=i(7479),Kt=i(7362);function Wt(e,t,i){const s=new Array(e);return s.fill(t),i?s.map(i):s}const $t="0".charCodeAt(0)-"0".charCodeAt(0),qt=/[0-9]/g;function Qt(e){return String.fromCharCode(e.charCodeAt(0)-$t)}function Yt(e){return e.replace(qt,Qt)}function Xt(e,t){return{type:"optional",result:e,consumed:t}}function Jt(e,t,i){return{type:"required",result:e,consumed:t,partial:i}}function ei(e,t){return i=>{const s=new RegExp("^".concat(e.source.replace(/^\^/,""))),n=i.match(s),a=t?Xt:Jt;if(n){const e=n[0];return a(e,n.index+e.length)}return a("",i.length)}}const ti=ei(/1[0-2]|0?[1-9]|0/),ii={digit:function(e){return ei(/[0-9]/)(Yt(e))},capitalCharacter:function(e){const t=ei(/\w/)(e);return t.result?Jt(t.result.toUpperCase(),t.consumed):t},month:e=>{const t=ti(Yt(e)),i=Ft(t.result);return["0","1"].includes(t.result)&&1===e.length||"0"===t.result&&e.length>=2?Jt(t.result,e.length,!0):Jt(1===i.length?"0"+i:i,t.consumed)},formattingCharacter:e=>t=>{const i=e===t[0]?1:0;return function(e,t){return{type:"formatting",result:e,consumed:t}}(e,i)},optionalPattern:e=>t=>{const i=ei(e,!0)(t);return i.result?i:Xt("",0)}},si=ii.digit,ni=ii.capitalCharacter,ai=ii.formattingCharacter(" "),oi=ii.optionalPattern(/\d\d/),ri=[si,si,si,si,ai,si,si,si,si,si,si,ai,si,si,si,si,si],di=[si,si,si,si,ai,si,si,si,si,si,si,ai,si,si,si,si],li=new Set(["DZ","AR","AM","AU","AT","AZ","PT","BD","BY","BE","BA","BR","BN","BG","CA","IC","CN","CO","HR","CY","CZ","DK","EC","GB","EE","FO","FI","FR","GE","DE","GR","GL","GU","GG","NL","HU","IN","ID","IL","IT","JP","JE","KZ","KR","FM","KG","LV","LI","LT","LU","MK","MG","PT","MY","MH","MQ","YT","MX","MN","ME","NL","NZ","GB","NO","PK","PH","PL","FM","PT","PR","RE","RU","SA","SF","RS","SG","SK","SI","ZA","ES","LK","SX","VI","VI","SE","CH","TW","TJ","TH","TU","TN","TR","TM","VI","UA","GB","US","UY","UZ","VA","VN","GB","FM"]),ci=_t((e=>{const t=[];for(let i=0,s=0;i[ii.month,ii.formattingCharacter("/"),si,si,oi],cardCvc:e=>hi.cardCvcFromBrand(Bt(e)),cardCvcFromBrand:_t((e=>{const t=Rt[e],{cvcMinLength:i,cvcMaxLength:s}=t,n=Wt(i||s,si);if(i&&i{switch(e){case"US":return Wt(5,si);case"CA":return x.IS_ANDROID?null:[ni,ni,ni,ai,ni,ni,ni];default:const t=Wt(10,ii.optionalPattern(/\d/));return li.has(e)&&(t[0]=si),t}}))},ui=hi;function pi(e){return xt(e.map((e=>e.length)),0)}const fi=new RegExp("‎","g");function mi(e){return e?{type:"invalid",code:e}:null}function gi(e,t={}){const{sanitized:i,minLength:s}=function(e){const t=Ft(e),i=Bt(e);return{sanitized:t,brand:i,minLength:Rt[i].minLength}}(e);return function(e,t,i){return e.length>=t?function(e){const t="0".charCodeAt(0),i=e.length%2;let s=0;for(let n=e.length-1;n>=0;--n){const a=i===n%2;let o=e.charCodeAt(n)-t;a&&(o*=2),o>9&&(o-=9),s+=o}return!(s%10)}(e)||"mir"===Bt(e)?null:mi("invalid"):i?null:mi("incomplete")}(i,s,t.ignoreIncomplete)}function vi(e,t={}){const i=e.replace(fi,"").split(/ ?\/ ?/),[s,n=""]=i,[a,o]=[s,n].map((e=>+e)),r=2===n.length?o%100:o;return n.length<2||3===n.length?t.ignoreIncomplete?null:mi("incomplete"):mi(function(e,t,i){const s=new Date(Date.now()),n=e<100?s.getFullYear()%100:s.getFullYear(),a=s.getMonth()+1;return isNaN(e)||isNaN(t)?(null==i?void 0:i.ignoreIncomplete)?null:"incomplete":e-n<0?"invalid_expiry_year_past":e-n>50?"invalid_expiry_year":!(e-n)&&t{const t=wi.get(e.source);t&&t(JSON.parse(e.data))}));class Si extends l.Z{constructor({url:e,sandbox:t}){super(!1),this.onTelegramWebViewEvent=({eventType:e,eventData:t})=>{""===t&&(t=void 0),console.log("onTelegramWebViewEvent",e,t),this.dispatchEvent(e,t)};const i=this.iframe=document.createElement("iframe");i.src=e,t&&i.setAttribute("sandbox",t)}onMount(){wi.set(this.iframe.contentWindow,this.onTelegramWebViewEvent)}destroy(){this.cleanup(),wi.delete(this.iframe.contentWindow)}}function Ci(e){const t=new Si(Object.assign(Object.assign({},e),{sandbox:"allow-forms allow-scripts allow-same-origin allow-modals"})),{iframe:i}=t;return i.allow="payment",i.classList.add("payment-verification"),t}class Li extends S.Z{constructor(e,t){super("popup-payment popup-payment-verification",{closable:!0,overlayClosable:!0,body:!0,title:"Checkout.WebConfirmation.Title"}),this.url=e,this.openPathAfter=t,this.d()}d(){const e=this.telegramWebView=Ci({url:this.url});e.addEventListener("web_app_open_tg_link",(e=>{this.dispatchEvent("finish"),this.hide(),this.openPathAfter&&td.openUrl("https://t.me"+e.path_full)})),this.body.append(e.iframe),this.show(),e.onMount()}destroy(){return this.telegramWebView.destroy(),super.destroy()}}var Ei=i(6830),Ii=i(5029);class Mi extends E.ZP{constructor(e){super(e),this.options=e,this.onKeyDown=e=>{var t,i;this.lastKeyDown=e.key,null===(i=(t=this.options).onKeyDown)||void 0===i||i.call(t,e)},this.onInput=()=>{var e,t;const i=this.value,s="Backspace"===this.lastKeyDown&&(this.lastTransformed&&this.lastTransformed.value.length||0)-i.length==1,n=this.lastTransformed=function(e){const{value:t,getPattern:i,deleting:s,input:n}=e,a=!s&&!!t.length,o=function(e,t,i={},s){const n=e(t);if(!n)return{value:t,selection:null,autocorrectComplete:!!t};const a=n.length,o=[],r=[];let d=0,l=0,c=0===i.selectionStart?0:null,h=0===i.selectionEnd?0:null;const u=e=>{e>0&&(null===c&&l+1>=i.selectionStart&&(c=pi(o)+(s?r.length:0)),null===h&&l+1>=i.selectionEnd&&(h=pi(o)+(s?r.length:0)),l+=e)};for(;d=t.length)break;r.push(a),++d,u(c)}}return s&&o.push(...r),{value:o.join(""),selection:{selectionStart:null===c||t.length&&i.selectionStart===t.length?pi(o):c,selectionEnd:null===h||t.length&&i.selectionEnd===t.length?pi(o):h},autocorrectComplete:d===a}}(i,t,{selectionStart:n?n.selectionStart:0,selectionEnd:n?n.selectionEnd:0},a),{value:r,selection:d}=o;return{value:r,meta:{autocorrectComplete:o.autocorrectComplete,empty:!r},selection:d}}({value:i,getPattern:this.options.formatMethod,deleting:s,input:this.input}),a=n.value;a!==i&&(this.setValueSilently(a),n.selection&&(this.input.selectionStart=n.selection.selectionStart,this.input.selectionEnd=n.selection.selectionEnd)),this.validateNew(a,{ignoreIncomplete:!0}),null===(t=(e=this.options).onChange)||void 0===t||t.call(e,n)},this.onBlur=()=>{var e;const t=null===(e=this.lastTransformed)||void 0===e?void 0:e.value;t&&this.validateNew(t)},this.validate=()=>this.validateNew(),this.input.addEventListener("keydown",this.onKeyDown),this.input.addEventListener("input",this.onInput),this.input.addEventListener("blur",this.onBlur)}update(){this.onInput()}validateNew(e,t,i){var s,n,a,o,r;let d;if(void 0===e&&(e=null!==(n=null===(s=this.lastTransformed)||void 0===s?void 0:s.value)&&void 0!==n?n:""),void 0===t&&(t={}),d=this.options.validateMethod?null===(o=(a=this.options).validateMethod)||void 0===o?void 0:o.call(a,e,t):function(e,t,i={}){return e.meta.autocorrectComplete||i.ignoreIncomplete?null:mi("incomplete")}(this.lastTransformed,0,t),null==d?void 0:d.code){const e=null===(r=this.options.errorKeys)||void 0===r?void 0:r[d.code];return!i&&this.setState(E.I1.Error,e),!1}return!i&&this.setState(E.I1.Neutral),!0}}function Pi(e,t){const i=()=>{const i=e.every((e=>"validateNew"in e?e.validateNew(void 0,void 0,!0):e.isValid()));t(i)};return e.forEach((e=>{if(e instanceof Mi){const t=e.options.onChange;e.options.onChange=(...e)=>{null==t||t(...e),i()},"update"in e&&e.update()}else e.input.addEventListener("input",i)})),{validate:i}}function Zi(e,t){let i,s;return(e||t)&&(e&&(i=new yi.Z({noPhoneCodes:!0,onCountryChange:()=>{null==s||s.update()},required:!0,autocomplete:"country"})),t&&(s=new Mi({label:"PaymentShippingZipPlaceholder",plainText:!0,inputMode:"numeric",autocomplete:"postal-code",formatMethod:()=>{const{country:e}=i.getSelected(),t=null==e?void 0:e.iso2;return ui.postalCodeFromCountry(t&&t.toUpperCase())}}))),{countryInputField:i,postcodeInputField:s}}const Ti=new Set(["stripe","smartglocal"]);class ki extends S.Z{constructor(e,t){if(super("popup-payment popup-payment-card",{closable:!0,overlayClosable:!0,body:!0,scrollable:Ti.has(e.native_provider),title:"PaymentCardInfo"}),this.paymentForm=e,this.savedCard=t,Ti.has(e.native_provider))this.d();else{const t=this.telegramWebView=Ci({url:e.url});t.addEventListener("payment_form_submit",(t=>{const i={title:t.title,save:!1};this.dispatchEvent("finish",{token:t.credentials,card:i}),this.hide(),e.pFlags.can_save_credentials&&(0,bi.Z)({titleLangKey:"PaymentCardSavePaymentInformation",descriptionLangKey:"PaymentCardSavePaymentInformationInfoLine1",button:{langKey:"Save"}}).then((()=>{i.save=!0}),Ye.Z)})),this.body.append(t.iframe),this.show(),t.onMount()}}destroy(){var e;return null===(e=this.telegramWebView)||void 0===e||e.destroy(),super.destroy()}d(){const e=this.savedCard,t=new Ii.Z({name:"PaymentInfo.Card.Title",noDelimiter:!0,noShadow:!0}),i=JSON.parse(this.paymentForm.native_params.data);let s,n,a=0;const o=new Mi({label:"PaymentCardNumber",plainText:!0,inputMode:"numeric",autocomplete:"cc-number",formatMethod:ui.cardNumber,validateMethod:gi,errorKeys:{invalid:"PaymentCard.Error.Invalid",incomplete:"PaymentCard.Error.Incomplete"},onChange:e=>{(e=>{if(s===e)return;const t=++a;s=e;const i=Oi(e);if(!i)return void(n&&(n.remove(),n=void 0));const r=new Image;r.classList.add("input-field-icon"),(0,Ut.cj)(r,i,!1).then((()=>{a===t&&(n?n.replaceWith(r):o.container.append(r),n=r)}))})(Nt(e.value)),l.update()}});let r;i.need_cardholder_name&&(r=new E.ZP({label:"Checkout.NewCard.CardholderNamePlaceholder",maxLength:255,required:!0,autocomplete:"cc-name"}));const d=new Mi({label:"SecureId.Identity.Placeholder.ExpiryDate",plainText:!0,inputMode:"numeric",autocomplete:"cc-exp",formatMethod:ui.cardExpiry,validateMethod:vi});d.input.addEventListener("input",(()=>{let e=d.value;if(e.length<5)return;const t=e.split("/");4===t[1].length&&(e=[t[0],t[1].slice(2)].join("/"),d.setValueSilently(e))}),{capture:!0});const l=new Mi({labelText:"CVC",plainText:!0,inputMode:"numeric",autocomplete:"cc-csc",name:"cvc",formatMethod:()=>ui.cardCvc(o.value)}),c=(new Ei.T(l.container,l.input),[o,d,l,r].filter(Boolean));c.forEach((e=>{const t=t=>{if(!e.value&&"Backspace"===t.key){const t=c[c.indexOf(e)-1];t&&(0,Ot.Z)(t.input,!0)}};if(e instanceof Mi){e.options.onKeyDown=t;const i=e.options.onChange;e.options.onChange=t=>{if(null==i||i(t),document.activeElement===e.input&&t.meta.autocorrectComplete)for(let t=c.indexOf(e),i=c.length;te.container))));const g=!!this.paymentForm.pFlags.can_save_credentials,v=new jt.Z({text:"PaymentCardSavePaymentInformation",checked:!!g}),b=new Vt.ZP({checkboxField:v,subtitleLangKey:g?"PaymentCardSavePaymentInformationInfoLine1":"Checkout.2FA.Text"});g||b.container.classList.add("is-disabled"),(p||t).content.append(b.container),this.scrollable.append(...[t,p].filter(Boolean).map((e=>e.container)));const y=Ui({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,n=function*(){const e={cardNumber:o.value,expiryFull:d.value,expiryMonth:d.value.split("/")[0],expiryYear:d.value.split("/")[1],cvc:l.value,cardholderName:null==r?void 0:r.value,country:null==f?void 0:f.value,zip:null==m?void 0:m.value,save:null==v?void 0:v.checked},t=this.paymentForm.native_provider;let s;if("stripe"===t){const t=new URL("https://api.stripe.com/v1/tokens");t.search=new URLSearchParams({"card[number]":e.cardNumber,"card[exp_month]":e.expiryMonth,"card[exp_year]":e.expiryYear,"card[cvc]":e.cvc,"card[address_zip]":e.zip,"card[address_country]":e.country,"card[name]":e.cardholderName}).toString();const n=yield fetch(t.toString(),{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:`Bearer ${i.publishable_key}`}});s=yield n.json()}else if("smartglocal"===t){const t={card:{number:e.cardNumber.replace(/[^\d]+/g,""),expiration_month:e.expiryMonth,expiration_year:e.expiryYear,security_code:e.cvc.replace(/[^\d]+/g,"")}},n="https://tgb.smart-glocal.com/cds/v1/tokenize/card",a=yield fetch(n,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","X-PUBLIC-TOKEN":i.public_token},body:JSON.stringify(t)});s={type:"card",token:(yield a.json()).data.token}}this.dispatchEvent("finish",{token:s,card:e}),this.hide()},new((s=void 0)||(s=Promise))((function(i,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}d((n=n.apply(e,t||[])).next())}));var e,t,s,n}});Pi([o,r,d,l,f,m].filter(Boolean),(e=>{y.disabled=!e})),e&&(o.value=e.cardNumber,d.value=e.expiryFull,l.value=e.cvc,r&&(r.value=e.cardholderName),f&&(f.value=e.country),m&&(m.value=e.zip)),this.body.append(this.btnConfirmOnEnter=y),this.show(),o.validateNew(void 0,void 0,!0)||(0,Ot.Z)(o.input)}}class xi extends S.Z{constructor(e,t){super("popup-payment popup-payment-card-confirmation",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"Checkout.PasswordEntry.Title"});const i=new Ii.Z({noDelimiter:!0,noShadow:!0,caption:"Checkout.PasswordEntry.Text",captionArgs:[e]}),s=new Ei.Z({labelText:t.hint});i.content.append(s.container),this.scrollable.append(i.container);const n=()=>{a.disabled=!s.value,s.setState(E.I1.Neutral)};s.input.addEventListener("input",n);const a=Ui({key:"Checkout.PasswordEntry.Pay",onClick:()=>{return e=this,i=void 0,a=function*(){try{const e=yield this.managers.passwordManager.getInputCheckPassword(s.value,t),i=yield this.managers.apiManager.invokeApi("account.getTmpPassword",{password:e,period:60});this.dispatchEvent("finish",i),this.hide()}catch(e){throw"PASSWORD_HASH_INVALID"===e.type&&(e.handled=!0,s.setError("PASSWORD_HASH_INVALID")),e}},new((n=void 0)||(n=Promise))((function(t,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(e){var i;e.done?t(e.value):(i=e.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(e,i||[])).next())}));var e,i,n,a}});this.body.append(this.btnConfirmOnEnter=a),n(),this.show(),(0,Ot.Z)(s.input)}}var Ai=i(1171),_i=i(709);class Fi extends S.Z{constructor(e,t,i){super("popup-payment popup-payment-shipping",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"PaymentShippingInfo"}),this.paymentForm=e,this.inputInvoice=t,this.focus=i,this.d()}d(){const e=this.paymentForm.invoice,t=this.paymentForm.saved_info;let i,s,n,a,o,r,d,l,c,h,u;if(e.pFlags.shipping_address_requested){i=new Ii.Z({name:"PaymentShippingAddress",noDelimiter:!0,noShadow:!0}),s=new E.ZP({label:"PaymentShippingAddress1Placeholder",maxLength:64,required:!0}),n=new E.ZP({label:"PaymentShippingAddress2Placeholder",maxLength:64}),a=new E.ZP({label:"PaymentShippingCityPlaceholder",maxLength:64,required:!0}),o=new E.ZP({label:"PaymentShippingStatePlaceholder",maxLength:64});const e=Zi(!0,!0);r=e.countryInputField,d=e.postcodeInputField,i.content.append(...[s,n,a,o,r,d].filter(Boolean).map((e=>e.container)))}if([e.pFlags.name_requested,e.pFlags.email_requested,e.pFlags.phone_requested].includes(!0)){l=new Ii.Z({name:"PaymentShippingReceiver",noDelimiter:!0,noShadow:!0});const t=()=>{const e=h.value,t=(0,Ai.Z)(e);return!(!t||t[0].length!==e.length)},i=()=>!!u.value.match(/\d/);e.pFlags.name_requested&&(c=new E.ZP({label:"PaymentShippingName",maxLength:256,required:!0})),e.pFlags.email_requested&&(h=new E.ZP({label:"PaymentShippingEmailPlaceholder",maxLength:64,required:!0,validate:t})),e.pFlags.phone_requested&&(u=new _i.Z({required:!0,validate:i})),l.content.append(...[c,h,u].filter(Boolean).map((e=>e.container)))}const p=new jt.Z({text:"PaymentShippingSave",checked:!0}),f=new Vt.ZP({checkboxField:p,subtitleLangKey:"PaymentShippingSaveInfo"});(l||i).content.append(f.container),this.scrollable.append(...[i,l].filter(Boolean).map((e=>e.container)));const m=Ui({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,l=function*(){const e=r&&r.getSelected().country,t={_:"paymentRequestedInfo",shipping_address:e&&{_:"postAddress",street_line1:s.value,street_line2:n.value,city:a.value,state:o.value,country_iso2:null==e?void 0:e.iso2,post_code:d.value},name:null==c?void 0:c.value,email:null==h?void 0:h.value,phone:null==u?void 0:u.value};try{const e=yield this.managers.appPaymentsManager.validateRequestedInfo(this.inputInvoice,t,null==p?void 0:p.checked);this.dispatchEvent("finish",{shippingAddress:t,requestedInfo:e}),this.hide()}catch(e){const t={ADDRESS_STREET_LINE1_INVALID:s,ADDRESS_STREET_LINE2_INVALID:n,ADDRESS_COUNTRY_INVALID:r,ADDRESS_CITY_INVALID:a,ADDRESS_STATE_INVALID:o,ADDRESS_POSTCODE_INVALID:d,REQ_INFO_NAME_INVALID:c,REQ_INFO_EMAIL_INVALID:h,REQ_INFO_PHONE_INVALID:u}[e.type];throw t&&(t.setError(),e.handled=!0),e}},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,o)}r((l=l.apply(e,t||[])).next())}));var e,t,i,l}});if(this.body.append(this.btnConfirmOnEnter=m),t){const e=t.shipping_address;e&&(s.value=e.street_line1,n.value=e.street_line2,a.value=e.city,o.value=e.state,r.selectCountryByIso2(e.country_iso2),d.value=e.post_code),t.name&&c&&(c.value=t.name),t.email&&h&&(h.value=t.email),t.phone&&u&&(u.value=t.phone)}const{validate:g}=Pi([s,n,a,o,r,d,c,h,u].filter(Boolean),(e=>{m.disabled=!e}));let v;g(),this.show(),v=this.focus?{name:c,email:h,phone:u}[this.focus]:s,v&&(0,Ot.Z)(v.input)}}var Di=i(1218);class Ri extends S.Z{constructor(e,t,i){super("popup-payment popup-payment-shipping-methods",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"PaymentShippingMethod"}),this.paymentForm=e,this.requestedInfo=t,this.shippingOption=i,this.d()}d(){const e=new Ii.Z({name:"PaymentCheckoutShippingMethod",noDelimiter:!0,noShadow:!0}),t=this.requestedInfo.shipping_options.map((e=>new Vt.ZP({radioField:new Di.Z({text:e.title,name:"shipping-method",value:e.id}),subtitle:(0,Zt.Z)(xt(e.prices.map((({amount:e})=>+e)),0),this.paymentForm.invoice.currency)})));let i;const s=(0,Vt.De)(t,(e=>{i=e}));this.shippingOption?t.find((e=>e.radioField.input.value===this.shippingOption.id)).radioField.checked=!0:t[0].radioField.checked=!0,e.content.append(s),this.scrollable.append(e.container);const n=Ui({key:"PaymentInfo.Done",onClick:()=>{this.dispatchEvent("finish",this.requestedInfo.shipping_options.find((e=>e.id===i))),this.hide()}});this.body.append(this.btnConfirmOnEnter=n),this.show()}}var Bi=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Ni=["amex","card","diners","discover","jcb","mastercard","visa","unionpay","mir","logo"];function Oi(e){if(Ni.includes(e))return`assets/img/${e}.svg`}function Ui(e){var t,i;const s=null!==(t=e.textEl)&&void 0!==t?t:new L.ZP.IntlElement({key:null!==(i=e.key)&&void 0!==i?i:"PaymentInfo.Done"}),n=s.key,a=(0,He.Z)("btn-primary btn-color-primary payment-item-pay");return a.append(s.element),(0,C.fc)(a,(()=>Bi(this,void 0,void 0,(function*(){const t=e.onClick();if(!(t instanceof Promise))return;const i=(0,Gt.y)(a),o=(0,Ht.Z)([a],!0);s.compareAndUpdate({key:"PleaseWait"});try{yield t}catch(e){e.handled||console.error("payment button error",e),o(),s.compareAndUpdate({key:n}),i.remove()}})))),a}class Hi extends S.Z{constructor(e,t,i,s){super("popup-payment",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.message=e,this.inputInvoice=t,this.paymentForm=i,this.isReceipt=s,this.tipButtonsMap=new Map,this.d().catch((e=>{console.error("payment popup error",e),this.hide()}))}d(){var e,t,i;return Bi(this,void 0,void 0,(function*(){this.element.classList.add("is-loading"),this.show();let s=!1;const n=()=>{s||(s=!0,Te&&Te.hide(),this.hide())};let{paymentForm:a,message:o}=this;o&&this.listenerSetter.add(d.Z)("payment_sent",(({peerId:e,mid:t})=>{o.peerId===e&&o.mid===t&&n()}));const r=null==o?void 0:o.media,l=null!==(e=this.isReceipt)&&void 0!==e?e:r?!!r.receipt_msg_id||"messageExtendedMedia"===(null===(t=r.extended_media)||void 0===t?void 0:t._):"payments.paymentReceipt"===a._,c=r?r.pFlags.test:a.invoice.pFlags.test,h=r?r.photo:a.photo,u=r?r.title:a.title,p=r?r.description:a.description;(0,L.$d)(this.title,l?"PaymentReceipt":"PaymentCheckout"),c&&this.title.append(" (Test)");const m="payment-item",g=document.createElement("div");g.classList.add(m);const v=m+"-details",b=document.createElement("div");let y;b.classList.add(v),h&&(y=document.createElement("div"),y.classList.add(v+"-photo","media-container-contain"),(0,K.Z)({photo:h,container:y,boxWidth:100,boxHeight:100,size:{_:"photoSizeEmpty",type:""}}),b.append(y));const w=v+"-lines",S=document.createElement("div");S.classList.add(w);const E=document.createElement("div");E.classList.add(w+"-title");const I=document.createElement("div");I.classList.add(w+"-description");const M=document.createElement("div");M.classList.add(w+"-bot-name"),S.append(E,I,M),(0,F.Z)(E,(0,B.Z)(u)),(0,F.Z)(I,(0,B.Z)(p));const P=new N.Z;M.append(P.element),b.append(S),g.append(b),this.scrollable.append(g);const Z=document.createElement("div");Z.classList.add(m+"-preloader-container"),(0,Gt.y)(Z,!0),this.scrollable.container.append(Z);const T=this.inputInvoice;a||(a=l?yield this.managers.appPaymentsManager.getPaymentReceipt(o.peerId,r.receipt_msg_id||T.msg_id):yield this.managers.appPaymentsManager.getPaymentForm(T),this.paymentForm=a);let k=a.saved_info||a.info;const x=null===(i=a.saved_credentials)||void 0===i?void 0:i[0];let[A,_,D]=yield Promise.all([!l&&k&&this.managers.appPaymentsManager.validateRequestedInfo(T,k),x&&this.managers.passwordManager.getState(),(0,Kt.Z)({peerId:a.provider_id.toPeerId()})]);yield P.update({peerId:a.bot_id.toPeerId()}),Z.remove(),this.element.classList.remove("is-loading");const R=(e,t)=>(0,Zt.Z)(e,U,t),{invoice:O}=a,U=O.currency,z=O.pFlags.recurring&&!l;yield P.update({peerId:a.bot_id.toPeerId()});const j=z?yield(0,Kt.Z)({peerId:a.bot_id.toPeerId()}):void 0;Z.remove(),this.element.classList.remove("is-loading");const G=()=>{const e=document.createElement("div");e.classList.add(V+"-price");const t=document.createElement("span"),i=document.createElement("span");return e.append(t,i),{label:e,left:t,right:i}},V=m+"-prices",W=document.createElement("div");W.classList.add(V);const $=e=>e.map((e=>{const{amount:t,label:i}=e,s=G();s.left.textContent=i;const n=R(t);return s.right.textContent=n,s.label})),q=$(O.prices);let Q=()=>0,Y=0;const X=()=>{const e=R(te+Q()+Y);ee.right.textContent=e,J.compareAndUpdate({key:"PaymentCheckoutPay",args:[e]})},J=new L.ZP.IntlElement,ee=G();ee.label.classList.add("is-total"),(0,L.$d)(ee.left,"PaymentTransactionTotal");const te=xt(O.prices.map((({amount:e})=>+e)),0),ie=void 0!==O.max_tip_amount&&!l||!!a.tip_amount;if(ie){const e=m+"-tips",t=Tt.Z[U];Q=()=>+i().replace(/\D/g,"");const i=()=>r.value,s=()=>{const e=(0,At.Z)(i(),`500 ${kt.Bf} ${kt.bt}`);r.style.width=e+"px"},n=e=>{e=Math.min(+e,+O.max_tip_amount);const t=R(e,!0);r.value=t,document.activeElement===r&&(0,Ot.Z)(r),g&&g();const i=this.tipButtonsMap.get(e);i&&i.classList.add("active"),s(),X()},o=G();(0,L.$d)(o.left,l?"PaymentTip":"PaymentTipOptional");const r=document.createElement("input");r.type="tel",r.classList.add("input-clear",e+"-input"),o.right.append(r),l?o.label.classList.add("disable-hover"):o.label.style.cursor="text",o.label.addEventListener("mousedown",(e=>{(0,Ne.Z)(e.target,r)||(0,Ot.Z)(r)}));const d=r instanceof HTMLInputElement?1:2,c=()=>{p?--p:(p=d,(0,Ot.Z)(r))},h=()=>{setTimeout((()=>{p=d,(0,Ot.Z)(r),document.addEventListener("selectionchange",c)}),0)},u=()=>{r.addEventListener("focus",h,{once:!0}),document.removeEventListener("selectionchange",c)};let p;r.addEventListener("focusout",u),u(),r.addEventListener("input",(()=>{n(Q())}));const f=[t.symbol,t.space_between?" ":""];let g;if(t.symbol_left||f.reverse(),o.right[t.symbol_left?"prepend":"append"](f.join("")),q.push(o.label),l)n(a.tip_amount);else{const t=document.createElement("div");t.classList.add(e);const i=e+"-tip",s=O.suggested_tip_amounts.map((e=>{const t=(0,He.Z)(i,{noRipple:!0});return t.textContent=R(e),this.tipButtonsMap.set(+e,t),t}));g=()=>{const e=t.querySelector(".active");e&&e.classList.remove("active")},(0,C.fc)(t,(e=>{const t=(0,be.Z)(e.target,i);if(!t)return;let s=0;if(t.classList.contains("active"))t.classList.remove("active");else{g(),t.classList.add("active");for(const[e,i]of this.tipButtonsMap)if(i===t){s=e;break}}n(s)})),n(0),t.append(...s),q.push(t)}}else X();q.push(ee.label),W.append(...q),g.append(W);const se=(e,t)=>Bi(this,void 0,void 0,(function*(){const i=document.createElement("img");i.classList.add("media-photo"),yield(0,Ut.cj)(i,Oi(t));let s=e.media;s?(0,H.Z)(s,i):(s=e.createMedia("small"),s.classList.add("media-container-cover"),s.append(i)),e.container.classList.remove("row-with-icon")})),ne=e=>{e.titleLangKey&&(e.subtitleLangKey=e.titleLangKey),e.noWrap=!0;const t=new Vt.ZP(e);return t.container.classList.add(m+"-row"),e.titleLangKey&&t.subtitle.classList.add("hide"),t},ae=(e,t)=>{if(e.title.textContent=t,!t){const t=L.ZP.weakMap.get(e.subtitle.firstElementChild);e.title.append((0,L.ag)(t.key))}e.subtitle.classList.toggle("hide",!t)},oe=e=>{let t,i,s;"title"in e?(t=e.title.split(" ").shift(),i=e.title,s=e.icon):(t=Nt(e.cardNumber),i=t+" *"+e.cardNumber.split(" ").pop()),ce.title.classList.remove("tgico","tgico-card_outline"),se(ce,s||t.toLowerCase()),ae(ce,i)},re=()=>{new ki(a,de).addEventListener("finish",(({token:e,card:t})=>{le=e,de=t,oe(t)}))};let de,le;const ce=ne({titleLangKey:"PaymentCheckoutMethod",clickable:l?void 0:re,icon:"card_outline"});ce.container.classList.add(m+"-method-row"),x?oe(x):a.credentials_title&&oe({title:a.credentials_title});const he=ne({title:D,subtitleLangKey:"PaymentCheckoutProvider"}),ue=new f.Z;let pe,fe,me,ge,ve,ye,Se,Ce;ue.classList.add("avatar-32"),he.createMedia("small").append(ue),ue.updateWithOptions({peerId:a.provider_id.toPeerId()});const Le=O.pFlags.shipping_address_requested?e=>{if(!e)return ve.subtitle.classList.add("hide"),void(0,H.Z)(ve.title,(0,L.ag)("PaymentShippingAddress"));const t=e.shipping_address;ae(pe,[t.city,t.street_line1,t.street_line2].filter(Boolean).join(", ")),ve.container.classList.toggle("hide",!A&&!l)}:void 0,Ee=e=>{Le&&Le(e),fe&&ae(fe,e.name),me&&ae(me,e.email),ge&&ae(ge,e.phone&&"+"+(0,_e.u)(e.phone).formatted)};if(l||(Se=e=>{new Fi(a,T,e).addEventListener("finish",(({shippingAddress:e,requestedInfo:t})=>{A=t,k=a.saved_info=e,Ee(e)}))}),O.pFlags.shipping_address_requested){const e=e=>{const i=new ot(this.scrollable,void 0,!0);if(i.save(),t&&t.forEach((e=>e.remove())),!e)return Y=0,X(),i.restore(),void this.onContentUpdate();ye=e,ae(ve,e.title),Y=xt(e.prices.map((({amount:e})=>+e)),0),t=$(e.prices);let s=ee.label;ie&&(s=s.previousElementSibling,l||(s=s.previousElementSibling)),t.forEach((e=>s.parentElement.insertBefore(e,s))),X(),i.restore(),this.onContentUpdate()};let t;pe=ne({icon:"location",titleLangKey:"PaymentShippingAddress",clickable:!l&&Se.bind(null,void 0)}),ve=ne({icon:"shipping",titleLangKey:"PaymentCheckoutShippingMethod",clickable:!l&&(Ce=()=>{new Ri(a,A,ye).addEventListener("finish",(t=>{e(t)}))})}),ve.container.classList.add("hide");const i=a.shipping;i&&e(i)}O.pFlags.name_requested&&(fe=ne({icon:"newprivate",titleLangKey:"PaymentCheckoutName",clickable:!l&&Se.bind(null,"name")})),O.pFlags.email_requested&&(me=ne({icon:"mention",titleLangKey:"PaymentShippingEmailPlaceholder",clickable:!l&&Se.bind(null,"email")})),O.pFlags.phone_requested&&(ge=ne({icon:"phone",titleLangKey:"PaymentCheckoutPhoneNumber",clickable:!l&&Se.bind(null,"phone")})),k&&Ee(k);const Ie=[ce,he,pe,ve,fe,me,ge].filter(Boolean),Me=z&&new jt.Z({text:"Payments.Recurrent.Accept",textArgs:[(0,mt.ZP)(O.recurring_terms_url),j]}),Pe=z&&ne({checkboxField:Me}),Ze=z?[document.createElement("hr"),Pe.container]:[];let Te,ke;this.scrollable.append(...[document.createElement("hr"),...Ie.map((e=>e.container)),...Ze].filter(Boolean));const xe=()=>{Ae.disabled=!(!Me||Me.checked)};let Ae;Ae=Ui(l?{onClick:()=>this.hide(),key:"Done"}:{onClick:()=>{const e=O.pFlags.name_requested&&!(null==k?void 0:k.name)?"name":O.pFlags.email_requested&&!(null==k?void 0:k.email)?"email":O.pFlags.phone_requested&&!(null==k?void 0:k.phone)?"phone":void 0;if(O.pFlags.shipping_address_requested){if(!A)return void Se();if(!ye)return void Ce()}else if(e)return void Se(e);return de||ke?Promise.resolve().then((()=>Bi(this,void 0,void 0,(function*(){const e=ke?{_:"inputPaymentCredentialsSaved",id:x.id,tmp_password:ke.tmp_password}:{_:"inputPaymentCredentials",data:{_:"dataJSON",data:JSON.stringify(le.token?le:{type:le.type,id:le.id})},pFlags:{save:de.save||void 0}};try{const t=yield this.managers.appPaymentsManager.sendPaymentForm(T,a.form_id,null==A?void 0:A.id,null==ye?void 0:ye.id,e,Q());"payments.paymentResult"===t._?n():(Te=new Li(t.url,!r.extended_media),Te.addEventListener("finish",(()=>{Te=void 0,n()})),yield new Promise(((e,t)=>{Te.addEventListener("close",(()=>{if(Te=void 0,s)e();else{const e=new Error("payment not finished");e.handled=!0,t(e)}}))})))}catch(e){throw"BOT_PRECHECKOUT_TIMEOUT"===e.type?((0,we.bC)({langPackKey:"Error.AnError"}),e.handled=!0):"TMP_PASSWORD_INVALID"===e.type&&(_=ke=void 0,(0,C.tH)(Ae),e.handled=!0),e}})))):x?void Promise.resolve(null!=_?_:this.managers.passwordManager.getState()).then((e=>{new xi(x.title,e).addEventListener("finish",(e=>{_=void 0,ke=e,(0,C.tH)(Ae);const t=e.valid_until-(0,zt.Z)(!0)-5;setTimeout((()=>{ke===e&&(ke=void 0)}),1e3*t)}))})):void re()},textEl:J}),xe(),Me&&Me.input.addEventListener("change",xe),this.body.append(this.btnConfirmOnEnter=Ae),this.onContentUpdate()}))}}var zi=i(8487),ji=i(13),Gi=i(9259),Vi=i(3228);class Ki{constructor(e,t,i,s,n=t){this.sizes=e,this.maxWidth=t,this.minWidth=i,this.spacing=s,this.maxHeight=n,this.count=e.length,this.ratios=Ki.countRatios(e),this.proportions=Ki.countProportions(this.ratios),this.averageRatio=xt(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find((e=>e>2))?new Wi(this.ratios,this.averageRatio,this.maxWidth,this.minWidth,this.spacing).layout():2===this.count?this.layoutTwo():3===this.count?this.layoutThree():this.layoutFour():[]}layoutTwo(){return"ww"===this.proportions&&this.averageRatio>1.4*this.maxSizeRatio&&this.ratios[1]-this.ratios[0]<.2?this.layoutTwoTopBottom():"ww"===this.proportions||"qq"===this.proportions?this.layoutTwoLeftRightEqual():this.layoutTwoLeftRight()}layoutThree(){return"n"===this.proportions[0]?this.layoutThreeLeftAndOther():this.layoutThreeTopAndOther()}layoutFour(){return"w"===this.proportions[0]?this.layoutFourTopAndOther():this.layoutFourLeftAndOther()}layoutTwoTopBottom(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],(this.maxHeight-this.spacing)/2)));return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:14}]}layoutTwoLeftRightEqual(){const e=(this.maxWidth-this.spacing)/2,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],1*this.maxHeight)));return[{geometry:{x:0,y:0,width:e,height:t},sides:13},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:7}]}layoutTwoLeftRight(){const e=Math.round(1.5*this.minWidth),t=Math.min(Math.round(Math.max(.4*(this.maxWidth-this.spacing),(this.maxWidth-this.spacing)/this.ratios[0]/(1/this.ratios[0]+1/this.ratios[1]))),this.maxWidth-this.spacing-e),i=this.maxWidth-t-this.spacing,s=Math.min(this.maxHeight,Math.round(Math.min(i/this.ratios[0],t/this.ratios[1])));return[{geometry:{x:0,y:0,width:i,height:s},sides:13},{geometry:{x:i+this.spacing,y:0,width:t,height:s},sides:7}]}layoutThreeLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min((this.maxHeight-this.spacing)/2,this.ratios[1]*(this.maxWidth-this.spacing)/(this.ratios[2]+this.ratios[1]))),i=e-t-this.spacing,s=Math.max(this.minWidth,Math.round(Math.min((this.maxWidth-this.spacing)/2,Math.min(t*this.ratios[2],i*this.ratios[1])))),n=Math.min(Math.round(e*this.ratios[0]),this.maxWidth-this.spacing-s);return[{geometry:{x:0,y:0,width:n,height:e},sides:13},{geometry:{x:n+this.spacing,y:0,width:s,height:i},sides:3},{geometry:{x:n+this.spacing,y:i+this.spacing,width:s,height:t},sides:6}]}layoutThreeTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=(this.maxWidth-this.spacing)/2,s=Math.min(this.maxHeight-t-this.spacing,Math.round(Math.min(i/this.ratios[1],i/this.ratios[2]))),n=e-i-this.spacing;return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:i,height:s},sides:12},{geometry:{x:i+this.spacing,y:t+this.spacing,width:n,height:s},sides:6}]}layoutFourTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=Math.round((this.maxWidth-2*this.spacing)/(this.ratios[1]+this.ratios[2]+this.ratios[3])),s=Math.max(this.minWidth,Math.round(Math.min(.4*(this.maxWidth-2*this.spacing),i*this.ratios[1]))),n=Math.round(Math.max(Math.max(1*this.minWidth,.33*(this.maxWidth-2*this.spacing)),i*this.ratios[3])),a=e-s-n-2*this.spacing,o=Math.min(this.maxHeight-t-this.spacing,i);return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:s,height:o},sides:12},{geometry:{x:s+this.spacing,y:t+this.spacing,width:a,height:o},sides:4},{geometry:{x:s+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:6}]}layoutFourLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min(e*this.ratios[0],.6*(this.maxWidth-this.spacing))),i=Math.round((this.maxHeight-2*this.spacing)/(1/this.ratios[1]+1/this.ratios[2]+1/this.ratios[3])),s=Math.round(i/this.ratios[1]),n=Math.round(i/this.ratios[2]),a=e-s-n-2*this.spacing,o=Math.max(this.minWidth,Math.min(this.maxWidth-t-this.spacing,i));return[{geometry:{x:0,y:0,width:t,height:e},sides:13},{geometry:{x:t+this.spacing,y:0,width:o,height:s},sides:3},{geometry:{x:t+this.spacing,y:s+this.spacing,width:o,height:n},sides:2},{geometry:{x:t+this.spacing,y:s+n+2*this.spacing,width:o,height:a},sides:6}]}static countRatios(e){return e.map((e=>e.w/e.h))}static countProportions(e){return e.map((e=>e>1.2?"w":e<.8?"n":"q")).join("")}}class Wi{constructor(e,t,i,s,n,a=4*i/3){this.averageRatio=t,this.maxWidth=i,this.minWidth=s,this.spacing=n,this.maxHeight=a,this.ratios=Wi.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map((e=>t>1.1?(0,Vi.Z)(e,1,2.75):(0,Vi.Z)(e,.6667,1)))}layout(){const e=new Array(this.count),t=[],i=(e,t)=>{const i=xt(this.ratios.slice(e,e+t),0);return(this.maxWidth-(t-1)*this.spacing)/i},s=e=>{const s=[];let n=0;for(const t of e)s.push(i(n,t)),n+=t;t.push({lineCounts:e,heights:s})};for(let e=1;e!==this.count;++e){const t=this.count-e;e>3||t>3||s([e,t])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t){const i=this.count-e-t;e>3||t>(this.averageRatio<.85?4:3)||i>3||s([e,t,i])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t)for(let i=1;i!==this.count-e-t;++i){const n=this.count-e-t-i;e>3||t>3||i>3||n>3||s([e,t,i,n])}let n=null,a=0;for(const e of t){const{heights:t,lineCounts:i}=e,s=i.length,o=xt(t,0)+this.spacing*(s-1),r=Math.min(...t),d=(Math.max(...t),r{for(let e=1;e!==s;++e)if(i[e-1]>i[e])return 1.5;return 1})(),c=Math.abs(o-this.maxHeight)*d*l;(!n||c2&e.sides)),s=i.geometry.width+i.geometry.x,n=t.find((e=>4&e.sides)),a=n.geometry.height+n.geometry.y,o=e.container;o.style.width=s+"px",o.style.height=a+"px";const r=o.children;t.forEach((({geometry:t,sides:i},n)=>{let d;if(d=r[n],d||(d=document.createElement("div"),o.append(d)),d.classList.add("album-item","grouped-item"),d.style.width=t.width/s*100+"%",d.style.height=t.height/a*100+"%",d.style.top=t.y/a*100+"%",d.style.left=t.x/s*100+"%",8&i&&1&i&&(d.style.borderTopLeftRadius="inherit"),8&i&&4&i&&(d.style.borderBottomLeftRadius="inherit"),2&i&&1&i&&(d.style.borderTopRightRadius="inherit"),2&i&&4&i&&(d.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),d.append(e)}}))}var qi=i(6131);function Qi({messages:e,attachmentDiv:t,middleware:i,uploading:s,lazyLoadQueue:n,isOut:a,chat:r,loadPromises:l,autoDownload:c,managers:h=d.Z.managers,animationGroup:u}){const p=[];for(const t of e){const e=(0,bt.Z)(t),i="photo"===e._?(0,j.Z)(e,480,480):{w:e.w,h:e.h};p.push({size:i,media:e,message:t})}$i({container:t,items:p.map((e=>({w:e.size.w,h:e.size.h}))),maxWidth:o.Z.active.album.width,minWidth:100,spacing:2,forMedia:!0});const{width:f,height:m}=t.style,g=parseInt(f),v=parseInt(m);p.forEach(((e,s)=>{var o;const{size:r,media:d,message:p}=e,f=!!(null===(o=p.media.pFlags)||void 0===o?void 0:o.spoiler),m=t.children[s];m.dataset.mid=""+p.mid,m.dataset.peerId=""+p.peerId;const b=m.firstElementChild;let y;if(y="photo"===d._?(0,K.Z)({photo:d,message:p,container:b,boxWidth:0,boxHeight:0,isOut:a,lazyLoadQueue:n,middleware:i,size:r,loadPromises:l,autoDownloadSize:c.photo,managers:h}):(0,$.Z)({doc:d,container:b,message:p,boxWidth:0,boxHeight:0,withTail:!1,isOut:a,lazyLoadQueue:n,middleware:i,loadPromises:l,autoDownload:c,managers:h,noAutoplayAttribute:f}),y&&(null==l||l.push(y)),f){const e=(y||Promise.resolve()).then((()=>{return e=this,t=void 0,n=function*(){if(!i())return;const{width:e,height:t}=m.style,s=+e.slice(0,-1)/100*g,n=+t.slice(0,-1)/100*v,a=yield(0,qi.ZP)({media:d,animationGroup:u,middleware:i,width:s,height:n});i()&&b.append(a)},new((s=void 0)||(s=Promise))((function(i,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}d((n=n.apply(e,t||[])).next())}));var e,t,s,n}));null==l||l.push(e)}}))}var Yi=i(296),Xi=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))},Ji=i(3552),es=i(8130);class ts extends Ji._{init(e){return t=this,i=void 0,n=function*(){this.container.id="poll-results-container",this.container.classList.add("chatlist-container"),this.resultsDiv=document.createElement("div"),this.resultsDiv.classList.add("poll-results"),this.scrollable.append(this.resultsDiv);const t=yield this.managers.appPollsManager.getPoll(e.media.poll.id);this.setTitle(t.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const i=document.createElement("h3");(0,F.Z)(i,(0,B.Z)(t.poll.question));const s=t.results.results.map((e=>e.voters/t.results.total_voters*100));ns(s);const n=document.createDocumentFragment();t.results.results.forEach(((i,o)=>{if(!i.voters)return;const r=document.createElement("hr"),d=t.poll.answers[o],l=document.createElement("div");l.classList.add("poll-results-answer");const c=document.createElement("div");(0,F.Z)(c,(0,B.Z)(d.text));const h=document.createElement("div");h.innerText=Math.round(s[o])+"%",l.append(c,h);const u=es.default.createChatList();u.classList.add("poll-results-voters"),es.default.setListClickListener(u,(()=>{a.ZP.onCloseBtnClick()}),void 0,!0),u.style.minHeight=48*Math.min(i.voters,4)+"px",n.append(r,l,u);let p,f=4,m=!1,g=Math.max(0,i.voters-4);const v=()=>{m||(m=!0,this.managers.appPollsManager.getVotes(e,d.option,p,f).then((e=>{e.votes.forEach((e=>{const{dom:t}=es.default.addDialogNew({peerId:e.user_id.toPeerId(!1),container:u,rippleEnabled:!1,meAsSaved:!1,avatarSize:"small"});t.lastMessageSpan.parentElement.remove()})),p&&(g=Math.max(0,g-e.votes.length),g&&b.lastElementChild.replaceWith((0,L.ag)("PollResults.LoadMore",[Math.min(20,g)]))),p=e.next_offset,f=20,g&&e.votes.length||b.remove()})).finally((()=>{m=!1})))},b=(0,He.Z)("poll-results-more btn btn-primary btn-transparent",{icon:"down"});b.addEventListener("click",v),b.append((0,L.ag)("PollResults.LoadMore",[Math.min(20,g)])),n.append(b),v()})),this.resultsDiv.append(i,n),a.ZP.toggleSidebar(!0).then((()=>{}))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}}var is=i(5157);let ss=0;const ns=e=>{const t=e.reduce(((e,t)=>e+Math.round(t)),0);if(t>100){const i=t-100,s=e.length;for(let t=0;t=.5&&si&&(i=s,t=n)}if(-1===t)return;e[t]+=1-i}}};d.Z.addEventListener("poll_update",(({poll:e,results:t})=>{Array.from(document.querySelectorAll(`poll-element[poll-id="${e.id}"]`)).forEach((i=>{i.isClosed=!!e.pFlags.closed,i.performResults(t,e.chosenIndexes)}))})),o.Z.addEventListener("resize",(()=>{cs.setMaxLength(),cs.resizePolls()})),o.Z.addEventListener("changeScreen",(()=>{cs.setMaxLength()}));const as=(e,t,i)=>{e.classList.remove("active"),clearTimeout(i),setTimeout((()=>{t(),e.remove(),os===e&&rs===t&&ds===i&&(os=rs=null,ds=0)}),200)};let os,rs,ds,ls=!1;class cs extends HTMLElement{constructor(){super(...arguments),this.isClosed=!1,this.isQuiz=!1,this.isRetracted=!1,this.isPublic=!1,this.isMultiple=!1,this.chosenIndexes=[],this.chosingIndexes=[],this.sentVote=!1}static setMaxLength(){const e=Ae.Z.width<=360?Ae.Z.width-120:o.Z.active.poll.width;this.MAX_LENGTH=e+9+this.MAX_OFFSET+-13.7}static resizePolls(){this.MAX_LENGTH&&Array.from(document.querySelectorAll("poll-element.is-voted")).forEach((e=>{e.svgLines.forEach(((t,i)=>{e.setLineProgress(i,1)}))}))}render(){return e=this,t=void 0,s=function*(){ss||(ss=document.getElementById("poll-line").getTotalLength(),cs.setMaxLength());const{poll:e,results:t}=this.message.media;let i;this.message.pFlags.is_scheduled&&this.classList.add("disable-hover"),e.pFlags&&(this.isPublic=!!e.pFlags.public_voters,this.isQuiz=!!e.pFlags.quiz,this.isClosed=!!e.pFlags.closed,this.isMultiple=!!e.pFlags.multiple_choice,this.isClosed?(i="Chat.Poll.Type.Closed",this.classList.add("is-closed")):i=this.isQuiz?this.isPublic?"Chat.Poll.Type.Quiz":"Chat.Poll.Type.AnonymousQuiz":this.isPublic?"Chat.Poll.Type.Public":"Chat.Poll.Type.Anonymous"),this.classList.toggle("is-multiple",this.isMultiple);const s=this.isMultiple?'':"",n=e.answers.map(((e,t)=>`\n
\n
\n
\n \n \n \n ${s}\n
\n
\n
\n \n \n
\n `)).join("");if(this.innerHTML=`\n
\n
\n
\n
\n
\n ${n}`,(0,F.Z)(this.firstElementChild,(0,B.Z)(e.question)),Array.from(this.querySelectorAll(".poll-answer-text")).forEach(((t,i)=>{(0,F.Z)(t,(0,B.Z)(e.answers[i].text))})),this.descDiv=this.firstElementChild.nextElementSibling,this.typeDiv=this.descDiv.firstElementChild,this.avatarsDiv=this.descDiv.lastElementChild,i&&this.typeDiv.append((0,L.ag)(i)),this.isQuiz&&(this.classList.add("is-quiz"),e.close_period&&e.close_date)){const t=document.createElement("div");t.classList.add("poll-time"),this.descDiv.append(t);const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("poll-quiz-timer"),this.quizTimer=i;const s=2,n=7,a=2*Math.PI*n,o=document.createElementNS("http://www.w3.org/2000/svg","circle");o.classList.add("poll-quiz-timer-circle"),o.setAttributeNS(null,"cx","16"),o.setAttributeNS(null,"cy","16"),o.setAttributeNS(null,"r",""+n),o.setAttributeNS(null,"stroke-width",""+s),i.append(o),this.descDiv.append(i);const r=1e3*e.close_period,l=1e3*(e.close_date-(yield d.Z.managers.timeManager.getServerTimeOffset()));this.quizInterval=window.setInterval((()=>{const e=Date.now(),i=(l-e)/r,s=(l-e)/1e3+1|0;t.innerHTML=(0,is.Z)(s),s<=5&&(t.style.color="#ee545c",o.style.stroke="#ee545c"),o.style.strokeDashoffset=a+i*a,o.style.strokeDasharray=`${a} ${a}`,e>=l&&(clearInterval(this.quizInterval),t.innerHTML="",o.style.strokeDashoffset=a,this.quizInterval=0,setTimeout((()=>{this.managers.appPollsManager.getResults(this.message)}),3e3))}),1e3)}this.answerDivs=Array.from(this.querySelectorAll(".poll-answer")),this.svgLines=Array.from(this.querySelectorAll(".poll-line")),this.numberDivs=Array.from(this.querySelectorAll(".poll-answer-percents"));const o=document.createElement("div");o.classList.add("poll-footer"),this.viewResults=document.createElement("div"),this.viewResults.className="poll-footer-button poll-view-results hide",this.viewResults.append((0,L.ag)("Chat.Poll.ViewResults")),this.votersCountDiv=document.createElement("div"),this.votersCountDiv.className="poll-votes-count",o.append(this.viewResults,this.votersCountDiv),this.append(o),this.viewResults.addEventListener("click",(e=>{(0,Le.Z)(e),a.ZP.isTabExists(ts)||a.ZP.createTab(ts).open(this.message)})),(0,A.Z)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append((0,L.ag)("Chat.Poll.SubmitVote")),(0,A.Z)(this.sendVoteBtn),e.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),(0,C.fc)(this.sendVoteBtn,(e=>{(0,Le.Z)(e),this.chosingIndexes.length&&this.sendVotes(this.chosingIndexes).then((()=>{this.chosingIndexes.length=0,this.answerDivs.forEach((e=>{e.classList.remove("is-chosing")}))}))})),o.append(this.sendVoteBtn));const r=!(e.chosenIndexes.length||this.isClosed);r&&!this.isPublic||this.performResults(t,e.chosenIndexes,!1),r&&(this.setVotersCount(t),(0,C.fc)(this,this.clickHandler))},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}initQuizHint(e){if(e.solution&&e.solution_entities){const t=document.createElement("div");if(t.classList.add("tgico-tip","poll-hint"),this.descDiv.append(t),(0,C.fc)(t,(i=>{(0,Le.Z)(i),t.classList.add("active"),((e,t,i)=>{os&&as(os,rs,ds);const s=document.createElement("div");s.classList.add("quiz-hint");const n=document.createElement("div");n.classList.add("container","tgico");const a=document.createElement("div");a.classList.add("text"),n.append(a),s.append(n),(0,F.Z)(a,(0,mt.ZP)(e,{entities:t})),td.chat.bubbles.container.append(s),s.offsetLeft,s.classList.add("active"),os=s,rs=i,ds=window.setTimeout((()=>{as(s,i,ds)}),c.Z?5e3:7e3),ls||(ls=!0,td.addEventListener("peer_changed",(()=>{os&&as(os,rs,ds)})))})(e.solution,e.solution_entities,(()=>{t.classList.remove("active")}))})),this.sentVote){const i=e.results.find((e=>e.pFlags.correct));i&&!i.pFlags.chosen&&(0,C.tH)(t)}}}clickHandler(e){const t=(0,be.Z)(e.target,"poll-answer");if(!t)return;(0,Le.Z)(e);const i=+t.dataset.index;if(this.isMultiple){t.classList.toggle("is-chosing");const e=this.chosingIndexes.indexOf(i);-1!==e?this.chosingIndexes.splice(e,1):this.chosingIndexes.push(i)}else this.sendVotes([i])}sendVotes(e){if(this.sendVotePromise)return this.sendVotePromise;const t=this.answerDivs.filter(((t,i)=>e.includes(i)));return t.forEach((e=>{e.classList.add("is-voting")})),this.classList.add("disable-hover"),this.sentVote=!0,this.sendVotePromise=this.managers.appPollsManager.sendVote(this.message,e).then((()=>{t.forEach((e=>{e.classList.remove("is-voting")})),this.classList.remove("disable-hover")})).catch((()=>{this.sentVote=!1})).finally((()=>{this.sendVotePromise=null}))}performResults(e,t,i=!0){var s,n;if(d.Z.settings.animationsEnabled||(i=!1),this.isQuiz&&((null===(s=e.results)||void 0===s?void 0:s.length)||this.isClosed)){this.answerDivs.forEach(((t,i)=>{t.classList.toggle("is-correct",!!e.results[i].pFlags.correct)})),this.initQuizHint&&(this.initQuizHint(e),this.initQuizHint=null),this.quizInterval&&(clearInterval(this.quizInterval),this.quizInterval=0),(null===(n=this.quizTimer)||void 0===n?void 0:n.parentElement)&&this.quizTimer.remove();const t=this.descDiv.querySelector(".poll-time");t&&t.remove()}if(this.isClosed&&(this.classList.add("is-closed"),(0,H.Z)(this.typeDiv,(0,L.ag)("Chat.Poll.Type.Closed"))),(this.chosenIndexes.length!==t.length||this.isClosed)&&(this.isRetracted=this.chosenIndexes.length&&!t.length,this.chosenIndexes=t.slice(),this.isRetracted?(0,C.fc)(this,this.clickHandler):(0,C.EN)(this,this.clickHandler)),this.chosenIndexes.length||this.isRetracted||this.isClosed){const t=e.results.map((t=>e.total_voters?t.voters/e.total_voters*100:0));this.classList.toggle("no-transition",!i),i&&(0,De.Z)({element:this,className:"",forwards:!this.isRetracted,duration:340}),(0,fe.T2)((()=>{this.setResults(this.isRetracted?this.percents:t,this.chosenIndexes,i),this.percents=t,this.isRetracted=!1}))}if(this.setVotersCount(e),this.isPublic){this.isMultiple||(this.viewResults.classList.toggle("hide",!e.total_voters||!this.chosenIndexes.length),this.votersCountDiv.classList.toggle("hide",!!this.chosenIndexes.length));const t=(e.recent_voters||[]).map((e=>e.toPeerId())),i=new se({avatarSize:16});i.render(t),(0,H.Z)(this.avatarsDiv,i.container)}if(this.isMultiple){const t=!!this.chosenIndexes.length,i=this.isClosed||t,s=!this.isPublic||!e.total_voters||!t&&!this.isClosed;this.sendVoteBtn.classList.toggle("hide",i),this.viewResults.classList.toggle("hide",s),this.votersCountDiv.classList.toggle("hide",!i||!s)}}setResults(e,t,i){this.svgLines.forEach((e=>e.style.display="")),this.answerDivs.forEach(((e,i)=>{e.classList.toggle("is-chosen",t.includes(i))}));const s=Math.max(...e);if(this.maxPercents=e.map((e=>e/s)),this.isRetracted)this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,-1)}));else{const e=()=>{this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,1)}))};i?(0,fe.T2)(e):e()}let n;e=e.slice(),ns(e);const a=t=>{e.forEach(((e,i)=>{const s=n(e,t);this.numberDivs[i].innerText=s+"%"}))};if(this.isRetracted)if(n=(e,t)=>Math.round(e/10*t),i)for(let e=9,t=0;e>=0;--e,++t)setTimeout((()=>{a(e)}),34*t);else a(0);else if(n=(e,t)=>Math.round(e/10*(t+1)),i)for(let e=0;e<10;++e)setTimeout((()=>{a(e)}),34*e);else a(9);if(this.isRetracted){i&&this.classList.add("is-retracting"),this.classList.remove("is-voted");const e=()=>{this.svgLines.forEach((e=>e.style.display="none"))};i?setTimeout((()=>{this.classList.remove("is-retracting"),e()}),340):e()}else this.classList.add("is-voted")}setVotersCount(e){const t=e.total_voters||0;let i;const s=[t];i=this.isClosed?this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesResultEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesResultEmpty":this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesEmpty",(0,H.Z)(this.votersCountDiv,(0,L.ag)(i,s))}setLineProgress(e,t){const i=this.svgLines[e];-1===t?(i.style.strokeDasharray="",i.style.strokeDashoffset=""):(i.style.strokeDasharray=t*this.maxPercents[e]*cs.MAX_LENGTH+", 485.9",i.style.strokeDashoffset=""+t*cs.MAX_OFFSET)}}cs.MAX_OFFSET=-46.5,cs.MAX_LENGTH=0,customElements.define("poll-element",cs);const hs="֑-߿יִ-﷽ﹰ-ﻼ",us=(new RegExp("^[^A-Za-zÀ-ÖØ-öø-ʸ̀-֐ࠀ-῿Ⰰ-﬜﷾-﹯﻽-￿]*["+hs+"]"),new RegExp("["+hs+"]"));var ps=i(6628),fs=i(5345),ms=i(3591),gs=i(9102),vs=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const bs=new Map([["messageActionHistoryClear",!0],["messageActionChatCreate",e=>e.pFlags.out]]),ys=new Set;Ue.Z&&ys.add("messageActionPhoneCall");const ws=void 0;let Ss=ws,Cs=0;const Ls=3,Es=new Error("peer changed"),Is={1:96,2:90,3:84,4:72,5:60,6:48,7:36},Ms=Object.keys(Is).length;function Ps(e){return Math.max(...e)}class Zs{constructor(e,t){let i;this.chat=e,this.managers=t,this.unreadOut=new Set,this.needUpdate=[],this.bubbles={},this.skippedMids=new Set,this.bubblesNewByGroupedId={},this.bubblesNew={},this.dateMessages={},this.scrolledDown=!0,this.isScrollingTimeout=0,this.unreaded=new Map,this.unreadedSeen=new Set,this.preloader=null,this.messagesQueueOnRenderAdditional=null,this.firstUnreadBubble=null,this.middlewareHelper=(0,Ce.k)(),this.followStack=[],this.isHeavyAnimationInProgress=!1,this.isFirstLoad=!0,this.passEntities={},this.viewsMids=new Set,this.isTopPaddingSet=!1,this.renderingMessages=new Set,this.bubblesToEject=new Set,this.bubblesToReplace=new Map,this.setPeerTempId=0,this.renderNewPromises=new Set,this.extendedMediaMessages=new Set,this.unreadedObserverCallback=e=>{if(e.isIntersecting){const t=e.target,i=this.unreaded.get(t);this.onUnreadedInViewport(t,i)}},this.viewsObserverCallback=e=>{if(e.isIntersecting){const t=+e.target.dataset.mid;if(this.observer.unobserve(e.target,this.viewsObserverCallback),t)this.viewsMids.add(t),this.sendViewCountersDebounced();else{const{sponsoredMessage:e}=this,t=null==e?void 0:e.random_id;t&&(this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(),t),delete e.random_id)}}},this.stickerEffectObserverCallback=e=>{if(e.isIntersecting){this.observer.unobserve(e.target,this.stickerEffectObserverCallback);const t=e.target.querySelector(".attachment");(0,pe.e9)().then((()=>{(0,zi.Z)(t)&&(0,C.tH)(t)}))}},this.onBubblesMouseMove=e=>vs(this,void 0,void 0,(function*(){const t=(0,be.Z)(e.target,"bubble-content");if("scheduled"===this.chat.type||!t||this.chat.selection.isSelecting||(0,be.Z)(e.target,"service")||(0,be.Z)(e.target,"bubble-beside-button"))this.unhoverPrevious();else{const e=(0,be.Z)(t,"bubble");if(!this.chat.selection.canSelectBubble(e))return void this.unhoverPrevious();let{hoverBubble:i,hoverReaction:s}=this;if(e===i)return;if(this.unhoverPrevious(),i=this.hoverBubble=e,s=this.hoverReaction,s)s.dataset.loaded&&this.setHoverVisible(s,!0);else{s=this.hoverReaction=document.createElement("div"),s.classList.add("bubble-hover-reaction");const i=document.createElement("div");i.classList.add("bubble-hover-reaction-sticker"),s.append(i),t.append(s);let n=yield this.chat.getMessage(+e.dataset.mid);if("message"!==(null==n?void 0:n._))return void this.unhoverPrevious();n=yield this.managers.appMessagesManager.getGroupsFirstMessage(n);const a=this.getMiddleware((()=>this.hoverReaction===s));Promise.all([this.managers.appReactionsManager.getAvailableReactionsByMessage(n),(0,at.Z)(400)]).then((([e])=>{const t=e[0];t?(0,W.ZP)({div:i,doc:t.select_animation,width:18,height:18,needUpscale:!0,middleware:a,group:this.chat.animationGroup,withThumb:!1,needFadeIn:!1}).then((({render:e})=>e)).then((e=>{(0,Ze.Z)(e),e.addEventListener("firstFrame",(()=>{a()&&(s.dataset.loaded="1",this.setHoverVisible(s,!0))}),{once:!0}),(0,C.fc)(s,(e=>{(0,Le.Z)(e),this.managers.appReactionsManager.sendReaction(n,t),this.unhoverPrevious()}),{listenerSetter:this.listenerSetter})}),Ye.Z):s.remove()}))}}})),this.unhoverPrevious=()=>{const{hoverBubble:e,hoverReaction:t}=this;e&&(this.setHoverVisible(t,!1),this.hoverBubble=void 0,this.hoverReaction=void 0)},this.onBubblesClick=e=>vs(this,void 0,void 0,(function*(){var t;let i=e.target,s=null;try{s=(0,be.Z)(i,"bubble")}catch(e){}if(!s&&!this.chat.selection.isSelecting){const e=(0,be.Z)(i,"user-avatar");if(!e)return;const t=e.dataset.peerId.toPeerId();return void(t!==m.NM?this.chat.appImManager.setInnerPeer({peerId:t}):(0,we.Am)(L.ZP.format("HidAccount",!0)))}if(s.classList.contains("is-date")&&(0,be.Z)(i,"bubble-content")){if(s.classList.contains("is-fake")&&(s=s.previousElementSibling),s.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages)if(this.dateMessages[e].div===s){S.Z.createPopup(I,new Date(+e),this.onDatePick).show();break}return}if(!c.Z&&(0,be.Z)(i,"time"))return void this.chat.selection.toggleByElement(s);if(this.chat.selection.isSelecting&&e.isTrusted){if(s.classList.contains("service")&&void 0===s.dataset.mid)return;return(0,Le.Z)(e),c.Z&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement((0,be.Z)(i,"grouped-item")||s)}const n=(0,be.Z)(i,"media-spoiler-container");if(n)return void(0,qi.kN)({event:e,mediaSpoiler:n});const a=(0,be.Z)(i,"contact");if(a){const t=a.dataset.peerId.toPeerId();if(t)this.chat.appImManager.setInnerPeer({peerId:t});else{const t=a.querySelector(".contact-number");(0,ht.T)(t.innerText.replace(/\s/g,"")),(0,we.bC)({langPackKey:"PhoneCopied"}),(0,Le.Z)(e)}return}const o=(0,be.Z)(i,"bubble-call");if(o)return void this.chat.appImManager.callUser(this.peerId.toUserId(),o.dataset.type);if((0,be.Z)(i,"is-buy")){(0,Le.Z)(e);const t=yield this.chat.getMessage(+s.dataset.mid);if(!t)return;return void new Hi(t,yield this.managers.appPaymentsManager.getInputInvoiceByPeerId(t.peerId,t.mid))}const r=(0,ye.Z)(i,"REACTION-ELEMENT");if(r){if((0,Le.Z)(e),r.classList.contains("is-inactive"))return;const t=r.parentElement,i=t.getReactionCount(r),s=t.getMessage();return void this.managers.appReactionsManager.sendReaction(s,i.reaction)}const d=(0,Be.Z)(i,"data-sticker-emoji");if(d&&1===d.parentElement.querySelectorAll("[data-sticker-emoji]").length&&s.classList.contains("emoji-big"))return void(0,W._2)({event:e,container:d,managers:this.managers,middleware:this.getMiddleware(),peerId:this.peerId});if((0,be.Z)(i,"replies")){const e=+s.dataset.mid;if(this.peerId===m.hj){const t=yield this.chat.getMessage(e),i=(0,R.Z)(t.reply_to.reply_to_peer_id),s=t.reply_to.reply_to_top_id,n=t.fwd_from.saved_from_msg_id;this.chat.appImManager.openThread({peerId:i,lastMsgId:n,threadId:s})}else{const t=yield this.chat.getMessage(e),i=yield this.managers.appMessagesManager.getMessageWithReplies(t),s=i.replies;s&&this.managers.appMessagesManager.getDiscussionMessage(this.peerId,i.mid).then((e=>{this.chat.appImManager.setInnerPeer({peerId:s.channel_id.toPeerId(!0),type:"discussion",threadId:e.mid})}))}return}const l=(0,be.Z)(i,"is-via");if(l){const t=l.querySelector(".peer-title");if(i===t||(0,Ne.Z)(i,t)){const i=t.innerText+" ";return this.managers.appDraftsManager.setDraft(this.peerId,this.chat.threadId,i),void(0,Le.Z)(e)}}const h=(0,be.Z)(i,"peer-title")||(0,ye.Z)(i,"AVATAR-ELEMENT")||(0,Be.Z)(i,"data-saved-from");if(h&&h!==s){i=h||i;const e=i.dataset.peerId||i.getAttribute("peer")||i.peerId,t=i.dataset.savedFrom;if("string"==typeof e||t)if(t){const[e,n]=t.split("_");if(i.classList.contains("is-receipt-link")){const t=yield this.managers.appMessagesManager.getMessageByPeer(e.toPeerId(),+n);if(t){const e=yield this.managers.appPaymentsManager.getInputInvoiceByPeerId(this.peerId,+s.dataset.mid);new Hi(t,e,void 0,!0)}}else this.chat.appImManager.setInnerPeer({peerId:e.toPeerId(),lastMsgId:+n})}else{const t=e.toPeerId();t!==m.NM?this.chat.appImManager.setInnerPeer({peerId:t}):(0,we.Am)(L.ZP.format("HidAccount",!0))}return}if(s.classList.contains("sticker")&&i.parentElement.classList.contains("attachment")){const e=+s.dataset.mid,i=null===(t=(yield this.chat.getMessage(e)).media)||void 0===t?void 0:t.document;return void((null==i?void 0:i.stickerSetInput)&&new P.Z(i.stickerSetInput).show())}const u=(0,be.Z)(i,"document-with-thumb");if("IMG"===i.tagName&&!i.classList.contains("emoji")&&!i.classList.contains("document-thumb")||i.classList.contains("album-item")||"VIDEO"===i.tagName&&!s.classList.contains("round")||u&&!u.querySelector(".preloader-container")||i.classList.contains("canvas-thumbnail")){const t=(0,be.Z)(i,"album-item")||(0,be.Z)(i,"document-container"),n=(t||s).querySelector(".preloader-container");if(n)return(0,C.tH)(n),void(0,Le.Z)(e);(0,Le.Z)(e);const a=+(t||s).dataset.mid,o=yield this.chat.getMessage(a);if(!o)return void this.log.warn("no message by messageId:",a);const r="webpage",d=s.classList.contains(r),l=u?e=>Fe.Z.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),c=[],h=d?[a]:(yield Promise.all(Object.keys(this.bubbles).map((e=>+e)).map((e=>vs(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e),i=(0,bt.Z)(t);return i&&l(i)&&e})))))).filter(Boolean).sort(((e,t)=>e-t));h.forEach((e=>{let t;u?t=".document-container":(t=".album-item video, .album-item img, .preview video, .preview img, ",t+=this.bubbles[e].classList.contains("with-media-tail")?".bubble__media-container":".attachment video, .attachment img");const i=Array.from(this.bubbles[e].querySelectorAll(t)),s=new Set;if(u)i.forEach((e=>{c.push({element:e.querySelector(".document-ico"),mid:+e.dataset.mid,peerId:this.peerId})}));else{const t=!!this.bubbles[e].querySelector(".media-container-aspecter");i.forEach((i=>{if(t&&!(0,be.Z)(i,"media-container-aspecter"))return;const n=(0,be.Z)(i,"album-item"),a=n||i.parentElement;s.has(a)||(s.add(a),c.push({element:i,mid:n?+n.dataset.mid:e,peerId:this.peerId}))}))}})),c.sort(((e,t)=>e.mid-t.mid));const p=c.findIndex((e=>e.mid===a));return ge.ZP&&this.log("open mediaViewer single with ids:",h,p,c),c[p]?void(new Fe.Z).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:u?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!d,isScheduled:"scheduled"===this.chat.type}).openMedia(o,c[p].element,0,!0,c.slice(0,p),c.slice(p+1)):void this.log("no target for media viewer!",i)}if(-1===["IMG","DIV","SPAN"].indexOf(i.tagName)&&(i=(0,ye.Z)(i,"DIV")),-1!==["DIV","SPAN"].indexOf(i.tagName)){if(i.classList.contains("goto-original")){const e=s.dataset.savedFrom,[t,i]=e.split("_");return void this.chat.appImManager.setInnerPeer({peerId:t.toPeerId(),lastMsgId:+i})}if(i.classList.contains("forward")){const e=+s.dataset.mid,t=yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,e);return void new M.Z({[this.peerId]:yield this.managers.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!(0,be.Z)(e.target,"reply")}catch(e){}if(t&&s.classList.contains("is-reply")){const e=+s.dataset.mid;this.followStack.push(e);const t=yield this.chat.getMessage(e),i=t.reply_to.reply_to_peer_id?(0,R.Z)(t.reply_to.reply_to_peer_id):this.peerId,n=t.reply_to.reply_to_msg_id;this.chat.appImManager.setInnerPeer({peerId:i,lastMsgId:n,type:this.chat.type,threadId:this.chat.threadId})}}})),this.onScroll=(e,t,i)=>{var s,n,a,o,r;if(this.isHeavyAnimationInProgress){if(null===(s=this.sliceViewportDebounced)||void 0===s||s.clearTimeout(),this.scrolledDown&&!e)return}else null===(n=this.chat.topbar.pinnedMessage)||void 0===n||n.setCorrectIndexThrottled(this.scrollable.lastScrollDirection),null===(a=this.sliceViewportDebounced)||void 0===a||a.call(this),this.setStickyDateManually();if(t&&t.distanceToEnd<300&&this.scrolledDown)return;const d=i?0:null!==(o=null==t?void 0:t.distanceToEnd)&&void 0!==o?o:this.scrollable.getDistanceToEnd();(0!==this.scrollable.lastScrollDirection&&d>0||t||i)&&(this.isScrollingTimeout?clearTimeout(this.isScrollingTimeout):this.chatInner.classList.contains("is-scrolling")||this.chatInner.classList.add("is-scrolling"),this.isScrollingTimeout=window.setTimeout((()=>{this.chatInner.classList.remove("is-scrolling"),this.isScrollingTimeout=0}),1350+(null!==(r=null==t?void 0:t.duration)&&void 0!==r?r:0))),d<300&&(i||this.scrollable.loadedAll.bottom||this.chat.setPeerPromise||!this.peerId)?(this.container.classList.add("scrolled-down"),this.scrolledDown=!0):this.container.classList.contains("scrolled-down")&&(this.container.classList.remove("scrolled-down"),this.scrolledDown=!1)},this.processBatch=(...e)=>vs(this,void 0,void 0,(function*(){var t,i,s;let[n,a,o]=e;const r=e=>e.filter((e=>e&&this.bubbles[e.bubble.dataset.mid]===e.bubble));n=r(n),o("messages rendered");const d=null===(t=n[0])||void 0===t?void 0:t.reverse,{groups:l,avatarPromises:c}=this.groupBubbles(n.filter((e=>e.updatePosition))),h=n.reduce(((e,t)=>{const i=performance.now(),s=t.promises.slice(),n=s.map((e=>vs(this,void 0,void 0,(function*(){return yield e,performance.now()-i}))));return Promise.all(n).then((e=>{o.groupCollapsed("media message time",performance.now()-i,t,e),e.forEach(((e,t)=>{o("media message time",e,t,s[t])})),o.groupEnd()})),e.push(...t.promises),e}),[]);h.push(...c),o("media promises to call",h,n,this.isHeavyAnimationInProgress),yield a(Promise.all([...h,this.setUnreadDelimiter()]).catch(Ye.Z)),yield a((0,fe.AD)()),o("media promises end"),n=r(n);const{restoreScroll:u,scrollSaver:p}=this.prepareToSaveScroll(d);null===(i=this.messagesQueueOnRenderAdditional)||void 0===i||i.call(this),this.ejectBubbles();for(const[e,t]of this.bubblesToReplace){if(p&&p.replaceSaved(t,e),!n.find((t=>t.bubble===e)))continue;const i=this.bubbleGroups.getItemByBubble(e);i?(i.mounted=!1,l.includes(i.group)||l.push(i.group)):this.log.error("NO ITEM BY BUBBLE",e),this.bubblesToReplace.delete(e)}this.chat.selection.isSelecting&&n.forEach((({bubble:e})=>{this.chat.selection.toggleElementCheckbox(e,!0)})),n.forEach((({message:e,bubble:t,updatePosition:i})=>{e.pFlags.local&&i&&this.chatInner[e.pFlags.sponsored?"append":"prepend"](t)})),this.bubbleGroups.mountUnmountGroups(l),null===(s=this.updatePlaceholderPosition)||void 0===s||s.call(this),null==u||u()})),this.onDatePick=e=>{const t=this.peerId;this.managers.appMessagesManager.requestHistory(t,0,2,-1,e,this.chat.threadId).then((e=>{var i;(null===(i=null==e?void 0:e.messages)||void 0===i?void 0:i.length)?this.peerId===t&&this.chat.setMessageId(e.messages[0].mid):this.log.error("no history!")}))},this.log=this.chat.log,this.listenerSetter=new ce.Z,this.constructBubbles(),this.batchProcessor=new fs.s({log:this.log,process:this.processBatch,possibleError:Es}),this.bubbleGroups=new w(this.chat),this.preloader=new Z.Z({cancelable:!1}),this.lazyLoadQueue=new le.Z(void 0,!0),this.lazyLoadQueue.queueId=++Cs,this.listenerSetter.add(d.Z)("history_update",(({storageKey:e,sequential:t,message:i})=>vs(this,void 0,void 0,(function*(){if(this.chat.messagesStorageKey!==e||"scheduled"===this.chat.type)return;const{mid:s}=i,n=this.bubbles[s];if(!n)return;if(this.renderNewPromises.size&&(yield Promise.all(Array.from(this.renderNewPromises))),this.messagesQueuePromise&&(yield this.messagesQueuePromise),this.bubbles[s]!==n)return;const a=this.bubbleGroups.getItemByBubble(n);if(!a)return;if(a.mid===s)return;if(t){const e=a.group,o=this.bubbleGroups.createItem(n,i),r=this.bubbleGroups.itemsArr.slice();(0,h.Z)(r,a);const l=this.bubbleGroups.findGroupSiblingByItem(o,r);if(e===(null==l?void 0:l.group)||e===this.bubbleGroups.getLastGroup()&&1===e.items.length&&o.dateTimestamp===a.dateTimestamp||this.peerId===d.Z.myId&&t&&o.dateTimestamp===a.dateTimestamp)return void this.bubbleGroups.changeBubbleMid(n,s)}this.bubbleGroups.removeAndUnmountBubble(n);const{groups:o}=this.groupBubbles([{bubble:n,message:i}]);this.bubbleGroups.mountUnmountGroups(o),this.scrollingToBubble&&this.scrollToEnd()})))),this.listenerSetter.add(d.Z)("dialog_flush",(({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map((e=>+e)))})),this.listenerSetter.add(d.Z)("message_sent",(e=>vs(this,void 0,void 0,(function*(){const{storageKey:t,tempId:i,tempMessage:s,mid:n,message:a}=e;if(this.chat.messagesStorageKey!==t)return;const o=this.bubbles,r=o[i];if(r){const e=o[i];o[n]=e,e.dataset.mid=""+n,delete o[i],(0,fe.T2)((()=>{const t=+e.dataset.mid;o[t]===e&&e.classList.contains("is-outgoing")&&(e.classList.remove("is-sending","is-outgoing"),e.classList.add(this.peerId===d.Z.myId&&"scheduled"!==this.chat.type||!this.unreadOut.has(t)?"is-read":"is-sent"))}))}if(this.unreadOut.has(i)&&(this.unreadOut.delete(i),this.unreadOut.add(n)),"scheduled"===this.chat.type&&(Date.now()/1e3|0)>=s.date-10&&this.deleteMessagesByIds([n]),!r)return;let l,c;const h=a.grouped_id;if(h){l=yield this.managers.appMessagesManager.getMessagesByAlbum(h);const e=l.map((({mid:e})=>e));if(!e.length||Ps(e)!==n||o[n]!==r)return;if(o[n]!==r)return;c=Array.from(r.querySelectorAll(".grouped-item")).map((e=>+e.dataset.mid))}else l=[a],c=[i];const u=Array.from(r.querySelectorAll("reactions-element"));u.length&&u.forEach((e=>{e.changeMessage(a)})),l.forEach(((e,t)=>{var i,n,a,o,l;if(!e)return;const u=c[t],p=e.mid,f=r.querySelector(`.document-container[data-mid="${p}"]`)||r;if("message"!==e._)return;if(e.replies){const t=r.querySelector("replies-element");t&&(t.message=e,t.init())}const m=null!==(i=e.media)&&void 0!==i?i:{},g=m.document,v=m.poll,b=m.webpage;if(g){const t=f.querySelector(`.document-container[data-mid="${u}"] .document`);if(t){const i=(0,be.Z)(t,"document-container");!(null===(o=null===(a=null===(n=s.media)||void 0===n?void 0:n.document)||void 0===a?void 0:a.thumbs)||void 0===o?void 0:o.length)&&(null===(l=g.thumbs)||void 0===l?void 0:l.length)&&(0,pe.e9)().then((()=>vs(this,void 0,void 0,(function*(){const i=t.querySelector(".time"),s=yield(0,Yi.Z)({message:e,fontSize:d.Z.settings.messagesTextSize});t.replaceWith(s),i&&(s.querySelector(".document")||s).append(i)})))),i&&(i.dataset.mid=""+p)}const i=f.querySelector(`audio-element[data-mid="${u}"], .document[data-doc-id="${u}"], .media-round[data-mid="${u}"]`);i&&(i instanceof he.ZP||i.classList.contains("media-round")?(i.dataset.mid=""+e.mid,delete i.dataset.isOutgoing,i.message=e,i.onLoad(!0)):(i.dataset.docId=""+g.id,i.doc=g))}else if(v){const t=f.querySelector("poll-element");t&&(t.message=e,t.setAttribute("poll-id",""+v.id),t.setAttribute("message-id",""+p))}else b&&!f.querySelector(".web")&&(0,pe.e9)().then((()=>{this.safeRenderMessage(e,!0,f),this.scrollToBubbleIfLast(f)}));if(h){const e=f.querySelector(`.grouped-item[data-mid="${u}"]`)||f;e&&(e.dataset.mid=""+p)}}))})))),this.listenerSetter.add(d.Z)("message_edit",(({storageKey:e,message:t})=>vs(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t.mid];i&&(yield(0,pe.e9)(),this.bubbles[t.mid]===i&&this.safeRenderMessage(t,!0,i))})))),this.listenerSetter.add(d.Z)("message_error",(({storageKey:e,tempId:t})=>vs(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t];i&&(yield(0,pe.e9)(),this.bubbles[t]===i&&(i.classList.remove("is-outgoing"),i.classList.add("is-error")))})))),this.listenerSetter.add(d.Z)("album_edit",(({peerId:e,messages:t,deletedMids:i})=>{if(e!==this.peerId)return;const s=t.map((({mid:e})=>e)),n=Ps(s.concat(Array.from(i))),a=this.bubbles[n];if(!a)return;const o=Ps(s),r=t.find((e=>e.mid===o));this.safeRenderMessage(r,!0,a)})),this.listenerSetter.add(d.Z)("messages_reactions",(e=>vs(this,void 0,void 0,(function*(){if("scheduled"===this.chat.type)return;let t;const i=e.map((({message:e,changedResults:t})=>vs(this,void 0,void 0,(function*(){if(this.peerId!==e.peerId)return;const i=yield this.getMountedBubble(e.mid,e);return i?{bubble:i.bubble,message:e,changedResults:t}:void 0}))));(yield Promise.all(i)).filter(Boolean).forEach((({bubble:e,message:i,changedResults:s})=>{t||(t=this.createScrollSaver(!1),t.save());const n=i.peerId+"_"+i.mid,a=st.get(n);if(a)for(const e of a)e.update(i,s);else{if(!i.reactions||!i.reactions.results.length)return;this.appendReactionsElementToBubble(e,i,i,s)}})),t&&t.restore()})))),this.listenerSetter.add(d.Z)("messages_downloaded",(({peerId:e,mids:t})=>vs(this,void 0,void 0,(function*(){const i=this.getMiddleware();yield(0,pe.e9)(),i()&&t.forEach((t=>{this.needUpdate;const i=[];(0,g.Z)(this.needUpdate,((s,n)=>{s.replyMid===t&&s.replyToPeerId===e&&(this.needUpdate.splice(n,1)[0],i.push(s))})),i.forEach((({mid:e,replyMid:t,replyToPeerId:i})=>vs(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(!t)return;const i=yield this.chat.getMessage(e);de.setReply({chat:this.chat,bubble:t,message:i})}))))}))})))),(0,Gi.Z)({listenTo:this.scrollable.container,listenerSetter:this.listenerSetter,findTarget:e=>{const t=e.target;return t.closest(".attachment.media-sticker-wrapper")||(0,be.Z)(t,"attachment")&&t.closest(".custom-emoji")}}),(0,C.fc)(this.scrollable.container,this.onBubblesClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.scrollable.container)("mousedown",(e=>{if(0!==e.button)return;const t=(0,ye.Z)(e.target,"CODE");if(t){(0,Le.Z)(e),i=t,(0,ht.T)(i.textContent);const s=e=>{(0,Le.Z)(e),(0,we.bC)({langPackKey:"TextCopied",onClose:()=>{n()}})},n=(0,C.fc)(window,s,{listenerSetter:this.listenerSetter,once:!0,capture:!0})}else var i})),this.stickyIntersector=new k.Z(this.scrollable.container,((e,t)=>{for(const i in this.dateMessages){const s=this.dateMessages[i];if(s.container===t){const t=s.div;t.classList.toggle("is-sticky",e),e&&(this.previousStickyDate=t);break}}this.previousStickyDate})),x.IS_SAFARI||(this.sliceViewportDebounced=(0,Te.Z)(this.sliceViewport.bind(this),3e3,!1,!0)),(0,pe.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),i=this.getMiddleware()}),(()=>{this.isHeavyAnimationInProgress=!1,(null==i?void 0:i())&&this.lazyLoadQueue.unlockAndRefresh(),i=null}),this.listenerSetter)}constructBubbles(){const e=this.container=document.createElement("div");e.classList.add("bubbles","scrolled-down"),(this.chatInner=document.createElement("div")).classList.add("bubbles-inner"),this.setScroll(),e.append(this.scrollable.container)}attachContainerListeners(){const e=this.container;if(this.chat.contextMenu.attachTo(e),this.chat.selection.attachListeners(e,new ce.Z),ge.ZP&&this.listenerSetter.add(e)("dblclick",(e=>vs(this,void 0,void 0,(function*(){const t=(0,be.Z)(e.target,"grouped-item")||(0,be.Z)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",yield this.chat.getMessage(e)),this.highlightBubble(t)}})))),x.IS_MOBILE){if(c.Z){const t="is-gesturing-reply",i=64,s=.75*i;let n,a,o,r=!1;(0,Re.Z)({element:e,verifyTouchTarget:e=>vs(this,void 0,void 0,(function*(){if("pinned"===this.chat.type||this.chat.selection.isSelecting||!(yield this.chat.canSend()))return!1;if(n=(0,be.Z)(e.target,"bubble"),n){try{const e=n.parentElement.querySelector(".bubbles-group-avatar");e&&(0,ze.Z)(e,n)&&(o=e)}catch(e){}(0,De.Z)({element:n,className:t,forwards:!0,duration:250}),n.offsetLeft,a?(a.classList.remove("is-visible"),a.style.opacity=""):(a=document.createElement("span"),a.classList.add("tgico-reply_filled","bubble-gesture-reply-icon")),n.append(a)}return!!n})),onSwipe:e=>{r=e>=s,r&&!a.classList.contains("is-visible")&&a.classList.add("is-visible"),a.style.opacity=""+Math.min(1,e/s);const t=`translateX(${-Math.max(0,Math.min(i,e))}px)`;n.style.transform=t,o&&(o.style.transform=t),(0,Lt.s)()},onReset:()=>{const e=n,i=o;n=o=void 0,(0,De.Z)({element:e,className:t,forwards:!1,duration:250,onTransitionEnd:()=>{a.parentElement===e&&(a.classList.remove("is-visible"),a.remove())}}),(0,fe.T2)((()=>{if(e.style.transform="",i&&(i.style.transform=""),r){const{mid:t}=e.dataset;this.chat.input.initMessageReply(+t),r=!1}}))},listenerOptions:{capture:!0}})}}else this.listenerSetter.add(e)("dblclick",(e=>vs(this,void 0,void 0,(function*(){if("pinned"===this.chat.type||this.chat.selection.isSelecting||!(yield this.chat.canSend()))return;const t=e.target,i=t.classList.contains("bubble")?t:t.classList.contains("document-selection")?t.parentElement:null;if(i&&!i.classList.contains("bubble-first")){const e=+i.dataset.mid;if((yield this.chat.getMessage(e)).pFlags.is_outgoing)return;this.chat.input.initMessageReply(e)}}))))}constructPeerHelpers(){this.listenerSetter.add(d.Z)("history_append",(({storageKey:e,message:t})=>vs(this,void 0,void 0,(function*(){e===this.chat.messagesStorageKey&&"scheduled"!==this.chat.type&&(d.Z.settings.animationsEnabled&&(this.updateGradient=!0),this.scrollable.loadedAll.bottom?this.renderNewMessage(t,!0):this.chat.setMessageId())})))),this.listenerSetter.add(d.Z)("history_multiappend",(e=>{this.peerId===e.peerId&&"scheduled"!==this.chat.type&&this.renderNewMessage(e)})),this.listenerSetter.add(d.Z)("history_delete",(({peerId:e,msgs:t})=>{e===this.peerId&&"scheduled"!==this.chat.type&&this.deleteMessagesByIds(Array.from(t))})),this.listenerSetter.add(d.Z)("dialog_unread",(({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),(0,pe.e9)().then((()=>{this.updateUnreadByDialog()})))})),this.listenerSetter.add(d.Z)("dialogs_multiupdate",(e=>{e.has(this.peerId)&&"scheduled"!==this.chat.type&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(d.Z)("dialog_notify_settings",(e=>{this.peerId===e.peerId&&"scheduled"!==this.chat.type&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(d.Z)("chat_update",(e=>vs(this,void 0,void 0,(function*(){const{peerId:t}=this;if(t!==e.toPeerId(!0))return;const i=yield this.managers.appChatsManager.getChat(e);this.chatInner.classList.contains("has-rights")!==(yield this.chat.canSend())&&(yield Promise.all([this.finishPeerChange(),this.chat.input.finishPeerChange()])).forEach((e=>e())),!!i.pFlags.forum!==this.chat.isForum&&"chat"===this.chat.type&&(this.chat.peerId=0,this.chat.appImManager.setPeer({peerId:t}))})))),this.listenerSetter.add(d.Z)("history_reload",(e=>{if(e!==this.peerId)return;const t=(0,rt.Z)(this.bubbles,"desc").filter((e=>e>0)),i=this.getMiddleware();this.managers.appMessagesManager.reloadMessages(this.peerId,t).then((e=>{if(!i())return;const s=[];e.forEach(((e,i)=>{const n=t[i];if(e){const t=this.bubbles[e.mid];if(!t)return;this.safeRenderMessage(e,!0,t)}else s.push(n)})),this.deleteMessagesByIds(s),this.setLoaded("top",!1),this.setLoaded("bottom",!1),this.scrollable.checkForTriggers()}))})),this.listenerSetter.add(d.Z)("settings_updated",(({key:e})=>vs(this,void 0,void 0,(function*(){if("settings.emoji.big"===e){const e=this.getMiddleware(),t=(0,rt.Z)(this.bubbles,"desc").map((e=>vs(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(t.classList.contains("can-have-big-emoji"))return{bubble:t,message:yield this.chat.getMessage(e)}})))),i=yield Promise.all(t);if(!e())return;i.filter(Boolean).forEach((({bubble:e,message:t})=>{this.bubbles[t.mid]===e&&this.safeRenderMessage(t,!0,e)}))}})))),this.listenerSetter.add(d.Z)("messages_views",(e=>{"scheduled"!==this.chat.type&&(0,fe.T2)((()=>{let t;for(const{peerId:i,views:s,mid:n}of e){if(this.peerId!==i)continue;const e=this.bubbles[n];if(!e)continue;const a=Array.from(e.querySelectorAll(".post-views"));if(!a.length)continue;const o=(0,D.Z)(s,1);let r=!1;a.forEach((e=>{(r||e.textContent!==o)&&(t||(t=this.createScrollSaver(!0),t.save()),r=!0,e.textContent=o)}))}null==t||t.restore()}))})),this.observer=new lt({root:this.scrollable.container}),this.sendViewCountersDebounced=(0,Te.Z)((()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.managers.appMessagesManager.incrementMessageViews(this.peerId,e)}),1e3,!1,!0),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e,mids:t,pinned:i})=>{"pinned"===this.chat.type&&e===this.peerId&&t&&(i||this.deleteMessagesByIds(t))}));const e=()=>vs(this,void 0,void 0,(function*(){this.chat.topbar.setTitle((yield this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size)}));this.listenerSetter.add(d.Z)("scheduled_new",(t=>{"scheduled"===this.chat.type&&t.peerId===this.peerId&&(this.renderNewMessage(t),e())})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:t,mids:i})=>{"scheduled"===this.chat.type&&t===this.peerId&&(this.deleteMessagesByIds(i),e())}))}get peerId(){return this.chat.peerId}get messagesQueuePromise(){return this.batchProcessor.queuePromise}createScrollSaver(e=!0){return new ot(this.scrollable,".bubble:not(.is-date)",e)}createResizeObserver(){if(!("ResizeObserver"in window)||this.resizeObserver)return;const e=this.scrollable.container;let t=0,i=!1,s=!1,n=0,a=0,o=0;const r=()=>{const r=e.offsetHeight,d=this.scrollable.isScrolledDown;r===t||s&&d||(a+=t-r),a&&this.scrollable.setScrollTopSilently(this.scrollable.scrollTop+Math.round(a)),t=r,n=0,o=0,a=0,i=!1,s=!1},d=e=>{o&&window.cancelAnimationFrame(o),o=window.requestAnimationFrame(e?r:()=>{o=window.requestAnimationFrame(r)})};(this.resizeObserver=new ResizeObserver((e=>{if(s)return void d(!1);const o=e[0].contentRect.height;if(!t)return void(t=o);const r=t-o;let l=r+a;const c=l%1;if(l-=c,!i&&(i=!0,r<0&&this.scrollable.isScrolledDown))return a=-r,s=!0,void d(!1);if(n+=l,l){const e=this.scrollable.scrollTop+l;this.scrollable.setScrollTopSilently(e)}d(!1),a=c,t=o}))).observe(e)}destroyResizeObserver(){const e=this.resizeObserver;e&&(e.disconnect(),this.resizeObserver=void 0)}setReactionsHoverListeners(){this.listenerSetter.add(Et.Z)("toggle",this.unhoverPrevious),this.listenerSetter.add(Ct.Z)("change",this.unhoverPrevious),this.listenerSetter.add(this.chat.selection)("toggle",this.unhoverPrevious),this.listenerSetter.add(this.container)("mousemove",this.onBubblesMouseMove)}setHoverVisible(e,t){e.parentElement&&e.parentElement.classList.toggle("hover-reaction-visible",t),(0,De.Z)({element:e,className:"is-visible",forwards:t,duration:200,onTransitionEnd:t?void 0:()=>{e.remove()},useRafs:2})}setStickyDateManually(){}getRenderedLength(){return Object.keys(this.bubbles).length-this.skippedMids.size}onUnreadedInViewport(e,t){this.unreadedSeen.add(t),this.observer.unobserve(e,this.unreadedObserverCallback),this.unreaded.delete(e),this.readUnreaded()}readUnreaded(){if(this.readPromise)return;const e=this.getMiddleware();this.readPromise=St.Z.getFocusPromise().then((()=>vs(this,void 0,void 0,(function*(){if(!e())return;let t=Math.max(...Array.from(this.unreadedSeen));if(this.scrollable.loadedAll.bottom){const e=Math.max(...Object.keys(this.bubbles).map((e=>+e)));t>=e&&(t=Math.max((yield this.chat.getHistoryMaxId())||0,t))}this.unreaded.forEach(((e,i)=>{e<=t&&this.onUnreadedInViewport(i,e)}));const i=[];for(const e of this.unreadedSeen)vt(yield this.chat.getMessage(e))&&i.push(e);return this.managers.appMessagesManager.readMessages(this.peerId,i),this.unreadedSeen.clear(),ge.ZP&&this.log("will readHistory by maxId:",t),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId).catch((e=>{this.log.error("readHistory err:",e),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId)})).finally((()=>{e()&&(this.readPromise=void 0,this.unreadedSeen.size&&this.readUnreaded())}))}))))}onGoDownClick(){return vs(this,void 0,void 0,(function*(){if(!this.followStack.length)return void this.chat.setMessageId();const e=this.getMiddleware(),t=this.followStack.slice(),i=yield Promise.all(t.map((e=>this.chat.getMessage(e))));if(!e())return;t.forEach(((e,t)=>{const s=i[t],n=this.bubbles[e];let a=!0;if(n){const e=n.getBoundingClientRect();a=Ae.Z.height/2>e.top}else s&&(a=!1);a&&this.followStack.splice(this.followStack.indexOf(e),1)})),this.followStack.sort(((e,t)=>t-e));const s=this.followStack.pop();this.chat.setMessageId(s)}))}getBubbleByPoint(e){let t=Se(this.scrollable.container,e,"center");return t&&(t=(0,be.Z)(t,"bubble")),t}getGroupedBubble(e){return vs(this,void 0,void 0,(function*(){const t=yield this.managers.appMessagesManager.getMidsByAlbum(e);for(const e of t)if(this.bubbles[e]&&!this.skippedMids.has(e))return{bubble:this.bubbles[e],mid:e}}))}getBubbleGroupedItems(e){return Array.from(e.querySelectorAll(".grouped-item"))}getMountedBubble(e,t){return vs(this,void 0,void 0,(function*(){if(void 0===t&&(t=yield this.chat.getMessage(e)),!t)return;const i=t.grouped_id;if(i){const t=yield this.getGroupedBubble(i);if(t)return t.bubble=t.bubble.querySelector(`.document-container[data-mid="${e}"]`)||t.bubble,t}const s=this.bubbles[e];return s?{bubble:s,mid:e}:void 0}))}findNextMountedBubbleByMsgId(e,t){const i=(0,rt.Z)(this.bubbles,t?"desc":"asc");let s;s=t?t=>te{var t;return!!s(e)&&!!(null===(t=this.bubbles[e])||void 0===t?void 0:t.parentElement)}));return this.bubbles[n]}loadMoreHistory(e,t=!1){if(!this.peerId||this.chat.setPeerPromise||this.isHeavyAnimationInProgress||e&&(this.getHistoryTopPromise||this.scrollable.loadedAll.top)||!e&&(this.getHistoryBottomPromise||this.scrollable.loadedAll.bottom))return;const i=Object.keys(this.bubbles).map((e=>+e)).filter((e=>e>0&&!this.skippedMids.has(e))).sort(((e,t)=>e-t));i.length||i.push(0),e?(ge.ZP&&this.log("Will load more (up) history by id:",i[0],"maxId:",i[i.length-1],t),this.getHistory1(i[0],!0,void 0,void 0,t)):(ge.ZP&&this.log("Will load more (down) history by id:",i[i.length-1],t),this.getHistory1(i[i.length-1],!1,!0,void 0,t))}setScroll(){this.scrollable&&this.destroyScrollable(),this.scrollable=new T.ZP(null,"IM",300),this.setLoaded("top",!1,!1),this.setLoaded("bottom",!1,!1),this.scrollable.container.append(this.chatInner),this.scrollable.onAdditionalScroll=this.onScroll,this.scrollable.onScrolledTop=()=>this.loadMoreHistory(!0),this.scrollable.onScrolledBottom=()=>this.loadMoreHistory(!1),c.Z}updateUnreadByDialog(){return vs(this,void 0,void 0,(function*(){const e=yield this.chat.getHistoryStorage(),t=this.peerId===d.Z.myId?e.readMaxId:e.readOutboxMaxId;for(const e of this.unreadOut)if(e>0&&e<=t){const t=this.bubbles[e];if(t){if(this.unreadOut.delete(e),t.classList.contains("is-outgoing")||t.classList.contains("is-error"))continue;t.classList.remove("is-sent","is-sending","is-outgoing"),t.classList.add("is-read")}}}))}destroyBubble(e,t=+e.dataset.mid){e.middlewareHelper.destroy(),this.bubbles[t]===e&&delete this.bubbles[t],this.skippedMids.delete(t),this.firstUnreadBubble===e&&(this.firstUnreadBubble=null),this.bubbleGroups.removeAndUnmountBubble(e),this.observer&&(this.observer.unobserve(e,this.unreadedObserverCallback),this.unreaded.delete(e),this.observer.unobserve(e,this.viewsObserverCallback),this.viewsMids.delete(t),this.observer.unobserve(e,this.stickerEffectObserverCallback))}deleteMessagesByIds(e,t=!0,i){let n=!1;e.forEach((e=>{const t=this.bubbles[e];t&&(this.destroyBubble(t,e),n=!0)})),n&&(this.scrollable.ignoreNextScrollEvent(),t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),s.Z.checkAnimations(!1,this.chat.animationGroup),this.deleteEmptyDateGroups(),i||this.scrollable.onScroll())}pollExtendedMediaMessages(){const e=Array.from(this.extendedMediaMessages);return this.managers.appMessagesManager.getExtendedMedia(this.peerId,e)}setExtendedMediaMessagesPollInterval(){!this.pollExtendedMediaMessagesPromise&&this.extendedMediaMessages.size&&(this.pollExtendedMediaMessagesPromise=(0,at.Z)(3e4).then((()=>this.pollExtendedMediaMessages())).then((()=>this.setExtendedMediaMessagesPollInterval())))}setTopPadding(e=this.getMiddleware()){let t,i=!1;if(!this.isTopPaddingSet&&"scheduled"!==this.chat.type){const{clientHeight:e,scrollHeight:s}=this.scrollable.container;i=e===s,i&&(t=this.chatInner,t.style.paddingTop=e+"px",this.scrollable.setScrollTopSilently(s),this.isTopPaddingSet=!0)}return{isPaddingNeeded:i,unsetPadding:i?()=>{e()&&i&&(t.style.paddingTop="",this.isTopPaddingSet=!1)}:void 0}}renderNewMessage(e,t){const i=this._renderNewMessage(e,t);return this.renderNewPromises.add(i),i.catch(Ye.Z).finally((()=>{this.renderNewPromises.delete(i)})),i}_renderNewMessage(e,t){return vs(this,void 0,void 0,(function*(){if(!this.scrollable.loadedAll.bottom){const t=this.chat.setPeerPromise;if(t){const i=this.getMiddleware();t.then((()=>vs(this,void 0,void 0,(function*(){if(!i())return;const t=yield this.chat.getMessage(e.mid);i()&&this.renderNewMessage(t)}))))}return}if(this.chat.threadId&&(0,b.Z)(e,this.chat.isForum)!==this.chat.threadId)return;if(this.bubbles[e.mid])return;t||(t=this.scrolledDown&&(!this.scrollingToBubble||this.scrollingToBubble===this.getLastBubble()||this.scrollingToBubble===this.chatInner));const i=this.getMiddleware(),{isPaddingNeeded:s,unsetPadding:n}=this.setTopPadding(i),a=this.performHistoryResult({history:[e]},!1);return t&&a.then((()=>{if(!i())return;let t;"scheduled"===this.chat.type&&(t=this.bubbles[e.mid]);const a=t?this.scrollToBubbleEnd(t):this.scrollToEnd();s&&a.then(n)})),a}))}getLastBubble(){var e;const t=this.bubbleGroups.getLastGroup();return null===(e=null==t?void 0:t.lastItem)||void 0===e?void 0:e.bubble}scrollToBubble(e,t,i,s){const n=(0,be.Z)(e,"bubble");let a;if(e.parentElement||this.log.error("element is not connected",n),n&&"end"!==t){const e=this.bubbleGroups.getItemByBubble(n);e&&e.group.firstItem===e&&(0,Me.Z)(e.group.container)===(this.stickyIntersector?Ls:1)&&(a=e.group.container.parentElement)}const r=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper"),d=this.scrollable.scrollIntoViewNew({element:e,position:t,margin:4,forceDirection:i,forceDuration:s,axis:"y",getNormalSize:r?({rect:e})=>{let t=Ae.Z.height;return t-=this.container.offsetTop,t-=o.Z.isMobile||Ae.Z.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a,startCallback:e=>{if(this.onScroll(!0,e),this.updateGradient){const{gradientRenderer:t}=this.chat;null==t||t.toNextPosition(e.getProgress),this.updateGradient=void 0}}});return i===ue.f.Static&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop),d}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return vs(this,void 0,void 0,(function*(){if(e){this.scrollingToBubble=e;const t=this.getMiddleware();if(yield this.scrollToBubble(e,"end",void 0,void 0),!t())return;this.scrollingToBubble=void 0}}))}scrollToBubbleIfLast(e){return vs(this,void 0,void 0,(function*(){if(this.getLastBubble()===e)return this.scrollToEnd()}))}highlightBubble(e){const t="highlightTimeout";e.dataset[t]&&(clearTimeout(+e.dataset[t]),e.classList.remove("is-highlighted"),e.offsetWidth),e.classList.add("is-highlighted"),e.dataset[t]=""+setTimeout((()=>{e.classList.remove("is-highlighted"),delete e.dataset[t]}),2e3)}createDateBubble(e,t=new Date(1e3*e)){let i;const s=new Date;s.setHours(0,0,0,0);const n="scheduled"===this.chat.type;if(s.getTime()===t.getTime())i=(0,L.ag)(n?"Chat.Date.ScheduledForToday":"Date.Today");else if(n&&e===ke)i=(0,L.ag)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};t.getFullYear()!==s.getFullYear()&&(e.year="numeric"),i=new L.ZP.IntlDateElement({date:t,options:e}).element,n&&(i=(0,L.ag)("Chat.Date.ScheduledFor",[i]))}const a=document.createElement("div");a.className="bubble service is-date";const o=document.createElement("div");o.classList.add("bubble-content");const r=document.createElement("div");return r.classList.add("service-msg"),r.append(i),o.append(r),a.append(o),a}getDateForDateContainer(e){const t=new Date(1e3*e);return t.setHours(0,0,0),{date:t,dateTimestamp:t.getTime()}}getDateContainerByTimestamp(e){var t;const{date:i,dateTimestamp:s}=this.getDateForDateContainer(e);let n=this.dateMessages[s];if(n)return n;const a=this.createDateBubble(e,i),o=this.createDateBubble(e,i);o.classList.add("is-fake");const r=document.createElement("section");r.className="bubbles-date-group",r.append(a,o),n=this.dateMessages[s]={div:a,container:r,firstTimestamp:i.getTime()};const d=(0,rt.Z)(this.dateMessages,"asc"),l=d.length;let c,h=0;for(;hthis.setPeerTempId===d,u=(0,It.Z)(h,Es);i||(yield u(this.chat.onChangePeer(e,u)));const p=this.chat.type;("scheduled"===p||this.chat.isRestricted)&&(o=0);const f=yield u(this.chat.getHistoryStorage()),g="pinned"===p?yield u(this.managers.appMessagesManager.getPinnedMessagesMaxId(n,this.chat.threadId)):null!==(t=f.maxId)&&void 0!==t?t:0,v=void 0!==o;let b,y,w,S=0;if(!v)if(i||(y=this.chat.appImManager.getChatSavedPosition(this.chat)),y);else if(g){S=yield u(this.managers.appMessagesManager.getReadMaxIdIfUnread(n,this.chat.threadId));const e=yield u(this.chat.getDialogOrTopic());if(!S||i||e&&1===e.unread_count)o=g;else{const e=f.history.findSliceOffset(S);e&&e.slice.isEnd(ve.D.Bottom)&&(w=e.slice[e.offset-25]||e.slice[0]||S),b=!v,o=S}}const C=o!==g;if(void 0===r&&(yield u(this.chat.isStartButtonNeeded()))&&(r=m.gZ),i){a&&o&&this.followStack.push(a);const e=yield u(this.getMountedBubble(o));if(e)return v?(this.scrollToBubble(e.bubble,"center"),this.highlightBubble(e.bubble),this.chat.dispatchEvent("setPeer",o,!1)):g&&!C&&(this.scrollToEnd(),this.chat.dispatchEvent("setPeer",o,!0)),void 0!==r&&this.chat.input.setStartParam(r),null}else this.peerId&&(this.lazyLoadQueue.queueId=++Cs,this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)),this.followStack.length=0,this.passEntities={messageEntityBotCommand:(yield u(this.managers.appPeersManager.isAnyGroup(n)))||this.chat.isBot};ge.ZP&&c("setPeer peerId:",n,f,o,g);const L=null!=w?w:C||"scheduled"===p||this.chat.isRestricted?0:g;let E=0;if(i){const e=this.getBubbleByPoint("bottom");e&&(E=+e.dataset.mid),E<=0&&(E=Math.max(...Object.keys(this.bubbles).map((e=>+e))))}else this.isFirstLoad=!0,this.destroyResizeObserver();const I=this.chatInner,M=this.emptyPlaceholderBubble;this.cleanup();const P=this.chatInner=document.createElement("div");i?(P.className=I.className,P.classList.remove("disable-hover","is-scrolling")):P.classList.add("bubbles-inner"),this.lazyLoadQueue.lock();const Z=i||g&&C||v,T=E>0&&(!o||Ethis.performHistoryResult({history:y.mids},!0))),cached:!0,waitPromise:Promise.resolve()}:yield u(this.getHistory1(o,!0,C,L)),this.setPeerCached=A.cached,c.warn("got history");const{promise:_,cached:F}=A;F||i||(yield u(this.chat.finishPeerChange(v,C,o,r)),this.scrollable.container.textContent="",this.preloader.attach(this.container)),s.Z.lockGroup(this.chat.animationGroup);const D=u(_).then((()=>vs(this,void 0,void 0,(function*(){var e;c.warn("promise fulfilled");const t=Z?yield u(o?this.getMountedBubble(o):{bubble:this.getLastBubble()}):void 0;F&&!i&&(c.warn("finishing peer change"),yield u(this.chat.finishPeerChange(v,C,o,r)),c.warn("finished peer change")),this.preloader.detach(),this.resolveLadderAnimation&&(this.resolveLadderAnimation(),this.resolveLadderAnimation=void 0),this.setPeerCached=void 0;const a=this.scrollable;if(a.lastScrollDirection=0,a.lastScrollPosition=0,(0,H.Z)(a.container,P),M&&this.cleanupPlaceholders(M),this.attachPlaceholderOnRender&&this.attachPlaceholderOnRender(),!v&&this.chat.isPinnedMessagesNeeded()&&(null===(e=this.chat.topbar.pinnedMessage)||void 0===e||e.setCorrectIndex(0)),this.container.classList.toggle("has-groups",!!Object.keys(this.dateMessages).length),c.warn("mounted chat",this.chatInner===P,this.chatInner.parentElement,performance.now()-l),s.Z.unlockGroup(this.chat.animationGroup),s.Z.checkAnimations(!1,this.chat.animationGroup),this.lazyLoadQueue.unlock(),y)a.setScrollTopSilently(y.top);else if(Z){let e;if(k)a.setScrollTopSilently(99999);else if(x){const t=this.setTopPadding();t.isPaddingNeeded&&(e=t.unsetPadding),a.setScrollTopSilently(0)}let s,n=b&&this.firstUnreadBubble||(null==t?void 0:t.bubble);if((null==n?void 0:n.parentElement)||(n=this.findNextMountedBubbleByMsgId(o,!1)||this.findNextMountedBubbleByMsgId(o,!0)),n){const e=this.getLastBubble(),t=b?"start":C||v||e!==n?"center":"end";s="end"===t&&e===n&&i?this.scrollToEnd():this.scrollToBubble(n,t,i?void 0:ue.f.Static),!b&&v&&this.highlightBubble(n)}e&&(s||Promise.resolve()).then((()=>{e()}))}else a.setScrollTopSilently(99999);this.onRenderScrollSet(),this.onScroll();const d=Promise.all([D,(0,pe.e9)()]);if(d.then((()=>{a.checkForTriggers()})),this.chat.dispatchEvent("setPeer",o,!C),Promise.all([this.setFetchReactionsInterval(d),this.setFetchHistoryInterval({afterSetPromise:d,lastMsgId:o,samePeer:i,savedPosition:y,topMessage:g})]).then((()=>{c("scrolledAllDown:",a.loadedAll.bottom),a.loadedAll.bottom&&g&&!this.unreaded.size&&this.onScrolledAllDown()})),"chat"===p&&!this.chat.isForumTopic){const e=yield u(this.managers.appMessagesManager.getDialogOnly(n));(null==e?void 0:e.pFlags.unread_mark)&&this.managers.appMessagesManager.markDialogUnread(n,!0)}})))).catch((e=>{throw c.error("setPeer promise error:",e),h()||this.preloader.detach(),e}));return{cached:F,promise:D}}))}setFetchReactionsInterval(e){return vs(this,void 0,void 0,(function*(){const t=this.getMiddleware();if(this.chat.isChannel){const i=()=>vs(this,void 0,void 0,(function*(){if(!t())return;const e=[];for(const t in this.bubbles){let i=yield this.chat.getMessage(+t);"message"===(null==i?void 0:i._)&&(i=yield this.managers.appMessagesManager.getGroupsFirstMessage(i),e.push(i.mid))}(e.length?this.managers.appReactionsManager.getMessagesReactions(this.peerId,e):Promise.resolve()).then((()=>{setTimeout(i,1e4)}))}));Promise.all([e,(0,pe.e9)(),(0,at.Z)(500)]).then((()=>{i()}))}}))}setFetchHistoryInterval({lastMsgId:e,topMessage:t,afterSetPromise:i,savedPosition:s,samePeer:n}){return vs(this,void 0,void 0,(function*(){const e=this.getMiddleware(),t=this.peerId,n=yield this.managers.appMessagesManager.isFetchIntervalNeeded(t);if(!s&&!n)return;if(yield i,!e())return;const a=t.toChatId();e.onClean((()=>{this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(a)})),this.managers.apiUpdatesManager.subscribeToChannelUpdates(a)}))}onScrolledAllDown(){return vs(this,void 0,void 0,(function*(){if("chat"===this.chat.type||"discussion"===this.chat.type){const e=yield this.chat.getHistoryMaxId();this.managers.appMessagesManager.readHistory(this.peerId,e,this.chat.threadId,!0)}}))}finishPeerChange(){return vs(this,void 0,void 0,(function*(){const[e,t,i]=yield Promise.all([this.chat.isChannel,this.chat.canSend(),this.chat.isAnyGroup]);return()=>{this.chatInner.classList.toggle("has-rights",t),this.container.classList.toggle("is-chat-input-hidden",!t),this.chatInner.classList.toggle("is-chat",i),this.chatInner.classList.toggle("is-channel",e),this.createResizeObserver()}}))}renderMessagesQueue(e){return this.batchProcessor.addToQueue(e)}ejectBubbles(){for(const e of this.bubblesToEject)e.remove();this.bubblesToEject.clear()}groupBubbles(e){let t;"scheduled"===this.chat.type&&(t=new Set,e.forEach((({bubble:e,message:i})=>{const s=this.bubbleGroups.getItemByBubble(e),n=null==s?void 0:s.group;n&&s.message.date!==i.date&&(this.bubbleGroups.removeItem(s),t.add(n))}))),e.forEach((({bubble:e,message:t})=>{this.bubbleGroups.prepareForGrouping(e,t)}));const i=this.bubbleGroups.groupUngrouped(),s=Array.from(i).map((e=>{if(e.avatar)return;const t=e.firstItem;return t&&this.chat.isAvatarNeeded(t.message)?e.createAvatar(t.message):void 0})).filter(Boolean);if(t)for(const e of t)i.add(e);return{groups:[...i],avatarPromises:s}}getMiddleware(e){return this.middlewareHelper.get(e)}wrapMediaSpoiler({media:e,promise:t,middleware:i,attachmentDiv:s}){return vs(this,void 0,void 0,(function*(){if(yield t,!i())return;const{width:n,height:a}=s.style,o=yield(0,qi.ZP)({media:e,width:parseInt(n),height:parseInt(a),middleware:i,animationGroup:this.chat.animationGroup});i()&&s.append(o)}))}safeRenderMessage(e,t,i,s=!0,n){return vs(this,void 0,void 0,(function*(){if(!e||this.renderingMessages.has(e.mid)||this.bubbles[e.mid]&&!i)return;const a=this.getMiddleware().create(),o=a.get();let r;try{this.renderingMessages.add(e.mid);const d=document.createElement("div");d.middlewareHelper=a,d.dataset.mid=""+e.mid,d.dataset.peerId=""+e.peerId,d.dataset.timestamp=""+e.date,i&&(i.middlewareHelper.destroy(),this.skippedMids.delete(e.mid),this.bubblesToEject.add(i),this.bubblesToReplace.delete(i),this.bubblesToReplace.set(d,i),this.bubbleGroups.changeBubbleByBubble(i,d)),i=this.bubbles[e.mid]=d;let l=this.renderMessage(e,t,i,o);n&&(l=n(l,i));const c=l.then((e=>e&&o()?Object.assign(Object.assign({},e),{updatePosition:s}):void 0));if(this.renderMessagesQueue(c.catch((()=>{}))),r=yield c,!o())return;r||this.skippedMids.add(+e.mid)}catch(e){this.log.error("renderMessage error:",e)}return o()?(this.renderingMessages.delete(e.mid),r):void 0}))}renderMessage(e,t=!1,i,s){var n,a,r;return vs(this,void 0,void 0,(function*(){const l="message"===e._,c=l&&e.grouped_id;let h,u;const p=c?yield this.managers.appMessagesManager.getMessagesByAlbum(c):void 0,g="pinned"!==this.chat.type;if(c&&g){h=p.map((e=>e.mid));const t=Ps(h);if(e.mid!==t)return}l&&(u=c?p[0]:e);const v=this.chat.isOurMessage(e),y=document.createElement("div");y.classList.add("message","spoilers-container");const w=document.createElement("div");w.classList.add("bubble-content-wrapper");const S=document.createElement("div");S.classList.add("bubble-content"),i.classList.add("bubble"),w.append(S),i.append(w);let E=!v&&!e.pFlags.out&&(e.pFlags.unread||vt(e));if(!E&&this.chat.peerId.isAnyChat()){const t=yield this.managers.appMessagesManager.getReadMaxIdIfUnread(this.chat.peerId,this.chat.threadId);void 0!==t&&t"messageEntityEmoji"===e._)),t=T.replace(/\s/g,"").length;if(e.reduce(((e,t)=>e+t.length),0)===t){O=Math.min(Ms,e.length),R=o.Z.active.customEmoji;const t=Is[O];t&&(R=(0,Qe.C)(t,t),i.style.setProperty("--emoji-size",t+"px"))}}null!=R||(R=this.chat.appImManager.customEmojiSize);const H=(0,mt.ZP)(T,{entities:k,passEntities:this.passEntities,loadPromises:I,lazyLoadQueue:this.lazyLoadQueue,customEmojiSize:R,middleware:s,animationGroup:this.chat.animationGroup});let z,j=!0,G=!1;if(O){if(d.Z.settings.emoji.big){const e=1===O&&!k.find((e=>"messageEntityCustomEmoji"===e._))&&(yield this.managers.appStickersManager.getAnimatedEmojiSticker(T));1===O&&!_&&e?_={_:"messageMediaDocument",document:e}:(z=document.createElement("div"),z.classList.add("attachment","spoilers-container"),(0,F.Z)(z,H),S.append(z)),i.classList.add("is-message-empty","emoji-big"),G=!0,j=!1,D=!1}i.classList.add("can-have-big-emoji")}D&&(0,F.Z)(y,H);const V=(q=T,us.test(q));var q;const Q=de.setTime({chatType:this.chat.type,message:e,reactionsMessage:u});let Y;if(y.append(Q),S.prepend(y),V&&Q.classList.add("is-block"),l&&this.chat.isAllMessagesForum){const t=yield(0,gs.Z)({peerId:this.peerId,threadId:(0,b.Z)(e,this.chat.isForum),lastMsgId:e.mid,wrapOptions:{middleware:s},withIcons:!0}),{element:i}=t;Y=document.createElement("div"),Y.classList.add("topic-name-button-container"),Y.append(i)}if(l&&e.views){if(i.classList.add("channel-post"),!(null===(n=e.fwd_from)||void 0===n?void 0:n.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),S.prepend(e),i.classList.add("with-beside-button")}!e.pFlags.is_outgoing&&this.observer&&this.observer.observe(i,this.viewsObserverCallback)}const X=l&&e.reply_markup;let J="replyInlineMarkup"===(null==X?void 0:X._)&&X.rows;if(J&&(J=J.filter((e=>e.buttons.length))),J){const t=document.createElement("div");t.classList.add("reply-markup"),J.forEach((i=>{const s=i.buttons,n=document.createElement("div");n.classList.add("reply-markup-row"),s.forEach((t=>{let i,s=(0,mt.ZP)(t.text,{noLinks:!0,noLinebreaks:!0});switch(t._){case"keyboardButtonUrl":{const e=(0,mt.ZP)(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]});i=(0,Ee.Z)(e).firstElementChild,i.classList.add("is-link");break}case"keyboardButtonSwitchInline":i=document.createElement("button"),i.classList.add("is-switch-inline"),(0,C.fc)(i,(i=>{(0,Le.Z)(i);const s=e.viaBotId||e.fromId;let n;n=t.pFlags.same_peer?Promise.resolve(this.peerId):this.managers.appInlineBotsManager.checkSwitchReturn(s).then((e=>e||new Promise(((e,t)=>{const i=new M.Z(void 0,(t=>{e(t)}));i.addEventListener("close",(()=>{t()}))})))),n.then((e=>{const i=this.peerId===e?this.chat.threadId:void 0;this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchInlineQuery(e,i,s,t.query)}))}));break;case"keyboardButtonBuy":{const e="messageMediaInvoice"===_._?_:void 0;if(null==e?void 0:e.extended_media)break;i=document.createElement("button"),i.classList.add("is-buy"),(null==e?void 0:e.receipt_msg_id)&&(s=(0,L.ag)("Message.ReplyActionButtonShowReceipt"));break}case"keyboardButtonUrlAuth":{i=document.createElement("button"),i.classList.add("is-url-auth");const{peerId:s}=this,{mid:n}=e,{url:a,button_id:o}=t;(0,C.fc)(i,(()=>{const e=(0,Ht.Z)([i],!0);this.chat.appImManager.handleUrlAuth({peerId:s,mid:n,url:a,buttonId:o}).then((()=>{e()}))}));break}default:i=document.createElement("button")}if(!i)return;i.classList.add("reply-markup-button","rp","tgico");const a=document.createElement("span");a.classList.add("reply-markup-button-text"),"string"==typeof s?a.insertAdjacentHTML("beforeend",s):a.append(s),(0,A.Z)(i),i.append(a),n.append(i)})),n.childElementCount&&t.append(n)}));const s=!!t.childElementCount;s&&(0,C.fc)(t,(t=>{let i=t.target;if(i.classList.contains("reply-markup-button")||(i=(0,be.Z)(i,"reply-markup-button")),!i||i.classList.contains("is-link")||i.classList.contains("is-switch-inline")||i.classList.contains("is-buy")||i.classList.contains("is-url-auth"))return;(0,Le.Z)(t);const s=(0,Me.Z)(i),n=J[(0,Me.Z)(i.parentElement)];if(!n.buttons||!n.buttons[s])return void this.log.warn("no such button",n,s,e);const a=n.buttons[s];this.managers.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,a).then((e=>{"string"==typeof e.message&&e.message.length&&(0,we.Am)((0,mt.ZP)(e.message,{noLinks:!0,noLinebreaks:!0}))}))})),s&&(i.classList.add("with-reply-markup"),w.append(t))}const ee=e.pFlags.is_outgoing;if(v){(e.pFlags.unread||ee)&&this.unreadOut.add(e.mid);let t="";t=e.error?"is-error":ee?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}ee&&!e.error&&i.classList.add("is-outgoing");const te=l&&(yield this.managers.appMessagesManager.getMessageWithCommentReplies(e)),ie=!!te&&e.mid>0;ie&&i.classList.add("with-replies");const se=l&&e.fwd_from,ne=l&&e.fwdFromId,ae=this.chat.isOutMessage(e);let oe=S;const re=!(e.viaBotId||e.fromId!==d.Z.myId&&e.pFlags.out),le=!T;let ce;if(_){z=document.createElement("div"),z.classList.add("attachment"),le&&i.classList.add("is-message-empty");let t=!1;switch(_._){case"messageMediaPhoto":{const t=_.photo;if(le&&(j=!1),re&&i.classList.add("hide-name"),i.classList.add("photo"),g&&c&&1!==h.length){i.classList.add("is-album","is-grouped"),Qi({messages:p,attachmentDiv:z,middleware:this.getMiddleware(),isOut:v,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:I,autoDownload:this.chat.autoDownload});break}const n=!x.IS_ANDROID&&j&&!ie&&!1;n&&i.classList.add("with-media-tail");const a=(0,K.Z)({photo:t,message:e,container:z,withTail:n,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:I,autoDownloadSize:this.chat.autoDownload.photo});_.pFlags.spoiler&&I.push(this.wrapMediaSpoiler({media:t,promise:a,middleware:s,attachmentDiv:z}));break}case"messageMediaWebPage":{t=!0;const s=_.webpage;if("webPage"!==s._)break;const n=(0,ms.Z)(s.url);if("im"===(null==n?void 0:n.onclick)){const e={telegram_channel:"Chat.Message.ViewChannel",telegram_megagroup:"OpenGroup",telegram_bot:"Chat.Message.ViewBot"}[s.type]||"OpenMessage";ce=this.makeViewButton({text:e,asLink:!0}),ce.href=n.url,ce.setAttribute("onclick",`${n.onclick}(this)`)}i.classList.add("webpage");const a=document.createElement("div");a.classList.add("web");const r=document.createElement("div");let l,c;r.classList.add("quote");const h=s.photo;(h||s.document)&&(l=document.createElement("div"),l.classList.add("preview-resizer"),c=document.createElement("div"),c.classList.add("preview"),l.append(c));const u=document.createElement("div");u.classList.add("quote-text");const p=s.document;if(p)if("gif"===p.type||"video"===p.type||"round"===p.type){const t="round"===p.type?o.Z.active.round:o.Z.active.webpage;"round"===p.type?(i.classList.add("round"),c.classList.add("is-round")):i.classList.add("video"),(0,$.Z)({doc:p,container:c,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:ae,group:this.chat.animationGroup,loadPromises:I,autoDownload:this.chat.autoDownload,noInfo:e.mid<0})}else{const t=yield(0,Yi.Z)({message:e,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,loadPromises:I,sizeType:"documentName",searchContext:{useSearch:!1,peerId:this.peerId,inputFilter:{_:"inputMessagesFilterEmpty"}},fontSize:d.Z.settings.messagesTextSize});c.append(t),c.classList.add("preview-with-document"),u.classList.add("has-document")}let f;if(l&&u.append(l),s.site_name){const e=(0,mt.ZP)(s.url),t=(0,Ee.Z)(e).firstElementChild;t.classList.add("webpage-name");const i=document.createElement("strong");(0,F.Z)(i,(0,B.Z)(s.site_name)),t.textContent="",t.append(i),u.append(t),f=t}const m=(0,ft.Z)(s);if(m.textContent){const e=document.createElement("div");e.classList.add("title");const t=document.createElement("strong");(0,F.Z)(t,m),e.append(t),u.append(e),f=e}const g=(0,pt.Z)(s);if(g.textContent){const e=document.createElement("div");e.classList.add("text"),(0,F.Z)(e,g),u.append(e),f=e}if(r.append(u),h&&!p){i.classList.add("photo");const t=h.sizes[h.sizes.length-1];let s=!1;t.w===t.h&&f?(i.classList.add("is-square-photo"),s=!0,(0,ut.Z)(h,c,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),(0,K.Z)({photo:h,message:e,container:c,boxWidth:s?0:o.Z.active.webpage.width,boxHeight:s?0:o.Z.active.webpage.height,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:I,withoutPreloader:s,autoDownloadSize:this.chat.autoDownload.photo})}a.append(r),y.insertBefore(a,Q);break}case"messageMediaDocument":{const n=_.document;if(n.sticker){i.classList.add("sticker"),j=!1,G=!0,n.animated&&i.classList.add("sticker-animated");const e=o.Z.active,t=i.classList.contains("emoji-big"),r=t?e.emojiSticker:n.animated?e.animatedSticker:e.staticSticker;(0,ut.Z)(n,z,r.width,r.height),S.style.minWidth=z.style.width,S.style.minHeight=z.style.height,(0,W.ZP)({doc:n,div:z,middleware:s,lazyLoadQueue:this.lazyLoadQueue,group:this.chat.animationGroup,play:!0,loop:!0,emoji:t?T:void 0,withThumb:!0,loadPromises:I,isOut:ae,noPremium:null===(a=null==_?void 0:_.pFlags)||void 0===a?void 0:a.nopremium}),((0,ji.Z)(n)||t)&&(E||ee)&&this.observer.observe(i,this.stickerEffectObserverCallback)}else if("video"===n.type||"gif"===n.type||"round"===n.type){const t="round"===n.type;if(t&&(G=!0),(t||le)&&(j=!1),re&&i.classList.add("hide-name"),i.classList.add(t?"round":"video"),g&&c&&1!==h.length)i.classList.add("is-album","is-grouped"),Qi({messages:p,attachmentDiv:z,middleware:s,isOut:v,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:I,autoDownload:this.chat.autoDownload});else{const a=!x.IS_ANDROID&&!x.IS_APPLE&&!t&&j&&!ie&&!1;a&&i.classList.add("with-media-tail");const r=(0,$.Z)({doc:n,container:z,message:e,boxWidth:o.Z.active.regular.width,boxHeight:o.Z.active.regular.height,withTail:a,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,group:this.chat.animationGroup,loadPromises:I,autoDownload:this.chat.autoDownload,searchContext:t?{peerId:this.peerId,inputFilter:{_:"inputMessagesFilterRoundVoice"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0,noInfo:e.mid<0,noAutoplayAttribute:!!_.pFlags.spoiler});_.pFlags.spoiler&&I.push(this.wrapMediaSpoiler({media:n,promise:r,middleware:s,attachmentDiv:z}))}}else{const s=yield function({albumMustBeRenderedFull:e,message:t,bubble:i,messageDiv:s,chat:n,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:d,useSearch:l,sizeType:c,managers:h,fontWeight:u,fontSize:p,richTextFragment:f}){return Xi(this,void 0,void 0,(function*(){let l;const m=e?yield n.getMidsByMid(t.mid):[t.mid],g=m.map(((e,t)=>Xi(this,void 0,void 0,(function*(){const i=yield n.getMessage(e),s=yield(0,Yi.Z)({message:i,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:d,sizeType:c,managers:h,fontWeight:u,fontSize:p}),g=document.createElement("div");g.classList.add("document-container"),g.dataset.mid=""+e,g.dataset.peerId=""+i.peerId;const v=document.createElement("div");if(v.classList.add("document-wrapper"),i.message){const e=document.createElement("div");e.classList.add("document-message"),(0,F.Z)(e,f),v.append(e)}if(m.length>1){const e=document.createElement("div");e.classList.add("document-selection"),g.append(e),g.classList.add("grouped-item"),0===t&&(l=v)}return v.append(s),g.append(v),g})))),v=yield Promise.all(g);return s.append(...v),m.length>1&&i.classList.add("is-multiple-documents","is-grouped"),l}))}({albumMustBeRenderedFull:g,message:e,bubble:i,messageDiv:y,chat:this.chat,loadPromises:I,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,searchContext:"voice"===n.type||"audio"===n.type?{peerId:this.peerId,inputFilter:{_:"voice"===n.type?"inputMessagesFilterRoundVoice":"inputMessagesFilterMusic"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0,sizeType:"documentName",fontSize:d.Z.settings.messagesTextSize,richTextFragment:H});s&&(oe=s);const a=y.lastElementChild.querySelector(".document-message, .document, .audio");a&&a.append(Q),i.classList.remove("is-message-empty"),y.classList.add((["photo","pdf"].includes(n.type)?"document":n.type||"document")+"-message"),t=!0}break}case"messageMediaCall":{const e=_.action,s=document.createElement("div");s.classList.add("bubble-call",e.pFlags.video?"tgico-videocamera":"tgico-phone");const n=e.pFlags.video?"video":"voice";s.dataset.type=n;const a=document.createElement("div");a.classList.add("bubble-call-title"),(0,L.$d)(a,ae?e.pFlags.video?"CallMessageVideoOutgoing":"CallMessageOutgoing":e.pFlags.video?"CallMessageVideoIncoming":"CallMessageIncoming");const o=document.createElement("div");if(o.classList.add("bubble-call-subtitle"),void 0!==e.duration)o.append((0,Oe.Z)(e.duration));else{let t;switch(e.reason._){case"phoneCallDiscardReasonBusy":t="Call.StatusBusy";break;case"phoneCallDiscardReasonMissed":t="Chat.Service.Call.Missed";break;default:t="Chat.Service.Call.Cancelled"}o.classList.add("is-reason"),(0,L.$d)(o,t)}o.classList.add("tgico","arrow-"+(void 0!==e.duration?"green":"red")),s.append(a,o),t=!0,i.classList.remove("is-message-empty"),y.classList.add("call-message"),y.append(s);break}case"messageMediaContact":{const e=_,s=document.createElement("div");s.classList.add("contact"),s.dataset.peerId=""+e.user_id,t=!0;const n=document.createElement("div");n.className="contact-details";const a=document.createElement("div");a.className="contact-name";const o=[e.first_name,e.last_name].filter(Boolean).join(" ");a.append(o.trim()?(0,B.Z)(o):(0,L.ag)("AttachContact"));const r=document.createElement("div");r.className="contact-number",r.textContent=e.phone_number?"+"+(0,_e.u)(e.phone_number).formatted:"Unknown phone number",s.append(n),n.append(a,r);const d=new f.Z;d.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e.user_id.toPeerId(),peerTitle:o.trim()?void 0:L.ZP.format("AttachContact",!0)[0]}),d.classList.add("contact-avatar","avatar-54"),s.prepend(d),i.classList.remove("is-message-empty"),y.classList.add("contact-message"),y.append(s);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e,t=d.Z.managers){const i=new cs;return i.message=e,i.managers=t,i.setAttribute("peer-id",""+e.peerId),i.setAttribute("poll-id",e.media.poll.id),i.setAttribute("message-id",""+e.mid),i.render(),i}(e);y.prepend(t),y.classList.add("poll-message");break}case"messageMediaInvoice":{const t=_.pFlags.test,n=_.extended_media,a="messageExtendedMedia"===(null==n?void 0:n._),r="messageExtendedMediaPreview"===(null==n?void 0:n._);let d=a?n.media.photo||n.media.document:_.photo;const l=(0,Zt.Z)(_.total_amount,_.currency);let c,h;if(n){if(r&&(c=document.createElement("span"),c.classList.add("extended-media-buy","tgico-premium_lock"),z.classList.add("is-buy"),(0,L.$d)(c,"Checkout.PayPrice",[l]),void 0!==n.video_duration)){const e=document.createElement("span");e.classList.add("video-time"),e.textContent=(0,is.Z)(n.video_duration,!1),z.append(e)}}else{c=document.createElement(d?"span":"div");const e=document.createDocumentFragment(),i=(0,L.ag)(_.receipt_msg_id?"PaymentReceipt":t?"PaymentTestInvoice":"PaymentInvoice");i.classList.add("text-uppercase");const s=" ‎",n=document.createElement("span");if(n.classList.add("text-bold"),n.textContent=l+s,e.append(n,i),t&&_.receipt_msg_id){const t=document.createElement("span");t.classList.add("text-uppercase","pre-wrap"),t.append(s+"(Test)"),e.append(t)}(0,F.Z)(c,e)}if(r&&(n.thumb.w=n.w,n.thumb.h=n.h,d={_:"photo",access_hash:"",pFlags:{},date:0,dc_id:0,file_reference:[],id:0,sizes:[n.thumb]}),d){const t=n?o.Z.active.extendedInvoice:o.Z.active.invoice;"document"===d._?((0,$.Z)({doc:d,container:z,withTail:!1,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,loadPromises:I,boxWidth:t.width,boxHeight:t.height,group:this.chat.animationGroup,message:e}),i.classList.add("video")):((0,K.Z)({photo:d,container:z,withTail:!1,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,loadPromises:I,boxWidth:t.width,boxHeight:t.height,message:a?e:void 0}),i.classList.add("photo")),c&&(n||c.classList.add("video-time"),z.append(c))}else z=void 0;if(r){const{mid:t}=e;this.extendedMediaMessages.add(t),s.onClean((()=>{this.extendedMediaMessages.delete(t)})),this.setExtendedMediaMessagesPollInterval();const{width:i,height:n}=z.style,a=ps.Z.create({width:parseInt(i),height:parseInt(n),middleware:s,animationGroup:this.chat.animationGroup});z.append(a.canvas)}n||(h=document.createElement("div"),h.classList.add("bubble-primary-color"),(0,F.Z)(h,(0,B.Z)(_.title)));const u=a?void 0:(0,B.Z)(_.description);y.prepend(...[h,!d&&c,u].filter(Boolean)),u?i.classList.remove("is-message-empty"):j=!1,i.classList.add("is-invoice");break}default:z=void 0,i.classList.remove("is-message-empty"),y.append((0,L.ag)(L.nK),Q),this.log.warn("unrecognized media type:",_._,e)}!t&&z&&S.append(z)}G&&i.classList.add("just-media"),ce&&Q.before(ce);let he="";const ue=e.fromId!==d.Z.myId&&this.chat.isAnyGroup||e.viaBotId||e.pFlags.sponsored;if(ue||se||e.reply_to_mid||Y){let t,s;const n="peerChannel"===(null===(r=e.from_id)||void 0===r?void 0:r._)&&e.fromId===ne,a=!!e.viaBotId,o=se&&!se.from_id;e.viaBotId&&(s=document.createElement("span"),s.innerText="@"+(yield this.managers.appPeersManager.getPeerUsername(e.viaBotId)),s.classList.add("peer-title")),a&&i.classList.add("must-have-name");const c=ne||se;let h,u;if(o?(t=document.createElement("span"),(0,F.Z)(t,(0,B.Z)(se.from_name)),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new N.Z({peerId:ne||e.fromId,withPremiumIcon:!c,wrapOptions:Z}).element,l&&e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&(!this.chat.isAllMessagesForum||e.reply_to.reply_to_top_id)&&(h=yield de.setReply({chat:this.chat,bubble:i,bubbleContainer:S,message:e})),c)if(this.peerId===d.Z.myId||n||i.classList.add("forwarded"),e.savedFrom&&(he=e.savedFrom,t.dataset.savedFrom=he),u=document.createElement("div"),t.dataset.peerId=""+ne,this.peerId!==d.Z.myId&&this.peerId!==m.hj&&!n||G){const e=[t];if(G){const t=document.createElement("br");t.classList.add("hide-ol"),e.unshift(t)}u.append((0,L.ag)("ForwardedFrom",[e]))}else u.style.color=(0,U.Z)(ne,!1),u.classList.add("colored-name"),u.append(t);else if(!e.viaBotId)if(!G&&ue){u=document.createElement("div"),u.append(t);const i=yield this.managers.appPeersManager.getPeer(e.fromId),s=null==i?void 0:i.pFlags;s&&(s.scam||s.fake)&&u.append((0,ct.Z)(s.scam)),v||(u.style.color=(0,U.Z)(e.fromId,!1),u.classList.add("colored-name")),u.dataset.peerId=""+e.fromId}else i.classList.add("hide-name");if(e.viaBotId){u?u.append(" "):u=document.createElement("div");const e=document.createElement("span");e.append((0,L.ag)("ViaBot")," ",s),e.classList.add("is-via"),u.append(e)}Y&&(G?Y.classList.add("floating-part"):(u||(u=document.createElement("div")),u.append(Y),i.classList.remove("hide-name"))),u?(u.classList.add("name"),G?(oe.append(oe=document.createElement("div")),oe.classList.add("name-with-reply","floating-part")):u.classList.add("floating-part"),oe.append(u),G&&h&&oe.append(h)):G&&h&&h.classList.add("floating-part"),Y&&G&&(z?z.after(Y):this.log.error("no attachment div?",i,e))}else i.classList.add("hide-name");if("pinned"===this.chat.type&&(he=`${this.chat.peerId}_${e.mid}`),te&&te.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),he&&("pinned"===this.chat.type||se.saved_from_msg_id)&&this.peerId!==m.hj){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),S.append(e),i.dataset.savedFrom=he,i.classList.add("with-beside-button")}return i.classList.add(ae?"is-out":"is-in"),ie&&(de.renderReplies({bubble:i,bubbleContainer:S,message:te,messageDiv:y,loadPromises:I,lazyLoadQueue:this.lazyLoadQueue})?j=!0:i.classList.add("with-beside-replies")),l&&this.appendReactionsElementToBubble(i,e,u),j&&(i.classList.add("can-have-tail"),S.append(Ts())),P}))}appendReactionsElementToBubble(e,t,i,s){if(this.peerId.isUser(),!(null==i?void 0:i.reactions)||!i.reactions.results.length)return;const n=new nt;if(n.init(i,"block",e.middlewareHelper.get()),n.render(s),e.classList.contains("is-message-empty"))e.querySelector(".bubble-content-wrapper").append(n);else{const s=e.querySelector(".message");if(e.classList.contains("is-multiple-documents")){const e=s.lastElementChild;let a=e.querySelector(".document-message"),o=a&&a.querySelector(".time");o||(o=de.setTime({chatType:this.chat.type,message:t,reactionsMessage:i})),n.append(o),a||(a=document.createElement("div"),a.classList.add("document-message"),e.querySelector(".document-wrapper").prepend(a)),a.append(n)}else{const t=Array.from(e.querySelectorAll(".time")).pop();n.append(t),s.append(n)}}}prepareToSaveScroll(e){if(!this.chatInner.parentElement)return{};const t=this.log.bindPrefix("prepareToSaveScroll");t("save");const i=this.createScrollSaver(e);if(i.save(),this.getRenderedLength()&&!this.chat.setPeerPromise){const e=this.getViewportSlice();this.deleteViewportSlice(e,!0)}return{restoreScroll:()=>{t("restore"),i.restore(e),this.onRenderScrollSet(i.getSaved())},scrollSaver:i}}performHistoryResult(e,t){var i;return vs(this,void 0,void 0,(function*(){let s=e.history;s=s.slice(),this.needReflowScroll&&(Ie(this.scrollable.container),this.needReflowScroll=!1);const n=yield Promise.all(s.map((e=>"number"==typeof e?this.chat.getMessage(e):e))),a=[];if(!this.scrollable.loadedAll.bottom||!this.scrollable.loadedAll.top){let t=e.isEnd;if(!t){const e=yield this.chat.getHistoryStorage(),i=e.history.first,n=e.history.last;t={top:!1,bottom:!1,both:!1},!i.isEnd(ve.D.Bottom)||i.length&&!s.includes(i[0])||(t.bottom=!0),!n.isEnd(ve.D.Top)||n.length&&!s.includes(n[n.length-1])||(t.top=!0)}if(!t.bottom&&this.setPeerOptions){const{lastMsgId:e,topMessage:i,savedPosition:s}=this.setPeerOptions;this.setPeerOptions=void 0,(!e&&!s||this.bubbles[i]||e===i)&&(t.bottom=!0)}t.top&&a.push(this.setLoaded("top",!0)),t.bottom&&a.push(this.setLoaded("bottom",!0))}yield Promise.all(a);const o=n.map((e=>e?e.pFlags.local?this.processLocalMessageRender(e):this.safeRenderMessage(e,t):void 0));yield Promise.all(o),yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),null===(i=this.messagesQueueOnRenderAdditional)||void 0===i||i.call(this))}))}onRenderScrollSet(e){const t="has-sticky-dates";if(this.container.classList.contains(t)||this.preloader.detached&&(null!=e||(e={scrollHeight:this.scrollable.scrollHeight,clientHeight:this.scrollable.container.clientHeight}),e.scrollHeight===e.clientHeight))this.willScrollOnLoad=void 0;else{const e=this.getMiddleware(),i=()=>{e()&&this.container.classList.add(t)};this.willScrollOnLoad?i():setTimeout(i,600)}}requestHistory(e,t,i){return"chat"===this.chat.type||"discussion"===this.chat.type?this.managers.acknowledged.appMessagesManager.getHistory(this.peerId,e,t,i,this.chat.threadId):"pinned"===this.chat.type?this.managers.acknowledged.appMessagesManager.getSearch({peerId:this.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:t,backLimit:i}).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.history.map((e=>e.mid))})))}))):"scheduled"===this.chat.type?this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.slice().reverse()})))}))):void 0}animateAsLadder(e,t,i,s,n){return vs(this,void 0,void 0,(function*(){const a=this.log.bindPrefix("ladder");if(this.chat.setPeerPromise&&!this.resolveLadderAnimation)return a.warn("will be delayed"),void(this.resolveLadderAnimation=this.animateAsLadder.bind(this,e,t,i,s,n));if(!Object.keys(this.bubbles).length)return void a.warn("no bubbles");let o,r=(0,rt.Z)(this.bubbles,"desc");i&&t.length&&(r=r.filter((e=>!t.includes(e)))),o=s?n||Math.max(...r):e||Math.max(...r);const d=r.slice(r.findIndex((e=>o>e))),l=i?[]:[o],c=i?[]:r.slice(0,r.findIndex((e=>o>=e))).reverse();ge.ZP&&a("targeting mid:",o,n,e,d.map((e=>(0,yt.Z)(e))),c.map((e=>(0,yt.Z)(e))));const h=[];this.chatInner.classList.add("zoom-fading");const u=i?10:40,p=i?0:1,f=(e,t=0)=>{const i=(0,me.Z)();let s=0;return e.forEach(((n,o)=>{const r=this.bubbles[n];if(!r||this.skippedMids.has(n))return void a.warn("no bubble by mid:",n);s=(o+t||.1)*u;const d=r.lastElementChild,l=[d],c=this.bubbleGroups.getItemByBubble(r);if(c&&c.group.avatar&&c.group.lastItem===c&&l.push(c.group.avatar),l.forEach((e=>{e.classList.add("zoom-fade","can-zoom-fade"),e.style.transitionDelay=s+"ms"})),o===e.length-1){const e=t=>{t.target===d&&(i.resolve(),d.removeEventListener("transitionend",e))};d.addEventListener("transitionend",e)}h.push(...l)})),e.length||i.resolve(),{lastMsDelay:s,animationPromise:i}},m=f(d,p),g=f(l),v=f(c,p),b=[m.animationPromise,g.animationPromise,v.animationPromise],y=[m.lastMsDelay,g.lastMsDelay,v.lastMsDelay];let w;return this.onAnimateLadder&&(yield this.onAnimateLadder()),(0,fe.T2)((()=>{this.setStickyDateManually(),h.forEach((e=>{e.classList.remove("zoom-fade")}))})),(d.length||l.length||c.length)&&(w=Promise.all(b),(0,pe.YW)(w,Math.max(...y)+200).then((()=>{(0,fe.T2)((()=>{h.forEach((e=>{e.style.transitionDelay="",e.classList.remove("can-zoom-fade")})),this.chatInner.classList.remove("zoom-fading")}))}))),w}))}renderEmptyPlaceholder(e,t,i,s){return vs(this,void 0,void 0,(function*(){const i="empty-bubble-placeholder";let n,a;if(t.classList.add(i,i+"-"+e),"group"===e?n=(0,L.ag)("GroupEmptyTitle1"):"saved"===e?n=(0,L.ag)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?n=(0,L.ag)("NoMessages"):"noScheduledMessages"===e?n=(0,L.ag)("NoScheduledMessages"):"restricted"===e&&(n=document.createElement("span"),n.innerText=yield this.managers.appPeersManager.getRestrictionReasonText(this.peerId)),n.classList.add("center",i+"-title"),s.push(n),"group"===e)s.push((0,L.ag)("GroupEmptyTitle2")),a=[(0,L.ag)("GroupDescription1"),(0,L.ag)("GroupDescription2"),(0,L.ag)("GroupDescription3"),(0,L.ag)("GroupDescription4")];else if("saved"===e)a=[(0,L.ag)("ChatYourSelfDescription1"),(0,L.ag)("ChatYourSelfDescription2"),(0,L.ag)("ChatYourSelfDescription3"),(0,L.ag)("ChatYourSelfDescription4")];else if("greeting"===e){const e=(0,L.ag)("NoMessagesGreetingsDescription");e.classList.add("center",i+"-subtitle");const t=document.createElement("div");t.classList.add(i+"-sticker");const n=this.getMiddleware();yield this.managers.appStickersManager.getGreetingSticker().then((e=>vs(this,void 0,void 0,(function*(){if(!n())return;const i=[];return yield(0,W.ZP)({doc:e,div:t,middleware:n,lazyLoadQueue:this.lazyLoadQueue,group:this.chat.animationGroup,play:!0,loop:!0,withThumb:!0,loadPromises:i}),(0,C.fc)(t,(e=>{(0,Le.Z)(e),Mt.Jo.onMediaClick({target:e.target})})),Promise.all(i)})))),s.push(e,t)}a&&(s.push(...a.map((e=>{const t=document.createElement("span");return t.classList.add(i+"-list-item"),t.append(e),t}))),"group"===e?a.forEach((e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)})):"saved"===e&&a.forEach((e=>{const t=document.createElement("span");t.classList.add(i+"-list-bullet"),t.innerText="•",e.prepend(t)}))),s.length>1&&t.classList.add("has-description"),s.forEach((e=>e.classList.add(i+"-line")))}))}processLocalMessageRender(e,t,i=this.getMiddleware()){return vs(this,void 0,void 0,(function*(){const s=!!e.pFlags.sponsored,n=(0,It.Z)(i);return this.safeRenderMessage(e,!s,void 0,!1,(i=>vs(this,void 0,void 0,(function*(){const{bubble:a}=yield n(i);if(!a)return i;a.message=e,a.classList.add("is-group-last","is-group-first");const o=()=>{this.updatePlaceholderPosition===o&&(this.updatePlaceholderPosition=void 0),u[p](a)};s||(a.classList.add("bubble-first"),a.classList.remove("can-have-tail","is-in"));const r=[],l=this.chat.isBot;let c,u=this.container,p="append";if(this.chat.isRestricted)c=this.renderEmptyPlaceholder("restricted",a,e,r);else if(s){let i,s,n,o;a.classList.add("avoid-selection"),a.style.order="999999";const r=this.sponsoredMessage=e.sponsoredMessage,d=(0,R.Z)(r.from_id);r.channel_post?(i="OpenChannelPost",s=(0,wt.Z)(r.channel_post)):r.start_param||l?(i="Chat.Message.ViewBot",n=r.start_param):i=(yield this.managers.appPeersManager.isAnyGroup(d))?"Chat.Message.ViewGroup":"Chat.Message.ViewChannel",o=r.chat_invite?()=>{new Ve(r.chat_invite_hash,r.chat_invite)}:r.chat_invite_hash?()=>{const e={_:xe.JOIN_CHAT,invite:r.chat_invite_hash};this.chat.appImManager.processInternalLink(e)}:()=>{this.chat.appImManager.setInnerPeer({peerId:d,lastMsgId:s,startParam:n})};const c=this.makeViewButton({text:i});this.observer.observe(c,this.viewsObserverCallback),o&&(0,C.fc)(c,o),a.querySelector(".bubble-content").prepend(c),u=this.chatInner,p="append",t=!1}else if(l&&"message"===e._){const e=document.createElement("b");e.append((0,L.ag)("BotInfoTitle")),r.push(e,"\n\n"),u=this.chatInner,p="prepend"}else c=this.chat.isAnyGroup&&(yield n(this.managers.appPeersManager.getPeer(this.peerId))).pFlags.creator?this.renderEmptyPlaceholder("group",a,e,r):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",a,e,r):d.Z.myId===this.peerId?this.renderEmptyPlaceholder("saved",a,e,r):this.peerId.isUser()&&!l&&(yield n(this.chat.canSend()))&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",a,e,r):this.renderEmptyPlaceholder("noMessages",a,e,r);c&&(yield c),r.length&&a.querySelector(".message, .service-msg").prepend(...r);const f=!!this.messagesQueueOnRenderAdditional,m=this.setPeerCached&&!f;if(m){const e=a.firstElementChild;e.classList.add("no-transition"),this.chat.setPeerPromise&&this.chat.setPeerPromise.catch(Ye.Z).finally((()=>{e.classList.remove("no-transition")}))}if(void 0!==t||m||(t=!0),f||t?(this.updatePlaceholderPosition=o,this.onAnimateLadder=()=>{if(this.onAnimateLadder=void 0,!this.messagesQueuePromise)return(0,fe.AD)()}):this.chat.setPeerPromise?this.attachPlaceholderOnRender=()=>{this.attachPlaceholderOnRender=void 0,o()}:this.updatePlaceholderPosition=o,!f&&t){yield n((0,pe.e9)());const t=(0,rt.Z)(this.bubbles);(0,h.Z)(t,e.mid),this.animateAsLadder(e.mid,t,!1,0,0)}return a.middlewareHelper.onDestroy((()=>{this.emptyPlaceholderBubble===a&&(this.emptyPlaceholderBubble=void 0)})),this.emptyPlaceholderBubble=a,i}))))}))}makeViewButton(e){return(0,He.Z)("btn-primary btn-primary-transparent bubble-view-button",e)}generateLocalMessageId(e=0){const t=("scheduled"===this.chat.type?-1:0)+e,i=-Math.abs(t);return{id:i,mid:-Math.abs((0,wt.Z)(i))}}generateLocalFirstMessage(e,t,i=0){return vs(this,void 0,void 0,(function*(){const{id:s,mid:n}=this.generateLocalMessageId(i);let a={_:e?"messageService":"message",date:0,id:s,mid:n,peer_id:yield this.managers.appPeersManager.getOutputPeer(this.peerId),pFlags:{local:!0}};return e||(a.message=""),(0,Ze.Z)(a),t&&t(a),a=(yield this.managers.appMessagesManager.saveMessages([a],{storage:new Map}))[0],a.mid=n,a}))}getViewportSlice(){return(0,dt.Z)({overflowElement:this.scrollable.container,selector:".bubbles-date-group .bubble:not(.is-date)",extraSize:2*Math.max(700,Ae.Z.height)})}deleteViewportSlice(e,t){const{invisibleTop:i,invisibleBottom:s}=e,n=i.concat(s);if(!n.length)return;i.length&&(this.setLoaded("top",!1),this.getHistoryTopPromise=void 0),s.length&&(this.setLoaded("bottom",!1),this.getHistoryBottomPromise=void 0);const a=n.map((({element:e})=>+e.dataset.mid));let o;t||(o=this.createScrollSaver(!!i.length),o.save()),this.deleteMessagesByIds(a,!1,!0),o?o.restore():i.length&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop)}sliceViewport(e){if(x.IS_SAFARI||this.isHeavyAnimationInProgress&&!e)return;const t=this.getViewportSlice();this.deleteViewportSlice(t)}setLoaded(e,t,i=!0){return vs(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll[e]!==t)return this.log.bindPrefix("setLoaded")("change",e,t),this.scrollable.loadedAll[e]=t,this.scrollable.onScroll(),i?!this.chat.isRestricted&&("bottom"===e&&this.chat.isBroadcast&&this.toggleSponsoredMessage(t),"top"===e&&t&&this.chat.isBot)?this.renderBotPlaceholder():this.checkIfEmptyPlaceholderNeeded():void 0}))}toggleSponsoredMessage(e){return vs(this,void 0,void 0,(function*(){const t=this.log.bindPrefix("sponsored");t("checking");const{mid:i}=this.generateLocalMessageId(1);if(e){const e=this.getMiddleware((()=>this.scrollable.loadedAll.bottom&&this.getSponsoredMessagePromise===i)),i=this.getSponsoredMessagePromise=this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId()).then((i=>vs(this,void 0,void 0,(function*(){if(!e()||"messages.sponsoredMessagesEmpty"===i._)return;const s=i.messages[0];if(!s)return void t("no message");const n=this.generateLocalFirstMessage(!1,(e=>{e.message=s.message,e.from_id=s.from_id,e.entities=s.entities,e.pFlags.sponsored=!0,e.sponsoredMessage=s}),1);return Promise.all([n,this.getHistoryTopPromise,this.messagesQueuePromise]).then((([i])=>{if(e())return t("rendering",i),this.performHistoryResult({history:[i]},!1)}))})))).finally((()=>{this.getSponsoredMessagePromise===i&&(this.getSponsoredMessagePromise=void 0)}))}else t("clearing rendered",i),this.getSponsoredMessagePromise=void 0,this.deleteMessagesByIds([i])}))}renderBotPlaceholder(){return vs(this,void 0,void 0,(function*(){const e=this.log.bindPrefix("bot placeholder"),t=this.getMiddleware(),i=yield this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());e("getting profile, cached:",i.cached);const s=i.result.then((s=>vs(this,void 0,void 0,(function*(){var n;if(!t())return;if(!(null===(n=s.bot_info)||void 0===n?void 0:n.description))return e.warn("no description"),this.checkIfEmptyPlaceholderNeeded();const a=yield this.generateLocalFirstMessage(!1,(e=>{const t=s.bot_info;e.message=t.description,t.description_document&&(e.media={_:"messageMediaDocument",document:t.description_document,pFlags:{}}),t.description_photo&&(e.media={_:"messageMediaPhoto",photo:t.description_photo,pFlags:{}})}));return t()?(e("rendering"),{renderPromise:this.processLocalMessageRender(a,!i.cached).then((()=>{e("done")}))}):void 0}))));if(i.cached)return s}))}checkIfEmptyPlaceholderNeeded(){return vs(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll.top&&this.scrollable.loadedAll.bottom&&void 0===this.emptyPlaceholderBubble&&(this.chat.isRestricted||!(yield this.chat.getHistoryStorage()).count||Object.keys(this.bubbles).length&&!this.getRenderedLength()||"scheduled"===this.chat.type&&!Object.keys(this.bubbles).length)){this.log("inject empty peer placeholder");const e=yield this.generateLocalFirstMessage(!0);return{renderPromise:this.processLocalMessageRender(e)}}}))}getHistory1(e,t,i,s,n){const a=this.getMiddleware(n?void 0:()=>(t?this.getHistoryTopPromise:this.getHistoryBottomPromise)===r),o=this.getHistory(e,t,i,s,n,a),r=o.then((e=>e&&(e.waitPromise||e.promise)));return t?this.getHistoryTopPromise=r:this.getHistoryBottomPromise=r,r.then((()=>{a()&&(t?this.getHistoryTopPromise=void 0:this.getHistoryBottomPromise=void 0,n||"chat"===this.chat.type&&setTimeout((()=>{t?this.loadMoreHistory(!0,!0):this.loadMoreHistory(!1,!0)}),0))})),o}getHistory(e=0,t=!1,i=!1,s=0,n=!1,a){return vs(this,void 0,void 0,(function*(){const o=this.peerId,r=this.chat.isBroadcast,l=Math.min(30,Ae.Z.height/40|0);let c=r?20:Object.keys(this.bubbles).length>0?Math.max(35,l):l;if(void 0!==Ss){if(!Ss)return{cached:!1,promise:Promise.resolve(),waitPromise:Promise.resolve()};Object.keys(this.bubbles).length>0&&--Ss}let h,u=0;if(i&&(u=c,t||(c=0)),s&&!i)if("pinned"===this.chat.type)h=[s];else{const t=(yield this.chat.getHistoryStorage()).history.slice;if(t.length=0;--e){const t=yield this.chat.getMessage(h[e]);if(!(null==t?void 0:t.grouped_id))break;h.splice(e,1)}e=h[h.length-1]||e}}let p,f=yield this.requestHistory(e,c,u);this.log("i vin brehnya",f,e,c,u);const m=(null==h?void 0:h.length)&&!f.cached,g=this.isFirstLoad&&u&&!f.cached||m;m&&(p=f.result,f={cached:!0,result:Promise.resolve({history:h})}),this.isFirstLoad=!1;const v=e=>vs(this,void 0,void 0,(function*(){var t;if(null===(t=e.isEnd)||void 0===t?void 0:t.top){if("discussion"===this.chat.type){const t=yield this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId,this.chat.threadId);t&&e.history.push(t);const i=yield this.chat.getMidsByMid(this.chat.threadId);e.history.push(...i.reverse())}yield this.managers.appProfileManager.getProfileByPeerId(o)}})),b=e=>(0,pe.e9)().then((()=>v(e))).then((()=>(!m&&s&&e.history.unshift(s),this.performHistoryResult(e,t)))),y=e=>{const t=Promise.resolve(e).then((e=>{if(a&&!a())throw Es;if(!n)return b(e);this.scrollable.onScroll()}),(e=>{throw this.log.error("getHistory error:",e),e}));return t};let w,S;if(f.cached){if(n)return this.scrollable.onScroll(),null;S=!0,w=b(yield f.result)}else S=!1,w=y(f.result);const C=m?y(p):w;if(g&&d.Z.settings.animationsEnabled){let i=m?2:1;this.messagesQueueOnRenderAdditional=()=>{this.log("messagesQueueOnRenderAdditional"),--i||(this.messagesQueueOnRenderAdditional=void 0,this.animateAsLadder(s,h,m,u,e).then((()=>{setTimeout((()=>{this.loadMoreHistory(t,!0)}),0)})))}}else this.messagesQueueOnRenderAdditional=void 0;return n?null:{cached:S,promise:w,waitPromise:C}}))}setUnreadDelimiter(){return vs(this,void 0,void 0,(function*(){if("chat"!==this.chat.type&&"discussion"!==this.chat.type)return;if(this.attachedUnreadBubble)return;const e=yield this.chat.getHistoryMaxId();let t=yield this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId,this.chat.threadId);if(t&&(t=Object.keys(this.bubbles).filter((e=>!this.bubbles[e].classList.contains("is-out"))).map((e=>+e)).sort(((e,t)=>e-t)).find((e=>e>t)),t&&this.bubbles[t])){const i=this.bubbles[t];this.firstUnreadBubble&&this.firstUnreadBubble!==i&&(this.firstUnreadBubble.classList.remove("is-first-unread"),this.firstUnreadBubble=null),t!==e&&i.classList.add("is-first-unread"),this.firstUnreadBubble=i,this.attachedUnreadBubble=!0}}))}deleteEmptyDateGroups(){const e=this.stickyIntersector?Ls:1;let t=!1;for(const i in this.dateMessages){const s=this.dateMessages[i];s.container.childElementCount===e&&(s.container.remove(),this.stickyIntersector&&this.stickyIntersector.unobserve(s.container,s.div),delete this.dateMessages[i],t=!0)}t&&(Object.keys(this.dateMessages).length||this.container.classList.remove("has-groups"),this.checkIfEmptyPlaceholderNeeded(),this.setStickyDateManually())}}function Ts(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 11 20"),e.setAttributeNS(null,"width","11"),e.setAttributeNS(null,"height","20"),e.classList.add("bubble-tail");const t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS(null,"href","#message-tail-filled"),e.append(t),e}var ks=i(3003),xs=i(5128),As=i(8127);class _s{constructor(e,t,i,s){this.peerId=e,this.mid=t,this.unpin=i,this.onConfirm=s,this.construct()}construct(){return e=this,t=void 0,s=function*(){const{peerId:e,mid:t,unpin:i,onConfirm:s}=this;let n,a,o;const r=[],l=[],c=S.Z.MANAGERS,h=yield c.appPeersManager.canPinMessage(e),u=(n,a,o)=>{setTimeout((()=>{let n;n=i&&!t?h?c.appMessagesManager.unpinAllMessages(e):c.appMessagesManager.hidePinnedMessages(e):c.appMessagesManager.updatePinnedMessage(e,t,i,o,a),s&&n.then(s)}),300)};if(i){let i="UnpinMessage";t?(n="UnpinMessageAlertTitle",a="Chat.Confirm.Unpin"):h?(n="Popup.Unpin.AllTitle",a="Chat.UnpinAllMessagesConfirmation",o=[""+((yield c.appMessagesManager.getPinnedMessagesCount(e))||1)]):(n="Popup.Unpin.HideTitle",a="Popup.Unpin.HideDescription",i="Popup.Unpin.Hide"),r.push({langKey:i,isDanger:!0,callback:u})}else{n="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(r.push({langKey:t,callback:e=>u(0,!1,!e.size)}),(yield c.appChatsManager.isBroadcast(e.toChatId()))?a="PinMessageAlertChannel":(a="PinMessageAlert",l.push({text:"PinNotify",checked:!0}))):(a="PinMessageAlertChat",e===d.Z.myId?r.push({langKey:t,callback:u}):(r.push({langKey:t,callback:e=>u(0,!e.size)}),l.push({text:"PinAlsoFor",textArgs:[yield(0,Kt.Z)({peerId:e})],checked:!0})))}(0,S.x)(r),new As.Z("popup-delete-chat",{peerId:e,titleLangKey:n,descriptionLangKey:a,descriptionLangArgs:o,buttons:r,checkboxes:l}).show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var Fs=i(1962);function Ds(e=window.getSelection()){if(!(null==e?void 0:e.rangeCount))return!0;const t=e.getRangeAt(0);return!(!t.collapsed&&t.START_TO_END)}var Rs=i(2312),Bs=i(1447),Ns=i(671),Os=i(3174);function Us(e,t,i){return d.Z.managers.appStickersManager.preloadAnimatedEmojiSticker(e).then((({doc:s})=>{if(s)return Rs.Z.downloadMedia({media:s}).then((n=>{return a=this,r=void 0,l=function*(){const a=o.Z.active.emojiSticker,r=(0,Ns.tB)(e),d=yield Bs.Z.loadAnimationWorker({container:void 0,animationData:n,width:null!=t?t:a.width,height:null!=i?i:a.height,name:"doc"+s.id,autoplay:!1,loop:!1,toneIndex:r,group:"none"});d.addEventListener("firstFrame",(()=>{(0,Os.O)(s,d.canvas[0],r),d.remove()}),{once:!0})},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(a,r||[])).next())}));var a,r,d,l}))}))}var Hs=i(5772);class zs extends As.Z{constructor(e,t,i,s){super("popup-report-messages-confirm",{noTitle:!0,descriptionLangKey:"ReportInfo",buttons:[{langKey:"ReportChat",callback:()=>{a.isValid()&&(s&&s(),this.managers.appMessagesManager.reportMessages(e,t,i,a.value).then((e=>{e&&(0,we.bC)({langPackKey:"ReportSentInfo"})})))}}],body:!0});const n=document.createElement("div");(0,Hs.Z)({div:n,emoji:zs.STICKER_EMOJI,width:100,height:100}).then((({render:e})=>e)).finally((()=>{this.show()})),this.header.replaceWith(n);const a=new E.ZP({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});a.input.addEventListener("input",(()=>{this.buttons[0].element.toggleAttribute("disabled",!a.isValid())})),this.body.append(a.container)}}zs.STICKER_EMOJI="👮‍♀️";class js extends As.Z{constructor(e,t,i){super("popup-report-messages",{titleLangKey:"ChatTitle.ReportMessages",buttons:[],body:!0}),t=t.slice();const s=[["ReportChatSpam","inputReportReasonSpam"],["ReportChatViolence","inputReportReasonViolence"],["ReportChatChild","inputReportReasonChildAbuse"],["ReportChatPornography","inputReportReasonPornography"],["ReportChatOther","inputReportReasonOther"],["ReportChatPersonalDetails","inputReportReasonPersonalDetails"],["ReportChatIllegalDrugs","inputReportReasonIllegalDrugs"]];s.forEach((e=>{const t=(0,He.Z)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)}));const n=Us(zs.STICKER_EMOJI);(0,C.fc)(this.body,(a=>{const o=(0,be.Z)(a.target,"btn-primary"),r=s[(0,Me.Z)(o)][1];n.then((()=>{this.hide(),new zs(e,t,r,i)}))}),{listenerSetter:this.listenerSetter}),this.buttonsEl.style.marginTop=".5rem",this.show()}}class Gs extends As.Z{constructor(){super("popup-sponsored",{titleLangKey:"Chat.Message.Sponsored.What",descriptionLangKey:"Chat.Message.Ad.Text",descriptionLangArgs:[(0,L.ag)("Chat.Message.Sponsored.Link")],buttons:[{langKey:"OK",isCancel:!0},{langKey:"Chat.Message.Ad.ReadMore",callback:()=>{window.open(L.ZP.format("Chat.Message.Sponsored.Link",!0))},isCancel:!0}],scrollable:!0}),this.scrollable.append(this.description),this.show()}}var Vs=i(6008),Ks=i(8936),Ws=i(3061),$s=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class qs extends S.Z{constructor(e){super("popup-reacted-list",{closable:!0,overlayClosable:!0,body:!0}),this.message=e,this.init()}init(){return $s(this,void 0,void 0,(function*(){const e=this.middlewareHelper.get(),t=yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message);if(!e())return;const i=yield this.managers.appMessagesManager.canViewMessageReadParticipants(t);if(!e())return;const s=new nt,n=Object.assign(Object.assign({},t),{mid:0,id:0,reactions:Object.assign(Object.assign({_:"messageReactions",results:[]},t.reactions),{pFlags:{},recent_reactions:[]})});n.reactions.results=n.reactions.results.map((e=>Object.assign(Object.assign({},e),{chosen_order:void 0,pFlags:{}}))),s.init(n,"block",this.middlewareHelper.get()),s.render(),s.classList.add("no-stripe"),s.classList.remove("has-no-reactions"),s.append(this.btnClose),this.header.append(s);const a=document.createElement("div");a.classList.add("tabs-container"),a.dataset.animation="tabs";const o=new Map;let r=!1;if(n.reactions.results.length){const e=this.createFakeReaction("reactions",n.reactions.results.reduce(((e,t)=>e+t.count),0));s.prepend(e),n.reactions.results.unshift(e.reactionCount),r=!0}let d=!1;if(i)try{const i=yield this.managers.appMessagesManager.getMessageReadParticipants(t.peerId,t.mid);if(!e())return;if(!i.length)throw"";const a=this.createFakeReaction("checks",i.length);s.prepend(a),n.reactions.results.unshift(a.reactionCount),d=!0}catch(e){}n.reactions.results.forEach((i=>{const s=new T.ZP(void 0);s.container.classList.add("tabs-tab");const n=new Ii.Z({noShadow:!0,noDelimiter:!0}),r=es.default.createChatList({dialogSize:72});es.default.setListClickListener(r,(()=>{this.hide()}),void 0,!1,!0),n.content.append(r),s.container.append(n.container);const d="checks"!==i.reaction,l="checks"===i.reaction;["checks","reactions"].includes(i.reaction)&&(i.reaction=void 0);const c=(0,Qe.C)(24,24);let h;const u=new Ks.Z({scrollable:s,getPromise:()=>$s(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(t,void 0,i.reaction,h,d,l);return h=s.nextOffset,yield Promise.all(s.combined.map((({peerId:t,reaction:i})=>$s(this,void 0,void 0,(function*(){const{dom:s}=es.default.addDialogNew({peerId:t,autonomous:!0,container:r,avatarSize:"abitbigger",rippleEnabled:!1,meAsSaved:!1});if(i){const t=document.createElement("div");if(t.classList.add("reacted-list-reaction-icon"),"reactionEmoji"===i._){const s=yield this.managers.appReactionsManager.getReactionCached(i.emoticon);(0,W.ZP)({doc:s.static_icon,div:t,width:24,height:24,middleware:e})}else"reactionCustomEmoji"===i._&&t.append((0,$e.Z)({docIds:[i.document_id],customEmojiSize:c,middleware:e}));s.listEl.append(t)}(0,H.Z)(s.lastMessageSpan,(0,Ws.Z)(yield this.managers.appUsersManager.getUser(t.toUserId())))}))))),!h}))});o.set(s.container,u),a.append(s.container)})),this.body.append(a);const l=(0,Vs.X)(s,a,((e,t)=>{if(e===s.childElementCount-1)return!1;const i=s.children[e],n=l.prevId();-1!==n&&s.children[n].setIsChosen(!1),i.setIsChosen(!0),o.get(t).load()}),void 0,void 0,void 0,this.listenerSetter);l(0,!1),this.show()}))}createFakeReaction(e,t){const i=new et;i.init("block",this.middlewareHelper.get()),i.reactionCount={_:"reactionCount",count:t,reaction:e},i.setCanRenderAvatars(!1),i.renderCounter();const s=document.createElement("div");return s.classList.add("reaction-counter","reaction-sticker-icon","tgico-"+e),i.prepend(s),i}}const Qs="btn-menu-reactions",Ys=Qs+"-reaction",Xs=!x.IS_SAFARI;class Js{constructor(e,t,i){this.managers=e,this.type=t,this.onScroll=()=>{this.reactionsMap.forEach(((e,t)=>{this.onScrollProcessItem(t,e)}))},this.onMouseMove=e=>{var t;const i=(0,be.Z)(e.target,Ys);if(!i)return;const s=this.reactionsMap.get(i);if(!s)return;if(!(null===(t=s.appear)||void 0===t?void 0:t.paused))return;const n=s.select;n&&n.paused&&(n.autoplay=!0,n.restart())};const n=this.widthContainer=document.createElement("div");n.classList.add(Qs+"-container"),n.classList.add(Qs+"-container-"+t);const a=this.container=document.createElement("div");a.classList.add(Qs);const o=this.scrollable="vertical"===t?new T.ZP(void 0):new T.v7(void 0);a.append(o.container),o.onAdditionalScroll=this.onScroll,o.setListeners(),o.container.classList.add("no-scrollbar"),this.reactionsMap=new Map,this.animationGroup=`CHAT-MENU-REACTIONS-${Date.now()}`,s.Z.setOverrideIdleGroup(this.animationGroup,!0),c.Z||a.addEventListener("mousemove",this.onMouseMove),(0,C.fc)(a,(e=>{const t=(0,be.Z)(e.target,Ys);if(!t)return;const i=this.reactionsMap.get(t);i&&this.managers.appReactionsManager.sendReaction(this.message,i.reaction)})),n.append(a),this.middleware=null!=i?i:(0,Ce.k)()}init(e){this.message=e;const t=this.middleware.get(),i=this.managers.appReactionsManager.getAvailableReactionsByMessage(e);(0,We.Z)(i,(e=>{if(!t()||!e.length)return;e.forEach((e=>{e.pFlags.premium&&!d.Z.premium||this.renderReaction(e)}));const s=()=>{this.container.classList.add("is-visible")};i instanceof Promise?(0,fe.T2)(s):s()}))}cleanup(){this.middleware.clean(),this.scrollable.removeListeners(),this.reactionsMap.clear(),s.Z.setOverrideIdleGroup(this.animationGroup,!1),s.Z.checkAnimations(!0,this.animationGroup,!0)}canUseAnimations(){return d.Z.settings.animationsEnabled&&!x.IS_MOBILE}renderReaction(e){const t=document.createElement("div");t.classList.add(Ys);const i=document.createElement("div");i.classList.add(Ys+"-scale");const s=document.createElement("div");let n;s.classList.add(Ys+"-appear"),this.canUseAnimations()&&(n=document.createElement("div"),n.classList.add(Ys+"-select","hide"));const a={selectWrapper:n,appearWrapper:s,reaction:{_:"reactionEmoji",emoticon:e.reaction}};this.reactionsMap.set(t,a);const o=this.middleware.get(),r=26*(c.Z?1:1.25),d={width:r,height:r,skipRatio:1,needFadeIn:!1,withThumb:!1,group:this.animationGroup,middleware:o};if(this.canUseAnimations()){let t=!0;(0,W.ZP)(Object.assign({doc:e.appear_animation,div:s,play:!0},d)).then((({render:e})=>e)).then((e=>{(0,Ze.Z)(e),a.appear=e,e.addEventListener("enterFrame",(o=>{e.maxFrame===o&&i.then((e=>{(0,Ze.Z)(e),s.classList.add("hide"),n.classList.remove("hide"),t&&(a.select=e,t=!1)}),Ye.Z)}))}),Ye.Z);const i=(0,W.ZP)(Object.assign({doc:e.select_animation,div:n},d)).then((({render:e})=>e)).then((e=>((0,Ze.Z)(e),Bs.Z.waitForFirstFrame(e)))).catch(Ye.Z)}else delete d.needFadeIn,delete d.withThumb,(0,W.ZP)(Object.assign({doc:e.static_icon,div:s},d));i.append(s),n&&i.append(n),t.append(i),this.scrollable.append(t)}onScrollProcessItem(e,t){const i=e.firstElementChild,s=(0,ze.Z)(e,this.scrollable.container);let n;if(s)if(s.overflow.left||s.overflow.right){const e=Math.abs(s.rect.left-s.rect.right);n="scale("+Math.min(Math.pow(e,2)/Math.pow(34,2),1)+")"}else n="";else{if(!t.appearWrapper.classList.contains("hide")||!t.appear)return;t.select&&t.select.stop(),t.appear.stop(),t.appear.autoplay=!0,t.appearWrapper.classList.remove("hide"),t.selectWrapper.classList.add("hide"),n=""}Xs&&(i.style.transform=n)}}var en=i(1483),tn=i(2353),sn=i(6690),nn=i(3709),an=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class on{constructor(e,t){this.chat=e,this.managers=t,this.onContextMenu=e=>{let t,i;try{i=(0,be.Z)(e.target,"bubble-content-wrapper"),t=i?i.parentElement:(0,be.Z)(e.target,"bubble")}catch(e){}if(!t||t.classList.contains("bubble-first"))return;let s=this.element;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),s&&s.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0);let n=+t.dataset.mid;n&&(()=>{an(this,void 0,void 0,(function*(){const a=this.isSponsored=n<0;this.isSelectable=this.chat.selection.canSelectBubble(t),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!Ds(),this.isAnchorTarget="A"===this.target.tagName&&("_blank"===this.target.target||this.target.classList.contains("anchor-url")),this.isUsernameTarget="A"===this.target.tagName&&this.target.classList.contains("mention");const o=yield this.chat.getMidsByMid(n);if(this.chat.selection.isSelecting&&!i){if(a)return;if(o.length>1){const e=this.chat.selection.isMidSelected(this.peerId,n)?n:o.find((e=>this.chat.selection.isMidSelected(this.peerId,e)));e&&(n=e)}}this.isOverBubble=!!i;const r=(0,be.Z)(this.target,"grouped-item");this.isTargetAGroupedItem=!!r,this.mid=r?+r.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=t.message||(yield this.chat.getMessage(this.mid)),this.albumMessages=this.message.grouped_id?yield this.managers.appMessagesManager.getMessagesByAlbum(this.message.grouped_id):void 0,this.noForwards=!a&&!(yield this.managers.appMessagesManager.canForward(this.message)),this.viewerPeerId=void 0,this.canOpenReactedList=void 0,this.linkToMessage=yield this.getUrlToMessage(),this.selectedMessagesText=yield this.getSelectedMessagesText();const d=yield this.init();if(!d)return;s=d.element;const{cleanup:l,destroy:c,menuPadding:h,reactionsMenu:u,reactionsMenuPosition:p}=d;let f=!1;if(u){const e="is-visible";if(f=u.container.classList.contains(e),f&&u.container.classList.remove(e),"horizontal"===p){const e=s.offsetWidth,t=(e-8)/34%1,i=.65;if(t{u&&u.container.classList.remove("is-visible"),this.mid=0,this.peerId=void 0,this.target=null,this.viewerPeerId=void 0,this.canOpenReactedList=void 0,l(),setTimeout((()=>{c()}),300)})),f&&u.container.classList.add("is-visible")}))})()},this.onSendScheduledClick=()=>an(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,C.tH)(this.chat.selection.selectionSendNowBtn):new Fs.Z(this.peerId,yield this.chat.getMidsByMid(this.mid))})),this.onReplyClick=()=>{this.chat.input.initMessageReply(this.mid)},this.onFaveStickerClick=e=>{const t=this.message.media.document.id;this.managers.appStickersManager.faveSticker(t,e)},this.onEditClick=()=>{this.chat.input.initMessageEditing(this.mid)},this.onCopyClick=()=>an(this,void 0,void 0,(function*(){Ds()?(0,ht.T)(this.selectedMessagesText):document.execCommand("copy")})),this.onCopyAnchorLinkClick=()=>{(0,ht.T)(this.target.href)},this.onCopyLinkClick=()=>{const{url:e,isPrivate:t}=this.linkToMessage,i=t?"LinkCopiedPrivateInfo":"LinkCopied";(0,we.Am)(L.ZP.format(i,!0)),(0,ht.T)(e)},this.onPinClick=()=>{new _s(this.peerId,this.mid)},this.onUnpinClick=()=>{new _s(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.managers.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.managers.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>an(this,void 0,void 0,(function*(){if(this.chat.selection.isSelecting)(0,C.tH)(this.chat.selection.selectionForwardBtn);else{const e=this.peerId,t=this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid);new M.Z({[e]:t})}})),this.onSelectClick=()=>{this.chat.selection.toggleByElement((0,be.Z)(this.target,"grouped-item")||(0,be.Z)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>an(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,C.tH)(this.chat.selection.selectionDeleteBtn):new xs.Z(this.peerId,this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid),this.chat.type)})),this.listenerSetter=new ce.Z,this.attachListenerSetter=new ce.Z,this.middleware=(0,Ce.k)()}attachTo(e){this.attachListenerSetter.removeAll(),c.Z?(0,C.fc)(e,(e=>{this.chat.selection.isSelecting||(this.chat.log("touchend",e),!e.target.closest([".name",".peer-title",".reply",".document","audio-element","avatar-element","a",".bubble-beside-button","replies-element","[data-saved-from]:not(.bubble)","poll-element",".attachment",".reply-markup-button"].join(", "))&&((0,Le.Z)(e),this.onContextMenu(e)))}),{listenerSetter:this.attachListenerSetter}):(0,Lt.E)({element:e,callback:this.onContextMenu,listenerSetter:this.attachListenerSetter})}cleanup(){this.listenerSetter.removeAll(),this.reactionsMenu&&this.reactionsMenu.cleanup(),this.middleware.clean()}destroy(){this.cleanup(),this.attachListenerSetter.removeAll()}filterButtons(e){return an(this,void 0,void 0,(function*(){return this.isSponsored?e.filter((e=>e.isSponsored)):(0,tn.Z)(e,(e=>an(this,void 0,void 0,(function*(){let t;return this.chat.selection.isSelecting&&!e.withSelection?t=!1:(this.isOverBubble||c.Z,t=yield e.verify()),!!t}))))}))}setButtons(){const e=e=>an(this,void 0,void 0,(function*(){var t;const i=null===(t=this.message.media)||void 0===t?void 0:t.document;if(!(null==i?void 0:i.sticker))return!1;const s=yield this.managers.acknowledged.appStickersManager.getFavedStickersStickers();if(!s.cached)return!1;const n=(yield s.result).some((e=>e.id===i.id));return e?!n:n}));this.buttons=[{icon:"send2",text:"MessageScheduleSend",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&!this.message.pFlags.is_outgoing},{icon:"send2",text:"Message.Context.Selection.SendNow",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&this.isSelected&&!this.chat.selection.selectionSendNowBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"schedule",text:"MessageScheduleEditTime",onClick:()=>{this.chat.input.scheduleSending((()=>{(0,Ze.Z)(this.message),this.managers.appMessagesManager.editMessage(this.message,this.message.message,{scheduleDate:this.chat.input.scheduleDate,entities:this.message.entities}),this.chat.input.onMessageSent(!1,!1)}),new Date(1e3*this.message.date))},verify:()=>"scheduled"===this.chat.type},{icon:"reply",text:"Reply",onClick:this.onReplyClick,verify:()=>an(this,void 0,void 0,(function*(){return(yield this.chat.canSend())&&!this.message.pFlags.is_outgoing&&!!this.chat.input.messageInput&&"scheduled"!==this.chat.type}))},{icon:"favourites",text:"AddToFavorites",onClick:this.onFaveStickerClick.bind(this,!1),verify:()=>e(!0)},{icon:"favourites",text:"DeleteFromFavorites",onClick:this.onFaveStickerClick.bind(this,!0),verify:()=>e(!1)},{icon:"edit",text:"Edit",onClick:this.onEditClick,verify:()=>an(this,void 0,void 0,(function*(){return(yield this.managers.appMessagesManager.canEditMessage(this.message,"text"))&&!!this.chat.input.messageInput}))},{icon:"copy",text:"Copy",onClick:this.onCopyClick,verify:()=>!(this.noForwards||!this.message.message||this.isTextSelected||this.isAnchorTarget&&this.message.message===this.target.innerText)},{icon:"copy",text:"Chat.CopySelectedText",onClick:this.onCopyClick,verify:()=>!this.noForwards&&!!this.message.message&&this.isTextSelected},{icon:"copy",text:"Message.Context.Selection.Copy",onClick:this.onCopyClick,verify:()=>an(this,void 0,void 0,(function*(){if(!this.isSelected||this.noForwards)return!1;for(const[e,t]of this.chat.selection.selectedMids){const i=`${e}_${"scheduled"===this.chat.type?"scheduled":"history"}`;for(const e of t)if((yield this.managers.appMessagesManager.getMessageFromStorage(i,e)).message)return!0}return!1})),notDirect:()=>!0,withSelection:!0},{icon:"copy",text:"CopyLink",onClick:this.onCopyAnchorLinkClick,verify:()=>this.isAnchorTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Username",onClick:()=>{(0,ht.T)(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{(0,ht.T)(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>an(this,void 0,void 0,(function*(){return(yield this.managers.appPeersManager.isChannel(this.peerId))&&!this.message.pFlags.is_outgoing}))},{icon:"pin",text:"Message.Context.Pin",onClick:this.onPinClick,verify:()=>an(this,void 0,void 0,(function*(){return!this.message.pFlags.is_outgoing&&"messageService"!==this.message._&&!this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))&&"scheduled"!==this.chat.type}))},{icon:"unpin",text:"Message.Context.Unpin",onClick:this.onUnpinClick,verify:()=>an(this,void 0,void 0,(function*(){return this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))}))},{icon:"download",text:"MediaViewer.Context.Download",onClick:()=>{Rs.Z.downloadToDisc({media:(0,bt.Z)(this.message)})},verify:()=>{var e,t;if(!(0,nn.Z)(this.message)||this.noForwards)return!1;let i=!1;if(null===(e=this.message.media)||void 0===e?void 0:e.photo)i=!0;else{if(!(null===(t=this.message.media)||void 0===t?void 0:t.document))return!1;i=!0}let s=!!c.Z;return i&&(s||(s=!!((0,be.Z)(this.target,"document")||(0,be.Z)(this.target,"audio")||(0,be.Z)(this.target,"media-sticker-wrapper")||(0,be.Z)(this.target,"media-photo")||(0,be.Z)(this.target,"media-video")))),i&&s}},{icon:"checkretract",text:"Chat.Poll.Unvote",onClick:this.onRetractVote,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return t&&t.chosenIndexes.length&&!t.pFlags.closed&&!t.pFlags.quiz}},{icon:"stop",text:"Chat.Poll.Stop",onClick:this.onStopPoll,verify:()=>an(this,void 0,void 0,(function*(){var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return(yield this.managers.appMessagesManager.canEditMessage(this.message,"poll"))&&t&&!t.pFlags.closed&&!this.message.pFlags.is_outgoing}))},{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>!(this.noForwards||"scheduled"===this.chat.type||this.message.pFlags.is_outgoing&&this.message.fromId!==m.yF||"messageService"===this.message._)},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.chat.selection.selectionForwardBtn&&this.isSelected&&!this.chat.selection.selectionForwardBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"flag",text:"ReportChat",onClick:()=>{new js(this.peerId,[this.mid])},verify:()=>an(this,void 0,void 0,(function*(){return!this.message.pFlags.out&&"message"===this.message._&&!this.message.pFlags.is_outgoing&&(yield this.managers.appPeersManager.isChannel(this.peerId))})),notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick,verify:()=>!this.message.action&&!this.isSelected&&this.isSelectable,notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,notDirect:()=>!0,withSelection:!0},{onClick:()=>{if(this.viewerPeerId)this.chat.appImManager.setInnerPeer({peerId:this.viewerPeerId});else{if(!this.canOpenReactedList)return!1;new qs(this.message)}},verify:()=>an(this,void 0,void 0,(function*(){var e,t;return!this.peerId.isUser()&&(!!(null===(t=null===(e=this.message.reactions)||void 0===e?void 0:e.recent_reactions)||void 0===t?void 0:t.length)||(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)))})),notDirect:()=>!0,localName:"views"},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>an(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canDeleteMessage(this.message)}))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.chat.selection.selectionDeleteBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"info",text:"Chat.Message.Sponsored.What",onClick:()=>{new Gs},verify:()=>!1,isSponsored:!0},{text:"Loading",onClick:()=>{this.emojiInputsPromise.then((e=>{new P.Z(e,!0).show()}))},verify:()=>!!this.getUniqueCustomEmojisFromMessage().length,notDirect:()=>!0,localName:"emojis"}]}getUniqueCustomEmojisFromMessage(){const e=[],t=this.albumMessages&&(0,Pt.Z)(this.albumMessages)||this.message,i=t.entities;if(i){const t=i.filter((e=>"messageEntityCustomEmoji"===e._));e.push(...t.map((e=>e.document_id)))}const s=t.reactions;if(s){const t=s.results.filter((e=>"reactionCustomEmoji"===e.reaction._));e.push(...t.map((e=>e.reaction.document_id)))}return(0,sn.Z)(e)}init(){return an(this,void 0,void 0,(function*(){this.cleanup(),this.setButtons();const e=yield this.filterButtons(this.buttons);if(!e.length)return;const t=this.element=yield(0,ks.Z)({buttons:e,listenerSetter:this.listenerSetter});t.id="bubble-contextmenu",t.classList.add("contextmenu");const i=e.find((e=>"views"===e.localName));if(i){const e=this.message.reactions,t=null==e?void 0:e.recent_reactions,s=!!(null==t?void 0:t.length),n=(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message))?(yield this.managers.appPeersManager.getPeer(this.peerId)).participants_count:void 0,a=e?e.results.reduce(((e,t)=>e+t.count),0):void 0;i.element.classList.add("tgico-"+(s?"reactions":"checks"));const o=new L.ZP.IntlElement({key:s?void 0===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted":"NobodyViewed",args:s?void 0===n?[a]:[n,n]:void 0,element:i.textElement});let r;r=s?void 0===n?(0,L.ag)("Chat.Context.ReactedFast",[a]):(0,L.ag)(t.length===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted",[t.length,n]):(0,L.ag)("Loading"),r.classList.add("btn-menu-item-text-fake"),i.element.append(r);const d=22,l=3,c=1.125;o.element.style.visibility="hidden",o.element.style.paddingRight=s?c*Math.min(l,t.length)+"rem":"1rem";const h=this.middleware.get();this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message).then((e=>{if(!h())return;r&&r.remove();const a=e.combined,u=void 0===n?e.reactionsCount:s?a.filter((e=>e.reaction)).length:a.length;let p;if(1===a.length)p=new N.Z({peerId:a[0].peerId,onlyFirstName:!0,dialog:!1}).element,(!s||e.readParticipants.length<=1)&&(this.viewerPeerId=a[0].peerId);else if(s){const e=u===a.length||void 0===n;p=(0,L.ag)(e?"Chat.Context.ReactedFast":"Chat.Context.Reacted",e?[u]:[u,a.length])}else a.length?p=(0,L.ag)("MessageSeen",[a.length]):o.element.style.visibility="";if(p&&(p.style.paddingRight=c*Math.min(l,u)+"rem",p.classList.add("btn-menu-item-text-fake"),i.element.append(p)),a.length){const e=new se({avatarSize:d});e.render(t?t.map((e=>(0,R.Z)(e.peer_id))):a.map((e=>e.peerId))),i.element.append(e.container),this.canOpenReactedList=!0}}))}let s,n,a;if(!("message"!==this.message._||this.chat.selection.isSelecting||this.message.pFlags.is_outgoing||this.message.pFlags.is_scheduled||this.message.pFlags.local)){a=x.IS_APPLE||c.Z?"horizontal":"vertical",n=this.reactionsMenu=new Js(this.managers,a,this.middleware),n.init(yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message));const e=44,t=0;s="vertical"===a?{top:t,left:e}:{top:e,right:0,left:t}}const o=e.find((e=>"emojis"===e.localName));if(o){o.element.classList.add("is-multiline"),o.element.parentElement.insertBefore(document.createElement("hr"),o.element);const e=()=>{null!=s||(s={}),s.bottom=24},t=this.getUniqueCustomEmojisFromMessage(),i=this.emojiInputsPromise=(0,me.Z)();yield this.managers.appEmojiManager.getCachedCustomEmojiDocuments(t).then((s=>an(this,void 0,void 0,(function*(){const n=t=>an(this,void 0,void 0,(function*(){const s=new Map;t.forEach((e=>{e&&!s.has(e.stickerSetInput.id)&&s.set(e.stickerSetInput.id,e.stickerSetInput)}));const n=[...s.values()];if(i.resolve(n),1===s.size){const t=yield this.managers.acknowledged.appStickersManager.getStickerSet(n[0]),i=t.result.then((e=>{const t=(0,L.ag)("MessageContainsEmojiPack",[(0,B.Z)(e.set.title)]);(0,H.Z)(o.textElement,t)}));return t.cached?i:void e()}(0,H.Z)(o.textElement,(0,L.ag)("MessageContainsEmojiPacks",[s.size]))}));if(!s.some((e=>!e)))return n(s);e(),this.managers.appEmojiManager.getCustomEmojiDocuments(t).then(n)}))))}return this.chat.container.append(t),{element:t,cleanup:()=>{this.cleanup(),n&&n.cleanup()},destroy:()=>{t.remove(),n&&n.widthContainer.remove()},menuPadding:s,reactionsMenu:n,reactionsMenuPosition:a}}))}getUrlToMessage(){return an(this,void 0,void 0,(function*(){if(this.peerId.isUser())return;let e;const{peerId:t,mid:i}=this,s=this.chat.threadId;"discussion"===this.chat.type&&(e=yield this.managers.appMessagesManager.getMessageByPeer(t,s));const n=yield this.managers.appPeersManager.getPeerUsername(e?e.fromId:t),a=(0,yt.Z)(i);let o="https://t.me/";return n?(o+=n,o+=e?`/${(0,yt.Z)(e.fwd_from.channel_post)}?comment=${a}`:s?`/${(0,yt.Z)(s)}/${a}`:"/"+a):(o+="c/"+t.toChatId(),o+=e?`/${a}?thread=${(0,yt.Z)(e.mid)}`:s?`/${(0,yt.Z)(s)}/${a}`:"/"+a),{url:o,isPrivate:!n}}))}getSelectedMessagesText(){return an(this,void 0,void 0,(function*(){if(!Ds())return"";const e=this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort(((e,t)=>e-t)):[this.mid];return(yield Promise.all(e.map((e=>an(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);return(null==t?void 0:t.message)?t.message+"\n":""})))))).join("")}))}}var rn=i(4329),dn=i.n(rn),ln=i(9043);class cn{constructor(e){this.sendMenuButtons=[{icon:"mute",text:"Chat.Send.WithoutSound",onClick:e.onSilentClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:e.onScheduleClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.SetReminder",onClick:e.onScheduleClick,verify:()=>"reminder"===this.type}],this.sendMenu=(0,ks.b)({buttons:this.sendMenuButtons,listenerSetter:e.listenerSetter}),this.sendMenu.classList.add("menu-send",e.openSide),(0,Lt.E)({element:e.onContextElement,callback:t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach((e=>{e.element.classList.toggle("hide",!e.verify())})),(0,Le.Z)(t),Et.Z.openBtnMenu(this.sendMenu))},listenerSetter:e.listenerSetter})}setPeerId(e){this.type=e===d.Z.myId?"reminder":"schedule"}}var hn=i(1293),un=i(9336),pn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class fn extends S.Z{constructor(e){super("popup-create-poll popup-new-media",{closable:!0,withConfirm:"Create",body:!0,title:"NewPoll"}),this.chat=e,this.tempId=0,this.onSubmitClick=()=>{this.send()},this.onInput=e=>{const t=e.target,i=(0,ye.Z)(t,"LABEL"),s=(0,hn.Z)(t);s||(t.parentElement.classList.add("is-filled"),i.classList.remove("hidden-widget"),i.firstElementChild.removeAttribute("disabled")),!i.nextElementSibling&&!s&&this.questions.childElementCount<10&&this.appendMoreField(),this.handleChange()},this.onDeleteClick=e=>{const t=e.target,i=(0,ye.Z)(t,"LABEL"),s=(0,Me.Z)(i);this.correctAnswers&&this.correctAnswers[0][0]===s&&(this.correctAnswers=void 0),i.remove(),this.optionInputFields.splice(s,1),this.optionInputFields.forEach(((e,t)=>{e.options.labelOptions.length=0,e.options.labelOptions.push(t+1),L.ZP.weakMap.get(e.label.firstElementChild).update()})),this.handleChange()},this.construct()}construct(){return pn(this,void 0,void 0,(function*(){if(this.questionInputField=new E.ZP({placeholder:"AskAQuestion",label:"AskAQuestion",name:"question",maxLength:255}),this.listenerSetter.add(this.questionInputField.input)("input",(()=>{this.handleChange()})),this.optionInputFields=[],"scheduled"!==this.chat.type){const e=new cn({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending((()=>{this.send()}))},openSide:"bottom-left",onContextElement:this.btnConfirm});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.header.append(this.questionInputField.container);const e=document.createElement("hr"),t=document.createElement("div");t.classList.add("caption"),(0,L.$d)(t,"PollOptions"),this.questions=document.createElement("form"),this.questions.classList.add("poll-create-questions");const i=document.createElement("div");i.classList.add("poll-create-settings");const s=document.createElement("div");s.classList.add("caption"),(0,L.$d)(s,"Settings"),(yield this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))||(this.anonymousCheckboxField=new jt.Z({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new jt.Z({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new jt.Z({text:"NewPoll.Quiz",name:"quiz"}),this.listenerSetter.add(this.multipleCheckboxField.input)("change",(()=>{const e=this.multipleCheckboxField.input.checked;this.quizCheckboxField.input.toggleAttribute("disabled",e)})),this.listenerSetter.add(this.quizCheckboxField.input)("change",(()=>{const e=this.quizCheckboxField.input.checked;Array.from(this.questions.children).map((t=>{t.classList.toggle("radio-field",e)})),e||(this.correctAnswers=void 0,this.quizSolutionField.setValueSilently("")),n.forEach((t=>t.classList.toggle("hide",!e))),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()})),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const n=[],a=document.createElement("div");a.classList.add("caption"),(0,L.$d)(a,"AccDescrQuizExplanation");const o=document.createElement("hr"),r=document.createElement("div");r.classList.add("poll-create-questions"),this.quizSolutionField=new E.ZP({placeholder:"NewPoll.Explanation.Placeholder",label:"NewPoll.Explanation.Placeholder",name:"solution",maxLength:200}),this.listenerSetter.add(this.questionInputField.input)("input",(()=>{this.handleChange()}));const d=document.createElement("div");d.classList.add("subtitle"),(0,L.$d)(d,"AddAnExplanationInfo"),r.append(this.quizSolutionField.container,d),n.push(o,a,r),n.forEach((e=>e.classList.add("hide"))),this.body.parentElement.insertBefore(e,this.body),this.body.append(t,this.questions,document.createElement("hr"),s,i,...n),(0,C.fc)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new T.ZP(this.body),this.appendMoreField(),this.onEscape=()=>!this.getFilledAnswers().length,this.handleChange()}))}getFilledAnswers(){return Array.from(this.questions.children).map(((e,t)=>{const i=e.querySelector(".input-field-input");return i instanceof HTMLInputElement?i.value:(0,un.Z)(i,!1,!1).value})).filter((e=>!!e.trim()))}validate(){var e;const t=this.questionInputField.value;if(!t)return!1;if(t.length>255)return!1;if(this.quizCheckboxField.input.checked&&!(null===(e=this.correctAnswers)||void 0===e?void 0:e.length))return!1;const i=this.getFilledAnswers();if(i.length<2)return!1;if(i.find((e=>e.length>100)))return!1;const{value:s}=(0,un.Z)(this.quizSolutionField.input,!1,!1);return!(s.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){return pn(this,void 0,void 0,(function*(){const t=this.questionInputField.value,i=this.getFilledAnswers(),{value:s,entities:n}=(0,un.Z)(this.quizSolutionField.input,!0,!1);if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending((()=>{this.send(!0)}));this.hide();const a={};this.anonymousCheckboxField&&!this.anonymousCheckboxField.input.checked&&(a.public_voters=!0),this.multipleCheckboxField.input.checked&&(a.multiple_choice=!0),this.quizCheckboxField.input.checked&&(a.quiz=!0);const o={_:"poll",pFlags:a,question:t,answers:i.map(((e,t)=>({_:"pollAnswer",text:e,option:new Uint8Array([t])}))),id:void 0},r=yield this.chat.managers.appPollsManager.getInputMediaPoll(o,this.correctAnswers,s,n);this.chat.managers.appMessagesManager.sendOther(this.chat.peerId,r,Object.assign({},this.chat.getMessageSendingParams())),"reply"===this.chat.input.helperType&&this.chat.input.clearHelper(),this.chat.input.onMessageSent(!1,!1)}))}appendMoreField(){const e=this.tempId++,t=this.questions.childElementCount+1,i=new E.ZP({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(i.input)("input",this.onInput);const s=new Di.Z({text:"",name:"question"});s.main.append(i.container),(0,C.fc)(i.input,Le.Z,{listenerSetter:this.listenerSetter}),s.label.classList.add("hidden-widget"),s.input.disabled=!0,this.quizCheckboxField.input.checked||s.label.classList.remove("radio-field"),this.listenerSetter.add(s.input)("change",(()=>{if(s.input.checked){const e=(0,Me.Z)(s.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}}));const n=document.createElement("span");n.classList.add("btn-icon","tgico-close"),i.container.append(n),(0,C.fc)(n,this.onDeleteClick,{listenerSetter:this.listenerSetter,once:!0}),this.questions.append(s.label),this.scrollable.scrollIntoViewNew({element:this.questions.lastElementChild,position:"center"}),this.optionInputFields.push(i)}}var mn=i(7814);function gn(e){let t,i;return e instanceof HTMLVideoElement?(t=e.videoWidth,i=e.videoHeight):(t=e.naturalWidth,i=e.naturalHeight),(0,mn.Z)({media:e,mediaSize:(0,Qe.C)(t,i),boxSize:(0,Qe.C)(320,240),quality:.9})}var vn=i(9897),bn=i(2341);function yn(e){const t=e.src;return fetch(t).then((e=>e.arrayBuffer())).then((e=>{const t=new Uint8Array(e);let i=0;for(let e=0,s=t.length;e${Zn.Z})|(
)`,"g");class kn extends E.ZP{constructor(e){super(e),this.input.addEventListener("input",(()=>{this.updateInnerHTML(),this.onFakeInput()})),e.placeholder&&(0,L.$d)(this.inputFake,e.placeholder,void 0,"placeholder"),this.input.classList.add("scrollable","scrollable-y","no-scrollbar"),this.inputFake=document.createElement("div"),this.inputFake.contentEditable="true",this.inputFake.tabIndex=-1,this.inputFake.className=this.input.className+" input-field-input-fake"}onFakeInput(e=!0){var t;const{scrollHeight:i}=this.inputFake,s=+this.input.style.height.replace("px","");if(s===i)return;const n=Math.round(50*Math.log(Math.abs(i-s)));this.input.style.transitionDuration=`${n}ms`,e&&(null===(t=this.onChangeHeight)||void 0===t||t.call(this,i),this.input.style.height=i?i+"px":"");const a="is-changing-height";(0,De.Z)({element:this.input,className:a,forwards:!0,duration:n,onTransitionEnd:()=>{this.input.classList.remove(a)}})}updateInnerHTML(e=this.input.innerHTML){e=e.replace(//,"").replace(/().+?\/custom-emoji-element>/g,"$1"),Pn.Y&&(e=e.replace(Tn,"")),this.inputFake.innerHTML=e}setValueSilently(e,t){super.setValueSilently(e,t),this.updateInnerHTML(),t||this.onFakeInput()}}var xn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let An;function _n(){return An}class Fn extends S.Z{constructor(e,t,i,s){super("popup-send-photo popup-new-media",{closable:!0,withConfirm:"Modal.Send",confirmShortcutIsSendShortcut:!0,body:!0,title:!0,scrollable:!0}),this.chat=e,this.files=t,this.ignoreInputValue=s,this.onScroll=()=>{const{input:e}=this.messageInputField;this.scrollable.onAdditionalScroll(),e.scrollTop>0&&e.scrollHeight>130&&this.scrollable.container.classList.remove("scrolled-bottom")},this.onKeyDown=e=>{const t=e.target,{input:i}=this.messageInputField;if(t!==i){if("INPUT"===t.tagName||t.isContentEditable)return;i.focus(),(0,Ot.Z)(i)}},this.attachFile=e=>{const t=this.willAttach,i=this.shouldCompress(e.type),s=document.createElement("div");s.classList.add("popup-item");const n={file:e};(0,En.Z)(n,["scaledBlob","middlewareHelper","itemDiv","mediaSpoiler"]),n.middlewareHelper=this.middlewareHelper.get().create(),n.itemDiv=s;const a=i?this.attachMedia(n):this.attachDocument(n);return t.sendFileDetails.push(n),a.catch((e=>{s.style.backgroundColor="#000",console.error("error rendering file",e)}))},this.animationGroup="",this.construct(i)}construct(e){return xn(this,void 0,void 0,(function*(){this.willAttach={type:e,sendFileDetails:[],group:!0};const t=yield this.managers.apiManager.getLimit("caption");if(this.captionLengthMax=t,(0,C.fc)(this.btnConfirm,(()=>this.send()),{listenerSetter:this.listenerSetter}),"scheduled"!==this.chat.type){const e=new cn({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending((()=>{this.send()}))},openSide:"bottom-left",onContextElement:this.btnConfirm,listenerSetter:this.listenerSetter});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}const i=yield(0,Mn.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"image",text:"Popup.Attach.AsMedia",onClick:()=>this.changeType("media"),verify:()=>this.hasAnyMedia()&&"document"===this.willAttach.type},{icon:"document",text:"SendAsFile",onClick:()=>this.changeType("document"),verify:()=>1===this.files.length&&"document"!==this.willAttach.type},{icon:"document",text:"SendAsFiles",onClick:()=>this.changeType("document"),verify:()=>this.files.length>1&&"document"!==this.willAttach.type},{icon:"groupmedia",text:"Popup.Attach.GroupMedia",onClick:()=>this.changeGroup(!0),verify:()=>!this.willAttach.group&&this.canGroupSomething()},{icon:"groupmediaoff",text:"Popup.Attach.UngroupMedia",onClick:()=>this.changeGroup(!1),verify:()=>this.willAttach.group&&this.canGroupSomething()},{icon:"mediaspoiler",text:"EnablePhotoSpoiler",onClick:()=>this.changeSpoilers(!0),verify:()=>this.canToggleSpoilers(!0,!0)},{icon:"mediaspoiler",text:"Popup.Attach.EnableSpoilers",onClick:()=>this.changeSpoilers(!0),verify:()=>this.canToggleSpoilers(!0,!1)},{icon:"mediaspoileroff",text:"DisablePhotoSpoiler",onClick:()=>this.changeSpoilers(!1),verify:()=>this.canToggleSpoilers(!1,!0)},{icon:"mediaspoileroff",text:"Popup.Attach.RemoveSpoilers",onClick:()=>this.changeSpoilers(!1),verify:()=>this.canToggleSpoilers(!1,!1)}]});this.header.append(i),this.btnConfirm.remove(),this.mediaContainer=document.createElement("div"),this.mediaContainer.classList.add("popup-photo"),this.scrollable.container.append(this.mediaContainer);const s=this.inputContainer=document.createElement("div");s.classList.add("popup-input-container");const n=document.createElement("div");let a,o,r;n.classList.add("popup-input-inputs","input-message-container"),this.messageInputField=new kn({placeholder:"PreviewSender.CaptionPlaceholder",name:"message",withLinebreaks:!0,maxLength:this.captionLengthMax}),this.listenerSetter.add(this.scrollable.container)("scroll",this.onScroll),this.listenerSetter.add(this.messageInputField.input)("scroll",this.onScroll),this.messageInputField.input.classList.replace("input-field-input","input-message-input"),this.messageInputField.inputFake.classList.replace("input-field-input","input-message-input"),n.append(this.messageInputField.input,this.messageInputField.inputFake),s.append(n,this.btnConfirm),this.ignoreInputValue||(this.messageInputField.value=this.wasInputValue=this.chat.input.messageInputField.input.innerHTML,this.chat.input.messageInputField.value=""),this.container.append(s),this.attachFiles(),this.addEventListener("close",(()=>{this.files.length=0,this.willAttach.sendFileDetails.length=0,An===this&&(An=void 0)})),(0,Ln.Z)({buttons:[{icon:"mediaspoiler",text:"EnablePhotoSpoiler",onClick:()=>{this.applyMediaSpoiler(r)},verify:()=>o&&!r.mediaSpoiler},{icon:"mediaspoileroff",text:"DisablePhotoSpoiler",onClick:()=>{this.removeMediaSpoiler(r)},verify:()=>!(!o||!r.mediaSpoiler)}],listenTo:this.mediaContainer,listenerSetter:this.listenerSetter,findElement:e=>(a=(0,be.Z)(e.target,"popup-item"),o=a.classList.contains("popup-item-media"),r=this.willAttach.sendFileDetails.find((e=>e.itemDiv===a)),a)}),An=this}))}applyMediaSpoiler(e,t){return xn(this,void 0,void 0,(function*(){const i=e.middlewareHelper.get(),{width:s,height:n}=e.itemDiv.style;let a,o;if(e.itemDiv.classList.contains("album-item")){const{width:t,height:i}=e.itemDiv.parentElement.style,r=parseInt(t),d=parseInt(i);a=+s.slice(0,-1)/100*r,o=+n.slice(0,-1)/100*d}else a=parseInt(s),o=parseInt(n);const{url:r}=yield(0,mn.Z)({media:e.itemDiv.firstElementChild,boxSize:(0,Qe.C)(40,40),mediaSize:(0,Qe.C)(a,o),toDataURL:!0,quality:.2}),d=(0,In.o)(r),l={_:"photoStrippedSize",bytes:d,type:"i"};e.strippedBytes=d;const c={_:"photo",sizes:[l],id:0,access_hash:0,date:0,dc_id:0,file_reference:[]},h=yield(0,qi.ZP)({middleware:i,width:a,height:o,animationGroup:this.animationGroup,media:c});i()&&(t||h.classList.add("is-revealing"),e.mediaSpoiler=h,e.itemDiv.append(h),yield(0,fe.d1)(),i()&&(0,qi.MR)({mediaSpoiler:h,reveal:!1}))}))}removeMediaSpoiler(e){(0,qi.MR)({mediaSpoiler:e.mediaSpoiler,reveal:!0,destroyAfter:!0}),e.mediaSpoiler=void 0}appendDrops(e){this.body.append(e)}get type(){return this.willAttach.type}set type(e){this.willAttach.type=e}partition(){const[e,t]=v(this.willAttach.sendFileDetails,(e=>bn.Z.has(e.file.type)));return{media:e,files:t}}mediaCount(){return this.partition().media.length}hasAnyMedia(){return this.mediaCount()>0}canGroupSomething(){const{media:e,files:t}=this.partition();return e.length>1||t.length>1}canToggleSpoilers(e,t){let i="media"===this.willAttach.type&&this.hasAnyMedia();if(t&&i&&(i=1===this.files.length),i){const s=this.willAttach.sendFileDetails.filter((e=>bn.Z.has(e.file.type))),n=s.filter((e=>e.mediaSpoiler));i=!!t||s.length>1,i&&(i=e?s.length!==n.length:s.length===n.length)}return i}changeType(e){this.willAttach.type=e,this.attachFiles()}changeGroup(e){this.willAttach.group=e,this.attachFiles()}changeSpoilers(e){this.partition().media.forEach((t=>{e&&!t.mediaSpoiler?this.applyMediaSpoiler(t):!e&&t.mediaSpoiler&&this.removeMediaSpoiler(t)}))}addFiles(e){const t=e.filter((e=>!this.files.find((t=>t.lastModified===e.lastModified&&t.name===e.name&&t.size===e.size))));t.length&&(this.files.push(...t),this.attachFiles())}send(e=!1){if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending((()=>{this.send(!0)}));let t=this.messageInputField.value;if(t.length>this.captionLengthMax)return void(0,we.Am)(L.ZP.format("Error.PreviewSender.CaptionTooLong",!0));const i=this.willAttach;i.isMedia="media"===i.type||void 0;const{sendFileDetails:s,isMedia:n}=i,{peerId:a,input:o}=this.chat,{length:r}=s,d=this.chat.getMessageSendingParams();this.iterate((e=>{t&&e.length!==r&&(this.managers.appMessagesManager.sendText(a,t,Object.assign(Object.assign({},d),{clearDraft:!0})),t=void 0);const s=e.map((e=>Object.assign(Object.assign({},e),{file:e.scaledBlob||e.file,spoiler:!!e.mediaSpoiler}))),o=Object.assign(Object.assign({},i),{sendFileDetails:s});this.managers.appMessagesManager.sendAlbum(a,Object.assign(Object.assign(Object.assign({},d),{caption:t,isMedia:n,clearDraft:!0}),o)),t=void 0})),o.replyToMsgId=this.chat.threadId,o.onMessageSent(),this.wasInputValue=void 0,this.hide()}modifyMimeTypeForTelegram(e){return"image/webp"===e?"image/jpeg":e}scaleImageForTelegram(e,t,i){return xn(this,void 0,void 0,(function*(){const s=2560;let n,a=e.src;if("image/gif"!==t&&(Math.max(e.naturalWidth,e.naturalHeight)>s||i&&"image/webp"===t)){const{blob:i}=yield(0,mn.Z)({media:e,boxSize:(0,Qe.C)(s,s),mediaSize:(0,Qe.C)(e.naturalWidth,e.naturalHeight),mimeType:this.modifyMimeTypeForTelegram(t)});n=i,URL.revokeObjectURL(a),a=yield Cn.Z.invoke("createObjectURL",i),yield(0,Ut.cj)(e,a)}return n&&{url:a,blob:n}}))}attachMedia(e){return xn(this,void 0,void 0,(function*(){const{itemDiv:t}=e;t.classList.add("popup-item-media");const i=e.file;if(i.type.startsWith("video/")){const s=(0,wn.Z)();let n;s.src=e.objectURL=yield Cn.Z.invoke("createObjectURL",i),s.autoplay=!0,s.controls=!1,s.muted=!0,s.addEventListener("timeupdate",(()=>{s.pause()}),{once:!0}),t.append(s);try{yield(0,Sn.Z)(s)}catch(e){n=e}if(e.width=s.videoWidth,e.height=s.videoHeight,e.duration=Math.floor(s.duration),n)throw n;const a=s.webkitAudioDecodedByteCount;void 0!==a&&(e.noSound=!a);const o=yield function(e){return new Promise(((t,i)=>{e.onseeked=()=>{e.onseeked=()=>{gn(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=i,e.currentTime=Math.min(e.duration,1)}))}(s);e.thumb=Object.assign({url:yield Cn.Z.invoke("createObjectURL",o.blob)},o)}else{const s=new Image;t.append(s);const n=e.objectURL=yield Cn.Z.invoke("createObjectURL",i);yield(0,Ut.cj)(s,n);const a=e.file.type,o=yield this.scaleImageForTelegram(s,a,!0);if(o&&(e.objectURL=o.url,e.scaledBlob=o.blob),e.width=s.naturalWidth,e.height=s.naturalHeight,"image/gif"===i.type)return e.noSound=!0,Promise.all([yn(s).then((t=>{e.duration=Math.ceil(t)})),gn(s).then((t=>xn(this,void 0,void 0,(function*(){e.thumb=Object.assign({url:yield Cn.Z.invoke("createObjectURL",t.blob)},t)}))))]).then((()=>{}))}}))}attachDocument(e){return xn(this,void 0,void 0,(function*(){const{itemDiv:t}=e;t.classList.add("popup-item-document");const i=e.file,s=i.type.startsWith("image/"),n=i.type.startsWith("audio/");let a;if((s||n||i.size<2e7)&&(e.objectURL||(e.objectURL=yield Cn.Z.invoke("createObjectURL",i))),s){a=new Image,yield(0,Ut.cj)(a,e.objectURL);const t=yield this.scaleImageForTelegram(a,e.file.type);t&&(e.objectURL=t.url)}const o={_:"document",file:i,file_name:i.name||"",size:i.size,type:s?"photo":"doc"};let r;e.objectURL&&(r={url:e.objectURL,downloaded:i.size,type:m.Pt});const d=yield(0,Yi.Z)({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:o}},cacheContext:r});s&&(e.width=a.naturalWidth,e.height=a.naturalHeight),t.append(d)}))}shouldCompress(e){return"media"===this.willAttach.type&&bn.Z.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),!this.ignoreInputValue&&this.addEventListener("close",(()=>{this.wasInputValue&&(this.chat.input.messageInputField.value=this.wasInputValue)})),this.show())}setTitle(){const{willAttach:e,title:t,files:i}=this;let s;const n=[];if("document"===e.type)s="PreviewSender.SendFile",n.push(i.length);else{let e=0,t=0,a=0;i.forEach((i=>{i.type.startsWith("image/")?++e:i.type.startsWith("video/")?++t:++a})),[e,t,a].filter((e=>e>0)).length>1?(s="PreviewSender.SendFile",n.push(i.length)):e?(s="PreviewSender.SendPhoto",n.push(e)):t&&(s="PreviewSender.SendVideo",n.push(t))}(0,H.Z)(t,(0,L.ag)(s,n))}appendMediaToContainer(e){if(this.shouldCompress(e.file.type)){const t=(0,vn.Z)(e.width,e.height,384,320);e.itemDiv.style.width=t.width+"px",e.itemDiv.style.height=t.height+"px"}this.mediaContainer.append(e.itemDiv)}iterate(e){const{sendFileDetails:t}=this.willAttach;if(!this.willAttach.group)return void t.forEach((t=>e([t])));const i=t.length;for(let s=0;s{e.middlewareHelper.destroy()}));const n=e.map((e=>this.attachFile(e)));Promise.all(n).then((()=>{i.replaceChildren(),e.length&&(this.setTitle(),this.iterate((e=>{const t=this.shouldCompress(e[0].file.type);if(t&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map((e=>e.itemDiv))),$i({container:t,items:e.map((e=>({w:e.width,h:e.height}))),maxWidth:384,minWidth:100,spacing:4}),i.append(t)}else e.forEach((e=>{this.appendMediaToContainer(e)}));t&&e.forEach((e=>{const t=s.find((t=>t.file===e.file));t&&t.mediaSpoiler&&this.applyMediaSpoiler(e,!0)}))})))})).then((()=>{this.onRender(),this.onScroll()}))}}var Dn=i(6057);const Rn="keydown",Bn="active",Nn=["ArrowUp","ArrowDown"],On=["ArrowLeft","ArrowRight"];function Un({list:e,type:t,onSelect:i,once:s,waitForKey:n}){let a=(null==n?void 0:n.length)?new Set(n):void 0;const o=new Set("xy"===t?Nn.concat(On):"x"===t?On:Nn);let r;const d=()=>r||e.querySelector("."+Bn)||e.firstElementChild,l=(e,i)=>{if(r===e)return;let s=!1;r&&(s=!0,r.classList.remove(Bn)),r=e,r&&(r.classList.add(Bn),s&&p&&i&&(0,ue.Z)({container:p,element:r,position:"center",forceDuration:100,axis:"x"===t?"x":"y"}))},c=(t,i)=>{let s;return s=i?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,s};let h;h="xy"===t?(t,i)=>"ArrowUp"===i||"ArrowDown"===i?((t,i)=>{const s=i?"nextElementSibling":"previousElementSibling",n=i?"firstElementChild":"lastElementChild",a=t.getBoundingClientRect();let o=t[s]||e[n];for(;o!==t;){const t=o.getBoundingClientRect();if(t.x===a.x&&t.y!==a.y)break;o=o[s]||e[n]}return o})(t,"ArrowDown"===i):c(t,"ArrowRight"===i):(e,t)=>c(e,"ArrowRight"===t||"ArrowDown"===t);let u=i=>{const s=i.key;if(o.has(s)){if((0,Le.Z)(i),e.childElementCount>1){let e=d();e=h(e,s),l(e,!0)}}else("Enter"===s||"xy"!==t&&"Tab"===s)&&((0,Le.Z)(i),g(d()))};const p=(0,be.Z)(e,"scrollable");e.classList.add("navigable-list");const f=t=>{const i=(0,Ne.Z)(t.target,e);i&&l(i,!1)},m=t=>{(0,Le.Z)(t);const i=(0,Ne.Z)(t.target,e);i&&(l(i,!1),g(d()))},g=e=>{return t=this,n=void 0,o=function*(){const t=yield i(e);(void 0!==t?!t:s)&&y()},new((a=void 0)||(a=Promise))((function(e,i){function s(e){try{d(o.next(e))}catch(e){i(e)}}function r(e){try{d(o.throw(e))}catch(e){i(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}d((o=o.apply(t,n||[])).next())}));var t,n,a,o};let v=!1;const b=()=>{v||(v=!0,document.addEventListener(Rn,u,{capture:!0,passive:!1}),e.addEventListener("mousemove",f,{passive:!0}),(0,C.fc)(e,m))},y=()=>{v&&(v=!1,document.removeEventListener(Rn,u,{capture:!0}),e.removeEventListener("mousemove",f),(0,C.EN)(e,m))},w=()=>{a||l(e.firstElementChild,!1)};if(a){const e=u;u=t=>{a.has(t.key)&&((0,Le.Z)(t),document.removeEventListener(Rn,u,{capture:!0}),u=e,document.addEventListener(Rn,u,{capture:!0,passive:!1}),a=void 0,w())}}else w();return b(),{attach:b,detach:y,resetTarget:w}}var Hn=i(6385),zn=i(5953);class jn extends l.Z{constructor(e){super(!1),this.hidden=!0,this.onVisible=()=>{this.detach&&this.detach();const e=this.list,{attach:t,detach:i,resetTarget:s}=Un({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.attach=t,this.detach=i,this.resetTarget=s,x.IS_MOBILE||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},Hn.Z.pushItem(this.navigationItem)),this.addEventListener("hidden",(()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",i(),this.navigationItem&&(Hn.Z.removeItem(this.navigationItem),this.navigationItem=void 0)}),{once:!0})},(0,zn.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("autocomplete-helper","z-depth-1"),e.appendTo.append(this.container),this.attachNavigation(),this.controller&&this.controller.addHelper(this)}toggleListNavigation(e){e?this.attach&&this.attach():this.detach&&this.detach()}attachNavigation(){this.addEventListener("visible",this.onVisible)}toggle(e,t=!1,i){if(this.init)return;if(void 0===e&&(e=this.container.classList.contains("is-visible")&&!this.container.classList.contains("backwards")),this.hidden===e)return void(e||this.dispatchEvent("visible"));this.hidden=e,e?(this.navigationItem&&(Hn.Z.removeItem(this.navigationItem),this.navigationItem=void 0),!t&&this.controller&&this.controller.hideOtherHelpers(),this.detach&&this.detach()):(this.controller&&this.controller.hideOtherHelpers(this),this.dispatchEvent("visible"));const s=this.controller||e?0:2;e&&this.dispatchEvent("hiding"),(0,De.Z)({element:this.container,className:"is-visible",forwards:!e,duration:d.Z.settings.animationsEnabled&&!i?300:0,onTransitionEnd:()=>{this.hidden&&this.dispatchEvent("hidden")},useRafs:s})}}class Gn extends jn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>{return t=this,i=void 0,n=function*(){return!(yield Mt.Jo.onMediaClick({target:e},!0))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n},waitForKey:["ArrowUp","ArrowDown"]}),this.chat=i,this.managers=s,this.container.classList.add("stickers-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0),d.Z.dispatchEvent("choosing_sticker",!0)})),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(o.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0,this.listenerSetter.removeAll(),this.listenerSetter=void 0),d.Z.dispatchEvent("choosing_sticker",!1)}))}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),Us(e),this.managers.appStickersManager.getStickersByEmoticon(e).then((e=>{if(!t())return;this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();let s;this.lazyLoadQueue.clear(),s=e.length?new Promise((t=>{const s=[];e.forEach((e=>{i.append(this.superStickerRenderer.renderSticker(e,void 0,s))})),Promise.all(s).finally(t)})):Promise.resolve(),s.then((()=>{this.list.replaceWith(i),this.list=i,this.onChangeScreen||(this.onChangeScreen=()=>{const e=this.list.childElementCount*o.Z.active.popupSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},o.Z.addEventListener("changeScreen",this.onChangeScreen),this.listenerSetter=new ce.Z,(0,Gi.Z)({listenTo:this.container,listenerSetter:this.listenerSetter})),this.onChangeScreen(),this.toggle(!e.length),this.scrollable.scrollTop=0}))}))}init(){this.list=document.createElement("div"),this.list.classList.add("stickers-helper-stickers","super-stickers"),this.container.append(this.list),this.scrollable=new T.ZP(this.container),this.lazyLoadQueue=new le.Z,this.superStickerRenderer=new Dn.vT(this.lazyLoadQueue,this.chat.animationGroup,this.managers)}}var Vn=i(2230);const Kn=()=>{const e=new Date;return e.setHours(0,0,0,0),e},Wn=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class $n extends I{constructor(e,t,i){var s;if(super((s=e).getTime()>Wn().getTime()?new Date:s,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:Kn(),maxDate:Wn(),withTime:!0,showOverflowMonths:!0,confirmShortcutIsSendShortcut:!0,title:!0}),this.element.classList.add("popup-schedule"),this.header.append(this.controlsDiv),this.title.replaceWith(this.monthTitle),this.body.append(this.btnConfirm),i){const e=(0,He.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),(0,C.fc)(e,(()=>{t(ke),this.hide()}))}}}var qn=i(8119),Qn=i(8799),Yn=i(6760),Xn=i(6299),Jn=i(6039);class ea extends jn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"x",onSelect:e=>{i.onEmojiSelected((0,Jn.xG)(e),!0)}}),this.managers=s,this.container.classList.add("emoji-helper")}init(){this.list=document.createElement("div"),this.list.classList.add("emoji-helper-emojis","super-emojis"),this.container.append(this.list),this.scrollable=new T.v7(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollLeft=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}(e=e.slice(0,80)).length&&(this.list.innerHTML="",e.forEach((e=>{(0,Jn.IA)(e,this.list,!1,!0)}))),this.waitForKey=t?["ArrowUp","ArrowDown"]:void 0,this.toggle(!e.length)}checkQuery(e,t){const i=this.controller.getMiddleware();this.managers.appEmojiManager.getBothEmojiKeywords().then((()=>{return s=this,n=void 0,o=function*(){if(!i())return;const s=e.replace(/^:/,""),n=yield this.managers.appEmojiManager.searchEmojis(s);i()&&this.render(n,":"!==t)},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}d((o=o.apply(s,n||[])).next())}));var s,n,a,o}))}}class ta extends jn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"y",onSelect:s}),this.className=i,this.container.classList.add(ta.BASE_CLASS,i)}init(){this.list=document.createElement("div"),this.list.classList.add(ta.BASE_CLASS+"-list",this.className+"-list"),this.container.append(this.list),this.scrollable=new T.ZP(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}e.length&&(this.list.innerHTML="",e.forEach((e=>{const t=ta.listElement({className:this.className,peerId:e.peerId,name:e.name,description:e.description});this.list.append(t)}))),t||this.toggle(!e.length)}static listElement(e){const t=ta.BASE_CLASS_LIST_ELEMENT;e.className+="-list-element";const i=document.createElement("div");i.classList.add(t,e.className),i.dataset.peerId=""+e.peerId;const s=new f.Z;s.classList.add("avatar-30",t+"-avatar",e.className+"-avatar"),s.updateWithOptions({isDialog:!1,peerId:e.peerId});const n=document.createElement("div");if(n.classList.add(t+"-name",e.className+"-name"),e.name?(0,F.Z)(n,(0,B.Z)(e.name)):n.append(new N.Z({peerId:e.peerId,dialog:!1,onlyFirstName:!1,plainText:!1}).element),i.append(s,n),e.description){const s=document.createElement("div");s.classList.add(t+"-description",e.className+"-description"),(0,F.Z)(s,(0,B.Z)(e.description)),i.append(s)}return i}}ta.BASE_CLASS="autocomplete-peer-helper",ta.BASE_CLASS_LIST_ELEMENT=ta.BASE_CLASS+"-list-element";var ia=i(7381);function sa(e,t,i){const s=[].concat(t.bot_info);let n;void 0!==i&&(n=new ia.Z({ignoreCase:!0}));const a=new Map;let o;if(s.forEach((t=>{t.commands&&t.commands.forEach((({command:i,description:s},o)=>{const r="/"+i;a.set(i,{peerId:t.user_id?t.user_id.toPeerId(!1):e,command:i,name:r,description:s,index:o}),n&&n.indexObject(i,r)}))})),n){const e=n.search(i);o=Array.from(e).map((e=>a.get(e)))}else o=[...a.values()];return o=o.sort(((e,t)=>a.get(e.command).index-a.get(t.command).index)),o}class na extends ta{constructor(e,t,i,s){super(e,t,"commands-helper",(e=>{const t=e.querySelector(`.${ta.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return i.getReadyToSend((()=>{i.messageInput.innerHTML=t,i.sendMessage(!0)}))})),this.managers=s}checkQuery(e,t){return i=this,s=void 0,a=function*(){if(!(yield this.managers.appUsersManager.isBot(t)))return!1;const i=this.controller.getMiddleware();return this.managers.appProfileManager.getProfileByPeerId(t).then((s=>{if(!i())return;const n=sa(t,s,e);this.render(n)})),!0},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}class aa{constructor(){this.helpers=new Set,this.middleware=(0,Ce.k)()}toggleListNavigation(e){for(const t of this.helpers)t.toggleListNavigation(e)}getMiddleware(){return this.middleware.clean(),this.middleware.get()}addHelper(e){this.helpers.add(e)}hideOtherHelpers(e){this.helpers.forEach((t=>{t!==e&&t.toggle(!0,!0)})),e||this.middleware.clean()}}var oa=i(5102),ra=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class da extends ta{constructor(e,t,i,s){super(e,t,"mentions-helper",(e=>{const t=e.dataset.peerId.toUserId();Promise.resolve(s.appUsersManager.getUser(t)).then((e=>{let t,s="";const n=(0,oa.Z)(e);n[0]?s="@"+n[0]:(s=e.first_name||e.last_name,t={_:"messageEntityMentionName",length:s.length,offset:0,user_id:e.id}),s+=" ",i.insertAtCaret(s,t)}))})),this.managers=s}checkQuery(e,t,i){const s=e.trim();if(e.length!==s.length)return!1;const n=this.controller.getMiddleware();return this.managers.appProfileManager.getMentions(t&&t.toChatId(),s,i).then((e=>ra(this,void 0,void 0,(function*(){if(!n())return;e=e.filter((e=>e!==d.Z.myId));const t=e.map((e=>ra(this,void 0,void 0,(function*(){const t=yield this.managers.appUsersManager.getUser(e),i=(0,oa.Z)(t);return{peerId:e,description:i[0]?"@"+i[0]:void 0}}))));this.render((yield Promise.all(t)).filter(Boolean))})))),!0}}var la=i(5494),ca=i(6339),ha=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class ua extends ca.Z{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;(0,Ne.Z)(t,this.element)||t===this.btnHover||((0,Le.Z)(e),this.toggle(!1))},(0,zn.Z)(this,e),this.element.classList.add(ua.BASE_CLASS),this.element.style.display="none",this.scrollable=new T.ZP,this.element.append(this.scrollable.container),this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(d.Z)("history_reply_markup",(({peerId:e})=>ha(this,void 0,void 0,(function*(){this.peerId===e&&(this.checkAvailability()&&this.isActive()&&(yield this.render()),(0,pe.e9)().then((()=>{this.checkForceReply()})))}))))}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",(()=>ha(this,void 0,void 0,(function*(){yield this.render(),c.Z&&(this.touchListener=this.listenerSetter.add(document.body)("touchstart",this.onBodyTouchStart,{passive:!1,capture:!0}),this.listenerSetter.add(this)("close",(()=>{this.listenerSetter.remove(this.touchListener)}),{once:!0}))})))),(0,C.fc)(this.element,(e=>{const t=(0,be.Z)(e.target,"btn");if(!t)return;const i=t.dataset.type,{peerId:s}=this;"keyboardButtonRequestPhone"===i?(0,bi.Z)({titleLangKey:"ShareYouPhoneNumberTitle",button:{langKey:"OK"},descriptionLangKey:"AreYouSureShareMyContactInfoBot"}).then((()=>{this.managers.appMessagesManager.sendContact(s,d.Z.myId)})):this.managers.appMessagesManager.sendText(s,t.dataset.text),this.toggle(!1)}),{listenerSetter:this.listenerSetter}),super.init()}checkForceReply(){return ha(this,void 0,void 0,(function*(){const e=yield this.getReplyMarkup();"replyKeyboardForceReply"!==e._||e.pFlags.hidden||e.pFlags.used||(e.pFlags.used=!0,this.chatInput.initMessageReply(e.mid))}))}getReplyMarkup(){var e;return ha(this,void 0,void 0,(function*(){return null!==(e=(yield this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup)&&void 0!==e?e:{_:"replyKeyboardHide"}}))}render(e){return ha(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup()),this.scrollable.container.replaceChildren();for(const t of e.rows){const e=document.createElement("div");e.classList.add(ua.BASE_CLASS+"-row");for(const i of t.buttons){const t=document.createElement("button");t.classList.add(ua.BASE_CLASS+"-button","btn"),(0,F.Z)(t,(0,B.Z)(i.text)),t.dataset.text=i.text,t.dataset.type=i._,e.append(t)}this.scrollable.container.append(e)}}))}checkAvailability(e){var t;return ha(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup());const i="replyKeyboardHide"===e._||!(null===(t=e.rows)||void 0===t?void 0:t.length);return this.btnHover.classList.toggle("hide",i),i&&this.toggle(!1),!i}))}setPeer(e){this.peerId=e,this.checkAvailability(),this.checkForceReply()}}ua.BASE_CLASS="reply-keyboard";var pa=i(1080),fa=i(8678),ma=i(2830),ga=i(515);const va="INLINE-HELPER";class ba extends jn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"xy",waitForKey:["ArrowUp","ArrowDown"],onSelect:e=>{if(!e)return!1;const{peerId:t,botId:i,queryId:s}=this.list.dataset;return this.chat.input.getReadyToSend((()=>{const n=(0,ga.Z)(s,e.dataset.resultId);this.managers.appInlineBotsManager.sendInlineResult(t.toPeerId(),i,n,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{clearDraft:!0})),this.chat.input.onMessageSent(!0,!0)}))}}),this.chat=i,this.managers=s,this._checkQuery=(e,t,i)=>{return s=this,n=void 0,r=function*(){const s=this.controller.getMiddleware(),n=yield this.managers.appUsersManager.resolveUsername(t);if(!s())throw"PEER_CHANGED";if("user"!==n._||!n.pFlags.bot)throw"NOT_A_BOT";const a=this.managers.appInlineBotsManager.getInlineResults(e,n.id,i).then((t=>{if(!s())throw"PEER_CHANGED";this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();i.dataset.peerId=""+e,i.dataset.botId=""+n.id,i.dataset.queryId=""+t.query_id;const a=new pa.Z(null,va,this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const r=[],d=!!t.pFlags.gallery;for(const e of t.results){const t=document.createElement("div");t.classList.add("inline-helper-result"),t.dataset.resultId=e.id;const n=d?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),i.append(t),d)t.classList.add("grid-item");else{n.classList.add("empty"),(0,F.Z)(n,(0,B.Z)([...e.title.trim()][0]));const s=document.createElement("div");s.classList.add("inline-helper-result-title"),(0,F.Z)(s,(0,B.Z)(e.title));const a=document.createElement("div");a.classList.add("inline-helper-result-description"),(0,F.Z)(a,(0,mt.ZP)(e.description,{noCommands:!0,noLinks:!0})),t.append(s,a);const o=document.createElement("div");o.classList.add("inline-helper-separator"),i.append(o)}if("botInlineResult"===e._){if(e.thumb&&0===e.thumb.mime_type.indexOf("image/")){let i;n?(i=document.createElement("div"),n.append(i)):i=t,i.classList.add("media-container"),d&&i.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>Rs.Z.download({dcId:4,location:{_:"inputWebFileLocation",access_hash:e.thumb.access_hash,url:e.thumb.url},size:e.thumb.size,mimeType:e.thumb.mime_type}).then((e=>{const t=new Image;t.classList.add("media-photo"),(0,fa.Z)(e).then((e=>{(0,ma.Z)(i,t,e,!0)}))}))})}}else{const i=e.document||e.photo;if(["sticker","gif"].includes(null==i?void 0:i.type)&&d)(0,Ze.Z)(i),"gif"===i.type?a.add(i,t):"sticker"===i.type&&(t.classList.add("super-sticker"),this.superStickerRenderer.renderSticker(i,t,r),i.animated&&this.superStickerRenderer.observeAnimated(t));else if(i){const e=d?48:void 0;d&&t.classList.add("no-border-radius"),(0,K.Z)({photo:i,container:d?t:n,boxWidth:e,boxHeight:e,middleware:s,lazyLoadQueue:this.lazyLoadQueue,loadPromises:r})}}}return Promise.all(r).then((()=>{if(!s())return void a.clear();i.classList.toggle("is-gallery",d),i.classList.toggle("super-stickers",d),this.container.classList.toggle("is-gallery",d);const r=this.list.parentElement;if(r.textContent="",t.switch_pm){const i=(0,He.Z)("btn-primary btn-secondary btn-primary-transparent primary");(0,F.Z)(i,(0,B.Z)(t.switch_pm.text)),(0,C.fc)(i,(i=>{this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchToPM(e,n.id,t.switch_pm.start_param)})),r.append(i)}r.append(this.list=i),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=a,a.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*o.Z.active.popupSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},o.Z.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0}))}));return{user:n,renderPromise:a}},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function o(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,o)}d((r=r.apply(s,n||[])).next())}));var s,n,a,r},this.container.classList.add("inline-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)})),this.checkQuery=(0,Te.Z)(this._checkQuery,200,!0,!0),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(o.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0)}))}init(){this.list=document.createElement("div"),this.list.classList.add("inline-helper-results"),this.container.append(this.list),this.scrollable=new T.ZP(this.container),this.lazyLoadQueue=new le.Z,this.superStickerRenderer=new Dn.vT(this.lazyLoadQueue,va,this.managers)}}var ya=i(8090),wa=i(3013),Sa=i(5133);class Ca extends ta{constructor(e,t,i){super(e,void 0,"bot-commands",(e=>{const i=e.querySelector(`.${ta.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return t.getReadyToSend((()=>{t.messageInput.innerHTML=i,t.sendMessage(!0),this.toggle(!0)}))})),this.managers=i}setUserId(e,t){var i;if(this.userId!==e||!(null===(i=this.list)||void 0===i?void 0:i.childElementCount))return this.userId=e,(0,We.Z)(this.managers.appProfileManager.getProfile(e),(i=>{if(!t())return;const s=sa(e.toPeerId(!1),i),n=50*s.length+8+24;this.container.style.setProperty("--height",n+"px"),this.render(s)}));this.toggle(!1)}}var La=i(8479),Ea=(i(1544),i(7197)),Ia=i(6241),Ma=i(6535),Pa=i(2821),Za=i(3066);function Ta(e){return t=this,i=void 0,n=function*(){return{cached:e.cached,result:e.cached?yield e.result:e.result}},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}function ka(e){return e.then(Ta)}var xa=i(177),Aa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class _a{constructor(e,t,i){this.managers=e,this.onReady=t,this.onChange=i,this.middleware=(0,Ce.k)(),this.listenerSetter=new ce.Z,this.construct()}construct(){this.container=document.createElement("div"),this.container.classList.add("new-message-send-as-container"),this.closeBtn=document.createElement("div"),this.closeBtn.classList.add("new-message-send-as-close","new-message-send-as-avatar","tgico-close");const e=[{text:"SendMessageAsTitle",onClick:void 0}];let t;this.buttons=[];const i=e=>{e&&(t=this.avatar);const i=this.avatar!==t,s=!e&&i?2:0;(0,De.Z)({element:this.closeBtn,className:"is-visible",forwards:e,duration:300,useRafs:s}),i||(0,De.Z)({element:t,className:"is-visible",forwards:!e,duration:300,useRafs:s})};(0,Mn.Z)({buttonOptions:{noRipple:!0},listenerSetter:this.listenerSetter,container:this.container,direction:"top-right",buttons:e,onOpenBefore:()=>{i(!0)},onOpen:(t,i)=>{e[0].element.classList.add("btn-menu-item-header"),this.btnMenu=i,this.btnMenu.classList.add("scrollable","scrollable-y"),this.btnMenu.append(...this.buttons.map((e=>e.element)))},onClose:()=>{i(!1)},onCloseAfter:()=>{this.btnMenu=void 0}}),this.container.append(this.closeBtn)}updateButtons(e){var t;return Aa(this,void 0,void 0,(function*(){const i=e.map(((e,t)=>Aa(this,void 0,void 0,(function*(){const i=document.createElement("div"),s=document.createElement("div");return s.classList.add("btn-menu-item-subtitle"),e.isUser()?s.append((0,L.ag)("Chat.SendAs.PersonalAccount")):e===this.peerId?s.append((0,L.ag)("VoiceChat.DiscussionGroup")):s.append(yield(0,xa.Z)(e.toChatId())),i.append(new N.Z({peerId:e}).element,s),{onClick:t?()=>Aa(this,void 0,void 0,(function*(){const t=this.peerId;this.changeSendAsPeerId(e);const i=this.middleware.get(),s=()=>{if(this.sendAsPeerId!==e||!i())return;const t=this.sendAsPeerIds.slice();(0,h.Z)(t,e),t.unshift(e),this.updateButtons(t)};d.Z.settings.animationsEnabled?setTimeout(s,250):s(),this.managers.appMessagesManager.saveDefaultSendAs(t,e)})):void 0,textElement:i}})))),s=yield Promise.all(i);(0,ks.b)({buttons:s}),s.forEach(((t,i)=>{const s=e[i],n=new f.Z;n.classList.add("avatar-26","btn-menu-item-icon"),n.updateWithOptions({peerId:s}),i||n.classList.add("active"),t.element.prepend(n)})),this.buttons=s,null===(t=this.btnMenu)||void 0===t||t.append(...this.buttons.map((e=>e.element)))}))}updateAvatar(e,t){return Aa(this,void 0,void 0,(function*(){const i=this.avatar;if(i&&i.peerId===e)return;i||(t=!0);const s=t?0:2,n=t?0:300,a=this.avatar=new f.Z;a.classList.add("new-message-send-as-avatar","avatar-30"),yield a.updateWithOptions({isDialog:!1,peerId:e}),(0,De.Z)({element:a,className:"is-visible",forwards:!0,duration:n,useRafs:s}),i&&(0,De.Z)({element:i,className:"is-visible",forwards:!1,duration:n,onTransitionEnd:()=>{i.remove()},useRafs:s}),this.container.append(a)}))}changeSendAsPeerId(e,t){return this.sendAsPeerId=e,this.onChange(e),this.updateAvatar(e,t)}getDefaultSendAs(){return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((e=>({cached:e.cached,result:e.result.then((e=>e.default_send_as?(0,R.Z)(e.default_send_as):void 0))})))}updateManual(e){return Aa(this,void 0,void 0,(function*(){const t=this.peerId;if(this.updatingPromise||!(yield this.managers.appPeersManager.isChannel(t)))return;const i=this.middleware.get((()=>!this.updatingPromise||this.updatingPromise===l)),{container:s}=this,n=t.toChatId(),a=(yield ka(this.getDefaultSendAs())).result,o=e;a instanceof Promise&&(e=void 0);const r=o&&!e,l=this.updatingPromise=(0,We.Z)(a,(t=>Aa(this,void 0,void 0,(function*(){if(!i()||void 0===t)return;if(yield this.changeSendAsPeerId(t,e),!i())return;this.managers.appChatsManager.getSendAs(n).then((e=>{if(!i())return;const s=e.filter((e=>!e.pFlags.premium_required)).map((e=>e.peer)).map((e=>(0,R.Z)(e)));this.sendAsPeerIds=s.slice(),(0,h.Z)(s,t),s.unshift(t),this.updateButtons(s)}));const a=()=>{this.onReady(s,e),this.addedListener||(this.listenerSetter.add(d.Z)("peer_full_update",(e=>{this.peerId===e&&this.update()})),this.addedListener=!0)};if(!r)return a;a()}))));return l.finally((()=>{this.updatingPromise===l&&(this.updatingPromise=void 0)})),r?void 0:l}))}update(e){return this.updateManual(e).then((e=>null==e?void 0:e()))}setPeerId(e){this.middleware.clean(),this.updatingPromise=void 0,this.peerId=e}destroy(){this.container.remove(),this.setPeerId(),this.listenerSetter.removeAll()}}var Fa=i(9041);function Da(e,t){const i={};e.forEach((e=>i[e]=0));const s=window.getSelection();let n=-1;if(!s.isCollapsed){const t=s.getRangeAt(0),a=t.commonAncestorContainer,o=a.nodeType===a.ELEMENT_NODE?a:a.parentElement,r=document.createTreeWalker(o.closest('[contenteditable="true"]'),NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT,{acceptNode:e=>t.intersectsNode(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});let d;for(n=0;d=r.nextNode();){++n;for(const t of e){const e=Fa.o[t];(d.nodeType===d.ELEMENT_NODE?d:d.parentElement).closest(e.match)&&++i[t]}}}const a={};for(const s of e)a[s]=i[s]>=(t?n:1);return a}var Ra=i(6034),Ba=i(8794),Na=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Oa="Posting media content isn't allowed in this group.";class Ua{constructor(e,t,i){this.chat=e,this.appImManager=t,this.managers=i,this.lastUrl="",this.lastTimeType=0,this.replyElements={},this.willSendWebPage=null,this.recording=!1,this.recordCanceled=!1,this.recordStartTime=0,this.lockRedo=!1,this.canRedoFromHTML="",this.undoHistory=[],this.executedHistory=[],this.canUndoFromHTML="",this.onCancelRecordClick=e=>{e&&(0,Le.Z)(e),this.recordCanceled=!0,this.recorder.stop(),ln.Z.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=c.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=c.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>Na(this,void 0,void 0,(function*(){const{peerId:i}=this.chat,s=this.chat.bubbles.getMiddleware(),n=d.Z.myId!==i&&i.isUser()&&(yield this.managers.appUsersManager.isUserOnlineVisible(i));new $n(t,(t=>{s()&&(t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout((()=>{s()&&(S.Z.getPopups(P.Z).forEach((e=>e.hide())),this.appImManager.openScheduled(i))}),0))}),n).show()})),this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,i)=>{(0,Le.Z)(e);let s=this.messageInput.innerHTML;if(s&&s!==i){this.lockRedo=!0;let e=0;do{document.execCommand(t,!1,null);const i=this.messageInput.innerHTML;if(s===i){if(++e>2)break}else e=0;s=i}while(s!==i);this.lockRedo=!1}},this.handleMarkdownShortcut=e=>{const t={KeyB:"bold",KeyI:"italic",KeyU:"underline",KeyS:"strikethrough",KeyM:"monospace",KeyP:"spoiler"};this.appImManager.markupTooltip&&(t.KeyK="link");const i=e.code,s=t[i];if(!Ds(document.getSelection())&&s&&("KeyK"===i?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(s),(0,Le.Z)(e)),"KeyZ"===i){let t=this.messageInput.innerHTML;e.shiftKey?this.undoHistory.length&&(this.executedHistory.push(t),t=this.undoHistory.pop(),this.undoRedo(e,"redo",t),t=this.messageInput.innerHTML,this.canRedoFromHTML=this.undoHistory.length?t:"",this.canUndoFromHTML=t):!this.executedHistory.length||this.canUndoFromHTML&&t!==this.canUndoFromHTML||(this.undoHistory.push(t),t=this.executedHistory.pop(),this.undoRedo(e,"undo",t),this.canUndoFromHTML=this.canRedoFromHTML=this.messageInput.innerHTML)}},this.onMessageInput=e=>{var t;const{value:i,entities:s,caretPos:n}=(0,un.Z)(this.messageInputField.input),a=(0,Pa.Z)(i,s,!0),o=(0,Ia.Z)(s,(0,Ma.Z)(a));this.canRedoFromHTML&&!this.lockRedo&&this.messageInput.innerHTML!==this.canRedoFromHTML&&(this.canRedoFromHTML="",this.undoHistory.length=0);const r=(!(null===(t=this.editMessage)||void 0===t?void 0:t.media)||"messageMediaWebPage"===this.editMessage.media._)&&o.filter((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._));if(r.length)for(const e of r){let t;if("messageEntityTextUrl"===e._)t=e.url;else if(t=i.slice(e.offset,e.offset+e.length),!t.includes("http://")&&!t.includes("https://"))continue;if(this.lastUrl!==t){this.lastUrl=t;const e=this.getWebPagePromise=this.managers.appWebPagesManager.getWebPage(t).then((i=>{this.getWebPagePromise===e&&(this.getWebPagePromise=void 0),this.lastUrl===t&&("webPage"===i._?(this.setTopInfo("webpage",(()=>{}),i.site_name||i.title||"Webpage",i.description||i.url||""),delete this.noWebPage,this.willSendWebPage=i):this.willSendWebPage&&this.onHelperCancel())}))}break}else this.lastUrl&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.helperType?this.helperFunc():this.clearHelper());if(i.trim()){const e=Date.now();e-this.lastTimeType>=6e3&&(this.lastTimeType=e,this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageTypingAction"},void 0,this.chat.threadId)),this.botCommands&&this.botCommands.toggle(!0)}else this.lastTimeType&&this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"},void 0,this.chat.threadId),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.hide(),document.activeElement===this.messageInput&&setTimeout((()=>{document.activeElement===this.messageInput&&this.resetCurrentFontFormatting()}),0);this.botCommands&&this.updateBotCommandsToggle(),this.editMsgId||this.saveDraftDebounced(),this.checkAutocomplete(i,n,o),this.updateSendBtn()},this.onEmojiSelected=(e,t)=>{const i=e.docId?{_:"messageEntityCustomEmoji",document_id:e.docId,length:e.emoji.length,offset:0}:(0,Ea.Z)(e.emoji);this.insertAtCaret(e.emoji,i,t)},this.onBtnSendClick=e=>Na(this,void 0,void 0,(function*(){if((0,Le.Z)(e),!this.recorder||this.recording||!this.isInputEmpty()||this.forwarding||this.editMsgId)this.recording?Date.now()-this.recordStartTime<500?this.onCancelRecordClick():this.recorder.stop():this.sendMessage();else{const e=this.chat.peerId.isAnyChat();if(e&&!(yield this.chat.canSend("send_media")))return void(0,we.Am)(Oa);this.chatInput.classList.add("is-locked"),(0,Qn.Z)();let t=!1;if(!e){const e=yield this.managers.appProfileManager.getProfile(this.chat.peerId.toUserId());(null==e?void 0:e.pFlags.voice_messages_forbidden)&&((0,we.bC)({langPackKey:"Chat.SendVoice.PrivacyError",langPackArguments:[yield(0,Kt.Z)({peerId:this.chat.peerId})]}),t=!0)}if(t)return void this.chatInput.classList.remove("is-locked");this.recorder.start().then((()=>{this.releaseMediaPlayback=wa.Z.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),ln.Z.setKeepAlive(!0);const e=()=>{new As.Z("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{(0,C.tH)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",(t=>{(0,be.Z)(t.target,"chat-input")||(0,be.Z)(t.target,"popup-cancel-record")||((0,Le.Z)(t),e())}),{capture:!0,passive:!1}),Hn.Z.pushItem(this.recordingNavigationItem={type:"voice",onPop:()=>(setTimeout((()=>{e()}),0),!1)}),this.recordStartTime=Date.now();const t=this.recorder.sourceNode,i=t.context.createAnalyser();t.connect(i),i.fftSize=32;const s=new Uint8Array(i.frequencyBinCount),n=255*s.length,a=()=>{if(!this.recording)return;i.getByteFrequencyData(s);let e=0;s.forEach((t=>{e+=t}));const t=Math.min(1,e/n+.36);this.recordRippleEl.style.transform=`scale(${t})`;const o=Date.now()-this.recordStartTime,r=o%1e3,d=(0,is.Z)(o/1e3)+","+("00"+Math.round(r/10)).slice(-2);this.recordTimeEl.innerText=d,(0,fe.T2)(a)};a()})).catch((e=>{switch(e.name){case"NotAllowedError":(0,we.Am)("Please allow access to your microphone");break;case"NotReadableError":(0,we.Am)(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),(0,we.Am)(e.message)}this.setRecording(!1),this.chatInput.classList.remove("is-locked")}))}})),this.onHelperCancel=(e,t)=>Na(this,void 0,void 0,(function*(){if(e&&(0,Le.Z)(e),this.willSendWebPage){const e=this.lastUrl;let t=!1;if(this.helperType&&(yield this.helperFunc(),t=!0),this.lastUrl=e,this.noWebPage=!0,this.willSendWebPage=null,t)return}if("edit"===this.helperType&&!t){const e=this.editMessage,t=this.getCurrentInputAsDraft();if(t&&delete t.pFlags.no_webpage,!(0,Ra.Z)(t,Object.assign(Object.assign({},e),{_:"draftMessage"})))return void new As.Z("discard-editing",{buttons:[{langKey:"Alert.Confirm.Discard",callback:()=>{this.onHelperCancel(void 0,!0)}}],descriptionLangKey:"Chat.Edit.Cancel.Text"}).show()}this.clearHelper(),this.updateSendBtn()})),this.onHelperClick=e=>{if((0,Le.Z)(e),(0,be.Z)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&c.Z&&!e.container.classList.contains("active")&&Et.Z.openBtnMenu(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new ce.Z}construct(){this.chatInput=document.createElement("div"),this.chatInput.classList.add("chat-input","hide"),this.inputContainer=document.createElement("div"),this.inputContainer.classList.add("chat-input-container"),this.rowsWrapperWrapper=document.createElement("div"),this.rowsWrapperWrapper.classList.add("rows-wrapper-wrapper"),this.rowsWrapper=document.createElement("div"),this.rowsWrapper.classList.add("rows-wrapper","chat-input-wrapper"),this.rowsWrapperWrapper.append(this.rowsWrapper);const e=Ts();this.rowsWrapper.append(e);const t=this.fakeRowsWrapper=document.createElement("div");t.classList.add("fake-wrapper","fake-rows-wrapper");const i=this.fakeSelectionWrapper=document.createElement("div");i.classList.add("fake-wrapper","fake-selection-wrapper"),this.inputContainer.append(this.rowsWrapperWrapper,t,i),this.chatInput.append(this.inputContainer),this.goDownBtn=(0,qn.Z)({icon:"arrow_down",className:"bubbles-corner-button chat-secondary-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),(0,C.fc)(this.goDownBtn,(e=>{(0,Le.Z)(e),this.chat.bubbles.onGoDownClick()}),{listenerSetter:this.listenerSetter});const s=this.controlContainer=document.createElement("div");s.classList.add("chat-input-control","chat-input-wrapper"),this.inputContainer.append(s)}constructPeerHelpers(){this.replyElements.container=document.createElement("div"),this.replyElements.container.classList.add("reply-wrapper"),this.replyElements.iconBtn=(0,Vn.Z)(""),this.replyElements.cancelBtn=(0,Vn.Z)("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>{s=!0},t=()=>{s=!1},i=this.forwardElements={};let s=!1;const n=[i.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkForClose:()=>this.canToggleHideAuthor(),checkboxField:new jt.Z({checked:!0})},i.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkForClose:()=>this.canToggleHideAuthor(),checkboxField:new jt.Z({checked:!1})},i.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new jt.Z({checked:!0})},i.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new jt.Z({checked:!1})},i.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],a=i.container=(0,ks.b)({buttons:n,listenerSetter:this.listenerSetter}),o=Array.from(a.children);[{elements:o.slice(0,2),onChange:(e,t)=>{const n=!!+e;s&&(this.forwardWasDroppingAuthor=!n);const a=this.replyElements.container.querySelector(".reply-title");if(a){const e=a.firstElementChild,t=L.ZP.weakMap.get(e),s=i.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=s,t.update()}}},{elements:o.slice(2,4),onChange:e=>{const t=!!+e;let s;s=t&&void 0!==this.forwardWasDroppingAuthor?this.forwardWasDroppingAuthor?i.hideSender:i.showSender:t?i.showSender:i.hideSender,s.checkboxField.checked=!0}}].forEach((e=>{const t=(0,Sa.Z)(e.elements.map((e=>({container:e,input:e.querySelector("input")}))),e.onChange),i=document.createElement("hr");t.append(i),a.append(t)})),a.append(i.changePeer.element),c.Z||(this.forwardHover=new ca.Z({element:a})),i.modifyArgs=n.slice(0,-1),this.replyElements.container.append(a),i.modifyArgs.forEach(((e,t)=>{const{input:i}=e.checkboxField;i.type="radio",i.name=t<2?"author":"caption",i.value=""+ +!(t%2)})),this.newMessageWrapper=document.createElement("div"),this.newMessageWrapper.classList.add("new-message-wrapper"),this.replyInTopicOverlay=document.createElement("div"),this.replyInTopicOverlay.classList.add("reply-in-topic-overlay","hide"),this.replyInTopicOverlay.append((0,L.ag)("Chat.Input.ReplyToAnswer")),this.btnToggleEmoticons=(0,Vn.Z)("none toggle-emoticons",{noRipple:!0}),this.inputMessageContainer=document.createElement("div"),this.inputMessageContainer.classList.add("input-message-container"),this.goDownUnreadBadge=document.createElement("span"),this.goDownUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goDownBtn.append(this.goDownUnreadBadge),this.goMentionBtn=(0,qn.Z)({icon:"mention",className:"bubbles-corner-button chat-secondary-button bubbles-go-mention"}),this.goMentionUnreadBadge=document.createElement("span"),this.goMentionUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goMentionBtn.append(this.goMentionUnreadBadge),this.inputContainer.append(this.goMentionBtn),(0,C.fc)(this.goMentionBtn,(e=>{(0,Le.Z)(e);const t=this.chat.bubbles.getMiddleware();this.managers.appMessagesManager.goToNextMention(this.chat.peerId,this.chat.threadId).then((e=>{t()&&e&&this.chat.setMessageId(e)}))}),{listenerSetter:this.listenerSetter}),this.btnScheduled=(0,Vn.Z)("scheduled btn-scheduled float hide",{noRipple:!0}),(0,C.fc)(this.btnScheduled,(e=>{this.appImManager.openScheduled(this.chat.peerId)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(d.Z)("scheduled_new",(({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:e})=>{this.chat.peerId===e&&this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((e=>{this.btnScheduled.classList.toggle("hide",!e.length)}))})),this.btnToggleReplyMarkup=(0,Vn.Z)("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new ua({appendTo:this.rowsWrapper,listenerSetter:this.listenerSetter,managers:this.managers,btnHover:this.btnToggleReplyMarkup,chatInput:this}),this.listenerSetter.add(this.replyKeyboard)("open",(()=>this.btnToggleReplyMarkup.classList.add("active"))),this.listenerSetter.add(this.replyKeyboard)("close",(()=>this.btnToggleReplyMarkup.classList.remove("active"))),this.botCommands=new Ca(this.rowsWrapper,this,this.managers),this.botCommandsToggle=document.createElement("div"),this.botCommandsToggle.classList.add("new-message-bot-commands");const r=document.createElement("div");r.classList.add("new-message-bot-commands-icon-scale");const l=this.botCommandsIcon=document.createElement("div");l.classList.add("animated-menu-icon","animated-menu-close-icon"),r.append(l),this.botCommandsToggle.append(r),(0,C.fc)(this.botCommandsToggle,(e=>{(0,Le.Z)(e),l.classList.contains("state-back")?(this.botCommands.toggle(!0),l.classList.remove("state-back")):(this.botCommands.setUserId(this.chat.peerId.toUserId(),this.chat.bubbles.getMiddleware()),l.classList.add("state-back"))}),{listenerSetter:this.listenerSetter}),this.botCommands.addEventListener("visible",(()=>{l.classList.add("state-back")})),this.botCommands.addEventListener("hiding",(()=>{l.classList.remove("state-back")})),this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...bn.Z].join(", ");this.fileInput.setAttribute("accept",e),this.willAttachType="media",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"document",text:"Chat.Input.Attach.Document",onClick:()=>{this.fileInput.value="",this.fileInput.removeAttribute("accept"),this.willAttachType="document",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"poll",text:"Poll",onClick:()=>{S.Z.createPopup(fn,this.chat).show()},verify:()=>(this.chat.peerId.isAnyChat()||this.chat.isBot)&&this.chat.canSend("send_polls")}];const h=this.attachMenuButtons.slice();this.attachMenu=(0,Mn.Z)({buttonOptions:{noRipple:!0},listenerSetter:this.listenerSetter,direction:"top-left",buttons:this.attachMenuButtons,onOpenBefore:()=>Na(this,void 0,void 0,(function*(){const e=yield this.managers.appAttachMenuBotsManager.getAttachMenuBots(),t=h.slice(),i=e.filter((e=>!e.pFlags.inactive)).map((e=>{const t=(0,Ba.Z)(e);return{regularText:(0,B.Z)(e.short_name),onClick:()=>{this.managers.appAttachMenuBotsManager.requestWebView(Object.assign({botId:e.bot_id,peerId:this.chat.peerId},this.chat.getMessageSendingParams())).then((t=>{const i=["allow-scripts","allow-same-origin","allow-popups","allow-forms","allow-modals","allow-storage-access-by-user-activation"].join(" ");class s extends S.Z{constructor(t){super("popup-payment popup-payment-verification",{closable:!0,overlayClosable:!0,body:!0,titleRaw:e.short_name}),this.url=t,this.d()}destroy(){return this.telegramWebView.destroy(),super.destroy()}d(){const e=this.telegramWebView=new Si({url:this.url,sandbox:i});e.iframe.classList.add("payment-verification"),this.body.append(e.iframe),this.show(),e.onMount()}}new s(t.url)}))},iconDoc:null==t?void 0:t.icon,verify:()=>Na(this,void 0,void 0,(function*(){let t=!1;const i={attachMenuPeerTypeSameBotPM:()=>this.chat.peerId.toUserId()===e.bot_id,attachMenuPeerTypeBotPM:()=>this.chat.isBot,attachMenuPeerTypePM:()=>this.chat.peerId.isUser(),attachMenuPeerTypeChat:()=>this.chat.isAnyGroup,attachMenuPeerTypeBroadcast:()=>this.chat.isBroadcast};for(const s of e.peer_types){const e=i[s._];if(t=yield e(),t)break}return t}))}}));t.splice(t.length,0,...i),this.attachMenuButtons.splice(0,this.attachMenuButtons.length,...t)}))}),this.attachMenu.classList.add("attach-file","tgico-attach"),this.attachMenu.classList.remove("tgico-more"),this.recordTimeEl=document.createElement("div"),this.recordTimeEl.classList.add("record-time"),this.fileInput=document.createElement("input"),this.fileInput.type="file",this.fileInput.multiple=!0,this.fileInput.style.display="none",this.newMessageWrapper.append(...[this.botCommandsToggle,this.btnToggleEmoticons,this.inputMessageContainer,this.btnScheduled,this.btnToggleReplyMarkup,this.attachMenu,this.recordTimeEl,this.fileInput].filter(Boolean)),this.rowsWrapper.append(this.replyElements.container),this.autocompleteHelperController=new aa,this.stickersHelper=new Gn(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.emojiHelper=new ea(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.commandsHelper=new na(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.mentionsHelper=new da(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.inlineHelper=new ba(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=(0,Vn.Z)("binfilled btn-circle btn-record-cancel chat-secondary-button"),this.btnSendContainer=document.createElement("div"),this.btnSendContainer.classList.add("btn-send-container"),this.recordRippleEl=document.createElement("div"),this.recordRippleEl.classList.add("record-ripple"),this.btnSend=(0,Vn.Z)("none btn-circle btn-send animated-button-icon"),this.btnSend.insertAdjacentHTML("afterbegin",'\n \n \n \n \n '),this.btnSendContainer.append(this.recordRippleEl,this.btnSend),this.sendMenu=new cn({onSilentClick:()=>{this.sendSilent=!0,this.sendMessage()},onScheduleClick:()=>{this.scheduleSending(void 0)},listenerSetter:this.listenerSetter,openSide:"top-left",onContextElement:this.btnSend,onOpen:()=>!("scheduled"===this.chat.type||this.isInputEmpty()&&!Object.keys(this.forwarding).length)}),this.btnSendContainer.append(this.sendMenu.sendMenu),this.inputContainer.append(this.btnCancelRecord,this.btnSendContainer),Mt.ZP.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(Mt.ZP)("open",this.onEmoticonsOpen),this.listenerSetter.add(Mt.ZP)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(d.Z)("settings_updated",(()=>{var e;(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),null===(e=this.messageInputField)||void 0===e||e.onFakeInput()})),this.listenerSetter.add(d.Z)("draft_updated",(({peerId:e,threadId:t,draft:i,force:s})=>{this.chat.threadId===t&&this.chat.peerId===e&&"scheduled"!==this.chat.type&&this.setDraft(i,!0,s)})),this.listenerSetter.add(this.appImManager)("peer_changing",(e=>{this.chat!==e||"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.saveDraft()})),this.listenerSetter.add(this.appImManager)("chat_changing",(({from:e,to:t})=>{this.chat===e?this.autocompleteHelperController.toggleListNavigation(!1):this.chat===t&&this.autocompleteHelperController.toggleListNavigation(!0)})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:e,mids:t})=>{"scheduled"===this.chat.type&&this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()})),this.listenerSetter.add(d.Z)("history_delete",(({peerId:e,msgs:t})=>{this.chat.peerId===e&&"scheduled"!==this.chat.type&&(t.has(this.editMsgId)&&this.onMessageSent(),this.replyToMsgId&&t.has(this.replyToMsgId)&&this.clearHelper("reply"))})),this.listenerSetter.add(d.Z)("dialogs_multiupdate",(e=>{!e.has(this.chat.peerId)||"chat"!==this.chat.type&&"discussion"!==this.chat.type||(this.startParam===m.gZ?this.setStartParam():this.center(!0))}));try{this.recorder=new(dn())({encoderSampleRate:48e3,monitorGain:0,numberOfChannels:1,recordingGain:1,reuseWorker:!0})}catch(e){console.error("Recorder constructor error:",e)}this.updateSendBtn(),this.listenerSetter.add(this.fileInput)("change",(e=>{const t=e.target.files;t.length&&(S.Z.createPopup(Fn,this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")}),!1),(0,C.fc)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&((0,C.fc)(this.btnCancelRecord,this.onCancelRecordClick,{listenerSetter:this.listenerSetter}),this.recorder.onstop=()=>{this.setRecording(!1),this.chatInput.classList.remove("is-locked"),this.recordRippleEl.style.transform=""},this.recorder.ondataavailable=e=>{if(this.releaseMediaPlayback&&(this.releaseMediaPlayback(),this.releaseMediaPlayback=void 0),this.recordingOverlayListener&&(this.listenerSetter.remove(this.recordingOverlayListener),this.recordingOverlayListener=void 0),this.recordingNavigationItem&&(Hn.Z.removeItem(this.recordingNavigationItem),this.recordingNavigationItem=void 0),this.recordCanceled)return;const{peerId:t,threadId:i}=this.chat,s=this.replyToMsgId,n=(Date.now()-this.recordStartTime)/1e3|0,a=new Blob([e],{type:"audio/ogg"});ln.Z.decode(e,!0).then((e=>{ln.Z.setKeepAlive(!1),this.managers.appMessagesManager.sendFile(t,{file:a,isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:s,threadId:i,clearDraft:!0}),this.onMessageSent(!1,!0)}))}),(0,C.fc)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),(0,C.fc)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=(0,Te.Z)((()=>this.saveDraft()),2500,!1,!0),this.botStartBtn=(0,He.Z)("btn-primary btn-transparent text-bold chat-input-control-button"),this.botStartBtn.append((0,L.ag)("BotStart")),(0,C.fc)(this.botStartBtn,(()=>{const{startParam:e}=this;if(void 0===e)return;const t=this.toggleBotStartBtnDisability=(0,Ht.Z)([this.botStartBtn],!0),i=this.chat.peerId,s=this.chat.bubbles.getMiddleware((()=>this.chat.peerId===i&&this.startParam===e&&this.toggleBotStartBtnDisability===t));this.managers.appMessagesManager.startBot(i.toUserId(),void 0,e).then((()=>{s()&&(t(),this.toggleBotStartBtnDisability=void 0,this.setStartParam())}))}),{listenerSetter:this.listenerSetter}),this.controlContainer.append(this.botStartBtn,this.replyInTopicOverlay),this.pinnedControlBtn=(0,He.Z)("btn-primary btn-transparent text-bold chat-input-control-button",{icon:"unpin"}),this.controlContainer.append(this.pinnedControlBtn),this.listenerSetter.add(this.pinnedControlBtn)("click",(()=>{const e=this.chat.peerId;new _s(e,0,!0,(()=>{this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}))}))}_center(e,t){if(!e&&!this.inputContainer.classList.contains("is-centering"))return;if(e===this.fakeWrapperTo)return;const i=e||this.fakeWrapperTo,s=!!e,n=this.fakeWrapperTo;let a,o="",r="";const d=i.getBoundingClientRect(),l=this.fakeRowsWrapper.getBoundingClientRect(),c=l.width,h=d.width;if(c!==h){const e=h/c,t=(c-h)/2;if(a=d.left-l.left-t,s&&(o=`translateX(${a}px) scaleX(${e})`,e<1)){const t=16;r=t+t*(1-e)+"px"}}this.fakeWrapperTo=e;const u=t?200:0;return(0,De.Z)({element:this.inputContainer,className:"is-centering",forwards:s,duration:u}),(0,De.Z)({element:this.rowsWrapperWrapper,className:"is-centering-to-control",forwards:!!(s&&e&&e.classList.contains("chat-input-control")),duration:u}),this.rowsWrapper.style.transform=o,this.rowsWrapper.style.borderRadius=r,{transform:o,borderRadius:r,needTranslateX:n&&(e&&e.classList.contains("chat-input-control")&&n===this.fakeSelectionWrapper||n.classList.contains("chat-input-control"))?-.5*a:a,widthFrom:c,widthTo:h}}center(e=!1){return Na(this,void 0,void 0,(function*(){return this._center(yield this.getNeededFakeContainer(),e)}))}setStartParam(e){this.startParam!==e&&(this.startParam=e,this.center(!0))}isReplyInTopicOverlayNeeded(){return this.chat.isForum&&!this.chat.isForumTopic&&!this.replyToMsgId&&"chat"===this.chat.type}getNeededFakeContainer(e=this.startParam){return Na(this,void 0,void 0,(function*(){return this.chat.selection.isSelecting?this.fakeSelectionWrapper:void 0!==e||!(yield this.chat.canSend())||"pinned"===this.chat.type||(yield this.chat.isStartButtonNeeded())||this.isReplyInTopicOverlayNeeded()?this.controlContainer:void 0}))}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){return Na(this,void 0,void 0,(function*(){if(!this.goDownUnreadBadge)return;const e=yield this.managers.dialogsStorage.getDialogOrTopic(this.chat.peerId,"discussion"===this.chat.type?void 0:this.chat.threadId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.chat.peerId,respectType:!0,threadId:this.chat.threadId})),this.goMentionUnreadBadge&&"chat"===this.chat.type){const t=!(!(null==e?void 0:e.unread_mentions_count)||!e.unread_count);this.goMentionUnreadBadge.innerText=t?""+e.unread_mentions_count:"",this.goMentionBtn.classList.toggle("is-visible",t)}}))}getCurrentInputAsDraft(){const{value:e,entities:t}=(0,un.Z)(this.messageInputField.input,!0,!1);let i;return(e.length||this.replyToMsgId)&&(i={_:"draftMessage",date:(0,zt.Z)(!0),message:e,entities:t.length?t:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),i}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const e=this.getCurrentInputAsDraft();this.managers.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,e)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.classList.add("hide"),this.goDownBtn.classList.add("hide")),(0,Yn.Z)(),this.lastTimeType=0,this.startParam=void 0,this.toggleBotStartBtnDisability&&(this.toggleBotStartBtnDisability(),this.toggleBotStartBtnDisability=void 0),this.messageInput&&(this.clearInput(),e&&this.clearHelper())}setDraft(e,t=!0,i=!1){return Na(this,void 0,void 0,(function*(){if(!i&&!(0,hn.Z)(this.messageInput)||"scheduled"===this.chat.type)return!1;if(!e&&!(e=yield this.managers.appDraftsManager.getDraft(this.chat.peerId,this.chat.threadId)))return i&&(this.chat.container.classList.contains("is-helper-active")&&this.t(),this.messageInputField.inputFake.textContent="",this.messageInputField.onFakeInput(!1),(this.chat.bubbles.messagesQueuePromise||Promise.resolve()).then((()=>{(0,fe.T2)((()=>{this.onMessageSent()}))}))),!1;const s=function(e,t,i){const s=(0,Ma.Z)(e.message),n=e.entities||[],a=(0,Ia.Z)(n.slice(),s);return(0,Za.Z)(e.message,{entities:a,wrappingForPeerId:t,loadPromises:void 0})}(e,this.chat.peerId),n=this.getCurrentInputAsDraft();return!((0,Ra.Z)(e,n)&&this.replyToMsgId===e.reply_to_msg_id||(t&&this.clearHelper(),this.noWebPage=e.pFlags.no_webpage,e.reply_to_msg_id&&this.initMessageReply(e.reply_to_msg_id),this.setInputValue(s,t,t),0))}))}createSendAs(){if(this.sendAsPeerId=void 0,"chat"===this.chat.type||"discussion"===this.chat.type){let e=!0;this.sendAs=new _a(this.managers,((e,t)=>{let i=0;e.parentElement||(this.newMessageWrapper.prepend(e),i=2),this.updateOffset("as",!0,t,i)}),(t=>{this.sendAsPeerId=t,e?e=!1:this.getPlaceholderKey().then((e=>{this.updateMessageInputPlaceholder(e)}))}))}else this.sendAs=void 0;return this.sendAs}finishPeerChange(e){return Na(this,void 0,void 0,(function*(){const t=this.chat.peerId,{forwardElements:i,btnScheduled:s,replyKeyboard:n,sendMenu:a,goDownBtn:o,chatInput:r,botCommandsToggle:d}=this,l=this.sendAs,c=this.createSendAs(),[h,u,p,f,m,g,v,b,y]=yield Promise.all([this.managers.appPeersManager.isBroadcast(t),this.managers.appPeersManager.canPinMessage(t),this.managers.appPeersManager.isBot(t),this.chat.canSend(),this.getNeededFakeContainer(e),ka(this.managers.acknowledged.appProfileManager.getProfileByPeerId(t)),s?ka(this.managers.acknowledged.appMessagesManager.getScheduledMessages(t)):void 0,c?(c.setPeerId(this.chat.peerId),c.updateManual(!0)):void 0,this.filterAttachMenuButtons()]),w=this.messageInput?yield this.getPlaceholderKey():void 0;return()=>{var c;if(r.classList.remove("hide"),o.classList.toggle("is-broadcast",h),o.classList.remove("hide"),null===(c=this.messageInputField)||void 0===c||c.onFakeInput(),this.goDownUnreadBadge&&this.setUnreadCount(),"pinned"===this.chat.type&&r.classList.toggle("can-pin",u),i&&(this.forwardWasDroppingAuthor=!1,i.showCaption.checkboxField.setValueSilently(!0),i.showSender.checkboxField.setValueSilently(!0)),s&&v){s.classList.add("hide");const e=this.chat.bubbles.getMiddleware();(0,We.Z)(v.result,(t=>{e()&&t&&s.classList.toggle("hide",!t.length)}))}if(this.newMessageWrapper&&this.updateOffset(null,!1,!0),d&&(this.hasBotCommands=void 0,this.botCommands.toggle(!0,void 0,!0),this.updateBotCommandsToggle(!0),d.remove(),p)){const e=this.chat.bubbles.getMiddleware(),t=g.result;(0,We.Z)(t,(i=>{e()&&this.updateBotCommands(i,!(t instanceof Promise))}))}l&&l.destroy(),b&&b(),n&&n.setPeer(t),a&&a.setPeerId(t),this.messageInput&&(this.updateMessageInput(f,w,y),this.messageInput.dataset.peerId=""+t);let S=!1;if(this.pinnedControlBtn){const e="pinned"===this.chat.type;S||(S=e),this.pinnedControlBtn.classList.toggle("hide",!e),this.pinnedControlBtn.replaceChildren((0,L.ag)(u?"Chat.Input.UnpinAll":"Chat.Pinned.DontShow"))}{const e=this.chat.isForum&&!this.chat.isForumTopic&&"chat"===this.chat.type;S||(S=e),this.replyInTopicOverlay.classList.toggle("hide",!e)}this.botStartBtn.classList.toggle("hide",S),this.startParam=e,this._center(m,!1)}}))}updateOffset(e,t,i,s){e?this.newMessageWrapper.dataset.offset=e:delete this.newMessageWrapper.dataset.offset,(0,De.Z)({element:this.newMessageWrapper,className:"has-offset",forwards:t,duration:i?0:300,useRafs:s})}updateBotCommands(e,t){var i,s;this.hasBotCommands=!!(null===(s=null===(i=e.bot_info)||void 0===i?void 0:i.commands)||void 0===s?void 0:s.length),this.updateBotCommandsToggle(t)}updateBotCommandsToggle(e){const{botCommandsToggle:t,hasBotCommands:i}=this,s=!!i&&this.isInputEmpty();if(!i){if(!t.parentElement)return;t.remove()}const n=s,a=t.parentElement?0:2;t.parentElement||this.newMessageWrapper.prepend(t),this.updateOffset("commands",n,e,a)}getPlaceholderKey(){return Na(this,void 0,void 0,(function*(){const{peerId:e,threadId:t,isForum:i}=this.chat;let s;return s=t&&!i?"Comment":(yield this.managers.appPeersManager.isBroadcast(e))?"ChannelBroadcast":void 0!==this.sendAsPeerId&&this.sendAsPeerId!==d.Z.myId||(yield this.managers.appMessagesManager.isAnonymousSending(e))?"SendAnonymously":"Message",s}))}updateMessageInputPlaceholder(e){const t=L.ZP.weakMap.get(this.messageInput);t&&t.compareAndUpdate({key:e})}filterAttachMenuButtons(){if(this.attachMenuButtons)return(0,tn.Z)(this.attachMenuButtons,(e=>e.verify()))}updateMessageInput(e,t,i){const{chatInput:s,attachMenu:n,messageInput:a}=this,{peerId:o,threadId:r}=this.chat;s.classList.contains("is-hidden")!==!e&&(s.classList.add("no-transition"),s.classList.toggle("is-hidden",!e),s.offsetLeft,s.classList.remove("no-transition")),this.updateMessageInputPlaceholder(t),e?(a.contentEditable="true",this.setDraft(void 0,!1),a.innerHTML||this.messageInputField.onFakeInput()):a.contentEditable="inherit",n&&(n.toggleAttribute("disabled",!i.length),n.classList.toggle("btn-disabled",!i.length)),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new kn({placeholder:"Message",name:"message",withLinebreaks:!0}),this.messageInputField.input.classList.replace("input-field-input","input-message-input"),this.messageInputField.inputFake.classList.replace("input-field-input","input-message-input"),this.messageInput=this.messageInputField.input,this.attachMessageInputListeners(),ya.T&&(0,ya.Z)(this.messageInput),e?(e.input.replaceWith(this.messageInputField.input),e.inputFake.replaceWith(this.messageInputField.inputFake)):this.inputMessageContainer.append(this.messageInputField.input,this.messageInputField.inputFake)}attachMessageInputListeners(){this.listenerSetter.add(this.messageInput)("keydown",(e=>{const t=e.key;if((0,Xn.Z)(e))(0,Le.Z)(e),this.sendMessage();else if(e.ctrlKey||e.metaKey)this.handleMarkdownShortcut(e);else if(("PageUp"===t||"PageDown"===t)&&!e.shiftKey)if(e.preventDefault(),"PageUp"===t){const e=document.createRange(),t=window.getSelection();e.setStart(this.messageInput.childNodes[0]||this.messageInput,0),e.collapse(!0),t.removeAllRanges(),t.addRange(e)}else(0,Ot.Z)(this.messageInput)})),c.Z&&(0,C.fc)(this.messageInput,(e=>{if(Mt.ZP.isActive())return Mt.ZP.toggle(!1),(0,Qn.Z)(),void(0,Le.Z)(e);this.appImManager.selectTab(Qr.CHAT)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",(()=>{this.checkAutocomplete()})),this.listenerSetter.add(this.messageInput)("focusin",(()=>{"chat"!==this.chat.type&&"discussion"!==this.chat.type||!this.chat.bubbles.scrollable.loadedAll.bottom||this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)}))}applyMarkdown(e,t){const i={link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null)},s=e=>{i[e]=()=>{const t=(n.includes(e)?n:[e]).filter((e=>l[e]));return(0,h.Z)(t,e)||t.push(e),t.length?document.execCommand("fontName",!1,"markup-"+t.join("-")):this.resetCurrentFontFormatting()}},n=["bold","italic","underline","strikethrough","spoiler"];if(n.forEach((e=>{s(e)})),s("monospace"),!i[e])return!1;const a=i[e],o=[],r=Pn.Z.getInstance().prepareApplyingMarkdown(),d=this.listenerSetter.add(this.messageInput)("input",Le.Z,{capture:!0,passive:!1});o.push(document.execCommand("styleWithCSS",!1,"true"));const l=Da(Object.keys(i));return l.monospace&&"link"===e&&o.push(this.resetCurrentFormatting()),o.push("function"==typeof a?a():document.execCommand(a,!1,null)),o.push(document.execCommand("styleWithCSS",!1,"false")),r(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),this.listenerSetter.remove(d),this.messageInputField.simulateInputEvent(),!0}resetCurrentFormatting(){return document.execCommand("removeFormat",!1,null)}resetCurrentFontFormatting(){return document.execCommand("fontName",!1,"Roboto")}insertAtCaret(e,t,i=!0){Pn.Z.getInstance().makeFocused(this.messageInput);const{value:s,caretPos:n,entities:a}=(0,un.Z)(this.messageInput),o=n>=0?n:s.length,r=s.substr(0,o),d=(s.substr(o),i?r.match(Ua.AUTO_COMPLETE_REG_EXP):null),l=d?d.index+(d[0].length-d[2].length):r.length;if(r.slice(0,l),i&&-1!==n){const e=d[2],t=document.getSelection();let i=0;for(;t.toString()!==e;){if(++i>=1e4)throw new Error("lolwhat");t.modify("extend","backward","character")}}(0,E.rf)(this.messageInput,e,t?[t]:void 0,this.chat.peerId)}checkAutocomplete(e,t,i){return Na(this,void 0,void 0,(function*(){if(void 0===e){const s=(0,un.Z)(this.messageInputField.input,!0,!0);e=s.value,t=s.caretPos,i=s.entities}if(-1===t&&(t=e.length),void 0===i){const t=(0,Pa.Z)(e,i,!0);i=(0,Ia.Z)(i,(0,Ma.Z)(t))}if(e=e.slice(0,t),this.previousQuery===e)return;this.previousQuery=e;const s=e.match(Ua.AUTO_COMPLETE_REG_EXP);let n;if(s){const t=i[0];let a=s[2];const o=a[0];if(this.stickersHelper&&d.Z.settings.stickers.suggest&&(yield this.chat.canSend("send_stickers"))&&"messageEntityEmoji"===(null==t?void 0:t._)&&t.length===e.length&&!t.offset)n=this.stickersHelper,this.stickersHelper.checkEmoticon(e);else if("@"===o){const e=this.chat.threadId?(0,yt.Z)(this.chat.threadId):void 0;(yield this.mentionsHelper.checkQuery(a,this.chat.peerId.isUser()?m.NM:this.chat.peerId,e))&&(n=this.mentionsHelper)}else s[1]||"/"!==o?d.Z.settings.emoji.suggest&&(a=a.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!a||(n=this.emojiHelper,this.emojiHelper.checkQuery(a,o))):(yield this.commandsHelper.checkQuery(a,this.chat.peerId))&&(n=this.commandsHelper)}n=this.checkInlineAutocomplete(e,n),this.autocompleteHelperController.hideOtherHelpers(n)}))}checkInlineAutocomplete(e,t){let i=!1;const s=e=>{this.btnPreloader&&(0,De.Z)({element:this.btnPreloader,className:"show",forwards:e,duration:400})};if(!t){const n=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(n){const a=n[1],o=e.slice(n[0].length);i=n[0].length===e.length,t=this.inlineHelper,this.btnPreloader?s(!0):(this.btnPreloader=(0,Vn.Z)("none btn-preloader float show disable-hover",{noRipple:!0}),(0,Gt.y)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,a,o).then((({user:e,renderPromise:t})=>{i&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then((()=>{s(!1)}))})).catch((e=>{s(!1)}))}}return i||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&s(!1),t}setRecording(e){this.recording!==e&&((0,De.Z)({element:this.chatInput,className:"is-recording",forwards:e,duration:200}),this.recording=e,this.updateSendBtn())}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=(0,La.Z)(this.forwarding),t=this.helperFunc;this.clearHelper(),this.updateSendBtn();let i=!1;new M.Z(e,(()=>{i=!0})).addEventListener("close",(()=>{this.helperWaitingForward=!1,i||t()}))}clearInput(e=!0,t=!0,i=""){return Na(this,void 0,void 0,(function*(){if(document.activeElement===this.messageInput&&x.IS_MOBILE_SAFARI){const e=document.createElement("input");document.body.append(e),(0,la.Z)(e),this.messageInputField.setValueSilently(i),(0,la.Z)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(i);c.Z||(this.canRedoFromHTML="",this.undoHistory.length=0,this.executedHistory.length=0,this.canUndoFromHTML="");let s=!1;e&&(s=yield this.setDraft(void 0,!1)),!s&&t&&this.onMessageInput()}))}isInputEmpty(){return(0,hn.Z)(this.messageInput)}updateSendBtn(){let e;const t=this.isInputEmpty();e=this.editMsgId?"edit":!this.recorder||this.recording||!t||this.forwarding?"scheduled"===this.chat.type?"schedule":"send":"record",["send","record","edit","schedule"].forEach((t=>{this.btnSend.classList.toggle(t,e===t)})),this.btnScheduled&&this.btnScheduled.classList.toggle("show",t&&"scheduled"!==this.chat.type),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t&&"scheduled"!==this.chat.type)}getValueAndEntities(e){const{entities:t,value:i}=(0,un.Z)(this.messageInput,!0,!1),s=(0,Ma.Z)(i);return{value:i,totalEntities:(0,Ia.Z)(t,s)}}onMessageSent(e=!0,t){"scheduled"!==this.chat.type&&this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId,!0),this.scheduleDate=void 0,this.sendSilent=void 0;const{totalEntities:i}=this.getValueAndEntities(this.messageInput);let s=0;i.filter((e=>{if("messageEntityEmoji"===e._||"messageEntityCustomEmoji"===e._){const t=e.offset+e.length;return!(t<=s||(s=t,0))}return!1})).forEach((e=>{const t="messageEntityEmoji"===e._?{emoji:(0,Ns.zu)(e.unicode)}:{docId:e.document_id,emoji:""};this.managers.appEmojiManager.pushRecentEmoji(t)})),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.clearInput()),(t||e)&&this.clearHelper(),this.updateSendBtn()}sendMessage(e=!1){const{editMsgId:t,chat:i}=this;if("scheduled"===i.type&&!e&&!t)return void this.scheduleSending();const{peerId:s}=i,{noWebPage:n}=this,a=this.chat.getMessageSendingParams(),{value:o,entities:r}=(0,un.Z)(this.messageInputField.input,!0,!1);if(t){const e=this.editMessage;if(!o.trim()&&!e.media)return void new xs.Z(s,[t],i.type);this.managers.appMessagesManager.editMessage(e,o,{entities:r,noWebPage:n}),this.onMessageSent()}else o.trim()&&(this.managers.appMessagesManager.sendText(s,o,Object.assign(Object.assign({entities:r},a),{noWebPage:n,webPage:this.getWebPagePromise?void 0:this.willSendWebPage,clearDraft:!0})),"scheduled"===this.chat.type?this.onMessageSent(!0):this.onMessageSent(!1,!1));if(this.forwarding){const e=(0,La.Z)(this.forwarding);for(const t in e)this.managers.appMessagesManager.forwardMessages(s,t.toPeerId(),e[t],Object.assign(Object.assign({},a),{dropAuthor:this.forwardElements&&this.forwardElements.hideSender.checkboxField.checked,dropCaptions:this.isDroppingCaptions()})).catch((e=>Na(this,void 0,void 0,(function*(){"VOICE_MESSAGES_FORBIDDEN"===e.type&&(0,we.bC)({langPackKey:"Chat.SendVoice.PrivacyError",langPackArguments:[yield(0,Kt.Z)({peerId:s})]})}))));o||this.onMessageSent()}}sendMessageWithDocument(e,t=!1,i=!1,s=!1){return Na(this,void 0,void 0,(function*(){const n="sticker"===(e=yield this.managers.appDocsManager.getDoc(e)).type?"send_stickers":"gif"===e.type?"send_gifs":"send_media";return this.chat.peerId.isAnyChat()&&!(yield this.chat.canSend(n))?((0,we.Am)(Oa),!1):"scheduled"!==this.chat.type||t?!(!e||e.sticker&&(0,ji.Z)(e)&&!d.Z.premium||(this.managers.appMessagesManager.sendFile(this.chat.peerId,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{file:e,isMedia:!0,clearDraft:i,silent:s})),this.onMessageSent(i,!0),"sticker"===e.type&&this.managers.appStickersManager.saveRecentSticker(e.id),0)):(this.scheduleSending((()=>this.sendMessageWithDocument(e,!0,i,s))),!1)}))}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||(0,ye.Z)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){return Na(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);let i=(0,Za.Z)(t.message,{entities:t.totalEntities,wrappingForPeerId:this.chat.peerId});const s=()=>Na(this,void 0,void 0,(function*(){const n=yield(0,V.Z)({message:t,usingMids:[t.mid]});this.setTopInfo("edit",s,(0,L.ag)("AccDescrEditing"),n,i,t),this.editMsgId=e,this.editMessage=t,i=void 0}));s()}))}initMessagesForward(e){const t=()=>Na(this,void 0,void 0,(function*(){const i=Object.keys(e).map((e=>e.toPeerId())),s=new Set;let n=0,a=0;const o=i.map((t=>Na(this,void 0,void 0,(function*(){const i=e[t],o=i.map((e=>Na(this,void 0,void 0,(function*(){var i;const n=yield this.managers.appMessagesManager.getMessageByPeer(t,e);!(null===(i=n.fwd_from)||void 0===i?void 0:i.from_name)||n.fromId||n.fwdFromId?s.add("P"+n.fromId):s.add("N"+n.fwd_from.from_name),n.media&&n.message&&++a}))));yield Promise.all(o),n+=i.length}))));yield Promise.all(o);const r=s.size>2,l=[...s].map((e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===d.Z.myId?(0,L.ag)("Chat.Accessory.Forward.You"):new N.Z({peerId:t,dialog:!1,onlyFirstName:r}).element}return r?e.split(" ")[0]:e})),{forwardElements:c}=this;(0,ye.Z)(c.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!a);const h=c.hideCaption.checkboxField.checked;a&&h?c.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?c.hideSender:c.showSender).checkboxField.setValueSilently(!0);const u=c.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",p=(0,L.ag)(u,[n]),f=document.createDocumentFragment();let m,g;if(l.length<3?f.append(...(0,L.v_)(l,!1)):f.append(l[0],(0,L.ag)("AndOther",[l.length-1])),1===i.length){const t=i[0],s=e[t];if(m=yield this.managers.appMessagesManager.getMessageByPeer(t,s[0]),g=!!m.grouped_id,g){const e=yield this.managers.appMessagesManager.getMidsByMessage(m);(e.length!==n||e.find((e=>!s.includes(e))))&&(g=!1)}}const v=document.createDocumentFragment();if(g||1===n){const t=e[i[0]],s=yield(0,V.Z)({message:m,usingMids:t});v.append(f,": ",s)}else v.append((0,L.ag)("Chat.Accessory.Forward.From"),": ",f);const b=this.setTopInfo("forward",t,p,v);c.modifyArgs.forEach(((e,t)=>{const s=e.textElement,n=L.ZP.weakMap.get(s);n.args=[t<2?i.length:a],n.update()})),this.forwardHover&&this.forwardHover.attachButtonListener(b,this.listenerSetter),this.forwarding=e}));t()}initMessageReply(e){return Na(this,void 0,void 0,(function*(){if(this.replyToMsgId===e)return;let t=yield this.chat.getMessage(e);const i=()=>{let s;t?s=new N.Z({peerId:t.fromId,dialog:!1}).element:(s=(0,L.ag)("Loading"),this.managers.appMessagesManager.reloadMessages(this.chat.peerId,e).then((s=>{this.replyToMsgId===e&&(t=s,t?i():this.clearHelper("reply"))}))),this.setTopInfo("reply",i,s,t&&t.message,void 0,t),this.setReplyToMsgId(e)};i()}))}setReplyToMsgId(e){this.replyToMsgId=e,this.center(!0)}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.setReplyToMsgId(void 0),this.forwarding=void 0),this.editMsgId=this.editMessage=void 0,this.helperType=this.helperFunc=void 0,this.chat.container.classList.contains("is-helper-active")&&(Hn.Z.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){const e="is-toggling-helper";(0,De.Z)({element:this.chat.container,className:e,forwards:!0,duration:150,onTransitionEnd:()=>{this.chat.container.classList.remove(e)}})}setInputValue(e,t=!0,i=!0){e||(e=""),t?this.clearInput(!1,!1,e):this.messageInputField.setValueSilently(e),(0,fe.T2)((()=>{i&&(0,Ot.Z)(this.messageInput),this.onMessageInput(),this.messageInput.scrollTop=this.messageInput.scrollHeight}))}setTopInfo(e,t,i="",s="",n,a){if(this.willSendWebPage&&"reply"===e)return;"webpage"!==e&&(this.clearHelper(e),this.helperType=e,this.helperFunc=t);const o=this.replyElements.container,r=o.lastElementChild.previousElementSibling,d=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=(0,Vn.Z)(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const{container:l}=J(i,s,this.chat.animationGroup,a);return d?r.replaceWith(l):o.insertBefore(l,o.lastElementChild),"webpage"===e&&(l.style.cursor="default"),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),x.IS_MOBILE||Hn.Z.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout((()=>{this.updateSendBtn()}),0),l}}Ua.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;var Ha=i(6054);const za="pinned-container";class ja{constructor(e){this.floating=!1,(0,zn.Z)(this,e);const{divAndCaption:t,className:i}=this;t.container.classList.add(za,"hide"),t.title.classList.add(za+"-title"),t.subtitle.classList.add(za+"-subtitle"),t.content.classList.add(za+"-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add(za+"-close",`pinned-${i}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add(za+"-wrapper"),(0,A.Z)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add(za+"-wrapper-utils"),this.wrapperUtils.append(this.btnClose),this.wrapper.append(...Array.from(t.container.children),this.wrapperUtils),t.container.append(this.wrapper),this.attachOnCloseEvent(this.btnClose)}attachOnCloseEvent(e){(0,C.fc)(e,(e=>{(0,Le.Z)(e),((this.onClose?this.onClose():null)||Promise.resolve(!0)).then((e=>{e&&this.toggle(!0)}))}),{listenerSetter:this.listenerSetter})}toggle(e){const t=this.divAndCaption.container.classList.contains("hide");if(void 0===e)e=!t;else if(e===t)return;const i=(this.floating||o.Z.isMobile)&&!e;this.divAndCaption.container.classList.toggle("is-floating",i),this.divAndCaption.container.classList.toggle("hide",e),this.topbar.container.classList.toggle("is-pinned-floating",i),this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`,!e),this.topbar.setFloating(),this.topbar.setUtilsWidth()}isVisible(){return!this.divAndCaption.container.classList.contains("hide")}isFloating(){return this.divAndCaption.container.classList.contains("is-floating")}fill(e,t,i){this.divAndCaption.container.dataset.peerId=""+i.peerId,this.divAndCaption.container.dataset.mid=""+i.mid,this.divAndCaption.fill(e,t,i),this.topbar.setUtilsWidth()}}var Ga,Va=i(7207),Ka=i(8427);class Wa extends ja{constructor(e,t,i){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new G("pinned-audio",((e,t)=>{(0,H.Z)(this.divAndCaption.title,e),(0,H.Z)(this.divAndCaption.subtitle,t)})),onClose:()=>{wa.Z.stop()},floating:!0}),this.topbar=e,this.chat=t,this.managers=i,this.onPlaybackParams=e=>{this.fasterEl.classList.toggle("active",e.playbackRate>1),this.repeatEl.classList.remove("tgico-audio_repeat","tgico-audio_repeat_single"),this.repeatEl.classList.add(e.loop?"tgico-audio_repeat_single":"tgico-audio_repeat"),this.repeatEl.classList.toggle("active",e.loop||e.round)},this.onPause=()=>{this.toggleEl.classList.remove("flip-icon")},this.onStop=()=>{this.toggle(!0)},this.onMediaPlay=({doc:e,message:t,media:i,playbackParams:s})=>{var n,a;let o,r;const d="voice"!==e.type&&"round"!==e.type;if(d){const t=e.attributes.find((e=>"documentAttributeAudio"===e._));o=(0,B.Z)(null!==(a=null==t?void 0:t.title)&&void 0!==a?a:e.file_name),r=(null==t?void 0:t.performer)?(0,B.Z)(t.performer):(0,L.ag)("AudioUnknownArtist")}else o=new N.Z({peerId:t.fromId,fromName:null===(n=t.fwd_from)||void 0===n?void 0:n.from_name}).element,r=(0,_.OD)(t.date);this.fasterEl.classList.toggle("hide",d),this.repeatEl.classList.toggle("hide",!d),this.onPlaybackParams(s),this.volumeSelector.setVolume(),this.progressLine.setMedia(i),this.fill(o,r,t),this.toggleEl.classList.toggle("flip-icon",!i.paused),this.toggle(!1)},this.divAndCaption.border.remove();const s=(0,Vn.Z)("fast_rewind active",{noRipple:!0}),n=(0,Vn.Z)("fast_forward active",{noRipple:!0}),a=(e,t)=>{(0,C.fc)(e,(e=>{(0,Le.Z)(e),t()}),{listenerSetter:this.topbar.listenerSetter})};a(s,(()=>{wa.Z.previous()})),a(n,(()=>{wa.Z.next()})),this.toggleEl=(0,Vn.Z)("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),a(this.toggleEl,(()=>{wa.Z.toggle()})),this.wrapper.prepend(this.wrapper.firstElementChild,s,this.toggleEl,n),this.volumeSelector=new Ka.Z(this.listenerSetter,!0);const o=document.createElement("div");o.classList.add("progress-line-container"),o.append(this.volumeSelector.container);const r=document.createElement("div");r.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(r),this.volumeSelector.btn.append(o),this.repeatEl=(0,Vn.Z)("audio_repeat",{noRipple:!0}),a(this.repeatEl,(()=>{const e=wa.Z.getPlaybackParams();e.round?e.loop?(wa.Z.round=!1,wa.Z.loop=!1):wa.Z.loop=!wa.Z.loop:wa.Z.round=!0}));const d=this.fasterEl=(0,Vn.Z)("playback_2x",{noRipple:!0});a(d,(()=>{wa.Z.playbackRate=d.classList.contains("active")?1:1.75})),this.wrapperUtils.prepend(this.volumeSelector.btn,d,this.repeatEl);const l=document.createElement("div");l.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new Va.Z(void 0,void 0,!0,!0),this.progressLine.container.classList.add("pinned-audio-progress"),l.append(this.progressLine.container),this.wrapper.insertBefore(l,this.wrapperUtils),this.topbar.listenerSetter.add(wa.Z)("play",this.onMediaPlay),this.topbar.listenerSetter.add(wa.Z)("pause",this.onPause),this.topbar.listenerSetter.add(wa.Z)("stop",this.onStop),this.topbar.listenerSetter.add(wa.Z)("playbackParams",this.onPlaybackParams);const c=wa.Z.getPlayingDetails();c&&(this.onMediaPlay(c),this.onPlaybackParams(c.playbackParams))}destroy(){this.progressLine&&this.progressLine.removeListeners()}}!function(e){e[e.ONE=32]="ONE",e[e.TWO=15]="TWO",e[e.THREE=10]="THREE",e[e.FOUR=8]="FOUR",e[e.MORE=8]="MORE"}(Ga||(Ga={}));const $a="pinned-message-border";class qa{constructor(){this.drawRect=(e,t,i,s,n)=>`M${e},${t+n}a${n},${n},0,0,1,${i},0v${s-2*n}a${n},${n},0,0,1,${-i},0Z`,this.getClipPath=(e,t,i)=>{let s="";if(2===i)s=this.drawRect(0,0,2,t,1)+this.drawRect(0,t+2,2,t,1);else for(let e=0;e{let i;return e<=1?i=Ga.ONE:2===e?i=Ga.TWO:3===e?i=Ga.THREE:4===e?i=Ga.FOUR:e>3&&(i=Ga.MORE),i},this.getMarkHeight=(e,t)=>{let i;return e<=1?i=Ga.ONE:2===e?i=Ga.TWO:3===e?i=Ga.THREE:4===e?i=Ga.FOUR:e>3&&(i=Ga.MORE),i},this.getMarkTranslateY=(e,t,i)=>1===i?0:2===i?e?t+1:0:3===i?e?1===e?t+1:2*t+2+1:0:(t+1)*e,this.getTrackTranslateY=(e,t,i,s)=>t<=4||e<=1?0:e>=t-2?s-Ga.ONE-i:(e-2)*i+1*e,this.getTrackHeight=(e,t)=>e<=3?Ga.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add($a),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className=$a+"-wrapper-1",this.border.classList.remove($a+"-mask"),this.wrapper.innerHTML=this.wrapper.style.cssText=""),this.border;const i=this.getBarHeight(e,t),s=this.getMarkHeight(e,t),n=this.getTrackHeight(e,i),a=`clipPath_${e}`,o=this.getClipPath(a,i,e),r=this.getMarkTranslateY(t,i,e),d=this.getTrackTranslateY(t,e,i,n);return this.border.classList.toggle($a+"-mask",e>4),t<=1?(this.border.classList.add("mask-bottom"),this.border.classList.remove("mask-top")):t>=e-2?(this.border.classList.add("mask-top"),this.border.classList.remove("mask-bottom")):this.border.classList.add("mask-top","mask-bottom"),this.wrapper.className=$a+"-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${d}px);`,this.svg||(this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.setAttributeNS(null,"height","0"),this.svg.setAttributeNS(null,"width","0"),this.defs=document.createElementNS("http://www.w3.org/2000/svg","defs"),this.defs.append(o),this.svg.append(this.defs),this.mark=document.createElement("div"),this.mark.classList.add($a+"-mark")),this.svg.parentElement||this.wrapper.append(this.svg,this.mark),this.mark.style.cssText=`height: ${s}px; transform: translateY(${r}px);`,this.count=e,this.index=t,this.border}}var Qa=i(6724),Ya=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Xa{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=Xa.BASE_CLASS}getRow(e,t=!1){if(this.rows[e])return this.rows[e].element;const i=document.createElement("div"),s=!Object.keys(this.rows).length&&!t;return i.className=Xa.BASE_CLASS+"-row"+(s?"":" is-hiding hide"),this.rows[e]={element:i,new:!0},this.container.append(i),i}clearRow(e){this.rows[e]&&(this.rows[e].element.remove(),delete this.rows[e])}clearRows(e){this.clearTimeout&&clearTimeout(this.clearTimeout),this.clearTimeout=window.setTimeout((()=>{for(const t in this.rows)+t!==e&&this.clearRow(+t)}),Xa.DURATION)}setNewRow(e,t=!1){const i=this.rows[e];i.new&&(t?(i.element.classList.remove("hide"),i.element.offsetLeft):i.element.classList.remove("is-hiding","hide"),delete i.new),this.clearRows(e)}animate(e,t,i=e>t,s=!1){if(e===t)return this.setNewRow(e);const n=this.rows[e],a=this.rows[t];if(!a&&!s)return this.setNewRow(e);const o=["from-top","from-bottom"];i||o.reverse(),n.element.classList.add(o[0]),n.element.classList.remove(o[1]),a&&(a.element.classList.add(o[1]),a.element.classList.remove(o[0])),n.new&&this.setNewRow(e,!0),n.element.classList.toggle("is-hiding",!1),a&&a.element.classList.toggle("is-hiding",!0),this.clearRows(e)}}Xa.DURATION=200,Xa.BASE_CLASS="animated-super";class Ja{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=Ja.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=Ja.BASE_CLASS+"-decimal";const i=document.createElement("div");i.className=Ja.BASE_CLASS+"-decimal-placeholder";const s=new Xa;return s.container.className=Ja.BASE_CLASS+"-decimal-wrapper",t.append(i,s.container),this.container.append(t),this.decimals[e]={container:t,placeholder:i,animatedSuper:s}}clear(e){this.clearTimeout&&clearTimeout(this.clearTimeout);const t=(""+e).length;t>=this.decimals.length||(this.clearTimeout=window.setTimeout((()=>{this.decimals.splice(t,this.decimals.length-t).forEach((e=>{e.container.remove()}))}),Xa.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach((t=>{const i=+t.placeholder.innerText||0;t.animatedSuper.getRow(Ja.EMPTY_INDEX,!0),t.animatedSuper.animate(Ja.EMPTY_INDEX,i,this.reverse?ethis.previousNumber,!0)})),this.clear(e)}setCount(e){const t=Array.from(""+this.previousNumber).map((e=>+e));Array.from(""+e).map((e=>+e)).forEach(((i,s)=>{var n;const a=this.getDecimal(s),o=a.animatedSuper.getRow(i,!0),r=null!==(n=t[s])&&void 0!==n?n:Ja.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+i,a.animatedSuper.animate(i,r,this.reverse?ethis.previousNumber,!0)})),this.hideLeft(e),this.previousNumber=e}}Ja.EMPTY_INDEX=-1,Ja.BASE_CLASS="animated-counter";class eo{constructor(e,t,i){this.topbar=e,this.chat=t,this.managers=i,this.pinnedMaxMid=0,this.pinnedMid=0,this.pinnedIndex=-1,this.wasPinnedIndex=0,this.wasPinnedMediaIndex=0,this.locked=!1,this.waitForScrollBottom=!1,this.count=0,this.mids=[],this.offsetIndex=0,this.loading=!1,this.loadedBottom=!1,this.loadedTop=!1,this.scrollDownListenerSetter=null,this.hidden=!1,this.getCurrentIndexPromise=null,this.listenerSetter=new ce.Z,this.log=(0,r.kg)("PM"),this.debug=!0,this.isStatic=!1;const s=new X("pinned-message",t.animationGroup);this.pinnedMessageContainer=new ja({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:s,onClose:()=>Ya(this,void 0,void 0,(function*(){return(yield i.appPeersManager.canPinMessage(this.chat.peerId))?new _s(this.chat.peerId,this.pinnedMid,!0):new _s(this.chat.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new qa,s.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new Xa,s.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new Xa,this.animatedMedia.container.classList.add("pinned-message-media-container"),s.content.prepend(this.animatedMedia.container),this.animatedCounter=new Ja(!0),s.title.append((0,L.ag)("PinnedMessage")," ",this.animatedCounter.container);const n=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(n),s.container.prepend(n),this.btnOpen=(0,Vn.Z)("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),(0,C.fc)(this.btnOpen,(e=>{(0,Le.Z)(e),this.topbar.openPinned(!0)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e})=>{e===this.chat.peerId&&(this.hidden&&this.pinnedMessageContainer.toggle(this.hidden=!1),this.loadedTop=this.loadedBottom=!1,this.pinnedIndex=-1,this.pinnedMid=0,this.count=0,this.mids=[],this.offsetIndex=0,this.pinnedMaxMid=0,this.setCorrectIndex(0))})),this.listenerSetter.add(d.Z)("peer_pinned_hidden",(({peerId:e})=>{e===this.chat.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)})),this.setPinnedMessage=(0,Te.Z)((()=>this._setPinnedMessage()),100,!0,!0),this.setCorrectIndexThrottled=(0,Qa.Z)(this.setCorrectIndex.bind(this),100,!1),this.isStatic=!this.chat.isPinnedMessagesNeeded()}destroy(){this.pinnedMessageContainer.divAndCaption.container.remove(),this.pinnedMessageContainer.toggle(!0),this.listenerSetter.removeAll(),this.unsetScrollDownListener(!1)}setCorrectIndex(e){if(this.isStatic)return;if(this.locked||this.hidden)return;if((this.loadedBottom||this.loadedTop)&&!this.count)return;const t=this.chat.bubbles.getBubbleByPoint("bottom");if(!t)return;const i=t.dataset.mid;t&&void 0!==i&&this.testMid(+i,e)}testMid(e,t){if(this.isStatic)return;if(this.hidden)return;let i=this.mids.findIndex((t=>t<=e));if(-1===i||this.isNeededMore(i)){if(!(this.loadedTop&&ei))return;this.pinnedIndex=i,this.pinnedMid=this.mids.find((t=>t<=e))||this.mids[this.mids.length-1],this.setPinnedMessage()}}isNeededMore(e){return this.count>eo.LOAD_COUNT&&(!this.loadedBottom&&e<=eo.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=eo.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return Ya(this,void 0,void 0,(function*(){if(!this.loading){this.loading=!0;try{const i=this.debug?this.log.bindPrefix("getCurrentIndex"):void 0;i&&i("start",e,t);let s=!1;const n=[this.managers.appMessagesManager.getSearch({peerId:this.chat.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:eo.LOAD_COUNT,backLimit:eo.LOAD_COUNT,threadId:this.chat.threadId}).then((e=>(s=!0,e)))];if(!this.pinnedMaxMid){const e=this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId,this.chat.threadId).then((e=>{e.maxId&&(this.pinnedMaxMid=e.maxId,!s&&t&&(this.mids=[this.pinnedMaxMid],this.count=e.count,this.pinnedIndex=0,this.pinnedMid=this.mids[0],this.setPinnedMessage()))}));n.push(e)}const a=(yield Promise.all(n))[0];let o=a.history.findIndex((t=>t.mid<=e));-1===o&&(o=a.history.length),this.offsetIndex=a.offset_id_offset?a.offset_id_offset-o:0,this.mids=a.history.map((e=>e.mid)).slice(),this.count=a.count,this.count||this.pinnedMessageContainer.toggle(!0),this.loadedTop=this.offsetIndex+this.mids.length===this.count,this.loadedBottom=!this.offsetIndex,i&&i("result",e,a,o,this.offsetIndex,this.loadedTop,this.loadedBottom)}catch(e){this.log.error("getCurrentIndex error",e)}this.loading=!1,this.locked?this.testMid(e):t&&this.setCorrectIndex(0),this.getCurrentIndexPromise=null}}))}setScrollDownListener(){this.waitForScrollBottom=!0,this.scrollDownListenerSetter||(this.scrollDownListenerSetter=new ce.Z,function(e,t,i,s){if(c.Z){let t;const n={passive:!0};s.add(e)("touchstart",(i=>{i.touches.length>1?o():(t=i.touches[0].clientY,s.add(e)("touchmove",a,n),s.add(e)("touchend",o,n))}),n);const a=e=>{const s=e.touches[0].clientY,n=s{s.removeManual(e,"touchmove",a,n),s.removeManual(e,"touchend",o,n)}}else s.add(e)("wheel",(e=>{const t=e.deltaY>0;!t||i()}),{passive:!0})}(this.chat.bubbles.scrollable.container,0,(()=>{this.unsetScrollDownListener()}),this.scrollDownListenerSetter))}unsetScrollDownListener(e=!0){this.waitForScrollBottom=!1,this.scrollDownListenerSetter&&(this.scrollDownListenerSetter.removeAll(),this.scrollDownListenerSetter=null),e&&this.setCorrectIndex(0)}handleFollowingPinnedMessage(){return Ya(this,void 0,void 0,(function*(){this.locked=!0,this.debug&&this.log("handleFollowingPinnedMessage");try{this.setScrollDownListener();const e=this.chat.setPeerPromise;e instanceof Promise&&(yield e),yield(0,pe.e9)(),this.getCurrentIndexPromise&&(yield this.getCurrentIndexPromise),this.debug&&this.log("handleFollowingPinnedMessage: unlock"),this.locked=!1}catch(e){this.log.error("handleFollowingPinnedMessage error:",e),this.locked=!1,this.waitForScrollBottom=!1,this.setCorrectIndex(0)}}))}followPinnedMessage(e){return Ya(this,void 0,void 0,(function*(){(yield this.chat.getMessage(e))&&(this.chat.setMessageId(e),(this.chat.setPeerPromise||Promise.resolve()).then((()=>{this.handleFollowingPinnedMessage(),this.testMid(this.pinnedIndex>=this.count-1?this.pinnedMaxMid:e-1)})))}))}_setPinnedMessage(){return Ya(this,void 0,void 0,(function*(){const e=this.count;if(e){const t=this.pinnedIndex,i=yield this.chat.getMessage(this.pinnedMid),s=0===t;this.animatedCounter.container.classList.toggle("is-last",s),s||this.animatedCounter.setCount(e-t),this.pinnedMessageContainer.toggle(!1);const n=t>this.wasPinnedIndex;this.debug&&this.log("setPinnedMessage: fromTop",n,t,this.wasPinnedIndex);const a=this.animatedSubtitle.getRow(t),o=this.animatedMedia.getRow(t);o.classList.add("pinned-message-media");const r=[],d=yield Y({title:void 0,titleEl:null,subtitle:i.message,subtitleEl:a,message:i,mediaEl:o,loadPromises:r,animationGroup:this.chat.animationGroup});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",d),this.animatedSubtitle.animate(t,this.wasPinnedIndex),d?(this.animatedMedia.animate(t,this.wasPinnedMediaIndex),this.wasPinnedMediaIndex=t):this.animatedMedia.clearRows(),this.pinnedMessageBorder.render(e,e-t-1),this.wasPinnedIndex=t,this.pinnedMessageContainer.divAndCaption.container.dataset.mid=""+i.mid}else this.pinnedMessageContainer.toggle(!0),this.wasPinnedIndex=0;this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-many",this.count>1)}))}}eo.LOAD_COUNT=50,eo.LOAD_OFFSET=5;var to=i(6194),io=i(2995),so=i(4240),no=i(6818),ao=i(3897),oo=i(7120),ro=i(2059),lo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class co{constructor(e,t,i){this.chat=e,this.appSidebarRight=t,this.managers=i,this.verifyButtons=e=>{const t=!!e||!(!this.btnMore||!this.btnMore.classList.contains("menu-open"));e&&(0,Le.Z)(e),(()=>{lo(this,void 0,void 0,(function*(){const e=this.buttonsToVerify.concat(t?this.menuButtons:[]);(yield Promise.all(e.map((e=>lo(this,void 0,void 0,(function*(){return{result:yield e.verify(),button:e}})))))).forEach((({button:e,result:t})=>{e.element.classList.toggle("hide",!t)}))}))})()},this.verifyVideoChatButton=e=>lo(this,void 0,void 0,(function*(){var t;if(!no.Z||this.peerId.isUser()||"chat"!==this.chat.type||this.chat.threadId)return!1;const i=ro.ZP.groupCall,s=this.peerId.toChatId();if((null==i?void 0:i.chatId)===s)return!1;if(e&&((yield this.managers.appPeersManager.isBroadcast(this.peerId))&&"group"===e||(yield this.managers.appPeersManager.isAnyGroup(this.peerId))&&"broadcast"===e))return!1;const n=yield this.managers.appChatsManager.getChat(s);return(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)||(0,oo.Z)(n,"manage_call")})),this.verifyCallButton=e=>lo(this,void 0,void 0,(function*(){if(!Ue.Z||!this.peerId.isUser())return!1;const t=this.peerId.toUserId(),i=yield this.managers.appProfileManager.getCachedFullUser(t);return!!i&&!!("voice"===e?i.pFlags.phone_calls_available:i.pFlags.video_calls_available)})),this.onJoinGroupCallClick=()=>{this.chat.appImManager.joinGroupCall(this.peerId)},this.onMuteClick=()=>{new ao.Z(this.peerId)},this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",o.Z.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===o._.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),x.IS_SAFARI&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame((()=>{x.IS_SAFARI&&e&&this.chatUtils.classList.remove("hide");const t=this.chatUtils.getBoundingClientRect().width;this.chat.log("utils width:",t),this.container.style.setProperty("--utils-width",t+"px"),this.setUtilsRAF=0}))},this.setFloating=()=>{var e;const t=[this.chatAudio,null===(e=this.pinnedMessage)||void 0===e?void 0:e.pinnedMessageContainer].filter(Boolean).reduce(((e,t)=>{const i=t.isFloating();return this.container.classList.toggle(`is-pinned-${t.className}-floating`,i),t.isVisible()?e+ +i:e}),0);this.container.dataset.floating=""+t},this.setPeerStatusManual=(e=!1)=>lo(this,void 0,void 0,(function*(){if(!this.subtitle||"chat"!==this.chat.type)return;if(this.chat.threadId){const e=yield(0,Kt.Z)({peerId:this.peerId,dialog:!0}),t=(0,L.ag)("TopicProfileStatus",[e]);return()=>(0,H.Z)(this.subtitle,t)}const t=this.peerId;return this.chat.appImManager.setPeerStatus({peerId:t,element:this.subtitle,needClear:e,useWhitespace:!1,middleware:()=>t===this.peerId})})),this.setPeerStatus=e=>this.setPeerStatusManual(e).then((e=>{null==e||e()})),this.listenerSetter=new ce.Z,this.menuButtons=[],this.buttonsToVerify=[]}construct(){this.container=document.createElement("div"),this.container.classList.add("sidebar-header","topbar","hide"),this.container.dataset.floating="0",this.btnBack=(0,Vn.Z)("left sidebar-close-button",{noRipple:!0}),this.chatInfoContainer=document.createElement("div"),this.chatInfoContainer.classList.add("chat-info-container"),this.chatInfo=document.createElement("div"),this.chatInfo.classList.add("chat-info");const e=this.person=document.createElement("div");e.classList.add("person");const t=document.createElement("div");t.classList.add("content");const i=document.createElement("div");i.classList.add("top"),this.title=document.createElement("div"),this.title.classList.add("user-title"),i.append(this.title);const s=document.createElement("div");s.classList.add("bottom"),this.subtitle&&s.append(this.subtitle),t.append(i,s),this.avatarElement&&e.append(this.avatarElement),e.append(t),this.chatInfo.append(e),this.chatUtils=document.createElement("div"),this.chatUtils.classList.add("chat-utils"),this.chatAudio=new Wa(this,this.chat,this.managers),this.menuButtons.length&&(this.btnMore=(0,Mn.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:this.menuButtons,onOpen:(e,t)=>lo(this,void 0,void 0,(function*(){const e=this.menuButtons[this.menuButtons.length-1];if(null==e?void 0:e.element){const t=yield this.managers.appPeersManager.getDeleteButtonText(this.peerId);e.element.lastChild.replaceWith((0,L.ag)(t))}}))})),this.chatUtils.append(...[this.pinnedMessage?this.pinnedMessage.pinnedMessageContainer.divAndCaption.container:null,this.btnJoin,this.btnPinned,this.btnCall,this.btnGroupCall,this.btnMute,this.btnSearch,this.btnMore].filter(Boolean)),this.pushButtonToVerify(this.btnCall,this.verifyCallButton.bind(this,"voice")),this.pushButtonToVerify(this.btnGroupCall,this.verifyVideoChatButton),this.chatInfoContainer.append(this.btnBack,this.chatInfo,this.chatUtils),this.container.append(this.chatInfoContainer),this.chatAudio&&this.container.append(this.chatAudio.divAndCaption.container),this.listenerSetter.add(window)("resize",this.onResize),this.listenerSetter.add(o.Z)("changeScreen",this.onChangeScreen),(0,C.fc)(this.container,(e=>{const t=(0,be.Z)(e.target,"pinned-container");if((0,Qn.Z)(),t){if((0,Le.Z)(e),(0,be.Z)(e.target,"progress-line"))return;const i=+t.dataset.mid;if(t.classList.contains("pinned-message"))this.pinnedMessage.followPinnedMessage(i);else{const e=t.dataset.peerId.toPeerId(),s=wa.Z.getSearchContext();this.chat.appImManager.setInnerPeer({peerId:e,lastMsgId:i,type:s.isScheduled?"scheduled":s.threadId?"discussion":void 0,threadId:s.threadId})}}else o.Z.activeScreen===o._.medium&&document.body.classList.contains(n.ir)?r():(0,ye.Z)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains(a.HQ)):this.appSidebarRight.toggleSidebar(!0)}),{listenerSetter:this.listenerSetter});const r=e=>{if(e&&(0,Le.Z)(e),o.Z.activeScreen===o._.medium&&document.body.classList.contains(n.ir))this.chat.appImManager.setPeer({peerId:this.peerId});else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);Hn.Z.back(e?"im":"chat")}};(0,C.fc)(this.btnBack,r,{listenerSetter:this.listenerSetter})}pushButtonToVerify(e,t){e&&this.buttonsToVerify.push({element:e,verify:t})}constructUtils(){this.menuButtons=[{icon:"search",text:"Search",onClick:()=>{this.chat.initSearch()},verify:()=>o.Z.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>lo(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&d.Z.myId!==this.peerId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.chat.threadId}))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,threadId:this.chat.threadId})},verify:()=>lo(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&d.Z.myId!==this.peerId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.chat.threadId}))}))},{icon:"comments",text:"ViewDiscussion",onClick:()=>{const e=this.chat.bubbles.getMiddleware();Promise.resolve(this.managers.appProfileManager.getChannelFull(this.peerId.toChatId())).then((t=>{e()&&t.linked_chat_id&&this.chat.appImManager.setInnerPeer({peerId:t.linked_chat_id.toPeerId(!0)})}))},verify:()=>lo(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getCachedFullChat(this.peerId.toChatId());return"chat"===this.chat.type&&!!(null==e?void 0:e.linked_chat_id)}))},{icon:"phone",text:"Call",onClick:this.onCallClick.bind(this,"voice"),verify:this.verifyCallButton.bind(this,"voice")},{icon:"videocamera",text:"VideoCall",onClick:this.onCallClick.bind(this,"video"),verify:this.verifyCallButton.bind(this,"video")},{icon:"videochat",text:"PeerInfo.Action.LiveStream",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"broadcast")},{icon:"videochat",text:"PeerInfo.Action.VoiceChat",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"group")},{icon:"select",text:"Chat.Menu.SelectMessages",onClick:()=>{const e=this.chat.selection;e.toggleSelection(!0,!0),Cn.Z.getState().then((t=>{if(t.chatContextMenuHintWasShown)return;const i=e.toggleByElement.bind(e);e.toggleByElement=t=>lo(this,void 0,void 0,(function*(){this.managers.appStateManager.pushToState("chatContextMenuHintWasShown",!0),(0,we.Am)((0,L.ag)("Chat.Menu.Hint")),e.toggleByElement=i,e.toggleByElement(t)}))}))},verify:()=>!this.chat.selection.isSelecting&&!!this.chat.bubbles.getRenderedLength()},{icon:"select",text:"Chat.Menu.ClearSelection",onClick:()=>{this.chat.selection.cancelSelection()},verify:()=>this.chat.selection.isSelecting},{icon:"adduser",text:"AddContact",onClick:()=>{if(!this.appSidebarRight.isTabExists(so.Z)){const e=this.appSidebarRight.createTab(so.Z);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>lo(this,void 0,void 0,(function*(){return this.peerId.isUser()&&!(yield this.managers.appPeersManager.isContact(this.peerId))}))},{icon:"forward",text:"ShareContact",onClick:()=>{const e=this.peerId;new io.Z({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise(((i,s)=>{new As.Z("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new N.Z({peerId:t,dialog:!0}).element],buttons:[{langKey:"Send",callback:()=>{i(),this.managers.appMessagesManager.sendContact(t,e),this.chat.appImManager.setInnerPeer({peerId:t})}},{langKey:"Cancel",callback:()=>{s()},isCancel:!0}],peerId:t,overlayClosable:!0}).show()})),placeholder:"ShareModal.Search.Placeholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})},verify:()=>lo(this,void 0,void 0,(function*(){return d.Z.myId!==this.peerId&&this.peerId.isUser()&&(yield this.managers.appPeersManager.isContact(this.peerId))&&!!(yield this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone}))},{icon:"bots",text:"Settings",onClick:()=>{this.managers.appMessagesManager.sendText(this.peerId,"/settings")},verify:()=>lo(this,void 0,void 0,(function*(){var e;try{const t=yield this.managers.appAttachMenuBotsManager.getAttachMenuBot(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.has_settings)}catch(e){return!1}}))},{icon:"lock",text:"BlockUser",onClick:()=>{new As.Z("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new N.Z({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!0).then((e=>{e&&(0,we.bC)({langPackKey:"UserBlocked"})}))}}]}).show()},verify:()=>lo(this,void 0,void 0,(function*(){var e;if(!this.peerId.isUser())return!1;const t=yield this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());return this.peerId!==d.Z.myId&&t&&!(null===(e=t.pFlags)||void 0===e?void 0:e.blocked)}))},{icon:"lockoff",text:"Unblock",onClick:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!1).then((e=>{e&&(0,we.bC)({langPackKey:"UserUnblocked"})}))},verify:()=>lo(this,void 0,void 0,(function*(){var e;const t=yield this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.blocked)}))},{icon:"delete danger",text:"Delete",onClick:()=>{new to.Z(this.peerId)},verify:()=>lo(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&!!(yield this.managers.appMessagesManager.getDialogOnly(this.peerId))}))}],this.btnSearch=(0,Vn.Z)("search"),this.attachClickEvent(this.btnSearch,(e=>{this.chat.initSearch()}),!0)}attachClickEvent(e,t,i){(0,C.fc)(e,(e=>{(0,Le.Z)(e),!i&&(0,Qn.Z)(),t(e)}),{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructAvatar(){const e=new f.Z;return e.isDialog=!0,e.classList.add("avatar-42","person-avatar"),e}get peerId(){return this.chat.peerId}constructPeerHelpers(){return this.avatarElement=this.constructAvatar(),this.subtitle=document.createElement("div"),this.subtitle.classList.add("info"),this.pinnedMessage=new eo(this,this.chat,this.managers),this.btnJoin=(0,He.Z)("btn-primary btn-color-primary chat-join hide"),this.btnCall=(0,Vn.Z)("phone"),this.btnGroupCall=(0,Vn.Z)("videochat"),this.btnPinned=(0,Vn.Z)("pinlist"),this.btnMute=(0,Vn.Z)("mute"),this.attachClickEvent(this.btnCall,this.onCallClick.bind(this,"voice")),this.attachClickEvent(this.btnGroupCall,this.onJoinGroupCallClick),this.attachClickEvent(this.btnPinned,(()=>{this.openPinned(!0)})),this.attachClickEvent(this.btnMute,this.onMuteClick),this.attachClickEvent(this.btnJoin,(()=>lo(this,void 0,void 0,(function*(){const e=this.chat.bubbles.getMiddleware();this.btnJoin.setAttribute("disabled","true");const t=this.peerId.toChatId();let i;i=(yield this.managers.appChatsManager.isChannel(t))?this.managers.appChatsManager.joinChannel(t):this.managers.appChatsManager.addChatUser(t,d.Z.myId),i.finally((()=>{e()&&this.btnJoin.removeAttribute("disabled")}))})))),this.listenerSetter.add(d.Z)("chat_update",(e=>lo(this,void 0,void 0,(function*(){var t;if(this.peerId===e.toPeerId(!0)){const i=yield this.managers.appChatsManager.getChat(e);this.btnJoin.classList.toggle("hide",!(null===(t=null==i?void 0:i.pFlags)||void 0===t?void 0:t.left)),this.setUtilsWidth(),this.verifyButtons()}})))),this.listenerSetter.add(d.Z)("dialog_notify_settings",(e=>{e.peerId===this.peerId&&this.setMutedState()})),this.listenerSetter.add(d.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),this.listenerSetter.add(d.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),this.listenerSetter.add(d.Z)("peer_full_update",(e=>{this.peerId===e&&this.verifyButtons()})),this.chat.addEventListener("setPeer",((e,t)=>{const i=this.chat.bubbles.getMiddleware();Cn.Z.getState().then((s=>{i()&&this.pinnedMessage&&(this.pinnedMessage.hidden=!!s.hiddenPinnedMessages[this.chat.peerId],t?(this.pinnedMessage.unsetScrollDownListener(),this.pinnedMessage.testMid(e,0)):this.pinnedMessage.locked||(this.pinnedMessage.handleFollowingPinnedMessage(),this.pinnedMessage.testMid(e)))}))})),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e,mids:t})=>{"pinned"===this.chat.type&&e===this.peerId&&t&&this.setTitle()})),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}openPinned(e){this.chat.appImManager.setInnerPeer({peerId:this.peerId,lastMsgId:e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,type:"pinned"})}destroy(){var e,t;this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),null===(e=this.pinnedMessage)||void 0===e||e.destroy(),null===(t=this.chatAudio)||void 0===t||t.destroy(),delete this.chatAudio,delete this.pinnedMessage}cleanup(){this.chat.peerId||this.container.classList.add("hide")}finishPeerChange(e){var t;return lo(this,void 0,void 0,(function*(){const{peerId:e,threadId:i}=this.chat;let s;"chat"===this.chat.type&&(s=(null===(t=this.avatarElement)||void 0===t?void 0:t.peerId)!==this.peerId||this.avatarElement.threadId!==this.chat.threadId?this.constructAvatar():this.avatarElement);const[n,a,o,r,d,l,c]=yield Promise.all([this.managers.appPeersManager.isBroadcast(e),this.managers.appPeersManager.isAnyChat(e),e.isAnyChat()?this.managers.appChatsManager.getChat(e.toChatId()):void 0,s?s.updateWithOptions({peerId:e,threadId:i,wrapOptions:{customEmojiSize:(0,Qe.C)(32,32)}}):void 0,this.setTitleManual(),this.setPeerStatusManual(!0),Cn.Z.getState()]);return()=>{var t,i;const r=!("pinned"===this.chat.type||"scheduled"===this.chat.type);this.btnMute&&this.btnMute.classList.toggle("hide",!n||!r),this.btnJoin&&(a&&!this.chat.isRestricted&&r?((0,H.Z)(this.btnJoin,(0,L.ag)(n?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(t=null==o?void 0:o.pFlags)||void 0===t?void 0:t.left))):this.btnJoin.classList.add("hide")),this.btnSearch&&this.btnSearch.classList.toggle("hide",!r),this.btnPinned&&this.btnPinned.classList.toggle("hide",!r),this.avatarElement!==s&&(s&&(this.avatarElement?this.avatarElement.replaceWith(s):this.person.prepend(s)),null===(i=this.avatarElement)||void 0===i||i.remove(),this.avatarElement=s),this.setUtilsWidth(),this.verifyButtons(),this.btnMore&&this.btnMore.classList.toggle("hide",!r);const h=this.chat.isPinnedMessagesNeeded();if(h||"discussion"===this.chat.type){if(this.chat.wasAlreadyUsed||!this.pinnedMessage){const e=new eo(this,this.chat,this.managers);this.pinnedMessage?(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy()):this.chatUtils.prepend(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage=e}h?this.pinnedMessage.hidden=!!c.hiddenPinnedMessages[e]:"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage())}else this.pinnedMessage&&(this.pinnedMessage.destroy(),this.pinnedMessage=void 0);d(),null==l||l(),this.subtitle.classList.toggle("hide",!l),this.setMutedState(),this.container.classList.remove("hide")}}))}setTitleManual(e){return lo(this,void 0,void 0,(function*(){const{peerId:t,threadId:i}=this.chat,s=()=>this.chat.bubbles.getMiddleware();let n;if("pinned"===this.chat.type)n=void 0===e?(0,L.ag)("Loading"):(0,L.ag)("PinnedMessagesCount",[e]),void 0===e&&this.managers.appMessagesManager.getSearchCounters(t,[{_:"inputMessagesFilterPinned"}],!1).then((e=>{if(!s())return;const t=e[0].count;if(this.setTitle(t),!t){this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}}));else if("scheduled"===this.chat.type)n=(0,L.ag)(t===d.Z.myId?"Reminders":"ScheduledMessages");else if("discussion"===this.chat.type){if(void 0===e){const n=yield this.managers.acknowledged.appMessagesManager.getHistory(t,0,1,0,i);if(!s())return;if(n.cached){const t=yield n.result;if(!s())return;e=t.count}else n.result.then((e=>{s()&&this.setTitle(e.count)}))}n=void 0===e?(0,L.ag)("Loading"):(0,L.ag)("Chat.Title.Comments",[e])}else if("chat"===this.chat.type&&([n]=yield Promise.all([(0,Kt.Z)({peerId:t,dialog:!0,withIcons:!i,threadId:i})]),!s()))return;return()=>{(0,H.Z)(this.title,n)}}))}setTitle(e){this.setTitleManual(e).then((e=>e()))}setMutedState(){return lo(this,void 0,void 0,(function*(){if(!this.btnMute)return;const e=this.peerId,t=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1,threadId:this.chat.threadId});(yield this.managers.appPeersManager.isBroadcast(e))?(this.btnMute.classList.remove("tgico-mute","tgico-unmute"),this.btnMute.classList.add(t?"tgico-unmute":"tgico-mute"),this.btnMute.style.display=""):this.btnMute.style.display="none"}))}}var ho=i(5884),uo=i(3607);class po extends Ji._{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(e,t,i,s){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new uo.Z("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=(0,Vn.Z)("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const n=document.createElement("div");n.classList.add("chatlist-container"),this.scrollable.container.replaceWith(n),this.appSearch=new ho.Z(n,this.inputSearch,{messages:new ho.z("Chat.Search.PrivateSearch","messages")}),this.peerId?this.appSearch.beginSearch(this.peerId,this.threadId,s):(this.query=s,this.peerId=e,this.threadId=t,this.onDatePick=i,this.btnPickDate.classList.toggle("hide",!this.onDatePick),this.onDatePick&&(0,C.fc)(this.btnPickDate,(()=>{S.Z.createPopup(I,new Date,this.onDatePick).show()})),s&&this.appSearch.searchInput.inputField.setValueSilently(s),a.ZP.toggleSidebar(!0))}}class fo{constructor(e,t,i){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{(0,Le.Z)(e),S.Z.createPopup(I,new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=(0,ye.Z)(e.target,es.DIALOG_LIST_ELEMENT_TAG);t&&this.selectResult(t)},this.onFooterClick=e=>{this.foundCount&&(this.chat.bubbles.container.classList.toggle("search-results-active"),this.results.classList.toggle("active"))},this.onUpClick=e=>{(0,Le.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{(0,Le.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex-1])},this.element=document.createElement("div"),this.element.classList.add("sidebar-header","chat-search","chatlist-container"),this.backBtn=document.createElement("button"),this.backBtn.classList.add("btn-icon","tgico-left","sidebar-close-button"),(0,A.Z)(this.backBtn);const s=this.listenerSetter=new ce.Z,n=(e,t)=>{(0,C.fc)(e,t,{listenerSetter:s})};n(this.backBtn,(()=>{this.destroy()})),this.inputSearch=new uo.Z("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new ho.z(!1,"messages",void 0,"",!1),n(this.searchGroup.list,this.onResultsClick),this.appSearch=new ho.Z(this.results,this.inputSearch,{messages:this.searchGroup},(e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):((0,H.Z)(this.foundCountEl,this.inputSearch.value?(0,L.ag)("NoResult"):""),this.results.classList.remove("active"),this.chat.bubbles.container.classList.remove("search-results-active"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"))})),this.appSearch.beginSearch(this.chat.peerId,this.chat.threadId),this.chat.bubbles.container.append(this.results),this.footer=document.createElement("div"),this.footer.classList.add("chat-search-footer"),n(this.footer,this.onFooterClick),(0,A.Z)(this.footer),this.foundCountEl=document.createElement("span"),this.foundCountEl.classList.add("chat-search-count"),this.dateBtn=document.createElement("button"),this.dateBtn.classList.add("btn-icon","tgico-calendar"),this.controls=document.createElement("div"),this.controls.classList.add("chat-search-controls"),this.upBtn=document.createElement("button"),this.upBtn.classList.add("btn-icon","tgico-up"),this.downBtn=document.createElement("button"),this.downBtn.classList.add("btn-icon","tgico-down"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"),n(this.dateBtn,this.onDateClick),n(this.upBtn,this.onUpClick),n(this.downBtn,this.onDownClick),this.controls.append(this.upBtn,this.downBtn),this.footer.append(this.foundCountEl,this.dateBtn,this.controls),this.topbar.container.parentElement.insertBefore(this.footer,t.input.chatInput),this.element.append(this.backBtn,this.inputSearch.container),this.topbar.container.classList.add("hide-pinned"),this.topbar.container.parentElement.append(this.element),this.inputSearch.input.focus(),i&&this.setQuery(i),x.IS_MOBILE_SAFARI||(this.navigationItem={type:"mobile-search",onPop:()=>{this.destroy()}},Hn.Z.pushItem(this.navigationItem))}destroy(){this.topbar.container.classList.remove("hide-pinned"),this.element.remove(),this.inputSearch.remove(),this.results.remove(),this.footer.remove(),this.listenerSetter.removeAll(),this.chat.bubbles.container.classList.remove("search-results-active"),this.chat.search=void 0,Hn.Z.removeItem(this.navigationItem)}setQuery(e){this.inputSearch.inputField.value=e}selectResult(e){if(this.setPeerPromise)return this.setPeerPromise;const t=e.dataset.peerId.toPeerId(),i=+e.dataset.mid||void 0,s=(0,Me.Z)(e);s===this.foundCount-1?this.upBtn.setAttribute("disabled","true"):this.upBtn.removeAttribute("disabled"),s?this.downBtn.removeAttribute("disabled"):this.downBtn.setAttribute("disabled","true"),this.results.classList.remove("active"),this.chat.bubbles.container.classList.remove("search-results-active");const n=this.chat.setPeer({peerId:t,lastMsgId:i});this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then((()=>{this.selectedIndex=s,(0,H.Z)(this.foundCountEl,(0,L.ag)("Of",[s+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()})).finally((()=>{this.setPeerPromise=null}))}}var mo=i(1571),go=i(6848),vo=i(356);class bo{constructor(){this.canvases=new Set}static getInstance(e){let t=this.INSTANCES.find((t=>(0,go.Z)(t.options,e)));return t||(t=new bo,t.init(e),this.INSTANCES.push(t)),t}init(e){this.options=e}renderToCanvas(e){return this.renderImageFromUrl(this.options.url).then((()=>this.fillCanvas(e)))}renderImageFromUrl(e){if(this.renderImageFromUrlPromise)return this.renderImageFromUrlPromise;const t=this.image=document.createElement("img");return t.crossOrigin="anonymous",this.renderImageFromUrlPromise=(0,Ut.cj)(t,e,!1).then((()=>vo.Z?createImageBitmap(t,{resizeWidth:1440,resizeHeight:2960}).then((e=>(this.imageBitmap=e,t))):t))}cleanup(e){var t;this.canvases.delete(e),this.canvases.size||((0,h.Z)(bo.INSTANCES,this),this.objectUrl&&(null===(t=this.imageBitmap)||void 0===t||t.close(),URL.revokeObjectURL(this.objectUrl)))}fillCanvas(e){const t=e.getContext("2d"),{width:i,height:s}=e,n=this.imageBitmap||this.image;let a=n.width,o=n.height;const r=(500+Ae.Z.height/2.5)*e.dpr;a*=r/o,o=r,this.options.mask?(t.fillStyle="#000",t.fillRect(0,0,i,s),t.globalCompositeOperation="destination-out"):t.globalCompositeOperation="source-over";const d=e=>{for(let s=0;s0){let e=l;do{d(e-=o)}while(e>=0)}const c=s-1;for(let e=l+o;ei.resize(e,t))))}}bo.INSTANCES=[];var yo=i(6714),wo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class So extends l.Z{constructor(e,t){super(),this.appImManager=e,this.managers=t,this.type="chat",this.animationGroup=`chat-${Math.round(65535*Math.random())}`,this.container=document.createElement("div"),this.container.classList.add("chat","tabs-tab"),this.backgroundEl=document.createElement("div"),this.backgroundEl.classList.add("chat-background"),this.log=(0,r.kg)("CHAT",r.v9.Log|r.v9.Warn|r.v9.Debug|r.v9.Error),this.log.warn("constructor"),this.peerId=m.NM,this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container),this.backgroundTempId=0,this.sharedMediaTabs=[]}setBackground(e,t){var i;const s=yo.Z.getTheme().settings.wallpaper,n=(0,O.EM)(s);let a;if(n&&!s.slug&&!s.settings.intensity&&"grabbing"===document.documentElement.style.cursor&&this.gradientRenderer&&!this.patternRenderer)return this.gradientCanvas.dataset.colors=n,this.gradientRenderer.init(this.gradientCanvas),Promise.resolve();const o=++this.backgroundTempId,r=this.gradientRenderer,l=this.patternRenderer,c=(this.gradientCanvas,this.patternCanvas);this.gradientRenderer=this.patternRenderer=this.gradientCanvas=this.patternCanvas=void 0;const h=(null===(i=s.settings)||void 0===i?void 0:i.intensity)&&s.settings.intensity/100,u=!!h&&h<0;let p,f,m,g=null==a?void 0:a.firstElementChild;if(!a)if(a=document.createElement("div"),a.classList.add("chat-background-item"),e)if(h){a.classList.add("is-pattern");const t=this.appImManager.chatsContainer.getBoundingClientRect();p=this.patternRenderer=bo.getInstance({url:e,width:t.width,height:t.height,mask:u}),g=this.patternCanvas=p.createCanvas(),g.classList.add("chat-background-item-canvas","chat-background-item-pattern-canvas"),u&&a.classList.add("is-dark")}else a.classList.add("is-image");else a.classList.add("is-color");if(n){const{canvas:e,gradientRenderer:t}=mo.Z.create(n);m=this.gradientRenderer=t,f=this.gradientCanvas=e,f.classList.add("chat-background-item-canvas","chat-background-item-color-canvas"),d.Z.settings.animationsEnabled&&m.scrollAnimate(!0)}p&&(u?f:g).style.setProperty("--opacity-max",""+Math.abs(h)*(u?.5:1));const v=new Promise((i=>{const s=()=>{if(this.backgroundTempId!==o)return p&&p.cleanup(g),void(m&&m.cleanup());const e=this.backgroundEl.lastElementChild;if(e===a)return void i();const s=[f,g].filter(Boolean);s.length&&a.append(...s),this.backgroundEl.append(a),(0,De.Z)({element:a,className:"is-visible",forwards:!0,duration:t?0:200,onTransitionEnd:e?()=>{null==l||l.cleanup(c),null==r||r.cleanup(),e.remove()}:null,useRafs:2}),i()};p?p.renderToCanvas(g).then((()=>{this.backgroundTempId===o&&s()})):e?(0,Ut.ZP)(a,e,s):s()}));return this.setBackgroundPromise=Promise.race([(0,at.Z)(500),v])}setType(e){this.type=e}init(){this.topbar=new co(this,a.ZP,this.managers),this.bubbles=new Zs(this,this.managers),this.input=new Ua(this,this.appImManager,this.managers),this.contextMenu=new on(this,this.managers),this.selection=new Ha.Z(this,this.bubbles,this.input,this.managers),this.topbar.constructUtils(),this.topbar.constructPeerHelpers(),this.topbar.construct(),this.input.construct(),this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers(),c.Z||this.bubbles.setReactionsHoverListeners(),this.bubbles.attachContainerListeners(),this.container.append(this.topbar.container,this.bubbles.container,this.input.chatInput),this.bubbles.listenerSetter.add(d.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer({peerId:t})})),this.bubbles.listenerSetter.add(d.Z)("dialog_drop",(e=>{e.peerId!==this.peerId||"dialog"!==e._&&this.threadId!==e.id||this.appImManager.setPeer()}));const e=e=>{const t=()=>{var t;null===(t=this.bubbles.observer)||void 0===t||t.toggleObservingNew(e),s.Z.toggleIntersectionGroup(this.animationGroup,e),e&&s.Z.checkAnimations(e,this.animationGroup)};e?t():setTimeout((()=>{t()}),400)};this.bubbles.listenerSetter.add(this.appImManager)("chat_changing",(({to:t})=>{e(t!==this)})),this.bubbles.listenerSetter.add(this.appImManager)("tab_changing",(t=>{e(this.appImManager.chat!==this||t!==Qr.CHAT&&o.Z.activeScreen===o._.mobile)}))}beforeDestroy(){this.bubbles.cleanup()}cleanupBackground(){++this.backgroundTempId,this.patternRenderer&&(this.patternRenderer.cleanup(this.patternCanvas),this.patternRenderer=void 0),this.gradientRenderer&&(this.gradientRenderer.cleanup(),this.gradientRenderer=void 0)}destroy(){this.destroySharedMediaTab(),this.topbar.destroy(),this.bubbles.destroy(),this.input.destroy(),this.contextMenu&&this.contextMenu.destroy(),this.selection&&this.selection.attachListeners(void 0,void 0),this.cleanupBackground(),delete this.topbar,delete this.bubbles,delete this.input,delete this.selection,delete this.contextMenu,this.container.remove()}cleanup(e=!0){this.input.cleanup(e),this.topbar.cleanup(),this.selection.cleanup()}get isForumTopic(){return!(!this.isForum||!this.threadId)}onChangePeer(e,t){var i;return wo(this,void 0,void 0,(function*(){const{peerId:s,threadId:n}=this,o=a.ZP.getTab(po);null==o||o.close();const[r,d,l,c,h,u,p,f,m]=yield t(Promise.all([this.managers.appPeersManager.noForwards(s),this.managers.appPeersManager.isPeerRestricted(s),this._isAnyGroup(s),this.setAutoDownloadMedia(),this.managers.appPeersManager.isMegagroup(s),this.managers.appPeersManager.isBroadcast(s),this.managers.appPeersManager.isChannel(s),this.managers.appPeersManager.isBot(s),this.managers.appPeersManager.isForum(s)]));m&&n&&(yield t(this.managers.dialogsStorage.getForumTopicOrReload(s,n))),this.noForwards=r,this.isRestricted=d,this.isAnyGroup=l,this.isMegagroup=h,this.isBroadcast=u,this.isChannel=p,this.isBot=f,this.isForum=m,this.isAllMessagesForum=m&&!n,n&&!this.isForum&&(e.type="discussion");const g=null!==(i=e.type)&&void 0!==i?i:"chat";this.setType(g),this.messagesStorageKey=`${this.peerId}_${"scheduled"===this.type?"scheduled":"history"}`,this.container.classList.toggle("no-forwards",this.noForwards),this.sharedMediaTab=a.ZP.createSharedMediaTab(),this.sharedMediaTabs.push(this.sharedMediaTab),this.sharedMediaTab.setPeer(s,n),this.input.clearHelper(),this.selection.cleanup()}))}setPeer(e){const{peerId:t,threadId:i}=e;t?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=void 0;const s=this.appImManager.isSamePeer(this,e);if(s){if(this.setPeerPromise)return}else this.appImManager.dispatchEvent("peer_changing",this),this.peerId=t||m.NM,this.threadId=i;if(!t)return a.ZP.toggleSidebar(!1),this.cleanup(!0),this.bubbles.setPeer({samePeer:!1,peerId:t}),this.peerId=0,this.appImManager.dispatchEvent("peer_changed",this),a.ZP.replaceSharedMediaTab(),this.destroySharedMediaTab(),void(this.sharedMediaTab=void 0);this.peerChanged=s;const n=this.bubbles.setPeer(Object.assign(Object.assign({},e),{samePeer:s})),o=this.setPeerPromise=n.then((e=>e.promise)).catch(Ye.Z).finally((()=>{this.setPeerPromise===o&&(this.setPeerPromise=null)}));return n}destroySharedMediaTab(e=this.sharedMediaTab){e&&((0,h.Z)(this.sharedMediaTabs,e),e.destroy())}setAutoDownloadMedia(){return wo(this,void 0,void 0,(function*(){this.autoDownload=yield function(e){return t=this,i=void 0,n=function*(){let t,i=0,s=0,n=0;const a=d.Z.settings,o=d.Z.managers.appPeersManager;return!a.autoDownloadNew.pFlags.disabled&&e&&(t=e.isUser()?(yield o.isContact(e))?"contacts":"private":(yield o.isBroadcast(e))?"channels":"groups",a.autoDownload.photo[t]&&(i=a.autoDownloadNew.photo_size_max),a.autoDownload.video[t]&&(s=a.autoDownloadNew.video_size_max),a.autoDownload.file[t]&&(n=a.autoDownloadNew.file_size_max)),{photo:i,video:s,file:n}},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}(this.peerId)}))}setMessageId(e){return this.setPeer({peerId:this.peerId,threadId:this.threadId,lastMsgId:e})}finishPeerChange(e,t,i,s){return wo(this,void 0,void 0,(function*(){if(this.peerChanged)return;const t=this.peerId;this.peerChanged=!0,this.wasAlreadyUsed=!0;const i=this.bubbles.getMiddleware();this.cleanup(!1);const n=this.sharedMediaTab,o=Promise.all([this.topbar.finishPeerChange(e),this.bubbles.finishPeerChange(),this.input.finishPeerChange(s),n.fillProfileElements()]),r=yield o;n.loadSidebarMedia(!0),i()&&(r.forEach((e=>{null==e||e()})),a.ZP.replaceSharedMediaTab(n),this.sharedMediaTabs.filter((e=>e!==n)).forEach((e=>this.destroySharedMediaTab(e))),this.container.dataset.type=this.type,this.log.setPrefix("CHAT-"+t+"-"+this.type),this.appImManager.dispatchEvent("peer_changed",this))}))}getMessage(e){return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey,e)}getMidsByMid(e){return wo(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.getMidsByMessage(yield this.getMessage(e))}))}getHistoryStorage(e){return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId,e?void 0:this.threadId).then((e=>Object.assign(Object.assign({},e),{history:ve.Z.fromJSON(e.historySerialized)})))}getDialogOrTopic(){return this.isForum&&this.threadId?this.managers.dialogsStorage.getForumTopic(this.peerId,this.threadId):this.managers.dialogsStorage.getDialogOnly(this.peerId)}getHistoryMaxId(){return this.getHistoryStorage().then((e=>e.maxId))}_isAnyGroup(e){return wo(this,void 0,void 0,(function*(){return e===d.Z.myId||e===m.hj||(yield this.managers.appPeersManager.isAnyGroup(e))}))}initSearch(e){if(this.peerId)if(o.Z.isMobile)this.search?this.search.setQuery(e):this.search=new fo(this.topbar,this,e);else{let t=a.ZP.getTab(po);t||(t=a.ZP.createTab(po)),t.open(this.peerId,this.threadId,this.bubbles.onDatePick,e)}}canSend(e){return this.managers.appMessagesManager.canSendToPeer(this.peerId,this.threadId,e)}isStartButtonNeeded(){return Promise.all([this.managers.appPeersManager.isBot(this.peerId),this.managers.appMessagesManager.getDialogOnly(this.peerId),this.getHistoryStorage(!0)]).then((([e,t,i])=>e&&!t&&!i.history.length))}getMessageSendingParams(){return{threadId:this.threadId,replyToMsgId:this.input.replyToMsgId,scheduleDate:this.input.scheduleDate,silent:this.input.sendSilent,sendAsPeerId:this.input.sendAsPeerId}}isOurMessage(e){return e.fromId===d.Z.myId||!!e.pFlags.out&&this.isMegagroup}isOutMessage(e){const t=e.fwd_from;return!(!this.isOurMessage(e)||t&&this.peerId===d.Z.myId)}isAvatarNeeded(e){return this.isAnyGroup&&!this.isOutMessage(e)}isPinnedMessagesNeeded(){return"chat"===this.type||this.isForum}}var Co=i(2342),Lo=i(6637);class Eo{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,c.Z){if(e&&(0,Le.Z)(e),0!=this.mouseUpCounter++)return void this.hide();this.resetSelection(this.savedRange)}this.show()}}init(){this.container=document.createElement("div"),this.container.classList.add("markup-tooltip","z-depth-1","hide"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("markup-tooltip-wrapper");const e=document.createElement("div"),t=document.createElement("div");e.classList.add("markup-tooltip-tools"),t.classList.add("markup-tooltip-tools"),["bold","italic","underline","strikethrough","monospace","spoiler","link"].forEach((t=>{const i=(0,Vn.Z)(t,{noRipple:!0});e.append(this.buttons[t]=i),"link"!==t?i.addEventListener("mousedown",(e=>{(0,Le.Z)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()})):(0,C.fc)(i,(e=>{(0,Le.Z)(e),this.showLinkEditor(),this.cancelClosening()}))})),this.linkBackButton=(0,Vn.Z)("left",{noRipple:!0}),this.linkInput=document.createElement("input"),(0,L.$d)(this.linkInput,"MarkupTooltip.LinkPlaceholder",void 0,"placeholder"),this.linkInput.classList.add("input-clear"),this.linkInput.addEventListener("keydown",(e=>{const t=!this.linkInput.value.length||!!(0,Co.Z)(this.linkInput.value);"Enter"===e.key&&(t?this.applyLink(e):(this.linkInput.classList.contains("error")&&(this.linkInput.classList.remove("error"),this.linkInput.offsetLeft),this.linkInput.classList.add("error")))})),this.linkInput.addEventListener("input",(e=>{const t=this.isLinkValid();this.linkInput.classList.toggle("is-valid",t),this.linkInput.classList.remove("error")})),this.linkBackButton.addEventListener("mousedown",(e=>{(0,Le.Z)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()})),this.linkApplyButton=(0,Vn.Z)("check markup-tooltip-link-apply",{noRipple:!0}),this.linkApplyButton.addEventListener("mousedown",(e=>{this.applyLink(e)}));const i=document.createElement("div");i.classList.add("markup-tooltip-link-apply-container");const s=document.createElement("span"),n=document.createElement("span"),a=document.createElement("span");s.classList.add("markup-tooltip-delimiter"),n.classList.add("markup-tooltip-delimiter"),a.classList.add("markup-tooltip-delimiter"),e.insertBefore(s,this.buttons.link),i.append(a,this.linkApplyButton),t.append(this.linkBackButton,n,this.linkInput,i),this.wrapper.append(e,t),this.container.append(this.wrapper),document.body.append(this.container),window.addEventListener("resize",(()=>{this.hide()}))}showLinkEditor(){this.container&&this.container.classList.contains("is-visible")||this.show();const e=this.buttons.link;this.container.classList.add("is-link");const t=document.getSelection();if(this.savedRange=t.getRangeAt(0),e.classList.contains("active")){const e=this.savedRange.startContainer.parentElement;this.linkInput.value=e.href}else this.linkInput.value="";this.setTooltipPosition(!0),setTimeout((()=>{this.linkInput.focus()}),200),this.linkInput.classList.toggle("is-valid",this.isLinkValid())}applyLink(e){(0,Le.Z)(e),this.resetSelection();let t=this.linkInput.value;t&&!(0,Lo.Z)(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout((()=>{this.hide()}),0)}isLinkValid(){return!this.linkInput.value.length||!!(0,Co.Z)(this.linkInput.value)}resetSelection(e=this.savedRange){const t=window.getSelection();t.removeAllRanges(),t.addRange(e),this.appImManager.chat.input.messageInput.focus()}hide(){this.init||(this.container.classList.remove("is-visible"),document.removeEventListener("mouseup",this.onMouseUpSingle),this.waitingForMouseUp=!1,Hn.Z.removeByType("markup"),this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=window.setTimeout((()=>{this.hideTimeout=void 0,this.container.classList.add("hide"),this.container.classList.remove("is-link")}),200))}getActiveMarkupButton(){const e=new Set,t=Object.keys(this.buttons),i=Da(t);return t.forEach((t=>{i[t]&&e.add(this.buttons[t])})),[...e]}setActiveMarkupButton(){const e=this.getActiveMarkupButton();for(const t in this.buttons){const i=this.buttons[t];i.classList.toggle("active",e.includes(i))}}setTooltipPosition(e=!1){const t=document.getSelection().getRangeAt(0),i=document.body.getBoundingClientRect(),s=t.getBoundingClientRect(),n=this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();this.container.style.maxWidth=n.width+"px";const a=(0,ze.Z)(void 0,this.appImManager.chat.input.messageInput,!1,s).rect.top+-1*i.top,o=(this.container.classList.contains("is-link")?this.wrapper.lastElementChild:this.wrapper.firstElementChild).getBoundingClientRect(),r=a-o.height-8,d=n.left,l=n.left+n.width-Math.min(n.width,o.width);let c;if(e){const e=this.container.getBoundingClientRect();c=(0,Vi.Z)(e.left,d,l)}else{const e=s.left+(s.width-o.width)/2;c=(0,Vi.Z)(e,d,l)}this.container.style.transform=`translate3d(${c}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),Ds())return void this.hide();if(void 0!==this.hideTimeout&&clearTimeout(this.hideTimeout),this.container.classList.contains("is-visible"))return;this.setActiveMarkupButton(),this.container.classList.remove("is-link");const e=this.container.classList.contains("hide");e&&(this.container.classList.remove("hide"),this.container.classList.add("no-transition")),this.setTooltipPosition(),e&&(this.container.offsetLeft,this.container.classList.remove("no-transition")),this.container.classList.add("is-visible"),x.IS_MOBILE||Hn.Z.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){c.Z&&!x.IS_APPLE&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",(e=>{(0,Le.Z)(e),this.mouseUpCounter=1,this.waitingForMouseUp=!1,this.setMouseUpEvent()}),{once:!0}))}handleSelection(){this.addedListener||(this.addedListener=!0,document.addEventListener("selectionchange",(e=>{if(document.activeElement===this.linkInput)return;const t=this.appImManager.chat.input.messageInput;if(document.activeElement!==t)return void this.hide();const i=document.getSelection();if(Ds(i))this.hide();else if(c.Z)if(x.IS_APPLE)this.show(),this.setTooltipPosition();else{if(2===this.mouseUpCounter)return void(this.mouseUpCounter=0);this.savedRange=i.getRangeAt(0),this.setMouseUpEvent()}else this.container&&this.container.classList.contains("is-visible")?(this.setActiveMarkupButton(),this.setTooltipPosition()):t.matches(":active")?this.setMouseUpEvent():this.show()})),document.addEventListener("beforeinput",(e=>{"historyRedo"!==e.inputType&&"historyUndo"!==e.inputType||e.target.addEventListener("input",(()=>this.setActiveMarkupButton()),{once:!0})})))}}var Io=i(9171);class Mo{constructor(e,t){let i;this.options=t,this.onDragOver=e=>{this.container.classList.add("is-dragover")},this.onDragLeave=e=>{this.container.classList.remove("is-dragover")},this.onDrop=e=>{this.options.onDrop(e)},this.container=document.createElement("div"),this.container.classList.add("drop","z-depth-1"),this.outlineWrapper=document.createElement("div"),this.outlineWrapper.classList.add("drop-outline-wrapper"),this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.classList.add("drop-outline"),this.path=document.createElementNS("http://www.w3.org/2000/svg","path"),this.path.classList.add("drop-outline-path"),t.icon&&(i=document.createElement("div"),i.classList.add("drop-icon","tgico-"+t.icon));const s=document.createElement("div");let n;s.classList.add("drop-header"),s.append((0,L.ag)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append((0,L.ag)(t.subtitle))),this.svg.append(this.path),this.outlineWrapper.append(this.svg),this.container.append(...[this.outlineWrapper,i,s,n].filter(Boolean)),e.append(this.container),this.container.addEventListener("dragover",this.onDragOver),this.container.addEventListener("dragleave",this.onDragLeave),this.container.addEventListener("drop",this.onDrop)}destroy(){delete this.options,this.container.remove(),this.container.removeEventListener("dragover",this.onDragOver),this.container.removeEventListener("dragleave",this.onDragLeave),this.container.removeEventListener("drop",this.onDrop)}setPath(){const e=this.outlineWrapper.getBoundingClientRect();this.svg.setAttributeNS(null,"preserveAspectRatio","none"),this.svg.setAttributeNS(null,"viewBox",`0 0 ${e.width} ${e.height}`),this.svg.setAttributeNS(null,"width",`${e.width}`),this.svg.setAttributeNS(null,"height",`${e.height}`);const t=10,i=e.width-t,s=e.height-t,n=(0,Io.Z)(5,5,i,s,t,t,t,t);this.path.setAttributeNS(null,"d",n)}}var Po=i(7922);function Zo(e){e.forEach((e=>e.classList.add("no-transition"))),(0,fe.d1)().then((()=>{e.forEach((e=>e.classList.remove("no-transition")))}))}var To=i(490),ko=i(2831),xo=i(2207);class Ao{constructor(e){this.maxRadius=10,this.minRadius=0,this.N=e,this.radius=new Array(e+1),this.radiusNext=new Array(e+1),this.progress=new Array(e+1),this.speed=new Array(e+1);for(let t=0;t<=e;t++)this.generateBlob(this.radius,t),this.generateBlob(this.radiusNext,t),this.progress[t]=0}generateBlob(e,t){const{maxRadius:i,minRadius:s,speed:n}=this,a=i-s;e[t]=s+Math.random()*a,n[t]=.017+.003*Math.random()}generateNextBlob(){const{radius:e,radiusNext:t,progress:i,N:s}=this;for(let n=0;n=1&&(s[r]=0,a[r]=o[r],this.generateBlob(o,r))}draw(e,t,i,s,n,a,o,r){if(n.getContext){const d=n.getContext("2d");d.beginPath(),d.moveTo(i,s),d.lineTo(e,s);const{radius:l,radiusNext:c,N:h}=this;for(let n=0;n<=h;n++)if(0===n){const i=this.progress[n],s=(t-(l[n]*(1-i)+c[n]*i))*r+o*(1-r);d.lineTo(e,s)}else{const a=this.progress[n-1],u=l[n-1]*(1-a)+c[n-1]*a,p=this.progress[n],f=(i-e)/h*(n-1),m=(i-e)/h*n,g=f+(m-f)/2,v=(t-u)*r+o*(1-r),b=(t-(l[n]*(1-p)+c[n]*p))*r+o*(1-r);d.bezierCurveTo(g,v,g,b,m,b),n===h&&d.lineTo(i,s)}a(d),d.fill(),d.closePath()}}}class _o{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,i,s,n,a)=>{t.fillStyle=_o.getGradientFromType(t,e,i,s,n,a)}}static getGradientFromType(e,t,i,s,n,a){const o=e.createLinearGradient(i,s,n,a);return t===xo.Z.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===xo.Z.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===xo.Z.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===xo.Z.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,i,s){}}class Fo{constructor(){this.handleDevicePixelRatioChanged=e=>{this.setSize(),this.forceUpdate()},this.handleResize=()=>{this.resizeHandler&&(clearTimeout(this.resizeHandler),this.resizeHandler=null),this.resizing=!0,this.resizeCanvas(),this.resizeHandler=window.setTimeout((()=>{this.resizing=!1,this.invokeDraw()}),250)},this.handleFocus=()=>{this.focused=!0,this.invokeDraw()},this.handleBlur=()=>{this.focused=!1},this.invokeDraw=()=>{this.raf||this.draw()},this.draw=(e=!1)=>{if(this.raf=null,!this.mounted)return;const{lbd:t,lbd1:i,lbd2:s,scale:n,left:a,top:o,right:r,bottom:d,currentState:l,previousState:c,focused:h,resizing:u,canvas:p}=this;if(!h&&!u&&this.progressToState>=1)return;let f=Date.now()-this.lastUpdateTime;f>20&&(f=17),this.animateToAmplitude!==this.amplitude&&(this.amplitude+=this.animateAmplitudeDiff*f,this.animateAmplitudeDiff>0?this.amplitude>this.animateToAmplitude&&(this.amplitude=this.animateToAmplitude):this.amplitude0?this.amplitude2>this.animateToAmplitude&&(this.amplitude2=this.animateToAmplitude):this.amplitude21&&(this.progressToState=1,this.previousState=null));const{amplitude:m,amplitude2:g,progressToState:v}=this,b=6*g*n,y=6*g*n;p.getContext("2d").clearRect(0,0,p.width,p.height),t.minRadius=0,t.maxRadius=(2+2*m)*n,i.minRadius=0,i.maxRadius=(3+9*m)*n,s.minRadius=0,s.maxRadius=(3+9*m)*n,t.update(m,.3),i.update(m,.7),s.update(m,.7);for(let e=0;e<2;e++){if(0===e&&!c)continue;let n=1,h=null;0===e?(n=1-v,h=c):(n=c?v:1,l.update(d-o,r-a,f,m),h=l);const u=e=>{e.globalAlpha=.3*n,h.shader(e,a,o,r,d)},g=t=>{t.globalAlpha=0===e?1:n,h.shader(t,a,o,r,d)};i.draw(a,o-b,r,d,p,u,o,1),s.draw(a,o-y,r,d,p,u,o,1),t.draw(a,o,r,d,p,g,o,1)}e||(this.raf=requestAnimationFrame((()=>this.draw())))},this.setCurrentState=(e,t)=>{const{currentState:i,states:s}=this;(null==i?void 0:i.stateId)!==e&&(this.previousState=t?i:null,this.currentState=s.get(e),this.progressToState=this.previousState?0:1)},this.focused=!0,this.resizing=!1,this.lastUpdateTime=Date.now(),this.amplitude=0,this.amplitude2=0,this.states=new Map([[xo.Z.UNMUTED,new _o(xo.Z.UNMUTED)],[xo.Z.MUTED,new _o(xo.Z.MUTED)],[xo.Z.MUTED_BY_ADMIN,new _o(xo.Z.MUTED_BY_ADMIN)],[xo.Z.CONNECTING,new _o(xo.Z.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(xo.Z.CONNECTING),this.progressToState=1}componentDidMount(){this.mounted||(this.mounted=!0,window.addEventListener("resize",this.handleResize),this.media=window.matchMedia("screen and (min-resolution: 2dppx)"),this.media.addEventListener("change",this.handleDevicePixelRatioChanged),this.setSize(),this.forceUpdate(),this.lbd=new Ao(3),this.lbd1=new Ao(7),this.lbd2=new Ao(8),this.setAmplitude(this.amplitude),this.draw())}componentWillUnmount(){this.mounted=!1,window.removeEventListener("resize",this.handleResize),this.media.addEventListener("change",this.handleDevicePixelRatioChanged);const{canvas:e}=this;e.getContext("2d").clearRect(0,0,e.width,e.height)}setSize(){this.scale=window.devicePixelRatio,this.top=20*this.scale,this.right=(this.mounted?this.container.offsetWidth:1261)*this.scale,this.bottom=(this.mounted?this.container.offsetHeight:68)*this.scale,this.left=0*this.scale,this.setCanvasSize()}setCanvasSize(){this.canvas.width=this.right,this.canvas.height=this.bottom}resizeCanvas(){this.scale=window.devicePixelRatio,this.right=this.container.offsetWidth*this.scale,this.forceUpdate(),this.invokeDraw()}setAmplitude(e){const{amplitude:t}=this;this.animateToAmplitude=e,this.animateAmplitudeDiff=(e-t)/250,this.animateAmplitudeDiff2=(e-t)/120}forceUpdate(){this.setCanvasSize()}render(e){const t=this.container=document.createElement("div");t.classList.add(e);const i=this.canvas=document.createElement("canvas");return i.classList.add(e+"-canvas"),t.append(i),t}}var Do=i(8222);class Ro{constructor(e,t){this.item=e,(0,zn.Z)(this,t)}play(e){return this.item.playPart(this,e)}}class Bo{constructor(e,t){this.icon=e,this.autoplay=!1,(0,zn.Z)(this,t),this.parts=this.parts.map((e=>this.createPart(e)))}load(){var e;let t=this.loadPromise;if(t)return t;const{container:i,canvas:s,width:n,height:a}=this.icon;return t=Bs.Z.loadAnimationAsAsset({container:i,canvas:s,width:n,height:a,group:"none",loop:!1,autoplay:null!==(e=this.autoplay)&&void 0!==e&&e,initFrame:this.initFrame,skipFirstFrameRendering:void 0===this.initFrame,color:this.color,inverseColor:this.inverseColor},this.name).then((e=>Bs.Z.waitForFirstFrame(e))).then((e=>{this.player=e,this.onLoadForColor&&(this.onLoadForColor(),this.onLoadForColor=void 0),this.onLoadForPart&&(this.onLoadForPart(),this.onLoadForPart=void 0)})),this.loadPromise=t,this.icon.loadPromises.set(this.name,t),t}createPart(e){return new Ro(this,e)}getPart(e){return e instanceof Ro?e:"string"==typeof e?this.parts.find((t=>t.name===e)):this.parts[e]}playPart(e,t){return this.icon.playPart(this,e,t)}}class No{constructor(e){(0,zn.Z)(this,e),this.container||(this.container=document.createElement("div")),this.container.classList.add("rlottie-icon");const{width:t,height:i}=this;this.container.style.width=t+"px",this.container.style.height=i+"px";const s=this.canvas=document.createElement("canvas");s.classList.add("rlottie"),s.width=t,s.height=i,this.items=new Map,this.loadPromises=new Map}get loadPromise(){return Promise.all([...this.loadPromises.values()]).then(Ye.Z)}getItem(e){return e||1!==this.items.size?this.items.get(e):this.items.values().next().value}add(e){const t=new Bo(this,e);return this.items.set(e.name,t),t}playPart(e,t,i){if(!e.player)return void(e.onLoadForPart=()=>{this.playPart(e,t,i)});const s=e.getPart(t);e.player.playPart({from:d.Z.settings.animationsEnabled&&!this.skipAnimation?s.startFrame:s.endFrame,to:s.endFrame,callback:i})}static generateEqualParts(e,t){return new Array(e).fill(0).map(((e,i)=>{const s=i*t;return{startFrame:s,endFrame:s+t-1}}))}}class Oo extends No{constructor(e){super({width:e.width,height:e.height}),(0,zn.Z)(this,e)}load(e,t){if(this.loaded)return this.loadPromise;this.loaded=!0,this.partState=e,this.colorState=t;const i=this.getPart(e),s=void 0!==t&&this.getColor&&this.getColor(t),n=i.item;n.initFrame=i.endFrame,n.color=s;const a=[...this.items.values()].map((e=>e.load()));return Promise.all(a).then(Ye.Z)}setState(e,t,i){this.loaded||this.load(e,t);let s=!1,n=!1;return void 0!==e?s=this.setPartState(e,t,i):void 0!==t&&(n=this.setColorState(t)),s||n}setPartState(e,t,i){const{partState:s}=this;return s===e?void 0!==t&&this.setColorState(t):(void 0!==t&&this.setColorState(t,!1),this.partState=e,this.getPart(e,s).play(i),!0)}setColorState(e,t=!0){const{colorState:i}=this;if(i===e||!this.getColor)return!1;this.colorState=e;const s=this.getItem(),n=this.getColor(e,i),a=()=>{s.player.setColor(n,t)};return s.player?a():s.onLoadForColor=a,!0}destroy(){this.items.forEach((e=>{e.loadPromise.then((()=>{e.player.remove()}))}))}}class Uo extends Oo{constructor(){super({width:36,height:36,getPart:(e,t)=>{const i=fr;let s;switch(e){case i.HAND:s=t===i.MUTED?"muted-to-hand":"unmuted-to-hand";break;case i.MUTED:s=t===i.HAND?"hand-to-muted":"mute";break;case i.UNMUTED:s="unmute"}return this.getItem().getPart(s)}}),this.container.classList.add("group-call-microphone-icon-container"),this.add({name:"voip_filled",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:172,name:"unmuted-to-hand"},{startFrame:173,endFrame:201,name:"scheduled-crossing"},{startFrame:202,endFrame:236,name:"scheduled-to-muted"},{startFrame:237,endFrame:273,name:"scheduled-to-hand"},{startFrame:274,endFrame:310,name:"scheduled-crossed-to-hand"},{startFrame:311,endFrame:343,name:"scheduled-uncrossing"},{startFrame:344,endFrame:375,name:"scheduled-to-muted"},{startFrame:376,endFrame:403,name:"play-to-muted"}]})}}var Ho=i(6733);class zo extends Oo{constructor(e){super({width:32,height:32,getPart:(e,t)=>{const i=pr;let s;switch(e){case i.HAND:s=3;break;case i.MUTED:s=t===i.HAND?0:2;break;case i.UNMUTED:s=1}return this.getItem().getPart(s)},getColor:e?(e,t)=>function(e){const t=pr;let i;switch(e){case t.HAND:i="blue";break;case t.MUTED:case t.MUTED_FOR_ME:case t.MUTED_BY_ADMIN:i=e===t.MUTED?"secondary":"red";break;case t.UNMUTED:i="green"}const s=Do.Z.getProperty("gc-"+i+"-text-color");return(0,O.oo)(s)}(e):void 0}),this.colored=e,this.container.classList.add("group-call-participant-muted-icon-container");const t=No.generateEqualParts(4,21);this.add({name:"voice_outlined2",parts:t})}setState(e){return super.setState(function(e){const t=pr;switch(e){case t.MUTED_BY_ADMIN:case t.MUTED_FOR_ME:return t.MUTED;default:return e}}(e),e)}}const jo="group-call-participant-status";class Go{constructor(e){this.withIcons=e,this.container=document.createElement("div"),this.container.classList.add(jo+"-container")}setState(e,t){const i=pr,s=this.withIcons.filter((e=>!!t[e])).map((e=>{const t="tgico-"+("presentation"===e?"listscreenshare":"videocamera_filled"),i=document.createElement("i");return i.classList.add(jo+"-icon",jo+"-icon-"+e,t),i}));let n,a;if(e===i.MUTED_FOR_ME)n=(0,L.ag)("VoiceChat.Status.MutedForYou"),a="is-muted";else if(e===i.UNMUTED)n=(0,L.ag)("VoiceChat.Status.Speaking"),a="is-speaking";else if(e===i.HAND)n=(0,L.ag)("VoiceChat.Status.WantsSpeak"),a="is-waiting";else{if(t.about&&!s.length)return void(0,F.Z)(this.container,(0,B.Z)(t.about));n=(0,L.ag)("VoiceChat.Status.Listening"),a="is-listening"}const o=document.createElement("span");o.classList.add(jo,a),o.append(...s,n),(0,H.Z)(this.container,o)}}var Vo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ko extends fs.Z{constructor(e){super({getIndex:e=>Vo(this,void 0,void 0,(function*(){return(yield this.instance.getParticipantByPeerId(e.id)).date})),onDelete:e=>{e.dom.listEl.remove(),this.onElementDestroy(e)},onUpdate:e=>Vo(this,void 0,void 0,(function*(){const t=yield this.instance.getParticipantByPeerId(e.id),i=mr(t);e.mutedIcon.setState(i),e.status.setState(i,t)})),onSort:(e,t)=>{(0,p.Z)(e.dom.listEl,this.list,t)},onElementCreate:e=>{const{dom:t}=es.default.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,wrapOptions:{lazyLoadQueue:this.lazyLoadQueue}});t.listEl.classList.add("group-call-participant");const i=new zo(!0),s=new Go(["presentation","video"]);return(0,H.Z)(t.lastMessageSpan,s.container),t.listEl.append(i.container),e.mutedIcon=i,e.status=s,e.dom=t,e},updateElementWith:fe.T2}),this.instance=e,this.avatarSize="abitbigger",this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=es.default.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach((e=>{this.onElementDestroy(e)}))}onElementDestroy(e){e.mutedIcon.destroy()}}var Wo=i(7529);function $o(e){const t=document.createElement("canvas");t.classList.add("call-video-blur"),t.width=16,t.height=16;const i=t.getContext("2d",{alpha:!1});i.filter="blur(2px)";const s=()=>{i.drawImage(e,0,0,e.videoWidth,e.videoHeight,0,0,t.width,t.height)};return(0,Pe.jt)((()=>(s(),t.isConnected))),s(),t}const qo="group-call-participant-video";class Qo{constructor(e,t,i){this.managers=e,this.instance=t,this.source=i,this.container=document.createElement("div"),this.container.classList.add(qo+"-container"),this.info=document.createElement("div"),this.info.classList.add(qo+"-info"),this.left=document.createElement("div"),this.left.classList.add(qo+"-info-left"),this.right=document.createElement("div"),this.right.classList.add(qo+"-info-right"),this.info.append(this.left,this.right),this.container.append(this.info)}setPinned(e){if(!e)return void(this.header&&(this.header.remove(),this.header=void 0));if(this.header)return;this.header=document.createElement("div"),this.header.classList.add(qo+"-header");const t=document.createElement("i");t.classList.add("group-call-pin-icon","tgico-pin"),this.header.append(t),this.container.append(this.header)}setParticipant(e,t,i){let s;e.pFlags.self?(s=(0,L.ag)("VoiceChat.Status.You"),s.classList.add("peer-title")):(this.peerTitle=new N.Z({peerId:(0,R.Z)(e.peer)}),s=this.peerTitle.element),this.groupCallParticipantMutedIcon=new zo(!1),this.groupCallParticipantStatus=new Go([t]),this.left.append(s,this.groupCallParticipantStatus.container),this.right.append(this.groupCallParticipantMutedIcon.container),i.classList.add(qo,"call-video"),i.paused&&i.play();const n=$o(i);n.classList.add(qo+"-blur"),this.container.prepend(n,i),this.updateParticipant(e)}updateParticipant(e){const t=mr(e);this.groupCallParticipantMutedIcon.setState(t),this.groupCallParticipantStatus.setState(t,e)}destroy(){this.groupCallParticipantMutedIcon.destroy()}}class Yo extends Wo.Z{constructor(e){super(),(0,zn.Z)(this,e);const t=this.container=document.createElement("div");this.container.classList.add("group-call-participants-video-container"),e.appendTo.append(t),this.participantsElements=new Map,this.containers=new Map;const{listenerSetter:i}=this;i.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),i.add(this.instance)("pinned",(e=>{this.participantsElements.forEach((t=>{t.forEach((t=>{this.setElementDisplay(t,e)}))}))})),(0,C.fc)(this.container,(e=>{const t=(0,be.Z)(e.target,"group-call-participant-video-container");if(!t)return;const i=this.containers.get(t);this.instance.pinnedSource!==i.source?this.instance.pinSource(i.source):this.instance.unpinAll()}),{listenerSetter:i}),this.setInstance(this.instance),this.setup({element:t,listenerSetter:i,showOnLeaveToClassName:"group-call-buttons"})}shouldDisplayElement(e,t){return this.displayPinned?!t||e.source===t:t&&e.source!==t}setElementDisplay(e,t){const i=this.shouldDisplayElement(e,t);e.container.classList.toggle("video-hidden",!i);const s=e.source===t;e.setPinned(s)}updateParticipant(e){const t=(0,R.Z)(e.peer),i=["video","presentation"],s=i.some((t=>!!e[t]));let n=this.participantsElements.get(t);(s||n)&&(n||this.participantsElements.set(t,n=new Map),i.forEach((i=>{let s=n.get(i);const a=e[i];if(!!a!=!!s){if(a){const t=this.instance.getVideoElementFromParticipantByType(e,i);if(!t)return;const{video:a,source:o}=t;s=new Qo(this.managers,this.instance,o),this.containers.set(s.container,s),this.setElementDisplay(s,this.instance.pinnedSource),n.set(i,s),s.setParticipant(e,i,a),this.container.prepend(s.container)}else n.delete(i),s.container.remove(),n.size||(this.participantsElements.delete(t),this.containers.delete(s.container),s.destroy());this._onLengthChange()}else s&&s.updateParticipant(e)})))}_onLengthChange(){const e=this.container.childElementCount;this.container.dataset.length=""+e,this.container.dataset.layout=e<=2?"1":3===e?"3":"4",this.onLengthChange&&this.onLengthChange(e)}setInstance(e){return t=this,i=void 0,n=function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}destroy(){this.containers.forEach((e=>{e.destroy()}))}}var Xo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Jo{constructor(e){this.onOpenProfileClick=()=>{const e=S.Z.getPopups(br)[0];e&&e.hide(),td.setInnerPeer({peerId:this.targetPeerId})},this.toggleParticipantMuted=e=>{this.instance.editParticipant(this.participant,{muted:e})},this.buttons=[{icon:"gc_microphoneoff",text:"VoiceChat.MutePeer",verify:()=>this.canManageCall&&this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmutePeer",verify:()=>this.canManageCall&&!this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"gc_microphoneoff",text:"VoiceChat.MuteForMe",verify:()=>!this.canManageCall&&!this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmuteForMe",verify:()=>!this.canManageCall&&this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"newprivate",text:"VoiceChat.OpenProfile",verify:()=>!0,onClick:this.onOpenProfileClick},{icon:"deleteuser danger",text:"VoiceChat.RemovePeer",verify:()=>this.managers.appChatsManager.hasRights(this.chatId,"ban_users"),onClick:()=>Xo(this,void 0,void 0,(function*(){(0,bi.Z)({peerId:this.targetPeerId,title:new N.Z({peerId:this.targetPeerId}).element,descriptionLangKey:(yield this.managers.appChatsManager.isBroadcast(this.chatId))?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new N.Z({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then((()=>{this.managers.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)}),Ye.Z)}))}];const{listenerSetter:t}=e;this.managers=e.managers,this.instance=e.instance,this.chatId=this.instance.chatId,this.element=(0,ks.b)({buttons:this.buttons,listenerSetter:t}),this.element.classList.add("group-call-participant-menu","night"),(0,Lt.E)({element:e.onContextElement,callback:e=>Xo(this,void 0,void 0,(function*(){const t=(0,be.Z)(e.target,"group-call-participant");if(!t)return;this.element.parentElement!==i&&i.append(this.element),(0,Le.Z)(e);const s=this.targetPeerId=t.dataset.peerId.toPeerId();this.participant=yield this.instance.getParticipantByPeerId(s),this.participant.pFlags.self||(this.canManageCall=yield this.managers.appChatsManager.hasRights(this.chatId,"manage_call"),yield(0,tn.Z)(this.buttons,(e=>Xo(this,void 0,void 0,(function*(){const t=yield e.verify(s);return e.element.classList.toggle("hide",!t),t})))),(0,en.Z)(e.touches?e.touches[0]:e,this.element,"right"),Et.Z.openBtnMenu(this.element))})),listenerSetter:t}),t.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{if(this.instance.id===e){const e=(0,R.Z)(t.peer);this.targetPeerId===e&&Et.Z.close()}}));let i=document.body;(0,Ho.Ms)(document.body,(()=>{const e=(0,Ho.rB)();i=e?S.Z.getPopups(br)[0].getContainer():document.body,e||Et.Z.close()}),t)}}class er{constructor(e){(0,zn.Z)(this,e);const t="group-call-participants",i=new T.ZP(void 0);i.container.classList.add(t+"-scrollable");const s=this.container=document.createElement("div");s.classList.add(t);const n=this.sortedList=new Ko(this.instance),{instance:a,listenerSetter:o}=this;this.contextMenu=new Jo(Object.assign(Object.assign({},e),{onContextElement:n.list,listenerSetter:o,instance:a})),this.groupCallParticipantsVideo=new Yo(Object.assign(Object.assign({},e),{appendTo:i.container,displayPinned:!1})),i.append(n.list),s.append(i.container),e.appendTo.append(s),o.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),new Ks.Z({scrollable:i,getPromise:()=>this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then((({participants:e,isEnd:t})=>(e.forEach((e=>{this.updateParticipant(e)})),t)))}),this.setInstance(a)}updateParticipant(e){const t=(0,R.Z)(e.peer),i=this.sortedList.has(t);e.pFlags.left?i&&this.sortedList.delete(t):i?this.sortedList.update(t):this.sortedList.add(t)}setInstance(e){return Xo(this,void 0,void 0,(function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))}))}destroy(){this.sortedList.destroy(),this.groupCallParticipantsVideo.destroy()}}class tr{constructor(e){this.appendTo=e,this.descriptionIntl=new L.ZP.IntlElement({key:"VoiceChat.Status.Connecting"}),this.descriptionIntl.element.classList.add("group-call-description")}detach(){this.descriptionIntl.element.remove()}update(e){const{state:t}=e;let i,s;t===xo.Z.CONNECTING?i="VoiceChat.Status.Connecting":(i="VoiceChat.Status.Members",s=[e.groupCall.participants_count]);const{descriptionIntl:n}=this;n.compareAndUpdate({key:i,args:s}),this.descriptionIntl.element.parentElement||this.appendTo.append(this.descriptionIntl.element)}}class ir{constructor(e){this.appendTo=e,this.peerTitle=new N.Z({peerId:0})}update(e){const{peerTitle:t,appendTo:i}=this,s=e.groupCall,n=e.chatId.toPeerId(!0);s.title?(0,F.Z)(i,(0,B.Z)(s.title)):(t.options.peerId!==n&&(t.options.peerId=n,t.update()),t.element.parentElement!==i&&i.append(t.element))}}var sr=i(2820);function nr(e,t,i){const s=e+"-button",n=document.createElement("div");n.classList.add(s,"call-button","rp-overflow"),i.icon&&n.classList.add("tgico-"+i.icon),i.noRipple||(0,A.Z)(n),i.isDanger&&n.classList.add(s+"-red"),i.isConfirm&&n.classList.add(s+"-green"),i.callback&&(0,C.fc)(n,i.callback,{listenerSetter:t});let a=n;if(i.text){const e=document.createElement("div");e.classList.add(s+"-container","call-button-container");const t="string"==typeof i.text?(0,L.ag)(i.text):i.text;t.classList.add(s+"-text","call-button-text"),e.append(n,t),a=e}return a}var ar=i(3757);const or="movable-element",rr=or+"-resize-handler";class dr extends l.Z{constructor(e){super(!0),this.onResize=()=>{this.fixDimensions(),this.fixPosition(),this.setPosition()},(0,zn.Z)(this,e),this.top=this.left=this.width=this.height=0,this.element.classList.add(or),this.addResizeHandlers(),this.setSwipeHandler(),o.Z.addEventListener("resize",this.onResize)}destroyElements(){this.element.classList.remove(or),this.handlers&&this.handlers.forEach((e=>{e.remove()}))}destroy(){o.Z.removeEventListener("resize",this.onResize),this.swipeHandler.removeListeners()}addResizeHandlers(){this.handlers=["n","e","s","w","ne","se","sw","nw"].map((e=>{const t=document.createElement("div");return t.dataset.side=e,t.classList.add(rr,rr+"-side-"+e),this.element.append(t),t}))}setSwipeHandler(){let e,t,i,s,n;const a=this.swipeHandler=new ar.Z({element:this.element,onSwipe:(a,o,r)=>{if(n){if(n.includes("e")||n.includes("w")){const e=n.includes("e")&&a>0||n.includes("w")&&a<0,s=Math.abs(a)*(e?1:-1),o=n.includes("e")?Ae.Z.width-t:i+t;this.width=Math.min(o,i+s)}if(n.includes("n")||n.includes("s")){const t=n.includes("s")&&o>0||n.includes("n")&&o<0,i=Math.abs(o)*(t?1:-1),a=n.includes("s")?Ae.Z.height-e:s+e;this.height=Math.min(a,s+i)}this.fixDimensions(),n.includes("w")&&(this.left=Math.min(t+i-this.minWidth,t+a)),n.includes("n")&&(this.top=Math.min(e+s-this.minHeight,e+o))}else this.top=e+o,this.left=t+a;this.fixPosition(),this.setPosition()},verifyTouchTarget:e=>{const t=e.target;if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return!1;const i=(0,be.Z)(t,rr);return i?(n=i.dataset.side,a.setCursor("")):(n=void 0,a.setCursor("grabbing")),!0},onFirstSwipe:()=>{e=this.top,t=this.left,i=this.width,s=this.height}})}setPositionToCenter(){this.top=Ae.Z.height/2-this.height/2,this.left=Ae.Z.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=(0,Vi.Z)(this.width,this.minWidth,Ae.Z.width),this.height=(0,Vi.Z)(this.height,this.minHeight,Ae.Z.height)}fixPosition(){this.top=(0,Vi.Z)(this.top,0,Ae.Z.height-this.height),this.left=(0,Vi.Z)(this.left,0,Ae.Z.width-this.width)}setPosition(){this.element.style.top=this.top+"px",this.element.style.left=this.left+"px",this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.width=this.width+"px",this.element.style.height=this.height+"px",this.dispatchEvent("resize")}get width(){return this._width}get height(){return this._height}set width(e){this._width=e}set height(e){this._height=e}get state(){const{top:e,left:t,width:i,height:s}=this;return{top:e,left:t,width:i,height:s}}set state(e){const{top:t,left:i,width:s,height:n}=e;this.top=t,this.left=i,this.width=s,this.height=n,this.onResize()}}var lr,cr=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i};class hr{constructor(e){lr.set(this,void 0),(0,zn.Z)(this,e),this.toggleMovable(!c.Z),this.listenerSetter.add(o.Z)("changeScreen",((e,t)=>{t!==o._.mobile&&e!==o._.mobile||this.toggleMovable(!c.Z)}))}destroy(){const e=this.movable;e&&e.destroy()}get movable(){return function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)}(this,lr,"f")}get state(){return this.movable?this.movable.state:this.previousState}set state(e){this.previousState=e}toggleMovable(e){let{movable:t}=this;if(e){if(t)return;t=cr(this,lr,new dr(this.movableOptions),"f"),t.state=this.previousState,void 0===this.previousState.top&&t.setPositionToCenter(),this.onResize&&this.listenerSetter.add(t)("resize",this.onResize)}else{if(!t)return;this.previousState=t.state,t.destroyElements(),t.destroy(),cr(this,lr,void 0,"f")}}}function ur(e,t,i){return t.forEach((t=>{t.classList.toggle(e,i)})),()=>ur(e,t,!i)}lr=new WeakMap;var pr,fr;function mr(e){const t=pr;return e.pFlags.muted_by_you?t.MUTED_FOR_ME:void 0!==e.raise_hand_rating?t.HAND:e.pFlags.muted?e.pFlags.can_self_unmute?t.MUTED:t.MUTED_BY_ADMIN:t.UNMUTED}!function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_FOR_ME=2]="MUTED_FOR_ME",e[e.MUTED_BY_ADMIN=3]="MUTED_BY_ADMIN",e[e.HAND=4]="HAND"}(pr||(pr={})),function(e){e[e.HAND=0]="HAND",e[e.MUTED=1]="MUTED",e[e.UNMUTED=2]="UNMUTED"}(fr||(fr={}));let gr={width:420,height:640};const vr="group-call";class br extends S.Z{constructor(){super("popup-group-call",{body:!0,withoutOverlay:!0,closable:!0,title:!0}),this.onFullScreenClick=()=>{(0,Ho.Dj)(this.container)},this.onToggleControls=e=>{this.container.classList.toggle("show-controls",e),this.buttonsContainer.classList.toggle("show-controls",e)},this.toggleDisability=ur.bind(null,"btn-disabled"),this.onVideoClick=()=>{const e=this.toggleDisability([this.btnVideo],!0);this.instance.toggleVideoSharing().finally((()=>{e()}))},this.onScreenClick=()=>{const e=this.toggleDisability([this.btnScreen],!0);this.instance.toggleScreenSharing().finally((()=>{e()}))},this.onMuteClick=()=>{const e=this.instance.participant;e.pFlags.can_self_unmute?this.instance.toggleMuted():void 0===e.raise_hand_rating&&this.instance.changeRaiseHand(!0)},this.onLeaveClick=()=>{return e=this,t=void 0,s=function*(){const e=e=>{this.instance.hangUp(e)};(yield this.managers.appChatsManager.hasRights(this.instance.chatId,"manage_call"))?new As.Z("popup-end-video-chat",{titleLangKey:"VoiceChat.End.Title",descriptionLangKey:"VoiceChat.End.Text",checkboxes:[{text:"VoiceChat.End.Third"}],buttons:[{langKey:"VoiceChat.End.OK",callback:t=>{e(!!t.size)},isDanger:!0}]}).show():e(!1)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s},this.onFullScreenChange=()=>{this.toggleBigLayout();const e=(0,Ho.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,n=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==n&&(s.Z.checkAnimations2(e),yo.Z.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{var e;const t=(0,Ho.rB)(),i=null===(e=this.movablePanel)||void 0===e?void 0:e.movable,s=(t||!!(i&&i.width>=680))&&!!this.videosCount,n=this.container.classList.contains("is-big-layout");let a;s&&!n&&(a=Array.from(this.buttonsContainer.children),a.forEach((e=>{e.style.opacity="0"})),this.buttonsContainer.offsetLeft),this.container.classList.toggle("is-big-layout",s),this.btnInvite.classList.toggle("hide",s),this.btnShowColumn.classList.toggle("hide",!s),a&&a.forEach((e=>{e.style.opacity=""}))},this.toggleRightColumn=()=>{this.container.classList.toggle("is-right-column-shown")},this.videosCount=0,this.container.classList.add(vr,"night");const e=this.instance=ro.ZP.groupCall,{listenerSetter:t}=this;if(!x.IS_APPLE_MOBILE){const e=this.btnFullScreen=(0,Vn.Z)("fullscreen"),i=this.btnFullScreen2=(0,Vn.Z)("fullscreen "+vr+"-cfs"),s=this.btnExitFullScreen=(0,Vn.Z)("smallscreen");(0,C.fc)(e,this.onFullScreenClick,{listenerSetter:t}),(0,C.fc)(i,this.onFullScreenClick,{listenerSetter:t}),(0,C.fc)(s,(()=>{(0,Ho.C8)()}),{listenerSetter:t}),(0,Ho.Ms)(this.container,this.onFullScreenChange,t)}this.btnInvite=(0,Vn.Z)("adduser");const i=this.btnShowColumn=(0,Vn.Z)("rightpanel "+vr+"-only-big");(0,C.fc)(i,this.toggleRightColumn,{listenerSetter:t});const n=document.createElement("div");n.classList.add(vr+"-header-info"),this.title.classList.add(vr+"-header-title");const a=document.createElement("div");a.classList.add(vr+"-header-subtitle"),n.append(this.title,a),this.header.classList.add(vr+"-header"),this.header.append(...[this.btnExitFullScreen,n,this.btnFullScreen,i].filter(Boolean));const o=this.header.cloneNode(!1),r=n.cloneNode(!1),l=this.title.cloneNode(!1);r.append(l);const c=(0,Vn.Z)("rightpanel");o.append(...[c,r,this.btnFullScreen2].filter(Boolean)),(0,C.fc)(c,this.toggleRightColumn,{listenerSetter:t}),this.body.prepend(o);const h=new T.ZP(void 0);h.container.classList.add("group-call-big-video-container"),this.container.append(h.container),this.groupCallTitle=new ir(this.title),this.groupCallDescription=new tr(a),this.groupCallBodyHeaderDescription=new tr(l),this.constructButtons(),this.groupCallParticipantsVideo=new Yo({appendTo:h.container,instance:e,listenerSetter:t,displayPinned:!0,onLengthChange:e=>{this.videosCount=e,this.toggleBigLayout()},managers:this.managers}),this.groupCallParticipants=new er({appendTo:this.body,instance:e,listenerSetter:t,managers:this.managers}),this.movablePanel=new hr({listenerSetter:t,movableOptions:{minWidth:400,minHeight:480,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,be.Z)(t,"chatlist")||(0,be.Z)(t,"group-call-button")||(0,be.Z)(t,"btn-icon")||(0,be.Z)(t,"group-call-participants-video-container")||(0,Ho.rB)())}},onResize:()=>this.toggleBigLayout(),previousState:gr}),t.add(e)("state",(()=>{this.updateInstance()})),t.add(d.Z)("group_call_update",(e=>{var t;(null===(t=this.instance)||void 0===t?void 0:t.id)===e.id&&this.updateInstance()})),t.add(e)("pinned",(()=>{this.setHasPinned()})),t.add(this.groupCallParticipantsVideo)("toggleControls",this.onToggleControls),this.addEventListener("close",(()=>{const{movablePanel:e}=this;gr=e.state,this.groupCallParticipantsVideo.destroy(),this.groupCallParticipants.destroy(),this.groupCallMicrophoneIcon.destroy(),e.destroy()})),this.toggleRightColumn(),this.onFullScreenChange(),this.updateInstance()}constructButtons(){const e=this.buttonsContainer=document.createElement("div");e.classList.add(vr+"-buttons");const t=nr.bind(null,vr,this.listenerSetter),i=this.btnVideo=t({callback:this.onVideoClick,icon:"videocamera_filled"}),s=this.btnScreen=t({callback:this.onScreenClick,icon:"sharescreen_filled"});s.classList.toggle("hide",!sr.Z);const n=t({noRipple:!0,callback:(0,Qa.Z)(this.onMuteClick,600,!0)});n.classList.add(vr+"-microphone-button");const a=this.groupCallMicrophoneIcon=new Uo;n.append(a.container);const o=t({icon:"settings_filled"});o.classList.add("btn-disabled"),o.classList.toggle("hide",!sr.Z);const r=t({isDanger:!0,callback:this.onLeaveClick,icon:"close"});e.append(i,s,n,o,r),this.container.append(e)}getContainer(){return this.container}setHasPinned(){this.container.classList.toggle("has-pinned",!!this.instance.pinnedSource)}updateInstance(){if(this.instance.state===xo.Z.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,Ho.C8)(),void this.hide();const{participant:e,groupCall:t}=this.instance;if(!e)return;this.setTitle(),this.setDescription(),this.setHasPinned();const i=function(e,t){const i=fr;return t.pFlags.can_self_unmute?t.pFlags.muted?i.MUTED:i.UNMUTED:i.HAND}(0,e);this.container.dataset.micState=i===fr.HAND?"hand":i===fr.MUTED?"muted":"unmuted",this.groupCallMicrophoneIcon.setState(i)}setTitle(){this.groupCallTitle.update(this.instance)}setDescription(){this.groupCallDescription.update(this.instance),this.groupCallBodyHeaderDescription.update(this.instance)}}var yr=i(9078),wr=i(3335);class Sr{constructor(e){this.appendTo=e,this.container=document.createElement("div"),this.container.classList.add("call-description")}detach(){void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0),this.container.remove(),this.state=void 0}update(e){const{connectionState:t}=e;if(this.state===t)return;let i;if(this.state=t,t===wr.Z.CONNECTED){i=document.createElement("span"),i.classList.add("call-description-duration");const t=()=>{i.innerText=(0,is.Z)(e.duration,!0)};this.interval=window.setInterval(t,1e3),t()}else{let s;switch(t){case wr.Z.PENDING:s=e.isOutgoing?"Call.StatusRinging":"Call.StatusCalling";break;case wr.Z.REQUESTING:s="Call.StatusRequesting";break;case wr.Z.EXCHANGING_KEYS:s="VoipExchangingKeys";break;case wr.Z.CLOSED:s=void 0!==e.connectedAt?"Call.StatusEnded":"Call.StatusFailed";break;default:s="Call.StatusConnecting"}i=(0,L.ag)(s),void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0)}this.container.classList.toggle("has-duration",t===wr.Z.CONNECTED),(0,H.Z)(this.container,i),this.container.parentElement||this.appendTo.append(this.container)}}class Cr extends Oo{constructor(e,t){super({width:36,height:36,getPart:e=>this.getItem().getPart(e?"unmute":"mute"),getColor:e?e=>e?[255,255,255]:[158,158,158]:void 0,skipAnimation:t}),this.add({name:"voice_mini",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:171,name:"unmuted-to-hand"}]})}}const Lr="call",Er={width:400,height:580};let Ir=Object.assign({},Er);class Mr extends S.Z{constructor(e){super("popup-call",{withoutOverlay:!0,closable:!0}),this.instance=e,this.onFullScreenClick=()=>{(0,Ho.Dj)(this.container)},this.onFullScreenChange=()=>{const e=(0,Ho.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,n=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==n&&(s.Z.checkAnimations(e),yo.Z.setThemeColor(e?"#000000":void 0),this.resizeVideoContainers())},this.videoContainers={};const{container:t,listenerSetter:i}=this;t.classList.add(Lr,"night");const n=document.createElement("div");n.classList.add(Lr+"-avatar");const a=this.peerId=this.instance.interlocutorUserId.toPeerId(),o=new f.Z;o.classList.add("avatar-full"),o.updateWithOptions({isBig:!0,peerId:a}),n.append(o);const r=new N.Z({peerId:a}).element;r.classList.add(Lr+"-title");const d=document.createElement("div");d.classList.add(Lr+"-subtitle"),this.description=new Sr(d);const l=this.emojisSubtitle=document.createElement("div");l.classList.add(Lr+"-emojis"),t.append(n,r,d),x.IS_MOBILE?this.header.append(l):(this.btnFullScreen=(0,Vn.Z)("fullscreen"),this.btnExitFullScreen=(0,Vn.Z)("smallscreen hide"),(0,C.fc)(this.btnFullScreen,this.onFullScreenClick,{listenerSetter:i}),(0,C.fc)(this.btnExitFullScreen,(()=>(0,Ho.C8)()),{listenerSetter:i}),(0,Ho.Ms)(this.container,this.onFullScreenChange,i),this.header.prepend(this.btnExitFullScreen),this.header.append(this.btnFullScreen),t.append(l)),this.partyStates=document.createElement("div"),this.partyStates.classList.add(Lr+"-party-states"),this.partyMutedState=document.createElement("div"),this.partyMutedState.classList.add(Lr+"-party-state");const c=(0,L.ag)("VoipUserMicrophoneIsOff",[new N.Z({peerId:a,onlyFirstName:!0,limitSymbols:18}).element]);c.classList.add(Lr+"-party-state-text");const h=new Cr(!1,!0);h.setState(!1,!1),this.partyMutedState.append(h.container,c),this.partyStates.append(this.partyMutedState),this.container.append(this.partyStates),this.makeButton=nr.bind(null,Lr,this.listenerSetter),this.constructFirstButtons(),this.constructSecondButtons(),i.add(e)("state",(()=>{this.updateInstance()})),i.add(e)("mediaState",(()=>{this.updateInstance()})),this.movablePanel=new hr({listenerSetter:i,movableOptions:{minWidth:400,minHeight:580,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,be.Z)(t,"call-button")||(0,be.Z)(t,"btn-icon")||(0,Ho.rB)())}},previousState:this.instance.wasTryingToJoin||this.instance.isOutgoing?Ir:Object.assign({},Er)});const u=this.movablePanel.movable;u&&this.listenerSetter.add(u)("resize",(()=>{this.resizeVideoContainers()}));const p=this.controlsHover=new Wo.Z;p.setup({element:this.container,listenerSetter:this.listenerSetter,showOnLeaveToClassName:"call-buttons"}),p.showControls(!1),this.addEventListener("close",(()=>{const{movablePanel:e}=this;Ir=e.state,this.microphoneIcon.destroy(),e.destroy()})),this.updateInstance()}getCallInstance(){return this.instance}constructFirstButtons(){const e=this.firstButtonsRow=document.createElement("div");e.classList.add(Lr+"-buttons","is-first");const t=ur.bind(null,"btn-disabled"),i=this.btnVideo=this.makeButton({text:"Call.Camera",icon:"videocamera_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleVideoSharing().finally(e)}}),s=this.btnScreen=this.makeButton({text:"Call.Screen",icon:"sharescreen_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleScreenSharing().finally(e)}});sr.Z||(s.classList.add("hide"),this.container.classList.add("no-screen")),this.muteI18nElement=new L.ZP.IntlElement({key:"Call.Mute"});const n=this.btnMute=this.makeButton({text:this.muteI18nElement.element,callback:()=>{this.instance.toggleMuted()}}),a=this.microphoneIcon=new Cr(!0,!0);n.firstElementChild.append(a.container),e.append(i,s,n),this.container.append(e)}constructSecondButtons(){const e=this.secondButtonsRow=document.createElement("div");e.classList.add(Lr+"-buttons","is-second"),this.declineI18nElement=new L.ZP.IntlElement({key:"Call.Decline"});const t=this.btnDecline=this.makeButton({text:this.declineI18nElement.element,icon:"endcall_filled",callback:()=>{this.instance.hangUp("phoneCallDiscardReasonHangup")},isDanger:!0}),i=this.btnAccept=this.makeButton({text:"Call.Accept",icon:"phone_filled",callback:()=>{this.instance.acceptCall()},isConfirm:!0});e.append(t,i),this.container.append(e)}createVideoContainer(e){const t=Lr+"-video",i=document.createElement("div");i.classList.add(t+"-container"),e.classList.add(t),e.paused&&e.play(),(0,C.fc)(i,(()=>{if(!i.classList.contains("small"))return;const e=Object.values(this.videoContainers).find((e=>!e.classList.contains("small")));e.classList.add("small"),e.style.cssText=i.style.cssText,i.classList.remove("small"),i.style.cssText="",this.resizeVideoContainers()}));const s=$o(e);return s.classList.add(t+"-blur"),i.append(s,e),i}updateInstance(){const{instance:e}=this,{connectionState:t}=e;if(t===wr.Z.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,Ho.C8)(),this.btnVideo.classList.add("disabled"),void this.hide();const i=!e.isOutgoing&&t===wr.Z.PENDING;this.declineI18nElement.compareAndUpdate({key:t===wr.Z.PENDING?"Call.Decline":"Call.End"}),this.btnAccept.classList.toggle("disable",!i),this.btnAccept.classList.toggle("hide-me",!i),this.container.classList.toggle("two-button-rows",i);const s=e.isMuted,n=()=>{this.btnMute.firstElementChild.classList.toggle("active",s)},a=this.microphoneIcon.getItem().player;this.microphoneIcon.setState(!s,!s,n),a||n(),this.muteI18nElement.compareAndUpdate({key:s?"VoipUnmute":"Call.Mute"});const o=e.isSharingVideo;this.btnVideo.firstElementChild.classList.toggle("active",o);const r=e.isSharingScreen;this.btnScreen.firstElementChild.classList.toggle("active",r);const d=e.getMediaState("output");(0,De.Z)({element:this.partyMutedState,className:"is-visible",forwards:!!(null==d?void 0:d.muted),duration:300});const l=this.videoContainers,c=Object.assign({},l);["input","output"].forEach((t=>{const i=e.getMediaState(t),s=e.getVideoElement(t),n=!!(s&&s.videoWidth&&s.videoHeight);!s||n||s.dataset.hasPromise||(s.dataset.hasPromise="1",(0,Sn.Z)(s).then((()=>{delete s.dataset.hasPromise,this.updateInstance()})));const a=!!s&&n&&!(!i||"active"!==i.videoState&&"active"!==i.screencastState);let o=l[t];a&&s&&!o&&(o=l[t]=this.createVideoContainer(s),this.container.append(o)),!a&&o&&(o.remove(),delete l[t])}));{const e=l.input,t=l.output;Object.keys(c).length!==Object.keys(l).length&&e&&e.classList.toggle("small",!!t),t&&!e&&t.classList.remove("small")}this.resizeVideoContainers(),this.container.classList.toggle("no-video",!Object.keys(l).length),!this.emojisSubtitle.textContent&&t{(0,H.Z)(this.emojisSubtitle,(0,B.Z)(e.join("")))})),this.setDescription()}resizeVideoContainers(){Object.values(this.videoContainers).forEach((e=>{if(e.classList.contains("small")){const t=e.querySelector("video"),i=this.movablePanel.state,s=240,n=240,a=t.videoHeight>t.videoWidth,o=a?n:s,r=1/3*((0,Ho.rB)()?65535:a?i.height:i.width),d=a?t.videoWidth/t.videoHeight:1,l=a?1:t.videoHeight/t.videoWidth;e.style.width=r*d+"px",e.style.height=r*l+"px",e.style.maxWidth=o*d+"px",e.style.maxHeight=o*l+"px"}else e.style.cssText=""}))}setDescription(){this.description.update(this.instance)}}var Pr=i(2069),Zr=i(9585),Tr=i(2493);const kr="topbar-call";class xr{constructor(e){this.managers=e,this.onState=()=>{this.updateInstance(this.instance)};const t=this.listenerSetter=new ce.Z;t.add(Tr.Z)("instance",(({instance:e})=>{this.instance||this.updateInstance(e)})),t.add(Tr.Z)("accepting",(e=>{this.instance!==e&&this.updateInstance(e)})),t.add(ro.ZP)("instance",(e=>{this.updateInstance(e)})),t.add(d.Z)("group_call_update",(e=>{const t=ro.ZP.groupCall;(null==t?void 0:t.id)===e.id&&this.updateInstance(t)})),t.add(Zr.Z.ANALYSER_LISTENER)("amplitude",(({amplitudes:e,type:t})=>{const{weave:i}=this;if(!e.length||!i)return;let s=0;for(let t=0;ts?n:s}i.setAmplitude(s)}))}clearCurrentInstance(){this.instance&&(this.center.textContent="",this.currentDescription&&(this.currentDescription.detach(),this.currentDescription=void 0),this.instance=void 0,this.instanceListenerSetter.removeAll())}updateInstance(e){this.construct&&(this.construct(),this.construct=void 0);const t=this.instance!==e;t&&(this.clearCurrentInstance(),this.instance=e,this.instanceListenerSetter=new ce.Z,this.instanceListenerSetter.add(e)("state",this.onState),e instanceof yr.Z?this.currentDescription=this.groupCallDescription:(this.currentDescription=this.callDescription,this.instanceListenerSetter.add(e)("muted",this.onState)),this.container.classList.toggle("is-call",!(e instanceof yr.Z)));const i=this.instance.isMuted,s=e instanceof yr.Z?e.state:function(e,t){switch(e){case wr.Z.CLOSING:case wr.Z.CLOSED:return xo.Z.CLOSED;case wr.Z.CONNECTED:return t?xo.Z.MUTED:xo.Z.UNMUTED;default:return xo.Z.CONNECTING}}(e.connectionState,i),{weave:n}=this;n.componentDidMount();const a=s===xo.Z.CLOSED;(!document.body.classList.contains("is-calling")||t||a)&&(a&&n.setAmplitude(0),(0,De.Z)({element:document.body,className:"is-calling",forwards:!a,duration:250,onTransitionEnd:a?()=>{n.componentWillUnmount(),this.clearCurrentInstance()}:void 0})),a||(n.setCurrentState(s,!0),this.setTitle(e),this.setDescription(e),this.groupCallMicrophoneIconMini.setState(!i))}setDescription(e){return this.currentDescription.update(e)}setTitle(e){if(e instanceof yr.Z)return this.groupCallTitle.update(e);(0,H.Z)(this.center,new N.Z({peerId:e.interlocutorUserId.toPeerId()}).element)}construct(){const{listenerSetter:e}=this,t=this.container=document.createElement("div");t.classList.add("sidebar-header",kr+"-container");const i=document.createElement("div");i.classList.add(kr+"-left");const s=this.groupCallMicrophoneIconMini=new Cr,n=(0,Vn.Z)();n.append(s.container),i.append(n);const a=(0,Qa.Z)((()=>{this.instance.toggleMuted()}),600,!0);(0,C.fc)(n,(e=>{(0,Le.Z)(e),a()}),{listenerSetter:e});const o=this.center=document.createElement("div");o.classList.add(kr+"-center"),this.groupCallTitle=new ir(o),this.groupCallDescription=new tr(i),this.callDescription=new Sr(i);const r=document.createElement("div");r.classList.add(kr+"-right");const d=(0,Vn.Z)("endcall_filled");r.append(d),(0,C.fc)(d,(e=>{(0,Le.Z)(e);const{instance:t}=this;t&&(t instanceof yr.Z?t.hangUp():t.hangUp("phoneCallDiscardReasonHangup"))}),{listenerSetter:e}),(0,C.fc)(t,(()=>{if(this.instance instanceof yr.Z){if(S.Z.getPopups(br).length)return;(new br).show()}else if(this.instance instanceof Pr.Z){if(S.Z.getPopups(Mr).find((e=>e.getCallInstance()===this.instance)))return;new Mr(this.instance).show()}}),{listenerSetter:e}),t.append(i,o,r);const l=this.weave=new Fo,c=l.render(kr+"-weave");t.prepend(c),document.getElementById("column-center").prepend(t),l.componentDidMount()}}var Ar=i(2614),_r=i(6009),Fr=i(493),Dr=i(2131),Rr=i(6702),Br=i(7746),Nr=i(2491),Or=i(1722),Ur=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Hr=new class{constructor(){this.notificationsShown={},this.notificationIndex=0,this.notificationsCount=0,this.soundsPlayed={},this.vibrateSupport=Dr.Z,this.faviconElements=Array.from(document.head.querySelectorAll('link[rel="icon"], link[rel="alternate icon"]')),this.titleBackup=document.title,this.titleChanged=!1,this.stopped=!1,this.settings={},this.pushInited=!1,this.updateLocalSettings=()=>{const e=["notify_nodesktop","notify_volume","notify_novibrate","notify_nopreview","notify_nopush"].map((()=>{}));Promise.all(e).then((e=>{if(this.settings.nodesktop=e[0],this.settings.volume=void 0===e[1]?.5:e[1],this.settings.novibrate=e[2],this.settings.nopreview=e[3],this.settings.nopush=e[4],this.pushInited){const e=!this.settings.nopush&&!this.settings.nodesktop&&Rr.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?Rr.default.subscribe():Rr.default.unsubscribe())}Rr.default.setSettings(this.settings)})),Cn.Z.getState().then((e=>{this.settings.nosound=!e.settings.notifications.sound}))},this.requestPermission=()=>{Notification.requestPermission(),window.removeEventListener("click",this.requestPermission)}}construct(e){this.managers=e,navigator.vibrate=navigator.vibrate||navigator.mozVibrate||navigator.webkitVibrate,this.setAppBadge=navigator.setAppBadge&&navigator.setAppBadge.bind(navigator),this.setAppBadge&&this.setAppBadge(0),this.notificationsUiSupport="Notification"in window||"mozNotification"in navigator,this.notifySoundEl=document.createElement("div"),this.notifySoundEl.id="notify-sound",document.body.append(this.notifySoundEl),this.topMessagesDeferred=(0,me.Z)(),To.Z.addEventListener("deactivated",(()=>{this.stop()})),To.Z.addEventListener("activated",(()=>{this.stopped&&this.start()})),St.Z.addEventListener("change",(e=>{this.stopped||(e||this.clear(),this.toggleToggler())})),d.Z.addEventListener("notification_reset",(e=>{this.soundReset(e)})),d.Z.addEventListener("notification_cancel",(e=>{this.cancel(e)})),this.setAppBadge&&d.Z.addEventListener("folder_unread",(e=>{0===e.id&&this.setAppBadge(e.unreadUnmutedPeerIds.size)})),Rr.default.addEventListener("push_init",(e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):Rr.default.subscribe()})),Rr.default.addEventListener("push_subscribe",(e=>{this.registerDevice(e)})),Rr.default.addEventListener("push_unsubscribe",(e=>{this.unregisterDevice(e)})),d.Z.addEventListener("dialogs_multiupdate",(()=>{this.topMessagesDeferred.resolve()}),{once:!0}),Rr.default.addEventListener("push_notification_click",(e=>{if("push_settings"===e.action)return;if("mute1d"===e.action)return void this.managers.apiManager.invokeApi("account.updateDeviceLocked",{period:86400}).then((()=>{}));const t=e.custom&&e.custom.peerId.toPeerId();console.log("click",e,t),t&&this.topMessagesDeferred.then((()=>Ur(this,void 0,void 0,(function*(){e.custom.channel_id&&!(yield this.managers.appChatsManager.hasChat(e.custom.channel_id))||t.isUser()&&!(yield this.managers.appUsersManager.hasUser(t))||td.setInnerPeer({peerId:t,lastMsgId:(0,wt.Z)(+e.custom.msg_id)})}))))}))}buildNotification({message:e,fwdCount:t,peerReaction:i,peerTypeNotifySettings:s}){return Ur(this,void 0,void 0,(function*(){const n=e.peerId,a=n.isAnyChat(),o={},[r,d=!1]=yield Promise.all([this.managers.appPeersManager.getPeerString(n),a&&this.managers.appPeersManager.isForum(n)]);let l,c=!1;if(s.show_previews)if("message"===e._&&e.fwd_from&&t>1)l=L.ZP.format("Notifications.Forwarded",!0,[t]);else{l=yield(0,V.Z)({message:e,plain:!0});const t=null==i?void 0:i.reaction;if("reactionEmoji"===(null==t?void 0:t._)){const e="Notification.Contact.Reacted",i=[(0,Br.Z)(t.emoticon),l];l=L.ZP.format(e,!0,i)}else c=!0}else l=L.ZP.format("Notifications.New",!0);i&&(o.noIncrement=!0,o.silent=!0);const h=d?(0,b.Z)(e,d):void 0,u=i?(0,R.Z)(i.peer_id):e.fromId;if(o.title=yield(0,Fr.Z)({peerId:n,plainText:!0,managers:this.managers,threadId:h}),d){const t=yield(0,Fr.Z)({peerId:n,plainText:!0,managers:this.managers});o.title+=` (${t})`,c&&u!==e.peerId&&(l=(yield(0,Fr.Z)({peerId:u,plainText:!0,managers:this.managers}))+": "+l)}else a&&u!==e.peerId&&(o.title=(yield(0,Fr.Z)({peerId:u,plainText:!0,managers:this.managers}))+" @ "+o.title);o.title=(0,Nr.Z)(o.title),o.onclick=()=>{td.setInnerPeer({peerId:n,lastMsgId:e.mid,threadId:h})},o.message=l,o.key="msg"+e.mid,o.tag=r,o.silent=!0;const p=yield this.managers.appPeersManager.getPeerPhoto(n);p?this.managers.appAvatarsManager.loadAvatar(n,p,"photo_small").then((t=>{(e.pFlags.unread||i)&&(o.image=t,this.notify(o))})):this.notify(o)}))}toggleToggler(e=St.Z.isIdle){if(x.IS_MOBILE)return;const t=e=>{this.titleChanged=!1,document.title=this.titleBackup,this.setFavicon()};window.clearInterval(this.titleInterval),this.titleInterval=0,e?this.titleInterval=window.setInterval((()=>{const e=this.notificationsCount;if(e)if(this.titleChanged)t();else{this.titleChanged=!0,document.title=L.ZP.format("Notifications.Count",!0,[e]);const t=document.createElement("canvas");t.width=32*window.devicePixelRatio,t.height=t.width;const i=t.getContext("2d");i.beginPath(),i.arc(t.width/2,t.height/2,t.width/2,0,2*Math.PI,!1),i.fillStyle="#3390ec",i.fill();let s=24,n=""+e;e<10?s=22:e<100?s=20:(n="99+",s=16),s*=window.devicePixelRatio,i.font=`700 ${s}px ${kt.bt}`,i.textBaseline="middle",i.textAlign="center",i.fillStyle="white",i.fillText(n,t.width/2,.5625*t.height),this.setFavicon(t.toDataURL())}else this.toggleToggler(!1)}),1e3):t()}setFavicon(e){this.prevFavicon!==e&&(this.prevFavicon=e,this.faviconElements.forEach(((t,i,s)=>{const n=t.cloneNode();n.dataset.href||(n.dataset.href=n.href),null!=e||(e=n.dataset.href),n.href=e,t.replaceWith(s[i]=n)})))}notify(e){if(this.stopped)return;e.image||(e.image="assets/img/logo_filled_rounded.png"),e.noIncrement||++this.notificationsCount,this.titleInterval||this.toggleToggler();const t=++this.notificationIndex,i=e.key||"k"+t;this.notificationsShown[i]=!0;const s=(0,zt.Z)();if(this.settings.volume>0&&!this.settings.nosound&&(this.testSound(this.settings.volume),this.soundsPlayed[e.tag]=s),!this.notificationsUiSupport||"Notification"in window&&"granted"!==Notification.permission)return!1;if(this.settings.nodesktop)return this.vibrateSupport&&!this.settings.novibrate?void navigator.vibrate([200,100,200]):void 0;let n;if("Notification"in window){try{if(e.tag)for(const t in this.notificationsShown){const i=this.notificationsShown[t];"boolean"!=typeof i&&i.tag===e.tag&&(i.hidden=!0)}n=new Notification(e.title,{icon:e.image||"",body:e.message||"",tag:e.tag||"",silent:e.silent||!1})}catch(e){return this.notificationsUiSupport=!1,void Rr.default.setLocalNotificationsDisabled()}n.onclick=()=>{n.close(),Or.Z.focus(),this.clear(),e.onclick&&e.onclick()},n.onclose=()=>{n.hidden||(delete this.notificationsShown[i],this.clear())},n.show&&n.show(),this.notificationsShown[i]=n,x.IS_MOBILE||setTimeout((()=>{this.hide(i)}),8e3)}}getLocalSettings(){return this.settings}hide(e){const t=this.notificationsShown[e];if(t&&"boolean"!=typeof t)try{t.close&&(t.hidden=!0,t.close())}catch(e){}}soundReset(e){delete this.soundsPlayed[e]}testSound(e){const t=(0,zt.Z)();if(this.nextSoundAt&&t\n \n `,this.notifySoundEl.append(s),s.addEventListener("ended",(()=>{s.remove()}),{once:!0})}cancel(e){const t=this.notificationsShown[e];if(t){this.notificationsCount>0&&--this.notificationsCount;try{"boolean"!=typeof t&&t.close&&(t.hidden=!0,t.close())}catch(e){}delete this.notificationsShown[e]}}clear(){for(const e in this.notificationsShown){const t=this.notificationsShown[e];try{"boolean"!=typeof t&&t.close&&t.close()}catch(e){}}this.notificationsShown={},this.notificationsCount=0,Rr.default.hidePushNotifications()}start(){if(this.updateLocalSettings(),d.Z.addEventListener("settings_updated",this.updateLocalSettings),Rr.default.start(),!this.notificationsUiSupport)return!1;"Notification"in window&&"granted"!==Notification.permission&&"denied"!==Notification.permission&&window.addEventListener("click",this.requestPermission);try{"onbeforeunload"in window&&window.addEventListener("beforeunload",this.clear)}catch(e){}}stop(){this.clear(),window.clearInterval(this.titleInterval),this.titleInterval=0,this.setFavicon(),this.stopped=!0}registerDevice(e){if(this.registeredDevice&&(0,go.Z)(this.registeredDevice,e))return!1;this.managers.apiManager.invokeApi("account.registerDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[],app_sandbox:!1,secret:new Uint8Array}).then((()=>{this.registeredDevice=e}),(e=>{e.handled=!0}))}unregisterDevice(e){if(!this.registeredDevice)return!1;this.managers.apiManager.invokeApi("account.unregisterDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[]}).then((()=>{this.registeredDevice=!1}),(e=>{e.handled=!0}))}};ge.GO&&(ge.GO.uiNotificationsManager=Hr);const zr=Hr;var jr=i(2423),Gr=i(236),Vr=i(5936),Kr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function Wr(e,t=!1){return Kr(this,void 0,void 0,(function*(){const i=[],s=(e,n)=>Kr(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise(((e,i)=>{t.readEntries((t=>Kr(this,void 0,void 0,(function*(){for(const e of t)yield s(e,n);e()}))))}))}else if(e)if(t)i.push(e.type);else{const t=n.getAsFile(),s=e instanceof File?e:e instanceof DataTransferItem?e.getAsFile():yield new Promise(((i,s)=>e.file(i,(e=>i(t)))));if(!s)return;i.push(s)}}));if(e instanceof DragEvent&&e.dataTransfer.files&&!e.dataTransfer.items)for(let s=0;s{!e.noCancelEvent&&(0,Le.Z)(null);let i,s,n=t.href;const a=new URL(n),o=a.host.match(/(.+?)\.t(?:elegram)?\.me/);o&&!m.BX.has(o[1])&&(a.pathname=o[1]+("/"===a.pathname?"":a.pathname),n=a.toString()),e.noPathnameParams||(i=new URL(n).pathname.split("/").slice(1)),e.noUriParams||(s=(0,$r.Z)(n));const r=e.callback({pathnameParams:i,uriParams:s},t);return void 0===r&&r}}var Qr,Yr=i(9439),Xr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};!function(e){e[e.CHATLIST=0]="CHATLIST",e[e.CHAT=1]="CHAT",e[e.PROFILE=2]="PROFILE"}(Qr||(Qr={}));class Jr extends l.Z{constructor(){super(...arguments),this.columnEl=document.getElementById("column-center"),this.offline=!1,this.updateStatusInterval=0,this.setPeerPromise=null,this.chats=[],this.cacheStorage=new Vr.Z("cachedFiles"),this.onHashChange=e=>{try{this.onHashChangeUnsafe(e)}catch(e){this.log.error("hash change error",e)}},this.onHashChangeUnsafe=e=>{const t=location.hash;e||Hn.Z.replaceState();const i=t.split("?"),s=(0,$r.Z)(t,i);if(this.log("hashchange",t,i[0],s),t)if(s.tgaddr)this.openUrl(s.tgaddr);else switch(i[0]){default:s.p=i[0].slice(1);case"#/im":{if(!Object.keys(s).length)break;const e=s.p,t=void 0!==s.post?(0,wt.Z)(+s.post):void 0;"@"===e[0]?this.openUsername({userName:e,lastMsgId:t}):this.setInnerPeer({peerId:t?e.toPeerId(!0):e.toPeerId(),lastMsgId:t})}}},this.setSettings=()=>{const{messagesTextSize:e}=d.Z.settings;this.customEmojiSize=(0,Qe.C)(e+4,e+4),document.documentElement.style.setProperty("--messages-text-size",e+"px"),this.customEmojiSize&&(document.querySelectorAll("middle-ellipsis-element").forEach((t=>{t.disconnectedCallback(),t.dataset.fontSize=""+e,t.title&&(t.textContent=t.title),t.connectedCallback()})),document.querySelectorAll(".chat custom-emoji-renderer-element").forEach((e=>{e.forceRenderAfterSize=!0}))),document.body.classList.toggle("animation-level-0",!d.Z.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",d.Z.settings.animationsEnabled),this.chatsSelectTabDebounced=(0,Te.Z)((()=>{var e;null===(e=this.chat.topbar.pinnedMessage)||void 0===e||e.setCorrectIndex(0),this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)}),d.Z.settings.animationsEnabled?250:0,!1,!0),Bs.Z.setLoop(d.Z.settings.stickers.loop)&&s.Z.checkAnimations2(!1);for(const e of this.chats)e.setAutoDownloadMedia();L.ZP.setTimeFormat(d.Z.settings.timeFormat),this.toggleChatGradientAnimation(this.chat)},this.onDocumentPaste=(e,t)=>Xr(this,void 0,void 0,(function*(){const i=_n();if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&(0,Le.Z)(e)}const s=yield Wr(e);if(((yield this.canDrag())||i)&&s.length){if(i)return void i.addFiles(s);const e=this.chat.input;e.willAttachType=t||(bn.Z.has(s[0].type)?"media":"document"),S.Z.createPopup(Fn,this.chat,s,e.willAttachType)}}))}get myId(){return d.Z.myId}get chat(){return this.chats[this.chats.length-1]}construct(e){this.managers=e;const{apiUpdatesManager:t}=e;t.attach(L.ZP.lastRequestedLangCode),wa.Z.construct(e),zr.construct(e),zr.start(),this.log=(0,r.kg)("IM",r.v9.Log|r.v9.Warn|r.v9.Debug|r.v9.Error),this.backgroundPromises={},Gr.h.settings.themes.forEach((e=>{const t=e.settings;if(!t)return;const{wallpaper:i}=t,s=i.slug;if(!s)return;const n="assets/img/"+s+".svg"+(x.IS_FIREFOX?"?1":"");this.backgroundPromises[s]=Promise.resolve(n)})),this.selectTab(Qr.CHATLIST),St.Z.addEventListener("change",(e=>{this.offline=e,this.updateStatus(),e?clearInterval(this.updateStatusInterval):this.updateStatusInterval=window.setInterval((()=>this.updateStatus()),5e4)})),this.chatsContainer=document.createElement("div"),this.chatsContainer.classList.add("chats-container","tabs-container"),this.chatsContainer.dataset.animation="navigation",this.emojiAnimationContainer=document.createElement("div"),this.emojiAnimationContainer.classList.add("emoji-animation-container"),this.appendEmojiAnimationContainer(o.Z.activeScreen),this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),Hn.Z.onHashChange=this.onHashChange,this.setSettings(),d.Z.addEventListener("settings_updated",this.setSettings);const i=e=>{document.body.classList.toggle("is-premium",e)};d.Z.addEventListener("premium_toggle",i),i(d.Z.premium),this.managers.rootScope.getPremium().then(i),(0,pe.ZP)((()=>{s.Z.setOnlyOnePlayableGroup("lock"),s.Z.checkAnimations2(!0)}),(()=>{s.Z.setOnlyOnePlayableGroup(),s.Z.checkAnimations2(!1)})),yo.Z.AppBackgroundTab=Yr.Z,x.IS_FIREFOX&&Cn.Z.oldVersion&&-1===(0,_r.Z)(Cn.Z.oldVersion,"1.4.3")?this.deleteFilesIterative((e=>"image/svg+xml"===e.headers.get("Content-Type"))).then((()=>{this.applyCurrentTheme()})):this.applyCurrentTheme(),o.Z.addEventListener("changeScreen",((e,t)=>{document.body.classList.contains(n.ir)&&document.body.classList.contains(a.HQ)&&a.ZP.toggleSidebar(!1),this.appendEmojiAnimationContainer(t)})),o.Z.addEventListener("resize",(()=>{const e=this.chatsContainer.getBoundingClientRect();bo.resizeInstances(e.width,e.height).then((()=>{}))})),this.addEventListener("peer_changing",(e=>{this.saveChatPosition(e)})),d.Z.addEventListener("theme_change",(()=>{this.applyCurrentTheme()})),d.Z.addEventListener("choosing_sticker",(e=>{this.setChoosingStickerTyping(!e)})),d.Z.addEventListener("peer_title_edit",(({peerId:e,threadId:t})=>{var i;(null===(i=this.chat)||void 0===i?void 0:i.peerId)!==e||t||void 0===this.tabId||this.overrideHash(e)})),d.Z.addEventListener("peer_typings",(({peerId:e,typings:t})=>{var i;const s=this.chat;if(!s||s.peerId!==e||Ct.Z.isOverlayActive||o.Z.activeScreen===o._.mobile&&this.tabId!==Qr.CHAT)return;const n=t.find((e=>"sendMessageEmojiInteraction"===e.action._));if("sendMessageEmojiInteraction"===(null===(i=null==n?void 0:n.action)||void 0===i?void 0:i._)){const t=n.action,i=s.bubbles.bubbles[(0,wt.Z)(n.action.msg_id)];if(i&&i.classList.contains("emoji-big")&&(0,ze.Z)(i,s.bubbles.scrollable.container)){const s=i.querySelector(".media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)");JSON.parse(t.interaction.data).a.forEach((e=>{setTimeout((()=>{(0,C.tH)(s)}),1e3*e.t)})),this.managers.appMessagesManager.setTyping(e,{_:"sendMessageEmojiInteractionSeen",emoticon:t.emoticon})}}}));const l=e=>{const t="version"===e,i=new S.Z("popup-instance-deactivated",{overlayClosable:!0}),s=document.createElement("div");s.classList.add("instance-deactivated-container"),i.container.replaceWith(s);const n=document.createElement("div");n.classList.add("header"),n.append((0,L.ag)(t?"Deactivated.Version.Title":"Deactivated.Title"));const a=document.createElement("div");a.classList.add("subtitle"),a.append((0,L.ag)(t?"Deactivated.Version.Subtitle":"Deactivated.Subtitle")),s.append(n,a),document.body.classList.add("deactivated");const o=t?()=>{Or.Z.reload()}:()=>{document.body.classList.add("deactivated-backwards"),To.Z.activateInstance(),setTimeout((()=>{document.body.classList.remove("deactivated","deactivated-backwards")}),333)};i.addEventListener("close",o),i.show()};To.Z.addEventListener("deactivated",l),To.Z.deactivatedReason&&l(To.Z.deactivatedReason),this.addEventListener("chat_changing",(({to:e})=>{this.toggleChatGradientAnimation(e)})),d.Z.addEventListener("service_notification",(e=>{(0,bi.Z)({button:{langKey:"OK",isCancel:!0},description:(0,mt.ZP)(e.message)})})),d.Z.addEventListener("payment_sent",(({peerId:e,mid:t,receiptMessage:i})=>Xr(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageByPeer(e,t);if(!s)return;const n=i.action;(0,we.bC)({langPackKey:"PaymentInfoHint",langPackArguments:[(0,Zt.Z)(n.total_amount,n.currency),(0,B.Z)(s.media.title)]})})))),window.onSpoilerClick=e=>{const t=(0,be.Z)(e.target,"spoiler"),i=(0,be.Z)(t,"spoilers-container")||t.parentElement,s="is-spoiler-visible",n=i.classList.contains(s);n||((0,Le.Z)(e),"click"!==C.pf&&window.addEventListener("click",Le.Z,{capture:!0,once:!0}));const a=n?0:2;a&&i.classList.add("will-change");const o=i.dataset.spoilerTimeout;null!==o&&(clearTimeout(+o),delete i.dataset.spoilerTimeout),(0,De.Z)({element:i,className:s,forwards:!0,duration:200,onTransitionEnd:()=>{i.dataset.spoilerTimeout=""+window.setTimeout((()=>{(0,De.Z)({element:i,className:s,forwards:!1,duration:200,onTransitionEnd:()=>{i.classList.remove("will-change"),delete i.dataset.spoilerTimeout}})}),5e3)},useRafs:a})},d.Z.addEventListener("sticker_updated",(({type:e,faved:t})=>{"faved"===e?(0,we.bC)({langPackKey:t?"AddedToFavorites":"RemovedFromFavorites"}):t||(0,we.bC)({langPackKey:"RemovedFromRecent"})})),Cn.Z.addEventListener("notificationBuild",(e=>Xr(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.isForum(e.message.peerId),i=(0,b.Z)(e.message,t);(this.chat.peerId!==e.message.peerId||this.chat.threadId!==i||St.Z.isIdle)&&zr.buildNotification(e)})))),this.addEventListener("peer_changed",(({peerId:e})=>Xr(this,void 0,void 0,(function*(){document.body.classList.toggle("has-chat",!!e),this.emojiAnimationContainer.textContent="",this.overrideHash(e),Cn.Z.updateTabState("chatPeerIds",this.chats.map((e=>e.peerId)).filter(Boolean))})))),Po.Z.setToCache("chatPositions",{}),(Ue.Z||no.Z)&&(this.topbarCall=new xr(e)),Ue.Z&&(Tr.Z.addEventListener("instance",(({instance:e})=>{const t=new Mr(e);e.addEventListener("acceptCallOverride",(()=>this.discardCurrentCall(e.interlocutorUserId.toPeerId(),void 0,e).then((()=>(Tr.Z.dispatchEvent("accepting",e),!0))).catch((()=>!1)))),t.addEventListener("close",(()=>{const t=Tr.Z.currentCall;t&&t!==e&&!e.wasTryingToJoin&&e.hangUp("phoneCallDiscardReasonBusy")}),{once:!0}),t.show()})),Tr.Z.addEventListener("incompatible",(e=>Xr(this,void 0,void 0,(function*(){(0,we.bC)({langPackKey:"VoipPeerIncompatible",langPackArguments:[yield(0,Kt.Z)({peerId:e.toPeerId()})]})}))))),To.Z.activateInstance();const c=()=>{ko.default.setAuthorized(!0)};setInterval(c,_.s2),c(),qr({name:"showMaskedAlert",callback:(e,t)=>{const i=t.href,s=t.cloneNode(!0);s.className="anchor-url",s.innerText=i,s.removeAttribute("onclick"),new As.Z("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[s],buttons:[{langKey:"Open",callback:()=>{s.click()}}]}).show()}}),qr({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:i}=e;this.managers.appMessagesManager.sendText(this.chat.peerId,"/"+t+(i?"@"+i:""))}}),qr({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),[["addstickers",xe.STICKER_SET],["addemoji",xe.EMOJI_SET]].forEach((([e,t])=>{qr({name:e,callback:({pathnameParams:e})=>{if(!e[1])return;const i={_:t,set:e[1]};this.processInternalLink(i)}}),qr({name:e,protocol:"tg",callback:({uriParams:e})=>{const i=this.makeLink(t,e);this.processInternalLink(i)}})})),qr({name:"invoice",callback:({pathnameParams:e})=>{const t={_:xe.INVOICE,slug:e.length>1?e[1]:e[0].slice(1)};this.processInternalLink(t)}}),qr({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:xe.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),no.Z&&qr({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(xe.VOICE_CHAT,e);this.processInternalLink(t)}}),qr({name:"im",callback:({pathnameParams:e,uriParams:t},i)=>Xr(this,void 0,void 0,(function*(){let s;if(jr.kO.test(e[0]))s={_:xe.USER_PHONE_NUMBER,phone:e[0].slice(1)};else if("c"===e[0]){e.shift();const n="thread"in t?t.thread:e[2]&&e[1];s={_:xe.PRIVATE_POST,channel:e[0],post:e[2]||e[1],thread:n,comment:t.comment,stack:this.getStackFromElement(i)}}else{const n="thread"in t?t.thread:e[2]&&e[1];s={_:xe.MESSAGE,domain:e[0],post:e[2]||e[1],thread:n,comment:t.comment,start:"start"in t?t.start:void 0,stack:this.getStackFromElement(i)}}this.processInternalLink(s)}))}),qr({name:"resolve",protocol:"tg",callback:({uriParams:e},t)=>{let i;e.phone?i=this.makeLink(xe.USER_PHONE_NUMBER,e):"telegrampassport"===e.domain||(i=this.makeLink(xe.MESSAGE,Object.assign(Object.assign({},e),{stack:this.getStackFromElement(t)}))),this.processInternalLink(i)}}),qr({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(xe.PRIVATE_POST,e);this.processInternalLink(t)}}),qr({name:"invoice",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(xe.INVOICE,e);this.processInternalLink(t)}}),["joinchat","join"].forEach((e=>{qr({name:e,protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(xe.JOIN_CHAT,e);this.processInternalLink(t)}})})),this.onHashChange(!0),this.attachKeydownListener(),this.handleAutologinDomains(),this.checkForShare()}checkForShare(){const e=Cn.Z.share;e&&(Cn.Z.share=void 0,new M.Z(void 0,(t=>Xr(this,void 0,void 0,(function*(){var i;if(yield this.setPeer({peerId:t}),null===(i=e.files)||void 0===i?void 0:i.length){const t=e.files.some((e=>bn.Z.has(e.type)));new Fn(this.chat,e.files,t?"media":"document")}else this.managers.appMessagesManager.sendText(t,e.text)})))))}handleUrlAuth(e){const{peerId:t,mid:i,buttonId:s,url:n}=e,a=e=>{window.open(e,"_blank")},o=e=>Xr(this,void 0,void 0,(function*(){if("urlAuthResultRequest"===e._){const r=document.createElement("b");r.append(e.domain);const l=yield(0,Kt.Z)({peerId:d.Z.myId}),c=yield(0,Kt.Z)({peerId:e.bot.id.toPeerId()}),h={text:"OpenUrlOption1",textArgs:[r.cloneNode(!0),l],checked:!0},u=e.pFlags.request_write_access?{text:"OpenUrlOption2",textArgs:[c],checked:!0}:void 0,p=[h,u],f=(0,bi.Z)({titleLangKey:"OpenUrlTitle",button:{langKey:"Open"},descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[r],checkboxes:p.filter(Boolean)});u&&h.checkboxField.input.addEventListener("change",(()=>{const e=!h.checkboxField.checked;u.checkboxField.toggleDisability(e),e&&(u.checkboxField.checked=!1)}));const[m,g]=yield f;if(!m)return void a(n);const v=yield this.managers.appSeamlessLoginManager.acceptUrlAuth(n,t,i,s,g);return o(v)}"urlAuthResultAccepted"===e._?(e=>{a(e.url)})(e):a(n)}));return this.managers.appSeamlessLoginManager.requestUrlAuth(n,t,i,s).then((e=>{o(e)}))}handleAutologinDomains(){let e;d.Z.addEventListener("app_config",(t=>{e=t}));const t=t=>{var i,s;const n=new URL(t.href);if(e.url_auth_domains.includes(n.hostname))return this.handleUrlAuth({url:t.href}),void(0,Le.Z)();if(!e.autologin_token||!e.autologin_domains)return;const a=null!==(i=(s=t.dataset).originalUrl)&&void 0!==i?i:s.originalUrl=t.href;e.autologin_domains.includes(n.hostname)&&(n.searchParams.set("autologin_token",e.autologin_token),t.href=n.toString(),setTimeout((()=>{t.href=a,delete t.dataset.originalUrl}),0))};document.addEventListener("click",(e=>{const i=(0,ye.Z)(e.target,"A");(null==i?void 0:i.href)&&t(i)}))}getStackFromElement(e){const t=(0,be.Z)(e,"bubble");return t?+t.dataset.mid:void 0}deleteFilesIterative(e){return this.cacheStorage.timeoutOperation((t=>{const i=performance.now();return t.keys().then((i=>{const s=i.map((i=>t.match(i).then((t=>e(t)))));return Promise.all(s).then((e=>(e.map(((e,s)=>{if(!e)return;const n=i[s];return t.delete(n)})),Promise.all(e.filter(Boolean)))))})).then((()=>{this.log("deleted files",performance.now()-i)}))}))}toggleChatGradientAnimation(e){this.chats.forEach((t=>{t.gradientRenderer&&t.gradientRenderer.scrollAnimate(d.Z.settings.animationsEnabled&&t===e)}))}appendEmojiAnimationContainer(e){const t=e===o._.mobile?this.columnEl:document.body;this.emojiAnimationContainer.parentElement!==t&&t.append(this.emojiAnimationContainer)}attachKeydownListener(){const e=new Set(["PageUp","PageDown","Meta","Control"]);document.body.addEventListener("keydown",(t=>{var i;const s=t.key,n=document.getSelection().isCollapsed;if(Ct.Z.isOverlayActive||e.has(s))return;const a=t.target,r=this.chat;if((!(s.startsWith("Arrow")||t.shiftKey&&"Shift"===s)||n)&&("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===a.tagName)){if(!t.altKey||"ArrowUp"!==s&&"ArrowDown"!==s){if("ArrowUp"===s&&"scheduled"!==this.chat.type){if(r.input.editMsgId||!r.input.isInputEmpty())return;this.managers.appMessagesManager.getFirstMessageToEdit(r.peerId,r.threadId).then((e=>{e&&(r.input.initMessageEditing(e.mid),(0,Le.Z)(t))}))}else if("ArrowDown"===s)return}else(0,Le.Z)(t),this.managers.dialogsStorage.getNextDialog(this.chat.peerId,"ArrowDown"===s,es.default.filterId).then((e=>{e&&this.setPeer({peerId:e.peerId})}));if((null===(i=null==r?void 0:r.input)||void 0===i?void 0:i.messageInput)&&t.target!==r.input.messageInput&&"INPUT"!==a.tagName&&!a.isContentEditable&&!c.Z&&(!o.Z.isMobile||this.tabId===Qr.CHAT)&&!r.selection.isSelecting&&!r.input.recording){r.input.messageInput.focus(),(0,Ot.Z)(r.input.messageInput);const e=new KeyboardEvent(t.type,t);r.input.messageInput.dispatchEvent(e)}}}))}makeLink(e,t){return Object.assign({_:e},t)}processInternalLink(e){return Xr(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case xe.MESSAGE:{const t=e.post?(0,wt.Z)(+e.post):void 0,i=e.comment?(0,wt.Z)(+e.comment):void 0,s=e.thread?(0,wt.Z)(+e.thread):void 0;this.openUsername({userName:e.domain,lastMsgId:t,commentId:i,startParam:e.start,stack:e.stack,threadId:s});break}case xe.PRIVATE_POST:{const t=e.channel.toChatId(),i=(t.toPeerId(!0),yield this.managers.appChatsManager.getChat(t));if(!i)try{yield this.managers.appChatsManager.resolveChannel(t)}catch(e){throw(0,we.bC)({langPackKey:"LinkNotFound"}),e}const s=(0,wt.Z)(+e.post),n=e.thread?(0,wt.Z)(+e.thread):void 0;this.op({peer:i,lastMsgId:s,threadId:n,stack:e.stack});break}case xe.EMOJI_SET:case xe.STICKER_SET:new P.Z({id:e.set},e._===xe.EMOJI_SET).show();break;case xe.JOIN_CHAT:this.managers.appChatsManager.checkChatInvite(e.invite).then((t=>{t.chat&&this.managers.appChatsManager.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new Ve(e.invite,t):this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})}),(e=>{"INVITE_HASH_EXPIRED"===e.type&&(0,we.Am)((0,L.ag)("InviteExpired"))}));break;case xe.VOICE_CHAT:no.Z&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;case xe.USER_PHONE_NUMBER:this.managers.appUsersManager.resolvePhone(e.phone).then((e=>{this.setInnerPeer({peerId:e.id.toPeerId(!1)})})).catch((e=>{"PHONE_NOT_OCCUPIED"===e.type&&(0,we.bC)({langPackKey:"Alert.UserDoesntExists"})}));break;case xe.INVOICE:this.managers.appPaymentsManager.getInputInvoiceBySlug(e.slug).then((e=>{this.managers.appPaymentsManager.getPaymentForm(e).then((t=>{new Hi(void 0,e,t)}))}));break;default:this.log.warn("Not supported internal link:",e)}}))}openUrl(e){const{url:t,onclick:i}=(0,ms.Z)(e);if(!i)return;const s=document.createElement("a");s.href=t,window[i](s)}op(e){return Xr(this,void 0,void 0,(function*(){let{peer:t,commentId:i,threadId:s,lastMsgId:n}=e;const a="user"===t._,o=t.id.toPeerId(!a),r="channel"===t._&&t.pFlags.forum;if(i||s||n||!r){if(r&&n&&!s){const t=yield this.managers.appMessagesManager.reloadMessages(o,n);t?s=e.threadId=(0,b.Z)(t,r):(s=e.threadId=n,n=e.lastMsgId=void 0)}return s?this.openThread(Object.assign(Object.assign({},e),{peerId:o})):i?this.openComment({peerId:o,msgId:n,commentId:i}):this.setInnerPeer(Object.assign(Object.assign({},e),{peerId:o}))}es.default.toggleForumTabByPeerId(o,!0)}))}openPremiumBot(){return this.managers.apiManager.getAppConfig().then((e=>this.openUsername({userName:e.premium_bot_username})))}openUsername(e){const{userName:t}=e;return this.managers.appUsersManager.resolveUsername(t).then((t=>this.op(Object.assign({peer:t},e))),(e=>{"USERNAME_NOT_OCCUPIED"===e.type?(0,we.bC)({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&(0,we.bC)({langPackKey:"Alert.UserDoesntExists"})}))}openThread(e){return Xr(this,void 0,void 0,(function*(){return(yield this.managers.appChatsManager.isForum(e.peerId.toChatId()))?(yield this.managers.dialogsStorage.getForumTopicOrReload(e.peerId,e.threadId),this.setInnerPeer(e)):this.managers.appMessagesManager.reloadMessages(e.peerId,e.threadId).then((t=>(t?this.managers.appMessagesManager.generateThreadServiceStartMessage(t):e.lastMsgId=void 0,this.setInnerPeer(Object.assign(Object.assign({},e),{type:"discussion"})))))}))}openComment(e){return this.managers.appMessagesManager.getDiscussionMessage(e.peerId,e.msgId).then((t=>this.openThread({peerId:t.peerId,lastMsgId:e.commentId,threadId:t.mid})))}callUser(e,t){return Xr(this,void 0,void 0,(function*(){Tr.Z.getCallByUserId(e)||((yield this.managers.appProfileManager.getProfile(e)).pFlags.phone_calls_private?(0,Kt.Z)({peerId:e.toPeerId()}).then((e=>(0,bi.Z)({descriptionLangKey:"Call.PrivacyErrorMessage",descriptionLangArgs:[e],button:{langKey:"OK",isCancel:!0}}))):(yield this.discardCurrentCall(e.toPeerId()),Tr.Z.startCallInternal(e,"video"===t)))}))}discardCurrentCall(e,t,i){return ro.ZP.groupCall&&ro.ZP.groupCall!==t?this.discardGroupCallConfirmation(e):Tr.Z.currentCall&&Tr.Z.currentCall!==i?this.discardCallConfirmation(e):Promise.resolve()}discardCallConfirmation(e){return Xr(this,void 0,void 0,(function*(){const t=Tr.Z.currentCall;t&&(yield Promise.all([(0,Kt.Z)({peerId:t.interlocutorUserId.toPeerId(!1)}),(0,Kt.Z)({peerId:e})]).then((([t,i])=>(0,bi.Z)({titleLangKey:"Call.Confirm.Discard.Call.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Call.ToCall.Text":"Call.Confirm.Discard.Call.ToVoice.Text",descriptionLangArgs:[t,i],button:{langKey:"OK"}}))),t.isClosing||(yield t.hangUp("phoneCallDiscardReasonDisconnect")))}))}discardGroupCallConfirmation(e){return Xr(this,void 0,void 0,(function*(){const t=ro.ZP.groupCall;t&&(yield Promise.all([(0,Kt.Z)({peerId:t.chatId.toPeerId(!0)}),(0,Kt.Z)({peerId:e})]).then((([t,i])=>(0,bi.Z)({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Voice.ToCall.Text":"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[t,i],button:{langKey:"OK"}}))),ro.ZP.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return Xr(this,void 0,void 0,(function*(){const i=e.toChatId(),s=this.managers.appChatsManager.hasRights(i,"manage_call");if(t&&"groupCallDiscarded"===(yield this.managers.appGroupCallsManager.getGroupCallFull(t))._){if(!s)return void(0,we.bC)({langPackKey:"VoiceChat.Chat.Ended"});yield(0,bi.Z)({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}(()=>{Xr(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getChatFull(i);let t;if(e.call)t=e.call;else{if(!s)return;t=yield this.managers.appGroupCallsManager.createGroupCall(i)}ro.ZP.joinGroupCall(i,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){var t,i;const s=yo.Z.getTheme(),n=null===(i=null===(t=s.settings)||void 0===t?void 0:t.wallpaper)||void 0===i?void 0:i.slug;if(n){const t=Gr.h.settings.themes.find((e=>e.name===s.name));return this.getBackground(n).then((t=>this.setBackground(t,e)),(()=>(s.settings=(0,La.Z)(t.settings),this.setCurrentBackground(!0))))}return this.setBackground("",e)}getBackground(e){return this.backgroundPromises[e]?this.backgroundPromises[e]:this.backgroundPromises[e]=this.cacheStorage.getFile("backgrounds/"+e).then((e=>URL.createObjectURL(e)))}setBackground(e,t=!0){this.lastBackgroundUrl=e;const i=this.chats.map((t=>t.setBackground(e)));return i[i.length-1].then((()=>{t&&d.Z.dispatchEvent("background_change")}))}saveChatPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.bubbles,i=e.peerId+(e.threadId?"_"+e.threadId:""),s=Po.Z.getFromCache("chatPositions");if(t.scrollable.getDistanceToEnd()<=16&&t.scrollable.loadedAll.bottom||!t.getRenderedLength())delete s[i],this.log("deleted chat position");else{t.sliceViewport(!0);const e=t.scrollable.scrollTop,n={mids:(0,rt.Z)(t.bubbles,"desc").filter((e=>e>0&&!t.skippedMids.has(e))),top:e};s[i]=n,this.log("saved chat position:",n)}Po.Z.set({chatPositions:s},!0)}getChatSavedPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.peerId+(e.threadId?"_"+e.threadId:""),i=Po.Z.getFromCache("chatPositions");return i&&i[t]}applyCurrentTheme(e,t,i){return t&&(this.backgroundPromises[e]=Promise.resolve(t)),yo.Z.setTheme(),this.setCurrentBackground(void 0===i?!!e:i)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&Zo([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),d.Z.settings.animationsEnabled&&!1!==t&&(0,pe.YW)((0,at.Z)(400),400);const i=(0,Me.Z)(this.prevTab);(0,Me.Z)(e)>i&&Hn.Z.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),(0,Qn.Z)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),c.Z||this.attachDragAndDropListeners(),this.markupTooltip=new Eo(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let i=!1;const s=(r,d)=>Xr(this,void 0,void 0,(function*(){if(d===i)return;const l=r.dataTransfer.types,c=l.contains?l.contains("Files"):l.indexOf("Files")>=0,h=_n(),u=yield Wr(r,!0);if(!c||!(yield this.canDrag())&&!h)return void(n=0);const p=h?o:a,f=h?t:e;if(d&&!f.length){const e=c&&!u.length,t=u.filter((e=>bn.Z.has(e))).length;this.log("drag files",u),h?(h.appendDrops(p),(u.length||e)&&f.push(new Mo(p,{header:"Preview.Dragging.AddItems",headerArgs:[u.length],onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}}))):((u.length||e)&&f.push(new Mo(p,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}})),(t||e)&&f.push(new Mo(p,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"media")}})),this.chat.container.append(p))}(0,De.Z)({element:p,className:"is-visible",forwards:d,duration:200,onTransitionEnd:()=>{d||(f.forEach((e=>{e.destroy()})),f.length=0)}}),d?f.forEach((e=>{e.setPath()})):n=0,document.body.classList.toggle("is-dragging",d),i=d}));let n=0;document.body.addEventListener("dragenter",(e=>{n++})),document.body.addEventListener("dragover",(e=>{s(e,!0),(0,Le.Z)(e)})),document.body.addEventListener("dragleave",(e=>{n--,0===n&&s(e,!1)}));const a=document.createElement("div");a.classList.add("drops-container");const o=a.cloneNode(!0)}canDrag(){return Xr(this,void 0,void 0,(function*(){const e=this.chat;return!(!(null==e?void 0:e.peerId)||Ct.Z.isOverlayActive||!(yield e.canSend("send_media")))}))}overrideHash(e){return Xr(this,void 0,void 0,(function*(){let t;if(e){const i=yield this.managers.appPeersManager.getPeerUsername(e);t=i?"@"+i:""+e}Hn.Z.overrideHash(t)}))}selectTab(e,t){var i;!1===t&&Zo([n.ZP.sidebarEl,this.columnEl,a.ZP.sidebarEl]),document.body.classList.toggle(n.ir,e===Qr.CHATLIST);const s=this.tabId;void 0!==s&&(this.overrideHash(e>Qr.CHATLIST?null===(i=this.chat)||void 0===i?void 0:i.peerId:void 0),this.dispatchEvent("tab_changing",e)),this.log("selectTab",e,s);let r=d.Z.settings.animationsEnabled?(0,fe.d1)():Promise.resolve();if(void 0!==s&&s!==e&&d.Z.settings.animationsEnabled&&!1!==t){const e=100+(o.Z.isMobile?250:200);r=(0,at.Z)(e),(0,pe.YW)(r,e)}this.tabId=e,(0,Qn.Z)(),o.Z.isMobile&&s===Qr.PROFILE&&es&&(e{this.setPeer({},e)}});const l=window.onImTabChange;return l&&l(e),r}updateStatus(){return this.managers.appUsersManager.updateMyOnlineStatus(this.offline)}createNewChat(){const e=new So(this,this.managers);return this.chats.length&&e.setBackground(this.lastBackgroundUrl,!0),this.chats.push(e),e}spliceChats(e,t=!0,i,s){if(e>=this.chats.length)return;const n=this.chat;this.chats.length>1&&t&&this.dispatchEvent("peer_changing",this.chat),s||(s=this.chats.splice(e,this.chats.length-e));const o=this.chat;this.dispatchEvent("chat_changing",{from:n,to:o});for(let e=0;e1&&s.slice(0,-1).forEach((e=>{e.container.remove()})),this.chatsSelectTab(o.container,i),t){this.dispatchEvent("peer_changed",o);const e=a.ZP.getTab(po);null==e||e.close(),a.ZP.replaceSharedMediaTab(o.sharedMediaTab)}s.forEach((e=>{e.beforeDestroy()})),setTimeout((()=>{s.forEach((e=>{e.destroy()}))}),350)}setPeer(e={},t){var i;return Xr(this,void 0,void 0,(function*(){this.init&&(this.init(),this.init=null),null!==(i=e.peerId)&&void 0!==i||(e.peerId=m.NM);const{peerId:s,lastMsgId:a,threadId:r}=e,d=this.chat,l=this.chats.indexOf(d),c=this.isSamePeer(d,e);if(s){if(l>0&&d.peerId&&!c){const t=this.chats.splice(1,this.chats.length-1);if(this.chat.peerId===s)return void this.spliceChats(0,!0,!0,t);{const i=this.setPeer(e);return this.spliceChats(0,!1,!1,t),i}}}else{if(l>0)return void this.spliceChats(l,void 0,t);if(o.Z.activeScreen===o._.medium)return void this.selectTab(+!this.tabId,t)}if(c&&o.Z.activeScreen<=o._.medium&&document.body.classList.contains(n.ir))return this.selectTab(Qr.CHAT,t),!1;if(s||o.Z.activeScreen!==o._.mobile){const i=yield d.setPeer(e),n=(null==i?void 0:i.cached)?i.promise:Promise.resolve();s&&Promise.all([n,d.setBackgroundPromise]).then((()=>{setTimeout((()=>{setTimeout((()=>{this.chatsSelectTab(this.chat.container)}),0),this.selectTab(Qr.CHAT,t)}),0)}))}return s?void 0:(this.selectTab(Qr.CHATLIST,t),!1)}))}setInnerPeer(e){var t;return Xr(this,void 0,void 0,(function*(){const{peerId:i}=e;if(i===m.NM||!i)return;e.type||(e.threadId&&!(yield this.managers.appPeersManager.isForum(e.peerId))&&(e.type="discussion"),null!==(t=e.type)&&void 0!==t||(e.type="chat"));const s=this.chats.findIndex((t=>this.isSamePeer(t,e)||o.Z.activeScreen===o._.mobile&&0===this.tabId));if(-1!==s)return this.spliceChats(s+1),this.setPeer(e);const n=this.chat;let a=n;return n.inited&&(a=this.createNewChat()),this.dispatchEvent("chat_changing",{from:n,to:a}),this.setPeer(e)}))}openScheduled(e){this.setInnerPeer({peerId:e,type:"scheduled"})}getTypingElement(e){const t=document.createElement("span");let i="peer-typing";switch(t.classList.add(i),t.dataset.action=e._,e._){case"sendMessageTypingAction":i+="-text";for(let e=0;e<3;++e){const e=document.createElement("span");e.className=i+"-dot",t.append(e)}break;case"sendMessageUploadAudioAction":case"sendMessageUploadDocumentAction":case"sendMessageUploadRoundAction":case"sendMessageUploadVideoAction":case"sendMessageUploadPhotoAction":i+="-upload";break;case"sendMessageRecordAudioAction":case"sendMessageRecordRoundAction":case"sendMessageRecordVideoAction":i+="-record";break;case"sendMessageEmojiInteractionSeen":case"sendMessageChooseStickerAction":i+="-choosing-sticker";for(let e=0;e<2;++e){const e=document.createElement("div");e.className=i+"-eye",t.append(e)}}return t.classList.add(i),t}getPeerTyping(e,t,i){return Xr(this,void 0,void 0,(function*(){const s=e.isUser();if(s&&(yield this.managers.appUsersManager.isBot(e)))return;const n=yield this.managers.appProfileManager.getPeerTypings(e,i);if(!(null==n?void 0:n.length))return;const a=n[0],o={private:{sendMessageTypingAction:"Peer.Activity.User.TypingText",sendMessageUploadAudioAction:"Peer.Activity.User.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.User.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.User.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.User.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.User.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.User.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.User.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.User.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.User.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.User.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.User.EnjoyingAnimations"},chat:{sendMessageTypingAction:"Peer.Activity.Chat.TypingText",sendMessageUploadAudioAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.Chat.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.Chat.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.Chat.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.Chat.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.Chat.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.Chat.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.Chat.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.Chat.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.Chat.EnjoyingAnimations"},multi:{sendMessageTypingAction:"Peer.Activity.Chat.Multi.TypingText1",sendMessageUploadAudioAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadDocumentAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadPhotoAction:"Peer.Activity.Chat.Multi.SendingPhoto1",sendMessageUploadVideoAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageUploadRoundAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageRecordVideoAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageRecordAudioAction:"Peer.Activity.Chat.Multi.RecordingAudio1",sendMessageRecordRoundAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageGamePlayAction:"Peer.Activity.Chat.Multi.PlayingGame1",sendMessageChooseStickerAction:"Peer.Activity.Chat.Multi.ChoosingSticker1"}},r=s?o.private:n.length>1?o.multi:o.chat;let d=a.action;if(n.length>1){const e={};n.forEach((t=>{const i=t.action._;void 0===e[i]&&(e[i]=0),++e[i]})),Object.keys(e).length>1&&(d={_:"sendMessageTypingAction"})}const l=r[d._];if(!l)return;let c,h;if(e.isAnyChat()){const e=new N.Z;c=e.update({peerId:a.userId.toPeerId(!1),onlyFirstName:!0}),h=[e.element,n.length-1],yield c}t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),t.classList.toggle("peer-typing-flex","sendMessageChooseStickerAction"===d._||"sendMessageEmojiInteractionSeen"===d._);let u=t.firstElementChild;if(u?u.dataset.action!==d._&&u.replaceWith(this.getTypingElement(d)):(u=this.getTypingElement(d),t.prepend(u)),"sendMessageEmojiInteractionSeen"===d._){h?h.pop():h=[];const e=(0,Ar.Z)((0,B.Z)(d.emoticon));h.push(e)}const p=(0,L.ag)(l,h);return p.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(p):t.append(p),t}))}getChatStatus(e,t){return Xr(this,void 0,void 0,(function*(){const i=t?void 0:yield this.getPeerTyping(e.toPeerId(!0));if(i)return{cached:!0,result:Promise.resolve(i)};const s=yield this.managers.acknowledged.appProfileManager.getChatFull(e),n=Promise.resolve(s.result).then((t=>Xr(this,void 0,void 0,(function*(){var i,s;const n=t.participants_count||(null===(s=null===(i=t.participants)||void 0===i?void 0:i.participants)||void 0===s?void 0:s.length)||1;let a=yield(0,xa.Z)(e);if(n<2)return a;const o=yield this.managers.appProfileManager.getOnlines(e);if(o>1){const e=document.createElement("span");e.append(...(0,L.v_)([a,(0,L.ag)("OnlineCount",[(0,je.Z)(o)])],!1)),a=e}return a}))));return{cached:s.cached,result:n}}))}getUserStatus(e,t){var i;return Xr(this,void 0,void 0,(function*(){const s={cached:!0,result:Promise.resolve(void 0)},n=yield this.managers.appUsersManager.getUser(e);if(!n||n.pFlags.self&&!t)return s;const a=(0,Ws.Z)(n);if(!n.pFlags.bot&&!n.pFlags.support){let t=yield this.getPeerTyping(e.toPeerId());if(t||"userStatusOnline"!==(null===(i=n.status)||void 0===i?void 0:i._)||(t=document.createElement("span"),t.classList.add("online"),t.append(a)),t)return s.result=Promise.resolve(t),s}return s.result=Promise.resolve(a),s}))}getPeerStatus(e,t,i){return Xr(this,void 0,void 0,(function*(){if(!e)return;let s;return s=e.isAnyChat()?this.getChatStatus(e.toChatId(),i):this.getUserStatus(e.toUserId(),t),s}))}setPeerStatus(e){return Xr(this,void 0,void 0,(function*(){const{peerId:t,element:i,needClear:s,useWhitespace:n,middleware:a,ignoreSelf:o,noTyping:r}=e;if(!s){const e=i.querySelector(".peer-typing-container");if(e&&(yield this.getPeerTyping(t,e)))return}const d=yield this.getPeerStatus(t,o,r);if(!a())return;const l=()=>Xr(this,void 0,void 0,(function*(){const e=d&&(yield d.result);if(a())return()=>(0,H.Z)(i,e||c)})),c=n?"‎":"";return!d||d.cached||void 0===s?yield l():s?()=>(i.textContent=c,l().then((e=>null==e?void 0:e()))):void 0}))}setChoosingStickerTyping(e){this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"},void 0,this.chat.threadId)}isSamePeer(e,t){return e.peerId===t.peerId&&e.threadId===t.threadId&&(typeof e.type!=typeof t.type||e.type===t.type)}}const ed=new Jr;ge.GO&&(ge.GO.appImManager=ed);const td=ed},3709:(e,t,i)=>{"use strict";function s(e){var t;return e&&!e.pFlags.is_outgoing&&!e.pFlags.noforwards&&!(null===(t=e.media)||void 0===t?void 0:t.extended_media)}i.d(t,{Z:()=>s})},7530:(e,t,i)=>{"use strict";function s(e){var t;if(!e)return;let i;if(e.action)i=e.action.photo;else if(e.media){let s=e.media;s.webpage?s=s.webpage:"messageExtendedMedia"===(null===(t=s.extended_media)||void 0===t?void 0:t._)&&(s=s.extended_media.media),i=s.document||s.photo}return i}i.d(t,{Z:()=>s})},2291:(e,t,i)=>{"use strict";function s(e){var t;return e.fromId?{peerId:e.fromId}:{fromName:null===(t=e.fwd_from)||void 0===t?void 0:t.from_name}}i.d(t,{Z:()=>s})},5381:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(677);function n(e){return!(!e.restriction_reason||!(0,s.X)(e.restriction_reason))}},5990:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});const s=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],n=["red","green","yellow","blue","violet","pink","cyan","orange"],a=[0,7,4,1,6,3,5];function o(e,t=!0){if(!e)return"";const i=a[Math.abs(+e)%7];return(t?n:s)[i]}},6082:(e,t,i)=>{"use strict";function s(e){if(e.username)return e.username;const t=e.usernames,i=null==t?void 0:t.find((e=>e.pFlags.editable));return null==i?void 0:i.username}i.d(t,{Z:()=>s})},2946:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(5880),n=i(1507);function a(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,s.Z)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const i=e.channel_id||e.chat_id;return void 0!==i?i.toPeerId(!0):n.NM}if(!e)return n.NM;const t="u"===e.charAt(0),i=e.substr(1).split("_");return t?i[0].toPeerId():(i[0]||"").toPeerId(!0)}},7030:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(9897),n=i(1507);function a(e,t=0,i=0,a=!1,o=!1){window.devicePixelRatio>1&&(t*=2,i*=2);let r=e.sizes||e.thumbs,d={_:"photoSizeEmpty",type:n.Pt};if(o&&r&&"photo"!==e._&&(r=r.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:n.Pt})),null==r?void 0:r.length){for(let e=0,n=r.length;e=t||a.height>=i)break}a&&"photoSizeEmpty"===d._&&"photoStrippedSize"===r[0]._&&(d=r[0])}return d}},3075:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5953),n=i(5003),a=i(6752);class o{constructor(e){var t;(0,s.Z)(this,e),this.log||(this.log=(null===(t=this.connection)||void 0===t?void 0:t.log)||(0,n.kg)("CALL-CONNECTION-BASE")),this.sources={}}createPeerConnection(e){return this.connection||(this.connection=function(e,t){t||(t=(0,n.kg)("RTCPeerConnection")),t("constructor");const i=new RTCPeerConnection(e);return i.addEventListener("track",(e=>{t("ontrack",e)})),i.addEventListener("signalingstatechange",(()=>{t("onsignalingstatechange",i.signalingState)})),i.addEventListener("connectionstatechange",(()=>{t("onconnectionstatechange",i.connectionState)})),i.addEventListener("negotiationneeded",(()=>{t("onnegotiationneeded",i.signalingState)})),i.addEventListener("icecandidate",(e=>{t("onicecandidate",e)})),i.addEventListener("iceconnectionstatechange",(()=>{t("oniceconnectionstatechange",i.iceConnectionState)})),i.addEventListener("datachannel",(()=>{t("ondatachannel")})),i.log=t,{connection:i}}(e,this.log.bindPrefix("connection")).connection)}createDataChannel(e){return this.dataChannel||(this.dataChannel=function(e,t,i){i||(i=(0,n.kg)("RTCDataChannel"));const s=e.createDataChannel("data",t);return s.addEventListener("message",(e=>{i("onmessage",e)})),s.addEventListener("open",(()=>{i("onopen")})),s.addEventListener("close",(()=>{i("onclose")})),s.log=i,s}(this.connection,e,this.log.bindPrefix("data")))}createDescription(){return this.description||(this.description=new a.ZP(this.connection))}appendStreamToConference(){return this.streamManager.appendToConference(this.description)}closeConnection(){const{connection:e}=this;if(e)try{e.log("close"),e.close()}catch(e){this.log.error(e)}}closeConnectionAndStream(e){this.closeConnection(),e&&this.streamManager.stop()}negotiate(){return this.negotiating||(this.negotiating=this.negotiateInternal().finally((()=>{this.negotiating=void 0})))}sendDataChannelData(e){"open"===this.dataChannel.readyState&&this.dataChannel.send(JSON.stringify(e))}}},2069:(e,t,i)=>{"use strict";i.d(t,{Z:()=>N});var s=i(6761),n=i(4762),a=i(5953),o=i(5701),r=i(671),d=i(5003),l=i(3855),c=i(3075),h=i(3773);function u(e){const t=(0,h.Z)(e,e.media[0]),i={"@type":"InitialSetup",fingerprints:[t.fingerprint],ufrag:t.ufrag,pwd:t.pwd,audio:void 0,video:void 0,screencast:void 0},s=e=>""+e;for(const t of e.media){const n=t.mediaType;if("application"===n||!t.isSending)continue;const a=i["video"===n&&i.video?"screencast":n]={},o=(0,h.Z)(e,t);a.ssrc=s(o.source),o.sourceGroups&&(a.ssrcGroups=o.sourceGroups.map((e=>({semantics:e.semantics,ssrcs:e.sources.map(s)}))));const r=a.rtpExtensions=[];t.attributes.get("extmap").forEach((e=>{r.push({id:+e.key,uri:e.value})}));const d=new Map,l=e=>{let t=d.get(e);return t||d.set(e,t={id:e}),t};t.attributes.get("rtpmap").forEach((e=>{const t=+e.key,i=l(t),s=e.value.split("/"),[n,a,o]=s;i.name=n,i.clockrate=+a,i.channels=o?+o:0})),t.attributes.get("rtcp-fb").forEach((e=>{const t=+e.key;l(t).feedbackTypes=e.lines.map((e=>{const t=e.split(" "),[i,s]=t;return{type:i,subtype:s||""}}))})),t.attributes.get("fmtp").forEach((e=>{const t=+e.key,i=l(t).parameters={},s=e.value.split(";");for(const e of s){const[t,s]=e.split("=");i[t]=s}})),a.payloadTypes=Array.from(d.values())}return i}var p=i(9124);class f extends c.Z{constructor(e){super(e)}negotiateInternal(){return e=this,t=void 0,s=function*(){const{connection:e,call:t}=this;if(!e.localDescription&&!e.remoteDescription&&!t.isOutgoing)return;let i;if(t.offerReceived){t.offerReceived=!1;const s=i=yield e.createAnswer();this.log("[sdp] local",s.type,s.sdp),yield e.setLocalDescription(s),this.log("[InitialSetup] send 2")}else{const s=i=yield e.createOffer();this.log("[sdp] local",s.sdp),yield e.setLocalDescription(s),t.offerSent=!0,this.log("[InitialSetup] send 0")}const s=u((0,p.DV)(i.sdp));t.sendCallSignalingData(s)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var m=i(8500),g=i(2493),v=i(3335),b=i(1677),y=i(49),w=i(6752),S=i(4903);const C="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var L=i(9818),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class I{constructor(e,t){this.isOutgoing=e,this.p2pKey=t,this.type="Signaling",this.counter=0,this.seqMap=new Map}concatSHA256(e){return t=(0,S.Z)(...e),C.digest("SHA-256",(0,L.Z)(t)).then((e=>new Uint8Array(e)));var t}encryptPrepared(e){return E(this,void 0,void 0,(function*(){const t={counter:0,bytes:new Uint8Array(16+e.length)},i=(this.isOutgoing?0:8)+("Signaling"===this.type?128:0),s=this.p2pKey,n=yield this.concatSHA256([s.subarray(i+88,i+88+32),e]),a=t.bytes;for(let e=0;e<16;++e)a[e]=n[e+8];const o=yield this.prepareAesKeyIv(s,a,i),r=yield this.aesProcessCtr(e,e.length,o,!0);return t.bytes=new Uint8Array([...t.bytes.subarray(0,16),...r]),t}))}encryptRawPacket(e){const t=++this.counter,i=new ArrayBuffer(4);new DataView(i).setUint32(0,t>>>0,!1);const s=new Uint8Array([...new Uint8Array(i),...e]);return this.encryptPrepared(s)}prepareAesKeyIv(e,t,i){return E(this,void 0,void 0,(function*(){const[s,n]=yield Promise.all([this.concatSHA256([t.subarray(0,16),e.subarray(i,i+36)]),this.concatSHA256([e.subarray(40+i,40+i+36),t.subarray(0,16)])]);return{key:new Uint8Array([...s.subarray(0,8),...n.subarray(8,24),...s.subarray(24,32)]),iv:new Uint8Array([...n.subarray(0,4),...s.subarray(8,16),...n.subarray(24,28)])}}))}aesProcessCtr(e,t,i,s=!0){return E(this,void 0,void 0,(function*(){const t=yield C.importKey("raw",i.key,{name:"AES-CTR"},!1,[s?"encrypt":"decrypt"]),n=yield C[s?"encrypt":"decrypt"]({name:"AES-CTR",counter:i.iv,length:8*i.iv.length},t,e);return new Uint8Array(n)}))}constTimeIsDifferent(e,t,i){let s=!0;for(let n=0;n134217728)return;const{isOutgoing:t,type:i}=this,s=(t?8:0)+("Signaling"===i?128:0),n=this.p2pKey,a=e.subarray(0,16),o=e.subarray(16),r=e.length-16,d=yield this.prepareAesKeyIv(n,a,s),l=yield this.aesProcessCtr(o,r,d,!1),c=yield this.concatSHA256([n.subarray(88+s,88+s+32),l]);if(this.constTimeIsDifferent(c.subarray(8),a,16))return;const h=new DataView(l.buffer).getUint32(0);return this.seqMap.has(h)?void 0:(this.seqMap.set(h,h),l.slice(4))}))}}var M=i(630);class P{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new M.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} audio${s}`),r.add("a=rtcp-mux",_(a),F(i,s,n,d));break;case"video":r.add(`m=video 61986 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",_(a),F(i,s,n,d))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new M.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} audio${s}`),r.add("a=rtcp-mux",_(a),F(i,s,n,d));break;case"video":r.add(`m=video 61986 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",_(a),F(i,s,n,d))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}}class Z{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(l),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(l),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(h),r+="\na=rtcp-mux",r+=_(l),r+=F(i,n,a,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${l.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(h),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(l),r+=F(i,n,a,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}class T{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} audio${s}`),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} audio${s}`),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}function k(){return navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function x(){return navigator.userAgent.toLowerCase().indexOf("safari")>-1&&-1===navigator.userAgent.toLowerCase().indexOf("chrome")}function A(e){let t=[];for(let i=0;i{const{type:i,subtype:s}=e;t.push(`a=rtcp-fb:${n} ${[i,s].join(" ")}`)})),l){const e=[];Object.getOwnPropertyNames(l).forEach((t=>{e.push(`${t}=${l[t]}`)})),t.push(`a=fmtp:${n} ${e.join(";")}`)}}return t.join("\n")}function F(e,t,i,s){let n=[];return i&&i.length>0?i.forEach((t=>{t&&t.ssrcs.length>0&&(n.push(`a=ssrc-group:${t.semantics} ${t.ssrcs.join(" ")}`),t.ssrcs.forEach((t=>{n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`)})))})):t&&n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`),n.join("\n")}class D{static generateCandidate(e){if(!e)return null;const{sdpString:t,sdpMLineIndex:i,sdpMid:s,foundation:n,component:a,protocol:o,priority:r,address:d,type:l,relAddress:c,generation:h,tcpType:u,networkId:p,networkCost:f,username:m}=e;if(t)return{candidate:t,sdpMLineIndex:i,sdpMid:s};throw"no sdpString"}static generateOffer(e){return k()?Z.generateOffer(e):x()?T.generateOffer(e):P.generateOffer(e)}static generateAnswer(e){return k()?Z.generateAnswer(e):x()?T.generateAnswer(e):P.generateAnswer(e)}}var R=i(9585),B=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class N extends m.Z{constructor(e){super(),this.log=(0,d.kg)("CALL"),this.protocol||(this.protocol={_:"phoneCallProtocol",pFlags:{udp_p2p:!0,udp_reflector:!0},min_layer:92,max_layer:92,library_versions:["4.0.0"]}),(0,a.Z)(this,e),this.createdAt=Date.now(),this.offerReceived=!1,this.offerSent=!1,this.decryptQueue=[],this.candidates=[],this.addEventListener("state",(e=>{this.log("state",v.Z[e]),e===v.Z.CLOSED&&this.cleanup()}));const t=this.streamManager=new R.Z(b.iK);t.direction="sendrecv",t.types.push("screencast"),this.isOutgoing||(t.locked=!0,t.canCreateConferenceEntry=!1);let i={"@type":"MediaState",type:"input",lowBattery:!1,muted:!0,screencastState:"inactive",videoRotation:0,videoState:"inactive"};const s=this;i=new Proxy(i,{set:function(e,t,n){return e[t]=n,s.setMediaState(i),s.sendMediaState(),!0}}),this.mediaStates={input:i},this.sendMediaState=(0,o.Z)(this._sendMediaState.bind(this),0,!1,!0)}get connectionState(){const{_connectionState:e,connectionInstance:t}=this;if(void 0!==e)return e;if(t){const{iceConnectionState:e}=t.connection;return"closed"===e?v.Z.CLOSED:"connected"===e||n.IS_SAFARI&&"completed"===e?v.Z.CONNECTED:v.Z.CONNECTING}return v.Z.CONNECTING}get sortIndex(){const e=this.connectionState;let t=1e13*(v.Z.CLOSED-e+1);return t+=2147483647e3-(e===v.Z.PENDING&&this.isOutgoing?0:this.createdAt),t}getVideoElement(e){if("input"===e)return this.elements.get("main");{const e=this.getMediaState("output");if(!e)return;const t="active"===e.videoState?"video":"active"===e.screencastState?"screencast":void 0;if(!t)return;const i=this.description.findEntry((e=>e.type===t));if(!i)return;return this.elements.get(""+i.recvEntry.source)}}startScreenSharingInternal(){return B(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!0,this.wasStartingVideo=!1,this.streamManager.types=["audio","screencast"],yield this.requestScreen()}catch(e){this.log.error("startScreenSharing error",e)}}))}toggleScreenSharing(){return B(this,void 0,void 0,(function*(){return this.isSharingVideo&&(yield this.stopVideoSharing()),this.isSharingScreen?this.stopVideoSharing():this.startScreenSharingInternal()}))}startVideoSharingInternal(){return B(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!1,this.wasStartingVideo=!0,this.streamManager.types=["audio","video"],yield this.requestInputSource(!1,!0,!1)}catch(e){this.log.error("startVideoSharing error",e)}}))}stopVideoSharing(){return B(this,void 0,void 0,(function*(){const e=this.getMediaState("input");e.videoState=e.screencastState="inactive";const{streamManager:t,description:i}=this,s=t.inputStream.getVideoTracks()[0];s&&((0,y.Z)(s),t.appendToConference(i))}))}toggleVideoSharing(){return B(this,void 0,void 0,(function*(){return this.isSharingScreen&&(yield this.stopVideoSharing()),this.isSharingVideo?this.stopVideoSharing():this.startVideoSharingInternal()}))}getMediaState(e){return this.mediaStates[e]}setMediaState(e){this.mediaStates[e.type]=e,this.dispatchEvent("mediaState",e)}isSharingVideoType(e){try{return super.isSharingVideo&&!!(this.wasStartingScreen&&"screencast"===e||this.wasStartingVideo&&"video"===e)}catch(e){return!1}}get isSharingVideo(){return this.isSharingVideoType("video")}get isSharingScreen(){return this.isSharingVideoType("screencast")}get isMuted(){const e=this.streamManager.inputStream.getAudioTracks()[0];return!(null==e?void 0:e.enabled)}get isClosing(){const{connectionState:e}=this;return e===v.Z.CLOSING||e===v.Z.CLOSED}get description(){var e;return null===(e=this.connectionInstance)||void 0===e?void 0:e.description}setHangUpTimeout(e,t){this.clearHangUpTimeout(),this.hangUpTimeout=s.Z.setTimeout((()=>{this.hangUpTimeout=void 0,this.hangUp(t)}),e)}clearHangUpTimeout(){void 0!==this.hangUpTimeout&&(clearTimeout(this.hangUpTimeout),this.hangUpTimeout=void 0)}setPhoneCall(e){this.call=e;const{id:t}=e;if(this.id!==t){const e=this.id;this.id=t,this.dispatchEvent("id",t,e)}}acceptCall(){var e;return B(this,void 0,void 0,(function*(){const t=null===(e=(yield Promise.all(this.dispatchResultableEvent("acceptCallOverride")))[0])||void 0===e||e;if(this.isClosing||!t)return;this.overrideConnectionState(v.Z.EXCHANGING_KEYS);const i=this.call;this.requestInputSource(!0,!!i.pFlags.video,!1);const s=i.g_a_hash;this.managers.appCallsManager.generateDh().then((e=>B(this,void 0,void 0,(function*(){return this.dh={g_a_hash:s,b:e.a,g_b:e.g_a,g_b_hash:e.g_a_hash,p:e.p},this.managers.apiManager.invokeApi("phone.acceptCall",{peer:yield this.managers.appCallsManager.getCallInput(this.id),protocol:this.protocol,g_b:this.dh.g_b})})))).then((e=>B(this,void 0,void 0,(function*(){yield this.managers.appCallsManager.savePhonePhoneCall(e)})))).catch((e=>{this.log.error("accept call error",e),this.hangUp("phoneCallDiscardReasonHangup")}))}))}joinCall(){this.log("joinCall"),this.getEmojisFingerprint(),this.overrideConnectionState();const{isOutgoing:e,encryptionKey:t,streamManager:i}=this,s=function(e){const t=[];return e.connections.forEach((e=>{switch(e._){case"phoneConnectionWebrtc":{const{ip:i,ipv6:s,port:n,username:a,password:o}=e,r=[];e.pFlags.turn?(i&&r.push(`turn:${i}:${n}`),s&&r.push(`turn:[${s}]:${n}`)):e.pFlags.stun&&(i&&r.push(`stun:${i}:${n}`),s&&r.push(`stun:[${s}]:${n}`)),r.length>0&&t.push({urls:r,username:a,credential:o});break}}})),{iceServers:t,iceTransportPolicy:e.pFlags.p2p_allowed?"all":"relay"}}(this.call);if(this.log("joinCall configuration",s),!s)return;const n=this.connectionInstance=new f({call:this,streamManager:i,log:this.log.bindPrefix("connection")}),a=n.createPeerConnection(s);a.addEventListener("iceconnectionstatechange",(()=>{const e=this.connectionState;void 0===this.connectedAt&&e===v.Z.CONNECTED&&(this.connectedAt=Date.now()),this.dispatchEvent("state",e)})),a.addEventListener("negotiationneeded",(()=>{n.negotiate()})),a.addEventListener("icecandidate",(e=>{const{candidate:t}=e;a.log("onicecandidate",t),(null==t?void 0:t.candidate)&&this.sendIceCandidate(t)})),a.addEventListener("track",(e=>{const{track:t}=e;a.log("ontrack",t),this.onTrack(e)})),n.createDescription(),this.encryptor=new I(e,t),this.decryptor=new I(!e,t),this.log("currentCall",this),e&&n.appendStreamToConference(),this.createDataChannel(),this.processDecryptQueue()}createDataChannelEntry(){const e=this.description.createEntry("application");e.setDirection("sendrecv"),e.sendEntry=e.recvEntry=e}createDataChannel(){if(this.connectionInstance.dataChannel)return;const e=this.connectionInstance.createDataChannel({id:0,negotiated:!0});e.addEventListener("message",(e=>{this.applyDataChannelData(JSON.parse(e.data))})),e.addEventListener("open",(()=>{this.sendMediaState()}))}applyDataChannelData(e){"MediaState"===e["@type"]?(e.type="output",this.log("got output media state",e),this.setMediaState(e)):this.log.error("unknown data channel data:",e)}_sendMediaState(){const{connectionInstance:e}=this;if(!e)return;const t=Object.assign({},this.getMediaState("input"));delete t.type,this.log("sendMediaState",t),e.sendDataChannelData(t)}sendCallSignalingData(e){return B(this,void 0,void 0,(function*(){const t=JSON.stringify(e),i=(new TextEncoder).encode(t),{bytes:s}=yield this.encryptor.encryptRawPacket(i);this.log("sendCallSignalingData",this.id,t),yield this.managers.apiManager.invokeApi("phone.sendSignalingData",{peer:yield this.managers.appCallsManager.getCallInput(this.id),data:s})}))}sendIceCandidate(e){this.log("sendIceCandidate",e);const{candidate:t,sdpMLineIndex:i}=e;if(0!==i)return;const s=function(e){if(!e||!e.startsWith("candidate:"))return;const t=e;e=e.substr("candidate:".length);const[i,s,n,a,o,r,...d]=e.split(" "),l={sdpString:t,foundation:i,component:s,protocol:n,priority:a,address:{ip:o,port:r}};for(let e=0;e(this.getEmojisFingerprintPromise=void 0,this.emojisFingerprint=e.map((e=>(0,r.zu)(e))))))}unlockStreamManager(){this.connectionInstance.streamManager.locked=!1,this.connectionInstance.appendStreamToConference()}doTheMagic(){return B(this,void 0,void 0,(function*(){this.connectionInstance.appendStreamToConference();const e=this.connectionInstance.connection;let t=yield e.createAnswer();this.log("[sdp] local",t.type,t.sdp),yield e.setLocalDescription(t),e.getTransceivers().filter((e=>"recvonly"===e.direction)).forEach((e=>{const t=this.connectionInstance.description.getEntryByMid(e.mid);t.transceiver=t.recvEntry.transceiver=e,e.direction="sendrecv"}));const i=this.description,s=i.entries.map((e=>e.mid)),n={type:"offer",sdp:i.generateSdp({bundle:s,entries:i.entries.filter((e=>s.includes(e.mid))),isAnswer:!0})};yield e.setRemoteDescription(n),t=yield e.createAnswer(),yield e.setLocalDescription(t);const a=u((0,p.DV)(t.sdp));this.log("[InitialSetup] send 1"),this.sendCallSignalingData(a),this.unlockStreamManager()}))}overrideConnectionState(e){this._connectionState=e,this.dispatchEvent("state",this.connectionState)}get duration(){return void 0!==this.connectedAt?(Date.now()-this.connectedAt)/1e3|0:0}onInputStream(e){super.onInputStream(e);const t=e.getVideoTracks()[0];if(t){const e=this.getMediaState("input");this.wasStartingScreen||this.wasStartingVideo||(this.wasStartingVideo=!0),this.isSharingVideo?e.videoState="active":this.isSharingScreen&&(e.screencastState="active"),t.addEventListener("ended",(()=>{this.stopVideoSharing()}),{once:!0})}e.getAudioTracks().length&&this.onMutedChange()}onMutedChange(){const e=this.isMuted;this.dispatchEvent("muted",e),this.getMediaState("input").muted=e}toggleMuted(){return this.requestAudioSource(!0).then((()=>{this.setMuted(),this.onMutedChange()}))}hangUp(e,t){return B(this,void 0,void 0,(function*(){if(!this.isClosing&&(this.discardReason=e,this.log("hangUp",e),this.overrideConnectionState(v.Z.CLOSED),this.connectionInstance&&this.connectionInstance.closeConnectionAndStream(!0),e&&!t)){let t=!1;for(const e in this.mediaStates){const i=this.mediaStates[e];t="active"===i.videoState||"active"===i.screencastState||t}yield this.managers.appCallsManager.discardCall(this.id,this.duration,e,t)}}))}performCodec(e){const t=e.payloadTypes.map((e=>Object.assign(Object.assign({},e),{"rtcp-fbs":e.feedbackTypes})));return{"rtp-hdrexts":e.rtpExtensions,"payload-types":t}}setDataToDescription(e){this.description.setData({transport:{pwd:e.pwd,ufrag:e.ufrag,fingerprints:e.fingerprints,"rtcp-mux":!0},audio:this.performCodec(e.audio),video:e.video?this.performCodec(e.video):void 0,screencast:e.screencast?this.performCodec(e.screencast):void 0})}filterNotVP8(e){this.isOutgoing||[e.video,e.screencast].filter(Boolean).forEach((e=>{const t=e.payloadTypes,i=t.findIndex((e=>"VP8"===e.name)),s=t[i],n=t.findIndex((e=>{var t;return+(null===(t=e.parameters)||void 0===t?void 0:t.apt)===s.id}));e.payloadTypes=[t[i],t[n]]}))}applyCallSignalingData(e){return B(this,void 0,void 0,(function*(){this.log("applyCallSignalingData",this,e);const{connection:t,description:i}=this.connectionInstance;switch(e["@type"]){case"InitialSetup":{this.log("[sdp] InitialSetup",e),this.filterNotVP8(e),this.setDataToDescription(e);const s=e=>e.map((e=>({_:"groupCallParticipantVideoSourceGroup",semantics:e.semantics,sources:e.ssrcs.map((e=>+e))})));[(0,w.z_)("audio",+e.audio.ssrc),e.video?(0,w.z_)("video",s(e.video.ssrcGroups)):void 0,e.screencast?(0,w.z_)("screencast",s(e.screencast.ssrcGroups)):void 0].filter(Boolean).forEach((e=>{let t=i.getEntryBySource(e.source);if(t)return;const s=i.findFreeSendRecvEntry(e.type,!1);t=new w.Lp(s.mid,e.type),t.setDirection("sendrecv"),s.recvEntry=t,i.setEntrySource(t,e.sourceGroups||e.source)})),this.createDataChannelEntry();const n=this.offerSent;this.offerSent=!1;const a=i.entries.map((e=>e.mid)),o={type:n?"answer":"offer",sdp:i.generateSdp({bundle:a,entries:i.entries.filter((e=>a.includes(e.mid))),isAnswer:!n})};this.log("[sdp] remote",o.sdp),yield t.setRemoteDescription(o),yield this.tryToReleaseCandidates(),n||(yield this.doTheMagic());break}case"Candidates":for(const t of e.candidates){const e=D.generateCandidate(t);e.sdpMLineIndex=0;const i=new RTCIceCandidate(e);this.candidates.push(i)}yield this.tryToReleaseCandidates();break;default:this.log.error("unrecognized signaling data",e)}}))}tryToReleaseCandidates(){return B(this,void 0,void 0,(function*(){const{connectionInstance:e}=this;if(!e)return;const{connection:t}=e;if(t.remoteDescription){const e=this.candidates.map((e=>this.addIceCandidate(t,e)));this.candidates.length=0,yield Promise.all(e)}else this.log("[candidates] postpone")}))}addIceCandidate(e,t){return B(this,void 0,void 0,(function*(){this.log("[candidate] start",t);try{yield e.addIceCandidate(t),this.log("[candidate] add",t)}catch(e){this.log.error("[candidate] error",t,e)}}))}processDecryptQueue(){return B(this,void 0,void 0,(function*(){const{encryptor:e}=this;if(!e)return void this.log.warn("got encrypted signaling data before the encryption key");if(!this.decryptQueue.length)return;const t=this.decryptQueue.slice();this.decryptQueue.length=0;for(const i of t){const t=yield e.decryptRawPacket(i);if(!t)continue;const s=(new TextDecoder).decode(t);try{const e=JSON.parse(s);this.log("[update] updateNewCallSignalingData",e),this.applyCallSignalingData(e)}catch(e){this.log.error("wrong signaling data",s),this.hangUp("phoneCallDiscardReasonDisconnect"),g.Z.dispatchEvent("incompatible",this.interlocutorUserId)}}}))}onUpdatePhoneCallSignalingData(e){this.decryptQueue.push(e),this.processDecryptQueue()}}},8500:(e,t,i)=>{"use strict";i.d(t,{Z:()=>p});var s=i(3241),n=i(319),a=i(9125),o=i(9337),r=i(382),d=i(5424);function l(){const e={main:{},screen:{}};return t=>{return i=this,s=void 0,a=function*(){const{isScreen:i,constraints:s}=t,n=e[i?"screen":"main"];let a=n[s.audio?"audio":"video"];a||(a=(i?r.Z:d.Z)(s,t.muted),s.audio&&!n.audio&&(n.audio=a.finally((()=>n.audio=void 0))),s.video&&!n.video&&(n.video=a.finally((()=>n.video=void 0))));try{return yield a}catch(e){throw e}},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}window.getStreamCached=l;var c=i(312),h=i(49),u=i(9585);class p extends s.Z{constructor(){super(!1);const e=this.player=document.createElement("div");e.classList.add("call-player"),e.style.display="none",document.body.append(e),this.elements=new Map;const t=this.audio=new Audio;t.autoplay=!0,t.volume=1,this.player.append(t),this.elements.set("audio",t),this.fixSafariAudio(),this.getStream=l()}get isSharingAudio(){return!!this.streamManager.hasInputTrackKind("audio")}get isSharingVideo(){return!!this.streamManager.hasInputTrackKind("video")}fixSafariAudio(){this.audio.play().catch(n.Z)}requestAudioSource(e){return this.requestInputSource(!0,!1,e)}requestInputSource(e,t,i){const{streamManager:s}=this;if(s){const i=!e||this.isSharingAudio,s=!t||this.isSharingVideo;if(i&&s)return Promise.resolve()}const n={audio:e&&(0,a.Z)(),video:t&&(0,c.Z)()};return this.getStream({constraints:n,muted:i}).then((e=>{this.onInputStream(e)}))}requestScreen(){return this.getStream({isScreen:!0,constraints:(0,o.Z)(!0)}).then((e=>{this.onInputStream(e)}))}getElement(e){return this.elements.get(""+e)}cleanup(){this.player.textContent="",this.player.remove(),this.elements.clear(),this.streamManager.stop(),super.cleanup()}onTrack(e){this.tryAddTrack({stream:e.streams[0],track:e.track,type:"output"})}saveInputVideoStream(e,t){const i=e.getVideoTracks()[0];this.tryAddTrack({stream:e,track:i,type:"input",source:t||"main"})}tryAddTrack({stream:e,track:t,type:i,source:s}){s||(s=u.Z.getSource(e,i)),this.log("tryAddTrack",e,t,i,s);const a="output"===i,{player:o,elements:r,streamManager:d}=this,l=t.kind,c="video"===l,h=c?s:l;let p=r.get(h);c&&t.addEventListener("ended",(()=>{this.log("[track] onended"),r.delete(h)}),{once:!0}),a&&d.addTrack(e,t,i);const f=c?e:d.outputStream;if(p)p.paused&&p.play().catch(n.Z),p.srcObject=f;else{if(p=document.createElement(l),p.autoplay=!0,p.srcObject=f,p.volume=1,"undefined"!==p.sinkId){const{outputDeviceId:e}=this;e&&p.setSinkId(e)}c?(p.setAttribute("playsinline","true"),p.muted=!0):o.appendChild(p),r.set(h,p)}return s}setMuted(e){this.streamManager.inputStream.getAudioTracks().forEach((t=>{"audio"===(null==t?void 0:t.kind)&&(t.enabled=void 0===e?!t.enabled:!e)}))}onInputStream(e){if(this.isClosing)e.getTracks().forEach((e=>{(0,h.Z)(e)}));else{e.getVideoTracks().length&&this.saveInputVideoStream(e,"main");const{streamManager:t,description:i}=this;t.addStream(e,"input"),i&&t.appendToConference(i)}}}},3335:(e,t,i)=>{"use strict";var s;i.d(t,{Z:()=>n}),function(e){e[e.CONNECTED=0]="CONNECTED",e[e.CONNECTING=1]="CONNECTING",e[e.EXCHANGING_KEYS=2]="EXCHANGING_KEYS",e[e.PENDING=3]="PENDING",e[e.REQUESTING=4]="REQUESTING",e[e.CLOSING=5]="CLOSING",e[e.CLOSED=6]="CLOSED"}(s||(s={}));const n=s},2493:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C});var s=i(5916);let n;var a=i(410),o=i(993),r=i(1655),d=i(6519),l=i(9895),c=i(3241),h=i(7298),u=i(5003),p=i(3855),f=i(1507),m=i(3512),g=i(2069),v=i(3335),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const y=45e3;class w extends c.Z{construct(e){this.managers=e,this.log=(0,u.kg)("CC"),o.Z&&(this.audioAsset=null!=n?n:n=new s.Z(["call_busy.mp3","call_connect.mp3","call_end.mp3","call_incoming.mp3","call_outgoing.mp3","voip_failed.mp3"]),this.tempId=0,this.instances=new Map,this.sortedInstances=[],m.Z.addEventListener("call_update",(e=>b(this,void 0,void 0,(function*(){var t;let i=this.instances.get(e.id);switch(i&&i.setPhoneCall(e),e._){case"phoneCallDiscarded":i&&i.hangUp(null===(t=e.reason)||void 0===t?void 0:t._,!0);break;case"phoneCallAccepted":i&&i.confirmCall();break;case"phoneCallRequested":i||(i=this.createCallInstance({isOutgoing:!1,interlocutorUserId:e.admin_id}),i.overrideConnectionState(v.Z.PENDING),i.setPhoneCall(e),i.setHangUpTimeout(y,"phoneCallDiscardReasonMissed"));break;case"phoneCall":{if(!i||i.encryptionKey)break;const t=i.dh.g_a=e.g_a_or_b,s=i.dh,n=yield p.Z.invokeCrypto("sha256",t);if(!(0,l.Z)(s.g_a_hash,n)){this.log.error("Incorrect g_a_hash",s.g_a_hash,n);break}const{key:a,key_fingerprint:o}=yield this.managers.appCallsManager.computeKey(t,s.b,s.p);if(e.key_fingerprint!==o){this.log.error("Incorrect key fingerprint",e.key_fingerprint,o,t,s),i.hangUp("phoneCallDiscardReasonDisconnect");break}i.encryptionKey=a,i.joinCall();break}}})))),m.Z.addEventListener("call_signaling",(({callId:e,data:t})=>{const i=this.instances.get(e);(null==i?void 0:i.id)===e&&i.onUpdatePhoneCallSignalingData(t)})))}get currentCall(){return this.sortedInstances[0]}getCallByUserId(e){for(const[t,i]of this.instances)if(i.interlocutorUserId===e)return i}createCallInstance(e){const t=new g.Z(Object.assign({managers:this.managers},e));return t.addEventListener("state",(e=>{const i=this.currentCall;e===v.Z.CLOSED?(this.instances.delete(t.id),(0,r.Z)(this.sortedInstances,t)):(0,d.Z)(this.sortedInstances,t,"sortIndex"),e===v.Z.EXCHANGING_KEYS&&(t.wasTryingToJoin=!0);const s=void 0!==t.connectedAt;e===v.Z.EXCHANGING_KEYS||e===v.Z.CONNECTING&&s?t.setHangUpTimeout(y,"phoneCallDiscardReasonDisconnect"):t.clearHangUpTimeout(),i!==t&&i||(e===v.Z.CLOSED?t.isOutgoing||t.wasTryingToJoin?t.wasTryingToJoin&&!s?this.audioAsset.playSound("voip_failed.mp3"):this.audioAsset.playSound("phoneCallDiscardReasonBusy"===t.discardReason?"call_busy.mp3":"call_end.mp3"):this.audioAsset.stopSound():e===v.Z.PENDING?this.audioAsset.playSound(t.isOutgoing?"call_outgoing.mp3":"call_incoming.mp3",!0):e===v.Z.EXCHANGING_KEYS?this.audioAsset.playSoundIfDifferent("call_connect.mp3"):e===v.Z.CONNECTING?t.duration&&this.audioAsset.playSound("voip_connecting.mp3",!0):this.audioAsset.stopSound())})),t.addEventListener("id",((e,i)=>{void 0!==i&&this.instances.delete(i);const s=!!this.currentCall;this.instances.set(e,t),void 0===i&&this.dispatchEvent("instance",{instance:t,hasCurrent:s})})),t}startCallInternal(e,t){return b(this,void 0,void 0,(function*(){this.log("p2pStartCallInternal",e,t);const i=yield this.managers.appProfileManager.getProfile(e);if(!i)return;const{video_calls_available:s}=i.pFlags,n=this.createCallInstance({isOutgoing:!0,interlocutorUserId:e});n.requestInputSource(!0,!(!t||!s),!1),n.overrideConnectionState(v.Z.REQUESTING),n.setPhoneCall({_:"phoneCallWaiting",access_hash:"",admin_id:f.NM,date:(0,h.Z)(!0),id:--this.tempId,participant_id:e,protocol:n.protocol,pFlags:{video:t||void 0}}),this.managers.appCallsManager.generateDh().then((i=>b(this,void 0,void 0,(function*(){return n.dh=i,this.managers.appCallsManager.requestCall(e,n.protocol,n.dh.g_a_hash,t&&s)})))).then((e=>{n.overrideConnectionState(v.Z.PENDING),n.setPhoneCall(e),n.setHangUpTimeout(y,"phoneCallDiscardReasonHangup")}))}))}}const S=new w;a.GO&&(a.GO.callsController=S);const C=S},1677:(e,t,i)=>{"use strict";i.d(t,{KM:()=>s,iK:()=>n});const s=50,n=100},9078:(e,t,i)=>{"use strict";i.d(t,{Z:()=>k});var s=i(4762),n=i(1655),a=i(5953),o=i(6724),r=i(5003),d=i(1507),l=i(3512),c=i(8500),h=i(7625),u=i(3075),p=i(8479),f=i(6752),m=i(9124),g=i(4373),v=i(3773),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class y extends u.Z{constructor(e){super(e),this.negotiateThrottled=(0,o.Z)(this.negotiate.bind(this),0,!1)}createPeerConnection(){return this.connection||super.createPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",iceCandidatePoolSize:0})}createDataChannel(){if(this.dataChannel)return this.dataChannel;const e=super.createDataChannel();return e.addEventListener("open",(()=>{this.maybeUpdateRemoteVideoConstraints()})),e.addEventListener("close",(()=>{this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)})),e}createDescription(){return this.description?this.description:super.createDescription()}appendStreamToConference(){super.appendStreamToConference()}invokeJoinGroupCall(e,t,i){return b(this,void 0,void 0,(function*(){const{groupCall:s,description:n}=this,a=s.id,o=t.map((t=>{const i=function(e,t){const i=(0,v.Z)(e,t),s=t.mediaType,n={source:i.source,sourceGroups:i.sourceGroups,type:s};i.fingerprint.setup="active";const a={fingerprints:[i.fingerprint],pwd:i.pwd,ssrc:i.source,"ssrc-groups":i.sourceGroups||[],ufrag:i.ufrag};return{params:{_:"dataJSON",data:JSON.stringify(a)},source:i.source,media:t,sourceGroups:i.sourceGroups,entry:n}}(e,t);return this.sources[i.entry.type]=i.entry,i})),r=o.find((e=>"audio"===e.media.mediaType)),d=o.find((e=>"video"===e.media.mediaType));let{source:c,params:u}=r||{};const p=d||r,f={audio:r,video:d};if(n.entries.forEach((e=>{if("sendonly"===e.direction){const t=f[e.type];if(!t)return;n.setEntrySource(e,t.sourceGroups||t.source),n.setEntryPeerId(e,l.Z.myId)}})),u!==p.params){const e=JSON.parse(p.params.data);c?e.ssrc=c:delete e.ssrc,u={_:"dataJSON",data:JSON.stringify(e)}}const m=yield this.managers.appGroupCallsManager.joinGroupCall(a,u,i),g=JSON.parse(m.params.data);return g.audio=g.audio||s.connections.main.description.audio,n.setData(g),function(e,t){["audio","video"].filter((e=>t[e])).map((e=>[t[e],e])).forEach((([t,i])=>{const s=e.find((e=>e.mediaType===i));if(!s)return;const n=(e=>{const t={};return e.attributes.get("extmap").forEach((e=>{const i=e.key.split("/",1)[0];t[i]=e.value})),t})(s);(0,h.Z)(t["rtp-hdrexts"],((e,t,s)=>{n[e.id]!==e.uri&&(s.splice(t,1),console.log("[sdp] filtered extmap:",e,t,i))}))}))}(t,g),g}))}negotiateInternal(){return b(this,void 0,void 0,(function*(){const{connection:e,description:t}=this,i="new"===e.iceConnectionState&&!t.getEntryByMid("0").source,s=this.log.bindPrefix("startNegotiation");s("start");const n=yield e.createOffer({iceRestart:!1});i&&this.dataChannel&&t.createEntry("application").setDirection("sendrecv");const{sdp:a,offer:o}=function(e){const{offer:t,data:i}=e,s=(0,m.DV)(t.sdp);let n=!1;if(e.skipAddingMulticast||(n=(0,m.e6)(s)||n),(0,h.Z)(s.media,((e,t,a)=>{if(e.isSending)return;if("application"===e.mediaType)return;const o=e.mediaLine,r=o.mediaLineParts,d=(r.ids,o.toString()),l=i[e.mediaType]["payload-types"].map((e=>""+e.id));if(d!==(0,g.Px)(e.mediaType,void 0,l)){const o=(0,v.Z)(s,e),d=Object.assign({},i);d.transport=(0,p.Z)(d.transport),d.transport.ufrag=o.ufrag,d.transport.pwd=o.pwd,d.transport.fingerprints=[o.fingerprint],d.transport.candidates=[];const l=new f.Lp(o.mid,r.type);l.setPort(r.port),o.source&&l.setSource(o.sourceGroups||o.source),l.setDirection(e.direction);const c=(new g.DY).addSsrcEntry(l,d).finalize(),h=(0,m.DV)(c).media[0];a[t]=h,n=!0}})),n){const e=s.toString();t.sdp=e}return{offer:t,sdp:s}}({offer:n,data:t});s("[sdp] setLocalDescription",o.sdp),yield e.setLocalDescription(o);const r=a.media.filter((e=>"application"!==e.mediaType&&e.isSending));if(i)try{yield this.invokeJoinGroupCall(a,r,this.options)}catch(e){this.log.error("[tdweb] joinGroupCall error",e)}const d=[],l=a.bundle;(0,h.Z)(l,((e,i,s)=>{const n=t.getEntryByMid(e);n.shouldBeSkipped(!0)&&(s.splice(i,1),d.push(n))}));const c=a.media.map((e=>{const i=e.mid;let s=t.getEntryByMid(i);return s||(s=new f.Lp(i,e.mediaType),s.setDirection("inactive")),s})),u={type:"answer",sdp:t.generateSdp({bundle:l,entries:c,isAnswer:!0})};d.forEach((e=>{t.deleteEntry(e)})),s(`[sdp] setRemoteDescription signaling=${e.signalingState} ice=${e.iceConnectionState} gathering=${e.iceGatheringState} connection=${e.connectionState}`,u.sdp),yield e.setRemoteDescription(u),s("end")}))}negotiate(){let e=this.negotiating;return e||(e=super.negotiate(),this.updateConstraints&&e.then((()=>{this.maybeUpdateRemoteVideoConstraints(),this.updateConstraints=!1})),"presentation"===this.options.type&&e.then((()=>{this.connection.getTransceivers().find((e=>{var t,i;"video"===(null===(i=null===(t=e.sender)||void 0===t?void 0:t.track)||void 0===i?void 0:i.kind)&&e.sender.setParameters(Object.assign(Object.assign({},e.sender.getParameters()),{degradationPreference:"maintain-resolution"}))}))})),e)}maybeUpdateRemoteVideoConstraints(){if("open"!==this.dataChannel.readyState)return;this.log("maybeUpdateRemoteVideoConstraints");const e={colibriClass:"ReceiverVideoConstraints",constraints:{},defaultConstraints:{maxHeight:0},onStageEndpoints:[]};for(const t of this.description.entries){if("recvonly"!==t.direction||"video"!==t.type)continue;const{endpoint:i}=t;e.onStageEndpoints.push(i),e.constraints[i]={minHeight:180,maxHeight:720}}this.sendDataChannelData(e),e.onStageEndpoints.length?this.updateConstraintsInterval||(this.updateConstraintsInterval=window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this),5e3)):this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)}addInputVideoStream(e){this.groupCall.saveInputVideoStream(e,this.type),this.streamManager.addStream(e,"input"),this.appendStreamToConference()}}var w=i(2207),S=i(9337),C=i(382),L=i(5424),E=i(312),I=i(49),M=i(9585),P=i(2946),Z=i(2059),T=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class k extends c.Z{constructor(e){super(),(0,a.Z)(this,e),this.log||(this.log=(0,r.kg)("GROUP-CALL")),this.connections||(this.connections={}),this.isSpeakingMap||(this.isSpeakingMap=new Map),this.pinnedSources=[],this.participantsSsrcs=new Map,this.hadAutoPinnedSources=new Set,this.dispatchPinnedThrottled=(0,o.Z)((()=>{this.dispatchEvent("pinned",this.pinnedSource)}),0,!1),this.addEventListener("state",(e=>{e===w.Z.CLOSED&&this.cleanup()}))}get connectionState(){return this.connections.main.connection.iceConnectionState}get state(){const{connectionState:e}=this;if("closed"===e)return w.Z.CLOSED;if("connected"===e||s.IS_SAFARI&&"completed"===e){const{participant:e}=this;return e.pFlags.can_self_unmute?e.pFlags.muted?w.Z.MUTED:w.Z.UNMUTED:w.Z.MUTED_BY_ADMIN}return w.Z.CONNECTING}get participants(){return this.managers.appGroupCallsManager.getCachedParticipants(this.id)}get isSharingScreen(){return!!this.connections.presentation}get pinnedSource(){return this.pinnedSources[this.pinnedSources.length-1]}get isMuted(){return this.state!==w.Z.UNMUTED}get isClosing(){const{state:e}=this;return e===w.Z.CLOSED}get streamManager(){return this.connections.main.streamManager}get description(){return this.connections.main.description}pinSource(e){(0,n.Z)(this.pinnedSources,e),this.pinnedSources.push(e),this.dispatchPinnedThrottled()}unpinSource(e){this.hadAutoPinnedSources.delete(e),(0,n.Z)(this.pinnedSources,e),this.dispatchPinnedThrottled()}unpinAll(){this.pinnedSources.length=0,this.dispatchPinnedThrottled()}getParticipantByPeerId(e){return T(this,void 0,void 0,(function*(){return d.NM===e?this.participant:(yield this.participants).get(e)}))}toggleMuted(){return this.requestAudioSource(!0).then((()=>this.changeUserMuted(d.NM)))}changeUserMuted(e,t){return T(this,void 0,void 0,(function*(){const i=yield this.getParticipantByPeerId(e);return d.NM===e&&i.pFlags.can_self_unmute&&(t=void 0===t?!i.pFlags.muted:t),this.editParticipant(i,{muted:t})}))}getElement(e){return super.getElement(e)}getVideoElementFromParticipantByType(e,t){let i;i=e.pFlags.self?"video"===t?"main":"presentation":e[t].source_groups[0].sources[0];const s=this.getElement(i);if(!s)return;const n=s.cloneNode();return n.srcObject=s.srcObject,{video:n,source:i}}createConnectionInstance(e){return this.connections[e.type]=new y(Object.assign({groupCall:this,log:this.log.bindPrefix(e.type),managers:this.managers},e))}changeRaiseHand(e){return this.editParticipant(this.participant,{raiseHand:e})}startScreenSharingInternal(){return T(this,void 0,void 0,(function*(){try{const e="presentation",t=yield(0,C.Z)((0,S.Z)()),i=new M.Z,s=this.createConnectionInstance({streamManager:i,type:e,options:{type:e}});s.createPeerConnection().addEventListener("negotiationneeded",(()=>{s.negotiate()})),t.getVideoTracks()[0].addEventListener("ended",(()=>{this.connections.presentation&&this.stopScreenSharing()}),{once:!0}),s.createDescription(),s.addInputVideoStream(t)}catch(e){this.log.error("start screen sharing error",e)}}))}startScreenSharing(){var e;return null!==(e=this.startScreenSharingPromise)&&void 0!==e?e:this.startScreenSharingPromise=this.startScreenSharingInternal().finally((()=>{this.startScreenSharingPromise=void 0}))}stopScreenSharing(){const e=this.connections.presentation;return e?(delete this.connections.presentation,this.unpinSource("presentation"),e.closeConnectionAndStream(!0),delete this.participant.presentation,this.managers.appGroupCallsManager.saveApiParticipant(this.id,this.participant),this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id)):Promise.resolve()}toggleScreenSharing(){return this.isSharingScreen?this.stopScreenSharing():this.startScreenSharing()}startVideoSharingInternal(){return T(this,void 0,void 0,(function*(){const e={video:(0,E.Z)()};try{const t=yield(0,L.Z)(e,!1);this.connections.main.addInputVideoStream(t),yield this.editParticipant(this.participant,{videoPaused:!1,videoStopped:!1})}catch(t){this.log.error("startVideoSharing error",t,e)}}))}startVideoSharing(){var e;return null!==(e=this.startVideoSharingPromise)&&void 0!==e?e:this.startVideoSharingPromise=this.startVideoSharingInternal().finally((()=>{this.startVideoSharingPromise=void 0}))}stopVideoSharing(){return T(this,void 0,void 0,(function*(){const e=this.connections.main,t=e.streamManager.inputStream.getVideoTracks()[0];t&&((0,I.Z)(t),e.streamManager.appendToConference(e.description),yield this.editParticipant(this.participant,{videoStopped:!0}))}))}toggleVideoSharing(){return this.isSharingVideo?this.stopVideoSharing():this.startVideoSharing()}hangUp(e=!1,t=!1,i=!1){return T(this,void 0,void 0,(function*(){for(const e in this.connections)this.connections[e].closeConnectionAndStream(!t);if(this.dispatchEvent("state",this.state),!i&&!t){const t=e||(this.joined?this.connections.main.sources.audio.source:void 0);this.managers.appGroupCallsManager.hangUp(this.id,t)}}))}tryAddTrack(e){const{description:t}=this,i=super.tryAddTrack(e);if("output"===e.type){const e=t.getEntryBySource(+i);this.getParticipantByPeerId(e.peerId).then((e=>{e&&l.Z.dispatchEvent("group_call_participant",{groupCallId:this.id,participant:e})}))}return i}editParticipant(e,t){return T(this,void 0,void 0,(function*(){if(Object.keys(t).length){if(e){const i=e.pFlags.self;if(i&&void 0!==t.muted&&!this.isSharingAudio&&(delete t.muted,!Object.keys(t).length))return;const s=t.muted;void 0!==s&&e.pFlags.self&&(s?e.pFlags.muted=!0:e.pFlags.can_self_unmute&&delete e.pFlags.muted),void 0!==t.raiseHand&&(t.raiseHand?e.raise_hand_rating="1":delete e.raise_hand_rating),i&&(void 0!==t.videoStopped&&(t.videoStopped?delete e.video:e.video=(0,Z.KR)(this.connections.main.sources.video)),!e.pFlags.muted&&e.pFlags.can_self_unmute&&this.setMuted(!1),this.dispatchEvent("state",this.state))}return this.managers.appGroupCallsManager.editParticipant(this.id,e,t)}}))}onParticipantUpdate(e,t){const i=this.connections.main,{connection:s,description:n}=i,a=(0,P.Z)(e.peer),o=!!e.pFlags.left,r=this.participantsSsrcs.get(a)||[];if(e.presentation&&!o){const{source:t}=(0,Z._f)(e,"video",e.presentation.source_groups,e.presentation.endpoint);this.hadAutoPinnedSources.has(t)||(this.hadAutoPinnedSources.add(t),this.pinSource(e.pFlags.self?"presentation":t))}if(e.pFlags.self){this.participant=e,i.sources.audio.source!==e.source&&this.hangUp();let s=!1;return e.pFlags.can_self_unmute?e.pFlags.muted&&(s=!0):(this.stopScreenSharing(),this.stopVideoSharing(),s=!0),s&&this.setMuted(!0),void(t!==a&&this.dispatchEvent("state",this.state))}const d=o?[]:(0,Z.s$)(e);o?this.participantsSsrcs.delete(a):this.participantsSsrcs.set(a,d);const l=new Set;r.forEach((e=>{const t=e.source;if(!d.find((e=>e.source===t))){this.unpinSource(t);const e=n.getEntryBySource(t);e&&"inactive"!==e.direction&&(e.setDirection("inactive"),l.add(e.type))}})),d.forEach((e=>{let t=n.getEntryBySource(e.source);t?"inactive"===t.direction&&(t.setDirection(t.originalDirection),l.add(t.type)):(t=n.createEntry(e.type),n.setEntrySource(t,e.sourceGroups||e.source),n.setEntryPeerId(t,a),"video"===e.type&&t.setEndpoint(e.endpoint),t.createTransceiver(s,{direction:"recvonly"}),l.add(t.type))})),l.size&&(l.has("video")&&(i.updateConstraints=!0),i.negotiateThrottled())}}},2207:(e,t,i)=>{"use strict";var s;i.d(t,{Z:()=>n}),function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_BY_ADMIN=2]="MUTED_BY_ADMIN",e[e.CONNECTING=3]="CONNECTING",e[e.CLOSED=4]="CLOSED"}(s||(s={}));const n=s},2059:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>L,KR:()=>w,_f:()=>y,s$:()=>b});var s=i(5916);let n;var a=i(410),o=i(3241),r=i(5003),d=i(3512),l=i(9078),c=i(2207),h=i(1677),u=i(9585),p=i(9125),f=i(5424),m=i(312),g=i(6752),v=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function b(e){var t,i;return[y(0,"audio",e.source),(null===(t=e.video)||void 0===t?void 0:t.audio_source)&&y(0,"audio",e.video.audio_source),e.video&&y(0,"video",e.video.source_groups,e.video.endpoint),(null===(i=e.presentation)||void 0===i?void 0:i.audio_source)&&y(0,"audio",e.presentation.audio_source),e.presentation&&y(0,"video",e.presentation.source_groups,e.presentation.endpoint)].filter(Boolean)}function y(e,t,i,s){return(0,g.z_)(t,i,s)}function w(e,t){return e&&{_:"groupCallParticipantVideo",pFlags:{},endpoint:"",source_groups:e.sourceGroups,audio_source:t}}class S extends o.Z{construct(e){this.managers=e,this.audioAsset=null!=n?n:n=new s.Z(["group_call_connect.mp3","group_call_end.mp3","group_call_start.mp3","voip_onallowtalk.mp3"]),this.log=(0,r.kg)("GCC"),d.Z.addEventListener("group_call_update",(e=>{const{currentGroupCall:t}=this;(null==t?void 0:t.id)===e.id&&(t.groupCall=e,"groupCallDiscarded"===e._&&t.hangUp(!1,!1,!0))})),d.Z.addEventListener("group_call_participant",(({groupCallId:e,participant:t})=>{const{currentGroupCall:i}=this;(null==i?void 0:i.id)===e&&i.onParticipantUpdate(t)}))}get groupCall(){return this.currentGroupCall}setCurrentGroupCall(e){this.currentGroupCall=e,e&&this.dispatchEvent("instance",e)}startConnectingSound(){this.stopConnectingSound(),this.audioAsset.playSoundWithTimeout("group_call_connect.mp3",!0,2500)}stopConnectingSound(){this.audioAsset.stopSound(),this.audioAsset.cancelDelayedPlay()}joinGroupCall(e,t,i=!0,s,n){return v(this,void 0,void 0,(function*(){let a;return this.audioAsset.createAudio(),this.log(`joinGroupCall chatId=${e} id=${t} muted=${i} rejoin=${s}`),a=s?this.currentGroupCall.connections.main.streamManager:yield function(e,t){return i=this,s=void 0,a=function*(){const i={audio:(0,p.Z)(),video:t&&(0,m.Z)()},s=new u.Z(h.iK);try{const t=yield(0,f.Z)(i,e);s.addStream(t,"input")}catch(e){console.error("joinGroupCall getStream error",e,i),s.inputStream=new MediaStream}return s},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}(i,n),this.joinGroupCallInternal(e,t,a,i,s,n).then((()=>{const{currentGroupCall:e}=this;e.participants.then((t=>{this.currentGroupCall===e&&e.state!==c.Z.CLOSED&&t.forEach((t=>{t.pFlags.self||e.onParticipantUpdate(t)}))}))}))}))}joinGroupCallInternal(e,t,i,s,n=!1,a){return v(this,void 0,void 0,(function*(){const o=this.log.bindPrefix("joinGroupCallInternal");o("start",t);const r="main";let{currentGroupCall:h}=this;if(!h||!n){h=new l.Z({chatId:e,id:t,managers:this.managers}),h.fixSafariAudio(),h.addEventListener("state",(e=>{this.currentGroupCall===h&&e===c.Z.CLOSED&&(this.setCurrentGroupCall(null),this.stopConnectingSound(),this.audioAsset.playSound("group_call_end.mp3"),d.Z.dispatchEvent("chat_update",h.chatId))})),h.groupCall=yield this.managers.appGroupCallsManager.getGroupCallFull(t);const u=h.createConnectionInstance({streamManager:i,type:r,options:{type:r,isMuted:s,joinVideo:a,rejoin:n}}),p=u.createPeerConnection();return p.addEventListener("negotiationneeded",(()=>{u.negotiate()})),p.addEventListener("track",(e=>{o("ontrack",e),h.onTrack(e)})),p.addEventListener("iceconnectionstatechange",(()=>{h.dispatchEvent("state",h.state);const{iceConnectionState:e}=p;switch("disconnected"===e||"checking"===e||"new"===e?this.startConnectingSound():this.stopConnectingSound(),e){case"checking":case"completed":case"disconnected":case"new":break;case"closed":case"failed":h.hangUp();break;case"connected":h.joined||(h.joined=!0,this.audioAsset.playSound("group_call_start.mp3"),this.managers.appGroupCallsManager.getGroupCallParticipants(t))}})),u.createDescription(),u.createDataChannel(),u.appendStreamToConference(),this.setCurrentGroupCall(h),o("set currentGroupCall",t,h),this.startConnectingSound(),u.negotiate()}h.handleUpdateGroupCallParticipants=!1,h.updatingSdp=!1,o("update currentGroupCall",t,h)}))}}const C=new S;a.GO&&(a.GO.groupCallController=C);const L=C},9125:(e,t,i)=>{"use strict";function s(){const e={channelCount:2};return["noiseSuppression","echoCancellation","autoGainControl"].forEach((t=>{(function(e){var t;return(!!(null===(t=null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||void 0===t?void 0:t.getSupportedConstraints()))[e]})(t)&&(e[t]=!0)})),e}i.d(t,{Z:()=>s})},9337:(e,t,i)=>{"use strict";function s(e){const t={video:{width:{max:1920},height:{max:1080},frameRate:{max:30}}};return e||(t.audio=!0),t}i.d(t,{Z:()=>s})},382:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});function s(e){return t=this,i=void 0,n=function*(){const t=yield navigator.mediaDevices.getDisplayMedia(e);return t.getVideoTracks()[0].contentHint="text",t},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}},5424:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});function s(e,t){return i=this,s=void 0,a=function*(){const i=yield navigator.mediaDevices.getUserMedia(e);return i.getTracks().forEach((e=>{e.enabled=!t})),i},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}window.getStream=s},312:(e,t,i)=>{"use strict";function s(){return{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}}i.d(t,{Z:()=>s})},3773:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(8957);function n(e,t){const i=t.lookupAttributeKeys({"ice-ufrag":!0,"ice-pwd":!0,fingerprint:!0,setup:!0,ssrc:!0,mid:!0,"ssrc-group":!1});if(!i.fingerprint){const t=e.session.lines.find((e=>{var t;return"fingerprint"===(null===(t=e.parsed)||void 0===t?void 0:t.key)}));i.fingerprint=t.parsed.value}const n=function(e){const t=e.map((e=>{const[t,...i]=e.split(" ");return{_:"groupCallParticipantVideoSourceGroup",semantics:t,sources:i.map((e=>(0,s.Fk)(+e)))}}));return t.length?t:void 0}(i["ssrc-group"]),[a,o]=i.fingerprint.split(" ",2),r=i.ssrc&&(0,s.Fk)(+i.ssrc.split(" ",1)[0]);return{raw:i,ufrag:i["ice-ufrag"],pwd:i["ice-pwd"],fingerprint:{fingerprint:o,setup:i.setup,hash:a},source:r,sourceGroups:n,mid:i.mid}}},49:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(6669);function n(e){e.stop(),(0,s.Z)(e,"ended")}},6752:(e,t,i)=>{"use strict";i.d(t,{Lp:()=>o,ZP:()=>d,z_:()=>r});var s=i(1655),n=i(5953),a=i(4373);class o{constructor(e,t){this.mid=e,this.type=t,this.port=a._D}setDirection(e){return this.originalDirection||(this.originalDirection=e),this.direction=e}setPort(e){return this.port=e}setEndpoint(e){return this.endpoint=e}setPeerId(e){return this.peerId=e}createTransceiver(e,t){return(null==t?void 0:t.direction)&&this.setDirection(t.direction),this.transceiver=e.addTransceiver((0,a.pl)(this.type),t)}setSource(e){let t;if(Array.isArray(e)){if(!e[0])return;t=e,e=t[0].sources[0]}return this.sourceGroups=t,this.source=e}shouldBeSkipped(e){return e&&"inactive"===this.direction}}function r(e,t,i){let s;if(Array.isArray(t)){if(!t[0])return;s=t,t=s[0].sources[0]}return{endpoint:i,type:e,source:t,sourceGroups:s}}class d{constructor(e){this.connection=e,this.sessionId=""+Date.now(),this.maxSeenId=-1,this.entries=[],this.entriesByMid=new Map,this.entriesBySource=new Map,this.entriesByPeerId=new Map}setData(e){return(0,n.Z)(this,e)}createEntry(e){const t=""+ ++this.maxSeenId,i=new o(t,e);return this.entries.push(i),this.entriesByMid.set(t,i),i}deleteEntry(e){(0,s.Z)(this.entries,e),this.entriesByMid.delete(e.mid),this.entriesBySource.delete(e.source);const t=this.entriesByPeerId.get(e.peerId);t&&(t.delete(e),t.size||this.entriesByPeerId.delete(e.peerId))}setEntrySource(e,t){e.setSource(t),this.entriesBySource.set(e.source,e)}setEntryPeerId(e,t){e.setPeerId(t);let i=this.entriesByPeerId.get(t);i||this.entriesByPeerId.set(t,i=new Set),i.add(e)}findEntry(e){return this.entries.find(e)}findFreeSendRecvEntry(e,t){let i=this.entries.find((i=>"sendrecv"===i.direction&&i.type===e&&!(t?i.sendEntry:i.recvEntry)));return i||(i=this.createEntry(e),i.setDirection("sendrecv")),i}getEntryByMid(e){return this.entriesByMid.get(e)}getEntryBySource(e){return this.entriesBySource.get(e)}getEntriesByPeerId(e){return this.entriesByPeerId.get(e)}generateSdp(e){return a.DY.fromConference(Object.assign({conference:this},e))}}},9124:(e,t,i)=>{"use strict";i.d(t,{e6:()=>de,DV:()=>oe});var s,n,a=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},o=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class r{constructor(e,t){s.set(this,void 0),n.set(this,void 0),a(this,s,e,"f"),a(this,n,t,"f")}get session(){return o(this,s,"f")}get media(){return o(this,n,"f")}get bundle(){return this.session.lines.find((e=>{var t;return"group"===(null===(t=e.parsed)||void 0===t?void 0:t.key)})).value.split(" ").slice(1)}toString(){return this.session.lines.concat(...this.media.map((e=>e.lines))).map((e=>e.toString())).join("\r\n")+"\r\n"}}function d(e,t,i){const s=e.split(t),n=[];for(;i>0&&s.length;)n.push(s.shift()),--i;return s.length&&n.push(s.join(t)),n}s=new WeakMap,n=new WeakMap;var l,c,h,u=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},p=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class f{constructor(e,t){l.set(this,void 0),c.set(this,void 0),h.set(this,void 0),u(this,l,new Set,"f"),u(this,c,e,"f"),u(this,h,t,"f")}generate(){const e=p(this,c,"f"),t=p(this,h,"f"),i=p(this,l,"f"),s=t-e+1;let n=Math.floor(e+s*Math.random()),a=0;for(;i.has(n);)if(n=s)return null;return i.add(n),n}add(e){p(this,l,"f").add(e)}}l=new WeakMap,c=new WeakMap,h=new WeakMap;var m,g,v=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},b=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class y{constructor(e,t){m.set(this,void 0),g.set(this,void 0),v(this,m,e,"f"),v(this,g,t,"f")}get key(){return b(this,m,"f")}get value(){return b(this,g,"f")}}m=new WeakMap,g=new WeakMap;var w,S,C,L,E=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},I=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class M{constructor(e,t,i,s){w.set(this,void 0),S.set(this,void 0),C.set(this,void 0),L.set(this,void 0),E(this,w,e,"f"),E(this,S,t,"f"),E(this,C,i,"f"),E(this,L,s,"f")}get type(){return I(this,w,"f")}get port(){return I(this,S,"f")}get protocol(){return I(this,C,"f")}get ids(){return I(this,L,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}w=new WeakMap,S=new WeakMap,C=new WeakMap,L=new WeakMap;var P,Z,T,k,x=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},A=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class _{constructor(e,t){if(P.set(this,void 0),Z.set(this,void 0),T.set(this,void 0),k.set(this,void 0),x(this,P,e,"f"),"string"==typeof t){if(x(this,Z,t,"f"),"m"===e){const e=t.split(" ");x(this,T,new M(e[0],e[1],e[2],e.slice(3)),"f")}else if("a"===e){const e=d(t,":",1);t=e[0],x(this,k,1===e.length?new y(t,null):new y(t,e[1]),"f")}}else t instanceof M?(x(this,T,t,"f"),x(this,Z,t.toString(),"f")):t instanceof y&&(x(this,k,t,"f"),x(this,Z,t.value?`${t.key}:${t.value}`:t.key,"f"))}get key(){return A(this,P,"f")}get value(){return A(this,Z,"f")}get parsed(){return A(this,k,"f")}get mediaLineParts(){return A(this,T,"f")}toString(){return`${this.key}=${this.value}`}}P=new WeakMap,Z=new WeakMap,T=new WeakMap,k=new WeakMap;var F,D,R,B,N,O,U=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},H=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class z{constructor(e,t,i=":",s=!1){F.set(this,void 0),D.set(this,void 0),R.set(this,void 0),B.set(this,void 0),N.set(this,void 0),O.set(this,void 0),U(this,F,e,"f"),U(this,D,t,"f"),U(this,R,i,"f"),U(this,N,s,"f"),U(this,B,s?new Map:null,"f"),U(this,O,s?[]:null,"f")}get lines(){return H(this,D,"f")}get value(){return H(this,N,"f")||!this.lines.length?null:this.lines[0]}get exists(){return!H(this,N,"f")}get key(){return H(this,F,"f")}get keys(){return z.fill(this),H(this,O,"f")}forEach(e){z.fill(this),H(this,B,"f").forEach(e)}get(e){return z.fill(this),H(this,B,"f").get(e)||new z(e,[],":",!0)}static fill(e){if(null!==H(e,B,"f"))return;const t=new Map;e.lines.forEach((i=>{const[s,n]=d(i,H(e,R,"f"),1),a=t.get(s)||[];t.set(s,[...a,n||""])}));const i=U(e,B,z.makeAttributes(t),"f");U(e,O,Array.from(i.keys()),"f")}static makeAttributes(e){const t=new Map;return e.forEach(((e,i)=>{t.set(i,new z(i,e))})),t}}F=new WeakMap,D=new WeakMap,R=new WeakMap,B=new WeakMap,N=new WeakMap,O=new WeakMap;var j,G,V=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},K=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class W{constructor(e){j.set(this,void 0),G.set(this,void 0),V(this,j,e,"f"),V(this,G,new Map,"f"),W.fillAttributes(this)}get(e){return K(this,G,"f").get(e)||new z(e,[]," ",!0)}static fillAttributes(e){const t=new Map;K(e,j,"f").forEach((e=>{if("a"===e.key){const{key:i,value:s}=e.parsed;let n=t.get(i);n||(n=[],t.set(i,n)),n.push(s||"")}})),t.forEach(((t,i)=>{K(e,G,"f").set(i,new z(i,t," ",!1))}))}}j=new WeakMap,G=new WeakMap;var $,q,Q,Y,X=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},J=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class ee{constructor(e){$.set(this,void 0),q.set(this,void 0),Q.set(this,void 0),Y.set(this,void 0),X(this,$,e,"f"),X(this,q,e[0],"f"),X(this,Q,X(this,Y,null,"f"),"f")}get lines(){return J(this,$,"f")}get mediaLine(){return J(this,q,"f")}get mediaLineParts(){return J(this,q,"f").mediaLineParts}get mediaType(){return this.mediaLineParts.type}get direction(){if(!J(this,Y,"f")){const e=this.attributes;let t;t=e.get("sendonly").exists?"sendonly":e.get("recvonly").exists?"recvonly":e.get("inactive").exists?"inactive":"sendrecv",X(this,Y,t,"f")}return J(this,Y,"f")}get isSending(){return"sendrecv"===this.direction||"sendonly"===this.direction}get isReceiving(){return"sendrecv"===this.direction||"recvonly"===this.direction}get attributes(){return J(this,Q,"f")||X(this,Q,new W(this.lines),"f"),J(this,Q,"f")}get mid(){return this.attributes.get("mid").value}lookupAttributeKeys(e){const t={};for(const i in e){const s=this.attributes.get(i),n=!e[i];t[i]=s?n?s.lines:s.value:n?[]:void 0}return t}}$=new WeakMap,q=new WeakMap,Q=new WeakMap,Y=new WeakMap;var te,ie,se=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},ne=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class ae{constructor(e){te.set(this,void 0),ie.set(this,void 0),se(this,te,e,"f"),se(this,ie,e.filter((e=>"o"===e.key)).map((e=>e.value.split(" ")[1]))[0],"f")}get lines(){return ne(this,te,"f")}get sessionId(){return ne(this,ie,"f")}}function oe(e){function t(){i?n.push(new ee(s)):i=new ae(s)}let i=null,s=[];const n=[];return e.split(/\r?\n/).forEach((e=>{if(!function(e){return/^[\s\xa0]*$/.test(e)}(e)){const i=re(e);"m"===i.key&&(t(),s=[]),s.push(i)}})),t(),new r(i,n)}function re(e){const t=d(e,"=",1);return new _(t[0],t[1])}function de(e){let t;return e.media.forEach(((i,s)=>{if("video"===i.mediaType&&i.isSending&&!i.attributes.get("ssrc-group").get("SIM").exists){t||(t=new f(2,4294967295));const n=i.attributes.get("ssrc-group").get("FID").value.split(" "),a=i.lines;n.forEach((e=>t.add(+e)));const o=[n[0],t.generate(),t.generate()],r=[n[1],t.generate(),t.generate()];a.push(re("a=ssrc-group:SIM "+o.join(" ")));const d=i.attributes.get("ssrc").get(n[0]).lines;o.forEach(((e,t)=>{const i=r[t];t>0&&(a.push(re("a=ssrc-group:FID "+e+" "+i)),d.forEach((t=>{a.push(re("a=ssrc:"+e+" "+t))})),d.forEach((e=>{a.push(re("a=ssrc:"+i+" "+e))})))})),e.media[s]=new ee(a)}})),!!t}te=new WeakMap,ie=new WeakMap},4373:(e,t,i)=>{"use strict";i.d(t,{DY:()=>c,Px:()=>l,_D:()=>o,pl:()=>r});var s=i(4762),n=i(630),a=i(8957);const o="9";function r(e){return"screencast"===e?"video":e}function d(e){return"application"===e?"DTLS/SCTP":"UDP/TLS/RTP/SAVPF"}function l(e,t=o,i){const s=d(e);return`m=${r(e)} ${t} ${s} ${i.join(" ")}`}class c extends n.Z{addCandidate(e){return this.add(function(e){const t=[];return t.push("a=candidate:"),t.push(`${e.foundation} ${e.component} ${e.protocol.toUpperCase()} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`),void 0!==e["rel-addr"]&&t.push(` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t.push(` generation ${e.generation}`),t.join("")}(e))}addHeader(e,t){const i=t.join(" ");return this.add("v=0",`o=- ${e} 2 IN IP4 0.0.0.0`,"s=-","t=0 0","a=extmap-allow-mixed",`a=group:BUNDLE ${i}`,"a=ice-options:trickle","a=msid-semantic:WMS *")}addTransport(e,t){this.add(`a=ice-ufrag:${e.ufrag}`,`a=ice-pwd:${e.pwd}`,"a=ice-options:trickle");for(const t of e.fingerprints)this.add(`a=fingerprint:${t.hash} ${t.fingerprint}`,`a=setup:${t.setup}`);if(!t&&e.candidates)for(const t of e.candidates)this.addCandidate(t);return this}addSsrc(e){let t="stream",{type:i,sourceGroups:s}=e;const n=(0,a.h)(e.source);t+=n,i+=n;const o=e=>{this.add(`a=ssrc:${e} cname:${t}`,`a=ssrc:${e} msid:${t} ${i}`,`a=ssrc:${e} mslabel:${t}`,`a=ssrc:${e} label:${i}`)};return(()=>{this.add(`a=msid:${t} ${i}`)})(),(null==s?void 0:s.length)?s.forEach((e=>{if(e.sources.length){const t=e.sources.map(a.h);this.add(`a=ssrc-group:${e.semantics} ${t.join(" ")}`),t.forEach(o)}})):o(n),this}addSsrcEntry(e,t,i){const s=(...e)=>this.add(...e),{type:n,mid:a,direction:o,port:c}=e,h=t.transport,u="application"===n,p=u?void 0:t[n],f="inactive"===o;if(e.shouldBeSkipped(i))return s(`m=${r(n)} 0 ${d(n)} 0`,"c=IN IP4 0.0.0.0","a=inactive",`a=mid:${a}`);const m=u?[{id:5e3}]:p["payload-types"],g=m.map((e=>e.id));s(l(n,c,g),"c=IN IP4 0.0.0.0",`a=rtcp:${c} IN IP4 0.0.0.0`),h["rtcp-mux"]&&s("a=rtcp-mux"),s(`a=mid:${a}`);let v=o;if("sendrecv"===o||!i||f||u||(v="sendonly"===o?"recvonly":"sendonly"),s(`a=${v}`),this.addTransport(h),u)s(`a=sctpmap:${m[0].id} webrtc-datachannel 256`);else{const e=p["rtp-hdrexts"];(null==e?void 0:e.length)&&e.forEach((e=>{s(`a=extmap:${e.id} ${e.uri}`)})),m.forEach((e=>{s(`a=rtpmap:${e.id} ${e.name}/${e.clockrate}${e.channels&&e.channels>1?`/${e.channels}`:""}`);const t=e.parameters;if(Array.isArray(t))t.length&&console.error("parameters is array???",t);else if(t&&Object.keys(t).length){const i=[];for(const e in t)i.push(`${e}=${t[e]}`);s(`a=fmtp:${e.id} ${i.join(";")}`)}const i=e["rtcp-fbs"];(null==i?void 0:i.length)&&i.forEach((t=>{s(`a=rtcp-fb:${e.id} ${t.type}${t.subtype?" "+t.subtype:""}`)}))}))}return!e.source||"sendonly"!==v&&"sendrecv"!==v||this.addSsrc(e),this}addConference(e){const{conference:t,entries:i,bundle:n,isAnswer:a}=e;this.addHeader(t.sessionId,n),s.IS_FIREFOX&&this.addTransport(t.transport);for(const e of i)this.addSsrcEntry((a?e.recvEntry||e.sendEntry:e.sendEntry||e.recvEntry)||e,t,a);return this}static fromConference(e){return(new c).addConference(e).finalize()}}},9585:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3241),n=i(5003),a=i(1677),o=i(49),r=i(4373),d=i(8957);class l{constructor(e,t){const i=this.streamSource=e.createMediaStreamSource(t),s=this.analyser=e.createAnalyser();this.gain=e.createGain(),s.minDecibels=-100,s.maxDecibels=-30,s.smoothingTimeConstant=.05,s.fftSize=1024,i.connect(s)}}class c{constructor(e){this.interval=e,this.getAmplitude=e=>{const{streamAnalyser:t,stream:i,track:s,source:n,type:a}=e,o=t.analyser;if(!o)return;const r=new Uint8Array(o.frequencyBinCount);return o.getByteFrequencyData(r),{type:a,source:n,stream:i,track:s,value:(0,d.UN)(r)}},this.analyse=()=>{const e=this.counter%3==0,t=(e?this.items:this.items.filter((e=>"input"===e.type))).filter((e=>"audio"===e.kind)).slice(0,a.KM).map(this.getAmplitude);++this.counter>=1e3&&(this.counter=0),c.ANALYSER_LISTENER.dispatchEvent("amplitude",{amplitudes:t,type:e?"all":"input"})},this.context=new(window.AudioContext||window.webkitAudioContext),this.items=[],this.outputStream=new MediaStream,this.inputStream=new MediaStream,this.counter=0,this.log=(0,n.kg)("SM"),this.direction="sendonly",this.canCreateConferenceEntry=!0,this.types=["audio","video"]}addStream(e,t){e.getTracks().forEach((i=>{this.addTrack(e,i,t)}))}addTrack(e,t,i){this.log("addTrack",i,t,e);const{context:s,items:n,inputStream:a,outputStream:o}=this,r=t.kind,d=c.getSource(e,i);switch(i){case"input":a?a.addTrack(t):this.inputStream=e;break;case"output":for(let e=0;e{this.removeTrack(t)}),{once:!0}),this.items.push(e)}hasInputTrackKind(e){return this.items.find((t=>"input"===t.type&&t.kind===e))}static getSource(e,t){return"input"===t?e.source||e.id:""+(0,d.Fk)(+e.id.substring(6))}removeTrack(e){this.log("removeTrack",e);const{items:t}=this;let i=!1;for(let s=0,n=t.length;!i&&s[e,n])),o=t.getTracks();for(const[t,n]of a){let a=e.findEntry((e=>e.direction===i&&e.type===t));if(!a){if(!s)continue;a=e.createEntry(t)}let{transceiver:d}=a;d||(d=a.createTransceiver(e.connection,n)),a.direction!==d.direction&&(d.direction=a.direction);const l=(0,r.pl)(t),c=o.findIndex((e=>e.kind===l)),h=-1!==c?o.splice(c,1)[0]:void 0,u=d.sender;u.track!==h&&u.replaceTrack(h).catch((e=>{this.log.error(e)}))}}stop(){try{this.inputStream.getTracks().concat(this.outputStream.getTracks()).forEach((e=>{(0,o.Z)(e)}))}catch(e){this.log.error(e)}}}c.ANALYSER_LISTENER=new s.Z},630:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e="\r\n"){this.joiner=e,this.lines=[],this.newLine=[]}add(...e){return this.lines.push(...e),this}push(e){return this.newLine.push(e),this}addJoined(e=""){return this.add(this.newLine.join(e)),this.newLine=[],this}join(){return this.lines.join(this.joiner)}finalize(){return this.join()+this.joiner}}},8957:(e,t,i)=>{"use strict";function s(e){return e<<0}function n(e){return e>>>0}function a(e,t=3){if(!e)return 0;const{length:i}=e;let s=0;for(let t=0;ts,UN:()=>a,h:()=>n})},3785:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(7197),n=i(1229);const a=new RegExp(`(^${n.Z})`);function o(e,t=!1){const i=(e||"").trim().split(" ");if(!i[0])return{text:"",entities:[]};const n=[],o=i[0].match(a),r=(null==o?void 0:o[0])||i[0][0];o&&n.push((0,s.Z)(r));const d=i.length;if(t||1===d)return{text:r,entities:n};const l=i[d-1].match(a),c=(null==l?void 0:l[0])||i[d-1][0];return l&&n.push(Object.assign(Object.assign({},(0,s.Z)(c)),{offset:r.length})),{text:r+c,entities:n}}},7197:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(671);function n(e){return{_:"messageEntityEmoji",offset:0,length:e.length,unicode:(0,s.w1)(e).join("-").replace(/-?fe0f/g,"")}}},1171:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2423);function n(e){return e?e.match(s.E):null}},2521:(e,t,i)=>{"use strict";function s(e){return e.target="_blank",e.rel="noopener noreferrer",e}i.d(t,{Z:()=>s})},5798:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8115),n=i(3785);function a(e,t){const{text:i,entities:a}=(0,n.Z)(e,t);return(0,s.Z)(i,void 0,a)}},3066:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(5400);function a(e,t={}){if(!e)return(0,n.ZP)("");let i=t.entities;return i&&!s.Z.premium&&t.wrappingForPeerId!==s.Z.myId&&(i=i.filter((e=>"messageEntityCustomEmoji"!==e._))),(0,n.ZP)(e,Object.assign(Object.assign({},t),{entities:i,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}))}},8115:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(6535),n=i(5400);function a(e,t=!1,i){return e?(null!=i||(i=(0,s.Z)(e).filter((e=>"messageEntityEmoji"===e._))),(0,n.ZP)(e,{entities:i,wrappingDraft:t})):(0,n.ZP)("")}},5400:(e,t,i)=>{"use strict";i.d(t,{LD:()=>_,KZ:()=>F,SZ:()=>G,ZP:()=>j,Cx:()=>K,Hc:()=>V});var s=i(2423),n=i(3447),a=i(9976),o=i(8479),r=i(4056),d=i(1379),l=i(6535),c=i(2521),h=i(3591);const u={};a.Z&&(u[""]=!0,[["14","🫱🏻"]].forEach((([e,t])=>{u[e]=function(e){const t=document.createElement("span");t.classList.add("emoji"),document.body.appendChild(t),t.innerText=e;const i=t.offsetWidth;t.innerText="❤️";const s=t.offsetWidth;return document.body.removeChild(t),Math.abs(i-s)<5}(t)})));const p=u;var f=i(2738),m=i(3512),g=i(4755),v=i(3541),b=i(3772),y=i(5814),w=i(2153),S=i(393),C=i(8938),L=i(319),E=i(8497),I=i(4881),M=i(3624),P=i(5565),Z=i(6854),T=i(645),k=i(4497);const x=new ResizeObserver((e=>{for(const t of e)t.target.parentElement.setDimensionsFromRect(t.contentRect)})),A=new w.Z;class _ extends HTMLElement{constructor(){super(),this.paused=!0,this.classList.add("custom-emoji")}get docId(){return this.dataset.docId}static create(e){const t=new _;return t.dataset.docId=""+e,t}get isConnected(){var e,t;return null!==(t=null===(e=this.placeholder)||void 0===e?void 0:e.isConnected)&&void 0!==t?t:super.isConnected}connectedCallback(){this.player&&y.Z.addAnimation(this,this.renderer.animationGroup,void 0,!0)}disconnectedCallback(){var e;!this.isConnected&&(null===(e=this.renderer)||void 0===e?void 0:e.isSelectable)&&this.clear()}destroy(){this.clear()}clear(e=!0){var t;if(this.clean)return;this.clean=!0,this.pause();const{syncedPlayer:i}=this;if(i&&i.pausedElements.delete(this),null===(t=this.middlewareHelper)||void 0===t||t.clean(),this.renderer){const t=this.renderer.customEmojis.get(this.docId);(null==t?void 0:t.delete(this))&&!t.size&&(this.renderer.customEmojis.delete(this.docId),this.renderer.playersSynced.delete(t)),e&&(this.renderer.isSelectable?this.replaceChildren(G(!0)):this.replaceChildren())}this.player&&y.Z.removeAnimationByPlayer(this),A&&A.delete({div:this}),this.elements=this.renderer=this.player=this.syncedPlayer=void 0}pause(){this.paused||(this.paused=!0,this.player instanceof HTMLVideoElement&&!this.syncedPlayer&&(this.renderer.lastPausedVideo=this.player,this.player.pause()),this.syncedPlayer&&!this.syncedPlayer.pausedElements.has(this)&&(this.syncedPlayer.pausedElements.add(this),this.syncedPlayer.player&&this.syncedPlayer.pausedElements.size===this.syncedPlayer.middlewares.size&&this.syncedPlayer.player.pause()))}play(){var e;this.paused&&(this.paused=!1,this.player instanceof HTMLVideoElement&&(this.player.currentTime=(null===(e=this.renderer.lastPausedVideo)||void 0===e?void 0:e.currentTime)||this.player.currentTime,this.player.play().catch(L.Z)),this.syncedPlayer&&this.syncedPlayer.pausedElements.has(this)&&(this.syncedPlayer.pausedElements.delete(this),this.syncedPlayer.pausedElements.size!==this.syncedPlayer.middlewares.size&&this.player.play()))}remove(){this.clear()}get autoplay(){return!0}}class F extends HTMLElement{constructor(){super(),this.classList.add("custom-emoji-renderer"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("custom-emoji-canvas"),this.context=this.canvas.getContext("2d"),this.append(this.canvas),this.playersSynced=new Map,this.clearedElements=new WeakSet,this.customEmojis=new Map,this.animationGroup="EMOJI",this.isCanvasClean=!1}connectedCallback(){B.has(this)||(x.observe(this.canvas),B.add(this),this.connectedCallback=void 0)}disconnectedCallback(){var e;!this.isConnected&&this.auto&&(null===(e=this.destroy)||void 0===e||e.call(this),this.disconnectedCallback=void 0)}destroy(){var e;x.unobserve(this.canvas),this.customEmojis.forEach((e=>{e.forEach((e=>{e.clear()}))})),B.delete(this),this.playersSynced.clear(),null===(e=this.middlewareHelper)||void 0===e||e.clean(),this.customEmojis.clear(),this.destroy=this.lastPausedVideo=void 0}getOffsets(e=new Map){if(!this.playersSynced.size)return e;const t=(0,E.Z)(this,"scrollable")||this.offsetParent;if(!t)return e;const i=t.getBoundingClientRect(),s=this.getBoundingClientRect();for(const n of this.playersSynced.keys()){const a=Array.from(n),o=this.isSelectable?a.map((e=>e.placeholder)):a,{visible:r}=(0,I.Z)({overflowElement:t,overflowRect:i,elements:o,extraSize:2.5*this.size.height}),d=r.map((({rect:e})=>({top:e.top-s.top,left:e.left-s.left,width:e.width})));d.length&&e.set(n,d)}return e}clearCanvas(){if(this.isCanvasClean)return;const{context:e,canvas:t}=this;e.clearRect(0,0,t.width,t.height),this.isCanvasClean=!0}render(e){const{context:t,canvas:i,isDimensionsSet:s}=this;s||this.setDimensionsFromRect(void 0,!1),this.isCanvasClean=!1;const{width:n,height:a,dpr:o}=i;for(const[i,s]of e){const e=this.playersSynced.get(i),a=O.get(e)||(e instanceof HTMLVideoElement?e:void 0);if(!a)continue;const r=a instanceof ImageData;let d,l;e instanceof HTMLVideoElement?(d=this.size.width*o,l=this.size.height*o):(d=a.width,l=a.height);const c=Math.round(s[0].width*o);c!==d&&(d=c,l=c);const h=n-d;this.clearedElements.has(i)||this.isSelectable||(this.isSelectable?i.forEach((e=>{var t;null!==(t=e.lastChildWas)&&void 0!==t||(e.lastChildWas=e.lastChild),(0,P.Z)(e,e.firstChild)})):i.forEach((e=>{e.replaceChildren()})),this.clearedElements.add(i)),s.forEach((({top:e,left:i})=>{e=Math.round(e*o),(i=Math.round(i*o))<0||i>h||(r?t.putImageData(a,i,e):t.drawImage(a,i,e,d,l))}))}}checkForAnyFrame(){for(const e of this.playersSynced.values())if(O.has(e)||e instanceof HTMLVideoElement)return!0;return!1}remove(){super.remove()}setDimensionsFromRect(e=this.lastRect,t=!0){const{canvas:i}=this,{dpr:s}=i;if(this.lastRect!==e&&(this.lastRect=e),!e||!s||this.ignoreSettingDimensions)return;const{width:n,height:a}=e,o=Math.floor(Math.round(n*s)),r=Math.floor(Math.round(a*s));i.width===o&&i.height===r||(i.width=o,i.height=r,this.isDimensionsSet=!0,this.isCanvasClean=!0,(this.forceRenderAfterSize||this.isSelectable&&t)&&(this.forceRenderAfterSize=void 0,this.forceRender()))}forceRender(){this.isDimensionsSet&&(U(new Set([this]))||this.clearCanvas())}add(e,t,i,s){const n=this;if(e.forEach(((t,i)=>{let s=this.customEmojis.get(i);s?this.clearedElements.delete(s):this.customEmojis.set(i,s=new Set);for(const e of t)s.has(e)?t.delete(e):(e.clean=!1,e.renderer=n,e.elements=s,e.middlewareHelper=this.middlewareHelper.get().create(),s.add(e),e.lastChildWas&&!e.lastChildWas.parentNode&&e.append(e.lastChildWas));t.size||e.delete(i)})),!e.size)return;const a=!(t||!1===t||!A),o=Array.from(e.keys()),r=m.Z.managers,d=this.middlewareHelper.get(),l=this.size;return r.appEmojiManager.getCachedCustomEmojiDocuments(o).then((c=>{if(d&&!d())return;const h=[],u=(o,c)=>{const h=o.id,u=e.get(h),p=n.customEmojis.get(h),f=2===o.sticker,m="video/webm"===o.mime_type&&!S.Z,g=(f||3===o.sticker&&this.isSelectable)&&!i&&!m,w=[],E=Array.from(u),I=(0,v.ZP)({div:E,doc:o,width:l.width,height:l.height,loop:!0,play:D,managers:r,isCustomEmoji:!0,group:"none",loadPromises:w,middleware:d,exportLoad:a||!1===t?2:1,needFadeIn:!1,loadStickerMiddleware:g&&d?d.create().get((()=>!!P.middlewares.size)):void 0,static:m,onlyThumb:i,withThumb:null!=s?s:!n.clearedElements.has(p)&&void 0,syncedVideo:this.isSelectable});c&&I.then((()=>c.push(...w)));const M={elements:u};if(1===o.sticker||i||m)return this.isSelectable&&(M.onRender=()=>Promise.all(w).then((()=>{d&&!d()||E.forEach((e=>{const{placeholder:t}=e;t.src=e.firstElementChild.src}))}))),I.then((e=>Object.assign(Object.assign({},e),M)));let P;M.onRender=e=>Promise.all(w).then((()=>{var t;if(d&&!d()||!o.animated)return;const i=Array.isArray(e)?e:[e],s=Array.isArray(i)?i[0]:i;if((0,C.Z)(s),E.forEach(((e,t)=>{const s=i[t]||i[0];e.player=s,P&&(e.syncedPlayer=P,e.paused?e.syncedPlayer.pausedElements.add(e):s.paused&&s.play()),e.isConnected&&y.Z.addAnimation(e,e.renderer.animationGroup,void 0,!0)})),(s instanceof b.Z||s instanceof HTMLVideoElement&&this.isSelectable)&&(P.player=s,n.playersSynced.set(p,s)),s instanceof b.Z?(s.group=n.animationGroup,null!==(t=s.overrideRender)&&void 0!==t||(s.overrideRender=e=>{O.set(s,e)})):HTMLVideoElement,g){const e=(0,b.a)(this.size.width,this.size.height);n.canvas.dpr=e,H()}}));const Z=[h,l.width,l.height].join("-");if(g){P=N.get(Z),P||(P={player:void 0,middlewares:new Set,pausedElements:new Set,key:Z},N.set(Z,P));for(const e of u){const t=e.middlewareHelper.get();P.middlewares.add(t),t.onClean((()=>{var i,s;if(P.middlewares.delete(t),!P.middlewares.size){if(P.player){const t=O.get(P.player);if(t&&(null===(s=(i=t).close)||void 0===s||s.call(i),O.delete(P.player)),O.delete(P.player),P.player instanceof b.Z)P.player.overrideRender=L.Z,P.player.remove();else if(P.player instanceof HTMLVideoElement){const t=T.Z.generateName(""+e.docId,0,0,void 0,void 0);delete v._i[t]}P.player=void 0}N.get(P.key)===P&&N.delete(P.key)&&!N.size&&z()}}))}}return I.then((e=>Object.assign(Object.assign({},e),M)))},p=[],f=c.map(((e,t)=>{if(e)return u(e,h);p.push(o[t])})).filter(Boolean),m=p.length?r.appEmojiManager.getCustomEmojiDocuments(p).then((e=>d&&!d()?[]:e.filter(Boolean).map((e=>u(e))))):Promise.resolve([]),g=e=>Promise.all(e).then((e=>{const t=e.map((({load:e,onRender:t,elements:i})=>{if(!e)return;const s=()=>e().then(t);if(!a)return s();i.forEach((e=>{A.push({div:e,load:()=>(i.forEach((e=>{A.delete({div:e})})),s())})}))}));return Promise.all(t)})),w=()=>{if(d&&!d())return;const e=g(f),t=m.then((e=>g(e)));return Promise.all([e,t])};return t?t.push({div:n.canvas,load:w}):w(),Promise.all(f).then((()=>Promise.all(h))).then((()=>{}))}))}static create(e){const t=new F;t.animationGroup=e.animationGroup,t.size=e.customEmojiSize||g.Z.active.customEmoji,t.isSelectable=e.isSelectable,e.wrappingDraft&&(t.contentEditable="false",t.style.height="inherit");let i=e.middleware;return i?(t.middlewareHelper=i.create(),i=t.middlewareHelper.get(),i.onDestroy((()=>{var e;null===(e=t.destroy)||void 0===e||e.call(t)}))):(t.auto=!0,t.middlewareHelper=(0,M.k)()),t}}const D=!0;let R;const B=new Set,N=new Map,O=new Map,U=(e=B)=>{const t=Array.from(e).filter((e=>e.isConnected&&e.checkForAnyFrame()&&!e.ignoreSettingDimensions));if(!t.length)return!1;const i=t.map((e=>{const t=[...e.playersSynced.values()].reduce(((e,t)=>e+ +!!t.paused),0);if(e.playersSynced.size===t)return;const i=e.getOffsets();return i.size?[e,i]:void 0})).filter(Boolean);for(const[e]of i)e.clearCanvas();for(const[e,t]of i)e.render(t);return!0},H=()=>{R||(R=window.setInterval(U,16.666666666666668),U())},z=()=>{R&&(clearInterval(R),R=void 0)};function j(e,t={}){var i,u,m,g,v,b,y,w;const S=document.createDocumentFragment();if(!e)return S;const C=null!==(i=t.nasty)&&void 0!==i?i:t.nasty={i:0,usedLength:0,text:e},L=(e,i)=>{const s=document.createElement("span");return t.wrappingDraft&&(s.contentEditable="false"),s.classList.add("input-something"),s.append(e),(D||S).append(s),e.classList.add("input-selectable"),!i&&e.append(G(!0)),I.add(s),s};t.isSelectable||(t.isSelectable=t.wrappingDraft);const E=null!==(u=t.customEmojis)&&void 0!==u?u:t.customEmojis=new Map,I=null!==(m=t.customWraps)&&void 0!==m?m:t.customWraps=new Set,M=null!==(g=t.entities)&&void 0!==g?g:t.entities=(0,l.Z)(C.text),P=null!==(v=t.passEntities)&&void 0!==v?v:t.passEntities={},Z=null!==(b=t.contextSite)&&void 0!==b?b:t.contextSite="Telegram",T="Telegram"!==Z,x=C.text.length,A=M.length;let D;for(;C.i=x){if("messageEntityCaret"!==e._)continue}else e.offset+e.length>x&&(e=(0,o.Z)(e),e.length=x-e.offset);e.length&&(C.lastEntity=e);let i=M[C.i+1];const l=e.offset,u=l+e.length,m=Math.min(u,null!==(y=null==i?void 0:i.offset)&&void 0!==y?y:65535),g=C.text.slice(l,u);let v=C.text.slice(l,m);C.usedLengthv.length&&b?b:S,t.voodoo)return S}var R;if(C.lastEntity&&(C.usedLength=C.lastEntity.offset+C.lastEntity.length),C.usedLength{const t=document.createElement("span");return t.classList.add(e?"input-filler2":"input-filler"),t.textContent=Z.Z,t};function V(e){var t;if((null==e?void 0:e.textContent)!==Z.Z||"false"===(null===(t=null==e?void 0:e.getAttribute)||void 0===t?void 0:t.call(e,"contenteditable"))){if(!e||e.textContent!==Z.Z||e.firstElementChild)return 2;if(e.nodeType===e.ELEMENT_NODE)return 1}return 0}function K(e){const t=(e,t,i)=>{const s=V(t);2===s?e[i](G()):1===s&&t.appendChild(document.createTextNode(Z.Z))};for(const i of e){const{previousSibling:e,nextSibling:s}=i;t(i,e,"before"),t(i,s,"after")}}window.wrapRichText=j},4497:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3591);function n(e){const{url:t,onclick:i}=(0,s.Z)(e),n=document.createElement("a");return n.href=t,i&&n.setAttribute("onclick",`${i}(this)`),n}},1447:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(5814),n=i(410),a=i(5418),o=i(5003),r=i(3772),d=i(7328),l=i(3241);class c extends l.Z{constructor(e){super(),this.worker=e,this.worker.onerror=e=>{try{this.dispatchEvent("workerError",e),this.cleanup(),this.terminate()}catch(e){}},this.worker.onmessage=e=>{this.dispatchEvent(e.data.queryMethodListener,...e.data.queryMethodArguments)}}postMessage(e){this.worker.postMessage(e)}terminate(){this.worker.terminate()}sendQuery(e,t){this.worker.postMessage({queryMethod:e.shift(),queryMethodArguments:e},d.Z?t:void 0)}}var h=i(8975),u=i(3855);const p="undefined"!=typeof WebAssembly;var f=i(5471),m=i(4159);const g=new class{constructor(){this.loadPromise=p?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=m.Z.threads,this.players={},this.playersByCacheName={},this.workers=[],this.curWorkerNum=0,this.log=(0,o.kg)("LOTTIE",o.v9.Error),this.onPlayerLoaded=(e,t,i)=>{const s=this.players[e];s?(this.log.debug("onPlayerLoaded"),s.onLoad(t,i)):this.log.warn("onPlayerLoaded on destroyed player:",e,t)},this.onFrame=(e,t,i)=>{const s=this.players[e];s?(void 0!==s.clamped&&i instanceof Uint8ClampedArray&&(s.clamped=i),s.renderFrame(i,t)):this.log.warn("onFrame on destroyed player:",e,t)},this.onPlayerError=(e,t)=>{const i=this.players[e];i&&s.Z.getAnimations(i.el[0]).forEach((e=>{s.Z.removeAnimation(e)}))}}getAnimation(e){for(const t in this.players)if(this.players[t].el.includes(e))return this.players[t];return null}setLoop(e){let t=!1;for(const i in this.players){const s=this.players[i];s._loop&&s.loop!==e&&(t=!0,s.loop=e,s.autoplay=s._autoplay)}return t}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise(((e,t)=>{let s=this.workersLimit;for(let n=0;n{this.log("worker #"+n+" ready"),o.addEventListener("frame",this.onFrame),o.addEventListener("loaded",this.onPlayerLoaded),o.addEventListener("error",this.onPlayerError),--s,s||(this.log("workers ready"),e(),this.loaded=!0)}),{once:!0}),o.addEventListener("workerError",(e=>{t("rlottie load error: "+e.message),this.loaded=!1}),{once:!0})}}))}makeAssetUrl(e){return"assets/tgs/"+e+".json"}loadAnimationAsAsset(e,t){return this.loadAnimationFromURL(e,this.makeAssetUrl(t))}loadAnimationDataFromURL(e){return p?(this.loadLottieWorkers(),fetch(e).then((e=>e.headers&&"application/octet-stream"!==e.headers.get("content-type")?e.blob():e.arrayBuffer().then((e=>u.Z.invokeCrypto("gzipUncompress",e))).then((e=>(0,h.Z)(e,"")))))):this.loadPromise}loadAnimationFromURLManually(e){const t=this.makeAssetUrl(e);return this.loadAnimationDataFromURL(t).then((e=>i=>this.loadAnimationFromURLNext(e,i,t)))}loadAnimationFromURL(e,t){return this.loadAnimationDataFromURL(t).then((i=>this.loadAnimationFromURLNext(i,e,t)))}loadAnimationFromURLNext(e,t,i){const s=Object.assign(t,{animationData:e,needUpscale:!0});return s.name||(s.name=i),this.loadAnimationWorker(s)}waitForFirstFrame(e){return Promise.race([new Promise((t=>{e.addEventListener("firstFrame",t,{once:!0})})),(0,a.Z)(2500)]).then((()=>e))}loadAnimationWorker(e){return t=this,i=void 0,a=function*(){if(!p)return this.loadPromise;this.loaded||(yield this.loadLottieWorkers());const{middleware:t,group:i=""}=e;if(t&&!t())throw(0,f.Z)("MIDDLEWARE");if(e.sync){const t=r.Z.CACHE.generateName(e.name,e.width,e.height,e.color,e.toneIndex),i=this.playersByCacheName[t];if(null==i?void 0:i.size)return Promise.resolve(i.entries().next().value[0])}const n=Array.isArray(e.container)?e.container:[e.container];if(e.width&&e.height||(e.width=parseInt(n[0].style.width),e.height=parseInt(n[0].style.height)),!e.width||!e.height)throw new Error("No size for sticker!");e.group=i;const a=this.initPlayer(n,e);return s.Z.addAnimation(a,i,void 0,t),a},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}onDestroy(e){delete this.players[e]}destroyWorkers(){p&&(this.workers.forEach(((e,t)=>{e.terminate(),this.log("worker #"+t+" terminated")})),this.log("workers destroyed"),this.workers.length=0,this.curWorkerNum=0,this.loaded=!1,this.loadPromise=void 0)}initPlayer(e,t){var i,s;const n=new r.Z({el:e,worker:this.workers[this.curWorkerNum++],options:t}),{reqId:a,cacheName:o}=n;this.players[a]=n;const d=o?null!==(i=(s=this.playersByCacheName)[o])&&void 0!==i?i:s[o]=new Set:void 0;return o&&d.add(n),this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),n.addEventListener("destroy",(()=>{this.onDestroy(a),d.delete(n)&&!d.size&&delete this.playersByCacheName[o]})),n.loadFromData(t.animationData),n}};n.GO.lottieLoader=g;const v=g},3772:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,a:()=>h});var s=i(7328),n=i(8189),a=i(4762),o=i(3241),r=i(4755),d=i(3228),l=i(356),c=i(645);function h(e,t,i){let s=(0,d.Z)(window.devicePixelRatio,1,2);return s>1&&!i&&(e>90&&t>90?!a.IS_APPLE&&r.Z.isMobile&&(s=1):(e>60&&t>60||a.IS_ANDROID)&&(s=Math.max(1.5,s-1.5))),s}class u extends o.Z{constructor({el:e,worker:t,options:i}){super(!0),this.reqId=0,this.width=0,this.height=0,this.paused=!0,this.direction=1,this.speed=1,this.autoplay=!0,this.loop=!0,this.group="",this.cachingDelta=0,this.playedTimes=0,this.reqId=++u.reqId,this.el=e,this.worker=t;for(const e in i)this.hasOwnProperty(e)&&(this[e]=i[e]);let o;this._loop=this.loop,this._autoplay=this.autoplay,this.initFrame=i.initFrame,this.color=i.color,this.inverseColor=i.inverseColor,this.name=i.name,this.skipFirstFrameRendering=i.skipFirstFrameRendering,this.toneIndex=i.toneIndex,this.raw=void 0!==this.color,this.name&&(this.cacheName=u.CACHE.generateName(this.name,this.width,this.height,this.color,this.toneIndex)),void 0!==i.skipRatio?o=i.skipRatio:(a.IS_ANDROID||a.IS_APPLE_MOBILE||a.IS_APPLE&&!a.IS_SAFARI&&!n.Z)&&this.width<100&&this.height<100&&!i.needUpscale&&(o=.5),this.skipDelta=void 0!==o?1/o|0:1;const r=h(this.width,this.height,i.needUpscale);this.width=Math.round(this.width*r),this.height=Math.round(this.height*r),i.noCache||(a.IS_APPLE&&this.width>100&&this.height>100?this.cachingDelta=2:this.width<100&&this.height<100?this.cachingDelta=1/0:this.cachingDelta=4),this.canvas||(this.canvas=this.el.map((()=>{const e=document.createElement("canvas");return e.classList.add("rlottie"),e.width=this.width,e.height=this.height,e.dpr=r,e}))),this.contexts=this.canvas.map((e=>e.getContext("2d"))),l.Z&&!this.raw||(this.imageData=new ImageData(this.width,this.height),s.Z&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4))),this.name?this.cache=u.CACHE.getCache(this.cacheName):this.cache=c.M.createCache()}clearCache(){this.cachingDelta!==1/0&&(this.cacheName&&this.cache.counter>1||this.cache.clearCache())}sendQuery(e,t){this.worker.sendQuery([e.shift(),this.reqId,...e],t)}loadFromData(e){this.sendQuery(["loadFromData",e,this.width,this.height,this.toneIndex,void 0!==this.color])}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(e=!0){this.paused||(this.paused=!0,e&&(clearTimeout(this.rafId),this.rafId=void 0))}resetCurrentFrame(){var e;return this.curFrame=null!==(e=this.initFrame)&&void 0!==e?e:1===this.direction?this.minFrame:this.maxFrame}stop(e=!0){this.pause();const t=this.resetCurrentFrame();e&&this.requestFrame(t)}restart(){this.stop(!1),this.play()}setSpeed(e){this.speed!==e&&(this.speed=e,this.paused||this.setMainLoop())}setDirection(e){this.direction!==e&&(this.direction=e,this.paused||this.setMainLoop())}remove(){this.pause(),this.sendQuery(["destroy"]),this.cacheName&&u.CACHE.releaseCache(this.cacheName),this.dispatchEvent("destroy"),this.cleanup()}applyColor(e){const[t,i,s]=this.color;for(let n=0,a=e.length;n{let n=this.cache.framesNew.get(t);if(e instanceof Uint8ClampedArray?s>0&&(n=this.canvas[0]):n=e,!n){const e=document.createElement("canvas");e.width=i.canvas.width,e.height=i.canvas.height,e.getContext("2d").putImageData(this.imageData,0,0),this.cache.framesNew.set(t,e),n=e}this.overrideRender&&this.renderedFirstFrame?this.overrideRender(n||this.imageData):n?(i.clearRect(0,0,n.width,n.height),i.drawImage(n,0,0)):i.putImageData(this.imageData,0,0),this.renderedFirstFrame||(this.renderedFirstFrame=!0)})),this.dispatchEvent("enterFrame",t)}catch(e){console.error("RLottiePlayer renderFrame error:",e,this.width,this.height),this.autoplay=!1,this.pause()}}renderFrame(e,t){if(this.cachingDelta&&(t%this.cachingDelta||!t)&&(e instanceof Uint8ClampedArray&&!this.cache.frames.has(t)?this.cache.frames.set(t,new Uint8ClampedArray(e)):l.Z&&e instanceof ImageBitmap&&!this.cache.framesNew.has(t)&&this.cache.framesNew.set(t,e)),this.frInterval){const i=Date.now()-this.frThen;if(i<0){const s=this.frInterval>-i?-i%this.frInterval:this.frInterval;return this.rafId&&clearTimeout(this.rafId),void(this.rafId=window.setTimeout((()=>{this.renderFrame2(e,t)}),s))}}this.renderFrame2(e,t)}requestFrame(e){const t=this.cache.frames.get(e),i=this.cache.framesNew.get(e);i?this.renderFrame(i,e):t?this.renderFrame(t,e):(this.clamped&&!this.clamped.length&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery(["renderFrame",e],this.clamped?[this.clamped.buffer]:void 0))}onLap(){return++this.playedTimes===this.loop&&(this.loop=!1),!!this.loop||(this.pause(!1),!1)}mainLoopForwards(){const{skipDelta:e,maxFrame:t}=this,i=this.curFrame+e>t?this.curFrame=this.loop?this.minFrame:this.maxFrame:this.curFrame+=e;return this.requestFrame(i),!(i+e>t)||this.onLap()}mainLoopBackwards(){const{skipDelta:e,minFrame:t}=this,i=this.curFrame-et?1:-1,callback:s})}playToFrame(e){this.pause();const{frame:t,speed:i,callback:s,direction:n}=e;this.setDirection(void 0===n?this.curFrame>t?-1:1:n),void 0!==i&&this.setSpeed(i);const a=[this.curFrame,t];-1===this.direction&&a.reverse(),this.loop=!1,this.setMinMax(a[0],a[1]),this.playToFrameOnFrameCallback&&this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s&&(this.playToFrameOnFrameCallback=e=>{e===t&&(this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s())},this.addEventListener("enterFrame",this.playToFrameOnFrameCallback)),this.play()}setColor(e,t){this.color=e,t&&this.paused&&this.renderFrame2(this.imageData.data,this.curFrame)}setInverseColor(e){this.inverseColor=e}setMinMax(e=0,t=this.frameCount-1){this.minFrame=e,this.maxFrame=t}onLoad(e,t){return i=this,s=void 0,a=function*(){this.frameCount=e,this.fps=t,this.setMinMax(),void 0!==this.initFrame&&(this.initFrame=(0,d.Z)(this.initFrame,this.minFrame,this.maxFrame));const i=this.resetCurrentFrame();if(this.fps<60&&1!==this.skipDelta){const e=60/t;this.skipDelta=this.skipDelta/e|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,!this.skipFirstFrameRendering&&this.requestFrame(i),this.dispatchEvent("ready"),this.addEventListener("enterFrame",(()=>{this.dispatchEvent("firstFrame"),this.canvas[0].parentNode||!this.el||this.overrideRender||this.el.forEach(((e,t)=>e.append(this.canvas[t]))),this.frameListener=()=>{if(this.paused||!this.currentMethod)return;const e=Date.now();this.frThen=e+this.frInterval,this.currentMethod()||this.loop||!this.autoplay||(this.autoplay=!1)},this.addEventListener("enterFrame",this.frameListener),"none"===this.group&&this.autoplay&&this.play()}),{once:!0})},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}u.CACHE=c.Z,u.reqId=0},4874:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(1447),n=i(6008),a=i(410),o=i(4789),r=i(2648);const d=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=(0,n.X)(null,this.scrollableDiv.querySelector(".tabs-container"),null,(()=>{var e;(null===(e=this.page)||void 0===e?void 0:e.onShown)&&this.page.onShown()}))}setPage(e){if(e.isAuthPage){this.pagesDiv.style.display="";const t=(0,r.Z)(e.pageEl);if(this.pageId===t)return;this.selectTab(t),-1!==this.pageId&&t>1&&s.Z.loadLottieWorkers(),this.pageId=t,this.scrollableDiv&&(0,o.Z)({container:this.scrollableDiv,element:this.scrollableDiv.firstElementChild,position:"start"})}else this.pagesDiv.style.display="none",e.pageEl.style.display="",this.pageId=-1;this.page=e}};a.GO.pagesManager=d;const l=d;class c{constructor(e,t,i,s,n){this.isAuthPage=t,this.onFirstMount=i,this.onMount=s,this.onShown=n,this.installed=!1,this.pageEl=document.body.querySelector("."+e)}mount(...e){return t=this,i=void 0,n=function*(){if(this.onMount){const t=this.onMount(...e);t instanceof Promise&&(yield t)}if(!this.installed){if(this.onFirstMount)try{const t=this.onFirstMount(...e);t instanceof Promise&&(yield t)}catch(e){console.error("PAGE MOUNT ERROR:",e)}this.installed=!0}l.setPage(this)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}}},671:(e,t,i)=>{"use strict";function s(e){return r(o(e)).join("-")}i.d(t,{Ml:()=>c,N0:()=>s,tB:()=>d,w1:()=>r,zu:()=>h});const n=/\uFE0F/g,a=String.fromCharCode(8205),o=e=>e.indexOf(a)<0?e.replace(n,""):e;function r(e){const t=[];let i=0,s=0,n=0;for(;n55296&&i<=56319?s=i:t.push(i.toString(16));return t.length&&2===t[0].length&&(t[0]="00"+t[0]),t}function d(e){const t=e.match(/[\uDFFB-\uDFFF]/);return t?5-(57343-t[0].charCodeAt(0)):0}const l=new Map([["FT","🏴‍☠"]]);function c(e){var t;return null!==(t=l.get(e))&&void 0!==t?t:String.fromCharCode(55356,56741+e.charCodeAt(0),55356,56741+e.charCodeAt(1))}function h(e){return e.split("-").reduce(((e,t)=>e+String.fromCodePoint(parseInt(t,16))),"")}},4329:function(e){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function i(s){if(t[s])return t[s].exports;var n=t[s]={i:s,l:!1,exports:{}};return e[s].call(n.exports,n,n.exports,i),n.l=!0,n.exports}return i.m=e,i.c=t,i.d=function(e,t,s){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(i.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(s,n,function(t){return e[t]}.bind(null,n));return s},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=0)}([function(e,t,i){"use strict";(function(t){var i=t.AudioContext||t.webkitAudioContext,s=function(e){if(!s.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};s.isRecordingSupported=function(){return i&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},s.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},s.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],i=0;i{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},s.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then((e=>(this.stream=e,this.audioContext.createMediaStreamSource(e))))},s.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},s.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise(((t,i)=>{var s=i=>{switch(i.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=i.data.samplePosition,e(i.data.page);break;case"done":this.encoder.removeEventListener("message",s),this.finish()}};this.encoder.addEventListener("message",s),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))}))},s.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise(((e,i)=>{var s=i=>{"flushed"===i.data.message&&(t.removeEventListener("message",s),this.onpause(),e())};t.addEventListener("message",s),t.postMessage({command:"flush"})}))}return this.onpause(),Promise.resolve()}},s.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},s.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then((()=>this.initSourceNode(e))).then((e=>{this.sourceNode=e,this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)}))},s.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise((t=>{var i=s=>{"done"===s.data.message&&(e.removeEventListener("message",i),t())};e.addEventListener("message",i),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})}))}return Promise.resolve()},s.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},s.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},s.prototype.streamPage=function(e){this.ondataavailable(e)},s.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,i){return e.set(i,t),t+i.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},s.prototype.ondataavailable=function(){},s.prototype.onpause=function(){},s.prototype.onresume=function(){},s.prototype.onstart=function(){},s.prototype.onstop=function(){},e.exports=s}).call(this,i(1))},function(e,t){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(e){"object"==typeof window&&(i=window)}e.exports=i}])},6802:e=>{var t=.1,i="function"==typeof Float32Array;function s(e,t){return 1-3*t+3*e}function n(e,t){return 3*t-6*e}function a(e){return 3*e}function o(e,t,i){return((s(t,i)*e+n(t,i))*e+a(t))*e}function r(e,t,i){return 3*s(t,i)*e*e+2*n(t,i)*e+a(t)}function d(e){return e}e.exports=function(e,s,n,a){if(!(0<=e&&e<=1&&0<=n&&n<=1))throw new Error("bezier x values must be in [0, 1] range");if(e===s&&n===a)return d;for(var l=i?new Float32Array(11):new Array(11),c=0;c<11;++c)l[c]=o(c*t,e,n);return function(i){return 0===i||1===i?i:o(function(i){for(var s=0,a=1;10!==a&&l[a]<=i;++a)s+=t;--a;var d=s+(i-l[a])/(l[a+1]-l[a])*t,c=r(d,e,n);return c>=.001?function(e,t,i,s){for(var n=0;n<4;++n){var a=r(t,i,s);if(0===a)return t;t-=(o(t,i,s)-e)/a}return t}(i,d,e,n):0===c?d:function(e,t,i,s,n){var a,r,d=0;do{(a=o(r=t+(i-t)/2,s,n)-e)>0?i=r:t=r}while(Math.abs(a)>1e-7&&++d<10);return r}(i,s,s+t,e,n)}(i),s,a)}}}}]); +//# sourceMappingURL=460.045a47588277eda9214e.chunk.js.map \ No newline at end of file diff --git a/public/460.045a47588277eda9214e.chunk.js.map b/public/460.045a47588277eda9214e.chunk.js.map new file mode 100644 index 00000000..e4905526 --- /dev/null +++ b/public/460.045a47588277eda9214e.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"460.045a47588277eda9214e.chunk.js","mappings":"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QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,MAAO,kBAAkB,MAAO,QAAQ,MAAO,kBAAkB,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,wCAAwC,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,IAAK,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,iBAAiB,KAAM,iBAAiB,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAA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","sources":["webpack://tweb/./src/components/animationIntersector.ts","webpack://tweb/./src/components/appMediaPlaybackController.ts","webpack://tweb/./src/components/appMediaViewer.ts","webpack://tweb/./src/lib/mediaPlayer.ts","webpack://tweb/./src/components/appMediaViewerBase.ts","webpack://tweb/./src/helpers/fillPropertyValue.ts","webpack://tweb/./src/components/appNavigationController.ts","webpack://tweb/./src/components/appSearch.ts","webpack://tweb/./src/components/appSearchSuper..ts","webpack://tweb/./src/helpers/dom/lockTouchScroll.ts","webpack://tweb/./src/components/appSelectPeers.ts","webpack://tweb/./src/components/audio.ts","webpack://tweb/./src/helpers/avatarListLoader.ts","webpack://tweb/./src/components/appMediaViewerAvatar.ts","webpack://tweb/./src/components/avatar.ts","webpack://tweb/./src/components/avatarEdit.ts","webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/buttonCorner.ts","webpack://tweb/./src/components/buttonIcon.ts","webpack://tweb/./src/components/buttonMenu.ts","webpack://tweb/./src/components/buttonMenuToggle.ts","webpack://tweb/./src/components/chat/gradientRenderer.ts","webpack://tweb/./src/helpers/easing/easeOutQuad.ts","webpack://tweb/./src/components/chat/selection.ts","webpack://tweb/./src/helpers/dom/getSelectedText.ts","webpack://tweb/./src/components/checkboxField.ts","webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/confirmationPopup.ts","webpack://tweb/./src/components/countryInputField.ts","webpack://tweb/./src/components/dotRenderer.ts","webpack://tweb/./src/components/editPeer.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/stickers.ts","webpack://tweb/./src/components/emoticonsDropdown/index.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/emoji.ts","webpack://tweb/./src/lib/richTextProcessor/wrapSingleEmoji.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/stickers.ts","webpack://tweb/./src/components/generateDelimiter.ts","webpack://tweb/./src/components/generateFakeIcon.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat2.ts","webpack://tweb/./src/components/gifsMasonry.ts","webpack://tweb/./src/components/horizontalMenu.ts","webpack://tweb/./src/components/inputField.ts","webpack://tweb/./src/helpers/dom/selectElementContents.ts","webpack://tweb/./src/components/inputSearch.ts","webpack://tweb/./src/components/lazyLoadQueue.ts","webpack://tweb/./src/components/lazyLoadQueueIntersector.ts","webpack://tweb/./src/components/mediaProgressLine.ts","webpack://tweb/./src/components/middleEllipsis.ts","webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/components/peerProfileAvatars.ts","webpack://tweb/./src/components/peerProfile.ts","webpack://tweb/./src/components/generateTitleIcons.ts","webpack://tweb/./src/components/generateVerifiedIcon.ts","webpack://tweb/./src/components/generatePremiumIcon.ts","webpack://tweb/./src/components/peerTitle.ts","webpack://tweb/./src/components/popups/avatar.ts","webpack://tweb/./src/lib/cropper.ts","webpack://tweb/./src/components/popups/deleteDialog.ts","webpack://tweb/./src/components/popups/deleteMessages.ts","webpack://tweb/./src/components/popups/forward.ts","webpack://tweb/./src/components/popups/index.ts","webpack://tweb/./src/components/popups/limit.ts","webpack://tweb/./src/components/popups/mute.ts","webpack://tweb/./src/components/popups/peer.ts","webpack://tweb/./src/components/popups/pickUser.ts","webpack://tweb/./src/components/popups/sendNow.ts","webpack://tweb/./src/components/popups/stickers.ts","webpack://tweb/./src/components/preloader.ts","webpack://tweb/./src/components/putPhoto.ts","webpack://tweb/./src/components/wrappers/getPeerInitials.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/radioField.ts","webpack://tweb/./src/components/radioForm.ts","webpack://tweb/./src/components/rangeSelector.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/components/row.ts","webpack://tweb/./src/components/scrollable.ts","webpack://tweb/./src/components/settingSection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newGroup.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/privacyType.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/getPrivacyRulesDetails.ts","webpack://tweb/./src/components/privacySection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/passwordSet.ts","webpack://tweb/./src/helpers/dom/canFocus.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/emailConfirmation.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/email.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/hint.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/reEnterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/enterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/lastSeen.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/profilePhoto.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/forwardMessages.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/addToGroups.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/calls.ts","webpack://tweb/./src/components/sidebarLeft/tabs/activeSessions.ts","webpack://tweb/./src/components/sidebarLeft/tabs/blockedUsers.ts","webpack://tweb/./src/helpers/string/convertKeyToInputKey.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/voices.ts","webpack://tweb/./src/components/sidebarLeft/tabs/activeWebSessions.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacyAndSecurity.ts","webpack://tweb/./src/components/sidebarLeft/tabs/quickReaction.ts","webpack://tweb/./src/components/sidebarLeft/tabs/generalSettings.ts","webpack://tweb/./src/helpers/eachMinute.ts","webpack://tweb/./src/helpers/eachTimeout.ts","webpack://tweb/./src/components/sidebarLeft/tabs/chatFolders.ts","webpack://tweb/./src/components/sidebarLeft/tabs/notifications.ts","webpack://tweb/./src/components/sidebarLeft/tabs/language.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/photo.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/file.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/video.ts","webpack://tweb/./src/components/sidebarLeft/tabs/dataAndStorage.ts","webpack://tweb/./src/components/sidebarLeft/tabs/settings.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newChannel.ts","webpack://tweb/./src/components/popups/createContact.ts","webpack://tweb/./src/components/sidebarLeft/tabs/contacts.ts","webpack://tweb/./src/components/sidebarLeft/tabs/archivedTab.ts","webpack://tweb/./src/components/sidebarLeft/tabs/peopleNearby.ts","webpack://tweb/./src/components/sidebarLeft/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/addMembers.ts","webpack://tweb/./src/helpers/averageColor.ts","webpack://tweb/./src/helpers/highlightningColor.ts","webpack://tweb/./src/components/colorPicker.ts","webpack://tweb/./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack://tweb/./src/components/sidebarLeft/tabs/background.ts","webpack://tweb/./src/helpers/files/requestFile.ts","webpack://tweb/./src/components/sidebarLeft/tabs/includedChats.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editFolder.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editProfile.ts","webpack://tweb/./src/components/sidebarRight/index.ts","webpack://tweb/./src/components/sidebarRight/tabs/editContact.ts","webpack://tweb/./src/components/sidebarRight/tabs/editTopic.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatType.ts","webpack://tweb/./src/components/sidebarRight/tabs/userPermissions.ts","webpack://tweb/./src/components/sidebarRight/tabs/groupPermissions.ts","webpack://tweb/./src/lib/appManagers/utils/chats/combineParticipantBannedRights.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatReactions.ts","webpack://tweb/./src/components/sidebarRight/tabs/editChat.ts","webpack://tweb/./src/components/sidebarRight/tabs/sharedMedia.ts","webpack://tweb/./src/components/singleTransition.ts","webpack://tweb/./src/components/slider.ts","webpack://tweb/./src/components/sliderTab.ts","webpack://tweb/./src/components/sortedUserList.ts","webpack://tweb/./src/components/stickerViewer.ts","webpack://tweb/./src/components/stickyIntersector.ts","webpack://tweb/./src/components/swipeHandler.ts","webpack://tweb/./src/components/telInputField.ts","webpack://tweb/./src/components/toast.ts","webpack://tweb/./src/components/transition.ts","webpack://tweb/./src/lib/richTextProcessor/isUsernameValid.ts","webpack://tweb/./src/components/usernameInputField.ts","webpack://tweb/./src/components/usernamesSection.ts","webpack://tweb/./src/components/visibilityIntersector.ts","webpack://tweb/./src/components/volumeSelector.ts","webpack://tweb/./src/components/wrappers/customEmoji.ts","webpack://tweb/./src/components/wrappers/document.ts","webpack://tweb/./src/components/wrappers/formatUserPhone.ts","webpack://tweb/./src/components/wrappers/getChatMembersString.ts","webpack://tweb/./src/components/wrappers/getPeerTitle.ts","webpack://tweb/./src/components/wrappers/getUserStatusString.ts","webpack://tweb/./src/components/wrappers/mediaSpoiler.ts","webpack://tweb/./src/components/wrappers/messageActionTextNew.ts","webpack://tweb/./src/components/topicAvatar.ts","webpack://tweb/./src/components/wrappers/joinVoiceChatAnchor.ts","webpack://tweb/./src/components/wrappers/messageActionTextNewUnsafe.ts","webpack://tweb/./src/components/wrappers/messageForReply.ts","webpack://tweb/./src/components/wrappers/peerTitle.ts","webpack://tweb/./src/components/wrappers/photo.ts","webpack://tweb/./src/components/wrappers/senderToPeer.ts","webpack://tweb/./src/components/wrappers/sentTime.ts","webpack://tweb/./src/components/wrappers/sticker.ts","webpack://tweb/./src/helpers/bytes/getPathFromBytes.ts","webpack://tweb/./src/helpers/computeLockColor.ts","webpack://tweb/./src/components/wrappers/stickerAnimation.ts","webpack://tweb/./src/components/wrappers/stickerEmoji.ts","webpack://tweb/./src/components/wrappers/stickerSetThumb.ts","webpack://tweb/./src/components/wrappers/stickerToRow.ts","webpack://tweb/./src/components/wrappers/topicNameButton.ts","webpack://tweb/./src/components/wrappers/video.ts","webpack://tweb/./src/components/wrappers/webPageDescription.ts","webpack://tweb/./src/components/wrappers/webPageTitle.ts","webpack://tweb/./src/config/currencies.ts","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/config/font.ts","webpack://tweb/./src/environment/imageBitmapSupport.ts","webpack://tweb/./src/helpers/animation.ts","webpack://tweb/./src/helpers/array/filterAsync.ts","webpack://tweb/./src/helpers/array/findAndSpliceAll.ts","webpack://tweb/./src/helpers/audioAssetPlayer.ts","webpack://tweb/./src/helpers/blob/readBlobAsDataURL.ts","webpack://tweb/./src/helpers/heavyQueue.ts","webpack://tweb/./src/helpers/blur.ts","webpack://tweb/./src/helpers/bytes/getPreviewURLFromBytes.ts","webpack://tweb/./src/helpers/bytes/bytesToDataURL.ts","webpack://tweb/./src/helpers/calcImageInBox.ts","webpack://tweb/./src/helpers/canvas/getTextWidth.ts","webpack://tweb/./src/helpers/canvas/scaleMediaElement.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/clipboard.ts","webpack://tweb/./src/helpers/contextMenuController.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/dom/anchorCopy.ts","webpack://tweb/./src/helpers/dom/attachContextMenuListener.ts","webpack://tweb/./src/helpers/dom/attachGrabListeners.ts","webpack://tweb/./src/helpers/dom/cancelSelection.ts","webpack://tweb/./src/helpers/dom/clickEvent.ts","webpack://tweb/./src/helpers/dom/controlsHover.ts","webpack://tweb/./src/helpers/dom/createContextMenu.ts","webpack://tweb/./src/helpers/dom/createStickersContextMenu.ts","webpack://tweb/./src/helpers/dom/createVideo.ts","webpack://tweb/./src/helpers/dom/customProperties.ts","webpack://tweb/./src/helpers/dom/dispatchEvent.ts","webpack://tweb/./src/helpers/dom/documentFragmentToHTML.ts","webpack://tweb/./src/helpers/dom/findUpAsChild.ts","webpack://tweb/./src/helpers/dom/findUpAttribute.ts","webpack://tweb/./src/helpers/dom/findUpTag.ts","webpack://tweb/./src/helpers/dom/fullScreen.ts","webpack://tweb/./src/helpers/dom/getCaretPosNew.ts","webpack://tweb/./src/helpers/dom/getRichElementValue.ts","webpack://tweb/./src/helpers/dom/getRichValueWithCaret.ts","webpack://tweb/./src/helpers/dom/getViewportSlice.ts","webpack://tweb/./src/helpers/dom/getVisibleRect.ts","webpack://tweb/./src/helpers/dom/handleHorizontalSwipe.ts","webpack://tweb/./src/helpers/dom/handleTabSwipe.ts","webpack://tweb/./src/helpers/dom/htmlToDocumentFragment.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/dom/isInDOM.ts","webpack://tweb/./src/helpers/dom/isInputEmpty.ts","webpack://tweb/./src/helpers/dom/isSendShortcutPressed.ts","webpack://tweb/./src/helpers/dom/isSwipingBackSafari.ts","webpack://tweb/./src/helpers/dom/placeCaretAtEnd.ts","webpack://tweb/./src/helpers/dom/positionElementByIndex.ts","webpack://tweb/./src/helpers/dom/renderImageFromUrl.ts","webpack://tweb/./src/helpers/dom/renderMediaWithFadeIn.ts","webpack://tweb/./src/helpers/dom/replaceContent.ts","webpack://tweb/./src/helpers/dom/compareNodes.ts","webpack://tweb/./src/helpers/dom/richInputHandler.ts","webpack://tweb/./src/helpers/dom/sortable.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/helpers/dom/whichChild.ts","webpack://tweb/./src/helpers/dropdownHover.ts","webpack://tweb/./src/helpers/fastSmoothScroll.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/filterChatPhotosMessages.ts","webpack://tweb/./src/helpers/formatBytes.ts","webpack://tweb/./src/helpers/formatCallDuration.ts","webpack://tweb/./src/helpers/formatDuration.ts","webpack://tweb/./src/helpers/formatPhoneNumber.ts","webpack://tweb/./src/helpers/framesCache.ts","webpack://tweb/./src/helpers/generatePathData.ts","webpack://tweb/./src/helpers/getImageFromStrippedThumb.ts","webpack://tweb/./src/helpers/getPreviewURLFromThumb.ts","webpack://tweb/./src/helpers/getStrippedThumbIfNeeded.ts","webpack://tweb/./src/helpers/listLoader.ts","webpack://tweb/./src/helpers/listenerSetter.ts","webpack://tweb/./src/helpers/mediaSize.ts","webpack://tweb/./src/helpers/mediaSizes.ts","webpack://tweb/./src/helpers/middlewarePromise.ts","webpack://tweb/./src/helpers/number/clamp.ts","webpack://tweb/./src/helpers/number/formatNumber.ts","webpack://tweb/./src/helpers/number/numberThousandSplitter.ts","webpack://tweb/./src/helpers/onMediaLoad.ts","webpack://tweb/./src/helpers/overlayClickHandler.ts","webpack://tweb/./src/helpers/paymentsWrapCurrencyAmount.ts","webpack://tweb/./src/helpers/positionMenu.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/helpers/saveLottiePreview.ts","webpack://tweb/./src/helpers/schedulers/throttleWithRaf.ts","webpack://tweb/./src/helpers/schedulers/throttleWith.ts","webpack://tweb/./src/helpers/scrollableLoader.ts","webpack://tweb/./src/helpers/searchListLoader.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/incrementMessageId.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/helpers/setAttachmentSize.ts","webpack://tweb/./src/helpers/sortedList.ts","webpack://tweb/./src/helpers/string/bom.ts","webpack://tweb/./src/helpers/string/encodeEntities.ts","webpack://tweb/./src/helpers/string/escapeRegExp.ts","webpack://tweb/./src/helpers/string/limitSymbols.ts","webpack://tweb/./src/helpers/string/toHHMMSS.ts","webpack://tweb/./src/helpers/textToSvgURL.ts","webpack://tweb/./src/helpers/windowSize.ts","webpack://tweb/./src/hooks/useHeavyAnimationCheck.ts","webpack://tweb/./src/components/dialogsContextMenu.ts","webpack://tweb/./src/components/connectionStatus.ts","webpack://tweb/./src/components/sendingStatus.ts","webpack://tweb/./src/helpers/easing/easeInOutSine.ts","webpack://tweb/./src/helpers/canvas/roundRect.ts","webpack://tweb/./src/components/groupCallActiveIcon.ts","webpack://tweb/./src/helpers/canvas/shimmer.ts","webpack://tweb/./src/helpers/dialogsPlaceholder.ts","webpack://tweb/./src/helpers/canvas/drawCircle.ts","webpack://tweb/./src/helpers/dom/shake.ts","webpack://tweb/./src/lib/appManagers/appDialogsManager.ts","webpack://tweb/./src/helpers/number/getUnsafeRandomInt.ts","webpack://tweb/./src/lib/appManagers/appDownloadManager.ts","webpack://tweb/./src/helpers/dom/createDownloadAnchor.ts","webpack://tweb/./src/helpers/array/partition.ts","webpack://tweb/./src/components/chat/bubbleGroups.ts","webpack://tweb/./src/components/popups/datePicker.ts","webpack://tweb/./src/components/divAndCaption.ts","webpack://tweb/./src/components/chat/replyContainer.ts","webpack://tweb/./src/components/wrappers/reply.ts","webpack://tweb/./src/components/stackedAvatars.ts","webpack://tweb/./src/components/chat/replies.ts","webpack://tweb/./src/components/chat/messageRender.ts","webpack://tweb/./src/helpers/dom/getElementByPoint.ts","webpack://tweb/./src/helpers/dom/reflowScrollableElement.ts","webpack://tweb/./src/lib/mtproto/constants.ts","webpack://tweb/./src/lib/appManagers/internalLink.ts","webpack://tweb/./src/components/popups/joinChatInvite.ts","webpack://tweb/./src/components/chat/reaction.ts","webpack://tweb/./src/components/chat/reactions.ts","webpack://tweb/./src/helpers/scrollSaver.ts","webpack://tweb/./src/helpers/dom/superIntersectionObserver.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMentionUnread.ts","webpack://tweb/./src/helpers/array/accumulate.ts","webpack://tweb/./src/helpers/cacheCallback.ts","webpack://tweb/./src/helpers/string/replaceNonNumber.ts","webpack://tweb/./src/helpers/cards/cardBrands.ts","webpack://tweb/./src/helpers/array/createArray.ts","webpack://tweb/./src/helpers/string/buggedNumbers.ts","webpack://tweb/./src/helpers/cards/patternCharacters.ts","webpack://tweb/./src/helpers/cards/cardFormattingPatterns.ts","webpack://tweb/./src/helpers/cards/formatValueByPattern.ts","webpack://tweb/./src/helpers/cards/validateCard.ts","webpack://tweb/./src/helpers/string/nbsp.ts","webpack://tweb/./src/components/telegramWebView.ts","webpack://tweb/./src/components/popups/paymentVerification.ts","webpack://tweb/./src/components/popups/paymentCard.ts","webpack://tweb/./src/helpers/cards/formatInputValueByPattern.ts","webpack://tweb/./src/components/popups/paymentCardConfirmation.ts","webpack://tweb/./src/components/popups/paymentShipping.ts","webpack://tweb/./src/components/popups/paymentShippingMethods.ts","webpack://tweb/./src/components/popups/payment.ts","webpack://tweb/./src/components/groupedLayout.ts","webpack://tweb/./src/components/prepareAlbum.ts","webpack://tweb/./src/components/wrappers/album.ts","webpack://tweb/./src/components/sidebarRight/tabs/pollResults.ts","webpack://tweb/./src/components/poll.ts","webpack://tweb/./src/helpers/string/isRTL.ts","webpack://tweb/./src/components/chat/bubbles.ts","webpack://tweb/./src/helpers/dom/copyFromElement.ts","webpack://tweb/./src/components/wrappers/groupedDocuments.ts","webpack://tweb/./src/components/wrappers/poll.ts","webpack://tweb/./src/components/popups/unpinMessage.ts","webpack://tweb/./src/helpers/dom/isSelectionEmpty.ts","webpack://tweb/./src/helpers/preloadAnimatedEmojiSticker.ts","webpack://tweb/./src/components/popups/reportMessagesConfirm.ts","webpack://tweb/./src/components/popups/reportMessages.ts","webpack://tweb/./src/components/popups/sponsored.ts","webpack://tweb/./src/components/popups/reactedList.ts","webpack://tweb/./src/components/chat/reactionsMenu.ts","webpack://tweb/./src/components/chat/contextMenu.ts","webpack://tweb/./src/components/chat/sendContextMenu.ts","webpack://tweb/./src/components/popups/createPoll.ts","webpack://tweb/./src/helpers/createPoster.ts","webpack://tweb/./src/helpers/getGifDuration.ts","webpack://tweb/./src/components/inputFieldAnimated.ts","webpack://tweb/./src/components/popups/newMedia.ts","webpack://tweb/./src/helpers/dom/attachListNavigation.ts","webpack://tweb/./src/components/chat/autocompleteHelper.ts","webpack://tweb/./src/components/chat/stickersHelper.ts","webpack://tweb/./src/components/popups/schedule.ts","webpack://tweb/./src/components/chat/emojiHelper.ts","webpack://tweb/./src/components/chat/autocompletePeerHelper.ts","webpack://tweb/./src/components/chat/commandsHelper.ts","webpack://tweb/./src/components/chat/autocompleteHelperController.ts","webpack://tweb/./src/components/chat/mentionsHelper.ts","webpack://tweb/./src/components/chat/replyKeyboard.ts","webpack://tweb/./src/components/chat/inlineHelper.ts","webpack://tweb/./src/components/chat/botCommands.ts","webpack://tweb/./src/helpers/modifyAckedResult.ts","webpack://tweb/./src/components/chat/sendAs.ts","webpack://tweb/./src/helpers/dom/hasMarkupInSelection.ts","webpack://tweb/./src/components/chat/input.ts","webpack://tweb/./src/components/wrappers/draft.ts","webpack://tweb/./src/components/chat/pinnedContainer.ts","webpack://tweb/./src/components/chat/pinnedMessageBorder.ts","webpack://tweb/./src/components/chat/audio.ts","webpack://tweb/./src/components/chat/pinnedMessage.ts","webpack://tweb/./src/helpers/dom/handleScrollSideEvent.ts","webpack://tweb/./src/components/chat/topbar.ts","webpack://tweb/./src/components/sidebarRight/tabs/search.ts","webpack://tweb/./src/components/chat/search.ts","webpack://tweb/./src/components/chat/patternRenderer.ts","webpack://tweb/./src/components/chat/chat.ts","webpack://tweb/./src/helpers/autoDownload.ts","webpack://tweb/./src/components/chat/markupTooltip.ts","webpack://tweb/./src/components/chat/dragAndDrop.ts","webpack://tweb/./src/helpers/dom/disableTransition.ts","webpack://tweb/./src/components/lineBlobDrawable.ts","webpack://tweb/./src/components/topbarWeave.ts","webpack://tweb/./src/lib/rlottie/rlottieIcon.ts","webpack://tweb/./src/components/superIcon.ts","webpack://tweb/./src/components/groupCall/microphoneIcon.ts","webpack://tweb/./src/components/groupCall/participantMutedIcon.ts","webpack://tweb/./src/components/groupCall/index.ts","webpack://tweb/./src/components/groupCall/participantStatus.ts","webpack://tweb/./src/components/groupCall/participantsList.ts","webpack://tweb/./src/components/call/videoCanvasBlur.ts","webpack://tweb/./src/components/groupCall/participantVideo.ts","webpack://tweb/./src/components/groupCall/participantVideos.ts","webpack://tweb/./src/components/groupCall/participants.ts","webpack://tweb/./src/components/groupCall/description.ts","webpack://tweb/./src/components/groupCall/title.ts","webpack://tweb/./src/components/call/button.ts","webpack://tweb/./src/components/movableElement.ts","webpack://tweb/./src/helpers/movablePanel.ts","webpack://tweb/./src/helpers/toggleClassName.ts","webpack://tweb/./src/components/call/description.ts","webpack://tweb/./src/components/groupCall/microphoneIconMini.ts","webpack://tweb/./src/components/call/index.ts","webpack://tweb/./src/components/topbarCall.ts","webpack://tweb/./src/lib/appManagers/uiNotificationsManager.ts","webpack://tweb/./src/helpers/files/getFilesFromEvent.ts","webpack://tweb/./src/helpers/addAnchorListener.ts","webpack://tweb/./src/lib/appManagers/appImManager.ts","webpack://tweb/./src/lib/appManagers/utils/messages/canSaveMessageMedia.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMediaFromMessage.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMessageSenderPeerIdOrName.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMessageRestricted.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerColorById.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerEditableUsername.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/photos/choosePhotoSize.ts","webpack://tweb/./src/lib/calls/callConnectionInstanceBase.ts","webpack://tweb/./src/lib/calls/helpers/createPeerConnection.ts","webpack://tweb/./src/lib/calls/helpers/createDataChannel.ts","webpack://tweb/./src/lib/calls/helpers/parseSignalingData.ts","webpack://tweb/./src/lib/calls/callConnectionInstance.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/calls/p2P/p2PEncryptor.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/calls/p2P/chromeP2PSdpBuilder.ts","webpack://tweb/./src/lib/calls/p2P/p2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/firefoxP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/safariP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/callInstance.ts","webpack://tweb/./src/lib/calls/p2P/getCallProtocol.ts","webpack://tweb/./src/lib/calls/p2P/getRtcConfiguration.ts","webpack://tweb/./src/lib/calls/helpers/getStreamCached.ts","webpack://tweb/./src/lib/calls/callInstanceBase.ts","webpack://tweb/./src/lib/calls/callState.ts","webpack://tweb/./src/components/call/getAudioAsset.ts","webpack://tweb/./src/lib/calls/callsController.ts","webpack://tweb/./src/lib/calls/constants.ts","webpack://tweb/./src/lib/calls/groupCallConnectionInstance.ts","webpack://tweb/./src/lib/calls/helpers/processMediaSection.ts","webpack://tweb/./src/lib/calls/helpers/filterServerCodecs.ts","webpack://tweb/./src/lib/calls/helpers/fixLocalOffer.ts","webpack://tweb/./src/lib/calls/groupCallInstance.ts","webpack://tweb/./src/lib/calls/groupCallState.ts","webpack://tweb/./src/components/groupCall/getAudioAsset.ts","webpack://tweb/./src/lib/calls/groupCallsController.ts","webpack://tweb/./src/lib/calls/helpers/createMainStreamManager.ts","webpack://tweb/./src/lib/calls/helpers/getAudioConstraints.ts","webpack://tweb/./src/environment/constraintSupport.ts","webpack://tweb/./src/lib/calls/helpers/getScreenConstraints.ts","webpack://tweb/./src/lib/calls/helpers/getScreenStream.ts","webpack://tweb/./src/lib/calls/helpers/getStream.ts","webpack://tweb/./src/lib/calls/helpers/getVideoConstraints.ts","webpack://tweb/./src/lib/calls/helpers/parseMediaSectionInfo.ts","webpack://tweb/./src/lib/calls/helpers/parseSourceGroups.ts","webpack://tweb/./src/lib/calls/helpers/stopTrack.ts","webpack://tweb/./src/lib/calls/localConferenceDescription.ts","webpack://tweb/./src/lib/calls/sdp/index.ts","webpack://tweb/./src/helpers/string/splitStringByLimitWithRest.ts","webpack://tweb/./src/helpers/uniqueNumberGenerator.ts","webpack://tweb/./src/lib/calls/sdp/attributeSplitted.ts","webpack://tweb/./src/lib/calls/sdp/mediaLineParts.ts","webpack://tweb/./src/lib/calls/sdp/line.ts","webpack://tweb/./src/lib/calls/sdp/attributeInner.ts","webpack://tweb/./src/lib/calls/sdp/attributes.ts","webpack://tweb/./src/lib/calls/sdp/mediaSection.ts","webpack://tweb/./src/lib/calls/sdp/sessionSection.ts","webpack://tweb/./src/lib/calls/sdp/utils.ts","webpack://tweb/./src/lib/calls/sdpBuilder.ts","webpack://tweb/./src/lib/calls/streamManager.ts","webpack://tweb/./src/lib/calls/stringFromLineBuilder.ts","webpack://tweb/./src/lib/calls/utils.ts","webpack://tweb/./src/lib/richTextProcessor/getAbbreviation.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiEntityFromEmoji.ts","webpack://tweb/./src/lib/richTextProcessor/matchEmail.ts","webpack://tweb/./src/lib/richTextProcessor/setBlankToAnchor.ts","webpack://tweb/./src/lib/richTextProcessor/wrapAbbreviation.ts","webpack://tweb/./src/lib/richTextProcessor/wrapDraftText.ts","webpack://tweb/./src/lib/richTextProcessor/wrapEmojiText.ts","webpack://tweb/./src/environment/emojiVersionsSupport.ts","webpack://tweb/./src/lib/richTextProcessor/wrapRichText.ts","webpack://tweb/./src/helpers/buildURLHash.ts","webpack://tweb/./src/lib/richTextProcessor/wrapTelegramUrlToAnchor.ts","webpack://tweb/./src/lib/rlottie/queryableWorker.ts","webpack://tweb/./src/environment/webAssemblySupport.ts","webpack://tweb/./src/lib/rlottie/lottieLoader.ts","webpack://tweb/./src/lib/rlottie/rlottiePlayer.ts","webpack://tweb/./src/pages/pagesManager.ts","webpack://tweb/./src/pages/page.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/./public/recorder.min.js","webpack://tweb/./src/vendor/bezier-easing/index.js"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CustomEmojiElement, CustomEmojiRendererElement} from '../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../lib/rootScope';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport forEachReverse from '../helpers/array/forEachReverse';\nimport idleController from '../helpers/idleController';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport {fastRaf} from '../helpers/schedulers';\nimport {Middleware} from '../helpers/middleware';\n\nexport type AnimationItemGroup = '' | 'none' | 'chat' | 'lock' |\n 'STICKERS-POPUP' | 'emoticons-dropdown' | 'STICKERS-SEARCH' | 'GIFS-SEARCH' |\n `CHAT-MENU-REACTIONS-${number}` | 'INLINE-HELPER' | 'GENERAL-SETTINGS' | 'STICKER-VIEWER' | 'EMOJI' |\n 'EMOJI-STATUS' | `chat-${number}`;\nexport interface AnimationItem {\n el: HTMLElement,\n group: AnimationItemGroup,\n animation: AnimationItemWrapper,\n controlled?: boolean | Middleware\n};\n\nexport interface AnimationItemWrapper {\n remove: () => void;\n paused: boolean;\n pause: () => any;\n play: () => any;\n autoplay: boolean;\n // onVisibilityChange?: (visible: boolean) => boolean;\n};\n\nexport class AnimationIntersector {\n private observer: IntersectionObserver;\n private visible: Set;\n\n private overrideIdleGroups: Set;\n private byGroups: {[group in AnimationItemGroup]?: AnimationItem[]};\n private byPlayer: Map;\n private lockedGroups: {[group in AnimationItemGroup]?: true};\n private onlyOnePlayableGroup: AnimationItemGroup;\n\n private intersectionLockedGroups: {[group in AnimationItemGroup]?: true};\n private videosLocked: boolean;\n\n constructor() {\n this.observer = new IntersectionObserver((entries) => {\n // if(rootScope.idle.isIDLE) return;\n\n for(const entry of entries) {\n const target = entry.target;\n\n for(const group in this.byGroups) {\n if(this.intersectionLockedGroups[group as AnimationItemGroup]) {\n continue;\n }\n\n const animation = this.byGroups[group as AnimationItemGroup].find((p) => p.el === target);\n if(!animation) {\n continue;\n }\n\n if(entry.isIntersecting) {\n this.visible.add(animation);\n this.checkAnimation(animation, false);\n\n /* if(animation instanceof HTMLVideoElement && animation.dataset.src) {\n animation.src = animation.dataset.src;\n animation.load();\n } */\n } else {\n this.visible.delete(animation);\n this.checkAnimation(animation, true);\n\n const _animation = animation.animation;\n if(_animation instanceof RLottiePlayer/* && animation.cachingDelta === 2 */) {\n // console.warn('will clear cache', player);\n _animation.clearCache();\n }/* else if(animation instanceof HTMLVideoElement && animation.src) {\n animation.dataset.src = animation.src;\n animation.src = '';\n animation.load();\n } */\n }\n\n break;\n }\n }\n });\n\n this.visible = new Set();\n\n this.overrideIdleGroups = new Set();\n this.byGroups = {};\n this.byPlayer = new Map();\n this.lockedGroups = {};\n this.onlyOnePlayableGroup = '';\n\n this.intersectionLockedGroups = {};\n this.videosLocked = false;\n\n appMediaPlaybackController.addEventListener('play', ({doc}) => {\n if(doc.type === 'round') {\n this.videosLocked = true;\n this.checkAnimations2();\n }\n });\n\n appMediaPlaybackController.addEventListener('pause', () => {\n if(this.videosLocked) {\n this.videosLocked = false;\n this.checkAnimations2();\n }\n });\n\n idleController.addEventListener('change', (idle) => {\n this.checkAnimations2(idle);\n });\n }\n\n public setOverrideIdleGroup(group: string, override: boolean) {\n if(override) this.overrideIdleGroups.add(group);\n else this.overrideIdleGroups.delete(group);\n }\n\n public getAnimations(element: HTMLElement) {\n const found: AnimationItem[] = [];\n for(const group in this.byGroups) {\n for(const player of this.byGroups[group as AnimationItemGroup]) {\n if(player.el === element) {\n found.push(player);\n }\n }\n }\n\n return found;\n }\n\n public removeAnimation(player: AnimationItem) {\n const {el, animation} = player;\n // if(!(animation instanceof CustomEmojiElement)) {\n animation.remove();\n // }\n\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\n animation.src = '';\n animation.load();\n }, 1e3);\n }\n\n const group = this.byGroups[player.group];\n if(group) {\n indexOfAndSplice(group, player);\n if(!group.length) {\n delete this.byGroups[player.group];\n }\n }\n\n this.observer.unobserve(el);\n this.visible.delete(player);\n this.byPlayer.delete(animation);\n }\n\n public removeAnimationByPlayer(player: AnimationItemWrapper) {\n const item = this.byPlayer.get(player);\n if(item) {\n this.removeAnimation(item);\n }\n }\n\n public addAnimation(\n animation: AnimationItem['animation'],\n group: AnimationItemGroup = '',\n observeElement?: HTMLElement,\n controlled?: AnimationItem['controlled']\n ) {\n if(group === 'none' || this.byPlayer.has(animation)) {\n return;\n }\n\n if(!observeElement) {\n if(animation instanceof RLottiePlayer) {\n observeElement = animation.el[0];\n } else if(animation instanceof CustomEmojiRendererElement) {\n observeElement = animation.canvas;\n } else if(animation instanceof CustomEmojiElement) {\n observeElement = animation.placeholder ?? animation;\n } else if(animation instanceof HTMLElement) {\n observeElement = animation;\n }\n }\n\n const item: AnimationItem = {\n el: observeElement,\n animation: animation,\n group,\n controlled\n };\n\n if(controlled && typeof(controlled) !== 'boolean') {\n controlled.onClean(() => {\n this.removeAnimationByPlayer(animation);\n });\n }\n\n if(animation instanceof RLottiePlayer) {\n if(!rootScope.settings.stickers.loop && animation.loop) {\n animation.loop = rootScope.settings.stickers.loop;\n }\n }\n\n (this.byGroups[group as AnimationItemGroup] ??= []).push(item);\n this.observer.observe(item.el);\n this.byPlayer.set(animation, item);\n }\n\n public checkAnimations(\n blurred?: boolean,\n group?: AnimationItemGroup,\n destroy?: boolean,\n imitateIntersection?: boolean\n ) {\n // if(rootScope.idle.isIDLE) return;\n\n if(group !== undefined && !this.byGroups[group]) {\n // console.warn('no animation group:', group);\n return;\n }\n\n const groups = group !== undefined /* && false */ ? [group] : Object.keys(this.byGroups) as AnimationItemGroup[];\n\n for(const group of groups) {\n if(imitateIntersection && this.intersectionLockedGroups[group]) {\n continue;\n }\n\n const animations = this.byGroups[group];\n\n forEachReverse(animations, (animation) => {\n this.checkAnimation(animation, blurred, destroy);\n });\n }\n }\n\n public checkAnimations2(blurred?: boolean) {\n this.checkAnimations(blurred, undefined, undefined, true);\n }\n\n public checkAnimation(player: AnimationItem, blurred?: boolean, destroy?: boolean) {\n const {el, animation, group} = player;\n // return;\n if(destroy || (!this.lockedGroups[group] && !isInDOM(el))) {\n if(!player.controlled || destroy) {\n this.removeAnimation(player);\n }\n\n return;\n }\n\n if(blurred ||\n (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) ||\n (animation instanceof HTMLVideoElement && this.videosLocked)\n ) {\n if(!animation.paused) {\n // console.warn('pause animation:', animation);\n animation.pause();\n }\n } else if(animation.paused &&\n this.visible.has(player) &&\n animation.autoplay &&\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group) &&\n (!idleController.isIdle || this.overrideIdleGroups.has(player.group))\n ) {\n // console.warn('play animation:', animation);\n animation.play();\n }\n }\n\n public getOnlyOnePlayableGroup() {\n return this.onlyOnePlayableGroup;\n }\n\n public setOnlyOnePlayableGroup(group: AnimationItemGroup = '') {\n this.onlyOnePlayableGroup = group;\n }\n\n public lockGroup(group: AnimationItemGroup) {\n this.lockedGroups[group] = true;\n }\n\n public unlockGroup(group: AnimationItemGroup) {\n delete this.lockedGroups[group];\n this.checkAnimations(undefined, group);\n }\n\n public refreshGroup(group: AnimationItemGroup) {\n const animations = this.byGroups[group];\n if(!animations?.length) {\n return;\n }\n\n animations.forEach((animation) => {\n this.observer.unobserve(animation.el);\n });\n\n fastRaf(() => {\n animations.forEach((animation) => {\n this.observer.observe(animation.el);\n });\n });\n }\n\n public lockIntersectionGroup(group: AnimationItemGroup) {\n this.intersectionLockedGroups[group] = true;\n }\n\n public unlockIntersectionGroup(group: AnimationItemGroup) {\n delete this.intersectionLockedGroups[group];\n this.refreshGroup(group);\n }\n\n public toggleIntersectionGroup(group: AnimationItemGroup, lock: boolean) {\n if(lock) this.lockIntersectionGroup(group);\n else this.unlockIntersectionGroup(group);\n }\n}\n\nconst animationIntersector = new AnimationIntersector();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.animationIntersector = animationIntersector);\nexport default animationIntersector;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {IS_APPLE, IS_SAFARI} from '../environment/userAgent';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport simulateEvent from '../helpers/dom/dispatchEvent';\nimport type {SearchSuperContext} from './appSearchSuper.';\nimport {Document, DocumentAttribute, Message, PhotoSize} from '../layer';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport I18n from '../lib/langPack';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport copy from '../helpers/object/copy';\nimport deepEqual from '../helpers/object/deepEqual';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport getPeerTitle from './wrappers/getPeerTitle';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport onMediaLoad from '../helpers/onMediaLoad';\nimport EventListenerBase from '../helpers/eventListenerBase';\n\n// TODO: Safari: проверить стрим, включить его и сразу попробовать включить видео или другую песню\n// TODO: Safari: попробовать замаскировать подгрузку последнего чанка\n// TODO: Safari: пофиксить момент, когда заканчивается песня и пытаешься включить её заново - прогресс сразу в конце\n\nexport type MediaItem = {mid: number, peerId: PeerId};\n\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\n\nconst SHOULD_USE_SAFARI_FIX = (() => {\n try {\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\n } catch(err) {\n return false;\n }\n})();\n\nconst SEEK_OFFSET = 10;\n\nexport type MediaSearchContext = SearchSuperContext & Partial<{\n isScheduled: boolean,\n useSearch: boolean\n}>;\n\ntype MediaDetails = {\n peerId: PeerId,\n mid: number,\n docId: DocId,\n doc: MyDocument,\n message: Message.message,\n clean?: boolean,\n isScheduled?: boolean,\n isSingle?: boolean\n};\n\nexport type PlaybackMediaType = 'voice' | 'video' | 'audio';\n\nexport class AppMediaPlaybackController extends EventListenerBase<{\n play: (details: ReturnType) => void,\n pause: () => void,\n playbackParams: (params: ReturnType) => void,\n stop: () => void,\n}> {\n private container: HTMLElement;\n private media: Map> = new Map();\n private scheduled: AppMediaPlaybackController['media'] = new Map();\n private mediaDetails: Map = new Map();\n private playingMedia: HTMLMediaElement;\n private playingMediaType: PlaybackMediaType;\n\n private waitingMediaForLoad: Map>> = new Map();\n private waitingScheduledMediaForLoad: AppMediaPlaybackController['waitingMediaForLoad'] = new Map();\n private waitingDocumentsForLoad: {[docId: string]: Set} = {};\n\n public willBePlayedMedia: HTMLMediaElement;\n private searchContext: MediaSearchContext;\n\n private listLoader: SearchListLoader;\n\n public volume: number;\n public muted: boolean;\n public playbackRate: number;\n public loop: boolean;\n public round: boolean;\n private _volume: number;\n private _muted: boolean;\n private _playbackRate: number;\n private _loop: boolean;\n private _round: boolean;\n private lockedSwitchers: boolean;\n private playbackRates: Record = {\n voice: 1,\n video: 1,\n audio: 1\n };\n\n private pip: HTMLVideoElement;\n private managers: AppManagers;\n private skipMediaPlayEvent: boolean;\n\n construct(managers: AppManagers) {\n this.managers = managers;\n this.container = document.createElement('div');\n // this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\n this.container.style.cssText = 'display: none;';\n document.body.append(this.container);\n\n if(navigator.mediaSession) {\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\n play: this.browserPlay,\n pause: this.browserPause,\n stop: this.browserStop,\n seekbackward: this.browserSeekBackward,\n seekforward: this.browserSeekForward,\n seekto: this.browserSeekTo,\n previoustrack: this.browserPrevious,\n nexttrack: this.browserNext\n };\n\n for(const action in actions) {\n try {\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\n } catch(err) {\n console.warn('MediaSession action is not supported:', action);\n }\n }\n }\n\n rootScope.addEventListener('document_downloaded', (docId) => {\n const set = this.waitingDocumentsForLoad[docId];\n if(set) {\n for(const media of set) {\n this.onMediaDocumentLoad(media);\n }\n }\n });\n\n rootScope.addEventListener('media_play', () => {\n if(this.skipMediaPlayEvent) {\n this.skipMediaPlayEvent = false;\n return;\n }\n\n if(!this.pause() && this.pip) {\n this.pip.pause();\n }\n });\n\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\n const keys = [\n 'volume' as const,\n 'muted' as const,\n 'playbackRate' as const,\n 'loop' as const,\n 'round' as const\n ];\n keys.forEach((key) => {\n const _key = ('_' + key) as `_${typeof key}`;\n properties[key] = {\n get: () => this[_key],\n set: (value: number | boolean) => {\n if(this[_key] === value) {\n return;\n }\n\n // @ts-ignore\n this[_key] = value;\n if(this.playingMedia && (key !== 'loop' || this.playingMediaType === 'audio') && key !== 'round') {\n // @ts-ignore\n this.playingMedia[key] = value;\n }\n\n if(key === 'playbackRate' && this.playingMediaType !== undefined) {\n this.playbackRates[this.playingMediaType] = value as number;\n }\n\n this.dispatchPlaybackParams();\n }\n };\n });\n Object.defineProperties(this, properties);\n }\n\n private dispatchPlaybackParams() {\n this.dispatchEvent('playbackParams', this.getPlaybackParams());\n }\n\n public getPlaybackParams() {\n const {volume, muted, playbackRate, playbackRates, loop, round} = this;\n return {\n volume,\n muted,\n playbackRate,\n playbackRates,\n loop,\n round\n };\n }\n\n public setPlaybackParams(params: ReturnType) {\n this.playbackRates = params.playbackRates;\n this._volume = params.volume;\n this._muted = params.muted;\n this._playbackRate = params.playbackRate;\n this._loop = params.loop;\n this._round = params.round;\n }\n\n public seekBackward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\n }\n };\n\n public seekForward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\n }\n };\n\n public seekTo = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = details.seekTime;\n }\n };\n\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\n const {peerId, mid} = message;\n\n const isScheduled = !!message.pFlags.is_scheduled;\n const s = isScheduled ? this.scheduled : this.media;\n let storage = s.get(message.peerId);\n if(!storage) {\n s.set(message.peerId, storage = new Map());\n }\n\n let media = storage.get(mid);\n if(media) {\n return media;\n }\n\n const doc = getMediaFromMessage(message) as Document.document;\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\n // const source = document.createElement('source');\n // source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\n\n if(doc.type === 'round') {\n media.setAttribute('playsinline', 'true');\n // media.muted = true;\n }\n\n const details: MediaDetails = {\n peerId,\n mid,\n docId: doc.id,\n doc,\n message,\n clean,\n isScheduled: message.pFlags.is_scheduled\n };\n\n this.mediaDetails.set(media, details);\n\n // media.autoplay = true;\n media.volume = 1;\n // media.append(source);\n\n this.container.append(media);\n\n media.addEventListener('play', this.onPlay);\n media.addEventListener('pause', this.onPause);\n media.addEventListener('ended', this.onEnded);\n\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\n media.addEventListener('timeupdate', () => {\n this.managers.appMessagesManager.readMessages(peerId, [mid]);\n }, {once: true});\n }\n\n /* const onError = (e: Event) => {\n //console.log('appMediaPlaybackController: video onError', e);\n\n if(this.nextMid === mid) {\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\n if(this.nextMid && storage[this.nextMid]) {\n storage[this.nextMid].play();\n }\n });\n }\n };\n\n media.addEventListener('error', onError); */\n\n const deferred = deferredPromise();\n if(autoload) {\n deferred.resolve();\n } else {\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\n let waitingStorage = w.get(peerId);\n if(!waitingStorage) {\n w.set(peerId, waitingStorage = new Map());\n }\n\n waitingStorage.set(mid, deferred);\n }\n\n deferred.then(async() => {\n // media.autoplay = true;\n // console.log('will set media url:', media, doc, doc.type, doc.url);\n\n if(doc.supportsStreaming || (await this.managers.thumbsStorage.getCacheContext(doc)).url) {\n this.onMediaDocumentLoad(media);\n } else {\n let set = this.waitingDocumentsForLoad[doc.id];\n if(!set) {\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\n }\n\n set.add(media);\n appDownloadManager.downloadMediaURL({media: doc});\n }\n }/* , onError */);\n\n return media;\n }\n\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\n return s?.get(mid);\n }\n\n private onMediaDocumentLoad = async(media: HTMLMediaElement) => {\n const details = this.mediaDetails.get(media);\n const doc = await this.managers.appDocsManager.getDoc(details.docId);\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\n this.handleSafariStreamable(media);\n }\n\n // setTimeout(() => {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\n media.src = cacheContext.url;\n\n if(this.playingMedia === media) {\n media.playbackRate = this.playbackRate;\n\n if(doc.type === 'audio') {\n media.loop = this.loop;\n }\n }\n // }, doc.supportsStreaming ? 500e3 : 0);\n\n const set = this.waitingDocumentsForLoad[doc.id];\n if(set) {\n set.delete(media);\n\n if(!set.size) {\n delete this.waitingDocumentsForLoad[doc.id];\n }\n }\n };\n\n // safari подгрузит последний чанк и песня включится,\n // при этом этот чанк нельзя руками отдать из SW, потому что браузер тогда теряется\n private handleSafariStreamable(media: HTMLMediaElement) {\n media.addEventListener('play', () => {\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\n return;\n } */\n\n // media.volume = 0;\n const currentTime = media.currentTime;\n // this.setSafariBuffering(media, true);\n\n media.addEventListener('progress', () => {\n media.currentTime = media.duration - 1;\n\n media.addEventListener('progress', () => {\n media.currentTime = currentTime;\n // media.volume = 1;\n // this.setSafariBuffering(media, false);\n\n if(!media.paused) {\n media.play()/* .catch(() => {}) */;\n }\n }, {once: true});\n }, {once: true});\n }/* , {once: true} */);\n }\n\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\n const storage = w.get(peerId);\n if(!storage) {\n return;\n }\n\n const promise = storage.get(mid);\n if(promise) {\n promise.resolve();\n storage.delete(mid);\n\n if(!storage.size) {\n w.delete(peerId);\n }\n }\n }\n\n /**\n * Only for audio\n */\n public isSafariBuffering(media: HTMLMediaElement) {\n // @ts-ignore\n return !!media.safariBuffering;\n }\n\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\n // @ts-ignore\n media.safariBuffering = value;\n }\n\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\n if(document.pictureInPictureElement) {\n return;\n }\n\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\n\n const doc = getMediaFromMessage(message) as MyDocument;\n\n const artwork: MediaImage[] = [];\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n let title = '', artist = '';\n\n if(doc.thumbs?.length) {\n const size = doc.thumbs[doc.thumbs.length - 1];\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\n\n if(cacheContext.url) {\n artwork.push({\n src: cacheContext.url,\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\n type: 'image/jpeg'\n });\n } else {\n const download = appDownloadManager.downloadMediaURL({media: doc, thumb: size});\n download.then(() => {\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\n return;\n }\n\n this.setNewMediadata(message);\n });\n }\n }\n } else if(isVoice) {\n const peerId = message.fromId || message.peerId;\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n // const result = this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\n // if(result.cached) {\n // const url = await result.loadPromise;\n // artwork.push({\n // src: url,\n // sizes: '160x160',\n // type: 'image/jpeg'\n // });\n // } else {\n // result.loadPromise.then((url) => {\n // if(this.playingMedia !== playingMedia || !url) {\n // return;\n // }\n\n // this.setNewMediadata(message);\n // });\n // }\n }\n\n title = await getPeerTitle({peerId, plainText: true, onlyFirstName: false});\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\n }\n\n if(!isVoice) {\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n title = attribute?.title ?? doc.file_name;\n artist = attribute?.performer;\n }\n\n if(!artwork.length) {\n if(IS_APPLE) {\n if(IS_TOUCH_SUPPORTED) {\n artwork.push({\n src: `assets/img/apple-touch-icon-precomposed.png`,\n sizes: '180x180',\n type: 'image/png'\n });\n } else {\n artwork.push({\n src: `assets/img/apple-touch-icon.png`,\n sizes: '180x180',\n type: 'image/png'\n });\n }\n } else {\n [72, 96, 144, 192, 256, 384, 512].forEach((size) => {\n const sizes = `${size}x${size}`;\n artwork.push({\n src: `assets/img/android-chrome-${sizes}.png`,\n sizes,\n type: 'image/png'\n });\n });\n }\n }\n\n const metadata = new MediaMetadata({\n title,\n artist,\n artwork\n });\n\n navigator.mediaSession.metadata = metadata;\n }\n\n public setCurrentMediadata() {\n const {playingMedia} = this;\n if(!playingMedia) return;\n const message = this.getMessageByMedia(playingMedia);\n this.setNewMediadata(message, playingMedia);\n }\n\n private getMessageByMedia(media: HTMLMediaElement): Message.message {\n const details = this.mediaDetails.get(media);\n return details.message;\n // const {peerId, mid} = details;\n // const message = details.isScheduled ?\n // this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) :\n // this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n // return message;\n }\n\n public getPlayingDetails() {\n const {playingMedia} = this;\n if(!playingMedia) {\n return;\n }\n\n const message = this.getMessageByMedia(playingMedia);\n return {\n doc: getMediaFromMessage(message) as MyDocument,\n message,\n media: playingMedia,\n playbackParams: this.getPlaybackParams()\n };\n }\n\n private onPlay = (e?: Event) => {\n const media = e.target as HTMLMediaElement;\n const details = this.mediaDetails.get(media);\n const {peerId, mid} = details;\n\n // console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\n\n const pip = this.pip;\n if(pip) {\n pip.pause();\n }\n\n const message = this.getMessageByMedia(media);\n\n const previousMedia = this.playingMedia;\n if(previousMedia !== media) {\n this.stop();\n this.setMedia(media, message);\n\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\n const listLoader = this.listLoader;\n const current = listLoader.getCurrent();\n if(!current || !verify(current)) {\n let jumpLength: number;\n\n for(const withOtherSide of [false, true]) {\n const previous = listLoader.getPrevious(withOtherSide);\n\n let idx = previous.findIndex(verify);\n if(idx !== -1) {\n jumpLength = -(previous.length - idx);\n } else {\n const next = listLoader.getNext(withOtherSide);\n idx = next.findIndex(verify);\n if(idx !== -1) {\n jumpLength = idx + 1;\n }\n }\n\n if(jumpLength !== undefined) {\n break;\n }\n }\n\n if(jumpLength) {\n this.go(jumpLength, false);\n } else {\n this.setTargets({peerId, mid});\n }\n }\n }\n\n // audio_pause не успеет сработать без таймаута\n setTimeout(() => {\n if(this.playingMedia !== media) {\n return;\n }\n\n this.dispatchEvent('play', this.getPlayingDetails());\n this.pauseMediaInOtherTabs();\n }, 0);\n };\n\n private onPause = (e?: Event) => {\n /* const target = e.target as HTMLMediaElement;\n if(!isInDOM(target)) {\n this.container.append(target);\n target.play();\n return;\n } */\n\n // if(this.pip) {\n // this.pip.play();\n // }\n\n this.dispatchEvent('pause');\n };\n\n private onEnded = (e?: Event) => {\n if(!e.isTrusted) {\n return;\n }\n\n this.onPause(e);\n\n // console.log('on media end');\n\n const listLoader = this.listLoader;\n if(this.lockedSwitchers ||\n (!this.round && listLoader.current && !listLoader.next.length) ||\n !listLoader.getNext(true).length ||\n !this.next()) {\n this.stop();\n this.dispatchEvent('stop');\n }\n };\n\n public pauseMediaInOtherTabs() {\n this.skipMediaPlayEvent = true;\n rootScope.dispatchEvent('media_play');\n }\n\n // public get pip() {\n // return document.pictureInPictureElement as HTMLVideoElement;\n // }\n\n public toggle(play?: boolean, media = this.playingMedia) {\n if(!media) {\n return false;\n }\n\n if(play === undefined) {\n play = media.paused;\n }\n\n if(media.paused !== play) {\n return false;\n }\n\n if(play) {\n media.play();\n } else {\n media.pause();\n }\n\n return true;\n }\n\n public play = () => {\n return this.toggle(true);\n };\n\n public pause = () => {\n return this.toggle(false);\n };\n\n public stop = (media = this.playingMedia) => {\n if(!media) {\n return false;\n }\n\n if(!media.paused) {\n media.pause();\n }\n\n media.currentTime = 0;\n simulateEvent(media, 'ended');\n\n if(media === this.playingMedia) {\n const details = this.mediaDetails.get(media);\n if(details?.clean) {\n media.src = '';\n const peerId = details.peerId;\n const s = details.isScheduled ? this.scheduled : this.media;\n const storage = s.get(peerId);\n if(storage) {\n storage.delete(details.mid);\n\n if(!storage.size) {\n s.delete(peerId);\n }\n }\n\n media.remove();\n\n this.mediaDetails.delete(media);\n }\n\n this.playingMedia = undefined;\n this.playingMediaType = undefined;\n }\n\n return true;\n };\n\n public playItem = (item: MediaItem) => {\n const {peerId, mid} = item;\n const isScheduled = this.searchContext.isScheduled;\n const media = this.getMedia(peerId, mid, isScheduled);\n\n /* if(isSafari) {\n media.autoplay = true;\n } */\n\n media.play();\n\n setTimeout(() => {\n this.resolveWaitingForLoadMedia(peerId, mid, isScheduled);\n }, 0);\n };\n\n public go = (length: number, dispatchJump?: boolean) => {\n const listLoader = this.listLoader;\n if(this.lockedSwitchers || !listLoader) {\n return;\n }\n\n if(this.playingMediaType === 'audio') {\n return listLoader.goRound(length, dispatchJump);\n } else {\n return listLoader.go(length, dispatchJump);\n }\n };\n\n private bindBrowserCallback(cb: (video: HTMLVideoElement, details: MediaSessionActionDetails) => void) {\n const handler: MediaSessionActionHandler = (details) => {\n cb(this.pip, details);\n };\n\n return handler;\n }\n\n public browserPlay = this.bindBrowserCallback((video) => this.toggle(true, video));\n public browserPause = this.bindBrowserCallback((video) => this.toggle(false, video));\n public browserStop = this.bindBrowserCallback((video) => this.stop(video));\n public browserSeekBackward = this.bindBrowserCallback((video, details) => this.seekBackward(details, video));\n public browserSeekForward = this.bindBrowserCallback((video, details) => this.seekForward(details, video));\n public browserSeekTo = this.bindBrowserCallback((video, details) => this.seekTo(details, video));\n public browserNext = this.bindBrowserCallback((video) => video || this.next());\n public browserPrevious = this.bindBrowserCallback((video) => video ? this.seekToStart(video) : this.previous());\n\n public next = () => {\n return this.go(1);\n };\n\n public previous = () => {\n if(this.seekToStart(this.playingMedia)) {\n return;\n }\n\n return this.go(-1);\n };\n\n public seekToStart(media: HTMLMediaElement) {\n if(media?.currentTime > 5) {\n media.currentTime = 0;\n this.toggle(true, media);\n return true;\n }\n\n return false;\n }\n\n public willBePlayed(media: HTMLMediaElement) {\n this.willBePlayedMedia = media;\n }\n\n public setSearchContext(context: MediaSearchContext) {\n if(deepEqual(this.searchContext, context)) {\n return false;\n }\n\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\n return true;\n }\n\n public getSearchContext() {\n return this.searchContext;\n }\n\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\n let listLoader = this.listLoader;\n if(!listLoader) {\n listLoader = this.listLoader = new SearchListLoader({\n loadCount: 10,\n loadWhenLeft: 5,\n processItem: (message: Message.message) => {\n this.addMedia(message, false);\n return {peerId: message.peerId, mid: message.mid};\n },\n onJump: (item, older) => {\n this.playItem(item);\n },\n onEmptied: () => {\n this.dispatchEvent('stop');\n this.stop();\n }\n });\n } else {\n listLoader.reset();\n }\n\n const reverse = this.searchContext.folderId !== undefined ? false : true;\n if(prev) {\n listLoader.setTargets(prev, next, reverse);\n } else {\n listLoader.reverse = reverse;\n }\n\n listLoader.setSearchContext(this.searchContext);\n listLoader.current = current;\n\n listLoader.load(true);\n listLoader.load(false);\n }\n\n private getPlaybackMediaTypeFromMessage(message: Message.message) {\n const doc = getMediaFromMessage(message) as MyDocument;\n let mediaType: PlaybackMediaType = 'audio';\n if(doc?.type) {\n if(doc.type === 'voice' || doc.type === 'round') {\n mediaType = 'voice';\n } else if(doc.type === 'video') {\n mediaType = 'video';\n }\n }\n\n return mediaType;\n }\n\n public setMedia(media: HTMLMediaElement, message: Message.message) {\n const mediaType = this.getPlaybackMediaTypeFromMessage(message);\n\n this._playbackRate = this.playbackRates[mediaType];\n\n this.playingMedia = media;\n this.playingMediaType = mediaType;\n this.playingMedia.volume = this.volume;\n this.playingMedia.muted = this.muted;\n this.playingMedia.playbackRate = this.playbackRate;\n\n if(mediaType === 'audio') {\n this.playingMedia.loop = this.loop;\n }\n\n if('mediaSession' in navigator) {\n this.setNewMediadata(message);\n }\n }\n\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\n const playingMedia = this.playingMedia;\n\n const wasPlaying = this.pause();\n\n let onPlay: () => void;\n if(media) {\n onPlay = () => {\n const pip = this.pip;\n if(pip) {\n pip.pause();\n }\n\n this.pauseMediaInOtherTabs();\n };\n\n if(!media.paused) {\n onPlay();\n }\n\n media.addEventListener('play', onPlay);\n } else { // maybe it's voice recording\n this.pauseMediaInOtherTabs();\n }\n\n this.willBePlayed(undefined);\n if(media) this.setMedia(media, message);\n else this.playingMedia = undefined;\n this.toggleSwitchers(false);\n\n return (playPaused = wasPlaying) => {\n this.toggleSwitchers(true);\n\n if(playingMedia) {\n if(this.mediaDetails.get(playingMedia)) {\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\n } else {\n this.next() || this.previous();\n }\n }\n\n // If it's still not cleaned\n if(this.playingMedia === media) {\n this.playingMedia = undefined;\n this.playingMediaType = undefined;\n }\n\n if(media) {\n media.removeEventListener('play', onPlay);\n }\n\n // I don't remember what it was for\n // if(media && this.playingMedia === media) {\n // this.stop();\n // }\n\n if(playPaused) {\n this.play();\n }\n };\n }\n\n public toggleSwitchers(enabled: boolean) {\n this.lockedSwitchers = !enabled;\n }\n\n public setPictureInPicture(video: HTMLVideoElement) {\n this.pip = video;\n\n // let wasPlaying = this.pause();\n\n const listenerSetter = new ListenerSetter();\n listenerSetter.add(video)('leavepictureinpicture', () => {\n if(this.pip !== video) {\n return;\n }\n\n this.pip = undefined;\n // if(wasPlaying) {\n // this.play();\n // }\n\n listenerSetter.removeAll();\n }, {once: true});\n\n listenerSetter.add(video)('play', (e) => {\n if(this.playingMedia !== video) {\n this.pause();\n }\n\n this.pauseMediaInOtherTabs();\n // if(this.pause()) {\n // listenerSetter.add(video)('pause', () => {\n // this.play();\n // }, {once: true});\n // }\n });\n }\n}\n\nconst appMediaPlaybackController = new AppMediaPlaybackController();\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\nexport default appMediaPlaybackController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../environment/mediaMimeTypesSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport mediaSizes from '../helpers/mediaSizes';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport {Message} from '../layer';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport canSaveMessageMedia from '../lib/appManagers/utils/messages/canSaveMessageMedia';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport {MediaSearchContext} from './appMediaPlaybackController';\nimport AppMediaViewerBase, {MEDIA_VIEWER_CLASSNAME} from './appMediaViewerBase';\nimport {ButtonMenuItemOptionsVerifiable} from './buttonMenu';\nimport PopupDeleteMessages from './popups/deleteMessages';\nimport PopupForward from './popups/forward';\nimport Scrollable from './scrollable';\nimport appSidebarRight from './sidebarRight';\nimport AppSharedMediaTab from './sidebarRight/tabs/sharedMedia';\n\ntype AppMediaViewerTargetType = {\n element: HTMLElement,\n mid: number,\n peerId: PeerId\n};\nexport default class AppMediaViewer extends AppMediaViewerBase<'caption', 'delete' | 'forward', AppMediaViewerTargetType> {\n protected listLoader: SearchListLoader;\n protected btnMenuForward: ButtonMenuItemOptionsVerifiable;\n protected btnMenuDownload: ButtonMenuItemOptionsVerifiable;\n protected btnMenuDelete: ButtonMenuItemOptionsVerifiable;\n\n get searchContext() {\n return this.listLoader.searchContext;\n }\n\n constructor() {\n super(new SearchListLoader({\n processItem: (item) => {\n const isForDocument = this.searchContext.inputFilter._ === 'inputMessagesFilterDocument';\n const {mid, peerId} = item;\n const media: MyPhoto | MyDocument = getMediaFromMessage(item);\n\n if(!media) return;\n\n if(isForDocument && !AppMediaViewer.isMediaCompatibleForDocumentViewer(media)) {\n return;\n }\n\n return {element: null as HTMLElement, mid, peerId};\n }\n }), ['delete', 'forward']);\n\n this.listLoader.onEmptied = () => {\n this.close();\n };\n\n /* const stub = document.createElement('div');\n stub.classList.add(MEDIA_VIEWER_CLASSNAME + '-stub');\n this.content.main.prepend(stub); */\n\n this.content.caption = document.createElement('div');\n this.content.caption.classList.add(MEDIA_VIEWER_CLASSNAME + '-caption', 'spoilers-container'/* , 'media-viewer-stub' */);\n\n let captionTimeout: number;\n const setCaptionTimeout = () => {\n if(captionTimeout) {\n clearTimeout(captionTimeout);\n }\n\n captionTimeout = window.setTimeout(() => {\n captionTimeout = undefined;\n this.content.caption.classList.remove('is-focused');\n }, 800);\n };\n this.content.caption.addEventListener('touchstart', () => {\n if(!mediaSizes.isMobile) return;\n\n this.content.caption.classList.add('is-focused');\n\n if(captionTimeout) {\n clearTimeout(captionTimeout);\n captionTimeout = undefined;\n }\n\n document.addEventListener('touchend', setCaptionTimeout, {once: true});\n });\n\n const captionScrollable = new Scrollable(this.content.caption);\n captionScrollable.onAdditionalScroll = setCaptionTimeout;\n\n // this.content.main.append(this.content.caption);\n this.wholeDiv.append(this.content.caption);\n\n attachClickEvent(this.buttons.delete, this.onDeleteClick);\n\n const buttons: ButtonMenuItemOptionsVerifiable[] = [this.btnMenuForward = {\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick\n }, this.btnMenuDownload = {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }, this.btnMenuDelete = {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick\n }];\n\n this.setBtnMenuToggle(buttons);\n\n // * constructing html end\n\n this.setListeners();\n }\n\n protected setListeners() {\n super.setListeners();\n attachClickEvent(this.buttons.forward, this.onForwardClick);\n attachClickEvent(this.author.container, this.onAuthorClick);\n\n const onCaptionClick = (e: MouseEvent) => {\n const a = findUpTag(e.target, 'A');\n const spoiler = findUpClassName(e.target, 'spoiler');\n if(a instanceof HTMLAnchorElement && (!spoiler || this.content.caption.classList.contains('is-spoiler-visible'))) { // close viewer if it's t.me/ redirect\n const onclick = a.getAttribute('onclick');\n if(!onclick || onclick.includes('showMaskedAlert')) {\n return;\n }\n\n cancelEvent(e);\n\n this.close().then(() => {\n this.content.caption.removeEventListener('click', onCaptionClick, {capture: true});\n a.click();\n });\n\n return false;\n }\n };\n\n this.content.caption.addEventListener('click', onCaptionClick, {capture: true});\n }\n\n /* public close(e?: MouseEvent) {\n const good = !this.setMoverAnimationPromise;\n const promise = super.close(e);\n\n if(good) { // clear\n this.currentMessageId = 0;\n this.peerId = 0;\n }\n\n return promise;\n } */\n\n protected getMessageByPeer(peerId: PeerId, mid: number) {\n return this.searchContext.isScheduled ? this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) : this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n }\n\n onPrevClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await this.getMessageByPeer(target.peerId, target.mid), target.element, -1);\n };\n\n onNextClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await this.getMessageByPeer(target.peerId, target.mid), target.element, 1);\n };\n\n onDeleteClick = () => {\n const target = this.target;\n new PopupDeleteMessages(target.peerId, [target.mid], 'chat', () => {\n this.target = {element: this.content.media} as any;\n this.close();\n });\n };\n\n onForwardClick = () => {\n const target = this.target;\n if(target.mid) {\n // appSidebarRight.forwardTab.open([target.mid]);\n new PopupForward({\n [target.peerId]: [target.mid]\n }, () => {\n return this.close();\n });\n }\n };\n\n onAuthorClick = async(e: MouseEvent) => {\n const {mid, peerId} = this.target;\n if(mid && mid !== Number.MAX_SAFE_INTEGER) {\n const threadId = this.searchContext.threadId;\n const message = await this.getMessageByPeer(peerId, mid);\n this.close(e)\n // .then(() => mediaSizes.isMobile ? appSidebarRight.sharedMediaTab.closeBtn.click() : Promise.resolve())\n .then(async() => {\n if(mediaSizes.isMobile) {\n const tab = appSidebarRight.getTab(AppSharedMediaTab);\n if(tab) {\n tab.close();\n }\n }\n\n appImManager.setInnerPeer({\n peerId: message.peerId,\n lastMsgId: mid,\n type: threadId ? 'discussion' : undefined,\n threadId\n });\n });\n }\n };\n\n onDownloadClick = async() => {\n const {peerId, mid} = this.target;\n const message = await this.getMessageByPeer(peerId, mid);\n const media = getMediaFromMessage(message);\n if(!media) return;\n appDownloadManager.downloadToDisc({media, queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId});\n };\n\n private setCaption(message: MyMessage) {\n const caption = (message as Message.message).message;\n let html: Parameters[1] = '';\n if(caption) {\n html = wrapRichText(caption, {\n entities: (message as Message.message).totalEntities\n });\n }\n\n // html = 'Dandelion are a family of flowering plants that grow in many parts of the world.';\n setInnerHTML(this.content.caption.firstElementChild, html);\n this.content.caption.classList.toggle('hide', !caption);\n // this.content.container.classList.toggle('with-caption', !!caption);\n }\n\n public setSearchContext(context: MediaSearchContext) {\n this.listLoader.setSearchContext(context);\n\n return this;\n }\n\n public async openMedia(message: MyMessage, target?: HTMLElement, fromRight = 0, reverse = false,\n prevTargets: AppMediaViewerTargetType[] = [], nextTargets: AppMediaViewerTargetType[] = []/* , needLoadMore = true */) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const mid = message.mid;\n const fromId = (message as Message.message).fwd_from && !message.fromId ? (message as Message.message).fwd_from.from_name : message.fromId;\n const media = getMediaFromMessage(message);\n\n const noForwards = await this.managers.appPeersManager.noForwards(message.peerId);\n const isServiceMessage = message._ === 'messageService';\n const cantForwardMessage = isServiceMessage || !(await this.managers.appMessagesManager.canForward(message));\n const cantDownloadMessage = (isServiceMessage ? noForwards : cantForwardMessage) || !canSaveMessageMedia(message);\n const a: [(HTMLElement | ButtonMenuItemOptionsVerifiable)[], boolean][] = [\n [[this.buttons.forward, this.btnMenuForward], cantForwardMessage],\n [[this.buttons.download, this.btnMenuDownload], cantDownloadMessage],\n [[this.buttons.delete, this.btnMenuDelete], !(await this.managers.appMessagesManager.canDeleteMessage(message))]\n ];\n\n a.forEach(([buttons, hide]) => {\n buttons.forEach((button) => {\n if(button instanceof HTMLElement) {\n button.classList.toggle('hide', hide);\n } else {\n button.verify = () => !hide;\n }\n });\n });\n\n this.wholeDiv.classList.toggle('no-forwards', cantDownloadMessage);\n\n this.setCaption(message);\n const promise = super._openMedia(media, message.date, fromId, fromRight, target, reverse, prevTargets, nextTargets, message/* , needLoadMore */);\n this.target.mid = mid;\n this.target.peerId = message.peerId;\n\n return promise;\n }\n\n public static isMediaCompatibleForDocumentViewer(media: MyPhoto | MyDocument) {\n return media._ === 'photo' || MEDIA_MIME_TYPES_SUPPORTED.has(media.mime_type);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMediaPlaybackController from '../components/appMediaPlaybackController';\nimport {IS_APPLE_MOBILE, IS_MOBILE} from '../environment/userAgent';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport ListenerSetter, {Listener} from '../helpers/listenerSetter';\nimport {ButtonMenuSync} from '../components/buttonMenu';\nimport {ButtonMenuToggleHandler} from '../components/buttonMenuToggle';\nimport ControlsHover from '../helpers/dom/controlsHover';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../helpers/dom/fullScreen';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport MediaProgressLine from '../components/mediaProgressLine';\nimport VolumeSelector from '../components/volumeSelector';\nimport debounce from '../helpers/schedulers/debounce';\nimport overlayCounter from '../helpers/overlayCounter';\nimport onMediaLoad from '../helpers/onMediaLoad';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\n\nexport default class VideoPlayer extends ControlsHover {\n private static PLAYBACK_RATES = [0.5, 1, 1.5, 2];\n private static PLAYBACK_RATES_ICONS = ['playback_05', 'playback_1x', 'playback_15', 'playback_2x'];\n\n protected video: HTMLVideoElement;\n protected wrapper: HTMLDivElement;\n protected progress: MediaProgressLine;\n protected skin: 'default';\n\n protected listenerSetter: ListenerSetter;\n protected playbackRateButton: HTMLElement;\n protected pipButton: HTMLElement;\n\n /* protected videoParent: HTMLElement;\n protected videoWhichChild: number; */\n\n protected onPlaybackRackMenuToggle?: (open: boolean) => void;\n protected onPip?: (pip: boolean) => void;\n protected onPipClose?: () => void;\n\n constructor({video, play = false, streamable = false, duration, onPlaybackRackMenuToggle, onPip, onPipClose}: {\n video: HTMLVideoElement,\n play?: boolean,\n streamable?: boolean,\n duration?: number,\n onPlaybackRackMenuToggle?: VideoPlayer['onPlaybackRackMenuToggle'],\n onPip?: VideoPlayer['onPip'],\n onPipClose?: VideoPlayer['onPipClose']\n }) {\n super();\n\n this.video = video;\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('ckin__player');\n\n this.onPlaybackRackMenuToggle = onPlaybackRackMenuToggle;\n this.onPip = onPip;\n this.onPipClose = onPipClose;\n\n this.listenerSetter = new ListenerSetter();\n\n this.setup({\n element: this.wrapper,\n listenerSetter: this.listenerSetter,\n canHideControls: () => {\n return !this.video.paused && (!this.playbackRateButton || !this.playbackRateButton.classList.contains('menu-open'));\n },\n showOnLeaveToClassName: 'media-viewer-caption',\n ignoreClickClassName: 'ckin__controls'\n });\n\n video.parentNode.insertBefore(this.wrapper, video);\n this.wrapper.appendChild(video);\n\n this.skin = 'default';\n\n this.stylePlayer(duration);\n this.setBtnMenuToggle();\n\n if(this.skin === 'default') {\n const controls = this.wrapper.querySelector('.default__controls.ckin__controls') as HTMLDivElement;\n this.progress = new MediaProgressLine(video, streamable);\n controls.prepend(this.progress.container);\n }\n\n if(play/* && video.paused */) {\n const promise = video.play();\n promise.catch((err: Error) => {\n if(err.name === 'NotAllowedError') {\n video.muted = true;\n video.autoplay = true;\n video.play();\n }\n }).finally(() => { // due to autoplay, play will not call\n this.wrapper.classList.toggle('is-playing', !this.video.paused);\n });\n }\n }\n\n private stylePlayer(initDuration: number) {\n const {wrapper, video, skin, listenerSetter} = this;\n\n wrapper.classList.add(skin);\n\n const html = this.buildControls();\n wrapper.insertAdjacentHTML('beforeend', html);\n let timeDuration: HTMLElement;\n\n if(skin === 'default') {\n this.playbackRateButton = this.wrapper.querySelector('.playback-rate') as HTMLElement;\n this.pipButton = this.wrapper.querySelector('.pip') as HTMLElement;\n\n const toggle = wrapper.querySelectorAll('.toggle') as NodeListOf;\n const fullScreenButton = wrapper.querySelector('.fullscreen') as HTMLElement;\n const timeElapsed = wrapper.querySelector('#time-elapsed');\n timeDuration = wrapper.querySelector('#time-duration') as HTMLElement;\n timeDuration.textContent = toHHMMSS(video.duration | 0);\n\n const volumeSelector = new VolumeSelector(listenerSetter);\n\n const leftControls = wrapper.querySelector('.left-controls');\n volumeSelector.btn.classList.remove('btn-icon');\n leftControls.insertBefore(volumeSelector.btn, timeElapsed.parentElement);\n\n Array.from(toggle).forEach((button) => {\n attachClickEvent(button, () => {\n this.togglePlay();\n }, {listenerSetter: this.listenerSetter});\n });\n\n if(this.pipButton) {\n attachClickEvent(this.pipButton, () => {\n this.video.requestPictureInPicture();\n }, {listenerSetter: this.listenerSetter});\n\n const onPip = (pip: boolean) => {\n this.wrapper.style.visibility = pip ? 'hidden': '';\n if(this.onPip) {\n this.onPip(pip);\n }\n };\n\n const debounceTime = 20;\n const debouncedPip = debounce(onPip, debounceTime, false, true);\n\n listenerSetter.add(video)('enterpictureinpicture', () => {\n debouncedPip(true);\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n const onPause = () => {\n clearTimeout(timeout);\n if(this.onPipClose) {\n this.onPipClose();\n }\n };\n const listener = listenerSetter.add(video)('pause', onPause, {once: true}) as any as Listener;\n const timeout = setTimeout(() => {\n listenerSetter.remove(listener);\n }, debounceTime);\n }, {once: true});\n });\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n debouncedPip(false);\n });\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n attachClickEvent(video, () => {\n this.togglePlay();\n }, {listenerSetter: this.listenerSetter});\n\n listenerSetter.add(document)('keydown', (e: KeyboardEvent) => {\n if(overlayCounter.overlaysActive > 1 || document.pictureInPictureElement === video) { // forward popup is active, etc\n return;\n }\n\n const {key, code} = e;\n\n let good = true;\n if(code === 'KeyF') {\n this.toggleFullScreen();\n } else if(code === 'KeyM') {\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n } else if(code === 'Space') {\n this.togglePlay();\n } else if(e.altKey && (code === 'Equal' || code === 'Minus')) {\n const add = code === 'Equal' ? 1 : -1;\n const playbackRate = appMediaPlaybackController.playbackRate;\n const idx = VideoPlayer.PLAYBACK_RATES.indexOf(playbackRate);\n const nextIdx = idx + add;\n if(nextIdx >= 0 && nextIdx < VideoPlayer.PLAYBACK_RATES.length) {\n appMediaPlaybackController.playbackRate = VideoPlayer.PLAYBACK_RATES[nextIdx];\n }\n } else if(wrapper.classList.contains('ckin__fullscreen') && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n if(key === 'ArrowLeft') appMediaPlaybackController.seekBackward({action: 'seekbackward'});\n else appMediaPlaybackController.seekForward({action: 'seekforward'});\n } else {\n good = false;\n }\n\n if(good) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n listenerSetter.add(video)('dblclick', () => {\n if(!IS_TOUCH_SUPPORTED) {\n this.toggleFullScreen();\n }\n });\n\n attachClickEvent(fullScreenButton, () => {\n this.toggleFullScreen();\n }, {listenerSetter: this.listenerSetter});\n\n addFullScreenListener(wrapper, this.onFullScreen.bind(this, fullScreenButton), listenerSetter);\n\n listenerSetter.add(video)('timeupdate', () => {\n timeElapsed.textContent = toHHMMSS(video.currentTime | 0);\n });\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('played');\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('play', () => {\n this.hideControls(true);\n });\n }\n }, {once: true});\n\n listenerSetter.add(video)('pause', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(appMediaPlaybackController)('playbackParams', () => {\n this.setPlaybackRateIcon();\n });\n }\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('is-playing');\n });\n\n listenerSetter.add(video)('pause', () => {\n wrapper.classList.remove('is-playing');\n });\n\n if(video.duration || initDuration) {\n timeDuration.textContent = toHHMMSS(Math.round(video.duration || initDuration));\n } else {\n onMediaLoad(video).then(() => {\n timeDuration.textContent = toHHMMSS(Math.round(video.duration));\n });\n }\n }\n\n protected togglePlay() {\n this.video[this.video.paused ? 'play' : 'pause']();\n }\n\n private buildControls() {\n const skin = this.skin;\n if(skin === 'default') {\n return `\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n ${!IS_MOBILE && document.pictureInPictureEnabled ? `` : ''}\n \n
\n
\n
`;\n }\n }\n\n protected setBtnMenuToggle() {\n const buttons: Parameters[0]['buttons'] = VideoPlayer.PLAYBACK_RATES.map((rate, idx) => {\n return {\n // icon: VideoPlayer.PLAYBACK_RATES_ICONS[idx],\n regularText: rate + 'x',\n onClick: () => {\n appMediaPlaybackController.playbackRate = rate;\n }\n };\n });\n const btnMenu = ButtonMenuSync({buttons});\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler({\n el: this.playbackRateButton,\n onOpen: this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(true);\n } : undefined,\n onClose: this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(false);\n } : undefined\n });\n this.playbackRateButton.append(btnMenu);\n\n this.setPlaybackRateIcon();\n }\n\n protected setPlaybackRateIcon() {\n const playbackRateButton = this.playbackRateButton;\n VideoPlayer.PLAYBACK_RATES_ICONS.forEach((className) => {\n className = 'tgico-' + className;\n playbackRateButton.classList.remove(className);\n });\n\n let idx = VideoPlayer.PLAYBACK_RATES.indexOf(appMediaPlaybackController.playbackRate);\n if(idx === -1) idx = VideoPlayer.PLAYBACK_RATES.indexOf(1);\n\n playbackRateButton.classList.add('tgico-' + VideoPlayer.PLAYBACK_RATES_ICONS[idx]);\n }\n\n protected toggleFullScreen() {\n const player = this.wrapper;\n\n // * https://caniuse.com/#feat=fullscreen\n if(IS_APPLE_MOBILE) {\n const video = this.video as any;\n video.webkitEnterFullscreen();\n video.enterFullscreen();\n return;\n }\n\n if(!isFullScreen()) {\n /* const videoParent = this.video.parentElement;\n const videoWhichChild = whichChild(this.video);\n const needVideoRemount = videoParent !== player;\n\n if(needVideoRemount) {\n this.videoParent = videoParent;\n this.videoWhichChild = videoWhichChild;\n player.prepend(this.video);\n } */\n\n requestFullScreen(player);\n } else {\n /* if(this.videoParent) {\n const {videoWhichChild, videoParent} = this;\n if(!videoWhichChild) {\n videoParent.prepend(this.video);\n } else {\n videoParent.insertBefore(this.video, videoParent.children[videoWhichChild]);\n }\n\n this.videoParent = null;\n this.videoWhichChild = -1;\n } */\n\n cancelFullScreen();\n }\n }\n\n protected onFullScreen(fullScreenButton: HTMLElement) {\n const isFull = isFullScreen();\n this.wrapper.classList.toggle('ckin__fullscreen', isFull);\n if(!isFull) {\n fullScreenButton.classList.remove('tgico-smallscreen');\n fullScreenButton.classList.add('tgico-fullscreen');\n fullScreenButton.setAttribute('title', 'Full Screen');\n } else {\n fullScreenButton.classList.remove('tgico-fullscreen');\n fullScreenButton.classList.add('tgico-smallscreen');\n fullScreenButton.setAttribute('title', 'Exit Full Screen');\n }\n }\n\n public cleanup() {\n super.cleanup();\n this.listenerSetter.removeAll();\n this.progress.removeListeners();\n this.onPlaybackRackMenuToggle = this.onPip = undefined;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise from '../helpers/cancellablePromise';\nimport mediaSizes from '../helpers/mediaSizes';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from '../environment/userAgent';\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {logger} from '../lib/logger';\nimport VideoPlayer from '../lib/mediaPlayer';\nimport rootScope from '../lib/rootScope';\nimport animationIntersector from './animationIntersector';\nimport appMediaPlaybackController, {AppMediaPlaybackController} from './appMediaPlaybackController';\nimport AvatarElement from './avatar';\nimport ButtonIcon from './buttonIcon';\nimport {ButtonMenuItemOptions} from './buttonMenu';\nimport ButtonMenuToggle from './buttonMenuToggle';\nimport ProgressivePreloader from './preloader';\nimport SwipeHandler from './swipeHandler';\nimport {formatFullSentTime} from '../helpers/date';\nimport appNavigationController, {NavigationItem} from './appNavigationController';\nimport {Message} from '../layer';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport renderImageFromUrl, {renderImageFromUrlPromise} from '../helpers/dom/renderImageFromUrl';\nimport getVisibleRect from '../helpers/dom/getVisibleRect';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport fillPropertyValue from '../helpers/fillPropertyValue';\nimport generatePathData from '../helpers/generatePathData';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {doubleRaf, fastRaf} from '../helpers/schedulers';\nimport RangeSelector from './rangeSelector';\nimport windowSize from '../helpers/windowSize';\nimport ListLoader from '../helpers/listLoader';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport {isFullScreen} from '../helpers/dom/fullScreen';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport createVideo from '../helpers/dom/createVideo';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getStrippedThumbIfNeeded from '../helpers/getStrippedThumbIfNeeded';\nimport setAttachmentSize from '../helpers/setAttachmentSize';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport LazyLoadQueueBase from './lazyLoadQueueBase';\nimport overlayCounter from '../helpers/overlayCounter';\nimport {ThumbCache} from '../lib/storages/thumbs';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport wrapPeerTitle from './wrappers/peerTitle';\nimport {toastNew} from './toast';\n\nconst ZOOM_STEP = 0.5;\nconst ZOOM_INITIAL_VALUE = 1;\nconst ZOOM_MIN_VALUE = 0.5;\nconst ZOOM_MAX_VALUE = 4;\n\n// TODO: масштабирование картинок (не SVG) при ресайзе, и правильный возврат на исходную позицию\n// TODO: картинки \"обрезаются\" если возвращаются или появляются с места, где есть их перекрытие (топбар, поле ввода)\n// TODO: видео в мобильной вёрстке, если показываются элементы управления: если свайпнуть в сторону, то элементы вернутся на место, т.е. прыгнут - это не ок, надо бы замаскировать\n\nexport const MEDIA_VIEWER_CLASSNAME = 'media-viewer';\n\nexport default class AppMediaViewerBase<\n ContentAdditionType extends string,\n ButtonsAdditionType extends string,\n TargetType extends {element: HTMLElement\n}> extends EventListenerBase<{\n setMoverBefore: () => void,\n setMoverAfter: () => void\n}> {\n protected wholeDiv: HTMLElement;\n protected overlaysDiv: HTMLElement;\n protected author: {[k in 'container' | 'avatarEl' | 'nameEl' | 'date']: HTMLElement} = {} as any;\n protected content: {[k in 'main' | 'container' | 'media' | 'mover' | ContentAdditionType]: HTMLElement} = {} as any;\n protected buttons: {[k in 'download' | 'close' | 'prev' | 'next' | 'mobile-close' | 'zoom' | ButtonsAdditionType]: HTMLElement} = {} as any;\n protected topbar: HTMLElement;\n protected moversContainer: HTMLElement;\n\n protected tempId = 0;\n protected preloader: ProgressivePreloader = null;\n protected preloaderStreamable: ProgressivePreloader = null;\n\n // protected targetContainer: HTMLElement = null;\n // protected loadMore: () => void = null;\n\n protected log: ReturnType;\n\n protected isFirstOpen = true;\n\n // protected needLoadMore = true;\n\n protected pageEl = document.getElementById('page-chats') as HTMLDivElement;\n\n protected setMoverPromise: Promise;\n protected setMoverAnimationPromise: Promise;\n\n protected lazyLoadQueue: LazyLoadQueueBase;\n\n protected highlightSwitchersTimeout: number;\n\n protected onDownloadClick: (e: MouseEvent) => void;\n protected onPrevClick: (target: TargetType) => void;\n protected onNextClick: (target: TargetType) => void;\n\n protected videoPlayer: VideoPlayer;\n\n protected zoomElements: {\n container: HTMLElement,\n btnOut: HTMLElement,\n btnIn: HTMLElement,\n rangeSelector: RangeSelector\n } = {} as any;\n // protected zoomValue = ZOOM_INITIAL_VALUE;\n protected zoomSwipeHandler: SwipeHandler;\n protected zoomSwipeStartX = 0;\n protected zoomSwipeStartY = 0;\n protected zoomSwipeX = 0;\n protected zoomSwipeY = 0;\n\n protected ctrlKeyDown: boolean;\n protected releaseSingleMedia: ReturnType;\n protected navigationItem: NavigationItem;\n\n protected managers: AppManagers;\n\n get target() {\n return this.listLoader.current;\n }\n\n set target(value) {\n this.listLoader.current = value;\n }\n\n constructor(\n protected listLoader: ListLoader,\n topButtons: Array['buttons']>\n ) {\n super(false);\n\n this.managers = rootScope.managers;\n\n this.log = logger('AMV');\n this.preloader = new ProgressivePreloader();\n this.preloaderStreamable = new ProgressivePreloader({\n cancelable: false,\n streamable: true\n });\n this.preloader.construct();\n this.preloaderStreamable.construct();\n this.lazyLoadQueue = new LazyLoadQueueBase();\n\n this.wholeDiv = document.createElement('div');\n this.wholeDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-whole');\n\n this.overlaysDiv = document.createElement('div');\n this.overlaysDiv.classList.add('overlays');\n\n const mainDiv = document.createElement('div');\n mainDiv.classList.add(MEDIA_VIEWER_CLASSNAME);\n\n const topbar = this.topbar = document.createElement('div');\n topbar.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar', MEDIA_VIEWER_CLASSNAME + '-appear');\n\n const topbarLeft = document.createElement('div');\n topbarLeft.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar-left');\n\n this.buttons['mobile-close'] = ButtonIcon('close', {onlyMobile: true});\n\n // * author\n this.author.container = document.createElement('div');\n this.author.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-author', 'no-select');\n const authorRight = document.createElement('div');\n\n this.author.avatarEl = new AvatarElement();\n this.author.avatarEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-userpic', 'avatar-44');\n\n this.author.nameEl = document.createElement('div');\n this.author.nameEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-name');\n\n this.author.date = document.createElement('div');\n this.author.date.classList.add(MEDIA_VIEWER_CLASSNAME + '-date');\n\n authorRight.append(this.author.nameEl, this.author.date);\n\n this.author.container.append(this.author.avatarEl, authorRight);\n\n // * buttons\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-buttons');\n\n topButtons.concat(['download', 'zoom', 'close']).forEach((name) => {\n const button = ButtonIcon(name, {noRipple: true});\n this.buttons[name] = button;\n buttonsDiv.append(button);\n });\n\n this.buttons.zoom.classList.add('zoom-in');\n\n // * zoom\n this.zoomElements.container = document.createElement('div');\n this.zoomElements.container.classList.add('zoom-container');\n\n this.zoomElements.btnOut = ButtonIcon('zoomout', {noRipple: true});\n attachClickEvent(this.zoomElements.btnOut, () => this.changeZoom(false));\n this.zoomElements.btnIn = ButtonIcon('zoomin', {noRipple: true});\n attachClickEvent(this.zoomElements.btnIn, () => this.changeZoom(true));\n\n this.zoomElements.rangeSelector = new RangeSelector({\n step: ZOOM_STEP,\n min: ZOOM_MIN_VALUE,\n max: ZOOM_MAX_VALUE,\n withTransition: true\n }, ZOOM_INITIAL_VALUE);\n this.zoomElements.rangeSelector.setListeners();\n this.zoomElements.rangeSelector.setHandlers({\n onScrub: this.setZoomValue,\n onMouseUp: () => this.setZoomValue()\n });\n\n this.zoomElements.container.append(this.zoomElements.btnOut, this.zoomElements.rangeSelector.container, this.zoomElements.btnIn);\n\n this.wholeDiv.append(this.zoomElements.container);\n\n // * content\n this.content.main = document.createElement('div');\n this.content.main.classList.add(MEDIA_VIEWER_CLASSNAME + '-content');\n\n this.content.container = document.createElement('div');\n this.content.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-container');\n\n this.content.media = document.createElement('div');\n this.content.media.classList.add(MEDIA_VIEWER_CLASSNAME + '-media');\n\n this.content.container.append(this.content.media);\n\n this.content.main.append(this.content.container);\n mainDiv.append(this.content.main);\n this.overlaysDiv.append(mainDiv);\n // * overlays end\n\n topbarLeft.append(this.buttons['mobile-close'], this.author.container);\n topbar.append(topbarLeft, buttonsDiv);\n\n this.buttons.prev = document.createElement('div');\n this.buttons.prev.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-left`;\n this.buttons.prev.innerHTML = ``;\n\n this.buttons.next = document.createElement('div');\n this.buttons.next.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-right`;\n this.buttons.next.innerHTML = ``;\n\n this.moversContainer = document.createElement('div');\n this.moversContainer.classList.add(MEDIA_VIEWER_CLASSNAME + '-movers');\n\n this.wholeDiv.append(this.overlaysDiv, this.buttons.prev, this.buttons.next, this.topbar, this.moversContainer);\n\n // * constructing html end\n\n this.listLoader.onLoadedMore = () => {\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n };\n\n this.setNewMover();\n }\n\n protected setListeners() {\n attachClickEvent(this.buttons.download, this.onDownloadClick);\n [this.buttons.close, this.buttons['mobile-close'], this.preloaderStreamable.preloader].forEach((el) => {\n attachClickEvent(el, this.close.bind(this));\n });\n\n ([[-1, this.buttons.prev], [1, this.buttons.next]] as [number, HTMLElement][]).forEach(([moveLength, button]) => {\n // attachClickEvent(button, (e) => {\n button.addEventListener('click', (e) => {\n cancelEvent(e);\n if(this.setMoverPromise) return;\n\n this.listLoader.go(moveLength);\n });\n });\n\n attachClickEvent(this.buttons.zoom, () => {\n if(this.isZooming()) this.toggleZoom(false);\n else {\n this.changeZoom(true);\n }\n });\n\n // ! cannot use the function because it'll cancel slide event on touch devices\n // attachClickEvent(this.wholeDiv, this.onClick);\n this.wholeDiv.addEventListener('click', this.onClick);\n\n this.listLoader.onJump = (item, older) => {\n if(older) this.onNextClick(item);\n else this.onPrevClick(item);\n };\n\n if(IS_TOUCH_SUPPORTED) {\n const swipeHandler = new SwipeHandler({\n element: this.wholeDiv,\n onSwipe: (xDiff, yDiff) => {\n if(isFullScreen()) {\n return;\n }\n\n const percents = Math.abs(xDiff) / windowSize.width;\n if(percents > .2 || xDiff > 125) {\n // console.log('will swipe', xDiff);\n\n if(xDiff > 0) {\n this.buttons.prev.click();\n } else {\n this.buttons.next.click();\n }\n\n return true;\n }\n\n const percentsY = Math.abs(yDiff) / windowSize.height;\n if(percentsY > .2 || yDiff > 125) {\n this.close();\n return true;\n }\n\n return false;\n },\n verifyTouchTarget: (evt) => {\n console.log('verify');\n // * Fix for seek input\n if((evt.target as HTMLElement).tagName === 'INPUT' || findUpClassName(evt.target, 'media-viewer-caption')) {\n return false;\n }\n\n return true;\n }\n });\n }\n }\n\n protected toggleZoom(enable?: boolean) {\n const isVisible = this.isZooming();\n if(this.zoomElements.rangeSelector.mousedown || this.ctrlKeyDown) {\n enable = true;\n }\n\n if(isVisible === enable) return;\n\n if(enable === undefined) {\n enable = !isVisible;\n }\n\n this.buttons.zoom.classList.toggle('zoom-in', !enable);\n this.zoomElements.container.classList.toggle('is-visible', enable);\n const zoomValue = enable ? this.zoomElements.rangeSelector.value : 1;\n this.setZoomValue(zoomValue);\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n\n if(this.videoPlayer) {\n this.videoPlayer.lockControls(enable ? false : undefined);\n }\n\n if(enable) {\n if(!this.zoomSwipeHandler) {\n let lastDiffX: number, lastDiffY: number;\n const multiplier = 1;\n this.zoomSwipeHandler = new SwipeHandler({\n element: this.moversContainer,\n onFirstSwipe: () => {\n lastDiffX = lastDiffY = 0;\n this.moversContainer.classList.add('no-transition');\n },\n onSwipe: (xDiff, yDiff) => {\n [xDiff, yDiff] = [xDiff * multiplier, yDiff * multiplier];\n this.zoomSwipeX += xDiff - lastDiffX;\n this.zoomSwipeY += yDiff - lastDiffY;\n [lastDiffX, lastDiffY] = [xDiff, yDiff];\n\n this.setZoomValue();\n },\n onReset: () => {\n this.moversContainer.classList.remove('no-transition');\n },\n cursor: 'move'\n });\n } else {\n this.zoomSwipeHandler.setListeners();\n }\n\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n } else if(!enable) {\n this.zoomSwipeHandler.removeListeners();\n }\n }\n\n protected changeZoom(add: boolean) {\n this.zoomElements.rangeSelector.addProgress(ZOOM_STEP * (add ? 1 : -1));\n this.setZoomValue();\n }\n\n protected setZoomValue = (value = this.zoomElements.rangeSelector.value) => {\n // this.zoomValue = value;\n if(value === ZOOM_INITIAL_VALUE) {\n this.zoomSwipeX = 0;\n this.zoomSwipeY = 0;\n }\n\n this.moversContainer.style.transform = `matrix(${value}, 0, 0, ${value}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`;\n\n this.zoomElements.btnOut.classList.toggle('inactive', value === ZOOM_MIN_VALUE);\n this.zoomElements.btnIn.classList.toggle('inactive', value === ZOOM_MAX_VALUE);\n\n this.toggleZoom(value !== ZOOM_INITIAL_VALUE);\n };\n\n protected isZooming() {\n return this.zoomElements.container.classList.contains('is-visible');\n }\n\n protected setBtnMenuToggle(buttons: ButtonMenuItemOptions[]) {\n const btnMenuToggle = ButtonMenuToggle({buttonOptions: {onlyMobile: true}, direction: 'bottom-left', buttons});\n this.topbar.append(btnMenuToggle);\n }\n\n public close(e?: MouseEvent) {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.setMoverAnimationPromise) return Promise.reject();\n\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n }\n\n this.lazyLoadQueue.clear();\n\n const promise = this.setMoverToTarget(this.target?.element, true).then(({onAnimationEnd}) => onAnimationEnd);\n\n this.listLoader.reset();\n (this.listLoader as SearchListLoader).cleanup && (this.listLoader as SearchListLoader).cleanup();\n this.setMoverPromise = null;\n this.tempId = -1;\n if((window as any).appMediaViewer === this) {\n (window as any).appMediaViewer = undefined;\n }\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n promise.then(() => {\n appSidebarRight.forwardTab.closeBtn.click();\n });\n } */\n\n this.removeGlobalListeners();\n\n this.zoomSwipeHandler = undefined;\n\n promise.finally(() => {\n this.wholeDiv.remove();\n this.toggleOverlay(false);\n });\n\n return promise;\n }\n\n protected toggleOverlay(active: boolean) {\n overlayCounter.isOverlayActive = active;\n animationIntersector.checkAnimations2(active);\n }\n\n protected toggleGlobalListeners(active: boolean) {\n if(active) this.setGlobalListeners();\n else this.removeGlobalListeners();\n }\n\n protected removeGlobalListeners() {\n if(this.zoomSwipeHandler) {\n this.zoomSwipeHandler.removeListeners();\n }\n\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n window.removeEventListener('wheel', this.onWheel, {capture: true});\n }\n\n protected setGlobalListeners() {\n if(this.isZooming()) {\n this.zoomSwipeHandler.setListeners();\n }\n\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n if(!IS_TOUCH_SUPPORTED) window.addEventListener('wheel', this.onWheel, {passive: false, capture: true});\n }\n\n onClick = (e: MouseEvent) => {\n if(this.setMoverAnimationPromise) return;\n\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') return;\n cancelEvent(e);\n\n if(IS_TOUCH_SUPPORTED) {\n if(this.highlightSwitchersTimeout) {\n clearTimeout(this.highlightSwitchersTimeout);\n } else {\n this.wholeDiv.classList.add('highlight-switchers');\n }\n\n this.highlightSwitchersTimeout = window.setTimeout(() => {\n this.wholeDiv.classList.remove('highlight-switchers');\n this.highlightSwitchersTimeout = 0;\n }, 3e3);\n\n return;\n }\n\n const isZooming = this.isZooming();\n let mover: HTMLElement = null;\n const classNames = ['ckin__player', 'media-viewer-buttons', 'media-viewer-author', 'media-viewer-caption', 'zoom-container'];\n if(isZooming) {\n classNames.push('media-viewer-movers');\n }\n\n classNames.find((s) => {\n try {\n mover = findUpClassName(target, s);\n if(mover) return true;\n } catch(err) {return false;}\n });\n\n if(/* target === this.mediaViewerDiv */!mover || (!isZooming && (target.tagName === 'IMG' || target.tagName === 'image'))) {\n this.close();\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n // this.log('onKeyDown', e);\n if(overlayCounter.overlaysActive > 1) {\n return;\n }\n\n const key = e.key;\n\n let good = true;\n if(key === 'ArrowRight') {\n this.buttons.next.click();\n } else if(key === 'ArrowLeft') {\n this.buttons.prev.click();\n } else if(key === '-' || key === '=') {\n if(this.ctrlKeyDown) {\n this.changeZoom(key === '=');\n }\n } else {\n good = false;\n }\n\n if(e.ctrlKey || e.metaKey) {\n this.ctrlKeyDown = true;\n }\n\n if(good) {\n cancelEvent(e);\n }\n };\n\n private onKeyUp = (e: KeyboardEvent) => {\n if(overlayCounter.overlaysActive > 1) {\n return;\n }\n\n if(!(e.ctrlKey || e.metaKey)) {\n this.ctrlKeyDown = false;\n\n if(this.isZooming()) {\n this.setZoomValue();\n }\n }\n };\n\n private onWheel = (e: WheelEvent) => {\n if(overlayCounter.overlaysActive > 1 || (findUpClassName(e.target, 'media-viewer-caption') && !this.ctrlKeyDown)) {\n return;\n }\n\n cancelEvent(e);\n\n if(this.ctrlKeyDown) {\n const scrollingUp = e.deltaY < 0;\n // if(!scrollingUp && !this.isZooming()) return;\n this.changeZoom(!!scrollingUp);\n }\n };\n\n protected async setMoverToTarget(target: HTMLElement, closing = false, fromRight = 0) {\n this.dispatchEvent('setMoverBefore');\n\n const mover = this.content.mover;\n\n if(!closing) {\n mover.innerHTML = '';\n // mover.append(this.buttons.prev, this.buttons.next);\n }\n\n const zoomValue = this.isZooming() && closing /* && false */ ? this.zoomElements.rangeSelector.value : ZOOM_INITIAL_VALUE;\n /* if(!(zoomValue > 1 && closing)) */ this.removeCenterFromMover(mover);\n\n const wasActive = fromRight !== 0;\n\n const delay = rootScope.settings.animationsEnabled ? (wasActive ? 350 : 200) : 0;\n // let delay = wasActive ? 350 : 10000;\n\n /* if(wasActive) {\n this.moveTheMover(mover);\n mover = this.setNewMover();\n } */\n\n /* if(DEBUG) {\n this.log('setMoverToTarget', target, closing, wasActive, fromRight);\n } */\n\n let realParent: HTMLElement;\n\n let rect: DOMRect;\n if(target) {\n if(target instanceof AvatarElement || target.classList.contains('grid-item')/* || target.classList.contains('document-ico') */) {\n realParent = target;\n rect = target.getBoundingClientRect();\n } else if(target instanceof SVGImageElement || target.parentElement instanceof SVGForeignObjectElement) {\n realParent = findUpClassName(target, 'attachment');\n rect = realParent.getBoundingClientRect();\n } else if(target.classList.contains('profile-avatars-avatar')) {\n realParent = findUpClassName(target, 'profile-avatars-container');\n rect = realParent.getBoundingClientRect();\n\n // * if not active avatar\n if(closing && target.getBoundingClientRect().left !== rect.left) {\n target = realParent = rect = undefined;\n }\n }\n }\n\n if(!target) {\n target = this.content.media;\n }\n\n if(!rect) {\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n }\n\n let needOpacity = false;\n if(target !== this.content.media && !target.classList.contains('profile-avatars-avatar')) {\n const overflowElement = findUpClassName(realParent, 'scrollable');\n const visibleRect = getVisibleRect(realParent, overflowElement, true);\n\n if(closing && (!visibleRect || visibleRect.overflow.vertical === 2 || visibleRect.overflow.horizontal === 2)) {\n target = this.content.media;\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n } else if(visibleRect && (visibleRect.overflow.vertical === 1 || visibleRect.overflow.horizontal === 1)) {\n needOpacity = true;\n }\n }\n\n const containerRect = this.content.media.getBoundingClientRect();\n\n let transform = '';\n let left: number;\n let top: number;\n\n if(wasActive) {\n left = fromRight === 1 ? windowSize.width : -containerRect.width;\n top = containerRect.top;\n } else {\n left = rect.left;\n top = rect.top;\n }\n\n /* if(zoomValue > 1) { // 33\n // const diffX = (rect.width * zoomValue - rect.width) / 4;\n const diffX = (rect.width * zoomValue - rect.width) / 2;\n const diffY = (rect.height * zoomValue - rect.height) / 4;\n // left -= diffX;\n // top += diffY;\n } */\n\n transform += `translate3d(${left}px,${top}px,0) `;\n\n /* if(wasActive) {\n left = fromRight === 1 ? appPhotosManager.windowW / 2 : -(containerRect.width + appPhotosManager.windowW / 2);\n transform += `translate(${left}px,-50%) `;\n } else {\n left = rect.left - (appPhotosManager.windowW / 2);\n top = rect.top - (appPhotosManager.windowH / 2);\n transform += `translate(${left}px,${top}px) `;\n } */\n\n let aspecter: HTMLDivElement;\n if(target instanceof HTMLImageElement || target instanceof HTMLVideoElement || target.tagName === 'DIV') {\n if(mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter')) {\n aspecter = mover.firstElementChild as HTMLDivElement;\n\n const player = aspecter.querySelector('.ckin__player');\n if(player) {\n const video = player.firstElementChild as HTMLVideoElement;\n aspecter.append(video);\n player.remove();\n }\n\n if(!aspecter.style.cssText) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n mover.classList.remove('active');\n this.setFullAspect(aspecter, containerRect, rect);\n void mover.offsetLeft; // reflow\n mover.classList.add('active');\n }\n } else {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-viewer-aspecter'/* , 'disable-hover' */);\n mover.prepend(aspecter);\n }\n\n aspecter.style.cssText = `width: ${rect.width}px; height: ${rect.height}px; transform: scale3d(${containerRect.width / rect.width}, ${containerRect.height / rect.height}, 1);`;\n }\n\n mover.style.width = containerRect.width + 'px';\n mover.style.height = containerRect.height + 'px';\n\n // const scaleX = rect.width / (containerRect.width * zoomValue);\n // const scaleY = rect.height / (containerRect.height * zoomValue);\n const scaleX = rect.width / containerRect.width;\n const scaleY = rect.height / containerRect.height;\n if(!wasActive) {\n transform += `scale3d(${scaleX},${scaleY},1) `;\n }\n\n let borderRadius = window.getComputedStyle(realParent).getPropertyValue('border-radius');\n const brSplitted = fillPropertyValue(borderRadius) as string[];\n borderRadius = brSplitted.map((r) => (parseInt(r) / scaleX) + 'px').join(' ');\n if(!wasActive) {\n mover.style.borderRadius = borderRadius;\n }\n // let borderRadius = '0px 0px 0px 0px';\n\n if(closing && zoomValue !== 1) {\n // const width = this.moversContainer.scrollWidth * scaleX;\n // const height = this.moversContainer.scrollHeight * scaleY;\n const willBeLeft = windowSize.width / 2 - rect.width / 2;\n const willBeTop = windowSize.height / 2 - rect.height / 2;\n const left = rect.left - willBeLeft/* + (width - rect.width) / 2 */;\n const top = rect.top - willBeTop/* + (height - rect.height) / 2 */;\n this.moversContainer.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${left}, ${top})`;\n } else {\n mover.style.transform = transform;\n }\n\n needOpacity && (mover.style.opacity = '0'/* !closing ? '0' : '' */);\n\n /* if(wasActive) {\n this.log('setMoverToTarget', mover.style.transform);\n } */\n\n let path: SVGPathElement;\n const isOut = target.classList.contains('is-out');\n\n const deferred = this.setMoverAnimationPromise = deferredPromise();\n const ret = {onAnimationEnd: deferred};\n\n const timeout = setTimeout(() => {\n if(!deferred.isFulfilled && !deferred.isRejected) {\n deferred.resolve();\n }\n }, 1000);\n\n deferred.finally(() => {\n this.dispatchEvent('setMoverAfter');\n\n if(this.setMoverAnimationPromise === deferred) {\n this.setMoverAnimationPromise = null;\n }\n\n clearTimeout(timeout);\n });\n\n if(!closing) {\n let mediaElement: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\n let src: string;\n\n // if(target instanceof HTMLVideoElement) {\n const selector = 'video, img, .canvas-thumbnail';\n const queryFrom = target.matches(selector) ? target.parentElement : target;\n const elements = Array.from(queryFrom.querySelectorAll(selector)) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if(target instanceof HTMLImageElement) {\n canvas.width = target.naturalWidth;\n canvas.height = target.naturalHeight;\n } else if(target instanceof HTMLVideoElement) {\n canvas.width = target.videoWidth;\n canvas.height = target.videoHeight;\n } else if(target instanceof HTMLCanvasElement) {\n canvas.width = target.width;\n canvas.height = target.height;\n }\n\n canvas.className = 'canvas-thumbnail thumbnail media-photo';\n context.drawImage(target as HTMLImageElement | HTMLCanvasElement, 0, 0);\n target = canvas;\n }\n // }\n\n if(target.tagName === 'DIV' || target.tagName === 'AVATAR-ELEMENT') { // useContainerAsTarget\n const images = Array.from(target.querySelectorAll('img')) as HTMLImageElement[];\n const image = images.pop();\n if(image) {\n mediaElement = new Image();\n src = image.src;\n mover.append(mediaElement);\n }\n /* mediaElement = new Image();\n src = target.style.backgroundImage.slice(5, -2); */\n } else if(target instanceof HTMLImageElement) {\n mediaElement = new Image();\n src = target.src;\n } else if(target instanceof HTMLVideoElement) {\n mediaElement = createVideo();\n mediaElement.src = target.src;\n } else if(target instanceof SVGSVGElement) {\n const clipId = target.dataset.clipId;\n const newClipId = clipId + '-mv';\n\n const {width, height} = containerRect;\n\n const newSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n newSvg.setAttributeNS(null, 'width', '' + width);\n newSvg.setAttributeNS(null, 'height', '' + height);\n\n // нижние два свойства для масштабирования\n newSvg.setAttributeNS(null, 'viewBox', `0 0 ${width} ${height}`);\n newSvg.setAttributeNS(null, 'preserveAspectRatio', 'xMidYMid meet');\n\n newSvg.insertAdjacentHTML('beforeend', target.firstElementChild.outerHTML.replace(clipId, newClipId));\n newSvg.insertAdjacentHTML('beforeend', target.lastElementChild.outerHTML.replace(clipId, newClipId));\n\n // теперь надо выставить новую позицию для хвостика\n const defs = newSvg.firstElementChild;\n const use = defs.firstElementChild.firstElementChild as SVGUseElement;\n if(use instanceof SVGUseElement) {\n let transform = use.getAttributeNS(null, 'transform');\n transform = transform.replace(/translate\\((.+?), (.+?)\\) scale\\((.+?), (.+?)\\)/, (match, x, y, sX, sY) => {\n x = +x;\n if(x !== 2) {\n x = width - (2 / scaleX);\n } else {\n x = 2 / scaleX;\n }\n\n y = height;\n\n return `translate(${x}, ${y}) scale(${+sX / scaleX}, ${+sY / scaleY})`;\n });\n use.setAttributeNS(null, 'transform', transform);\n\n // и новый RECT\n path = defs.firstElementChild.lastElementChild as SVGPathElement;\n\n // код ниже нужен только чтобы скрыть моргание до момента как сработает таймаут\n let d: string;\n const br: [number, number, number, number] = borderRadius.split(' ').map((v) => parseInt(v)) as any;\n if(isOut) d = generatePathData(0, 0, width - 9 / scaleX, height, ...br);\n else d = generatePathData(9 / scaleX, 0, width - 9 / scaleX, height, ...br);\n path.setAttributeNS(null, 'd', d);\n }\n\n const foreignObject = newSvg.lastElementChild;\n foreignObject.setAttributeNS(null, 'width', '' + containerRect.width);\n foreignObject.setAttributeNS(null, 'height', '' + containerRect.height);\n\n mover.prepend(newSvg);\n } else if(target instanceof HTMLCanvasElement) {\n mediaElement = target;\n }\n\n if(aspecter) {\n aspecter.style.borderRadius = borderRadius;\n\n if(mediaElement) {\n aspecter.append(mediaElement);\n }\n }\n\n mediaElement = mover.querySelector('video, img');\n if(mediaElement instanceof HTMLImageElement) {\n mediaElement.classList.add('thumbnail');\n if(!aspecter) {\n mediaElement.style.width = containerRect.width + 'px';\n mediaElement.style.height = containerRect.height + 'px';\n }\n\n if(src) {\n await renderImageFromUrlPromise(mediaElement, src);\n }\n }/* else if(mediaElement instanceof HTMLVideoElement && mediaElement.firstElementChild && ((mediaElement.firstElementChild as HTMLSourceElement).src || src)) {\n await new Promise((resolve, reject) => {\n mediaElement.addEventListener('loadeddata', resolve);\n\n if(src) {\n (mediaElement.firstElementChild as HTMLSourceElement).src = src;\n }\n });\n } */\n\n mover.style.display = '';\n\n fastRaf(() => {\n mover.classList.add(wasActive ? 'moving' : 'active');\n });\n } else {\n /* if(mover.classList.contains('center')) {\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n } */\n\n if(target instanceof SVGSVGElement) {\n path = mover.querySelector('path');\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, false, isOut, borderRadius);\n }\n }\n\n if(target.classList.contains('media-viewer-media')) {\n mover.classList.add('hiding');\n }\n\n this.toggleWholeActive(false);\n\n // return ret;\n\n setTimeout(() => {\n mover.style.borderRadius = borderRadius;\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = borderRadius;\n }\n }, delay / 2);\n\n setTimeout(() => {\n mover.innerHTML = '';\n mover.classList.remove('moving', 'active', 'hiding');\n mover.style.cssText = 'display: none;';\n\n deferred.resolve();\n }, delay);\n\n mover.classList.remove('opening');\n\n return ret;\n }\n\n mover.classList.add('opening');\n\n // await new Promise((resolve) => setTimeout(resolve, 0));\n // await new Promise((resolve) => window.requestAnimationFrame(resolve));\n // * одного RAF'а недостаточно, иногда анимация с одним не срабатывает (преимущественно на мобильных)\n await doubleRaf();\n\n // чтобы проверить установленную позицию - раскомментировать\n // throw '';\n\n // await new Promise((resolve) => setTimeout(resolve, 5e3));\n\n mover.style.transform = `translate3d(${containerRect.left}px,${containerRect.top}px,0) scale3d(1,1,1)`;\n // mover.style.transform = `translate(-50%,-50%) scale(1,1)`;\n needOpacity && (mover.style.opacity = ''/* closing ? '0' : '' */);\n\n if(aspecter) {\n this.setFullAspect(aspecter, containerRect, rect);\n }\n\n // throw '';\n\n setTimeout(() => {\n mover.style.borderRadius = '';\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = '';\n }\n }, 0/* delay / 2 */);\n\n mover.dataset.timeout = '' + setTimeout(() => {\n mover.classList.remove('moving', 'opening');\n\n if(aspecter) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n if(mover.querySelector('video') || true) {\n mover.classList.remove('active');\n aspecter.style.cssText = '';\n void mover.offsetLeft; // reflow\n }\n\n // aspecter.classList.remove('disable-hover');\n }\n\n // эти строки нужны для установки центральной позиции, в случае ресайза это будет нужно\n mover.classList.add('center', 'no-transition');\n /* mover.style.left = mover.style.top = '50%';\n mover.style.transform = 'translate(-50%, -50%)';\n void mover.offsetLeft; // reflow */\n\n // это уже нужно для будущих анимаций\n mover.classList.add('active');\n delete mover.dataset.timeout;\n\n deferred.resolve();\n }, delay);\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, true, isOut, borderRadius);\n }\n\n return ret;\n }\n\n protected toggleWholeActive(active: boolean) {\n if(active) {\n this.wholeDiv.classList.add('active');\n } else {\n this.wholeDiv.classList.add('backwards');\n setTimeout(() => {\n this.wholeDiv.classList.remove('active');\n }, 0);\n }\n }\n\n protected setFullAspect(aspecter: HTMLDivElement, containerRect: DOMRect, rect: DOMRect) {\n /* let media = aspecter.firstElementChild;\n let proportion: number;\n if(media instanceof HTMLImageElement) {\n proportion = media.naturalWidth / media.naturalHeight;\n } else if(media instanceof HTMLVideoElement) {\n proportion = media.videoWidth / media.videoHeight;\n } */\n const proportion = containerRect.width / containerRect.height;\n\n let {width, height} = rect;\n /* if(proportion === 1) {\n aspecter.style.cssText = '';\n } else { */\n if(proportion > 0) {\n width = height * proportion;\n } else {\n height = width * proportion;\n }\n\n // this.log('will set style aspecter:', `width: ${width}px; height: ${height}px; transform: scale(${containerRect.width / width}, ${containerRect.height / height});`);\n\n aspecter.style.cssText = `width: ${width}px; height: ${height}px; transform: scale3d(${containerRect.width / width}, ${containerRect.height / height}, 1);`;\n // }\n }\n\n protected sizeTailPath(path: SVGPathElement, rect: DOMRect, scaleX: number, delay: number, upscale: boolean, isOut: boolean, borderRadius: string) {\n const start = Date.now();\n const {width, height} = rect;\n delay = delay / 2;\n\n const br = borderRadius.split(' ').map((v) => parseInt(v));\n\n const step = () => {\n const diff = Date.now() - start;\n\n let progress = delay ? diff / delay : 1;\n if(progress > 1) progress = 1;\n if(upscale) progress = 1 - progress;\n\n const _br: [number, number, number, number] = br.map((v) => v * progress) as any;\n\n let d: string;\n if(isOut) d = generatePathData(0, 0, width - (9 / scaleX * progress), height, ..._br);\n else d = generatePathData(9 / scaleX * progress, 0, width/* width - (9 / scaleX * progress) */, height, ..._br);\n path.setAttributeNS(null, 'd', d);\n\n if(diff < delay) fastRaf(step);\n };\n\n // window.requestAnimationFrame(step);\n step();\n }\n\n protected removeCenterFromMover(mover: HTMLElement) {\n if(mover.classList.contains('center')) {\n // const rect = mover.getBoundingClientRect();\n const rect = this.content.media.getBoundingClientRect();\n mover.style.transform = `translate3d(${rect.left}px,${rect.top}px,0)`;\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n mover.classList.remove('no-transition');\n }\n }\n\n protected moveTheMover(mover: HTMLElement, toLeft = true) {\n const windowW = windowSize.width;\n\n this.removeCenterFromMover(mover);\n\n // mover.classList.remove('active');\n mover.classList.add('moving');\n\n if(mover.dataset.timeout) { // и это тоже всё из-за скейла видео, так бы это не нужно было\n clearTimeout(+mover.dataset.timeout);\n }\n\n const rect = mover.getBoundingClientRect();\n\n const newTransform = mover.style.transform.replace(/translate3d\\((.+?),/, (match, p1) => {\n const x = toLeft ? -rect.width : windowW;\n // const x = toLeft ? -(rect.right + (rect.width / 2)) : windowW / 2;\n\n return match.replace(p1, x + 'px');\n });\n\n // //////this.log('set newTransform:', newTransform, mover.style.transform, toLeft);\n mover.style.transform = newTransform;\n\n setTimeout(() => {\n mover.remove();\n }, 350);\n }\n\n protected setNewMover() {\n const newMover = document.createElement('div');\n newMover.classList.add('media-viewer-mover');\n newMover.style.display = 'none';\n\n if(this.content.mover) {\n const oldMover = this.content.mover;\n oldMover.parentElement.append(newMover);\n } else {\n this.moversContainer.append(newMover);\n }\n\n return this.content.mover = newMover;\n }\n\n protected updateMediaSource(target: HTMLElement, url: string, tagName: 'video' | 'img') {\n // if(target instanceof SVGSVGElement) {\n const el = target.tagName.toLowerCase() === tagName ? target : target.querySelector(tagName) as HTMLElement;\n if(el && !findUpClassName(target, 'document')) {\n if(findUpClassName(target, 'attachment')) {\n // two parentElements because element can be contained in aspecter\n const preloader = target.parentElement.parentElement.querySelector('.preloader-container') as HTMLElement;\n if(preloader) {\n if(tagName === 'video') {\n if(preloader.classList.contains('manual')) {\n preloader.click();\n // return;\n }\n\n return;\n }\n\n preloader.remove();\n }\n }\n\n if((el as HTMLImageElement).src !== url) {\n renderImageFromUrl(el, url);\n }\n\n // ! костыль, но он тут даже и не нужен\n if(el.classList.contains('thumbnail') && el.parentElement.classList.contains('media-container-aspecter')) {\n el.classList.remove('thumbnail');\n }\n }\n /* } else {\n\n } */\n }\n\n protected setAuthorInfo(fromId: PeerId | string, timestamp: number) {\n const isPeerId = fromId.isPeerId();\n let wrapTitlePromise: Promise | HTMLElement;\n if(isPeerId) {\n wrapTitlePromise = wrapPeerTitle({\n peerId: fromId as PeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n })\n } else {\n const title = wrapTitlePromise = document.createElement('span');\n title.append(wrapEmojiText(fromId));\n title.classList.add('peer-title');\n }\n\n const oldAvatar = this.author.avatarEl;\n const newAvatar = this.author.avatarEl = (oldAvatar.cloneNode() as AvatarElement);\n\n return Promise.all([\n (this.author.avatarEl as AvatarElement).updateWithOptions({\n peerId: fromId as PeerId || NULL_PEER_ID,\n peerTitle: isPeerId ? undefined : '' + fromId\n }),\n\n wrapTitlePromise\n ]).then(([_, title]) => {\n if(this.author.avatarEl !== newAvatar) {\n return;\n }\n\n replaceContent(this.author.date, formatFullSentTime(timestamp));\n replaceContent(this.author.nameEl, title);\n oldAvatar.replaceWith(this.author.avatarEl);\n });\n }\n\n protected async _openMedia(\n media: MyDocument | MyPhoto,\n timestamp: number,\n fromId: PeerId | string,\n fromRight: number,\n target?: HTMLElement,\n reverse = false,\n prevTargets: TargetType[] = [],\n nextTargets: TargetType[] = [],\n message?: MyMessage\n /* , needLoadMore = true */\n ) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n /* if(DEBUG) {\n this.log('openMedia:', media, fromId, prevTargets, nextTargets);\n } */\n\n const setAuthorPromise = this.setAuthorInfo(fromId, timestamp);\n\n const isDocument = media._ === 'document';\n const isVideo = isDocument && media.mime_type && ((['video', 'gif'] as MyDocument['type'][]).includes(media.type) || media.mime_type.indexOf('video/') === 0);\n\n if(this.isFirstOpen) {\n // this.targetContainer = targetContainer;\n // this.needLoadMore = needLoadMore;\n this.isFirstOpen = false;\n this.listLoader.setTargets(prevTargets, nextTargets, reverse);\n (window as any).appMediaViewer = this;\n // this.loadMore = loadMore;\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n appSidebarRight.forwardTab.closeBtn.click();\n await new Promise((resolve) => setTimeout(resolve, 200));\n } */\n }\n\n if(this.listLoader.next.length < 10) {\n setTimeout(() => {\n this.listLoader.load(true);\n }, 0);\n }\n\n // if(prevTarget && (!prevTarget.parentElement || !this.isElementVisible(this.targetContainer, prevTarget))) prevTarget = null;\n // if(nextTarget && (!nextTarget.parentElement || !this.isElementVisible(this.targetContainer, nextTarget))) nextTarget = null;\n\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n\n const container = this.content.media;\n const useContainerAsTarget = !target || target === container;\n if(useContainerAsTarget) target = container;\n\n this.target = {element: target} as any;\n const tempId = ++this.tempId;\n\n if(container.firstElementChild) {\n container.innerHTML = '';\n }\n\n // ok set\n\n const wasActive = fromRight !== 0;\n if(wasActive) {\n this.moveTheMover(this.content.mover, fromRight === 1);\n this.setNewMover();\n } else {\n this.toggleOverlay(true);\n this.setGlobalListeners();\n await setAuthorPromise;\n\n if(!this.wholeDiv.parentElement) {\n this.pageEl.insertBefore(this.wholeDiv, document.getElementById('main-columns'));\n void this.wholeDiv.offsetLeft; // reflow\n }\n\n this.toggleWholeActive(true);\n\n if(!IS_MOBILE_SAFARI) {\n this.navigationItem = {\n type: 'media',\n onPop: (canAnimate) => {\n if(this.setMoverAnimationPromise) {\n return false;\n }\n\n this.close();\n }\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n }\n\n // //////this.log('wasActive:', wasActive);\n\n const mover = this.content.mover;\n\n const maxWidth = windowSize.width;\n // const maxWidth = this.pageEl.scrollWidth;\n // TODO: const maxHeight = mediaSizes.isMobile ? appPhotosManager.windowH : appPhotosManager.windowH - 100;\n let padding = 0;\n const windowH = windowSize.height;\n if(windowH < 1000000 && !mediaSizes.isMobile) {\n padding = 120;\n }\n const maxHeight = windowH - 120 - padding;\n let thumbPromise: Promise = Promise.resolve();\n const size = setAttachmentSize(media, container, maxWidth, maxHeight, mediaSizes.isMobile ? false : true, undefined, !!(isDocument && media.w && media.h)).photoSize;\n if(useContainerAsTarget) {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(media, size.type);\n let img: HTMLImageElement | HTMLCanvasElement;\n if(cacheContext.downloaded) {\n img = new Image();\n img.src = cacheContext.url;\n } else {\n const gotThumb = getStrippedThumbIfNeeded(media, cacheContext, true);\n if(gotThumb) {\n thumbPromise = gotThumb.loadPromise;\n img = gotThumb.image;\n }\n }\n\n if(img) {\n img.classList.add('thumbnail');\n container.append(img);\n }\n }\n\n // need after setAttachmentSize\n /* if(useContainerAsTarget) {\n target = target.querySelector('img, video') || target;\n } */\n\n const supportsStreaming: boolean = !!(isDocument && media.supportsStreaming);\n const preloader = supportsStreaming ? this.preloaderStreamable : this.preloader;\n\n const getCacheContext = () => {\n return this.managers.thumbsStorage.getCacheContext(media, size?.type);\n };\n\n let setMoverPromise: Promise;\n if(isVideo) {\n // //////this.log('will wrap video', media, size);\n\n // потому что для safari нужно создать элемент из event'а\n // const video = document.createElement('video');\n const useController = message && media.type !== 'gif';\n const video = /* useController ?\n appMediaPlaybackController.addMedia(message, false, true) as HTMLVideoElement :\n */createVideo({pip: useController});\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', cancelEvent);\n }\n\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n // return; // set and don't move\n // if(wasActive) return;\n // return;\n\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n // const video = mover.querySelector('video') || document.createElement('video');\n\n const moverVideo = mover.querySelector('video');\n if(moverVideo) {\n moverVideo.remove();\n }\n\n // video.src = '';\n\n video.setAttribute('playsinline', 'true');\n\n // * fix for playing video if viewer is closed (https://contest.com/javascript-web-bonus/entry1425#issue11629)\n video.addEventListener('timeupdate', () => {\n if(this.tempId !== tempId) {\n video.pause();\n }\n });\n\n this.addEventListener('setMoverAfter', () => {\n video.src = '';\n video.load();\n }, {once: true});\n\n if(IS_SAFARI) {\n // test stream\n // video.controls = true;\n video.autoplay = true;\n }\n\n if(media.type === 'gif') {\n video.muted = true;\n video.autoplay = true;\n video.loop = true;\n } else if(media.duration < 60) {\n video.loop = true;\n }\n\n // if(!video.parentElement) {\n div.append(video);\n // }\n\n const canPlayThrough = new Promise((resolve) => {\n video.addEventListener('canplay', resolve, {once: true});\n });\n\n const createPlayer = () => {\n if(media.type !== 'gif') {\n video.dataset.ckin = 'default';\n video.dataset.overlay = '1';\n\n Promise.all([canPlayThrough, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n return;\n }\n\n // const play = useController ? appMediaPlaybackController.willBePlayedMedia === video : true;\n const play = true;\n const player = this.videoPlayer = new VideoPlayer({\n video,\n play,\n streamable: supportsStreaming,\n onPlaybackRackMenuToggle: (open) => {\n this.wholeDiv.classList.toggle('hide-caption', !!open);\n },\n onPip: (pip) => {\n const otherMediaViewer = (window as any).appMediaViewer;\n if(!pip && otherMediaViewer && otherMediaViewer !== this) {\n this.releaseSingleMedia = undefined;\n this.close();\n return;\n }\n\n const mover = this.moversContainer.lastElementChild as HTMLElement;\n mover.classList.toggle('hiding', pip);\n this.toggleWholeActive(!pip);\n this.toggleOverlay(!pip);\n this.toggleGlobalListeners(!pip);\n\n if(this.navigationItem) {\n if(pip) appNavigationController.removeItem(this.navigationItem);\n else appNavigationController.pushItem(this.navigationItem);\n }\n\n if(useController) {\n if(pip) {\n // appMediaPlaybackController.toggleSwitchers(true);\n\n this.releaseSingleMedia(false);\n this.releaseSingleMedia = undefined;\n\n appMediaPlaybackController.setPictureInPicture(video);\n } else {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n }\n }\n },\n onPipClose: () => {\n // this.target = undefined;\n // this.toggleWholeActive(false);\n // this.toggleOverlay(false);\n this.close();\n }\n });\n player.addEventListener('toggleControls', (show) => {\n this.wholeDiv.classList.toggle('has-video-controls', show);\n });\n\n this.addEventListener('setMoverBefore', () => {\n this.wholeDiv.classList.remove('has-video-controls');\n this.videoPlayer.cleanup();\n this.videoPlayer = undefined;\n }, {once: true});\n\n if(this.isZooming()) {\n this.videoPlayer.lockControls(false);\n }\n /* div.append(video);\n mover.append(player.wrapper); */\n });\n }\n };\n\n if(supportsStreaming) {\n onAnimationEnd.then(() => {\n if(video.readyState < video.HAVE_FUTURE_DATA) {\n // console.log('ppp 1');\n preloader.attach(mover, true);\n }\n\n /* canPlayThrough.then(() => {\n preloader.detach();\n }); */\n });\n\n const attachCanPlay = () => {\n video.addEventListener('canplay', () => {\n // console.log('ppp 2');\n preloader.detach();\n video.parentElement.classList.remove('is-buffering');\n }, {once: true});\n };\n\n video.addEventListener('waiting', () => {\n const loading = video.networkState === video.NETWORK_LOADING;\n const isntEnoughData = video.readyState < video.HAVE_FUTURE_DATA;\n\n // this.log('video waiting for progress', loading, isntEnoughData);\n if(loading && isntEnoughData) {\n attachCanPlay();\n\n // console.log('ppp 3');\n preloader.attach(mover, true);\n\n // поставлю класс для плеера, чтобы убрать большую иконку пока прелоадер на месте\n video.parentElement.classList.add('is-buffering');\n }\n });\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', (e) => {\n cancelEvent(e);\n });\n }\n\n attachCanPlay();\n }\n\n // if(!video.src || media.url !== video.src) {\n const load = async() => {\n /* if(useController) {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n } */\n\n const promise: Promise = supportsStreaming ? Promise.resolve() : appDownloadManager.downloadMediaURL({media});\n\n if(!supportsStreaming) {\n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n // console.log('ppp 4');\n preloader.attach(mover, true, promise);\n }\n });\n }\n\n Promise.all([promise, onAnimationEnd]).then(async() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed video');\n return;\n }\n\n const url = (await getCacheContext()).url;\n\n video.addEventListener('error', () => {\n toastNew({\n langPackKey: IS_MOBILE ? 'Video.Unsupported.Mobile' : 'Video.Unsupported.Desktop'\n });\n\n if(video.error.code !== 4) {\n this.log.error('Error ' + video.error.code + '; details: ' + video.error.message);\n }\n\n preloader?.detach();\n }, {once: true});\n\n if(target instanceof SVGSVGElement/* && (video.parentElement || !isSafari) */) { // if video exists\n // if(!video.parentElement) {\n div.firstElementChild.lastElementChild.append(video);\n // }\n } else {\n renderImageFromUrl(video, url);\n }\n\n // * have to set options (especially playbackRate) after src\n // * https://github.com/videojs/video.js/issues/2516\n if(useController) {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n\n this.addEventListener('setMoverBefore', () => {\n if(this.releaseSingleMedia) {\n this.releaseSingleMedia();\n this.releaseSingleMedia = undefined;\n }\n }, {once: true});\n }\n\n this.updateMediaSource(target, url, 'video');\n\n createPlayer();\n });\n\n return promise;\n };\n\n this.lazyLoadQueue.unshift({load});\n // } else createPlayer();\n });\n\n setMoverPromise = thumbPromise.then(set);\n } else {\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n // return; // set and don't move\n // if(wasActive) return;\n // return;\n\n const load = async() => {\n const cancellablePromise = isDocument ? appDownloadManager.downloadMediaURL({media}) : appDownloadManager.downloadMediaURL({media, thumb: size});\n\n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n this.preloader.attachPromise(cancellablePromise);\n // this.preloader.attach(mover, true, cancellablePromise);\n }\n });\n\n Promise.all([onAnimationEnd, cancellablePromise]).then(async() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed photo');\n return;\n }\n\n // /////this.log('indochina', blob);\n\n const url = (await getCacheContext()).url;\n if(target instanceof SVGSVGElement) {\n this.updateMediaSource(target, url, 'img');\n this.updateMediaSource(mover, url, 'img');\n\n if(mediaSizes.isMobile) {\n const imgs = mover.querySelectorAll('img');\n if(imgs && imgs.length) {\n imgs.forEach((img) => {\n img.classList.remove('thumbnail'); // может здесь это вообще не нужно\n });\n }\n }\n } else {\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n const haveImage = div.firstElementChild?.tagName === 'IMG' ? div.firstElementChild as HTMLImageElement : null;\n if(!haveImage || haveImage.src !== url) {\n const image = new Image();\n image.classList.add('thumbnail');\n\n // this.log('will renderImageFromUrl:', image, div, target);\n\n renderImageFromUrl(image, url, () => {\n this.updateMediaSource(target, url, 'img');\n\n if(haveImage) {\n fastRaf(() => {\n haveImage.remove();\n });\n }\n\n div.append(image);\n });\n }\n }\n\n // this.preloader.detach();\n }).catch((err) => {\n this.log.error(err);\n this.preloader.attach(mover);\n this.preloader.setManual();\n });\n\n return cancellablePromise;\n };\n\n this.lazyLoadQueue.unshift({load});\n });\n\n setMoverPromise = thumbPromise.then(set);\n }\n\n return this.setMoverPromise = setMoverPromise.catch(() => {\n this.setMoverAnimationPromise = null;\n }).finally(() => {\n this.setMoverPromise = null;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function fillPropertyValue(str: string) {\n const splitted = str.split(' ');\n if(splitted.length !== 4) {\n if(!splitted[0]) splitted[0] = '0px';\n for(let i = splitted.length; i < 4; ++i) {\n splitted[i] = splitted[i % 2] || splitted[0] || '0px';\n }\n }\n\n return splitted;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {IS_MOBILE_SAFARI} from '../environment/userAgent';\nimport {logger} from '../lib/logger';\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport isSwipingBackSafari from '../helpers/dom/isSwipingBackSafari';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\n\nexport type NavigationItem = {\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' |\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' |\n 'global-search' | 'voice' | 'mobile-search' | 'filters' | 'global-search-focus' |\n 'toast' | 'dropdown' | 'forum',\n onPop: (canAnimate: boolean) => boolean | void,\n onEscape?: () => boolean,\n noHistory?: boolean,\n noBlurOnPop?: boolean,\n};\n\nexport class AppNavigationController {\n private navigations: Array;\n private id: number;\n private manual: boolean;\n private log: ReturnType;\n private debug: boolean;\n private currentHash: string; // have to start with # if not empty\n private overriddenHash: string; // have to start with # if not empty\n private isPossibleSwipe: boolean;\n public onHashChange: () => void;\n\n constructor() {\n this.navigations = [];\n this.id = Date.now();\n this.manual = false;\n this.log = logger('NC');\n this.debug = true;\n this.currentHash = window.location.hash;\n this.overriddenHash = '';\n this.isPossibleSwipe = false;\n\n window.addEventListener('popstate', this.onPopState);\n window.addEventListener('keydown', this.onKeyDown, {capture: true, passive: false});\n\n if(IS_MOBILE_SAFARI) {\n const options = {passive: true};\n window.addEventListener('touchstart', this.onTouchStart, options);\n }\n\n history.scrollRestoration = 'manual';\n\n this.pushState(); // * push init state\n }\n\n private onPopState = (e: PopStateEvent) => {\n const hash = window.location.hash;\n const id: number = e.state;\n this.debug && this.log('popstate', e, this.isPossibleSwipe, hash);\n if(hash !== this.currentHash) {\n this.debug && this.log.warn(`hash changed, new=${hash}, current=${this.currentHash}, overridden=${this.overriddenHash}`);\n // fix for returning to wrong hash (e.g. chat -> archive -> chat -> 3x back)\n if(id === this.id && this.overriddenHash && this.overriddenHash !== hash) {\n this.overrideHash(this.overriddenHash);\n } else if(id/* === this.id */ && !this.overriddenHash && hash) {\n this.overrideHash();\n } else {\n this.currentHash = hash;\n this.onHashChange && this.onHashChange();\n // this.replaceState();\n return;\n }\n }\n\n if(id !== this.id/* && !this.navigations.length */) {\n this.pushState();\n\n if(!this.navigations.length) {\n return;\n }\n }\n\n const item = this.navigations.pop();\n if(!item) {\n this.pushState();\n return;\n }\n\n this.manual = !this.isPossibleSwipe;\n this.handleItem(item);\n // this.pushState(); // * prevent adding forward arrow\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n const item = this.navigations[this.navigations.length - 1];\n if(!item) return;\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\n cancelEvent(e);\n this.back(item.type);\n }\n };\n\n private onTouchStart = (e: TouchEvent) => {\n if(e.touches.length > 1) return;\n this.debug && this.log('touchstart');\n\n if(isSwipingBackSafari(e)) {\n this.isPossibleSwipe = true;\n\n window.addEventListener('touchend', () => {\n setTimeout(() => {\n this.isPossibleSwipe = false;\n }, 100);\n }, {passive: true, once: true});\n }\n\n /* const detach = () => {\n window.removeEventListener('touchend', onTouchEnd);\n window.removeEventListener('touchmove', onTouchMove);\n };\n\n let moved = false;\n const onTouchMove = (e: TouchEvent) => {\n this.debug && this.log('touchmove');\n if(e.touches.length > 1) {\n detach();\n return;\n }\n\n moved = true;\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n this.debug && this.log('touchend');\n if(e.touches.length > 1 || !moved) {\n detach();\n return;\n }\n\n isPossibleSwipe = true;\n doubleRaf().then(() => {\n isPossibleSwipe = false;\n });\n\n detach();\n };\n\n window.addEventListener('touchend', onTouchEnd, options);\n window.addEventListener('touchmove', onTouchMove, options); */\n };\n\n public overrideHash(hash: string = '') {\n if(hash && hash[0] !== '#') hash = '#' + hash;\n else if(hash === '#') hash = '';\n\n if(this.currentHash === hash) {\n return;\n }\n\n this.overriddenHash = this.currentHash = hash;\n this.replaceState();\n this.pushState();\n }\n\n private handleItem(item: NavigationItem) {\n const good = item.onPop(!this.manual ? false : undefined);\n this.debug && this.log('popstate, navigation:', item, this.navigations);\n if(good === false) {\n this.pushItem(item);\n } else if(!item.noBlurOnPop) {\n blurActiveElement(); // no better place for it\n }\n\n this.manual = false;\n }\n\n public findItemByType(type: NavigationItem['type']) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n return {item, index: i};\n }\n }\n }\n\n public back(type?: NavigationItem['type']) {\n if(type) {\n const ret = this.findItemByType(type);\n if(ret) {\n this.backByItem(ret.item, ret.index);\n return;\n }\n }\n\n history.back();\n }\n\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\n this.manual = true;\n // ! commented because 'popstate' event will be fired with delay\n // if(index !== (this.navigations.length - 1)) {\n this.navigations.splice(index, 1);\n this.handleItem(item);\n // }\n }\n\n private onItemAdded(item: NavigationItem) {\n this.debug && this.log('onItemAdded', item, this.navigations);\n\n if(!item.noHistory) {\n this.pushState();\n }\n }\n\n public pushItem(item: NavigationItem) {\n this.navigations.push(item);\n this.onItemAdded(item);\n }\n\n public unshiftItem(item: NavigationItem) {\n this.navigations.unshift(item);\n this.onItemAdded(item);\n }\n\n public spliceItems(index: number, length: number, ...items: NavigationItem[]) {\n this.navigations.splice(index, length, ...items);\n items.forEach((item) => {\n this.onItemAdded(item);\n });\n }\n\n private pushState() {\n this.debug && this.log('push');\n this.manual = false;\n history.pushState(this.id, '');\n }\n\n public replaceState() {\n this.debug && this.log.warn('replace');\n\n const url = location.origin + location.pathname + location.search + this.overriddenHash;\n history.replaceState(this.id, '', url);\n }\n\n public removeItem(item: NavigationItem) {\n if(!item) {\n return;\n }\n\n indexOfAndSplice(this.navigations, item);\n }\n\n public removeByType(type: NavigationItem['type'], single = false) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n this.navigations.splice(i, 1);\n\n if(single) {\n break;\n }\n }\n }\n }\n}\n\nconst appNavigationController = new AppNavigationController();\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\nexport default appNavigationController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from '../lib/appManagers/appDialogsManager';\nimport Scrollable from './scrollable';\nimport InputSearch from './inputSearch';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\n\nexport class SearchGroup {\n container: HTMLDivElement;\n nameEl: HTMLDivElement;\n list: HTMLUListElement;\n\n constructor(\n public name: LangPackKey | boolean,\n public type: string,\n private clearable = true,\n className?: string,\n clickable = true,\n public autonomous = true,\n public onFound?: () => void,\n public noIcons?: boolean\n ) {\n this.list = appDialogsManager.createChatList();\n this.container = document.createElement('div');\n if(className) this.container.className = className;\n\n if(name) {\n this.nameEl = document.createElement('div');\n this.nameEl.classList.add('search-group__name');\n if(typeof(name) === 'string') {\n this.nameEl.append(i18n(name));\n }\n this.container.append(this.nameEl);\n }\n\n this.container.classList.add('search-group', 'search-group-' + type);\n this.container.append(this.list);\n this.container.style.display = 'none';\n\n if(clickable) {\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\n }\n }\n\n clear() {\n this.container.style.display = 'none';\n\n if(this.clearable) {\n this.list.innerHTML = '';\n }\n }\n\n setActive() {\n this.container.style.display = '';\n }\n\n toggle() {\n if(this.list.childElementCount) {\n this.setActive();\n } else {\n this.clear();\n }\n }\n}\n\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\n\nexport default class AppSearch {\n private minMsgId = 0;\n private loadedCount = -1;\n private foundCount = -1;\n\n private searchPromise: Promise = null;\n private searchTimeout: number = 0;\n\n private query = '';\n\n private listsContainer: HTMLDivElement = null;\n\n private peerId: PeerId; // 0 - means global\n private threadId = 0;\n\n private scrollable: Scrollable;\n\n constructor(\n public container: HTMLElement,\n public searchInput: InputSearch,\n public searchGroups: {[group in SearchGroupType]: SearchGroup},\n public onSearch?: (count: number) => void,\n public noIcons?: boolean\n ) {\n this.scrollable = new Scrollable(this.container);\n this.listsContainer = this.scrollable.container as HTMLDivElement;\n for(const i in this.searchGroups) {\n this.listsContainer.append(this.searchGroups[i as SearchGroupType].container);\n }\n\n if(this.searchGroups.messages) {\n this.scrollable.setVirtualContainer(this.searchGroups.messages.list);\n }\n\n this.searchInput.onChange = (value) => {\n /* if(!value.trim()) {\n //this.peerId = 0;\n return;\n } */\n\n this.query = value;\n this.reset(false);\n this.searchMore();\n };\n\n this.scrollable.onScrolledBottom = () => {\n if(!this.query.trim()) return;\n\n if(!this.searchTimeout) {\n this.searchTimeout = window.setTimeout(() => {\n this.searchMore();\n this.searchTimeout = 0;\n }, 0);\n }\n };\n }\n\n public reset(all = true) {\n if(all) {\n this.searchInput.value = '';\n this.query = '';\n this.peerId = undefined;\n this.threadId = 0;\n }\n\n this.minMsgId = 0;\n this.loadedCount = -1;\n this.foundCount = -1;\n\n for(const i in this.searchGroups) {\n this.searchGroups[i as SearchGroupType].clear();\n }\n\n this.searchPromise = null;\n }\n\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\n this.peerId = peerId;\n this.threadId = threadId;\n\n if(this.query !== query) {\n this.searchInput.inputField.value = query;\n }\n\n this.searchInput.input.focus();\n }\n\n public searchMore() {\n if(this.searchPromise) return this.searchPromise;\n\n const query = this.query;\n\n if(!query.trim()) {\n this.onSearch && this.onSearch(0);\n return;\n }\n\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\n return Promise.resolve();\n }\n\n const maxId = this.minMsgId || 0;\n\n return this.searchPromise = rootScope.managers.appMessagesManager.getSearch({\n peerId: this.peerId,\n query,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n maxId,\n limit: 20,\n threadId: this.threadId\n }).then((res) => {\n this.searchPromise = null;\n\n if(this.searchInput.value !== query) {\n return;\n }\n\n // console.log('input search result:', this.peerId, query, null, maxId, 20, res);\n\n const {count, history} = res;\n\n if(history.length && history[0].mid === this.minMsgId) {\n history.shift();\n }\n\n const searchGroup = this.searchGroups.messages;\n\n history.forEach((message) => {\n try {\n const peerId = this.peerId ? message.fromId : message.peerId;\n appDialogsManager.addDialogAndSetLastMessage({\n peerId,\n container: this.scrollable/* searchGroup.list */,\n avatarSize: 'bigger',\n meAsSaved: false,\n message,\n query,\n noIcons: this.noIcons\n });\n } catch(err) {\n console.error('[appSearch] render search result', err);\n }\n });\n\n searchGroup.toggle();\n\n this.minMsgId = history.length && history[history.length - 1].mid;\n\n if(this.loadedCount === -1) {\n this.loadedCount = 0;\n }\n this.loadedCount += history.length;\n\n if(this.foundCount === -1) {\n this.foundCount = count;\n\n if(searchGroup.nameEl) {\n replaceContent(searchGroup.nameEl, i18n(count ? 'Chat.Search.MessagesFound' : 'Chat.Search.NoMessagesFound', [count]));\n }\n\n this.onSearch && this.onSearch(this.foundCount);\n }\n }).catch((err) => {\n console.error('search error', err);\n this.searchPromise = null;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyInputMessagesFilter, MyMessage} from '../lib/appManagers/appMessagesManager';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport {logger} from '../lib/logger';\nimport rootScope from '../lib/rootScope';\nimport {SearchGroup, SearchGroupType} from './appSearch';\nimport {horizontalMenu} from './horizontalMenu';\nimport LazyLoadQueue from './lazyLoadQueue';\nimport {putPreloader} from './putPreloader';\nimport ripple from './ripple';\nimport Scrollable, {ScrollableX} from './scrollable';\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport I18n, {LangPackKey, i18n} from '../lib/langPack';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport {getMiddleware, Middleware} from '../helpers/middleware';\nimport {ChannelParticipant, Chat, ChatFull, ChatParticipant, ChatParticipants, Document, Message, MessageMedia, Photo, WebPage} from '../layer';\nimport SortedUserList from './sortedUserList';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport appSidebarRight from './sidebarRight';\nimport mediaSizes from '../helpers/mediaSizes';\nimport appImManager from '../lib/appManagers/appImManager';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport cleanSearchText from '../helpers/cleanSearchText';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport handleTabSwipe from '../helpers/dom/handleTabSwipe';\nimport windowSize from '../helpers/windowSize';\nimport {formatPhoneNumber} from '../helpers/formatPhoneNumber';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from './buttonMenu';\nimport PopupForward from './popups/forward';\nimport PopupDeleteMessages from './popups/deleteMessages';\nimport Row from './row';\nimport htmlToDocumentFragment from '../helpers/dom/htmlToDocumentFragment';\nimport {SearchSelection} from './chat/selection';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport AppMediaViewer from './appMediaViewer';\nimport lockTouchScroll from '../helpers/dom/lockTouchScroll';\nimport copy from '../helpers/object/copy';\nimport getObjectKeysAndSort from '../helpers/object/getObjectKeysAndSort';\nimport safeAssign from '../helpers/object/safeAssign';\nimport escapeRegExp from '../helpers/string/escapeRegExp';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport {ScrollStartCallbackDimensions} from '../helpers/fastSmoothScroll';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport wrapWebPageDescription from './wrappers/webPageDescription';\nimport wrapWebPageTitle from './wrappers/webPageTitle';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\nimport matchUrl from '../lib/richTextProcessor/matchUrl';\nimport wrapPlainText from '../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport wrapSenderToPeer from './wrappers/senderToPeer';\nimport wrapSentTime from './wrappers/sentTime';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport filterMessagesByInputFilter from '../lib/appManagers/utils/messages/filterMessagesByInputFilter';\nimport getChatMembersString from './wrappers/getChatMembersString';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport getParticipantPeerId from '../lib/appManagers/utils/chats/getParticipantPeerId';\nimport {Awaited} from '../types';\nimport {attachContextMenuListener} from '../helpers/dom/attachContextMenuListener';\nimport contextMenuController from '../helpers/contextMenuController';\nimport positionMenu from '../helpers/positionMenu';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport SwipeHandler from './swipeHandler';\nimport wrapDocument from './wrappers/document';\nimport wrapPhoto from './wrappers/photo';\nimport wrapVideo from './wrappers/video';\nimport noop from '../helpers/noop';\nimport wrapMediaSpoiler, {onMediaSpoilerClick} from './wrappers/mediaSpoiler';\n\n// const testScroll = false;\n\nexport type SearchSuperType = MyInputMessagesFilter/* | 'members' */;\nexport type SearchSuperContext = {\n peerId: PeerId,\n inputFilter: {_: MyInputMessagesFilter},\n query?: string,\n maxId?: number,\n folderId?: number,\n threadId?: number,\n date?: number,\n nextRate?: number,\n minDate?: number,\n maxDate?: number\n};\n\nexport type SearchSuperMediaType = 'members' | 'media' | 'files' | 'links' | 'music' | 'chats' | 'voice';\nexport type SearchSuperMediaTab = {\n inputFilter: SearchSuperType,\n name: LangPackKey,\n type: SearchSuperMediaType,\n contentTab?: HTMLElement,\n menuTab?: HTMLElement,\n scroll?: {scrollTop: number, scrollHeight: number}\n};\n\nclass SearchContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify?: () => boolean | Promise, withSelection?: true})[];\n private element: HTMLElement;\n private target: HTMLElement;\n private peerId: PeerId;\n private mid: number;\n private isSelected: boolean;\n private managers: AppManagers;\n\n constructor(\n private attachTo: HTMLElement,\n private searchSuper: AppSearchSuper,\n private listenerSetter: ListenerSetter\n ) {\n this.managers = searchSuper.managers;\n\n const onContextMenu: Parameters[0]['callback'] = (e) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let item: HTMLElement;\n try {\n item = findUpClassName(e.target, 'search-super-item');\n } catch(e) {}\n\n if(!item) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n const r = async() => {\n this.target = item;\n this.peerId = item.dataset.peerId.toPeerId();\n this.mid = +item.dataset.mid;\n this.isSelected = searchSuper.selection.isMidSelected(this.peerId, this.mid);\n\n await Promise.all(this.buttons.map(async(button) => {\n let good: boolean;\n\n if(this.isSelected && !button.withSelection) {\n good = false;\n } else {\n good = button.verify ? await button.verify() : true;\n }\n\n button.element.classList.toggle('hide', !good);\n }));\n\n item.classList.add('menu-open');\n\n positionMenu(e, this.element);\n contextMenuController.openBtnMenu(this.element, () => {\n item.classList.remove('menu-open');\n });\n };\n\n r();\n };\n\n if(IS_TOUCH_SUPPORTED) {\n\n } else {\n attachContextMenuListener({\n element: attachTo,\n callback: onContextMenu as any,\n listenerSetter\n });\n }\n }\n\n private init() {\n this.buttons = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick,\n verify: async() => this.managers.appMessagesManager.canForward(await this.managers.appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.isSelected &&\n !this.searchSuper.selection.selectionForwardBtn.classList.contains('hide'),\n withSelection: true\n }, {\n icon: 'message',\n text: 'Message.Context.Goto',\n onClick: this.onGotoClick,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n withSelection: true\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(await this.managers.appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.searchSuper.selection.selectionDeleteBtn.classList.contains('hide'),\n withSelection: true\n }];\n\n this.element = ButtonMenuSync({buttons: this.buttons, listenerSetter: this.listenerSetter});\n this.element.classList.add('search-contextmenu', 'contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onGotoClick = () => {\n appImManager.setInnerPeer({\n peerId: this.peerId,\n lastMsgId: this.mid,\n threadId: this.searchSuper.searchContext.threadId\n });\n };\n\n private onForwardClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionForwardBtn);\n } else {\n new PopupForward({\n [this.peerId]: [this.mid]\n });\n }\n };\n\n private onSelectClick = () => {\n this.searchSuper.selection.toggleByElement(this.target);\n };\n\n private onClearSelectionClick = () => {\n this.searchSuper.selection.cancelSelection();\n };\n\n private onDeleteClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, [this.mid], 'chat');\n }\n };\n}\n\nexport type ProcessSearchSuperResult = {\n message: Message.message,\n middleware: Middleware,\n promises: Promise[],\n elemsToAppend: {element: HTMLElement, message: any}[],\n inputFilter: MyInputMessagesFilter,\n searchGroup?: SearchGroup\n};\n\nexport default class AppSearchSuper {\n public tabs: {[t in SearchSuperType]: HTMLDivElement} = {} as any;\n\n public mediaTab: SearchSuperMediaTab;\n\n public container: HTMLElement;\n public nav: HTMLElement;\n public navScrollableContainer: HTMLDivElement;\n public tabsContainer: HTMLElement;\n public navScrollable: ScrollableX;\n private tabsMenu: HTMLElement;\n private prevTabId = -1;\n\n private lazyLoadQueue = new LazyLoadQueue();\n public middleware = getMiddleware();\n\n public historyStorage: Partial<{[type in SearchSuperType]: {mid: number, peerId: PeerId}[]}> = {};\n public usedFromHistory: Partial<{[type in SearchSuperType]: number}> = {};\n\n public searchContext: SearchSuperContext;\n public loadMutex: Promise = Promise.resolve();\n\n private nextRates: Partial<{[type in SearchSuperType]: number}> = {};\n private loadPromises: Partial<{[type in SearchSuperType]: Promise}> = {};\n private loaded: Partial<{[type in SearchSuperType]: boolean}> = {};\n private loadedChats = false;\n private firstLoad = true;\n\n private log = logger('SEARCH-SUPER');\n public selectTab: ReturnType;\n\n private monthContainers: Partial<{\n [type in SearchSuperType]: {\n [timestamp: number]: {\n container: HTMLElement,\n items: HTMLElement\n }\n }\n }> = {};\n\n private searchGroupMedia: SearchGroup;\n\n public mediaTabsMap: Map = new Map();\n\n private membersList: SortedUserList;\n\n private skipScroll: boolean;\n\n // * arguments\n public mediaTabs: SearchSuperMediaTab[];\n public scrollable: Scrollable;\n public searchGroups?: {[group in SearchGroupType]: SearchGroup};\n public asChatList? = false;\n public groupByMonth? = true;\n public hideEmptyTabs? = true;\n public onChangeTab?: (mediaTab: SearchSuperMediaTab) => void;\n public showSender? = false;\n\n private searchContextMenu: SearchContextMenu;\n public selection: SearchSelection;\n\n public scrollStartCallback: (dimensions: ScrollStartCallbackDimensions) => void;\n\n public managers: AppManagers;\n private loadFirstTimePromise: Promise;\n\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\n\n constructor(options: Pick) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('search-super');\n\n this.listenerSetter = new ListenerSetter();\n this.searchContextMenu = new SearchContextMenu(this.container, this, this.listenerSetter);\n this.selection = new SearchSelection(this, this.managers, this.listenerSetter);\n\n const navScrollableContainer = this.navScrollableContainer = document.createElement('div');\n navScrollableContainer.classList.add('search-super-tabs-scrollable', 'menu-horizontal-scrollable', 'sticky');\n\n const navScrollable = this.navScrollable = new ScrollableX(navScrollableContainer);\n navScrollable.container.classList.add('search-super-nav-scrollable');\n\n const nav = this.nav = document.createElement('nav');\n nav.classList.add('search-super-tabs', 'menu-horizontal-div');\n this.tabsMenu = nav;\n\n navScrollable.container.append(nav);\n\n for(const mediaTab of this.mediaTabs) {\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const i = document.createElement('i');\n\n span.append(i18n(mediaTab.name));\n span.append(i);\n\n menuTab.append(span);\n\n ripple(menuTab);\n\n this.tabsMenu.append(menuTab);\n\n this.mediaTabsMap.set(mediaTab.type, mediaTab);\n\n mediaTab.menuTab = menuTab;\n }\n\n this.tabsContainer = document.createElement('div');\n this.tabsContainer.classList.add('search-super-tabs-container', 'tabs-container');\n\n let unlockScroll: ReturnType;\n if(IS_TOUCH_SUPPORTED) {\n this.swipeHandler = handleTabSwipe({\n element: this.tabsContainer,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\n const prevId = this.selectTab.prevId();\n const children = Array.from(this.tabsMenu.children) as HTMLElement[];\n let idx: number;\n if(xDiff > 0) {\n for(let i = prevId + 1; i < children.length; ++i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n } else {\n for(let i = prevId - 1; i >= 0; --i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n }\n\n if(idx !== undefined) {\n unlockScroll = lockTouchScroll(this.tabsContainer);\n this.selectTab(idx);\n }\n }\n });\n }\n\n for(const mediaTab of this.mediaTabs) {\n const container = document.createElement('div');\n container.classList.add('search-super-container-' + mediaTab.type, 'tabs-tab');\n\n const content = document.createElement('div');\n content.classList.add('search-super-content-' + mediaTab.type);\n\n container.append(content);\n\n this.tabsContainer.append(container);\n\n this.tabs[mediaTab.inputFilter] = content;\n\n mediaTab.contentTab = content;\n }\n\n this.container.append(navScrollableContainer, this.tabsContainer);\n\n // * construct end\n\n this.searchGroupMedia = new SearchGroup(false, 'messages', true);\n\n this.scrollable.onScrolledBottom = () => {\n if(this.mediaTab.contentTab && this.canLoadMediaTab(this.mediaTab)/* && false */) {\n // this.log('onScrolledBottom will load media');\n this.load(true);\n }\n };\n // this.scroll.attachSentinels(undefined, 400);\n\n this.selectTab = horizontalMenu(this.tabsMenu, this.tabsContainer, (id, tabContent, animate) => {\n if(this.prevTabId === id && !this.skipScroll) {\n this.scrollable.scrollIntoViewNew({\n element: this.container,\n position: 'start',\n startCallback: this.scrollStartCallback\n });\n return;\n }\n\n const newMediaTab = this.mediaTabs[id];\n if(this.onChangeTab) {\n this.onChangeTab(newMediaTab);\n }\n\n const fromMediaTab = this.mediaTab;\n this.mediaTab = newMediaTab;\n\n if(this.prevTabId !== -1 && animate) {\n this.onTransitionStart();\n }\n\n if(this.skipScroll) {\n this.skipScroll = false;\n } else {\n const offsetTop = this.container.offsetTop;\n let scrollTop = this.scrollable.scrollTop;\n if(scrollTop < offsetTop) {\n this.scrollable.scrollIntoViewNew({\n element: this.container,\n position: 'start',\n startCallback: this.scrollStartCallback\n });\n scrollTop = offsetTop;\n }\n\n fromMediaTab.scroll = {scrollTop: scrollTop, scrollHeight: this.scrollable.scrollHeight};\n\n if(newMediaTab.scroll === undefined) {\n const rect = this.container.getBoundingClientRect();\n const rect2 = this.container.parentElement.getBoundingClientRect();\n const diff = rect.y - rect2.y;\n\n if(scrollTop > diff) {\n newMediaTab.scroll = {scrollTop: diff, scrollHeight: 0};\n }\n }\n\n if(newMediaTab.scroll) {\n const diff = fromMediaTab.scroll.scrollTop - newMediaTab.scroll.scrollTop;\n // console.log('what you gonna do', this.goingHard, diff);\n\n // this.scrollable.scrollTop = scrollTop;\n if(diff/* && diff < 0 */) {\n /* if(diff > -(fromMediaTab.contentTab.scrollHeight + this.nav.scrollHeight)) {\n fromMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n this.scrollable.scrollTop = scrollTop - diff;\n } else { */\n newMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n // }\n }\n }\n }\n\n /* if(this.prevTabId !== -1 && nav.offsetTop) {\n this.scrollable.scrollTop -= nav.offsetTop;\n } */\n\n /* this.log('setVirtualContainer', id, this.sharedMediaSelected, this.sharedMediaSelected.childElementCount);\n this.scroll.setVirtualContainer(this.sharedMediaSelected); */\n\n if(this.prevTabId !== -1 && !newMediaTab.contentTab.childElementCount) { // quick brown fix\n // this.contentContainer.classList.remove('loaded');\n this.load(true);\n }\n\n this.prevTabId = id;\n }, () => {\n this.scrollable.onScroll();\n\n // console.log('what y', this.tabSelected.style.transform);\n if(this.mediaTab.scroll !== undefined) {\n this.mediaTab.contentTab.style.transform = '';\n this.scrollable.scrollTop = this.mediaTab.scroll.scrollTop;\n }\n\n if(unlockScroll) {\n unlockScroll();\n unlockScroll = undefined;\n }\n\n this.onTransitionEnd();\n }, undefined, navScrollable, this.listenerSetter);\n\n attachClickEvent(this.tabsContainer, (e) => {\n if(this.selection.isSelecting) {\n cancelEvent(e);\n this.selection.toggleByElement(findUpClassName(e.target, 'search-super-item'));\n }\n }, {capture: true, passive: false, listenerSetter: this.listenerSetter});\n\n const onMediaClick = async(className: string, targetClassName: string, inputFilter: MyInputMessagesFilter, e: MouseEvent) => {\n const target = findUpClassName(e.target as HTMLDivElement, className);\n if(!target) return;\n\n const mid = +target.dataset.mid;\n if(!mid) {\n this.log.warn('no messageId by click on target:', target);\n return;\n }\n\n const mediaSpoiler: HTMLElement = target.querySelector('.media-spoiler-container');\n if(mediaSpoiler) {\n onMediaSpoilerClick({\n event: e,\n mediaSpoiler\n })\n return;\n }\n\n const peerId = target.dataset.peerId.toPeerId();\n\n const targets = (Array.from(this.tabs[inputFilter].querySelectorAll('.' + targetClassName)) as HTMLElement[]).map((el) => {\n const containerEl = findUpClassName(el, className);\n return {\n element: el,\n mid: +containerEl.dataset.mid,\n peerId: containerEl.dataset.peerId.toPeerId()\n };\n });\n\n // const ids = Object.keys(this.mediaDivsByIds).map((k) => +k).sort((a, b) => a - b);\n const idx = targets.findIndex((item) => item.mid === mid && item.peerId === peerId);\n\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n new AppMediaViewer()\n .setSearchContext(this.copySearchContext(inputFilter))\n .openMedia(message, targets[idx].element, 0, false, targets.slice(0, idx), targets.slice(idx + 1));\n };\n\n attachClickEvent(this.tabs.inputMessagesFilterPhotoVideo, onMediaClick.bind(null, 'grid-item', 'grid-item', 'inputMessagesFilterPhotoVideo'), {listenerSetter: this.listenerSetter});\n attachClickEvent(this.tabs.inputMessagesFilterDocument, onMediaClick.bind(null, 'document-with-thumb', 'media-container', 'inputMessagesFilterDocument'), {listenerSetter: this.listenerSetter});\n\n /* attachClickEvent(this.tabs.inputMessagesFilterUrl, (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') {\n return;\n }\n\n try {\n const a = findUpClassName(target, 'row').querySelector('.anchor-url:last-child') as HTMLAnchorElement;\n a.click();\n } catch(err) {}\n }); */\n\n this.mediaTab = this.mediaTabs[0];\n\n useHeavyAnimationCheck(() => {\n this.lazyLoadQueue.lock();\n }, () => {\n this.lazyLoadQueue.unlockAndRefresh(); // ! maybe not so efficient\n }, this.listenerSetter);\n }\n\n private onTransitionStart = () => {\n this.container.classList.add('sliding');\n };\n\n private onTransitionEnd = () => {\n this.container.classList.remove('sliding');\n };\n\n public filterMessagesByType(messages: any[], type: SearchSuperType): MyMessage[] {\n return filterMessagesByInputFilter(type, messages, messages.length);\n }\n\n private processEmptyFilter({message, searchGroup}: ProcessSearchSuperResult) {\n const loadPromises: Promise[] = [];\n const dialogElement = appDialogsManager.addDialogNew({\n peerId: message.peerId,\n container: searchGroup.list,\n avatarSize: 'bigger',\n loadPromises\n });\n\n const setLastMessagePromise = appDialogsManager.setLastMessageN({\n dialog: {\n _: 'dialog',\n peerId: message.peerId\n } as any,\n lastMessage: message,\n dialogElement,\n highlightWord: this.searchContext.query\n });\n\n loadPromises.push(setLastMessagePromise);\n return Promise.all(loadPromises).then(noop);\n }\n\n private async processPhotoVideoFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n const media = getMediaFromMessage(message);\n\n const div = document.createElement('div');\n div.classList.add('grid-item');\n // this.log(message, photo);\n\n let wrapped: Awaited>;\n const size = choosePhotoSize(media, 200, 200);\n if(media._ !== 'photo') {\n wrapped = await (await wrapVideo({\n doc: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n onlyPreview: true,\n withoutPreloader: true,\n noPlayButton: true,\n photoSize: size\n })).thumb;\n } else {\n wrapped = await wrapPhoto({\n photo: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n noBlur: true,\n size\n });\n }\n\n if((message.media as MessageMedia.messageMediaPhoto).pFlags.spoiler) {\n const mediaSpoiler = await wrapMediaSpoiler({\n animationGroup: 'chat',\n media,\n middleware,\n width: 140,\n height: 140,\n multiply: 0.3\n });\n\n div.append(mediaSpoiler);\n }\n\n [\n wrapped.images.thumb,\n wrapped.images.full\n ].filter(Boolean).forEach((image) => {\n image.classList.add('grid-item-media');\n });\n\n promises.push(wrapped.loadPromises.thumb);\n\n return {element: div, message};\n }\n\n private async processDocumentFilter({message, inputFilter}: ProcessSearchSuperResult) {\n const document = getMediaFromMessage(message) as Document.document;\n const showSender = this.showSender || (['voice', 'round'] as MyDocument['type'][]).includes(document.type);\n\n const div = await wrapDocument({\n message,\n withTime: !showSender,\n fontWeight: 400,\n voiceAsMusic: true,\n showSender,\n searchContext: this.copySearchContext(inputFilter),\n lazyLoadQueue: this.lazyLoadQueue,\n autoDownloadSize: 0\n });\n\n if((['audio', 'voice', 'round'] as MyDocument['type'][]).includes(document.type)) {\n div.classList.add('audio-48');\n }\n\n return {message, element: div};\n }\n\n private async processUrlFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n let webPage = (message.media as MessageMedia.messageMediaWebPage)?.webpage as WebPage.webPage | WebPage.webPageEmpty;\n\n if(!webPage) {\n const entity = message.totalEntities ? message.totalEntities.find((e: any) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') : null;\n let url: string, display_url: string, sliced: string;\n\n if(!entity) {\n const match = matchUrl(message.message);\n if(!match) {\n return;\n }\n\n url = match[0];\n } else {\n sliced = message.message.slice(entity.offset, entity.offset + entity.length);\n }\n\n if(entity?._ === 'messageEntityTextUrl') {\n url = entity.url;\n // display_url = sliced;\n } else {\n url = url || sliced;\n }\n\n display_url = url;\n\n const same = message.message === url;\n if(!url.match(/^(ftp|http|https):\\/\\//)) {\n display_url = 'https://' + url;\n url = url.includes('@') ? url : 'https://' + url;\n }\n\n display_url = new URL(display_url).hostname;\n\n webPage = {\n _: 'webPage',\n url,\n display_url,\n id: '',\n hash: 0\n };\n\n if(!same) {\n webPage.description = message.message;\n }\n }\n\n if(webPage._ === 'webPageEmpty') {\n return;\n }\n\n const previewDiv = document.createElement('div');\n previewDiv.classList.add('preview');\n\n // this.log('wrapping webpage', webpage);\n\n if(webPage.photo) {\n const res = wrapPhoto({\n container: previewDiv,\n message: null,\n photo: webPage.photo as Photo.photo,\n boxWidth: 0,\n boxHeight: 0,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n size: choosePhotoSize(webPage.photo as Photo.photo, 60, 60, false),\n loadPromises: promises,\n noBlur: true\n });\n } else {\n previewDiv.classList.add('empty');\n setInnerHTML(previewDiv, wrapAbbreviation(webPage.title || webPage.display_url || webPage.description || webPage.url, true));\n }\n\n const title = wrapWebPageTitle(webPage);\n\n const subtitleFragment = wrapWebPageDescription(webPage);\n const aFragment = htmlToDocumentFragment(wrapRichText(webPage.url || ''));\n const a = aFragment.firstElementChild;\n if(a instanceof HTMLAnchorElement) {\n try { // can have 'URIError: URI malformed'\n a.innerText = decodeURIComponent(a.href);\n } catch(err) {\n\n }\n }\n\n if(subtitleFragment.firstChild) {\n subtitleFragment.append('\\n');\n }\n\n subtitleFragment.append(a);\n\n if(this.showSender) {\n subtitleFragment.append('\\n', await wrapSenderToPeer(message));\n }\n\n if(!title.textContent) {\n // title = new URL(webpage.url).hostname;\n title.append(wrapPlainText(webPage.display_url.split('/', 1)[0]));\n }\n\n const row = new Row({\n title,\n titleRight: wrapSentTime(message),\n subtitle: subtitleFragment,\n havePadding: true,\n clickable: true,\n noRipple: true\n });\n\n row.applyMediaElement(previewDiv, 'big');\n\n if(row.container.innerText.trim().length) {\n return {message, element: row.container};\n }\n }\n\n public async performSearchResult(messages: any[], mediaTab: SearchSuperMediaTab, append = true) {\n const elemsToAppend: {element: HTMLElement, message: any}[] = [];\n const sharedMediaDiv: HTMLElement = mediaTab.contentTab;\n const promises: Promise[] = [];\n const middleware = this.middleware.get();\n let inputFilter = mediaTab.inputFilter;\n\n await getHeavyAnimationPromise();\n\n let searchGroup: SearchGroup;\n if(inputFilter === 'inputMessagesFilterPhotoVideo' && !!this.searchContext.query.trim()) {\n inputFilter = 'inputMessagesFilterEmpty';\n searchGroup = this.searchGroupMedia;\n sharedMediaDiv.append(searchGroup.container);\n } else if(inputFilter === 'inputMessagesFilterEmpty') {\n searchGroup = this.searchGroups.messages;\n }\n\n const options: ProcessSearchSuperResult = {\n elemsToAppend,\n inputFilter,\n message: undefined,\n middleware,\n promises,\n searchGroup\n };\n\n let processCallback: (options: ProcessSearchSuperResult) => any;\n\n // https://core.telegram.org/type/MessagesFilter\n switch(inputFilter) {\n case 'inputMessagesFilterEmpty': {\n processCallback = this.processEmptyFilter;\n break;\n }\n\n case 'inputMessagesFilterPhotoVideo': {\n processCallback = this.processPhotoVideoFilter;\n break;\n }\n\n case 'inputMessagesFilterVoice':\n case 'inputMessagesFilterRoundVoice':\n case 'inputMessagesFilterMusic':\n case 'inputMessagesFilterDocument': {\n processCallback = this.processDocumentFilter;\n break;\n }\n\n case 'inputMessagesFilterUrl': {\n processCallback = this.processUrlFilter;\n break;\n }\n\n default:\n // this.log.warn('death is my friend', messages);\n break;\n }\n\n if(processCallback) {\n processCallback = processCallback.bind(this);\n\n type K = {element: HTMLElement, message: Message.message | Message.messageService};\n const results: (Promise | K)[] = messages.map(async(message) => {\n try {\n options.message = message;\n return await processCallback(options);\n } catch(err) {\n this.log.error('error rendering filter', inputFilter, options, message, err);\n }\n });\n\n const awaited = (await Promise.all(results)).filter(Boolean);\n elemsToAppend.push(...awaited);\n }\n\n if(searchGroup && searchGroup.list.childElementCount) {\n searchGroup.setActive();\n }\n\n if(this.loadMutex) {\n promises.push(this.loadMutex);\n }\n\n if(promises.length) {\n await Promise.all(promises);\n if(!middleware()) {\n // this.log.warn('peer changed');\n return;\n }\n }\n\n if(elemsToAppend.length) {\n const method = append ? 'append' : 'prepend';\n elemsToAppend.forEach((details) => {\n const {element, message} = details;\n if(!message) {\n debugger;\n }\n\n const monthContainer = this.getMonthContainerByTimestamp(this.groupByMonth ? message.date : 0, inputFilter);\n element.classList.add('search-super-item');\n element.dataset.mid = '' + message.mid;\n element.dataset.peerId = '' + message.peerId;\n monthContainer.items[method](element);\n\n if(this.selection?.isSelecting) {\n this.selection.toggleElementCheckbox(element, true);\n }\n });\n }\n\n // if(type !== 'inputMessagesFilterEmpty') {\n this.afterPerforming(inputFilter === 'inputMessagesFilterEmpty' ? 1 : elemsToAppend.length, sharedMediaDiv);\n // }\n }\n\n private afterPerforming(length: number, contentTab: HTMLElement) {\n if(contentTab) {\n const parent = contentTab.parentElement;\n Array.from(parent.children).slice(1).forEach((child) => {\n child.remove();\n });\n\n // this.contentContainer.classList.add('loaded');\n\n if(!length && !contentTab.childElementCount) {\n const div = document.createElement('div');\n div.innerText = 'Nothing interesting here yet...';\n div.classList.add('position-center', 'text-center', 'content-empty', 'no-select');\n\n parent.append(div);\n }\n }\n }\n\n private loadChats() {\n const renderedPeerIds: Set = new Set();\n const middleware = this.middleware.get();\n\n for(const i in this.searchGroups) {\n const group = this.searchGroups[i as SearchGroupType];\n this.tabs.inputMessagesFilterEmpty.append(group.container);\n group.clear();\n }\n\n const query = this.searchContext.query;\n if(query) {\n const setResults = (results: PeerId[], group: SearchGroup, showMembersCount = false) => {\n results.map((peerId) => {\n if(renderedPeerIds.has(peerId)) {\n return;\n }\n\n renderedPeerIds.add(peerId);\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: group.list,\n avatarSize: 'abitbigger',\n autonomous: group.autonomous\n });\n\n return {dom, peerId};\n }).filter(Boolean).forEach(async({dom, peerId}) => {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(showMembersCount && ((peer as Chat.channel).participants_count || (peer as any).participants)) {\n const regExp = new RegExp(`(${escapeRegExp(query)}|${escapeRegExp(cleanSearchText(query))})`, 'gi');\n dom.titleSpan.innerHTML = dom.titleSpan.innerHTML.replace(regExp, '$1');\n dom.lastMessageSpan.append(await getChatMembersString(peerId.toChatId()));\n } else if(peerId === rootScope.myId) {\n dom.lastMessageSpan.append(i18n('Presence.YourChat'));\n } else {\n let username = await this.managers.appPeersManager.getPeerUsername(peerId);\n if(!username) {\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user && user.phone) {\n username = '+' + formatPhoneNumber(user.phone).formatted;\n }\n } else {\n username = '@' + username;\n }\n\n dom.lastMessageSpan.textContent = username;\n }\n });\n\n group.toggle();\n };\n\n const onLoad = (arg: T) => {\n if(!middleware()) {\n return;\n }\n\n // this.loadedContacts = true;\n\n return arg;\n };\n\n return Promise.all([\n this.managers.appUsersManager.getContactsPeerIds(query, true, undefined, 10)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts, this.searchGroups.contacts, true);\n }\n }),\n\n this.managers.appUsersManager.searchContacts(query, 20)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts.my_results, this.searchGroups.contacts, true);\n setResults(contacts.results/* .concat(contacts.results, contacts.results, contacts.results) */, this.searchGroups.globalContacts);\n\n this.searchGroups.globalContacts.container.classList.add('is-short');\n\n if(this.searchGroups.globalContacts.nameEl.lastElementChild !== this.searchGroups.globalContacts.nameEl.firstElementChild) {\n this.searchGroups.globalContacts.nameEl.lastElementChild.remove();\n }\n\n if(this.searchGroups.globalContacts.list.childElementCount > 3) {\n const showMore = document.createElement('div');\n showMore.classList.add('search-group__show-more');\n const intlElement = new I18n.IntlElement({\n key: 'Separator.ShowMore'\n });\n showMore.append(intlElement.element);\n this.searchGroups.globalContacts.nameEl.append(showMore);\n attachClickEvent(showMore, () => {\n const isShort = this.searchGroups.globalContacts.container.classList.toggle('is-short');\n intlElement.key = isShort ? 'Separator.ShowMore' : 'Separator.ShowLess';\n intlElement.update();\n });\n }\n }\n }),\n\n this.managers.dialogsStorage.getDialogs({query, offsetIndex: 0, limit: 20, filterId: 0})\n .then(onLoad)\n .then((value) => {\n if(value) {\n setResults(value.dialogs.map((d) => d.peerId), this.searchGroups.contacts, true);\n }\n })\n ]);\n } else if(!this.searchContext.peerId && !this.searchContext.minDate) {\n const renderRecentSearch = (setActive = true) => {\n return apiManagerProxy.getState().then((state) => {\n if(!middleware()) {\n return;\n }\n\n this.searchGroups.recent.list.replaceChildren();\n\n state.recentSearch.slice(0, 20).forEach(async(peerId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.searchGroups.recent.list,\n meAsSaved: true,\n avatarSize: 'abitbigger',\n autonomous: true\n });\n\n dom.lastMessageSpan.append(await (peerId.isUser() ?\n getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())) :\n getChatMembersString(peerId.toChatId())));\n });\n\n if(!state.recentSearch.length) {\n this.searchGroups.recent.clear();\n } else if(setActive) {\n this.searchGroups.recent.setActive();\n }\n });\n };\n\n return Promise.all([\n this.managers.appUsersManager.getTopPeers('correspondents').then((peers) => {\n if(!middleware()) return;\n\n const idx = peers.findIndex((peer) => peer.id === rootScope.myId);\n if(idx !== -1) {\n peers = peers.slice();\n peers.splice(idx, 1);\n }\n\n peers.forEach((peer) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peer.id,\n container: this.searchGroups.people.list,\n onlyFirstName: true,\n avatarSize: 'bigger',\n autonomous: false,\n noIcons: this.searchGroups.people.noIcons\n });\n\n dom.subtitleEl.remove();\n });\n\n this.searchGroups.people.toggle();\n }),\n\n renderRecentSearch()\n ]);\n } else return Promise.resolve();\n }\n\n private async loadMembers(mediaTab: SearchSuperMediaTab) {\n const id = this.searchContext.peerId.toChatId();\n const middleware = this.middleware.get();\n let promise: Promise;\n\n const renderParticipants = async(participants: (ChatParticipant | ChannelParticipant)[]) => {\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n if(!this.membersList) {\n this.membersList = new SortedUserList({\n lazyLoadQueue: this.lazyLoadQueue,\n rippleEnabled: false,\n managers: this.managers\n });\n attachClickEvent(this.membersList.list, (e) => {\n const li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!li) {\n return;\n }\n\n const peerId = li.dataset.peerId.toPeerId();\n let promise: Promise = Promise.resolve();\n if(mediaSizes.isMobile) {\n promise = appSidebarRight.toggleSidebar(false);\n }\n\n promise.then(() => {\n appImManager.setInnerPeer({peerId});\n });\n });\n mediaTab.contentTab.append(this.membersList.list);\n this.afterPerforming(1, mediaTab.contentTab);\n }\n\n for(const participant of participants) {\n const peerId = getParticipantPeerId(participant);\n if(peerId.isAnyChat()) {\n continue;\n }\n\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user.pFlags.deleted) {\n continue;\n }\n\n this.membersList.add(peerId);\n }\n };\n\n if(await this.managers.appChatsManager.isChannel(id)) {\n const LOAD_COUNT = !this.membersList ? 50 : 200;\n promise = this.managers.appProfileManager.getChannelParticipants(id, undefined, LOAD_COUNT, this.nextRates[mediaTab.inputFilter]).then((participants) => {\n if(!middleware()) {\n return;\n }\n\n const list = mediaTab.contentTab.firstElementChild as HTMLUListElement;\n this.nextRates[mediaTab.inputFilter] = (list ? list.childElementCount : 0) + participants.participants.length;\n\n if(participants.participants.length < LOAD_COUNT) {\n this.loaded[mediaTab.inputFilter] = true;\n }\n\n return renderParticipants(participants.participants);\n });\n } else {\n promise = this.managers.appProfileManager.getChatFull(id).then((chatFull) => {\n if(!middleware()) {\n return;\n }\n\n // console.log('anymore', chatFull);\n this.loaded[mediaTab.inputFilter] = true;\n const participants = (chatFull as ChatFull.chatFull).participants;\n if(participants._ === 'chatParticipantsForbidden') {\n return;\n }\n\n return renderParticipants(participants.participants);\n });\n }\n\n return this.loadPromises[mediaTab.inputFilter] = promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadPromises[mediaTab.inputFilter] = null;\n });\n }\n\n private loadType(mediaTab: SearchSuperMediaTab, justLoad: boolean, loadCount: number, middleware: () => boolean) {\n const type = mediaTab.inputFilter;\n\n if(this.loadPromises[type]) {\n return this.loadPromises[type];\n }\n\n if(mediaTab.type === 'members') {\n return this.loadMembers(mediaTab);\n }\n\n const history = this.historyStorage[type] ??= [];\n\n if(type === 'inputMessagesFilterEmpty' && !history.length) {\n if(!this.loadedChats) {\n this.loadChats();\n this.loadedChats = true;\n }\n\n if(!this.searchContext.query.trim() && !this.searchContext.peerId && !this.searchContext.minDate) {\n this.loaded[type] = true;\n return Promise.resolve();\n }\n }\n\n const promise = this.loadPromises[type] = Promise.resolve().then(async() => {\n // render from cache\n if(history.length && this.usedFromHistory[type] < history.length && !justLoad) {\n const messages: any[] = [];\n let used = Math.max(0, this.usedFromHistory[type]);\n let slicedLength = 0;\n\n do {\n const ids = history.slice(used, used + loadCount);\n used += ids.length;\n slicedLength += ids.length;\n\n const notFilteredMessages = await Promise.all(ids.map((m) => this.managers.appMessagesManager.getMessageByPeer(m.peerId, m.mid)));\n\n messages.push(...this.filterMessagesByType(notFilteredMessages, type));\n } while(slicedLength < loadCount && used < history.length);\n\n // если перебор\n /* if(slicedLength > loadCount) {\n let diff = messages.length - loadCount;\n messages = messages.slice(0, messages.length - diff);\n used -= diff;\n } */\n\n this.usedFromHistory[type] = used;\n // if(messages.length) {\n return this.performSearchResult(messages, mediaTab).finally(() => {\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n // }\n }\n\n const maxId = history.length ? history[history.length - 1].mid : 0;\n\n const value = await this.managers.appMessagesManager.getSearch({\n ...this.searchContext,\n inputFilter: {_: type},\n maxId,\n limit: loadCount,\n nextRate: this.nextRates[type] ??= 0\n });\n\n history.push(...value.history.map((m) => ({mid: m.mid, peerId: m.peerId})));\n\n if(!middleware()) {\n // this.log.warn('peer changed');\n return;\n }\n\n // ! Фикс случая, когда не загружаются документы при открытой панели разработчиков (происходит из-за того, что не совпадают критерии отбора документов в getSearch)\n if(value.history.length < loadCount || (this.searchContext.folderId !== undefined && !value.next_rate) || value.history.length === value.count) {\n // if((value.count || history.length === value.count) && history.length >= value.count) {\n // this.log(logStr + 'loaded all media', value, loadCount);\n this.loaded[type] = true;\n }\n\n this.nextRates[type] = value.next_rate;\n\n if(justLoad) {\n return;\n }\n\n this.usedFromHistory[type] = history.length;\n\n if(!this.loaded[type]) {\n promise.then(() => {\n setTimeout(() => {\n if(!middleware()) return;\n // this.log('will preload more');\n if(this.mediaTab === mediaTab) {\n const promise = this.load(true, true);\n if(promise) {\n promise.then(() => {\n if(!middleware()) return;\n // this.log('preloaded more');\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n }\n }\n }, 0);\n });\n }\n\n // if(value.history.length) {\n return this.performSearchResult(this.filterMessagesByType(value.history, type), mediaTab);\n // }\n }).catch((err) => {\n this.log.error('load error:', err);\n }).finally(() => {\n this.loadPromises[type] = null;\n });\n\n return promise;\n }\n\n private canLoadMediaTab(mediaTab: SearchSuperMediaTab) {\n const inputFilter = mediaTab.inputFilter;\n return !this.loaded[inputFilter] || (this.historyStorage[inputFilter] && this.usedFromHistory[inputFilter] < this.historyStorage[inputFilter].length);\n }\n\n private async loadFirstTime() {\n const middleware = this.middleware.get();\n const {peerId, threadId} = this.searchContext;\n if(!this.hideEmptyTabs) {\n return;\n }\n\n const mediaTabs = this.mediaTabs.filter((mediaTab) => mediaTab.inputFilter !== 'inputMessagesFilterEmpty');\n const filters = mediaTabs.map((mediaTab) => ({_: mediaTab.inputFilter}));\n\n const [counters, canViewMembers] = await Promise.all([\n this.managers.appMessagesManager.getSearchCounters(peerId, filters, undefined, threadId),\n this.canViewMembers()\n ]);\n\n if(!middleware()) {\n return;\n }\n\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n let firstMediaTab: SearchSuperMediaTab;\n let count = 0;\n mediaTabs.forEach((mediaTab) => {\n const counter = counters.find((c) => c.filter._ === mediaTab.inputFilter);\n\n mediaTab.menuTab.classList.toggle('hide', !counter.count);\n mediaTab.menuTab.classList.remove('active');\n // mediaTab.contentTab.classList.toggle('hide', !counter.count);\n\n if(counter.count) {\n if(firstMediaTab === undefined) {\n firstMediaTab = mediaTab;\n }\n\n ++count;\n }\n });\n\n const membersTab = this.mediaTabsMap.get('members');\n membersTab.menuTab.classList.toggle('hide', !canViewMembers);\n\n if(canViewMembers) {\n firstMediaTab = membersTab;\n ++count;\n }\n\n this.container.classList.toggle('hide', !firstMediaTab);\n this.container.parentElement.classList.toggle('search-empty', !firstMediaTab);\n if(firstMediaTab) {\n this.skipScroll = true;\n this.selectTab(this.mediaTabs.indexOf(firstMediaTab), false);\n // firstMediaTab.menuTab.classList.add('active');\n\n this.navScrollableContainer.classList.toggle('hide', count <= 1);\n }\n }\n\n public async load(single = false, justLoad = false) {\n const peerId = this.searchContext.peerId;\n this.log('load', single, peerId, this.loadPromises);\n const middleware = this.middleware.get();\n\n if(this.firstLoad) {\n await (this.loadFirstTimePromise ??= this.loadFirstTime());\n if(!middleware()) {\n return;\n }\n\n this.loadFirstTimePromise = undefined;\n this.firstLoad = false;\n }\n\n let toLoad = single ? [this.mediaTab] : this.mediaTabs.filter((t) => t !== this.mediaTab);\n toLoad = toLoad.filter((mediaTab) => {\n return this.canLoadMediaTab(mediaTab);\n });\n\n if(peerId.isUser()) {\n findAndSplice(toLoad, (mediaTab) => mediaTab.type === 'members');\n }\n\n if(!toLoad.length) {\n return;\n }\n\n const loadCount = justLoad ? 50 : Math.round((windowSize.height / 130 | 0) * 3 * 1.25); // that's good for all types\n\n const promises: Promise[] = toLoad.map((mediaTab) => {\n return this.loadType(mediaTab, justLoad, loadCount, middleware);\n });\n\n return Promise.all(promises).catch((err) => {\n this.log.error('Load error all promises:', err);\n });\n }\n\n private getMonthContainerByTimestamp(timestamp: number, type: SearchSuperType) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n date.setDate(1);\n const dateTimestamp = date.getTime();\n const containers = this.monthContainers[type] ?? (this.monthContainers[type] = {});\n if(!(dateTimestamp in containers)) {\n const container = document.createElement('div');\n container.className = 'search-super-month';\n\n const name = document.createElement('div');\n name.classList.add('search-super-month-name');\n\n const options: Intl.DateTimeFormatOptions = {\n month: 'long'\n };\n\n if(date.getFullYear() !== new Date().getFullYear()) {\n options.year = 'numeric';\n }\n\n const dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n name.append(dateElement);\n\n container.append(name);\n\n const items = document.createElement('div');\n items.classList.add('search-super-month-items');\n\n container.append(name, items);\n\n const haveTimestamps = getObjectKeysAndSort(containers, 'desc');\n let i = 0;\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n if(dateTimestamp > t) {\n break;\n }\n }\n\n containers[dateTimestamp] = {container, items};\n positionElementByIndex(container, this.tabs[type], i);\n }\n\n return containers[dateTimestamp];\n }\n\n public canViewMembers() {\n const {peerId} = this.searchContext;\n const isAnyChat = peerId.isAnyChat();\n if(!isAnyChat) return Promise.resolve(false);\n const chatId = peerId.toChatId();\n return Promise.all([\n this.managers.appChatsManager.isBroadcast(chatId),\n this.managers.appChatsManager.hasRights(chatId, 'view_participants'),\n this.managers.appChatsManager.isForum(chatId)\n ]).then(([isBroadcast, hasRights, isForum]) => {\n return !isBroadcast && hasRights && (!this.searchContext.threadId || !isForum);\n });\n }\n\n public cleanup() {\n this.loadPromises = {};\n this.loaded = {};\n this.loadedChats = false;\n this.nextRates = {};\n this.firstLoad = true;\n this.prevTabId = -1;\n\n this.lazyLoadQueue.clear();\n\n this.mediaTabs.forEach((mediaTab) => {\n this.usedFromHistory[mediaTab.inputFilter] = -1;\n });\n\n if(this.selection?.isSelecting) {\n this.selection.cancelSelection();\n }\n\n // * must go to first tab (это костыль)\n /* const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n const tab = this.canViewMembers() ? membersTab : this.mediaTabs[this.mediaTabs.indexOf(membersTab) + 1];\n this.mediaTab = tab;\n } */\n\n this.middleware.clean();\n this.loadFirstTimePromise = undefined;\n this.cleanScrollPositions();\n this.membersList = undefined;\n }\n\n public cleanScrollPositions() {\n this.mediaTabs.forEach((mediaTab) => {\n mediaTab.scroll = undefined;\n });\n }\n\n public cleanupHTML(goFirst = false) {\n this.mediaTabs.forEach((tab) => {\n tab.contentTab.replaceChildren();\n\n if(this.hideEmptyTabs) {\n // tab.menuTab.classList.add('hide');\n this.container.classList.add('hide');\n this.container.parentElement.classList.add('search-empty');\n }\n\n if(tab.type === 'chats') {\n return;\n }\n\n if(!this.historyStorage[tab.inputFilter]) {\n const parent = tab.contentTab.parentElement;\n // if(!testScroll) {\n if(!parent.querySelector('.preloader')) {\n putPreloader(parent, true);\n }\n // }\n\n const empty = parent.querySelector('.content-empty');\n if(empty) {\n empty.remove();\n }\n }\n });\n\n /* if(goFirst) {\n const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n let idx = this.canViewMembers() ? 0 : 1;\n membersTab.menuTab.classList.toggle('hide', idx !== 0);\n\n this.selectTab(idx, false);\n } else {\n this.selectTab(0, false);\n }\n } */\n\n this.monthContainers = {};\n this.searchGroupMedia.clear();\n this.scrollable.scrollTop = 0;\n\n /* if(testScroll) {\n for(let i = 0; i < 1500; ++i) {\n let div = document.createElement('div');\n div.insertAdjacentHTML('beforeend', ``);\n div.classList.add('grid-item');\n div.dataset.id = '' + (i / 3 | 0);\n //div.innerText = '' + (i / 3 | 0);\n this.tabs.inputMessagesFilterPhotoVideo.append(div);\n }\n } */\n }\n\n private copySearchContext(newInputFilter: MyInputMessagesFilter) {\n const context = copy(this.searchContext);\n context.inputFilter = {_: newInputFilter};\n context.nextRate = this.nextRates[newInputFilter];\n return context;\n }\n\n public setQuery({peerId, query, threadId, historyStorage, folderId, minDate, maxDate}: {\n peerId: PeerId,\n query?: string,\n threadId?: number,\n historyStorage?: AppSearchSuper['historyStorage'],\n folderId?: number,\n minDate?: number,\n maxDate?: number\n }) {\n this.searchContext = {\n peerId,\n query: query || '',\n inputFilter: {_: this.mediaTab.inputFilter},\n threadId,\n folderId,\n minDate,\n maxDate\n };\n\n this.historyStorage = historyStorage ?? {};\n\n this.cleanup();\n }\n\n public destroy() {\n this.cleanup();\n this.listenerSetter.removeAll();\n this.scrollable.destroy();\n this.swipeHandler?.removeListeners();\n this.selection?.cleanup();\n\n this.scrollStartCallback = undefined;\n this.onChangeTab = undefined;\n this.selectTab = undefined;\n this.searchContextMenu = undefined;\n this.swipeHandler = undefined;\n this.selection = undefined;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from './cancelEvent';\n\nexport default function lockTouchScroll(container: HTMLElement) {\n const onTouchMove = (e: TouchEvent) => {\n cancelEvent(e);\n };\n\n let lockers = 2;\n const cb = () => {\n if(!--lockers) {\n container.removeEventListener('touchmove', onTouchMove, {capture: true});\n }\n };\n\n container.addEventListener('touchmove', onTouchMove, {capture: true, passive: false});\n container.addEventListener('touchend', cb, {once: true});\n\n return cb;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ChatRights} from '../lib/appManagers/appChatsManager';\nimport type {Dialog} from '../lib/appManagers/appMessagesManager';\nimport appDialogsManager, {DialogElementSize as DialogElementSize} from '../lib/appManagers/appDialogsManager';\nimport rootScope from '../lib/rootScope';\nimport Scrollable from './scrollable';\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\nimport CheckboxField from './checkboxField';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport findUpAttribute from '../helpers/dom/findUpAttribute';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport PeerTitle from './peerTitle';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport debounce from '../helpers/schedulers/debounce';\nimport windowSize from '../helpers/windowSize';\nimport type {IsPeerType} from '../lib/appManagers/appPeersManager';\nimport {attachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport filterUnique from '../helpers/array/filterUnique';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport safeAssign from '../helpers/object/safeAssign';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport AvatarElement from './avatar';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport filterAsync from '../helpers/array/filterAsync';\nimport getParticipantPeerId from '../lib/appManagers/utils/chats/getParticipantPeerId';\nimport getChatMembersString from './wrappers/getChatMembersString';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport {Chat, User} from '../layer';\nimport canSendToUser from '../lib/appManagers/utils/users/canSendToUser';\nimport hasRights from '../lib/appManagers/utils/chats/hasRights';\nimport getDialogIndex from '../lib/appManagers/utils/dialogs/getDialogIndex';\nimport {generateDelimiter} from './generateDelimiter';\nimport SettingSection from './settingSection';\n\ntype SelectSearchPeerType = 'contacts' | 'dialogs' | 'channelParticipants';\n\n// TODO: правильная сортировка для addMembers, т.е. для peerType: 'contacts', потому что там идут сначала контакты - потом неконтакты, а должно всё сортироваться по имени\n\nexport default class AppSelectPeers {\n public container = document.createElement('div');\n public list = appDialogsManager.createChatList(/* {\n handheldsSize: 66,\n avatarSize: 48\n } */);\n private chatsContainer = document.createElement('div');\n public scrollable: Scrollable;\n private selectedScrollable: Scrollable;\n\n private selectedContainer: HTMLElement;\n public input: HTMLInputElement;\n\n // public selected: {[peerId: PeerId]: HTMLElement} = {};\n public selected = new Set();\n\n public freezed = false;\n\n private folderId = 0;\n private offsetIndex = 0;\n private promise: Promise;\n\n private query = '';\n private cachedContacts: PeerId[];\n\n private loadedWhat: Partial<{[k in 'dialogs' | 'archived' | 'contacts' | 'channelParticipants']: true}> = {};\n\n private renderedPeerIds: Set = new Set();\n\n private appendTo: HTMLElement;\n private onChange: (length: number) => void;\n private peerType: SelectSearchPeerType[] = ['dialogs'];\n private renderResultsFunc: (peerIds: PeerId[]) => void | Promise;\n private chatRightsAction: ChatRights;\n private multiSelect = true;\n private rippleEnabled = true;\n private avatarSize: DialogElementSize = 'abitbigger';\n private exceptSelf = false;\n private filterPeerTypeBy: IsPeerType[];\n\n private tempIds: {[k in keyof AppSelectPeers['loadedWhat']]: number} = {};\n private peerId: PeerId;\n\n private placeholder: LangPackKey;\n\n private selfPresence: LangPackKey = 'Presence.YourChat';\n\n private needSwitchList = false;\n\n private sectionNameLangPackKey: LangPackKey;\n\n private managers: AppManagers;\n\n private design: 'round' | 'square' = 'round';\n\n constructor(options: {\n appendTo: AppSelectPeers['appendTo'],\n onChange?: AppSelectPeers['onChange'],\n peerType?: AppSelectPeers['peerType'],\n peerId?: AppSelectPeers['peerId'],\n onFirstRender?: () => void,\n renderResultsFunc?: AppSelectPeers['renderResultsFunc'],\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\n multiSelect?: AppSelectPeers['multiSelect'],\n rippleEnabled?: AppSelectPeers['rippleEnabled'],\n avatarSize?: AppSelectPeers['avatarSize'],\n placeholder?: AppSelectPeers['placeholder'],\n selfPresence?: AppSelectPeers['selfPresence'],\n exceptSelf?: AppSelectPeers['exceptSelf'],\n filterPeerTypeBy?: AppSelectPeers['filterPeerTypeBy'],\n sectionNameLangPackKey?: AppSelectPeers['sectionNameLangPackKey'],\n managers: AppSelectPeers['managers'],\n design?: AppSelectPeers['design']\n }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector', 'selector-' + this.design);\n\n const f = (this.renderResultsFunc || this.renderResults).bind(this);\n this.renderResultsFunc = async(peerIds) => {\n if(this.needSwitchList) {\n this.scrollable.splitUp.replaceWith(this.list);\n this.scrollable.setVirtualContainer(this.list);\n this.needSwitchList = false;\n }\n\n peerIds = peerIds.filter((peerId) => {\n const notRendered = !this.renderedPeerIds.has(peerId);\n if(notRendered) this.renderedPeerIds.add(peerId);\n return notRendered;\n });\n\n if(this.filterPeerTypeBy) {\n peerIds = await filterAsync(peerIds, async(peerId) => {\n if(peerId.isPeerId()) {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(peer) {\n for(const method of this.filterPeerTypeBy) {\n if(await this.managers.appPeersManager[method](peerId)) {\n return true;\n }\n }\n }\n }\n\n return true;\n });\n }\n\n return f(peerIds);\n };\n\n this.input = document.createElement('input');\n this.input.classList.add('selector-search-input');\n if(this.placeholder) {\n _i18n(this.input, this.placeholder, undefined, 'placeholder');\n } else {\n _i18n(this.input, 'SendMessageTo', undefined, 'placeholder');\n }\n\n this.input.type = 'text';\n\n if(this.multiSelect) {\n const section = new SettingSection({});\n section.innerContainer.classList.add('selector-search-section');\n const topContainer = document.createElement('div');\n topContainer.classList.add('selector-search-container');\n\n this.selectedContainer = document.createElement('div');\n this.selectedContainer.classList.add('selector-search');\n\n this.selectedContainer.append(this.input);\n topContainer.append(this.selectedContainer);\n this.selectedScrollable = new Scrollable(topContainer);\n\n // let delimiter = document.createElement('hr');\n\n attachClickEvent(this.selectedContainer, (e) => {\n if(this.freezed) return;\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'selector-user');\n\n if(!target) return;\n\n const peerId = target.dataset.key;\n const li = this.chatsContainer.querySelector('[data-peer-id=\"' + peerId + '\"]') as HTMLElement;\n if(!li) {\n this.remove(peerId.toPeerId());\n } else {\n simulateClickEvent(li);\n }\n });\n\n section.content.append(topContainer);\n this.container.append(section.container/* , delimiter */);\n }\n\n this.chatsContainer.classList.add('chatlist-container');\n // this.chatsContainer.append(this.list);\n const section = new SettingSection({\n name: this.sectionNameLangPackKey,\n noShadow: true\n });\n section.content.append(this.list);\n this.chatsContainer.append(section.container);\n this.scrollable = new Scrollable(this.chatsContainer);\n this.scrollable.setVirtualContainer(this.list);\n\n attachClickEvent(this.chatsContainer, (e) => {\n const target = findUpAttribute(e.target, 'data-peer-id') as HTMLElement;\n cancelEvent(e);\n\n if(!target) return;\n if(this.freezed) return;\n\n let key: PeerId | string = target.dataset.peerId;\n key = key.isPeerId() ? key.toPeerId() : key;\n\n if(!this.multiSelect) {\n this.add(key);\n return;\n }\n\n // target.classList.toggle('active');\n if(this.selected.has(key)) {\n this.remove(key);\n } else {\n this.add(key);\n }\n\n const checkbox = target.querySelector('input') as HTMLInputElement;\n checkbox.checked = !checkbox.checked;\n });\n\n const debouncedInput = debounce(this.onInput, 200, false, true);\n this.input.addEventListener('input', debouncedInput);\n\n this.scrollable.onScrolledBottom = () => {\n this.getMoreResults();\n };\n\n this.scrollable.container.prepend(generateDelimiter());\n\n this.container.append(this.chatsContainer);\n this.appendTo.append(this.container);\n\n // WARNING TIMEOUT\n setTimeout(() => {\n const getResultsPromise = this.getMoreResults() as Promise;\n if(options.onFirstRender) {\n getResultsPromise.then(() => {\n options.onFirstRender();\n });\n }\n }, 0);\n }\n\n private onInput = () => {\n const value = this.input.value;\n if(this.query !== value) {\n if(this.peerType.includes('contacts') || this.peerType.includes('dialogs')) {\n this.cachedContacts = undefined;\n }\n\n if(this.peerType.includes('dialogs')) {\n this.folderId = 0;\n this.offsetIndex = 0;\n }\n\n for(const i in this.tempIds) {\n // @ts-ignore\n ++this.tempIds[i];\n }\n\n this.list = appDialogsManager.createChatList();\n\n this.promise = undefined;\n this.loadedWhat = {};\n this.query = value;\n this.renderedPeerIds.clear();\n this.needSwitchList = true;\n\n // console.log('selectPeers input:', this.query);\n this.getMoreResults();\n }\n };\n\n private async renderSaved() {\n if(\n !this.exceptSelf &&\n !this.offsetIndex &&\n this.folderId === 0 &&\n this.peerType.includes('dialogs') &&\n (!this.query || await this.managers.appUsersManager.testSelfSearch(this.query))\n ) {\n await this.renderResultsFunc([rootScope.myId]);\n }\n }\n\n private getTempId(type: keyof AppSelectPeers['tempIds']) {\n this.tempIds[type] ??= 0;\n const tempId = ++this.tempIds[type];\n return {\n tempId,\n middleware: () => this.tempIds[type] === tempId\n };\n }\n\n private async getMoreDialogs(): Promise {\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n\n // в десктопе - сначала без группы, потом архивные, потом контакты без сообщений\n const pageCount = windowSize.height / 56 * 1.25 | 0;\n\n const {middleware} = this.getTempId('dialogs');\n const promise = this.managers.dialogsStorage.getDialogs({\n query: this.query,\n offsetIndex: this.offsetIndex,\n limit: pageCount,\n filterId: this.folderId,\n skipMigrated: true\n });\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat[this.loadedWhat.dialogs ? 'archived' : 'dialogs'] = true;\n });\n\n const value = await promise;\n if(!middleware()) {\n return;\n }\n\n let dialogs = value.dialogs as Dialog[];\n if(dialogs.length) {\n const newOffsetIndex = getDialogIndex(dialogs[dialogs.length - 1]) || 0;\n\n dialogs = dialogs.slice();\n findAndSplice(dialogs, d => d.peerId === rootScope.myId); // no my account\n\n if(this.chatRightsAction) {\n dialogs = await filterAsync(dialogs, (d) => this.filterByRights(d.peerId));\n if(!middleware()) {\n return;\n }\n }\n\n await this.renderSaved();\n if(!middleware()) {\n return;\n }\n\n this.offsetIndex = newOffsetIndex;\n }\n\n this.renderResultsFunc(dialogs.map((dialog) => dialog.peerId));\n\n if(value.isEnd) {\n if(!this.loadedWhat.dialogs) {\n await this.renderSaved();\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.dialogs = true;\n this.offsetIndex = 0;\n this.folderId = 1;\n\n return this.getMoreDialogs();\n } else {\n this.loadedWhat.archived = true;\n\n if(!this.loadedWhat.contacts/* && this.peerType.includes('contacts') */) {\n return this.getMoreContacts();\n }\n }\n }\n }\n\n private async filterByRights(peerId: PeerId) {\n const peer: User | Chat = await this.managers.appPeersManager.getPeer(peerId);\n if(peerId.isUser()) {\n return this.chatRightsAction !== 'send_messages' || canSendToUser(peer as User.user);\n } else if(hasRights(peer as Chat.chat, this.chatRightsAction)) {\n return true;\n }\n }\n\n private async getMoreContacts() {\n if(this.loadedWhat.contacts) {\n return;\n }\n\n const isGlobalSearch = this.peerType.includes('contacts');\n\n if(!this.cachedContacts) {\n /* const promises: Promise[] = [appUsersManager.getContacts(this.query)];\n if(!this.peerType.includes('dialogs')) {\n promises.push(appMessagesManager.getConversationsAll());\n }\n\n this.promise = Promise.all(promises);\n this.cachedContacts = (await this.promise)[0].slice(); */\n const {middleware} = this.getTempId('contacts');\n const promise = Promise.all([\n isGlobalSearch ? this.managers.appUsersManager.getContactsPeerIds(this.query) : [],\n this.query ? this.managers.appUsersManager.searchContacts(this.query) : undefined\n ]);\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.contacts = true;\n });\n\n const [cachedContacts, searchResult] = await promise;\n if(!middleware()) {\n return;\n }\n\n if(searchResult) {\n // do not add global result if only dialogs needed\n let resultPeerIds = isGlobalSearch ? searchResult.my_results.concat(searchResult.results) : searchResult.my_results;\n\n if(this.chatRightsAction) {\n resultPeerIds = await filterAsync(resultPeerIds, (peerId) => this.filterByRights(peerId));\n if(!middleware()) {\n return;\n }\n }\n\n if(!this.peerType.includes('dialogs')) {\n resultPeerIds = resultPeerIds.filter((peerId) => peerId.isUser());\n }\n\n this.cachedContacts = filterUnique(cachedContacts.concat(resultPeerIds));\n } else this.cachedContacts = cachedContacts.slice();\n\n indexOfAndSplice(this.cachedContacts, rootScope.myId); // no my account\n }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.height / 56 * 1.25 | 0;\n const arr = this.cachedContacts.splice(0, pageCount);\n this.renderResultsFunc(arr);\n // }\n\n if(!this.cachedContacts.length) {\n this.loadedWhat.contacts = true;\n\n // need to load non-contacts\n /* if(!this.peerType.includes('dialogs')) {\n return this.getMoreDialogs();\n } */\n }\n }\n\n private async getMoreChannelParticipants() {\n if(this.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const {middleware} = this.getTempId('channelParticipants');\n const promise = this.managers.appProfileManager.getChannelParticipants(\n this.peerId.toChatId(),\n {\n _: 'channelParticipantsSearch',\n q: this.query\n },\n pageCount,\n this.list.childElementCount\n );\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.channelParticipants = true;\n });\n\n const participants = await promise;\n if(!middleware()) {\n return;\n }\n\n const peerIds = participants.participants.map((participant) => {\n return getParticipantPeerId(participant);\n });\n indexOfAndSplice(peerIds, rootScope.myId);\n this.renderResultsFunc(peerIds);\n\n if(this.list.childElementCount >= participants.count || participants.participants.length < pageCount) {\n this.loadedWhat.channelParticipants = true;\n }\n }\n\n checkForTriggers = () => {\n this.scrollable.checkForTriggers();\n };\n\n private getMoreResults() {\n if(this.promise) {\n return this.promise;\n }\n\n const get = () => {\n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n return this.getMoreSomething('dialogs');\n }\n\n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n return this.getMoreSomething('contacts');\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n return this.getMoreSomething('channelParticipants');\n }\n };\n\n const loadPromise = get();\n if(!loadPromise) {\n return Promise.resolve();\n }\n\n const promise = this.promise = loadPromise.catch((err) => {\n console.error('get more result error', err);\n }).finally(() => {\n if(this.promise === promise) {\n this.promise = undefined;\n }\n\n this.checkForTriggers();\n });\n\n return promise;\n }\n\n private getMoreSomething(peerType: SelectSearchPeerType) {\n const map: {[type in SelectSearchPeerType]: () => Promise} = {\n dialogs: this.getMoreDialogs,\n contacts: this.getMoreContacts,\n channelParticipants: this.getMoreChannelParticipants\n };\n\n const promise = map[peerType].call(this);\n return promise;\n }\n\n private async renderResults(peerIds: PeerId[]) {\n // console.log('will renderResults:', peerIds);\n\n // оставим только неконтакты с диалогов\n if(!this.peerType.includes('dialogs') && this.loadedWhat.contacts) {\n peerIds = await filterAsync(peerIds, (peerId) => {\n return this.managers.appUsersManager.isNonContactUser(peerId);\n });\n }\n\n peerIds.forEach(async(peerId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.scrollable,\n rippleEnabled: this.rippleEnabled,\n avatarSize: this.avatarSize\n });\n\n if(this.multiSelect) {\n const selected = this.selected.has(peerId);\n const checkboxField = new CheckboxField();\n\n if(selected) {\n // dom.listEl.classList.add('active');\n checkboxField.input.checked = true;\n }\n\n dom.containerEl.prepend(checkboxField.label);\n }\n\n let subtitleEl: HTMLElement;\n if(peerId.isAnyChat()) {\n subtitleEl = await getChatMembersString(peerId.toChatId());\n } else if(peerId === rootScope.myId) {\n subtitleEl = i18n(this.selfPresence);\n } else {\n subtitleEl = getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId()));\n }\n\n dom.lastMessageSpan.append(subtitleEl);\n });\n }\n\n public add(key: PeerId | string, title?: string | HTMLElement, scroll = true) {\n // console.trace('add');\n this.selected.add(key);\n\n if(!this.multiSelect) {\n this.onChange(this.selected.size);\n return;\n }\n\n if(this.query.trim()) {\n this.input.value = '';\n this.onInput();\n }\n\n const div = document.createElement('div');\n div.classList.add('selector-user', 'scale-in');\n\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-32');\n avatarEl.isDialog = true;\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n const peerTitle = new PeerTitle();\n peerTitle.update({peerId: key.toPeerId(), dialog: true});\n title = peerTitle.element;\n }\n\n avatarEl.updateWithOptions({\n peerId: key as PeerId\n });\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n this.selectedContainer.insertBefore(div, this.input);\n // this.selectedScrollable.scrollTop = this.selectedScrollable.scrollHeight;\n this.onChange?.(this.selected.size);\n\n if(scroll) {\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input,\n position: 'center'\n });\n }\n\n return div;\n }\n\n public remove(key: PeerId | string) {\n if(!this.multiSelect) return;\n // const div = this.selected[peerId];\n const div = this.selectedContainer.querySelector(`[data-key=\"${key}\"]`) as HTMLElement;\n div.classList.remove('scale-in');\n void div.offsetWidth;\n div.classList.add('scale-out');\n\n const onAnimationEnd = () => {\n this.selected.delete(key);\n div.remove();\n this.onChange && this.onChange(this.selected.size);\n };\n\n if(rootScope.settings.animationsEnabled) {\n div.addEventListener('animationend', onAnimationEnd, {once: true});\n } else {\n onAnimationEnd();\n }\n }\n\n public getSelected() {\n return [...this.selected];\n }\n\n public addInitial(values: any[]) {\n values.forEach((value) => {\n this.add(value, undefined, false);\n });\n\n window.requestAnimationFrame(() => { // ! not the best place for this raf though it works\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input,\n position: 'center',\n forceDirection: FocusDirection.Static\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport ProgressivePreloader from './preloader';\nimport appMediaPlaybackController, {MediaItem, MediaSearchContext} from './appMediaPlaybackController';\nimport {DocumentAttribute, Message} from '../layer';\nimport mediaSizes from '../helpers/mediaSizes';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport rootScope from '../lib/rootScope';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport LazyLoadQueue from './lazyLoadQueue';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport ListenerSetter, {Listener} from '../helpers/listenerSetter';\nimport noop from '../helpers/noop';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport {joinElementsWith} from '../lib/langPack';\nimport {MiddleEllipsisElement} from './middleEllipsis';\nimport {formatFullSentTime} from '../helpers/date';\nimport throttleWithRaf from '../helpers/schedulers/throttleWithRaf';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport formatBytes from '../helpers/formatBytes';\nimport {animateSingle} from '../helpers/animation';\nimport clamp from '../helpers/number/clamp';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport MediaProgressLine from './mediaProgressLine';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport wrapSenderToPeer from './wrappers/senderToPeer';\nimport wrapSentTime from './wrappers/sentTime';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport wrapPhoto from './wrappers/photo';\n\nrootScope.addEventListener('messages_media_read', ({mids, peerId}) => {\n mids.forEach((mid) => {\n const attr = `[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`;\n (Array.from(document.querySelectorAll(`audio-element.is-unread${attr}, .media-round.is-unread${attr}`)) as AudioElement[]).forEach((elem) => {\n elem.classList.remove('is-unread');\n });\n });\n});\n\n// https://github.com/LonamiWebs/Telethon/blob/4393ec0b83d511b6a20d8a20334138730f084375/telethon/utils.py#L1285\nexport function decodeWaveform(waveform: Uint8Array | number[]) {\n if(!(waveform instanceof Uint8Array)) {\n waveform = new Uint8Array(waveform);\n }\n\n const bitCount = waveform.length * 8;\n const valueCount = bitCount / 5 | 0;\n if(!valueCount) {\n return new Uint8Array([]);\n }\n\n let result: Uint8Array;\n try {\n const dataView = new DataView(waveform.buffer);\n result = new Uint8Array(valueCount);\n for(let i = 0; i < valueCount; i++) {\n const byteIndex = i * 5 / 8 | 0;\n const bitShift = i * 5 % 8;\n const value = dataView.getUint16(byteIndex, true);\n result[i] = (value >> bitShift) & 0b00011111;\n }\n } catch(err) {\n result = new Uint8Array([]);\n }\n\n /* var byteIndex = (valueCount - 1) / 8 | 0;\n var bitShift = (valueCount - 1) % 8;\n if(byteIndex === waveform.length - 1) {\n var value = waveform[byteIndex];\n } else {\n var value = dataView.getUint16(byteIndex, true);\n }\n console.log('decoded waveform, setting last value:', value, byteIndex, bitShift);\n result[valueCount - 1] = (value >> bitShift) & 0b00011111; */\n return result;\n}\n\nfunction createWaveformBars(waveform: Uint8Array, duration: number) {\n const barWidth = 2;\n const barMargin = 2; // mediaSizes.isMobile ? 2 : 1;\n const barHeightMin = 4; // mediaSizes.isMobile ? 3 : 2;\n const barHeightMax = mediaSizes.isMobile ? 16 : 23;\n // const availW = 150; //mediaSizes.isMobile ? 152 : 190;\n\n const minW = mediaSizes.isMobile ? 152 : 190;\n const maxW = mediaSizes.isMobile ? 190 : 256;\n const availW = clamp(duration / 60 * maxW, minW, maxW); // mediaSizes.isMobile ? 152 : 224;\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.classList.add('audio-waveform-bars');\n svg.setAttributeNS(null, 'width', '' + availW);\n svg.setAttributeNS(null, 'height', '' + barHeightMax);\n svg.setAttributeNS(null, 'viewBox', `0 0 ${availW} ${barHeightMax}`);\n\n // console.log('decoded waveform:', waveform);\n\n const normValue = Math.max(...waveform);\n const wfSize = waveform.length ? waveform.length : 100;\n const barCount = Math.min((availW / (barWidth + barMargin)) | 0, wfSize);\n\n let maxValue = 0;\n const maxDelta = barHeightMax - barHeightMin;\n\n let html = '';\n for(let i = 0, barX = 0, sumI = 0; i < wfSize; ++i) {\n const value = waveform[i] || 0;\n if((sumI + barCount) >= wfSize) { // draw bar\n sumI = sumI + barCount - wfSize;\n if(sumI < (barCount + 1) / 2) {\n if(maxValue < value) maxValue = value;\n }\n\n const bar_value = Math.max(((maxValue * maxDelta) + ((normValue + 1) / 2)) / (normValue + 1), barHeightMin);\n\n const h = `\n \n `;\n html += h;\n\n barX += barWidth + barMargin;\n\n if(sumI < (barCount + 1) / 2) {\n maxValue = 0;\n } else {\n maxValue = value;\n }\n } else {\n if(maxValue < value) maxValue = value;\n\n sumI += barCount;\n }\n }\n\n const container = document.createElement('div');\n container.classList.add('audio-waveform');\n container.append(svg);\n\n svg.insertAdjacentHTML('beforeend', html);\n return {svg, container, availW};\n}\n\nasync function wrapVoiceMessage(audioEl: AudioElement) {\n audioEl.classList.add('is-voice');\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n if(message.pFlags.out) {\n audioEl.classList.add('is-out');\n }\n\n let waveform = (doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio).waveform || new Uint8Array([]);\n waveform = decodeWaveform(waveform.slice(0, 63));\n\n const {svg, container: svgContainer, availW} = createWaveformBars(waveform, doc.duration);\n\n const fakeSvgContainer = svgContainer.cloneNode(true) as HTMLElement;\n fakeSvgContainer.classList.add('audio-waveform-fake');\n svgContainer.classList.add('audio-waveform-background');\n\n const waveformContainer = document.createElement('div');\n waveformContainer.classList.add('audio-waveform-container');\n waveformContainer.append(svgContainer, fakeSvgContainer);\n\n const timeDiv = document.createElement('div');\n timeDiv.classList.add('audio-time');\n audioEl.append(waveformContainer, timeDiv);\n\n let progress = svg as any as HTMLElement;\n\n const onLoad = () => {\n let audio = audioEl.audio;\n\n const setAnimation = () => {\n animateSingle(() => {\n if(!audio) return false;\n onTimeUpdate();\n return !audio.paused;\n }, audioEl);\n };\n\n const onTimeUpdate = () => {\n fakeSvgContainer.style.width = (audio.currentTime / audio.duration * 100) + '%';\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onTimeUpdate();\n }\n\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\n audioEl.addAudioListener('timeupdate', throttledTimeUpdate);\n audioEl.addAudioListener('ended', throttledTimeUpdate);\n audioEl.addAudioListener('play', setAnimation);\n\n audioEl.readyPromise.then(() => {\n let mousedown = false, mousemove = false;\n progress.addEventListener('mouseleave', (e) => {\n if(mousedown) {\n audio.play();\n mousedown = false;\n }\n mousemove = false;\n });\n progress.addEventListener('mousemove', (e) => {\n mousemove = true;\n if(mousedown) scrub(e);\n });\n progress.addEventListener('mousedown', (e) => {\n e.preventDefault();\n if(e.button !== 0) return;\n if(!audio.paused) {\n audio.pause();\n }\n\n scrub(e);\n mousedown = true;\n });\n progress.addEventListener('mouseup', (e) => {\n if(mousemove && mousedown) {\n audio.play();\n mousedown = false;\n }\n });\n attachClickEvent(progress, (e) => {\n cancelEvent(e);\n if(!audio.paused) scrub(e);\n });\n\n function scrub(e: MouseEvent | TouchEvent) {\n let offsetX: number;\n if(e instanceof MouseEvent) {\n offsetX = e.offsetX;\n } else { // touch\n const rect = (e.target as HTMLElement).getBoundingClientRect();\n offsetX = e.targetTouches[0].pageX - rect.left;\n }\n\n const scrubTime = offsetX / availW /* width */ * audio.duration;\n audio.currentTime = scrubTime;\n }\n }, noop);\n\n return () => {\n progress.remove();\n progress = null;\n audio = null;\n };\n };\n\n return onLoad;\n}\n\nasync function wrapAudio(audioEl: AudioElement) {\n const withTime = audioEl.withTime;\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('audio-description');\n\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n\n if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(audioAttribute?.performer) {\n parts.push(wrapEmojiText(audioAttribute.performer));\n }\n\n if(withTime) {\n parts.push(formatFullSentTime(message.date));\n } else if(!parts.length) {\n parts.push(formatBytes(doc.size));\n }\n\n if(audioEl.showSender) {\n parts.push(await wrapSenderToPeer(message));\n }\n\n descriptionEl.append(...joinElementsWith(parts, ' • '));\n }\n\n const html = `\n
\n
\n
\n
`;\n audioEl.insertAdjacentHTML('beforeend', html);\n\n const titleEl = audioEl.querySelector('.audio-title') as HTMLElement;\n\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = audioEl.dataset.fontWeight;\n middleEllipsisEl.dataset.fontSize = audioEl.dataset.fontSize;\n middleEllipsisEl.dataset.sizeType = audioEl.dataset.sizeType;\n if(isVoice) {\n middleEllipsisEl.append(await wrapSenderToPeer(message));\n } else {\n setInnerHTML(middleEllipsisEl, wrapEmojiText(audioAttribute?.title ?? doc.file_name));\n }\n\n titleEl.append(middleEllipsisEl);\n\n if(audioEl.showSender) {\n titleEl.append(wrapSentTime(message));\n }\n\n const subtitleDiv = audioEl.querySelector('.audio-subtitle') as HTMLDivElement;\n subtitleDiv.append(descriptionEl);\n\n const onLoad = () => {\n let launched = false;\n\n let progressLine = new MediaProgressLine(audioEl.audio, doc.supportsStreaming);\n\n audioEl.addAudioListener('ended', () => {\n audioEl.classList.remove('audio-show-progress');\n // Reset subtitle\n subtitleDiv.lastChild.replaceWith(descriptionEl);\n launched = false;\n });\n\n const onPlay = () => {\n if(!launched) {\n audioEl.classList.add('audio-show-progress');\n launched = true;\n\n if(progressLine) {\n subtitleDiv.lastChild.replaceWith(progressLine.container);\n }\n }\n };\n\n audioEl.addAudioListener('play', onPlay);\n\n if(!audioEl.audio.paused || audioEl.audio.currentTime > 0) {\n onPlay();\n }\n\n return () => {\n progressLine.removeListeners();\n progressLine.container.remove();\n progressLine = null;\n };\n };\n\n return onLoad;\n}\n\nfunction constructDownloadPreloader(tryAgainOnFail = true) {\n const preloader = new ProgressivePreloader({cancelable: true, tryAgainOnFail});\n preloader.construct();\n\n if(!tryAgainOnFail) {\n preloader.circle.setAttributeNS(null, 'r', '23');\n preloader.totalLength = 143.58203125;\n }\n\n return preloader;\n}\n\nexport const findMediaTargets = (anchor: HTMLElement, anchorMid: number/* , useSearch: boolean */) => {\n let prev: MediaItem[], next: MediaItem[];\n // if(anchor.classList.contains('search-super-item') || !useSearch) {\n const isBubbles = !anchor.classList.contains('search-super-item');\n const container = findUpClassName(anchor, !isBubbles ? 'tabs-tab' : 'bubbles-inner');\n if(container) {\n const attr = `:not([data-is-outgoing=\"1\"])`;\n const justAudioSelector = `.audio:not(.is-voice)${attr}`;\n let selectors: string[];\n if(!anchor.matches(justAudioSelector)) {\n selectors = [`.audio.is-voice${attr}`, `.media-round${attr}`];\n } else {\n selectors = [justAudioSelector];\n }\n\n if(isBubbles) {\n const prefix = '.bubble:not(.webpage) ';\n selectors = selectors.map((s) => prefix + s);\n }\n\n const selector = selectors.join(', ');\n\n const elements = Array.from(container.querySelectorAll(selector)) as HTMLElement[];\n const idx = elements.indexOf(anchor);\n\n const mediaItems: MediaItem[] = elements.map((element) => ({peerId: element.dataset.peerId.toPeerId(), mid: +element.dataset.mid}));\n\n prev = mediaItems.slice(0, idx);\n next = mediaItems.slice(idx + 1);\n }\n // }\n\n if((next.length && next[0].mid < anchorMid) || (prev.length && prev[prev.length - 1].mid > anchorMid)) {\n [prev, next] = [next.reverse(), prev.reverse()];\n }\n\n // prev = next = undefined;\n\n return [prev, next];\n};\n\nexport default class AudioElement extends HTMLElement {\n public audio: HTMLAudioElement;\n public preloader: ProgressivePreloader;\n public message: Message.message;\n public withTime = false;\n public voiceAsMusic = false;\n public searchContext: MediaSearchContext;\n public showSender = false;\n public noAutoDownload: boolean;\n public lazyLoadQueue: LazyLoadQueue;\n public loadPromises: Promise[];\n public managers: AppManagers;\n\n private listenerSetter = new ListenerSetter();\n private onTypeDisconnect: () => void;\n public onLoad: (autoload?: boolean) => void;\n public readyPromise: CancellablePromise;\n\n public async render() {\n this.classList.add('audio');\n this.managers = rootScope.managers;\n\n this.dataset.mid = '' + this.message.mid;\n this.dataset.peerId = '' + this.message.peerId;\n\n const doc = getMediaFromMessage(this.message) as MyDocument;\n const isRealVoice = doc.type === 'voice';\n const isVoice = !this.voiceAsMusic && isRealVoice;\n const isOutgoing = this.message.pFlags.is_outgoing;\n const uploadingFileName = this.message?.uploadingFileName;\n\n const durationStr = toHHMMSS(doc.duration | 0);\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n
`;\n\n const toggle = this.firstElementChild as HTMLElement;\n\n const downloadDiv = document.createElement('div');\n downloadDiv.classList.add('audio-download');\n\n const isUnread = doc.type !== 'audio' && this.message && this.message.pFlags.media_unread;\n if(isUnread) {\n this.classList.add('is-unread');\n }\n\n if(uploadingFileName) {\n this.classList.add('is-outgoing');\n this.append(downloadDiv);\n }\n\n const onTypeLoad = await (isVoice ? wrapVoiceMessage(this) : wrapAudio(this));\n\n const audioTimeDiv = this.querySelector('.audio-time') as HTMLDivElement;\n audioTimeDiv.innerHTML = durationStr;\n\n const onLoad = this.onLoad = (autoload: boolean) => {\n this.onLoad = undefined;\n\n const audio = this.audio = appMediaPlaybackController.addMedia(this.message, autoload);\n\n const readyPromise = this.readyPromise = deferredPromise();\n if(this.audio.readyState >= this.audio.HAVE_CURRENT_DATA) readyPromise.resolve();\n else {\n this.addAudioListener('canplay', () => readyPromise.resolve(), {once: true});\n }\n\n this.onTypeDisconnect = onTypeLoad();\n\n const getTimeStr = () => toHHMMSS(audio.currentTime | 0) + (isVoice ? (' / ' + durationStr) : '');\n\n const onPlay = () => {\n audioTimeDiv.innerText = getTimeStr();\n toggle.classList.toggle('playing', !audio.paused);\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onPlay();\n }\n\n const togglePlay = (e?: Event, paused = audio.paused) => {\n e && cancelEvent(e);\n\n if(paused) {\n const hadSearchContext = !!this.searchContext;\n if(appMediaPlaybackController.setSearchContext(this.searchContext || {\n peerId: NULL_PEER_ID,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(this, this.message.mid/* , this.searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: this.message.peerId, mid: this.message.mid}, prev, next);\n }\n\n audio.play().catch(() => {});\n } else {\n audio.pause();\n }\n };\n\n attachClickEvent(toggle, (e) => togglePlay(e), {listenerSetter: this.listenerSetter});\n\n this.addAudioListener('ended', () => {\n toggle.classList.remove('playing');\n audioTimeDiv.innerText = durationStr;\n });\n\n this.addAudioListener('timeupdate', () => {\n if((!audio.currentTime && audio.paused) || appMediaPlaybackController.isSafariBuffering(audio)) return;\n audioTimeDiv.innerText = getTimeStr();\n });\n\n this.addAudioListener('pause', () => {\n toggle.classList.remove('playing');\n });\n\n this.addAudioListener('play', onPlay);\n\n return togglePlay;\n };\n\n if(doc.thumbs?.length) {\n const imgs: HTMLElement[] = [];\n const wrapped = await wrapPhoto({\n photo: doc,\n message: null,\n container: toggle,\n boxWidth: 48,\n boxHeight: 48,\n loadPromises: this.loadPromises,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue\n });\n toggle.style.width = toggle.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n\n this.classList.add('audio-with-thumb');\n imgs.forEach((img) => img.classList.add('audio-thumb'));\n }\n\n if(!isOutgoing) {\n let preloader: ProgressivePreloader = this.preloader;\n\n const autoDownload = doc.type !== 'audio'/* || !this.noAutoDownload */;\n onLoad(autoDownload);\n\n const r = (shouldPlay: boolean) => {\n if(this.audio.src) {\n return;\n }\n\n appMediaPlaybackController.resolveWaitingForLoadMedia(this.message.peerId, this.message.mid, this.message.pFlags.is_scheduled);\n\n const onDownloadInit = () => {\n if(shouldPlay) {\n appMediaPlaybackController.willBePlayed(this.audio); // prepare for loading audio\n\n if(IS_SAFARI && !this.audio.autoplay) {\n this.audio.autoplay = true;\n }\n }\n };\n\n onDownloadInit();\n\n if(!preloader) {\n if(doc.supportsStreaming) {\n this.classList.add('corner-download');\n\n let pauseListener: Listener;\n const onPlay = () => {\n const preloader = constructDownloadPreloader(false);\n const deferred = deferredPromise();\n deferred.notifyAll({done: 75, total: 100});\n deferred.catch(() => {\n this.audio.pause();\n appMediaPlaybackController.willBePlayed(undefined);\n });\n deferred.cancel = () => {\n deferred.cancel = noop;\n const err = new Error();\n (err as any).type = 'CANCELED';\n deferred.reject(err);\n };\n preloader.attach(downloadDiv, false, deferred);\n\n pauseListener = this.addAudioListener('pause', () => {\n deferred.cancel();\n }, {once: true}) as any;\n\n onDownloadInit();\n };\n\n /* if(!this.audio.paused) {\n onPlay();\n } */\n\n const playListener: any = this.addAudioListener('play', onPlay);\n this.readyPromise.then(() => {\n this.listenerSetter.remove(playListener);\n this.listenerSetter.remove(pauseListener);\n });\n } else {\n preloader = constructDownloadPreloader();\n\n if(!shouldPlay) {\n this.readyPromise = deferredPromise();\n }\n\n const load = () => {\n onDownloadInit();\n\n const download = appDownloadManager.downloadMediaURL({media: doc});\n\n if(!shouldPlay) {\n download.then(() => {\n this.readyPromise.resolve();\n });\n }\n\n preloader.attach(downloadDiv, false, download);\n return {download};\n };\n\n preloader.setDownloadFunction(load);\n load();\n }\n }\n\n if(this.classList.contains('corner-download')) {\n toggle.append(downloadDiv);\n } else {\n this.append(downloadDiv);\n }\n\n this.classList.add('downloading');\n\n this.readyPromise.then(() => {\n this.classList.remove('downloading');\n downloadDiv.classList.add('downloaded');\n setTimeout(() => {\n downloadDiv.remove();\n }, 200);\n\n // setTimeout(() => {\n // release loaded audio\n if(appMediaPlaybackController.willBePlayedMedia === this.audio) {\n this.audio.play();\n appMediaPlaybackController.willBePlayed(undefined);\n }\n // }, 10e3);\n });\n };\n\n if(!this.audio?.src) {\n if(autoDownload) {\n r(false);\n } else {\n attachClickEvent(toggle, () => {\n r(true);\n }, {once: true, capture: true, passive: false, listenerSetter: this.listenerSetter});\n }\n }\n } else if(uploadingFileName) {\n this.preloader = constructDownloadPreloader(false);\n this.preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\n this.dataset.isOutgoing = '1';\n this.preloader.attach(downloadDiv, false);\n // onLoad();\n }\n }\n\n get addAudioListener() {\n return this.listenerSetter.add(this.audio);\n }\n\n disconnectedCallback() {\n setTimeout(() => {\n if(this.isConnected) {\n return;\n }\n\n if(this.onTypeDisconnect) {\n this.onTypeDisconnect();\n this.onTypeDisconnect = null;\n }\n\n if(this.readyPromise) {\n this.readyPromise.reject();\n }\n\n if(this.listenerSetter) {\n this.listenerSetter.removeAll();\n this.listenerSetter = null;\n }\n\n if(this.preloader) {\n this.preloader = null;\n }\n }, 100);\n }\n}\n\ncustomElements.define('audio-element', AudioElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Photo} from '../layer';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport ListLoader, {ListLoaderOptions} from './listLoader';\n\nexport default class AvatarListLoader extends ListLoader {\n private peerId: PeerId;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {peerId: PeerId, managers: AppManagers}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n if(this.peerId.isAnyChat() || !older) return Promise.resolve({count: 0, items: []}); // ! это значит, что открыло аватар чата, но следующих фотографий нет.\n\n const maxId = anchor?.photoId;\n return this.managers.appPhotosManager.getUserPhotos(this.peerId, maxId, loadCount).then((value) => {\n const items = value.photos.map((photoId) => {\n return {element: null as HTMLElement, photoId} as any;\n });\n\n return {count: value.count, items};\n });\n }\n });\n\n this.loadedAllUp = true;\n this.peerId = options.peerId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarListLoader from '../helpers/avatarListLoader';\nimport {Photo} from '../layer';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport rootScope from '../lib/rootScope';\nimport AppMediaViewerBase from './appMediaViewerBase';\n\ntype AppMediaViewerAvatarTargetType = {element: HTMLElement, photoId: Photo.photo['id']};\nexport default class AppMediaViewerAvatar extends AppMediaViewerBase<'', 'delete', AppMediaViewerAvatarTargetType> {\n public peerId: PeerId;\n\n constructor(peerId: PeerId) {\n super(new AvatarListLoader({peerId, managers: rootScope.managers}), [/* 'delete' */]);\n\n this.peerId = peerId;\n\n this.setBtnMenuToggle([{\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }/* , {\n icon: 'delete danger btn-disabled',\n text: 'Delete',\n onClick: () => {}\n } */]);\n\n // * constructing html end\n\n this.setListeners();\n }\n\n onPrevClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, 1);\n };\n\n onDownloadClick = async() => {\n appDownloadManager.downloadToDisc({\n media: await this.managers.appPhotosManager.getPhoto(this.target.photoId),\n queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId\n });\n };\n\n public async openMedia(photoId: Photo.photo['id'], target?: HTMLElement, fromRight = 0, prevTargets?: AppMediaViewerAvatarTargetType[], nextTargets?: AppMediaViewerAvatarTargetType[]) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const photo = await this.managers.appPhotosManager.getPhoto(photoId);\n const ret = super._openMedia(photo, photo.date, this.peerId, fromRight, target, false, prevTargets, nextTargets);\n this.target.photoId = photo.id;\n\n return ret;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport {Message, Photo} from '../layer';\nimport type LazyLoadQueue from './lazyLoadQueue';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport AppMediaViewer from './appMediaViewer';\nimport AppMediaViewerAvatar from './appMediaViewerAvatar';\nimport isObject from '../helpers/object/isObject';\nimport {ArgumentTypes} from '../types';\nimport putPhoto from './putPhoto';\nimport {recordPromise} from '../helpers/recordPromise';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\n\nconst onAvatarUpdate = ({peerId, threadId}: {peerId: PeerId, threadId?: number}) => {\n let query = 'avatar-element[data-peer-id=\"' + peerId + '\"]';\n if(threadId) {\n query += '[data-thread-id=\"' + threadId + '\"]';\n }\n\n (Array.from(document.querySelectorAll(query)) as AvatarElement[]).forEach((elem) => {\n // console.log('updating avatar:', elem);\n elem.update();\n });\n};\n\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\nrootScope.addEventListener('peer_title_edit', async(data) => {\n if(!(await rootScope.managers.appAvatarsManager.isAvatarCached(data.peerId))) {\n onAvatarUpdate(data);\n }\n});\n\nexport async function openAvatarViewer(\n target: HTMLElement,\n peerId: PeerId,\n middleware: () => boolean,\n message?: any,\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[],\n nextTargets?: typeof prevTargets\n) {\n let photo = await rootScope.managers.appProfileManager.getFullPhoto(peerId);\n if(!middleware() || !photo) {\n return;\n }\n\n const getTarget = () => {\n const good = Array.from(target.querySelectorAll('img')).find((img) => !img.classList.contains('emoji'));\n return good ? target : null;\n };\n\n if(peerId.isAnyChat()) {\n const hadMessage = !!message;\n const inputFilter = 'inputMessagesFilterChatPhotos';\n if(!message) {\n message = await rootScope.managers.appMessagesManager.getSearch({\n peerId,\n inputFilter: {_: inputFilter},\n maxId: 0,\n limit: 1\n }).then((value) => {\n // console.log(lol);\n // ! by descend\n return value.history[0];\n });\n\n if(!middleware()) {\n return;\n }\n }\n\n if(message) {\n // ! гений в деле, костылируем (но это гениально)\n const messagePhoto = message.action.photo;\n if(messagePhoto.id !== photo.id) {\n if(!hadMessage) {\n message = rootScope.managers.appMessagesManager.generateFakeAvatarMessage(peerId, photo);\n } else {\n\n }\n }\n\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\n element: el.element,\n mid: (el.item as Message.messageService).mid,\n peerId: (el.item as Message.messageService).peerId\n }));\n\n new AppMediaViewer()\n .setSearchContext({\n peerId,\n inputFilter: {_: inputFilter}\n })\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\n\n return;\n }\n }\n\n if(photo) {\n if(!isObject(message) && message) {\n photo = await rootScope.managers.appPhotosManager.getPhoto(message);\n }\n\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\n element: el.element,\n photoId: el.item as string\n }));\n\n new AppMediaViewerAvatar(peerId).openMedia(\n photo.id,\n getTarget(),\n undefined,\n prevTargets ? f(prevTargets) : undefined,\n nextTargets ? f(nextTargets) : undefined\n );\n }\n}\n\nconst believeMe: Map> = new Map();\nconst seen: Set = new Set();\n\nfunction getAvatarQueueKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n}\n\nexport default class AvatarElement extends HTMLElement {\n public peerId: PeerId;\n public isDialog: boolean;\n public peerTitle: string;\n public loadPromises: Promise[];\n public lazyLoadQueue: LazyLoadQueue;\n public isBig: boolean;\n public threadId: number;\n private addedToQueue = false;\n public wrapOptions: WrapSomethingOptions;\n\n public middlewareHelper: MiddlewareHelper;\n\n constructor() {\n super();\n this.classList.add('avatar-like');\n this.middlewareHelper = getMiddleware();\n }\n\n disconnectedCallback() {\n // браузер вызывает этот метод при удалении элемента из документа\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n const set = believeMe.get(key);\n if(set?.has(this)) {\n set.delete(this);\n if(!set.size) {\n believeMe.delete(key);\n }\n }\n\n this.lazyLoadQueue?.delete({div: this});\n }\n\n public attachClickEvent() {\n let loading = false;\n attachClickEvent(this, async(e) => {\n cancelEvent(e);\n if(loading) return;\n const peerId = this.peerId;\n loading = true;\n await openAvatarViewer(this, this.peerId, () => this.peerId === peerId);\n loading = false;\n });\n }\n\n public updateOptions(options: Partial[0]>) {\n for(const i in options) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n public updateWithOptions(options: {\n peerId: PeerId,\n threadId?: number,\n isDialog?: boolean,\n isBig?: boolean,\n peerTitle?: string,\n lazyLoadQueue?: LazyLoadQueue | false,\n loadPromises?: Promise[],\n wrapOptions?: WrapSomethingOptions\n }) {\n const wasPeerId = this.peerId;\n const wasThreadId = this.threadId;\n this.updateOptions(options);\n const newPeerId = this.peerId;\n const threadId = this.threadId;\n\n if(wasPeerId === newPeerId && wasThreadId === threadId) {\n return;\n }\n\n this.dataset.peerId = '' + newPeerId;\n\n if(threadId) {\n this.dataset.threadId = '' + threadId;\n } else if(wasThreadId) {\n delete this.dataset.threadId;\n }\n\n if(wasPeerId) {\n const key = getAvatarQueueKey(wasPeerId, wasThreadId);\n const set = believeMe.get(key);\n if(set) {\n set.delete(this);\n if(!set.size) {\n believeMe.delete(key);\n }\n }\n }\n\n const middleware = options.wrapOptions?.middleware;\n this.middlewareHelper.destroy();\n if(middleware) {\n this.middlewareHelper = middleware.create();\n } else {\n this.middlewareHelper.destroy();\n }\n\n return this.update();\n }\n\n public remove() {\n this.middlewareHelper.destroy();\n super.remove();\n }\n\n private r(onlyThumb = false) {\n const promise = putPhoto({\n div: this,\n peerId: this.peerId,\n isDialog: this.isDialog,\n title: this.peerTitle,\n onlyThumb,\n isBig: this.isBig,\n threadId: this.threadId,\n wrapOptions: {\n middleware: this.middlewareHelper.get(),\n ...(this.wrapOptions || {})\n }\n });\n // recordPromise(promise, 'avatar putPhoto-' + this.peerId);\n\n if(this.loadPromises) {\n this.loadPromises.push(promise);\n\n promise.finally(() => {\n this.loadPromises = undefined;\n });\n }\n\n return promise;\n }\n\n public update() {\n if(this.lazyLoadQueue) {\n if(!seen.has(this.peerId)) {\n if(this.addedToQueue) return;\n this.addedToQueue = true;\n\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n let set = believeMe.get(key);\n if(!set) {\n believeMe.set(key, set = new Set());\n }\n\n set.add(this);\n\n this.lazyLoadQueue.push({\n div: this,\n load: () => {\n seen.add(this.peerId);\n return this.update();\n }\n });\n\n return this.r(true);\n } else if(this.addedToQueue) {\n this.lazyLoadQueue.delete({div: this});\n }\n }\n\n seen.add(this.peerId);\n\n const promise = this.r();\n\n if(this.addedToQueue) {\n promise.finally(() => {\n this.addedToQueue = false;\n });\n }\n\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n const set = believeMe.get(key);\n if(set) {\n set.delete(this);\n const arr = Array.from(set);\n believeMe.delete(key);\n\n for(let i = 0, length = arr.length; i < length; ++i) {\n arr[i].update();\n }\n }\n\n return promise;\n }\n}\n\ncustomElements.define('avatar-element', AvatarElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {CancellablePromise} from '../helpers/cancellablePromise';\nimport type {InputFile} from '../layer';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport PopupElement from './popups';\nimport PopupAvatar from './popups/avatar';\n\nexport default class AvatarEdit {\n public container: HTMLElement;\n private canvas: HTMLCanvasElement;\n private icon: HTMLSpanElement;\n\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void, options?: ConstructorParameters[0]) {\n this.container = document.createElement('div');\n this.container.classList.add('avatar-edit');\n\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('avatar-edit-canvas');\n\n this.icon = document.createElement('span');\n this.icon.classList.add('tgico', 'tgico-cameraadd');\n\n this.container.append(this.canvas, this.icon);\n\n attachClickEvent(this.container, () => {\n PopupElement.createPopup(PopupAvatar, options).open(this.canvas, onChange);\n });\n }\n\n public clear() {\n const ctx = this.canvas.getContext('2d');\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport ripple from './ripple';\n\nexport type ButtonOptions = Partial<{\n noRipple: true,\n onlyMobile: true,\n icon: string,\n rippleSquare: true,\n text: LangPackKey,\n disabled: boolean,\n asDiv: boolean,\n asLink: boolean\n}>;\n\nexport default function Button(className: string, options: T = {} as T): T['asLink'] extends true ? HTMLAnchorElement : HTMLButtonElement {\n const button = document.createElement(options.asLink ? 'a' : (options.asDiv ? 'div' : 'button'));\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\n\n if(!options.noRipple) {\n if(options.rippleSquare) {\n button.classList.add('rp-square');\n }\n\n ripple(button);\n }\n\n if(options.onlyMobile) {\n button.classList.add('only-handhelds');\n }\n\n if(options.disabled) {\n button.setAttribute('disabled', 'true');\n }\n\n if(options.text) {\n button.append(i18n(options.text));\n }\n\n return button as any;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Button from './button';\n\nconst ButtonCorner = (options: Partial<{className: string, icon: string, noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\n const button = Button('btn-circle btn-corner z-depth-1' + (options.className ? ' ' + options.className : ''), options);\n return button;\n};\n\nexport default ButtonCorner;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Button from './button';\n\nconst ButtonIcon = (className?: string, options: Partial<{noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\n const button = Button('btn-icon', {\n icon: className || undefined,\n ...options\n });\n\n return button;\n};\n\nexport default ButtonIcon;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport flatten from '../helpers/array/flatten';\nimport contextMenuController from '../helpers/contextMenuController';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {AttachClickOptions, attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\nimport CheckboxField from './checkboxField';\nimport {Document} from '../layer';\nimport wrapPhoto from './wrappers/photo';\nimport textToSvgURL from '../helpers/textToSvgURL';\nimport customProperties from '../helpers/dom/customProperties';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport ripple from './ripple';\n\nexport type ButtonMenuItemOptions = {\n icon?: string,\n iconDoc?: Document.document,\n text?: LangPackKey,\n textArgs?: FormatterArguments,\n regularText?: Parameters[1],\n onClick: (e: MouseEvent | TouchEvent) => any,\n checkForClose?: () => boolean,\n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean,\n separator?: boolean | HTMLElement,\n multiline?: boolean,\n loadPromise?: Promise,\n waitForAnimation?: boolean\n /* , cancelEvent?: true */\n};\n\nexport type ButtonMenuItemOptionsVerifiable = ButtonMenuItemOptions & {\n verify?: () => boolean | Promise\n};\n\nfunction ButtonMenuItem(options: ButtonMenuItemOptions) {\n if(options.element) return [options.separator as HTMLElement, options.element].filter(Boolean);\n\n const {icon, iconDoc, text, onClick, checkboxField, noCheckboxClickListener} = options;\n const el = document.createElement('div');\n el.className = 'btn-menu-item rp-overflow' + (icon ? ' tgico-' + icon : '');\n\n if(IS_MOBILE) {\n ripple(el);\n }\n\n let textElement = options.textElement;\n if(!textElement) {\n textElement = options.textElement = text ? i18n(text, options.textArgs) : document.createElement('span');\n if(options.regularText) {\n setInnerHTML(textElement, options.regularText);\n }\n }\n\n if(iconDoc) {\n const iconElement = document.createElement('span');\n iconElement.classList.add('btn-menu-item-icon');\n el.append(iconElement);\n\n options.loadPromise = wrapPhoto({\n container: iconElement,\n photo: iconDoc,\n boxWidth: 24,\n boxHeight: 24,\n withoutPreloader: true,\n noFadeIn: true,\n noBlur: true,\n processUrl: (url) => {\n return fetch(url)\n .then((response) => response.text())\n .then((text) => {\n const color = customProperties.getProperty('primary-text-color');\n const doc = new DOMParser().parseFromString(text, 'image/svg+xml');\n const svg = doc.firstElementChild as HTMLElement;\n svg.querySelectorAll('path').forEach((path) => {\n path.setAttributeNS(null, 'fill', color);\n path.style.stroke = color;\n path.style.strokeWidth = '.25px';\n });\n return textToSvgURL(svg.outerHTML);\n });\n }\n }).then((ret) => ret.loadPromises.thumb);\n }\n\n textElement.classList.add('btn-menu-item-text');\n el.append(textElement);\n\n const keepOpen = !!checkboxField || !!options.keepOpen;\n\n // * cancel mobile keyboard close\n onClick && attachClickEvent(el, /* CLICK_EVENT_NAME !== 'click' || keepOpen ? */ /* async */(e) => {\n cancelEvent(e);\n\n const menu = findUpClassName(e.target, 'btn-menu');\n if(menu && !menu.classList.contains('active')) {\n return;\n }\n\n // let closed = false;\n // if(!keepOpen && !options.checkForClose) {\n // closed = true;\n // contextMenuController.close();\n // }\n\n // wait for closing animation\n // if(options.waitForAnimation && rootScope.settings.animationsEnabled && !options.checkForClose) {\n // await pause(125);\n // }\n\n onClick(e);\n if(options.checkForClose?.() === false) {\n return;\n }\n\n if(!keepOpen/* && !closed */) {\n contextMenuController.close();\n }\n\n if(checkboxField && !noCheckboxClickListener/* && result !== false */) {\n checkboxField.checked = checkboxField.input.type === 'radio' ? true : !checkboxField.checked;\n }\n }/* : onClick */, options.options);\n\n if(checkboxField) {\n el.append(checkboxField.label);\n }\n\n if(options.separator === true) {\n options.separator = document.createElement('hr');\n }\n\n if(options.multiline) {\n el.classList.add('is-multiline');\n }\n\n return [options.separator as HTMLElement, options.element = el].filter(Boolean);\n}\n\nexport function ButtonMenuSync({listenerSetter, buttons}: {\n buttons: ButtonMenuItemOptions[],\n listenerSetter?: ListenerSetter\n}) {\n const el: HTMLElement = document.createElement('div');\n el.classList.add('btn-menu');\n\n if(listenerSetter) {\n buttons.forEach((b) => {\n if(b.options) {\n b.options.listenerSetter = listenerSetter;\n } else {\n b.options = {listenerSetter};\n }\n });\n }\n\n const items = buttons.map(ButtonMenuItem);\n el.append(...flatten(items));\n\n return el;\n}\n\nexport default async function ButtonMenu(options: Parameters[0]) {\n const el = ButtonMenuSync(options);\n await Promise.all(options.buttons.map(({loadPromise}) => loadPromise));\n return el;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport contextMenuController from '../helpers/contextMenuController';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {AttachClickOptions, CLICK_EVENT_NAME} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ButtonIcon from './buttonIcon';\nimport ButtonMenu, {ButtonMenuItemOptionsVerifiable} from './buttonMenu';\nimport filterAsync from '../helpers/array/filterAsync';\nimport {doubleRaf} from '../helpers/schedulers';\n\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\nexport function ButtonMenuToggleHandler({\n el,\n onOpen,\n options,\n onClose\n}: {\n el: HTMLElement,\n onOpen?: (e: Event) => any,\n options?: AttachClickOptions,\n onClose?: () => void\n}) {\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\n\n add(CLICK_EVENT_NAME, (e: Event) => {\n if(!el.classList.contains('btn-menu-toggle')) return false;\n\n cancelEvent(e);\n\n if(el.classList.contains('menu-open')) {\n contextMenuController.close();\n } else {\n const result = onOpen?.(e);\n const open = () => {\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\n contextMenuController.openBtnMenu(openedMenu, onClose);\n };\n\n if(result instanceof Promise) {\n result.then(open);\n } else {\n open();\n }\n }\n });\n}\n\nexport default function ButtonMenuToggle({\n buttonOptions,\n listenerSetter: attachListenerSetter,\n container,\n direction,\n buttons,\n onOpenBefore,\n onOpen,\n onClose,\n onCloseAfter\n}: {\n buttonOptions?: Parameters[1],\n listenerSetter?: ListenerSetter,\n container?: HTMLElement\n direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right',\n buttons: ButtonMenuItemOptionsVerifiable[],\n onOpenBefore?: (e: Event) => any,\n onOpen?: (e: Event, element: HTMLElement) => any,\n onClose?: () => void,\n onCloseAfter?: () => void\n}) {\n if(buttonOptions) {\n buttonOptions.asDiv = true;\n }\n\n const button = container ?? ButtonIcon('more', buttonOptions);\n button.classList.add('btn-menu-toggle');\n\n const listenerSetter = new ListenerSetter();\n\n let element: HTMLElement, closeTimeout: number;\n ButtonMenuToggleHandler({\n el: button,\n onOpen: async(e) => {\n await onOpenBefore?.(e);\n if(closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n return;\n }\n\n const f = (b: (typeof buttons[0])[]) => filterAsync(b, (button) => button?.verify?.() ?? true);\n\n const filteredButtons = await f(buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const _element = element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter\n });\n _element.classList.add(direction);\n\n await onOpen?.(e, _element);\n\n button.append(_element);\n await doubleRaf();\n },\n options: {\n listenerSetter: attachListenerSetter\n },\n onClose: () => {\n onClose?.();\n\n closeTimeout = window.setTimeout(() => {\n onCloseAfter?.();\n closeTimeout = undefined;\n listenerSetter.removeAll();\n buttons.forEach((button) => button.element = undefined);\n element.remove();\n }, 300);\n }\n });\n\n return button;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko, Artem Kolnogorov and unknown creator of the script taken from http://useless.altervista.org/gradient.html\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {animateSingle} from '../../helpers/animation';\nimport {hexToRgb} from '../../helpers/color';\nimport {easeOutQuadApply} from '../../helpers/easing/easeOutQuad';\n\nconst WIDTH = 50;\nconst HEIGHT = WIDTH;\n\nexport default class ChatBackgroundGradientRenderer {\n private readonly _width = WIDTH;\n private readonly _height = HEIGHT;\n private _phase: number;\n private _tail: number;\n private readonly _tails = 90;\n private readonly _scrollTails = 50;\n private _frames: ImageData[];\n private _colors: {r: number, g: number, b: number}[];\n private readonly _curve = [\n 0, 0.25, 0.50, 0.75, 1, 1.5, 2, 2.5, 3, 3.5, 4, 5, 6, 7, 8, 9, 10, 11, 12,\n 13, 14, 15, 16, 17, 18, 18.3, 18.6, 18.9, 19.2, 19.5, 19.8, 20.1, 20.4, 20.7,\n 21.0, 21.3, 21.6, 21.9, 22.2, 22.5, 22.8, 23.1, 23.4, 23.7, 24.0, 24.3, 24.6,\n 24.9, 25.2, 25.5, 25.8, 26.1, 26.3, 26.4, 26.5, 26.6, 26.7, 26.8, 26.9, 27\n ];\n private readonly _incrementalCurve: number[];\n private readonly _positions = [\n {x: 0.80, y: 0.10},\n {x: 0.60, y: 0.20},\n {x: 0.35, y: 0.25},\n {x: 0.25, y: 0.60},\n {x: 0.20, y: 0.90},\n {x: 0.40, y: 0.80},\n {x: 0.65, y: 0.75},\n {x: 0.75, y: 0.40}\n ];\n private readonly _phases = this._positions.length;\n private _onWheelRAF: number;\n private _scrollDelta: number;\n\n // private _ts = 0;\n // private _fps = 15;\n // private _frametime = 1000 / this._fps;\n // private _raf: number;\n\n private _canvas: HTMLCanvasElement;\n private _ctx: CanvasRenderingContext2D;\n private _hc: HTMLCanvasElement;\n private _hctx: CanvasRenderingContext2D;\n\n private _addedScrollListener: boolean;\n private _animatingToNextPosition: boolean;\n private _nextPositionTail: number;\n private _nextPositionTails: number;\n private _nextPositionLeft: number;\n\n constructor() {\n const diff = this._tails / this._curve[this._curve.length - 1];\n\n for(let i = 0, length = this._curve.length; i < length; ++i) {\n this._curve[i] = this._curve[i] * diff;\n }\n\n this._incrementalCurve = this._curve.map((v, i, arr) => {\n return v - (arr[i - 1] ?? 0);\n });\n }\n\n private hexToRgb(hex: string) {\n const result = hexToRgb(hex);\n return {r: result[0], g: result[1], b: result[2]};\n }\n\n private getPositions(shift: number) {\n const positions = this._positions.slice();\n positions.push(...positions.splice(0, shift));\n\n const result: typeof positions = [];\n for(let i = 0; i < positions.length; i += 2) {\n result.push(positions[i]);\n }\n return result;\n }\n\n private getNextPositions(phase: number, curveMax: number, curve: number[]) {\n const pos = this.getPositions(phase);\n if(!curve[0] && curve.length === 1) {\n return [pos];\n }\n\n const nextPos = this.getPositions(++phase % this._phases);\n const distances = nextPos.map((nextPos, idx) => {\n return {\n x: (nextPos.x - pos[idx].x) / curveMax,\n y: (nextPos.y - pos[idx].y) / curveMax\n };\n });\n\n const positions = curve.map((value) => {\n return distances.map((distance, idx) => {\n return {\n x: pos[idx].x + distance.x * value,\n y: pos[idx].y + distance.y * value\n };\n });\n });\n\n return positions;\n }\n\n private curPosition(phase: number, tail: number) {\n const positions = this.getNextPositions(phase, this._tails, [tail]);\n return positions[0];\n }\n\n private changeTail(diff: number) {\n this._tail += diff;\n\n while(this._tail >= this._tails) {\n this._tail -= this._tails;\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n while(this._tail < 0) {\n this._tail += this._tails;\n if(--this._phase < 0) {\n this._phase += this._phases;\n }\n }\n }\n\n private onWheel = (e: {deltaY: number}) => {\n if(this._animatingToNextPosition) {\n return;\n }\n\n this._scrollDelta += e.deltaY;\n if(this._onWheelRAF === undefined) {\n this._onWheelRAF = requestAnimationFrame(this.drawOnWheel);\n }\n };\n\n private changeTailAndDraw(diff: number) {\n this.changeTail(diff);\n const curPos = this.curPosition(this._phase, this._tail);\n this.drawGradient(curPos);\n }\n\n private drawOnWheel = () => {\n const value = this._scrollDelta / this._scrollTails;\n this._scrollDelta %= this._scrollTails;\n const diff = value > 0 ? Math.floor(value) : Math.ceil(value);\n if(diff) {\n this.changeTailAndDraw(diff);\n }\n this._onWheelRAF = undefined;\n };\n\n private drawNextPositionAnimated = (getProgress?: () => number) => {\n let done: boolean, id: ImageData;\n if(getProgress) {\n const value = getProgress();\n done = value >= 1;\n const transitionValue = easeOutQuadApply(value, 1);\n const nextPositionTail = this._nextPositionTail ?? 0;\n const tail = this._nextPositionTail = this._nextPositionTails * transitionValue;\n const diff = tail - nextPositionTail;\n if(diff) {\n this._nextPositionLeft -= diff;\n this.changeTailAndDraw(diff);\n }\n } else {\n const frames = this._frames;\n id = frames.shift();\n done = !frames.length;\n }\n\n if(id) {\n this.drawImageData(id);\n }\n\n if(done) {\n this._nextPositionLeft = undefined;\n this._nextPositionTails = undefined;\n this._nextPositionTail = undefined;\n this._animatingToNextPosition = undefined;\n }\n\n return !done;\n };\n\n private getGradientImageData(positions: {x: number, y: number}[]) {\n const id = this._hctx.createImageData(this._width, this._height);\n const pixels = id.data;\n\n let offset = 0;\n for(let y = 0; y < this._height; ++y) {\n const directPixelY = y / this._height;\n const centerDistanceY = directPixelY - 0.5;\n const centerDistanceY2 = centerDistanceY * centerDistanceY;\n\n for(let x = 0; x < this._width; ++x) {\n const directPixelX = x / this._width;\n\n const centerDistanceX = directPixelX - 0.5;\n const centerDistance = Math.sqrt(centerDistanceX * centerDistanceX + centerDistanceY2);\n\n const swirlFactor = 0.35 * centerDistance;\n const theta = swirlFactor * swirlFactor * 0.8 * 8.0;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n\n const pixelX = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * cosTheta - centerDistanceY * sinTheta));\n const pixelY = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * sinTheta + centerDistanceY * cosTheta));\n\n let distanceSum = 0.0;\n\n let r = 0.0;\n let g = 0.0;\n let b = 0.0;\n\n for(let i = 0; i < this._colors.length; i++) {\n const colorX = positions[i].x;\n const colorY = positions[i].y;\n\n const distanceX = pixelX - colorX;\n const distanceY = pixelY - colorY;\n\n let distance = Math.max(0.0, 0.9 - Math.sqrt(distanceX * distanceX + distanceY * distanceY));\n distance = distance * distance * distance * distance;\n distanceSum += distance;\n\n r += distance * this._colors[i].r / 255;\n g += distance * this._colors[i].g / 255;\n b += distance * this._colors[i].b / 255;\n }\n\n pixels[offset++] = r / distanceSum * 255.0;\n pixels[offset++] = g / distanceSum * 255.0;\n pixels[offset++] = b / distanceSum * 255.0;\n pixels[offset++] = 0xFF;\n }\n }\n return id;\n }\n\n private drawImageData(id: ImageData) {\n this._hctx.putImageData(id, 0, 0);\n this._ctx.drawImage(this._hc, 0, 0, this._width, this._height);\n }\n\n private drawGradient(positions: {x: number, y: number}[]) {\n this.drawImageData(this.getGradientImageData(positions));\n }\n\n // private doAnimate = () => {\n // const now = +Date.now();\n // if(!document.hasFocus() || (now - this._ts) < this._frametime) {\n // this._raf = requestAnimationFrame(this.doAnimate);\n // return;\n // }\n\n // this._ts = now;\n // this.changeTail(1);\n // const cur_pos = this.curPosition(this._phase, this._tail);\n // this.drawGradient(cur_pos);\n // this._raf = requestAnimationFrame(this.doAnimate);\n // };\n\n // public animate(start?: boolean) {\n // if(!start) {\n // cancelAnimationFrame(this._raf);\n // return;\n // }\n // this.doAnimate();\n // }\n\n public init(el: HTMLCanvasElement) {\n this._frames = [];\n this._phase = 0;\n this._tail = 0;\n this._scrollDelta = 0;\n if(this._onWheelRAF !== undefined) {\n cancelAnimationFrame(this._onWheelRAF);\n this._onWheelRAF = undefined;\n }\n\n const colors = el.getAttribute('data-colors').split(',').reverse();\n this._colors = colors.map((color) => {\n return this.hexToRgb(color);\n });\n\n if(!this._hc) {\n this._hc = document.createElement('canvas');\n this._hc.width = this._width;\n this._hc.height = this._height;\n this._hctx = this._hc.getContext('2d', {alpha: false});\n }\n\n this._canvas = el;\n this._ctx = this._canvas.getContext('2d', {alpha: false});\n this.update();\n }\n\n public update() {\n if(this._colors.length < 2) {\n const color = this._colors[0];\n this._ctx.fillStyle = `rgb(${color.r}, ${color.g}, ${color.b})`;\n this._ctx.fillRect(0, 0, this._width, this._height);\n return;\n }\n\n const pos = this.curPosition(this._phase, this._tail);\n this.drawGradient(pos);\n }\n\n public toNextPosition(getProgress?: () => number) {\n if(this._colors.length < 2) {\n return;\n }\n\n if(getProgress) {\n this._nextPositionLeft = this._tails + (this._nextPositionLeft ?? 0);\n this._nextPositionTails = this._nextPositionLeft;\n this._nextPositionTail = undefined;\n this._animatingToNextPosition = true;\n animateSingle(this.drawNextPositionAnimated.bind(this, getProgress), this);\n return;\n }\n\n const tail = this._tail;\n const tails = this._tails;\n\n let nextPhaseOnIdx: number;\n\n const curve: number[] = [];\n for(let i = 0, length = this._incrementalCurve.length; i < length; ++i) {\n const inc = this._incrementalCurve[i];\n let value = (curve[i - 1] ?? tail) + inc;\n\n if(+value.toFixed(2) > tails && nextPhaseOnIdx === undefined) {\n nextPhaseOnIdx = i;\n value %= tails;\n }\n\n curve.push(value);\n }\n\n const currentPhaseCurve = curve.slice(0, nextPhaseOnIdx);\n const nextPhaseCurve = nextPhaseOnIdx !== undefined ? curve.slice(nextPhaseOnIdx) : [];\n\n [currentPhaseCurve, nextPhaseCurve].forEach((curve, idx, curves) => {\n const last = curve[curve.length - 1];\n if(last !== undefined && last > tails) {\n curve[curve.length - 1] = +last.toFixed(2);\n }\n\n this._tail = last ?? 0;\n\n if(!curve.length) {\n return;\n }\n\n const positions = this.getNextPositions(this._phase, tails, curve);\n if(idx !== (curves.length - 1)) {\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n const ids = positions.map((pos) => {\n return this.getGradientImageData(pos);\n });\n\n this._frames.push(...ids);\n });\n\n this._animatingToNextPosition = true;\n animateSingle(this.drawNextPositionAnimated, this);\n }\n\n // public toNextPositionThrottled = throttle(this.toNextPosition.bind(this), 100, true);\n\n public scrollAnimate(start?: boolean) {\n return;\n\n if(this._colors.length < 2 && start) {\n return;\n }\n\n if(start && !this._addedScrollListener) {\n document.addEventListener('wheel', this.onWheel);\n this._addedScrollListener = true;\n } else if(!start && this._addedScrollListener) {\n document.removeEventListener('wheel', this.onWheel);\n this._addedScrollListener = false;\n }\n }\n\n public cleanup() {\n this.scrollAnimate(false);\n // this.animate(false);\n }\n\n public static createCanvas(colors?: string) {\n const canvas = document.createElement('canvas');\n canvas.width = WIDTH;\n canvas.height = HEIGHT;\n if(colors !== undefined) {\n canvas.dataset.colors = colors;\n }\n\n return canvas;\n }\n\n public static create(colors?: string) {\n const canvas = this.createCanvas(colors);\n const gradientRenderer = new ChatBackgroundGradientRenderer();\n gradientRenderer.init(canvas);\n\n return {gradientRenderer, canvas};\n }\n}\n","export default function easeOutQuad(t: number, b: number, c: number, d: number) {\n return t >= d ? b + c : easeOutQuadApply(t / d, c) + b;\n}\n\nexport function easeOutQuadApply(v: number, c: number) {\n return -c * v * (v - 2);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppMessagesManager, MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport type ChatBubbles from './bubbles';\nimport type ChatInput from './input';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport Button from '../button';\nimport ButtonIcon from '../buttonIcon';\nimport CheckboxField from '../checkboxField';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport PopupForward from '../popups/forward';\nimport SetTransition from '../singleTransition';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport PopupSendNow from '../popups/sendNow';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport I18n, {i18n, _i18n} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport cancelSelection from '../../helpers/dom/cancelSelection';\nimport getSelectedText from '../../helpers/dom/getSelectedText';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport AppSearchSuper from '../appSearchSuper.';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport {randomLong} from '../../helpers/random';\nimport {attachClickEvent, AttachClickOptions} from '../../helpers/dom/clickEvent';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport appImManager from '../../lib/appManagers/appImManager';\n\nconst accumulateMapSet = (map: Map>) => {\n return [...map.values()].reduce((acc, v) => acc + v.size, 0);\n};\n\n// const MIN_CLICK_MOVE = 32; // minimum bubble height\n\nclass AppSelection extends EventListenerBase<{\n toggle: (isSelecting: boolean) => void\n}> {\n public selectedMids: Map> = new Map();\n public isSelecting = false;\n\n public selectedText: string;\n\n protected listenerSetter: ListenerSetter;\n protected isScheduled: boolean;\n protected listenElement: HTMLElement;\n\n protected onToggleSelection: (forwards: boolean, animate: boolean) => void | Promise;\n protected onUpdateContainer: (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => void;\n protected onCancelSelection: () => void;\n protected toggleByMid: (peerId: PeerId, mid: number) => void;\n protected toggleByElement: (bubble: HTMLElement) => void;\n\n protected navigationType: NavigationItem['type'];\n\n protected getElementFromTarget: (target: HTMLElement) => HTMLElement;\n protected verifyTarget: (e: MouseEvent, target: HTMLElement) => boolean;\n protected verifyMouseMoveTarget: (e: MouseEvent, element: HTMLElement, selecting: boolean) => boolean;\n protected verifyTouchLongPress: () => boolean;\n protected targetLookupClassName: string;\n protected lookupBetweenParentClassName: string;\n protected lookupBetweenElementsQuery: string;\n\n protected doNotAnimate: boolean;\n protected managers: AppManagers;\n\n constructor(options: {\n managers: AppManagers,\n getElementFromTarget: AppSelection['getElementFromTarget'],\n verifyTarget?: AppSelection['verifyTarget'],\n verifyMouseMoveTarget?: AppSelection['verifyMouseMoveTarget'],\n verifyTouchLongPress?: AppSelection['verifyTouchLongPress'],\n targetLookupClassName: string,\n lookupBetweenParentClassName: string,\n lookupBetweenElementsQuery: string,\n isScheduled?: AppSelection['isScheduled']\n }) {\n super(false);\n\n safeAssign(this, options);\n\n this.navigationType = 'multiselect-' + randomLong() as any;\n }\n\n public attachListeners(listenElement: HTMLElement, listenerSetter: ListenerSetter) {\n if(this.listenElement) {\n this.listenerSetter.removeAll();\n }\n\n this.listenElement = listenElement;\n this.listenerSetter = listenerSetter;\n\n if(!listenElement) {\n return;\n }\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(listenElement)('touchend', () => {\n if(!this.isSelecting) return;\n this.selectedText = getSelectedText();\n });\n\n attachContextMenuListener({\n element: listenElement,\n callback: (e) => {\n if(this.isSelecting || (this.verifyTouchLongPress && !this.verifyTouchLongPress())) return;\n\n // * these two lines will fix instant text selection on iOS Safari\n document.body.classList.add('no-select'); // * need no-select on body because chat-input transforms in channels\n listenElement.addEventListener('touchend', (e) => {\n cancelEvent(e); // ! this one will fix propagation to document loader button, etc\n document.body.classList.remove('no-select');\n\n // this.chat.bubbles.onBubblesClick(e);\n }, {once: true, capture: true});\n\n cancelSelection();\n // cancelEvent(e as any);\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(element) {\n this.toggleByElement(element);\n }\n },\n listenerSetter\n });\n\n return;\n }\n\n listenerSetter.add(listenElement)('mousedown', this.onMouseDown);\n }\n\n private onMouseDown = (e: MouseEvent) => {\n // console.log('selection mousedown', e);\n const element = findUpClassName(e.target, this.targetLookupClassName);\n if(e.button !== 0) {\n return;\n }\n\n if(this.verifyTarget && !this.verifyTarget(e, element)) {\n return;\n }\n\n const seen: AppSelection['selectedMids'] = new Map();\n let selecting: boolean;\n\n /* let good = false;\n const {x, y} = e; */\n\n /* const bubbles = appImManager.bubbles;\n for(const mid in bubbles) {\n const bubble = bubbles[mid];\n bubble.addEventListener('mouseover', () => {\n console.log('mouseover');\n }, {once: true});\n } */\n\n let firstTarget = element;\n\n const processElement = (element: HTMLElement, checkBetween = true) => {\n const mid = +element.dataset.mid;\n if(!mid || !element.dataset.peerId) return;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!isInDOM(firstTarget)) {\n firstTarget = element;\n }\n\n let seenSet = seen.get(peerId);\n if(!seenSet) {\n seen.set(peerId, seenSet = new Set());\n }\n\n if(seenSet.has(mid)) {\n return;\n }\n\n const isSelected = this.isMidSelected(peerId, mid);\n if(selecting === undefined) {\n // bubblesContainer.classList.add('no-select');\n selecting = !isSelected;\n }\n\n seenSet.add(mid);\n\n if((selecting && !isSelected) || (!selecting && isSelected)) {\n const seenLength = accumulateMapSet(seen);\n if(this.toggleByElement && checkBetween) {\n if(seenLength < 2) {\n if(findUpAsChild(element, firstTarget)) {\n firstTarget = element;\n }\n }\n\n const elementsBetween = this.getElementsBetween(firstTarget, element);\n // console.log(elementsBetween);\n if(elementsBetween.length) {\n elementsBetween.forEach((element) => {\n processElement(element, false);\n });\n }\n }\n\n if(!this.selectedMids.size) {\n if(seenLength === 2 && this.toggleByMid) {\n for(const [peerId, mids] of seen) {\n for(const mid of mids) {\n this.toggleByMid(peerId, mid);\n }\n }\n }\n } else if(this.toggleByElement) {\n this.toggleByElement(element);\n }\n }\n };\n\n // const foundTargets: Map = new Map();\n let canceledSelection = false;\n const onMouseMove = (e: MouseEvent) => {\n if(!canceledSelection) {\n cancelSelection();\n canceledSelection = true;\n }\n /* if(!good) {\n if(Math.abs(e.x - x) > MIN_CLICK_MOVE || Math.abs(e.y - y) > MIN_CLICK_MOVE) {\n good = true;\n } else {\n return;\n }\n } */\n\n /* if(foundTargets.has(e.target as HTMLElement)) return;\n foundTargets.set(e.target as HTMLElement, true); */\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(!element) {\n // console.error('found no bubble', e);\n return;\n }\n\n if(this.verifyMouseMoveTarget && !this.verifyMouseMoveTarget(e, element, selecting)) {\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n this.listenerSetter.removeManual(document, 'mouseup', onMouseUp, documentListenerOptions);\n return;\n }\n\n processElement(element);\n };\n\n const onMouseUp = (e: MouseEvent) => {\n if(seen.size) {\n attachClickEvent(window, cancelEvent, {capture: true, once: true, passive: false});\n }\n\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n // bubblesContainer.classList.remove('no-select');\n\n // ! CANCEL USER SELECTION !\n cancelSelection();\n };\n\n const documentListenerOptions = {once: true};\n this.listenerSetter.add(this.listenElement)('mousemove', onMouseMove);\n this.listenerSetter.add(document)('mouseup', onMouseUp, documentListenerOptions);\n };\n\n private getElementsBetween = (first: HTMLElement, last: HTMLElement) => {\n if(first === last) {\n return [];\n }\n\n const firstRect = first.getBoundingClientRect();\n const lastRect = last.getBoundingClientRect();\n const difference = (firstRect.top - lastRect.top) || (firstRect.left - lastRect.left);\n const isHigher = difference < 0;\n\n const parent = findUpClassName(first, this.lookupBetweenParentClassName);\n if(!parent) {\n return [];\n }\n\n const elements = Array.from(parent.querySelectorAll(this.lookupBetweenElementsQuery)) as HTMLElement[];\n let firstIndex = elements.indexOf(first);\n let lastIndex = elements.indexOf(last);\n\n if(!isHigher) {\n [lastIndex, firstIndex] = [firstIndex, lastIndex];\n }\n\n const slice = elements.slice(firstIndex + 1, lastIndex);\n\n // console.log('getElementsBetween', first, last, slice, firstIndex, lastIndex, isHigher);\n\n return slice;\n };\n\n protected isElementShouldBeSelected(element: HTMLElement) {\n return this.isMidSelected(element.dataset.peerId.toPeerId(), +element.dataset.mid);\n }\n\n protected appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n element.prepend(checkboxField.label);\n }\n\n public toggleElementCheckbox(element: HTMLElement, show: boolean) {\n const hasCheckbox = !!this.getCheckboxInputFromElement(element);\n if(show) {\n if(hasCheckbox) {\n return false;\n }\n\n const checkboxField = new CheckboxField({\n name: element.dataset.mid,\n round: true\n });\n\n // * if it is a render of new message\n if(this.isSelecting) { // ! avoid breaking animation on start\n if(this.isElementShouldBeSelected(element)) {\n checkboxField.input.checked = true;\n element.classList.add('is-selected');\n }\n }\n\n this.appendCheckbox(element, checkboxField);\n } else if(hasCheckbox) {\n this.getCheckboxInputFromElement(element).parentElement.remove();\n SetTransition({\n element,\n className: 'is-selected',\n forwards: false,\n duration: 200\n });\n }\n\n return true;\n }\n\n protected getCheckboxInputFromElement(element: HTMLElement): HTMLInputElement {\n return element.firstElementChild?.tagName === 'LABEL' &&\n element.firstElementChild.firstElementChild as HTMLInputElement;\n }\n\n protected async updateContainer(forceSelection = false) {\n const size = this.selectedMids.size;\n if(!size && !forceSelection) return;\n\n let cantForward = !size,\n cantDelete = !size;\n const cantSend = !size;\n for(const [peerId, mids] of this.selectedMids) {\n const storageKey: MessagesStorageKey = `${peerId}_${this.isScheduled ? 'scheduled' : 'history'}`;\n const r = await this.managers.appMessagesManager.cantForwardDeleteMids(storageKey, Array.from(mids));\n cantForward = r.cantForward;\n cantDelete = r.cantDelete;\n\n if(cantForward && cantDelete) break;\n }\n\n this.onUpdateContainer?.(cantForward, cantDelete, cantSend);\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const wasSelecting = this.isSelecting;\n const size = this.selectedMids.size;\n this.isSelecting = !!size || forceSelection;\n\n if(wasSelecting === this.isSelecting) return false;\n\n this.dispatchEvent('toggle', this.isSelecting);\n\n // const bubblesContainer = this.bubbles.bubblesContainer;\n // bubblesContainer.classList.toggle('is-selecting', !!size);\n\n /* if(bubblesContainer.classList.contains('is-chat-input-hidden')) {\n const scrollable = this.appImManager.scrollable;\n if(scrollable.isScrolledDown) {\n scrollable.scrollTo(scrollable.scrollHeight, 'top', true, true, 200);\n }\n } */\n\n if(!IS_TOUCH_SUPPORTED) {\n this.listenElement.classList.toggle('no-select', this.isSelecting);\n\n if(wasSelecting) {\n // ! CANCEL USER SELECTION !\n cancelSelection();\n }\n }/* else {\n if(!wasSelecting) {\n bubblesContainer.classList.add('no-select');\n setTimeout(() => {\n cancelSelection();\n bubblesContainer.classList.remove('no-select');\n cancelSelection();\n }, 100);\n }\n } */\n\n blurActiveElement();\n\n const forwards = !!size || forceSelection;\n const toggleResult = this.onToggleSelection?.(forwards, !this.doNotAnimate);\n\n if(!IS_MOBILE_SAFARI) {\n if(forwards) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: () => {\n this.cancelSelection();\n }\n });\n } else {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n if(forceSelection) {\n (toggleResult || Promise.resolve()).then(() => this.updateContainer(forceSelection));\n }\n\n return true;\n }\n\n public cancelSelection = async(doNotAnimate?: boolean) => {\n if(doNotAnimate) this.doNotAnimate = true;\n this.onCancelSelection && await this.onCancelSelection();\n this.selectedMids.clear();\n this.toggleSelection();\n cancelSelection();\n if(doNotAnimate) this.doNotAnimate = undefined;\n };\n\n public cleanup() {\n this.doNotAnimate = true;\n this.selectedMids.clear();\n this.toggleSelection(false);\n this.doNotAnimate = undefined;\n }\n\n protected updateElementSelection(element: HTMLElement, isSelected: boolean) {\n this.toggleElementCheckbox(element, true);\n const input = this.getCheckboxInputFromElement(element);\n input.checked = isSelected;\n\n this.toggleSelection();\n this.updateContainer();\n SetTransition({\n element,\n className: 'is-selected',\n forwards: isSelected,\n duration: 200\n });\n }\n\n public isMidSelected(peerId: PeerId, mid: number) {\n const set = this.selectedMids.get(peerId);\n return set?.has(mid);\n }\n\n public length() {\n return accumulateMapSet(this.selectedMids);\n }\n\n protected toggleMid(peerId: PeerId, mid: number, unselect?: boolean) {\n let set = this.selectedMids.get(peerId);\n if(unselect || (unselect === undefined && set?.has(mid))) {\n if(set) {\n set.delete(mid);\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n }\n } else {\n // const diff = rootScope.config.forwarded_count_max - this.length() - 1;\n // if(diff < 0) {\n // toast(I18n.format('Chat.Selection.LimitToast', true));\n // return false;\n // /* const it = this.selectedMids.values();\n // do {\n // const mid = it.next().value;\n // const mounted = this.appImManager.getMountedBubble(mid);\n // if(mounted) {\n // this.toggleByBubble(mounted.bubble);\n // } else {\n // const mids = this.appMessagesManager.getMidsByMid(mid);\n // for(const mid of mids) {\n // this.selectedMids.delete(mid);\n // }\n // }\n // } while(this.selectedMids.size > MAX_SELECTION_LENGTH); */\n // }\n\n if(!set) {\n set = new Set();\n this.selectedMids.set(peerId, set);\n }\n\n set.add(mid);\n }\n\n return true;\n }\n\n /**\n * ! Call this method only to handle deleted messages\n */\n public deleteSelectedMids(peerId: PeerId, mids: number[]) {\n const set = this.selectedMids.get(peerId);\n if(!set) {\n return;\n }\n\n mids.forEach((mid) => {\n set.delete(mid);\n });\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n\n this.updateContainer();\n this.toggleSelection();\n }\n}\n\nexport class SearchSelection extends AppSelection {\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n public selectionGotoBtn: HTMLElement;\n\n private isPrivate: boolean;\n\n constructor(private searchSuper: AppSearchSuper, managers: AppManagers, listenerSetter: ListenerSetter) {\n super({\n managers,\n verifyTarget: (e, target) => !!target && this.isSelecting,\n getElementFromTarget: (target) => findUpClassName(target, 'search-super-item'),\n targetLookupClassName: 'search-super-item',\n lookupBetweenParentClassName: 'tabs-tab',\n lookupBetweenElementsQuery: '.search-super-item'\n });\n\n this.isPrivate = !searchSuper.showSender;\n this.attachListeners(searchSuper.container, listenerSetter);\n }\n\n /* public appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(element.classList.contains('document') || element.tagName === 'AUDIO-ELEMENT') {\n element.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n } */\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n const elements = Array.from(this.searchSuper.tabsContainer.querySelectorAll('.search-super-item')) as HTMLElement[];\n elements.forEach((element) => {\n this.toggleElementCheckbox(element, this.isSelecting);\n });\n }\n\n return ret;\n }\n\n public toggleByElement = (element: HTMLElement) => {\n const mid = +element.dataset.mid;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!this.toggleMid(peerId, mid)) {\n return;\n }\n\n this.updateElementSelection(element, this.isMidSelected(peerId, mid));\n };\n\n public toggleByMid = (peerId: PeerId, mid: number) => {\n const element = this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id=\"${peerId}\"][data-mid=\"${mid}\"]`) as HTMLElement;\n this.toggleByElement(element);\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n const length = this.length();\n replaceContent(this.selectionCountEl, i18n('messages', [length]));\n this.selectionGotoBtn.classList.toggle('hide', length !== 1);\n this.selectionForwardBtn.classList.toggle('hide', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.classList.toggle('hide', cantDelete);\n };\n\n protected onToggleSelection = (forwards: boolean, animate: boolean) => {\n SetTransition({\n element: this.searchSuper.navScrollableContainer,\n className: 'is-selecting',\n forwards,\n duration: animate ? 200 : 0,\n onTransitionEnd: () => {\n if(!this.isSelecting) {\n this.selectionContainer.remove();\n this.selectionContainer =\n this.selectionForwardBtn =\n this.selectionDeleteBtn =\n null;\n this.selectedText = undefined;\n }\n }\n });\n\n SetTransition({\n element: this.searchSuper.container,\n className: 'is-selecting',\n forwards,\n duration: 200\n });\n\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n const BASE_CLASS = 'search-super-selection';\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add(BASE_CLASS + '-container');\n\n const btnCancel = ButtonIcon(`close ${BASE_CLASS}-cancel`, {noRipple: true});\n attachClickEvent(btnCancel, () => this.cancelSelection(), {listenerSetter: this.listenerSetter, once: true});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add(BASE_CLASS + '-count');\n\n this.selectionGotoBtn = ButtonIcon(`message ${BASE_CLASS}-goto`);\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n attachClickEvent(this.selectionGotoBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n const mid = [...this.selectedMids.get(peerId)][0];\n this.cancelSelection();\n\n appImManager.setInnerPeer({peerId, lastMsgId: mid});\n }, attachClickOptions);\n\n this.selectionForwardBtn = ButtonIcon(`forward ${BASE_CLASS}-forward`);\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n if(this.isPrivate) {\n this.selectionDeleteBtn = ButtonIcon(`delete danger ${BASE_CLASS}-delete`);\n attachClickEvent(this.selectionDeleteBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n new PopupDeleteMessages(peerId, [...this.selectedMids.get(peerId)], 'chat', () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionContainer.append(...[\n btnCancel,\n this.selectionCountEl,\n this.selectionGotoBtn,\n this.selectionForwardBtn,\n this.selectionDeleteBtn\n ].filter(Boolean));\n\n const transitionElement = this.selectionContainer;\n transitionElement.style.opacity = '0';\n this.searchSuper.navScrollableContainer.append(transitionElement);\n\n void transitionElement.offsetLeft; // reflow\n transitionElement.style.opacity = '';\n }\n }\n };\n}\n\nexport default class ChatSelection extends AppSelection {\n protected selectionInputWrapper: HTMLElement;\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionSendNowBtn: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n private selectionLeft: HTMLDivElement;\n private selectionRight: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private bubbles: ChatBubbles,\n private input: ChatInput,\n managers: AppManagers\n ) {\n super({\n managers,\n getElementFromTarget: (target) => findUpClassName(target, 'grouped-item') || findUpClassName(target, 'bubble'),\n verifyTarget: (e, target) => {\n // LEFT BUTTON\n // проверка внизу нужна для того, чтобы не активировать селект если target потомок .bubble\n const bad = !this.selectedMids.size &&\n !(e.target as HTMLElement).classList.contains('bubble') &&\n !(e.target as HTMLElement).classList.contains('document-selection') &&\n target;\n\n return !bad;\n },\n verifyMouseMoveTarget: (e, element, selecting) => {\n const bad = e.target !== element &&\n !(e.target as HTMLElement).classList.contains('document-selection') &&\n selecting === undefined &&\n !this.selectedMids.size;\n return !bad;\n },\n verifyTouchLongPress: () => !this.chat.input.recording,\n targetLookupClassName: 'bubble',\n lookupBetweenParentClassName: 'bubbles-inner',\n lookupBetweenElementsQuery: '.bubble:not(.is-multiple-documents), .grouped-item',\n isScheduled: chat.type === 'scheduled'\n });\n }\n\n public appendCheckbox(bubble: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(bubble.classList.contains('document-container')) {\n bubble.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n for(const mid in this.bubbles.bubbles) {\n if(this.bubbles.skippedMids.has(+mid)) {\n continue;\n }\n\n const bubble = this.bubbles.bubbles[mid];\n this.toggleElementCheckbox(bubble, this.isSelecting);\n }\n }\n\n return ret;\n }\n\n public toggleElementCheckbox(bubble: HTMLElement, show: boolean) {\n if(!this.canSelectBubble(bubble)) return;\n\n const ret = super.toggleElementCheckbox(bubble, show);\n if(ret) {\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n this.bubbles.getBubbleGroupedItems(bubble).forEach((item) => this.toggleElementCheckbox(item, show));\n }\n }\n\n return ret;\n }\n\n public toggleByElement = (bubble: HTMLElement): Promise => {\n if(!this.canSelectBubble(bubble)) return;\n\n const mid = +bubble.dataset.mid;\n\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n if(!this.isGroupedBubbleSelected(bubble)) {\n const set = this.selectedMids.get(this.chat.peerId);\n if(set) {\n // const mids = await this.chat.getMidsByMid(mid);\n const mids = this.getMidsFromGroupContainer(bubble);\n mids.forEach((mid) => set.delete(mid));\n }\n }\n\n /* const promises = */this.bubbles.getBubbleGroupedItems(bubble).map(this.toggleByElement);\n // await Promise.all(promises);\n return;\n }\n\n if(!this.toggleMid(this.chat.peerId, mid)) {\n return;\n }\n\n const isGroupedItem = bubble.classList.contains('grouped-item');\n if(isGroupedItem) {\n const groupContainer = findUpClassName(bubble, 'bubble');\n const isGroupedSelected = this.isGroupedBubbleSelected(groupContainer);\n const isGroupedMidsSelected = this.isGroupedMidsSelected(groupContainer);\n\n const willChange = isGroupedMidsSelected || isGroupedSelected;\n if(willChange) {\n this.updateElementSelection(groupContainer, isGroupedMidsSelected);\n }\n }\n\n this.updateElementSelection(bubble, this.isMidSelected(this.chat.peerId, mid));\n };\n\n protected toggleByMid = async(peerId: PeerId, mid: number) => {\n const mounted = await this.bubbles.getMountedBubble(mid);\n if(mounted) {\n this.toggleByElement(mounted.bubble);\n }\n };\n\n public isElementShouldBeSelected(element: HTMLElement) {\n const isGrouped = element.classList.contains('is-grouped');\n return super.isElementShouldBeSelected(element) && (!isGrouped || this.isGroupedMidsSelected(element));\n }\n\n protected isGroupedBubbleSelected(bubble: HTMLElement) {\n const groupedCheckboxInput = this.getCheckboxInputFromElement(bubble);\n return groupedCheckboxInput?.checked;\n }\n\n protected getMidsFromGroupContainer(groupContainer: HTMLElement) {\n const elements = this.chat.bubbles.getBubbleGroupedItems(groupContainer);\n if(!elements.length) {\n elements.push(groupContainer);\n }\n\n return elements.map((element) => +element.dataset.mid);\n }\n\n protected isGroupedMidsSelected(groupContainer: HTMLElement) {\n const mids = this.getMidsFromGroupContainer(groupContainer);\n const selectedMids = mids.filter((mid) => this.isMidSelected(this.chat.peerId, mid));\n return mids.length === selectedMids.length;\n }\n\n protected getCheckboxInputFromElement(bubble: HTMLElement) {\n /* let perf = performance.now();\n let checkbox = bubble.firstElementChild.tagName === 'LABEL' && bubble.firstElementChild.firstElementChild as HTMLInputElement;\n console.log('getCheckboxInputFromBubble firstElementChild time:', performance.now() - perf);\n\n perf = performance.now();\n checkbox = bubble.querySelector('label input');\n console.log('getCheckboxInputFromBubble querySelector time:', performance.now() - perf); */\n /* let perf = performance.now();\n let contains = bubble.classList.contains('document-container');\n console.log('getCheckboxInputFromBubble classList time:', performance.now() - perf);\n\n perf = performance.now();\n contains = bubble.className.includes('document-container');\n console.log('getCheckboxInputFromBubble className time:', performance.now() - perf); */\n\n return bubble.classList.contains('document-container') ?\n bubble.querySelector('label input') as HTMLInputElement :\n super.getCheckboxInputFromElement(bubble);\n }\n\n public canSelectBubble(bubble: HTMLElement) {\n return !bubble.classList.contains('service') &&\n !bubble.classList.contains('is-outgoing') &&\n !bubble.classList.contains('is-error') &&\n !bubble.classList.contains('bubble-first') &&\n !bubble.classList.contains('avoid-selection');\n }\n\n protected onToggleSelection = async(forwards: boolean, animate: boolean) => {\n const {needTranslateX, widthFrom, widthTo} = await this.chat.input.center(animate);\n\n SetTransition({\n element: this.listenElement,\n className: 'is-selecting',\n forwards,\n duration: animate ? 200 : 0,\n onTransitionEnd: () => {\n if(!this.isSelecting) {\n this.selectionInputWrapper.remove();\n this.selectionInputWrapper =\n this.selectionContainer =\n this.selectionSendNowBtn =\n this.selectionForwardBtn =\n this.selectionDeleteBtn =\n this.selectionLeft =\n this.selectionRight =\n null;\n this.selectedText = undefined;\n }\n\n /* fastRaf(() => {\n this.bubbles.onScroll();\n }); */\n }\n });\n\n // const chatInput = this.appImManager.chatInput;\n\n const translateButtonsX = widthFrom < widthTo ? undefined : needTranslateX * 2;\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n this.selectionInputWrapper = document.createElement('div');\n this.selectionInputWrapper.classList.add('chat-input-wrapper', 'selection-wrapper');\n\n // const background = document.createElement('div');\n // background.classList.add('chat-input-wrapper-background');\n\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add('selection-container');\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n const btnCancel = ButtonIcon('close', {noRipple: true});\n attachClickEvent(btnCancel, () => this.cancelSelection(), {once: true, listenerSetter: this.listenerSetter});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add('selection-container-count');\n\n if(this.chat.type === 'scheduled') {\n this.selectionSendNowBtn = Button('btn-primary btn-transparent btn-short text-bold selection-container-send', {icon: 'send2'});\n this.selectionSendNowBtn.append(i18n('MessageScheduleSend'));\n attachClickEvent(this.selectionSendNowBtn, () => {\n new PopupSendNow(this.chat.peerId, [...this.selectedMids.get(this.chat.peerId)], () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n } else {\n this.selectionForwardBtn = Button('btn-primary btn-transparent text-bold selection-container-forward', {icon: 'forward'});\n this.selectionForwardBtn.append(i18n('Forward'));\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionDeleteBtn = Button('btn-primary btn-transparent danger text-bold selection-container-delete', {icon: 'delete'});\n this.selectionDeleteBtn.append(i18n('Delete'));\n attachClickEvent(this.selectionDeleteBtn, () => {\n new PopupDeleteMessages(this.chat.peerId, [...this.selectedMids.get(this.chat.peerId)], this.chat.type, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n const left = this.selectionLeft = document.createElement('div');\n left.classList.add('selection-container-left');\n left.append(btnCancel, this.selectionCountEl);\n\n const right = this.selectionRight = document.createElement('div');\n right.classList.add('selection-container-right');\n right.append(...[\n this.selectionSendNowBtn,\n this.selectionForwardBtn,\n this.selectionDeleteBtn\n ].filter(Boolean))\n\n if(translateButtonsX !== undefined) {\n left.style.transform = `translateX(${-translateButtonsX}px)`;\n right.style.transform = `translateX(${translateButtonsX}px)`;\n }\n\n this.selectionContainer.append(left, right);\n\n // background.style.opacity = '0';\n this.selectionInputWrapper.style.opacity = '0';\n this.selectionInputWrapper.append(/* background, */this.selectionContainer);\n this.input.inputContainer.append(this.selectionInputWrapper);\n\n void this.selectionInputWrapper.offsetLeft; // reflow\n // background.style.opacity = '';\n this.selectionInputWrapper.style.opacity = '';\n left.style.transform = '';\n right.style.transform = '';\n }\n } else if(this.selectionLeft && translateButtonsX !== undefined) {\n this.selectionLeft.style.transform = `translateX(-${translateButtonsX}px)`;\n this.selectionRight.style.transform = `translateX(${translateButtonsX}px)`;\n }\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n replaceContent(this.selectionCountEl, i18n('messages', [this.length()]));\n this.selectionSendNowBtn && this.selectionSendNowBtn.toggleAttribute('disabled', cantSend);\n this.selectionForwardBtn && this.selectionForwardBtn.toggleAttribute('disabled', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.toggleAttribute('disabled', cantDelete);\n };\n\n protected onCancelSelection = async() => {\n return;\n const promises: Promise[] = [];\n for(const [peerId, mids] of this.selectedMids) {\n for(const mid of mids) {\n promises.push(this.bubbles.getMountedBubble(mid).then((m) => m?.bubble));\n }\n }\n\n const bubbles = filterUnique((await Promise.all(promises)).filter(Boolean));\n bubbles.forEach((bubble) => {\n this.toggleByElement(bubble);\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function getSelectedText(): string {\n if(window.getSelection) {\n return window.getSelection().toString();\n // @ts-ignore\n } else if(document.selection) {\n // @ts-ignore\n return document.selection.createRange().text;\n }\n\n return '';\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../helpers/listenerSetter';\nimport ripple from './ripple';\nimport {LangPackKey, _i18n} from '../lib/langPack';\nimport getDeepProperty from '../helpers/object/getDeepProperty';\nimport rootScope from '../lib/rootScope';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\n\nexport type CheckboxFieldOptions = {\n text?: LangPackKey,\n textArgs?: any[],\n name?: string,\n round?: boolean,\n toggle?: boolean,\n stateKey?: string,\n stateValues?: any[],\n disabled?: boolean,\n checked?: boolean,\n restriction?: boolean,\n withRipple?: boolean,\n withHover?: boolean,\n listenerSetter?: ListenerSetter\n};\nexport default class CheckboxField {\n public input: HTMLInputElement;\n public label: HTMLLabelElement;\n public span: HTMLSpanElement;\n public listenerSetter: ListenerSetter;\n\n constructor(options: CheckboxFieldOptions = {}) {\n const label = this.label = document.createElement('label');\n label.classList.add('checkbox-field');\n\n if(options.restriction) {\n label.classList.add('checkbox-field-restriction');\n }\n\n if(options.round) {\n label.classList.add('checkbox-field-round');\n }\n\n if(options.disabled) {\n this.toggleDisability(true);\n }\n\n this.listenerSetter = options.listenerSetter;\n\n const input = this.input = document.createElement('input');\n input.classList.add('checkbox-field-input');\n input.type = 'checkbox';\n if(options.name) {\n input.id = 'input-' + options.name;\n }\n\n if(options.checked) {\n input.checked = true;\n }\n\n if(options.stateKey) {\n let loaded = false;\n const onChange = () => {\n if(!loaded) {\n return;\n }\n\n let value: any;\n if(options.stateValues) {\n value = options.stateValues[input.checked ? 1 : 0];\n } else {\n value = input.checked;\n }\n\n rootScope.managers.appStateManager.setByKey(options.stateKey, value);\n };\n\n apiManagerProxy.getState().then((state) => {\n loaded = true;\n const stateValue = getDeepProperty(state, options.stateKey);\n let checked: boolean;\n if(options.stateValues) {\n checked = options.stateValues.indexOf(stateValue) === 1;\n } else {\n checked = stateValue;\n }\n\n this.setValueSilently(checked);\n });\n\n if(options.listenerSetter) options.listenerSetter.add(input)('change', onChange);\n else input.addEventListener('change', onChange);\n }\n\n let span: HTMLSpanElement;\n if(options.text) {\n span = this.span = document.createElement('span');\n span.classList.add('checkbox-caption');\n _i18n(span, options.text, options.textArgs);\n } else {\n label.classList.add('checkbox-without-caption');\n }\n\n label.append(input);\n\n if(options.toggle) {\n label.classList.add('checkbox-field-toggle');\n\n const toggle = document.createElement('div');\n toggle.classList.add('checkbox-toggle');\n label.append(toggle);\n } else {\n const box = document.createElement('div');\n box.classList.add('checkbox-box');\n\n const checkSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n checkSvg.classList.add('checkbox-box-check');\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#check');\n use.setAttributeNS(null, 'x', '-1');\n checkSvg.append(use);\n\n const bg = document.createElement('div');\n bg.classList.add('checkbox-box-background');\n\n const border = document.createElement('div');\n border.classList.add('checkbox-box-border');\n\n box.append(border, bg, checkSvg);\n\n label.append(box);\n }\n\n if(span) {\n label.append(span);\n }\n\n if(options.withRipple) {\n label.classList.add('checkbox-ripple', 'hover-effect');\n ripple(label, undefined, undefined, true);\n // label.prepend(input);\n } else if(options.withHover) {\n label.classList.add('hover-effect');\n }\n }\n\n get checked() {\n return this.input.checked;\n }\n\n set checked(checked: boolean) {\n /* if(this.checked === checked) {\n return;\n } */\n\n this.setValueSilently(checked);\n\n const event = new Event('change', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(checked: boolean) {\n this.input.checked = checked;\n }\n\n public toggleDisability(disable: boolean) {\n this.label.classList.toggle('checkbox-disabled', disable);\n return () => this.toggleDisability(!disable);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField, {InputFieldOptions} from './inputField';\n\nexport default class CodeInputField extends InputField {\n constructor(public options: InputFieldOptions & {\n length: number,\n onFill: (code: string) => void\n }) {\n super(Object.assign(options, {\n plainText: true\n }));\n\n const input = this.input as HTMLInputElement;\n input.type = 'tel';\n input.setAttribute('required', '');\n input.autocomplete = 'off';\n\n let lastLength = 0;\n this.input.addEventListener('input', (e) => {\n this.input.classList.remove('error');\n this.setLabel();\n\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\n this.setValueSilently(value);\n\n const length = this.value.length;\n if(length === options.length) { // submit code\n options.onFill(this.value);\n } else if(length === lastLength) {\n return;\n }\n\n lastLength = length;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {addCancelButton} from './popups';\nimport PopupPeer, {PopupPeerCheckboxOptions, PopupPeerOptions} from './popups/peer';\n\n// type PopupConfirmationOptions = Pick;\nexport type PopupConfirmationOptions = PopupPeerOptions & {\n button: PopupPeerOptions['buttons'][0],\n checkbox?: PopupPeerOptions['checkboxes'][0]\n};\n\nexport default function confirmationPopup(\n options: T\n): Promise : (T['checkbox'] extends PopupPeerCheckboxOptions ? boolean : void)> {\n return new Promise((resolve, reject) => {\n const {button, checkbox} = options;\n button.callback = (set) => {\n if(checkbox || !set) {\n resolve(set ? !!set.size : undefined);\n } else {\n resolve(options.checkboxes.map((checkbox) => set.has(checkbox.text)));\n }\n };\n\n const buttons = addCancelButton(options.buttons || [button]);\n const cancelButton = buttons.find((button) => button.isCancel);\n cancelButton.callback = () => {\n reject();\n };\n\n options.buttons = buttons;\n options.checkboxes ??= checkbox && [checkbox];\n\n new PopupPeer('popup-confirmation', options).show();\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\nimport {randomLong} from '../helpers/random';\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport I18n, {i18n} from '../lib/langPack';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../lib/rootScope';\nimport {getCountryEmoji} from '../vendor/emoji';\nimport InputField, {InputFieldOptions} from './inputField';\nimport Scrollable from './scrollable';\n\nlet countries: HelpCountry.helpCountry[];\nconst setCountries = () => {\n countries = I18n.countriesList\n .filter((country) => !country.pFlags?.hidden)\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\n};\n\nlet init = () => {\n setCountries();\n rootScope.addEventListener('language_change', () => {\n setCountries();\n });\n};\n\nconst VIRTUAL_COUNTRIES = new Set(['FT']);\n\nexport default class CountryInputField extends InputField {\n private lastCountrySelected: HelpCountry;\n private lastCountryCodeSelected: HelpCountryCode;\n\n private hideTimeout: number;\n private selectWrapper: HTMLElement;\n\n private liMap: Map;\n\n constructor(public options: InputFieldOptions & {\n onCountryChange?: (country: HelpCountry.helpCountry, code: HelpCountryCode.helpCountryCode) => void,\n noPhoneCodes?: boolean\n } = {}) {\n super({\n label: 'Country',\n name: randomLong(),\n ...options\n });\n\n if(init) {\n init();\n init = undefined;\n }\n\n this.liMap = new Map();\n\n this.container.classList.add('input-select');\n\n const selectWrapper = this.selectWrapper = document.createElement('div');\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\n\n const arrowDown = document.createElement('span');\n arrowDown.classList.add('arrow', 'arrow-down');\n this.container.append(arrowDown);\n\n const selectList = document.createElement('ul');\n selectWrapper.appendChild(selectList);\n\n const scroll = new Scrollable(selectWrapper);\n\n let initSelect = () => {\n initSelect = null;\n\n countries.forEach((c) => {\n if(options.noPhoneCodes && VIRTUAL_COUNTRIES.has(c.iso2)) {\n return;\n }\n\n const emoji = getCountryEmoji(c.iso2);\n\n const liArr: Array = [];\n for(let i = 0, length = Math.min(c.country_codes.length, options.noPhoneCodes ? 1 : Infinity); i < length; ++i) {\n const countryCode = c.country_codes[i];\n const li = document.createElement('li');\n\n const wrapped = wrapEmojiText(emoji);\n if(IS_EMOJI_SUPPORTED) {\n const spanEmoji = document.createElement('span');\n setInnerHTML(spanEmoji, wrapped);\n li.append(spanEmoji);\n } else {\n setInnerHTML(li, wrapped);\n }\n\n const el = i18n(c.default_name as any);\n el.dataset.defaultName = c.default_name;\n li.append(el);\n\n if(!options.noPhoneCodes) {\n const span = document.createElement('span');\n span.classList.add('phone-code');\n span.innerText = '+' + countryCode.country_code;\n li.appendChild(span);\n }\n\n liArr.push(li);\n selectList.append(li);\n }\n\n this.liMap.set(c.iso2, liArr);\n });\n\n selectList.addEventListener('mousedown', (e) => {\n if(e.button !== 0) { // other buttons but left shall not pass\n return;\n }\n\n const target = findUpTag(e.target, 'LI')\n this.selectCountryByTarget(target);\n // console.log('clicked', e, countryName, phoneCode);\n });\n\n this.container.appendChild(selectWrapper);\n };\n\n initSelect();\n\n this.input.addEventListener('focus', (e) => {\n if(initSelect) {\n initSelect();\n } else {\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) return;\n arr.forEach((li) => li.style.display = '');\n });\n }\n\n clearTimeout(this.hideTimeout);\n this.hideTimeout = undefined;\n\n selectWrapper.classList.remove('hide');\n void selectWrapper.offsetWidth; // reflow\n selectWrapper.classList.add('active');\n\n this.select();\n\n fastSmoothScroll({\n // container: page.pageEl.parentElement.parentElement,\n container: findUpClassName(this.container, 'scrollable-y'),\n element: this.input,\n position: 'start',\n margin: 4\n });\n\n setTimeout(() => {\n if(!mouseDownHandlerAttached) {\n document.addEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = true;\n }\n }, 0);\n });\n\n let mouseDownHandlerAttached = false;\n const onMouseDown = (e: MouseEvent) => {\n if(findUpClassName(e.target, 'input-select')) {\n return;\n }\n if(e.target === this.input) {\n return;\n }\n\n this.hidePicker();\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = false;\n };\n\n /* false && this.input.addEventListener('blur', function(this: typeof this.input, e) {\n hidePicker();\n\n e.cancelBubble = true;\n }, {capture: true}); */\n\n const onKeyPress = (e: KeyboardEvent) => {\n const key = e.key;\n if(e.ctrlKey || key === 'Control') return false;\n\n // let i = new RegExp('^' + this.value, 'i');\n const _value = this.value.toLowerCase();\n const matches: HelpCountry[] = [];\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) {\n return;\n }\n\n const names = [\n c.name,\n c.default_name,\n c.iso2\n ];\n\n names.filter(Boolean).forEach((name) => {\n const abbr = name.split(' ').filter((word) => /\\w/.test(word)).map((word) => word[0]).join('');\n if(abbr.length > 1) {\n names.push(abbr);\n }\n });\n\n const good = !!names.filter(Boolean).find((str) => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;// i.test(c.name);\n\n arr.forEach((li) => li.style.display = good ? '' : 'none');\n if(good) matches.push(c);\n });\n\n // Код ниже автоматически выберет страну если она осталась одна при поиске\n /* if(matches.length === 1 && matches[0].li.length === 1) {\n if(matches[0].name === lastCountrySelected) return false;\n //console.log('clicking', matches[0]);\n\n var clickEvent = document.createEvent('MouseEvents');\n clickEvent.initEvent('mousedown', true, true);\n matches[0].li[0].dispatchEvent(clickEvent);\n return false;\n } else */if(matches.length === 0) {\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) {\n return;\n }\n\n arr.forEach((li) => li.style.display = '');\n });\n } else if(matches.length === 1 && key === 'Enter') {\n cancelEvent(e);\n this.selectCountryByTarget(this.liMap.get(matches[0].iso2)[0]);\n }\n };\n\n this.input.addEventListener('keyup', onKeyPress);\n this.input.addEventListener('keydown', (e) => {\n if(e.key === 'Enter') {\n onKeyPress(e);\n }\n });\n\n arrowDown.addEventListener('mousedown', (e) => {\n if(this.input.matches(':focus')) {\n this.hidePicker();\n this.input.blur();\n } else {\n e.cancelBubble = true;\n e.preventDefault();\n this.input.focus();\n }\n });\n }\n\n public getSelected() {\n return {country: this.lastCountrySelected, code: this.lastCountryCodeSelected};\n }\n\n public hidePicker = () => {\n if(this.hideTimeout !== undefined) return;\n this.selectWrapper.classList.remove('active');\n this.hideTimeout = window.setTimeout(() => {\n this.selectWrapper.classList.add('hide');\n this.hideTimeout = undefined;\n }, 200);\n }\n\n public selectCountryByTarget = (target: HTMLElement) => {\n const defaultName = target.querySelector('[data-default-name]').dataset.defaultName;\n const phoneCodeEl = target.querySelector('.phone-code');\n const phoneCode = phoneCodeEl?.innerText;\n const countryCode = phoneCode && phoneCode.replace(/\\D/g, '');\n\n replaceContent(this.input, i18n(defaultName as any));\n this.simulateInputEvent();\n this.lastCountrySelected = countries.find((c) => c.default_name === defaultName);\n this.lastCountryCodeSelected = countryCode && this.lastCountrySelected.country_codes.find((_countryCode) => _countryCode.country_code === countryCode);\n\n this.options.onCountryChange?.(this.lastCountrySelected, this.lastCountryCodeSelected);\n this.hidePicker();\n }\n\n public selectCountryByIso2(iso2: string) {\n this.selectCountryByTarget(this.liMap.get(iso2)[0]);\n }\n\n public override(country: HelpCountry, code: HelpCountryCode, countryName?: string) {\n replaceContent(this.input, country ? i18n(country.default_name as any) : countryName);\n this.lastCountrySelected = country;\n this.lastCountryCodeSelected = code;\n this.options.onCountryChange?.(this.lastCountrySelected, this.lastCountryCodeSelected);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_MOBILE} from '../environment/userAgent';\nimport {animate} from '../helpers/animation';\nimport {Middleware} from '../helpers/middleware';\nimport clamp from '../helpers/number/clamp';\nimport animationIntersector, {AnimationItemGroup, AnimationItemWrapper} from './animationIntersector';\n\ntype DotRendererDot = {\n x: number,\n y: number,\n opacity: number,\n radius: number\n mOpacity: number,\n adding: boolean,\n counter: number,\n path: Path2D\n};\nexport default class DotRenderer implements AnimationItemWrapper {\n public canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n private dots: DotRendererDot[];\n\n public paused: boolean;\n public autoplay: boolean;\n public tempId: number;\n\n private dpr: number;\n\n constructor(\n private width: number,\n private height: number,\n private multiply?: number\n ) {\n const canvas = this.canvas = document.createElement('canvas');\n const dpr = this.dpr = window.devicePixelRatio;\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n canvas.classList.add('canvas-thumbnail', 'canvas-dots');\n\n this.paused = true;\n this.autoplay = true;\n this.tempId = 0;\n this.context = canvas.getContext('2d');\n }\n\n private prepare() {\n let count = Math.round(this.width * this.height / (35 * (IS_MOBILE ? 2 : 1)));\n count *= this.multiply || 1;\n count = Math.min(IS_MOBILE ? 1000 : 2200, count);\n count = Math.round(count);\n const dots: DotRendererDot[] = this.dots = new Array(count);\n\n for(let i = 0; i < count; ++i) {\n dots[i] = this.generateDot();\n }\n }\n\n private generateDot(adding?: boolean): DotRendererDot {\n const x = Math.floor(Math.random() * this.canvas.width);\n const y = Math.floor(Math.random() * this.canvas.height);\n const opacity = adding ? 0 : Math.random();\n const radius = (Math.random() >= .8 ? 1 : 0.5) * this.dpr;\n const path = new Path2D();\n path.arc(x, y, radius, 0, 2 * Math.PI, false);\n return {\n x,\n y,\n opacity,\n radius,\n mOpacity: opacity,\n adding: adding ?? Math.random() >= .5,\n counter: 0,\n path\n };\n }\n\n private draw() {\n const {context, canvas, dots} = this;\n context.clearRect(0, 0, canvas.width, canvas.height);\n context.fillStyle = '#fff';\n\n const add = 0.02;\n for(let i = 0, length = dots.length; i < length; ++i) {\n const dot = dots[i];\n const addOpacity = dot.adding ? add : -add;\n\n dot.mOpacity += addOpacity;\n // if(dot.mOpacity <= 0) dot.mOpacity = dot.opacity;\n\n // const easedOpacity = easing(dot.mOpacity);\n const easedOpacity = clamp(dot.mOpacity, 0, 1);\n context.globalAlpha = easedOpacity;\n context.fill(dot.path);\n\n if(dot.mOpacity <= 0) {\n dot.adding = true;\n\n if(++dot.counter >= 1) {\n dots[i] = this.generateDot(dot.adding);\n }\n } else if(dot.mOpacity >= 1) {\n dot.adding = false;\n }\n }\n }\n\n public remove() {\n this.pause();\n }\n\n public pause() {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n ++this.tempId;\n }\n\n public renderFirstFrame() {\n if(!this.dots) {\n this.prepare();\n }\n\n this.draw();\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n const tempId = ++this.tempId;\n\n if(!this.dots) {\n this.prepare();\n }\n\n animate(() => {\n if(this.tempId !== tempId || this.paused) {\n return false;\n }\n\n this.draw();\n return true;\n });\n }\n\n public static create({\n width,\n height,\n middleware,\n animationGroup,\n multiply\n }: {\n width: number,\n height: number,\n middleware: Middleware,\n animationGroup: AnimationItemGroup,\n multiply?: number\n }) {\n const dotRenderer = new DotRenderer(width, height, multiply);\n dotRenderer.renderFirstFrame();\n\n animationIntersector.addAnimation(dotRenderer, animationGroup, dotRenderer.canvas, middleware);\n\n return dotRenderer;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputFile} from '../layer';\nimport AvatarEdit from './avatarEdit';\nimport AvatarElement from './avatar';\nimport InputField from './inputField';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ButtonCorner from './buttonCorner';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\n\nexport default class EditPeer {\n public nextBtn: HTMLButtonElement;\n\n public uploadAvatar: () => Promise;\n public avatarEdit: AvatarEdit;\n public avatarElem: AvatarElement;\n\n private inputFields: InputField[];\n private listenerSetter: ListenerSetter;\n\n private peerId: PeerId;\n\n private _disabled = false;\n private avatarSize = 120;\n\n constructor(options: {\n peerId?: EditPeer['peerId'],\n inputFields: EditPeer['inputFields'],\n listenerSetter: ListenerSetter,\n doNotEditAvatar?: boolean,\n withoutAvatar?: boolean,\n nextBtn?: HTMLButtonElement,\n avatarSize?: number,\n popupOptions?: ConstructorParameters[1]\n }) {\n safeAssign(this, options);\n\n this.peerId ||= NULL_PEER_ID;\n\n if(!this.nextBtn) {\n this.nextBtn = ButtonCorner({icon: 'check'});\n } else if(!this.nextBtn.classList.contains('btn-corner')) {\n this.handleChange = () => {\n this.nextBtn.toggleAttribute('disabled', !this.isChanged() || this.disabled);\n };\n }\n\n if(!options.withoutAvatar) {\n this.avatarElem = new AvatarElement();\n this.avatarElem.classList.add('avatar-placeholder', 'avatar-' + this.avatarSize);\n this.avatarElem.updateWithOptions({peerId: this.peerId});\n\n if(!options.doNotEditAvatar) {\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n this.handleChange();\n this.avatarElem.remove();\n }, options.popupOptions);\n\n this.avatarEdit.container.append(this.avatarElem);\n }\n }\n\n this.inputFields.forEach((inputField) => {\n this.listenerSetter.add(inputField.input)('input', this.handleChange);\n });\n\n this.handleChange();\n }\n\n public get disabled() {\n return this._disabled;\n }\n\n public set disabled(value) {\n this._disabled = value;\n this.inputFields.forEach((inputField) => inputField.input.toggleAttribute('disabled', value));\n this.handleChange();\n }\n\n public lockWithPromise(promise: Promise, unlockOnSuccess = false) {\n this.disabled = true;\n promise.then(() => {\n if(unlockOnSuccess) {\n this.disabled = false;\n }\n }, () => {\n this.disabled = false;\n });\n }\n\n public isChanged = () => {\n if(this.uploadAvatar) {\n return true;\n }\n\n let changedLength = 0, requiredLength = 0, requiredValidLength = 0;\n this.inputFields.forEach((inputField) => {\n if(inputField.isValid()) {\n if(inputField.isChanged()) {\n ++changedLength;\n }\n\n if(inputField.required) {\n ++requiredValidLength;\n }\n }\n\n if(inputField.required) {\n ++requiredLength;\n }\n });\n\n return requiredLength === requiredValidLength && changedLength > 0;\n };\n\n public handleChange = () => {\n this.nextBtn.classList.toggle('is-visible', this.isChanged());\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, {EmoticonsDropdown, EmoticonsTab, EMOTICONSSTICKERGROUP} from '..';\nimport GifsMasonry from '../../gifsMasonry';\nimport Scrollable from '../../scrollable';\nimport {putPreloader} from '../../putPreloader';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\n\nexport default class GifsTab implements EmoticonsTab {\n public content: HTMLElement;\n public scrollable: Scrollable;\n public tabId: number;\n\n constructor(private managers: AppManagers) {\n\n }\n\n init() {\n this.content = document.getElementById('content-gifs');\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\n attachClickEvent(gifsContainer, EmoticonsDropdown.onMediaClick);\n\n const scroll = this.scrollable = new Scrollable(this.content, 'GIFS');\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\n const preloader = putPreloader(this.content, true);\n\n this.managers.appDocsManager.getGifs().then((docs) => {\n docs.forEach((doc) => {\n masonry.add(doc);\n });\n\n preloader.remove();\n });\n\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\n\n this.init = null;\n }\n\n onClose() {\n\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport {SliderSuperTab} from '../../slider';\nimport InputSearch from '../../inputSearch';\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\nimport appSidebarRight from '..';\nimport {AppInlineBotsManager} from '../../../lib/appManagers/appInlineBotsManager';\nimport GifsMasonry from '../../gifsMasonry';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport {NULL_PEER_ID} from '../../../lib/mtproto/mtproto_config';\n\nconst ANIMATIONGROUP: AnimationItemGroup = 'GIFS-SEARCH';\n\nexport default class AppGifsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private gifsDiv: HTMLDivElement;\n\n private nextOffset = '';\n private loadedAll = false;\n\n private gifBotPeerId: PeerId;\n private masonry: GifsMasonry;\n\n private searchPromise: ReturnType;\n\n public init() {\n this.container.id = 'search-gifs-container';\n\n this.inputSearch = new InputSearch('SearchGifsTitle', (value) => {\n this.reset();\n this.search(value);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.gifsDiv = document.createElement('div');\n this.gifsDiv.classList.add('gifs-masonry');\n attachClickEvent(this.gifsDiv, this.onGifsClick, {listenerSetter: this.listenerSetter});\n\n this.scrollable.append(this.gifsDiv);\n\n this.masonry = new GifsMasonry(this.gifsDiv, ANIMATIONGROUP, this.scrollable);\n // this.backBtn.parentElement.append(this.inputSearch.container);\n\n appSidebarRight.toggleSidebar(true).then(() => {\n this.search('', true);\n\n this.scrollable.onScrolledBottom = () => {\n this.search(this.inputSearch.value, false);\n };\n });\n }\n\n private onGifsClick = async(e: MouseEvent | TouchEvent) => {\n const target = findUpClassName(e.target, 'gif');\n if(!target) return;\n\n const fileId = target.dataset.docId;\n if(await appImManager.chat.input.sendMessageWithDocument(fileId)) {\n if(mediaSizes.isMobile) {\n appSidebarRight.onCloseBtnClick();\n }\n } else {\n console.warn('got no doc by id:', fileId);\n }\n };\n\n public onClose() {\n this.scrollable.onScrolledBottom = () => {};\n }\n\n public onCloseAfterTimeout() {\n this.reset();\n this.gifsDiv.innerHTML = '';\n animationIntersector.checkAnimations(undefined, ANIMATIONGROUP);\n this.inputSearch.remove();\n return super.onCloseAfterTimeout();\n }\n\n private reset() {\n this.searchPromise = null;\n this.nextOffset = '';\n this.loadedAll = false;\n this.masonry.clear();\n }\n\n public async search(query: string, newSearch = true) {\n if(this.searchPromise || this.loadedAll) return;\n\n if(!this.gifBotPeerId) {\n this.gifBotPeerId = (await this.managers.appUsersManager.resolveUsername('gif')).id.toPeerId(false);\n }\n\n try {\n this.searchPromise = this.managers.appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\n const {results, next_offset} = await this.searchPromise;\n\n if(this.inputSearch.value !== query) {\n return;\n }\n\n this.searchPromise = null;\n this.nextOffset = next_offset;\n if(newSearch) {\n this.gifsDiv.innerHTML = '';\n }\n\n if(results.length) {\n results.forEach((result) => {\n if(result._ === 'botInlineMediaResult' && result.document) {\n this.masonry.add(result.document as MyDocument);\n }\n });\n } else {\n this.loadedAll = true;\n }\n\n this.scrollable.onScroll();\n } catch(err) {\n this.searchPromise = null;\n console.error('gifs loading error:', err);\n throw err;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport InputSearch from '../../inputSearch';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport PopupStickers from '../../popups/stickers';\nimport animationIntersector from '../../animationIntersector';\nimport appSidebarRight from '..';\nimport {StickerSet, StickerSetCovered} from '../../../layer';\nimport {i18n} from '../../../lib/langPack';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport wrapSticker from '../../wrappers/sticker';\n\nexport default class AppStickersTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private setsDiv: HTMLDivElement;\n private lazyLoadQueue: LazyLoadQueue;\n\n public init() {\n this.container.id = 'stickers-container';\n this.container.classList.add('chatlist-container');\n\n this.lazyLoadQueue = new LazyLoadQueue();\n\n this.inputSearch = new InputSearch('StickersTab.SearchPlaceholder', (value) => {\n this.search(value);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.setsDiv = document.createElement('div');\n this.setsDiv.classList.add('sticker-sets');\n this.scrollable.append(this.setsDiv);\n\n attachStickerViewerListeners({listenTo: this.setsDiv, listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.setsDiv, (e) => {\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\n if(sticker) {\n const docId = sticker.dataset.docId;\n appImManager.chat.input.sendMessageWithDocument(docId);\n return;\n }\n\n const target = findUpClassName(e.target, 'sticker-set');\n if(!target) return;\n\n const id = target.dataset.stickerSet as string;\n const access_hash = target.dataset.access_hash as string;\n\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\n if(button) {\n e.preventDefault();\n e.cancelBubble = true;\n\n button.setAttribute('disabled', 'true');\n\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\n this.managers.appStickersManager.toggleStickerSet(full.set).then((changed) => {\n if(changed) {\n button.textContent = '';\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n button.classList.toggle('gray', !!full.set.installed_date);\n }\n }).finally(() => {\n // button.style.width = set.installed_date ? '68px' : '52px';\n button.removeAttribute('disabled');\n });\n });\n } else {\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\n new PopupStickers(full.set).show();\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n appSidebarRight.toggleSidebar(true).then(() => {\n this.renderFeatured();\n });\n }\n\n public onCloseAfterTimeout() {\n this.setsDiv.innerHTML = '';\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\n return super.onCloseAfterTimeout();\n }\n\n public renderSet(set: StickerSet.stickerSet) {\n // console.log('renderSet:', set);\n const div = document.createElement('div');\n div.classList.add('sticker-set');\n\n const header = document.createElement('div');\n header.classList.add('sticker-set-header');\n\n const details = document.createElement('div');\n details.classList.add('sticker-set-details');\n details.innerHTML = `
`;\n\n setInnerHTML(details.firstElementChild, wrapEmojiText(set.title));\n\n const countDiv = document.createElement('div');\n countDiv.classList.add('sticker-set-count');\n countDiv.append(i18n('Stickers', [set.count]));\n details.append(countDiv);\n\n const button = document.createElement('button');\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n // button.style.width = set.installed_date ? '68px' : '52px';\n\n if(set.installed_date) {\n button.classList.add('gray');\n }\n\n // ripple(button);\n\n header.append(details, button);\n\n const stickersDiv = document.createElement('div');\n stickersDiv.classList.add('sticker-set-stickers');\n\n const count = Math.min(5, set.count);\n for(let i = 0; i < count; ++i) {\n const stickerDiv = document.createElement('div');\n stickerDiv.classList.add('sticker-set-sticker');\n\n stickersDiv.append(stickerDiv);\n }\n\n this.managers.appStickersManager.getStickerSet(set).then((set) => {\n // console.log('renderSet got set:', set);\n\n for(let i = 0; i < count; ++i) {\n const div = stickersDiv.children[i] as HTMLDivElement;\n const doc = set.documents[i];\n if(doc._ === 'documentEmpty') {\n continue;\n }\n\n wrapSticker({\n doc,\n div,\n lazyLoadQueue: this.lazyLoadQueue,\n group: 'STICKERS-SEARCH',\n /* play: false,\n loop: false, */\n play: true,\n loop: true,\n width: 68,\n height: 68,\n withLock: true\n });\n }\n });\n\n /* const onMouseOver = () => {\n const animations: AnimationItem['animation'][] = [];\n for(let i = 0; i < count; ++i) {\n const stickerDiv = stickersDiv.children[i] as HTMLElement;\n const animationItem = animationIntersector.getAnimation(stickerDiv);\n if(!animationItem) continue;\n\n const animation = animationItem.animation;\n\n animations.push(animation);\n animation.loop = true;\n animation.play();\n }\n\n div.addEventListener('mouseout', () => {\n animations.forEach((animation) => {\n animation.loop = false;\n });\n\n div.addEventListener('mouseover', onMouseOver, {once: true});\n }, {once: true});\n };\n\n div.addEventListener('mouseover', onMouseOver, {once: true}); */\n\n div.dataset.stickerSet = '' + set.id;\n div.dataset.access_hash = '' + set.access_hash;\n div.dataset.title = set.title;\n\n div.append(header, stickersDiv);\n\n this.setsDiv.append(div);\n }\n\n public renderFeatured() {\n return this.managers.appStickersManager.getFeaturedStickers().then((coveredSets) => {\n if(this.inputSearch.value) {\n return;\n }\n\n coveredSets = this.filterRendered('', coveredSets);\n coveredSets.forEach((set) => {\n this.renderSet(set.set);\n });\n });\n }\n\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\n coveredSets = coveredSets.slice();\n\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\n forEachReverse(children, el => {\n const id = el.dataset.stickerSet;\n const index = coveredSets.findIndex((covered) => covered.set.id === id);\n\n if(index !== -1) {\n coveredSets.splice(index, 1);\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\n el.remove();\n }\n });\n\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\n\n return coveredSets;\n }\n\n public search(query: string) {\n if(!query) {\n return this.renderFeatured();\n }\n\n return this.managers.appStickersManager.searchStickerSets(query, false).then((coveredSets) => {\n if(this.inputSearch.value !== query) {\n return;\n }\n\n // console.log('search result:', coveredSets);\n\n coveredSets = this.filterRendered(query, coveredSets);\n coveredSets.forEach((set) => {\n this.renderSet(set.set);\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport {horizontalMenu} from '../horizontalMenu';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable, {ScrollableX} from '../scrollable';\nimport appSidebarRight from '../sidebarRight';\nimport StickyIntersector from '../stickyIntersector';\nimport EmojiTab from './tabs/emoji';\nimport GifsTab from './tabs/gifs';\nimport StickersTab, {EmoticonsTabC, StickersTabCategory} from './tabs/stickers';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport AppGifsTab from '../sidebarRight/tabs/gifs';\nimport AppStickersTab from '../sidebarRight/tabs/stickers';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport whichChild from '../../helpers/dom/whichChild';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport pause from '../../helpers/schedulers/pause';\nimport {IS_APPLE_MOBILE} from '../../environment/userAgent';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport type LazyLoadQueueIntersector from '../lazyLoadQueueIntersector';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport noop from '../../helpers/noop';\nimport {FocusDirection, ScrollOptions} from '../../helpers/fastSmoothScroll';\nimport BezierEasing from '../../vendor/bezier-easing';\nimport RichInputHandler from '../../helpers/dom/richInputHandler';\nimport {getCaretPosF} from '../../helpers/dom/getCaretPosNew';\nimport ListenerSetter from '../../helpers/listenerSetter';\n\nexport const EMOTICONSSTICKERGROUP: AnimationItemGroup = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n content: HTMLElement;\n scrollable: Scrollable;\n menuScroll?: ScrollableX;\n tabId: number;\n init: () => void;\n onOpen?: () => void;\n onOpened?: () => void;\n onClose?: () => void;\n onClosed?: () => void;\n}\n\nconst easing = BezierEasing(0.42, 0.0, 0.58, 1.0);\nconst scrollOptions: Partial = {\n forceDuration: 200,\n transitionFunction: easing\n};\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue(1);\n\n private emojiTab: EmojiTab;\n private stickersTab: StickersTab;\n private gifsTab: GifsTab;\n\n private container: HTMLElement;\n private tabsEl: HTMLElement;\n private tabId = -1;\n\n private tabs: {[id: number]: EmoticonsTab};\n\n private searchButton: HTMLElement;\n private deleteBtn: HTMLElement;\n\n private selectTab: ReturnType;\n\n private savedRange: Range;\n private managers: AppManagers;\n\n constructor() {\n super({\n element: document.getElementById('emoji-dropdown') as HTMLDivElement,\n ignoreOutClickClassName: 'input-message-input'\n });\n\n this.addEventListener('open', async() => {\n if(IS_TOUCH_SUPPORTED) {\n // appImManager.chat.input.saveScroll();\n if(blurActiveElement()) {\n await pause(100);\n }\n }\n\n if(this.element.parentElement !== appImManager.chat.input.chatInput) {\n appImManager.chat.input.chatInput.append(this.element);\n }\n\n this.savedRange = this.getGoodRange();\n\n EmoticonsDropdown.lazyLoadQueue.lock();\n // EmoticonsDropdown.lazyLoadQueue.unlock();\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n\n const tab = this.tab;\n tab.onOpen?.();\n });\n\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlockAndRefresh();\n\n // this.container.classList.remove('disable-hover');\n\n const tab = this.tab;\n tab.onOpened?.();\n });\n\n this.addEventListener('close', () => {\n EmoticonsDropdown.lazyLoadQueue.lock();\n // EmoticonsDropdown.lazyLoadQueue.lock();\n\n // нужно залочить группу и выключить стикеры\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n const tab = this.tab;\n tab.onClose?.();\n });\n\n this.addEventListener('closed', () => {\n // теперь можно убрать visible, чтобы они не включились после фокуса\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n // this.container.classList.remove('disable-hover');\n\n this.savedRange = undefined;\n\n const tab = this.tab;\n tab.onClosed?.();\n });\n }\n\n public get tab() {\n return this.tabs[this.tabId];\n }\n\n public init() {\n this.managers = rootScope.managers;\n this.emojiTab = new EmojiTab({managers: this.managers});\n this.stickersTab = new StickersTab(this.managers);\n this.gifsTab = new GifsTab(this.managers);\n\n this.tabs = {};\n [this.emojiTab, this.stickersTab, this.gifsTab].forEach((tab, idx) => {\n tab.tabId = idx;\n this.tabs[idx] = tab;\n });\n\n this.container = this.element.querySelector('.emoji-container .tabs-container') as HTMLDivElement;\n this.container.prepend(this.emojiTab.container, this.stickersTab.container);\n this.tabsEl = this.element.querySelector('.emoji-tabs') as HTMLUListElement;\n this.selectTab = horizontalMenu(this.tabsEl, this.container, this.onSelectTabClick, () => {\n const {tab} = this;\n tab.init?.();\n animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n });\n\n this.searchButton = this.element.querySelector('.emoji-tabs-search');\n this.searchButton.addEventListener('click', () => {\n if(this.tabId === this.stickersTab.tabId) {\n if(!appSidebarRight.isTabExists(AppStickersTab)) {\n appSidebarRight.createTab(AppStickersTab).open();\n }\n } else {\n if(!appSidebarRight.isTabExists(AppGifsTab)) {\n appSidebarRight.createTab(AppGifsTab).open();\n }\n }\n });\n\n this.deleteBtn = this.element.querySelector('.emoji-tabs-delete');\n attachClickEvent(this.deleteBtn, (e) => {\n cancelEvent(e);\n const input = appImManager.chat.input.messageInput;\n // RichInputHandler.getInstance().makeFocused(appImManager.chat.input.messageInput);\n let range = RichInputHandler.getInstance().getSavedRange(input);\n if(!range) {\n range = document.createRange();\n range.setStartAfter(input.lastChild);\n }\n\n const newRange = range.cloneRange();\n // if(range.endOffset === range.startOffset && range.endContainer === range.startContainer) {\n if(range.collapsed) {\n const {node, offset} = getCaretPosF(input, range.endContainer, range.endOffset);\n let newStartNode: Node;\n if(offset) {\n newStartNode = node;\n } else {\n newStartNode = node.previousSibling;\n if(!newStartNode) {\n return;\n }\n\n while(newStartNode.nodeType === newStartNode.TEXT_NODE && !newStartNode.nodeValue && (newStartNode = newStartNode.previousSibling)) {\n\n }\n\n if(newStartNode.nodeType === newStartNode.ELEMENT_NODE && !(newStartNode as HTMLElement).isContentEditable) {\n return;\n }\n }\n\n if(newStartNode.nodeType === newStartNode.ELEMENT_NODE && (newStartNode as any).tagName === 'IMG') {\n newRange.selectNode(newStartNode);\n } else {\n const text = [...newStartNode.textContent];\n let t: string;\n if(offset) {\n let length = 0;\n t = text.find((text) => (length += text.length, length >= offset));\n } else {\n t = text.pop() || '';\n }\n\n const newOffset = offset ? offset - t.length : newStartNode.textContent.length - t.length;\n newRange.setStart(newStartNode, newOffset);\n }\n }\n\n newRange.deleteContents();\n\n appImManager.chat.input.messageInputField.simulateInputEvent();\n // const selection = document.getSelection();\n // if(selection.isCollapsed) {\n // selection.modify('extend', 'backward', 'character');\n // }\n\n // selection.deleteFromDocument();\n // (document.activeElement as HTMLElement).blur();\n\n // document.execCommand('undo', false, null);\n // const input = appImManager.chat.input.messageInput;\n // if((input.lastChild as any)?.tagName) {\n // input.lastElementChild.remove();\n // } else if(input.lastChild) {\n // if(!input.lastChild.textContent.length) {\n // input.lastChild.remove();\n // } else {\n // input.lastChild.textContent = input.lastChild.textContent.slice(0, -1);\n // }\n // }\n\n // const event = new Event('input', {bubbles: true, cancelable: true});\n // appImManager.chat.input.messageInput.dispatchEvent(event);\n // // appSidebarRight.stickersTab.init();\n });\n\n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE && false;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? this.stickersTab.tabId : this.emojiTab.tabId;\n\n if(HIDE_EMOJI_TAB) {\n (this.tabsEl.children[1] as HTMLElement).classList.add('hide');\n }\n\n simulateClickEvent(this.tabsEl.children[INIT_TAB_ID + 1] as HTMLElement);\n if(this.tabs[INIT_TAB_ID].init) {\n this.tabs[INIT_TAB_ID].init(); // onTransitionEnd не вызовется, т.к. это первая открытая вкладка\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n let lastMouseMoveEvent: MouseEvent, mouseMoveEventAttached = false;\n const onMouseMove = (e: MouseEvent) => {\n lastMouseMoveEvent = e;\n };\n overlayCounter.addEventListener('change', (isActive) => {\n if(isActive) {\n if(!mouseMoveEventAttached) {\n document.body.addEventListener('mousemove', onMouseMove);\n mouseMoveEventAttached = true;\n }\n } else if(mouseMoveEventAttached) {\n document.body.removeEventListener('mousemove', onMouseMove);\n if(lastMouseMoveEvent) {\n this.onMouseOut(lastMouseMoveEvent);\n }\n }\n });\n }\n\n appImManager.addEventListener('peer_changing', () => {\n this.toggle(false);\n });\n appImManager.addEventListener('peer_changed', this.checkRights);\n this.checkRights();\n\n return super.init();\n }\n\n public getElement() {\n return this.element;\n }\n\n public scrollTo(tab: EmoticonsTab, element: HTMLElement) {\n tab.scrollable.scrollIntoViewNew({\n element: element as HTMLElement,\n axis: 'y',\n position: 'start',\n ...scrollOptions\n });\n }\n\n private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n const {tab} = this;\n this.scrollTo(tab, tab.scrollable.container.firstElementChild as HTMLElement);\n return;\n }\n\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === this.emojiTab.tabId);\n this.deleteBtn.classList.toggle('hide', this.tabId !== this.emojiTab.tabId);\n };\n\n private checkRights = async() => {\n const {peerId, threadId} = appImManager.chat;\n const children = this.tabsEl.children;\n const tabsElements = Array.from(children) as HTMLElement[];\n\n const [canSendStickers, canSendGifs] = await Promise.all([\n this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_stickers'),\n this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_gifs')\n ]);\n\n tabsElements[this.stickersTab.tabId + 1].toggleAttribute('disabled', !canSendStickers);\n tabsElements[this.gifsTab.tabId + 1].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== (this.emojiTab.tabId + 1) && (!canSendStickers || !canSendGifs)) {\n this.selectTab(this.emojiTab.tabId, false);\n }\n };\n\n public static menuOnClick = (\n emoticons: EmoticonsTabC,\n menu: HTMLElement,\n scrollable: Scrollable,\n menuScroll?: ScrollableX,\n prevTab?: StickersTabCategory,\n listenerSetter?: ListenerSetter\n ) => {\n let jumpedTo = -1;\n\n const scrollToTab = (tab: typeof prevTab, f?: boolean) => {\n const m = tab.menuScroll || menuScroll;\n if(m) {\n m.scrollIntoViewNew({\n element: tab.elements.menuTab,\n position: 'center',\n axis: 'x',\n getElementPosition: f ? ({elementPosition}) => {\n return elementPosition - 106;\n } : undefined,\n ...scrollOptions\n });\n }\n };\n\n const setActive = (tab: typeof prevTab, scroll = true) => {\n if(tab === prevTab) {\n return false;\n }\n\n let f = false;\n if(prevTab) {\n prevTab.elements.menuTab.classList.remove('active');\n if(prevTab.menuScroll && prevTab.menuScroll !== tab.menuScroll) {\n f = true;\n // scroll to first\n prevTab.menuScroll.container.parentElement.classList.remove('active');\n prevTab.menuScroll.scrollIntoViewNew({\n element: prevTab.menuScroll.container.firstElementChild as HTMLElement,\n forceDirection: scroll ? undefined : FocusDirection.Static,\n position: 'center',\n axis: 'x',\n ...scrollOptions\n });\n }\n }\n\n tab.elements.menuTab.classList.add('active');\n\n if(tab.menuScroll) {\n tab.menuScroll.container.parentElement.classList.add('active');\n scroll && menuScroll.scrollIntoViewNew({\n element: tab.menuScroll.container.parentElement,\n position: 'center',\n axis: 'x',\n ...scrollOptions\n });\n }\n\n if(prevTab) {\n scrollToTab(tab, f);\n }\n\n prevTab = tab;\n\n return true;\n };\n\n const setActiveStatic = (tab: typeof prevTab) => {\n if(prevTab?.local) {\n return;\n }\n\n emoticons.scrollable.scrollTop = tab.elements.container.offsetTop + 1;\n const s = emoticons.menuScroll.container;\n const e = tab.elements.menuTab;\n s.scrollLeft = e.offsetLeft - s.clientWidth / 2 + e.offsetWidth / 2;\n setActive(tab, false);\n };\n\n let scrollingToContent = false;\n const stickyIntersector = new StickyIntersector(scrollable.container, (stuck, target) => {\n if(scrollingToContent) {\n return;\n }\n\n // console.log('sticky scrollTop', stuck, target, scrollable.container.scrollTop, jumpedTo);\n\n if(Math.abs(jumpedTo - scrollable.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const tab = emoticons.getCategoryByContainer(target);\n const which = whichChild(target);\n if(!stuck && (which || tab.menuScroll)) {\n return;\n }\n\n setActive(tab);\n });\n\n attachClickEvent(menu, (e) => {\n let target = findUpClassName(e.target as HTMLElement, 'menu-horizontal-div-item');\n if(!target) {\n target = findUpClassName(e.target as HTMLElement, 'menu-horizontal-inner');\n if(!target || target.classList.contains('active')) {\n return;\n }\n\n target = target.firstElementChild.firstElementChild as HTMLElement;\n }\n\n const which = whichChild(target);\n\n const tab = emoticons.getCategoryByMenuTab(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(setActive(tab)) {\n // scrollToTab(tab);\n // return;\n }\n\n let offsetTop = 0, additionalOffset = 0;\n if(which > 0 || tab.menuScroll) {\n const element = tab.elements.container;\n additionalOffset = 1;\n offsetTop = element.offsetTop + additionalOffset; // * due to stickyIntersector\n }\n\n jumpedTo = offsetTop;\n\n scrollingToContent = true;\n scrollable.scrollIntoViewNew({\n element: offsetTop ? tab.elements.container : scrollable.container.firstElementChild,\n position: 'start',\n axis: 'y',\n getElementPosition: offsetTop ? ({elementPosition}) => elementPosition + additionalOffset : undefined,\n ...scrollOptions\n }).finally(() => {\n setActive(tab);\n scrollingToContent = false;\n });\n }, {listenerSetter});\n\n const a = scrollable.onAdditionalScroll ? scrollable.onAdditionalScroll.bind(scrollable) : noop;\n scrollable.onAdditionalScroll = () => {\n emoticons.content.parentElement.classList.toggle('scrolled-top', !scrollable.scrollTop);\n a();\n };\n\n return {stickyIntersector, setActive, setActiveStatic};\n };\n\n public static onMediaClick = async(e: {target: EventTarget | Element}, clearDraft = false, silent?: boolean) => {\n const target = findUpTag(e.target as HTMLElement, 'DIV');\n if(!target) return false;\n\n const docId = target.dataset.docId;\n if(!docId) return false;\n\n return this.sendDocId(docId, clearDraft, silent);\n };\n\n public static async sendDocId(docId: DocId, clearDraft?: boolean, silent?: boolean) {\n if(await appImManager.chat.input.sendMessageWithDocument(docId, undefined, clearDraft, silent)) {\n /* dropdown.classList.remove('active');\n toggleEl.classList.remove('active'); */\n if(emoticonsDropdown.container) {\n emoticonsDropdown.forceClose = true;\n // emoticonsDropdown.container.classList.add('disable-hover');\n emoticonsDropdown.toggle(false);\n }\n\n return true;\n } else {\n console.warn('got no doc by id:', docId);\n return false;\n }\n }\n\n public addLazyLoadQueueRepeat(lazyLoadQueue: LazyLoadQueueIntersector, processInvisibleDiv: (div: HTMLElement) => void) {\n this.addEventListener('close', () => {\n lazyLoadQueue.lock();\n });\n\n this.addEventListener('closed', () => {\n const divs = lazyLoadQueue.intersector.getVisible();\n\n for(const div of divs) {\n processInvisibleDiv(div);\n }\n\n lazyLoadQueue.intersector.clearVisible();\n });\n\n this.addEventListener('opened', () => {\n lazyLoadQueue.unlockAndRefresh();\n });\n }\n\n public getSavedRange() {\n return this.getGoodRange() || this.savedRange;\n }\n\n private getGoodRange() {\n const sel = document.getSelection();\n if(sel.rangeCount && document.activeElement === appImManager.chat.input.messageInput) {\n return sel.getRangeAt(0);\n }\n }\n}\n\nconst emoticonsDropdown = new EmoticonsDropdown();\nMOUNT_CLASS_TO.emoticonsDropdown = emoticonsDropdown;\nexport default emoticonsDropdown;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, {EmoticonsDropdown, EMOTICONSSTICKERGROUP} from '..';\nimport cancelEvent from '../../../helpers/dom/cancelEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {fastRaf} from '../../../helpers/schedulers';\nimport pause from '../../../helpers/schedulers/pause';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport {emojiFromCodePoints} from '../../../vendor/emoji';\nimport {putPreloader} from '../../putPreloader';\nimport Scrollable, {ScrollableX} from '../../scrollable';\nimport IS_EMOJI_SUPPORTED from '../../../environment/emojiSupport';\nimport IS_TOUCH_SUPPORTED from '../../../environment/touchSupport';\nimport blurActiveElement from '../../../helpers/dom/blurActiveElement';\nimport Emoji from '../../../config/emoji';\nimport fixEmoji from '../../../lib/richTextProcessor/fixEmoji';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport wrapSingleEmoji from '../../../lib/richTextProcessor/wrapSingleEmoji';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport {EmoticonsTabC, StickersTabCategory} from './stickers';\nimport {makeMediaSize} from '../../../helpers/mediaSize';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport VisibilityIntersector, {OnVisibilityChangeItem} from '../../visibilityIntersector';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport {Document, StickerSet} from '../../../layer';\nimport {CustomEmojiElement, CustomEmojiRendererElement} from '../../../lib/richTextProcessor/wrapRichText';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport PopupStickers from '../../popups/stickers';\nimport {hideToast, toastNew} from '../../toast';\nimport safeAssign from '../../../helpers/object/safeAssign';\nimport type {AppStickersManager} from '../../../lib/appManagers/appStickersManager';\n\nconst loadedURLs: Set = new Set();\nexport function appendEmoji(emoji: string, container?: HTMLElement, prepend = false, unify = false) {\n // const emoji = details.unified;\n // const emoji = (details.unified as string).split('-')\n // .reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n\n let kek: DocumentFragment;\n if(unify && !IS_EMOJI_SUPPORTED) {\n kek = wrapSingleEmoji(emoji);\n } else {\n emoji = fixEmoji(emoji);\n kek = wrapEmojiText(emoji);\n }\n\n /* if(!kek.includes('emoji')) {\n console.log(emoji, kek, spanEmoji, emoji.length, new TextEncoder().encode(emoji), emojiUnicode(emoji));\n return;\n } */\n\n // console.log(kek);\n\n spanEmoji.append(kek);\n\n if(spanEmoji.children.length > 1) {\n const first = spanEmoji.firstElementChild;\n spanEmoji.innerHTML = '';\n spanEmoji.append(first);\n }\n\n if(spanEmoji.firstElementChild?.tagName === 'IMG') {\n const image = spanEmoji.firstElementChild as HTMLImageElement;\n\n const url = image.src;\n if(!loadedURLs.has(url)) {\n image.setAttribute('loading', 'lazy');\n const placeholder = document.createElement('span');\n placeholder.classList.add('emoji-placeholder');\n\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '0';\n placeholder.style.opacity = '1';\n }\n\n image.addEventListener('load', () => {\n fastRaf(() => {\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '';\n placeholder.style.opacity = '';\n }\n\n spanEmoji.classList.remove('empty');\n\n loadedURLs.add(url);\n });\n }, {once: true});\n\n spanEmoji.append(placeholder);\n }\n }\n\n // spanEmoji = spanEmoji.firstElementChild as HTMLSpanElement;\n // spanEmoji.setAttribute('emoji', emoji);\n if(container) {\n if(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n }\n\n return spanEmoji;\n}\n\nexport function getEmojiFromElement(element: HTMLElement): {docId?: DocId, emoji: string} {\n const superEmoji = findUpClassName(element, 'super-emoji');\n if(!superEmoji) return;\n\n const firstElementChild = superEmoji.firstElementChild as HTMLElement;\n if(firstElementChild && firstElementChild.classList.contains('custom-emoji')) {\n return {emoji: firstElementChild.dataset.stickerEmoji, docId: firstElementChild.dataset.docId} as const;\n } else {\n if(element.nodeType === element.TEXT_NODE) return {emoji: element.nodeValue};\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n\n return {emoji: element.getAttribute('alt') || element.innerText} as const;\n }\n}\n\nconst EMOJI_RECENT_ID: (typeof EMOJI_CATEGORIES)[0][0] = 'Emoji.Recent';\nconst EMOJI_RECENT_CATEGORY: (typeof EMOJI_CATEGORIES)[0] = [EMOJI_RECENT_ID, 'recent'];\nconst CUSTOM_EMOJI_RECENT_ID: (typeof EMOJI_CATEGORIES)[0][0] = '';\nconst CUSTOM_EMOJI_RECENT_CATEGORY: (typeof EMOJI_CATEGORIES)[0] = [CUSTOM_EMOJI_RECENT_ID, ''];\nconst EMOJI_CATEGORIES: [LangPackKey | '', string][] = [\n ['Emoji.SmilesAndPeople', 'smile'],\n ['Emoji.AnimalsAndNature', 'animals'],\n ['Emoji.FoodAndDrink', 'eats'],\n ['Emoji.TravelAndPlaces', 'car'],\n ['Emoji.ActivityAndSport', 'sport'],\n ['Emoji.Objects', 'lamp'],\n // ['Emoji.Symbols', 'info'],\n ['Emoji.Flags', 'flag'],\n ['Skin Tones' as any, '']\n];\n\nlet sorted: Map<(typeof EMOJI_CATEGORIES)[0], string[]>;\nfunction prepare() {\n if(sorted) {\n return sorted;\n }\n\n const a: Array<[(typeof EMOJI_CATEGORIES)[0], string[]]> = [\n [CUSTOM_EMOJI_RECENT_CATEGORY, []],\n [EMOJI_RECENT_CATEGORY, []]\n ];\n\n sorted = new Map(a);\n for(const emoji in Emoji) {\n const details = Emoji[emoji];\n const i = '' + details;\n const category = EMOJI_CATEGORIES[+i[0] - 1];\n if(!category) continue; // maybe it's skin tones\n\n let s = sorted.get(category);\n if(!s) {\n s = [];\n sorted.set(category, s);\n }\n\n s[+i.slice(1) || 0] = emoji;\n }\n\n sorted.delete(EMOJI_CATEGORIES.pop());\n EMOJI_CATEGORIES.unshift(CUSTOM_EMOJI_RECENT_CATEGORY, EMOJI_RECENT_CATEGORY);\n const order = EMOJI_CATEGORIES.map(([id]) => id);\n const entries = [...sorted.entries()].sort((a, b) => order.indexOf(a[0][0]) - order.indexOf(b[0][0]));\n sorted = new Map(entries);\n\n return sorted;\n}\n\nconst EMOJI_ELEMENT_SIZE = makeMediaSize(42, 42);\nconst RECENT_MAX_LENGTH = 32;\n\ntype EmojiTabItem = {element: HTMLElement} & ReturnType;\ntype EmojiTabCategory = StickersTabCategory;\nexport default class EmojiTab extends EmoticonsTabC {\n private closeScrollTop: number;\n private menuInnerScroll: ScrollableX;\n private isStandalone?: boolean;\n private noRegularEmoji?: boolean;\n private stickerSetId?: Parameters[0];\n private onClick: (emoji: EmojiTabItem) => void;\n private activeEmoji: ReturnType;\n private activeElements: EmojiTabItem[];\n\n constructor(options: {\n managers: AppManagers,\n isStandalone?: boolean,\n noRegularEmoji?: boolean,\n stickerSetId?: EmojiTab['stickerSetId'],\n onClick?: EmojiTab['onClick']\n }) {\n super(\n options.managers,\n 'super-emojis',\n () => EMOJI_ELEMENT_SIZE,\n 16,\n 4,\n 0\n );\n\n safeAssign(this, options);\n this.container.classList.add('emoji-padding');\n this.content.id = 'content-emoji';\n this.activeElements = [];\n }\n\n private onCategoryVisibility = ({target, visible}: Pick) => {\n const category = this.categoriesMap.get(target);\n // console.log(target, visible, category);\n // if(category.local) return;\n\n const renderer = category.elements.renderer;\n const newChildren: HTMLElement[] = [];\n if(renderer) {\n newChildren.push(renderer);\n const customEmojis: Parameters[0] = new Map();\n if(visible) {\n newChildren.push(...category.items.map(({docId, element}) => {\n if(!docId) {\n return element;\n }\n\n // return element;\n\n // if(element.firstElementChild) {\n // return element;\n // }\n\n const customEmojiElement = element.firstElementChild as CustomEmojiElement;\n customEmojiElement.clear(false);\n // const customEmojiElement = CustomEmojiElement.create(document.id);\n customEmojis.set(customEmojiElement.docId, new Set([customEmojiElement]));\n // element.append(customEmojiElement);\n return element;\n }));\n\n renderer.add(customEmojis/* , EmoticonsDropdown.lazyLoadQueue */, undefined, undefined, false);\n } else {\n renderer.clearCanvas();\n renderer.middlewareHelper.clean();\n }\n } else if(visible) {\n newChildren.push(...category.items.map(({element}) => element));\n }\n\n // if(visible)\n category.elements.items.replaceChildren(...newChildren);\n\n if(renderer && !visible) {\n const customEmojis: Parameters[0] = new Map();\n category.items.forEach(({docId, element}) => {\n if(!docId) {\n return;\n }\n\n const customEmojiElement = element.firstElementChild as CustomEmojiElement;\n customEmojiElement.clear();\n customEmojis.set(customEmojiElement.docId, new Set([customEmojiElement]));\n });\n\n /* const promise = */renderer.add(customEmojis/* , EmoticonsDropdown.lazyLoadQueue */, undefined, true);\n // promise.then(() => {\n // customEmojis.forEach((elements) => {\n // elements.forEach((element) => {\n // if(!element.innerHTML) {\n // console.log('no thumb', element);\n // // debugger;\n // }\n // });\n // });\n\n // const set = customEmojis.get('5766933926429854499');\n // console.log(`wrapped ${customEmojis.size} thumbs`, set && set.values().next().value.innerHTML);\n // });\n }\n\n // if(!visible) {\n // const customEmojis: Parameters[0] = {};\n // category.items.forEach((item) => {\n // const {element, document} = item;\n // if(!element.firstElementChild) {\n // return;\n // }\n\n // const customEmojiElement = CustomEmojiElement.create(document.id);\n // customEmojis[customEmojiElement.docId] = new Set([customEmojiElement]);\n // element.firstElementChild.replaceWith(customEmojiElement);\n // });\n\n // renderer.add(customEmojis, EmoticonsDropdown.lazyLoadQueue);\n // }\n };\n\n public destroy() {\n super.destroy();\n this.menuInnerScroll?.destroy();\n }\n\n public init() {\n super.init();\n this.init = undefined;\n\n const intersectionOptions: IntersectionObserverInit = {\n root: this.isStandalone ? this.content : emoticonsDropdown.getElement()\n };\n\n this.categoriesIntersector = new VisibilityIntersector(this.onCategoryVisibility, intersectionOptions);\n\n this.menuOnClickResult = EmoticonsDropdown.menuOnClick(this, this.menu, this.scrollable, this.menuScroll, undefined, this.listenerSetter);\n\n const preloader = putPreloader(this.content, true);\n\n let innerScrollWrapper: HTMLElement;\n\n if(!this.isStandalone) {\n const x = this.menuInnerScroll = new ScrollableX(undefined);\n x.container.classList.add('menu-horizontal-inner-scroll');\n\n innerScrollWrapper = document.createElement('div');\n innerScrollWrapper.classList.add('menu-horizontal-inner');\n innerScrollWrapper.append(x.container);\n }\n\n let preparedMap: ReturnType;\n prepare();\n if(!this.noRegularEmoji) {\n preparedMap = prepare();\n } else {\n preparedMap = new Map([\n [[CUSTOM_EMOJI_RECENT_CATEGORY[0], 'recent'], []]\n // [EMOJI_RECENT_CATEGORY, []]\n ]);\n }\n\n preparedMap.forEach((emojis, [titleLangPackKey, icon]) => {\n const category = this.createLocalCategory(titleLangPackKey, titleLangPackKey, icon, !icon);\n category.elements.container.classList.remove('hide');\n category.elements.items.classList.add(icon && !this.isStandalone ? 'is-local' : 'not-local');\n\n emojis.forEach((unified) => {\n /* if(emojiUnicode(emoji) === '1f481-200d-2642') {\n console.log('append emoji', emoji, emojiUnicode(emoji));\n } */\n\n const emoji = emojiFromCodePoints(unified);\n // if(emoji.includes('🕵')) {\n // console.log('toCodePoints', toCodePoints(emoji));\n // emoji = emoji.replace(/(\\u200d[\\u2640\\u2642\\u2695])(?!\\ufe0f)/, '\\ufe0f$1');\n // const zwjIndex = emoji.indexOf('\\u200d');\n // if(zwjIndex !== -1 && !emoji.includes('\\ufe0f')) {\n // /* if(zwjIndex !== (emoji.length - 1)) {\n // emoji = emoji.replace(/(\\u200d)/g, '\\ufe0f$1');\n // } */\n\n // emoji += '\\ufe0f';\n // //emoji += '\\ufe0f';\n // }\n\n // debugger;\n // }\n\n this.addEmojiToCategory({\n category,\n emoji: {emoji},\n batch: true\n });\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n });\n\n const promise = Promise.all([\n this.isStandalone ? undefined : pause(200),\n !this.noRegularEmoji && this.managers.appEmojiManager.getRecentEmojis('native'),\n !this.isStandalone && this.managers.appEmojiManager.getRecentEmojis('custom'),\n this.stickerSetId && this.managers.appStickersManager.getLocalStickerSet(this.stickerSetId),\n this.managers.appEmojiManager.getCustomEmojis()\n ]).then(([_, recent, recentCustom, mainSet, sets]) => {\n preloader.remove();\n\n if(mainSet) {\n recentCustom = mainSet.documents.map((doc) => doc.id);\n }\n\n const recentCategory = this.categories[EMOJI_RECENT_ID];\n const recentCustomCategory = this.categories[CUSTOM_EMOJI_RECENT_ID];\n\n if(!this.isStandalone) {\n const a = [\n recentCategory && [recentCategory, recent] as const,\n recentCustomCategory && [recentCustomCategory, recentCustom] as const\n ];\n\n a.filter(Boolean).forEach(([category, recent]) => {\n category.limit = RECENT_MAX_LENGTH;\n recent.splice(RECENT_MAX_LENGTH, recent.length - RECENT_MAX_LENGTH);\n });\n }\n\n if(recentCategory && recent) for(const emoji of recent) {\n this.addEmojiToCategory({\n category: recentCategory,\n emoji: {emoji},\n batch: true\n });\n }\n\n if(recentCustomCategory) {\n this.createRendererForCategory(recentCustomCategory);\n if(recentCustom) for(const docId of recentCustom) {\n this.addEmojiToCategory({\n category: recentCustomCategory,\n emoji: {emoji: '', docId},\n batch: true\n });\n }\n recentCustomCategory.elements.container.style.paddingTop = '.5rem';\n }\n\n EMOJI_CATEGORIES.forEach(([id]) => {\n const category = this.categories[id];\n if(!category) {\n return;\n }\n\n this.toggleLocalCategory(category, true);\n\n if(id !== EMOJI_RECENT_ID && id !== CUSTOM_EMOJI_RECENT_ID) {\n category.menuScroll = this.menuInnerScroll;\n this.menuInnerScroll.container.append(category.elements.menuTab);\n }\n });\n\n this.resizeCategories();\n\n recentCategory && innerScrollWrapper && recentCategory.elements.menuTab.after(innerScrollWrapper);\n\n sets.sets.forEach((set) => {\n this.renderStickerSet(set);\n });\n\n this.listenerSetter.add(rootScope)('premium_toggle', () => {\n this.toggleCustomCategory();\n });\n\n this.listenerSetter.add(rootScope)('stickers_top', this.postponedEvent((id) => {\n const category = this.categories[id];\n if(!category) {\n return;\n }\n\n this.positionCategory(category, true);\n\n this.listenerSetter.add(emoticonsDropdown)('openAfterLayout', () => {\n this.menuOnClickResult.setActiveStatic(category);\n }, {once: true});\n }));\n\n const toggleRenderers = (ignore: boolean) => {\n for(const id in this.categories) {\n const category = this.categories[id];\n const renderer = category.elements.renderer;\n if(renderer) {\n renderer.ignoreSettingDimensions = ignore;\n if(!ignore) {\n renderer.setDimensionsFromRect(undefined, true);\n }\n }\n }\n };\n\n !this.isStandalone && this.listenerSetter.add(emoticonsDropdown)('opened', () => {\n toggleRenderers(false);\n });\n\n !this.isStandalone && this.listenerSetter.add(emoticonsDropdown)('close', () => {\n toggleRenderers(true);\n });\n\n this.listenerSetter.add(rootScope)('stickers_installed', (set) => {\n if(!this.categories[set.id] && set.pFlags.emojis) {\n this.renderStickerSet(set, true);\n }\n });\n\n this.listenerSetter.add(rootScope)('stickers_deleted', (set) => {\n const category = this.categories[set.id];\n if(this.deleteCategory(category)) {\n const {renderer} = category.elements;\n if(renderer) {\n renderer.middlewareHelper.clean();\n }\n }\n });\n\n !this.isStandalone && this.listenerSetter.add(rootScope)('emoji_recent', this.postponedEvent((emoji) => {\n const category = this.categories[emoji.docId ? CUSTOM_EMOJI_RECENT_ID : EMOJI_RECENT_ID];\n if(!category) {\n return;\n }\n\n const verify: (item: EmojiTabItem) => boolean = emoji.docId ?\n (item) => item.docId === emoji.docId :\n (item) => item.emoji === emoji.emoji;\n const found = findAndSplice(category.items, verify);\n if(found) {\n category.items.unshift(found);\n if(this.isCategoryVisible(category)) {\n const {renderer} = category.elements;\n positionElementByIndex(found.element, category.elements.items, renderer ? 1 : 0, -1);\n renderer?.forceRender();\n }\n } else {\n this.addEmojiToCategory({\n category,\n emoji,\n batch: false,\n prepend: true\n });\n }\n\n if(this.closeScrollTop === 0) {\n this.menuOnClickResult.setActive(emoji.docId ? this.categories[EMOJI_RECENT_ID] : category);\n }\n }));\n\n !this.isStandalone && this.listenerSetter.add(appImManager)('peer_changed', () => {\n this.toggleCustomCategory();\n });\n\n this.toggleCustomCategory();\n\n this.menuOnClickResult.setActive(recentCategory ?? recentCustomCategory);\n });\n\n attachClickEvent(this.content, this.onContentClick, {listenerSetter: this.listenerSetter});\n attachStickerViewerListeners({listenTo: this.content, listenerSetter: this.listenerSetter});\n\n return promise;\n }\n\n private renderStickerSet(set: StickerSet.stickerSet, prepend?: boolean) {\n const category = this.createCategory(set, wrapEmojiText(set.title));\n this.positionCategory(category, prepend);\n const {container, menuTabPadding} = category.elements;\n category.elements.items.classList.add('not-local');\n category.elements.container.classList.add('is-premium-set');\n category.elements.title.classList.add('tgico');\n\n this.createRendererForCategory(category);\n\n const promise = this.managers.appStickersManager.getStickerSet(set);\n promise.then(({documents}) => {\n documents.forEach((document) => {\n this.addEmojiToCategory({\n category,\n emoji: {docId: document.id, emoji: (document as Document.document).stickerEmojiRaw},\n batch: true\n });\n });\n\n // if(this.isCategoryVisible(category)) {\n // category.elements.items.append(...category.items.map(({element}) => element));\n // }\n\n this.onCategoryVisibility({target: category.elements.container, visible: this.isCategoryVisible(category)});\n\n category.setCategoryItemsHeight();\n container.classList.remove('hide');\n });\n\n wrapStickerSetThumb({\n set,\n container: menuTabPadding,\n group: EMOTICONSSTICKERGROUP,\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n width: 32,\n height: 32,\n autoplay: false\n });\n }\n\n private get peerId() {\n return appImManager.chat.peerId;\n }\n\n public getCustomCategory() {\n return this.categories[CUSTOM_EMOJI_RECENT_ID];\n }\n\n private toggleCustomCategory() {\n const category = this.categories[CUSTOM_EMOJI_RECENT_ID];\n const hasPremium = rootScope.premium || this.peerId === rootScope.myId;\n const canSeeCustomCategory = hasPremium || this.isStandalone;\n super.toggleLocalCategory(category, !!category.items.length && canSeeCustomCategory);\n this.content.classList.toggle('has-premium', hasPremium);\n }\n\n protected toggleLocalCategory(category: EmojiTabCategory, visible: boolean) {\n if(category.id === CUSTOM_EMOJI_RECENT_ID) {\n this.toggleCustomCategory();\n return;\n }\n\n super.toggleLocalCategory(category, visible);\n }\n\n private createRendererForCategory(category: EmojiTabCategory) {\n const renderer = CustomEmojiRendererElement.create({\n animationGroup: EMOTICONSSTICKERGROUP,\n customEmojiSize: mediaSizes.active.esgCustomEmoji\n });\n\n category.elements.renderer = renderer;\n category.elements.items.append(renderer);\n }\n\n public addEmojiToCategory(options: {\n category: EmojiTabCategory,\n emoji?: ReturnType,\n element?: HTMLElement,\n batch?: boolean,\n prepend?: boolean,\n active?: boolean\n }) {\n const {category, emoji, batch, prepend} = options;\n let element = options.element;\n if(element) {\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n spanEmoji.append(element);\n element = spanEmoji;\n } else if(emoji.docId) {\n const customEmojiElement = CustomEmojiElement.create(emoji.docId);\n const span = document.createElement('span');\n span.classList.add(/* 'emoji', */'super-emoji');\n span.append(customEmojiElement);\n element = span;\n } else {\n element = appendEmoji(emoji.emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, undefined, false/* , false */);\n }\n\n const item: typeof category['items'][0] = {\n ...(emoji || {emoji: undefined}),\n element\n };\n\n if(\n options.active || (\n this.activeEmoji && (\n item.docId ?\n this.activeEmoji.docId === item.docId :\n this.activeEmoji.emoji === item.emoji\n )\n )\n ) {\n this.activeEmoji === emoji;\n this.activeElements.push(item);\n element.classList.add('active');\n }\n\n category.items[prepend ? 'unshift' : 'push'](item);\n if(!batch && !this.spliceExceed(category)) {\n this.onLocalCategoryUpdate(category);\n }\n }\n\n // private addEmojisToCategory(category: EmojiTabCategory, emojis: string[], prepend?: boolean) {\n // emojis.forEach((emoji) => {\n // this.addEmojiToCategory(category, emoji, true, prepend);\n // });\n\n // this.onLocalCategoryUpdate(category);\n // }\n\n private onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n\n const {target} = e;\n\n const container = findUpClassName(target, 'emoji-category');\n const category = this.categoriesMap.get(container);\n if(findUpClassName(target, 'category-title')) {\n if(category.local) {\n return;\n }\n\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}, true).show();\n return;\n }\n\n const emoji = getEmojiFromElement(target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n if(\n emoji.docId &&\n !rootScope.premium && (\n this.isStandalone ? category.id !== CUSTOM_EMOJI_RECENT_ID : this.peerId !== rootScope.myId\n )\n ) {\n const a = document.createElement('a');\n a.onclick = () => {\n appImManager.openPremiumBot();\n hideToast();\n };\n toastNew({\n langPackKey: 'CustomEmoji.PremiumAlert',\n langPackArguments: [a]\n });\n return;\n }\n\n if(this.onClick) {\n this.onClick({\n ...emoji,\n element: findUpClassName(target, 'super-emoji').firstElementChild as HTMLElement\n });\n } else {\n appImManager.chat.input.onEmojiSelected(emoji, false);\n }\n\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\n };\n\n public setActive(emoji: ReturnType) {\n if(\n emoji === this.activeEmoji ||\n emoji?.docId ? emoji.docId === this.activeEmoji?.docId : emoji?.emoji === this.activeEmoji?.emoji\n ) {\n return;\n }\n\n this.activeEmoji = emoji;\n\n this.activeElements.forEach((item) => {\n item.element.classList.remove('active');\n });\n\n this.activeElements.length = 0;\n\n this.categoriesMap.forEach((category) => {\n category.items.forEach((item) => {\n if(emoji.docId ? item.docId === emoji.docId : item.emoji === emoji.emoji) {\n item.element.classList.add('active');\n this.activeElements.push(item);\n }\n });\n });\n }\n\n public onClose() {\n this.closeScrollTop = this.scrollable.scrollTop;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getEmojiEntityFromEmoji from './getEmojiEntityFromEmoji';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapSingleEmoji(emoji: string) {\n return wrapRichText(emoji, {\n entities: [getEmojiEntityFromEmoji(emoji)]\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport VisibilityIntersector, {OnVisibilityChange} from './visibilityIntersector';\n\nexport default class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\n private elementsMap: Map = new Map();\n\n constructor(\n parallelLimit?: number,\n protected onVisibilityChange?: OnVisibilityChange,\n options?: IntersectionObserverInit\n ) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((item) => {\n const {target, visible} = item;\n\n const queueItem = this.elementsMap.get(target);\n queueItem.visible = visible;\n\n if(visible) {\n queueItem.wasSeen = true;\n if(!this.queue.includes(queueItem)) {\n this.queue.push(queueItem);\n }\n } else {\n indexOfAndSplice(this.queue, queueItem);\n }\n\n this.onVisibilityChange?.(item);\n this.setProcessQueueTimeout();\n }, options);\n }\n\n public clear() {\n super.clear();\n this.elementsMap.clear();\n }\n\n /* public async processItem(item: LazyLoadElement) {\n //await super.processItem(item);\n await LazyLoadQueueBase.prototype.processItem.call(this, item);\n\n if(this.lazyLoadMedia.length) {\n this.processQueue();\n }\n } */\n\n public observe(el: LazyLoadElement) {\n this.elementsMap.set(el.div, el);\n super.observe(el);\n }\n\n public unobserve(el: LazyLoadElement) {\n this.elementsMap.delete(el.div);\n super.unobserve(el);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, {EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab} from '..';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport {Document, MessagesAllStickers, StickerSet} from '../../../layer';\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport LazyLoadQueueRepeat from '../../lazyLoadQueueRepeat';\nimport {putPreloader} from '../../putPreloader';\nimport PopupStickers from '../../popups/stickers';\nimport Scrollable, {ScrollableX} from '../../scrollable';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport noop from '../../../helpers/noop';\nimport ButtonIcon from '../../buttonIcon';\nimport confirmationPopup from '../../confirmationPopup';\nimport VisibilityIntersector, {OnVisibilityChangeItem} from '../../visibilityIntersector';\nimport createStickersContextMenu from '../../../helpers/dom/createStickersContextMenu';\nimport findUpAsChild from '../../../helpers/dom/findUpAsChild';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport wrapSticker from '../../wrappers/sticker';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport {MediaSize} from '../../../helpers/mediaSize';\nimport {AnyFunction} from '../../../types';\nimport {IgnoreMouseOutType} from '../../../helpers/dropdownHover';\n\nexport class SuperStickerRenderer {\n public lazyLoadQueue: LazyLoadQueueRepeat;\n private animated: Set = new Set();\n\n constructor(\n private regularLazyLoadQueue: LazyLoadQueue,\n private group: AnimationItemGroup,\n private managers: AppManagers,\n private options?: IntersectionObserverInit\n ) {\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, ({target, visible}) => {\n if(!visible) {\n this.processInvisible(target);\n }\n }, options);\n }\n\n public clear() {\n this.lazyLoadQueue.clear();\n }\n\n public renderSticker(doc: MyDocument, element?: HTMLElement, loadPromises?: Promise[]) {\n if(!element) {\n element = document.createElement('div');\n element.classList.add('grid-item', 'super-sticker');\n element.dataset.docId = '' + doc.id;\n\n if(doc.animated) {\n this.observeAnimated(element);\n }\n }\n\n // * This will wrap only a thumb\n /* !doc.animated && */wrapSticker({\n doc,\n div: element,\n lazyLoadQueue: this.regularLazyLoadQueue,\n group: this.group,\n onlyThumb: doc.animated,\n loadPromises\n });\n\n return element;\n }\n\n public observeAnimated(element: HTMLElement) {\n this.animated.add(element);\n this.lazyLoadQueue.observe({\n div: element,\n load: this.processVisible\n });\n }\n\n public unobserveAnimated(element: HTMLElement) {\n this.animated.delete(element);\n this.lazyLoadQueue.delete({div: element});\n }\n\n private checkAnimationContainer = (element: HTMLElement, visible: boolean) => {\n // console.error('checkAnimationContainer', div, visible);\n const players = animationIntersector.getAnimations(element);\n players.forEach((player) => {\n if(!visible) {\n animationIntersector.removeAnimation(player);\n } else {\n animationIntersector.checkAnimation(player, false);\n }\n });\n };\n\n private processVisible = async(element: HTMLElement) => {\n const docId = element.dataset.docId;\n const doc = await this.managers.appDocsManager.getDoc(docId);\n\n const size = mediaSizes.active.esgSticker.width;\n\n // console.log('processVisibleDiv:', element);\n\n const promise = wrapSticker({\n doc,\n div: element,\n width: size,\n height: size,\n lazyLoadQueue: null,\n group: this.group,\n onlyThumb: false,\n play: true,\n loop: true,\n withLock: true\n }).then(({render}) => render);\n\n promise.then(() => {\n // clearTimeout(timeout);\n this.checkAnimationContainer(element, this.lazyLoadQueue.intersector.isVisible(element));\n });\n\n /* let timeout = window.setTimeout(() => {\n console.error('processVisibleDiv timeout', div, doc);\n }, 1e3); */\n\n return promise;\n };\n\n public processInvisible = async(element: HTMLElement) => {\n const docId = element.dataset.docId;\n const doc = await this.managers.appDocsManager.getDoc(docId);\n\n // console.log('STICKER INvisible:', /* div, */docId);\n\n this.checkAnimationContainer(element, false);\n\n element.textContent = '';\n this.renderSticker(doc, element as HTMLDivElement);\n };\n}\n\nexport type StickersTabCategoryItem = {element: HTMLElement};\n\nexport class StickersTabCategory = {}> {\n public elements: {\n container: HTMLElement,\n title: HTMLElement,\n items: HTMLElement,\n menuTab: HTMLElement,\n menuTabPadding: HTMLElement\n } & AdditionalElements;\n public items: Item[];\n public mounted: boolean;\n public id: string;\n public limit: number;\n\n public getContainerSize: () => {width: number, height: number};\n private getElementMediaSize: () => MediaSize;\n\n private gapX: number;\n private gapY: number;\n\n public set?: StickerSet;\n public local?: boolean;\n public menuScroll?: ScrollableX;\n\n constructor(options: {\n id: string,\n title: HTMLElement | DocumentFragment,\n overflowElement: HTMLElement,\n getContainerSize: StickersTabCategory['getContainerSize'],\n getElementMediaSize: StickersTabCategory['getElementMediaSize'],\n gapX: number,\n gapY: number,\n noMenuTab?: boolean\n }) {\n const container = document.createElement('div');\n container.classList.add('emoji-category');\n\n const items = document.createElement('div');\n items.classList.add('category-items');\n\n let title: HTMLElement;\n if(options.title) {\n title = document.createElement('div');\n title.classList.add('category-title');\n title.append(options.title);\n }\n\n let menuTab: HTMLElement, menuTabPadding: HTMLElement;\n if(!options.noMenuTab) {\n menuTab = ButtonIcon(undefined, {noRipple: true});\n menuTab.classList.add('menu-horizontal-div-item');\n\n menuTabPadding = document.createElement('div');\n menuTabPadding.classList.add('menu-horizontal-div-item-padding');\n\n menuTab.append(menuTabPadding);\n }\n\n if(title) container.append(title);\n container.append(items);\n\n this.elements = {\n container,\n title,\n items,\n menuTab,\n menuTabPadding\n } as any;\n this.id = options.id;\n this.items = [];\n\n this.getContainerSize = options.getContainerSize;\n this.getElementMediaSize = options.getElementMediaSize;\n this.gapX = options.gapX ?? 0;\n this.gapY = options.gapY ?? 0;\n }\n\n public setCategoryItemsHeight() {\n const {width: containerWidth} = this.getContainerSize();\n const elementSize = this.getElementMediaSize().width;\n\n let itemsPerRow = containerWidth / elementSize;\n if(this.gapX) itemsPerRow -= Math.floor(itemsPerRow - 1) * this.gapX / elementSize;\n itemsPerRow = Math.floor(itemsPerRow);\n\n const rows = Math.ceil(this.items.length / itemsPerRow);\n let height = rows * elementSize;\n if(this.gapY) height += (rows - 1) * this.gapY;\n\n this.elements.items.style.minHeight = height + 'px';\n }\n}\n\nexport class EmoticonsTabC> implements EmoticonsTab {\n public content: HTMLElement;\n public menuScroll: ScrollableX;\n public container: HTMLElement;\n public menuWrapper: HTMLElement;\n public menu: HTMLElement;\n\n protected categories: {[id: string]: Category};\n protected categoriesMap: Map;\n protected categoriesByMenuTabMap: Map;\n protected categoriesIntersector: VisibilityIntersector;\n protected localCategories: Category[];\n\n protected listenerSetter: ListenerSetter;\n\n public scrollable: Scrollable;\n protected mounted = false;\n protected menuOnClickResult: ReturnType;\n\n public tabId: number;\n\n protected postponedEvents: {cb: AnyFunction, args: any[]}[];\n\n public getContainerSize: Category['getContainerSize'];\n\n constructor(\n protected managers: AppManagers,\n protected categoryItemsClassName: string,\n protected getElementMediaSize: () => MediaSize,\n protected padding: number,\n protected gapX: number,\n protected gapY: number\n ) {\n this.categories = {};\n this.categoriesMap = new Map();\n this.categoriesByMenuTabMap = new Map();\n this.localCategories = [];\n this.postponedEvents = [];\n\n this.listenerSetter = new ListenerSetter();\n\n this.container = document.createElement('div');\n this.container.classList.add('tabs-tab', 'emoticons-container');\n\n this.menuWrapper = document.createElement('div');\n this.menuWrapper.classList.add('menu-wrapper', 'emoticons-menu-wrapper');\n\n this.menu = document.createElement('nav');\n this.menu.className = 'menu-horizontal-div no-stripe justify-start emoticons-menu';\n\n this.menuWrapper.append(this.menu);\n this.menuScroll = new ScrollableX(this.menuWrapper);\n\n this.content = document.createElement('div');\n this.content.classList.add('emoticons-content');\n\n this.container.append(this.menuWrapper, this.content);\n\n this.scrollable = new Scrollable(this.content, 'STICKERS');\n }\n\n public getCategoryByContainer(container: HTMLElement) {\n return this.categoriesMap.get(container);\n }\n\n public getCategoryByMenuTab(menuTab: HTMLElement) {\n return this.categoriesByMenuTabMap.get(menuTab);\n }\n\n protected createCategory(stickerSet: StickerSet, title: HTMLElement | DocumentFragment, isLocal?: boolean, noMenuTab?: boolean) {\n const category: Category = new StickersTabCategory({\n id: '' + stickerSet.id,\n title,\n overflowElement: this.content,\n getContainerSize: () => {\n const {width, height} = this.getContainerSize?.() ?? this.content.getBoundingClientRect();\n return {width: width - this.padding, height};\n },\n getElementMediaSize: this.getElementMediaSize,\n gapX: this.gapX,\n gapY: this.gapY,\n noMenuTab\n }) as any;\n\n if(this.categoryItemsClassName) {\n category.elements.items.classList.add(this.categoryItemsClassName);\n }\n\n const container = category.elements.container;\n container.classList.add('hide');\n\n category.set = stickerSet;\n this.categories[stickerSet.id] = category;\n this.categoriesMap.set(container, category);\n !noMenuTab && this.categoriesByMenuTabMap.set(category.elements.menuTab, category);\n\n this.categoriesIntersector.observe(container);\n !noMenuTab && this.menuOnClickResult.stickyIntersector.observeStickyHeaderChanges(container);\n\n if(!isLocal) {\n !noMenuTab && category.elements.menuTab.classList.add('not-local');\n }\n\n return category;\n }\n\n protected positionCategory(category: Category, prepend?: boolean) {\n const {menuTab, container} = category.elements;\n const posItems = prepend ? this.localCategories.filter((category) => category.mounted).length : 0xFFFF;\n let foundMenuScroll = false;\n const posMenu = prepend ? this.localCategories.filter((category) => {\n if(category.menuScroll && !foundMenuScroll) {\n foundMenuScroll = true;\n return true;\n }\n\n return category.mounted && !category.menuScroll && category.elements.menuTab;\n }).length : 0xFFFF;\n positionElementByIndex(container, this.scrollable.container, posItems);\n positionElementByIndex(menuTab, this.menu, posMenu);\n }\n\n protected isCategoryVisible(category: Category) {\n return this.categoriesIntersector.getVisible().includes(category.elements.container);\n }\n\n protected toggleLocalCategory(category: Category, visible: boolean) {\n if(!visible) {\n category.elements.menuTab?.remove();\n category.elements.container.remove();\n } else {\n const idx = this.localCategories.indexOf(category);\n const sliced = this.localCategories.slice(0, idx);\n let notMountedItems = 0, notMountedMenus = 0;\n sliced.forEach((category) => {\n if(!category.mounted) {\n ++notMountedItems;\n ++notMountedMenus;\n } else if(!category.elements.menuTab || category.menuScroll) {\n ++notMountedMenus;\n }\n });\n const itemsIdx = idx - notMountedItems, menuIdx = idx - notMountedMenus;\n category.elements.menuTab && positionElementByIndex(category.elements.menuTab, this.menu, menuIdx);\n positionElementByIndex(category.elements.container, this.scrollable.container, itemsIdx);\n }\n\n category.mounted = visible;\n // category.elements.container.classList.toggle('hide', !visible);\n }\n\n protected createLocalCategory(id: string, title: LangPackKey | '', icon?: string, noMenuTab?: boolean) {\n const category = this.createCategory({id} as any, title && i18n(title), true, noMenuTab);\n category.local = true;\n this.localCategories.push(category);\n if(category.elements.title) {\n category.elements.title.classList.add('disable-hover');\n }\n\n if(!noMenuTab) {\n if(icon) {\n category.elements.menuTab.classList.add('tgico', 'tgico-' + icon);\n }\n\n category.elements.menuTabPadding.remove();\n }\n\n this.toggleLocalCategory(category, false);\n return category;\n }\n\n protected onLocalCategoryUpdate(category: Category) {\n category.setCategoryItemsHeight();\n this.toggleLocalCategory(category, !!category.items.length);\n }\n\n protected resizeCategories = () => {\n for(const [container, category] of this.categoriesMap) {\n category.setCategoryItemsHeight();\n }\n };\n\n protected deleteCategory(category: Category) {\n if(category) {\n category.elements.container.remove();\n category.elements.menuTab.remove();\n this.categoriesIntersector.unobserve(category.elements.container);\n delete this.categories[category.id];\n this.categoriesMap.delete(category.elements.container);\n this.categoriesByMenuTabMap.delete(category.elements.menuTab);\n\n return true;\n }\n\n return false;\n }\n\n protected spliceExceed(category: Category) {\n if(category.limit === undefined) {\n return false;\n }\n\n const {items, limit} = category;\n items.splice(limit, items.length - limit).forEach(({element}) => {\n element.remove();\n });\n\n this.onLocalCategoryUpdate(category);\n\n return true;\n }\n\n public init() {\n this.listenerSetter.add(emoticonsDropdown)('closed', () => {\n this.postponedEvents.forEach(({cb, args}) => {\n cb(...args);\n });\n\n this.postponedEvents.length = 0;\n });\n }\n\n public destroy() {\n this.getContainerSize = undefined;\n this.postponedEvents.length = 0;\n this.categoriesIntersector?.disconnect();\n this.listenerSetter.removeAll();\n this.scrollable.destroy();\n this.menuScroll?.destroy();\n this.menuOnClickResult?.stickyIntersector?.disconnect();\n }\n\n protected postponedEvent = (cb: (...args: K[]) => void) => {\n return (...args: K[]) => {\n if(emoticonsDropdown.isActive()) {\n this.postponedEvents.push({cb, args});\n } else {\n cb(...args);\n }\n };\n };\n}\n\ntype StickersTabItem = {element: HTMLElement, document: Document.document};\nexport default class StickersTab extends EmoticonsTabC> {\n private superStickerRenderer: SuperStickerRenderer;\n\n constructor(managers: AppManagers) {\n super(\n managers,\n 'super-stickers',\n () => mediaSizes.active.esgSticker,\n 3 * 2,\n 4,\n 4\n );\n\n this.container.classList.add('stickers-padding');\n this.content.id = 'content-stickers';\n }\n\n private setFavedLimit(limit: number) {\n const category = this.categories['faved'];\n category.limit = limit;\n }\n\n private categoryAppendStickers(\n category: StickersTabCategory,\n promise: Promise\n ) {\n const {container} = category.elements;\n\n promise.then((documents) => {\n const isVisible = this.isCategoryVisible(category);\n\n documents.forEach((document) => {\n const element = this.superStickerRenderer.renderSticker(document);\n category.items.push({document, element});\n\n if(isVisible) {\n category.elements.items.append(element);\n }\n });\n\n category.setCategoryItemsHeight();\n container.classList.remove('hide');\n });\n }\n\n private async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\n const category = this.createCategory(set, wrapEmojiText(set.title));\n const {menuTabPadding} = category.elements;\n\n const promise = this.managers.appStickersManager.getStickerSet(set);\n this.categoryAppendStickers(\n category,\n promise.then((stickerSet) => stickerSet.documents as MyDocument[])\n );\n\n this.positionCategory(category, prepend);\n\n wrapStickerSetThumb({\n set,\n container: menuTabPadding,\n group: EMOTICONSSTICKERGROUP,\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n width: 32,\n height: 32,\n autoplay: false\n });\n }\n\n private onCategoryVisibility = ({target, visible, entry}: OnVisibilityChangeItem) => {\n const category = this.categoriesMap.get(target);\n category.elements.items.replaceChildren(...(!visible ? [] : category.items.map(({element}) => element)));\n };\n\n public init() {\n super.init();\n\n this.scrollable.onAdditionalScroll = () => {\n this.setTyping();\n };\n\n /* stickersDiv.addEventListener('mouseover', (e) => {\n let target = e.target as HTMLElement;\n\n if(target.tagName === 'CANVAS') { // turn on sticker\n let animation = lottieLoader.getAnimation(target.parentElement, EMOTICONSSTICKERGROUP);\n\n if(animation) {\n // @ts-ignore\n if(animation.currentFrame === animation.totalFrames - 1) {\n animation.goToAndPlay(0, true);\n } else {\n animation.play();\n }\n }\n }\n }); */\n\n const intersectionOptions: IntersectionObserverInit = {root: emoticonsDropdown.getElement()};\n this.categoriesIntersector = new VisibilityIntersector(this.onCategoryVisibility, intersectionOptions);\n\n const clearCategoryItems = (category: StickersTabCategory) => {\n category.elements.items.replaceChildren();\n category.items.forEach(({element}) => this.superStickerRenderer.unobserveAnimated(element));\n category.items.length = 0;\n };\n\n this.scrollable.container.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n if(findUpClassName(target, 'category-title')) {\n const container = findUpClassName(target, 'emoji-category');\n const category = this.categoriesMap.get(container);\n if(category.local) {\n return;\n }\n\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}).show();\n return;\n }\n\n EmoticonsDropdown.onMediaClick(e);\n });\n\n this.menuOnClickResult = EmoticonsDropdown.menuOnClick(this, this.menu, this.scrollable, this.menuScroll);\n\n const preloader = putPreloader(this.content, true);\n\n const onCategoryStickers = (category: StickersTabCategory, stickers: MyDocument[]) => {\n // if(category.id === 'faved' && category.limit && category.limit < stickers.length) {\n // category.limit = stickers.length;\n // }\n\n if(category.limit) {\n stickers = stickers.slice(0, category.limit);\n }\n\n const ids = new Set(stickers.map((doc) => doc.id));\n forEachReverse(category.items, (item) => {\n if(!ids.has(item.document.id)) {\n this.deleteSticker(category, item.document, true);\n }\n });\n\n this.toggleLocalCategory(category, !!stickers.length);\n forEachReverse(stickers, (doc, idx) => {\n this.unshiftSticker(category, doc, true, idx);\n });\n this.spliceExceed(category);\n category.elements.container.classList.remove('hide');\n };\n\n const favedCategory = this.createLocalCategory('faved', 'FavoriteStickers', 'savedmessages');\n // favedCategory.elements.menuTab.classList.add('active');\n\n const recentCategory = this.createLocalCategory('recent', 'Stickers.Recent', 'recent');\n recentCategory.limit = 20;\n\n const clearButton = ButtonIcon('close', {noRipple: true});\n recentCategory.elements.title.append(clearButton);\n attachClickEvent(clearButton, () => {\n confirmationPopup({\n titleLangKey: 'ClearRecentStickersAlertTitle',\n descriptionLangKey: 'ClearRecentStickersAlertMessage',\n button: {\n langKey: 'Clear'\n }\n }).then(() => {\n this.managers.appStickersManager.clearRecentStickers();\n }, noop);\n });\n\n const premiumCategory = this.createLocalCategory('premium', 'PremiumStickersShort');\n const s = document.createElement('span');\n s.classList.add('tgico-star', 'color-premium');\n premiumCategory.elements.menuTab.append(s);\n\n const promises = [\n Promise.all([\n this.managers.apiManager.getLimit('favedStickers'),\n this.managers.appStickersManager.getFavedStickersStickers()\n ]).then(([limit, stickers]) => {\n this.setFavedLimit(limit);\n onCategoryStickers(favedCategory, stickers);\n }),\n\n this.managers.appStickersManager.getRecentStickersStickers().then((stickers) => {\n onCategoryStickers(recentCategory, stickers);\n }),\n\n this.managers.appStickersManager.getAllStickers().then((res) => {\n for(const set of (res as MessagesAllStickers.messagesAllStickers).sets) {\n this.renderStickerSet(set);\n }\n }),\n\n this.managers.appStickersManager.getPremiumStickers().then((stickers) => {\n const length = stickers.length;\n this.toggleLocalCategory(premiumCategory, rootScope.premium && !!length);\n this.categoryAppendStickers(premiumCategory, Promise.resolve(stickers));\n\n rootScope.addEventListener('premium_toggle', (isPremium) => {\n this.toggleLocalCategory(this.categories['premium'], isPremium && !!length);\n });\n })\n ];\n\n Promise.race(promises).finally(() => {\n preloader.remove();\n });\n\n Promise.all(promises).finally(() => {\n this.mounted = true;\n this.setTyping();\n\n const favedCategory = this.categories['faved'];\n const recentCategory = this.categories['recent'];\n this.menuOnClickResult.setActive(favedCategory.items.length ? favedCategory : recentCategory);\n\n rootScope.addEventListener('stickers_installed', (set) => {\n if(!this.categories[set.id]) {\n this.renderStickerSet(set, true);\n }\n });\n });\n\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP, this.managers, intersectionOptions);\n\n const rendererLazyLoadQueue = this.superStickerRenderer.lazyLoadQueue;\n emoticonsDropdown.addLazyLoadQueueRepeat(rendererLazyLoadQueue, this.superStickerRenderer.processInvisible);\n\n // emoticonsDropdown.addEventListener('close', () => {\n // this.categoriesIntersector.lock();\n // });\n\n // emoticonsDropdown.addEventListener('closed', () => {\n // for(const [container] of this.categoriesMap) {\n // onCategoryVisibility(container, false);\n // }\n // });\n\n // emoticonsDropdown.addEventListener('opened', () => {\n // this.categoriesIntersector.unlockAndRefresh();\n // });\n\n // setInterval(() => {\n // // @ts-ignore\n // const players = Object.values(lottieLoader.players).filter((p) => p.width >= 80);\n\n // console.log(\n // 'STICKERS RENDERED IN PANEL:',\n // players.length,\n // players.filter((p) => !p.paused).length,\n // rendererLazyLoadQueue.intersector.getVisible().length\n // );\n // }, .25e3);\n\n rootScope.addEventListener('sticker_updated', ({type, document, faved}) => {\n // if(type === 'faved') {\n // return;\n // }\n\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\n if(category) {\n if(faved) {\n this.unshiftSticker(category, document);\n } else {\n this.deleteSticker(category, document);\n }\n }\n });\n\n rootScope.addEventListener('stickers_deleted', ({id}) => {\n const category = this.categories[id];\n if(this.deleteCategory(category)) {\n clearCategoryItems(category);\n }\n });\n\n rootScope.addEventListener('stickers_top', this.postponedEvent((id) => {\n const category = this.categories[id];\n if(category) {\n this.positionCategory(category, true);\n emoticonsDropdown.addEventListener('openAfterLayout', () => {\n this.menuOnClickResult.setActiveStatic(category);\n }, {once: true});\n }\n }));\n\n rootScope.addEventListener('stickers_updated', ({type, stickers}) => {\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\n if(category) {\n onCategoryStickers(category, stickers);\n }\n });\n\n rootScope.addEventListener('app_config', () => {\n this.managers.apiManager.getLimit('favedStickers').then((limit) => {\n this.setFavedLimit(limit);\n });\n });\n\n mediaSizes.addEventListener('resize', this.resizeCategories);\n\n attachStickerViewerListeners({listenTo: this.content, listenerSetter: new ListenerSetter()});\n\n const type: IgnoreMouseOutType = 'menu';\n createStickersContextMenu({\n listenTo: this.content,\n verifyRecent: (target) => !!findUpAsChild(target, this.categories['recent'].elements.items),\n onOpen: () => {\n emoticonsDropdown.setIgnoreMouseOut(type, true);\n },\n onClose: () => {\n emoticonsDropdown.setIgnoreMouseOut(type, false);\n }\n });\n\n this.init = null;\n }\n\n public deleteSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean) {\n const item = findAndSplice(category.items, (item) => item.document.id === doc.id);\n if(item) {\n item.element.remove();\n\n if(!batch) {\n this.onLocalCategoryUpdate(category);\n }\n }\n }\n\n public unshiftSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean, idx?: number) {\n if(idx !== undefined) {\n const i = category.items[idx];\n if(i && i.document.id === doc.id) {\n return;\n }\n }\n\n let item = findAndSplice(category.items, (item) => item.document.id === doc.id);\n if(!item) {\n item = {\n element: this.superStickerRenderer.renderSticker(doc),\n document: doc\n };\n }\n\n category.items.unshift(item);\n category.elements.items.prepend(item.element);\n\n if(!batch) {\n this.spliceExceed(category);\n }\n }\n\n public unshiftRecentSticker(doc: MyDocument) {\n this.managers.appStickersManager.saveRecentSticker(doc.id);\n }\n\n public deleteRecentSticker(doc: MyDocument) {\n this.managers.appStickersManager.saveRecentSticker(doc.id, true);\n }\n\n public setTyping = (cancel = false) => {\n if(!cancel && (!emoticonsDropdown.isActive() || emoticonsDropdown.tab !== this)) {\n return;\n }\n\n rootScope.dispatchEvent('choosing_sticker', !cancel);\n };\n\n public onClosed() {\n this.setTyping(true);\n }\n\n public onOpened() {\n this.setTyping();\n this.resizeCategories();\n }\n}\n","export const generateDelimiter = () => {\n const delimiter = document.createElement('div');\n delimiter.classList.add('gradient-delimiter');\n return delimiter;\n};\n","import {_i18n} from '../lib/langPack';\n\nexport default function generateFakeIcon(isScam?: boolean) {\n const span = document.createElement('span');\n span.classList.add('badge-fake');\n _i18n(span, isScam ? 'ScamMessage' : 'FakeMessage');\n return span;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport VisibilityIntersector, {OnVisibilityChange} from './visibilityIntersector';\n\nexport default class LazyLoadQueueRepeat2 extends LazyLoadQueueIntersector {\n constructor(parallelLimit?: number, protected onVisibilityChange?: OnVisibilityChange) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((item) => {\n const {target, visible} = item;\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\n if(visible && spliced.length) {\n spliced.forEach((item) => {\n this.queue.unshift(item);\n });\n }\n\n this.onVisibilityChange && this.onVisibilityChange(item);\n this.setProcessQueueTimeout();\n });\n }\n\n public observe(el: LazyLoadElement) {\n super.observe(el);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport animationIntersector, {AnimationItemGroup} from './animationIntersector';\nimport Scrollable from './scrollable';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport calcImageInBox from '../helpers/calcImageInBox';\nimport {doubleRaf} from '../helpers/schedulers';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport rootScope from '../lib/rootScope';\nimport LazyLoadQueueRepeat2 from './lazyLoadQueueRepeat2';\nimport wrapVideo from './wrappers/video';\nimport noop from '../helpers/noop';\n\nconst width = 400;\nconst maxSingleWidth = width - 100;\nconst height = 100;\n\nexport default class GifsMasonry {\n public lazyLoadQueue: LazyLoadQueueRepeat2;\n private scrollPromise: CancellablePromise = Promise.resolve();\n private timeout: number = 0;\n private managers: AppManagers;\n\n constructor(\n private element: HTMLElement,\n private group: AnimationItemGroup,\n private scrollable: Scrollable,\n attach = true\n ) {\n this.managers = rootScope.managers;\n\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, ({target, visible}) => {\n if(visible) {\n this.processVisibleDiv(target);\n } else {\n this.processInvisibleDiv(target);\n }\n });\n\n /* setInterval(() => {\n // @ts-ignore\n const players = animationIntersector.byGroups[group];\n\n if(players) {\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter((p) => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\n }\n }, .25e3); */\n\n if(attach) {\n this.attach();\n }\n }\n\n private onScroll = () => {\n if(this.timeout) {\n clearTimeout(this.timeout);\n } else {\n this.scrollPromise = deferredPromise();\n // animationIntersector.checkAnimations(true, group);\n }\n\n this.timeout = window.setTimeout(() => {\n this.timeout = 0;\n this.scrollPromise.resolve();\n // animationIntersector.checkAnimations(false, group);\n }, 150);\n };\n\n public attach() {\n this.scrollable.container.addEventListener('scroll', this.onScroll);\n }\n\n public detach() {\n this.clear();\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\n }\n\n public clear() {\n this.lazyLoadQueue.clear();\n }\n\n private processVisibleDiv(div: HTMLElement) {\n const video = div.querySelector('video');\n if(video) {\n return;\n }\n\n const load = () => {\n const docId = div.dataset.docId;\n const promise = Promise.all([this.managers.appDocsManager.getDoc(docId), this.scrollPromise]).then(async([doc]) => {\n const res = await wrapVideo({\n doc,\n container: div as HTMLDivElement,\n lazyLoadQueue: null,\n // lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n group: this.group,\n noInfo: true,\n noPreview: true\n });\n\n const promise = res.loadPromise;\n promise.finally(() => {\n const video = div.querySelector('video');\n const thumb = div.querySelector('img, canvas');\n\n // div.style.opacity = '';\n thumb && thumb.classList.add('hide');\n\n if(video && !video.parentElement) {\n setTimeout(() => {\n video.src = '';\n video.load();\n const animations = animationIntersector.getAnimations(video);\n animations.forEach((item) => {\n animationIntersector.removeAnimation(item);\n });\n }, 0);\n }\n\n // clearTimeout(timeout);\n if(!this.lazyLoadQueue.intersector.isVisible(div)) {\n this.processInvisibleDiv(div);\n }\n });\n\n return promise;\n });\n\n /* let timeout = window.setTimeout(() => {\n console.error('processVisibleDiv timeout', div, doc);\n }, 1e3); */\n\n return promise;\n };\n\n // return load();\n\n this.lazyLoadQueue.push({div, load});\n }\n\n public processInvisibleDiv = (div: HTMLElement) => {\n return this.scrollPromise.then(async() => {\n // return;\n\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\n return;\n }\n\n const video = div.querySelector('video');\n const thumb = div.querySelector('img, canvas');\n\n if(thumb) {\n thumb.classList.remove('hide');\n\n await doubleRaf();\n }\n\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\n return;\n }\n\n if(video) {\n video.remove();\n video.src = '';\n video.load();\n const animations = animationIntersector.getAnimations(video);\n animations.forEach((item) => {\n animationIntersector.removeAnimation(item);\n });\n }\n });\n };\n\n public add(doc: MyDocument, appendTo = this.element) {\n // let gifWidth = doc.w;\n // let gifHeight = doc.h;\n // if(gifHeight < height) {\n // gifWidth = height / gifHeight * gifWidth;\n // gifHeight = height;\n // }\n\n // const willUseWidth = Math.min(maxSingleWidth, width, gifWidth);\n // const size = calcImageInBox(gifWidth, gifHeight, willUseWidth, height);\n\n const div = document.createElement('div');\n div.classList.add('gif', 'grid-item'/* , 'fade-in-transition' */);\n // div.style.width = size.width + 'px';\n // div.style.opacity = '0';\n // div.style.height = h + 'px';\n div.dataset.docId = '' + doc.id;\n\n appendTo.append(div);\n\n this.lazyLoadQueue.observe({div, load: noop as any});\n\n // let preloader = new ProgressivePreloader(div);\n\n wrapVideo({\n doc,\n container: div as HTMLDivElement,\n lazyLoadQueue: null,\n noInfo: true,\n onlyPreview: true\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport TransitionSlider from './transition';\nimport {ScrollableX} from './scrollable';\nimport rootScope from '../lib/rootScope';\nimport {fastRaf} from '../helpers/schedulers';\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport whichChild from '../helpers/dom/whichChild';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\n\nexport function horizontalMenu(\n tabs: HTMLElement,\n content: HTMLElement,\n onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean | Promise,\n onTransitionEnd?: () => void,\n transitionTime = 200,\n scrollableX?: ScrollableX,\n listenerSetter?: ListenerSetter\n) {\n const selectTab = TransitionSlider({\n content,\n type: tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation',\n transitionTime,\n onTransitionEnd,\n listenerSetter\n });\n\n if(!tabs) {\n return selectTab;\n }\n\n const proxy = new Proxy(selectTab, {\n apply: (target, that, args) => {\n const id = +args[0];\n const animate = args[1] !== undefined ? args[1] : true;\n\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\n selectTarget(el, id, animate);\n }\n });\n\n const selectTarget = async(target: HTMLElement, id: number, animate = true) => {\n const tabContent = content.children[id] as HTMLDivElement;\n\n if(onClick) {\n const result1 = onClick(id, tabContent, animate);\n const canChange = result1 instanceof Promise ? await result1 : result1;\n if(canChange !== undefined && !canChange) {\n return;\n }\n }\n\n if(scrollableX) {\n scrollableX.scrollIntoViewNew({\n element: target.parentElement.children[id] as HTMLElement,\n position: 'center',\n forceDirection: animate ? undefined : FocusDirection.Static,\n forceDuration: transitionTime,\n axis: 'x'\n });\n }\n\n if(!rootScope.settings.animationsEnabled) {\n animate = false;\n }\n\n const prevId = selectTab.prevId();\n if(target.classList.contains('active') || id === prevId) {\n return false;\n }\n\n const mutateCallback = animate ? fastRaf : (cb: () => void) => cb();\n\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\n if(prev) {\n mutateCallback(() => {\n prev.classList.remove('active');\n });\n }\n\n // a great stripe from Jolly Cobra\n if(useStripe && prevId !== -1 && animate) {\n mutateCallback(() => {\n const indicator = target.querySelector('i')!;\n const currentIndicator = target.parentElement.children[prevId].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.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\n\n // console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\n\n fastRaf(() => {\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\n mutateCallback(() => {\n target.classList.add('active');\n });\n\n selectTab(id, animate);\n };\n\n const useStripe = !tabs.classList.contains('no-stripe');\n\n // const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\n const tagName = tabs.firstElementChild.tagName;\n attachClickEvent(tabs, (e) => {\n let target = e.target as HTMLElement;\n\n target = findUpAsChild(target, tabs);\n\n // console.log('tabs click:', target);\n\n if(!target) return false;\n\n let id: number;\n if(target.dataset.tab) {\n id = +target.dataset.tab;\n if(id === -1) {\n return false;\n }\n } else {\n id = whichChild(target);\n }\n\n selectTarget(target, id);\n }, {listenerSetter});\n\n return proxy;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport simulateEvent from '../helpers/dom/dispatchEvent';\nimport documentFragmentToHTML from '../helpers/dom/documentFragmentToHTML';\nimport findUpAttribute from '../helpers/dom/findUpAttribute';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport getCaretPosNew from '../helpers/dom/getCaretPosNew';\nimport getRichValueWithCaret from '../helpers/dom/getRichValueWithCaret';\nimport isInputEmpty from '../helpers/dom/isInputEmpty';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport RichInputHandler, {USING_BOMS} from '../helpers/dom/richInputHandler';\nimport selectElementContents from '../helpers/dom/selectElementContents';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport {MessageEntity} from '../layer';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport mergeEntities from '../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../lib/richTextProcessor/parseEntities';\nimport wrapDraftText from '../lib/richTextProcessor/wrapDraftText';\nimport {createCustomFiller, CustomEmojiElement, CustomEmojiRendererElement, insertCustomFillers, renderEmojis} from '../lib/richTextProcessor/wrapRichText';\n\nexport async function insertRichTextAsHTML(input: HTMLElement, text: string, entities: MessageEntity[], wrappingForPeerId: PeerId) {\n const loadPromises: Promise[] = [];\n const wrappingCustomEmoji = entities?.some((entity) => entity._ === 'messageEntityCustomEmoji');\n const renderer = wrappingCustomEmoji ? createCustomEmojiRendererForInput() : undefined;\n const fragment = wrapDraftText(text, {entities, wrappingForPeerId, loadPromises, customEmojiRenderer: renderer});\n const something = fragment.querySelectorAll('[contenteditable=\"false\"]');\n something.forEach((el) => {\n el.contentEditable = 'inherit';\n el.classList.add('pc');\n });\n\n loadPromises.length && await Promise.all(loadPromises);\n\n fragment.querySelectorAll('.input-selectable').forEach((el) => {\n el.prepend(createCustomFiller(true));\n });\n\n const richInputHandler = USING_BOMS ? RichInputHandler.getInstance() : undefined;\n // const restore = richInputHandler.prepareApplyingMarkdown();\n\n // fragment.querySelectorAll('.input-filler').forEach((el) => el.remove());\n\n // const fillers = Array.from(input.querySelectorAll('.input-filler')).map((el) => {\n // el.contentEditable = 'false';\n // return el;\n // });\n\n const customEmojiElements = Array.from(fragment.querySelectorAll('.custom-emoji-placeholder')).map((el) => {\n el.dataset.ces = '1';\n return (el as any).customEmojiElement as CustomEmojiElement;\n });\n\n const html = documentFragmentToHTML(fragment);\n renderer?.destroy();\n\n // console.log(html);\n\n const pre = getCaretPosNew(input);\n // console.log('pre', pre);\n let textNode: ChildNode, textNodeValue: string;\n if(pre.node) {\n // if(pre.node?.nodeValue === BOM && false) {\n // textNode = document.createTextNode(textNodeValue = BOM);\n // (pre.node.parentNode as any as ChildNode).after(textNode);\n // pre.selection.modify('extend', 'forward', 'character');\n // pre.selection.collapseToEnd();\n // }\n } else {\n const range = document.createRange();\n let node = input.lastChild;\n if(!node) {\n input.append(node /* = textNode */ = document.createTextNode(''));\n }\n\n range.setStartAfter(node);\n range.collapse(true);\n pre.selection.removeAllRanges();\n pre.selection.addRange(range);\n }\n\n // const fragmentLastChild = fragment.lastChild;\n\n // const s = document.createElement('span');\n // (node as ChildNode).replaceWith(s);\n // s.append(node);\n input.addEventListener('input', cancelEvent, {capture: true, once: true});\n richInputHandler?.onBeforeInput({inputType: 'insertContent'});\n window.document.execCommand('insertHTML', false, html);\n Array.from(input.querySelectorAll('[data-ces]')).forEach((el, idx) => {\n delete el.dataset.ces;\n const customEmojiElement = customEmojiElements[idx];\n (el as any).customEmojiElement = customEmojiElement;\n customEmojiElement.placeholder = el;\n });\n // fillers.forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n input.querySelectorAll('.pc').forEach((el) => {\n el.contentEditable = 'false';\n });\n if(textNode) {\n const {nodeValue} = textNode;\n if(nodeValue === textNodeValue) {\n textNode.remove();\n } else {\n (textNode as CharacterData).replaceData(nodeValue.indexOf(textNodeValue), textNodeValue.length, '');\n }\n }\n // restore();\n richInputHandler?.removeExtraBOMs(input);\n simulateEvent(input, 'input');\n\n // if(textNode) {\n // const selection = document.getSelection();\n // const node = fragmentLastChild.nextSibling || fragmentLastChild;\n // const range = document.createRange();\n // range.setStartAfter(node);\n // range.collapse(true);\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }\n\n // const after = getCaretPosNew(input);\n // console.log('after', after);\n // if(after.node?.nodeValue === BOM) {\n // const smth = findUpClassName(after.node.parentElement, 'input-something');\n // if(smth) {\n // const selection = document.getSelection();\n // const node = smth.nextSibling;\n // const range = document.createRange();\n // range.setStartAfter(node);\n // range.collapse(true);\n // selection.removeAllRanges();\n // selection.addRange(range);\n\n // // if(after.offset === 0) after.selection.modify('extend', 'forward', 'character');\n // // after.selection.modify('extend', 'forward', 'character');\n // // after.selection.collapseToEnd();\n // }\n // }\n\n // setCaretAt(fragmentLastChild.nextSibling);\n\n // console.log('ASD');\n}\n\nlet init = () => {\n document.addEventListener('paste', (e) => {\n const input = findUpAttribute(e.target, 'contenteditable=\"true\"');\n if(!input) {\n return;\n }\n\n const noLinebreaks = !!input.dataset.noLinebreaks;\n e.preventDefault();\n let text: string, entities: MessageEntity[];\n\n // @ts-ignore\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\n let usePlainText = true;\n\n // @ts-ignore\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\n\n const filterEntity = (e: MessageEntity) => e._ === 'messageEntityEmoji' || (e._ === 'messageEntityLinebreak' && !noLinebreaks);\n if(noLinebreaks) {\n const regExp = /[\\r\\n]/g;\n plainText = plainText.replace(regExp, '');\n html = html.replace(regExp, '');\n }\n\n const peerId = (input.dataset.peerId || NULL_PEER_ID).toPeerId();\n if(html.trim()) {\n // console.log(html.replace(/ (style|class|id)=\".+?\"/g, ''));\n\n html = html.replace(//, '');\n html = html.replace(//, '');\n html = html.replace('
', '');\n\n const match = html.match(/([\\s\\S]*)<\\/body>/);\n if(match) {\n html = match[1].trim();\n }\n\n // const s = cleanHTML(html, true) as NodeList;\n // console.log(s);\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const span = doc.body || document.createElement('body');\n\n // const span: HTMLElement = document.createElement('span');\n // span.innerHTML = html;\n // span.append(...Array.from(s));\n\n let curChild = span.firstChild;\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\n const nextSibling = curChild.nextSibling;\n if(curChild.nodeType === curChild.TEXT_NODE) {\n if(!curChild.nodeValue.trim()) {\n curChild.remove();\n }\n }\n\n curChild = nextSibling;\n }\n\n const richValue = getRichValueWithCaret(span, true, false);\n\n const canWrapCustomEmojis = !!peerId;\n if(!canWrapCustomEmojis) {\n richValue.entities = richValue.entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\n }\n\n { // * fix extra new lines appearing from

(can have them from some sources, like macOS Terminal)\n const lines = richValue.value.split('\\n');\n let textLength = 0;\n for(let i = 0; i < lines.length; ++i) {\n const line = lines[i];\n textLength += line.length;\n const index = textLength;\n if(plainText[index] !== '\\n' && i !== (lines.length - 1)) {\n lines[i] = line + lines.splice(i + 1, 1)[0];\n }\n textLength += 1;\n }\n\n const correctedText = lines.join('\\n');\n richValue.value = correctedText;\n }\n\n const richTextLength = richValue.value.replace(/\\s/g, '').length;\n const plainTextLength = plainText.replace(/\\s/g, '').length;\n if(richTextLength === plainTextLength ||\n richValue.entities.find((entity) => entity._ === 'messageEntityCustomEmoji')) {\n text = richValue.value;\n entities = richValue.entities;\n usePlainText = false;\n\n let entities2 = parseEntities(text);\n entities2 = entities2.filter(filterEntity);\n mergeEntities(entities, entities2);\n }\n }\n\n if(usePlainText) {\n text = plainText;\n entities = parseEntities(text);\n entities = entities.filter(filterEntity);\n }\n\n insertRichTextAsHTML(input, text, entities, peerId);\n });\n\n init = null;\n};\n\n// ! it doesn't respect symbols other than strongs\n/* const checkAndSetRTL = (input: HTMLElement) => {\n //const isEmpty = isInputEmpty(input);\n //console.log('input', isEmpty);\n\n //const char = [...getRichValue(input)][0];\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\n let direction = 'ltr';\n if(char && checkRTL(char)) {\n direction = 'rtl';\n }\n\n //console.log('RTL', direction, char);\n\n input.style.direction = direction;\n}; */\n\nexport enum InputState {\n Neutral = 0,\n Valid = 1,\n Error = 2\n};\n\nexport type InputFieldOptions = {\n placeholder?: LangPackKey,\n label?: LangPackKey,\n labelOptions?: any[],\n labelText?: string | DocumentFragment,\n name?: string,\n maxLength?: number,\n showLengthOn?: number,\n plainText?: true,\n required?: boolean,\n canBeEdited?: boolean,\n validate?: () => boolean,\n inputMode?: 'tel' | 'numeric',\n withLinebreaks?: boolean,\n autocomplete?: string\n};\n\nfunction createCustomEmojiRendererForInput() {\n const renderer = CustomEmojiRendererElement.create({\n wrappingDraft: true,\n isSelectable: true\n });\n return renderer;\n}\n\nfunction processCustomEmojisInInput(input: HTMLElement) {\n const customEmojiElements = Array.from(input.querySelectorAll('.custom-emoji, .custom-emoji-placeholder'));\n let renderer = input.querySelector('.custom-emoji-renderer');\n if(!renderer && customEmojiElements.length) {\n renderer = createCustomEmojiRendererForInput();\n input.prepend(renderer);\n } else if(renderer && !customEmojiElements.length) {\n renderer.remove();\n return;\n }\n\n if(!renderer) {\n return;\n }\n\n const customEmojis: Parameters[0] = new Map();\n customEmojiElements.forEach((element) => {\n const customEmojiElement = element instanceof CustomEmojiElement ? element : (element as any).customEmojiElement as CustomEmojiElement;\n const {docId} = customEmojiElement;\n let set = customEmojis.get(docId);\n if(!set) {\n customEmojis.set(docId, set = new Set());\n }\n\n set.add(customEmojiElement);\n });\n\n for(const [docId, customEmojiElements] of customEmojis) {\n let hasSet = renderer.customEmojis.get(docId);\n if(hasSet) {\n for(const customEmojiElement of hasSet) {\n if(!customEmojiElements.has(customEmojiElement)) {\n customEmojiElement.destroy();\n }\n }\n } else {\n hasSet = new Set();\n }\n\n for(const customEmojiElement of customEmojiElements) {\n if(!hasSet.has(customEmojiElement)) {\n customEmojiElement.connectedCallback();\n }\n }\n }\n\n renderer.add(customEmojis, false);\n renderer.forceRender();\n}\n\nexport default class InputField {\n public container: HTMLElement;\n public input: HTMLElement;\n public label: HTMLLabelElement;\n\n public originalValue: string;\n\n public required: boolean;\n public validate: () => boolean;\n\n constructor(public options: InputFieldOptions = {}) {\n this.container = document.createElement('div');\n this.container.classList.add('input-field');\n\n this.required = options.required;\n this.validate = options.validate;\n\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\n }\n\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true, autocomplete} = options;\n const label = options.label || options.labelText;\n\n const onInputCallbacks: Array<() => void> = [];\n let input: HTMLElement;\n if(!plainText) {\n if(init) {\n init();\n }\n\n this.container.innerHTML = `

`;\n\n input = this.container.firstElementChild as HTMLElement;\n input.contentEditable = '' + !!canBeEdited;\n // const observer = new MutationObserver(() => {\n // //checkAndSetRTL(input);\n\n // if(processInput) {\n // processInput();\n // }\n // });\n\n RichInputHandler.getInstance();\n\n input.addEventListener('mousedown', (e) => {\n const selection = document.getSelection();\n if(!selection.isCollapsed) {\n return;\n }\n\n const placeholder = findUpTag(e.target, 'IMG');\n if(!placeholder) {\n return;\n }\n\n const rect = placeholder.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const focusOnNext = e.clientX >= centerX;\n\n const range = document.createRange();\n range.setStartAfter(focusOnNext ? placeholder : placeholder.previousSibling ?? placeholder);\n selection.removeAllRanges();\n selection.addRange(range);\n });\n\n onInputCallbacks.push(() => {\n // console.log('input');\n // return;\n // * because if delete all characters there will br left\n if(isInputEmpty(input)) {\n // const textNode = Array.from(input.childNodes).find((node) => node.nodeType === node.TEXT_NODE) || document.createTextNode('');\n input.replaceChildren();\n // input.append(document.createTextNode('')); // need first text node to support history stack\n }\n\n // const fillers = Array.from(input.querySelectorAll('.emoji-filler')) as HTMLElement[];\n // fillers.forEach((filler) => {\n // const textContent = filler.textContent;\n // if(textContent === BOM) {\n // return;\n // }\n\n // if(textContent) {\n\n // } else {\n // let curChild = filler.firstChild;\n // while(curChild) {\n // curChild = curChild.nextSibling;\n // }\n // }\n\n // filler.classList.remove('emoji-filler');\n // });\n\n // Array.from(input.querySelectorAll('br, span:empty')).forEach((el) => {\n // const parentElement = el.parentElement;\n // (parentElement === input ? el : parentElement).remove();\n // });\n USING_BOMS && Array.from(input.querySelectorAll('br:not(.br-not-br)')).forEach((el) => {\n // const parentElement = el.parentElement;\n el.remove();\n // if(!parentElement.children.length && !parentElement.textContent) {\n // parentElement.textContent = '';\n // }\n });\n\n insertCustomFillers(Array.from(input.querySelectorAll('.input-something')));\n\n processCustomEmojisInInput(input);\n\n // .forEach((el) => el.remove());\n });\n\n // ! childList for paste first symbol\n // observer.observe(input, {characterData: true, childList: true, subtree: true});\n } else {\n this.container.innerHTML = `\n \n `;\n\n input = this.container.firstElementChild as HTMLElement;\n // input.addEventListener('input', () => checkAndSetRTL(input));\n }\n\n setDirection(input);\n\n if(options.inputMode) {\n input.inputMode = options.inputMode;\n }\n\n if(placeholder) {\n _i18n(input, placeholder, undefined, 'placeholder');\n }\n\n if(label || placeholder) {\n const border = document.createElement('div');\n border.classList.add('input-field-border');\n this.container.append(border);\n }\n\n if(label) {\n this.label = document.createElement('label');\n this.setLabel();\n this.container.append(this.label);\n }\n\n if(maxLength) {\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\n let showingLength = false;\n\n const onInput = () => {\n const wasError = input.classList.contains('error');\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValueWithCaret(input, false, false).value].length;\n const diff = maxLength - inputLength;\n const isError = diff < 0;\n input.classList.toggle('error', isError);\n\n // this.onLengthChange && this.onLengthChange(inputLength, isError);\n\n if(isError || diff <= showLengthOn) {\n this.setLabel();\n labelEl.append(` (${maxLength - inputLength})`);\n if(!showingLength) showingLength = true;\n } else if((wasError && !isError) || showingLength) {\n this.setLabel();\n showingLength = false;\n }\n };\n\n onInputCallbacks.push(onInput);\n }\n\n const noLinebreaks = !options.withLinebreaks;\n if(noLinebreaks && !plainText) {\n input.dataset.noLinebreaks = '1';\n input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n e.preventDefault();\n return false;\n }\n });\n }\n\n if(onInputCallbacks.length) {\n input.addEventListener('input', () => {\n onInputCallbacks.forEach((callback) => callback());\n });\n }\n\n this.input = input;\n }\n\n public select() {\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\n return;\n }\n\n if(this.options.plainText) {\n (this.input as HTMLInputElement).select(); // * select text\n } else {\n selectElementContents(this.input);\n }\n }\n\n public setLabel() {\n this.label.textContent = '';\n if(this.options.labelText) {\n setInnerHTML(this.label, this.options.labelText);\n } else {\n this.label.append(i18n(this.options.label, this.options.labelOptions));\n }\n }\n\n get value(): string {\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValueWithCaret(this.input, false, false).value;\n // return getRichValue(this.input);\n }\n\n set value(value: Parameters[1]) {\n this.setValueSilently(value, true);\n this.simulateInputEvent();\n }\n\n public simulateInputEvent() {\n simulateEvent(this.input, 'input');\n }\n\n public setValueSilently(value: Parameters[1], fromSet?: boolean) {\n if(this.options.plainText) {\n (this.input as HTMLInputElement).value = value as string;\n } else {\n replaceContent(this.input, value);\n processCustomEmojisInInput(this.input);\n }\n }\n\n public isChanged() {\n return this.value !== this.originalValue;\n }\n\n public isValid() {\n return !this.input.classList.contains('error') &&\n (!this.validate || this.validate()) &&\n (!this.required || !isInputEmpty(this.input));\n }\n\n public isValidToChange() {\n return this.isValid() && this.isChanged();\n }\n\n public setDraftValue(value = '', silent?: boolean) {\n if(!this.options.plainText) {\n value = documentFragmentToHTML(wrapDraftText(value));\n }\n\n if(silent) {\n this.setValueSilently(value, false);\n } else {\n this.value = value;\n }\n }\n\n public setOriginalValue(value: InputField['originalValue'] = '', silent?: boolean) {\n this.originalValue = value;\n this.setDraftValue(value, silent);\n }\n\n public setState(state: InputState, label?: LangPackKey) {\n if(label) {\n this.label.textContent = '';\n this.label.append(i18n(label, this.options.labelOptions));\n } else {\n this.setLabel();\n }\n\n this.input.classList.toggle('error', !!(state & InputState.Error));\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\n }\n\n public setError(label?: LangPackKey) {\n this.setState(InputState.Error, label);\n }\n}\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { getRichValue } from \"../helpers/dom\";\nimport {LangPackKey} from '../lib/langPack';\nimport InputField from './inputField';\n\nexport default class InputSearch {\n public container: HTMLElement;\n public input: HTMLElement;\n public inputField: InputField;\n public clearBtn: HTMLElement;\n\n public prevValue = '';\n public timeout = 0;\n public onChange: (value: string) => void;\n public onClear: () => void;\n\n constructor(placeholder: LangPackKey, onChange?: (value: string) => void) {\n this.inputField = new InputField({\n placeholder,\n plainText: true\n });\n\n this.container = this.inputField.container;\n this.container.classList.remove('input-field');\n this.container.classList.add('input-search');\n\n this.onChange = onChange;\n\n this.input = this.inputField.input;\n this.input.classList.add('input-search-input');\n\n const searchIcon = document.createElement('i');\n searchIcon.classList.add('tgico', 'tgico-search');\n\n this.clearBtn = document.createElement('i');\n this.clearBtn.classList.add('tgico', 'btn-icon', 'tgico-close');\n\n this.input.addEventListener('input', this.onInput);\n this.clearBtn.addEventListener('click', this.onClearClick);\n\n this.container.append(searchIcon, this.clearBtn);\n }\n\n onInput = () => {\n if(!this.onChange) return;\n\n const value = this.value;\n\n // this.input.classList.toggle('is-empty', !value.trim());\n\n if(value !== this.prevValue) {\n this.prevValue = value;\n clearTimeout(this.timeout);\n this.timeout = window.setTimeout(() => {\n this.onChange(value);\n }, 200);\n }\n };\n\n onClearClick = () => {\n this.value = '';\n this.onChange && this.onChange('');\n this.onClear && this.onClear();\n };\n\n get value() {\n return this.inputField.value;\n }\n\n set value(value: string) {\n this.prevValue = value;\n clearTimeout(this.timeout);\n this.inputField.value = value;\n }\n\n public remove() {\n clearTimeout(this.timeout);\n this.input.removeEventListener('input', this.onInput);\n this.clearBtn.removeEventListener('click', this.onClearClick);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport VisibilityIntersector, {OnVisibilityChangeItem} from './visibilityIntersector';\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\n\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\n constructor(parallelLimit?: number, ignoreHeavyAnimation?: boolean) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\n\n !ignoreHeavyAnimation && useHeavyAnimationCheck(() => {\n this.lock();\n }, () => {\n this.unlockAndRefresh();\n });\n }\n\n private onVisibilityChange = ({target, visible}: OnVisibilityChangeItem) => {\n // if(DEBUG) {\n // this.log('isIntersecting', target, visible);\n // }\n\n // if visible - will move to the end of visible arary\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach((item) => {\n if(visible) {\n item.wasSeen = true;\n }\n\n item.visible = visible;\n const index = this.queue.findIndex((item) => !item.visible);\n this.queue.splice(Math.max(0, index), 0, item);\n });\n\n this.setProcessQueueTimeout();\n };\n\n protected getItem() {\n return findAndSplice(this.queue, (item) => item.wasSeen);\n }\n\n public async processItem(item: LazyLoadElement) {\n await super.processItem(item);\n this.intersector.unobserve(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const inserted = super.addElement(method, el);\n\n if(!inserted) return false;\n\n this.observe(el);\n /* if(el.wasSeen) {\n this.processQueue(el);\n } else */\n el.wasSeen ??= false;\n\n return true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueBase, {LazyLoadElementBase} from './lazyLoadQueueBase';\nimport VisibilityIntersector from './visibilityIntersector';\n\nexport type LazyLoadElement = Omit & {\n load: (target?: HTMLElement) => Promise,\n div: HTMLElement\n wasSeen?: boolean,\n visible?: boolean\n};\n\nexport default class LazyLoadQueueIntersector extends LazyLoadQueueBase {\n protected queue: Array = [];\n protected inProcess: Set = new Set();\n\n public intersector: VisibilityIntersector;\n protected intersectorTimeout: number;\n\n constructor(parallelLimit?: number) {\n super(parallelLimit);\n }\n\n public lock() {\n super.lock();\n this.intersector.lock();\n }\n\n public unlock() {\n super.unlock();\n this.intersector.unlock();\n }\n\n public unlockAndRefresh() {\n super.unlock();\n this.intersector.unlockAndRefresh();\n }\n\n public clear() {\n super.clear();\n this.intersector.disconnect();\n }\n\n public refresh() {\n this.intersector.refresh();\n }\n\n protected loadItem(item: LazyLoadElement) {\n return item.load(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const item = this.queue.find((i) => i.div === el.div && i.load === el.load);\n if(item) {\n return false;\n } else {\n for(const item of this.inProcess) {\n if(item.div === el.div && item.load === el.load) {\n return false;\n }\n }\n }\n\n this.queue[method](el);\n return true;\n }\n\n protected setProcessQueueTimeout() {\n this.intersectorTimeout ??= window.setTimeout(() => {\n this.intersectorTimeout = undefined;\n this.processQueue();\n }, 0);\n }\n\n public push(el: LazyLoadElement) {\n super.push(el);\n }\n\n public unshift(el: LazyLoadElement) {\n super.unshift(el);\n }\n\n public delete(el: Omit) {\n findAndSpliceAll(this.queue, (i) => i.div === el.div);\n this.unobserve(el);\n }\n\n public observe(el: LazyLoadElement) {\n this.intersector.observe(el.div);\n }\n\n public unobserve(el: Omit) {\n this.intersector.unobserve(el.div);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GrabEvent} from '../helpers/dom/attachGrabListeners';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport RangeSelector from './rangeSelector';\n\nexport default class MediaProgressLine extends RangeSelector {\n protected filledLoad: HTMLDivElement;\n\n protected progressRAF = 0;\n\n protected media: HTMLMediaElement;\n protected streamable: boolean;\n\n constructor(media?: HTMLAudioElement | HTMLVideoElement, streamable?: boolean, withTransition?: boolean, useTransform?: boolean) {\n super({\n step: 1000 / 60 / 1000,\n min: 0,\n max: 1,\n withTransition,\n useTransform\n }, 0);\n\n if(media) {\n this.setMedia(media, streamable);\n }\n }\n\n public setMedia(media: HTMLMediaElement, streamable = false) {\n if(this.media) {\n this.removeListeners();\n }\n\n if(streamable && !this.filledLoad) {\n this.filledLoad = document.createElement('div');\n this.filledLoad.classList.add('progress-line__filled', 'progress-line__loaded');\n this.container.prepend(this.filledLoad);\n // this.setLoadProgress();\n } else if(this.filledLoad) {\n this.filledLoad.classList.toggle('hide', !streamable);\n }\n\n this.media = media;\n this.streamable = streamable;\n if(!media.paused || media.currentTime > 0) {\n this.onPlay();\n }\n\n let wasPlaying = false;\n this.setSeekMax();\n this.setListeners();\n this.setHandlers({\n onMouseDown: () => {\n wasPlaying = !this.media.paused;\n wasPlaying && this.media.pause();\n },\n\n onMouseUp: (e) => {\n // cancelEvent(e.event);\n wasPlaying && this.media.play();\n }\n });\n }\n\n protected onLoadedData = () => {\n this.max = this.media.duration;\n this.seek.setAttribute('max', '' + this.max);\n };\n\n protected onEnded = () => {\n this.setProgress();\n };\n\n protected onPlay = () => {\n const r = () => {\n this.setProgress();\n\n this.progressRAF = this.media.paused ? 0 : window.requestAnimationFrame(r);\n };\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n }\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n\n this.progressRAF = window.requestAnimationFrame(r);\n };\n\n protected onTimeUpdate = () => {\n if(this.media.paused) {\n this.setProgress();\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n }\n };\n\n protected onProgress = (e: Event) => {\n this.setLoadProgress();\n };\n\n protected scrub(e: GrabEvent) {\n const scrubTime = super.scrub(e);\n this.media.currentTime = scrubTime;\n return scrubTime;\n }\n\n protected setLoadProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const buf = this.media.buffered;\n const numRanges = buf.length;\n\n const currentTime = this.media.currentTime;\n let nearestStart = 0, end = 0;\n for(let i = 0; i < numRanges; ++i) {\n const start = buf.start(i);\n if(currentTime >= start && start >= nearestStart) {\n nearestStart = start;\n end = buf.end(i);\n }\n\n // console.log('onProgress range:', i, buf.start(i), buf.end(i), this.media);\n }\n\n // console.log('onProgress correct range:', nearestStart, end, this.media);\n\n const percents = this.media.duration ? end / this.media.duration : 0;\n this.filledLoad.style.width = (percents * 100) + '%';\n // this.filledLoad.style.transform = 'scaleX(' + percents + ')';\n }\n\n protected setSeekMax() {\n this.max = this.media.duration || 0;\n if(this.max > 0) {\n this.onLoadedData();\n } else {\n this.media.addEventListener('loadeddata', this.onLoadedData);\n }\n }\n\n public setProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const currentTime = this.media.currentTime;\n\n super.setProgress(currentTime);\n }\n\n public setListeners() {\n super.setListeners();\n this.media.addEventListener('ended', this.onEnded);\n this.media.addEventListener('play', this.onPlay);\n this.media.addEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.addEventListener('progress', this.onProgress);\n }\n\n public removeListeners() {\n super.removeListeners();\n\n if(this.media) {\n this.media.removeEventListener('loadeddata', this.onLoadedData);\n this.media.removeEventListener('ended', this.onEnded);\n this.media.removeEventListener('play', this.onPlay);\n this.media.removeEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.removeEventListener('progress', this.onProgress);\n }\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n this.progressRAF = 0;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {FontFamily, FontSize, FontWeight} from '../config/font';\nimport getTextWidth from '../helpers/canvas/getTextWidth';\nimport mediaSizes from '../helpers/mediaSizes';\nimport clamp from '../helpers/number/clamp';\nimport {fastRaf} from '../helpers/schedulers';\n\n// Thanks to https://stackoverflow.com/a/49349813\n\n/**\n * Attibute modifier to create middle ellipsis\n * When the attribute value is left blank the ellipsis will be in the middle\n * When positive the attribute value will be used as a percentage\n * When negative the attribute value will be used as character index counted from the end\n * @example\n *
A Javascript solution to middle ellipsis
\n *
A Javascript solution to middle ellipsis
\n *
A Javascript solution to middle ellipsis
\n */\nconst ellipsis = '…';\nconst map: Map = new Map();\n\nconst testQueue: Set = new Set();\nconst fontSize = '16px';\nlet pendingTest = false;\n\nfunction setTestQueue() {\n if(pendingTest) {\n return;\n }\n\n pendingTest = true;\n fastRaf(() => {\n pendingTest = false;\n testQueueElements();\n });\n}\n\nfunction testQueueElements() {\n testQueue.forEach(testElement);\n testQueue.clear();\n}\n\nwindow.addEventListener('resize', () => {\n for(const [key] of map) {\n testQueue.add(key);\n }\n\n setTestQueue();\n}, {capture: true, passive: true});\n\nfunction getElementWidth(element: HTMLElement) {\n const type = element.dataset.sizeType;\n if(type) {\n const mediaSize = mediaSizes.active;\n // @ts-ignore\n const size: MediaSize = mediaSize[type];\n return size.width;\n }\n\n return element.getBoundingClientRect().width;\n}\n\nfunction testElement(element: HTMLElement) {\n // const perf = performance.now();\n // do not recalculate variables a second time\n let mapped = map.get(element);\n const firstTime = !mapped;\n\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\n // console.log('[MEE] testElement got mapped', mapped);\n\n if(firstTime) {\n text = element.textContent;\n textLength = text.length;\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\n multiplier = from > 0 && from / 100;\n\n let fontSize = element.dataset.fontSize;\n if(fontSize && +fontSize) fontSize += 'px';\n // const perf = performance.now();\n font = `${element.dataset.fontWeight || FontWeight} ${fontSize || FontSize} ${FontFamily}`;\n /* const computedStyle = window.getComputedStyle(elm, null);\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\n // console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\n\n textWidth = getTextWidth(text, font);\n // const perf = performance.now();\n elementWidth = getElementWidth(element);\n // console.log('testMiddleEllipsis get offsetWidth:', performance.now() - perf, font);\n mapped = {text, textLength, from, multiplier, font, textWidth, elementWidth};\n map.set(element, mapped);\n\n // console.log('[MEE] testElement map set', element);\n }\n\n const newElementWidth = getElementWidth(element);\n const widthChanged = firstTime || elementWidth !== newElementWidth;\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\n\n if(widthChanged) {\n if(textWidth > elementWidth) {\n element.setAttribute('title', text);\n let smallerText = text;\n let smallerWidth = elementWidth;\n while(smallerText.length > 3) {\n const smallerTextLength = smallerText.length;\n const half = multiplier &&\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\n Math.max(smallerTextLength + from - 1, 1);\n const half1 = smallerText.substr(0, half).replace(/\\s*$/, '');\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/, '');\n smallerText = half1 + half2;\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\n if(smallerWidth < elementWidth) {\n element.textContent = half1 + ellipsis + half2;\n break;\n }\n }\n\n // * set new width after cutting text\n mapped.elementWidth = getElementWidth(element);\n // mapped.textWidth = smallerWidth;\n } else {\n element.removeAttribute('title');\n }\n }\n\n // console.log('testMiddleEllipsis for element:', elm, performance.now() - perf);\n}\n\nexport class MiddleEllipsisElement extends HTMLElement {\n connectedCallback() {\n // console.log('[MEE]: connectedCallback before', map.has(this), testQueue.has(this), map.size, this.textContent, map);\n\n map.set(this, null);\n if(this.dataset.sizeType) {\n testElement(this);\n } else {\n testQueue.add(this);\n setTestQueue();\n }\n // testElement(this);\n\n // console.log('[MEE]: connectedCallback after', map.has(this), map.size, testQueue.has(this), testQueue.size);\n }\n\n disconnectedCallback() {\n const deleted = map.delete(this);\n testQueue.delete(this);\n // console.log('[MEE]: disconnectedCallback', deleted, map.has(this), map.size, this.textContent, map);\n }\n}\n\ncustomElements.define('middle-ellipsis-element', MiddleEllipsisElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport lottieLoader, {LottieLoader} from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport PasswordInputField from '../passwordInputField';\n\nexport default class PasswordMonkey {\n public container: HTMLElement;\n public animation: RLottiePlayer;\n public needFrame = 0;\n protected loadPromise: ReturnType;\n\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size,\n noCache: true\n // }, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\n // return;\n this.animation = _animation;\n this.animation.addEventListener('enterFrame', currentFrame => {\n // console.log('enterFrame', currentFrame, this.needFrame);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n }\n });\n\n this.passwordInputField.helpers.onVisibilityClickAdditional = () => {\n if(this.passwordInputField.helpers.passwordVisible) {\n this.animation.setDirection(1);\n this.animation.curFrame = 0;\n this.needFrame = 16;\n this.animation.play();\n } else {\n this.animation.setDirection(-1);\n this.animation.curFrame = 16;\n this.needFrame = 0;\n this.animation.play();\n }\n };\n\n return lottieLoader.waitForFirstFrame(_animation);\n });\n }\n\n public remove() {\n if(this.animation) {\n this.animation.remove();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from '../inputField';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\n\nexport default class TrackingMonkey {\n public container: HTMLElement;\n\n protected max = 45;\n protected needFrame = 0;\n\n protected animation: RLottiePlayer;\n protected idleAnimation: RLottiePlayer;\n\n protected loadPromise: Promise;\n\n constructor(protected inputField: InputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n\n const input = inputField.input;\n\n input.addEventListener('blur', () => {\n this.playAnimation(0);\n });\n\n input.addEventListener('input', (e) => {\n this.playAnimation(inputField.value.length);\n });\n\n /* codeInput.addEventListener('focus', () => {\n playAnimation(Math.max(codeInput.value.length, 1));\n }); */\n }\n\n // 1st symbol = frame 15\n // end symbol = frame 165\n public playAnimation(length: number) {\n if(!this.animation) return;\n\n length = Math.min(length, 30);\n let frame: number;\n if(length) {\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\n\n if(this.idleAnimation) {\n this.idleAnimation.stop(true);\n this.idleAnimation.canvas[0].style.display = 'none';\n }\n\n this.animation.canvas[0].style.display = '';\n } else {\n /* const cb = (frameNo: number) => {\n if(frameNo <= 1) { */\n /* idleAnimation.play();\n idleAnimation.canvas.style.display = '';\n animation.canvas.style.display = 'none'; */\n /* animation.removeListener('enterFrame', cb);\n }\n };\n animation.addListener('enterFrame', cb); */\n\n frame = 0;\n }\n // animation.playSegments([1, 2]);\n\n const direction = this.needFrame > frame ? -1 : 1;\n // console.log('keydown', length, frame, direction);\n\n this.animation.setDirection(direction);\n if(this.needFrame !== 0 && frame === 0) {\n this.animation.setSpeed(7);\n }\n /* let diff = Math.abs(needFrame - frame * direction);\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\n this.needFrame = frame;\n\n this.animation.play();\n\n /* animation.goToAndStop(15, true); */\n // animation.goToAndStop(length / max * );\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = Promise.all([\n lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: true,\n autoplay: true,\n width: this.size,\n height: this.size\n }, 'TwoFactorSetupMonkeyIdle').then((animation) => {\n this.idleAnimation = animation;\n\n // ! animationIntersector will stop animation instantly\n if(!this.inputField.value.length) {\n animation.play();\n }\n\n return lottieLoader.waitForFirstFrame(animation);\n }),\n\n lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size\n }, 'TwoFactorSetupMonkeyTracking').then((_animation) => {\n this.animation = _animation;\n\n if(!this.inputField.value.length) {\n this.animation.canvas[0].style.display = 'none';\n }\n\n this.animation.addEventListener('enterFrame', currentFrame => {\n // console.log('enterFrame', currentFrame, needFrame);\n // let currentFrame = Math.round(e.currentTime);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n }\n\n if(currentFrame === 0 && this.needFrame === 0) {\n // animation.curFrame = 0;\n\n if(this.idleAnimation) {\n this.idleAnimation.canvas[0].style.display = '';\n this.idleAnimation.play();\n this.animation.canvas[0].style.display = 'none';\n }\n }\n });\n // console.log(animation.getDuration(), animation.getDuration(true));\n\n return lottieLoader.waitForFirstFrame(_animation);\n })\n ]);\n }\n\n public remove() {\n if(this.animation) this.animation.remove();\n if(this.idleAnimation) this.idleAnimation.remove();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport InputField, {InputFieldOptions} from './inputField';\n\nexport class PasswordInputHelpers {\n public passwordVisible = false;\n public toggleVisible: HTMLElement;\n public onVisibilityClickAdditional: () => void;\n\n constructor(public container: HTMLElement, public input: HTMLInputElement) {\n input.type = 'password';\n input.setAttribute('required', '');\n input.name = 'notsearch_password';\n input.autocomplete = 'off';\n\n // * https://stackoverflow.com/a/35949954/6758968\n const stealthy = document.createElement('input');\n stealthy.classList.add('stealthy');\n stealthy.tabIndex = -1;\n stealthy.type = 'password';\n input.parentElement.prepend(stealthy);\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\n\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\n input.setAttribute('readonly', '');\n input.addEventListener('focus', () => {\n input.removeAttribute('readonly');\n }, {once: true});\n } */\n\n const toggleVisible = this.toggleVisible = document.createElement('span');\n toggleVisible.classList.add('toggle-visible', 'tgico');\n\n container.classList.add('input-field-password');\n container.append(toggleVisible);\n\n toggleVisible.addEventListener('click', this.onVisibilityClick);\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\n }\n\n public onVisibilityClick = (e: Event) => {\n cancelEvent(e);\n this.passwordVisible = !this.passwordVisible;\n\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\n };\n}\n\nexport default class PasswordInputField extends InputField {\n public helpers: PasswordInputHelpers;\n\n constructor(options: InputFieldOptions = {}) {\n super({\n plainText: true,\n ...options\n });\n\n this.helpers = new PasswordInputHelpers(this.container, this.input as HTMLInputElement);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from '../environment/parallaxSupport';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport filterChatPhotosMessages from '../helpers/filterChatPhotosMessages';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ListLoader from '../helpers/listLoader';\nimport {fastRaf} from '../helpers/schedulers';\nimport {Message, ChatFull, MessageAction, Photo} from '../layer';\nimport type {AppMessagesManager} from '../lib/appManagers/appMessagesManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport {openAvatarViewer} from './avatar';\nimport {putAvatar} from './putPhoto';\nimport Scrollable from './scrollable';\nimport SwipeHandler from './swipeHandler';\nimport wrapPhoto from './wrappers/photo';\n\nconst LOAD_NEAREST = 3;\n\nexport default class PeerProfileAvatars {\n private static BASE_CLASS = 'profile-avatars';\n private static SCALE = IS_PARALLAX_SUPPORTED ? 2 : 1;\n private static TRANSLATE_TEMPLATE = IS_PARALLAX_SUPPORTED ? `translate3d({x}, 0, -1px) scale(${PeerProfileAvatars.SCALE})` : 'translate({x}, 0)';\n public container: HTMLElement;\n public avatars: HTMLElement;\n public gradient: HTMLElement;\n public info: HTMLElement;\n public arrowPrevious: HTMLElement;\n public arrowNext: HTMLElement;\n private tabs: HTMLDivElement;\n private listLoader: ListLoader;\n private peerId: PeerId;\n private intersectionObserver: IntersectionObserver;\n private loadCallbacks: Map void>;\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\n\n constructor(\n public scrollable: Scrollable,\n private managers: AppManagers\n ) {\n this.container = document.createElement('div');\n this.container.classList.add(PeerProfileAvatars.BASE_CLASS + '-container');\n\n this.avatars = document.createElement('div');\n this.avatars.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatars');\n\n this.gradient = document.createElement('div');\n this.gradient.classList.add(PeerProfileAvatars.BASE_CLASS + '-gradient');\n\n this.info = document.createElement('div');\n this.info.classList.add(PeerProfileAvatars.BASE_CLASS + '-info');\n\n this.tabs = document.createElement('div');\n this.tabs.classList.add(PeerProfileAvatars.BASE_CLASS + '-tabs');\n\n this.arrowPrevious = document.createElement('div');\n this.arrowPrevious.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', 'tgico-avatarprevious');\n\n /* const previousIcon = document.createElement('i');\n previousIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-previous');\n this.arrowBack.append(previousIcon); */\n\n this.arrowNext = document.createElement('div');\n this.arrowNext.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', PeerProfileAvatars.BASE_CLASS + '-arrow-next', 'tgico-avatarnext');\n\n /* const nextIcon = document.createElement('i');\n nextIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-next');\n this.arrowNext.append(nextIcon); */\n\n this.container.append(this.avatars, this.gradient, this.info, this.tabs, this.arrowPrevious, this.arrowNext);\n\n this.loadCallbacks = new Map();\n this.listenerSetter = new ListenerSetter();\n\n const checkScrollTop = () => {\n if(this.scrollable.scrollTop !== 0) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement,\n position: 'start'\n });\n return false;\n }\n\n return true;\n };\n\n const SWITCH_ZONE = 1 / 3;\n let cancel = false;\n let freeze = false;\n attachClickEvent(this.container, async(_e) => {\n if(freeze) {\n cancelEvent(_e);\n return;\n }\n\n if(cancel) {\n cancel = false;\n return;\n }\n\n if(!checkScrollTop()) {\n return;\n }\n\n const rect = this.container.getBoundingClientRect();\n\n // const e = (_e as TouchEvent).touches ? (_e as TouchEvent).touches[0] : _e as MouseEvent;\n const e = _e;\n const x = e.pageX;\n\n const clickX = x - rect.left;\n if((!this.listLoader.previous.length && !this.listLoader.next.length) ||\n (clickX > (rect.width * SWITCH_ZONE) && clickX < (rect.width - rect.width * SWITCH_ZONE))) {\n const peerId = this.peerId;\n\n const targets: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[] = [];\n this.listLoader.previous.concat(this.listLoader.current, this.listLoader.next).forEach((item, idx) => {\n targets.push({\n element: /* null */this.avatars.children[idx] as HTMLElement,\n item\n });\n });\n\n const prevTargets = targets.slice(0, this.listLoader.previous.length);\n const nextTargets = targets.slice(this.listLoader.previous.length + 1);\n\n const target = this.avatars.children[this.listLoader.previous.length] as HTMLElement;\n freeze = true;\n openAvatarViewer(target, peerId, () => peerId === this.peerId, this.listLoader.current, prevTargets, nextTargets);\n freeze = false;\n } else {\n const centerX = rect.right - (rect.width / 2);\n const toRight = x > centerX;\n\n // this.avatars.classList.remove('no-transition');\n // fastRaf(() => {\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n\n let distance: number;\n if(this.listLoader.index === 0 && !toRight) distance = this.listLoader.count - 1;\n else if(this.listLoader.index === (this.listLoader.count - 1) && toRight) distance = -(this.listLoader.count - 1);\n else distance = toRight ? 1 : -1;\n this.listLoader.go(distance);\n\n fastRaf(() => {\n this.avatars.classList.remove('no-transition');\n });\n // });\n }\n }, {listenerSetter: this.listenerSetter});\n\n const cancelNextClick = () => {\n cancel = true;\n document.body.addEventListener(IS_TOUCH_SUPPORTED ? 'touchend' : 'click', (e) => {\n cancel = false;\n }, {once: true});\n };\n\n let width = 0, x = 0, lastDiffX = 0, /* lastIndex = 0, */ minX = 0;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.avatars,\n onSwipe: (xDiff, yDiff) => {\n xDiff *= -1;\n yDiff *= -1;\n\n lastDiffX = xDiff;\n let lastX = x + xDiff * -PeerProfileAvatars.SCALE;\n if(lastX > 0) lastX = 0;\n else if(lastX < minX) lastX = minX;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', lastX + 'px');\n // console.log(xDiff, yDiff);\n return false;\n },\n verifyTouchTarget: (e) => {\n if(!checkScrollTop()) {\n cancelNextClick();\n cancelEvent(e as any as Event);\n return false;\n } else if(this.container.classList.contains('is-single') || freeze) {\n return false;\n }\n\n return true;\n },\n onFirstSwipe: () => {\n const rect = this.avatars.getBoundingClientRect();\n width = rect.width;\n minX = -width * (this.tabs.childElementCount - 1);\n\n /* lastIndex = whichChild(this.tabs.querySelector('.active'));\n x = -width * lastIndex; */\n x = rect.left - this.container.getBoundingClientRect().left;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', x + 'px');\n\n this.container.classList.add('is-swiping');\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n },\n onReset: () => {\n const addIndex = Math.ceil(Math.abs(lastDiffX) / (width / PeerProfileAvatars.SCALE)) * (lastDiffX >= 0 ? 1 : -1);\n cancelNextClick();\n\n // console.log(addIndex);\n\n this.avatars.classList.remove('no-transition');\n fastRaf(() => {\n this.listLoader.go(addIndex);\n this.container.classList.remove('is-swiping');\n });\n }\n });\n\n this.intersectionObserver = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if(!entry.isIntersecting) {\n return;\n }\n\n this.loadNearestToTarget(entry.target);\n });\n });\n\n /* this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\n if(this.peerId === peerId) {\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(photo) {\n const id = photo.photo_id;\n const previous = this.listLoader.previous;\n for(let i = 0; i < previous.length; ++i) {\n if(previous[i] === id)\n }\n this.listLoader.previous.forEach((_id, idx, arr) => {});\n }\n }\n }); */\n }\n\n public async setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n const photo = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(!photo) {\n return;\n }\n\n const listLoader: PeerProfileAvatars['listLoader'] = this.listLoader = new ListLoader({\n loadCount: 50,\n loadMore: (anchor, older, loadCount) => {\n if(!older) return Promise.resolve({count: undefined, items: []});\n\n if(peerId.isUser()) {\n const maxId: Photo.photo['id'] = anchor as any;\n return this.managers.appPhotosManager.getUserPhotos(peerId, maxId, loadCount).then((value) => {\n return {\n count: value.count,\n items: value.photos\n };\n });\n } else {\n const promises: [Promise | ChatFull, ReturnType] = [] as any;\n if(!listLoader.current) {\n promises.push(this.managers.appProfileManager.getChatFull(peerId.toChatId()));\n }\n\n promises.push(this.managers.appMessagesManager.getSearch({\n peerId,\n maxId: Number.MAX_SAFE_INTEGER,\n inputFilter: {\n _: 'inputMessagesFilterChatPhotos'\n },\n limit: loadCount,\n backLimit: 0\n }));\n\n return Promise.all(promises).then(async(result) => {\n const value = result.pop() as typeof result[1];\n\n filterChatPhotosMessages(value);\n\n if(!listLoader.current) {\n const chatFull = result[0];\n const message = findAndSplice(value.history, (message) => {\n return ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo.id === chatFull.chat_photo.id;\n }) as Message.messageService;\n\n listLoader.current = message || await this.managers.appMessagesManager.generateFakeAvatarMessage(this.peerId, chatFull.chat_photo);\n }\n\n // console.log('avatars loaded:', value);\n return {\n count: value.count,\n items: value.history\n };\n });\n }\n },\n processItem: this.processItem,\n onJump: (item, older) => {\n const id = this.listLoader.index;\n // const nextId = Math.max(0, id);\n const x = 100 * PeerProfileAvatars.SCALE * id;\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', `-${x}%`);\n\n const activeTab = this.tabs.querySelector('.active');\n if(activeTab) activeTab.classList.remove('active');\n\n const tab = this.tabs.children[id] as HTMLElement;\n tab.classList.add('active');\n\n this.loadNearestToTarget(this.avatars.children[id]);\n }\n });\n\n if(photo._ === 'userProfilePhoto') {\n listLoader.current = photo.photo_id;\n }\n\n await this.processItem(listLoader.current);\n\n // listLoader.loaded\n listLoader.load(true);\n }\n\n public addTab() {\n const tab = document.createElement('div');\n tab.classList.add(PeerProfileAvatars.BASE_CLASS + '-tab');\n this.tabs.append(tab);\n\n if(this.tabs.childElementCount === 1) {\n tab.classList.add('active');\n }\n\n this.container.classList.toggle('is-single', this.tabs.childElementCount <= 1);\n }\n\n public processItem = async(photoId: Photo.photo['id'] | Message.messageService) => {\n const avatar = document.createElement('div');\n avatar.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatar', 'media-container', 'hide');\n\n this.avatars.append(avatar);\n\n let photo: Photo.photo;\n if(photoId) {\n photo = typeof(photoId) !== 'object' ?\n await this.managers.appPhotosManager.getPhoto(photoId) :\n (photoId.action as MessageAction.messageActionChannelEditPhoto).photo as Photo.photo;\n }\n\n const img = new Image();\n img.classList.add('avatar-photo');\n img.draggable = false;\n\n const loadCallback = async() => {\n if(photo) {\n const res = await wrapPhoto({\n container: avatar,\n photo,\n size: choosePhotoSize(photo, 420, 420, false),\n withoutPreloader: true\n });\n\n [res.images.thumb, res.images.full].filter(Boolean).forEach((img) => {\n img.classList.add('avatar-photo');\n });\n } else {\n const photo = await this.managers.appPeersManager.getPeerPhoto(this.peerId);\n await putAvatar(avatar, this.peerId, photo, 'photo_big', img);\n }\n\n avatar.classList.remove('hide');\n };\n\n if(this.avatars.childElementCount <= LOAD_NEAREST) {\n await loadCallback();\n } else {\n this.intersectionObserver.observe(avatar);\n this.loadCallbacks.set(avatar, loadCallback);\n }\n\n this.addTab();\n\n return photoId;\n };\n\n private loadNearestToTarget(target: Element) {\n const children = Array.from(target.parentElement.children);\n const idx = children.indexOf(target);\n const slice = children.slice(Math.max(0, idx - LOAD_NEAREST), Math.min(children.length, idx + LOAD_NEAREST));\n\n slice.forEach((target) => {\n const callback = this.loadCallbacks.get(target);\n if(callback) {\n callback();\n this.loadCallbacks.delete(target);\n this.intersectionObserver.unobserve(target);\n }\n });\n }\n\n public cleanup() {\n this.listenerSetter.removeAll();\n this.swipeHandler.removeListeners();\n this.intersectionObserver?.disconnect();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from '../environment/parallaxSupport';\nimport deferredPromise from '../helpers/cancellablePromise';\nimport {copyTextToClipboard} from '../helpers/clipboard';\nimport anchorCopy from '../helpers/dom/anchorCopy';\nimport {simulateClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport makeError from '../helpers/makeError';\nimport {makeMediaSize} from '../helpers/mediaSize';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport middlewarePromise from '../helpers/middlewarePromise';\nimport {Chat, ChatFull, User, UserFull} from '../layer';\nimport appImManager from '../lib/appManagers/appImManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getServerMessageId from '../lib/appManagers/utils/messageId/getServerMessageId';\nimport getPeerActiveUsernames from '../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport I18n, {i18n, join} from '../lib/langPack';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../lib/rootScope';\nimport AvatarElement from './avatar';\nimport CheckboxField from './checkboxField';\nimport {generateDelimiter} from './generateDelimiter';\nimport PeerProfileAvatars from './peerProfileAvatars';\nimport Row from './row';\nimport Scrollable from './scrollable';\nimport SettingSection from './settingSection';\nimport {toast} from './toast';\nimport formatUserPhone from './wrappers/formatUserPhone';\nimport wrapPeerTitle from './wrappers/peerTitle';\nimport wrapTopicNameButton from './wrappers/topicNameButton';\n\nconst setText = (text: Parameters[1], row: Row) => {\n // fastRaf(() => {\n setInnerHTML(row.title, text || '');\n row.container.style.display = text ? '' : 'none';\n // });\n};\n\nexport default class PeerProfile {\n public element: HTMLElement;\n private avatars: PeerProfileAvatars;\n private avatar: AvatarElement;\n private section: SettingSection;\n private name: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private bio: Row;\n private username: Row;\n private phone: Row;\n private notifications: Row;\n private location: Row;\n private link: Row;\n\n private cleaned: boolean;\n private setMoreDetailsTimeout: number;\n private setPeerStatusInterval: number;\n\n private peerId: PeerId;\n private threadId: number;\n\n private middlewareHelper: MiddlewareHelper;\n\n constructor(\n private managers: AppManagers,\n public scrollable: Scrollable,\n private listenerSetter?: ListenerSetter,\n private isDialog = true\n ) {\n if(!IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('no-parallax');\n }\n\n if(!listenerSetter) {\n this.listenerSetter = new ListenerSetter();\n }\n\n this.middlewareHelper = getMiddleware();\n }\n\n public init() {\n this.init = null;\n\n\n this.element = document.createElement('div');\n this.element.classList.add('profile-content');\n\n this.section = new SettingSection({\n noDelimiter: true\n });\n\n this.name = document.createElement('div');\n this.name.classList.add('profile-name');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('profile-subtitle');\n\n this.bio = new Row({\n title: ' ',\n subtitle: true,\n icon: 'info',\n clickable: (e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n\n copyTextToClipboard(this.bio.title.textContent);\n toast(I18n.format('BioCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_About',\n onClick: () => {\n simulateClickEvent(this.bio.container);\n },\n verify: () => !this.peerId.isUser()\n }, {\n icon: 'copy',\n text: 'Text.CopyLabel_Bio',\n onClick: () => {\n simulateClickEvent(this.bio.container);\n },\n verify: () => this.peerId.isUser()\n }]\n }\n });\n\n this.bio.title.classList.add('pre-wrap');\n\n this.username = new Row({\n title: ' ',\n subtitleLangKey: 'Username',\n icon: 'username',\n clickable: () => {\n // const username = await this.managers.appPeersManager.getPeerUsername(this.peerId);\n copyTextToClipboard('@' + this.username.title.textContent);\n toast(I18n.format('UsernameCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_Username',\n onClick: () => {\n simulateClickEvent(this.username.container);\n }\n }]\n }\n });\n\n this.phone = new Row({\n title: ' ',\n subtitle: true,\n icon: 'phone',\n clickable: () => {\n copyTextToClipboard(this.phone.title.textContent.replace(/\\s/g, ''));\n toast(I18n.format('PhoneCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_PhoneNumber',\n onClick: () => {\n simulateClickEvent(this.phone.container);\n }\n }, {\n icon: 'info',\n text: 'PeerInfo.Phone.AnonymousInfo',\n textArgs: [(() => {\n const a = document.createElement('a');\n return a;\n })()],\n onClick: () => {\n window.open('https://fragment.com/numbers', '_blank');\n },\n separator: true,\n multiline: true,\n verify: async() => {\n const {isAnonymous} = await this.managers.appUsersManager.getUserPhone(this.peerId.toUserId()) || {};\n return isAnonymous;\n }\n }]\n }\n });\n\n this.link = new Row({\n title: ' ',\n subtitleLangKey: 'SetUrlPlaceholder',\n icon: 'link',\n clickable: () => {\n const url = this.link.title.textContent;\n copyTextToClipboard(url);\n // Promise.resolve(appProfileManager.getChatFull(this.peerId.toChatId())).then((chatFull) => {\n // copyTextToClipboard(chatFull.exported_invite.link);\n const isPrivate = url.includes('/c/');\n toast(I18n.format(isPrivate ? 'LinkCopiedPrivateInfo' : 'LinkCopied', true));\n // });\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_ShareLink',\n onClick: () => {\n simulateClickEvent(this.link.container);\n }\n }]\n }\n });\n\n this.location = new Row({\n title: ' ',\n subtitleLangKey: 'ChatLocation',\n icon: 'location'\n });\n\n this.section.content.append(\n this.phone.container,\n this.username.container,\n this.location.container,\n this.bio.container,\n this.link.container\n );\n\n const {listenerSetter} = this;\n if(this.isDialog) {\n this.notifications = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Notifications',\n icon: 'unmute',\n listenerSetter: this.listenerSetter\n });\n\n listenerSetter.add(this.notifications.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n // let checked = this.notificationsCheckbox.checked;\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, threadId: this.threadId});\n });\n\n listenerSetter.add(rootScope)('dialog_notify_settings', async(dialog) => {\n if(this.peerId === dialog.peerId) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.threadId});\n this.notifications.checkboxField.checked = !muted;\n }\n });\n\n this.section.content.append(this.notifications.container);\n }\n\n this.element.append(this.section.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.element.append(generateDelimiter());\n }\n\n listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('peer_bio_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.setMoreDetails(true);\n }\n });\n\n const n = async({peerId, threadId}: {peerId: PeerId, threadId?: number}) => {\n if(this.peerId !== peerId) {\n return false;\n }\n\n const isForum = await this.managers.appPeersManager.isForum(this.peerId);\n if(isForum && this.threadId ? this.threadId === threadId : true) {\n return true;\n }\n\n return false;\n };\n\n listenerSetter.add(rootScope)('peer_title_edit', async(data) => {\n if(await n(data)) {\n this.fillUsername();\n this.setMoreDetails(true);\n }\n });\n\n listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('contacts_update', async(userId) => {\n if(this.peerId === userId.toPeerId()) {\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user.pFlags.self || !this.isDialog) {\n this.fillUserPhone();\n }\n }\n });\n\n listenerSetter.add(rootScope)('avatar_update', async(data) => {\n if(await n(data)) {\n this.setAvatar();\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(() => this.setPeerStatus(), 60e3);\n }\n\n private async setPeerStatus(\n needClear = false,\n manual?: T\n ): Promise void : void> {\n const peerId = this.peerId;\n\n const callbacks: Array<() => void> = [];\n callbacks.push(() => {\n this.element.classList.toggle('is-me', peerId === rootScope.myId);\n });\n\n let promise: Promise<(() => void) | void> = Promise.resolve();\n if(!(!peerId || (rootScope.myId === peerId && this.isDialog))) {\n const isForum = await this.managers.appPeersManager.isForum(this.peerId);\n const middleware = this.middlewareHelper.get();\n if(isForum && this.threadId) {\n promise = wrapTopicNameButton({\n peerId,\n wrapOptions: {\n middleware\n }\n }).then(({element}) => {\n this.subtitle.replaceChildren(element);\n });\n } else {\n promise = appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear,\n useWhitespace: true,\n middleware,\n ignoreSelf: !this.isDialog\n });\n }\n\n promise.then((callback) => callback && callbacks.push(callback));\n }\n\n const callback = () => callbacks.forEach((callback) => callback());\n\n return promise.then(() => {\n if(manual) {\n return callback;\n }\n\n callback();\n }) as any;\n }\n\n public cleanupHTML() {\n [\n this.bio,\n this.phone,\n this.username,\n this.location,\n this.link\n ].forEach((row) => {\n row.container.style.display = 'none';\n });\n\n if(this.notifications) {\n this.notifications.container.style.display = '';\n this.notifications.checkboxField.checked = true;\n }\n\n this.clearSetMoreDetailsTimeout();\n }\n\n private canBeDetailed() {\n return this.peerId !== rootScope.myId || !this.isDialog;\n }\n\n private createAvatar() {\n const avatar = new AvatarElement();\n avatar.classList.add('profile-avatar', 'avatar-120');\n avatar.isDialog = this.isDialog;\n avatar.attachClickEvent();\n return avatar;\n }\n\n private async _setAvatar() {\n const {peerId} = this;\n const isTopic = !!(this.threadId && await this.managers.appPeersManager.isForum(peerId));\n if(this.canBeDetailed() && !isTopic) {\n const photo = await this.managers.appPeersManager.getPeerPhoto(peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable, this.managers);\n await this.avatars.setPeer(peerId);\n\n return () => {\n this.avatars.info.append(this.name, this.subtitle);\n\n this.avatar?.remove();\n this.avatar = undefined;\n\n if(oldAvatars) oldAvatars.container.replaceWith(this.avatars.container);\n else this.element.prepend(this.avatars.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('parallax');\n }\n };\n }\n }\n\n const avatar = this.createAvatar();\n await avatar.updateWithOptions({\n peerId,\n threadId: isTopic ? this.threadId : undefined,\n wrapOptions: {\n customEmojiSize: makeMediaSize(120, 120),\n middleware: this.middlewareHelper.get()\n }\n });\n\n return () => {\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.remove('parallax');\n }\n\n if(this.avatars) {\n this.avatars.container.remove();\n this.avatars.cleanup();\n this.avatars = undefined;\n }\n\n this.avatar?.remove();\n this.avatar = avatar;\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n };\n }\n\n private setAvatar(manual?: T): T extends true ? Promise<() => void> : Promise {\n const promise = this._setAvatar();\n return manual ? promise : promise.then((callback) => callback()) as any;\n }\n\n private getUsernamesAlso(usernames: string[]) {\n const also = usernames.slice(1);\n if(also.length) {\n const a = also.map((username) => anchorCopy({username}));\n const i = i18n('UsernameAlso', [join(a, false)]);\n return i;\n }\n }\n\n private async fillUsername() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const usernames = await this.managers.appPeersManager.getPeerActiveUsernames(peerId);\n const also = this.getUsernamesAlso(usernames);\n\n return () => {\n this.username.subtitle.replaceChildren(also || i18n('Username'));\n setText(usernames[0], this.username);\n };\n }\n }\n\n private async fillUserPhone() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const {phone, isAnonymous} = await this.managers.appUsersManager.getUserPhone(peerId.toUserId()) || {};\n\n return () => {\n this.phone.subtitle.replaceChildren(i18n(isAnonymous ? 'AnonymousNumber' : 'Phone'));\n setText(phone ? formatUserPhone(phone) : undefined, this.phone);\n };\n }\n }\n\n private async fillNotifications() {\n const notificationsRow = this.notifications;\n if(!notificationsRow) {\n return;\n }\n\n if(this.canBeDetailed()) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.threadId});\n return () => {\n notificationsRow.checkboxField.checked = !muted;\n };\n } else {\n return () => {\n // fastRaf(() => {\n notificationsRow.container.style.display = 'none';\n // });\n };\n }\n }\n\n private async fillName() {\n const {peerId} = this;\n const [element/* , icons */] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: this.isDialog,\n withIcons: !this.threadId,\n threadId: this.threadId\n })\n\n // generateTitleIcons(peerId)\n ]);\n\n return () => {\n replaceContent(this.name, element);\n // this.name.append(...icons);\n };\n }\n\n private async fillRows(manual: Promise) {\n return Promise.all([\n this.fillName(),\n this.fillUsername(),\n this.fillUserPhone(),\n this.fillNotifications(),\n this.setMoreDetails(undefined, manual),\n this.setPeerStatus(true, true)\n ]).then((callbacks) => {\n return () => {\n callbacks.forEach((callback) => callback?.());\n };\n });\n }\n\n public async fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n\n this.cleanupHTML();\n const deferred = deferredPromise();\n const middleware = this.middlewareHelper.get();\n middleware.onClean(() => {\n deferred.reject();\n });\n\n const callbacks = await Promise.all([\n this.setAvatar(true),\n this.fillRows(deferred)\n ]);\n\n return () => {\n deferred.resolve();\n callbacks.forEach((callback) => callback?.());\n };\n }\n\n private async _setMoreDetails(peerId: PeerId, peerFull?: ChatFull | UserFull) {\n const m = this.getMiddlewarePromise();\n const isTopic = !!(this.threadId && await m(this.managers.appPeersManager.isForum(peerId)));\n if(isTopic) {\n let url = 'https://t.me/';\n const threadId = getServerMessageId(this.threadId);\n const username = await m(this.managers.appPeersManager.getPeerUsername(peerId));\n if(username) {\n url += `${username}/${threadId}`;\n } else {\n url += `c/${peerId.toChatId()}/${threadId}`;\n }\n\n return () => {\n setText(url, this.link);\n };\n }\n\n const callbacks: (() => void)[] = [];\n // if(peerFull.about) {\n callbacks.push(() => {\n this.bio.subtitle.replaceChildren(i18n(peerId.isUser() ? 'UserBio' : 'Info'));\n setText(peerFull.about ? wrapRichText(peerFull.about) : undefined, this.bio);\n });\n // }\n\n if(!peerId.isUser()) {\n const chat = await m(this.managers.appChatsManager.getChat(peerId.toChatId())) as Chat.channel;\n const usernames = getPeerActiveUsernames(chat);\n let also: HTMLElement;\n if(usernames.length) {\n also = this.getUsernamesAlso(usernames);\n callbacks.push(() => setText('https://t.me/' + usernames[0], this.link));\n } else {\n const exportedInvite = (peerFull as ChatFull.channelFull).exported_invite;\n if(exportedInvite?._ === 'chatInviteExported') {\n callbacks.push(() => setText(exportedInvite.link, this.link));\n }\n }\n\n callbacks.push(() => this.link.subtitle.replaceChildren(also || i18n('SetUrlPlaceholder')));\n }\n\n const location = (peerFull as ChatFull.channelFull).location;\n if(location?._ == 'channelLocation') {\n callbacks.push(() => setText(location.address, this.location));\n }\n\n this.setMoreDetailsTimeout = window.setTimeout(() => this.setMoreDetails(true), 60e3);\n\n return () => {\n callbacks.forEach((callback) => callback());\n };\n }\n\n private async setMoreDetails(override?: true, manual?: Promise) {\n this.clearSetMoreDetailsTimeout();\n\n const {peerId} = this;\n const m = this.getMiddlewarePromise();\n\n if(!peerId || !this.canBeDetailed() || await m(this.managers.appPeersManager.isPeerRestricted(peerId))) {\n return;\n }\n\n const result = await m(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId, override));\n const setPromise = m(result.result).then(async(peerFull) => {\n if(await m(this.managers.appPeersManager.isPeerRestricted(peerId))) {\n // this.log.warn('peer changed');\n return;\n }\n\n return await m(this._setMoreDetails(peerId, peerFull));\n });\n\n if(result.cached && manual) {\n return setPromise;\n } else {\n (manual || Promise.resolve())\n .then(() => setPromise)\n .then((callback) => {\n callback?.();\n });\n }\n }\n\n private getMiddlewarePromise() {\n return middlewarePromise(this.middlewareHelper.get(), makeError('MIDDLEWARE'));\n }\n\n public setPeer(peerId: PeerId, threadId?: number) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n this.init?.();\n\n this.peerId = peerId;\n this.threadId = threadId;\n\n this.middlewareHelper.clean();\n this.cleaned = true;\n }\n\n public clearSetMoreDetailsTimeout() {\n if(this.setMoreDetailsTimeout !== undefined) {\n clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = undefined;\n }\n }\n\n public destroy() {\n this.peerId = this.threadId = undefined;\n this.clearSetMoreDetailsTimeout();\n clearInterval(this.setPeerStatusInterval);\n this.avatars?.cleanup();\n this.middlewareHelper.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport mediaSizes from '../helpers/mediaSizes';\nimport {Middleware} from '../helpers/middleware';\nimport {Chat, Document, EmojiStatus, User} from '../layer';\nimport rootScope from '../lib/rootScope';\nimport generateFakeIcon from './generateFakeIcon';\nimport generatePremiumIcon from './generatePremiumIcon';\nimport generateVerifiedIcon from './generateVerifiedIcon';\nimport wrapSticker from './wrappers/sticker';\n\nexport default async function generateTitleIcons(\n peerId: PeerId,\n middleware?: Middleware,\n noVerifiedIcon?: boolean,\n noFakeIcon?: boolean,\n noPremiumIcon?: boolean\n) {\n const elements: HTMLElement[] = [];\n const peer: Chat | User = await rootScope.managers.appPeersManager.getPeer(peerId);\n if((peer as Chat.channel).pFlags.verified && !noVerifiedIcon) {\n elements.push(generateVerifiedIcon());\n }\n\n if(((peer as Chat.channel).pFlags.fake || (peer as User.user).pFlags.scam) && !noFakeIcon) {\n elements.push(generateFakeIcon((peer as User.user).pFlags.scam));\n }\n\n if((peer as User.user).pFlags.premium && !noPremiumIcon) {\n const emojiStatus = (peer as User.user).emoji_status;\n if(emojiStatus && emojiStatus._ !== 'emojiStatusEmpty' && false) {\n const container = document.createElement('span');\n container.classList.add('emoji-status');\n const result = await rootScope.managers.acknowledged.appEmojiManager.getCustomEmojiDocument((emojiStatus as EmojiStatus.emojiStatus).document_id);\n const wrap = async(doc: Document.document) => {\n const size = mediaSizes.active.emojiStatus\n const loadPromises: Promise[] = [];\n await wrapSticker({\n doc,\n div: container,\n width: size.width,\n height: size.height,\n loop: 2,\n play: true,\n group: 'EMOJI-STATUS',\n loadPromises,\n middleware\n // group: 'none'\n });\n\n await Promise.all(loadPromises);\n };\n\n const p = result.result.then(wrap);\n if(result.cached) {\n await p;\n }\n\n elements.push(container);\n } else {\n elements.push(generatePremiumIcon());\n }\n }\n\n return elements;\n}\n","export default function generateVerifiedIcon() {\n const span = document.createElement('span');\n span.classList.add('verified-icon', 'tgico');\n\n const size = 26; // 24\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${size} ${size}`);\n svg.setAttributeNS(null, 'width', `${size}`);\n svg.setAttributeNS(null, 'height', `${size}`);\n svg.classList.add('verified-icon-svg');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#verified-icon-background');\n use.classList.add('verified-icon-background');\n\n const use2 = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use2.setAttributeNS(null, 'href', '#verified-icon-check');\n use2.classList.add('verified-icon-check');\n\n // svg.append(use, use2);\n svg.append(use2, use);\n\n span.append(svg);\n\n return span;\n // const span = document.createElement('span');\n // span.classList.add('verified-icon', 'tgico-verified_filled');\n // return span;\n}\n","export default function generatePremiumIcon() {\n const span = document.createElement('span');\n span.classList.add('premium-icon', 'tgico-star');\n return span;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport {i18n} from '../lib/langPack';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport limitSymbols from '../helpers/string/limitSymbols';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport safeAssign from '../helpers/object/safeAssign';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport getPeerTitle from './wrappers/getPeerTitle';\nimport generateTitleIcons from './generateTitleIcons';\nimport {wrapTopicIcon} from './wrappers/messageActionTextNewUnsafe';\n\nexport type PeerTitleOptions = {\n peerId?: PeerId,\n fromName?: string,\n plainText?: boolean,\n onlyFirstName?: boolean,\n dialog?: boolean,\n limitSymbols?: number,\n withIcons?: boolean,\n withPremiumIcon?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions\n};\n\nconst weakMap: WeakMap = new WeakMap();\n\nrootScope.addEventListener('peer_title_edit', ({peerId, threadId}) => {\n let query = `.peer-title[data-peer-id=\"${peerId}\"]`;\n if(threadId) {\n query += `[data-thread-id=\"${threadId}\"]`;\n }\n\n const elements = Array.from(document.querySelectorAll(query)) as HTMLElement[];\n elements.forEach((element) => {\n const peerTitle = weakMap.get(element);\n peerTitle?.update();\n });\n});\n\nexport default class PeerTitle {\n public element: HTMLElement;\n public options: PeerTitleOptions;\n private hasInner: boolean;\n\n constructor(options?: PeerTitleOptions) {\n this.element = document.createElement('span');\n this.element.classList.add('peer-title');\n setDirection(this.element);\n\n this.options = {};\n\n if(options) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n public setOptions(options?: PeerTitleOptions) {\n if(!options) {\n return;\n }\n\n safeAssign(this.options, options);\n for(const i in options) {\n // @ts-ignore\n const value = options[i];\n\n if(typeof(value) !== 'object' && typeof(value) !== 'function') {\n // @ts-ignore\n this.element.dataset[i] = value ? '' + (typeof(value) === 'boolean' ? +value : value) : '0';\n }\n }\n }\n\n private setHasInner(hasInner: boolean) {\n if(this.hasInner !== hasInner) {\n this.hasInner = hasInner;\n this.element.classList.toggle('with-icons', hasInner);\n }\n }\n\n public async update(options?: PeerTitleOptions) {\n this.setOptions(options);\n\n let fromName = this.options.fromName;\n if(fromName !== undefined) {\n if(this.options.limitSymbols !== undefined) {\n fromName = limitSymbols(fromName, this.options.limitSymbols, this.options.limitSymbols);\n }\n\n setInnerHTML(this.element, wrapEmojiText(fromName));\n return;\n }\n\n this.options.peerId ??= NULL_PEER_ID;\n\n let hasInner: boolean;\n const {peerId, threadId} = this.options;\n if(peerId !== rootScope.myId || !this.options.dialog) {\n if(threadId) {\n const [topic, isForum] = await Promise.all([\n rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId),\n rootScope.managers.appPeersManager.isForum(peerId)\n ]);\n\n if(!topic && isForum) {\n rootScope.managers.dialogsStorage.getForumTopicById(peerId, threadId).then((forumTopic) => {\n if(!forumTopic && this.options.threadId === threadId) {\n this.options.threadId = undefined;\n this.update({threadId: undefined});\n return;\n }\n\n this.update();\n }, () => {\n if(this.options.threadId === threadId) {\n this.options.threadId = undefined;\n this.update({threadId: undefined});\n }\n });\n\n setInnerHTML(this.element, i18n('Loading'));\n this.setHasInner(false);\n return;\n }\n }\n\n const getTopicIconPromise = threadId && this.options.withIcons ?\n rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId).then((topic) => wrapTopicIcon({...(this.options.wrapOptions ?? {}), topic})) :\n undefined;\n\n const [title, icons, topicIcon] = await Promise.all([\n getPeerTitle(this.options as Required),\n (this.options.withIcons && generateTitleIcons(peerId, this.options.wrapOptions?.middleware)) || (this.options.withPremiumIcon && generateTitleIcons(peerId, this.options.wrapOptions?.middleware, true, true)),\n getTopicIconPromise\n ]);\n\n if(icons?.length || topicIcon) {\n const inner = document.createElement('span');\n inner.classList.add('peer-title-inner');\n hasInner = true;\n setInnerHTML(inner, title);\n\n const fragment = document.createDocumentFragment();\n fragment.append(...[topicIcon, inner, ...(icons ?? [])].filter(Boolean));\n setInnerHTML(this.element, fragment);\n } else {\n setInnerHTML(this.element, title);\n }\n } else {\n replaceContent(this.element, i18n(this.options.onlyFirstName ? 'Saved' : 'SavedMessages'));\n }\n\n this.setHasInner(hasInner);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppDownloadManager} from '../../lib/appManagers/appDownloadManager';\nimport resizeableImage from '../../lib/cropper';\nimport PopupElement from '.';\nimport {_i18n} from '../../lib/langPack';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\nimport rootScope from '../../lib/rootScope';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\n\nexport default class PopupAvatar extends PopupElement {\n private cropContainer: HTMLElement;\n private input: HTMLInputElement;\n private h6: HTMLElement;\n\n private image = new Image();\n\n private canvas: HTMLCanvasElement;\n private blob: Blob;\n private cropper = {\n crop: () => {},\n removeHandlers: () => {}\n };\n\n private onCrop: (upload: () => ReturnType) => void;\n\n constructor(options: Partial<{\n isForum: boolean\n }> = {}) {\n super('popup-avatar', {closable: true, withConfirm: true});\n\n this.h6 = document.createElement('h6');\n _i18n(this.h6, 'Popup.Avatar.Title');\n\n this.btnClose.classList.remove('btn-icon');\n\n this.header.append(this.h6);\n\n this.cropContainer = document.createElement('div');\n this.cropContainer.classList.add('crop');\n this.cropContainer.append(this.image);\n\n if(options.isForum) {\n this.cropContainer.classList.add('is-forum');\n }\n\n this.input = document.createElement('input');\n this.input.type = 'file';\n this.input.style.display = 'none';\n this.listenerSetter.add(this.input)('change', (e: any) => {\n const file = e.target.files[0];\n if(!file) {\n return;\n }\n\n readBlobAsDataURL(file).then((contents) => {\n this.image = new Image();\n this.cropContainer.append(this.image);\n this.image.src = contents;\n\n this.image.onload = () => {\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\n cropContainer.style.width = w + 'px';\n cropContainer.style.height = h + 'px'; */\n this.show();\n\n this.cropper = resizeableImage(this.image, this.canvas);\n this.input.value = '';\n };\n });\n }, false);\n\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\n attachClickEvent(this.btnConfirm, () => {\n this.cropper.crop();\n this.hide();\n\n this.canvas.toBlob((blob) => {\n this.blob = blob; // save blob to send after reg\n this.darkenCanvas();\n this.resolve();\n }, 'image/jpeg', 1);\n }, {listenerSetter: this.listenerSetter});\n\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\n\n this.addEventListener('closeAfterTimeout', () => {\n this.cropper.removeHandlers();\n if(this.image) {\n this.image.remove();\n }\n });\n }\n\n private resolve() {\n this.onCrop(() => {\n return appDownloadManager.upload(this.blob);\n });\n }\n\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\n this.canvas = postCanvas;\n this.onCrop = onCrop;\n\n this.input.click();\n }\n\n public darkenCanvas() {\n const ctx = this.canvas.getContext('2d');\n ctx.fillStyle = 'rgba(0, 0, 0, 0.3)';\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\n let cropComponent: HTMLDivElement,\n container: HTMLDivElement,\n cropImage: HTMLImageElement,\n event_state: Partial<{\n mouse_x: number,\n mouse_y: number,\n container_width: number,\n container_height: number,\n container_left: number,\n container_top: number\n }> = {},\n keyZoomValue = 4.0,\n MINWIDTH = 50,\n MINHEIGHT = 50,\n CROPWIDTH = 200,\n CROPHEIGHT = 200,\n cropLeft = 0,\n cropTop = 0,\n cropWidth = 0,\n cropHeight = 0,\n scaledRatio = 0;\n\n if(originalImage.complete) init();\n else originalImage.onload = init;\n\n function removeHandlers() {\n container.removeEventListener('mousedown', startMoving);\n container.removeEventListener('touchstart', startMoving);\n container.removeEventListener('wheel', resizing);\n\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n document.removeEventListener('keypress', keyHandler);\n\n cropComponent.remove();\n container.remove();\n cropImage.remove();\n }\n\n function addHandlers() {\n container.addEventListener('mousedown', startMoving, false);\n container.addEventListener('touchstart', startMoving, false);\n container.addEventListener('wheel', resizing, false);\n\n document.addEventListener('keypress', keyHandler, false);\n // document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\n }\n\n function init() {\n originalImage.classList.add('crop-blur');\n originalImage.draggable = false;\n\n cropImage = new Image();\n cropImage.src = originalImage.src;\n cropImage.draggable = false;\n cropImage.classList.add('crop-overlay-image');\n\n if(!canvas) {\n canvas = document.createElement('canvas');\n }\n\n cropComponent = document.createElement('div');\n cropComponent.classList.add('crop-component');\n\n container = document.createElement('div');\n container.classList.add('crop-overlay');\n\n const overlayColor = document.createElement('div');\n overlayColor.classList.add('crop-overlay-color');\n\n cropComponent.appendChild(container);\n const wrapper = originalImage.parentNode as HTMLElement;\n wrapper.appendChild(cropComponent);\n cropComponent.appendChild(cropImage);\n cropComponent.appendChild(originalImage);\n cropComponent.appendChild(overlayColor);\n container.appendChild(cropImage);\n\n cropImage.style.maxWidth = originalImage.width + 'px';\n\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\n\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\n\n updateCropSize(CROPWIDTH, CROPHEIGHT);\n updateCropImage(left, top);\n updateContainer(left, top);\n addHandlers();\n // crop();\n }\n\n function updateCropSize(width: number, height: number) {\n cropWidth = width * scaledRatio;\n cropHeight = height * scaledRatio;\n\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n }\n\n function updateCropImage(left: number, top: number) {\n cropTop = top * scaledRatio;\n cropLeft = left * scaledRatio;\n\n cropImage.style.top = -top + 'px';\n cropImage.style.left = -left + 'px';\n }\n\n function updateContainer(left: number, top: number) {\n container.style.top = top + 'px';\n container.style.left = left + 'px';\n }\n\n // Save the initial event details and container state\n function saveEventState(e: any) {\n event_state.container_width = container.offsetWidth;\n event_state.container_height = container.offsetHeight;\n\n event_state.container_left = container.offsetLeft;\n event_state.container_top = container.offsetTop;\n\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\n }\n\n function imgZoom(zoom: number) {\n zoom = zoom * Math.PI * 2\n let newWidth = Math.floor(container.clientWidth + zoom),\n newHeight = Math.floor(container.clientHeight + zoom),\n w = cropImage.clientWidth,\n h = cropImage.clientHeight,\n left: number,\n top: number,\n right: number,\n bottom: number;\n\n if(newWidth < MINWIDTH) {\n return;\n } else if(newWidth > w) {\n return;\n }\n\n left = container.offsetLeft - (zoom / 2);\n top = container.offsetTop - (zoom / 2);\n right = left + newWidth;\n bottom = top + newHeight;\n\n if(left < 0) left = 0;\n if(top < 0) top = 0;\n\n if(right > w) return;\n if(bottom > h) return;\n\n updateCropSize(newWidth, newWidth);\n updateCropImage(left, top);\n updateContainer(left, top);\n // crop();\n }\n\n function keyHandler(e: KeyboardEvent) {\n e.preventDefault();\n\n switch(String.fromCharCode(e.charCode)) {\n case '+':\n imgZoom(keyZoomValue);\n break;\n case '-':\n imgZoom(-keyZoomValue);\n break;\n }\n }\n\n function resizing(e: any) {\n e.preventDefault();\n imgZoom(e.deltaY > 0 ? 1 : -1);\n }\n\n function startMoving(e: MouseEvent | TouchEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n saveEventState(e);\n\n document.addEventListener('mousemove', moving);\n document.addEventListener('touchmove', moving);\n document.addEventListener('mouseup', endMoving);\n document.addEventListener('touchend', endMoving);\n }\n\n function endMoving(e: MouseEvent | TouchEvent) {\n e.preventDefault();\n\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n }\n\n function moving(e: any) {\n let currentTouch = {x: 0, y: 0},\n left: number,\n top: number,\n w: number,\n h: number;\n\n e.preventDefault();\n e.stopPropagation();\n\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\n\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\n w = container.offsetWidth;\n h = container.offsetHeight;\n\n if(left < 0) left = 0;\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\n\n if(top < 0) top = 0;\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\n\n updateCropImage(left, top);\n updateContainer(left, top);\n // crop();\n }\n\n function crop() {\n canvas.width = cropWidth;\n canvas.height = cropHeight;\n\n const ctx = canvas.getContext('2d');\n ctx.drawImage(originalImage,\n cropLeft, cropTop,\n cropWidth, cropHeight,\n 0, 0,\n cropWidth, cropHeight\n );\n }\n\n return {crop, removeHandlers};\n}\n\nexport default resizeableImage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport type {PeerType} from '../../lib/appManagers/appPeersManager';\nimport {FormatterArguments, LangPackKey} from '../../lib/langPack';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\n\nexport default class PopupDeleteDialog {\n constructor(\n private peerId: PeerId,\n // actionType: 'leave' | 'delete',\n private peerType?: PeerType,\n private onSelect?: (promise: Promise) => void,\n private threadId?: number\n ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, peerType, onSelect, threadId} = this;\n const peerTitleElement = await wrapPeerTitle({peerId, threadId: threadId});\n\n const managers = PopupElement.MANAGERS;\n if(peerType === undefined) {\n peerType = await managers.appPeersManager.getDialogType(peerId);\n }\n\n /* const callbackFlush = (checked: PopupPeerButtonCallbackCheckboxes) => {\n const promise = appMessagesManager.flushHistory(peerId, checkboxes ? !checked[checkboxes[0].text] : undefined);\n onSelect && onSelect(promise);\n }; */\n\n const callbackLeave = (checked: PopupPeerButtonCallbackCheckboxes, flush = checkboxes && !!checked.size) => {\n let promise = managers.appChatsManager.leave(peerId.toChatId());\n\n if(flush) {\n promise = promise.then(() => {\n return managers.appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n\n onSelect?.(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n if(threadId) {\n promise = managers.appMessagesManager.flushHistory(peerId, false, true, threadId);\n } else if(peerId.isUser()) {\n promise = managers.appMessagesManager.flushHistory(peerId, false, checkboxes ? !!checked.size : undefined);\n } else {\n if(checked.size) {\n promise = managers.appChatsManager.delete(peerId.toChatId());\n } else {\n return callbackLeave(checked);\n }\n }\n\n onSelect?.(promise);\n };\n\n let title: LangPackKey,\n titleArgs: FormatterArguments,\n description: LangPackKey,\n descriptionArgs: FormatterArguments,\n buttons: PopupPeerOptions['buttons'],\n checkboxes: PopupPeerOptions['checkboxes'];\n switch(peerType) {\n case 'channel': {\n if(/* actionType === 'delete' && */await managers.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'ChannelDeleteMenu';\n description = 'AreYouSureDeleteAndExitChannel';\n buttons = [{\n langKey: 'ChannelDeleteMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChannelForAll'\n }];\n } else {\n title = 'LeaveChannelMenu';\n description = 'ChannelLeaveAlertWithName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'LeaveChannel',\n isDanger: true,\n callback: callbackLeave\n }];\n }\n\n break;\n }\n\n /* case 'megagroup': {\n title = 'Leave Group?';\n description = `Are you sure you want to leave this group?`;\n buttons = [{\n text: 'LEAVE ' + peerTitleElement,\n isDanger: true,\n callback: callbackLeave\n }];\n\n break;\n } */\n\n case 'chat': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatWithUser';\n descriptionArgs = [peerTitleElement];\n\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteMessagesOptionAlso',\n textArgs: [\n await wrapPeerTitle({peerId})\n ]\n }];\n\n break;\n }\n\n case 'saved': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatSavedMessages';\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n break;\n }\n\n case 'megagroup':\n case 'group': {\n if(threadId) {\n title = 'DeleteTopics';\n titleArgs = [1];\n description = 'DeleteSelectedTopic';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'Delete',\n isDanger: true,\n callback: callbackDelete\n }];\n } else if(/* actionType === 'delete' && */await managers.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'DeleteMegaMenu';\n description = 'AreYouSureDeleteAndExit';\n buttons = [{\n langKey: 'DeleteMegaMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChat.DeleteGroupForAll'\n }];\n } else {\n title = 'LeaveMegaMenu';\n description = 'AreYouSureDeleteAndExitName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: (checkboxes) => callbackLeave(checkboxes, true)\n }];\n }\n\n break;\n }\n }\n\n new PopupPeer('popup-delete-chat', {\n peerId,\n threadId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n }).show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\nimport PopupElement, {addCancelButton} from '.';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\nimport {ChatType} from '../chat/chat';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport hasRights from '../../lib/appManagers/utils/chats/hasRights';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport wrapPeerTitle from '../wrappers/peerTitle';\n\nexport default class PopupDeleteMessages {\n constructor(\n private peerId: PeerId,\n private mids: number[],\n private type: ChatType,\n private onConfirm?: () => void,\n private threadId?: number\n ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, mids, type, onConfirm, threadId} = this;\n\n const peerTitleElement = await wrapPeerTitle({peerId, threadId});\n\n const managers = PopupElement.MANAGERS;\n\n mids = mids.slice();\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, revoke?: boolean) => {\n onConfirm && onConfirm();\n if(type === 'scheduled') {\n managers.appMessagesManager.deleteScheduledMessages(peerId, mids);\n } else {\n managers.appMessagesManager.deleteMessages(peerId, mids, !!checked.size || revoke);\n }\n };\n\n const buttons: PopupPeerOptions['buttons'] = [{\n langKey: 'Delete',\n isDanger: true,\n callback\n }];\n const checkboxes: PopupPeerOptions['checkboxes'] = [];\n let title: LangPackKey, titleArgs: any[], description: LangPackKey, descriptionArgs: any[];\n if(mids.length === 1) {\n title = 'DeleteSingleMessagesTitle';\n } else {\n title = 'DeleteMessagesTitle';\n titleArgs = [i18n('messages', [mids.length])];\n }\n\n if(await managers.appPeersManager.isMegagroup(peerId)) {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessageMega' : 'AreYouSureDeleteFewMessagesMega';\n } else {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessage' : 'AreYouSureDeleteFewMessages';\n }\n\n if(peerId === rootScope.myId || type === 'scheduled') {\n\n } else {\n if(peerId.isUser()) {\n checkboxes.push({\n text: 'DeleteMessagesOptionAlso',\n textArgs: [peerTitleElement]\n });\n } else {\n const chat = await managers.appChatsManager.getChat(peerId.toChatId());\n\n const _hasRights = hasRights(chat, 'delete_messages');\n if(chat._ === 'chat') {\n const canRevoke = _hasRights ? mids.slice() : await filterAsync(mids, async(mid) => {\n const message = await managers.appMessagesManager.getMessageByPeer(peerId, mid);\n return message.fromId === rootScope.myId;\n });\n\n if(canRevoke.length) {\n if(canRevoke.length === mids.length) {\n checkboxes.push({\n text: 'DeleteForAll'\n });\n } else {\n checkboxes.push({\n text: 'DeleteMessagesOption'\n });\n\n description = 'DeleteMessagesTextGroup';\n descriptionArgs = [i18n('messages', [canRevoke.length])];\n // description = `You can also delete the ${canRevoke.length} message${canRevoke.length > 1 ? 's' : ''} you sent from the inboxes of other group members by pressing \"${buttonText}\".`;\n }\n }\n } else {\n buttons[0].callback = (checked) => callback(checked, true);\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n threadId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport {toastNew} from '../toast';\nimport PopupPickUser from './pickUser';\n\nexport default class PopupForward extends PopupPickUser {\n constructor(\n peerIdMids?: {[fromPeerId: PeerId]: number[]},\n onSelect?: (peerId: PeerId) => Promise | void\n ) {\n super({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: !peerIdMids && onSelect ? onSelect : async(peerId) => {\n if(onSelect) {\n const res = onSelect(peerId);\n if(res instanceof Promise) {\n await res;\n }\n }\n\n if(peerId === rootScope.myId) {\n let count = 0;\n for(const fromPeerId in peerIdMids) {\n const mids = peerIdMids[fromPeerId];\n count += mids.length;\n this.managers.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), mids);\n }\n\n toastNew({\n langPackKey: count > 0 ? 'FwdMessagesToSavedMessages' : 'FwdMessageToSavedMessages'\n });\n\n return;\n }\n\n appImManager.setInnerPeer({peerId});\n appImManager.chat.input.initMessagesForward(peerIdMids);\n },\n placeholder: 'ShareModal.Search.ForwardPlaceholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ripple from '../ripple';\nimport animationIntersector from '../animationIntersector';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {i18n, LangPackKey, _i18n} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport EventListenerBase, {EventListenerListeners} from '../../helpers/eventListenerBase';\nimport {addFullScreenListener, getFullScreenElement} from '../../helpers/dom/fullScreen';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport Scrollable from '../scrollable';\nimport {getMiddleware, MiddlewareHelper} from '../../helpers/middleware';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\n\nexport type PopupButton = {\n text?: string,\n callback?: () => void,\n langKey?: LangPackKey,\n langArgs?: any[],\n isDanger?: boolean,\n isCancel?: boolean,\n element?: HTMLButtonElement,\n noRipple?: boolean\n};\n\nexport type PopupOptions = Partial<{\n closable: boolean,\n overlayClosable: boolean,\n withConfirm: LangPackKey | boolean,\n body: boolean,\n confirmShortcutIsSendShortcut: boolean,\n withoutOverlay: boolean,\n scrollable: boolean,\n buttons: Array,\n title: boolean | LangPackKey,\n titleRaw: string\n}>;\n\nexport interface PopupElementConstructable {\n new(...args: any[]): T;\n}\n\nconst DEFAULT_APPEND_TO = document.body;\nlet appendPopupTo = DEFAULT_APPEND_TO;\n\nconst onFullScreenChange = () => {\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\n PopupElement.reAppend();\n};\n\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\n\ntype PopupListeners = {\n close: () => void,\n closeAfterTimeout: () => void\n};\n\nexport default class PopupElement extends EventListenerBase {\n private static POPUPS: PopupElement[] = [];\n public static MANAGERS: AppManagers;\n\n protected element = document.createElement('div');\n protected container = document.createElement('div');\n protected header = document.createElement('div');\n protected title = document.createElement('div');\n protected btnClose: HTMLElement;\n protected btnConfirm: HTMLButtonElement;\n protected body: HTMLElement;\n protected buttonsEl: HTMLElement;\n\n protected onEscape: () => boolean = () => true;\n\n protected navigationItem: NavigationItem;\n\n protected listenerSetter: ListenerSetter;\n\n protected confirmShortcutIsSendShortcut: boolean;\n protected btnConfirmOnEnter: HTMLElement;\n\n protected withoutOverlay: boolean;\n\n protected managers: AppManagers;\n\n protected scrollable: Scrollable;\n\n protected buttons: Array;\n\n protected middlewareHelper: MiddlewareHelper;\n\n constructor(className: string, options: PopupOptions = {}) {\n super(false);\n this.element.classList.add('popup');\n this.element.className = 'popup' + (className ? ' ' + className : '');\n this.container.classList.add('popup-container', 'z-depth-1');\n\n this.header.classList.add('popup-header');\n\n if(options.title || options.titleRaw) {\n this.title.classList.add('popup-title');\n if(typeof(options.title) === 'string') {\n _i18n(this.title, options.title);\n } else if(options.titleRaw) {\n this.title.append(wrapEmojiText(options.titleRaw));\n }\n\n this.header.append(this.title);\n }\n\n this.middlewareHelper = getMiddleware();\n this.listenerSetter = new ListenerSetter();\n this.managers = PopupElement.MANAGERS;\n\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\n\n if(options.closable) {\n this.btnClose = document.createElement('span');\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\n // ripple(this.closeBtn);\n this.header.prepend(this.btnClose);\n\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\n }\n\n this.withoutOverlay = options.withoutOverlay;\n if(this.withoutOverlay) {\n this.element.classList.add('no-overlay');\n }\n\n if(options.overlayClosable) {\n attachClickEvent(this.element, (e: MouseEvent) => {\n if(!findUpClassName(e.target, 'popup-container')) {\n this.hide();\n }\n }, {listenerSetter: this.listenerSetter});\n }\n\n if(options.withConfirm) {\n this.btnConfirm = document.createElement('button');\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\n if(options.withConfirm !== true) {\n this.btnConfirm.append(i18n(options.withConfirm));\n }\n this.header.append(this.btnConfirm);\n ripple(this.btnConfirm);\n }\n\n this.container.append(this.header);\n if(options.body) {\n this.body = document.createElement('div');\n this.body.classList.add('popup-body');\n this.container.append(this.body);\n }\n\n if(options.scrollable) {\n const scrollable = this.scrollable = new Scrollable(this.body);\n this.attachScrollableListeners();\n\n if(!this.body) {\n this.container.insertBefore(scrollable.container, this.header.nextSibling);\n }\n }\n\n let btnConfirmOnEnter = this.btnConfirm;\n const buttons = this.buttons = options.buttons;\n if(buttons?.length) {\n const buttonsDiv = this.buttonsEl = document.createElement('div');\n buttonsDiv.classList.add('popup-buttons');\n\n const buttonsElements = buttons.map((b) => {\n const button = document.createElement('button');\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\n\n if(!b.noRipple) {\n ripple(button);\n }\n\n if(b.text) {\n button.textContent = b.text;\n } else {\n button.append(i18n(b.langKey, b.langArgs));\n }\n\n attachClickEvent(button, () => {\n b.callback?.();\n this.destroy();\n }, {listenerSetter: this.listenerSetter, once: true});\n\n return b.element = button;\n });\n\n if(!btnConfirmOnEnter && buttons.length === 2) {\n const button = buttons.find((button) => !button.isCancel);\n if(button) {\n btnConfirmOnEnter = button.element;\n }\n }\n\n buttonsDiv.append(...buttonsElements);\n this.container.append(buttonsDiv);\n }\n\n this.btnConfirmOnEnter = btnConfirmOnEnter;\n\n this.element.append(this.container);\n\n PopupElement.POPUPS.push(this);\n }\n\n protected attachScrollableListeners(setClassOn?: HTMLElement) {\n return this.scrollable.attachBorderListeners(setClassOn);\n }\n\n protected onContentUpdate() {\n if(this.scrollable) {\n this.scrollable.onAdditionalScroll();\n }\n }\n\n public show() {\n this.navigationItem = {\n type: 'popup',\n onPop: () => this.destroy(),\n onEscape: this.onEscape\n };\n\n appNavigationController.pushItem(this.navigationItem);\n\n blurActiveElement(); // * hide mobile keyboard\n appendPopupTo.append(this.element);\n void this.element.offsetWidth; // reflow\n this.element.classList.add('active');\n\n this.onContentUpdate();\n\n if(!this.withoutOverlay) {\n overlayCounter.isOverlayActive = true;\n animationIntersector.checkAnimations2(true);\n }\n\n // cannot add event instantly because keydown propagation will fire it\n // if(this.btnConfirmOnEnter) {\n setTimeout(() => {\n if(!this.element.classList.contains('active')) {\n return;\n }\n\n this.listenerSetter.add(document.body)('keydown', (e) => {\n if(PopupElement.POPUPS[PopupElement.POPUPS.length - 1] !== this) {\n return;\n }\n\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\n simulateClickEvent(this.btnConfirmOnEnter);\n cancelEvent(e);\n }\n });\n }, 0);\n // }\n }\n\n public hide = () => {\n appNavigationController.backByItem(this.navigationItem);\n };\n\n protected destroy() {\n this.dispatchEvent('close');\n this.element.classList.add('hiding');\n this.element.classList.remove('active');\n this.listenerSetter.removeAll();\n this.middlewareHelper.destroy();\n\n if(!this.withoutOverlay) {\n overlayCounter.isOverlayActive = false;\n }\n\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n\n indexOfAndSplice(PopupElement.POPUPS, this);\n\n // ! calm\n onFullScreenChange();\n\n setTimeout(() => {\n this.element.remove();\n this.dispatchEvent('closeAfterTimeout');\n this.cleanup();\n this.scrollable?.destroy();\n\n if(!this.withoutOverlay) {\n animationIntersector.checkAnimations2(false);\n }\n }, 150);\n }\n\n public static reAppend() {\n this.POPUPS.forEach((popup) => {\n const {element, container} = popup;\n const parentElement = element.parentElement;\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\n appendPopupTo.append(element);\n }\n });\n }\n\n public static getPopups(popupConstructor: PopupElementConstructable) {\n return this.POPUPS.filter((element) => element instanceof popupConstructor) as T[];\n }\n\n public static createPopup>(ctor: {new(...args: A): T}, ...args: A) {\n const popup = new ctor(...args);\n return popup;\n }\n}\n\nexport const addCancelButton = (buttons: PopupButton[]) => {\n const button = buttons.find((b) => b.isCancel);\n if(!button) {\n buttons.push({\n langKey: 'Cancel',\n isCancel: true\n });\n }\n\n return buttons;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {doubleRaf} from '../../helpers/schedulers';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {LangPackKey, _i18n, i18n} from '../../lib/langPack';\nimport {ApiLimitType} from '../../lib/mtproto/api_methods';\nimport rootScope from '../../lib/rootScope';\nimport PopupPeer from './peer';\n\nconst a: {[type in ApiLimitType]?: {\n title: LangPackKey,\n description: LangPackKey,\n descriptionPremium: LangPackKey,\n descriptionLocked: LangPackKey,\n icon: string\n}} = {\n pin: {\n title: 'LimitReached',\n description: 'LimitReachedPinDialogs',\n descriptionPremium: 'LimitReachedPinDialogsPremium',\n descriptionLocked: 'LimitReachedPinDialogsLocked',\n icon: 'limit_pin'\n },\n folders: {\n title: 'LimitReached',\n description: 'LimitReachedFolders',\n descriptionPremium: 'LimitReachedFoldersPremium',\n descriptionLocked: 'LimitReachedFoldersLocked',\n icon: 'limit_folders'\n }\n};\n\nclass P extends PopupPeer {\n constructor(options: {\n isPremium: boolean,\n limit: number,\n limitPremium: number\n }, _a: typeof a[keyof typeof a]) {\n super('popup-limit', {\n buttons: options.isPremium === undefined ? [{\n langKey: 'LimitReached.Ok',\n isCancel: true\n }] : (options.isPremium ? [{\n langKey: 'OK',\n isCancel: true\n }] : [{\n langKey: 'IncreaseLimit',\n callback: () => {\n appImManager.openPremiumBot();\n },\n noRipple: true\n }, {\n langKey: 'Cancel',\n isCancel: true\n }]),\n descriptionLangKey: options.isPremium === undefined ? _a.descriptionLocked : (options.isPremium ? _a.descriptionPremium : _a.description),\n descriptionLangArgs: options.isPremium ? [options.limitPremium] : [options.limit, options.limitPremium],\n titleLangKey: _a.title\n });\n\n const isLocked = options.isPremium === undefined;\n if(isLocked) {\n this.element.classList.add('is-locked');\n } else if(options.isPremium) {\n this.element.classList.add('is-premium');\n } else {\n const button = this.buttons.find((b) => !b.isCancel);\n button.element.classList.add('popup-limit-button');\n const i = document.createElement('i');\n i.classList.add('popup-limit-button-icon', 'tgico-premium_double');\n button.element.append(i);\n }\n\n const limitContainer = document.createElement('div');\n limitContainer.classList.add('popup-limit-line');\n\n const hint = document.createElement('div');\n hint.classList.add('popup-limit-hint');\n const i = document.createElement('span');\n i.classList.add('popup-limit-hint-icon', 'tgico-' + _a.icon);\n hint.append(i, '' + (options.isPremium ? options.limitPremium : options.limit));\n\n limitContainer.append(hint);\n\n if(!isLocked) {\n const limit = document.createElement('div');\n limit.classList.add('limit-line');\n\n const free = document.createElement('div');\n free.classList.add('limit-line-free');\n\n const premium = document.createElement('div');\n premium.classList.add('limit-line-premium');\n\n limit.append(free, premium);\n\n _i18n(free, 'LimitFree');\n premium.append(i18n('LimitPremium'), '' + options.limitPremium);\n\n limitContainer.append(limit);\n }\n\n this.container.insertBefore(limitContainer, this.description);\n\n // if(options.isPremium === false) {\n // this.buttons.pop().element.remove();\n // }\n\n const setHintActive = () => {\n hint.classList.add('active');\n };\n\n if(rootScope.settings.animationsEnabled) {\n doubleRaf().then(setHintActive);\n } else {\n setHintActive();\n }\n }\n}\n\nexport default async function showLimitPopup(type: keyof typeof a) {\n const _a = a[type];\n const [appConfig, limit, limitPremium] = await Promise.all([\n rootScope.managers.apiManager.getAppConfig(),\n ...[false, true].map((v) => rootScope.managers.apiManager.getLimit(type, v))\n ]);\n const isLocked = appConfig.premium_purchase_blocked;\n new P({\n isPremium: isLocked ? undefined : rootScope.premium,\n limit,\n limitPremium\n }, _a).show();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport tsNow from '../../helpers/tsNow';\nimport {LangPackKey} from '../../lib/langPack';\nimport {MUTE_UNTIL} from '../../lib/mtproto/mtproto_config';\nimport {RadioFormFromValues} from '../row';\nimport PopupPeer from './peer';\n\nconst ONE_HOUR = 3600;\nconst times: {value: number | string, langPackKey: LangPackKey, checked?: boolean}[] = [{\n value: ONE_HOUR,\n langPackKey: 'ChatList.Mute.1Hour'\n}, {\n value: ONE_HOUR * 4,\n langPackKey: 'ChatList.Mute.4Hours'\n}, {\n value: ONE_HOUR * 8,\n langPackKey: 'ChatList.Mute.8Hours'\n}, {\n value: ONE_HOUR * 24,\n langPackKey: 'ChatList.Mute.1Day'\n}, {\n value: ONE_HOUR * 24 * 3,\n langPackKey: 'ChatList.Mute.3Days'\n}, {\n value: -1,\n langPackKey: 'ChatList.Mute.Forever',\n checked: true\n}];\n\nexport default class PopupMute extends PopupPeer {\n constructor(peerId: PeerId, threadId?: number) {\n super('popup-mute', {\n peerId,\n titleLangKey: 'Notifications',\n buttons: [{\n langKey: 'ChatList.Context.Mute',\n callback: () => {\n this.managers.appMessagesManager.mutePeer({peerId, muteUntil: time === -1 ? MUTE_UNTIL : tsNow(true) + time, threadId});\n }\n }],\n body: true\n });\n\n let time: number;\n const radioForm = RadioFormFromValues(times, (value) => {\n time = +value;\n });\n\n this.body.append(radioForm);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from '../avatar';\nimport PopupElement, {addCancelButton, PopupButton, PopupOptions} from '.';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport CheckboxField, {CheckboxFieldOptions} from '../checkboxField';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\n\nexport type PopupPeerButton = Omit & Partial<{callback: PopupPeerButtonCallback}>;\nexport type PopupPeerButtonCallbackCheckboxes = Set;\nexport type PopupPeerButtonCallback = (checkboxes?: PopupPeerButtonCallbackCheckboxes) => void;\nexport type PopupPeerCheckboxOptions = CheckboxFieldOptions & {checkboxField?: CheckboxField};\n\nexport type PopupPeerOptions = Omit & Partial<{\n peerId: PeerId,\n threadId: number,\n title: string | HTMLElement,\n titleLangKey: LangPackKey,\n titleLangArgs: any[],\n noTitle: boolean,\n description: string | DocumentFragment,\n descriptionLangKey: LangPackKey,\n descriptionLangArgs: any[],\n buttons: Array,\n checkboxes: Array\n}>;\nexport default class PopupPeer extends PopupElement {\n protected description: HTMLParagraphElement;\n\n constructor(private className: string, options: PopupPeerOptions = {}) {\n super('popup-peer' + (className ? ' ' + className : ''), {\n overlayClosable: true,\n ...options,\n title: true,\n buttons: options.buttons && addCancelButton(options.buttons)\n });\n\n if(options.peerId) {\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('avatar-32');\n avatarEl.updateWithOptions({\n isDialog: true,\n peerId: options.peerId,\n threadId: options.threadId,\n wrapOptions: {\n middleware: this.middlewareHelper.get()\n }\n });\n this.header.prepend(avatarEl);\n }\n\n if(!options.noTitle) {\n if(options.titleLangKey || !options.title) this.title.append(i18n(options.titleLangKey || 'AppName', options.titleLangArgs));\n else if(options.title instanceof HTMLElement) {\n this.title.append(options.title);\n } else this.title.innerText = options.title || '';\n }\n\n const fragment = document.createDocumentFragment();\n\n if(options.descriptionLangKey || options.description) {\n const p = this.description = document.createElement('p');\n p.classList.add('popup-description');\n if(options.descriptionLangKey) p.append(i18n(options.descriptionLangKey, options.descriptionLangArgs));\n else if(options.description) setInnerHTML(p, options.description);\n\n fragment.append(p);\n }\n\n if(options.checkboxes) {\n this.container.classList.add('have-checkbox');\n\n options.checkboxes.forEach((o) => {\n o.withRipple = true;\n const checkboxField = new CheckboxField(o);\n o.checkboxField = checkboxField;\n fragment.append(checkboxField.label);\n });\n\n options.buttons.forEach((button) => {\n if(button.callback) {\n const original = button.callback;\n button.callback = () => {\n const c: Set = new Set();\n options.checkboxes.forEach((o) => {\n if(o.checkboxField.checked) {\n c.add(o.text);\n }\n });\n original(c);\n };\n }\n });\n }\n\n this.container.insertBefore(fragment, this.header.nextElementSibling);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport AppSelectPeers from '../appSelectPeers';\nimport PopupElement from '.';\nimport {LangPackKey, _i18n} from '../../lib/langPack';\n\nexport default class PopupPickUser extends PopupElement {\n protected selector: AppSelectPeers;\n\n constructor(options: {\n peerTypes: AppSelectPeers['peerType'],\n onSelect?: (peerId: PeerId) => Promise | void,\n placeholder: LangPackKey,\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\n peerId?: number,\n selfPresence?: LangPackKey\n }) {\n super('popup-forward', {closable: true, overlayClosable: true, body: true, title: true});\n\n this.selector = new AppSelectPeers({\n appendTo: this.body,\n onChange: async() => {\n const selected = this.selector.getSelected();\n const peerId = selected[selected.length - 1].toPeerId();\n\n if(options.onSelect) {\n const res = options.onSelect(peerId);\n if(res instanceof Promise) {\n try {\n await res;\n } catch(err) {\n return;\n }\n }\n }\n\n this.selector = null;\n this.hide();\n },\n peerType: options.peerTypes,\n onFirstRender: () => {\n this.show();\n this.selector.checkForTriggers(); // ! due to zero height before mounting\n\n if(!IS_TOUCH_SUPPORTED) {\n this.selector.input.focus();\n }\n },\n chatRightsAction: options.chatRightsAction,\n multiSelect: false,\n rippleEnabled: false,\n avatarSize: 'abitbigger',\n peerId: options.peerId,\n placeholder: options.placeholder,\n selfPresence: options.selfPresence,\n managers: this.managers\n });\n\n this.scrollable = this.selector.scrollable;\n this.attachScrollableListeners();\n\n // this.scrollable = new Scrollable(this.body);\n\n this.title.append(this.selector.input);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupPeer from './peer';\n\nexport default class PopupSendNow extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-delete-chat', {\n title: `Send Message${mids.length > 1 ? 's' : ''} Now`,\n description: mids.length > 1 ? 'Send ' + mids.length + ' messages now?' : 'Send message now?',\n buttons: [{\n langKey: 'Send',\n callback: () => {\n onConfirm && onConfirm();\n this.managers.appMessagesManager.sendScheduledMessages(peerId, mids);\n }\n }]\n });\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppStickersManager} from '../../lib/appManagers/appStickersManager';\nimport PopupElement from '.';\nimport wrapSticker from '../wrappers/sticker';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport {putPreloader} from '../putPreloader';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {i18n} from '../../lib/langPack';\nimport Button from '../button';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {toastNew} from '../toast';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport createStickersContextMenu from '../../helpers/dom/createStickersContextMenu';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport {Document, StickerSet} from '../../layer';\nimport Row from '../row';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport rootScope from '../../lib/rootScope';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport emoticonsDropdown from '../emoticonsDropdown';\n\nconst ANIMATION_GROUP: AnimationItemGroup = 'STICKERS-POPUP';\n\nexport default class PopupStickers extends PopupElement {\n private stickersFooter: HTMLElement;\n private appendTo: HTMLElement;\n private updateAdded: {[setId: Long]: (added: boolean) => void};\n private sets: StickerSet.stickerSet[];\n private button: HTMLElement;\n\n constructor(\n private stickerSetInput: Parameters[0] | Parameters[0][],\n private isEmojis?: boolean\n ) {\n super('popup-stickers', {closable: true, overlayClosable: true, body: true, scrollable: true, title: true});\n\n this.title.append(i18n('Loading'));\n this.updateAdded = {};\n\n emoticonsDropdown.setIgnoreMouseOut('popup', true);\n this.addEventListener('close', () => {\n emoticonsDropdown.setIgnoreMouseOut('popup', false);\n animationIntersector.setOnlyOnePlayableGroup();\n });\n\n this.appendTo = this.scrollable.container;\n\n this.appendTo.classList.add('is-loading');\n putPreloader(this.appendTo, true);\n\n this.stickersFooter = document.createElement('div');\n this.stickersFooter.classList.add('sticker-set-footer');\n\n const btn = Button('btn-primary btn-primary-transparent disable-hover', {noRipple: true, text: 'Loading'});\n this.stickersFooter.append(btn);\n\n this.body.append(this.stickersFooter);\n\n attachStickerViewerListeners({listenTo: this.appendTo, listenerSetter: this.listenerSetter});\n\n const onStickerSetUpdate = (set: StickerSet.stickerSet) => {\n const idx = this.sets.findIndex((_set) => _set.id === set.id);\n if(idx === -1) {\n return;\n }\n\n this.sets[idx] = set;\n const updateAdded = this.updateAdded[set.id];\n updateAdded?.(!!set.installed_date);\n this.updateButton();\n };\n\n this.listenerSetter.add(rootScope)('stickers_installed', onStickerSetUpdate);\n this.listenerSetter.add(rootScope)('stickers_deleted', onStickerSetUpdate);\n\n this.loadStickerSet();\n }\n\n private createStickerSetElements(set?: StickerSet.stickerSet) {\n const container = document.createElement('div');\n container.classList.add('sticker-set');\n\n let headerRow: Row, updateAdded: (added: boolean) => void;\n if(set) {\n headerRow = new Row({\n title: wrapEmojiText(set.title),\n subtitle: i18n(set.pFlags.emojis ? 'EmojiCount' : 'Stickers', [set.count]),\n buttonRight: true\n });\n\n updateAdded = (added) => {\n replaceContent(headerRow.buttonRight, i18n(added ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n headerRow.buttonRight.classList.toggle('active', added);\n };\n\n updateAdded(!!set.installed_date);\n\n container.append(headerRow.container);\n }\n\n const itemsContainer = document.createElement('div');\n itemsContainer.classList.add('sticker-set-stickers');\n\n container.append(itemsContainer);\n\n return {container, headerRow, updateAdded, itemsContainer};\n }\n\n private onStickersClick = async(e: MouseEvent) => {\n const target = findUpClassName(e.target, 'sticker-set-sticker');\n if(!target) return;\n\n const docId = target.dataset.docId;\n if(await appImManager.chat.input.sendMessageWithDocument(docId)) {\n this.hide();\n }\n };\n\n private async loadStickerSet() {\n const middleware = this.middlewareHelper.get();\n const inputs = Array.isArray(this.stickerSetInput) ? this.stickerSetInput : [this.stickerSetInput];\n const setsPromises = inputs.map((input) => this.managers.appStickersManager.getStickerSet(input));\n let sets = await Promise.all(setsPromises);\n if(!middleware()) return;\n let firstSet = sets[0];\n if(sets.length === 1 && !firstSet) {\n toastNew({langPackKey: this.isEmojis ? 'AddEmojiNotFound' : 'StickerSet.DontExist'});\n this.hide();\n return;\n }\n\n sets = sets.filter(Boolean);\n firstSet = sets[0];\n\n this.sets = sets.map((set) => set.set);\n\n const isEmojis = this.isEmojis ??= !!firstSet.set.pFlags.emojis;\n\n if(!isEmojis) {\n attachClickEvent(this.appendTo, this.onStickersClick, {listenerSetter: this.listenerSetter});\n\n const {destroy} = createStickersContextMenu({\n listenTo: this.appendTo,\n isStickerPack: true,\n onSend: () => this.hide()\n });\n\n this.addEventListener('close', destroy);\n }\n\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\n\n const lazyLoadQueue = new LazyLoadQueue();\n const loadPromises: Promise[] = [];\n\n const containersPromises = sets.map(async(set) => {\n const {container, itemsContainer, headerRow, updateAdded} = this.createStickerSetElements(sets.length > 1 ? set.set : undefined);\n\n if(headerRow) {\n attachClickEvent(headerRow.buttonRight, () => {\n this.managers.appStickersManager.toggleStickerSet(set.set);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.updateAdded[set.set.id] = updateAdded;\n\n let divs: (HTMLElement | DocumentFragment)[];\n\n const docs = set.documents.filter((doc) => doc?._ === 'document') as Document.document[];\n if(isEmojis) {\n const fragment = wrapCustomEmoji({\n docIds: docs.map((doc) => doc.id),\n loadPromises,\n animationGroup: ANIMATION_GROUP,\n customEmojiSize: mediaSizes.active.esgCustomEmoji,\n middleware\n // lazyLoadQueue\n });\n\n (Array.from(fragment.children) as HTMLElement[]).slice(1).forEach((element) => {\n const span = document.createElement('span');\n span.classList.add('super-emoji');\n element.replaceWith(span);\n span.append(element);\n });\n\n divs = [fragment];\n\n itemsContainer.classList.replace('sticker-set-stickers', 'super-emojis');\n itemsContainer.classList.add('is-emojis', 'not-local');\n } else {\n divs = await Promise.all(docs.map(async(doc) => {\n const div = document.createElement('div');\n div.classList.add('sticker-set-sticker');\n\n const size = mediaSizes.active.popupSticker.width;\n\n await wrapSticker({\n doc,\n div,\n lazyLoadQueue,\n group: ANIMATION_GROUP,\n play: true,\n loop: true,\n width: size,\n height: size,\n withLock: true,\n loadPromises,\n middleware\n });\n\n return div;\n }));\n }\n\n itemsContainer.append(...divs.filter(Boolean));\n\n return container;\n });\n\n const containers = await Promise.all(containersPromises);\n await Promise.all(loadPromises);\n\n const button = this.button = Button('', {noRipple: true});\n\n this.updateButton();\n\n attachClickEvent(button, () => {\n const toggle = toggleDisability([button], true);\n\n this.managers.appStickersManager.toggleStickerSets(sets.map((set) => set.set)).then(() => {\n this.hide();\n }).catch(() => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n\n if(sets.length === 1) {\n setInnerHTML(this.title, wrapEmojiText(firstSet.set.title));\n } else {\n setInnerHTML(this.title, i18n('Emoji'));\n }\n\n this.stickersFooter.textContent = '';\n this.stickersFooter.append(button);\n\n this.appendTo.classList.remove('is-loading');\n this.appendTo.textContent = '';\n this.appendTo.append(...containers);\n\n this.scrollable.onAdditionalScroll();\n }\n\n private updateButton() {\n const {sets, isEmojis} = this;\n let isAdd: boolean, buttonAppend: HTMLElement;\n if(sets.length === 1) {\n const firstSet = sets[0];\n buttonAppend = i18n(isEmojis ? 'EmojiCount' : 'Stickers', [firstSet.count]);\n isAdd = !firstSet.installed_date;\n } else {\n const installed = sets.filter((set) => set.installed_date);\n let count: number;\n if(sets.length === installed.length) {\n isAdd = false;\n count = sets.length;\n } else {\n isAdd = true;\n count = sets.length - installed.length;\n }\n\n buttonAppend = i18n('EmojiPackCount', [count]);\n }\n\n this.button.className = isAdd ? 'btn-primary btn-color-primary' : 'btn-primary btn-primary-transparent danger';\n replaceContent(this.button, i18n(isAdd ? 'AddStickersCount' : 'RemoveStickersCount', [buttonAppend]));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CancellablePromise} from '../helpers/cancellablePromise';\nimport SetTransition from './singleTransition';\nimport {fastRaf} from '../helpers/schedulers';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport safeAssign from '../helpers/object/safeAssign';\n\nconst TRANSITION_TIME = 200;\n\nexport default class ProgressivePreloader {\n public preloader: HTMLDivElement;\n public circle: SVGCircleElement;\n private cancelSvg: SVGSVGElement;\n private downloadSvg: HTMLElement;\n\n private tempId = 0;\n public detached = true;\n\n public promise: CancellablePromise = null;\n\n public isUpload = false;\n private cancelable = true;\n private streamable = false;\n private tryAgainOnFail = true;\n private attachMethod: 'append' | 'prepend' = 'append';\n\n public loadFunc: (e?: Event) => any;\n\n public totalLength: number;\n\n constructor(options?: Partial<{\n isUpload: ProgressivePreloader['isUpload'],\n cancelable: ProgressivePreloader['cancelable'],\n streamable: ProgressivePreloader['streamable'],\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\n attachMethod: ProgressivePreloader['attachMethod']\n }>) {\n if(options) {\n safeAssign(this, options);\n }\n\n if(this.isUpload) {\n this.tryAgainOnFail = false;\n }\n }\n\n public constructContainer(options: Partial<{\n color: 'transparent',\n bold: boolean\n }> = {}) {\n if(!this.preloader) {\n this.preloader = document.createElement('div');\n this.preloader.classList.add('preloader-container');\n\n if(options.color) {\n this.preloader.classList.add('preloader-' + options.color);\n }\n\n if(options.bold) {\n this.preloader.classList.add('preloader-bold');\n }\n\n if(this.streamable) {\n this.preloader.classList.add('preloader-streamable');\n }\n }\n }\n\n public constructDownloadIcon() {\n this.constructContainer();\n }\n\n public construct() {\n this.construct = null;\n\n this.constructContainer();\n\n this.preloader.innerHTML = `\n
\n \n \n \n
`;\n\n if(this.streamable) {\n this.totalLength = 118.61124420166016;\n } else {\n this.totalLength = 149.82473754882812;\n }\n\n if(this.cancelable) {\n this.preloader.innerHTML += `\n \n \n \n \n \n \n \n \n \n \n \n `;\n\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\n } else {\n this.preloader.classList.add('preloader-swing');\n }\n\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\n\n if(this.cancelable) {\n attachClickEvent(this.preloader, this.onClick);\n }\n }\n\n public onClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.preloader.classList.contains('manual')) {\n if(this.loadFunc) {\n this.loadFunc(e);\n }\n } else {\n if(this.promise && this.promise.cancel) {\n this.promise.cancel();\n }\n }\n };\n\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\n this.loadFunc = func;\n }\n\n public setManual() {\n this.preloader.classList.add('manual');\n this.setProgress(0);\n }\n\n public attachPromise(promise: CancellablePromise) {\n if(this.isUpload && this.promise) return;\n\n this.promise = promise;\n\n const tempId = --this.tempId;\n const startTime = Date.now();\n\n const onEnd = (err: Error) => {\n promise.notify = promise.notifyAll = null;\n\n if(tempId !== this.tempId) {\n return;\n }\n\n const elapsedTime = Date.now() - startTime;\n\n // console.log('[PP]: end', this.detached, performance.now());\n\n if(!err && this.cancelable) {\n this.setProgress(100);\n\n const delay = TRANSITION_TIME * 0.75;\n\n if(elapsedTime < delay) {\n this.detach();\n } else {\n setTimeout(() => { // * wait for transition complete\n if(tempId === this.tempId) {\n this.detach();\n }\n }, delay);\n }\n } else {\n if(this.tryAgainOnFail) {\n this.attach(this.preloader.parentElement);\n fastRaf(() => {\n this.setManual();\n });\n } else {\n this.detach();\n }\n }\n\n this.promise = promise = null;\n };\n\n promise\n .then(() => onEnd(null))\n .catch((err) => onEnd(err));\n\n if(promise.addNotifyListener) {\n promise.addNotifyListener((details: {done: number, total: number}) => {\n /* if(details.done >= details.total) {\n onEnd();\n } */\n\n if(tempId !== this.tempId) return;\n\n // console.log('preloader download', promise, details);\n const percents = details.done / details.total * 100;\n this.setProgress(percents);\n });\n }\n }\n\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\n if(this.construct) {\n this.construct();\n }\n\n if(this.preloader.parentElement) {\n this.preloader.classList.remove('manual');\n }\n\n this.detached = false;\n\n if(promise/* && false */) {\n this.attachPromise(promise);\n }\n\n let useRafs = 0;\n if(this.detached || this.preloader.parentElement !== elem) {\n useRafs = isInDOM(this.preloader) ? 1 : 2;\n if(this.preloader.parentElement !== elem) {\n elem[this.attachMethod](this.preloader);\n }\n }\n\n SetTransition({\n element: this.preloader,\n className: 'is-visible',\n forwards: true,\n duration: TRANSITION_TIME,\n useRafs\n });\n\n if(this.cancelable && reset) {\n this.setProgress(0);\n }\n }\n\n public detach() {\n if(this.detached) {\n return;\n }\n // return;\n\n this.detached = true;\n\n // return;\n\n if(this.preloader?.parentElement) {\n /* setTimeout(() => */// fastRaf(() => {\n /* if(!this.detached) return;\n this.detached = true; */\n\n // fastRaf(() => {\n // console.log('[PP]: detach after rAF', this.detached, performance.now());\n\n // if(!this.detached || !this.preloader.parentElement) {\n // return;\n // }\n\n SetTransition({\n element: this.preloader,\n className: 'is-visible',\n forwards: false,\n duration: TRANSITION_TIME,\n onTransitionEnd: () => {\n this.preloader.remove();\n },\n useRafs: 1\n });\n // });\n // })/* , 5e3) */;\n }\n }\n\n public setProgress(percents: number) {\n if(!this.totalLength && !isInDOM(this.circle)) {\n return;\n }\n\n if(percents === 0) {\n this.circle.style.strokeDasharray = '';\n return;\n }\n\n try {\n if(!this.totalLength) {\n this.totalLength = this.circle.getTotalLength();\n }\n\n // console.log('setProgress', (percents / 100 * totalLength));\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\n } catch(err) {}\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {PeerPhotoSize} from '../lib/appManagers/appAvatarsManager';\nimport getPreviewURLFromBytes from '../helpers/bytes/getPreviewURLFromBytes';\nimport {renderImageFromUrlPromise} from '../helpers/dom/renderImageFromUrl';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {recordPromise} from '../helpers/recordPromise';\nimport sequentialDom from '../helpers/sequentialDom';\nimport {UserProfilePhoto, ChatPhoto, User, Chat} from '../layer';\nimport getPeerColorById from '../lib/appManagers/utils/peers/getPeerColorById';\nimport getPeerPhoto from '../lib/appManagers/utils/peers/getPeerPhoto';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\nimport rootScope from '../lib/rootScope';\nimport getPeerInitials from './wrappers/getPeerInitials';\nimport {wrapTopicIcon} from './wrappers/messageActionTextNewUnsafe';\nimport makeError from '../helpers/makeError';\nimport noop from '../helpers/noop';\n\nexport async function putAvatar(\n div: HTMLElement,\n peerId: PeerId,\n photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto,\n size: PeerPhotoSize,\n img = new Image(),\n onlyThumb = false\n) {\n const r = await rootScope.managers.acknowledged.appAvatarsManager.loadAvatar(peerId, photo, size);\n const loadPromise = r.result;\n const cached = r.cached;\n\n img.classList.add('avatar-photo');\n\n let renderThumbPromise: Promise;\n let callback: () => void;\n let thumbImage: HTMLImageElement;\n if(cached) {\n // смотри в misc.ts: renderImageFromUrl\n callback = () => {\n replaceContent(div, img);\n div.dataset.color = '';\n };\n } else {\n const animate = rootScope.settings.animationsEnabled;\n if(animate) {\n img.classList.add('fade-in');\n }\n\n let isFullLoaded = false;\n if(size === 'photo_big') { // let's load small photo first\n const res = await putAvatar(div, peerId, photo, 'photo_small');\n renderThumbPromise = res.loadThumbPromise || res.loadPromise;\n thumbImage = res.thumbImage;\n } else if(photo.stripped_thumb) {\n thumbImage = new Image();\n div.classList.add('avatar-relative');\n thumbImage.classList.add('avatar-photo', 'avatar-photo-thumbnail');\n const url = getPreviewURLFromBytes(photo.stripped_thumb);\n renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => {\n if(isFullLoaded) {\n return;\n }\n\n replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\n isFullLoaded = true;\n\n if(thumbImage) {\n div.append(img);\n } else {\n replaceContent(div, img);\n }\n\n setTimeout(() => {\n if(div.childElementCount) {\n sequentialDom.mutateElement(img, () => {\n div.dataset.color = '';\n\n if(animate) {\n img.classList.remove('fade-in');\n }\n\n thumbImage?.remove();\n });\n }\n }, animate ? 200 : 0);\n };\n }\n\n const renderPromise = loadPromise\n .then((url) => renderImageFromUrlPromise(img, url/* , !cached */))\n .then(callback);\n\n renderThumbPromise && await renderThumbPromise.catch(noop);\n\n return {\n cached,\n loadPromise: renderPromise,\n loadThumbPromise: cached ? renderPromise : renderThumbPromise || Promise.resolve(),\n thumbImage\n };\n}\n\nfunction set(\n div: HTMLElement,\n innerHTML: Parameters[1],\n color: string,\n icon?: string,\n isForum?: boolean,\n isTopic?: boolean\n) {\n setInnerHTML(div, innerHTML);\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled', 'is-forum', 'is-topic');\n icon && div.classList.add(icon);\n isForum && div.classList.add('is-forum');\n isTopic && div.classList.add('is-topic');\n}\n\n// peerId === peerId || title\nexport default async function putPhoto({\n div,\n peerId,\n isDialog = false,\n title = '',\n onlyThumb = false,\n isBig,\n threadId,\n wrapOptions = {}\n}: {\n div: HTMLElement,\n peerId: PeerId,\n isDialog?: boolean,\n title?: string,\n onlyThumb?: boolean,\n isBig?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions\n}) {\n const myId = rootScope.myId;\n\n if(peerId === myId && isDialog) {\n set(div, '', '', 'tgico-saved');\n return;\n }\n\n const managers = rootScope.managers;\n\n if(threadId) {\n const topic = await managers.dialogsStorage.getForumTopic(peerId, threadId);\n set(div, '', '', undefined, undefined, true);\n\n if(wrapOptions.customEmojiSize) {\n div.style.setProperty('--size', wrapOptions.customEmojiSize.width + 'px');\n }\n\n return wrapTopicIcon({\n ...wrapOptions,\n topic,\n lazyLoadQueue: false\n }).then((icon) => {\n div.replaceChildren(icon);\n });\n }\n\n const peer = await managers.appPeersManager.getPeer(peerId);\n if(peerId !== NULL_PEER_ID && peerId.isUser() && (peer as User.user)?.pFlags?.deleted) {\n set(div, '', getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n\n const isForum = !!(peer as Chat.channel)?.pFlags?.forum;\n const size: PeerPhotoSize = isBig ? 'photo_big' : 'photo_small';\n const photo = getPeerPhoto(peer);\n const avatarAvailable = !!photo;\n const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji');\n if(!avatarAvailable || !avatarRendered || !(await managers.appAvatarsManager.isAvatarCached(peerId, size))) {\n let color = '';\n if(peerId && (peerId !== myId || !isDialog)) {\n color = getPeerColorById(peerId);\n }\n\n if(peerId === REPLIES_PEER_ID) {\n set(div, '', color, 'tgico-reply_filled');\n return;\n }\n\n const abbr = title ? wrapAbbreviation(title) : getPeerInitials(peer);\n set(div, abbr, color, '', isForum);\n // return Promise.resolve(true);\n }\n\n if(avatarAvailable/* && false */) {\n const promise = putAvatar(div, peerId, photo, size, undefined, onlyThumb);\n // recordPromise(promise, 'putAvatar-' + peerId);\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Chat, User} from '../../layer';\nimport wrapAbbreviation from '../../lib/richTextProcessor/wrapAbbreviation';\n\nexport default function getPeerInitials(peer: Chat | User) {\n let str = '';\n if(peer) {\n str = (peer as Chat.chat).title ?? [\n (peer as User.user).first_name,\n (peer as User.user).last_name\n ].filter(Boolean).join(' ');\n }\n\n return wrapAbbreviation(str);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\n\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\n const html = `\n \n \n `;\n\n if(returnDiv) {\n const div = document.createElement('div');\n div.classList.add('preloader');\n div.innerHTML = html;\n\n if(elem) {\n elem.appendChild(div);\n }\n\n return div;\n }\n\n elem.insertAdjacentHTML('beforeend', html);\n return elem.lastElementChild as HTMLElement;\n}\n\nMOUNT_CLASS_TO.putPreloader = putPreloader;\n\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\n elem.classList.remove('tgico-' + icon);\n elem.disabled = true;\n putPreloader(elem);\n\n return () => {\n elem.innerHTML = '';\n elem.classList.add('tgico-' + icon);\n elem.removeAttribute('disabled');\n };\n}\n\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\n Array.from(elements).forEach((el) => {\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\n if(!match) return;\n to[match[1]] = el as HTMLElement;\n });\n} */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getDeepProperty from '../helpers/object/getDeepProperty';\nimport {LangPackKey, _i18n} from '../lib/langPack';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport rootScope from '../lib/rootScope';\n\nexport default class RadioField {\n public input: HTMLInputElement;\n public label: HTMLLabelElement;\n public main: HTMLElement;\n\n constructor(options: {\n text?: string,\n langKey?: LangPackKey,\n name: string,\n value?: string,\n stateKey?: string,\n alignRight?: boolean\n }) {\n const label = this.label = document.createElement('label');\n label.classList.add('radio-field');\n\n if(options.alignRight) {\n label.classList.add('radio-field-right');\n }\n\n const input = this.input = document.createElement('input');\n input.type = 'radio';\n /* input.id = */input.name = 'input-radio-' + options.name;\n\n if(options.value) {\n input.value = options.value;\n\n if(options.stateKey) {\n apiManagerProxy.getState().then((state) => {\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\n });\n\n input.addEventListener('change', () => {\n rootScope.managers.appStateManager.setByKey(options.stateKey, options.value);\n });\n }\n }\n\n const main = this.main = document.createElement('div');\n main.classList.add('radio-field-main');\n\n if(options.text) {\n main.innerHTML = options.text;\n /* const caption = document.createElement('div');\n caption.classList.add('radio-field-main-caption');\n caption.innerHTML = text;\n\n if(subtitle) {\n label.classList.add('radio-field-with-subtitle');\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\n }\n\n main.append(caption); */\n } else if(options.langKey) {\n _i18n(main, options.langKey);\n }\n\n label.append(input, main);\n }\n\n get checked() {\n return this.input.checked;\n }\n\n set checked(checked: boolean) {\n this.setValueSilently(checked);\n\n const event = new Event('change', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(checked: boolean) {\n this.input.checked = checked;\n }\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function RadioForm(radios: {container: HTMLElement, input: HTMLInputElement}[], onChange: (value: string, event: Event) => void) {\n const form = document.createElement('form');\n\n radios.forEach((r) => {\n const {container, input} = r;\n form.append(container);\n input.addEventListener('change', (e) => {\n if(input.checked) {\n onChange(input.value, e);\n }\n });\n });\n\n return form;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport attachGrabListeners, {GrabEvent} from '../helpers/dom/attachGrabListeners';\nimport clamp from '../helpers/number/clamp';\nimport safeAssign from '../helpers/object/safeAssign';\n\nexport default class RangeSelector {\n public container: HTMLDivElement;\n protected filled: HTMLDivElement;\n protected seek: HTMLInputElement;\n\n public mousedown = false;\n protected rect: DOMRect;\n protected _removeListeners: () => void;\n\n private events: Partial<{\n // onMouseMove: ProgressLine['onMouseMove'],\n onMouseDown: RangeSelector['onMouseDown'],\n onMouseUp: RangeSelector['onMouseUp'],\n onScrub: (value: number) => void\n }> = {};\n\n protected decimals: number;\n\n protected step: number;\n protected min: number;\n protected max: number;\n protected withTransition = false;\n protected useTransform = false;\n protected vertical = false;\n\n constructor(\n options: {\n step: RangeSelector['step'],\n min: RangeSelector['min'],\n max: RangeSelector['max'],\n withTransition?: RangeSelector['withTransition'],\n useTransform?: RangeSelector['useTransform'],\n vertical?: RangeSelector['vertical']\n },\n value = 0\n ) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('progress-line');\n\n // there is no sense in using transition with transform, because it is updating every frame\n if(this.useTransform) {\n this.container.classList.add('use-transform');\n } else if(this.withTransition) {\n this.container.classList.add('with-transition');\n }\n\n this.filled = document.createElement('div');\n this.filled.classList.add('progress-line__filled');\n\n const seek = this.seek = document.createElement('input');\n seek.classList.add('progress-line__seek');\n // seek.setAttribute('max', '0');\n seek.type = 'range';\n seek.step = '' + this.step;\n seek.min = '' + this.min;\n seek.max = '' + this.max;\n seek.value = '' + value;\n\n if(value) {\n this.setProgress(value);\n }\n\n const stepStr = '' + this.step;\n const index = stepStr.indexOf('.');\n this.decimals = index === -1 ? 0 : stepStr.length - index - 1;\n\n // this.setListeners();\n\n this.container.append(this.filled, seek);\n }\n\n get value() {\n return +this.seek.value;\n }\n\n public setHandlers(events: RangeSelector['events']) {\n this.events = events;\n }\n\n protected onMouseMove = (event: GrabEvent) => {\n this.scrub(event);\n };\n\n protected onMouseDown = (event: GrabEvent) => {\n this.rect = this.container.getBoundingClientRect();\n this.mousedown = true;\n this.scrub(event);\n this.container.classList.add('is-focused');\n this.events?.onMouseDown && this.events.onMouseDown(event);\n };\n\n protected onMouseUp = (event: GrabEvent) => {\n this.mousedown = false;\n this.container.classList.remove('is-focused');\n this.events?.onMouseUp && this.events.onMouseUp(event);\n };\n\n public setListeners() {\n this.seek.addEventListener('input', this.onInput);\n this._removeListeners = attachGrabListeners(this.container, this.onMouseDown, this.onMouseMove, this.onMouseUp);\n }\n\n public onInput = () => {\n const value = +this.seek.value;\n this.setFilled(value);\n this.events?.onScrub && this.events.onScrub(value);\n };\n\n public setProgress(value: number) {\n this.seek.value = '' + value;\n this.setFilled(+this.seek.value); // clamp\n }\n\n public addProgress(value: number) {\n this.seek.value = '' + (+this.seek.value + value);\n this.setFilled(+this.seek.value); // clamp\n }\n\n public setFilled(value: number) {\n let percents = (value - this.min) / (this.max - this.min);\n percents = clamp(percents, 0, 1);\n\n // using scaleX and width even with vertical because it will be rotated\n if(this.useTransform) {\n this.filled.style.transform = `scaleX(${percents})`;\n } else {\n this.filled.style.width = (percents * 100) + '%';\n }\n }\n\n protected scrub(event: GrabEvent) {\n const rectMax = this.vertical ? this.rect.height : this.rect.width;\n const offsetAxisValue = clamp(this.vertical ? -(event.y - this.rect.bottom) : event.x - this.rect.left, 0, rectMax);\n\n let value = this.min + (offsetAxisValue / rectMax * (this.max - this.min));\n\n if((value - this.min) < ((this.max - this.min) / 2)) {\n value -= this.step / 10;\n }\n\n value = +value.toFixed(this.decimals);\n value = clamp(value, this.min, this.max);\n\n // this.seek.value = '' + value;\n // this.onInput();\n\n this.setProgress(value);\n this.events?.onScrub && this.events.onScrub(value);\n\n return value;\n }\n\n public removeListeners() {\n if(this._removeListeners) {\n this._removeListeners();\n this._removeListeners = null;\n }\n\n this.seek.removeEventListener('input', this.onInput);\n\n this.events = {};\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport sequentialDom from '../helpers/sequentialDom';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport rootScope from '../lib/rootScope';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport {fastRaf} from '../helpers/schedulers';\n\nlet rippleClickId = 0;\nexport default function ripple(\n elem: HTMLElement,\n callback: (id: number) => Promise = () => Promise.resolve(),\n onEnd: (id: number) => void = null,\n prepend = false,\n attachListenerTo = elem\n) {\n // return;\n if(elem.querySelector('.c-ripple')) return;\n elem.classList.add('rp');\n\n const r = document.createElement('div');\n r.classList.add('c-ripple');\n\n const isSquare = elem.classList.contains('rp-square');\n if(isSquare) {\n r.classList.add('is-square');\n }\n\n elem[prepend ? 'prepend' : 'append'](r);\n\n let handler: () => void;\n // let animationEndPromise: Promise;\n const drawRipple = (clientX: number, clientY: number) => {\n const startTime = Date.now();\n const circle = document.createElement('div');\n\n const clickId = rippleClickId++;\n\n // console.log('ripple drawRipple');\n\n // const auto = elem.classList.contains('row-sortable') && !elem.classList.contains('cant-sort');\n const auto = false;\n const duration = (auto ? .3 : +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '')) * 1000;\n // console.log('ripple duration', duration);\n\n const _handler = handler = () => {\n // handler = () => animationEndPromise.then((duration) => {\n // console.log('ripple animation was:', duration);\n\n // const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\n // return;\n const elapsedTime = Date.now() - startTime;\n const cb = () => {\n // console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\n sequentialDom.mutate(() => {\n circle.remove();\n });\n\n onEnd?.(clickId);\n };\n if(elapsedTime < duration) {\n const delay = Math.max(duration - elapsedTime, duration / 2);\n setTimeout(() => circle.classList.add('hiding'), Math.max(delay - duration / 2, 0));\n\n setTimeout(cb, delay);\n } else {\n circle.classList.add('hiding');\n setTimeout(cb, duration / 2);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n window.removeEventListener('contextmenu', handler);\n window.removeEventListener('mousemove', handler);\n }\n\n handler = null;\n touchStartFired = false;\n };\n // });\n\n callback?.(clickId);\n\n /* callback().then((bad) => {\n if(bad) {\n span.remove();\n return;\n } */\n\n // console.log('ripple after promise', Date.now() - startTime);\n // console.log('ripple tooSlow:', tooSlow);\n /* if(tooSlow) {\n span.remove();\n return;\n } */\n\n fastRaf(() => {\n if(_handler !== handler) {\n return;\n }\n\n const rect = r.getBoundingClientRect();\n circle.classList.add('c-ripple__circle');\n\n const clickX = clientX - rect.left;\n const clickY = clientY - rect.top;\n\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\n const size = radius;\n\n // center of circle\n const x = clickX - size / 2;\n const y = clickY - size / 2;\n\n // console.log('ripple click', offsetFromCenter, size, clickX, clickY);\n\n circle.style.width = circle.style.height = size + 'px';\n circle.style.left = x + 'px';\n circle.style.top = y + 'px';\n\n // нижний код выполняется с задержкой\n /* animationEndPromise = new Promise((resolve) => {\n span.addEventListener('animationend', () => {\n // 713 -> 700\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\n }, {once: true});\n }); */\n\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\n /* span.style.display = 'none';\n r.append(span);\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\n span.style.display = ''; */\n\n r.append(circle);\n\n if(auto) {\n // window.addEventListener('mousemove', handler, {once: true, passive: true});\n handler();\n }\n\n // r.classList.add('active');\n // handler();\n });\n // });\n };\n\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) ||\n findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\n ) && (\n attachListenerTo === elem ||\n !findUpAsChild(e.target as HTMLElement, attachListenerTo)\n );\n\n // TODO: rename this variable\n let touchStartFired = false;\n if(IS_TOUCH_SUPPORTED) {\n const touchEnd = () => {\n handler?.();\n };\n\n attachListenerTo.addEventListener('touchstart', (e) => {\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n\n // console.log('ripple touchstart', e);\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\n return;\n }\n\n // console.log('touchstart', e);\n touchStartFired = true;\n\n const {clientX, clientY} = e.touches[0];\n drawRipple(clientX, clientY);\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\n\n window.addEventListener('touchmove', (e) => {\n e.cancelBubble = true;\n e.stopPropagation();\n touchEnd();\n attachListenerTo.removeEventListener('touchend', touchEnd);\n }, {once: true});\n }, {passive: true});\n } else {\n attachListenerTo.addEventListener('mousedown', (e) => {\n if(![0, 2].includes(e.button)) { // only left and right buttons\n return;\n }\n\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n // console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\n\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\n return;\n } else if(touchStartFired) {\n touchStartFired = false;\n return;\n }\n\n const {clientX, clientY} = e;\n drawRipple(clientX, clientY);\n window.addEventListener('mouseup', handler, {once: true, passive: true});\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\n }, {passive: true});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CheckboxField, {CheckboxFieldOptions} from './checkboxField';\nimport RadioField from './radioField';\nimport ripple from './ripple';\nimport {SliderSuperTab} from './slider';\nimport RadioForm from './radioForm';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport Button from './button';\nimport createContextMenu from '../helpers/dom/createContextMenu';\n\ntype K = string | HTMLElement | DocumentFragment | true;\n\nconst setContent = (element: HTMLElement, content: K) => {\n if(content === true) {\n\n } else if(typeof(content) === 'string') {\n setInnerHTML(element, content);\n } else {\n element.append(content);\n }\n};\n\nexport type RowMediaSizeType = 'small' | 'medium' | 'big' | 'abitbigger' | 'bigger';\n\nexport default class Row {\n public container: HTMLElement;\n public title: HTMLElement;\n public titleRow: HTMLElement;\n public titleRight: HTMLElement;\n public media: HTMLElement;\n\n public subtitleRow: HTMLElement;\n public subtitleRight: HTMLElement;\n\n public checkboxField: CheckboxField;\n public radioField: RadioField;\n\n public freezed = false;\n\n public buttonRight: HTMLElement;\n\n private _subtitle: HTMLElement;\n private _midtitle: HTMLElement;\n\n constructor(options: Partial<{\n icon: string,\n subtitle: K,\n subtitleLangKey: LangPackKey,\n subtitleLangArgs: any[],\n subtitleRight: K,\n radioField: Row['radioField'],\n checkboxField: Row['checkboxField'],\n checkboxFieldOptions: CheckboxFieldOptions,\n withCheckboxSubtitle: boolean,\n title: K,\n titleLangKey: LangPackKey,\n titleRight: K,\n titleRightSecondary: K,\n clickable: boolean | ((e: Event) => void),\n navigationTab: SliderSuperTab,\n havePadding: boolean,\n noRipple: boolean,\n noWrap: boolean,\n listenerSetter: ListenerSetter,\n buttonRight?: HTMLElement | boolean,\n buttonRightLangKey: LangPackKey,\n asLink: boolean,\n contextMenu: Omit[0], 'findElement' | 'listenTo' | 'listenerSetter'>\n }> = {}) {\n if(options.checkboxFieldOptions) {\n options.checkboxField = new CheckboxField({\n listenerSetter: options.listenerSetter,\n ...options.checkboxFieldOptions\n });\n }\n\n const tagName = options.asLink ? 'a' : (options.radioField || options.checkboxField ? 'label' : 'div');\n this.container = document.createElement(tagName);\n this.container.classList.add('row', 'no-subtitle');\n\n if(options.noWrap) {\n this.container.classList.add('no-wrap');\n }\n\n if(options.subtitle) {\n const subtitle = this.subtitle;\n setContent(subtitle, options.subtitle);\n\n if(options.noWrap) subtitle.classList.add('no-wrap');\n\n if(options.subtitleRight) {\n this.container.append(this.subtitleRow = this.createRow());\n this.subtitleRow.classList.add('row-subtitle-row');\n const subtitleRight = this.subtitleRight = document.createElement('div');\n subtitleRight.classList.add('row-subtitle', 'row-subtitle-right');\n\n setContent(subtitleRight, options.subtitleRight);\n this.subtitleRow.append(subtitle, subtitleRight);\n }\n } else if(options.subtitleLangKey) {\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\n }\n\n let havePadding = !!options.havePadding;\n if(options.radioField || options.checkboxField) {\n if(options.radioField) {\n this.radioField = options.radioField;\n this.container.append(this.radioField.label);\n havePadding = true;\n }\n\n if(options.checkboxField) {\n this.checkboxField = options.checkboxField;\n\n const isToggle = options.checkboxField.label.classList.contains('checkbox-field-toggle');\n if(isToggle) {\n this.container.classList.add('row-with-toggle');\n options.titleRight = this.checkboxField.label;\n } else {\n havePadding = true;\n this.container.append(this.checkboxField.label);\n }\n\n if(options.withCheckboxSubtitle && !isToggle) {\n const onChange = () => {\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\n };\n\n if(options.listenerSetter) options.listenerSetter.add(this.checkboxField.input)('change', onChange);\n else this.checkboxField.input.addEventListener('change', onChange);\n }\n }\n\n const i = options.radioField || options.checkboxField;\n i.label.classList.add('disable-hover');\n }\n\n if(options.title || options.titleLangKey) {\n let c: HTMLElement;\n const titleRightContent = options.titleRight || options.titleRightSecondary;\n if(titleRightContent) {\n this.container.append(c = this.titleRow = this.createRow());\n this.titleRow.classList.add('row-title-row');\n } else {\n c = this.container;\n }\n\n this.title = this.createTitle();\n if(options.noWrap) this.title.classList.add('no-wrap');\n if(options.title) {\n setContent(this.title, options.title);\n } else if(options.titleLangKey) {\n this.title.append(i18n(options.titleLangKey));\n }\n\n c.append(this.title);\n\n if(titleRightContent) {\n const titleRight = this.titleRight = document.createElement('div');\n titleRight.classList.add('row-title', 'row-title-right');\n\n if(options.titleRightSecondary) {\n titleRight.classList.add('row-title-right-secondary');\n }\n\n setContent(titleRight, titleRightContent);\n c.append(titleRight);\n }\n }\n\n if(options.icon) {\n havePadding = true;\n // this.title.classList.add('tgico', 'tgico-' + options.icon);\n this.container.classList.add('tgico', 'tgico-' + options.icon);\n this.container.classList.add('row-with-icon');\n }\n\n if(havePadding) {\n this.container.classList.add('row-with-padding');\n }\n\n if(options.navigationTab) {\n options.clickable = () => options.navigationTab.open();\n }\n\n if(options.clickable || options.radioField || options.checkboxField) {\n if(typeof(options.clickable) === 'function') {\n attachClickEvent(this.container, (e) => {\n if(this.freezed) return;\n (options.clickable as any)(e);\n }, {listenerSetter: options.listenerSetter});\n }\n\n this.container.classList.add('row-clickable', 'hover-effect');\n\n if(!options.noRipple) {\n ripple(this.container, undefined, undefined, true);\n }\n\n /* if(options.radioField || options.checkboxField) {\n this.container.prepend(this.container.lastElementChild);\n } */\n }\n\n if(options.buttonRight || options.buttonRightLangKey) {\n this.buttonRight = options.buttonRight instanceof HTMLElement ?\n options.buttonRight :\n Button('btn-primary btn-color-primary', {text: options.buttonRightLangKey});\n this.container.append(this.buttonRight);\n }\n\n if(options.contextMenu) {\n createContextMenu({\n ...options.contextMenu,\n listenTo: this.container,\n listenerSetter: options.listenerSetter\n });\n }\n }\n\n public get subtitle() {\n return this._subtitle ??= this.createSubtitle();\n }\n\n public get midtitle() {\n return this._midtitle ??= this.createMidtitle();\n }\n\n private createRow() {\n const c = document.createElement('div');\n c.classList.add('row-row');\n return c;\n }\n\n private createTitle() {\n const title = document.createElement('div');\n title.classList.add('row-title');\n setDirection(title);\n return title;\n }\n\n private createSubtitle() {\n const subtitle = document.createElement('div');\n subtitle.classList.add('row-subtitle');\n setDirection(subtitle);\n if(this.title) this.title.after(subtitle);\n else this.container.prepend(subtitle);\n this.container.classList.remove('no-subtitle');\n return subtitle;\n }\n\n private createMidtitle() {\n const midtitle = document.createElement('div');\n midtitle.classList.add('row-midtitle');\n this.subtitle.parentElement.insertBefore(midtitle, this.subtitle);\n return midtitle;\n }\n\n public createMedia(size?: RowMediaSizeType) {\n const media = document.createElement('div');\n return this.applyMediaElement(media, size);\n }\n\n public applyMediaElement(media: HTMLElement, size?: RowMediaSizeType) {\n this.container.classList.add('row-with-padding');\n\n this.media = media;\n media.classList.add('row-media');\n\n if(size) {\n media.classList.add('row-media-' + size);\n }\n\n this.container.append(media);\n\n return media;\n }\n\n public disableWithPromise(promise: Promise) {\n this.container.classList.add('is-disabled');\n promise.finally(() => {\n this.container.classList.remove('is-disabled');\n });\n }\n\n public makeSortable() {\n const sortIcon = document.createElement('span');\n this.container.classList.add('row-sortable', 'tgico');\n sortIcon.classList.add('row-sortable-icon', 'tgico-menu');\n this.container.append(sortIcon);\n }\n\n public toggleSorting(enabled?: boolean) {\n this.container.classList.toggle('cant-sort', !enabled);\n }\n}\n\nexport const CreateRowFromCheckboxField = (checkboxField: CheckboxField) => {\n return new Row({checkboxField, listenerSetter: checkboxField.listenerSetter});\n};\n\nexport const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {\n return RadioForm(rows.map((r) => ({container: r.container, input: r.radioField.input})), onChange);\n};\n\nexport const RadioFormFromValues = (values: {langPackKey: LangPackKey, value: number | string, checked?: boolean}[], onChange: Parameters[1]) => {\n const name = 'name-' + (Math.random() * 0x7FFFFF | 0);\n let checkedRadioField: RadioField;\n const rows = values.map(({langPackKey, value, checked}) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: langPackKey,\n name,\n value: '' + value\n })\n });\n\n if(checked) {\n checkedRadioField = row.radioField;\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, onChange);\n if(checkedRadioField) {\n checkedRadioField.checked = true;\n }\n return form;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {logger, LogTypes} from '../lib/logger';\nimport fastSmoothScroll, {ScrollOptions} from '../helpers/fastSmoothScroll';\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {IS_ANDROID} from '../environment/userAgent';\n/*\nvar el = $0;\nvar height = 0;\nvar checkUp = false;\n\ndo {\n height += el.scrollHeight;\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\nconsole.log(height);\n*/\n\n/*\nArray.from($0.querySelectorAll('.bubble-content')).forEach((_el) => {\n //_el.style.display = '';\n //return;\n\n let el = _el.parentElement;\n let height = el.scrollHeight;\n let width = el.scrollWidth;\n el.style.width = width + 'px';\n el.style.height = height + 'px';\n _el.style.display = 'none';\n});\n*/\n\n/* const scrollables: Map = new Map();\nconst scrollsIntersector = new IntersectionObserver((entries) => {\n for(let entry of entries) {\n const scrollable = scrollables.get(entry.target as HTMLElement);\n\n if(entry.isIntersecting) {\n scrollable.isVisible = true;\n } else {\n scrollable.isVisible = false;\n\n if(!isInDOM(entry.target)) {\n scrollsIntersector.unobserve(scrollable.container);\n scrollables.delete(scrollable.container);\n }\n }\n }\n}); */\n\nconst SCROLL_THROTTLE = /* IS_ANDROID ? 200 : */24;\n\nexport class ScrollableBase {\n protected log: ReturnType;\n\n public splitUp: HTMLElement;\n public onScrollMeasure: number = 0;\n\n public lastScrollPosition: number = 0;\n public lastScrollDirection: number = 0;\n\n public onAdditionalScroll: () => void;\n public onScrolledTop: () => void;\n public onScrolledBottom: () => void;\n\n public isHeavyAnimationInProgress = false;\n protected needCheckAfterAnimation = false;\n\n public checkForTriggers?: () => void;\n\n public scrollProperty: 'scrollTop' | 'scrollLeft';\n\n protected removeHeavyAnimationListener: () => void;\n protected addedScrollListener: boolean;\n\n constructor(public el?: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\n this.container.classList.add('scrollable');\n\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\n\n if(el) {\n Array.from(el.children).forEach((c) => this.container.append(c));\n\n el.append(this.container);\n }\n // this.onScroll();\n }\n\n public addScrollListener() {\n if(this.addedScrollListener) {\n return;\n }\n\n this.addedScrollListener = true;\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\n }\n\n public removeScrollListener() {\n if(!this.addedScrollListener) {\n return;\n }\n\n this.addedScrollListener = false;\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\n }\n\n public setListeners() {\n if(this.removeHeavyAnimationListener) {\n return;\n }\n\n window.addEventListener('resize', this.onScroll, {passive: true});\n this.addScrollListener();\n\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\n this.isHeavyAnimationInProgress = true;\n\n if(this.onScrollMeasure) {\n this.cancelMeasure();\n this.needCheckAfterAnimation = true;\n }\n }, () => {\n this.isHeavyAnimationInProgress = false;\n\n if(this.needCheckAfterAnimation) {\n this.onScroll();\n this.needCheckAfterAnimation = false;\n }\n });\n }\n\n public removeListeners() {\n if(!this.removeHeavyAnimationListener) {\n return;\n }\n\n window.removeEventListener('resize', this.onScroll);\n this.removeScrollListener();\n\n this.removeHeavyAnimationListener();\n this.removeHeavyAnimationListener = undefined;\n }\n\n public destroy() {\n this.removeListeners();\n this.onAdditionalScroll = undefined;\n this.onScrolledTop = undefined;\n this.onScrolledBottom = undefined;\n }\n\n public append(...args: Parameters) {\n this.container.append(...args);\n }\n\n public scrollIntoViewNew(options: Omit) {\n // return Promise.resolve();\n // this.removeListeners();\n return fastSmoothScroll({\n ...options,\n container: this.container\n });/* .finally(() => {\n this.setListeners();\n }); */\n }\n\n public onScroll = () => {\n // if(this.debug) {\n // this.log('onScroll call', this.onScrollMeasure);\n // }\n\n // return;\n\n if(this.isHeavyAnimationInProgress) {\n this.cancelMeasure();\n this.needCheckAfterAnimation = true;\n return;\n }\n\n // if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\n if(this.onScrollMeasure) return;\n // if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\n // this.onScrollMeasure = window.requestAnimationFrame(() => {\n this.onScrollMeasure = window.setTimeout(() => {\n this.onScrollMeasure = 0;\n\n const scrollPosition = this.container[this.scrollProperty];\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\n this.lastScrollPosition = scrollPosition;\n\n // lastScrollDirection check is useless here, every callback should decide on its own\n if(this.onAdditionalScroll/* && this.lastScrollDirection !== 0 */) {\n this.onAdditionalScroll();\n }\n\n if(this.checkForTriggers) {\n this.checkForTriggers();\n }\n // });\n }, SCROLL_THROTTLE);\n };\n\n public cancelMeasure() {\n if(this.onScrollMeasure) {\n // window.cancelAnimationFrame(this.onScrollMeasure);\n clearTimeout(this.onScrollMeasure);\n this.onScrollMeasure = 0;\n }\n }\n}\n\nexport type SliceSides = 'top' | 'bottom';\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\n\nexport default class Scrollable extends ScrollableBase {\n public padding: HTMLElement;\n\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\n\n constructor(el?: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\n super(el, logPrefix);\n\n /* if(withPaddingContainer) {\n this.padding = document.createElement('div');\n this.padding.classList.add('scrollable-padding');\n Array.from(this.container.children).forEach((c) => this.padding.append(c));\n this.container.append(this.padding);\n } */\n\n this.container.classList.add('scrollable-y');\n this.setListeners();\n this.scrollProperty = 'scrollTop';\n }\n\n public attachBorderListeners(setClassOn = this.container) {\n const cb = this.onAdditionalScroll;\n this.onAdditionalScroll = () => {\n cb?.();\n setClassOn.classList.toggle('scrolled-top', !this.scrollTop);\n setClassOn.classList.toggle('scrolled-bottom', this.isScrolledDown);\n };\n\n setClassOn.classList.add('scrolled-top', 'scrolled-bottom', 'scrollable-y-bordered');\n }\n\n public setVirtualContainer(el?: HTMLElement) {\n this.splitUp = el;\n this.log('setVirtualContainer:', el, this);\n }\n\n public checkForTriggers = () => {\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\n\n if(this.isHeavyAnimationInProgress) {\n this.onScroll();\n return;\n }\n\n const scrollHeight = this.container.scrollHeight;\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\n return;\n }\n\n const clientHeight = this.container.clientHeight;\n const maxScrollTop = scrollHeight - clientHeight;\n const scrollTop = this.lastScrollPosition;\n\n // this.log('checkForTriggers:', scrollTop, maxScrollTop);\n\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\n this.onScrolledTop();\n }\n\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\n this.onScrolledBottom();\n }\n };\n\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\n (this.splitUp || this.padding || this.container).prepend(...elements);\n }\n\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\n (this.splitUp || this.padding || this.container).append(...elements);\n }\n\n public getDistanceToEnd() {\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\n }\n\n get isScrolledDown() {\n return this.getDistanceToEnd() <= 1;\n }\n\n set scrollTop(y: number) {\n this.container.scrollTop = y;\n }\n\n get scrollTop() {\n // this.log.trace('get scrollTop');\n return this.container.scrollTop;\n }\n\n public setScrollTopSilently(value: number) {\n this.lastScrollPosition = value;\n this.ignoreNextScrollEvent();\n\n this.scrollTop = value;\n }\n\n public ignoreNextScrollEvent() {\n if(this.removeHeavyAnimationListener) {\n this.removeScrollListener();\n this.container.addEventListener('scroll', (e) => {\n cancelEvent(e);\n this.addScrollListener();\n }, {capture: true, passive: false, once: true});\n }\n }\n\n get scrollHeight() {\n return this.container.scrollHeight;\n }\n}\n\nexport class ScrollableX extends ScrollableBase {\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\n super(el, logPrefix, container);\n\n this.container.classList.add('scrollable-x');\n\n if(!IS_TOUCH_SUPPORTED) {\n const scrollHorizontally = (e: any) => {\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\n this.container.scrollLeft += e.deltaY / 4;\n cancelEvent(e);\n }\n };\n\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\n }\n\n this.scrollProperty = 'scrollLeft';\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {LangPackKey, FormatterArguments, i18n_} from '../lib/langPack';\nimport {generateDelimiter} from './generateDelimiter';\nimport Scrollable from './scrollable';\n\nexport type SettingSectionOptions = {\n name?: LangPackKey,\n nameArgs?: FormatterArguments,\n caption?: LangPackKey | true,\n captionArgs?: FormatterArguments,\n captionOld?: SettingSectionOptions['caption'],\n noDelimiter?: boolean,\n fakeGradientDelimiter?: boolean,\n noShadow?: boolean,\n // fullWidth?: boolean,\n // noPaddingTop?: boolean\n};\n\nconst className = 'sidebar-left-section';\nexport default class SettingSection {\n public container: HTMLElement;\n public innerContainer: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public caption: HTMLElement;\n\n private fullWidth: boolean;\n\n constructor(options: SettingSectionOptions = {}) {\n const container = this.container = document.createElement('div');\n container.classList.add(className + '-container');\n\n const innerContainer = this.innerContainer = document.createElement('div');\n innerContainer.classList.add(className);\n\n if(options.noShadow) {\n innerContainer.classList.add('no-shadow');\n }\n\n if(options.fakeGradientDelimiter) {\n innerContainer.append(generateDelimiter());\n innerContainer.classList.add('with-fake-delimiter');\n } else if(!options.noDelimiter) {\n const hr = document.createElement('hr');\n innerContainer.append(hr);\n } else {\n innerContainer.classList.add('no-delimiter');\n }\n\n // if(options.fullWidth) {\n // this.fullWidth = true;\n // }\n\n // if(options.noPaddingTop) {\n // innerContainer.classList.add('no-padding-top');\n // }\n\n const content = this.content = this.generateContentElement();\n\n if(options.name) {\n const title = this.title = document.createElement('div');\n title.classList.add('sidebar-left-h2', className + '-name');\n i18n_({element: title, key: options.name, args: options.nameArgs});\n content.append(title);\n }\n\n container.append(innerContainer);\n\n const caption = options.caption ?? options.captionOld;\n if(caption) {\n const el = this.caption = this.generateContentElement();\n el.classList.add(className + '-caption');\n\n if(!options.captionOld) {\n container.append(el);\n }\n\n if(caption !== true) {\n i18n_({element: el, key: caption, args: options.captionArgs});\n }\n }\n }\n\n public generateContentElement() {\n const content = document.createElement('div');\n content.classList.add(className + '-content');\n\n // if(this.fullWidth) {\n // content.classList.add('full-width');\n // }\n\n this.innerContainer.append(content);\n return content;\n }\n}\n\nexport const generateSection = (appendTo: Scrollable, name?: LangPackKey, caption?: LangPackKey) => {\n const section = new SettingSection({name, caption});\n appendTo.append(section.container);\n return section.content;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputFile} from '../../../layer';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport AvatarEdit from '../../avatarEdit';\nimport I18n from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\ninterface OpenStreetMapInterface {\n place_id?: number;\n license?: string;\n osm_type?: string;\n osm_id?: number;\n lat?: string;\n lon?: string;\n display_name: string;\n address?: object;\n boundingbox?: object;\n}\n\nexport default class AppNewGroupTab extends SliderSuperTab {\n private avatarEdit: AvatarEdit;\n private uploadAvatar: () => Promise = null;\n private peerIds: PeerId[];\n private isGeoChat: boolean = false;\n private nextBtn: HTMLButtonElement;\n private groupNameInputField: InputField;\n private list: HTMLUListElement;\n private groupLocationInputField: InputField;\n private userLocationCoords: {lat: number, long: number};\n private userLocationAddress: string;\n\n public init(\n peerIds: PeerId[],\n isGeoChat: boolean = false\n ) {\n this.isGeoChat = isGeoChat;\n this.peerIds = peerIds;\n\n this.container.classList.add('new-group-container');\n this.setTitle('NewGroup');\n\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n });\n\n const section = new SettingSection({});\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.groupNameInputField = new InputField({\n label: 'CreateGroup.NameHolder',\n maxLength: 128\n });\n\n this.groupLocationInputField = new InputField({\n label: 'ChatLocation',\n name: 'location',\n canBeEdited: false\n });\n\n inputWrapper.append(\n this.groupNameInputField.container,\n this.groupLocationInputField.container\n );\n\n this.listenerSetter.add(this.groupNameInputField.input)('input', () => {\n const value = this.groupNameInputField.value;\n let valueCheck = !!value.length && !this.groupNameInputField.input.classList.contains('error');\n if(this.isGeoChat) valueCheck = valueCheck && !!this.userLocationCoords && !!this.userLocationAddress;\n this.nextBtn.classList.toggle('is-visible', !!valueCheck);\n });\n\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n\n attachClickEvent(this.nextBtn, () => {\n const title = this.groupNameInputField.value;\n\n let promise: Promise;\n if(this.isGeoChat) {\n if(!this.userLocationAddress || !this.userLocationCoords) return;\n promise = this.managers.appChatsManager.createChannel({\n title,\n about: '',\n geo_point: {\n _: 'inputGeoPoint',\n ...this.userLocationCoords\n },\n address: this.userLocationAddress,\n megagroup: true\n }).then((chatId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\n });\n }\n\n if(this.peerIds.length) {\n this.managers.appChatsManager.inviteToChannel(chatId, this.peerIds);\n }\n\n return chatId;\n });\n } else {\n this.nextBtn.disabled = true;\n promise = this.managers.appChatsManager.createChat(title, this.peerIds.map((peerId) => peerId.toUserId())).then((chatId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\n });\n }\n\n return chatId;\n });\n }\n\n if(!promise) {\n return;\n }\n\n promise.then((chatId) => {\n this.close();\n\n appImManager.setInnerPeer({peerId: chatId.toPeerId(true)});\n });\n }, {listenerSetter: this.listenerSetter});\n\n const chatsSection = new SettingSection({\n name: 'Members',\n nameArgs: [this.peerIds.length]\n });\n\n const list = this.list = appDialogsManager.createChatList({\n new: true\n });\n\n chatsSection.content.append(list);\n\n section.content.append(this.avatarEdit.container, inputWrapper);\n\n this.content.append(this.nextBtn);\n this.scrollable.append(section.container, chatsSection.container);\n\n if(isGeoChat) {\n this.setTitle('NearbyCreateGroup');\n this.groupLocationInputField.container.classList.remove('hide');\n this.groupLocationInputField.setValueSilently(I18n.format('Loading', true));\n this.startLocating();\n } else {\n this.groupLocationInputField.container.classList.add('hide');\n }\n\n return Promise.all(this.peerIds.map(async(userId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: userId,\n container: this.list,\n rippleEnabled: false,\n avatarSize: 'abitbigger'\n });\n\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(userId)));\n }));\n }\n\n public onCloseAfterTimeout() {\n this.avatarEdit.clear();\n this.uploadAvatar = null;\n this.groupNameInputField.value = '';\n this.groupLocationInputField.container.classList.add('hide');\n this.nextBtn.disabled = false;\n }\n\n private startLocating() {\n navigator.geolocation.getCurrentPosition((location) => {\n this.userLocationCoords = {\n lat: location.coords.latitude,\n long: location.coords.longitude\n };\n\n let uri = 'https://nominatim.openstreetmap.org/reverse';\n uri += '?lat='+location.coords.latitude;\n uri += '&lon='+location.coords.longitude;\n uri += '&format=json';\n uri += '&addressdetails=1';\n uri += '&accept-language=en';\n fetch(uri)\n .then((response) => response.json())\n .then((response: OpenStreetMapInterface) => {\n this.userLocationAddress = response.display_name;\n this.groupLocationInputField.setValueSilently(response.display_name);\n });\n }, (error) => {\n if(error instanceof GeolocationPositionError) {\n this.groupLocationInputField.setValueSilently('Location permission denied. Please retry later.');\n } else {\n this.groupLocationInputField.setValueSilently('An error has occurred. Please retry later.');\n }\n });\n }\n}\n","enum PrivacyType {\n Everybody = 2,\n Contacts = 1,\n Nobody = 0\n}\n\nexport default PrivacyType;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PrivacyRule} from '../../../../layer';\nimport PrivacyType from './privacyType';\n\nexport default function getPrivacyRulesDetails(rules: PrivacyRule[]) {\n const types: PrivacyType[] = [];\n\n type peers = {users: UserId[], chats: ChatId[]};\n const allowPeers: peers = {users: [], chats: []}, disallowPeers: peers = {users: [], chats: []};\n rules.forEach((rule) => {\n switch(rule._) {\n case 'privacyValueAllowAll':\n types.push(2);\n break;\n case 'privacyValueDisallowAll':\n types.push(0);\n break;\n case 'privacyValueAllowContacts':\n types.push(1);\n break;\n /* case 'privacyValueDisallowContacts':\n types.push('Except My Contacts');\n break; */\n case 'privacyValueAllowChatParticipants':\n allowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueAllowUsers':\n allowPeers.users.push(...rule.users);\n break;\n case 'privacyValueDisallowChatParticipants':\n disallowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueDisallowUsers':\n disallowPeers.users.push(...rule.users);\n break;\n }\n });\n\n return {type: types[0], disallowPeers, allowPeers};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {randomLong} from '../helpers/random';\nimport {InputPrivacyKey, InputPrivacyRule} from '../layer';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getPrivacyRulesDetails from '../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\nimport PrivacyType from '../lib/appManagers/utils/privacy/privacyType';\nimport {i18n, join, LangPackKey, _i18n} from '../lib/langPack';\nimport RadioField from './radioField';\nimport Row, {RadioFormFromRows} from './row';\nimport Scrollable from './scrollable';\nimport SettingSection, {generateSection} from './settingSection';\nimport AppAddMembersTab from './sidebarLeft/tabs/addMembers';\nimport {SliderSuperTabEventable} from './sliderTab';\n\nexport type PrivacySectionStr = LangPackKey | '' | HTMLElement;\nexport default class PrivacySection {\n public radioRows: Map;\n public radioSection: SettingSection;\n public exceptions: Map;\n public peerIds: {\n disallow?: PeerId[],\n allow?: PeerId[]\n };\n public type: PrivacyType;\n\n constructor(public options: {\n tab: SliderSuperTabEventable,\n title: LangPackKey,\n inputKey: InputPrivacyKey['_'],\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\n appendTo?: Scrollable,\n noExceptions?: boolean,\n onRadioChange?: (value: number) => any,\n skipTypes?: PrivacyType[],\n exceptionTexts?: [LangPackKey, LangPackKey],\n managers: AppManagers\n }) {\n if(options.captions) {\n options.captions.reverse();\n }\n\n const managers = options.managers;\n\n this.radioSection = new SettingSection({name: options.title, caption: true});\n\n this.radioRows = new Map();\n\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\n type: PrivacyType.Everybody,\n langKey: 'PrivacySettingsController.Everbody'\n }, {\n type: PrivacyType.Contacts,\n langKey: 'PrivacySettingsController.MyContacts'\n }, {\n type: PrivacyType.Nobody,\n langKey: 'PrivacySettingsController.Nobody'\n }];\n\n if(options.skipTypes) {\n r = r.filter((r) => !options.skipTypes.includes(r.type));\n }\n\n const random = randomLong();\n r.forEach(({type, langKey}) => {\n const row = new Row({\n radioField: new RadioField({\n langKey,\n name: random,\n value: '' + type\n })\n });\n\n this.radioRows.set(type, row);\n });\n\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\n\n this.radioSection.content.append(form);\n if(options.appendTo) {\n options.appendTo.append(this.radioSection.container);\n }\n\n if(!options.noExceptions) {\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\n\n this.exceptions = new Map([[\n 'disallow',\n {\n titleLangKey: options.exceptionTexts[0],\n key: 'disallow',\n row: null,\n icon: 'deleteuser',\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\n clickable: true\n }\n ], [\n 'allow',\n {\n titleLangKey: options.exceptionTexts[1],\n key: 'allow',\n row: null,\n icon: 'adduser',\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\n clickable: true\n }\n ]]);\n\n this.exceptions.forEach((exception) => {\n exception.row = new Row(exception);\n\n exception.row.container.addEventListener('click', () => {\n promise.then(() => {\n const _peerIds = this.peerIds[exception.key];\n options.tab.slider.createTab(AppAddMembersTab).open({\n type: 'privacy',\n skippable: true,\n title: exception.titleLangKey,\n placeholder: 'PrivacyModal.Search.Placeholder',\n takeOut: (newPeerIds) => {\n _peerIds.length = 0;\n _peerIds.push(...newPeerIds);\n exception.row.subtitle.innerHTML = '';\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\n },\n selectedPeerIds: _peerIds\n });\n });\n });\n\n container.append(exception.row.container);\n });\n }\n\n /* setTimeout(() => {\n this.setRadio(PrivacyType.Contacts);\n }, 0); */\n\n const promise = managers.appPrivacyManager.getPrivacy(options.inputKey).then((rules) => {\n const details = getPrivacyRulesDetails(rules);\n this.setRadio(details.type);\n\n if(this.exceptions) {\n this.peerIds = {};\n ['allow' as const, 'disallow' as const].forEach((k) => {\n const arr = [];\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\n arr.push(...from.users.map((id) => id.toPeerId()));\n arr.push(...from.chats.map((id) => id.toPeerId(true)));\n this.peerIds[k] = arr;\n const s = this.exceptions.get(k).row.subtitle;\n s.innerHTML = '';\n s.append(...this.generateStr(from));\n });\n }\n\n options.tab.eventListener.addEventListener('destroy', async() => {\n const rules: InputPrivacyRule[] = [];\n\n switch(this.type) {\n case PrivacyType.Everybody:\n rules.push({_: 'inputPrivacyValueAllowAll'});\n break;\n case PrivacyType.Contacts:\n rules.push({_: 'inputPrivacyValueAllowContacts'});\n break;\n case PrivacyType.Nobody:\n rules.push({_: 'inputPrivacyValueDisallowAll'});\n break;\n }\n\n if(this.exceptions) {\n const a = ([\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\n ] as Array<[\n 'allow' | 'disallow',\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants',\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\n ]>);\n for(const [k, chatKey, usersKey] of a) {\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\n continue;\n }\n\n const _peerIds = this.peerIds[k];\n if(_peerIds) {\n const splitted = this.splitPeersByType(_peerIds);\n if(splitted.chats.length) {\n rules.push({_: chatKey, chats: splitted.chats});\n }\n\n if(splitted.users.length) {\n rules.push({\n _: usersKey,\n users: await Promise.all(splitted.users.map((id) => managers.appUsersManager.getUserInput(id)))\n });\n }\n }\n }\n }\n\n managers.appPrivacyManager.setPrivacy(options.inputKey, rules);\n }, {once: true});\n });\n }\n\n private onRadioChange = (value: string | PrivacySection['type']) => {\n value = +value as PrivacySection['type'];\n this.type = value;\n\n const caption = this.options.captions[this.type];\n const captionElement = this.radioSection.caption;\n if(!caption) {\n captionElement.innerHTML = '';\n } else if(caption instanceof HTMLElement) {\n replaceContent(captionElement, caption);\n } else {\n _i18n(captionElement, caption);\n }\n captionElement.classList.toggle('hide', !caption);\n\n if(this.exceptions) {\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\n }\n\n this.options.onRadioChange && this.options.onRadioChange(value);\n };\n\n public setRadio(type: PrivacySection['type']) {\n const row = this.radioRows.get(type);\n this.onRadioChange(type);\n row.radioField.input.checked = true;\n }\n\n private splitPeersByType(peerIds: PeerId[]) {\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\n peerIds.forEach((peerId) => {\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\n });\n\n return peers;\n }\n\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\n if(!peers.users.length && !peers.chats.length) {\n return [i18n('PrivacySettingsController.AddUsers')];\n }\n\n return join([\n peers.users.length ? i18n('Users', [peers.users.length]) : null,\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\n ].filter(Boolean), false);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {i18n, LangPackKey} from '../../../../lib/langPack';\nimport anchorCopy from '../../../../helpers/dom/anchorCopy';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\n public async init() {\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\n this.setTitle('PrivacyPhone');\n\n const formatted = '+' + (await this.managers.appUsersManager.getSelf()).phone;\n const captionEl = document.createElement('div');\n captionEl.append(\n i18n('PrivacyPhoneInfo'),\n document.createElement('br'),\n document.createElement('br'),\n i18n('PrivacyPhoneInfo4'),\n document.createElement('br'),\n anchorCopy({\n mePath: formatted\n })\n );\n\n const phoneSection = new PrivacySection({\n tab: this,\n title: 'PrivacyPhoneTitle',\n inputKey: 'inputPrivacyKeyPhoneNumber',\n captions: [captionEl, captionEl, ''],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n onRadioChange: (type) => {\n s.setRadio(PrivacyType.Everybody);\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\n },\n managers: this.managers\n });\n\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\n const s = new PrivacySection({\n tab: this,\n title: 'PrivacyPhoneTitle2',\n inputKey: 'inputPrivacyKeyAddedByPhone',\n captions: [sCaption, sCaption, ''],\n noExceptions: true,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\n });\n\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport Button from '../../../button';\nimport SettingSection from '../../../settingSection';\nimport {SliderSuperTab} from '../../../slider';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport AppSettingsTab from '../settings';\n\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-set');\n this.setTitle('TwoStepVerificationPasswordSet');\n\n const section = new SettingSection({\n captionOld: 'TwoStepVerificationPasswordSetInfo',\n noDelimiter: true\n });\n\n const emoji = '🥳';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n emoji,\n div: stickerContainer,\n width: 160,\n height: 160\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\n\n attachClickEvent(btnReturn, (e) => {\n this.close();\n });\n\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\n\n inputWrapper.append(btnReturn);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\n\nexport function canFocus(isFirstInput: boolean) {\n return !IS_MOBILE_SAFARI || !isFirstInput;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport AppTwoStepVerificationSetTab from './passwordSet';\nimport CodeInputField from '../../../codeInputField';\nimport AppTwoStepVerificationEmailTab from './email';\nimport {putPreloader} from '../../../putPreloader';\nimport {i18n, _i18n} from '../../../../lib/langPack';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../../helpers/dom/replaceContent';\nimport toggleDisability from '../../../../helpers/dom/toggleDisability';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\n public codeInputField: CodeInputField;\n public state: AccountPassword;\n public email: string;\n public length: number;\n public isFirst = false;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-email-confirmation');\n this.setTitle('TwoStepAuth.RecoveryTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\n\n const emoji = '📬';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.codeInputField = new CodeInputField({\n name: 'recovery-email-code',\n label: 'TwoStepAuth.RecoveryCode',\n length: this.length,\n onFill: (code) => {\n freeze(true);\n\n this.managers.passwordManager.confirmPasswordEmail('' + code)\n .then((value) => {\n if(!value) {\n\n }\n\n goNext();\n })\n .catch((err) => {\n switch(err.type) {\n case 'CODE_INVALID':\n inputField.input.classList.add('error');\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\n break;\n\n case 'EMAIL_HASH_EXPIRED':\n inputField.input.classList.add('error');\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\n break;\n\n default:\n console.error('confirm error', err);\n break;\n }\n\n freeze(false);\n });\n }\n });\n\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\n\n const goNext = () => {\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\n };\n\n const freeze = (disable: boolean) => {\n toggleDisability([inputField.input, btnChange, btnResend], disable);\n };\n\n attachClickEvent(btnChange, (e) => {\n freeze(true);\n this.managers.passwordManager.cancelPasswordEmail().then((value) => {\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\n this.close();\n }, () => {\n freeze(false);\n });\n });\n\n attachClickEvent(btnResend, (e) => {\n freeze(true);\n const d = putPreloader(btnResend);\n this.managers.passwordManager.resendPasswordEmail().then((value) => {\n d.remove();\n freeze(false);\n });\n });\n\n inputWrapper.append(inputField.container, btnChange, btnResend);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.codeInputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport InputField from '../../../inputField';\nimport {putPreloader} from '../../../putPreloader';\nimport AppTwoStepVerificationSetTab from './passwordSet';\nimport AppTwoStepVerificationEmailConfirmationTab from './emailConfirmation';\nimport PopupPeer from '../../../popups/peer';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport matchEmail from '../../../../lib/richTextProcessor/matchEmail';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\n public inputField: InputField;\n public state: AccountPassword;\n public plainPassword: string;\n public newPassword: string;\n public hint: string;\n public isFirst = false;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-email');\n this.setTitle('RecoveryEmailTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n const emoji = '💌';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.inputField = new InputField({\n name: 'recovery-email',\n label: 'RecoveryEmail',\n plainText: true\n });\n\n inputField.input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n cancelEvent(e);\n return onContinueClick();\n }\n });\n\n inputField.input.addEventListener('input', (e) => {\n inputField.input.classList.remove('error');\n });\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\n\n const goNext = () => {\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\n };\n\n const onContinueClick = () => {\n const email = inputField.value.trim();\n const match = matchEmail(email);\n if(!match || match[0].length !== email.length) {\n inputField.input.classList.add('error');\n return;\n }\n\n toggleButtons(true);\n const d = putPreloader(btnContinue);\n\n this.managers.passwordManager.updateSettings({\n hint: this.hint,\n currentPassword: this.plainPassword,\n newPassword: this.newPassword,\n email\n }).then((value) => {\n goNext();\n }, (err) => {\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\n\n const tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\n tab.state = this.state;\n tab.email = email;\n tab.length = symbols;\n tab.open();\n } else {\n console.log('password set error', err);\n }\n\n toggleButtons(false);\n d.remove();\n });\n };\n attachClickEvent(btnContinue, onContinueClick);\n\n const toggleButtons = (freeze: boolean) => {\n if(freeze) {\n btnContinue.setAttribute('disabled', 'true');\n btnSkip.setAttribute('disabled', 'true');\n } else {\n btnContinue.removeAttribute('disabled');\n btnSkip.removeAttribute('disabled');\n }\n };\n\n attachClickEvent(btnSkip, (e) => {\n const popup = new PopupPeer('popup-skip-email', {\n buttons: [{\n langKey: 'Cancel',\n isCancel: true\n }, {\n langKey: 'YourEmailSkip',\n callback: () => {\n // inputContent.classList.add('sidebar-left-section-disabled');\n toggleButtons(true);\n putPreloader(btnSkip);\n this.managers.passwordManager.updateSettings({\n hint: this.hint,\n currentPassword: this.plainPassword,\n newPassword: this.newPassword,\n email: ''\n }).then(() => {\n goNext();\n }, (err) => {\n toggleButtons(false);\n });\n },\n isDanger: true\n }],\n titleLangKey: 'YourEmailSkipWarning',\n descriptionLangKey: 'YourEmailSkipWarningText'\n });\n\n popup.show();\n });\n\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.inputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport InputField from '../../../inputField';\nimport AppTwoStepVerificationEmailTab from './email';\nimport {toast} from '../../../toast';\nimport I18n from '../../../../lib/langPack';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\n public inputField: InputField;\n public state: AccountPassword;\n public plainPassword: string;\n public newPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\n this.setTitle('TwoStepAuth.SetupHintTitle');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const emoji = '💡';\n const stickerContainer = document.createElement('div');\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.inputField = new InputField({\n name: 'hint',\n label: 'TwoStepAuth.SetupHintPlaceholder'\n });\n\n inputField.input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n cancelEvent(e);\n return inputField.value ? onContinueClick() : onSkipClick();\n }\n });\n\n const goNext = (e?: Event, saveHint?: boolean) => {\n if(e) {\n cancelEvent(e);\n }\n\n const hint = saveHint ? inputField.value : undefined;\n if(hint && this.newPassword === hint) {\n toast(I18n.format('PasswordAsHintError', true));\n return;\n }\n\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.newPassword;\n tab.hint = hint;\n\n tab.open();\n };\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\n\n const onContinueClick = (e?: Event) => goNext(e, true);\n const onSkipClick = (e?: Event) => goNext(e, false);\n attachClickEvent(btnContinue, onContinueClick);\n attachClickEvent(btnSkip, onSkipClick);\n\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\n\n section.content.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n this.inputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport PasswordInputField from '../../../passwordInputField';\nimport {SliderSuperTab} from '../../../slider';\nimport TrackingMonkey from '../../../monkeys/tracking';\nimport AppTwoStepVerificationHintTab from './hint';\nimport {InputState} from '../../../inputField';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\n public state: AccountPassword;\n public passwordInputField: PasswordInputField;\n public plainPassword: string;\n public newPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\n this.setTitle('PleaseReEnterPassword');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const passwordInputField = this.passwordInputField = new PasswordInputField({\n name: 're-enter-password',\n label: 'PleaseReEnterPassword'\n });\n\n const monkey = new TrackingMonkey(passwordInputField, 157);\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n\n inputWrapper.append(passwordInputField.container, btnContinue);\n section.content.append(monkey.container, inputWrapper);\n\n this.scrollable.container.append(section.container);\n\n passwordInputField.input.addEventListener('keypress', (e) => {\n if(passwordInputField.input.classList.contains('error')) {\n passwordInputField.setState(InputState.Neutral);\n }\n\n if(e.key === 'Enter') {\n return onContinueClick();\n }\n });\n\n const verifyInput = () => {\n if(this.newPassword !== passwordInputField.value) {\n passwordInputField.setError();\n return false;\n }\n\n return true;\n };\n\n const onContinueClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!verifyInput()) return;\n\n const tab = this.slider.createTab(AppTwoStepVerificationHintTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.newPassword;\n tab.open();\n };\n attachClickEvent(btnContinue, onContinueClick);\n\n return monkey.load();\n }\n\n onOpenAfterTimeout() {\n this.passwordInputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AppTwoStepVerificationTab from '.';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../../../helpers/dom/setInnerHTML';\nimport {AccountPassword} from '../../../../layer';\nimport I18n, {i18n} from '../../../../lib/langPack';\nimport wrapEmojiText from '../../../../lib/richTextProcessor/wrapEmojiText';\nimport Button from '../../../button';\nimport {putPreloader} from '../../../putPreloader';\nimport PasswordMonkey from '../../../monkeys/password';\nimport PasswordInputField from '../../../passwordInputField';\nimport {SliderSuperTab} from '../../../slider';\nimport AppTwoStepVerificationReEnterPasswordTab from './reEnterPassword';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\n public state: AccountPassword;\n public passwordInputField: PasswordInputField;\n public plainPassword: string;\n public isFirst = true;\n\n public init() {\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const passwordInputField = this.passwordInputField = new PasswordInputField({\n name: 'enter-password',\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\n labelText: !isNew && this.state.hint ? wrapEmojiText(this.state.hint) : undefined\n });\n\n const monkey = new PasswordMonkey(passwordInputField, 157);\n\n const btnContinue = Button('btn-primary btn-color-primary');\n const textEl = new I18n.IntlElement({key: 'Continue'});\n\n btnContinue.append(textEl.element);\n\n inputWrapper.append(passwordInputField.container, btnContinue);\n section.content.append(monkey.container, inputWrapper);\n\n this.scrollable.container.append(section.container);\n\n passwordInputField.input.addEventListener('keypress', (e) => {\n if(passwordInputField.input.classList.contains('error')) {\n passwordInputField.input.classList.remove('error');\n textEl.key = 'Continue';\n textEl.update();\n }\n\n if(e.key === 'Enter') {\n return onContinueClick();\n }\n });\n\n const verifyInput = () => {\n if(!passwordInputField.value.length) {\n passwordInputField.input.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n let onContinueClick: (e?: Event) => void;\n if(!isNew) {\n let getStateInterval: number;\n\n const getState = () => {\n // * just to check session relevance\n if(!getStateInterval) {\n getStateInterval = window.setInterval(getState, 10e3);\n }\n\n return this.managers.passwordManager.getState().then((_state) => {\n this.state = _state;\n\n if(this.state.hint) {\n setInnerHTML(passwordInputField.label, wrapEmojiText(this.state.hint));\n } else {\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\n }\n });\n };\n\n const submit = (e?: Event) => {\n if(!verifyInput()) {\n cancelEvent(e);\n return;\n }\n\n btnContinue.setAttribute('disabled', 'true');\n textEl.key = 'PleaseWait';\n textEl.update();\n const preloader = putPreloader(btnContinue);\n\n const plainPassword = passwordInputField.value;\n this.managers.passwordManager.check(passwordInputField.value, this.state).then((auth) => {\n console.log(auth);\n\n if(auth._ === 'auth.authorization') {\n clearInterval(getStateInterval);\n if(monkey) monkey.remove();\n const tab = this.slider.createTab(AppTwoStepVerificationTab);\n tab.state = this.state;\n tab.plainPassword = plainPassword;\n tab.open();\n this.slider.removeTabFromHistory(this);\n }\n }, (err) => {\n btnContinue.removeAttribute('disabled');\n passwordInputField.input.classList.add('error');\n\n switch(err.type) {\n default:\n // btnContinue.innerText = err.type;\n textEl.key = 'PASSWORD_HASH_INVALID';\n textEl.update();\n preloader.remove();\n passwordInputField.select();\n break;\n }\n\n getState();\n });\n };\n\n onContinueClick = submit;\n\n getState();\n } else {\n onContinueClick = (e) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!verifyInput()) return;\n\n const tab = this.slider.createTab(AppTwoStepVerificationReEnterPasswordTab);\n tab.state = this.state;\n tab.newPassword = passwordInputField.value;\n tab.plainPassword = this.plainPassword;\n tab.open();\n };\n }\n\n attachClickEvent(btnContinue, onContinueClick);\n\n return monkey.load();\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.passwordInputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport {AccountPassword} from '../../../../layer';\nimport {_i18n} from '../../../../lib/langPack';\nimport Button from '../../../button';\nimport PopupPeer from '../../../popups/peer';\nimport SettingSection from '../../../settingSection';\nimport {SliderSuperTab} from '../../../slider';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport AppSettingsTab from '../settings';\nimport AppTwoStepVerificationEmailTab from './email';\nimport AppTwoStepVerificationEnterPasswordTab from './enterPassword';\n\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\n public state: AccountPassword;\n public plainPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-main');\n this.setTitle('TwoStepVerificationTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n const emoji = '🔐';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 168,\n height: 168,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const c = section.generateContentElement();\n if(this.state.pFlags.has_password) {\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\n\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\n\n attachClickEvent(btnChangePassword, () => {\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.open();\n });\n\n attachClickEvent(btnDisablePassword, () => {\n const popup = new PopupPeer('popup-disable-password', {\n buttons: [{\n langKey: 'Disable',\n callback: () => {\n this.managers.passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\n this.close();\n });\n },\n isDanger: true\n }],\n titleLangKey: 'TurnPasswordOffQuestionTitle',\n descriptionLangKey: 'TurnPasswordOffQuestion'\n });\n\n popup.show();\n });\n\n attachClickEvent(btnSetRecoveryEmail, () => {\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\n tab.state = this.state;\n tab.hint = this.state.hint;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.plainPassword;\n tab.isFirst = true;\n tab.open();\n });\n\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\n } else {\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\n\n inputWrapper.append(btnSetPassword);\n c.append(inputWrapper);\n\n attachClickEvent(btnSetPassword, (e) => {\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n tab.state = this.state;\n tab.open();\n });\n }\n\n this.scrollable.container.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\n this.setTitle('PrivacyLastSeen');\n\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\n new PrivacySection({\n tab: this,\n title: 'LastSeenTitle',\n inputKey: 'inputPrivacyKeyStatusTimestamp',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\n this.setTitle('PrivacyProfilePhoto');\n\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\n new PrivacySection({\n tab: this,\n title: 'PrivacyProfilePhotoTitle',\n inputKey: 'inputPrivacyKeyProfilePhoto',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\n this.setTitle('PrivacySettings.Forwards');\n\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\n new PrivacySection({\n tab: this,\n title: 'PrivacyForwardsTitle',\n inputKey: 'inputPrivacyKeyForwards',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\n this.setTitle('PrivacySettings.Groups');\n\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\n new PrivacySection({\n tab: this,\n title: 'WhoCanAddMe',\n inputKey: 'inputPrivacyKeyChatInvite',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-calls');\n this.setTitle('PrivacySettings.VoiceCalls');\n\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\n new PrivacySection({\n tab: this,\n title: 'WhoCanCallMe',\n inputKey: 'inputPrivacyKeyPhoneCall',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n\n {\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\n new PrivacySection({\n tab: this,\n title: 'PrivacyP2PHeader',\n inputKey: 'inputPrivacyKeyPhoneP2P',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Button from '../../button';\nimport Row from '../../row';\nimport {Authorization} from '../../../layer';\nimport {formatDateAccordingToTodayNew} from '../../../helpers/date';\nimport {ButtonMenuSync} from '../../buttonMenu';\nimport {toast} from '../../toast';\nimport I18n from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\nimport positionMenu from '../../../helpers/positionMenu';\nimport contextMenuController from '../../../helpers/contextMenuController';\nimport SettingSection from '../../settingSection';\n\nexport default class AppActiveSessionsTab extends SliderSuperTabEventable {\n public authorizations: Authorization.authorization[];\n private menuElement: HTMLElement;\n\n public init() {\n this.container.classList.add('active-sessions-container');\n this.setTitle('SessionsTitle');\n\n const Session = (auth: Authorization.authorization) => {\n const row = new Row({\n title: [auth.app_name, auth.app_version].join(' '),\n subtitle: [auth.ip, auth.country].join(' - '),\n clickable: true,\n titleRight: auth.pFlags.current ? undefined : formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\n });\n\n row.container.dataset.hash = '' + auth.hash;\n\n row.midtitle.textContent = [auth.device_model, auth.system_version || auth.platform].filter(Boolean).join(', ');\n\n return row;\n };\n\n const authorizations = this.authorizations.slice();\n\n {\n const section = new SettingSection({\n name: 'CurrentSession',\n caption: 'ClearOtherSessionsHelp'\n });\n\n const auth = findAndSplice(authorizations, auth => auth.pFlags.current);\n const session = Session(auth);\n\n section.content.append(session.container);\n\n if(authorizations.length) {\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\n attachClickEvent(btnTerminate, (e) => {\n new PopupPeer('revoke-session', {\n buttons: [{\n langKey: 'Terminate',\n isDanger: true,\n callback: () => {\n const toggle = toggleDisability([btnTerminate], true);\n this.managers.apiManager.invokeApi('auth.resetAuthorizations').then((value) => {\n // toggleDisability([btnTerminate], false);\n btnTerminate.remove();\n otherSection.container.remove();\n }, onError).finally(() => {\n toggle();\n });\n }\n }],\n titleLangKey: 'AreYouSureSessionsTitle',\n descriptionLangKey: 'AreYouSureSessions'\n }).show();\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnTerminate);\n }\n\n this.scrollable.append(section.container);\n }\n\n if(!authorizations.length) {\n return;\n }\n\n const otherSection = new SettingSection({\n name: 'OtherSessions',\n caption: 'SessionsListInfo'\n });\n\n authorizations.forEach((auth) => {\n otherSection.content.append(Session(auth).container);\n });\n\n this.scrollable.append(otherSection.container);\n\n const onError = (err: any) => {\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\n }\n };\n\n let target: HTMLElement;\n const onTerminateClick = () => {\n const hash = target.dataset.hash;\n\n new PopupPeer('revoke-session', {\n buttons: [{\n langKey: 'Terminate',\n isDanger: true,\n callback: () => {\n this.managers.apiManager.invokeApi('account.resetAuthorization', {hash})\n .then((value) => {\n if(value) {\n target.remove();\n }\n }, onError);\n }\n }],\n titleLangKey: 'AreYouSureSessionTitle',\n descriptionLangKey: 'TerminateSessionText'\n }).show();\n };\n\n const element = this.menuElement = ButtonMenuSync({\n buttons: [{\n icon: 'stop',\n text: 'Terminate',\n onClick: onTerminateClick\n }]\n });\n element.id = 'active-sessions-contextmenu';\n element.classList.add('contextmenu');\n\n document.getElementById('page-chats').append(element);\n\n attachContextMenuListener({\n element: this.scrollable.container,\n callback: (e) => {\n target = findUpClassName(e.target, 'row');\n if(!target || target.dataset.hash === '0') {\n return;\n }\n\n if(e instanceof MouseEvent) e.preventDefault();\n // smth\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n positionMenu(e, element);\n contextMenuController.openBtnMenu(element);\n },\n listenerSetter: this.listenerSetter\n });\n\n attachClickEvent(this.scrollable.container, (e) => {\n target = findUpClassName(e.target, 'row');\n if(!target || target.dataset.hash === '0') {\n return;\n }\n\n onTerminateClick();\n }, {listenerSetter: this.listenerSetter});\n }\n\n onCloseAfterTimeout() {\n this.menuElement?.remove();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport {ButtonMenuSync} from '../../buttonMenu';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../../../lib/appManagers/appDialogsManager';\nimport PopupPickUser from '../../popups/pickUser';\nimport rootScope from '../../../lib/rootScope';\nimport findUpTag from '../../../helpers/dom/findUpTag';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport formatUserPhone from '../../wrappers/formatUserPhone';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\nimport positionMenu from '../../../helpers/positionMenu';\nimport contextMenuController from '../../../helpers/contextMenuController';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport SettingSection from '../../settingSection';\n\nexport default class AppBlockedUsersTab extends SliderSuperTab {\n public peerIds: PeerId[];\n private menuElement: HTMLElement;\n\n public init() {\n this.container.classList.add('blocked-users-container');\n this.setTitle('BlockedUsers');\n\n const section = new SettingSection({\n caption: 'BlockedUsersInfo'\n });\n\n section.caption.parentElement.prepend(section.caption);\n\n this.scrollable.append(section.container);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, (e) => {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'BlockModal.Search.Placeholder',\n onSelect: (peerId) => {\n // console.log('block', peerId);\n this.managers.appUsersManager.toggleBlock(peerId, true);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n const list = appDialogsManager.createChatList();\n this.scrollable.container.classList.add('chatlist-container');\n section.content.append(list);\n\n const add = async(peerId: PeerId, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger',\n append\n });\n\n const user = await this.managers.appUsersManager.getUser(peerId.toUserId());\n if(!user) {\n return;\n }\n\n const usernames = getPeerActiveUsernames(user);\n const username = usernames[0];\n if(user.pFlags.bot) {\n dom.lastMessageSpan.append('@' + username);\n } else {\n if(user.phone) dom.lastMessageSpan.innerHTML = formatUserPhone(user.phone);\n else dom.lastMessageSpan.append(username ? '@' + username : getUserStatusString(user));\n }\n\n // dom.titleSpan.innerHTML = 'Raaid El Syed';\n // dom.lastMessageSpan.innerHTML = '+1 234 567891';\n };\n\n for(const peerId of this.peerIds) {\n add(peerId, true);\n }\n\n let target: HTMLElement;\n const onUnblock = () => {\n const peerId = target.dataset.peerId.toPeerId();\n this.managers.appUsersManager.toggleBlock(peerId, false);\n };\n\n const element = this.menuElement = ButtonMenuSync({\n buttons: [{\n icon: 'lockoff',\n text: 'Unblock',\n onClick: onUnblock,\n options: {listenerSetter: this.listenerSetter}\n }]\n });\n element.id = 'blocked-users-contextmenu';\n element.classList.add('contextmenu');\n\n document.getElementById('page-chats').append(element);\n\n attachContextMenuListener({\n element: this.scrollable.container,\n callback: (e) => {\n target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!target) {\n return;\n }\n\n if(e instanceof MouseEvent) e.preventDefault();\n // smth\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n positionMenu(e, element);\n contextMenuController.openBtnMenu(element);\n },\n listenerSetter: this.listenerSetter\n });\n\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\n const {peerId, blocked} = update;\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\n if(blocked) {\n if(!li) {\n add(peerId, false);\n }\n } else {\n if(li) {\n li.remove();\n }\n }\n });\n\n const LOAD_COUNT = 50;\n let loading = false;\n this.scrollable.onScrolledBottom = () => {\n if(loading) {\n return;\n }\n\n loading = true;\n this.managers.appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then((res) => {\n for(const peerId of res.peerIds) {\n add(peerId, true);\n }\n\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\n this.scrollable.onScrolledBottom = null;\n }\n\n this.scrollable.checkForTriggers();\n }).finally(() => {\n loading = false;\n });\n };\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n\n onCloseAfterTimeout() {\n if(this.menuElement) {\n this.menuElement.remove();\n }\n\n return super.onCloseAfterTimeout();\n }\n}\n","export default function convertKeyToInputKey(key: string) {\n key = key[0].toUpperCase() + key.slice(1);\n key = 'input' + key;\n return key;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyVoicesTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-voices');\n this.setTitle('PrivacyVoiceMessages');\n\n const caption: LangPackKey = 'PrivacyVoiceMessagesInfo';\n new PrivacySection({\n tab: this,\n title: 'PrivacyVoiceMessagesTitle',\n inputKey: 'inputPrivacyKeyVoiceMessages',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatDateAccordingToTodayNew} from '../../../helpers/date';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {WebAuthorization} from '../../../layer';\nimport AvatarElement from '../../avatar';\nimport Button from '../../button';\nimport confirmationPopup from '../../confirmationPopup';\nimport Row from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport wrapPeerTitle from '../../wrappers/peerTitle';\n\nexport default class AppActiveWebSessionsTab extends SliderSuperTabEventable {\n public async init(sessions: WebAuthorization[]) {\n this.container.classList.add('active-sessions-container');\n this.setTitle('WebSessionsTitle');\n\n const Session = async(auth: WebAuthorization) => {\n const peerId = auth.bot_id.toPeerId();\n const row = new Row({\n title: await wrapPeerTitle({peerId}),\n subtitle: [auth.ip, auth.region].join(' - '),\n clickable: true,\n titleRight: formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\n });\n\n const media = row.createMedia('big');\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-48');\n await avatar.updateWithOptions({peerId});\n media.append(avatar);\n\n row.container.dataset.hash = '' + auth.hash;\n row.container.dataset.peerId = '' + peerId;\n\n row.midtitle.textContent = [auth.domain, auth.browser, auth.platform].filter(Boolean).join(', ');\n\n return row;\n };\n\n {\n const section = new SettingSection({\n caption: 'ClearOtherWebSessionsHelp'\n });\n\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllWebSessions'});\n\n attachClickEvent(btnTerminate, async() => {\n await confirmationPopup({\n descriptionLangKey: 'AreYouSureWebSessions',\n button: {\n langKey: 'Disconnect',\n isDanger: true\n }\n });\n\n const toggle = toggleDisability([btnTerminate], true);\n this.managers.appSeamlessLoginManager.resetWebAuthorizations().then(() => {\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnTerminate);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({\n name: 'OtherWebSessions',\n caption: 'TerminateWebSessionInfo'\n });\n\n const rows = await Promise.all(sessions.map(Session));\n section.content.append(...rows.map((row) => row.container));\n\n let leftLength = rows.length;\n attachClickEvent(section.content, async(e) => {\n const row = findUpClassName(e.target, 'row');\n if(!row) {\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'TerminateWebSessionText',\n descriptionLangArgs: [await wrapPeerTitle({peerId: row.dataset.peerId.toPeerId()})],\n button: {\n langKey: 'Disconnect',\n isDanger: true\n }\n });\n\n const hash = row.dataset.hash;\n row.classList.add('is-disabled');\n this.managers.appSeamlessLoginManager.resetWebAuthorization(hash).then(() => {\n if(!--leftLength) {\n this.close();\n } else {\n row.remove();\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SliderSuperTab, {SliderSuperTabEventable} from '../../sliderTab';\nimport Row from '../../row';\nimport {AccountPassword, Authorization, InputPrivacyKey, Updates, WebAuthorization} from '../../../layer';\nimport AppPrivacyPhoneNumberTab from './privacy/phoneNumber';\nimport AppTwoStepVerificationTab from './2fa';\nimport AppTwoStepVerificationEnterPasswordTab from './2fa/enterPassword';\nimport AppTwoStepVerificationEmailConfirmationTab from './2fa/emailConfirmation';\nimport AppPrivacyLastSeenTab from './privacy/lastSeen';\nimport AppPrivacyProfilePhotoTab from './privacy/profilePhoto';\nimport AppPrivacyForwardMessagesTab from './privacy/forwardMessages';\nimport AppPrivacyAddToGroupsTab from './privacy/addToGroups';\nimport AppPrivacyCallsTab from './privacy/calls';\nimport AppActiveSessionsTab from './activeSessions';\nimport AppBlockedUsersTab from './blockedUsers';\nimport rootScope from '../../../lib/rootScope';\nimport {i18n, LangPackKey, _i18n} from '../../../lib/langPack';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport CheckboxField from '../../checkboxField';\nimport PopupPeer from '../../popups/peer';\nimport Button from '../../button';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\nimport getPrivacyRulesDetails from '../../../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\nimport PrivacyType from '../../../lib/appManagers/utils/privacy/privacyType';\nimport confirmationPopup, {PopupConfirmationOptions} from '../../confirmationPopup';\nimport noop from '../../../helpers/noop';\nimport {toastNew} from '../../toast';\nimport AppPrivacyVoicesTab from './privacy/voices';\nimport SettingSection from '../../settingSection';\nimport AppActiveWebSessionsTab from './activeWebSessions';\n\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\n private activeSessionsRow: Row;\n private authorizations: Authorization.authorization[];\n\n private websitesRow: Row;\n private websites: WebAuthorization[];\n\n public static getInitArgs(fromTab: SliderSuperTab) {\n return {\n appConfig: fromTab.managers.apiManager.getAppConfig(),\n globalPrivacy: fromTab.managers.appPrivacyManager.getGlobalPrivacySettings(),\n contentSettings: fromTab.managers.apiManager.invokeApi('account.getContentSettings'),\n webAuthorizations: fromTab.managers.appSeamlessLoginManager.getWebAuthorizations()\n };\n }\n\n public init(p: ReturnType) {\n this.container.classList.add('dont-u-dare-block-me');\n this.setTitle('PrivacySettings');\n\n const SUBTITLE: LangPackKey = 'Loading';\n const promises: Promise[] = [];\n\n {\n const section = new SettingSection({noDelimiter: true, caption: 'SessionsInfo'});\n\n let blockedPeerIds: PeerId[];\n const blockedUsersRow = new Row({\n icon: 'deleteuser',\n titleLangKey: 'BlockedUsers',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppBlockedUsersTab);\n tab.peerIds = blockedPeerIds;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n blockedUsersRow.freezed = true;\n\n let passwordState: AccountPassword;\n const twoFactorRowOptions = {\n icon: 'lock',\n titleLangKey: 'TwoStepVerification' as LangPackKey,\n subtitleLangKey: SUBTITLE,\n clickable: (e: Event) => {\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\n if(passwordState.pFlags.has_password) {\n tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n } else if(passwordState.email_unconfirmed_pattern) {\n tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\n tab.email = passwordState.email_unconfirmed_pattern;\n tab.length = 6;\n tab.isFirst = true;\n this.managers.passwordManager.resendPasswordEmail();\n } else {\n tab = this.slider.createTab(AppTwoStepVerificationTab);\n }\n\n tab.state = passwordState;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n };\n\n const twoFactorRow = new Row(twoFactorRowOptions);\n twoFactorRow.freezed = true;\n\n const activeSessionsRow = this.activeSessionsRow = new Row({\n icon: 'activesessions',\n titleLangKey: 'SessionsTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppActiveSessionsTab);\n tab.authorizations = this.authorizations;\n tab.eventListener.addEventListener('destroy', () => {\n this.updateActiveSessions();\n }, {once: true});\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n activeSessionsRow.freezed = true;\n\n const websitesRow = this.websitesRow = new Row({\n icon: 'mention',\n titleLangKey: 'OtherWebSessions',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppActiveWebSessionsTab);\n tab.eventListener.addEventListener('destroy', () => {\n this.updateActiveWebsites();\n });\n tab.open(this.websites);\n },\n listenerSetter: this.listenerSetter\n });\n websitesRow.freezed = true;\n\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container, websitesRow.container);\n this.scrollable.append(section.container);\n\n const setBlockedCount = (count: number) => {\n if(count) {\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\n } else {\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\n }\n };\n\n this.listenerSetter.add(rootScope)('peer_block', () => {\n /* const {blocked, peerId} = update;\n if(!blocked) blockedPeerIds.findAndSplice((p) => p === peerId);\n else blockedPeerIds.unshift(peerId);\n blockedCount += blocked ? 1 : -1;\n setBlockedCount(blockedCount); */\n updateBlocked();\n });\n\n const updateBlocked = () => {\n this.managers.appUsersManager.getBlocked().then((res) => {\n blockedUsersRow.freezed = false;\n setBlockedCount(res.count);\n blockedPeerIds = res.peerIds;\n });\n };\n\n updateBlocked();\n\n this.managers.passwordManager.getState().then((state) => {\n passwordState = state;\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\n twoFactorRow.freezed = false;\n\n // console.log('password state', state);\n });\n\n this.updateActiveSessions();\n promises.push(this.updateActiveWebsites(p.webAuthorizations));\n }\n\n {\n const section = new SettingSection({name: 'PrivacyTitle', caption: 'GroupsAndChannelsHelp'});\n\n section.content.classList.add('privacy-navigation-container');\n\n const rowsByKeys: Partial<{\n [key in InputPrivacyKey['_']]: Row\n }> = {};\n\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\n titleLangKey: 'PrivacyPhoneTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyPhoneNumberTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\n titleLangKey: 'LastSeenTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyLastSeenTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\n titleLangKey: 'PrivacyProfilePhotoTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyProfilePhotoTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\n titleLangKey: 'WhoCanCallMe',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyCallsTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\n titleLangKey: 'PrivacyForwardsTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyForwardMessagesTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\n titleLangKey: 'WhoCanAddMe',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyAddToGroupsTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const voicesRow = rowsByKeys['inputPrivacyKeyVoiceMessages'] = new Row({\n titleLangKey: 'PrivacyVoiceMessagesTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n if(!rootScope.premium) {\n toastNew({langPackKey: 'PrivacyVoiceMessagesPremiumOnly'});\n } else {\n this.slider.createTab(AppPrivacyVoicesTab).open();\n }\n },\n listenerSetter: this.listenerSetter\n });\n\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\n const row = rowsByKeys[key];\n if(!row) {\n return;\n }\n\n this.managers.appPrivacyManager.getPrivacy(key).then((rules) => {\n const details = getPrivacyRulesDetails(rules);\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\n\n row.subtitle.innerHTML = '';\n const s = i18n(langKey);\n row.subtitle.append(s);\n if(disallowLength || allowLength) {\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\n }\n });\n };\n\n section.content.append(\n numberVisibilityRow.container,\n lastSeenTimeRow.container,\n photoVisibilityRow.container,\n callRow.container,\n linkAccountRow.container,\n groupChatsAddRow.container,\n voicesRow.container\n );\n this.scrollable.append(section.container);\n\n for(const key in rowsByKeys) {\n updatePrivacyRow(key as keyof typeof rowsByKeys);\n }\n\n rootScope.addEventListener('privacy_update', (update) => {\n updatePrivacyRow(convertKeyToInputKey(update.key._) as any);\n });\n }\n\n {\n const section = new SettingSection({name: 'NewChatsFromNonContacts', caption: 'ArchiveAndMuteInfo'});\n\n const checkboxField = new CheckboxField({text: 'ArchiveAndMute'});\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n let enabled: boolean, destroyed: boolean;\n this.eventListener.addEventListener('destroy', () => {\n destroyed = true;\n if(enabled === undefined || enabled === checkboxField.checked) return;\n return this.managers.appPrivacyManager.setGlobalPrivacySettings({\n _: 'globalPrivacySettings',\n archive_and_mute_new_noncontact_peers: checkboxField.checked\n });\n }, {once: true});\n\n const promise = Promise.all([\n p.appConfig,\n p.globalPrivacy\n ]).then(([appConfig, settings]) => {\n if(destroyed) {\n return;\n }\n\n const onPremiumToggle = (isPremium: boolean) => {\n section.container.classList.toggle('hide', !isPremium && !appConfig.autoarchive_setting_available);\n };\n\n this.listenerSetter.add(rootScope)('premium_toggle', onPremiumToggle);\n onPremiumToggle(rootScope.premium);\n\n enabled = !!settings.archive_and_mute_new_noncontact_peers;\n\n checkboxField.setValueSilently(enabled);\n });\n\n promises.push(promise);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'Privacy.SensitiveContent', caption: 'PrivacyAndSecurity.SensitiveDesc'});\n section.container.classList.add('hide');\n\n const checkboxField = new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText'});\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n let enabled: boolean;\n this.eventListener.addEventListener('destroy', () => {\n if(enabled === undefined) return;\n const _enabled = row.checkboxField.checked;\n const isChanged = _enabled !== enabled;\n if(!isChanged) {\n return;\n }\n\n return this.managers.apiManager.invokeApi('account.setContentSettings', {\n sensitive_enabled: _enabled\n });\n }, {once: true});\n\n const promise = p.contentSettings.then((settings) => {\n if(!settings.pFlags.sensitive_can_change) {\n return;\n }\n\n enabled = !!settings.pFlags.sensitive_enabled;\n checkboxField.setValueSilently(enabled);\n section.container.classList.remove('hide');\n });\n\n promises.push(promise);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'PrivacyPayments', caption: 'PrivacyPaymentsClearInfo'});\n\n const onClearClick = () => {\n const options: PopupConfirmationOptions = {\n titleLangKey: 'PrivacyPaymentsClearAlertTitle',\n descriptionLangKey: 'PrivacyPaymentsClearAlertText',\n button: {\n langKey: 'Clear'\n },\n checkboxes: [{\n text: 'PrivacyClearShipping',\n checked: true\n }, {\n text: 'PrivacyClearPayment',\n checked: true\n }]\n };\n\n confirmationPopup(options).then(() => {\n const [info, payment] = options.checkboxes.map((c) => c.checkboxField.checked);\n const toggle = toggleDisability([clearButton], true);\n this.managers.appPaymentsManager.clearSavedInfo(info, payment).then(() => {\n if(!info && !payment) {\n return;\n }\n\n toggle();\n toastNew({\n langPackKey: info && payment ? 'PrivacyPaymentsPaymentShippingCleared' : (info ? 'PrivacyPaymentsShippingInfoCleared' : 'PrivacyPaymentsPaymentInfoCleared')\n });\n });\n }, noop);\n };\n\n const clearButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyPaymentsClear'});\n this.listenerSetter.add(clearButton)('click', onClearClick);\n section.content.append(clearButton);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'FilterChats'});\n\n const onDeleteClick = () => {\n const popup = new PopupPeer('popup-delete-drafts', {\n buttons: [{\n langKey: 'Delete',\n callback: () => {\n const toggle = toggleDisability([deleteButton], true);\n this.managers.appDraftsManager.clearAllDrafts().then(() => {\n toggle();\n });\n },\n isDanger: true\n }],\n titleLangKey: 'AreYouSureClearDraftsTitle',\n descriptionLangKey: 'AreYouSureClearDrafts'\n });\n\n popup.show();\n };\n\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\n section.content.append(deleteButton);\n\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then((drafts) => {\n const draftsRow = new Row({\n titleLangKey: 'PrivacyDeleteCloudDrafts',\n subtitleLangKey: 'Drafts',\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\n icon: 'delete',\n clickable: onDeleteClick\n });\n\n section.content.append(draftsRow.container);\n })); */\n\n this.scrollable.append(section.container);\n }\n\n // {\n // const section = new SettingSection({\n // name: 'OtherWebSessions'\n // });\n\n // const row = new Row({\n\n // });\n\n // this.scrollable.append(section.container);\n // }\n\n return Promise.all(promises);\n }\n\n public updateActiveSessions() {\n return this.managers.apiManager.invokeApi('account.getAuthorizations').then((auths) => {\n this.activeSessionsRow.freezed = false;\n this.authorizations = auths.authorizations;\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\n });\n }\n\n public updateActiveWebsites(promise = this.managers.appSeamlessLoginManager.getWebAuthorizations()) {\n return promise.then((authorizations) => {\n this.websitesRow.freezed = false;\n this.websites = authorizations;\n _i18n(this.websitesRow.subtitle, 'Privacy.Websites', [this.websites.length]);\n this.websitesRow.container.classList.toggle('hide', !this.websites.length);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AvailableReaction} from '../../../layer';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport SettingSection from '../../settingSection';\nimport SliderSuperTab from '../../sliderTab';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\n\nexport default class AppQuickReactionTab extends SliderSuperTab {\n public init() {\n this.setTitle('DoubleTapSetting');\n this.container.classList.add('quick-reaction-container');\n\n return Promise.all([\n this.managers.appReactionsManager.getQuickReaction(),\n this.managers.appReactionsManager.getAvailableReactions()\n ]).then(([quickReaction, availableReactions]) => {\n availableReactions = availableReactions.filter((reaction) => !reaction.pFlags.inactive);\n\n const section = new SettingSection();\n\n const name = 'quick-reaction';\n const rows = availableReactions.map((availableReaction) => {\n const radioField = new RadioField({\n name,\n text: availableReaction.title,\n value: availableReaction.reaction,\n alignRight: true\n });\n\n const row = new Row({\n radioField,\n havePadding: true\n });\n\n radioField.main.classList.add('quick-reaction-title');\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n if(availableReaction.reaction === (quickReaction as AvailableReaction).reaction) {\n radioField.setValueSilently(true);\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, (value) => {\n this.managers.appReactionsManager.setDefaultReaction({_: 'reactionEmoji', emoticon: value});\n });\n\n section.content.append(form);\n this.scrollable.append(section.container);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport RangeSelector from '../../rangeSelector';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport RadioField from '../../radioField';\nimport rootScope from '../../../lib/rootScope';\nimport {IS_APPLE} from '../../../environment/userAgent';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport AppBackgroundTab from './background';\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport assumeType from '../../../helpers/assumeType';\nimport {BaseTheme, MessagesAllStickers, StickerSet} from '../../../layer';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport PopupStickers from '../../popups/stickers';\nimport eachMinute from '../../../helpers/eachMinute';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport IS_GEOLOCATION_SUPPORTED from '../../../environment/geolocationSupport';\nimport AppQuickReactionTab from './quickReaction';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {DEFAULT_THEME, State} from '../../../config/state';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\nimport SettingSection, {generateSection} from '../../settingSection';\nimport {ScrollableX} from '../../scrollable';\nimport wrapStickerEmoji from '../../wrappers/stickerEmoji';\nimport {Theme} from '../../../layer';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport themeController from '../../../helpers/themeController';\n\nexport class RangeSettingSelector {\n public container: HTMLDivElement;\n public valueContainer: HTMLElement;\n private range: RangeSelector;\n\n public onChange: (value: number) => void;\n\n constructor(\n name: LangPackKey,\n step: number,\n initialValue: number,\n minValue: number,\n maxValue: number,\n writeValue = true\n ) {\n const BASE_CLASS = 'range-setting-selector';\n this.container = document.createElement('div');\n this.container.classList.add(BASE_CLASS);\n\n const details = document.createElement('div');\n details.classList.add(BASE_CLASS + '-details');\n\n const nameDiv = document.createElement('div');\n nameDiv.classList.add(BASE_CLASS + '-name');\n _i18n(nameDiv, name);\n\n const valueDiv = this.valueContainer = document.createElement('div');\n valueDiv.classList.add(BASE_CLASS + '-value');\n\n if(writeValue) {\n valueDiv.innerHTML = '' + initialValue;\n }\n\n details.append(nameDiv, valueDiv);\n\n this.range = new RangeSelector({\n step,\n min: minValue,\n max: maxValue\n }, initialValue);\n this.range.setListeners();\n this.range.setHandlers({\n onScrub: value => {\n if(this.onChange) {\n this.onChange(value);\n }\n\n if(writeValue) {\n // console.log('font size scrub:', value);\n valueDiv.innerText = '' + value;\n }\n }\n });\n\n this.container.append(details, this.range.container);\n }\n}\n\nexport default class AppGeneralSettingsTab extends SliderSuperTabEventable {\n public static getInitArgs() {\n return {\n themes: rootScope.managers.appThemesManager.getThemes(),\n allStickers: rootScope.managers.appStickersManager.getAllStickers(),\n quickReaction: rootScope.managers.appReactionsManager.getQuickReaction()\n };\n }\n\n public init(p: ReturnType) {\n this.container.classList.add('general-settings-container');\n this.setTitle('General');\n\n const section = generateSection.bind(null, this.scrollable);\n const promises: Promise[] = [];\n\n {\n const container = section('Settings');\n\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\n range.onChange = (value) => {\n rootScope.managers.appStateManager.setByKey('settings.messagesTextSize', value);\n };\n\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\n\n const initArgs = AppBackgroundTab.getInitArgs();\n attachClickEvent(chatBackgroundButton, () => {\n this.slider.createTab(AppBackgroundTab).open(initArgs);\n });\n\n const animationsCheckboxField = new CheckboxField({\n text: 'EnableAnimations',\n name: 'animations',\n stateKey: 'settings.animationsEnabled',\n listenerSetter: this.listenerSetter\n });\n\n container.append(\n range.container,\n chatBackgroundButton,\n CreateRowFromCheckboxField(animationsCheckboxField).container\n );\n }\n\n {\n const container = section('ColorTheme');\n\n const scrollable = new ScrollableX(null);\n const themesContainer = scrollable.container;\n themesContainer.classList.add('themes-container');\n\n type K = {theme: Theme, player?: RLottiePlayer};\n const themesMap = new Map();\n\n let lastOnFrameNo: (frameNo: number) => void;\n\n attachClickEvent(themesContainer, async(e) => {\n const container = findUpClassName(e.target, 'theme-container');\n if(!container) {\n return;\n }\n\n const lastActive = themesContainer.querySelector('.active');\n if(lastActive) {\n lastActive.classList.remove('active');\n }\n\n const item = themesMap.get(container);\n container.classList.add('active');\n\n await themeController.applyNewTheme(item.theme);\n\n lastOnFrameNo?.(-1);\n\n if(item.player && rootScope.settings.animationsEnabled) {\n if(item.player.paused) {\n item.player.stop(true);\n }\n\n const pre = 'translateX(-50%) ';\n item.player.el[0].style.transform = pre + 'scale(2)';\n\n const onFrameNo = lastOnFrameNo = (frameNo) => {\n if(item.player.maxFrame === frameNo || frameNo === -1) {\n item.player.el[0].style.transform = '';\n item.player.removeEventListener('enterFrame', onFrameNo);\n\n if(lastOnFrameNo === onFrameNo) {\n lastOnFrameNo = undefined;\n }\n }\n };\n\n setTimeout(() => {\n if(lastOnFrameNo !== onFrameNo) {\n return;\n }\n\n item.player.play();\n item.player.addEventListener('enterFrame', onFrameNo);\n }, 250);\n }\n }, {listenerSetter: this.listenerSetter});\n\n const promise = p.themes.then(async(themes) => {\n const currentTheme = themeController.getTheme();\n const isNight = themeController.isNight();\n\n const defaultThemes = themes.filter((theme) => theme.pFlags.default/* && theme.settings[0].message_colors.length === 1 */);\n defaultThemes.unshift(DEFAULT_THEME);\n\n const promises = defaultThemes.map(async(theme) => {\n const baseTheme: BaseTheme['_'] = isNight ? 'baseThemeNight' : 'baseThemeClassic';\n const wallpaper = theme.settings.find((settings) => settings.base_theme._ === baseTheme).wallpaper;\n const result = AppBackgroundTab.addWallPaper(wallpaper);\n\n const container = result.container;\n const k: K = {theme};\n themesMap.set(container, k);\n\n themeController.applyTheme(theme, container);\n\n if(theme.id === currentTheme.id) {\n container.classList.add('active');\n }\n\n const emoticon = theme.emoticon;\n const loadPromises: Promise[] = [];\n let emoticonContainer: HTMLElement;\n if(emoticon) {\n emoticonContainer = document.createElement('div');\n emoticonContainer.classList.add('theme-emoticon');\n const size = 28 * 1.75;\n wrapStickerEmoji({\n div: emoticonContainer,\n width: size,\n height: size,\n emoji: theme.emoticon,\n managers: this.managers,\n loadPromises,\n middleware: this.middlewareHelper.get(),\n play: rootScope.settings.animationsEnabled\n }).then(({render}) => render).then((player) => {\n k.player = player as RLottiePlayer;\n });\n }\n\n const bubble = document.createElement('div');\n bubble.classList.add('theme-bubble');\n\n const bubbleIn = bubble.cloneNode() as HTMLElement;\n\n bubbleIn.classList.add('is-in');\n bubble.classList.add('is-out');\n\n loadPromises.push(result.loadPromise);\n\n container.classList.add('theme-container');\n\n await Promise.all(loadPromises);\n\n if(emoticonContainer) {\n container.append(emoticonContainer);\n }\n\n container.append(bubbleIn, bubble);\n\n return container;\n });\n\n const containers = await Promise.all(promises);\n\n scrollable.append(...containers);\n });\n\n promises.push(promise);\n\n container.append(\n themesContainer\n );\n }\n\n {\n const container = section('General.Keyboard');\n\n const form = document.createElement('form');\n\n const name = 'send-shortcut';\n const stateKey = 'settings.sendShortcut';\n\n const enterRow = new Row({\n radioField: new RadioField({\n langKey: 'General.SendShortcut.Enter',\n name,\n value: 'enter',\n stateKey\n }),\n subtitleLangKey: 'General.SendShortcut.NewLine.ShiftEnter'\n });\n\n const ctrlEnterRow = new Row({\n radioField: new RadioField({\n name,\n value: 'ctrlEnter',\n stateKey\n }),\n subtitleLangKey: 'General.SendShortcut.NewLine.Enter'\n });\n _i18n(ctrlEnterRow.radioField.main, 'General.SendShortcut.CtrlEnter', [IS_APPLE ? '⌘' : 'Ctrl']);\n\n form.append(enterRow.container, ctrlEnterRow.container);\n container.append(form);\n }\n\n if(IS_GEOLOCATION_SUPPORTED) {\n const container = section('DistanceUnitsTitle');\n\n const form = document.createElement('form');\n\n const name = 'distance-unit';\n const stateKey = 'settings.distanceUnit';\n\n const kilometersRow = new Row({\n radioField: new RadioField({\n langKey: 'DistanceUnitsKilometers',\n name,\n value: 'kilometers',\n stateKey\n })\n });\n\n const milesRow = new Row({\n radioField: new RadioField({\n langKey: 'DistanceUnitsMiles',\n name,\n value: 'miles',\n stateKey\n })\n });\n\n form.append(kilometersRow.container, milesRow.container);\n container.append(form);\n }\n\n {\n const container = section('General.TimeFormat');\n\n const form = document.createElement('form');\n\n const name = 'time-format';\n const stateKey = 'settings.timeFormat';\n\n const formats: [State['settings']['timeFormat'], LangPackKey][] = [\n ['h12', 'General.TimeFormat.h12'],\n ['h23', 'General.TimeFormat.h23']\n ];\n\n const rows = formats.map(([format, langPackKey]) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: langPackKey,\n name,\n value: format,\n stateKey\n })\n });\n\n return row;\n });\n\n const cancel = eachMinute(() => {\n const date = new Date();\n\n formats.forEach(([format], idx) => {\n const str = date.toLocaleTimeString('en-us-u-hc-' + format, {\n hour: '2-digit',\n minute: '2-digit'\n });\n\n rows[idx].subtitle.textContent = str;\n });\n });\n\n this.eventListener.addEventListener('destroy', cancel);\n\n form.append(...rows.map((row) => row.container));\n container.append(form);\n }\n\n {\n const container = section('Emoji');\n\n const suggestCheckboxField = new CheckboxField({\n text: 'GeneralSettings.EmojiPrediction',\n name: 'suggest-emoji',\n stateKey: 'settings.emoji.suggest',\n listenerSetter: this.listenerSetter\n });\n const bigCheckboxField = new CheckboxField({\n text: 'GeneralSettings.BigEmoji',\n name: 'emoji-big',\n stateKey: 'settings.emoji.big',\n listenerSetter: this.listenerSetter\n });\n\n container.append(\n CreateRowFromCheckboxField(suggestCheckboxField).container,\n CreateRowFromCheckboxField(bigCheckboxField).container\n );\n }\n\n {\n const section = new SettingSection({name: 'Telegram.InstalledStickerPacksController', caption: 'StickersBotInfo'});\n\n const reactionsRow = new Row({\n titleLangKey: 'DoubleTapSetting',\n havePadding: true,\n clickable: () => {\n this.slider.createTab(AppQuickReactionTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const renderQuickReaction = () => {\n p.quickReaction.then((reaction) => {\n if(reaction._ === 'availableReaction') {\n return reaction.static_icon;\n } else {\n return this.managers.appEmojiManager.getCustomEmojiDocument(reaction.document_id);\n }\n }).then((doc) => {\n wrapStickerToRow({\n row: reactionsRow,\n doc,\n size: 'small'\n });\n });\n };\n\n renderQuickReaction();\n\n this.listenerSetter.add(rootScope)('quick_reaction', renderQuickReaction);\n\n const suggestCheckboxField = new CheckboxField({\n text: 'Stickers.SuggestStickers',\n name: 'suggest',\n stateKey: 'settings.stickers.suggest',\n listenerSetter: this.listenerSetter\n });\n const loopCheckboxField = new CheckboxField({\n text: 'InstalledStickers.LoopAnimated',\n name: 'loop',\n stateKey: 'settings.stickers.loop',\n listenerSetter: this.listenerSetter\n });\n\n const stickerSets: {[id: string]: Row} = {};\n\n const stickersContent = section.generateContentElement();\n\n const lazyLoadQueue = new LazyLoadQueue();\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\n const row = new Row({\n title: wrapEmojiText(stickerSet.title),\n subtitleLangKey: 'Stickers',\n subtitleLangArgs: [stickerSet.count],\n havePadding: true,\n clickable: () => {\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\n },\n listenerSetter: this.listenerSetter\n });\n\n stickerSets[stickerSet.id] = row;\n\n const div = document.createElement('div');\n div.classList.add('row-media');\n\n wrapStickerSetThumb({\n set: stickerSet,\n container: div,\n group: 'GENERAL-SETTINGS',\n lazyLoadQueue,\n width: 36,\n height: 36,\n autoplay: true,\n middleware: this.middlewareHelper.get()\n });\n\n row.container.append(div);\n\n stickersContent[method](row.container);\n };\n\n const promise = p.allStickers.then((allStickers) => {\n assumeType(allStickers);\n const promises = allStickers.sets.map((stickerSet) => renderStickerSet(stickerSet));\n return Promise.all(promises);\n });\n\n promises.push(promise);\n\n this.listenerSetter.add(rootScope)('stickers_installed', (set) => {\n if(!stickerSets[set.id]) {\n renderStickerSet(set, 'prepend');\n }\n });\n\n this.listenerSetter.add(rootScope)('stickers_deleted', (set) => {\n if(stickerSets[set.id]) {\n stickerSets[set.id].container.remove();\n delete stickerSets[set.id];\n }\n });\n\n section.content.append(\n reactionsRow.container,\n CreateRowFromCheckboxField(suggestCheckboxField).container,\n CreateRowFromCheckboxField(loopCheckboxField).container\n );\n this.scrollable.append(section.container);\n }\n\n return Promise.all(promises);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport eachTimeout from './eachTimeout';\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachMinute(callback: () => any, runFirst = true) {\n return eachTimeout(callback, () => (60 - new Date().getSeconds()) * 1000, runFirst);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from '../environment/ctx';\nimport noop from './noop';\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachTimeout(callback: () => any, getNextTimeout: () => number, runFirst = true) {\n const cancel = () => {\n clearTimeout(timeout);\n };\n\n // replace callback to run noop and restore after\n const _callback = callback;\n if(!runFirst) {\n callback = noop;\n }\n\n let timeout: number;\n (function run() {\n callback();\n timeout = ctx.setTimeout(run, getNextTimeout());\n })();\n\n callback = _callback;\n\n return cancel;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter} from '../../../lib/storages/filters';\nimport type {DialogFilterSuggested} from '../../../layer';\nimport type _rootScope from '../../../lib/rootScope';\nimport {SliderSuperTab} from '../../slider';\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\nimport Button from '../../button';\nimport rootScope from '../../../lib/rootScope';\nimport AppEditFolderTab from './editFolder';\nimport Row from '../../row';\nimport {i18n, i18n_, LangPackKey, join} from '../../../lib/langPack';\nimport cancelEvent from '../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport SettingSection from '../../settingSection';\nimport Sortable from '../../../helpers/dom/sortable';\nimport whichChild from '../../../helpers/dom/whichChild';\nimport indexOfAndSplice from '../../../helpers/array/indexOfAndSplice';\nimport showLimitPopup from '../../popups/limit';\n\nexport default class AppChatFoldersTab extends SliderSuperTab {\n private createFolderBtn: HTMLElement;\n private foldersSection: SettingSection;\n private suggestedSection: SettingSection;\n private stickerContainer: HTMLElement;\n private animation: RLottiePlayer;\n private list: HTMLElement;\n\n private filtersRendered: {[filterId: number]: Row} = {};\n private loadAnimationPromise: ReturnType;\n\n public static getInitArgs() {\n return {\n animationData: lottieLoader.loadAnimationFromURLManually('Folders_1'),\n filters: rootScope.managers.filtersStorage.getDialogFilters()\n };\n }\n\n private async renderFolder(\n dialogFilter: DialogFilterSuggested | MyDialogFilter,\n container?: HTMLElement,\n row?: Row,\n append?: boolean\n ) {\n let filter: MyDialogFilter;\n let description = '';\n const d: HTMLElement[] = [];\n if(dialogFilter._ === 'dialogFilterSuggested') {\n filter = dialogFilter.filter as MyDialogFilter;\n description = dialogFilter.description;\n } else {\n filter = dialogFilter;\n\n const enabledFilters = Object.keys(filter.pFlags).length;\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach((key) => {\n enabledFilters += +!!filter[key].length;\n }); */\n\n if(enabledFilters === 1) {\n const pFlags = filter.pFlags;\n let k: LangPackKey;\n if(pFlags.contacts) k = 'FilterAllContacts';\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\n else if(pFlags.groups) k = 'FilterAllGroups';\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\n else if(pFlags.bots) k = 'FilterAllBots';\n\n if(k) {\n d.push(i18n(k));\n }\n }\n\n if(!d.length) {\n const folder = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\n let chats = 0, channels = 0, groups = 0;\n await Promise.all(folder.map(async(dialog) => {\n if(await this.managers.appPeersManager.isAnyGroup(dialog.peerId)) groups++;\n else if(await this.managers.appPeersManager.isBroadcast(dialog.peerId)) channels++;\n else chats++;\n }));\n\n if(chats) d.push(i18n('Chats', [chats]));\n if(channels) d.push(i18n('Channels', [channels]));\n if(groups) d.push(i18n('Groups', [groups]));\n }\n }\n\n if(!row) {\n row = new Row({\n title: filter.id === FOLDER_ID_ALL ? i18n('FilterAllChats') : wrapEmojiText(filter.title),\n subtitle: description,\n clickable: true,\n buttonRightLangKey: dialogFilter._ === 'dialogFilterSuggested' ? 'Add' : undefined\n });\n\n if(d.length) {\n row.subtitle.append(...join(d));\n }\n\n if(dialogFilter._ === 'dialogFilter') {\n const filterId = filter.id;\n if(!this.filtersRendered[filter.id] && filter.id !== FOLDER_ID_ALL) {\n const initArgs = AppEditFolderTab.getInitArgs();\n attachClickEvent(row.container, async() => {\n const filter = await this.managers.filtersStorage.getFilter(filterId);\n const tab = this.slider.createTab(AppEditFolderTab);\n tab.setInitFilter(filter);\n tab.open(initArgs);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.filtersRendered[filter.id] = row;\n\n row.makeSortable();\n }\n } else {\n if(filter.id !== FOLDER_ID_ALL) {\n replaceContent(row.title, wrapEmojiText(filter.title));\n }\n\n row.subtitle.textContent = '';\n row.subtitle.append(...join(d));\n }\n\n const div = row.container;\n\n if(append) {\n const localId = (filter as MyDialogFilter).localId;\n if(localId !== undefined) {\n // ! header will be at 0 index\n positionElementByIndex(div, div.parentElement || container, localId);\n } else if(container) {\n container.append(div);\n }\n }\n\n return row;\n }\n\n public init(p: ReturnType = AppChatFoldersTab.getInitArgs()) {\n this.container.classList.add('chat-folders-container');\n this.setTitle('ChatList.Filter.List.Title');\n\n this.scrollable.container.classList.add('chat-folders');\n\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add('sticker-container');\n\n const caption = document.createElement('div');\n caption.classList.add('caption');\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\n\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'ChatList.Filter.NewTitle',\n icon: 'add'\n });\n\n this.foldersSection = new SettingSection({\n name: 'Filters'\n });\n this.foldersSection.container.classList.add('hide');\n\n this.list = document.createElement('div');\n this.foldersSection.content.append(this.list);\n\n this.suggestedSection = new SettingSection({\n name: 'FilterRecommended'\n });\n this.suggestedSection.container.classList.add('hide');\n\n this.scrollable.append(\n this.stickerContainer,\n caption,\n this.createFolderBtn,\n this.foldersSection.container,\n this.suggestedSection.container\n );\n\n attachClickEvent(this.createFolderBtn, async() => {\n if(!(await this.canCreateFolder())) {\n showLimitPopup('folders');\n } else {\n this.slider.createTab(AppEditFolderTab).open();\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onFiltersContainerUpdate = () => {\n this.foldersSection.container.classList.toggle('hide', !Object.keys(this.filtersRendered).length);\n };\n\n const loadPromises: Promise[] = [];\n const renderFiltersPromise = p.filters.then(async(filters) => {\n for(const filter of filters) {\n if(filter.id === FOLDER_ID_ARCHIVE) {\n continue;\n }\n\n await this.renderFolder(filter, this.list, undefined, true);\n }\n\n this.toggleAllChats();\n\n onFiltersContainerUpdate();\n });\n\n loadPromises.push(renderFiltersPromise);\n\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\n const filterRendered = this.filtersRendered[filter.id];\n if(filterRendered) {\n await this.renderFolder(filter, null, filterRendered);\n } else if(filter.id !== FOLDER_ID_ARCHIVE) {\n await this.renderFolder(filter, this.list, undefined, true);\n }\n\n onFiltersContainerUpdate();\n\n this.getSuggestedFilters();\n });\n\n this.listenerSetter.add(rootScope)('filter_delete', (filter) => {\n const filterRendered = this.filtersRendered[filter.id];\n if(filterRendered) {\n /* for(const suggested of this.suggestedFilters) {\n if(deepEqual(suggested.filter, filter)) {\n\n }\n } */\n this.getSuggestedFilters();\n\n filterRendered.container.remove();\n delete this.filtersRendered[filter.id];\n }\n\n onFiltersContainerUpdate();\n });\n\n this.listenerSetter.add(rootScope)('filter_order', (order) => {\n order.filter((filterId) => !!this.filtersRendered[filterId]).forEach((filterId, idx) => {\n const filterRendered = this.filtersRendered[filterId];\n const container = filterRendered.container;\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header\n });\n });\n\n this.listenerSetter.add(rootScope)('premium_toggle', () => {\n this.toggleAllChats();\n });\n\n this.loadAnimationPromise = p.animationData.then(async(cb) => {\n const player = await cb({\n container: this.stickerContainer,\n loop: false,\n autoplay: false,\n width: 86,\n height: 86\n });\n\n this.animation = player;\n\n return lottieLoader.waitForFirstFrame(player);\n });\n\n loadPromises.push(this.loadAnimationPromise);\n\n new Sortable({\n list: this.list,\n middleware: this.middlewareHelper.get(),\n onSort: (prevIdx, newIdx) => {\n let order: number[] = [];\n for(const filterId in this.filtersRendered) {\n const row = this.filtersRendered[filterId];\n const idx = whichChild(row.container);\n order[idx] = +filterId;\n }\n\n order = order.filter((filterId) => filterId !== undefined);\n if(!rootScope.premium) {\n indexOfAndSplice(order, FOLDER_ID_ALL);\n // order.unshift(FOLDER_ID_ALL);\n }\n\n this.managers.filtersStorage.updateDialogFiltersOrder(order);\n },\n scrollable: this.scrollable\n });\n\n this.getSuggestedFilters();\n\n /* return Promise.all([\n this.loadAnimationPromise\n ]); */\n return Promise.all(loadPromises);\n }\n\n onOpenAfterTimeout() {\n this.loadAnimationPromise.then(() => {\n this.animation.autoplay = true;\n this.animation.play();\n });\n\n return super.onOpenAfterTimeout();\n }\n\n private toggleAllChats() {\n const filterRendered = this.filtersRendered[FOLDER_ID_ALL];\n filterRendered.container.classList.toggle('hide', !rootScope.premium);\n }\n\n private async canCreateFolder() {\n const [limit, filters] = await Promise.all([\n this.managers.apiManager.getLimit('folders'),\n this.managers.filtersStorage.getDialogFilters()\n ]);\n\n const filtersLength = filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).length;\n return filtersLength < limit;\n }\n\n private getSuggestedFilters() {\n return this.managers.filtersStorage.getSuggestedDialogsFilters().then(async(suggestedFilters) => {\n this.suggestedSection.container.classList.toggle('hide', !suggestedFilters.length);\n Array.from(this.suggestedSection.content.children).slice(1).forEach((el) => el.remove());\n\n for(const filter of suggestedFilters) {\n const row = await this.renderFolder(filter);\n this.suggestedSection.content.append(row.container);\n\n const button = row.buttonRight;\n attachClickEvent(button, async(e) => {\n cancelEvent(e);\n\n if(!(await this.canCreateFolder())) {\n showLimitPopup('folders');\n return;\n }\n\n button.setAttribute('disabled', 'true');\n\n const f = filter.filter as MyDialogFilter;\n f.includePeerIds = [];\n f.excludePeerIds = [];\n f.pinnedPeerIds = [];\n\n this.managers.filtersStorage.createDialogFilter(f, true).then(() => {\n row.container.remove();\n this.suggestedSection.container.classList.toggle('hide', this.suggestedSection.content.childElementCount === 1);\n }).finally(() => {\n button.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Row from '../../row';\nimport CheckboxField from '../../checkboxField';\nimport {InputNotifyPeer, InputPeerNotifySettings, Update} from '../../../layer';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport rootScope from '../../../lib/rootScope';\nimport {LangPackKey} from '../../../lib/langPack';\nimport copy from '../../../helpers/object/copy';\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\nimport {MUTE_UNTIL} from '../../../lib/mtproto/mtproto_config';\nimport apiManagerProxy from '../../../lib/mtproto/mtprotoworker';\nimport SettingSection from '../../settingSection';\n\ntype InputNotifyKey = Exclude;\n\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('notifications-container');\n this.setTitle('Telegram.NotificationSettingsViewController');\n\n const NotifySection = (options: {\n name: LangPackKey,\n typeText: LangPackKey,\n inputKey: InputNotifyKey,\n }) => {\n const section = new SettingSection({\n name: options.name\n });\n\n const enabledRow = new Row({\n checkboxField: new CheckboxField({text: options.typeText, checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n const previewEnabledRow = new Row({\n checkboxField: new CheckboxField({text: 'MessagePreview', checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n section.content.append(enabledRow.container, previewEnabledRow.container);\n\n this.scrollable.append(section.container);\n\n const inputNotifyPeer = {_: options.inputKey};\n const ret = this.managers.appNotificationsManager.getNotifySettings(inputNotifyPeer);\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\n const applySettings = async() => {\n const muted = await this.managers.appNotificationsManager.isMuted(notifySettings);\n enabledRow.checkboxField.checked = !muted;\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\n\n return muted;\n };\n\n applySettings();\n\n this.eventListener.addEventListener('destroy', async() => {\n const mute = !enabledRow.checkboxField.checked;\n const showPreviews = previewEnabledRow.checkboxField.checked;\n\n if(mute === (await this.managers.appNotificationsManager.isMuted(notifySettings)) && showPreviews === notifySettings.show_previews) {\n return;\n }\n\n const inputSettings: InputPeerNotifySettings = copy(notifySettings) as any;\n inputSettings._ = 'inputPeerNotifySettings';\n inputSettings.mute_until = mute ? MUTE_UNTIL : 0;\n inputSettings.show_previews = showPreviews;\n delete inputSettings.flags;\n\n this.managers.appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\n }, {once: true});\n\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\n const inputKey = convertKeyToInputKey(update.peer._) as any;\n if(options.inputKey === inputKey) {\n notifySettings = update.notify_settings;\n applySettings();\n }\n });\n });\n };\n\n NotifySection({\n name: 'NotificationsPrivateChats',\n typeText: 'NotificationsForPrivateChats',\n inputKey: 'inputNotifyUsers'\n });\n\n NotifySection({\n name: 'NotificationsGroups',\n typeText: 'NotificationsForGroups',\n inputKey: 'inputNotifyChats'\n });\n\n NotifySection({\n name: 'NotificationsChannels',\n typeText: 'NotificationsForChannels',\n inputKey: 'inputNotifyBroadcasts'\n });\n\n {\n const section = new SettingSection({\n name: 'NotificationsOther'\n });\n\n const contactsSignUpRow = new Row({\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n const soundRow = new Row({\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound', listenerSetter: this.listenerSetter}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n apiManagerProxy.getState().then((state) => {\n soundRow.checkboxField.checked = state.settings.notifications.sound;\n });\n\n section.content.append(contactsSignUpRow.container, soundRow.container);\n\n this.scrollable.append(section.container);\n\n this.managers.appNotificationsManager.getContactSignUpNotification().then((enabled) => {\n contactsSignUpRow.checkboxField.checked = enabled;\n\n this.eventListener.addEventListener('destroy', () => {\n const _enabled = contactsSignUpRow.checkboxField.checked;\n if(enabled !== _enabled) {\n this.managers.appNotificationsManager.setContactSignUpNotification(!_enabled);\n }\n }, {once: true});\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {randomLong} from '../../../helpers/random';\nimport {LangPackLanguage} from '../../../layer';\nimport I18n from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTab} from '../../slider'\n\nexport default class AppLanguageTab extends SliderSuperTab {\n public static getInitArgs() {\n return {\n languages1: rootScope.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\n lang_pack: 'web'\n }),\n // languages2: rootScope.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\n // lang_pack: 'macos'\n // })\n languages2: Promise.resolve([] as LangPackLanguage[])\n };\n }\n\n public init(p: ReturnType) {\n this.header.classList.add('with-border');\n this.container.classList.add('language-container');\n this.setTitle('Telegram.LanguageViewController');\n\n const section = new SettingSection({});\n\n const radioRows: Map = new Map();\n\n const promise = Promise.all([\n p.languages1,\n p.languages2\n ]).then(([languages1, languages2]) => {\n const rendered: Set = new Set();\n const webLangCodes = languages1.map((language) => language.lang_code);\n\n const random = randomLong();\n languages1.concat(languages2).forEach((language) => {\n if(rendered.has(language.lang_code)) return;\n rendered.add(language.lang_code);\n\n const row = new Row({\n radioField: new RadioField({\n text: language.name,\n name: random,\n value: language.lang_code\n }),\n subtitle: language.native_name\n });\n\n radioRows.set(language.lang_code, row);\n });\n\n const form = RadioFormFromRows([...radioRows.values()], (value) => {\n I18n.getLangPack(value, webLangCodes.includes(value));\n });\n\n I18n.getCacheLangPack().then((langPack) => {\n const row = radioRows.get(langPack.lang_code);\n if(!row) {\n console.error('no row', row, langPack);\n return;\n }\n\n row.radioField.setValueSilently(true);\n });\n\n section.content.append(form);\n });\n\n this.scrollable.append(section.container);\n\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../../../../helpers/listenerSetter';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport CheckboxField from '../../../checkboxField';\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport Row, {CreateRowFromCheckboxField} from '../../../row';\nimport SettingSection from '../../../settingSection';\n\nexport function autoDownloadPeerTypeSection(type: 'photo' | 'video' | 'file', title: LangPackKey, listenerSetter: ListenerSetter) {\n const section = new SettingSection({name: title});\n\n const key = 'settings.autoDownload.' + type + '.';\n const contactsCheckboxField = new CheckboxField({\n text: 'AutodownloadContacts',\n name: 'contacts',\n stateKey: key + 'contacts',\n listenerSetter\n });\n const privateCheckboxField = new CheckboxField({\n text: 'AutodownloadPrivateChats',\n name: 'private',\n stateKey: key + 'private',\n listenerSetter\n });\n const groupsCheckboxField = new CheckboxField({\n text: 'AutodownloadGroupChats',\n name: 'groups',\n stateKey: key + 'groups',\n listenerSetter\n });\n const channelsCheckboxField = new CheckboxField({\n text: 'AutodownloadChannels',\n name: 'channels',\n stateKey: key + 'channels',\n listenerSetter\n });\n\n section.content.append(\n CreateRowFromCheckboxField(contactsCheckboxField).container,\n CreateRowFromCheckboxField(privateCheckboxField).container,\n CreateRowFromCheckboxField(groupsCheckboxField).container,\n CreateRowFromCheckboxField(channelsCheckboxField).container\n );\n\n return section;\n}\n\nexport default class AppAutoDownloadPhotoTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadPhotos');\n\n const section = autoDownloadPeerTypeSection('photo', 'AutoDownloadPhotosTitle', this.listenerSetter);\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport formatBytes from '../../../../helpers/formatBytes';\nimport debounce from '../../../../helpers/schedulers/debounce';\nimport I18n from '../../../../lib/langPack';\nimport rootScope from '../../../../lib/rootScope';\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport {RangeSettingSelector} from '../generalSettings';\nimport {autoDownloadPeerTypeSection} from './photo';\n\nexport default class AppAutoDownloadFileTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadFiles');\n\n const debouncedSave = debounce((sizeMax: number) => {\n this.managers.appStateManager.setByKey('settings.autoDownloadNew.file_size_max', sizeMax);\n }, 200, false, true);\n\n const section = autoDownloadPeerTypeSection('file', 'AutoDownloadFilesTitle', this.listenerSetter);\n\n const MIN = 512 * 1024;\n // const MAX = 2 * 1024 * 1024 * 1024;\n const MAX = 20 * 1024 * 1024;\n const MAX_RANGE = MAX - MIN;\n\n const sizeMax = rootScope.settings.autoDownloadNew.file_size_max;\n const value = Math.sqrt(Math.sqrt((sizeMax - MIN) / MAX_RANGE));\n const upTo = new I18n.IntlElement({\n key: 'AutodownloadSizeLimitUpTo',\n args: [formatBytes(sizeMax)]\n });\n const range = new RangeSettingSelector('AutoDownloadMaxFileSize', 0.01, value, 0, 1, false);\n range.onChange = (value) => {\n const sizeMax = (value ** 4 * MAX_RANGE + MIN) | 0;\n\n upTo.compareAndUpdate({args: [formatBytes(sizeMax)]});\n\n debouncedSave(sizeMax);\n };\n\n range.valueContainer.append(upTo.element);\n\n section.content.append(range.container);\n\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport {autoDownloadPeerTypeSection} from './photo';\n\nexport default class AppAutoDownloadVideoTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadVideos');\n\n const section = autoDownloadPeerTypeSection('video', 'AutoDownloadVideosTitle', this.listenerSetter);\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AutoDownloadPeerTypeSettings, STATE_INIT} from '../../../config/state';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport formatBytes from '../../../helpers/formatBytes';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {FormatterArguments, i18n, join, LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport confirmationPopup from '../../confirmationPopup';\nimport Row from '../../row';\nimport {SliderSuperTabEventable, SliderSuperTabEventableConstructable} from '../../sliderTab';\nimport AppAutoDownloadFileTab from './autoDownload/file';\nimport AppAutoDownloadPhotoTab from './autoDownload/photo';\nimport AppAutoDownloadVideoTab from './autoDownload/video';\nimport apiManagerProxy from '../../../lib/mtproto/mtprotoworker';\nimport SettingSection from '../../settingSection';\n\nconst AUTO_DOWNLOAD_FOR_KEYS: {[k in keyof AutoDownloadPeerTypeSettings]: LangPackKey} = {\n contacts: 'AutoDownloadContacts',\n private: 'AutoDownloadPm',\n groups: 'AutoDownloadGroups',\n channels: 'AutoDownloadChannels'\n};\n\nexport default class AppDataAndStorageTab extends SliderSuperTabEventable {\n public async init() {\n this.setTitle('DataSettings');\n\n {\n const section = new SettingSection({name: 'AutomaticMediaDownload', caption: 'AutoDownloadAudioInfo'});\n\n const state = await apiManagerProxy.getState();\n\n const autoCheckboxField = new CheckboxField({\n text: 'AutoDownloadMedia',\n name: 'auto',\n checked: !state.settings.autoDownloadNew.pFlags.disabled,\n listenerSetter: this.listenerSetter\n });\n\n const autoRow = new Row({\n checkboxField: autoCheckboxField,\n listenerSetter: this.listenerSetter\n });\n\n const onChange = () => {\n toggleDisability([resetButton],\n deepEqual(state.settings.autoDownload, STATE_INIT.settings.autoDownload) &&\n deepEqual(state.settings.autoDownloadNew, STATE_INIT.settings.autoDownloadNew));\n };\n\n const setSubtitles = () => {\n this.setAutoDownloadSubtitle(photoRow, state.settings.autoDownload.photo /* state.settings.autoDownloadNew.photo_size_max */);\n this.setAutoDownloadSubtitle(videoRow, state.settings.autoDownload.video/* , state.settings.autoDownloadNew.video_size_max */);\n this.setAutoDownloadSubtitle(fileRow, state.settings.autoDownload.file, state.settings.autoDownloadNew.file_size_max);\n };\n\n const openTab = (tabConstructor: SliderSuperTabEventableConstructable) => {\n const tab = this.slider.createTab(tabConstructor);\n tab.open();\n\n this.listenerSetter.add(tab.eventListener)('destroy', () => {\n setSubtitles();\n onChange();\n }, {once: true});\n };\n\n const photoRow = new Row({\n titleLangKey: 'AutoDownloadPhotos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadPhotoTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const videoRow = new Row({\n titleLangKey: 'AutoDownloadVideos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadVideoTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const fileRow = new Row({\n titleLangKey: 'AutoDownloadFiles',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadFileTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const resetButton = Button('btn-primary btn-transparent primary', {icon: 'delete', text: 'ResetAutomaticMediaDownload'});\n attachClickEvent(resetButton, () => {\n confirmationPopup({\n titleLangKey: 'ResetAutomaticMediaDownloadAlertTitle',\n descriptionLangKey: 'ResetAutomaticMediaDownloadAlert',\n button: {\n langKey: 'Reset'\n }\n }).then(() => {\n const settings = rootScope.settings;\n settings.autoDownloadNew = copy(STATE_INIT.settings.autoDownloadNew);\n settings.autoDownload = copy(STATE_INIT.settings.autoDownload);\n state.settings = settings;\n this.managers.appStateManager.setByKey('settings', settings);\n\n setSubtitles();\n autoCheckboxField.checked = !state.settings.autoDownloadNew.pFlags.disabled;\n });\n });\n\n const onDisabledChange = () => {\n const disabled = !autoCheckboxField.checked;\n\n const settings = rootScope.settings;\n if(disabled) {\n settings.autoDownloadNew.pFlags.disabled = true;\n } else {\n delete settings.autoDownloadNew.pFlags.disabled;\n }\n\n [photoRow, videoRow, fileRow].forEach((row) => {\n row.container.classList.toggle('is-disabled', disabled);\n });\n\n this.managers.appStateManager.setByKey('settings', settings);\n\n onChange();\n };\n\n autoCheckboxField.input.addEventListener('change', onDisabledChange);\n onDisabledChange();\n setSubtitles();\n\n section.content.append(\n autoRow.container,\n photoRow.container,\n videoRow.container,\n fileRow.container,\n resetButton\n );\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'AutoplayMedia'});\n\n section.content.append(new Row({\n checkboxField: new CheckboxField({\n text: 'AutoplayGIF',\n name: 'gifs',\n stateKey: 'settings.autoPlay.gifs',\n listenerSetter: this.listenerSetter\n }),\n listenerSetter: this.listenerSetter\n }).container, new Row({\n checkboxField: new CheckboxField({\n text: 'AutoplayVideo',\n name: 'videos',\n stateKey: 'settings.autoPlay.videos',\n listenerSetter: this.listenerSetter\n }),\n listenerSetter: this.listenerSetter\n }).container);\n\n this.scrollable.append(section.container);\n }\n }\n\n private setAutoDownloadSubtitle(row: Row, settings: AutoDownloadPeerTypeSettings, sizeMax?: number) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n\n const peerKeys = Object.keys(settings) as (keyof typeof AUTO_DOWNLOAD_FOR_KEYS)[];\n const enabledKeys = peerKeys.map((key) => settings[key] ? AUTO_DOWNLOAD_FOR_KEYS[key] : undefined).filter(Boolean);\n if(!enabledKeys.length || sizeMax === 0) {\n key = 'AutoDownloadOff';\n } else {\n const isAll = enabledKeys.length === peerKeys.length;\n if(sizeMax !== undefined) {\n key = isAll ? 'AutoDownloadUpToOnAllChats' : 'AutoDownloadOnUpToFor';\n args.push(formatBytes(sizeMax));\n } else {\n key = isAll ? 'AutoDownloadOnAllChats' : 'AutoDownloadOnFor';\n }\n\n if(!isAll) {\n const fragment = document.createElement('span');\n fragment.append(...join(enabledKeys.map((key) => i18n(key)), true, false));\n args.push(fragment);\n }\n }\n\n replaceContent(row.subtitle, i18n(key, args));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport ButtonMenuToggle from '../../buttonMenuToggle';\nimport Button from '../../button';\nimport AppPrivacyAndSecurityTab from './privacyAndSecurity';\nimport AppGeneralSettingsTab from './generalSettings';\nimport AppEditProfileTab from './editProfile';\nimport AppChatFoldersTab from './chatFolders';\nimport AppNotificationsTab from './notifications';\nimport AppLanguageTab from './language';\nimport lottieLoader from '../../../lib/rlottie/lottieLoader';\nimport PopupPeer from '../../popups/peer';\nimport AppDataAndStorageTab from './dataAndStorage';\nimport ButtonIcon from '../../buttonIcon';\nimport PeerProfile from '../../peerProfile';\nimport rootScope from '../../../lib/rootScope';\nimport Row from '../../row';\nimport AppActiveSessionsTab from './activeSessions';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport {SliderSuperTabConstructable, SliderSuperTabEventable} from '../../sliderTab';\nimport PopupAvatar from '../../popups/avatar';\nimport {AccountAuthorizations, Authorization} from '../../../layer';\nimport PopupElement from '../../popups';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n// import AppMediaViewer from \"../../appMediaViewerNew\";\n\nexport default class AppSettingsTab extends SliderSuperTab {\n private buttons: {\n edit: HTMLButtonElement,\n folders: HTMLButtonElement,\n general: HTMLButtonElement,\n notifications: HTMLButtonElement,\n storage: HTMLButtonElement,\n privacy: HTMLButtonElement,\n } = {} as any;\n private profile: PeerProfile;\n\n private languageRow: Row;\n private devicesRow: Row;\n\n private authorizations: Authorization.authorization[];\n private getAuthorizationsPromise: Promise;\n\n public async init() {\n this.container.classList.add('settings-container');\n this.setTitle('Settings');\n\n const btnMenu = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'logout',\n text: 'EditAccount.Logout',\n onClick: () => {\n new PopupPeer('logout', {\n titleLangKey: 'LogOut',\n descriptionLangKey: 'LogOut.Description',\n buttons: [{\n langKey: 'LogOut',\n callback: () => {\n this.managers.apiManager.logOut();\n },\n isDanger: true\n }]\n }).show();\n }\n }]\n });\n\n this.buttons.edit = ButtonIcon('edit');\n\n this.header.append(this.buttons.edit, btnMenu);\n\n this.profile = new PeerProfile(this.managers, this.scrollable, this.listenerSetter, false);\n this.profile.init();\n this.profile.setPeer(rootScope.myId);\n const fillPromise = this.profile.fillProfileElements();\n\n const changeAvatarBtn = Button('btn-circle btn-corner z-depth-1 profile-change-avatar', {icon: 'cameraadd'});\n attachClickEvent(changeAvatarBtn, () => {\n const canvas = document.createElement('canvas');\n PopupElement.createPopup(PopupAvatar).open(canvas, (upload) => {\n upload().then((inputFile) => {\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\n });\n });\n }, {listenerSetter: this.listenerSetter});\n this.profile.element.lastElementChild.firstElementChild.append(changeAvatarBtn);\n\n const updateChangeAvatarBtn = async() => {\n const user = await this.managers.appUsersManager.getSelf();\n changeAvatarBtn.classList.toggle('hide', user.photo?._ !== 'userProfilePhoto');\n };\n\n updateChangeAvatarBtn();\n this.listenerSetter.add(rootScope)('avatar_update', ({peerId}) => {\n if(rootScope.myId === peerId) {\n updateChangeAvatarBtn();\n }\n });\n\n /* const div = document.createElement('div');\n //div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem 0 10rem auto;';\n //div.style.width = '135px';\n //div.style.height = '100px';\n div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem auto 10rem 0;';\n div.style.width = '135px';\n div.style.height = '100px';\n\n const img = document.createElement('img');\n img.src = 'assets/img/pepe.jpg';\n img.classList.add('media-photo');\n img.style.cssText = 'max-width: 100%;max-height: 100%;';\n\n div.append(img);\n\n div.addEventListener('click', () => {\n new AppMediaViewer().setSearchContext({peerId: 61004386, inputFilter: 'inputMessagesFilterPhotos'}).openMedia({\n _: 'message',\n mid: 1,\n peerId: 61004386,\n fromId: 61004386,\n message: '',\n media: {\n _: 'messageMediaPhoto',\n photo: {\n _: 'photo',\n url: img.src,\n downloaded: 111,\n sizes: [{\n _: 'photoSize',\n type: 'x',\n w: 618,\n h: 412\n }]\n }\n },\n date: Date.now() / 1000 | 0\n }, img);\n });\n\n this.scrollable.append(div); */\n\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add('profile-buttons');\n\n type ConstructorP = T extends {\n new (...args: any[]): infer U;\n } ? U : never;\n\n const m = (\n icon: string,\n text: LangPackKey,\n c: T,\n getInitArgs?: () => Promise['init']>>\n ): {\n icon: string,\n text: LangPackKey,\n tabConstructor: T,\n getInitArgs?: typeof getInitArgs,\n // args?: ReturnType\n args?: any\n } => {\n if(!getInitArgs) {\n const g = (c as any as typeof SliderSuperTab).getInitArgs;\n if(g) {\n // @ts-ignore\n getInitArgs = () => [g(this)];\n }\n }\n\n return {\n icon,\n text,\n tabConstructor: c,\n getInitArgs,\n args: getInitArgs?.()\n };\n };\n\n // const k = (c: T): () => [ReturnType['getInitArgs']>] => {\n // return () => (c as any).getInitArgs(this);\n // };\n\n const b = [\n m('unmute', 'AccountSettings.Notifications', AppNotificationsTab),\n m('data', 'DataSettings', AppDataAndStorageTab),\n m('lock', 'AccountSettings.PrivacyAndSecurity', AppPrivacyAndSecurityTab),\n m('settings', 'Telegram.GeneralSettingsViewController', AppGeneralSettingsTab),\n m('folder', 'AccountSettings.Filters', AppChatFoldersTab)\n ];\n\n const rows = b.map((item) => {\n const {icon, text: langPackKey, tabConstructor, getInitArgs} = item;\n return new Row({\n titleLangKey: langPackKey,\n icon,\n clickable: async() => {\n const args = item.args ? await item.args : [];\n const tab = this.slider.createTab(tabConstructor as any);\n tab.open(...args);\n\n if(tab instanceof SliderSuperTabEventable && getInitArgs) {\n tab.eventListener.addEventListener('destroyAfter', (promise) => {\n item.args = promise.then(() => getInitArgs() as any);\n });\n }\n },\n listenerSetter: this.listenerSetter\n });\n });\n\n const languageArgs = AppLanguageTab.getInitArgs();\n rows.push(\n this.devicesRow = new Row({\n titleLangKey: 'Devices',\n titleRightSecondary: ' ',\n icon: 'activesessions',\n clickable: async() => {\n if(!this.authorizations) {\n await this.updateActiveSessions();\n }\n\n const tab = this.slider.createTab(AppActiveSessionsTab);\n tab.authorizations = this.authorizations;\n tab.eventListener.addEventListener('destroy', () => {\n this.authorizations = undefined;\n this.updateActiveSessions(true);\n }, {once: true});\n tab.open();\n },\n listenerSetter: this.listenerSetter\n }),\n\n this.languageRow = new Row({\n titleLangKey: 'AccountSettings.Language',\n titleRightSecondary: i18n('LanguageName'),\n icon: 'language',\n clickable: () => {\n this.slider.createTab(AppLanguageTab).open(languageArgs);\n },\n listenerSetter: this.listenerSetter\n })\n );\n\n buttonsDiv.append(...rows.map((row) => row.container));\n\n // const profileSection = new SettingSection({fullWidth: true, noPaddingTop: true});\n // profileSection.content.append(this.profile.element);\n\n const buttonsSection = new SettingSection();\n buttonsSection.content.append(buttonsDiv);\n\n this.scrollable.append(this.profile.element/* profileSection.container */, buttonsSection.container);\n\n const getEditProfileArgs = () => {\n editProfileArgs = AppEditProfileTab.getInitArgs();\n };\n let editProfileArgs: ReturnType;\n attachClickEvent(this.buttons.edit, () => {\n const tab = this.slider.createTab(AppEditProfileTab);\n tab.open(editProfileArgs);\n }, {listenerSetter: this.listenerSetter});\n getEditProfileArgs();\n // this.listenerSetter.add(rootScope)('user_full_update', (userId) => {\n // if(rootScope.myId.toUserId() === userId) {\n // getEditProfileArgs();\n // }\n // });\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(rootScope.myId.toUserId() === userId) {\n getEditProfileArgs();\n }\n });\n\n lottieLoader.loadLottieWorkers();\n\n this.updateActiveSessions();\n\n (await fillPromise)();\n }\n\n private getAuthorizations(overwrite?: boolean) {\n if(this.getAuthorizationsPromise && !overwrite) return this.getAuthorizationsPromise;\n\n const promise = this.getAuthorizationsPromise = this.managers.apiManager.invokeApi('account.getAuthorizations')\n .finally(() => {\n if(this.getAuthorizationsPromise === promise) {\n this.getAuthorizationsPromise = undefined;\n }\n });\n\n return promise;\n }\n\n public updateActiveSessions(overwrite?: boolean) {\n return this.getAuthorizations(overwrite).then((auths) => {\n this.authorizations = auths.authorizations;\n this.devicesRow.titleRight.textContent = '' + this.authorizations.length;\n });\n }\n\n public onCloseAfterTimeout() {\n this.profile.destroy();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appSidebarLeft from '..';\nimport {InputFile} from '../../../layer';\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport AvatarEdit from '../../avatarEdit';\nimport AppAddMembersTab from './addMembers';\nimport {_i18n} from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nexport default class AppNewChannelTab extends SliderSuperTab {\n private uploadAvatar: () => Promise = null;\n\n private channelNameInputField: InputField;\n private channelDescriptionInputField: InputField;\n private nextBtn: HTMLButtonElement;\n private avatarEdit: AvatarEdit;\n\n public init() {\n this.container.classList.add('new-channel-container');\n this.setTitle('NewChannel');\n\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n });\n\n const section = new SettingSection({\n caption: 'Channel.DescriptionHolderDescrpiton'\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.channelNameInputField = new InputField({\n label: 'EnterChannelName',\n maxLength: 128\n });\n\n this.channelDescriptionInputField = new InputField({\n label: 'DescriptionOptionalPlaceholder',\n maxLength: 255\n });\n\n inputWrapper.append(this.channelNameInputField.container, this.channelDescriptionInputField.container);\n\n const onLengthChange = () => {\n this.nextBtn.classList.toggle('is-visible', !!this.channelNameInputField.value.length &&\n !this.channelNameInputField.input.classList.contains('error') &&\n !this.channelDescriptionInputField.input.classList.contains('error'));\n };\n\n this.channelNameInputField.input.addEventListener('input', onLengthChange);\n this.channelDescriptionInputField.input.addEventListener('input', onLengthChange);\n\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n\n attachClickEvent(this.nextBtn, () => {\n const title = this.channelNameInputField.value;\n const about = this.channelDescriptionInputField.value;\n\n this.nextBtn.disabled = true;\n this.managers.appChatsManager.createChannel({\n title,\n about,\n broadcast: true\n }).then((channelId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(channelId, inputFile);\n });\n }\n\n appImManager.setInnerPeer({peerId: channelId.toPeerId(true)});\n\n appSidebarLeft.removeTabFromHistory(this);\n this.slider.createTab(AppAddMembersTab).open({\n type: 'channel',\n skippable: true,\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo',\n takeOut: (peerIds) => {\n return this.managers.appChatsManager.inviteToChannel(channelId, peerIds);\n }\n });\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.content.append(this.nextBtn);\n section.content.append(this.avatarEdit.container, inputWrapper);\n this.scrollable.append(section.container);\n }\n\n public onCloseAfterTimeout() {\n this.avatarEdit.clear();\n this.uploadAvatar = null;\n this.channelNameInputField.value = '';\n this.channelDescriptionInputField.value = '';\n this.nextBtn.disabled = false;\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from '../inputField';\nimport PopupElement from '.';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport EditPeer from '../editPeer';\nimport {_i18n} from '../../lib/langPack';\nimport TelInputField from '../telInputField';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport {toastNew} from '../toast';\n\nexport default class PopupCreateContact extends PopupElement {\n constructor() {\n super('popup-create-contact popup-send-photo popup-new-media', {closable: true, withConfirm: 'Add', title: 'AddContactTitle'});\n this.construct();\n }\n\n private async construct() {\n attachClickEvent(this.btnConfirm, () => {\n const promise = this.managers.appUsersManager.importContact(nameInputField.value, lastNameInputField.value, telInputField.value);\n\n promise.then(() => {\n this.hide();\n }, (err) => {\n if(err.type === 'NO_USER') {\n toastNew({langPackKey: 'Contacts.PhoneNumber.NotRegistred'});\n editPeer.disabled = false;\n }\n });\n\n editPeer.lockWithPromise(promise);\n }, {listenerSetter: this.listenerSetter});\n\n const inputFields: InputField[] = [];\n const div = document.createElement('div');\n div.classList.add('name-fields');\n const nameInputField = new InputField({\n label: 'FirstName',\n name: 'create-contact-name',\n maxLength: 70,\n required: true\n });\n const lastNameInputField = new InputField({\n label: 'LastName',\n name: 'create-contact-lastname',\n maxLength: 70\n });\n const telInputField = new TelInputField({required: true});\n inputFields.push(nameInputField, lastNameInputField, telInputField);\n\n const onInput = () => {\n const name = nameInputField.value + ' ' + lastNameInputField.value;\n // const abbr = getAbbreviation(name);\n editPeer.avatarElem.peerTitle = name;\n editPeer.avatarElem.update();\n };\n\n this.listenerSetter.add(nameInputField.input)('input', onInput);\n this.listenerSetter.add(lastNameInputField.input)('input', onInput);\n\n telInputField.validate = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n const user = await this.managers.appUsersManager.getSelf();\n const formatted = formatPhoneNumber(user.phone);\n if(formatted.code) {\n telInputField.value = '+' + formatted.code.country_code;\n }\n\n const editPeer = new EditPeer({\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true,\n nextBtn: this.btnConfirm,\n avatarSize: 100\n });\n\n div.append(nameInputField.container, lastNameInputField.container, editPeer.avatarElem);\n this.container.append(div, telInputField.container);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport InputSearch from '../../inputSearch';\nimport {IS_MOBILE} from '../../../environment/userAgent';\nimport {canFocus} from '../../../helpers/dom/canFocus';\nimport windowSize from '../../../helpers/windowSize';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport PopupCreateContact from '../../popups/createContact';\nimport SortedUserList from '../../sortedUserList';\nimport {getMiddleware} from '../../../helpers/middleware';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport rootScope from '../../../lib/rootScope';\nimport PopupElement from '../../popups';\n\n// TODO: поиск по людям глобальный, если не нашло в контактах никого\n\nexport default class AppContactsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private middleware: ReturnType;\n private sortedUserList: SortedUserList;\n\n public init() {\n this.container.id = 'contacts-container';\n\n // this.list = appDialogsManager.createChatList(/* {avatarSize: 48, handheldsSize: 66} */);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, () => {\n PopupElement.createPopup(PopupCreateContact);\n }, {listenerSetter: this.listenerSetter});\n\n this.inputSearch = new InputSearch('Search', (value) => {\n this.openContacts(value);\n });\n\n this.listenerSetter.add(rootScope)('contacts_update', async(userId) => {\n const isContact = await this.managers.appUsersManager.isContact(userId);\n const peerId = userId.toPeerId();\n if(isContact) this.sortedUserList.add(peerId);\n else this.sortedUserList.delete(peerId);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.middleware = getMiddleware();\n\n this.openContacts();\n\n // preload contacts\n // appUsersManager.getContacts();\n }\n\n protected createList() {\n const sortedUserList = new SortedUserList({\n managers: this.managers\n });\n const list = sortedUserList.list;\n list.id = 'contacts';\n list.classList.add('contacts-container');\n appDialogsManager.setListClickListener(list, () => {\n this.close();\n }, undefined, true);\n return sortedUserList;\n }\n\n protected onClose() {\n this.middleware.clean();\n /* // need to clear, and left 1 page for smooth slide\n let pageCount = appPhotosManager.windowH / 56 * 1.25 | 0;\n (Array.from(this.list.children) as HTMLElement[]).slice(pageCount).forEach((el) => el.remove()); */\n }\n\n protected onOpenAfterTimeout() {\n if(IS_MOBILE || !canFocus(true)) return;\n this.inputSearch.input.focus();\n }\n\n public openContacts(query?: string) {\n this.middleware.clean();\n const middleware = this.middleware.get();\n this.scrollable.onScrolledBottom = null;\n this.scrollable.container.textContent = '';\n\n this.managers.appUsersManager.getContactsPeerIds(query, undefined, 'online').then((contacts) => {\n if(!middleware()) {\n return;\n }\n\n const sortedUserList = this.sortedUserList = this.createList();\n\n let renderPage = () => {\n const pageCount = windowSize.height / 56 * 1.25 | 0;\n const arr = contacts.splice(0, pageCount); // надо splice!\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n renderPage = undefined;\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n renderPage();\n this.scrollable.onScrolledBottom = () => {\n if(renderPage) {\n renderPage();\n } else {\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n replaceContent(this.scrollable.container, sortedUserList.list);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {SliderSuperTab} from '../../slider';\nimport {FOLDER_ID_ARCHIVE, REAL_FOLDER_ID} from '../../../lib/mtproto/mtproto_config';\n\nexport default class AppArchivedTab extends SliderSuperTab {\n private static filterId: REAL_FOLDER_ID = FOLDER_ID_ARCHIVE;\n private wasFilterId: number;\n\n public init() {\n this.wasFilterId = appDialogsManager.filterId;\n\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n this.header.classList.add('can-have-forum');\n this.content.classList.add('can-have-forum');\n\n if(!appDialogsManager.xds[AppArchivedTab.filterId]) {\n const {ul, scrollable} = appDialogsManager.l({\n title: undefined,\n id: AppArchivedTab.filterId,\n localId: FOLDER_ID_ARCHIVE\n });\n scrollable.container.append(ul);\n }\n\n const scrollable = appDialogsManager.xds[AppArchivedTab.filterId].scrollable;\n this.scrollable.container.replaceWith(scrollable.container);\n scrollable.attachBorderListeners(this.container);\n // ! DO NOT UNCOMMENT NEXT LINE - chats will stop loading on scroll after closing the tab\n // this.scrollable = scrollable;\n return appDialogsManager.setFilterIdAndChangeTab(AppArchivedTab.filterId).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n }\n\n // вообще, так делать нельзя, но нет времени чтобы переделать главный чатлист на слайд...\n onOpenAfterTimeout() {\n appDialogsManager.xds[this.wasFilterId].clear();\n }\n\n onClose() {\n this.scrollable.onAdditionalScroll = undefined;\n appDialogsManager.setFilterIdAndChangeTab(this.wasFilterId);\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.xds[AppArchivedTab.filterId].clear();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport ButtonCorner from '../../buttonCorner';\nimport AppNewGroupTab from './newGroup';\nimport {toast} from '../../toast';\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\nimport {i18n, join, _i18n} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport wrapSticker from '../../wrappers/sticker';\nimport SortedUserList from '../../sortedUserList';\nimport {PeerLocated, Update, Updates} from '../../../layer';\nimport {SettingChatListSection} from '..';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport confirmationPopup from '../../confirmationPopup';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport type LazyLoadQueue from '../../lazyLoadQueue';\n\nexport default class AppPeopleNearbyTab extends SliderSuperTab {\n private latestLocationSaved: {latitude: number, longitude: number, accuracy: number};\n private isLocationWatched: boolean = false;\n private errorCategory: HTMLElement;\n private retryBtn: HTMLButtonElement;\n private btnOptions: HTMLButtonElement;\n private menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[];\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected peopleSection: SettingChatListSection;\n protected chatsSection: SettingChatListSection;\n\n protected locatedPeers: Map;\n\n // public async init() {\n // this.container.classList.add('people-nearby-container');\n // this.setTitle('PeopleNearby');\n\n // this.errorCategory = document.createElement('div');\n // this.errorCategory.classList.add('text', 'hide', 'nearby-error');\n\n // this.retryBtn = ButtonCorner({icon: 'check'});\n\n // const emoji = '🧭';\n // const doc = await this.managers.appStickersManager.getAnimatedEmojiSticker(emoji);\n // const stickerContainer = document.createElement('div');\n // stickerContainer.classList.add('sticker-container');\n\n // if(doc) {\n // wrapSticker({\n // doc,\n // div: stickerContainer,\n // loop: false,\n // play: true,\n // width: 86,\n // height: 86,\n // emoji,\n // needUpscale: true\n // }).then(() => {\n // // this.animation = player;\n // });\n // } else {\n // stickerContainer.classList.add('media-sticker-wrapper');\n // }\n\n // const caption = document.createElement('div');\n // caption.classList.add('caption');\n // _i18n(caption, 'PeopleNearbyInfo2');\n\n // this.locatedPeers = new Map();\n\n // const m = () => {\n // const sortedUserList = new SortedUserList({\n // avatarSize: 42,\n // createChatListOptions: {\n // dialogSize: 48,\n // new: true\n // },\n // autonomous: false,\n // onUpdate: (element) => {\n // const peer = this.locatedPeers.get(element.id);\n // const elements: HTMLElement[] = [\n // this.parseDistance(peer.distance)\n // ];\n\n // if(!element.id.isUser()) {\n // elements.push(this.managers.appProfileManager.getChatMembersString(element.id.toChatId()));\n // }\n\n // element.dom.lastMessageSpan.textContent = '';\n // element.dom.lastMessageSpan.append(...join(elements, false));\n // },\n // getIndex: (element) => {\n // const peer = this.locatedPeers.get(element.id);\n // return 0x7FFFFFFF - peer.distance;\n // },\n // appUsersManager: this.managers.appUsersManager\n // });\n\n // appDialogsManager.setListClickListener(sortedUserList.list, undefined, undefined, false);\n\n // return sortedUserList;\n // };\n\n // const peopleSection = this.peopleSection = new SettingChatListSection({\n // name: 'PeopleNearbyHeader',\n // sortedList: m()\n // });\n\n // const chatsSection = this.chatsSection = new SettingChatListSection({\n // name: 'ChatsNearbyHeader',\n // sortedList: m()\n // });\n\n // const btnMakeVisible = peopleSection.makeButton({\n // text: 'MakeMyselfVisible',\n // icon: 'location'\n // });\n\n // const btnMakeInvisible = peopleSection.makeButton({\n // text: 'StopShowingMe',\n // icon: 'location'\n // });\n\n // const btnCreateGroup = chatsSection.makeButton({\n // text: 'NearbyCreateGroup',\n // icon: 'newgroup'\n // });\n\n // attachClickEvent(btnMakeVisible, () => {\n // confirmationPopup({\n // titleLangKey: 'MakeMyselfVisibleTitle',\n // descriptionLangKey: 'MakeMyselfVisibleInfo',\n // button: {\n // langKey: 'OK'\n // }\n // }).then(() => {\n // this.startWatching();\n // });\n // }, {listenerSetter: this.listenerSetter});\n\n // attachClickEvent(btnMakeInvisible, () => {\n // this.stopWatching();\n // }, {listenerSetter: this.listenerSetter});\n\n // attachClickEvent(btnCreateGroup, () => {\n // this.slider.createTab(AppNewGroupTab).open([], true);\n // }, {listenerSetter: this.listenerSetter});\n\n // btnMakeVisible.classList.add('primary');\n // btnMakeInvisible.classList.add('danger');\n // btnCreateGroup.classList.add('primary');\n\n // this.content.append(this.retryBtn);\n // this.scrollable.append(\n // stickerContainer,\n // caption,\n // peopleSection.container,\n // chatsSection.container,\n // this.errorCategory\n // );\n // }\n\n private parseDistance(distance: number) {\n if(rootScope.settings.distanceUnit === 'miles') {\n if(distance > 1609.34) {\n return i18n('MilesAway', [Math.round(distance / 1609)]);\n } else {\n return i18n('FootsAway', [Math.round(distance * 3.281)]);\n }\n } else {\n if(distance >= 1000) {\n return i18n('KMetersAway2', [distance / 1000]);\n } else {\n return i18n('MetersAway2', [distance]);\n }\n }\n }\n\n // public open() {\n // const result = super.open();\n // result.then(() => {\n // this.retryBtn.classList.remove('is-visible');\n // navigator.geolocation.getCurrentPosition((location) => {\n // this.latestLocationSaved = {\n // latitude: location.coords.latitude,\n // longitude: location.coords.longitude,\n // accuracy: location.coords.accuracy\n // };\n\n // console.log(this.latestLocationSaved);\n\n // this.managers.appUsersManager.getLocated(\n // location.coords.latitude,\n // location.coords.longitude,\n // location.coords.accuracy\n // ).then((response) => {\n // const update = (response as Updates.updates).updates[0] as Update.updatePeerLocated;\n // const peers = update.peers as PeerLocated.peerLocated[];\n // const orderedPeers = peers.sort((a, b) => a.distance - b.distance);\n // const groupsCounter = peers.filter((e) => e.peer._ == 'peerChannel').length;\n // const usersCounter = peers.filter((e) => e.peer._ != 'peerChannel').length;\n // orderedPeers?.forEach((peer) => {\n // const peerId = getPeerId(peer.peer);\n // const section = peerId.isUser() ? this.peopleSection : this.chatsSection;\n // this.locatedPeers.set(peerId, peer);\n // section.sortedList.add(peerId);\n // });\n\n // this.errorCategory.classList.toggle('hide', !!(usersCounter || groupsCounter));\n // this.errorCategory.innerHTML = 'No groups or channels found around you.';\n // });\n // }, (error) => {\n // this.errorCategory.classList.remove('hide');\n // this.retryBtn.classList.add('is-visible');\n // this.retryBtn.addEventListener('click', this.open);\n // if(error instanceof GeolocationPositionError) {\n // this.errorCategory.innerHTML = 'Location permission denied. Click below to retry.';\n // } else {\n // this.errorCategory.innerHTML = 'An error has occurred. Please retry later clicking the button below.';\n // }\n // });\n // });\n\n // return result;\n // }\n\n private startWatching() {\n if(!this.latestLocationSaved || this.isLocationWatched) return;\n this.isLocationWatched = true;\n\n toast('Your position is now being shared. Do not close the page or it will be suspended.');\n\n this.managers.appUsersManager.getLocated(\n this.latestLocationSaved.latitude,\n this.latestLocationSaved.longitude,\n this.latestLocationSaved.accuracy,\n true, // background parameter\n 0x7fffffff // self_expires parameter\n );\n\n navigator.geolocation.watchPosition((result) => {\n const isLongitudeDifferent = result.coords.longitude !== this.latestLocationSaved.longitude;\n const isLatitudeDifferent = result.coords.latitude !== this.latestLocationSaved.latitude;\n const distanceCheck = this.calculateDistance(\n result.coords.latitude, result.coords.longitude,\n this.latestLocationSaved.latitude, this.latestLocationSaved.longitude\n ) > 100;\n\n if((isLatitudeDifferent || isLongitudeDifferent) && distanceCheck) {\n this.managers.appUsersManager.getLocated(\n result.coords.latitude,\n result.coords.longitude,\n result.coords.accuracy,\n true, // background parameter\n 0x7fffffff // self_expires parameter\n );\n this.latestLocationSaved = {\n latitude: result.coords.latitude,\n longitude: result.coords.longitude,\n accuracy: result.coords.accuracy\n }\n }\n });\n }\n\n private stopWatching() {\n if(!this.isLocationWatched) return;\n this.isLocationWatched = false;\n toast('The sharing of your position has been stopped. You will no longer be visible to other users.');\n this.managers.appUsersManager.getLocated(\n 0, // latitude parameter\n 0, // longitude parameter\n 0, // accuracy parameter\n false, // background parameter\n 0 // self_expires parameter\n );\n }\n\n private calculateDistance(lat1: number, long1: number, lat2: number, long2: number) {\n const p = 0.017453292519943295; // Math.PI/180\n return (\n 12742 * Math.asin(\n Math.sqrt(\n (0.5 - Math.cos((lat2 - lat1) * p)) +\n (\n Math.cos(lat1 * p) * Math.cos(lat2 * p) *\n (1 - Math.cos((long2 - long1) * p)/2)\n )\n )\n )\n );\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport {SearchGroup} from '../appSearch';\nimport '../avatar';\nimport Scrollable, {ScrollableX} from '../scrollable';\nimport InputSearch from '../inputSearch';\nimport SidebarSlider from '../slider';\nimport TransitionSlider from '../transition';\nimport AppNewGroupTab from './tabs/newGroup';\nimport AppSearchSuper from '../appSearchSuper.';\nimport {DateData, fillTipDates} from '../../helpers/date';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport AppSettingsTab from './tabs/settings';\nimport AppNewChannelTab from './tabs/newChannel';\nimport AppContactsTab from './tabs/contacts';\nimport AppArchivedTab from './tabs/archivedTab';\nimport AppAddMembersTab from './tabs/addMembers';\nimport I18n, {FormatterArguments, i18n, i18n_, LangPackKey} from '../../lib/langPack';\nimport AppPeopleNearbyTab from './tabs/peopleNearby';\nimport {ButtonMenuItemOptions} from '../buttonMenu';\nimport CheckboxField from '../checkboxField';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport PeerTitle from '../peerTitle';\nimport App from '../../config/app';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport sessionStorage from '../../lib/sessionStorage';\nimport {attachClickEvent, CLICK_EVENT_NAME, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport ButtonIcon from '../buttonIcon';\nimport confirmationPopup from '../confirmationPopup';\nimport IS_GEOLOCATION_SUPPORTED from '../../environment/geolocationSupport';\nimport type SortedUserList from '../sortedUserList';\nimport Button, {ButtonOptions} from '../button';\nimport noop from '../../helpers/noop';\nimport ripple from '../ripple';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport AvatarElement from '../avatar';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport themeController from '../../helpers/themeController';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {DIALOG_LIST_ELEMENT_TAG} from '../../lib/appManagers/appDialogsManager';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport SettingSection, {SettingSectionOptions} from '../settingSection';\nimport {FOLDER_ID_ARCHIVE} from '../../lib/mtproto/mtproto_config';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {fastRaf} from '../../helpers/schedulers';\nimport {getInstallPrompt} from '../../helpers/dom/installPrompt';\n\nexport const LEFT_COLUMN_ACTIVE_CLASSNAME = 'is-left-column-shown';\n\nexport class AppSidebarLeft extends SidebarSlider {\n private toolsBtn: HTMLElement;\n private backBtn: HTMLButtonElement;\n // private searchInput = document.getElementById('global-search') as HTMLInputElement;\n private inputSearch: InputSearch;\n\n public archivedCount: HTMLSpanElement;\n public rect: DOMRect;\n\n private newBtnMenu: HTMLElement;\n\n // private log = logger('SL');\n\n private searchGroups: {[k in 'contacts' | 'globalContacts' | 'messages' | 'people' | 'recent']: SearchGroup} = {} as any;\n private searchSuper: AppSearchSuper;\n\n private updateBtn: HTMLElement;\n private hasUpdate: boolean;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-left') as HTMLDivElement,\n navigationType: 'left'\n });\n }\n\n construct(managers: AppManagers) {\n this.managers = managers;\n // this._selectTab(0); // make first tab as default\n\n this.inputSearch = new InputSearch('Search');\n const sidebarHeader = this.sidebarEl.querySelector('.item-main .sidebar-header');\n sidebarHeader.append(this.inputSearch.container);\n\n const onNewGroupClick = () => {\n this.createTab(AppAddMembersTab).open({\n type: 'chat',\n skippable: false,\n takeOut: (peerIds) => this.createTab(AppNewGroupTab).open(peerIds),\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n };\n\n const onContactsClick = () => {\n this.createTab(AppContactsTab).open();\n };\n\n // this.toolsBtn = this.sidebarEl.querySelector('.sidebar-tools-button') as HTMLButtonElement;\n this.backBtn = this.sidebarEl.querySelector('.sidebar-back-button') as HTMLButtonElement;\n\n const btnArchive: typeof menuButtons[0] = {\n icon: 'archive',\n text: 'ArchivedChats',\n onClick: () => {\n this.createTab(AppArchivedTab).open();\n },\n verify: async() => {\n const folder = await this.managers.dialogsStorage.getFolderDialogs(FOLDER_ID_ARCHIVE, false);\n return !!folder.length || !(await this.managers.dialogsStorage.isDialogsLoaded(FOLDER_ID_ARCHIVE));\n }\n };\n\n const themeCheckboxField = new CheckboxField({\n toggle: true,\n checked: themeController.getTheme().name === 'night'\n });\n themeCheckboxField.input.addEventListener('change', async() => {\n themeController.switchTheme(themeCheckboxField.input.checked ? 'night' : 'day');\n });\n\n rootScope.addEventListener('theme_change', () => {\n themeCheckboxField.setValueSilently(themeController.getTheme().name === 'night');\n });\n\n const menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean | Promise})[] = [{\n icon: 'savedmessages',\n text: 'SavedMessages',\n onClick: () => {\n setTimeout(() => { // menu doesn't close if no timeout (lol)\n appImManager.setPeer({\n peerId: appImManager.myId\n });\n }, 0);\n }\n }, btnArchive, {\n icon: 'user',\n text: 'Contacts',\n onClick: onContactsClick\n }, IS_GEOLOCATION_SUPPORTED ? {\n icon: 'group',\n text: 'PeopleNearby',\n onClick: () => {\n this.createTab(AppPeopleNearbyTab).open();\n }\n } : undefined, {\n icon: 'settings',\n text: 'Settings',\n onClick: () => {\n this.createTab(AppSettingsTab).open();\n }\n }, {\n icon: 'darkmode',\n text: 'DarkMode',\n onClick: () => {\n\n },\n checkboxField: themeCheckboxField\n }, {\n icon: 'animations',\n text: 'Animations',\n onClick: () => {\n\n },\n checkboxField: new CheckboxField({\n toggle: true,\n checked: true,\n stateKey: 'settings.animationsEnabled'\n })\n }, {\n icon: 'help',\n text: 'TelegramFeatures',\n onClick: () => {\n const url = I18n.format('TelegramFeaturesUrl', true);\n appImManager.openUrl(url);\n }\n }, {\n icon: 'bug',\n text: 'ReportBug',\n onClick: () => {\n const a = document.createElement('a');\n a.target = '_blank';\n a.href = 'https://bugs.telegram.org/?tag_ids=40&sort=time';\n document.body.append(a);\n a.click();\n setTimeout(() => {\n a.remove();\n }, 0);\n }\n }, {\n icon: 'char z',\n text: 'ChatList.Menu.SwitchTo.Z',\n onClick: () => {\n Promise.all([\n sessionStorage.set({kz_version: 'Z'}),\n sessionStorage.delete('tgme_sync')\n ]).then(() => {\n location.href = 'https://web.telegram.org/z/';\n });\n },\n verify: () => App.isMainDomain\n }, {\n icon: 'char w',\n text: 'ChatList.Menu.SwitchTo.Webogram',\n onClick: () => {\n sessionStorage.delete('tgme_sync').then(() => {\n location.href = 'https://web.telegram.org/?legacy=1';\n });\n },\n verify: () => App.isMainDomain\n }, {\n icon: 'download',\n text: 'PWA.Install',\n onClick: () => {\n const installPrompt = getInstallPrompt();\n installPrompt?.();\n },\n verify: () => !!getInstallPrompt()\n }];\n\n const filteredButtons = menuButtons.filter(Boolean);\n\n this.toolsBtn = ButtonMenuToggle({\n direction: 'bottom-right',\n buttons: filteredButtons,\n onOpen: (e, btnMenu) => {\n const btnMenuFooter = document.createElement('a');\n btnMenuFooter.href = 'https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md';\n btnMenuFooter.target = '_blank';\n btnMenuFooter.rel = 'noopener noreferrer';\n btnMenuFooter.classList.add('btn-menu-footer');\n btnMenuFooter.addEventListener(CLICK_EVENT_NAME, (e) => {\n e.stopPropagation();\n contextMenuController.close();\n });\n const t = document.createElement('span');\n t.classList.add('btn-menu-footer-text');\n t.innerHTML = 'Telegram Web' + App.suffix + ' '/* ' alpha ' */ + App.versionFull;\n btnMenuFooter.append(t);\n btnMenu.classList.add('has-footer');\n btnMenu.append(btnMenuFooter);\n\n btnArchive.element?.append(this.archivedCount);\n }\n });\n this.toolsBtn.classList.remove('tgico-more');\n this.toolsBtn.classList.add('sidebar-tools-button', 'is-visible');\n\n this.backBtn.parentElement.insertBefore(this.toolsBtn, this.backBtn);\n\n this.newBtnMenu = ButtonMenuToggle({\n direction: 'top-left',\n buttons: [{\n icon: 'newchannel',\n text: 'NewChannel',\n onClick: () => {\n this.createTab(AppNewChannelTab).open();\n }\n }, {\n icon: 'newgroup',\n text: 'NewGroup',\n onClick: onNewGroupClick\n }, {\n icon: 'newprivate',\n text: 'NewPrivateChat',\n onClick: onContactsClick\n }]\n });\n this.newBtnMenu.className = 'btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon';\n this.newBtnMenu.insertAdjacentHTML('afterbegin', `\n \n \n `);\n this.newBtnMenu.id = 'new-menu';\n sidebarHeader.nextElementSibling.append(this.newBtnMenu);\n\n this.updateBtn = document.createElement('div');\n this.updateBtn.className = 'btn-circle rp btn-corner z-depth-1 btn-update is-hidden';\n ripple(this.updateBtn);\n this.updateBtn.append(i18n('Update'));\n\n attachClickEvent(this.updateBtn, () => {\n if(this.updateBtn.classList.contains('is-hidden')) {\n return;\n }\n\n location.reload();\n });\n\n sidebarHeader.nextElementSibling.append(this.updateBtn);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === FOLDER_ID_ARCHIVE) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadPeerIds.size;\n this.archivedCount.textContent = '' + formatNumber(count, 1);\n this.archivedCount.classList.toggle('hide', !count);\n }\n });\n\n this.managers.appUsersManager.getTopPeers('correspondents');\n\n // Focus search input by pressing Escape\n const navigationItem: NavigationItem = {\n type: 'global-search-focus',\n onPop: () => {\n setTimeout(() => {\n this.inputSearch.input.focus();\n }, 0);\n\n return false;\n },\n noHistory: true\n };\n appNavigationController.pushItem(navigationItem);\n\n apiManagerProxy.getState().then(() => {\n const CHECK_UPDATE_INTERVAL = 1800e3;\n const checkUpdateInterval = setInterval(() => {\n fetch('version', {cache: 'no-cache'})\n .then((res) => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then((text) => {\n if(text !== App.versionFull) {\n this.hasUpdate = true;\n clearInterval(checkUpdateInterval);\n\n if(!this.newBtnMenu.classList.contains('is-hidden')) {\n this.updateBtn.classList.remove('is-hidden');\n }\n }\n })\n .catch(noop);\n }, CHECK_UPDATE_INTERVAL);\n });\n\n const onResize = () => {\n const rect = this.rect = this.tabsContainer.getBoundingClientRect();\n document.documentElement.style.setProperty('--left-column-width', rect.width + 'px');\n };\n\n fastRaf(onResize);\n mediaSizes.addEventListener('resize', onResize);\n }\n\n private initSearch() {\n const searchContainer = this.sidebarEl.querySelector('#search-container') as HTMLDivElement;\n\n const scrollable = new Scrollable(searchContainer);\n\n const close = () => {\n // setTimeout(() => {\n simulateClickEvent(this.backBtn);\n // }, 0);\n };\n\n this.searchGroups = {\n contacts: new SearchGroup('SearchAllChatsShort', 'contacts', undefined, undefined, undefined, undefined, close),\n globalContacts: new SearchGroup('GlobalSearch', 'contacts', undefined, undefined, undefined, undefined, close),\n messages: new SearchGroup('SearchMessages', 'messages'),\n people: new SearchGroup(false, 'contacts', true, 'search-group-people', true, false, close, true),\n recent: new SearchGroup('Recent', 'contacts', true, 'search-group-recent', true, true, close)\n };\n\n const searchSuper = this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'FilterChats',\n type: 'chats'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }],\n scrollable,\n searchGroups: this.searchGroups,\n asChatList: true,\n hideEmptyTabs: false,\n showSender: true,\n managers: this.managers\n });\n\n searchContainer.prepend(searchSuper.nav.parentElement.parentElement);\n scrollable.container.append(searchSuper.container);\n\n const resetSearch = () => {\n searchSuper.setQuery({\n peerId: ''.toPeerId(),\n folderId: 0\n });\n searchSuper.selectTab(0);\n searchSuper.load(true);\n };\n\n resetSearch();\n\n const pickedElements: HTMLElement[] = [];\n let selectedPeerId: PeerId = ''.toPeerId();\n let selectedMinDate = 0;\n let selectedMaxDate = 0;\n const updatePicked = () => {\n // (this.inputSearch.input as HTMLInputElement).placeholder = pickedElements.length ? 'Search' : 'Telegram Search';\n this.inputSearch.container.classList.toggle('is-picked-twice', pickedElements.length === 2);\n this.inputSearch.container.classList.toggle('is-picked', !!pickedElements.length);\n\n if(pickedElements.length) {\n this.inputSearch.input.style.setProperty('--paddingLeft', (pickedElements[pickedElements.length - 1].getBoundingClientRect().right - this.inputSearch.input.getBoundingClientRect().left) + 'px');\n } else {\n this.inputSearch.input.style.removeProperty('--paddingLeft');\n }\n };\n\n const helper = document.createElement('div');\n helper.classList.add('search-helper');\n helper.addEventListener('click', (e) => {\n const target = findUpClassName(e.target, 'selector-user');\n if(!target) {\n return;\n }\n\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n const [_, minDate, maxDate] = key.split('_');\n selectedMinDate = +minDate;\n selectedMaxDate = +maxDate;\n } else {\n selectedPeerId = key.toPeerId();\n }\n\n target.addEventListener('click', () => {\n unselectEntity(target);\n });\n\n this.inputSearch.container.append(target);\n this.inputSearch.onChange(this.inputSearch.value = '');\n pickedElements.push(target);\n updatePicked();\n });\n\n searchSuper.nav.parentElement.append(helper);\n\n const renderEntity = (key: PeerId | string, title?: string | HTMLElement) => {\n const div = document.createElement('div');\n div.classList.add('selector-user'/* , 'scale-in' */);\n\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-32');\n avatarEl.isDialog = true;\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId()}).element;\n }\n\n avatarEl.updateWithOptions({peerId: key as PeerId});\n } else {\n avatarEl.classList.add('tgico-calendarfilter');\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n return div;\n };\n\n const unselectEntity = (target: HTMLElement) => {\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n selectedMinDate = selectedMaxDate = 0;\n } else {\n selectedPeerId = ''.toPeerId();\n }\n\n target.remove();\n indexOfAndSplice(pickedElements, target);\n\n setTimeout(() => {\n updatePicked();\n this.inputSearch.onChange(this.inputSearch.value);\n }, 0);\n };\n\n this.inputSearch.onClear = () => {\n pickedElements.forEach((el) => {\n unselectEntity(el);\n });\n };\n\n this.inputSearch.onChange = (value) => {\n searchSuper.cleanupHTML();\n searchSuper.setQuery({\n peerId: selectedPeerId,\n folderId: selectedPeerId ? undefined : 0,\n query: value,\n minDate: selectedMinDate,\n maxDate: selectedMaxDate\n });\n searchSuper.load(true);\n\n helper.innerHTML = '';\n searchSuper.nav.classList.remove('hide');\n if(!value) {\n }\n\n if(!selectedPeerId && value.trim()) {\n const middleware = searchSuper.middleware.get();\n Promise.all([\n // appMessagesManager.getConversationsAll(value).then((dialogs) => dialogs.map((d) => d.peerId)),\n this.managers.dialogsStorage.getDialogs({query: value}).then(({dialogs}) => dialogs.map((d) => d.peerId)),\n this.managers.appUsersManager.getContactsPeerIds(value, true)\n ]).then((results) => {\n if(!middleware()) return;\n const peerIds = new Set(results[0].concat(results[1]));\n\n peerIds.forEach((peerId) => {\n helper.append(renderEntity(peerId));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n // console.log('got peerIds by value:', value, [...peerIds]);\n });\n }\n\n if(!selectedMinDate && value.trim()) {\n const dates: DateData[] = [];\n fillTipDates(value, dates);\n dates.forEach((dateData) => {\n helper.append(renderEntity('date_' + dateData.minDate + '_' + dateData.maxDate, dateData.title));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n }\n };\n\n searchSuper.tabs.inputMessagesFilterEmpty.addEventListener('mousedown', (e) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG) as HTMLElement;\n if(!target) {\n return;\n }\n\n const searchGroup = findUpClassName(target, 'search-group');\n if(!searchGroup || searchGroup.classList.contains('search-group-recent') || searchGroup.classList.contains('search-group-people')) {\n return;\n }\n\n const peerId = target.getAttribute('data-peer-id').toPeerId();\n this.managers.appUsersManager.pushRecentSearch(peerId);\n }, {capture: true});\n\n const peopleContainer = document.createElement('div');\n peopleContainer.classList.add('search-group-scrollable');\n peopleContainer.append(this.searchGroups.people.list);\n this.searchGroups.people.container.append(peopleContainer);\n const peopleScrollable = new ScrollableX(peopleContainer);\n\n let first = true;\n let hideNewBtnMenuTimeout: number;\n // const transition = Transition.bind(null, searchContainer.parentElement, 150);\n const transition = TransitionSlider({\n content: searchContainer.parentElement,\n type: 'zoom-fade',\n transitionTime: 150,\n onTransitionEnd: (id) => {\n if(hideNewBtnMenuTimeout) clearTimeout(hideNewBtnMenuTimeout);\n\n if(id === 0 && !first) {\n searchSuper.selectTab(0, false);\n this.inputSearch.onClearClick();\n hideNewBtnMenuTimeout = window.setTimeout(() => {\n hideNewBtnMenuTimeout = 0;\n this.newBtnMenu.classList.remove('is-hidden');\n this.hasUpdate && this.updateBtn.classList.remove('is-hidden');\n }, 150);\n }\n\n first = false;\n }\n });\n\n transition(0);\n\n const activeClassName = 'is-visible';\n const onFocus = () => {\n this.toolsBtn.classList.remove(activeClassName);\n this.backBtn.classList.add(activeClassName);\n this.newBtnMenu.classList.add('is-hidden');\n this.updateBtn.classList.add('is-hidden');\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', true);\n\n const navigationType: NavigationItem['type'] = 'global-search';\n if(!IS_MOBILE_SAFARI && !appNavigationController.findItemByType(navigationType)) {\n appNavigationController.pushItem({\n onPop: () => {\n close();\n },\n type: navigationType\n });\n }\n\n transition(1);\n };\n\n this.inputSearch.input.addEventListener('focus', onFocus);\n onFocus();\n\n attachClickEvent(this.backBtn, (e) => {\n this.toolsBtn.classList.add(activeClassName);\n this.backBtn.classList.remove(activeClassName);\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', false);\n\n appNavigationController.removeByType('global-search');\n\n transition(0);\n });\n\n const clearRecentSearchBtn = ButtonIcon('close');\n this.searchGroups.recent.nameEl.append(clearRecentSearchBtn);\n clearRecentSearchBtn.addEventListener('click', () => {\n confirmationPopup({\n descriptionLangKey: 'Search.Confirm.ClearHistory',\n button: {\n langKey: 'ClearButton',\n isDanger: true\n }\n }).then(() => {\n return this.managers.appUsersManager.clearRecentSearch().then(() => {\n this.searchGroups.recent.clear();\n });\n });\n });\n }\n}\n\nexport class SettingChatListSection extends SettingSection {\n public sortedList: SortedUserList;\n\n constructor(options: SettingSectionOptions & {sortedList: SortedUserList}) {\n super(options);\n\n this.sortedList = options.sortedList;\n\n this.content.append(this.sortedList.list);\n }\n\n public makeButton(options: ButtonOptions) {\n const button = Button('folder-category-button btn btn-primary btn-transparent', options);\n if(this.title) this.content.insertBefore(button, this.title.nextSibling);\n else this.content.prepend(button);\n return button;\n }\n}\n\nconst appSidebarLeft = new AppSidebarLeft();\nMOUNT_CLASS_TO.appSidebarLeft = appSidebarLeft;\nexport default appSidebarLeft;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport AppSelectPeers from '../../appSelectPeers';\nimport {setButtonLoader} from '../../putPreloader';\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\n\nexport default class AppAddMembersTab extends SliderSuperTab {\n private nextBtn: HTMLButtonElement;\n private selector: AppSelectPeers;\n private peerType: 'channel' | 'chat' | 'privacy';\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\n private skippable: boolean;\n\n public init(options: {\n title: LangPackKey,\n placeholder: LangPackKey,\n type: AppAddMembersTab['peerType'],\n takeOut?: AppAddMembersTab['takeOut'],\n skippable: boolean,\n selectedPeerIds?: PeerId[]\n }) {\n this.container.classList.add('add-members-container');\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n this.content.append(this.nextBtn);\n this.scrollable.container.remove();\n\n this.nextBtn.addEventListener('click', () => {\n const peerIds = this.selector.getSelected().map((sel) => sel.toPeerId());\n const result = this.takeOut(peerIds);\n\n if(this.skippable) {\n this.close();\n } else if(result instanceof Promise) {\n this.attachToPromise(result);\n } else if(result === undefined) {\n this.close();\n }\n });\n\n //\n this.setTitle(options.title);\n this.peerType = options.type;\n this.takeOut = options.takeOut;\n this.skippable = options.skippable;\n\n const isPrivacy = this.peerType === 'privacy';\n this.selector = new AppSelectPeers({\n appendTo: this.content,\n onChange: this.skippable ? null : (length) => {\n this.nextBtn.classList.toggle('is-visible', !!length);\n },\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\n placeholder: options.placeholder,\n exceptSelf: isPrivacy,\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined,\n managers: this.managers,\n design: 'square'\n });\n\n if(options.selectedPeerIds) {\n this.selector.addInitial(options.selectedPeerIds);\n }\n\n this.nextBtn.classList.add('tgico-arrow_next');\n this.nextBtn.innerHTML = '';\n this.nextBtn.disabled = false;\n this.nextBtn.classList.toggle('is-visible', this.skippable);\n }\n\n public attachToPromise(promise: Promise) {\n const removeLoader = setButtonLoader(this.nextBtn, 'arrow_next');\n\n promise.then(() => {\n this.close();\n }, () => {\n removeLoader();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {renderImageFromUrlPromise} from './dom/renderImageFromUrl';\n\nexport function averageColorFromCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n\n const pixel = new Array(4).fill(0);\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\n const pixelsLength = pixels.length / 4;\n for(let i = 0; i < pixels.length; i += 4) {\n // const alphaPixel = pixels[i + 3];\n pixel[0] += pixels[i]/* * (alphaPixel / 255) */;\n pixel[1] += pixels[i + 1]/* * (alphaPixel / 255) */;\n pixel[2] += pixels[i + 2]/* * (alphaPixel / 255) */;\n pixel[3] += pixels[i + 3];\n }\n\n const outPixel = new Uint8ClampedArray(4);\n outPixel[0] = pixel[0] / pixelsLength;\n outPixel[1] = pixel[1] / pixelsLength;\n outPixel[2] = pixel[2] / pixelsLength;\n outPixel[3] = pixel[3] / pixelsLength;\n // outPixel[3] = 255;\n return outPixel;\n}\n\nexport function averageColorFromImageSource(imageSource: CanvasImageSource, width: number, height: number) {\n const canvas = document.createElement('canvas');\n const ratio = width / height;\n const DIMENSIONS = 50;\n if(ratio === 1) {\n canvas.width = DIMENSIONS;\n canvas.height = canvas.width / ratio;\n } else if(ratio > 1) {\n canvas.height = DIMENSIONS;\n canvas.width = canvas.height / ratio;\n } else {\n canvas.width = canvas.height = DIMENSIONS;\n }\n\n const context = canvas.getContext('2d');\n context.drawImage(imageSource, 0, 0, width, height, 0, 0, canvas.width, canvas.height);\n return averageColorFromCanvas(canvas);\n}\n\nexport function averageColor(imageUrl: string) {\n const img = document.createElement('img');\n return renderImageFromUrlPromise(img, imageUrl, false).then(() => {\n return averageColorFromImageSource(img, img.naturalWidth, img.naturalHeight);\n });\n};\n","import {rgbaToHsla} from './color';\n\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\n if(s > 0) {\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\n }\n l = Math.max(0, l * .65);\n\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\n return hsla;\n}\n","import {ColorHsla, ColorRgba, hexaToHsla, hslaToRgba, rgbaToHexa as rgbaToHexa, rgbaToHsla} from '../helpers/color';\nimport attachGrabListeners from '../helpers/dom/attachGrabListeners';\nimport clamp from '../helpers/number/clamp';\nimport InputField, {InputState} from './inputField';\n\nexport type ColorPickerColor = {\n hsl: string;\n rgb: string;\n hex: string;\n hsla: string;\n rgba: string;\n hexa: string;\n rgbaArray: ColorRgba;\n};\n\nexport default class ColorPicker {\n private static BASE_CLASS = 'color-picker';\n public container: HTMLElement;\n\n private boxRect: DOMRect;\n // private boxDraggerRect: DOMRect;\n private hueRect: DOMRect;\n // private hueDraggerRect: DOMRect;\n\n private hue = 0;\n private saturation = 100;\n private lightness = 50;\n private alpha = 1;\n private elements: {\n box: SVGSVGElement,\n boxDragger: SVGSVGElement,\n sliders: HTMLElement,\n hue: SVGSVGElement,\n hueDragger: SVGSVGElement,\n saturation: SVGLinearGradientElement,\n } = {} as any;\n private hexInputField: InputField;\n private rgbInputField: InputField;\n public onChange: (color: ReturnType) => void;\n\n constructor() {\n this.container = document.createElement('div');\n this.container.classList.add(ColorPicker.BASE_CLASS);\n\n const html = `\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 this.container.innerHTML = html;\n\n this.elements.box = this.container.firstElementChild as any;\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\n\n this.elements.sliders = this.elements.box.nextElementSibling as any;\n\n this.elements.hue = this.elements.sliders.firstElementChild as any;\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\n\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\n\n const inputs = document.createElement('div');\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\n this.container.append(inputs);\n\n this.hexInputField.input.addEventListener('input', () => {\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\n\n const match = value.match(/([a-fA-F\\d]+)/);\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\n\n value = '#' + value;\n this.hexInputField.setValueSilently(value);\n\n if(valid) {\n this.setColor(value, false, true);\n }\n });\n\n // patched https://stackoverflow.com/a/34029238/6758968\n const rgbRegExp = /^(?:rgb)?\\(?([01]?\\d\\d?|2[0-4]\\d|25[0-5])(?:\\W+)([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\W+(?:([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\)?)$/;\n this.rgbInputField.input.addEventListener('input', () => {\n const match = this.rgbInputField.value.match(rgbRegExp);\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\n\n if(match) {\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\n }\n });\n\n this.attachBoxListeners();\n this.attachHueListeners();\n }\n\n private onGrabStart = () => {\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\n };\n\n private onGrabEnd = () => {\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\n };\n\n private attachBoxListeners() {\n attachGrabListeners(this.elements.box as any, () => {\n this.onGrabStart();\n this.boxRect = this.elements.box.getBoundingClientRect();\n // this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\n }, (pos) => {\n this.saturationHandler(pos.x, pos.y);\n }, () => {\n this.onGrabEnd();\n });\n }\n\n private attachHueListeners() {\n attachGrabListeners(this.elements.hue as any, () => {\n this.onGrabStart();\n this.hueRect = this.elements.hue.getBoundingClientRect();\n // this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\n }, (pos) => {\n this.hueHandler(pos.x);\n }, () => {\n this.onGrabEnd();\n });\n }\n\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\n if(color === undefined) { // * set to red\n color = {\n h: 0,\n s: 100,\n l: 50,\n a: 1\n };\n } else if(typeof(color) === 'string') {\n if(color[0] === '#') {\n color = hexaToHsla(color);\n } else {\n const rgb = color.match(/[.?\\d]+/g);\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\n }\n }\n\n // Set box\n this.boxRect = this.elements.box.getBoundingClientRect();\n\n const boxX = this.boxRect.width / 100 * color.s;\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\n const boxY = this.boxRect.height / 100 * percentY;\n\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\n\n // Set hue\n this.hueRect = this.elements.hue.getBoundingClientRect();\n\n const percentHue = color.h / 360;\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\n\n this.hueHandler(hueX, false);\n\n // Set values\n this.hue = color.h;\n this.saturation = color.s;\n this.lightness = color.l;\n this.alpha = color.a;\n\n this.updatePicker(updateHexInput, updateRgbInput);\n };\n\n public getCurrentColor(): ColorPickerColor {\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\n const hexa = rgbaToHexa(rgbaArray);\n const hex = hexa.slice(0, -2);\n\n return {\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\n hex: hex,\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\n hexa: hexa,\n rgbaArray: rgbaArray\n };\n }\n\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\n const color = this.getCurrentColor();\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\n\n if(updateHexInput) {\n this.hexInputField.setValueSilently(color.hex);\n this.hexInputField.setState(InputState.Neutral);\n }\n\n if(updateRgbInput) {\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\n this.rgbInputField.setState(InputState.Neutral);\n }\n\n if(this.onChange) {\n this.onChange(color);\n }\n }\n\n private hueHandler(pageX: number, update = true) {\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\n\n const percents = eventX / this.hueRect.width;\n this.hue = Math.round(360 * percents);\n\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\n\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\n\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\n\n if(update) {\n this.updatePicker();\n }\n }\n\n private saturationHandler(pageX: number, pageY: number, update = true) {\n const maxX = this.boxRect.width;\n const maxY = this.boxRect.height;\n\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\n\n const posX = eventX / maxX * 100;\n const posY = eventY / maxY * 100;\n\n const boxDragger = this.elements.boxDragger;\n boxDragger.setAttributeNS(null, 'x', posX + '%');\n boxDragger.setAttributeNS(null, 'y', posY + '%');\n\n const saturation = clamp(posX, 0, 100);\n\n const lightnessX = 100 - saturation / 2;\n const lightnessY = 100 - clamp(posY, 0, 100);\n\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\n\n this.saturation = saturation;\n this.lightness = lightness;\n\n if(update) {\n this.updatePicker();\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppTheme} from '../../../config/state';\nimport {hexaToRgba} from '../../../helpers/color';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport highlightningColor from '../../../helpers/highlightningColor';\nimport throttle from '../../../helpers/schedulers/throttle';\nimport themeController from '../../../helpers/themeController';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport rootScope from '../../../lib/rootScope';\nimport ColorPicker, {ColorPickerColor} from '../../colorPicker';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTab} from '../../slider';\nimport {WallPaper} from '../../../layer';\n\nexport default class AppBackgroundColorTab extends SliderSuperTab {\n private colorPicker: ColorPicker;\n private grid: HTMLElement;\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\n private theme: AppTheme;\n\n init() {\n this.container.classList.add('background-container', 'background-color-container');\n this.setTitle('SetColor');\n\n this.theme = themeController.getTheme();\n\n const section = new SettingSection({});\n this.colorPicker = new ColorPicker();\n\n section.content.append(this.colorPicker.container);\n\n this.scrollable.append(section.container);\n\n const gridSection = new SettingSection({});\n\n const grid = this.grid = document.createElement('div');\n grid.classList.add('grid');\n\n const colors = [\n '#E6EBEE',\n '#B2CEE1',\n '#008DD0',\n '#C6E7CB',\n '#C4E1A6',\n '#60B16E',\n '#CCD0AF',\n '#A6A997',\n '#7A7072',\n '#FDD7AF',\n '#FDB76E',\n '#DD8851'\n ];\n\n colors.forEach((color) => {\n const item = document.createElement('div');\n item.classList.add('grid-item');\n item.dataset.color = color.toLowerCase();\n\n // * need for transform scale\n const media = document.createElement('div');\n media.classList.add('grid-item-media');\n media.style.backgroundColor = color;\n\n item.append(media);\n grid.append(item);\n });\n\n attachClickEvent(grid, (e) => {\n const target = findUpClassName(e.target, 'grid-item');\n if(!target || target.classList.contains('active')) {\n return;\n }\n\n const color = target.dataset.color;\n if(!color) {\n return;\n }\n\n this.applyColor(color);\n }, {listenerSetter: this.listenerSetter});\n\n gridSection.content.append(grid);\n this.scrollable.append(gridSection.container);\n\n this.applyColor = throttle(this._applyColor, 16, true);\n }\n\n private setActive() {\n const active = this.grid.querySelector('.active');\n const background = this.theme.settings;\n const wallPaper = background.wallpaper;\n const color = wallPaper.settings.background_color;\n const target = color ? this.grid.querySelector(`.grid-item[data-color=\"${color}\"]`) : null;\n if(active === target) {\n return;\n }\n\n if(active) {\n active.classList.remove('active');\n }\n\n if(target) {\n target.classList.add('active');\n }\n }\n\n private _applyColor = (hex: string, updateColorPicker = true) => {\n if(updateColorPicker) {\n this.colorPicker.setColor(hex);\n } else {\n const rgba = hexaToRgba(hex);\n const settings = this.theme.settings;\n const hsla = highlightningColor(rgba);\n\n const wallPaper: WallPaper.wallPaperNoFile = {\n _: 'wallPaperNoFile',\n id: 0,\n pFlags: {},\n settings: {\n _: 'wallPaperSettings',\n background_color: parseInt(hex.slice(1), 16)\n }\n };\n\n settings.wallpaper = wallPaper;\n settings.highlightningColor = hsla;\n\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n appImManager.applyCurrentTheme(undefined, undefined, true);\n this.setActive();\n }\n };\n\n private onColorChange = (color: ColorPickerColor) => {\n this.applyColor(color.hex, false);\n };\n\n onOpen() {\n setTimeout(() => {\n const settings = this.theme.settings;\n const color = settings?.wallpaper?.settings?.background_color;\n\n const isColored = !!color && settings.wallpaper._ === 'wallPaperNoFile';\n\n // * set active if type is color\n if(isColored) {\n this.colorPicker.onChange = this.onColorChange;\n }\n\n this.colorPicker.setColor((color && '#' + color.toString(16)) || '#cccccc');\n\n if(!isColored) {\n this.colorPicker.onChange = this.onColorChange;\n }\n }, 0);\n }\n\n onCloseAfterTimeout() {\n this.colorPicker.onChange = undefined;\n this.colorPicker = undefined;\n\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {averageColor, averageColorFromCanvas} from '../../../helpers/averageColor';\nimport blur from '../../../helpers/blur';\nimport deferredPromise, {CancellablePromise} from '../../../helpers/cancellablePromise';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport highlightningColor from '../../../helpers/highlightningColor';\nimport copy from '../../../helpers/object/copy';\nimport sequentialDom from '../../../helpers/sequentialDom';\nimport ChatBackgroundGradientRenderer from '../../chat/gradientRenderer';\nimport {Document, PhotoSize, WallPaper, WebDocument} from '../../../layer';\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport appDownloadManager, {AppDownloadManager, DownloadBlob} from '../../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport rootScope from '../../../lib/rootScope';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport ProgressivePreloader from '../../preloader';\nimport {SliderSuperTab} from '../../slider';\nimport AppBackgroundColorTab from './backgroundColor';\nimport choosePhotoSize from '../../../lib/appManagers/utils/photos/choosePhotoSize';\nimport {STATE_INIT, AppTheme} from '../../../config/state';\nimport themeController from '../../../helpers/themeController';\nimport requestFile from '../../../helpers/files/requestFile';\nimport {renderImageFromUrlPromise} from '../../../helpers/dom/renderImageFromUrl';\nimport scaleMediaElement from '../../../helpers/canvas/scaleMediaElement';\nimport {MediaSize} from '../../../helpers/mediaSize';\nimport wrapPhoto from '../../wrappers/photo';\nimport {CreateRowFromCheckboxField} from '../../row';\nimport {generateSection} from '../../settingSection';\nimport {getColorsFromWallPaper} from '../../../helpers/color';\n\nexport default class AppBackgroundTab extends SliderSuperTab {\n public static tempId = 0;\n private grid: HTMLElement;\n private clicked: Set = new Set();\n private blurCheckboxField: CheckboxField;\n\n private wallPapersByElement: Map = new Map();\n private elementsByKey: Map = new Map();\n\n public static getInitArgs() {\n return {\n backgrounds: rootScope.managers.appThemesManager.getWallPapers()\n };\n }\n\n private get theme() {\n return themeController.getTheme();\n }\n\n public init(p: ReturnType = AppBackgroundTab.getInitArgs()) {\n this.container.classList.add('background-container', 'background-image-container');\n this.setTitle('ChatBackground');\n\n {\n const container = generateSection(this.scrollable);\n\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\n\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(colorButton, () => {\n this.slider.createTab(AppBackgroundColorTab).open();\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\n\n const wallPaper = this.theme.settings?.wallpaper;\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\n text: 'ChatBackground.Blur',\n name: 'blur',\n checked: (wallPaper as WallPaper.wallPaper)?.settings?.pFlags?.blur\n });\n\n this.listenerSetter.add(blurCheckboxField.input)('change', async() => {\n this.theme.settings.wallpaper.settings.pFlags.blur = blurCheckboxField.input.checked || undefined;\n await this.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n // * wait for animation end\n setTimeout(() => {\n const active = grid.querySelector('.active') as HTMLElement;\n if(!active) return;\n\n const wallpaper = this.wallPapersByElement.get(active);\n if((wallpaper as WallPaper.wallPaper).pFlags.pattern || wallpaper._ === 'wallPaperNoFile') {\n return;\n }\n\n AppBackgroundTab.setBackgroundDocument(wallpaper);\n }, 100);\n });\n\n container.append(\n uploadButton,\n colorButton,\n resetButton,\n CreateRowFromCheckboxField(blurCheckboxField).container\n );\n }\n\n rootScope.addEventListener('background_change', this.setActive);\n\n const promise = p.backgrounds.then((wallPapers) => {\n const promises = wallPapers.map((wallPaper) => {\n return this.addWallPaper(wallPaper);\n });\n\n return Promise.all(promises);\n });\n\n const gridContainer = generateSection(this.scrollable);\n const grid = this.grid = document.createElement('div');\n grid.classList.add('grid');\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\n gridContainer.append(grid);\n\n return promise;\n }\n\n private onUploadClick = () => {\n requestFile('image/x-png,image/png,image/jpeg').then(async(file) => {\n if(file.name.endsWith('.png')) {\n const img = document.createElement('img');\n const url = URL.createObjectURL(file);\n await renderImageFromUrlPromise(img, url, false);\n const mimeType = 'image/jpeg';\n const {blob} = await scaleMediaElement({media: img, size: new MediaSize(img.naturalWidth, img.naturalHeight), mimeType});\n file = new File([blob], file.name.replace(/\\.png$/, '.jpg'), {type: mimeType});\n }\n\n const wallPaper = await this.managers.appDocsManager.prepareWallPaperUpload(file);\n const uploadPromise = this.managers.appDocsManager.uploadWallPaper(wallPaper.id);\n const uploadDeferred: CancellablePromise = appDownloadManager.getNewDeferredForUpload(file.name, uploadPromise);\n\n const deferred = deferredPromise();\n deferred.addNotifyListener = uploadDeferred.addNotifyListener;\n deferred.cancel = uploadDeferred.cancel;\n\n uploadDeferred.then((wallPaper) => {\n this.clicked.delete(key);\n this.elementsByKey.delete(key);\n this.wallPapersByElement.set(container, wallPaper);\n const newKey = this.getWallPaperKey(wallPaper);\n this.elementsByKey.set(newKey, container);\n\n AppBackgroundTab.setBackgroundDocument(wallPaper).then(deferred.resolve, deferred.reject);\n }, deferred.reject);\n\n const key = this.getWallPaperKey(wallPaper);\n deferred.catch(() => {\n container.remove();\n });\n\n const preloader = new ProgressivePreloader({\n isUpload: true,\n cancelable: true,\n tryAgainOnFail: false\n });\n\n const {container} = await this.addWallPaper(wallPaper, false);\n this.clicked.add(key);\n\n preloader.attach(container, false, deferred);\n });\n };\n\n private onResetClick = () => {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === this.theme.name);\n if(defaultTheme) {\n ++AppBackgroundTab.tempId;\n this.theme.settings = copy(defaultTheme.settings);\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\n appImManager.applyCurrentTheme(undefined, undefined, true);\n this.blurCheckboxField.setValueSilently(this.theme.settings?.wallpaper?.settings?.pFlags?.blur);\n }\n };\n\n private getWallPaperKey(wallPaper: WallPaper) {\n return '' + wallPaper.id;\n }\n\n private getWallPaperKeyFromTheme(theme: AppTheme) {\n return '' + (this.getWallPaperKey(theme.settings?.wallpaper) || '');\n }\n\n public static addWallPaper(\n wallPaper: WallPaper,\n container = document.createElement('div')\n ) {\n const colors = getColorsFromWallPaper(wallPaper);\n const hasFile = wallPaper._ === 'wallPaper';\n if((hasFile && wallPaper.pFlags.pattern && !colors)/* ||\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0 */) {\n return;\n }\n\n const isDark = !!wallPaper.pFlags.dark;\n\n let doc: WebDocument.webDocumentNoProxy | Document.document = hasFile ? wallPaper.document as Document.document : undefined;\n if(hasFile && !doc) {\n doc = {\n _: 'webDocumentNoProxy',\n attributes: [],\n size: 100000,\n url: 'assets/img/pattern.svg',\n w: 1440,\n h: 2960,\n mime_type: 'image/svg+xml'\n };\n }\n\n container.classList.add('background-item');\n container.dataset.id = '' + wallPaper.id;\n\n const media = document.createElement('div');\n media.classList.add('background-item-media');\n\n const loadPromises: Promise[] = [];\n let wrapped: ReturnType, size: ReturnType;\n if(hasFile) {\n size = choosePhotoSize(doc, 200, 200);\n wrapped = wrapPhoto({\n photo: doc,\n message: null,\n container: media,\n withoutPreloader: true,\n size,\n noFadeIn: wallPaper.pFlags.pattern\n });\n\n if(wallPaper.pFlags.pattern) {\n media.classList.add('is-pattern');\n }\n\n const promise = wrapped.then(async({loadPromises, images}) => {\n await loadPromises.thumb || loadPromises.full;\n return images;\n }).then((images) => {\n if(wallPaper.pFlags.pattern) {\n if(isDark) {\n images.full.style.display = 'none';\n if(images.thumb) {\n images.thumb.style.display = 'none';\n }\n } else if(wallPaper.settings?.intensity) {\n images.full.style.opacity = '' + Math.abs(wallPaper.settings.intensity) / 100;\n }\n }\n\n return sequentialDom.mutate(() => {\n container.append(media);\n });\n });\n\n loadPromises.push(promise);\n } else {\n container.append(media);\n }\n\n if(wallPaper.settings?.background_color) {\n const {canvas} = ChatBackgroundGradientRenderer.create(colors);\n canvas.classList.add('background-colors-canvas');\n\n if(isDark && hasFile) {\n const promise = wrapped.then(({loadPromises}) => {\n return loadPromises.full.then(async() => {\n const cacheContext = await rootScope.managers.thumbsStorage.getCacheContext(doc, size.type);\n canvas.style.webkitMaskImage = `url(${cacheContext.url})`;\n canvas.style.opacity = '' + (wallPaper.pFlags.dark ? 100 + wallPaper.settings.intensity : wallPaper.settings.intensity) / 100;\n media.append(canvas);\n });\n });\n\n loadPromises.push(promise);\n } else {\n media.append(canvas);\n }\n }\n\n return {\n container,\n media,\n loadPromise: Promise.all(loadPromises)\n };\n }\n\n private addWallPaper(wallPaper: WallPaper, append = true) {\n const result = AppBackgroundTab.addWallPaper(wallPaper);\n if(result) {\n const {container, media} = result;\n container.classList.add('grid-item');\n media.classList.add('grid-item-media');\n\n const key = this.getWallPaperKey(wallPaper);\n this.wallPapersByElement.set(container, wallPaper);\n this.elementsByKey.set(key, container);\n\n if(this.getWallPaperKeyFromTheme(this.theme) === key) {\n container.classList.add('active');\n }\n\n this.grid[append ? 'append' : 'prepend'](container);\n }\n\n return result && result.loadPromise.then(() => result);\n }\n\n private onGridClick = (e: MouseEvent | TouchEvent) => {\n const target = findUpClassName(e.target, 'grid-item') as HTMLElement;\n if(!target) return;\n\n const wallpaper = this.wallPapersByElement.get(target);\n if(wallpaper._ === 'wallPaperNoFile') {\n AppBackgroundTab.setBackgroundDocument(wallpaper);\n return;\n }\n\n const key = this.getWallPaperKey(wallpaper);\n if(this.clicked.has(key)) return;\n this.clicked.add(key);\n\n const doc = wallpaper.document as MyDocument;\n const preloader = new ProgressivePreloader({\n cancelable: true,\n tryAgainOnFail: false\n });\n\n const load = async() => {\n const promise = AppBackgroundTab.setBackgroundDocument(wallpaper);\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\n if(!cacheContext.url || this.theme.settings?.wallpaper?.settings?.pFlags?.blur) {\n preloader.attach(target, true, promise);\n }\n };\n\n preloader.construct();\n\n attachClickEvent(target, (e) => {\n if(preloader.preloader.parentElement) {\n preloader.onClick(e);\n preloader.detach();\n } else {\n load();\n }\n }, {listenerSetter: this.listenerSetter});\n\n load();\n\n // console.log(doc);\n };\n\n public static setBackgroundDocument = (wallPaper: WallPaper, themeSettings?: AppTheme['settings']) => {\n const _tempId = ++this.tempId;\n const middleware = () => _tempId === this.tempId;\n\n const doc = (wallPaper as WallPaper.wallPaper).document as MyDocument;\n const deferred = deferredPromise();\n let download: Promise | ReturnType;\n if(doc) {\n download = appDownloadManager.downloadMediaURL({\n media: doc,\n queueId: appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0\n });\n deferred.addNotifyListener = download.addNotifyListener;\n deferred.cancel = download.cancel;\n } else {\n download = Promise.resolve();\n }\n\n const saveToCache = (slug: string, url: string) => {\n fetch(url).then((response) => {\n appImManager.cacheStorage.save('backgrounds/' + slug, response);\n });\n };\n\n download.then(async() => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n const hadSettings = !!themeSettings;\n themeSettings ??= themeController.getTheme().settings;\n const onReady = (url?: string) => {\n let getPixelPromise: Promise;\n const backgroundColor = getColorsFromWallPaper(wallPaper);\n if(url && !backgroundColor) {\n getPixelPromise = averageColor(url);\n } else {\n const {canvas} = ChatBackgroundGradientRenderer.create(backgroundColor);\n getPixelPromise = Promise.resolve(averageColorFromCanvas(canvas));\n }\n\n const slug = (wallPaper as WallPaper.wallPaper).slug ?? '';\n Promise.all([\n getPixelPromise,\n slug && saveToCache(slug, url)\n ]).then(([pixel]) => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n const hsla = highlightningColor(Array.from(pixel) as any);\n\n themeSettings.wallpaper = wallPaper;\n themeSettings.highlightningColor = hsla;\n\n if(!hadSettings) {\n rootScope.managers.appStateManager.pushToState('settings', rootScope.settings);\n }\n\n appImManager.applyCurrentTheme(slug, url, true).then(deferred.resolve);\n });\n };\n\n if(!doc) {\n onReady();\n return;\n }\n\n const cacheContext = await rootScope.managers.thumbsStorage.getCacheContext(doc);\n if(themeSettings.wallpaper?.settings?.pFlags?.blur) {\n setTimeout(() => {\n const {canvas, promise} = blur(cacheContext.url, 12, 4);\n promise.then(() => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n onReady(canvas.toDataURL());\n });\n }, 200);\n } else if(middleware()) {\n onReady(cacheContext.url);\n }\n });\n\n return deferred;\n };\n\n private setActive = () => {\n const active = this.grid.querySelector('.active');\n const target = this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));\n if(active === target) {\n return;\n }\n\n if(active) {\n active.classList.remove('active');\n }\n\n if(target) {\n target.classList.add('active');\n }\n };\n}\n","export default function requestFile(accept?: string) {\n const input = document.createElement('input');\n input.type = 'file';\n input.style.display = 'none';\n\n if(accept) {\n input.accept = accept;\n }\n\n document.body.append(input);\n\n const promise = new Promise((resolve, reject) => {\n input.addEventListener('change', (e: any) => {\n const file: File = e.target.files[0];\n if(!file) {\n reject('NO_FILE_SELECTED');\n return;\n }\n\n resolve(file);\n }, {once: true});\n }).finally(() => {\n input.remove();\n });\n\n input.click();\n\n return promise;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport AppSelectPeers from '../../appSelectPeers';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\nimport ButtonIcon from '../../buttonIcon';\nimport CheckboxField from '../../checkboxField';\nimport Button from '../../button';\nimport AppEditFolderTab from './editFolder';\nimport I18n, {i18n, LangPackKey, _i18n, join} from '../../../lib/langPack';\nimport {toast} from '../../toast';\nimport copy from '../../../helpers/object/copy';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\nimport rootScope from '../../../lib/rootScope';\nimport {MTAppConfig} from '../../../lib/mtproto/appConfig';\nimport {attachClickEvent, simulateClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nexport default class AppIncludedChatsTab extends SliderSuperTab {\n private editFolderTab: AppEditFolderTab;\n private confirmBtn: HTMLElement;\n\n private selector: AppSelectPeers;\n private type: 'included' | 'excluded';\n private filter: DialogFilter;\n private originalFilter: DialogFilter;\n\n private dialogsByFilters: Map>;\n private limit: number;\n\n public init(\n filter: DialogFilter,\n type: 'included' | 'excluded',\n editFolderTab: AppIncludedChatsTab['editFolderTab']\n ) {\n this.originalFilter = filter;\n this.filter = copy(this.originalFilter);\n this.type = type;\n this.editFolderTab = editFolderTab;\n\n this.content.remove();\n this.container.classList.add('included-chatlist-container');\n this.confirmBtn = ButtonIcon('check btn-confirm blue', {noRipple: true});\n this.confirmBtn.style.display = 'none';\n\n this.header.append(this.confirmBtn);\n\n attachClickEvent(this.confirmBtn, async() => {\n const selected = this.selector.getSelected();\n\n // this.filter.pFlags = {};\n\n if(this.type === 'included') {\n for(const key in this.filter.pFlags) {\n if(key.indexOf('exclude_') === 0) {\n continue;\n }\n\n // @ts-ignore\n delete this.filter.pFlags[key];\n }\n } else {\n for(const key in this.filter.pFlags) {\n if(key.indexOf('exclude_') !== 0) {\n continue;\n }\n\n // @ts-ignore\n delete this.filter.pFlags[key];\n }\n }\n\n const peerIds: PeerId[] = [];\n for(const key of selected) {\n if(key.isPeerId()) {\n peerIds.push(key.toPeerId());\n } else {\n // @ts-ignore\n this.filter.pFlags[key] = true;\n }\n }\n\n let cmp: (peerId: PeerId) => boolean;\n if(this.type === 'included') {\n cmp = (peerId) => peerIds.includes(peerId);\n } else {\n cmp = (peerId) => !peerIds.includes(peerId);\n }\n\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\n if(!cmp(peerId)) {\n this.filter.pinnedPeerIds.splice(idx, 1);\n this.filter.pinned_peers.splice(idx, 1);\n }\n });\n\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\n forEachReverse(this.filter[other], (peerId, idx) => {\n if(peerIds.includes(peerId)) {\n this.filter[other].splice(idx, 1);\n this.filter[otherLegacy].splice(idx, 1);\n }\n });\n\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = await Promise.all(peerIds.map((peerId) => this.managers.appPeersManager.getInputPeerById(peerId)));\n // this.filter.pinned_peers = this.filter.pinned_peers.filter((peerId) => this.filter.include_peers.includes(peerId));\n\n this.editFolderTab.setFilter(this.filter, false);\n this.close();\n }, {listenerSetter: this.listenerSetter});\n\n const onAppConfig = (appConfig: MTAppConfig) => {\n this.limit = rootScope.premium ? appConfig.dialog_filters_chats_limit_premium : appConfig.dialog_filters_chats_limit_default;\n };\n\n this.listenerSetter.add(rootScope)('app_config', onAppConfig);\n\n this.dialogsByFilters = new Map();\n return Promise.all([\n this.managers.filtersStorage.getDialogFilters().then(async(filters) => {\n await Promise.all(filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).map(async(filter) => {\n const dialogs = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\n const peerIds = dialogs.map((d) => d.peerId);\n this.dialogsByFilters.set(filter, new Set(peerIds));\n }));\n }),\n\n this.managers.apiManager.getAppConfig().then((appConfig) => {\n onAppConfig(appConfig);\n })\n ]);\n }\n\n checkbox(selected?: boolean) {\n const checkboxField = new CheckboxField({\n round: true\n });\n if(selected) {\n checkboxField.input.checked = selected;\n }\n\n return checkboxField.label;\n }\n\n renderResults = async(peerIds: PeerId[]) => {\n // const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\n\n await this.managers.appUsersManager.getContacts();\n peerIds.forEach((peerId) => {\n // if(other.includes(peerId)) return;\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.selector.scrollable,\n rippleEnabled: true,\n avatarSize: 'abitbigger'\n });\n\n const selected = this.selector.selected.has(peerId);\n dom.containerEl.append(this.checkbox(selected));\n // if(selected) dom.listEl.classList.add('active');\n\n const foundInFilters: HTMLElement[] = [];\n this.dialogsByFilters.forEach((dialogs, filter) => {\n if(dialogs.has(peerId)) {\n const span = document.createElement('span');\n setInnerHTML(span, wrapEmojiText(filter.title));\n foundInFilters.push(span);\n }\n });\n\n const joined = join(foundInFilters, false);\n joined.forEach((el) => {\n dom.lastMessageSpan.append(el);\n });\n });\n };\n\n onOpen() {\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\n\n const filter = this.filter;\n\n const categoriesSection = new SettingSection({\n noDelimiter: true,\n name: 'FilterChatTypes'\n });\n\n categoriesSection.container.classList.add('folder-categories');\n\n let details: {[flag: string]: {ico: string, text: LangPackKey}};\n if(this.type === 'excluded') {\n details = {\n exclude_muted: {ico: 'mute', text: 'ChatList.Filter.MutedChats'},\n exclude_archived: {ico: 'archive', text: 'ChatList.Filter.Archive'},\n exclude_read: {ico: 'readchats', text: 'ChatList.Filter.ReadChats'}\n };\n } else {\n details = {\n contacts: {ico: 'newprivate', text: 'ChatList.Filter.Contacts'},\n non_contacts: {ico: 'noncontacts', text: 'ChatList.Filter.NonContacts'},\n groups: {ico: 'group', text: 'ChatList.Filter.Groups'},\n broadcasts: {ico: 'newchannel', text: 'ChatList.Filter.Channels'},\n bots: {ico: 'bots', text: 'ChatList.Filter.Bots'}\n };\n }\n\n const f = document.createDocumentFragment();\n for(const key in details) {\n const button = Button('btn-primary btn-transparent folder-category-button', {icon: details[key].ico, text: details[key].text});\n button.dataset.peerId = key;\n button.append(this.checkbox());\n f.append(button);\n }\n categoriesSection.content.append(f);\n\n // ///////////////\n\n const selectedPeers = (this.type === 'included' ? filter.includePeerIds : filter.excludePeerIds).slice();\n\n this.selector = new AppSelectPeers({\n appendTo: this.container,\n onChange: this.onSelectChange,\n peerType: ['dialogs'],\n renderResultsFunc: this.renderResults,\n placeholder: 'Search',\n sectionNameLangPackKey: 'FilterChats',\n managers: this.managers\n });\n this.selector.selected = new Set(selectedPeers);\n\n let addedInitial = false;\n const _add = this.selector.add.bind(this.selector);\n this.selector.add = (peerId, title, scroll) => {\n if(this.selector.selected.size >= this.limit && addedInitial && !details[peerId]) {\n const el: HTMLInputElement = this.selector.list.querySelector(`[data-peer-id=\"${peerId}\"] [type=\"checkbox\"]`);\n if(el) {\n setTimeout(() => {\n el.checked = false;\n }, 0);\n }\n\n const str = I18n.format(this.type === 'excluded' ? 'ChatList.Filter.Exclude.LimitReached': 'ChatList.Filter.Include.LimitReached', true);\n toast(str);\n return;\n }\n\n const div = _add(peerId, details[peerId] ? i18n(details[peerId].text) : undefined, scroll);\n if(details[peerId]) {\n div.querySelector('avatar-element').classList.add('tgico-' + details[peerId].ico);\n }\n return div;\n };\n\n this.selector.scrollable.container.append(categoriesSection.container, this.selector.scrollable.container.lastElementChild);\n\n this.selector.addInitial(selectedPeers);\n addedInitial = true;\n\n for(const flag in filter.pFlags) {\n // @ts-ignore\n if(details.hasOwnProperty(flag) && !!filter.pFlags[flag]) {\n simulateClickEvent(categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement);\n }\n }\n }\n\n onSelectChange = (length: number) => {\n // const changed = !deepEqual(this.filter, this.originalFilter);\n if(this.type === 'included') {\n this.confirmBtn.style.display = length ? '' : 'none';\n }\n };\n\n onCloseAfterTimeout() {\n if(this.selector) {\n this.selector.container.remove();\n this.selector = null;\n }\n\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\nimport {SliderSuperTab} from '../../slider';\nimport {toast} from '../../toast';\nimport InputField from '../../inputField';\nimport ButtonIcon from '../../buttonIcon';\nimport ButtonMenuToggle from '../../buttonMenuToggle';\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\nimport Button from '../../button';\nimport AppIncludedChatsTab from './includedChats';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport wrapDraftText from '../../../lib/richTextProcessor/wrapDraftText';\nimport filterAsync from '../../../helpers/array/filterAsync';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nconst MAX_FOLDER_NAME_LENGTH = 12;\n\nexport default class AppEditFolderTab extends SliderSuperTab {\n private caption: HTMLElement;\n private stickerContainer: HTMLElement;\n\n private confirmBtn: HTMLElement;\n private menuBtn: HTMLElement;\n private nameInputField: InputField;\n\n private includePeerIds: SettingSection;\n private excludePeerIds: SettingSection;\n private flags: {[k in 'contacts' | 'non_contacts' | 'groups' | 'broadcasts' | 'bots' | 'exclude_muted' | 'exclude_archived' | 'exclude_read']: HTMLElement} = {} as any;\n\n private animation: RLottiePlayer;\n private filter: DialogFilter;\n private originalFilter: DialogFilter;\n\n private type: 'edit' | 'create';\n private loadAnimationPromise: ReturnType;\n\n public static getInitArgs() {\n return {\n animationData: lottieLoader.loadAnimationFromURLManually('Folders_2')\n };\n }\n\n public init(p: ReturnType = AppEditFolderTab.getInitArgs()) {\n this.container.classList.add('edit-folder-container');\n this.caption = document.createElement('div');\n this.caption.classList.add('caption');\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add('sticker-container');\n\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\n let deleting = false;\n const deleteFolderButton: ButtonMenuItemOptions = {\n icon: 'delete danger',\n text: 'FilterMenuDelete',\n onClick: () => {\n new PopupPeer('filter-delete', {\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\n buttons: [{\n langKey: 'Delete',\n callback: () => {\n if(deleting) {\n return;\n }\n\n deleting = true;\n\n this.managers.filtersStorage.updateDialogFilter(this.filter, true).then((bool) => {\n this.close();\n }).finally(() => {\n deleting = false;\n });\n },\n isDanger: true\n }]\n }).show();\n }\n };\n this.menuBtn = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [deleteFolderButton]\n });\n this.menuBtn.classList.add('hide');\n\n this.header.append(this.confirmBtn, this.menuBtn);\n\n const inputSection = new SettingSection({});\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.nameInputField = new InputField({\n label: 'FilterNameHint',\n maxLength: MAX_FOLDER_NAME_LENGTH\n });\n\n inputWrapper.append(this.nameInputField.container);\n inputSection.content.append(inputWrapper);\n\n const generateList = (className: string, h2Text: LangPackKey, buttons: {icon: string, name?: string, withRipple?: true, text: LangPackKey}[], to: any) => {\n const section = new SettingSection({\n name: h2Text,\n noDelimiter: true\n });\n\n section.container.classList.add('folder-list', className);\n\n const categories = section.generateContentElement();\n categories.classList.add('folder-categories');\n\n buttons.forEach((o) => {\n const button = Button('folder-category-button btn btn-primary btn-transparent', {\n icon: o.icon,\n text: o.text,\n noRipple: o.withRipple ? undefined : true\n });\n\n if(o.name) {\n to[o.name] = button;\n }\n\n categories.append(button);\n });\n\n return section;\n };\n\n this.includePeerIds = generateList('folder-list-included', 'FilterInclude', [{\n icon: 'add primary',\n text: 'ChatList.Filter.Include.AddChat',\n withRipple: true\n }, {\n text: 'ChatList.Filter.Contacts',\n icon: 'newprivate',\n name: 'contacts'\n }, {\n text: 'ChatList.Filter.NonContacts',\n icon: 'noncontacts',\n name: 'non_contacts'\n }, {\n text: 'ChatList.Filter.Groups',\n icon: 'group',\n name: 'groups'\n }, {\n text: 'ChatList.Filter.Channels',\n icon: 'channel',\n name: 'broadcasts'\n }, {\n text: 'ChatList.Filter.Bots',\n icon: 'bots',\n name: 'bots'\n }], this.flags);\n\n this.excludePeerIds = generateList('folder-list-excluded', 'FilterExclude', [{\n icon: 'minus primary',\n text: 'ChatList.Filter.Exclude.AddChat',\n withRipple: true\n }, {\n text: 'ChatList.Filter.MutedChats',\n icon: 'mute',\n name: 'exclude_muted'\n }, {\n text: 'ChatList.Filter.Archive',\n icon: 'archive',\n name: 'exclude_archived'\n }, {\n text: 'ChatList.Filter.ReadChats',\n icon: 'readchats',\n name: 'exclude_read'\n }], this.flags);\n\n this.scrollable.append(this.stickerContainer, this.caption, inputSection.container, this.includePeerIds.container, this.excludePeerIds.container);\n\n const includedFlagsContainer = this.includePeerIds.container.querySelector('.folder-categories');\n const excludedFlagsContainer = this.excludePeerIds.container.querySelector('.folder-categories');\n\n attachClickEvent(includedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'included', this);\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(excludedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'excluded', this);\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.confirmBtn, () => {\n if(this.nameInputField.input.classList.contains('error')) {\n return;\n }\n\n if(!this.nameInputField.value.trim()) {\n this.nameInputField.input.classList.add('error');\n return;\n }\n\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\n include += this.filter.include_peers.length;\n\n if(!include) {\n toast('Please choose at least one chat for this folder.');\n return;\n }\n\n this.confirmBtn.setAttribute('disabled', 'true');\n\n let promise: Promise;\n if(!this.filter.id) {\n promise = this.managers.filtersStorage.createDialogFilter(this.filter);\n } else {\n promise = this.managers.filtersStorage.updateDialogFilter(this.filter);\n }\n\n promise.then((bool) => {\n this.close();\n }).catch((err) => {\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\n toast('Sorry, you can\\'t create more folders.');\n } else {\n console.error('updateDialogFilter error:', err);\n }\n }).finally(() => {\n this.confirmBtn.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(this.nameInputField.input)('input', () => {\n this.filter.title = this.nameInputField.value;\n this.editCheckForChange();\n });\n\n const reloadMissingPromises: Promise[] = this.type === 'edit' ? [\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'pinned_peers'),\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'include_peers'),\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'exclude_peers')\n ] : [];\n\n return Promise.all([\n this.loadAnimationPromise = p.animationData.then(async(cb) => {\n const player = await cb({\n container: this.stickerContainer,\n loop: false,\n autoplay: false,\n width: 86,\n height: 86\n });\n\n this.animation = player;\n\n return lottieLoader.waitForFirstFrame(player);\n }),\n\n ...reloadMissingPromises\n ]).then(() => {\n if(this.type === 'edit') {\n this.setFilter(this.originalFilter, true);\n this.onEditOpen();\n } else {\n this.setInitFilter();\n this.onCreateOpen();\n }\n });\n }\n\n onOpenAfterTimeout() {\n this.loadAnimationPromise.then(() => {\n this.animation.autoplay = true;\n this.animation.play();\n });\n }\n\n private onCreateOpen() {\n // this.caption.style.display = '';\n this.setTitle('FilterNew');\n this.menuBtn.classList.add('hide');\n this.confirmBtn.classList.remove('hide');\n\n for(const flag in this.flags) {\n // @ts-ignore\n this.flags[flag].style.display = 'none';\n }\n }\n\n private onEditOpen() {\n // this.caption.style.display = 'none';\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\n\n if(this.type === 'edit') {\n this.menuBtn.classList.remove('hide');\n this.confirmBtn.classList.add('hide');\n }\n\n const filter = this.filter;\n this.nameInputField.value = wrapDraftText(filter.title);\n\n for(const flag in this.flags) {\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\n }\n\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(async(key) => {\n const section = this[key];\n const ul = appDialogsManager.createChatList({ignoreClick: true});\n\n let peers = filter[key];\n\n // filter peers where we're kicked\n const hasPeer = async(peerId: PeerId) => {\n return !!(await this.managers.appMessagesManager.getDialogOnly(peerId)) || (peerId.isUser() ? (await this.managers.appUsersManager.getUser(peerId.toUserId()))._ === 'user' : false);\n };\n\n const filtered = await filterAsync(peers, (peerId) => hasPeer(peerId));\n peers.length = 0;\n peers.push(...filtered);\n\n peers = peers.slice();\n\n const renderMore = async(_length: number) => {\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\n const peerId = peers.shift();\n if(peerId.isUser() ? false : !(await this.managers.appMessagesManager.getDialogOnly(peerId))) {\n continue;\n }\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: ul,\n rippleEnabled: false,\n meAsSaved: true,\n avatarSize: 'small'\n });\n dom.lastMessageSpan.parentElement.remove();\n }\n\n if(peers.length) {\n showMore.lastElementChild.replaceWith(i18n('FilterShowMoreChats', [peers.length]));\n } else if(showMore) {\n showMore.remove();\n }\n };\n\n section.generateContentElement().append(ul);\n\n let showMore: HTMLElement;\n if(peers.length) {\n const content = section.generateContentElement();\n showMore = Button('folder-category-button btn btn-primary btn-transparent', {icon: 'down'});\n showMore.classList.add('load-more', 'rp-overflow');\n attachClickEvent(showMore, () => renderMore(20), {listenerSetter: this.listenerSetter});\n showMore.append(i18n('FilterShowMoreChats', [peers.length]));\n\n content.append(showMore);\n }\n\n renderMore(4);\n });\n }\n\n editCheckForChange() {\n if(this.type === 'edit') {\n const changed = !deepEqual(this.originalFilter, this.filter);\n this.confirmBtn.classList.toggle('hide', !changed);\n this.menuBtn.classList.toggle('hide', changed);\n }\n };\n\n setFilter(filter: DialogFilter, firstTime: boolean) {\n if(this.container) {\n // cleanup\n Array.from(this.container.querySelectorAll('ul, .load-more')).forEach((el) => el.remove());\n }\n\n if(firstTime) {\n this.originalFilter = filter;\n this.filter = copy(filter);\n } else {\n this.filter = filter;\n this.onEditOpen();\n this.editCheckForChange();\n }\n }\n\n public setInitFilter(filter?: DialogFilter) {\n if(filter === undefined) {\n this.setFilter({\n _: 'dialogFilter',\n id: 0,\n title: '',\n pFlags: {},\n pinned_peers: [],\n include_peers: [],\n exclude_peers: [],\n pinnedPeerIds: [],\n includePeerIds: [],\n excludePeerIds: []\n }, true);\n this.type = 'create';\n } else {\n this.setFilter(filter, true);\n this.type = 'edit';\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport EditPeer from '../../editPeer';\nimport {UsernameInputField} from '../../usernameInputField';\nimport {i18n, i18n_, LangPackKey} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport rootScope from '../../../lib/rootScope';\nimport setBlankToAnchor from '../../../lib/richTextProcessor/setBlankToAnchor';\nimport getPeerEditableUsername from '../../../lib/appManagers/utils/peers/getPeerEditableUsername';\nimport SettingSection, {generateSection} from '../../settingSection';\nimport UsernamesSection from '../../usernamesSection';\n\n// TODO: аватарка не поменяется в этой вкладке после изменения почему-то (если поставить в другом клиенте, и потом тут проверить, для этого ещё вышел в чатлист)\n\nexport function purchaseUsernameCaption() {\n const p = document.createElement('div');\n const FRAGMENT_USERNAME_URL = 'https://fragment.com/username/';\n const a = setBlankToAnchor(document.createElement('a'));\n const purchaseText = i18n('Username.Purchase', [a]);\n purchaseText.classList.add('username-purchase-help');\n p.append(\n purchaseText,\n document.createElement('br'),\n document.createElement('br')\n );\n p.classList.add('hide');\n\n return {\n element: p,\n setUsername: (username: string) => {\n if(username) {\n a.href = FRAGMENT_USERNAME_URL + username;\n }\n\n p.classList.toggle('hide', !username);\n }\n };\n}\n\nexport default class AppEditProfileTab extends SliderSuperTab {\n private firstNameInputField: InputField;\n private lastNameInputField: InputField;\n private bioInputField: InputField;\n private usernameInputField: UsernameInputField;\n\n private profileUrlContainer: HTMLDivElement;\n private profileUrlAnchor: HTMLAnchorElement;\n\n private editPeer: EditPeer;\n\n public static getInitArgs() {\n return {\n bioMaxLength: rootScope.managers.apiManager.getLimit('bio'),\n user: rootScope.managers.appUsersManager.getSelf(),\n userFull: rootScope.managers.appProfileManager.getProfile(rootScope.myId.toUserId())\n };\n }\n\n public async init(p: ReturnType) {\n this.container.classList.add('edit-profile-container');\n this.setTitle('EditAccount.Title');\n\n const inputFields: InputField[] = [];\n\n const [bioMaxLength, user, userFull] = await Promise.all([p.bioMaxLength, p.user, p.userFull]);\n\n {\n const section = generateSection(this.scrollable, undefined, 'Bio.Description');\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.firstNameInputField = new InputField({\n label: 'EditProfile.FirstNameLabel',\n name: 'first-name',\n maxLength: 70\n });\n this.lastNameInputField = new InputField({\n label: 'Login.Register.LastName.Placeholder',\n name: 'last-name',\n maxLength: 64\n });\n this.bioInputField = new InputField({\n label: 'EditProfile.BioLabel',\n name: 'bio',\n maxLength: bioMaxLength\n });\n\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\n\n const caption = document.createElement('div');\n caption.classList.add('caption');\n i18n_({element: caption, key: 'Bio.Description'});\n\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\n\n this.editPeer = new EditPeer({\n peerId: rootScope.myId,\n inputFields,\n listenerSetter: this.listenerSetter\n });\n\n this.content.append(this.editPeer.nextBtn);\n\n section.append(this.editPeer.avatarEdit.container, inputWrapper);\n }\n\n {\n const section = new SettingSection({\n name: 'EditAccount.Username',\n caption: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.usernameInputField = new UsernameInputField({\n label: 'EditProfile.Username.Label',\n name: 'username',\n plainText: true,\n listenerSetter: this.listenerSetter,\n onChange: () => {\n this.editPeer.handleChange();\n // this.setProfileUrl();\n\n const {error} = this.usernameInputField;\n const isPurchase = error?.type === 'USERNAME_PURCHASE_AVAILABLE';\n setUsername(isPurchase ? this.usernameInputField.value : undefined);\n },\n availableText: 'EditProfile.Username.Available',\n takenText: 'EditProfile.Username.Taken',\n invalidText: 'EditProfile.Username.Invalid'\n }, this.managers);\n\n inputWrapper.append(this.usernameInputField.container);\n\n const caption = section.caption;\n\n const {setUsername, element: p} = purchaseUsernameCaption();\n\n caption.append(\n p,\n i18n('UsernameHelp')\n // document.createElement('br'),\n // document.createElement('br')\n );\n\n // const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\n // profileUrlContainer.classList.add('profile-url-container');\n // const profileUrlAnchor = this.profileUrlAnchor = anchorCopy();\n // profileUrlContainer.append(i18n('UsernameHelpLink', [profileUrlAnchor]));\n // caption.append(profileUrlContainer);\n\n inputFields.push(this.usernameInputField);\n section.content.append(inputWrapper);\n this.scrollable.append(section.container);\n }\n\n {\n const section = new UsernamesSection({\n peerId: rootScope.myId,\n peer: user,\n listenerSetter: this.listenerSetter,\n usernameInputField: this.usernameInputField,\n middleware: this.middlewareHelper.get()\n });\n\n this.scrollable.append(section.container);\n }\n\n attachClickEvent(this.editPeer.nextBtn, () => {\n this.editPeer.nextBtn.disabled = true;\n\n const promises: Promise[] = [];\n\n const profilePromise = this.managers.appProfileManager.updateProfile(\n this.firstNameInputField.value,\n this.lastNameInputField.value,\n this.bioInputField.value\n );\n promises.push(profilePromise.then(() => {\n this.close();\n }, (err) => {\n console.error('updateProfile error:', err);\n }));\n\n if(this.editPeer.uploadAvatar) {\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\n }));\n }\n\n if(this.usernameInputField.isValidToChange()) {\n promises.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value));\n }\n\n Promise.race(promises).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.firstNameInputField.setOriginalValue(user.first_name, true);\n this.lastNameInputField.setOriginalValue(user.last_name, true);\n this.bioInputField.setOriginalValue(userFull.about, true);\n this.usernameInputField.setOriginalValue(getPeerEditableUsername(user), true);\n\n // this.setProfileUrl();\n this.editPeer.handleChange();\n }\n\n // private setProfileUrl() {\n // if(this.usernameInputField.input.classList.contains('error') || !this.usernameInputField.value.length) {\n // this.profileUrlContainer.style.display = 'none';\n // } else {\n // this.profileUrlContainer.style.display = '';\n // this.profileUrlAnchor.replaceWith(this.profileUrlAnchor = anchorCopy({mePath: this.usernameInputField.value}));\n // }\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appImManager, {APP_TABS} from '../../lib/appManagers/appImManager';\nimport SidebarSlider from '../slider';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport AppSharedMediaTab from './tabs/sharedMedia';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\n\nexport class AppSidebarRight extends SidebarSlider {\n private isColumnProportionSet = false;\n private sharedMediaTab: AppSharedMediaTab;\n // public rect: DOMRect;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-right') as HTMLElement,\n canHideFirst: true,\n navigationType: 'right'\n });\n }\n\n construct(managers: AppManagers) {\n this.managers = managers;\n\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\n this.toggleSidebar(false);\n }\n });\n\n mediaSizes.addEventListener('resize', () => {\n this.setColumnProportion();\n });\n }\n\n public createSharedMediaTab() {\n const tab = this.createTab(AppSharedMediaTab, false, true);\n tab.slider = this;\n // this.tabsContainer.prepend(tab.container);\n return tab;\n }\n\n public replaceSharedMediaTab(tab?: AppSharedMediaTab) {\n const previousTab = this.sharedMediaTab;\n if(previousTab) {\n const idx = this.historyTabIds.indexOf(previousTab);\n\n if(this._selectTab.getFrom() === previousTab.container) {\n this._selectTab.setFrom(tab?.container);\n }\n\n if(tab) {\n if(idx !== -1) {\n this.historyTabIds[idx] = tab;\n }\n\n const wasActive = previousTab.container.classList.contains('active');\n if(wasActive) {\n tab.container.classList.add('active');\n }\n\n previousTab.container.replaceWith(tab.container);\n } else {\n if(idx !== -1) {\n this.historyTabIds.splice(idx, 1);\n }\n\n previousTab.container.remove();\n }\n } else {\n this.tabsContainer.prepend(tab.container);\n }\n\n this.sharedMediaTab = tab;\n }\n\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\n if(!this.historyTabIds.length) {\n this.toggleSidebar(false, animate);\n }\n\n super.onCloseTab(id, animate, isNavigation);\n }\n\n private setColumnProportion() {\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\n // this.rect = this.sidebarEl.getBoundingClientRect();\n }\n\n public toggleSidebar(enable?: boolean, animate?: boolean) {\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n let willChange: boolean;\n if(enable !== undefined) {\n if(enable) {\n if(!active) {\n willChange = true;\n }\n } else if(active) {\n willChange = true;\n }\n } else {\n willChange = true;\n }\n\n if(!willChange) return Promise.resolve();\n\n if(!active && !this.historyTabIds.length) {\n this.sharedMediaTab.open();\n }\n\n if(!this.isColumnProportionSet) {\n this.setColumnProportion();\n this.isColumnProportionSet = true;\n }\n\n const animationPromise = appImManager.selectTab(active ? APP_TABS.CHAT : APP_TABS.PROFILE, animate);\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\n return animationPromise;\n\n /* return new Promise((resolve, reject) => {\n const hidden: {element: HTMLDivElement, height: number}[] = [];\n const observer = new IntersectionObserver((entries) => {\n for(const entry of entries) {\n const bubble = entry.target as HTMLDivElement;\n if(!entry.isIntersecting) {\n hidden.push({element: bubble, height: bubble.scrollHeight});\n }\n }\n\n for(const item of hidden) {\n item.element.style.minHeight = item.height + 'px';\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\n item.element.style.width = '1px';\n }\n\n //console.log('hidden', hidden);\n observer.disconnect();\n\n set();\n\n setTimeout(() => {\n for(const item of hidden) {\n item.element.style.minHeight = '';\n item.element.style.width = '';\n (item.element.firstElementChild as HTMLElement).style.display = '';\n }\n\n resolve();\n }, 200);\n });\n\n const length = Object.keys(appImManager.bubbles).length;\n if(length) {\n for(const i in appImManager.bubbles) {\n observer.observe(appImManager.bubbles[i]);\n }\n } else {\n set();\n setTimeout(resolve, 200);\n }\n }); */\n }\n}\n\nconst appSidebarRight = new AppSidebarRight();\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\nexport default appSidebarRight;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider'\nimport InputField from '../../inputField';\nimport EditPeer from '../../editPeer';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport CheckboxField from '../../checkboxField';\nimport Button from '../../button';\nimport PeerTitle from '../../peerTitle';\nimport rootScope from '../../../lib/rootScope';\nimport PopupPeer from '../../popups/peer';\nimport {addCancelButton} from '../../popups';\nimport {i18n} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport formatUserPhone from '../../wrappers/formatUserPhone';\nimport SettingSection from '../../settingSection';\nimport wrapPeerTitle from '../../wrappers/peerTitle';\n\nexport default class AppEditContactTab extends SliderSuperTab {\n private nameInputField: InputField;\n private lastNameInputField: InputField;\n private editPeer: EditPeer;\n private sharePhoneCheckboxField: CheckboxField;\n public peerId: PeerId;\n\n public async init() {\n const {peerId} = this;\n const userId = peerId.toUserId();\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\n const [isContact, privacy] = await Promise.all([\n this.managers.appUsersManager.isContact(userId),\n this.managers.appPrivacyManager.getPrivacy('inputPrivacyKeyPhoneNumber')\n ]);\n const isNew = !isContact;\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\n\n {\n const section = new SettingSection({noDelimiter: true});\n const inputFields: InputField[] = [];\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.nameInputField = new InputField({\n label: 'FirstName',\n name: 'contact-name',\n maxLength: 70,\n required: true\n });\n this.lastNameInputField = new InputField({\n label: 'LastName',\n name: 'contact-lastname',\n maxLength: 70\n });\n\n if(userId) {\n const user = await this.managers.appUsersManager.getUser(userId);\n\n if(isNew) {\n this.nameInputField.setDraftValue(user.first_name);\n this.lastNameInputField.setDraftValue(user.last_name);\n } else {\n this.nameInputField.setOriginalValue(user.first_name);\n this.lastNameInputField.setOriginalValue(user.last_name);\n }\n }\n\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\n inputFields.push(this.nameInputField, this.lastNameInputField);\n\n this.editPeer = new EditPeer({\n peerId: peerId,\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true\n });\n this.content.append(this.editPeer.nextBtn);\n\n if(peerId) {\n const div = document.createElement('div');\n div.classList.add('avatar-edit');\n div.append(this.editPeer.avatarElem);\n\n const notificationsCheckboxField = new CheckboxField({\n text: 'Notifications'\n });\n\n notificationsCheckboxField.input.addEventListener('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n this.managers.appMessagesManager.togglePeerMute({peerId});\n });\n\n this.listenerSetter.add(rootScope)('notify_settings', async(update) => {\n if(update.peer._ !== 'notifyPeer') return;\n const peerId = getPeerId(update.peer.peer);\n if(peerId === peerId) {\n const enabled = !(await this.managers.appNotificationsManager.isMuted(update.notify_settings));\n if(enabled !== notificationsCheckboxField.checked) {\n notificationsCheckboxField.checked = enabled;\n }\n }\n });\n\n const profileNameDiv = document.createElement('div');\n profileNameDiv.classList.add('profile-name');\n profileNameDiv.append(new PeerTitle({\n peerId: peerId\n }).element);\n // profileNameDiv.innerHTML = 'Karen Stanford';\n\n const profileSubtitleDiv = document.createElement('div');\n profileSubtitleDiv.classList.add('profile-subtitle');\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\n\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\n\n if(!isNew) {\n const notificationsRow = new Row({\n checkboxField: notificationsCheckboxField,\n withCheckboxSubtitle: true,\n listenerSetter: this.listenerSetter\n });\n\n const enabled = !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false}));\n notificationsCheckboxField.checked = enabled;\n\n section.content.append(notificationsRow.container);\n } else {\n const user = await this.managers.appUsersManager.getUser(userId);\n\n const phoneRow = new Row({\n icon: 'phone',\n titleLangKey: user.phone ? undefined : 'MobileHidden',\n title: user.phone ? formatUserPhone(user.phone) : undefined,\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: peerId}).element]\n });\n\n section.content.append(phoneRow.container);\n }\n } else {\n section.content.append(inputWrapper);\n }\n\n this.scrollable.append(section.container);\n }\n\n if(!isNew) {\n const section = new SettingSection();\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\n\n attachClickEvent(btnDelete, () => {\n new PopupPeer('popup-delete-contact', {\n peerId: peerId,\n titleLangKey: 'DeleteContact',\n descriptionLangKey: 'AreYouSureDeleteContact',\n buttons: addCancelButton([{\n langKey: 'Delete',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n this.managers.appUsersManager.deleteContacts([userId]).then(() => {\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show();\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n } else if(\n privacy.some((privacyRule) => privacyRule._ === 'privacyValueDisallowAll') &&\n !privacy.some((privacyRule) => privacyRule._ === 'privacyValueAllowUsers' && privacyRule.users.includes(userId))\n ) {\n const section = new SettingSection({\n caption: 'NewContact.Exception.ShareMyPhoneNumber.Desc',\n captionArgs: [await wrapPeerTitle({peerId: this.peerId})]\n });\n const checkboxField = this.sharePhoneCheckboxField = new CheckboxField({\n text: 'NewContact.Exception.ShareMyPhoneNumber',\n checked: true\n });\n const row = CreateRowFromCheckboxField(checkboxField);\n\n section.content.append(row.container);\n\n this.scrollable.append(section.container);\n }\n\n attachClickEvent(this.editPeer.nextBtn, async() => {\n this.editPeer.nextBtn.disabled = true;\n\n this.managers.appUsersManager.addContact(\n userId,\n this.nameInputField.value,\n this.lastNameInputField.value,\n (await this.managers.appUsersManager.getUser(userId)).phone,\n this.sharePhoneCheckboxField?.checked\n ).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {makeMediaSize} from '../../../helpers/mediaSize';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {ForumTopic} from '../../../layer';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {GENERAL_TOPIC_ID, TOPIC_COLORS} from '../../../lib/mtproto/mtproto_config';\nimport getAbbreviation from '../../../lib/richTextProcessor/getAbbreviation';\nimport ButtonIcon from '../../buttonIcon';\nimport CheckboxField from '../../checkboxField';\nimport EmojiTab from '../../emoticonsDropdown/tabs/emoji';\nimport InputField from '../../inputField';\nimport Row from '../../row';\nimport SettingSection from '../../settingSection';\nimport appSidebarLeft from '../../sidebarLeft';\nimport SliderSuperTab from '../../sliderTab';\nimport {wrapTopicIcon} from '../../wrappers/messageActionTextNewUnsafe';\n\nconst size = 64;\nconst mediaSize = makeMediaSize(size, size);\n\nexport default class AppEditTopicTab extends SliderSuperTab {\n private iconDiv: HTMLElement;\n private colorIndex: number;\n private nameInputField: InputField;\n private topic: Parameters[0]['topic'];\n private emojiElement: HTMLElement;\n private confirmBtn: HTMLButtonElement;\n private originalTopic: ForumTopic.forumTopic;\n\n public async init(peerId: PeerId, threadId?: number) {\n this.colorIndex = 0;\n const isNew = !threadId;\n const isGeneral = threadId === GENERAL_TOPIC_ID;\n this.container.classList.add('edit-topic-container');\n this.setTitle(isNew ? 'NewTopic' : 'ForumTopic.Title.Edit');\n const chatId = peerId.toChatId();\n\n if(threadId) {\n this.topic = this.originalTopic = copy(await this.managers.dialogsStorage.getForumTopic(peerId, threadId));\n }\n\n {\n const section = new SettingSection({\n name: isGeneral ? 'CreateGeneralTopicTitle' : 'CreateTopicTitle'\n });\n\n const iconDiv = this.iconDiv = document.createElement('div');\n iconDiv.classList.add('edit-topic-icon-container');\n\n !threadId && attachClickEvent(iconDiv, () => {\n if(this.topic.icon_emoji_id) {\n return;\n }\n\n this.colorIndex = (this.colorIndex + 1) % TOPIC_COLORS.length;\n this.setIcon();\n }, {listenerSetter: this.listenerSetter});\n\n if(threadId) {\n iconDiv.classList.add('disable-hover');\n }\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const nameInputField = this.nameInputField = new InputField({\n label: 'ForumTopic.Name.Placeholder',\n withLinebreaks: false,\n name: 'topic-name',\n maxLength: 70,\n required: true\n });\n\n if(this.topic) {\n nameInputField.setOriginalValue(this.topic.title, true);\n }\n\n const confirmBtn = this.confirmBtn = ButtonIcon('check btn-confirm blue hide', {noRipple: true});\n this.header.append(confirmBtn);\n\n attachClickEvent(confirmBtn, () => {\n const toggle = toggleDisability([confirmBtn], true);\n if(threadId) {\n this.managers.appChatsManager.editForumTopic({\n chatId,\n topicId: threadId,\n title: nameInputField.value,\n iconEmojiId: this.topic.icon_emoji_id || 0\n }).then(() => {\n this.close();\n }).catch((err) => {\n console.error('edit topic error', err);\n toggle();\n });\n } else {\n this.managers.appChatsManager.createForumTopic({\n chatId,\n iconColor: TOPIC_COLORS[this.colorIndex],\n iconEmojiId: this.topic.icon_emoji_id,\n title: nameInputField.value\n }).then((threadId) => {\n this.close();\n appImManager.setInnerPeer({\n peerId,\n threadId\n });\n }).catch((err) => {\n console.error('create topic error', err);\n toggle();\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(nameInputField.input)('input', () => {\n this.validate();\n this.setIcon(this.topic?.icon_emoji_id);\n });\n\n inputWrapper.append(nameInputField.container);\n\n section.content.append(iconDiv, inputWrapper);\n\n this.scrollable.append(section.container);\n }\n\n const promises: Promise[] = [];\n\n if(!isGeneral) {\n const section = new SettingSection({});\n section.container.classList.add('edit-topic-emoticons-container');\n const emojiTab = new EmojiTab({\n managers: this.managers,\n isStandalone: true,\n noRegularEmoji: true,\n stickerSetId: 'inputStickerSetEmojiDefaultTopicIcons',\n onClick: (emoji) => {\n emojiTab.setActive(!emoji.docId ? {emoji: undefined, docId: undefined} : emoji);\n this.setIcon(emoji.docId);\n }\n });\n emojiTab.getContainerSize = () => ({\n width: appSidebarLeft.rect.width,\n height: 400\n });\n\n this.middlewareHelper.onDestroy(() => {\n emojiTab.destroy();\n });\n\n emojiTab.container.classList.remove('tabs-tab');\n\n this.emojiElement = document.createElement('span');\n this.emojiElement.classList.add('super-emoji-topic-icon');\n\n const promise = emojiTab.init().then(async() => {\n const category = emojiTab.getCustomCategory();\n\n const iconEmojiId = this.topic?.icon_emoji_id;\n emojiTab.addEmojiToCategory({\n category,\n element: this.emojiElement,\n batch: false,\n prepend: true,\n active: !iconEmojiId\n });\n\n if(iconEmojiId) {\n emojiTab.setActive({docId: iconEmojiId, emoji: ''});\n }\n });\n\n promises.push(promise);\n\n section.content.replaceWith(emojiTab.container);\n this.scrollable.append(section.container);\n } else {\n const section = new SettingSection({caption: 'EditTopicHideInfo'});\n\n const checkboxField = new CheckboxField({\n // toggle: true,\n checked: !(this.topic as ForumTopic.forumTopic).pFlags.hidden,\n text: 'EditTopicHide'\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n const promise = this.managers.appChatsManager.editForumTopic({\n chatId,\n topicId: threadId,\n hidden: !checkboxField.checked\n });\n\n row.disableWithPromise(promise);\n });\n\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n this.scrollable.append(section.container);\n }\n\n return Promise.all(promises).then(() => {\n return this.s();\n });\n }\n\n private validate() {\n let isChanged = this.nameInputField.isValidToChange();\n if(!isChanged && this.originalTopic) {\n isChanged = this.topic.icon_emoji_id !== this.originalTopic.icon_emoji_id;\n }\n\n this.confirmBtn.classList.toggle('hide', !isChanged);\n }\n\n private s() {\n if(this.topic?.icon_color) {\n this.colorIndex = TOPIC_COLORS.indexOf(this.topic.icon_color);\n }\n\n return this.setIcon(this.topic?.icon_emoji_id, undefined, true);\n }\n\n private async setIcon(iconEmojiId?: Long, appendTo = this.iconDiv, force?: boolean) {\n const title = this.nameInputField.value;\n\n const isMainIcon = appendTo === this.iconDiv;\n\n if(isMainIcon) {\n const newTopic: AppEditTopicTab['topic'] = {\n id: this.topic?.id,\n icon_color: TOPIC_COLORS[this.colorIndex],\n title: getAbbreviation(title, true).text || 'A',\n icon_emoji_id: iconEmojiId\n };\n\n const oldTopic = this.topic;\n this.topic = newTopic;\n\n if(\n force ||\n !oldTopic ||\n oldTopic.icon_color !== newTopic.icon_color ||\n oldTopic.title !== newTopic.title\n ) {\n this.setIcon(undefined, this.emojiElement);\n }\n\n if(deepEqual(oldTopic, newTopic) && !force) {\n return;\n }\n\n this.validate();\n }\n\n const el = await wrapTopicIcon({\n topic: isMainIcon ? this.topic : {...this.topic, icon_emoji_id: undefined},\n customEmojiSize: mediaSize,\n middleware: this.middlewareHelper.get()\n });\n\n const span = document.createElement('div');\n span.classList.add('edit-topic-icon');\n span.append(el);\n\n const oldEl = appendTo.lastElementChild as HTMLElement;\n appendTo.append(span);\n\n const applyFadeAnimation = (el: HTMLElement, fadeIn: boolean) => {\n const frames: Keyframe[] = [\n {opacity: '0', transform: 'scale(0.8)'},\n {opacity: '1', transform: 'scale(1)'}\n ];\n\n const animation = el.animate(frames, {\n duration: 200,\n iterations: 1,\n easing: 'ease-in-out',\n fill: 'forwards',\n direction: fadeIn ? 'normal' : 'reverse'\n });\n\n return new Promise((resolve) => {\n animation.addEventListener('finish', () => {\n resolve();\n }, {once: true});\n });\n };\n\n if(oldEl) {\n applyFadeAnimation(oldEl, false).then(() => oldEl.remove());\n }\n\n applyFadeAnimation(span, true);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {copyTextToClipboard} from '../../../helpers/clipboard';\nimport {randomLong} from '../../../helpers/random';\nimport {Chat, ChatFull, ExportedChatInvite} from '../../../layer';\nimport Button from '../../button';\nimport {setButtonLoader} from '../../putPreloader';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport {toast} from '../../toast';\nimport {UsernameInputField} from '../../usernameInputField';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport I18n, {i18n} from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport CheckboxField from '../../checkboxField';\nimport rootScope from '../../../lib/rootScope';\nimport SettingSection from '../../settingSection';\nimport UsernamesSection from '../../usernamesSection';\nimport getPeerEditableUsername from '../../../lib/appManagers/utils/peers/getPeerEditableUsername';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport {purchaseUsernameCaption} from '../../sidebarLeft/tabs/editProfile';\nimport confirmationPopup from '../../confirmationPopup';\n\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n public chatFull: ChatFull;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'group-type-container');\n\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\n\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\n\n const section = new SettingSection({\n name: isBroadcast ? 'ChannelType' : 'GroupType'\n });\n\n const random = randomLong();\n const privateRow = new Row({\n radioField: new RadioField({\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate',\n name: random,\n value: 'private'\n }),\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\n });\n const publicRow = new Row({\n radioField: new RadioField({\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic',\n name: random,\n value: 'public'\n }),\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\n });\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\n const a: HTMLElement[][] = [[privateSection.container], [publicContainer]];\n if(value === 'public') a.reverse();\n\n a[0].forEach((container) => container.classList.remove('hide'));\n a[1].forEach((container) => container.classList.add('hide'));\n\n onChange();\n });\n\n let chat: Chat = await this.managers.appChatsManager.getChat(this.chatId);\n\n const chatUpdateListeners: {[type in 'basic']: (() => void)[]} = {basic: []};\n const addChatUpdateListener = (callback: () => void, type: 'basic' = 'basic') => {\n chatUpdateListeners[type].push(callback);\n };\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.chatId === chatId) {\n chat = await this.managers.appChatsManager.getChat(this.chatId) as typeof chat;\n chatUpdateListeners['basic'].forEach((callback) => callback());\n }\n });\n\n section.content.append(form);\n\n const privateSection = new SettingSection({});\n\n // let revoked = false;\n const linkRow = new Row({\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\n clickable: () => {\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\n toast(I18n.format('LinkCopied', true));\n },\n listenerSetter: this.listenerSetter\n });\n\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\n\n attachClickEvent(btnRevoke, () => {\n new PopupPeer('revoke-link', {\n buttons: [{\n langKey: 'RevokeButton',\n callback: () => {\n const toggle = toggleDisability([btnRevoke], true);\n\n this.managers.appProfileManager.getChatInviteLink(this.chatId, true).then((link) => {\n toggle();\n linkRow.title.innerHTML = link;\n // revoked = true;\n // onChange();\n });\n }\n }],\n titleLangKey: 'RevokeLink',\n descriptionLangKey: 'RevokeAlert'\n }).show();\n }, {listenerSetter: this.listenerSetter});\n\n privateSection.content.append(linkRow.container, btnRevoke);\n\n const publicSection = new SettingSection({\n caption: true,\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const placeholder = 't.me/';\n\n const onChange = () => {\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) ||\n (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\n applyBtn.classList.toggle('is-visible', changed);\n\n const {error} = linkInputField;\n const isPurchase = error?.type === 'USERNAME_PURCHASE_AVAILABLE';\n setUsername(isPurchase ? linkInputField.getValue() : undefined);\n };\n\n const linkInputField = new UsernameInputField({\n label: 'SetUrlPlaceholder',\n name: 'group-public-link',\n plainText: true,\n listenerSetter: this.listenerSetter,\n availableText: 'Link.Available',\n invalidText: 'Link.Invalid',\n takenText: 'Link.Taken',\n onChange: onChange,\n peerId: this.chatId.toPeerId(true),\n head: placeholder\n }, this.managers);\n\n const {setUsername, element: p} = purchaseUsernameCaption();\n\n publicSection.caption.append(\n p,\n i18n(isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup')\n );\n\n const usernamesSection = new UsernamesSection({\n peerId: this.chatId.toPeerId(true),\n peer: chat as Chat.channel,\n listenerSetter: this.listenerSetter,\n usernameInputField: linkInputField,\n middleware: this.middlewareHelper.get()\n });\n\n const publicContainer = document.createElement('div');\n publicContainer.append(publicSection.container, usernamesSection.container);\n\n const originalValue = placeholder + (getPeerEditableUsername(chat as Chat.channel) || '');\n\n inputWrapper.append(linkInputField.container)\n publicSection.content.append(inputWrapper);\n\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\n this.content.append(applyBtn);\n\n attachClickEvent(applyBtn, async() => {\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\n if(!username) {\n const chat = await this.managers.appChatsManager.getChat(this.chatId);\n const wasUsername = getPeerEditableUsername(chat as Chat.channel);\n if(wasUsername) {\n await confirmationPopup({\n descriptionLangKey: isBroadcast ? 'ChannelVisibility.Confirm.MakePrivate.Channel' : 'ChannelVisibility.Confirm.MakePrivate.Group',\n descriptionLangArgs: [wasUsername],\n button: {\n langKey: 'OK'\n }\n });\n }\n }\n\n /* const unsetLoader = */setButtonLoader(applyBtn);\n this.managers.appChatsManager.migrateChat(this.chatId).then((channelId) => {\n if(!username) {\n return this.managers.appChatsManager.makeChannelPrivate(channelId);\n } else {\n return this.managers.appChatsManager.updateUsername(channelId, username);\n }\n }).then(() => {\n // unsetLoader();\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n (originalValue !== placeholder || getPeerActiveUsernames(chat as Chat.channel).length ? publicRow : privateRow).radioField.checked = true;\n linkInputField.setOriginalValue(originalValue, true);\n\n this.scrollable.append(section.container, privateSection.container, publicContainer);\n\n {\n const section = new SettingSection({\n name: 'SavingContentTitle',\n caption: isBroadcast ? 'RestrictSavingContentInfoChannel' : 'RestrictSavingContentInfoGroup'\n });\n\n const checkboxField = new CheckboxField({\n text: 'RestrictSavingContent',\n withRipple: true\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n const toggle = checkboxField.toggleDisability(true);\n this.managers.appChatsManager.toggleNoForwards(this.chatId, checkboxField.checked).then(() => {\n toggle();\n });\n });\n\n const onChatUpdate = () => {\n checkboxField.setValueSilently(!!(chat as Chat.channel).pFlags.noforwards);\n };\n\n addChatUpdateListener(onChatUpdate);\n\n onChatUpdate();\n\n section.content.append(checkboxField.label);\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {ChannelParticipant} from '../../../layer';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport Button from '../../button';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport {ChatPermissions} from './groupPermissions';\n\nexport default class AppUserPermissionsTab extends SliderSuperTabEventable {\n public participant: ChannelParticipant;\n public chatId: ChatId;\n public userId: UserId;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'user-permissions-container');\n this.setTitle('UserRestrictions');\n\n let destroyListener: () => void;\n\n {\n const section = new SettingSection({\n name: 'UserRestrictionsCanDo'\n });\n\n const div = document.createElement('div');\n div.classList.add('chatlist-container');\n section.content.insertBefore(div, section.title);\n\n const list = appDialogsManager.createChatList({new: true});\n div.append(list);\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: this.userId.toPeerId(false),\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger'\n });\n\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(this.userId)));\n\n const p = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n participant: this.participant._ === 'channelParticipantBanned' ? this.participant : undefined\n }, this.managers);\n\n destroyListener = () => {\n // appChatsManager.editChatDefaultBannedRights(this.chatId, p.takeOut());\n const rights = p.takeOut();\n if(this.participant._ === 'channelParticipantBanned' && deepEqual(this.participant.banned_rights.pFlags, rights.pFlags)) {\n return;\n }\n\n this.managers.appChatsManager.editBanned(this.chatId, this.participant, rights);\n };\n\n this.eventListener.addEventListener('destroy', destroyListener, {once: true});\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({});\n\n if(this.participant._ === 'channelParticipantBanned') {\n const btnDeleteException = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'GroupPermission.Delete'});\n\n attachClickEvent(btnDeleteException, () => {\n const toggle = toggleDisability([btnDeleteException], true);\n this.managers.appChatsManager.clearChannelParticipantBannedRights(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDeleteException);\n }\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'deleteuser', text: 'UserRestrictionsBlock'});\n\n attachClickEvent(btnDelete, () => {\n const toggle = toggleDisability([btnDelete], true);\n this.managers.appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n });\n /* new PopupPeer('popup-group-kick-user', {\n peerId: -this.chatId,\n title: 'Ban User?',\n description: `Are you sure you want to ban ${appPeersManager.getPeerTitle(this.userId)}`,\n buttons: addCancelButton([{\n text: 'BAN',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show(); */\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpTag from '../../../helpers/dom/findUpTag';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport ScrollableLoader from '../../../helpers/scrollableLoader';\nimport {ChannelParticipant, Chat, ChatBannedRights, Update} from '../../../layer';\nimport {ChatRights} from '../../../lib/appManagers/appChatsManager';\nimport appDialogsManager, {DialogDom, DIALOG_LIST_ELEMENT_TAG} from '../../../lib/appManagers/appDialogsManager';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport combineParticipantBannedRights from '../../../lib/appManagers/utils/chats/combineParticipantBannedRights';\nimport hasRights from '../../../lib/appManagers/utils/chats/hasRights';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport I18n, {i18n, join, LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport CheckboxField from '../../checkboxField';\nimport PopupPickUser from '../../popups/pickUser';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport {toast} from '../../toast';\nimport AppUserPermissionsTab from './userPermissions';\n\nexport class ChatPermissions {\n public v: Array<{\n flags: ChatRights[],\n text: LangPackKey,\n exceptionText: LangPackKey,\n checkboxField?: CheckboxField,\n }>;\n private toggleWith: Partial<{[chatRight in ChatRights]: ChatRights[]}>;\n\n constructor(private options: {\n chatId: ChatId,\n listenerSetter: ListenerSetter,\n appendTo: HTMLElement,\n participant?: ChannelParticipant.channelParticipantBanned\n }, private managers: AppManagers) {\n this.construct();\n }\n\n public async construct() {\n this.v = [\n {flags: ['send_messages'], text: 'UserRestrictionsSend', exceptionText: 'UserRestrictionsNoSend'},\n {flags: ['send_media'], text: 'UserRestrictionsSendMedia', exceptionText: 'UserRestrictionsNoSendMedia'},\n {flags: ['send_stickers', 'send_gifs'], text: 'UserRestrictionsSendStickers', exceptionText: 'UserRestrictionsNoSendStickers'},\n {flags: ['send_polls'], text: 'UserRestrictionsSendPolls', exceptionText: 'UserRestrictionsNoSendPolls'},\n {flags: ['embed_links'], text: 'UserRestrictionsEmbedLinks', exceptionText: 'UserRestrictionsNoEmbedLinks'},\n {flags: ['invite_users'], text: 'UserRestrictionsInviteUsers', exceptionText: 'UserRestrictionsNoInviteUsers'},\n {flags: ['pin_messages'], text: 'UserRestrictionsPinMessages', exceptionText: 'UserRestrictionsNoPinMessages'},\n {flags: ['change_info'], text: 'UserRestrictionsChangeInfo', exceptionText: 'UserRestrictionsNoChangeInfo'}\n ];\n\n this.toggleWith = {\n 'send_messages': ['send_media', 'send_stickers', 'send_polls', 'embed_links']\n };\n\n const options = this.options;\n const chat = await this.managers.appChatsManager.getChat(options.chatId) as Chat.chat | Chat.channel;\n const defaultBannedRights = chat.default_banned_rights;\n const rights = options.participant ? combineParticipantBannedRights(chat as Chat.channel, options.participant.banned_rights) : defaultBannedRights;\n\n const restrictionText: LangPackKey = options.participant ? 'UserRestrictionsDisabled' : 'EditCantEditPermissionsPublic';\n for(const info of this.v) {\n const mainFlag = info.flags[0];\n const row = CreateRowFromCheckboxField(\n info.checkboxField = new CheckboxField({\n text: info.text,\n checked: hasRights(chat, mainFlag, rights),\n restriction: true,\n listenerSetter: options.listenerSetter\n })\n );\n\n if((\n options.participant &&\n defaultBannedRights.pFlags[mainFlag as keyof typeof defaultBannedRights['pFlags']]\n ) || (\n getPeerActiveUsernames(chat as Chat.channel)[0] &&\n (\n info.flags.includes('pin_messages') ||\n info.flags.includes('change_info')\n )\n )\n ) {\n info.checkboxField.input.disabled = true;\n\n /* options.listenerSetter.add(info.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n cancelEvent(e);\n toast('This option is disabled for all members in Group Permissions.');\n info.checkboxField.checked = false;\n }); */\n\n attachClickEvent(info.checkboxField.label, (e) => {\n toast(I18n.format(restrictionText, true));\n }, {listenerSetter: options.listenerSetter});\n }\n\n if(this.toggleWith[mainFlag]) {\n options.listenerSetter.add(info.checkboxField.input)('change', () => {\n if(!info.checkboxField.checked) {\n const other = this.v.filter((i) => this.toggleWith[mainFlag].includes(i.flags[0]));\n other.forEach((info) => {\n info.checkboxField.checked = false;\n });\n }\n });\n }\n\n options.appendTo.append(row.container);\n }\n }\n\n public takeOut() {\n const rights: ChatBannedRights = {\n _: 'chatBannedRights',\n until_date: 0x7FFFFFFF,\n pFlags: {}\n };\n\n for(const info of this.v) {\n const banned = !info.checkboxField.checked;\n if(banned) {\n info.flags.forEach((flag) => {\n // @ts-ignore\n rights.pFlags[flag] = true;\n });\n }\n }\n\n return rights;\n }\n}\n\nexport default class AppGroupPermissionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'group-permissions-container');\n this.setTitle('ChannelPermissions');\n\n let chatPermissions: ChatPermissions;\n {\n const section = new SettingSection({\n name: 'ChannelPermissionsHeader'\n });\n\n chatPermissions = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content\n }, this.managers);\n\n this.eventListener.addEventListener('destroy', () => {\n this.managers.appChatsManager.editChatDefaultBannedRights(this.chatId, chatPermissions.takeOut());\n }, {once: true});\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({\n name: 'PrivacyExceptions'\n });\n\n const addExceptionRow = new Row({\n titleLangKey: 'ChannelAddException',\n subtitleLangKey: 'Loading',\n icon: 'adduser',\n clickable: () => {\n new PopupPickUser({\n peerTypes: ['channelParticipants'],\n onSelect: (peerId) => {\n setTimeout(() => {\n openPermissions(peerId);\n }, 0);\n },\n placeholder: 'ExceptionModal.Search.Placeholder',\n peerId: -this.chatId\n });\n },\n listenerSetter: this.listenerSetter\n });\n\n const openPermissions = async(peerId: PeerId) => {\n let participant: AppUserPermissionsTab['participant'];\n try {\n participant = await this.managers.appProfileManager.getChannelParticipant(this.chatId, peerId) as any;\n } catch(err) {\n toast('User is no longer participant');\n return;\n }\n\n const tab = this.slider.createTab(AppUserPermissionsTab);\n tab.participant = participant;\n tab.chatId = this.chatId;\n tab.userId = peerId;\n tab.open();\n };\n\n section.content.append(addExceptionRow.container);\n\n /* const removedUsersRow = new Row({\n titleLangKey: 'ChannelBlockedUsers',\n subtitleLangKey: 'NoBlockedUsers',\n icon: 'deleteuser',\n clickable: true\n });\n\n section.content.append(removedUsersRow.container); */\n\n const c = section.generateContentElement();\n c.classList.add('chatlist-container');\n\n const list = appDialogsManager.createChatList({new: true});\n c.append(list);\n\n attachClickEvent(list, (e) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!target) return;\n\n const peerId = target.dataset.peerId.toPeerId();\n openPermissions(peerId);\n }, {listenerSetter: this.listenerSetter});\n\n const setSubtitle = async(dom: DialogDom, participant: ChannelParticipant.channelParticipantBanned) => {\n const bannedRights = participant.banned_rights;// appChatsManager.combineParticipantBannedRights(this.chatId, participant.banned_rights);\n const defaultBannedRights = ((await this.managers.appChatsManager.getChat(this.chatId)) as Chat.channel).default_banned_rights;\n // const combinedRights = appChatsManager.combineParticipantBannedRights(this.chatId, bannedRights);\n\n const cantWhat: LangPackKey[] = []/* , canWhat: LangPackKey[] = [] */;\n chatPermissions.v.forEach((info) => {\n const mainFlag = info.flags[0];\n // @ts-ignore\n if(bannedRights.pFlags[mainFlag] && !defaultBannedRights.pFlags[mainFlag]) {\n cantWhat.push(info.exceptionText);\n // @ts-ignore\n }/* else if(!combinedRights.pFlags[mainFlag]) {\n canWhat.push(info.exceptionText);\n } */\n });\n\n const el = dom.lastMessageSpan as HTMLElement;\n\n if(cantWhat.length) {\n el.replaceChildren(...join(cantWhat.map((t) => i18n(t)), false));\n }/* else if(canWhat.length) {\n str = 'Can ' + canWhat.join(canWhat.length === 2 ? ' and ' : ', ');\n } */\n\n el.classList.toggle('hide', !cantWhat.length);\n };\n\n const add = (participant: ChannelParticipant.channelParticipantBanned, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: getPeerId(participant.peer),\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger',\n append\n });\n\n setSubtitle(dom, participant);\n\n // dom.titleSpan.innerHTML = 'Chinaza Akachi';\n // dom.lastMessageSpan.innerHTML = 'Can Add Users and Pin Messages';\n };\n\n // this.listenerSetter.add(rootScope)('updateChannelParticipant', (update: Update.updateChannelParticipant) => {\n // const needAdd = update.new_participant?._ === 'channelParticipantBanned' && !update.new_participant.banned_rights.pFlags.view_messages;\n // const li = list.querySelector(`[data-peer-id=\"${update.user_id}\"]`);\n // if(needAdd) {\n // if(!li) {\n // add(update.new_participant as ChannelParticipant.channelParticipantBanned, false);\n // } else {\n // setSubtitle(li, update.new_participant as ChannelParticipant.channelParticipantBanned);\n // }\n\n // if(update.prev_participant?._ !== 'channelParticipantBanned') {\n // ++exceptionsCount;\n // }\n // } else {\n // if(li) {\n // li.remove();\n // }\n\n // if(update.prev_participant?._ === 'channelParticipantBanned') {\n // --exceptionsCount;\n // }\n // }\n\n // setLength();\n // });\n\n const setLength = () => {\n replaceContent(addExceptionRow.subtitle, i18n(exceptionsCount ? 'Permissions.ExceptionsCount' : 'Permissions.NoExceptions', [exceptionsCount]));\n };\n\n let exceptionsCount = 0;\n let loader: ScrollableLoader;\n const setLoader = () => {\n const LOAD_COUNT = 50;\n loader = new ScrollableLoader({\n scrollable: this.scrollable,\n getPromise: () => {\n return this.managers.appProfileManager.getChannelParticipants(this.chatId, {_: 'channelParticipantsBanned', q: ''}, LOAD_COUNT, list.childElementCount).then((res) => {\n for(const participant of res.participants) {\n add(participant as ChannelParticipant.channelParticipantBanned, true);\n }\n\n exceptionsCount = res.count;\n setLength();\n\n return res.participants.length < LOAD_COUNT || res.count === list.childElementCount;\n });\n }\n });\n\n return loader.load();\n };\n\n this.scrollable.append(section.container);\n\n if(await this.managers.appChatsManager.isChannel(this.chatId)) {\n await setLoader();\n } else {\n setLength();\n\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.chatId === migrateFrom) {\n this.chatId = migrateTo;\n setLoader();\n }\n });\n }\n }\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport copy from '../../../../helpers/object/copy';\nimport {ChatBannedRights, Chat} from '../../../../layer';\n\nexport default function combineParticipantBannedRights(chat: Chat.channel, rights: ChatBannedRights) {\n if(chat.default_banned_rights) {\n rights = copy(rights);\n const defaultRights = chat.default_banned_rights.pFlags;\n for(const i in defaultRights) {\n // @ts-ignore\n rights.pFlags[i] = defaultRights[i];\n }\n }\n\n return rights;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport debounce from '../../../helpers/schedulers/debounce';\nimport {ChatReactions, Reaction} from '../../../layer';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport CheckboxField from '../../checkboxField';\nimport Row, {RadioFormFromValues} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\n\nexport default class AppChatReactionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n public async init() {\n this.setTitle('Reactions');\n\n const availableReactions = await this.managers.appReactionsManager.getActiveAvailableReactions();\n const chatFull = await this.managers.appProfileManager.getChatFull(this.chatId);\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\n\n let _chatReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n let chatReactions = _chatReactions;\n let emoticons = new Set(_chatReactions._ === 'chatReactionsSome' ? _chatReactions.reactions.map((reaction) => (reaction as Reaction.reactionEmoji).emoticon) : []);\n\n const makeReactionFromEmoticons = (emoticons: Array): Reaction[] => emoticons.map((emoticon) => ({_: 'reactionEmoji', emoticon}));\n\n const getCaptionLangPackKey = (): LangPackKey => {\n if(isBroadcast) {\n return 'EnableReactionsChannelInfo';\n }\n\n return chatReactions._ === 'chatReactionsAll' ? 'EnableAllReactionsInfo' : (chatReactions._ === 'chatReactionsNone' ? 'DisableReactionsInfo' : 'EnableSomeReactionsInfo');\n };\n\n const toggleSection = new SettingSection({\n name: isBroadcast ? undefined : 'AvailableReactions',\n caption: getCaptionLangPackKey()\n });\n\n const reactionsSection = new SettingSection({\n name: 'OnlyAllowThisReactions'\n });\n\n const toggleCheckboxFieldsByEmoticons = () => {\n const r: Reaction.reactionEmoji[] = (chatReactions as ChatReactions.chatReactionsSome).reactions as any ?? [];\n emoticons = new Set(r.map(({emoticon}) => emoticon));\n checkboxFieldsByEmoticon.forEach((checkboxField, emoticon) => {\n checkboxField.setValueSilently(emoticons.has(emoticon));\n });\n };\n\n let toggleCheckboxField: CheckboxField;\n if(isBroadcast) {\n toggleCheckboxField = new CheckboxField({toggle: true, checked: _chatReactions._ === 'chatReactionsSome'});\n const toggleRow = new Row({\n checkboxField: toggleCheckboxField,\n titleLangKey: 'EnableReactions',\n listenerSetter: this.listenerSetter\n });\n\n toggleSection.content.append(toggleRow.container);\n\n this.listenerSetter.add(toggleCheckboxField.input)('change', () => {\n let save = true;\n if(!toggleCheckboxField.checked) {\n chatReactions = {_: 'chatReactionsNone'};\n } else if(checkboxFields.every((checkboxField) => !checkboxField.checked)) {\n chatReactions = {_: 'chatReactionsSome', reactions: makeReactionFromEmoticons(availableReactions.map(({reaction}) => reaction))};\n } else if(chatReactions._ !== 'chatReactionsSome') {\n chatReactions = {_: 'chatReactionsSome', reactions: makeReactionFromEmoticons(Array.from(emoticons))};\n } else {\n save = false;\n }\n\n if(save) {\n toggleCheckboxFieldsByEmoticons();\n saveReactionsDebounced();\n }\n });\n } else {\n const a: [ChatReactions['_'], LangPackKey][] = [\n ['chatReactionsAll', 'AllReactions'],\n ['chatReactionsSome', 'SomeReactions'],\n ['chatReactionsNone', 'NoReactions']\n ];\n\n const onChange = () => {\n reactionsSection.container.classList.toggle('hide', chatReactions._ !== 'chatReactionsSome');\n };\n\n let value = _chatReactions._;\n const form = RadioFormFromValues(a.map(([value, langPackKey]) => {\n return {\n langPackKey,\n value,\n checked: _chatReactions._ === value\n };\n }), (_value) => {\n value = _value as any;\n\n if(value === 'chatReactionsAll') {\n chatReactions = {\n _: value,\n pFlags: {\n allow_custom: true\n }\n };\n } else if(value === 'chatReactionsNone') {\n chatReactions = {\n _: value\n };\n } else {\n chatReactions = {\n _: value,\n reactions: makeReactionFromEmoticons(['👍', '👎'])\n };\n }\n\n replaceContent(toggleSection.caption, i18n(getCaptionLangPackKey()));\n toggleCheckboxFieldsByEmoticons();\n saveReactionsDebounced();\n onChange();\n });\n\n toggleSection.content.append(form);\n onChange();\n }\n\n const checkboxFieldsByEmoticon: Map = new Map();\n const checkboxFields = availableReactions.map((availableReaction) => {\n const emoticon = availableReaction.reaction;\n const checkboxField = new CheckboxField({\n toggle: true,\n checked: emoticons.has(emoticon)\n });\n\n checkboxFieldsByEmoticon.set(emoticon, checkboxField);\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n if(checkboxField.checked) {\n emoticons.add(emoticon);\n\n if(toggleCheckboxField && !toggleCheckboxField.checked) {\n toggleCheckboxField.checked = true;\n }\n } else {\n emoticons.delete(emoticon);\n\n if(toggleCheckboxField?.checked && !emoticons.size) {\n toggleCheckboxField.checked = false;\n }\n }\n\n saveReactionsDebounced();\n });\n\n const row = new Row({\n checkboxField,\n title: availableReaction.title,\n havePadding: true,\n listenerSetter: this.listenerSetter\n });\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n reactionsSection.content.append(row.container);\n\n return checkboxField;\n });\n\n const saveReactions = async() => {\n saveReactionsDebounced.clearTimeout();\n // const newReactions = Array.from(enabledReactions);\n // if([...newReactions].sort().join() === [...originalReactions].sort().join()) {\n // return;\n // }\n\n if(chatReactions._ === 'chatReactionsSome') {\n chatReactions.reactions = makeReactionFromEmoticons(Array.from(emoticons));\n }\n\n // const r = (chatReactions as ChatReactions.chatReactionsSome).reactions;\n // if(r?.length === availableReactions.length) {\n // chatReactions = {_: 'chatReactionsAll'};\n // }\n\n this.managers.appChatsManager.setChatAvailableReactions(this.chatId, chatReactions);\n _chatReactions = chatReactions;\n };\n\n const saveReactionsDebounced = debounce(saveReactions, 3000, false, true);\n\n this.eventListener.addEventListener('destroy', () => {\n if(saveReactionsDebounced.isDebounced()) {\n saveReactions();\n }\n }, {once: true});\n\n this.scrollable.append(toggleSection.container, reactionsSection.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider'\nimport InputField from '../../inputField';\nimport EditPeer from '../../editPeer';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport Button from '../../button';\nimport {ChatRights} from '../../../lib/appManagers/appChatsManager';\nimport {Chat, ChatFull} from '../../../layer';\nimport AppChatTypeTab from './chatType';\nimport rootScope from '../../../lib/rootScope';\nimport AppGroupPermissionsTab from './groupPermissions';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport PopupDeleteDialog from '../../popups/deleteDialog';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport CheckboxField from '../../checkboxField';\nimport AppChatReactionsTab from './chatReactions';\nimport hasRights from '../../../lib/appManagers/utils/chats/hasRights';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport SettingSection from '../../settingSection';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\n\nexport default class AppEditChatTab extends SliderSuperTab {\n private chatNameInputField: InputField;\n private descriptionInputField: InputField;\n private editPeer: EditPeer;\n public chatId: ChatId;\n\n protected async _init() {\n // * cleanup prev\n this.listenerSetter.removeAll();\n this.scrollable.container.replaceChildren();\n\n this.container.classList.add('edit-peer-container', 'edit-group-container');\n this.setTitle('Edit');\n\n let [\n chatFull,\n chat,\n isBroadcast,\n isChannel,\n canChangeType,\n canChangePermissions,\n canManageTopics,\n appConfig\n ] = await Promise.all([\n this.managers.appProfileManager.getChatFull(this.chatId, true),\n this.managers.appChatsManager.getChat(this.chatId) as Promise,\n this.managers.appChatsManager.isBroadcast(this.chatId),\n this.managers.appChatsManager.isChannel(this.chatId),\n this.managers.appChatsManager.hasRights(this.chatId, 'change_type'),\n this.managers.appChatsManager.hasRights(this.chatId, 'change_permissions'),\n this.managers.appChatsManager.hasRights(this.chatId, 'manage_topics'),\n this.managers.apiManager.getAppConfig()\n ]);\n\n const chatUpdateListeners: {[type in 'full' | 'basic']: (() => void)[]} = {full: [], basic: []};\n const addChatUpdateListener = (callback: () => void, type: 'full' | 'basic' = 'basic') => {\n chatUpdateListeners[type].push(callback);\n };\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.chatId === chatId) {\n chat = await this.managers.appChatsManager.getChat(this.chatId) as typeof chat;\n chatUpdateListeners['basic'].forEach((callback) => callback());\n }\n });\n\n this.listenerSetter.add(rootScope)('chat_full_update', async(chatId) => {\n if(this.chatId === chatId) {\n chatFull = await this.managers.appProfileManager.getCachedFullChat(chatId) || chatFull;\n chatUpdateListeners['full'].forEach((callback) => callback());\n }\n });\n\n const peerId = this.chatId.toPeerId(true);\n\n {\n const section = new SettingSection({noDelimiter: true, caption: true});\n const inputFields: InputField[] = [];\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.chatNameInputField = new InputField({\n label: isBroadcast ? 'EnterChannelName' : 'CreateGroup.NameHolder',\n name: 'chat-name',\n maxLength: 255,\n required: true\n });\n this.descriptionInputField = new InputField({\n label: 'DescriptionPlaceholder',\n name: 'chat-description',\n maxLength: 255\n });\n\n this.chatNameInputField.setOriginalValue(chat.title);\n this.descriptionInputField.setOriginalValue(chatFull.about);\n\n inputWrapper.append(this.chatNameInputField.container, this.descriptionInputField.container);\n\n inputFields.push(this.chatNameInputField, this.descriptionInputField);\n\n this.editPeer = new EditPeer({\n peerId,\n inputFields,\n listenerSetter: this.listenerSetter,\n popupOptions: {isForum: (chat as Chat.channel).pFlags.forum}\n });\n this.content.append(this.editPeer.nextBtn);\n\n section.content.append(this.editPeer.avatarEdit.container, inputWrapper);\n\n if(canChangeType) {\n const chatTypeRow = new Row({\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\n clickable: () => {\n const tab = this.slider.createTab(AppChatTypeTab);\n tab.chatId = this.chatId;\n tab.chatFull = chatFull;\n tab.open();\n },\n icon: 'lock',\n listenerSetter: this.listenerSetter\n });\n\n const setChatTypeSubtitle = () => {\n let key: LangPackKey;\n const username = getPeerActiveUsernames(chat as Chat.channel)[0];\n if(isBroadcast) {\n key = username ? 'TypePublic' : 'TypePrivate';\n } else {\n key = username ? 'TypePublicGroup' : 'TypePrivateGroup';\n }\n\n chatTypeRow.subtitle.replaceChildren(i18n(key));\n };\n\n setChatTypeSubtitle();\n addChatUpdateListener(setChatTypeSubtitle);\n section.content.append(chatTypeRow.container);\n }\n\n if(canChangeType || canChangePermissions) {\n const reactionsRow = new Row({\n titleLangKey: 'Reactions',\n icon: 'reactions',\n clickable: () => {\n const tab = this.slider.createTab(AppChatReactionsTab);\n tab.chatId = this.chatId;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const availableReactions = await this.managers.appReactionsManager.getAvailableReactions();\n const availableReactionsLength = availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive).length;\n const setReactionsLength = () => {\n const chatAvailableReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n if(chatAvailableReactions._ === 'chatReactionsSome') {\n const length = chatAvailableReactions.reactions.length;\n if(length === availableReactionsLength) {\n replaceContent(reactionsRow.subtitle, i18n('ReactionsAll'));\n } else {\n reactionsRow.subtitle.textContent = length + '/' + availableReactionsLength;\n }\n } else {\n replaceContent(reactionsRow.subtitle, i18n(chatAvailableReactions._ === 'chatReactionsAll' ? 'ReactionsAll' : 'Checkbox.Disabled'));\n }\n };\n\n setReactionsLength();\n addChatUpdateListener(setReactionsLength, 'full');\n section.content.append(reactionsRow.container);\n }\n\n if(canChangePermissions && !isBroadcast) {\n const flags = [\n 'send_messages',\n 'send_media',\n 'send_stickers',\n 'send_polls',\n 'embed_links',\n 'invite_users',\n 'pin_messages',\n 'change_info'\n ] as ChatRights[];\n\n const permissionsRow = new Row({\n titleLangKey: 'ChannelPermissions',\n clickable: () => {\n const tab = this.slider.createTab(AppGroupPermissionsTab);\n tab.chatId = this.chatId;\n tab.open();\n },\n icon: 'permissions',\n listenerSetter: this.listenerSetter\n });\n\n const setPermissionsLength = () => {\n permissionsRow.subtitle.textContent = flags.reduce((acc, f) => acc + +hasRights(chat, f, (chat as Chat.chat).default_banned_rights), 0) + '/' + flags.length;\n };\n\n setPermissionsLength();\n addChatUpdateListener(setPermissionsLength);\n section.content.append(permissionsRow.container);\n }\n\n if(canManageTopics && (chat.participants_count >= appConfig.forum_upgrade_participants_min || (chat as Chat.channel).pFlags.forum) && !isBroadcast) {\n const topicsRow = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Topics',\n clickable: () => {},\n icon: 'topics',\n listenerSetter: this.listenerSetter\n });\n\n const setTopics = () => {\n const isForum = !!(chat as Chat.channel).pFlags.forum;\n this.editPeer.avatarElem.parentElement.classList.toggle('is-forum', isForum);\n topicsRow.checkboxField.setValueSilently(isForum);\n };\n\n this.listenerSetter.add(topicsRow.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n const promise = this.managers.appChatsManager.toggleForum(this.chatId, topicsRow.checkboxField.checked);\n topicsRow.disableWithPromise(promise);\n });\n\n setTopics();\n addChatUpdateListener(setTopics);\n\n section.caption.replaceChildren(i18n('ForumToggleDescription'));\n section.content.append(topicsRow.container);\n }\n\n section.caption.classList.toggle('hide', !section.caption.childElementCount);\n\n /* const administratorsRow = new Row({\n titleLangKey: 'PeerInfo.Administrators',\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\n icon: 'admin',\n clickable: true\n });\n\n section.content.append(administratorsRow.container); */\n\n this.scrollable.append(section.container);\n\n attachClickEvent(this.editPeer.nextBtn, () => {\n this.editPeer.nextBtn.disabled = true;\n\n const promises: Promise[] = [];\n\n const id = this.chatId;\n if(this.chatNameInputField.isValidToChange()) {\n promises.push(this.managers.appChatsManager.editTitle(id, this.chatNameInputField.value));\n }\n\n if(this.descriptionInputField.isValidToChange()) {\n promises.push(this.managers.appChatsManager.editAbout(id, this.descriptionInputField.value));\n }\n\n if(this.editPeer.uploadAvatar) {\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\n return this.managers.appChatsManager.editPhoto(id, inputFile);\n }));\n }\n\n Promise.race(promises).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\n const discussionRow = new Row({\n titleLangKey: 'PeerInfo.Discussion',\n subtitleLangKey: 'PeerInfo.Discussion.Add',\n clickable: true,\n icon: 'message'\n });\n\n section.content.append(discussionRow.container);\n }\n\n const administratorsRow = new Row({\n titleLangKey: 'PeerInfo.Administrators',\n subtitle: '' + chatFull.admins_count,\n icon: 'admin',\n clickable: true\n });\n\n section.content.append(administratorsRow.container); */\n\n if(isBroadcast && await this.managers.appChatsManager.hasRights(this.chatId, 'change_info')) {\n const signMessagesCheckboxField = new CheckboxField({\n text: 'ChannelSignMessages',\n checked: !!(chat as Chat.channel).pFlags.signatures\n });\n\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\n const toggle = signMessagesCheckboxField.toggleDisability(true);\n this.managers.appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\n toggle();\n });\n });\n\n addChatUpdateListener(() => {\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\n });\n\n section.content.append(CreateRowFromCheckboxField(signMessagesCheckboxField).container);\n }\n }\n\n if(!isBroadcast) {\n const section = new SettingSection({\n\n });\n\n /* const membersRow = new Row({\n titleLangKey: isBroadcast ? 'PeerInfo.Subscribers' : 'GroupMembers',\n icon: 'newgroup',\n clickable: true\n });\n\n membersRow.subtitle.append(i18n('Subscribers', [numberThousandSplitter(335356)]));\n\n section.content.append(membersRow.container); */\n\n if(!isBroadcast && canChangeType) {\n const showChatHistoryCheckboxField = new CheckboxField({\n text: 'ChatHistory'\n });\n\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\n this.managers.appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\n toggle();\n });\n });\n\n // ! it won't be updated because chatFull will be old\n const onChatUpdate = () => {\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\n };\n\n onChatUpdate();\n addChatUpdateListener(onChatUpdate);\n\n section.content.append(CreateRowFromCheckboxField(showChatHistoryCheckboxField).container);\n }\n\n if(section.content.childElementCount) {\n this.scrollable.append(section.container);\n }\n }\n\n if(await this.managers.appChatsManager.hasRights(this.chatId, 'delete_chat')) {\n const section = new SettingSection({});\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\n\n attachClickEvent(btnDelete, () => {\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\n const toggle = toggleDisability([btnDelete], true);\n promise.then(() => {\n this.close();\n }, () => {\n toggle();\n });\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n\n if(!isChannel) {\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(peerId === migrateFrom) {\n this.chatId = migrateTo.toChatId();\n this._init();\n }\n });\n }\n }\n\n public init() {\n return this._init();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../../lib/rootScope';\nimport AppSearchSuper, {SearchSuperType} from '../../appSearchSuper.';\nimport SidebarSlider, {SliderSuperTab} from '../../slider';\nimport TransitionSlider from '../../transition';\nimport AppEditChatTab from './editChat';\nimport PeerTitle from '../../peerTitle';\nimport AppEditContactTab from './editContact';\nimport Button from '../../button';\nimport ButtonIcon from '../../buttonIcon';\nimport I18n, {i18n, LangPackKey} from '../../../lib/langPack';\nimport {toastNew} from '../../toast';\nimport AppAddMembersTab from '../../sidebarLeft/tabs/addMembers';\nimport PopupPickUser from '../../popups/pickUser';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerCheckboxOptions} from '../../popups/peer';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport PeerProfile from '../../peerProfile';\nimport {Message} from '../../../layer';\nimport getMessageThreadId from '../../../lib/appManagers/utils/messages/getMessageThreadId';\nimport AppEditTopicTab from './editTopic';\n\ntype SharedMediaHistoryStorage = Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n}>;\n\nconst historiesStorage: {\n [peerId: PeerId]: {\n [threadId: number]: SharedMediaHistoryStorage\n }\n} = {};\n\n// TODO: отредактированное сообщение не изменится\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId: number;\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n private titleI18n: I18n.IntlElement;\n\n public isFirst: boolean;\n\n public init() {\n // const perf = performance.now();\n\n this.container.classList.add('shared-media-container', 'profile-container');\n\n // * header\n const newCloseBtn = Button('btn-icon sidebar-close-button', {noRipple: true});\n this.closeBtn.replaceWith(newCloseBtn);\n this.closeBtn = newCloseBtn;\n\n const animatedCloseIcon = document.createElement('div');\n animatedCloseIcon.classList.add('animated-close-icon');\n newCloseBtn.append(animatedCloseIcon);\n\n if(this.isFirst) {\n animatedCloseIcon.classList.add('state-back');\n }\n\n const transitionContainer = document.createElement('div');\n transitionContainer.className = 'transition slide-fade';\n\n const transitionFirstItem = document.createElement('div');\n transitionFirstItem.classList.add('transition-item');\n\n this.titleI18n = new I18n.IntlElement();\n this.title.append(this.titleI18n.element);\n this.editBtn = ButtonIcon('edit');\n // const moreBtn = ButtonIcon('more');\n\n transitionFirstItem.append(this.title, this.editBtn/* , moreBtn */);\n\n const transitionLastItem = document.createElement('div');\n transitionLastItem.classList.add('transition-item');\n\n const secondTitle: HTMLElement = this.title.cloneNode() as any;\n secondTitle.append(i18n('PeerInfo.SharedMedia'));\n\n transitionLastItem.append(secondTitle);\n\n transitionContainer.append(transitionFirstItem, transitionLastItem);\n\n this.header.append(transitionContainer);\n\n // * body\n\n this.profile = new PeerProfile(this.managers, this.scrollable, this.listenerSetter);\n this.profile.init();\n\n this.scrollable.append(this.profile.element);\n\n const HEADER_HEIGHT = 56;\n this.scrollable.onAdditionalScroll = () => {\n const rect = this.searchSuper.nav.getBoundingClientRect();\n if(!rect.width) return;\n\n const top = rect.top - 1;\n setIsSharedMedia(top <= HEADER_HEIGHT);\n };\n\n const setIsSharedMedia = (isSharedMedia: boolean) => {\n animatedCloseIcon.classList.toggle('state-back', this.isFirst || isSharedMedia);\n this.searchSuper.container.classList.toggle('is-full-viewport', isSharedMedia);\n transition(+isSharedMedia);\n\n if(!isSharedMedia) {\n this.searchSuper.cleanScrollPositions();\n }\n };\n\n const transition = TransitionSlider({\n content: transitionContainer,\n type: 'slide-fade',\n transitionTime: 400,\n isHeavy: false\n });\n\n transition(0);\n\n attachClickEvent(this.closeBtn, (e) => {\n if(transition.prevId()) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement,\n position: 'start'\n });\n transition(0);\n\n if(!this.isFirst) {\n animatedCloseIcon.classList.remove('state-back');\n }\n } else if(!this.scrollable.isHeavyAnimationInProgress) {\n this.slider.onCloseBtnClick();\n }\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.editBtn, async() => {\n let tab: AppEditChatTab | AppEditContactTab | AppEditTopicTab;\n const {peerId, threadId} = this;\n if(threadId && await this.managers.appPeersManager.isForum(peerId)) {\n tab = this.slider.createTab(AppEditTopicTab)\n } else if(peerId.isAnyChat()) {\n tab = this.slider.createTab(AppEditChatTab);\n } else {\n tab = this.slider.createTab(AppEditContactTab);\n }\n\n if(tab) {\n if(tab instanceof AppEditTopicTab) {\n tab.open(peerId, this.threadId);\n } else {\n if(tab instanceof AppEditChatTab) {\n tab.chatId = peerId.toChatId();\n } else {\n tab.peerId = peerId;\n }\n\n tab.open();\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('contacts_update', (userId) => {\n if(this.peerId === userId) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\n this.renderNewMessage(message);\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n this.deleteDeletedMessages(peerId, Array.from(msgs));\n });\n\n // Calls when message successfully sent and we have an id\n this.listenerSetter.add(rootScope)('message_sent', ({message}) => {\n this.renderNewMessage(message);\n });\n\n // this.container.prepend(this.closeBtn.parentElement);\n\n this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'PeerMedia.Members',\n type: 'members'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }],\n scrollable: this.scrollable,\n onChangeTab: (mediaTab) => {\n const timeout = mediaTab.type === 'members' && rootScope.settings.animationsEnabled ? 250 : 0;\n setTimeout(() => {\n btnAddMembers.classList.toggle('is-hidden', mediaTab.type !== 'members');\n }, timeout);\n },\n managers: this.managers\n });\n\n this.searchSuper.scrollStartCallback = () => {\n setIsSharedMedia(true);\n };\n\n this.profile.element.append(this.searchSuper.container);\n\n const btnAddMembers = ButtonCorner({icon: 'addmember_filled'});\n this.content.append(btnAddMembers);\n\n attachClickEvent(btnAddMembers, async() => {\n const peerId = this.peerId;\n const id = this.peerId.toChatId();\n const isChannel = await this.managers.appChatsManager.isChannel(id);\n\n const showConfirmation = (peerIds: PeerId[], callback: (checked: PopupPeerButtonCallbackCheckboxes) => void) => {\n let titleLangKey: LangPackKey, titleLangArgs: any[],\n descriptionLangKey: LangPackKey, descriptionLangArgs: any[],\n checkboxes: PopupPeerCheckboxOptions[];\n\n if(peerIds.length > 1) {\n titleLangKey = 'AddMembersAlertTitle';\n titleLangArgs = [i18n('Members', [peerIds.length])];\n descriptionLangKey = 'AddMembersAlertCountText';\n descriptionLangArgs = peerIds.map((peerId) => {\n const b = document.createElement('b');\n b.append(new PeerTitle({peerId}).element);\n return b;\n });\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddMembersForwardMessages',\n checked: true\n }];\n }\n } else {\n titleLangKey = 'AddOneMemberAlertTitle';\n descriptionLangKey = 'AddMembersAlertNamesText';\n const b = document.createElement('b');\n b.append(new PeerTitle({\n peerId: peerIds[0]\n }).element);\n descriptionLangArgs = [b];\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddOneMemberForwardMessages',\n textArgs: [new PeerTitle({peerId: peerIds[0]}).element],\n checked: true\n }];\n }\n }\n\n descriptionLangArgs.push(new PeerTitle({\n peerId\n }).element);\n\n new PopupPeer('popup-add-members', {\n peerId,\n titleLangKey,\n descriptionLangKey,\n descriptionLangArgs,\n buttons: [{\n langKey: 'Add',\n callback\n }],\n checkboxes\n }).show();\n };\n\n const onError = (err: any) => {\n if(err.type === 'USER_PRIVACY_RESTRICTED') {\n toastNew({langPackKey: 'InviteToGroupError'});\n }\n };\n\n if(isChannel) {\n const tab = this.slider.createTab(AppAddMembersTab);\n tab.open({\n type: 'channel',\n skippable: false,\n takeOut: (peerIds) => {\n showConfirmation(peerIds, () => {\n const promise = this.managers.appChatsManager.inviteToChannel(id, peerIds);\n promise.catch(onError);\n tab.attachToPromise(promise);\n });\n\n return false;\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n } else {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'Search',\n onSelect: (peerId) => {\n setTimeout(() => {\n showConfirmation([peerId], (checked) => {\n this.managers.appChatsManager.addChatUser(id, peerId, checked.size ? undefined : 0)\n .catch(onError);\n });\n }, 0);\n }\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n // console.log('construct shared media time:', performance.now() - perf);\n }\n\n private _renderNewMessage(message: Message.message | Message.messageService, threadId?: number) {\n const historyStorage = historiesStorage[message.peerId]?.[threadId];\n if(!historyStorage) return;\n\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const history = historyStorage[inputFilter];\n if(!history) {\n continue;\n }\n\n const filtered = this.searchSuper.filterMessagesByType([message], inputFilter)\n .filter((message) => !history.find((m) => m.mid === message.mid && m.peerId === message.peerId));\n if(filtered.length) {\n history.unshift(...filtered.map((message) => ({mid: message.mid, peerId: message.peerId})));\n\n if(this.peerId === message.peerId && this.searchSuper.usedFromHistory[inputFilter] !== -1) {\n this.searchSuper.usedFromHistory[inputFilter] += filtered.length;\n this.searchSuper.performSearchResult(filtered, mediaTab, false);\n }\n }\n }\n }\n\n private async renderNewMessage(message: Message.message | Message.messageService) {\n if(this.init) return; // * not inited yet\n\n const {peerId} = message;\n const isForum = await this.managers.appPeersManager.isForum(peerId);\n const threadId = getMessageThreadId(message, isForum);\n\n this._renderNewMessage(message);\n if(threadId) {\n this._renderNewMessage(message, threadId);\n }\n }\n\n public _deleteDeletedMessages(historyStorage: SharedMediaHistoryStorage, peerId: PeerId, mids: number[]) {\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = historyStorage[inputFilter];\n if(!history) continue;\n\n const idx = history.findIndex((m) => m.mid === mid);\n if(idx === -1) {\n continue;\n }\n\n history.splice(idx, 1);\n\n if(this.peerId === peerId) {\n const container = this.searchSuper.tabs[inputFilter];\n const div = container.querySelector(`[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`) as HTMLElement;\n if(div) {\n if(this.searchSuper.selection.isSelecting) {\n this.searchSuper.selection.toggleByElement(div);\n }\n\n div.remove();\n }\n\n if(this.searchSuper.usedFromHistory[inputFilter] >= (idx + 1)) {\n --this.searchSuper.usedFromHistory[inputFilter];\n }\n }\n\n // can have element in different tabs somehow\n // break;\n }\n }\n }\n\n public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n const h = historiesStorage[peerId];\n if(!h) return;\n\n for(const threadId in h) {\n this._deleteDeletedMessages(h[threadId], peerId, mids);\n }\n\n this.scrollable.onScroll();\n }\n\n private async cleanupHTML() {\n // const perf = performance.now();\n const isAnyChat = this.peerId.isAnyChat();\n const [canViewMembers, hasRights] = await Promise.all([\n isAnyChat ? this.searchSuper.canViewMembers() : false,\n isAnyChat ? this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users') : false\n ]);\n\n return () => {\n this.profile.cleanupHTML();\n this.editBtn.classList.add('hide');\n this.searchSuper.cleanupHTML(true);\n this.container.classList.toggle('can-add-members', canViewMembers && hasRights);\n };\n // console.log('cleanupHTML shared media time:', performance.now() - perf);\n }\n\n public setLoadMutex(promise: Promise) {\n this.searchSuper.loadMutex = promise;\n }\n\n public setPeer(peerId: PeerId, threadId?: number) {\n if(this.peerId === peerId && this.threadId === threadId) return false;\n\n this.peerId = peerId;\n this.threadId = threadId;\n this.peerChanged = true;\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.searchSuper.setQuery({\n peerId,\n threadId,\n historyStorage: (historiesStorage[peerId] ??= {})[threadId] ??= {}\n });\n\n this.profile.setPeer(peerId, threadId);\n\n return true;\n }\n\n private async changeTitleKey() {\n const isForum = this.managers.appPeersManager.isForum(this.peerId);\n\n return () => {\n this.titleI18n.compareAndUpdate({key: this.threadId && isForum ? 'AccDescrTopic' : 'Profile'});\n };\n }\n\n public async fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n const callbacks = await Promise.all([\n this.cleanupHTML(),\n this.toggleEditBtn(true),\n this.profile.fillProfileElements(),\n this.changeTitleKey()\n ]);\n\n return () => {\n callbacks.forEach((callback) => {\n callback?.();\n });\n };\n }\n\n private async toggleEditBtn(manual?: T): Promise void : void> {\n let show: boolean;\n if(this.peerId.isUser()) {\n show = this.peerId !== rootScope.myId && await this.managers.appUsersManager.isContact(this.peerId.toUserId());\n } else {\n const chatId = this.peerId.toChatId();\n const isTopic = this.threadId && await this.managers.appChatsManager.isForum(chatId);\n show = await this.managers.appChatsManager.hasRights(chatId, isTopic ? 'manage_topics' : 'change_info');\n }\n\n const callback = () => {\n this.editBtn.classList.toggle('hide', !show);\n };\n\n return manual ? callback : callback() as any;\n }\n\n public loadSidebarMedia(single: boolean, justLoad?: boolean) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n super.onOpenAfterTimeout();\n\n this.scrollable.onScroll();\n }\n\n onCloseAfterTimeout() {\n super.onCloseAfterTimeout();\n\n if(this.destroyable) {\n this.profile.destroy();\n this.searchSuper.destroy();\n }\n }\n\n public destroy() {\n this.destroyable = true;\n this.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\n\ntype SetTransitionOptions = {\n element: HTMLElement,\n className: string,\n forwards: boolean,\n duration: number,\n onTransitionEnd?: () => void,\n useRafs?: number,\n onTransitionStart?: () => void\n};\nconst SetTransition = (options: SetTransitionOptions) => {\n const {element, className, forwards, duration, onTransitionEnd, onTransitionStart, useRafs} = options;\n const {timeout, raf} = element.dataset;\n if(timeout !== undefined) {\n clearTimeout(+timeout);\n }\n\n // useRafs = undefined;\n // duration = 0;\n\n if(raf !== undefined) {\n window.cancelAnimationFrame(+raf);\n if(!useRafs) {\n delete element.dataset.raf;\n }\n }\n\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\n // return;\n // }\n\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\n delete element.dataset.raf;\n SetTransition({\n ...options,\n useRafs: useRafs - 1\n });\n });\n\n return;\n }\n\n if(forwards && className) {\n element.classList.add(className);\n }\n\n const afterTimeout = () => {\n delete element.dataset.timeout;\n if(!forwards && className) {\n element.classList.remove('backwards', className);\n }\n\n element.classList.remove('animating');\n\n onTransitionEnd?.();\n };\n\n onTransitionStart?.();\n if(!rootScope.settings.animationsEnabled || !duration) {\n element.classList.remove('animating', 'backwards');\n afterTimeout();\n return;\n }\n\n element.classList.add('animating');\n\n element.classList.toggle('backwards', !forwards);\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\n};\n\nexport default SetTransition;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {horizontalMenu} from './horizontalMenu';\nimport TransitionSlider from './transition';\nimport appNavigationController, {NavigationItem} from './appNavigationController';\nimport SliderSuperTab, {SliderSuperTabConstructable} from './sliderTab';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport {MaybePromise} from '../types';\n\nconst TRANSITION_TIME = 250;\n\nexport {SliderSuperTab};\n\nexport default class SidebarSlider {\n protected _selectTab: ReturnType;\n protected historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\n protected tabsContainer: HTMLElement;\n public sidebarEl: HTMLElement;\n protected tabs: Map; // * key is any, since right sidebar is ugly now\n private canHideFirst = false;\n private navigationType: NavigationItem['type'];\n protected managers: AppManagers;\n protected middlewareHelper: MiddlewareHelper;\n public onOpenTab: () => MaybePromise;\n\n constructor(options: {\n sidebarEl: SidebarSlider['sidebarEl'],\n tabs?: SidebarSlider['tabs'],\n canHideFirst?: SidebarSlider['canHideFirst'],\n navigationType: SidebarSlider['navigationType']\n }) {\n safeAssign(this, options);\n\n this.tabs ??= new Map();\n\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\n this._selectTab = TransitionSlider({\n content: this.tabsContainer,\n type: 'navigation',\n transitionTime: TRANSITION_TIME\n });\n if(!this.canHideFirst) {\n this._selectTab(0);\n }\n\n this.middlewareHelper = getMiddleware();\n\n // Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach((el) => {\n // attachClickEvent(el, this.onCloseBtnClick);\n // });\n }\n\n public getMiddleware() {\n return this.middlewareHelper.get();\n }\n\n public onCloseBtnClick = () => {\n const item = appNavigationController.findItemByType(this.navigationType);\n if(item) {\n appNavigationController.back(this.navigationType);\n } else if(this.historyTabIds.length) {\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\n }\n // this.closeTab();\n };\n\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\n this.removeTabFromHistory(id);\n return false;\n }\n\n // console.log('sidebar-close-button click:', this.historyTabIDs);\n const closingId = this.historyTabIds.pop(); // pop current\n this.onCloseTab(closingId, animate, isNavigation);\n\n const tab = this.historyTabIds[this.historyTabIds.length - 1];\n this._selectTab(tab !== undefined ? (tab instanceof SliderSuperTab ? tab.container : tab) : (this.canHideFirst ? -1 : 0), animate);\n return true;\n };\n\n public async selectTab(id: number | SliderSuperTab) {\n /* if(id instanceof SliderSuperTab) {\n id = id.id;\n } */\n\n if(this.historyTabIds[this.historyTabIds.length - 1] === id) {\n return false;\n }\n\n const tab: SliderSuperTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\n this.onOpenTab && await this.onOpenTab();\n\n if(tab) {\n // @ts-ignore\n tab.onOpen?.();\n\n // @ts-ignore\n if(tab.onOpenAfterTimeout) {\n setTimeout(() => {\n // @ts-ignore\n tab.onOpenAfterTimeout();\n }, TRANSITION_TIME);\n }\n }\n\n // if(!this.canHideFirst || this.historyTabIds.length) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: (canAnimate) => {\n this.closeTab(undefined, canAnimate, true);\n return true;\n }\n });\n // }\n\n this.historyTabIds.push(id);\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\n return true;\n }\n\n public removeTabFromHistory(id: number | SliderSuperTab) {\n indexOfAndSplice(this.historyTabIds, id);\n this.onCloseTab(id, undefined);\n }\n\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\n const tab = this.historyTabIds[i];\n if(tab === preserveTab) continue;\n else if(tab instanceof tabConstructor) {\n break;\n }\n\n this.removeTabFromHistory(tab);\n // appNavigationController.removeByType(this.navigationType, true);\n }\n }\n\n public getTab(tabConstructor: SliderSuperTabConstructable) {\n return this.historyTabIds.find((t) => t instanceof tabConstructor) as T;\n }\n\n public getHistory() {\n return this.historyTabIds;\n }\n\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\n return !!this.getTab(tabConstructor);\n }\n\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\n if(!isNavigation) {\n appNavigationController.removeByType(this.navigationType, true);\n }\n\n const tab: SliderSuperTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\n if(tab) {\n try {\n // @ts-ignore\n tab.onClose?.();\n } catch(err) {\n console.error('tab onClose error', tab);\n }\n\n // @ts-ignore\n if(tab.onCloseAfterTimeout) {\n setTimeout(() => {\n // @ts-ignore\n tab.onCloseAfterTimeout();\n }, TRANSITION_TIME + 30);\n }\n }\n }\n\n public addTab(tab: SliderSuperTab) {\n if(!tab.container.parentElement) {\n this.tabsContainer.append(tab.container);\n\n if(tab.closeBtn) {\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\n }\n }\n }\n\n public deleteTab(tab: SliderSuperTab) {\n this.tabs.delete(tab);\n }\n\n public createTab(\n ctor: SliderSuperTabConstructable,\n destroyable = true,\n doNotAppend?: boolean\n ) {\n const tab = new ctor(doNotAppend ? undefined : this, destroyable);\n tab.managers = this.managers;\n return tab;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport noop from '../helpers/noop';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport ButtonIcon from './buttonIcon';\nimport Scrollable from './scrollable';\nimport SidebarSlider from './slider';\n\nexport interface SliderSuperTabConstructable {\n new(slider: SidebarSlider, destroyable: boolean): T;\n}\n\nexport interface SliderSuperTabEventableConstructable {\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTabEventable;\n}\n\nexport default class SliderSuperTab {\n public static getInitArgs?(fromTab: SliderSuperTab): any;\n\n public container: HTMLElement;\n\n public header: HTMLElement;\n public closeBtn: HTMLElement;\n public title: HTMLElement;\n\n public content: HTMLElement;\n public scrollable: Scrollable;\n\n public slider: SidebarSlider;\n public destroyable: boolean;\n public listenerSetter: ListenerSetter;\n\n public managers: AppManagers;\n public middlewareHelper: MiddlewareHelper;\n\n constructor(slider: SidebarSlider, destroyable?: boolean) {\n this._constructor(slider, destroyable);\n }\n\n public _constructor(slider: SidebarSlider, destroyable = true): any {\n this.slider = slider;\n this.middlewareHelper = slider ? slider.getMiddleware().create() : getMiddleware();\n this.destroyable = destroyable;\n\n this.container = document.createElement('div');\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\n\n // * Header\n this.header = document.createElement('div');\n this.header.classList.add('sidebar-header');\n\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\n this.title = document.createElement('div');\n this.title.classList.add('sidebar-header__title');\n this.header.append(this.closeBtn, this.title);\n\n // * Content\n this.content = document.createElement('div');\n this.content.classList.add('sidebar-content');\n\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\n this.scrollable.attachBorderListeners(this.container);\n\n this.container.append(this.header, this.content);\n\n this.slider?.addTab(this);\n\n this.listenerSetter = new ListenerSetter();\n }\n\n public close() {\n return this.slider.closeTab(this);\n }\n\n public async open(...args: Parameters) {\n if(this.init) {\n try {\n const result = this.init(...args);\n this.init = null;\n\n if(result instanceof Promise) {\n await result;\n }\n } catch(err) {\n console.error('open tab error', err);\n }\n }\n\n this.slider.selectTab(this);\n }\n\n public init(...args: any[]): Promise | any {\n\n }\n\n protected onOpen() {}\n protected onOpenAfterTimeout() {}\n protected onClose() {}\n\n protected onCloseAfterTimeout() {\n if(this.destroyable) { // ! WARNING, пока что это будет работать только с самой последней внутренней вкладкой !\n this.slider?.deleteTab(this);\n this.container.remove();\n this.scrollable.destroy();\n this.listenerSetter?.removeAll();\n this.middlewareHelper?.destroy();\n }\n }\n\n protected setTitle(key: LangPackKey) {\n this.title.replaceChildren(i18n(key));\n }\n}\n\nexport class SliderSuperTabEventable extends SliderSuperTab {\n public eventListener: EventListenerBase<{\n destroy: () => void | Promise,\n destroyAfter: (promise: Promise) => void,\n close: () => void\n }>;\n\n constructor(slider: SidebarSlider) {\n super(slider);\n this.eventListener = new EventListenerBase();\n }\n\n onClose() {\n this.eventListener.dispatchEvent('close');\n }\n\n onCloseAfterTimeout() {\n const results = this.eventListener.dispatchResultableEvent('destroy');\n this.eventListener.dispatchEvent('destroyAfter', Promise.all(results).then(noop, noop));\n this.eventListener.cleanup();\n return super.onCloseAfterTimeout();\n }\n}\n\n/* // @ts-ignore\ninterface SliderSuperEventsTab extends SliderSuperTab, EventListenerBase<{}> {\n superConstructor: (...args: any[]) => any;\n}\nclass SliderSuperEventsTab implements SliderSuperEventsTab {\n constructor(slider: SidebarSlider) {\n this.superConstructor([slider, true]);\n }\n}\napplyMixins(SliderSuperEventsTab, [SliderSuperTab, EventListenerBase]);\n\n(window as any).lol = SliderSuperEventsTab\n\nexport {SliderSuperEventsTab}; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager, {AppDialogsManager, DialogDom, DialogElementSize} from '../lib/appManagers/appDialogsManager';\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {fastRaf} from '../helpers/schedulers';\nimport SortedList, {SortedElementBase} from '../helpers/sortedList';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport type LazyLoadQueue from './lazyLoadQueue';\n\ninterface SortedUser extends SortedElementBase {\n dom: DialogDom\n}\n\nexport default class SortedUserList extends SortedList {\n protected static SORT_INTERVAL = 30e3;\n public list: HTMLUListElement;\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected avatarSize: DialogElementSize = 'abitbigger';\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0];\n protected onListLengthChange: () => void;\n protected getIndex: (element: SortedUser) => number;\n protected onUpdate: (element: SortedUser) => void;\n protected managers: AppManagers;\n\n constructor(options: Partial<{\n lazyLoadQueue: SortedUserList['lazyLoadQueue'],\n avatarSize: SortedUserList['avatarSize'],\n rippleEnabled: SortedUserList['rippleEnabled'],\n createChatListOptions: SortedUserList['createChatListOptions'],\n autonomous: SortedUserList['autonomous'],\n onListLengthChange: SortedUserList['onListLengthChange'],\n getIndex: SortedUserList['getIndex'],\n onUpdate: SortedUserList['onUpdate']\n }> & {\n managers: SortedUserList['managers']\n }) {\n super({\n getIndex: options.getIndex || ((element) => this.managers.appUsersManager.getUserStatusForSort(element.id)),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onUpdate: options.onUpdate || (async(element) => {\n const status = getUserStatusString(await this.managers.appUsersManager.getUser(element.id));\n replaceContent(element.dom.lastMessageSpan, status);\n }),\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength && this.onListLengthChange) {\n this.onListLengthChange();\n }\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n wrapOptions: {\n lazyLoadQueue: this.lazyLoadQueue\n }\n });\n\n (base as SortedUser).dom = dom;\n return base as SortedUser;\n },\n updateElementWith: fastRaf,\n updateListWith: async(callback) => {\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n await getHeavyAnimationPromise();\n\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n callback(true);\n }\n });\n\n safeAssign(this, options);\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n\n let timeout: number;\n const doTimeout = () => {\n timeout = window.setTimeout(() => {\n this.updateList((good) => {\n if(good) {\n doTimeout();\n }\n });\n }, SortedUserList.SORT_INTERVAL);\n };\n\n doTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {simulateClickEvent, attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport getVisibleRect from '../helpers/dom/getVisibleRect';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {makeMediaSize} from '../helpers/mediaSize';\nimport {getMiddleware, Middleware} from '../helpers/middleware';\nimport {doubleRaf} from '../helpers/schedulers';\nimport pause from '../helpers/schedulers/pause';\nimport windowSize from '../helpers/windowSize';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport getStickerEffectThumb from '../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport {CustomEmojiElement} from '../lib/richTextProcessor/wrapRichText';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport rootScope from '../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from './animationIntersector';\nimport SetTransition from './singleTransition';\nimport wrapSticker from './wrappers/sticker';\nimport {STICKER_EFFECT_MULTIPLIER} from './wrappers/sticker';\n\nlet hasViewer = false;\nexport default function attachStickerViewerListeners({listenTo, listenerSetter, selector, findTarget: originalFindTarget}: {\n listenerSetter: ListenerSetter,\n listenTo: HTMLElement,\n selector?: string,\n findTarget?: (e: MouseEvent) => HTMLElement\n}) {\n if(IS_TOUCH_SUPPORTED) {\n return;\n }\n\n const findTarget = (e: MouseEvent, checkForParent?: boolean) => {\n let el: HTMLElement;\n if(originalFindTarget) el = originalFindTarget(e);\n else {\n const s = selector || `.media-sticker-wrapper`;\n el = (e.target as HTMLElement).closest(s) as HTMLElement;\n }\n\n return el && (!checkForParent || findUpAsChild(el, listenTo)) ? el : undefined;\n };\n\n const managers = rootScope.managers;\n\n listenerSetter.add(listenTo)('mousedown', (e) => {\n if(hasViewer || e.buttons > 1 || e.button !== 0) return;\n let mediaContainer = findTarget(e);\n if(!mediaContainer) {\n return;\n }\n\n // const img: HTMLImageElement = mediaContainer.querySelector('img.media-sticker');\n\n const docId = mediaContainer.dataset.docId;\n if(!docId) {\n return;\n }\n\n const className = 'sticker-viewer';\n const group: AnimationItemGroup = 'STICKER-VIEWER';\n const openDuration = 200;\n const switchDuration = 200;\n const previousGroup = animationIntersector.getOnlyOnePlayableGroup();\n const _middleware = getMiddleware();\n let container: HTMLElement, previousTransformer: HTMLElement;\n\n const doThatSticker = async({mediaContainer, doc, middleware, lockGroups, isSwitching}: {\n mediaContainer: HTMLElement,\n doc: MyDocument,\n middleware: Middleware,\n lockGroups?: boolean,\n isSwitching?: boolean\n }) => {\n const effectThumb = getStickerEffectThumb(doc);\n const mediaRect: DOMRect = mediaContainer.getBoundingClientRect();\n const s = makeMediaSize(doc.w, doc.h);\n const size = effectThumb ? 280 : 360;\n const boxSize = makeMediaSize(size, size);\n const fitted = mediaRect.width === mediaRect.height ? boxSize : s.aspectFitted(boxSize);\n\n const bubble = findUpClassName(mediaContainer, 'bubble');\n const isOut = bubble ? bubble.classList.contains('is-out') : true;\n\n const transformer = document.createElement('div');\n transformer.classList.add(className + '-transformer');\n\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add(className + '-sticker');\n /* transformer.style.width = */stickerContainer.style.width = fitted.width + 'px';\n /* transformer.style.height = */stickerContainer.style.height = fitted.height + 'px';\n\n const stickerEmoji = document.createElement('div');\n stickerEmoji.classList.add(className + '-emoji');\n stickerEmoji.append(wrapEmojiText(doc.stickerEmojiRaw));\n\n if(effectThumb) {\n const margin = (size * STICKER_EFFECT_MULTIPLIER - size) / 3 * (isOut ? 1 : -1);\n transformer.classList.add('has-effect');\n // const property = `--margin-${isOut ? 'right' : 'left'}`;\n // stickerContainer.style.setProperty(property, `${margin * 2}px`);\n transformer.style.setProperty('--translateX', `${margin}px`);\n stickerEmoji.style.setProperty('--translateX', `${-margin}px`);\n }\n\n const overflowElement = findUpClassName(mediaContainer, 'scrollable');\n const visibleRect = getVisibleRect(mediaContainer, overflowElement, true, mediaRect);\n if(visibleRect.overflow.vertical || visibleRect.overflow.horizontal) {\n stickerContainer.classList.add('is-overflow');\n }\n\n // if(img) {\n // const ratio = img.naturalWidth / img.naturalHeight;\n // if((mediaRect.width / mediaRect.height).toFixed(1) !== ratio.toFixed(1)) {\n\n // mediaRect = mediaRect.toJSON();\n // }\n // }\n\n const rect = mediaContainer.getBoundingClientRect();\n const scaleX = rect.width / fitted.width;\n const scaleY = rect.height / fitted.height;\n const transformX = rect.left - (windowSize.width - rect.width) / 2;\n const transformY = rect.top - (windowSize.height - rect.height) / 2;\n transformer.style.transform = `translate(${transformX}px, ${transformY}px) scale(${scaleX}, ${scaleY})`;\n if(isSwitching) transformer.classList.add('is-switching');\n transformer.append(stickerContainer, stickerEmoji);\n container.append(transformer);\n\n const o = await wrapSticker({\n doc,\n div: stickerContainer,\n group,\n width: fitted.width,\n height: fitted.height,\n play: false,\n loop: true,\n middleware,\n managers,\n needFadeIn: false,\n isOut,\n withThumb: false,\n relativeEffect: true,\n loopEffect: true\n }).then(({render}) => render);\n if(!middleware()) return;\n\n if(!container.parentElement) {\n document.body.append(container);\n }\n\n const player = Array.isArray(o) ? o[0] : o;\n\n const firstFramePromise = player instanceof RLottiePlayer ?\n new Promise((resolve) => player.addEventListener('firstFrame', resolve, {once: true})) :\n Promise.resolve();\n await Promise.all([firstFramePromise, doubleRaf()]);\n await pause(0); // ! need it because firstFrame will be called just from the loop\n if(!middleware()) return;\n\n if(lockGroups) {\n animationIntersector.setOnlyOnePlayableGroup(group);\n animationIntersector.checkAnimations2(true);\n }\n\n if(player instanceof RLottiePlayer) {\n const prevPlayer = mediaContainer instanceof CustomEmojiElement ?\n mediaContainer.player as RLottiePlayer :\n lottieLoader.getAnimation(mediaContainer);\n if(prevPlayer) {\n player.curFrame = prevPlayer.curFrame;\n player.play();\n await new Promise((resolve) => {\n let i = 0;\n const c = () => {\n if(++i === 2) {\n resolve();\n player.removeEventListener('enterFrame', c);\n }\n };\n\n player.addEventListener('enterFrame', c);\n });\n if(!middleware()) return;\n player.pause();\n }\n } else if(player instanceof HTMLVideoElement) {\n const prevPlayer = mediaContainer.querySelector('video');\n if(prevPlayer) {\n player.currentTime = prevPlayer.currentTime;\n }\n }\n\n return {\n ready: () => {\n if(player instanceof RLottiePlayer || player instanceof HTMLVideoElement) {\n player.play();\n }\n\n if(effectThumb) {\n simulateClickEvent(stickerContainer);\n }\n },\n transformer\n };\n };\n\n const timeout = window.setTimeout(async() => {\n document.removeEventListener('mousemove', onMousePreMove);\n\n container = document.createElement('div');\n container.classList.add(className);\n hasViewer = true;\n\n const middleware = _middleware.get();\n const doc = await managers.appDocsManager.getDoc(docId);\n if(!middleware()) return;\n\n let result: Awaited>;\n try {\n result = await doThatSticker({\n doc,\n mediaContainer,\n middleware,\n lockGroups: true\n });\n if(!result) return;\n } catch(err) {\n return;\n }\n\n const {ready, transformer} = result;\n\n previousTransformer = transformer;\n\n SetTransition({\n element: container,\n className: 'is-visible',\n forwards: true,\n duration: openDuration,\n onTransitionEnd: () => {\n if(!middleware()) return;\n ready();\n }\n });\n\n document.addEventListener('mousemove', onMouseMove);\n }, 125);\n\n const onMouseMove = async(e: MouseEvent) => {\n const newMediaContainer = findTarget(e, true);\n if(!newMediaContainer || mediaContainer === newMediaContainer) {\n return;\n }\n\n const docId = newMediaContainer.dataset.docId;\n if(!docId) {\n return;\n }\n\n mediaContainer = newMediaContainer;\n _middleware.clean();\n const middleware = _middleware.get();\n\n const doc = await managers.appDocsManager.getDoc(docId);\n if(!middleware()) return;\n\n let r: Awaited>;\n try {\n r = await doThatSticker({\n doc,\n mediaContainer,\n middleware,\n isSwitching: true\n });\n if(!r) return;\n } catch(err) {\n console.error('sticker viewer error', err);\n return;\n }\n\n const {ready, transformer} = r;\n\n const _previousTransformer = previousTransformer;\n SetTransition({\n element: _previousTransformer,\n className: 'is-switching',\n forwards: true,\n duration: switchDuration,\n onTransitionEnd: () => {\n _previousTransformer.remove();\n }\n });\n\n previousTransformer = transformer;\n\n SetTransition({\n element: transformer,\n className: 'is-switching',\n forwards: false,\n duration: switchDuration,\n onTransitionEnd: () => {\n if(!middleware()) return;\n ready();\n }\n });\n };\n\n const onMousePreMove = (e: MouseEvent) => {\n if(!findUpAsChild(e.target as HTMLElement, mediaContainer)) {\n onMouseUp();\n }\n };\n\n const onMouseUp = () => {\n clearTimeout(timeout);\n _middleware.clean();\n\n if(container) {\n SetTransition({\n element: container,\n className: 'is-visible',\n forwards: false,\n duration: openDuration,\n onTransitionEnd: () => {\n container.remove();\n animationIntersector.setOnlyOnePlayableGroup(previousGroup);\n animationIntersector.checkAnimations2(false);\n hasViewer = false;\n }\n });\n\n attachClickEvent(document.body, cancelEvent, {capture: true, once: true});\n }\n\n document.removeEventListener('mousemove', onMousePreMove);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp, {capture: true});\n };\n\n document.addEventListener('mousemove', onMousePreMove);\n document.addEventListener('mouseup', onMouseUp, {once: true, capture: true});\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class StickyIntersector {\n private headersObserver: IntersectionObserver;\n private elementsObserver: IntersectionObserver;\n\n constructor(private container: HTMLElement, private handler: (stuck: boolean, target: HTMLElement) => void) {\n this.observeHeaders();\n this.observeElements();\n }\n\n /**\n * Sets up an intersection observer to notify when elements with the class\n * `.sticky_sentinel--top` become visible/invisible at the top of the container.\n * @param {!Element} container\n */\n private observeHeaders() {\n this.headersObserver = new IntersectionObserver((entries) => {\n for(const entry of entries) {\n const targetInfo = entry.boundingClientRect;\n const stickyTarget = entry.target.parentElement;\n const rootBoundsInfo = entry.rootBounds;\n\n // Started sticking.\n if(targetInfo.bottom < rootBoundsInfo.top) {\n this.handler(true, stickyTarget);\n }\n\n // Stopped sticking.\n if(targetInfo.bottom >= rootBoundsInfo.top &&\n targetInfo.bottom < rootBoundsInfo.bottom) {\n this.handler(false, stickyTarget);\n }\n }\n }, {threshold: 0, root: this.container});\n }\n\n private observeElements() {\n this.elementsObserver = new IntersectionObserver((entries) => {\n const entry = entries\n .filter((entry) => entry.boundingClientRect.top < entry.rootBounds.top)\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\n if(!entry) return;\n\n const container = entry.isIntersecting ? entry.target : entry.target.nextElementSibling;\n this.handler(true, container as HTMLElement);\n }, {root: this.container});\n }\n\n /**\n * @param {!Element} container\n * @param {string} className\n */\n private addSentinel(container: HTMLElement, className: string) {\n const sentinel = document.createElement('div');\n sentinel.classList.add('sticky_sentinel', className);\n return container.appendChild(sentinel);\n }\n\n /**\n * Notifies when elements w/ the `sticky` class begin to stick or stop sticking.\n * Note: the elements should be children of `container`.\n * @param {!Element} container\n */\n public observeStickyHeaderChanges(element: HTMLElement) {\n const headerSentinel = this.addSentinel(element, 'sticky_sentinel--top');\n this.headersObserver.observe(headerSentinel);\n\n this.elementsObserver.observe(element);\n }\n\n public disconnect() {\n this.headersObserver.disconnect();\n this.elementsObserver.disconnect();\n }\n\n public unobserve(element: HTMLElement, headerSentinel: HTMLElement) {\n this.elementsObserver.unobserve(element);\n this.headersObserver.unobserve(headerSentinel);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport safeAssign from '../helpers/object/safeAssign';\nimport contextMenuController from '../helpers/contextMenuController';\nimport {Middleware} from '../helpers/middleware';\nimport ListenerSetter, {Listener, ListenerOptions} from '../helpers/listenerSetter';\nimport {attachContextMenuListener} from '../helpers/dom/attachContextMenuListener';\nimport pause from '../helpers/schedulers/pause';\nimport deferredPromise from '../helpers/cancellablePromise';\n\ntype E = {\n clientX: number,\n clientY: number,\n target: EventTarget,\n button?: number\n};\n\ntype EE = E | (Exclude & {\n touches: E[]\n});\n\nconst getEvent = (e: EE) => {\n return 'touches' in e ? e.touches[0] : e;\n};\n\nconst attachGlobalListenerTo = document;\n\nlet RESET_GLOBAL = false;\ncontextMenuController.addEventListener('toggle', (visible) => {\n RESET_GLOBAL = visible;\n});\n\nexport type SwipeHandlerOptions = {\n element: SwipeHandler['element'],\n onSwipe: SwipeHandler['onSwipe'],\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\n onReset?: SwipeHandler['onReset'],\n onStart?: SwipeHandler['onStart'],\n cursor?: SwipeHandler['cursor'],\n cancelEvent?: SwipeHandler['cancelEvent'],\n listenerOptions?: SwipeHandler['listenerOptions'],\n setCursorTo?: HTMLElement,\n middleware?: Middleware,\n withDelay?: boolean\n};\n\nconst TOUCH_MOVE_OPTIONS: ListenerOptions = {passive: false};\nconst MOUSE_MOVE_OPTIONS: ListenerOptions = false as any;\n\nexport default class SwipeHandler {\n private element: HTMLElement;\n private onSwipe: (xDiff: number, yDiff: number, e: EE) => boolean | void;\n private verifyTouchTarget: (evt: EE) => boolean | Promise;\n private onFirstSwipe: (e: EE) => void;\n private onReset: () => void;\n private onStart: () => void;\n private cursor: 'grabbing' | 'move' | 'row-resize' | 'col-resize' | 'nesw-resize' | 'nwse-resize' | 'ne-resize' | 'se-resize' | 'sw-resize' | 'nw-resize' | 'n-resize' | 'e-resize' | 's-resize' | 'w-resize' | '';\n private cancelEvent: boolean;\n private listenerOptions: ListenerOptions;\n private setCursorTo: HTMLElement;\n\n private isMouseDown: boolean;\n private tempId: number;\n\n private hadMove: boolean;\n private eventUp: E;\n private xDown: number;\n private yDown: number;\n private xAdded: number;\n private yAdded: number;\n\n private withDelay: boolean;\n private listenerSetter: ListenerSetter;\n\n constructor(options: SwipeHandlerOptions) {\n safeAssign(this, options);\n\n this.cursor ??= 'grabbing';\n this.cancelEvent ??= true;\n // this.listenerOptions ??= false as any;\n this.listenerOptions ??= TOUCH_MOVE_OPTIONS;\n\n this.setCursorTo ??= this.element;\n this.listenerSetter = new ListenerSetter();\n this.setListeners();\n\n this.resetValues();\n this.tempId = 0;\n\n options.middleware?.onDestroy(() => {\n this.reset();\n this.removeListeners();\n });\n }\n\n public setListeners() {\n if(!IS_TOUCH_SUPPORTED) {\n // @ts-ignore\n this.listenerSetter.add(this.element)('mousedown', this.handleStart, this.listenerOptions);\n this.listenerSetter.add(attachGlobalListenerTo)('mouseup', this.reset);\n } else {\n if(this.withDelay) {\n attachContextMenuListener({\n element: this.element,\n callback: (e) => {\n cancelEvent(e);\n // @ts-ignore\n this.handleStart(e);\n },\n listenerSetter: this.listenerSetter,\n listenerOptions: this.listenerOptions\n });\n } else {\n // @ts-ignore\n this.listenerSetter.add(this.element)('touchstart', this.handleStart, this.listenerOptions);\n }\n\n this.listenerSetter.add(attachGlobalListenerTo)('touchend', this.reset);\n }\n }\n\n public removeListeners() {\n this.listenerSetter.removeAll();\n }\n\n public setCursor(cursor: SwipeHandler['cursor'] = '') {\n this.cursor = cursor;\n\n if(!IS_TOUCH_SUPPORTED && this.hadMove) {\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\n }\n }\n\n public add(x: number, y: number) {\n this.xAdded = x;\n this.yAdded = y;\n this.handleMove({\n clientX: this.eventUp.clientX,\n clientY: this.eventUp.clientY,\n target: this.eventUp.target\n });\n }\n\n protected resetValues() {\n ++this.tempId;\n this.hadMove = false;\n this.xAdded = this.yAdded = 0;\n this.xDown =\n this.yDown =\n this.eventUp =\n this.isMouseDown =\n undefined;\n }\n\n protected reset = (e?: Event) => {\n /* if(e) {\n cancelEvent(e);\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n this.listenerSetter.removeManual(attachGlobalListenerTo, 'touchmove', this.handleMove, TOUCH_MOVE_OPTIONS);\n } else {\n this.listenerSetter.removeManual(attachGlobalListenerTo, 'mousemove', this.handleMove, MOUSE_MOVE_OPTIONS);\n this.setCursorTo.style.cursor = '';\n }\n\n if(this.hadMove) {\n this.onReset?.();\n }\n\n this.resetValues();\n };\n\n protected handleStart = async(_e: EE) => {\n if(this.isMouseDown) {\n return;\n }\n\n const e = getEvent(_e);\n if(Math.max(0, e.button ?? 0) !== 0) {\n return;\n }\n\n if(this.verifyTouchTarget && !(await this.verifyTouchTarget(_e))) {\n return this.reset();\n }\n\n const tempId = ++this.tempId;\n this.isMouseDown = true;\n\n if(this.withDelay && !IS_TOUCH_SUPPORTED) {\n const options = {...MOUSE_MOVE_OPTIONS, once: true};\n const deferred = deferredPromise();\n const cb = () => deferred.resolve();\n const listener = this.listenerSetter.add(attachGlobalListenerTo)('mousemove', cb, options) as any as Listener;\n\n await Promise.race([\n pause(300),\n deferred\n ]);\n\n deferred.resolve();\n this.listenerSetter.remove(listener);\n\n if(this.tempId !== tempId) {\n return;\n }\n }\n\n this.xDown = e.clientX;\n this.yDown = e.clientY;\n this.eventUp = e;\n\n if(IS_TOUCH_SUPPORTED) {\n // @ts-ignore\n this.listenerSetter.add(attachGlobalListenerTo)('touchmove', this.handleMove, TOUCH_MOVE_OPTIONS);\n } else {\n // @ts-ignore\n this.listenerSetter.add(attachGlobalListenerTo)('mousemove', this.handleMove, MOUSE_MOVE_OPTIONS);\n }\n\n if(this.onStart) {\n this.onStart();\n\n // have to initiate move instantly\n this.hadMove = true;\n this.handleMove(e);\n }\n };\n\n protected handleMove = (_e: EE) => {\n if(this.xDown === undefined || this.yDown === undefined || RESET_GLOBAL) {\n this.reset();\n return;\n }\n\n if(this.cancelEvent) {\n cancelEvent(_e as any);\n }\n\n const e = this.eventUp = getEvent(_e);\n const xUp = e.clientX;\n const yUp = e.clientY;\n\n const xDiff = xUp - this.xDown + this.xAdded;\n const yDiff = yUp - this.yDown + this.yAdded;\n\n if(!this.hadMove) {\n if(!xDiff && !yDiff) {\n return;\n }\n\n this.hadMove = true;\n\n if(!IS_TOUCH_SUPPORTED) {\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\n }\n\n this.onFirstSwipe?.(_e);\n }\n\n const onSwipeResult = this.onSwipe(xDiff, yDiff, _e);\n if(onSwipeResult !== undefined && onSwipeResult) {\n this.reset();\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\nimport {formatPhoneNumber} from '../helpers/formatPhoneNumber';\nimport {IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE} from '../environment/userAgent';\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport InputField, {InputFieldOptions} from './inputField';\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n\n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n // plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n const telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n // console.log('input', this.value);\n telEl.classList.remove('error');\n\n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n\n this.pasted = false;\n\n this.setLabel();\n\n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n\n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n\n // console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n\n telEl.addEventListener('paste', () => {\n this.pasted = true;\n // console.log('paste', telEl.value);\n });\n\n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n\n telEl.addEventListener('keypress', (e) => {\n // console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../helpers/dom/replaceContent';\nimport OverlayClickHandler from '../helpers/overlayClickHandler';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\n\nconst toastEl = document.createElement('div');\ntoastEl.classList.add('toast');\nlet timeout: number;\n\nconst x = new OverlayClickHandler('toast');\nx.addEventListener('toggle', (open) => {\n if(!open) {\n hideToast();\n }\n});\n\nexport function hideToast() {\n x.close();\n\n toastEl.classList.remove('is-visible');\n timeout && clearTimeout(+timeout);\n\n timeout = window.setTimeout(() => {\n toastEl.remove();\n timeout = undefined;\n }, 200);\n}\n\nexport function toast(content: string | Node, onClose?: () => void) {\n x.close();\n\n replaceContent(toastEl, content);\n\n if(!toastEl.parentElement) {\n document.body.append(toastEl);\n void toastEl.offsetLeft; // reflow\n }\n\n toastEl.classList.add('is-visible');\n\n timeout && clearTimeout(+timeout);\n x.open(toastEl);\n\n timeout = window.setTimeout(hideToast, 3000);\n\n if(onClose) {\n x.addEventListener('toggle', onClose, {once: true});\n }\n}\n\nexport function toastNew(options: Partial<{\n langPackKey: LangPackKey,\n langPackArguments: FormatterArguments,\n onClose: () => void\n}>) {\n toast(i18n(options.langPackKey, options.langPackArguments), options.onClose);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\nimport whichChild from '../helpers/dom/whichChild';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\n\nfunction makeTransitionFunction(options: TransitionFunction) {\n return options;\n}\n\nconst slideNavigation = makeTransitionFunction({\n callback: (tabContent, prevTabContent, toRight) => {\n const width = prevTabContent.getBoundingClientRect().width;\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.filter = `brightness(80%)`;\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n tabContent.style.filter = '';\n\n return () => {\n prevTabContent.style.transform = prevTabContent.style.filter = '';\n };\n },\n animateFirst: false\n});\n\nconst slideTabs = makeTransitionFunction({\n callback: (tabContent, prevTabContent, toRight) => {\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\n // scrollableContainer.style.overflowY = 'hidden';\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\n // // this.container.classList.add('sliding');\n // }\n\n // window.requestAnimationFrame(() => {\n const width = prevTabContent.getBoundingClientRect().width;\n /* tabContent.style.setProperty('--width', width + 'px');\n prevTabContent.style.setProperty('--width', width + 'px');\n\n tabContent.classList.add('active'); */\n // void tabContent.offsetWidth; // reflow\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n // });\n\n return () => {\n prevTabContent.style.transform = '';\n\n // if(scrollableContainer) {\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\n // scrollableContainer.style.display = 'none';\n // }\n\n // scrollableContainer.style.overflowY = '';\n\n // if(isSafari) {\n // void scrollableContainer.offsetLeft; // reflow\n // scrollableContainer.style.display = '';\n // }\n\n // // scrollableContainer.style.paddingRight = '0';\n // // this.container.classList.remove('sliding');\n // }\n };\n },\n animateFirst: false\n});\n\nconst slideTopics = makeTransitionFunction({\n callback: (tabContent, prevTabContent) => {\n const rect = tabContent.getBoundingClientRect();\n const offsetX = rect.width - 80;\n\n tabContent.style.transform = `transformX(${offsetX}px)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n\n return () => {};\n },\n animateFirst: true\n});\n\nconst transitions: {[type in TransitionSliderType]?: TransitionFunction} = {\n navigation: slideNavigation,\n tabs: slideTabs\n // topics: slideTopics\n};\n\ntype TransitionSliderType = 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'topics' | 'none'/* | 'counter' */;\n\ntype TransitionSliderOptions = {\n content: HTMLElement,\n type: TransitionSliderType,\n transitionTime: number,\n onTransitionEnd?: (id: number) => void,\n isHeavy?: boolean,\n once?: boolean,\n withAnimationListener?: boolean,\n listenerSetter?: ListenerSetter,\n animateFirst?: boolean\n};\n\ntype TransitionFunction = {\n callback: (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => () => void,\n animateFirst: boolean\n};\n\nconst TransitionSlider = (options: TransitionSliderOptions) => {\n let {\n content,\n type,\n transitionTime,\n onTransitionEnd,\n isHeavy = true,\n once = false,\n withAnimationListener = true,\n listenerSetter,\n animateFirst = false\n } = options;\n\n const {callback: animationFunction, animateFirst: _animateFirst} = transitions[type] || {};\n content.dataset.animation = type;\n\n if(_animateFirst !== undefined) {\n animateFirst = _animateFirst;\n }\n\n const onTransitionEndCallbacks: Map = new Map();\n let animationDeferred: CancellablePromise;\n // let animationStarted = 0;\n let from: HTMLElement = null;\n\n if(withAnimationListener) {\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\n\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\n cancelEvent(e);\n\n if((e.target as HTMLElement).parentElement !== content) {\n return;\n }\n\n // console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\n\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\n callback?.();\n\n if(e.target !== from) {\n return;\n }\n\n if(!animationDeferred && isHeavy) return;\n\n if(animationDeferred) {\n animationDeferred.resolve();\n animationDeferred = undefined;\n }\n\n onTransitionEnd?.(selectTab.prevId());\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n if(once) {\n if(listenerSetter) listenerSetter.removeManual(content, listenerName, onEndEvent);\n else content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\n from = animationDeferred = undefined;\n onTransitionEndCallbacks.clear();\n }\n };\n\n // TODO: check for transition type (transform, etc) using by animationFunction\n if(listenerSetter) listenerSetter.add(content)(listenerName, onEndEvent);\n else content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\n }\n\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\n if(overrideFrom) {\n from = overrideFrom;\n }\n\n if(id instanceof HTMLElement) {\n id = whichChild(id);\n }\n\n const prevId = selectTab.prevId();\n if(id === prevId) return false;\n\n // console.log('selectTab id:', id);\n\n const to = content.children[id] as HTMLElement;\n\n if(!rootScope.settings.animationsEnabled || (prevId === -1 && !animateFirst)) {\n animate = false;\n }\n\n if(!withAnimationListener) {\n const timeout = content.dataset.timeout;\n if(timeout !== undefined) {\n clearTimeout(+timeout);\n }\n\n delete content.dataset.timeout;\n }\n\n if(!animate) {\n if(from) from.classList.remove('active', 'to', 'from');\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\n const callback = onTransitionEndCallbacks.get(to);\n callback?.();\n }\n\n if(to) {\n to.classList.remove('to', 'from');\n to.classList.add('active');\n }\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n from = to;\n\n onTransitionEnd?.(id);\n return;\n }\n\n if(!withAnimationListener) {\n content.dataset.timeout = '' + window.setTimeout(() => {\n to.classList.remove('to');\n from && from.classList.remove('from');\n content.classList.remove('animating', 'backwards', 'disable-hover');\n delete content.dataset.timeout;\n }, transitionTime);\n }\n\n if(from) {\n from.classList.remove('to');\n from.classList.add('from');\n }\n\n content.classList.add('animating'/* , 'disable-hover' */);\n const toRight = prevId < id;\n content.classList.toggle('backwards', !toRight);\n\n let onTransitionEndCallback: ReturnType;\n if(!to) {\n // prevTabContent.classList.remove('active');\n } else {\n if(animationFunction) {\n onTransitionEndCallback = animationFunction(to, from, toRight);\n } else {\n to.classList.add('active');\n }\n\n to.classList.remove('from');\n to.classList.add('to');\n }\n\n if(to) {\n const transitionTimeout = to.dataset.transitionTimeout;\n if(transitionTimeout) {\n clearTimeout(+transitionTimeout);\n }\n\n onTransitionEndCallbacks.set(to, () => {\n to.classList.remove('to');\n onTransitionEndCallbacks.delete(to);\n });\n }\n\n if(from/* && false */) {\n let timeout: number;\n const _from = from;\n const callback = () => {\n clearTimeout(timeout);\n _from.classList.remove('active', 'from');\n\n onTransitionEndCallback?.();\n\n onTransitionEndCallbacks.delete(_from);\n };\n\n if(to) {\n timeout = window.setTimeout(callback, transitionTime + 100); // something happened to container\n onTransitionEndCallbacks.set(_from, callback);\n } else {\n timeout = window.setTimeout(callback, transitionTime);\n onTransitionEndCallbacks.set(_from, () => {\n clearTimeout(timeout);\n onTransitionEndCallbacks.delete(_from);\n });\n }\n\n _from.dataset.transitionTimeout = '' + timeout;\n\n if(isHeavy) {\n if(!animationDeferred) {\n animationDeferred = deferredPromise();\n // animationStarted = performance.now();\n }\n\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\n }\n }\n\n from = to;\n }\n\n // selectTab.prevId = -1;\n selectTab.prevId = () => from ? whichChild(from) : -1;\n selectTab.getFrom = () => from;\n selectTab.setFrom = (_from: HTMLElement) => from = _from;\n\n return selectTab;\n};\n\nexport default TransitionSlider;\n","export default function isUsernameValid(username: string) {\n return ((username.length >= 3 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ListenerSetter from '../helpers/listenerSetter';\nimport debounce from '../helpers/schedulers/debounce';\nimport {LangPackKey} from '../lib/langPack';\nimport InputField, {InputFieldOptions, InputState} from './inputField';\nimport isUsernameValid from '../lib/richTextProcessor/isUsernameValid';\nimport {AppManagers} from '../lib/appManagers/managers';\n\nexport class UsernameInputField extends InputField {\n private checkUsernamePromise: Promise;\n private checkUsernameDebounced: (username: string) => void;\n public options: InputFieldOptions & {\n peerId?: PeerId,\n listenerSetter: ListenerSetter,\n onChange?: () => void,\n invalidText: LangPackKey,\n takenText: LangPackKey,\n availableText: LangPackKey,\n head?: string\n };\n public error: ApiError;\n\n constructor(\n options: UsernameInputField['options'],\n private managers: AppManagers\n ) {\n super(options);\n\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\n\n options.listenerSetter.add(this.input)('input', () => {\n const value = this.getValue();\n\n this.error = undefined;\n if(value === this.originalValue || !value.length) {\n this.setState(InputState.Neutral);\n this.options.onChange?.();\n return;\n } else if(!isUsernameValid(value)) { // does not check the last underscore\n this.setError(this.options.invalidText);\n } else {\n this.setState(InputState.Neutral);\n }\n\n if(this.input.classList.contains('error')) {\n this.options.onChange?.();\n return;\n }\n\n this.checkUsernameDebounced(value);\n });\n }\n\n public getValue() {\n let value = this.value;\n if(this.options.head) {\n value = value.slice(this.options.head.length);\n this.setValueSilently(this.options.head + value);\n }\n\n return value;\n }\n\n private checkUsername(username: string) {\n if(this.checkUsernamePromise) return;\n\n this.error = undefined;\n let checkPromise: Promise\n if(this.options.peerId) {\n checkPromise = this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(), username);\n } else {\n checkPromise = this.managers.appUsersManager.checkUsername(username);\n }\n\n const promise = this.checkUsernamePromise = checkPromise.then((available) => {\n if(this.getValue() !== username) return;\n\n if(available) {\n this.setState(InputState.Valid, this.options.availableText);\n } else {\n this.setError(this.options.takenText);\n }\n }, (err) => {\n if(this.getValue() !== username) return;\n\n this.error = err;\n switch((err as ApiError).type) {\n case 'USERNAME_PURCHASE_AVAILABLE': {\n this.setError(this.options.takenText);\n break;\n }\n\n case 'USERNAME_INVALID':\n default: {\n this.setError(this.options.invalidText);\n break;\n }\n }\n }).then(() => {\n if(this.checkUsernamePromise === promise) {\n this.checkUsernamePromise = undefined;\n }\n\n this.options.onChange?.();\n\n const value = this.getValue();\n if(value !== username && this.isValidToChange() && isUsernameValid(value)) {\n this.checkUsername(value);\n }\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport Sortable from '../helpers/dom/sortable';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {Middleware} from '../helpers/middleware';\nimport noop from '../helpers/noop';\nimport SortedList, {SortedElementBase} from '../helpers/sortedList';\nimport {Chat, User, Username} from '../layer';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport confirmationPopup from './confirmationPopup';\nimport Row from './row';\nimport SettingSection from './settingSection';\nimport {UsernameInputField} from './usernameInputField';\n\nexport default class UsernamesSection extends SettingSection {\n // public section: SettingSection;\n\n constructor(options: {\n peerId: PeerId,\n peer: Chat.channel | User.user,\n listenerSetter: ListenerSetter,\n usernameInputField: UsernameInputField,\n middleware: Middleware\n }) {\n /* const section = this.section = new SettingSection */super({\n name: 'UsernamesProfileHeader',\n caption: !options.peerId.isUser() ? 'UsernamesChannelHelp' : 'UsernamesProfileHelp'\n });\n\n const {peerId, peer, usernameInputField, listenerSetter, middleware} = options;\n const managers = rootScope.managers;\n const channelId = peerId.isUser() ? undefined : peerId.toChatId();\n\n const section = this;\n\n const CLASS_NAME = 'usernames';\n const list = document.createElement('div');\n list.classList.add(CLASS_NAME);\n\n let _usernames: Username[];\n\n interface SortedUsername extends SortedElementBase {\n row: Row\n }\n\n const sortedList = new SortedList({\n getIndex: (element) => _usernames.length - _usernames.findIndex((username) => username.username === element.id),\n onDelete: (element) => {\n element.row.container.remove();\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.row.container, list, idx);\n },\n onElementCreate: (base) => {\n const username = _usernames.find((username) => username.username === base.id);\n const row = new Row({\n title: '@' + username.username,\n subtitle: true,\n clickable: true\n });\n\n const editable = !!username.pFlags.editable;\n const active = !!username.pFlags.active;\n\n if(editable) row.container.dataset.editable = '1';\n row.container.dataset.username = username.username;\n row.container.classList.add(CLASS_NAME + '-username');\n row.subtitle.classList.add(CLASS_NAME + '-username-status');\n const media = row.createMedia('medium');\n media.classList.add(CLASS_NAME + '-username-icon', 'tgico');\n\n row.makeSortable();\n\n changeActive(row, active);\n\n (base as SortedUsername).row = row;\n\n return base as SortedUsername;\n }\n });\n\n const changeActive = (row: Row, active: boolean) => {\n row.subtitle.replaceChildren(i18n(row.container.dataset.editable ? 'UsernameLinkEditable' : (active ? 'UsernameLinkActive' : 'UsernameLinkInactive')));\n row.container.classList.toggle('active', active);\n row.toggleSorting(active);\n };\n\n const applyUsernames = (usernames: Username[] = []) => {\n _usernames = usernames;\n\n sortedList.getAll().forEach((element) => {\n if(!usernames.some((username) => username.username === element.id)) {\n sortedList.delete(element.id);\n }\n });\n\n usernames.forEach((username) => {\n if(!sortedList.has(username.username)) {\n sortedList.add(username.username);\n } else {\n const element = sortedList.get(username.username);\n sortedList.update(username.username, element);\n changeActive(element.row, !!username.pFlags.active);\n }\n });\n\n section.container.classList.toggle('hide', !sortedList.getAll().size);\n };\n\n applyUsernames(peer.usernames);\n\n listenerSetter.add(rootScope)('peer_title_edit', async({peerId: _peerId}) => {\n if(_peerId !== peerId) {\n return;\n }\n\n const peer = await managers.appPeersManager.getPeer(peerId);\n applyUsernames((peer as User.user).usernames);\n });\n\n let cancelClick = false;\n attachClickEvent(list, async(e) => {\n if(cancelClick) {\n cancelClick = false;\n return;\n }\n\n const container = findUpAsChild(e.target as HTMLElement, list);\n if(!container) {\n return;\n }\n\n if(container.dataset.editable) {\n placeCaretAtEnd(usernameInputField.input, true, true);\n return;\n }\n\n const username = container.dataset.username;\n\n const active = container.classList.contains('active');\n let titleLangKey: LangPackKey, descriptionLangKey: LangPackKey;\n if(active) {\n titleLangKey = 'UsernameDeactivateLink';\n descriptionLangKey = channelId ? 'UsernameDeactivateLinkChannelMessage' : 'UsernameDeactivateLinkProfileMessage';\n } else {\n titleLangKey = 'UsernameActivateLink';\n descriptionLangKey = channelId ? 'UsernameActivateLinkChannelMessage' : 'UsernameActivateLinkProfileMessage';\n }\n\n try {\n await confirmationPopup({\n titleLangKey,\n descriptionLangKey,\n button: {\n langKey: active ? 'Hide' : 'Show'\n }\n });\n } catch(err) {\n return;\n }\n\n const newActive = !active;\n let promise: Promise;\n if(channelId) {\n promise = managers.appChatsManager.toggleUsername(channelId, username, newActive);\n } else {\n promise = managers.appUsersManager.toggleUsername(username, newActive);\n }\n\n promise.catch((err: ApiError) => {\n if(err.type === 'USERNAMES_ACTIVE_TOO_MUCH') {\n confirmationPopup({\n titleLangKey: 'UsernameActivateErrorTitle',\n descriptionLangKey: 'UsernameActivateErrorMessage',\n button: {langKey: 'OK', isCancel: true}\n }).catch(noop);\n } else {\n console.error('turn username error', err);\n }\n });\n });\n\n new Sortable({\n list,\n middleware,\n onSort: (idx, newIdx) => {\n const username = _usernames.splice(idx, 1)[0];\n _usernames.splice(newIdx, 0, username);\n sortedList.updateList();\n // can't just update particular element, have to change indexes\n // sortedList.update(username.username);\n\n const usernames = _usernames.filter((username) => username.pFlags.active).map((username) => username.username);\n if(channelId) {\n managers.appChatsManager.reorderUsernames(channelId, usernames);\n } else {\n managers.appUsersManager.reorderUsernames(usernames);\n }\n }\n });\n\n section.content.append(list);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\ntype TargetType = HTMLElement;\nexport type OnVisibilityChangeItem = {target: TargetType, visible: boolean, entry: IntersectionObserverEntry, index: number};\nexport type OnVisibilityChange = (item: OnVisibilityChangeItem) => void;\n\nexport default class VisibilityIntersector {\n private observer: IntersectionObserver;\n private items: Map = new Map();\n private locked = false;\n\n constructor(onVisibilityChange: OnVisibilityChange, options?: IntersectionObserverInit) {\n this.observer = new IntersectionObserver((entries) => {\n if(this.locked) {\n return;\n }\n\n const changed: OnVisibilityChangeItem[] = [];\n\n entries.forEach((entry, index) => {\n const target = entry.target as TargetType;\n\n if(this.items.get(target) === entry.isIntersecting) {\n return;\n } else {\n this.items.set(target, entry.isIntersecting);\n }\n\n /* if(entry.isIntersecting) {\n console.log('ooo', entry);\n } */\n\n /* if(this.locked) {\n return;\n } */\n\n const change: typeof changed[0] = {target, visible: entry.isIntersecting, entry, index};\n\n // ! order will be incorrect so can't use it\n // changed[entry.isIntersecting ? 'unshift' : 'push'](change);\n changed.push(change);\n\n // onVisibilityChange(target, entry.isIntersecting);\n });\n\n changed.forEach((item) => {\n onVisibilityChange(item);\n });\n }, options);\n }\n\n public getVisible() {\n const items: TargetType[] = [];\n this.items.forEach((value, key) => {\n if(value) {\n items.push(key);\n }\n });\n\n return items;\n }\n\n public clearVisible() {\n const visible = this.getVisible();\n for(const target of visible) {\n this.items.set(target, false);\n }\n }\n\n public isVisible(target: TargetType) {\n return this.items.get(target);\n }\n\n public disconnect() {\n this.observer.disconnect();\n this.items.clear();\n }\n\n public refresh() {\n this.observer.disconnect();\n\n // window.requestAnimationFrame(() => {\n const targets = [...this.items.keys()];\n for(const target of targets) {\n // this.items.set(target, false);\n this.observer.observe(target);\n }\n // });\n }\n\n public refreshVisible() {\n const visible = this.getVisible();\n for(const target of visible) {\n this.observer.unobserve(target);\n }\n\n for(const target of visible) {\n this.observer.observe(target);\n }\n }\n\n public observe(target: TargetType) {\n this.items.set(target, false);\n this.observer.observe(target);\n }\n\n public unobserve(target: TargetType) {\n this.observer.unobserve(target);\n this.items.delete(target);\n }\n\n public unlock() {\n this.locked = false;\n }\n\n public unlockAndRefresh() {\n this.unlock();\n this.refresh();\n }\n\n public lock() {\n this.locked = true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport rootScope from '../lib/rootScope';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport RangeSelector from './rangeSelector';\n\nexport default class VolumeSelector extends RangeSelector {\n private static ICONS = ['volume_off', 'volume_mute', 'volume_down', 'volume_up'];\n public btn: HTMLElement;\n protected icon: HTMLSpanElement;\n\n constructor(protected listenerSetter: ListenerSetter, protected vertical = false) {\n super({\n step: 0.01,\n min: 0,\n max: 1,\n vertical\n }, 1);\n\n this.setListeners();\n this.setHandlers({\n onScrub: currentTime => {\n const value = Math.max(Math.min(currentTime, 1), 0);\n\n // console.log('volume scrub:', currentTime, value);\n\n appMediaPlaybackController.muted = false;\n appMediaPlaybackController.volume = value;\n }\n\n /* onMouseUp: (e) => {\n cancelEvent(e.event);\n } */\n });\n\n const className = 'player-volume';\n const btn = this.btn = document.createElement('div');\n btn.classList.add('btn-icon', className);\n const icon = this.icon = document.createElement('span');\n icon.classList.add(className + '__icon');\n\n btn.append(icon, this.container);\n\n attachClickEvent(icon, this.onMuteClick, {listenerSetter: this.listenerSetter});\n this.listenerSetter.add(appMediaPlaybackController)('playbackParams', this.setVolume);\n\n this.setVolume();\n }\n\n private onMuteClick = (e?: Event) => {\n e && cancelEvent(e);\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n };\n\n public setVolume = () => {\n // const volume = video.volume;\n const {volume, muted} = appMediaPlaybackController;\n let d: string;\n let iconIndex: number;\n if(!volume || muted) {\n iconIndex = 0;\n } else if(volume > .5) {\n iconIndex = 3;\n } else if(volume > 0 && volume < .25) {\n iconIndex = 1;\n } else {\n iconIndex = 2;\n }\n\n VolumeSelector.ICONS.forEach((icon) => this.icon.classList.remove('tgico-' + icon));\n this.icon.classList.add('tgico-' + VolumeSelector.ICONS[iconIndex]);\n\n if(!this.mousedown) {\n this.setProgress(muted ? 0 : volume);\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapCustomEmoji({\n docIds,\n loadPromises,\n middleware,\n lazyLoadQueue,\n customEmojiSize,\n animationGroup\n}: {\n docIds: DocId[],\n loadPromises?: Promise[]\n} & WrapSomethingOptions) {\n const text = ' '.repeat(docIds.length);\n const entities: MessageEntity[] = [];\n docIds.forEach((docId, idx) => {\n entities.push({\n _: 'messageEntityCustomEmoji',\n offset: idx,\n length: 1,\n document_id: docId\n });\n });\n\n const wrapped = wrapRichText(text, {\n entities,\n loadPromises,\n animationGroup,\n customEmojiSize,\n middleware,\n lazyLoadQueue\n });\n\n return wrapped;\n}\n\nexport function wrapCustomEmojiAwaited(options: Parameters[0]) {\n const loadPromises: Promise[] = options.loadPromises ??= [];\n const wrapped = wrapCustomEmoji(options);\n return Promise.all(loadPromises).then(() => wrapped);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {clearBadCharsAndTrim} from '../../helpers/cleanSearchText';\nimport {formatFullSentTime} from '../../helpers/date';\nimport {simulateClickEvent, attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport formatBytes from '../../helpers/formatBytes';\nimport {MediaSizeType} from '../../helpers/mediaSizes';\nimport noop from '../../helpers/noop';\nimport {Message, MessageMedia, WebPage} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager, {Progress} from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getDownloadMediaDetails from '../../lib/appManagers/utils/download/getDownloadMediaDetails';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport {joinElementsWith} from '../../lib/langPack';\nimport {MAX_FILE_SAVE_SIZE} from '../../lib/mtproto/mtproto_config';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport rootScope from '../../lib/rootScope';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport {MediaSearchContext} from '../appMediaPlaybackController';\nimport AudioElement from '../audio';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport {MiddleEllipsisElement} from '../middleEllipsis';\nimport ProgressivePreloader from '../preloader';\nimport wrapPhoto from './photo';\nimport wrapSenderToPeer from './senderToPeer';\nimport wrapSentTime from './sentTime';\n\nrootScope.addEventListener('document_downloading', (docId) => {\n const elements = Array.from(document.querySelectorAll(`.document[data-doc-id=\"${docId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n if(element.querySelector('.preloader-container.manual')) {\n simulateClickEvent(element);\n }\n });\n});\n\nexport default async function wrapDocument({message, withTime, fontWeight, voiceAsMusic, showSender, searchContext, loadPromises, autoDownloadSize, lazyLoadQueue, sizeType, managers = rootScope.managers, cacheContext, fontSize}: {\n message: Message.message,\n withTime?: boolean,\n fontWeight?: number,\n voiceAsMusic?: boolean,\n showSender?: boolean,\n searchContext?: MediaSearchContext,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n sizeType?: MediaSizeType,\n managers?: AppManagers,\n cacheContext?: ThumbCache,\n fontSize?: number\n}): Promise {\n fontWeight ??= 500;\n sizeType ??= '' as any;\n fontSize ??= 0;\n const noAutoDownload = autoDownloadSize === 0;\n\n const doc = ((message.media as MessageMedia.messageMediaDocument).document || ((message.media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage).document) as MyDocument;\n const uploadFileName = message?.uploadingFileName;\n if(doc.type === 'audio' || doc.type === 'voice' || doc.type === 'round') {\n const audioElement = new AudioElement();\n audioElement.withTime = withTime;\n audioElement.message = message;\n audioElement.noAutoDownload = noAutoDownload;\n audioElement.lazyLoadQueue = lazyLoadQueue;\n audioElement.loadPromises = loadPromises;\n\n if(voiceAsMusic) audioElement.voiceAsMusic = voiceAsMusic;\n if(searchContext) audioElement.searchContext = searchContext;\n if(showSender) audioElement.showSender = showSender;\n\n audioElement.dataset.fontWeight = '' + fontWeight;\n audioElement.dataset.fontSize = '' + fontSize;\n audioElement.dataset.sizeType = sizeType;\n await audioElement.render();\n return audioElement;\n }\n\n const extSplitted = doc.file_name ? doc.file_name.split('.') : '';\n let ext = '';\n ext = extSplitted.length > 1 && Array.isArray(extSplitted) ?\n clearBadCharsAndTrim(extSplitted.pop().split(' ', 1)[0].toLowerCase()) :\n 'file';\n\n const docDiv = document.createElement('div');\n docDiv.classList.add('document', `ext-${ext}`);\n docDiv.dataset.docId = '' + doc.id;\n (docDiv as any).doc = doc;\n\n // return docDiv;\n\n const icoDiv = document.createElement('div');\n icoDiv.classList.add('document-ico');\n let icoTextEl: HTMLElement;\n\n const hadContext = !!cacheContext;\n const getCacheContext = () => {\n return hadContext ? cacheContext : managers.thumbsStorage.getCacheContext(doc);\n };\n\n cacheContext = await getCacheContext();\n let hasThumb = false;\n if((doc.thumbs?.length || (message.pFlags.is_outgoing && cacheContext.url && doc.type === 'photo'))/* && doc.mime_type !== 'image/gif' */) {\n docDiv.classList.add('document-with-thumb');\n hasThumb = true;\n\n const imgs: (HTMLImageElement | HTMLCanvasElement | HTMLVideoElement)[] = [];\n // ! WARNING, use thumbs for check when thumb will be generated for media\n if(message.pFlags.is_outgoing && ['photo', 'video'].includes(doc.type) && cacheContext.url) {\n icoDiv.innerHTML = ``;\n imgs.push(icoDiv.firstElementChild as HTMLImageElement);\n } else {\n const perf = performance.now();\n const wrapped = await wrapPhoto({\n photo: doc,\n message: null,\n container: icoDiv,\n boxWidth: 54,\n boxHeight: 54,\n loadPromises,\n withoutPreloader: true,\n lazyLoadQueue,\n size: choosePhotoSize(doc, 54, 54, true),\n managers\n });\n // console.log('was wrapping photo', performance.now() - perf);\n icoDiv.style.width = icoDiv.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n }\n\n imgs.forEach((img) => img.classList.add('document-thumb'));\n } else {\n icoTextEl = document.createElement('span');\n icoTextEl.classList.add('document-ico-text');\n icoTextEl.innerText = ext;\n icoDiv.append(icoTextEl);\n }\n\n // let fileName = stringMiddleOverflow(doc.file_name || 'Unknown.file', 26);\n const fileName = doc.file_name ? wrapPlainText(doc.file_name) : 'Unknown.file';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('document-description');\n const bytesContainer = document.createElement('span');\n const bytesEl = formatBytes(doc.size);\n const bytesJoiner = ' / ';\n\n const descriptionParts: (HTMLElement | string | DocumentFragment)[] = [bytesEl];\n\n if(withTime) {\n descriptionParts.push(formatFullSentTime(message.date));\n }\n\n if(showSender) {\n descriptionParts.push(await wrapSenderToPeer(message));\n }\n\n if(!withTime && !showSender) {\n const b = document.createElement('span');\n const bytesMaxEl = formatBytes(doc.size);\n b.append(bytesJoiner, bytesMaxEl);\n b.style.visibility = 'hidden';\n descriptionParts.push(b);\n }\n\n docDiv.innerHTML = `\n ${(cacheContext.downloaded && !uploadFileName) || !message.mid || !hasThumb ? '' : `
`}\n
\n
\n `;\n\n const nameDiv = docDiv.querySelector('.document-name') as HTMLElement;\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = '' + fontWeight;\n middleEllipsisEl.dataset.fontSize = '' + fontSize;\n middleEllipsisEl.dataset.sizeType = sizeType;\n middleEllipsisEl.textContent = fileName;\n // setInnerHTML(middleEllipsisEl, fileName);\n\n // * new media popup\n if(!message.mid) {\n docDiv.classList.add('downloaded');\n }\n\n nameDiv.append(middleEllipsisEl);\n\n if(showSender) {\n nameDiv.append(wrapSentTime(message));\n }\n\n const sizeDiv = docDiv.querySelector('.document-size') as HTMLElement;\n bytesContainer.append(...joinElementsWith(descriptionParts, ' · '));\n sizeDiv.append(bytesContainer);\n\n docDiv.prepend(icoDiv);\n\n if(!uploadFileName && message.pFlags.is_outgoing && !message.mid) {\n return docDiv;\n }\n\n let downloadDiv: HTMLElement, preloader: ProgressivePreloader = null;\n const onLoad = () => {\n docDiv.classList.remove('downloading');\n\n if(/* !hasThumb || */(doc.size > MAX_FILE_SAVE_SIZE && !uploadFileName)) {\n preloader.setManual();\n preloader.attach(downloadDiv);\n preloader.preloader.classList.add('manual');\n preloader.setDownloadFunction(load);\n return;\n }\n\n if(doc.size <= MAX_FILE_SAVE_SIZE) {\n docDiv.classList.add('downloaded');\n }\n\n if(downloadDiv) {\n if(downloadDiv !== icoDiv) {\n const _downloadDiv = downloadDiv;\n setTimeout(() => {\n _downloadDiv.remove();\n }, 200);\n }\n\n downloadDiv = null;\n }\n\n if(preloader) {\n preloader = null;\n }\n };\n\n const addByteProgress = (promise: CancellablePromise) => {\n docDiv.classList.add('downloading');\n\n const sizeContainer = document.createElement('span');\n const _bytesContainer = formatBytes(doc.size);\n sizeContainer.style.position = 'absolute';\n sizeContainer.style.left = '0';\n promise.then(onLoad, noop).finally(() => {\n // sizeContainer.replaceWith(bytesContainer);\n bytesContainer.style.visibility = '';\n sizeContainer.remove();\n // b && b.classList.remove('hide');\n });\n\n // b && b.classList.add('hide');\n\n const format = (bytes: number) => formatBytes(bytes);\n let d = format(0);\n bytesContainer.style.visibility = 'hidden';\n // bytesContainer.replaceWith(sizeContainer);\n sizeContainer.append(d, bytesJoiner, _bytesContainer);\n bytesContainer.parentElement.append(sizeContainer);\n promise.addNotifyListener((progress: Progress) => {\n const _d = format(progress.done);\n d.replaceWith(_d);\n d = _d;\n });\n };\n\n // ! DO NOT USE ASYNC/AWAIT HERE ! SAFARI WON'T LET DOWNLOAD THE FILE BECAUSE OF ASYNC\n const load = (e?: Event) => {\n const save = !e || e.isTrusted;\n const doc = (docDiv as any).doc;\n // const doc = await managers.appDocsManager.getDoc(docDiv.dataset.docId);\n let download: CancellablePromise;\n const queueId = appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : undefined;\n if(!save) {\n download = appDownloadManager.downloadToDisc({media: doc, queueId}, true);\n } else if(doc.type === 'pdf') {\n const canOpenAfter = /* managers.appDocsManager.downloading.has(doc.id) || */!preloader || preloader.detached;\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n if(canOpenAfter) {\n download.then(() => {\n setTimeout(async() => { // wait for preloader animation end\n const url = (await getCacheContext()).url;\n window.open(url);\n }, rootScope.settings.animationsEnabled ? 250 : 0);\n });\n }\n } else if(MEDIA_MIME_TYPES_SUPPORTED.has(doc.mime_type) && doc.thumbs?.length) {\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n } else {\n download = appDownloadManager.downloadToDisc({media: doc, queueId});\n }\n\n download.catch(() => {\n docDiv.classList.remove('downloading');\n });\n\n if(downloadDiv) {\n preloader.attach(downloadDiv, true, download);\n addByteProgress(download);\n }\n };\n\n const {fileName: downloadFileName} = getDownloadMediaDetails({media: doc, downloadId: '1'});\n if(await managers.apiFileManager.isDownloading(downloadFileName)) {\n downloadDiv = docDiv.querySelector('.document-download') || icoDiv;\n const promise = appDownloadManager.downloadToDisc({media: doc}, true);\n\n preloader = new ProgressivePreloader();\n preloader.attach(downloadDiv, false, promise);\n preloader.setDownloadFunction(load);\n addByteProgress(promise);\n } else if(!cacheContext.downloaded || uploadFileName) {\n downloadDiv = docDiv.querySelector('.document-download') || icoDiv;\n preloader = new ProgressivePreloader({\n isUpload: !!uploadFileName\n });\n\n if(!uploadFileName) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(downloadDiv);\n preloader.setDownloadFunction(load);\n\n if(autoDownloadSize !== undefined && autoDownloadSize >= doc.size) {\n simulateClickEvent(preloader.preloader);\n }\n } else {\n const uploadPromise = appDownloadManager.getUpload(uploadFileName);\n preloader.attachPromise(uploadPromise);\n preloader.attach(downloadDiv);\n addByteProgress(uploadPromise);\n }\n }\n\n attachClickEvent(docDiv, (e) => {\n if(findUpClassName(e.target, 'time')) { // prevent downloading by clicking on time\n return;\n }\n\n if(preloader) {\n preloader.onClick(e);\n } else {\n load(e);\n }\n });\n\n return docDiv;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\n\nexport default function formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport {Chat, ChatParticipants} from '../../layer';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport rootScope from '../../lib/rootScope';\n\nexport default async function getChatMembersString(chatId: ChatId, managers = rootScope.managers) {\n const chat: Chat = await managers.appChatsManager.getChat(chatId);\n if(chat._ === 'chatForbidden') {\n return i18n('YouWereKicked');\n }\n\n const chatFull = await managers.appProfileManager.getCachedFullChat(chatId);\n let count: number;\n if(chatFull) {\n if(chatFull._ === 'channelFull') {\n count = chatFull.participants_count;\n } else {\n count = (chatFull.participants as ChatParticipants.chatParticipants).participants?.length;\n }\n } else {\n count = (chat as Chat.chat).participants_count || (chat as any).participants?.participants.length;\n }\n\n const isBroadcast = (chat as Chat.channel).pFlags.broadcast;\n count = count || 1;\n\n const key: LangPackKey = isBroadcast ? 'Peer.Status.Subscribers' : 'Peer.Status.Member';\n return i18n(key, [numberThousandSplitter(count)]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport _limitSymbols from '../../helpers/string/limitSymbols';\nimport {Chat} from '../../layer';\nimport getPeerActiveUsernames from '../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport I18n from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../lib/rootScope';\n\ntype GetPeerTitleOptions = {\n peerId: PeerId,\n plainText?: boolean,\n onlyFirstName?: boolean,\n limitSymbols?: number,\n threadId?: number\n} & Pick;\n\nexport default async function getPeerTitle(\n options: T\n): Promise {\n const {\n peerId = rootScope.myId,\n plainText,\n onlyFirstName,\n limitSymbols,\n managers = rootScope.managers,\n threadId\n } = options;\n\n let title = '';\n if(peerId.isUser()) {\n const user = await managers.appUsersManager.getUser(peerId.toUserId());\n if(user) {\n if(user.first_name) title += user.first_name;\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\n }\n\n if(!title) title = !user || user.pFlags.deleted ? I18n.format(onlyFirstName ? 'Deleted' : 'HiddenName', true) : getPeerActiveUsernames(user)[0] || '';\n else title = title.trim();\n } else {\n if(threadId) {\n const topic = await managers.dialogsStorage.getForumTopic(peerId, threadId);\n title = topic?.title || '';\n }\n\n if(!title) {\n const chat = await managers.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n title = chat?.title || '';\n }\n\n if(onlyFirstName) {\n title = title.split(' ')[0];\n }\n }\n\n if(limitSymbols !== undefined) {\n title = _limitSymbols(title, limitSymbols, limitSymbols);\n }\n\n return plainText ? title : wrapEmojiText(title) as any;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatFullSentTimeRaw} from '../../helpers/date';\nimport {User} from '../../layer';\nimport {LangPackKey, i18n} from '../../lib/langPack';\nimport {REPLIES_PEER_ID, SERVICE_PEER_ID} from '../../lib/mtproto/mtproto_config';\n\nexport default function getUserStatusString(user: User.user): HTMLElement {\n if(!user) {\n return document.createElement('span');\n }\n\n let key: LangPackKey;\n let args: any[];\n\n switch(user.id) {\n case REPLIES_PEER_ID.toUserId():\n key = 'Peer.RepliesNotifications';\n break;\n case SERVICE_PEER_ID.toUserId():\n key = 'Peer.ServiceNotifications';\n break;\n default: {\n if(user.pFlags.bot) {\n key = 'Bot';\n break;\n }\n\n if(user.pFlags.support) {\n key = 'SupportStatus';\n break;\n }\n\n switch(user.status?._) {\n case 'userStatusRecently': {\n key = 'Lately';\n break;\n }\n\n case 'userStatusLastWeek': {\n key = 'WithinAWeek';\n break;\n }\n\n case 'userStatusLastMonth': {\n key = 'WithinAMonth';\n break;\n }\n\n case 'userStatusOffline': {\n const date = user.status.was_online;\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n\n const diff = now - date;\n if(diff < 60) {\n key = 'Peer.Status.justNow';\n } else if(diff < 3600) {\n key = 'Peer.Status.minAgo';\n const c = diff / 60 | 0;\n args = [c];\n } else if(diff < 86400 && today.getDate() === new Date(date * 1000).getDate()) {\n key = 'LastSeen.HoursAgo';\n const c = diff / 3600 | 0;\n args = [c];\n } else {\n key = 'Peer.Status.LastSeenAt';\n const {dateEl, timeEl} = formatFullSentTimeRaw(date);\n args = [dateEl, timeEl];\n }\n\n break;\n }\n\n case 'userStatusOnline': {\n key = 'Online';\n break;\n }\n\n default: {\n key = 'ALongTimeAgo';\n break;\n }\n }\n\n break;\n }\n }\n\n return i18n(key, args);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport getImageFromStrippedThumb from '../../helpers/getImageFromStrippedThumb';\nimport noop from '../../helpers/noop';\nimport {Document, Photo, PhotoSize} from '../../layer';\nimport DotRenderer from '../dotRenderer';\nimport SetTransition from '../singleTransition';\n\nexport function toggleMediaSpoiler(options: {\n mediaSpoiler: HTMLElement,\n reveal: boolean,\n destroyAfter?: boolean\n}) {\n const {mediaSpoiler, reveal, destroyAfter} = options;\n SetTransition({\n element: mediaSpoiler,\n forwards: reveal,\n className: 'is-revealing',\n duration: 250,\n onTransitionEnd: () => {\n if(reveal && destroyAfter) {\n mediaSpoiler.remove();\n mediaSpoiler.middlewareHelper.destroy();\n }\n }\n });\n}\n\nexport function onMediaSpoilerClick(options: {\n mediaSpoiler: HTMLElement,\n event: Event\n}) {\n const {mediaSpoiler, event} = options;\n cancelEvent(event);\n\n if(mediaSpoiler.classList.contains('is-revealing')) {\n return;\n }\n\n const video = mediaSpoiler.parentElement.querySelector('video');\n if(video && !mediaSpoiler.parentElement.querySelector('.video-play')) {\n video.autoplay = true;\n video.play().catch(noop);\n }\n\n toggleMediaSpoiler({\n mediaSpoiler,\n reveal: true,\n destroyAfter: true\n });\n}\n\nexport function wrapMediaSpoilerWithImage(options: {\n image: Awaited>['image']\n} & Parameters[0]) {\n const {middleware, image} = options;\n if(!middleware()) {\n return;\n }\n\n image.classList.add('media-spoiler-thumbnail');\n\n const container = document.createElement('div');\n container.classList.add('media-spoiler-container');\n container.middlewareHelper = middleware.create();\n\n const dotRenderer = DotRenderer.create({\n ...options,\n middleware: container.middlewareHelper.get()\n });\n\n container.append(image, dotRenderer.canvas);\n\n return container;\n}\n\nexport default async function wrapMediaSpoiler(\n options: Omit[0], 'image'> & {\n media: Document.document | Photo.photo\n }\n) {\n const {media} = options;\n const sizes = (media as Photo.photo).sizes || (media as Document.document).thumbs;\n const thumb = sizes.find((size) => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n if(!thumb) {\n return;\n }\n\n const {image, loadPromise} = getImageFromStrippedThumb(media, thumb, true);\n await loadPromise;\n\n return wrapMediaSpoilerWithImage({\n ...options,\n image\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport wrapMessageActionTextNewUnsafe from './messageActionTextNewUnsafe';\n\nexport type WrapMessageActionTextOptions = {\n message: MyMessage,\n plain?: boolean\n} & WrapSomethingOptions;\n\nexport default async function wrapMessageActionTextNew(\n options: T\n): Promise {\n try {\n return await wrapMessageActionTextNewUnsafe(options) as any;\n } catch(err) {\n console.error('wrapMessageActionTextNewUnsafe error:', err);\n return options.plain ? '' : document.createElement('span') as any;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {hexaToHsla} from '../helpers/color';\nimport {TOPIC_COLORS} from '../lib/mtproto/mtproto_config';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\n\nlet svg: SVGSVGElement, span: HTMLElement, defs: HTMLElement;\nconst hadColors: Map = new Map();\nexport default function topicAvatar(color: number, content: string) {\n if(!svg) {\n defs = document.getElementById('svg-defs') as HTMLElement;\n\n const ns = 'http://www.w3.org/2000/svg';\n\n svg = document.createElementNS(ns, 'svg');\n svg.setAttributeNS(null, 'width', '26');\n svg.setAttributeNS(null, 'height', '26');\n svg.setAttributeNS(null, 'viewBox', '0 0 26 26');\n svg.classList.add('topic-icon-svg');\n\n const use = document.createElementNS(ns, 'use');\n use.setAttributeNS(null, 'href', '#topic-icon');\n svg.append(use);\n\n span = document.createElement('span');\n span.classList.add('topic-icon', 'avatar-like');\n\n const contentSpan = document.createElement('span');\n contentSpan.classList.add('topic-icon-content');\n span.append(svg, contentSpan);\n }\n\n if(!color) {\n console.error('NO TOPIC ICON COLOR!');\n color = TOPIC_COLORS[0];\n }\n\n if(!content) {\n console.error('NO TOPIC NAME!');\n content = '';\n }\n\n const hex = color.toString(16);\n\n const gradientId = `topic-icon-gradient-${color}`;\n let strokeColor = hadColors.get(color);\n if(!strokeColor) {\n const {h, s, l, a} = hexaToHsla('#' + hex);\n defs.insertAdjacentHTML('beforeend', `\n \n \n \n \n `);\n\n hadColors.set(color, strokeColor = `hsla(${h}, ${s}%, ${Math.max(0, l - 40)}%, ${a})`);\n }\n\n const clone = span.cloneNode(true) as typeof span;\n (clone.firstElementChild as HTMLElement).style.fill = `url(#${gradientId})`;\n // (clone.firstElementChild as HTMLElement).style.stroke = `var(--peer-avatar-${color}-filled)`;\n (clone.firstElementChild as HTMLElement).style.stroke = strokeColor;\n clone.lastElementChild.append(wrapAbbreviation(content, true));\n return clone;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message, MessageAction} from '../../layer';\nimport wrapUrl from '../../lib/richTextProcessor/wrapUrl';\n\nexport default function wrapJoinVoiceChatAnchor(message: Message.messageService) {\n const action = message.action as MessageAction.messageActionInviteToGroupCall;\n const {onclick, url} = wrapUrl(`tg://voicechat?chat_id=${message.peerId.toChatId()}&id=${action.call.id}&access_hash=${action.call.access_hash}`);\n if(!onclick) {\n return document.createElement('span');\n }\n\n const a = document.createElement('a');\n a.href = url;\n a.setAttribute('onclick', onclick + '(this)');\n\n return a;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {formatTime, ONE_DAY} from '../../helpers/date';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport formatCallDuration from '../../helpers/formatCallDuration';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport {ForumTopic, Message, MessageAction} from '../../layer';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport I18n, {FormatterArgument, FormatterArguments, i18n, join, langPack, LangPackKey, _i18n} from '../../lib/langPack';\nimport {GENERAL_TOPIC_ID} from '../../lib/mtproto/mtproto_config';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport topicAvatar from '../topicAvatar';\nimport {wrapCustomEmojiAwaited} from './customEmoji';\nimport getPeerTitle from './getPeerTitle';\nimport wrapJoinVoiceChatAnchor from './joinVoiceChatAnchor';\nimport {WrapMessageActionTextOptions} from './messageActionTextNew';\nimport wrapMessageForReply, {WrapMessageForReplyOptions} from './messageForReply';\nimport wrapPeerTitle from './peerTitle';\n\nasync function wrapLinkToMessage(options: WrapMessageForReplyOptions) {\n const wrapped = await wrapMessageForReply(options);\n\n if(options.plain) {\n return wrapped;\n }\n\n const a = document.createElement('i');\n a.dataset.savedFrom = (options.message as Message.message).peerId + '_' + (options.message as Message.message).mid;\n a.dir = 'auto';\n a.append(wrapped);\n return a;\n}\n\nfunction wrapSomeText(text: string, plain?: boolean) {\n return plain ? text : htmlToSpan(wrapEmojiText(text));\n}\n\ntype WrapTopicIconOptions = {\n topic: Pick,\n plain?: boolean\n} & WrapSomethingOptions;\nexport async function wrapTopicIcon(options: T): Promise {\n const topic = options.topic;\n\n let iconEmojiId = topic?.icon_emoji_id;\n if(topic?.id === GENERAL_TOPIC_ID) {\n iconEmojiId = '5390854796011906616';\n }\n\n if(!iconEmojiId) {\n if(options.plain) return '' as any;\n\n // if(topic?.id === GENERAL_TOPIC_ID) {\n // const span = document.createElement('span');\n // span.innerHTML = `\n // \n // \n // \n // `;\n\n // span.classList.add('topic-icon');\n\n // return span as any;\n // }\n\n return topicAvatar(topic?.icon_color, topic?.title) as any;\n }\n\n return options.plain ?\n rootScope.managers.appEmojiManager.getCustomEmojiDocument(iconEmojiId).then((doc) => doc.stickerEmojiRaw) :\n wrapCustomEmojiAwaited({\n ...options,\n docIds: [iconEmojiId]\n }).then((fragment) => {\n fragment.lastElementChild.classList.add('topic-icon');\n return fragment;\n }) as any;\n}\n\nfunction wrapMessageActionTopicIcon(options: WrapMessageActionTextOptions) {\n const action = ((options.message as Message.messageService).action as MessageAction.messageActionTopicCreate);\n return wrapTopicIcon({\n ...options,\n topic: action as any as ForumTopic.forumTopic\n });\n}\n\nasync function wrapMessageActionTopicIconAndName(options: WrapMessageActionTextOptions) {\n const action = ((options.message as Message.messageService).action as MessageAction.messageActionTopicCreate);\n const span = document.createElement('span');\n span.classList.add('topic-name');\n span.append(await wrapMessageActionTopicIcon(options), wrapSomeText(action.title, options.plain));\n return span;\n}\n\nexport default async function wrapMessageActionTextNewUnsafe(options: WrapMessageActionTextOptions) {\n const {plain, message, middleware, lazyLoadQueue, customEmojiSize, animationGroup} = options;\n const element: HTMLElement = plain ? undefined : document.createElement('span');\n const action = 'action' in message && message.action;\n\n // this.log('message action:', action);\n\n if((action as MessageAction.messageActionCustomAction).message) {\n const unsafeMessage = (action as MessageAction.messageActionCustomAction).message;\n if(plain) {\n return wrapPlainText(unsafeMessage);\n } else {\n setInnerHTML(element, wrapRichText(unsafeMessage, {noLinebreaks: true}));\n return element;\n }\n } else {\n let _ = action._;\n // let suffix = '';\n let langPackKey: LangPackKey;\n let args: Array>;\n\n const managers = rootScope.managers;\n\n const getNameDivHTML = (peerId: PeerId, plain: boolean) => {\n return plain ? getPeerTitle({peerId, plainText: plain}) : wrapPeerTitle({peerId});\n };\n\n switch(action._) {\n case 'messageActionPhoneCall': {\n _ += '.' + (action as any).type;\n\n args = [formatCallDuration(action.duration, plain)];\n break;\n }\n\n case 'messageActionGroupCall': {\n _ += '.' + (action as any).type;\n\n args = [];\n if(!_.endsWith('You') && !message.pFlags.post) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n if(action.duration !== undefined) {\n args.push(formatCallDuration(action.duration, plain));\n } else {\n args.push(wrapJoinVoiceChatAnchor(message as any));\n }\n\n break;\n }\n\n case 'messageActionInviteToGroupCall': {\n const peerIds = [message.fromId, action.users[0].toPeerId()];\n let a = 'Chat.Service.VoiceChatInvitation';\n const myId = rootScope.myId;\n if(peerIds[0] === myId) a += 'ByYou';\n else if(peerIds[1] === myId) a += 'ForYou';\n indexOfAndSplice(peerIds, myId);\n\n langPackKey = a as LangPackKey;\n args = peerIds.map((peerId) => getNameDivHTML(peerId, plain));\n args.push(wrapJoinVoiceChatAnchor(message as any));\n break;\n }\n\n case 'messageActionGroupCallScheduled': {\n const today = new Date();\n const date = new Date(action.schedule_date * 1000);\n const daysToStart = (date.getTime() - today.getTime()) / 86400e3;\n const tomorrowDate = new Date(today);\n tomorrowDate.setDate(tomorrowDate.getDate() + 1);\n\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n langPackKey = isBroadcast ? 'ChatList.Service.VoiceChatScheduled.Channel' : 'ChatList.Service.VoiceChatScheduled';\n args = [];\n const myId = rootScope.myId;\n if(message.fromId === myId) {\n langPackKey += 'You';\n } else if(!isBroadcast) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let k: LangPackKey;\n const _args: FormatterArguments = [];\n if(daysToStart < 1 && date.getDate() === today.getDate()) {\n k = 'TodayAtFormattedWithToday';\n } else if(daysToStart < 2 && date.getDate() === tomorrowDate.getDate()) {\n k = 'Time.TomorrowAt';\n } else {\n k = 'formatDateAtTime';\n _args.push(new I18n.IntlDateElement({\n date,\n options: {\n day: '2-digit',\n month: '2-digit',\n year: '2-digit'\n }\n }).element);\n }\n\n _args.push(formatTime(date));\n const t = i18n(k, _args);\n args.push(t);\n\n break;\n }\n\n case 'messageActionChatCreate': {\n const myId = rootScope.myId;\n if(message.fromId === myId) {\n _ += 'You';\n } else {\n args = [getNameDivHTML(message.fromId, plain)];\n }\n\n break;\n }\n\n case 'messageActionPinMessage': {\n const peerId = message.peerId;\n const pinnedMessage = await managers.appMessagesManager.getMessageByPeer(peerId, message.reply_to_mid);\n\n args = [\n getNameDivHTML(message.fromId, plain)\n ];\n\n if(!pinnedMessage/* || true */) {\n langPackKey = 'ActionPinnedNoText';\n\n if(message.reply_to_mid) { // refresh original message\n managers.appMessagesManager.fetchMessageReplyTo(message);\n }\n } else {\n args.push(wrapLinkToMessage({\n ...options,\n message: pinnedMessage\n }));\n }\n\n break;\n }\n\n case 'messageActionChatJoinedByRequest': {\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n if(message.pFlags.out) {\n langPackKey = isBroadcast ? 'RequestToJoinChannelApproved' : 'RequestToJoinGroupApproved';\n } else {\n langPackKey = isBroadcast ? 'ChatService.UserJoinedChannelByRequest' : 'ChatService.UserJoinedGroupByRequest';\n args = [getNameDivHTML(message.fromId, plain)];\n }\n break;\n }\n\n case 'messageActionContactSignUp':\n case 'messageActionChatReturn':\n case 'messageActionChatLeave':\n case 'messageActionChatJoined':\n case 'messageActionChatEditPhoto':\n case 'messageActionChatDeletePhoto':\n case 'messageActionChatEditVideo':\n case 'messageActionChatJoinedByLink':\n case 'messageActionChannelEditVideo':\n case 'messageActionChannelDeletePhoto': {\n args = [getNameDivHTML(message.fromId, plain)];\n break;\n }\n\n case 'messageActionChannelEditTitle':\n case 'messageActionChatEditTitle': {\n args = [];\n if(action._ === 'messageActionChatEditTitle') {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n args.push(wrapSomeText(action.title));\n break;\n }\n\n case 'messageActionChatDeleteUser':\n case 'messageActionChatAddUsers':\n case 'messageActionChatAddUser': {\n const users = (action as MessageAction.messageActionChatAddUser).users ||\n [(action as MessageAction.messageActionChatDeleteUser).user_id];\n\n args = [getNameDivHTML(message.fromId, plain)];\n\n if(users.length > 1) {\n const joined = join(\n await Promise.all(users.map((userId: UserId) => getNameDivHTML(userId.toPeerId(), plain))),\n false,\n plain\n );\n\n if(plain) {\n args.push(...joined);\n } else {\n const fragment = document.createElement('span');\n fragment.append(...joined);\n args.push(fragment);\n }\n } else {\n args.push(getNameDivHTML(users[0].toPeerId(), plain));\n }\n\n break;\n }\n\n case 'messageActionBotAllowed': {\n const anchorHTML = wrapRichText(action.domain, {\n entities: [{\n _: 'messageEntityUrl',\n length: action.domain.length,\n offset: 0\n }]\n });\n\n const node = htmlToSpan(anchorHTML);\n\n args = [node];\n break;\n }\n\n case 'messageActionPaymentSent': {\n const isRecurringInit = action.pFlags.recurring_init;\n const isRecurringUsed = action.pFlags.recurring_used;\n langPackKey = isRecurringUsed ? 'Chat.Service.PaymentSentRecurringUsedNoTitle' : (isRecurringInit ? 'Chat.Service.PaymentSentRecurringInitNoTitle' : 'Chat.Service.PaymentSent1NoTitle');\n const price = paymentsWrapCurrencyAmount(action.total_amount, action.currency);\n args = [price, getNameDivHTML(message.peerId, plain)];\n\n if(message.reply_to_mid) {\n const invoiceMessage = await managers.appMessagesManager.getMessageByPeer(\n message.reply_to?.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : message.peerId,\n message.reply_to_mid\n );\n\n if(!invoiceMessage) {\n managers.appMessagesManager.fetchMessageReplyTo(message);\n } else {\n langPackKey = isRecurringUsed ? 'Chat.Service.PaymentSentRecurringUsed' : (isRecurringInit ? 'Chat.Service.PaymentSentRecurringInit' : 'Chat.Service.PaymentSent1');\n args.push(wrapLinkToMessage({\n ...options,\n message: invoiceMessage\n }).then((el) => {\n if(el instanceof HTMLElement) {\n el.classList.add('is-receipt-link');\n }\n\n return el;\n }));\n }\n }\n\n break;\n }\n\n case 'messageActionSetMessagesTTL': {\n args = [];\n\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n if(action.period) {\n if(isBroadcast) {\n langPackKey = 'ActionTTLChannelChanged';\n } else if(message.fromId === rootScope.myId) {\n langPackKey = 'ActionTTLYouChanged';\n } else {\n langPackKey = 'ActionTTLChanged';\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let duration: ReturnType;\n if(action.period > 1814400) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n const year = 31536000;\n if(action.period >= year) {\n key = 'Years';\n args.push(action.period / year | 0);\n } else {\n key = 'Months';\n args.push(action.period / (ONE_DAY * 30) | 0);\n }\n\n duration = plain ? I18n.format(key, true, args) : i18n(key, args);\n } else {\n duration = formatCallDuration(action.period, plain);\n }\n\n args.push(duration);\n } else {\n if(isBroadcast) {\n langPackKey = 'ActionTTLChannelDisabled';\n } else if(message.fromId === rootScope.myId) {\n langPackKey = 'ActionTTLYouDisabled';\n } else {\n langPackKey = 'ActionTTLDisabled';\n args.push(getNameDivHTML(message.fromId, plain));\n }\n }\n break;\n }\n\n case 'messageActionTopicEdit': {\n let iconElement: (typeof args)[0];\n let titleElement: typeof iconElement;\n let authorElement: ReturnType;\n const isMe = !!message.pFlags.out;\n const isIconChanged = action.icon_emoji_id !== undefined;\n const isIconRemoved = isIconChanged && !+action.icon_emoji_id;\n const isTitleChanged = action.title !== undefined;\n const isHiddenChanged = action.hidden !== undefined;\n\n if(!isMe) {\n authorElement = getNameDivHTML(message.fromId, plain);\n }\n\n if(isTitleChanged) {\n titleElement = wrapSomeText(action.title);\n }\n\n if(isIconChanged && !isIconRemoved) {\n iconElement = wrapMessageActionTopicIcon(options);\n }\n\n args = authorElement ? [authorElement] : [];\n\n if(action.closed) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Paused' : 'Chat.Service.Group.TopicEdited.Paused';\n } else if(action.closed === false) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Resumed' : 'Chat.Service.Group.TopicEdited.Resumed';\n } else if(isIconRemoved && isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.TopicEdited.You.Mixed.IconRemoved' : 'Chat.Service.TopicEdited.Mixed.IconRemoved';\n args.push(titleElement);\n } else if(isIconChanged && isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.TopicEdited.You.Mixed' : 'Chat.Service.TopicEdited.Mixed';\n args.push(wrapMessageActionTopicIconAndName(options));\n } else if(isIconRemoved) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Icon.Removed' : 'Chat.Service.Group.TopicEdited.Icon.Removed';\n } else if(isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Title' : 'Chat.Service.Group.TopicEdited.Title';\n args.push(titleElement);\n } else if(isIconChanged) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Icon' : 'Chat.Service.Group.TopicEdited.Icon';\n args.push(iconElement);\n } else if(isHiddenChanged) {\n langPackKey = isMe ?\n (action.hidden ? 'Chat.Service.Group.TopicEdited.You.Hided' : 'Chat.Service.Group.TopicEdited.You.Unhided') :\n (action.hidden ? 'Chat.Service.Group.TopicEdited.Hided' : 'Chat.Service.Group.TopicEdited.Unhided');\n }\n\n break;\n }\n\n case 'messageActionTopicCreate': {\n args = [wrapMessageActionTopicIconAndName(options)];\n langPackKey = 'TopicWasCreatedAction';\n break;\n }\n\n case 'messageActionSetChatTheme': {\n const isMe = !!message.pFlags.out;\n let authorElement: ReturnType;\n if(!isMe) {\n authorElement = getNameDivHTML(message.fromId, plain);\n }\n\n args = authorElement ? [authorElement] : [];\n\n if(action.emoticon) {\n args.push(wrapEmojiText(action.emoticon));\n langPackKey = isMe ? 'ChatThemeChangedYou' : 'ChatThemeChangedTo';\n } else {\n langPackKey = isMe ? 'ChatThemeDisabledYou' : 'ChatThemeDisabled';\n }\n break;\n }\n\n default:\n langPackKey = (langPack[_] || `[${action._}]`) as any;\n break;\n }\n\n if(!langPackKey) {\n langPackKey = langPack[_];\n if(langPackKey === undefined) {\n langPackKey = '[' + _ + ']' as any;\n }\n }\n\n const waited = args && await Promise.all(args);\n\n if(plain) {\n return I18n.format(langPackKey, true, waited);\n } else {\n return _i18n(element, langPackKey, waited);\n }\n\n // str = !langPackKey || langPackKey[0].toUpperCase() === langPackKey[0] ? langPackKey : getNameDivHTML(message.fromId) + langPackKey + (suffix ? ' ' : '');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport assumeType from '../../helpers/assumeType';\nimport htmlToDocumentFragment from '../../helpers/dom/htmlToDocumentFragment';\nimport {getRestrictionReason} from '../../helpers/restrictions';\nimport escapeRegExp from '../../helpers/string/escapeRegExp';\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {Message, DocumentAttribute, DraftMessage} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {MyDraftMessage} from '../../lib/appManagers/appDraftsManager';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport isMessageRestricted from '../../lib/appManagers/utils/messages/isMessageRestricted';\nimport I18n, {LangPackKey, i18n, UNSUPPORTED_LANG_PACK_KEY} from '../../lib/langPack';\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport {Modify} from '../../types';\nimport wrapMessageActionTextNew, {WrapMessageActionTextOptions} from './messageActionTextNew';\n\nexport type WrapMessageForReplyOptions = Modify & {\n text?: string,\n usingMids?: number[],\n highlightWord?: string,\n withoutMediaType?: boolean\n};\n\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): Promise;\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): Promise;\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): Promise {\nexport default async function wrapMessageForReply(\n options: T\n): Promise {\n let {message, text, usingMids, plain, highlightWord, withoutMediaType} = options;\n text ??= (message as Message.message).message;\n\n const parts: (Node | string)[] = [];\n\n let hasAlbumKey = false;\n const addPart = (langKey: LangPackKey, part?: string | HTMLElement | DocumentFragment) => {\n if(langKey) {\n if(part === undefined && hasAlbumKey) {\n return;\n }\n\n part = plain ? I18n.format(langKey, true) : i18n(langKey);\n }\n\n if(plain) {\n parts.push(part);\n } else {\n const el = document.createElement('span');\n if(typeof(part) === 'string') el.innerHTML = part;\n else el.append(part);\n parts.push(el);\n }\n };\n\n const managers = rootScope.managers;\n const appMessagesManager = managers.appMessagesManager;\n\n const isRestricted = isMessageRestricted(message as any);\n\n let entities = (message as Message.message).totalEntities ?? (message as DraftMessage.draftMessage).entities;\n if((message as Message.message).media && !isRestricted) {\n assumeType(message);\n let usingFullAlbum = true;\n if(message.grouped_id) {\n if(usingMids) {\n const mids = await appMessagesManager.getMidsByMessage(message);\n if(usingMids.length === mids.length) {\n for(const mid of mids) {\n if(!usingMids.includes(mid)) {\n usingFullAlbum = false;\n break;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n }\n\n if(usingFullAlbum) {\n const albumText = await appMessagesManager.getAlbumText(message.grouped_id);\n text = albumText?.message || '';\n entities = albumText?.totalEntities || [];\n\n if(!withoutMediaType) {\n addPart('AttachAlbum');\n hasAlbumKey = true;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n\n if((!usingFullAlbum && !withoutMediaType) || !text) {\n const media = message.media;\n switch(media._) {\n case 'messageMediaPhoto':\n addPart('AttachPhoto');\n break;\n case 'messageMediaDice':\n addPart(undefined, plain ? media.emoticon : wrapEmojiText(media.emoticon));\n break;\n case 'messageMediaVenue': {\n text = media.title;\n addPart('AttachLocation');\n break;\n }\n case 'messageMediaGeo':\n addPart('AttachLocation');\n break;\n case 'messageMediaGeoLive':\n addPart('AttachLiveLocation');\n break;\n case 'messageMediaPoll':\n const f = '📊' + ' ' + (media.poll.question || 'poll');\n addPart(undefined, plain ? f : wrapEmojiText(f));\n break;\n case 'messageMediaContact':\n addPart('AttachContact');\n break;\n case 'messageMediaGame': {\n const f = '🎮' + ' ' + media.game.title;\n addPart(undefined, plain ? f : wrapEmojiText(f));\n break;\n }\n case 'messageMediaDocument': {\n const document = media.document as MyDocument;\n\n if(document.type === 'video') {\n addPart('AttachVideo');\n } else if(document.type === 'voice') {\n addPart('AttachAudio');\n } else if(document.type === 'gif') {\n addPart('AttachGif');\n } else if(document.type === 'round') {\n addPart('AttachRound');\n } else if(document.type === 'sticker') {\n const i = parts.length;\n if(document.stickerEmojiRaw) {\n const f = document.stickerEmojiRaw + ' ';\n addPart(undefined, plain ? f : wrapEmojiText(f));\n }\n\n addPart('AttachSticker');\n\n // will combine two parts into one\n const p = parts.splice(i, 2);\n if(plain) parts.push((p[0] as string) + (p[1] ? p[1] as string : ''));\n else {\n const span = window.document.createElement('span');\n span.append(...p);\n parts.push(span);\n }\n\n text = '';\n } else if(document.type === 'audio') {\n const attribute = document.attributes.find((attribute) => attribute._ === 'documentAttributeAudio' && (attribute.title || attribute.performer)) as DocumentAttribute.documentAttributeAudio;\n const f = '🎵' + ' ' + (attribute ? [attribute.title, attribute.performer].filter(Boolean).join(' - ') : document.file_name);\n addPart(undefined, plain ? f : wrapEmojiText(f));\n } else {\n addPart(undefined, plain ? document.file_name : wrapEmojiText(document.file_name));\n }\n\n break;\n }\n\n case 'messageMediaInvoice': {\n if(media.extended_media?._ === 'messageExtendedMediaPreview') {\n addPart(undefined, plain ? media.description : wrapEmojiText(media.description));\n } else {\n addPart(undefined, plain ? media.title : wrapEmojiText(media.title));\n }\n\n break;\n }\n\n case 'messageMediaUnsupported': {\n addPart(UNSUPPORTED_LANG_PACK_KEY);\n break;\n }\n\n default:\n // messageText += media._;\n // /////appMessagesManager.log.warn('Got unknown media type!', message);\n break;\n }\n }\n\n const length = parts.length;\n for(let i = 1; i < length; i += 2) {\n parts.splice(i, 0, ', ');\n }\n\n if(text && length) {\n parts.push(', ');\n }\n }\n\n if((message as Message.messageService).action) {\n const actionWrapped = await wrapMessageActionTextNew({message: (message as Message.messageService), plain});\n if(actionWrapped) {\n addPart(undefined, actionWrapped);\n }\n }\n\n if(isRestricted) {\n text = getRestrictionReason((message as Message.message).restriction_reason).text;\n entities = [];\n }\n\n if(text) {\n text = limitSymbols(text, 100);\n\n if(!entities) {\n entities = [];\n }\n\n if(plain) {\n parts.push(wrapPlainText(text, entities));\n } else {\n // let entities = parseEntities(text.replace(/\\n/g, ' '));\n\n if(highlightWord) {\n highlightWord = highlightWord.trim();\n let found = false;\n let match: any;\n const regExp = new RegExp(escapeRegExp(highlightWord), 'gi');\n entities = entities.slice(); // fix leaving highlight entity\n while((match = regExp.exec(text)) !== null) {\n entities.push({_: 'messageEntityHighlight', length: highlightWord.length, offset: match.index});\n found = true;\n }\n\n if(found) {\n sortEntities(entities);\n }\n }\n\n const messageWrapped = wrapRichText(text, {\n noLinebreaks: true,\n entities,\n noLinks: true,\n noTextFormat: true\n });\n\n parts.push(htmlToDocumentFragment(messageWrapped));\n }\n }\n\n if(plain) {\n return parts.join('') as any;\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment as any;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PeerTitle, {PeerTitleOptions} from '../peerTitle';\n\nexport default async function wrapPeerTitle(options: PeerTitleOptions) {\n const peerTitle = new PeerTitle();\n await peerTitle.update(options);\n return peerTitle.element;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport renderMediaWithFadeIn from '../../helpers/dom/renderMediaWithFadeIn';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Message, PhotoSize, VideoSize, WebDocument} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../../lib/appManagers/appPhotosManager';\nimport rootScope from '../../lib/rootScope';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ProgressivePreloader from '../preloader';\nimport blur from '../../helpers/blur';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getStrippedThumbIfNeeded from '../../helpers/getStrippedThumbIfNeeded';\nimport setAttachmentSize from '../../helpers/setAttachmentSize';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport isWebDocument from '../../lib/appManagers/utils/webDocs/isWebDocument';\nimport createVideo from '../../helpers/dom/createVideo';\nimport noop from '../../helpers/noop';\nimport {THUMB_TYPE_FULL} from '../../lib/mtproto/mtproto_config';\nimport {Middleware} from '../../helpers/middleware';\n\nexport default async function wrapPhoto({photo, message, container, boxWidth, boxHeight, withTail, isOut, lazyLoadQueue, middleware, size, withoutPreloader, loadPromises, autoDownloadSize, noBlur, noThumb, noFadeIn, blurAfter, managers = rootScope.managers, processUrl}: {\n photo: MyPhoto | MyDocument | WebDocument,\n message?: Message.message | Message.messageService,\n container: HTMLElement,\n boxWidth?: number,\n boxHeight?: number,\n withTail?: boolean,\n isOut?: boolean,\n lazyLoadQueue?: LazyLoadQueue,\n middleware?: Middleware,\n size?: PhotoSize | VideoSize,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n noBlur?: boolean,\n noThumb?: boolean,\n noFadeIn?: boolean,\n blurAfter?: boolean,\n managers?: AppManagers,\n processUrl?: (url: string) => Promise\n}) {\n const ret = {\n loadPromises: {\n thumb: Promise.resolve() as Promise,\n full: Promise.resolve() as Promise\n },\n images: {\n thumb: null as HTMLImageElement | HTMLCanvasElement,\n full: null as HTMLVideoElement | HTMLImageElement\n },\n preloader: null as ProgressivePreloader,\n aspecter: null as HTMLElement\n };\n\n const isDocument = photo._ === 'document';\n const isImageFromDocument = isDocument && photo.mime_type.startsWith('image/') && !size;\n const isWebDoc = isWebDocument(photo);\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs) && !isWebDoc && !isImageFromDocument) {\n if(boxWidth && boxHeight && !size && isDocument) {\n setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\n }\n\n return ret;\n }\n\n let noAutoDownload = autoDownloadSize === 0;\n\n if(!size) {\n if(boxWidth === undefined) boxWidth = mediaSizes.active.regular.width;\n if(boxHeight === undefined) boxHeight = mediaSizes.active.regular.height;\n }\n\n container.classList.add('media-container');\n let aspecter = container;\n\n let isFit = true;\n let loadThumbPromise: Promise = Promise.resolve();\n let thumbImage: HTMLImageElement | HTMLCanvasElement;\n // let image: HTMLImageElement;\n let cacheContext: ThumbCache;\n // if(withTail) {\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\n // } else {\n\n if(boxWidth && boxHeight && !size) { // !album\n const set = setAttachmentSize(\n photo,\n container,\n boxWidth,\n boxHeight,\n undefined,\n message,\n undefined,\n isImageFromDocument ? {\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: THUMB_TYPE_FULL\n } : undefined\n );\n size = set.photoSize;\n isFit = set.isFit;\n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size.type);\n\n if(!isFit && !isWebDoc) {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-container-aspecter');\n aspecter.style.width = set.size.width + 'px';\n aspecter.style.height = set.size.height + 'px';\n\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur, true);\n if(gotThumb) {\n loadThumbPromise = gotThumb.loadPromise;\n const thumbImage = gotThumb.image; // local scope\n thumbImage.classList.add('media-photo');\n container.append(thumbImage);\n } else {\n const res = await wrapPhoto({\n container,\n message,\n photo,\n boxWidth: 0,\n boxHeight: 0,\n size,\n lazyLoadQueue,\n isOut,\n loadPromises,\n middleware,\n withoutPreloader,\n withTail,\n autoDownloadSize,\n noBlur,\n noThumb: true,\n blurAfter: true,\n managers\n // noFadeIn: true\n });\n const thumbImage = res.images.full;\n thumbImage.classList.add('media-photo', 'thumbnail');\n // container.append(thumbImage);\n }\n\n container.classList.add('media-container-fitted');\n container.append(aspecter);\n }\n } else {\n if(!size) {\n size = choosePhotoSize(photo, boxWidth, boxHeight, true);\n }\n\n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n }\n\n if(!noThumb && !isWebDoc) {\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur);\n if(gotThumb) {\n loadThumbPromise = Promise.all([loadThumbPromise, gotThumb.loadPromise]);\n ret.loadPromises.thumb = ret.loadPromises.full = loadThumbPromise;\n thumbImage = ret.images.thumb = gotThumb.image;\n thumbImage.classList.add('media-photo');\n aspecter.append(thumbImage);\n }\n }\n // }\n\n ret.aspecter = aspecter;\n\n if((size?._ === 'photoSizeEmpty' && isDocument) || (size as PhotoSize.photoStrippedSize)?.bytes) {\n return ret;\n }\n\n let media: HTMLVideoElement | HTMLImageElement;\n if(size?._ === 'videoSize') {\n media = ret.images.full = createVideo();\n media.autoplay = true;\n media.loop = true;\n media.muted = true;\n media.classList.add('media-photo');\n } else {\n media = ret.images.full = new Image();\n media.classList.add('media-photo');\n }\n\n // console.log('wrapPhoto downloaded:', photo, photo.downloaded, container);\n\n const needFadeIn = (thumbImage || !cacheContext.downloaded) && rootScope.settings.animationsEnabled && !noFadeIn;\n\n let preloader: ProgressivePreloader;\n const uploadingFileName = (message as Message.message)?.uploadingFileName;\n if(!withoutPreloader) {\n if(!cacheContext.downloaded || uploadingFileName) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: !!uploadingFileName\n });\n }\n\n if(uploadingFileName) { // means upload\n preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\n preloader.attach(container);\n noAutoDownload = undefined;\n }\n }\n\n\n const getDownloadPromise = () => {\n // const promise = isGif && !size ?\n // managers.appDocsManager.downloadDoc(photo, /* undefined, */lazyLoadQueue?.queueId) :\n // managers.appPhotosManager.preloadPhoto(photo, size, lazyLoadQueue?.queueId, noAutoDownload);\n const haveToDownload = isImageFromDocument && !size;\n const promise = appDownloadManager.downloadMediaURL({\n media: photo,\n thumb: size,\n queueId: lazyLoadQueue?.queueId,\n onlyCache: haveToDownload ? undefined : noAutoDownload\n });\n\n return promise;\n };\n\n const renderOnLoad = (url: string) => {\n return renderMediaWithFadeIn(container, media, url, needFadeIn, aspecter, thumbImage);\n };\n\n const onLoad = async(url: string) => {\n if(middleware && !middleware()) return;\n\n if(processUrl) {\n url = await processUrl(url);\n }\n\n if(blurAfter) {\n const result = blur(url, 12);\n return result.promise.then(() => {\n // image = result.canvas;\n return renderOnLoad(result.canvas.toDataURL());\n });\n }\n\n return renderOnLoad(url);\n };\n\n let loadPromise: Promise;\n const canAttachPreloader = (\n (size as PhotoSize.photoSize).w >= 150 &&\n (size as PhotoSize.photoSize).h >= 150\n ) || noAutoDownload;\n const load = async() => {\n if(noAutoDownload && !withoutPreloader && preloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n const promise = getDownloadPromise();\n const cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n if(\n preloader &&\n !cacheContext.downloaded &&\n !withoutPreloader &&\n canAttachPreloader\n ) {\n preloader.attach(container, false, promise);\n }\n\n noAutoDownload = undefined;\n\n const renderPromise = promise.then(onLoad);\n renderPromise.catch(noop);\n return {download: promise, render: renderPromise};\n };\n\n if(preloader) {\n preloader.setDownloadFunction(load);\n }\n\n if(cacheContext.downloaded) {\n loadThumbPromise = loadPromise = (await load()).render;\n } else {\n if(!lazyLoadQueue) loadPromise = (await load()).render;\n /* else if(noAutoDownload) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(container);\n } */ else lazyLoadQueue.push({div: container, load: () => load().then(({download}) => download)});\n }\n\n if(loadPromises && loadThumbPromise) {\n loadPromises.push(loadThumbPromise);\n }\n\n // const perf = performance.now();\n await loadThumbPromise;\n ret.loadPromises.thumb = loadThumbPromise;\n ret.loadPromises.full = loadPromise || Promise.resolve();\n ret.preloader = preloader;\n\n // const elapsedTime = performance.now() - perf;\n // if(elapsedTime > 4) {\n // console.log('wrapping photo thumb time', elapsedTime, photo, size);\n // }\n\n return ret;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport getMessageSenderPeerIdOrName from '../../lib/appManagers/utils/messages/getMessageSenderPeerIdOrName';\nimport {i18n} from '../../lib/langPack';\nimport rootScope from '../../lib/rootScope';\nimport wrapPeerTitle from './peerTitle';\n\nexport default async function wrapSenderToPeer(message: MyMessage) {\n const senderTitle: HTMLElement = document.createElement('span');\n senderTitle.classList.add('sender-title');\n\n const fromMe = message.fromId === rootScope.myId && message.peerId !== rootScope.myId;\n senderTitle.append(\n fromMe ?\n i18n('FromYou') :\n await wrapPeerTitle({\n ...getMessageSenderPeerIdOrName(message),\n dialog: message.peerId === rootScope.myId\n })\n );\n\n if(await rootScope.managers.appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = await wrapPeerTitle({peerId: message.peerId});\n senderTitle.append(' ➝ ', peerTitle);\n }\n\n return senderTitle;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatDateAccordingToTodayNew} from '../../helpers/date';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\n\nexport default function wrapSentTime(message: MyMessage) {\n const el: HTMLElement = document.createElement('span');\n el.classList.add('sent-time');\n el.append(formatDateAccordingToTodayNew(new Date(message.date * 1000)));\n\n return el;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport assumeType from '../../helpers/assumeType';\nimport getPathFromBytes from '../../helpers/bytes/getPathFromBytes';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport computeLockColor from '../../helpers/computeLockColor';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport renderImageFromUrl, {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport getImageFromStrippedThumb from '../../helpers/getImageFromStrippedThumb';\nimport getPreviewURLFromThumb from '../../helpers/getPreviewURLFromThumb';\nimport makeError from '../../helpers/makeError';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport {isSavingLottiePreview, saveLottiePreview} from '../../helpers/saveLottiePreview';\nimport throttle from '../../helpers/schedulers/throttle';\nimport sequentialDom from '../../helpers/sequentialDom';\nimport {PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport type RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport webpWorkerController from '../../lib/webp/webpWorkerController';\nimport {Awaited, SendMessageEmojiInteractionData} from '../../types';\nimport {getEmojiToneIndex} from '../../vendor/emoji';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport PopupStickers from '../popups/stickers';\nimport {hideToast, toastNew} from '../toast';\nimport wrapStickerAnimation from './stickerAnimation';\nimport framesCache from '../../helpers/framesCache';\n\n// https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/history/view/media/history_view_sticker.cpp#L40\nexport const STICKER_EFFECT_MULTIPLIER = 1 + 0.245 * 2;\nconst EMOJI_EFFECT_MULTIPLIER = 3;\n\nconst locksUrls: {[docId: string]: string} = {};\n\nexport const videosCache: {[key: string]: Promise} = {};\n\nexport default async function wrapSticker({doc, div, middleware, loadStickerMiddleware, lazyLoadQueue, exportLoad, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn, needUpscale, skipRatio, static: asStatic, managers = rootScope.managers, fullThumb, isOut, noPremium, withLock, relativeEffect, loopEffect, isCustomEmoji, syncedVideo}: {\n doc: MyDocument,\n div: HTMLElement | HTMLElement[],\n middleware?: Middleware,\n loadStickerMiddleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n exportLoad?: number,\n group?: AnimationItemGroup,\n play?: boolean,\n onlyThumb?: boolean,\n emoji?: string,\n width?: number,\n height?: number,\n withThumb?: boolean,\n loop?: RLottiePlayer['loop'],\n loadPromises?: Promise[],\n needFadeIn?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n static?: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | VideoSize,\n isOut?: boolean,\n noPremium?: boolean,\n withLock?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean,\n isCustomEmoji?: boolean,\n syncedVideo?: boolean\n}) {\n div = Array.isArray(div) ? div : [div];\n\n if(isCustomEmoji) {\n emoji = doc.stickerEmojiRaw;\n }\n\n const stickerType = doc.sticker;\n if(stickerType === 1) {\n asStatic = true;\n }\n\n if(!width && !height) {\n const sizes = mediaSizes.active;\n const boxSize = emoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\n const size = makeMediaSize(doc.w, doc.h).aspectFitted(boxSize);\n width = size.width;\n height = size.height;\n }\n\n if(stickerType === 2) {\n // LottieLoader.loadLottie();\n lottieLoader.loadLottieWorkers();\n }\n\n div.forEach((div) => {\n div.dataset.docId = '' + doc.id;\n if(emoji) {\n div.dataset.stickerEmoji = emoji;\n }\n\n div.classList.add('media-sticker-wrapper');\n });\n\n /* if(stickerType === 3) {\n const videoRes = wrapVideo({\n doc,\n boxWidth: width,\n boxHeight: height,\n container: div,\n group,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n noPlayButton: true,\n noInfo: true\n });\n\n if(videoRes.thumb) {\n if(videoRes.thumb.images.thumb) {\n videoRes.thumb.images.thumb.classList.add('media-sticker', 'thumbnail');\n }\n\n if(videoRes.thumb.images.full) {\n videoRes.thumb.images.full.classList.add('media-sticker');\n }\n }\n\n return videoRes.loadPromise;\n } */\n\n // console.log('wrap sticker', doc, div, onlyThumb);\n\n let cacheContext: ThumbCache;\n const getCacheContext = async(type: string = cacheContext?.type) => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, type);\n };\n\n const isAnimated = !asStatic && (stickerType === 2 || stickerType === 3);\n\n const effectThumb = getStickerEffectThumb(doc);\n if(isOut !== undefined && effectThumb && !isOut) {\n div.forEach((div) => div.classList.add('reflect-x'));\n }\n\n const willHaveLock = effectThumb && withLock;\n if(willHaveLock) {\n const lockUrl = locksUrls[doc.id];\n div.forEach((div) => {\n div.classList.add('is-premium-sticker', 'tgico-premium_lock');\n lockUrl && div.style.setProperty('--lock-url', `url(${lockUrl})`);\n });\n }\n\n if(asStatic && stickerType !== 1) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n await getCacheContext(thumb.type);\n } else {\n await getCacheContext(fullThumb?.type);\n }\n\n const toneIndex = emoji && !isCustomEmoji ? getEmojiToneIndex(emoji) : -1;\n const downloaded = cacheContext.downloaded && !needFadeIn;\n\n const isThumbNeededForType = isAnimated;\n const lottieCachedThumb = stickerType === 2 || stickerType === 3 ? await managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex) : undefined;\n\n const ret = {render: undefined as typeof loadPromise, load: undefined as typeof load};\n let loadThumbPromise = deferredPromise();\n let haveThumbCached = false;\n if((\n doc.thumbs?.length ||\n lottieCachedThumb\n ) &&\n !div[0].firstElementChild && (\n !downloaded ||\n isThumbNeededForType ||\n onlyThumb\n ) && withThumb !== false/* && doc.thumbs[0]._ !== 'photoSizeEmpty' */\n ) {\n let thumb = lottieCachedThumb || doc.thumbs[0];\n\n // console.log('wrap sticker', thumb, div);\n\n const afterRender = (div: HTMLElement, thumbImage: HTMLElement) => {\n if(!div.childElementCount) {\n thumbImage.classList.add('media-sticker', 'thumbnail');\n\n sequentialDom.mutateElement(div, () => {\n div.append(thumbImage);\n loadThumbPromise.resolve();\n });\n } else {\n loadThumbPromise.resolve();\n }\n };\n\n if('url' in thumb) {\n haveThumbCached = true;\n div.forEach((div) => {\n const thumbImage = new Image();\n renderImageFromUrl(thumbImage, (thumb as any).url, () => afterRender(div, thumbImage));\n });\n } else if('bytes' in thumb) {\n if(thumb._ === 'photoPathSize') {\n if(!thumb.bytes.length) {\n thumb = doc.thumbs.find((t) => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\n }\n\n const d = getPathFromBytes((thumb as PhotoSize.photoStrippedSize).bytes);\n const ns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(ns, 'svg');\n svg.classList.add('rlottie-vector', 'media-sticker', 'thumbnail');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${doc.w || 512} ${doc.h || 512}`);\n\n // const defs = document.createElementNS(ns, 'defs');\n // const linearGradient = document.createElementNS(ns, 'linearGradient');\n // linearGradient.setAttributeNS(null, 'id', 'g');\n // linearGradient.setAttributeNS(null, 'x1', '-300%');\n // linearGradient.setAttributeNS(null, 'x2', '-200%');\n // linearGradient.setAttributeNS(null, 'y1', '0');\n // linearGradient.setAttributeNS(null, 'y2', '0');\n // const stops = [\n // ['-10%', '.1'],\n // ['30%', '.07'],\n // ['70%', '.07'],\n // ['110%', '.1']\n // ].map(([offset, stopOpacity]) => {\n // const stop = document.createElementNS(ns, 'stop');\n // stop.setAttributeNS(null, 'offset', offset);\n // stop.setAttributeNS(null, 'stop-opacity', stopOpacity);\n // return stop;\n // });\n // const animates = [\n // ['-300%', '1200%'],\n // ['-200%', '1300%']\n // ].map(([from, to], idx) => {\n // const animate = document.createElementNS(ns, 'animate');\n // animate.setAttributeNS(null, 'attributeName', 'x' + (idx + 1));\n // animate.setAttributeNS(null, 'from', from);\n // animate.setAttributeNS(null, 'to', to);\n // animate.setAttributeNS(null, 'dur', '3s');\n // animate.setAttributeNS(null, 'repeatCount', 'indefinite');\n // return animate;\n // });\n // linearGradient.append(...stops, ...animates);\n // defs.append(linearGradient);\n // svg.append(defs);\n\n const path = document.createElementNS(ns, 'path');\n path.setAttributeNS(null, 'd', d);\n if(rootScope.settings.animationsEnabled && !isCustomEmoji) path.setAttributeNS(null, 'fill', 'url(#g)');\n svg.append(path);\n div.forEach((div, idx) => div.append(idx > 0 ? svg.cloneNode(true) : svg));\n haveThumbCached = true;\n loadThumbPromise.resolve();\n } else if(toneIndex <= 0) {\n const r = () => {\n (div as HTMLElement[]).forEach((div) => {\n const thumbImage = new Image();\n const url = getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage));\n });\n };\n\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\n haveThumbCached = true;\n r();\n } else {\n haveThumbCached = true;\n webpWorkerController.convert('main-' + doc.id, thumb.bytes).then((bytes) => {\n managers.appDocsManager.saveWebPConvertedStrippedThumb(doc.id, bytes);\n (thumb as PhotoSize.photoStrippedSize).bytes = bytes;\n doc.pFlags.stickerThumbConverted = true;\n\n if((middleware && !middleware()) || (div as HTMLElement[])[0].childElementCount) {\n loadThumbPromise.resolve();\n return;\n }\n\n r();\n }).catch(() => loadThumbPromise.resolve());\n }\n }\n } else if(((stickerType === 2 && toneIndex <= 0) || stickerType === 3) && (withThumb || onlyThumb)) {\n const load = async() => {\n if((div as HTMLElement[])[0].childElementCount || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n const r = (div: HTMLElement, thumbImage: HTMLElement, url: string) => {\n if(div.childElementCount || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n if(!url) afterRender(div, thumbImage);\n else renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage));\n };\n\n await getCacheContext();\n (div as HTMLElement[]).forEach((div) => {\n if(cacheContext.url) {\n r(div, new Image(), cacheContext.url);\n } else if('bytes' in thumb) {\n const res = getImageFromStrippedThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n res.loadPromise.then(() => r(div, res.image, ''));\n\n // return managers.appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\n } else {\n appDownloadManager.downloadMediaURL({\n media: doc,\n thumb: thumb as PhotoSize\n }).then(async(url) => {\n return r(div, new Image(), url);\n });\n }\n });\n };\n\n if(lazyLoadQueue && onlyThumb) {\n lazyLoadQueue.push({div: div[0], load});\n loadThumbPromise.resolve();\n return ret;\n } else {\n load();\n\n if((thumb as any).url) {\n haveThumbCached = true;\n }\n }\n }\n }\n\n if(loadPromises && haveThumbCached) {\n loadPromises.push(loadThumbPromise);\n }\n\n if(onlyThumb/* || true */) { // for sticker panel\n return ret;\n }\n\n const middlewareError = makeError('MIDDLEWARE');\n const load = async() => {\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n if(stickerType === 2 && !asStatic) {\n return appDownloadManager.downloadMedia({media: doc, queueId: lazyLoadQueue?.queueId, thumb: fullThumb})\n .then(async(blob) => {\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n const animation = await lottieLoader.loadAnimationWorker({\n container: (div as HTMLElement[])[0],\n loop: !!(!emoji || isCustomEmoji) && loop,\n autoplay: play,\n animationData: blob,\n width,\n height,\n name: 'doc' + doc.id,\n needUpscale,\n skipRatio,\n toneIndex,\n sync: isCustomEmoji,\n middleware: loadStickerMiddleware ?? middleware,\n group\n });\n\n // const deferred = deferredPromise();\n\n const setLockColor = willHaveLock ? () => {\n const lockUrl = locksUrls[doc.id] ??= computeLockColor(animation.canvas[0]);\n (div as HTMLElement[]).forEach((div) => div.style.setProperty('--lock-url', `url(${lockUrl})`));\n } : undefined;\n\n const onFirstFrame = (container: HTMLElement, canvas: HTMLCanvasElement) => {\n const element = container.firstElementChild;\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\n }\n\n const cb = () => {\n if(element && element !== canvas && element.tagName !== 'DIV') {\n element.remove();\n }\n };\n\n if(!needFadeIn) {\n if(element) {\n sequentialDom.mutate(cb);\n }\n } else {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.add('fade-in');\n if(element) {\n element.classList.add('fade-out');\n }\n\n (canvas || element).addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.remove('fade-in');\n cb();\n });\n }, {once: true});\n });\n }\n };\n\n animation.addEventListener('firstFrame', () => {\n const canvas = animation.canvas[0];\n if(withThumb !== false || isCustomEmoji) {\n saveLottiePreview(doc, canvas, toneIndex);\n }\n\n if(willHaveLock) {\n setLockColor();\n }\n\n if(!isCustomEmoji) {\n (div as HTMLElement[]).forEach((container, idx) => {\n onFirstFrame(container, animation.canvas[idx]);\n });\n }\n }, {once: true});\n\n if(emoji) {\n managers.appStickersManager.preloadAnimatedEmojiStickerAnimation(emoji);\n }\n\n return animation;\n\n // return deferred;\n // await new Promise((resolve) => setTimeout(resolve, 5e3));\n });\n } else if(asStatic || stickerType === 3) {\n const isSingleVideo = isAnimated && syncedVideo;\n const cacheName = isSingleVideo ? framesCache.generateName('' + doc.id, 0, 0, undefined, undefined) : undefined;\n\n const cachePromise = videosCache[cacheName];\n if(cachePromise) {\n return cachePromise as typeof promise;\n }\n\n const d = isSingleVideo ? (div as HTMLElement[]).slice(0, 1) : div as HTMLElement[];\n const media: HTMLElement[] = d.map(() => {\n let media: HTMLElement;\n if(asStatic) {\n media = new Image();\n } else {\n const video = media = createVideo();\n video.muted = true;\n if(play) video.autoplay = true;\n if(loop) video.loop = true;\n\n if(loop && typeof(loop) === 'number') {\n let previousTime = 0, playedTimes = 0;\n function onTimeupdate(this: HTMLVideoElement) {\n if(previousTime > this.currentTime && ++playedTimes === loop as number) {\n this.autoplay = false;\n this.loop = false;\n this.pause();\n video.removeEventListener('timeupdate', onTimeupdate);\n }\n\n previousTime = this.currentTime;\n }\n\n video.addEventListener('timeupdate', onTimeupdate);\n }\n }\n\n media.classList.add('media-sticker');\n return media;\n });\n\n const thumbImage = (div as HTMLElement[]).map((div, idx) => (div.firstElementChild as HTMLElement) !== media[idx] && div.firstElementChild) as HTMLElement[];\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !downloaded || (asStatic ? thumbImage[0] : (!thumbImage[0] || thumbImage[0].tagName === 'svg'))) && rootScope.settings.animationsEnabled;\n }\n\n if(needFadeIn) {\n media.forEach((media) => media.classList.add('fade-in'));\n }\n\n const promise = new Promise(async(resolve, reject) => {\n const r = async() => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n const mediaLength = media.length;\n const loaded: HTMLElement[] = [];\n const onLoad = (div: HTMLElement, media: HTMLElement, thumbImage: HTMLElement) => {\n sequentialDom.mutateElement(div, () => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n if(!media) {\n if(!isSingleVideo || !isAnimated) {\n thumbImage?.remove();\n }\n\n return;\n }\n\n if(media as HTMLVideoElement) {\n const w = width * window.devicePixelRatio;\n const h = height * window.devicePixelRatio;\n if(!isSavingLottiePreview(doc, toneIndex, w, h)) {\n // const perf = performance.now();\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(media as HTMLVideoElement, 0, 0, canvas.width, canvas.height);\n saveLottiePreview(doc, canvas, toneIndex);\n // console.log('perf', performance.now() - perf);\n }\n }\n\n if(isSingleVideo) {\n resolve(media as any);\n return;\n }\n\n div.append(media);\n\n if(needFadeIn) {\n thumbImage && thumbImage.classList.add('fade-out');\n media.addEventListener('animationend', () => {\n media.classList.remove('fade-in');\n thumbImage?.remove();\n }, {once: true});\n } else {\n thumbImage?.remove();\n }\n\n if(isAnimated) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group, undefined, middleware);\n }\n\n if(loaded.push(media) === mediaLength) {\n resolve(loaded as any);\n }\n });\n };\n\n await getCacheContext();\n let lastPromise: Promise;\n (div as HTMLElement[]).forEach((div, idx) => {\n const _media = media[idx];\n const cb = () => onLoad(div, _media, thumbImage[idx]);\n if(_media) lastPromise = renderImageFromUrlPromise(_media, cacheContext.url);\n lastPromise.then(cb);\n });\n };\n\n await getCacheContext();\n if(cacheContext.url) r();\n else {\n let promise: Promise;\n if(stickerType !== 1 && asStatic) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n // promise = managers.appDocsManager.getThumbURL(doc, thumb).promise\n promise = appDownloadManager.downloadMediaURL({media: doc, thumb, queueId: lazyLoadQueue?.queueId});\n } else {\n promise = appDownloadManager.downloadMediaURL({media: doc, queueId: lazyLoadQueue?.queueId});\n }\n\n promise.then(r, reject);\n }\n });\n\n if(cacheName) {\n videosCache[cacheName] = promise as any;\n loadStickerMiddleware && promise.finally(() => {\n if(!loadStickerMiddleware()) {\n delete videosCache[cacheName];\n }\n });\n }\n\n return promise;\n }\n };\n\n if(exportLoad && ((exportLoad === 1 && (!downloaded || isAnimated)) || exportLoad === 2)) {\n ret.load = load;\n return ret;\n }\n\n const loadPromise: Promise> | void> = lazyLoadQueue && (!downloaded || isAnimated) ?\n (lazyLoadQueue.push({div: div[0], load}), Promise.resolve()) :\n load();\n\n if(downloaded && (asStatic/* || stickerType === 3 */)) {\n loadThumbPromise = loadPromise as any;\n if(loadPromises) {\n loadPromises.push(loadThumbPromise);\n }\n }\n\n if(stickerType === 2 && effectThumb && isOut !== undefined && !noPremium) {\n attachStickerEffectHandler({\n container: div[0],\n doc,\n managers,\n middleware,\n isOut,\n width,\n loadPromise,\n relativeEffect,\n loopEffect\n });\n }\n\n ret.render = loadPromise as any;\n return ret;\n}\n\nfunction attachStickerEffectHandler({container, doc, managers, middleware, isOut, width, loadPromise, relativeEffect, loopEffect}: {\n container: HTMLElement,\n doc: MyDocument,\n managers: AppManagers,\n middleware: Middleware,\n isOut: boolean,\n width: number,\n loadPromise: Promise,\n relativeEffect?: boolean,\n loopEffect?: boolean\n}) {\n managers.appStickersManager.preloadSticker(doc.id, true);\n\n let playing = false;\n attachClickEvent(container, async(e) => {\n cancelEvent(e);\n if(playing) {\n const a = document.createElement('a');\n a.onclick = () => {\n hideToast();\n new PopupStickers(doc.stickerSetInput).show();\n };\n\n toastNew({\n langPackKey: 'Sticker.Premium.Click.Info',\n langPackArguments: [a]\n });\n\n return;\n }\n\n playing = true;\n\n await loadPromise;\n const {animationDiv, stickerPromise} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: width * STICKER_EFFECT_MULTIPLIER,\n target: container,\n play: true,\n fullThumb: getStickerEffectThumb(doc),\n relativeEffect,\n loopEffect\n });\n\n if(isOut !== undefined && !isOut/* && !relativeEffect */) {\n animationDiv.classList.add('reflect-x');\n }\n\n stickerPromise.then((player) => {\n player.addEventListener('destroy', () => {\n playing = false;\n });\n });\n });\n}\n\nexport async function onEmojiStickerClick({event, container, managers, peerId, middleware}: {\n event: Event,\n container: HTMLElement,\n managers: AppManagers,\n peerId: PeerId,\n middleware: Middleware\n}) {\n cancelEvent(event);\n\n const bubble = findUpClassName(container, 'bubble');\n const emoji = container.dataset.stickerEmoji;\n\n const animation = !container.classList.contains('custom-emoji') ? lottieLoader.getAnimation(container) : undefined;\n if(animation?.paused) {\n const doc = await managers.appStickersManager.getAnimatedEmojiSoundDocument(emoji);\n if(doc) {\n const audio = document.createElement('audio');\n audio.style.display = 'none';\n container.parentElement.append(audio);\n\n try {\n const url = await appDownloadManager.downloadMediaURL({media: doc});\n\n audio.src = url;\n audio.play();\n await onMediaLoad(audio, undefined, true);\n\n audio.addEventListener('ended', () => {\n audio.src = '';\n audio.remove();\n }, {once: true});\n } catch(err) {\n\n }\n }\n\n animation.autoplay = true;\n animation.restart();\n }\n\n if(!peerId.isUser()) {\n return;\n }\n\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji, true);\n if(!doc) {\n return;\n }\n\n const data: SendMessageEmojiInteractionData = (container as any).emojiData ??= {\n a: [],\n v: 1\n };\n\n const sendInteractionThrottled: () => void = (container as any).sendInteractionThrottled = throttle(() => {\n const length = data.a.length;\n if(!length) {\n return;\n }\n\n const firstTime = data.a[0].t;\n\n data.a.forEach((a) => {\n a.t = (a.t - firstTime) / 1000;\n });\n\n const bubble = findUpClassName(container, 'bubble');\n managers.appMessagesManager.setTyping(appImManager.chat.peerId, {\n _: 'sendMessageEmojiInteraction',\n msg_id: getServerMessageId(+bubble.dataset.mid),\n emoticon: emoji,\n interaction: {\n _: 'dataJSON',\n data: JSON.stringify(data)\n }\n }, true, appImManager.chat.threadId);\n\n data.a.length = 0;\n }, 1000, false);\n\n const isOut = bubble ? bubble.classList.contains('is-out') : undefined;\n const {animationDiv} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: 360,\n target: container,\n play: true,\n withRandomOffset: true\n });\n\n if(isOut !== undefined && !isOut) {\n animationDiv.classList.add('reflect-x');\n }\n\n // using a trick here: simulated event from interlocutor's interaction won't fire ours\n if(event.isTrusted) {\n data.a.push({\n i: 1,\n t: Date.now()\n });\n\n sendInteractionThrottled();\n }\n // });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n/**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\nexport default function getPathFromBytes(bytes: Uint8Array) {\n const lookup = 'AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,';\n\n let path = 'M';\n for(let i = 0, length = bytes.length; i < length; ++i) {\n const num = bytes[i];\n\n if(num >= (128 + 64)) {\n path += lookup[num - 128 - 64];\n } else {\n if(num >= 128) {\n path += ',';\n } else if(num >= 64) {\n path += '-';\n }\n path += '' + (num & 63);\n }\n }\n path += 'z';\n\n return path;\n}\n","// https://github.com/telegramdesktop/tdesktop/blob/543bfab24a76402992421063f1e6444f347d31fe/Telegram/SourceFiles/boxes/sticker_set_box.cpp#L75\nexport default function computeLockColor(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n const size = 20 * (canvas.dpr ?? 1);\n const width = size;\n const height = size;\n const skipx = (canvas.width - width) / 2;\n const margin = 0/* * (canvas.dpr ?? 1) */;\n const skipy = canvas.height - height - margin;\n const imageData = context.getImageData(skipx, skipy, width, height).data;\n let sr = 0, sg = 0, sb = 0, sa = 0;\n for(let i = 0; i < imageData.length; i += 4) {\n sr += imageData[i];\n sg += imageData[i + 1];\n sb += imageData[i + 2];\n sa += imageData[i + 3];\n }\n\n const outCanvas = document.createElement('canvas');\n outCanvas.width = size;\n outCanvas.height = size;\n const outContext = outCanvas.getContext('2d');\n const color = new Uint8ClampedArray([sr * 255 / sa, sg * 255 / sa, sb * 255 / sa, 255]);\n const rgba = `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})`;\n outContext.fillStyle = rgba;\n outContext.fillRect(0, 0, outCanvas.width, outCanvas.height);\n outContext.fillStyle = `rgba(112, 117, 121, 0.3)`;\n outContext.fillRect(0, 0, outCanvas.width, outCanvas.height);\n // document.querySelector('.popup-title').append(c);\n return outCanvas.toDataURL('image/jpeg');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport assumeType from '../../helpers/assumeType';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport makeError from '../../helpers/makeError';\nimport {getMiddleware, Middleware} from '../../helpers/middleware';\nimport throttleWithRaf from '../../helpers/schedulers/throttleWithRaf';\nimport windowSize from '../../helpers/windowSize';\nimport {PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport wrapSticker from './sticker';\n\nexport default function wrapStickerAnimation({\n size,\n doc,\n middleware,\n target,\n side,\n skipRatio,\n play,\n managers,\n fullThumb,\n withRandomOffset,\n relativeEffect,\n loopEffect\n}: {\n size: number,\n doc: MyDocument,\n middleware?: Middleware,\n target: HTMLElement,\n side: 'left' | 'center' | 'right',\n skipRatio?: number,\n play: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | VideoSize,\n withRandomOffset?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean\n}) {\n const animationDiv = document.createElement('div');\n animationDiv.classList.add('emoji-animation');\n\n // const size = 280;\n animationDiv.style.width = size + 'px';\n animationDiv.style.height = size + 'px';\n\n let animation: RLottiePlayer;\n const unmountAnimation = () => {\n middlewareHelper.clean();\n animation?.remove();\n animationDiv.remove();\n appImManager.chat.bubbles.scrollable.container.removeEventListener('scroll', onScroll);\n };\n\n const middlewareHelper = middleware?.create() ?? getMiddleware();\n middleware = middlewareHelper.get();\n\n const stickerPromise = wrapSticker({\n div: animationDiv,\n doc,\n middleware,\n withThumb: false,\n needFadeIn: false,\n loop: !!loopEffect,\n width: size,\n height: size,\n play,\n group: 'none',\n skipRatio,\n managers,\n fullThumb\n }).then(({render}) => render).then((_animation) => {\n assumeType(_animation);\n if(!middleware()) {\n _animation.remove();\n throw makeError('MIDDLEWARE');\n }\n\n animation = _animation;\n animation.addEventListener('enterFrame', (frameNo) => {\n if((!loopEffect && frameNo === animation.maxFrame) || !isInDOM(target)) {\n unmountAnimation();\n }\n });\n\n if(IS_VIBRATE_SUPPORTED) {\n animation.addEventListener('firstFrame', () => {\n navigator.vibrate(100);\n }, {once: true});\n }\n\n return animation;\n });\n\n const generateRandomSigned = (max: number) => {\n const r = Math.random() * max * 2;\n return r > max ? -r % max : r;\n };\n\n const randomOffsetX = withRandomOffset ? generateRandomSigned(16) : 0;\n const randomOffsetY = withRandomOffset ? generateRandomSigned(4) : 0;\n const setPosition = () => {\n if(!isInDOM(target)) {\n unmountAnimation();\n return;\n }\n\n const rect = target.getBoundingClientRect();\n\n const factor = rect.width / 200;\n const stableOffsetX = side === 'center' ? 0 : 16 * (side === 'right' ? 1 : -1) * factor;\n // const stableOffsetY = side === 'center' ? 0 : -50 * factor;\n const stableOffsetY = side === 'center' ? 0 : 0 * factor;\n\n const rectX = side === 'right' ? rect.right : rect.left;\n const rectY = rect.top;\n\n const addOffsetX = (side === 'center' ? (rect.width - size) / 2 : (side === 'right' ? -size : 0)) + stableOffsetX + randomOffsetX;\n const addOffsetY = (side === 'center' || true ? (rect.height - size) / 2 : 0) + stableOffsetY + randomOffsetY;\n const x = rectX + addOffsetX;\n const y = rectY + addOffsetY;\n\n if(y <= -size || y >= windowSize.height) {\n unmountAnimation();\n return;\n }\n\n if(relativeEffect) {\n if(side !== 'center') animationDiv.style[side] = Math.abs(stableOffsetX) * -1 + 'px';\n else animationDiv.style.left = addOffsetX + 'px';\n animationDiv.style.top = addOffsetY + 'px';\n } else {\n animationDiv.style.top = y + 'px';\n animationDiv.style.left = x + 'px';\n }\n };\n\n const onScroll = throttleWithRaf(setPosition);\n appImManager.chat.bubbles.scrollable.container.addEventListener('scroll', onScroll);\n\n setPosition();\n\n if(relativeEffect) {\n animationDiv.classList.add('is-relative');\n target.parentElement.append(animationDiv);\n } else {\n appImManager.emojiAnimationContainer.append(animationDiv);\n }\n\n return {animationDiv, stickerPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\nimport wrapSticker from './sticker'\nimport {Modify} from '../../types';\n\nexport default async function wrapStickerEmoji(options: Modify[0], {\n div: HTMLElement,\n doc?: never,\n loop?: never\n}>) {\n const {\n emoji,\n div,\n managers = rootScope.managers\n } = options;\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji);\n if(!doc) {\n div.classList.add('media-sticker-wrapper');\n throw new Error('no sticker');\n }\n\n return wrapSticker({\n ...options,\n doc,\n loop: false,\n play: true\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport createVideo from '../../helpers/dom/createVideo';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport {Document, StickerSet} from '../../layer';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport wrapSticker from './sticker';\nimport {Middleware} from '../../helpers/middleware';\n\nexport default async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height, managers = rootScope.managers, middleware}: {\n set: StickerSet.stickerSet,\n lazyLoadQueue: LazyLoadQueue,\n container: HTMLElement,\n group: AnimationItemGroup,\n autoplay: boolean,\n width: number,\n height: number,\n managers?: AppManagers\n middleware?: Middleware\n}) {\n if(set.thumbs?.length) {\n container.classList.add('media-sticker-wrapper');\n lazyLoadQueue.push({\n div: container,\n load: async() => {\n const downloadOptions = await managers.appStickersManager.getStickerSetThumbDownloadOptions(set);\n const promise = appDownloadManager.download(downloadOptions);\n\n if(set.pFlags.animated && !set.pFlags.videos) {\n return promise\n .then((blob) => {\n lottieLoader.loadAnimationWorker({\n container,\n loop: true,\n autoplay,\n animationData: blob,\n width,\n height,\n needUpscale: true,\n name: 'setThumb' + set.id,\n group,\n middleware\n });\n });\n } else {\n let media: HTMLElement;\n if(set.pFlags.videos) {\n media = createVideo();\n (media as HTMLVideoElement).autoplay = true;\n (media as HTMLVideoElement).muted = true;\n (media as HTMLVideoElement).loop = true;\n } else {\n media = new Image();\n }\n\n media.classList.add('media-sticker');\n\n return promise.then((blob) => {\n renderImageFromUrl(media, URL.createObjectURL(blob), () => {\n container.append(media);\n\n if(set.pFlags.videos) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\n }\n });\n });\n }\n }\n });\n\n return;\n }\n\n let getDocPromise: Promise;\n\n if(set.thumb_document_id) {\n getDocPromise = managers.appEmojiManager.getCustomEmojiDocument(set.thumb_document_id);\n } else {\n getDocPromise = managers.appStickersManager.getStickerSet(set).then((stickerSet) => stickerSet.documents[0]);\n }\n\n const doc = await getDocPromise;\n if(doc._ !== 'documentEmpty') { // as thumb will be used first sticker\n wrapSticker({\n doc,\n div: container,\n group: group,\n lazyLoadQueue,\n managers,\n width,\n height,\n middleware\n }); // kostil\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport Row from '../row';\nimport wrapSticker from './sticker';\n\nexport default function wrapStickerToRow({doc, row, size, managers}: {\n doc: MyDocument,\n row: Row,\n size?: 'small' | 'large',\n managers?: AppManagers\n}) {\n const previousMedia = row.media;\n const media = row.createMedia('small');\n\n if(previousMedia) {\n media.classList.add('hide');\n }\n\n const loadPromises: Promise[] = previousMedia ? [] : undefined;\n\n const _size = size === 'small' ? 32 : 48;\n const result = wrapSticker({\n div: media,\n doc: doc,\n width: _size,\n height: _size,\n loadPromises,\n managers\n }).then(({render}) => render);\n\n loadPromises && Promise.all(loadPromises).then(() => {\n media.classList.remove('hide');\n previousMedia.remove();\n });\n\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {i18n} from '../../lib/langPack';\nimport wrapTelegramUrlToAnchor from '../../lib/richTextProcessor/wrapTelegramUrlToAnchor';\nimport rootScope from '../../lib/rootScope';\nimport wrapPeerTitle from './peerTitle';\n\nexport default async function wrapTopicNameButton(\n options: {\n lastMsgId?: number\n } & Pick[0], 'peerId' | 'threadId' | 'wrapOptions' | 'withIcons'>\n) {\n const {peerId, threadId, lastMsgId} = options;\n\n const loadPromise: Promise = Promise.resolve();\n const a = wrapTelegramUrlToAnchor('t.me/c/' + peerId.toChatId() + (threadId ? '/' + getServerMessageId(threadId) : '') + (lastMsgId ? '/' + getServerMessageId(lastMsgId) : ''));\n a.classList.add('topic-name', 'topic-name-button');\n // if(threadId) {\n // const topic = await rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId);\n // if(!topic) {\n // a.append(i18n('Loading'));\n // loadPromise = rootScope.managers.dialogsStorage.getForumTopicById(peerId, threadId)\n // }\n // } else {\n a.append(await wrapPeerTitle(options));\n // }\n\n return {\n cached: true,\n element: a,\n loadPromise\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport {animateSingle} from '../../helpers/animation';\nimport {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport getStrippedThumbIfNeeded from '../../helpers/getStrippedThumbIfNeeded';\nimport makeError from '../../helpers/makeError';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport noop from '../../helpers/noop';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport {fastRaf} from '../../helpers/schedulers';\nimport throttle from '../../helpers/schedulers/throttle';\nimport sequentialDom from '../../helpers/sequentialDom';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport {Message, PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport rootScope from '../../lib/rootScope';\nimport {ThumbCache} from '../../lib/storages/thumbs';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport appMediaPlaybackController, {MediaSearchContext} from '../appMediaPlaybackController';\nimport {findMediaTargets} from '../audio';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ProgressivePreloader from '../preloader';\nimport wrapPhoto from './photo';\n\nconst MAX_VIDEO_AUTOPLAY_SIZE = 50 * 1024 * 1024; // 50 MB\n\nlet roundVideoCircumference = 0;\nmediaSizes.addEventListener('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n const elements = Array.from(document.querySelectorAll('.media-round .progress-ring')) as SVGSVGElement[];\n const width = mediaSizes.active.round.width;\n const halfSize = width / 2;\n const radius = halfSize - 7;\n roundVideoCircumference = 2 * Math.PI * radius;\n elements.forEach((element) => {\n element.setAttributeNS(null, 'width', '' + width);\n element.setAttributeNS(null, 'height', '' + width);\n\n const circle = element.firstElementChild as SVGCircleElement;\n circle.setAttributeNS(null, 'cx', '' + halfSize);\n circle.setAttributeNS(null, 'cy', '' + halfSize);\n circle.setAttributeNS(null, 'r', '' + radius);\n\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n });\n }\n});\n\nexport default async function wrapVideo({doc, container, message, boxWidth, boxHeight, withTail, isOut, middleware, lazyLoadQueue, noInfo, group, onlyPreview, noPreview, withoutPreloader, loadPromises, noPlayButton, photoSize, videoSize, searchContext, autoDownload, managers = rootScope.managers, noAutoplayAttribute}: {\n doc: MyDocument,\n container?: HTMLElement,\n message?: Message.message,\n boxWidth?: number,\n boxHeight?: number,\n withTail?: boolean,\n isOut?: boolean,\n middleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n noInfo?: boolean,\n noPlayButton?: boolean,\n group?: AnimationItemGroup,\n onlyPreview?: boolean,\n noPreview?: boolean,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n photoSize?: PhotoSize,\n videoSize?: VideoSize,\n searchContext?: MediaSearchContext,\n managers?: AppManagers,\n noAutoplayAttribute?: boolean\n}) {\n const autoDownloadSize = autoDownload?.video;\n let noAutoDownload = autoDownloadSize === 0;\n const isAlbumItem = !(boxWidth && boxHeight);\n const canAutoplay = /* doc.sticker || */(\n (\n doc.type !== 'video' || (\n doc.size <= MAX_VIDEO_AUTOPLAY_SIZE &&\n !isAlbumItem\n )\n ) && (doc.type === 'gif' ? rootScope.settings.autoPlay.gifs : rootScope.settings.autoPlay.videos)\n );\n let spanTime: HTMLElement, spanPlay: HTMLElement;\n\n if(!noInfo) {\n spanTime = document.createElement('span');\n spanTime.classList.add('video-time');\n container.append(spanTime);\n\n let needPlayButton = false;\n if(doc.type !== 'gif') {\n spanTime.innerText = toHHMMSS(doc.duration, false);\n\n if(!noPlayButton && doc.type !== 'round') {\n if(canAutoplay && !noAutoDownload) {\n spanTime.classList.add('tgico', 'can-autoplay');\n } else {\n needPlayButton = true;\n }\n }\n } else {\n spanTime.innerText = 'GIF';\n\n if(!canAutoplay && !noPlayButton) {\n needPlayButton = true;\n noAutoDownload = undefined;\n }\n }\n\n if(needPlayButton) {\n spanPlay = document.createElement('span');\n spanPlay.classList.add('video-play', 'tgico-largeplay', 'btn-circle', 'position-center');\n container.append(spanPlay);\n }\n }\n\n const res: {\n thumb?: typeof photoRes,\n loadPromise: Promise\n } = {} as any;\n\n if(doc.mime_type === 'image/gif') {\n const photoRes = await wrapPhoto({\n photo: doc,\n message,\n container,\n boxWidth,\n boxHeight,\n withTail,\n isOut,\n lazyLoadQueue,\n middleware,\n withoutPreloader,\n loadPromises,\n autoDownloadSize,\n size: photoSize,\n managers\n });\n\n res.thumb = photoRes;\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n /* const video = doc.type === 'round' ? appMediaPlaybackController.addMedia(doc, message.mid) as HTMLVideoElement : document.createElement('video');\n if(video.parentElement) {\n video.remove();\n } */\n\n let preloader: ProgressivePreloader; // it must be here, otherwise will get error before initialization in round onPlay\n\n const video = createVideo();\n video.classList.add('media-video');\n video.muted = true;\n if(doc.type === 'round') {\n const divRound = document.createElement('div');\n divRound.classList.add('media-round', 'z-depth-1');\n divRound.dataset.mid = '' + message.mid;\n divRound.dataset.peerId = '' + message.peerId;\n (divRound as any).message = message;\n\n const size = mediaSizes.active.round;\n const halfSize = size.width / 2;\n const strokeWidth = 3.5;\n const radius = halfSize - (strokeWidth * 2);\n divRound.innerHTML = `\n \n `;\n\n const circle = divRound.firstElementChild.firstElementChild as SVGCircleElement;\n if(!roundVideoCircumference) {\n roundVideoCircumference = 2 * Math.PI * radius;\n }\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n\n spanTime.classList.add('tgico');\n\n const isUnread = message.pFlags.media_unread;\n if(isUnread) {\n divRound.classList.add('is-unread');\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = doc.w/* * window.devicePixelRatio */;\n\n divRound.prepend(canvas, spanTime);\n divRound.append(video);\n container.append(divRound);\n\n const ctx = canvas.getContext('2d');\n /* ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2);\n ctx.clip(); */\n\n const onLoad = () => {\n const message: Message.message = (divRound as any).message;\n const globalVideo = appMediaPlaybackController.addMedia(message, !noAutoDownload) as HTMLVideoElement;\n const clear = () => {\n (appImManager.chat.setPeerPromise || Promise.resolve()).finally(() => {\n if(isInDOM(globalVideo)) {\n return;\n }\n\n globalVideo.removeEventListener('play', onPlay);\n globalVideo.removeEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.removeEventListener('pause', onPaused);\n globalVideo.removeEventListener('ended', onEnded);\n });\n };\n\n const onFrame = () => {\n ctx.drawImage(globalVideo, 0, 0);\n\n const offset = roundVideoCircumference - globalVideo.currentTime / globalVideo.duration * roundVideoCircumference;\n circle.style.strokeDashoffset = '' + offset;\n\n return !globalVideo.paused;\n };\n\n const onTimeUpdate = () => {\n if(!globalVideo.duration) {\n return;\n }\n\n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n\n if(globalVideo.paused) {\n onFrame();\n }\n\n spanTime.innerText = toHHMMSS(globalVideo.duration - globalVideo.currentTime, false);\n };\n\n const throttledTimeUpdate = throttle(() => {\n fastRaf(onTimeUpdate);\n }, 1000, false);\n\n const onPlay = () => {\n video.classList.add('hide');\n divRound.classList.remove('is-paused');\n animateSingle(onFrame, canvas);\n\n if(preloader && preloader.preloader && preloader.preloader.classList.contains('manual')) {\n preloader.onClick();\n }\n };\n\n const onPaused = () => {\n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n\n divRound.classList.add('is-paused');\n };\n\n const onEnded = () => {\n video.classList.remove('hide');\n divRound.classList.add('is-paused');\n\n video.currentTime = 0;\n spanTime.innerText = toHHMMSS(globalVideo.duration, false);\n\n if(globalVideo.currentTime) {\n globalVideo.currentTime = 0;\n }\n };\n\n globalVideo.addEventListener('play', onPlay);\n globalVideo.addEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.addEventListener('pause', onPaused);\n globalVideo.addEventListener('ended', onEnded);\n\n attachClickEvent(canvas, (e) => {\n cancelEvent(e);\n\n // ! костыль\n if(preloader && !preloader.detached) {\n preloader.onClick();\n }\n\n // ! can't use it here. on Safari iOS video won't start.\n /* if(globalVideo.readyState < 2) {\n return;\n } */\n\n if(globalVideo.paused) {\n const hadSearchContext = !!searchContext;\n if(appMediaPlaybackController.setSearchContext(searchContext || {\n peerId: NULL_PEER_ID,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(divRound, message.mid/* , searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: message.peerId, mid: message.mid}, prev, next);\n }\n\n globalVideo.play();\n } else {\n globalVideo.pause();\n }\n });\n\n if(globalVideo.paused) {\n if(globalVideo.duration && globalVideo.currentTime !== globalVideo.duration && globalVideo.currentTime > 0) {\n onFrame();\n onTimeUpdate();\n video.classList.add('hide');\n } else {\n onPaused();\n }\n } else {\n onPlay();\n }\n };\n\n if(message.pFlags.is_outgoing) {\n (divRound as any).onLoad = onLoad;\n divRound.dataset.isOutgoing = '1';\n } else {\n onLoad();\n }\n } else if(!noAutoplayAttribute) {\n video.autoplay = true; // для safari\n }\n\n let photoRes: Awaited>;\n if(message) {\n photoRes = await wrapPhoto({\n photo: doc,\n message,\n container,\n boxWidth,\n boxHeight,\n withTail,\n isOut,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n autoDownloadSize: autoDownload?.photo,\n size: photoSize,\n managers\n });\n\n res.thumb = photoRes;\n\n if((!canAutoplay && doc.type !== 'gif') || onlyPreview) {\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n if(withTail) {\n const foreignObject = (photoRes.images.thumb || photoRes.images.full).parentElement;\n video.width = +foreignObject.getAttributeNS(null, 'width');\n video.height = +foreignObject.getAttributeNS(null, 'height');\n foreignObject.append(video);\n }\n } else if(!noPreview) { // * gifs masonry\n const gotThumb = getStrippedThumbIfNeeded(doc, {} as ThumbCache, true);\n if(gotThumb) {\n const thumbImage = gotThumb.image;\n thumbImage.classList.add('media-poster');\n container.append(thumbImage);\n res.thumb = {\n loadPromises: {\n thumb: gotThumb.loadPromise,\n full: Promise.resolve()\n },\n images: {\n thumb: thumbImage,\n full: null\n },\n preloader: null,\n aspecter: null\n };\n\n loadPromises?.push(gotThumb.loadPromise);\n res.loadPromise = gotThumb.loadPromise;\n }\n }\n\n if(onlyPreview) {\n return res;\n }\n\n if(!video.parentElement && container) {\n (photoRes?.aspecter || container).append(video);\n }\n\n let cacheContext: ThumbCache;\n const getCacheContext = async() => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, videoSize?.type);\n };\n\n await getCacheContext();\n\n const uploadFileName = message?.uploadingFileName;\n if(uploadFileName) { // means upload\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: true\n });\n preloader.attachPromise(appDownloadManager.getUpload(uploadFileName));\n preloader.attach(container, false);\n noAutoDownload = undefined;\n } else if(!cacheContext.downloaded && !doc.supportsStreaming && !withoutPreloader) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend'\n });\n } else if(doc.supportsStreaming) {\n preloader = new ProgressivePreloader({\n cancelable: false,\n attachMethod: 'prepend'\n });\n }\n\n const renderDeferred = deferredPromise();\n video.addEventListener('error', (e) => {\n if(video.error.code !== 4) {\n console.error('Error ' + video.error.code + '; details: ' + video.error.message);\n }\n\n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n if(!renderDeferred.isFulfilled) {\n renderDeferred.resolve();\n }\n }, {once: true});\n\n if(doc.type === 'video') {\n const onTimeUpdate = () => {\n if(!video.duration) {\n return;\n }\n\n spanTime.innerText = toHHMMSS(video.duration - video.currentTime, false);\n };\n\n const throttledTimeUpdate = throttle(() => {\n fastRaf(onTimeUpdate);\n }, 1e3, false);\n\n video.addEventListener('timeupdate', throttledTimeUpdate);\n\n if(spanPlay) {\n video.addEventListener('timeupdate', () => {\n sequentialDom.mutateElement(spanPlay, () => {\n spanPlay.remove();\n });\n }, {once: true});\n }\n }\n\n video.muted = true;\n video.loop = true;\n // video.play();\n if(!noAutoplayAttribute) {\n video.autoplay = true;\n }\n\n let loadPhotoThumbFunc = noAutoDownload && photoRes?.preloader?.loadFunc;\n const load = async() => {\n if(preloader && noAutoDownload && !withoutPreloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n await getCacheContext();\n let loadPromise: Promise = Promise.resolve();\n if((preloader && !uploadFileName) || withoutPreloader) {\n if(!cacheContext.downloaded && !doc.supportsStreaming) {\n const promise = loadPromise = appDownloadManager.downloadMediaURL({\n media: doc,\n queueId: lazyLoadQueue?.queueId,\n onlyCache: noAutoDownload,\n thumb: videoSize\n });\n\n if(preloader) {\n preloader.attach(container, false, promise);\n }\n } else if(doc.supportsStreaming) {\n if(noAutoDownload) {\n loadPromise = Promise.reject(makeError('NO_AUTO_DOWNLOAD'));\n } else if(!cacheContext.downloaded && preloader) { // * check for uploading video\n preloader.attach(container, false, null);\n video.addEventListener(IS_SAFARI ? 'timeupdate' : 'canplay', () => {\n preloader.detach();\n }, {once: true});\n }\n }\n }\n\n if(!noAutoDownload && loadPhotoThumbFunc) {\n loadPhotoThumbFunc();\n loadPhotoThumbFunc = null;\n }\n\n noAutoDownload = undefined;\n\n loadPromise.then(async() => {\n if(middleware && !middleware()) {\n renderDeferred.resolve();\n return;\n }\n\n if(doc.type === 'round') {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n }\n\n await getCacheContext();\n\n onMediaLoad(video).then(() => {\n if(group) {\n animationIntersector.addAnimation(video, group);\n }\n\n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n renderDeferred.resolve();\n }, (err) => {\n console.error('video load error', err);\n if(spanTime) {\n spanTime.classList.add('is-error');\n }\n renderDeferred.reject(err);\n });\n\n renderImageFromUrl(video, cacheContext.url);\n }, noop);\n\n return {download: loadPromise, render: Promise.all([loadPromise, renderDeferred])};\n };\n\n if(preloader && !uploadFileName) {\n preloader.setDownloadFunction(load);\n }\n\n /* if(doc.size >= 20e6 && !doc.downloaded) {\n let downloadDiv = document.createElement('div');\n downloadDiv.classList.add('download');\n\n let span = document.createElement('span');\n span.classList.add('btn-circle', 'tgico-download');\n downloadDiv.append(span);\n\n downloadDiv.addEventListener('click', () => {\n downloadDiv.remove();\n loadVideo();\n });\n\n container.prepend(downloadDiv);\n\n return;\n } */\n\n if(doc.type === 'gif' && !canAutoplay) {\n attachClickEvent(container, (e) => {\n cancelEvent(e);\n spanPlay.remove();\n load();\n }, {capture: true, once: true});\n } else {\n res.loadPromise = !lazyLoadQueue ?\n (await load()).render :\n (lazyLoadQueue.push({div: container, load: () => load().then(({render}) => render)}), Promise.resolve());\n }\n\n if(res.thumb) {\n await res.thumb.loadPromises.thumb;\n }\n\n return res;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {WebPage} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapWebPageDescription(webPage: WebPage.webPage) {\n const shortDescriptionText = limitSymbols(webPage.description || '', 150, 180);\n // const siteName = webPage.site_name;\n // let contextHashtag = '';\n // if(siteName === 'GitHub') {\n // const matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/);\n // if(matches) {\n // contextHashtag = matches[0] + '/issues/{1}';\n // }\n // }\n return wrapRichText(shortDescriptionText/* , {\n contextSite: siteName || 'external',\n contextHashtag: contextHashtag\n } */);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {WebPage} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapWebPageTitle(webPage: WebPage.webPage) {\n let shortTitle = webPage.title || webPage.author || webPage.site_name || '';\n shortTitle = limitSymbols(shortTitle, 80, 100);\n return wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\n}\n","// Taken from https://core.telegram.org/bots/payments/currencies.json\nexport type Currency = {\n code: string,\n title: string,\n symbol: string,\n native: string,\n thousands_sep: string,\n decimal_sep: string,\n symbol_left: boolean,\n space_between: boolean,\n exp: number,\n min_amount: string | number,\n max_amount: string | number\n};\n\n// eslint-disable-next-line quotes, comma-spacing\nconst Currencies: {[currency: string]: Currency} = {\"AED\":{\"code\":\"AED\",\"title\":\"United Arab Emirates Dirham\",\"symbol\":\"AED\",\"native\":\"د.إ.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"367\",\"max_amount\":\"3673030\"},\"AFN\":{\"code\":\"AFN\",\"title\":\"Afghan Afghani\",\"symbol\":\"AFN\",\"native\":\"؋\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"8729\",\"max_amount\":\"87299487\"},\"ALL\":{\"code\":\"ALL\",\"title\":\"Albanian Lek\",\"symbol\":\"ALL\",\"native\":\"Lek\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"11842\",\"max_amount\":\"118421187\"},\"AMD\":{\"code\":\"AMD\",\"title\":\"Armenian Dram\",\"symbol\":\"AMD\",\"native\":\"դր.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"40943\",\"max_amount\":\"409436718\"},\"ARS\":{\"code\":\"ARS\",\"title\":\"Argentine Peso\",\"symbol\":\"ARS\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"14705\",\"max_amount\":\"147059002\"},\"AUD\":{\"code\":\"AUD\",\"title\":\"Australian Dollar\",\"symbol\":\"AU$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"153\",\"max_amount\":\"1536825\"},\"AZN\":{\"code\":\"AZN\",\"title\":\"Azerbaijani Manat\",\"symbol\":\"AZN\",\"native\":\"ман.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"169\",\"max_amount\":\"1699858\"},\"BAM\":{\"code\":\"BAM\",\"title\":\"Bosnia & Herzegovina Convertible Mark\",\"symbol\":\"BAM\",\"native\":\"KM\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"199\",\"max_amount\":\"1990677\"},\"BDT\":{\"code\":\"BDT\",\"title\":\"Bangladeshi Taka\",\"symbol\":\"BDT\",\"native\":\"৳\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"10009\",\"max_amount\":\"100094046\"},\"BGN\":{\"code\":\"BGN\",\"title\":\"Bulgarian Lev\",\"symbol\":\"BGN\",\"native\":\"лв.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"199\",\"max_amount\":\"1993315\"},\"BND\":{\"code\":\"BND\",\"title\":\"Brunei Dollar\",\"symbol\":\"BND\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"142\",\"max_amount\":\"1421883\"},\"BOB\":{\"code\":\"BOB\",\"title\":\"Bolivian Boliviano\",\"symbol\":\"BOB\",\"native\":\"Bs\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"683\",\"max_amount\":\"6832607\"},\"BRL\":{\"code\":\"BRL\",\"title\":\"Brazilian Real\",\"symbol\":\"R$\",\"native\":\"R$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"539\",\"max_amount\":\"5397799\"},\"BYN\":{\"code\":\"BYN\",\"title\":\"Belarusian ruble\",\"symbol\":\"BYN\",\"native\":\"BYN\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"249\",\"max_amount\":\"2495801\"},\"CAD\":{\"code\":\"CAD\",\"title\":\"Canadian Dollar\",\"symbol\":\"CA$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"136\",\"max_amount\":\"1366860\"},\"CHF\":{\"code\":\"CHF\",\"title\":\"Swiss Franc\",\"symbol\":\"CHF\",\"native\":\"CHF\",\"thousands_sep\":\"'\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"97\",\"max_amount\":\"976705\"},\"CLP\":{\"code\":\"CLP\",\"title\":\"Chilean Peso\",\"symbol\":\"CLP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"963\",\"max_amount\":\"9637495\"},\"CNY\":{\"code\":\"CNY\",\"title\":\"Chinese Renminbi Yuan\",\"symbol\":\"CN¥\",\"native\":\"CN¥\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"709\",\"max_amount\":\"7094102\"},\"COP\":{\"code\":\"COP\",\"title\":\"Colombian Peso\",\"symbol\":\"COP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"452870\",\"max_amount\":\"4528700000\"},\"CRC\":{\"code\":\"CRC\",\"title\":\"Costa Rican Colón\",\"symbol\":\"CRC\",\"native\":\"₡\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"62506\",\"max_amount\":\"625061070\"},\"CZK\":{\"code\":\"CZK\",\"title\":\"Czech Koruna\",\"symbol\":\"CZK\",\"native\":\"Kč\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"2497\",\"max_amount\":\"24975029\"},\"DKK\":{\"code\":\"DKK\",\"title\":\"Danish Krone\",\"symbol\":\"DKK\",\"native\":\"kr\",\"thousands_sep\":\"\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"755\",\"max_amount\":\"7555990\"},\"DOP\":{\"code\":\"DOP\",\"title\":\"Dominican Peso\",\"symbol\":\"DOP\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5275\",\"max_amount\":\"52757308\"},\"DZD\":{\"code\":\"DZD\",\"title\":\"Algerian Dinar\",\"symbol\":\"DZD\",\"native\":\"د.ج.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"14035\",\"max_amount\":\"140353307\"},\"EGP\":{\"code\":\"EGP\",\"title\":\"Egyptian Pound\",\"symbol\":\"EGP\",\"native\":\"ج.م.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1953\",\"max_amount\":\"19537405\"},\"ETB\":{\"code\":\"ETB\",\"title\":\"Ethiopian Birr\",\"symbol\":\"ETB\",\"native\":\"ብር\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5224\",\"max_amount\":\"52247069\"},\"EUR\":{\"code\":\"EUR\",\"title\":\"Euro\",\"symbol\":\"€\",\"native\":\"€\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"101\",\"max_amount\":\"1016045\"},\"GBP\":{\"code\":\"GBP\",\"title\":\"British Pound\",\"symbol\":\"£\",\"native\":\"£\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"89\",\"max_amount\":\"894445\"},\"GEL\":{\"code\":\"GEL\",\"title\":\"Georgian Lari\",\"symbol\":\"GEL\",\"native\":\"GEL\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"283\",\"max_amount\":\"2830234\"},\"GTQ\":{\"code\":\"GTQ\",\"title\":\"Guatemalan Quetzal\",\"symbol\":\"GTQ\",\"native\":\"Q\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"778\",\"max_amount\":\"7781323\"},\"HKD\":{\"code\":\"HKD\",\"title\":\"Hong Kong Dollar\",\"symbol\":\"HK$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"784\",\"max_amount\":\"7849750\"},\"HNL\":{\"code\":\"HNL\",\"title\":\"Honduran Lempira\",\"symbol\":\"HNL\",\"native\":\"L\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"2441\",\"max_amount\":\"24413729\"},\"HRK\":{\"code\":\"HRK\",\"title\":\"Croatian Kuna\",\"symbol\":\"HRK\",\"native\":\"kn\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"764\",\"max_amount\":\"7648805\"},\"HUF\":{\"code\":\"HUF\",\"title\":\"Hungarian Forint\",\"symbol\":\"HUF\",\"native\":\"Ft\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"42685\",\"max_amount\":\"426850229\"},\"IDR\":{\"code\":\"IDR\",\"title\":\"Indonesian Rupiah\",\"symbol\":\"IDR\",\"native\":\"Rp\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"1523370\",\"max_amount\":\"15233700000\"},\"ILS\":{\"code\":\"ILS\",\"title\":\"Israeli New Sheqel\",\"symbol\":\"₪\",\"native\":\"₪\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"354\",\"max_amount\":\"3543350\"},\"INR\":{\"code\":\"INR\",\"title\":\"Indian Rupee\",\"symbol\":\"₹\",\"native\":\"₹\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"8155\",\"max_amount\":\"81555550\"},\"ISK\":{\"code\":\"ISK\",\"title\":\"Icelandic Króna\",\"symbol\":\"ISK\",\"native\":\"kr\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":0,\"min_amount\":\"142\",\"max_amount\":\"1425603\"},\"JMD\":{\"code\":\"JMD\",\"title\":\"Jamaican Dollar\",\"symbol\":\"JMD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"15013\",\"max_amount\":\"150131044\"},\"JPY\":{\"code\":\"JPY\",\"title\":\"Japanese Yen\",\"symbol\":\"¥\",\"native\":\"¥\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"144\",\"max_amount\":\"1443065\"},\"KES\":{\"code\":\"KES\",\"title\":\"Kenyan Shilling\",\"symbol\":\"KES\",\"native\":\"Ksh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"12075\",\"max_amount\":\"120750271\"},\"KGS\":{\"code\":\"KGS\",\"title\":\"Kyrgyzstani Som\",\"symbol\":\"KGS\",\"native\":\"KGS\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"8018\",\"max_amount\":\"80182898\"},\"KRW\":{\"code\":\"KRW\",\"title\":\"South Korean Won\",\"symbol\":\"₩\",\"native\":\"₩\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"1431\",\"max_amount\":\"14315201\"},\"KZT\":{\"code\":\"KZT\",\"title\":\"Kazakhstani Tenge\",\"symbol\":\"KZT\",\"native\":\"₸\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"47186\",\"max_amount\":\"471867112\"},\"LBP\":{\"code\":\"LBP\",\"title\":\"Lebanese Pound\",\"symbol\":\"LBP\",\"native\":\"ل.ل.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"150999\",\"max_amount\":\"1509998778\"},\"LKR\":{\"code\":\"LKR\",\"title\":\"Sri Lankan Rupee\",\"symbol\":\"LKR\",\"native\":\"රු.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"35546\",\"max_amount\":\"355469651\"},\"MAD\":{\"code\":\"MAD\",\"title\":\"Moroccan Dirham\",\"symbol\":\"MAD\",\"native\":\"د.م.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1093\",\"max_amount\":\"10938136\"},\"MDL\":{\"code\":\"MDL\",\"title\":\"Moldovan Leu\",\"symbol\":\"MDL\",\"native\":\"MDL\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1926\",\"max_amount\":\"19264439\"},\"MNT\":{\"code\":\"MNT\",\"title\":\"Mongolian Tögrög\",\"symbol\":\"MNT\",\"native\":\"MNT\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"322444\",\"max_amount\":\"3224442056\"},\"MUR\":{\"code\":\"MUR\",\"title\":\"Mauritian Rupee\",\"symbol\":\"MUR\",\"native\":\"MUR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"4453\",\"max_amount\":\"44535174\"},\"MVR\":{\"code\":\"MVR\",\"title\":\"Maldivian Rufiyaa\",\"symbol\":\"MVR\",\"native\":\"MVR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1546\",\"max_amount\":\"15460397\"},\"MXN\":{\"code\":\"MXN\",\"title\":\"Mexican Peso\",\"symbol\":\"MX$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"2012\",\"max_amount\":\"20122860\"},\"MYR\":{\"code\":\"MYR\",\"title\":\"Malaysian Ringgit\",\"symbol\":\"MYR\",\"native\":\"RM\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"463\",\"max_amount\":\"4632502\"},\"MZN\":{\"code\":\"MZN\",\"title\":\"Mozambican Metical\",\"symbol\":\"MZN\",\"native\":\"MTn\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"6382\",\"max_amount\":\"63829729\"},\"NGN\":{\"code\":\"NGN\",\"title\":\"Nigerian Naira\",\"symbol\":\"NGN\",\"native\":\"₦\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"43203\",\"max_amount\":\"432039828\"},\"NIO\":{\"code\":\"NIO\",\"title\":\"Nicaraguan Córdoba\",\"symbol\":\"NIO\",\"native\":\"C$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"3556\",\"max_amount\":\"35566412\"},\"NOK\":{\"code\":\"NOK\",\"title\":\"Norwegian Krone\",\"symbol\":\"NOK\",\"native\":\"kr\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1069\",\"max_amount\":\"10690975\"},\"NPR\":{\"code\":\"NPR\",\"title\":\"Nepalese Rupee\",\"symbol\":\"NPR\",\"native\":\"नेरू\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"12954\",\"max_amount\":\"129546657\"},\"NZD\":{\"code\":\"NZD\",\"title\":\"New Zealand Dollar\",\"symbol\":\"NZ$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"174\",\"max_amount\":\"1746220\"},\"PAB\":{\"code\":\"PAB\",\"title\":\"Panamanian Balboa\",\"symbol\":\"PAB\",\"native\":\"B\\/.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"98\",\"max_amount\":\"988722\"},\"PEN\":{\"code\":\"PEN\",\"title\":\"Peruvian Nuevo Sol\",\"symbol\":\"PEN\",\"native\":\"S\\/.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"390\",\"max_amount\":\"3902208\"},\"PHP\":{\"code\":\"PHP\",\"title\":\"Philippine Peso\",\"symbol\":\"PHP\",\"native\":\"₱\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5862\",\"max_amount\":\"58627496\"},\"PKR\":{\"code\":\"PKR\",\"title\":\"Pakistani Rupee\",\"symbol\":\"PKR\",\"native\":\"₨\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"22642\",\"max_amount\":\"226426805\"},\"PLN\":{\"code\":\"PLN\",\"title\":\"Polish Złoty\",\"symbol\":\"PLN\",\"native\":\"zł\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"493\",\"max_amount\":\"4932350\"},\"PYG\":{\"code\":\"PYG\",\"title\":\"Paraguayan Guaraní\",\"symbol\":\"PYG\",\"native\":\"₲\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"6977\",\"max_amount\":\"69772317\"},\"QAR\":{\"code\":\"QAR\",\"title\":\"Qatari Riyal\",\"symbol\":\"QAR\",\"native\":\"ر.ق.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"364\",\"max_amount\":\"3640989\"},\"RON\":{\"code\":\"RON\",\"title\":\"Romanian Leu\",\"symbol\":\"RON\",\"native\":\"RON\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"502\",\"max_amount\":\"5028645\"},\"RSD\":{\"code\":\"RSD\",\"title\":\"Serbian Dinar\",\"symbol\":\"RSD\",\"native\":\"дин.\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"11918\",\"max_amount\":\"119184990\"},\"RUB\":{\"code\":\"RUB\",\"title\":\"Russian Ruble\",\"symbol\":\"RUB\",\"native\":\"₽\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"7128\",\"max_amount\":\"71281218\"},\"SAR\":{\"code\":\"SAR\",\"title\":\"Saudi Riyal\",\"symbol\":\"SAR\",\"native\":\"ر.س.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"375\",\"max_amount\":\"3756546\"},\"SEK\":{\"code\":\"SEK\",\"title\":\"Swedish Krona\",\"symbol\":\"SEK\",\"native\":\"kr\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1109\",\"max_amount\":\"11094972\"},\"SGD\":{\"code\":\"SGD\",\"title\":\"Singapore Dollar\",\"symbol\":\"SGD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"143\",\"max_amount\":\"1430495\"},\"THB\":{\"code\":\"THB\",\"title\":\"Thai Baht\",\"symbol\":\"฿\",\"native\":\"฿\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"3780\",\"max_amount\":\"37800497\"},\"TJS\":{\"code\":\"TJS\",\"title\":\"Tajikistani Somoni\",\"symbol\":\"TJS\",\"native\":\"TJS\",\"thousands_sep\":\" \",\"decimal_sep\":\";\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"975\",\"max_amount\":\"9753854\"},\"TRY\":{\"code\":\"TRY\",\"title\":\"Turkish Lira\",\"symbol\":\"TRY\",\"native\":\"TL\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1854\",\"max_amount\":\"18543598\"},\"TTD\":{\"code\":\"TTD\",\"title\":\"Trinidad and Tobago Dollar\",\"symbol\":\"TTD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"672\",\"max_amount\":\"6722681\"},\"TWD\":{\"code\":\"TWD\",\"title\":\"New Taiwan Dollar\",\"symbol\":\"NT$\",\"native\":\"NT$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"3173\",\"max_amount\":\"31738502\"},\"TZS\":{\"code\":\"TZS\",\"title\":\"Tanzanian Shilling\",\"symbol\":\"TZS\",\"native\":\"TSh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"233199\",\"max_amount\":\"2331999890\"},\"UAH\":{\"code\":\"UAH\",\"title\":\"Ukrainian Hryvnia\",\"symbol\":\"UAH\",\"native\":\"₴\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"3633\",\"max_amount\":\"36338830\"},\"UGX\":{\"code\":\"UGX\",\"title\":\"Ugandan Shilling\",\"symbol\":\"UGX\",\"native\":\"USh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"3816\",\"max_amount\":\"38166726\"},\"USD\":{\"code\":\"USD\",\"title\":\"United States Dollar\",\"symbol\":\"$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"100\",\"max_amount\":1000000},\"UYU\":{\"code\":\"UYU\",\"title\":\"Uruguayan Peso\",\"symbol\":\"UYU\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"4080\",\"max_amount\":\"40801205\"},\"UZS\":{\"code\":\"UZS\",\"title\":\"Uzbekistani Som\",\"symbol\":\"UZS\",\"native\":\"UZS\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1089058\",\"max_amount\":\"10890583014\"},\"VND\":{\"code\":\"VND\",\"title\":\"Vietnamese Đồng\",\"symbol\":\"₫\",\"native\":\"₫\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":0,\"min_amount\":\"23862\",\"max_amount\":\"238625000\"},\"YER\":{\"code\":\"YER\",\"title\":\"Yemeni Rial\",\"symbol\":\"YER\",\"native\":\"ر.ي.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"25030\",\"max_amount\":\"250300677\"},\"ZAR\":{\"code\":\"ZAR\",\"title\":\"South African Rand\",\"symbol\":\"ZAR\",\"native\":\"R\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1789\",\"max_amount\":\"17894299\"}};\n\nexport default Currencies;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\n\nexport const EmojiVersions: {[version in EMOJI_VERSION]: {[emoji: string]: number}} = {'14':{'1f6dd':4867, '1f6de':4916, '1f6df':4923, '1f7f0':62832, '1f979':183, '1f9cc':1557, '1fa7b':61332, '1fa7c':61330, '1faa9':51093, '1faaa':61364, '1faab':61189, '1faac':51085, '1fab7':2651, '1fab8':2631, '1fab9':2672, '1faba':2673, '1fac3':1520, '1fac4':1521, '1fac5':1505, '1fad7':3793, '1fad8':3707, '1fad9':3804, '1fae0':111, '1fae1':136, '1fae2':132, '1fae3':133, '1fae4':174, '1fae5':142, '1fae6':1385, '1fae7':61353, '1faf0':1341, '1faf1':1332, '1faf2':1333, '1faf3':1334, '1faf4':1335, '1faf5':1351, '1faf6':1360, '1faf1-1f3fb-200d-1faf2-1f3fc':0, '1faf1-1f3fb-200d-1faf2-1f3fd':0, '1faf1-1f3fb-200d-1faf2-1f3fe':0, '1faf1-1f3fb-200d-1faf2-1f3ff':0, '1faf1-1f3fc-200d-1faf2-1f3fb':0, '1faf1-1f3fc-200d-1faf2-1f3fd':0, '1faf1-1f3fc-200d-1faf2-1f3fe':0, '1faf1-1f3fc-200d-1faf2-1f3ff':0, '1faf1-1f3fd-200d-1faf2-1f3fb':0, '1faf1-1f3fd-200d-1faf2-1f3fc':0, '1faf1-1f3fd-200d-1faf2-1f3fe':0, '1faf1-1f3fd-200d-1faf2-1f3ff':0, '1faf1-1f3fe-200d-1faf2-1f3fb':0, '1faf1-1f3fe-200d-1faf2-1f3fc':0, '1faf1-1f3fe-200d-1faf2-1f3fd':0, '1faf1-1f3fe-200d-1faf2-1f3ff':0, '1faf1-1f3ff-200d-1faf2-1f3fb':0, '1faf1-1f3ff-200d-1faf2-1f3fc':0, '1faf1-1f3ff-200d-1faf2-1f3fd':0, '1faf1-1f3ff-200d-1faf2-1f3fe':0, '1fac3-1f3fb':0, '1fac3-1f3fc':0, '1fac3-1f3fd':0, '1fac3-1f3fe':0, '1fac3-1f3ff':0, '1fac4-1f3fb':0, '1fac4-1f3fc':0, '1fac4-1f3fd':0, '1fac4-1f3fe':0, '1fac4-1f3ff':0, '1fac5-1f3fb':0, '1fac5-1f3fc':0, '1fac5-1f3fd':0, '1fac5-1f3fe':0, '1fac5-1f3ff':0, '1faf0-1f3fb':0, '1faf0-1f3fc':0, '1faf0-1f3fd':0, '1faf0-1f3fe':0, '1faf0-1f3ff':0, '1faf1-1f3fb':0, '1faf1-1f3fc':0, '1faf1-1f3fd':0, '1faf1-1f3fe':0, '1faf1-1f3ff':0, '1faf2-1f3fb':0, '1faf2-1f3fc':0, '1faf2-1f3fd':0, '1faf2-1f3fe':0, '1faf2-1f3ff':0, '1faf3-1f3fb':0, '1faf3-1f3fc':0, '1faf3-1f3fd':0, '1faf3-1f3fe':0, '1faf3-1f3ff':0, '1faf4-1f3fb':0, '1faf4-1f3fc':0, '1faf4-1f3fd':0, '1faf4-1f3fe':0, '1faf4-1f3ff':0, '1faf5-1f3fb':0, '1faf5-1f3fc':0, '1faf5-1f3fd':0, '1faf5-1f3fe':0, '1faf5-1f3ff':0, '1faf6-1f3fb':0, '1faf6-1f3fc':0, '1faf6-1f3fd':0, '1faf6-1f3fe':0, '1faf6-1f3ff':0}, '':{'2049':62835, '2122':62863, '2139':62888, '2194':62764, '2195':62763, '2196':62762, '2197':62756, '2198':62758, '2199':62760, '2328':61194, '2600':4990, '2601':4998, '2602':41013, '2603':41018, '2604':41020, '2611':62851, '2614':41014, '2615':3781, '2618':2667, '2620':1106, '2622':62753, '2623':62754, '2626':62783, '2638':62780, '2639':177, '2648':62788, '2649':62789, '2650':62796, '2651':62797, '2652':62798, '2653':62799, '2660':51095, '2663':51098, '2665':51096, '2666':51097, '2668':4865, '2692':61297, '2693':4922, '2694':61300, '2696':61311, '2697':61319, '2699':61309, '2702':61284, '2705':62850, '2708':4931, '2709':61245, '2712':61259, '2714':62852, '2716':62828, '2721':62779, '2728':51029, '2733':62858, '2734':62859, '2744':41017, '2747':62860, '2753':62836, '2754':62837, '2755':62838, '2757':62839, '2763':1137, '2764':1141, '2795':62829, '2796':62830, '2797':62831, '2934':62767, '2935':62768, '3030':62840, '3297':62912, '3299':62913, '0023-20e3':62864, '002a-20e3':62865, '0030-20e3':62866, '0031-20e3':62867, '0032-20e3':62868, '0033-20e3':62869, '0034-20e3':62870, '0035-20e3':62871, '0036-20e3':62872, '0037-20e3':62873, '0038-20e3':62874, '0039-20e3':62875, '00a9':62861, '00ae':62862, '1f004':51101, '1f0cf':51100, '1f170':62882, '1f171':62884, '1f17e':62893, '1f17f':62895, '1f18e':62883, '1f191':62885, '1f192':62886, '1f193':62887, '1f194':62889, '1f195':62891, '1f196':62892, '1f197':62894, '1f198':62896, '1f199':62897, '1f19a':62898, '1f1e6-1f1e8':71594, '1f1e6-1f1e9':71595, '1f1e6-1f1ea':71596, '1f1e6-1f1eb':71597, '1f1e6-1f1ec':71598, '1f1e6-1f1ee':71599, '1f1e6-1f1f1':71600, '1f1e6-1f1f2':71601, '1f1e6-1f1f4':71602, '1f1e6-1f1f6':71603, '1f1e6-1f1f7':71604, '1f1e6-1f1f8':71605, '1f1e6-1f1f9':71606, '1f1e6-1f1fa':71607, '1f1e6-1f1fc':71608, '1f1e6-1f1fd':71609, '1f1e6-1f1ff':71610, '1f1e7-1f1e6':71611, '1f1e7-1f1e7':71612, '1f1e7-1f1e9':71613, '1f1e7-1f1ea':71614, '1f1e7-1f1eb':71615, '1f1e7-1f1ec':71616, '1f1e7-1f1ed':71617, '1f1e7-1f1ee':71618, '1f1e7-1f1ef':71619, '1f1e7-1f1f1':71620, '1f1e7-1f1f2':71621, '1f1e7-1f1f3':71622, '1f1e7-1f1f4':71623, '1f1e7-1f1f6':71624, '1f1e7-1f1f7':71625, '1f1e7-1f1f8':71626, '1f1e7-1f1f9':71627, '1f1e7-1f1fb':71628, '1f1e7-1f1fc':71629, '1f1e7-1f1fe':71630, '1f1e7-1f1ff':71631, '1f1e8-1f1e6':71632, '1f1e8-1f1e8':71633, '1f1e8-1f1e9':71634, '1f1e8-1f1eb':71635, '1f1e8-1f1ec':71636, '1f1e8-1f1ed':71637, '1f1e8-1f1ee':71638, '1f1e8-1f1f0':71639, '1f1e8-1f1f1':71640, '1f1e8-1f1f2':71641, '1f1e8-1f1f3':71642, '1f1e8-1f1f4':71643, '1f1e8-1f1f5':71644, '1f1e8-1f1f7':71645, '1f1e8-1f1fa':71646, '1f1e8-1f1fb':71647, '1f1e8-1f1fc':71648, '1f1e8-1f1fd':71649, '1f1e8-1f1fe':71650, '1f1e8-1f1ff':71651, '1f1e9-1f1ea':71652, '1f1e9-1f1ec':71653, '1f1e9-1f1ef':71654, '1f1e9-1f1f0':71655, '1f1e9-1f1f2':71656, '1f1e9-1f1f4':71657, '1f1e9-1f1ff':71658, '1f1ea-1f1e6':71659, '1f1ea-1f1e8':71660, '1f1ea-1f1ea':71661, '1f1ea-1f1ec':71662, '1f1ea-1f1ed':71663, '1f1ea-1f1f7':71664, '1f1ea-1f1f8':71665, '1f1ea-1f1f9':71666, '1f1ea-1f1fa':71667, '1f1eb-1f1ee':71668, '1f1eb-1f1ef':71669, '1f1eb-1f1f0':71670, '1f1eb-1f1f2':71671, '1f1eb-1f1f4':71672, '1f1eb-1f1f7':71673, '1f1ec-1f1e6':71674, '1f1ec-1f1e7':71675, '1f1ec-1f1e9':71676, '1f1ec-1f1ea':71677, '1f1ec-1f1eb':71678, '1f1ec-1f1ec':71679, '1f1ec-1f1ed':71680, '1f1ec-1f1ee':71681, '1f1ec-1f1f1':71682, '1f1ec-1f1f2':71683, '1f1ec-1f1f3':71684, '1f1ec-1f1f5':71685, '1f1ec-1f1f6':71686, '1f1ec-1f1f7':71687, '1f1ec-1f1f8':71688, '1f1ec-1f1f9':71689, '1f1ec-1f1fa':71690, '1f1ec-1f1fc':71691, '1f1ec-1f1fe':71692, '1f1ed-1f1f0':71693, '1f1ed-1f1f2':71694, '1f1ed-1f1f3':71695, '1f1ed-1f1f7':71696, '1f1ed-1f1f9':71697, '1f1ed-1f1fa':71698, '1f1ee-1f1e8':71699, '1f1ee-1f1e9':71700, '1f1ee-1f1ea':71701, '1f1ee-1f1f1':71702, '1f1ee-1f1f2':71703, '1f1ee-1f1f3':71704, '1f1ee-1f1f4':71705, '1f1ee-1f1f6':71706, '1f1ee-1f1f7':71707, '1f1ee-1f1f8':71708, '1f1ee-1f1f9':71709, '1f1ef-1f1ea':71710, '1f1ef-1f1f2':71711, '1f1ef-1f1f4':71712, '1f1ef-1f1f5':71713, '1f1f0-1f1ea':71714, '1f1f0-1f1ec':71715, '1f1f0-1f1ed':71716, '1f1f0-1f1ee':71717, '1f1f0-1f1f2':71718, '1f1f0-1f1f3':71719, '1f1f0-1f1f5':71720, '1f1f0-1f1f7':71721, '1f1f0-1f1fc':71722, '1f1f0-1f1fe':71723, '1f1f0-1f1ff':71724, '1f1f1-1f1e6':71725, '1f1f1-1f1e7':71726, '1f1f1-1f1e8':71727, '1f1f1-1f1ee':71728, '1f1f1-1f1f0':71729, '1f1f1-1f1f7':71730, '1f1f1-1f1f8':71731, '1f1f1-1f1f9':71732, '1f1f1-1f1fa':71733, '1f1f1-1f1fb':71734, '1f1f1-1f1fe':71735, '1f1f2-1f1e6':71736, '1f1f2-1f1e8':71737, '1f1f2-1f1e9':71738, '1f1f2-1f1ea':71739, '1f1f2-1f1eb':71740, '1f1f2-1f1ec':71741, '1f1f2-1f1ed':71742, '1f1f2-1f1f0':71743, '1f1f2-1f1f1':71744, '1f1f2-1f1f2':71745, '1f1f2-1f1f3':71746, '1f1f2-1f1f4':71747, '1f1f2-1f1f5':71748, '1f1f2-1f1f6':71749, '1f1f2-1f1f7':71750, '1f1f2-1f1f8':71751, '1f1f2-1f1f9':71752, '1f1f2-1f1fa':71753, '1f1f2-1f1fb':71754, '1f1f2-1f1fc':71755, '1f1f2-1f1fd':71756, '1f1f2-1f1fe':71757, '1f1f2-1f1ff':71758, '1f1f3-1f1e6':71759, '1f1f3-1f1e8':71760, '1f1f3-1f1ea':71761, '1f1f3-1f1eb':71762, '1f1f3-1f1ec':71763, '1f1f3-1f1ee':71764, '1f1f3-1f1f1':71765, '1f1f3-1f1f4':71766, '1f1f3-1f1f5':71767, '1f1f3-1f1f7':71768, '1f1f3-1f1fa':71769, '1f1f3-1f1ff':71770, '1f1f4-1f1f2':71771, '1f1f5-1f1e6':71772, '1f1f5-1f1ea':71773, '1f1f5-1f1eb':71774, '1f1f5-1f1ec':71775, '1f1f5-1f1ed':71776, '1f1f5-1f1f0':71777, '1f1f5-1f1f1':71778, '1f1f5-1f1f2':71779, '1f1f5-1f1f3':71780, '1f1f5-1f1f7':71781, '1f1f5-1f1f8':71782, '1f1f5-1f1f9':71783, '1f1f5-1f1fc':71784, '1f1f5-1f1fe':71785, '1f1f6-1f1e6':71786, '1f1f7-1f1ea':71787, '1f1f7-1f1f4':71788, '1f1f7-1f1f8':71789, '1f1f7-1f1fa':71790, '1f1f7-1f1fc':71791, '1f1f8-1f1e6':71792, '1f1f8-1f1e7':71793, '1f1f8-1f1e8':71794, '1f1f8-1f1e9':71795, '1f1f8-1f1ea':71796, '1f1f8-1f1ec':71797, '1f1f8-1f1ed':71798, '1f1f8-1f1ee':71799, '1f1f8-1f1ef':71800, '1f1f8-1f1f0':71801, '1f1f8-1f1f1':71802, '1f1f8-1f1f2':71803, '1f1f8-1f1f3':71804, '1f1f8-1f1f4':71805, '1f1f8-1f1f7':71806, '1f1f8-1f1f8':71807, '1f1f8-1f1f9':71808, '1f1f8-1f1fb':71809, '1f1f8-1f1fd':71810, '1f1f8-1f1fe':71811, '1f1f8-1f1ff':71812, '1f1f9-1f1e6':71813, '1f1f9-1f1e8':71814, '1f1f9-1f1e9':71815, '1f1f9-1f1eb':71816, '1f1f9-1f1ec':71817, '1f1f9-1f1ed':71818, '1f1f9-1f1ef':71819, '1f1f9-1f1f0':71820, '1f1f9-1f1f1':71821, '1f1f9-1f1f2':71822, '1f1f9-1f1f3':71823, '1f1f9-1f1f4':71824, '1f1f9-1f1f7':71825, '1f1f9-1f1f9':71826, '1f1f9-1f1fb':71827, '1f1f9-1f1fc':71828, '1f1f9-1f1ff':71829, '1f1fa-1f1e6':71830, '1f1fa-1f1ec':71831, '1f1fa-1f1f2':71832, '1f1fa-1f1f3':71833, '1f1fa-1f1f8':71834, '1f1fa-1f1fe':71835, '1f1fa-1f1ff':71836, '1f1fb-1f1e6':71837, '1f1fb-1f1e8':71838, '1f1fb-1f1ea':71839, '1f1fb-1f1ec':71840, '1f1fb-1f1ee':71841, '1f1fb-1f1f3':71842, '1f1fb-1f1fa':71843, '1f1fc-1f1eb':71844, '1f1fc-1f1f8':71845, '1f1fd-1f1f0':71846, '1f1fe-1f1ea':71847, '1f1fe-1f1f9':71848, '1f1ff-1f1e6':71849, '1f1ff-1f1f2':71850, '1f1ff-1f1fc':71851, '1f201':62899, '1f202':62900, '1f21a':62906, '1f22f':62903, '1f232':62907, '1f233':62911, '1f234':62910, '1f235':62915, '1f236':62902, '1f237':62901, '1f238':62909, '1f239':62905, '1f23a':62914, '1f250':62904, '1f251':62908, '1f300':41010, '1f301':4857, '1f302':41012, '1f303':4858, '1f304':4860, '1f305':4861, '1f306':4862, '1f307':4863, '1f308':41011, '1f309':4864, '1f30a':41023, '1f30b':4815, '1f30c':4997, '1f30d':4806, '1f30e':4807, '1f30f':4808, '1f310':4809, '1f311':4977, '1f312':4978, '1f313':4979, '1f314':4980, '1f315':4981, '1f316':4982, '1f317':4983, '1f318':4984, '1f319':4985, '1f31a':4986, '1f31b':4987, '1f31c':4988, '1f31d':4991, '1f31e':4992, '1f31f':4995, '1f320':4996, '1f321':4989, '1f324':41001, '1f325':41002, '1f326':41003, '1f327':41004, '1f328':41005, '1f329':41006, '1f32a':41007, '1f32b':41008, '1f32c':41009, '1f32d':3725, '1f32e':3727, '1f32f':3728, '1f330':3708, '1f331':2659, '1f332':2661, '1f333':2662, '1f334':2663, '1f335':2664, '1f336':3698, '1f337':2658, '1f338':2649, '1f339':2653, '1f33a':2655, '1f33b':2656, '1f33c':2657, '1f33d':3697, '1f33e':2665, '1f33f':2666, '1f340':2668, '1f341':2669, '1f342':2670, '1f343':2671, '1f344':3705, '1f345':3690, '1f346':3694, '1f347':3674, '1f348':3675, '1f349':3676, '1f34a':3677, '1f34b':3678, '1f34c':3679, '1f34d':3680, '1f34e':3682, '1f34f':3683, '1f350':3684, '1f351':3685, '1f352':3686, '1f353':3687, '1f354':3722, '1f355':3724, '1f356':3718, '1f357':3719, '1f358':3744, '1f359':3745, '1f35a':3746, '1f35b':3747, '1f35c':3748, '1f35d':3749, '1f35e':3709, '1f35f':3723, '1f360':3750, '1f361':3756, '1f362':3751, '1f363':3752, '1f364':3753, '1f365':3754, '1f366':3765, '1f367':3766, '1f368':3767, '1f369':3768, '1f36a':3769, '1f36b':3774, '1f36c':3775, '1f36d':3776, '1f36e':3777, '1f36f':3778, '1f370':3771, '1f371':3743, '1f372':3735, '1f373':3733, '1f374':3801, '1f375':3783, '1f376':3784, '1f377':3786, '1f378':3787, '1f379':3788, '1f37a':3789, '1f37b':3790, '1f37c':3779, '1f37d':3800, '1f37e':3785, '1f37f':3739, '1f380':51040, '1f381':51041, '1f382':3770, '1f383':51024, '1f384':51025, '1f385':1527, '1f386':51026, '1f387':51027, '1f388':51030, '1f389':51031, '1f38a':51032, '1f38b':51033, '1f38c':71588, '1f38d':51034, '1f38e':51035, '1f38f':51036, '1f390':51037, '1f391':51038, '1f392':61134, '1f393':61147, '1f396':51045, '1f397':51042, '1f399':61167, '1f39a':61168, '1f39b':61169, '1f39e':61203, '1f39f':51043, '1f3a0':4866, '1f3a1':4868, '1f3a2':4869, '1f3a3':51072, '1f3a4':61170, '1f3a5':61202, '1f3a6':62819, '1f3a7':61171, '1f3a8':51105, '1f3a9':61146, '1f3aa':4871, '1f3ab':51044, '1f3ac':61205, '1f3ad':51103, '1f3ae':51086, '1f3af':51078, '1f3b0':51088, '1f3b1':51081, '1f3b2':51089, '1f3b3':51060, '1f3b4':51102, '1f3b5':61165, '1f3b6':61166, '1f3b7':61173, '1f3b8':61175, '1f3b9':61176, '1f3ba':61177, '1f3bb':61178, '1f3bc':61164, '1f3bd':51074, '1f3be':51058, '1f3bf':51075, '1f3c0':51054, '1f3c1':71586, '1f3c2':1600, '1f3c3-200d-2640':1584, '1f3c3-200d-2642':1583, '1f3c3':1582, '1f3c4-200d-2640':1606, '1f3c4-200d-2642':1605, '1f3c4':1604, '1f3c5':51047, '1f3c6':51046, '1f3c7':1598, '1f3c8':51056, '1f3c9':51057, '1f3ca-200d-2640':1612, '1f3ca-200d-2642':1611, '1f3ca':1610, '1f3cb-200d-2640':1618, '1f3cb-200d-2642':1617, '1f3cb':1616, '1f3cc-200d-2640':1603, '1f3cc-200d-2642':1602, '1f3cc':1601, '1f3cd':4902, '1f3ce':4901, '1f3cf':51061, '1f3d0':51055, '1f3d1':51062, '1f3d2':51063, '1f3d3':51065, '1f3d4':4813, '1f3d5':4817, '1f3d6':4818, '1f3d7':4824, '1f3d8':4829, '1f3d9':4859, '1f3da':4830, '1f3db':4823, '1f3dc':4819, '1f3dd':4820, '1f3de':4821, '1f3df':4822, '1f3e0':4831, '1f3e1':4832, '1f3e2':4833, '1f3e3':4834, '1f3e4':4835, '1f3e5':4836, '1f3e6':4837, '1f3e7':62729, '1f3e8':4838, '1f3e9':4839, '1f3ea':4840, '1f3eb':4841, '1f3ec':4842, '1f3ed':4843, '1f3ee':61216, '1f3ef':4844, '1f3f0':4845, '1f3f3-200d-1f308':71591, '1f3f3-200d-26a7':71592, '1f3f3':71590, '1f3f4-200d-2620':71593, '1f3f4-e0067-e0062-e0065-e006e-e0067-e007f':71852, '1f3f4-e0067-e0062-e0073-e0063-e0074-e007f':71853, '1f3f4-e0067-e0062-e0077-e006c-e0073-e007f':71854, '1f3f4':71589, '1f3f5':2652, '1f3f7':61234, '1f3f8':51066, '1f3f9':61303, '1f3fa':3805, '1f3fb':9525, '1f3fc':9526, '1f3fd':9527, '1f3fe':9528, '1f3ff':9529, '1f400':2576, '1f401':2575, '1f402':2556, '1f403':2557, '1f404':2558, '1f405':2547, '1f406':2548, '1f407':2579, '1f408-200d-2b1b':2544, '1f408':2543, '1f409':2618, '1f40a':2613, '1f40b':2622, '1f40c':2632, '1f40d':2616, '1f40e':2550, '1f40f':2563, '1f410':2565, '1f411':2564, '1f412':2531, '1f413':2596, '1f414':2595, '1f415-200d-1f9ba':2537, '1f415':2535, '1f416':2560, '1f417':2561, '1f418':2570, '1f419':2629, '1f41a':2630, '1f41b':2634, '1f41c':2635, '1f41d':2636, '1f41e':2638, '1f41f':2625, '1f420':2626, '1f421':2627, '1f422':2614, '1f423':2597, '1f424':2598, '1f425':2599, '1f426':2600, '1f427':2601, '1f428':2586, '1f429':2538, '1f42a':2566, '1f42b':2567, '1f42c':2623, '1f42d':2574, '1f42e':2555, '1f42f':2546, '1f430':2578, '1f431':2542, '1f432':2617, '1f433':2621, '1f434':2549, '1f435':2530, '1f436':2534, '1f437':2559, '1f438':2612, '1f439':2577, '1f43a':2539, '1f43b-200d-2744':2585, '1f43b':2584, '1f43c':2587, '1f43d':2562, '1f43e':2593, '1f43f':2580, '1f440':1381, '1f441-200d-1f5e8':1159, '1f441':1382, '1f442':1373, '1f443':1375, '1f444':1384, '1f445':1383, '1f446':1347, '1f447':1349, '1f448':1345, '1f449':1346, '1f44a':1355, '1f44b':1327, '1f44c':1336, '1f44d':1352, '1f44e':1353, '1f44f':1358, '1f450':1361, '1f451':61144, '1f452':61145, '1f453':61110, '1f454':61115, '1f455':61116, '1f456':61117, '1f457':61122, '1f458':61123, '1f459':61128, '1f45a':61129, '1f45b':61130, '1f45c':61131, '1f45d':61132, '1f45e':61136, '1f45f':61137, '1f460':61140, '1f461':61141, '1f462':61143, '1f463':1687, '1f464':1684, '1f465':1685, '1f466':1388, '1f467':1389, '1f468-200d-1f33e':1457, '1f468-200d-1f373':1460, '1f468-200d-1f37c':1524, '1f468-200d-1f393':1448, '1f468-200d-1f3a4':1478, '1f468-200d-1f3a8':1481, '1f468-200d-1f3eb':1451, '1f468-200d-1f3ed':1466, '1f468-200d-1f466-200d-1f466':1674, '1f468-200d-1f466':1673, '1f468-200d-1f467-200d-1f466':1676, '1f468-200d-1f467-200d-1f467':1677, '1f468-200d-1f467':1675, '1f468-200d-1f468-200d-1f466':1663, '1f468-200d-1f468-200d-1f466-200d-1f466':1666, '1f468-200d-1f468-200d-1f467':1664, '1f468-200d-1f468-200d-1f467-200d-1f466':1665, '1f468-200d-1f468-200d-1f467-200d-1f467':1667, '1f468-200d-1f469-200d-1f466':1658, '1f468-200d-1f469-200d-1f466-200d-1f466':1661, '1f468-200d-1f469-200d-1f467':1659, '1f468-200d-1f469-200d-1f467-200d-1f466':1660, '1f468-200d-1f469-200d-1f467-200d-1f467':1662, '1f468-200d-1f4bb':1475, '1f468-200d-1f4bc':1469, '1f468-200d-1f527':1463, '1f468-200d-1f52c':1472, '1f468-200d-1f680':1487, '1f468-200d-1f692':1490, '1f468-200d-1f9af':1574, '1f468-200d-1f9b0':1396, '1f468-200d-1f9b1':1397, '1f468-200d-1f9b2':1399, '1f468-200d-1f9b3':1398, '1f468-200d-1f9bc':1577, '1f468-200d-1f9bd':1580, '1f468-200d-2695':1445, '1f468-200d-2696':1454, '1f468-200d-2708':1484, '1f468-200d-2764-200d-1f468':1655, '1f468-200d-2764-200d-1f48b-200d-1f468':1651, '1f468':1392, '1f469-200d-1f33e':1458, '1f469-200d-1f373':1461, '1f469-200d-1f37c':1523, '1f469-200d-1f393':1449, '1f469-200d-1f3a4':1479, '1f469-200d-1f3a8':1482, '1f469-200d-1f3eb':1452, '1f469-200d-1f3ed':1467, '1f469-200d-1f466-200d-1f466':1679, '1f469-200d-1f466':1678, '1f469-200d-1f467-200d-1f466':1681, '1f469-200d-1f467-200d-1f467':1682, '1f469-200d-1f467':1680, '1f469-200d-1f469-200d-1f466':1668, '1f469-200d-1f469-200d-1f466-200d-1f466':1671, '1f469-200d-1f469-200d-1f467':1669, '1f469-200d-1f469-200d-1f467-200d-1f466':1670, '1f469-200d-1f469-200d-1f467-200d-1f467':1672, '1f469-200d-1f4bb':1476, '1f469-200d-1f4bc':1470, '1f469-200d-1f527':1464, '1f469-200d-1f52c':1473, '1f469-200d-1f680':1488, '1f469-200d-1f692':1491, '1f469-200d-1f9af':1575, '1f469-200d-1f9b0':1401, '1f469-200d-1f9b1':1403, '1f469-200d-1f9b2':1407, '1f469-200d-1f9b3':1405, '1f469-200d-1f9bc':1578, '1f469-200d-1f9bd':1581, '1f469-200d-2695':1446, '1f469-200d-2696':1455, '1f469-200d-2708':1485, '1f469-200d-2764-200d-1f468':1654, '1f469-200d-2764-200d-1f469':1656, '1f469-200d-2764-200d-1f48b-200d-1f468':1650, '1f469-200d-2764-200d-1f48b-200d-1f469':1652, '1f469':1400, '1f46a':1657, '1f46b':1647, '1f46c':1648, '1f46d':1646, '1f46e-200d-2640':1494, '1f46e-200d-2642':1493, '1f46e':1492, '1f46f-200d-2640':1590, '1f46f-200d-2642':1589, '1f46f':1588, '1f470-200d-2640':1518, '1f470-200d-2642':1517, '1f470':1516, '1f471-200d-2640':1409, '1f471-200d-2642':1410, '1f471':1391, '1f472':1511, '1f473-200d-2640':1510, '1f473-200d-2642':1509, '1f473':1508, '1f474':1412, '1f475':1413, '1f476':1386, '1f477-200d-2640':1504, '1f477-200d-2642':1503, '1f477':1502, '1f478':1507, '1f479':1109, '1f47a':1110, '1f47b':1111, '1f47c':1526, '1f47d':1112, '1f47e':1113, '1f47f':1104, '1f480':1105, '1f481-200d-2640':1428, '1f481-200d-2642':1427, '1f481':1426, '1f482-200d-2640':1500, '1f482-200d-2642':1499, '1f482':1498, '1f483':1585, '1f484':61152, '1f485':1366, '1f486-200d-2640':1560, '1f486-200d-2642':1559, '1f486':1558, '1f487-200d-2640':1563, '1f487-200d-2642':1562, '1f487':1561, '1f488':4870, '1f489':61326, '1f48a':61328, '1f48b':1127, '1f48c':1128, '1f48d':61153, '1f48e':61154, '1f48f':1649, '1f490':2648, '1f491':1653, '1f492':4846, '1f493':1133, '1f494':1138, '1f495':1135, '1f496':1131, '1f497':1132, '1f498':1129, '1f499':1145, '1f49a':1144, '1f49b':1143, '1f49c':1146, '1f49d':1130, '1f49e':1134, '1f49f':1136, '1f4a0':62946, '1f4a1':61214, '1f4a2':1151, '1f4a3':1157, '1f4a4':1163, '1f4a5':1152, '1f4a6':1154, '1f4a7':41022, '1f4a8':1155, '1f4a9':1107, '1f4aa':1368, '1f4ab':1153, '1f4ac':1158, '1f4ad':1162, '1f4ae':2650, '1f4af':1150, '1f4b0':61235, '1f4b1':62841, '1f4b2':62842, '1f4b3':61242, '1f4b4':61237, '1f4b5':61238, '1f4b6':61239, '1f4b7':61240, '1f4b8':61241, '1f4b9':61244, '1f4ba':4936, '1f4bb':61191, '1f4bc':61265, '1f4bd':61197, '1f4be':61198, '1f4bf':61199, '1f4c0':61200, '1f4c1':61266, '1f4c2':61267, '1f4c3':61227, '1f4c4':61229, '1f4c5':61269, '1f4c6':61270, '1f4c7':61273, '1f4c8':61274, '1f4c9':61275, '1f4ca':61276, '1f4cb':61277, '1f4cc':61278, '1f4cd':61279, '1f4ce':61280, '1f4cf':61282, '1f4d0':61283, '1f4d1':61232, '1f4d2':61226, '1f4d3':61225, '1f4d4':61218, '1f4d5':61219, '1f4d6':61220, '1f4d7':61221, '1f4d8':61222, '1f4d9':61223, '1f4da':61224, '1f4db':62847, '1f4dc':61228, '1f4dd':61264, '1f4de':61185, '1f4df':61186, '1f4e0':61187, '1f4e1':61325, '1f4e2':61159, '1f4e3':61160, '1f4e4':61249, '1f4e5':61250, '1f4e6':61251, '1f4e7':61246, '1f4e8':61247, '1f4e9':61248, '1f4ea':61253, '1f4eb':61252, '1f4ec':61254, '1f4ed':61255, '1f4ee':61256, '1f4ef':61161, '1f4f0':61230, '1f4f1':61182, '1f4f2':61183, '1f4f3':62823, '1f4f4':62824, '1f4f5':62751, '1f4f6':62822, '1f4f7':61207, '1f4f8':61208, '1f4f9':61209, '1f4fa':61206, '1f4fb':61172, '1f4fc':61210, '1f4fd':61204, '1f4ff':61151, '1f500':62801, '1f501':62802, '1f502':62803, '1f503':62769, '1f504':62770, '1f505':62820, '1f506':62821, '1f507':61155, '1f508':61156, '1f509':61157, '1f50a':61158, '1f50b':61188, '1f50c':61190, '1f50d':61211, '1f50e':61212, '1f50f':61290, '1f510':61291, '1f511':61292, '1f512':61288, '1f513':61289, '1f514':61162, '1f515':61163, '1f516':61233, '1f517':61313, '1f518':62947, '1f519':62771, '1f51a':62772, '1f51b':62773, '1f51c':62774, '1f51d':62775, '1f51e':62752, '1f51f':62876, '1f520':62877, '1f521':62878, '1f522':62879, '1f523':62880, '1f524':62881, '1f525':41021, '1f526':61215, '1f527':61306, '1f528':61294, '1f529':61308, '1f52a':3803, '1f52b':61301, '1f52c':61323, '1f52d':61324, '1f52e':51082, '1f52f':62787, '1f530':62848, '1f531':62846, '1f532':62949, '1f533':62948, '1f534':62916, '1f535':62920, '1f536':62940, '1f537':62941, '1f538':62942, '1f539':62943, '1f53a':62944, '1f53b':62945, '1f53c':62811, '1f53d':62813, '1f549':62778, '1f54a':2602, '1f54b':4854, '1f54c':4850, '1f54d':4852, '1f54e':62786, '1f550':4955, '1f551':4957, '1f552':4959, '1f553':4961, '1f554':4963, '1f555':4965, '1f556':4967, '1f557':4969, '1f558':4971, '1f559':4973, '1f55a':4975, '1f55b':4953, '1f55c':4956, '1f55d':4958, '1f55e':4960, '1f55f':4962, '1f560':4964, '1f561':4966, '1f562':4968, '1f563':4970, '1f564':4972, '1f565':4974, '1f566':4976, '1f567':4954, '1f56f':61213, '1f570':4952, '1f573':1156, '1f574':1587, '1f575-200d-2640':1497, '1f575-200d-2642':1496, '1f575':1495, '1f576':61111, '1f577':2641, '1f578':2642, '1f579':51087, '1f57a':1586, '1f587':61281, '1f58a':61261, '1f58b':61260, '1f58c':61262, '1f58d':61263, '1f590':1329, '1f595':1348, '1f596':1331, '1f5a4':1148, '1f5a5':61192, '1f5a8':61193, '1f5b1':61195, '1f5b2':61196, '1f5bc':51104, '1f5c2':61268, '1f5c3':61285, '1f5c4':61286, '1f5d1':61287, '1f5d2':61271, '1f5d3':61272, '1f5dc':61310, '1f5dd':61293, '1f5de':61231, '1f5e1':61299, '1f5e3':1683, '1f5e8':1160, '1f5ef':1161, '1f5f3':61257, '1f5fa':4810, '1f5fb':4816, '1f5fc':4847, '1f5fd':4848, '1f5fe':4811, '1f5ff':61362, '1f600':11, '1f601':14, '1f602':18, '1f603':12, '1f604':13, '1f605':16, '1f606':15, '1f607':114, '1f608':1103, '1f609':112, '1f60a':113, '1f60b':124, '1f60c':150, '1f60d':116, '1f60e':170, '1f60f':144, '1f610':139, '1f611':140, '1f612':145, '1f613':195, '1f614':151, '1f615':173, '1f616':192, '1f617':119, '1f618':118, '1f619':122, '1f61a':121, '1f61b':125, '1f61c':126, '1f61d':128, '1f61e':194, '1f61f':175, '1f620':1101, '1f621':1100, '1f622':189, '1f623':193, '1f624':199, '1f625':188, '1f626':184, '1f627':185, '1f628':186, '1f629':196, '1f62a':152, '1f62b':197, '1f62c':147, '1f62d':190, '1f62e-200d-1f4a8':148, '1f62e':178, '1f62f':179, '1f630':187, '1f631':191, '1f632':180, '1f633':181, '1f634':154, '1f635-200d-1f4ab':165, '1f635':164, '1f636-200d-1f32b':143, '1f636':141, '1f637':155, '1f638':1116, '1f639':1117, '1f63a':1115, '1f63b':1118, '1f63c':1119, '1f63d':1120, '1f63e':1123, '1f63f':1122, '1f640':1121, '1f641':176, '1f642':19, '1f643':110, '1f644':146, '1f645-200d-2640':1422, '1f645-200d-2642':1421, '1f645':1420, '1f646-200d-2640':1425, '1f646-200d-2642':1424, '1f646':1423, '1f647-200d-2640':1437, '1f647-200d-2642':1436, '1f647':1435, '1f648':1124, '1f649':1125, '1f64a':1126, '1f64b-200d-2640':1431, '1f64b-200d-2642':1430, '1f64b':1429, '1f64c':1359, '1f64d-200d-2640':1416, '1f64d-200d-2642':1415, '1f64d':1414, '1f64e-200d-2640':1419, '1f64e-200d-2642':1418, '1f64e':1417, '1f64f':1364, '1f680':4942, '1f681':4937, '1f682':4872, '1f683':4873, '1f684':4874, '1f685':4875, '1f686':4876, '1f687':4877, '1f688':4878, '1f689':4879, '1f68a':4880, '1f68b':4883, '1f68c':4884, '1f68d':4885, '1f68e':4886, '1f68f':4911, '1f690':4887, '1f691':4888, '1f692':4889, '1f693':4890, '1f694':4891, '1f695':4892, '1f696':4893, '1f697':4894, '1f698':4895, '1f699':4896, '1f69a':4898, '1f69b':4899, '1f69c':4900, '1f69d':4881, '1f69e':4882, '1f69f':4938, '1f6a0':4939, '1f6a1':4940, '1f6a2':4930, '1f6a3-200d-2640':1609, '1f6a3-200d-2642':1608, '1f6a3':1607, '1f6a4':4926, '1f6a5':4918, '1f6a6':4919, '1f6a7':4921, '1f6a8':4917, '1f6a9':71587, '1f6aa':61333, '1f6ab':62745, '1f6ac':61358, '1f6ad':62747, '1f6ae':62730, '1f6af':62748, '1f6b0':62731, '1f6b1':62749, '1f6b2':4907, '1f6b3':62746, '1f6b4-200d-2640':1621, '1f6b4-200d-2642':1620, '1f6b4':1619, '1f6b5-200d-2640':1624, '1f6b5-200d-2642':1623, '1f6b5':1622, '1f6b6-200d-2640':1566, '1f6b6-200d-2642':1565, '1f6b6':1564, '1f6b7':62750, '1f6b8':62743, '1f6b9':62733, '1f6ba':62734, '1f6bb':62735, '1f6bc':62736, '1f6bd':61340, '1f6be':62737, '1f6bf':61342, '1f6c0':1643, '1f6c1':61343, '1f6c2':62738, '1f6c3':62739, '1f6c4':62740, '1f6c5':62741, '1f6cb':61338, '1f6cc':1644, '1f6cd':61133, '1f6ce':4944, '1f6cf':61337, '1f6d0':62776, '1f6d1':4920, '1f6d2':61357, '1f6d5':4851, '1f6d6':4828, '1f6d7':61334, '1f6e0':61298, '1f6e1':61304, '1f6e2':4914, '1f6e3':4912, '1f6e4':4913, '1f6e5':4929, '1f6e9':4932, '1f6eb':4933, '1f6ec':4934, '1f6f0':4941, '1f6f3':4927, '1f6f4':4908, '1f6f5':4903, '1f6f6':4925, '1f6f7':51076, '1f6f8':4943, '1f6f9':4909, '1f6fa':4906, '1f6fb':4897, '1f6fc':4910, '1f7e0':62917, '1f7e1':62918, '1f7e2':62919, '1f7e3':62921, '1f7e4':62922, '1f7e5':62925, '1f7e6':62929, '1f7e7':62926, '1f7e8':62927, '1f7e9':62928, '1f7ea':62930, '1f7eb':62931, '1f90c':1337, '1f90d':1149, '1f90e':1147, '1f90f':1338, '1f910':137, '1f911':129, '1f912':156, '1f913':171, '1f914':135, '1f915':157, '1f916':1114, '1f917':130, '1f918':1343, '1f919':1344, '1f91a':1328, '1f91b':1356, '1f91c':1357, '1f91d':1363, '1f91e':1340, '1f91f':1342, '1f920':167, '1f921':1108, '1f922':158, '1f923':17, '1f924':153, '1f925':149, '1f926-200d-2640':1440, '1f926-200d-2642':1439, '1f926':1438, '1f927':160, '1f928':138, '1f929':117, '1f92a':127, '1f92b':134, '1f92c':1102, '1f92d':131, '1f92e':159, '1f92f':166, '1f930':1519, '1f931':1522, '1f932':1362, '1f933':1367, '1f934':1506, '1f935-200d-2640':1515, '1f935-200d-2642':1514, '1f935':1513, '1f936':1528, '1f937-200d-2640':1443, '1f937-200d-2642':1442, '1f937':1441, '1f938-200d-2640':1627, '1f938-200d-2642':1626, '1f938':1625, '1f939-200d-2640':1639, '1f939-200d-2642':1638, '1f939':1637, '1f93a':1597, '1f93c-200d-2640':1630, '1f93c-200d-2642':1629, '1f93c':1628, '1f93d-200d-2640':1633, '1f93d-200d-2642':1632, '1f93d':1631, '1f93e-200d-2640':1636, '1f93e-200d-2642':1635, '1f93e':1634, '1f93f':51073, '1f940':2654, '1f941':61180, '1f942':3791, '1f943':3792, '1f944':3802, '1f945':51069, '1f947':51048, '1f948':51049, '1f949':51050, '1f94a':51067, '1f94b':51068, '1f94c':51077, '1f94d':51064, '1f94e':51053, '1f94f':51059, '1f950':3710, '1f951':3693, '1f952':3700, '1f953':3721, '1f954':3695, '1f955':3696, '1f956':3711, '1f957':3738, '1f958':3734, '1f959':3730, '1f95a':3732, '1f95b':3780, '1f95c':3706, '1f95d':3689, '1f95e':3715, '1f95f':3757, '1f960':3758, '1f961':3759, '1f962':3799, '1f963':3737, '1f964':3794, '1f965':3692, '1f966':3702, '1f967':3773, '1f968':3713, '1f969':3720, '1f96a':3726, '1f96b':3742, '1f96c':3701, '1f96d':3681, '1f96e':3755, '1f96f':3714, '1f970':115, '1f971':198, '1f972':123, '1f973':168, '1f974':163, '1f975':161, '1f976':162, '1f977':1501, '1f978':169, '1f97a':182, '1f97b':61124, '1f97c':61113, '1f97d':61112, '1f97e':61138, '1f97f':61139, '1f980':3760, '1f981':2545, '1f982':2643, '1f983':2594, '1f984':2551, '1f985':2603, '1f986':2604, '1f987':2583, '1f988':2628, '1f989':2606, '1f98a':2540, '1f98b':2633, '1f98c':2553, '1f98d':2532, '1f98e':2615, '1f98f':2572, '1f990':3762, '1f991':3763, '1f992':2569, '1f993':2552, '1f994':2582, '1f995':2619, '1f996':2620, '1f997':2639, '1f998':2591, '1f999':2568, '1f99a':2610, '1f99b':2573, '1f99c':2611, '1f99d':2541, '1f99e':3761, '1f99f':2644, '1f9a0':2647, '1f9a1':2592, '1f9a2':2605, '1f9a3':2571, '1f9a4':2607, '1f9a5':2588, '1f9a6':2589, '1f9a7':2533, '1f9a8':2590, '1f9a9':2609, '1f9aa':3764, '1f9ab':2581, '1f9ac':2554, '1f9ad':2624, '1f9ae':2536, '1f9af':61312, '1f9b4':1380, '1f9b5':1371, '1f9b6':1372, '1f9b7':1379, '1f9b8-200d-2640':1532, '1f9b8-200d-2642':1531, '1f9b8':1530, '1f9b9-200d-2640':1535, '1f9b9-200d-2642':1534, '1f9b9':1533, '1f9ba':61114, '1f9bb':1374, '1f9bc':4905, '1f9bd':4904, '1f9be':1369, '1f9bf':1370, '1f9c0':3717, '1f9c1':3772, '1f9c2':3741, '1f9c3':3796, '1f9c4':3703, '1f9c5':3704, '1f9c6':3731, '1f9c7':3716, '1f9c8':3740, '1f9c9':3797, '1f9ca':3798, '1f9cb':3795, '1f9cd-200d-2640':1569, '1f9cd-200d-2642':1568, '1f9cd':1567, '1f9ce-200d-2640':1572, '1f9ce-200d-2642':1571, '1f9ce':1570, '1f9cf-200d-2640':1434, '1f9cf-200d-2642':1433, '1f9cf':1432, '1f9d0':172, '1f9d1-200d-1f33e':1456, '1f9d1-200d-1f373':1459, '1f9d1-200d-1f37c':1525, '1f9d1-200d-1f384':1529, '1f9d1-200d-1f393':1447, '1f9d1-200d-1f3a4':1477, '1f9d1-200d-1f3a8':1480, '1f9d1-200d-1f3eb':1450, '1f9d1-200d-1f3ed':1465, '1f9d1-200d-1f4bb':1474, '1f9d1-200d-1f4bc':1468, '1f9d1-200d-1f527':1462, '1f9d1-200d-1f52c':1471, '1f9d1-200d-1f680':1486, '1f9d1-200d-1f692':1489, '1f9d1-200d-1f91d-200d-1f9d1':1645, '1f9d1-200d-1f9af':1573, '1f9d1-200d-1f9b0':1402, '1f9d1-200d-1f9b1':1404, '1f9d1-200d-1f9b2':1408, '1f9d1-200d-1f9b3':1406, '1f9d1-200d-1f9bc':1576, '1f9d1-200d-1f9bd':1579, '1f9d1-200d-2695':1444, '1f9d1-200d-2696':1453, '1f9d1-200d-2708':1483, '1f9d1':1390, '1f9d2':1387, '1f9d3':1411, '1f9d4-200d-2640':1395, '1f9d4-200d-2642':1394, '1f9d4':1393, '1f9d5':1512, '1f9d6-200d-2640':1593, '1f9d6-200d-2642':1592, '1f9d6':1591, '1f9d7-200d-2640':1596, '1f9d7-200d-2642':1595, '1f9d7':1594, '1f9d8-200d-2640':1642, '1f9d8-200d-2642':1641, '1f9d8':1640, '1f9d9-200d-2640':1538, '1f9d9-200d-2642':1537, '1f9d9':1536, '1f9da-200d-2640':1541, '1f9da-200d-2642':1540, '1f9da':1539, '1f9db-200d-2640':1544, '1f9db-200d-2642':1543, '1f9db':1542, '1f9dc-200d-2640':1547, '1f9dc-200d-2642':1546, '1f9dc':1545, '1f9dd-200d-2640':1550, '1f9dd-200d-2642':1549, '1f9dd':1548, '1f9de-200d-2640':1553, '1f9de-200d-2642':1552, '1f9de':1551, '1f9df-200d-2640':1556, '1f9df-200d-2642':1555, '1f9df':1554, '1f9e0':1376, '1f9e1':1142, '1f9e2':61148, '1f9e3':61118, '1f9e4':61119, '1f9e5':61120, '1f9e6':61121, '1f9e7':51039, '1f9e8':51028, '1f9e9':51090, '1f9ea':61320, '1f9eb':61321, '1f9ec':61322, '1f9ed':4812, '1f9ee':61201, '1f9ef':61356, '1f9f0':61316, '1f9f1':4825, '1f9f2':61317, '1f9f3':4945, '1f9f4':61346, '1f9f5':51106, '1f9f6':51108, '1f9f7':61347, '1f9f8':51091, '1f9f9':61348, '1f9fa':61349, '1f9fb':61350, '1f9fc':61352, '1f9fd':61355, '1f9fe':61243, '1f9ff':51084, '1fa70':61142, '1fa71':61125, '1fa72':61126, '1fa73':61127, '1fa74':61135, '1fa78':61327, '1fa79':61329, '1fa7a':61331, '1fa80':51079, '1fa81':51080, '1fa82':4935, '1fa83':61302, '1fa84':51083, '1fa85':51092, '1fa86':51094, '1fa90':4993, '1fa91':61339, '1fa92':61345, '1fa93':61295, '1fa94':61217, '1fa95':61179, '1fa96':61149, '1fa97':61174, '1fa98':61181, '1fa99':61236, '1fa9a':61305, '1fa9b':61307, '1fa9c':61318, '1fa9d':61315, '1fa9e':61335, '1fa9f':61336, '1faa0':61341, '1faa1':51107, '1faa2':51109, '1faa3':61351, '1faa4':61344, '1faa5':61354, '1faa6':61360, '1faa7':61363, '1faa8':4826, '1fab0':2645, '1fab1':2646, '1fab2':2637, '1fab3':2640, '1fab4':2660, '1fab5':4827, '1fab6':2608, '1fac0':1377, '1fac1':1378, '1fac2':1686, '1fad0':3688, '1fad1':3699, '1fad2':3691, '1fad3':3712, '1fad4':3729, '1fad5':3736, '1fad6':3782, '203c':62834, '21a9':62765, '21aa':62766, '231a':4948, '231b':4946, '23cf':62818, '23e9':62805, '23ea':62809, '23eb':62812, '23ec':62814, '23ed':62806, '23ee':62810, '23ef':62807, '23f0':4949, '23f1':4950, '23f2':4951, '23f3':4947, '23f8':62815, '23f9':62816, '23fa':62817, '24c2':62890, '25aa':62938, '25ab':62939, '25b6':62804, '25c0':62808, '25fb':62935, '25fc':62934, '25fd':62937, '25fe':62936, '260e':61184, '261d':1350, '262a':62784, '262e':62785, '262f':62781, '263a':120, '264a':62790, '264b':62791, '264c':62792, '264d':62793, '264e':62794, '264f':62795, '265f':51099, '267b':62844, '267e':62833, '267f':62732, '269b':62777, '269c':62845, '26a0':62742, '26a1':41016, '26a7':62827, '26aa':62924, '26ab':62923, '26b0':61359, '26b1':61361, '26bd':51051, '26be':51052, '26c4':41019, '26c5':4999, '26c8':41000, '26ce':62800, '26cf':61296, '26d1':61150, '26d3':61314, '26d4':62744, '26e9':4853, '26ea':4849, '26f0':4814, '26f1':41015, '26f2':4855, '26f3':51070, '26f4':4928, '26f5':4924, '26f7':1599, '26f8':51071, '26f9-200d-2640':1615, '26f9-200d-2642':1614, '26f9':1613, '26fa':4856, '26fd':4915, '270a':1354, '270b':1330, '270c':1339, '270d':1365, '270f':61258, '271d':62782, '274c':62853, '274e':62854, '2764-200d-1f525':1139, '2764-200d-1fa79':1140, '27a1':62757, '27b0':62855, '27bf':62856, '2b05':62761, '2b06':62755, '2b07':62759, '2b1b':62932, '2b1c':62933, '2b50':4994, '2b55':62849, '303d':62857, '1f385-1f3fb':0, '1f385-1f3fc':0, '1f385-1f3fd':0, '1f385-1f3fe':0, '1f385-1f3ff':0, '1f3c2-1f3fb':0, '1f3c2-1f3fc':0, '1f3c2-1f3fd':0, '1f3c2-1f3fe':0, '1f3c2-1f3ff':0, '1f3c3-1f3fb-200d-2640':0, '1f3c3-1f3fc-200d-2640':0, '1f3c3-1f3fd-200d-2640':0, '1f3c3-1f3fe-200d-2640':0, '1f3c3-1f3ff-200d-2640':0, '1f3c3-1f3fb-200d-2642':0, '1f3c3-1f3fc-200d-2642':0, '1f3c3-1f3fd-200d-2642':0, '1f3c3-1f3fe-200d-2642':0, '1f3c3-1f3ff-200d-2642':0, '1f3c3-1f3fb':0, '1f3c3-1f3fc':0, '1f3c3-1f3fd':0, '1f3c3-1f3fe':0, '1f3c3-1f3ff':0, '1f3c4-1f3fb-200d-2640':0, '1f3c4-1f3fc-200d-2640':0, '1f3c4-1f3fd-200d-2640':0, '1f3c4-1f3fe-200d-2640':0, '1f3c4-1f3ff-200d-2640':0, '1f3c4-1f3fb-200d-2642':0, '1f3c4-1f3fc-200d-2642':0, '1f3c4-1f3fd-200d-2642':0, '1f3c4-1f3fe-200d-2642':0, '1f3c4-1f3ff-200d-2642':0, '1f3c4-1f3fb':0, '1f3c4-1f3fc':0, '1f3c4-1f3fd':0, '1f3c4-1f3fe':0, '1f3c4-1f3ff':0, '1f3c7-1f3fb':0, '1f3c7-1f3fc':0, '1f3c7-1f3fd':0, '1f3c7-1f3fe':0, '1f3c7-1f3ff':0, '1f3ca-1f3fb-200d-2640':0, '1f3ca-1f3fc-200d-2640':0, '1f3ca-1f3fd-200d-2640':0, '1f3ca-1f3fe-200d-2640':0, '1f3ca-1f3ff-200d-2640':0, '1f3ca-1f3fb-200d-2642':0, '1f3ca-1f3fc-200d-2642':0, '1f3ca-1f3fd-200d-2642':0, '1f3ca-1f3fe-200d-2642':0, '1f3ca-1f3ff-200d-2642':0, '1f3ca-1f3fb':0, '1f3ca-1f3fc':0, '1f3ca-1f3fd':0, '1f3ca-1f3fe':0, '1f3ca-1f3ff':0, '1f3cb-1f3fb-200d-2640':0, '1f3cb-1f3fc-200d-2640':0, '1f3cb-1f3fd-200d-2640':0, '1f3cb-1f3fe-200d-2640':0, '1f3cb-1f3ff-200d-2640':0, '1f3cb-1f3fb-200d-2642':0, '1f3cb-1f3fc-200d-2642':0, '1f3cb-1f3fd-200d-2642':0, '1f3cb-1f3fe-200d-2642':0, '1f3cb-1f3ff-200d-2642':0, '1f3cb-1f3fb':0, '1f3cb-1f3fc':0, '1f3cb-1f3fd':0, '1f3cb-1f3fe':0, '1f3cb-1f3ff':0, '1f3cc-1f3fb-200d-2640':0, '1f3cc-1f3fc-200d-2640':0, '1f3cc-1f3fd-200d-2640':0, '1f3cc-1f3fe-200d-2640':0, '1f3cc-1f3ff-200d-2640':0, '1f3cc-1f3fb-200d-2642':0, '1f3cc-1f3fc-200d-2642':0, '1f3cc-1f3fd-200d-2642':0, '1f3cc-1f3fe-200d-2642':0, '1f3cc-1f3ff-200d-2642':0, '1f3cc-1f3fb':0, '1f3cc-1f3fc':0, '1f3cc-1f3fd':0, '1f3cc-1f3fe':0, '1f3cc-1f3ff':0, '1f442-1f3fb':0, '1f442-1f3fc':0, '1f442-1f3fd':0, '1f442-1f3fe':0, '1f442-1f3ff':0, '1f443-1f3fb':0, '1f443-1f3fc':0, '1f443-1f3fd':0, '1f443-1f3fe':0, '1f443-1f3ff':0, '1f446-1f3fb':0, '1f446-1f3fc':0, '1f446-1f3fd':0, '1f446-1f3fe':0, '1f446-1f3ff':0, '1f447-1f3fb':0, '1f447-1f3fc':0, '1f447-1f3fd':0, '1f447-1f3fe':0, '1f447-1f3ff':0, '1f448-1f3fb':0, '1f448-1f3fc':0, '1f448-1f3fd':0, '1f448-1f3fe':0, '1f448-1f3ff':0, '1f449-1f3fb':0, '1f449-1f3fc':0, '1f449-1f3fd':0, '1f449-1f3fe':0, '1f449-1f3ff':0, '1f44a-1f3fb':0, '1f44a-1f3fc':0, '1f44a-1f3fd':0, '1f44a-1f3fe':0, '1f44a-1f3ff':0, '1f44b-1f3fb':0, '1f44b-1f3fc':0, '1f44b-1f3fd':0, '1f44b-1f3fe':0, '1f44b-1f3ff':0, '1f44c-1f3fb':0, '1f44c-1f3fc':0, '1f44c-1f3fd':0, '1f44c-1f3fe':0, '1f44c-1f3ff':0, '1f44d-1f3fb':0, '1f44d-1f3fc':0, '1f44d-1f3fd':0, '1f44d-1f3fe':0, '1f44d-1f3ff':0, '1f44e-1f3fb':0, '1f44e-1f3fc':0, '1f44e-1f3fd':0, '1f44e-1f3fe':0, '1f44e-1f3ff':0, '1f44f-1f3fb':0, '1f44f-1f3fc':0, '1f44f-1f3fd':0, '1f44f-1f3fe':0, '1f44f-1f3ff':0, '1f450-1f3fb':0, '1f450-1f3fc':0, '1f450-1f3fd':0, '1f450-1f3fe':0, '1f450-1f3ff':0, '1f466-1f3fb':0, '1f466-1f3fc':0, '1f466-1f3fd':0, '1f466-1f3fe':0, '1f466-1f3ff':0, '1f467-1f3fb':0, '1f467-1f3fc':0, '1f467-1f3fd':0, '1f467-1f3fe':0, '1f467-1f3ff':0, '1f468-1f3fb-200d-1f33e':0, '1f468-1f3fc-200d-1f33e':0, '1f468-1f3fd-200d-1f33e':0, '1f468-1f3fe-200d-1f33e':0, '1f468-1f3ff-200d-1f33e':0, '1f468-1f3fb-200d-1f373':0, '1f468-1f3fc-200d-1f373':0, '1f468-1f3fd-200d-1f373':0, '1f468-1f3fe-200d-1f373':0, '1f468-1f3ff-200d-1f373':0, '1f468-1f3fb-200d-1f37c':0, '1f468-1f3fc-200d-1f37c':0, '1f468-1f3fd-200d-1f37c':0, '1f468-1f3fe-200d-1f37c':0, '1f468-1f3ff-200d-1f37c':0, '1f468-1f3fb-200d-1f393':0, '1f468-1f3fc-200d-1f393':0, '1f468-1f3fd-200d-1f393':0, '1f468-1f3fe-200d-1f393':0, '1f468-1f3ff-200d-1f393':0, '1f468-1f3fb-200d-1f3a4':0, '1f468-1f3fc-200d-1f3a4':0, '1f468-1f3fd-200d-1f3a4':0, '1f468-1f3fe-200d-1f3a4':0, '1f468-1f3ff-200d-1f3a4':0, '1f468-1f3fb-200d-1f3a8':0, '1f468-1f3fc-200d-1f3a8':0, '1f468-1f3fd-200d-1f3a8':0, '1f468-1f3fe-200d-1f3a8':0, '1f468-1f3ff-200d-1f3a8':0, '1f468-1f3fb-200d-1f3eb':0, '1f468-1f3fc-200d-1f3eb':0, '1f468-1f3fd-200d-1f3eb':0, '1f468-1f3fe-200d-1f3eb':0, '1f468-1f3ff-200d-1f3eb':0, '1f468-1f3fb-200d-1f3ed':0, '1f468-1f3fc-200d-1f3ed':0, '1f468-1f3fd-200d-1f3ed':0, '1f468-1f3fe-200d-1f3ed':0, '1f468-1f3ff-200d-1f3ed':0, '1f468-1f3fb-200d-1f4bb':0, '1f468-1f3fc-200d-1f4bb':0, '1f468-1f3fd-200d-1f4bb':0, '1f468-1f3fe-200d-1f4bb':0, '1f468-1f3ff-200d-1f4bb':0, '1f468-1f3fb-200d-1f4bc':0, '1f468-1f3fc-200d-1f4bc':0, '1f468-1f3fd-200d-1f4bc':0, '1f468-1f3fe-200d-1f4bc':0, '1f468-1f3ff-200d-1f4bc':0, '1f468-1f3fb-200d-1f527':0, '1f468-1f3fc-200d-1f527':0, '1f468-1f3fd-200d-1f527':0, '1f468-1f3fe-200d-1f527':0, '1f468-1f3ff-200d-1f527':0, '1f468-1f3fb-200d-1f52c':0, '1f468-1f3fc-200d-1f52c':0, '1f468-1f3fd-200d-1f52c':0, '1f468-1f3fe-200d-1f52c':0, '1f468-1f3ff-200d-1f52c':0, '1f468-1f3fb-200d-1f680':0, '1f468-1f3fc-200d-1f680':0, '1f468-1f3fd-200d-1f680':0, '1f468-1f3fe-200d-1f680':0, '1f468-1f3ff-200d-1f680':0, '1f468-1f3fb-200d-1f692':0, '1f468-1f3fc-200d-1f692':0, '1f468-1f3fd-200d-1f692':0, '1f468-1f3fe-200d-1f692':0, '1f468-1f3ff-200d-1f692':0, '1f468-1f3fb-200d-1f9af':0, '1f468-1f3fc-200d-1f9af':0, '1f468-1f3fd-200d-1f9af':0, '1f468-1f3fe-200d-1f9af':0, '1f468-1f3ff-200d-1f9af':0, '1f468-1f3fb-200d-1f9b0':0, '1f468-1f3fc-200d-1f9b0':0, '1f468-1f3fd-200d-1f9b0':0, '1f468-1f3fe-200d-1f9b0':0, '1f468-1f3ff-200d-1f9b0':0, '1f468-1f3fb-200d-1f9b1':0, '1f468-1f3fc-200d-1f9b1':0, '1f468-1f3fd-200d-1f9b1':0, '1f468-1f3fe-200d-1f9b1':0, '1f468-1f3ff-200d-1f9b1':0, '1f468-1f3fb-200d-1f9b2':0, '1f468-1f3fc-200d-1f9b2':0, '1f468-1f3fd-200d-1f9b2':0, '1f468-1f3fe-200d-1f9b2':0, '1f468-1f3ff-200d-1f9b2':0, '1f468-1f3fb-200d-1f9b3':0, '1f468-1f3fc-200d-1f9b3':0, '1f468-1f3fd-200d-1f9b3':0, '1f468-1f3fe-200d-1f9b3':0, '1f468-1f3ff-200d-1f9b3':0, '1f468-1f3fb-200d-1f9bc':0, '1f468-1f3fc-200d-1f9bc':0, '1f468-1f3fd-200d-1f9bc':0, '1f468-1f3fe-200d-1f9bc':0, '1f468-1f3ff-200d-1f9bc':0, '1f468-1f3fb-200d-1f9bd':0, '1f468-1f3fc-200d-1f9bd':0, '1f468-1f3fd-200d-1f9bd':0, '1f468-1f3fe-200d-1f9bd':0, '1f468-1f3ff-200d-1f9bd':0, '1f468-1f3fb-200d-2695':0, '1f468-1f3fc-200d-2695':0, '1f468-1f3fd-200d-2695':0, '1f468-1f3fe-200d-2695':0, '1f468-1f3ff-200d-2695':0, '1f468-1f3fb-200d-2696':0, '1f468-1f3fc-200d-2696':0, '1f468-1f3fd-200d-2696':0, '1f468-1f3fe-200d-2696':0, '1f468-1f3ff-200d-2696':0, '1f468-1f3fb-200d-2708':0, '1f468-1f3fc-200d-2708':0, '1f468-1f3fd-200d-2708':0, '1f468-1f3fe-200d-2708':0, '1f468-1f3ff-200d-2708':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fb':0, '1f468-1f3fc':0, '1f468-1f3fd':0, '1f468-1f3fe':0, '1f468-1f3ff':0, '1f469-1f3fb-200d-1f33e':0, '1f469-1f3fc-200d-1f33e':0, '1f469-1f3fd-200d-1f33e':0, '1f469-1f3fe-200d-1f33e':0, '1f469-1f3ff-200d-1f33e':0, '1f469-1f3fb-200d-1f373':0, '1f469-1f3fc-200d-1f373':0, '1f469-1f3fd-200d-1f373':0, '1f469-1f3fe-200d-1f373':0, '1f469-1f3ff-200d-1f373':0, '1f469-1f3fb-200d-1f37c':0, '1f469-1f3fc-200d-1f37c':0, '1f469-1f3fd-200d-1f37c':0, '1f469-1f3fe-200d-1f37c':0, '1f469-1f3ff-200d-1f37c':0, '1f469-1f3fb-200d-1f393':0, '1f469-1f3fc-200d-1f393':0, '1f469-1f3fd-200d-1f393':0, '1f469-1f3fe-200d-1f393':0, '1f469-1f3ff-200d-1f393':0, '1f469-1f3fb-200d-1f3a4':0, '1f469-1f3fc-200d-1f3a4':0, '1f469-1f3fd-200d-1f3a4':0, '1f469-1f3fe-200d-1f3a4':0, '1f469-1f3ff-200d-1f3a4':0, '1f469-1f3fb-200d-1f3a8':0, '1f469-1f3fc-200d-1f3a8':0, '1f469-1f3fd-200d-1f3a8':0, '1f469-1f3fe-200d-1f3a8':0, '1f469-1f3ff-200d-1f3a8':0, '1f469-1f3fb-200d-1f3eb':0, '1f469-1f3fc-200d-1f3eb':0, '1f469-1f3fd-200d-1f3eb':0, '1f469-1f3fe-200d-1f3eb':0, '1f469-1f3ff-200d-1f3eb':0, '1f469-1f3fb-200d-1f3ed':0, '1f469-1f3fc-200d-1f3ed':0, '1f469-1f3fd-200d-1f3ed':0, '1f469-1f3fe-200d-1f3ed':0, '1f469-1f3ff-200d-1f3ed':0, '1f469-1f3fb-200d-1f4bb':0, '1f469-1f3fc-200d-1f4bb':0, '1f469-1f3fd-200d-1f4bb':0, '1f469-1f3fe-200d-1f4bb':0, '1f469-1f3ff-200d-1f4bb':0, '1f469-1f3fb-200d-1f4bc':0, '1f469-1f3fc-200d-1f4bc':0, '1f469-1f3fd-200d-1f4bc':0, '1f469-1f3fe-200d-1f4bc':0, '1f469-1f3ff-200d-1f4bc':0, '1f469-1f3fb-200d-1f527':0, '1f469-1f3fc-200d-1f527':0, '1f469-1f3fd-200d-1f527':0, '1f469-1f3fe-200d-1f527':0, '1f469-1f3ff-200d-1f527':0, '1f469-1f3fb-200d-1f52c':0, '1f469-1f3fc-200d-1f52c':0, '1f469-1f3fd-200d-1f52c':0, '1f469-1f3fe-200d-1f52c':0, '1f469-1f3ff-200d-1f52c':0, '1f469-1f3fb-200d-1f680':0, '1f469-1f3fc-200d-1f680':0, '1f469-1f3fd-200d-1f680':0, '1f469-1f3fe-200d-1f680':0, '1f469-1f3ff-200d-1f680':0, '1f469-1f3fb-200d-1f692':0, '1f469-1f3fc-200d-1f692':0, '1f469-1f3fd-200d-1f692':0, '1f469-1f3fe-200d-1f692':0, '1f469-1f3ff-200d-1f692':0, '1f469-1f3fb-200d-1f9af':0, '1f469-1f3fc-200d-1f9af':0, '1f469-1f3fd-200d-1f9af':0, '1f469-1f3fe-200d-1f9af':0, '1f469-1f3ff-200d-1f9af':0, '1f469-1f3fb-200d-1f9b0':0, '1f469-1f3fc-200d-1f9b0':0, '1f469-1f3fd-200d-1f9b0':0, '1f469-1f3fe-200d-1f9b0':0, '1f469-1f3ff-200d-1f9b0':0, '1f469-1f3fb-200d-1f9b1':0, '1f469-1f3fc-200d-1f9b1':0, '1f469-1f3fd-200d-1f9b1':0, '1f469-1f3fe-200d-1f9b1':0, '1f469-1f3ff-200d-1f9b1':0, '1f469-1f3fb-200d-1f9b2':0, '1f469-1f3fc-200d-1f9b2':0, '1f469-1f3fd-200d-1f9b2':0, '1f469-1f3fe-200d-1f9b2':0, '1f469-1f3ff-200d-1f9b2':0, '1f469-1f3fb-200d-1f9b3':0, '1f469-1f3fc-200d-1f9b3':0, '1f469-1f3fd-200d-1f9b3':0, '1f469-1f3fe-200d-1f9b3':0, '1f469-1f3ff-200d-1f9b3':0, '1f469-1f3fb-200d-1f9bc':0, '1f469-1f3fc-200d-1f9bc':0, '1f469-1f3fd-200d-1f9bc':0, '1f469-1f3fe-200d-1f9bc':0, '1f469-1f3ff-200d-1f9bc':0, '1f469-1f3fb-200d-1f9bd':0, '1f469-1f3fc-200d-1f9bd':0, '1f469-1f3fd-200d-1f9bd':0, '1f469-1f3fe-200d-1f9bd':0, '1f469-1f3ff-200d-1f9bd':0, '1f469-1f3fb-200d-2695':0, '1f469-1f3fc-200d-2695':0, '1f469-1f3fd-200d-2695':0, '1f469-1f3fe-200d-2695':0, '1f469-1f3ff-200d-2695':0, '1f469-1f3fb-200d-2696':0, '1f469-1f3fc-200d-2696':0, '1f469-1f3fd-200d-2696':0, '1f469-1f3fe-200d-2696':0, '1f469-1f3ff-200d-2696':0, '1f469-1f3fb-200d-2708':0, '1f469-1f3fc-200d-2708':0, '1f469-1f3fd-200d-2708':0, '1f469-1f3fe-200d-2708':0, '1f469-1f3ff-200d-2708':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fb':0, '1f469-1f3fc':0, '1f469-1f3fd':0, '1f469-1f3fe':0, '1f469-1f3ff':0, '1f46b-1f3fb':0, '1f46b-1f3fc':0, '1f46b-1f3fd':0, '1f46b-1f3fe':0, '1f46b-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46c-1f3fb':0, '1f46c-1f3fc':0, '1f46c-1f3fd':0, '1f46c-1f3fe':0, '1f46c-1f3ff':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46d-1f3fb':0, '1f46d-1f3fc':0, '1f46d-1f3fd':0, '1f46d-1f3fe':0, '1f46d-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe':0, '1f46e-1f3fb-200d-2640':0, '1f46e-1f3fc-200d-2640':0, '1f46e-1f3fd-200d-2640':0, '1f46e-1f3fe-200d-2640':0, '1f46e-1f3ff-200d-2640':0, '1f46e-1f3fb-200d-2642':0, '1f46e-1f3fc-200d-2642':0, '1f46e-1f3fd-200d-2642':0, '1f46e-1f3fe-200d-2642':0, '1f46e-1f3ff-200d-2642':0, '1f46e-1f3fb':0, '1f46e-1f3fc':0, '1f46e-1f3fd':0, '1f46e-1f3fe':0, '1f46e-1f3ff':0, '1f470-1f3fb-200d-2640':0, '1f470-1f3fc-200d-2640':0, '1f470-1f3fd-200d-2640':0, '1f470-1f3fe-200d-2640':0, '1f470-1f3ff-200d-2640':0, '1f470-1f3fb-200d-2642':0, '1f470-1f3fc-200d-2642':0, '1f470-1f3fd-200d-2642':0, '1f470-1f3fe-200d-2642':0, '1f470-1f3ff-200d-2642':0, '1f470-1f3fb':0, '1f470-1f3fc':0, '1f470-1f3fd':0, '1f470-1f3fe':0, '1f470-1f3ff':0, '1f471-1f3fb-200d-2640':0, '1f471-1f3fc-200d-2640':0, '1f471-1f3fd-200d-2640':0, '1f471-1f3fe-200d-2640':0, '1f471-1f3ff-200d-2640':0, '1f471-1f3fb-200d-2642':0, '1f471-1f3fc-200d-2642':0, '1f471-1f3fd-200d-2642':0, '1f471-1f3fe-200d-2642':0, '1f471-1f3ff-200d-2642':0, '1f471-1f3fb':0, '1f471-1f3fc':0, '1f471-1f3fd':0, '1f471-1f3fe':0, '1f471-1f3ff':0, '1f472-1f3fb':0, '1f472-1f3fc':0, '1f472-1f3fd':0, '1f472-1f3fe':0, '1f472-1f3ff':0, '1f473-1f3fb-200d-2640':0, '1f473-1f3fc-200d-2640':0, '1f473-1f3fd-200d-2640':0, '1f473-1f3fe-200d-2640':0, '1f473-1f3ff-200d-2640':0, '1f473-1f3fb-200d-2642':0, '1f473-1f3fc-200d-2642':0, '1f473-1f3fd-200d-2642':0, '1f473-1f3fe-200d-2642':0, '1f473-1f3ff-200d-2642':0, '1f473-1f3fb':0, '1f473-1f3fc':0, '1f473-1f3fd':0, '1f473-1f3fe':0, '1f473-1f3ff':0, '1f474-1f3fb':0, '1f474-1f3fc':0, '1f474-1f3fd':0, '1f474-1f3fe':0, '1f474-1f3ff':0, '1f475-1f3fb':0, '1f475-1f3fc':0, '1f475-1f3fd':0, '1f475-1f3fe':0, '1f475-1f3ff':0, '1f476-1f3fb':0, '1f476-1f3fc':0, '1f476-1f3fd':0, '1f476-1f3fe':0, '1f476-1f3ff':0, '1f477-1f3fb-200d-2640':0, '1f477-1f3fc-200d-2640':0, '1f477-1f3fd-200d-2640':0, '1f477-1f3fe-200d-2640':0, '1f477-1f3ff-200d-2640':0, '1f477-1f3fb-200d-2642':0, '1f477-1f3fc-200d-2642':0, '1f477-1f3fd-200d-2642':0, '1f477-1f3fe-200d-2642':0, '1f477-1f3ff-200d-2642':0, '1f477-1f3fb':0, '1f477-1f3fc':0, '1f477-1f3fd':0, '1f477-1f3fe':0, '1f477-1f3ff':0, '1f478-1f3fb':0, '1f478-1f3fc':0, '1f478-1f3fd':0, '1f478-1f3fe':0, '1f478-1f3ff':0, '1f47c-1f3fb':0, '1f47c-1f3fc':0, '1f47c-1f3fd':0, '1f47c-1f3fe':0, '1f47c-1f3ff':0, '1f481-1f3fb-200d-2640':0, '1f481-1f3fc-200d-2640':0, '1f481-1f3fd-200d-2640':0, '1f481-1f3fe-200d-2640':0, '1f481-1f3ff-200d-2640':0, '1f481-1f3fb-200d-2642':0, '1f481-1f3fc-200d-2642':0, '1f481-1f3fd-200d-2642':0, '1f481-1f3fe-200d-2642':0, '1f481-1f3ff-200d-2642':0, '1f481-1f3fb':0, '1f481-1f3fc':0, '1f481-1f3fd':0, '1f481-1f3fe':0, '1f481-1f3ff':0, '1f482-1f3fb-200d-2640':0, '1f482-1f3fc-200d-2640':0, '1f482-1f3fd-200d-2640':0, '1f482-1f3fe-200d-2640':0, '1f482-1f3ff-200d-2640':0, '1f482-1f3fb-200d-2642':0, '1f482-1f3fc-200d-2642':0, '1f482-1f3fd-200d-2642':0, '1f482-1f3fe-200d-2642':0, '1f482-1f3ff-200d-2642':0, '1f482-1f3fb':0, '1f482-1f3fc':0, '1f482-1f3fd':0, '1f482-1f3fe':0, '1f482-1f3ff':0, '1f483-1f3fb':0, '1f483-1f3fc':0, '1f483-1f3fd':0, '1f483-1f3fe':0, '1f483-1f3ff':0, '1f485-1f3fb':0, '1f485-1f3fc':0, '1f485-1f3fd':0, '1f485-1f3fe':0, '1f485-1f3ff':0, '1f486-1f3fb-200d-2640':0, '1f486-1f3fc-200d-2640':0, '1f486-1f3fd-200d-2640':0, '1f486-1f3fe-200d-2640':0, '1f486-1f3ff-200d-2640':0, '1f486-1f3fb-200d-2642':0, '1f486-1f3fc-200d-2642':0, '1f486-1f3fd-200d-2642':0, '1f486-1f3fe-200d-2642':0, '1f486-1f3ff-200d-2642':0, '1f486-1f3fb':0, '1f486-1f3fc':0, '1f486-1f3fd':0, '1f486-1f3fe':0, '1f486-1f3ff':0, '1f487-1f3fb-200d-2640':0, '1f487-1f3fc-200d-2640':0, '1f487-1f3fd-200d-2640':0, '1f487-1f3fe-200d-2640':0, '1f487-1f3ff-200d-2640':0, '1f487-1f3fb-200d-2642':0, '1f487-1f3fc-200d-2642':0, '1f487-1f3fd-200d-2642':0, '1f487-1f3fe-200d-2642':0, '1f487-1f3ff-200d-2642':0, '1f487-1f3fb':0, '1f487-1f3fc':0, '1f487-1f3fd':0, '1f487-1f3fe':0, '1f487-1f3ff':0, '1f48f-1f3fb':0, '1f48f-1f3fc':0, '1f48f-1f3fd':0, '1f48f-1f3fe':0, '1f48f-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f491-1f3fb':0, '1f491-1f3fc':0, '1f491-1f3fd':0, '1f491-1f3fe':0, '1f491-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe':0, '1f4aa-1f3fb':0, '1f4aa-1f3fc':0, '1f4aa-1f3fd':0, '1f4aa-1f3fe':0, '1f4aa-1f3ff':0, '1f574-1f3fb':0, '1f574-1f3fc':0, '1f574-1f3fd':0, '1f574-1f3fe':0, '1f574-1f3ff':0, '1f575-1f3fb-200d-2640':0, '1f575-1f3fc-200d-2640':0, '1f575-1f3fd-200d-2640':0, '1f575-1f3fe-200d-2640':0, '1f575-1f3ff-200d-2640':0, '1f575-1f3fb-200d-2642':0, '1f575-1f3fc-200d-2642':0, '1f575-1f3fd-200d-2642':0, '1f575-1f3fe-200d-2642':0, '1f575-1f3ff-200d-2642':0, '1f575-1f3fb':0, '1f575-1f3fc':0, '1f575-1f3fd':0, '1f575-1f3fe':0, '1f575-1f3ff':0, '1f57a-1f3fb':0, '1f57a-1f3fc':0, '1f57a-1f3fd':0, '1f57a-1f3fe':0, '1f57a-1f3ff':0, '1f590-1f3fb':0, '1f590-1f3fc':0, '1f590-1f3fd':0, '1f590-1f3fe':0, '1f590-1f3ff':0, '1f595-1f3fb':0, '1f595-1f3fc':0, '1f595-1f3fd':0, '1f595-1f3fe':0, '1f595-1f3ff':0, '1f596-1f3fb':0, '1f596-1f3fc':0, '1f596-1f3fd':0, '1f596-1f3fe':0, '1f596-1f3ff':0, '1f645-1f3fb-200d-2640':0, '1f645-1f3fc-200d-2640':0, '1f645-1f3fd-200d-2640':0, '1f645-1f3fe-200d-2640':0, '1f645-1f3ff-200d-2640':0, '1f645-1f3fb-200d-2642':0, '1f645-1f3fc-200d-2642':0, '1f645-1f3fd-200d-2642':0, '1f645-1f3fe-200d-2642':0, '1f645-1f3ff-200d-2642':0, '1f645-1f3fb':0, '1f645-1f3fc':0, '1f645-1f3fd':0, '1f645-1f3fe':0, '1f645-1f3ff':0, '1f646-1f3fb-200d-2640':0, '1f646-1f3fc-200d-2640':0, '1f646-1f3fd-200d-2640':0, '1f646-1f3fe-200d-2640':0, '1f646-1f3ff-200d-2640':0, '1f646-1f3fb-200d-2642':0, '1f646-1f3fc-200d-2642':0, '1f646-1f3fd-200d-2642':0, '1f646-1f3fe-200d-2642':0, '1f646-1f3ff-200d-2642':0, '1f646-1f3fb':0, '1f646-1f3fc':0, '1f646-1f3fd':0, '1f646-1f3fe':0, '1f646-1f3ff':0, '1f647-1f3fb-200d-2640':0, '1f647-1f3fc-200d-2640':0, '1f647-1f3fd-200d-2640':0, '1f647-1f3fe-200d-2640':0, '1f647-1f3ff-200d-2640':0, '1f647-1f3fb-200d-2642':0, '1f647-1f3fc-200d-2642':0, '1f647-1f3fd-200d-2642':0, '1f647-1f3fe-200d-2642':0, '1f647-1f3ff-200d-2642':0, '1f647-1f3fb':0, '1f647-1f3fc':0, '1f647-1f3fd':0, '1f647-1f3fe':0, '1f647-1f3ff':0, '1f64b-1f3fb-200d-2640':0, '1f64b-1f3fc-200d-2640':0, '1f64b-1f3fd-200d-2640':0, '1f64b-1f3fe-200d-2640':0, '1f64b-1f3ff-200d-2640':0, '1f64b-1f3fb-200d-2642':0, '1f64b-1f3fc-200d-2642':0, '1f64b-1f3fd-200d-2642':0, '1f64b-1f3fe-200d-2642':0, '1f64b-1f3ff-200d-2642':0, '1f64b-1f3fb':0, '1f64b-1f3fc':0, '1f64b-1f3fd':0, '1f64b-1f3fe':0, '1f64b-1f3ff':0, '1f64c-1f3fb':0, '1f64c-1f3fc':0, '1f64c-1f3fd':0, '1f64c-1f3fe':0, '1f64c-1f3ff':0, '1f64d-1f3fb-200d-2640':0, '1f64d-1f3fc-200d-2640':0, '1f64d-1f3fd-200d-2640':0, '1f64d-1f3fe-200d-2640':0, '1f64d-1f3ff-200d-2640':0, '1f64d-1f3fb-200d-2642':0, '1f64d-1f3fc-200d-2642':0, '1f64d-1f3fd-200d-2642':0, '1f64d-1f3fe-200d-2642':0, '1f64d-1f3ff-200d-2642':0, '1f64d-1f3fb':0, '1f64d-1f3fc':0, '1f64d-1f3fd':0, '1f64d-1f3fe':0, '1f64d-1f3ff':0, '1f64e-1f3fb-200d-2640':0, '1f64e-1f3fc-200d-2640':0, '1f64e-1f3fd-200d-2640':0, '1f64e-1f3fe-200d-2640':0, '1f64e-1f3ff-200d-2640':0, '1f64e-1f3fb-200d-2642':0, '1f64e-1f3fc-200d-2642':0, '1f64e-1f3fd-200d-2642':0, '1f64e-1f3fe-200d-2642':0, '1f64e-1f3ff-200d-2642':0, '1f64e-1f3fb':0, '1f64e-1f3fc':0, '1f64e-1f3fd':0, '1f64e-1f3fe':0, '1f64e-1f3ff':0, '1f64f-1f3fb':0, '1f64f-1f3fc':0, '1f64f-1f3fd':0, '1f64f-1f3fe':0, '1f64f-1f3ff':0, '1f6a3-1f3fb-200d-2640':0, '1f6a3-1f3fc-200d-2640':0, '1f6a3-1f3fd-200d-2640':0, '1f6a3-1f3fe-200d-2640':0, '1f6a3-1f3ff-200d-2640':0, '1f6a3-1f3fb-200d-2642':0, '1f6a3-1f3fc-200d-2642':0, '1f6a3-1f3fd-200d-2642':0, '1f6a3-1f3fe-200d-2642':0, '1f6a3-1f3ff-200d-2642':0, '1f6a3-1f3fb':0, '1f6a3-1f3fc':0, '1f6a3-1f3fd':0, '1f6a3-1f3fe':0, '1f6a3-1f3ff':0, '1f6b4-1f3fb-200d-2640':0, '1f6b4-1f3fc-200d-2640':0, '1f6b4-1f3fd-200d-2640':0, '1f6b4-1f3fe-200d-2640':0, '1f6b4-1f3ff-200d-2640':0, '1f6b4-1f3fb-200d-2642':0, '1f6b4-1f3fc-200d-2642':0, '1f6b4-1f3fd-200d-2642':0, '1f6b4-1f3fe-200d-2642':0, '1f6b4-1f3ff-200d-2642':0, '1f6b4-1f3fb':0, '1f6b4-1f3fc':0, '1f6b4-1f3fd':0, '1f6b4-1f3fe':0, '1f6b4-1f3ff':0, '1f6b5-1f3fb-200d-2640':0, '1f6b5-1f3fc-200d-2640':0, '1f6b5-1f3fd-200d-2640':0, '1f6b5-1f3fe-200d-2640':0, '1f6b5-1f3ff-200d-2640':0, '1f6b5-1f3fb-200d-2642':0, '1f6b5-1f3fc-200d-2642':0, '1f6b5-1f3fd-200d-2642':0, '1f6b5-1f3fe-200d-2642':0, '1f6b5-1f3ff-200d-2642':0, '1f6b5-1f3fb':0, '1f6b5-1f3fc':0, '1f6b5-1f3fd':0, '1f6b5-1f3fe':0, '1f6b5-1f3ff':0, '1f6b6-1f3fb-200d-2640':0, '1f6b6-1f3fc-200d-2640':0, '1f6b6-1f3fd-200d-2640':0, '1f6b6-1f3fe-200d-2640':0, '1f6b6-1f3ff-200d-2640':0, '1f6b6-1f3fb-200d-2642':0, '1f6b6-1f3fc-200d-2642':0, '1f6b6-1f3fd-200d-2642':0, '1f6b6-1f3fe-200d-2642':0, '1f6b6-1f3ff-200d-2642':0, '1f6b6-1f3fb':0, '1f6b6-1f3fc':0, '1f6b6-1f3fd':0, '1f6b6-1f3fe':0, '1f6b6-1f3ff':0, '1f6c0-1f3fb':0, '1f6c0-1f3fc':0, '1f6c0-1f3fd':0, '1f6c0-1f3fe':0, '1f6c0-1f3ff':0, '1f6cc-1f3fb':0, '1f6cc-1f3fc':0, '1f6cc-1f3fd':0, '1f6cc-1f3fe':0, '1f6cc-1f3ff':0, '1f90c-1f3fb':0, '1f90c-1f3fc':0, '1f90c-1f3fd':0, '1f90c-1f3fe':0, '1f90c-1f3ff':0, '1f90f-1f3fb':0, '1f90f-1f3fc':0, '1f90f-1f3fd':0, '1f90f-1f3fe':0, '1f90f-1f3ff':0, '1f918-1f3fb':0, '1f918-1f3fc':0, '1f918-1f3fd':0, '1f918-1f3fe':0, '1f918-1f3ff':0, '1f919-1f3fb':0, '1f919-1f3fc':0, '1f919-1f3fd':0, '1f919-1f3fe':0, '1f919-1f3ff':0, '1f91a-1f3fb':0, '1f91a-1f3fc':0, '1f91a-1f3fd':0, '1f91a-1f3fe':0, '1f91a-1f3ff':0, '1f91b-1f3fb':0, '1f91b-1f3fc':0, '1f91b-1f3fd':0, '1f91b-1f3fe':0, '1f91b-1f3ff':0, '1f91c-1f3fb':0, '1f91c-1f3fc':0, '1f91c-1f3fd':0, '1f91c-1f3fe':0, '1f91c-1f3ff':0, '1f91d-1f3fb':0, '1f91d-1f3fc':0, '1f91d-1f3fd':0, '1f91d-1f3fe':0, '1f91d-1f3ff':0, '1f91e-1f3fb':0, '1f91e-1f3fc':0, '1f91e-1f3fd':0, '1f91e-1f3fe':0, '1f91e-1f3ff':0, '1f91f-1f3fb':0, '1f91f-1f3fc':0, '1f91f-1f3fd':0, '1f91f-1f3fe':0, '1f91f-1f3ff':0, '1f926-1f3fb-200d-2640':0, '1f926-1f3fc-200d-2640':0, '1f926-1f3fd-200d-2640':0, '1f926-1f3fe-200d-2640':0, '1f926-1f3ff-200d-2640':0, '1f926-1f3fb-200d-2642':0, '1f926-1f3fc-200d-2642':0, '1f926-1f3fd-200d-2642':0, '1f926-1f3fe-200d-2642':0, '1f926-1f3ff-200d-2642':0, '1f926-1f3fb':0, '1f926-1f3fc':0, '1f926-1f3fd':0, '1f926-1f3fe':0, '1f926-1f3ff':0, '1f930-1f3fb':0, '1f930-1f3fc':0, '1f930-1f3fd':0, '1f930-1f3fe':0, '1f930-1f3ff':0, '1f931-1f3fb':0, '1f931-1f3fc':0, '1f931-1f3fd':0, '1f931-1f3fe':0, '1f931-1f3ff':0, '1f932-1f3fb':0, '1f932-1f3fc':0, '1f932-1f3fd':0, '1f932-1f3fe':0, '1f932-1f3ff':0, '1f933-1f3fb':0, '1f933-1f3fc':0, '1f933-1f3fd':0, '1f933-1f3fe':0, '1f933-1f3ff':0, '1f934-1f3fb':0, '1f934-1f3fc':0, '1f934-1f3fd':0, '1f934-1f3fe':0, '1f934-1f3ff':0, '1f935-1f3fb-200d-2640':0, '1f935-1f3fc-200d-2640':0, '1f935-1f3fd-200d-2640':0, '1f935-1f3fe-200d-2640':0, '1f935-1f3ff-200d-2640':0, '1f935-1f3fb-200d-2642':0, '1f935-1f3fc-200d-2642':0, '1f935-1f3fd-200d-2642':0, '1f935-1f3fe-200d-2642':0, '1f935-1f3ff-200d-2642':0, '1f935-1f3fb':0, '1f935-1f3fc':0, '1f935-1f3fd':0, '1f935-1f3fe':0, '1f935-1f3ff':0, '1f936-1f3fb':0, '1f936-1f3fc':0, '1f936-1f3fd':0, '1f936-1f3fe':0, '1f936-1f3ff':0, '1f937-1f3fb-200d-2640':0, '1f937-1f3fc-200d-2640':0, '1f937-1f3fd-200d-2640':0, '1f937-1f3fe-200d-2640':0, '1f937-1f3ff-200d-2640':0, '1f937-1f3fb-200d-2642':0, '1f937-1f3fc-200d-2642':0, '1f937-1f3fd-200d-2642':0, '1f937-1f3fe-200d-2642':0, '1f937-1f3ff-200d-2642':0, '1f937-1f3fb':0, '1f937-1f3fc':0, '1f937-1f3fd':0, '1f937-1f3fe':0, '1f937-1f3ff':0, '1f938-1f3fb-200d-2640':0, '1f938-1f3fc-200d-2640':0, '1f938-1f3fd-200d-2640':0, '1f938-1f3fe-200d-2640':0, '1f938-1f3ff-200d-2640':0, '1f938-1f3fb-200d-2642':0, '1f938-1f3fc-200d-2642':0, '1f938-1f3fd-200d-2642':0, '1f938-1f3fe-200d-2642':0, '1f938-1f3ff-200d-2642':0, '1f938-1f3fb':0, '1f938-1f3fc':0, '1f938-1f3fd':0, '1f938-1f3fe':0, '1f938-1f3ff':0, '1f939-1f3fb-200d-2640':0, '1f939-1f3fc-200d-2640':0, '1f939-1f3fd-200d-2640':0, '1f939-1f3fe-200d-2640':0, '1f939-1f3ff-200d-2640':0, '1f939-1f3fb-200d-2642':0, '1f939-1f3fc-200d-2642':0, '1f939-1f3fd-200d-2642':0, '1f939-1f3fe-200d-2642':0, '1f939-1f3ff-200d-2642':0, '1f939-1f3fb':0, '1f939-1f3fc':0, '1f939-1f3fd':0, '1f939-1f3fe':0, '1f939-1f3ff':0, '1f93d-1f3fb-200d-2640':0, '1f93d-1f3fc-200d-2640':0, '1f93d-1f3fd-200d-2640':0, '1f93d-1f3fe-200d-2640':0, '1f93d-1f3ff-200d-2640':0, '1f93d-1f3fb-200d-2642':0, '1f93d-1f3fc-200d-2642':0, '1f93d-1f3fd-200d-2642':0, '1f93d-1f3fe-200d-2642':0, '1f93d-1f3ff-200d-2642':0, '1f93d-1f3fb':0, '1f93d-1f3fc':0, '1f93d-1f3fd':0, '1f93d-1f3fe':0, '1f93d-1f3ff':0, '1f93e-1f3fb-200d-2640':0, '1f93e-1f3fc-200d-2640':0, '1f93e-1f3fd-200d-2640':0, '1f93e-1f3fe-200d-2640':0, '1f93e-1f3ff-200d-2640':0, '1f93e-1f3fb-200d-2642':0, '1f93e-1f3fc-200d-2642':0, '1f93e-1f3fd-200d-2642':0, '1f93e-1f3fe-200d-2642':0, '1f93e-1f3ff-200d-2642':0, '1f93e-1f3fb':0, '1f93e-1f3fc':0, '1f93e-1f3fd':0, '1f93e-1f3fe':0, '1f93e-1f3ff':0, '1f977-1f3fb':0, '1f977-1f3fc':0, '1f977-1f3fd':0, '1f977-1f3fe':0, '1f977-1f3ff':0, '1f9b5-1f3fb':0, '1f9b5-1f3fc':0, '1f9b5-1f3fd':0, '1f9b5-1f3fe':0, '1f9b5-1f3ff':0, '1f9b6-1f3fb':0, '1f9b6-1f3fc':0, '1f9b6-1f3fd':0, '1f9b6-1f3fe':0, '1f9b6-1f3ff':0, '1f9b8-1f3fb-200d-2640':0, '1f9b8-1f3fc-200d-2640':0, '1f9b8-1f3fd-200d-2640':0, '1f9b8-1f3fe-200d-2640':0, '1f9b8-1f3ff-200d-2640':0, '1f9b8-1f3fb-200d-2642':0, '1f9b8-1f3fc-200d-2642':0, '1f9b8-1f3fd-200d-2642':0, '1f9b8-1f3fe-200d-2642':0, '1f9b8-1f3ff-200d-2642':0, '1f9b8-1f3fb':0, '1f9b8-1f3fc':0, '1f9b8-1f3fd':0, '1f9b8-1f3fe':0, '1f9b8-1f3ff':0, '1f9b9-1f3fb-200d-2640':0, '1f9b9-1f3fc-200d-2640':0, '1f9b9-1f3fd-200d-2640':0, '1f9b9-1f3fe-200d-2640':0, '1f9b9-1f3ff-200d-2640':0, '1f9b9-1f3fb-200d-2642':0, '1f9b9-1f3fc-200d-2642':0, '1f9b9-1f3fd-200d-2642':0, '1f9b9-1f3fe-200d-2642':0, '1f9b9-1f3ff-200d-2642':0, '1f9b9-1f3fb':0, '1f9b9-1f3fc':0, '1f9b9-1f3fd':0, '1f9b9-1f3fe':0, '1f9b9-1f3ff':0, '1f9bb-1f3fb':0, '1f9bb-1f3fc':0, '1f9bb-1f3fd':0, '1f9bb-1f3fe':0, '1f9bb-1f3ff':0, '1f9cd-1f3fb-200d-2640':0, '1f9cd-1f3fc-200d-2640':0, '1f9cd-1f3fd-200d-2640':0, '1f9cd-1f3fe-200d-2640':0, '1f9cd-1f3ff-200d-2640':0, '1f9cd-1f3fb-200d-2642':0, '1f9cd-1f3fc-200d-2642':0, '1f9cd-1f3fd-200d-2642':0, '1f9cd-1f3fe-200d-2642':0, '1f9cd-1f3ff-200d-2642':0, '1f9cd-1f3fb':0, '1f9cd-1f3fc':0, '1f9cd-1f3fd':0, '1f9cd-1f3fe':0, '1f9cd-1f3ff':0, '1f9ce-1f3fb-200d-2640':0, '1f9ce-1f3fc-200d-2640':0, '1f9ce-1f3fd-200d-2640':0, '1f9ce-1f3fe-200d-2640':0, '1f9ce-1f3ff-200d-2640':0, '1f9ce-1f3fb-200d-2642':0, '1f9ce-1f3fc-200d-2642':0, '1f9ce-1f3fd-200d-2642':0, '1f9ce-1f3fe-200d-2642':0, '1f9ce-1f3ff-200d-2642':0, '1f9ce-1f3fb':0, '1f9ce-1f3fc':0, '1f9ce-1f3fd':0, '1f9ce-1f3fe':0, '1f9ce-1f3ff':0, '1f9cf-1f3fb-200d-2640':0, '1f9cf-1f3fc-200d-2640':0, '1f9cf-1f3fd-200d-2640':0, '1f9cf-1f3fe-200d-2640':0, '1f9cf-1f3ff-200d-2640':0, '1f9cf-1f3fb-200d-2642':0, '1f9cf-1f3fc-200d-2642':0, '1f9cf-1f3fd-200d-2642':0, '1f9cf-1f3fe-200d-2642':0, '1f9cf-1f3ff-200d-2642':0, '1f9cf-1f3fb':0, '1f9cf-1f3fc':0, '1f9cf-1f3fd':0, '1f9cf-1f3fe':0, '1f9cf-1f3ff':0, '1f9d1-1f3fb-200d-1f33e':0, '1f9d1-1f3fc-200d-1f33e':0, '1f9d1-1f3fd-200d-1f33e':0, '1f9d1-1f3fe-200d-1f33e':0, '1f9d1-1f3ff-200d-1f33e':0, '1f9d1-1f3fb-200d-1f373':0, '1f9d1-1f3fc-200d-1f373':0, '1f9d1-1f3fd-200d-1f373':0, '1f9d1-1f3fe-200d-1f373':0, '1f9d1-1f3ff-200d-1f373':0, '1f9d1-1f3fb-200d-1f37c':0, '1f9d1-1f3fc-200d-1f37c':0, '1f9d1-1f3fd-200d-1f37c':0, '1f9d1-1f3fe-200d-1f37c':0, '1f9d1-1f3ff-200d-1f37c':0, '1f9d1-1f3fb-200d-1f384':0, '1f9d1-1f3fc-200d-1f384':0, '1f9d1-1f3fd-200d-1f384':0, '1f9d1-1f3fe-200d-1f384':0, '1f9d1-1f3ff-200d-1f384':0, '1f9d1-1f3fb-200d-1f393':0, '1f9d1-1f3fc-200d-1f393':0, '1f9d1-1f3fd-200d-1f393':0, '1f9d1-1f3fe-200d-1f393':0, '1f9d1-1f3ff-200d-1f393':0, '1f9d1-1f3fb-200d-1f3a4':0, '1f9d1-1f3fc-200d-1f3a4':0, '1f9d1-1f3fd-200d-1f3a4':0, '1f9d1-1f3fe-200d-1f3a4':0, '1f9d1-1f3ff-200d-1f3a4':0, '1f9d1-1f3fb-200d-1f3a8':0, '1f9d1-1f3fc-200d-1f3a8':0, '1f9d1-1f3fd-200d-1f3a8':0, '1f9d1-1f3fe-200d-1f3a8':0, '1f9d1-1f3ff-200d-1f3a8':0, '1f9d1-1f3fb-200d-1f3eb':0, '1f9d1-1f3fc-200d-1f3eb':0, '1f9d1-1f3fd-200d-1f3eb':0, '1f9d1-1f3fe-200d-1f3eb':0, '1f9d1-1f3ff-200d-1f3eb':0, '1f9d1-1f3fb-200d-1f3ed':0, '1f9d1-1f3fc-200d-1f3ed':0, '1f9d1-1f3fd-200d-1f3ed':0, '1f9d1-1f3fe-200d-1f3ed':0, '1f9d1-1f3ff-200d-1f3ed':0, '1f9d1-1f3fb-200d-1f4bb':0, '1f9d1-1f3fc-200d-1f4bb':0, '1f9d1-1f3fd-200d-1f4bb':0, '1f9d1-1f3fe-200d-1f4bb':0, '1f9d1-1f3ff-200d-1f4bb':0, '1f9d1-1f3fb-200d-1f4bc':0, '1f9d1-1f3fc-200d-1f4bc':0, '1f9d1-1f3fd-200d-1f4bc':0, '1f9d1-1f3fe-200d-1f4bc':0, '1f9d1-1f3ff-200d-1f4bc':0, '1f9d1-1f3fb-200d-1f527':0, '1f9d1-1f3fc-200d-1f527':0, '1f9d1-1f3fd-200d-1f527':0, '1f9d1-1f3fe-200d-1f527':0, '1f9d1-1f3ff-200d-1f527':0, '1f9d1-1f3fb-200d-1f52c':0, '1f9d1-1f3fc-200d-1f52c':0, '1f9d1-1f3fd-200d-1f52c':0, '1f9d1-1f3fe-200d-1f52c':0, '1f9d1-1f3ff-200d-1f52c':0, '1f9d1-1f3fb-200d-1f680':0, '1f9d1-1f3fc-200d-1f680':0, '1f9d1-1f3fd-200d-1f680':0, '1f9d1-1f3fe-200d-1f680':0, '1f9d1-1f3ff-200d-1f680':0, '1f9d1-1f3fb-200d-1f692':0, '1f9d1-1f3fc-200d-1f692':0, '1f9d1-1f3fd-200d-1f692':0, '1f9d1-1f3fe-200d-1f692':0, '1f9d1-1f3ff-200d-1f692':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fb-200d-1f9af':0, '1f9d1-1f3fc-200d-1f9af':0, '1f9d1-1f3fd-200d-1f9af':0, '1f9d1-1f3fe-200d-1f9af':0, '1f9d1-1f3ff-200d-1f9af':0, '1f9d1-1f3fb-200d-1f9b0':0, '1f9d1-1f3fc-200d-1f9b0':0, '1f9d1-1f3fd-200d-1f9b0':0, '1f9d1-1f3fe-200d-1f9b0':0, '1f9d1-1f3ff-200d-1f9b0':0, '1f9d1-1f3fb-200d-1f9b1':0, '1f9d1-1f3fc-200d-1f9b1':0, '1f9d1-1f3fd-200d-1f9b1':0, '1f9d1-1f3fe-200d-1f9b1':0, '1f9d1-1f3ff-200d-1f9b1':0, '1f9d1-1f3fb-200d-1f9b2':0, '1f9d1-1f3fc-200d-1f9b2':0, '1f9d1-1f3fd-200d-1f9b2':0, '1f9d1-1f3fe-200d-1f9b2':0, '1f9d1-1f3ff-200d-1f9b2':0, '1f9d1-1f3fb-200d-1f9b3':0, '1f9d1-1f3fc-200d-1f9b3':0, '1f9d1-1f3fd-200d-1f9b3':0, '1f9d1-1f3fe-200d-1f9b3':0, '1f9d1-1f3ff-200d-1f9b3':0, '1f9d1-1f3fb-200d-1f9bc':0, '1f9d1-1f3fc-200d-1f9bc':0, '1f9d1-1f3fd-200d-1f9bc':0, '1f9d1-1f3fe-200d-1f9bc':0, '1f9d1-1f3ff-200d-1f9bc':0, '1f9d1-1f3fb-200d-1f9bd':0, '1f9d1-1f3fc-200d-1f9bd':0, '1f9d1-1f3fd-200d-1f9bd':0, '1f9d1-1f3fe-200d-1f9bd':0, '1f9d1-1f3ff-200d-1f9bd':0, '1f9d1-1f3fb-200d-2695':0, '1f9d1-1f3fc-200d-2695':0, '1f9d1-1f3fd-200d-2695':0, '1f9d1-1f3fe-200d-2695':0, '1f9d1-1f3ff-200d-2695':0, '1f9d1-1f3fb-200d-2696':0, '1f9d1-1f3fc-200d-2696':0, '1f9d1-1f3fd-200d-2696':0, '1f9d1-1f3fe-200d-2696':0, '1f9d1-1f3ff-200d-2696':0, '1f9d1-1f3fb-200d-2708':0, '1f9d1-1f3fc-200d-2708':0, '1f9d1-1f3fd-200d-2708':0, '1f9d1-1f3fe-200d-2708':0, '1f9d1-1f3ff-200d-2708':0, '1f9d1-1f3fb':0, '1f9d1-1f3fc':0, '1f9d1-1f3fd':0, '1f9d1-1f3fe':0, '1f9d1-1f3ff':0, '1f9d2-1f3fb':0, '1f9d2-1f3fc':0, '1f9d2-1f3fd':0, '1f9d2-1f3fe':0, '1f9d2-1f3ff':0, '1f9d3-1f3fb':0, '1f9d3-1f3fc':0, '1f9d3-1f3fd':0, '1f9d3-1f3fe':0, '1f9d3-1f3ff':0, '1f9d4-1f3fb-200d-2640':0, '1f9d4-1f3fc-200d-2640':0, '1f9d4-1f3fd-200d-2640':0, '1f9d4-1f3fe-200d-2640':0, '1f9d4-1f3ff-200d-2640':0, '1f9d4-1f3fb-200d-2642':0, '1f9d4-1f3fc-200d-2642':0, '1f9d4-1f3fd-200d-2642':0, '1f9d4-1f3fe-200d-2642':0, '1f9d4-1f3ff-200d-2642':0, '1f9d4-1f3fb':0, '1f9d4-1f3fc':0, '1f9d4-1f3fd':0, '1f9d4-1f3fe':0, '1f9d4-1f3ff':0, '1f9d5-1f3fb':0, '1f9d5-1f3fc':0, '1f9d5-1f3fd':0, '1f9d5-1f3fe':0, '1f9d5-1f3ff':0, '1f9d6-1f3fb-200d-2640':0, '1f9d6-1f3fc-200d-2640':0, '1f9d6-1f3fd-200d-2640':0, '1f9d6-1f3fe-200d-2640':0, '1f9d6-1f3ff-200d-2640':0, '1f9d6-1f3fb-200d-2642':0, '1f9d6-1f3fc-200d-2642':0, '1f9d6-1f3fd-200d-2642':0, '1f9d6-1f3fe-200d-2642':0, '1f9d6-1f3ff-200d-2642':0, '1f9d6-1f3fb':0, '1f9d6-1f3fc':0, '1f9d6-1f3fd':0, '1f9d6-1f3fe':0, '1f9d6-1f3ff':0, '1f9d7-1f3fb-200d-2640':0, '1f9d7-1f3fc-200d-2640':0, '1f9d7-1f3fd-200d-2640':0, '1f9d7-1f3fe-200d-2640':0, '1f9d7-1f3ff-200d-2640':0, '1f9d7-1f3fb-200d-2642':0, '1f9d7-1f3fc-200d-2642':0, '1f9d7-1f3fd-200d-2642':0, '1f9d7-1f3fe-200d-2642':0, '1f9d7-1f3ff-200d-2642':0, '1f9d7-1f3fb':0, '1f9d7-1f3fc':0, '1f9d7-1f3fd':0, '1f9d7-1f3fe':0, '1f9d7-1f3ff':0, '1f9d8-1f3fb-200d-2640':0, '1f9d8-1f3fc-200d-2640':0, '1f9d8-1f3fd-200d-2640':0, '1f9d8-1f3fe-200d-2640':0, '1f9d8-1f3ff-200d-2640':0, '1f9d8-1f3fb-200d-2642':0, '1f9d8-1f3fc-200d-2642':0, '1f9d8-1f3fd-200d-2642':0, '1f9d8-1f3fe-200d-2642':0, '1f9d8-1f3ff-200d-2642':0, '1f9d8-1f3fb':0, '1f9d8-1f3fc':0, '1f9d8-1f3fd':0, '1f9d8-1f3fe':0, '1f9d8-1f3ff':0, '1f9d9-1f3fb-200d-2640':0, '1f9d9-1f3fc-200d-2640':0, '1f9d9-1f3fd-200d-2640':0, '1f9d9-1f3fe-200d-2640':0, '1f9d9-1f3ff-200d-2640':0, '1f9d9-1f3fb-200d-2642':0, '1f9d9-1f3fc-200d-2642':0, '1f9d9-1f3fd-200d-2642':0, '1f9d9-1f3fe-200d-2642':0, '1f9d9-1f3ff-200d-2642':0, '1f9d9-1f3fb':0, '1f9d9-1f3fc':0, '1f9d9-1f3fd':0, '1f9d9-1f3fe':0, '1f9d9-1f3ff':0, '1f9da-1f3fb-200d-2640':0, '1f9da-1f3fc-200d-2640':0, '1f9da-1f3fd-200d-2640':0, '1f9da-1f3fe-200d-2640':0, '1f9da-1f3ff-200d-2640':0, '1f9da-1f3fb-200d-2642':0, '1f9da-1f3fc-200d-2642':0, '1f9da-1f3fd-200d-2642':0, '1f9da-1f3fe-200d-2642':0, '1f9da-1f3ff-200d-2642':0, '1f9da-1f3fb':0, '1f9da-1f3fc':0, '1f9da-1f3fd':0, '1f9da-1f3fe':0, '1f9da-1f3ff':0, '1f9db-1f3fb-200d-2640':0, '1f9db-1f3fc-200d-2640':0, '1f9db-1f3fd-200d-2640':0, '1f9db-1f3fe-200d-2640':0, '1f9db-1f3ff-200d-2640':0, '1f9db-1f3fb-200d-2642':0, '1f9db-1f3fc-200d-2642':0, '1f9db-1f3fd-200d-2642':0, '1f9db-1f3fe-200d-2642':0, '1f9db-1f3ff-200d-2642':0, '1f9db-1f3fb':0, '1f9db-1f3fc':0, '1f9db-1f3fd':0, '1f9db-1f3fe':0, '1f9db-1f3ff':0, '1f9dc-1f3fb-200d-2640':0, '1f9dc-1f3fc-200d-2640':0, '1f9dc-1f3fd-200d-2640':0, '1f9dc-1f3fe-200d-2640':0, '1f9dc-1f3ff-200d-2640':0, '1f9dc-1f3fb-200d-2642':0, '1f9dc-1f3fc-200d-2642':0, '1f9dc-1f3fd-200d-2642':0, '1f9dc-1f3fe-200d-2642':0, '1f9dc-1f3ff-200d-2642':0, '1f9dc-1f3fb':0, '1f9dc-1f3fc':0, '1f9dc-1f3fd':0, '1f9dc-1f3fe':0, '1f9dc-1f3ff':0, '1f9dd-1f3fb-200d-2640':0, '1f9dd-1f3fc-200d-2640':0, '1f9dd-1f3fd-200d-2640':0, '1f9dd-1f3fe-200d-2640':0, '1f9dd-1f3ff-200d-2640':0, '1f9dd-1f3fb-200d-2642':0, '1f9dd-1f3fc-200d-2642':0, '1f9dd-1f3fd-200d-2642':0, '1f9dd-1f3fe-200d-2642':0, '1f9dd-1f3ff-200d-2642':0, '1f9dd-1f3fb':0, '1f9dd-1f3fc':0, '1f9dd-1f3fd':0, '1f9dd-1f3fe':0, '1f9dd-1f3ff':0, '261d-1f3fb':0, '261d-1f3fc':0, '261d-1f3fd':0, '261d-1f3fe':0, '261d-1f3ff':0, '26f9-1f3fb-200d-2640':0, '26f9-1f3fc-200d-2640':0, '26f9-1f3fd-200d-2640':0, '26f9-1f3fe-200d-2640':0, '26f9-1f3ff-200d-2640':0, '26f9-1f3fb-200d-2642':0, '26f9-1f3fc-200d-2642':0, '26f9-1f3fd-200d-2642':0, '26f9-1f3fe-200d-2642':0, '26f9-1f3ff-200d-2642':0, '26f9-1f3fb':0, '26f9-1f3fc':0, '26f9-1f3fd':0, '26f9-1f3fe':0, '26f9-1f3ff':0, '270a-1f3fb':0, '270a-1f3fc':0, '270a-1f3fd':0, '270a-1f3fe':0, '270a-1f3ff':0, '270b-1f3fb':0, '270b-1f3fc':0, '270b-1f3fd':0, '270b-1f3fe':0, '270b-1f3ff':0, '270c-1f3fb':0, '270c-1f3fc':0, '270c-1f3fd':0, '270c-1f3fe':0, '270c-1f3ff':0, '270d-1f3fb':0, '270d-1f3fc':0, '270d-1f3fd':0, '270d-1f3fe':0, '270d-1f3ff':0}};\n\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\nfor(const version in EmojiVersions) {\n if(version) {\n Object.assign(Emoji, EmojiVersions[version as EMOJI_VERSION]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport const FontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif';\nexport const FontSize = '16px';\nexport const FontWeight = '400';\n","const IS_IMAGE_BITMAP_SUPPORTED = typeof(ImageBitmap) !== 'undefined';\n\nexport default IS_IMAGE_BITMAP_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's animation.ts\n\nimport {fastRaf} from './schedulers';\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n deferred: CancellablePromise\n}\n\ntype AnimationInstanceKey = any;\nconst instances: Map = new Map();\n\nexport function createAnimationInstance(key: AnimationInstanceKey) {\n cancelAnimationByKey(key);\n\n const instance: AnimationInstance = {\n isCancelled: false,\n deferred: deferredPromise()\n };\n\n instances.set(key, instance);\n instance.deferred.then(() => {\n if(getAnimationInstance(key) === instance) {\n instances.delete(key);\n }\n });\n\n return instance;\n}\n\nexport function getAnimationInstance(key: AnimationInstanceKey) {\n return instances.get(key);\n}\n\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\n const instance = getAnimationInstance(key);\n if(instance) {\n instance.isCancelled = true;\n instance.deferred.resolve();\n }\n}\n\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\n if(!instance) {\n instance = createAnimationInstance(key);\n }\n\n fastRaf(() => {\n if(instance.isCancelled) {\n return;\n }\n\n if(tick()) {\n animateSingle(tick, key, instance);\n } else {\n instance.deferred.resolve();\n }\n });\n\n return instance.deferred;\n}\n\nexport function animate(tick: Function) {\n fastRaf(() => {\n if(tick()) {\n animate(tick);\n }\n });\n}\n","type K = boolean;\nexport default async function filterAsync(arr: T[], callback: (item: T, idx: number, arr: T[]) => Promise | K) {\n const promises = arr.map(async(item, idx, arr) => {\n if(await callback(item, idx, arr)) {\n return item;\n }\n });\n\n return (await Promise.all(promises)).filter(Boolean);\n}\n","export default function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\n const out: typeof array = [];\n let idx = -1;\n while((idx = array.findIndex(verify)) !== -1) {\n out.push(array.splice(idx, 1)[0]);\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst ASSETS_PATH = 'assets/audio/';\n\nexport default class AudioAssetPlayer {\n private audio: HTMLAudioElement;\n private tempId: number;\n private assetName: AssetName;\n\n constructor(private assets: AssetName[]) {\n this.tempId = 0;\n }\n\n public playSound(name: AssetName, loop = false) {\n ++this.tempId;\n this.assetName = name;\n\n try {\n const audio = this.createAudio();\n audio.autoplay = true;\n audio.src = ASSETS_PATH + name;\n audio.loop = loop;\n audio.play();\n } catch(e) {\n console.error('playSound', name, e);\n }\n }\n\n public playSoundIfDifferent(name: AssetName, loop?: boolean) {\n if(this.assetName !== name) {\n this.playSound(name, loop);\n }\n }\n\n public createAudio() {\n let {audio} = this;\n if(audio) {\n return audio;\n }\n\n audio = this.audio = new Audio();\n audio.play();\n return audio;\n }\n\n public stopSound() {\n if(!this.audio) {\n return;\n }\n\n this.audio.pause();\n }\n\n public cancelDelayedPlay() {\n ++this.tempId;\n }\n\n public playSoundWithTimeout(name: AssetName, loop: boolean, timeout: number) {\n // timeout = 0;\n const tempId = ++this.tempId;\n setTimeout(() => {\n if(this.tempId !== tempId) {\n return;\n }\n\n this.playSound(name, loop);\n }, timeout);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsDataURL(blob: Blob) {\n return readBlobAs(blob, 'readAsDataURL');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport {fastRaf} from './schedulers';\nimport {ArgumentTypes} from '../types';\n\ntype HeavyQueue> = {\n items: ArgumentTypes[],\n process: (...args: any[]) => ReturnType,\n context: any,\n promise?: CancellablePromise[]>\n};\nconst heavyQueue: HeavyQueue[] = [];\nlet processingQueue = false;\n\nexport default function addHeavyTask>(queue: T, method: 'push' | 'unshift' = 'push') {\n if(!queue.items.length) {\n return Promise.resolve([]) as typeof promise;\n }\n\n const promise = queue.promise = deferredPromise();\n heavyQueue[method](queue);\n processHeavyQueue();\n\n return promise;\n}\n\nfunction processHeavyQueue() {\n if(!processingQueue) {\n const queue = heavyQueue.shift();\n timedChunk(queue).finally(() => {\n processingQueue = false;\n if(heavyQueue.length) {\n processHeavyQueue();\n }\n });\n }\n}\n\nfunction timedChunk>(queue: HeavyQueue) {\n if(!queue.items.length) {\n queue.promise.resolve([] as any);\n return Promise.resolve([]);\n }\n\n const todo = queue.items.slice();\n const results: ReturnType[] = [];\n\n return new Promise((resolve, reject) => {\n const f = async() => {\n const start = performance.now();\n\n do {\n await getHeavyAnimationPromise();\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\n let realResult: typeof results[0];\n // @ts-ignore\n if(possiblePromise instanceof Promise) {\n try {\n realResult = await possiblePromise;\n } catch(err) {\n reject(err);\n return;\n }\n } else {\n realResult = possiblePromise;\n }\n\n results.push(realResult);\n } while(todo.length > 0 && (performance.now() - start) < 6);\n\n if(todo.length > 0) {\n fastRaf(f);\n // setTimeout(f, 25);\n } else {\n resolve(results);\n }\n };\n\n fastRaf(f);\n // setTimeout(f, 25);\n }).then(queue.promise.resolve, queue.promise.reject);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type fastBlur from '../vendor/fastBlur';\nimport addHeavyTask from './heavyQueue';\nimport IS_CANVAS_FILTER_SUPPORTED from '../environment/canvasFilterSupport';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nlet requireBlurPromise: Promise;\nlet fastBlurFunc: typeof fastBlur;\nif(!IS_CANVAS_FILTER_SUPPORTED) {\n requireBlurPromise = import('../vendor/fastBlur').then((m) => {\n fastBlurFunc = m.default;\n });\n} else {\n requireBlurPromise = Promise.resolve();\n}\n\nfunction processBlurNext(\n img: HTMLImageElement,\n radius: number,\n iterations: number,\n canvas: HTMLCanvasElement = document.createElement('canvas')\n) {\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d', {alpha: false});\n if(IS_CANVAS_FILTER_SUPPORTED) {\n ctx.filter = `blur(${radius}px)`;\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\n } else {\n ctx.drawImage(img, 0, 0);\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\n }\n\n return canvas;\n}\n\ntype CacheValue = {canvas: HTMLCanvasElement, promise: Promise};\nconst cache: Map = new Map();\nconst CACHE_SIZE = 150;\n\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\n if(!dataUri) {\n throw 'no dataUri for blur: ' + dataUri;\n }\n\n if(cache.size > CACHE_SIZE) {\n cache.clear();\n }\n\n const canvas = document.createElement('canvas');\n canvas.className = 'canvas-thumbnail';\n\n let cached = cache.get(dataUri);\n if(!cached) {\n const promise: CacheValue['promise'] = new Promise((resolve) => {\n // return resolve(dataUri);\n requireBlurPromise.then(() => {\n const img = new Image();\n img.onload = () => {\n // if(IS_CANVAS_FILTER_SUPPORTED) {\n // resolve(processBlurNext(img, radius, iterations));\n // } else {\n const promise = addHeavyTask({\n items: [[img, radius, iterations, canvas]],\n context: null,\n process: processBlurNext\n }, 'unshift');\n\n promise.then(() => {\n resolve();\n });\n // }\n };\n img.src = dataUri;\n });\n });\n\n cache.set(dataUri, cached = {\n canvas,\n promise\n });\n } else {\n canvas.width = cached.canvas.width;\n canvas.height = cached.canvas.height;\n cached.promise.then(() => {\n canvas.getContext('2d').drawImage(cached.canvas, 0, 0, canvas.width, canvas.height);\n });\n }\n\n return {\n ...cached,\n canvas\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport bytesFromHex from './bytesFromHex';\nimport bytesToDataURL from './bytesToDataURL';\nimport convertToUint8Array from './convertToUint8Array';\n\nconst JPEG_HEADER_HEX = 'ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00';\n\nconst JPEG_HEADER = bytesFromHex(JPEG_HEADER_HEX);\nconst JPEG_TAIL = bytesFromHex('ffd9');\n\nexport function getPreviewBytesFromURL(url: string) {\n const needle = 'base64,';\n const sliced = url.slice(url.indexOf(needle) + needle.length);\n const jpegBytes = [...atob(sliced)].map((char) => char.charCodeAt(0));\n\n return new Uint8Array(jpegBytes);\n // console.log('getPreviewBytesFromURL', bytesToHex(jpegBytes));\n\n // const n = JPEG_HEADER_HEX.slice(-10);\n // const one = jpegBytes[164];\n // const two = jpegBytes[166];\n\n // const body = jpegBytes.slice(bytesToHex(jpegBytes).indexOf(n) / 2 + n.length / 2/* JPEG_HEADER.length */, jpegBytes.length - JPEG_TAIL.length);\n // const original = new Uint8Array([\n // 0xFF,\n // one,\n // two,\n // ...body\n // ]);\n\n // console.log(bytesToHex(body));\n\n // return original;\n}\n\nexport default function getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker && bytes[0] === 0x1) {\n arr = new Uint8Array(JPEG_HEADER.concat(Array.from(bytes.slice(3)), JPEG_TAIL));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = convertToUint8Array(bytes);\n }\n\n let mimeType: string;\n if(isSticker) {\n mimeType = IS_SAFARI ? 'image/png' : 'image/webp';\n } else {\n mimeType = 'image/jpeg';\n }\n\n const dataURL = bytesToDataURL(arr, mimeType);\n return dataURL;\n}\n","export default function bytesToDataURL(bytes: Uint8Array, mimeType: string = 'image/jpeg') {\n return `data:${mimeType};base64,${btoa(String.fromCharCode(...bytes))}`;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {makeMediaSize} from './mediaSize';\n\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\n if(imageW < boxW && imageH < boxH && noZoom) {\n return makeMediaSize(imageW, imageH);\n }\n\n let boxedImageW = boxW;\n let boxedImageH = boxH;\n\n if((imageW / imageH) > (boxW / boxH)) {\n boxedImageH = (imageH * boxW / imageW) | 0;\n } else {\n boxedImageW = (imageW * boxH / imageH) | 0;\n if(boxedImageW > boxW) {\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\n boxedImageW = boxW;\n }\n }\n\n // if (Config.Navigator.retina) {\n // imageW = Math.floor(imageW / 2)\n // imageH = Math.floor(imageH / 2)\n // }\n\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\n boxedImageW = imageW;\n boxedImageH = imageH;\n }\n\n return makeMediaSize(boxedImageW, boxedImageH);\n}\n\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { MOUNT_CLASS_TO } from \"../../config/debug\";\n\nlet context: CanvasRenderingContext2D;\n/**\n * Get the text width\n * @param {string} text\n * @param {string} font\n */\nexport default function getTextWidth(text: string, font: string) {\n // const perf = performance.now();\n if(!context) {\n const canvas = document.createElement('canvas');\n context = canvas.getContext('2d', {alpha: false});\n }\n\n if(context.font !== font) {\n context.font = font;\n }\n\n // context.font = font;\n const metrics = context.measureText(text);\n // console.log('getTextWidth perf:', performance.now() - perf);\n return metrics.width;\n // return Math.round(metrics.width);\n}\n\n// MOUNT_CLASS_TO && (MOUNT_CLASS_TO.getTextWidth = getTextWidth);\n","import type {MediaSize} from '../mediaSize';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\n\nexport default function scaleMediaElement(options: T): Promise {\n return new Promise(async(resolve) => {\n const canvas = document.createElement('canvas');\n const size = options.size ?? options.mediaSize.aspectFitted(options.boxSize);\n const dpr = window.devicePixelRatio && 1;\n canvas.width = size.width * dpr;\n canvas.height = size.height * dpr;\n const ctx = canvas.getContext('2d');\n\n let source: CanvasImageSource;\n if(IS_IMAGE_BITMAP_SUPPORTED) {\n source = await createImageBitmap(options.media, {resizeWidth: size.width, resizeHeight: size.height});\n } else {\n source = options.media;\n }\n\n ctx.drawImage(source, 0, 0, canvas.width, canvas.height);\n\n if(IS_IMAGE_BITMAP_SUPPORTED) {\n (source as ImageBitmap)?.close();\n }\n\n const mimeType = options.mimeType ?? 'image/jpeg';\n const quality = options.quality ?? 1;\n if(options.toDataURL) {\n const url = canvas.toDataURL(mimeType, quality);\n resolve({url, size} as any);\n } else {\n canvas.toBlob((blob) => {\n resolve({blob, size} as any);\n }, mimeType, quality);\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LatinizeMap from '../config/latinizeMap';\n\nexport const badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nconst C2L: {[k: string]: string} = {\n 'й': 'q',\n 'ц': 'w',\n 'у': 'e',\n 'к': 'r',\n 'е': 't',\n 'н': 'y',\n 'г': 'u',\n 'ш': 'i',\n 'щ': 'o',\n 'з': 'p',\n 'х': '[',\n 'ъ': ']',\n 'ф': 'a',\n 'ы': 's',\n 'в': 'd',\n 'а': 'f',\n 'п': 'g',\n 'р': 'h',\n 'о': 'j',\n 'л': 'k',\n 'д': 'l',\n 'ж': ';',\n 'э': '\\'',\n 'я': 'z',\n 'ч': 'x',\n 'с': 'c',\n 'м': 'v',\n 'и': 'b',\n 'т': 'n',\n 'ь': 'm',\n 'б': ',',\n 'ю': '.',\n '.': '/'\n};\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function fixCyrillic(text: string) {\n return text.toLowerCase().replace(/[\\wа-я]/g, (ch) => {\n const latinizeCh = C2L[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = LatinizeMap[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n return processSearchText(text, {\n clearBadChars: true,\n latinize,\n ignoreCase: true\n });\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n const originalText = text;\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n if(options.latinize) text += '\\x01' + fixCyrillic(originalText);\n return text;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// https://stackoverflow.com/a/30810322\nfunction fallbackCopyTextToClipboard(text: string) {\n var textArea = document.createElement('textarea');\n textArea.value = text;\n\n // Avoid scrolling to bottom\n textArea.style.top = '0';\n textArea.style.left = '0';\n textArea.style.position = 'fixed';\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n try {\n document.execCommand('copy');\n // const successful = document.execCommand('copy');\n // const msg = successful ? 'successful' : 'unsuccessful';\n // console.log('Fallback: Copying text command was ' + msg);\n } catch(err) {\n // console.error('Fallback: Oops, unable to copy', err);\n }\n\n document.body.removeChild(textArea);\n}\n\nexport function copyTextToClipboard(text: string) {\n if(!navigator.clipboard) {\n fallbackCopyTextToClipboard(text);\n return;\n }\n\n navigator.clipboard.writeText(text).catch((err) => {\n console.error('clipboard error', err);\n fallbackCopyTextToClipboard(text);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport mediaSizes from './mediaSizes';\nimport OverlayClickHandler from './overlayClickHandler';\n\nclass ContextMenuController extends OverlayClickHandler {\n constructor() {\n super('menu', true);\n\n mediaSizes.addEventListener('resize', () => {\n if(this.element) {\n this.close();\n }\n\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\n const rect = openedMenu.getBoundingClientRect();\n const {innerWidth, innerHeight} = window;\n\n console.log(innerWidth, innerHeight, rect);\n } */\n });\n }\n\n public isOpened() {\n return !!this.element;\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const rect = this.element.getBoundingClientRect();\n const {clientX, clientY} = e;\n\n const diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\n const diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\n\n if(diffX >= 100 || diffY >= 100) {\n this.close();\n // openedMenu.parentElement.click();\n }\n // console.log('mousemove', diffX, diffY);\n };\n\n public close() {\n if(this.element) {\n this.element.classList.remove('active');\n this.element.parentElement.classList.remove('menu-open');\n }\n\n super.close();\n\n if(!IS_TOUCH_SUPPORTED) {\n window.removeEventListener('mousemove', this.onMouseMove);\n }\n }\n\n public openBtnMenu(element: HTMLElement, onClose?: () => void) {\n super.open(element);\n\n this.element.classList.add('active', 'was-open');\n this.element.parentElement.classList.add('menu-open');\n\n if(onClose) {\n this.addEventListener('toggle', onClose, {once: true});\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n window.addEventListener('mousemove', this.onMouseMove);\n }\n }\n}\n\nconst contextMenuController = new ContextMenuController();\nexport default contextMenuController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport I18n, {i18n} from '../lib/langPack';\n\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const ONE_DAY = 86400;\n\n// https://stackoverflow.com/a/6117889\nexport const getWeekNumber = (date: Date) => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\n};\n\nexport function formatDateAccordingToTodayNew(time: Date) {\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n const options: Intl.DateTimeFormatOptions = {};\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\n options.hour = options.minute = '2-digit';\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\n options.year = options.day = 'numeric';\n options.month = '2-digit';\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\n options.weekday = 'short';\n } else { // same year\n options.month = 'short';\n options.day = 'numeric';\n }\n\n return new I18n.IntlDateElement({\n date: time,\n options\n }).element;\n}\n\nexport function formatFullSentTimeRaw(timestamp: number, options: {\n capitalize?: boolean\n} = {}) {\n const date = new Date();\n const time = new Date(timestamp * 1000);\n const now = date.getTime() / 1000;\n\n const timeEl = formatTime(time);\n\n let dateEl: Node | string;\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\n\n if(options.capitalize) {\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\n }\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\n } else {\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\n }\n\n return {dateEl, timeEl};\n}\n\nexport function formatFullSentTime(timestamp: number) {\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\n capitalize: true\n });\n\n const fragment = document.createDocumentFragment();\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\n return fragment;\n}\n\nexport function formatTime(date: Date) {\n return new I18n.IntlDateElement({\n date,\n options: {\n hour: '2-digit',\n minute: '2-digit'\n }\n }).element;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\n\nexport const getFullDate = (date: Date, options: Partial<{\n noTime: true,\n noSeconds: true,\n monthAsNumber: true,\n leadingZero: true\n}> = {}) => {\n const joiner = options.monthAsNumber ? '.' : ' ';\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\n\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\n joiner + date.getFullYear() +\n (options.noTime ? '' : ', ' + time);\n};\n\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\nconst minYear = 2013;\nconst yearPattern = new RegExp('20[0-9]{1,2}');\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nexport type DateData = {\n title: string,\n minDate: number,\n maxDate: number,\n};\nexport function fillTipDates(query: string, dates: DateData[]) {\n const q = query.trim().toLowerCase();\n\n if(q.length < 3) {\n return;\n }\n\n if('today'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: 'Today',\n minDate,\n maxDate\n });\n return;\n }\n\n if('yesterday'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime() - 86400000;\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 86400001;\n dates.push({\n title: 'Yesterday',\n minDate,\n maxDate\n });\n return;\n }\n\n const dayOfWeek = getDayOfWeek(q);\n if(dayOfWeek >= 0) {\n const date = new Date();\n const now = date.getTime();\n const currentDay = date.getDay();\n const distance = dayOfWeek - currentDay;\n date.setDate(date.getDate() + distance);\n if(date.getTime() > now) {\n date.setTime(date.getTime() - 604800000);\n }\n const year = date.getFullYear()\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatWeekLong(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n let matches: any[];\n if((matches = shortDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const k = parseInt(g1);\n const k1 = parseInt(g2);\n if(k > 0 && k <= 31) {\n if(k1 >= minYear && k <= 12) {\n const selectedYear = k1;\n const month = k - 1;\n createForMonthYear(dates, month, selectedYear);\n return;\n } else if(k1 <= 12) {\n const day = k - 1;\n const month = k1 - 1;\n createForDayMonth(dates, day, month);\n }\n } else if(k >= minYear && k1 <= 12) {\n const selectedYear = k;\n const month = k1 - 1;\n createForMonthYear(dates, month, selectedYear);\n }\n\n return;\n }\n\n if((matches = longDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const g3 = matches[5];\n if(!matches[2] === matches[4]) {\n return;\n }\n\n const day = parseInt(g1);\n const month = parseInt(g2) - 1;\n let year = parseInt(g3);\n if(year >= 10 && year <= 99) {\n year += 2000;\n }\n\n const currentYear = new Date().getFullYear();\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\n const date = new Date();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n return;\n }\n\n if((matches = yearPattern.exec(q)) !== null) {\n let selectedYear = +q;\n const currentYear = new Date().getFullYear();\n if(selectedYear < minYear) {\n selectedYear = minYear;\n for(let i = currentYear; i >= selectedYear; i--) {\n const date = new Date();\n date.setFullYear(i, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(i + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + i,\n minDate,\n maxDate\n });\n }\n } else if(selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(selectedYear + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + selectedYear,\n minDate,\n maxDate\n });\n }\n\n return;\n }\n\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g1);\n if(month >= 0) {\n const k = +g2;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n return;\n }\n }\n }\n\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g2);\n if(month >= 0) {\n const k = +g1;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n }\n }\n }\n}\n\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n if(selectedYear >= minYear && selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, month, 1);\n date.setHours(0, 0, 0);\n const minDate = date.getTime();\n if(minDate > today) {\n return;\n }\n date.setMonth(date.getMonth() + 1);\n const maxDate = date.getTime() - 1;\n\n dates.push({\n title: formatterMonthYear(minDate),\n minDate,\n maxDate\n });\n }\n}\n\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\n if(validDateForMonth(day, month)) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n\n for(let i = currentYear; i >= minYear; i--) {\n if(month === 1 && day === 28 && !isLeapYear(i)) {\n continue;\n }\n\n const date = new Date();\n date.setFullYear(i, month, day + 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n if(minDate > today) {\n continue;\n }\n\n date.setFullYear(i, month, day + 2);\n date.setHours(0, 0, 0);\n const maxDate = date.getTime() - 1;\n if(i === currentYear) {\n dates.push({\n title: formatterDayMonth(minDate),\n minDate,\n maxDate\n });\n } else {\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n }\n }\n }\n}\n\nfunction formatterMonthYear(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\n}\n\nfunction formatterDayMonth(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\n}\n\nfunction formatterYearMax(timestamp: number) {\n const date = new Date(timestamp);\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\n}\n\nfunction formatWeekLong(timestamp: number) {\n const date = new Date(timestamp);\n return days[date.getDay()];\n}\n\nfunction validDateForMonth(day: number, month: number) {\n if(month >= 0 && month < 12) {\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLeapYear(year: number) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n}\n\nfunction getMonth(q: string) {\n /* String[] months = new String[]{\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\n }; */\n\n /* String[] monthsEng = new String[12];\n Calendar c = Calendar.getInstance();\n for (int i = 1; i <= 12; i++) {\n c.set(0, 0, 0, 0, 0, 0);\n c.set(Calendar.MONTH, i);\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\n } */\n\n q = q.toLowerCase();\n for(let i = 0; i < 12; i++) {\n const month = months[i].toLowerCase();\n if(month.indexOf(q) === 0) {\n return i;\n }\n }\n return -1;\n}\n\nfunction getDayOfWeek(q: string) {\n const c = new Date();\n if(q.length <= 3) {\n return -1;\n }\n\n for(let i = 0; i < 7; i++) {\n c.setDate(c.getDate() + 1);\n\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\n return c.getDay();\n }\n }\n return -1;\n}\n\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {toastNew} from '../../components/toast';\nimport {LangPackKey} from '../../lib/langPack';\nimport {copyTextToClipboard} from '../clipboard';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent} from './clickEvent';\n\nconst T_ME = 'https://t.me/';\nexport default function anchorCopy(options: Partial<{\n // href: string,\n mePath: string,\n username: string\n}> = {}) {\n const anchor = document.createElement('a');\n anchor.classList.add('anchor-copy');\n\n let copyWhat: string, copyText: LangPackKey = 'LinkCopied';\n if(options.mePath) {\n const href = T_ME + options.mePath;\n copyWhat = anchor.href = anchor.innerText = href;\n }\n\n if(options.username) {\n const href = T_ME + options.username;\n anchor.href = href;\n copyWhat = anchor.innerText = '@' + options.username;\n copyText = 'UsernameCopied';\n }\n\n attachClickEvent(anchor, (e) => {\n cancelEvent(e);\n copyTextToClipboard(copyWhat ?? anchor.href);\n toastNew({langPackKey: copyText});\n });\n\n return anchor;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_APPLE} from '../../environment/userAgent';\nimport contextMenuController from '../contextMenuController';\nimport ListenerSetter, {ListenerOptions} from '../listenerSetter';\nimport cancelEvent from './cancelEvent';\n\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\nexport function cancelContextMenuOpening() {\n if(_cancelContextMenuOpeningTimeout) {\n clearTimeout(_cancelContextMenuOpeningTimeout);\n }\n\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\n _cancelContextMenuOpeningTimeout = 0;\n _cancelContextMenuOpening = false;\n }, .4e3);\n\n _cancelContextMenuOpening = true;\n}\n\nexport function attachContextMenuListener({\n element,\n callback,\n listenerSetter,\n listenerOptions\n}: {\n element: HTMLElement,\n callback: (e: TouchEvent | MouseEvent) => void,\n listenerSetter?: ListenerSetter,\n listenerOptions?: ListenerOptions\n}) {\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\n\n // can't cancel further events coming after 'contextmenu' event\n if((IS_APPLE && IS_TOUCH_SUPPORTED) || listenerOptions) {\n let timeout: number;\n\n const options: EventListenerOptions = {\n ...(listenerOptions || {}),\n capture: true\n };\n\n const onCancel = () => {\n clearTimeout(timeout);\n // @ts-ignore\n remove('touchmove', onCancel, options);\n // @ts-ignore\n remove('touchend', onCancel, options);\n // @ts-ignore\n remove('touchcancel', onCancel, options);\n };\n\n add('touchstart', (e: TouchEvent) => {\n if(e.touches.length > 1) {\n onCancel();\n return;\n }\n\n add('touchmove', onCancel, options);\n add('touchend', onCancel, options);\n add('touchcancel', onCancel, options);\n\n timeout = window.setTimeout(() => {\n if(_cancelContextMenuOpening) {\n onCancel();\n return;\n }\n\n callback(e);\n onCancel();\n\n if(contextMenuController.isOpened()) {\n add('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n }, .4e3);\n }, listenerOptions);\n\n /* if(!isSafari) {\n add('contextmenu', (e: any) => {\n cancelEvent(e);\n }, {passive: false, capture: true});\n } */\n } else {\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\n callback(e);\n\n if(contextMenuController.isOpened()) {\n add('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n } : callback, listenerOptions);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type GrabEvent = {x: number, y: number, isTouch?: boolean, event: TouchEvent | MouseEvent};\n\nexport default function attachGrabListeners(element: HTMLElement,\n onStart: (position: GrabEvent) => void,\n onMove: (position: GrabEvent) => void,\n onEnd?: (position: GrabEvent) => void) {\n // * Mouse\n const onMouseMove = (event: MouseEvent) => {\n onMove({x: event.pageX, y: event.pageY, event});\n };\n\n const onMouseUp = (event: MouseEvent) => {\n document.removeEventListener('mousemove', onMouseMove);\n element.addEventListener('mousedown', onMouseDown, {once: true});\n onEnd && onEnd({x: event.pageX, y: event.pageY, event});\n };\n\n const onMouseDown = (event: MouseEvent) => {\n if(event.button !== 0) {\n element.addEventListener('mousedown', onMouseDown, {once: true});\n return;\n }\n\n onStart({x: event.pageX, y: event.pageY, event});\n onMouseMove(event);\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp, {once: true});\n };\n\n element.addEventListener('mousedown', onMouseDown, {once: true});\n\n // * Touch\n const onTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n onMove({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n };\n\n const onTouchEnd = (event: TouchEvent) => {\n document.removeEventListener('touchmove', onTouchMove);\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\n onEnd && onEnd({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n };\n\n const onTouchStart = (event: TouchEvent) => {\n onStart({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n onTouchMove(event);\n\n document.addEventListener('touchmove', onTouchMove, {passive: false});\n document.addEventListener('touchend', onTouchEnd, {passive: false, once: true});\n };\n\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\n\n return () => {\n element.removeEventListener('mousedown', onMouseDown);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n\n element.removeEventListener('touchstart', onTouchStart);\n document.removeEventListener('touchmove', onTouchMove);\n document.removeEventListener('touchend', onTouchEnd);\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function cancelSelection() {\n if(window.getSelection) {\n if(window.getSelection().empty) { // Chrome\n window.getSelection().empty();\n } else if(window.getSelection().removeAllRanges) { // Firefox\n window.getSelection().removeAllRanges();\n }\n // @ts-ignore\n } else if(document.selection) { // IE?\n // @ts-ignore\n document.selection.empty();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport simulateEvent from './dispatchEvent';\n\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\n const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\n\n options.touchMouseDown = true;\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\n add('mousedown', callback, options);\n } else if(CLICK_EVENT_NAME === 'touchend') {\n const o = {...options, once: true};\n\n const onTouchStart = (e: TouchEvent) => {\n const onTouchMove = (e: TouchEvent) => {\n remove('touchmove', onTouchMove, o);\n remove('touchend', onTouchEnd, o);\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n remove('touchmove', onTouchMove, o);\n callback(e);\n if(options.once) {\n remove('touchstart', onTouchStart);\n }\n };\n\n add('touchend', onTouchEnd, o);\n add('touchmove', onTouchMove, o);\n };\n\n add('touchstart', onTouchStart);\n } else {\n add(CLICK_EVENT_NAME, callback, options);\n } */\n add(CLICK_EVENT_NAME, callback, options);\n\n // @ts-ignore\n return () => remove(CLICK_EVENT_NAME, callback, options);\n}\n\nexport function detachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options?: AddEventListenerOptions) {\n // if(CLICK_EVENT_NAME === 'touchend') {\n // elem.removeEventListener('touchstart', callback, options);\n // } else {\n elem.removeEventListener(CLICK_EVENT_NAME, callback as any, options);\n // }\n}\n\nexport function simulateClickEvent(elem: HTMLElement) {\n simulateEvent(elem, CLICK_EVENT_NAME);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport EventListenerBase from '../eventListenerBase';\nimport ListenerSetter from '../listenerSetter';\nimport safeAssign from '../object/safeAssign';\nimport findUpClassName from './findUpClassName';\n\nexport default class ControlsHover extends EventListenerBase<{\n toggleControls: (show: boolean) => void\n}> {\n protected hideControlsTimeout: number;\n protected controlsLocked: boolean;\n\n protected canHideControls: () => boolean;\n protected element: HTMLElement;\n protected listenerSetter: ListenerSetter;\n protected showOnLeaveToClassName: string;\n protected ignoreClickClassName: string;\n\n constructor() {\n super(false);\n this.hideControlsTimeout = 0;\n }\n\n public setup(options: {\n element: HTMLElement,\n listenerSetter: ListenerSetter,\n canHideControls?: () => boolean,\n showOnLeaveToClassName?: string,\n ignoreClickClassName?: string\n }) {\n safeAssign(this, options);\n\n const {listenerSetter, element} = this;\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(element)('click', (e) => {\n if(this.ignoreClickClassName && findUpClassName(e.target, this.ignoreClickClassName)) {\n return;\n }\n\n this.toggleControls();\n });\n\n /* listenerSetter.add(player)('touchstart', () => {\n showControls(false);\n });\n\n listenerSetter.add(player)('touchend', () => {\n if(player.classList.contains('is-playing')) {\n showControls();\n }\n }); */\n } else {\n listenerSetter.add(element)('mousemove', () => {\n this.showControls();\n });\n\n listenerSetter.add(element)('mouseenter', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(element)('mouseleave', (e) => {\n if(e.relatedTarget && this.showOnLeaveToClassName && findUpClassName(e.relatedTarget, this.showOnLeaveToClassName)) {\n this.showControls(false);\n return;\n }\n\n this.hideControls();\n });\n }\n }\n\n public hideControls = (setHideTimeout = false) => {\n if(setHideTimeout) {\n if(!this.hideControlsTimeout) {\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n }\n\n return;\n }\n\n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 0;\n\n const isShown = this.element.classList.contains('show-controls');\n if(this.controlsLocked !== false) {\n if((this.canHideControls ? !this.canHideControls() : false) || !isShown || this.controlsLocked) {\n return;\n }\n } else if(!isShown) {\n return;\n }\n\n this.dispatchEvent('toggleControls', false);\n this.element.classList.remove('show-controls');\n };\n\n public showControls = (setHideTimeout = true) => {\n if(this.hideControlsTimeout) {\n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 0;\n } else if(!this.element.classList.contains('show-controls') && this.controlsLocked !== false) {\n this.dispatchEvent('toggleControls', true);\n this.element.classList.add('show-controls');\n }\n\n if(!setHideTimeout || this.controlsLocked) {\n return;\n }\n\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n };\n\n public toggleControls = (show?: boolean) => {\n const isShown = this.element.classList.contains('show-controls');\n\n if(show === undefined) {\n if(isShown) this.hideControls();\n else this.showControls();\n } else if(show === isShown) return;\n else if(show === false) this.hideControls();\n else this.showControls();\n };\n\n public lockControls(visible: boolean) {\n this.controlsLocked = visible;\n\n this.element.classList.toggle('disable-hover', visible === false);\n this.toggleControls(visible);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ButtonMenu, {ButtonMenuItemOptionsVerifiable} from '../../components/buttonMenu';\nimport filterAsync from '../array/filterAsync';\nimport contextMenuController from '../contextMenuController';\nimport ListenerSetter from '../listenerSetter';\nimport {getMiddleware} from '../middleware';\nimport positionMenu from '../positionMenu';\nimport {attachContextMenuListener} from './attachContextMenuListener';\n\nexport default function createContextMenu({\n buttons,\n findElement,\n listenTo,\n appendTo,\n filterButtons,\n onOpen,\n onClose,\n onBeforeOpen,\n listenerSetter: attachListenerSetter\n}: {\n buttons: T[],\n findElement?: (e: MouseEvent | TouchEvent) => HTMLElement,\n listenTo: HTMLElement,\n appendTo?: HTMLElement,\n filterButtons?: (buttons: T[]) => Promise,\n onOpen?: (target: HTMLElement) => any,\n onClose?: () => any,\n onBeforeOpen?: () => any,\n listenerSetter?: ListenerSetter\n}) {\n appendTo ??= document.body;\n\n attachListenerSetter ??= new ListenerSetter();\n const listenerSetter = new ListenerSetter();\n const middleware = getMiddleware();\n let element: HTMLElement;\n\n attachContextMenuListener({\n element: listenTo,\n callback: (e) => {\n const target = findElement ? findElement(e as any) : listenTo;\n if(!target) {\n return;\n }\n\n let _element = element;\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\n if(_element && _element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\n\n const r = async() => {\n await onOpen?.(target);\n\n const initResult = await init();\n if(!initResult) {\n return;\n }\n\n _element = initResult.element;\n const {cleanup, destroy} = initResult;\n\n positionMenu(e, _element);\n contextMenuController.openBtnMenu(_element, () => {\n onClose?.();\n cleanup();\n\n setTimeout(() => {\n destroy();\n }, 300);\n });\n };\n\n r();\n },\n listenerSetter: attachListenerSetter\n });\n\n const cleanup = () => {\n listenerSetter.removeAll();\n middleware.clean();\n };\n\n const destroy = () => {\n cleanup();\n attachListenerSetter.removeAll();\n };\n\n const init = async() => {\n cleanup();\n\n buttons.forEach((button) => button.element = undefined);\n const f = filterButtons || ((buttons: T[]) => filterAsync(buttons, (button) => button?.verify?.() ?? true));\n\n const filteredButtons = await f(buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const _element = element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter\n });\n _element.classList.add('contextmenu');\n\n await onBeforeOpen?.();\n\n appendTo.append(_element);\n\n return {\n element: _element,\n cleanup,\n destroy: () => {\n _element.remove();\n }\n };\n };\n\n return {element, destroy};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport PopupStickers from '../../components/popups/stickers';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport createContextMenu from './createContextMenu';\nimport findUpClassName from './findUpClassName';\nimport emoticonsDropdown, {EmoticonsDropdown} from '../../components/emoticonsDropdown';\n\nexport default function createStickersContextMenu(options: {\n listenTo: HTMLElement,\n isStickerPack?: boolean,\n verifyRecent?: (target: HTMLElement) => boolean,\n appendTo?: HTMLElement,\n onOpen?: () => any,\n onClose?: () => any,\n onSend?: () => any\n}) {\n const {listenTo, isStickerPack, verifyRecent, appendTo, onOpen, onClose, onSend} = options;\n let target: HTMLElement, doc: MyDocument;\n const verifyFavoriteSticker = async(toAdd: boolean) => {\n const favedStickers = await rootScope.managers.acknowledged.appStickersManager.getFavedStickersStickers();\n if(!favedStickers.cached) {\n return false;\n }\n\n const found = (await favedStickers.result).some((_doc) => _doc.id === doc.id);\n return toAdd ? !found : found;\n };\n\n return createContextMenu({\n listenTo: listenTo,\n appendTo,\n findElement: (e) => target = findUpClassName(e.target, 'media-sticker-wrapper'),\n onOpen: async() => {\n doc = await rootScope.managers.appDocsManager.getDoc(target.dataset.docId);\n return onOpen?.();\n },\n onClose,\n buttons: [{\n icon: 'stickers',\n text: 'Context.ViewStickerSet',\n onClick: () => new PopupStickers(doc.stickerSetInput).show(),\n verify: () => !isStickerPack\n }, {\n icon: 'favourites',\n text: 'AddToFavorites',\n onClick: () => rootScope.managers.appStickersManager.faveSticker(doc.id, false),\n verify: () => verifyFavoriteSticker(true)\n }, {\n icon: 'favourites',\n text: 'DeleteFromFavorites',\n onClick: () => rootScope.managers.appStickersManager.faveSticker(doc.id, true),\n verify: () => verifyFavoriteSticker(false)\n }, {\n icon: 'delete',\n text: 'DeleteFromRecent',\n onClick: () => rootScope.managers.appStickersManager.saveRecentSticker(doc.id, true),\n verify: () => verifyRecent?.(target) ?? false\n }, {\n icon: 'mute',\n text: 'Chat.Send.WithoutSound',\n onClick: () => {\n onSend?.();\n return EmoticonsDropdown.sendDocId(doc.id, false, true);\n },\n verify: () => !!(appImManager.chat.peerId && appImManager.chat.peerId !== rootScope.myId)\n }, {\n icon: 'schedule',\n text: 'Chat.Send.ScheduledMessage',\n onClick: () => appImManager.chat.input.scheduleSending(() => appImManager.chat.input.sendMessageWithDocument(doc)),\n verify: () => !!appImManager.chat.peerId\n }]\n });\n}\n","export default function createVideo(options: {\n pip?: boolean\n} = {}) {\n const video = document.createElement('video');\n if(!options.pip) video.disablePictureInPicture = true;\n video.setAttribute('playsinline', 'true');\n return video;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\n\nexport type CustomProperty = string;\n\nexport class CustomProperties {\n private cache: {[k in CustomProperty]?: string};\n private computedStyle: CSSStyleDeclaration;\n\n constructor() {\n this.cache = {};\n\n rootScope.addEventListener('theme_change', () => {\n this.computedStyle = undefined;\n const cache = this.cache;\n this.cache = {};\n\n for(const i in cache) {\n this.getProperty(i);\n }\n });\n }\n\n public getProperty(name: CustomProperty) {\n let value = this.cache[name];\n if(value) {\n return value;\n }\n\n if(!this.computedStyle) {\n this.computedStyle = window.getComputedStyle(document.documentElement);\n }\n\n value = this.computedStyle.getPropertyValue('--' + name).trim();\n return this.cache[name] = value;\n }\n}\n\nconst customProperties = new CustomProperties();\nexport default customProperties;\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","import encodeEntities from '../string/encodeEntities';\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === node.TEXT_NODE ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).join('');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function findUpAsChild(el: T, parent: HTMLElement): T {\n if(!el) return null;\n if(el.parentElement === parent) return el;\n\n while(el.parentElement) {\n el = el.parentElement as any;\n if(el.parentElement === parent) {\n return el;\n }\n }\n\n return null;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\n return el.closest(`[${attribute}]`);\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.getAttribute(attribute) !== null)\n return el;\n }\n return null; */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function findUpTag(el: any, tag: string): HTMLElement {\n return el.closest(tag);\n /* if(el.tagName === tag) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.tagName === tag)\n return el;\n }\n return null; */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../listenerSetter';\n\nexport function requestFullScreen(element: HTMLElement) {\n if(element.requestFullscreen) {\n element.requestFullscreen();\n // @ts-ignore\n } else if(element.mozRequestFullScreen) {\n // @ts-ignore\n element.mozRequestFullScreen(); // Firefox\n // @ts-ignore\n } else if(element.webkitRequestFullscreen) {\n // @ts-ignore\n element.webkitRequestFullscreen(); // Chrome and Safari\n // @ts-ignore\n } else if(element.msRequestFullscreen) {\n // @ts-ignore\n element.msRequestFullscreen();\n }\n}\n\nexport function cancelFullScreen() {\n // @ts-ignore\n if(document.cancelFullScreen) {\n // @ts-ignore\n document.cancelFullScreen();\n // @ts-ignore\n } else if(document.mozCancelFullScreen) {\n // @ts-ignore\n document.mozCancelFullScreen();\n // @ts-ignore\n } else if(document.webkitCancelFullScreen) {\n // @ts-ignore\n document.webkitCancelFullScreen();\n // @ts-ignore\n } else if(document.msExitFullscreen) {\n // @ts-ignore\n document.msExitFullscreen();\n }\n}\n\nexport function addFullScreenListener(element: HTMLElement, callback: (e: Event) => any, listenerSetter?: ListenerSetter) {\n const addListener = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange'.split(' ').forEach((eventName) => {\n addListener(eventName, callback, false);\n });\n}\n\nexport function getFullScreenElement(): HTMLElement {\n // @ts-ignore\n return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;\n}\n\nexport function isFullScreen() {\n return !!getFullScreenElement();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpAsChild from './findUpAsChild';\n\nexport default function getCaretPosNew(input: HTMLElement, anchor?: boolean): ReturnType & {selection: Selection} {\n const selection = document.getSelection();\n // let {focusNode: node, focusOffset: offset} = selection;\n const node = selection[anchor ? 'anchorNode' : 'focusNode'];\n const offset = selection[anchor ? 'anchorOffset' : 'focusOffset'];\n if(!findUpAsChild(node, input) && node !== input) {\n return {selection} as any;\n }\n\n return {...getCaretPosF(input, node, offset), selection};\n}\n\nexport function getCaretPosF(input: HTMLElement, node: Node, offset: number) {\n if(node === input) {\n const childNodes = input.childNodes;\n const childNodesLength = childNodes.length;\n if(childNodesLength && offset >= childNodesLength) {\n node = childNodes[childNodesLength - 1];\n offset = (node.textContent || (node as HTMLImageElement).alt || '').length;\n } else {\n node = childNodes[offset];\n offset = 0;\n }\n }\n\n return {node: node as ChildNode, offset};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport BOM from '../string/bom';\n\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler'/* | 'customEmoji' */;\nexport type MarkdownTag = {\n match: string,\n entityName: Extract;\n};\n\n// https://core.telegram.org/bots/api#html-style\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\n bold: {\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\n entityName: 'messageEntityBold'\n },\n underline: {\n match: '[style*=\"underline\"], u, ins',\n entityName: 'messageEntityUnderline'\n },\n italic: {\n match: '[style*=\"italic\"], i, em',\n entityName: 'messageEntityItalic'\n },\n monospace: {\n match: '[style*=\"monospace\"], [face*=\"monospace\"], pre',\n entityName: 'messageEntityCode'\n },\n strikethrough: {\n match: '[style*=\"line-through\"], [style*=\"strikethrough\"], strike, del, s',\n entityName: 'messageEntityStrike'\n },\n link: {\n match: 'A:not(.follow)',\n entityName: 'messageEntityTextUrl'\n },\n mentionName: {\n match: 'A.follow',\n entityName: 'messageEntityMentionName'\n },\n spoiler: {\n match: '[style*=\"spoiler\"]',\n entityName: 'messageEntitySpoiler'\n }\n // customEmoji: {\n // match: '.custom-emoji',\n // entityName: 'messageEntityCustomEmoji'\n // }\n};\n\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\n\n/* export function getDepth(child: Node, container?: Node) {\n let depth = 0;\n\n do {\n if(child === container) {\n return depth;\n }\n\n ++depth;\n } while((child = child.parentNode) !== null);\n\n return depth;\n} */\n\nconst BLOCK_TAGS = new Set([\n 'DIV',\n 'P',\n 'BR',\n 'LI',\n 'SECTION',\n 'H6',\n 'H5',\n 'H4',\n 'H3',\n 'H2',\n 'H1',\n 'TR',\n 'OL',\n 'UL'\n]);\n\nconst INSERT_NEW_LINE_TAGS = new Set([\n 'OL',\n 'UL'\n]);\n\nconst BOM_REG_EXP = new RegExp(BOM, 'g');\n\nfunction checkNodeForEntity(node: Node, value: string, entities: MessageEntity[], offset: {offset: number}) {\n const parentElement = node.parentElement;\n\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\n for(const type in markdownTags) {\n const tag = markdownTags[type as MarkdownType];\n const closest: HTMLElement = parentElement.closest(tag.match + ', [contenteditable=\"true\"]');\n if(closest?.getAttribute('contenteditable') !== null) {\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\n if(closestDepth > depth) {\n closestDepth = depth;\n closestTag = tag;\n closestElementByTag = closest;\n } */\n continue;\n }\n\n if(tag.entityName === 'messageEntityTextUrl') {\n entities.push({\n _: tag.entityName,\n url: (closest as HTMLAnchorElement).href,\n offset: offset.offset,\n length: value.length\n });\n } else if(tag.entityName === 'messageEntityMentionName') {\n entities.push({\n _: tag.entityName,\n offset: offset.offset,\n length: value.length,\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\n });\n }/* else if(tag.entityName === 'messageEntityCustomEmoji') {\n entities.push({\n _: tag.entityName,\n document_id: (closest as HTMLElement).dataset.docId,\n offset: offset.offset,\n length: emoji.length\n });\n } */ else {\n entities.push({\n _: tag.entityName,\n offset: offset.offset,\n length: value.length\n });\n }\n }\n}\n\nexport default function getRichElementValue(\n node: HTMLElement,\n lines: string[],\n line: string[],\n selNode?: Node,\n selOffset?: number,\n entities?: MessageEntity[],\n offset = {offset: 0}\n) {\n if(node.nodeType === node.TEXT_NODE) { // TEXT\n let nodeValue = node.nodeValue;\n // if(nodeValue[0] === BOM) {\n nodeValue = nodeValue.replace(BOM_REG_EXP, '');\n // }\n\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\n if(tabulation?.getAttribute('contenteditable') === null) {\n nodeValue += ' ';\n // line.push('\\t');\n // ++offset.offset;\n } */\n\n if(nodeValue) {\n if(selNode === node) {\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\n } else {\n line.push(nodeValue);\n }\n } else if(selNode === node) {\n line.push('\\x01');\n }\n\n if(entities && nodeValue.length && node.parentNode) {\n checkNodeForEntity(node, nodeValue, entities, offset);\n }\n\n offset.offset += nodeValue.length;\n return;\n }\n\n if(node.nodeType !== node.ELEMENT_NODE) { // NON-ELEMENT\n return;\n }\n\n const isSelected = selNode === node;\n const isBlock = BLOCK_TAGS.has(node.tagName);\n if(isBlock && (line.length || node.tagName === 'BR'/* || (BLOCK_TAGS.has(node.tagName) && lines.length) */)) {\n lines.push(line.join(''));\n line.length = 0;\n ++offset.offset;\n } else {\n const alt = node.dataset.stickerEmoji || (node as HTMLImageElement).alt;\n const stickerEmoji = node.dataset.stickerEmoji;\n\n if(alt && entities) {\n checkNodeForEntity(node, alt, entities, offset);\n }\n\n if(stickerEmoji && entities) {\n entities.push({\n _: 'messageEntityCustomEmoji',\n document_id: node.dataset.docId,\n offset: offset.offset,\n length: alt.length\n });\n }\n\n if(alt) {\n line.push(alt);\n offset.offset += alt.length;\n }\n }\n\n if(isSelected && !selOffset) {\n line.push('\\x01');\n }\n\n const isTableCell = node.matches(tabulationMatch);\n const wasEntitiesLength = entities?.length;\n\n let curChild = node.firstChild as HTMLElement;\n while(curChild) {\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\n curChild = curChild.nextSibling as any;\n }\n\n if(isSelected && selOffset) {\n line.push('\\x01');\n }\n\n if(isTableCell && node.nextSibling && line.length) {\n line.push(' ');\n ++offset.offset;\n\n // * combine entities such as url after adding space\n if(wasEntitiesLength !== undefined) {\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\n ++entities[i].length;\n }\n }\n }\n\n const wasLength = line.length;\n if(isBlock && wasLength) {\n lines.push(line.join(''));\n line.splice(0, wasLength);\n ++offset.offset;\n }\n\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\n lines.push('');\n ++offset.offset;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {MessageEntity} from '../../layer';\nimport combineSameEntities from '../../lib/richTextProcessor/combineSameEntities';\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\nimport getRichElementValue from './getRichElementValue';\n\nexport function getCaretPos(field: HTMLElement) {\n const sel = window.getSelection();\n let selNode: Node;\n let selOffset: number;\n if(sel?.rangeCount) {\n const range = sel.getRangeAt(0);\n const startOffset = range.startOffset;\n if(\n range.startContainer &&\n range.startContainer == range.endContainer &&\n startOffset == range.endOffset\n ) {\n // * if focused on img, or caret has been set via placeCaretAtEnd\n const possibleChildrenFocusOffset = startOffset - 1;\n const childNodes = field.childNodes;\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\n selNode = childNodes[possibleChildrenFocusOffset];\n selOffset = 0;\n\n for(let i = 0; i < range.endOffset; ++i) {\n const node = childNodes[i];\n const value = node.nodeValue || (node as HTMLImageElement).alt;\n\n if(value) {\n selOffset += value.length;\n }\n }\n } else {\n selNode = range.startContainer;\n selOffset = startOffset;\n }\n }\n }\n\n return {node: selNode, offset: selOffset};\n}\n\nexport default function getRichValueWithCaret(\n field: HTMLElement | DocumentFragment,\n withEntities = true,\n withCaret = true\n) {\n const lines: string[] = [];\n const line: string[] = [];\n\n const {node: selNode, offset: selOffset} = !(field instanceof DocumentFragment) && withCaret && getCaretPos(field);\n\n const entities: MessageEntity[] = withEntities ? [] : undefined;\n const offset = {offset: 0};\n if(field instanceof DocumentFragment) {\n let curChild = field.firstChild as HTMLElement;\n while(curChild) {\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\n curChild = curChild.nextSibling as any;\n }\n } else {\n getRichElementValue(field, lines, line, selNode, selOffset, entities, offset);\n }\n\n if(line.length) {\n lines.push(line.join(''));\n }\n\n let value = lines.join('\\n');\n const caretPos = value.indexOf('\\x01');\n if(caretPos !== -1) {\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\n }\n value = value.replace(/\\u00A0/g, ' ');\n\n if(entities?.length) {\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\n /* const entity = entities[entities.length - 1];\n const length = value.length;\n const trimmedLength = value.trimRight().length;\n if(length !== trimmedLength) {\n entity.length -= length - trimmedLength;\n } */\n\n combineSameEntities(entities);\n sortEntities(entities);\n }\n\n return {value, entities, caretPos};\n}\n\nMOUNT_CLASS_TO.getRichValueWithCaret = getRichValueWithCaret;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getVisibleRect from './getVisibleRect';\n\nexport type ViewportSlicePart = {element: HTMLElement, rect: DOMRect, visibleRect: ReturnType}[];\n\nexport default function getViewportSlice({overflowElement, overflowRect, selector, extraSize, elements}: {\n overflowElement: HTMLElement,\n overflowRect?: DOMRectMinified,\n extraSize?: number,\n selector?: string,\n elements?: HTMLElement[]\n}) {\n // const perf = performance.now();\n overflowRect ??= overflowElement.getBoundingClientRect();\n elements ??= Array.from(overflowElement.querySelectorAll(selector));\n\n if(extraSize) {\n overflowRect = {\n top: overflowRect.top - extraSize,\n right: overflowRect.right + extraSize,\n bottom: overflowRect.bottom + extraSize,\n left: overflowRect.left - extraSize\n };\n }\n\n const invisibleTop: ViewportSlicePart = [],\n visible: typeof invisibleTop = [],\n invisibleBottom: typeof invisibleTop = [];\n let foundVisible = false;\n for(const element of elements) {\n const rect = element.getBoundingClientRect();\n const visibleRect = getVisibleRect(element, overflowElement, false, rect, overflowRect);\n\n const isVisible = !!visibleRect;\n let array: typeof invisibleTop;\n if(isVisible) {\n foundVisible = true;\n array = visible;\n } else if(foundVisible) {\n array = invisibleBottom;\n } else {\n array = invisibleTop;\n }\n\n array.push({\n element,\n rect,\n visibleRect\n });\n }\n\n // if(extraSize && visible.length) {\n // const maxTop = visible[0].rect.top;\n // const minTop = maxTop - extraSize;\n // const minBottom = visible[visible.length - 1].rect.bottom;\n // const maxBottom = minBottom + extraSize;\n\n // for(let length = invisibleTop.length, i = length - 1; i >= 0; --i) {\n // const element = invisibleTop[i];\n // if(element.rect.top >= minTop) {\n // invisibleTop.splice(i, 1);\n // visible.unshift(element);\n // }\n // }\n\n // for(let i = 0, length = invisibleBottom.length; i < length; ++i) {\n // const element = invisibleBottom[i];\n // if(element.rect.bottom <= maxBottom) {\n // invisibleBottom.splice(i--, 1);\n // --length;\n // visible.push(element);\n // }\n // }\n // }\n\n // console.log('getViewportSlice time:', performance.now() - perf);\n\n return {invisibleTop, visible, invisibleBottom};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport windowSize from '../windowSize';\n\nexport default function getVisibleRect(\n element: HTMLElement,\n overflowElement: HTMLElement,\n lookForSticky?: boolean,\n rect: DOMRectMinified = element.getBoundingClientRect(),\n overflowRect: DOMRectMinified = overflowElement.getBoundingClientRect()\n) {\n let {top: overflowTop, right: overflowRight, bottom: overflowBottom, left: overflowLeft} = overflowRect;\n\n // * respect sticky headers\n if(lookForSticky) {\n const sticky = overflowElement.querySelector('.sticky');\n if(sticky) {\n const stickyRect = sticky.getBoundingClientRect();\n overflowTop = stickyRect.bottom;\n }\n }\n\n if(rect.top >= overflowBottom ||\n rect.bottom <= overflowTop ||\n rect.right <= overflowLeft ||\n rect.left >= overflowRight) {\n return null;\n }\n\n const overflow = {\n top: false,\n right: false,\n bottom: false,\n left: false,\n vertical: 0 as 0 | 1 | 2,\n horizontal: 0 as 0 | 1 | 2\n };\n\n const windowWidth = windowSize.width;\n const windowHeight = windowSize.height;\n\n return {\n rect: {\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\n right: rect.right > overflowRight && overflowRight !== windowWidth ? (overflow.right = true, ++overflow.horizontal, overflowRight) : rect.right,\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\n left: rect.left < overflowLeft && overflowLeft !== 0 ? (overflow.left = true, ++overflow.horizontal, overflowLeft) : rect.left\n },\n overflow\n };\n}\n\n(window as any).getVisibleRect = getVisibleRect;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SwipeHandler, {SwipeHandlerOptions} from '../../components/swipeHandler';\nimport cancelEvent from './cancelEvent';\nimport findUpClassName from './findUpClassName';\nimport isSwipingBackSafari from './isSwipingBackSafari';\n\nexport type SwipeHandlerHorizontalOptions = SwipeHandlerOptions & {\n // xThreshold?: number\n};\n\nexport default function handleHorizontalSwipe(options: SwipeHandlerHorizontalOptions) {\n let cancelY = false;\n return new SwipeHandler({\n ...options,\n verifyTouchTarget: (e) => {\n return !findUpClassName(e.target, 'progress-line') &&\n !isSwipingBackSafari(e as any as TouchEvent) &&\n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\n\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e as any as Event);\n cancelY = true;\n } else if(!cancelY && Math.abs(yDiff) > Math.abs(xDiff)/* || Math.abs(yDiff) > 20 */) {\n return true;\n }\n\n /* if(!cancelY && options.xThreshold !== undefined && xDiff >= options.xThreshold) {\n cancelY = true;\n } */\n\n return options.onSwipe(xDiff, yDiff, e);\n },\n onReset: () => {\n cancelY = false;\n options.onReset && options.onReset();\n },\n cancelEvent: false // cannot use cancelEvent on Safari iOS because scroll will be canceled too\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {cancelContextMenuOpening} from './attachContextMenuListener';\nimport handleHorizontalSwipe, {SwipeHandlerHorizontalOptions} from './handleHorizontalSwipe';\n\nexport default function handleTabSwipe(options: SwipeHandlerHorizontalOptions) {\n return handleHorizontalSwipe({\n ...options,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\n\n if(Math.abs(xDiff) > 50) {\n options.onSwipe(xDiff, yDiff, e);\n cancelContextMenuOpening();\n\n return true;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function htmlToDocumentFragment(html: string | DocumentFragment) {\n if(html instanceof DocumentFragment) return html;\n const template = document.createElement('template');\n html = html.trim(); // Never return a text node of whitespace as the result\n template.innerHTML = html;\n return template.content;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function htmlToSpan(html: string | DocumentFragment) {\n const span = document.createElement('span');\n if(typeof(html) === 'string') span.innerHTML = html;\n else span.append(html);\n return span;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\n if(!element) {\n return false;\n }\n\n parentNode = parentNode || document.body;\n if(element === parentNode) {\n return true;\n }\n return isInDOM(element.parentNode as HTMLElement, parentNode);\n} */\nexport default function isInDOM(element: Element): boolean {\n return element?.isConnected;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function isInputEmpty(element: HTMLElement) {\n if(element.isContentEditable || element.tagName !== 'INPUT') {\n /* const value = element.innerText;\n\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\n // return !getRichValueWithCaret(element, false, false).value.trim();\n return !element.textContent.trim() && !element.querySelector('.emoji, .custom-emoji, .custom-emoji-placeholder');\n } else {\n return !(element as HTMLInputElement).value.trim();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\nimport {IS_MOBILE, IS_APPLE} from '../../environment/userAgent';\n\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\n /* if(e.ctrlKey || e.metaKey) {\n this.messageInput.innerHTML += '
';\n placeCaretAtEnd(this.message)\n return;\n } */\n\n if(rootScope.settings.sendShortcut === 'enter') {\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\n return;\n }\n\n return true;\n } else {\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\n return;\n }\n\n if(secondaryKey) {\n return true;\n }\n }\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false, focus = true) {\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || (document.activeElement.tagName !== 'INPUT' && !(document.activeElement as HTMLElement).isContentEditable))) {\n return;\n }\n\n focus && el.focus();\n if(el instanceof HTMLInputElement) {\n const length = el.value.length;\n el.selectionStart = length;\n el.selectionEnd = length;\n } else {\n const range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n\n(window as any).placeCaretAtEnd = placeCaretAtEnd;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport whichChild from './whichChild';\n\nexport default function positionElementByIndex(element: HTMLElement, container: HTMLElement, pos: number, prevPos?: number) {\n if(prevPos === undefined) {\n prevPos = element.parentElement === container ? whichChild(element) : -1;\n }\n\n if(prevPos === pos) {\n return false;\n } else if(prevPos !== -1 && prevPos < pos) { // was higher\n pos += 1;\n }\n\n if(!pos) {\n container.prepend(element);\n } else if(container.childElementCount > pos) {\n container.insertBefore(element, container.children[pos]);\n } else {\n container.append(element);\n }\n\n return true;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport onMediaLoad from '../onMediaLoad';\n\n// import { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\n\nexport const loadedURLs: {[url: string]: boolean} = {};\nconst set = (elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string) => {\n if(elem instanceof HTMLImageElement || elem instanceof HTMLVideoElement) elem.src = url;\n else if(elem instanceof SVGImageElement) elem.setAttributeNS(null, 'href', url);\n else elem.style.backgroundImage = 'url(' + url + ')';\n};\n\n// проблема функции в том, что она не подходит для ссылок, пригодна только для blob'ов, потому что обычным ссылкам нужен 'load' каждый раз.\nexport default function renderImageFromUrl(\n elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement,\n url: string,\n callback?: () => void,\n useCache = true\n) {\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback?.();\n return;\n }\n\n const isVideo = elem instanceof HTMLVideoElement;\n if(((loadedURLs[url]/* && false */) && useCache) || isVideo) {\n if(elem) {\n set(elem, url);\n }\n\n if(callback) {\n if(isVideo) {\n onMediaLoad(elem).then(callback);\n } else {\n callback?.();\n }\n // callback && getHeavyAnimationPromise().then(() => callback());\n }\n } else {\n const isImage = elem instanceof HTMLImageElement;\n const loader = isImage ? elem as HTMLImageElement : new Image();\n // const loader = new Image();\n loader.src = url;\n // let perf = performance.now();\n\n const onLoad = () => {\n if(!isImage && elem) {\n set(elem, url);\n }\n\n loadedURLs[url] = true;\n // console.log('onload:', url, performance.now() - perf);\n // TODO: переделать прогрузки аватаров до начала анимации, иначе с этим ожиданием они неприятно появляются\n // callback && getHeavyAnimationPromise().then(() => callback());\n callback?.();\n\n loader.removeEventListener('error', onError);\n };\n\n const onError = (err: ErrorEvent) => {\n console.error('Render image from url failed:', err, url, loader);\n loader.removeEventListener('load', onLoad);\n callback?.();\n };\n\n loader.addEventListener('load', onLoad, {once: true});\n loader.addEventListener('error', onError, {once: true});\n }\n}\n\nexport function renderImageFromUrlPromise(elem: Parameters[0], url: string, useCache?: boolean) {\n return new Promise((resolve) => {\n renderImageFromUrl(elem, url, resolve, useCache);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport sequentialDom from '../sequentialDom';\nimport {renderImageFromUrlPromise} from './renderImageFromUrl';\n\nexport default function renderMediaWithFadeIn(\n container: HTMLElement,\n media: Parameters[0],\n url: string,\n needFadeIn: boolean,\n aspecter = container,\n thumbImage?: HTMLElement\n) {\n if(needFadeIn) {\n media.classList.add('fade-in');\n }\n\n const promise = renderImageFromUrlPromise(media, url).then(() => {\n return sequentialDom.mutateElement(container, () => {\n aspecter.append(media);\n\n if(needFadeIn) {\n media.addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n media.classList.remove('fade-in');\n thumbImage?.remove();\n });\n }, {once: true});\n } else {\n thumbImage?.remove();\n }\n });\n });\n\n // recordPromise(promise, 'renderImageWithFadeIn');\n\n return promise;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\n if(typeof(node) === 'string') {\n elem.innerHTML = node;\n return;\n }\n\n // * children.length doesn't count text nodes\n const firstChild = elem.firstChild;\n if(firstChild) {\n if(elem.lastChild === firstChild) {\n firstChild.replaceWith(node);\n } else {\n elem.textContent = '';\n elem.append(node);\n }\n } else {\n elem.append(node);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport clamp from '../number/clamp';\nimport findUpAsChild from './findUpAsChild';\nimport whichChild from './whichChild';\n\nexport default function compareNodes(node1: ChildNode, node1Offset: number, node2: ChildNode, node2Offset: number) {\n let diff: number;\n if(node1 === node2) {\n diff = node1Offset - node2Offset;\n } else if(node1.parentElement === node2.parentElement) {\n diff = whichChild(node1, true) - whichChild(node2, true);\n } else {\n const parents: HTMLElement[] = [];\n let parentElement = node1.parentElement;\n do {\n parents.push(parentElement);\n } while(parentElement = parentElement.parentElement);\n\n parentElement = node2.parentElement;\n do {\n if(parents.includes(parentElement)) {\n break;\n }\n } while(parentElement = parentElement.parentElement);\n\n const commonAncestorContainer = parentElement;\n // const range = document.createRange();\n // range.setStart(node1, 0);\n // range.setEnd(node2, node2.textContent.length);\n // const {commonAncestorContainer} = range;\n node1 = findUpAsChild(node1 as HTMLElement, commonAncestorContainer as HTMLElement);\n node2 = findUpAsChild(node2 as HTMLElement, commonAncestorContainer as HTMLElement);\n diff = whichChild(node1, true) - whichChild(node2, true);\n }\n\n return clamp(diff, -1, 1);\n}\n\n(window as any).compareNodes = compareNodes;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport {logger} from '../../lib/logger';\nimport {isCustomFillerNeededBySiblingNode} from '../../lib/richTextProcessor/wrapRichText';\nimport ListenerSetter from '../listenerSetter';\nimport BOM from '../string/bom';\nimport compareNodes from './compareNodes';\nimport getCaretPosNew from './getCaretPosNew';\nimport placeCaretAtEnd from './placeCaretAtEnd';\nimport whichChild from './whichChild';\n\nconst NOT_ONLY_BOMS_REG_EXP = new RegExp(`[^${BOM}]`);\n\nexport const USING_BOMS = false;\n\nexport default class RichInputHandler {\n private static INSTANCE: RichInputHandler;\n\n private listenerSetter: ListenerSetter;\n\n private lastNode: Node;\n private lastOffset: number;\n private savedRanges: WeakMap;\n\n private log: ReturnType;\n\n private inputCaptureCallbacks: Function[];\n\n constructor() {\n this.log = logger('RICH-INPUT');\n this.listenerSetter = new ListenerSetter();\n this.savedRanges = new WeakMap();\n\n this.listenerSetter.add(document)('selectionchange', this.saveSelectionOnChange);\n if(USING_BOMS) {\n this.listenerSetter.add(document)('focusout', this.onFocusOut);\n this.listenerSetter.add(document)('selectionchange', this.onSelectionChange);\n this.listenerSetter.add(document)('beforeinput', this.onBeforeInput);\n this.listenerSetter.add(document)('keydown', this.onKeyDown, {capture: true});\n\n if(IS_FIREFOX) {\n this.inputCaptureCallbacks = [];\n this.listenerSetter.add(document)('input', () => {\n this.inputCaptureCallbacks.forEach((callback) => callback());\n this.inputCaptureCallbacks.length = 0;\n }, {capture: true});\n }\n }\n }\n\n private get input() {\n const selection = document.getSelection();\n const {anchorNode: node} = selection;\n if(!node) return;\n return ((node as HTMLElement).closest ? node as HTMLElement : node.parentElement).closest('[contenteditable=\"true\"]');\n }\n\n private saveRangeForElement(element: HTMLElement) {\n if(element && (element.isContentEditable || element.tagName === 'INPUT')) {\n const selection = document.getSelection();\n if(selection.rangeCount) {\n this.savedRanges.set(element as HTMLElement, document.getSelection().getRangeAt(0));\n }\n }\n }\n\n private saveSelectionOnChange = (e: Event) => {\n const element = document.activeElement as HTMLElement; // e.target as HTMLElement;\n this.saveRangeForElement(element);\n };\n\n private onFocusOut = (e: FocusEvent) => {\n this.lastNode = this.lastOffset = undefined;\n };\n\n private findPreviousSmthIndex(input: HTMLElement, node: ChildNode, something?: NodeListOf) {\n // node = this.getFiller(node);\n // const childNodes = Array.from(node.parentElement.childNodes);\n // fillerIndex = childNodes.indexOf(node);\n // let smthIndex = -1;\n // for(let i = fillerIndex; i >= 0; --i) {\n // const node = childNodes[i];\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // smthIndex = i;\n // break;\n // }\n // }\n // return smthIndex;\n\n const elements = Array.from(something ?? input.querySelectorAll('.input-something'));\n const index = elements.findIndex((element) => compareNodes(element, 0, node, 0) >= 0);\n return index === -1 ? elements.length - 1 : Math.max(0, index - 1);\n }\n\n private superMove(\n input: HTMLElement,\n caret: ReturnType,\n toLeft: boolean,\n fromSelectionChange: boolean\n ) {\n const {node, offset, move} = caret;\n const something = input.querySelectorAll('.input-something');\n const smthIndex = this.findPreviousSmthIndex(input, node, something);\n const r = document.createRange();\n r[toLeft ? 'setEnd' : 'setStart'](node, offset);\n\n if(fromSelectionChange) {\n move(toLeft);\n }\n\n const c = this.getCaretPosN();\n if(c.node?.nodeValue === BOM && (!fromSelectionChange || node === this.lastNode)) {\n const idx = this.findPreviousSmthIndex(input, c.node, something);\n\n let moved = !fromSelectionChange;\n\n do {\n const c = this.getCaretPosN();\n const idxidx = this.findPreviousSmthIndex(input, c.node, something);\n r[toLeft ? 'setStart' : 'setEnd'](c.node, c.offset);\n const rangeString = r.toString();\n const onlyBOMs = !NOT_ONLY_BOMS_REG_EXP.test(rangeString);\n this.log('test cursor', rangeString, onlyBOMs, idx, idxidx);\n if(\n onlyBOMs &&\n c.node?.nodeValue === BOM &&\n idxidx === idx &&\n // (idxidx > 1 || c.offset) &&\n // (idxidx < (getFiller(c.node).parentElement.childNodes.length - 2) || c.offset < BOM.length)\n (idxidx || c.offset) &&\n (idxidx < (something.length - 1) || c.offset < BOM.length)\n ) {\n move(toLeft);\n moved = true;\n } else if(!moved) {\n break;\n } else {\n if((!this.getFiller(node as HTMLElement).classList.contains('input-filler-text') && idx !== smthIndex) || c.offset === BOM.length) {\n move(!toLeft);\n }\n\n break;\n }\n } while(true);\n }\n }\n\n private onSelectionChange = (e: Event) => {\n const {input} = this;\n if(!input) {\n this.setSelectionClassName(document.getSelection());\n return;\n }\n\n // return;\n\n // this.log('selectionchange', document.getSelection(), document.getSelection().rangeCount && document.getSelection().getRangeAt(0), getCaretPosN());\n // let {node, offset} = getCaretPos(this.messageInput);\n\n let caret = this.getCaretPosN();\n do {\n const {node, offset, selection, move} = caret;\n\n const nodeValue = node?.nodeValue;\n // if(!nodeValue?.includes(BOM)) {\n if(nodeValue !== BOM || !this.lastNode) {\n break;\n }\n\n // node = getFiller(node);\n\n // const childIndex = whichChild(getFiller(node), true);\n // let toLeft: boolean;\n // // if(node === lastNode) toLeft = lastOffset >= offset;\n // if(node === lastNode) toLeft = lastOffset > offset;\n // else {\n // // toLeft = whichChild(getFiller(lastNode)) > childIndex;\n // toLeft = (lastNode.nodeValue === BOM ? whichChild(getFiller(lastNode), true) : whichChild(findUpAsChild(lastNode as any, getFiller(node).parentElement), true)) > childIndex;\n // }\n\n const toLeft = compareNodes(node, offset, this.lastNode as ChildNode, this.lastOffset) < 0;\n\n // const childNodes = Array.from(node.parentElement.childNodes);\n // if(toLeft) {\n // for(let i = childIndex; i >= 0; --i) {\n // const sibling = childNodes[i];\n // const {textContent} = sibling;\n // for()\n // }\n // }\n\n // {\n // if(toLeft === undefined) {\n // return;\n // }\n\n // const selection = window.getSelection();\n // selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // return;\n // }\n\n // const parent = getFiller(node);\n if(toLeft !== undefined) {\n // let newNode = toLeft ? parent.previousSibling : parent.nextSibling;\n if(selection.isCollapsed) {\n this.superMove(input, caret, toLeft, true);\n\n // if(offset === BOM.length) {\n // newNode = toLeft ? newNode.nextSibling.nextSibling : parent.previousSibling.previousSibling;\n // }\n\n // setCaretAt(newNode);\n } else {\n selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // const range = selection.getRangeAt(0);\n\n // if(toLeft) {\n // newNode = parent.previousSibling.previousSibling.firstChild;\n // const value = newNode.nodeValue;\n // range.setStart(newNode, value?.length);\n // } else {\n // newNode = parent.nextSibling.nextSibling.firstChild;\n // range.setEnd(newNode, 0);\n // }\n }\n }\n\n this.log('selectionchange',\n node,\n offset,\n this.lastNode,\n this.lastOffset,\n node === this.lastNode,\n whichChild(this.getFiller(node)),\n whichChild(this.getFiller(this.lastNode)),\n toLeft,\n selection,\n document.getSelection(),\n document.getSelection().getRangeAt(0),\n node?.parentNode,\n this.lastNode?.parentNode\n );\n\n caret = this.getCaretPosN();\n this.lastNode = node;\n this.lastOffset = offset;\n\n break;\n\n // if(findPreviousSmthIndex(caret.node) !== smthIndex) {\n // break;\n // }\n } while(true);\n\n this.lastNode = this.lastOffset = undefined;\n\n // if(offset === BOM.length) {\n // setCaretAt(parent);\n // } else {\n // setCaretAt(parent.nextSibling);\n // }\n\n this.setSelectionClassName(caret.selection, input);\n };\n\n public restoreSavedRange(input: HTMLElement) {\n const range = this.getSavedRange(input);\n if(!range) {\n return false;\n }\n\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n return true;\n }\n\n public getSavedRange(input: HTMLElement) {\n return this.savedRanges.get(input);\n }\n\n public makeFocused(input: HTMLElement) {\n if(document.activeElement !== input && !this.restoreSavedRange(input)) {\n placeCaretAtEnd(input, false, false);\n }\n }\n\n private fixInsertedLineBreaks(input: HTMLElement) {\n input.querySelectorAll('br').forEach((br) => {\n br.classList.add('br-not-br');\n });\n }\n\n private fixBuggedCaret() {\n const selection = document.getSelection();\n const range = selection.getRangeAt(0);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n public onBeforeInput = (e: Pick) => {\n const {input, log} = this;\n if(!input) {\n return;\n }\n\n const addInputCallback = this.addInputCallback.bind(this, input);\n\n const caretPos = this.getCaretPosN();\n let {node, offset, selection, move} = caretPos;\n log('beforeinput', e, node, offset, selection, caretPos);\n this.lastNode = this.lastOffset = undefined;\n\n if(e.inputType.startsWith('delete')) { // delete current BOM\n addInputCallback(() => {\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.fixInsertedLineBreaks(input);\n });\n\n if(node?.nodeValue === BOM && selection.isCollapsed && e.inputType.includes('deleteContent')) {\n const toLeft = e.inputType.includes('Backward');\n const moveFirst = (offset === BOM.length && toLeft) || (!offset && !toLeft);\n this.superMove(input, caretPos, toLeft, moveFirst);\n // if((offset === BOM.length && toLeft) || (!offset && !toLeft)) {\n // move(toLeft);\n // }\n\n // addInputCallback(() => {\n // removePossibleBOMSiblingsByNode(getFiller(node));\n // });\n\n // if(node.parentNode.childNodes.length === 1) {\n // (node.parentNode as HTMLElement).remove();\n // move(e.inputType.includes('Backward') ? false : true);\n // } else {\n // move(e.inputType.includes('Backward') ? true : false);\n // addInputCallback(() => {\n // move(e.inputType.includes('Backward') ? false : true);\n // });\n // }\n\n // for(let i = 0, length = BOM.length + (direction === 'backward' ? offset : BOM.length - offset); i < length; ++i) {\n // selection.modify('extend', direction, 'character');\n // }\n\n // selection.modify('extend', direction, 'character');\n // selection.modify('extend', direction, 'character');\n\n // selection.deleteFromDocument();\n // e.preventDefault();\n } else {\n // const filler = getFiller(node);\n // if(filler?.classList?.contains('input-filler-text')) {\n // const {previousSibling, nextSibling} = filler;\n // addInputCallback(() => {\n // if(!filler.isConnected) {\n // removePossibleBOMSiblings(previousSibling, nextSibling);\n // }\n // // removeExtraBOMs();\n // // processEmptiedFillers();\n // });\n // }\n // addInputCallback(() => {\n // this.fixInsertedLineBreaks(input);\n // });\n }\n } else if(e.inputType.startsWith('insert')) { // clear current BOM\n if((node as HTMLElement)?.classList?.contains('input-something')/* || (node.textContent === BOM && offset === BOM.length) */) {\n node = node.previousSibling.firstChild;\n const range = selection.getRangeAt(0);\n range.setStart(node, 0);\n range.setEnd(node, 0);\n range.collapse(true);\n // selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n if(node && node.textContent === BOM && offset === BOM.length) {\n // const range = selection.getRangeAt(0);\n // range.setStart(node, 0);\n // range.setEnd(node, 0);\n // range.collapse(true);\n selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n // if(node && node.textContent === BOM && offset === 0) {\n // selection.modify('move', 'forward', 'character');\n // offset = BOM.length;\n // }\n\n if(e.inputType === 'insertLineBreak' || true) {\n // const appendix = 'X';\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // selection.modify('move', 'forward', 'character');\n // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n /* if(node?.nodeValue === BOM) */ {\n // const parent = node.parentElement;\n // parent.contentEditable = 'false';\n // addInputCallback(() => {\n // parent.contentEditable = 'inherit';\n // });\n // node.parentElement.remove();\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // fix case when focused somehow on span instead of text node\n if(node && node.nodeType === node.ELEMENT_NODE) {\n node = node.firstChild;\n log.warn('fixing focus on span');\n }\n\n const isBOM = node?.nodeValue === BOM;\n log('inserting line break', isBOM, node, `\"${node?.nodeValue}\"`, node?.parentElement ? Array.from(node.parentElement.childNodes).slice() : []);\n if(isBOM) {\n // (node as ChildNode).replaceWith(this.messageInput.querySelector('.lol'));\n\n const parentElement = node.parentElement;\n parentElement.classList.replace('input-filler', 'input-filler-text');\n const childNodesLength = parentElement.childNodes.length;\n addInputCallback(() => {\n const newChildNodesLength = parentElement.childNodes.length;\n if(newChildNodesLength > 1/* && newChildNodesLength !== childNodesLength */) {\n log('inserting line break, remove');\n node = Array.from(parentElement.childNodes).find((node) => node.nodeValue === BOM);\n (parentElement as any).t = node;\n // node?.remove();\n\n // const n = parentElement.firstChild;\n // const range = selection.getRangeAt(0);\n // range.setStart(n, n.nodeValue.length);\n // range.setEnd(n, n.nodeValue.length);\n } else if(node.nodeValue !== BOM) {\n log('inserting line break, deleteData');\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // node = document.createTextNode(BOM);\n }\n\n this.fixInsertedLineBreaks(input);\n // (parentElement as any).t = node;\n // node.remove();\n });\n // addInputCallback(() => {\n // node.parentElement.classList.replace('input-filler', 'input-filler3');\n // const s = document.createElement('span');\n // s.style.display = 'none';\n // node.replaceWith(s);\n // s.prepend(node);\n // });\n } else if(e.inputType === 'insertLineBreak') {\n addInputCallback(() => {\n this.fixInsertedLineBreaks(input);\n });\n // const range = selection.getRangeAt(0);\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }, false);\n }/* else if(node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n\n } */\n\n // if(e.inputType === 'insertLineBreak') {\n // e.preventDefault();\n // document.execCommand('insertHTML', false, '\\n');\n\n // this.messageInputField.simulateInputEvent();\n // }\n\n // node.parentElement.replaceWith(node);\n // selection.removeAllRanges();\n // const range = new Range();\n // range.setStart(node, 0);\n // range.setEnd(node, node.nodeValue.length);\n // selection.addRange(range);\n // node.parentElement.classList.remove('input-filler');\n // node.parentElement\n }\n\n // document.execCommand('insertHTML', false, '\\n');\n // e.preventDefault();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // if(node?.nodeValue === BOM) {\n // addInputCallback(() => {\n // node.remove();\n // });\n // }\n // this.messageInputField.simulateInputEvent();\n\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n // });\n return;\n }\n\n if(node?.nodeValue === BOM) {\n // node.nodeValue = ''; // ! will move cursor forward\n // addInputCallback(() => {\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // });\n\n if(e.inputType === 'insertLineBreak') {\n if(offset === BOM.length) {\n selection.modify('move', 'backward', 'character');\n }\n\n // if(offset !== BOM.length) {\n // selection.modify('move', 'forward', 'character');\n // }\n\n addInputCallback(() => {\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n\n setTimeout(() => {\n selection.modify('move', 'forward', 'character');\n }, 0);\n });\n }\n\n // node.parentElement.replaceWith(node);\n\n // node.parentElement.replaceWith(node);\n if(e.inputType === 'insertLineBreak') {\n // const previousParentSibling = node.parentNode.previousSibling;\n // addInputCallback(() => {\n // if(previousParentSibling.nextSibling.nodeValue === '\\n') {\n // previousParentSibling.nextSibling.remove();\n\n // setTimeout(() => {\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // }, 0);\n // } else {\n // previousParentSibling.nextSibling.nodeValue = previousParentSibling.nextSibling.nodeValue.replace('\\n\\n', '\\n');\n // }\n // });\n } else {\n // if(node.parentElement !== this.messageInput) {\n // node.parentElement.replaceWith(node);\n // }\n\n // setTimeout(() => {\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // node.nodeValue = node.nodeValue.replace(BOM, '');\n // // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // }, 1000);\n\n addInputCallback(() => {\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n if(!node.nodeValue) {\n node.remove();\n }\n\n // selection.modify('move', 'forward', 'character');\n });\n }\n\n if(selection.isCollapsed && false) {\n node.parentElement.replaceWith(node);\n // const textNode = document.createTextNode(BOM);\n // (node.parentNode as any as ChildNode).after(textNode);\n // setCaretAt(textNode.nextSibling);\n // selection.modify('move', 'forward', 'character');\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n // selection.collapseToEnd();\n\n // addInputCallback(() => {\n // (textNode as CharacterData).deleteData(textNode.nodeValue.indexOf(BOM), BOM.length);\n // node.parentElement.remove();\n // });\n }\n } else if(e.inputType === 'insertLineBreak' &&\n node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n log('inserting line break');\n // const appendix = '\\x01';\n\n input.querySelectorAll('.input-something').forEach((el) => {\n el.contentEditable = 'inherit';\n });\n addInputCallback(() => {\n input.querySelectorAll('.input-something').forEach((el) => {\n el.contentEditable = 'false';\n });\n });\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // const offset = node.nodeValue.length;\n // (node as CharacterData).insertData(offset, appendix);\n // addInputCallback(() => {\n // selection.modify('move', 'forward', 'character');\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(appendix), appendix.length);\n // if(!node.nodeValue) {\n // node.remove();\n // }\n // });\n }\n } else if(e.inputType === 'historyUndo') { // have to remove extra BOMs\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.removeEmptyTextNodes(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n\n // lol\n // this.messageInput.querySelectorAll('.has-text').forEach((el) => {\n // if(el.textContent === BOM) {\n // el.firstElementChild.replaceWith(el.firstElementChild.firstChild);\n // el.classList.replace('input-filler3', 'input-filler');\n // }\n // });\n });\n } else if(e.inputType === 'historyRedo') {\n // if(node?.nodeValue === BOM && offset === BOM.length) {\n // selection.modify('move', 'backward', 'character');\n // }\n\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n\n // fix contenteditable attribute\n input.querySelectorAll('.input-something:not([contenteditable])').forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n });\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n\n // // have to ignore line up and down\n if(key === 'ArrowDown' || key === 'ArrowUp') {\n this.lastNode = this.lastOffset = undefined;\n } else {\n const {node, offset} = this.getCaretPosN();\n this.lastNode = node/* getFiller(node) */, this.lastOffset = offset;\n if(this.lastNode === this.input) {\n this.lastNode = this.lastOffset = undefined;\n }\n }\n\n this.log('keydown', this.lastNode, this.lastNode?.parentNode, this.lastOffset, this.getCaretPosN(), e);\n };\n\n private addInputCallback(input: HTMLElement, callback: () => void, capture = true) {\n const newCallback = () => {\n this.log('input modify callback');\n callback();\n };\n\n if(capture && IS_FIREFOX) this.inputCaptureCallbacks.push(newCallback);\n else this.listenerSetter.add(input)('input', newCallback, {once: true, capture});\n }\n\n public removeExtraBOMs(input: HTMLElement) {\n const c = (sibling: ChildNode) => {\n return (sibling as HTMLElement)?.classList?.contains('input-something');\n };\n\n input.querySelectorAll('.input-filler').forEach((el) => {\n const {previousSibling, nextSibling} = el;\n let needed = false;\n\n // if(!(previousSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(previousSibling)) {\n if(!(nextSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(nextSibling)) {\n needed = c(previousSibling) || c(nextSibling);\n }\n\n if(!needed) {\n this.log.warn('removing empty bom node', el);\n el.remove();\n }\n });\n }\n\n private getFiller(node: Node) {\n return node && node.nodeType === node.TEXT_NODE && node.parentElement !== this.input ? node.parentElement : node as HTMLElement;\n }\n\n private getCaretPosN() {\n const ret = getCaretPosNew(this.input);\n // const {node} = ret;\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // ret.node = node.previousSibling;\n // ret.offset = ret.node.textContent.length;\n // }\n\n return {...ret, move: this.move.bind(this, ret.selection)};\n }\n\n private removeEmptyTextNodes(input: HTMLElement) {\n const {log} = this;\n // let i = -1;\n // remove empty text nodes\n const treeWalker = document.createTreeWalker(\n input,\n NodeFilter.SHOW_TEXT,\n {acceptNode: (node) => node.parentElement === input && !node.nodeValue/* && !++i */ ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT}\n );\n\n let textNode: Text;\n while(textNode = treeWalker.nextNode() as Text) {\n log.warn('removing empty text node', textNode);\n textNode.remove();\n }\n }\n\n private removePossibleBOMSiblings(previousSibling: ChildNode, nextSibling: ChildNode) {\n [previousSibling, nextSibling].forEach((sibling) => {\n if((sibling as HTMLElement)?.classList?.contains('input-filler')) {\n sibling.remove();\n }\n });\n }\n\n private removePossibleBOMSiblingsByNode(node: ChildNode) {\n const {previousSibling, nextSibling} = node;\n this.removePossibleBOMSiblings(previousSibling, nextSibling);\n };\n\n private processEmptiedFillers(input: HTMLElement) {\n input.querySelectorAll('.input-filler-text').forEach((el) => {\n this.removeExtraBOMs(el);\n\n let cleanSiblings = true;\n if(!el.textContent) {\n el.classList.replace('input-filler-text', 'input-filler');\n\n const textNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE);\n if(textNode) {\n (textNode as CharacterData).insertData(0, BOM);\n } else if(((el as any).t as ChildNode)?.nodeValue) {\n el.append((el as any).t);\n } else {\n el.append(document.createTextNode(BOM));\n }\n } else if(!NOT_ONLY_BOMS_REG_EXP.test(el.textContent) && !el.querySelector('.input-something')) {\n el.classList.replace('input-filler-text', 'input-filler');\n } else {\n cleanSiblings = false;\n }\n\n if(cleanSiblings) {\n this.removePossibleBOMSiblingsByNode(el);\n }\n });\n }\n\n private processFilledFillers(input: HTMLElement) {\n // remove the BOM when changing to text\n input.querySelectorAll('.input-filler').forEach((el) => {\n if(el.textContent !== BOM) {\n el.classList.replace('input-filler', 'input-filler-text');\n const t = (el as any).t as ChildNode;\n const bomNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE && node.nodeValue.includes(BOM));\n if(bomNode && !t?.nodeValue) {\n const idx = bomNode.nodeValue.indexOf(BOM);\n if(idx !== -1) {\n (bomNode as CharacterData).deleteData(idx, BOM.length);\n }\n }\n\n // t?.remove();\n }\n });\n }\n\n private setSelectionClassName(selection: Selection, input?: HTMLElement) {\n // Array.from(this.messageInput.querySelectorAll('.selection')).forEach((element) => {\n // element.classList.remove('selection');\n // });\n\n if(selection.rangeCount) {\n const range = selection.getRangeAt(0);\n\n if(input) {\n Array.from(input.querySelectorAll('.input-selectable')).forEach((element) => {\n element.classList.toggle('selection', !range.collapsed && range.intersectsNode(element));\n });\n } else {\n Array.from(document.querySelectorAll('.input-selectable.selection')).forEach((element) => element.classList.remove('selection'));\n }\n }\n }\n\n private move(selection: Selection, left: boolean) {\n const {focusNode: focusNodeBefore, focusOffset: focusOffsetBefore} = selection;\n selection.modify('extend', left ? 'backward' : 'forward', 'character');\n // if(offset === nodeValue.length) {\n // selection.modify('extend', !left ? 'backward' : 'forward', 'character');\n // }\n if(left) selection.collapseToStart();\n else selection.collapseToEnd();\n const {focusNode: focusNodeAfter, focusOffset: focusOffsetAfter} = selection;\n this.log(\n 'moving cursor',\n left,\n focusNodeBefore,\n focusNodeBefore.nodeType === focusNodeBefore.ELEMENT_NODE ? focusNodeBefore : focusNodeBefore.parentElement,\n focusOffsetBefore,\n focusNodeAfter,\n focusNodeAfter.nodeType === focusNodeAfter.ELEMENT_NODE ? focusNodeAfter : focusNodeAfter.parentElement,\n focusOffsetAfter\n );\n }\n\n public prepareApplyingMarkdown() {\n const {input} = this;\n\n // do not wrap fillers into spans\n const fillers = input.querySelectorAll('.input-filler');\n // fillers.forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n const smths = input.querySelectorAll('.input-something');\n smths.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n return () => {\n fillers.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n smths.forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n };\n }\n\n public static getInstance() {\n return this.INSTANCE ??= new RichInputHandler();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ScrollableBase} from '../../components/scrollable';\nimport SwipeHandler from '../../components/swipeHandler';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport rootScope from '../../lib/rootScope';\nimport {Middleware} from '../middleware';\nimport clamp from '../number/clamp';\nimport safeAssign from '../object/safeAssign';\nimport pause from '../schedulers/pause';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent} from './clickEvent';\nimport findUpAsChild from './findUpAsChild';\nimport positionElementByIndex from './positionElementByIndex';\nimport whichChild from './whichChild';\n\nexport default class Sortable {\n private element: HTMLElement;\n private elementRect: DOMRect;\n private containerRect: DOMRect;\n private scrollableRect: DOMRect;\n private minY: number;\n private maxY: number;\n private siblings: HTMLElement[];\n private swipeHandler: SwipeHandler;\n private startScrollPos: number;\n private addScrollPos: number;\n\n private list: HTMLElement;\n private middleware: Middleware;\n private onSort: (prevIdx: number, newIdx: number) => void;\n private scrollable: ScrollableBase;\n\n constructor(options: {\n list: HTMLElement,\n middleware: Middleware,\n onSort: Sortable['onSort'],\n scrollable?: Sortable['scrollable']\n }) {\n safeAssign(this, options);\n\n this.swipeHandler = new SwipeHandler({\n element: this.list,\n onSwipe: this.onSwipe,\n verifyTouchTarget: this.verifyTouchTarget,\n onStart: this.onStart,\n onReset: this.onReset,\n setCursorTo: document.body,\n middleware: this.middleware,\n withDelay: true\n });\n }\n\n private onSwipe = (xDiff: number, yDiff: number) => {\n yDiff = clamp(yDiff, this.minY, this.maxY);\n this.element.style.transform = `translateY(${yDiff}px)`;\n const count = Math.round(Math.abs(yDiff) / this.elementRect.height);\n const lastSiblings = this.siblings;\n this.siblings = [];\n const property = yDiff < 0 ? 'previousElementSibling' : 'nextElementSibling';\n let sibling = this.element[property] as HTMLElement;\n for(let i = 0; i < count; ++i) {\n if(this.getSortableTarget(sibling)) {\n this.siblings.push(sibling);\n sibling = sibling[property] as HTMLElement;\n } else {\n break;\n }\n }\n\n (lastSiblings || []).forEach((sibling) => {\n if(!this.siblings.includes(sibling)) {\n sibling.style.transform = '';\n }\n });\n\n this.siblings.forEach((sibling) => {\n const y = this.elementRect.height * (yDiff < 0 ? 1 : -1);\n sibling.style.transform = `translateY(${y}px)`;\n });\n\n if(this.scrollableRect) {\n const diff = yDiff;\n const toEnd = diff > 0;\n const elementEndPos = toEnd ? this.elementRect.bottom : this.elementRect.top;\n const clientY = elementEndPos + diff - this.addScrollPos;\n // console.log(clientY, this.scrollableRect.top, elementEndPos, diff, this.addScrollPos, toEnd);\n let change = 2;\n if((clientY + (toEnd ? 0 : this.elementRect.height)) >= this.scrollableRect.bottom/* && diff < this.maxY */) {\n\n } else if((clientY - (toEnd ? this.elementRect.height : 0)) <= this.scrollableRect.top/* && diff > this.minY */) {\n change *= -1;\n } else {\n change = undefined;\n }\n\n if(change !== undefined) {\n this.scrollable.container[this.scrollable.scrollProperty] += change;\n }\n }\n };\n\n private verifyTouchTarget = (e: {target: EventTarget}) => {\n if(this.list.classList.contains('is-reordering')) {\n return false;\n }\n\n this.element = this.getSortableTarget(e.target as HTMLElement);\n return !!this.element/* && pause(150).then(() => true) */;\n };\n\n private onScroll = () => {\n const scrollPos = this.scrollable.container[this.scrollable.scrollProperty];\n const diff = this.addScrollPos = scrollPos - this.startScrollPos;\n const isVertical = this.scrollable.scrollProperty === 'scrollTop';\n this.swipeHandler.add(isVertical ? 0 : diff, isVertical ? diff : 0);\n };\n\n private onStart = () => {\n this.list.classList.add('is-reordering');\n this.element.classList.add('is-dragging', 'no-transition');\n this.swipeHandler.setCursor('grabbing');\n this.elementRect = this.element.getBoundingClientRect();\n this.containerRect = this.list.getBoundingClientRect();\n\n this.minY = this.containerRect.top - this.elementRect.top;\n this.maxY = this.containerRect.bottom - this.elementRect.bottom;\n this.addScrollPos = 0;\n\n if(this.scrollable) {\n this.startScrollPos = this.scrollable.container[this.scrollable.scrollProperty];\n this.scrollableRect = this.scrollable.container.getBoundingClientRect();\n this.scrollable.container.addEventListener('scroll', this.onScroll);\n }\n };\n\n private onReset = async() => {\n const length = this.siblings.length;\n const move = length && length * (this.siblings[0].previousElementSibling === this.element ? 1 : -1);\n const idx = whichChild(this.element);\n const newIdx = idx + move;\n\n this.element.classList.remove('no-transition');\n this.element.style.transform = move ? `translateY(${move * this.elementRect.height}px)` : '';\n this.swipeHandler.setCursor('');\n\n if(this.scrollable) {\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n attachClickEvent(document.body, cancelEvent, {capture: true, once: true});\n }\n\n if(rootScope.settings.animationsEnabled) {\n await pause(250);\n }\n\n this.list.classList.remove('is-reordering');\n this.element.classList.remove('is-dragging');\n positionElementByIndex(this.element, this.list, newIdx, idx);\n [this.element, ...this.siblings].forEach((element) => {\n element.style.transform = '';\n });\n\n this.element =\n this.siblings =\n this.elementRect =\n this.containerRect =\n this.minY =\n this.maxY =\n this.startScrollPos =\n this.addScrollPos =\n undefined;\n\n // cancelClick = true;\n\n if(!move) {\n return;\n }\n\n this.onSort(idx, newIdx);\n };\n\n private getSortableTarget(target: HTMLElement) {\n if(!target) {\n return;\n }\n\n let child = findUpAsChild(target as HTMLElement, this.list);\n if(child && child.classList.contains('cant-sort')) {\n child = undefined;\n }\n\n return child;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\n if(disable) {\n elements.forEach((el) => el.setAttribute('disabled', 'true'));\n } else {\n elements.forEach((el) => el.removeAttribute('disabled'));\n }\n\n return () => toggleDisability(elements, !disable);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function whichChild(elem: Node, countNonElements?: boolean) {\n if(!elem.parentNode) {\n return -1;\n }\n\n if(countNonElements) {\n return Array.from(elem.parentNode.childNodes).indexOf(elem as ChildNode);\n }\n\n let i = 0;\n // @ts-ignore\n while((elem = elem.previousElementSibling) !== null) ++i;\n return i;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent, detachClickEvent} from './dom/clickEvent';\nimport findUpAsChild from './dom/findUpAsChild';\nimport EventListenerBase from './eventListenerBase';\nimport ListenerSetter from './listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport safeAssign from './object/safeAssign';\nimport appNavigationController, {NavigationItem} from '../components/appNavigationController';\nimport findUpClassName from './dom/findUpClassName';\nimport rootScope from '../lib/rootScope';\n\nconst KEEP_OPEN = false;\nconst TOGGLE_TIMEOUT = 200;\nconst ANIMATION_DURATION = 200;\n\nexport type IgnoreMouseOutType = 'click' | 'menu' | 'popup';\ntype DropdownHoverTimeoutType = 'toggle' | 'done';\n\nexport default class DropdownHover extends EventListenerBase<{\n open: () => Promise | void,\n openAfterLayout: () => void,\n opened: () => any,\n close: () => any,\n closed: () => any\n}> {\n protected element: HTMLElement;\n protected forceClose: boolean;\n protected inited: boolean;\n protected ignoreMouseOut: Set;\n protected ignoreButtons: Set;\n protected navigationItem: NavigationItem;\n protected ignoreOutClickClassName: string;\n protected timeouts: {[type in DropdownHoverTimeoutType]?: number};\n\n constructor(options: {\n element: DropdownHover['element'],\n ignoreOutClickClassName?: string\n }) {\n super(false);\n safeAssign(this, options);\n this.forceClose = false;\n this.inited = false;\n this.ignoreMouseOut = new Set();\n this.ignoreButtons = new Set();\n this.timeouts = {};\n }\n\n public attachButtonListener(\n button: HTMLElement,\n listenerSetter: ListenerSetter\n ) {\n let firstTime = true;\n if(IS_TOUCH_SUPPORTED) {\n attachClickEvent(button, () => {\n if(firstTime) {\n firstTime = false;\n this.toggle(true);\n } else {\n this.toggle();\n }\n }, {listenerSetter});\n } else {\n listenerSetter.add(button)('mouseover', (e) => {\n if(firstTime) {\n listenerSetter.add(button)('mouseout', (e) => {\n this.clearTimeout('toggle');\n this.onMouseOut(e);\n });\n firstTime = false;\n }\n\n this.setTimeout('toggle', () => {\n this.toggle(true);\n }, TOGGLE_TIMEOUT);\n });\n\n attachClickEvent(button, () => {\n const type: IgnoreMouseOutType = 'click';\n const ignore = !this.ignoreMouseOut.has(type);\n\n if(ignore && !this.ignoreMouseOut.size) {\n this.ignoreButtons.add(button);\n setTimeout(() => {\n attachClickEvent(window, this.onClickOut, {capture: true});\n }, 0);\n }\n\n this.setIgnoreMouseOut(type, ignore);\n this.toggle(ignore);\n }, {listenerSetter});\n }\n }\n\n protected onClickOut = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if(\n !findUpAsChild(target, this.element) &&\n !Array.from(this.ignoreButtons).some((button) => findUpAsChild(target, button) || target === button) &&\n this.ignoreMouseOut.size <= 1 &&\n (!this.ignoreOutClickClassName || !findUpClassName(target, this.ignoreOutClickClassName))\n ) {\n this.toggle(false);\n }\n };\n\n protected onMouseOut = (e: MouseEvent) => {\n if(KEEP_OPEN || !this.isActive()) return;\n this.clearTimeout('toggle');\n\n if(this.ignoreMouseOut.size) {\n return;\n }\n\n const toElement = (e as any).toElement as HTMLElement;\n if(toElement && findUpAsChild(toElement, this.element)) {\n return;\n }\n\n this.setTimeout('toggle', () => {\n this.toggle(false);\n }, TOGGLE_TIMEOUT);\n };\n\n protected clearTimeout(type: DropdownHoverTimeoutType) {\n if(this.timeouts[type] !== undefined) {\n clearTimeout(this.timeouts[type]);\n delete this.timeouts[type];\n }\n }\n\n protected setTimeout(type: DropdownHoverTimeoutType, cb: () => void, timeout: number) {\n this.clearTimeout(type);\n this.timeouts[type] = window.setTimeout(() => {\n this.clearTimeout(type);\n cb();\n }, timeout);\n }\n\n public init() {\n if(!IS_TOUCH_SUPPORTED) {\n this.element.onmouseout = this.onMouseOut;\n this.element.onmouseover = (e) => {\n if(this.forceClose) {\n return;\n }\n\n // console.log('onmouseover element');\n this.clearTimeout('toggle');\n };\n }\n }\n\n public toggle = async(enable?: boolean) => {\n // if(!this.element) return;\n const willBeActive = (!!this.element.style.display && enable === undefined) || enable;\n if(this.init) {\n if(willBeActive) {\n this.init();\n this.init = null;\n } else {\n return;\n }\n }\n\n if(willBeActive === this.isActive()) {\n return;\n }\n\n const delay = IS_TOUCH_SUPPORTED || !rootScope.settings.animationsEnabled ? 0 : ANIMATION_DURATION;\n if((this.element.style.display && enable === undefined) || enable) {\n const res = this.dispatchResultableEvent('open');\n await Promise.all(res);\n\n this.element.style.display = '';\n void this.element.offsetLeft; // reflow\n this.element.classList.add('active');\n\n this.dispatchEvent('openAfterLayout');\n\n appNavigationController.pushItem(this.navigationItem = {\n type: 'dropdown',\n onPop: () => {\n this.toggle(false);\n }\n });\n\n this.clearTimeout('toggle');\n this.setTimeout('done', () => {\n this.forceClose = false;\n this.dispatchEvent('opened');\n }, delay);\n\n // ! can't use together with resizeObserver\n /* if(isTouchSupported) {\n const height = this.element.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\n console.log('[ESG]: toggle: enable height', height);\n appImManager.chat.bubbles.scrollable.scrollTop += height;\n } */\n\n /* if(touchSupport) {\n this.restoreScroll();\n } */\n } else {\n this.dispatchEvent('close');\n this.ignoreMouseOut.clear();\n this.ignoreButtons.clear();\n\n this.element.classList.remove('active');\n\n appNavigationController.removeItem(this.navigationItem);\n detachClickEvent(window, this.onClickOut, {capture: true});\n\n this.clearTimeout('toggle');\n this.setTimeout('done', () => {\n this.element.style.display = 'none';\n this.forceClose = false;\n this.dispatchEvent('closed');\n }, delay);\n\n /* if(isTouchSupported) {\n const scrollHeight = this.container.scrollHeight;\n if(scrollHeight) {\n const height = this.container.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\n appImManager.chat.bubbles.scrollable.scrollTop -= height;\n }\n } */\n\n /* if(touchSupport) {\n this.restoreScroll();\n } */\n }\n\n // animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n };\n\n public isActive() {\n return this.element.classList.contains('active');\n }\n\n public setIgnoreMouseOut(type: IgnoreMouseOutType, ignore: boolean) {\n ignore ? this.ignoreMouseOut.add(type) : this.ignoreMouseOut.delete(type);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's fastSmoothScroll slightly patched\n\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\nimport {fastRafPromise} from './schedulers';\nimport {animateSingle, cancelAnimationByKey} from './animation';\nimport rootScope from '../lib/rootScope';\nimport isInDOM from './dom/isInDOM';\n\nconst MIN_JS_DURATION = 250;\nconst MAX_JS_DURATION = 600;\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n};\n\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\nexport type ScrollGetElementPositionCallback = (options: {elementRect: DOMRect, containerRect: DOMRect, elementPosition: number}) => number;\nexport type ScrollStartCallbackDimensions = {\n scrollSize: number,\n scrollPosition: number,\n distanceToEnd: number,\n path: number,\n duration: number,\n containerRect: DOMRect,\n elementRect: DOMRect,\n getProgress: () => number\n};\n\nexport type ScrollOptions = {\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin?: number,\n maxDistance?: number,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n axis?: 'x' | 'y',\n getNormalSize?: ScrollGetNormalSizeCallback,\n getElementPosition?: ScrollGetElementPositionCallback,\n fallbackToElementStartWhenCentering?: HTMLElement,\n startCallback?: (dimensions: ScrollStartCallbackDimensions) => void,\n transitionFunction?: (value: number) => number\n};\n\nexport default function fastSmoothScroll(options: ScrollOptions) {\n options.margin ??= 0;\n options.maxDistance ??= LONG_TRANSITION_MAX_DISTANCE;\n options.axis ??= 'y';\n // return;\n\n if(!rootScope.settings.animationsEnabled || options.forceDuration === 0) {\n options.forceDirection = FocusDirection.Static;\n }\n\n if(options.forceDirection === FocusDirection.Static) {\n options.forceDuration = 0;\n return scrollWithJs(options);\n /* return Promise.resolve();\n\n element.scrollIntoView({ block: position });\n\n cancelAnimationByKey(container);\n return Promise.resolve(); */\n }\n\n const promise = fastRafPromise().then(() => scrollWithJs(options));\n\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\n}\n\nfunction scrollWithJs(options: ScrollOptions): Promise {\n const {element, container, getNormalSize, getElementPosition, transitionFunction, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\n if(!isInDOM(element)) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n\n const rectStartKey = axis === 'y' ? 'top' : 'left';\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\n const sizeKey = axis === 'y' ? 'height' : 'width';\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\n const elementScrollSizeKey = axis === 'y' ? 'scrollHeight' : 'offsetWidth'; // can use offsetWidth for X, since it's almost same as scrollWidth\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n // const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const elementRect = element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\n\n // const transformable = container.firstElementChild as HTMLElement;\n\n const possibleElementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\n const elementPosition = getElementPosition ? getElementPosition({elementRect, containerRect, elementPosition: possibleElementPosition}) : possibleElementPosition;\n const elementSize = element[elementScrollSizeKey]; // margin is exclusive in DOMRect\n\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\n\n let scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n /* const elementPosition = element.offsetTop;\n const elementSize = element.offsetHeight;\n\n const scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n const containerSize = container.offsetHeight; */\n\n let path!: number;\n\n switch(position) {\n case 'start':\n path = elementPosition - margin;\n break;\n case 'end':\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n if(elementSize < containerSize) {\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\n } else {\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\n options.element = options.fallbackToElementStartWhenCentering;\n options.position = 'start';\n return scrollWithJs(options);\n }\n\n path = elementPosition - margin;\n }\n\n break;\n }\n /* switch (position) {\n case 'start':\n path = (elementPosition - margin) - scrollPosition;\n break;\n case 'end':\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementSize < containerSize\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\n : (elementPosition - margin) - scrollPosition;\n break;\n } */\n\n if(Math.abs(path - (margin || 0)) < 1) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n\n if(axis === 'y') {\n if(forceDirection === undefined) {\n if(path > maxDistance) {\n scrollPosition = container.scrollTop += path - maxDistance;\n path = maxDistance;\n } else if(path < -maxDistance) {\n scrollPosition = container.scrollTop += path + maxDistance;\n path = -maxDistance;\n }\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\n } */\n }\n\n // console.log('scrollWithJs: will scroll path:', path, element);\n\n /* let existsTransform = 0;\n const currentTransform = transformable.style.transform;\n if(currentTransform) {\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\n //path += existsTransform;\n } */\n\n if(path < 0) {\n const remainingPath = -scrollPosition;\n path = Math.max(path, remainingPath);\n } else if(path > 0) {\n const remainingPath = scrollSize - (scrollPosition + containerSize);\n path = Math.min(path, remainingPath);\n }\n\n const target = container[scrollPositionKey] + path;\n const absPath = Math.abs(path);\n const duration = forceDuration ?? (\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\n );\n const startAt = Date.now();\n\n /* transformable.classList.add('no-transition');\n\n const tickTransform = () => {\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const currentPath = path * transition(t);\n\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\n container.dataset.translate = '' + -currentPath;\n\n const willContinue = t < 1;\n if(!willContinue) {\n fastRaf(() => {\n delete container.dataset.transform;\n container.dataset.transform = '';\n transformable.style.transform = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n container[scrollPositionKey] = Math.round(target);\n });\n }\n\n return willContinue;\n };\n\n return animateSingle(tickTransform, container); */\n\n /* return new Promise((resolve) => {\n fastRaf(() => {\n transformable.style.transform = '';\n transformable.style.transition = '';\n\n setTimeout(resolve, duration);\n });\n });\n\n const transformableHeight = transformable.scrollHeight;\n //transformable.style.minHeight = `${transformableHeight}px`;\n */\n\n const transition = transitionFunction ?? (absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition);\n const getProgress = () => duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const tick = () => {\n const t = getProgress();\n const value = transition(t);\n const currentPath = path * (1 - value);\n container[scrollPositionKey] = Math.round(target - currentPath);\n\n return t < 1;\n };\n\n if(!duration || !path) {\n cancelAnimationByKey(container);\n tick();\n return Promise.resolve();\n }\n\n /* return new Promise((resolve) => {\n setTimeout(resolve, duration);\n }).then(() => {\n transformable.classList.add('no-transition');\n void transformable.offsetLeft; // reflow\n transformable.style.transform = '';\n transformable.style.transition = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n fastRaf(() => {\n\n container[scrollPositionKey] = Math.round(target);\n //transformable.style.minHeight = ``;\n });\n\n }); */\n\n if(options.startCallback) {\n const distanceToEnd = scrollSize - Math.round(target + container[axis === 'y' ? 'offsetHeight' : 'offsetWidth']);\n options.startCallback({\n scrollSize,\n scrollPosition,\n distanceToEnd,\n path,\n duration,\n containerRect,\n elementRect,\n getProgress\n });\n }\n\n return animateSingle(tick, container);\n}\n\nfunction longTransition(t: number) {\n return 1 - ((1 - t) ** 5);\n}\n\nfunction shortTransition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\n\nconst FILENAME_JOINER = '_';\n\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\n fileName: string,\n downloadId: string\n}>) {\n const fileName = '';// (options?.fileName || '').split('.');\n const ext = fileName[fileName.length - 1] || '';\n\n let str: string;\n switch(location._) {\n case 'inputPhotoFileLocation': {\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputDocumentFileLocation': {\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputPeerPhotoFileLocation':\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\n break;\n\n case 'inputStickerSetThumb': {\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\n location.stickerset._;\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputFileLocation': {\n str = [location.volume_id, location.local_id].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputWebFileLocation': {\n str = ['webFile', location.url].join(FILENAME_JOINER);\n break;\n }\n\n default: {\n console.error('Unrecognized location:', location);\n str = '';\n break;\n }\n }\n\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\n}\n\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\n // console.log('getFileURL', location);\n // const perf = performance.now();\n const encoded = encodeURIComponent(JSON.stringify(options));\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\n\n return /* '/' + */type + '/' + encoded;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, MessageAction} from '../layer';\nimport type {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport forEachReverse from './array/forEachReverse';\n\nexport default function filterChatPhotosMessages(value: {\n count: number;\n next_rate: number;\n offset_id_offset: number;\n history: MyMessage[];\n}) {\n forEachReverse(value.history, (message, idx, arr) => {\n if(!((message as Message.messageService).action as MessageAction.messageActionChatEditPhoto).photo) {\n arr.splice(idx, 1);\n if(value.count !== undefined) {\n --value.count;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {i18n, LangPackKey} from '../lib/langPack';\n\nexport default function formatBytes(bytes: number, decimals: number | 'auto' = 'auto') {\n if(bytes === 0) return i18n('FileSize.B', [0]);\n\n const strictDecimals = decimals === 'auto';\n\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const _decimals = decimals === 'auto' ? Math.max(0, i - 1) : decimals;\n\n const dm = Math.max(0, _decimals);\n const sizes: LangPackKey[] = ['FileSize.B', 'FileSize.KB', 'FileSize.MB', 'FileSize.GB'];\n\n const fixed = (bytes / Math.pow(k, i)).toFixed(dm);\n return i18n(sizes[i], [strictDecimals ? fixed : parseFloat(fixed)]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport I18n, {i18n, join, LangPackKey} from '../lib/langPack';\nimport formatDuration, {DurationType} from './formatDuration';\n\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\n s: 'Seconds',\n m: 'Minutes',\n h: 'Hours',\n d: 'Days',\n w: 'Weeks',\n mm: 'Months',\n y: 'Years'\n};\nexport default function formatCallDuration(duration: number, plain?: boolean) {\n const a = formatDuration(duration, 2);\n if(plain) {\n const strings = a.map((d) => I18n.format(CALL_DURATION_LANG_KEYS[d.type], true, [d.duration]));\n return join(strings, false, plain);\n }\n\n const elements = a.map((d) => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\n\n const fragment = document.createElement('span');\n fragment.append(...join(elements, false));\n\n return fragment;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type DurationType = 's' | 'm' | 'h' | 'd' | 'w' | 'mm' | 'y';\nexport default function formatDuration(duration: number, showLast = 2) {\n if(!duration) {\n duration = 1;\n }\n\n const d: {duration: number, type: DurationType}[] = [];\n const p = [\n {m: 1, t: 's'},\n {m: 60, t: 'm'},\n {m: 60, t: 'h'},\n {m: 24, t: 'd'},\n {m: 7, t: 'w'}\n ] as Array<{m?: number, t: DurationType}>\n const s = 1;\n let t = s;\n p.forEach((o, idx) => {\n t = Math.round(t * o.m);\n\n if(duration < t) {\n return;\n }\n\n let dd = duration / t;\n if(idx !== (p.length - 1)) {\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\n dd %= modulus;\n }\n\n d.push({\n duration: dd | 0,\n type: o.t\n });\n });\n\n const out = d.slice(-showLast).reverse();\n for(let i = out.length - 1; i >= 0; --i) {\n if(out[i].duration === 0) {\n out.splice(i, 1);\n }\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport I18n from '../lib/langPack';\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n\n if(!prefixes.size) {\n I18n.countriesList.forEach((country) => {\n country.country_codes.forEach((code) => {\n if(code.prefixes) {\n code.prefixes.forEach((prefix) => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n const phoneCode = str.slice(0, maxPrefixLength);\n\n // //console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n\n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str,\n country: undefined,\n code: undefined,\n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n\n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k]) {\n patternMatches += 1.01;\n } else if(_pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n\n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n\n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {RLottieColor} from '../lib/rlottie/rlottiePlayer';\n\nexport type FramesCacheMap = Map;\nexport type FramesCacheMapNew = Map;\nexport type FramesCacheMapURLs = Map;\nexport type FramesCacheItem = {\n frames: FramesCacheMap,\n framesNew: FramesCacheMapNew,\n framesURLs: FramesCacheMapURLs,\n clearCache: () => void,\n counter: number\n};\n\nexport class FramesCache {\n private cache: Map;\n\n constructor() {\n this.cache = new Map();\n }\n\n public static createCache(): FramesCacheItem {\n const cache: FramesCacheItem = {\n frames: new Map(),\n framesNew: new Map(),\n framesURLs: new Map(),\n clearCache: () => {\n cache.framesNew.forEach((value) => {\n (value as ImageBitmap).close?.();\n });\n\n cache.frames.clear();\n cache.framesNew.clear();\n cache.framesURLs.clear();\n },\n counter: 0\n };\n\n return cache;\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = FramesCache.createCache());\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache;\n }\n\n public releaseCache(name: string) {\n const cache = this.cache.get(name);\n if(cache && !--cache.counter) {\n this.cache.delete(name);\n // console.warn('[RLottieCache] released cache', cache);\n }\n }\n\n public getCacheCounter(name: string) {\n const cache = this.cache.get(name);\n return cache?.counter;\n }\n\n public generateName(name: string, width: number, height: number, color: RLottieColor, toneIndex: number) {\n return [\n name,\n width,\n height,\n // color ? rgbaToHexa(color) : ''\n color ? 'colored' : '',\n toneIndex || ''\n ].filter(Boolean).join('-');\n }\n}\n\nconst framesCache = new FramesCache();\n\nexport default framesCache;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// generate a path's arc data parameter\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\n\n// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\nfunction arcParameter(rx: number, ry: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, x: number, y: number) {\n return [rx, ',', ry, ' ',\n xAxisRotation, ' ',\n largeArcFlag, ',',\n sweepFlag, ' ',\n x, ',', y].join('');\n}\n\nexport default function generatePathData(x: number, y: number, width: number, height: number, tl: number, tr: number, br: number, bl: number) {\n const data: string[] = [];\n\n // start point in top-middle of the rectangle\n data.push('M' + (x + width / 2) + ',' + y);\n\n // next we go to the right\n data.push('H' + (x + width - tr));\n\n if(tr > 0) {\n // now we draw the arc in the top-right corner\n data.push('A' + arcParameter(tr, tr, 0, 0, 1, (x + width), (y + tr)));\n }\n\n // next we go down\n data.push('V' + (y + height - br));\n\n if(br > 0) {\n // now we draw the arc in the lower-right corner\n data.push('A' + arcParameter(br, br, 0, 0, 1, (x + width - br), (y + height)));\n }\n\n // now we go to the left\n data.push('H' + (x + bl));\n\n if(bl > 0) {\n // now we draw the arc in the lower-left corner\n data.push('A' + arcParameter(bl, bl, 0, 0, 1, (x + 0), (y + height - bl)));\n }\n\n // next we go up\n data.push('V' + (y + tl));\n\n if(tl > 0) {\n // now we draw the arc in the top-left corner\n data.push('A' + arcParameter(tl, tl, 0, 0, 1, (x + tl), (y + 0)));\n }\n\n // and we close the path\n data.push('Z');\n\n return data.join(' ');\n}\n\nMOUNT_CLASS_TO.generatePathData = generatePathData;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PhotoSize} from '../layer';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {renderImageFromUrlPromise} from './dom/renderImageFromUrl';\nimport getPreviewURLFromThumb from './getPreviewURLFromThumb';\nimport blur from './blur';\n\nexport default function getImageFromStrippedThumb(\n photo: MyPhoto | MyDocument,\n thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize,\n useBlur: boolean\n) {\n const url = getPreviewURLFromThumb(photo, thumb, false);\n\n let element: HTMLImageElement | HTMLCanvasElement, loadPromise: Promise;\n if(!useBlur) {\n element = new Image();\n loadPromise = renderImageFromUrlPromise(element, url);\n } else {\n const result = blur(url);\n element = result.canvas;\n loadPromise = result.promise;\n }\n\n element.classList.add('thumbnail');\n\n return {image: element, loadPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {PhotoSize} from '../layer';\n// import appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport getPreviewURLFromBytes from './bytes/getPreviewURLFromBytes';\n\nexport default function getPreviewURLFromThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, isSticker = false) {\n // const cacheContext = appDownloadManager.getCacheContext(photo, thumb.type);\n // return cacheContext.url || (cacheContext.url = getPreviewURLFromBytes(thumb.bytes, isSticker));\n return getPreviewURLFromBytes(thumb.bytes, isSticker);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {THUMB_TYPE_FULL} from '../lib/mtproto/mtproto_config';\nimport type {ThumbCache} from '../lib/storages/thumbs';\nimport getImageFromStrippedThumb from './getImageFromStrippedThumb';\n\nexport default function getStrippedThumbIfNeeded(photo: MyPhoto | MyDocument, cacheContext: ThumbCache, useBlur: boolean, ignoreCache = false) {\n const isVideo = (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type);\n if(!cacheContext.downloaded || isVideo || ignoreCache) {\n if(\n photo._ === 'document' &&\n cacheContext.downloaded &&\n !ignoreCache &&\n (!isVideo || cacheContext.type !== THUMB_TYPE_FULL)\n ) {\n return null;\n }\n\n const sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs;\n const thumb = sizes?.length ? sizes.find((size) => size._ === 'photoStrippedSize') : null;\n if(thumb && ('bytes' in thumb)) {\n return getImageFromStrippedThumb(photo, thumb as any, useBlur);\n }\n }\n\n return null;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from './array/forEachReverse';\nimport safeAssign from './object/safeAssign';\n\nexport type ListLoaderOptions = {\n loadMore: ListLoader['loadMore'],\n loadCount?: ListLoader['loadCount'],\n loadWhenLeft?: ListLoader['loadWhenLeft'],\n processItem?: ListLoader['processItem'],\n onJump?: ListLoader['onJump'],\n onLoadedMore?: ListLoader['onLoadedMore']\n};\n\nexport type ListLoaderResult = {count: number, items: any[]};\nexport default class ListLoader {\n public current: T;\n public previous: T[] = [];\n public next: T[] = [];\n public count: number;\n public reverse = false; // reverse means next = higher msgid\n\n protected loadMore: (anchor: T, older: boolean, loadCount: number) => Promise>;\n protected processItem: (item: P) => T | Promise;\n protected loadCount = 50;\n protected loadWhenLeft = 20;\n\n public onJump: (item: T, older: boolean) => void;\n public onLoadedMore: () => void;\n\n protected loadedAllUp = false;\n protected loadedAllDown = false;\n protected loadPromiseUp: Promise;\n protected loadPromiseDown: Promise;\n\n constructor(options: ListLoaderOptions) {\n safeAssign(this, options);\n }\n\n public setTargets(previous: T[], next: T[], reverse: boolean) {\n this.previous = previous;\n this.next = next;\n this.reverse = reverse;\n }\n\n public get index() {\n return this.count !== undefined ? this.previous.length : -1;\n }\n\n /* public filter(callback: (item: T, idx: number, arr: T[]) => boolean) {\n const filter = (item: T, idx: number, arr: T[]) => {\n if(!callback(item, idx, arr)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n } */\n\n public reset(loadedAll = false) {\n this.current = undefined;\n this.previous = [];\n this.next = [];\n this.setLoaded(true, loadedAll);\n this.setLoaded(false, loadedAll);\n }\n\n public go(length: number, dispatchJump = true) {\n let items: T[], item: T;\n if(length > 0) {\n items = this.next.splice(0, length);\n item = items.pop();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.unshift(this.current);\n this.previous.push(...items);\n } else {\n items = this.previous.splice(Math.max(0, this.previous.length + length), -length);\n item = items.shift();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.push(this.current);\n this.next.unshift(...items);\n }\n\n if(this.next.length < this.loadWhenLeft) {\n this.load(!this.reverse);\n }\n\n if(this.previous.length < this.loadWhenLeft) {\n this.load(this.reverse);\n }\n\n this.current = item;\n dispatchJump && this.onJump && this.onJump(item, length > 0);\n return this.current;\n }\n\n protected unsetCurrent(toPrevious: boolean) {\n if(toPrevious) this.previous.push(this.current);\n else this.next.unshift(this.current);\n\n this.current = undefined;\n }\n\n public goUnsafe(length: number, dispatchJump?: boolean) {\n const leftLength = length > 0 ? Math.max(0, length - this.next.length) : Math.min(0, length + this.previous.length);\n const item = this.go(length, leftLength ? false : dispatchJump);\n\n /* if(length > 0 ? this.loadedAllUp : this.loadedAllDown) {\n this.unsetCurrent(length > 0);\n } */\n\n return {\n item: !leftLength ? item : undefined,\n leftLength\n };\n }\n\n protected setLoaded(down: boolean, value: boolean) {\n const isChanged = (down ? this.loadedAllDown : this.loadedAllUp) !== value;\n if(!isChanged) {\n return false;\n }\n\n if(down) this.loadedAllDown = value;\n else this.loadedAllUp = value;\n\n if(!value) {\n if(down) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n }\n\n return true;\n }\n\n // нет смысла делать проверку для reverse и loadMediaPromise\n public load(older: boolean) {\n if(older ? this.loadedAllDown : this.loadedAllUp) return Promise.resolve();\n\n let promise = older ? this.loadPromiseDown : this.loadPromiseUp;\n if(promise) return promise;\n\n let anchor: T;\n if(older) {\n anchor = this.reverse ? this.previous[0] : this.next[this.next.length - 1];\n } else {\n anchor = this.reverse ? this.next[this.next.length - 1] : this.previous[0];\n }\n\n anchor ??= this.current;\n promise = this.loadMore(anchor, older, this.loadCount).then(async(result) => {\n if((older ? this.loadPromiseDown : this.loadPromiseUp) !== promise) {\n return;\n }\n\n if(result.items.length < this.loadCount) {\n this.setLoaded(older, true);\n }\n\n if(this.count === undefined) {\n this.count = result.count || result.items.length;\n }\n\n const processedArr: (Promise | any)[] = [];\n const method = older ? result.items.forEach.bind(result.items) : forEachReverse.bind(null, result.items);\n method((item: any) => {\n const processed = this.processItem ? this.processItem(item) : item;\n\n if(!processed) return;\n processedArr.push(processed);\n });\n\n const results = await Promise.all(processedArr);\n if(older) {\n if(this.reverse) this.previous.unshift(...results);\n else this.next.push(...results);\n } else {\n if(this.reverse) this.next.push(...results);\n else this.previous.unshift(...results);\n }\n\n this.onLoadedMore && this.onLoadedMore();\n }, () => {}).then(() => {\n if(older) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n });\n\n if(older) this.loadPromiseDown = promise;\n else this.loadPromiseUp = promise;\n\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type EventListenerBase from './eventListenerBase';\n\nexport type Listener = {\n element: ListenerElement,\n event: ListenerEvent,\n callback: ListenerCallback,\n options?: ListenerOptions,\n\n onceFired?: true, // will be set only when options.once is set\n onceCallback?: () => void,\n};\n\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\nexport type ListenerEvent = string;\nexport type ListenerCallback = Function;\nexport type ListenerOptions = AddEventListenerOptions;\n\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\n console.log('nu zdarova', name);\n originalAddEventListener.call(this, name, callback, options);\n\n if(options?.ls) {\n return options.ls.addFromElement(this, name, callback as any, options);\n }\n}; */\n\nexport default class ListenerSetter {\n private listeners: Set = new Set();\n\n public add(element: T): T['addEventListener'] {\n return ((event: string, callback: Function, options: ListenerOptions) => {\n const listener: Listener = {element, event, callback, options};\n this.addManual(listener);\n return listener;\n }) as any;\n }\n\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\n const listener: Listener = {element, event, callback, options};\n this.addManual(listener);\n return listener;\n } */\n\n public addManual(listener: Listener) {\n // @ts-ignore\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\n\n if(listener.options?.once) { // remove listener when its called\n listener.onceCallback = () => {\n this.remove(listener);\n listener.onceFired = true;\n };\n\n // @ts-ignore\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\n }\n\n this.listeners.add(listener);\n }\n\n public remove(listener: Listener) {\n if(!listener.onceFired) {\n // @ts-ignore\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\n\n if(listener.onceCallback) {\n // @ts-ignore\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\n }\n }\n\n this.listeners.delete(listener);\n }\n\n public removeManual(\n element: T,\n event: ListenerEvent,\n callback: ListenerCallback,\n options?: ListenerOptions\n ) {\n let listener: Listener;\n for(const _listener of this.listeners) {\n if(_listener.element === element &&\n _listener.event === event &&\n _listener.callback === callback &&\n _listener.options === options) {\n listener = _listener;\n break;\n }\n }\n\n if(listener) {\n this.remove(listener);\n }\n }\n\n public removeAll() {\n this.listeners.forEach((listener) => {\n this.remove(listener);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport calcImageInBox from './calcImageInBox';\n\nexport class MediaSize {\n constructor(public width = 0, public height = width) {\n\n }\n\n public aspect(boxSize: MediaSize, fitted: boolean) {\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\n }\n\n public aspectFitted(boxSize: MediaSize) {\n return this.aspect(boxSize, true);\n }\n\n public aspectCovered(boxSize: MediaSize) {\n return this.aspect(boxSize, false);\n }\n}\n\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\n return new MediaSize(width, height);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport EventListenerBase from './eventListenerBase';\nimport {makeMediaSize, MediaSize} from './mediaSize';\n\ntype MediaTypeSizes = {\n regular: MediaSize,\n webpage: MediaSize,\n album: MediaSize,\n esgSticker: MediaSize,\n animatedSticker: MediaSize,\n staticSticker: MediaSize,\n emojiSticker: MediaSize,\n poll: MediaSize,\n round: MediaSize,\n documentName: MediaSize,\n invoice: MediaSize,\n extendedInvoice: MediaSize,\n customEmoji: MediaSize,\n esgCustomEmoji: MediaSize,\n emojiStatus: MediaSize,\n popupSticker: MediaSize\n};\n\nexport type MediaSizeType = keyof MediaTypeSizes;\n\nexport enum ScreenSize {\n mobile,\n medium,\n large\n}\n\nconst MOBILE_SIZE = 600;\nconst MEDIUM_SIZE = 1275;\nconst LARGE_SIZE = 1680;\n\nconst CUSTOM_EMOJI_SIZE = makeMediaSize(20, 20);\nconst ESG_CUSTOM_EMOJI_SIZE = makeMediaSize(36, 36);\nconst EMOJI_STATUS_SIZE = makeMediaSize(18, 18);\n\nclass MediaSizes extends EventListenerBase<{\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\n resize: () => void\n}> {\n private screenSizes: {key: ScreenSize, value: number}[] = [\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\n {key: ScreenSize.large, value: LARGE_SIZE}\n ];\n\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\n handhelds: {\n regular: makeMediaSize(270, 270),\n webpage: makeMediaSize(270, 200),\n album: makeMediaSize(270, 0),\n esgSticker: makeMediaSize(68, 68),\n animatedSticker: makeMediaSize(180, 180),\n staticSticker: makeMediaSize(180, 180),\n emojiSticker: makeMediaSize(112, 112),\n poll: makeMediaSize(240, 0),\n round: makeMediaSize(200, 200),\n documentName: makeMediaSize(200, 0),\n invoice: makeMediaSize(270, 270),\n extendedInvoice: makeMediaSize(270, 270),\n customEmoji: CUSTOM_EMOJI_SIZE,\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\n emojiStatus: EMOJI_STATUS_SIZE,\n popupSticker: makeMediaSize(68, 68)\n },\n desktop: {\n regular: makeMediaSize(420, 340),\n webpage: makeMediaSize(420, 340),\n album: makeMediaSize(420, 0),\n esgSticker: makeMediaSize(72, 72),\n animatedSticker: makeMediaSize(200, 200),\n staticSticker: makeMediaSize(200, 200),\n emojiSticker: makeMediaSize(112, 112),\n poll: makeMediaSize(330, 0),\n round: makeMediaSize(280, 280),\n documentName: makeMediaSize(240, 0),\n invoice: makeMediaSize(320, 320),\n extendedInvoice: makeMediaSize(420, 340),\n customEmoji: CUSTOM_EMOJI_SIZE,\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\n emojiStatus: EMOJI_STATUS_SIZE,\n popupSticker: makeMediaSize(80, 80)\n }\n };\n\n public isMobile = false;\n public active: MediaTypeSizes;\n public activeScreen: ScreenSize;\n private rAF: number;\n\n constructor() {\n super();\n\n window.addEventListener('resize', () => {\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\n this.rAF = window.requestAnimationFrame(() => {\n this.handleResize();\n this.rAF = 0;\n });\n });\n this.handleResize();\n }\n\n private handleResize = () => {\n const innerWidth = window.innerWidth;\n // this.isMobile = innerWidth <= 720;\n\n let activeScreen = this.screenSizes[0].key;\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\n if(this.screenSizes[i].value < innerWidth) {\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\n break;\n }\n }\n\n const wasScreen = this.activeScreen;\n this.activeScreen = activeScreen;\n this.isMobile = this.activeScreen === ScreenSize.mobile;\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\n\n // console.time('esg');\n // const computedStyle = window.getComputedStyle(document.documentElement);\n // this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\n // console.timeEnd('esg');\n\n if(wasScreen !== activeScreen) {\n // console.log('changeScreen', this.activeScreen, activeScreen);\n\n if(wasScreen !== undefined) {\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\n }\n }\n\n if(wasScreen !== undefined) {\n this.dispatchEvent('resize');\n }\n\n /* if(this.isMobile) {\n for(let i in this.active) {\n // @ts-ignore\n let size = this.active[i];\n size.width = innerWidth\n }\n } */\n };\n}\n\nconst mediaSizes = new MediaSizes();\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\nexport default mediaSizes;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport makeError from './makeError';\n\nconst error = makeError('MIDDLEWARE');\nexport default function middlewarePromise(middleware: () => boolean, throwWhat: any = error) {\n return (promise: T): T => {\n if(!(promise instanceof Promise)) {\n if(promise instanceof Error) {\n throw promise;\n } else {\n return promise;\n }\n }\n\n return (promise as any as Promise).then((result) => {\n if(!middleware()) {\n throw throwWhat;\n }\n\n return result;\n }) as any;\n };\n}\n","export default function clamp(v: number, min: number, max: number): number {\n return v < min ? min : ((v > max) ? max : v);\n}\n","export default function formatNumber(bytes: number, decimals = 2) {\n if(bytes === 0) return '0';\n\n const k = 1000;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['', 'K', 'M', 'B', 'T'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];\n}\n","export default function numberThousandSplitter(x: number, joiner = ' ') {\n const parts = x.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, joiner);\n return parts.join('.');\n}\n","import {IS_APPLE_MOBILE} from '../environment/userAgent';\n\nexport default function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\n return new Promise((resolve, reject) => {\n if(media.readyState >= readyState) {\n resolve();\n return;\n }\n\n const loadEventName = IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay';\n const errorEventName = 'error';\n const onLoad = () => {\n media.removeEventListener(errorEventName, onError);\n resolve();\n };\n const onError = (e: ErrorEvent) => {\n media.removeEventListener(loadEventName, onLoad);\n reject(media.error);\n };\n media.addEventListener(loadEventName, onLoad, {once: true});\n media.addEventListener(errorEventName, onError, {once: true});\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appNavigationController, {NavigationItem} from '../components/appNavigationController';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {IS_MOBILE_SAFARI} from '../environment/userAgent';\nimport cancelEvent from './dom/cancelEvent';\nimport {CLICK_EVENT_NAME} from './dom/clickEvent';\nimport findUpAsChild from './dom/findUpAsChild';\nimport EventListenerBase from './eventListenerBase';\n\nexport default class OverlayClickHandler extends EventListenerBase<{\n toggle: (open: boolean) => void\n}> {\n protected element: HTMLElement;\n protected overlay: HTMLElement;\n protected listenerOptions: AddEventListenerOptions;\n\n constructor(\n protected navigationType: NavigationItem['type'],\n protected withOverlay?: boolean\n ) {\n super(false);\n this.listenerOptions = withOverlay ? {} : {capture: true};\n }\n\n protected onClick = (e: MouseEvent | TouchEvent) => {\n if(this.element && findUpAsChild(e.target as HTMLElement, this.element)) {\n return;\n }\n\n if(this.listenerOptions?.capture) {\n cancelEvent(e);\n }\n\n this.close();\n };\n\n public close() {\n if(this.element) {\n this.overlay?.remove();\n this.element = undefined;\n this.dispatchEvent('toggle', false);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n // window.removeEventListener('keydown', onKeyDown, {capture: true});\n window.removeEventListener('contextmenu', this.onClick, this.listenerOptions);\n }\n\n document.removeEventListener(CLICK_EVENT_NAME, this.onClick, this.listenerOptions);\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n public open(element: HTMLElement) {\n this.close();\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: (canAnimate) => {\n this.close();\n }\n });\n }\n\n this.element = element;\n\n if(!this.overlay && this.withOverlay) {\n this.overlay = document.createElement('div');\n this.overlay.classList.add('btn-menu-overlay');\n\n // ! because this event must be canceled, and can't cancel on menu click (below)\n this.overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n this.onClick(e);\n });\n }\n\n this.overlay && this.element.parentElement.insertBefore(this.overlay, this.element);\n\n // document.body.classList.add('disable-hover');\n\n if(!IS_TOUCH_SUPPORTED) {\n // window.addEventListener('keydown', onKeyDown, {capture: true});\n window.addEventListener('contextmenu', this.onClick, {...this.listenerOptions, once: true});\n }\n\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n onClick(e);\n }); */\n\n // ! safari iOS doesn't handle window click event on overlay, idk why\n document.addEventListener(CLICK_EVENT_NAME, this.onClick, this.listenerOptions);\n\n this.dispatchEvent('toggle', true);\n }\n}\n","import Currencies from '../config/currencies';\n\n// https://stackoverflow.com/a/34141813\nfunction number_format(number: any, decimals: any, dec_point: any, thousands_sep: any): string {\n // Strip all characters but numerical ones.\n number = (number + '').replace(/[^0-9+\\-Ee.]/g, '');\n var n = !isFinite(+number) ? 0 : +number,\n prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),\n sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,\n dec = (typeof dec_point === 'undefined') ? '.' : dec_point,\n s: any = '',\n toFixedFix = function(n: number, prec: number) {\n var k = Math.pow(10, prec);\n return '' + Math.round(n * k) / k;\n };\n // Fix for IE parseFloat(0.55).toFixed(0) = 0;\n s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');\n if(s[0].length > 3) {\n s[0] = s[0].replace(/\\B(?=(?:\\d{3})+(?!\\d))/g, sep);\n }\n if((s[1] || '').length < prec) {\n s[1] = s[1] || '';\n s[1] += new Array(prec - s[1].length + 1).join('0');\n }\n return s.join(dec);\n}\n\nexport default function paymentsWrapCurrencyAmount(amount: number | string, currency: string, skipSymbol?: boolean) {\n amount = +amount;\n\n const isNegative = amount < 0;\n\n const currencyData = Currencies[currency];\n if(!currencyData) {\n throw new Error('CURRENCY_WRAP_INVALID');\n }\n\n const amountExp = amount / Math.pow(10, currencyData.exp);\n\n let decimals = currencyData.exp;\n if(currency == 'IRR' && Math.floor(amountExp) == amountExp) {\n decimals = 0; // у иранцев копейки почти всегда = 0 и не показываются в UI\n }\n\n let formatted = number_format(amountExp, decimals, currencyData.decimal_sep, currencyData.thousands_sep);\n if(skipSymbol) {\n return formatted;\n }\n\n let symbol = currencyData.symbol;\n if(isNegative && !currencyData.space_between && currencyData.symbol_left) {\n symbol = '-' + symbol;\n formatted = formatted.replace('-', '');\n }\n\n let out: string;\n const splitter = currencyData.space_between ? ' ' : '';\n if(currencyData.symbol_left) {\n out = symbol + splitter + formatted;\n } else {\n out = formatted + splitter + symbol;\n }\n return out;\n}\n\n(window as any).p = paymentsWrapCurrencyAmount;\n\n// function paymentsGetCurrencyExp($currency: string) {\n// if($currency == 'CLF') {\n// return 4;\n// }\n// if(['BHD','IQD','JOD','KWD','LYD','OMR','TND'].includes($currency)) {\n// return 3;\n// }\n// if(['BIF','BYR','CLP','CVE','DJF','GNF','ISK','JPY','KMF','KRW','MGA', 'PYG','RWF','UGX','UYI','VND','VUV','XAF','XOF','XPF'].includes($currency)) {\n// return 0;\n// }\n// if($currency == 'MRO') {\n// return 1;\n// }\n// return 2;\n// }\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport mediaSizes from './mediaSizes';\n\nexport type MenuPositionPadding = {\n top?: number,\n right?: number,\n bottom?: number,\n left?: number\n};\n\nconst PADDING_TOP = 8;\nconst PADDING_BOTTOM = PADDING_TOP;\nconst PADDING_LEFT = 8;\nconst PADDING_RIGHT = PADDING_LEFT;\nexport default function positionMenu(e: MouseEvent | Touch | TouchEvent, elem: HTMLElement, side?: 'left' | 'right' | 'center', additionalPadding?: MenuPositionPadding) {\n if((e as TouchEvent).touches) {\n e = (e as TouchEvent).touches[0];\n }\n\n const {pageX, pageY} = e as Touch;\n // let {clientX, clientY} = e;\n\n // * side mean the OPEN side\n\n const getScrollWidthFromElement = (Array.from(elem.children) as HTMLElement[]).find((element) => element.classList.contains('btn-menu-item') && !element.classList.contains('hide')) || elem;\n\n let {scrollWidth: menuWidth} = getScrollWidthFromElement;\n const {scrollHeight: menuHeight} = elem;\n // let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\n const rect = document.body.getBoundingClientRect();\n const windowWidth = rect.width;\n const windowHeight = rect.height;\n\n menuWidth += getScrollWidthFromElement.offsetLeft * 2;\n\n let paddingTop = PADDING_TOP, paddingRight = PADDING_RIGHT, paddingBottom = PADDING_BOTTOM, paddingLeft = PADDING_LEFT;\n if(additionalPadding) {\n if(additionalPadding.top) paddingTop += additionalPadding.top;\n if(additionalPadding.right) paddingRight += additionalPadding.right;\n if(additionalPadding.bottom) paddingBottom += additionalPadding.bottom;\n if(additionalPadding.left) paddingLeft += additionalPadding.left;\n }\n\n side = mediaSizes.isMobile ? 'right' : 'left';\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\n\n const maxTop = windowHeight - menuHeight - paddingBottom;\n const maxLeft = windowWidth - menuWidth - paddingRight;\n const minTop = paddingTop;\n const minLeft = paddingLeft;\n\n const getSides = () => {\n return {\n x: {\n left: pageX,\n right: Math.min(maxLeft, pageX - menuWidth)\n },\n intermediateX: side === 'right' ? minLeft : maxLeft,\n // intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\n y: {\n top: pageY,\n bottom: pageY - menuHeight\n },\n // intermediateY: verticalSide === 'top' ? paddingTop : windowHeight - menuHeight - paddingTop,\n // intermediateY: pageY < (windowHeight / 2) ? paddingTop : windowHeight - menuHeight - paddingBottom,\n intermediateY: maxTop\n };\n };\n\n const sides = getSides();\n\n const possibleSides = {\n x: {\n left: (sides.x.left + menuWidth + paddingRight) <= windowWidth,\n right: sides.x.right >= paddingLeft\n },\n y: {\n top: (sides.y.top + menuHeight + paddingBottom) <= windowHeight,\n bottom: (sides.y.bottom - paddingBottom) >= paddingBottom\n }\n };\n\n /* if(side === undefined) {\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\n side = 'right';\n }\n } */\n\n {\n /* const x = sides.x;\n\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\n if(side) {\n s.findAndSplice((s) => s === side);\n s.unshift(side);\n }\n\n const possibleSide = s.find((s) => possibleSides.x[s]); */\n // let left: number;\n /* if(possibleSide) {\n left = x[possibleSide];\n side = possibleSide;\n } else {\n left = sides.intermediateX;\n side = undefined;\n } */\n const left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\n\n elem.style.left = left + 'px';\n }\n\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\n verticalSide = 'bottom';\n } else {\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\n verticalSide = 'top';\n } */\n\n {\n const top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\n\n elem.style.top = top + 'px';\n }\n\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\n elem.classList.add(\n // (verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\n (verticalSide === 'center' ? verticalSide : 'bottom') +\n '-' +\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\n\n return {\n width: menuWidth,\n height: menuHeight\n };\n}\n","import {RestrictionReason} from '../layer';\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach((reason) => {\n ignore.add(reason);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport rootScope from '../lib/rootScope';\n\nconst savingLottiePreview: {[docId: DocId]: {width: number, height: number}} = {};\n\nexport function isSavingLottiePreview(doc: MyDocument, toneIndex: number, width: number, height: number) {\n const key = doc.id + '-' + toneIndex;\n const saving = savingLottiePreview[key];\n return saving && saving.width >= width && saving.height >= height;\n}\n\nexport async function saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n const {width, height} = canvas;\n if(isSavingLottiePreview(doc, toneIndex, width, height)) {\n return;\n }\n\n const saving = savingLottiePreview[key] = {\n width,\n height\n };\n\n const thumb = await rootScope.managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex);\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n const promise = new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob));\n });\n\n const blob = await promise;\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n // console.log('got lottie preview', doc, blob, URL.createObjectURL(blob));\n\n rootScope.managers.appDocsManager.saveLottiePreview(doc.id, blob, width, height, toneIndex);\n\n // delete savingLottiePreview[key];\n\n /* const reader = new FileReader();\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n const thumb: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: uint8,\n type: 'i'\n };\n\n doc.stickerSavedThumbWidth = canvas.width;\n doc.stickerSavedThumbHeight = canvas.width;\n\n defineNotNumerableProperties(thumb, ['url']);\n thumb.url = URL.createObjectURL(blob);\n doc.thumbs.findAndSplice((t) => t._ === thumb._);\n doc.thumbs.unshift(thumb);\n\n if(!webpWorkerController.isWebpSupported()) {\n doc.pFlags.stickerThumbConverted = true;\n }\n\n delete this.savingLottiePreview[doc.id];\n };\n reader.readAsArrayBuffer(blob); */\n}\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\nimport {fastRaf} from '../schedulers';\nimport throttleWith from './throttleWith';\n\nexport default function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\n\nexport default function throttleWith(schedulerFn: AnyToVoidFunction, 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport safeAssign from './object/safeAssign';\n\nexport default class ScrollableLoader {\n public loading = false;\n private scrollable: Scrollable;\n private getPromise: () => Promise;\n private promise: Promise;\n private loaded = false;\n\n constructor(options: {\n scrollable: ScrollableLoader['scrollable'],\n getPromise: ScrollableLoader['getPromise']\n }) {\n safeAssign(this, options);\n\n options.scrollable.onScrolledBottom = () => {\n this.load();\n };\n }\n\n public load() {\n if(this.loaded) {\n return Promise.resolve();\n }\n\n if(this.loading) {\n return this.promise;\n }\n\n this.loading = true;\n this.promise = this.getPromise().then((done) => {\n this.loading = false;\n this.promise = undefined;\n\n if(done) {\n this.loaded = true;\n this.scrollable.onScrolledBottom = null;\n } else {\n this.scrollable.checkForTriggers();\n }\n }, () => {\n this.promise = undefined;\n this.loading = false;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MediaSearchContext} from '../components/appMediaPlaybackController';\nimport type {SearchSuperContext} from '../components/appSearchSuper.';\nimport type {Message} from '../layer';\nimport type {MessagesStorageKey, MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport incrementMessageId from '../lib/appManagers/utils/messageId/incrementMessageId';\nimport rootScope from '../lib/rootScope';\nimport forEachReverse from './array/forEachReverse';\nimport filterChatPhotosMessages from './filterChatPhotosMessages';\nimport ListLoader, {ListLoaderOptions} from './listLoader';\n\nexport default class SearchListLoader extends ListLoader {\n public searchContext: MediaSearchContext;\n public onEmptied: () => void;\n\n private otherSideLoader: SearchListLoader;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {\n onEmptied?: () => void,\n isInner?: boolean,\n managers?: AppManagers\n } = {}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n const backLimit = older ? 0 : loadCount;\n let maxId = anchor?.mid;\n\n if(maxId === undefined) maxId = this.searchContext.maxId;\n if(!older) maxId = incrementMessageId(maxId, 1);\n\n return this.managers.appMessagesManager.getSearch({\n ...this.searchContext,\n peerId: this.searchContext.peerId || anchor?.peerId,\n maxId,\n limit: backLimit ? 0 : loadCount,\n backLimit\n }).then((value) => {\n /* if(DEBUG) {\n this.log('loaded more media by maxId:', maxId, value, older, this.reverse);\n } */\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n filterChatPhotosMessages(value);\n }\n\n if(value.next_rate) {\n this.searchContext.nextRate = value.next_rate;\n }\n\n return {count: value.count, items: value.history};\n });\n },\n processItem: async(message) => {\n const filtered = await this.filterMids([message.mid]);\n if(!filtered.length) {\n return;\n }\n\n return options.processItem(message);\n }\n });\n\n this.managers ??= rootScope.managers;\n rootScope.addEventListener('history_delete', this.onHistoryDelete);\n rootScope.addEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.addEventListener('message_sent', this.onMessageSent);\n\n if(!options.isInner) {\n this.otherSideLoader = new SearchListLoader({\n ...options,\n isInner: true\n });\n\n // this.otherSideLoader.onLoadedMore = () => {\n\n // };\n }\n }\n\n protected async filterMids(mids: number[]) {\n const storageKey: MessagesStorageKey = `${this.searchContext.peerId}_${this.searchContext.isScheduled ? 'scheduled' : 'history'}`;\n const filtered = (await this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._, mids, storageKey, mids.length)) as Message.message[];\n return filtered;\n }\n\n protected onHistoryDelete = ({peerId, msgs}: {peerId: PeerId, msgs: Set}) => {\n const shouldBeDeleted = (item: Item) => item.peerId === peerId && msgs.has(item.mid);\n const filter = (item: Item, idx: number, arr: Item[]) => {\n if(shouldBeDeleted(item)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n\n if(this.current && shouldBeDeleted(this.current)) {\n this.current = undefined;\n /* if(this.go(1)) {\n this.previous.splice(this.previous.length - 1, 1);\n } else if(this.go(-1)) {\n this.next.splice(0, 1);\n } else */if(this.onEmptied) {\n this.onEmptied();\n }\n }\n };\n\n protected onHistoryMultiappend = async(message: Message.message | Message.messageService) => {\n if(this.searchContext.folderId !== undefined) {\n return;\n }\n\n // because it's reversed\n if(!this.loadedAllUp || this.loadPromiseUp) {\n return;\n }\n\n if(message.peerId !== this.searchContext.peerId) {\n return;\n }\n\n const filtered = await this.filterMids([message.mid]);\n const targets = (await Promise.all(filtered.map((message) => this.processItem(message)))).filter(Boolean);\n if(targets.length) {\n /* const {previous, current, next} = this;\n const targets = previous.concat(current, next);\n const currentIdx = targets.length;\n const mid = targets[0].mid;\n let i = 0, length = targets.length;\n for(; i < length; ++i) {\n const target = targets[i];\n if(!target || mid < target.mid) {\n break;\n }\n }\n\n if(i < currentIdx) previous.push(...targets);\n else next. */\n\n if(!this.current) {\n this.previous.push(...targets);\n } else {\n this.next.push(...targets);\n }\n }\n };\n\n protected onMessageSent = ({message}: {message: MyMessage}) => {\n this.onHistoryMultiappend(message);\n };\n\n public setSearchContext(context: SearchSuperContext) {\n this.searchContext = context;\n\n if(this.searchContext.folderId !== undefined) {\n this.loadedAllUp = true;\n\n if(this.searchContext.nextRate === undefined) {\n this.loadedAllDown = true;\n }\n }\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n this.loadedAllUp = true;\n }\n\n if(this.searchContext.useSearch === false) {\n this.loadedAllDown = this.loadedAllUp = true;\n }\n\n if(this.otherSideLoader) {\n this.otherSideLoader.setSearchContext(context);\n }\n }\n\n public reset() {\n super.reset();\n this.searchContext = undefined;\n\n if(this.otherSideLoader) {\n this.otherSideLoader.reset();\n }\n }\n\n public getPrevious(withOtherSide?: boolean) {\n let previous = this.previous;\n\n if(this.otherSideLoader && withOtherSide) {\n previous = previous.concat(this.otherSideLoader.previous);\n }\n\n return previous;\n }\n\n public getNext(withOtherSide?: boolean) {\n let next = this.next;\n\n if(this.otherSideLoader && withOtherSide) {\n next = next.concat(this.otherSideLoader.next);\n }\n\n return next;\n }\n\n public getCurrent() {\n return this.current || this.otherSideLoader?.current;\n }\n\n private goToOtherEnd(length: number) {\n if(length > 0) return this.go(-this.previous.length);\n else return this.go(this.next.length);\n }\n\n public goRound(length: number, dispatchJump?: boolean) {\n let ret: ReturnType['goUnsafe']>;\n\n if(this.otherSideLoader?.current) {\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n if(ret.item) {\n return ret.item;\n }\n\n length = ret.leftLength;\n if(!(length > 0 ? this.otherSideLoader.next : this.otherSideLoader.previous).length) {\n const loaded = length > 0 ? this.otherSideLoader.loadedAllUp : this.otherSideLoader.loadedAllDown;\n if(!loaded) { // do not reset anything until it's loaded\n return;\n }\n\n // if other side is loaded too will start from its begin\n if((length > 0 && (this.otherSideLoader.searchContext.maxId === 1 || this.otherSideLoader.loadedAllDown)) ||\n (length < 0 && (this.otherSideLoader.searchContext.maxId === 0 || this.otherSideLoader.loadedAllUp))) {\n return this.otherSideLoader.goToOtherEnd(length);\n }\n\n this.otherSideLoader.unsetCurrent(length > 0);\n }\n }\n\n ret = this.goUnsafe(length, dispatchJump);\n if(!ret.item) {\n if(this.loadedAllUp && this.loadedAllDown) { // just use the same loader if the list is too short\n return this.goToOtherEnd(length);\n } else if(this.otherSideLoader) {\n length = ret.leftLength;\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n\n if(ret.item) {\n this.unsetCurrent(length > 0);\n }\n }\n }\n\n return ret?.item;\n }\n\n // public setTargets(previous: Item[], next: Item[], reverse: boolean) {\n // super.setTargets(previous, next, reverse);\n // }\n\n protected setLoaded(down: boolean, value: boolean) {\n const changed = super.setLoaded(down, value);\n\n if(changed &&\n this.otherSideLoader &&\n value &&\n this.searchContext?.useSearch !== false/* &&\n (this.reverse ? this.loadedAllUp : this.loadedAllDown) */) {\n const reverse = this.loadedAllUp;\n this.otherSideLoader.setSearchContext({\n ...this.searchContext,\n maxId: reverse ? 1 : 0\n });\n\n // these 'reverse' are different, not a mistake here.\n this.otherSideLoader.reverse = this.reverse;\n this.otherSideLoader.setLoaded(reverse, true);\n this.otherSideLoader.load(!reverse);\n }\n\n return changed;\n }\n\n public cleanup() {\n this.reset();\n rootScope.removeEventListener('history_delete', this.onHistoryDelete);\n rootScope.removeEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.removeEventListener('message_sent', this.onMessageSent);\n this.onEmptied = undefined;\n\n if(this.otherSideLoader) {\n this.otherSideLoader.cleanup();\n this.otherSideLoader = undefined;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport generateMessageId from './generateMessageId';\nimport getServerMessageId from './getServerMessageId';\n\nexport default function incrementMessageId(messageId: number, increment: number) {\n return generateMessageId(getServerMessageId(messageId) + increment);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {fastRaf} from './schedulers';\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport isInDOM from './dom/isInDOM';\n\nclass SequentialDom {\n private promises: Partial<{\n read: CancellablePromise,\n write: CancellablePromise\n }> = {};\n private raf = fastRaf.bind(null);\n private scheduled = false;\n\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\n let promise = this.promises[kind];\n if(!promise) {\n this.scheduleFlush();\n promise = this.promises[kind] = deferredPromise();\n }\n\n if(callback !== undefined) {\n promise.then(() => callback());\n }\n\n return promise;\n }\n\n public measure(callback?: VoidFunction) {\n return this.do('read', callback);\n }\n\n public mutate(callback?: VoidFunction) {\n return this.do('write', callback);\n }\n\n /**\n * Will fire instantly if element is not connected\n * @param element\n * @param callback\n */\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\n const isConnected = isInDOM(element);\n const promise = isConnected ? this.mutate() : Promise.resolve();\n\n if(callback !== undefined) {\n if(!isConnected) {\n callback();\n } else {\n promise.then(() => callback());\n }\n }\n\n return promise;\n }\n\n private scheduleFlush() {\n if(!this.scheduled) {\n this.scheduled = true;\n\n this.raf(() => {\n this.promises.read && this.promises.read.resolve();\n this.promises.write && this.promises.write.resolve();\n\n this.scheduled = false;\n this.promises = {};\n });\n }\n }\n}\n\nconst sequentialDom = new SequentialDom();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\nexport default sequentialDom;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PhotoSize, WebDocument} from '../layer';\nimport {REPLIES_HIDDEN_CHANNEL_ID} from '../lib/mtproto/mtproto_config';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport {MediaSize, makeMediaSize} from './mediaSize';\nimport isWebDocument from '../lib/appManagers/utils/webDocs/isWebDocument';\n\nexport default function setAttachmentSize(\n photo: MyPhoto | MyDocument | WebDocument,\n element: HTMLElement | SVGForeignObjectElement,\n boxWidth: number,\n boxHeight: number,\n noZoom = true,\n message?: any,\n pushDocumentSize?: boolean,\n photoSize?: ReturnType\n) {\n const _isWebDocument = isWebDocument(photo);\n // if(_isWebDocument && pushDocumentSize === undefined) {\n // pushDocumentSize = true;\n // }\n\n if(!photoSize) {\n photoSize = choosePhotoSize(photo, boxWidth, boxHeight, undefined, pushDocumentSize);\n }\n // console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div);\n\n let size: MediaSize;\n const isDocument = photo._ === 'document';\n if(isDocument || _isWebDocument) {\n size = makeMediaSize(photo.w || (photoSize as PhotoSize.photoSize).w || 512, photo.h || (photoSize as PhotoSize.photoSize).h || 512);\n } else {\n size = makeMediaSize((photoSize as PhotoSize.photoSize).w || 100, (photoSize as PhotoSize.photoSize).h || 100);\n }\n\n let boxSize = makeMediaSize(boxWidth, boxHeight);\n\n boxSize = size = size.aspect(boxSize, noZoom);\n\n let isFit = true;\n\n if(!isDocument || ['video', 'gif'].includes(photo.type) || _isWebDocument) {\n if(boxSize.width < 200 && boxSize.height < 200) { // make at least one side this big\n boxSize = size = size.aspectCovered(makeMediaSize(200, 200));\n }\n\n if(message &&\n (message.message ||\n message.reply_to_mid ||\n message.media.webpage ||\n (message.replies && message.replies.pFlags.comments && message.replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)\n )\n ) { // make sure that bubble block is human-readable\n if(boxSize.width < 320) {\n boxSize = makeMediaSize(320, boxSize.height);\n isFit = false;\n }\n }\n\n if(isFit && boxSize.width < 120 && message) { // if image is too narrow\n boxSize = makeMediaSize(120, boxSize.height);\n isFit = false;\n }\n }\n\n // if(element instanceof SVGForeignObjectElement) {\n // element.setAttributeNS(null, 'width', '' + w);\n // element.setAttributeNS(null, 'height', '' + h);\n\n // //console.log('set dimensions to svg element:', element, w, h);\n // } else {\n element.style.width = boxSize.width + 'px';\n element.style.height = boxSize.height + 'px';\n // }\n\n return {photoSize, size, isFit};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {logger} from '../lib/logger';\nimport insertInDescendSortedArray from './array/insertInDescendSortedArray';\nimport {getMiddleware, MiddlewareHelper} from './middleware';\nimport middlewarePromise from './middlewarePromise';\nimport safeAssign from './object/safeAssign';\nimport pause from './schedulers/pause';\n\nexport type SortedElementBase = {\n id: T,\n index: number\n};\n\nlet id = 0;\n\nexport class BatchProcessor {\n protected queue: Promise[];\n protected promise: Promise;\n\n protected middlewareHelper: MiddlewareHelper;\n protected log: ReturnType;\n\n protected process: (batch: Item[], m: ReturnType, log: BatchProcessor['log']) => Promise;\n protected possibleError: any;\n\n constructor(options: {\n log?: BatchProcessor['log'],\n // middleware: MiddlewareHelper,\n process: BatchProcessor['process'],\n possibleError?: BatchProcessor['possibleError']\n }) {\n safeAssign(this, options);\n\n this.queue = [];\n this.middlewareHelper ??= getMiddleware();\n\n const prefix = 'BATCH-PROCESSOR-' + ++id;\n if(this.log) {\n this.log = this.log.bindPrefix(prefix);\n } else {\n this.log = logger(prefix);\n }\n }\n\n public get queuePromise() {\n return this.promise;\n }\n\n public clear() {\n this.log('clear');\n this.queue.length = 0;\n this.promise = undefined;\n this.middlewareHelper.clean();\n }\n\n public addToQueue(item: BatchProcessor['queue'][0]) {\n this.queue.push(item);\n return this.setQueue();\n }\n\n protected setQueue() {\n if(!this.queue.length) {\n return Promise.resolve();\n }\n\n if(this.promise) {\n return this.promise;\n }\n\n const middleware = this.middlewareHelper.get();\n const log = this.log.bindPrefix('queue');\n const m = middlewarePromise(middleware, this.possibleError);\n\n const processQueue = async(): Promise => {\n log('start', this.queue.length);\n\n const queue = this.queue.splice(0, this.queue.length);\n\n const perf = performance.now();\n const promises = queue.map((promise) => {\n promise.then((details) => {\n log('render item time', performance.now() - perf, details);\n });\n\n return promise;\n });\n\n const renderedQueue = await m(Promise.all(promises));\n await m(this.process(renderedQueue, m, log));\n\n log('queue rendered');\n\n if(this.queue.length) {\n log('have new items to render');\n return processQueue();\n } else {\n log('end');\n }\n };\n\n log('setting pause');\n const promise = this.promise = m(pause(0))\n .then(\n () => processQueue().catch((err: ApiError) => {\n if(err !== this.possibleError) {\n log.error('process queue error', err);\n }\n\n throw err;\n }),\n (err) => {\n log('pause has been cleared');\n throw err;\n }\n )\n .finally(() => {\n if(this.promise === promise) {\n this.promise = undefined;\n }\n });\n\n return promise;\n }\n}\n\nexport default class SortedList {\n protected elements: Map;\n protected sorted: Array;\n\n protected getIndex: (element: SortedElement) => PromiseLike | number;\n protected onDelete: (element: SortedElement) => void;\n protected onUpdate: (element: SortedElement) => void;\n protected onSort: (element: SortedElement, idx: number) => void;\n protected onElementCreate: (base: SortedElementBase) => PromiseLike | SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware: MiddlewareHelper;\n\n protected batchProcessor: BatchProcessor;\n\n protected log: ReturnType;\n\n constructor(options: {\n getIndex: SortedList['getIndex'],\n onDelete?: SortedList['onDelete'],\n onUpdate?: SortedList['onUpdate'],\n onSort?: SortedList['onSort'],\n onElementCreate: SortedList['onElementCreate'],\n\n updateElementWith?: SortedList['updateElementWith'],\n updateListWith?: SortedList['updateListWith'],\n\n log?: SortedList['log']\n }) {\n safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n this.middleware = getMiddleware();\n\n this.batchProcessor = new BatchProcessor({\n log: this.log,\n process: async(batch, m, log) => {\n // const elements = await Promise.all(batch.map((element) => this.onElementCreate(element)));\n const elements = batch;\n const promises = elements.map((element) => this.update(element.id, element));\n await m(Promise.all(promises));\n }\n });\n }\n\n public clear() {\n this.batchProcessor.clear();\n this.middleware.clean();\n this.elements.clear();\n this.sorted.length = 0;\n }\n\n protected _updateList() {\n this.elements.forEach((element) => {\n this.update(element.id);\n });\n\n if(this.onSort) {\n this.sorted.forEach((element, idx) => {\n this.onSort(element, idx);\n });\n }\n }\n\n public updateList(callback?: (updated: boolean) => void) {\n const middleware = this.middleware.get();\n this.updateListWith((canUpdate) => {\n if(!middleware() || (canUpdate !== undefined && !canUpdate)) {\n callback?.(false);\n return;\n }\n\n this._updateList();\n\n callback?.(true);\n });\n }\n\n public has(id: SortedElementId) {\n return this.elements.has(id);\n }\n\n public get(id: SortedElementId) {\n return this.elements.get(id);\n }\n\n public getAll() {\n return this.elements;\n }\n\n public async add(id: SortedElementId) {\n const element = this.get(id);\n if(element) {\n return;\n // return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n this.elements.set(id, base as SortedElement);\n const createPromise = Promise.resolve(this.onElementCreate(base));\n return this.batchProcessor.addToQueue(createPromise);\n\n // return element;\n }\n\n public delete(id: SortedElementId, noScheduler?: boolean) {\n const element = this.elements.get(id);\n if(!element) {\n return false;\n }\n\n this.elements.delete(id);\n\n const idx = this.sorted.indexOf(element);\n if(idx !== -1) {\n this.sorted.splice(idx, 1);\n }\n\n if(this.onDelete) {\n if(noScheduler) {\n this.onDelete(element);\n } else {\n const middleware = this.middleware.get();\n this.updateElementWith(() => {\n if(!middleware()) {\n return;\n }\n\n this.onDelete(element);\n });\n }\n }\n\n return true;\n }\n\n public async update(id: SortedElementId, element = this.get(id)) {\n if(!element) {\n return;\n }\n\n element.index = await this.getIndex(element);\n if(this.get(id) !== element) {\n return;\n }\n\n this.onUpdate?.(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n this.onSort(element, idx);\n }\n}\n","const BOM = '';\n// const BOM = 'K';\nexport default BOM;\n","export default function encodeEntities(value: string) {\n return value.replace(/&/g, '&').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, (value) => {\n const hi = value.charCodeAt(0);\n const low = value.charCodeAt(1);\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n }).replace(/([^\\#-~| |!])/g, (value) => { // non-alphanumeric\n return '&#' + value.charCodeAt(0) + ';';\n }).replace(//g, '>');\n}\n","// credits to https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js\nexport default function escapeRegExp(str: string) {\n return str\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n .replace(/-/g, '\\\\x2d');\n}\n","export default function limitSymbols(str: string, length: number, limitFrom = length + 10) {\n str = str.trim();\n if(str.length > limitFrom) {\n str = str.slice(0, length)/* .replace(/\\s*$/, '') */ + '...';\n }\n\n return str;\n}\n","export default function toHHMMSS(str: string | number, leadZero = false) {\n const sec_num = parseInt(str + '', 10);\n const hours = Math.floor(sec_num / 3600);\n let minutes: any = Math.floor((sec_num - (hours * 3600)) / 60);\n let seconds: any = sec_num - (hours * 3600) - (minutes * 60);\n\n if(hours) leadZero = true;\n if(minutes < 10) minutes = leadZero ? '0' + minutes : minutes;\n if(seconds < 10) seconds = '0' + seconds;\n return (hours ? /* ('0' + hours).slice(-2) */hours + ':' : '') + minutes + ':' + seconds;\n}\n","export default function textToSvgURL(text: string) {\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\n\n // * because iOS Safari doesn't want to eat objectURL\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n resolve(e.target.result as string);\n };\n reader.readAsDataURL(blob);\n });\n // return URL.createObjectURL(blob);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_WORKER} from './context';\n\nexport class WindowSize {\n public width: number;\n public height: number;\n\n constructor() {\n if(IS_WORKER) {\n return;\n }\n\n // @ts-ignore\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\n const set = () => {\n this.width = w.width || w.innerWidth;\n this.height = w.height || w.innerHeight;\n };\n w.addEventListener('resize', set);\n set();\n }\n}\n\nconst windowSize = new WindowSize();\nexport default windowSize;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\n\nimport {AnyToVoidFunction} from '../types';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport DEBUG from '../config/debug';\nimport pause from '../helpers/schedulers/pause';\nimport EventListenerBase from '../helpers/eventListenerBase';\n\nconst eventListener = new EventListenerBase<{\n start: () => void,\n end: () => void\n}>();\nconst ANIMATION_START_EVENT = 'start';\nconst ANIMATION_END_EVENT = 'end';\n\nlet isAnimating = false;\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\nlet promisesInQueue = 0;\n\nheavyAnimationPromise.resolve();\n\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\n\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\n if(!isAnimating) {\n heavyAnimationPromise = deferredPromise();\n eventListener.dispatchEvent(ANIMATION_START_EVENT);\n isAnimating = true;\n DEBUG && log('start');\n }\n\n ++promisesInQueue;\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\n\n const promises = [\n timeout !== undefined ? pause(timeout) : undefined,\n promise.finally(() => {})\n ].filter(Boolean);\n\n const perf = performance.now();\n const _heavyAnimationPromise = heavyAnimationPromise;\n Promise.race(promises).then(() => {\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\n return;\n }\n\n --promisesInQueue;\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\n if(promisesInQueue <= 0) {\n onHeavyAnimationEnd();\n }\n });\n\n return heavyAnimationPromise;\n}\n\n(window as any).dispatchHeavyAnimationEvent = dispatchHeavyAnimationEvent;\n\nfunction onHeavyAnimationEnd() {\n if(heavyAnimationPromise.isFulfilled) {\n return;\n }\n\n isAnimating = false;\n promisesInQueue = 0;\n eventListener.dispatchEvent(ANIMATION_END_EVENT);\n heavyAnimationPromise.resolve();\n\n DEBUG && log('end');\n}\n\nexport function interruptHeavyAnimation() {\n onHeavyAnimationEnd();\n}\n\nexport function getHeavyAnimationPromise() {\n return heavyAnimationPromise;\n}\n\nexport default function(\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n listenerSetter?: ListenerSetter\n) {\n // useEffect(() => {\n if(isAnimating) {\n handleAnimationStart();\n }\n\n const add = listenerSetter ? listenerSetter.add(eventListener) : eventListener.addEventListener.bind(eventListener);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, eventListener) : eventListener.removeEventListener.bind(eventListener);\n add(ANIMATION_START_EVENT, handleAnimationStart);\n add(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\n remove(ANIMATION_START_EVENT, handleAnimationStart);\n };\n // }, [handleAnimationEnd, handleAnimationStart]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Dialog} from '../lib/appManagers/appMessagesManager';\nimport type {ApiLimitType} from '../lib/mtproto/api_methods';\nimport type {ForumTopic} from '../layer';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport rootScope from '../lib/rootScope';\nimport {ButtonMenuItemOptionsVerifiable, ButtonMenuSync} from './buttonMenu';\nimport PopupDeleteDialog from './popups/deleteDialog';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport {toastNew} from './toast';\nimport PopupMute from './popups/mute';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport positionMenu from '../helpers/positionMenu';\nimport contextMenuController from '../helpers/contextMenuController';\nimport {GENERAL_TOPIC_ID} from '../lib/mtproto/mtproto_config';\nimport showLimitPopup from './popups/limit';\n\nexport default class DialogsContextMenu {\n private element: HTMLElement;\n private buttons: ButtonMenuItemOptionsVerifiable[];\n\n private peerId: PeerId;\n private filterId: number;\n private threadId: number;\n private dialog: Dialog | ForumTopic.forumTopic;\n private canManageTopics: boolean;\n\n constructor(private managers: AppManagers) {\n\n }\n\n private init() {\n this.buttons = [{\n icon: 'unread',\n text: 'MarkAsUnread',\n onClick: this.onUnreadClick,\n verify: async() => !this.threadId && !(await this.managers.appMessagesManager.isDialogUnread(this.dialog))\n }, {\n icon: 'readchats',\n text: 'MarkAsRead',\n onClick: this.onUnreadClick,\n verify: () => this.managers.appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'pin',\n text: 'ChatList.Context.Pin',\n onClick: this.onPinClick,\n verify: async() => {\n if(this.threadId && !this.canManageTopics) {\n return false;\n }\n\n const isPinned = this.filterId !== undefined && this.filterId > 1 ?\n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) :\n !!this.dialog.pFlags?.pinned;\n return !isPinned;\n }\n }, {\n icon: 'unpin',\n text: 'ChatList.Context.Unpin',\n onClick: this.onPinClick,\n verify: async() => {\n if(this.threadId && !this.canManageTopics) {\n return false;\n }\n\n const isPinned = this.filterId !== undefined && this.filterId > 1 ?\n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) :\n !!this.dialog.pFlags?.pinned;\n return isPinned;\n }\n }, {\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: async() => {\n return this.peerId !== rootScope.myId && !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.dialog.peerId, threadId: this.threadId}));\n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: async() => {\n return this.peerId !== rootScope.myId && (await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.dialog.peerId, threadId: this.threadId}));\n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.peerId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.peerId !== rootScope.myId\n }, {\n icon: 'hide',\n text: 'Hide',\n onClick: this.hideTopic,\n verify: async() => {\n return this.canManageTopics && (this.dialog as ForumTopic.forumTopic).id === GENERAL_TOPIC_ID;\n }\n }, {\n icon: 'lock',\n text: 'CloseTopic',\n onClick: this.toggleTopic,\n verify: () => {\n return this.canManageTopics && !(this.dialog as ForumTopic.forumTopic).pFlags.closed;\n }\n }, {\n icon: 'lockoff',\n text: 'RestartTopic',\n onClick: this.toggleTopic,\n verify: () => {\n return this.canManageTopics && !!(this.dialog as ForumTopic.forumTopic).pFlags.closed;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => {\n if(this.threadId) {\n if(!this.canManageTopics) {\n return false;\n }\n\n return (this.dialog as ForumTopic.forumTopic).id !== GENERAL_TOPIC_ID;\n }\n\n return true;\n }\n }];\n\n this.element = ButtonMenuSync({buttons: this.buttons});\n this.element.id = 'dialogs-contextmenu';\n this.element.classList.add('contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onArchiveClick = async() => {\n const dialog = await this.managers.appMessagesManager.getDialogOnly(this.peerId);\n if(dialog) {\n this.managers.appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private hideTopic = () => {\n this.managers.appChatsManager.editForumTopic({\n chatId: this.peerId.toChatId(),\n topicId: this.threadId,\n hidden: true\n });\n };\n\n private toggleTopic = () => {\n this.managers.appChatsManager.editForumTopic({\n chatId: this.peerId.toChatId(),\n topicId: this.threadId,\n closed: !(this.dialog as ForumTopic.forumTopic).pFlags.closed\n });\n };\n\n private onPinClick = () => {\n const {peerId, filterId, threadId} = this;\n this.managers.appMessagesManager.toggleDialogPin({\n peerId,\n filterId,\n topicId: threadId\n }).catch(async(err: ApiError) => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH' || err.type === 'PINNED_TOO_MUCH') {\n if(threadId) {\n this.managers.apiManager.getLimit('topicPin').then((limit) => {\n toastNew({langPackKey: 'LimitReachedPinnedTopics', langPackArguments: [limit]});\n });\n } else if(filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n showLimitPopup('pin');\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, mute: false, threadId: this.threadId});\n };\n\n private onMuteClick = () => {\n new PopupMute(this.peerId, this.threadId);\n };\n\n private onUnreadClick = async() => {\n const {peerId, dialog} = this;\n if(dialog.unread_count) {\n this.managers.appMessagesManager.readHistory(peerId, dialog.top_message, this.threadId);\n\n if(!this.threadId) {\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\n }\n } else if(!this.threadId) {\n this.managers.appMessagesManager.markDialogUnread(peerId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.peerId, undefined, undefined, this.threadId);\n };\n\n onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let li: HTMLElement = null;\n\n try {\n li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n } catch(e) {}\n\n if(!li) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n const r = async() => {\n this.peerId = li.dataset.peerId.toPeerId();\n this.threadId = +li.dataset.threadId || undefined;\n this.dialog = await this.managers.dialogsStorage.getDialogOrTopic(this.peerId, this.threadId);\n this.filterId = this.threadId ? undefined : appDialogsManager.filterId;\n this.canManageTopics = this.threadId ? await this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'manage_topics') : undefined;\n\n await Promise.all(this.buttons.map(async(button) => {\n const good = await button.verify();\n\n button.element.classList.toggle('hide', !good);\n }));\n\n const langPackKey: LangPackKey = this.threadId ? 'Delete' : await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n // delete button\n this.buttons[this.buttons.length - 1].element.lastChild.replaceWith(i18n(langPackKey));\n\n li.classList.add('menu-open');\n positionMenu(e, this.element);\n contextMenuController.openBtnMenu(this.element, () => {\n li.classList.remove('menu-open');\n this.peerId = this.dialog = this.filterId = this.threadId = this.canManageTopics = undefined;\n });\n };\n\n r();\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../config/app';\nimport DEBUG from '../config/debug';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {LangPackKey, i18n} from '../lib/langPack';\nimport {logger} from '../lib/logger';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport ProgressivePreloader from './preloader';\nimport SetTransition from './singleTransition';\nimport sessionStorage from '../lib/sessionStorage';\nimport {ConnectionStatus} from '../lib/mtproto/connectionStatus';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport singleInstance from '../lib/mtproto/singleInstance';\n\nexport default class ConnectionStatusComponent {\n public static CHANGE_STATE_DELAY = 1000;\n\n private statusContainer: HTMLElement;\n private statusEl: HTMLElement;\n private statusPreloader: ProgressivePreloader;\n\n private currentLangPackKey: LangPackKey;\n\n private hadConnect = false;\n private retryAt: number;\n private connecting = false;\n private timedOut = false;\n private updating = false;\n\n private log: ReturnType;\n\n private setFirstConnectionTimeout: number;\n private setStateTimeout: number;\n\n constructor(private managers: AppManagers, chatsContainer: HTMLElement) {\n this.log = logger('CS', undefined, undefined);\n\n this.statusContainer = document.createElement('div');\n this.statusContainer.classList.add('connection-status'/* , 'hide' */);\n\n this.statusEl = Button('btn-primary bg-warning connection-status-button', {noRipple: true});\n this.statusPreloader = new ProgressivePreloader({cancelable: false});\n this.statusPreloader.constructContainer({color: 'transparent', bold: true});\n this.statusContainer.append(this.statusEl);\n\n chatsContainer.prepend(this.statusContainer);\n\n rootScope.addEventListener('connection_status_change', (status) => {\n // console.log(status);\n\n this.setConnectionStatus();\n });\n\n rootScope.addEventListener('state_synchronizing', (channelId) => {\n if(!channelId) {\n this.updating = true;\n DEBUG && this.log('updating', this.updating);\n this.setState();\n }\n });\n\n rootScope.addEventListener('state_synchronized', (channelId) => {\n DEBUG && this.log('state_synchronized', channelId);\n if(!channelId) {\n this.updating = false;\n DEBUG && this.log('updating', this.updating);\n this.setState();\n }\n });\n\n this.setFirstConnectionTimeout = window.setTimeout(this.setConnectionStatus, ConnectionStatusComponent.CHANGE_STATE_DELAY + 1e3);\n\n // let bool = true;\n // document.addEventListener('dblclick', () => {\n // this.setConnectionStatus(bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected));\n // });\n }\n\n private setConnectionStatus = (overrideStatus?: ConnectionStatus) => {\n Promise.all([\n sessionStorage.get('dc'),\n rootScope.managers.rootScope.getConnectionStatus()\n ]).then(([baseDcId, connectionStatus]) => {\n if(!baseDcId) {\n baseDcId = App.baseDcId;\n }\n\n if(this.setFirstConnectionTimeout) {\n clearTimeout(this.setFirstConnectionTimeout);\n this.setFirstConnectionTimeout = 0;\n }\n\n const status = connectionStatus['NET-' + baseDcId];\n const online = status && (overrideStatus || status.status) === ConnectionStatus.Connected;\n\n if(this.connecting && online) {\n this.managers.apiUpdatesManager.forceGetDifference();\n }\n\n if(online && !this.hadConnect) {\n this.hadConnect = true;\n }\n\n this.timedOut = status && (overrideStatus || status.status) === ConnectionStatus.TimedOut;\n this.connecting = !online;\n this.retryAt = status && status.retryAt;\n DEBUG && this.log('connecting', this.connecting);\n this.setState();\n });\n };\n\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\n if(this.currentLangPackKey === langPackKey) return;\n this.currentLangPackKey = langPackKey;\n replaceContent(this.statusEl, i18n(langPackKey, args));\n this.statusPreloader.attach(this.statusEl);\n };\n\n private getA(langPackKey: LangPackKey, callback: () => void) {\n const a = document.createElement('a');\n a.classList.add('force-reconnect');\n a.append(i18n(langPackKey));\n attachClickEvent(a, (e) => {\n cancelEvent(e);\n callback();\n });\n\n return a;\n }\n\n private setState = () => {\n if(singleInstance.deactivatedReason) {\n return;\n }\n\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\n if(this.connecting) {\n if(this.timedOut) {\n const a = this.getA('ConnectionStatus.ForceReconnect', () => this.managers.networkerFactory.forceReconnect());\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\n } else if(this.hadConnect) {\n if(this.retryAt !== undefined) {\n const timerSpan = document.createElement('span');\n const retryAt = this.retryAt;\n const setTime = () => {\n const now = Date.now();\n timerSpan.innerText = '' + Math.max(0, Math.round((retryAt - now) / 1000));\n if(now > retryAt) {\n clearInterval(interval);\n }\n };\n const interval = setInterval(setTime, 1e3);\n setTime();\n\n const a = this.getA('ConnectionStatus.Reconnect', () => this.managers.networkerFactory.forceReconnectTimeout());\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\n } else {\n this.setStatusText('ConnectionStatus.Reconnecting');\n }\n } else {\n this.setStatusText('ConnectionStatus.Waiting');\n }\n } else if(this.updating) {\n this.setStatusText('Updating');\n }\n\n DEBUG && this.log('setState', this.connecting || this.updating);\n window.requestAnimationFrame(() => {\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\n\n const cb = () => {\n SetTransition({\n element: this.statusContainer,\n className: 'is-shown',\n forwards: this.connecting || this.updating,\n duration: 200\n });\n this.setStateTimeout = 0;\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\n };\n\n this.setStateTimeout = window.setTimeout(cb, timeout);\n // cb();\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\n else cb(); */\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message} from '../layer';\n/* import findUpClassName from \"../helpers/dom/findUpClassName\";\nimport rootScope from \"../lib/rootScope\";\nimport Transition from \"./transition\"; */\n\nexport enum SENDING_STATUS {\n Error = -1,\n Pending,\n Sent,\n Read\n}\n\nexport function getSendingStatus(message: Message.message | Message.messageService) {\n return message.pFlags.is_outgoing ?\n SENDING_STATUS.Pending : (\n message.pFlags.unread ?\n SENDING_STATUS.Sent :\n SENDING_STATUS.Read\n );\n}\n\ntype C = 'check' | 'checks' | 'sending' | 'sendingerror' | 'premium_lock';\nexport function setSendingStatus(\n container: HTMLElement,\n message?: C | Message.message | Message.messageService,\n disableAnimationIfRippleFound?: boolean\n) {\n let className: C;\n if(typeof(message) === 'string') {\n className = message;\n } else if(message?.pFlags.out) {\n if(message.error) {\n className = 'sendingerror';\n } else if(message.pFlags.is_outgoing) {\n className = 'sending';\n } else if(message.pFlags.unread) {\n className = 'check';\n } else {\n className = 'checks';\n }\n }\n\n if(!className) {\n container.textContent = '';\n return;\n }\n\n const iconClassName = 'tgico-' + className;\n const lastElement = container.lastElementChild as HTMLElement;\n if(lastElement && lastElement.classList.contains(iconClassName)) {\n return;\n }\n\n const element = document.createElement('i');\n element.classList.add('sending-status-icon', /* 'transition-item', */ iconClassName);\n container.append(element);\n\n if(lastElement) {\n lastElement.remove();\n }\n\n /* if(!lastElement) {\n element.classList.add('active');\n return;\n }\n\n const select = Transition(container, undefined, 350, () => {\n lastElement.remove();\n }, false, true, false);\n\n let animate = rootScope.settings.animationsEnabled && className !== 'sending' && !lastElement.classList.contains('tgico-sending');\n if(disableAnimationIfRippleFound && animate) {\n const parent = findUpClassName(container, 'rp');\n if(parent.querySelector('.c-ripple__circle') || parent.matches(':hover')) {\n animate = false;\n }\n }\n\n select(element, animate, lastElement); */\n\n /* SetTransition(lastElement, 'is-visible', false, 350, () => {\n // lastElement.remove();\n }, 2);\n SetTransition(element, 'is-visible', true, 350, undefined, 2); */\n}\n","// https://spicyyoghurt.com/tools/easing-functions\nexport default function easeInOutSine(t: number, b: number, c: number, d: number) {\n return t >= d ? b + c : easeInOutSineApply(t / d, c) + b;\n}\n\nexport function easeInOutSineApply(v: number, c: number) {\n return -c / 2 * (Math.cos(Math.PI * v) - 1);\n}\n","export default function roundRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radius: {[k in 'tl' | 'tr' | 'br' | 'bl']?: number} | number,\n fill?: boolean,\n stroke?: boolean\n) {\n const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n width *= dpr;\n height *= dpr;\n }\n\n if(typeof(radius) === 'number') {\n if(dpr) radius *= dpr;\n radius = {tl: radius, tr: radius, br: radius, bl: radius};\n } else {\n const defaultRadius = {tl: 0, tr: 0, br: 0, bl: 0};\n for(const side in defaultRadius) {\n // @ts-ignore\n radius[side] = radius[side] ? (dpr ? radius[side] * dpr : radius[side]) : defaultRadius[side];\n }\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {animate} from '../helpers/animation';\nimport customProperties from '../helpers/dom/customProperties';\nimport easeInOutSine from '../helpers/easing/easeInOutSine';\nimport mediaSizes from '../helpers/mediaSizes';\nimport roundRect from '../helpers/canvas/roundRect';\n\nconst DPR = window.devicePixelRatio;\nconst SIZE = 20 * DPR;\nconst MARGIN = 2.5 * DPR;\nconst WIDTH = 2 * DPR;\nconst RADIUS = 1 * DPR;\nconst LENGTH = 3;\n\nconst MIN_HEIGHT = 4;\nconst MAX_HEIGHT = 12;\nconst DURATION = 1000;\n\nexport default function groupCallActiveIcon(isActive = false) {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = SIZE;\n const context = canvas.getContext('2d');\n\n const TOTAL_WIDTH = LENGTH * WIDTH + (LENGTH - 1) * MARGIN;\n const START_X = (SIZE - TOTAL_WIDTH) / 2;\n\n const startTime = Date.now();\n let wasMounted = false;\n // let hadRound = false;\n const renderFrame = () => {\n if(!canvas.isConnected) {\n if(wasMounted) {\n return false;\n }\n } else if(!wasMounted) {\n wasMounted = canvas.isConnected;\n }\n\n const time = Date.now();\n // if(((time - startTime) / DURATION) >= 1) {\n // hadRound = true;\n // }\n\n const progress = easeInOutSine((time - startTime) % DURATION, 0, 1, DURATION);\n\n context.clearRect(0, 0, SIZE, SIZE);\n context.fillStyle = isActive && !mediaSizes.isMobile ? customProperties.getProperty('primary-color') : '#fff';\n\n for(let i = 0; i < LENGTH; ++i) {\n const x = START_X + (i * WIDTH) + (i * MARGIN);\n\n let itemProgress: number;\n if(progress >= .5) {\n itemProgress = i % 2 ? 2 - progress * 2 : (progress - .5) * 2;\n } else {\n itemProgress = i % 2 ? progress * 2 : 1 - progress * 2;\n }\n\n let height = MIN_HEIGHT + (itemProgress * (MAX_HEIGHT - MIN_HEIGHT));\n /* if(!hadRound && i === 1) {\n console.log('call status animation', itemProgress, height, progress, progress >= .5);\n } */\n\n height *= DPR;\n const y = (SIZE - height) / 2;\n\n roundRect(context, x, y, WIDTH, height, RADIUS, true);\n }\n\n return true;\n };\n\n return {\n canvas,\n startAnimation: () => {\n animate(renderFrame);\n renderFrame();\n },\n setActive: (active: boolean) => {\n isActive = active;\n renderFrame();\n }\n };\n}\n","import customProperties from '../dom/customProperties';\nimport clamp from '../number/clamp';\n\nexport default class Shimmer {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private font = '30pt Helvetica';\n private currTime = Date.now();\n private diffTime = 0;\n private spread = 0;\n private paused = false;\n private pausedTime = 0;\n private pauseInterval = 850;\n private lightSource = 0;\n private inc = 0.032;\n private lightSpread = 0.55;\n private animations = ['slide', 'slide', 'slide', 'slide'];\n private currentAnimationIndex = 0;\n private text: string;\n private fillStyle: CanvasRenderingContext2D['fillStyle'];\n\n private keepTime() {\n this.diffTime = Date.now() - this.currTime;\n this.currTime = Date.now();\n }\n\n private cycleAnimation() {\n ++this.currentAnimationIndex;\n if(this.currentAnimationIndex >= this.animations.length) {\n this.currentAnimationIndex = 0;\n }\n }\n\n private animate() {\n const currentAnimation = this.animations[this.currentAnimationIndex];\n if(currentAnimation === 'glow') {\n return this.animateGlow(); // return glow style\n } else if(currentAnimation === 'slide') {\n return this.animateSlide(); // return slide gradient\n } else {\n console.log('unknown animation type: ' + String(currentAnimation));\n }\n }\n\n private animateGlow() {\n var glowEnd = 255,\n rgbStart = 68,\n r = rgbStart,\n g = r,\n b = r,\n increment = 10,\n interval = 800;\n\n return () => {\n var smartInc = increment * (this.diffTime / (1000 / 60));\n if(this.paused) {\n if((Date.now() - this.pausedTime) > interval) {\n r = rgbStart;\n this.cycleAnimation()\n this.paused = false;\n }\n } else {\n r = parseInt('' + (r + smartInc));\n if(r >= glowEnd) {\n this.paused = true;\n this.pausedTime = Date.now()\n }\n }\n return 'rgb('+ r + ',' + r + ',' + r + ')';\n };\n }\n\n private animateSlide(): CanvasGradient {\n var gradient = this.ctx.createLinearGradient(0, 0, this.canvas.width, 0),\n smartInc = this.inc * (this.diffTime / (1000 / 60)),\n lightLeft,\n lightRight,\n lightCenter;\n if(this.paused) {\n if((Date.now() - this.pausedTime) > this.pauseInterval) {\n this.lightSource = -0.6;\n this.cycleAnimation()\n this.paused = false;\n return this.animateSlide();\n }\n } else {\n this.lightSource += smartInc;\n if(this.lightSource > (1 + this.lightSpread)) {\n this.paused = true;\n this.pausedTime = Date.now();\n }\n }\n // lighting positions:\n lightCenter = clamp(this.lightSource, 0, 1);\n lightLeft = clamp(this.lightSource - this.lightSpread, 0, 1);\n lightRight = clamp(this.lightSource + this.lightSpread, 0, 1);\n\n const backgroundColor = customProperties.getProperty('background-color-true');\n const shimmerColor = customProperties.getProperty('surface-color');\n gradient.addColorStop(lightLeft, backgroundColor);\n gradient.addColorStop(lightCenter, shimmerColor);\n gradient.addColorStop(lightRight, backgroundColor);\n\n return gradient;\n }\n\n public settings(dict: Partial<{\n canvas: Shimmer['canvas'],\n fillStyle: Shimmer['fillStyle'],\n font: Shimmer['font'],\n lightSpread: Shimmer['lightSpread'],\n inc: Shimmer['inc'],\n animations: Shimmer['animations'],\n text: Shimmer['text']\n }> = {}) {\n this.canvas = dict.canvas ?? document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n this.font = dict.font ?? this.font;\n this.lightSpread = dict.lightSpread ?? this.lightSpread;\n this.inc = dict.inc ?? this.inc;\n this.animations = dict.animations ?? this.animations;\n this.text = dict.text ?? this.text;\n this.fillStyle = dict.fillStyle;\n\n this.canvas.classList.add('shimmer-canvas');\n }\n\n public on() {\n const {width, height} = this.canvas;\n // record the time we ran:\n this.keepTime();\n // clear and fill the canvas:\n this.ctx.clearRect(0, 0, width, height);\n\n if(this.font) {\n this.ctx.font = this.font;\n }\n\n this.ctx.fillStyle = this.animate() as any;\n this.ctx.fillRect(0, 0, width, height);\n\n if(this.fillStyle) {\n this.ctx.fillStyle = this.fillStyle;\n this.ctx.fillRect(0, 0, width, height);\n }\n\n if(this.text) {\n this.ctx.fillText(this.text, 50, 50);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport rootScope from '../lib/rootScope';\nimport {animate} from './animation';\nimport {drawCircleFromStart} from './canvas/drawCircle';\nimport roundRect from './canvas/roundRect';\nimport Shimmer from './canvas/shimmer';\nimport customProperties from './dom/customProperties';\nimport easeInOutSine from './easing/easeInOutSine';\nimport mediaSizes from './mediaSizes';\n\nexport default class DialogsPlaceholder {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private shimmer: Shimmer;\n private tempId: number;\n private detachTime: number;\n\n private length: number;\n private dialogHeight: number;\n private availableLength: number;\n\n private avatarSize: number;\n private marginVertical: number;\n private totalHeight: number;\n private lineHeight: number;\n private lineBorderRadius: number;\n private lineMarginVertical: number;\n private statusWidth: number;\n private generatedValues: {\n firstLineWidth: number,\n secondLineWidth: number,\n statusWidth: number\n }[];\n\n private getRectFrom: () => DOMRectEditable;\n private onRemove: () => void;\n private blockScrollable: Scrollable;\n\n constructor(sizes: Partial<{\n avatarSize: number,\n marginVertical: number,\n totalHeight: number\n }> = {}) {\n this.shimmer = new Shimmer();\n this.tempId = 0;\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('dialogs-placeholder-canvas');\n this.ctx = this.canvas.getContext('2d');\n\n this.generatedValues = [];\n this.avatarSize = sizes.avatarSize ?? 54;\n this.marginVertical = sizes.marginVertical ?? 9;\n this.totalHeight = sizes.totalHeight ?? (this.avatarSize + this.marginVertical * 2);\n this.lineHeight = 10;\n this.lineBorderRadius = 6;\n this.lineMarginVertical = 8;\n this.statusWidth = 24;\n }\n\n public attach({container, rect, getRectFrom, onRemove, blockScrollable}: {\n container: HTMLElement,\n rect?: ReturnType,\n getRectFrom?: HTMLElement | DialogsPlaceholder['getRectFrom'],\n onRemove?: DialogsPlaceholder['onRemove'],\n blockScrollable?: DialogsPlaceholder['blockScrollable']\n }) {\n const {canvas} = this;\n\n this.onRemove = onRemove;\n this.getRectFrom = typeof(getRectFrom) === 'function' ? getRectFrom : (getRectFrom || container).getBoundingClientRect.bind(getRectFrom || container);\n if(this.blockScrollable = blockScrollable) {\n blockScrollable.container.style.overflowY = 'hidden';\n }\n\n this.updateCanvasSize(rect);\n this.startAnimation();\n container.append(canvas);\n }\n\n public detach(availableLength: number) {\n if(this.detachTime) {\n return;\n }\n\n this.availableLength = availableLength;\n this.detachTime = Date.now();\n\n if(!rootScope.settings.animationsEnabled) {\n this.remove();\n }\n }\n\n public remove() {\n this.stopAnimation();\n\n if(this.canvas.parentElement) {\n this.canvas.remove();\n\n if(this.blockScrollable) {\n this.blockScrollable.container.style.overflowY = '';\n this.blockScrollable = undefined;\n }\n }\n\n this.onRemove?.();\n this.onRemove = undefined;\n }\n\n private updateCanvasSize(rect = this.getRectFrom()) {\n const {canvas} = this;\n const dpr = canvas.dpr = window.devicePixelRatio;\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n canvas.style.width = rect.width + 'px';\n canvas.style.height = rect.height + 'px';\n }\n\n private renderDetachAnimationFrame() {\n const {\n canvas,\n ctx,\n detachTime,\n length,\n availableLength\n } = this;\n\n if(!detachTime) {\n return;\n } else if(!rootScope.settings.animationsEnabled) {\n this.remove();\n return;\n }\n\n const {width} = canvas;\n\n ctx.globalCompositeOperation = 'destination-out';\n\n // ctx.fillStyle = 'rgba(0, 0, 0, 0)';\n // ctx.fillRect(0, 0, width, height);\n\n // const DURATION = 500;\n // const DELAY = DURATION;\n const DURATION = 150;\n const DELAY = 15;\n const elapsedTime = Date.now() - detachTime;\n let completed = true;\n for(let i = 0; i < length; ++i) {\n const delay = availableLength < length && i >= availableLength ? DELAY * (availableLength - 1) : DELAY * i;\n const elapsedRowTime = elapsedTime - delay;\n if(elapsedRowTime <= 0) {\n completed = false;\n continue;\n }\n\n const progress = easeInOutSine(elapsedRowTime, 0, 1, DURATION);\n\n ctx.beginPath();\n ctx.rect(0, this.dialogHeight * i, width, this.dialogHeight);\n ctx.fillStyle = `rgba(0, 0, 0, ${progress})`;\n ctx.fill();\n\n if(progress < 1) {\n completed = false;\n }\n }\n\n // const totalRadius = Math.sqrt(width ** 2 + height ** 2);\n // const gradient = ctx.createRadialGradient(\n // 0, 0, 0,\n // 0, 0, totalRadius);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n // const gradient = ctx.createLinearGradient(0, 0, 0, height);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n // ctx.fillStyle = gradient;\n // ctx.fillRect(0, 0, width, height);\n\n ctx.globalCompositeOperation = 'source-over';\n\n if(completed) {\n this.remove();\n }\n }\n\n private renderFrame() {\n this.shimmer.on();\n this.renderDetachAnimationFrame();\n }\n\n private startAnimation() {\n const {canvas, shimmer} = this;\n const tempId = ++this.tempId;\n const pattern = this.createPattern();\n\n shimmer.settings({\n canvas,\n fillStyle: pattern\n });\n\n const middleware = () => {\n return this.tempId === tempId;\n };\n\n this.renderFrame();\n animate(() => {\n if(!middleware()) {\n return false;\n }\n\n // ! should've removed the loop if animations are disabled\n if(rootScope.settings.animationsEnabled) {\n this.renderFrame();\n }\n\n // ! tempId can be changed during renderFrame\n return middleware();\n });\n\n rootScope.addEventListener('theme_change', this.onThemeChange);\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private stopAnimation() {\n ++this.tempId;\n rootScope.removeEventListener('theme_change', this.onThemeChange);\n mediaSizes.removeEventListener('resize', this.onResize);\n }\n\n private onThemeChange = () => {\n this.stopAnimation();\n this.startAnimation();\n };\n\n private onResize = () => {\n const {canvas} = this;\n const {width, height, dpr} = canvas;\n this.updateCanvasSize();\n if(canvas.width === width && canvas.height === height && canvas.dpr === dpr) {\n return;\n }\n\n this.stopAnimation();\n this.startAnimation();\n };\n\n private createPattern() {\n const {canvas, ctx} = this;\n\n const patternCanvas = document.createElement('canvas');\n const patternContext = patternCanvas.getContext('2d');\n const dpr = canvas.dpr;\n patternCanvas.dpr = dpr;\n patternCanvas.width = canvas.width;\n patternCanvas.height = canvas.height;\n\n patternContext.fillStyle = customProperties.getProperty('surface-color');\n patternContext.fillRect(0, 0, patternCanvas.width, patternCanvas.height);\n\n patternContext.fillStyle = '#000';\n patternContext.globalCompositeOperation = 'destination-out';\n\n const dialogHeight = this.dialogHeight = this.totalHeight * dpr;\n const length = this.length = Math.ceil(canvas.height / dialogHeight);\n for(let i = 0; i < length; ++i) {\n this.drawChat(patternContext, i, i * dialogHeight);\n }\n\n return ctx.createPattern(patternCanvas, 'no-repeat');\n }\n\n private drawChat(ctx: CanvasRenderingContext2D, i: number, y: number) {\n let generatedValues = this.generatedValues[i];\n if(!generatedValues) {\n generatedValues = this.generatedValues[i] = {\n firstLineWidth: 40 + Math.random() * 100, // 120\n secondLineWidth: 120 + Math.random() * 130, // 240\n statusWidth: 24 + Math.random() * 16\n };\n }\n\n const {\n firstLineWidth,\n secondLineWidth,\n statusWidth\n } = generatedValues;\n\n const {canvas} = ctx;\n const {dpr} = canvas;\n y /= dpr;\n\n const {\n avatarSize,\n marginVertical,\n lineHeight,\n lineBorderRadius,\n lineMarginVertical\n } = this;\n\n let marginLeft = 17;\n\n if(avatarSize) {\n drawCircleFromStart(ctx, marginLeft, y + marginVertical, avatarSize / 2, true);\n marginLeft += avatarSize + 10;\n }\n\n // 9 + 54 - 10 - 8 = 45 ........ 72 - 9 - 10 - 8\n roundRect(ctx, marginLeft, y + marginVertical + lineMarginVertical, firstLineWidth, lineHeight, lineBorderRadius, true);\n // roundRect(ctx, marginLeft, y + marginVertical + avatarSize - lineHeight - lineMarginVertical, secondLineWidth, lineHeight, lineBorderRadius, true);\n roundRect(ctx, marginLeft, y + this.totalHeight - marginVertical - lineHeight - lineMarginVertical, secondLineWidth, lineHeight, lineBorderRadius, true);\n\n roundRect(ctx, canvas.width / dpr - 24 - statusWidth, y + marginVertical + lineMarginVertical, statusWidth, lineHeight, lineBorderRadius, true);\n }\n}\n","export default function drawCircle(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n radius *= dpr;\n }\n\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, 2 * Math.PI, false);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n\nexport function drawCircleFromStart(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n return drawCircle(ctx, x + radius, y + radius, radius, fill, stroke);\n}\n","import rootScope from '../../lib/rootScope';\n\nexport default function shake(element: HTMLElement) {\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n\n const keyframes: Keyframe[] = [\n {transform: 'translateX(0)'},\n {transform: 'translateX(.25rem)'},\n {transform: 'translateX(-.25rem)'},\n {transform: 'translateX(0)'}\n ];\n\n element.animate([...keyframes, ...keyframes, ...keyframes], {\n duration: 300,\n iterations: 1,\n easing: 'ease-in-out'\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter as DialogFilter, MyDialogFilter} from '../storages/filters';\nimport type LazyLoadQueue from '../../components/lazyLoadQueue';\nimport type {Dialog, ForumTopic, MyMessage} from './appMessagesManager';\nimport type {MyPhoto} from './appPhotosManager';\nimport type {MyDocument} from './appDocsManager';\nimport type {State} from '../../config/state';\nimport AvatarElement from '../../components/avatar';\nimport DialogsContextMenu from '../../components/dialogsContextMenu';\nimport {horizontalMenu} from '../../components/horizontalMenu';\nimport ripple from '../../components/ripple';\nimport Scrollable, {ScrollableX, SliceSides} from '../../components/scrollable';\nimport {formatDateAccordingToTodayNew} from '../../helpers/date';\nimport {IS_MOBILE_SAFARI, IS_SAFARI} from '../../environment/userAgent';\nimport {logger, LogTypes} from '../logger';\nimport rootScope from '../rootScope';\nimport appImManager, {AppImManager, APP_TABS} from './appImManager';\nimport Button from '../../components/button';\nimport SetTransition from '../../components/singleTransition';\nimport {MyDraftMessage} from './appDraftsManager';\nimport DEBUG, {MOUNT_CLASS_TO} from '../../config/debug';\nimport PeerTitle from '../../components/peerTitle';\nimport I18n, {FormatterArguments, i18n, LangPackKey, _i18n} from '../langPack';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport wrapPhoto from '../../components/wrappers/photo';\nimport AppEditFolderTab from '../../components/sidebarLeft/tabs/editFolder';\nimport appSidebarLeft from '../../components/sidebarLeft';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport ConnectionStatusComponent from '../../components/connectionStatus';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport {fastRafConventional, fastRafPromise} from '../../helpers/schedulers';\nimport SortedUserList from '../../components/sortedUserList';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport handleTabSwipe from '../../helpers/dom/handleTabSwipe';\nimport windowSize from '../../helpers/windowSize';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport {setSendingStatus} from '../../components/sendingStatus';\nimport SortedList, {SortedElementBase} from '../../helpers/sortedList';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, NULL_PEER_ID, REAL_FOLDERS, REAL_FOLDER_ID} from '../mtproto/mtproto_config';\nimport groupCallActiveIcon from '../../components/groupCallActiveIcon';\nimport {Chat, Message, NotifyPeer} from '../../layer';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport appNavigationController, {NavigationItem} from '../../components/appNavigationController';\nimport appMediaPlaybackController from '../../components/appMediaPlaybackController';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {AppManagers} from './managers';\nimport appSidebarRight from '../../components/sidebarRight';\nimport PopupElement from '../../components/popups';\nimport choosePhotoSize from './utils/photos/choosePhotoSize';\nimport wrapEmojiText from '../richTextProcessor/wrapEmojiText';\nimport wrapMessageForReply from '../../components/wrappers/messageForReply';\nimport isMessageRestricted from './utils/messages/isMessageRestricted';\nimport getMediaFromMessage from './utils/messages/getMediaFromMessage';\nimport getMessageSenderPeerIdOrName from './utils/messages/getMessageSenderPeerIdOrName';\nimport wrapStickerEmoji from '../../components/wrappers/stickerEmoji';\nimport getDialogIndexKey from './utils/dialogs/getDialogIndexKey';\nimport getProxiedManagers from './getProxiedManagers';\nimport getDialogIndex from './utils/dialogs/getDialogIndex';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport wrapPeerTitle from '../../components/wrappers/peerTitle';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport appDownloadManager from './appDownloadManager';\nimport groupCallsController from '../calls/groupCallsController';\nimport callsController from '../calls/callsController';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport noop from '../../helpers/noop';\nimport DialogsPlaceholder from '../../helpers/dialogsPlaceholder';\nimport pause from '../../helpers/schedulers/pause';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {getMiddleware, MiddlewareHelper} from '../../helpers/middleware';\nimport makeError from '../../helpers/makeError';\nimport getUnsafeRandomInt from '../../helpers/number/getUnsafeRandomInt';\nimport Row, {RowMediaSizeType} from '../../components/row'\nimport SettingSection from '../../components/settingSection';\nimport {SliderSuperTabEventable} from '../../components/sliderTab';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport ButtonMenuToggle from '../../components/buttonMenuToggle';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport AppSharedMediaTab from '../../components/sidebarRight/tabs/sharedMedia';\nimport {dispatchHeavyAnimationEvent} from '../../hooks/useHeavyAnimationCheck';\nimport AppArchivedTab from '../../components/sidebarLeft/tabs/archivedTab';\nimport shake from '../../helpers/dom/shake';\nimport AppEditTopicTab from '../../components/sidebarRight/tabs/editTopic';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport const DIALOG_LIST_ELEMENT_TAG = 'A';\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge?: HTMLElement,\n unreadAvatarBadge?: HTMLElement,\n callIcon?: ReturnType,\n mentionsBadge?: HTMLElement,\n lastMessageSpan: HTMLSpanElement,\n containerEl: HTMLElement,\n listEl: HTMLElement,\n subtitleEl: HTMLElement,\n\n setLastMessagePromise?: CancellablePromise,\n setUnreadMessagePromise?: CancellablePromise\n};\n\ninterface SortedDialog extends SortedElementBase {\n dom: DialogDom,\n dialogElement: DialogElement\n}\n\nfunction setPromiseMiddleware}, K extends keyof T>(obj: T, key: K) {\n const oldPromise: CancellablePromise = obj[key] as any;\n oldPromise?.reject();\n\n // @ts-ignore\n const deferred = obj[key] = deferredPromise();\n deferred.catch(() => {}).finally(() => {\n if((obj[key] as any) === deferred) {\n delete obj[key];\n }\n });\n\n const middleware = middlewarePromise(() => (obj[key] as any) === deferred);\n return {deferred, middleware};\n}\n\nconst BADGE_SIZE = 22;\nconst BADGE_TRANSITION_TIME = 250;\n\nclass SortedDialogList extends SortedList {\n public managers: AppManagers;\n public log: ReturnType;\n public list: HTMLElement;\n public indexKey: ReturnType;\n public onListLengthChange: () => void;\n public forumPeerId: PeerId;\n\n constructor(options: {\n managers: SortedDialogList['managers'],\n log?: SortedDialogList['log'],\n list: SortedDialogList['list'],\n indexKey: SortedDialogList['indexKey'],\n onListLengthChange?: SortedDialogList['onListLengthChange'],\n forumPeerId?: SortedDialogList['forumPeerId']\n }) {\n super({\n getIndex: (element) => this.managers.dialogsStorage.getDialogIndex(this.forumPeerId ?? element.id, this.indexKey, this.forumPeerId ? element.id : undefined),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange?.();\n },\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength) {\n this.onListLengthChange?.();\n }\n },\n onElementCreate: async(base) => {\n const loadPromises: Promise[] = [];\n\n const dialogElement = appDialogsManager.addListDialog({\n peerId: this.forumPeerId ?? base.id,\n loadPromises,\n isBatch: true,\n threadId: this.forumPeerId ? base.id : undefined,\n isMainList: this.indexKey === 'index_0'\n });\n (base as SortedDialog).dom = dialogElement.dom;\n (base as SortedDialog).dialogElement = dialogElement;\n\n await Promise.all(loadPromises);\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional,\n log: options.log\n });\n\n safeAssign(this, options);\n }\n\n public clear() {\n this.list.replaceChildren();\n super.clear();\n }\n}\n\nexport type DialogElementSize = RowMediaSizeType;\ntype DialogElementOptions = {\n peerId: PeerId,\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n avatarSize?: RowMediaSizeType,\n autonomous?: boolean,\n loadPromises?: Promise[],\n fromName?: string,\n noIcons?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions,\n isMainList?: boolean\n};\nclass DialogElement extends Row {\n public dom: DialogDom;\n\n constructor({\n peerId,\n rippleEnabled = true,\n onlyFirstName = false,\n meAsSaved = true,\n avatarSize = 'bigger',\n autonomous,\n loadPromises,\n fromName,\n noIcons,\n threadId,\n wrapOptions = {},\n isMainList\n }: DialogElementOptions) {\n super({\n clickable: true,\n noRipple: !rippleEnabled,\n havePadding: !threadId,\n title: true,\n titleRightSecondary: true,\n subtitle: true,\n subtitleRight: true,\n noWrap: true,\n asLink: true\n });\n\n this.subtitleRight.remove();\n\n const avatarEl = threadId ? undefined : new AvatarElement();\n if(avatarEl) {\n const avatarSizeMap: {[k in DialogElementSize]?: number} = {\n bigger: 54,\n abitbigger: 42,\n small: 32\n };\n const s = avatarSizeMap[avatarSize];\n avatarEl.classList.add('dialog-avatar', 'avatar-' + s);\n avatarEl.updateWithOptions({\n loadPromises,\n lazyLoadQueue: wrapOptions.lazyLoadQueue,\n isDialog: !!meAsSaved,\n peerId,\n peerTitle: fromName\n });\n\n this.applyMediaElement(avatarEl, avatarSize);\n }\n\n const captionDiv = this.container;\n\n const titleSpanContainer = this.title;\n titleSpanContainer.classList.add('user-title');\n\n this.titleRow.classList.add('dialog-title');\n\n const peerTitle = new PeerTitle();\n const peerTitlePromise = peerTitle.update({\n peerId,\n fromName,\n dialog: meAsSaved,\n onlyFirstName,\n withIcons: !noIcons,\n threadId: threadId\n });\n\n loadPromises?.push(peerTitlePromise);\n titleSpanContainer.append(peerTitle.element);\n\n // for muted icon\n titleSpanContainer.classList.add('tgico'); // * эта строка будет актуальна только для !container, но ладно\n\n // const titleIconsPromise = generateTitleIcons(peerId).then((elements) => {\n // titleSpanContainer.append(...elements);\n // });\n\n // if(loadPromises) {\n // loadPromises.push(titleIconsPromise);\n // }\n // }\n\n const span = this.subtitle;\n // span.classList.add('user-last-message');\n\n const li = this.container;\n li.classList.add('chatlist-chat', 'chatlist-chat-' + avatarSize);\n if(!autonomous) {\n (li as HTMLAnchorElement).href = '#' + peerId;\n }\n // if(rippleEnabled) {\n // ripple(li);\n // }\n\n if(avatarSize === 'bigger') {\n this.container.classList.add('row-big');\n } else if(avatarSize === 'small') {\n this.container.classList.add('row-small');\n }\n\n li.dataset.peerId = '' + peerId;\n if(threadId) {\n li.dataset.threadId = '' + threadId;\n }\n\n const statusSpan = document.createElement('span');\n statusSpan.classList.add('message-status', 'sending-status'/* , 'transition', 'reveal' */);\n\n const lastTimeSpan = document.createElement('span');\n lastTimeSpan.classList.add('message-time');\n\n const rightSpan = this.titleRight;\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n\n this.subtitleRow.classList.add('dialog-subtitle');\n\n const dom: DialogDom = this.dom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl: this.subtitleRow\n };\n\n if(!autonomous) {\n (li as any).dialogDom = dom;\n\n const chat = appImManager.chat;\n if(chat && appImManager.isSamePeer(chat, {peerId, threadId: threadId, type: 'chat'})) {\n appDialogsManager.setDialogActive(li, true);\n }\n\n if(isMainList && appDialogsManager.forumTab?.peerId === peerId && !threadId) {\n li.classList.add('is-forum-open');\n }\n }\n }\n\n public createUnreadBadge() {\n if(this.dom.unreadBadge) return;\n const badge = this.dom.unreadBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE}`;\n this.dom.subtitleEl.append(badge);\n }\n\n public createUnreadAvatarBadge() {\n if(this.dom.unreadAvatarBadge) return;\n const badge = this.dom.unreadAvatarBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE} avatar-badge`;\n this.dom.listEl.append(badge);\n }\n\n public createMentionsBadge() {\n if(this.dom.mentionsBadge) return;\n const badge = this.dom.mentionsBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE} mention mention-badge`;\n badge.innerText = '@';\n this.dom.lastMessageSpan.after(badge);\n }\n\n public toggleBadgeByKey(\n key: Extract,\n hasBadge: boolean,\n justCreated: boolean,\n batch?: boolean\n ) {\n SetTransition({\n element: this.dom[key],\n className: 'is-visible',\n forwards: hasBadge,\n duration: batch ? 0 : BADGE_TRANSITION_TIME,\n onTransitionEnd: hasBadge ? undefined : () => {\n this.dom[key].remove();\n delete this.dom[key];\n },\n useRafs: !justCreated || !isInDOM(this.dom[key]) ? 2 : 0\n });\n }\n}\n\nclass ForumTab extends SliderSuperTabEventable {\n private rows: HTMLElement;\n private subtitle: HTMLElement;\n\n public peerId: PeerId;\n private firstTime: boolean;\n\n private log: ReturnType;\n\n private xd: Some3;\n\n public async toggle(value: boolean) {\n if(this.init2) {\n await this.init2();\n }\n\n SetTransition({\n element: this.container,\n className: 'is-visible',\n forwards: value,\n duration: 300,\n onTransitionEnd: !value ? () => {\n this.onCloseAfterTimeout();\n } : undefined,\n useRafs: this.firstTime ? (this.firstTime = undefined, 2) : undefined\n });\n }\n\n public init(options: {\n peerId: PeerId,\n managers: AppManagers\n }) {\n safeAssign(this, options);\n\n this.log = logger('FORUM');\n this.firstTime = true;\n this.container.classList.add('topics-container');\n\n const isFloating = !this.slider;\n if(isFloating) {\n this.closeBtn.classList.replace('tgico-left', 'tgico-close');\n this.container.classList.add('active', 'is-floating');\n\n attachClickEvent(this.closeBtn, () => {\n appDialogsManager.toggleForumTab(undefined, this);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.rows = document.createElement('div');\n this.rows.classList.add('sidebar-header__rows');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('sidebar-header__subtitle');\n\n this.title.replaceWith(this.rows);\n this.rows.append(this.title, this.subtitle);\n\n const list = appDialogsManager.createChatList();\n appDialogsManager.setListClickListener(list, null, true);\n this.scrollable.append(list);\n\n this.xd = new Some3(this.peerId, isFloating ? 80 : 0);\n this.xd.scrollable = this.scrollable;\n this.xd.sortedList = new SortedDialogList({\n managers: this.managers,\n log: this.log,\n list,\n indexKey: 'index_0',\n forumPeerId: this.peerId\n });\n this.xd.bindScrollable();\n\n const getOptionsForMessages = (): Parameters[0] => {\n return {\n peerId: this.peerId,\n type: 'chat'\n };\n };\n\n const btnMenu = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'info',\n text: 'ForumTopic.Context.Info',\n onClick: async() => {\n const tab = appSidebarLeft.createTab(AppSharedMediaTab, true);\n tab.isFirst = true;\n tab.setPeer(this.peerId);\n (await tab.fillProfileElements())();\n tab.loadSidebarMedia(true);\n tab.open();\n }\n }, {\n icon: 'message',\n text: 'ForumTopic.Context.ShowAsMessages',\n onClick: () => {\n const chat = appImManager.chat;\n appImManager[chat?.peerId === this.peerId ? 'setPeer' : 'setInnerPeer'](getOptionsForMessages());\n },\n verify: () => {\n const chat = appImManager.chat;\n return !chat || !appImManager.isSamePeer(chat, getOptionsForMessages());\n }\n }, {\n icon: 'adduser',\n text: 'ForumTopic.Context.AddMember',\n onClick: () => {},\n verify: () => false && this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users')\n }, {\n icon: 'add',\n text: 'ForumTopic.Context.New',\n onClick: () => {\n appSidebarLeft.createTab(AppEditTopicTab).open(this.peerId);\n },\n separator: true,\n verify: () => this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'manage_topics')\n }]\n });\n\n this.listenerSetter.add(rootScope)('history_reload', (peerId) => {\n if(this.peerId !== peerId) {\n return;\n }\n\n this.xd.fullReset();\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.peerId !== chatId.toPeerId(true)) {\n return;\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n if(!(chat as Chat.channel).pFlags.forum) {\n appDialogsManager.toggleForumTab(undefined, this);\n }\n });\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.container,\n onSwipe: () => {\n appDialogsManager.toggleForumTab(undefined, this);\n },\n middleware: this.middlewareHelper.get()\n });\n }\n\n this.header.append(btnMenu);\n\n if(!isFloating) {\n return this.init2();\n }\n }\n\n public async init2() {\n this.init2 = undefined;\n\n const middleware = this.middlewareHelper.get();\n const peerId = this.peerId;\n\n this.managers.apiUpdatesManager.subscribeToChannelUpdates(this.peerId.toChatId());\n middleware.onDestroy(() => {\n this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(this.peerId.toChatId());\n });\n\n const peerTitlePromise = wrapPeerTitle({\n peerId,\n dialog: true,\n wrapOptions: {middleware}\n });\n\n const setStatusPromise = appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear: true,\n useWhitespace: false,\n middleware,\n noTyping: true\n });\n\n // this.managers.dialogsStorage.getForumTopics(this.peerId).then((messagesForumTopics) => {\n // console.log(messagesForumTopics);\n\n // const promises = messagesForumTopics.topics.map((forumTopic) => {\n // return this.sortedDialogList.add(forumTopic.id);\n // });\n\n // return Promise.all(promises);\n // }).then(() => {\n // this.dialogsPlaceholder.detach(this.sortedDialogList.getAll().size);\n // });\n\n return Promise.all([\n peerTitlePromise,\n setStatusPromise,\n this.xd.onChatsScroll().then((loadResult) => {\n return loadResult.cached ? loadResult.renderPromise : undefined\n })\n ]).then(([\n peerTitle,\n setStatus,\n _\n ]) => {\n if(!middleware()) {\n return;\n }\n\n this.title.append(peerTitle);\n setStatus?.();\n });\n }\n\n public onCloseAfterTimeout() {\n super.onCloseAfterTimeout();\n this.xd.destroy();\n }\n}\n\nconst NOT_IMPLEMENTED_ERROR = new Error('not implemented');\n\ntype DialogKey = Parameters[0];\nclass Some {\n public sortedList: SortedDialogList;\n public scrollable: Scrollable;\n public loadedDialogsAtLeastOnce: boolean;\n public needPlaceholderAtFirstTime: boolean;\n protected offsets: {top: number, bottom: number};\n protected indexKey: ReturnType;\n protected sliceTimeout: number;\n protected managers: AppManagers;\n protected listenerSetter: ListenerSetter;\n protected loadDialogsPromise: Promise<{cached: boolean, renderPromise: Some2['loadDialogsRenderPromise']}>;\n protected loadDialogsRenderPromise: Promise;\n protected placeholder: DialogsPlaceholder;\n protected log: ReturnType;\n protected placeholderOptions: ConstructorParameters[0];\n\n constructor() {\n this.log = logger('CL');\n this.offsets = {top: 0, bottom: 0};\n this.managers = rootScope.managers;\n this.listenerSetter = new ListenerSetter();\n }\n\n public getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scrollable.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n protected isDialogMustBeInViewport(dialog: T) {\n // return true;\n const topOffset = this.getOffsetIndex('top');\n const bottomOffset = this.getOffsetIndex('bottom');\n\n if(!topOffset.index && !bottomOffset.index) {\n return true;\n }\n\n const index = getDialogIndex(dialog, this.indexKey);\n return (!topOffset.index || index <= topOffset.index) &&\n (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n public setIndexKey(indexKey: Some['indexKey']) {\n this.indexKey = indexKey;\n this.sortedList.indexKey = indexKey;\n }\n\n protected deleteDialogByKey(key: DialogKey) {\n this.sortedList.delete(key);\n }\n\n public deleteDialog(dialog: T) {\n return this.deleteDialogByKey(this.getDialogKey(dialog));\n }\n\n public updateDialog(dialog: T) {\n const key = this.getDialogKey(dialog);\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(key) && this.loadedDialogsAtLeastOnce) {\n this.sortedList.add(key);\n return;\n }\n } else {\n this.deleteDialog(dialog);\n return;\n }\n\n const dialogElement = this.getDialogElement(key);\n if(dialogElement) {\n appDialogsManager.setLastMessageN({\n dialog,\n dialogElement,\n setUnread: true\n });\n this.sortedList.update(key);\n }\n }\n\n public onChatsRegularScroll = () => {\n // return;\n\n if(this.sliceTimeout) clearTimeout(this.sliceTimeout);\n this.sliceTimeout = window.setTimeout(() => {\n this.sliceTimeout = undefined;\n\n if(!this.sortedList.list.childElementCount || appDialogsManager.processContact) {\n return;\n }\n\n /* const observer = new IntersectionObserver((entries) => {\n const\n });\n\n Array.from(this.chatList.children).forEach((el) => {\n observer.observe(el);\n }); */\n\n fastRafConventional(() => {\n const perf = performance.now();\n\n const scrollTopWas = this.scrollable.scrollTop;\n\n const firstElementChild = this.sortedList.list.firstElementChild;\n const rectContainer = this.scrollable.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scrollable.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scrollable.splitUp.offsetTop;\n if(offsetTop && scrollTopWas < offsetTop) offsetTop -= scrollTopWas;\n // const offsetTop = scrollTopWas < padding ? padding - scrollTopWas : 0;\n const firstY = rectContainer.y + offsetTop;\n const lastY = rectContainer.y/* - 8 */; // 8px - .chatlist padding-bottom\n\n const firstElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.ceil(firstY + 1)), firstElementChild.tagName) as HTMLElement;\n const lastElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.floor(lastY + rectContainer.height - 1)), firstElementChild.tagName) as HTMLElement;\n\n // alert('got element:' + rect.y);\n\n if(!firstElement || !lastElement) {\n return;\n }\n\n // alert('got element:' + !!firstElement);\n\n const firstElementRect = firstElement.getBoundingClientRect();\n const elementOverflow = firstElementRect.y - firstY;\n\n const sliced: HTMLElement[] = [];\n const firstIndex = children.indexOf(firstElement);\n const lastIndex = children.indexOf(lastElement);\n\n const saveLength = 10;\n\n const sliceFromStart = IS_SAFARI ? [] : children.slice(0, Math.max(0, firstIndex - saveLength));\n const sliceFromEnd = children.slice(lastIndex + saveLength);\n\n /* if(sliceFromStart.length !== sliceFromEnd.length) {\n console.log('not equal', sliceFromStart.length, sliceFromEnd.length);\n }\n\n if(sliceFromStart.length > sliceFromEnd.length) {\n const diff = sliceFromStart.length - sliceFromEnd.length;\n sliceFromStart.splice(0, diff);\n } else if(sliceFromEnd.length > sliceFromStart.length) {\n const diff = sliceFromEnd.length - sliceFromStart.length;\n sliceFromEnd.splice(sliceFromEnd.length - diff, diff);\n } */\n\n if(sliceFromStart.length) {\n this.scrollable.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scrollable.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach((el) => {\n this.deleteDialogByKey(this.getDialogKeyFromElement(el));\n });\n\n this.setOffsets();\n\n // this.log('[slicer] elements', firstElement, lastElement, rect, sliced, sliceFromStart.length, sliceFromEnd.length);\n\n // this.log('[slicer] reset scrollTop', this.scroll.scrollTop, firstElement.offsetTop, firstElementRect.y, rect.y, elementOverflow);\n\n // alert('left length:' + children.length);\n\n this.scrollable.scrollTop = firstElement.offsetTop - elementOverflow;\n\n this.log('slice time', performance.now() - perf);\n /* const firstElementRect = firstElement.getBoundingClientRect();\n const scrollTop = */\n\n // this.scroll.scrollIntoView(firstElement, false);\n });\n }, 200);\n };\n\n public onChatsScrollTop() {\n return this.onChatsScroll('top');\n };\n\n public onChatsScroll(side: SliceSides = 'bottom') {\n return this.loadDialogs(side);\n };\n\n public createPlaceholder(): DialogsPlaceholder {\n const placeholder = this.placeholder = new DialogsPlaceholder(this.placeholderOptions);\n const getRectFrom = this.getRectFromForPlaceholder();\n placeholder.attach({\n container: this.sortedList.list.parentElement,\n getRectFrom,\n onRemove: () => {\n if(this.placeholder === placeholder) {\n this.placeholder = undefined;\n }\n },\n blockScrollable: this.scrollable\n });\n\n return placeholder;\n }\n\n public loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n\n const log = this.log.bindPrefix('load-' + getUnsafeRandomInt(1000, 9999));\n log('try', side);\n\n if(this.loadDialogsPromise || this.loadDialogsRenderPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n else if(this.scrollable.loadedAll[side]) {\n return Promise.resolve({\n cached: true,\n renderPromise: Promise.resolve()\n });\n }\n\n log.warn('start', side);\n const middlewareError = makeError('MIDDLEWARE');\n\n const cachedInfoPromise = deferredPromise();\n const renderPromise = new Promise(async(resolve, reject) => {\n const chatList = this.sortedList.list;\n\n let placeholder = this.placeholder;\n try {\n const getConversationsResult = this.loadDialogsInner(side);\n const a = await getConversationsResult;\n\n if(\n !chatList.childElementCount &&\n !placeholder &&\n (\n (!this.loadedDialogsAtLeastOnce && this.needPlaceholderAtFirstTime) ||\n !a.cached\n )\n ) {\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n\n placeholder = this.createPlaceholder();\n\n cachedInfoPromise.resolve(false);\n }\n\n const result = await a.result;\n // await pause(5000);\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n\n cachedInfoPromise.resolve(a.cached);\n\n // console.timeEnd('getDialogs time');\n\n // * loaded all\n // if(!result.dialogs.length || chatList.childElementCount === result.count) {\n // !result.dialogs.length не подходит, так как при супердревном диалоге getConversations его не выдаст.\n // if(chatList.childElementCount === result.count) {\n if(side === 'bottom') {\n if(result.isEnd) {\n this.scrollable.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scrollable.loadedAll[side] = true;\n }\n\n const length = result.dialogs.length;\n log(`will render ${length} dialogs`);\n if(length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n\n const loadPromises = dialogs.map((dialog) => {\n return this.sortedList.add(this.getDialogKey(dialog as T));\n });\n\n await Promise.all(loadPromises).catch();\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : length - 1];\n if(offsetDialog) {\n this.offsets[side] = getDialogIndex(offsetDialog, this.indexKey);\n }\n\n // don't set it before - no need to fire length change with every dialog\n this.loadedDialogsAtLeastOnce = true;\n appDialogsManager.onListLengthChange();\n\n log('getDialogs', result, chatList.childElementCount);\n\n setTimeout(() => {\n this.scrollable.onScroll();\n }, 0);\n\n if(placeholder) {\n // await pause(500);\n placeholder.detach(chatList.childElementCount);\n }\n } catch(err) {\n if((err as ApiError)?.type !== 'MIDDLEWARE') {\n log.error(err);\n }\n\n reject(err);\n cachedInfoPromise.reject(err);\n return;\n }\n\n resolve();\n }).finally(() => {\n if(this.loadDialogsRenderPromise === renderPromise) {\n log('end');\n this.loadDialogsRenderPromise = undefined;\n } else {\n log('has been cleared');\n }\n });\n\n this.loadDialogsRenderPromise = renderPromise;\n const loadDialogsPromise = this.loadDialogsPromise = cachedInfoPromise.then((cached) => {\n return {\n cached,\n renderPromise\n };\n }).finally(() => {\n if(this.loadDialogsPromise === loadDialogsPromise) {\n this.loadDialogsPromise = undefined;\n }\n });\n\n return loadDialogsPromise;\n }\n\n public async setOffsets() {\n const chatList = this.sortedList.list;\n const [firstDialog, lastDialog] = await Promise.all([\n this.getDialogFromElement(chatList.firstElementChild as HTMLElement),\n this.getDialogFromElement(chatList.lastElementChild as HTMLElement)\n ]);\n\n const {indexKey} = this;\n this.offsets.top = getDialogIndex(firstDialog, indexKey);\n this.offsets.bottom = getDialogIndex(lastDialog, indexKey);\n }\n\n public getDialogKey(dialog: T): DialogKey {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getDialogKeyFromElement(element: HTMLElement): DialogKey {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getRectFromForPlaceholder(): Parameters[0]['getRectFrom'] {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getDialogFromElement(element: HTMLElement): Promise {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public loadDialogsInner(side: SliceSides): ReturnType {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public async setTyping(dialog: T) {\n const key = this.getDialogKey(dialog);\n const dom = this.getDialogDom(key);\n if(!dom) {\n return;\n }\n\n const oldTypingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n const newTypingElement = await appImManager.getPeerTyping(\n dialog.peerId,\n oldTypingElement,\n dialog._ === 'forumTopic' ? dialog.id : undefined\n );\n if(!oldTypingElement && newTypingElement) {\n replaceContent(dom.lastMessageSpan, newTypingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: T) {\n const key = this.getDialogKey(dialog);\n const dialogElement = this.getDialogElement(key);\n if(!dialogElement) {\n return;\n }\n\n dialogElement.dom.lastMessageSpan.classList.remove('user-typing');\n appDialogsManager.setLastMessageN({\n dialog,\n lastMessage: null,\n dialogElement,\n setUnread: null\n });\n }\n\n public getDialogDom(key: DialogKey) {\n // return this.doms[peerId];\n const element = this.sortedList.get(key);\n return element?.dom;\n }\n\n public getDialogElement(key: DialogKey) {\n const element = this.sortedList.get(key);\n return element?.dialogElement;\n }\n\n public bindScrollable() {\n this.scrollable.container.addEventListener('scroll', this.onChatsRegularScroll);\n this.scrollable.onScrolledTop = this.onChatsScrollTop.bind(this);\n this.scrollable.onScrolledBottom = this.onChatsScroll.bind(this);\n this.scrollable.setVirtualContainer(this.sortedList.list);\n }\n\n public clear() {\n this.sortedList.clear();\n this.placeholder?.remove();\n }\n\n public reset() {\n this.scrollable.loadedAll.top = true;\n this.scrollable.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsRenderPromise = undefined;\n this.loadDialogsPromise = undefined;\n }\n\n public fullReset() {\n this.reset();\n this.clear();\n return this.onChatsScroll();\n }\n\n public destroy() {\n this.clear();\n this.scrollable.destroy();\n this.listenerSetter.removeAll();\n }\n}\n\nclass Some3 extends Some {\n constructor(public peerId: PeerId, public paddingX: number) {\n super();\n\n this.placeholderOptions = {\n avatarSize: 0,\n marginVertical: 5,\n totalHeight: 64\n };\n\n this.listenerSetter.add(rootScope)('peer_typings', async({peerId, threadId, typings}) => {\n if(!threadId || this.peerId !== peerId) {\n return;\n }\n\n const dialog = await this.managers.dialogsStorage.getForumTopic(peerId, threadId);\n\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n for(const [peerId, {dialog, topics}] of dialogs) {\n if(peerId !== this.peerId || !topics?.size) {\n continue;\n }\n\n topics.forEach((forumTopic) => {\n this.updateDialog(forumTopic);\n });\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({dialog}) => {\n if(dialog?._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))});\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', async(dialog) => {\n if(dialog.peerId !== this.peerId) {\n return;\n }\n\n if(dialog._ === 'dialog') {\n const all = this.sortedList.getAll();\n const entries = [...all.entries()];\n const promises = entries.map(([id]) => this.managers.dialogsStorage.getForumTopic(this.peerId, id));\n const topics = await Promise.all(promises);\n entries.forEach(([id, element], idx) => {\n appDialogsManager.setUnreadMessagesN({dialog: topics[idx], dialogElement: element.dialogElement}); // возможно это не нужно, но нужно менять is-muted\n });\n\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))}); // возможно это не нужно, но нужно менять is-muted\n });\n\n this.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(dialog._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n this.deleteDialogByKey(this.getDialogKey(dialog));\n });\n\n this.listenerSetter.add(rootScope)('dialog_draft', ({dialog, drop, peerId}) => {\n if(dialog._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n if(drop) {\n this.deleteDialog(dialog);\n } else {\n this.updateDialog(dialog);\n }\n });\n }\n\n protected isDialogMustBeInViewport(dialog: ForumTopic) {\n if(dialog.pFlags.hidden) return false;\n return super.isDialogMustBeInViewport(dialog);\n }\n\n public getDialogKey(dialog: ForumTopic) {\n return dialog.id;\n }\n\n public getDialogKeyFromElement(element: HTMLElement) {\n return +element.dataset.threadId;\n }\n\n public getRectFromForPlaceholder() {\n return (): DOMRectEditable => {\n const sidebarRect = appSidebarLeft.rect;\n const paddingY = 56;\n return {\n top: paddingY,\n right: sidebarRect.right,\n bottom: 0,\n left: this.paddingX,\n width: sidebarRect.width - this.paddingX,\n height: sidebarRect.height - paddingY\n };\n };\n }\n\n public getDialogFromElement(element: HTMLElement) {\n return this.managers.dialogsStorage.getForumTopic(+element.dataset.peerId, +element.dataset.threadId);\n }\n\n public async loadDialogsInner(side: SliceSides) {\n const {indexKey} = this;\n let loadCount = windowSize.height / 64 * 1.25 | 0;\n let offsetIndex = 0;\n\n const filterId = this.peerId;\n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n offsetIndex = currentOffsetIndex;\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = await this.managers.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex((dialog) => getDialogIndex(dialog, indexKey) <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = getDialogIndex(storage[needIndex], indexKey) + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n\n return this.managers.acknowledged.dialogsStorage.getDialogs({\n offsetIndex,\n limit: loadCount,\n filterId,\n skipMigrated: true\n });\n }\n}\n\nclass Some2 extends Some {\n constructor(protected filterId: number) {\n super();\n\n this.needPlaceholderAtFirstTime = true;\n\n this.listenerSetter.add(rootScope)('peer_typings', async({peerId, typings}) => {\n const [dialog, isForum] = await Promise.all([\n this.managers.appMessagesManager.getDialogOnly(peerId),\n this.managers.appPeersManager.isForum(peerId)\n ]);\n\n if(!dialog || isForum) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', async(userId) => {\n if(!this.isActive) {\n return;\n }\n\n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(!dom) {\n return;\n }\n\n const status = await this.managers.appUsersManager.getUserStatus(userId);\n const online = status?._ === 'userStatusOnline';\n this.setOnlineStatus(dom.avatarEl, online);\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n const peerId = chatId.toPeerId(true);\n this.processDialogForCallStatus(peerId);\n });\n\n this.listenerSetter.add(rootScope)('dialog_flush', ({dialog}) => {\n if(!this.isActive || !dialog) {\n return;\n }\n\n appDialogsManager.setLastMessageN({\n dialog,\n setUnread: true\n });\n this.validateDialogForFilter(dialog);\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(!this.isActive) {\n return;\n }\n\n for(const [peerId, {dialog, topics}] of dialogs) {\n if(dialog?._ !== 'dialog') {\n continue;\n }\n\n this.updateDialog(dialog);\n\n appDialogsManager.processContact?.(peerId.toPeerId());\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(!this.isActive || dialog._ !== 'dialog') {\n return;\n }\n\n this.deleteDialogByKey(dialog.peerId);\n appDialogsManager.processContact?.(dialog.peerId);\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({dialog}) => {\n if(!this.isActive || dialog?._ !== 'dialog') {\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))});\n this.validateDialogForFilter(dialog);\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(!this.isActive || dialog._ === 'forumTopic') {\n return;\n }\n\n this.validateDialogForFilter(dialog);\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))}); // возможно это не нужно, но нужно менять is-muted\n });\n\n this.listenerSetter.add(rootScope)('dialog_draft', ({dialog, drop, peerId}) => {\n if(!this.isActive || dialog._ === 'forumTopic') {\n return;\n }\n\n if(drop) {\n this.deleteDialog(dialog);\n } else {\n this.updateDialog(dialog);\n }\n\n appDialogsManager.processContact?.(peerId);\n });\n\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\n if(this.isActive && filter.id === this.filterId && !REAL_FOLDERS.has(filter.id)) {\n const dialogs = await this.managers.dialogsStorage.getCachedDialogs(true);\n await this.validateListForFilter();\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n this.updateDialog(dialog);\n }\n }\n });\n }\n\n private get isActive() {\n return appDialogsManager.xd === this;\n }\n\n public getRectFromForPlaceholder() {\n return this.filterId === FOLDER_ID_ARCHIVE ? appDialogsManager.chatsContainer : appDialogsManager.folders.container;\n }\n\n public async loadDialogsInner(side: SliceSides) {\n const {filterId, indexKey} = this;\n let loadCount = windowSize.height / 72 * 1.25 | 0;\n let offsetIndex = 0;\n\n const doNotRenderChatList = appDialogsManager.doNotRenderChatList; // cache before awaits\n\n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = await this.managers.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex((dialog) => getDialogIndex(dialog, indexKey) <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = getDialogIndex(storage[needIndex], indexKey) + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n\n const promise = this.managers.acknowledged.dialogsStorage.getDialogs({\n offsetIndex,\n limit: loadCount,\n filterId,\n skipMigrated: true\n });\n\n const a = await promise;\n if(doNotRenderChatList) {\n a.result = Promise.reject(makeError('MIDDLEWARE'));\n }\n\n return a;\n }\n\n public setOnlineStatus(element: HTMLElement, online: boolean) {\n const className = 'is-online';\n const hasClassName = element.classList.contains(className);\n !hasClassName && online && element.classList.add(className);\n SetTransition({\n element: element,\n className: 'is-visible',\n forwards: online,\n duration: 250,\n onTransitionEnd: online ? undefined : () => {\n element.classList.remove(className);\n },\n useRafs: online && !hasClassName ? 2 : 0\n });\n }\n\n public generateScrollable(list: HTMLUListElement, filter: Parameters[0]) {\n const filterId = filter.id;\n const scrollable = new Scrollable(null, 'CL', 500);\n scrollable.container.dataset.filterId = '' + filterId;\n\n const indexKey = getDialogIndexKey(filter.localId);\n const sortedDialogList = new SortedDialogList({\n managers: rootScope.managers,\n log: this.log,\n list: list,\n indexKey,\n onListLengthChange: appDialogsManager.onListLengthChange\n });\n\n this.scrollable = scrollable;\n this.sortedList = sortedDialogList;\n this.setIndexKey(indexKey);\n this.bindScrollable();\n\n // list.classList.add('hide');\n // scrollable.container.style.backgroundColor = '#' + (Math.random() * (16 ** 6 - 1) | 0).toString(16);\n\n return scrollable;\n }\n\n public testDialogForFilter(dialog: Dialog) {\n if(!REAL_FOLDERS.has(this.filterId) ? getDialogIndex(dialog, this.indexKey) === undefined : this.filterId !== dialog.folder_id) {\n return false;\n }\n\n return true;\n }\n\n protected isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\n return super.isDialogMustBeInViewport(dialog);\n }\n\n /**\n * Удалит неподходящие чаты из списка, но не добавит их(!)\n */\n public async validateListForFilter() {\n this.sortedList.getAll().forEach(async(element) => {\n const dialog = await rootScope.managers.appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog);\n }\n });\n }\n\n /**\n * Удалит неподходящий чат из списка, но не добавит его(!)\n */\n public validateDialogForFilter(dialog: Dialog) {\n if(!this.getDialogElement(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog);\n }\n }\n\n public setCallStatus(dom: DialogDom, visible: boolean) {\n let {callIcon, listEl} = dom;\n if(!callIcon && visible) {\n const {canvas, startAnimation} = dom.callIcon = callIcon = groupCallActiveIcon(listEl.classList.contains('active'));\n canvas.classList.add('dialog-group-call-icon');\n listEl.append(canvas);\n startAnimation();\n }\n\n if(!callIcon) {\n return;\n }\n\n SetTransition({\n element: dom.callIcon.canvas,\n className: 'is-visible',\n forwards: visible,\n duration: BADGE_TRANSITION_TIME,\n onTransitionEnd: visible ? undefined : () => {\n dom.callIcon.canvas.remove();\n dom.callIcon = undefined;\n },\n useRafs: visible ? 2 : 0\n });\n }\n\n public async processDialogForCallStatus(peerId: PeerId, dom?: DialogDom) {\n if(!IS_GROUP_CALL_SUPPORTED) {\n return;\n }\n\n if(!dom) dom = this.getDialogDom(peerId);\n if(!dom) return;\n\n const chat = await rootScope.managers.appChatsManager.getChat(peerId.toChatId()) as Chat.chat | Chat.channel;\n this.setCallStatus(dom, !!(chat.pFlags.call_active && chat.pFlags.call_not_empty));\n }\n\n public onChatsScroll(side: SliceSides = 'bottom') {\n if(this.scrollable.loadedAll[side]) {\n appDialogsManager.loadContacts?.();\n }\n\n this.log('onChatsScroll', side);\n return super.onChatsScroll(side);\n }\n\n public toggleAvatarUnreadBadges(value: boolean, useRafs: number) {\n if(!value) {\n this.sortedList.getAll().forEach((sortedDialog) => {\n const {dom, dialogElement} = sortedDialog;\n if(!dom.unreadAvatarBadge) {\n return;\n }\n\n dialogElement.toggleBadgeByKey('unreadAvatarBadge', false, false, false);\n });\n\n return;\n }\n\n const reuseClassNames = ['unread', 'mention'];\n this.sortedList.getAll().forEach((sortedDialog) => {\n const {dom, dialogElement} = sortedDialog;\n const unreadContent = dom.unreadBadge?.textContent;\n if(!unreadContent || dom.unreadBadge.classList.contains('backwards')) {\n return;\n }\n\n const isUnreadAvatarBadgeMounted = !!dom.unreadAvatarBadge;\n dialogElement.createUnreadAvatarBadge();\n dialogElement.toggleBadgeByKey('unreadAvatarBadge', true, isUnreadAvatarBadgeMounted);\n dom.unreadAvatarBadge.textContent = unreadContent;\n const unreadAvatarBadgeClassList = dom.unreadAvatarBadge.classList;\n const unreadBadgeClassList = dom.unreadBadge.classList;\n reuseClassNames.forEach((className) => {\n unreadAvatarBadgeClassList.toggle(className, unreadBadgeClassList.contains(className));\n });\n });\n }\n\n public getDialogKey(dialog: Dialog) {\n return dialog.peerId;\n }\n\n public getDialogKeyFromElement(element: HTMLElement) {\n return +element.dataset.peerId;\n }\n\n public getDialogFromElement(element: HTMLElement) {\n return rootScope.managers.appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n}\n\n// const testScroll = false;\n// let testTopSlice = 1;\n\nexport class AppDialogsManager {\n public chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n\n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu: DialogsContextMenu;\n\n public filterId: number;\n public folders: {[k in 'menu' | 'container' | 'menuScrollContainer']: HTMLElement} = {\n menu: document.getElementById('folders-tabs'),\n menuScrollContainer: null,\n container: document.getElementById('folders-container')\n };\n private filtersRendered: {\n [filterId: string]: {\n menu: HTMLElement,\n container: HTMLElement,\n unread: HTMLElement,\n title: HTMLElement\n }\n } = {};\n private showFiltersPromise: Promise;\n\n private lastActiveElements: Set = new Set();\n\n public loadContacts: () => void;\n public processContact: (peerId: PeerId) => void;\n\n private initedListeners = false;\n\n public onListLengthChange: () => Promise;\n private allChatsIntlElement: I18n.IntlElement;\n\n private emptyDialogsPlaceholderSubtitle: I18n.IntlElement;\n private updateContactsLengthPromise: Promise;\n\n private filtersNavigationItem: NavigationItem;\n\n private managers: AppManagers;\n private selectTab: ReturnType;\n\n public doNotRenderChatList: boolean;\n\n private stateMiddlewareHelper: MiddlewareHelper;\n\n private forumsTabs: Map;\n private forumsSlider: HTMLElement;\n public forumTab: ForumTab;\n private forumNavigationItem: NavigationItem;\n\n public xd: Some2;\n public xds: {[filterId: number]: Some2} = {};\n\n public start() {\n const managers = this.managers = getProxiedManagers();\n\n this.contextMenu = new DialogsContextMenu(managers);\n this.stateMiddlewareHelper = getMiddleware();\n\n this.folders.menuScrollContainer = this.folders.menu.parentElement;\n\n this.onListLengthChange = debounce(this._onListLengthChange, 100, false, true);\n\n const bottomPart = document.createElement('div');\n bottomPart.classList.add('connection-status-bottom');\n bottomPart.append(this.folders.container);\n\n this.forumsTabs = new Map();\n this.forumsSlider = document.createElement('div');\n this.forumsSlider.classList.add('topics-slider');\n this.chatsContainer.parentElement.parentElement.append(this.forumsSlider);\n // findUpClassName(this.chatsContainer, 'chatlist-container').append(this.forumsSlider);\n\n // appSidebarLeft.onOpenTab = () => {\n // return this.toggleForumTab();\n // };\n\n /* if(isTouchSupported && isSafari) {\n let allowUp: boolean, allowDown: boolean, slideBeginY: number;\n const container = this.scroll.container;\n container.addEventListener('touchstart', (event) => {\n allowUp = container.scrollTop > 0;\n allowDown = (container.scrollTop < container.scrollHeight - container.clientHeight);\n // @ts-ignore\n slideBeginY = event.pageY;\n });\n\n container.addEventListener('touchmove', (event: any) => {\n var up = (event.pageY > slideBeginY);\n var down = (event.pageY < slideBeginY);\n slideBeginY = event.pageY;\n if((up && allowUp) || (down && allowDown)) {\n event.stopPropagation();\n } else if(up || down) {\n event.preventDefault();\n }\n });\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.folders.container,\n onSwipe: (xDiff) => {\n const prevId = selectTab.prevId();\n selectTab(xDiff < 0 ? prevId + 1 : prevId - 1);\n },\n verifyTouchTarget: () => {\n return !this.forumTab;\n }\n });\n }\n\n this.allChatsIntlElement = new I18n.IntlElement({\n key: 'FilterAllChatsShort'\n });\n\n rootScope.addEventListener('premium_toggle', async(isPremium) => {\n if(isPremium) {\n return;\n }\n\n const isFolderAvailable = await this.managers.filtersStorage.isFilterIdAvailable(this.filterId);\n if(!isFolderAvailable) {\n selectTab(whichChild(this.filtersRendered[FOLDER_ID_ALL].menu), false);\n }\n });\n\n rootScope.addEventListener('state_cleared', () => {\n const clearCurrent = REAL_FOLDERS.has(this.filterId);\n // setTimeout(() =>\n apiManagerProxy.getState().then(async(state) => {\n this.xd.loadedDialogsAtLeastOnce = false;\n this.showFiltersPromise = undefined;\n\n /* const clearPromises: Promise[] = [];\n for(const name in this.managers.appStateManager.storagesResults) {\n const results = this.managers.appStateManager.storagesResults[name as keyof AppStateManager['storages']];\n const storage = this.managers.appStateManager.storages[name as keyof AppStateManager['storages']];\n results.length = 0;\n clearPromises.push(storage.clear());\n } */\n\n if(clearCurrent) {\n this.xd.clear();\n this.onTabChange();\n }\n\n this.onStateLoaded(state);\n })// , 5000);\n });\n\n this.setFilterId(FOLDER_ID_ALL, FOLDER_ID_ALL);\n this.addFilter({\n id: FOLDER_ID_ALL,\n title: '',\n localId: FOLDER_ID_ALL\n });\n\n const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);\n bottomPart.prepend(this.folders.menuScrollContainer);\n const selectTab = this.selectTab = horizontalMenu(this.folders.menu, this.folders.container, async(id, tabContent) => {\n /* if(id !== 0) {\n id += 1;\n } */\n\n const _id = id;\n id = +tabContent.dataset.filterId || FOLDER_ID_ALL;\n\n const isFilterAvailable = this.filterId === -1 || REAL_FOLDERS.has(id) || await this.managers.filtersStorage.isFilterIdAvailable(id);\n if(!isFilterAvailable) {\n return false;\n }\n\n const wasFilterId = this.filterId;\n if(!IS_MOBILE_SAFARI) {\n if(_id) {\n if(!this.filtersNavigationItem) {\n this.filtersNavigationItem = {\n type: 'filters',\n onPop: () => {\n selectTab(0);\n this.filtersNavigationItem = undefined;\n }\n };\n\n appNavigationController.spliceItems(1, 0, this.filtersNavigationItem);\n }\n } else if(this.filtersNavigationItem) {\n appNavigationController.removeItem(this.filtersNavigationItem);\n this.filtersNavigationItem = undefined;\n }\n }\n\n if(wasFilterId === id) return;\n\n this.xds[id].clear();\n const promise = this.setFilterIdAndChangeTab(id).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n\n if(wasFilterId !== -1) {\n return promise;\n }\n }, () => {\n for(const folderId in this.xds) {\n if(+folderId !== this.filterId) {\n this.xds[folderId].clear();\n }\n }\n }, undefined, foldersScrollable);\n\n apiManagerProxy.getState().then((state) => {\n // * it should've had a better place :(\n appMediaPlaybackController.setPlaybackParams(state.playbackParams);\n appMediaPlaybackController.addEventListener('playbackParams', (params) => {\n this.managers.appStateManager.pushToState('playbackParams', params);\n });\n\n return this.onStateLoaded(state);\n })/* .then(() => {\n const isLoadedMain = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(0);\n const isLoadedArchive = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n const wasLoaded = isLoadedMain || isLoadedArchive;\n const a: Promise = isLoadedMain ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 0);\n const b: Promise = isLoadedArchive ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 1);\n a.finally(() => {\n b.then(() => {\n if(wasLoaded) {\n (apiUpdatesManager.updatesState.syncLoading || Promise.resolve()).then(() => {\n this.managers.appMessagesManager.refreshConversations();\n });\n }\n });\n });\n }) */;\n\n mediaSizes.addEventListener('resize', () => {\n this.changeFiltersAllChatsKey();\n });\n\n new ConnectionStatusComponent(this.managers, this.chatsContainer);\n this.chatsContainer.append(bottomPart);\n\n setTimeout(() => {\n lottieLoader.loadLottieWorkers();\n }, 200);\n\n PopupElement.MANAGERS = rootScope.managers = managers;\n appDownloadManager.construct(managers);\n appSidebarLeft.construct(managers);\n appSidebarRight.construct(managers);\n groupCallsController.construct(managers);\n callsController.construct(managers);\n appImManager.construct(managers);\n\n // start\n\n this.xd = this.xds[this.filterId];\n\n // selectTab(0, false);\n }\n\n public get chatList() {\n return this.xd.sortedList.list;\n }\n\n public setFilterId(filterId: number, localId: MyDialogFilter['localId']) {\n this.filterId = filterId;\n }\n\n public async setFilterIdAndChangeTab(filterId: number) {\n this.filterId = filterId;\n return this.onTabChange();\n }\n\n private initListeners() {\n rootScope.addEventListener('dialog_flush', ({dialog}) => {\n if(!dialog) {\n return;\n }\n\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('folder_unread', async(folder) => {\n if(folder.id < 0) {\n const dialogElement = this.xd.getDialogElement(folder.id);\n if(!dialogElement) {\n return;\n }\n\n this.setUnreadMessagesN({\n dialog: await this.managers.dialogsStorage.getDialogOnly(folder.id),\n dialogElement\n });\n } else {\n this.setFilterUnreadCount(folder.id);\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact?.(userId.toPeerId());\n });\n\n appImManager.addEventListener('peer_changed', ({peerId, threadId, isForum}) => {\n const options: Parameters[0] = {peerId, threadId: isForum ? threadId : undefined};\n // const perf = performance.now();\n for(const element of this.lastActiveElements) {\n const elementThreadId = +element.dataset.threadId || undefined;\n const elementPeerId = element.dataset.peerId.toPeerId();\n if(!appImManager.isSamePeer({peerId: elementPeerId, threadId: elementThreadId}, options)) {\n this.setDialogActive(element, false);\n }\n }\n\n const elements = Array.from(document.querySelectorAll(`[data-autonomous=\"0\"] .chatlist-chat[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n const elementThreadId = +element.dataset.threadId || undefined;\n if(appImManager.isSamePeer({peerId, threadId: elementThreadId}, options)) {\n this.setDialogActive(element, true);\n }\n });\n // this.log('peer_changed total time:', performance.now() - perf);\n });\n\n rootScope.addEventListener('filter_update', async(filter) => {\n if(REAL_FOLDERS.has(filter.id)) {\n return;\n }\n\n if(!this.filtersRendered[filter.id]) {\n this.addFilter(filter);\n return;\n }\n\n const elements = this.filtersRendered[filter.id];\n setInnerHTML(elements.title, wrapEmojiText(filter.title));\n });\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const elements = this.filtersRendered[filter.id];\n if(!elements) return;\n\n // set tab\n // (this.folders.menu.firstElementChild.children[Math.max(0, filter.id - 2)] as HTMLElement).click();\n elements.container.remove();\n elements.menu.remove();\n\n this.xds[filter.id].destroy();\n delete this.xds[filter.id];\n delete this.filtersRendered[filter.id];\n\n this.onFiltersLengthChange();\n\n if(this.filterId === filter.id) {\n this.selectTab(0, false);\n }\n });\n\n rootScope.addEventListener('filter_order', async(order) => {\n order = order.slice();\n indexOfAndSplice(order, FOLDER_ID_ARCHIVE);\n\n const containerToAppend = this.folders.menu as HTMLElement;\n const r = await Promise.all(order.map(async(filterId) => {\n const [indexKey, filter] = await Promise.all([\n this.managers.dialogsStorage.getDialogIndexKeyByFilterId(filterId),\n this.managers.filtersStorage.getFilter(filterId)\n ]);\n\n return {indexKey, filter};\n }));\n\n order.forEach((filterId, idx) => {\n const {indexKey, filter} = r[idx];\n const renderedFilter = this.filtersRendered[filterId];\n\n this.xds[filterId].setIndexKey(indexKey);\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.localId);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.localId);\n });\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n }\n\n public setDialogActive(listEl: HTMLElement, active: boolean) {\n const dom = (listEl as any).dialogDom as DialogDom;\n listEl.classList.toggle('active', active);\n listEl.classList.toggle('is-forum-open', this.forumTab?.peerId === listEl.dataset.peerId.toPeerId() && !listEl.dataset.threadId);\n if(active) {\n this.lastActiveElements.add(listEl);\n } else {\n this.lastActiveElements.delete(listEl);\n }\n\n if(dom?.callIcon) {\n dom.callIcon.setActive(active);\n }\n }\n\n private async onStateLoaded(state: State) {\n this.stateMiddlewareHelper.clean();\n const middleware = this.stateMiddlewareHelper.get();\n const filtersArr = state.filtersArr;\n const haveFilters = filtersArr.length > REAL_FOLDERS.size;\n // const filter = filtersArr.find((filter) => filter.id !== FOLDER_ID_ARCHIVE);\n\n const addFilters = (filters: MyDialogFilter[]) => {\n for(const filter of filters) {\n this.addFilter(filter);\n }\n };\n\n let addFiltersPromise: Promise;\n if(haveFilters) {\n addFilters(filtersArr);\n } else {\n addFiltersPromise = this.managers.filtersStorage.getDialogFilters().then(addFilters);\n }\n\n this.doNotRenderChatList = true;\n const loadDialogsPromise = this.xd.onChatsScroll();\n const m = middlewarePromise(middleware);\n try {\n await m(loadDialogsPromise);\n } catch(err) {\n\n }\n\n // show the placeholder before the filters, and then will reset to the default tab again\n if(!haveFilters) {\n this.selectTab(0, false);\n }\n\n addFiltersPromise && await m(addFiltersPromise);\n // this.folders.menu.children[0].classList.add('active');\n\n this.doNotRenderChatList = undefined;\n\n this.filterId = -1;\n this.selectTab(0, false);\n\n if(!this.initedListeners) {\n this.initListeners();\n this.initedListeners = true;\n }\n\n haveFilters && this.showFiltersPromise && await m(this.showFiltersPromise);\n\n this.managers.appNotificationsManager.getNotifyPeerTypeSettings();\n\n await (await m(loadDialogsPromise)).renderPromise.catch(noop);\n this.managers.appMessagesManager.fillConversations();\n }\n\n /* private getOffset(side: 'top' | 'bottom'): {index: number, pos: number} {\n if(!this.scroll.loadedAll[side]) {\n const element = (side === 'top' ? this.chatList.firstElementChild : this.chatList.lastElementChild) as HTMLElement;\n if(element) {\n const peerId = element.dataset.peerId;\n const dialog = this.managers.appMessagesManager.getDialogByPeerId(peerId);\n return {index: dialog[0].index, pos: dialog[1]};\n }\n }\n\n return {index: 0, pos: -1};\n } */\n\n public onTabChange = () => {\n this.xd = this.xds[this.filterId];\n this.xd.reset();\n return this.xd.onChatsScroll();\n };\n\n private async setFilterUnreadCount(filterId: number) {\n // if(filterId === FOLDER_ID_ALL) {\n // return;\n // }\n\n const unreadSpan = this.filtersRendered[filterId]?.unread;\n if(!unreadSpan) {\n return;\n }\n\n const {unreadUnmutedCount, unreadCount} = await this.managers.dialogsStorage.getFolderUnreadCount(filterId);\n\n unreadSpan.classList.toggle('badge-gray', !unreadUnmutedCount);\n const count = filterId === FOLDER_ID_ALL ? unreadUnmutedCount : unreadCount;\n unreadSpan.innerText = count ? '' + count : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n }\n\n public l(filter: Parameters[0]) {\n const ul = this.createChatList();\n const xd = this.xds[filter.id] = new Some2(filter.id);\n const scrollable = xd.generateScrollable(ul, filter);\n this.setListClickListener(ul, null, true);\n\n return {ul, xd, scrollable};\n }\n\n private addFilter(filter: Pick) {\n if(filter.id === FOLDER_ID_ARCHIVE) {\n return;\n }\n\n const containerToAppend = this.folders.menu as HTMLElement;\n const renderedFilter = this.filtersRendered[filter.id];\n if(renderedFilter) {\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.localId);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.localId);\n return;\n }\n\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const titleSpan = document.createElement('span');\n titleSpan.classList.add('text-super');\n if(filter.id === FOLDER_ID_ALL) titleSpan.append(this.allChatsIntlElement.element);\n else setInnerHTML(titleSpan, wrapEmojiText(filter.title));\n const unreadSpan = document.createElement('div');\n unreadSpan.classList.add('badge', 'badge-20', 'badge-primary');\n const i = document.createElement('i');\n span.append(titleSpan, unreadSpan, i);\n ripple(menuTab);\n menuTab.append(span);\n\n menuTab.dataset.filterId = '' + filter.id;\n\n positionElementByIndex(menuTab, containerToAppend, filter.localId);\n // containerToAppend.append(li);\n\n const {ul, scrollable} = this.l(filter);\n scrollable.container.classList.add('tabs-tab', 'chatlist-parts');\n\n /* const parts = document.createElement('div');\n parts.classList.add('chatlist-parts'); */\n\n const top = document.createElement('div');\n top.classList.add('chatlist-top');\n\n const bottom = document.createElement('div');\n bottom.classList.add('chatlist-bottom');\n\n top.append(ul);\n scrollable.container.append(top, bottom);\n /* parts.append(top, bottom);\n scrollable.container.append(parts); */\n\n const div = scrollable.container;\n // this.folders.container.append(div);\n positionElementByIndex(scrollable.container, this.folders.container, filter.localId);\n\n this.filtersRendered[filter.id] = {\n menu: menuTab,\n container: div,\n unread: unreadSpan,\n title: titleSpan\n };\n\n this.onFiltersLengthChange();\n }\n\n private changeFiltersAllChatsKey() {\n const scrollable = this.folders.menuScrollContainer.firstElementChild;\n const key: LangPackKey = scrollable.scrollWidth > scrollable.clientWidth ? 'FilterAllChatsShort' : 'FilterAllChats';\n this.allChatsIntlElement.compareAndUpdate({key});\n }\n\n private onFiltersLengthChange() {\n let promise = this.showFiltersPromise;\n return promise ??= this.showFiltersPromise = pause(0).then(() => {\n if(this.showFiltersPromise !== promise) {\n return;\n }\n\n const length = Object.keys(this.filtersRendered).length;\n const show = length > 1;\n const wasShowing = !this.folders.menuScrollContainer.classList.contains('hide');\n\n if(show !== wasShowing) {\n this.folders.menuScrollContainer.classList.toggle('hide', !show);\n if(show && !wasShowing) {\n this.setFiltersUnreadCount();\n }\n\n this.chatsContainer.classList.toggle('has-filters', show);\n }\n\n this.changeFiltersAllChatsKey();\n\n this.showFiltersPromise = undefined;\n });\n }\n\n private generateEmptyPlaceholder(options: {\n title: LangPackKey,\n subtitle?: LangPackKey,\n subtitleArgs?: FormatterArguments,\n classNameType: string\n }) {\n const BASE_CLASS = 'empty-placeholder';\n const container = document.createElement('div');\n container.classList.add(BASE_CLASS, BASE_CLASS + '-' + options.classNameType);\n\n const header = document.createElement('div');\n header.classList.add(BASE_CLASS + '-header');\n _i18n(header, options.title);\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(BASE_CLASS + '-subtitle');\n if(options.subtitle) {\n _i18n(subtitle, options.subtitle, options.subtitleArgs);\n }\n\n container.append(header, subtitle);\n\n return {container, header, subtitle};\n }\n\n private checkIfPlaceholderNeeded() {\n if(this.filterId === FOLDER_ID_ARCHIVE) {\n return;\n }\n\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n let placeholderContainer = (Array.from(part.children) as HTMLElement[]).find((el) => el.matches('.empty-placeholder'));\n const needPlaceholder = this.xd.scrollable.loadedAll.bottom && !chatList.childElementCount/* || true */;\n // chatList.style.display = 'none';\n\n if(needPlaceholder && placeholderContainer) {\n return;\n } else if(!needPlaceholder) {\n if(placeholderContainer) {\n part.classList.remove('with-placeholder');\n placeholderContainer.remove();\n }\n\n return;\n }\n\n let placeholder: ReturnType, type: 'dialogs' | 'folder';\n if(!this.filterId) {\n placeholder = this.generateEmptyPlaceholder({\n title: 'ChatList.Main.EmptyPlaceholder.Title',\n classNameType: type = 'dialogs'\n });\n\n placeholderContainer = placeholder.container;\n\n const img = document.createElement('img');\n img.classList.add('empty-placeholder-dialogs-icon');\n\n this.emptyDialogsPlaceholderSubtitle = new I18n.IntlElement({\n element: placeholder.subtitle\n });\n\n Promise.all([\n this.updateContactsLength(false),\n renderImageFromUrlPromise(img, 'assets/img/EmptyChats.svg'),\n fastRafPromise()\n ]).then(([usersLength]) => {\n placeholderContainer.classList.add('visible');\n part.classList.toggle('has-contacts', !!usersLength);\n });\n\n placeholderContainer.prepend(img);\n } else {\n placeholder = this.generateEmptyPlaceholder({\n title: 'FilterNoChatsToDisplay',\n subtitle: 'FilterNoChatsToDisplayInfo',\n classNameType: type = 'folder'\n });\n\n placeholderContainer = placeholder.container;\n\n const div = document.createElement('div');\n const emoji = '📂';\n const size = 128;\n wrapStickerEmoji({\n div,\n emoji: emoji,\n width: size,\n height: size\n });\n\n placeholderContainer.prepend(div);\n\n const button = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'FilterHeaderEdit',\n icon: 'settings'\n });\n\n attachClickEvent(button, async() => {\n const tab = appSidebarLeft.createTab(AppEditFolderTab);\n tab.setInitFilter(await this.managers.filtersStorage.getFilter(this.filterId));\n tab.open();\n });\n\n placeholderContainer.append(button);\n }\n\n part.append(placeholderContainer);\n part.classList.add('with-placeholder');\n part.dataset.placeholderType = type;\n }\n\n private updateContactsLength(updatePartClassName: boolean) {\n return this.updateContactsLengthPromise ??= this.managers.appUsersManager.getContacts().then((users) => {\n const subtitle = this.emptyDialogsPlaceholderSubtitle;\n if(subtitle) {\n let key: LangPackKey, args: FormatterArguments;\n\n if(users.length/* && false */) {\n key = 'ChatList.Main.EmptyPlaceholder.Subtitle';\n args = [i18n('Contacts.Count', [users.length])];\n } else {\n key = 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts';\n args = [];\n }\n\n subtitle.compareAndUpdate({\n key,\n args\n });\n }\n\n if(updatePartClassName) {\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n part.classList.toggle('has-contacts', !!users.length);\n }\n\n this.updateContactsLengthPromise = undefined;\n\n return users.length;\n });\n }\n\n private removeContactsPlaceholder() {\n const chatList = this.chatList;\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n parts.classList.remove('with-contacts');\n bottom.replaceChildren();\n this.loadContacts = undefined;\n this.processContact = undefined;\n }\n\n private _onListLengthChange = () => {\n if(!this.xd.loadedDialogsAtLeastOnce) {\n return;\n }\n\n this.checkIfPlaceholderNeeded();\n\n if(this.filterId !== FOLDER_ID_ALL) return;\n\n const chatList = this.chatList;\n const count = chatList.childElementCount;\n\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n const hasContacts = !!bottom.childElementCount;\n if(count >= 10) {\n if(hasContacts) {\n this.removeContactsPlaceholder();\n }\n\n return;\n } else if(hasContacts) return;\n\n parts.classList.add('with-contacts');\n\n const section = new SettingSection({\n name: 'Contacts',\n noDelimiter: true,\n fakeGradientDelimiter: true\n });\n\n section.container.classList.add('hide');\n\n this.managers.appUsersManager.getContactsPeerIds(undefined, undefined, 'online').then((contacts) => {\n let ready = false;\n const onListLengthChange = () => {\n if(ready) {\n section.container.classList.toggle('hide', !sortedUserList.list.childElementCount);\n }\n\n this.updateContactsLength(true);\n };\n\n const sortedUserList = new SortedUserList({\n avatarSize: 'abitbigger',\n createChatListOptions: {\n dialogSize: 48,\n new: true\n },\n autonomous: false,\n onListLengthChange,\n managers: this.managers\n });\n\n this.loadContacts = () => {\n const pageCount = windowSize.height / 60 | 0;\n const promise = filterAsync(contacts.splice(0, pageCount), this.verifyPeerIdForContacts);\n\n promise.then((arr) => {\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n });\n\n if(!contacts.length) {\n this.loadContacts = undefined;\n }\n };\n\n this.loadContacts();\n\n this.processContact = async(peerId) => {\n if(peerId.isAnyChat()) {\n return;\n }\n\n const good = await this.verifyPeerIdForContacts(peerId);\n const added = sortedUserList.has(peerId);\n if(!added && good) sortedUserList.add(peerId);\n else if(added && !good) sortedUserList.delete(peerId);\n };\n\n const list = sortedUserList.list;\n list.classList.add('chatlist-new');\n this.setListClickListener(list);\n section.content.append(list);\n\n ready = true;\n onListLengthChange();\n });\n\n bottom.append(section.container);\n };\n\n private verifyPeerIdForContacts = async(peerId: PeerId) => {\n const [isContact, dialog] = await Promise.all([\n this.managers.appPeersManager.isContact(peerId),\n this.managers.appMessagesManager.getDialogOnly(peerId)\n ]);\n\n return isContact && !dialog;\n };\n\n public async toggleForumTab(newTab?: ForumTab, hideTab = this.forumTab) {\n if(!hideTab && !newTab) {\n return;\n }\n\n if(hideTab) {\n const dialogElement = this.xd.getDialogElement(hideTab.peerId);\n if(dialogElement) {\n dialogElement.dom.listEl.classList.remove('is-forum-open');\n }\n }\n\n if(hideTab === newTab) {\n newTab = undefined;\n }\n\n hideTab?.toggle(false);\n const promise = newTab?.toggle(true);\n if(hideTab === this.forumTab) {\n this.forumTab = newTab;\n }\n\n if(newTab) {\n const dialogElement = this.xd.getDialogElement(newTab.peerId);\n if(dialogElement) {\n dialogElement.dom.listEl.classList.add('is-forum-open');\n }\n\n appImManager.selectTab(APP_TABS.CHATLIST);\n }\n\n if(promise) {\n await promise;\n }\n\n if(newTab && !this.forumNavigationItem) {\n this.forumNavigationItem = {\n type: 'forum',\n onPop: () => {\n this.forumNavigationItem = undefined;\n this.toggleForumTab();\n }\n };\n\n appNavigationController.pushItem(this.forumNavigationItem);\n } else if(!newTab && this.forumNavigationItem) {\n appNavigationController.removeItem(this.forumNavigationItem);\n this.forumNavigationItem = undefined;\n }\n\n const forwards = !!newTab;\n const useRafs = promise ? 2 : undefined;\n this.xd.toggleAvatarUnreadBadges(forwards, useRafs);\n\n const deferred = deferredPromise();\n const duration = 300;\n SetTransition({\n element: this.forumsSlider.parentElement,\n className: 'is-forum-visible',\n duration,\n forwards,\n useRafs,\n onTransitionEnd: () => {\n deferred.resolve();\n }\n });\n\n dispatchHeavyAnimationEvent(deferred, duration).then(() => deferred.resolve());\n }\n\n public toggleForumTabByPeerId(peerId: PeerId, show?: boolean) {\n const {managers} = this;\n const history = appSidebarLeft.getHistory();\n const lastTab = history[history.length - 1];\n let forumTab: ForumTab;\n if(lastTab/* && !(lastTab instanceof AppArchivedTab) */) {\n if(lastTab instanceof ForumTab && lastTab.peerId === peerId && show) {\n shake(lastTab.container);\n return;\n }\n\n forumTab = appSidebarLeft.createTab(ForumTab);\n forumTab.open({peerId, managers});\n return;\n }\n\n forumTab = this.forumsTabs.get(peerId);\n const isSameTab = this.forumTab && this.forumTab === forumTab;\n show ??= !isSameTab;\n if(show === isSameTab) {\n if(show) {\n shake(forumTab.container);\n }\n\n return;\n }\n\n if(show && !forumTab) {\n forumTab = new ForumTab(undefined);\n forumTab.init({peerId, managers});\n\n this.forumsTabs.set(peerId, forumTab);\n this.forumsSlider.append(forumTab.container);\n\n forumTab.managers = this.managers;\n forumTab.eventListener.addEventListener('destroy', () => {\n this.forumsTabs.delete(peerId);\n });\n }\n\n return this.toggleForumTab(forumTab);\n }\n\n public setListClickListener(\n list: HTMLUListElement,\n onFound?: () => void,\n withContext = false,\n autonomous = false,\n openInner = false\n ) {\n let lastActiveListElement: HTMLElement;\n\n const setPeerFunc = (openInner ? appImManager.setInnerPeer : appImManager.setPeer).bind(appImManager);\n\n list.dataset.autonomous = '' + +autonomous;\n list.addEventListener('mousedown', (e) => {\n if(e.button !== 0) return;\n\n this.log('dialogs click list');\n const target = e.target as HTMLElement;\n const elem = findUpTag(target, DIALOG_LIST_ELEMENT_TAG);\n\n if(!elem) {\n return;\n }\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n const threadId = +elem.dataset.threadId || undefined;\n\n onFound?.();\n\n const isForum = !!elem.querySelector('.is-forum');\n if(isForum && !e.shiftKey && !lastMsgId) {\n this.toggleForumTabByPeerId(peerId);\n return;\n }\n\n if(e.ctrlKey || e.metaKey) {\n window.open((elem as HTMLAnchorElement).href || ('#' + peerId), '_blank');\n cancelEvent(e);\n return;\n }\n\n if(autonomous) {\n const sameElement = lastActiveListElement === elem;\n if(lastActiveListElement && !sameElement) {\n lastActiveListElement.classList.remove('active');\n }\n\n if(elem) {\n elem.classList.add('active');\n lastActiveListElement = elem;\n this.lastActiveElements.add(elem);\n }\n }\n\n if(\n (!threadId || lastMsgId) &&\n this.xd.sortedList.list === list &&\n this.xd !== this.xds[FOLDER_ID_ARCHIVE]\n ) {\n this.toggleForumTab();\n }\n\n setPeerFunc({\n peerId,\n lastMsgId,\n threadId: threadId\n });\n }, {capture: true});\n\n // cancel link click\n // ! do not change it to attachClickEvent\n list.addEventListener('click', (e) => {\n if(e.button === 0) {\n cancelEvent(e);\n }\n }, {capture: true});\n\n if(withContext) {\n attachContextMenuListener({\n element: list,\n callback: this.contextMenu.onContextMenu\n });\n }\n }\n\n public createChatList(options: {\n // avatarSize?: number,\n // handheldsSize?: number,\n // size?: number,\n new?: boolean,\n dialogSize?: number,\n ignoreClick?: boolean\n } = {}) {\n const list = document.createElement('ul');\n list.classList.add('chatlist'/* ,\n 'chatlist-avatar-' + (options.avatarSize || 54) *//* , 'chatlist-' + (options.size || 72) */);\n\n if(options.new) {\n list.classList.add('chatlist-new');\n }\n\n if(options.dialogSize) {\n list.classList.add('chatlist-' + options.dialogSize);\n }\n\n // if(options.ignoreClick) {\n // list.classList.add('disable-hover');\n // }\n\n /* if(options.handheldsSize) {\n list.classList.add('chatlist-handhelds-' + options.handheldsSize);\n } */\n\n return list;\n }\n\n public setLastMessageN(options: Parameters[0]) {\n const promise = this.setLastMessage(options);\n return promise.catch((err: ApiError) => {\n if(err?.type !== 'MIDDLEWARE') {\n this.log.error('set last message error', err);\n }\n });\n }\n\n private async setLastMessage({\n dialog,\n lastMessage,\n dialogElement,\n highlightWord,\n isBatch = false,\n setUnread = false\n }: {\n dialog: Dialog | ForumTopic,\n lastMessage?: Message.message | Message.messageService,\n dialogElement?: DialogElement,\n highlightWord?: string,\n isBatch?: boolean,\n setUnread?: boolean\n }) {\n if(!dialogElement) {\n dialogElement = this.xd.getDialogElement(dialog.peerId);\n\n if(!dialogElement) {\n return;\n }\n }\n\n const {dom} = dialogElement;\n const {peerId} = dialog;\n\n const {deferred: promise, middleware} = setPromiseMiddleware(dom, 'setLastMessagePromise');\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(\n dialog.draft?._ === 'draftMessage' && (\n !peerId.isAnyChat() ||\n dialog._ === 'forumTopic' ||\n !(await this.managers.appPeersManager.isForum(peerId))\n )\n ) {\n draftMessage = dialog.draft;\n }\n\n lastMessage = (dialog as Dialog).topMessage;\n if(lastMessage?.mid !== dialog.top_message) {\n const promise = this.managers.appMessagesManager.getMessageByPeer(peerId, dialog.top_message);\n lastMessage = await middleware(promise);\n }\n }\n\n // * do not uncomment next line - unsetTyping right after this call will interrupt setting unread badges\n // if(setUnread) {\n this.setUnreadMessagesN({dialog, dialogElement, isBatch, setLastMessagePromise: promise});\n // }\n\n if(!lastMessage/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.replaceChildren();\n dom.lastTimeSpan.replaceChildren();\n delete dom.listEl.dataset.mid;\n\n promise.resolve();\n return;\n }\n\n const isRestricted = lastMessage && isMessageRestricted(lastMessage as Message.message);\n\n /* if(!dom.lastMessageSpan.classList.contains('user-typing')) */ {\n let mediaContainer: HTMLElement;\n const willPrepend: (Promise | HTMLElement)[] = [];\n if(lastMessage && !draftMessage && !isRestricted) {\n const media: MyDocument | MyPhoto = getMediaFromMessage(lastMessage);\n const videoTypes: Set = new Set(['video', 'gif', 'round']);\n if(media && (media._ === 'photo' || videoTypes.has(media.type))) {\n const size = choosePhotoSize(media, 20, 20);\n\n if(size._ !== 'photoSizeEmpty') {\n mediaContainer = document.createElement('div');\n mediaContainer.classList.add('dialog-subtitle-media');\n\n if((media as MyDocument).type === 'round') {\n mediaContainer.classList.add('is-round');\n }\n\n willPrepend.push(wrapPhoto({\n photo: media,\n message: lastMessage,\n container: mediaContainer,\n withoutPreloader: true,\n size\n }).then(() => mediaContainer));\n\n if(videoTypes.has((media as MyDocument).type)) {\n const playIcon = document.createElement('span');\n playIcon.classList.add('tgico-play');\n\n mediaContainer.append(playIcon);\n }\n }\n }\n }\n\n /* if(lastMessage.from_id === auth.id) { // You: */\n if(draftMessage) {\n const span = document.createElement('span');\n span.classList.add('danger');\n span.append(i18n('Draft'), ': ');\n willPrepend.unshift(span);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !(lastMessage as Message.messageService).action) {\n const span = document.createElement('span');\n span.classList.add('primary-text');\n\n if(lastMessage.fromId === rootScope.myId) {\n span.append(i18n('FromYou'));\n willPrepend.unshift(span);\n } else {\n // str = sender.first_name || sender.last_name || sender.username;\n const p = middleware(wrapPeerTitle({\n peerId: lastMessage.fromId,\n onlyFirstName: true\n })).then((element) => {\n span.prepend(element);\n return span;\n }, noop);\n\n willPrepend.unshift(p);\n }\n\n span.append(': ');\n // console.log(sender, senderBold.innerText);\n }\n\n const withoutMediaType = !!mediaContainer && !!(lastMessage as Message.message)?.message;\n\n let fragment: DocumentFragment;\n if(highlightWord && (lastMessage as Message.message).message) {\n fragment = await middleware(wrapMessageForReply({message: lastMessage, highlightWord, withoutMediaType}));\n } else if(draftMessage) {\n fragment = await middleware(wrapMessageForReply({message: draftMessage}));\n } else if(lastMessage) {\n fragment = await middleware(wrapMessageForReply({message: lastMessage, withoutMediaType}));\n } else { // rare case\n fragment = document.createDocumentFragment();\n }\n\n if(willPrepend.length) {\n const elements = await middleware(Promise.all(willPrepend));\n fragment.prepend(...elements);\n }\n\n replaceContent(dom.lastMessageSpan, fragment);\n }\n\n if(lastMessage || draftMessage/* && lastMessage._ !== 'draftMessage' */) {\n const date = draftMessage ? Math.max(draftMessage.date, lastMessage.date || 0) : lastMessage.date;\n replaceContent(dom.lastTimeSpan, formatDateAccordingToTodayNew(new Date(date * 1000)));\n } else dom.lastTimeSpan.textContent = '';\n\n if(setUnread !== null && !setUnread) { // means search\n dom.listEl.dataset.mid = '' + lastMessage.mid;\n\n const replyTo = lastMessage.reply_to;\n if(replyTo?.pFlags?.forum_topic) {\n dom.listEl.dataset.threadId = '' + getMessageThreadId(lastMessage);\n }\n }\n\n promise.resolve();\n }\n\n public setUnreadMessagesN(options: Parameters[0]) {\n return this.setUnreadMessages(options).catch(() => {});\n }\n\n private async setUnreadMessages({\n dialog,\n dialogElement,\n isBatch = false,\n setLastMessagePromise\n }: {\n dialog: Dialog | ForumTopic,\n dialogElement: DialogElement,\n isBatch?: boolean,\n setLastMessagePromise?: Promise\n }) {\n const {dom} = dialogElement;\n if(!dom) {\n // this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n const isTopic = dialog._ === 'forumTopic';\n\n const {deferred, middleware} = setPromiseMiddleware(dom, 'setUnreadMessagePromise');\n\n const {peerId} = dialog;\n const promises = Promise.all([\n this.managers.appNotificationsManager.isPeerLocalMuted({peerId: peerId, respectType: true, threadId: isTopic ? dialog.id : undefined}),\n dialog.draft?._ !== 'draftMessage' ? this.managers.appMessagesManager.getMessageByPeer(peerId, dialog.top_message) : undefined,\n isTopic ? !!dialog.pFlags.pinned : this.managers.dialogsStorage.isDialogPinned(peerId, this.filterId),\n this.managers.appMessagesManager.isDialogUnread(dialog),\n peerId.isAnyChat() && !isTopic ? this.managers.acknowledged.dialogsStorage.getForumUnreadCount(peerId).then((result) => {\n if(result.cached) {\n return result.result;\n } else {\n result.result.then(() => {\n this.setUnreadMessagesN({dialog, dialogElement});\n });\n\n return {count: 0, hasUnmuted: false};\n }\n }).catch(() => undefined as {count: number, hasUnmuted: boolean}) : undefined\n ]);\n\n let [isMuted, lastMessage, isPinned, isDialogUnread, forumUnreadCount] = await middleware(promises);\n const wasMuted = dom.listEl.classList.contains('is-muted');\n\n const {count: unreadTopicsCount, hasUnmuted: hasUnmutedTopic} = forumUnreadCount || {};\n\n let setStatusMessage: MyMessage;\n if(lastMessage && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n\n const unreadCount = unreadTopicsCount ?? dialog.unread_count;\n if(unreadTopicsCount !== undefined) {\n isDialogUnread = !!unreadCount;\n }\n\n if(isTopic && !isDialogUnread) {\n isDialogUnread = !getServerMessageId(dialog.read_inbox_max_id);\n }\n\n const hasUnreadBadge = isPinned || isDialogUnread;\n const hasUnreadAvatarBadge = this.xd !== this.xds[FOLDER_ID_ARCHIVE] && !isTopic && !!this.forumTab && this.xd.getDialogElement(peerId) === dialogElement && isDialogUnread;\n // dom.messageEl.classList.toggle('has-badge', hasBadge);\n\n // * have to await all promises before modifying something\n\n if(setLastMessagePromise) {\n try {\n await middleware(setLastMessagePromise);\n } catch(err) {\n return;\n }\n }\n\n const transitionDuration = isBatch ? 0 : BADGE_TRANSITION_TIME;\n\n dom.listEl.classList.toggle('no-unmuted-topic', !isMuted && hasUnmutedTopic !== undefined && !hasUnmutedTopic);\n\n if(isMuted !== wasMuted) {\n SetTransition({\n element: dom.listEl,\n className: 'is-muted',\n forwards: isMuted,\n duration: transitionDuration\n });\n }\n\n setSendingStatus(dom.statusSpan, isTopic && dialog.pFlags.closed ? 'premium_lock' : setStatusMessage, true);\n\n // if(isTopic) {\n // dom.statusSpan.parentElement.classList.toggle('is-closed', !!dialog.pFlags.closed);\n // }\n\n const isUnreadBadgeMounted = !!dom.unreadBadge;\n if(hasUnreadBadge) {\n dialogElement.createUnreadBadge();\n }\n\n const isUnreadAvatarBadgeMounted = !!dom.unreadAvatarBadge;\n if(hasUnreadAvatarBadge) {\n dialogElement.createUnreadAvatarBadge();\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionsBadgeMounted = !!dom.mentionsBadge;\n if(hasMentionsBadge) {\n dialogElement.createMentionsBadge();\n }\n\n const a: [Parameters[0], boolean, boolean][] = [\n ['unreadBadge', hasUnreadBadge, isUnreadBadgeMounted],\n ['unreadAvatarBadge', hasUnreadAvatarBadge, isUnreadAvatarBadgeMounted],\n ['mentionsBadge', hasMentionsBadge, isMentionsBadgeMounted]\n ];\n\n a.forEach(([key, hasBadge, isBadgeMounted]) => {\n const badge = dom[key];\n if(!badge) {\n return;\n }\n\n dialogElement.toggleBadgeByKey(key, hasBadge, isBadgeMounted, isBatch);\n });\n\n if(!hasUnreadBadge) {\n deferred.resolve();\n return;\n }\n\n if(isPinned) {\n dom.unreadBadge.classList.add('tgico-chatspinned', 'tgico');\n } else if(dom.unreadBadge) {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false, unreadBadgeText: string;\n if(dialog.unread_mentions_count && unreadCount === 1) {\n unreadBadgeText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n // dom.unreadMessagesSpan.innerText = '' + (unreadCount ? formatNumber(unreadCount, 1) : ' ');\n unreadBadgeText = '' + (unreadCount ? formatNumber(unreadCount, 1) : ' ');\n } else {\n unreadBadgeText = '';\n isUnread = false;\n }\n\n if(isTopic) {\n const notVisited = isDialogUnread && unreadBadgeText === ' ';\n dom.unreadBadge.classList.toggle('not-visited', notVisited);\n }\n\n const b: Array<[HTMLElement, string]> = [\n [dom.unreadBadge, unreadBadgeText],\n [dom.unreadAvatarBadge, unreadBadgeText || undefined]\n ];\n\n b.filter(Boolean).forEach(([badge, text]) => {\n if(text !== undefined) {\n badge.innerText = unreadBadgeText;\n }\n\n badge.classList.toggle('unread', isUnread);\n badge.classList.toggle('mention', isMention);\n });\n\n deferred.resolve();\n }\n\n private async getDialog(dialog: Dialog | ForumTopic | PeerId, threadId?: number) {\n if(typeof(dialog) !== 'object') {\n let originalDialog: Dialog | ForumTopic;\n if(threadId) {\n originalDialog = await this.managers.dialogsStorage.getForumTopic(dialog, threadId);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n pFlags: {}\n } as any as ForumTopic;\n }\n } else {\n originalDialog = await this.managers.appMessagesManager.getDialogOnly(dialog);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n peer: await this.managers.appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } as any as Dialog;\n }\n }\n\n return originalDialog;\n }\n\n return dialog as Dialog | ForumTopic;\n }\n\n public addListDialog(options: Parameters[0] & {isBatch?: boolean}) {\n options.autonomous = false;\n\n const ret = this.addDialogNew(options);\n\n if(ret) {\n const {peerId} = options;\n const getDialogPromise = this.getDialog(peerId, options.threadId);\n const promise = getDialogPromise.then((dialog) => {\n const promises: Promise[] = [];\n const isUser = peerId.isUser();\n if(!isUser && dialog._ === 'dialog') {\n promises.push(this.xd.processDialogForCallStatus(peerId, ret.dom));\n }\n\n if(peerId !== rootScope.myId && isUser) {\n promises.push(this.managers.appUsersManager.getUserStatus(peerId.toUserId()).then((status) => {\n if(status?._ === 'userStatusOnline') {\n this.xd.setOnlineStatus(ret.dom.avatarEl, true);\n }\n }));\n }\n\n promises.push(this.setLastMessageN({\n dialog,\n dialogElement: ret,\n isBatch: options.isBatch,\n setUnread: true\n }));\n\n return Promise.all(promises);\n });\n\n options.loadPromises?.push(promise);\n }\n\n return ret;\n }\n\n /**\n * use for rendering search result\n */\n public addDialogAndSetLastMessage(options: Omit[0], 'dialog'> & {\n message: MyMessage,\n peerId: PeerId,\n query?: string\n }) {\n const {peerId, message, query} = options;\n const ret = this.addDialogNew({\n ...options,\n ...getMessageSenderPeerIdOrName(message),\n peerId\n });\n\n this.setLastMessageN({\n dialog: {_: 'dialog', peerId} as any,\n lastMessage: message,\n dialogElement: ret,\n highlightWord: query\n });\n\n if(message.peerId !== peerId) {\n ret.dom.listEl.dataset.peerId = '' + message.peerId;\n }\n\n return ret;\n }\n\n public addDialogNew(options: DialogElementOptions & {container?: HTMLElement | Scrollable | false, append?: boolean}) {\n const d = new DialogElement({\n autonomous: !!options.container,\n avatarSize: 'bigger',\n ...options\n // avatarSize: !options.avatarSize || options.avatarSize >= 54 ? 'bigger' : 'abitbigger',\n });\n\n if(options.container) {\n const method = !options.append ? 'append' : 'prepend';\n options.container[method](d.container);\n }\n\n return d;\n // return this.addDialog(options.peerId, options.container, options.rippleEnabled, options.onlyFirstName, options.meAsSaved, options.append, options.avatarSize, options.autonomous, options.lazyLoadQueue, options.loadPromises, options.fromName, options.noIcons);\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\n","export default function getUnsafeRandomInt(min: number, max: number) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {DownloadMediaOptions, DownloadOptions} from '../mtproto/apiFileManager';\nimport type {AppMessagesManager} from './appMessagesManager';\nimport type {MyDocument} from './appDocsManager';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {InputFile, Photo, PhotoSize} from '../../layer';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport {AppManagers} from './managers';\nimport rootScope from '../rootScope';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport noop from '../../helpers/noop';\nimport getDownloadMediaDetails from './utils/download/getDownloadMediaDetails';\nimport getDownloadFileNameFromOptions from './utils/download/getDownloadFileNameFromOptions';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport makeError from '../../helpers/makeError';\nimport createDownloadAnchor from '../../helpers/dom/createDownloadAnchor';\nimport {getFileNameByLocation} from '../../helpers/fileName';\nimport getDocumentDownloadOptions from './utils/docs/getDocumentDownloadOptions';\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\n\nexport type ResponseMethodBlob = 'blob';\nexport type ResponseMethodJson = 'json';\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\n\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\nexport type DownloadBlob = CancellablePromise;\nexport type DownloadUrl = CancellablePromise;\nexport type DownloadJson = CancellablePromise;\n// export type Download = DownloadBlob/* | DownloadJson */;\nexport type Download = DownloadBlob | DownloadUrl/* | DownloadJson */;\n\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\nexport type ProgressCallback = (details: Progress) => void;\n\ntype DownloadType = 'url' | 'blob' | 'void' | 'disc';\n\nexport class AppDownloadManager {\n private downloads: {[fileName: string]: {main: Download} & {[type in DownloadType]?: Download}} = {};\n // private downloadsToDisc: {[fileName: string]: Download} = {};\n private progress: {[fileName: string]: Progress} = {};\n // private progressCallbacks: {[fileName: string]: Array} = {};\n private managers: AppManagers;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n rootScope.addEventListener('download_progress', (details) => {\n // const callbacks = this.progressCallbacks[details.fileName];\n // if(callbacks) {\n // callbacks.forEach((callback) => callback(details));\n // }\n\n const download = this.downloads[details.fileName];\n if(download?.main?.notifyAll) {\n this.progress[details.fileName] = details;\n download.main.notifyAll(details);\n }\n });\n }\n\n private getNewDeferred(fileName: string, type?: DownloadType) {\n const deferred = deferredPromise();\n\n let download = this.downloads[fileName];\n if(!download) {\n download = this.downloads[fileName] = {\n main: deferred as any\n };\n\n deferred.cancel = () => {\n const error = makeError('DOWNLOAD_CANCELED');\n\n this.managers.apiFileManager.cancelDownload(fileName);\n\n deferred.reject(error);\n deferred.cancel = noop;\n };\n\n deferred.catch(() => {\n this.clearDownload(fileName, type);\n }).finally(() => {\n delete this.progress[fileName];\n // delete this.progressCallbacks[fileName];\n });\n } else {\n const main = download.main;\n (['cancel', 'addNotifyListener', 'notify', 'notifyAll'] as (keyof CancellablePromise)[]).forEach((key) => {\n if(!main[key]) {\n return;\n }\n\n // @ts-ignore\n deferred[key] = main[key].bind(main);\n });\n }\n\n const haveToClear = type === 'disc';\n if(haveToClear) {\n deferred.catch(noop).finally(() => {\n this.clearDownload(fileName, type);\n });\n }\n\n return download[type] = deferred as any;\n }\n\n public getNewDeferredForUpload>(fileName: string, promise: T) {\n const deferred = this.getNewDeferred(fileName);\n promise.then(deferred.resolve, deferred.reject);\n\n deferred.finally(() => {\n this.clearDownload(fileName);\n });\n\n return deferred as CancellablePromise>;\n }\n\n private clearDownload(fileName: string, type?: DownloadType) {\n const downloads = this.downloads[fileName];\n if(!downloads) {\n return;\n }\n\n delete downloads[type];\n\n const length = Object.keys(downloads).length;\n if(!length || (downloads.main && length === 1)) {\n delete this.downloads[fileName];\n }\n }\n\n public getUpload(fileName: string): ReturnType['promise'] {\n let deferred: CancellablePromise = this.getDownload(fileName);\n if(deferred) {\n return deferred;\n }\n\n deferred = this.getNewDeferred(fileName);\n this.managers.appMessagesManager.getUploadPromise(fileName).then(deferred.resolve, deferred.reject);\n return deferred;\n }\n\n /* public fakeDownload(fileName: string, value: Blob | string) {\n const deferred = this.getNewDeferred(fileName);\n if(typeof(value) === 'string') {\n fetch(value)\n .then((response) => response.blob())\n .then((blob) => deferred.resolve(blob));\n } else {\n deferred.resolve(value);\n }\n\n return deferred;\n } */\n\n private d(fileName: string, getPromise: () => Promise, type?: DownloadType) {\n let deferred = this.getDownload(fileName, type);\n if(deferred) return deferred;\n\n deferred = this.getNewDeferred(fileName, type);\n getPromise().then(deferred.resolve, deferred.reject);\n return deferred;\n }\n\n public download(options: DownloadOptions): DownloadBlob {\n const fileName = getDownloadFileNameFromOptions(options);\n return this.d(fileName, () => this.managers.apiFileManager.download(options), 'blob') as any;\n }\n\n public downloadMedia(options: DownloadMediaOptions, type: DownloadType = 'blob', promiseBefore?: Promise): DownloadBlob {\n const {downloadOptions, fileName} = getDownloadMediaDetails(options);\n\n return this.d(fileName, () => {\n let cb: any;\n if(type === 'url') {\n cb = this.managers.apiFileManager.downloadMediaURL;\n } else if(type === 'void'/* || type === 'disc' */) {\n cb = this.managers.apiFileManager.downloadMediaVoid;\n } else /* if(type === 'blob') */ {\n cb = this.managers.apiFileManager.downloadMedia;\n }\n\n if(promiseBefore) {\n return promiseBefore.then(() => cb(options));\n }\n\n return cb(options);\n }, type) as any;\n }\n\n public downloadMediaURL(options: DownloadMediaOptions): DownloadUrl {\n return this.downloadMedia(options, 'url') as any;\n }\n\n public downloadMediaVoid(options: DownloadMediaOptions): DownloadBlob {\n return this.downloadMedia(options, 'void');\n }\n\n public upload(file: File | Blob, fileName?: string, promise?: Promise) {\n if(!fileName) {\n fileName = getFileNameForUpload(file);\n }\n\n if(!promise) {\n promise = this.managers.apiFileManager.upload({file, fileName});\n }\n\n const deferred = this.getNewDeferredForUpload(fileName, promise);\n return deferred as any as CancellablePromise;\n }\n\n public getDownload(fileName: string, type?: DownloadType) {\n const d = this.downloads[fileName];\n return d && d[type];\n }\n\n // public addProgressCallback(fileName: string, callback: ProgressCallback) {\n // const progress = this.progress[fileName];\n // (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\n\n // if(progress) {\n // callback(progress);\n // }\n // }\n\n public downloadToDisc(options: DownloadMediaOptions, justAttach?: boolean) {\n const media = options.media;\n const isDocument = media._ === 'document';\n if(!isDocument && !options.thumb) {\n options.thumb = (media as Photo.photo).sizes.slice().pop() as PhotoSize.photoSize;\n }\n\n // const {fileName: cacheFileName} = getDownloadMediaDetails(options);\n // if(justAttach) {\n // const promise = this.downloadsToDisc[cacheFileName];\n // if(promise) {\n // return promise;\n // }\n // }\n\n // const {downloadOptions, fileName} = getDownloadMediaDetails(options);\n // if(downloadOptions.size && downloadOptions.size > MAX_FILE_SAVE_SIZE) {\n const id = '' + (Math.random() * 0x7FFFFFFF | 0);\n // const id = 'test';\n const url = `download/${id}`;\n options.downloadId = id;\n\n const pingPromise = apiManagerProxy.pingServiceWorkerWithIframe();\n\n const promise = this.downloadMedia(options, 'disc', pingPromise);\n // this.downloadsToDisc[cacheFileName] = promise;\n\n if(justAttach) {\n return promise;\n }\n\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n\n pingPromise.then(() => {\n iframe.src = url;\n document.body.append(iframe);\n });\n\n // createDownloadAnchor(url, 'asd.txt');\n\n // const events = [\n // 'emptied',\n // 'abort',\n // 'suspend',\n // 'reset',\n // 'error',\n // 'ended',\n // 'load'\n // ].forEach((event) => {\n // iframe.addEventListener(event, () => alert(event));\n // iframe.contentWindow.addEventListener(event, () => alert(event));\n // });\n\n let element: HTMLElement, hadProgress = false;\n const onProgress = () => {\n if(hadProgress) {\n return;\n }\n\n hadProgress = true;\n element = iframe;\n\n indexOfAndSplice(promise.listeners, onProgress);\n };\n\n promise.addNotifyListener(onProgress);\n promise.then((blob) => {\n if(!blob) {\n return;\n }\n\n const url = URL.createObjectURL(blob);\n const downloadOptions = isDocument ?\n getDocumentDownloadOptions(media) :\n getPhotoDownloadOptions(media as any, options.thumb as PhotoSize.photoSize);\n const fileName = (options.media as MyDocument).file_name || getFileNameByLocation(downloadOptions.location);\n createDownloadAnchor(url, downloadOptions.fileName || fileName, () => {\n URL.revokeObjectURL(url);\n });\n }).catch(noop).finally(() => {\n if(!hadProgress) {\n onProgress();\n }\n\n setTimeout(() => {\n element?.remove();\n }, 1000);\n\n // if(this.downloadsToDisc[cacheFileName] === promise) {\n // delete this.downloadsToDisc[cacheFileName];\n // }\n });\n\n return promise;\n }\n}\n\nconst appDownloadManager = new AppDownloadManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\nexport default appDownloadManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n a.target = '_blank';\n\n a.style.position = 'absolute';\n a.style.top = '1px';\n a.style.left = '1px';\n\n document.body.append(a);\n\n try {\n const clickEvent = document.createEvent('MouseEvents');\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n a.dispatchEvent(clickEvent);\n } catch(e) {\n console.error('Download click error', e);\n try {\n a.click();\n } catch(e) {\n window.open(url as string, '_blank');\n }\n }\n\n setTimeout(() => {\n a.remove();\n onRemove && onRemove();\n }, 100);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function partition(arr: T[], callback: (item: T, idx: number, arr: T[]) => boolean) {\n const good: T[] = [], bad: T[] = [];\n for(let i = 0, length = arr.length; i < length; ++i) {\n const item = arr[i];\n (callback(item, i, arr) ? good : bad).push(item);\n }\n\n return [good, bad];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\n// import { generatePathData } from \"../../helpers/dom\";\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport type Chat from './chat';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport AvatarElement from '../avatar';\nimport {Message} from '../../layer';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {SERVICE_AS_REGULAR, STICKY_OFFSET} from './bubbles';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport partition from '../../helpers/array/partition';\nimport noop from '../../helpers/noop';\nimport getMessageThreadId from '../../lib/appManagers/utils/messages/getMessageThreadId';\n\ntype GroupItem = {\n bubble: HTMLElement,\n fromId: PeerId,\n mid: number,\n groupMid?: number,\n timestamp: number,\n dateTimestamp: number,\n mounted: boolean,\n single: boolean,\n group?: BubbleGroup,\n message: Message.message | Message.messageService // use it only to set avatar\n};\n\nclass BubbleGroup {\n container: HTMLElement;\n chat: Chat;\n groups: BubbleGroups;\n items: GroupItem[]; // descend sorted\n avatarContainer: HTMLElement;\n avatarLoadPromise: ReturnType;\n avatar: AvatarElement;\n mounted: boolean;\n dateTimestamp: number;\n offset: number;\n\n constructor(chat: Chat, groups: BubbleGroups, dateTimestamp: number) {\n this.container = document.createElement('div');\n this.container.classList.add('bubbles-group');\n this.chat = chat;\n this.groups = groups;\n this.items = [];\n this.dateTimestamp = dateTimestamp;\n this.offset = 0;\n }\n\n createAvatar(message: Message.message | Message.messageService) {\n if(this.avatarLoadPromise) {\n return this.avatarLoadPromise;\n } else if(message._ === 'messageService') {\n return;\n }\n\n this.avatarContainer = document.createElement('div');\n this.avatarContainer.classList.add('bubbles-group-avatar-container');\n ++this.offset;\n\n const fwdFrom = message.fwd_from;\n const fwdFromId = message.fwdFromId;\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\n const currentPeerId = this.chat.peerId;\n const avatar = this.avatar = new AvatarElement();\n this.avatar.classList.add('bubbles-group-avatar', 'user-avatar', 'avatar-40'/* , 'can-zoom-fade' */);\n const peerId = ((fwdFrom && (currentPeerId === rootScope.myId || currentPeerId === REPLIES_PEER_ID)) || isForwardFromChannel ? fwdFromId : message.fromId) || NULL_PEER_ID;\n const avatarLoadPromise = this.avatar.updateWithOptions({\n lazyLoadQueue: this.chat.bubbles.lazyLoadQueue,\n peerId,\n peerTitle: !fwdFromId && fwdFrom && fwdFrom.from_name ? /* '🔥 FF 🔥' */fwdFrom.from_name : undefined\n });\n\n // this.avatarLoadPromise = Promise.all([\n // avatarLoadPromise,\n // peerId && peerId.isUser() ? this.chat.managers.appUsersManager.getUser(peerId.toUserId()) : undefined\n // ]).then(([result, user]) => {\n // if(user?.pFlags?.premium) {\n // avatar.classList.add('is-premium', 'tgico-star');\n // }\n\n // return result;\n // });\n this.avatarLoadPromise = avatarLoadPromise;\n\n this.avatarContainer.append(this.avatar);\n this.container.append(this.avatarContainer);\n\n return this.avatarLoadPromise;\n }\n\n get firstTimestamp() {\n return this.firstItem.timestamp;\n }\n\n get firstMid() {\n return this.firstItem.mid;\n }\n\n get firstItem() {\n return this.items[this.items.length - 1];\n }\n\n get lastTimestamp() {\n return this.lastItem.timestamp;\n }\n\n get lastMid() {\n return this.lastItem.mid;\n }\n\n get lastItem() {\n return this.items[0];\n }\n\n updateClassNames() {\n const items = this.items;\n const length = items.length;\n if(!length) {\n return;\n }\n\n // const elements = Array.from(this.container.children);\n // if(this.offset) elements.splice(0, this.offset);\n\n // const length = elements.length;\n // if(!length) {\n // return;\n // }\n\n const first = items[length - 1].bubble;\n\n if(items.length === 1) {\n first.classList.add('is-group-first', 'is-group-last');\n // this.setClipIfNeeded(first);\n return;\n } else {\n first.classList.remove('is-group-last');\n first.classList.add('is-group-first');\n // this.setClipIfNeeded(first, true);\n }\n\n for(let i = 1, _length = length - 1; i < _length; ++i) {\n const bubble = items[i].bubble;\n bubble.classList.remove('is-group-last', 'is-group-first');\n // this.setClipIfNeeded(bubble, true);\n }\n\n const last = items[0].bubble;\n last.classList.remove('is-group-first');\n last.classList.add('is-group-last');\n // this.setClipIfNeeded(last);\n }\n\n insertItem(item: GroupItem) {\n const {items} = this;\n insertInDescendSortedArray(items, item, this.groups.sortGroupItemsKey);\n\n item.group = this;\n if(items.length === 1) {\n this.groups.insertGroup(this);\n }\n }\n\n removeItem(item: GroupItem) {\n indexOfAndSplice(this.items, item);\n\n if(!this.items.length) {\n indexOfAndSplice(this.groups.groups, this);\n }\n\n item.group = undefined;\n }\n\n mount(updateClassNames?: boolean) {\n if(!this.groups.groups.includes(this) || !this.items.length) { // group can be already removed\n debugger;\n\n if(this.mounted) {\n this.onItemUnmount();\n }\n\n return;\n }\n\n const {offset, items} = this;\n const {length} = items;\n forEachReverse(items, (item, idx) => {\n this.mountItem(item, length - 1 - idx, offset);\n });\n\n if(updateClassNames) {\n this.updateClassNames();\n }\n\n this.onItemMount();\n }\n\n mountItem(item: GroupItem, idx = this.items.indexOf(item), offset = this.offset) {\n if(item.mounted) {\n return;\n }\n\n positionElementByIndex(item.bubble, this.container, offset + idx);\n item.mounted = true;\n }\n\n unmountItem(item: GroupItem) {\n if(!item.mounted) {\n return;\n }\n\n item.bubble.remove();\n item.mounted = false;\n this.onItemUnmount();\n }\n\n onItemMount() {\n if(this.mounted) {\n return;\n }\n\n const dateContainer = this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp / 1000);\n // const idx = this.groups.indexOf(group);\n const dateGroups = this.groups.groups.filter((_group) => _group.dateTimestamp === this.dateTimestamp);\n const dateGroupsLength = dateGroups.length;\n const idx = dateGroups.indexOf(this);\n const unmountedLength = dateGroups.slice(idx + 1).reduce((acc, v) => acc + (v.mounted ? 0 : 1), 0);\n positionElementByIndex(this.container, dateContainer.container, STICKY_OFFSET + dateGroupsLength - 1 - idx - unmountedLength);\n this.mounted = true;\n }\n\n onItemUnmount() {\n if(!this.mounted) {\n return;\n }\n\n if(!this.items.length) {\n this.container.remove();\n this.chat.bubbles.deleteEmptyDateGroups();\n this.mounted = false;\n } else {\n this.updateClassNames();\n }\n }\n}\n\n// class BubbleGroupItem implements GroupItem {\n// bubble: HTMLElement;\n// fromId: PeerId;\n// mid: number;\n// timestamp: number;\n// dateTimestamp: number;\n// mounted: boolean;\n// single: boolean;\n// group: BubbleGroup;\n\n// constructor(details: GroupItem) {\n// Object.assign(this, details);\n// }\n// }\n\nexport default class BubbleGroups {\n public itemsArr: Array = []; // descend sorted\n private itemsMap: Map = new Map();\n public groups: Array = []; // descend sorted\n private newGroupDiff = 121; // * 121 in scheduled messages\n private sortItemsKey: Extract;\n private sortGroupsKey: Extract;\n public sortGroupItemsKey: Extract;\n\n constructor(private chat: Chat) {\n this.sortItemsKey = chat.type === 'scheduled' ? 'timestamp' : 'mid';\n this.sortGroupsKey = chat.type === 'scheduled' ? 'lastTimestamp' : 'lastMid';\n this.sortGroupItemsKey = /* chat.type === 'scheduled' ? 'timestamp' : */'groupMid';\n }\n\n removeItem(item: GroupItem) {\n item.group?.removeItem(item);\n this.removeItemFromCache(item);\n }\n\n removeAndUnmountBubble(bubble: HTMLElement) {\n const item = this.getItemByBubble(bubble);\n if(!item) {\n if(bubble.parentElement) {\n bubble.remove(); // * can be a placeholder\n }\n\n return false;\n }\n\n const items = this.itemsArr;\n const index = items.indexOf(item);\n const siblings = this.getSiblingsAtIndex(index, items);\n\n const group = item.group;\n this.removeItem(item);\n\n const modifiedGroups: Set = new Set();\n if(group) {\n group.unmountItem(item);\n modifiedGroups.add(group);\n }\n\n const [previousSibling, nextSibling] = siblings;\n if(\n previousSibling &&\n nextSibling &&\n this.canItemsBeGrouped(previousSibling, nextSibling) &&\n previousSibling.group !== nextSibling.group\n ) {\n const group = nextSibling.group;\n this.f(nextSibling.group.items);\n group.onItemUnmount();\n modifiedGroups.add(previousSibling.group);\n this.groupUngrouped();\n }\n\n this.mountUnmountGroups(Array.from(modifiedGroups));\n\n return true;\n }\n\n mountUnmountGroups(groups: BubbleGroup[]) {\n // groups.sort((a, b) => (b.lastItem?.mid ?? 0) - (a.lastItem?.mid ?? 0));\n\n const [toMount, toUnmount] = partition(groups, (group) => !!group.items.length);\n toUnmount.forEach((group) => {\n group.onItemUnmount();\n })\n\n toMount.forEach((group) => {\n group.mount(true);\n });\n\n // toMount.forEach((group) => {\n // group.updateClassNames();\n // });\n }\n\n f(items: GroupItem[], index: number = 0, length = items.length) {\n for(; index < length; ++index) {\n const item = items[index];\n item.mounted = false;\n item.group.removeItem(item);\n --length;\n --index;\n }\n }\n\n getItemByBubble(bubble: HTMLElement) {\n return this.itemsMap.get(bubble);\n }\n\n getLastGroup() {\n return this.groups[0];\n }\n\n changeBubbleMid(bubble: HTMLElement, mid: number) {\n const item = this.getItemByBubble(bubble);\n if(!item) {\n return;\n }\n\n item.mid = mid;\n\n // indexOfAndSplice(item.group.items, item);\n // // const canChangeGroupMid = !item.group.items.length || item.group.items.every((item) => item.groupMid === item.mid);\n // // if(canChangeGroupMid) item.groupMid = mid;\n // item.group.insertItem(item);\n\n indexOfAndSplice(this.itemsArr, item);\n this.insertItemToArray(item, this.itemsArr);\n }\n\n changeItemBubble(item: GroupItem, bubble: HTMLElement) {\n this.itemsMap.delete(item.bubble);\n item.bubble = bubble;\n this.itemsMap.set(bubble, item);\n }\n\n changeBubbleByBubble(from: HTMLElement, to: HTMLElement) {\n const item = this.getItemByBubble(from);\n if(!item) {\n return;\n }\n\n this.changeItemBubble(item, to);\n }\n\n canItemsBeGrouped(item1: GroupItem, item2: GroupItem) {\n return item2.fromId === item1.fromId &&\n Math.abs(item2.timestamp - item1.timestamp) <= this.newGroupDiff &&\n item1.dateTimestamp === item2.dateTimestamp &&\n !item1.single &&\n !item2.single &&\n item1.message.pFlags.out === item2.message.pFlags.out &&\n (!this.chat.isAllMessagesForum || getMessageThreadId(item1.message, true) === getMessageThreadId(item2.message, true));\n }\n\n getSiblingsAtIndex(itemIndex: number, items: GroupItem[]) {\n return [items[itemIndex - 1], items[itemIndex + 1]] as const;\n }\n\n // findGroupSiblingInSiblings(item: GroupItem, siblings: ReturnType) {\n // return siblings.find((sibling) => sibling && this.canItemsBeGrouped(item, sibling));\n // }\n\n findGroupSiblingByItem(item: GroupItem, items: GroupItem[]) {\n items = items.slice();\n const idx = this.insertItemToArray(item, items);\n // return this.findGroupSiblingInSiblings(item, this.getSiblingsAtIndex(idx, items));\n return this.findGroupSiblingInItems(item, items, idx);\n }\n\n findGroupSiblingInItems(item: GroupItem, items: GroupItem[], index = items.indexOf(item), length = items.length) {\n const previousItem = items[index - 1];\n let siblingGroupedItem: GroupItem;\n if(previousItem?.group && this.canItemsBeGrouped(item, previousItem)) {\n siblingGroupedItem = previousItem;\n } else {\n for(let k = index + 1; k < length; ++k) {\n const nextItem = items[k];\n if(this.canItemsBeGrouped(item, nextItem)) {\n if(nextItem.group) {\n siblingGroupedItem = nextItem;\n }\n } else {\n break;\n }\n }\n }\n\n return siblingGroupedItem;\n }\n\n addItemToGroup(item: GroupItem, group: BubbleGroup) {\n group.insertItem(item);\n this.addItemToCache(item);\n }\n\n insertItemToArray(item: GroupItem, array: GroupItem[]) {\n return insertInDescendSortedArray(array, item, this.sortItemsKey);\n }\n\n insertGroup(group: BubbleGroup) {\n return insertInDescendSortedArray(this.groups, group, this.sortGroupsKey);\n }\n\n addItemToCache(item: GroupItem) {\n this.insertItemToArray(item, this.itemsArr);\n this.itemsMap.set(item.bubble, item);\n }\n\n removeItemFromCache(item: GroupItem) {\n indexOfAndSplice(this.itemsArr, item);\n this.itemsMap.delete(item.bubble);\n }\n\n getMessageFromId(message: MyMessage) {\n let fromId = message.viaBotId || message.fromId;\n\n // fix for saved messages forward to self\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as Message.message).fwdFromId === fromId) {\n fromId = fromId.toPeerId(true);\n }\n\n return fromId;\n }\n\n createItem(bubble: HTMLElement, message: MyMessage) {\n const single = !(message._ === 'message' || (message.action && SERVICE_AS_REGULAR.has(message.action._)));\n const {mid, date: timestamp} = message;\n const {dateTimestamp} = this.chat.bubbles.getDateForDateContainer(timestamp);\n const item: GroupItem = {\n mid,\n groupMid: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : mid,\n fromId: this.getMessageFromId(message),\n bubble,\n // timestamp: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : timestamp,\n timestamp,\n dateTimestamp,\n mounted: false,\n single,\n message\n };\n\n return item;\n }\n\n splitSiblingsOnGrouping(siblings: ReturnType) {\n const [previousSibling, nextSibling] = siblings;\n const previousGroup = previousSibling?.group;\n const nextGroup = nextSibling?.group;\n\n if(!previousGroup) {\n return;\n }\n\n // will refresh group\n // if(previousGroup === nextGroup) {\n const items = previousGroup.items;\n const index = items.indexOf(previousSibling) + 1;\n const length = items.length;\n if(index === length) {\n return;\n }\n\n const modifiedGroups: BubbleGroup[] = [previousGroup];\n // if(previousGroup !== nextGroup && nextGroup) {\n // modifiedGroups.push(nextGroup);\n // }\n\n this.f(items, index, length);\n return modifiedGroups;\n // }\n }\n\n prepareForGrouping(bubble: HTMLElement, message: MyMessage) {\n const foundItem = this.getItemByBubble(bubble);\n if(foundItem) { // should happen only on edit\n // debugger;\n return;\n }\n\n const item = this.createItem(bubble, message);\n this.addItemToCache(item);\n }\n\n groupUngrouped() {\n const items = this.itemsArr;\n const length = items.length;\n const modifiedGroups: Set = new Set();\n // for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const item = items[i];\n if(item.group) {\n continue;\n }\n\n let hadGroup = true;\n const siblings = this.getSiblingsAtIndex(i, items);\n const siblingGroupedItem = this.findGroupSiblingInItems(item, items, i, length);\n\n // const foundItem = this.findGroupSiblingInSiblings(item, siblings);\n const foundItem = siblingGroupedItem;\n const group = foundItem?.group ?? (hadGroup = false, new BubbleGroup(this.chat, this, item.dateTimestamp));\n\n modifiedGroups.add(group);\n group.insertItem(item);\n\n if(!hadGroup) {\n const splittedGroups = this.splitSiblingsOnGrouping(siblings);\n if(splittedGroups) {\n splittedGroups.forEach((group) => modifiedGroups.add(group));\n }\n }\n }\n\n return modifiedGroups;\n }\n\n // addBubble(bubble: HTMLElement, message: MyMessage, unmountIfFound?: boolean) {\n // const oldItem = this.getItemByBubble(bubble);\n // if(unmountIfFound) { // updating position\n // this.removeAndUnmountBubble(bubble);\n // } else if(oldItem) { // editing\n // const group = oldItem.group;\n // this.changeItemBubble(oldItem, bubble);\n // oldItem.mounted = false;\n\n // return {item: oldItem, group};\n // }\n\n // const item = this.createItem(bubble, message);\n\n // const foundItem = this.findSameGroupItem(item, this.itemsArr);\n\n // const group = foundItem?.group ?? new BubbleGroup(this.chat, this, item.dateTimestamp);\n // this.addItemToGroup(item, group);\n\n // return {item, group};\n // }\n\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\n //console.log('setClipIfNeeded', bubble, remove);\n const className = bubble.className;\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\n //console.log('setClipIfNeeded', bubble, remove, container);\n if(!container) return;\n\n try {\n Array.from(container.children).forEach((object) => {\n if(object instanceof SVGDefsElement) return;\n\n if(remove) {\n object.removeAttributeNS(null, 'clip-path');\n } else {\n let clipId = container.dataset.clipId;\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\n let width = +object.getAttributeNS(null, 'width');\n let height = +object.getAttributeNS(null, 'height');\n let isOut = className.includes('is-out');\n let isReply = className.includes('is-reply');\n let d = '';\n\n //console.log('setClipIfNeeded', object, width, height, isOut);\n\n let tr: number, tl: number;\n if(className.includes('forwarded') || isReply) {\n tr = tl = 0;\n } else if(isOut) {\n tr = className.includes('is-group-first') ? 12 : 6;\n tl = 12;\n } else {\n tr = 12;\n tl = className.includes('is-group-first') ? 12 : 6;\n }\n\n if(isOut) {\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\n } else {\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\n }\n\n path.setAttributeNS(null, 'd', d);\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\n }\n });\n } catch(err) {}\n }\n } */\n\n // updateGroupByMessageId(mid: number) {\n // const item = this.itemsArr.find((g) => g.mid === mid);\n // if(item) {\n // item.group.updateGroup();\n // }\n // }\n\n cleanup() {\n this.itemsArr = [];\n this.groups = [];\n this.itemsMap.clear();\n }\n\n // findIncorrentPositions() {\n // var bubbles = Array.from(this.chat.bubbles.chatInner.querySelectorAll('.bubbles-group .bubble')).reverse();\n // var items = this.itemsArr;\n // for(var i = 0, length = items.length; i < length; ++i) {\n // const item = items[i];\n // const foundBubble = bubbles[i];\n // if(item.bubble !== foundBubble) {\n // console.log('incorrect position', i, item, foundBubble);\n // // debugger;\n // // break;\n // }\n // }\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement, {PopupOptions} from '.';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport I18n, {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\nimport InputField from '../inputField';\n\nexport default class PopupDatePicker extends PopupElement {\n protected controlsDiv: HTMLElement;\n protected monthTitle: HTMLElement;\n protected prevBtn: HTMLElement;\n protected nextBtn: HTMLElement;\n\n protected monthsContainer: HTMLElement;\n protected month: HTMLElement;\n\n protected minMonth: Date;\n protected maxMonth: Date;\n protected minDate: Date;\n protected maxDate: Date;\n protected selectedDate: Date;\n protected selectedMonth: Date;\n protected selectedEl: HTMLElement;\n\n protected timeDiv: HTMLDivElement;\n protected hoursInputField: InputField;\n protected minutesInputField: InputField;\n\n constructor(initDate: Date, public onPick: (timestamp: number) => void, protected options: Partial<{\n noButtons: true,\n noTitle: true,\n minDate: Date,\n maxDate: Date\n withTime: true,\n showOverflowMonths: true\n }> & PopupOptions = {}) {\n super('popup-date-picker', {\n body: true,\n overlayClosable: true,\n buttons: options.noButtons ? [] : [{\n langKey: 'JumpToDate',\n callback: () => {\n if(this.onPick) {\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\n }\n }\n }, {\n langKey: 'Cancel',\n isCancel: true\n }],\n title: true,\n ...options\n });\n\n this.minDate = options.minDate || new Date('2013-08-01T00:00:00');\n\n if(initDate < this.minDate) {\n initDate.setFullYear(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\n }\n\n // Controls\n this.controlsDiv = document.createElement('div');\n this.controlsDiv.classList.add('date-picker-controls');\n\n this.prevBtn = document.createElement('button');\n this.prevBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-prev');\n attachClickEvent(this.prevBtn, this.onPrevClick, {listenerSetter: this.listenerSetter});\n\n this.nextBtn = document.createElement('button');\n this.nextBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-next');\n attachClickEvent(this.nextBtn, this.onNextClick, {listenerSetter: this.listenerSetter});\n\n this.monthTitle = document.createElement('div');\n this.monthTitle.classList.add('date-picker-month-title');\n\n this.controlsDiv.append(this.prevBtn, this.monthTitle, this.nextBtn);\n\n // Month\n this.monthsContainer = document.createElement('div');\n this.monthsContainer.classList.add('date-picker-months');\n attachClickEvent(this.monthsContainer, this.onDateClick, {listenerSetter: this.listenerSetter});\n\n this.body.append(this.controlsDiv, this.monthsContainer);\n\n // Time inputs\n if(options.withTime) {\n this.timeDiv = document.createElement('div');\n this.timeDiv.classList.add('date-picker-time');\n\n const delimiter = document.createElement('div');\n delimiter.classList.add('date-picker-time-delimiter');\n delimiter.append(':');\n\n const handleTimeInput = (max: number, inputField: InputField, onInput: (length: number) => void, onOverflow?: (number: number) => void) => {\n const maxString = '' + max;\n this.listenerSetter.add(inputField.input)('input', (e) => {\n let value = inputField.value.replace(/\\D/g, '');\n if(value.length > 2) {\n value = value.slice(0, 2);\n } else {\n if((value.length === 1 && +value[0] > +maxString[0]) || (value.length === 2 && +value > max)) {\n if(value.length === 2 && onOverflow) {\n onOverflow(+value[1]);\n }\n\n value = '0' + value[0];\n }\n }\n\n inputField.setValueSilently(value);\n onInput(value.length);\n });\n };\n\n this.hoursInputField = new InputField({plainText: true});\n this.minutesInputField = new InputField({plainText: true});\n\n handleTimeInput(23, this.hoursInputField, (length) => {\n if(length === 2) {\n this.minutesInputField.input.focus();\n }\n\n this.setTimeTitle();\n }, (number) => {\n this.minutesInputField.value = (number + this.minutesInputField.value).slice(0, 2);\n });\n handleTimeInput(59, this.minutesInputField, (length) => {\n if(!length) {\n this.hoursInputField.input.focus();\n }\n\n this.setTimeTitle();\n });\n\n this.selectedDate = initDate;\n\n initDate.setMinutes(initDate.getMinutes() + 10);\n\n this.hoursInputField.setValueSilently(('0' + initDate.getHours()).slice(-2));\n this.minutesInputField.setValueSilently(('0' + initDate.getMinutes()).slice(-2));\n\n initDate.setHours(0, 0, 0, 0);\n\n this.timeDiv.append(this.hoursInputField.container, delimiter, this.minutesInputField.container);\n\n attachClickEvent(this.btnConfirm, () => {\n if(this.onPick) {\n this.selectedDate.setHours(+this.hoursInputField.value || 0, +this.minutesInputField.value || 0, 0, 0);\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\n }\n\n this.hide();\n }, {listenerSetter: this.listenerSetter});\n\n this.body.append(this.timeDiv);\n\n this.prevBtn.classList.add('primary');\n this.nextBtn.classList.add('primary');\n }\n\n const popupCenterer = document.createElement('div');\n popupCenterer.classList.add('popup-centerer');\n popupCenterer.append(this.container);\n this.element.append(popupCenterer);\n\n // const passed = (initDate.getTime() - (initDate.getTimezoneOffset() * 60000)) % 86400000;\n // this.selectedDate = this.maxDate = new Date(initDate.getTime() - passed);\n initDate.setHours(0, 0, 0, 0);\n this.selectedDate = initDate;\n\n this.maxDate = options.maxDate || new Date();\n this.maxDate.setHours(0, 0, 0, 0);\n\n this.selectedMonth = new Date(this.selectedDate);\n this.selectedMonth.setDate(1);\n\n this.maxMonth = new Date(this.maxDate);\n this.maxMonth.setDate(1);\n\n this.minMonth = new Date(this.minDate);\n this.minMonth.setHours(0, 0, 0, 0);\n this.minMonth.setDate(1);\n\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\n this.prevBtn.setAttribute('disabled', 'true');\n }\n\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\n this.nextBtn.setAttribute('disabled', 'true');\n }\n\n if(options.noTitle) {\n this.setTitle = () => {};\n }\n\n this.setTimeTitle();\n this.setTitle();\n this.setMonth();\n }\n\n onPrevClick = (e: MouseEvent) => {\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() - 1);\n this.setMonth();\n\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\n this.prevBtn.setAttribute('disabled', 'true');\n }\n\n this.nextBtn.removeAttribute('disabled');\n };\n\n onNextClick = (e: MouseEvent) => {\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() + 1);\n this.setMonth();\n\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\n this.nextBtn.setAttribute('disabled', 'true');\n }\n\n this.prevBtn.removeAttribute('disabled');\n };\n\n onDateClick = (e: MouseEvent) => {\n // cancelEvent(e);\n const target = e.target as HTMLElement;\n\n if(!target.dataset.timestamp) return;\n\n if(this.selectedEl) {\n if(this.selectedEl === target) return;\n this.selectedEl.classList.remove('active');\n }\n\n this.selectedEl = target;\n\n target.classList.add('active');\n const timestamp = +target.dataset.timestamp;\n\n this.selectedDate = new Date(timestamp);\n\n this.setTitle();\n this.setTimeTitle();\n };\n\n public setTimeTitle() {\n if(this.btnConfirm && this.selectedDate) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n const date = new Date();\n date.setHours(0, 0, 0, 0);\n\n const timeOptions: Intl.DateTimeFormatOptions = {\n minute: '2-digit',\n hour: '2-digit'\n };\n\n const sendDate = new Date(this.selectedDate.getTime());\n sendDate.setHours(+this.hoursInputField.value, +this.minutesInputField.value);\n\n if(this.selectedDate.getTime() === date.getTime()) {\n key = 'Schedule.SendToday';\n }/* else if(this.selectedDate.getTime() === (date.getTime() + 86400e3)) {\n dayStr = 'Tomorrow';\n } */ else {\n key = 'Schedule.SendDate';\n\n const dateOptions: Intl.DateTimeFormatOptions = {\n month: 'short',\n day: 'numeric'\n };\n\n if(sendDate.getFullYear() !== date.getFullYear()) {\n dateOptions.year = 'numeric';\n }\n\n args.push(new I18n.IntlDateElement({\n date: sendDate,\n options: dateOptions\n }).element);\n }\n\n args.push(new I18n.IntlDateElement({\n date: sendDate,\n options: timeOptions\n }).element);\n\n this.btnConfirm.firstChild.replaceWith(i18n(key, args));\n }\n }\n\n public setTitle() {\n // const splitted = this.selectedDate.toString().split(' ', 3);\n // this.title.innerText = splitted[0] + ', ' + splitted[1] + ' ' + splitted[2];\n this.title.textContent = '';\n this.title.append(new I18n.IntlDateElement({\n date: this.selectedDate,\n options: {\n day: 'numeric',\n month: 'long',\n weekday: 'short'\n }\n }).element);\n }\n\n private renderElement(disabled: boolean, innerText: string | HTMLElement = '') {\n const el = document.createElement('button');\n el.classList.add('btn-icon', 'date-picker-month-date');\n\n if(disabled) {\n el.setAttribute('disabled', 'true');\n }\n\n if(innerText) {\n el.append(innerText);\n }\n\n return el;\n }\n\n public setMonth() {\n const firstDate = new Date(this.selectedMonth);\n\n const options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: this.timeDiv && mediaSizes.isMobile ? 'short' : 'long'\n };\n\n this.monthTitle.textContent = '';\n this.monthTitle.append(new I18n.IntlDateElement({date: firstDate, options}).element);\n // this.monthTitle.innerText = (this.timeDiv && mediaSizes.isMobile ? monthName.slice(0, 3) : monthName) + ' ' + this.selectedMonth.getFullYear();\n\n if(this.month) {\n this.month.remove();\n }\n\n this.month = document.createElement('div');\n this.month.classList.add('date-picker-month');\n\n const weekStartDate = new Date();\n const day = weekStartDate.getDay();\n if(day !== 1) {\n weekStartDate.setHours(-24 * (day - 1));\n }\n\n for(let i = 0; i < 7; ++i) {\n const el = this.renderElement(true, new I18n.IntlDateElement({date: weekStartDate, options: {weekday: 'narrow'}}).element);\n el.classList.remove('date-picker-month-date');\n el.classList.add('date-picker-month-day');\n this.month.append(el);\n weekStartDate.setDate(weekStartDate.getDate() + 1);\n }\n\n // 0 - sunday\n let dayIndex = firstDate.getDay() - 1;\n if(dayIndex === -1) dayIndex = 7 - 1;\n\n const clonedDate = new Date(firstDate.getTime());\n clonedDate.setDate(clonedDate.getDate() - dayIndex - 1);\n\n // Padding first week\n for(let i = 0; i < dayIndex; ++i) {\n if(this.options.showOverflowMonths) {\n clonedDate.setDate(clonedDate.getDate() + 1);\n this.month.append(this.renderElement(true, '' + clonedDate.getDate()));\n } else {\n this.month.append(this.renderElement(true));\n }\n }\n\n do {\n const date = firstDate.getDate();\n const el = this.renderElement(firstDate > this.maxDate || firstDate < this.minDate, '' + date);\n el.dataset.timestamp = '' + firstDate.getTime();\n\n if(firstDate.getTime() === this.selectedDate.getTime()) {\n this.selectedEl = el;\n el.classList.add('active');\n }\n\n this.month.append(el);\n\n firstDate.setDate(date + 1);\n } while(firstDate.getDate() !== 1);\n\n const remainder = this.month.childElementCount % 7;\n if(this.options.showOverflowMonths && remainder) {\n for(let i = remainder; i < 7; ++i) {\n this.month.append(this.renderElement(true, '' + firstDate.getDate()));\n firstDate.setDate(firstDate.getDate() + 1);\n }\n }\n\n const lines = Math.ceil(this.month.childElementCount / 7);\n this.container.dataset.lines = '' + lines;\n\n this.monthsContainer.append(this.month);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {setDirection} from '../helpers/dom/setInnerHTML';\n\nexport default class DivAndCaption {\n public container: HTMLElement;\n public border: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public subtitle: HTMLElement;\n\n constructor(protected className: string, public fill?: T) {\n this.container = document.createElement('div');\n this.container.className = className;\n\n this.border = document.createElement('div');\n this.border.classList.add(className + '-border');\n\n this.content = document.createElement('div');\n this.content.classList.add(className + '-content');\n\n this.title = document.createElement('div');\n this.title.classList.add(className + '-title');\n setDirection(this.title);\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add(className + '-subtitle');\n setDirection(this.subtitle);\n\n this.content.append(this.title, this.subtitle);\n this.container.append(this.border, this.content);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {Middleware} from '../../helpers/middleware';\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {Document, Message, MessageMedia, Photo, WebPage} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport DivAndCaption from '../divAndCaption';\nimport wrapMessageForReply from '../wrappers/messageForReply';\nimport wrapPhoto from '../wrappers/photo';\nimport wrapSticker from '../wrappers/sticker';\nimport wrapVideo from '../wrappers/video';\nimport {AnimationItemGroup} from '../animationIntersector';\n\nconst MEDIA_SIZE = 32;\n\nexport async function wrapReplyDivAndCaption(options: {\n title: string | HTMLElement | DocumentFragment,\n titleEl: HTMLElement,\n subtitle: string | HTMLElement | DocumentFragment,\n subtitleEl: HTMLElement,\n message: Message.message | Message.messageService,\n mediaEl: HTMLElement,\n loadPromises?: Promise[],\n animationGroup: AnimationItemGroup\n}) {\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises, animationGroup} = options;\n if(title !== undefined) {\n if(typeof(title) === 'string') {\n title = limitSymbols(title, 140);\n title = wrapEmojiText(title);\n }\n\n replaceContent(titleEl, title);\n }\n\n if(!loadPromises) {\n loadPromises = [];\n }\n\n let messageMedia: MessageMedia | WebPage.webPage = (message as Message.message)?.media;\n let setMedia = false, isRound = false;\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\n let middleware: Middleware;\n if(messageMedia && mediaEl) {\n subtitleEl.textContent = '';\n subtitleEl.append(await wrapMessageForReply({message, animationGroup, withoutMediaType: true}));\n\n messageMedia = (messageMedia as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || messageMedia;\n const photo = (messageMedia as MessageMedia.messageMediaPhoto).photo as Photo.photo;\n const document = (messageMedia as MessageMedia.messageMediaDocument).document as Document.document;\n if(photo || (document && document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(document.type) !== -1) */) {\n middleware = appImManager.chat.bubbles.getMiddleware();\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\n\n if(document?.type === 'sticker') {\n await wrapSticker({\n doc: document,\n div: mediaEl,\n lazyLoadQueue,\n group: animationGroup,\n // onlyThumb: document.sticker === 2,\n width: MEDIA_SIZE,\n height: MEDIA_SIZE,\n middleware,\n loadPromises\n });\n setMedia = true;\n } else if(document?.type === 'gif' && document.video_thumbs) {\n setMedia = true;\n await wrapVideo({\n doc: document,\n container: mediaEl,\n boxWidth: MEDIA_SIZE,\n boxHeight: MEDIA_SIZE,\n lazyLoadQueue,\n noPlayButton: true,\n noInfo: true,\n middleware,\n loadPromises,\n withoutPreloader: true,\n videoSize: document.video_thumbs[0],\n group: animationGroup\n });\n } else {\n const m = photo || document;\n isRound = document?.type === 'round';\n\n try {\n await wrapPhoto({\n photo: m,\n container: mediaEl,\n boxWidth: MEDIA_SIZE,\n boxHeight: MEDIA_SIZE,\n size: choosePhotoSize(m, MEDIA_SIZE, MEDIA_SIZE),\n middleware,\n lazyLoadQueue,\n noBlur: true,\n withoutPreloader: true,\n loadPromises\n });\n setMedia = true;\n } catch(err) {\n\n }\n }\n }\n } else {\n if(message) {\n subtitleEl.textContent = '';\n subtitleEl.append(await wrapMessageForReply({message}));\n } else {\n if(typeof(subtitle) === 'string') {\n subtitle = limitSymbols(subtitle, 140);\n subtitle = wrapEmojiText(subtitle);\n }\n\n replaceContent(subtitleEl, subtitle || '');\n }\n }\n\n Promise.all(loadPromises).then(() => {\n if(middleware && !middleware()) return;\n mediaChildren.forEach((child) => child.remove());\n\n if(mediaEl) {\n mediaEl.classList.toggle('is-round', isRound);\n }\n });\n\n return setMedia;\n}\n\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => Promise> {\n private mediaEl: HTMLElement;\n\n constructor(protected className: string, protected animationGroup: AnimationItemGroup) {\n super(className, async(title, subtitle = '', message?) => {\n if(!this.mediaEl) {\n this.mediaEl = document.createElement('div');\n this.mediaEl.classList.add(this.className + '-media');\n }\n\n const isMediaSet = await wrapReplyDivAndCaption({\n title,\n titleEl: this.title,\n subtitle,\n subtitleEl: this.subtitle,\n mediaEl: this.mediaEl,\n message,\n animationGroup\n });\n\n this.container.classList.toggle('is-media', isMediaSet);\n if(isMediaSet) {\n this.content.prepend(this.mediaEl);\n } else {\n this.mediaEl.remove();\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {hexToRgb} from '../../helpers/color';\nimport {Message} from '../../layer';\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport ReplyContainer from '../chat/replyContainer';\n\nexport default function wrapReply(\n title: Parameters[0],\n subtitle: Parameters[1],\n animationGroup: AnimationItemGroup,\n message?: Message.message | Message.messageService,\n setColorPeerId?: PeerId\n) {\n const replyContainer = new ReplyContainer('reply', animationGroup);\n const fillPromise = replyContainer.fill(title, subtitle, message);\n\n if(setColorPeerId) {\n const hex = getPeerColorById(setColorPeerId, false);\n const [r, g, b] = hexToRgb(hex);\n replyContainer.container.style.setProperty('--override-color', `${r}, ${g}, ${b}`);\n replyContainer.container.classList.add('is-overriding-color');\n // replyContainer.border.style.backgroundColor = hex;\n // replyContainer.title.style.color = hex;\n }\n\n return {container: replyContainer.container, fillPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from './avatar';\nimport type LazyLoadQueue from './lazyLoadQueue';\n\nconst CLASS_NAME = 'stacked-avatars';\nconst AVATAR_CLASS_NAME = CLASS_NAME + '-avatar';\nconst AVATAR_CONTAINER_CLASS_NAME = AVATAR_CLASS_NAME + '-container';\n\nexport default class StackedAvatars {\n public container: HTMLElement;\n private lazyLoadQueue: LazyLoadQueue;\n private avatarSize: number;\n\n constructor(options: {\n lazyLoadQueue?: StackedAvatars['lazyLoadQueue'],\n avatarSize: StackedAvatars['avatarSize']\n }) {\n this.lazyLoadQueue = options.lazyLoadQueue;\n this.avatarSize = options.avatarSize;\n\n this.container = document.createElement('div');\n this.container.classList.add(CLASS_NAME);\n\n this.container.style.setProperty('--avatar-size', options.avatarSize + 'px');\n }\n /**\n * MACOS, ANDROID - без реверса\n * WINDOWS DESKTOP - реверс\n * все приложения накладывают аватарку первую на вторую, а в макете зато вторая на первую, ЛОЛ!\n */\n public render(peerIds: PeerId[], loadPromises?: Promise[]) {\n const children = this.container.children;\n peerIds = peerIds.slice().reverse();\n if(peerIds.length > 3) {\n peerIds = peerIds.slice(-3);\n }\n\n peerIds.forEach((peerId, idx) => {\n let avatarContainer = children[idx] as HTMLElement;\n if(!avatarContainer) {\n avatarContainer = document.createElement('div');\n avatarContainer.classList.add(AVATAR_CONTAINER_CLASS_NAME);\n }\n\n let avatarElem = avatarContainer.firstElementChild as AvatarElement;\n if(!avatarElem) {\n avatarElem = new AvatarElement();\n avatarElem.classList.add('avatar-' + this.avatarSize, AVATAR_CLASS_NAME);\n avatarElem.updateOptions({\n isDialog: false,\n loadPromises\n });\n }\n\n avatarElem.updateWithOptions({\n lazyLoadQueue: this.lazyLoadQueue,\n peerId: peerId\n });\n\n if(!avatarElem.parentNode) {\n avatarContainer.append(avatarElem);\n }\n\n if(!avatarContainer.parentNode) {\n this.container.append(avatarContainer);\n }\n });\n\n // if were 3 and became 2\n (Array.from(children) as HTMLElement[]).slice(peerIds.length).forEach((el) => el.remove());\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message} from '../../layer';\nimport rootScope from '../../lib/rootScope';\nimport ripple from '../ripple';\nimport I18n from '../../lib/langPack';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport StackedAvatars from '../stackedAvatars';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport type LazyLoadQueue from '../lazyLoadQueue';\n\nconst TAG_NAME = 'replies-element';\n\nrootScope.addEventListener('replies_updated', (message) => {\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach((element) => {\n element.message = message;\n element.render();\n });\n});\n\nexport default class RepliesElement extends HTMLElement {\n public message: Message.message;\n public type: 'footer' | 'beside';\n public loadPromises: Promise[];\n public lazyLoadQueue: LazyLoadQueue;\n public stackedAvatars: StackedAvatars;\n public text: I18n.IntlElement;\n public managers: AppManagers;\n\n private updated = false;\n\n constructor() {\n super();\n this.managers = rootScope.managers;\n }\n\n public init() {\n this.render();\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\n this.classList.add('replies', 'replies-' + this.type);\n }\n\n public render() {\n const replies = this.message.replies;\n\n /* if(this.firstChild) {\n this.innerHTML = '';\n } */\n\n if(this.type === 'footer') {\n let leftPart: HTMLElement;\n if(this.firstElementChild) {\n leftPart = this.firstElementChild as HTMLElement;\n }\n\n if(replies?.recent_repliers) {\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\n this.innerHTML = '';\n leftPart = null;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n lazyLoadQueue: this.lazyLoadQueue,\n avatarSize: 30\n });\n\n this.stackedAvatars.container.classList.add('replies-footer-avatars');\n }\n\n leftPart = this.stackedAvatars.container;\n\n this.stackedAvatars.render(replies.recent_repliers.map((peer) => getPeerId(peer)), this.loadPromises);\n } else {\n if(leftPart && !leftPart.classList.contains('tgico-comments')) {\n leftPart.remove();\n leftPart = null;\n }\n\n if(!leftPart) {\n leftPart = document.createElement('span');\n leftPart.classList.add('tgico-comments');\n }\n }\n\n if(!leftPart.parentElement) {\n this.prepend(leftPart);\n }\n\n if(!this.text) {\n this.text = new I18n.IntlElement();\n }\n\n const text = this.text;\n if(replies) {\n if(replies.replies) {\n text.compareAndUpdate({key: 'Comments', args: [replies.replies]});\n } else {\n text.compareAndUpdate({key: 'LeaveAComment'});\n }\n } else {\n text.compareAndUpdate({key: 'ViewInChat'});\n }\n\n if(replies) {\n // const historyStorage = appMessagesManager.getHistoryStorage(replies.channel_id.toPeerId(true));\n let isUnread = false;\n if(replies.replies) {\n if(replies.read_max_id !== undefined && replies.max_id !== undefined) {\n isUnread = replies.read_max_id < replies.max_id;\n }/* else {\n isUnread = !historyStorage.readMaxId || historyStorage.readMaxId < (replies.max_id || 0);\n } */\n }\n this.classList.toggle('is-unread', isUnread);\n }\n\n let textSpan = this.children[1] as HTMLElement;\n if(!textSpan) {\n textSpan = document.createElement('span');\n textSpan.classList.add('replies-footer-text');\n\n const iconSpan = document.createElement('span');\n iconSpan.classList.add('tgico-next');\n\n const rippleContainer = document.createElement('div');\n ripple(rippleContainer);\n\n this.append(textSpan, iconSpan, rippleContainer);\n }\n\n replaceContent(textSpan, text.element);\n } else {\n this.classList.add('bubble-beside-button');\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\n }\n\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\n this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\n this.managers.appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\n this.updated = true;\n }\n\n if(this.loadPromises) {\n this.loadPromises = undefined;\n }\n }\n}\n\ncustomElements.define(TAG_NAME, RepliesElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatTime, getFullDate} from '../../helpers/date';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {Message} from '../../layer';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {i18n, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../lib/rootScope';\nimport type LazyLoadQueue from '../lazyLoadQueue';\nimport PeerTitle from '../peerTitle';\nimport wrapReply from '../wrappers/reply';\nimport Chat, {ChatType} from './chat';\nimport RepliesElement from './replies';\n\nconst NBSP = ' ';\n\nconst makeEdited = () => {\n const edited = document.createElement('i');\n edited.classList.add('edited');\n _i18n(edited, 'EditedMessage');\n return edited;\n};\n\nconst makeSponsored = () => i18n('SponsoredMessage');\n\nexport namespace MessageRender {\n /* export const setText = () => {\n\n }; */\n\n export const setTime = (options: {\n chatType: ChatType,\n message: Message.message | Message.messageService,\n reactionsMessage?: Message.message\n }) => {\n const {chatType, message} = options;\n const date = new Date(message.date * 1000);\n const args: (HTMLElement | string)[] = [];\n\n let editedSpan: HTMLElement,\n sponsoredSpan: HTMLElement;\n // reactionsElement: ReactionsElement,\n // reactionsMessage: Message.message;\n\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const isMessage = !('action' in message) && !isSponsored;\n // let hasReactions: boolean;\n\n const time: HTMLElement = isSponsored ? undefined : formatTime(date);\n if(isMessage) {\n if(message.views) {\n const postAuthor = message.post_author || message.fwd_from?.post_author;\n\n const postViewsSpan = document.createElement('span');\n postViewsSpan.classList.add('post-views');\n postViewsSpan.innerHTML = formatNumber(message.views, 1);\n\n const channelViews = document.createElement('i');\n channelViews.classList.add('tgico-channelviews', 'time-icon');\n\n args.push(postViewsSpan, channelViews);\n if(postAuthor) {\n const span = document.createElement('span');\n setInnerHTML(span, wrapEmojiText(postAuthor));\n span.insertAdjacentHTML('beforeend', ',' + NBSP)\n args.push(span);\n }\n }\n\n if(message.edit_date && chatType !== 'scheduled' && !message.pFlags.edit_hide) {\n args.unshift(editedSpan = makeEdited());\n }\n\n if(chatType !== 'pinned' && message.pFlags.pinned) {\n const i = document.createElement('i');\n i.classList.add('tgico-pinnedchat', 'time-icon');\n args.unshift(i);\n }\n\n // if(USER_REACTIONS_INLINE && message.peer_id._ === 'peerUser'/* && message.reactions?.results?.length */) {\n // hasReactions = true;\n\n // reactionsMessage = options.reactionsMessage;\n // reactionsElement = new ReactionsElement();\n // reactionsElement.init(reactionsMessage, 'inline', true);\n // reactionsElement.render();\n // args.unshift(reactionsElement);\n // }\n } else if(isSponsored) {\n args.push(sponsoredSpan = makeSponsored());\n }\n\n if(time) {\n args.push(time);\n }\n\n let title = isSponsored ? undefined : getFullDate(date);\n if(isMessage) {\n title += (message.edit_date && !message.pFlags.edit_hide ? `\\nEdited: ${getFullDate(new Date(message.edit_date * 1000))}` : '') +\n (message.fwd_from ? `\\nOriginal: ${getFullDate(new Date(message.fwd_from.date * 1000))}` : '');\n }\n\n const timeSpan = document.createElement('span');\n timeSpan.classList.add('time', 'tgico');\n // if(title) timeSpan.title = title;\n timeSpan.append(...args);\n\n const inner = document.createElement('div');\n inner.classList.add('inner', 'tgico');\n if(title) inner.title = title;\n\n let clonedArgs = args;\n if(editedSpan) {\n clonedArgs[clonedArgs.indexOf(editedSpan)] = makeEdited();\n }\n if(sponsoredSpan) {\n clonedArgs[clonedArgs.indexOf(sponsoredSpan)] = makeSponsored();\n }\n // if(reactionsElement) {\n // const _reactionsElement = clonedArgs[clonedArgs.indexOf(reactionsElement)] = new ReactionsElement();\n // _reactionsElement.init(reactionsMessage, 'inline');\n // _reactionsElement.render();\n // }\n clonedArgs = clonedArgs.map((a) => a instanceof HTMLElement && !a.classList.contains('i18n') && !a.classList.contains('reactions') ? a.cloneNode(true) as HTMLElement : a);\n if(time) {\n clonedArgs[clonedArgs.length - 1] = formatTime(date); // clone time\n }\n inner.append(...clonedArgs);\n\n timeSpan.append(inner);\n\n return timeSpan;\n };\n\n export const renderReplies = ({bubble, bubbleContainer, message, messageDiv, loadPromises, lazyLoadQueue}: {\n bubble: HTMLElement,\n bubbleContainer: HTMLElement,\n message: Message.message,\n messageDiv: HTMLElement,\n loadPromises?: Promise[],\n lazyLoadQueue?: LazyLoadQueue\n }) => {\n const isFooter = !bubble.classList.contains('sticker') && !bubble.classList.contains('emoji-big') && !bubble.classList.contains('round');\n const repliesFooter = new RepliesElement();\n repliesFooter.message = message;\n repliesFooter.type = isFooter ? 'footer' : 'beside';\n repliesFooter.loadPromises = loadPromises;\n repliesFooter.lazyLoadQueue = lazyLoadQueue;\n repliesFooter.init();\n bubbleContainer.prepend(repliesFooter);\n return isFooter;\n };\n\n export const setReply = async({chat, bubble, bubbleContainer, message}: {\n chat: Chat,\n bubble: HTMLElement,\n bubbleContainer?: HTMLElement,\n message: Message.message\n }) => {\n const isReplacing = !bubbleContainer;\n if(isReplacing) {\n bubbleContainer = bubble.querySelector('.bubble-content');\n }\n\n const currentReplyDiv = isReplacing ? bubbleContainer.querySelector('.reply') : null;\n if(!message.reply_to_mid) {\n currentReplyDiv?.remove();\n\n bubble.classList.remove('is-reply');\n return;\n }\n\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : chat.peerId;\n\n const originalMessage = await rootScope.managers.appMessagesManager.getMessageByPeer(replyToPeerId, message.reply_to_mid);\n let originalPeerTitle: string | HTMLElement;\n\n // ///////this.log('message to render reply', originalMessage, originalPeerTitle, bubble, message);\n\n let titlePeerId: PeerId;\n // need to download separately\n if(!originalMessage) {\n // ////////this.log('message to render reply empty, need download', message, message.reply_to_mid);\n rootScope.managers.appMessagesManager.fetchMessageReplyTo(message);\n chat.bubbles.needUpdate.push({replyToPeerId, replyMid: message.reply_to_mid, mid: message.mid});\n\n originalPeerTitle = i18n('Loading');\n } else {\n const originalMessageFwdFromId = (originalMessage as Message.message).fwdFromId;\n titlePeerId = message.fwdFromId && message.fwdFromId === originalMessageFwdFromId ? message.fwdFromId : originalMessage.fromId || originalMessageFwdFromId;\n originalPeerTitle = new PeerTitle({\n peerId: titlePeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n }\n\n const {container, fillPromise} = wrapReply(originalPeerTitle, undefined, chat.animationGroup, originalMessage, chat.isAnyGroup ? titlePeerId : undefined);\n await fillPromise;\n if(currentReplyDiv) {\n if(currentReplyDiv.classList.contains('floating-part')) {\n container.classList.add('floating-part');\n }\n currentReplyDiv.replaceWith(container);\n } else {\n bubbleContainer.append(container);\n }\n // bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\n\n return container;\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport function getElementByPoint(container: HTMLElement, verticalSide: 'top' | 'bottom', horizontalSide: 'center' | 'left'): HTMLElement {\n // return null;\n const rect = container.getBoundingClientRect();\n const x = horizontalSide === 'center' ? Math.ceil(rect.left + ((rect.right - rect.left) / 2) + 1) : Math.ceil(rect.left + 1);\n const y = verticalSide === 'bottom' ? Math.floor(rect.top + rect.height - 1) : Math.ceil(rect.top + 1);\n return document.elementFromPoint(x, y) as any;\n};\n\nMOUNT_CLASS_TO.getElementByPoint = getElementByPoint;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function reflowScrollableElement(element: HTMLElement) {\n element.style.display = 'none';\n void element.offsetLeft; // reflow\n element.style.display = '';\n}\n","export const SEND_WHEN_ONLINE_TIMESTAMP = 0x7FFFFFFE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport enum INTERNAL_LINK_TYPE {\n MESSAGE,\n PRIVATE_POST,\n STICKER_SET,\n JOIN_CHAT,\n VOICE_CHAT,\n USER_PHONE_NUMBER,\n INVOICE,\n EMOJI_SET\n};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat | InternalLink.InternalLinkVoiceChat | InternalLink.InternalLinkUserPhoneNumber | InternalLink.InternalLinkInvoice | InternalLink.InternalLinkEmojiSet;\n\nexport namespace InternalLink {\n export interface InternalLinkMessage {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: string,\n post?: string,\n comment?: string,\n thread?: string,\n start?: string,\n stack?: number // local\n }\n\n export interface InternalLinkPrivatePost {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: string,\n post: string,\n thread?: string,\n comment?: string,\n stack?: number // local\n }\n\n export interface InternalLinkStickerSet {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: string\n }\n\n export interface InternalLinkJoinChat {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: string\n }\n\n /**\n * LOCAL LINK\n */\n export interface InternalLinkVoiceChat {\n _: INTERNAL_LINK_TYPE.VOICE_CHAT,\n id: string,\n access_hash: string,\n chat_id: string\n }\n\n export interface InternalLinkUserPhoneNumber {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: string\n }\n\n export interface InternalLinkInvoice {\n _: INTERNAL_LINK_TYPE.INVOICE,\n slug: string\n }\n\n export interface InternalLinkEmojiSet {\n _: INTERNAL_LINK_TYPE.EMOJI_SET,\n set: string\n }\n}\n\nexport type InternalLinkTypeMap = {\n [INTERNAL_LINK_TYPE.MESSAGE]: InternalLink.InternalLinkMessage,\n [INTERNAL_LINK_TYPE.PRIVATE_POST]: InternalLink.InternalLinkPrivatePost,\n [INTERNAL_LINK_TYPE.STICKER_SET]: InternalLink.InternalLinkStickerSet,\n [INTERNAL_LINK_TYPE.JOIN_CHAT]: InternalLink.InternalLinkJoinChat,\n [INTERNAL_LINK_TYPE.VOICE_CHAT]: InternalLink.InternalLinkVoiceChat,\n [INTERNAL_LINK_TYPE.USER_PHONE_NUMBER]: InternalLink.InternalLinkUserPhoneNumber,\n [INTERNAL_LINK_TYPE.INVOICE]: InternalLink.InternalLinkInvoice,\n [INTERNAL_LINK_TYPE.EMOJI_SET]: InternalLink.InternalLinkEmojiSet\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement, {addCancelButton} from '.';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport {ChatInvite} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {i18n, _i18n} from '../../lib/langPack';\nimport {NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport AvatarElement from '../avatar';\nimport putPhoto from '../putPhoto';\nimport {toastNew} from '../toast';\nimport wrapPhoto from '../wrappers/photo';\n\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\n\nexport default class PopupJoinChatInvite extends PopupElement {\n constructor(\n private hash: string,\n private chatInvite: ChatInvite.chatInvite\n ) {\n super('popup-join-chat-invite', {\n closable: true,\n overlayClosable: true,\n body: true,\n buttons: addCancelButton([{\n langKey: chatInvite.pFlags.request_needed ? 'RequestJoin.Button' : (chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle'),\n callback: () => {\n this.managers.appChatsManager.importChatInvite(hash)\n .then((chatId) => {\n const peerId = chatId.toPeerId(true);\n appImManager.setInnerPeer({peerId});\n }, (error) => {\n if(error.type === 'INVITE_REQUEST_SENT') {\n toastNew({langPackKey: 'RequestToJoinSent'});\n }\n });\n }\n }])\n });\n\n this.construct();\n }\n\n private async construct() {\n this.header.remove();\n /* const fakeChat: Chat.channel | Chat.chat = {\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\n id: FAKE_CHAT_ID,\n title: chatInvite.title,\n photo: chatInvite.photo as any,\n date: Date.now() / 1000 | 0,\n version: 0,\n participants_count: chatInvite.participants_count,\n pFlags: chatInvite.pFlags as any\n };\n\n appChatsManager.saveApiChat(fakeChat); */\n\n const {chatInvite, managers, hash} = this;\n\n const avatarElem = new AvatarElement();\n avatarElem.classList.add('avatar-100');\n avatarElem.isDialog = false;\n if(chatInvite.photo._ === 'photo') {\n chatInvite.photo = await managers.appPhotosManager.savePhoto(chatInvite.photo);\n wrapPhoto({\n container: avatarElem,\n message: null,\n photo: chatInvite.photo,\n boxHeight: 100,\n boxWidth: 100,\n withoutPreloader: true\n });\n avatarElem.style.width = avatarElem.style.height = '';\n } else {\n putPhoto({\n div: avatarElem,\n peerId: NULL_PEER_ID,\n isDialog: false,\n title: chatInvite.title\n });\n }\n\n const title = document.createElement('div');\n title.classList.add('chat-title');\n setInnerHTML(title, wrapEmojiText(chatInvite.title));\n // avatarElem.setAttribute('peer', '' + -fakeChat.id);\n\n const isBroadcast = chatInvite.pFlags.broadcast;\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [numberThousandSplitter(chatInvite.participants_count)]);\n peopleCount.classList.add('chat-participants-count');\n\n this.body.append(avatarElem, title, peopleCount);\n\n if(chatInvite.pFlags.request_needed) {\n const caption = document.createElement('div');\n _i18n(caption, isBroadcast ? 'RequestToJoinChannelDescription' : 'RequestToJoinGroupDescription');\n caption.classList.add('chat-participants-count', 'request-caption');\n\n this.body.append(caption);\n }\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport callbackify from '../../helpers/callbackify';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {Document, MessagePeerReaction, ReactionCount} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport rootScope from '../../lib/rootScope';\nimport SetTransition from '../singleTransition';\nimport StackedAvatars from '../stackedAvatars';\nimport {Awaited} from '../../types';\nimport wrapSticker from '../wrappers/sticker';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport wrapStickerAnimation from '../wrappers/stickerAnimation';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport {fastRaf} from '../../helpers/schedulers';\nimport noop from '../../helpers/noop';\nimport {Middleware} from '../../helpers/middleware';\n\nconst CLASS_NAME = 'reaction';\nconst TAG_NAME = CLASS_NAME + '-element';\nconst REACTION_INLINE_SIZE = 14;\nconst REACTION_BLOCK_SIZE = 22;\n\nexport const REACTION_DISPLAY_INLINE_COUNTER_AT = 2;\nexport const REACTION_DISPLAY_BLOCK_COUNTER_AT = 4;\n\nexport type ReactionLayoutType = 'block' | 'inline';\n\nexport default class ReactionElement extends HTMLElement {\n private type: ReactionLayoutType;\n private counter: HTMLElement;\n private stickerContainer: HTMLElement;\n private stackedAvatars: StackedAvatars;\n private canRenderAvatars: boolean;\n private _reactionCount: ReactionCount;\n private wrapStickerPromise: Awaited>['render'];\n private managers: AppManagers;\n private middleware: Middleware;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.managers = rootScope.managers;\n }\n\n public get reactionCount() {\n return this._reactionCount;\n }\n\n public set reactionCount(reactionCount: ReactionCount) {\n this._reactionCount = reactionCount;\n }\n\n public get count() {\n return this.reactionCount.count;\n }\n\n public init(type: ReactionLayoutType, middleware: Middleware) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n this.middleware = middleware;\n }\n\n public setCanRenderAvatars(canRenderAvatars: boolean) {\n this.canRenderAvatars = canRenderAvatars;\n }\n\n public render(doNotRenderSticker?: boolean) {\n const hadStickerContainer = !!this.stickerContainer;\n if(!hadStickerContainer) {\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add(CLASS_NAME + '-sticker');\n this.append(this.stickerContainer);\n }\n\n const reactionCount = this.reactionCount;\n if(!doNotRenderSticker && !hadStickerContainer) {\n const reaction = reactionCount.reaction;\n if(reaction._ === 'reactionEmoji') {\n const availableReaction = this.managers.appReactionsManager.getReaction(reaction.emoticon);\n callbackify(availableReaction, (availableReaction) => {\n if(!availableReaction.center_icon) {\n this.stickerContainer.classList.add('is-static');\n }\n\n if(availableReaction.pFlags.inactive) {\n this.classList.add('is-inactive');\n }\n\n this.renderDoc(availableReaction.center_icon ?? availableReaction.static_icon);\n });\n } else if(reaction._ === 'reactionCustomEmoji') {\n this.stickerContainer.classList.add('is-custom');\n const wrapped = wrapCustomEmoji({\n docIds: [reaction.document_id],\n customEmojiSize: makeMediaSize(REACTION_BLOCK_SIZE, REACTION_BLOCK_SIZE)\n });\n\n this.stickerContainer.append(wrapped);\n }\n }\n }\n\n private renderDoc(doc: Document.document) {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE : REACTION_BLOCK_SIZE;\n const wrapPromise = this.wrapStickerPromise = wrapSticker({\n div: this.stickerContainer,\n doc,\n width: size,\n height: size,\n static: true,\n managers: this.managers,\n middleware: this.middleware\n }).then(({render}) => render).finally(() => {\n if(this.wrapStickerPromise === wrapPromise) {\n this.wrapStickerPromise = undefined;\n }\n });\n }\n\n public renderCounter() {\n const reactionCount = this.reactionCount;\n const displayOn = this.type === 'inline' ? REACTION_DISPLAY_INLINE_COUNTER_AT : REACTION_DISPLAY_BLOCK_COUNTER_AT;\n if(reactionCount.count >= displayOn || (this.type === 'block' && !this.canRenderAvatars)) {\n if(!this.counter) {\n this.counter = document.createElement(this.type === 'inline' ? 'i' : 'span');\n this.counter.classList.add(CLASS_NAME + '-counter');\n }\n\n const formatted = formatNumber(reactionCount.count);\n if(this.counter.textContent !== formatted) {\n this.counter.textContent = formatted;\n }\n\n if(!this.counter.parentElement) {\n this.append(this.counter);\n }\n } else if(this.counter?.parentElement) {\n this.counter.remove();\n this.counter = undefined;\n }\n }\n\n public renderAvatars(recentReactions: MessagePeerReaction[]) {\n if(this.type === 'inline') {\n return;\n }\n\n if(this.reactionCount.count >= REACTION_DISPLAY_BLOCK_COUNTER_AT || !this.canRenderAvatars) {\n if(this.stackedAvatars) {\n this.stackedAvatars.container.remove();\n this.stackedAvatars = undefined;\n }\n\n return;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n avatarSize: 24\n });\n\n this.append(this.stackedAvatars.container);\n }\n\n this.stackedAvatars.render(recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n public setIsChosen(isChosen = this.reactionCount.chosen_order !== undefined) {\n if(this.type === 'inline') return;\n const wasChosen = this.classList.contains('is-chosen') && !this.classList.contains('backwards');\n if(wasChosen !== isChosen) {\n SetTransition({\n element: this,\n className: 'is-chosen',\n forwards: isChosen,\n duration: this.isConnected ? 300 : 0\n });\n }\n }\n\n public fireAroundAnimation() {\n const reaction = this.reactionCount.reaction;\n if(reaction._ !== 'reactionEmoji') return;\n callbackify(this.managers.appReactionsManager.getReaction(reaction.emoticon), (availableReaction) => {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE + 14 : REACTION_BLOCK_SIZE + 18;\n const div = document.createElement('div');\n div.classList.add(CLASS_NAME + '-sticker-activate');\n\n Promise.all([\n wrapSticker({\n div: div,\n doc: availableReaction.center_icon,\n width: size,\n height: size,\n withThumb: false,\n needUpscale: true,\n play: false,\n skipRatio: 1,\n group: 'none',\n needFadeIn: false,\n managers: this.managers,\n middleware: this.middleware\n }).then(({render}) => render as Promise),\n\n wrapStickerAnimation({\n doc: availableReaction.around_animation,\n size: 80,\n target: this.stickerContainer,\n side: 'center',\n skipRatio: 1,\n play: false,\n managers: this.managers,\n middleware: this.middleware\n }).stickerPromise.catch(noop)\n ]).then(([iconPlayer, aroundPlayer]) => {\n const remove = () => {\n // if(!isInDOM(div)) return;\n iconPlayer.remove();\n div.remove();\n this.stickerContainer.classList.remove('has-animation');\n };\n\n if(!aroundPlayer) {\n remove();\n return;\n }\n\n const removeOnFrame = () => {\n // if(!isInDOM(div)) return;\n fastRaf(remove);\n };\n\n iconPlayer.addEventListener('enterFrame', (frameNo) => {\n if(frameNo === iconPlayer.maxFrame) {\n if(this.wrapStickerPromise) { // wait for fade in animation\n this.wrapStickerPromise.then(() => {\n setTimeout(removeOnFrame, 1e3);\n });\n } else {\n removeOnFrame();\n }\n }\n });\n\n iconPlayer.addEventListener('firstFrame', () => {\n this.stickerContainer.append(div);\n this.stickerContainer.classList.add('has-animation');\n iconPlayer.play();\n aroundPlayer.play();\n }, {once: true});\n });\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport {Middleware, MiddlewareHelper} from '../../helpers/middleware';\nimport {Message, ReactionCount} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport reactionsEqual from '../../lib/appManagers/utils/reactions/reactionsEqual';\nimport rootScope from '../../lib/rootScope';\nimport ReactionElement, {ReactionLayoutType, REACTION_DISPLAY_BLOCK_COUNTER_AT} from './reaction';\n\nconst CLASS_NAME = 'reactions';\nconst TAG_NAME = CLASS_NAME + '-element';\n\nconst REACTIONS_ELEMENTS: Map> = new Map();\nexport {REACTIONS_ELEMENTS};\n\nexport default class ReactionsElement extends HTMLElement {\n private message: Message.message;\n private key: string;\n private isPlaceholder: boolean;\n private type: ReactionLayoutType;\n private sorted: ReactionElement[];\n private onConnectCallback: () => void;\n private managers: AppManagers;\n private middleware: Middleware;\n private middlewareHelpers: Map;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.sorted = [];\n this.middlewareHelpers = new Map();\n this.managers = rootScope.managers;\n }\n\n connectedCallback() {\n let set = REACTIONS_ELEMENTS.get(this.key);\n if(!set) {\n REACTIONS_ELEMENTS.set(this.key, set = new Set());\n }\n\n set.add(this);\n\n if(this.onConnectCallback && this.isConnected) {\n this.onConnectCallback();\n this.onConnectCallback = undefined;\n }\n }\n\n disconnectedCallback() {\n const set = REACTIONS_ELEMENTS.get(this.key);\n set.delete(this);\n if(!set.size) {\n REACTIONS_ELEMENTS.delete(this.key);\n }\n }\n\n public getReactionCount(reactionElement: ReactionElement) {\n return this.sorted[this.sorted.indexOf(reactionElement)].reactionCount;\n }\n\n public getMessage() {\n return this.message;\n }\n\n public init(\n message: Message.message,\n type: ReactionLayoutType,\n middleware: Middleware,\n isPlaceholder = this.isPlaceholder\n ) {\n if(this.key !== undefined) {\n this.disconnectedCallback();\n }\n\n if(this.middleware !== middleware) {\n middleware.onDestroy(() => {\n this.middlewareHelpers.clear();\n });\n }\n\n this.message = message;\n this.key = this.message.peerId + '_' + this.message.mid;\n this.middleware = middleware;\n this.isPlaceholder = isPlaceholder;\n\n if(this.type !== type) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n }\n\n this.connectedCallback();\n }\n\n public changeMessage(message: Message.message) {\n return this.init(message, this.type, this.middleware);\n }\n\n public update(message: Message.message, changedResults?: ReactionCount[]) {\n this.message = message;\n this.render(changedResults);\n }\n\n public render(changedResults?: ReactionCount[]) {\n const reactions = this.message.reactions;\n const hasReactions = !!(reactions && reactions.results.length);\n this.classList.toggle('has-no-reactions', !hasReactions);\n if(!hasReactions && !this.sorted.length) return;\n\n const availableReactionsResult = this.managers.appReactionsManager.getAvailableReactions();\n // callbackify(availableReactionsResult, () => {\n const counts = hasReactions ? (\n reactions.results\n // availableReactionsResult instanceof Promise ?\n // reactions.results :\n // reactions.results.filter((reactionCount) => {\n // return this.managers.appReactionsManager.isReactionActive(reactionCount.reaction);\n // })\n ) : [];\n\n // if(this.message.peerId.isUser()) {\n // counts.sort((a, b) => (b.count - a.count) || ((b.chosen_order ?? 0) - (a.chosen_order ?? 0)));\n // } else {\n counts.sort((a, b) => (b.count - a.count) || ((a.chosen_order ?? 0) - (b.chosen_order ?? 0)));\n // }\n\n forEachReverse(this.sorted, (reactionElement, idx, arr) => {\n const reaction = reactionElement.reactionCount.reaction;\n const found = counts.some((reactionCount) => reactionsEqual(reactionCount.reaction, reaction));\n if(!found) {\n const middlewareHelper = this.middlewareHelpers.get(reactionElement);\n middlewareHelper.destroy();\n this.middlewareHelpers.delete(reactionElement);\n arr.splice(idx, 1);\n reactionElement.remove();\n }\n });\n\n const totalReactions = counts.reduce((acc, c) => acc + c.count, 0);\n const canRenderAvatars = reactions && (!!reactions.pFlags.can_see_list || this.message.peerId.isUser()) && totalReactions < REACTION_DISPLAY_BLOCK_COUNTER_AT;\n this.sorted = counts.map((reactionCount, idx) => {\n let reactionElement = this.sorted.find((reactionElement) => reactionsEqual(reactionElement.reactionCount.reaction, reactionCount.reaction));\n if(!reactionElement) {\n const middlewareHelper = this.middleware.create();\n reactionElement = new ReactionElement();\n reactionElement.init(this.type, middlewareHelper.get());\n this.middlewareHelpers.set(reactionElement, middlewareHelper);\n }\n\n positionElementByIndex(reactionElement, this, idx);\n\n const recentReactions = reactions.recent_reactions ? reactions.recent_reactions.filter((reaction) => reactionsEqual(reaction.reaction, reactionCount.reaction)) : [];\n reactionElement.reactionCount = {...reactionCount};\n reactionElement.setCanRenderAvatars(canRenderAvatars);\n reactionElement.render(this.isPlaceholder);\n reactionElement.renderCounter();\n reactionElement.renderAvatars(recentReactions);\n reactionElement.setIsChosen();\n\n return reactionElement;\n });\n\n // this.sorted.forEach((reactionElement, idx) => {\n // /* if(this.type === 'block' && this.childElementCount !== this.sorted.length) { // because of appended time\n // idx += 1;\n // } */\n\n // positionElementByIndex(reactionElement, this, idx);\n // });\n\n if(!this.isPlaceholder && changedResults?.length) {\n if(this.isConnected) {\n this.handleChangedResults(changedResults);\n } else {\n this.onConnectCallback = () => {\n this.handleChangedResults(changedResults);\n };\n }\n }\n // });\n\n // ! тут вообще не должно быть этого кода, но пока он побудет тут\n if(!this.sorted.length && this.type === 'block') {\n const parentElement = this.parentElement;\n this.remove();\n\n if(parentElement.classList.contains('document-message') && !parentElement.childNodes.length) {\n parentElement.remove();\n return;\n }\n\n const timeSpan = this.querySelector('.time');\n if(timeSpan) {\n parentElement.append(timeSpan);\n }\n }\n }\n\n private handleChangedResults(changedResults: ReactionCount[]) {\n // ! temp\n if(this.message.peerId !== appImManager.chat.peerId) return;\n\n changedResults.forEach((reactionCount) => {\n const reactionElement = this.sorted.find((reactionElement) => reactionsEqual(reactionElement.reactionCount.reaction, reactionCount.reaction));\n reactionElement?.fireAroundAnimation();\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionsElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport getVisibleRect from './dom/getVisibleRect';\nimport reflowScrollableElement from './dom/reflowScrollableElement';\n\nexport default class ScrollSaver {\n private scrollHeight: number;\n private scrollHeightMinusTop: number;\n private scrollTop: number;\n private clientHeight: number;\n private elements: {element: HTMLElement, rect: DOMRect}[];\n\n /**\n *\n * @param scrollable to reset scroll position and direction\n * @param reverse true means top\n */\n constructor(\n private scrollable: Scrollable,\n private query: string,\n private reverse: boolean\n ) {\n\n }\n\n private get container() {\n return this.scrollable.container;\n }\n\n public getSaved() {\n return {\n scrollHeight: this.scrollHeight,\n scrollTop: this.scrollTop,\n clientHeight: this.clientHeight\n };\n }\n\n public findElements() {\n if(!this.query) return [];\n\n const {container} = this;\n const containerRect = container.getBoundingClientRect();\n const bubbles = Array.from(container.querySelectorAll(this.query)) as HTMLElement[];\n const elements: ScrollSaver['elements'] = [];\n for(const bubble of bubbles) {\n const elementRect = bubble.getBoundingClientRect();\n const visibleRect = getVisibleRect(bubble, container, undefined, elementRect, containerRect);\n if(visibleRect) {\n elements.push({element: bubble, rect: elementRect});\n // break; // find first\n } else if(elements.length) { // find last\n break;\n }\n }\n\n if(!elements.length) {\n const bubble = bubbles[0];\n if(bubble) {\n elements.push({element: bubble, rect: bubble.getBoundingClientRect()});\n }\n }\n\n return elements;\n }\n\n public replaceSaved(from: HTMLElement, to: HTMLElement) {\n if(!this.elements) {\n return;\n }\n\n const idx = this.elements.findIndex(({element}) => from === element);\n if(idx !== -1) {\n this.elements[idx].element = to;\n }\n }\n\n public findAndSetElements() {\n this.elements = this.findElements();\n }\n\n public save() {\n this.findAndSetElements();\n // console.warn('scroll save', this.elements);\n this._save();\n }\n\n public _save() {\n const {scrollTop, scrollHeight, clientHeight} = this.container;\n\n // previousScrollHeight = scrollHeight;\n // previousScrollHeight = scrollHeight + padding;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n this.clientHeight = clientHeight;\n this.scrollHeightMinusTop = this.reverse ? scrollHeight - scrollTop : scrollTop;\n\n // this.chatInner.style.paddingTop = padding + 'px';\n /* if(reverse) {\n previousScrollHeightMinusTop = this.scrollable.scrollHeight - scrollTop;\n } else {\n previousScrollHeightMinusTop = scrollTop;\n } */\n }\n\n private onRestore(useReflow?: boolean) {\n if(IS_SAFARI && useReflow/* && !isAppleMobile */) { // * fix blinking and jumping\n reflowScrollableElement(this.container);\n }\n }\n\n private setScrollTop(newScrollTop: number, useReflow?: boolean) {\n // touchSupport for safari iOS\n // isTouchSupported && isApple && (container.container.style.overflow = 'hidden');\n this.scrollable.setScrollTopSilently(this.scrollTop = newScrollTop);\n // container.scrollTop = scrollHeight;\n // isTouchSupported && isApple && (container.container.style.overflow = '');\n\n this.onRestore(useReflow);\n }\n\n public restore(useReflow?: boolean) {\n const {scrollTop, scrollHeight} = this.scrollable;\n this.scrollHeight = scrollHeight;\n\n if(!this.elements.length) { // maybe all messages have been deleted\n this._restore(useReflow);\n return;\n }\n\n let anchor: ScrollSaver['elements'][0];\n // for(let i = this.elements.length - 1; i >= 0; --i) {\n // const _anchor = this.elements[i];\n // if(_anchor.element.parentElement) {\n // anchor = _anchor;\n // break;\n // }\n // }\n anchor = this.elements[this.elements.length - 1];\n\n if(!anchor?.element?.parentElement) { // try to find new anchor\n this.findAndSetElements();\n anchor = this.elements[this.elements.length - 1];\n\n if(!anchor) { // fallback to old method if smth is really strange\n this._restore(useReflow);\n return;\n }\n }\n\n const {element, rect} = anchor;\n const newRect = element.getBoundingClientRect();\n const diff = newRect.bottom - rect.bottom;\n this.setScrollTop(scrollTop + diff, useReflow);\n // if(diff) debugger;\n // console.warn('scroll restore', rect, diff, newRect);\n }\n\n public _restore(useReflow?: boolean) {\n const {scrollHeightMinusTop: previousScrollHeightMinusTop, scrollable} = this;\n // if(previousScrollHeightMinusTop === undefined) {\n // throw new Error('scroll was not saved');\n // }\n\n // const scrollHeight = container.scrollHeight;\n const scrollHeight = this.scrollHeight;\n // if(scrollHeight === this.scrollHeight) {\n // return;\n // }\n\n // this.scrollHeight = scrollHeight;\n\n /* const scrollHeight = container.scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n\n this.chatInner.style.paddingTop = (10000 - addedHeight) + 'px'; */\n /* const scrollHeight = scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n\n this.chatInner.style.paddingTop = (padding - addedHeight) + 'px';\n\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = reverse ? scrollHeight - addedHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n this.log('performHistoryResult: will set scrollTop',\n previousScrollHeightMinusTop, scrollHeight,\n newScrollTop, container.container.clientHeight); */\n // const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = this.reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n\n /* if(DEBUG) {\n this.log('performHistoryResult: will set up scrollTop:', newScrollTop, this.isHeavyAnimationInProgress);\n } */\n\n this.setScrollTop(newScrollTop, useReflow);\n\n /* if(DEBUG) {\n this.log('performHistoryResult: have set up scrollTop:', newScrollTop, container.scrollTop, container.scrollHeight, this.isHeavyAnimationInProgress);\n } */\n }\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.ScrollSaver = ScrollSaver);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type IntersectionTarget = Element;\nexport type IntersectionCallback = (entry: IntersectionObserverEntry) => void;\n\nexport default class SuperIntersectionObserver {\n private observing: Map>;\n private observingQueue: SuperIntersectionObserver['observing'];\n private observer: IntersectionObserver;\n private freezedObservingNew: boolean;\n\n constructor(init?: IntersectionObserverInit) {\n this.observing = new Map();\n this.observingQueue = new Map();\n this.freezedObservingNew = false;\n\n this.observer = new IntersectionObserver((entries) => {\n const observing = this.observing;\n for(let i = 0, length = entries.length; i < length; ++i) {\n const entry = entries[i];\n const callbacks = observing.get(entry.target);\n if(!callbacks) {\n console.error('intersection process no callbacks:', entry);\n debugger;\n continue;\n }\n\n for(const callback of callbacks) {\n try {\n callback(entry);\n } catch(err) {\n console.error('intersection process callback error:', err);\n }\n }\n }\n }, init);\n }\n\n public disconnect() {\n this.observing.clear();\n this.observingQueue.clear();\n this.observer.disconnect();\n }\n\n public toggleObservingNew(value: boolean) {\n if(this.freezedObservingNew === value) {\n return;\n }\n\n this.freezedObservingNew = value;\n\n const queue = this.observingQueue;\n if(!value && queue.size) {\n for(const [target, callbacks] of queue) {\n for(const callback of callbacks) {\n this.observe(target, callback);\n }\n }\n\n queue.clear();\n }\n }\n\n public has(target: IntersectionTarget, callback: IntersectionCallback, observing = this.observing) {\n const callbacks = observing.get(target);\n return !!(callbacks && callbacks.has(callback));\n }\n\n public observe(target: IntersectionTarget, callback: IntersectionCallback) {\n if(this.freezedObservingNew && this.has(target, callback)) {\n return;\n }\n\n const observing = this.freezedObservingNew ? this.observingQueue : this.observing;\n let callbacks = observing.get(target);\n if(callbacks && callbacks.has(callback)) {\n return;\n }\n\n if(!callbacks) {\n callbacks = new Set();\n observing.set(target, callbacks);\n\n if(observing === this.observing) {\n this.observer.observe(target);\n }\n }\n\n callbacks.add(callback);\n }\n\n public unobserve(target: IntersectionTarget, callback: IntersectionCallback) {\n const observing = this.freezedObservingNew && !this.has(target, callback) ? this.observingQueue : this.observing;\n const callbacks = observing.get(target);\n if(!callbacks) {\n return;\n }\n\n callbacks.delete(callback);\n if(!callbacks.size) {\n observing.delete(target);\n this.observer.unobserve(target);\n }\n }\n}\n","import type {MyDocument} from '../../appDocsManager';\nimport type {MyMessage} from '../../appMessagesManager';\nimport {Message, MessageMedia} from '../../../../layer';\n\nexport default function isMentionUnread(message: MyMessage) {\n if(!message) {\n return false;\n }\n\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n return !!(\n message.pFlags.media_unread &&\n message.pFlags.mentioned &&\n (\n !doc ||\n !(['voice', 'round'] as MyDocument['type'][]).includes(doc.type)\n )\n );\n}\n","export default function accumulate(arr: number[], initialValue: number) {\n return arr.reduce((acc, value) => acc + value, initialValue);\n}\n","function cacheCallback(callback: (str: A) => T) {\n const stringResults: any = {}, numberResults: any = {};\n return (value: A): T => {\n const key = '_' + value;\n return (typeof(value) === 'string' ? stringResults : numberResults)[key] ??= callback(value);\n };\n}\n\nexport default cacheCallback;\n","export default function replaceNonNumber(str: string) {\n return str.replace(/\\D/g, '');\n}\n","import cacheCallback from '../cacheCallback';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nconst CARD_BRAND_REGEXP: {[brand: string]: RegExp} = {\n visa: /^4/,\n mastercard: /^(51|52|53|54|55|222|23|24|25|26|27)/,\n amex: /^(34|37)/,\n discover: /^(60|64|65)/,\n diners: /^(30|38|39)/,\n diners14: /^(36)/,\n jcb: /^(35)/,\n unionpay: /^(62[0-6,8-9]|627[0-6,8-9]|6277[0-7,9]|62778[1-9]|81)/,\n elo: /^(5067|509|636368|627780)/,\n mir: /^(220[0-4])/\n};\n\n// * taken from Stripe\nexport const CARD_BRANDS: {[b: string]: {\n minLength: number,\n maxLength: number,\n cvcMaxLength: number,\n cvcMinLength: number | null\n}} = {\n visa: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n mastercard: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n amex: {\n minLength: 15,\n maxLength: 15,\n cvcMaxLength: 4,\n cvcMinLength: 3\n },\n unionpay: {\n minLength: 13,\n maxLength: 19,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n diners: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n diners14: {\n minLength: 14,\n maxLength: 14,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n discover: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n jcb: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n elo: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n mir: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n unknown: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 4,\n cvcMinLength: 3\n }\n};\n\nexport const detectCardBrand = cacheCallback((card: string = '') => {\n const keys = Object.keys(CARD_BRAND_REGEXP);\n const sanitizedCard = replaceNonNumber(card);\n let brand: string;\n let last = 0;\n keys.forEach((key) => {\n const regExp = CARD_BRAND_REGEXP[key];\n const match = sanitizedCard.match(regExp);\n if(match) {\n const result = match[0];\n if(result && result.length > last) {\n brand = key;\n last = result.length;\n }\n }\n });\n\n return brand || 'unknown';\n});\n\nexport function cardBrandToUnifiedBrand(brand: string) {\n return brand === 'diners14' ? 'diners' : brand;\n}\n\nexport function detectUnifiedCardBrand(card = '') {\n const brand = detectCardBrand(card);\n return cardBrandToUnifiedBrand(brand);\n}\n","export default function createArray(length: number, fill?: T1, map?: any): T1[] {\n const arr = new Array(length);\n arr.fill(fill);\n return map ? arr.map(map) : arr;\n}\n","const delta = '0'.charCodeAt(0) - '0'.charCodeAt(0);\nconst buggedRegExp = /[0-9]/g;\n\n// function hasBuggedNumbers(str: string) {\n// return !!str.match(a);\n// }\n\nfunction getDistanceFromBuggedToNormal(char: string) {\n return String.fromCharCode(char.charCodeAt(0) - delta);\n}\n\nexport function fixBuggedNumbers(str: string) {\n return str.replace(buggedRegExp, getDistanceFromBuggedToNormal);\n}\n","import {fixBuggedNumbers} from '../string/buggedNumbers';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nexport type PatternCharacter = {\n type: 'optional',\n result: string,\n consumed: number\n} | {\n type: 'required',\n result: string,\n consumed: number,\n partial?: boolean\n} | {\n type: 'formatting',\n result: string,\n consumed: number\n};\n\nexport type PatternFunction = (str: string) => ((str: string) => PatternCharacter)[];\n\nfunction makeOptionalCharacter(result: string, consumed: number): PatternCharacter {\n return {type: 'optional', result, consumed};\n}\n\nfunction makeRequiredCharacter(result: string, consumed: number, partial?: boolean): PatternCharacter {\n return {type: 'required', result, consumed, partial};\n}\n\nfunction makeFormattingCharacter(result: string, consumed: number): PatternCharacter {\n return {type: 'formatting', result, consumed};\n}\n\nfunction wrapCharacterRegExpFactory(regExp: RegExp, optional?: boolean) {\n return (str: string) => {\n const _regExp = new RegExp('^'.concat(regExp.source.replace(/^\\^/, '')));\n const match = str.match(_regExp);\n const makeCharacter = optional ? makeOptionalCharacter : makeRequiredCharacter;\n if(match) {\n const result = match[0];\n return makeCharacter(result, match.index + result.length);\n }\n\n return makeCharacter('', str.length);\n };\n}\n\nfunction makeCapitalPatternCharacter(str: string) {\n const char = wrapCharacterRegExpFactory(/\\w/)(str);\n return char.result ? makeRequiredCharacter(char.result.toUpperCase(), char.consumed) : char;\n}\n\nconst makeMonthDigitPatternCharacter = wrapCharacterRegExpFactory(/1[0-2]|0?[1-9]|0/);\n\nfunction digit(str: string) {\n return wrapCharacterRegExpFactory(/[0-9]/)(fixBuggedNumbers(str));\n}\n\nconst patternCharacters = {\n digit,\n capitalCharacter: makeCapitalPatternCharacter,\n month: (str: string) => {\n const char = makeMonthDigitPatternCharacter(fixBuggedNumbers(str));\n const cleanedResult = replaceNonNumber(char.result);\n const isPartial = ['0', '1'].includes(char.result) && str.length === 1;\n if(isPartial || (char.result === '0' && str.length >= 2)) {\n return makeRequiredCharacter(char.result, str.length, true);\n }\n\n return makeRequiredCharacter(cleanedResult.length === 1 ? '0' + cleanedResult : cleanedResult, char.consumed);\n },\n formattingCharacter: (str: string) => {\n return (str1: string) => {\n const consumed = str === str1[0] ? 1 : 0;\n return makeFormattingCharacter(str, consumed);\n }\n },\n optionalPattern: (regExp: RegExp) => {\n return (str: string) => {\n const char = wrapCharacterRegExpFactory(regExp, true)(str);\n return char.result ? char : makeOptionalCharacter('', 0);\n };\n }\n};\n\nexport default patternCharacters;\n","import {IS_ANDROID} from '../../environment/userAgent';\nimport createArray from '../array/createArray';\nimport cacheCallback from '../cacheCallback';\nimport replaceNonNumber from '../string/replaceNonNumber';\nimport {CARD_BRANDS, detectCardBrand} from './cardBrands';\nimport patternCharacters from './patternCharacters';\n\nconst digit = patternCharacters.digit;\nconst capitalCharacter = patternCharacters.capitalCharacter;\nconst spaceCharacter = patternCharacters.formattingCharacter(' ');\nconst yearOptionalPattern = patternCharacters.optionalPattern(/\\d\\d/);\nconst sixteenPattern = [digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit];\nconst fifteenPattern = [digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit];\n\nconst requiredPostcodes = new Set(['DZ', 'AR', 'AM', 'AU', 'AT', 'AZ', 'PT', 'BD', 'BY', 'BE', 'BA', 'BR', 'BN', 'BG', 'CA', 'IC', 'CN', 'CO', 'HR', 'CY', 'CZ', 'DK', 'EC', 'GB', 'EE', 'FO', 'FI', 'FR', 'GE', 'DE', 'GR', 'GL', 'GU', 'GG', 'NL', 'HU', 'IN', 'ID', 'IL', 'IT', 'JP', 'JE', 'KZ', 'KR', 'FM', 'KG', 'LV', 'LI', 'LT', 'LU', 'MK', 'MG', 'PT', 'MY', 'MH', 'MQ', 'YT', 'MX', 'MN', 'ME', 'NL', 'NZ', 'GB', 'NO', 'PK', 'PH', 'PL', 'FM', 'PT', 'PR', 'RE', 'RU', 'SA', 'SF', 'RS', 'SG', 'SK', 'SI', 'ZA', 'ES', 'LK', 'SX', 'VI', 'VI', 'SE', 'CH', 'TW', 'TJ', 'TH', 'TU', 'TN', 'TR', 'TM', 'VI', 'UA', 'GB', 'US', 'UY', 'UZ', 'VA', 'VN', 'GB', 'FM']);\n\nconst generateFourPattern = cacheCallback((length: number) => {\n const out: Array = [];\n\n for(let i = 0, k = 0; i < length;) {\n if(k === 4) {\n out.push(spaceCharacter);\n k = 0;\n } else {\n out.push(digit);\n ++i;\n ++k;\n }\n }\n\n return out;\n});\n\nfunction generateCardNumberPattern(card: string) {\n const brand = detectCardBrand(card);\n if(brand === 'amex') return sixteenPattern;\n if(brand === 'diners14') return fifteenPattern;\n const {minLength, maxLength} = CARD_BRANDS[brand];\n const s = replaceNonNumber(card).length;\n const d = Math.min(Math.max(minLength, s), maxLength);\n return generateFourPattern(d);\n}\n\nconst cardFormattingPatterns = {\n cardNumber: generateCardNumberPattern,\n cardExpiry: () => [patternCharacters.month, patternCharacters.formattingCharacter('/'), digit, digit, yearOptionalPattern],\n cardCvc: (card?: string) => cardFormattingPatterns.cardCvcFromBrand(detectCardBrand(card)),\n cardCvcFromBrand: cacheCallback((brand: string) => {\n const info = CARD_BRANDS[brand];\n const {cvcMinLength, cvcMaxLength} = info;\n const pattern = createArray(cvcMinLength || cvcMaxLength, digit);\n if(cvcMinLength && cvcMinLength < cvcMaxLength) {\n const i = cvcMaxLength - cvcMinLength;\n const h = patternCharacters.optionalPattern(/\\d/);\n if(i) {\n pattern.push(...createArray(i, h));\n }\n }\n\n return pattern;\n }),\n postalCodeFromCountry: cacheCallback((iso2: string) => {\n switch(iso2) {\n case 'US':\n return createArray(5, digit);\n case 'CA':\n return IS_ANDROID ? null : [capitalCharacter, capitalCharacter, capitalCharacter, spaceCharacter, capitalCharacter, capitalCharacter, capitalCharacter];\n default:\n const optionalDigits = createArray(10, patternCharacters.optionalPattern(/\\d/));\n if(requiredPostcodes.has(iso2)) {\n optionalDigits[0] = digit;\n }\n return optionalDigits;\n }\n })\n};\n\nexport default cardFormattingPatterns;\n","import accumulate from '../array/accumulate';\nimport {PatternFunction} from './patternCharacters';\n\nfunction accumulateLengths(strs: string[]) {\n return accumulate(strs.map((str) => str.length), 0);\n}\n\nfunction formatValueByPattern(\n getPattern: PatternFunction,\n value: string,\n options: Partial<{\n selectionStart: number,\n selectionEnd: number\n }> = {},\n pushRest?: boolean\n) {\n const pattern = getPattern(value);\n\n if(!pattern) {\n return {\n value: value,\n selection: null as typeof options,\n autocorrectComplete: !!value\n };\n }\n\n const length = pattern.length;\n const c: string[] = [];\n const s: string[] = [];\n\n let l = 0;\n let i = 0;\n let f = options.selectionStart === 0 ? 0 : null;\n let d = options.selectionEnd === 0 ? 0 : null;\n const p = () => {\n if(f === null && (i + 1) >= options.selectionStart) f = accumulateLengths(c) + (pushRest ? s.length : 0);\n if(d === null && (i + 1) >= options.selectionEnd) d = accumulateLengths(c) + (pushRest ? s.length : 0);\n };\n const m = (e: number) => {\n if(e > 0) {\n p();\n i += e;\n }\n };\n\n for(; l < length;) {\n const getCharacter = pattern[l];\n const character = getCharacter(value.slice(i));\n const {type, result, consumed} = character;\n if(type === 'required') {\n if(result) {\n c.push(...s, result);\n s.length = 0;\n ++l;\n\n if(character.partial) {\n m(value.length - i);\n break;\n }\n\n m(consumed);\n } else {\n if(!consumed) {\n break;\n }\n\n m(1);\n }\n } else if(type === 'optional') {\n if(result) {\n c.push(...s, result);\n s.length = 0;\n m(consumed);\n }\n\n ++l;\n } else if(type === 'formatting') {\n if(!pushRest && i >= value.length) {\n break;\n }\n\n s.push(result);\n ++l;\n m(consumed);\n }\n }\n\n if(pushRest) {\n c.push(...s);\n }\n\n return {\n value: c.join(''),\n selection: {\n selectionStart: f === null || value.length && options.selectionStart === value.length ? accumulateLengths(c) : f,\n selectionEnd: d === null || value.length && options.selectionEnd === value.length ? accumulateLengths(c) : d\n },\n autocorrectComplete: l === length\n };\n}\n\nexport default formatValueByPattern;\n","import {CARD_BRANDS, detectCardBrand} from './cardBrands';\nimport formatInputValueByPattern from './formatInputValueByPattern';\nimport NBSP from '../string/nbsp';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nexport type PatternValidationOptions = Partial<{\n ignoreIncomplete: boolean\n}>;\n\nconst nbspRegExp = new RegExp(NBSP, 'g');\n\nfunction makeValidationError(code?: string) {\n return code ? {\n type: 'invalid',\n code\n } : null;\n}\n\n// Luhn algorithm\nfunction validateCompleteCardNumber(card: string) {\n const t = '0'.charCodeAt(0);\n const n = card.length % 2;\n let a = 0;\n for(let i = card.length - 1; i >= 0; --i) {\n const c = n === (i % 2);\n let o = card.charCodeAt(i) - t;\n if(c) o *= 2;\n if(o > 9) o -= 9;\n a += o;\n }\n return !(a % 10);\n}\n\nfunction validateExpiry(year: number, month: number, options?: PatternValidationOptions) {\n const date = new Date(Date.now());\n const _year = year < 100 ? date.getFullYear() % 100 : date.getFullYear();\n const nextMonth = date.getMonth() + 1;\n\n if(isNaN(year) || isNaN(month)) {\n return options?.ignoreIncomplete ? null : 'incomplete';\n }\n\n if((year - _year) < 0) {\n return 'invalid_expiry_year_past';\n }\n\n if((year - _year) > 50) {\n return 'invalid_expiry_year';\n }\n\n return !(year - _year) && month < nextMonth ? 'invalid_expiry_month_past' : null;\n}\n\nfunction getCardInfoByNumber(card: string) {\n const sanitized = replaceNonNumber(card);\n const brand = detectCardBrand(card);\n return {\n sanitized,\n brand,\n minLength: CARD_BRANDS[brand].minLength\n };\n}\n\nfunction makeCardNumberError(str: string, length: number, ignoreIncomplete: boolean) {\n if(str.length >= length) {\n return validateCompleteCardNumber(str) || detectCardBrand(str) === 'mir' ? null : makeValidationError('invalid');\n }\n\n return ignoreIncomplete ? null : makeValidationError('incomplete');\n}\n\nexport function validateCardNumber(str: string, options: PatternValidationOptions = {}) {\n const {sanitized, minLength} = getCardInfoByNumber(str);\n return makeCardNumberError(sanitized, minLength, options.ignoreIncomplete);\n}\n\nexport function validateCardExpiry(str: string, options: PatternValidationOptions = {}) {\n const sanitized = str.replace(nbspRegExp, '').split(/ ?\\/ ?/);\n const [monthStr, yearStr = ''] = sanitized;\n const [month, year] = [monthStr, yearStr].map((str) => +str);\n const s = yearStr.length === 2 ? year % 100 : year;\n return yearStr.length < 2 || yearStr.length === 3 ? (options.ignoreIncomplete ? null : makeValidationError('incomplete')) : makeValidationError(validateExpiry(s, month, options));\n}\n\nexport function validateAnyIncomplete(formatted: ReturnType, str: string, options: PatternValidationOptions = {}) {\n return formatted.meta.autocorrectComplete || options.ignoreIncomplete ? null : makeValidationError('incomplete');\n}\n","const NBSP = '‎';\nexport default NBSP;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {TelegramWebViewEvent, TelegramWebViewEventCallback, TelegramWebViewEventMap} from '../types';\n\nconst weakMap: WeakMap = new WeakMap();\nwindow.addEventListener('message', (e) => {\n const callback = weakMap.get(e.source as Window);\n if(!callback) {\n return;\n }\n\n callback(JSON.parse(e.data));\n});\n\nexport default class TelegramWebView extends EventListenerBase<{\n [type in keyof TelegramWebViewEventMap]: (data: TelegramWebViewEventMap[type]) => void\n}> {\n public iframe: HTMLIFrameElement;\n\n constructor({url, sandbox}: {\n url: string,\n sandbox?: string\n }) {\n super(false);\n\n const iframe = this.iframe = document.createElement('iframe');\n iframe.src = url;\n if(sandbox) iframe.setAttribute('sandbox', sandbox);\n }\n\n public onMount() {\n weakMap.set(this.iframe.contentWindow, this.onTelegramWebViewEvent);\n }\n\n public destroy() {\n this.cleanup();\n weakMap.delete(this.iframe.contentWindow);\n }\n\n private onTelegramWebViewEvent = ({eventType, eventData}: TelegramWebViewEvent) => {\n if((eventData as any) === '') {\n eventData = undefined;\n }\n\n console.log('onTelegramWebViewEvent', eventType, eventData);\n this.dispatchEvent(eventType, eventData as any);\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport TelegramWebView from '../telegramWebView';\n\nexport function createVerificationIframe(options: ConstructorParameters[0]) {\n const result = new TelegramWebView({\n ...options,\n sandbox: 'allow-forms allow-scripts allow-same-origin allow-modals'\n });\n const {iframe} = result;\n iframe.allow = 'payment';\n iframe.classList.add('payment-verification');\n return result;\n}\n\nexport default class PopupPaymentVerification extends PopupElement<{\n finish: () => void\n}> {\n private telegramWebView: TelegramWebView;\n\n constructor(private url: string, private openPathAfter?: boolean) {\n super('popup-payment popup-payment-verification', {\n closable: true,\n overlayClosable: true,\n body: true,\n title: 'Checkout.WebConfirmation.Title'\n });\n\n this.d();\n }\n\n private d() {\n const telegramWebView = this.telegramWebView = createVerificationIframe({\n url: this.url\n });\n\n telegramWebView.addEventListener('web_app_open_tg_link', (e) => {\n this.dispatchEvent('finish');\n this.hide();\n if(this.openPathAfter) {\n appImManager.openUrl('https://t.me' + e.path_full);\n }\n });\n\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n\n protected destroy() {\n this.telegramWebView.destroy();\n return super.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport cardFormattingPatterns from '../../helpers/cards/cardFormattingPatterns';\nimport {detectUnifiedCardBrand} from '../../helpers/cards/cardBrands';\nimport formatInputValueByPattern from '../../helpers/cards/formatInputValueByPattern';\nimport {validateAnyIncomplete, validateCardExpiry, validateCardNumber} from '../../helpers/cards/validateCard';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport noop from '../../helpers/noop';\nimport {PaymentsPaymentForm} from '../../layer';\nimport {LangPackKey, _i18n} from '../../lib/langPack';\nimport CheckboxField from '../checkboxField';\nimport confirmationPopup from '../confirmationPopup';\nimport CountryInputField from '../countryInputField';\nimport InputField, {InputFieldOptions, InputState} from '../inputField';\nimport Row from '../row';\nimport {getPaymentBrandIconPath, PaymentButton, PaymentsCredentialsToken} from './payment';\nimport {createVerificationIframe} from './paymentVerification';\nimport {PasswordInputHelpers} from '../passwordInputField';\nimport SettingSection from '../settingSection';\nimport TelegramWebView from '../telegramWebView';\n\nexport type PaymentCardDetails = {\n cardNumber: string;\n cardholderName: string;\n expiryFull: string;\n expiryMonth: string;\n expiryYear: string;\n cvc: string;\n country: string;\n zip: string;\n save?: boolean;\n};\n\nexport type PaymentCardDetailsShort = {\n title: string,\n save?: boolean;\n icon?: string;\n};\n\nexport type PaymentCardDetailsResult = PaymentCardDetails | PaymentCardDetailsShort;\n\nexport class InputFieldCorrected extends InputField {\n private lastKeyDown: string;\n private lastTransformed: ReturnType;\n\n constructor(public options: InputFieldOptions & {\n formatMethod: typeof cardFormattingPatterns['cardNumber'],\n validateMethod?: typeof validateCardNumber,\n errorKeys?: {[code: string]: LangPackKey},\n optional?: boolean,\n onChange?: (transformed: InputFieldCorrected['lastTransformed']) => void,\n onKeyDown?: (e: KeyboardEvent) => void\n }) {\n super(options);\n\n // const handleIncomplete = (t?: any) => {\n // if(\n // (!lastTransformed.value && t) ||\n // lastTransformed.meta.autocorrectComplete ||\n // lastTransformed.meta.error ||\n // optional\n // ) {\n // return;\n // }\n\n\n // };\n\n this.input.addEventListener('keydown', this.onKeyDown);\n this.input.addEventListener('input', this.onInput);\n this.input.addEventListener('blur', this.onBlur);\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n this.lastKeyDown = e.key;\n this.options.onKeyDown?.(e);\n };\n\n private onInput = () => {\n const value = this.value;\n const deleting = this.lastKeyDown === 'Backspace' && (((this.lastTransformed && this.lastTransformed.value.length) || 0) - value.length) === 1;\n const result = this.lastTransformed = formatInputValueByPattern({\n value: value,\n getPattern: this.options.formatMethod,\n deleting,\n input: this.input\n });\n\n const transformedValue = result.value;\n if(transformedValue !== value) {\n this.setValueSilently(transformedValue);\n\n if(result.selection) {\n (this.input as HTMLInputElement).selectionStart = result.selection.selectionStart;\n (this.input as HTMLInputElement).selectionEnd = result.selection.selectionEnd;\n }\n }\n\n this.validateNew(transformedValue, {ignoreIncomplete: true/* !result.meta.autocorrectComplete */});\n\n this.options.onChange?.(result);\n };\n\n private onBlur = () => {\n const value = this.lastTransformed?.value;\n if(value) {\n this.validateNew(value);\n }\n };\n\n public update() {\n this.onInput();\n }\n\n public validate = () => {\n return this.validateNew();\n };\n\n public validateNew(\n value = this.lastTransformed?.value ?? '',\n t: any = {},\n justReturn?: boolean\n ) {\n let result: ReturnType;\n if(this.options.validateMethod) {\n result = this.options.validateMethod?.(value, t);\n } else {\n result = validateAnyIncomplete(this.lastTransformed, value, t);\n }\n\n if(result?.code) {\n const langPackKey: LangPackKey = this.options.errorKeys?.[result.code];\n !justReturn && this.setState(InputState.Error, langPackKey);\n return false;\n }\n\n !justReturn && this.setState(InputState.Neutral);\n return true;\n }\n}\n\nexport function handleInputFieldsOnChange(inputFields: (CountryInputField | InputField | InputFieldCorrected)[], _onChange: (valid: boolean) => void) {\n const onChange = () => {\n const valid = inputFields.every((inputField) => {\n return 'validateNew' in inputField ? inputField.validateNew(undefined, undefined, true) : inputField.isValid();\n });\n\n _onChange(valid);\n };\n\n inputFields.forEach((inputField) => {\n if(inputField instanceof InputFieldCorrected) {\n const original = inputField.options.onChange;\n inputField.options.onChange = (...args: any[]) => {\n // @ts-ignore\n original?.(...args);\n onChange();\n };\n\n if('update' in inputField) {\n inputField.update();\n }\n } else {\n inputField.input.addEventListener('input', onChange);\n }\n });\n\n return {validate: onChange};\n}\n\nexport function createCountryZipFields(country?: boolean, zip?: boolean) {\n let countryInputField: CountryInputField, postcodeInputField: InputFieldCorrected;\n if(country || zip) {\n if(country) countryInputField = new CountryInputField({\n noPhoneCodes: true,\n onCountryChange: () => {\n postcodeInputField?.update();\n },\n required: true,\n autocomplete: 'country'\n });\n if(zip) postcodeInputField = new InputFieldCorrected({\n label: 'PaymentShippingZipPlaceholder',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'postal-code',\n formatMethod: (/* ...args */) => {\n const {country} = countryInputField.getSelected();\n const iso2 = country?.iso2;\n return cardFormattingPatterns.postalCodeFromCountry(iso2 && iso2.toUpperCase());\n }\n });\n }\n\n return {countryInputField, postcodeInputField};\n}\n\nexport type PaymentsNativeProvider = 'stripe' | 'smartglocal';\nexport type PaymentsNativeParams = {\n need_country?: boolean,\n need_zip?: boolean,\n need_cardholder_name?: boolean,\n publishable_key?: string, // stripe\n public_token?: string, // smartglocal\n gpay_params: string,\n};\nconst SUPPORTED_NATIVE_PROVIDERS: Set = new Set(['stripe', 'smartglocal']);\n\nexport default class PopupPaymentCard extends PopupElement<{\n finish: (obj: {token: any, card: PaymentCardDetailsResult}) => void\n}> {\n protected telegramWebView: TelegramWebView;\n\n constructor(private paymentForm: PaymentsPaymentForm, private savedCard?: PaymentCardDetails) {\n super('popup-payment popup-payment-card', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: SUPPORTED_NATIVE_PROVIDERS.has(paymentForm.native_provider as PaymentsNativeProvider),\n title: 'PaymentCardInfo'\n });\n\n if(SUPPORTED_NATIVE_PROVIDERS.has(paymentForm.native_provider as PaymentsNativeProvider)) {\n this.d();\n } else {\n const telegramWebView = this.telegramWebView = createVerificationIframe({\n url: paymentForm.url\n });\n\n telegramWebView.addEventListener('payment_form_submit', (data) => {\n const cardOut = {title: data.title, save: false} as any as PaymentCardDetails;\n this.dispatchEvent('finish', {\n token: data.credentials,\n card: cardOut\n });\n\n this.hide();\n\n if(paymentForm.pFlags.can_save_credentials) {\n confirmationPopup({\n titleLangKey: 'PaymentCardSavePaymentInformation',\n descriptionLangKey: 'PaymentCardSavePaymentInformationInfoLine1',\n button: {\n langKey: 'Save'\n }\n }).then(() => {\n cardOut.save = true;\n }, noop);\n }\n });\n\n // putPreloader(this.body, true);\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n }\n\n protected destroy() {\n this.telegramWebView?.destroy();\n return super.destroy();\n }\n\n private d() {\n const savedCard = this.savedCard;\n const cardSection = new SettingSection({name: 'PaymentInfo.Card.Title', noDelimiter: true, noShadow: true});\n\n const nativeParams: PaymentsNativeParams = JSON.parse(this.paymentForm.native_params.data);\n\n let lastBrand: string, brandIconTempId = 0, lastBrandImg: HTMLImageElement;\n const setBrandIcon = (brand: string) => {\n if(lastBrand === brand) {\n return;\n }\n\n const tempId = ++brandIconTempId;\n lastBrand = brand;\n\n const path = getPaymentBrandIconPath(brand);\n if(!path) {\n if(lastBrandImg) {\n lastBrandImg.remove();\n lastBrandImg = undefined;\n }\n\n return;\n }\n\n const img = new Image();\n img.classList.add('input-field-icon');\n renderImageFromUrlPromise(img, path, false).then(() => {\n if(brandIconTempId !== tempId) {\n return;\n }\n\n if(lastBrandImg) {\n lastBrandImg.replaceWith(img);\n } else {\n cardInputField.container.append(img);\n }\n\n lastBrandImg = img;\n });\n };\n const cardInputField = new InputFieldCorrected({\n label: 'PaymentCardNumber',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-number',\n formatMethod: cardFormattingPatterns.cardNumber,\n validateMethod: validateCardNumber,\n errorKeys: {\n invalid: 'PaymentCard.Error.Invalid',\n incomplete: 'PaymentCard.Error.Incomplete'\n },\n onChange: (transformed) => {\n setBrandIcon(detectUnifiedCardBrand(transformed.value));\n cvcInputField.update(); // format cvc\n }\n });\n\n let nameInputField: InputField;\n if(nativeParams.need_cardholder_name) nameInputField = new InputField({\n label: 'Checkout.NewCard.CardholderNamePlaceholder',\n maxLength: 255,\n required: true,\n autocomplete: 'cc-name'\n });\n\n const expireInputField = new InputFieldCorrected({\n label: 'SecureId.Identity.Placeholder.ExpiryDate',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-exp',\n formatMethod: cardFormattingPatterns.cardExpiry,\n validateMethod: validateCardExpiry\n });\n\n // handle autocomplete: 01/2345 -> 01/45\n expireInputField.input.addEventListener('input', () => {\n let value = expireInputField.value;\n if(value.length < 5) {\n return;\n }\n\n const splitted = value.split('/');\n if(splitted[1].length !== 4) {\n return;\n }\n\n value = [splitted[0], splitted[1].slice(2)].join('/');\n expireInputField.setValueSilently(value);\n }, {capture: true});\n\n const cvcInputField = new InputFieldCorrected({\n labelText: 'CVC',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-csc',\n name: 'cvc',\n formatMethod: () => cardFormattingPatterns.cardCvc(cardInputField.value)\n // validateMethod: (...args) => _5AH3.a.cardCvc(cardInputField.value)(...args)\n });\n\n const passwordHelpers = new PasswordInputHelpers(cvcInputField.container, cvcInputField.input as HTMLInputElement);\n\n const switchFocusOrder: (InputFieldCorrected | InputField)[] = [\n cardInputField,\n expireInputField,\n cvcInputField,\n nameInputField\n ].filter(Boolean);\n switchFocusOrder.forEach((inputField) => {\n const onKeyDown = (e: KeyboardEvent) => {\n if(!inputField.value && e.key === 'Backspace') {\n const previousInputField = switchFocusOrder[switchFocusOrder.indexOf(inputField) - 1];\n if(previousInputField) {\n // previousInputField.value = previousInputField.value.slice(0, -1);\n placeCaretAtEnd(previousInputField.input, true);\n }\n }\n };\n\n if(inputField instanceof InputFieldCorrected) {\n inputField.options.onKeyDown = onKeyDown;\n\n const original = inputField.options.onChange;\n inputField.options.onChange = (transformed) => {\n original?.(transformed);\n\n if(document.activeElement === inputField.input && transformed.meta.autocorrectComplete) {\n for(let i = switchFocusOrder.indexOf(inputField), length = switchFocusOrder.length; i < length; ++i) {\n const nextInputField = switchFocusOrder[i];\n if(\n nextInputField instanceof InputFieldCorrected ?\n !nextInputField.validateNew(undefined, undefined, true) :\n !nextInputField.value\n ) {\n placeCaretAtEnd(nextInputField.input, true);\n break;\n }\n }\n }\n };\n } else {\n inputField.input.addEventListener('keydown', onKeyDown);\n }\n });\n\n const inputFieldsRow = document.createElement('div');\n inputFieldsRow.classList.add('input-fields-row');\n inputFieldsRow.append(expireInputField.container, cvcInputField.container);\n\n const form = document.createElement('form');\n form.append(...[\n cardInputField.container,\n inputFieldsRow,\n nameInputField?.container\n ].filter(Boolean))\n\n cardSection.content.append(form);\n\n let billingSection: SettingSection;\n // let saveCheckboxField: CheckboxField;\n const {countryInputField, postcodeInputField} = createCountryZipFields(nativeParams.need_country, nativeParams.need_zip);\n if(nativeParams.need_country || nativeParams.need_zip) {\n billingSection = new SettingSection({name: 'PaymentInfo.Billing.Title', noDelimiter: true, noShadow: true});\n\n // const inputFieldsRow2 = inputFieldsRow.cloneNode() as HTMLElement;\n // inputFieldsRow2.append(countryInputField.container, postcodeInputField.container);\n // billingSection.content.append(inputFieldsRow2);\n billingSection.content.append(...[countryInputField, postcodeInputField].filter(Boolean).map((i) => i.container));\n }\n\n const canSave = !!this.paymentForm.pFlags.can_save_credentials;\n const saveCheckboxField = new CheckboxField({\n text: 'PaymentCardSavePaymentInformation',\n checked: !!canSave\n });\n const saveRow = new Row({\n checkboxField: saveCheckboxField,\n subtitleLangKey: canSave ? 'PaymentCardSavePaymentInformationInfoLine1' : 'Checkout.2FA.Text'\n });\n\n if(!canSave) {\n saveRow.container.classList.add('is-disabled');\n }\n\n (billingSection || cardSection).content.append(saveRow.container);\n\n this.scrollable.append(...[cardSection, billingSection].filter(Boolean).map((s) => s.container));\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: async() => {\n const data: PaymentCardDetails = {\n cardNumber: cardInputField.value,\n expiryFull: expireInputField.value,\n expiryMonth: expireInputField.value.split('/')[0],\n expiryYear: expireInputField.value.split('/')[1],\n cvc: cvcInputField.value,\n\n cardholderName: nameInputField?.value,\n country: countryInputField?.value,\n zip: postcodeInputField?.value,\n\n save: saveCheckboxField?.checked\n };\n\n const nativeProvider: PaymentsNativeProvider = this.paymentForm.native_provider as any;\n let out: PaymentsCredentialsToken;\n if(nativeProvider === 'stripe') {\n const url = new URL('https://api.stripe.com/v1/tokens');\n url.search = new URLSearchParams({\n 'card[number]': data.cardNumber,\n 'card[exp_month]': data.expiryMonth,\n 'card[exp_year]': data.expiryYear,\n 'card[cvc]': data.cvc,\n 'card[address_zip]': data.zip,\n 'card[address_country]': data.country,\n 'card[name]': data.cardholderName\n }).toString();\n\n const response = await fetch(url.toString(), {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Authorization': `Bearer ${nativeParams.publishable_key}`\n }\n });\n\n out = await response.json();\n } else if(nativeProvider === 'smartglocal') {\n const params = {\n card: {\n number: data.cardNumber.replace(/[^\\d]+/g, ''),\n expiration_month: data.expiryMonth,\n expiration_year: data.expiryYear,\n security_code: data.cvc.replace(/[^\\d]+/g, '')\n }\n };\n\n const url = /* DEBUG_PAYMENT_SMART_GLOCAL */false ?\n 'https://tgb-playground.smart-glocal.com/cds/v1/tokenize/card' :\n 'https://tgb.smart-glocal.com/cds/v1/tokenize/card';\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'X-PUBLIC-TOKEN': nativeParams.public_token\n },\n body: JSON.stringify(params)\n });\n\n const json: { // smartglocal\n data: {\n info: {\n card_network: string,\n card_type: string,\n masked_card_number: string\n },\n token: string\n },\n status: 'ok'\n } = await response.json();\n\n out = {type: 'card', token: json.data.token}\n }\n\n this.dispatchEvent('finish', {token: out, card: data});\n this.hide();\n }\n });\n\n const inputFields = ([\n cardInputField,\n nameInputField,\n expireInputField,\n cvcInputField,\n countryInputField,\n postcodeInputField\n ] as const).filter(Boolean);\n handleInputFieldsOnChange(inputFields, (valid) => {\n payButton.disabled = !valid;\n // payButton.classList.toggle('btn-disabled', !valid);\n });\n\n if(savedCard) {\n cardInputField.value = savedCard.cardNumber;\n expireInputField.value = savedCard.expiryFull;\n cvcInputField.value = savedCard.cvc;\n nameInputField && (nameInputField.value = savedCard.cardholderName);\n countryInputField && (countryInputField.value = savedCard.country);\n postcodeInputField && (postcodeInputField.value = savedCard.zip);\n }\n\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.show();\n\n if(!cardInputField.validateNew(undefined, undefined, true)) {\n placeCaretAtEnd(cardInputField.input);\n }\n }\n}\n","import formatValueByPattern from './formatValueByPattern';\n\nexport default function formatInputValueByPattern(options: {\n value: string,\n getPattern: Parameters[0],\n deleting?: boolean,\n input?: HTMLElement\n}) {\n const {value: originalValue, getPattern, deleting, input} = options;\n const pushRest = !deleting && !!originalValue.length;\n const result = formatValueByPattern(getPattern, originalValue, {\n selectionStart: input ? (input as HTMLInputElement).selectionStart : 0,\n selectionEnd: input ? (input as HTMLInputElement).selectionEnd : 0\n }, pushRest)\n const {value, selection} = result;\n\n return {\n value,\n meta: {\n autocorrectComplete: result.autocorrectComplete,\n empty: !value\n },\n selection\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {AccountPassword, AccountTmpPassword} from '../../layer';\nimport {InputState} from '../inputField';\nimport PasswordInputField from '../passwordInputField';\nimport SettingSection from '../settingSection';\nimport {PaymentButton} from './payment';\n\nexport default class PopupPaymentCardConfirmation extends PopupElement<{\n finish: (tmpPassword: AccountTmpPassword) => void\n}> {\n constructor(card: string, passwordState: AccountPassword) {\n super('popup-payment popup-payment-card-confirmation', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'Checkout.PasswordEntry.Title'\n });\n\n const section = new SettingSection({noDelimiter: true, noShadow: true, caption: 'Checkout.PasswordEntry.Text', captionArgs: [card]});\n const passwordInputField = new PasswordInputField({labelText: passwordState.hint});\n section.content.append(passwordInputField.container);\n this.scrollable.append(section.container);\n\n const onInput = () => {\n payButton.disabled = !passwordInputField.value;\n passwordInputField.setState(InputState.Neutral);\n };\n\n passwordInputField.input.addEventListener('input', onInput);\n\n const payButton = PaymentButton({\n key: 'Checkout.PasswordEntry.Pay',\n onClick: async() => {\n try {\n const inputCheckPassword = await this.managers.passwordManager.getInputCheckPassword(passwordInputField.value, passwordState);\n const tmpPassword = await this.managers.apiManager.invokeApi('account.getTmpPassword', {\n password: inputCheckPassword,\n period: 60\n });\n\n this.dispatchEvent('finish', tmpPassword);\n this.hide();\n } catch(err) {\n if((err as ApiError).type === 'PASSWORD_HASH_INVALID') {\n (err as ApiError).handled = true;\n passwordInputField.setError('PASSWORD_HASH_INVALID');\n }\n\n throw err;\n }\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n onInput();\n\n this.show();\n\n placeCaretAtEnd(passwordInputField.input);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {InputInvoice, PaymentRequestedInfo, PaymentsPaymentForm, PaymentsValidatedRequestedInfo} from '../../layer';\nimport matchEmail from '../../lib/richTextProcessor/matchEmail';\nimport CheckboxField from '../checkboxField';\nimport CountryInputField from '../countryInputField';\nimport InputField from '../inputField';\nimport Row from '../row';\nimport SettingSection from '../settingSection';\nimport TelInputField from '../telInputField';\nimport {PaymentButton} from './payment';\nimport {createCountryZipFields, handleInputFieldsOnChange, InputFieldCorrected} from './paymentCard';\n\nexport type PaymentShippingAddress = PaymentRequestedInfo;\n\ntype ShippingFocusField = 'name' | 'email' | 'phone';\n\nexport default class PopupPaymentShipping extends PopupElement<{\n finish: (o: {shippingAddress: PaymentShippingAddress, requestedInfo: PaymentsValidatedRequestedInfo}) => void\n}> {\n constructor(\n private paymentForm: PaymentsPaymentForm,\n private inputInvoice: InputInvoice,\n private focus?: ShippingFocusField\n ) {\n super('popup-payment popup-payment-shipping', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'PaymentShippingInfo'\n });\n\n this.d();\n }\n\n private d() {\n const paymentForm = this.paymentForm;\n const invoice = paymentForm.invoice;\n const savedInfo = this.paymentForm.saved_info;\n\n let addressSection: SettingSection,\n address1InputField: InputField,\n address2InputField: InputField,\n cityInputField: InputField,\n stateInputField: InputField,\n countryInputField: CountryInputField,\n postcodeInputField: InputFieldCorrected;\n if(invoice.pFlags.shipping_address_requested) {\n addressSection = new SettingSection({name: 'PaymentShippingAddress', noDelimiter: true, noShadow: true});\n address1InputField = new InputField({label: 'PaymentShippingAddress1Placeholder', maxLength: 64, required: true});\n address2InputField = new InputField({label: 'PaymentShippingAddress2Placeholder', maxLength: 64});\n cityInputField = new InputField({label: 'PaymentShippingCityPlaceholder', maxLength: 64, required: true});\n stateInputField = new InputField({label: 'PaymentShippingStatePlaceholder', maxLength: 64});\n const res = createCountryZipFields(true, true);\n countryInputField = res.countryInputField;\n postcodeInputField = res.postcodeInputField;\n\n addressSection.content.append(...[\n address1InputField,\n address2InputField,\n cityInputField,\n stateInputField,\n countryInputField,\n postcodeInputField\n ].filter(Boolean).map((inputField) => inputField.container));\n }\n\n let receiverSection: SettingSection;\n let nameInputField: InputField, emailInputField: InputField, telInputField: TelInputField;\n if([invoice.pFlags.name_requested, invoice.pFlags.email_requested, invoice.pFlags.phone_requested].includes(true)) {\n receiverSection = new SettingSection({name: 'PaymentShippingReceiver', noDelimiter: true, noShadow: true});\n\n const validateEmail = () => {\n const value = emailInputField.value;\n const match = matchEmail(value);\n if(!match || match[0].length !== value.length) {\n return false;\n }\n\n return true;\n };\n\n const validatePhone = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n if(invoice.pFlags.name_requested) nameInputField = new InputField({label: 'PaymentShippingName', maxLength: 256, required: true});\n if(invoice.pFlags.email_requested) emailInputField = new InputField({label: 'PaymentShippingEmailPlaceholder', maxLength: 64, required: true, validate: validateEmail});\n if(invoice.pFlags.phone_requested) telInputField = new TelInputField({required: true, validate: validatePhone});\n\n receiverSection.content.append(...[\n nameInputField,\n emailInputField,\n telInputField\n ].filter(Boolean).map((inputField) => inputField.container));\n }\n\n const saveCheckboxField = new CheckboxField({\n text: 'PaymentShippingSave',\n checked: true\n });\n const saveRow = new Row({\n checkboxField: saveCheckboxField,\n subtitleLangKey: 'PaymentShippingSaveInfo'\n });\n\n (receiverSection || addressSection).content.append(saveRow.container);\n\n this.scrollable.append(...[addressSection, receiverSection].filter(Boolean).map((section) => section.container));\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: async() => {\n const selectedCountry = countryInputField && countryInputField.getSelected().country;\n const data: PaymentShippingAddress = {\n _: 'paymentRequestedInfo',\n shipping_address: selectedCountry && {\n _: 'postAddress',\n street_line1: address1InputField.value,\n street_line2: address2InputField.value,\n city: cityInputField.value,\n state: stateInputField.value,\n // country: countryInputField.value,\n country_iso2: selectedCountry?.iso2,\n post_code: postcodeInputField.value\n },\n name: nameInputField?.value,\n email: emailInputField?.value,\n phone: telInputField?.value\n };\n\n try {\n const requestedInfo = await this.managers.appPaymentsManager.validateRequestedInfo(this.inputInvoice, data, saveCheckboxField?.checked);\n\n this.dispatchEvent('finish', {\n shippingAddress: data,\n requestedInfo\n });\n\n this.hide();\n } catch(err: any) {\n const errorMap: {[err: string]: InputField} = {\n ADDRESS_STREET_LINE1_INVALID: address1InputField,\n ADDRESS_STREET_LINE2_INVALID: address2InputField,\n ADDRESS_COUNTRY_INVALID: countryInputField,\n ADDRESS_CITY_INVALID: cityInputField,\n ADDRESS_STATE_INVALID: stateInputField,\n ADDRESS_POSTCODE_INVALID: postcodeInputField,\n\n REQ_INFO_NAME_INVALID: nameInputField,\n REQ_INFO_EMAIL_INVALID: emailInputField,\n REQ_INFO_PHONE_INVALID: telInputField\n };\n\n const inputField = errorMap[(err as ApiError).type];\n if(inputField) {\n inputField.setError();\n (err as any).handled = true;\n }\n\n throw err;\n }\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n if(savedInfo) {\n const shippingAddress = savedInfo.shipping_address;\n if(shippingAddress) {\n address1InputField.value = shippingAddress.street_line1;\n address2InputField.value = shippingAddress.street_line2;\n cityInputField.value = shippingAddress.city;\n stateInputField.value = shippingAddress.state;\n countryInputField.selectCountryByIso2(shippingAddress.country_iso2);\n postcodeInputField.value = shippingAddress.post_code;\n }\n\n savedInfo.name && nameInputField && (nameInputField.value = savedInfo.name);\n savedInfo.email && emailInputField && (emailInputField.value = savedInfo.email);\n savedInfo.phone && telInputField && (telInputField.value = savedInfo.phone);\n }\n\n const {validate} = handleInputFieldsOnChange([\n address1InputField,\n address2InputField,\n cityInputField,\n stateInputField,\n countryInputField,\n postcodeInputField,\n nameInputField,\n emailInputField,\n telInputField\n ].filter(Boolean), (valid) => {\n payButton.disabled = !valid;\n });\n\n validate();\n\n this.show();\n\n let focusField: InputField;\n if(this.focus) {\n const focusMap: {[field in ShippingFocusField]?: InputField} = {\n name: nameInputField,\n email: emailInputField,\n phone: telInputField\n };\n\n focusField = focusMap[this.focus];\n } else {\n focusField = address1InputField;\n }\n\n if(focusField) {\n placeCaretAtEnd(focusField.input);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport accumulate from '../../helpers/array/accumulate';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport {PaymentsPaymentForm, PaymentsValidatedRequestedInfo, ShippingOption} from '../../layer';\nimport RadioField from '../radioField';\nimport Row, {RadioFormFromRows} from '../row';\nimport SettingSection from '../settingSection';\nimport {PaymentButton} from './payment';\n\nexport default class PopupPaymentShippingMethods extends PopupElement<{\n finish: (shippingOption: ShippingOption) => void\n}> {\n constructor(\n private paymentForm: PaymentsPaymentForm,\n private requestedInfo: PaymentsValidatedRequestedInfo,\n private shippingOption: ShippingOption\n ) {\n super('popup-payment popup-payment-shipping-methods', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'PaymentShippingMethod'\n });\n\n this.d();\n }\n\n private d() {\n const section = new SettingSection({name: 'PaymentCheckoutShippingMethod', noDelimiter: true, noShadow: true});\n\n const rows = this.requestedInfo.shipping_options.map((shippingOption) => {\n return new Row({\n radioField: new RadioField({\n text: shippingOption.title,\n name: 'shipping-method',\n value: shippingOption.id\n }),\n subtitle: paymentsWrapCurrencyAmount(\n accumulate(shippingOption.prices.map(({amount}) => +amount), 0),\n this.paymentForm.invoice.currency\n )\n });\n });\n\n let lastShippingId: string;\n const form = RadioFormFromRows(rows, (value) => {\n lastShippingId = value;\n });\n\n if(this.shippingOption) {\n rows.find((row) => row.radioField.input.value === this.shippingOption.id).radioField.checked = true;\n } else {\n rows[0].radioField.checked = true;\n }\n\n section.content.append(form);\n\n this.scrollable.append(section.container);\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: () => {\n this.dispatchEvent('finish', this.requestedInfo.shipping_options.find((option) => option.id === lastShippingId));\n this.hide();\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport Currencies from '../../config/currencies';\nimport {FontFamily, FontSize} from '../../config/font';\nimport accumulate from '../../helpers/array/accumulate';\nimport getTextWidth from '../../helpers/canvas/getTextWidth';\nimport {detectUnifiedCardBrand} from '../../helpers/cards/cardBrands';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport ScrollSaver from '../../helpers/scrollSaver';\nimport tsNow from '../../helpers/tsNow';\nimport {AccountTmpPassword, InputInvoice, InputPaymentCredentials, LabeledPrice, Message, MessageMedia, PaymentRequestedInfo, PaymentSavedCredentials, PaymentsPaymentForm, PaymentsPaymentReceipt, PaymentsValidatedRequestedInfo, PostAddress, ShippingOption} from '../../layer';\nimport I18n, {i18n, LangPackKey, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport Button from '../button';\nimport CheckboxField from '../checkboxField';\nimport PeerTitle from '../peerTitle';\nimport {putPreloader} from '../putPreloader';\nimport Row from '../row';\nimport {toastNew} from '../toast';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport wrapPhoto from '../wrappers/photo';\nimport PopupPaymentCard, {PaymentCardDetails, PaymentCardDetailsResult} from './paymentCard';\nimport PopupPaymentCardConfirmation from './paymentCardConfirmation';\nimport PopupPaymentShipping, {PaymentShippingAddress} from './paymentShipping';\nimport PopupPaymentShippingMethods from './paymentShippingMethods';\nimport PopupPaymentVerification from './paymentVerification';\n\nconst iconPath = 'assets/img/';\nconst icons = [\n 'amex',\n 'card',\n 'diners',\n 'discover',\n 'jcb',\n 'mastercard',\n 'visa',\n 'unionpay',\n 'mir',\n 'logo'\n];\n\nexport function getPaymentBrandIconPath(brand: string) {\n if(!icons.includes(brand)) {\n return;\n }\n\n return `${iconPath}${brand}.svg`;\n}\n\nexport function PaymentButton(options: {\n onClick: () => Promise | void,\n key?: LangPackKey,\n textEl?: I18n.IntlElement\n}) {\n const textEl = options.textEl ?? new I18n.IntlElement({key: options.key ?? 'PaymentInfo.Done'});\n const key = textEl.key;\n const payButton = Button('btn-primary btn-color-primary payment-item-pay');\n payButton.append(textEl.element);\n attachClickEvent(payButton, async() => {\n const result = options.onClick();\n if(!(result instanceof Promise)) {\n return;\n }\n\n const d = putPreloader(payButton);\n const toggle = toggleDisability([payButton], true);\n textEl.compareAndUpdate({key: 'PleaseWait'});\n try {\n await result;\n } catch(err) {\n if(!(err as any).handled) {\n console.error('payment button error', err);\n }\n\n toggle();\n textEl.compareAndUpdate({key});\n d.remove();\n }\n });\n return payButton;\n}\n\nexport type PaymentsCredentialsToken = {type: 'card', token?: string, id?: string};\n\nexport default class PopupPayment extends PopupElement {\n private tipButtonsMap: Map;\n\n constructor(\n private message: Message.message,\n private inputInvoice: InputInvoice,\n private paymentForm?: PaymentsPaymentForm | PaymentsPaymentReceipt,\n private isReceipt?: boolean\n ) {\n super('popup-payment', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: true\n });\n\n this.tipButtonsMap = new Map();\n this.d().catch((err) => {\n console.error('payment popup error', err);\n this.hide();\n });\n }\n\n private async d() {\n this.element.classList.add('is-loading');\n this.show();\n\n let confirmed = false;\n const onConfirmed = () => {\n if(confirmed) {\n return;\n }\n\n confirmed = true;\n if(popupPaymentVerification) {\n popupPaymentVerification.hide();\n }\n\n this.hide();\n };\n\n let {paymentForm, message} = this;\n\n if(message) {\n this.listenerSetter.add(rootScope)('payment_sent', ({peerId, mid}) => {\n if(message.peerId === peerId && message.mid === mid) {\n onConfirmed();\n }\n });\n }\n\n const mediaInvoice = message?.media as MessageMedia.messageMediaInvoice;\n const isReceipt = this.isReceipt ??\n (\n mediaInvoice ?\n !!mediaInvoice.receipt_msg_id || mediaInvoice.extended_media?._ === 'messageExtendedMedia' :\n paymentForm._ === 'payments.paymentReceipt'\n );\n const isTest = mediaInvoice ? mediaInvoice.pFlags.test : paymentForm.invoice.pFlags.test;\n\n const photo = mediaInvoice ? mediaInvoice.photo : paymentForm.photo;\n const title = mediaInvoice ? mediaInvoice.title : paymentForm.title;\n const description = mediaInvoice ? mediaInvoice.description : paymentForm.description;\n\n _i18n(this.title, isReceipt ? 'PaymentReceipt' : 'PaymentCheckout');\n if(isTest) {\n this.title.append(' (Test)');\n }\n\n const className = 'payment-item';\n\n const itemEl = document.createElement('div');\n itemEl.classList.add(className);\n\n const detailsClassName = className + '-details';\n const details = document.createElement('div');\n details.classList.add(detailsClassName);\n\n let photoEl: HTMLElement;\n if(photo) {\n photoEl = document.createElement('div');\n photoEl.classList.add(detailsClassName + '-photo', 'media-container-contain');\n wrapPhoto({\n photo: photo,\n container: photoEl,\n boxWidth: 100,\n boxHeight: 100,\n size: {_: 'photoSizeEmpty', type: ''}\n });\n details.append(photoEl);\n }\n\n const linesClassName = detailsClassName + '-lines';\n const linesEl = document.createElement('div');\n linesEl.classList.add(linesClassName);\n\n const titleEl = document.createElement('div');\n titleEl.classList.add(linesClassName + '-title');\n\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add(linesClassName + '-description');\n\n const botName = document.createElement('div');\n botName.classList.add(linesClassName + '-bot-name');\n\n linesEl.append(titleEl, descriptionEl, botName);\n\n setInnerHTML(titleEl, wrapEmojiText(title));\n setInnerHTML(descriptionEl, wrapEmojiText(description));\n\n const peerTitle = new PeerTitle();\n botName.append(peerTitle.element);\n\n details.append(linesEl);\n itemEl.append(details);\n this.scrollable.append(itemEl);\n\n const preloaderContainer = document.createElement('div');\n preloaderContainer.classList.add(className + '-preloader-container');\n const preloader = putPreloader(preloaderContainer, true);\n this.scrollable.container.append(preloaderContainer);\n\n const inputInvoice = this.inputInvoice;\n if(!paymentForm) {\n if(isReceipt) paymentForm = await this.managers.appPaymentsManager.getPaymentReceipt(message.peerId, mediaInvoice.receipt_msg_id || (inputInvoice as InputInvoice.inputInvoiceMessage).msg_id);\n else paymentForm = await this.managers.appPaymentsManager.getPaymentForm(inputInvoice);\n this.paymentForm = paymentForm;\n }\n\n let savedInfo = (paymentForm as PaymentsPaymentForm).saved_info || (paymentForm as PaymentsPaymentReceipt).info;\n const savedCredentials = (paymentForm as PaymentsPaymentForm).saved_credentials?.[0];\n let [lastRequestedInfo, passwordState, providerPeerTitle] = await Promise.all([\n !isReceipt && savedInfo && this.managers.appPaymentsManager.validateRequestedInfo(inputInvoice, savedInfo),\n savedCredentials && this.managers.passwordManager.getState(),\n wrapPeerTitle({peerId: paymentForm.provider_id.toPeerId()})\n ]);\n\n // console.log(paymentForm, lastRequestedInfo);\n\n await peerTitle.update({peerId: paymentForm.bot_id.toPeerId()});\n preloaderContainer.remove();\n this.element.classList.remove('is-loading');\n\n const wrapAmount = (amount: string | number, skipSymbol?: boolean) => {\n return paymentsWrapCurrencyAmount(amount, currency, skipSymbol);\n };\n\n const {invoice} = paymentForm;\n const currency = invoice.currency;\n\n const isRecurring = invoice.pFlags.recurring && !isReceipt;\n\n await peerTitle.update({peerId: paymentForm.bot_id.toPeerId()});\n const peerTitle2 = isRecurring ? await wrapPeerTitle({peerId: paymentForm.bot_id.toPeerId()}) : undefined;\n preloaderContainer.remove();\n this.element.classList.remove('is-loading');\n\n const makeLabel = () => {\n const labelEl = document.createElement('div');\n labelEl.classList.add(pricesClassName + '-price');\n\n const left = document.createElement('span');\n const right = document.createElement('span');\n labelEl.append(left, right);\n return {label: labelEl, left, right};\n };\n\n const pricesClassName = className + '-prices';\n const prices = document.createElement('div');\n prices.classList.add(pricesClassName);\n const makePricesElements = (prices: LabeledPrice[]) => {\n return prices.map((price) => {\n const {amount, label} = price;\n\n const _label = makeLabel();\n _label.left.textContent = label;\n\n const wrappedAmount = wrapAmount(amount);\n _label.right.textContent = wrappedAmount;\n\n return _label.label;\n });\n };\n\n const pricesElements = makePricesElements(invoice.prices);\n\n let getTipsAmount = (): number => 0;\n let shippingAmount = 0;\n\n const getTotalTotal = () => totalAmount + getTipsAmount() + shippingAmount;\n const setTotal = () => {\n const wrapped = wrapAmount(getTotalTotal());\n totalLabel.right.textContent = wrapped;\n payI18n.compareAndUpdate({\n key: 'PaymentCheckoutPay',\n args: [wrapped]\n });\n };\n\n const payI18n = new I18n.IntlElement();\n\n const totalLabel = makeLabel();\n totalLabel.label.classList.add('is-total');\n _i18n(totalLabel.left, 'PaymentTransactionTotal');\n const totalAmount = accumulate(invoice.prices.map(({amount}) => +amount), 0);\n\n const canTip = (invoice.max_tip_amount !== undefined && !isReceipt) || !!(paymentForm as PaymentsPaymentReceipt).tip_amount;\n if(canTip) {\n const tipsClassName = className + '-tips';\n\n const currencyData = Currencies[currency];\n\n getTipsAmount = () => +getInputValue().replace(/\\D/g, '');\n\n const getInputValue = () => {\n // return input.textContent;\n return input.value;\n };\n\n const setInputWidth = () => {\n const width = getTextWidth(getInputValue(), `500 ${FontSize} ${FontFamily}`);\n input.style.width = width + 'px';\n };\n\n const setInputValue = (amount: string | number) => {\n amount = Math.min(+amount, +invoice.max_tip_amount);\n const wrapped = wrapAmount(amount, true);\n\n input.value = wrapped;\n // input.textContent = wrapped;\n if(document.activeElement === input) {\n placeCaretAtEnd(input);\n }\n\n unsetActiveTip && unsetActiveTip();\n const tipEl = this.tipButtonsMap.get(amount);\n if(tipEl) {\n tipEl.classList.add('active');\n }\n\n setInputWidth();\n setTotal();\n };\n\n const tipsLabel = makeLabel();\n _i18n(tipsLabel.left, isReceipt ? 'PaymentTip' : 'PaymentTipOptional');\n const input = document.createElement('input');\n input.type = 'tel';\n // const input: HTMLElement = document.createElement('div');\n // input.contentEditable = 'true';\n input.classList.add('input-clear', tipsClassName + '-input');\n tipsLabel.right.append(input);\n\n if(!isReceipt) {\n tipsLabel.label.style.cursor = 'text';\n } else {\n tipsLabel.label.classList.add('disable-hover');\n }\n\n tipsLabel.label.addEventListener('mousedown', (e) => {\n if(!findUpAsChild(e.target as HTMLElement, input)) {\n placeCaretAtEnd(input);\n }\n });\n\n const haveToIgnoreEvents = input instanceof HTMLInputElement ? 1 : 2;\n const onSelectionChange = () => {\n if(ignoreNextSelectionChange) {\n --ignoreNextSelectionChange;\n return;\n }\n\n // setTimeout(() => {\n ignoreNextSelectionChange = haveToIgnoreEvents;\n placeCaretAtEnd(input);\n // }, 0);\n };\n\n const onFocus = () => {\n // cancelEvent(e);\n setTimeout(() => {\n ignoreNextSelectionChange = haveToIgnoreEvents;\n placeCaretAtEnd(input);\n document.addEventListener('selectionchange', onSelectionChange);\n }, 0);\n };\n\n const onFocusOut = () => {\n input.addEventListener('focus', onFocus, {once: true});\n document.removeEventListener('selectionchange', onSelectionChange);\n };\n\n let ignoreNextSelectionChange: number;\n input.addEventListener('focusout', onFocusOut);\n onFocusOut();\n\n input.addEventListener('input', () => {\n setInputValue(getTipsAmount());\n });\n\n const s = [currencyData.symbol, currencyData.space_between ? ' ' : ''];\n if(!currencyData.symbol_left) s.reverse();\n tipsLabel.right[currencyData.symbol_left ? 'prepend' : 'append'](s.join(''));\n\n pricesElements.push(tipsLabel.label);\n\n //\n let unsetActiveTip: () => void;\n if(!isReceipt) {\n const tipsEl = document.createElement('div');\n tipsEl.classList.add(tipsClassName);\n\n const tipClassName = tipsClassName + '-tip';\n const tipButtons = invoice.suggested_tip_amounts.map((tipAmount) => {\n const button = Button(tipClassName, {noRipple: true});\n button.textContent = wrapAmount(tipAmount);\n\n this.tipButtonsMap.set(+tipAmount, button);\n return button;\n });\n\n unsetActiveTip = () => {\n const prevTipEl = tipsEl.querySelector('.active');\n if(prevTipEl) {\n prevTipEl.classList.remove('active');\n }\n };\n\n attachClickEvent(tipsEl, (e) => {\n const tipEl = findUpClassName(e.target, tipClassName);\n if(!tipEl) {\n return;\n }\n\n let tipAmount = 0;\n if(tipEl.classList.contains('active')) {\n tipEl.classList.remove('active');\n } else {\n unsetActiveTip();\n tipEl.classList.add('active');\n\n for(const [amount, el] of this.tipButtonsMap) {\n if(el === tipEl) {\n tipAmount = amount;\n break;\n }\n }\n }\n\n setInputValue(tipAmount);\n });\n\n setInputValue(0);\n\n tipsEl.append(...tipButtons);\n pricesElements.push(tipsEl);\n } else {\n setInputValue((paymentForm as PaymentsPaymentReceipt).tip_amount);\n }\n } else {\n setTotal();\n }\n\n pricesElements.push(totalLabel.label);\n\n prices.append(...pricesElements);\n itemEl.append(prices);\n\n // /\n\n const setRowIcon = async(row: Row, icon?: string) => {\n const img = document.createElement('img');\n img.classList.add('media-photo');\n await renderImageFromUrlPromise(img, getPaymentBrandIconPath(icon));\n let container = row.media;\n if(!container) {\n container = row.createMedia('small');\n container.classList.add('media-container-cover');\n container.append(img);\n } else {\n replaceContent(container, img);\n }\n\n row.container.classList.remove('row-with-icon');\n };\n\n const createRow = (options: ConstructorParameters[0]) => {\n if(options.titleLangKey) {\n options.subtitleLangKey = options.titleLangKey;\n }\n\n options.noWrap = true;\n const row = new Row(options);\n row.container.classList.add(className + '-row');\n\n if(options.titleLangKey) {\n row.subtitle.classList.add('hide');\n }\n\n return row;\n };\n\n const setRowTitle = (row: Row, textContent: string) => {\n row.title.textContent = textContent;\n if(!textContent) {\n const e = I18n.weakMap.get(row.subtitle.firstElementChild as HTMLElement) as I18n.IntlElement;\n row.title.append(i18n(e.key));\n }\n\n row.subtitle.classList.toggle('hide', !textContent);\n };\n\n const setCardSubtitle = (card: PaymentCardDetailsResult) => {\n let brand: string;\n let str: string;\n let icon: string;\n if('title' in card) {\n brand = card.title.split(' ').shift();\n str = card.title;\n icon = card.icon;\n } else {\n brand = detectUnifiedCardBrand(card.cardNumber);\n str = brand + ' *' + card.cardNumber.split(' ').pop();\n }\n\n methodRow.title.classList.remove('tgico', 'tgico-card_outline');\n setRowIcon(methodRow, icon || brand.toLowerCase());\n setRowTitle(methodRow, str);\n };\n\n const onMethodClick = () => {\n new PopupPaymentCard(paymentForm as PaymentsPaymentForm, previousCardDetails as PaymentCardDetails).addEventListener('finish', ({token, card}) => {\n previousToken = token, previousCardDetails = card;\n\n setCardSubtitle(card);\n });\n };\n\n let previousCardDetails: PaymentCardDetailsResult, previousToken: PaymentsCredentialsToken;\n const methodRow = createRow({\n titleLangKey: 'PaymentCheckoutMethod',\n clickable: isReceipt ? undefined : onMethodClick,\n icon: 'card_outline'\n });\n\n methodRow.container.classList.add(className + '-method-row');\n\n if(savedCredentials) {\n setCardSubtitle(savedCredentials);\n } else if((paymentForm as PaymentsPaymentReceipt).credentials_title) {\n setCardSubtitle({title: (paymentForm as PaymentsPaymentReceipt).credentials_title});\n }\n\n const providerRow = createRow({\n title: providerPeerTitle,\n subtitleLangKey: 'PaymentCheckoutProvider'\n });\n\n const providerAvatar = new AvatarElement();\n providerAvatar.classList.add('avatar-32');\n providerRow.createMedia('small').append(providerAvatar);\n /* await */ providerAvatar.updateWithOptions({peerId: paymentForm.provider_id.toPeerId()});\n\n let shippingAddressRow: Row, shippingNameRow: Row, shippingEmailRow: Row, shippingPhoneRow: Row, shippingMethodRow: Row;\n let lastShippingOption: ShippingOption, onShippingAddressClick: (focus?: ConstructorParameters[2]) => void, onShippingMethodClick: () => void;\n const setShippingTitle = invoice.pFlags.shipping_address_requested ? (shippingAddress?: PaymentShippingAddress) => {\n if(!shippingAddress) {\n shippingMethodRow.subtitle.classList.add('hide');\n replaceContent(shippingMethodRow.title, i18n('PaymentShippingAddress'));\n return;\n }\n\n const postAddress = shippingAddress.shipping_address;\n setRowTitle(shippingAddressRow, [postAddress.city, postAddress.street_line1, postAddress.street_line2].filter(Boolean).join(', '));\n\n shippingMethodRow.container.classList.toggle('hide', !lastRequestedInfo && !isReceipt);\n } : undefined;\n\n const setShippingInfo = (info: PaymentRequestedInfo) => {\n setShippingTitle && setShippingTitle(info);\n shippingNameRow && setRowTitle(shippingNameRow, info.name);\n shippingEmailRow && setRowTitle(shippingEmailRow, info.email);\n shippingPhoneRow && setRowTitle(shippingPhoneRow, info.phone && ('+' + formatPhoneNumber(info.phone).formatted));\n };\n\n if(!isReceipt) {\n onShippingAddressClick = (focus) => {\n new PopupPaymentShipping(paymentForm as PaymentsPaymentForm, inputInvoice, focus).addEventListener('finish', ({shippingAddress, requestedInfo}) => {\n lastRequestedInfo = requestedInfo;\n savedInfo = (paymentForm as PaymentsPaymentForm).saved_info = shippingAddress;\n setShippingInfo(shippingAddress);\n });\n };\n }\n\n if(invoice.pFlags.shipping_address_requested) {\n const setShippingOption = (shippingOption?: ShippingOption) => {\n const scrollSaver = new ScrollSaver(this.scrollable, undefined, true);\n scrollSaver.save();\n if(lastShippingPricesElements) {\n lastShippingPricesElements.forEach((node) => node.remove());\n }\n\n if(!shippingOption) {\n shippingAmount = 0;\n\n setTotal();\n scrollSaver.restore();\n this.onContentUpdate();\n return;\n }\n\n lastShippingOption = shippingOption;\n setRowTitle(shippingMethodRow, shippingOption.title);\n\n shippingAmount = accumulate(shippingOption.prices.map(({amount}) => +amount), 0);\n lastShippingPricesElements = makePricesElements(shippingOption.prices);\n let l = totalLabel.label;\n if(canTip) {\n l = l.previousElementSibling as any;\n if(!isReceipt) {\n l = l.previousElementSibling as any;\n }\n }\n\n lastShippingPricesElements.forEach((element) => l.parentElement.insertBefore(element, l));\n\n setTotal();\n scrollSaver.restore();\n this.onContentUpdate();\n };\n\n shippingAddressRow = createRow({\n icon: 'location',\n titleLangKey: 'PaymentShippingAddress',\n clickable: !isReceipt && onShippingAddressClick.bind(null, undefined)\n });\n\n let lastShippingPricesElements: HTMLElement[];\n shippingMethodRow = createRow({\n icon: 'shipping',\n titleLangKey: 'PaymentCheckoutShippingMethod',\n clickable: !isReceipt && (onShippingMethodClick = () => {\n new PopupPaymentShippingMethods(paymentForm as PaymentsPaymentForm, lastRequestedInfo, lastShippingOption).addEventListener('finish', (shippingOption) => {\n setShippingOption(shippingOption);\n });\n })\n });\n\n shippingMethodRow.container.classList.add('hide');\n\n const shippingOption = (paymentForm as PaymentsPaymentReceipt).shipping;\n if(shippingOption) {\n setShippingOption(shippingOption);\n }\n }\n\n if(invoice.pFlags.name_requested) {\n shippingNameRow = createRow({\n icon: 'newprivate',\n titleLangKey: 'PaymentCheckoutName',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'name')\n });\n }\n\n if(invoice.pFlags.email_requested) {\n shippingEmailRow = createRow({\n icon: 'mention',\n titleLangKey: 'PaymentShippingEmailPlaceholder',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'email')\n });\n }\n\n if(invoice.pFlags.phone_requested) {\n shippingPhoneRow = createRow({\n icon: 'phone',\n titleLangKey: 'PaymentCheckoutPhoneNumber',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'phone')\n });\n }\n\n if(savedInfo) {\n setShippingInfo(savedInfo);\n }\n\n const rows = [\n methodRow,\n providerRow,\n shippingAddressRow,\n shippingMethodRow,\n shippingNameRow,\n shippingEmailRow,\n shippingPhoneRow\n ].filter(Boolean);\n\n const acceptTermsCheckboxField = isRecurring && new CheckboxField({\n text: 'Payments.Recurrent.Accept',\n textArgs: [wrapRichText(invoice.recurring_terms_url), peerTitle2]\n });\n\n const acceptTermsRow = isRecurring && createRow({\n checkboxField: acceptTermsCheckboxField\n });\n\n const recurringElements = isRecurring ? [document.createElement('hr'), acceptTermsRow.container] : [];\n\n this.scrollable.append(...[\n document.createElement('hr'),\n ...rows.map((row) => row.container),\n ...recurringElements\n ].filter(Boolean));\n\n // /\n let popupPaymentVerification: PopupPaymentVerification, lastTmpPasword: AccountTmpPassword;\n const onClick = () => {\n const missingInfo = invoice.pFlags.name_requested && !savedInfo?.name ? 'name' : (invoice.pFlags.email_requested && !savedInfo?.email ? 'email' : (invoice.pFlags.phone_requested && !savedInfo?.phone ? 'phone' : undefined));\n if(invoice.pFlags.shipping_address_requested) {\n if(!lastRequestedInfo) {\n onShippingAddressClick();\n return;\n } else if(!lastShippingOption) {\n onShippingMethodClick();\n return;\n }\n } else if(missingInfo) {\n onShippingAddressClick(missingInfo);\n return;\n }\n\n if(!previousCardDetails && !lastTmpPasword) {\n if(!savedCredentials) {\n onMethodClick();\n return;\n }\n\n Promise.resolve(passwordState ?? this.managers.passwordManager.getState()).then((_passwordState) => {\n new PopupPaymentCardConfirmation(savedCredentials.title, _passwordState).addEventListener('finish', (tmpPassword) => {\n passwordState = undefined;\n lastTmpPasword = tmpPassword;\n simulateClickEvent(payButton);\n\n // * reserve 5 seconds\n const diff = tmpPassword.valid_until - tsNow(true) - 5;\n setTimeout(() => {\n if(lastTmpPasword === tmpPassword) {\n lastTmpPasword = undefined;\n }\n }, diff * 1000);\n });\n });\n\n return;\n }\n\n return Promise.resolve().then(async() => {\n const credentials: InputPaymentCredentials = lastTmpPasword ? {\n _: 'inputPaymentCredentialsSaved',\n id: savedCredentials.id,\n tmp_password: lastTmpPasword.tmp_password\n } : {\n _: 'inputPaymentCredentials',\n data: {\n _: 'dataJSON',\n data: JSON.stringify(previousToken.token ? previousToken : {type: previousToken.type, id: previousToken.id})\n },\n pFlags: {\n save: previousCardDetails.save || undefined\n }\n };\n\n try {\n const paymentResult = await this.managers.appPaymentsManager.sendPaymentForm(\n inputInvoice,\n (paymentForm as PaymentsPaymentForm).form_id,\n lastRequestedInfo?.id,\n lastShippingOption?.id,\n credentials,\n getTipsAmount()\n );\n\n if(paymentResult._ === 'payments.paymentResult') {\n onConfirmed();\n } else {\n popupPaymentVerification = new PopupPaymentVerification(paymentResult.url, !mediaInvoice.extended_media);\n popupPaymentVerification.addEventListener('finish', () => {\n popupPaymentVerification = undefined;\n\n onConfirmed();\n });\n await new Promise((resolve, reject) => {\n popupPaymentVerification.addEventListener('close', () => {\n popupPaymentVerification = undefined;\n if(confirmed) {\n resolve();\n } else {\n const err = new Error('payment not finished');\n (err as ApiError).handled = true;\n reject(err);\n }\n });\n });\n }\n } catch(err) {\n if((err as ApiError).type === 'BOT_PRECHECKOUT_TIMEOUT') {\n toastNew({langPackKey: 'Error.AnError'});\n (err as ApiError).handled = true;\n } else if((err as ApiError).type === 'TMP_PASSWORD_INVALID') {\n passwordState = lastTmpPasword = undefined;\n simulateClickEvent(payButton);\n (err as ApiError).handled = true;\n }\n\n throw err;\n }\n });\n };\n\n const onChange = () => {\n payButton.disabled = !!(acceptTermsCheckboxField && !acceptTermsCheckboxField.checked);\n };\n\n let payButton: HTMLButtonElement;\n if(isReceipt) {\n payButton = PaymentButton({\n onClick: () => this.hide(),\n key: 'Done'\n });\n } else {\n payButton = PaymentButton({\n onClick: onClick,\n textEl: payI18n\n });\n }\n\n onChange();\n if(acceptTermsCheckboxField) {\n acceptTermsCheckboxField.input.addEventListener('change', onChange);\n }\n\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.onContentUpdate();\n }\n}\n","/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\nFor license and copyright information please follow this link:\nhttps://github.com/telegramdesktop/tdesktop/blob/master/LEGAL\n*/\n\nimport accumulate from '../helpers/array/accumulate';\nimport clamp from '../helpers/number/clamp';\n\ntype Size = {w: number, h: number};\nexport type GroupMediaLayout = {\n geometry: {\n x: number,\n y: number,\n width: number,\n height: number\n },\n sides: number\n};\ntype Attempt = {\n lineCounts: number[],\n heights: number[]\n};\nexport const RectPart = {\n None: 0,\n Top: 1,\n Right: 2,\n Bottom: 4,\n Left: 8\n};\n\n// https://github.com/telegramdesktop/tdesktop/blob/4669c07dc5335cbf4795bbbe5b0ab7c007b9aee2/Telegram/SourceFiles/ui/grouped_layout.cpp\nexport class Layouter {\n private count: number;\n private ratios: number[];\n private proportions: string;\n private averageRatio: number;\n private maxSizeRatio: number;\n\n constructor(private sizes: Size[], private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth) {\n this.count = sizes.length;\n this.ratios = Layouter.countRatios(sizes);\n this.proportions = Layouter.countProportions(this.ratios);\n this.averageRatio = accumulate(this.ratios, 1) / this.count; // warn\n this.maxSizeRatio = maxWidth / this.maxHeight;\n }\n\n public layout(): GroupMediaLayout[] {\n if(!this.count) return [];\n // else if(this.count === 1) return this.layoutOne();\n\n if(this.count >= 5 || this.ratios.find((r) => r > 2)) {\n return new ComplexLayouter(this.ratios, this.averageRatio, this.maxWidth, this.minWidth, this.spacing).layout();\n }\n\n if(this.count === 2) return this.layoutTwo();\n else if(this.count === 3) return this.layoutThree();\n return this.layoutFour();\n }\n\n private layoutTwo(): ReturnType {\n if((this.proportions === 'ww') &&\n (this.averageRatio > 1.4 * this.maxSizeRatio) &&\n (this.ratios[1] - this.ratios[0] < 0.2)) {\n return this.layoutTwoTopBottom();\n } else if(this.proportions === 'ww' || this.proportions === 'qq') {\n return this.layoutTwoLeftRightEqual();\n }\n return this.layoutTwoLeftRight();\n }\n\n private layoutThree(): ReturnType {\n // console.log('layoutThree:', this);\n if(this.proportions[0] === 'n') {\n return this.layoutThreeLeftAndOther();\n }\n return this.layoutThreeTopAndOther();\n }\n\n private layoutFour(): ReturnType {\n if(this.proportions[0] === 'w') {\n return this.layoutFourTopAndOther();\n }\n return this.layoutFourLeftAndOther();\n }\n\n private layoutTwoTopBottom(): ReturnType {\n const width = this.maxWidth;\n const height = Math.round(Math.min(\n width / this.ratios[0],\n Math.min(\n width / this.ratios[1],\n (this.maxHeight - this.spacing) / 2)));\n\n return [\n {\n geometry: {x: 0, y: 0, width, height},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: height + this.spacing, width, height},\n sides: RectPart.Left | RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutTwoLeftRightEqual(): ReturnType {\n const width = (this.maxWidth - this.spacing) / 2;\n const height = Math.round(Math.min(\n width / this.ratios[0],\n Math.min(width / this.ratios[1], this.maxHeight * 1)));\n\n return [\n {\n geometry: {x: 0, y: 0, width, height},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: width + this.spacing, y: 0, width, height},\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutTwoLeftRight(): ReturnType {\n const minimalWidth = Math.round(this.minWidth * 1.5);\n const secondWidth = Math.min(\n Math.round(Math.max(\n 0.4 * (this.maxWidth - this.spacing),\n (this.maxWidth - this.spacing) / this.ratios[0] /\n (1 / this.ratios[0] + 1 / this.ratios[1]))),\n this.maxWidth - this.spacing - minimalWidth);\n const firstWidth = this.maxWidth -\n secondWidth -\n this.spacing;\n const height = Math.min(\n this.maxHeight,\n Math.round(Math.min(\n firstWidth / this.ratios[0],\n secondWidth / this.ratios[1])));\n\n return [\n {\n geometry: {x: 0, y: 0, width: firstWidth, height},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: firstWidth + this.spacing, y: 0, width: secondWidth, height},\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutThreeLeftAndOther(): ReturnType {\n const firstHeight = this.maxHeight;\n const thirdHeight = Math.round(Math.min(\n (this.maxHeight - this.spacing) / 2.,\n (this.ratios[1] * (this.maxWidth - this.spacing) /\n (this.ratios[2] + this.ratios[1]))));\n const secondHeight = firstHeight -\n thirdHeight -\n this.spacing;\n const rightWidth = Math.max(\n this.minWidth,\n Math.round(Math.min(\n (this.maxWidth - this.spacing) / 2.,\n Math.min(\n thirdHeight * this.ratios[2],\n secondHeight * this.ratios[1]))));\n const leftWidth = Math.min(\n Math.round(firstHeight * this.ratios[0]),\n this.maxWidth - this.spacing - rightWidth);\n\n return [\n {\n geometry: {x: 0, y: 0, width: leftWidth, height: firstHeight},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: leftWidth + this.spacing, y: 0, width: rightWidth, height: secondHeight},\n sides: RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: leftWidth + this.spacing, y: secondHeight + this.spacing, width: rightWidth, height: thirdHeight},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutThreeTopAndOther(): ReturnType {\n const firstWidth = this.maxWidth;\n const firstHeight = Math.round(Math.min(\n firstWidth / this.ratios[0],\n (this.maxHeight - this.spacing) * 0.66));\n const secondWidth = (this.maxWidth - this.spacing) / 2;\n const secondHeight = Math.min(\n this.maxHeight - firstHeight - this.spacing,\n Math.round(Math.min(\n secondWidth / this.ratios[1],\n secondWidth / this.ratios[2])));\n const thirdWidth = firstWidth - secondWidth - this.spacing;\n\n return [\n {\n geometry: {x: 0, y: 0, width: firstWidth, height: firstHeight},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: firstHeight + this.spacing, width: secondWidth, height: secondHeight},\n sides: RectPart.Bottom | RectPart.Left\n },\n {\n geometry: {x: secondWidth + this.spacing, y: firstHeight + this.spacing, width: thirdWidth, height: secondHeight},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutFourTopAndOther(): ReturnType {\n const w = this.maxWidth;\n const h0 = Math.round(Math.min(\n w / this.ratios[0],\n (this.maxHeight - this.spacing) * 0.66));\n const h = Math.round(\n (this.maxWidth - 2 * this.spacing) /\n (this.ratios[1] + this.ratios[2] + this.ratios[3]));\n const w0 = Math.max(\n this.minWidth,\n Math.round(Math.min(\n (this.maxWidth - 2 * this.spacing) * 0.4,\n h * this.ratios[1])));\n const w2 = Math.round(Math.max(\n Math.max(\n this.minWidth * 1.,\n (this.maxWidth - 2 * this.spacing) * 0.33),\n h * this.ratios[3]));\n const w1 = w - w0 - w2 - 2 * this.spacing;\n const h1 = Math.min(\n this.maxHeight - h0 - this.spacing,\n h);\n\n return [\n {\n geometry: {x: 0, y: 0, width: w, height: h0},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: h0 + this.spacing, width: w0, height: h1},\n sides: RectPart.Bottom | RectPart.Left\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\n sides: RectPart.Bottom\n },\n {\n geometry: {x: w0 + this.spacing + w1 + this.spacing, y: h0 + this.spacing, width: w2, height: h1},\n sides: RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutFourLeftAndOther(): ReturnType {\n const h = this.maxHeight;\n const w0 = Math.round(Math.min(\n h * this.ratios[0],\n (this.maxWidth - this.spacing) * 0.6));\n\n const w = Math.round(\n (this.maxHeight - 2 * this.spacing) /\n (1. / this.ratios[1] + 1. / this.ratios[2] + 1. / this.ratios[3])\n );\n const h0 = Math.round(w / this.ratios[1]);\n const h1 = Math.round(w / this.ratios[2]);\n const h2 = h - h0 - h1 - 2 * this.spacing;\n const w1 = Math.max(\n this.minWidth,\n Math.min(this.maxWidth - w0 - this.spacing, w));\n\n return [\n {\n geometry: {x: 0, y: 0, width: w0, height: h},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: w0 + this.spacing, y: 0, width: w1, height: h0},\n sides: RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\n sides: RectPart.Right\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + h1 + 2 * this.spacing, width: w1, height: h2},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private static countRatios(sizes: Size[]) {\n return sizes.map((size) => size.w / size.h);\n }\n\n private static countProportions(ratios: number[]) {\n return ratios.map((ratio) => (ratio > 1.2) ? 'w' : (ratio < 0.8) ? 'n' : 'q').join('');\n }\n}\n\nclass ComplexLayouter {\n private ratios: number[];\n private count: number;\n\n constructor(ratios: number[], private averageRatio: number, private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth * 4 / 3) {\n this.ratios = ComplexLayouter.cropRatios(ratios, averageRatio);\n this.count = ratios.length;\n }\n\n private static cropRatios(ratios: number[], averageRatio: number) {\n const kMaxRatio = 2.75;\n const kMinRatio = 0.6667;\n return ratios.map((ratio) => {\n return averageRatio > 1.1 ?\n clamp(ratio, 1., kMaxRatio) :\n clamp(ratio, kMinRatio, 1.);\n });\n }\n\n public layout(): GroupMediaLayout[] {\n const result = new Array(this.count);\n\n const attempts: Attempt[] = [];\n const multiHeight = (offset: number, count: number) => {\n const ratios = this.ratios.slice(offset, offset + count); // warn\n const sum = accumulate(ratios, 0);\n return (this.maxWidth - (count - 1) * this.spacing) / sum;\n };\n const pushAttempt = (lineCounts: number[]) => {\n const heights: number[] = [];\n let offset = 0;\n for(const count of lineCounts) {\n heights.push(multiHeight(offset, count));\n offset += count;\n }\n attempts.push({lineCounts, heights}); // warn\n };\n\n for(let first = 1; first !== this.count; ++first) {\n const second = this.count - first;\n if(first > 3 || second > 3) {\n continue;\n }\n pushAttempt([first, second]);\n }\n for(let first = 1; first !== this.count - 1; ++first) {\n for(let second = 1; second !== this.count - first; ++second) {\n const third = this.count - first - second;\n if((first > 3) ||\n (second > ((this.averageRatio < 0.85) ? 4 : 3)) ||\n (third > 3)) {\n continue;\n }\n pushAttempt([first, second, third]);\n }\n }\n for(let first = 1; first !== this.count - 1; ++first) {\n for(let second = 1; second !== this.count - first; ++second) {\n for(let third = 1; third !== this.count - first - second; ++third) {\n const fourth = this.count - first - second - third;\n if(first > 3 || second > 3 || third > 3 || fourth > 3) {\n continue;\n }\n pushAttempt([first, second, third, fourth]);\n }\n }\n }\n\n let optimalAttempt: Attempt = null;\n let optimalDiff = 0;\n for(const attempt of attempts) {\n const {heights, lineCounts: counts} = attempt;\n const lineCount = counts.length;\n const totalHeight = accumulate(heights, 0) +\n this.spacing * (lineCount - 1);\n const minLineHeight = Math.min(...heights);\n const maxLineHeight = Math.max(...heights);\n const bad1 = (minLineHeight < this.minWidth) ? 1.5 : 1;\n const bad2 = (() => {\n for(let line = 1; line !== lineCount; ++line) {\n if(counts[line - 1] > counts[line]) {\n return 1.5;\n }\n }\n return 1.;\n })();\n const diff = Math.abs(totalHeight - this.maxHeight) * bad1 * bad2;\n if(!optimalAttempt || diff < optimalDiff) {\n optimalAttempt = attempt;\n optimalDiff = diff;\n }\n }\n\n const optimalCounts = optimalAttempt.lineCounts;\n const optimalHeights = optimalAttempt.heights;\n const rowCount = optimalCounts.length;\n\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\n let x = 0;\n for(let col = 0; col !== colCount; ++col) {\n const sides = RectPart.None |\n (row === 0 ? RectPart.Top : RectPart.None) |\n (row === rowCount - 1 ? RectPart.Bottom : RectPart.None) |\n (col === 0 ? RectPart.Left : RectPart.None) |\n (col === colCount - 1 ? RectPart.Right : RectPart.None);\n\n const ratio = this.ratios[index];\n const width = (col === colCount - 1) ?\n (this.maxWidth - x) :\n Math.round(ratio * lineHeight);\n result[index] = {\n geometry: {x, y, width, height},\n sides\n };\n\n x += width + this.spacing;\n ++index;\n }\n y += height + this.spacing;\n }\n\n return result;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Layouter, RectPart} from './groupedLayout';\n\nexport default function prepareAlbum(options: {\n container: HTMLElement,\n items: {w: number, h: number}[],\n maxWidth: number,\n minWidth: number,\n spacing: number,\n maxHeight?: number,\n forMedia?: true\n}) {\n const layouter = new Layouter(options.items, options.maxWidth, options.minWidth, options.spacing, options.maxHeight);\n const layout = layouter.layout();\n\n const widthItem = layout.find((item) => item.sides & RectPart.Right);\n const width = widthItem.geometry.width + widthItem.geometry.x;\n\n const heightItem = layout.find((item) => item.sides & RectPart.Bottom);\n const height = heightItem.geometry.height + heightItem.geometry.y;\n\n const container = options.container;\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n const children = container.children;\n\n layout.forEach(({geometry, sides}, idx) => {\n let div: HTMLElement;\n div = children[idx] as HTMLElement;\n if(!div) {\n div = document.createElement('div');\n container.append(div);\n }\n\n div.classList.add('album-item', 'grouped-item');\n\n div.style.width = (geometry.width / width * 100) + '%';\n div.style.height = (geometry.height / height * 100) + '%';\n div.style.top = (geometry.y / height * 100) + '%';\n div.style.left = (geometry.x / width * 100) + '%';\n\n if(sides & RectPart.Left && sides & RectPart.Top) {\n div.style.borderTopLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Left && sides & RectPart.Bottom) {\n div.style.borderBottomLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Top) {\n div.style.borderTopRightRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Bottom) {\n div.style.borderBottomRightRadius = 'inherit';\n }\n\n if(options.forMedia) {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n\n div.append(mediaDiv);\n }\n\n // @ts-ignore\n // div.style.backgroundColor = '#' + Math.floor(Math.random() * (2 ** 24 - 1)).toString(16).padStart(6, '0');\n });\n\n /* if(options.forMedia) {\n layout.forEach((_, i) => {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n\n options.container.children[i].append(mediaDiv);\n });\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport {Document, Message, MessageMedia, Photo, PhotoSize} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport rootScope from '../../lib/rootScope';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport Chat from '../chat/chat';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport prepareAlbum from '../prepareAlbum';\nimport wrapMediaSpoiler from './mediaSpoiler';\nimport wrapPhoto from './photo';\nimport wrapVideo from './video';\n\nexport default function wrapAlbum({messages, attachmentDiv, middleware, uploading, lazyLoadQueue, isOut, chat, loadPromises, autoDownload, managers = rootScope.managers, animationGroup}: {\n messages: Message.message[],\n attachmentDiv: HTMLElement,\n middleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n uploading?: boolean,\n isOut: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n managers?: AppManagers,\n animationGroup?: AnimationItemGroup\n}) {\n const items: {size: PhotoSize.photoSize, media: Photo.photo | Document.document, message: Message.message}[] = [];\n\n // !lowest msgID will be the FIRST in album\n for(const message of messages) {\n const media: Photo.photo | Document.document = getMediaFromMessage(message);\n\n const size: any = media._ === 'photo' ? choosePhotoSize(media, 480, 480) : {w: media.w, h: media.h};\n items.push({size, media, message});\n }\n\n /* // * pending\n if(storage[0] < 0) {\n items.reverse();\n } */\n\n prepareAlbum({\n container: attachmentDiv,\n items: items.map((i) => ({w: i.size.w, h: i.size.h})),\n maxWidth: mediaSizes.active.album.width,\n minWidth: 100,\n spacing: 2,\n forMedia: true\n });\n\n const {width, height} = attachmentDiv.style;\n const containerWidth = parseInt(width);\n const containerHeight = parseInt(height);\n\n items.forEach((item, idx) => {\n const {size, media, message} = item;\n\n const messageMedia = message.media;\n const hasSpoiler = !!(messageMedia as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument).pFlags?.spoiler;\n\n const div = attachmentDiv.children[idx] as HTMLElement;\n div.dataset.mid = '' + message.mid;\n div.dataset.peerId = '' + message.peerId;\n const mediaDiv = div.firstElementChild as HTMLElement;\n const isPhoto = media._ === 'photo';\n let thumbPromise: Promise;\n if(isPhoto) {\n thumbPromise = wrapPhoto({\n photo: media,\n message,\n container: mediaDiv,\n boxWidth: 0,\n boxHeight: 0,\n isOut,\n lazyLoadQueue,\n middleware,\n size,\n loadPromises,\n autoDownloadSize: autoDownload.photo,\n managers\n });\n } else {\n thumbPromise = wrapVideo({\n doc: media,\n container: mediaDiv,\n message,\n boxWidth: 0,\n boxHeight: 0,\n withTail: false,\n isOut,\n lazyLoadQueue,\n middleware,\n loadPromises,\n autoDownload,\n managers,\n noAutoplayAttribute: hasSpoiler\n });\n }\n\n if(thumbPromise) {\n loadPromises?.push(thumbPromise);\n }\n\n if(hasSpoiler) {\n const promise = (thumbPromise || Promise.resolve()).then(async() => {\n if(!middleware()) {\n return;\n }\n\n const {width, height} = div.style;\n const itemWidth = +width.slice(0, -1) / 100 * containerWidth;\n const itemHeight = +height.slice(0, -1) / 100 * containerHeight;\n const container = await wrapMediaSpoiler({\n media,\n animationGroup,\n middleware,\n width: itemWidth,\n height: itemHeight\n });\n\n if(!middleware()) {\n return;\n }\n\n mediaDiv.append(container);\n });\n\n loadPromises?.push(promise);\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport appSidebarRight from '..';\nimport {roundPercents} from '../../poll';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {i18n} from '../../../lib/langPack';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport Button from '../../button';\nimport {Message, MessageMedia} from '../../../layer';\n\nexport default class AppPollResultsTab extends SliderSuperTab {\n private resultsDiv: HTMLElement;\n\n public async init(message: Message.message) {\n this.container.id = 'poll-results-container';\n this.container.classList.add('chatlist-container');\n\n this.resultsDiv = document.createElement('div');\n this.resultsDiv.classList.add('poll-results');\n this.scrollable.append(this.resultsDiv);\n\n const poll = await this.managers.appPollsManager.getPoll((message.media as MessageMedia.messageMediaPoll).poll.id);\n\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\n\n const title = document.createElement('h3');\n setInnerHTML(title, wrapEmojiText(poll.poll.question));\n\n const percents = poll.results.results.map((v) => v.voters / poll.results.total_voters * 100);\n roundPercents(percents);\n\n const fragment = document.createDocumentFragment();\n poll.results.results.forEach((result, idx) => {\n if(!result.voters) return;\n\n const hr = document.createElement('hr');\n\n const answer = poll.poll.answers[idx];\n\n // Head\n const answerEl = document.createElement('div');\n answerEl.classList.add('poll-results-answer');\n\n const answerTitle = document.createElement('div');\n setInnerHTML(answerTitle, wrapEmojiText(answer.text));\n\n const answerPercents = document.createElement('div');\n answerPercents.innerText = Math.round(percents[idx]) + '%';\n\n answerEl.append(answerTitle, answerPercents);\n\n // Humans\n const list = appDialogsManager.createChatList();\n list.classList.add('poll-results-voters');\n\n appDialogsManager.setListClickListener(list, () => {\n appSidebarRight.onCloseBtnClick();\n }, undefined, true);\n\n list.style.minHeight = Math.min(result.voters, 4) * 48 + 'px';\n\n fragment.append(hr, answerEl, list);\n\n let offset: string, limit = 4, loading = false, left = Math.max(0, result.voters - 4);\n const load = () => {\n if(loading) return;\n loading = true;\n\n this.managers.appPollsManager.getVotes(message, answer.option, offset, limit).then((votesList) => {\n votesList.votes.forEach((vote) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: vote.user_id.toPeerId(false),\n container: list,\n rippleEnabled: false,\n meAsSaved: false,\n avatarSize: 'small'\n });\n dom.lastMessageSpan.parentElement.remove();\n });\n\n if(offset) {\n left = Math.max(0, left - votesList.votes.length);\n\n if(left) {\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\n }\n }\n\n offset = votesList.next_offset;\n limit = 20;\n\n if(!left || !votesList.votes.length) {\n showMore.remove();\n }\n }).finally(() => {\n loading = false;\n });\n };\n\n const showMore = Button('poll-results-more btn btn-primary btn-transparent', {icon: 'down'});\n showMore.addEventListener('click', load);\n showMore.append(i18n('PollResults.LoadMore', [Math.min(20, left)]));\n\n fragment.append(showMore);\n\n load();\n });\n\n this.resultsDiv.append(title, fragment);\n\n appSidebarRight.toggleSidebar(true).then(() => {\n /* appPollsManager.getVotes(mid).then((votes) => {\n console.log('gOt VotEs', votes);\n }); */\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport mediaSizes from '../helpers/mediaSizes';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport appImManager from '../lib/appManagers/appImManager';\nimport rootScope from '../lib/rootScope';\nimport ripple from './ripple';\nimport appSidebarRight from './sidebarRight';\nimport AppPollResultsTab from './sidebarRight/tabs/pollResults';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\nimport {fastRaf} from '../helpers/schedulers';\nimport SetTransition from './singleTransition';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent, detachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport windowSize from '../helpers/windowSize';\nimport {Message, MessageMedia, Poll, PollResults} from '../layer';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport StackedAvatars from './stackedAvatars';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\n\nlet lineTotalLength = 0;\nconst tailLength = 9;\nconst times = 10;\nconst fullTime = 340;\nconst oneTime = fullTime / times;\n\nexport const roundPercents = (percents: number[]) => {\n // console.log('roundPercents before percents:', percents);\n\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\n if(sum > 100) {\n const diff = sum - 100;\n const length = percents.length;\n for(let i = 0; i < diff; ++i) {\n let minIndex = -1, minRemainder = 1;\n for(let k = 0; k < length; ++k) {\n const remainder = percents[k] % 1;\n if(remainder >= 0.5 && remainder < minRemainder) {\n minRemainder = remainder;\n minIndex = k;\n }\n }\n\n if(minIndex === -1) {\n // throw new Error('lol chto');\n return;\n }\n\n percents[minIndex] -= minRemainder;\n }\n } else if(sum < 100) {\n const diff = 100 - sum;\n const length = percents.length;\n for(let i = 0; i < diff; ++i) {\n let minIndex = -1, maxRemainder = 0;\n for(let k = 0; k < length; ++k) {\n const remainder = percents[k] % 1;\n if(remainder < 0.5 && remainder > maxRemainder) {\n maxRemainder = remainder;\n minIndex = k;\n }\n }\n\n if(minIndex === -1) {\n // throw new Error('lol chto');\n return;\n }\n\n percents[minIndex] += 1 - maxRemainder;\n }\n }\n\n // console.log('roundPercents after percents:', percents);\n};\n\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\nrootScope.on('poll_update', (e) => {\n const {poll, results} = e as {poll: Poll, results: PollResults};\n\n //console.log('poll_update', poll, results);\n for(const connected of connectedPolls) {\n if(connected.id === poll.id) {\n const pollElement = connected.element;\n pollElement.isClosed = !!poll.pFlags.closed;\n pollElement.performResults(results, poll.chosenIndexes);\n }\n }\n}); */\n\nrootScope.addEventListener('poll_update', ({poll, results}) => {\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\n pollElements.forEach((pollElement) => {\n // console.log('poll_update', poll, results);\n pollElement.isClosed = !!poll.pFlags.closed;\n pollElement.performResults(results, poll.chosenIndexes);\n });\n});\n\nmediaSizes.addEventListener('resize', () => {\n PollElement.setMaxLength();\n PollElement.resizePolls();\n});\n\nmediaSizes.addEventListener('changeScreen', () => {\n PollElement.setMaxLength();\n});\n\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\n element.classList.remove('active');\n\n clearTimeout(timeout);\n setTimeout(() => {\n onHide();\n element.remove();\n\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\n prevQuizHint = prevQuizHintOnHide = null;\n prevQuizHintTimeout = 0;\n }\n }, 200);\n};\n\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\nlet isListenerSet = false;\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\n if(prevQuizHint) {\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\n }\n\n const element = document.createElement('div');\n element.classList.add('quiz-hint');\n\n const container = document.createElement('div');\n container.classList.add('container', 'tgico');\n\n const textEl = document.createElement('div');\n textEl.classList.add('text');\n\n container.append(textEl);\n element.append(container);\n\n setInnerHTML(textEl, wrapRichText(solution, {entities: solution_entities}));\n appImManager.chat.bubbles.container.append(element);\n\n void element.offsetLeft; // reflow\n element.classList.add('active');\n\n prevQuizHint = element;\n prevQuizHintOnHide = onHide;\n prevQuizHintTimeout = window.setTimeout(() => {\n hideQuizHint(element, onHide, prevQuizHintTimeout);\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\n\n if(!isListenerSet) {\n isListenerSet = true;\n appImManager.addEventListener('peer_changed', () => {\n if(prevQuizHint) {\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\n }\n });\n }\n};\n\nexport default class PollElement extends HTMLElement {\n public static MAX_OFFSET = -46.5;\n public static MAX_LENGTH = 0;\n public svgLines: SVGSVGElement[];\n private numberDivs: HTMLDivElement[];\n private answerDivs: HTMLDivElement[];\n private descDiv: HTMLElement;\n private typeDiv: HTMLElement;\n private avatarsDiv: HTMLElement;\n private viewResults: HTMLElement;\n private votersCountDiv: HTMLDivElement;\n\n // private maxLength: number;\n // private maxLengths: number[];\n private maxPercents: number[];\n\n public isClosed = false;\n private isQuiz = false;\n private isRetracted = false;\n private isPublic = false;\n private isMultiple = false;\n private chosenIndexes: number[] = [];\n private percents: number[];\n\n public message: Message.message;\n public managers: AppManagers;\n\n private quizInterval: number;\n private quizTimer: SVGSVGElement;\n\n private sendVoteBtn: HTMLElement;\n private chosingIndexes: number[] = [];\n\n private sendVotePromise: Promise;\n private sentVote = false;\n\n public static setMaxLength() {\n const width = windowSize.width <= 360 ? windowSize.width - 120 : mediaSizes.active.poll.width;\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\n }\n\n public static resizePolls() {\n if(!this.MAX_LENGTH) return;\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\n pollElements.forEach((pollElement) => {\n pollElement.svgLines.forEach((svg, idx) => {\n // void svg.getBoundingClientRect(); // reflow\n pollElement.setLineProgress(idx, 1);\n });\n });\n }\n\n public async render() {\n // браузер вызывает этот метод при добавлении элемента в документ\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\n\n if(!lineTotalLength) {\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\n // console.log('line total length:', lineTotalLength);\n PollElement.setMaxLength();\n }\n\n // const {poll, results} = this.managers.appPollsManager.getPoll(pollId);\n const {poll, results} = this.message.media as MessageMedia.messageMediaPoll;\n\n /* const timestamp = Date.now() / 1000 | 0;\n if(timestamp < this.message.date) { */\n if(this.message.pFlags.is_scheduled) {\n this.classList.add('disable-hover');\n }\n\n // console.log('pollElement poll:', poll, results);\n\n let descKey: LangPackKey;\n if(poll.pFlags) {\n this.isPublic = !!poll.pFlags.public_voters;\n this.isQuiz = !!poll.pFlags.quiz;\n this.isClosed = !!poll.pFlags.closed;\n this.isMultiple = !!poll.pFlags.multiple_choice;\n\n if(this.isClosed) {\n descKey = 'Chat.Poll.Type.Closed';\n this.classList.add('is-closed');\n } else if(this.isQuiz) {\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\n } else {\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\n }\n }\n\n this.classList.toggle('is-multiple', this.isMultiple);\n\n const multipleSelect = this.isMultiple ? '' : '';\n const votes = poll.answers.map((answer, idx) => {\n return `\n
\n
\n
\n \n \n \n ${multipleSelect}\n
\n
\n
\n \n \n \n \n
\n `;\n }).join('');\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n ${votes}`;\n\n setInnerHTML(this.firstElementChild, wrapEmojiText(poll.question));\n\n Array.from(this.querySelectorAll('.poll-answer-text')).forEach((el, idx) => {\n setInnerHTML(el, wrapEmojiText(poll.answers[idx].text));\n });\n\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\n\n if(descKey) {\n this.typeDiv.append(i18n(descKey));\n }\n\n if(this.isQuiz) {\n this.classList.add('is-quiz');\n\n if(poll.close_period && poll.close_date) {\n const timeLeftDiv = document.createElement('div');\n timeLeftDiv.classList.add('poll-time');\n this.descDiv.append(timeLeftDiv);\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n // svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\n svg.classList.add('poll-quiz-timer');\n\n this.quizTimer = svg;\n\n const strokeWidth = 2;\n const radius = 7;\n const circumference = 2 * Math.PI * radius;\n\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n circle.classList.add('poll-quiz-timer-circle');\n circle.setAttributeNS(null, 'cx', '16');\n circle.setAttributeNS(null, 'cy', '16');\n circle.setAttributeNS(null, 'r', '' + radius);\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\n\n svg.append(circle);\n this.descDiv.append(svg);\n\n const period = poll.close_period * 1000;\n const closeTime = (poll.close_date - await rootScope.managers.timeManager.getServerTimeOffset()) * 1000;\n\n // console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\n\n // let time = Date.now();\n // let percents = (closeTime - time) / period;\n\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\n\n // // @ts-ignore\n // circle.style.strokeDashoffset = circumference + percents * circumference;\n // circle.style.strokeDasharray = ${circumference} ${circumference};\n\n this.quizInterval = window.setInterval(() => {\n const time = Date.now();\n const percents = (closeTime - time) / period;\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\n timeLeftDiv.innerHTML = toHHMMSS(timeLeft);\n\n if(timeLeft <= 5) {\n timeLeftDiv.style.color = '#ee545c';\n circle.style.stroke = '#ee545c';\n }\n // timeLeftDiv.style.visibility = 'visible';\n\n // @ts-ignore\n circle.style.strokeDashoffset = circumference + percents * circumference;\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\n\n if(time >= closeTime) {\n clearInterval(this.quizInterval);\n timeLeftDiv.innerHTML = '';\n // @ts-ignore\n circle.style.strokeDashoffset = circumference;\n this.quizInterval = 0;\n\n setTimeout(() => {\n // нужно запросить апдейт чтобы опрос обновился\n this.managers.appPollsManager.getResults(this.message);\n }, 3e3);\n }\n }, 1e3);\n }\n }\n\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\n\n const footerDiv = document.createElement('div');\n footerDiv.classList.add('poll-footer');\n\n this.viewResults = document.createElement('div');\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\n\n this.votersCountDiv = document.createElement('div');\n this.votersCountDiv.className = 'poll-votes-count';\n\n footerDiv.append(this.viewResults, this.votersCountDiv);\n this.append(footerDiv);\n\n this.viewResults.addEventListener('click', (e) => {\n cancelEvent(e);\n\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\n appSidebarRight.createTab(AppPollResultsTab).open(this.message);\n }\n });\n ripple(this.viewResults);\n\n if(this.isMultiple) {\n this.sendVoteBtn = document.createElement('div');\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\n ripple(this.sendVoteBtn);\n\n if(!poll.chosenIndexes.length) {\n this.votersCountDiv.classList.add('hide');\n }\n\n attachClickEvent(this.sendVoteBtn, (e) => {\n cancelEvent(e);\n /* const indexes = this.answerDivs.filter((el) => el.classList.contains('is-chosing')).map((el) => +el.dataset.index);\n if(indexes.length) {\n\n } */\n if(this.chosingIndexes.length) {\n this.sendVotes(this.chosingIndexes).then(() => {\n this.chosingIndexes.length = 0;\n this.answerDivs.forEach((el) => {\n el.classList.remove('is-chosing');\n });\n });\n }\n });\n\n footerDiv.append(this.sendVoteBtn);\n }\n\n // const width = this.getBoundingClientRect().width;\n // const width = mediaSizes.active.poll.width;\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\n\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\n if(!canVote || this.isPublic) {\n this.performResults(results, poll.chosenIndexes, false);\n }\n\n if(canVote) {\n this.setVotersCount(results);\n attachClickEvent(this, this.clickHandler);\n }\n }\n\n initQuizHint(results: PollResults) {\n if(results.solution && results.solution_entities) {\n const toggleHint = document.createElement('div');\n toggleHint.classList.add('tgico-tip', 'poll-hint');\n this.descDiv.append(toggleHint);\n\n // let active = false;\n attachClickEvent(toggleHint, (e) => {\n cancelEvent(e);\n\n // active = true;\n toggleHint.classList.add('active');\n setQuizHint(results.solution, results.solution_entities, () => {\n // active = false;\n toggleHint.classList.remove('active');\n });\n });\n\n if(this.sentVote) {\n const correctResult = results.results.find((r) => r.pFlags.correct);\n if(correctResult && !correctResult.pFlags.chosen) {\n simulateClickEvent(toggleHint);\n }\n }\n }\n }\n\n clickHandler(e: Event) {\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\n if(!target) {\n return;\n }\n\n cancelEvent(e);\n const answerIndex = +target.dataset.index;\n if(this.isMultiple) {\n target.classList.toggle('is-chosing');\n\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\n if(foundIndex !== -1) {\n this.chosingIndexes.splice(foundIndex, 1);\n } else {\n this.chosingIndexes.push(answerIndex);\n }\n } else {\n this.sendVotes([answerIndex]);\n }\n\n /* target.classList.add('is-voting');\n setTimeout(() => { // simulate\n this.setResults([100, 0], answerIndex);\n target.classList.remove('is-voting');\n }, 1000); */\n }\n\n sendVotes(indexes: number[]) {\n if(this.sendVotePromise) return this.sendVotePromise;\n\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\n targets.forEach((target) => {\n target.classList.add('is-voting');\n });\n\n this.classList.add('disable-hover');\n this.sentVote = true;\n return this.sendVotePromise = this.managers.appPollsManager.sendVote(this.message, indexes).then(() => {\n targets.forEach((target) => {\n target.classList.remove('is-voting');\n });\n\n this.classList.remove('disable-hover');\n }).catch(() => {\n this.sentVote = false;\n }).finally(() => {\n this.sendVotePromise = null;\n });\n }\n\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\n if(!rootScope.settings.animationsEnabled) {\n animate = false;\n }\n\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\n this.answerDivs.forEach((el, idx) => {\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\n });\n\n if(this.initQuizHint) {\n this.initQuizHint(results);\n this.initQuizHint = null;\n }\n\n if(this.quizInterval) {\n clearInterval(this.quizInterval);\n this.quizInterval = 0;\n }\n\n if(this.quizTimer?.parentElement) {\n this.quizTimer.remove();\n }\n\n const timeEl = this.descDiv.querySelector('.poll-time');\n if(timeEl) {\n timeEl.remove();\n }\n }\n\n if(this.isClosed) {\n this.classList.add('is-closed');\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\n }\n\n // set chosen\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\n this.chosenIndexes = chosenIndexes.slice();\n\n if(this.isRetracted) {\n attachClickEvent(this, this.clickHandler);\n } else {\n detachClickEvent(this, this.clickHandler);\n }\n }\n\n // is need update\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\n const percents = results.results.map((v) => results.total_voters ? v.voters / results.total_voters * 100 : 0);\n\n this.classList.toggle('no-transition', !animate);\n if(animate) {\n SetTransition({\n element: this,\n className: '',\n forwards: !this.isRetracted,\n duration: 340\n });\n }\n\n fastRaf(() => {\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\n this.percents = percents;\n this.isRetracted = false;\n });\n }\n\n this.setVotersCount(results);\n\n if(this.isPublic) {\n if(!this.isMultiple) {\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\n }\n\n const peerIds = (results.recent_voters || []).map((userId) => userId.toPeerId());\n const stackedAvatars = new StackedAvatars({avatarSize: 16});\n stackedAvatars.render(peerIds);\n replaceContent(this.avatarsDiv, stackedAvatars.container);\n }\n\n if(this.isMultiple) {\n const isVoted = !!this.chosenIndexes.length;\n\n const hideSendVoteBtn = this.isClosed || isVoted;\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\n }\n }\n\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\n this.svgLines.forEach((svg) => svg.style.display = '');\n\n this.answerDivs.forEach((el, idx) => {\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\n });\n\n const maxValue = Math.max(...percents);\n // this.maxLengths = percents.map((p) => p / maxValue * this.maxLength);\n this.maxPercents = percents.map((p) => p / maxValue);\n\n // line\n if(this.isRetracted) {\n this.svgLines.forEach((svg, idx) => {\n this.setLineProgress(idx, -1);\n });\n } else {\n const cb = () => {\n this.svgLines.forEach((svg, idx) => {\n // void svg.getBoundingClientRect(); // reflow\n this.setLineProgress(idx, 1);\n });\n };\n\n animate ? fastRaf(cb) : cb();\n }\n\n percents = percents.slice();\n roundPercents(percents);\n let getPercentValue: (percents: number, index: number) => number;\n const iterate = (i: number) => {\n percents.forEach((percents, idx) => {\n const value = getPercentValue(percents, i);\n this.numberDivs[idx].innerText = value + '%';\n });\n };\n // numbers\n if(this.isRetracted) {\n getPercentValue = (percents, index) => Math.round(percents / times * index);\n\n if(animate) {\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\n setTimeout(() => {\n iterate(i);\n }, oneTime * k);\n }\n } else {\n iterate(0);\n }\n } else {\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\n\n if(animate) {\n for(let i = 0; i < times; ++i) {\n setTimeout(() => {\n iterate(i);\n }, oneTime * i);\n }\n } else {\n iterate(times - 1);\n }\n }\n\n if(this.isRetracted) {\n if(animate) {\n this.classList.add('is-retracting');\n }\n\n this.classList.remove('is-voted');\n const cb = () => {\n this.svgLines.forEach((svg) => svg.style.display = 'none');\n };\n\n if(animate) {\n setTimeout(() => {\n this.classList.remove('is-retracting');\n cb();\n }, fullTime);\n } else {\n cb();\n }\n } else {\n this.classList.add('is-voted');\n }\n }\n\n setVotersCount(results: PollResults) {\n const votersCount = results.total_voters || 0;\n let key: LangPackKey;\n const args: FormatterArguments = [votersCount];\n if(this.isClosed) {\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesResultEmpty';\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesResultEmpty';\n } else {\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesEmpty';\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesEmpty';\n }\n\n replaceContent(this.votersCountDiv, i18n(key, args));\n }\n\n setLineProgress(index: number, multiplier: number) {\n const svg = this.svgLines[index];\n\n if(multiplier === -1) {\n svg.style.strokeDasharray = '';\n svg.style.strokeDashoffset = '';\n } else {\n // svg.style.strokeDasharray = (multiplier * this.maxLengths[index]) + ', 485.9';\n svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * PollElement.MAX_LENGTH) + ', 485.9';\n // svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * 100) + '%, 485.9';\n svg.style.strokeDashoffset = '' + multiplier * PollElement.MAX_OFFSET;\n }\n }\n\n // у элемента могут быть ещё другие методы и свойства\n}\n\ncustomElements.define('poll-element', PollElement);\n","// https://stackoverflow.com/a/14824756/6758968\nconst ltrChars = 'A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF'+'\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF',\n rtlChars = '\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC',\n fullRtlDirCheck = new RegExp('^[^'+ltrChars+']*['+rtlChars+']'),\n justRtlDirCheck = new RegExp('['+rtlChars+']');\n\nexport default function isRTL(s: string, anyChar?: boolean) {\n return anyChar ? justRtlDirCheck.test(s) : fullRtlDirCheck.test(s);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppImManager, ChatSavedPosition, ChatSetPeerOptions} from '../../lib/appManagers/appImManager';\nimport type {HistoryResult, MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {logger} from '../../lib/logger';\nimport rootScope from '../../lib/rootScope';\nimport BubbleGroups from './bubbleGroups';\nimport PopupDatePicker from '../popups/datePicker';\nimport PopupForward from '../popups/forward';\nimport PopupStickers from '../popups/stickers';\nimport ProgressivePreloader from '../preloader';\nimport Scrollable, {SliceSides} from '../scrollable';\nimport StickyIntersector from '../stickyIntersector';\nimport animationIntersector from '../animationIntersector';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport I18n, {FormatterArguments, i18n, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n} from '../../lib/langPack';\nimport AvatarElement from '../avatar';\nimport ripple from '../ripple';\nimport {MessageRender} from './messageRender';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport PollElement from '../poll';\nimport AudioElement from '../audio';\nimport {Chat as MTChat, ChatInvite, Document, Message, MessageEntity, MessageMedia, MessageReplyHeader, Photo, PhotoSize, ReactionCount, ReplyMarkup, SponsoredMessage, Update, UrlAuthResult, User, WebPage} from '../../layer';\nimport {BOT_START_PARAM, NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {FocusDirection, ScrollStartCallbackDimensions} from '../../helpers/fastSmoothScroll';\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation} from '../../hooks/useHeavyAnimationCheck';\nimport {fastRaf, fastRafPromise} from '../../helpers/schedulers';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport RepliesElement from './replies';\nimport DEBUG from '../../config/debug';\nimport {SliceEnd} from '../../helpers/slicedArray';\nimport PeerTitle from '../peerTitle';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {toast, toastNew} from '../toast';\nimport {getElementByPoint} from '../../helpers/dom/getElementByPoint';\nimport {getMiddleware, Middleware} from '../../helpers/middleware';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent, detachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport htmlToDocumentFragment from '../../helpers/dom/htmlToDocumentFragment';\nimport reflowScrollableElement from '../../helpers/dom/reflowScrollableElement';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {cancelAnimationByKey} from '../../helpers/animation';\nimport assumeType from '../../helpers/assumeType';\nimport debounce, {DebounceReturnType} from '../../helpers/schedulers/debounce';\nimport {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\nimport windowSize from '../../helpers/windowSize';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport AppMediaViewer from '../appMediaViewer';\nimport SetTransition from '../singleTransition';\nimport handleHorizontalSwipe from '../../helpers/dom/handleHorizontalSwipe';\nimport findUpAttribute from '../../helpers/dom/findUpAttribute';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport formatCallDuration from '../../helpers/formatCallDuration';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport Button from '../button';\nimport {CallType} from '../../lib/calls/types';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport PopupJoinChatInvite from '../popups/joinChatInvite';\nimport {InternalLink, INTERNAL_LINK_TYPE} from '../../lib/appManagers/internalLink';\nimport ReactionsElement, {REACTIONS_ELEMENTS} from './reactions';\nimport type ReactionElement from './reaction';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport pause from '../../helpers/schedulers/pause';\nimport ScrollSaver from '../../helpers/scrollSaver';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\nimport SuperIntersectionObserver from '../../helpers/dom/superIntersectionObserver';\nimport generateFakeIcon from '../generateFakeIcon';\nimport copyFromElement from '../../helpers/dom/copyFromElement';\nimport PopupElement from '../popups';\nimport setAttachmentSize from '../../helpers/setAttachmentSize';\nimport wrapWebPageDescription from '../wrappers/webPageDescription';\nimport wrapWebPageTitle from '../wrappers/webPageTitle';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport wrapMessageActionTextNew from '../wrappers/messageActionTextNew';\nimport isMentionUnread from '../../lib/appManagers/utils/messages/isMentionUnread';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport generateMessageId from '../../lib/appManagers/utils/messageId/generateMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {Awaited, SendMessageEmojiInteractionData} from '../../types';\nimport idleController from '../../helpers/idleController';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport {cancelContextMenuOpening} from '../../helpers/dom/attachContextMenuListener';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport noop from '../../helpers/noop';\nimport getAlbumText from '../../lib/appManagers/utils/messages/getAlbumText';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport PopupPayment from '../popups/payment';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport wrapSticker, {onEmojiStickerClick} from '../wrappers/sticker';\nimport wrapAlbum from '../wrappers/album';\nimport wrapDocument from '../wrappers/document';\nimport wrapGroupedDocuments from '../wrappers/groupedDocuments';\nimport wrapPhoto from '../wrappers/photo';\nimport wrapPoll from '../wrappers/poll';\nimport wrapVideo from '../wrappers/video';\nimport isRTL from '../../helpers/string/isRTL';\nimport NBSP from '../../helpers/string/nbsp';\nimport DotRenderer from '../dotRenderer';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport {BatchProcessor} from '../../helpers/sortedList';\nimport wrapUrl from '../../lib/richTextProcessor/wrapUrl';\nimport getMessageThreadId from '../../lib/appManagers/utils/messages/getMessageThreadId';\nimport wrapTopicNameButton from '../wrappers/topicNameButton';\nimport wrapMediaSpoiler, {onMediaSpoilerClick, toggleMediaSpoiler} from '../wrappers/mediaSpoiler';\nimport confirmationPopup from '../confirmationPopup';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport {PopupPeerCheckboxOptions} from '../popups/peer';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {copyTextToClipboard} from '../../helpers/clipboard';\n\nexport const USER_REACTIONS_INLINE = false;\nconst USE_MEDIA_TAILS = false;\ntype MESSAGE_ACTION_TYPE = Message.messageService['action']['_'];\ntype IGNORE_ACTION_KEY = MESSAGE_ACTION_TYPE;\ntype IGNORE_ACTION_VALUE = true | ((message: Message.messageService) => boolean);\nconst IGNORE_ACTIONS: Map = new Map([\n ['messageActionHistoryClear', true],\n ['messageActionChatCreate', (message) => message.pFlags.out]\n // 'messageActionChannelMigrateFrom'\n] as [IGNORE_ACTION_KEY, IGNORE_ACTION_VALUE][]);\n\nexport const SERVICE_AS_REGULAR: Set = new Set();\n\nif(IS_CALL_SUPPORTED) {\n SERVICE_AS_REGULAR.add('messageActionPhoneCall');\n}\n\nconst TEST_SCROLL_TIMES: number = undefined;\nlet TEST_SCROLL = TEST_SCROLL_TIMES;\n\nlet queueId = 0;\n\ntype GenerateLocalMessageType = IsService extends true ? Message.messageService : Message.message;\n\nconst SPONSORED_MESSAGE_ID_OFFSET = 1;\nexport const STICKY_OFFSET = 3;\nconst SCROLLED_DOWN_THRESHOLD = 300;\nconst PEER_CHANGED_ERROR = new Error('peer changed');\n\nconst DO_NOT_SLICE_VIEWPORT = false;\nconst DO_NOT_SLICE_VIEWPORT_ON_RENDER = false;\nconst DO_NOT_UPDATE_MESSAGE_VIEWS = false;\nconst DO_NOT_UPDATE_MESSAGE_REACTIONS = false;\nconst DO_NOT_UPDATE_MESSAGE_REPLY = false;\n\nconst BIG_EMOJI_SIZES: {[size: number]: number} = {\n 1: 96,\n 2: 90,\n 3: 84,\n 4: 72,\n 5: 60,\n 6: 48,\n 7: 36\n};\nconst BIG_EMOJI_SIZES_LENGTH = Object.keys(BIG_EMOJI_SIZES).length;\n\ntype Bubble = {\n bubble: HTMLElement,\n mids: Set,\n groupedId?: string\n};\n\ntype MyHistoryResult = HistoryResult | {history: number[]};\n\nfunction getMainMidForGrouped(mids: number[]) {\n return Math.max(...mids);\n}\n\nexport default class ChatBubbles {\n public container: HTMLDivElement;\n public chatInner: HTMLDivElement;\n public scrollable: Scrollable;\n\n private getHistoryTopPromise: Promise;\n private getHistoryBottomPromise: Promise;\n\n // public messagesCount: number = -1;\n\n private unreadOut = new Set();\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\n\n public bubbles: {[mid: string]: HTMLElement} = {};\n public skippedMids: Set = new Set();\n public bubblesNewByGroupedId: {[groupId: string]: Bubble} = {};\n public bubblesNew: {[mid: string]: Bubble} = {};\n private dateMessages: {[timestamp: number]: {\n div: HTMLElement,\n firstTimestamp: number,\n container: HTMLElement,\n timeout?: number\n }} = {};\n\n private scrolledDown = true;\n private isScrollingTimeout = 0;\n\n private stickyIntersector: StickyIntersector;\n\n private unreaded: Map = new Map();\n private unreadedSeen: Set = new Set();\n private readPromise: Promise;\n\n private bubbleGroups: BubbleGroups;\n\n private preloader: ProgressivePreloader = null;\n\n // private messagesQueueOnRender: () => void = null;\n private messagesQueueOnRenderAdditional: () => void = null;\n\n private firstUnreadBubble: HTMLElement = null;\n private attachedUnreadBubble: boolean;\n\n public lazyLoadQueue: LazyLoadQueue;\n\n private middlewareHelper = getMiddleware();\n\n private log: ReturnType;\n\n public listenerSetter: ListenerSetter;\n\n private followStack: number[] = [];\n\n private isHeavyAnimationInProgress = false;\n private scrollingToBubble: HTMLElement;\n\n private isFirstLoad = true;\n private needReflowScroll: boolean;\n\n private fetchNewPromise: Promise;\n\n private passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }> = {};\n\n private onAnimateLadder: () => Promise | void;\n // private ladderDeferred: CancellablePromise;\n private resolveLadderAnimation: () => Promise;\n private emptyPlaceholderBubble: HTMLElement;\n\n private viewsMids: Set = new Set();\n private sendViewCountersDebounced: () => Promise;\n\n private isTopPaddingSet = false;\n\n private getSponsoredMessagePromise: Promise;\n\n private previousStickyDate: HTMLElement;\n private sponsoredMessage: SponsoredMessage.sponsoredMessage;\n\n private hoverBubble: HTMLElement;\n private hoverReaction: HTMLElement;\n private sliceViewportDebounced: DebounceReturnType;\n private resizeObserver: ResizeObserver;\n private willScrollOnLoad: boolean;\n public observer: SuperIntersectionObserver;\n\n private renderingMessages: Set = new Set();\n private setPeerCached: boolean;\n private attachPlaceholderOnRender: () => void;\n\n private bubblesToEject: Set = new Set();\n private bubblesToReplace: Map = new Map(); // TO -> FROM\n private updatePlaceholderPosition: () => void;\n private setPeerOptions: {lastMsgId: number; topMessage: number; savedPosition: ChatSavedPosition};\n\n private setPeerTempId: number = 0;\n\n private renderNewPromises: Set> = new Set();\n private updateGradient: boolean;\n\n private extendedMediaMessages: Set = new Set();\n private pollExtendedMediaMessagesPromise: Promise;\n\n private batchProcessor: BatchProcessor>>;\n\n // private reactions: Map;\n\n constructor(\n private chat: Chat,\n private managers: AppManagers\n ) {\n this.log = this.chat.log;\n // this.chat.log.error('Bubbles construction');\n\n this.listenerSetter = new ListenerSetter();\n\n this.constructBubbles();\n\n // * constructor end\n\n this.batchProcessor = new BatchProcessor({\n log: this.log,\n process: this.processBatch,\n possibleError: PEER_CHANGED_ERROR\n });\n this.bubbleGroups = new BubbleGroups(this.chat);\n this.preloader = new ProgressivePreloader({\n cancelable: false\n });\n this.lazyLoadQueue = new LazyLoadQueue(undefined, true);\n this.lazyLoadQueue.queueId = ++queueId;\n\n // this.reactions = new Map();\n\n // * events\n\n // will call when sent for update pos\n this.listenerSetter.add(rootScope)('history_update', async({storageKey, sequential, message}) => {\n if(this.chat.messagesStorageKey !== storageKey || this.chat.type === 'scheduled') {\n return;\n }\n\n const {mid} = message;\n const log = false ? this.log.bindPrefix('history_update-' + mid) : undefined;\n log && log('start');\n\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n if(this.renderNewPromises.size) {\n log && log.error('will await new messages render');\n await Promise.all(Array.from(this.renderNewPromises));\n }\n\n if(this.messagesQueuePromise) {\n log && log.error('messages render in process');\n await this.messagesQueuePromise;\n }\n\n if(this.bubbles[mid] !== bubble) return;\n\n // await getHeavyAnimationPromise();\n\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(!item) { // probably a group item\n log && log.error('no item by bubble', bubble);\n return;\n } else if(item.mid === mid) {\n log && log.warn('wow what', item, mid);\n return;\n }\n\n if(sequential) {\n const group = item.group;\n const newItem = this.bubbleGroups.createItem(bubble, message);\n // newItem.mid = item.mid;\n const _items = this.bubbleGroups.itemsArr.slice();\n indexOfAndSplice(_items, item);\n const foundItem = this.bubbleGroups.findGroupSiblingByItem(newItem, _items);\n if(\n group === foundItem?.group ||\n (group === this.bubbleGroups.getLastGroup() && group.items.length === 1 && newItem.dateTimestamp === item.dateTimestamp) ||\n (this.peerId === rootScope.myId && sequential && newItem.dateTimestamp === item.dateTimestamp)\n ) {\n log && log('item has correct position', item);\n this.bubbleGroups.changeBubbleMid(bubble, mid);\n return;\n }\n }\n\n // return;\n\n // await fastRafPromise();\n // if(this.bubbles[mid] !== bubble) return;\n\n // const groupIndex = this.bubbleGroups.groups.indexOf(group);\n this.bubbleGroups.removeAndUnmountBubble(bubble);\n // if(!group.items.length) { // group has collapsed, next message can have higher mid so have to reposition them too\n // log && log('group has collapsed', item);\n\n // const siblingGroups = this.bubbleGroups.groups.slice(0, groupIndex + 1);\n // for(let length = siblingGroups.length, i = length - 2; i >= 0; --i) {\n // const siblingGroup = siblingGroups[i];\n // const siblingItems = siblingGroup.items;\n // const nextGroup = siblingGroups[i + 1];\n // const nextItems = nextGroup.items;\n\n // let _break = false, moved = false;\n // for(let j = siblingItems.length - 1; j >= 0; --j) {\n // const siblingItem = siblingItems[j];\n // const foundItem = this.bubbleGroups.findGroupSiblingByItem(siblingItem, nextItems);\n // if(!foundItem) {\n // _break = true;\n // break;\n // }\n\n // log('will move item', siblingItem, nextGroup);\n // this.bubbleGroups.removeAndUnmountBubble(siblingItem.bubble);\n // this.bubbleGroups.addItemToGroup(siblingItem, nextGroup);\n // moved = true;\n // }\n\n // if(moved) {\n // nextGroup.mount();\n // }\n\n // if(_break) {\n // break;\n // }\n // }\n // }\n\n const {groups} = this.groupBubbles([{bubble, message}]);\n this.bubbleGroups.mountUnmountGroups(groups);\n\n if(this.scrollingToBubble) {\n this.scrollToEnd();\n }\n\n log && log('end');\n\n // this.bubbleGroups.findIncorrentPositions();\n });\n\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\n if(this.peerId === peerId) {\n this.deleteMessagesByIds(Object.keys(this.bubbles).map((m) => +m));\n }\n });\n\n // Calls when message successfully sent and we have an id\n this.listenerSetter.add(rootScope)('message_sent', async(e) => {\n const {storageKey, tempId, tempMessage, mid, message} = e;\n\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\n if(this.chat.messagesStorageKey !== storageKey) {\n return;\n }\n\n const bubbles = this.bubbles;\n const _bubble = bubbles[tempId];\n if(_bubble) {\n const bubble = bubbles[tempId];\n bubbles[mid] = bubble;\n bubble.dataset.mid = '' + mid;\n delete bubbles[tempId];\n\n fastRaf(() => {\n const mid = +bubble.dataset.mid;\n if(bubbles[mid] === bubble && bubble.classList.contains('is-outgoing')) {\n bubble.classList.remove('is-sending', 'is-outgoing');\n bubble.classList.add((this.peerId === rootScope.myId && this.chat.type !== 'scheduled') || !this.unreadOut.has(mid) ? 'is-read' : 'is-sent');\n }\n });\n }\n\n if(this.unreadOut.has(tempId)) {\n this.unreadOut.delete(tempId);\n this.unreadOut.add(mid);\n }\n\n // * check timing of scheduled message\n if(this.chat.type === 'scheduled') {\n const timestamp = Date.now() / 1000 | 0;\n const maxTimestamp = tempMessage.date - 10;\n if(timestamp >= maxTimestamp) {\n this.deleteMessagesByIds([mid]);\n }\n }\n\n if(!_bubble) {\n return;\n }\n\n let messages: (Message.message | Message.messageService)[], tempIds: number[];\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n messages = await this.managers.appMessagesManager.getMessagesByAlbum(groupedId);\n const mids = messages.map(({mid}) => mid);\n if(!mids.length || getMainMidForGrouped(mids) !== mid || bubbles[mid] !== _bubble) {\n return;\n }\n\n if(bubbles[mid] !== _bubble) {\n return;\n }\n\n tempIds = (Array.from(_bubble.querySelectorAll('.grouped-item')) as HTMLElement[]).map((el) => +el.dataset.mid);\n } else {\n messages = [message];\n tempIds = [tempId];\n }\n\n const reactionsElements = Array.from(_bubble.querySelectorAll('reactions-element')) as ReactionsElement[];\n if(reactionsElements.length) {\n reactionsElements.forEach((reactionsElement) => {\n reactionsElement.changeMessage(message as Message.message);\n });\n }\n\n (messages as Message.message[]).forEach((message, idx) => {\n if(!message) {\n return;\n }\n\n const tempId = tempIds[idx];\n const mid = message.mid;\n const bubble: HTMLElement = _bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || _bubble;\n\n if(message._ !== 'message') {\n return;\n }\n\n if(message.replies) {\n const repliesElement = _bubble.querySelector('replies-element') as RepliesElement;\n if(repliesElement) {\n repliesElement.message = message;\n repliesElement.init();\n }\n }\n\n const media = message.media ?? {} as MessageMedia.messageMediaEmpty;\n const doc = (media as MessageMedia.messageMediaDocument).document as Document.document;\n const poll = (media as MessageMedia.messageMediaPoll).poll;\n const webPage = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage;\n if(doc) {\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\n if(div) {\n const container = findUpClassName(div, 'document-container');\n\n if(!tempMessage.media?.document?.thumbs?.length && doc.thumbs?.length) {\n getHeavyAnimationPromise().then(async() => {\n const timeSpan = div.querySelector('.time');\n const newDiv = await wrapDocument({message, fontSize: rootScope.settings.messagesTextSize});\n div.replaceWith(newDiv);\n\n if(timeSpan) {\n (newDiv.querySelector('.document') || newDiv).append(timeSpan);\n }\n });\n }\n\n if(container) {\n container.dataset.mid = '' + mid;\n }\n }\n\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\n if(element) {\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\n element.dataset.mid = '' + message.mid;\n delete element.dataset.isOutgoing;\n (element as any).message = message;\n (element as any).onLoad(true);\n } else {\n element.dataset.docId = '' + doc.id;\n (element as any).doc = doc;\n }\n }\n } else if(poll) {\n const pollElement = bubble.querySelector('poll-element') as PollElement;\n if(pollElement) {\n pollElement.message = message;\n pollElement.setAttribute('poll-id', '' + poll.id);\n pollElement.setAttribute('message-id', '' + mid);\n }\n } else if(webPage && !bubble.querySelector('.web')) {\n getHeavyAnimationPromise().then(() => {\n this.safeRenderMessage(message, true, bubble);\n this.scrollToBubbleIfLast(bubble);\n });\n }\n\n // set new mids to album items for mediaViewer\n if(groupedId) {\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\n if(item) {\n item.dataset.mid = '' + mid;\n }\n }\n });\n });\n\n this.listenerSetter.add(rootScope)('message_edit', async({storageKey, message}) => {\n if(storageKey !== this.chat.messagesStorageKey) return;\n\n const bubble = this.bubbles[message.mid];\n if(!bubble) return;\n\n await getHeavyAnimationPromise();\n if(this.bubbles[message.mid] !== bubble) return;\n\n this.safeRenderMessage(message, true, bubble);\n });\n\n this.listenerSetter.add(rootScope)('message_error', async({storageKey, tempId}) => {\n if(storageKey !== this.chat.messagesStorageKey) return;\n\n const bubble = this.bubbles[tempId];\n if(!bubble) return;\n\n await getHeavyAnimationPromise();\n if(this.bubbles[tempId] !== bubble) return;\n\n bubble.classList.remove('is-outgoing');\n bubble.classList.add('is-error');\n });\n\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, messages, deletedMids}) => {\n if(peerId !== this.peerId) return;\n\n const mids = messages.map(({mid}) => mid);\n const oldMids = mids.concat(Array.from(deletedMids));\n const wasMainMid = getMainMidForGrouped(oldMids);\n const bubble = this.bubbles[wasMainMid];\n if(!bubble) {\n return;\n }\n\n const mainMid = getMainMidForGrouped(mids);\n const message = messages.find((message) => message.mid === mainMid);\n this.safeRenderMessage(message, true, bubble);\n });\n\n // this.listenerSetter.add(rootScope)('peer_title_edit', async(peerId) => {\n // if(peerId.isUser()) {\n // const middleware = this.getMiddleware();\n // const user = await this.managers.appUsersManager.getUser(peerId.toUserId());\n // if(!middleware()) return;\n\n // const isPremium = user?.pFlags?.premium;\n // const groups = this.bubbleGroups.groups.filter((group) => group.avatar?.peerId === peerId);\n // groups.forEach((group) => {\n // group.avatar.classList.toggle('is-premium', isPremium);\n // group.avatar.classList.toggle('tgico-star', isPremium);\n // });\n // }\n // });\n\n if(!DO_NOT_UPDATE_MESSAGE_REACTIONS/* && false */) {\n this.listenerSetter.add(rootScope)('messages_reactions', async(arr) => {\n if(this.chat.type === 'scheduled') {\n return;\n }\n\n let scrollSaver: ScrollSaver;\n\n const a = arr.map(async({message, changedResults}) => {\n if(this.peerId !== message.peerId) {\n return;\n }\n\n const result = await this.getMountedBubble(message.mid, message);\n if(!result) {\n return;\n }\n\n return {bubble: result.bubble, message, changedResults};\n });\n\n let top: number;\n (await Promise.all(a)).filter(Boolean).forEach(({bubble, message, changedResults}) => {\n if(!scrollSaver) {\n scrollSaver = this.createScrollSaver(false);\n scrollSaver.save();\n }\n\n const key = message.peerId + '_' + message.mid;\n const set = REACTIONS_ELEMENTS.get(key);\n if(set) {\n for(const element of set) {\n element.update(message, changedResults);\n }\n } else if(!message.reactions || !message.reactions.results.length) {\n return;\n } else {\n this.appendReactionsElementToBubble(bubble, message, message, changedResults);\n }\n });\n\n if(scrollSaver) {\n scrollSaver.restore();\n }\n });\n }\n\n !DO_NOT_UPDATE_MESSAGE_REPLY && this.listenerSetter.add(rootScope)('messages_downloaded', async({peerId, mids}) => {\n const middleware = this.getMiddleware();\n await getHeavyAnimationPromise();\n if(!middleware()) return;\n\n (mids as number[]).forEach((mid) => {\n const needUpdate = this.needUpdate;\n const filtered: typeof needUpdate[0][] = [];\n forEachReverse(this.needUpdate, (obj, idx) => {\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\n this.needUpdate.splice(idx, 1)[0];\n filtered.push(obj);\n }\n });\n\n filtered.forEach(async({mid, replyMid, replyToPeerId}) => {\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n const message = (await this.chat.getMessage(mid)) as Message.message;\n\n MessageRender.setReply({\n chat: this.chat,\n bubble,\n message\n });\n });\n });\n });\n\n attachStickerViewerListeners({\n listenTo: this.scrollable.container,\n listenerSetter: this.listenerSetter,\n findTarget: (e) => {\n const target = e.target as HTMLElement;\n const found = target.closest('.attachment.media-sticker-wrapper') || (findUpClassName(target, 'attachment') && target.closest('.custom-emoji'));\n return found as HTMLElement;\n }\n });\n attachClickEvent(this.scrollable.container, this.onBubblesClick, {listenerSetter: this.listenerSetter});\n // this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\n\n this.listenerSetter.add(this.scrollable.container)('mousedown', (e) => {\n if(e.button !== 0) return;\n\n const code: HTMLElement = findUpTag(e.target, 'CODE');\n if(code) {\n cancelEvent(e);\n copyFromElement(code);\n\n const onClick = (e: MouseEvent) => {\n cancelEvent(e);\n toastNew({\n langPackKey: 'TextCopied',\n onClose: () => {\n detach();\n }\n });\n };\n\n const detach = attachClickEvent(window, onClick, {listenerSetter: this.listenerSetter, once: true, capture: true});\n return;\n }\n });\n\n /* if(false) */this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\n for(const timestamp in this.dateMessages) {\n const dateMessage = this.dateMessages[timestamp];\n if(dateMessage.container === target) {\n const dateBubble = dateMessage.div;\n\n // dateMessage.container.classList.add('has-sticky-dates');\n\n // SetTransition(dateBubble, 'kek', stuck, this.previousStickyDate ? 300 : 0);\n // if(this.previousStickyDate) {\n // dateBubble.classList.add('kek');\n // }\n\n dateBubble.classList.toggle('is-sticky', stuck);\n if(stuck) {\n this.previousStickyDate = dateBubble;\n }\n\n break;\n }\n }\n\n if(this.previousStickyDate) {\n // fastRaf(() => {\n // this.bubblesContainer.classList.add('has-sticky-dates');\n // });\n }\n });\n\n if(!IS_SAFARI) {\n this.sliceViewportDebounced = debounce(this.sliceViewport.bind(this), 3000, false, true);\n }\n\n let middleware: ReturnType;\n useHeavyAnimationCheck(() => {\n this.isHeavyAnimationInProgress = true;\n this.lazyLoadQueue.lock();\n middleware = this.getMiddleware();\n\n // if(this.sliceViewportDebounced) {\n // this.sliceViewportDebounced.clearTimeout();\n // }\n }, () => {\n this.isHeavyAnimationInProgress = false;\n\n if(middleware?.()) {\n this.lazyLoadQueue.unlockAndRefresh();\n\n // if(this.sliceViewportDebounced) {\n // this.sliceViewportDebounced();\n // }\n }\n\n middleware = null;\n }, this.listenerSetter);\n }\n\n private constructBubbles() {\n const container = this.container = document.createElement('div');\n container.classList.add('bubbles', 'scrolled-down');\n\n const chatInner = this.chatInner = document.createElement('div');\n chatInner.classList.add('bubbles-inner');\n\n this.setScroll();\n\n container.append(this.scrollable.container);\n }\n\n public attachContainerListeners() {\n const container = this.container;\n\n this.chat.contextMenu.attachTo(container);\n this.chat.selection.attachListeners(container, new ListenerSetter());\n\n if(DEBUG) {\n this.listenerSetter.add(container)('dblclick', async(e) => {\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\n if(bubble) {\n const mid = +bubble.dataset.mid\n this.log('debug message:', await this.chat.getMessage(mid));\n this.highlightBubble(bubble);\n }\n });\n }\n\n if(!IS_MOBILE) {\n this.listenerSetter.add(container)('dblclick', async(e) => {\n if(this.chat.type === 'pinned' ||\n this.chat.selection.isSelecting ||\n !(await this.chat.canSend())) {\n return;\n }\n\n const target = e.target as HTMLElement;\n const bubble = target.classList.contains('bubble') ?\n target :\n (target.classList.contains('document-selection') ? target.parentElement : null);\n if(bubble && !bubble.classList.contains('bubble-first')) {\n const mid = +bubble.dataset.mid;\n const message = await this.chat.getMessage(mid);\n if(message.pFlags.is_outgoing) {\n return;\n }\n\n this.chat.input.initMessageReply(mid);\n }\n });\n } else if(IS_TOUCH_SUPPORTED) {\n const className = 'is-gesturing-reply';\n const MAX = 64;\n const replyAfter = MAX * .75;\n let shouldReply = false;\n let target: HTMLElement;\n let icon: HTMLElement;\n let swipeAvatar: HTMLElement;\n handleHorizontalSwipe({\n element: container,\n verifyTouchTarget: async(e) => {\n if(this.chat.type === 'pinned' || this.chat.selection.isSelecting || !(await this.chat.canSend())) {\n return false;\n }\n\n // cancelEvent(e);\n target = findUpClassName(e.target, 'bubble');\n if(target) {\n try {\n const avatar = target.parentElement.querySelector('.bubbles-group-avatar') as HTMLElement\n if(avatar) {\n const visibleRect = getVisibleRect(avatar, target);\n if(visibleRect) {\n swipeAvatar = avatar;\n }\n }\n } catch(err) {}\n\n SetTransition({\n element: target,\n className,\n forwards: true,\n duration: 250\n });\n void target.offsetLeft; // reflow\n\n if(!icon) {\n icon = document.createElement('span');\n icon.classList.add('tgico-reply_filled', 'bubble-gesture-reply-icon');\n } else {\n icon.classList.remove('is-visible');\n icon.style.opacity = '';\n }\n\n target/* .querySelector('.bubble-content') */.append(icon);\n }\n\n return !!target;\n },\n onSwipe: (xDiff) => {\n shouldReply = xDiff >= replyAfter;\n\n if(shouldReply && !icon.classList.contains('is-visible')) {\n icon.classList.add('is-visible');\n }\n icon.style.opacity = '' + Math.min(1, xDiff / replyAfter);\n\n const x = -Math.max(0, Math.min(MAX, xDiff));\n const transform = `translateX(${x}px)`;\n target.style.transform = transform;\n if(swipeAvatar) {\n swipeAvatar.style.transform = transform;\n }\n cancelContextMenuOpening();\n },\n onReset: () => {\n const _target = target;\n const _swipeAvatar = swipeAvatar;\n target = swipeAvatar = undefined;\n SetTransition({\n element: _target,\n className,\n forwards: false,\n duration: 250,\n onTransitionEnd: () => {\n if(icon.parentElement === _target) {\n icon.classList.remove('is-visible');\n icon.remove();\n }\n }\n });\n\n fastRaf(() => {\n _target.style.transform = '';\n if(_swipeAvatar) {\n _swipeAvatar.style.transform = '';\n }\n\n if(shouldReply) {\n const {mid} = _target.dataset;\n this.chat.input.initMessageReply(+mid);\n shouldReply = false;\n }\n });\n },\n listenerOptions: {capture: true}\n });\n }\n }\n\n public constructPeerHelpers() {\n // will call when message is sent (only 1)\n this.listenerSetter.add(rootScope)('history_append', async({storageKey, message}) => {\n if(storageKey !== this.chat.messagesStorageKey || this.chat.type === 'scheduled') return;\n\n if(rootScope.settings.animationsEnabled) {\n this.updateGradient = true;\n }\n\n if(!this.scrollable.loadedAll.bottom) {\n this.chat.setMessageId();\n } else {\n this.renderNewMessage(message, true);\n }\n });\n\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\n if(this.peerId !== message.peerId || this.chat.type === 'scheduled') return;\n this.renderNewMessage(message);\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n if(peerId !== this.peerId || this.chat.type === 'scheduled') {\n return;\n }\n\n this.deleteMessagesByIds(Array.from(msgs));\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({peerId}) => {\n if(peerId === this.peerId) {\n this.chat.input.setUnreadCount();\n\n getHeavyAnimationPromise().then(() => {\n this.updateUnreadByDialog();\n });\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(!dialogs.has(this.peerId) || this.chat.type === 'scheduled') {\n return;\n }\n\n this.chat.input.setUnreadCount();\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(this.peerId !== dialog.peerId || this.chat.type === 'scheduled') {\n return;\n }\n\n this.chat.input.setUnreadCount();\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n const {peerId} = this;\n if(peerId !== chatId.toPeerId(true)) {\n return;\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n const hadRights = this.chatInner.classList.contains('has-rights');\n const hasRights = await this.chat.canSend();\n\n if(hadRights !== hasRights) {\n const callbacks = await Promise.all([\n this.finishPeerChange(),\n this.chat.input.finishPeerChange()\n ]);\n\n callbacks.forEach((callback) => callback());\n }\n\n if(!!(chat as MTChat.channel).pFlags.forum !== this.chat.isForum && this.chat.type === 'chat') {\n this.chat.peerId = 0;\n this.chat.appImManager.setPeer({peerId});\n }\n });\n\n this.listenerSetter.add(rootScope)('history_reload', (peerId) => {\n if(peerId !== this.peerId) {\n return;\n }\n\n const mids = getObjectKeysAndSort(this.bubbles, 'desc').filter((mid) => mid > 0);\n const middleware = this.getMiddleware();\n this.managers.appMessagesManager.reloadMessages(this.peerId, mids).then((messages) => {\n if(!middleware()) return;\n\n const toDelete: number[] = [];\n messages.forEach((message, idx) => {\n const mid = mids[idx];\n if(message) {\n const bubble = this.bubbles[message.mid];\n if(!bubble) return;\n\n this.safeRenderMessage(message, true, bubble);\n } else {\n toDelete.push(mid);\n }\n });\n\n this.deleteMessagesByIds(toDelete);\n\n this.setLoaded('top', false);\n this.setLoaded('bottom', false);\n this.scrollable.checkForTriggers();\n });\n });\n\n this.listenerSetter.add(rootScope)('settings_updated', async({key}) => {\n if(key === 'settings.emoji.big') {\n const middleware = this.getMiddleware();\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\n const m = mids.map(async(mid) => {\n const bubble = this.bubbles[mid];\n if(bubble.classList.contains('can-have-big-emoji')) {\n return {bubble, message: await this.chat.getMessage(mid)};\n }\n });\n\n const awaited = await Promise.all(m);\n if(!middleware()) {\n return;\n }\n\n awaited.filter(Boolean).forEach(({bubble, message}) => {\n if(this.bubbles[message.mid] !== bubble) {\n return;\n }\n\n this.safeRenderMessage(message, true, bubble);\n });\n }\n });\n\n !DO_NOT_UPDATE_MESSAGE_VIEWS && this.listenerSetter.add(rootScope)('messages_views', (arr) => {\n if(this.chat.type === 'scheduled') return;\n\n fastRaf(() => {\n let scrollSaver: ScrollSaver;\n for(const {peerId, views, mid} of arr) {\n if(this.peerId !== peerId) continue;\n\n const bubble = this.bubbles[mid];\n if(!bubble) continue;\n\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\n if(!postViewsElements.length) continue;\n\n const str = formatNumber(views, 1);\n let different = false;\n postViewsElements.forEach((postViews) => {\n if(different || postViews.textContent !== str) {\n if(!scrollSaver) {\n scrollSaver = this.createScrollSaver(true);\n scrollSaver.save();\n }\n\n different = true;\n postViews.textContent = str;\n }\n });\n }\n\n scrollSaver?.restore();\n });\n });\n\n this.observer = new SuperIntersectionObserver({root: this.scrollable.container});\n\n this.sendViewCountersDebounced = debounce(() => {\n const mids = [...this.viewsMids];\n this.viewsMids.clear();\n\n this.managers.appMessagesManager.incrementMessageViews(this.peerId, mids);\n }, 1000, false, true);\n\n // * pinned part start\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids, pinned}) => {\n if(this.chat.type !== 'pinned' || peerId !== this.peerId) {\n return;\n }\n\n if(mids) {\n if(!pinned) {\n this.deleteMessagesByIds(mids);\n }\n }\n });\n // * pinned part end\n\n // * scheduled part start\n const onUpdate = async() => {\n this.chat.topbar.setTitle((await this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size);\n };\n\n this.listenerSetter.add(rootScope)('scheduled_new', (message) => {\n if(this.chat.type !== 'scheduled' || message.peerId !== this.peerId) return;\n\n this.renderNewMessage(message);\n onUpdate();\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\n if(this.chat.type !== 'scheduled' || peerId !== this.peerId) return;\n\n this.deleteMessagesByIds(mids);\n onUpdate();\n });\n // * scheduled part end\n }\n\n private get peerId() {\n return this.chat.peerId;\n }\n\n public get messagesQueuePromise() {\n return this.batchProcessor.queuePromise;\n }\n\n private createScrollSaver(reverse = true) {\n const scrollSaver = new ScrollSaver(this.scrollable, '.bubble:not(.is-date)', reverse);\n return scrollSaver;\n }\n\n private unreadedObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n const target = entry.target as HTMLElement;\n const mid = this.unreaded.get(target as HTMLElement);\n this.onUnreadedInViewport(target, mid);\n }\n };\n\n private viewsObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n const mid = +(entry.target as HTMLElement).dataset.mid;\n this.observer.unobserve(entry.target, this.viewsObserverCallback);\n\n if(mid) {\n this.viewsMids.add(mid);\n this.sendViewCountersDebounced();\n } else {\n const {sponsoredMessage} = this;\n const randomId = sponsoredMessage?.random_id;\n if(randomId) {\n this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(), randomId);\n delete sponsoredMessage.random_id;\n }\n }\n }\n };\n\n private stickerEffectObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n this.observer.unobserve(entry.target, this.stickerEffectObserverCallback);\n\n const attachmentDiv: HTMLElement = entry.target.querySelector('.attachment');\n getHeavyAnimationPromise().then(() => {\n if(isInDOM(attachmentDiv)) {\n simulateClickEvent(attachmentDiv);\n }\n });\n }\n };\n\n private createResizeObserver() {\n if(!('ResizeObserver' in window) || this.resizeObserver) {\n return;\n }\n\n const container = this.scrollable.container;\n let wasHeight = 0/* container.offsetHeight */;\n let resizing = false;\n let skip = false;\n let scrolled = 0;\n let part = 0;\n let rAF = 0;\n // let skipNext = true;\n\n const onResizeEnd = () => {\n const height = container.offsetHeight;\n const isScrolledDown = this.scrollable.isScrolledDown;\n if(height !== wasHeight && (!skip || !isScrolledDown)) { // * fix opening keyboard while ESG is active, offsetHeight will change right between 'start' and this first frame\n part += wasHeight - height;\n }\n\n /* if(DEBUG) {\n this.log('resize end', scrolled, part, this.scrollable.scrollTop, height, wasHeight, this.scrollable.isScrolledDown);\n } */\n\n if(part) {\n this.scrollable.setScrollTopSilently(this.scrollable.scrollTop + Math.round(part));\n }\n\n wasHeight = height;\n scrolled = 0;\n rAF = 0;\n part = 0;\n resizing = false;\n skip = false;\n };\n\n const setEndRAF = (single: boolean) => {\n if(rAF) window.cancelAnimationFrame(rAF);\n rAF = window.requestAnimationFrame(single ? onResizeEnd : () => {\n rAF = window.requestAnimationFrame(onResizeEnd);\n // this.log('resize after RAF', part);\n });\n };\n\n const processEntries: ResizeObserverCallback = (entries) => {\n /* if(skipNext) {\n skipNext = false;\n return;\n } */\n\n if(skip) {\n setEndRAF(false);\n return;\n }\n\n const entry = entries[0];\n const height = entry.contentRect.height;/* Math.ceil(entry.contentRect.height); */\n\n if(!wasHeight) {\n wasHeight = height;\n return;\n }\n\n const realDiff = wasHeight - height;\n let diff = realDiff + part;\n const _part = diff % 1;\n diff -= _part;\n\n if(!resizing) {\n resizing = true;\n\n /* if(DEBUG) {\n this.log('resize start', realDiff, this.scrollable.scrollTop, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown);\n } */\n\n if(realDiff < 0 && this.scrollable.isScrolledDown) {\n // if(isSafari) { // * fix opening keyboard while ESG is active\n part = -realDiff;\n // }\n\n skip = true;\n setEndRAF(false);\n return;\n }\n }\n\n scrolled += diff;\n\n /* if(DEBUG) {\n this.log('resize', wasHeight - height, diff, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown, height, wasHeight);\n } */\n\n if(diff) {\n const needScrollTop = this.scrollable.scrollTop + diff;\n this.scrollable.setScrollTopSilently(needScrollTop);\n }\n\n setEndRAF(false);\n\n part = _part;\n wasHeight = height;\n };\n\n const resizeObserver = this.resizeObserver = new ResizeObserver(processEntries);\n resizeObserver.observe(container);\n }\n\n private destroyResizeObserver() {\n const resizeObserver = this.resizeObserver;\n if(!resizeObserver) {\n return;\n }\n\n resizeObserver.disconnect();\n this.resizeObserver = undefined;\n }\n\n private onBubblesMouseMove = async(e: MouseEvent) => {\n const content = findUpClassName(e.target, 'bubble-content');\n if(\n this.chat.type !== 'scheduled' &&\n content &&\n !this.chat.selection.isSelecting &&\n !findUpClassName(e.target, 'service') &&\n !findUpClassName(e.target, 'bubble-beside-button')\n ) {\n const bubble = findUpClassName(content, 'bubble');\n if(!this.chat.selection.canSelectBubble(bubble)) {\n this.unhoverPrevious();\n return;\n }\n\n let {hoverBubble, hoverReaction} = this;\n if(bubble === hoverBubble) {\n return;\n }\n\n this.unhoverPrevious();\n\n hoverBubble = this.hoverBubble = bubble;\n hoverReaction = this.hoverReaction;\n // hoverReaction = contentWrapper.querySelector('.bubble-hover-reaction');\n if(!hoverReaction) {\n hoverReaction = this.hoverReaction = document.createElement('div');\n hoverReaction.classList.add('bubble-hover-reaction');\n\n const stickerWrapper = document.createElement('div');\n stickerWrapper.classList.add('bubble-hover-reaction-sticker');\n hoverReaction.append(stickerWrapper);\n\n content.append(hoverReaction);\n\n let message = await this.chat.getMessage(+bubble.dataset.mid);\n if(message?._ !== 'message') {\n this.unhoverPrevious();\n return;\n }\n\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\n\n const middleware = this.getMiddleware(() => this.hoverReaction === hoverReaction);\n Promise.all([\n this.managers.appReactionsManager.getAvailableReactionsByMessage(message),\n pause(400)\n ]).then(([availableReactions]) => {\n const availableReaction = availableReactions[0];\n if(!availableReaction) {\n hoverReaction.remove();\n return;\n }\n\n wrapSticker({\n div: stickerWrapper,\n doc: availableReaction.select_animation,\n width: 18,\n height: 18,\n needUpscale: true,\n middleware,\n group: this.chat.animationGroup,\n withThumb: false,\n needFadeIn: false\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n player.addEventListener('firstFrame', () => {\n if(!middleware()) {\n // debugger;\n return;\n }\n\n hoverReaction.dataset.loaded = '1';\n this.setHoverVisible(hoverReaction, true);\n }, {once: true});\n\n attachClickEvent(hoverReaction, (e) => {\n cancelEvent(e); // cancel triggering selection\n\n this.managers.appReactionsManager.sendReaction(message as Message.message, availableReaction);\n this.unhoverPrevious();\n }, {listenerSetter: this.listenerSetter});\n }, noop);\n });\n } else if(hoverReaction.dataset.loaded) {\n this.setHoverVisible(hoverReaction, true);\n }\n } else {\n this.unhoverPrevious();\n }\n };\n\n public setReactionsHoverListeners() {\n this.listenerSetter.add(contextMenuController)('toggle', this.unhoverPrevious);\n this.listenerSetter.add(overlayCounter)('change', this.unhoverPrevious);\n this.listenerSetter.add(this.chat.selection)('toggle', this.unhoverPrevious);\n this.listenerSetter.add(this.container)('mousemove', this.onBubblesMouseMove);\n }\n\n private setHoverVisible(hoverReaction: HTMLElement, visible: boolean) {\n if(hoverReaction.parentElement) {\n hoverReaction.parentElement.classList.toggle('hover-reaction-visible', visible);\n }\n\n SetTransition({\n element: hoverReaction,\n className: 'is-visible',\n forwards: visible,\n duration: 200,\n onTransitionEnd: visible ? undefined : () => {\n hoverReaction.remove();\n },\n useRafs: 2\n });\n }\n\n private unhoverPrevious = () => {\n const {hoverBubble, hoverReaction} = this;\n if(hoverBubble) {\n this.setHoverVisible(hoverReaction, false);\n this.hoverBubble = undefined;\n this.hoverReaction = undefined;\n }\n };\n\n public setStickyDateManually() {\n return;\n\n const timestamps = Object.keys(this.dateMessages).map((k) => +k).sort((a, b) => b - a);\n let lastVisible: HTMLElement;\n\n // if(this.chatInner.classList.contains('is-scrolling')) {\n const {scrollTop} = this.scrollable.container;\n const isOverflown = scrollTop > 0;\n if(isOverflown) {\n for(const timestamp of timestamps) {\n const dateMessage = this.dateMessages[timestamp];\n const visibleRect = getVisibleRect(dateMessage.container, this.scrollable.container);\n if(visibleRect && visibleRect.overflow.top) {\n lastVisible = dateMessage.div;\n } else if(lastVisible) {\n break;\n }\n }\n }\n // }\n\n if(lastVisible === this.previousStickyDate) {\n return;\n }\n\n if(lastVisible) {\n const needReflow = /* !!this.chat.setPeerPromise || */!this.previousStickyDate;\n if(needReflow) {\n lastVisible.classList.add('no-transition');\n }\n\n lastVisible.classList.add('is-sticky');\n\n if(needReflow) {\n void lastVisible.offsetLeft; // reflow\n lastVisible.classList.remove('no-transition');\n }\n }\n\n if(this.previousStickyDate && this.previousStickyDate !== lastVisible) {\n this.previousStickyDate.classList.remove('is-sticky');\n }\n\n this.previousStickyDate = lastVisible;\n }\n\n public getRenderedLength() {\n return Object.keys(this.bubbles).length - this.skippedMids.size;\n }\n\n private onUnreadedInViewport(target: HTMLElement, mid: number) {\n this.unreadedSeen.add(mid);\n this.observer.unobserve(target, this.unreadedObserverCallback);\n this.unreaded.delete(target);\n this.readUnreaded();\n }\n\n private readUnreaded() {\n if(this.readPromise) return;\n\n const middleware = this.getMiddleware();\n this.readPromise = idleController.getFocusPromise().then(async() => {\n if(!middleware()) return;\n let maxId = Math.max(...Array.from(this.unreadedSeen));\n\n // ? if message with maxId is not rendered ?\n if(this.scrollable.loadedAll.bottom) {\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map((i) => +i));\n if(maxId >= bubblesMaxId) {\n maxId = Math.max((await this.chat.getHistoryMaxId()) || 0, maxId);\n }\n }\n\n this.unreaded.forEach((mid, target) => {\n if(mid <= maxId) {\n this.onUnreadedInViewport(target, mid);\n }\n });\n\n const readContents: number[] = [];\n for(const mid of this.unreadedSeen) {\n const message: MyMessage = await this.chat.getMessage(mid);\n if(isMentionUnread(message)) {\n readContents.push(mid);\n }\n }\n\n this.managers.appMessagesManager.readMessages(this.peerId, readContents);\n\n this.unreadedSeen.clear();\n\n if(DEBUG) {\n this.log('will readHistory by maxId:', maxId);\n }\n\n // return;\n\n return this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\n this.log.error('readHistory err:', err);\n this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\n }).finally(() => {\n if(!middleware()) return;\n this.readPromise = undefined;\n\n if(this.unreadedSeen.size) {\n this.readUnreaded();\n }\n });\n });\n }\n\n public onBubblesClick = async(e: Event) => {\n let target = e.target as HTMLElement;\n let bubble: HTMLElement = null;\n try {\n bubble = findUpClassName(target, 'bubble');\n } catch(err) {}\n\n if(!bubble && !this.chat.selection.isSelecting) {\n const avatar = findUpClassName(target, 'user-avatar');\n if(!avatar) {\n return;\n }\n\n const peerId = avatar.dataset.peerId.toPeerId();\n if(peerId !== NULL_PEER_ID) {\n this.chat.appImManager.setInnerPeer({peerId});\n } else {\n toast(I18n.format('HidAccount', true));\n }\n return;\n }\n\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\n if(bubble.classList.contains('is-fake')) {\n bubble = bubble.previousElementSibling as HTMLElement;\n }\n\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\n return;\n }\n\n for(const timestamp in this.dateMessages) {\n const d = this.dateMessages[timestamp];\n if(d.div === bubble) {\n PopupElement.createPopup(PopupDatePicker, new Date(+timestamp), this.onDatePick).show();\n break;\n }\n }\n\n return;\n }\n\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\n this.chat.selection.toggleByElement(bubble);\n return;\n }\n\n // ! Trusted - due to audio autoclick\n if(this.chat.selection.isSelecting && e.isTrusted) {\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\n return;\n }\n\n cancelEvent(e);\n // console.log('bubble click', e);\n\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\n this.chat.selection.selectedText = undefined;\n return;\n }\n\n // this.chatSelection.toggleByBubble(bubble);\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\n return;\n }\n\n const mediaSpoiler: HTMLElement = findUpClassName(target, 'media-spoiler-container');\n if(mediaSpoiler) {\n onMediaSpoilerClick({\n event: e,\n mediaSpoiler\n });\n return;\n }\n\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\n if(contactDiv) {\n const peerId = contactDiv.dataset.peerId.toPeerId();\n if(peerId) {\n this.chat.appImManager.setInnerPeer({\n peerId\n });\n } else {\n const phone = contactDiv.querySelector('.contact-number');\n copyTextToClipboard(phone.innerText.replace(/\\s/g, ''));\n toastNew({langPackKey: 'PhoneCopied'});\n cancelEvent(e);\n }\n\n return;\n }\n\n const callDiv: HTMLElement = findUpClassName(target, 'bubble-call');\n if(callDiv) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), callDiv.dataset.type as any);\n return;\n }\n\n const buyButton: HTMLElement = findUpClassName(target, 'is-buy');\n if(buyButton) {\n cancelEvent(e);\n\n const message = await this.chat.getMessage(+bubble.dataset.mid);\n if(!message) {\n return;\n }\n\n new PopupPayment(\n message as Message.message,\n await this.managers.appPaymentsManager.getInputInvoiceByPeerId(message.peerId, message.mid)\n );\n return;\n }\n\n const reactionElement = findUpTag(target, 'REACTION-ELEMENT') as ReactionElement;\n if(reactionElement) {\n cancelEvent(e);\n if(reactionElement.classList.contains('is-inactive')) {\n return;\n }\n\n const reactionsElement = reactionElement.parentElement as ReactionsElement;\n const reactionCount = reactionsElement.getReactionCount(reactionElement);\n\n const message = reactionsElement.getMessage();\n this.managers.appReactionsManager.sendReaction(message, reactionCount.reaction);\n\n return;\n }\n\n const stickerEmojiEl = findUpAttribute(target, 'data-sticker-emoji');\n if(stickerEmojiEl && stickerEmojiEl.parentElement.querySelectorAll('[data-sticker-emoji]').length === 1 && bubble.classList.contains('emoji-big')) {\n onEmojiStickerClick({\n event: e,\n container: stickerEmojiEl,\n managers: this.managers,\n middleware: this.getMiddleware(),\n peerId: this.peerId\n });\n\n return;\n }\n\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\n if(commentsDiv) {\n const bubbleMid = +bubble.dataset.mid;\n if(this.peerId === REPLIES_PEER_ID) {\n const message = await this.chat.getMessage(bubbleMid) as Message.message;\n const peerId = getPeerId(message.reply_to.reply_to_peer_id);\n const threadId = message.reply_to.reply_to_top_id;\n const lastMsgId = message.fwd_from.saved_from_msg_id;\n this.chat.appImManager.openThread({\n peerId,\n lastMsgId,\n threadId\n });\n } else {\n const message1 = await this.chat.getMessage(bubbleMid);\n const message = await this.managers.appMessagesManager.getMessageWithReplies(message1 as Message.message);\n const replies = message.replies;\n if(replies) {\n this.managers.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then((message) => {\n this.chat.appImManager.setInnerPeer({\n peerId: replies.channel_id.toPeerId(true),\n type: 'discussion',\n threadId: (message as MyMessage).mid\n });\n });\n }\n }\n\n return;\n }\n\n const via = findUpClassName(target, 'is-via');\n if(via) {\n const el = via.querySelector('.peer-title') as HTMLElement;\n if(target === el || findUpAsChild(target, el)) {\n const message = el.innerText + ' ';\n this.managers.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\n cancelEvent(e);\n\n return;\n }\n }\n\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\n if(nameDiv && nameDiv !== bubble) {\n target = nameDiv || target;\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer') || (target as AvatarElement).peerId;\n const savedFrom = target.dataset.savedFrom;\n if(typeof(peerIdStr) === 'string' || savedFrom) {\n if(savedFrom) {\n const [peerId, mid] = savedFrom.split('_');\n if(target.classList.contains('is-receipt-link')) {\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId.toPeerId(), +mid);\n if(message) {\n const inputInvoice = await this.managers.appPaymentsManager.getInputInvoiceByPeerId(this.peerId, +bubble.dataset.mid);\n new PopupPayment(message as Message.message, inputInvoice, undefined, true);\n }\n } else {\n this.chat.appImManager.setInnerPeer({\n peerId: peerId.toPeerId(),\n lastMsgId: +mid\n });\n }\n } else {\n const peerId = peerIdStr.toPeerId();\n if(peerId !== NULL_PEER_ID) {\n this.chat.appImManager.setInnerPeer({peerId});\n } else {\n toast(I18n.format('HidAccount', true));\n }\n }\n }\n\n return;\n }\n\n // this.log('chatInner click:', target);\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\n /* if(isVideoComponentElement) {\n const video = target.parentElement.querySelector('video') as HTMLElement;\n if(video) {\n video.click(); // hot-fix for time and play button\n return;\n }\n } */\n\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\n const messageId = +bubble.dataset.mid;\n const message = await this.chat.getMessage(messageId);\n\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as Document.document;\n\n if(doc?.stickerSetInput) {\n new PopupStickers(doc.stickerSetInput).show();\n }\n\n return;\n }\n\n const documentDiv = findUpClassName(target, 'document-with-thumb');\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) ||\n target.classList.contains('album-item') ||\n // || isVideoComponentElement\n (target.tagName === 'VIDEO' && !bubble.classList.contains('round')) ||\n (documentDiv && !documentDiv.querySelector('.preloader-container')) ||\n target.classList.contains('canvas-thumbnail')) {\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\n const preloader = (groupedItem || bubble).querySelector('.preloader-container');\n if(preloader) {\n simulateClickEvent(preloader);\n cancelEvent(e);\n return;\n }\n\n cancelEvent(e);\n const messageId = +(groupedItem || bubble).dataset.mid;\n const message = await this.chat.getMessage(messageId);\n if(!message) {\n this.log.warn('no message by messageId:', messageId);\n return;\n }\n\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\n\n const f = documentDiv ? (media: any) => {\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\n } : (media: any) => {\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\n };\n\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\n const ids = isSingleMedia ? [messageId] : (await Promise.all(Object.keys(this.bubbles).map((k) => +k).map(async(mid) => {\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\n return false;\n } */\n // if(!this.scrollable.visibleElements.find((e) => e.element === this.bubbles[id])) return false;\n\n const message = await this.chat.getMessage(mid);\n const media = getMediaFromMessage(message);\n\n return media && f(media) && mid;\n }))).filter(Boolean).sort((a, b) => a - b);\n\n ids.forEach((id) => {\n let selector: string;\n if(documentDiv) {\n selector = '.document-container';\n } else {\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\n if(withTail) {\n selector += '.bubble__media-container';\n } else {\n selector += '.attachment video, .attachment img';\n }\n }\n\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\n const parents: Set = new Set();\n if(documentDiv) {\n elements.forEach((element) => {\n targets.push({\n element: element.querySelector('.document-ico'),\n mid: +element.dataset.mid,\n peerId: this.peerId\n });\n });\n } else {\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\n elements.forEach((element) => {\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\n const albumItem = findUpClassName(element, 'album-item');\n const parent = albumItem || element.parentElement;\n if(parents.has(parent)) return;\n parents.add(parent);\n targets.push({\n element,\n mid: albumItem ? +albumItem.dataset.mid : id,\n peerId: this.peerId\n });\n });\n }\n });\n\n targets.sort((a, b) => a.mid - b.mid);\n\n const idx = targets.findIndex((t) => t.mid === messageId);\n\n if(DEBUG) {\n this.log('open mediaViewer single with ids:', ids, idx, targets);\n }\n\n if(!targets[idx]) {\n this.log('no target for media viewer!', target);\n return;\n }\n\n new AppMediaViewer()\n .setSearchContext({\n threadId: this.chat.threadId,\n peerId: this.peerId,\n inputFilter: {_: documentDiv ? 'inputMessagesFilterDocument' : 'inputMessagesFilterPhotoVideo'},\n useSearch: this.chat.type !== 'scheduled' && !isSingleMedia,\n isScheduled: this.chat.type === 'scheduled'\n })\n .openMedia(message, targets[idx].element, 0, true, targets.slice(0, idx), targets.slice(idx + 1));\n\n // appMediaViewer.openMedia(message, target as HTMLImageElement);\n return;\n }\n\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\n\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\n if(target.classList.contains('goto-original')) {\n const savedFrom = bubble.dataset.savedFrom;\n const [peerId, mid] = savedFrom.split('_');\n // //this.log('savedFrom', peerId, msgID);\n this.chat.appImManager.setInnerPeer({\n peerId: peerId.toPeerId(),\n lastMsgId: +mid\n });\n return;\n } else if(target.classList.contains('forward')) {\n const mid = +bubble.dataset.mid;\n const message = await this.managers.appMessagesManager.getMessageByPeer(this.peerId, mid);\n new PopupForward({\n [this.peerId]: await this.managers.appMessagesManager.getMidsByMessage(message)\n });\n // appSidebarRight.forwardTab.open([mid]);\n return;\n }\n\n let isReplyClick = false;\n\n try {\n isReplyClick = !!findUpClassName(e.target, 'reply');\n } catch(err) {}\n\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\n const bubbleMid = +bubble.dataset.mid;\n this.followStack.push(bubbleMid);\n\n const message = (await this.chat.getMessage(bubbleMid)) as Message.message;\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\n const replyToMid = message.reply_to.reply_to_msg_id;\n\n this.chat.appImManager.setInnerPeer({\n peerId: replyToPeerId,\n lastMsgId: replyToMid,\n type: this.chat.type,\n threadId: this.chat.threadId\n });\n\n /* if(this.chat.type === 'discussion') {\n this.chat.appImManager.setMessageId(, originalMessageId);\n } else {\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\n } */\n // this.chat.setMessageId(, originalMessageId);\n }\n }\n\n // console.log('chatInner click', e);\n };\n\n public async onGoDownClick() {\n if(!this.followStack.length) {\n // this.onScroll(true, undefined, true);\n this.chat.setMessageId(/* , dialog.top_message */);\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\n\n // if(dialog) {\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\n // } else {\n // this.log('will scroll down 3');\n // this.scroll.scrollTop = this.scroll.scrollHeight;\n // }\n\n return;\n }\n\n const middleware = this.getMiddleware();\n const slice = this.followStack.slice();\n const messages = await Promise.all(slice.map((mid) => this.chat.getMessage(mid)));\n if(!middleware()) return;\n\n slice.forEach((mid, idx) => {\n const message = messages[idx];\n\n const bubble = this.bubbles[mid];\n let bad = true;\n if(bubble) {\n const rect = bubble.getBoundingClientRect();\n bad = (windowSize.height / 2) > rect.top;\n } else if(message) {\n bad = false;\n }\n\n if(bad) {\n this.followStack.splice(this.followStack.indexOf(mid), 1);\n }\n });\n\n this.followStack.sort((a, b) => b - a);\n\n const mid = this.followStack.pop();\n this.chat.setMessageId(mid);\n }\n\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\n let element = getElementByPoint(this.scrollable.container, verticalSide, 'center');\n /* if(element) {\n if(element.classList.contains('bubbles-date-group')) {\n const children = Array.from(element.children) as HTMLElement[];\n if(verticalSide === 'top') {\n element = children[this.stickyIntersector ? 2 : 1];\n } else {\n element = children[children.length - 1];\n }\n } else {\n element = findUpClassName(element, 'bubble');\n if(element && element.classList.contains('is-date')) {\n element = element.nextElementSibling as HTMLElement;\n }\n }\n } */\n if(element) element = findUpClassName(element, 'bubble');\n\n return element;\n }\n\n public async getGroupedBubble(groupId: string) {\n const mids = await this.managers.appMessagesManager.getMidsByAlbum(groupId);\n for(const mid of mids) {\n if(this.bubbles[mid] && !this.skippedMids.has(mid)) {\n // const maxId = Math.max(...mids); // * because in scheduled album can be rendered by lowest mid during sending\n return {\n bubble: this.bubbles[mid],\n mid: mid\n // message: await this.chat.getMessage(maxId) as Message.message\n };\n }\n }\n }\n\n public getBubbleGroupedItems(bubble: HTMLElement) {\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\n }\n\n public async getMountedBubble(mid: number, message?: Message.message | Message.messageService) {\n if(message === undefined) {\n message = await this.chat.getMessage(mid);\n }\n\n if(!message) {\n return;\n }\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const a = await this.getGroupedBubble(groupedId);\n if(a) {\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\n return a;\n }\n }\n\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n return {bubble, mid};\n }\n\n private findNextMountedBubbleByMsgId(mid: number, prev?: boolean) {\n const mids = getObjectKeysAndSort(this.bubbles, prev ? 'desc' : 'asc');\n\n let filterCallback: (_mid: number) => boolean;\n if(prev) filterCallback = (_mid) => _mid < mid;\n else filterCallback = (_mid) => mid < _mid;\n\n const foundMid = mids.find((_mid) => {\n if(!filterCallback(_mid)) return false;\n return !!this.bubbles[_mid]?.parentElement;\n });\n\n return this.bubbles[foundMid];\n }\n\n public loadMoreHistory(top: boolean, justLoad = false) {\n // this.log('loadMoreHistory', top);\n if(\n !this.peerId ||\n /* TEST_SCROLL || */\n this.chat.setPeerPromise ||\n this.isHeavyAnimationInProgress ||\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) ||\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\n ) {\n return;\n }\n\n // warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)\n // some messages can have negative id (such as sponsored message)\n const history = Object.keys(this.bubbles)\n .map((id) => +id)\n .filter((id) => id > 0 && !this.skippedMids.has(id))\n .sort((a, b) => a - b);\n\n if(!history.length) {\n history.push(0);\n }\n\n if(top) {\n if(DEBUG) {\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\n }\n\n this.getHistory1(history[0], true, undefined, undefined, justLoad);\n } else {\n // let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\n // const historyMaxId = await this.chat.getHistoryMaxId();\n\n // // if scroll down after search\n // if(history.indexOf(historyMaxId) !== -1) {\n // this.setLoaded('bottom', true);\n // return;\n // }\n\n if(DEBUG) {\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\n }\n\n this.getHistory1(history[history.length - 1], false, true, undefined, justLoad);\n }\n }\n\n public onScroll = (ignoreHeavyAnimation?: boolean, scrollDimensions?: ScrollStartCallbackDimensions, forceDown?: boolean) => {\n // return;\n\n if(this.isHeavyAnimationInProgress) {\n this.sliceViewportDebounced?.clearTimeout();\n\n // * В таком случае, кнопка не будет моргать если чат в самом низу, и правильно отработает случай написания нового сообщения и проскролла вниз\n if(this.scrolledDown && !ignoreHeavyAnimation) {\n return;\n }\n } else {\n this.chat.topbar.pinnedMessage?.setCorrectIndexThrottled(this.scrollable.lastScrollDirection);\n this.sliceViewportDebounced?.();\n this.setStickyDateManually();\n }\n\n // lottieLoader.checkAnimations(false, 'chat');\n\n if(scrollDimensions && scrollDimensions.distanceToEnd < SCROLLED_DOWN_THRESHOLD && this.scrolledDown) {\n return;\n }\n\n const distanceToEnd = forceDown ? 0 : scrollDimensions?.distanceToEnd ?? this.scrollable.getDistanceToEnd();\n if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 && distanceToEnd > 0) || scrollDimensions || forceDown) {\n // if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 || scrollDimensions) && distanceToEnd > 0) {\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\n this.chatInner.classList.add('is-scrolling');\n }\n\n this.isScrollingTimeout = window.setTimeout(() => {\n this.chatInner.classList.remove('is-scrolling');\n this.isScrollingTimeout = 0;\n }, 1350 + (scrollDimensions?.duration ?? 0));\n }\n\n if(distanceToEnd < SCROLLED_DOWN_THRESHOLD && (forceDown || this.scrollable.loadedAll.bottom || this.chat.setPeerPromise || !this.peerId)) {\n this.container.classList.add('scrolled-down');\n this.scrolledDown = true;\n } else if(this.container.classList.contains('scrolled-down')) {\n this.container.classList.remove('scrolled-down');\n this.scrolledDown = false;\n }\n };\n\n public setScroll() {\n if(this.scrollable) {\n this.destroyScrollable();\n }\n\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\n this.setLoaded('top', false, false);\n this.setLoaded('bottom', false, false);\n\n this.scrollable.container.append(this.chatInner);\n\n /* const getScrollOffset = () => {\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\n return 300;\n };\n\n window.addEventListener('resize', () => {\n this.scrollable.onScrollOffset = getScrollOffset();\n });\n\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\n\n this.scrollable.onAdditionalScroll = this.onScroll;\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\n // this.scrollable.attachSentinels(undefined, 300);\n\n if(IS_TOUCH_SUPPORTED && false) {\n this.scrollable.container.addEventListener('touchmove', () => {\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\n this.chatInner.classList.add('is-scrolling');\n }\n }, {passive: true});\n\n this.scrollable.container.addEventListener('touchend', () => {\n if(!this.chatInner.classList.contains('is-scrolling')) {\n return;\n }\n\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n }\n\n this.isScrollingTimeout = window.setTimeout(() => {\n this.chatInner.classList.remove('is-scrolling');\n this.isScrollingTimeout = 0;\n }, 1350);\n }, {passive: true});\n }\n }\n\n public async updateUnreadByDialog() {\n const historyStorage = await this.chat.getHistoryStorage();\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\n\n // /////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\n\n for(const msgId of this.unreadOut) {\n if(msgId > 0 && msgId <= maxId) {\n const bubble = this.bubbles[msgId];\n if(bubble) {\n this.unreadOut.delete(msgId);\n\n if(bubble.classList.contains('is-outgoing') || bubble.classList.contains('is-error')) {\n continue;\n }\n\n bubble.classList.remove('is-sent', 'is-sending', 'is-outgoing'); // is-sending can be when there are bulk of updates (e.g. sending command to Stickers bot)\n bubble.classList.add('is-read');\n }\n }\n }\n }\n\n public destroyBubble(bubble: HTMLElement, mid = +bubble.dataset.mid) {\n // this.log.warn('destroy bubble', bubble, mid);\n bubble.middlewareHelper.destroy();\n\n /* const mounted = this.getMountedBubble(mid);\n if(!mounted) return; */\n\n if(this.bubbles[mid] === bubble) { // have to check because can clear bubble with same id later\n delete this.bubbles[mid];\n }\n\n this.skippedMids.delete(mid);\n\n if(this.firstUnreadBubble === bubble) {\n this.firstUnreadBubble = null;\n }\n\n this.bubbleGroups.removeAndUnmountBubble(bubble);\n if(this.observer) {\n this.observer.unobserve(bubble, this.unreadedObserverCallback);\n this.unreaded.delete(bubble);\n\n this.observer.unobserve(bubble, this.viewsObserverCallback);\n this.viewsMids.delete(mid);\n\n this.observer.unobserve(bubble, this.stickerEffectObserverCallback);\n }\n\n // this.reactions.delete(mid);\n }\n\n public deleteMessagesByIds(mids: number[], permanent = true, ignoreOnScroll?: boolean) {\n let deleted = false;\n mids.forEach((mid) => {\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n this.destroyBubble(bubble, mid);\n\n deleted = true;\n });\n\n if(!deleted) {\n return;\n }\n\n this.scrollable.ignoreNextScrollEvent();\n if(permanent && this.chat.selection.isSelecting) {\n this.chat.selection.deleteSelectedMids(this.peerId, mids);\n }\n\n animationIntersector.checkAnimations(false, this.chat.animationGroup);\n this.deleteEmptyDateGroups();\n\n if(!ignoreOnScroll) {\n this.scrollable.onScroll();\n // this.onScroll();\n }\n }\n\n private pollExtendedMediaMessages() {\n const mids = Array.from(this.extendedMediaMessages);\n return this.managers.appMessagesManager.getExtendedMedia(this.peerId, mids);\n }\n\n private setExtendedMediaMessagesPollInterval() {\n if(this.pollExtendedMediaMessagesPromise || !this.extendedMediaMessages.size) {\n return;\n }\n\n this.pollExtendedMediaMessagesPromise = pause(30000)\n .then(() => this.pollExtendedMediaMessages())\n .then(() => this.setExtendedMediaMessagesPollInterval());\n }\n\n private setTopPadding(middleware = this.getMiddleware()) {\n let isPaddingNeeded = false;\n let setPaddingTo: HTMLElement;\n if(!this.isTopPaddingSet && this.chat.type !== 'scheduled') {\n const {clientHeight, scrollHeight} = this.scrollable.container;\n isPaddingNeeded = clientHeight === scrollHeight;\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\n if(this.chatInner.firstElementChild) {\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\n } else {\n isPaddingNeeded = true;\n } */\n\n if(isPaddingNeeded) {\n /* const add = clientHeight - scrollHeight;\n this.chatInner.style.paddingTop = add + 'px';\n this.scrollable.scrollTop += add; */\n setPaddingTo = this.chatInner;\n setPaddingTo.style.paddingTop = clientHeight + 'px';\n this.scrollable.setScrollTopSilently(scrollHeight);\n this.isTopPaddingSet = true;\n }\n }\n\n return {\n isPaddingNeeded,\n unsetPadding: isPaddingNeeded ? () => {\n if(middleware() && isPaddingNeeded) {\n setPaddingTo.style.paddingTop = '';\n this.isTopPaddingSet = false;\n }\n } : undefined\n };\n }\n\n private renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\n const promise = this._renderNewMessage(message, scrolledDown);\n this.renderNewPromises.add(promise);\n promise.catch(noop).finally(() => {\n this.renderNewPromises.delete(promise);\n });\n return promise;\n }\n\n private async _renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\n if(!this.scrollable.loadedAll.bottom) { // seems search active or sliced\n // this.log('renderNewMessagesByIds: seems search is active, skipping render:', mids);\n const setPeerPromise = this.chat.setPeerPromise;\n if(setPeerPromise) {\n const middleware = this.getMiddleware();\n setPeerPromise.then(async() => {\n if(!middleware()) return;\n const newMessage = await this.chat.getMessage(message.mid);\n if(!middleware()) return;\n this.renderNewMessage(newMessage);\n });\n }\n\n return;\n }\n\n if(this.chat.threadId && getMessageThreadId(message, this.chat.isForum) !== this.chat.threadId) {\n return;\n }\n\n if(this.bubbles[message.mid]) {\n return;\n }\n // ! should scroll even without new messages\n /* if(!mids.length) {\n return;\n } */\n\n if(!scrolledDown) {\n scrolledDown = this.scrolledDown && (\n !this.scrollingToBubble ||\n this.scrollingToBubble === this.getLastBubble() ||\n this.scrollingToBubble === this.chatInner\n );\n }\n\n const middleware = this.getMiddleware();\n const {isPaddingNeeded, unsetPadding} = this.setTopPadding(middleware);\n\n const promise = this.performHistoryResult({history: [message]}, false);\n if(scrolledDown) {\n promise.then(() => {\n if(!middleware()) return;\n // this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\n // const bubble = this.bubbles[Math.max(...mids)];\n\n let bubble: HTMLElement;\n if(this.chat.type === 'scheduled') {\n bubble = this.bubbles[message.mid];\n }\n\n const promise = bubble ? this.scrollToBubbleEnd(bubble) : this.scrollToEnd();\n if(isPaddingNeeded) {\n // it will be called only once even if was set multiple times (that won't happen)\n promise.then(unsetPadding);\n }\n\n // this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\n\n /* setTimeout(() => {\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\n }, 10); */\n });\n }\n\n return promise;\n }\n\n public getLastBubble() {\n const group = this.bubbleGroups.getLastGroup();\n return group?.lastItem?.bubble;\n }\n\n public scrollToBubble(\n element: HTMLElement,\n position: ScrollLogicalPosition,\n forceDirection?: FocusDirection,\n forceDuration?: number\n ) {\n const bubble = findUpClassName(element, 'bubble');\n\n if(!element.parentElement) {\n this.log.error('element is not connected', bubble);\n }\n\n let fallbackToElementStartWhenCentering: HTMLElement;\n // * if it's a start, then scroll to start of the group\n if(bubble && position !== 'end') {\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(item && item.group.firstItem === item && whichChild(item.group.container) === (this.stickyIntersector ? STICKY_OFFSET : 1)) {\n const dateGroup = item.group.container.parentElement;\n // if(whichChild(dateGroup) === 0) {\n fallbackToElementStartWhenCentering = dateGroup;\n // position = 'start';\n // element = dateGroup;\n // }\n }\n }\n\n // const isLastBubble = this.getLastBubble() === bubble;\n /* if(isLastBubble) {\n element = this.getLastDateGroup();\n } */\n\n const margin = 4; // * 4 = .25rem\n /* if(isLastBubble && this.chat.type === 'chat' && this.bubblesContainer.classList.contains('is-chat-input-hidden')) {\n margin = 20;\n } */\n\n const isChangingHeight = (this.chat.input.messageInput && this.chat.input.messageInput.classList.contains('is-changing-height')) || this.chat.container.classList.contains('is-toggling-helper');\n const promise = this.scrollable.scrollIntoViewNew({\n element,\n position,\n margin,\n forceDirection,\n forceDuration,\n axis: 'y',\n getNormalSize: isChangingHeight ? ({rect}) => {\n // return rect.height;\n\n let height = windowSize.height;\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\n height -= this.container.offsetTop;\n height -= mediaSizes.isMobile || windowSize.height < 570 ? 58 : 78;\n return height;\n\n /* const rowsWrapperHeight = this.chat.input.rowsWrapper.getBoundingClientRect().height;\n const diff = rowsWrapperHeight - 54;\n return rect.height + diff; */\n } : undefined,\n fallbackToElementStartWhenCentering,\n startCallback: (dimensions) => {\n // this.onScroll(true, this.scrolledDown && dimensions.distanceToEnd <= SCROLLED_DOWN_THRESHOLD ? undefined : dimensions);\n this.onScroll(true, dimensions);\n\n if(this.updateGradient) {\n const {gradientRenderer} = this.chat;\n gradientRenderer?.toNextPosition(dimensions.getProgress);\n this.updateGradient = undefined;\n }\n }\n });\n\n // fix flickering date when opening unread chat and focusing message\n if(forceDirection === FocusDirection.Static) {\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\n }\n\n return promise;\n }\n\n public scrollToEnd() {\n return this.scrollToBubbleEnd(this.chatInner);\n }\n\n public async scrollToBubbleEnd(bubble: HTMLElement) {\n /* if(DEBUG) {\n this.log('scrollToNewLastBubble: will scroll into view:', bubble);\n } */\n\n if(bubble) {\n this.scrollingToBubble = bubble;\n const middleware = this.getMiddleware();\n await this.scrollToBubble(bubble, 'end', undefined, undefined);\n if(!middleware()) return;\n this.scrollingToBubble = undefined;\n }\n }\n\n // ! can't get it by chatInner.lastElementChild because placeholder can be the last...\n // private getLastDateGroup() {\n // let lastTime = 0, lastElem: HTMLElement;\n // for(const i in this.dateMessages) {\n // const dateMessage = this.dateMessages[i];\n // if(dateMessage.firstTimestamp > lastTime) {\n // lastElem = dateMessage.container;\n // lastTime = dateMessage.firstTimestamp;\n // }\n // }\n\n // return lastElem;\n // }\n\n public async scrollToBubbleIfLast(bubble: HTMLElement) {\n if(this.getLastBubble() === bubble) {\n // return this.scrollToBubbleEnd(bubble);\n return this.scrollToEnd();\n }\n }\n\n public highlightBubble(element: HTMLElement) {\n const datasetKey = 'highlightTimeout';\n if(element.dataset[datasetKey]) {\n clearTimeout(+element.dataset[datasetKey]);\n element.classList.remove('is-highlighted');\n void element.offsetWidth; // reflow\n }\n\n element.classList.add('is-highlighted');\n element.dataset[datasetKey] = '' + setTimeout(() => {\n element.classList.remove('is-highlighted');\n delete element.dataset[datasetKey];\n }, 2000);\n }\n\n private createDateBubble(timestamp: number, date: Date = new Date(timestamp * 1000)) {\n let dateElement: HTMLElement;\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const isScheduled = this.chat.type === 'scheduled';\n\n if(today.getTime() === date.getTime()) {\n dateElement = i18n(isScheduled ? 'Chat.Date.ScheduledForToday' : 'Date.Today');\n } else if(isScheduled && timestamp === SEND_WHEN_ONLINE_TIMESTAMP) {\n dateElement = i18n('MessageScheduledUntilOnline');\n } else {\n const options: Intl.DateTimeFormatOptions = {\n day: 'numeric',\n month: 'long'\n };\n\n if(date.getFullYear() !== today.getFullYear()) {\n options.year = 'numeric';\n }\n\n dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n\n if(isScheduled) {\n dateElement = i18n('Chat.Date.ScheduledFor', [dateElement]);\n }\n }\n\n const bubble = document.createElement('div');\n bubble.className = 'bubble service is-date';\n const bubbleContent = document.createElement('div');\n bubbleContent.classList.add('bubble-content');\n const serviceMsg = document.createElement('div');\n serviceMsg.classList.add('service-msg');\n\n serviceMsg.append(dateElement);\n\n bubbleContent.append(serviceMsg);\n bubble.append(bubbleContent);\n\n return bubble;\n }\n\n public getDateForDateContainer(timestamp: number) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n return {date, dateTimestamp: date.getTime()};\n }\n\n public getDateContainerByTimestamp(timestamp: number) {\n const {date, dateTimestamp} = this.getDateForDateContainer(timestamp);\n let ret = this.dateMessages[dateTimestamp];\n if(ret) {\n return ret;\n }\n\n const bubble = this.createDateBubble(timestamp, date);\n // bubble.classList.add('is-sticky');\n const fakeBubble = this.createDateBubble(timestamp, date);\n fakeBubble.classList.add('is-fake');\n\n const container = document.createElement('section');\n container.className = 'bubbles-date-group';\n container.append(bubble, fakeBubble);\n\n ret = this.dateMessages[dateTimestamp] = {\n div: bubble,\n container,\n firstTimestamp: date.getTime()\n };\n\n const haveTimestamps = getObjectKeysAndSort(this.dateMessages, 'asc');\n const length = haveTimestamps.length;\n let i = 0, insertBefore: HTMLElement; // there can be 'first bubble' (e.g. bot description) so can't insert by index\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n insertBefore = this.dateMessages[t].container;\n if(dateTimestamp < t) {\n break;\n }\n }\n\n if(i === length && insertBefore) {\n insertBefore = insertBefore.nextElementSibling as HTMLElement;\n }\n\n if(!insertBefore) {\n this.chatInner.append(container);\n } else {\n this.chatInner.insertBefore(container, insertBefore);\n }\n\n this.stickyIntersector?.observeStickyHeaderChanges(container);\n\n if(this.chatInner.parentElement) {\n this.container.classList.add('has-groups');\n }\n\n return ret;\n }\n\n private destroyScrollable() {\n this.scrollable.destroy();\n }\n\n public destroy() {\n // this.chat.log.error('Bubbles destroying');\n\n this.destroyScrollable();\n\n this.listenerSetter.removeAll();\n\n this.lazyLoadQueue.clear();\n this.observer && this.observer.disconnect();\n this.stickyIntersector && this.stickyIntersector.disconnect();\n\n delete this.lazyLoadQueue;\n this.observer && delete this.observer;\n this.stickyIntersector && delete this.stickyIntersector;\n }\n\n public cleanup(bubblesToo = false) {\n this.log('cleanup');\n\n this.bubbles = {}; // clean it before so sponsored message won't be deleted faster on peer changing\n // //console.time('appImManager cleanup');\n this.setLoaded('top', false, false);\n this.setLoaded('bottom', false, false);\n\n // cancel scroll\n cancelAnimationByKey(this.scrollable.container);\n\n // do not wait ending of previous scale animation\n interruptHeavyAnimation();\n\n if(TEST_SCROLL !== undefined) {\n TEST_SCROLL = TEST_SCROLL_TIMES;\n }\n\n this.skippedMids.clear();\n this.dateMessages = {};\n this.bubbleGroups.cleanup();\n this.unreadOut.clear();\n this.needUpdate.length = 0;\n this.lazyLoadQueue.clear();\n this.renderNewPromises.clear();\n\n // clear messages\n if(bubblesToo) {\n this.scrollable.container.textContent = '';\n this.chatInner.textContent = '';\n this.cleanupPlaceholders();\n }\n\n this.firstUnreadBubble = null;\n this.attachedUnreadBubble = false;\n\n this.batchProcessor.clear();\n\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\n this.fetchNewPromise = undefined;\n this.getSponsoredMessagePromise = undefined;\n this.updateGradient = undefined;\n\n if(this.stickyIntersector) {\n this.stickyIntersector.disconnect();\n }\n\n if(this.observer) {\n this.observer.disconnect();\n\n this.unreaded.clear();\n this.unreadedSeen.clear();\n this.readPromise = undefined;\n\n this.viewsMids.clear();\n }\n\n this.middlewareHelper.clean();\n\n this.onAnimateLadder = undefined;\n this.resolveLadderAnimation = undefined;\n this.attachPlaceholderOnRender = undefined;\n this.emptyPlaceholderBubble = undefined;\n this.sponsoredMessage = undefined;\n this.previousStickyDate = undefined;\n\n this.scrollingToBubble = undefined;\n // //console.timeEnd('appImManager cleanup');\n\n this.isTopPaddingSet = false;\n\n this.renderingMessages.clear();\n this.bubblesToEject.clear();\n this.bubblesToReplace.clear();\n\n // this.reactions.clear();\n\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n this.isScrollingTimeout = 0;\n }\n\n this.container.classList.remove('has-sticky-dates');\n this.scrollable.cancelMeasure();\n }\n\n private cleanupPlaceholders(bubble = this.emptyPlaceholderBubble) {\n if(bubble) {\n this.destroyBubble(bubble);\n }\n }\n\n public async setPeer(options: ChatSetPeerOptions & {samePeer: boolean}): Promise<{cached?: boolean, promise: Chat['setPeerPromise']}> {\n const {samePeer, peerId, stack} = options;\n let {lastMsgId, startParam} = options;\n const tempId = ++this.setPeerTempId;\n\n if(!peerId) {\n this.cleanup(true);\n this.preloader.detach();\n return null;\n }\n\n const perf = performance.now();\n const log = this.log.bindPrefix('setPeer');\n log.warn('start');\n\n const middleware = () => {\n return this.setPeerTempId === tempId;\n };\n\n const m = middlewarePromise(middleware, PEER_CHANGED_ERROR);\n\n if(!samePeer) {\n await m(this.chat.onChangePeer(options, m));\n }\n\n /* if(samePeer && this.chat.setPeerPromise) {\n return {cached: true, promise: this.chat.setPeerPromise};\n } */\n\n const chatType = this.chat.type;\n\n if(chatType === 'scheduled' || this.chat.isRestricted) {\n lastMsgId = 0;\n }\n\n const historyStorage = await m(this.chat.getHistoryStorage());\n const topMessage = chatType === 'pinned' ? await m(this.managers.appMessagesManager.getPinnedMessagesMaxId(peerId, this.chat.threadId)) : historyStorage.maxId ?? 0;\n const isTarget = lastMsgId !== undefined;\n\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\n topMessage = 0;\n } */\n\n let followingUnread: boolean;\n let readMaxId = 0, savedPosition: ReturnType, overrideAdditionMsgId: number;\n if(!isTarget) {\n if(!samePeer) {\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\n }\n\n if(savedPosition) {\n\n } else if(topMessage) {\n readMaxId = await m(this.managers.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId));\n const dialog = await m(this.chat.getDialogOrTopic());\n if(/* dialog.unread_count */readMaxId && !samePeer && (!dialog || dialog.unread_count !== 1)) {\n const foundSlice = historyStorage.history.findSliceOffset(readMaxId);\n if(foundSlice && foundSlice.slice.isEnd(SliceEnd.Bottom)) {\n overrideAdditionMsgId = foundSlice.slice[foundSlice.offset - 25] || foundSlice.slice[0] || readMaxId;\n }\n\n followingUnread = !isTarget;\n lastMsgId = readMaxId;\n } else {\n lastMsgId = topMessage;\n // lastMsgID = topMessage;\n }\n }\n }\n\n const isJump = lastMsgId !== topMessage/* && overrideAdditionMsgId === undefined */;\n\n if(startParam === undefined && await m(this.chat.isStartButtonNeeded())) {\n startParam = BOT_START_PARAM;\n }\n\n if(samePeer) {\n if(stack && lastMsgId) {\n this.followStack.push(stack);\n }\n\n const mounted = await m(this.getMountedBubble(lastMsgId));\n if(mounted) {\n if(isTarget) {\n this.scrollToBubble(mounted.bubble, 'center');\n this.highlightBubble(mounted.bubble);\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\n } else if(topMessage && !isJump) {\n // log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\n // scrollable.setScrollTopSilently(scrollable.scrollHeight);\n this.scrollToEnd();\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\n }\n\n if(startParam !== undefined) {\n this.chat.input.setStartParam(startParam);\n }\n\n return null;\n }\n } else {\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\n this.lazyLoadQueue.queueId = ++queueId;\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }\n\n this.followStack.length = 0;\n\n this.passEntities = {\n messageEntityBotCommand: await m(this.managers.appPeersManager.isAnyGroup(peerId)) || this.chat.isBot\n };\n }\n\n if(DEBUG) {\n log('setPeer peerId:', peerId, historyStorage, lastMsgId, topMessage);\n }\n\n // add last message, bc in getHistory will load < max_id\n const additionMsgId = overrideAdditionMsgId ?? (isJump || chatType === 'scheduled' || this.chat.isRestricted ? 0 : topMessage);\n\n let maxBubbleId = 0;\n if(samePeer) {\n const el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\n // this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\n if(el) {\n maxBubbleId = +el.dataset.mid;\n }\n\n if(maxBubbleId <= 0) {\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map((mid) => +mid));\n }\n } else {\n this.isFirstLoad = true;\n this.destroyResizeObserver();\n }\n\n const oldChatInner = this.chatInner;\n const oldPlaceholderBubble = this.emptyPlaceholderBubble;\n this.cleanup();\n const chatInner = this.chatInner = document.createElement('div');\n if(samePeer) {\n chatInner.className = oldChatInner.className;\n chatInner.classList.remove('disable-hover', 'is-scrolling');\n } else {\n chatInner.classList.add('bubbles-inner');\n }\n\n this.lazyLoadQueue.lock();\n\n // const haveToScrollToBubble = (topMessage && (isJump || samePeer)) || isTarget;\n const haveToScrollToBubble = samePeer || (topMessage && isJump) || isTarget;\n const fromUp = maxBubbleId > 0 && (!lastMsgId || maxBubbleId < lastMsgId || lastMsgId < 0);\n const scrollFromDown = !fromUp && samePeer;\n const scrollFromUp = !scrollFromDown && fromUp/* && (samePeer || forwardingUnread) */;\n this.willScrollOnLoad = scrollFromDown || scrollFromUp;\n\n this.setPeerOptions = {\n lastMsgId,\n topMessage,\n savedPosition\n };\n\n let result: Awaited>;\n if(!savedPosition) {\n result = await m(this.getHistory1(lastMsgId, true, isJump, additionMsgId));\n } else {\n result = {\n promise: getHeavyAnimationPromise().then(() => {\n return this.performHistoryResult({history: savedPosition.mids}, true);\n }) as any,\n cached: true,\n waitPromise: Promise.resolve()\n };\n }\n\n this.setPeerCached = result.cached;\n\n log.warn('got history');// warning\n\n const {promise, cached} = result;\n\n if(!cached && !samePeer) {\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam));\n this.scrollable.container.textContent = '';\n // oldContainer.textContent = '';\n // oldChatInner.remove();\n this.preloader.attach(this.container);\n }\n\n /* this.ladderDeferred && this.ladderDeferred.resolve();\n this.ladderDeferred = deferredPromise(); */\n\n animationIntersector.lockGroup(this.chat.animationGroup);\n const setPeerPromise = m(promise).then(async() => {\n log.warn('promise fulfilled');\n\n const mountedByLastMsgId = haveToScrollToBubble ? await m(lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()}) : undefined;\n if(cached && !samePeer) {\n log.warn('finishing peer change');\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam)); // * костыль\n log.warn('finished peer change');\n }\n\n this.preloader.detach();\n\n if(this.resolveLadderAnimation) {\n this.resolveLadderAnimation();\n this.resolveLadderAnimation = undefined;\n }\n\n this.setPeerCached = undefined;\n\n // this.ladderDeferred.resolve();\n\n const scrollable = this.scrollable;\n scrollable.lastScrollDirection = 0;\n scrollable.lastScrollPosition = 0;\n replaceContent(scrollable.container, chatInner);\n // this.chat.topbar.container.nextElementSibling.replaceWith(container);\n\n if(oldPlaceholderBubble) {\n this.cleanupPlaceholders(oldPlaceholderBubble);\n }\n\n if(this.attachPlaceholderOnRender) {\n this.attachPlaceholderOnRender();\n }\n\n if(!isTarget && this.chat.isPinnedMessagesNeeded()) {\n this.chat.topbar.pinnedMessage?.setCorrectIndex(0);\n }\n\n this.container.classList.toggle('has-groups', !!Object.keys(this.dateMessages).length);\n\n log.warn('mounted chat', this.chatInner === chatInner, this.chatInner.parentElement, performance.now() - perf);\n\n animationIntersector.unlockGroup(this.chat.animationGroup);\n animationIntersector.checkAnimations(false, this.chat.animationGroup/* , true */);\n\n // fastRaf(() => {\n this.lazyLoadQueue.unlock();\n // });\n\n // if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\n if(savedPosition) {\n scrollable.setScrollTopSilently(savedPosition.top);\n /* const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\n let bubble: HTMLElement = mountedByLastMsgId?.bubble;\n if(!bubble?.parentElement) {\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\n }\n\n if(bubble) {\n const top = bubble.getBoundingClientRect().top;\n const distance = savedPosition.top - top;\n scrollable.scrollTop += distance;\n } */\n } else if(haveToScrollToBubble) {\n let unsetPadding: () => void;\n if(scrollFromDown) {\n scrollable.setScrollTopSilently(99999);\n } else if(scrollFromUp) {\n const set = this.setTopPadding();\n if(set.isPaddingNeeded) {\n unsetPadding = set.unsetPadding;\n }\n\n scrollable.setScrollTopSilently(0);\n }\n\n // const mountedByLastMsgId = lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()};\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\n if(!bubble?.parentElement) {\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId, false) || this.findNextMountedBubbleByMsgId(lastMsgId, true);\n }\n\n let promise: Promise;\n // ! sometimes there can be no bubble\n if(bubble) {\n const lastBubble = this.getLastBubble();\n const position: ScrollLogicalPosition = followingUnread ? 'start' : (!isJump && !isTarget && lastBubble === bubble ? 'end' : 'center');\n\n if(position === 'end' && lastBubble === bubble && samePeer) {\n promise = this.scrollToEnd();\n } else {\n promise = this.scrollToBubble(bubble, position, !samePeer ? FocusDirection.Static : undefined);\n }\n\n if(!followingUnread && isTarget) {\n this.highlightBubble(bubble);\n }\n }\n\n if(unsetPadding) {\n (promise || Promise.resolve()).then(() => {\n unsetPadding();\n });\n }\n } else {\n scrollable.setScrollTopSilently(99999);\n }\n\n // if(!cached) {\n this.onRenderScrollSet();\n // }\n\n this.onScroll();\n\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\n afterSetPromise.then(() => { // check whether list isn't full\n scrollable.checkForTriggers();\n\n // if(cached) {\n // this.onRenderScrollSet();\n // }\n });\n\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\n\n Promise.all([\n this.setFetchReactionsInterval(afterSetPromise),\n this.setFetchHistoryInterval({\n afterSetPromise,\n lastMsgId,\n samePeer,\n savedPosition,\n topMessage\n })\n ]).then(() => {\n log('scrolledAllDown:', scrollable.loadedAll.bottom);\n // if(!this.unreaded.length && dialog) { // lol\n if(scrollable.loadedAll.bottom && topMessage && !this.unreaded.size) { // lol\n this.onScrolledAllDown();\n }\n });\n\n if(chatType === 'chat' && !this.chat.isForumTopic) {\n const dialog = await m(this.managers.appMessagesManager.getDialogOnly(peerId));\n if(dialog?.pFlags.unread_mark) {\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\n }\n }\n\n // this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\n }).catch((err) => {\n log.error('setPeer promise error:', err);\n if(!middleware()) {\n this.preloader.detach();\n }\n\n throw err;\n });\n\n return {cached, promise: setPeerPromise};\n }\n\n private async setFetchReactionsInterval(afterSetPromise: Promise) {\n const middleware = this.getMiddleware();\n const needReactionsInterval = this.chat.isChannel;\n if(needReactionsInterval) {\n const fetchReactions = async() => {\n if(!middleware()) return;\n\n const mids: number[] = [];\n for(const mid in this.bubbles) {\n let message = await this.chat.getMessage(+mid);\n if(message?._ !== 'message') {\n continue;\n }\n\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\n mids.push(message.mid);\n }\n\n const promise = mids.length ? this.managers.appReactionsManager.getMessagesReactions(this.peerId, mids) : Promise.resolve();\n promise.then(() => {\n setTimeout(fetchReactions, 10e3);\n });\n };\n\n Promise.all([afterSetPromise, getHeavyAnimationPromise(), pause(500)]).then(() => {\n fetchReactions();\n });\n }\n }\n\n private async setFetchHistoryInterval({\n lastMsgId,\n topMessage,\n afterSetPromise,\n savedPosition,\n samePeer\n }: {\n lastMsgId: number,\n topMessage: number,\n afterSetPromise: Promise,\n savedPosition: ChatSavedPosition,\n samePeer: boolean\n }) {\n const middleware = this.getMiddleware();\n const peerId = this.peerId;\n\n const needFetchInterval = await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId);\n const needFetchNew = savedPosition || needFetchInterval;\n if(!needFetchNew) {\n return;\n }\n\n await afterSetPromise;\n if(!middleware()) {\n return;\n }\n\n const chatId = peerId.toChatId();\n middleware.onClean(() => {\n this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(chatId);\n });\n\n this.managers.apiUpdatesManager.subscribeToChannelUpdates(chatId);\n return;\n\n this.setLoaded('bottom', false);\n this.scrollable.checkForTriggers();\n\n if(!needFetchInterval) {\n return;\n }\n\n const f = () => {\n this.fetchNewPromise = new Promise(async(resolve) => {\n if(!middleware() || !(await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId))) {\n resolve();\n return;\n }\n\n this.managers.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((result) => {\n if(!middleware() || !result) {\n resolve();\n return;\n }\n\n const {isBottomEnd} = result;\n if(this.scrollable.loadedAll.bottom && this.scrollable.loadedAll.bottom !== isBottomEnd) {\n this.setLoaded('bottom', isBottomEnd);\n this.onScroll();\n }\n\n setTimeout(f, 30e3);\n resolve();\n });\n }).finally(() => {\n this.fetchNewPromise = undefined;\n });\n };\n\n if(samePeer) {\n setTimeout(f, 30e3);\n } else {\n f();\n }\n }\n\n public async onScrolledAllDown() {\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n const historyMaxId = await this.chat.getHistoryMaxId();\n this.managers.appMessagesManager.readHistory(this.peerId, historyMaxId, this.chat.threadId, true);\n }\n }\n\n public async finishPeerChange() {\n const [isChannel, canWrite, isAnyGroup] = await Promise.all([\n this.chat.isChannel,\n this.chat.canSend(),\n this.chat.isAnyGroup\n ]);\n\n return () => {\n this.chatInner.classList.toggle('has-rights', canWrite);\n this.container.classList.toggle('is-chat-input-hidden', !canWrite);\n\n this.chatInner.classList.toggle('is-chat', isAnyGroup);\n this.chatInner.classList.toggle('is-channel', isChannel);\n\n this.createResizeObserver();\n };\n }\n\n private processBatch = async(...args: Parameters) => {\n let [loadQueue, m, log] = args;\n\n const filterQueue = (queue: typeof loadQueue) => {\n return queue.filter((details) => {\n // message can be deleted during rendering\n return details && this.bubbles[details.bubble.dataset.mid] === details.bubble;\n });\n };\n\n loadQueue = filterQueue(loadQueue);\n\n log('messages rendered');\n\n const reverse = loadQueue[0]?.reverse;\n\n const {groups, avatarPromises} = this.groupBubbles(loadQueue.filter((details) => details.updatePosition));\n\n // if(groups.length > 2 && loadQueue.length === 1) {\n // debugger;\n // }\n\n const promises = loadQueue.reduce((acc, details) => {\n const perf = performance.now();\n\n const promises = details.promises.slice();\n const timePromises = promises.map(async(promise) => (await promise, performance.now() - perf));\n Promise.all(timePromises).then((times) => {\n log.groupCollapsed('media message time', performance.now() - perf, details, times);\n times.forEach((time, idx) => {\n log('media message time', time, idx, promises[idx]);\n });\n log.groupEnd();\n });\n\n // if(details.updatePosition) {\n // if(res) {\n // groups.add(res.group);\n // if(details.needAvatar) {\n // details.promises.push(res.group.createAvatar(details.message));\n // }\n // }\n // }\n\n acc.push(...details.promises);\n return acc;\n }, [] as Promise[]);\n\n promises.push(...avatarPromises);\n // promises.push(pause(200));\n\n // * это нужно для того, чтобы если захочет подгрузить reply или какое-либо сообщение, то скролл не прервался\n // * если добавить этот промис - в таком случае нужно сделать, чтобы скроллило к последнему сообщению после рендера\n // promises.push(getHeavyAnimationPromise());\n\n log('media promises to call', promises, loadQueue, this.isHeavyAnimationInProgress);\n await m(Promise.all([...promises, this.setUnreadDelimiter()]).catch(noop)); // не нашёл места лучше\n await m(fastRafPromise()); // have to be the last\n log('media promises end');\n\n loadQueue = filterQueue(loadQueue);\n\n const {restoreScroll, scrollSaver} = this.prepareToSaveScroll(reverse);\n // if(this.messagesQueueOnRender) {\n // this.messagesQueueOnRender();\n // }\n\n this.messagesQueueOnRenderAdditional?.();\n\n this.ejectBubbles();\n for(const [bubble, oldBubble] of this.bubblesToReplace) {\n if(scrollSaver) {\n scrollSaver.replaceSaved(oldBubble, bubble);\n }\n\n if(!loadQueue.find((details) => details.bubble === bubble)) {\n continue;\n }\n\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(!item) {\n this.log.error('NO ITEM BY BUBBLE', bubble);\n } else {\n item.mounted = false;\n if(!groups.includes(item.group)) {\n groups.push(item.group);\n }\n }\n\n this.bubblesToReplace.delete(bubble);\n }\n\n if(this.chat.selection.isSelecting) {\n loadQueue.forEach(({bubble}) => {\n this.chat.selection.toggleElementCheckbox(bubble, true);\n });\n }\n\n loadQueue.forEach(({message, bubble, updatePosition}) => {\n if(message.pFlags.local && updatePosition) {\n this.chatInner[(message as Message.message).pFlags.sponsored ? 'append' : 'prepend'](bubble);\n return;\n }\n });\n\n this.bubbleGroups.mountUnmountGroups(groups);\n // this.bubbleGroups.findIncorrentPositions();\n\n this.updatePlaceholderPosition?.();\n\n restoreScroll?.();\n\n // this.setStickyDateManually();\n };\n\n public renderMessagesQueue(options: ReturnType) {\n return this.batchProcessor.addToQueue(options);\n }\n\n private ejectBubbles() {\n for(const bubble of this.bubblesToEject) {\n bubble.remove();\n // this.bubbleGroups.removeAndUnmountBubble(bubble);\n }\n\n this.bubblesToEject.clear();\n }\n\n public groupBubbles(items: Array<{\n // Awaited> &\n bubble: HTMLElement,\n message: Message.message | Message.messageService\n }/* & {\n unmountIfFound?: boolean\n } */>) {\n let modifiedGroups: typeof groups;\n\n if(this.chat.type === 'scheduled') {\n modifiedGroups = new Set();\n items.forEach(({bubble, message}) => {\n const item = this.bubbleGroups.getItemByBubble(bubble);\n const group = item?.group;\n if(group && item.message.date !== message.date) {\n this.bubbleGroups.removeItem(item);\n modifiedGroups.add(group);\n }\n });\n }\n\n items.forEach(({bubble, message}) => {\n this.bubbleGroups.prepareForGrouping(bubble, message);\n });\n\n const groups = this.bubbleGroups.groupUngrouped();\n\n const avatarPromises = Array.from(groups).map((group) => {\n if(group.avatar) return;\n const firstItem = group.firstItem;\n if(firstItem && this.chat.isAvatarNeeded(firstItem.message)) {\n return group.createAvatar(firstItem.message);\n }\n }).filter(Boolean);\n\n if(modifiedGroups) {\n for(const group of modifiedGroups) {\n groups.add(group);\n }\n }\n\n return {\n groups: [...groups],\n avatarPromises\n };\n }\n\n public getMiddleware(additionalCallback?: () => boolean) {\n return this.middlewareHelper.get(additionalCallback);\n }\n\n private async wrapMediaSpoiler({\n media,\n promise,\n middleware,\n attachmentDiv\n }: {\n media: Photo.photo | MyDocument,\n promise: Promise,\n middleware: Middleware,\n attachmentDiv: HTMLElement\n }) {\n await promise;\n if(!middleware()) {\n return;\n }\n\n const {width, height} = attachmentDiv.style;\n const container = await wrapMediaSpoiler({\n media,\n width: parseInt(width),\n height: parseInt(height),\n middleware,\n animationGroup: this.chat.animationGroup\n });\n\n if(!middleware()) {\n return;\n }\n\n attachmentDiv.append(container);\n }\n\n private async safeRenderMessage(\n message: Message.message | Message.messageService,\n reverse?: boolean,\n bubble?: HTMLElement,\n updatePosition = true,\n processResult?: (result: ReturnType, bubble: HTMLElement) => typeof result\n ) {\n if(!message || this.renderingMessages.has(message.mid) || (this.bubbles[message.mid] && !bubble)) {\n return;\n }\n\n const middlewareHelper = this.getMiddleware().create();\n const middleware = middlewareHelper.get();\n\n let result: Awaited> & {updatePosition: typeof updatePosition};\n try {\n this.renderingMessages.add(message.mid);\n\n // const groupedId = (message as Message.message).grouped_id;\n const newBubble = document.createElement('div');\n newBubble.middlewareHelper = middlewareHelper;\n newBubble.dataset.mid = '' + message.mid;\n newBubble.dataset.peerId = '' + message.peerId;\n newBubble.dataset.timestamp = '' + message.date;\n\n // const bubbleNew: Bubble = this.bubblesNew[message.mid] ??= {\n // bubble: newBubble,\n // mids: new Set(),\n // groupedId\n // };\n\n // bubbleNew.mids.add(message.mid);\n\n if(bubble) {\n bubble.middlewareHelper.destroy();\n this.skippedMids.delete(message.mid);\n\n this.bubblesToEject.add(bubble);\n this.bubblesToReplace.delete(bubble);\n this.bubblesToReplace.set(newBubble, bubble);\n this.bubbleGroups.changeBubbleByBubble(bubble, newBubble);\n }\n\n bubble = this.bubbles[message.mid] = newBubble;\n let originalPromise = this.renderMessage(message, reverse, bubble, middleware);\n if(processResult) {\n originalPromise = processResult(originalPromise, bubble);\n }\n\n const promise = originalPromise.then((r) => ((r && middleware() ? {...r, updatePosition} : undefined) as typeof result));\n\n this.renderMessagesQueue(promise.catch(() => undefined));\n\n result = await promise;\n if(!middleware()) {\n return;\n }\n\n if(!result) {\n this.skippedMids.add(+message.mid);\n }\n } catch(err) {\n this.log.error('renderMessage error:', err);\n }\n\n if(!middleware()) {\n return;\n }\n\n this.renderingMessages.delete(message.mid);\n return result;\n }\n\n // reverse means top\n private async renderMessage(\n message: Message.message | Message.messageService,\n reverse = false,\n bubble: HTMLElement,\n middleware: Middleware\n ) {\n // if(DEBUG) {\n // this.log('message to render:', message);\n // }\n\n // if(!bubble && this.bubbles[message.mid]) {\n // return;\n // }\n\n // await pause(1000);\n\n const isMessage = message._ === 'message';\n const groupedId = isMessage && message.grouped_id;\n let albumMids: number[], reactionsMessage: Message.message;\n const albumMessages = groupedId ? await this.managers.appMessagesManager.getMessagesByAlbum(groupedId) : undefined;\n\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\n\n if(groupedId && albumMustBeRenderedFull) { // will render only last album's message\n albumMids = albumMessages.map((message) => message.mid);\n const mainMid = getMainMidForGrouped(albumMids);\n if(message.mid !== mainMid) {\n return;\n }\n }\n\n if(isMessage) {\n reactionsMessage = groupedId ? albumMessages[0] : message;\n }\n\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\n const our = this.chat.isOurMessage(message);\n\n const messageDiv = document.createElement('div');\n messageDiv.classList.add('message', 'spoilers-container');\n\n const contentWrapper = document.createElement('div');\n contentWrapper.classList.add('bubble-content-wrapper');\n\n const bubbleContainer = document.createElement('div');\n bubbleContainer.classList.add('bubble-content');\n\n bubble.classList.add('bubble');\n contentWrapper.append(bubbleContainer);\n bubble.append(contentWrapper);\n\n let isInUnread = !our &&\n !message.pFlags.out &&\n (\n message.pFlags.unread ||\n isMentionUnread(message)\n );\n\n if(!isInUnread && this.chat.peerId.isAnyChat()) {\n const readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.chat.peerId, this.chat.threadId);\n if(readMaxId !== undefined && readMaxId < message.mid) {\n isInUnread = true;\n }\n }\n\n if(isInUnread && this.observer) {\n // this.log('not our message', message, message.pFlags.unread);\n this.observer.observe(bubble, this.unreadedObserverCallback);\n this.unreaded.set(bubble, message.mid);\n }\n\n const loadPromises: Promise[] = [];\n const ret = {\n bubble,\n promises: loadPromises,\n message,\n reverse\n };\n\n const wrapOptions: WrapSomethingOptions = {\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n customEmojiSize: this.chat.appImManager.customEmojiSize,\n animationGroup: this.chat.animationGroup\n };\n\n if(message._ === 'messageService' && (!message.action || !SERVICE_AS_REGULAR.has(message.action._))) {\n const action = message.action;\n if(action) {\n const _ = action._;\n\n const ignoreAction = IGNORE_ACTIONS.get(_);\n if(ignoreAction && (ignoreAction === true || ignoreAction(message))) {\n return;\n }\n\n if(langPack.hasOwnProperty(_) && !langPack[_]) {\n return;\n }\n }\n\n bubble.className = 'bubble service';\n\n bubbleContainer.innerHTML = '';\n const s = document.createElement('div');\n s.classList.add('service-msg');\n if(action) {\n let promise: Promise;\n if(action._ === 'messageActionChannelMigrateFrom') {\n const peerTitle = new PeerTitle();\n promise = peerTitle.update({peerId: action.chat_id.toPeerId(true), wrapOptions});\n s.append(i18n('ChatMigration.From', [peerTitle.element]));\n } else if(action._ === 'messageActionChatMigrateTo') {\n const peerTitle = new PeerTitle();\n promise = peerTitle.update({peerId: action.channel_id.toPeerId(true), wrapOptions});\n s.append(i18n('ChatMigration.To', [peerTitle.element]));\n } else {\n s.append(await wrapMessageActionTextNew({\n message,\n ...wrapOptions\n }));\n }\n }\n bubbleContainer.append(s);\n\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\n bubble.classList.add('is-group-last');\n }\n\n return ret;\n }\n\n let messageMedia: MessageMedia = isMessage && message.media;\n let needToSetHTML = true;\n let messageMessage: string, totalEntities: MessageEntity[];\n if(isMessage) {\n if(groupedId && albumMustBeRenderedFull) {\n const t = getAlbumText(albumMessages);\n messageMessage = t?.message || '';\n // totalEntities = t.entities;\n totalEntities = t?.totalEntities || [];\n } else {\n messageMessage = message.message;\n // totalEntities = message.entities;\n totalEntities = message.totalEntities;\n }\n\n const document = (messageMedia as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n if(document?.type === 'sticker') {\n messageMessage = totalEntities = undefined;\n } else if(!['video', 'gif'].includes(document.type)) {\n needToSetHTML = false;\n }\n }\n } else {\n if(message.action._ === 'messageActionPhoneCall') {\n messageMedia = {\n _: 'messageMediaCall',\n action: message.action\n };\n }\n }\n\n let bigEmojis = 0, customEmojiSize: MediaSize;\n if(totalEntities && !messageMedia) {\n const emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji'/* || e._ === 'messageEntityCustomEmoji' */);\n const strLength = messageMessage.replace(/\\s/g, '').length;\n const emojiStrLength = emojiEntities.reduce((acc, curr) => acc + curr.length, 0);\n\n if(emojiStrLength === strLength /* && emojiEntities.length <= 3 *//* && totalEntities.length === emojiEntities.length */) {\n bigEmojis = Math.min(BIG_EMOJI_SIZES_LENGTH, emojiEntities.length);\n\n customEmojiSize = mediaSizes.active.customEmoji;\n\n const size = BIG_EMOJI_SIZES[bigEmojis];\n if(size) {\n customEmojiSize = makeMediaSize(size, size);\n bubble.style.setProperty('--emoji-size', size + 'px');\n }\n }\n }\n\n customEmojiSize ??= this.chat.appImManager.customEmojiSize;\n\n const richText = wrapRichText(messageMessage, {\n entities: totalEntities,\n passEntities: this.passEntities,\n loadPromises,\n lazyLoadQueue: this.lazyLoadQueue,\n customEmojiSize,\n middleware,\n animationGroup: this.chat.animationGroup\n });\n\n let canHaveTail = true;\n let isStandaloneMedia = false;\n let attachmentDiv: HTMLElement;\n if(bigEmojis) {\n if(rootScope.settings.emoji.big) {\n const sticker = bigEmojis === 1 &&\n !totalEntities.find((entity) => entity._ === 'messageEntityCustomEmoji') &&\n await this.managers.appStickersManager.getAnimatedEmojiSticker(messageMessage);\n if(bigEmojis === 1 && !messageMedia && sticker) {\n messageMedia = {\n _: 'messageMediaDocument',\n document: sticker\n };\n } else {\n attachmentDiv = document.createElement('div');\n attachmentDiv.classList.add('attachment', 'spoilers-container');\n\n setInnerHTML(attachmentDiv, richText);\n\n bubbleContainer.append(attachmentDiv);\n }\n\n bubble.classList.add('is-message-empty', 'emoji-big');\n isStandaloneMedia = true;\n canHaveTail = false;\n needToSetHTML = false;\n }\n\n bubble.classList.add('can-have-big-emoji');\n }\n\n if(needToSetHTML) {\n setInnerHTML(messageDiv, richText);\n }\n\n const haveRTLChar = isRTL(messageMessage, true);\n\n const timeSpan = MessageRender.setTime({\n chatType: this.chat.type,\n message,\n reactionsMessage\n });\n messageDiv.append(timeSpan);\n bubbleContainer.prepend(messageDiv);\n // bubble.prepend(timeSpan, messageDiv); // that's bad\n\n if(haveRTLChar) {\n timeSpan.classList.add('is-block');\n }\n\n let topicNameButtonContainer: HTMLElement;\n if(isMessage && this.chat.isAllMessagesForum) {\n const result = await wrapTopicNameButton({\n peerId: this.peerId,\n threadId: getMessageThreadId(message, this.chat.isForum),\n lastMsgId: message.mid,\n wrapOptions: {\n middleware\n },\n withIcons: true\n });\n\n const {element} = result;\n // if(isStandaloneMedia) {\n // element.classList.add('floating-part');\n // }\n\n topicNameButtonContainer = document.createElement('div');\n topicNameButtonContainer.classList.add(/* 'name', */'topic-name-button-container');\n topicNameButtonContainer.append(element);\n }\n\n if(isMessage && message.views) {\n bubble.classList.add('channel-post');\n\n if(!message.fwd_from?.saved_from_msg_id && this.chat.type !== 'pinned') {\n const forward = document.createElement('div');\n forward.classList.add('bubble-beside-button', 'forward', 'tgico-forward_filled');\n bubbleContainer.prepend(forward);\n bubble.classList.add('with-beside-button');\n }\n\n if(!message.pFlags.is_outgoing && this.observer) {\n this.observer.observe(bubble, this.viewsObserverCallback);\n }\n }\n\n const replyMarkup = isMessage && message.reply_markup;\n let replyMarkupRows = replyMarkup?._ === 'replyInlineMarkup' && replyMarkup.rows;\n if(replyMarkupRows) {\n replyMarkupRows = replyMarkupRows.filter((row) => row.buttons.length);\n }\n\n if(replyMarkupRows) {\n const containerDiv = document.createElement('div');\n containerDiv.classList.add('reply-markup');\n replyMarkupRows.forEach((row) => {\n const buttons = row.buttons;\n\n const rowDiv = document.createElement('div');\n rowDiv.classList.add('reply-markup-row');\n\n buttons.forEach((button) => {\n let text: DocumentFragment | HTMLElement | string = wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\n\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\n\n switch(button._) {\n case 'keyboardButtonUrl': {\n const r = wrapRichText(' ', {\n entities: [{\n _: 'messageEntityTextUrl',\n length: 1,\n offset: 0,\n url: button.url\n }]\n });\n\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\n buttonEl.classList.add('is-link');\n\n break;\n }\n\n case 'keyboardButtonSwitchInline': {\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-switch-inline');\n attachClickEvent(buttonEl, (e) => {\n cancelEvent(e);\n\n const botId = message.viaBotId || message.fromId;\n let promise: Promise;\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\n else promise = this.managers.appInlineBotsManager.checkSwitchReturn(botId).then((peerId) => {\n if(peerId) {\n return peerId;\n }\n\n return new Promise((resolve, reject) => {\n const popup = new PopupForward(undefined, (peerId) => {\n resolve(peerId);\n });\n\n popup.addEventListener('close', () => {\n reject();\n });\n });\n });\n\n promise.then((peerId) => {\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\n this.chat.appImManager.setInnerPeer({peerId});\n this.managers.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\n });\n });\n break;\n }\n\n case 'keyboardButtonBuy': {\n const mediaInvoice = messageMedia._ === 'messageMediaInvoice' ? messageMedia : undefined;\n if(mediaInvoice?.extended_media) {\n break;\n }\n\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-buy');\n\n if(mediaInvoice?.receipt_msg_id) {\n text = i18n('Message.ReplyActionButtonShowReceipt');\n }\n\n break;\n }\n\n case 'keyboardButtonUrlAuth': {\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-url-auth');\n\n const {peerId} = this;\n const {mid} = message;\n const {url, button_id} = button;\n\n attachClickEvent(buttonEl, () => {\n const toggle = toggleDisability([buttonEl], true);\n this.chat.appImManager.handleUrlAuth({\n peerId,\n mid,\n url,\n buttonId: button_id\n }).then(() => {\n toggle();\n });\n });\n break;\n }\n\n default: {\n buttonEl = document.createElement('button');\n break;\n }\n }\n\n if(!buttonEl) {\n return;\n }\n\n buttonEl.classList.add('reply-markup-button', 'rp', 'tgico');\n const t = document.createElement('span');\n t.classList.add('reply-markup-button-text');\n if(typeof(text) === 'string') {\n t.insertAdjacentHTML('beforeend', text);\n } else {\n t.append(text);\n }\n\n ripple(buttonEl);\n buttonEl.append(t);\n\n rowDiv.append(buttonEl);\n });\n\n if(!rowDiv.childElementCount) {\n return;\n }\n\n containerDiv.append(rowDiv);\n });\n\n const haveButtons = !!containerDiv.childElementCount;\n\n haveButtons && attachClickEvent(containerDiv, (e) => {\n let target = e.target as HTMLElement;\n\n if(!target.classList.contains('reply-markup-button')) target = findUpClassName(target, 'reply-markup-button');\n if(\n !target ||\n target.classList.contains('is-link') ||\n target.classList.contains('is-switch-inline') ||\n target.classList.contains('is-buy') ||\n target.classList.contains('is-url-auth')\n ) return;\n\n cancelEvent(e);\n\n const column = whichChild(target);\n const row = replyMarkupRows[whichChild(target.parentElement)];\n\n if(!row.buttons || !row.buttons[column]) {\n this.log.warn('no such button', row, column, message);\n return;\n }\n\n const button = row.buttons[column];\n this.managers.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button).then((callbackAnswer) => {\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\n toast(wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\n }\n\n // console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\n });\n });\n\n if(haveButtons) {\n // canHaveTail = false;\n bubble.classList.add('with-reply-markup');\n contentWrapper.append(containerDiv);\n }\n }\n\n const isOutgoing = message.pFlags.is_outgoing/* && this.peerId !== rootScope.myId */;\n if(our) {\n if(message.pFlags.unread || isOutgoing) this.unreadOut.add(message.mid);\n let status = '';\n if(message.error) status = 'is-error';\n else if(isOutgoing) status = 'is-sending';\n else status = message.pFlags.unread || (message as Message.message).pFlags.is_scheduled ? 'is-sent' : 'is-read';\n bubble.classList.add(status);\n }\n\n if(isOutgoing && !message.error) {\n bubble.classList.add('is-outgoing');\n }\n\n const messageWithReplies = isMessage && await this.managers.appMessagesManager.getMessageWithCommentReplies(message);\n const withReplies = !!messageWithReplies && message.mid > 0;\n\n if(withReplies) {\n bubble.classList.add('with-replies');\n }\n\n const fwdFrom = isMessage && message.fwd_from;\n const fwdFromId = isMessage && message.fwdFromId;\n\n const isOut = this.chat.isOutMessage(message);\n let nameContainer: HTMLElement = bubbleContainer;\n\n const canHideNameIfMedia = !message.viaBotId && (message.fromId === rootScope.myId || !message.pFlags.out);\n\n const isMessageEmpty = !messageMessage/* && (!topicNameButtonContainer || isStandaloneMedia) */;\n\n let viewButton: HTMLAnchorElement;\n // media\n if(messageMedia/* && messageMedia._ === 'messageMediaPhoto' */) {\n attachmentDiv = document.createElement('div');\n attachmentDiv.classList.add('attachment');\n\n if(isMessageEmpty) {\n bubble.classList.add('is-message-empty');\n }\n\n let processingWebPage = false;\n\n /* if(isMessage) */switch(messageMedia._) {\n case 'messageMediaPhoto': {\n const photo = messageMedia.photo;\n // //////this.log('messageMediaPhoto', photo);\n\n if(isMessageEmpty) {\n canHaveTail = false;\n }\n\n if(canHideNameIfMedia) {\n bubble.classList.add('hide-name');\n }\n\n bubble.classList.add('photo');\n\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\n bubble.classList.add('is-album', 'is-grouped');\n wrapAlbum({\n messages: albumMessages,\n attachmentDiv,\n middleware: this.getMiddleware(),\n isOut: our,\n lazyLoadQueue: this.lazyLoadQueue,\n chat: this.chat,\n loadPromises,\n autoDownload: this.chat.autoDownload\n });\n\n break;\n }\n\n const withTail = !IS_ANDROID && canHaveTail && !withReplies && USE_MEDIA_TAILS;\n if(withTail) bubble.classList.add('with-media-tail');\n const p = wrapPhoto({\n photo: photo as Photo.photo,\n message,\n container: attachmentDiv,\n withTail,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n loadPromises,\n autoDownloadSize: this.chat.autoDownload.photo\n });\n\n if(messageMedia.pFlags.spoiler) {\n loadPromises.push(this.wrapMediaSpoiler({\n media: photo as Photo.photo,\n promise: p,\n middleware,\n attachmentDiv\n }));\n }\n\n break;\n }\n\n case 'messageMediaWebPage': {\n processingWebPage = true;\n\n const webPage: WebPage = messageMedia.webpage;\n // //////this.log('messageMediaWebPage', webpage);\n if(webPage._ !== 'webPage') {\n break;\n }\n\n const wrapped = wrapUrl(webPage.url);\n if(wrapped?.onclick === 'im') {\n const map: {[type: string]: LangPackKey} = {\n telegram_channel: 'Chat.Message.ViewChannel',\n telegram_megagroup: 'OpenGroup',\n telegram_bot: 'Chat.Message.ViewBot'\n };\n\n const langPackKey = map[webPage.type] || 'OpenMessage';\n viewButton = this.makeViewButton({text: langPackKey, asLink: true});\n viewButton.href = wrapped.url;\n viewButton.setAttribute('onclick', `${wrapped.onclick}(this)`);\n }\n\n bubble.classList.add('webpage');\n\n const box = document.createElement('div');\n box.classList.add('web');\n\n const quote = document.createElement('div');\n quote.classList.add('quote');\n\n let previewResizer: HTMLDivElement, preview: HTMLDivElement;\n const photo: Photo.photo = webPage.photo as any;\n if(photo || webPage.document) {\n previewResizer = document.createElement('div');\n previewResizer.classList.add('preview-resizer');\n preview = document.createElement('div');\n preview.classList.add('preview');\n previewResizer.append(preview);\n }\n\n const quoteTextDiv = document.createElement('div');\n quoteTextDiv.classList.add('quote-text');\n\n const doc = webPage.document as MyDocument;\n if(doc) {\n if(doc.type === 'gif' || doc.type === 'video' || doc.type === 'round') {\n // if(doc.size <= 20e6) {\n const mediaSize = doc.type === 'round' ? mediaSizes.active.round : mediaSizes.active.webpage;\n if(doc.type === 'round') {\n bubble.classList.add('round');\n preview.classList.add('is-round');\n } else {\n bubble.classList.add('video');\n }\n wrapVideo({\n doc,\n container: preview,\n message: message as Message.message,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n isOut,\n group: this.chat.animationGroup,\n loadPromises,\n autoDownload: this.chat.autoDownload,\n noInfo: message.mid < 0\n });\n // }\n } else {\n const docDiv = await wrapDocument({\n message: message as Message.message,\n autoDownloadSize: this.chat.autoDownload.file,\n lazyLoadQueue: this.lazyLoadQueue,\n loadPromises,\n sizeType: 'documentName',\n searchContext: {\n useSearch: false,\n peerId: this.peerId,\n inputFilter: {\n _: 'inputMessagesFilterEmpty'\n }\n },\n fontSize: rootScope.settings.messagesTextSize\n });\n preview.append(docDiv);\n preview.classList.add('preview-with-document');\n quoteTextDiv.classList.add('has-document');\n // messageDiv.classList.add((webpage.type || 'document') + '-message');\n // doc = null;\n }\n }\n\n if(previewResizer) {\n quoteTextDiv.append(previewResizer);\n }\n\n let t: HTMLElement;\n if(webPage.site_name) {\n const html = wrapRichText(webPage.url);\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\n a.classList.add('webpage-name');\n const strong = document.createElement('strong');\n setInnerHTML(strong, wrapEmojiText(webPage.site_name));\n a.textContent = '';\n a.append(strong);\n quoteTextDiv.append(a);\n t = a;\n }\n\n const title = wrapWebPageTitle(webPage);\n if(title.textContent) {\n const titleDiv = document.createElement('div');\n titleDiv.classList.add('title');\n const strong = document.createElement('strong');\n setInnerHTML(strong, title);\n titleDiv.append(strong);\n quoteTextDiv.append(titleDiv);\n t = titleDiv;\n }\n\n const description = wrapWebPageDescription(webPage);\n if(description.textContent) {\n const textDiv = document.createElement('div');\n textDiv.classList.add('text');\n setInnerHTML(textDiv, description);\n quoteTextDiv.append(textDiv);\n t = textDiv;\n }\n\n /* if(t) {\n t.append(timeSpan);\n } else {\n box.classList.add('no-text');\n } */\n\n quote.append(quoteTextDiv);\n\n if(photo && !doc) {\n bubble.classList.add('photo');\n\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\n let isSquare = false;\n if(size.w === size.h && t) {\n bubble.classList.add('is-square-photo');\n isSquare = true;\n setAttachmentSize(photo, preview, 48, 48, false);\n\n /* if(t) {\n t.append(timeSpan);\n } */\n } else if(size.h > size.w) {\n bubble.classList.add('is-vertical-photo');\n }\n\n wrapPhoto({\n photo,\n message,\n container: preview,\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width,\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n loadPromises,\n withoutPreloader: isSquare,\n autoDownloadSize: this.chat.autoDownload.photo\n });\n }\n\n box.append(quote);\n\n // bubble.prepend(box);\n // if(timeSpan.parentElement === messageDiv) {\n messageDiv.insertBefore(box, timeSpan);\n // } else {\n // messageDiv.append(box);\n // }\n\n // this.log('night running', bubble.scrollHeight);\n\n break;\n }\n\n case 'messageMediaDocument': {\n const doc = messageMedia.document as MyDocument;\n\n // this.log('messageMediaDocument', doc, bubble);\n\n if(doc.sticker/* && doc.size <= 1e6 */) {\n bubble.classList.add('sticker');\n canHaveTail = false;\n isStandaloneMedia = true;\n\n if(doc.animated) {\n bubble.classList.add('sticker-animated');\n }\n\n const sizes = mediaSizes.active;\n const isEmoji = bubble.classList.contains('emoji-big');\n const boxSize = isEmoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\n setAttachmentSize(doc, attachmentDiv, boxSize.width, boxSize.height);\n // let preloader = new ProgressivePreloader(attachmentDiv, false);\n bubbleContainer.style.minWidth = attachmentDiv.style.width;\n bubbleContainer.style.minHeight = attachmentDiv.style.height;\n // appPhotosManager.setAttachmentSize(doc, bubble);\n wrapSticker({\n doc,\n div: attachmentDiv,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n group: this.chat.animationGroup,\n // play: !!message.pending || !multipleRender,\n play: true,\n loop: true,\n emoji: isEmoji ? messageMessage : undefined,\n withThumb: true,\n loadPromises,\n isOut,\n noPremium: messageMedia?.pFlags?.nopremium\n });\n\n if((getStickerEffectThumb(doc) || isEmoji) && (isInUnread || isOutgoing)/* || true */) {\n this.observer.observe(bubble, this.stickerEffectObserverCallback);\n }\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\n // this.log('never get free 2', doc);\n\n const isRound = doc.type === 'round';\n if(isRound) {\n isStandaloneMedia = true;\n }\n\n if(isRound || isMessageEmpty) {\n canHaveTail = false;\n }\n\n if(canHideNameIfMedia) {\n bubble.classList.add('hide-name');\n }\n\n bubble.classList.add(isRound ? 'round' : 'video');\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\n bubble.classList.add('is-album', 'is-grouped');\n\n wrapAlbum({\n messages: albumMessages,\n attachmentDiv,\n middleware,\n isOut: our,\n lazyLoadQueue: this.lazyLoadQueue,\n chat: this.chat,\n loadPromises,\n autoDownload: this.chat.autoDownload\n });\n } else {\n const withTail = !IS_ANDROID && !IS_APPLE && !isRound && canHaveTail && !withReplies && USE_MEDIA_TAILS;\n if(withTail) bubble.classList.add('with-media-tail');\n const p = wrapVideo({\n doc,\n container: attachmentDiv,\n message: message as Message.message,\n boxWidth: mediaSizes.active.regular.width,\n boxHeight: mediaSizes.active.regular.height,\n withTail,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n group: this.chat.animationGroup,\n loadPromises,\n autoDownload: this.chat.autoDownload,\n searchContext: isRound ? {\n peerId: this.peerId,\n inputFilter: {_: 'inputMessagesFilterRoundVoice'},\n threadId: this.chat.threadId,\n useSearch: !(message as Message.message).pFlags.is_scheduled,\n isScheduled: (message as Message.message).pFlags.is_scheduled\n } : undefined,\n noInfo: message.mid < 0,\n noAutoplayAttribute: !!messageMedia.pFlags.spoiler\n });\n\n if(messageMedia.pFlags.spoiler) {\n loadPromises.push(this.wrapMediaSpoiler({\n media: doc,\n promise: p,\n middleware,\n attachmentDiv\n }));\n }\n }\n } else {\n const newNameContainer = await wrapGroupedDocuments({\n albumMustBeRenderedFull,\n message,\n bubble,\n messageDiv,\n chat: this.chat,\n loadPromises,\n autoDownloadSize: this.chat.autoDownload.file,\n lazyLoadQueue: this.lazyLoadQueue,\n searchContext: doc.type === 'voice' || doc.type === 'audio' ? {\n peerId: this.peerId,\n inputFilter: {_: doc.type === 'voice' ? 'inputMessagesFilterRoundVoice' : 'inputMessagesFilterMusic'},\n threadId: this.chat.threadId,\n useSearch: !(message as Message.message).pFlags.is_scheduled,\n isScheduled: (message as Message.message).pFlags.is_scheduled\n } : undefined,\n sizeType: 'documentName',\n fontSize: rootScope.settings.messagesTextSize,\n richTextFragment: richText\n });\n\n if(newNameContainer) {\n nameContainer = newNameContainer;\n }\n\n const lastContainer = messageDiv.lastElementChild.querySelector('.document-message, .document, .audio');\n // lastContainer && lastContainer.append(timeSpan.cloneNode(true));\n lastContainer && lastContainer.append(timeSpan);\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add((!(['photo', 'pdf'] as MyDocument['type'][]).includes(doc.type) ? doc.type || 'document' : 'document') + '-message');\n processingWebPage = true;\n }\n\n break;\n }\n\n case 'messageMediaCall': {\n const action = messageMedia.action;\n const div = document.createElement('div');\n div.classList.add('bubble-call', action.pFlags.video ? 'tgico-videocamera' : 'tgico-phone');\n\n const type: CallType = action.pFlags.video ? 'video' : 'voice';\n div.dataset.type = type;\n\n const title = document.createElement('div');\n title.classList.add('bubble-call-title');\n\n _i18n(title, isOut ?\n (action.pFlags.video ? 'CallMessageVideoOutgoing' : 'CallMessageOutgoing') :\n (action.pFlags.video ? 'CallMessageVideoIncoming' : 'CallMessageIncoming'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('bubble-call-subtitle');\n\n if(action.duration !== undefined) {\n subtitle.append(formatCallDuration(action.duration));\n } else {\n let langPackKey: LangPackKey;\n switch(action.reason._) {\n case 'phoneCallDiscardReasonBusy':\n langPackKey = 'Call.StatusBusy';\n break;\n case 'phoneCallDiscardReasonMissed':\n langPackKey = 'Chat.Service.Call.Missed';\n break;\n // case 'phoneCallDiscardReasonHangup':\n default:\n langPackKey = 'Chat.Service.Call.Cancelled';\n break;\n }\n\n subtitle.classList.add('is-reason');\n _i18n(subtitle, langPackKey);\n }\n\n subtitle.classList.add('tgico', 'arrow-' + (action.duration !== undefined ? 'green' : 'red'));\n\n div.append(title, subtitle);\n\n processingWebPage = true;\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add('call-message');\n messageDiv.append(div);\n\n break;\n }\n\n case 'messageMediaContact': {\n // this.log('wrapping contact', message);\n\n const contact = messageMedia;\n const contactDiv = document.createElement('div');\n contactDiv.classList.add('contact');\n contactDiv.dataset.peerId = '' + contact.user_id;\n\n processingWebPage = true;\n\n const contactDetails = document.createElement('div');\n contactDetails.className = 'contact-details';\n const contactNameDiv = document.createElement('div');\n contactNameDiv.className = 'contact-name';\n const fullName = [\n contact.first_name,\n contact.last_name\n ].filter(Boolean).join(' ');\n contactNameDiv.append(\n fullName.trim() ? wrapEmojiText(fullName) : i18n('AttachContact')\n );\n\n const contactNumberDiv = document.createElement('div');\n contactNumberDiv.className = 'contact-number';\n contactNumberDiv.textContent = contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number';\n\n contactDiv.append(contactDetails);\n contactDetails.append(contactNameDiv, contactNumberDiv);\n\n const avatarElem = new AvatarElement();\n avatarElem.updateWithOptions({\n lazyLoadQueue: this.lazyLoadQueue,\n peerId: contact.user_id.toPeerId(),\n peerTitle: fullName.trim() ? undefined : I18n.format('AttachContact', true)[0]\n });\n avatarElem.classList.add('contact-avatar', 'avatar-54');\n\n contactDiv.prepend(avatarElem);\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add('contact-message');\n messageDiv.append(contactDiv);\n\n break;\n }\n\n case 'messageMediaPoll': {\n bubble.classList.remove('is-message-empty');\n\n const pollElement = wrapPoll(message);\n messageDiv.prepend(pollElement);\n messageDiv.classList.add('poll-message');\n\n break;\n }\n\n case 'messageMediaInvoice': {\n const isTest = messageMedia.pFlags.test;\n const extendedMedia = messageMedia.extended_media;\n const isAlreadyPaid = extendedMedia?._ === 'messageExtendedMedia';\n const isNotPaid = extendedMedia?._ === 'messageExtendedMediaPreview';\n let innerMedia = isAlreadyPaid ?\n (extendedMedia.media as MessageMedia.messageMediaPhoto).photo as Photo.photo ||\n (extendedMedia.media as MessageMedia.messageMediaDocument).document as Document.document :\n messageMedia.photo;\n\n const wrappedPrice = paymentsWrapCurrencyAmount(messageMedia.total_amount, messageMedia.currency);\n let priceEl: HTMLElement;\n if(!extendedMedia) {\n priceEl = document.createElement(innerMedia ? 'span' : 'div');\n const f = document.createDocumentFragment();\n const l = i18n(messageMedia.receipt_msg_id ? 'PaymentReceipt' : (isTest ? 'PaymentTestInvoice' : 'PaymentInvoice'));\n l.classList.add('text-uppercase');\n const joiner = ' ' + NBSP;\n const p = document.createElement('span');\n p.classList.add('text-bold');\n p.textContent = wrappedPrice + joiner;\n f.append(p, l);\n if(isTest && messageMedia.receipt_msg_id) {\n const a = document.createElement('span');\n a.classList.add('text-uppercase', 'pre-wrap');\n a.append(joiner + '(Test)');\n f.append(a);\n }\n setInnerHTML(priceEl, f);\n } else if(isNotPaid) {\n priceEl = document.createElement('span');\n priceEl.classList.add('extended-media-buy', 'tgico-premium_lock');\n attachmentDiv.classList.add('is-buy');\n _i18n(priceEl, 'Checkout.PayPrice', [wrappedPrice]);\n\n if(extendedMedia.video_duration !== undefined) {\n const videoTime = document.createElement('span');\n videoTime.classList.add('video-time');\n videoTime.textContent = toHHMMSS(extendedMedia.video_duration, false);\n attachmentDiv.append(videoTime);\n }\n }\n\n if(isNotPaid) {\n (extendedMedia.thumb as PhotoSize.photoStrippedSize).w = extendedMedia.w;\n (extendedMedia.thumb as PhotoSize.photoStrippedSize).h = extendedMedia.h;\n innerMedia = {\n _: 'photo',\n access_hash: '',\n pFlags: {},\n date: 0,\n dc_id: 0,\n file_reference: [],\n id: 0,\n sizes: [extendedMedia.thumb]\n };\n }\n\n if(innerMedia) {\n const mediaSize = extendedMedia ? mediaSizes.active.extendedInvoice : mediaSizes.active.invoice;\n if(innerMedia._ === 'document') {\n wrapVideo({\n doc: innerMedia,\n container: attachmentDiv,\n withTail: false,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n loadPromises,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n group: this.chat.animationGroup,\n message: message as Message.message\n });\n bubble.classList.add('video');\n } else {\n wrapPhoto({\n photo: innerMedia,\n container: attachmentDiv,\n withTail: false,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n loadPromises,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n message: isAlreadyPaid ? message : undefined\n });\n bubble.classList.add('photo');\n }\n\n if(priceEl) {\n if(!extendedMedia) {\n priceEl.classList.add('video-time');\n }\n\n attachmentDiv.append(priceEl);\n }\n } else {\n attachmentDiv = undefined;\n }\n\n if(isNotPaid) {\n const {mid} = message;\n this.extendedMediaMessages.add(mid);\n middleware.onClean(() => {\n this.extendedMediaMessages.delete(mid);\n });\n this.setExtendedMediaMessagesPollInterval();\n\n const {width, height} = attachmentDiv.style;\n const dotRenderer = DotRenderer.create({\n width: parseInt(width),\n height: parseInt(height),\n middleware,\n animationGroup: this.chat.animationGroup\n });\n attachmentDiv.append(dotRenderer.canvas);\n }\n\n let titleDiv: HTMLElement;\n if(!extendedMedia) {\n titleDiv = document.createElement('div');\n titleDiv.classList.add('bubble-primary-color');\n setInnerHTML(titleDiv, wrapEmojiText(messageMedia.title));\n }\n\n const richText = isAlreadyPaid ? undefined : wrapEmojiText(messageMedia.description);\n messageDiv.prepend(...[titleDiv, !innerMedia && priceEl, richText].filter(Boolean));\n\n if(!richText) canHaveTail = false;\n else bubble.classList.remove('is-message-empty');\n bubble.classList.add('is-invoice');\n\n break;\n }\n\n default:\n attachmentDiv = undefined;\n bubble.classList.remove('is-message-empty');\n messageDiv.append(i18n(UNSUPPORTED_LANG_PACK_KEY), timeSpan);\n this.log.warn('unrecognized media type:', messageMedia._, message);\n break;\n }\n\n if(!processingWebPage && attachmentDiv) {\n bubbleContainer.append(attachmentDiv);\n }\n\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\n bubble.classList.add('no-tail');\n\n if(!bubble.classList.contains('with-media-tail')) {\n bubble.classList.add('use-border-radius');\n }\n } */\n }\n\n if(isStandaloneMedia) {\n bubble.classList.add('just-media');\n }\n\n if(viewButton) {\n timeSpan.before(viewButton);\n // messageDiv.append(viewButton);\n }\n\n let savedFrom = '';\n\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\n const needName = (message.fromId !== rootScope.myId && this.chat.isAnyGroup) || message.viaBotId || (message as Message.message).pFlags.sponsored;\n if(needName || fwdFrom || message.reply_to_mid || topicNameButtonContainer) { // chat\n let title: HTMLElement | DocumentFragment;\n let titleVia: typeof title;\n\n const isForwardFromChannel = message.from_id?._ === 'peerChannel' && message.fromId === fwdFromId;\n\n const mustHaveName = !!(message.viaBotId/* || topicNameButtonContainer */);\n const isHidden = fwdFrom && !fwdFrom.from_id;\n if(message.viaBotId) {\n titleVia = document.createElement('span');\n titleVia.innerText = '@' + (await this.managers.appPeersManager.getPeerUsername(message.viaBotId));\n titleVia.classList.add('peer-title');\n }\n\n if(mustHaveName) {\n bubble.classList.add('must-have-name');\n }\n\n const isForward = fwdFromId || fwdFrom;\n if(isHidden) {\n // /////this.log('message to render hidden', message);\n title = document.createElement('span');\n setInnerHTML(title, wrapEmojiText(fwdFrom.from_name));\n title.classList.add('peer-title');\n // title = fwdFrom.from_name;\n bubble.classList.add('hidden-profile');\n } else {\n title = new PeerTitle({peerId: fwdFromId || message.fromId, withPremiumIcon: !isForward, wrapOptions}).element;\n }\n\n let replyContainer: HTMLElement;\n if(\n isMessage &&\n message.reply_to_mid &&\n message.reply_to_mid !== this.chat.threadId &&\n (!this.chat.isAllMessagesForum || message.reply_to.reply_to_top_id)\n ) {\n replyContainer = await MessageRender.setReply({\n chat: this.chat,\n bubble,\n bubbleContainer,\n message\n });\n }\n\n // this.log(title);\n\n let nameDiv: HTMLElement;\n if(isForward) {\n if(this.peerId !== rootScope.myId && !isForwardFromChannel) {\n bubble.classList.add('forwarded');\n }\n\n if(message.savedFrom) {\n savedFrom = message.savedFrom;\n title.dataset.savedFrom = savedFrom;\n }\n\n nameDiv = document.createElement('div');\n title.dataset.peerId = '' + fwdFromId;\n\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\n nameDiv.style.color = getPeerColorById(fwdFromId, false);\n nameDiv.classList.add('colored-name');\n nameDiv.append(title);\n } else {\n /* const fromTitle = message.fromId === this.myID || appPeersManager.isBroadcast(fwdFromId || message.fromId) ? '' : `
${appPeersManager.getPeerTitle(message.fromId)}
`;\n nameDiv.innerHTML = fromTitle + 'Forwarded from ' + title; */\n const args: FormatterArguments = [title];\n if(isStandaloneMedia) {\n const br = document.createElement('br');\n br.classList.add('hide-ol');\n args.unshift(br);\n }\n nameDiv.append(i18n('ForwardedFrom', [args]));\n }\n } else if(!message.viaBotId) {\n if(!isStandaloneMedia && needName) {\n nameDiv = document.createElement('div');\n nameDiv.append(title);\n\n const peer = await this.managers.appPeersManager.getPeer(message.fromId);\n const pFlags = (peer as User.user)?.pFlags;\n if(pFlags && (pFlags.scam || pFlags.fake)) {\n nameDiv.append(generateFakeIcon(pFlags.scam));\n }\n\n if(!our) {\n nameDiv.style.color = getPeerColorById(message.fromId, false);\n nameDiv.classList.add('colored-name');\n }\n\n nameDiv.dataset.peerId = '' + message.fromId;\n } else /* if(!message.reply_to_mid) */ {\n bubble.classList.add('hide-name');\n }\n }\n\n if(message.viaBotId) {\n if(!nameDiv) {\n nameDiv = document.createElement('div');\n } else {\n nameDiv.append(' ');\n }\n\n const span = document.createElement('span');\n span.append(i18n('ViaBot'), ' ', titleVia);\n span.classList.add('is-via');\n\n nameDiv.append(span);\n }\n\n if(topicNameButtonContainer) {\n if(isStandaloneMedia) {\n topicNameButtonContainer.classList.add('floating-part');\n } else {\n if(!nameDiv) {\n nameDiv = document.createElement('div');\n }\n\n nameDiv.append(topicNameButtonContainer);\n\n bubble.classList.remove('hide-name');\n }\n }\n\n if(nameDiv) {\n nameDiv.classList.add('name');\n\n if(isStandaloneMedia) {\n nameContainer.append(nameContainer = document.createElement('div'));\n nameContainer.classList.add('name-with-reply', 'floating-part');\n } else {\n nameDiv.classList.add('floating-part');\n }\n\n nameContainer.append(nameDiv);\n\n if(isStandaloneMedia && replyContainer) {\n nameContainer.append(replyContainer);\n }\n } else if(isStandaloneMedia && replyContainer) {\n replyContainer.classList.add('floating-part');\n }\n\n if(topicNameButtonContainer && isStandaloneMedia) {\n if(!attachmentDiv) {\n this.log.error('no attachment div?', bubble, message);\n debugger;\n } else {\n attachmentDiv.after(topicNameButtonContainer);\n }\n }\n } else {\n bubble.classList.add('hide-name');\n }\n\n if(this.chat.type === 'pinned') {\n savedFrom = `${this.chat.peerId}_${message.mid}`;\n }\n\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\n if(isThreadStarter) {\n bubble.classList.add('is-thread-starter', 'is-group-last');\n }\n\n if(savedFrom && (this.chat.type === 'pinned' || fwdFrom.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\n const goto = document.createElement('div');\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\n bubbleContainer.append(goto);\n bubble.dataset.savedFrom = savedFrom;\n bubble.classList.add('with-beside-button');\n }\n\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\n\n if(withReplies) {\n const isFooter = MessageRender.renderReplies({\n bubble,\n bubbleContainer,\n message: messageWithReplies,\n messageDiv,\n loadPromises,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n if(isFooter) {\n canHaveTail = true;\n } else {\n bubble.classList.add('with-beside-replies');\n }\n }\n\n if(isMessage) {\n this.appendReactionsElementToBubble(bubble, message, reactionsMessage);\n }\n\n /* if(isMessage) {\n const reactionHover = document.createElement('div');\n reactionHover.classList.add('bubble-reaction-hover');\n contentWrapper.append(reactionHover);\n } */\n\n if(canHaveTail) {\n bubble.classList.add('can-have-tail');\n\n bubbleContainer.append(generateTail());\n }\n\n return ret;\n }\n\n private appendReactionsElementToBubble(\n bubble: HTMLElement,\n message: Message.message,\n reactionsMessage: Message.message,\n changedResults?: ReactionCount[]\n ) {\n if(this.peerId.isUser() && USER_REACTIONS_INLINE/* || true */) {\n return;\n }\n\n if(!reactionsMessage?.reactions || !reactionsMessage.reactions.results.length) {\n return;\n }\n\n // message = this.appMessagesManager.getMessageWithReactions(message);\n\n const reactionsElement = new ReactionsElement();\n reactionsElement.init(reactionsMessage, 'block', bubble.middlewareHelper.get());\n reactionsElement.render(changedResults);\n\n if(bubble.classList.contains('is-message-empty')) {\n bubble.querySelector('.bubble-content-wrapper').append(reactionsElement);\n } else {\n const messageDiv = bubble.querySelector('.message');\n if(bubble.classList.contains('is-multiple-documents')) {\n const documentContainer = messageDiv.lastElementChild as HTMLElement;\n let documentMessageDiv = documentContainer.querySelector('.document-message');\n\n let timeSpan: HTMLElement = documentMessageDiv && documentMessageDiv.querySelector('.time');\n if(!timeSpan) {\n timeSpan = MessageRender.setTime({\n chatType: this.chat.type,\n message,\n reactionsMessage\n });\n }\n\n reactionsElement.append(timeSpan);\n\n if(!documentMessageDiv) {\n documentMessageDiv = document.createElement('div');\n documentMessageDiv.classList.add('document-message');\n documentContainer.querySelector('.document-wrapper').prepend(documentMessageDiv);\n }\n\n documentMessageDiv.append(reactionsElement);\n } else {\n const timeSpan = Array.from(bubble.querySelectorAll('.time')).pop();\n reactionsElement.append(timeSpan);\n\n messageDiv.append(reactionsElement);\n }\n }\n }\n\n private prepareToSaveScroll(reverse?: boolean) {\n const isMounted = !!this.chatInner.parentElement;\n if(!isMounted) {\n return {};\n }\n\n const log = this.log.bindPrefix('prepareToSaveScroll');\n log('save');\n const scrollSaver = this.createScrollSaver(reverse);\n scrollSaver.save(); // * let's save scroll position by point before the slicing, not after\n\n if(this.getRenderedLength() && !this.chat.setPeerPromise) {\n const viewportSlice = this.getViewportSlice();\n this.deleteViewportSlice(viewportSlice, true);\n }\n\n // scrollSaver.save(); // ! slicing will corrupt scroll position\n // const saved = scrollSaver.getSaved();\n // const hadScroll = saved.scrollHeight !== saved.clientHeight;\n\n return {\n restoreScroll: () => {\n log('restore');\n // scrollSaver.restore(_history.length === 1 && !reverse ? false : true);\n scrollSaver.restore(reverse);\n this.onRenderScrollSet(scrollSaver.getSaved());\n },\n scrollSaver\n };\n }\n\n public async performHistoryResult(\n historyResult: HistoryResult | {history: (Message.message | Message.messageService | number)[]},\n reverse: boolean\n ) {\n const log = false ? this.log.bindPrefix('perform-' + (Math.random() * 1000 | 0)) : undefined;\n log?.('start', this.chatInner.parentElement);\n\n let history = historyResult.history;\n history = history.slice(); // need\n\n if(this.needReflowScroll) {\n reflowScrollableElement(this.scrollable.container);\n this.needReflowScroll = false;\n }\n\n const cb = (message: Message.message | Message.messageService) => {\n if(!message) {\n return;\n } else if(message.pFlags.local) {\n return this.processLocalMessageRender(message);\n } else {\n return this.safeRenderMessage(message, reverse);\n }\n };\n\n const messages = await Promise.all(history.map((mid) => {\n return typeof(mid) === 'number' ? this.chat.getMessage(mid) : mid;\n }));\n\n const setLoadedPromises: Promise[] = [];\n if(!this.scrollable.loadedAll['bottom'] || !this.scrollable.loadedAll['top']) {\n let isEnd = (historyResult as HistoryResult).isEnd;\n if(!isEnd) {\n const historyStorage = await this.chat.getHistoryStorage();\n const firstSlice = historyStorage.history.first;\n const lastSlice = historyStorage.history.last;\n isEnd = {top: false, bottom: false, both: false};\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\n isEnd.bottom = true;\n }\n\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\n isEnd.top = true;\n }\n }\n\n if(!isEnd.bottom && this.setPeerOptions) {\n const {lastMsgId, topMessage, savedPosition} = this.setPeerOptions;\n this.setPeerOptions = undefined;\n if((!lastMsgId && !savedPosition) || this.bubbles[topMessage] || lastMsgId === topMessage) {\n isEnd.bottom = true;\n }\n }\n\n if(isEnd.top) setLoadedPromises.push(this.setLoaded('top', true));\n if(isEnd.bottom) setLoadedPromises.push(this.setLoaded('bottom', true));\n }\n\n await Promise.all(setLoadedPromises);\n\n // ! it is important to insert bubbles to group reversed way\n // const length = history.length, promises: Promise[] = [];\n // if(reverse) for(let i = 0; i < length; ++i) promises.push(cb(messages[i]));\n // else for(let i = length - 1; i >= 0; --i) promises.push(cb(messages[i]));\n const promises = messages.map(cb);\n\n // cannot combine them into one promise\n await Promise.all(promises);\n await this.messagesQueuePromise;\n\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\n this.messagesQueueOnRenderAdditional();\n this.messagesQueueOnRenderAdditional?.(); // * can set it second time\n }\n\n log?.('performHistoryResult end');\n }\n\n private onRenderScrollSet(state?: {scrollHeight: number, clientHeight: number}) {\n const className = 'has-sticky-dates';\n if(!this.container.classList.contains(className)) {\n const isLoading = !this.preloader.detached;\n\n if(isLoading ||\n (\n state ??= {\n scrollHeight: this.scrollable.scrollHeight,\n clientHeight: this.scrollable.container.clientHeight\n },\n state.scrollHeight !== state.clientHeight\n )\n ) {\n /* for(const timestamp in this.dateMessages) {\n const dateMessage = this.dateMessages[timestamp];\n dateMessage.div.classList.add('is-sticky');\n } */\n\n const middleware = this.getMiddleware();\n const callback = () => {\n if(!middleware()) return;\n this.container.classList.add(className);\n };\n\n if(this.willScrollOnLoad) {\n callback();\n } else {\n setTimeout(callback, 600);\n }\n\n return;\n }\n }\n\n this.willScrollOnLoad = undefined;\n }\n\n public onDatePick = (timestamp: number) => {\n const peerId = this.peerId;\n this.managers.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then((history) => {\n if(!history?.messages?.length) {\n this.log.error('no history!');\n return;\n } else if(this.peerId !== peerId) {\n return;\n }\n\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\n // console.log('got history date:', history);\n });\n };\n\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\n // const middleware = this.getMiddleware();\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n return this.managers.acknowledged.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\n } else if(this.chat.type === 'pinned') {\n return this.managers.acknowledged.appMessagesManager.getSearch({\n peerId: this.peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId,\n limit: loadCount,\n backLimit\n }).then((ackedResult) => {\n return {\n cached: ackedResult.cached,\n result: Promise.resolve(ackedResult.result).then((value) => {\n return {history: value.history.map((m) => m.mid)};\n })\n };\n });\n } else if(this.chat.type === 'scheduled') {\n return this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((ackedResult) => {\n // this.setLoaded('top', true);\n // this.setLoaded('bottom', true);\n return {\n cached: ackedResult.cached,\n result: Promise.resolve(ackedResult.result).then((mids) => ({history: mids.slice().reverse()}))\n };\n });\n }\n }\n\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\n /* const middleware = this.getMiddleware();\n await this.ladderDeferred; */\n\n const log = this.log.bindPrefix('ladder');\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\n log.warn('will be delayed');\n // @ts-ignore\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\n return;\n }\n\n /* if(!middleware()) {\n return;\n } */\n\n if(!Object.keys(this.bubbles).length) {\n log.warn('no bubbles');\n return;\n }\n\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\n\n if(isAdditionRender && additionMsgIds.length) {\n sortedMids = sortedMids.filter((mid) => !additionMsgIds.includes(mid));\n }\n\n let targetMid: number;\n if(backLimit) {\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\n } else {\n if(additionMsgId) {\n targetMid = additionMsgId;\n } else { // * if maxId === 0\n targetMid = Math.max(...sortedMids);\n }\n }\n\n const topIds = sortedMids.slice(sortedMids.findIndex((mid) => targetMid > mid));\n const middleIds = isAdditionRender ? [] : [targetMid];\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex((mid) => targetMid >= mid)).reverse();\n\n if(DEBUG) {\n log('targeting mid:', targetMid, maxId, additionMsgId,\n topIds.map((m) => getServerMessageId(m)),\n bottomIds.map((m) => getServerMessageId(m)));\n }\n\n const setBubbles: HTMLElement[] = [];\n\n this.chatInner.classList.add('zoom-fading');\n const delay = isAdditionRender ? 10 : 40;\n const offsetIndex = isAdditionRender ? 0 : 1;\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\n const animationPromise = deferredPromise();\n let lastMsDelay = 0;\n mids.forEach((mid, idx) => {\n const bubble = this.bubbles[mid];\n if(!bubble || this.skippedMids.has(mid)) {\n log.warn('no bubble by mid:', mid);\n return;\n }\n\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\n // lastMsDelay = (idx + offsetIndex) * delay;\n // lastMsDelay = (idx || 0.1) * 1000;\n\n const contentWrapper = bubble.lastElementChild as HTMLElement;\n const elementsToAnimate: HTMLElement[] = [contentWrapper];\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(item && item.group.avatar && item.group.lastItem === item) {\n elementsToAnimate.push(item.group.avatar);\n }\n\n elementsToAnimate.forEach((element) => {\n element.classList.add('zoom-fade', 'can-zoom-fade');\n element.style.transitionDelay = lastMsDelay + 'ms';\n });\n\n if(idx === (mids.length - 1)) {\n const onTransitionEnd = (e: TransitionEvent) => {\n if(e.target !== contentWrapper) {\n return;\n }\n\n animationPromise.resolve();\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\n };\n\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\n }\n\n setBubbles.push(...elementsToAnimate);\n });\n\n if(!mids.length) {\n animationPromise.resolve();\n }\n\n return {lastMsDelay, animationPromise};\n };\n\n const topRes = animateAsLadder(topIds, offsetIndex);\n const middleRes = animateAsLadder(middleIds);\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\n\n if(this.onAnimateLadder) {\n await this.onAnimateLadder();\n }\n\n fastRaf(() => {\n this.setStickyDateManually(); // ! maybe it's not efficient\n\n setBubbles.forEach((element) => {\n element.classList.remove('zoom-fade');\n });\n });\n\n let promise: Promise;\n if(topIds.length || middleIds.length || bottomIds.length) {\n promise = Promise.all(promises);\n\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\n .then(() => {\n fastRaf(() => {\n setBubbles.forEach((element) => {\n element.style.transitionDelay = '';\n element.classList.remove('can-zoom-fade');\n });\n\n this.chatInner.classList.remove('zoom-fading');\n });\n\n // ! в хроме, каким-то образом из-за zoom-fade класса начинает прыгать скролл при подгрузке сообщений вверх,\n // ! т.е. скролл не ставится, так же, как в сафари при translateZ на блок выше scrollable\n // if(!IS_SAFARI) {\n // this.needReflowScroll = true;\n // }\n });\n }\n\n return promise;\n }\n\n private async renderEmptyPlaceholder(\n type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting' | 'restricted',\n bubble: HTMLElement,\n message: any,\n elements: (Node | string)[]\n ) {\n const BASE_CLASS = 'empty-bubble-placeholder';\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\n\n let title: HTMLElement;\n if(type === 'group') title = i18n('GroupEmptyTitle1');\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\n else if(type === 'restricted') {\n title = document.createElement('span');\n title.innerText = await this.managers.appPeersManager.getRestrictionReasonText(this.peerId);\n }\n title.classList.add('center', BASE_CLASS + '-title');\n\n elements.push(title);\n\n let listElements: HTMLElement[];\n if(type === 'group') {\n elements.push(i18n('GroupEmptyTitle2'));\n listElements = [\n i18n('GroupDescription1'),\n i18n('GroupDescription2'),\n i18n('GroupDescription3'),\n i18n('GroupDescription4')\n ];\n } else if(type === 'saved') {\n listElements = [\n i18n('ChatYourSelfDescription1'),\n i18n('ChatYourSelfDescription2'),\n i18n('ChatYourSelfDescription3'),\n i18n('ChatYourSelfDescription4')\n ];\n } else if(type === 'greeting') {\n const subtitle = i18n('NoMessagesGreetingsDescription');\n subtitle.classList.add('center', BASE_CLASS + '-subtitle');\n\n // findAndSplice(this.messagesQueue, q => q.bubble === bubble);\n\n const stickerDiv = document.createElement('div');\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\n\n const middleware = this.getMiddleware();\n\n await this.managers.appStickersManager.getGreetingSticker().then(async(doc) => {\n if(!middleware()) return;\n\n const loadPromises: Promise[] = [];\n await wrapSticker({\n doc,\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\n div: stickerDiv,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n group: this.chat.animationGroup,\n // play: !!message.pending || !multipleRender,\n play: true,\n loop: true,\n withThumb: true,\n loadPromises\n });\n\n attachClickEvent(stickerDiv, (e) => {\n cancelEvent(e);\n EmoticonsDropdown.onMediaClick({target: e.target});\n });\n\n return Promise.all(loadPromises);\n });\n\n // this.renderMessagesQueue({\n // message,\n // bubble,\n // reverse: false,\n // promises: [loadPromise]\n // });\n\n elements.push(subtitle, stickerDiv);\n }\n\n if(listElements) {\n elements.push(\n ...listElements.map((elem) => {\n const span = document.createElement('span');\n span.classList.add(BASE_CLASS + '-list-item');\n span.append(elem);\n return span;\n })\n );\n\n if(type === 'group') {\n listElements.forEach((elem) => {\n const i = document.createElement('span');\n i.classList.add('tgico-check');\n elem.prepend(i);\n });\n } else if(type === 'saved') {\n listElements.forEach((elem) => {\n const i = document.createElement('span');\n i.classList.add(BASE_CLASS + '-list-bullet');\n i.innerText = '•';\n elem.prepend(i);\n });\n }\n }\n\n if(elements.length > 1) {\n bubble.classList.add('has-description');\n }\n\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\n }\n\n private async processLocalMessageRender(\n message: Message.message | Message.messageService,\n animate?: boolean,\n middleware = this.getMiddleware()\n ) {\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const m = middlewarePromise(middleware);\n\n const p: Parameters[4] = async(result) => {\n const {bubble} = await m(result);\n if(!bubble) {\n return result;\n }\n\n (bubble as any).message = message;\n\n bubble.classList.add('is-group-last', 'is-group-first');\n\n const updatePosition = () => {\n if(this.updatePlaceholderPosition === updatePosition) {\n this.updatePlaceholderPosition = undefined;\n }\n\n appendTo[method](bubble);\n };\n\n if(!isSponsored) {\n bubble.classList.add('bubble-first');\n bubble.classList.remove('can-have-tail', 'is-in');\n }\n\n const elements: (Node | string)[] = [];\n const isBot = this.chat.isBot;\n let renderPromise: Promise, appendTo = this.container, method: 'append' | 'prepend' = 'append';\n if(this.chat.isRestricted) {\n renderPromise = this.renderEmptyPlaceholder('restricted', bubble, message, elements);\n } else if(isSponsored) {\n let text: LangPackKey, mid: number, startParam: string, callback: () => void;\n\n bubble.classList.add('avoid-selection');\n bubble.style.order = '999999';\n\n const sponsoredMessage = this.sponsoredMessage = (message as Message.message).sponsoredMessage;\n const peerId = getPeerId(sponsoredMessage.from_id);\n // const peer = this.appPeersManager.getPeer(peerId);\n if(sponsoredMessage.channel_post) {\n text = 'OpenChannelPost';\n mid = generateMessageId(sponsoredMessage.channel_post);\n } else if(sponsoredMessage.start_param || isBot) {\n text = 'Chat.Message.ViewBot';\n startParam = sponsoredMessage.start_param;\n } else {\n text = await this.managers.appPeersManager.isAnyGroup(peerId) ? 'Chat.Message.ViewGroup' : 'Chat.Message.ViewChannel';\n }\n\n if(sponsoredMessage.chat_invite) {\n callback = () => {\n new PopupJoinChatInvite(sponsoredMessage.chat_invite_hash, sponsoredMessage.chat_invite as ChatInvite.chatInvite);\n };\n } else if(sponsoredMessage.chat_invite_hash) {\n callback = () => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: sponsoredMessage.chat_invite_hash\n };\n\n this.chat.appImManager.processInternalLink(link);\n };\n } else {\n callback = () => {\n this.chat.appImManager.setInnerPeer({\n peerId,\n lastMsgId: mid,\n startParam\n });\n };\n }\n\n const button = this.makeViewButton({text});\n\n this.observer.observe(button, this.viewsObserverCallback);\n\n if(callback) {\n attachClickEvent(button, callback);\n }\n\n bubble.querySelector('.bubble-content').prepend(button);\n\n appendTo = this.chatInner;\n method = 'append';\n animate = false;\n\n // return result;\n } else if(isBot && message._ === 'message') {\n const b = document.createElement('b');\n b.append(i18n('BotInfoTitle'));\n elements.push(b, '\\n\\n');\n appendTo = this.chatInner;\n method = 'prepend';\n } else if(this.chat.isAnyGroup && ((await m(this.managers.appPeersManager.getPeer(this.peerId))) as MTChat.chat).pFlags.creator) {\n renderPromise = this.renderEmptyPlaceholder('group', bubble, message, elements);\n } else if(this.chat.type === 'scheduled') {\n renderPromise = this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\n } else if(rootScope.myId === this.peerId) {\n renderPromise = this.renderEmptyPlaceholder('saved', bubble, message, elements);\n } else if(this.peerId.isUser() && !isBot && await m(this.chat.canSend()) && this.chat.type === 'chat') {\n renderPromise = this.renderEmptyPlaceholder('greeting', bubble, message, elements);\n } else {\n renderPromise = this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\n }\n\n if(renderPromise) {\n await renderPromise;\n }\n\n if(elements.length) {\n const messageDiv = bubble.querySelector('.message, .service-msg');\n messageDiv.prepend(...elements);\n }\n\n const isWaitingForAnimation = !!this.messagesQueueOnRenderAdditional;\n const noTransition = this.setPeerCached && !isWaitingForAnimation;\n if(noTransition) {\n const setOn = bubble.firstElementChild;\n setOn.classList.add('no-transition');\n\n if(this.chat.setPeerPromise) {\n this.chat.setPeerPromise.catch(noop).finally(() => {\n setOn.classList.remove('no-transition');\n });\n }\n }\n\n if(animate === undefined && !noTransition) {\n animate = true;\n }\n\n if(isWaitingForAnimation || animate) {\n this.updatePlaceholderPosition = updatePosition;\n\n this.onAnimateLadder = () => {\n // appendTo[method](bubble);\n this.onAnimateLadder = undefined;\n\n // need raf here because animation won't fire if this message is single\n if(!this.messagesQueuePromise) {\n return fastRafPromise();\n }\n };\n } else if(this.chat.setPeerPromise) {\n this.attachPlaceholderOnRender = () => {\n this.attachPlaceholderOnRender = undefined;\n updatePosition();\n // appendTo[method](bubble);\n };\n } else {\n this.updatePlaceholderPosition = updatePosition;\n // appendTo[method](bubble);\n }\n\n if(!isWaitingForAnimation && animate) {\n await m(getHeavyAnimationPromise());\n const additionMsgIds = getObjectKeysAndSort(this.bubbles);\n indexOfAndSplice(additionMsgIds, message.mid);\n this.animateAsLadder(message.mid, additionMsgIds, false, 0, 0);\n }\n\n bubble.middlewareHelper.onDestroy(() => {\n if(this.emptyPlaceholderBubble === bubble) {\n this.emptyPlaceholderBubble = undefined;\n }\n });\n\n this.emptyPlaceholderBubble = bubble;\n\n return result;\n };\n\n return this.safeRenderMessage(\n message,\n !isSponsored,\n undefined,\n false,\n p\n );\n }\n\n private makeViewButton[1]>(options: T) {\n return Button('btn-primary btn-primary-transparent bubble-view-button', options);\n }\n\n private generateLocalMessageId(addOffset = 0) {\n // const INCREMENT = 0x10;\n const offset = (this.chat.type === 'scheduled' ? -1 : 0) + addOffset;\n // offset = generateMessageId(offset);\n // id: -Math.abs(+this.peerId * INCREMENT + offset),\n const id = -Math.abs(offset);\n const mid = -Math.abs(generateMessageId(id));\n return {id, mid};\n }\n\n private async generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void, addOffset = 0): Promise> {\n const {id, mid} = this.generateLocalMessageId(addOffset);\n let message: Omit & {message?: string} = {\n _: service ? 'messageService' : 'message',\n date: 0,\n id,\n mid,\n peer_id: await this.managers.appPeersManager.getOutputPeer(this.peerId),\n pFlags: {\n local: true\n }\n };\n\n if(!service) {\n message.message = '';\n }/* else {\n (message as Message.messageService).action = {} as any;\n } */\n\n assumeType>(message);\n\n fill && fill(message);\n\n const savedMessages = await this.managers.appMessagesManager.saveMessages([message], {storage: new Map() as any});\n message = savedMessages[0];\n message.mid = mid;\n return message as any;\n }\n\n public getViewportSlice() {\n // this.log.trace('viewport slice');\n return getViewportSlice({\n overflowElement: this.scrollable.container,\n selector: '.bubbles-date-group .bubble:not(.is-date)',\n extraSize: Math.max(700, windowSize.height) * 2\n });\n }\n\n public deleteViewportSlice(slice: ReturnType, ignoreScrollSaving?: boolean) {\n if(DO_NOT_SLICE_VIEWPORT_ON_RENDER) {\n return;\n }\n\n const {invisibleTop, invisibleBottom} = slice;\n const invisible = invisibleTop.concat(invisibleBottom);\n if(!invisible.length) {\n return;\n }\n\n if(invisibleTop.length) {\n this.setLoaded('top', false);\n this.getHistoryTopPromise = undefined;\n }\n\n if(invisibleBottom.length) {\n this.setLoaded('bottom', false);\n this.getHistoryBottomPromise = undefined;\n }\n\n const mids = invisible.map(({element}) => +element.dataset.mid);\n\n let scrollSaver: ScrollSaver;\n if(/* !!invisibleTop.length !== !!invisibleBottom.length && */!ignoreScrollSaving) {\n scrollSaver = this.createScrollSaver(!!invisibleTop.length);\n scrollSaver.save();\n }\n\n this.deleteMessagesByIds(mids, false, true);\n\n if(scrollSaver) {\n scrollSaver.restore();\n } else if(invisibleTop.length) {\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\n }\n }\n\n public sliceViewport(ignoreHeavyAnimation?: boolean) {\n // Safari cannot reset the scroll.\n if(IS_SAFARI || (this.isHeavyAnimationInProgress && !ignoreHeavyAnimation) || DO_NOT_SLICE_VIEWPORT) {\n return;\n }\n\n // const scrollSaver = new ScrollSaver(this.scrollable, true);\n // scrollSaver.save();\n const slice = this.getViewportSlice();\n // if(IS_SAFARI) slice.invisibleTop = [];\n this.deleteViewportSlice(slice);\n // scrollSaver.restore();\n }\n\n private async setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\n const willChange = this.scrollable.loadedAll[side] !== value;\n if(!willChange) {\n return;\n }\n\n const log = this.log.bindPrefix('setLoaded');\n log('change', side, value);\n\n this.scrollable.loadedAll[side] = value;\n this.scrollable.onScroll(); // ! WARNING\n // return;\n\n if(!checkPlaceholders) {\n return;\n }\n\n if(!this.chat.isRestricted) {\n if(side === 'bottom' && this.chat.isBroadcast/* && false */) {\n this.toggleSponsoredMessage(value);\n }\n\n if(side === 'top' && value && this.chat.isBot) {\n return this.renderBotPlaceholder();\n }\n }\n\n return this.checkIfEmptyPlaceholderNeeded();\n }\n\n private async toggleSponsoredMessage(value: boolean) {\n const log = this.log.bindPrefix('sponsored');\n log('checking');\n const {mid} = this.generateLocalMessageId(SPONSORED_MESSAGE_ID_OFFSET);\n if(value) {\n const middleware = this.getMiddleware(() => {\n return this.scrollable.loadedAll.bottom && this.getSponsoredMessagePromise === promise;\n });\n\n const promise = this.getSponsoredMessagePromise = this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId())\n .then(async(sponsoredMessages) => {\n if(!middleware() || sponsoredMessages._ === 'messages.sponsoredMessagesEmpty') {\n return;\n }\n\n const sponsoredMessage = sponsoredMessages.messages[0];\n if(!sponsoredMessage) {\n log('no message');\n return;\n }\n\n const messagePromise = this.generateLocalFirstMessage(false, (message) => {\n message.message = sponsoredMessage.message;\n message.from_id = sponsoredMessage.from_id;\n message.entities = sponsoredMessage.entities;\n message.pFlags.sponsored = true;\n message.sponsoredMessage = sponsoredMessage;\n }, SPONSORED_MESSAGE_ID_OFFSET);\n\n return Promise.all([\n messagePromise,\n this.getHistoryTopPromise, // wait for top load and execute rendering after or with it\n this.messagesQueuePromise\n ]).then(([message]) => {\n if(!middleware()) return;\n // this.processLocalMessageRender(message);\n log('rendering', message);\n return this.performHistoryResult({history: [message]}, false);\n });\n }).finally(() => {\n if(this.getSponsoredMessagePromise === promise) {\n this.getSponsoredMessagePromise = undefined;\n }\n });\n } else {\n log('clearing rendered', mid);\n this.getSponsoredMessagePromise = undefined;\n this.deleteMessagesByIds([mid]);\n }\n }\n\n private async renderBotPlaceholder() {\n const _log = this.log.bindPrefix('bot placeholder');\n\n const middleware = this.getMiddleware();\n const result = await this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());\n _log('getting profile, cached:', result.cached);\n const processPromise = result.result.then(async(userFull) => {\n if(!middleware()) {\n return;\n }\n\n if(!userFull.bot_info?.description) {\n _log.warn('no description');\n return this.checkIfEmptyPlaceholderNeeded();\n }\n\n const message = await this.generateLocalFirstMessage(false, (message) => {\n const botInfo = userFull.bot_info;\n message.message = botInfo.description;\n if(botInfo.description_document) message.media = {_: 'messageMediaDocument', document: botInfo.description_document, pFlags: {}};\n if(botInfo.description_photo) message.media = {_: 'messageMediaPhoto', photo: botInfo.description_photo, pFlags: {}};\n });\n\n if(!middleware()) {\n return;\n }\n\n _log('rendering');\n const renderPromise = this.processLocalMessageRender(message, !result.cached).then(() => {\n _log('done');\n });\n\n return {renderPromise};\n });\n\n if(!result.cached) {\n return;\n }\n\n return processPromise;\n }\n\n public async checkIfEmptyPlaceholderNeeded() {\n if(this.scrollable.loadedAll.top &&\n this.scrollable.loadedAll.bottom &&\n this.emptyPlaceholderBubble === undefined &&\n (\n this.chat.isRestricted ||\n !(await this.chat.getHistoryStorage()).count ||\n (\n // !Object.keys(this.bubbles).length ||\n // ! WARNING ! ! ! ! ! ! REPLACE LINE ABOVE WITH THESE\n Object.keys(this.bubbles).length &&\n !this.getRenderedLength()\n ) ||\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\n )\n ) {\n this.log('inject empty peer placeholder');\n\n const message = await this.generateLocalFirstMessage(true);\n return {renderPromise: this.processLocalMessageRender(message)};\n }\n }\n\n public getHistory1(maxId?: number, reverse?: boolean, isBackLimit?: boolean, additionMsgId?: number, justLoad?: boolean) {\n const middleware = this.getMiddleware(justLoad ? undefined : () => {\n return (reverse ? this.getHistoryTopPromise : this.getHistoryBottomPromise) === waitPromise;\n });\n\n const result = this.getHistory(maxId, reverse, isBackLimit, additionMsgId, justLoad, middleware);\n const waitPromise = result.then((res) => res && (res.waitPromise || res.promise));\n\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\n waitPromise.then(() => {\n if(!middleware()) {\n return;\n }\n\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\n\n if(!justLoad) {\n // preload more\n // if(!isFirstMessageRender) {\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\n setTimeout(() => {\n if(reverse) {\n this.loadMoreHistory(true, true);\n } else {\n this.loadMoreHistory(false, true);\n }\n }, 0);\n // }\n }\n // }\n\n // this.scrollable.onScroll();\n }\n });\n\n return result;\n }\n\n /**\n * Load and render history\n * @param maxId max message id\n * @param reverse 'true' means up\n * @param isBackLimit is search\n * @param additionMsgId for the last message\n * @param justLoad do not render\n */\n public async getHistory(\n maxId = 0,\n reverse = false,\n isBackLimit = false,\n additionMsgId = 0,\n justLoad = false,\n middleware?: () => boolean\n ): Promise<{cached: boolean, promise: Promise, waitPromise: Promise}> {\n const peerId = this.peerId;\n\n const isBroadcast = this.chat.isBroadcast;\n // console.time('appImManager call getHistory');\n const pageCount = Math.min(30, windowSize.height / 40/* * 1.25 */ | 0);\n // const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\n const realLoadCount = isBroadcast ? 20 : (Object.keys(this.bubbles).length > 0 ? Math.max(35, pageCount) : pageCount);\n // const realLoadCount = pageCount;//const realLoadCount = 50;\n let loadCount = realLoadCount;\n\n /* if(TEST_SCROLL) {\n //loadCount = 1;\n if(Object.keys(this.bubbles).length > 0)\n return {cached: false, promise: Promise.resolve(true)};\n } */\n if(TEST_SCROLL !== undefined) {\n if(TEST_SCROLL) {\n if(Object.keys(this.bubbles).length > 0) {\n --TEST_SCROLL;\n }\n } else {\n return {cached: false, promise: Promise.resolve(), waitPromise: Promise.resolve()};\n }\n }\n\n // //console.time('render history total');\n\n let backLimit = 0;\n if(isBackLimit) {\n backLimit = loadCount;\n\n if(!reverse) { // if not jump\n loadCount = 0;\n // maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\n }\n }\n\n let additionMsgIds: number[];\n if(additionMsgId && !isBackLimit) {\n if(this.chat.type === 'pinned') {\n additionMsgIds = [additionMsgId];\n } else {\n const historyStorage = await this.chat.getHistoryStorage();\n const slice = historyStorage.history.slice;\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\n additionMsgIds = slice.slice();\n\n // * filter last album, because we don't know is it the last item\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\n const message = await this.chat.getMessage(additionMsgIds[i]);\n if((message as Message.message)?.grouped_id) additionMsgIds.splice(i, 1);\n else break;\n }\n\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\n }\n }\n }\n\n /* const result = additionMsgID ?\n {history: [additionMsgID]} :\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\n let result: AckedResult = await this.requestHistory(maxId, loadCount, backLimit) as any;\n let resultPromise: typeof result['result'];\n\n this.log('i vin brehnya', result, maxId, loadCount, backLimit);\n\n // const isFirstMessageRender = !!additionMsgID && result.cached && !appMessagesManager.getMessage(additionMsgID).grouped_id;\n const isAdditionRender = additionMsgIds?.length && !result.cached;\n const isFirstMessageRender = (this.isFirstLoad && backLimit && !result.cached) || isAdditionRender;\n if(isAdditionRender) {\n resultPromise = result.result;\n\n result = {\n cached: true,\n result: Promise.resolve({history: additionMsgIds})\n };\n\n // additionMsgID = 0;\n }\n\n this.isFirstLoad = false;\n\n const processResult = async(historyResult: Awaited) => {\n if((historyResult as HistoryResult).isEnd?.top) {\n if(this.chat.type === 'discussion') { // * inject discussion start\n const serviceStartMessageId = await this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId, this.chat.threadId);\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\n const mids = await this.chat.getMidsByMid(this.chat.threadId);\n historyResult.history.push(...mids.reverse());\n }\n\n // synchronize bot placeholder appearance\n await this.managers.appProfileManager.getProfileByPeerId(peerId);\n\n // await this.setLoaded('top', true);\n }\n };\n\n const sup = (historyResult: Awaited) => {\n return getHeavyAnimationPromise().then(() => {\n return processResult(historyResult);\n }).then(() => {\n if(!isAdditionRender && additionMsgId) {\n historyResult.history.unshift(additionMsgId);\n }\n\n return this.performHistoryResult(historyResult, reverse);\n });\n };\n\n const processPromise = (_promise: typeof result['result']) => {\n const promise = Promise.resolve(_promise).then((result) => {\n if(middleware && !middleware()) {\n throw PEER_CHANGED_ERROR;\n }\n\n if(justLoad) {\n // нужно делать из-за ранней прогрузки\n this.scrollable.onScroll();\n // fastRaf(() => {\n // this.scrollable.checkForTriggers();\n // });\n return;\n }\n\n return sup(result);\n }, (err) => {\n this.log.error('getHistory error:', err);\n throw err;\n });\n\n return promise;\n };\n\n let promise: Promise, cached: boolean;\n if(!result.cached) {\n cached = false;\n promise = processPromise(result.result);\n } else if(justLoad) {\n // нужно делать из-за ранней прогрузки\n this.scrollable.onScroll();\n return null;\n } else {\n cached = true;\n promise = sup(await result.result);\n }\n\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\n\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\n let times = isAdditionRender ? 2 : 1;\n this.messagesQueueOnRenderAdditional = () => {\n this.log('messagesQueueOnRenderAdditional');\n\n if(--times) return;\n\n this.messagesQueueOnRenderAdditional = undefined;\n\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\n promise.then(() => {\n setTimeout(() => { // preload messages\n this.loadMoreHistory(reverse, true);\n }, 0);\n });\n };\n } else {\n this.messagesQueueOnRenderAdditional = undefined;\n }\n\n if(justLoad) {\n return null;\n }\n\n return {cached, promise, waitPromise};\n }\n\n public async setUnreadDelimiter() {\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n return;\n }\n\n if(this.attachedUnreadBubble) {\n return;\n }\n\n const historyMaxId = await this.chat.getHistoryMaxId();\n let readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\n if(!readMaxId) return;\n\n readMaxId = Object.keys(this.bubbles)\n .filter((mid) => !this.bubbles[mid].classList.contains('is-out'))\n .map((i) => +i)\n .sort((a, b) => a - b)\n .find((i) => i > readMaxId);\n\n if(readMaxId && this.bubbles[readMaxId]) {\n const bubble = this.bubbles[readMaxId];\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\n this.firstUnreadBubble.classList.remove('is-first-unread');\n this.firstUnreadBubble = null;\n }\n\n if(readMaxId !== historyMaxId) {\n bubble.classList.add('is-first-unread');\n }\n\n this.firstUnreadBubble = bubble;\n this.attachedUnreadBubble = true;\n }\n }\n\n public deleteEmptyDateGroups() {\n const mustBeCount = this.stickyIntersector ? STICKY_OFFSET : 1;\n let deleted = false;\n for(const i in this.dateMessages) {\n const dateMessage = this.dateMessages[i];\n\n if(dateMessage.container.childElementCount === mustBeCount) { // only date div + sentinel div\n dateMessage.container.remove();\n if(this.stickyIntersector) {\n this.stickyIntersector.unobserve(dateMessage.container, dateMessage.div);\n }\n delete this.dateMessages[i];\n deleted = true;\n\n // * no sense in it\n /* if(dateMessage.div === this.previousStickyDate) {\n this.previousStickyDate = undefined;\n } */\n }\n }\n\n if(!deleted) {\n return;\n }\n\n if(!Object.keys(this.dateMessages).length) {\n this.container.classList.remove('has-groups');\n }\n\n this.checkIfEmptyPlaceholderNeeded();\n this.setStickyDateManually();\n }\n}\n\nexport function generateTail() {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\n svg.setAttributeNS(null, 'width', '11');\n svg.setAttributeNS(null, 'height', '20');\n svg.classList.add('bubble-tail');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#message-tail-filled');\n\n svg.append(use);\n\n return svg;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {copyTextToClipboard} from '../clipboard';\n// import SelectionSaver from \"../selectionSaver\";\n// import selectElementContents from \"./selectElementContents\";\n\nexport default function copyFromElement(element: HTMLElement) {\n copyTextToClipboard(element.textContent);\n // const saver = new SelectionSaver();\n // saver.save();\n // selectElementContents(element);\n // document.execCommand('copy');\n // saver.restore();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {MediaSizeType} from '../../helpers/mediaSizes';\nimport {Message} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {MediaSearchContext} from '../appMediaPlaybackController';\nimport Chat from '../chat/chat';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport wrapDocument from './document';\n\nexport default async function wrapGroupedDocuments({albumMustBeRenderedFull, message, bubble, messageDiv, chat, loadPromises, autoDownloadSize, lazyLoadQueue, searchContext, useSearch, sizeType, managers, fontWeight, fontSize, richTextFragment}: {\n albumMustBeRenderedFull: boolean,\n message: any,\n messageDiv: HTMLElement,\n bubble: HTMLElement,\n uploading?: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n searchContext?: MediaSearchContext,\n useSearch?: boolean,\n sizeType?: MediaSizeType,\n managers?: AppManagers,\n fontWeight?: number,\n fontSize?: number,\n richTextFragment?: DocumentFragment\n}) {\n let nameContainer: HTMLElement;\n const mids = albumMustBeRenderedFull ? await chat.getMidsByMid(message.mid) : [message.mid];\n /* if(isPending) {\n mids.reverse();\n } */\n\n const promises = mids.map(async(mid, idx) => {\n const message = (await chat.getMessage(mid)) as Message.message;\n const div = await wrapDocument({\n message,\n loadPromises,\n autoDownloadSize,\n lazyLoadQueue,\n searchContext,\n sizeType,\n managers,\n fontWeight,\n fontSize\n });\n\n const container = document.createElement('div');\n container.classList.add('document-container');\n container.dataset.mid = '' + mid;\n container.dataset.peerId = '' + message.peerId;\n\n const wrapper = document.createElement('div');\n wrapper.classList.add('document-wrapper');\n\n if(message.message) {\n const messageDiv = document.createElement('div');\n messageDiv.classList.add('document-message');\n\n setInnerHTML(messageDiv, richTextFragment);\n wrapper.append(messageDiv);\n }\n\n if(mids.length > 1) {\n const selection = document.createElement('div');\n selection.classList.add('document-selection');\n container.append(selection);\n\n container.classList.add('grouped-item');\n\n if(idx === 0) {\n nameContainer = wrapper;\n }\n }\n\n wrapper.append(div);\n container.append(wrapper);\n return container;\n });\n\n const containers = await Promise.all(promises);\n messageDiv.append(...containers);\n\n if(mids.length > 1) {\n bubble.classList.add('is-multiple-documents', 'is-grouped');\n }\n\n return nameContainer;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport PollElement from '../poll';\n\nexport default function wrapPoll(message: any, managers: AppManagers = rootScope.managers) {\n const elem = new PollElement();\n elem.message = message;\n elem.managers = managers;\n elem.setAttribute('peer-id', '' + message.peerId);\n elem.setAttribute('poll-id', message.media.poll.id);\n elem.setAttribute('message-id', '' + message.mid);\n elem.render();\n return elem;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement, {addCancelButton} from '.';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\nimport rootScope from '../../lib/rootScope';\nimport {FormatterArguments, LangPackKey} from '../../lib/langPack';\nimport wrapPeerTitle from '../wrappers/peerTitle';\n\nexport default class PopupPinMessage {\n constructor(private peerId: PeerId, private mid: number, private unpin?: true, private onConfirm?: () => void) {\n this.construct();\n }\n\n private async construct() {\n const {peerId, mid, unpin, onConfirm} = this;\n let title: LangPackKey, description: LangPackKey, descriptionArgs: FormatterArguments;\n const buttons: PopupPeerOptions['buttons'] = [], checkboxes: PopupPeerOptions['checkboxes'] = [];\n\n const managers = PopupElement.MANAGERS;\n\n const canUnpin = await managers.appPeersManager.canPinMessage(peerId);\n\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, oneSide?: boolean, silent?: boolean) => {\n setTimeout(() => { // * костыль, потому что document.elementFromPoint вернёт popup-peer пока он будет закрываться\n let promise: Promise;\n if(unpin && !mid) {\n if(canUnpin) {\n promise = managers.appMessagesManager.unpinAllMessages(peerId);\n } else {\n promise = managers.appMessagesManager.hidePinnedMessages(peerId);\n }\n } else {\n promise = managers.appMessagesManager.updatePinnedMessage(peerId, mid, unpin, silent, oneSide);\n }\n\n if(onConfirm) {\n promise.then(onConfirm);\n }\n }, 300);\n };\n\n if(unpin) {\n let buttonText: LangPackKey = 'UnpinMessage';\n if(!mid) {\n if(canUnpin) {\n title = 'Popup.Unpin.AllTitle';\n description = 'Chat.UnpinAllMessagesConfirmation';\n descriptionArgs = ['' + ((await managers.appMessagesManager.getPinnedMessagesCount(peerId)) || 1)];\n } else {\n title = 'Popup.Unpin.HideTitle';\n description = 'Popup.Unpin.HideDescription';\n buttonText = 'Popup.Unpin.Hide';\n }\n } else {\n title = 'UnpinMessageAlertTitle';\n description = 'Chat.Confirm.Unpin';\n }\n\n buttons.push({\n langKey: buttonText,\n isDanger: true,\n callback\n });\n } else {\n title = 'PinMessageAlertTitle';\n const pinButtonText: LangPackKey = 'PinMessage';\n\n if(peerId.isAnyChat()) {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, false, !checked.size)\n });\n\n if(await managers.appChatsManager.isBroadcast(peerId.toChatId())) {\n description = 'PinMessageAlertChannel';\n } else {\n description = 'PinMessageAlert';\n\n checkboxes.push({\n text: 'PinNotify',\n checked: true\n });\n }\n } else {\n description = 'PinMessageAlertChat';\n\n if(peerId === rootScope.myId) {\n buttons.push({\n langKey: pinButtonText,\n callback\n });\n } else {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, !checked.size)\n });\n\n checkboxes.push({\n text: 'PinAlsoFor',\n textArgs: [await wrapPeerTitle({peerId})],\n checked: true\n });\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function isSelectionEmpty(selection = window.getSelection()) {\n if(!selection?.rangeCount) {\n return true;\n }\n\n const selectionRange = selection.getRangeAt(0);\n if(selectionRange.collapsed || !selectionRange.START_TO_END) {\n return true;\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport rootScope from '../lib/rootScope';\nimport {getEmojiToneIndex} from '../vendor/emoji';\nimport mediaSizes from './mediaSizes';\nimport {saveLottiePreview} from './saveLottiePreview';\n\nexport default function preloadAnimatedEmojiSticker(emoji: string, width?: number, height?: number) {\n return rootScope.managers.appStickersManager.preloadAnimatedEmojiSticker(emoji).then(({doc}) => {\n if(!doc) {\n return;\n }\n\n return appDownloadManager.downloadMedia({media: doc})\n .then(async(blob) => {\n const mediaSize = mediaSizes.active.emojiSticker;\n const toneIndex = getEmojiToneIndex(emoji);\n const animation = await lottieLoader.loadAnimationWorker({\n container: undefined,\n animationData: blob,\n width: width ?? mediaSize.width,\n height: height ?? mediaSize.height,\n name: 'doc' + doc.id,\n autoplay: false,\n loop: false,\n toneIndex,\n group: 'none'\n });\n\n animation.addEventListener('firstFrame', () => {\n saveLottiePreview(doc, animation.canvas[0], toneIndex);\n animation.remove();\n }, {once: true});\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ReportReason} from '../../layer';\nimport InputField from '../inputField';\nimport {toastNew} from '../toast';\nimport wrapStickerEmoji from '../wrappers/stickerEmoji';\nimport PopupPeer from './peer';\n\nexport default class PopupReportMessagesConfirm extends PopupPeer {\n public static STICKER_EMOJI = '👮‍♀️';\n constructor(peerId: PeerId, mids: number[], reason: ReportReason['_'], onConfirm?: () => void) {\n super('popup-report-messages-confirm', {\n noTitle: true,\n descriptionLangKey: 'ReportInfo',\n buttons: [{\n langKey: 'ReportChat',\n callback: () => {\n if(!inputField.isValid()) {\n return;\n }\n\n onConfirm && onConfirm();\n this.managers.appMessagesManager.reportMessages(peerId, mids, reason, inputField.value).then((bool) => {\n if(!bool) return;\n\n toastNew({\n langPackKey: 'ReportSentInfo'\n });\n });\n }\n }],\n body: true\n });\n\n const div = document.createElement('div');\n const size = 100;\n wrapStickerEmoji({\n div,\n emoji: PopupReportMessagesConfirm.STICKER_EMOJI,\n width: size,\n height: size\n }).then(({render}) => render).finally(() => {\n this.show();\n });\n\n this.header.replaceWith(div);\n\n const inputField = new InputField({\n label: 'ReportHint',\n maxLength: 512,\n placeholder: 'ReportChatDescription'\n });\n\n inputField.input.addEventListener('input', () => {\n this.buttons[0].element.toggleAttribute('disabled', !inputField.isValid());\n });\n\n this.body.append(inputField.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport whichChild from '../../helpers/dom/whichChild';\nimport preloadAnimatedEmojiSticker from '../../helpers/preloadAnimatedEmojiSticker';\nimport {ReportReason} from '../../layer';\nimport {LangPackKey} from '../../lib/langPack';\nimport Button from '../button';\nimport PopupPeer from './peer';\nimport PopupReportMessagesConfirm from './reportMessagesConfirm';\n\nexport default class PopupReportMessages extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-report-messages', {titleLangKey: 'ChatTitle.ReportMessages', buttons: [], body: true});\n\n mids = mids.slice();\n\n const buttons: [LangPackKey, ReportReason['_']][] = [\n ['ReportChatSpam', 'inputReportReasonSpam'],\n ['ReportChatViolence', 'inputReportReasonViolence'],\n ['ReportChatChild', 'inputReportReasonChildAbuse'],\n ['ReportChatPornography', 'inputReportReasonPornography'],\n ['ReportChatOther', 'inputReportReasonOther'],\n ['ReportChatPersonalDetails', 'inputReportReasonPersonalDetails'],\n ['ReportChatIllegalDrugs', 'inputReportReasonIllegalDrugs']\n ];\n\n const className = 'btn-primary btn-transparent';\n buttons.forEach((b) => {\n const button = Button(className, {/* icon: 'edit', */text: b[0]});\n this.body.append(button);\n });\n\n const preloadStickerPromise = preloadAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n\n attachClickEvent(this.body, (e) => {\n const target = findUpClassName(e.target, 'btn-primary');\n const reason = buttons[whichChild(target)][1];\n\n preloadStickerPromise.then(() => {\n this.hide();\n\n new PopupReportMessagesConfirm(peerId, mids, reason, onConfirm);\n });\n }, {listenerSetter: this.listenerSetter});\n\n // this.body.style.margin = '0 -1rem';\n this.buttonsEl.style.marginTop = '.5rem';\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport I18n, {i18n} from '../../lib/langPack';\nimport PopupPeer from './peer';\n\nexport default class PopupSponsored extends PopupPeer {\n constructor() {\n super('popup-sponsored', {\n titleLangKey: 'Chat.Message.Sponsored.What',\n descriptionLangKey: 'Chat.Message.Ad.Text',\n descriptionLangArgs: [i18n('Chat.Message.Sponsored.Link')],\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'Chat.Message.Ad.ReadMore',\n callback: () => {\n window.open(I18n.format('Chat.Message.Sponsored.Link', true));\n },\n isCancel: true\n }],\n scrollable: true\n });\n\n this.scrollable.append(this.description);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport {Message, Reaction} from '../../layer';\nimport ReactionsElement from '../chat/reactions';\nimport {horizontalMenu} from '../horizontalMenu';\nimport Scrollable from '../scrollable';\nimport ScrollableLoader from '../../helpers/scrollableLoader';\nimport appDialogsManager from '../../lib/appManagers/appDialogsManager';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport wrapSticker from '../wrappers/sticker';\nimport ReactionElement from '../chat/reaction';\nimport getUserStatusString from '../wrappers/getUserStatusString';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport SettingSection from '../settingSection';\n\nexport default class PopupReactedList extends PopupElement {\n constructor(\n private message: Message.message\n ) {\n super('popup-reacted-list', {closable: true, overlayClosable: true, body: true});\n\n this.init();\n }\n\n private async init() {\n const middleware = this.middlewareHelper.get();\n const message = await this.managers.appMessagesManager.getGroupsFirstMessage(this.message);\n if(!middleware()) return;\n const canViewReadParticipants = await this.managers.appMessagesManager.canViewMessageReadParticipants(message);\n if(!middleware()) return;\n // this.body.append(generateDelimiter());\n\n const reactionsElement = new ReactionsElement();\n const newMessage: Message.message = {\n ...message,\n mid: 0,\n id: 0,\n reactions: {\n _: 'messageReactions',\n results: [],\n\n ...message.reactions,\n\n pFlags: {},\n recent_reactions: []\n }\n };\n\n newMessage.reactions.results = newMessage.reactions.results.map((reactionCount) => {\n return {\n ...reactionCount,\n chosen_order: undefined,\n pFlags: {}\n };\n });\n\n reactionsElement.init(newMessage, 'block', this.middlewareHelper.get());\n reactionsElement.render();\n reactionsElement.classList.add('no-stripe');\n reactionsElement.classList.remove('has-no-reactions');\n\n reactionsElement.append(this.btnClose);\n\n this.header.append(reactionsElement);\n\n const tabsContainer = document.createElement('div');\n tabsContainer.classList.add('tabs-container');\n tabsContainer.dataset.animation = 'tabs';\n\n const loaders: Map = new Map();\n\n let hasAllReactions = false;\n if(newMessage.reactions.results.length) {\n const reaction = this.createFakeReaction('reactions', newMessage.reactions.results.reduce((acc, r) => acc + r.count, 0));\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasAllReactions = true;\n }\n\n let hasReadParticipants = false;\n if(canViewReadParticipants) {\n try {\n const readUserIds = await this.managers.appMessagesManager.getMessageReadParticipants(message.peerId, message.mid);\n if(!middleware()) return;\n if(!readUserIds.length) {\n throw '';\n }\n\n const reaction = this.createFakeReaction('checks', readUserIds.length);\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasReadParticipants = true;\n } catch(err) {\n\n }\n }\n\n newMessage.reactions.results.forEach((reactionCount) => {\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add('tabs-tab');\n\n const section = new SettingSection({\n noShadow: true,\n noDelimiter: true\n });\n\n const chatlist = appDialogsManager.createChatList({\n dialogSize: 72\n });\n\n appDialogsManager.setListClickListener(chatlist, () => {\n this.hide();\n }, undefined, false, true);\n\n section.content.append(chatlist);\n scrollable.container.append(section.container);\n\n const skipReadParticipants = (reactionCount.reaction as any) !== 'checks';\n const skipReactionsList = (reactionCount.reaction as any) === 'checks';\n if(['checks', 'reactions'].includes(reactionCount.reaction as any)) {\n reactionCount.reaction = undefined;\n }\n\n const size = 24;\n const mediaSize = makeMediaSize(size, size);\n\n let nextOffset: string;\n const loader = new ScrollableLoader({\n scrollable,\n getPromise: async() => {\n const result = await this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(message, undefined, reactionCount.reaction, nextOffset, skipReadParticipants, skipReactionsList);\n nextOffset = result.nextOffset;\n\n await Promise.all(result.combined.map(async({peerId, reaction}) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n autonomous: true,\n container: chatlist,\n avatarSize: 'abitbigger',\n rippleEnabled: false,\n meAsSaved: false\n });\n\n if(reaction) {\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add('reacted-list-reaction-icon');\n\n if(reaction._ === 'reactionEmoji') {\n const availableReaction = await this.managers.appReactionsManager.getReactionCached(reaction.emoticon);\n\n wrapSticker({\n doc: availableReaction.static_icon,\n div: stickerContainer,\n width: 24,\n height: 24,\n middleware\n });\n } else if(reaction._ === 'reactionCustomEmoji') {\n stickerContainer.append(wrapCustomEmoji({\n docIds: [reaction.document_id],\n customEmojiSize: mediaSize,\n middleware\n }));\n }\n\n dom.listEl.append(stickerContainer);\n }\n\n replaceContent(dom.lastMessageSpan, getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())));\n }));\n\n return !nextOffset;\n }\n });\n\n loaders.set(scrollable.container, loader);\n\n tabsContainer.append(scrollable.container);\n });\n\n this.body.append(tabsContainer);\n\n const selectTab = horizontalMenu(reactionsElement, tabsContainer, (id, tabContent) => {\n if(id === (reactionsElement.childElementCount - 1)) {\n return false;\n }\n\n const reaction = reactionsElement.children[id] as ReactionElement;\n const prevId = selectTab.prevId();\n if(prevId !== -1) {\n (reactionsElement.children[prevId] as ReactionElement).setIsChosen(false);\n }\n\n reaction.setIsChosen(true);\n\n const loader = loaders.get(tabContent);\n loader.load();\n }, undefined, undefined, undefined, this.listenerSetter);\n\n // selectTab(hasAllReactions && hasReadParticipants ? 1 : 0, false);\n selectTab(0, false);\n\n this.show();\n }\n\n private createFakeReaction(icon: string, count: number) {\n const reaction = new ReactionElement();\n reaction.init('block', this.middlewareHelper.get());\n reaction.reactionCount = {\n _: 'reactionCount',\n count: count,\n reaction: icon as any\n };\n reaction.setCanRenderAvatars(false);\n reaction.renderCounter();\n\n const allReactionsSticker = document.createElement('div');\n allReactionsSticker.classList.add('reaction-counter', 'reaction-sticker-icon', 'tgico-' + icon);\n reaction.prepend(allReactionsSticker);\n\n return reaction;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport assumeType from '../../helpers/assumeType';\nimport callbackify from '../../helpers/callbackify';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport {getMiddleware} from '../../helpers/middleware';\nimport noop from '../../helpers/noop';\nimport {fastRaf} from '../../helpers/schedulers';\nimport {Message, AvailableReaction, Reaction} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport Scrollable, {ScrollableBase, ScrollableX} from '../scrollable';\nimport wrapSticker from '../wrappers/sticker';\n\nconst REACTIONS_CLASS_NAME = 'btn-menu-reactions';\nconst REACTION_CLASS_NAME = REACTIONS_CLASS_NAME + '-reaction';\n\nconst REACTION_SIZE = 26;\nconst PADDING = 4;\nexport const REACTION_CONTAINER_SIZE = REACTION_SIZE + PADDING * 2;\n\nconst CAN_USE_TRANSFORM = !IS_SAFARI;\n\ntype ChatReactionsMenuPlayers = {\n select?: RLottiePlayer,\n appear?: RLottiePlayer,\n selectWrapper: HTMLElement,\n appearWrapper: HTMLElement,\n reaction: Reaction\n};\nexport class ChatReactionsMenu {\n public widthContainer: HTMLElement;\n public container: HTMLElement;\n private reactionsMap: Map;\n public scrollable: ScrollableBase;\n private animationGroup: AnimationItemGroup;\n private middleware: ReturnType;\n private message: Message.message;\n\n constructor(\n private managers: AppManagers,\n private type: 'horizontal' | 'vertical',\n middleware: ChatReactionsMenu['middleware']\n ) {\n const widthContainer = this.widthContainer = document.createElement('div');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container-' + type);\n\n const reactionsContainer = this.container = document.createElement('div');\n reactionsContainer.classList.add(REACTIONS_CLASS_NAME);\n\n const reactionsScrollable = this.scrollable = type === 'vertical' ? new Scrollable(undefined) : new ScrollableX(undefined);\n reactionsContainer.append(reactionsScrollable.container);\n reactionsScrollable.onAdditionalScroll = this.onScroll;\n reactionsScrollable.setListeners();\n\n reactionsScrollable.container.classList.add('no-scrollbar');\n\n // ['big'].forEach((type) => {\n // const bubble = document.createElement('div');\n // bubble.classList.add(REACTIONS_CLASS_NAME + '-bubble', REACTIONS_CLASS_NAME + '-bubble-' + type);\n // reactionsContainer.append(bubble);\n // });\n\n this.reactionsMap = new Map();\n this.animationGroup = `CHAT-MENU-REACTIONS-${Date.now()}`;\n animationIntersector.setOverrideIdleGroup(this.animationGroup, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n reactionsContainer.addEventListener('mousemove', this.onMouseMove);\n }\n\n attachClickEvent(reactionsContainer, (e) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) return;\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) return;\n\n this.managers.appReactionsManager.sendReaction(this.message, players.reaction);\n });\n\n widthContainer.append(reactionsContainer);\n\n this.middleware = middleware ?? getMiddleware();\n }\n\n public init(message: Message.message) {\n this.message = message;\n\n const middleware = this.middleware.get();\n // const result = Promise.resolve(this.appReactionsManager.getAvailableReactionsForPeer(message.peerId)).then((res) => pause(1000).then(() => res));\n const result = this.managers.appReactionsManager.getAvailableReactionsByMessage(message);\n callbackify(result, (reactions) => {\n if(!middleware() || !reactions.length) return;\n reactions.forEach((reaction) => {\n if(reaction.pFlags.premium && !rootScope.premium) return;\n this.renderReaction(reaction);\n });\n\n const setVisible = () => {\n this.container.classList.add('is-visible');\n };\n\n if(result instanceof Promise) {\n fastRaf(setVisible);\n } else {\n setVisible();\n }\n });\n }\n\n public cleanup() {\n this.middleware.clean();\n this.scrollable.removeListeners();\n this.reactionsMap.clear();\n animationIntersector.setOverrideIdleGroup(this.animationGroup, false);\n animationIntersector.checkAnimations(true, this.animationGroup, true);\n }\n\n private onScroll = () => {\n this.reactionsMap.forEach((players, div) => {\n this.onScrollProcessItem(div, players);\n });\n };\n\n private canUseAnimations() {\n return rootScope.settings.animationsEnabled && !IS_MOBILE;\n }\n\n private renderReaction(reaction: AvailableReaction) {\n const reactionDiv = document.createElement('div');\n reactionDiv.classList.add(REACTION_CLASS_NAME);\n\n const scaleContainer = document.createElement('div');\n scaleContainer.classList.add(REACTION_CLASS_NAME + '-scale');\n\n const appearWrapper = document.createElement('div');\n let selectWrapper: HTMLElement;;\n appearWrapper.classList.add(REACTION_CLASS_NAME + '-appear');\n\n if(this.canUseAnimations()) {\n selectWrapper = document.createElement('div');\n selectWrapper.classList.add(REACTION_CLASS_NAME + '-select', 'hide');\n }\n\n const players: ChatReactionsMenuPlayers = {\n selectWrapper,\n appearWrapper,\n reaction: {_: 'reactionEmoji', emoticon: reaction.reaction}\n };\n this.reactionsMap.set(reactionDiv, players);\n\n const middleware = this.middleware.get();\n\n const hoverScale = IS_TOUCH_SUPPORTED ? 1 : 1.25;\n const size = REACTION_SIZE * hoverScale;\n\n const options = {\n width: size,\n height: size,\n skipRatio: 1,\n needFadeIn: false,\n withThumb: false,\n group: this.animationGroup,\n middleware\n };\n\n if(!this.canUseAnimations()) {\n delete options.needFadeIn;\n delete options.withThumb;\n\n wrapSticker({\n doc: reaction.static_icon,\n div: appearWrapper,\n ...options\n });\n } else {\n let isFirst = true;\n wrapSticker({\n doc: reaction.appear_animation,\n div: appearWrapper,\n play: true,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n players.appear = player;\n\n player.addEventListener('enterFrame', (frameNo) => {\n if(player.maxFrame === frameNo) {\n selectLoadPromise.then((selectPlayer) => {\n assumeType(selectPlayer);\n appearWrapper.classList.add('hide');\n selectWrapper.classList.remove('hide');\n\n if(isFirst) {\n players.select = selectPlayer;\n isFirst = false;\n }\n }, noop);\n }\n });\n }, noop);\n\n const selectLoadPromise = wrapSticker({\n doc: reaction.select_animation,\n div: selectWrapper,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n return lottieLoader.waitForFirstFrame(player);\n }).catch(noop);\n }\n\n scaleContainer.append(appearWrapper);\n selectWrapper && scaleContainer.append(selectWrapper);\n reactionDiv.append(scaleContainer);\n this.scrollable.append(reactionDiv);\n }\n\n private onScrollProcessItem(div: HTMLElement, players: ChatReactionsMenuPlayers) {\n // return;\n\n const scaleContainer = div.firstElementChild as HTMLElement;\n const visibleRect = getVisibleRect(div, this.scrollable.container);\n let transform: string;\n if(!visibleRect) {\n if(!players.appearWrapper.classList.contains('hide') || !players.appear) {\n return;\n }\n\n if(players.select) {\n players.select.stop();\n }\n\n players.appear.stop();\n players.appear.autoplay = true;\n players.appearWrapper.classList.remove('hide');\n players.selectWrapper.classList.add('hide');\n\n transform = '';\n } else if(visibleRect.overflow.left || visibleRect.overflow.right) {\n const diff = Math.abs(visibleRect.rect.left - visibleRect.rect.right);\n const scale = Math.min(diff ** 2 / REACTION_CONTAINER_SIZE ** 2, 1);\n\n transform = 'scale(' + scale + ')';\n } else {\n transform = '';\n }\n\n if(CAN_USE_TRANSFORM) {\n scaleContainer.style.transform = transform;\n }\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) {\n return;\n }\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) {\n return;\n }\n\n // do not play select animation when appearing\n if(!players.appear?.paused) {\n return;\n }\n\n const player = players.select;\n if(!player) {\n return;\n }\n\n if(player.paused) {\n player.autoplay = true;\n player.restart();\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport ButtonMenu, {ButtonMenuItemOptions} from '../buttonMenu';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport PopupForward from '../popups/forward';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport {copyTextToClipboard} from '../../helpers/clipboard';\nimport PopupSendNow from '../popups/sendNow';\nimport {toast} from '../toast';\nimport I18n, {i18n, LangPackKey} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport {Message, Poll, Chat as MTChat, MessageMedia, AvailableReaction, MessageEntity, InputStickerSet, StickerSet, Document, Reaction} from '../../layer';\nimport PopupReportMessages from '../popups/reportMessages';\nimport assumeType from '../../helpers/assumeType';\nimport PopupSponsored from '../popups/sponsored';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {getMiddleware} from '../../helpers/middleware';\nimport PeerTitle from '../peerTitle';\nimport StackedAvatars from '../stackedAvatars';\nimport {IS_APPLE} from '../../environment/userAgent';\nimport PopupReactedList from '../popups/reactedList';\nimport {ChatReactionsMenu, REACTION_CONTAINER_SIZE} from './reactionsMenu';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport positionMenu, {MenuPositionPadding} from '../../helpers/positionMenu';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {SERVICE_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport PopupStickers from '../popups/stickers';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport canSaveMessageMedia from '../../lib/appManagers/utils/messages/canSaveMessageMedia';\nimport getAlbumText from '../../lib/appManagers/utils/messages/getAlbumText';\n\nexport default class ChatContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean | Promise, notDirect?: () => boolean, withSelection?: true, isSponsored?: true, localName?: 'views' | 'emojis'})[];\n private element: HTMLElement;\n\n private isSelectable: boolean;\n private isSelected: boolean;\n private target: HTMLElement;\n private isTargetAGroupedItem: boolean;\n private isTextSelected: boolean;\n private isAnchorTarget: boolean;\n private isUsernameTarget: boolean;\n private isSponsored: boolean;\n private isOverBubble: boolean;\n private peerId: PeerId;\n private mid: number;\n private message: Message.message | Message.messageService;\n private noForwards: boolean;\n\n private reactionsMenu: ChatReactionsMenu;\n private listenerSetter: ListenerSetter;\n private attachListenerSetter: ListenerSetter;\n\n private viewerPeerId: PeerId;\n private middleware: ReturnType;\n private canOpenReactedList: boolean;\n\n private emojiInputsPromise: CancellablePromise;\n private albumMessages: Message.message[];\n private linkToMessage: Awaited>;\n private selectedMessagesText: string;\n\n constructor(\n private chat: Chat,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n this.attachListenerSetter = new ListenerSetter();\n this.middleware = getMiddleware();\n }\n\n public attachTo(element: HTMLElement) {\n this.attachListenerSetter.removeAll();\n\n if(IS_TOUCH_SUPPORTED/* && false */) {\n attachClickEvent(element, (e) => {\n if(this.chat.selection.isSelecting) {\n return;\n }\n\n this.chat.log('touchend', e);\n\n const badSelectors = [\n '.name',\n '.peer-title',\n '.reply',\n '.document',\n 'audio-element',\n 'avatar-element',\n 'a',\n '.bubble-beside-button',\n 'replies-element',\n '[data-saved-from]:not(.bubble)',\n 'poll-element',\n '.attachment',\n '.reply-markup-button'\n ];\n const good = !(e.target as HTMLElement).closest(badSelectors.join(', '));\n if(good) {\n cancelEvent(e);\n // onContextMenu((e as TouchEvent).changedTouches[0]);\n // onContextMenu((e as TouchEvent).changedTouches ? (e as TouchEvent).changedTouches[0] : e as MouseEvent);\n this.onContextMenu(e);\n }\n }, {listenerSetter: this.attachListenerSetter});\n } else attachContextMenuListener({\n element,\n callback: this.onContextMenu,\n listenerSetter: this.attachListenerSetter\n });\n }\n\n private onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\n let bubble: HTMLElement, contentWrapper: HTMLElement;\n\n try {\n contentWrapper = findUpClassName(e.target, 'bubble-content-wrapper');\n bubble = contentWrapper ? contentWrapper.parentElement : findUpClassName(e.target, 'bubble');\n } catch(e) {}\n\n // ! context menu click by date bubble (there is no pointer-events)\n if(!bubble || bubble.classList.contains('bubble-first')) return;\n\n let element = this.element;\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\n if(element && element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\n\n let mid = +bubble.dataset.mid;\n if(!mid) return;\n\n const r = async() => {\n const isSponsored = this.isSponsored = mid < 0;\n this.isSelectable = this.chat.selection.canSelectBubble(bubble);\n this.peerId = this.chat.peerId;\n // this.msgID = msgID;\n this.target = e.target as HTMLElement;\n this.isTextSelected = !isSelectionEmpty();\n this.isAnchorTarget = this.target.tagName === 'A' && (\n (this.target as HTMLAnchorElement).target === '_blank' ||\n this.target.classList.contains('anchor-url')\n );\n this.isUsernameTarget = this.target.tagName === 'A' && this.target.classList.contains('mention');\n\n const mids = await this.chat.getMidsByMid(mid);\n // * если открыть контекстное меню для альбома не по бабблу, и последний элемент не выбран, чтобы показать остальные пункты\n if(this.chat.selection.isSelecting && !contentWrapper) {\n if(isSponsored) {\n return;\n }\n\n if(mids.length > 1) {\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ?\n mid :\n mids.find((mid) => this.chat.selection.isMidSelected(this.peerId, mid));\n if(selectedMid) {\n mid = selectedMid;\n }\n }\n }\n\n this.isOverBubble = !!contentWrapper;\n\n const groupedItem = findUpClassName(this.target, 'grouped-item');\n this.isTargetAGroupedItem = !!groupedItem;\n if(groupedItem) {\n this.mid = +groupedItem.dataset.mid;\n } else {\n this.mid = mid;\n }\n\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\n this.message = (bubble as any).message || await this.chat.getMessage(this.mid);\n this.albumMessages = (this.message as Message.message).grouped_id ? await this.managers.appMessagesManager.getMessagesByAlbum((this.message as Message.message).grouped_id) : undefined;\n this.noForwards = !isSponsored && !(await this.managers.appMessagesManager.canForward(this.message));\n this.viewerPeerId = undefined;\n this.canOpenReactedList = undefined;\n this.linkToMessage = await this.getUrlToMessage();\n this.selectedMessagesText = await this.getSelectedMessagesText();\n\n const initResult = await this.init();\n if(!initResult) {\n return;\n }\n\n element = initResult.element;\n const {cleanup, destroy, menuPadding, reactionsMenu, reactionsMenuPosition} = initResult;\n let isReactionsMenuVisible = false;\n if(reactionsMenu) {\n const className = 'is-visible';\n isReactionsMenuVisible = reactionsMenu.container.classList.contains(className);\n if(isReactionsMenuVisible) reactionsMenu.container.classList.remove(className);\n\n if(reactionsMenuPosition === 'horizontal') {\n const offsetSize = element[/* reactionsMenuPosition === 'vertical' ? 'offsetHeight' : */'offsetWidth'];\n // if(reactionsMenu.scrollable.container.scrollWidth > offsetWidth) {\n const INNER_CONTAINER_PADDING = 8;\n const visibleLength = (offsetSize - INNER_CONTAINER_PADDING) / REACTION_CONTAINER_SIZE;\n const nextVisiblePart = visibleLength % 1;\n const MIN_NEXT_VISIBLE_PART = 0.65;\n if(nextVisiblePart < MIN_NEXT_VISIBLE_PART) {\n const minSize = (offsetSize + (MIN_NEXT_VISIBLE_PART - nextVisiblePart) * REACTION_CONTAINER_SIZE) | 0;\n element.style[/* reactionsMenuPosition === 'vertical' ? 'minHeight' : */'minWidth'] = minSize + 'px';\n }\n // }\n }\n }\n\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\n // bubble.parentElement.append(element);\n // appImManager.log('contextmenu', e, bubble, side);\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, element, side, menuPadding);\n\n if(reactionsMenu) {\n reactionsMenu.widthContainer.style.top = element.style.top;\n reactionsMenu.widthContainer.style.left = element.style.left;\n reactionsMenu.widthContainer.style.setProperty('--menu-width', element[reactionsMenuPosition === 'vertical' ? 'offsetHeight' : 'offsetWidth'] + 'px');\n element.parentElement.append(reactionsMenu.widthContainer);\n if(isReactionsMenuVisible) void reactionsMenu.container.offsetLeft; // reflow\n }\n\n contextMenuController.openBtnMenu(element, () => {\n if(reactionsMenu) {\n reactionsMenu.container.classList.remove('is-visible');\n }\n\n this.mid = 0;\n this.peerId = undefined;\n this.target = null;\n this.viewerPeerId = undefined;\n this.canOpenReactedList = undefined;\n cleanup();\n\n setTimeout(() => {\n destroy();\n }, 300);\n });\n\n if(isReactionsMenuVisible) {\n reactionsMenu.container.classList.add('is-visible');\n }\n };\n\n r();\n };\n\n public cleanup() {\n this.listenerSetter.removeAll();\n this.reactionsMenu && this.reactionsMenu.cleanup();\n this.middleware.clean();\n }\n\n public destroy() {\n this.cleanup();\n this.attachListenerSetter.removeAll();\n }\n\n private async filterButtons(buttons: ChatContextMenu['buttons']) {\n if(this.isSponsored) {\n return buttons.filter((button) => {\n return button.isSponsored;\n });\n } else {\n return filterAsync(buttons, async(button) => {\n let good: boolean;\n\n // if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\n if(this.chat.selection.isSelecting && !button.withSelection) {\n good = false;\n } else {\n good = this.isOverBubble || IS_TOUCH_SUPPORTED || true ?\n await button.verify() :\n button.notDirect && await button.verify() && button.notDirect();\n }\n\n return !!good;\n });\n }\n }\n\n private setButtons() {\n const verifyFavoriteSticker = async(toAdd: boolean) => {\n const doc = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document;\n if(!(doc as MyDocument)?.sticker) {\n return false;\n }\n\n const favedStickers = await this.managers.acknowledged.appStickersManager.getFavedStickersStickers();\n if(!favedStickers.cached) {\n return false;\n }\n\n const found = (await favedStickers.result).some((_doc) => _doc.id === doc.id);\n return toAdd ? !found : found;\n };\n\n this.buttons = [{\n icon: 'send2',\n text: 'MessageScheduleSend',\n onClick: this.onSendScheduledClick,\n verify: () => this.chat.type === 'scheduled' && !this.message.pFlags.is_outgoing\n }, {\n icon: 'send2',\n text: 'Message.Context.Selection.SendNow',\n onClick: this.onSendScheduledClick,\n verify: () => this.chat.type === 'scheduled' && this.isSelected && !this.chat.selection.selectionSendNowBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'schedule',\n text: 'MessageScheduleEditTime',\n onClick: () => {\n this.chat.input.scheduleSending(() => {\n assumeType(this.message);\n this.managers.appMessagesManager.editMessage(this.message, this.message.message, {\n scheduleDate: this.chat.input.scheduleDate,\n entities: this.message.entities\n });\n\n this.chat.input.onMessageSent(false, false);\n }, new Date(this.message.date * 1000));\n },\n verify: () => this.chat.type === 'scheduled'\n }, {\n icon: 'reply',\n text: 'Reply',\n onClick: this.onReplyClick,\n verify: async() => await this.chat.canSend() &&\n !this.message.pFlags.is_outgoing &&\n !!this.chat.input.messageInput &&\n this.chat.type !== 'scheduled'/* ,\n cancelEvent: true */\n }, {\n icon: 'favourites',\n text: 'AddToFavorites',\n onClick: this.onFaveStickerClick.bind(this, false),\n verify: () => verifyFavoriteSticker(true)\n }, {\n icon: 'favourites',\n text: 'DeleteFromFavorites',\n onClick: this.onFaveStickerClick.bind(this, true),\n verify: () => verifyFavoriteSticker(false)\n }, {\n icon: 'edit',\n text: 'Edit',\n onClick: this.onEditClick,\n verify: async() => (await this.managers.appMessagesManager.canEditMessage(this.message, 'text')) && !!this.chat.input.messageInput\n }, {\n icon: 'copy',\n text: 'Copy',\n onClick: this.onCopyClick,\n verify: () => !this.noForwards && !!(this.message as Message.message).message && !this.isTextSelected && (!this.isAnchorTarget || (this.message as Message.message).message !== this.target.innerText)\n }, {\n icon: 'copy',\n text: 'Chat.CopySelectedText',\n onClick: this.onCopyClick,\n verify: () => !this.noForwards && !!(this.message as Message.message).message && this.isTextSelected\n }, {\n icon: 'copy',\n text: 'Message.Context.Selection.Copy',\n onClick: this.onCopyClick,\n verify: async() => {\n if(!this.isSelected || this.noForwards) {\n return false;\n }\n\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\n const storageKey: MessagesStorageKey = `${peerId}_${this.chat.type === 'scheduled' ? 'scheduled' : 'history'}`;\n for(const mid of mids) {\n const message = (await this.managers.appMessagesManager.getMessageFromStorage(storageKey, mid)) as Message.message;\n if(!!message.message) {\n return true;\n }\n }\n }\n\n return false;\n },\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'CopyLink',\n onClick: this.onCopyAnchorLinkClick,\n verify: () => this.isAnchorTarget,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'Text.Context.Copy.Username',\n onClick: () => {\n copyTextToClipboard(this.target.innerHTML);\n },\n verify: () => this.isUsernameTarget,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'Text.Context.Copy.Hashtag',\n onClick: () => {\n copyTextToClipboard(this.target.innerHTML);\n },\n verify: () => this.target.classList.contains('anchor-hashtag'),\n withSelection: true\n }, {\n icon: 'link',\n text: 'MessageContext.CopyMessageLink1',\n onClick: this.onCopyLinkClick,\n verify: async() => await this.managers.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\n }, {\n icon: 'pin',\n text: 'Message.Context.Pin',\n onClick: this.onPinClick,\n verify: async() => !this.message.pFlags.is_outgoing &&\n this.message._ !== 'messageService' &&\n !this.message.pFlags.pinned &&\n await this.managers.appPeersManager.canPinMessage(this.peerId) &&\n this.chat.type !== 'scheduled'\n }, {\n icon: 'unpin',\n text: 'Message.Context.Unpin',\n onClick: this.onUnpinClick,\n verify: async() => (this.message as Message.message).pFlags.pinned && await this.managers.appPeersManager.canPinMessage(this.peerId)\n }, {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: () => {\n appDownloadManager.downloadToDisc({media: getMediaFromMessage(this.message)});\n },\n verify: () => {\n if(!canSaveMessageMedia(this.message) || this.noForwards) {\n return false;\n }\n\n const isPhoto: boolean = !!((this.message as Message.message).media as MessageMedia.messageMediaPhoto)?.photo;\n let isGoodType = false\n\n if(isPhoto) {\n isGoodType = true;\n } else {\n const doc: MyDocument = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document as any;\n if(!doc) return false;\n // isGoodType = doc.type && (['gif', 'video', 'audio', 'voice', 'sticker'] as MyDocument['type'][]).includes(doc.type)\n isGoodType = true;\n }\n\n let hasTarget = !!IS_TOUCH_SUPPORTED;\n\n if(isGoodType) hasTarget ||= !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio') || !!findUpClassName(this.target, 'media-sticker-wrapper') || !!findUpClassName(this.target, 'media-photo') || !!findUpClassName(this.target, 'media-video');\n\n return isGoodType && hasTarget;\n }\n }, {\n icon: 'checkretract',\n text: 'Chat.Poll.Unvote',\n onClick: this.onRetractVote,\n verify: () => {\n const poll = (this.message as any).media?.poll as Poll;\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\n }/* ,\n cancelEvent: true */\n }, {\n icon: 'stop',\n text: 'Chat.Poll.Stop',\n onClick: this.onStopPoll,\n verify: async() => {\n const poll = (this.message as any).media?.poll;\n return await this.managers.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\n }/* ,\n cancelEvent: true */\n }, {\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick, // let forward the message if it's outgoing but not ours (like a changelog)\n verify: () => !this.noForwards && this.chat.type !== 'scheduled' && (!this.message.pFlags.is_outgoing || this.message.fromId === SERVICE_PEER_ID) && this.message._ !== 'messageService'\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.chat.selection.selectionForwardBtn &&\n this.isSelected &&\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'flag',\n text: 'ReportChat',\n onClick: () => {\n new PopupReportMessages(this.peerId, [this.mid]);\n },\n verify: async() => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && await this.managers.appPeersManager.isChannel(this.peerId),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick,\n verify: () => !(this.message as Message.messageService).action && !this.isSelected && this.isSelectable,\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n notDirect: () => true,\n withSelection: true\n }, {\n onClick: () => {\n if(this.viewerPeerId) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.viewerPeerId\n });\n } else if(this.canOpenReactedList) {\n new PopupReactedList(this.message as Message.message);\n } else {\n return false;\n }\n },\n verify: async() => !this.peerId.isUser() && (!!(this.message as Message.message).reactions?.recent_reactions?.length || await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)),\n notDirect: () => true,\n localName: 'views'\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(this.message)\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'info',\n text: 'Chat.Message.Sponsored.What',\n onClick: () => {\n new PopupSponsored();\n },\n verify: () => false,\n isSponsored: true\n }, {\n // icon: 'smile',\n text: 'Loading',\n onClick: () => {\n this.emojiInputsPromise.then((inputs) => {\n new PopupStickers(inputs, true).show();\n });\n },\n verify: () => !!this.getUniqueCustomEmojisFromMessage().length,\n notDirect: () => true,\n localName: 'emojis'\n }];\n }\n\n private getUniqueCustomEmojisFromMessage() {\n const docIds: DocId[] = [];\n\n const message = this.albumMessages ? getAlbumText(this.albumMessages) || this.message : this.message;\n\n const entities = (message as Message.message).entities;\n if(entities) {\n const filtered = entities.filter((entity) => entity._ === 'messageEntityCustomEmoji') as MessageEntity.messageEntityCustomEmoji[];\n docIds.push(...filtered.map((entity) => entity.document_id));\n }\n\n const reactions = (message as Message.message).reactions;\n if(reactions) {\n const results = reactions.results.filter((reactionCount) => reactionCount.reaction._ === 'reactionCustomEmoji');\n docIds.push(...results.map((reactionCount) => (reactionCount.reaction as Reaction.reactionCustomEmoji).document_id));\n }\n\n return filterUnique(docIds);\n }\n\n private async init() {\n this.cleanup();\n this.setButtons();\n\n const filteredButtons = await this.filterButtons(this.buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const element = this.element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter: this.listenerSetter\n });\n element.id = 'bubble-contextmenu';\n element.classList.add('contextmenu');\n\n const viewsButton = filteredButtons.find((button) => button.localName === 'views');\n if(viewsButton) {\n const reactions = (this.message as Message.message).reactions;\n const recentReactions = reactions?.recent_reactions;\n const isViewingReactions = !!recentReactions?.length;\n const participantsCount = await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message) ?\n ((await this.managers.appPeersManager.getPeer(this.peerId)) as MTChat.chat).participants_count :\n undefined;\n const reactedLength = reactions ? reactions.results.reduce((acc, r) => acc + r.count, 0) : undefined;\n\n viewsButton.element.classList.add('tgico-' + (isViewingReactions ? 'reactions' : 'checks'));\n const i18nElem = new I18n.IntlElement({\n key: isViewingReactions ? (\n participantsCount === undefined ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted'\n ) : 'NobodyViewed',\n args: isViewingReactions ? (\n participantsCount === undefined ? [reactedLength] : [participantsCount, participantsCount]\n ) : undefined,\n element: viewsButton.textElement\n });\n\n let fakeText: HTMLElement;\n if(isViewingReactions) {\n if(participantsCount === undefined) {\n fakeText = i18n('Chat.Context.ReactedFast', [reactedLength]);\n } else {\n fakeText = i18n(\n recentReactions.length === participantsCount ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\n [recentReactions.length, participantsCount]\n );\n }\n } else {\n fakeText = i18n('Loading');\n }\n\n fakeText.classList.add('btn-menu-item-text-fake');\n viewsButton.element.append(fakeText);\n\n const AVATAR_SIZE = 22;\n const MAX_AVATARS = 3;\n const PADDING_PER_AVATAR = 1.125;\n i18nElem.element.style.visibility = 'hidden';\n i18nElem.element.style.paddingRight = isViewingReactions ? PADDING_PER_AVATAR * Math.min(MAX_AVATARS, recentReactions.length) + 'rem' : '1rem';\n const middleware = this.middleware.get();\n this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message as Message.message).then((result) => {\n if(!middleware()) {\n return;\n }\n\n if(fakeText) {\n fakeText.remove();\n }\n\n const reactions = result.combined;\n const reactedLength = participantsCount === undefined ?\n result.reactionsCount :\n (\n isViewingReactions ?\n reactions.filter((reaction) => reaction.reaction).length :\n reactions.length\n );\n\n let fakeElem: HTMLElement;\n if(reactions.length === 1) {\n fakeElem = new PeerTitle({\n peerId: reactions[0].peerId,\n onlyFirstName: true,\n dialog: false\n }).element;\n\n if(!isViewingReactions || result.readParticipants.length <= 1) {\n this.viewerPeerId = reactions[0].peerId;\n }\n } else if(isViewingReactions) {\n const isFull = reactedLength === reactions.length || participantsCount === undefined;\n fakeElem = i18n(\n isFull ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\n isFull ? [reactedLength] : [reactedLength, reactions.length]\n );\n } else {\n if(!reactions.length) {\n i18nElem.element.style.visibility = '';\n } else {\n fakeElem = i18n('MessageSeen', [reactions.length]);\n }\n }\n\n if(fakeElem) {\n fakeElem.style.paddingRight = PADDING_PER_AVATAR * Math.min(MAX_AVATARS, reactedLength) + 'rem';\n fakeElem.classList.add('btn-menu-item-text-fake');\n viewsButton.element.append(fakeElem);\n }\n\n if(reactions.length) {\n const avatars = new StackedAvatars({avatarSize: AVATAR_SIZE});\n avatars.render(recentReactions ? recentReactions.map((r) => getPeerId(r.peer_id)) : reactions.map((reaction) => reaction.peerId));\n viewsButton.element.append(avatars.container);\n\n // if(reactions.length > 1) {\n // if(isViewingReactions) {\n this.canOpenReactedList = true;\n // }\n }\n });\n }\n\n let menuPadding: MenuPositionPadding;\n let reactionsMenu: ChatReactionsMenu;\n let reactionsMenuPosition: 'horizontal' | 'vertical';\n if(\n this.message._ === 'message' &&\n !this.chat.selection.isSelecting &&\n !this.message.pFlags.is_outgoing &&\n !this.message.pFlags.is_scheduled &&\n !this.message.pFlags.local\n ) {\n reactionsMenuPosition = (IS_APPLE || IS_TOUCH_SUPPORTED)/* && false */ ? 'horizontal' : 'vertical';\n reactionsMenu = this.reactionsMenu = new ChatReactionsMenu(this.managers, reactionsMenuPosition, this.middleware);\n reactionsMenu.init(await this.managers.appMessagesManager.getGroupsFirstMessage(this.message));\n // element.prepend(reactionsMenu.widthContainer);\n\n const size = 36;\n const margin = 8;\n const totalSize = size + margin;\n const paddingLeft = 0, paddingRight = 0;\n if(reactionsMenuPosition === 'vertical') {\n menuPadding = {\n top: paddingLeft,\n // bottom: 36, // positionMenu will detect it itself somehow\n left: totalSize\n };\n } else {\n menuPadding = {\n top: totalSize,\n right: paddingRight,\n left: paddingLeft\n };\n }\n }\n\n const emojisButton = filteredButtons.find((button) => button.localName === 'emojis');\n if(emojisButton) {\n emojisButton.element.classList.add('is-multiline');\n emojisButton.element.parentElement.insertBefore(document.createElement('hr'), emojisButton.element);\n\n const setPadding = () => {\n menuPadding ??= {};\n menuPadding.bottom = 24;\n };\n\n const docIds = this.getUniqueCustomEmojisFromMessage();\n const inputsPromise = this.emojiInputsPromise = deferredPromise();\n\n await this.managers.appEmojiManager.getCachedCustomEmojiDocuments(docIds).then(async(docs) => {\n const p = async(docs: Document.document[]) => {\n const s: Map = new Map();\n docs.forEach((doc) => {\n if(!doc || s.has(doc.stickerSetInput.id)) {\n return;\n }\n\n s.set(doc.stickerSetInput.id, doc.stickerSetInput);\n });\n\n const inputs = [...s.values()];\n inputsPromise.resolve(inputs);\n if(s.size === 1) {\n const result = await this.managers.acknowledged.appStickersManager.getStickerSet(inputs[0]);\n const promise = result.result.then((set) => {\n const el = i18n('MessageContainsEmojiPack', [wrapEmojiText(set.set.title)]);\n replaceContent(emojisButton.textElement, el);\n });\n\n return result.cached ? promise : (setPadding(), undefined);\n }\n\n replaceContent(emojisButton.textElement, i18n('MessageContainsEmojiPacks', [s.size]));\n };\n\n if(docs.some((doc) => !doc)) {\n setPadding();\n this.managers.appEmojiManager.getCustomEmojiDocuments(docIds).then(p);\n } else {\n return p(docs);\n }\n });\n // emojisButton.element.append(i18n('Loading'));\n }\n\n this.chat.container.append(element);\n\n return {\n element,\n cleanup: () => {\n this.cleanup();\n reactionsMenu && reactionsMenu.cleanup();\n },\n destroy: () => {\n element.remove();\n reactionsMenu && reactionsMenu.widthContainer.remove();\n },\n menuPadding,\n reactionsMenu,\n reactionsMenuPosition\n };\n }\n\n private async getUrlToMessage() {\n if(this.peerId.isUser()) {\n return;\n }\n\n let threadMessage: Message.message;\n const {peerId, mid} = this;\n const threadId = this.chat.threadId;\n if(this.chat.type === 'discussion') {\n threadMessage = (await this.managers.appMessagesManager.getMessageByPeer(peerId, threadId)) as Message.message;\n }\n\n const username = await this.managers.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : peerId);\n const msgId = getServerMessageId(mid);\n let url = 'https://t.me/';\n if(username) {\n url += username;\n if(threadMessage) url += `/${getServerMessageId(threadMessage.fwd_from.channel_post)}?comment=${msgId}`;\n else if(threadId) url += `/${getServerMessageId(threadId)}/${msgId}`;\n else url += '/' + msgId;\n } else {\n url += 'c/' + peerId.toChatId();\n if(threadMessage) url += `/${msgId}?thread=${getServerMessageId(threadMessage.mid)}`;\n else if(threadId) url += `/${getServerMessageId(threadId)}/${msgId}`;\n else url += '/' + msgId;\n }\n\n return {url, isPrivate: !username};\n }\n\n private async getSelectedMessagesText() {\n if(!isSelectionEmpty()) {\n return '';\n }\n\n const mids = this.chat.selection.isSelecting ?\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) :\n [this.mid];\n\n const parts: string[] = await Promise.all(mids.map(async(mid) => {\n const message = (await this.chat.getMessage(mid)) as Message.message;\n return message?.message ? message.message + '\\n' : '';\n }));\n\n return parts.join('');\n }\n\n private onSendScheduledClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\n } else {\n new PopupSendNow(this.peerId, await this.chat.getMidsByMid(this.mid));\n }\n };\n\n private onReplyClick = () => {\n this.chat.input.initMessageReply(this.mid);\n };\n\n private onFaveStickerClick = (unfave?: boolean) => {\n const docId = ((this.message as Message.message).media as MessageMedia.messageMediaDocument).document.id;\n this.managers.appStickersManager.faveSticker(docId, unfave);\n };\n\n private onEditClick = () => {\n this.chat.input.initMessageEditing(this.mid);\n };\n\n private onCopyClick = async() => {\n if(isSelectionEmpty()) {\n copyTextToClipboard(this.selectedMessagesText);\n } else {\n document.execCommand('copy');\n // cancelSelection();\n }\n };\n\n private onCopyAnchorLinkClick = () => {\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\n };\n\n private onCopyLinkClick = () => {\n const {url, isPrivate} = this.linkToMessage;\n const key: LangPackKey = isPrivate ? 'LinkCopiedPrivateInfo' : 'LinkCopied';\n toast(I18n.format(key, true));\n copyTextToClipboard(url);\n };\n\n private onPinClick = () => {\n new PopupPinMessage(this.peerId, this.mid);\n };\n\n private onUnpinClick = () => {\n new PopupPinMessage(this.peerId, this.mid, true);\n };\n\n private onRetractVote = () => {\n this.managers.appPollsManager.sendVote(this.message as Message.message, []);\n };\n\n private onStopPoll = () => {\n this.managers.appPollsManager.stopPoll(this.message as Message.message);\n };\n\n private onForwardClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\n } else {\n const peerId = this.peerId;\n const mids = this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid);\n new PopupForward({\n [peerId]: mids\n });\n }\n };\n\n private onSelectClick = () => {\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\n };\n\n private onClearSelectionClick = () => {\n this.chat.selection.cancelSelection();\n };\n\n private onDeleteClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid), this.chat.type);\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport rootScope from '../../lib/rootScope';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\n\nexport default class SendMenu {\n public sendMenu: HTMLElement;\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n private type: 'schedule' | 'reminder';\n\n constructor(options: {\n onSilentClick: () => void,\n onScheduleClick: () => void,\n listenerSetter?: ListenerSetter,\n openSide: string,\n onContextElement: HTMLElement,\n onOpen?: () => boolean\n }) {\n this.sendMenuButtons = [{\n icon: 'mute',\n text: 'Chat.Send.WithoutSound',\n onClick: options.onSilentClick,\n verify: () => this.type === 'schedule'\n }, {\n icon: 'schedule',\n text: 'Chat.Send.ScheduledMessage',\n onClick: options.onScheduleClick,\n verify: () => this.type === 'schedule'\n }, {\n icon: 'schedule',\n text: 'Chat.Send.SetReminder',\n onClick: options.onScheduleClick,\n verify: () => this.type === 'reminder'\n }];\n\n this.sendMenu = ButtonMenuSync({buttons: this.sendMenuButtons, listenerSetter: options.listenerSetter});\n this.sendMenu.classList.add('menu-send', options.openSide);\n\n attachContextMenuListener({\n element: options.onContextElement,\n callback: (e) => {\n if(options.onOpen && !options.onOpen()) {\n return;\n }\n\n this.sendMenuButtons.forEach((button) => {\n button.element.classList.toggle('hide', !button.verify());\n });\n\n cancelEvent(e);\n contextMenuController.openBtnMenu(this.sendMenu);\n },\n listenerSetter: options.listenerSetter\n });\n }\n\n public setPeerId(peerId: PeerId) {\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\n }\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from '../chat/chat';\nimport PopupElement from '.';\nimport CheckboxField from '../checkboxField';\nimport InputField from '../inputField';\nimport RadioField from '../radioField';\nimport Scrollable from '../scrollable';\nimport SendContextMenu from '../chat/sendContextMenu';\nimport I18n, {_i18n} from '../../lib/langPack';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {Poll} from '../../layer';\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\n\nconst MAX_LENGTH_QUESTION = 255;\nconst MAX_LENGTH_OPTION = 100;\nconst MAX_LENGTH_SOLUTION = 200;\n\nexport default class PopupCreatePoll extends PopupElement {\n private questionInputField: InputField;\n private questions: HTMLElement;\n protected scrollable: Scrollable;\n private tempId = 0;\n\n private anonymousCheckboxField: CheckboxField;\n private multipleCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\n private quizCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\n\n private correctAnswers: Uint8Array[];\n private quizSolutionField: InputField;\n private optionInputFields: InputField[];\n\n constructor(private chat: Chat) {\n super('popup-create-poll popup-new-media', {closable: true, withConfirm: 'Create', body: true, title: 'NewPoll'});\n this.construct();\n }\n\n private async construct() {\n this.questionInputField = new InputField({\n placeholder: 'AskAQuestion',\n label: 'AskAQuestion',\n name: 'question',\n maxLength: MAX_LENGTH_QUESTION\n });\n\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\n this.handleChange();\n });\n\n this.optionInputFields = [];\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.header.append(this.questionInputField.container);\n\n const hr = document.createElement('hr');\n const d = document.createElement('div');\n d.classList.add('caption');\n _i18n(d, 'PollOptions');\n\n this.questions = document.createElement('form');\n this.questions.classList.add('poll-create-questions');\n\n const dd = document.createElement('div');\n dd.classList.add('poll-create-settings');\n\n const settingsCaption = document.createElement('div');\n settingsCaption.classList.add('caption');\n _i18n(settingsCaption, 'Settings');\n\n if(!(await this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))) {\n this.anonymousCheckboxField = new CheckboxField({\n text: 'NewPoll.Anonymous',\n name: 'anonymous'\n });\n this.anonymousCheckboxField.input.checked = true;\n dd.append(this.anonymousCheckboxField.label);\n }\n\n this.multipleCheckboxField = new CheckboxField({\n text: 'NewPoll.MultipleChoice',\n name: 'multiple'\n });\n this.quizCheckboxField = new CheckboxField({\n text: 'NewPoll.Quiz',\n name: 'quiz'\n });\n\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\n const checked = this.multipleCheckboxField.input.checked;\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\n });\n\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\n const checked = this.quizCheckboxField.input.checked;\n\n (Array.from(this.questions.children) as HTMLElement[]).map((el) => {\n el.classList.toggle('radio-field', checked);\n });\n\n if(!checked) {\n this.correctAnswers = undefined;\n this.quizSolutionField.setValueSilently('');\n }\n\n quizElements.forEach((el) => el.classList.toggle('hide', !checked));\n\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\n this.handleChange();\n });\n\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\n\n const quizElements: HTMLElement[] = [];\n\n const quizSolutionCaption = document.createElement('div');\n quizSolutionCaption.classList.add('caption');\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\n\n const quizHr = document.createElement('hr');\n\n const quizSolutionContainer = document.createElement('div');\n quizSolutionContainer.classList.add('poll-create-questions');\n\n this.quizSolutionField = new InputField({\n placeholder: 'NewPoll.Explanation.Placeholder',\n label: 'NewPoll.Explanation.Placeholder',\n name: 'solution',\n maxLength: MAX_LENGTH_SOLUTION\n });\n\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\n this.handleChange();\n });\n\n const quizSolutionSubtitle = document.createElement('div');\n quizSolutionSubtitle.classList.add('subtitle');\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\n\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\n\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\n quizElements.forEach((el) => el.classList.add('hide'));\n\n this.body.parentElement.insertBefore(hr, this.body);\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\n\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\n\n this.scrollable = new Scrollable(this.body);\n this.appendMoreField();\n\n this.onEscape = () => {\n return !this.getFilledAnswers().length;\n };\n\n this.handleChange();\n }\n\n private getFilledAnswers() {\n const answers = Array.from(this.questions.children).map((el, idx) => {\n const input = el.querySelector('.input-field-input') as HTMLElement;\n return input instanceof HTMLInputElement ? input.value : getRichValueWithCaret(input, false, false).value;\n }).filter((v) => !!v.trim());\n\n return answers;\n }\n\n private onSubmitClick = () => {\n this.send();\n };\n\n private validate() {\n const question = this.questionInputField.value;\n if(!question) {\n return false;\n }\n\n if(question.length > MAX_LENGTH_QUESTION) {\n return false;\n }\n\n if(this.quizCheckboxField.input.checked && !this.correctAnswers?.length) {\n return false;\n }\n\n const answers = this.getFilledAnswers();\n if(answers.length < 2) {\n return false;\n }\n\n const tooLongOption = answers.find((a) => a.length > MAX_LENGTH_OPTION);\n if(tooLongOption) {\n return false;\n }\n\n const {value: quizSolution} = getRichValueWithCaret(this.quizSolutionField.input, false, false);\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\n return false;\n }\n\n return true;\n }\n\n private handleChange() {\n const valid = this.validate();\n this.btnConfirm.toggleAttribute('disabled', !valid);\n }\n\n public async send(force = false) {\n const question = this.questionInputField.value;\n\n const answers = this.getFilledAnswers();\n\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValueWithCaret(this.quizSolutionField.input, true, false);\n\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n\n return;\n }\n\n this.hide();\n\n // const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\n // const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\n\n const pFlags: Poll['pFlags'] = {};\n\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\n pFlags.public_voters = true;\n }\n\n if(this.multipleCheckboxField.input.checked) {\n pFlags.multiple_choice = true;\n }\n\n if(this.quizCheckboxField.input.checked) {\n pFlags.quiz = true;\n }\n\n const poll: Poll = {\n _: 'poll',\n pFlags,\n question,\n answers: answers.map((value, idx) => {\n return {\n _: 'pollAnswer',\n text: value,\n option: new Uint8Array([idx])\n };\n }),\n id: undefined\n };\n // poll.id = randomIDS;\n\n const inputMediaPoll = await this.chat.managers.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\n\n // console.log('Will try to create poll:', inputMediaPoll);\n\n this.chat.managers.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\n ...this.chat.getMessageSendingParams()\n });\n\n if(this.chat.input.helperType === 'reply') {\n this.chat.input.clearHelper();\n }\n\n this.chat.input.onMessageSent(false, false);\n }\n\n onInput = (e: Event) => {\n const target = e.target as HTMLInputElement;\n\n const radioLabel = findUpTag(target, 'LABEL');\n const isEmpty = isInputEmpty(target);\n if(!isEmpty) {\n target.parentElement.classList.add('is-filled');\n radioLabel.classList.remove('hidden-widget');\n radioLabel.firstElementChild.removeAttribute('disabled');\n }\n\n const isLast = !radioLabel.nextElementSibling;\n if(isLast && !isEmpty && this.questions.childElementCount < 10) {\n this.appendMoreField();\n }\n\n this.handleChange();\n };\n\n onDeleteClick = (e: MouseEvent) => {\n const target = e.target as HTMLSpanElement;\n const label = findUpTag(target, 'LABEL');\n const idx = whichChild(label);\n\n if(this.correctAnswers && this.correctAnswers[0][0] === idx) {\n this.correctAnswers = undefined;\n }\n\n label.remove();\n this.optionInputFields.splice(idx, 1);\n\n this.optionInputFields.forEach((inputField, idx) => {\n inputField.options.labelOptions.length = 0;\n inputField.options.labelOptions.push(idx + 1);\n const i18nElement = I18n.weakMap.get(inputField.label.firstElementChild as HTMLElement);\n i18nElement.update();\n });\n\n this.handleChange();\n };\n\n private appendMoreField() {\n const tempId = this.tempId++;\n const idx = this.questions.childElementCount + 1;\n const questionField = new InputField({\n placeholder: 'NewPoll.OptionsAddOption',\n label: 'NewPoll.OptionLabel',\n labelOptions: [idx],\n name: 'question-' + tempId,\n maxLength: MAX_LENGTH_OPTION\n });\n this.listenerSetter.add(questionField.input)('input', this.onInput);\n\n const radioField = new RadioField({\n text: '',\n name: 'question'\n });\n radioField.main.append(questionField.container);\n attachClickEvent(questionField.input, cancelEvent, {listenerSetter: this.listenerSetter});\n radioField.label.classList.add('hidden-widget');\n radioField.input.disabled = true;\n if(!this.quizCheckboxField.input.checked) {\n radioField.label.classList.remove('radio-field');\n }\n this.listenerSetter.add(radioField.input)('change', () => {\n const checked = radioField.input.checked;\n if(checked) {\n const idx = whichChild(radioField.label);\n this.correctAnswers = [new Uint8Array([idx])];\n this.handleChange();\n }\n });\n\n const deleteBtn = document.createElement('span');\n deleteBtn.classList.add('btn-icon', 'tgico-close');\n questionField.container.append(deleteBtn);\n\n attachClickEvent(deleteBtn, this.onDeleteClick, {listenerSetter: this.listenerSetter, once: true});\n\n this.questions.append(radioField.label);\n\n this.scrollable.scrollIntoViewNew({\n element: this.questions.lastElementChild as HTMLElement,\n position: 'center'\n });\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\n\n this.optionInputFields.push(questionField);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from './schedulers/pause';\nimport {makeMediaSize} from './mediaSize';\nimport scaleMediaElement from './canvas/scaleMediaElement';\nimport preloadVideo from './preloadVideo';\n\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\n let width: number, height: number;\n if(media instanceof HTMLVideoElement) {\n width = media.videoWidth;\n height = media.videoHeight;\n } else {\n width = media.naturalWidth;\n height = media.naturalHeight;\n }\n\n return scaleMediaElement({\n media,\n mediaSize: makeMediaSize(width, height),\n boxSize: makeMediaSize(320, 240),\n quality: .9\n });\n}\n\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\n return new Promise((resolve, reject) => {\n video.onseeked = () => {\n video.onseeked = () => {\n createPosterFromMedia(video).then(resolve);\n\n video.onseeked = undefined;\n };\n\n video.currentTime = 0;\n };\n\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n });\n}\n\nexport async function createPosterForVideo(url: string) {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise,\n createPosterFromVideo(video)\n ]);\n}\n\n\n","/**\n * @returns duration in ms\n */\nexport default function getGifDuration(image: HTMLImageElement) {\n const src = image.src;\n\n return fetch(src)\n .then((response) => response.arrayBuffer())\n .then((arrayBuffer) => {\n const d = new Uint8Array(arrayBuffer);\n // Thanks to http://justinsomnia.org/2006/10/gif-animation-duration-calculation/\n // And http://www.w3.org/Graphics/GIF/spec-gif89a.txt\n let duration = 0;\n for(let i = 0, length = d.length; i < length; ++i) {\n // Find a Graphic Control Extension hex(21F904__ ____ __00)\n if(d[i] == 0x21 &&\n d[i + 1] == 0xF9 &&\n d[i + 2] == 0x04 &&\n d[i + 7] == 0x00) {\n // Swap 5th and 6th bytes to get the delay per frame\n const delay = (d[i + 5] << 8) | (d[i + 4] & 0xFF);\n\n // Should be aware browsers have a minimum frame delay\n // e.g. 6ms for IE, 2ms modern browsers (50fps)\n duration += delay < 2 ? 10 : delay;\n }\n }\n\n return duration / 1000;\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {USING_BOMS} from '../helpers/dom/richInputHandler';\nimport BOM from '../helpers/string/bom';\nimport {_i18n} from '../lib/langPack';\nimport InputField, {InputFieldOptions} from './inputField';\nimport SetTransition from './singleTransition';\n\nconst USELESS_REG_EXP = new RegExp(`(${BOM})|()`, 'g');\n\nexport default class InputFieldAnimated extends InputField {\n public inputFake: HTMLElement;\n public onChangeHeight: (height: number) => void;\n\n // public onLengthChange: (length: number, isOverflow: boolean) => void;\n // protected wasInputFakeClientHeight: number;\n // protected showScrollDebounced: () => void;\n\n constructor(options?: InputFieldOptions) {\n super(options);\n\n this.input.addEventListener('input', () => {\n this.updateInnerHTML();\n this.onFakeInput();\n });\n\n if(options.placeholder) {\n _i18n(this.inputFake, options.placeholder, undefined, 'placeholder');\n }\n\n this.input.classList.add('scrollable', 'scrollable-y', 'no-scrollbar');\n // this.wasInputFakeClientHeight = 0;\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\n this.inputFake = document.createElement('div');\n // this.inputFake.contentEditable = 'true';\n this.inputFake.contentEditable = 'true';\n this.inputFake.tabIndex = -1;\n this.inputFake.className = this.input.className + ' input-field-input-fake';\n }\n\n public onFakeInput(setHeight = true) {\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\n this.showScrollDebounced();\n } */\n\n const currentHeight = +this.input.style.height.replace('px', '');\n if(currentHeight === newHeight) {\n return;\n }\n\n const TRANSITION_DURATION_FACTOR = 50;\n const transitionDuration = Math.round(\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight))\n );\n\n // this.wasInputFakeClientHeight = clientHeight;\n this.input.style.transitionDuration = `${transitionDuration}ms`;\n\n if(setHeight) {\n this.onChangeHeight?.(newHeight);\n this.input.style.height = newHeight ? newHeight + 'px' : '';\n }\n\n const className = 'is-changing-height';\n SetTransition({\n element: this.input,\n className,\n forwards: true,\n duration: transitionDuration,\n onTransitionEnd: () => {\n this.input.classList.remove(className);\n }\n });\n }\n\n protected updateInnerHTML(innerHTML = this.input.innerHTML) {\n innerHTML = innerHTML.replace(//, '')\n .replace(/().+?\\/custom-emoji-element>/g, '$1')\n\n if(USING_BOMS) {\n innerHTML = innerHTML.replace(USELESS_REG_EXP, '');\n }\n\n this.inputFake.innerHTML = innerHTML;\n }\n\n public setValueSilently(value: Parameters[0], fromSet?: boolean) {\n super.setValueSilently(value, fromSet);\n\n this.updateInnerHTML();\n if(!fromSet) {\n this.onFakeInput();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from '../chat/chat';\nimport type {SendFileDetails} from '../../lib/appManagers/appMessagesManager';\nimport InputField from '../inputField';\nimport PopupElement from '.';\nimport Scrollable from '../scrollable';\nimport {toast} from '../toast';\nimport CheckboxField from '../checkboxField';\nimport SendContextMenu from '../chat/sendContextMenu';\nimport {createPosterFromMedia, createPosterFromVideo} from '../../helpers/createPoster';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport I18n, {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\nimport calcImageInBox from '../../helpers/calcImageInBox';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport getGifDuration from '../../helpers/getGifDuration';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport prepareAlbum from '../prepareAlbum';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport {ThumbCache} from '../../lib/storages/thumbs';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport {THUMB_TYPE_FULL} from '../../lib/mtproto/mtproto_config';\nimport wrapDocument from '../wrappers/document';\nimport createContextMenu from '../../helpers/dom/createContextMenu';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport wrapMediaSpoiler, {toggleMediaSpoiler} from '../wrappers/mediaSpoiler';\nimport {MiddlewareHelper} from '../../helpers/middleware';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport scaleMediaElement from '../../helpers/canvas/scaleMediaElement';\nimport {doubleRaf} from '../../helpers/schedulers';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport {Photo, PhotoSize} from '../../layer';\nimport {getPreviewBytesFromURL} from '../../helpers/bytes/getPreviewURLFromBytes';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport partition from '../../helpers/array/partition';\nimport InputFieldAnimated from '../inputFieldAnimated';\n\ntype SendFileParams = SendFileDetails & {\n file?: File,\n scaledBlob?: Blob,\n noSound?: boolean,\n itemDiv: HTMLElement,\n mediaSpoiler?: HTMLElement,\n middlewareHelper: MiddlewareHelper\n // strippedBytes?: PhotoSize.photoStrippedSize['bytes']\n};\n\nlet currentPopup: PopupNewMedia;\n\nconst MAX_WIDTH = 400 - 16;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private mediaContainer: HTMLElement;\n private wasInputValue: string;\n\n private willAttach: Partial<{\n type: 'media' | 'document',\n isMedia: true,\n group: boolean,\n sendFileDetails: SendFileParams[]\n }>;\n private messageInputField: InputFieldAnimated;\n private captionLengthMax: number;\n\n private animationGroup: AnimationItemGroup;\n private _scrollable: Scrollable;\n private inputContainer: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private files: File[],\n willAttachType: PopupNewMedia['willAttach']['type'],\n private ignoreInputValue?: boolean\n ) {\n super('popup-send-photo popup-new-media', {\n closable: true,\n withConfirm: 'Modal.Send',\n confirmShortcutIsSendShortcut: true,\n body: true,\n title: true,\n scrollable: true\n });\n\n this.animationGroup = '';\n this.construct(willAttachType);\n }\n\n private async construct(willAttachType: PopupNewMedia['willAttach']['type']) {\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: true\n };\n\n const captionMaxLength = await this.managers.apiManager.getLimit('caption');\n this.captionLengthMax = captionMaxLength;\n\n attachClickEvent(this.btnConfirm, () => this.send(), {listenerSetter: this.listenerSetter});\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm,\n listenerSetter: this.listenerSetter\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n const btnMenu = await ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'image',\n text: 'Popup.Attach.AsMedia',\n onClick: () => this.changeType('media'),\n verify: () => this.hasAnyMedia() && this.willAttach.type === 'document'\n }, {\n icon: 'document',\n text: 'SendAsFile',\n onClick: () => this.changeType('document'),\n verify: () => this.files.length === 1 && this.willAttach.type !== 'document'\n }, {\n icon: 'document',\n text: 'SendAsFiles',\n onClick: () => this.changeType('document'),\n verify: () => this.files.length > 1 && this.willAttach.type !== 'document'\n }, {\n icon: 'groupmedia',\n text: 'Popup.Attach.GroupMedia',\n onClick: () => this.changeGroup(true),\n verify: () => !this.willAttach.group && this.canGroupSomething()\n }, {\n icon: 'groupmediaoff',\n text: 'Popup.Attach.UngroupMedia',\n onClick: () => this.changeGroup(false),\n verify: () => this.willAttach.group && this.canGroupSomething()\n }, {\n icon: 'mediaspoiler',\n text: 'EnablePhotoSpoiler',\n onClick: () => this.changeSpoilers(true),\n verify: () => this.canToggleSpoilers(true, true)\n }, {\n icon: 'mediaspoiler',\n text: 'Popup.Attach.EnableSpoilers',\n onClick: () => this.changeSpoilers(true),\n verify: () => this.canToggleSpoilers(true, false)\n }, {\n icon: 'mediaspoileroff',\n text: 'DisablePhotoSpoiler',\n onClick: () => this.changeSpoilers(false),\n verify: () => this.canToggleSpoilers(false, true)\n }, {\n icon: 'mediaspoileroff',\n text: 'Popup.Attach.RemoveSpoilers',\n onClick: () => this.changeSpoilers(false),\n verify: () => this.canToggleSpoilers(false, false)\n }]\n });\n\n this.header.append(btnMenu);\n\n this.btnConfirm.remove();\n\n this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n this.scrollable.container.append(this.mediaContainer);\n\n const inputContainer = this.inputContainer = document.createElement('div');\n inputContainer.classList.add('popup-input-container');\n\n const c = document.createElement('div');\n c.classList.add('popup-input-inputs', 'input-message-container');\n\n this.messageInputField = new InputFieldAnimated({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n name: 'message',\n withLinebreaks: true,\n maxLength: this.captionLengthMax\n });\n\n this.listenerSetter.add(this.scrollable.container)('scroll', this.onScroll);\n this.listenerSetter.add(this.messageInputField.input)('scroll', this.onScroll);\n\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\n\n c.append(this.messageInputField.input, this.messageInputField.inputFake);\n inputContainer.append(c, this.btnConfirm);\n\n if(!this.ignoreInputValue) {\n this.messageInputField.value = this.wasInputValue = this.chat.input.messageInputField.input.innerHTML;\n this.chat.input.messageInputField.value = '';\n }\n\n this.container.append(inputContainer);\n\n this.attachFiles();\n\n this.addEventListener('close', () => {\n this.files.length = 0;\n this.willAttach.sendFileDetails.length = 0;\n\n if(currentPopup === this) {\n currentPopup = undefined;\n }\n });\n\n let target: HTMLElement, isMedia: boolean, item: SendFileParams;\n createContextMenu({\n buttons: [{\n icon: 'mediaspoiler',\n text: 'EnablePhotoSpoiler',\n onClick: () => {\n this.applyMediaSpoiler(item);\n },\n verify: () => isMedia && !item.mediaSpoiler\n }, {\n icon: 'mediaspoileroff',\n text: 'DisablePhotoSpoiler',\n onClick: () => {\n this.removeMediaSpoiler(item);\n },\n verify: () => !!(isMedia && item.mediaSpoiler)\n }],\n listenTo: this.mediaContainer,\n listenerSetter: this.listenerSetter,\n findElement: (e) => {\n target = findUpClassName(e.target, 'popup-item');\n isMedia = target.classList.contains('popup-item-media');\n item = this.willAttach.sendFileDetails.find((i) => i.itemDiv === target);\n return target;\n }\n });\n\n currentPopup = this;\n }\n\n private onScroll = () => {\n const {input} = this.messageInputField;\n this.scrollable.onAdditionalScroll();\n if(input.scrollTop > 0 && input.scrollHeight > 130) {\n this.scrollable.container.classList.remove('scrolled-bottom');\n }\n };\n\n private async applyMediaSpoiler(item: SendFileParams, noAnimation?: boolean) {\n const middleware = item.middlewareHelper.get();\n const {width: widthStr, height: heightStr} = item.itemDiv.style;\n\n let width: number, height: number;\n if(item.itemDiv.classList.contains('album-item')) {\n const {width: containerWidthStr, height: containerHeightStr} = item.itemDiv.parentElement.style;\n const containerWidth = parseInt(containerWidthStr);\n const containerHeight = parseInt(containerHeightStr);\n\n width = +widthStr.slice(0, -1) / 100 * containerWidth;\n height = +heightStr.slice(0, -1) / 100 * containerHeight;\n } else {\n width = parseInt(widthStr);\n height = parseInt(heightStr);\n }\n\n const {url} = await scaleMediaElement({\n media: item.itemDiv.firstElementChild as HTMLImageElement,\n boxSize: makeMediaSize(40, 40),\n mediaSize: makeMediaSize(width, height),\n toDataURL: true,\n quality: 0.2\n });\n\n const strippedBytes = getPreviewBytesFromURL(url);\n const photoSize: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: strippedBytes,\n type: 'i'\n };\n\n item.strippedBytes = strippedBytes;\n\n const photo: Photo.photo = {\n _: 'photo',\n sizes: [\n photoSize\n ],\n id: 0,\n access_hash: 0,\n date: 0,\n dc_id: 0,\n file_reference: []\n };\n\n const mediaSpoiler = await wrapMediaSpoiler({\n middleware,\n width,\n height,\n animationGroup: this.animationGroup,\n media: photo\n });\n\n if(!middleware()) {\n return;\n }\n\n if(!noAnimation) {\n mediaSpoiler.classList.add('is-revealing');\n }\n\n item.mediaSpoiler = mediaSpoiler;\n item.itemDiv.append(mediaSpoiler);\n\n await doubleRaf();\n if(!middleware()) {\n return;\n }\n\n toggleMediaSpoiler({\n mediaSpoiler,\n reveal: false\n });\n }\n\n private removeMediaSpoiler(item: SendFileParams) {\n toggleMediaSpoiler({\n mediaSpoiler: item.mediaSpoiler,\n reveal: true,\n destroyAfter: true\n });\n\n item.mediaSpoiler = undefined;\n }\n\n public appendDrops(element: HTMLElement) {\n this.body.append(element);\n }\n\n get type() {\n return this.willAttach.type;\n }\n\n set type(type: PopupNewMedia['willAttach']['type']) {\n this.willAttach.type = type;\n }\n\n private partition() {\n const [media, files] = partition(this.willAttach.sendFileDetails, (d) => MEDIA_MIME_TYPES_SUPPORTED.has(d.file.type));\n return {\n media,\n files\n };\n }\n\n private mediaCount() {\n return this.partition().media.length;\n }\n\n private hasAnyMedia() {\n return this.mediaCount() > 0;\n }\n\n private canGroupSomething() {\n const {media, files} = this.partition();\n return media.length > 1 || files.length > 1;\n }\n\n private canToggleSpoilers(toggle: boolean, single: boolean) {\n let good = this.willAttach.type === 'media' && this.hasAnyMedia();\n if(single && good) {\n good = this.files.length === 1;\n }\n\n if(good) {\n const media = this.willAttach.sendFileDetails\n .filter((d) => MEDIA_MIME_TYPES_SUPPORTED.has(d.file.type))\n const mediaWithSpoilers = media.filter((d) => d.mediaSpoiler);\n\n good = single ? true : media.length > 1;\n\n if(good) {\n good = toggle ? media.length !== mediaWithSpoilers.length : media.length === mediaWithSpoilers.length;\n }\n }\n\n return good;\n }\n\n private changeType(type: PopupNewMedia['willAttach']['type']) {\n this.willAttach.type = type;\n this.attachFiles();\n }\n\n public changeGroup(group: boolean) {\n this.willAttach.group = group;\n this.attachFiles();\n }\n\n public changeSpoilers(toggle: boolean) {\n this.partition().media.forEach((item) => {\n if(toggle && !item.mediaSpoiler) {\n this.applyMediaSpoiler(item);\n } else if(!toggle && item.mediaSpoiler) {\n this.removeMediaSpoiler(item);\n }\n });\n }\n\n public addFiles(files: File[]) {\n const toPush = files.filter((file) => {\n const found = this.files.find((_file) => {\n return _file.lastModified === file.lastModified && _file.name === file.name && _file.size === file.size;\n });\n\n return !found;\n });\n\n if(toPush.length) {\n this.files.push(...toPush);\n this.attachFiles();\n }\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n const {input} = this.messageInputField;\n if(target !== input) {\n if(target.tagName === 'INPUT' || target.isContentEditable) {\n return;\n }\n\n input.focus();\n placeCaretAtEnd(input);\n }\n };\n\n private send(force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n\n return;\n }\n\n let caption = this.messageInputField.value;\n if(caption.length > this.captionLengthMax) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' || undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n const {peerId, input} = this.chat;\n\n const {length} = sendFileDetails;\n const sendingParams = this.chat.getMessageSendingParams();\n this.iterate((sendFileParams) => {\n if(caption && sendFileParams.length !== length) {\n this.managers.appMessagesManager.sendText(peerId, caption, {\n ...sendingParams,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const d: SendFileDetails[] = sendFileParams.map((params) => {\n return {\n ...params,\n file: params.scaledBlob || params.file,\n spoiler: !!params.mediaSpoiler\n };\n });\n\n const w = {\n ...willAttach,\n sendFileDetails: d\n };\n\n this.managers.appMessagesManager.sendAlbum(peerId, Object.assign({\n ...sendingParams,\n caption,\n isMedia,\n clearDraft: true\n }, w));\n\n caption = undefined;\n });\n\n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n this.wasInputValue = undefined;\n\n this.hide();\n }\n\n private modifyMimeTypeForTelegram(mimeType: string) {\n return mimeType === 'image/webp' ? 'image/jpeg' : mimeType;\n }\n\n private async scaleImageForTelegram(image: HTMLImageElement, mimeType: string, convertWebp?: boolean) {\n const PHOTO_SIDE_LIMIT = 2560;\n let url = image.src, scaledBlob: Blob;\n if(\n mimeType !== 'image/gif' &&\n (Math.max(image.naturalWidth, image.naturalHeight) > PHOTO_SIDE_LIMIT || (convertWebp && mimeType === 'image/webp'))\n ) {\n const {blob} = await scaleMediaElement({\n media: image,\n boxSize: makeMediaSize(PHOTO_SIDE_LIMIT, PHOTO_SIDE_LIMIT),\n mediaSize: makeMediaSize(image.naturalWidth, image.naturalHeight),\n mimeType: this.modifyMimeTypeForTelegram(mimeType) as any\n });\n\n scaledBlob = blob;\n URL.revokeObjectURL(url);\n url = await apiManagerProxy.invoke('createObjectURL', blob);\n await renderImageFromUrlPromise(image, url);\n }\n\n return scaledBlob && {url, blob: scaledBlob};\n }\n\n private async attachMedia(params: SendFileParams) {\n const {itemDiv} = params;\n itemDiv.classList.add('popup-item-media');\n\n const file = params.file;\n const isVideo = file.type.startsWith('video/');\n\n if(isVideo) {\n const video = createVideo();\n video.src = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n video.autoplay = true;\n video.controls = false;\n video.muted = true;\n\n video.addEventListener('timeupdate', () => {\n video.pause();\n }, {once: true});\n\n itemDiv.append(video);\n\n let error: Error;\n try {\n await onMediaLoad(video);\n } catch(err) {\n error = err as any;\n }\n\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n\n if(error) {\n throw error;\n }\n\n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n const thumb = await createPosterFromVideo(video);\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n } else {\n const img = new Image();\n itemDiv.append(img);\n const url = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n\n await renderImageFromUrlPromise(img, url);\n const mimeType = params.file.type;\n const scaled = await this.scaleImageForTelegram(img, mimeType, true);\n if(scaled) {\n params.objectURL = scaled.url;\n params.scaledBlob = scaled.blob;\n }\n\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n\n if(file.type === 'image/gif') {\n params.noSound = true;\n\n return Promise.all([\n getGifDuration(img).then((duration) => {\n params.duration = Math.ceil(duration);\n }),\n\n createPosterFromMedia(img).then(async(thumb) => {\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n })\n ]).then(() => {});\n }\n }\n }\n\n private async attachDocument(params: SendFileParams): ReturnType {\n const {itemDiv} = params;\n itemDiv.classList.add('popup-item-document');\n const file = params.file;\n\n const isPhoto = file.type.startsWith('image/');\n const isAudio = file.type.startsWith('audio/');\n if(isPhoto || isAudio || file.size < 20e6) {\n params.objectURL ||= await apiManagerProxy.invoke('createObjectURL', file);\n }\n\n let img: HTMLImageElement;\n if(isPhoto) {\n img = new Image();\n await renderImageFromUrlPromise(img, params.objectURL);\n const scaled = await this.scaleImageForTelegram(img, params.file.type);\n if(scaled) {\n params.objectURL = scaled.url;\n }\n }\n\n const doc = {\n _: 'document',\n file: file,\n file_name: file.name || '',\n size: file.size,\n type: isPhoto ? 'photo' : 'doc'\n } as MyDocument;\n\n let cacheContext: ThumbCache;\n if(params.objectURL) {\n cacheContext = {\n url: params.objectURL,\n downloaded: file.size,\n type: THUMB_TYPE_FULL\n };\n }\n\n const docDiv = await wrapDocument({\n message: {\n _: 'message',\n pFlags: {\n is_outgoing: true\n },\n mid: 0,\n peerId: 0,\n media: {\n _: 'messageMediaDocument',\n document: doc\n }\n } as any,\n cacheContext\n });\n\n if(isPhoto) {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n }\n\n itemDiv.append(docDiv);\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n const params: SendFileParams = {\n file\n } as any;\n\n // do not pass these properties to worker\n defineNotNumerableProperties(params, ['scaledBlob', 'middlewareHelper', 'itemDiv', 'mediaSpoiler']);\n\n params.middlewareHelper = this.middlewareHelper.get().create();\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(params) : this.attachDocument(params);\n willAttach.sendFileDetails.push(params);\n return promise.catch((err) => {\n itemDiv.style.backgroundColor = '#000';\n console.error('error rendering file', err);\n });\n };\n\n private shouldCompress(mimeType: string) {\n return this.willAttach.type === 'media' && MEDIA_MIME_TYPES_SUPPORTED.has(mimeType);\n }\n\n private onRender() {\n // show now\n if(!this.element.classList.contains('active')) {\n this.listenerSetter.add(document.body)('keydown', this.onKeyDown);\n !this.ignoreInputValue && this.addEventListener('close', () => {\n if(this.wasInputValue) {\n this.chat.input.messageInputField.value = this.wasInputValue;\n }\n });\n this.show();\n }\n }\n\n private setTitle() {\n const {willAttach, title, files} = this;\n let key: LangPackKey;\n const args: FormatterArguments = [];\n if(willAttach.type === 'document') {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else {\n let foundPhotos = 0, foundVideos = 0, foundFiles = 0;\n files.forEach((file) => {\n if(file.type.startsWith('image/')) ++foundPhotos;\n else if(file.type.startsWith('video/')) ++foundVideos;\n else ++foundFiles;\n });\n\n if([foundPhotos, foundVideos, foundFiles].filter((n) => n > 0).length > 1) {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else\n\n /* const sum = foundPhotos + foundVideos;\n if(sum > 1 && willAttach.group) {\n key = 'PreviewSender.SendAlbum';\n const albumsLength = Math.ceil(sum / 10);\n args.push(albumsLength);\n } else */if(foundPhotos) {\n key = 'PreviewSender.SendPhoto';\n args.push(foundPhotos);\n } else if(foundVideos) {\n key = 'PreviewSender.SendVideo';\n args.push(foundVideos);\n }\n }\n\n replaceContent(title, i18n(key, args));\n }\n\n private appendMediaToContainer(params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, MAX_WIDTH, 320);\n params.itemDiv.style.width = size.width + 'px';\n params.itemDiv.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(params.itemDiv);\n }\n\n private iterate(cb: (sendFileDetails: SendFileParams[]) => void) {\n const {sendFileDetails} = this.willAttach;\n if(!this.willAttach.group) {\n sendFileDetails.forEach((p) => cb([p]));\n return;\n }\n\n const length = sendFileDetails.length;\n for(let i = 0; i < length;) {\n const firstType = sendFileDetails[i].file.type;\n let k = 0;\n for(; k < 10 && i < length; ++i, ++k) {\n const type = sendFileDetails[i].file.type;\n if(this.shouldCompress(firstType) !== this.shouldCompress(type)) {\n break;\n }\n }\n\n cb(sendFileDetails.slice(i - k, i));\n }\n }\n\n private attachFiles() {\n const {files, willAttach, mediaContainer} = this;\n\n const oldSendFileDetails = willAttach.sendFileDetails.splice(0, willAttach.sendFileDetails.length);\n oldSendFileDetails.forEach((params) => {\n params.middlewareHelper.destroy();\n });\n\n const promises = files.map((file) => this.attachFile(file));\n\n Promise.all(promises).then(() => {\n mediaContainer.replaceChildren();\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n const shouldCompress = this.shouldCompress(sendFileDetails[0].file.type);\n if(shouldCompress && sendFileDetails.length > 1) {\n const albumContainer = document.createElement('div');\n albumContainer.classList.add('popup-item-album', 'popup-item');\n albumContainer.append(...sendFileDetails.map((s) => s.itemDiv));\n\n prepareAlbum({\n container: albumContainer,\n items: sendFileDetails.map((o) => ({w: o.width, h: o.height})),\n maxWidth: MAX_WIDTH,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params);\n });\n }\n\n if(!shouldCompress) {\n return;\n }\n\n sendFileDetails.forEach((params) => {\n const oldParams = oldSendFileDetails.find((o) => o.file === params.file);\n if(!oldParams) {\n return;\n }\n\n if(oldParams.mediaSpoiler) {\n this.applyMediaSpoiler(params, true);\n }\n });\n });\n }).then(() => {\n this.onRender();\n this.onScroll();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport fastSmoothScroll from '../fastSmoothScroll';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent, detachClickEvent} from './clickEvent';\nimport findUpAsChild from './findUpAsChild';\nimport findUpClassName from './findUpClassName';\n\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\nconst HANDLE_EVENT = 'keydown';\nconst ACTIVE_CLASS_NAME = 'active';\n\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\n\nexport type ListNavigationOptions = {\n list: HTMLElement,\n type: 'xy' | 'x' | 'y',\n onSelect: (target: Element) => void | boolean | Promise,\n once: boolean,\n waitForKey?: string[]\n};\n\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: ListNavigationOptions) {\n let waitForKeySet = waitForKey?.length ? new Set(waitForKey) : undefined;\n const keyNames = new Set(type === 'xy' ? AXIS_Y_KEYS.concat(AXIS_X_KEYS) : (type === 'x' ? AXIS_X_KEYS : AXIS_Y_KEYS));\n\n let target: Element;\n const getCurrentTarget = () => {\n return target || list.querySelector('.' + ACTIVE_CLASS_NAME) || list.firstElementChild;\n };\n\n const setCurrentTarget = (_target: Element, scrollTo: boolean) => {\n if(target === _target) {\n return;\n }\n\n let hadTarget = false;\n if(target) {\n hadTarget = true;\n target.classList.remove(ACTIVE_CLASS_NAME);\n }\n\n target = _target;\n if(!target) return;\n target.classList.add(ACTIVE_CLASS_NAME);\n\n if(hadTarget && scrollable && scrollTo) {\n fastSmoothScroll({\n container: scrollable,\n element: target as HTMLElement,\n position: 'center',\n forceDuration: 100,\n axis: type === 'x' ? 'x' : 'y'\n });\n }\n };\n\n const getNextTargetX = (currentTarget: Element, isNext: boolean) => {\n let nextTarget: Element;\n if(isNext) nextTarget = currentTarget.nextElementSibling || list.firstElementChild;\n else nextTarget = currentTarget.previousElementSibling || list.lastElementChild;\n\n return nextTarget;\n };\n\n const getNextTargetY = (currentTarget: Element, isNext: boolean) => {\n const property = isNext ? 'nextElementSibling' : 'previousElementSibling';\n const endProperty = isNext ? 'firstElementChild' : 'lastElementChild';\n const currentRect = currentTarget.getBoundingClientRect();\n\n let nextTarget = currentTarget[property] || list[endProperty];\n while(nextTarget !== currentTarget) {\n const targetRect = nextTarget.getBoundingClientRect();\n if(targetRect.x === currentRect.x && targetRect.y !== currentRect.y) {\n break;\n }\n\n nextTarget = nextTarget[property] || list[endProperty];\n }\n\n return nextTarget;\n };\n\n let handleArrowKey: (currentTarget: Element, key: ArrowKey) => Element;\n if(type === 'xy') { // flex-direction: row; flex-wrap: wrap;\n handleArrowKey = (currentTarget, key) => {\n if(key === 'ArrowUp' || key === 'ArrowDown') return getNextTargetY(currentTarget, key === 'ArrowDown');\n else return getNextTargetX(currentTarget, key === 'ArrowRight');\n };\n } else { // flex-direction: row | column;\n handleArrowKey = (currentTarget, key) => getNextTargetX(currentTarget, key === 'ArrowRight' || key === 'ArrowDown');\n }\n\n let onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n if(!keyNames.has(key as any)) {\n if(key === 'Enter' || (type !== 'xy' && key === 'Tab')) {\n cancelEvent(e);\n fireSelect(getCurrentTarget());\n }\n\n return;\n }\n\n cancelEvent(e);\n\n if(list.childElementCount > 1) {\n let currentTarget = getCurrentTarget();\n currentTarget = handleArrowKey(currentTarget, key as any);\n setCurrentTarget(currentTarget, true);\n }\n };\n\n const scrollable = findUpClassName(list, 'scrollable');\n list.classList.add('navigable-list');\n\n const onMouseMove = (e: MouseEvent) => {\n const target = findUpAsChild(e.target as HTMLElement, list) as HTMLElement;\n if(!target) {\n return;\n }\n\n setCurrentTarget(target, false);\n };\n\n const onClick = (e: Event) => {\n cancelEvent(e); // cancel keyboard closening\n\n const target = findUpAsChild(e.target as HTMLElement, list) as HTMLElement;\n if(!target) {\n return;\n }\n\n setCurrentTarget(target, false);\n fireSelect(getCurrentTarget());\n };\n\n const fireSelect = async(target: Element) => {\n const canContinue = await onSelect(target);\n if(canContinue !== undefined ? !canContinue : once) {\n detach();\n }\n };\n\n let attached = false;\n const attach = () => {\n if(attached) return;\n attached = true;\n // const input = document.activeElement as HTMLElement;\n // input.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n list.addEventListener('mousemove', onMouseMove, {passive: true});\n attachClickEvent(list, onClick);\n };\n\n const detach = () => {\n if(!attached) return;\n attached = false;\n // input.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n list.removeEventListener('mousemove', onMouseMove);\n detachClickEvent(list, onClick);\n };\n\n const resetTarget = () => {\n if(waitForKeySet) return;\n setCurrentTarget(list.firstElementChild, false);\n };\n\n if(waitForKeySet) {\n const _onKeyDown = onKeyDown;\n onKeyDown = (e) => {\n if(waitForKeySet.has(e.key)) {\n cancelEvent(e);\n\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n onKeyDown = _onKeyDown;\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n\n waitForKeySet = undefined;\n resetTarget();\n }\n };\n } else {\n resetTarget();\n }\n\n attach();\n\n return {\n attach,\n detach,\n resetTarget\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport attachListNavigation, {ListNavigationOptions} from '../../helpers/dom/attachListNavigation';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport rootScope from '../../lib/rootScope';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport SetTransition from '../singleTransition';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport safeAssign from '../../helpers/object/safeAssign';\n\nexport default class AutocompleteHelper extends EventListenerBase<{\n hidden: () => void,\n visible: () => void,\n hiding: () => void\n}> {\n protected hidden = true;\n protected container: HTMLElement;\n protected list: HTMLElement;\n protected resetTarget: () => void;\n protected attach: () => void;\n protected detach: () => void;\n protected init?(): void;\n\n protected controller: AutocompleteHelperController;\n protected listType: 'xy' | 'x' | 'y';\n protected onSelect: ListNavigationOptions['onSelect'];\n protected waitForKey?: string[];\n\n protected navigationItem: NavigationItem;\n\n constructor(options: {\n appendTo: HTMLElement,\n controller?: AutocompleteHelper['controller'],\n listType: AutocompleteHelper['listType'],\n onSelect: AutocompleteHelper['onSelect'],\n waitForKey?: AutocompleteHelper['waitForKey']\n }) {\n super(false);\n\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('autocomplete-helper', 'z-depth-1');\n\n options.appendTo.append(this.container);\n\n this.attachNavigation();\n\n this.controller && this.controller.addHelper(this);\n }\n\n public toggleListNavigation(enabled: boolean) {\n if(enabled) {\n this.attach && this.attach();\n } else {\n this.detach && this.detach();\n }\n }\n\n protected onVisible = () => {\n if(this.detach) { // it can be so because 'visible' calls before animation's end\n this.detach();\n }\n\n const list = this.list;\n const {attach, detach, resetTarget} = attachListNavigation({\n list,\n type: this.listType,\n onSelect: this.onSelect,\n once: true,\n waitForKey: this.waitForKey\n });\n\n this.attach = attach;\n this.detach = detach;\n this.resetTarget = resetTarget;\n if(!IS_MOBILE && !this.navigationItem) {\n this.navigationItem = {\n type: 'autocomplete-helper',\n onPop: () => {\n this.navigationItem = undefined;\n this.toggle(true);\n },\n noBlurOnPop: true\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n\n this.addEventListener('hidden', () => {\n this.resetTarget = undefined;\n this.attach = undefined;\n this.detach = undefined;\n\n list.innerHTML = '';\n detach();\n\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n }\n }, {once: true});\n };\n\n protected attachNavigation() {\n this.addEventListener('visible', this.onVisible);\n }\n\n public toggle(hide?: boolean, fromController = false, skipAnimation?: boolean) {\n if(this.init) {\n return;\n }\n\n if(hide === undefined) {\n hide = this.container.classList.contains('is-visible') && !this.container.classList.contains('backwards');\n }\n\n if(this.hidden === hide) {\n if(!hide) {\n this.dispatchEvent('visible'); // reset target and listener\n }\n\n return;\n }\n\n this.hidden = hide;\n\n if(!hide) {\n this.controller && this.controller.hideOtherHelpers(this);\n this.dispatchEvent('visible'); // fire it before so target will be set\n } else {\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n }\n\n if(!fromController && this.controller) {\n this.controller.hideOtherHelpers();\n }\n\n if(this.detach) { // force detach here\n this.detach();\n }\n }\n\n const useRafs = this.controller || hide ? 0 : 2;\n\n if(hide) {\n this.dispatchEvent('hiding');\n }\n\n SetTransition({\n element: this.container,\n className: 'is-visible',\n forwards: !hide,\n duration: rootScope.settings.animationsEnabled && !skipAnimation ? 300 : 0,\n onTransitionEnd: () => {\n this.hidden && this.dispatchEvent('hidden');\n },\n useRafs\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from './chat';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport preloadAnimatedEmojiSticker from '../../helpers/preloadAnimatedEmojiSticker';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable from '../scrollable';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\n\nexport default class StickersHelper extends AutocompleteHelper {\n private scrollable: Scrollable;\n private superStickerRenderer: SuperStickerRenderer;\n private lazyLoadQueue: LazyLoadQueue;\n private onChangeScreen: () => void;\n private listenerSetter: ListenerSetter;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n private chat: Chat,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'xy',\n onSelect: async(target) => {\n return !(await EmoticonsDropdown.onMediaClick({target}, true));\n },\n waitForKey: ['ArrowUp', 'ArrowDown']\n });\n\n this.container.classList.add('stickers-helper');\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n\n rootScope.dispatchEvent('choosing_sticker', true);\n });\n\n this.addEventListener('hidden', () => {\n if(this.onChangeScreen) {\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\n this.onChangeScreen = undefined;\n\n this.listenerSetter.removeAll();\n this.listenerSetter = undefined;\n }\n\n rootScope.dispatchEvent('choosing_sticker', false);\n });\n }\n\n public checkEmoticon(emoticon: string) {\n const middleware = this.controller.getMiddleware();\n\n if(this.lazyLoadQueue) {\n this.lazyLoadQueue.clear();\n }\n\n preloadAnimatedEmojiSticker(emoticon);\n this.managers.appStickersManager.getStickersByEmoticon(emoticon)\n .then((stickers) => {\n if(!middleware()) {\n return;\n }\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n const container = this.list.cloneNode() as HTMLElement;\n\n let ready: Promise;\n\n this.lazyLoadQueue.clear();\n if(stickers.length) {\n ready = new Promise((resolve) => {\n const promises: Promise[] = [];\n stickers.forEach((sticker) => {\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\n });\n\n (Promise.all(promises) as Promise).finally(resolve);\n });\n } else {\n ready = Promise.resolve();\n }\n\n ready.then(() => {\n this.list.replaceWith(container);\n this.list = container;\n\n if(!this.onChangeScreen) {\n this.onChangeScreen = () => {\n const width = (this.list.childElementCount * mediaSizes.active.popupSticker.width) + (this.list.childElementCount - 1 * 1);\n this.list.style.width = width + 'px';\n };\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\n\n this.listenerSetter = new ListenerSetter();\n attachStickerViewerListeners({listenTo: this.container, listenerSetter: this.listenerSetter});\n }\n\n this.onChangeScreen();\n\n this.toggle(!stickers.length);\n this.scrollable.scrollTop = 0;\n });\n });\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('stickers-helper-stickers', 'super-stickers');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n this.lazyLoadQueue = new LazyLoadQueue();\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, this.chat.animationGroup, this.managers);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\nimport Button from '../button';\nimport PopupDatePicker from './datePicker';\n\nconst getMinDate = () => {\n const date = new Date();\n // date.setDate(date.getDate() - 1);\n date.setHours(0, 0, 0, 0);\n return date;\n};\n\nconst getMaxDate = () => {\n const date = new Date();\n date.setFullYear(date.getFullYear() + 1);\n date.setDate(date.getDate() - 1);\n return date;\n};\n\nconst checkDate = (date: Date) => {\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\n};\n\nexport default class PopupSchedule extends PopupDatePicker {\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\n super(checkDate(initDate), onPick, {\n noButtons: true,\n noTitle: true,\n closable: true,\n withConfirm: true,\n minDate: getMinDate(),\n maxDate: getMaxDate(),\n withTime: true,\n showOverflowMonths: true,\n confirmShortcutIsSendShortcut: true,\n title: true\n });\n\n this.element.classList.add('popup-schedule');\n this.header.append(this.controlsDiv);\n this.title.replaceWith(this.monthTitle);\n this.body.append(this.btnConfirm);\n\n if(canSendWhenOnline) {\n const btnSendWhenOnline = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Schedule.SendWhenOnline'});\n this.body.append(btnSendWhenOnline);\n\n attachClickEvent(btnSendWhenOnline, () => {\n onPick(SEND_WHEN_ONLINE_TIMESTAMP);\n this.hide();\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport {appendEmoji, getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';\nimport {ScrollableX} from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport default class EmojiHelper extends AutocompleteHelper {\n private scrollable: ScrollableX;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'x',\n onSelect: (target) => {\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\n }\n });\n\n this.container.classList.add('emoji-helper');\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\n\n this.container.append(this.list);\n\n this.scrollable = new ScrollableX(this.container);\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollLeft = 0;\n }, 0);\n });\n }\n\n public render(emojis: string[], waitForKey: boolean) {\n if(this.init) {\n if(!emojis.length) {\n return;\n }\n\n this.init();\n this.init = null;\n }\n\n emojis = emojis.slice(0, 80);\n\n if(emojis.length) {\n this.list.innerHTML = '';\n emojis.forEach((emoji) => {\n appendEmoji(emoji, this.list, false, true);\n });\n }\n\n this.waitForKey = waitForKey ? ['ArrowUp', 'ArrowDown'] : undefined;\n this.toggle(!emojis.length);\n\n /* window.requestAnimationFrame(() => {\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\n }); */\n }\n\n public checkQuery(query: string, firstChar: string) {\n const middleware = this.controller.getMiddleware();\n this.managers.appEmojiManager.getBothEmojiKeywords().then(async() => {\n if(!middleware()) {\n return;\n }\n\n const q = query.replace(/^:/, '');\n const emojis = await this.managers.appEmojiManager.searchEmojis(q);\n if(!middleware()) {\n return;\n }\n\n this.render(emojis, firstChar !== ':');\n // console.log(emojis);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport AvatarElement from '../avatar';\nimport PeerTitle from '../peerTitle';\nimport Scrollable from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\n\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\n protected static BASE_CLASS = 'autocomplete-peer-helper';\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\n private scrollable: Scrollable;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n protected className: string,\n onSelect: (target: Element) => boolean | void\n ) {\n super({\n appendTo,\n controller,\n listType: 'y',\n onSelect\n });\n\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list', this.className + '-list');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n });\n }\n\n public render(data: {peerId: PeerId, name?: string, description?: string}[], doNotShow?: boolean) {\n if(this.init) {\n if(!data.length) {\n return;\n }\n\n this.init();\n this.init = null;\n }\n\n if(data.length) {\n this.list.innerHTML = '';\n data.forEach((d) => {\n const div = AutocompletePeerHelper.listElement({\n className: this.className,\n peerId: d.peerId,\n name: d.name,\n description: d.description\n });\n\n this.list.append(div);\n });\n }\n\n if(!doNotShow) {\n this.toggle(!data.length);\n }\n }\n\n public static listElement(options: {\n className: string,\n peerId: PeerId,\n name?: string,\n description?: string\n }) {\n const BASE = AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT;\n options.className += '-list-element';\n\n const div = document.createElement('div');\n div.classList.add(BASE, options.className);\n div.dataset.peerId = '' + options.peerId;\n\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-30', BASE + '-avatar', options.className + '-avatar');\n avatar.updateWithOptions({\n isDialog: false,\n peerId: options.peerId\n });\n\n const name = document.createElement('div');\n name.classList.add(BASE + '-name', options.className + '-name');\n if(!options.name) {\n name.append(new PeerTitle({\n peerId: options.peerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element);\n } else {\n setInnerHTML(name, wrapEmojiText(options.name));\n }\n\n div.append(avatar, name);\n\n if(options.description) {\n const description = document.createElement('div');\n description.classList.add(BASE + '-description', options.className + '-description');\n setInnerHTML(description, wrapEmojiText(options.description));\n div.append(description);\n }\n\n return div;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport type {BotInfo, ChatFull, UserFull} from '../../layer';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport SearchIndex from '../../lib/searchIndex';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport function processPeerFullForCommands(peerId: PeerId, full: ChatFull.chatFull | ChatFull.channelFull | UserFull.userFull, query?: string) {\n const botInfos: BotInfo.botInfo[] = [].concat(full.bot_info);\n let index: SearchIndex;\n\n if(query !== undefined) {\n index = new SearchIndex({\n ignoreCase: true\n });\n }\n\n type T = {peerId: PeerId, name: string, description: string, index: number, command: string};\n const commands: Map = new Map();\n botInfos.forEach((botInfo) => {\n if(!botInfo.commands) {\n return;\n }\n\n botInfo.commands.forEach(({command, description}, idx) => {\n const c = '/' + command;\n commands.set(command, {\n peerId: botInfo.user_id ? botInfo.user_id.toPeerId(false) : peerId,\n command: command,\n name: c,\n description: description,\n index: idx\n });\n\n if(index) {\n index.indexObject(command, c);\n }\n });\n });\n\n let out: T[];\n if(!index) {\n out = [...commands.values()];\n } else {\n const found = index.search(query);\n out = Array.from(found).map((command) => commands.get(command));\n }\n\n out = out.sort((a, b) => commands.get(a.command).index - commands.get(b.command).index);\n\n return out;\n}\n\nexport default class CommandsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(appendTo,\n controller,\n 'commands-helper',\n (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n });\n }\n );\n }\n\n public async checkQuery(query: string, peerId: PeerId) {\n if(!(await this.managers.appUsersManager.isBot(peerId))) {\n return false;\n }\n\n const middleware = this.controller.getMiddleware();\n this.managers.appProfileManager.getProfileByPeerId(peerId).then((full) => {\n if(!middleware()) {\n return;\n }\n\n const filtered = processPeerFullForCommands(peerId, full, query);\n this.render(filtered);\n // console.log('found commands', found, filtered);\n });\n\n return true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getMiddleware} from '../../helpers/middleware';\nimport AutocompleteHelper from './autocompleteHelper';\n\nexport default class AutocompleteHelperController {\n private helpers: Set = new Set();\n private middleware = getMiddleware();\n /* private tempId = 0;\n\n public incrementToggleCount() {\n return ++this.tempId;\n }\n\n public getToggleCount() {\n return this.tempId;\n } */\n\n public toggleListNavigation(enabled: boolean) {\n for(const helper of this.helpers) {\n helper.toggleListNavigation(enabled);\n }\n }\n\n public getMiddleware() {\n this.middleware.clean();\n return this.middleware.get();\n }\n\n public addHelper(helper: AutocompleteHelper) {\n this.helpers.add(helper);\n }\n\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\n this.helpers.forEach((helper) => {\n if(helper !== preserveHelper) {\n helper.toggle(true, true);\n }\n });\n\n if(!preserveHelper) {\n this.middleware.clean();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport type {MessageEntity} from '../../layer';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerActiveUsernames from '../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport rootScope from '../../lib/rootScope';\n\nexport default class MentionsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(\n appendTo,\n controller,\n 'mentions-helper',\n (target) => {\n const userId = (target as HTMLElement).dataset.peerId.toUserId();\n const user = Promise.resolve(managers.appUsersManager.getUser(userId)).then((user) => {\n let str = '', entity: MessageEntity;\n const usernames = getPeerActiveUsernames(user);\n if(usernames[0]) {\n str = '@' + usernames[0];\n } else {\n str = user.first_name || user.last_name;\n entity = {\n _: 'messageEntityMentionName',\n length: str.length,\n offset: 0,\n user_id: user.id\n };\n }\n\n str += ' ';\n chatInput.insertAtCaret(str, entity);\n });\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId, topMsgId: number) {\n const trimmed = query.trim(); // check that there is no whitespace\n if(query.length !== trimmed.length) return false;\n\n const middleware = this.controller.getMiddleware();\n this.managers.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(async(peerIds) => {\n if(!middleware()) return;\n\n peerIds = peerIds.filter((peerId) => peerId !== rootScope.myId);\n\n // const username = trimmed.slice(1).toLowerCase();\n\n const p = peerIds.map(async(peerId) => {\n const user = await this.managers.appUsersManager.getUser(peerId);\n const usernames = getPeerActiveUsernames(user);\n // if(usernames.length && usernames.some((_username) => _username.toLowerCase() === username)) { // hide full matched suggestion\n // return;\n // }\n\n return {\n peerId,\n description: usernames[0] ? '@' + usernames[0] : undefined\n };\n });\n\n this.render((await Promise.all(p)).filter(Boolean));\n });\n\n return true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport {KeyboardButton, ReplyMarkup} from '../../layer';\nimport rootScope from '../../lib/rootScope';\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\nimport confirmationPopup from '../confirmationPopup';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport Scrollable from '../scrollable';\n\nexport default class ReplyKeyboard extends DropdownHover {\n private static BASE_CLASS = 'reply-keyboard';\n private appendTo: HTMLElement;\n private listenerSetter: ListenerSetter;\n private managers: AppManagers;\n private btnHover: HTMLElement;\n private peerId: PeerId;\n private touchListener: Listener;\n private chatInput: ChatInput;\n private scrollable: Scrollable;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n managers: AppManagers,\n appendTo: HTMLElement,\n btnHover: HTMLElement,\n chatInput: ChatInput\n }) {\n super({\n element: document.createElement('div')\n });\n\n safeAssign(this, options);\n\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\n this.element.style.display = 'none';\n\n this.scrollable = new Scrollable();\n this.element.append(this.scrollable.container);\n\n this.attachButtonListener(this.btnHover, this.listenerSetter);\n this.listenerSetter.add(rootScope)('history_reply_markup', async({peerId}) => {\n if(this.peerId === peerId) {\n if(this.checkAvailability() && this.isActive()) {\n await this.render();\n }\n\n getHeavyAnimationPromise().then(() => {\n this.checkForceReply();\n });\n }\n });\n }\n\n public init() {\n this.appendTo.append(this.element);\n\n this.listenerSetter.add(this)('open', async() => {\n await this.render();\n\n if(IS_TOUCH_SUPPORTED) {\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\n this.listenerSetter.add(this)('close', () => {\n this.listenerSetter.remove(this.touchListener);\n }, {once: true});\n }\n });\n\n attachClickEvent(this.element, (e) => {\n const target = findUpClassName(e.target, 'btn');\n if(!target) {\n return;\n }\n\n const type = target.dataset.type as KeyboardButton['_'];\n const {peerId} = this;\n switch(type) {\n case 'keyboardButtonRequestPhone': {\n confirmationPopup({\n titleLangKey: 'ShareYouPhoneNumberTitle',\n button: {\n langKey: 'OK'\n },\n descriptionLangKey: 'AreYouSureShareMyContactInfoBot'\n }).then(() => {\n this.managers.appMessagesManager.sendContact(peerId, rootScope.myId);\n });\n break;\n }\n\n default: {\n this.managers.appMessagesManager.sendText(peerId, target.dataset.text);\n break;\n }\n }\n\n this.toggle(false);\n }, {listenerSetter: this.listenerSetter});\n\n return super.init();\n }\n\n private onBodyTouchStart = (e: TouchEvent) => {\n const target = e.touches[0].target as HTMLElement;\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\n cancelEvent(e);\n this.toggle(false);\n }\n };\n\n public async checkForceReply() {\n const replyMarkup = await this.getReplyMarkup();\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\n !replyMarkup.pFlags.hidden &&\n !replyMarkup.pFlags.used) {\n replyMarkup.pFlags.used = true;\n this.chatInput.initMessageReply(replyMarkup.mid);\n }\n }\n\n private async getReplyMarkup() {\n return (await this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup ?? {\n _: 'replyKeyboardHide'\n };\n }\n\n public async render(replyMarkup?: ReplyMarkup.replyKeyboardMarkup) {\n if(replyMarkup === undefined) {\n replyMarkup = await this.getReplyMarkup() as any;\n }\n\n this.scrollable.container.replaceChildren();\n\n for(const row of replyMarkup.rows) {\n const div = document.createElement('div');\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\n\n for(const button of row.buttons) {\n const btn = document.createElement('button');\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\n setInnerHTML(btn, wrapEmojiText(button.text));\n btn.dataset.text = button.text;\n btn.dataset.type = button._;\n div.append(btn);\n }\n\n this.scrollable.container.append(div);\n }\n }\n\n public async checkAvailability(replyMarkup?: ReplyMarkup) {\n if(replyMarkup === undefined) {\n replyMarkup = await this.getReplyMarkup();\n }\n\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\n this.btnHover.classList.toggle('hide', hide);\n\n if(hide) {\n this.toggle(false);\n }\n\n return !hide;\n }\n\n public setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n this.checkAvailability();\n this.checkForceReply();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from './chat';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {WebDocument} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport Button from '../button';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {MyPhoto} from '../../lib/appManagers/appPhotosManager';\nimport assumeType from '../../helpers/assumeType';\nimport GifsMasonry from '../gifsMasonry';\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport renderMediaWithFadeIn from '../../helpers/dom/renderMediaWithFadeIn';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport generateQId from '../../lib/appManagers/utils/inlineBots/generateQId';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport wrapPhoto from '../wrappers/photo';\n\nconst ANIMATION_GROUP: AnimationItemGroup = 'INLINE-HELPER';\n// const GRID_ITEMS = 5;\n\nexport default class InlineHelper extends AutocompleteHelper {\n private scrollable: Scrollable;\n private lazyLoadQueue: LazyLoadQueue;\n private gifsMasonry: GifsMasonry;\n private superStickerRenderer: SuperStickerRenderer;\n private onChangeScreen: () => void;\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n private chat: Chat,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'xy',\n waitForKey: ['ArrowUp', 'ArrowDown'],\n onSelect: (target) => {\n if(!target) return false; // can happen when there is only button\n const {peerId, botId, queryId} = this.list.dataset;\n return this.chat.input.getReadyToSend(() => {\n const queryAndResultIds = generateQId(queryId, (target as HTMLElement).dataset.resultId);\n this.managers.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\n ...this.chat.getMessageSendingParams(),\n clearDraft: true\n });\n\n this.chat.input.onMessageSent(true, true);\n });\n }\n });\n\n this.container.classList.add('inline-helper');\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n });\n\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\n\n this.addEventListener('hidden', () => {\n if(this.onChangeScreen) {\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\n this.onChangeScreen = undefined;\n }\n });\n }\n\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\n const middleware = this.controller.getMiddleware();\n\n const peer = await this.managers.appUsersManager.resolveUsername(username);\n if(!middleware()) {\n throw 'PEER_CHANGED';\n }\n\n if(peer._ !== 'user' || !peer.pFlags.bot) {\n throw 'NOT_A_BOT';\n }\n\n const renderPromise = this.managers.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then((botResults) => {\n if(!middleware()) {\n throw 'PEER_CHANGED';\n }\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n const list = this.list.cloneNode() as HTMLElement;\n list.dataset.peerId = '' + peerId;\n list.dataset.botId = '' + peer.id;\n list.dataset.queryId = '' + botResults.query_id;\n\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\n\n this.lazyLoadQueue.clear();\n this.superStickerRenderer.clear();\n\n const loadPromises: Promise[] = [];\n const isGallery = !!botResults.pFlags.gallery;\n // botResults.results.length = 3;\n for(const item of botResults.results) {\n const container = document.createElement('div');\n container.classList.add('inline-helper-result');\n container.dataset.resultId = item.id;\n\n const preview = isGallery ? undefined : document.createElement('div');\n if(preview) {\n preview.classList.add('inline-helper-result-preview');\n\n container.append(preview);\n }\n\n list.append(container);\n\n if(!isGallery) {\n preview.classList.add('empty');\n setInnerHTML(preview, wrapEmojiText([...item.title.trim()][0]));\n\n const title = document.createElement('div');\n title.classList.add('inline-helper-result-title');\n setInnerHTML(title, wrapEmojiText(item.title));\n\n const description = document.createElement('div');\n description.classList.add('inline-helper-result-description');\n setInnerHTML(description, wrapRichText(item.description, {\n noCommands: true,\n noLinks: true\n }));\n\n container.append(title, description);\n\n const separator = document.createElement('div');\n separator.classList.add('inline-helper-separator');\n\n list.append(separator);\n } else {\n container.classList.add('grid-item');\n }\n\n if(item._ === 'botInlineResult') {\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\n let mediaContainer: HTMLElement;\n if(preview) {\n mediaContainer = document.createElement('div');\n preview.append(mediaContainer);\n } else {\n mediaContainer = container;\n }\n\n mediaContainer.classList.add('media-container');\n isGallery && mediaContainer.classList.add('no-border-radius');\n\n this.lazyLoadQueue.push({\n div: container,\n load: () => {\n return appDownloadManager.download({\n dcId: 4,\n location: {\n _: 'inputWebFileLocation',\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\n url: item.thumb.url\n },\n size: item.thumb.size,\n mimeType: item.thumb.mime_type\n }).then((blob) => {\n const image = new Image();\n image.classList.add('media-photo');\n readBlobAsDataURL(blob).then((dataURL) => {\n renderMediaWithFadeIn(mediaContainer, image, dataURL, true);\n });\n });\n }\n });\n }\n } else {\n const media = item.document as MyDocument || item.photo as MyPhoto;\n if((['sticker', 'gif'] as MyDocument['type'][]).includes((media as MyDocument)?.type) && isGallery) {\n assumeType(media);\n\n if(media.type === 'gif') {\n gifsMasonry.add(media, container);\n } else if(media.type === 'sticker') {\n container.classList.add('super-sticker');\n this.superStickerRenderer.renderSticker(media, container, loadPromises);\n if(media.animated) {\n this.superStickerRenderer.observeAnimated(container);\n }\n }\n } else if(media) {\n const size = isGallery ? 48 : undefined;\n isGallery && container.classList.add('no-border-radius');\n wrapPhoto({\n photo: media,\n container: isGallery ? container : preview,\n boxWidth: size,\n boxHeight: size,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n loadPromises\n });\n }\n }\n }\n\n return Promise.all(loadPromises).then(() => {\n if(!middleware()) {\n gifsMasonry.clear();\n return;\n }\n\n list.classList.toggle('is-gallery', isGallery);\n list.classList.toggle('super-stickers', isGallery);\n this.container.classList.toggle('is-gallery', isGallery);\n\n /* if(isGallery) {\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\n }\n\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\n\n const parent = this.list.parentElement;\n parent.textContent = '';\n if(botResults.switch_pm) {\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\n setInnerHTML(btnSwitchToPM, wrapEmojiText(botResults.switch_pm.text));\n attachClickEvent(btnSwitchToPM, (e) => {\n this.chat.appImManager.setInnerPeer({peerId});\n this.managers.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\n });\n parent.append(btnSwitchToPM);\n }\n parent.append(this.list = list);\n\n if(this.gifsMasonry) {\n this.gifsMasonry.detach();\n }\n this.gifsMasonry = gifsMasonry;\n gifsMasonry.attach();\n\n if(!this.onChangeScreen) {\n this.onChangeScreen = () => {\n if(this.list.classList.contains('is-gallery')) {\n const width = (this.list.childElementCount * mediaSizes.active.popupSticker.width) + (this.list.childElementCount - 1 * 1);\n this.list.style.width = width + 'px';\n } else {\n this.list.style.width = '';\n }\n };\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\n }\n\n this.onChangeScreen();\n\n this.toggle(!botResults.results.length && !botResults.switch_pm);\n this.scrollable.scrollTop = 0;\n });\n });\n\n return {user: peer, renderPromise};\n };\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('inline-helper-results');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n this.lazyLoadQueue = new LazyLoadQueue();\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP, this.managers);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport callbackify from '../../helpers/callbackify';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport {processPeerFullForCommands} from './commandsHelper';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nconst CLASS_NAME = 'bot-commands';\nexport default class ChatBotCommands extends AutocompletePeerHelper {\n private userId: UserId;\n\n constructor(\n appendTo: HTMLElement,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(appendTo, undefined, CLASS_NAME, (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n this.toggle(true);\n });\n });\n }\n\n public setUserId(userId: UserId, middleware: () => boolean) {\n if(this.userId === userId && this.list?.childElementCount) {\n this.toggle(false);\n return;\n }\n\n this.userId = userId;\n return callbackify(this.managers.appProfileManager.getProfile(userId), (full) => {\n if(!middleware()) return;\n const filtered = processPeerFullForCommands(userId.toPeerId(false), full);\n\n const PADDING_TOP = 8;\n // const PADDING_BOTTOM = 8;\n const PADDING_BOTTOM = 24;\n const height = filtered.length * 50 + PADDING_TOP + PADDING_BOTTOM;\n this.container.style.setProperty('--height', height + 'px');\n\n this.render(filtered);\n\n // this.container.style.top =\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AckedResult} from '../lib/mtproto/superMessagePort';\nimport {Modify} from '../types';\n\nexport default async function modifyAckedResult(acked: AckedResult): Promise, {result: T | Promise}>> {\n return {\n cached: acked.cached,\n result: acked.cached ? await acked.result : acked.result\n };\n}\n\nexport function modifyAckedPromise(promise: Promise>) {\n return promise.then(modifyAckedResult);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport callbackify from '../../helpers/callbackify';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {getMiddleware} from '../../helpers/middleware';\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\nimport {ChatFull} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {i18n} from '../../lib/langPack';\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport PeerTitle from '../peerTitle';\nimport SetTransition from '../singleTransition';\nimport getChatMembersString from '../wrappers/getChatMembersString';\n\nconst SEND_AS_ANIMATION_DURATION = 300;\n\nexport default class ChatSendAs {\n private avatar: AvatarElement;\n private container: HTMLElement;\n private closeBtn: HTMLElement;\n private btnMenu: HTMLElement;\n private sendAsPeerIds: PeerId[];\n private sendAsPeerId: PeerId;\n private updatingPromise: ReturnType;\n private middleware: ReturnType;\n private listenerSetter: ListenerSetter;\n private peerId: PeerId;\n private addedListener: boolean;\n private buttons: ButtonMenuItemOptions[];\n\n constructor(\n private managers: AppManagers,\n private onReady: (container: HTMLElement, skipAnimation?: boolean) => void,\n private onChange: (sendAsPeerId: PeerId) => void\n ) {\n this.middleware = getMiddleware();\n this.listenerSetter = new ListenerSetter();\n this.construct();\n }\n\n private construct() {\n this.container = document.createElement('div');\n this.container.classList.add('new-message-send-as-container');\n\n this.closeBtn = document.createElement('div');\n this.closeBtn.classList.add('new-message-send-as-close', 'new-message-send-as-avatar', 'tgico-close');\n\n const sendAsButtons: ButtonMenuItemOptions[] = [{\n text: 'SendMessageAsTitle',\n onClick: undefined\n }];\n\n this.buttons = [];\n\n let previousAvatar: HTMLElement;\n const onSendAsMenuToggle = (visible: boolean) => {\n if(visible) {\n previousAvatar = this.avatar;\n }\n\n const isChanged = this.avatar !== previousAvatar;\n const useRafs = !visible && isChanged ? 2 : 0;\n\n SetTransition({\n element: this.closeBtn,\n className: 'is-visible',\n forwards: visible,\n duration: SEND_AS_ANIMATION_DURATION,\n useRafs\n });\n if(!isChanged) {\n SetTransition({\n element: previousAvatar,\n className: 'is-visible',\n forwards: !visible,\n duration: SEND_AS_ANIMATION_DURATION,\n useRafs\n });\n }\n };\n\n ButtonMenuToggle({\n buttonOptions: {noRipple: true},\n listenerSetter: this.listenerSetter,\n container: this.container,\n direction: 'top-right',\n buttons: sendAsButtons,\n onOpenBefore: () => {\n onSendAsMenuToggle(true);\n },\n onOpen: (e, btnMenu) => {\n sendAsButtons[0].element.classList.add('btn-menu-item-header');\n this.btnMenu = btnMenu as any;\n this.btnMenu.classList.add('scrollable', 'scrollable-y');\n this.btnMenu.append(...this.buttons.map((button) => button.element));\n },\n onClose: () => {\n onSendAsMenuToggle(false);\n },\n onCloseAfter: () => {\n this.btnMenu = undefined;\n }\n });\n\n this.container.append(this.closeBtn);\n }\n\n private async updateButtons(peerIds: PeerId[]) {\n const promises: Promise[] = peerIds.map(async(sendAsPeerId, idx) => {\n const textElement = document.createElement('div');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('btn-menu-item-subtitle');\n if(sendAsPeerId.isUser()) {\n subtitle.append(i18n('Chat.SendAs.PersonalAccount'));\n } else if(sendAsPeerId === this.peerId) {\n subtitle.append(i18n('VoiceChat.DiscussionGroup'));\n } else {\n subtitle.append(await getChatMembersString(sendAsPeerId.toChatId()));\n }\n\n textElement.append(\n new PeerTitle({peerId: sendAsPeerId}).element,\n subtitle\n );\n\n return {\n onClick: idx ? async() => {\n const currentPeerId = this.peerId;\n this.changeSendAsPeerId(sendAsPeerId);\n\n const middleware = this.middleware.get();\n const executeButtonsUpdate = () => {\n if(this.sendAsPeerId !== sendAsPeerId || !middleware()) return;\n const peerIds = this.sendAsPeerIds.slice();\n indexOfAndSplice(peerIds, sendAsPeerId);\n peerIds.unshift(sendAsPeerId);\n this.updateButtons(peerIds);\n };\n\n if(rootScope.settings.animationsEnabled) {\n setTimeout(executeButtonsUpdate, 250);\n } else {\n executeButtonsUpdate();\n }\n\n // return;\n this.managers.appMessagesManager.saveDefaultSendAs(currentPeerId, sendAsPeerId);\n } : undefined,\n textElement\n };\n });\n\n const buttons = await Promise.all(promises);\n const btnMenu = ButtonMenuSync({buttons}/* , this.listenerSetter */);\n buttons.forEach((button, idx) => {\n const peerId = peerIds[idx];\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-26', 'btn-menu-item-icon');\n avatar.updateWithOptions({peerId});\n\n if(!idx) {\n avatar.classList.add('active');\n }\n\n button.element.prepend(avatar);\n });\n\n this.buttons = buttons;\n\n // if already opened\n this.btnMenu?.append(...this.buttons.map((button) => button.element));\n }\n\n private async updateAvatar(sendAsPeerId: PeerId, skipAnimation?: boolean) {\n const previousAvatar = this.avatar;\n if(previousAvatar) {\n if(previousAvatar.peerId === sendAsPeerId) {\n return;\n }\n }\n\n if(!previousAvatar) {\n skipAnimation = true;\n }\n\n const useRafs = skipAnimation ? 0 : 2;\n const duration = skipAnimation ? 0 : SEND_AS_ANIMATION_DURATION;\n const avatar = this.avatar = new AvatarElement();\n avatar.classList.add('new-message-send-as-avatar', 'avatar-30');\n await avatar.updateWithOptions({\n isDialog: false,\n peerId: sendAsPeerId\n });\n\n SetTransition({\n element: avatar,\n className: 'is-visible',\n forwards: true,\n duration,\n useRafs\n });\n if(previousAvatar) {\n SetTransition({\n element: previousAvatar,\n className: 'is-visible',\n forwards: false,\n duration,\n onTransitionEnd: () => {\n previousAvatar.remove();\n },\n useRafs\n });\n }\n\n this.container.append(avatar);\n }\n\n private changeSendAsPeerId(sendAsPeerId: PeerId, skipAnimation?: boolean) {\n this.sendAsPeerId = sendAsPeerId;\n this.onChange(sendAsPeerId);\n return this.updateAvatar(sendAsPeerId, skipAnimation);\n }\n\n private getDefaultSendAs(): Promise> {\n // return rootScope.myId;\n return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((acked) => {\n return {\n cached: acked.cached,\n result: acked.result.then((channelFull) => {\n return channelFull.default_send_as ? getPeerId(channelFull.default_send_as) : undefined\n })\n };\n });\n }\n\n public async updateManual(skipAnimation?: boolean): Promise<() => void> {\n const peerId = this.peerId;\n if(this.updatingPromise || !(await this.managers.appPeersManager.isChannel(peerId))) {\n return;\n }\n\n const middleware = this.middleware.get(() => {\n return !this.updatingPromise || this.updatingPromise === updatingPromise;\n });\n\n const {container} = this;\n const chatId = peerId.toChatId();\n const result = (await modifyAckedPromise(this.getDefaultSendAs())).result;\n // const result = Promise.resolve(this.getDefaultSendAs());\n\n const wasSkippingAnimation = skipAnimation;\n if(result instanceof Promise) {\n skipAnimation = undefined;\n }\n\n const auto = wasSkippingAnimation && !skipAnimation;\n\n const updatingPromise = this.updatingPromise = callbackify(result, async(sendAsPeerId) => {\n if(!middleware() || sendAsPeerId === undefined) return;\n\n await this.changeSendAsPeerId(sendAsPeerId, skipAnimation);\n if(!middleware()) return;\n\n this.managers.appChatsManager.getSendAs(chatId).then((sendAsPeers) => {\n if(!middleware()) return;\n\n const peers = sendAsPeers.filter((sendAsPeer) => !sendAsPeer.pFlags.premium_required).map((sendAsPeer) => sendAsPeer.peer);\n const peerIds = peers.map((peer) => getPeerId(peer));\n this.sendAsPeerIds = peerIds.slice();\n\n indexOfAndSplice(peerIds, sendAsPeerId);\n peerIds.unshift(sendAsPeerId);\n this.updateButtons(peerIds);\n });\n\n const callback = () => {\n this.onReady(container, skipAnimation);\n\n if(!this.addedListener) {\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.update();\n }\n });\n\n this.addedListener = true;\n }\n };\n\n if(auto) {\n callback();\n return;\n }\n\n return callback;\n });\n\n updatingPromise.finally(() => {\n if(this.updatingPromise === updatingPromise) {\n this.updatingPromise = undefined;\n }\n });\n\n if(!auto) {\n return updatingPromise;\n }\n }\n\n public update(skipAnimation?: boolean) {\n return this.updateManual(skipAnimation).then((callback) => callback?.());\n }\n\n public setPeerId(peerId?: PeerId) {\n /* if(this.avatar) {\n this.avatar.remove();\n this.avatar = undefined;\n } */\n\n this.middleware.clean();\n this.updatingPromise = undefined;\n this.peerId = peerId;\n }\n\n public destroy() {\n this.container.remove();\n this.setPeerId();\n this.listenerSetter.removeAll();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {markdownTags, MarkdownType} from './getRichElementValue';\n\nexport default function hasMarkupInSelection(types: T[], onlyFull?: boolean) {\n const result: Record = {} as any;\n types.forEach((tag) => result[tag] = 0);\n const selection = window.getSelection();\n let nodes = -1;\n if(!selection.isCollapsed) {\n const range = selection.getRangeAt(0);\n const commonAncestor = range.commonAncestorContainer;\n const root = commonAncestor.nodeType === commonAncestor.ELEMENT_NODE ?\n commonAncestor as HTMLElement :\n (commonAncestor as ChildNode).parentElement;\n const treeWalker = document.createTreeWalker(\n root.closest('[contenteditable=\"true\"]'),\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,\n {acceptNode: (node) => range.intersectsNode(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT}\n );\n\n nodes = 0;\n let node: Node;\n while(node = treeWalker.nextNode()) {\n ++nodes;\n for(const type of types) {\n const tag = markdownTags[type];\n const matches = (node.nodeType === node.ELEMENT_NODE ? node as HTMLElement : node.parentElement).closest(tag.match);\n if(matches) {\n ++result[type];\n }\n }\n }\n }\n\n const resultBoolean: Record = {} as any;\n for(const type of types) {\n resultBoolean[type] = result[type] >= (onlyFull ? nodes : 1);\n }\n\n return resultBoolean;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppImManager, APP_TABS} from '../../lib/appManagers/appImManager';\nimport type {MyDraftMessage} from '../../lib/appManagers/appDraftsManager';\nimport type Chat from './chat';\nimport Recorder from '../../../public/recorder.min';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n// import Recorder from '../opus-recorder/dist/recorder.min';\nimport opusDecodeController from '../../lib/opusDecodeController';\nimport {ButtonMenuItemOptions, ButtonMenuItemOptionsVerifiable, ButtonMenuSync} from '../buttonMenu';\nimport emoticonsDropdown from '../emoticonsDropdown';\nimport PopupCreatePoll from '../popups/createPoll';\nimport PopupForward from '../popups/forward';\nimport PopupNewMedia from '../popups/newMedia';\nimport {toast, toastNew} from '../toast';\nimport {MessageEntity, DraftMessage, WebPage, Message, UserFull, AttachMenuPeerType} from '../../layer';\nimport StickersHelper from './stickersHelper';\nimport ButtonIcon from '../buttonIcon';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\nimport Button from '../button';\nimport PopupSchedule from '../popups/schedule';\nimport SendMenu from './sendContextMenu';\nimport rootScope from '../../lib/rootScope';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport tsNow from '../../helpers/tsNow';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE, IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport I18n, {i18n, join, LangPackKey} from '../../lib/langPack';\nimport {generateTail} from './bubbles';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport ButtonCorner from '../buttonCorner';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport cancelSelection from '../../helpers/dom/cancelSelection';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {MarkdownType} from '../../helpers/dom/getRichElementValue';\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\nimport EmojiHelper from './emojiHelper';\nimport CommandsHelper from './commandsHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompleteHelper from './autocompleteHelper';\nimport MentionsHelper from './mentionsHelper';\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\nimport ReplyKeyboard from './replyKeyboard';\nimport InlineHelper from './inlineHelper';\nimport debounce from '../../helpers/schedulers/debounce';\nimport noop from '../../helpers/noop';\nimport {putPreloader} from '../putPreloader';\nimport SetTransition from '../singleTransition';\nimport PeerTitle from '../peerTitle';\nimport {fastRaf} from '../../helpers/schedulers';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport fixSafariStickyInputFocusing, {IS_STICKY_INPUT_BUGGED} from '../../helpers/dom/fixSafariStickyInputFocusing';\nimport PopupPeer from '../popups/peer';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport appMediaPlaybackController from '../appMediaPlaybackController';\nimport {BOT_START_PARAM, NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport setCaretAt from '../../helpers/dom/setCaretAt';\nimport CheckboxField from '../checkboxField';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport RadioForm from '../radioForm';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport callbackify from '../../helpers/callbackify';\nimport ChatBotCommands from './botCommands';\nimport copy from '../../helpers/object/copy';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport documentFragmentToHTML from '../../helpers/dom/documentFragmentToHTML';\nimport PopupElement from '../popups';\nimport getEmojiEntityFromEmoji from '../../lib/richTextProcessor/getEmojiEntityFromEmoji';\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\nimport parseMarkdown from '../../lib/richTextProcessor/parseMarkdown';\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\nimport wrapDraft from '../wrappers/draft';\nimport wrapMessageForReply from '../wrappers/messageForReply';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {emojiFromCodePoints} from '../../vendor/emoji';\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\nimport ChatSendAs from './sendAs';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport InputFieldAnimated from '../inputFieldAnimated';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport PopupStickers from '../popups/stickers';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport wrapReply from '../wrappers/reply';\nimport {getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';\nimport hasMarkupInSelection from '../../helpers/dom/hasMarkupInSelection';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport RichInputHandler from '../../helpers/dom/richInputHandler';\nimport {insertRichTextAsHTML} from '../inputField';\nimport getCaretPosNew from '../../helpers/dom/getCaretPosNew';\nimport draftsAreEqual from '../../lib/appManagers/utils/drafts/draftsAreEqual';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport getAttachMenuBotIcon from '../../lib/appManagers/utils/attachMenuBots/getAttachMenuBotIcon';\nimport TelegramWebView from '../telegramWebView';\n\nconst RECORD_MIN_TIME = 500;\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\n\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\n\nexport default class ChatInput {\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\n public messageInput: HTMLElement;\n public messageInputField: InputFieldAnimated;\n private fileInput: HTMLInputElement;\n private inputMessageContainer: HTMLDivElement;\n private btnSend: HTMLButtonElement;\n private btnCancelRecord: HTMLButtonElement;\n private lastUrl = '';\n private lastTimeType = 0;\n\n public chatInput: HTMLElement;\n public inputContainer: HTMLElement;\n public rowsWrapper: HTMLDivElement;\n private newMessageWrapper: HTMLDivElement;\n private btnToggleEmoticons: HTMLButtonElement;\n private btnToggleReplyMarkup: HTMLButtonElement;\n private btnSendContainer: HTMLDivElement;\n\n private replyKeyboard: ReplyKeyboard;\n\n private attachMenu: HTMLElement;\n private attachMenuButtons: ButtonMenuItemOptionsVerifiable[];\n\n private sendMenu: SendMenu;\n\n private replyElements: {\n container: HTMLElement,\n cancelBtn: HTMLButtonElement,\n iconBtn: HTMLButtonElement\n } = {} as any;\n\n private forwardElements: {\n changePeer: ButtonMenuItemOptions,\n showSender: ButtonMenuItemOptions,\n hideSender: ButtonMenuItemOptions,\n showCaption: ButtonMenuItemOptions,\n hideCaption: ButtonMenuItemOptions,\n container: HTMLElement,\n modifyArgs?: ButtonMenuItemOptions[]\n };\n private forwardHover: DropdownHover;\n private forwardWasDroppingAuthor: boolean;\n\n private getWebPagePromise: Promise;\n private willSendWebPage: WebPage = null;\n private forwarding: {[fromPeerId: PeerId]: number[]};\n public replyToMsgId: number;\n public editMsgId: number;\n public editMessage: Message.message;\n private noWebPage: true;\n public scheduleDate: number;\n public sendSilent: true;\n public startParam: string;\n\n private recorder: any;\n public recording = false;\n private recordCanceled = false;\n private recordTimeEl: HTMLElement;\n private recordRippleEl: HTMLElement;\n private recordStartTime = 0;\n private recordingOverlayListener: Listener;\n private recordingNavigationItem: NavigationItem;\n\n // private scrollTop = 0;\n // private scrollOffsetTop = 0;\n // private scrollDiff = 0;\n\n public helperType: Exclude;\n private helperFunc: () => void | Promise;\n private helperWaitingForward: boolean;\n\n public willAttachType: 'document' | 'media';\n\n private lockRedo = false;\n private canRedoFromHTML = '';\n private readonly undoHistory: string[] = [];\n private readonly executedHistory: string[] = [];\n private canUndoFromHTML = '';\n\n private autocompleteHelperController: AutocompleteHelperController;\n private stickersHelper: StickersHelper;\n private emojiHelper: EmojiHelper;\n private commandsHelper: CommandsHelper;\n private mentionsHelper: MentionsHelper;\n private inlineHelper: InlineHelper;\n private listenerSetter: ListenerSetter;\n\n private pinnedControlBtn: HTMLButtonElement;\n\n private goDownBtn: HTMLButtonElement;\n private goDownUnreadBadge: HTMLElement;\n private goMentionBtn: HTMLButtonElement;\n private goMentionUnreadBadge: HTMLSpanElement;\n private btnScheduled: HTMLButtonElement;\n\n private btnPreloader: HTMLButtonElement;\n\n private saveDraftDebounced: () => void;\n\n private fakeRowsWrapper: HTMLDivElement;\n\n private previousQuery: string;\n\n private releaseMediaPlayback: () => void;\n\n private botStartBtn: HTMLButtonElement;\n private rowsWrapperWrapper: HTMLDivElement;\n private controlContainer: HTMLElement;\n private fakeSelectionWrapper: HTMLDivElement;\n\n private fakeWrapperTo: HTMLElement;\n private toggleBotStartBtnDisability: () => void;\n\n private botCommandsToggle: HTMLElement;\n private botCommands: ChatBotCommands;\n private botCommandsIcon: HTMLDivElement;\n private hasBotCommands: boolean;\n\n // private activeContainer: HTMLElement;\n\n private sendAs: ChatSendAs;\n public sendAsPeerId: PeerId;\n\n private replyInTopicOverlay: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private appImManager: AppImManager,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n }\n\n public construct() {\n this.chatInput = document.createElement('div');\n this.chatInput.classList.add('chat-input', 'hide');\n\n this.inputContainer = document.createElement('div');\n this.inputContainer.classList.add('chat-input-container');\n\n this.rowsWrapperWrapper = document.createElement('div');\n this.rowsWrapperWrapper.classList.add('rows-wrapper-wrapper');\n\n this.rowsWrapper = document.createElement('div');\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\n\n this.rowsWrapperWrapper.append(this.rowsWrapper);\n\n const tail = generateTail();\n this.rowsWrapper.append(tail);\n\n const fakeRowsWrapper = this.fakeRowsWrapper = document.createElement('div');\n fakeRowsWrapper.classList.add('fake-wrapper', 'fake-rows-wrapper');\n\n const fakeSelectionWrapper = this.fakeSelectionWrapper = document.createElement('div');\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\n\n this.inputContainer.append(this.rowsWrapperWrapper, fakeRowsWrapper, fakeSelectionWrapper);\n this.chatInput.append(this.inputContainer);\n\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button chat-secondary-button bubbles-go-down hide'});\n this.inputContainer.append(this.goDownBtn);\n\n attachClickEvent(this.goDownBtn, (e) => {\n cancelEvent(e);\n this.chat.bubbles.onGoDownClick();\n }, {listenerSetter: this.listenerSetter});\n\n // * constructor end\n\n /* let setScrollTopTimeout: number;\n // @ts-ignore\n let height = window.visualViewport.height; */\n // @ts-ignore\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\n // const scrollable = this.chat.bubbles.scrollable;\n // const wasScrolledDown = scrollable.isScrolledDown;\n\n // /* if(wasScrolledDown) {\n // this.saveScroll();\n // } */\n\n // // @ts-ignore\n // let newHeight = window.visualViewport.height;\n // const diff = height - newHeight;\n // const scrollTop = scrollable.scrollTop;\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\n\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\n\n // scrollable.scrollTop = needScrollTop;\n\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\n // setScrollTopTimeout = window.setTimeout(() => {\n // const diff = height - newHeight;\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\n // height = newHeight;\n\n // scrollable.scrollTop = needScrollTop;\n\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\n\n // /* if(isScrolledDown) {\n // scrollable.scrollTop = scrollable.scrollHeight;\n // } */\n\n // //scrollable.scrollTop += diff;\n // setScrollTopTimeout = 0;\n // }, 0);\n // });\n\n // ! Can't use it with resizeObserver\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\n const scrollable = this.chat.bubbles.scrollable;\n const wasScrolledDown = scrollable.isScrolledDown;\n\n // @ts-ignore\n let newHeight = window.visualViewport.height;\n const diff = height - newHeight;\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\n\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\n\n scrollable.scrollTop = needScrollTop;\n height = newHeight;\n\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\n scrollable.scrollTop = needScrollTop;\n\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\n setScrollTopTimeout = 0;\n }, 0);\n }); */\n\n const c = this.controlContainer = document.createElement('div');\n c.classList.add('chat-input-control', 'chat-input-wrapper');\n this.inputContainer.append(c);\n }\n\n public constructPeerHelpers() {\n this.replyElements.container = document.createElement('div');\n this.replyElements.container.classList.add('reply-wrapper');\n\n this.replyElements.iconBtn = ButtonIcon('');\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\n\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\n\n //\n\n const onHideAuthorClick = () => {\n isChangingAuthor = true;\n };\n\n const onHideCaptionClick = () => {\n isChangingAuthor = false;\n };\n\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\n let isChangingAuthor = false;\n const forwardButtons: ButtonMenuItemOptions[] = [\n forwardElements.showSender = {\n text: 'Chat.Alert.Forward.Action.Show1',\n onClick: onHideAuthorClick,\n checkForClose: () => this.canToggleHideAuthor(),\n checkboxField: new CheckboxField({checked: true})\n },\n forwardElements.hideSender = {\n text: 'Chat.Alert.Forward.Action.Hide1',\n onClick: onHideAuthorClick,\n checkForClose: () => this.canToggleHideAuthor(),\n checkboxField: new CheckboxField({checked: false})\n },\n forwardElements.showCaption = {\n text: 'Chat.Alert.Forward.Action.ShowCaption',\n onClick: onHideCaptionClick,\n checkboxField: new CheckboxField({checked: true})\n },\n forwardElements.hideCaption = {\n text: 'Chat.Alert.Forward.Action.HideCaption',\n onClick: onHideCaptionClick,\n checkboxField: new CheckboxField({checked: false})\n },\n forwardElements.changePeer = {\n text: 'Chat.Alert.Forward.Action.Another',\n onClick: () => {\n this.changeForwardRecipient();\n },\n icon: 'replace'\n }\n ];\n const forwardBtnMenu = forwardElements.container = ButtonMenuSync({\n buttons: forwardButtons,\n listenerSetter: this.listenerSetter\n });\n // forwardBtnMenu.classList.add('top-center');\n\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\n const groups: {\n elements: HTMLElement[],\n onChange: (value: string, event: Event) => void\n }[] = [{\n elements: children.slice(0, 2),\n onChange: (value, e) => {\n const checked = !!+value;\n if(isChangingAuthor) {\n this.forwardWasDroppingAuthor = !checked;\n }\n\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\n if(replyTitle) {\n const el = replyTitle.firstElementChild as HTMLElement;\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\n i.key = langPackKey;\n i.update();\n }\n }\n }, {\n elements: children.slice(2, 4),\n onChange: (value) => {\n const checked = !!+value;\n let b: ButtonMenuItemOptions;\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\n } else {\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\n }\n\n b.checkboxField.checked = true;\n }\n }];\n groups.forEach((group) => {\n const container = RadioForm(group.elements.map((e) => {\n return {\n container: e,\n input: e.querySelector('input')\n };\n }), group.onChange);\n\n const hr = document.createElement('hr');\n container.append(hr);\n forwardBtnMenu.append(container);\n });\n\n forwardBtnMenu.append(forwardElements.changePeer.element);\n\n if(!IS_TOUCH_SUPPORTED) {\n const forwardHover = this.forwardHover = new DropdownHover({\n element: forwardBtnMenu\n });\n }\n\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\n this.replyElements.container.append(forwardBtnMenu);\n\n forwardElements.modifyArgs.forEach((b, idx) => {\n const {input} = b.checkboxField;\n input.type = 'radio';\n input.name = idx < 2 ? 'author' : 'caption';\n input.value = '' + +!(idx % 2);\n });\n\n //\n\n this.newMessageWrapper = document.createElement('div');\n this.newMessageWrapper.classList.add('new-message-wrapper');\n\n this.replyInTopicOverlay = document.createElement('div');\n this.replyInTopicOverlay.classList.add('reply-in-topic-overlay', 'hide');\n this.replyInTopicOverlay.append(i18n('Chat.Input.ReplyToAnswer'));\n\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\n\n this.inputMessageContainer = document.createElement('div');\n this.inputMessageContainer.classList.add('input-message-container');\n\n this.goDownUnreadBadge = document.createElement('span');\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\n this.goDownBtn.append(this.goDownUnreadBadge);\n\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button chat-secondary-button bubbles-go-mention'});\n this.goMentionUnreadBadge = document.createElement('span');\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\n this.goMentionBtn.append(this.goMentionUnreadBadge);\n this.inputContainer.append(this.goMentionBtn);\n\n attachClickEvent(this.goMentionBtn, (e) => {\n cancelEvent(e);\n const middleware = this.chat.bubbles.getMiddleware();\n this.managers.appMessagesManager.goToNextMention(this.chat.peerId, this.chat.threadId).then((mid) => {\n if(!middleware()) {\n return;\n }\n\n if(mid) {\n this.chat.setMessageId(mid);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\n\n attachClickEvent(this.btnScheduled, (e) => {\n this.appImManager.openScheduled(this.chat.peerId);\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\n if(this.chat.peerId !== peerId) {\n return;\n }\n\n this.btnScheduled.classList.remove('hide');\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\n if(this.chat.peerId !== peerId) {\n return;\n }\n\n this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((value) => {\n this.btnScheduled.classList.toggle('hide', !value.length);\n });\n });\n\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\n this.replyKeyboard = new ReplyKeyboard({\n appendTo: this.rowsWrapper,\n listenerSetter: this.listenerSetter,\n managers: this.managers,\n btnHover: this.btnToggleReplyMarkup,\n chatInput: this\n });\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\n\n this.botCommands = new ChatBotCommands(this.rowsWrapper, this, this.managers);\n this.botCommandsToggle = document.createElement('div');\n this.botCommandsToggle.classList.add('new-message-bot-commands');\n\n const scaler = document.createElement('div');\n scaler.classList.add('new-message-bot-commands-icon-scale');\n\n const icon = this.botCommandsIcon = document.createElement('div');\n icon.classList.add('animated-menu-icon', 'animated-menu-close-icon');\n scaler.append(icon);\n this.botCommandsToggle.append(scaler);\n\n attachClickEvent(this.botCommandsToggle, (e) => {\n cancelEvent(e);\n const isShown = icon.classList.contains('state-back');\n if(isShown) {\n this.botCommands.toggle(true);\n icon.classList.remove('state-back');\n } else {\n this.botCommands.setUserId(this.chat.peerId.toUserId(), this.chat.bubbles.getMiddleware());\n icon.classList.add('state-back');\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.botCommands.addEventListener('visible', () => {\n icon.classList.add('state-back');\n });\n\n this.botCommands.addEventListener('hiding', () => {\n icon.classList.remove('state-back');\n });\n\n this.attachMenuButtons = [{\n icon: 'image',\n text: 'Chat.Input.Attach.PhotoOrVideo',\n onClick: () => {\n this.fileInput.value = '';\n const accept = [...MEDIA_MIME_TYPES_SUPPORTED].join(', ');\n this.fileInput.setAttribute('accept', accept);\n this.willAttachType = 'media';\n this.fileInput.click();\n },\n verify: () => this.chat.canSend('send_media')\n }, {\n icon: 'document',\n text: 'Chat.Input.Attach.Document',\n onClick: () => {\n this.fileInput.value = '';\n this.fileInput.removeAttribute('accept');\n this.willAttachType = 'document';\n this.fileInput.click();\n },\n verify: () => this.chat.canSend('send_media')\n }, {\n icon: 'poll',\n text: 'Poll',\n onClick: () => {\n PopupElement.createPopup(PopupCreatePoll, this.chat).show();\n },\n verify: () => (this.chat.peerId.isAnyChat() || this.chat.isBot) && this.chat.canSend('send_polls')\n }];\n\n const attachMenuButtons = this.attachMenuButtons.slice();\n this.attachMenu = ButtonMenuToggle({\n buttonOptions: {noRipple: true},\n listenerSetter: this.listenerSetter,\n direction: 'top-left',\n buttons: this.attachMenuButtons,\n onOpenBefore: async() => {\n const attachMenuBots = await this.managers.appAttachMenuBotsManager.getAttachMenuBots();\n const buttons = attachMenuButtons.slice();\n const attachMenuBotsButtons = attachMenuBots.filter((attachMenuBot) => {\n return !attachMenuBot.pFlags.inactive;\n }).map((attachMenuBot) => {\n const icon = getAttachMenuBotIcon(attachMenuBot);\n const button: typeof buttons[0] = {\n regularText: wrapEmojiText(attachMenuBot.short_name),\n onClick: () => {\n this.managers.appAttachMenuBotsManager.requestWebView({\n botId: attachMenuBot.bot_id,\n peerId: this.chat.peerId,\n ...this.chat.getMessageSendingParams()\n }).then((webViewResultUrl) => {\n const SANDBOX_ATTRIBUTES = [\n 'allow-scripts',\n 'allow-same-origin',\n 'allow-popups',\n 'allow-forms',\n 'allow-modals',\n 'allow-storage-access-by-user-activation'\n ].join(' ');\n\n class P extends PopupElement<{\n finish: () => void\n }> {\n private telegramWebView: TelegramWebView;\n\n constructor(private url: string) {\n super('popup-payment popup-payment-verification', {\n closable: true,\n overlayClosable: true,\n body: true,\n titleRaw: attachMenuBot.short_name\n });\n\n this.d();\n }\n\n protected destroy() {\n this.telegramWebView.destroy();\n return super.destroy();\n }\n\n private d() {\n const telegramWebView = this.telegramWebView = new TelegramWebView({\n url: this.url,\n sandbox: SANDBOX_ATTRIBUTES\n });\n\n telegramWebView.iframe.classList.add('payment-verification');\n\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n }\n\n new P(webViewResultUrl.url);\n });\n },\n iconDoc: icon?.icon as MyDocument,\n verify: async() => {\n let found = false;\n\n const verifyMap: {\n [type in AttachMenuPeerType['_']]: () => boolean | Promise\n } = {\n attachMenuPeerTypeSameBotPM: () => this.chat.peerId.toUserId() === attachMenuBot.bot_id,\n attachMenuPeerTypeBotPM: () => this.chat.isBot,\n attachMenuPeerTypePM: () => this.chat.peerId.isUser(),\n attachMenuPeerTypeChat: () => this.chat.isAnyGroup,\n attachMenuPeerTypeBroadcast: () => this.chat.isBroadcast\n };\n\n for(const peerType of attachMenuBot.peer_types) {\n const verify = verifyMap[peerType._];\n found = await verify();\n if(found) {\n break;\n }\n }\n\n return found;\n }\n };\n\n return button;\n });\n\n buttons.splice(buttons.length, 0, ...attachMenuBotsButtons);\n this.attachMenuButtons.splice(0, this.attachMenuButtons.length, ...buttons);\n }\n });\n this.attachMenu.classList.add('attach-file', 'tgico-attach');\n this.attachMenu.classList.remove('tgico-more');\n\n // this.inputContainer.append(this.sendMenu);\n\n this.recordTimeEl = document.createElement('div');\n this.recordTimeEl.classList.add('record-time');\n\n this.fileInput = document.createElement('input');\n this.fileInput.type = 'file';\n this.fileInput.multiple = true;\n this.fileInput.style.display = 'none';\n\n this.newMessageWrapper.append(...[this.botCommandsToggle, this.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\n\n this.rowsWrapper.append(this.replyElements.container);\n this.autocompleteHelperController = new AutocompleteHelperController();\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\n this.rowsWrapper.append(this.newMessageWrapper);\n\n this.btnCancelRecord = ButtonIcon('binfilled btn-circle btn-record-cancel chat-secondary-button');\n\n this.btnSendContainer = document.createElement('div');\n this.btnSendContainer.classList.add('btn-send-container');\n\n this.recordRippleEl = document.createElement('div');\n this.recordRippleEl.classList.add('record-ripple');\n\n this.btnSend = ButtonIcon('none btn-circle btn-send animated-button-icon');\n this.btnSend.insertAdjacentHTML('afterbegin', `\n \n \n \n \n `);\n\n this.btnSendContainer.append(this.recordRippleEl, this.btnSend);\n\n this.sendMenu = new SendMenu({\n onSilentClick: () => {\n this.sendSilent = true;\n this.sendMessage();\n },\n onScheduleClick: () => {\n this.scheduleSending(undefined);\n },\n listenerSetter: this.listenerSetter,\n openSide: 'top-left',\n onContextElement: this.btnSend,\n onOpen: () => {\n return this.chat.type !== 'scheduled' && (!this.isInputEmpty() || !!Object.keys(this.forwarding).length);\n }\n });\n\n this.btnSendContainer.append(this.sendMenu.sendMenu);\n\n this.inputContainer.append(this.btnCancelRecord, this.btnSendContainer);\n\n emoticonsDropdown.attachButtonListener(this.btnToggleEmoticons, this.listenerSetter);\n this.listenerSetter.add(emoticonsDropdown)('open', this.onEmoticonsOpen);\n this.listenerSetter.add(emoticonsDropdown)('close', this.onEmoticonsClose);\n\n this.attachMessageInputField();\n\n /* this.attachMenu.addEventListener('mousedown', (e) => {\n const hidden = this.attachMenu.querySelectorAll('.hide');\n if(hidden.length === this.attachMenuButtons.length) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n cancelEvent(e);\n return false;\n }\n }, {passive: false, capture: true}); */\n\n this.listenerSetter.add(rootScope)('settings_updated', () => {\n if(this.stickersHelper || this.emojiHelper) {\n // this.previousQuery = undefined;\n this.previousQuery = '';\n this.checkAutocomplete();\n /* if(!rootScope.settings.stickers.suggest) {\n this.stickersHelper.checkEmoticon('');\n } else {\n this.onMessageInput();\n } */\n }\n\n this.messageInputField?.onFakeInput();\n });\n\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId || this.chat.type === 'scheduled') return;\n this.setDraft(draft, true, force);\n });\n\n this.listenerSetter.add(this.appImManager)('peer_changing', (chat) => {\n if(this.chat === chat && (this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n this.saveDraft();\n }\n });\n\n this.listenerSetter.add(this.appImManager)('chat_changing', ({from, to}) => {\n if(this.chat === from) {\n this.autocompleteHelperController.toggleListNavigation(false);\n } else if(this.chat === to) {\n this.autocompleteHelperController.toggleListNavigation(true);\n }\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\n if(this.chat.type === 'scheduled' && this.chat.peerId === peerId && mids.includes(this.editMsgId)) {\n this.onMessageSent();\n }\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n if(this.chat.peerId === peerId && this.chat.type !== 'scheduled') {\n if(msgs.has(this.editMsgId)) {\n this.onMessageSent();\n }\n\n if(this.replyToMsgId && msgs.has(this.replyToMsgId)) {\n this.clearHelper('reply');\n }\n\n /* if(this.chat.isStartButtonNeeded()) {\n this.setStartParam(BOT_START_PARAM);\n } */\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(dialogs.has(this.chat.peerId) && (this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n if(this.startParam === BOT_START_PARAM) {\n this.setStartParam();\n } else { // updateNewMessage comes earlier than dialog appers\n this.center(true);\n }\n }\n });\n\n try {\n this.recorder = new Recorder({\n // encoderBitRate: 32,\n // encoderPath: \"../dist/encoderWorker.min.js\",\n encoderSampleRate: 48000,\n monitorGain: 0,\n numberOfChannels: 1,\n recordingGain: 1,\n reuseWorker: true\n });\n } catch(err) {\n console.error('Recorder constructor error:', err);\n }\n\n this.updateSendBtn();\n\n this.listenerSetter.add(this.fileInput)('change', (e) => {\n const files = (e.target as HTMLInputElement & EventTarget).files;\n if(!files.length) {\n return;\n }\n\n PopupElement.createPopup(PopupNewMedia, this.chat, Array.from(files).slice(), this.willAttachType);\n this.fileInput.value = '';\n }, false);\n\n /* let time = Date.now();\n this.btnSend.addEventListener('touchstart', (e) => {\n time = Date.now();\n });\n\n let eventName1 = 'touchend';\n this.btnSend.addEventListener(eventName1, (e: Event) => {\n //cancelEvent(e);\n console.log(eventName1 + ', time: ' + (Date.now() - time));\n });\n\n let eventName = 'mousedown';\n this.btnSend.addEventListener(eventName, (e: Event) => {\n cancelEvent(e);\n console.log(eventName + ', time: ' + (Date.now() - time));\n }); */\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\n\n if(this.recorder) {\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\n\n this.recorder.onstop = () => {\n this.setRecording(false);\n this.chatInput.classList.remove('is-locked');\n this.recordRippleEl.style.transform = '';\n };\n\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\n if(this.releaseMediaPlayback) {\n this.releaseMediaPlayback();\n this.releaseMediaPlayback = undefined;\n }\n\n if(this.recordingOverlayListener) {\n this.listenerSetter.remove(this.recordingOverlayListener);\n this.recordingOverlayListener = undefined;\n }\n\n if(this.recordingNavigationItem) {\n appNavigationController.removeItem(this.recordingNavigationItem);\n this.recordingNavigationItem = undefined;\n }\n\n if(this.recordCanceled) {\n return;\n }\n\n const {peerId, threadId} = this.chat;\n const replyToMsgId = this.replyToMsgId;\n\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\n /* const fileName = new Date().toISOString() + \".opus\";\n console.log('Recorder data received', typedArray, dataBlob); */\n\n // let perf = performance.now();\n opusDecodeController.decode(typedArray, true).then((result) => {\n // console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\n\n opusDecodeController.setKeepAlive(false);\n\n // тут objectURL ставится уже с audio/wav\n this.managers.appMessagesManager.sendFile(peerId, {\n file: dataBlob,\n isVoiceMessage: true,\n isMedia: true,\n duration,\n waveform: result.waveform,\n objectURL: result.url,\n replyToMsgId,\n threadId,\n clearDraft: true\n });\n\n this.onMessageSent(false, true);\n });\n };\n }\n\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\n\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\n\n this.botStartBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button');\n this.botStartBtn.append(i18n('BotStart'));\n\n attachClickEvent(this.botStartBtn, () => {\n const {startParam} = this;\n if(startParam === undefined) {\n return;\n }\n\n const toggle = this.toggleBotStartBtnDisability = toggleDisability([this.botStartBtn], true);\n const peerId = this.chat.peerId;\n const middleware = this.chat.bubbles.getMiddleware(() => {\n return this.chat.peerId === peerId && this.startParam === startParam && this.toggleBotStartBtnDisability === toggle;\n });\n\n this.managers.appMessagesManager.startBot(peerId.toUserId(), undefined, startParam).then(() => {\n if(middleware()) {\n toggle();\n this.toggleBotStartBtnDisability = undefined;\n this.setStartParam();\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.controlContainer.append(this.botStartBtn, this.replyInTopicOverlay);\n\n // * pinned part start\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button', {icon: 'unpin'});\n this.controlContainer.append(this.pinnedControlBtn);\n\n this.listenerSetter.add(this.pinnedControlBtn)('click', () => {\n const peerId = this.chat.peerId;\n\n new PopupPinMessage(peerId, 0, true, () => {\n this.chat.appImManager.setPeer(); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n });\n });\n // * pinned part end\n }\n\n public _center(neededFakeContainer: HTMLElement, animate?: boolean) {\n if(!neededFakeContainer && !this.inputContainer.classList.contains('is-centering')) {\n return;\n }\n\n if(neededFakeContainer === this.fakeWrapperTo) {\n return;\n }\n\n /* if(neededFakeContainer === this.botStartContainer && this.fakeWrapperTo === this.fakeSelectionWrapper) {\n this.inputContainer.classList.remove('is-centering');\n void this.rowsWrapper.offsetLeft; // reflow\n // this.inputContainer.classList.add('is-centering');\n // void this.rowsWrapper.offsetLeft; // reflow\n } */\n\n const fakeSelectionWrapper = neededFakeContainer || this.fakeWrapperTo;\n const forwards = !!neededFakeContainer;\n const oldFakeWrapperTo = this.fakeWrapperTo;\n let transform = '', borderRadius = '', needTranslateX: number;\n // if(forwards) {]\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\n const fakeRowsRect = this.fakeRowsWrapper.getBoundingClientRect();\n const widthFrom = fakeRowsRect.width;\n const widthTo = fakeSelectionRect.width;\n\n if(widthFrom !== widthTo) {\n const scale = (widthTo/* - 8 */) / widthFrom;\n const initTranslateX = (widthFrom - widthTo) / 2;\n needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\n\n if(forwards) {\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\n // transform = `translateX(0px) scaleX(${scale})`;\n\n if(scale < 1) {\n const br = 16;\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\n }\n }\n // scale = widthTo / widthFrom;\n }\n // }\n\n this.fakeWrapperTo = neededFakeContainer;\n\n const duration = animate ? 200 : 0;\n SetTransition({\n element: this.inputContainer,\n className: 'is-centering',\n forwards,\n duration\n });\n SetTransition({\n element: this.rowsWrapperWrapper,\n className: 'is-centering-to-control',\n forwards: !!(forwards && neededFakeContainer && neededFakeContainer.classList.contains('chat-input-control')),\n duration\n });\n this.rowsWrapper.style.transform = transform;\n this.rowsWrapper.style.borderRadius = borderRadius;\n\n return {\n transform,\n borderRadius,\n needTranslateX: oldFakeWrapperTo && (\n (\n neededFakeContainer &&\n neededFakeContainer.classList.contains('chat-input-control') &&\n oldFakeWrapperTo === this.fakeSelectionWrapper\n ) || oldFakeWrapperTo.classList.contains('chat-input-control')\n ) ? needTranslateX * -.5 : needTranslateX,\n widthFrom,\n widthTo\n };\n }\n\n public async center(animate = false) {\n return this._center(await this.getNeededFakeContainer(), animate);\n }\n\n public setStartParam(startParam?: string) {\n if(this.startParam === startParam) {\n return;\n }\n\n this.startParam = startParam;\n this.center(true);\n }\n\n public isReplyInTopicOverlayNeeded() {\n return this.chat.isForum &&\n !this.chat.isForumTopic &&\n !this.replyToMsgId &&\n this.chat.type === 'chat';\n }\n\n public async getNeededFakeContainer(startParam = this.startParam) {\n if(this.chat.selection.isSelecting) {\n return this.fakeSelectionWrapper;\n } else if(\n startParam !== undefined ||\n !(await this.chat.canSend()) ||\n this.chat.type === 'pinned' ||\n await this.chat.isStartButtonNeeded() ||\n this.isReplyInTopicOverlayNeeded()\n ) {\n return this.controlContainer;\n }\n }\n\n // public getActiveContainer() {\n // if(this.chat.selection.isSelecting) {\n // return this.chat\n // }\n // return this.startParam !== undefined ? this.botStartContainer : this.rowsWrapper;\n // }\n\n // public setActiveContainer() {\n // const container = this.activeContainer;\n // const newContainer = this.getActiveContainer();\n // if(newContainer === container) {\n // return;\n // }\n\n\n // }\n\n private onCancelRecordClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n this.recordCanceled = true;\n this.recorder.stop();\n opusDecodeController.setKeepAlive(false);\n };\n\n private onEmoticonsOpen = () => {\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\n };\n\n private onEmoticonsClose = () => {\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\n };\n\n public getReadyToSend(callback: () => void) {\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\n }\n\n public scheduleSending = async(callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\n const {peerId} = this.chat;\n const middleware = this.chat.bubbles.getMiddleware();\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && await this.managers.appUsersManager.isUserOnlineVisible(peerId);\n\n new PopupSchedule(initDate, (timestamp) => {\n if(!middleware()) {\n return;\n }\n\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(timestamp <= minTimestamp) {\n timestamp = undefined;\n }\n\n this.scheduleDate = timestamp;\n callback();\n\n if(this.chat.type !== 'scheduled' && timestamp) {\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\n if(!middleware()) {\n return;\n }\n\n const popups = PopupElement.getPopups(PopupStickers);\n popups.forEach((popup) => popup.hide());\n\n this.appImManager.openScheduled(peerId);\n }, 0);\n }\n }, canSendWhenOnline).show();\n };\n\n public async setUnreadCount() {\n if(!this.goDownUnreadBadge) {\n return;\n }\n\n const dialog = await this.managers.dialogsStorage.getDialogOrTopic(this.chat.peerId, this.chat.type === 'discussion' ? undefined : this.chat.threadId);\n const count = dialog?.unread_count;\n this.goDownUnreadBadge.innerText = '' + (count || '');\n this.goDownUnreadBadge.classList.toggle('badge-gray', await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.chat.peerId, respectType: true, threadId: this.chat.threadId}));\n\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\n const hasMentions = !!(dialog?.unread_mentions_count && dialog.unread_count);\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\n }\n }\n\n public getCurrentInputAsDraft() {\n const {value, entities} = getRichValueWithCaret(this.messageInputField.input, true, false);\n\n let draft: DraftMessage.draftMessage;\n if(value.length || this.replyToMsgId) {\n draft = {\n _: 'draftMessage',\n date: tsNow(true),\n message: value,\n entities: entities.length ? entities : undefined,\n pFlags: {\n no_webpage: this.noWebPage\n },\n reply_to_msg_id: this.replyToMsgId\n };\n }\n\n return draft;\n }\n\n public saveDraft() {\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\n const draft = this.getCurrentInputAsDraft();\n this.managers.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\n }\n\n public destroy() {\n // this.chat.log.error('Input destroying');\n\n this.listenerSetter.removeAll();\n }\n\n public cleanup(helperToo = true) {\n if(!this.chat.peerId) {\n this.chatInput.classList.add('hide');\n this.goDownBtn.classList.add('hide');\n }\n\n cancelSelection();\n\n this.lastTimeType = 0;\n this.startParam = undefined;\n\n if(this.toggleBotStartBtnDisability) {\n this.toggleBotStartBtnDisability();\n this.toggleBotStartBtnDisability = undefined;\n }\n\n if(this.messageInput) {\n this.clearInput();\n helperToo && this.clearHelper();\n }\n }\n\n public async setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\n\n if(!draft) {\n draft = await this.managers.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\n\n if(!draft) {\n if(force) { // this situation can only happen when sending message with clearDraft\n /* const height = this.chatInput.getBoundingClientRect().height;\n const willChangeHeight = 78 - height;\n this.willChangeHeight = willChangeHeight; */\n if(this.chat.container.classList.contains('is-helper-active')) {\n this.t();\n }\n\n this.messageInputField.inputFake.textContent = '';\n this.messageInputField.onFakeInput(false);\n\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\n fastRaf(() => {\n this.onMessageSent();\n });\n });\n }\n\n return false;\n }\n }\n\n const wrappedDraft = wrapDraft(draft, this.chat.peerId);\n const currentDraft = this.getCurrentInputAsDraft();\n\n if(draftsAreEqual(draft, currentDraft) &&/* this.messageInputField.value === wrappedDraft && */this.replyToMsgId === draft.reply_to_msg_id) return false;\n\n if(fromUpdate) {\n this.clearHelper();\n }\n\n this.noWebPage = draft.pFlags.no_webpage;\n if(draft.reply_to_msg_id) {\n this.initMessageReply(draft.reply_to_msg_id);\n }\n\n this.setInputValue(wrappedDraft, fromUpdate, fromUpdate);\n return true;\n }\n\n private createSendAs() {\n this.sendAsPeerId = undefined;\n\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n let firstChange = true;\n this.sendAs = new ChatSendAs(\n this.managers,\n (container, skipAnimation) => {\n let useRafs = 0;\n if(!container.parentElement) {\n this.newMessageWrapper.prepend(container);\n useRafs = 2;\n }\n\n this.updateOffset('as', true, skipAnimation, useRafs);\n },\n (sendAsPeerId) => {\n this.sendAsPeerId = sendAsPeerId;\n\n // do not change placeholder earlier than finishPeerChange does\n if(firstChange) {\n firstChange = false;\n return;\n }\n\n this.getPlaceholderKey().then((key) => {\n this.updateMessageInputPlaceholder(key);\n });\n }\n );\n } else {\n this.sendAs = undefined;\n }\n\n return this.sendAs;\n }\n\n public async finishPeerChange(startParam?: string) {\n const peerId = this.chat.peerId;\n\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput, botCommandsToggle} = this;\n\n const previousSendAs = this.sendAs;\n const sendAs = this.createSendAs();\n\n const [\n isBroadcast,\n canPinMessage,\n isBot,\n canSend,\n neededFakeContainer,\n ackedPeerFull,\n ackedScheduledMids,\n setSendAsCallback,\n filteredAttachMenuButtons\n ] = await Promise.all([\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.canPinMessage(peerId),\n this.managers.appPeersManager.isBot(peerId),\n this.chat.canSend(),\n this.getNeededFakeContainer(startParam),\n modifyAckedPromise(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId)),\n btnScheduled ? modifyAckedPromise(this.managers.acknowledged.appMessagesManager.getScheduledMessages(peerId)) : undefined,\n sendAs ? (sendAs.setPeerId(this.chat.peerId), sendAs.updateManual(true)) : undefined,\n this.filterAttachMenuButtons()\n ]);\n\n const placeholderKey = this.messageInput ? await this.getPlaceholderKey() : undefined;\n\n return () => {\n // console.warn('[input] finishpeerchange start');\n\n chatInput.classList.remove('hide');\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\n goDownBtn.classList.remove('hide');\n\n this.messageInputField?.onFakeInput();\n\n if(this.goDownUnreadBadge) {\n this.setUnreadCount();\n }\n\n if(this.chat.type === 'pinned') {\n chatInput.classList.toggle('can-pin', canPinMessage);\n }/* else if(this.chat.type === 'chat') {\n } */\n\n if(forwardElements) {\n this.forwardWasDroppingAuthor = false;\n forwardElements.showCaption.checkboxField.setValueSilently(true);\n forwardElements.showSender.checkboxField.setValueSilently(true);\n }\n\n if(btnScheduled && ackedScheduledMids) {\n btnScheduled.classList.add('hide');\n const middleware = this.chat.bubbles.getMiddleware();\n callbackify(ackedScheduledMids.result, (mids) => {\n if(!middleware() || !mids) return;\n btnScheduled.classList.toggle('hide', !mids.length);\n });\n }\n\n if(this.newMessageWrapper) {\n this.updateOffset(null, false, true);\n }\n\n if(botCommandsToggle) {\n this.hasBotCommands = undefined;\n this.botCommands.toggle(true, undefined, true);\n this.updateBotCommandsToggle(true);\n botCommandsToggle.remove();\n if(isBot) {\n const middleware = this.chat.bubbles.getMiddleware();\n const result = ackedPeerFull.result;\n callbackify(result, (userFull) => {\n if(!middleware()) return;\n this.updateBotCommands(userFull as UserFull.userFull, !(result instanceof Promise));\n });\n }\n }\n\n if(previousSendAs) {\n previousSendAs.destroy();\n }\n\n if(setSendAsCallback) {\n setSendAsCallback();\n }\n\n if(replyKeyboard) {\n replyKeyboard.setPeer(peerId);\n }\n\n if(sendMenu) {\n sendMenu.setPeerId(peerId);\n }\n\n if(this.messageInput) {\n this.updateMessageInput(canSend, placeholderKey, filteredAttachMenuButtons);\n this.messageInput.dataset.peerId = '' + peerId;\n }\n\n let haveSomethingInControl = false;\n if(this.pinnedControlBtn) {\n const good = this.chat.type === 'pinned';\n haveSomethingInControl ||= good;\n this.pinnedControlBtn.classList.toggle('hide', !good);\n this.pinnedControlBtn.replaceChildren(i18n(canPinMessage ? 'Chat.Input.UnpinAll' : 'Chat.Pinned.DontShow'));\n }\n\n {\n const good = this.chat.isForum && !this.chat.isForumTopic && this.chat.type === 'chat';\n haveSomethingInControl ||= good;\n this.replyInTopicOverlay.classList.toggle('hide', !good);\n }\n\n this.botStartBtn.classList.toggle('hide', haveSomethingInControl);\n\n // * testing\n // this.startParam = this.appPeersManager.isBot(peerId) ? '123' : undefined;\n\n this.startParam = startParam;\n\n this._center(neededFakeContainer, false);\n\n // console.warn('[input] finishpeerchange ends');\n };\n }\n\n private updateOffset(type: 'commands' | 'as', forwards: boolean, skipAnimation?: boolean, useRafs?: number) {\n if(type) {\n this.newMessageWrapper.dataset.offset = type;\n } else {\n delete this.newMessageWrapper.dataset.offset;\n }\n\n SetTransition({\n element: this.newMessageWrapper,\n className: 'has-offset',\n forwards,\n duration: skipAnimation ? 0 : 300,\n useRafs\n });\n }\n\n private updateBotCommands(userFull: UserFull.userFull, skipAnimation?: boolean) {\n this.hasBotCommands = !!userFull.bot_info?.commands?.length;\n this.updateBotCommandsToggle(skipAnimation);\n }\n\n private updateBotCommandsToggle(skipAnimation?: boolean) {\n const {botCommandsToggle, hasBotCommands} = this;\n\n const show = !!hasBotCommands && this.isInputEmpty();\n if(!hasBotCommands) {\n if(!botCommandsToggle.parentElement) {\n return;\n }\n\n botCommandsToggle.remove();\n }\n\n const forwards = show;\n const useRafs = botCommandsToggle.parentElement ? 0 : 2;\n\n if(!botCommandsToggle.parentElement) {\n this.newMessageWrapper.prepend(botCommandsToggle);\n }\n\n this.updateOffset('commands', forwards, skipAnimation, useRafs);\n }\n\n private async getPlaceholderKey() {\n const {peerId, threadId, isForum} = this.chat;\n let key: LangPackKey;\n if(threadId && !isForum) {\n key = 'Comment';\n } else if(await this.managers.appPeersManager.isBroadcast(peerId)) {\n key = 'ChannelBroadcast';\n } else if(\n (this.sendAsPeerId !== undefined && this.sendAsPeerId !== rootScope.myId) ||\n await this.managers.appMessagesManager.isAnonymousSending(peerId)\n ) {\n key = 'SendAnonymously';\n } else {\n key = 'Message';\n }\n\n return key;\n }\n\n private updateMessageInputPlaceholder(key: LangPackKey) {\n // console.warn('[input] update placeholder');\n const i = I18n.weakMap.get(this.messageInput) as I18n.IntlElement;\n if(!i) {\n return;\n }\n\n i.compareAndUpdate({key});\n }\n\n private filterAttachMenuButtons() {\n if(!this.attachMenuButtons) return;\n return filterAsync(this.attachMenuButtons, (button) => {\n return button.verify();\n });\n }\n\n public updateMessageInput(canSend: boolean, placeholderKey: LangPackKey, visible: ChatInput['attachMenuButtons']) {\n const {chatInput, attachMenu, messageInput} = this;\n const {peerId, threadId} = this.chat;\n const isHidden = chatInput.classList.contains('is-hidden');\n const willBeHidden = !canSend;\n if(isHidden !== willBeHidden) {\n chatInput.classList.add('no-transition');\n chatInput.classList.toggle('is-hidden', !canSend);\n void chatInput.offsetLeft; // reflow\n chatInput.classList.remove('no-transition');\n }\n\n this.updateMessageInputPlaceholder(placeholderKey);\n\n if(!canSend) {\n messageInput.contentEditable = 'inherit';\n } else {\n messageInput.contentEditable = 'true';\n this.setDraft(undefined, false);\n\n if(!messageInput.innerHTML) {\n this.messageInputField.onFakeInput();\n }\n }\n\n if(attachMenu) {\n attachMenu.toggleAttribute('disabled', !visible.length);\n attachMenu.classList.toggle('btn-disabled', !visible.length);\n }\n\n this.updateSendBtn();\n }\n\n private attachMessageInputField() {\n const oldInputField = this.messageInputField;\n this.messageInputField = new InputFieldAnimated({\n placeholder: 'Message',\n name: 'message',\n withLinebreaks: true\n });\n\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\n this.messageInput = this.messageInputField.input;\n this.attachMessageInputListeners();\n\n if(IS_STICKY_INPUT_BUGGED) {\n fixSafariStickyInputFocusing(this.messageInput);\n }\n\n if(oldInputField) {\n oldInputField.input.replaceWith(this.messageInputField.input);\n oldInputField.inputFake.replaceWith(this.messageInputField.inputFake);\n } else {\n this.inputMessageContainer.append(this.messageInputField.input, this.messageInputField.inputFake);\n }\n }\n\n private attachMessageInputListeners() {\n this.listenerSetter.add(this.messageInput)('keydown', (e) => {\n const key = e.key;\n\n if(isSendShortcutPressed(e)) {\n cancelEvent(e);\n this.sendMessage();\n } else if(e.ctrlKey || e.metaKey) {\n this.handleMarkdownShortcut(e);\n } else if((key === 'PageUp' || key === 'PageDown') && !e.shiftKey) { // * fix pushing page to left (Chrome Windows)\n e.preventDefault();\n\n if(key === 'PageUp') {\n const range = document.createRange();\n const sel = window.getSelection();\n\n range.setStart(this.messageInput.childNodes[0] || this.messageInput, 0);\n range.collapse(true);\n\n sel.removeAllRanges();\n sel.addRange(range);\n } else {\n placeCaretAtEnd(this.messageInput);\n }\n }\n });\n\n if(IS_TOUCH_SUPPORTED) {\n attachClickEvent(this.messageInput, (e) => {\n if(emoticonsDropdown.isActive()) {\n emoticonsDropdown.toggle(false);\n blurActiveElement();\n cancelEvent(e);\n // this.messageInput.focus();\n return;\n }\n\n this.appImManager.selectTab(APP_TABS.CHAT); // * set chat tab for album orientation\n // this.saveScroll();\n }, {listenerSetter: this.listenerSetter});\n\n /* this.listenerSetter.add(window)('resize', () => {\n this.restoreScroll();\n }); */\n\n /* if(isSafari) {\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => {\n emoticonsDropdown.toggle(false);\n });\n });\n });\n } */\n }\n\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\n // * validate due to manual formatting through browser's context menu\n const inputType = (e as InputEvent).inputType;\n //console.log('message beforeinput event', e);\n\n if(inputType.indexOf('format') === 0) {\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\n if(this.applyMarkdown(markdownType)) {\n cancelEvent(e); // * cancel legacy markdown event\n }\n }\n }); */\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\n this.listenerSetter.add(this.messageInput)('keyup', () => {\n this.checkAutocomplete();\n });\n\n this.listenerSetter.add(this.messageInput)('focusin', () => {\n if((this.chat.type === 'chat' || this.chat.type === 'discussion') &&\n this.chat.bubbles.scrollable.loadedAll.bottom) {\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\n }\n });\n }\n\n private prepareDocumentExecute = () => {\n this.executedHistory.push(this.messageInput.innerHTML);\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\n };\n\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\n cancelEvent(e); // cancel legacy event\n\n let html = this.messageInput.innerHTML;\n if(html && html !== needHTML) {\n this.lockRedo = true;\n\n let sameHTMLTimes = 0;\n do {\n document.execCommand(type, false, null);\n const currentHTML = this.messageInput.innerHTML;\n if(html === currentHTML) {\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (а может и нет, случай: заболдить подчёркнутый текст (выделить ровно его), попробовать отменить)\n break;\n }\n } else {\n sameHTMLTimes = 0;\n }\n\n html = currentHTML;\n } while(html !== needHTML);\n\n this.lockRedo = false;\n }\n };\n\n public applyMarkdown(type: MarkdownType, href?: string) {\n // const MONOSPACE_FONT = 'var(--font-monospace)';\n // const SPOILER_FONT = 'spoiler';\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\n // bold: 'Bold',\n // italic: 'Italic',\n // underline: 'Underline',\n // strikethrough: 'Strikethrough',\n // monospace: () => document.execCommand('fontName', false, MONOSPACE_FONT),\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null)\n // spoiler: () => document.execCommand('fontName', false, SPOILER_FONT)\n };\n\n const c = (type: MarkdownType) => {\n commandsMap[type] = () => {\n const k = (canCombine.includes(type) ? canCombine : [type]).filter((type) => hasMarkup[type]);\n if(!indexOfAndSplice(k, type)) {\n k.push(type);\n }\n\n if(!k.length) {\n return this.resetCurrentFontFormatting();\n } else {\n return document.execCommand('fontName', false, 'markup-' + k.join('-'));\n }\n };\n };\n\n const canCombine = ['bold', 'italic', 'underline', 'strikethrough', 'spoiler'] as (typeof type)[];\n canCombine.forEach((type) => {\n c(type);\n });\n\n c('monospace');\n\n if(!commandsMap[type]) {\n return false;\n }\n\n const command = commandsMap[type];\n\n // type = 'monospace';\n\n // const saveExecuted = this.prepareDocumentExecute();\n const executed: any[] = [];\n /**\n * * clear previous formatting, due to Telegram's inability to handle several entities\n */\n /* const checkForSingle = () => {\n const nodes = getSelectedNodes();\n //console.log('Using formatting:', commandsMap[type], nodes, this.executedHistory);\n\n const parents = [...new Set(nodes.map((node) => node.parentNode))];\n //const differentParents = !!nodes.find((node) => node.parentNode !== firstParent);\n const differentParents = parents.length > 1;\n\n let notSingle = false;\n if(differentParents) {\n notSingle = true;\n } else {\n const node = nodes[0];\n if(node && (node.parentNode as HTMLElement) !== this.messageInput && (node.parentNode.parentNode as HTMLElement) !== this.messageInput) {\n notSingle = true;\n }\n }\n\n if(notSingle) {\n //if(type === 'monospace') {\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\n //}\n\n executed.push(document.execCommand('unlink', false, null));\n executed.push(document.execCommand('removeFormat', false, null));\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n\n //if(type === 'monospace') {\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\n //}\n }\n }; */\n\n // fix applying markdown when range starts from contenteditable=\"false\"\n let textNode: Text;\n // do {\n // // const {node, offset, selection} = getCaretPosNew(this.messageInput, true);\n // const selection = document.getSelection();\n // const range = selection.getRangeAt(0);\n // const {node, offset} = getCaretPosF(this.messageInput, range.startContainer, range.startOffset);\n // // const node = range.startContainer as ChildNode;\n // if(node?.textContent === BOM || (node as HTMLElement)?.isContentEditable === false) {\n // // selection.modify('extend', 'backward', 'character');\n // textNode = document.createTextNode(BOM);\n // (node.nodeType === node.ELEMENT_NODE ? node : node.parentElement).before(textNode);\n // range.setStart(textNode, 0);\n // }/* else {\n // break;\n // } */\n\n // break;\n // } while(true);\n\n const richInputHandler = RichInputHandler.getInstance();\n const restore = richInputHandler.prepareApplyingMarkdown();\n\n const listener = this.listenerSetter.add(this.messageInput)('input', cancelEvent, {capture: true, passive: false}) as any as Listener;\n\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\n\n const hasMarkup = hasMarkupInSelection(Object.keys(commandsMap) as (typeof type)[]);\n\n // * monospace can't be combined with different types\n /* if(type === 'monospace' || type === 'spoiler') {\n // executed.push(document.execCommand('styleWithCSS', false, 'true'));\n\n const haveThisType = hasMarkup[type];\n // executed.push(document.execCommand('removeFormat', false, null));\n\n if(haveThisType) {\n executed.push(this.resetCurrentFontFormatting());\n } else {\n // if(type === 'monospace' || hasMarkup['monospace']) {\n // executed.push(this.resetCurrentFormatting());\n // }\n\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n }\n } else */{\n if(hasMarkup['monospace'] && type === 'link') {\n executed.push(this.resetCurrentFormatting());\n }\n\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n }\n\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\n\n restore();\n\n // checkForSingle();\n // saveExecuted();\n if(this.appImManager.markupTooltip) {\n this.appImManager.markupTooltip.setActiveMarkupButton();\n }\n\n if(textNode) {\n (textNode.parentElement === this.messageInput ? textNode : textNode.parentElement).remove();\n textNode.nodeValue = '';\n }\n\n this.listenerSetter.remove(listener);\n this.messageInputField.simulateInputEvent();\n\n return true;\n }\n\n private resetCurrentFormatting() {\n return document.execCommand('removeFormat', false, null);\n }\n\n private resetCurrentFontFormatting() {\n return document.execCommand('fontName', false, 'Roboto');\n }\n\n private handleMarkdownShortcut = (e: KeyboardEvent) => {\n // console.log('handleMarkdownShortcut', e);\n const formatKeys: {[key: string]: MarkdownType} = {\n 'KeyB': 'bold',\n 'KeyI': 'italic',\n 'KeyU': 'underline',\n 'KeyS': 'strikethrough',\n 'KeyM': 'monospace',\n 'KeyP': 'spoiler'\n };\n\n if(this.appImManager.markupTooltip) {\n formatKeys['KeyK'] = 'link';\n }\n\n const code = e.code;\n const applyMarkdown = formatKeys[code];\n\n const selection = document.getSelection();\n if(!isSelectionEmpty(selection) && applyMarkdown) {\n // * костыльчик\n if(code === 'KeyK') {\n this.appImManager.markupTooltip.showLinkEditor();\n } else {\n this.applyMarkdown(applyMarkdown);\n }\n\n cancelEvent(e); // cancel legacy event\n }\n\n // return;\n if(code === 'KeyZ') {\n let html = this.messageInput.innerHTML;\n\n if(e.shiftKey) {\n if(this.undoHistory.length) {\n this.executedHistory.push(html);\n html = this.undoHistory.pop();\n this.undoRedo(e, 'redo', html);\n html = this.messageInput.innerHTML;\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\n this.canUndoFromHTML = html;\n }\n } else {\n // * подождём, когда пользователь сам восстановит поле до нужного состояния, которое стало сразу после saveExecuted\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\n this.undoHistory.push(html);\n html = this.executedHistory.pop();\n this.undoRedo(e, 'undo', html);\n\n // * поставим новое состояние чтобы снова подождать, если пользователь изменит что-то, и потом попробует откатить до предыдущего состояния\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\n }\n }\n }\n };\n\n private onMessageInput = (e?: Event) => {\n // * validate due to manual formatting through browser's context menu\n /* const inputType = (e as InputEvent).inputType;\n console.log('message input event', e);\n if(inputType === 'formatBold') {\n console.log('message input format', this.messageInput.innerHTML);\n cancelEvent(e);\n }\n\n if(!isSelectionSingle()) {\n alert('not single');\n } */\n\n // console.log('messageInput input', this.messageInput.innerText);\n // const value = this.messageInput.innerText;\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\n\n // const entities = parseEntities(value);\n const value = parseMarkdown(richValue, markdownEntities, true);\n const entities = mergeEntities(markdownEntities, parseEntities(value));\n\n // this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\n\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\n this.canRedoFromHTML = '';\n this.undoHistory.length = 0;\n }\n\n const urlEntities: Array = (!this.editMessage?.media || this.editMessage.media._ === 'messageMediaWebPage') && entities.filter((e) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\n if(urlEntities.length) {\n for(const entity of urlEntities) {\n let url: string;\n if(entity._ === 'messageEntityTextUrl') {\n url = entity.url;\n } else {\n url = richValue.slice(entity.offset, entity.offset + entity.length);\n\n if(!(url.includes('http://') || url.includes('https://'))) {\n continue;\n }\n }\n\n // console.log('messageInput url:', url);\n\n if(this.lastUrl !== url) {\n this.lastUrl = url;\n // this.willSendWebPage = null;\n const promise = this.getWebPagePromise = this.managers.appWebPagesManager.getWebPage(url).then((webpage) => {\n if(this.getWebPagePromise === promise) this.getWebPagePromise = undefined;\n if(this.lastUrl !== url) return;\n if(webpage._ === 'webPage') {\n // console.log('got webpage: ', webpage);\n\n this.setTopInfo('webpage', () => {}, webpage.site_name || webpage.title || 'Webpage', webpage.description || webpage.url || '');\n delete this.noWebPage;\n this.willSendWebPage = webpage;\n } else if(this.willSendWebPage) {\n this.onHelperCancel();\n }\n });\n }\n\n break;\n }\n } else if(this.lastUrl) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n\n if(this.helperType) {\n this.helperFunc();\n } else {\n this.clearHelper();\n }\n }\n\n const isEmpty = !richValue.trim();\n if(isEmpty) {\n if(this.lastTimeType) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'}, undefined, this.chat.threadId);\n }\n\n if(this.appImManager.markupTooltip) {\n this.appImManager.markupTooltip.hide();\n }\n\n // * Chrome has a bug - it will preserve the formatting if the input with monospace text is cleared\n // * so have to reset formatting\n if(document.activeElement === this.messageInput) {\n // document.execCommand('styleWithCSS', false, 'true');\n setTimeout(() => {\n if(document.activeElement === this.messageInput) {\n this.resetCurrentFontFormatting();\n }\n }, 0);\n // document.execCommand('styleWithCSS', false, 'false');\n }\n } else {\n const time = Date.now();\n if((time - this.lastTimeType) >= 6000) {\n this.lastTimeType = time;\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'}, undefined, this.chat.threadId);\n }\n\n if(this.botCommands) {\n this.botCommands.toggle(true);\n }\n }\n\n if(this.botCommands) {\n this.updateBotCommandsToggle();\n }\n\n if(!this.editMsgId) {\n this.saveDraftDebounced();\n }\n\n this.checkAutocomplete(richValue, caretPos, entities);\n\n this.updateSendBtn();\n };\n\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\n RichInputHandler.getInstance().makeFocused(this.messageInput);\n\n const {value: fullValue, caretPos, entities} = getRichValueWithCaret(this.messageInput);\n const pos = caretPos >= 0 ? caretPos : fullValue.length;\n const prefix = fullValue.substr(0, pos);\n const suffix = fullValue.substr(pos);\n\n const matches = isHelper ? prefix.match(ChatInput.AUTO_COMPLETE_REG_EXP) : null;\n\n const matchIndex = matches ? matches.index + (matches[0].length - matches[2].length) : prefix.length;\n const newPrefix = prefix.slice(0, matchIndex);\n const newValue = newPrefix + insertText + suffix;\n\n if(isHelper && caretPos !== -1) {\n const match = matches[2];\n // const {node, selection} = getCaretPosNew(this.messageInput);\n\n const selection = document.getSelection();\n // const range = document.createRange();\n let counter = 0;\n while(selection.toString() !== match) {\n if(++counter >= 10000) {\n throw new Error('lolwhat');\n }\n\n // for(let i = 0; i < match.length; ++i) {\n selection.modify('extend', 'backward', 'character');\n }\n }\n\n {\n // const fragment = wrapDraftText(insertText, {entities: insertEntity ? [insertEntity] : undefined, wrappingForPeerId: this.chat.peerId});\n insertRichTextAsHTML(this.messageInput, insertText, insertEntity ? [insertEntity] : undefined, this.chat.peerId);\n // const {node, offset} = getCaretPos(this.messageInput);\n // const fragmentLastChild = fragment.lastChild;\n // if(node?.nodeType === node.TEXT_NODE) {\n // const prefix = node.nodeValue.slice(0, offset);\n // const suffix = node.nodeValue.slice(offset);\n\n // const suffixNode = document.createTextNode(suffix);\n\n // node.nodeValue = prefix;\n // node.parentNode.insertBefore(suffixNode, node.nextSibling);\n // node.parentNode.insertBefore(fragment, suffixNode);\n\n // setCaretAt(fragmentLastChild.nextSibling);\n\n // this.messageInputField.simulateInputEvent();\n // }\n }\n return;\n\n // merge emojis\n const hadEntities = parseEntities(fullValue);\n mergeEntities(entities, hadEntities);\n\n // max for additional whitespace\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\n const addEntities: MessageEntity[] = [];\n if(insertEntity) {\n addEntities.push(insertEntity);\n insertEntity.offset = matchIndex;\n }\n\n // add offset to entities next to emoji\n const diff = matches ? insertLength - matches[2].length : insertLength;\n entities.forEach((entity) => {\n if(entity.offset >= matchIndex) {\n entity.offset += diff;\n }\n });\n\n mergeEntities(entities, addEntities);\n\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\n const caretEntity: MessageEntity.messageEntityCaret = {\n _: 'messageEntityCaret',\n offset: matchIndex + insertLength,\n length: 0\n };\n\n let insertCaretAtIndex = 0;\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\n const entity = entities[insertCaretAtIndex];\n if(entity.offset > caretEntity.offset) {\n break;\n }\n }\n\n entities.splice(insertCaretAtIndex, 0, caretEntity);\n }\n\n // const saveExecuted = this.prepareDocumentExecute();\n // can't exec .value here because it will instantly check for autocomplete\n const value = documentFragmentToHTML(wrapDraftText(newValue, {entities}));\n this.messageInputField.setValueSilently(value);\n\n const caret = this.messageInput.querySelector('.composer-sel');\n if(caret) {\n setCaretAt(caret);\n caret.remove();\n }\n\n // but it's needed to be checked only here\n this.onMessageInput();\n\n // saveExecuted();\n\n // document.execCommand('insertHTML', true, wrapEmojiText(emoji));\n }\n\n public onEmojiSelected = (emoji: ReturnType, autocomplete: boolean) => {\n const entity: MessageEntity = emoji.docId ? {_: 'messageEntityCustomEmoji', document_id: emoji.docId, length: emoji.emoji.length, offset: 0} : getEmojiEntityFromEmoji(emoji.emoji);\n this.insertAtCaret(emoji.emoji, entity, autocomplete);\n };\n\n private async checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\n // return;\n\n if(value === undefined) {\n const r = getRichValueWithCaret(this.messageInputField.input, true, true);\n value = r.value;\n caretPos = r.caretPos;\n entities = r.entities;\n }\n\n if(caretPos === -1) {\n caretPos = value.length;\n }\n\n if(entities === undefined) {\n const _value = parseMarkdown(value, entities, true);\n entities = mergeEntities(entities, parseEntities(_value));\n }\n\n value = value.slice(0, caretPos);\n\n if(this.previousQuery === value) {\n return;\n }\n\n this.previousQuery = value;\n\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\n let foundHelper: AutocompleteHelper;\n if(matches) {\n const entity = entities[0];\n\n let query = matches[2];\n const firstChar = query[0];\n\n if(this.stickersHelper &&\n rootScope.settings.stickers.suggest &&\n await this.chat.canSend('send_stickers') &&\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\n foundHelper = this.stickersHelper;\n this.stickersHelper.checkEmoticon(value);\n } else if(firstChar === '@') { // mentions\n const topMsgId = this.chat.threadId ? getServerMessageId(this.chat.threadId) : undefined;\n if(await this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\n foundHelper = this.mentionsHelper;\n }\n } else if(!matches[1] && firstChar === '/') { // commands\n if(await this.commandsHelper.checkQuery(query, this.chat.peerId)) {\n foundHelper = this.commandsHelper;\n }\n } else if(rootScope.settings.emoji.suggest) { // emoji\n query = query.replace(/^\\s*/, '');\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\n foundHelper = this.emojiHelper;\n this.emojiHelper.checkQuery(query, firstChar);\n }\n }\n }\n\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\n\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\n }\n\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\n let needPlaceholder = false;\n\n const setPreloaderShow = (show: boolean) => {\n if(!this.btnPreloader) {\n return;\n }\n\n SetTransition({\n element: this.btnPreloader,\n className: 'show',\n forwards: show,\n duration: 400\n });\n };\n\n if(!foundHelper) {\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\n if(inlineMatch) {\n const username = inlineMatch[1];\n const query = value.slice(inlineMatch[0].length);\n needPlaceholder = inlineMatch[0].length === value.length;\n\n foundHelper = this.inlineHelper;\n\n if(!this.btnPreloader) {\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\n putPreloader(this.btnPreloader, true);\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\n } else {\n setPreloaderShow(true);\n }\n\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\n if(needPlaceholder && user.bot_inline_placeholder) {\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\n }\n\n renderPromise.then(() => {\n setPreloaderShow(false);\n });\n }).catch((err: ApiError) => {\n setPreloaderShow(false);\n });\n }\n }\n\n if(!needPlaceholder) {\n delete this.messageInput.dataset.inlinePlaceholder;\n }\n\n if(foundHelper !== this.inlineHelper) {\n setPreloaderShow(false);\n }\n\n return foundHelper;\n }\n\n private setRecording(value: boolean) {\n if(this.recording === value) {\n return;\n }\n\n SetTransition({\n element: this.chatInput,\n className: 'is-recording',\n forwards: value,\n duration: 200\n });\n this.recording = value;\n this.updateSendBtn();\n }\n\n private onBtnSendClick = async(e: Event) => {\n cancelEvent(e);\n\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\n if(this.recording) {\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\n this.onCancelRecordClick();\n } else {\n this.recorder.stop();\n }\n } else {\n this.sendMessage();\n }\n } else {\n const isAnyChat = this.chat.peerId.isAnyChat();\n if(isAnyChat && !(await this.chat.canSend('send_media'))) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n return;\n }\n\n this.chatInput.classList.add('is-locked');\n blurActiveElement();\n\n let restricted = false;\n if(!isAnyChat) {\n const userFull = await this.managers.appProfileManager.getProfile(this.chat.peerId.toUserId());\n if(userFull?.pFlags.voice_messages_forbidden) {\n toastNew({\n langPackKey: 'Chat.SendVoice.PrivacyError',\n langPackArguments: [await wrapPeerTitle({peerId: this.chat.peerId})]\n });\n restricted = true;\n }\n }\n\n if(restricted) {\n this.chatInput.classList.remove('is-locked');\n return;\n }\n\n this.recorder.start().then(() => {\n this.releaseMediaPlayback = appMediaPlaybackController.setSingleMedia();\n this.recordCanceled = false;\n\n this.setRecording(true);\n opusDecodeController.setKeepAlive(true);\n\n const showDiscardPopup = () => {\n new PopupPeer('popup-cancel-record', {\n titleLangKey: 'DiscardVoiceMessageTitle',\n descriptionLangKey: 'DiscardVoiceMessageDescription',\n buttons: [{\n langKey: 'DiscardVoiceMessageAction',\n callback: () => {\n simulateClickEvent(this.btnCancelRecord);\n }\n }, {\n langKey: 'Continue',\n isCancel: true\n }]\n }).show();\n };\n\n this.recordingOverlayListener = this.listenerSetter.add(document.body)('mousedown', (e) => {\n if(!findUpClassName(e.target, 'chat-input') && !findUpClassName(e.target, 'popup-cancel-record')) {\n cancelEvent(e);\n showDiscardPopup();\n }\n }, {capture: true, passive: false}) as any;\n\n appNavigationController.pushItem(this.recordingNavigationItem = {\n type: 'voice',\n onPop: () => {\n setTimeout(() => {\n showDiscardPopup();\n }, 0);\n\n return false;\n }\n });\n\n this.recordStartTime = Date.now();\n\n const sourceNode: MediaStreamAudioSourceNode = this.recorder.sourceNode;\n const context = sourceNode.context;\n\n const analyser = context.createAnalyser();\n sourceNode.connect(analyser);\n // analyser.connect(context.destination);\n analyser.fftSize = 32;\n\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\n const max = frequencyData.length * 255;\n const min = 54 / 150;\n const r = () => {\n if(!this.recording) return;\n\n analyser.getByteFrequencyData(frequencyData);\n\n let sum = 0;\n frequencyData.forEach((value) => {\n sum += value;\n });\n\n const percents = Math.min(1, (sum / max) + min);\n // console.log('frequencyData', frequencyData, percents);\n\n this.recordRippleEl.style.transform = `scale(${percents})`;\n\n const diff = Date.now() - this.recordStartTime;\n const ms = diff % 1000;\n\n const formatted = toHHMMSS(diff / 1000) + ',' + ('00' + Math.round(ms / 10)).slice(-2);\n\n this.recordTimeEl.innerText = formatted;\n\n fastRaf(r);\n };\n\n r();\n }).catch((e: Error) => {\n switch(e.name as string) {\n case 'NotAllowedError': {\n toast('Please allow access to your microphone');\n break;\n }\n\n case 'NotReadableError': {\n toast(e.message);\n break;\n }\n\n default:\n console.error('Recorder start error:', e, e.name, e.message);\n toast(e.message);\n break;\n }\n\n this.setRecording(false);\n this.chatInput.classList.remove('is-locked');\n });\n }\n };\n\n private onHelperCancel = async(e?: Event, force?: boolean) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.willSendWebPage) {\n const lastUrl = this.lastUrl;\n let needReturn = false;\n if(this.helperType) {\n // if(this.helperFunc) {\n await this.helperFunc();\n // }\n\n needReturn = true;\n }\n\n // * restore values\n this.lastUrl = lastUrl;\n this.noWebPage = true;\n this.willSendWebPage = null;\n\n if(needReturn) return;\n }\n\n if(this.helperType === 'edit' && !force) {\n const message = this.editMessage;\n const draft = this.getCurrentInputAsDraft();\n if(draft) {\n delete draft.pFlags.no_webpage;\n }\n // const value = parseMarkdown(this.messageInputField.value, []);\n // if(message.message !== value) {\n if(!draftsAreEqual(draft, {...message, _: 'draftMessage'} as any)) {\n new PopupPeer('discard-editing', {\n buttons: [{\n langKey: 'Alert.Confirm.Discard',\n callback: () => {\n this.onHelperCancel(undefined, true);\n }\n }],\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\n }).show();\n\n return;\n }\n }\n\n this.clearHelper();\n this.updateSendBtn();\n };\n\n private onHelperClick = (e: Event) => {\n cancelEvent(e);\n\n if(!findUpClassName(e.target, 'reply')) return;\n if(this.helperType === 'forward') {\n const {forwardElements} = this;\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\n contextMenuController.openBtnMenu(forwardElements.container);\n }\n } else if(this.helperType === 'reply') {\n this.chat.setMessageId(this.replyToMsgId);\n } else if(this.helperType === 'edit') {\n this.chat.setMessageId(this.editMsgId);\n }\n };\n\n private changeForwardRecipient() {\n if(this.helperWaitingForward) return;\n this.helperWaitingForward = true;\n\n const forwarding = copy(this.forwarding);\n const helperFunc = this.helperFunc;\n this.clearHelper();\n this.updateSendBtn();\n let selected = false;\n const popup = new PopupForward(forwarding, () => {\n selected = true;\n });\n\n popup.addEventListener('close', () => {\n this.helperWaitingForward = false;\n\n if(!selected) {\n helperFunc();\n }\n });\n }\n\n public async clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\n const i = document.createElement('input');\n document.body.append(i);\n fixSafariStickyInput(i);\n this.messageInputField.setValueSilently(clearValue);\n fixSafariStickyInput(this.messageInput);\n i.remove();\n } else {\n this.messageInputField.setValueSilently(clearValue);\n }\n\n if(IS_TOUCH_SUPPORTED) {\n // this.messageInput.innerText = '';\n } else {\n // this.attachMessageInputField();\n // this.messageInput.innerText = '';\n\n // clear executions\n this.canRedoFromHTML = '';\n this.undoHistory.length = 0;\n this.executedHistory.length = 0;\n this.canUndoFromHTML = '';\n }\n\n let set = false;\n if(canSetDraft) {\n set = await this.setDraft(undefined, false);\n }\n\n if(!set && fireEvent) {\n this.onMessageInput();\n }\n }\n\n public isInputEmpty() {\n return isInputEmpty(this.messageInput);\n }\n\n public updateSendBtn() {\n let icon: 'send' | 'record' | 'edit' | 'schedule';\n\n const isInputEmpty = this.isInputEmpty();\n\n if(this.editMsgId) icon = 'edit';\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\n else icon = 'record';\n\n ['send', 'record', 'edit', 'schedule'].forEach((i) => {\n this.btnSend.classList.toggle(i, icon === i);\n });\n\n if(this.btnScheduled) {\n this.btnScheduled.classList.toggle('show', isInputEmpty && this.chat.type !== 'scheduled');\n }\n\n if(this.btnToggleReplyMarkup) {\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty && this.chat.type !== 'scheduled');\n }\n }\n\n private getValueAndEntities(input: HTMLElement) {\n const {entities: apiEntities, value} = getRichValueWithCaret(this.messageInput, true, false);\n const myEntities = parseEntities(value);\n const totalEntities = mergeEntities(apiEntities, myEntities);\n\n return {value, totalEntities};\n }\n\n public onMessageSent(clearInput = true, clearReply?: boolean) {\n if(this.chat.type !== 'scheduled') {\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\n }\n\n this.scheduleDate = undefined;\n this.sendSilent = undefined;\n\n const {totalEntities} = this.getValueAndEntities(this.messageInput);\n let nextOffset = 0;\n const emojiEntities: (MessageEntity.messageEntityEmoji | MessageEntity.messageEntityCustomEmoji)[] = totalEntities.filter((entity) => {\n if(entity._ === 'messageEntityEmoji' || entity._ === 'messageEntityCustomEmoji') {\n const endOffset = entity.offset + entity.length;\n return endOffset <= nextOffset ? false : (nextOffset = endOffset, true);\n }\n\n return false;\n }) as any;\n emojiEntities.forEach((entity) => {\n const emoji: AppEmoji = entity._ === 'messageEntityEmoji' ? {emoji: emojiFromCodePoints(entity.unicode)} : {docId: entity.document_id, emoji: ''};\n this.managers.appEmojiManager.pushRecentEmoji(emoji);\n });\n\n if(clearInput) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n this.clearInput();\n }\n\n if(clearReply || clearInput) {\n this.clearHelper();\n }\n\n this.updateSendBtn();\n }\n\n public sendMessage(force = false) {\n const {editMsgId, chat} = this;\n if(chat.type === 'scheduled' && !force && !editMsgId) {\n this.scheduleSending();\n return;\n }\n\n const {peerId} = chat;\n const {noWebPage} = this;\n const sendingParams = this.chat.getMessageSendingParams();\n\n const {value, entities} = getRichValueWithCaret(this.messageInputField.input, true, false);\n\n // return;\n if(editMsgId) {\n const message = this.editMessage;\n if(value.trim() || message.media) {\n this.managers.appMessagesManager.editMessage(message, value, {\n entities,\n noWebPage: noWebPage\n });\n\n this.onMessageSent();\n } else {\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\n\n return;\n }\n } else if(value.trim()) {\n this.managers.appMessagesManager.sendText(peerId, value, {\n entities,\n ...sendingParams,\n noWebPage: noWebPage,\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\n clearDraft: true\n });\n\n if(this.chat.type === 'scheduled') {\n this.onMessageSent(true);\n } else {\n this.onMessageSent(false, false);\n }\n // this.onMessageSent();\n }\n\n // * wait for sendText set messageId for invokeAfterMsg\n if(this.forwarding) {\n const forwarding = copy(this.forwarding);\n // setTimeout(() => {\n for(const fromPeerId in forwarding) {\n this.managers.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\n ...sendingParams,\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\n dropCaptions: this.isDroppingCaptions()\n }).catch(async(err: ApiError) => {\n if(err.type === 'VOICE_MESSAGES_FORBIDDEN') {\n toastNew({\n langPackKey: 'Chat.SendVoice.PrivacyError',\n langPackArguments: [await wrapPeerTitle({peerId})]\n });\n }\n });\n }\n\n if(!value) {\n this.onMessageSent();\n }\n // }, 0);\n }\n\n // this.onMessageSent();\n }\n\n public async sendMessageWithDocument(\n document: MyDocument | DocId,\n force = false,\n clearDraft = false,\n silent = false\n ) {\n document = await this.managers.appDocsManager.getDoc(document);\n\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\n if(this.chat.peerId.isAnyChat() && !(await this.chat.canSend(flag))) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n return false;\n }\n\n if(this.chat.type === 'scheduled' && !force) {\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft, silent));\n return false;\n }\n\n if(!document) {\n return false;\n }\n\n if(document.sticker && getStickerEffectThumb(document) && !rootScope.premium) {\n return false;\n }\n\n this.managers.appMessagesManager.sendFile(this.chat.peerId, {\n ...this.chat.getMessageSendingParams(),\n file: document,\n isMedia: true,\n clearDraft,\n silent\n });\n this.onMessageSent(clearDraft, true);\n\n if(document.type === 'sticker') {\n this.managers.appStickersManager.saveRecentSticker(document.id);\n }\n\n return true;\n }\n\n private canToggleHideAuthor() {\n const {forwardElements} = this;\n if(!forwardElements) return false;\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\n return !hideCaptionCheckboxField.checked ||\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\n }\n\n private isDroppingCaptions() {\n return !this.canToggleHideAuthor();\n }\n\n /* public sendSomething(callback: () => void, force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.scheduleSending(() => this.sendSomething(callback, true));\n return false;\n }\n\n callback();\n this.onMessageSent(false, true);\n\n return true;\n } */\n\n public async initMessageEditing(mid: number) {\n const message = (await this.chat.getMessage(mid)) as Message.message;\n\n let input = wrapDraftText(message.message, {entities: message.totalEntities, wrappingForPeerId: this.chat.peerId});\n const f = async() => {\n const replyFragment = await wrapMessageForReply({message, usingMids: [message.mid]});\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\n\n this.editMsgId = mid;\n this.editMessage = message;\n input = undefined;\n };\n f();\n }\n\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\n const f = async() => {\n // const peerTitles: string[]\n const fromPeerIds = Object.keys(fromPeerIdsMids).map((fromPeerId) => fromPeerId.toPeerId());\n const smth: Set = new Set();\n let length = 0, messagesWithCaptionsLength = 0;\n\n const p = fromPeerIds.map(async(fromPeerId) => {\n const mids = fromPeerIdsMids[fromPeerId];\n const promises = mids.map(async(mid) => {\n const message = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mid)) as Message.message;\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\n smth.add('N' + message.fwd_from.from_name);\n } else {\n smth.add('P' + message.fromId);\n }\n\n if(message.media && message.message) {\n ++messagesWithCaptionsLength;\n }\n });\n\n await Promise.all(promises);\n\n length += mids.length;\n });\n\n await Promise.all(p);\n\n const onlyFirstName = smth.size > 2;\n const peerTitles = [...smth].map((smth) => {\n const type = smth[0];\n smth = smth.slice(1);\n if(type === 'P') {\n const peerId = smth.toPeerId();\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\n } else {\n return onlyFirstName ? smth.split(' ')[0] : smth;\n }\n });\n\n const {forwardElements} = this;\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\n form.classList.toggle('hide', !messagesWithCaptionsLength);\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\n if(messagesWithCaptionsLength && hideCaption) {\n forwardElements.hideSender.checkboxField.setValueSilently(true);\n } else if(this.forwardWasDroppingAuthor !== undefined) {\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\n }\n\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\n const title = i18n(titleKey, [length]);\n\n const senderTitles = document.createDocumentFragment();\n if(peerTitles.length < 3) {\n senderTitles.append(...join(peerTitles, false));\n } else {\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\n }\n\n let firstMessage: Message.message, usingFullAlbum: boolean;\n if(fromPeerIds.length === 1) {\n const fromPeerId = fromPeerIds[0];\n const mids = fromPeerIdsMids[fromPeerId];\n firstMessage = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mids[0])) as Message.message;\n\n usingFullAlbum = !!firstMessage.grouped_id;\n if(usingFullAlbum) {\n const albumMids = await this.managers.appMessagesManager.getMidsByMessage(firstMessage);\n if(albumMids.length !== length || albumMids.find((mid) => !mids.includes(mid))) {\n usingFullAlbum = false;\n }\n }\n }\n\n const subtitleFragment = document.createDocumentFragment();\n const delimiter = ': ';\n if(usingFullAlbum || length === 1) {\n const mids = fromPeerIdsMids[fromPeerIds[0]];\n const replyFragment = await wrapMessageForReply({message: firstMessage, usingMids: mids});\n subtitleFragment.append(\n senderTitles,\n delimiter,\n replyFragment\n );\n } else {\n subtitleFragment.append(\n i18n('Chat.Accessory.Forward.From'),\n delimiter,\n senderTitles\n );\n }\n\n const newReply = this.setTopInfo('forward', f, title, subtitleFragment);\n\n forwardElements.modifyArgs.forEach((b, idx) => {\n const text = b.textElement;\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\n intl.update();\n });\n\n if(this.forwardHover) {\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\n }\n\n this.forwarding = fromPeerIdsMids;\n };\n\n f();\n }\n\n public async initMessageReply(mid: number) {\n if(this.replyToMsgId === mid) {\n return;\n }\n\n let message = await this.chat.getMessage(mid);\n const f = () => {\n let peerTitleEl: HTMLElement;\n if(!message) { // load missing replying message\n peerTitleEl = i18n('Loading');\n\n this.managers.appMessagesManager.reloadMessages(this.chat.peerId, mid).then((_message) => {\n if(this.replyToMsgId !== mid) {\n return;\n }\n\n message = _message;\n if(!message) {\n this.clearHelper('reply');\n } else {\n f();\n }\n });\n } else {\n peerTitleEl = new PeerTitle({\n peerId: message.fromId,\n dialog: false\n }).element;\n }\n\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\n this.setReplyToMsgId(mid)\n };\n f();\n }\n\n public setReplyToMsgId(mid: number) {\n this.replyToMsgId = mid;\n this.center(true);\n }\n\n public clearHelper(type?: ChatInputHelperType) {\n if(this.helperType === 'edit' && type !== 'edit') {\n this.clearInput();\n }\n\n if(type) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n }\n\n if(type !== 'reply') {\n this.setReplyToMsgId(undefined);\n this.forwarding = undefined;\n }\n\n this.editMsgId = this.editMessage = undefined;\n this.helperType = this.helperFunc = undefined;\n\n if(this.chat.container.classList.contains('is-helper-active')) {\n appNavigationController.removeByType('input-helper');\n this.chat.container.classList.remove('is-helper-active');\n this.t();\n }\n }\n\n private t() {\n const className = 'is-toggling-helper';\n SetTransition({\n element: this.chat.container,\n className,\n forwards: true,\n duration: 150,\n onTransitionEnd: () => {\n this.chat.container.classList.remove(className);\n }\n });\n }\n\n public setInputValue(value: Parameters[0], clear = true, focus = true) {\n if(!value) value = '';\n\n if(clear) this.clearInput(false, false, value as string);\n else this.messageInputField.setValueSilently(value);\n\n fastRaf(() => {\n focus && placeCaretAtEnd(this.messageInput);\n this.onMessageInput();\n this.messageInput.scrollTop = this.messageInput.scrollHeight;\n });\n }\n\n public setTopInfo(\n type: ChatInputHelperType,\n callerFunc: () => void,\n title: Parameters[0] = '',\n subtitle: Parameters[1] = '',\n input?: Parameters[0],\n message?: any\n ) {\n if(this.willSendWebPage && type === 'reply') {\n return;\n }\n\n if(type !== 'webpage') {\n this.clearHelper(type);\n this.helperType = type;\n this.helperFunc = callerFunc;\n }\n\n const replyParent = this.replyElements.container;\n const oldReply = replyParent.lastElementChild.previousElementSibling;\n const haveReply = oldReply.classList.contains('reply');\n\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\n const {container} = wrapReply(title, subtitle, this.chat.animationGroup, message);\n if(haveReply) {\n oldReply.replaceWith(container);\n } else {\n replyParent.insertBefore(container, replyParent.lastElementChild);\n }\n\n if(type === 'webpage') {\n container.style.cursor = 'default';\n }\n\n if(!this.chat.container.classList.contains('is-helper-active')) {\n this.chat.container.classList.add('is-helper-active');\n this.t();\n }\n\n /* const scroll = appImManager.scrollable;\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\n } */\n\n if(!IS_MOBILE) {\n appNavigationController.pushItem({\n type: 'input-helper',\n onPop: () => {\n this.onHelperCancel();\n }\n });\n }\n\n if(input !== undefined) {\n this.setInputValue(input);\n }\n\n setTimeout(() => {\n this.updateSendBtn();\n }, 0);\n\n return container;\n }\n\n // public saveScroll() {\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\n // this.scrollOffsetTop = this.chatInput.offsetTop;\n // }\n\n // public restoreScroll() {\n // if(this.chatInput.style.display) return;\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\n // let newOffsetTop = this.chatInput.offsetTop;\n // let container = this.chat.bubbles.scrollable.container;\n // let scrollTop = container.scrollTop;\n // let clientHeight = container.clientHeight;\n // let maxScrollTop = container.scrollHeight;\n\n // if(newOffsetTop < this.scrollOffsetTop) {\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\n // container.scrollTop += this.scrollDiff;\n // } else if(scrollTop !== this.scrollTop) {\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\n // if(endDiff < this.scrollDiff/* && false */) {\n // //container.scrollTop -= endDiff;\n // } else {\n // container.scrollTop -= this.scrollDiff;\n // }\n // }\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {DraftMessage} from '../../layer';\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\n\nexport default function wrapDraft(draft: DraftMessage.draftMessage, wrappingForPeerId: PeerId, loadPromises?: Promise[]) {\n const myEntities = parseEntities(draft.message);\n const apiEntities = draft.entities || [];\n const totalEntities = mergeEntities(apiEntities.slice(), myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n\n return wrapDraftText(draft.message, {entities: totalEntities, wrappingForPeerId, loadPromises});\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from './chat';\nimport type ChatTopbar from './topbar';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport DivAndCaption from '../divAndCaption';\nimport ripple from '../ripple';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {Message} from '../../layer';\nimport safeAssign from '../../helpers/object/safeAssign';\n\nconst classNames: string[] = ['is-pinned-message-shown', 'is-pinned-audio-shown'];\nconst CLASSNAME_BASE = 'pinned-container';\nconst HEIGHT = 52;\n\nexport default class PinnedContainer {\n public wrapperUtils: HTMLElement;\n public btnClose: HTMLElement;\n protected wrapper: HTMLElement;\n\n protected topbar: ChatTopbar;\n protected chat: Chat;\n protected listenerSetter: ListenerSetter;\n public className: string;\n public divAndCaption: DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void>;\n\n protected floating = false;\n\n public onClose?: () => void | Promise;\n\n constructor(options: {\n topbar: PinnedContainer['topbar'],\n chat: PinnedContainer['chat'],\n listenerSetter: PinnedContainer['listenerSetter'],\n className: PinnedContainer['className'],\n divAndCaption: PinnedContainer['divAndCaption'],\n onClose?: PinnedContainer['onClose'],\n floating?: PinnedContainer['floating']\n }) {\n safeAssign(this, options);\n\n const {divAndCaption, className} = this;\n divAndCaption.container.classList.add(CLASSNAME_BASE, 'hide');\n divAndCaption.title.classList.add(CLASSNAME_BASE + '-title');\n divAndCaption.subtitle.classList.add(CLASSNAME_BASE + '-subtitle');\n divAndCaption.content.classList.add(CLASSNAME_BASE + '-content');\n\n this.btnClose = document.createElement('button');\n this.btnClose.classList.add(CLASSNAME_BASE + '-close', `pinned-${className}-close`, 'btn-icon', 'tgico-close');\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add(CLASSNAME_BASE + '-wrapper');\n ripple(this.wrapper);\n\n this.wrapperUtils = document.createElement('div');\n this.wrapperUtils.classList.add(CLASSNAME_BASE + '-wrapper-utils');\n this.wrapperUtils.append(this.btnClose);\n\n this.wrapper.append(...Array.from(divAndCaption.container.children), this.wrapperUtils);\n\n divAndCaption.container.append(this.wrapper/* , this.close */);\n\n this.attachOnCloseEvent(this.btnClose);\n }\n\n public attachOnCloseEvent(elem: HTMLElement) {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n\n ((this.onClose ? this.onClose() : null) || Promise.resolve(true)).then((needClose) => {\n if(needClose) {\n this.toggle(true);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n }\n\n public toggle(hide?: boolean) {\n const isHidden = this.divAndCaption.container.classList.contains('hide');\n if(hide === undefined) {\n hide = !isHidden;\n } else if(hide === isHidden) {\n return;\n }\n\n // const scrollable = this.chat.bubbles.scrollable;\n\n const isFloating = (this.floating || mediaSizes.isMobile) && !hide;\n // const scrollTop = isFloating || this.divAndCaption.container.classList.contains('is-floating') ? scrollable.scrollTop : undefined;\n\n this.divAndCaption.container.classList.toggle('is-floating', isFloating);\n this.divAndCaption.container.classList.toggle('hide', hide);\n\n this.topbar.container.classList.toggle('is-pinned-floating', isFloating);\n this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`, !hide);\n\n // const active = classNames.filter((className) => this.topbar.container.classList.contains(className));\n // const maxActive = hide ? 0 : 1;\n\n // * not sure when it became unneeded\n // if(scrollTop !== undefined && active.length <= maxActive/* && !scrollable.isScrolledDown */) {\n // scrollable.scrollTop = scrollTop + ((hide ? -1 : 1) * HEIGHT);\n // }\n\n this.topbar.setFloating();\n this.topbar.setUtilsWidth();\n }\n\n public isVisible() {\n return !this.divAndCaption.container.classList.contains('hide');\n }\n\n public isFloating() {\n return this.divAndCaption.container.classList.contains('is-floating');\n }\n\n public fill(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message: Message.message) {\n this.divAndCaption.container.dataset.peerId = '' + message.peerId;\n this.divAndCaption.container.dataset.mid = '' + message.mid;\n this.divAndCaption.fill(title, subtitle, message);\n this.topbar.setUtilsWidth();\n }\n}\n","// https://github.com/evgeny-nadymov/telegram-react/blob/master/src/Components/ColumnMiddle/PinnedMessageBorder.js\n\nenum BAR_HEIGHTS {\n ONE = 32,\n TWO = 15,\n THREE = 10,\n FOUR = 8,\n MORE = 8\n};\n\nconst GAP = 1;\nconst WIDTH = 2;\nconst BASE_CLASS = 'pinned-message-border';\n\nexport default class PinnedMessageBorder {\n private border: HTMLElement;\n private wrapper: HTMLElement;\n private svg: SVGSVGElement;\n private defs: SVGDefsElement;\n private clipPath: SVGClipPathElement;\n private path: SVGPathElement;\n private mark: HTMLElement;\n\n private count: number;\n private index: number;\n\n private drawRect = (x: number, y: number, width: number, height: number, radius: number) => {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n };\n\n private getClipPath = (id: string, barHeight: number, count: number) => {\n const radius = 1;\n\n let d = '';\n /* if(count === 3) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius)\n + this.drawRect(0, barHeight + GAP, WIDTH, barHeight + 1, radius)\n + this.drawRect(0, barHeight * 2 + GAP * 2 + 1, WIDTH, barHeight, radius);\n } */if(count === 2) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius) + this.drawRect(0, barHeight + GAP * 2, WIDTH, barHeight, radius);\n } else {\n for(let i = 0; i < count; ++i) {\n d += this.drawRect(0, (barHeight + GAP) * i, WIDTH, barHeight, radius);\n }\n }\n\n if(!this.clipPath) {\n this.clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\n this.clipPath.append(this.path);\n }\n\n this.clipPath.id = id;\n this.path.setAttributeNS(null, 'd', d);\n\n return this.clipPath;\n };\n\n private getBarHeight = (count: number, index: number) => {\n let barHeight: number;\n if(count <= 1) {\n barHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n barHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n barHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n barHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n barHeight = BAR_HEIGHTS.MORE;\n }\n\n return barHeight;\n };\n\n private getMarkHeight = (count: number, index: number) => {\n let markHeight: number;\n if(count <= 1) {\n markHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n markHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n markHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n markHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n markHeight = BAR_HEIGHTS.MORE;\n }\n\n return markHeight;\n };\n\n private getMarkTranslateY = (index: number, barHeight: number, count: number) => {\n if(count === 1) {\n return 0;\n } else if(count === 2) {\n return !index ? 0 : barHeight + GAP;\n }\n\n if(count === 3) {\n if(!index) {\n return 0;\n } else if(index === 1) {\n return barHeight + GAP;\n }\n\n return barHeight * 2 + GAP * 2 + 1;\n } else {\n return (barHeight + GAP) * index;\n }\n };\n\n private 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 - BAR_HEIGHTS.ONE - barHeight;\n }\n\n // return (index + 1) * barHeight + index * GAP;\n return (index - 2) * barHeight + index * GAP;\n // return (barHeight + GAP * 2) / 2 + (index - 2) * (barHeight + GAP);\n };\n\n private getTrackHeight = (count: number, barHeight: number) => {\n return count <= 3 ? BAR_HEIGHTS.ONE : barHeight * count + GAP * (count - 1);\n };\n\n public render(count: number, index: number) {\n if(!this.border) {\n this.border = document.createElement('div');\n this.border.classList.add(BASE_CLASS);\n\n this.wrapper = document.createElement('div');\n this.border.append(this.wrapper);\n }\n\n if(count === 1) {\n if(this.count !== count) {\n this.wrapper.className = BASE_CLASS + '-wrapper-1';\n this.border.classList.remove(BASE_CLASS + '-mask');\n this.wrapper.innerHTML = this.wrapper.style.cssText = '';\n }\n\n return this.border;\n }\n\n const barHeight = this.getBarHeight(count, index);\n const markHeight = this.getMarkHeight(count, index);\n const trackHeight = this.getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath_${count}`;\n const clipPath = this.getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = this.getMarkTranslateY(index, barHeight, count);\n const trackTranslateY = this.getTrackTranslateY(index, count, barHeight, trackHeight);\n\n this.border.classList.toggle(BASE_CLASS + '-mask', count > 4);\n\n if(index <= 1) {\n this.border.classList.add('mask-bottom');\n this.border.classList.remove('mask-top');\n } else if(index >= (count - 2)) {\n this.border.classList.add('mask-top');\n this.border.classList.remove('mask-bottom');\n } else {\n this.border.classList.add('mask-top', 'mask-bottom');\n }\n\n this.wrapper.className = BASE_CLASS + '-wrapper';\n this.wrapper.style.cssText = `clip-path: url(#${clipPathId}); width: 2px; height: ${trackHeight}px; transform: translateY(-${trackTranslateY}px);`;\n\n if(!this.svg) {\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.setAttributeNS(null, 'height', '0');\n this.svg.setAttributeNS(null, 'width', '0');\n\n this.defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n this.defs.append(clipPath);\n\n this.svg.append(this.defs);\n\n this.mark = document.createElement('div');\n this.mark.classList.add(BASE_CLASS + '-mark');\n }\n\n if(!this.svg.parentElement) {\n this.wrapper.append(this.svg, this.mark);\n }\n\n this.mark.style.cssText = `height: ${markHeight}px; transform: translateY(${markTranslateY}px);`;\n\n this.count = count;\n this.index = index;\n\n return this.border;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppMessagesManager} from '../../lib/appManagers/appMessagesManager';\nimport type ChatTopbar from './topbar';\nimport rootScope from '../../lib/rootScope';\nimport appMediaPlaybackController, {AppMediaPlaybackController} from '../appMediaPlaybackController';\nimport DivAndCaption from '../divAndCaption';\nimport PinnedContainer from './pinnedContainer';\nimport Chat from './chat';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport PeerTitle from '../peerTitle';\nimport {i18n} from '../../lib/langPack';\nimport {formatFullSentTime} from '../../helpers/date';\nimport ButtonIcon from '../buttonIcon';\nimport {DocumentAttribute} from '../../layer';\nimport MediaProgressLine from '../mediaProgressLine';\nimport VolumeSelector from '../volumeSelector';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport default class ChatAudio extends PinnedContainer {\n private toggleEl: HTMLElement;\n private progressLine: MediaProgressLine;\n private volumeSelector: VolumeSelector;\n private fasterEl: HTMLElement;\n private repeatEl: HTMLButtonElement;\n\n constructor(protected topbar: ChatTopbar, protected chat: Chat, protected managers: AppManagers) {\n super({\n topbar,\n chat,\n listenerSetter: topbar.listenerSetter,\n className: 'audio',\n divAndCaption: new DivAndCaption(\n 'pinned-audio',\n (title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment) => {\n replaceContent(this.divAndCaption.title, title);\n replaceContent(this.divAndCaption.subtitle, subtitle);\n }\n ),\n onClose: () => {\n appMediaPlaybackController.stop();\n },\n floating: true\n });\n\n this.divAndCaption.border.remove();\n\n const prevEl = ButtonIcon('fast_rewind active', {noRipple: true});\n const nextEl = ButtonIcon('fast_forward active', {noRipple: true});\n\n const attachClick = (elem: HTMLElement, callback: () => void) => {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n callback();\n }, {listenerSetter: this.topbar.listenerSetter});\n };\n\n attachClick(prevEl, () => {\n appMediaPlaybackController.previous();\n });\n\n attachClick(nextEl, () => {\n appMediaPlaybackController.next();\n });\n\n this.toggleEl = ButtonIcon('', {noRipple: true});\n this.toggleEl.classList.add('active', 'pinned-audio-ico', 'tgico');\n attachClick(this.toggleEl, () => {\n appMediaPlaybackController.toggle();\n });\n this.wrapper.prepend(this.wrapper.firstElementChild, prevEl, this.toggleEl, nextEl);\n\n this.volumeSelector = new VolumeSelector(this.listenerSetter, true);\n const volumeProgressLineContainer = document.createElement('div');\n volumeProgressLineContainer.classList.add('progress-line-container');\n volumeProgressLineContainer.append(this.volumeSelector.container);\n const tunnel = document.createElement('div');\n tunnel.classList.add('pinned-audio-volume-tunnel');\n this.volumeSelector.btn.classList.add('pinned-audio-volume', 'active');\n this.volumeSelector.btn.prepend(tunnel);\n this.volumeSelector.btn.append(volumeProgressLineContainer);\n\n this.repeatEl = ButtonIcon('audio_repeat', {noRipple: true});\n attachClick(this.repeatEl, () => {\n const params = appMediaPlaybackController.getPlaybackParams();\n if(!params.round) {\n appMediaPlaybackController.round = true;\n } else if(params.loop) {\n appMediaPlaybackController.round = false;\n appMediaPlaybackController.loop = false;\n } else {\n appMediaPlaybackController.loop = !appMediaPlaybackController.loop;\n }\n });\n\n const fasterEl = this.fasterEl = ButtonIcon('playback_2x', {noRipple: true});\n attachClick(fasterEl, () => {\n appMediaPlaybackController.playbackRate = fasterEl.classList.contains('active') ? 1 : 1.75;\n });\n\n this.wrapperUtils.prepend(this.volumeSelector.btn, fasterEl, this.repeatEl);\n\n const progressWrapper = document.createElement('div');\n progressWrapper.classList.add('pinned-audio-progress-wrapper');\n\n this.progressLine = new MediaProgressLine(undefined, undefined, true, true);\n this.progressLine.container.classList.add('pinned-audio-progress');\n progressWrapper.append(this.progressLine.container);\n this.wrapper.insertBefore(progressWrapper, this.wrapperUtils);\n\n this.topbar.listenerSetter.add(appMediaPlaybackController)('play', this.onMediaPlay);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('pause', this.onPause);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('stop', this.onStop);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('playbackParams', this.onPlaybackParams);\n\n const playingDetails = appMediaPlaybackController.getPlayingDetails();\n if(playingDetails) {\n this.onMediaPlay(playingDetails);\n this.onPlaybackParams(playingDetails.playbackParams);\n }\n }\n\n public destroy() {\n if(this.progressLine) {\n this.progressLine.removeListeners();\n }\n }\n\n private onPlaybackParams = (playbackParams: ReturnType) => {\n this.fasterEl.classList.toggle('active', playbackParams.playbackRate > 1);\n\n this.repeatEl.classList.remove('tgico-audio_repeat', 'tgico-audio_repeat_single');\n this.repeatEl.classList.add(playbackParams.loop ? 'tgico-audio_repeat_single' : 'tgico-audio_repeat');\n this.repeatEl.classList.toggle('active', playbackParams.loop || playbackParams.round);\n };\n\n private onPause = () => {\n this.toggleEl.classList.remove('flip-icon');\n };\n\n private onStop = () => {\n this.toggle(true);\n };\n\n private onMediaPlay = ({doc, message, media, playbackParams}: ReturnType) => {\n let title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment;\n const isMusic = doc.type !== 'voice' && doc.type !== 'round';\n if(!isMusic) {\n title = new PeerTitle({peerId: message.fromId, fromName: message.fwd_from?.from_name}).element;\n\n // subtitle = 'Voice message';\n subtitle = formatFullSentTime(message.date);\n } else {\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n title = wrapEmojiText(audioAttribute?.title ?? doc.file_name);\n subtitle = audioAttribute?.performer ? wrapEmojiText(audioAttribute.performer) : i18n('AudioUnknownArtist');\n }\n\n this.fasterEl.classList.toggle('hide', isMusic);\n this.repeatEl.classList.toggle('hide', !isMusic);\n\n this.onPlaybackParams(playbackParams);\n this.volumeSelector.setVolume();\n\n this.progressLine.setMedia(media);\n\n this.fill(title, subtitle, message);\n // this.toggleEl.classList.add('flip-icon');\n this.toggleEl.classList.toggle('flip-icon', !media.paused);\n this.toggle(false);\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatTopbar from './topbar';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport PinnedContainer from './pinnedContainer';\nimport PinnedMessageBorder from './pinnedMessageBorder';\nimport ReplyContainer, {wrapReplyDivAndCaption} from './replyContainer';\nimport rootScope from '../../lib/rootScope';\nimport Chat from './chat';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport ButtonIcon from '../buttonIcon';\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\nimport {i18n} from '../../lib/langPack';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport handleScrollSideEvent from '../../helpers/dom/handleScrollSideEvent';\nimport debounce from '../../helpers/schedulers/debounce';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {Message} from '../../layer';\nimport {logger} from '../../lib/logger';\n\nclass AnimatedSuper {\n static DURATION = 200;\n static BASE_CLASS = 'animated-super';\n container: HTMLDivElement;\n rows: {[index: string]: {element: HTMLElement, timeout?: number, new?: true}} = {};\n clearTimeout: number;\n\n constructor() {\n this.container = document.createElement('div');\n this.container.className = AnimatedSuper.BASE_CLASS;\n }\n\n public getRow(index: number, animateFirst = false) {\n if(this.rows[index]) return this.rows[index].element;\n const row = document.createElement('div');\n const isFirst = !Object.keys(this.rows).length && !animateFirst;\n row.className = AnimatedSuper.BASE_CLASS + '-row' + (isFirst ? '' : ' is-hiding hide');\n this.rows[index] = {element: row, new: true};\n this.container.append(row);\n return row;\n }\n\n public clearRow(index: number) {\n if(!this.rows[index]) return;\n this.rows[index].element.remove();\n delete this.rows[index];\n }\n\n public clearRows(currentIndex?: number) {\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\n this.clearTimeout = window.setTimeout(() => {\n for(const i in this.rows) {\n if(+i === currentIndex) continue;\n this.clearRow(+i);\n }\n }, AnimatedSuper.DURATION);\n }\n\n public setNewRow(index: number, reflow = false) {\n const row = this.rows[index];\n if(row.new) {\n if(reflow) {\n row.element.classList.remove('hide');\n void row.element.offsetLeft; // reflow\n } else {\n row.element.classList.remove('is-hiding', 'hide');\n }\n\n delete row.new;\n }\n\n this.clearRows(index);\n }\n\n public animate(index: number, previousIndex: number, fromTop = index > previousIndex, ignorePrevious = false) {\n if(index === previousIndex) { // * handle if set index 0 and previousIndex 0\n return this.setNewRow(index);\n }\n\n const row = this.rows[index];\n const previousRow = this.rows[previousIndex];\n if(!previousRow && !ignorePrevious) {\n return this.setNewRow(index);\n }\n\n const sides = ['from-top', 'from-bottom'];\n if(!fromTop) sides.reverse();\n\n row.element.classList.add(sides[0]);\n row.element.classList.remove(sides[1]);\n if(previousRow) {\n previousRow.element.classList.add(sides[1]);\n previousRow.element.classList.remove(sides[0]);\n }\n\n if(row.new) {\n this.setNewRow(index, true);\n }\n\n row.element.classList.toggle('is-hiding', false);\n previousRow && previousRow.element.classList.toggle('is-hiding', true);\n\n /* const height = row.element.getBoundingClientRect().height;\n row.element.style.transform = `translateY(${fromTop ? height * -1 : height}px)`;\n if(previousRow) {\n previousRow.element.style.transform = `translateY(${fromTop ? height : height * -1}px)`;\n } */\n\n /* row.element.style.setProperty('--height', row.element.getBoundingClientRect().height + 'px');\n if(previousRow) {\n previousRow.element.style.setProperty('--height', previousRow.element.getBoundingClientRect().height + 'px');\n } */\n\n this.clearRows(index);\n }\n}\n\nclass AnimatedCounter {\n static EMPTY_INDEX = -1;\n static BASE_CLASS = 'animated-counter';\n container: HTMLElement;\n decimals: {\n container: HTMLElement,\n placeholder: HTMLElement,\n animatedSuper: AnimatedSuper\n }[] = [];\n previousNumber = 0;\n clearTimeout: number;\n\n constructor(private reverse = false) {\n this.container = document.createElement('div');\n this.container.className = AnimatedCounter.BASE_CLASS;\n }\n\n getDecimal(index: number) {\n if(this.decimals[index]) return this.decimals[index];\n const item = document.createElement('div');\n item.className = AnimatedCounter.BASE_CLASS + '-decimal';\n\n const placeholder = document.createElement('div');\n placeholder.className = AnimatedCounter.BASE_CLASS + '-decimal-placeholder';\n\n const animatedSuper = new AnimatedSuper();\n animatedSuper.container.className = AnimatedCounter.BASE_CLASS + '-decimal-wrapper';\n\n item.append(placeholder, animatedSuper.container);\n\n this.container.append(item);\n\n return this.decimals[index] = {container: item, placeholder, animatedSuper};\n }\n\n clear(number: number) {\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\n\n const decimals = ('' + number).length;\n if(decimals >= this.decimals.length) {\n return;\n }\n\n this.clearTimeout = window.setTimeout(() => {\n const byDecimal = this.decimals.splice(decimals, this.decimals.length - decimals);\n byDecimal.forEach((decimal) => {\n decimal.container.remove();\n });\n }, AnimatedSuper.DURATION);\n }\n\n /* prepareNumber(number: number) {\n const decimals = ('' + number).length;\n if(this.decimals.length < decimals) {\n for(let i = this.decimals.length; i < decimals; ++i) {\n this.getDecimal(i);\n }\n }\n } */\n\n hideLeft(number: number) {\n const decimals = ('' + number).length;\n const byDecimal = this.decimals.slice(decimals);// this.decimals.splice(deleteCount, this.decimals.length - deleteCount);\n byDecimal.forEach((decimal) => {\n const previousDecimalNumber = +decimal.placeholder.innerText || 0;\n const row = decimal.animatedSuper.getRow(AnimatedCounter.EMPTY_INDEX, true);\n decimal.animatedSuper.animate(AnimatedCounter.EMPTY_INDEX, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n });\n\n this.clear(number);\n }\n\n setCount(number: number) {\n // this.prepareNumber(number);\n\n const previousByDecimal = Array.from('' + this.previousNumber).map((n) => +n);\n const byDecimal = Array.from('' + number).map((n) => +n);\n byDecimal.forEach((decimalNumber, idx) => {\n const decimal = this.getDecimal(idx);\n // const row = decimal.animatedSuper.getRow(number, true);\n const row = decimal.animatedSuper.getRow(decimalNumber, true);\n const previousDecimalNumber = previousByDecimal[idx] ?? AnimatedCounter.EMPTY_INDEX;\n row.innerText = decimal.placeholder.innerText = '' + decimalNumber;\n // decimal.animatedSuper.animate(number, this.previousNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n decimal.animatedSuper.animate(decimalNumber, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n });\n\n this.hideLeft(number);\n // this.clear(number);\n this.previousNumber = number;\n }\n}\n\nexport default class ChatPinnedMessage {\n private static LOAD_COUNT = 50;\n private static LOAD_OFFSET = 5;\n\n public pinnedMessageContainer: PinnedContainer;\n private pinnedMessageBorder: PinnedMessageBorder;\n\n private pinnedMaxMid = 0;\n public pinnedMid = 0;\n public pinnedIndex = -1;\n private wasPinnedIndex = 0;\n private wasPinnedMediaIndex = 0;\n\n public locked = false;\n private waitForScrollBottom = false;\n\n public count = 0;\n private mids: number[] = [];\n private offsetIndex = 0;\n\n private loading = false;\n private loadedBottom = false;\n private loadedTop = false;\n\n private animatedSubtitle: AnimatedSuper;\n private animatedMedia: AnimatedSuper;\n private animatedCounter: AnimatedCounter;\n\n private listenerSetter: ListenerSetter;\n private scrollDownListenerSetter: ListenerSetter = null;\n\n public hidden = false;\n\n private getCurrentIndexPromise: Promise = null;\n private btnOpen: HTMLButtonElement;\n\n private setPinnedMessage: () => void;\n\n private isStatic: boolean;\n\n private debug: boolean;\n\n public setCorrectIndexThrottled: (lastScrollDirection?: number) => void;\n\n private log: ReturnType;\n\n constructor(private topbar: ChatTopbar, private chat: Chat, private managers: AppManagers) {\n this.listenerSetter = new ListenerSetter();\n this.log = logger('PM');\n this.debug = true;\n this.isStatic = false;\n\n const dAC = new ReplyContainer('pinned-message', chat.animationGroup);\n this.pinnedMessageContainer = new PinnedContainer({\n topbar,\n chat,\n listenerSetter: this.listenerSetter,\n className: 'message',\n divAndCaption: dAC,\n onClose: async() => {\n if(await managers.appPeersManager.canPinMessage(this.chat.peerId)) {\n new PopupPinMessage(this.chat.peerId, this.pinnedMid, true);\n } else {\n new PopupPinMessage(this.chat.peerId, 0, true);\n }\n\n return false;\n }\n });\n\n this.pinnedMessageBorder = new PinnedMessageBorder();\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\n\n this.animatedSubtitle = new AnimatedSuper();\n dAC.subtitle.append(this.animatedSubtitle.container);\n\n this.animatedMedia = new AnimatedSuper();\n this.animatedMedia.container.classList.add('pinned-message-media-container');\n dAC.content.prepend(this.animatedMedia.container);\n\n this.animatedCounter = new AnimatedCounter(true);\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\n\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\n dAC.container.prepend(btnClose);\n\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\n\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\n\n attachClickEvent(this.btnOpen, (e) => {\n cancelEvent(e);\n this.topbar.openPinned(true);\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\n if(peerId === this.chat.peerId) {\n // this.wasPinnedIndex = 0;\n // setTimeout(() => {\n if(this.hidden) {\n this.pinnedMessageContainer.toggle(this.hidden = false);\n }\n\n this.loadedTop = this.loadedBottom = false;\n this.pinnedIndex = -1;\n this.pinnedMid = 0;\n this.count = 0;\n this.mids = [];\n this.offsetIndex = 0;\n this.pinnedMaxMid = 0;\n this.setCorrectIndex(0);\n // }, 300);\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\n if(peerId === this.chat.peerId) {\n this.pinnedMessageContainer.toggle(this.hidden = true);\n }\n });\n\n // * 200 - no lags\n // * 100 - need test\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\n this.setCorrectIndexThrottled = throttle(this.setCorrectIndex.bind(this), 100, false);\n\n this.isStatic = !this.chat.isPinnedMessagesNeeded();\n }\n\n public destroy() {\n this.pinnedMessageContainer.divAndCaption.container.remove();\n this.pinnedMessageContainer.toggle(true);\n this.listenerSetter.removeAll();\n this.unsetScrollDownListener(false);\n }\n\n public setCorrectIndex(lastScrollDirection?: number) {\n if(this.isStatic) return;\n // return;\n\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\n return;\n }\n\n if((this.loadedBottom || this.loadedTop) && !this.count) {\n return;\n }\n\n // const perf = performance.now();\n const el = this.chat.bubbles.getBubbleByPoint('bottom');\n // this.log('setCorrectIndex: get last element perf:', performance.now() - perf, el);\n if(!el) return;\n\n // return;\n\n const mid = el.dataset.mid;\n if(el && mid !== undefined) {\n // this.log('setCorrectIndex will test mid:', mid);\n this.testMid(+mid, lastScrollDirection);\n }\n }\n\n public testMid(mid: number, lastScrollDirection?: number) {\n if(this.isStatic) return;\n\n // if(lastScrollDirection !== undefined) return;\n if(this.hidden) return;\n\n // this.log('testMid', mid);\n\n let currentIndex: number = this.mids.findIndex((_mid) => _mid <= mid);\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\n currentIndex += this.offsetIndex;\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\n // currentIndex = 0;\n currentIndex = this.mids.length - 1 + this.offsetIndex;\n } else {\n if(!this.getCurrentIndexPromise) {\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\n }\n\n return;\n }\n\n // const idx = Math.max(0, this.mids.indexOf(mid));\n\n /* if(currentIndex === this.count) {\n currentIndex = 0;\n } */\n\n // this.log('testMid: pinned currentIndex', currentIndex, mid);\n\n const changed = this.pinnedIndex !== currentIndex;\n if(changed) {\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // если не скроллил вниз и пытается поставить нижний пиннед - выйти\n return;\n }\n }\n\n this.pinnedIndex = currentIndex;\n this.pinnedMid = this.mids.find((_mid) => _mid <= mid) || this.mids[this.mids.length - 1];\n this.setPinnedMessage();\n }\n }\n\n private isNeededMore(currentIndex: number) {\n return (this.count > ChatPinnedMessage.LOAD_COUNT &&\n (\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) ||\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\n )\n );\n }\n\n private async getCurrentIndex(mid: number, correctAfter = true) {\n if(this.loading) return;\n this.loading = true;\n\n try {\n const log = this.debug ? this.log.bindPrefix('getCurrentIndex') : undefined;\n log && log('start', mid, correctAfter);\n\n let gotRest = false;\n const promises = [\n this.managers.appMessagesManager.getSearch({\n peerId: this.chat.peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: mid,\n limit: ChatPinnedMessage.LOAD_COUNT,\n backLimit: ChatPinnedMessage.LOAD_COUNT,\n threadId: this.chat.threadId\n })\n .then((r) => {\n gotRest = true;\n return r;\n })\n ];\n\n if(!this.pinnedMaxMid) {\n const promise = this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId, this.chat.threadId).then((p) => {\n if(!p.maxId) return;\n this.pinnedMaxMid = p.maxId;\n\n if(!gotRest && correctAfter) {\n this.mids = [this.pinnedMaxMid];\n this.count = p.count;\n this.pinnedIndex = 0;\n this.pinnedMid = this.mids[0];\n this.setPinnedMessage();\n // this.pinnedMessageContainer.toggle(false);\n }\n });\n\n promises.push(promise as any);\n }\n\n const result = (await Promise.all(promises))[0];\n\n let backLimited = result.history.findIndex((message) => message.mid <= mid);\n if(backLimited === -1) {\n backLimited = result.history.length;\n }/* else {\n backLimited -= 1;\n } */\n\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\n this.mids = result.history.map((message) => message.mid).slice();\n this.count = result.count;\n\n if(!this.count) {\n this.pinnedMessageContainer.toggle(true);\n }\n\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\n this.loadedBottom = !this.offsetIndex;\n\n log && log('result', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\n } catch(err) {\n this.log.error('getCurrentIndex error', err);\n }\n\n this.loading = false;\n\n if(this.locked) {\n this.testMid(mid);\n } else if(correctAfter) {\n this.setCorrectIndex(0);\n }\n\n this.getCurrentIndexPromise = null;\n // return result.offset_id_offset || 0;\n }\n\n public setScrollDownListener() {\n this.waitForScrollBottom = true;\n\n if(!this.scrollDownListenerSetter) {\n this.scrollDownListenerSetter = new ListenerSetter();\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\n this.unsetScrollDownListener();\n }, this.scrollDownListenerSetter);\n }\n }\n\n public unsetScrollDownListener(refreshPosition = true) {\n this.waitForScrollBottom = false;\n\n if(this.scrollDownListenerSetter) {\n this.scrollDownListenerSetter.removeAll();\n this.scrollDownListenerSetter = null;\n }\n\n if(refreshPosition) {\n this.setCorrectIndex(0);\n }\n }\n\n public async handleFollowingPinnedMessage() {\n this.locked = true;\n\n this.debug && this.log('handleFollowingPinnedMessage');\n try {\n this.setScrollDownListener();\n\n const setPeerPromise = this.chat.setPeerPromise;\n if(setPeerPromise instanceof Promise) {\n await setPeerPromise;\n }\n\n // await this.chat.bubbles.scrollable.scrollLockedPromise;\n await getHeavyAnimationPromise();\n\n if(this.getCurrentIndexPromise) {\n await this.getCurrentIndexPromise;\n }\n\n this.debug && this.log('handleFollowingPinnedMessage: unlock');\n this.locked = false;\n\n /* // подождём, пока скролл остановится\n setTimeout(() => {\n this.log('handleFollowingPinnedMessage: unlock');\n this.locked = false;\n }, 50); */\n } catch(err) {\n this.log.error('handleFollowingPinnedMessage error:', err);\n\n this.locked = false;\n this.waitForScrollBottom = false;\n this.setCorrectIndex(0);\n }\n }\n\n public async followPinnedMessage(mid: number) {\n const message = await this.chat.getMessage(mid);\n if(!message) {\n return;\n }\n\n this.chat.setMessageId(mid);\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\n this.handleFollowingPinnedMessage();\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\n });\n }\n\n public async _setPinnedMessage() {\n // ///this.log('setting pinned message', message);\n // return;\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\n Promise.all([\n promise\n ]).then(() => { */\n // const mids = results[0];\n const count = this.count;\n if(count) {\n const pinnedIndex = this.pinnedIndex;\n const message = await this.chat.getMessage(this.pinnedMid);\n\n // this.animatedCounter.prepareNumber(count);\n\n // setTimeout(() => {\n const isLast = pinnedIndex === 0;\n this.animatedCounter.container.classList.toggle('is-last', isLast);\n // SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\n if(!isLast) {\n this.animatedCounter.setCount(count - pinnedIndex);\n }\n // }, 100);\n\n // this.pinnedMessageContainer.fill(undefined, message.message, message);\n this.pinnedMessageContainer.toggle(false);\n\n const fromTop = pinnedIndex > this.wasPinnedIndex;\n\n this.debug && this.log('setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\n\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\n writeMediaTo.classList.add('pinned-message-media');\n // writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\n const loadPromises: Promise[] = [];\n const isMediaSet = await wrapReplyDivAndCaption({\n title: undefined,\n titleEl: null,\n subtitle: (message as Message.message).message,\n subtitleEl: writeTo,\n message,\n mediaEl: writeMediaTo,\n loadPromises,\n animationGroup: this.chat.animationGroup\n });\n\n await Promise.all(loadPromises);\n\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\n\n // if(this.wasPinnedIndex !== this.pinnedIndex) {\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\n if(isMediaSet) {\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex из-за того, что блок меняется с другим алгоритмом\n this.wasPinnedMediaIndex = pinnedIndex;\n } else {\n this.animatedMedia.clearRows();\n }\n // }\n\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\n this.wasPinnedIndex = pinnedIndex;\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\n } else {\n this.pinnedMessageContainer.toggle(true);\n this.wasPinnedIndex = 0;\n }\n\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 1);\n // });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\n if(IS_TOUCH_SUPPORTED) {\n let lastY: number;\n const options = {passive: true};\n listenerSetter.add(elem)('touchstart', (e) => {\n if(e.touches.length > 1) {\n onTouchEnd();\n return;\n }\n\n lastY = e.touches[0].clientY;\n\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\n }, options);\n\n const onTouchMove = (e: TouchEvent) => {\n const clientY = e.touches[0].clientY;\n\n const isDown = clientY < lastY;\n if(side === 'bottom' && isDown) callback();\n else if(side === 'top' && !isDown) callback();\n lastY = clientY;\n // alert('isDown: ' + !!isDown);\n };\n\n const onTouchEnd = () => {\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\n };\n } else {\n listenerSetter.add(elem)('wheel', (e) => {\n const isDown = e.deltaY > 0;\n // this.log('wheel', e, isDown);\n if(side === 'bottom' && isDown) callback();\n else if(side === 'top' && !isDown) callback();\n }, {passive: true});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Channel} from '../../lib/appManagers/appChatsManager';\nimport type {AppSidebarRight} from '../sidebarRight';\nimport type Chat from './chat';\nimport {RIGHT_COLUMN_ACTIVE_CLASSNAME} from '../sidebarRight';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport Button from '../button';\nimport ButtonIcon from '../buttonIcon';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport ChatAudio from './audio';\nimport ChatPinnedMessage from './pinnedMessage';\nimport {ButtonMenuItemOptions} from '../buttonMenu';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport PopupDeleteDialog from '../popups/deleteDialog';\nimport appNavigationController from '../appNavigationController';\nimport {LEFT_COLUMN_ACTIVE_CLASSNAME} from '../sidebarLeft';\nimport PeerTitle from '../peerTitle';\nimport {i18n} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {toast, toastNew} from '../toast';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {ChatFull, Chat as MTChat, GroupCall} from '../../layer';\nimport PopupPickUser from '../popups/pickUser';\nimport PopupPeer from '../popups/peer';\nimport AppEditContactTab from '../sidebarRight/tabs/editContact';\nimport appMediaPlaybackController from '../appMediaPlaybackController';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport {CallType} from '../../lib/calls/types';\nimport PopupMute from '../popups/mute';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport hasRights from '../../lib/appManagers/utils/chats/hasRights';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport groupCallsController from '../../lib/calls/groupCallsController';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport {makeMediaSize} from '../../helpers/mediaSize';\n\ntype ButtonToVerify = {element?: HTMLElement, verify: () => boolean | Promise};\n\nexport default class ChatTopbar {\n public container: HTMLDivElement;\n private btnBack: HTMLButtonElement;\n private chatInfo: HTMLDivElement;\n private avatarElement: AvatarElement;\n private title: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private chatUtils: HTMLDivElement;\n private btnJoin: HTMLButtonElement;\n private btnPinned: HTMLButtonElement;\n private btnCall: HTMLButtonElement;\n private btnGroupCall: HTMLButtonElement;\n private btnMute: HTMLButtonElement;\n private btnSearch: HTMLButtonElement;\n private btnMore: HTMLElement;\n\n private chatAudio: ChatAudio;\n public pinnedMessage: ChatPinnedMessage;\n\n private setUtilsRAF: number;\n private setPeerStatusInterval: number;\n\n public listenerSetter: ListenerSetter;\n\n private menuButtons: Parameters[0]['buttons'];\n private buttonsToVerify: ButtonToVerify[];\n private chatInfoContainer: HTMLDivElement;\n private person: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private appSidebarRight: AppSidebarRight,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n\n this.menuButtons = [];\n this.buttonsToVerify = [];\n }\n\n public construct() {\n // this.chat.log.error('Topbar construction');\n\n this.container = document.createElement('div');\n this.container.classList.add('sidebar-header', 'topbar', 'hide');\n this.container.dataset.floating = '0';\n\n this.btnBack = ButtonIcon('left sidebar-close-button', {noRipple: true});\n\n // * chat info section\n this.chatInfoContainer = document.createElement('div');\n this.chatInfoContainer.classList.add('chat-info-container');\n\n this.chatInfo = document.createElement('div');\n this.chatInfo.classList.add('chat-info');\n\n const person = this.person = document.createElement('div');\n person.classList.add('person');\n\n const content = document.createElement('div');\n content.classList.add('content');\n\n const top = document.createElement('div');\n top.classList.add('top');\n\n this.title = document.createElement('div');\n this.title.classList.add('user-title');\n\n top.append(this.title);\n\n const bottom = document.createElement('div');\n bottom.classList.add('bottom');\n\n if(this.subtitle) {\n bottom.append(this.subtitle);\n }\n\n content.append(top, bottom);\n if(this.avatarElement) {\n person.append(this.avatarElement);\n }\n\n person.append(content);\n this.chatInfo.append(person);\n\n // * chat utils section\n this.chatUtils = document.createElement('div');\n this.chatUtils.classList.add('chat-utils');\n\n this.chatAudio = new ChatAudio(this, this.chat, this.managers);\n\n if(this.menuButtons.length) {\n this.btnMore = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: this.menuButtons,\n onOpen: async(e, element) => {\n const deleteButton = this.menuButtons[this.menuButtons.length - 1];\n if(deleteButton?.element) {\n const deleteButtonText = await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n deleteButton.element.lastChild.replaceWith(i18n(deleteButtonText));\n }\n }\n });\n }\n\n this.chatUtils.append(...[\n // this.chatAudio ? this.chatAudio.divAndCaption.container : null,\n this.pinnedMessage ? this.pinnedMessage.pinnedMessageContainer.divAndCaption.container : null,\n this.btnJoin,\n this.btnPinned,\n this.btnCall,\n this.btnGroupCall,\n this.btnMute,\n this.btnSearch,\n this.btnMore\n ].filter(Boolean));\n\n this.pushButtonToVerify(this.btnCall, this.verifyCallButton.bind(this, 'voice'));\n this.pushButtonToVerify(this.btnGroupCall, this.verifyVideoChatButton);\n\n this.chatInfoContainer.append(this.btnBack, this.chatInfo, this.chatUtils);\n this.container.append(this.chatInfoContainer);\n\n if(this.chatAudio) {\n // this.container.append(this.chatAudio.divAndCaption.container, this.chatUtils);\n this.container.append(this.chatAudio.divAndCaption.container);\n }\n\n // * construction end\n\n // * fix topbar overflow section\n\n this.listenerSetter.add(window)('resize', this.onResize);\n this.listenerSetter.add(mediaSizes)('changeScreen', this.onChangeScreen);\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'pinned-container');\n blurActiveElement();\n if(container) {\n cancelEvent(e);\n\n if(findUpClassName(e.target, 'progress-line')) {\n return;\n }\n\n const mid = +container.dataset.mid;\n if(container.classList.contains('pinned-message')) {\n // if(!this.pinnedMessage.locked) {\n this.pinnedMessage.followPinnedMessage(mid);\n // }\n } else {\n const peerId = container.dataset.peerId.toPeerId();\n const searchContext = appMediaPlaybackController.getSearchContext();\n this.chat.appImManager.setInnerPeer({\n peerId,\n lastMsgId: mid,\n type: searchContext.isScheduled ? 'scheduled' : (searchContext.threadId ? 'discussion' : undefined),\n threadId: searchContext.threadId\n });\n }\n } else {\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n onBtnBackClick();\n } else if(findUpTag(e.target, 'AVATAR-ELEMENT')) {\n this.appSidebarRight.toggleSidebar(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME));\n } else {\n this.appSidebarRight.toggleSidebar(true);\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onBtnBackClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n // const item = appNavigationController.findItemByType('chat');\n // * return manually to chat by arrow, since can't get back to\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.chat.appImManager.setPeer({peerId: this.peerId});\n } else {\n const isFirstChat = this.chat.appImManager.chats.indexOf(this.chat) === 0;\n appNavigationController.back(isFirstChat ? 'im' : 'chat');\n /* return;\n\n if(mediaSizes.activeScreen === ScreenSize.medium && !appNavigationController.findItemByType('chat')) {\n this.chat.appImManager.setPeer(0);\n blurActiveElement();\n } else {\n appNavigationController.back('chat');\n } */\n }\n };\n\n attachClickEvent(this.btnBack, onBtnBackClick, {listenerSetter: this.listenerSetter});\n }\n\n private pushButtonToVerify(element: HTMLElement, verify: ButtonToVerify['verify']) {\n if(!element) {\n return;\n }\n\n this.buttonsToVerify.push({element, verify});\n }\n\n private verifyButtons = (e?: Event) => {\n const isMenuOpen = !!e || !!(this.btnMore && this.btnMore.classList.contains('menu-open'));\n\n e && cancelEvent(e);\n\n const r = async() => {\n const buttons = this.buttonsToVerify.concat(isMenuOpen ? this.menuButtons as any : []);\n const results = await Promise.all(buttons.map(async(button) => {\n return {\n result: await button.verify(),\n button\n }\n }));\n\n results.forEach(({button, result}) => {\n button.element.classList.toggle('hide', !result);\n });\n };\n\n r();\n };\n\n private verifyVideoChatButton = async(type?: 'group' | 'broadcast') => {\n if(!IS_GROUP_CALL_SUPPORTED || this.peerId.isUser() || this.chat.type !== 'chat' || this.chat.threadId) return false;\n\n const currentGroupCall = groupCallsController.groupCall;\n const chatId = this.peerId.toChatId();\n if(currentGroupCall?.chatId === chatId) {\n return false;\n }\n\n if(type) {\n if(((await this.managers.appPeersManager.isBroadcast(this.peerId)) && type === 'group') ||\n ((await this.managers.appPeersManager.isAnyGroup(this.peerId)) && type === 'broadcast')) {\n return false;\n }\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n return (chat as MTChat.chat).pFlags?.call_active || hasRights(chat, 'manage_call');\n };\n\n private verifyCallButton = async(type?: CallType) => {\n if(!IS_CALL_SUPPORTED || !this.peerId.isUser()) return false;\n const userId = this.peerId.toUserId();\n const userFull = await this.managers.appProfileManager.getCachedFullUser(userId);\n\n return !!userFull && !!(type === 'voice' ? userFull.pFlags.phone_calls_available : userFull.pFlags.video_calls_available);\n };\n\n public constructUtils() {\n this.menuButtons = [{\n icon: 'search',\n text: 'Search',\n onClick: () => {\n this.chat.initSearch();\n },\n verify: () => mediaSizes.isMobile\n }, /* {\n icon: 'pinlist',\n text: 'Pinned Messages',\n onClick: () => this.openPinned(false),\n verify: () => mediaSizes.isMobile\n }, */{\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.chat.threadId}))\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, threadId: this.chat.threadId});\n },\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && (await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.chat.threadId}))\n }, {\n icon: 'comments',\n text: 'ViewDiscussion',\n onClick: () => {\n const middleware = this.chat.bubbles.getMiddleware();\n Promise.resolve(this.managers.appProfileManager.getChannelFull(this.peerId.toChatId())).then((channelFull) => {\n if(middleware() && channelFull.linked_chat_id) {\n this.chat.appImManager.setInnerPeer({\n peerId: channelFull.linked_chat_id.toPeerId(true)\n });\n }\n });\n },\n verify: async() => {\n const chatFull = await this.managers.appProfileManager.getCachedFullChat(this.peerId.toChatId());\n return this.chat.type === 'chat' && !!(chatFull as ChatFull.channelFull)?.linked_chat_id;\n }\n }, {\n icon: 'phone',\n text: 'Call',\n onClick: this.onCallClick.bind(this, 'voice'),\n verify: this.verifyCallButton.bind(this, 'voice')\n }, {\n icon: 'videocamera',\n text: 'VideoCall',\n onClick: this.onCallClick.bind(this, 'video'),\n verify: this.verifyCallButton.bind(this, 'video')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.LiveStream',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'broadcast')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.VoiceChat',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'group')\n }, {\n icon: 'select',\n text: 'Chat.Menu.SelectMessages',\n onClick: () => {\n const selection = this.chat.selection;\n selection.toggleSelection(true, true);\n apiManagerProxy.getState().then((state) => {\n if(state.chatContextMenuHintWasShown) {\n return;\n }\n\n const original = selection.toggleByElement.bind(selection);\n selection.toggleByElement = async(bubble) => {\n this.managers.appStateManager.pushToState('chatContextMenuHintWasShown', true);\n toast(i18n('Chat.Menu.Hint'));\n\n selection.toggleByElement = original;\n selection.toggleByElement(bubble);\n };\n });\n },\n verify: () => !this.chat.selection.isSelecting && !!this.chat.bubbles.getRenderedLength()\n }, {\n icon: 'select',\n text: 'Chat.Menu.ClearSelection',\n onClick: () => {\n this.chat.selection.cancelSelection();\n },\n verify: () => this.chat.selection.isSelecting\n }, {\n icon: 'adduser',\n text: 'AddContact',\n onClick: () => {\n if(!this.appSidebarRight.isTabExists(AppEditContactTab)) {\n const tab = this.appSidebarRight.createTab(AppEditContactTab);\n tab.peerId = this.peerId;\n tab.open();\n\n this.appSidebarRight.toggleSidebar(true);\n }\n },\n verify: async() => this.peerId.isUser() && !(await this.managers.appPeersManager.isContact(this.peerId))\n }, {\n icon: 'forward',\n text: 'ShareContact',\n onClick: () => {\n const contactPeerId = this.peerId;\n new PopupPickUser({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: (peerId) => {\n return new Promise((resolve, reject) => {\n new PopupPeer('', {\n titleLangKey: 'SendMessageTitle',\n descriptionLangKey: 'SendContactToGroupText',\n descriptionLangArgs: [new PeerTitle({peerId, dialog: true}).element],\n buttons: [{\n langKey: 'Send',\n callback: () => {\n resolve();\n\n this.managers.appMessagesManager.sendContact(peerId, contactPeerId);\n this.chat.appImManager.setInnerPeer({peerId});\n }\n }, {\n langKey: 'Cancel',\n callback: () => {\n reject();\n },\n isCancel: true\n }],\n peerId,\n overlayClosable: true\n }).show();\n });\n },\n placeholder: 'ShareModal.Search.Placeholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n },\n verify: async() => rootScope.myId !== this.peerId && this.peerId.isUser() && (await this.managers.appPeersManager.isContact(this.peerId)) && !!(await this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone\n }, {\n icon: 'bots',\n text: 'Settings',\n onClick: () => {\n this.managers.appMessagesManager.sendText(this.peerId, '/settings');\n },\n verify: async() => {\n try {\n const attachMenuBot = await this.managers.appAttachMenuBotsManager.getAttachMenuBot(this.peerId.toUserId());\n return !!attachMenuBot?.pFlags?.has_settings;\n } catch(err) {\n return false;\n }\n }\n }, {\n icon: 'lock',\n text: 'BlockUser',\n onClick: () => {\n new PopupPeer('', {\n peerId: this.peerId,\n titleLangKey: 'BlockUser',\n descriptionLangKey: 'AreYouSureBlockContact2',\n descriptionLangArgs: [new PeerTitle({peerId: this.peerId}).element],\n buttons: [{\n langKey: 'BlockUser',\n isDanger: true,\n callback: () => {\n this.managers.appUsersManager.toggleBlock(this.peerId, true).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserBlocked'});\n }\n });\n }\n }]\n }).show();\n },\n verify: async() => {\n if(!this.peerId.isUser()) return false;\n const userFull = await this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return this.peerId !== rootScope.myId && userFull && !userFull.pFlags?.blocked;\n }\n }, {\n icon: 'lockoff',\n text: 'Unblock',\n onClick: () => {\n this.managers.appUsersManager.toggleBlock(this.peerId, false).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserUnblocked'});\n }\n });\n },\n verify: async() => {\n const userFull = await this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return !!userFull?.pFlags?.blocked;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: () => {\n new PopupDeleteDialog(this.peerId/* , 'leave' */);\n },\n verify: async() => this.chat.type === 'chat' && !!(await this.managers.appMessagesManager.getDialogOnly(this.peerId))\n }];\n\n this.btnSearch = ButtonIcon('search');\n this.attachClickEvent(this.btnSearch, (e) => {\n this.chat.initSearch();\n }, true);\n }\n\n public attachClickEvent(el: HTMLElement, cb: (e: MouseEvent) => void, noBlur?: boolean) {\n attachClickEvent(el, (e) => {\n cancelEvent(e);\n !noBlur && blurActiveElement();\n cb(e);\n }, {listenerSetter: this.listenerSetter});\n }\n\n private onCallClick(type: CallType) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), type);\n }\n\n private onJoinGroupCallClick = () => {\n this.chat.appImManager.joinGroupCall(this.peerId);\n };\n\n private constructAvatar() {\n const avatarElement = new AvatarElement();\n avatarElement.isDialog = true;\n avatarElement.classList.add('avatar-42', 'person-avatar');\n return avatarElement;\n }\n\n private get peerId() {\n return this.chat.peerId;\n }\n\n public constructPeerHelpers() {\n this.avatarElement = this.constructAvatar();\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('info');\n\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n\n this.btnJoin = Button('btn-primary btn-color-primary chat-join hide');\n this.btnCall = ButtonIcon('phone');\n this.btnGroupCall = ButtonIcon('videochat');\n this.btnPinned = ButtonIcon('pinlist');\n this.btnMute = ButtonIcon('mute');\n\n this.attachClickEvent(this.btnCall, this.onCallClick.bind(this, 'voice'));\n this.attachClickEvent(this.btnGroupCall, this.onJoinGroupCallClick);\n\n this.attachClickEvent(this.btnPinned, () => {\n this.openPinned(true);\n });\n\n this.attachClickEvent(this.btnMute, this.onMuteClick);\n\n this.attachClickEvent(this.btnJoin, async() => {\n const middleware = this.chat.bubbles.getMiddleware();\n this.btnJoin.setAttribute('disabled', 'true');\n\n const chatId = this.peerId.toChatId();\n let promise: Promise;\n if(await this.managers.appChatsManager.isChannel(chatId)) {\n promise = this.managers.appChatsManager.joinChannel(chatId);\n } else {\n promise = this.managers.appChatsManager.addChatUser(chatId, rootScope.myId);\n }\n\n promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.btnJoin.removeAttribute('disabled');\n });\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n const chat = await this.managers.appChatsManager.getChat(chatId) as Channel/* | Chat */;\n\n this.btnJoin.classList.toggle('hide', !(chat as Channel)?.pFlags?.left);\n this.setUtilsWidth();\n this.verifyButtons();\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(dialog.peerId === this.peerId) {\n this.setMutedState();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.verifyButtons();\n }\n });\n\n this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n apiManagerProxy.getState().then((state) => {\n if(!middleware() || !this.pinnedMessage) return;\n\n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[this.chat.peerId];\n\n if(isTopMessage) {\n this.pinnedMessage.unsetScrollDownListener();\n this.pinnedMessage.testMid(mid, 0); // * because slider will not let get bubble by document.elementFromPoint\n } else if(!this.pinnedMessage.locked) {\n this.pinnedMessage.handleFollowingPinnedMessage();\n this.pinnedMessage.testMid(mid);\n }\n });\n });\n\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids}) => {\n if(this.chat.type !== 'pinned' || peerId !== this.peerId) {\n return;\n }\n\n if(mids) {\n this.setTitle();\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\n }\n\n public openPinned(byCurrent: boolean) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.peerId,\n lastMsgId: byCurrent ? +this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid : 0,\n type: 'pinned'\n });\n }\n\n private onMuteClick = () => {\n new PopupMute(this.peerId);\n };\n\n private onResize = () => {\n this.setUtilsWidth(true);\n this.setFloating();\n };\n\n private onChangeScreen = (from: ScreenSize, to: ScreenSize) => {\n this.container.classList.toggle('is-pinned-floating', mediaSizes.isMobile);\n // this.chatAudio && this.chatAudio.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.onResize();\n };\n\n public destroy() {\n // this.chat.log.error('Topbar destroying');\n this.listenerSetter.removeAll();\n window.clearInterval(this.setPeerStatusInterval);\n\n this.pinnedMessage?.destroy(); // * возможно это можно не делать\n this.chatAudio?.destroy();\n\n delete this.chatAudio;\n delete this.pinnedMessage;\n }\n\n public cleanup() {\n if(!this.chat.peerId) {\n this.container.classList.add('hide');\n }\n }\n\n public async finishPeerChange(isTarget: boolean) {\n const {peerId, threadId} = this.chat;\n\n let newAvatar: AvatarElement;\n if(this.chat.type === 'chat') {\n if(this.avatarElement?.peerId !== this.peerId || this.avatarElement.threadId !== this.chat.threadId) {\n newAvatar = this.constructAvatar();\n } else {\n newAvatar = this.avatarElement;\n }\n }\n\n const [isBroadcast, isAnyChat, chat, _, setTitleCallback, setStatusCallback, state] = await Promise.all([\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.isAnyChat(peerId),\n peerId.isAnyChat() ? this.managers.appChatsManager.getChat(peerId.toChatId()) : undefined,\n newAvatar ? newAvatar.updateWithOptions({peerId, threadId, wrapOptions: {customEmojiSize: makeMediaSize(32, 32)}}) : undefined,\n this.setTitleManual(),\n this.setPeerStatusManual(true),\n apiManagerProxy.getState()\n ]);\n\n return () => {\n const canHaveSomeButtons = !(this.chat.type === 'pinned' || this.chat.type === 'scheduled');\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast || !canHaveSomeButtons);\n if(this.btnJoin) {\n if(isAnyChat && !this.chat.isRestricted && canHaveSomeButtons) {\n replaceContent(this.btnJoin, i18n(isBroadcast ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !(chat as MTChat.chat)?.pFlags?.left);\n } else {\n this.btnJoin.classList.add('hide');\n }\n }\n\n if(this.btnSearch) {\n this.btnSearch.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n if(this.btnPinned) {\n this.btnPinned.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n if(this.avatarElement !== newAvatar) {\n if(newAvatar) {\n if(this.avatarElement) {\n this.avatarElement.replaceWith(newAvatar);\n } else {\n this.person.prepend(newAvatar);\n }\n }\n\n this.avatarElement?.remove();\n this.avatarElement = newAvatar;\n }\n\n this.setUtilsWidth();\n\n this.verifyButtons();\n\n if(this.btnMore) {\n this.btnMore.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n const isPinnedMessagesNeeded = this.chat.isPinnedMessagesNeeded();\n if(isPinnedMessagesNeeded || this.chat.type === 'discussion') {\n if(this.chat.wasAlreadyUsed || !this.pinnedMessage) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n if(this.pinnedMessage) {\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n // this.pinnedMessage.pinnedMessageContainer.toggle(true);\n } else {\n this.chatUtils.prepend(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container);\n }\n\n this.pinnedMessage = newPinnedMessage;\n }\n\n if(isPinnedMessagesNeeded) {\n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[peerId];\n } else if(this.chat.type === 'discussion') {\n this.pinnedMessage.pinnedMid = this.chat.threadId;\n this.pinnedMessage.count = 1;\n this.pinnedMessage.pinnedIndex = 0;\n this.pinnedMessage._setPinnedMessage();\n }\n } else if(this.pinnedMessage) {\n this.pinnedMessage.destroy();\n this.pinnedMessage = undefined;\n }\n\n setTitleCallback();\n setStatusCallback?.();\n this.subtitle.classList.toggle('hide', !setStatusCallback);\n this.setMutedState();\n\n this.container.classList.remove('hide');\n };\n }\n\n public async setTitleManual(count?: number) {\n const {peerId, threadId} = this.chat;\n const middleware = () => this.chat.bubbles.getMiddleware();\n let titleEl: HTMLElement, icons: Element[];\n if(this.chat.type === 'pinned') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('PinnedMessagesCount', [count]);\n\n if(count === undefined) {\n this.managers.appMessagesManager.getSearchCounters(peerId, [{_: 'inputMessagesFilterPinned'}], false).then((result) => {\n if(!middleware()) return;\n const count = result[0].count;\n this.setTitle(count);\n\n // ! костыль х2, это нужно делать в другом месте\n if(!count) {\n this.chat.appImManager.setPeer(); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n }\n });\n }\n } else if(this.chat.type === 'scheduled') {\n titleEl = i18n(peerId === rootScope.myId ? 'Reminders' : 'ScheduledMessages');\n } else if(this.chat.type === 'discussion') {\n if(count === undefined) {\n const result = await this.managers.acknowledged.appMessagesManager.getHistory(peerId, 0, 1, 0, threadId);\n if(!middleware()) return;\n if(result.cached) {\n const historyResult = await result.result;\n if(!middleware()) return;\n count = historyResult.count;\n } else result.result.then((historyResult) => {\n if(!middleware()) return;\n this.setTitle(historyResult.count);\n });\n }\n\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('Chat.Title.Comments', [count]);\n } else if(this.chat.type === 'chat') {\n [titleEl/* , icons */] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: true,\n withIcons: !threadId,\n threadId: threadId\n })\n // generateTitleIcons(peerId)\n ]);\n\n if(!middleware()) {\n return;\n }\n }\n\n return () => {\n replaceContent(this.title, titleEl);\n // if(icons) {\n // this.title.append(...icons);\n // }\n };\n }\n\n public setTitle(count?: number) {\n this.setTitleManual(count).then((setTitleCallback) => setTitleCallback());\n }\n\n public async setMutedState() {\n if(!this.btnMute) return;\n\n const peerId = this.peerId;\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false, threadId: this.chat.threadId});\n if(await this.managers.appPeersManager.isBroadcast(peerId)) { // not human\n this.btnMute.classList.remove('tgico-mute', 'tgico-unmute');\n this.btnMute.classList.add(muted ? 'tgico-unmute' : 'tgico-mute');\n this.btnMute.style.display = '';\n } else {\n this.btnMute.style.display = 'none';\n }\n }\n\n // ! У МЕНЯ ПРОСТО СГОРЕЛО, САФАРИ КОНЧЕННЫЙ БРАУЗЕР - ЕСЛИ НЕ СКРЫВАТЬ БЛОК, ТО ПРИ ПЕРЕВОРОТЕ ЭКРАНА НА АЙФОНЕ БЛОК БУДЕТ НЕПРАВИЛЬНО ШИРИНЫ, ДАЖЕ БЕЗ ЭТОЙ ФУНКЦИИ!\n public setUtilsWidth = (resize = false) => {\n // return;\n if(this.setUtilsRAF) window.cancelAnimationFrame(this.setUtilsRAF);\n\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.add('hide');\n }\n\n // mutationObserver.disconnect();\n this.setUtilsRAF = window.requestAnimationFrame(() => {\n // mutationRAF = window.requestAnimationFrame(() => {\n\n // setTimeout(() => {\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.remove('hide');\n }\n /* this.chatInfo.style.removeProperty('--utils-width');\n void this.chatInfo.offsetLeft; // reflow */\n const width = /* chatUtils.scrollWidth */this.chatUtils.getBoundingClientRect().width;\n this.chat.log('utils width:', width);\n this.container.style.setProperty('--utils-width', width + 'px');\n // this.chatInfo.classList.toggle('have-utils-width', !!width);\n // }, 0);\n\n this.setUtilsRAF = 0;\n\n // mutationObserver.observe(chatUtils, observeOptions);\n // });\n });\n };\n\n public setFloating = () => {\n const containers = [this.chatAudio, this.pinnedMessage?.pinnedMessageContainer].filter(Boolean);\n const count = containers.reduce((acc, container) => {\n const isFloating = container.isFloating();\n this.container.classList.toggle(`is-pinned-${container.className}-floating`, isFloating);\n\n if(!container.isVisible()) {\n return acc;\n }\n\n return acc + +isFloating;\n }, 0);\n this.container.dataset.floating = '' + count;\n };\n\n public setPeerStatusManual = async(needClear = false) => {\n if(!this.subtitle || this.chat.type !== 'chat') return;\n\n if(this.chat.threadId) {\n const title = await wrapPeerTitle({peerId: this.peerId, dialog: true});\n const span = i18n('TopicProfileStatus', [title]);\n return () => replaceContent(this.subtitle, span);\n }\n\n const peerId = this.peerId;\n return this.chat.appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear,\n useWhitespace: false,\n middleware: () => peerId === this.peerId\n });\n };\n\n public setPeerStatus = (needClear?: boolean) => {\n return this.setPeerStatusManual(needClear).then((callback) => {\n callback?.();\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appSidebarRight from '..';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport AppSearch, {SearchGroup} from '../../appSearch';\nimport ButtonIcon from '../../buttonIcon';\nimport InputSearch from '../../inputSearch';\nimport PopupElement from '../../popups';\nimport PopupDatePicker from '../../popups/datePicker';\nimport {SliderSuperTab} from '../../slider';\n\nexport default class AppPrivateSearchTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private appSearch: AppSearch;\n private btnPickDate: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n private query = '';\n private onDatePick: (timestamp: number) => void;\n\n onOpenAfterTimeout() {\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\n }\n\n public init(\n peerId: PeerId,\n threadId?: number,\n onDatePick?: AppPrivateSearchTab['onDatePick'],\n query?: string\n ) {\n this.container.id = 'search-private-container';\n this.container.classList.add('chatlist-container');\n this.inputSearch = new InputSearch('Search');\n this.title.replaceWith(this.inputSearch.container);\n\n this.btnPickDate = ButtonIcon('calendar sidebar-header-right');\n this.header.append(this.btnPickDate);\n\n const c = document.createElement('div');\n c.classList.add('chatlist-container');\n this.scrollable.container.replaceWith(c);\n this.appSearch = new AppSearch(c, this.inputSearch, {\n messages: new SearchGroup('Chat.Search.PrivateSearch', 'messages')\n });\n\n if(!this.peerId) {\n this.query = query;\n this.peerId = peerId;\n this.threadId = threadId;\n this.onDatePick = onDatePick;\n\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\n if(this.onDatePick) {\n attachClickEvent(this.btnPickDate, () => {\n PopupElement.createPopup(PopupDatePicker, new Date(), this.onDatePick).show();\n });\n }\n\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\n\n appSidebarRight.toggleSidebar(true);\n } else {\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatTopbar from './topbar';\nimport AppSearch, {SearchGroup} from '../appSearch';\nimport PopupDatePicker from '../popups/datePicker';\nimport ripple from '../ripple';\nimport InputSearch from '../inputSearch';\nimport type Chat from './chat';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {i18n} from '../../lib/langPack';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport PopupElement from '../popups';\nimport {DIALOG_LIST_ELEMENT_TAG} from '../../lib/appManagers/appDialogsManager';\n\nexport default class ChatSearch {\n private element: HTMLElement;\n private backBtn: HTMLElement;\n private inputSearch: InputSearch;\n\n private results: HTMLElement;\n\n private footer: HTMLElement;\n private dateBtn: HTMLElement;\n private foundCountEl: HTMLElement;\n private controls: HTMLElement;\n private downBtn: HTMLElement;\n private upBtn: HTMLElement;\n\n private appSearch: AppSearch;\n private searchGroup: SearchGroup;\n\n private foundCount = 0;\n private selectedIndex = 0;\n private setPeerPromise: Promise;\n private listenerSetter: ListenerSetter;\n private navigationItem: NavigationItem;\n\n constructor(private topbar: ChatTopbar, private chat: Chat, query?: string) {\n this.element = document.createElement('div');\n this.element.classList.add('sidebar-header', 'chat-search', 'chatlist-container');\n\n this.backBtn = document.createElement('button');\n this.backBtn.classList.add('btn-icon', 'tgico-left', 'sidebar-close-button');\n ripple(this.backBtn);\n\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n const attachClick = (element: HTMLElement, callback: (e: MouseEvent) => void) => {\n attachClickEvent(element, callback, {listenerSetter});\n };\n\n attachClick(this.backBtn, () => {\n this.destroy();\n });\n\n this.inputSearch = new InputSearch('Search');\n\n // Results\n this.results = document.createElement('div');\n this.results.classList.add('chat-search-results', 'chatlist-container');\n\n this.searchGroup = new SearchGroup(false, 'messages', undefined, '', false);\n attachClick(this.searchGroup.list, this.onResultsClick);\n\n this.appSearch = new AppSearch(this.results, this.inputSearch, {\n messages: this.searchGroup\n }, (count) => {\n this.foundCount = count;\n\n if(!this.foundCount) {\n replaceContent(this.foundCountEl, this.inputSearch.value ? i18n('NoResult') : '');\n this.results.classList.remove('active');\n this.chat.bubbles.container.classList.remove('search-results-active');\n this.upBtn.setAttribute('disabled', 'true');\n this.downBtn.setAttribute('disabled', 'true');\n } else {\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\n }\n });\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\n\n // appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\n this.chat.bubbles.container.append(this.results);\n\n // Footer\n this.footer = document.createElement('div');\n this.footer.classList.add('chat-search-footer');\n\n attachClick(this.footer, this.onFooterClick);\n ripple(this.footer);\n\n this.foundCountEl = document.createElement('span');\n this.foundCountEl.classList.add('chat-search-count');\n\n this.dateBtn = document.createElement('button');\n this.dateBtn.classList.add('btn-icon', 'tgico-calendar');\n\n this.controls = document.createElement('div');\n this.controls.classList.add('chat-search-controls');\n\n this.upBtn = document.createElement('button');\n this.upBtn.classList.add('btn-icon', 'tgico-up');\n this.downBtn = document.createElement('button');\n this.downBtn.classList.add('btn-icon', 'tgico-down');\n\n this.upBtn.setAttribute('disabled', 'true');\n this.downBtn.setAttribute('disabled', 'true');\n\n attachClick(this.dateBtn, this.onDateClick);\n attachClick(this.upBtn, this.onUpClick);\n attachClick(this.downBtn, this.onDownClick);\n this.controls.append(this.upBtn, this.downBtn);\n\n this.footer.append(this.foundCountEl, this.dateBtn, this.controls);\n\n this.topbar.container.parentElement.insertBefore(this.footer, chat.input.chatInput);\n\n // Append container\n this.element.append(this.backBtn, this.inputSearch.container);\n\n this.topbar.container.classList.add('hide-pinned');\n this.topbar.container.parentElement.append(this.element);\n\n this.inputSearch.input.focus();\n\n if(query) {\n this.setQuery(query);\n }\n\n if(!IS_MOBILE_SAFARI) {\n this.navigationItem = {\n type: 'mobile-search',\n onPop: () => {\n this.destroy();\n }\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n }\n\n public destroy() {\n this.topbar.container.classList.remove('hide-pinned');\n this.element.remove();\n this.inputSearch.remove();\n this.results.remove();\n this.footer.remove();\n this.listenerSetter.removeAll();\n this.chat.bubbles.container.classList.remove('search-results-active');\n this.chat.search = undefined;\n appNavigationController.removeItem(this.navigationItem);\n }\n\n public setQuery(query: string) {\n this.inputSearch.inputField.value = query;\n }\n\n private onDateClick = (e: MouseEvent) => {\n cancelEvent(e);\n PopupElement.createPopup(PopupDatePicker, new Date(), this.chat.bubbles.onDatePick).show();\n };\n\n private selectResult(elem: HTMLElement) {\n if(this.setPeerPromise) return this.setPeerPromise;\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n\n const index = whichChild(elem);\n\n if(index === (this.foundCount - 1)) {\n this.upBtn.setAttribute('disabled', 'true');\n } else {\n this.upBtn.removeAttribute('disabled');\n }\n\n if(!index) {\n this.downBtn.setAttribute('disabled', 'true');\n } else {\n this.downBtn.removeAttribute('disabled');\n }\n\n this.results.classList.remove('active');\n this.chat.bubbles.container.classList.remove('search-results-active');\n\n const res = this.chat.setPeer({peerId, lastMsgId});\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\n this.selectedIndex = index;\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\n\n const renderedCount = this.searchGroup.list.childElementCount;\n if(this.selectedIndex >= (renderedCount - 6)) {\n this.appSearch.searchMore();\n }\n }).finally(() => {\n this.setPeerPromise = null;\n });\n }\n\n private onResultsClick = (e: MouseEvent) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(target) {\n this.selectResult(target);\n }\n };\n\n private onFooterClick = (e: MouseEvent) => {\n if(this.foundCount) {\n this.chat.bubbles.container.classList.toggle('search-results-active');\n this.results.classList.toggle('active');\n }\n };\n\n private onUpClick = (e: MouseEvent) => {\n cancelEvent(e);\n this.selectResult(this.searchGroup.list.children[this.selectedIndex + 1] as HTMLElement);\n };\n\n private onDownClick = (e: MouseEvent) => {\n cancelEvent(e);\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport windowSize from '../../helpers/windowSize';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\n\ntype ChatBackgroundPatternRendererInitOptions = {\n url: string,\n width: number,\n height: number,\n mask?: boolean\n};\n\nexport default class ChatBackgroundPatternRenderer {\n private static INSTANCES: ChatBackgroundPatternRenderer[] = [];\n\n // private pattern: CanvasPattern;\n private objectUrl: string;\n private options: ChatBackgroundPatternRendererInitOptions;\n private canvases: Set;\n // private createCanvasPatternPromise: Promise;\n // private exportCanvasPatternToImagePromise: Promise;\n private renderImageFromUrlPromise: Promise;\n private image: HTMLImageElement;\n private imageBitmap: ImageBitmap;\n\n constructor() {\n this.canvases = new Set();\n }\n\n public static getInstance(options: ChatBackgroundPatternRendererInitOptions) {\n let instance = this.INSTANCES.find((instance) => {\n return deepEqual(instance.options, options);\n });\n\n if(!instance) {\n instance = new ChatBackgroundPatternRenderer();\n instance.init(options);\n this.INSTANCES.push(instance);\n }\n\n return instance;\n }\n\n public init(options: ChatBackgroundPatternRendererInitOptions) {\n // if(this.options) {\n // if(this.options.width !== options.width || this.options.height !== options.height) {\n // this.createCanvasPatternPromise =\n // this.pattern =\n // this.exportCanvasPatternToImagePromise =\n // undefined;\n // }\n // }\n\n this.options = options;\n }\n\n public renderToCanvas(canvas: HTMLCanvasElement) {\n // return this.createCanvasPattern(canvas).then(() => {\n // return this.fillCanvas(canvas);\n // });\n\n return this.renderImageFromUrl(this.options.url).then(() => {\n return this.fillCanvas(canvas);\n });\n }\n\n private renderImageFromUrl(url: string) {\n if(this.renderImageFromUrlPromise) return this.renderImageFromUrlPromise;\n const img = this.image = document.createElement('img');\n img.crossOrigin = 'anonymous';\n return this.renderImageFromUrlPromise = renderImageFromUrlPromise(img, url, false).then(() => {\n if(!IS_IMAGE_BITMAP_SUPPORTED) {\n return img;\n }\n\n return createImageBitmap(img, {\n resizeWidth: 1440,\n resizeHeight: 2960\n }).then((imageBitmap) => {\n this.imageBitmap = imageBitmap;\n return img;\n });\n });\n }\n\n /* private createCanvasPattern(canvas: HTMLCanvasElement) {\n if(this.createCanvasPatternPromise) return this.createCanvasPatternPromise;\n return this.createCanvasPatternPromise = this.renderImageFromUrl(this.options.url).then((img) => {\n let createPatternFrom: HTMLImageElement | HTMLCanvasElement;\n if(IS_SAFARI) {\n const canvas = createPatternFrom = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n } else {\n createPatternFrom = img;\n }\n\n const perf = performance.now();\n this.pattern = canvas.getContext('2d').createPattern(createPatternFrom, 'repeat-x');\n console.warn('creating pattern time:', performance.now() - perf);\n\n return this.pattern;\n });\n }\n\n public exportCanvasPatternToImage(canvas: HTMLCanvasElement) {\n if(this.exportCanvasPatternToImagePromise) return this.exportCanvasPatternToImagePromise;\n return this.exportCanvasPatternToImagePromise = new Promise((resolve) => {\n canvas.toBlob((blob) => {\n const newUrl = this.objectUrl = URL.createObjectURL(blob);\n resolve(newUrl);\n }, 'image/png');\n });\n } */\n\n public cleanup(canvas: HTMLCanvasElement) {\n this.canvases.delete(canvas);\n\n if(!this.canvases.size) {\n indexOfAndSplice(ChatBackgroundPatternRenderer.INSTANCES, this);\n\n if(this.objectUrl) {\n this.imageBitmap?.close();\n URL.revokeObjectURL(this.objectUrl);\n }\n }\n }\n\n public fillCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n const {width, height} = canvas;\n // const perf = performance.now();\n // if(context.fillStyle instanceof CanvasPattern) {\n // context.clearRect(0, 0, width, height);\n // }\n\n const source = this.imageBitmap || this.image;\n\n let imageWidth = source.width, imageHeight = source.height;\n // let patternHeight = 1480 * canvas.dpr;\n // if(+canvas.dataset.originalHeight !== height) patternHeight *= .6875;\n const patternHeight = (500 + (windowSize.height / 2.5)) * canvas.dpr;\n const ratio = patternHeight / imageHeight;\n imageWidth *= ratio;\n imageHeight = patternHeight;\n\n if(this.options.mask) {\n context.fillStyle = '#000';\n context.fillRect(0, 0, width, height);\n context.globalCompositeOperation = 'destination-out';\n } else {\n context.globalCompositeOperation = 'source-over';\n }\n\n const d = (y: number) => {\n for(let x = 0; x < width; x += imageWidth) {\n context.drawImage(source, x, y, imageWidth, imageHeight);\n }\n };\n\n const centerY = (height - imageHeight) / 2;\n d(centerY);\n\n if(centerY > 0) {\n let topY = centerY;\n do {\n d(topY -= imageHeight);\n } while(topY >= 0);\n }\n\n const endY = height - 1;\n for(let bottomY = centerY + imageHeight; bottomY < endY; bottomY += imageHeight) {\n d(bottomY);\n }\n\n // for(let x = 0; x < width; x += imageWidth) {\n // for(let y = 0; y < height; y += imageHeight) {\n // context.drawImage(img, x, y, imageWidth, imageHeight);\n // }\n // }\n // context.fillStyle = this.pattern;\n // context.fillRect(0, 0, width, height);\n // console.warn('fill canvas time', performance.now() - perf);\n }\n\n public setCanvasDimensions(canvas: HTMLCanvasElement) {\n const devicePixelRatio = Math.min(2, window.devicePixelRatio);\n const width = this.options.width * devicePixelRatio;\n let height = this.options.height * devicePixelRatio;\n\n canvas.dpr = devicePixelRatio;\n canvas.dataset.originalHeight = '' + height;\n if(mediaSizes.activeScreen === ScreenSize.large) height *= 1.5;\n canvas.width = width;\n canvas.height = height;\n }\n\n public createCanvas() {\n const canvas = document.createElement('canvas');\n this.canvases.add(canvas);\n this.setCanvasDimensions(canvas);\n return canvas;\n }\n\n public resize(width: number, height: number) {\n this.init({\n ...this.options,\n width,\n height\n });\n\n const promises: Promise[] = [];\n for(const canvas of this.canvases) {\n this.setCanvasDimensions(canvas);\n promises.push(this.renderToCanvas(canvas));\n }\n\n return Promise.all(promises);\n }\n\n public static resizeInstances(width: number, height: number) {\n return Promise.all(this.INSTANCES.map((instance) => instance.resize(width, height)));\n }\n\n /* public setResizeMode(resizing: boolean) {\n const canvases = Array.from(this.canvases);\n const canvas = canvases[canvases.length - 1];\n canvas.style.display = resizing ? 'none' : '';\n const img = this.img;\n img.style.display = resizing ? '' : 'none';\n\n return {img, canvas};\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ChatRights} from '../../lib/appManagers/appChatsManager';\nimport {AppImManager, APP_TABS, ChatSetPeerOptions} from '../../lib/appManagers/appImManager';\nimport type {MessageSendingParams, MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {logger, LogTypes} from '../../lib/logger';\nimport rootScope from '../../lib/rootScope';\nimport appSidebarRight from '../sidebarRight';\nimport ChatBubbles from './bubbles';\nimport ChatContextMenu from './contextMenu';\nimport ChatInput from './input';\nimport ChatSelection from './selection';\nimport ChatTopbar from './topbar';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport SetTransition from '../singleTransition';\nimport AppPrivateSearchTab from '../sidebarRight/tabs/search';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport ChatSearch from './search';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport getAutoDownloadSettingsByPeerId, {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport ChatBackgroundGradientRenderer from './gradientRenderer';\nimport ChatBackgroundPatternRenderer from './patternRenderer';\nimport pause from '../../helpers/schedulers/pause';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport SlicedArray from '../../helpers/slicedArray';\nimport themeController from '../../helpers/themeController';\nimport AppSharedMediaTab from '../sidebarRight/tabs/sharedMedia';\nimport noop from '../../helpers/noop';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {Message, WallPaper} from '../../layer';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport {getColorsFromWallPaper} from '../../helpers/color';\n\nexport type ChatType = 'chat' | 'pinned' | 'discussion' | 'scheduled';\n\nexport default class Chat extends EventListenerBase<{\n setPeer: (mid: number, isTopMessage: boolean) => void\n}> {\n public container: HTMLElement;\n public backgroundEl: HTMLElement;\n\n public topbar: ChatTopbar;\n public bubbles: ChatBubbles;\n public input: ChatInput;\n public selection: ChatSelection;\n public contextMenu: ChatContextMenu;\n public search: ChatSearch;\n\n public wasAlreadyUsed: boolean;\n // public initPeerId = 0;\n public peerId: PeerId;\n public threadId: number;\n public setPeerPromise: Promise;\n public peerChanged: boolean;\n\n public log: ReturnType;\n\n public type: ChatType;\n public messagesStorageKey: MessagesStorageKey;\n\n public noForwards: boolean;\n\n public inited: boolean;\n\n public isRestricted: boolean;\n public autoDownload: ChatAutoDownloadSettings;\n\n public gradientRenderer: ChatBackgroundGradientRenderer;\n public patternRenderer: ChatBackgroundPatternRenderer;\n public gradientCanvas: HTMLCanvasElement;\n public patternCanvas: HTMLCanvasElement;\n public backgroundTempId: number;\n public setBackgroundPromise: Promise;\n public sharedMediaTab: AppSharedMediaTab;\n public sharedMediaTabs: AppSharedMediaTab[];\n // public renderDarkPattern: () => Promise;\n\n public isBot: boolean;\n public isChannel: boolean;\n public isBroadcast: boolean;\n public isAnyGroup: boolean;\n public isMegagroup: boolean;\n public isForum: boolean;\n public isAllMessagesForum: boolean;\n\n public animationGroup: AnimationItemGroup;\n\n constructor(\n public appImManager: AppImManager,\n public managers: AppManagers\n ) {\n super();\n\n this.type = 'chat';\n this.animationGroup = `chat-${Math.round(Math.random() * 65535)}`;\n\n this.container = document.createElement('div');\n this.container.classList.add('chat', 'tabs-tab');\n\n this.backgroundEl = document.createElement('div');\n this.backgroundEl.classList.add('chat-background');\n\n // * constructor end\n\n this.log = logger('CHAT', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n this.log.warn('constructor');\n\n this.peerId = NULL_PEER_ID;\n\n this.container.append(this.backgroundEl);\n this.appImManager.chatsContainer.append(this.container);\n\n this.backgroundTempId = 0;\n this.sharedMediaTabs = [];\n }\n\n public setBackground(url: string, skipAnimation?: boolean): Promise {\n const theme = themeController.getTheme();\n const themeSettings = theme.settings;\n const wallPaper = themeSettings.wallpaper;\n const colors = getColorsFromWallPaper(wallPaper);\n\n let item: HTMLElement;\n const isColorBackground = !!colors && !(wallPaper as WallPaper.wallPaper).slug && !wallPaper.settings.intensity;\n if(\n isColorBackground &&\n document.documentElement.style.cursor === 'grabbing' &&\n this.gradientRenderer &&\n !this.patternRenderer\n ) {\n this.gradientCanvas.dataset.colors = colors;\n this.gradientRenderer.init(this.gradientCanvas);\n return Promise.resolve();\n }\n\n const tempId = ++this.backgroundTempId;\n\n const previousGradientRenderer = this.gradientRenderer;\n const previousPatternRenderer = this.patternRenderer;\n const previousGradientCanvas = this.gradientCanvas;\n const previousPatternCanvas = this.patternCanvas;\n\n this.gradientRenderer =\n this.patternRenderer =\n this.gradientCanvas =\n this.patternCanvas =\n // this.renderDarkPattern =\n undefined;\n\n const intensity = wallPaper.settings?.intensity && wallPaper.settings.intensity / 100;\n const isDarkPattern = !!intensity && intensity < 0;\n\n let patternRenderer: ChatBackgroundPatternRenderer;\n let patternCanvas = item?.firstElementChild as HTMLCanvasElement;\n let gradientCanvas: HTMLCanvasElement;\n if(!item) {\n item = document.createElement('div');\n item.classList.add('chat-background-item');\n\n if(url) {\n if(intensity) {\n item.classList.add('is-pattern');\n\n const rect = this.appImManager.chatsContainer.getBoundingClientRect();\n patternRenderer = this.patternRenderer = ChatBackgroundPatternRenderer.getInstance({\n url,\n width: rect.width,\n height: rect.height,\n mask: isDarkPattern\n });\n\n patternCanvas = this.patternCanvas = patternRenderer.createCanvas();\n patternCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-pattern-canvas');\n\n if(isDarkPattern) {\n item.classList.add('is-dark');\n }\n\n // if(isDarkPattern) {\n // this.renderDarkPattern = () => {\n // return patternRenderer.exportCanvasPatternToImage(patternCanvas).then((url) => {\n // if(this.backgroundTempId !== tempId) {\n // return;\n // }\n\n // gradientCanvas.style.webkitMaskImage = `url(${url})`;\n // });\n // };\n // }\n } else {\n item.classList.add('is-image');\n }\n } else {\n item.classList.add('is-color');\n }\n }\n\n let gradientRenderer: ChatBackgroundGradientRenderer;\n if(colors) {\n // if(color.includes(',')) {\n const {canvas, gradientRenderer: _gradientRenderer} = ChatBackgroundGradientRenderer.create(colors);\n gradientRenderer = this.gradientRenderer = _gradientRenderer;\n gradientCanvas = this.gradientCanvas = canvas;\n gradientCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-color-canvas');\n\n if(rootScope.settings.animationsEnabled) {\n gradientRenderer.scrollAnimate(true);\n }\n // } else {\n // item.style.backgroundColor = color;\n // item.style.backgroundImage = 'none';\n // }\n }\n\n if(patternRenderer) {\n const setOpacityTo = isDarkPattern ? gradientCanvas : patternCanvas;\n setOpacityTo.style.setProperty('--opacity-max', '' + (Math.abs(intensity) * (isDarkPattern ? .5 : 1)));\n }\n\n const promise = new Promise((resolve) => {\n const cb = () => {\n if(this.backgroundTempId !== tempId) {\n if(patternRenderer) {\n patternRenderer.cleanup(patternCanvas);\n }\n\n if(gradientRenderer) {\n gradientRenderer.cleanup();\n }\n\n return;\n }\n\n const prev = this.backgroundEl.lastElementChild as HTMLElement;\n\n if(prev === item) {\n resolve();\n return;\n }\n\n const append = [\n gradientCanvas,\n // isDarkPattern && this.renderDarkPattern ? undefined : patternCanvas\n patternCanvas\n ].filter(Boolean);\n if(append.length) {\n item.append(...append);\n }\n\n this.backgroundEl.append(item);\n\n SetTransition({\n element: item,\n className: 'is-visible',\n forwards: true,\n duration: !skipAnimation ? 200 : 0,\n onTransitionEnd: prev ? () => {\n previousPatternRenderer?.cleanup(previousPatternCanvas);\n previousGradientRenderer?.cleanup();\n\n prev.remove();\n } : null,\n useRafs: 2\n });\n\n resolve();\n };\n\n if(patternRenderer) {\n const renderPatternPromise = patternRenderer.renderToCanvas(patternCanvas);\n renderPatternPromise.then(() => {\n if(this.backgroundTempId !== tempId) {\n return;\n }\n\n // let promise: Promise;\n // if(isDarkPattern && this.renderDarkPattern) {\n // promise = this.renderDarkPattern();\n // } else {\n // const promise = Promise.resolve();\n // }\n\n // promise.then(cb);\n cb();\n });\n } else if(url) {\n renderImageFromUrl(item, url, cb);\n } else {\n cb();\n }\n });\n\n return this.setBackgroundPromise = Promise.race([\n pause(500),\n promise\n ]);\n }\n\n public setType(type: ChatType) {\n this.type = type;\n }\n\n public init(/* peerId: PeerId */) {\n // this.initPeerId = peerId;\n\n this.topbar = new ChatTopbar(this, appSidebarRight, this.managers);\n this.bubbles = new ChatBubbles(this, this.managers);\n this.input = new ChatInput(this, this.appImManager, this.managers);\n this.contextMenu = new ChatContextMenu(this, this.managers);\n this.selection = new ChatSelection(this, this.bubbles, this.input, this.managers);\n\n this.topbar.constructUtils();\n this.topbar.constructPeerHelpers();\n\n this.topbar.construct();\n this.input.construct();\n\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n\n if(!IS_TOUCH_SUPPORTED) {\n this.bubbles.setReactionsHoverListeners();\n }\n\n this.bubbles.attachContainerListeners();\n\n this.container.append(this.topbar.container, this.bubbles.container, this.input.chatInput);\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.peerId === migrateFrom) {\n this.setPeer({peerId: migrateTo});\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(dialog.peerId === this.peerId && (dialog._ === 'dialog' || this.threadId === dialog.id)) {\n this.appImManager.setPeer();\n }\n });\n\n const freezeObservers = (freeze: boolean) => {\n const cb = () => {\n this.bubbles.observer?.toggleObservingNew(freeze);\n animationIntersector.toggleIntersectionGroup(this.animationGroup, freeze);\n if(freeze) {\n animationIntersector.checkAnimations(freeze, this.animationGroup);\n }\n };\n\n if(!freeze) {\n setTimeout(() => {\n cb();\n }, 400);\n } else {\n cb();\n }\n };\n\n this.bubbles.listenerSetter.add(this.appImManager)('chat_changing', ({to}) => {\n freezeObservers(to !== this);\n });\n\n this.bubbles.listenerSetter.add(this.appImManager)('tab_changing', (tabId) => {\n freezeObservers(this.appImManager.chat !== this || (tabId !== APP_TABS.CHAT && mediaSizes.activeScreen === ScreenSize.mobile));\n });\n }\n\n public beforeDestroy() {\n this.bubbles.cleanup();\n }\n\n private cleanupBackground() {\n ++this.backgroundTempId;\n if(this.patternRenderer) {\n this.patternRenderer.cleanup(this.patternCanvas);\n this.patternRenderer = undefined;\n }\n\n if(this.gradientRenderer) {\n this.gradientRenderer.cleanup();\n this.gradientRenderer = undefined;\n }\n }\n\n public destroy() {\n // const perf = performance.now();\n\n this.destroySharedMediaTab();\n this.topbar.destroy();\n this.bubbles.destroy();\n this.input.destroy();\n this.contextMenu && this.contextMenu.destroy();\n this.selection && this.selection.attachListeners(undefined, undefined);\n\n this.cleanupBackground();\n\n delete this.topbar;\n delete this.bubbles;\n delete this.input;\n delete this.selection;\n delete this.contextMenu;\n\n this.container.remove();\n\n // this.log.error('Chat destroy time:', performance.now() - perf);\n }\n\n public cleanup(helperToo = true) {\n this.input.cleanup(helperToo);\n this.topbar.cleanup();\n this.selection.cleanup();\n }\n\n public get isForumTopic() {\n return !!(this.isForum && this.threadId);\n }\n\n public async onChangePeer(options: ChatSetPeerOptions, m: ReturnType) {\n const {peerId, threadId} = this;\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n searchTab?.close();\n\n const [\n noForwards,\n isRestricted,\n isAnyGroup,\n _,\n isMegagroup,\n isBroadcast,\n isChannel,\n isBot,\n isForum\n ] = await m(Promise.all([\n this.managers.appPeersManager.noForwards(peerId),\n this.managers.appPeersManager.isPeerRestricted(peerId),\n this._isAnyGroup(peerId),\n this.setAutoDownloadMedia(),\n this.managers.appPeersManager.isMegagroup(peerId),\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.isChannel(peerId),\n this.managers.appPeersManager.isBot(peerId),\n this.managers.appPeersManager.isForum(peerId)\n ]));\n\n // ! WARNING: TEMPORARY, HAVE TO GET TOPIC\n if(isForum && threadId) {\n await m(this.managers.dialogsStorage.getForumTopicOrReload(peerId, threadId));\n }\n\n this.noForwards = noForwards;\n this.isRestricted = isRestricted;\n this.isAnyGroup = isAnyGroup;\n this.isMegagroup = isMegagroup;\n this.isBroadcast = isBroadcast;\n this.isChannel = isChannel;\n this.isBot = isBot;\n this.isForum = isForum;\n this.isAllMessagesForum = isForum && !threadId;\n\n if(threadId && !this.isForum) {\n options.type = 'discussion';\n }\n\n const type = options.type ?? 'chat';\n this.setType(type);\n\n this.messagesStorageKey = `${this.peerId}_${this.type === 'scheduled' ? 'scheduled' : 'history'}`;\n\n this.container.classList.toggle('no-forwards', this.noForwards);\n\n this.sharedMediaTab = appSidebarRight.createSharedMediaTab();\n this.sharedMediaTabs.push(this.sharedMediaTab);\n\n this.sharedMediaTab.setPeer(peerId, threadId);\n this.input.clearHelper(); // костыль\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n }\n\n public setPeer(options: ChatSetPeerOptions) {\n const {peerId, threadId} = options;\n if(!peerId) {\n this.inited = undefined;\n } else if(!this.inited) {\n if(this.init) {\n this.init(/* peerId */);\n this.init = null;\n }\n\n this.inited = true;\n }\n\n // const appMediaViewer = (window as any).appMediaViewer as AppMediaViewerBase;\n // if(appMediaViewer) {\n // appMediaViewer.close();\n // }\n\n const samePeer = this.appImManager.isSamePeer(this, options);\n if(!samePeer) {\n this.appImManager.dispatchEvent('peer_changing', this);\n this.peerId = peerId || NULL_PEER_ID;\n this.threadId = threadId;\n } else if(this.setPeerPromise) {\n return;\n }\n\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.bubbles.setPeer({samePeer: false, peerId});\n this.peerId = 0;\n this.appImManager.dispatchEvent('peer_changed', this);\n\n appSidebarRight.replaceSharedMediaTab();\n this.destroySharedMediaTab();\n this.sharedMediaTab = undefined;\n\n return;\n }\n\n this.peerChanged = samePeer;\n\n const bubblesSetPeerPromise = this.bubbles.setPeer({...options, samePeer});\n const setPeerPromise = this.setPeerPromise = bubblesSetPeerPromise.then((result) => {\n return result.promise;\n }).catch(noop).finally(() => {\n if(this.setPeerPromise === setPeerPromise) {\n this.setPeerPromise = null;\n }\n });\n\n return bubblesSetPeerPromise;\n }\n\n public destroySharedMediaTab(tab = this.sharedMediaTab) {\n if(!tab) {\n return;\n }\n\n indexOfAndSplice(this.sharedMediaTabs, tab);\n tab.destroy();\n }\n\n public async setAutoDownloadMedia() {\n this.autoDownload = await getAutoDownloadSettingsByPeerId(this.peerId);\n }\n\n public setMessageId(messageId?: number) {\n return this.setPeer({\n peerId: this.peerId,\n threadId: this.threadId,\n lastMsgId: messageId\n });\n }\n\n public async finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number, startParam?: string) {\n if(this.peerChanged) return;\n\n const peerId = this.peerId;\n this.peerChanged = true;\n this.wasAlreadyUsed = true;\n\n const middleware = this.bubbles.getMiddleware();\n\n this.cleanup(false);\n\n const sharedMediaTab = this.sharedMediaTab;\n\n const callbacksPromise = Promise.all([\n this.topbar.finishPeerChange(isTarget),\n this.bubbles.finishPeerChange(),\n this.input.finishPeerChange(startParam),\n sharedMediaTab.fillProfileElements()\n ]);\n\n const callbacks = await callbacksPromise;\n sharedMediaTab.loadSidebarMedia(true);\n\n if(!middleware()) {\n return;\n }\n\n callbacks.forEach((callback) => {\n callback?.();\n });\n\n appSidebarRight.replaceSharedMediaTab(sharedMediaTab);\n\n this.sharedMediaTabs.filter((tab) => tab !== sharedMediaTab).forEach((tab) => this.destroySharedMediaTab(tab));\n\n this.container.dataset.type = this.type;\n this.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n this.appImManager.dispatchEvent('peer_changed', this);\n }\n\n public getMessage(mid: number) {\n return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey, mid);\n }\n\n public async getMidsByMid(mid: number) {\n return this.managers.appMessagesManager.getMidsByMessage(await this.getMessage(mid));\n }\n\n public getHistoryStorage(ignoreThreadId?: boolean) {\n return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId, ignoreThreadId ? undefined : this.threadId)\n .then((historyStorageTransferable) => {\n return {\n ...historyStorageTransferable,\n history: SlicedArray.fromJSON(historyStorageTransferable.historySerialized)\n }\n });\n }\n\n public getDialogOrTopic() {\n return this.isForum && this.threadId ? this.managers.dialogsStorage.getForumTopic(this.peerId, this.threadId) : this.managers.dialogsStorage.getDialogOnly(this.peerId);\n }\n\n public getHistoryMaxId() {\n return this.getHistoryStorage().then((historyStorage) => historyStorage.maxId);\n }\n\n public async _isAnyGroup(peerId: PeerId) {\n return peerId === rootScope.myId || peerId === REPLIES_PEER_ID || (await this.managers.appPeersManager.isAnyGroup(peerId));\n }\n\n public initSearch(query?: string) {\n if(!this.peerId) return;\n\n if(mediaSizes.isMobile) {\n if(!this.search) {\n this.search = new ChatSearch(this.topbar, this, query);\n } else {\n this.search.setQuery(query);\n }\n } else {\n let tab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(!tab) {\n tab = appSidebarRight.createTab(AppPrivateSearchTab);\n }\n\n tab.open(this.peerId, this.threadId, this.bubbles.onDatePick, query);\n }\n }\n\n public canSend(action?: ChatRights) {\n return this.managers.appMessagesManager.canSendToPeer(this.peerId, this.threadId, action);\n }\n\n public isStartButtonNeeded() {\n return Promise.all([\n this.managers.appPeersManager.isBot(this.peerId),\n this.managers.appMessagesManager.getDialogOnly(this.peerId),\n this.getHistoryStorage(true)\n ]).then(([isBot, dialog, historyStorage]) => {\n return isBot && !dialog && !historyStorage.history.length;\n });\n }\n\n public getMessageSendingParams(): MessageSendingParams {\n return {\n threadId: this.threadId,\n replyToMsgId: this.input.replyToMsgId,\n scheduleDate: this.input.scheduleDate,\n silent: this.input.sendSilent,\n sendAsPeerId: this.input.sendAsPeerId\n };\n }\n\n public isOurMessage(message: Message.message | Message.messageService) {\n return message.fromId === rootScope.myId || (!!message.pFlags.out && this.isMegagroup);\n }\n\n public isOutMessage(message: Message.message | Message.messageService) {\n const fwdFrom = (message as Message.message).fwd_from;\n const isOut = this.isOurMessage(message) && (!fwdFrom || this.peerId !== rootScope.myId);\n return !!isOut;\n }\n\n public isAvatarNeeded(message: Message.message | Message.messageService) {\n return this.isAnyGroup && !this.isOutMessage(message);\n }\n\n public isPinnedMessagesNeeded() {\n return this.type === 'chat' || this.isForum;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {State} from '../config/state';\nimport rootScope from '../lib/rootScope';\n\nexport type ChatAutoDownloadSettings = {\n photo: number,\n video: number,\n file: number\n};\n\nexport default async function getAutoDownloadSettingsByPeerId(peerId: PeerId): Promise {\n let type: keyof State['settings']['autoDownload'];\n\n let photoSizeMax = 0, videoSizeMax = 0, fileSizeMax = 0;\n const settings = rootScope.settings;\n const appPeersManager = rootScope.managers.appPeersManager;\n if(!settings.autoDownloadNew.pFlags.disabled && peerId) {\n if(peerId.isUser()) {\n if(await appPeersManager.isContact(peerId)) {\n type = 'contacts';\n } else {\n type = 'private';\n }\n } else if(await appPeersManager.isBroadcast(peerId)) {\n type = 'channels';\n } else {\n type = 'groups';\n }\n\n if(settings.autoDownload.photo[type]) photoSizeMax = settings.autoDownloadNew.photo_size_max;\n if(settings.autoDownload.video[type]) videoSizeMax = settings.autoDownloadNew.video_size_max;\n if(settings.autoDownload.file[type]) fileSizeMax = settings.autoDownloadNew.file_size_max;\n }\n\n return {\n photo: photoSizeMax,\n video: videoSizeMax,\n file: fileSizeMax\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppImManager} from '../../lib/appManagers/appImManager';\nimport ButtonIcon from '../buttonIcon';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_APPLE, IS_MOBILE} from '../../environment/userAgent';\nimport appNavigationController from '../appNavigationController';\nimport {_i18n} from '../../lib/langPack';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport {MarkdownType} from '../../helpers/dom/getRichElementValue';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport clamp from '../../helpers/number/clamp';\nimport matchUrl from '../../lib/richTextProcessor/matchUrl';\nimport matchUrlProtocol from '../../lib/richTextProcessor/matchUrlProtocol';\nimport hasMarkupInSelection from '../../helpers/dom/hasMarkupInSelection';\n\nexport default class MarkupTooltip {\n public container: HTMLElement;\n private wrapper: HTMLElement;\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\n private linkBackButton: HTMLElement;\n private linkApplyButton: HTMLButtonElement;\n private hideTimeout: number;\n private addedListener = false;\n private waitingForMouseUp = false;\n private linkInput: HTMLInputElement;\n private savedRange: Range;\n private mouseUpCounter: number = 0;\n // private log: ReturnType;\n\n constructor(private appImManager: AppImManager) {\n // this.log = logger('MARKUP');\n }\n\n private init() {\n this.container = document.createElement('div');\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('markup-tooltip-wrapper');\n\n const tools1 = document.createElement('div');\n const tools2 = document.createElement('div');\n tools1.classList.add('markup-tooltip-tools');\n tools2.classList.add('markup-tooltip-tools');\n\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'spoiler', 'link'] as (keyof MarkupTooltip['buttons'])[];\n arr.forEach((c) => {\n const button = ButtonIcon(c, {noRipple: true});\n tools1.append(this.buttons[c] = button);\n\n if(c !== 'link') {\n button.addEventListener('mousedown', (e) => {\n cancelEvent(e);\n this.appImManager.chat.input.applyMarkdown(c);\n this.cancelClosening();\n\n /* this.mouseUpCounter = 0;\n this.setMouseUpEvent(); */\n // this.hide();\n });\n } else {\n attachClickEvent(button, (e) => {\n cancelEvent(e);\n this.showLinkEditor();\n this.cancelClosening();\n });\n }\n });\n\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\n this.linkInput = document.createElement('input');\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\n this.linkInput.classList.add('input-clear');\n this.linkInput.addEventListener('keydown', (e) => {\n const valid = !this.linkInput.value.length || !!matchUrl(this.linkInput.value);// /^(http)|(https):\\/\\//i.test(this.linkInput.value);\n\n if(e.key === 'Enter') {\n if(!valid) {\n if(this.linkInput.classList.contains('error')) {\n this.linkInput.classList.remove('error');\n void this.linkInput.offsetLeft; // reflow\n }\n\n this.linkInput.classList.add('error');\n } else {\n this.applyLink(e);\n }\n }\n });\n\n this.linkInput.addEventListener('input', (e) => {\n const valid = this.isLinkValid();\n\n this.linkInput.classList.toggle('is-valid', valid);\n this.linkInput.classList.remove('error');\n });\n\n this.linkBackButton.addEventListener('mousedown', (e) => {\n // this.log('linkBackButton click');\n cancelEvent(e);\n this.container.classList.remove('is-link');\n // input.value = '';\n this.resetSelection();\n this.setTooltipPosition();\n this.cancelClosening();\n });\n\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\n this.linkApplyButton.addEventListener('mousedown', (e) => {\n // this.log('linkApplyButton click');\n this.applyLink(e);\n });\n\n const applyDiv = document.createElement('div');\n applyDiv.classList.add('markup-tooltip-link-apply-container');\n\n const delimiter1 = document.createElement('span');\n const delimiter2 = document.createElement('span');\n const delimiter3 = document.createElement('span');\n delimiter1.classList.add('markup-tooltip-delimiter');\n delimiter2.classList.add('markup-tooltip-delimiter');\n delimiter3.classList.add('markup-tooltip-delimiter');\n tools1.insertBefore(delimiter1, this.buttons.link);\n applyDiv.append(delimiter3, this.linkApplyButton);\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\n // tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\n\n this.wrapper.append(tools1, tools2);\n this.container.append(this.wrapper);\n document.body.append(this.container);\n\n window.addEventListener('resize', () => {\n this.hide();\n });\n }\n\n public showLinkEditor() {\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\n this.show();\n }\n\n const button = this.buttons.link;\n this.container.classList.add('is-link');\n\n const selection = document.getSelection();\n this.savedRange = selection.getRangeAt(0);\n\n if(button.classList.contains('active')) {\n const startContainer = this.savedRange.startContainer;\n const anchor = startContainer.parentElement as HTMLAnchorElement;\n this.linkInput.value = anchor.href;\n } else {\n this.linkInput.value = '';\n }\n\n this.setTooltipPosition(true);\n\n setTimeout(() => {\n this.linkInput.focus(); // !!! instant focus will break animation\n }, 200);\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\n }\n\n private applyLink(e: Event) {\n cancelEvent(e);\n this.resetSelection();\n let url = this.linkInput.value;\n if(url && !matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n this.appImManager.chat.input.applyMarkdown('link', url);\n setTimeout(() => {\n this.hide();\n }, 0);\n }\n\n private isLinkValid() {\n return !this.linkInput.value.length || !!matchUrl(this.linkInput.value);\n }\n\n private resetSelection(range: Range = this.savedRange) {\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n this.appImManager.chat.input.messageInput.focus();\n }\n\n public hide() {\n // return;\n\n if(this.init) return;\n\n this.container.classList.remove('is-visible');\n // document.removeEventListener('mouseup', this.onMouseUp);\n document.removeEventListener('mouseup', this.onMouseUpSingle);\n this.waitingForMouseUp = false;\n\n appNavigationController.removeByType('markup');\n\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\n this.hideTimeout = window.setTimeout(() => {\n this.hideTimeout = undefined;\n this.container.classList.add('hide');\n this.container.classList.remove('is-link');\n }, 200);\n }\n\n public getActiveMarkupButton() {\n const currentMarkups: Set = new Set();\n\n // const nodes = getSelectedNodes();\n // const parents = [...new Set(nodes.map((node) => node.parentNode))];\n // // if(parents.length > 1 && parents) return [];\n\n // (parents as HTMLElement[]).forEach((node) => {\n // for(const type in markdownTags) {\n // const tag = markdownTags[type as MarkdownType];\n // const closest = node.closest(tag.match + ', [contenteditable=\"true\"]');\n // if(closest !== this.appImManager.chat.input.messageInput) {\n // currentMarkups.add(this.buttons[type as MarkdownType]);\n // }\n // }\n // });\n\n const types = Object.keys(this.buttons) as MarkdownType[];\n const markup = hasMarkupInSelection(types);\n types.forEach((type) => {\n if(markup[type]) {\n currentMarkups.add(this.buttons[type as MarkdownType]);\n }\n });\n\n return [...currentMarkups];\n }\n\n public setActiveMarkupButton() {\n const activeButtons = this.getActiveMarkupButton();\n\n for(const i in this.buttons) {\n // @ts-ignore\n const button = this.buttons[i];\n button.classList.toggle('active', activeButtons.includes(button));\n }\n }\n\n private setTooltipPosition(isLinkToggle = false) {\n const selection = document.getSelection();\n const range = selection.getRangeAt(0);\n\n const bodyRect = document.body.getBoundingClientRect();\n const selectionRect = range.getBoundingClientRect();\n const inputRect = this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();\n\n this.container.style.maxWidth = inputRect.width + 'px';\n\n const visibleRect = getVisibleRect(undefined, this.appImManager.chat.input.messageInput, false, selectionRect);\n\n const selectionTop = visibleRect.rect.top/* selectionRect.top */ + (bodyRect.top * -1);\n\n const currentTools = this.container.classList.contains('is-link') ? this.wrapper.lastElementChild : this.wrapper.firstElementChild;\n\n const sizesRect = currentTools.getBoundingClientRect();\n const top = selectionTop - sizesRect.height - 8;\n\n const minX = inputRect.left;\n const maxX = (inputRect.left + inputRect.width) - Math.min(inputRect.width, sizesRect.width);\n let left: number;\n if(isLinkToggle) {\n const containerRect = this.container.getBoundingClientRect();\n left = clamp(containerRect.left, minX, maxX);\n } else {\n const x = selectionRect.left + (selectionRect.width - sizesRect.width) / 2;\n left = clamp(x, minX, maxX);\n }\n\n /* const isClamped = x !== minX && x !== maxX && (left === minX || left === maxX || this.container.getBoundingClientRect().left >= maxX);\n\n if(isLinkToggle && this.container.classList.contains('is-link') && !isClamped) return; */\n\n this.container.style.transform = `translate3d(${left}px, ${top}px, 0)`;\n }\n\n public show() {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n if(isSelectionEmpty()) {\n this.hide();\n return;\n }\n\n if(this.hideTimeout !== undefined) {\n clearTimeout(this.hideTimeout);\n }\n\n if(this.container.classList.contains('is-visible')) {\n return;\n }\n\n this.setActiveMarkupButton();\n\n this.container.classList.remove('is-link');\n const isFirstShow = this.container.classList.contains('hide');\n if(isFirstShow) {\n this.container.classList.remove('hide');\n this.container.classList.add('no-transition');\n }\n\n this.setTooltipPosition();\n\n if(isFirstShow) {\n void this.container.offsetLeft; // reflow\n this.container.classList.remove('no-transition');\n }\n\n this.container.classList.add('is-visible');\n\n if(!IS_MOBILE) {\n appNavigationController.pushItem({\n type: 'markup',\n onPop: () => {\n this.hide();\n }\n });\n }\n\n // this.log('selection', selectionRect, activeButton);\n }\n\n /* private onMouseUp = (e: Event) => {\n this.log('onMouseUp');\n if(findUpClassName(e.target, 'markup-tooltip')) return;\n\n this.hide();\n //document.removeEventListener('mouseup', this.onMouseUp);\n }; */\n\n private onMouseUpSingle = (e?: Event) => {\n // this.log('onMouseUpSingle');\n this.waitingForMouseUp = false;\n\n if(IS_TOUCH_SUPPORTED) {\n e && cancelEvent(e);\n if(this.mouseUpCounter++ === 0) {\n this.resetSelection(this.savedRange);\n } else {\n this.hide();\n return;\n }\n }\n\n this.show();\n\n /* !isTouchSupported && document.addEventListener('mouseup', this.onMouseUp); */\n };\n\n public setMouseUpEvent() {\n if(this.waitingForMouseUp) return;\n this.waitingForMouseUp = true;\n\n // this.log('setMouseUpEvent');\n\n document.addEventListener('mouseup', this.onMouseUpSingle, {once: true});\n }\n\n public cancelClosening() {\n if(IS_TOUCH_SUPPORTED && !IS_APPLE) {\n document.removeEventListener('mouseup', this.onMouseUpSingle);\n document.addEventListener('mouseup', (e) => {\n cancelEvent(e);\n this.mouseUpCounter = 1;\n this.waitingForMouseUp = false;\n this.setMouseUpEvent();\n }, {once: true});\n }\n }\n\n public handleSelection() {\n if(this.addedListener) return;\n this.addedListener = true;\n document.addEventListener('selectionchange', (e) => {\n // this.log('selectionchange');\n\n if(document.activeElement === this.linkInput) {\n return;\n }\n\n const messageInput = this.appImManager.chat.input.messageInput;\n if(document.activeElement !== messageInput) {\n this.hide();\n return;\n }\n\n const selection = document.getSelection();\n if(isSelectionEmpty(selection)) {\n this.hide();\n return;\n }\n\n if(IS_TOUCH_SUPPORTED) {\n if(IS_APPLE) {\n this.show();\n this.setTooltipPosition(); // * because can skip this in .show();\n } else {\n if(this.mouseUpCounter === 2) {\n this.mouseUpCounter = 0;\n return;\n }\n\n this.savedRange = selection.getRangeAt(0);\n this.setMouseUpEvent();\n /* document.addEventListener('touchend', (e) => {\n cancelEvent(e);\n this.resetSelection(range);\n this.show();\n }, {once: true, passive: false}); */\n }\n } else if(this.container && this.container.classList.contains('is-visible')) {\n this.setActiveMarkupButton();\n this.setTooltipPosition();\n } else if(messageInput.matches(':active')) {\n this.setMouseUpEvent();\n } else {\n this.show();\n }\n });\n\n document.addEventListener('beforeinput', (e) => {\n if(e.inputType === 'historyRedo' || e.inputType === 'historyUndo') {\n e.target.addEventListener('input', () => this.setActiveMarkupButton(), {once: true});\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport generatePathData from '../../helpers/generatePathData';\nimport {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\n\nexport default class ChatDragAndDrop {\n container: HTMLDivElement;\n svg: SVGSVGElement;\n outlineWrapper: HTMLDivElement;\n path: SVGPathElement;\n\n constructor(appendTo: HTMLElement, private options: {\n icon?: string,\n header: LangPackKey,\n headerArgs?: FormatterArguments,\n subtitle?: LangPackKey,\n onDrop: (e: DragEvent) => void\n }) {\n this.container = document.createElement('div');\n this.container.classList.add('drop', 'z-depth-1');\n\n this.outlineWrapper = document.createElement('div');\n this.outlineWrapper.classList.add('drop-outline-wrapper');\n\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.classList.add('drop-outline');\n\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n this.path.classList.add('drop-outline-path');\n\n let dropIcon: HTMLElement;\n if(options.icon) {\n dropIcon = document.createElement('div');\n dropIcon.classList.add('drop-icon', 'tgico-' + options.icon);\n }\n\n const dropHeader = document.createElement('div');\n dropHeader.classList.add('drop-header');\n dropHeader.append(i18n(options.header, options.headerArgs));\n\n let dropSubtitle: HTMLElement;\n if(options.subtitle) {\n dropSubtitle = document.createElement('div');\n dropSubtitle.classList.add('drop-subtitle');\n dropSubtitle.append(i18n(options.subtitle));\n }\n\n this.svg.append(this.path);\n this.outlineWrapper.append(this.svg);\n\n this.container.append(...[this.outlineWrapper, dropIcon, dropHeader, dropSubtitle].filter(Boolean));\n appendTo.append(this.container);\n\n this.container.addEventListener('dragover', this.onDragOver);\n this.container.addEventListener('dragleave', this.onDragLeave);\n this.container.addEventListener('drop', this.onDrop);\n }\n\n onDragOver = (e: DragEvent) => {\n this.container.classList.add('is-dragover');\n // SetTransition(this.container, 'is-dragover', true, 500);\n };\n\n onDragLeave = (e: DragEvent) => {\n this.container.classList.remove('is-dragover');\n // SetTransition(this.container, 'is-dragover', false, 500);\n };\n\n onDrop = (e: DragEvent) => {\n this.options.onDrop(e);\n };\n\n destroy() {\n delete this.options;\n this.container.remove();\n this.container.removeEventListener('dragover', this.onDragOver);\n this.container.removeEventListener('dragleave', this.onDragLeave);\n this.container.removeEventListener('drop', this.onDrop);\n }\n\n setPath() {\n const rect = this.outlineWrapper.getBoundingClientRect();\n this.svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\n this.svg.setAttributeNS(null, 'viewBox', `0 0 ${rect.width} ${rect.height}`);\n this.svg.setAttributeNS(null, 'width', `${rect.width}`);\n this.svg.setAttributeNS(null, 'height', `${rect.height}`);\n\n const radius = 10;\n // const strokeWidth = 2;\n const sizeX = rect.width - radius;\n const sizeY = rect.height - radius;\n const pos = radius / 2;\n const d = generatePathData(pos, pos, sizeX, sizeY, radius, radius, radius, radius);\n this.path.setAttributeNS(null, 'd', d);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {doubleRaf} from '../schedulers';\n\nexport default function disableTransition(elements: HTMLElement[]) {\n elements.forEach((el) => el.classList.add('no-transition'));\n\n doubleRaf().then(() => {\n elements.forEach((el) => el.classList.remove('no-transition'));\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport const MAX_SPEED = 8.2;\nexport const MIN_SPEED = 0.8;\n\n// import { MIN_SPEED, MAX_SPEED } from './BlobDrawable';\n\ntype Radius = number[];\n\nexport default class LineBlobDrawable {\n public maxRadius: number;\n public minRadius: number;\n private N: number;\n private radius: Radius;\n private radiusNext: Radius;\n private progress: number[];\n private speed: number[];\n\n constructor(n: number) {\n this.maxRadius = 10;\n this.minRadius = 0;\n\n this.N = n;\n this.radius = new Array(n + 1);\n\n this.radiusNext = new Array(n + 1);\n this.progress = new Array(n + 1);\n this.speed = new Array(n + 1);\n\n for(let i = 0; i <= n; i++) {\n this.generateBlob(this.radius, i);\n this.generateBlob(this.radiusNext, i);\n this.progress[i] = 0;\n }\n }\n\n private generateBlob(radius: Radius, i: number) {\n const {maxRadius, minRadius, speed} = this;\n\n const radDif = maxRadius - minRadius;\n radius[i] = minRadius + Math.random() * radDif;\n speed[i] = 0.017 + 0.003 * Math.random();\n }\n\n private generateNextBlob() {\n const {radius, radiusNext, progress, N} = this;\n for(let i = 0; i < N; i++) {\n this.generateBlob(radius, i);\n this.generateBlob(radiusNext, i);\n progress[i] = 0.0;\n }\n }\n\n public update(amplitude: number, speedScale: number) {\n const {N, progress, speed, radius, radiusNext} = this;\n for(let i = 0; i <= N; i++) {\n progress[i] += (speed[i] * MIN_SPEED) + amplitude * speed[i] * MAX_SPEED * speedScale;\n if(progress[i] >= 1.0) {\n progress[i] = 0.0;\n radius[i] = radiusNext[i];\n this.generateBlob(radiusNext, i);\n }\n }\n }\n\n public draw(left: number, top: number, right: number, bottom: number, canvas: HTMLCanvasElement, paint: (ctx: CanvasRenderingContext2D) => void, pinnedTop: number, progressToPinned: number) {\n if(canvas.getContext) {\n const ctx = canvas.getContext('2d');\n // ctx.globalAlpha = 0.5;\n // ctx.lineWidth = 1;\n\n ctx.beginPath();\n ctx.moveTo(right, bottom);\n ctx.lineTo(left, bottom);\n\n const {radius, radiusNext, N} = this;\n for(let i = 0; i <= N; i++) {\n if(i === 0) {\n const progress = this.progress[i];\n const r1 = radius[i] * (1.0 - progress) + radiusNext[i] * progress;\n const y = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.lineTo(left, y);\n } else {\n const progress = this.progress[i - 1];\n const r1 = radius[i - 1] * (1.0 - progress) + radiusNext[i - 1] * progress;\n const progressNext = this.progress[i];\n const r2 = radius[i] * (1.0 - progressNext) + radiusNext[i] * progressNext;\n const x1 = (right - left) / N * (i - 1);\n const x2 = (right - left) / N * i;\n const cx = x1 + (x2 - x1) / 2;\n\n const y1 = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n const y2 = (top - r2) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.bezierCurveTo(cx, y1, cx, y2, x2, y2);\n if(i === N) {\n ctx.lineTo(right, bottom);\n }\n }\n }\n\n // ctx.scale(1.0, 1.0);\n paint(ctx);\n ctx.fill();\n ctx.closePath();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport GROUP_CALL_STATE from '../lib/calls/groupCallState';\nimport LineBlobDrawable from './lineBlobDrawable';\n\nexport class WeavingState {\n public shader: (ctx: CanvasRenderingContext2D, left: number, top: number, right: number, bottom: number) => void;\n\n constructor(public stateId: GROUP_CALL_STATE) {\n this.createGradient(stateId);\n }\n\n public createGradient(stateId: GROUP_CALL_STATE) {\n this.shader = (ctx, left, top, right, bottom) => {\n ctx.fillStyle = WeavingState.getGradientFromType(ctx, stateId, left, top, right, bottom);\n };\n }\n\n // Android colors\n static getGradientFromType(ctx: CanvasRenderingContext2D, type: GROUP_CALL_STATE, x0: number, y0: number, x1: number, y1: number) {\n const gradient = ctx.createLinearGradient(x0, y0, x1, y1);\n if(type === GROUP_CALL_STATE.MUTED_BY_ADMIN) {\n gradient.addColorStop(0, '#F05459');\n gradient.addColorStop(.4, '#766EE9');\n gradient.addColorStop(1, '#57A4FE');\n } else if(type === GROUP_CALL_STATE.UNMUTED) {\n gradient.addColorStop(0, '#52CE5D');\n gradient.addColorStop(1, '#00B1C0');\n } else if(type === GROUP_CALL_STATE.MUTED) {\n gradient.addColorStop(0, '#0976E3');\n gradient.addColorStop(1, '#2BCEFF');\n } else if(type === GROUP_CALL_STATE.CONNECTING) {\n gradient.addColorStop(0, '#8599aa');\n gradient.addColorStop(1, '#8599aa');\n }\n\n return gradient;\n }\n\n update(height: number, width: number, dt: number, amplitude: number) {\n // TODO: move gradient here\n }\n}\n\nexport default class TopbarWeave {\n private focused: boolean;\n private resizing: boolean;\n private lastUpdateTime: number;\n private amplitude: number;\n private amplitude2: number;\n\n private states: Map;\n private previousState: WeavingState;\n private currentState: WeavingState;\n private progressToState: number;\n\n private scale: number;\n private left: number;\n private top: number;\n private right: number;\n private bottom: number;\n\n private mounted: boolean;\n private media: MediaQueryList;\n\n private container: HTMLDivElement;\n private canvas: HTMLCanvasElement;\n\n private resizeHandler: number;\n private raf: number;\n\n private lbd: LineBlobDrawable;\n private lbd1: LineBlobDrawable;\n private lbd2: LineBlobDrawable;\n\n private animateToAmplitude: number;\n private animateAmplitudeDiff: number;\n private animateAmplitudeDiff2: number;\n\n constructor() {\n this.focused = true;\n this.resizing = false;\n this.lastUpdateTime = Date.now();\n this.amplitude = 0.0;\n this.amplitude2 = 0.0;\n\n this.states = new Map([\n [GROUP_CALL_STATE.UNMUTED, new WeavingState(GROUP_CALL_STATE.UNMUTED)],\n [GROUP_CALL_STATE.MUTED, new WeavingState(GROUP_CALL_STATE.MUTED)],\n [GROUP_CALL_STATE.MUTED_BY_ADMIN, new WeavingState(GROUP_CALL_STATE.MUTED_BY_ADMIN)],\n [GROUP_CALL_STATE.CONNECTING, new WeavingState(GROUP_CALL_STATE.CONNECTING)]\n ]);\n this.previousState = null;\n this.currentState = this.states.get(GROUP_CALL_STATE.CONNECTING);\n this.progressToState = 1.0;\n }\n\n public componentDidMount() {\n if(this.mounted) {\n return;\n }\n\n this.mounted = true;\n // window.addEventListener('blur', this.handleBlur);\n // window.addEventListener('focus', this.handleFocus);\n window.addEventListener('resize', this.handleResize);\n this.media = window.matchMedia('screen and (min-resolution: 2dppx)');\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n\n this.setSize();\n this.forceUpdate();\n\n this.lbd = new LineBlobDrawable(3);\n this.lbd1 = new LineBlobDrawable(7);\n this.lbd2 = new LineBlobDrawable(8);\n this.setAmplitude(this.amplitude);\n\n this.draw();\n }\n\n public componentWillUnmount() {\n this.mounted = false;\n // window.removeEventListener('blur', this.handleBlur);\n // window.removeEventListener('focus', this.handleFocus);\n window.removeEventListener('resize', this.handleResize);\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n\n const {canvas} = this;\n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n private setSize() {\n this.scale = window.devicePixelRatio;\n this.top = 20 * this.scale;\n this.right = (this.mounted ? this.container.offsetWidth : 1261) * this.scale;\n this.bottom = (this.mounted ? this.container.offsetHeight : 68) * this.scale;\n this.left = 0 * this.scale;\n this.setCanvasSize();\n }\n\n private setCanvasSize() {\n this.canvas.width = this.right;\n this.canvas.height = this.bottom;\n }\n\n private handleDevicePixelRatioChanged = (e: Event) => {\n this.setSize();\n this.forceUpdate();\n }\n\n private handleResize = () => {\n if(this.resizeHandler) {\n clearTimeout(this.resizeHandler);\n this.resizeHandler = null;\n }\n\n this.resizing = true;\n this.resizeCanvas();\n this.resizeHandler = window.setTimeout(() => {\n this.resizing = false;\n this.invokeDraw();\n }, 250);\n }\n\n private resizeCanvas() {\n this.scale = window.devicePixelRatio;\n this.right = this.container.offsetWidth * this.scale;\n\n this.forceUpdate();\n this.invokeDraw();\n }\n\n public handleFocus = () => {\n this.focused = true;\n this.invokeDraw();\n }\n\n public handleBlur = () => {\n this.focused = false;\n }\n\n private invokeDraw = () => {\n if(this.raf) return;\n\n this.draw();\n }\n\n private draw = (force = false) => {\n this.raf = null;\n if(!this.mounted) {\n return;\n }\n const {lbd, lbd1, lbd2, scale, left, top, right, bottom, currentState, previousState, focused, resizing, canvas} = this;\n if(!focused && !resizing && this.progressToState >= 1.0) {\n return;\n }\n\n // console.log('[top] draw', [focused, resizing, this.mounted]);\n\n const newTime = Date.now();\n let dt = (newTime - this.lastUpdateTime);\n if(dt > 20) {\n dt = 17;\n }\n\n // console.log('draw start', this.amplitude, this.animateToAmplitude);\n if(this.animateToAmplitude !== this.amplitude) {\n this.amplitude += this.animateAmplitudeDiff * dt;\n if(this.animateAmplitudeDiff > 0) {\n if(this.amplitude > this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude < this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n }\n }\n\n if(this.animateToAmplitude !== this.amplitude2) {\n this.amplitude2 += this.animateAmplitudeDiff2 * dt;\n if(this.animateAmplitudeDiff2 > 0) {\n if(this.amplitude2 > this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude2 < this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n }\n }\n\n if(previousState) {\n this.progressToState += dt / 250;\n if(this.progressToState > 1) {\n this.progressToState = 1;\n this.previousState = null;\n }\n }\n\n const {amplitude, amplitude2, progressToState} = this;\n\n const top1 = 6 * amplitude2 * scale;\n const top2 = 6 * amplitude2 * scale;\n\n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n lbd.minRadius = 0;\n lbd.maxRadius = (2 + 2 * amplitude) * scale;\n lbd1.minRadius = 0;\n lbd1.maxRadius = (3 + 9 * amplitude) * scale;\n lbd2.minRadius = 0;\n lbd2.maxRadius = (3 + 9 * amplitude) * scale;\n\n lbd.update(amplitude, 0.3);\n lbd1.update(amplitude, 0.7);\n lbd2.update(amplitude, 0.7);\n\n for(let i = 0; i < 2; i++) {\n if(i === 0 && !previousState) {\n continue;\n }\n\n let alpha = 1;\n let state: WeavingState = null;\n if(i === 0) {\n alpha = 1 - progressToState;\n state = previousState;\n // previousState.setToPaint(paint);\n } else {\n alpha = previousState ? progressToState : 1;\n currentState.update(bottom - top, right - left, dt, amplitude);\n state = currentState;\n // currentState.setToPaint(paint);\n }\n\n const paint1 = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = 0.3 * alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n const paint = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = i === 0 ? 1 : alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n\n lbd1.draw(left, top - top1, right, bottom, canvas, paint1, top, 1.0);\n lbd2.draw(left, top - top2, right, bottom, canvas, paint1, top, 1.0);\n lbd.draw(left, top, right, bottom, canvas, paint, top, 1.0);\n }\n\n if(!force) {\n this.raf = requestAnimationFrame(() => this.draw());\n }\n };\n\n public setCurrentState = (stateId: GROUP_CALL_STATE, animated: boolean) => {\n const {currentState, states} = this;\n\n if(currentState?.stateId === stateId) {\n return;\n }\n\n this.previousState = animated ? currentState : null;\n this.currentState = states.get(stateId);\n this.progressToState = this.previousState ? 0.0 : 1.0;\n };\n\n public setAmplitude(value: number) {\n const {amplitude} = this;\n this.animateToAmplitude = value;\n this.animateAmplitudeDiff = (value - amplitude) / 250;\n this.animateAmplitudeDiff2 = (value - amplitude) / 120;\n }\n\n private forceUpdate() {\n this.setCanvasSize();\n }\n\n public render(className: string) {\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add(className + '-canvas');\n\n container.append(canvas);\n\n return container;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from '../../helpers/noop';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport rootScope from '../rootScope';\nimport lottieLoader, {LottieAssetName} from './lottieLoader';\nimport type RLottiePlayer from './rlottiePlayer';\nimport {RLottieColor} from './rlottiePlayer';\n\nexport type RLottieIconOptions = {\n width: number,\n height: number,\n container?: HTMLElement,\n skipAnimation?: boolean\n};\n\nexport type RLottieIconItemPartOptions = {\n startFrame: number,\n endFrame: number,\n name?: string\n};\n\nexport type RLottieIconItemOptions = {\n name: LottieAssetName,\n parts: RLottieIconItemPartOptions[],\n initFrame?: number,\n player?: RLottiePlayer,\n autoplay?: boolean,\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n};\n\nexport class RLottieIconItemPart implements RLottieIconItemPartOptions {\n public startFrame: number;\n public endFrame: number;\n public name?: string;\n\n constructor(public item: RLottieIconItem, options: RLottieIconItemPartOptions) {\n safeAssign(this, options);\n }\n\n public play(callback?: () => void) {\n return this.item.playPart(this, callback);\n }\n}\n\n// export type RLottieIconItemPart = RLottieIconItemPartOptions;\n\nexport class RLottieIconItem implements RLottieIconItemOptions {\n public name: LottieAssetName;\n public parts: RLottieIconItemPart[];\n public player: RLottiePlayer;\n public initFrame: number;\n public autoplay: boolean;\n public color: RLottieColor;\n public inverseColor: RLottieColor;\n public loadPromise: Promise;\n public onLoadForPart: () => void;\n public onLoadForColor: () => void;\n\n constructor(public icon: RLottieIcon, options: RLottieIconItemOptions) {\n this.autoplay = false;\n\n safeAssign(this, options);\n\n this.parts = this.parts.map((options) => this.createPart(options));\n }\n\n public load() {\n let loadPromise = this.loadPromise;\n if(loadPromise) {\n return loadPromise;\n }\n\n const {container, canvas, width, height} = this.icon;\n loadPromise = lottieLoader.loadAnimationAsAsset({\n container,\n canvas,\n width,\n height,\n group: 'none',\n loop: false,\n autoplay: this.autoplay ?? false,\n initFrame: this.initFrame,\n skipFirstFrameRendering: this.initFrame === undefined,\n color: this.color,\n inverseColor: this.inverseColor\n }, this.name).then((player) => {\n return lottieLoader.waitForFirstFrame(player);\n }).then((player) => {\n this.player = player;\n\n if(this.onLoadForColor) {\n this.onLoadForColor();\n this.onLoadForColor = undefined;\n }\n\n if(this.onLoadForPart) {\n this.onLoadForPart();\n this.onLoadForPart = undefined;\n }\n });\n\n this.loadPromise = loadPromise;\n this.icon.loadPromises.set(this.name, loadPromise);\n return loadPromise;\n }\n\n public createPart(options: RLottieIconItemPartOptions) {\n return new RLottieIconItemPart(this, options);\n }\n\n public getPart(index: string | number | RLottieIconItemPart) {\n if(index instanceof RLottieIconItemPart) return index;\n else if(typeof(index) === 'string') return this.parts.find((part) => part.name === index);\n else return this.parts[index];\n }\n\n public playPart(part: RLottieIconItemPart, callback?: () => void) {\n return this.icon.playPart(this, part, callback);\n }\n}\n\nexport default class RLottieIcon {\n public container: HTMLElement;\n public canvas: HTMLCanvasElement;\n public width: number;\n public height: number;\n\n protected items: Map;\n public loadPromises: Map>;\n\n protected skipAnimation: boolean;\n\n constructor(options: RLottieIconOptions) {\n safeAssign(this, options);\n\n if(!this.container) this.container = document.createElement('div');\n this.container.classList.add('rlottie-icon');\n\n const {width, height} = this;\n this.container.style.width = width + 'px';\n this.container.style.height = height + 'px';\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = width;\n canvas.height = height;\n\n this.items = new Map();\n this.loadPromises = new Map();\n }\n\n public get loadPromise() {\n return Promise.all([...this.loadPromises.values()]).then(noop);\n }\n\n public getItem(name?: LottieAssetName): RLottieIconItem {\n return !name && this.items.size === 1 ? this.items.values().next().value : this.items.get(name);\n }\n\n public add(options: Omit) {\n const item = new RLottieIconItem(this, options);\n this.items.set(options.name, item);\n\n return item;\n }\n\n public playPart(item: RLottieIconItem, index: Parameters[0], callback?: () => void) {\n if(!item.player) {\n item.onLoadForPart = () => {\n this.playPart(item, index, callback);\n };\n\n return;\n }\n\n const part = item.getPart(index);\n item.player.playPart({\n from: rootScope.settings.animationsEnabled && !this.skipAnimation ? part.startFrame : part.endFrame,\n to: part.endFrame,\n callback\n });\n }\n\n /* public playToPart(item: RLottieIconItem, index: Parameters[0], toEnd: boolean) {\n if(!item.player) return;\n const part = item.getPart(index);\n const toFrame = toEnd ? part.endFrame : part.startFrame;\n item.player.playToFrame({\n frame: toFrame\n });\n } */\n\n public static generateEqualParts(length: number, frameCount: number): RLottieIconItemPartOptions[] {\n return new Array(length).fill(0).map((_, idx) => {\n const startFrame = idx * frameCount;\n return {startFrame, endFrame: startFrame + frameCount - 1};\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from '../helpers/noop';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {LottieAssetName} from '../lib/rlottie/lottieLoader';\nimport RLottieIcon, {RLottieIconItemPartOptions, RLottieIconItemPart} from '../lib/rlottie/rlottieIcon';\nimport {RLottieColor} from '../lib/rlottie/rlottiePlayer';\n\nexport type SuperRLottieIconAddItemOptions = {name: LottieAssetName, parts: RLottieIconItemPartOptions};\nexport type SuperRLottieIconGetInfoResult = RLottieIconItemPart;\nexport class SuperRLottieIcon extends RLottieIcon {\n protected getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult;\n protected getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor;\n\n protected partState: Options['PartState'];\n protected colorState: Options['ColorState'];\n protected loaded: boolean;\n\n constructor(options: {\n width: number,\n height: number,\n skipAnimation?: boolean,\n getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult,\n getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor,\n }) {\n super({\n width: options.width,\n height: options.height\n });\n\n safeAssign(this, options);\n\n // hook the first call\n /* const originalFunction = this.setState.bind(this);\n this.setState = (partState, colorState) => {\n this.setState = originalFunction;\n this.load(partState, colorState);\n return originalFunction(partState, colorState);\n }; */\n }\n\n public load(partState: Options['PartState'], colorState?: Options['ColorState']) {\n if(this.loaded) {\n return this.loadPromise;\n }\n\n this.loaded = true;\n this.partState = partState;\n this.colorState = colorState;\n\n const part = this.getPart(partState);\n const color = colorState !== undefined && this.getColor && this.getColor(colorState);\n\n const item = part.item;\n item.initFrame = part.endFrame;\n item.color = color;\n\n const promises = [...this.items.values()].map((item) => item.load());\n return Promise.all(promises).then(noop);\n }\n\n /**\n * Will redirect setting color state to part callback to synchronize the rendering\n */\n public setState(partState: Options['PartState'], colorState?: Options['ColorState'], partCallback?: () => void) {\n if(!this.loaded) this.load(partState, colorState);\n\n let changedPartState = false, changedColorState = false;\n if(partState !== undefined) changedPartState = this.setPartState(partState, colorState, partCallback);\n else if(colorState !== undefined) changedColorState = this.setColorState(colorState);\n\n return changedPartState || changedColorState;\n }\n\n public setPartState(state: Options['PartState'], colorState?: Options['ColorState'], callback?: () => void) {\n const {partState: prevState} = this;\n if(prevState === state) {\n return colorState !== undefined ? this.setColorState(colorState) : false;\n }\n\n if(colorState !== undefined) {\n this.setColorState(colorState, false);\n }\n\n this.partState = state;\n\n const part = this.getPart(state, prevState);\n part.play(callback);\n\n return true;\n }\n\n public setColorState(state: Options['ColorState'], renderIfPaused = true) {\n const {colorState: prevState} = this;\n if(prevState === state || !this.getColor) {\n return false;\n }\n\n this.colorState = state;\n\n const item = this.getItem();\n const color = this.getColor(state, prevState);\n const invoke = () => {\n item.player.setColor(color, renderIfPaused);\n };\n\n if(item.player) {\n invoke();\n } else {\n item.onLoadForColor = invoke;\n }\n\n return true;\n }\n\n public destroy() {\n this.items.forEach((item) => {\n item.loadPromise.then(() => {\n item.player.remove();\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {RLottieIconItemPartOptions} from '../../lib/rlottie/rlottieIcon';\nimport {GROUP_CALL_MICROPHONE_BUTTON_STATE} from '.';\nimport {SuperRLottieIcon} from '../superIcon';\n\nexport default class GroupCallMicrophoneIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_MICROPHONE_BUTTON_STATE\n}> {\n constructor() {\n super({\n width: 36,\n height: 36,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n let partName: string;\n switch(state) {\n case states.HAND:\n partName = prevState === states.MUTED ? 'muted-to-hand' : 'unmuted-to-hand';\n break;\n case states.MUTED:\n partName = prevState === states.HAND ? 'hand-to-muted' : 'mute';\n break;\n case states.UNMUTED:\n partName = 'unmute';\n break;\n }\n\n return this.getItem().getPart(partName);\n }\n });\n\n const className = 'group-call-microphone-icon';\n this.container.classList.add(className + '-container');\n\n const parts: RLottieIconItemPartOptions[] = [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 172,\n name: 'unmuted-to-hand'\n }, {\n startFrame: 173,\n endFrame: 201,\n name: 'scheduled-crossing'\n }, {\n startFrame: 202,\n endFrame: 236,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 237,\n endFrame: 273,\n name: 'scheduled-to-hand'\n }, {\n startFrame: 274,\n endFrame: 310,\n name: 'scheduled-crossed-to-hand'\n }, {\n startFrame: 311,\n endFrame: 343,\n name: 'scheduled-uncrossing'\n }, {\n startFrame: 344,\n endFrame: 375,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 376,\n endFrame: 403,\n name: 'play-to-muted'\n }];\n\n this.add({\n name: 'voip_filled',\n parts\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport RLottieIcon from '../../lib/rlottie/rlottieIcon';\nimport {GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, GROUP_CALL_PARTICIPANT_MUTED_STATE, getColorByMutedState, clearMutedStateModifier} from '.';\nimport {SuperRLottieIcon} from '../superIcon';\n\nexport default class GroupCallParticipantMutedIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE,\n ColorState: GROUP_CALL_PARTICIPANT_MUTED_STATE\n}> {\n constructor(private colored: boolean) {\n super({\n width: 32,\n height: 32,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n\n let index: number;\n switch(state) {\n case states.HAND:\n index = 3;\n break;\n case states.MUTED:\n index = prevState === states.HAND ? 0 : 2;\n break;\n case states.UNMUTED:\n index = 1;\n break;\n }\n\n return this.getItem().getPart(index);\n },\n getColor: colored ? (state, prevState) => {\n return getColorByMutedState(state);\n } : undefined\n });\n\n const className = 'group-call-participant-muted-icon';\n this.container.classList.add(className + '-container');\n\n const parts = RLottieIcon.generateEqualParts(4, 21);\n this.add({\n name: 'voice_outlined2',\n parts\n });\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n return super.setState(clearMutedStateModifier(state), state);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '../popups';\nimport {hexToRgb} from '../../helpers/color';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport customProperties from '../../helpers/dom/customProperties';\nimport {GroupCall, GroupCallParticipant} from '../../layer';\nimport type {AppChatsManager} from '../../lib/appManagers/appChatsManager';\nimport type {AppGroupCallsManager} from '../../lib/appManagers/appGroupCallsManager';\nimport type {AppPeersManager} from '../../lib/appManagers/appPeersManager';\nimport GROUP_CALL_STATE from '../../lib/calls/groupCallState';\nimport {RLottieColor} from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport ButtonIcon from '../buttonIcon';\nimport GroupCallMicrophoneIcon from './microphoneIcon';\nimport GroupCallParticipantsElement from './participants';\nimport GroupCallParticipantsVideoElement from './participantVideos';\nimport PopupPeer from '../popups/peer';\nimport GroupCallDescriptionElement from './description';\nimport GroupCallTitleElement from './title';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../../helpers/dom/fullScreen';\nimport Scrollable from '../scrollable';\nimport {MovableState} from '../movableElement';\nimport animationIntersector from '../animationIntersector';\nimport {IS_APPLE_MOBILE} from '../../environment/userAgent';\nimport throttle from '../../helpers/schedulers/throttle';\nimport IS_SCREEN_SHARING_SUPPORTED from '../../environment/screenSharingSupport';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport makeButton from '../call/button';\nimport MovablePanel from '../../helpers/movablePanel';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport toggleClassName from '../../helpers/toggleClassName';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport themeController from '../../helpers/themeController';\nimport groupCallsController from '../../lib/calls/groupCallsController';\n\nexport enum GROUP_CALL_PARTICIPANT_MUTED_STATE {\n UNMUTED,\n MUTED,\n MUTED_FOR_ME,\n MUTED_BY_ADMIN,\n HAND\n}\n\nexport type GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE = Exclude;\n\nexport function getGroupCallParticipantMutedState(participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n if(participant.pFlags.muted_by_you) {\n return states.MUTED_FOR_ME;\n } else if(participant.raise_hand_rating !== undefined) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return participant.pFlags.can_self_unmute ? states.MUTED : states.MUTED_BY_ADMIN;\n } else {\n return states.UNMUTED;\n }\n}\n\nexport function clearMutedStateModifier(state: GROUP_CALL_PARTICIPANT_MUTED_STATE): GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n switch(state) {\n case states.MUTED_BY_ADMIN:\n case states.MUTED_FOR_ME:\n return states.MUTED;\n default:\n return state;\n }\n}\n\nexport function getColorByMutedState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n let colorStr: 'blue' | 'green' | 'secondary' | 'red';\n switch(state) {\n case states.HAND:\n colorStr = 'blue';\n break;\n case states.MUTED:\n case states.MUTED_FOR_ME:\n case states.MUTED_BY_ADMIN:\n colorStr = state === states.MUTED ? 'secondary' : 'red';\n break;\n case states.UNMUTED:\n colorStr = 'green';\n break;\n }\n\n const propertyValue = customProperties.getProperty('gc-' + colorStr + '-text-color');\n const color: RLottieColor = hexToRgb(propertyValue);\n\n return color;\n}\n\nexport enum GROUP_CALL_MICROPHONE_BUTTON_STATE {\n HAND,\n MUTED,\n UNMUTED,\n}\n\nexport function getGroupCallMicrophoneButtonState(groupCall: GroupCall.groupCall, participant: GroupCallParticipant) {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n if(!participant.pFlags.can_self_unmute) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return states.MUTED\n } else {\n return states.UNMUTED;\n }\n}\n\nlet previousState: MovableState = {\n width: 420,\n height: 640\n};\n\nconst className = 'group-call';\n\nexport default class PopupGroupCall extends PopupElement {\n private instance: GroupCallInstance;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallBodyHeaderDescription: GroupCallDescriptionElement;\n private groupCallParticipants: GroupCallParticipantsElement;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private groupCallMicrophoneIcon: GroupCallMicrophoneIcon;\n private videosCount: number;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n private btnInvite: HTMLButtonElement;\n private btnShowColumn: HTMLButtonElement;\n private movablePanel: MovablePanel;\n private buttonsContainer: HTMLDivElement;\n private btnFullScreen2: HTMLButtonElement;\n private btnVideo: HTMLDivElement;\n private btnScreen: HTMLDivElement;\n\n constructor() {\n super('popup-group-call', {\n body: true,\n withoutOverlay: true,\n closable: true,\n title: true\n });\n\n this.videosCount = 0;\n this.container.classList.add(className, 'night');\n\n const instance = this.instance = groupCallsController.groupCall;\n const {listenerSetter} = this;\n\n if(!IS_APPLE_MOBILE) {\n const btnFullScreen = this.btnFullScreen = ButtonIcon('fullscreen');\n const btnFullScreen2 = this.btnFullScreen2 = ButtonIcon('fullscreen ' + className + '-cfs');\n const btnExitFullScreen = this.btnExitFullScreen = ButtonIcon('smallscreen');\n\n attachClickEvent(btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(btnFullScreen2, this.onFullScreenClick, {listenerSetter});\n\n attachClickEvent(btnExitFullScreen, () => {\n cancelFullScreen();\n }, {listenerSetter});\n\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n }\n\n const btnInvite = this.btnInvite = ButtonIcon('adduser');\n const btnShowColumn = this.btnShowColumn = ButtonIcon('rightpanel ' + className + '-only-big');\n\n attachClickEvent(btnShowColumn, this.toggleRightColumn, {listenerSetter});\n\n const headerInfo = document.createElement('div');\n headerInfo.classList.add(className + '-header-info');\n\n this.title.classList.add(className + '-header-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-header-subtitle');\n\n headerInfo.append(this.title, subtitle);\n\n this.header.classList.add(className + '-header');\n this.header.append(...[this.btnExitFullScreen, headerInfo/* , btnInvite */, this.btnFullScreen, btnShowColumn].filter(Boolean));\n\n const newHeader = this.header.cloneNode(false) as HTMLElement;\n const newHeaderInfo = headerInfo.cloneNode(false) as HTMLElement;\n const newHeaderTitle = this.title.cloneNode(false) as HTMLElement;\n\n newHeaderInfo.append(newHeaderTitle);\n\n const btnHideColumn = ButtonIcon('rightpanel');\n newHeader.append(...[btnHideColumn, newHeaderInfo, this.btnFullScreen2].filter(Boolean));\n\n attachClickEvent(btnHideColumn, this.toggleRightColumn, {listenerSetter});\n\n this.body.prepend(newHeader);\n\n const videosScrollable = new Scrollable(undefined);\n videosScrollable.container.classList.add('group-call-big-video-container');\n this.container.append(videosScrollable.container);\n\n this.groupCallTitle = new GroupCallTitleElement(this.title);\n this.groupCallDescription = new GroupCallDescriptionElement(subtitle);\n this.groupCallBodyHeaderDescription = new GroupCallDescriptionElement(newHeaderTitle);\n this.constructButtons();\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n appendTo: videosScrollable.container,\n instance,\n listenerSetter,\n displayPinned: true,\n onLengthChange: (length) => {\n this.videosCount = length;\n this.toggleBigLayout();\n },\n managers: this.managers\n });\n this.groupCallParticipants = new GroupCallParticipantsElement({\n appendTo: this.body,\n instance,\n listenerSetter,\n managers: this.managers\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: 400,\n minHeight: 480,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'chatlist') ||\n findUpClassName(target, 'group-call-button') ||\n findUpClassName(target, 'btn-icon') ||\n findUpClassName(target, 'group-call-participants-video-container') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n onResize: () => this.toggleBigLayout(),\n previousState\n });\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n if(this.instance?.id === groupCall.id) {\n this.updateInstance();\n }\n });\n\n listenerSetter.add(instance)('pinned', () => {\n this.setHasPinned();\n });\n\n listenerSetter.add(this.groupCallParticipantsVideo)('toggleControls', this.onToggleControls);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.groupCallParticipantsVideo.destroy();\n this.groupCallParticipants.destroy();\n this.groupCallMicrophoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.toggleRightColumn();\n this.onFullScreenChange();\n\n this.updateInstance();\n }\n\n private constructButtons() {\n const buttons = this.buttonsContainer = document.createElement('div');\n buttons.classList.add(className + '-buttons');\n\n const _makeButton = makeButton.bind(null, className, this.listenerSetter);\n\n const btnVideo = this.btnVideo = _makeButton({\n // text: 'VoiceChat.Video.Stream.Video',\n callback: this.onVideoClick,\n icon: 'videocamera_filled'\n });\n\n const btnScreen = this.btnScreen = _makeButton({\n // text: 'VoiceChat.Video.Stream.Screencast',\n callback: this.onScreenClick,\n icon: 'sharescreen_filled'\n });\n\n btnScreen.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnMute = _makeButton({\n noRipple: true,\n callback: throttle(this.onMuteClick, 600, true)\n });\n btnMute.classList.add(className + '-microphone-button');\n\n const microphoneIcon = this.groupCallMicrophoneIcon = new GroupCallMicrophoneIcon();\n btnMute.append(microphoneIcon.container);\n\n const btnMore = _makeButton({\n // text: 'VoiceChat.Video.Stream.More'\n icon: 'settings_filled'\n });\n\n btnMore.classList.add('btn-disabled');\n btnMore.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnLeave = _makeButton({\n // text: 'VoiceChat.Leave',\n isDanger: true,\n callback: this.onLeaveClick,\n icon: 'close'\n });\n\n buttons.append(btnVideo, btnScreen, btnMute, btnMore, btnLeave);\n\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onToggleControls = (show: boolean) => {\n this.container.classList.toggle('show-controls', show);\n this.buttonsContainer.classList.toggle('show-controls', show);\n };\n\n private toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n private onVideoClick = () => {\n const toggle = this.toggleDisability([this.btnVideo], true);\n this.instance.toggleVideoSharing().finally(() => {\n toggle();\n });\n };\n\n private onScreenClick = () => {\n const toggle = this.toggleDisability([this.btnScreen], true);\n this.instance.toggleScreenSharing().finally(() => {\n toggle();\n });\n };\n\n private onMuteClick = () => {\n const participant = this.instance.participant;\n if(!participant.pFlags.can_self_unmute) {\n if(participant.raise_hand_rating === undefined) {\n this.instance.changeRaiseHand(true);\n }\n } else {\n this.instance.toggleMuted();\n }\n };\n\n private onLeaveClick = async() => {\n const hangUp = (discard: boolean) => {\n this.instance.hangUp(discard);\n };\n\n if(await this.managers.appChatsManager.hasRights(this.instance.chatId, 'manage_call')) {\n new PopupPeer('popup-end-video-chat', {\n titleLangKey: 'VoiceChat.End.Title',\n descriptionLangKey: 'VoiceChat.End.Text',\n checkboxes: [{\n text: 'VoiceChat.End.Third'\n }],\n buttons: [{\n langKey: 'VoiceChat.End.OK',\n callback: (checkboxes) => {\n hangUp(!!checkboxes.size);\n },\n isDanger: true\n }]\n }).show();\n } else {\n hangUp(false);\n }\n };\n\n public getContainer() {\n return this.container;\n }\n\n private onFullScreenChange = () => {\n this.toggleBigLayout();\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations2(isFull);\n\n themeController.setThemeColor(isFull ? '#000000' : undefined);\n }\n };\n\n private toggleBigLayout = () => {\n const isFull = isFullScreen();\n const movable = this.movablePanel?.movable;\n const isBig = (isFull || !!(movable && movable.width >= 680)) && !!this.videosCount;\n\n /* if(!isBig && isFull) {\n cancelFullScreen();\n return;\n } */\n\n const wasBig = this.container.classList.contains('is-big-layout');\n let buttons: HTMLElement[];\n if(isBig && !wasBig) { // fix buttons transition to 0 opacity\n buttons = Array.from(this.buttonsContainer.children) as HTMLElement[];\n buttons.forEach((element) => {\n element.style.opacity = '0';\n });\n\n void this.buttonsContainer.offsetLeft;\n }\n\n this.container.classList.toggle('is-big-layout', isBig);\n this.btnInvite.classList.toggle('hide', isBig);\n this.btnShowColumn.classList.toggle('hide', !isBig);\n\n if(buttons) {\n // window.requestAnimationFrame(() => {\n buttons.forEach((element) => {\n element.style.opacity = '';\n });\n // });\n }\n };\n\n private toggleRightColumn = () => {\n this.container.classList.toggle('is-right-column-shown');\n };\n\n private setHasPinned() {\n this.container.classList.toggle('has-pinned', !!this.instance.pinnedSource);\n }\n\n private updateInstance() {\n if(this.instance.state === GROUP_CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.hide();\n return;\n }\n\n const {participant, groupCall} = this.instance;\n if(!participant) {\n return;\n }\n\n this.setTitle();\n this.setDescription();\n this.setHasPinned();\n\n const microphoneButtonState = getGroupCallMicrophoneButtonState(groupCall as any, participant);\n this.container.dataset.micState = microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.HAND ? 'hand' : (microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.MUTED ? 'muted' : 'unmuted');\n this.groupCallMicrophoneIcon.setState(microphoneButtonState);\n }\n\n private setTitle() {\n this.groupCallTitle.update(this.instance);\n }\n\n private setDescription() {\n this.groupCallDescription.update(this.instance);\n this.groupCallBodyHeaderDescription.update(this.instance);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {GroupCallParticipant} from '../../layer';\nimport {i18n} from '../../lib/langPack';\nimport {GROUP_CALL_PARTICIPANT_MUTED_STATE} from '.';\nimport {GroupCallParticipantVideoType} from './participantVideo';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\n\nconst className = 'group-call-participant-status';\nexport default class GroupCallParticipantStatusElement {\n public container: HTMLElement;\n\n constructor(private withIcons: GroupCallParticipantVideoType[]) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE, participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n const icons = this.withIcons.filter((type) => !!participant[type]).map((type) => {\n const iconClassName = `tgico-${type === 'presentation' ? 'listscreenshare' : 'videocamera_filled'}`;\n const i = document.createElement('i');\n i.classList.add(className + '-icon', className + '-icon-' + type, iconClassName);\n return i;\n });\n\n let element2: HTMLElement, actionClassName: string;\n if(state === states.MUTED_FOR_ME) {\n element2 = i18n('VoiceChat.Status.MutedForYou');\n actionClassName = 'is-muted';\n } else if(state === states.UNMUTED) {\n element2 = i18n('VoiceChat.Status.Speaking');\n actionClassName = 'is-speaking';\n } else if(state === states.HAND) {\n element2 = i18n('VoiceChat.Status.WantsSpeak');\n actionClassName = 'is-waiting';\n } else if(participant.about && !icons.length) {\n setInnerHTML(this.container, wrapEmojiText(participant.about));\n return;\n } else {\n element2 = i18n('VoiceChat.Status.Listening');\n actionClassName = 'is-listening';\n }\n\n const span = document.createElement('span');\n span.classList.add(className, actionClassName);\n span.append(...icons, element2);\n\n replaceContent(this.container, span);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {fastRaf} from '../../helpers/schedulers';\nimport SortedList, {SortedElementBase} from '../../helpers/sortedList';\nimport appDialogsManager, {DialogDom, AppDialogsManager, DialogElementSize} from '../../lib/appManagers/appDialogsManager';\nimport {getGroupCallParticipantMutedState} from '.';\nimport GroupCallParticipantMutedIcon from './participantMutedIcon';\nimport GroupCallParticipantStatusElement from './participantStatus';\nimport type GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport type LazyLoadQueue from '../lazyLoadQueue';\n\ninterface SortedParticipant extends SortedElementBase {\n dom: DialogDom,\n mutedIcon: GroupCallParticipantMutedIcon,\n status: GroupCallParticipantStatusElement\n}\n\nexport default class GroupCallParticipantsList extends SortedList {\n public list: HTMLUListElement;\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected avatarSize: DialogElementSize = 'abitbigger';\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0] = {/* new: true, */dialogSize: 72};\n\n constructor(private instance: GroupCallInstance) {\n super({\n getIndex: async(element) => (await this.instance.getParticipantByPeerId(element.id)).date,\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onElementDestroy(element);\n },\n onUpdate: async(element) => {\n const participant = await this.instance.getParticipantByPeerId(element.id);\n const state = getGroupCallParticipantMutedState(participant);\n\n element.mutedIcon.setState(state);\n element.status.setState(state, participant);\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.dom.listEl, this.list, idx);\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n wrapOptions: {\n lazyLoadQueue: this.lazyLoadQueue\n }\n });\n\n const className = 'group-call-participant';\n dom.listEl.classList.add(className);\n\n const mutedIcon = new GroupCallParticipantMutedIcon(true);\n const status = new GroupCallParticipantStatusElement(['presentation', 'video']);\n replaceContent(dom.lastMessageSpan, status.container);\n dom.listEl.append(mutedIcon.container);\n (base as SortedParticipant).mutedIcon = mutedIcon;\n (base as SortedParticipant).status = status;\n\n /* instance.getParticipantByPeerId(base.id).then((participant) => {\n const mutedState = getGroupCallParticipantMutedState(participant);\n\n mutedIcon.setState(mutedState);\n status.setState(mutedState, participant);\n }); */\n\n (base as SortedParticipant).dom = dom;\n\n return base as SortedParticipant;\n },\n updateElementWith: fastRaf\n });\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n }\n\n public destroy() {\n this.elements.forEach((element) => {\n this.onElementDestroy(element);\n });\n }\n\n protected onElementDestroy(element: SortedParticipant) {\n element.mutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {animate} from '../../helpers/animation';\n\nexport default function callVideoCanvasBlur(video: HTMLVideoElement) {\n const canvas = document.createElement('canvas');\n canvas.classList.add('call-video-blur');\n const size = 16;\n canvas.width = size;\n canvas.height = size;\n\n const ctx = canvas.getContext('2d', {alpha: false});\n ctx.filter = 'blur(2px)';\n const renderFrame = () => {\n ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight, 0, 0, canvas.width, canvas.height);\n };\n\n animate(() => {\n renderFrame();\n return canvas.isConnected;\n });\n\n renderFrame();\n\n return canvas;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GroupCallParticipant} from '../../layer';\nimport type {GroupCallOutputSource} from '../../lib/appManagers/appGroupCallsManager';\nimport {i18n} from '../../lib/langPack';\nimport PeerTitle from '../peerTitle';\nimport {getGroupCallParticipantMutedState} from '.';\nimport GroupCallParticipantMutedIcon from './participantMutedIcon';\nimport GroupCallParticipantStatusElement from './participantStatus';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport callVideoCanvasBlur from '../call/videoCanvasBlur';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nconst className = 'group-call-participant-video';\n\nexport type GroupCallParticipantVideoType = 'video' | 'presentation';\nexport default class GroupCallParticipantVideoElement {\n public container: HTMLElement;\n private peerTitle: PeerTitle;\n private subtitle: HTMLElement;\n private info: HTMLElement;\n private left: HTMLElement;\n private right: HTMLElement;\n private header: HTMLElement;\n private groupCallParticipantMutedIcon: GroupCallParticipantMutedIcon;\n private groupCallParticipantStatus: GroupCallParticipantStatusElement;\n\n constructor(private managers: AppManagers, private instance: GroupCallInstance, public source: GroupCallOutputSource) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n this.info = document.createElement('div');\n this.info.classList.add(className + '-info');\n\n this.left = document.createElement('div');\n this.left.classList.add(className + '-info-left');\n\n this.right = document.createElement('div');\n this.right.classList.add(className + '-info-right');\n\n this.info.append(this.left, this.right);\n\n this.container.append(this.info);\n }\n\n public setPinned(value: boolean) {\n if(!value) {\n if(this.header) {\n this.header.remove();\n this.header = undefined;\n }\n\n return;\n } else if(this.header) {\n return;\n }\n\n // if(!this.header) {\n this.header = document.createElement('div');\n this.header.classList.add(className + '-header');\n\n const icon = document.createElement('i');\n icon.classList.add('group-call-pin-icon', 'tgico-pin');\n this.header.append(icon);\n\n this.container.append(this.header);\n // }\n\n // this.container.classList.toggle('is-pinned', value);\n }\n\n public setParticipant(participant: GroupCallParticipant, type: GroupCallParticipantVideoType, video: HTMLVideoElement) {\n let peerTitleElement: HTMLElement;\n if(participant.pFlags.self) {\n peerTitleElement = i18n('VoiceChat.Status.You');\n peerTitleElement.classList.add('peer-title');\n } else {\n this.peerTitle = new PeerTitle({\n peerId: getPeerId(participant.peer)\n });\n\n peerTitleElement = this.peerTitle.element;\n }\n\n this.groupCallParticipantMutedIcon = new GroupCallParticipantMutedIcon(false);\n this.groupCallParticipantStatus = new GroupCallParticipantStatusElement([type]);\n\n this.left.append(peerTitleElement, this.groupCallParticipantStatus.container);\n\n this.right.append(this.groupCallParticipantMutedIcon.container);\n\n video.classList.add(className, 'call-video');\n\n if(video.paused) {\n video.play();\n }\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(className + '-blur');\n\n this.container.prepend(canvas, video);\n\n this.updateParticipant(participant);\n }\n\n public updateParticipant(participant: GroupCallParticipant) {\n const state = getGroupCallParticipantMutedState(participant);\n\n this.groupCallParticipantMutedIcon.setState(state);\n this.groupCallParticipantStatus.setState(state, participant);\n }\n\n public destroy() {\n this.groupCallParticipantMutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ControlsHover from '../../helpers/dom/controlsHover';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {GroupCallParticipant} from '../../layer';\nimport {GroupCallOutputSource} from '../../lib/appManagers/appGroupCallsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport rootScope from '../../lib/rootScope';\nimport GroupCallParticipantVideoElement, {GroupCallParticipantVideoType} from './participantVideo';\n\nexport default class GroupCallParticipantsVideoElement extends ControlsHover {\n private container: HTMLDivElement;\n private instance: GroupCallInstance;\n private participantsElements: Map>;\n private displayPinned: boolean;\n private containers: Map;\n private onLengthChange: (length: number) => void;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n displayPinned: boolean,\n onLengthChange?: GroupCallParticipantsVideoElement['onLengthChange'],\n managers: AppManagers\n }) {\n super();\n safeAssign(this, options);\n\n const className = 'group-call-participants-video';\n const container = this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n options.appendTo.append(container);\n\n this.participantsElements = new Map();\n this.containers = new Map();\n\n const {listenerSetter} = this;\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n listenerSetter.add(this.instance)('pinned', (source) => {\n this.participantsElements.forEach((map) => {\n map.forEach((element) => {\n this.setElementDisplay(element, source);\n });\n });\n });\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'group-call-participant-video-container');\n if(!container) {\n return;\n }\n\n const element = this.containers.get(container);\n if(this.instance.pinnedSource === element.source) {\n this.instance.unpinAll();\n return;\n }\n\n this.instance.pinSource(element.source);\n }, {listenerSetter});\n\n this.setInstance(this.instance);\n\n this.setup({\n element: container,\n listenerSetter: listenerSetter,\n showOnLeaveToClassName: 'group-call-buttons'\n });\n }\n\n private shouldDisplayElement(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n return this.displayPinned ? !pinnedSource || element.source === pinnedSource : pinnedSource && element.source !== pinnedSource;\n }\n\n private setElementDisplay(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n const shouldDisplay = this.shouldDisplayElement(element, pinnedSource);\n element.container.classList.toggle('video-hidden', !shouldDisplay);\n\n const isPinned = element.source === pinnedSource;\n element.setPinned(isPinned);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = getPeerId(participant.peer);\n const types: GroupCallParticipantVideoType[] = ['video', 'presentation'];\n const hasAnyVideo = types.some((type) => !!participant[type]);\n let participantElements = this.participantsElements.get(peerId);\n if(!hasAnyVideo && !participantElements) {\n return;\n }\n\n if(!participantElements) {\n this.participantsElements.set(peerId, participantElements = new Map());\n }\n\n types.forEach((type) => {\n let element = participantElements.get(type);\n const participantVideo = participant[type];\n if(!!participantVideo === !!element) {\n if(element) {\n element.updateParticipant(participant);\n }\n\n return;\n }\n\n if(participantVideo) {\n const result = this.instance.getVideoElementFromParticipantByType(participant, type);\n if(!result) {\n return;\n }\n\n const {video, source} = result;\n\n element = new GroupCallParticipantVideoElement(this.managers, this.instance, source);\n\n this.containers.set(element.container, element);\n\n this.setElementDisplay(element, this.instance.pinnedSource);\n participantElements.set(type, element);\n element.setParticipant(participant, type, video);\n\n this.container.prepend(element.container);\n } else {\n participantElements.delete(type);\n element.container.remove();\n\n if(!participantElements.size) {\n this.participantsElements.delete(peerId);\n this.containers.delete(element.container);\n element.destroy();\n }\n }\n\n this._onLengthChange();\n });\n }\n\n private _onLengthChange() {\n const length = this.container.childElementCount;\n this.container.dataset.length = '' + length;\n this.container.dataset.layout = length <= 2 ? '1' : (length === 3 ? '3' : '4');\n\n this.onLengthChange && this.onLengthChange(length);\n }\n\n public async setInstance(instance: GroupCallInstance) {\n (await instance.participants).forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.containers.forEach((element) => {\n element.destroy();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupGroupCall from '.';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {addFullScreenListener, isFullScreen} from '../../helpers/dom/fullScreen';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport noop from '../../helpers/noop';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport positionMenu from '../../helpers/positionMenu';\nimport ScrollableLoader from '../../helpers/scrollableLoader';\nimport {GroupCallParticipant} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport rootScope from '../../lib/rootScope';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\nimport confirmationPopup from '../confirmationPopup';\nimport PeerTitle from '../peerTitle';\nimport PopupElement from '../popups';\nimport Scrollable from '../scrollable';\nimport GroupCallParticipantsList from './participantsList';\nimport GroupCallParticipantsVideoElement from './participantVideos';\n\nexport class GroupCallParticipantContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: (peerId: PeerId) => boolean | Promise})[];\n private element: HTMLElement;\n private chatId: ChatId;\n private targetPeerId: PeerId;\n private participant: GroupCallParticipant;\n private instance: GroupCallInstance;\n private canManageCall: boolean;\n private managers: AppManagers;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n onContextElement: HTMLElement,\n managers: AppManagers,\n instance: GroupCallInstance,\n }) {\n this.buttons = [{\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MutePeer',\n verify: () => this.canManageCall && this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmutePeer',\n verify: () => this.canManageCall && !this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MuteForMe',\n verify: () => !this.canManageCall && !this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmuteForMe',\n verify: () => !this.canManageCall && this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'newprivate',\n text: 'VoiceChat.OpenProfile',\n verify: () => true,\n onClick: this.onOpenProfileClick\n }, {\n icon: 'deleteuser danger',\n text: 'VoiceChat.RemovePeer',\n verify: () => this.managers.appChatsManager.hasRights(this.chatId, 'ban_users'),\n onClick: async() => {\n confirmationPopup({\n peerId: this.targetPeerId,\n title: new PeerTitle({peerId: this.targetPeerId}).element,\n descriptionLangKey: await this.managers.appChatsManager.isBroadcast(this.chatId) ? 'VoiceChat.RemovePeer.Confirm.Channel' : 'VoiceChat.RemovePeer.Confirm',\n descriptionLangArgs: [new PeerTitle({peerId: this.targetPeerId}).element],\n button: {\n langKey: 'VoiceChat.RemovePeer.Confirm.OK',\n isDanger: true\n }\n }).then(() => {\n this.managers.appChatsManager.kickFromChat(this.chatId, this.targetPeerId);\n }, noop);\n }\n }];\n\n const {listenerSetter} = options;\n this.managers = options.managers;\n this.instance = options.instance;\n this.chatId = this.instance.chatId;\n\n this.element = ButtonMenuSync({buttons: this.buttons, listenerSetter});\n this.element.classList.add('group-call-participant-menu', 'night');\n\n attachContextMenuListener({\n element: options.onContextElement,\n callback: async(e) => {\n const li = findUpClassName(e.target, 'group-call-participant');\n if(!li) {\n return;\n }\n\n if(this.element.parentElement !== appendTo) {\n appendTo.append(this.element);\n }\n\n cancelEvent(e);\n\n const peerId = this.targetPeerId = li.dataset.peerId.toPeerId();\n this.participant = await this.instance.getParticipantByPeerId(peerId);\n if(this.participant.pFlags.self) {\n return;\n }\n\n this.canManageCall = await this.managers.appChatsManager.hasRights(this.chatId, 'manage_call');\n\n await filterAsync(this.buttons, async(button) => {\n const good = await button.verify(peerId);\n button.element.classList.toggle('hide', !good);\n return good;\n });\n\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, 'right');\n contextMenuController.openBtnMenu(this.element);\n },\n listenerSetter\n });\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n const peerId = getPeerId(participant.peer);\n if(this.targetPeerId === peerId) {\n contextMenuController.close();\n }\n }\n });\n\n let appendTo: HTMLElement = document.body;\n addFullScreenListener(document.body, () => {\n const isFull = isFullScreen();\n appendTo = isFull ? PopupElement.getPopups(PopupGroupCall)[0].getContainer(): document.body;\n\n if(!isFull) {\n contextMenuController.close();\n }\n }, listenerSetter);\n }\n\n private onOpenProfileClick = () => {\n const popup = PopupElement.getPopups(PopupGroupCall)[0];\n if(popup) {\n popup.hide();\n }\n\n appImManager.setInnerPeer({peerId: this.targetPeerId});\n };\n\n private toggleParticipantMuted = (muted: boolean) => {\n this.instance.editParticipant(this.participant, {\n muted\n });\n };\n};\n\nexport default class GroupCallParticipantsElement {\n private container: HTMLDivElement;\n private sortedList: GroupCallParticipantsList;\n private instance: GroupCallInstance;\n private listenerSetter: ListenerSetter;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private contextMenu: GroupCallParticipantContextMenu;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n managers: AppManagers\n }) {\n safeAssign(this, options);\n\n const className = 'group-call-participants';\n\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add(className + '-scrollable');\n\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n // const invite = Button(`btn-primary btn-transparent ${className}-invite`, {icon: 'adduser', text: 'VoiceChat.Invite.InviteMembers'});\n\n const sortedList = this.sortedList = new GroupCallParticipantsList(this.instance);\n\n const {instance, listenerSetter} = this;\n this.contextMenu = new GroupCallParticipantContextMenu({\n ...options,\n onContextElement: sortedList.list,\n listenerSetter,\n instance\n });\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n ...options,\n appendTo: scrollable.container,\n displayPinned: false\n });\n\n scrollable.append(/* invite, */sortedList.list);\n container.append(scrollable.container);\n\n options.appendTo.append(container);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n const scrollableLoader = new ScrollableLoader({\n scrollable,\n getPromise: () => {\n return this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants, isEnd}) => {\n participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n\n return isEnd;\n });\n }\n });\n\n this.setInstance(instance);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = getPeerId(participant.peer);\n const has = this.sortedList.has(peerId);\n if(participant.pFlags.left) {\n if(has) {\n this.sortedList.delete(peerId);\n }\n\n return;\n }\n\n if(!has) {\n this.sortedList.add(peerId);\n return;\n }\n\n this.sortedList.update(peerId);\n }\n\n public async setInstance(instance: GroupCallInstance) {\n // @ts-ignore\n /* const users = appUsersManager.users;\n for(const userId in users) {\n const participant: GroupCallParticipant = {\n _: 'groupCallParticipant',\n date: 0,\n peer: {_: 'peerUser', user_id: userId.toPeerId()},\n pFlags: {\n muted: true\n },\n source: 1\n };\n\n instance.participants.set(userId.toPeerId(), participant);\n this.updateParticipant(participant);\n } */\n const participants = await instance.participants;\n participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.sortedList.destroy();\n this.groupCallParticipantsVideo.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GroupCall} from '../../layer';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport GROUP_CALL_STATE from '../../lib/calls/groupCallState';\nimport I18n, {LangPackKey, FormatterArguments} from '../../lib/langPack';\n\nexport default class GroupCallDescriptionElement {\n private descriptionIntl: I18n.IntlElement;\n\n constructor(private appendTo: HTMLElement) {\n this.descriptionIntl = new I18n.IntlElement({\n key: 'VoiceChat.Status.Connecting'\n });\n\n this.descriptionIntl.element.classList.add('group-call-description');\n }\n\n public detach() {\n this.descriptionIntl.element.remove();\n }\n\n public update(instance: GroupCallInstance) {\n const {state} = instance;\n\n let key: LangPackKey, args: FormatterArguments;\n if(state === GROUP_CALL_STATE.CONNECTING) {\n key = 'VoiceChat.Status.Connecting';\n } else {\n key = 'VoiceChat.Status.Members';\n args = [(instance.groupCall as GroupCall.groupCall).participants_count];\n }\n\n const {descriptionIntl} = this;\n descriptionIntl.compareAndUpdate({\n key,\n args\n });\n\n if(!this.descriptionIntl.element.parentElement) {\n this.appendTo.append(this.descriptionIntl.element);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {GroupCall} from '../../layer';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport PeerTitle from '../peerTitle';\n\nexport default class GroupCallTitleElement {\n private peerTitle: PeerTitle;\n\n constructor(private appendTo: HTMLElement) {\n this.peerTitle = new PeerTitle({peerId: 0});\n }\n\n public update(instance: GroupCallInstance) {\n const {peerTitle, appendTo} = this;\n const groupCall = instance.groupCall as GroupCall.groupCall;\n const peerId = instance.chatId.toPeerId(true);\n if(groupCall.title) {\n setInnerHTML(appendTo, wrapEmojiText(groupCall.title));\n } else {\n if(peerTitle.options.peerId !== peerId) {\n peerTitle.options.peerId = peerId;\n peerTitle.update();\n }\n\n if(peerTitle.element.parentElement !== appendTo) {\n appendTo.append(peerTitle.element);\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport ripple from '../ripple';\n\nexport default function makeButton(className: string, listenerSetter: ListenerSetter, options: {\n text?: LangPackKey | HTMLElement,\n isDanger?: boolean,\n noRipple?: boolean,\n callback?: () => void,\n icon?: string,\n isConfirm?: boolean,\n}) {\n const _className = className + '-button';\n const buttonDiv = document.createElement('div');\n buttonDiv.classList.add(_className, 'call-button', 'rp-overflow');\n\n if(options.icon) {\n buttonDiv.classList.add('tgico-' + options.icon);\n }\n\n if(!options.noRipple) {\n ripple(buttonDiv);\n }\n\n if(options.isDanger) {\n buttonDiv.classList.add(_className + '-red');\n }\n\n if(options.isConfirm) {\n buttonDiv.classList.add(_className + '-green');\n }\n\n if(options.callback) {\n attachClickEvent(buttonDiv, options.callback, {listenerSetter});\n }\n\n let ret = buttonDiv;\n if(options.text) {\n const div = document.createElement('div');\n div.classList.add(_className + '-container', 'call-button-container');\n\n const textEl = typeof(options.text) === 'string' ? i18n(options.text) : options.text;\n textEl.classList.add(_className + '-text', 'call-button-text');\n\n div.append(buttonDiv, textEl);\n\n ret = div;\n }\n\n return ret;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport mediaSizes from '../helpers/mediaSizes';\nimport clamp from '../helpers/number/clamp';\nimport safeAssign from '../helpers/object/safeAssign';\nimport windowSize from '../helpers/windowSize';\nimport SwipeHandler from './swipeHandler';\n\ntype ResizeSide = 'n' | 'e' | 's' | 'w' | 'ne' | 'se' | 'sw' | 'nw';\nexport type MovableState = {\n top?: number;\n left?: number;\n width: number;\n height: number;\n};\n\nconst className = 'movable-element';\nconst resizeHandlerClassName = className + '-resize-handler';\n\nexport type MovableElementOptions = {\n minWidth: MovableElement['minWidth'],\n minHeight: MovableElement['minHeight'],\n element: MovableElement['element'],\n verifyTouchTarget?: MovableElement['verifyTouchTarget']\n};\n\nexport default class MovableElement extends EventListenerBase<{\n resize: () => void\n}> {\n private minWidth: number;\n private minHeight: number;\n private element: HTMLElement;\n private verifyTouchTarget: SwipeHandler['verifyTouchTarget'];\n\n private top: number;\n private left: number;\n private _width: number;\n private _height: number;\n\n private swipeHandler: SwipeHandler;\n private handlers: HTMLElement[];\n\n constructor(options: MovableElementOptions) {\n super(true);\n safeAssign(this, options);\n\n this.top = this.left = this.width = this.height = 0;\n this.element.classList.add(className);\n\n this.addResizeHandlers();\n this.setSwipeHandler();\n\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private onResize = () => {\n this.fixDimensions();\n this.fixPosition();\n this.setPosition();\n };\n\n public destroyElements() {\n this.element.classList.remove(className);\n\n if(this.handlers) {\n this.handlers.forEach((handler) => {\n handler.remove();\n });\n }\n }\n\n public destroy() {\n mediaSizes.removeEventListener('resize', this.onResize);\n this.swipeHandler.removeListeners();\n }\n\n private addResizeHandlers() {\n const sides: ResizeSide[] = ['n', 'e', 's', 'w', 'ne', 'se', 'sw', 'nw'];\n this.handlers = sides.map((side) => {\n const div = document.createElement('div');\n div.dataset.side = side;\n div.classList.add(resizeHandlerClassName, resizeHandlerClassName + '-side-' + side);\n this.element.append(div);\n return div;\n });\n }\n\n private setSwipeHandler() {\n let startTop: number, startLeft: number, startWidth: number, startHeight: number, resizingSide: ResizeSide;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.element,\n onSwipe: (xDiff, yDiff, e) => {\n // console.log(xDiff, yDiff, e);\n\n if(resizingSide) {\n if(resizingSide.includes('e') || resizingSide.includes('w')) {\n const isEnlarging = resizingSide.includes('e') && xDiff > 0 || resizingSide.includes('w') && xDiff < 0;\n const resizeDiff = Math.abs(xDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('e') ? windowSize.width - startLeft : startWidth + startLeft;\n this.width = Math.min(maxPossible, startWidth + resizeDiff);\n }\n\n if(resizingSide.includes('n') || resizingSide.includes('s')) {\n const isEnlarging = resizingSide.includes('s') && yDiff > 0 || resizingSide.includes('n') && yDiff < 0;\n const resizeDiff = Math.abs(yDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('s') ? windowSize.height - startTop : startHeight + startTop;\n this.height = Math.min(maxPossible, startHeight + resizeDiff);\n }\n\n this.fixDimensions();\n\n if(resizingSide.includes('w')) {\n this.left = Math.min(startLeft + startWidth - this.minWidth, startLeft + xDiff);\n }\n\n if(resizingSide.includes('n')) {\n this.top = Math.min(startTop + startHeight - this.minHeight, startTop + yDiff);\n }\n } else {\n this.top = startTop + yDiff;\n this.left = startLeft + xDiff;\n }\n\n this.fixPosition();\n this.setPosition();\n },\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(this.verifyTouchTarget && !this.verifyTouchTarget(e)) {\n return false;\n }\n\n const resizeHandler = findUpClassName(target, resizeHandlerClassName);\n if(resizeHandler) {\n resizingSide = resizeHandler.dataset.side as ResizeSide;\n swipeHandler.setCursor('');\n } else {\n resizingSide = undefined;\n swipeHandler.setCursor('grabbing');\n }\n\n return true;\n },\n onFirstSwipe: () => {\n startTop = this.top;\n startLeft = this.left;\n startWidth = this.width;\n startHeight = this.height;\n }\n });\n }\n\n public setPositionToCenter() {\n this.top = (windowSize.height / 2) - (this.height / 2);\n this.left = (windowSize.width / 2) - (this.width / 2);\n this.setPosition();\n }\n\n private fixDimensions() {\n this.width = clamp(this.width, this.minWidth, windowSize.width);\n this.height = clamp(this.height, this.minHeight, windowSize.height);\n }\n\n private fixPosition() {\n this.top = clamp(this.top, 0, windowSize.height - this.height);\n this.left = clamp(this.left, 0, windowSize.width - this.width);\n }\n\n private setPosition() {\n this.element.style.top = this.top + 'px';\n this.element.style.left = this.left + 'px';\n this.element.style.right = 'auto';\n this.element.style.bottom = 'auto';\n this.element.style.width = this.width + 'px';\n this.element.style.height = this.height + 'px';\n\n this.dispatchEvent('resize');\n }\n\n public get width() {\n return this._width;\n }\n\n public get height() {\n return this._height;\n }\n\n private set width(value: number) {\n this._width = value;\n }\n\n private set height(value: number) {\n this._height = value;\n }\n\n public get state(): MovableState {\n const {top, left, width, height} = this;\n return {\n top,\n left,\n width,\n height\n };\n }\n\n public set state(state: MovableState) {\n const {top, left, width, height} = state;\n this.top = top;\n this.left = left;\n this.width = width;\n this.height = height;\n this.onResize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MovableElement, {MovableElementOptions, MovableState} from '../components/movableElement';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport ListenerSetter from './listenerSetter';\nimport mediaSizes, {ScreenSize} from './mediaSizes';\nimport safeAssign from './object/safeAssign';\n\nexport default class MovablePanel {\n #movable: MovableElement;\n private listenerSetter: ListenerSetter;\n private previousState: MovableState;\n private onResize: () => void;\n private movableOptions: MovableElementOptions;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n previousState: MovableState,\n onResize?: () => void,\n movableOptions: MovableElementOptions\n }) {\n safeAssign(this, options);\n\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n\n this.listenerSetter.add(mediaSizes)('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n }\n });\n }\n\n public destroy() {\n const movable = this.movable;\n if(movable) {\n movable.destroy();\n }\n }\n\n public get movable() {\n return this.#movable;\n }\n\n public get state() {\n return this.movable ? this.movable.state : this.previousState;\n }\n\n public set state(state: MovableState) {\n this.previousState = state;\n }\n\n private toggleMovable(enabled: boolean) {\n let {movable} = this;\n if(enabled) {\n if(movable) {\n return;\n }\n\n movable = this.#movable = new MovableElement(this.movableOptions);\n\n movable.state = this.previousState;\n if(this.previousState.top === undefined) {\n movable.setPositionToCenter();\n }\n\n if(this.onResize) {\n this.listenerSetter.add(movable)('resize', this.onResize);\n }\n } else {\n if(!movable) {\n return;\n }\n\n this.previousState = movable.state;\n movable.destroyElements();\n movable.destroy();\n this.#movable = undefined;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function toggleClassName(className: string, elements: HTMLElement[], disable: boolean) {\n elements.forEach((element) => {\n element.classList.toggle(className, disable);\n });\n\n return () => toggleClassName(className, elements, !disable);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport CALL_STATE from '../../lib/calls/callState';\nimport {i18n, LangPackKey} from '../../lib/langPack';\n\nexport default class CallDescriptionElement {\n private container: HTMLElement;\n private state: CALL_STATE;\n private interval: number;\n\n constructor(private appendTo: HTMLElement) {\n this.container = document.createElement('div');\n this.container.classList.add('call-description');\n }\n\n public detach() {\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n\n this.container.remove();\n this.state = undefined;\n }\n\n public update(instance: any) {\n const {connectionState} = instance;\n\n if(this.state === connectionState) {\n return;\n }\n\n this.state = connectionState;\n\n let element: HTMLElement;\n if(connectionState === CALL_STATE.CONNECTED) {\n element = document.createElement('span');\n element.classList.add('call-description-duration');\n\n const setTime = () => {\n element.innerText = toHHMMSS(instance.duration, true);\n };\n\n this.interval = window.setInterval(setTime, 1000);\n setTime();\n } else {\n let langPackKey: LangPackKey;\n switch(connectionState) {\n case CALL_STATE.PENDING:\n langPackKey = instance.isOutgoing ? 'Call.StatusRinging' : 'Call.StatusCalling';\n break;\n case CALL_STATE.REQUESTING:\n langPackKey = 'Call.StatusRequesting';\n break;\n case CALL_STATE.EXCHANGING_KEYS:\n langPackKey = 'VoipExchangingKeys';\n break;\n case CALL_STATE.CLOSED:\n langPackKey = instance.connectedAt !== undefined ? 'Call.StatusEnded' : 'Call.StatusFailed';\n break;\n default:\n langPackKey = 'Call.StatusConnecting';\n break;\n }\n\n element = i18n(langPackKey);\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n this.container.classList.toggle('has-duration', connectionState === CALL_STATE.CONNECTED);\n replaceContent(this.container, element);\n\n if(!this.container.parentElement) {\n this.appendTo.append(this.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SuperRLottieIcon} from '../superIcon';\n\nexport default class GroupCallMicrophoneIconMini extends SuperRLottieIcon<{\n PartState: boolean,\n ColorState: boolean,\n Items: {\n name: 'voice_mini'\n }[]\n}> {\n constructor(colored?: boolean, skipAnimation?: boolean) {\n super({\n width: 36,\n height: 36,\n getPart: (state) => {\n return this.getItem().getPart(state ? 'unmute' : 'mute');\n },\n getColor: colored ? (state) => {\n return state ? [255, 255, 255] : [158, 158, 158];\n } : undefined,\n skipAnimation\n });\n\n this.add({\n name: 'voice_mini',\n parts: [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 171,\n name: 'unmuted-to-hand'\n }]\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_SCREEN_SHARING_SUPPORTED from '../../environment/screenSharingSupport';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ControlsHover from '../../helpers/dom/controlsHover';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../../helpers/dom/fullScreen';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport MovablePanel from '../../helpers/movablePanel';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport themeController from '../../helpers/themeController';\nimport toggleClassName from '../../helpers/toggleClassName';\nimport CallInstance from '../../lib/calls/callInstance';\nimport CALL_STATE from '../../lib/calls/callState';\nimport I18n, {i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport animationIntersector from '../animationIntersector';\nimport AvatarElement from '../avatar';\nimport ButtonIcon from '../buttonIcon';\nimport GroupCallMicrophoneIconMini from '../groupCall/microphoneIconMini';\nimport {MovableState} from '../movableElement';\nimport PeerTitle from '../peerTitle';\nimport PopupElement from '../popups';\nimport SetTransition from '../singleTransition';\nimport makeButton from './button';\nimport CallDescriptionElement from './description';\nimport callVideoCanvasBlur from './videoCanvasBlur';\n\nconst className = 'call';\n\nconst MIN_WIDTH = 400;\nconst MIN_HEIGHT = 580;\n\nconst INIT_STATE: MovableState = {\n width: MIN_WIDTH,\n height: MIN_HEIGHT\n};\n\nlet previousState: MovableState = {...INIT_STATE};\n\nexport default class PopupCall extends PopupElement {\n private peerId: PeerId;\n\n private description: CallDescriptionElement;\n private emojisSubtitle: HTMLElement;\n\n private partyStates: HTMLElement;\n private partyMutedState: HTMLElement;\n\n private firstButtonsRow: HTMLElement;\n private secondButtonsRow: HTMLElement;\n\n private declineI18nElement: I18n.IntlElement;\n\n private makeButton: (options: Parameters[2]) => HTMLElement;\n private btnAccept: HTMLElement;\n private btnDecline: HTMLElement;\n private btnVideo: HTMLElement;\n private btnScreen: HTMLElement;\n private btnMute: HTMLElement;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n\n private movablePanel: MovablePanel;\n private microphoneIcon: GroupCallMicrophoneIconMini;\n private muteI18nElement: I18n.IntlElement;\n\n private videoContainers: {\n input?: HTMLElement,\n output?: HTMLElement\n };\n\n private controlsHover: ControlsHover;\n\n constructor(private instance: CallInstance) {\n super('popup-call', {\n withoutOverlay: true,\n closable: true\n });\n\n this.videoContainers = {};\n\n const {container, listenerSetter} = this;\n container.classList.add(className, 'night');\n\n const avatarContainer = document.createElement('div');\n avatarContainer.classList.add(className + '-avatar');\n\n const peerId = this.peerId = this.instance.interlocutorUserId.toPeerId();\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-full');\n avatar.updateWithOptions({\n isBig: true,\n peerId: peerId\n });\n avatarContainer.append(avatar);\n\n const title = new PeerTitle({\n peerId\n }).element;\n\n title.classList.add(className + '-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-subtitle');\n\n const description = this.description = new CallDescriptionElement(subtitle);\n\n const emojisSubtitle = this.emojisSubtitle = document.createElement('div');\n emojisSubtitle.classList.add(className + '-emojis');\n\n container.append(avatarContainer, title, subtitle);\n\n if(!IS_MOBILE) {\n this.btnFullScreen = ButtonIcon('fullscreen');\n this.btnExitFullScreen = ButtonIcon('smallscreen hide');\n attachClickEvent(this.btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(this.btnExitFullScreen, () => cancelFullScreen(), {listenerSetter});\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n this.header.prepend(this.btnExitFullScreen);\n this.header.append(this.btnFullScreen);\n\n container.append(emojisSubtitle);\n } else {\n this.header.append(emojisSubtitle);\n }\n\n this.partyStates = document.createElement('div');\n this.partyStates.classList.add(className + '-party-states');\n\n this.partyMutedState = document.createElement('div');\n this.partyMutedState.classList.add(className + '-party-state');\n const stateText = i18n('VoipUserMicrophoneIsOff', [new PeerTitle({peerId, onlyFirstName: true, limitSymbols: 18}).element]);\n stateText.classList.add(className + '-party-state-text');\n const mutedIcon = new GroupCallMicrophoneIconMini(false, true);\n mutedIcon.setState(false, false);\n this.partyMutedState.append(\n mutedIcon.container,\n stateText\n );\n\n this.partyStates.append(this.partyMutedState);\n this.container.append(this.partyStates);\n\n this.makeButton = makeButton.bind(null, className, this.listenerSetter);\n this.constructFirstButtons();\n this.constructSecondButtons();\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(instance)('mediaState', () => {\n this.updateInstance();\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: MIN_WIDTH,\n minHeight: MIN_HEIGHT,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'call-button') ||\n findUpClassName(target, 'btn-icon') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n // onResize: () => this.toggleBigLayout(),\n previousState: !this.instance.wasTryingToJoin && !this.instance.isOutgoing ? {...INIT_STATE} : previousState\n });\n\n const movableElement = this.movablePanel.movable;\n if(movableElement) {\n this.listenerSetter.add(movableElement)('resize', () => {\n this.resizeVideoContainers();\n });\n }\n\n const controlsHover = this.controlsHover = new ControlsHover();\n controlsHover.setup({\n element: this.container,\n listenerSetter: this.listenerSetter,\n showOnLeaveToClassName: 'call-buttons'\n });\n controlsHover.showControls(false);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.microphoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.updateInstance();\n }\n\n public getCallInstance() {\n return this.instance;\n }\n\n private constructFirstButtons() {\n const buttons = this.firstButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-first');\n\n const toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n const btnVideo = this.btnVideo = this.makeButton({\n text: 'Call.Camera',\n icon: 'videocamera_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleVideoSharing().finally(toggle);\n }\n });\n\n const btnScreen = this.btnScreen = this.makeButton({\n text: 'Call.Screen',\n icon: 'sharescreen_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleScreenSharing().finally(toggle);\n }\n });\n\n if(!IS_SCREEN_SHARING_SUPPORTED) {\n btnScreen.classList.add('hide');\n this.container.classList.add('no-screen');\n }\n\n this.muteI18nElement = new I18n.IntlElement({\n key: 'Call.Mute'\n });\n const btnMute = this.btnMute = this.makeButton({\n text: this.muteI18nElement.element,\n callback: () => {\n this.instance.toggleMuted();\n }\n });\n\n const microphoneIcon = this.microphoneIcon = new GroupCallMicrophoneIconMini(true, true);\n btnMute.firstElementChild.append(microphoneIcon.container);\n\n // btnVideo.classList.add('disabled');\n // btnScreen.classList.add('disabled');\n\n buttons.append(btnVideo, btnScreen, btnMute);\n this.container.append(buttons);\n }\n\n private constructSecondButtons() {\n const buttons = this.secondButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-second');\n\n this.declineI18nElement = new I18n.IntlElement({\n key: 'Call.Decline'\n });\n const btnDecline = this.btnDecline = this.makeButton({\n text: this.declineI18nElement.element,\n icon: 'endcall_filled',\n callback: () => {\n this.instance.hangUp('phoneCallDiscardReasonHangup');\n },\n isDanger: true\n });\n\n const btnAccept = this.btnAccept = this.makeButton({\n text: 'Call.Accept',\n icon: 'phone_filled',\n callback: () => {\n this.instance.acceptCall();\n },\n isConfirm: true\n });\n\n buttons.append(btnDecline, btnAccept);\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onFullScreenChange = () => {\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations(isFull);\n\n themeController.setThemeColor(isFull ? '#000000' : undefined);\n\n this.resizeVideoContainers();\n }\n };\n\n private createVideoContainer(video: HTMLVideoElement) {\n const _className = className + '-video';\n const container = document.createElement('div');\n container.classList.add(_className + '-container');\n\n video.classList.add(_className);\n if(video.paused) {\n video.play();\n }\n\n attachClickEvent(container, () => {\n if(!container.classList.contains('small')) {\n return;\n }\n\n const big = Object.values(this.videoContainers).find((container) => !container.classList.contains('small'));\n big.classList.add('small');\n big.style.cssText = container.style.cssText;\n container.classList.remove('small');\n container.style.cssText = '';\n\n this.resizeVideoContainers();\n });\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(_className + '-blur');\n\n container.append(canvas, video);\n\n return container;\n }\n\n private updateInstance() {\n const {instance} = this;\n const {connectionState} = instance;\n if(connectionState === CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.btnVideo.classList.add('disabled');\n\n this.hide();\n return;\n }\n\n const isPendingIncoming = !instance.isOutgoing && connectionState === CALL_STATE.PENDING;\n this.declineI18nElement.compareAndUpdate({\n key: connectionState === CALL_STATE.PENDING ? 'Call.Decline' : 'Call.End'\n });\n this.btnAccept.classList.toggle('disable', !isPendingIncoming);\n this.btnAccept.classList.toggle('hide-me', !isPendingIncoming);\n this.container.classList.toggle('two-button-rows', isPendingIncoming);\n\n const isMuted = instance.isMuted;\n const onFrame = () => {\n this.btnMute.firstElementChild.classList.toggle('active', isMuted);\n };\n\n const player = this.microphoneIcon.getItem().player;\n this.microphoneIcon.setState(!isMuted, !isMuted, onFrame);\n if(!player) {\n onFrame();\n }\n\n this.muteI18nElement.compareAndUpdate({\n key: isMuted ? 'VoipUnmute' : 'Call.Mute'\n });\n\n const isSharingVideo = instance.isSharingVideo;\n this.btnVideo.firstElementChild.classList.toggle('active', isSharingVideo);\n\n const isSharingScreen = instance.isSharingScreen;\n this.btnScreen.firstElementChild.classList.toggle('active', isSharingScreen);\n\n const outputState = instance.getMediaState('output');\n\n SetTransition({\n element: this.partyMutedState,\n className: 'is-visible',\n forwards: !!outputState?.muted,\n duration: 300\n });\n\n const containers = this.videoContainers;\n const oldContainers = {...containers};\n ['input' as const, 'output' as const].forEach((type) => {\n const mediaState = instance.getMediaState(type);\n const video = instance.getVideoElement(type) as HTMLVideoElement;\n\n const hasFrame = !!(video && video.videoWidth && video.videoHeight);\n if(video && !hasFrame && !video.dataset.hasPromise) {\n video.dataset.hasPromise = '1';\n // container.classList.add('hide');\n onMediaLoad(video).then(() => {\n delete video.dataset.hasPromise;\n this.updateInstance();\n // this.resizeVideoContainers();\n // container.classList.remove('hide');\n });\n }\n\n const isActive = !!video && hasFrame && !!(mediaState && (mediaState.videoState === 'active' || mediaState.screencastState === 'active'));\n let videoContainer = containers[type];\n\n if(isActive && video && !videoContainer) {\n videoContainer = containers[type] = this.createVideoContainer(video);\n this.container.append(videoContainer);\n }\n\n if(!isActive && videoContainer) {\n videoContainer.remove();\n delete containers[type];\n }\n });\n\n {\n const input = containers.input;\n const output = containers.output;\n if(Object.keys(oldContainers).length !== Object.keys(containers).length && input) {\n input.classList.toggle('small', !!output);\n }\n\n if(output && !input) {\n output.classList.remove('small');\n }\n }\n\n this.resizeVideoContainers();\n\n this.container.classList.toggle('no-video', !Object.keys(containers).length);\n\n if(!this.emojisSubtitle.textContent && connectionState < CALL_STATE.EXCHANGING_KEYS) {\n Promise.resolve(instance.getEmojisFingerprint()).then((emojis) => {\n replaceContent(this.emojisSubtitle, wrapEmojiText(emojis.join('')));\n });\n }\n\n this.setDescription();\n }\n\n private resizeVideoContainers() {\n Object.values(this.videoContainers).forEach((container) => {\n const isSmall = container.classList.contains('small');\n if(isSmall) {\n const video = container.querySelector('video');\n const popupWidth = this.movablePanel.state;\n const MAX_WIDTH_PX = 240;\n const MAX_HEIGHT_PX = 240;\n\n const isVertical = video.videoHeight > video.videoWidth;\n const MAX_SIZE = isVertical ? MAX_HEIGHT_PX : MAX_WIDTH_PX;\n\n const biggestSideSize = 1 / 3 * (isFullScreen() ? 0xFFFF : (isVertical ? popupWidth.height : popupWidth.width));\n const widthRatio = isVertical ? video.videoWidth / video.videoHeight : 1;\n const heightRatio = isVertical ? 1 : video.videoHeight / video.videoWidth;\n container.style.width = biggestSideSize * widthRatio + 'px';\n container.style.height = biggestSideSize * heightRatio + 'px';\n container.style.maxWidth = MAX_SIZE * widthRatio + 'px';\n container.style.maxHeight = MAX_SIZE * heightRatio + 'px';\n } else {\n container.style.cssText = '';\n }\n });\n }\n\n private setDescription() {\n this.description.update(this.instance);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport GROUP_CALL_STATE from '../lib/calls/groupCallState';\nimport rootScope from '../lib/rootScope';\nimport ButtonIcon from './buttonIcon';\nimport TopbarWeave from './topbarWeave';\nimport SetTransition from './singleTransition';\nimport PopupGroupCall from './groupCall';\nimport GroupCallDescriptionElement from './groupCall/description';\nimport GroupCallTitleElement from './groupCall/title';\nimport PopupElement from './popups';\nimport throttle from '../helpers/schedulers/throttle';\nimport GroupCallInstance from '../lib/calls/groupCallInstance';\nimport CALL_STATE from '../lib/calls/callState';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport PeerTitle from './peerTitle';\nimport CallDescriptionElement from './call/description';\nimport PopupCall from './call';\nimport GroupCallMicrophoneIconMini from './groupCall/microphoneIconMini';\nimport CallInstance from '../lib/calls/callInstance';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport groupCallsController from '../lib/calls/groupCallsController';\nimport StreamManager from '../lib/calls/streamManager';\nimport callsController from '../lib/calls/callsController';\n\nfunction convertCallStateToGroupState(state: CALL_STATE, isMuted: boolean) {\n switch(state) {\n case CALL_STATE.CLOSING:\n case CALL_STATE.CLOSED:\n return GROUP_CALL_STATE.CLOSED;\n case CALL_STATE.CONNECTED:\n return isMuted ? GROUP_CALL_STATE.MUTED : GROUP_CALL_STATE.UNMUTED;\n default:\n return GROUP_CALL_STATE.CONNECTING;\n }\n}\n\nconst CLASS_NAME = 'topbar-call';\n\nexport default class TopbarCall {\n public container: HTMLElement;\n private listenerSetter: ListenerSetter;\n private weave: TopbarWeave;\n private center: HTMLDivElement;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallMicrophoneIconMini: GroupCallMicrophoneIconMini;\n private callDescription: CallDescriptionElement;\n\n private currentDescription: GroupCallDescriptionElement | CallDescriptionElement;\n\n private instance: GroupCallInstance | any/* CallInstance */;\n private instanceListenerSetter: ListenerSetter;\n\n constructor(\n private managers: AppManagers\n ) {\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n listenerSetter.add(callsController)('instance', ({instance}) => {\n if(!this.instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(callsController)('accepting', (instance) => {\n if(this.instance !== instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(groupCallsController)('instance', (instance) => {\n this.updateInstance(instance);\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n const instance = groupCallsController.groupCall;\n if(instance?.id === groupCall.id) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(StreamManager.ANALYSER_LISTENER)('amplitude', ({amplitudes, type}) => {\n const {weave} = this;\n if(!amplitudes.length || !weave/* || type !== 'input' */) return;\n\n let max = 0;\n for(let i = 0; i < amplitudes.length; ++i) {\n const {type, value} = amplitudes[i];\n max = value > max ? value : max;\n }\n\n weave.setAmplitude(max);\n });\n }\n\n private onState = () => {\n this.updateInstance(this.instance);\n };\n\n private clearCurrentInstance() {\n if(!this.instance) return;\n this.center.textContent = '';\n\n if(this.currentDescription) {\n this.currentDescription.detach();\n this.currentDescription = undefined;\n }\n\n this.instance = undefined;\n this.instanceListenerSetter.removeAll();\n }\n\n private updateInstance(instance: TopbarCall['instance']) {\n if(this.construct) {\n this.construct();\n this.construct = undefined;\n }\n\n const isChangingInstance = this.instance !== instance;\n if(isChangingInstance) {\n this.clearCurrentInstance();\n\n this.instance = instance;\n this.instanceListenerSetter = new ListenerSetter();\n\n this.instanceListenerSetter.add(instance as GroupCallInstance)('state', this.onState);\n\n if(instance instanceof GroupCallInstance) {\n this.currentDescription = this.groupCallDescription;\n } else {\n this.currentDescription = this.callDescription;\n this.instanceListenerSetter.add(instance)('muted', this.onState);\n }\n\n this.container.classList.toggle('is-call', !(instance instanceof GroupCallInstance));\n }\n\n const isMuted = this.instance.isMuted;\n const state = instance instanceof GroupCallInstance ? instance.state : convertCallStateToGroupState(instance.connectionState, isMuted);\n\n const {weave} = this;\n\n weave.componentDidMount();\n\n const isClosed = state === GROUP_CALL_STATE.CLOSED;\n if((!document.body.classList.contains('is-calling') || isChangingInstance) || isClosed) {\n if(isClosed) {\n weave.setAmplitude(0);\n }\n\n SetTransition({\n element: document.body,\n className: 'is-calling',\n forwards: !isClosed,\n duration: 250,\n onTransitionEnd: isClosed ? () => {\n weave.componentWillUnmount();\n\n this.clearCurrentInstance();\n } : undefined\n });\n }\n\n if(isClosed) {\n return;\n }\n\n weave.setCurrentState(state, true);\n // if(state === GROUP_CALL_STATE.CONNECTING) {\n // weave.setCurrentState(state, true);\n // } else {\n // /* var a = 0;\n // animate(() => {\n // a += 0.1;\n // if(a > 1) a = 0;\n // weave.setAmplitude(a);\n // return true;\n // });\n // weave.setAmplitude(1); */\n // weave.setCurrentState(state, true);\n // }\n\n this.setTitle(instance);\n this.setDescription(instance);\n this.groupCallMicrophoneIconMini.setState(!isMuted);\n }\n\n private setDescription(instance: TopbarCall['instance']) {\n return this.currentDescription.update(instance as any);\n }\n\n private setTitle(instance: TopbarCall['instance']) {\n if(instance instanceof GroupCallInstance) {\n return this.groupCallTitle.update(instance);\n } else {\n replaceContent(this.center, new PeerTitle({peerId: instance.interlocutorUserId.toPeerId()}).element);\n }\n }\n\n private construct() {\n const {listenerSetter} = this;\n const container = this.container = document.createElement('div');\n container.classList.add('sidebar-header', CLASS_NAME + '-container');\n\n const left = document.createElement('div');\n left.classList.add(CLASS_NAME + '-left');\n\n const groupCallMicrophoneIconMini = this.groupCallMicrophoneIconMini = new GroupCallMicrophoneIconMini();\n\n const mute = ButtonIcon();\n mute.append(groupCallMicrophoneIconMini.container);\n left.append(mute);\n\n const throttledMuteClick = throttle(() => {\n this.instance.toggleMuted();\n }, 600, true);\n\n attachClickEvent(mute, (e) => {\n cancelEvent(e);\n throttledMuteClick();\n }, {listenerSetter});\n\n const center = this.center = document.createElement('div');\n center.classList.add(CLASS_NAME + '-center');\n\n this.groupCallTitle = new GroupCallTitleElement(center);\n this.groupCallDescription = new GroupCallDescriptionElement(left);\n\n this.callDescription = new CallDescriptionElement(left);\n\n const right = document.createElement('div');\n right.classList.add(CLASS_NAME + '-right');\n\n const end = ButtonIcon('endcall_filled');\n right.append(end);\n\n attachClickEvent(end, (e) => {\n cancelEvent(e);\n\n const {instance} = this;\n if(!instance) {\n return;\n }\n\n if(instance instanceof GroupCallInstance) {\n instance.hangUp();\n } else {\n instance.hangUp('phoneCallDiscardReasonHangup');\n }\n }, {listenerSetter});\n\n attachClickEvent(container, () => {\n if(this.instance instanceof GroupCallInstance) {\n if(PopupElement.getPopups(PopupGroupCall).length) {\n return;\n }\n\n new PopupGroupCall().show();\n } else if(this.instance instanceof CallInstance) {\n const popups = PopupElement.getPopups(PopupCall);\n if(popups.find((popup) => popup.getCallInstance() === this.instance)) {\n return;\n }\n\n new PopupCall(this.instance).show();\n }\n }, {listenerSetter});\n\n container.append(left, center, right);\n\n const weave = this.weave = new TopbarWeave();\n const weaveContainer = weave.render(CLASS_NAME + '-weave');\n container.prepend(weaveContainer);\n\n document.getElementById('column-center').prepend(container);\n weave.componentDidMount();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getPeerTitle from '../../components/wrappers/getPeerTitle';\nimport wrapMessageForReply from '../../components/wrappers/messageForReply';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {FontFamily} from '../../config/font';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport IS_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport idleController from '../../helpers/idleController';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport tsNow from '../../helpers/tsNow';\nimport {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport I18n, {FormatterArguments, LangPackKey} from '../langPack';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport singleInstance from '../mtproto/singleInstance';\nimport webPushApiManager, {PushSubscriptionNotify} from '../mtproto/webPushApiManager';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\nimport rootScope from '../rootScope';\nimport appImManager from './appImManager';\nimport appRuntimeManager from './appRuntimeManager';\nimport {AppManagers} from './managers';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport getPeerId from './utils/peers/getPeerId';\n\ntype MyNotification = Notification & {\n hidden?: boolean,\n show?: () => void,\n};\n\nexport type NotifyOptions = Partial<{\n tag: string;\n image: string;\n key: string;\n title: string;\n message: string;\n silent: boolean;\n onclick: () => void;\n noIncrement: boolean;\n}>;\n\nexport type NotificationSettings = {\n nodesktop: boolean,\n volume: number,\n novibrate: boolean,\n nopreview: boolean,\n nopush: boolean,\n nosound: boolean\n};\n\nexport class UiNotificationsManager {\n private notificationsUiSupport: boolean;\n private notificationsShown: {[key: string]: MyNotification | true} = {};\n private notificationIndex = 0;\n private notificationsCount = 0;\n private soundsPlayed: {[tag: string]: number} = {};\n private vibrateSupport = IS_VIBRATE_SUPPORTED;\n private nextSoundAt: number;\n private prevSoundVolume: number;\n\n private faviconElements = Array.from(document.head.querySelectorAll('link[rel=\"icon\"], link[rel=\"alternate icon\"]'));\n\n private titleBackup = document.title;\n private titleChanged = false;\n private titleInterval: number;\n private prevFavicon: string;\n\n private notifySoundEl: HTMLElement;\n\n private stopped = false;\n\n private topMessagesDeferred: CancellablePromise;\n\n private settings: NotificationSettings = {} as any;\n\n private registeredDevice: any;\n private pushInited = false;\n\n private managers: AppManagers;\n private setAppBadge: (contents?: any) => Promise;\n\n construct(managers: AppManagers) {\n this.managers = managers;\n\n navigator.vibrate = navigator.vibrate || (navigator as any).mozVibrate || (navigator as any).webkitVibrate;\n this.setAppBadge = (navigator as any).setAppBadge && (navigator as any).setAppBadge.bind(navigator);\n this.setAppBadge && this.setAppBadge(0);\n\n this.notificationsUiSupport = ('Notification' in window) || ('mozNotification' in navigator);\n\n this.notifySoundEl = document.createElement('div');\n this.notifySoundEl.id = 'notify-sound';\n document.body.append(this.notifySoundEl);\n\n this.topMessagesDeferred = deferredPromise();\n\n singleInstance.addEventListener('deactivated', () => {\n this.stop();\n });\n\n singleInstance.addEventListener('activated', () => {\n if(this.stopped) {\n this.start();\n }\n });\n\n idleController.addEventListener('change', (idle) => {\n if(this.stopped) {\n return;\n }\n\n if(!idle) {\n this.clear();\n }\n\n this.toggleToggler();\n });\n\n rootScope.addEventListener('notification_reset', (peerString) => {\n this.soundReset(peerString);\n });\n\n rootScope.addEventListener('notification_cancel', (str) => {\n this.cancel(str);\n });\n\n if(this.setAppBadge) {\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 0) {\n this.setAppBadge(folder.unreadUnmutedPeerIds.size);\n }\n });\n }\n\n webPushApiManager.addEventListener('push_init', (tokenData) => {\n this.pushInited = true;\n if(!this.settings.nodesktop && !this.settings.nopush) {\n if(tokenData) {\n this.registerDevice(tokenData);\n } else {\n webPushApiManager.subscribe();\n }\n } else {\n this.unregisterDevice(tokenData);\n }\n });\n webPushApiManager.addEventListener('push_subscribe', (tokenData) => {\n this.registerDevice(tokenData);\n });\n webPushApiManager.addEventListener('push_unsubscribe', (tokenData) => {\n this.unregisterDevice(tokenData);\n });\n\n rootScope.addEventListener('dialogs_multiupdate', () => {\n // unregisterTopMsgs()\n this.topMessagesDeferred.resolve();\n }, {once: true});\n\n webPushApiManager.addEventListener('push_notification_click', (notificationData) => {\n if(notificationData.action === 'push_settings') {\n /* this.topMessagesDeferred.then(() => {\n $modal.open({\n templateUrl: templateUrl('settings_modal'),\n controller: 'SettingsModalController',\n windowClass: 'settings_modal_window mobile_modal',\n backdrop: 'single'\n })\n }); */\n return;\n }\n\n if(notificationData.action === 'mute1d') {\n this.managers.apiManager.invokeApi('account.updateDeviceLocked', {\n period: 86400\n }).then(() => {\n // var toastData = toaster.pop({\n // type: 'info',\n // body: _('push_action_mute1d_success'),\n // bodyOutputType: 'trustedHtml',\n // clickHandler: () => {\n // toaster.clear(toastData)\n // },\n // showCloseButton: false\n // })\n });\n\n return;\n }\n\n const peerId = notificationData.custom && notificationData.custom.peerId.toPeerId();\n console.log('click', notificationData, peerId);\n if(peerId) {\n this.topMessagesDeferred.then(async() => {\n if(notificationData.custom.channel_id &&\n !(await this.managers.appChatsManager.hasChat(notificationData.custom.channel_id))) {\n return;\n }\n\n if(peerId.isUser() && !(await this.managers.appUsersManager.hasUser(peerId))) {\n return;\n }\n\n appImManager.setInnerPeer({\n peerId,\n lastMsgId: generateMessageId(+notificationData.custom.msg_id)\n });\n });\n }\n });\n }\n\n public async buildNotification({\n message,\n fwdCount,\n peerReaction,\n peerTypeNotifySettings\n }: {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n }) {\n const peerId = message.peerId;\n const isAnyChat = peerId.isAnyChat();\n const notification: NotifyOptions = {};\n const [peerString, isForum = false] = await Promise.all([\n this.managers.appPeersManager.getPeerString(peerId),\n isAnyChat && this.managers.appPeersManager.isForum(peerId)\n ]);\n let notificationMessage: string;\n let wrappedMessage = false;\n\n if(peerTypeNotifySettings.show_previews) {\n if(message._ === 'message' && message.fwd_from && fwdCount > 1) {\n notificationMessage = I18n.format('Notifications.Forwarded', true, [fwdCount]);\n } else {\n notificationMessage = await wrapMessageForReply({message, plain: true});\n\n const reaction = peerReaction?.reaction;\n if(reaction?._ === 'reactionEmoji') {\n const langPackKey: LangPackKey = /* isAnyChat ? 'Notification.Group.Reacted' : */'Notification.Contact.Reacted';\n const args: FormatterArguments = [\n fixEmoji(reaction.emoticon), // can be plain heart\n notificationMessage\n ];\n\n /* if(isAnyChat) {\n args.unshift(appPeersManager.getPeerTitle(message.fromId, true));\n } */\n\n notificationMessage = I18n.format(langPackKey, true, args);\n } else {\n wrappedMessage = true;\n }\n }\n } else {\n notificationMessage = I18n.format('Notifications.New', true);\n }\n\n if(peerReaction) {\n notification.noIncrement = true;\n notification.silent = true;\n }\n\n const threadId = isForum ? getMessageThreadId(message, isForum) : undefined;\n const notificationFromPeerId = peerReaction ? getPeerId(peerReaction.peer_id) : message.fromId;\n notification.title = await getPeerTitle({peerId, plainText: true, managers: this.managers, threadId: threadId});\n if(isForum) {\n const peerTitle = await getPeerTitle({peerId, plainText: true, managers: this.managers});\n notification.title += ` (${peerTitle})`;\n\n if(wrappedMessage && notificationFromPeerId !== message.peerId) {\n notificationMessage = await getPeerTitle({peerId: notificationFromPeerId, plainText: true, managers: this.managers}) +\n ': ' + notificationMessage;\n }\n } else if(isAnyChat && notificationFromPeerId !== message.peerId) {\n notification.title = await getPeerTitle({peerId: notificationFromPeerId, plainText: true, managers: this.managers}) +\n ' @ ' +\n notification.title;\n }\n\n notification.title = wrapPlainText(notification.title);\n\n notification.onclick = () => {\n appImManager.setInnerPeer({peerId, lastMsgId: message.mid, threadId});\n };\n\n notification.message = notificationMessage;\n notification.key = 'msg' + message.mid;\n notification.tag = peerString;\n notification.silent = true;// message.pFlags.silent || false;\n\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small').then((url) => {\n // ! WARNING, message can be already read\n if(message.pFlags.unread || peerReaction) {\n notification.image = url;\n this.notify(notification);\n }\n });\n } else {\n this.notify(notification);\n }\n }\n\n private toggleToggler(enable = idleController.isIdle) {\n if(IS_MOBILE) return;\n\n const resetTitle = (isBlink?: boolean) => {\n this.titleChanged = false;\n document.title = this.titleBackup;\n this.setFavicon();\n };\n\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n\n if(!enable) {\n resetTitle();\n } else {\n this.titleInterval = window.setInterval(() => {\n const count = this.notificationsCount;\n if(!count) {\n this.toggleToggler(false);\n } else if(this.titleChanged) {\n resetTitle(true);\n } else {\n this.titleChanged = true;\n document.title = I18n.format('Notifications.Count', true, [count]);\n // this.setFavicon('assets/img/favicon_unread.ico');\n\n // fetch('assets/img/favicon.ico')\n // .then((res) => res.blob())\n // .then((blob) => {\n // const img = document.createElement('img');\n // img.src = URL.createObjectURL(blob);\n\n const canvas = document.createElement('canvas');\n canvas.width = 32 * window.devicePixelRatio;\n canvas.height = canvas.width;\n\n const ctx = canvas.getContext('2d');\n ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, 2 * Math.PI, false);\n ctx.fillStyle = '#3390ec';\n ctx.fill();\n\n let fontSize = 24;\n let str = '' + count;\n if(count < 10) {\n fontSize = 22;\n } else if(count < 100) {\n fontSize = 20;\n } else {\n str = '99+';\n fontSize = 16;\n }\n\n fontSize *= window.devicePixelRatio;\n\n ctx.font = `700 ${fontSize}px ${FontFamily}`;\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillStyle = 'white';\n ctx.fillText(str, canvas.width / 2, canvas.height * .5625);\n\n /* const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height); */\n\n this.setFavicon(canvas.toDataURL());\n // });\n }\n }, 1000);\n }\n }\n\n private setFavicon(href?: string) {\n if(this.prevFavicon === href) {\n return;\n }\n\n this.prevFavicon = href;\n this.faviconElements.forEach((element, idx, arr) => {\n const link = element.cloneNode() as HTMLLinkElement;\n\n if(!link.dataset.href) {\n link.dataset.href = link.href;\n }\n\n href ??= link.dataset.href;\n link.href = href;\n element.replaceWith(arr[idx] = link);\n });\n }\n\n public notify(data: NotifyOptions) {\n // console.log('notify', data, rootScope.idle.isIDLE, this.notificationsUiSupport, this.stopped);\n\n if(this.stopped) {\n return;\n }\n\n // FFOS Notification blob src bug workaround\n /* if(Config.Navigator.ffos && !Config.Navigator.ffos2p) {\n data.image = 'https://telegram.org/img/t_logo.png'\n }\n else if (data.image && !angular.isString(data.image)) {\n if (Config.Navigator.ffos2p) {\n FileManager.getDataUrl(data.image, 'image/jpeg').then(function (url) {\n data.image = url\n notify(data)\n })\n return false\n } else {\n data.image = FileManager.getUrl(data.image, 'image/jpeg')\n }\n }\n else */ if(!data.image) {\n data.image = 'assets/img/logo_filled_rounded.png';\n }\n // console.log('notify image', data.image)\n\n if(!data.noIncrement) {\n ++this.notificationsCount;\n }\n\n if(!this.titleInterval) {\n this.toggleToggler();\n }\n\n const idx = ++this.notificationIndex;\n const key = data.key || 'k' + idx;\n this.notificationsShown[key] = true;\n\n const now = tsNow();\n if(this.settings.volume > 0 && !this.settings.nosound/* &&\n (\n !data.tag ||\n !this.soundsPlayed[data.tag] ||\n now > this.soundsPlayed[data.tag] + 60000\n ) */\n ) {\n this.testSound(this.settings.volume);\n this.soundsPlayed[data.tag] = now;\n }\n\n if(!this.notificationsUiSupport ||\n 'Notification' in window && Notification.permission !== 'granted') {\n return false;\n }\n\n if(this.settings.nodesktop) {\n if(this.vibrateSupport && !this.settings.novibrate) {\n navigator.vibrate([200, 100, 200]);\n return;\n }\n\n return;\n }\n\n let notification: MyNotification;\n\n if('Notification' in window) {\n try {\n if(data.tag) {\n for(const i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n if(typeof(notification) !== 'boolean' && notification.tag === data.tag) {\n notification.hidden = true;\n }\n }\n }\n\n notification = new Notification(data.title, {\n icon: data.image || '',\n body: data.message || '',\n tag: data.tag || '',\n silent: data.silent || false\n });\n\n // console.log('notify constructed notification');\n } catch(e) {\n this.notificationsUiSupport = false;\n webPushApiManager.setLocalNotificationsDisabled();\n return;\n }\n } /* else if('mozNotification' in navigator) {\n notification = navigator.mozNotification.createNotification(data.title, data.message || '', data.image || '')\n } else if(notificationsMsSiteMode) {\n window.external.msSiteModeClearIconOverlay()\n window.external.msSiteModeSetIconOverlay('img/icons/icon16.png', data.title)\n window.external.msSiteModeActivate()\n notification = {\n index: idx\n }\n } */ else {\n return;\n }\n\n notification.onclick = () => {\n notification.close();\n appRuntimeManager.focus();\n this.clear();\n if(data.onclick) {\n data.onclick();\n }\n };\n\n notification.onclose = () => {\n if(!notification.hidden) {\n delete this.notificationsShown[key];\n this.clear();\n }\n };\n\n if(notification.show) {\n notification.show();\n }\n this.notificationsShown[key] = notification;\n\n if(!IS_MOBILE) {\n setTimeout(() => {\n this.hide(key);\n }, 8000);\n }\n }\n\n public updateLocalSettings = () => {\n const keys = ['notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush'];\n const promises = keys.map(() => undefined);\n // const promises = keys.map((k) => stateStorage.get(k as any));\n Promise.all(promises)\n .then((updSettings) => {\n this.settings.nodesktop = updSettings[0];\n this.settings.volume = updSettings[1] === undefined ? 0.5 : updSettings[1];\n this.settings.novibrate = updSettings[2];\n this.settings.nopreview = updSettings[3];\n this.settings.nopush = updSettings[4];\n\n if(this.pushInited) {\n const needPush = !this.settings.nopush && !this.settings.nodesktop && webPushApiManager.isAvailable || false;\n const hasPush = this.registeredDevice !== false;\n if(needPush !== hasPush) {\n if(needPush) {\n webPushApiManager.subscribe();\n } else {\n webPushApiManager.unsubscribe();\n }\n }\n }\n\n webPushApiManager.setSettings(this.settings);\n });\n\n apiManagerProxy.getState().then((state) => {\n this.settings.nosound = !state.settings.notifications.sound;\n });\n }\n\n public getLocalSettings() {\n return this.settings;\n }\n\n private hide(key: string) {\n const notification = this.notificationsShown[key];\n if(notification && typeof(notification) !== 'boolean') {\n try {\n if(notification.close) {\n notification.hidden = true;\n notification.close();\n }\n } catch(e) {}\n }\n }\n\n public soundReset(tag: string) {\n delete this.soundsPlayed[tag];\n }\n\n private requestPermission = () => {\n Notification.requestPermission();\n window.removeEventListener('click', this.requestPermission);\n };\n\n public testSound(volume: number) {\n const now = tsNow();\n if(this.nextSoundAt && now < this.nextSoundAt && this.prevSoundVolume === volume) {\n return;\n }\n\n this.nextSoundAt = now + 1000;\n this.prevSoundVolume = volume;\n const filename = 'assets/audio/notification.mp3';\n const audio = document.createElement('audio');\n audio.autoplay = true;\n audio.setAttribute('mozaudiochannel', 'notification');\n audio.volume = volume;\n audio.innerHTML = `\n \n \n `;\n this.notifySoundEl.append(audio);\n\n audio.addEventListener('ended', () => {\n audio.remove();\n }, {once: true});\n }\n\n public cancel(key: string) {\n const notification = this.notificationsShown[key];\n if(notification) {\n if(this.notificationsCount > 0) {\n --this.notificationsCount;\n }\n\n try {\n if(typeof(notification) !== 'boolean' && notification.close) {\n notification.hidden = true;\n notification.close();\n }/* else if(notificationsMsSiteMode &&\n notification.index === notificationIndex) {\n window.external.msSiteModeClearIconOverlay()\n } */\n } catch(e) {}\n\n delete this.notificationsShown[key];\n }\n }\n\n public clear() {\n /* if(notificationsMsSiteMode) {\n window.external.msSiteModeClearIconOverlay()\n } else { */\n for(const i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n try {\n if(typeof(notification) !== 'boolean' && notification.close) {\n notification.close();\n }\n } catch(e) {}\n }\n /* } */\n this.notificationsShown = {};\n this.notificationsCount = 0;\n\n webPushApiManager.hidePushNotifications();\n }\n\n public start() {\n this.updateLocalSettings();\n rootScope.addEventListener('settings_updated', this.updateLocalSettings);\n webPushApiManager.start();\n\n if(!this.notificationsUiSupport) {\n return false;\n }\n\n if('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\n window.addEventListener('click', this.requestPermission);\n }\n\n try {\n if('onbeforeunload' in window) {\n window.addEventListener('beforeunload', this.clear);\n }\n } catch(e) {}\n }\n\n private stop() {\n this.clear();\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n this.setFavicon();\n this.stopped = true;\n }\n\n private registerDevice(tokenData: PushSubscriptionNotify) {\n if(this.registeredDevice && deepEqual(this.registeredDevice, tokenData)) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.registerDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: [],\n app_sandbox: false,\n secret: new Uint8Array()\n }).then(() => {\n this.registeredDevice = tokenData;\n }, (error) => {\n error.handled = true;\n });\n }\n\n private unregisterDevice(tokenData: PushSubscriptionNotify) {\n if(!this.registeredDevice) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.unregisterDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: []\n }).then(() => {\n this.registeredDevice = false;\n }, (error) => {\n error.handled = true;\n });\n }\n}\n\nconst uiNotificationsManager = new UiNotificationsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.uiNotificationsManager = uiNotificationsManager);\nexport default uiNotificationsManager;\n","export default async function getFilesFromEvent(e: ClipboardEvent | DragEvent, onlyTypes = false): Promise {\n const files: any[] = [];\n\n const scanFiles = async(entry: any, item: DataTransferItem) => {\n if(entry.isDirectory) {\n const directoryReader = entry.createReader();\n await new Promise((resolve, reject) => {\n directoryReader.readEntries(async(entries: any) => {\n for(const entry of entries) {\n await scanFiles(entry, item);\n }\n\n resolve();\n });\n });\n } else if(entry) {\n if(onlyTypes) {\n files.push(entry.type);\n } else {\n const itemFile = item.getAsFile(); // * Safari can't handle entry.file with pasting\n const file = entry instanceof File ?\n entry :\n (\n entry instanceof DataTransferItem ?\n entry.getAsFile() :\n await new Promise((resolve, reject) => entry.file(resolve, (err: any) => resolve(itemFile)))\n );\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got file', item, file);\n } */\n\n if(!file) return;\n files.push(file);\n }\n }\n };\n\n if(e instanceof DragEvent && e.dataTransfer.files && !e.dataTransfer.items) {\n for(let i = 0; i < e.dataTransfer.files.length; i++) {\n const file = e.dataTransfer.files[i];\n files.push(onlyTypes ? file.type : file);\n }\n } else {\n // @ts-ignore\n const items = (e.dataTransfer || e.clipboardData || e.originalEvent.clipboardData).items;\n\n const promises: Promise[] = [];\n for(let i = 0; i < items.length; ++i) {\n const item: DataTransferItem = items[i];\n if(item.kind === 'file') {\n const entry = (onlyTypes ? item : item.webkitGetAsEntry()) || item.getAsFile();\n promises.push(scanFiles(entry, item));\n }\n }\n\n await Promise.all(promises);\n }\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got files:', e, files);\n } */\n\n return files;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {T_ME_PREFIXES} from '../lib/mtproto/mtproto_config';\nimport cancelEvent from './dom/cancelEvent';\nimport parseUriParams from './string/parseUriParams';\n\nexport default function addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers' | 'voicechat' | 'joinchat' | 'join' | 'invoice' |\n 'addemoji',\n protocol?: 'tg',\n callback: (params: Params, element?: HTMLAnchorElement) => boolean | any,\n noPathnameParams?: boolean,\n noUriParams?: boolean,\n noCancelEvent?: boolean\n}) {\n (window as any)[(options.protocol ? options.protocol + '_' : '') + options.name] = (element?: HTMLAnchorElement/* , e: Event */) => {\n !options.noCancelEvent && cancelEvent(null);\n\n let href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n const u = new URL(href);\n const match = u.host.match(/(.+?)\\.t(?:elegram)?\\.me/);\n if(match && !T_ME_PREFIXES.has(match[1])) {\n u.pathname = match[1] + (u.pathname === '/' ? '' : u.pathname);\n href = u.toString();\n }\n\n if(!options.noPathnameParams) pathnameParams = new URL(href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {GroupCallId, MyGroupCall} from './appGroupCallsManager';\nimport type GroupCallInstance from '../calls/groupCallInstance';\nimport type CallInstance from '../calls/callInstance';\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport appSidebarLeft, {LEFT_COLUMN_ACTIVE_CLASSNAME} from '../../components/sidebarLeft';\nimport appSidebarRight, {RIGHT_COLUMN_ACTIVE_CLASSNAME} from '../../components/sidebarRight';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {logger, LogTypes} from '../logger';\nimport rootScope from '../rootScope';\nimport Chat, {ChatType} from '../../components/chat/chat';\nimport PopupNewMedia, {getCurrentNewMediaPopup} from '../../components/popups/newMedia';\nimport MarkupTooltip from '../../components/chat/markupTooltip';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport SetTransition from '../../components/singleTransition';\nimport ChatDragAndDrop from '../../components/chat/dragAndDrop';\nimport {doubleRaf} from '../../helpers/schedulers';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport useHeavyAnimationCheck, {dispatchHeavyAnimationEvent} from '../../hooks/useHeavyAnimationCheck';\nimport stateStorage from '../stateStorage';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport appNavigationController from '../../components/appNavigationController';\nimport AppPrivateSearchTab from '../../components/sidebarRight/tabs/search';\nimport I18n, {i18n, join, LangPackKey} from '../langPack';\nimport {ChatFull, ChatInvite, ChatParticipant, ChatParticipants, Message, MessageAction, MessageMedia, SendMessageAction, User, Chat as MTChat, UrlAuthResult, WallPaper} from '../../layer';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer, {PopupPeerCheckboxOptions} from '../../components/popups/peer';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport disableTransition from '../../helpers/dom/disableTransition';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport PopupElement from '../../components/popups';\nimport singleInstance, {InstanceDeactivateReason, SingleInstance} from '../mtproto/singleInstance';\nimport PopupStickers from '../../components/popups/stickers';\nimport PopupJoinChatInvite from '../../components/popups/joinChatInvite';\nimport {toast, toastNew} from '../../components/toast';\nimport debounce from '../../helpers/schedulers/debounce';\nimport pause from '../../helpers/schedulers/pause';\nimport {InternalLink, InternalLinkTypeMap, INTERNAL_LINK_TYPE} from './internalLink';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport {ONE_DAY} from '../../helpers/date';\nimport TopbarCall from '../../components/topbarCall';\nimport confirmationPopup from '../../components/confirmationPopup';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport {CallType} from '../calls/types';\nimport {Modify, SendMessageEmojiInteractionData} from '../../types';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport {simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport PopupCall from '../../components/call';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport ChatBackgroundPatternRenderer from '../../components/chat/patternRenderer';\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport compareVersion from '../../helpers/compareVersion';\nimport {AppManagers} from './managers';\nimport uiNotificationsManager from './uiNotificationsManager';\nimport appMediaPlaybackController from '../../components/appMediaPlaybackController';\nimport {PHONE_NUMBER_REG_EXP} from '../richTextProcessor';\nimport wrapEmojiText from '../richTextProcessor/wrapEmojiText';\nimport wrapRichText, {CustomEmojiRendererElement, renderEmojis} from '../richTextProcessor/wrapRichText';\nimport wrapUrl from '../richTextProcessor/wrapUrl';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getUserStatusString from '../../components/wrappers/getUserStatusString';\nimport getChatMembersString from '../../components/wrappers/getChatMembersString';\nimport {STATE_INIT} from '../../config/state';\nimport CacheStorageController from '../files/cacheStorage';\nimport themeController from '../../helpers/themeController';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport appDialogsManager from './appDialogsManager';\nimport idleController from '../../helpers/idleController';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport groupCallsController from '../calls/groupCallsController';\nimport callsController from '../calls/callsController';\nimport getFilesFromEvent from '../../helpers/files/getFilesFromEvent';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport appRuntimeManager from './appRuntimeManager';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {CLICK_EVENT_NAME} from '../../helpers/dom/clickEvent';\nimport PopupPayment from '../../components/popups/payment';\nimport wrapPeerTitle from '../../components/wrappers/peerTitle';\nimport NBSP from '../../helpers/string/nbsp';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport {MiddleEllipsisElement} from '../../components/middleEllipsis';\nimport addAnchorListener from '../../helpers/addAnchorListener';\nimport parseUriParams from '../../helpers/string/parseUriParams';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {MTAppConfig} from '../mtproto/appConfig';\nimport PopupForward from '../../components/popups/forward';\nimport AppBackgroundTab from '../../components/sidebarLeft/tabs/background';\n\nexport type ChatSavedPosition = {\n mids: number[],\n top: number\n};\n\nexport type ChatSetPeerOptions = {\n peerId: PeerId,\n lastMsgId?: number,\n threadId?: number,\n startParam?: string,\n stack?: number,\n commentId?: number,\n type?: ChatType\n};\n\nexport type ChatSetInnerPeerOptions = Modify;\n\nexport enum APP_TABS {\n CHATLIST,\n CHAT,\n PROFILE\n}\n\nexport class AppImManager extends EventListenerBase<{\n chat_changing: (details: {from: Chat, to: Chat}) => void,\n peer_changed: (chat: Chat) => void,\n peer_changing: (chat: Chat) => void,\n tab_changing: (tabId: number) => void\n}> {\n public columnEl = document.getElementById('column-center') as HTMLDivElement;\n public chatsContainer: HTMLElement;\n\n public offline = false;\n public updateStatusInterval = 0;\n\n public log: ReturnType;\n\n public setPeerPromise: Promise = null;\n\n private tabId: APP_TABS;\n\n public chats: Chat[] = [];\n private prevTab: HTMLElement;\n private chatsSelectTabDebounced: () => void;\n\n public markupTooltip: MarkupTooltip;\n private backgroundPromises: {[slug: string]: Promise};\n\n private topbarCall: TopbarCall;\n public emojiAnimationContainer: HTMLDivElement;\n\n private lastBackgroundUrl: string;\n\n public managers: AppManagers;\n\n public cacheStorage = new CacheStorageController('cachedFiles');\n public customEmojiSize: MediaSize;\n\n get myId() {\n return rootScope.myId;\n }\n\n get chat(): Chat {\n return this.chats[this.chats.length - 1];\n }\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n\n const {\n apiUpdatesManager\n } = managers;\n apiUpdatesManager.attach(I18n.lastRequestedLangCode);\n\n appMediaPlaybackController.construct(managers);\n uiNotificationsManager.construct(managers);\n uiNotificationsManager.start();\n\n this.log = logger('IM', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n\n this.backgroundPromises = {};\n STATE_INIT.settings.themes.forEach((theme) => {\n const themeSettings = theme.settings;\n if(!themeSettings) {\n return;\n }\n\n const {wallpaper} = themeSettings;\n const slug = (wallpaper as WallPaper.wallPaper).slug;\n if(!slug) {\n return;\n }\n\n const url = 'assets/img/' + slug + '.svg' + (IS_FIREFOX ? '?1' : '');\n this.backgroundPromises[slug] = Promise.resolve(url);\n });\n\n this.selectTab(APP_TABS.CHATLIST);\n\n idleController.addEventListener('change', (idle) => {\n this.offline = idle;\n this.updateStatus();\n if(idle) {\n clearInterval(this.updateStatusInterval);\n } else {\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n }\n });\n\n this.chatsContainer = document.createElement('div');\n this.chatsContainer.classList.add('chats-container', 'tabs-container');\n this.chatsContainer.dataset.animation = 'navigation';\n\n this.emojiAnimationContainer = document.createElement('div');\n this.emojiAnimationContainer.classList.add('emoji-animation-container');\n this.appendEmojiAnimationContainer(mediaSizes.activeScreen);\n\n this.columnEl.append(this.chatsContainer);\n\n this.createNewChat();\n this.chatsSelectTab(this.chat.container);\n\n appNavigationController.onHashChange = this.onHashChange;\n // window.addEventListener('hashchange', this.onHashChange);\n\n this.setSettings();\n rootScope.addEventListener('settings_updated', this.setSettings);\n\n const onPremiumToggle = (isPremium: boolean) => {\n document.body.classList.toggle('is-premium', isPremium);\n };\n rootScope.addEventListener('premium_toggle', onPremiumToggle);\n onPremiumToggle(rootScope.premium);\n this.managers.rootScope.getPremium().then(onPremiumToggle);\n\n useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations2(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup();\n animationIntersector.checkAnimations2(false);\n });\n\n themeController.AppBackgroundTab = AppBackgroundTab;\n\n if(IS_FIREFOX && apiManagerProxy.oldVersion && compareVersion(apiManagerProxy.oldVersion, '1.4.3') === -1) {\n this.deleteFilesIterative((response) => {\n return response.headers.get('Content-Type') === 'image/svg+xml';\n }).then(() => {\n this.applyCurrentTheme();\n });\n } else {\n this.applyCurrentTheme();\n }\n\n // * fix simultaneous opened both sidebars, can happen when floating sidebar is opened with left sidebar\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME) &&\n document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\n appSidebarRight.toggleSidebar(false);\n }\n\n this.appendEmojiAnimationContainer(to);\n });\n\n mediaSizes.addEventListener('resize', () => {\n // const perf = performance.now();\n const rect = this.chatsContainer.getBoundingClientRect();\n ChatBackgroundPatternRenderer.resizeInstances(rect.width, rect.height).then(() => {\n // this.log.warn('resize bg time:', performance.now() - perf);\n // for(const chat of this.chats) {\n // if(chat.renderDarkPattern) {\n // chat.renderDarkPattern();\n // }\n // }\n });\n });\n\n this.addEventListener('peer_changing', (chat) => {\n this.saveChatPosition(chat);\n });\n\n rootScope.addEventListener('theme_change', () => {\n this.applyCurrentTheme();\n });\n\n rootScope.addEventListener('choosing_sticker', (choosing) => {\n this.setChoosingStickerTyping(!choosing);\n });\n\n rootScope.addEventListener('peer_title_edit', ({peerId, threadId}) => {\n if(this.chat?.peerId === peerId && !threadId && this.tabId !== undefined) {\n this.overrideHash(peerId);\n }\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const chat = this.chat;\n if(\n !chat ||\n chat.peerId !== peerId ||\n overlayCounter.isOverlayActive || (\n mediaSizes.activeScreen === ScreenSize.mobile &&\n this.tabId !== APP_TABS.CHAT\n )\n ) {\n return;\n }\n\n const typing = typings.find((typing) => typing.action._ === 'sendMessageEmojiInteraction');\n if(typing?.action?._ === 'sendMessageEmojiInteraction') {\n const action = typing.action;\n const bubble = chat.bubbles.bubbles[generateMessageId(typing.action.msg_id)];\n if(bubble && bubble.classList.contains('emoji-big') && getVisibleRect(bubble, chat.bubbles.scrollable.container)) {\n const stickerWrapper: HTMLElement = bubble.querySelector('.media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)');\n\n const data: SendMessageEmojiInteractionData = JSON.parse(action.interaction.data);\n data.a.forEach((a) => {\n setTimeout(() => {\n simulateClickEvent(stickerWrapper);\n }, a.t * 1000);\n });\n\n this.managers.appMessagesManager.setTyping(peerId, {\n _: 'sendMessageEmojiInteractionSeen',\n emoticon: action.emoticon\n });\n }\n }\n });\n\n const onInstanceDeactivated = (reason: InstanceDeactivateReason) => {\n const isUpdated = reason === 'version';\n const popup = new PopupElement('popup-instance-deactivated', {overlayClosable: true});\n const c = document.createElement('div');\n c.classList.add('instance-deactivated-container');\n (popup as any).container.replaceWith(c);\n\n const header = document.createElement('div');\n header.classList.add('header');\n header.append(i18n(isUpdated ? 'Deactivated.Version.Title' : 'Deactivated.Title'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle');\n subtitle.append(i18n(isUpdated ? 'Deactivated.Version.Subtitle' : 'Deactivated.Subtitle'));\n\n c.append(header, subtitle);\n\n document.body.classList.add('deactivated');\n\n const onClose = isUpdated ? () => {\n appRuntimeManager.reload();\n } : () => {\n document.body.classList.add('deactivated-backwards');\n\n singleInstance.activateInstance();\n\n setTimeout(() => {\n document.body.classList.remove('deactivated', 'deactivated-backwards');\n }, 333);\n };\n\n popup.addEventListener('close', onClose);\n popup.show();\n };\n\n singleInstance.addEventListener('deactivated', onInstanceDeactivated);\n if(singleInstance.deactivatedReason) {\n onInstanceDeactivated(singleInstance.deactivatedReason);\n }\n\n // remove scroll listener when setting chat to tray\n this.addEventListener('chat_changing', ({to}) => {\n this.toggleChatGradientAnimation(to);\n });\n\n rootScope.addEventListener('service_notification', (update) => {\n confirmationPopup({\n button: {langKey: 'OK', isCancel: true},\n description: wrapRichText(update.message)\n });\n });\n\n rootScope.addEventListener('payment_sent', async({peerId, mid, receiptMessage}) => {\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n if(!message) {\n return;\n }\n\n const action = receiptMessage.action as MessageAction.messageActionPaymentSent;\n toastNew({\n langPackKey: 'PaymentInfoHint',\n langPackArguments: [\n paymentsWrapCurrencyAmount(action.total_amount, action.currency),\n wrapEmojiText(((message as Message.message).media as MessageMedia.messageMediaInvoice).title)\n ]\n });\n });\n\n (window as any).onSpoilerClick = (e: MouseEvent) => {\n const spoiler = findUpClassName(e.target, 'spoiler');\n const parentElement = findUpClassName(spoiler, 'spoilers-container') || spoiler.parentElement;\n\n const className = 'is-spoiler-visible';\n const isVisible = parentElement.classList.contains(className);\n if(!isVisible) {\n cancelEvent(e);\n\n if(CLICK_EVENT_NAME !== 'click') {\n window.addEventListener('click', cancelEvent, {capture: true, once: true});\n }\n }\n\n const duration = 400 / 2;\n const showDuration = 5000;\n const useRafs = !isVisible ? 2 : 0;\n if(useRafs) {\n parentElement.classList.add('will-change');\n }\n\n const spoilerTimeout = parentElement.dataset.spoilerTimeout;\n if(spoilerTimeout !== null) {\n clearTimeout(+spoilerTimeout);\n delete parentElement.dataset.spoilerTimeout;\n }\n\n SetTransition({\n element: parentElement,\n className,\n forwards: true,\n duration,\n onTransitionEnd: () => {\n parentElement.dataset.spoilerTimeout = '' + window.setTimeout(() => {\n SetTransition({\n element: parentElement,\n className,\n forwards: false,\n duration,\n onTransitionEnd: () => {\n parentElement.classList.remove('will-change');\n delete parentElement.dataset.spoilerTimeout;\n }\n });\n }, showDuration);\n },\n useRafs\n });\n };\n\n rootScope.addEventListener('sticker_updated', ({type, faved}) => {\n if(type === 'faved') {\n toastNew({\n langPackKey: faved ? 'AddedToFavorites' : 'RemovedFromFavorites'\n });\n } else if(!faved) {\n toastNew({\n langPackKey: 'RemovedFromRecent'\n });\n }\n });\n\n apiManagerProxy.addEventListener('notificationBuild', async(options) => {\n const isForum = await this.managers.appPeersManager.isForum(options.message.peerId);\n const threadId = getMessageThreadId(options.message, isForum);\n if(this.chat.peerId === options.message.peerId && this.chat.threadId === threadId && !idleController.isIdle) {\n return;\n }\n\n uiNotificationsManager.buildNotification(options);\n });\n\n this.addEventListener('peer_changed', async({peerId}) => {\n document.body.classList.toggle('has-chat', !!peerId);\n\n this.emojiAnimationContainer.textContent = '';\n\n this.overrideHash(peerId);\n\n apiManagerProxy.updateTabState('chatPeerIds', this.chats.map((chat) => chat.peerId).filter(Boolean));\n });\n\n // stateStorage.get('chatPositions').then((c) => {\n stateStorage.setToCache('chatPositions', /* c || */{});\n // });\n\n if(IS_CALL_SUPPORTED || IS_GROUP_CALL_SUPPORTED) {\n this.topbarCall = new TopbarCall(managers);\n }\n\n if(IS_CALL_SUPPORTED) {\n callsController.addEventListener('instance', ({instance/* , hasCurrent */}) => {\n // if(hasCurrent) {\n // return;\n // }\n\n const popup = new PopupCall(instance);\n\n instance.addEventListener('acceptCallOverride', () => {\n return this.discardCurrentCall(instance.interlocutorUserId.toPeerId(), undefined, instance)\n .then(() => {\n callsController.dispatchEvent('accepting', instance);\n return true;\n })\n .catch(() => false);\n });\n\n popup.addEventListener('close', () => {\n const currentCall = callsController.currentCall;\n if(currentCall && currentCall !== instance && !instance.wasTryingToJoin) {\n instance.hangUp('phoneCallDiscardReasonBusy');\n }\n }, {once: true});\n\n popup.show();\n });\n\n callsController.addEventListener('incompatible', async(userId) => {\n toastNew({\n langPackKey: 'VoipPeerIncompatible',\n langPackArguments: [\n await wrapPeerTitle({peerId: userId.toPeerId()})\n ]\n });\n });\n }\n\n // ! do not remove this line\n // ! instance can be deactivated before the UI starts, because it waits in background for RAF that is delayed\n singleInstance.activateInstance();\n\n const setAuthorized = () => {\n telegramMeWebManager.setAuthorized(true);\n };\n\n setInterval(setAuthorized, ONE_DAY);\n setAuthorized();\n\n addAnchorListener<{}>({\n name: 'showMaskedAlert',\n callback: (params, element) => {\n const href = element.href;\n\n const a = element.cloneNode(true) as HTMLAnchorElement;\n a.className = 'anchor-url';\n a.innerText = href;\n a.removeAttribute('onclick');\n\n new PopupPeer('popup-masked-url', {\n titleLangKey: 'OpenUrlTitle',\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [a],\n buttons: [{\n langKey: 'Open',\n callback: () => {\n a.click();\n }\n }]\n }).show();\n }\n });\n\n addAnchorListener<{uriParams: {command: string, bot: string}}>({\n name: 'execBotCommand',\n callback: ({uriParams}) => {\n const {command, bot} = uriParams;\n\n /* const promise = bot ? this.openUsername(bot).then(() => this.chat.peerId) : Promise.resolve(this.chat.peerId);\n promise.then((peerId) => {\n this.managers.appMessagesManager.sendText(peerId, '/' + command);\n }); */\n\n this.managers.appMessagesManager.sendText(this.chat.peerId, '/' + command + (bot ? '@' + bot : ''));\n\n // console.log(command, bot);\n }\n });\n\n addAnchorListener<{uriParams: {hashtag: string}}>({\n name: 'searchByHashtag',\n callback: ({uriParams}) => {\n const {hashtag} = uriParams;\n if(!hashtag) {\n return;\n }\n\n this.chat.initSearch('#' + hashtag + ' ');\n }\n });\n\n ([\n ['addstickers', INTERNAL_LINK_TYPE.STICKER_SET],\n ['addemoji', INTERNAL_LINK_TYPE.EMOJI_SET]\n ] as [\n 'addstickers' | 'addemoji',\n INTERNAL_LINK_TYPE.STICKER_SET | INTERNAL_LINK_TYPE.EMOJI_SET\n ][]).forEach(([name, type]) => {\n addAnchorListener<{pathnameParams: [typeof name, string]}>({\n name,\n callback: ({pathnameParams}) => {\n if(!pathnameParams[1]) {\n return;\n }\n\n const link: InternalLink = {\n _: type,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(type, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n // * t.me/invoice/asdasdad\n // * t.me/$asdasdad\n addAnchorListener<{pathnameParams: ['invoice', string] | string}>({\n name: 'invoice',\n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.INVOICE,\n slug: pathnameParams.length > 1 ? pathnameParams[1] : pathnameParams[0].slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n // Support old t.me/joinchat/asd and new t.me/+asd\n addAnchorListener<{pathnameParams: ['joinchat', string]}>({\n name: 'joinchat',\n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: pathnameParams[1] || decodeURIComponent(pathnameParams[0]).slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n if(IS_GROUP_CALL_SUPPORTED) {\n addAnchorListener<{\n uriParams: Omit\n }>({\n name: 'voicechat',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.VOICE_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n }\n\n addAnchorListener<{\n // pathnameParams: ['c', string, string],\n // uriParams: {thread?: number}\n // } | {\n // pathnameParams: [string, string?],\n // uriParams: {comment?: number}\n pathnameParams: ['c', string, string] | [string, string?],\n uriParams: {thread?: string, comment?: string} | {comment?: string, start?: string}\n }>({\n name: 'im',\n callback: async({pathnameParams, uriParams}, element) => {\n let link: InternalLink;\n if(PHONE_NUMBER_REG_EXP.test(pathnameParams[0])) {\n link = {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: pathnameParams[0].slice(1)\n };\n } else if(pathnameParams[0] === 'c') {\n pathnameParams.shift();\n const thread = 'thread' in uriParams ? uriParams.thread : pathnameParams[2] && pathnameParams[1];\n link = {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: pathnameParams[0],\n post: pathnameParams[2] || pathnameParams[1],\n thread,\n comment: uriParams.comment,\n stack: this.getStackFromElement(element)\n };\n } else {\n const thread = 'thread' in uriParams ? uriParams.thread : pathnameParams[2] && pathnameParams[1];\n link = {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: pathnameParams[0],\n post: pathnameParams[2] || pathnameParams[1],\n thread,\n comment: uriParams.comment,\n start: 'start' in uriParams ? uriParams.start : undefined,\n stack: this.getStackFromElement(element)\n };\n }\n\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n domain: string,\n\n // telegrampassport\n scope?: string,\n nonce?: string,\n payload?: string,\n bot_id?: string,\n public_key?: string,\n callback_url?: string,\n\n // regular\n start?: string,\n startgroup?: string,\n game?: string,\n voicechat?: string,\n post?: string,\n thread?: string,\n comment?: string,\n phone?: string\n }\n }>({\n name: 'resolve',\n protocol: 'tg',\n callback: ({uriParams}, element) => {\n let link: InternalLink;\n if(uriParams.phone) {\n link = this.makeLink(INTERNAL_LINK_TYPE.USER_PHONE_NUMBER, uriParams as Required);\n } else if(uriParams.domain === 'telegrampassport') {\n\n } else {\n link = this.makeLink(INTERNAL_LINK_TYPE.MESSAGE, {\n ...uriParams,\n stack: this.getStackFromElement(element)\n });\n }\n\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'privatepost',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.PRIVATE_POST, uriParams);\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n slug: string\n }\n }>({\n name: 'invoice',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.INVOICE, uriParams);\n this.processInternalLink(link);\n }\n });\n\n ['joinchat' as const, 'join' as const].forEach((name) => {\n addAnchorListener<{\n uriParams: {\n invite: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.JOIN_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n this.onHashChange(true);\n this.attachKeydownListener();\n this.handleAutologinDomains();\n this.checkForShare();\n }\n\n private checkForShare() {\n const share = apiManagerProxy.share;\n if(share) {\n apiManagerProxy.share = undefined;\n new PopupForward(undefined, async(peerId) => {\n await this.setPeer({peerId});\n if(share.files?.length) {\n const foundMedia = share.files.some((file) => MEDIA_MIME_TYPES_SUPPORTED.has(file.type));\n new PopupNewMedia(this.chat, share.files, foundMedia ? 'media' : 'document');\n } else {\n this.managers.appMessagesManager.sendText(peerId, share.text);\n }\n });\n }\n }\n\n public handleUrlAuth(options: {\n peerId?: PeerId,\n mid?: number,\n buttonId?: number,\n url: string\n }) {\n const {peerId, mid, buttonId, url} = options;\n\n const openWindow = (url: string) => {\n window.open(url, '_blank');\n };\n\n const onUrlAuthResultAccepted = (urlAuthResult: UrlAuthResult.urlAuthResultAccepted) => {\n openWindow(urlAuthResult.url);\n };\n\n const onUrlAuthResult = async(urlAuthResult: UrlAuthResult): Promise => {\n if(urlAuthResult._ === 'urlAuthResultRequest') {\n const b = document.createElement('b');\n b.append(urlAuthResult.domain);\n const peerTitle = await wrapPeerTitle({peerId: rootScope.myId});\n const botPeerTitle = await wrapPeerTitle({peerId: urlAuthResult.bot.id.toPeerId()});\n\n const logInCheckbox: PopupPeerCheckboxOptions = {\n text: 'OpenUrlOption1',\n textArgs: [b.cloneNode(true), peerTitle],\n checked: true\n };\n\n const allowMessagesCheckbox: PopupPeerCheckboxOptions = urlAuthResult.pFlags.request_write_access ? {\n text: 'OpenUrlOption2',\n textArgs: [botPeerTitle],\n checked: true\n } : undefined;\n\n const checkboxes: PopupPeerCheckboxOptions[] = [\n logInCheckbox,\n allowMessagesCheckbox\n ];\n\n const confirmationPromise = confirmationPopup({\n titleLangKey: 'OpenUrlTitle',\n button: {\n langKey: 'Open'\n },\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [b],\n checkboxes: checkboxes.filter(Boolean)\n });\n\n if(allowMessagesCheckbox) {\n logInCheckbox.checkboxField.input.addEventListener('change', () => {\n const disabled = !logInCheckbox.checkboxField.checked;\n allowMessagesCheckbox.checkboxField.toggleDisability(disabled);\n\n if(disabled) {\n allowMessagesCheckbox.checkboxField.checked = false;\n }\n });\n }\n\n const [logInChecked, allowMessagesChecked] = await confirmationPromise;\n\n if(!logInChecked) {\n openWindow(url);\n return;\n }\n\n const result = await this.managers.appSeamlessLoginManager.acceptUrlAuth(\n url,\n peerId,\n mid,\n buttonId,\n allowMessagesChecked\n );\n\n return onUrlAuthResult(result);\n } else if(urlAuthResult._ === 'urlAuthResultAccepted') {\n onUrlAuthResultAccepted(urlAuthResult);\n } else {\n openWindow(url);\n }\n };\n\n return this.managers.appSeamlessLoginManager.requestUrlAuth(\n url,\n peerId,\n mid,\n buttonId\n ).then((urlAuthResult) => {\n onUrlAuthResult(urlAuthResult);\n });\n }\n\n private handleAutologinDomains() {\n let appConfig: MTAppConfig;\n rootScope.addEventListener('app_config', (_appConfig) => {\n appConfig = _appConfig;\n });\n\n const onAnchorClick = (element: HTMLAnchorElement) => {\n const url = new URL(element.href);\n if(appConfig.url_auth_domains.includes(url.hostname)) {\n this.handleUrlAuth({url: element.href});\n cancelEvent();\n return;\n }\n\n if(!appConfig.autologin_token || !appConfig.autologin_domains) {\n return;\n }\n\n const originalUrl = element.dataset.originalUrl ??= element.href;\n if(appConfig.autologin_domains.includes(url.hostname)) {\n url.searchParams.set('autologin_token', appConfig.autologin_token);\n element.href = url.toString();\n\n setTimeout(() => {\n element.href = originalUrl;\n delete element.dataset.originalUrl;\n }, 0);\n }\n };\n\n document.addEventListener('click', (e) => {\n const anchor = findUpTag(e.target as HTMLElement, 'A') as HTMLAnchorElement;\n if(anchor?.href) {\n onAnchorClick(anchor);\n }\n });\n\n // addAnchorListener({\n // name: 'handleUrlClick',\n // callback: (_, element) => {\n // onAnchorClick(element);\n // },\n // noCancelEvent: true,\n // noPathnameParams: true,\n // noUriParams: true\n // });\n }\n\n private getStackFromElement(element: HTMLElement) {\n const possibleBubble = findUpClassName(element, 'bubble');\n return possibleBubble ? +possibleBubble.dataset.mid : undefined;\n }\n\n private deleteFilesIterative(callback: (response: Response) => boolean) {\n return this.cacheStorage.timeoutOperation((cache) => {\n const perf = performance.now();\n return cache.keys().then((requests) => {\n const promises = requests.map((request) => {\n return cache.match(request).then((response) => {\n return callback(response);\n });\n });\n\n return Promise.all(promises).then((values) => {\n values.map((isBad, idx) => {\n if(!isBad) {\n return;\n }\n\n const request = requests[idx];\n return cache.delete(request);\n });\n\n return Promise.all(values.filter(Boolean));\n });\n }).then(() => {\n this.log('deleted files', performance.now() - perf);\n });\n });\n }\n\n private toggleChatGradientAnimation(activatingChat: Chat) {\n this.chats.forEach((chat) => {\n if(chat.gradientRenderer) {\n chat.gradientRenderer.scrollAnimate(rootScope.settings.animationsEnabled && chat === activatingChat);\n }\n });\n }\n\n private appendEmojiAnimationContainer(screen: ScreenSize) {\n const appendTo = screen === ScreenSize.mobile ? this.columnEl : document.body;\n if(this.emojiAnimationContainer.parentElement !== appendTo) {\n appendTo.append(this.emojiAnimationContainer)\n }\n }\n\n private attachKeydownListener() {\n const IGNORE_KEYS = new Set(['PageUp', 'PageDown', 'Meta', 'Control']);\n const onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n const isSelectionCollapsed = document.getSelection().isCollapsed;\n if(overlayCounter.isOverlayActive || IGNORE_KEYS.has(key)) return;\n\n const target = e.target as HTMLElement;\n\n // if(target.tagName === 'INPUT') return;\n\n // this.log('onkeydown', e, document.activeElement);\n\n const chat = this.chat;\n\n if((key.startsWith('Arrow') || (e.shiftKey && key === 'Shift')) && !isSelectionCollapsed) {\n return;\n } else if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {\n return;\n } else if(e.altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\n cancelEvent(e);\n this.managers.dialogsStorage.getNextDialog(this.chat.peerId, key === 'ArrowDown', appDialogsManager.filterId).then((dialog) => {\n if(dialog) {\n this.setPeer({peerId: dialog.peerId});\n }\n });\n } else if(key === 'ArrowUp' && this.chat.type !== 'scheduled') {\n if(!chat.input.editMsgId && chat.input.isInputEmpty()) {\n this.managers.appMessagesManager.getFirstMessageToEdit(chat.peerId, chat.threadId).then((message) => {\n if(message) {\n chat.input.initMessageEditing(message.mid);\n cancelEvent(e); // * prevent from scrolling\n }\n });\n } else {\n return;\n }\n } else if(key === 'ArrowDown') {\n return;\n }\n\n if(\n chat?.input?.messageInput &&\n e.target !== chat.input.messageInput &&\n target.tagName !== 'INPUT' &&\n !target.isContentEditable &&\n !IS_TOUCH_SUPPORTED &&\n (!mediaSizes.isMobile || this.tabId === APP_TABS.CHAT) &&\n !chat.selection.isSelecting &&\n !chat.input.recording\n ) {\n chat.input.messageInput.focus();\n placeCaretAtEnd(chat.input.messageInput);\n\n // clone and dispatch same event to new input. it is needed for sending message if input was blurred\n const newEvent = new KeyboardEvent(e.type, e);\n chat.input.messageInput.dispatchEvent(newEvent);\n }\n };\n\n document.body.addEventListener('keydown', onKeyDown);\n }\n\n private makeLink(type: T, uriParams: Omit) {\n return {\n _: type,\n ...uriParams\n } as any as InternalLinkTypeMap[T];\n }\n\n public async processInternalLink(link: InternalLink) {\n switch(link?._) {\n case INTERNAL_LINK_TYPE.MESSAGE: {\n const postId = link.post ? generateMessageId(+link.post) : undefined;\n const commentId = link.comment ? generateMessageId(+link.comment) : undefined;\n const threadId = link.thread ? generateMessageId(+link.thread) : undefined;\n\n this.openUsername({\n userName: link.domain,\n lastMsgId: postId,\n commentId,\n startParam: link.start,\n stack: link.stack,\n threadId\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.PRIVATE_POST: {\n const chatId = link.channel.toChatId();\n const peerId = chatId.toPeerId(true);\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n if(!chat) {\n try {\n await this.managers.appChatsManager.resolveChannel(chatId);\n } catch(err) {\n toastNew({langPackKey: 'LinkNotFound'});\n throw err;\n }\n }\n\n const postId = generateMessageId(+link.post);\n const threadId = link.thread ? generateMessageId(+link.thread) : undefined;\n\n this.op({\n peer: chat,\n lastMsgId: postId,\n threadId,\n stack: link.stack\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.EMOJI_SET:\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.set}, link._ === INTERNAL_LINK_TYPE.EMOJI_SET).show();\n break;\n }\n\n case INTERNAL_LINK_TYPE.JOIN_CHAT: {\n this.managers.appChatsManager.checkChatInvite(link.invite).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.managers.appChatsManager.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n // console.log(chatInvite);\n\n if(chatInvite._ === 'chatInviteAlready' ||\n chatInvite._ === 'chatInvitePeek'/* && chatInvite.expires > tsNow(true) */) {\n this.setInnerPeer({\n peerId: chatInvite.chat.id.toPeerId(true)\n });\n return;\n }\n\n new PopupJoinChatInvite(link.invite, chatInvite);\n }, (err) => {\n if(err.type === 'INVITE_HASH_EXPIRED') {\n toast(i18n('InviteExpired'));\n }\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.VOICE_CHAT: {\n if(IS_GROUP_CALL_SUPPORTED) {\n this.joinGroupCall(link.chat_id.toPeerId(true), link.id);\n }\n\n break;\n }\n\n case INTERNAL_LINK_TYPE.USER_PHONE_NUMBER: {\n this.managers.appUsersManager.resolvePhone(link.phone).then((user) => {\n this.setInnerPeer({\n peerId: user.id.toPeerId(false)\n });\n }).catch((err) => {\n if(err.type === 'PHONE_NOT_OCCUPIED') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n\n break;\n }\n\n case INTERNAL_LINK_TYPE.INVOICE: {\n this.managers.appPaymentsManager.getInputInvoiceBySlug(link.slug).then((inputInvoice) => {\n this.managers.appPaymentsManager.getPaymentForm(inputInvoice).then((paymentForm) => {\n // const message: Message.message = {\n // _: 'message',\n // date: 0,\n // id: 0,\n // peerId: 0,\n // peer_id: undefined,\n // message: '',\n // media: {\n // _: 'messageMediaInvoice',\n // currency: paymentForm.invoice.currency,\n // description: paymentForm.description,\n\n // }\n // };\n new PopupPayment(undefined, inputInvoice, paymentForm);\n });\n });\n break;\n }\n\n default: {\n this.log.warn('Not supported internal link:', link);\n break;\n }\n }\n }\n\n public openUrl(url: string) {\n const {url: wrappedUrl, onclick} = wrapUrl(url);\n if(!onclick) {\n return;\n }\n\n const a = document.createElement('a');\n a.href = wrappedUrl;\n (window as any)[onclick](a);\n }\n\n private onHashChange = (saveState?: boolean) => {\n try {\n this.onHashChangeUnsafe(saveState);\n } catch(err) {\n this.log.error('hash change error', err);\n }\n };\n\n private onHashChangeUnsafe = (saveState?: boolean) => {\n const hash = location.hash;\n if(!saveState) {\n appNavigationController.replaceState();\n }\n\n const splitted = hash.split('?');\n const params = parseUriParams(hash, splitted);\n this.log('hashchange', hash, splitted[0], params);\n if(!hash) {\n return;\n }\n\n if(params.tgaddr) {\n this.openUrl(params.tgaddr);\n return;\n }\n\n switch(splitted[0]) {\n default: {\n params.p = splitted[0].slice(1);\n }\n\n case '#/im': {\n if(!Object.keys(params).length) {\n break;\n }\n\n const p: string = params.p;\n const postId = params.post !== undefined ? generateMessageId(+params.post) : undefined;\n\n switch(p[0]) {\n case '@': {\n this.openUsername({\n userName: p,\n lastMsgId: postId\n });\n break;\n }\n\n default: { // peerId\n this.setInnerPeer({\n peerId: postId ? p.toPeerId(true) : p.toPeerId(),\n lastMsgId: postId\n });\n break;\n }\n }\n }\n }\n\n // appNavigationController.replaceState();\n // location.hash = '';\n };\n\n private async op(options: {\n peer: User.user | MTChat\n } & Omit) {\n let {peer, commentId, threadId, lastMsgId} = options;\n const isUser = peer._ === 'user';\n const peerId = peer.id.toPeerId(!isUser);\n\n const isForum = peer._ === 'channel' && peer.pFlags.forum;\n // open forum tab\n if(!commentId && !threadId && !lastMsgId && isForum) {\n appDialogsManager.toggleForumTabByPeerId(peerId, true);\n return;\n }\n\n // handle t.me/username/thread or t.me/username/messageId\n if(isForum && lastMsgId && !threadId) {\n const message = await this.managers.appMessagesManager.reloadMessages(peerId, lastMsgId);\n if(message) {\n threadId = options.threadId = getMessageThreadId(message, isForum);\n } else {\n threadId = options.threadId = lastMsgId;\n lastMsgId = options.lastMsgId = undefined;\n }\n }\n\n if(threadId) {\n return this.openThread({\n ...(options as any as Parameters[0]),\n peerId\n });\n } else if(commentId) {\n return this.openComment({\n peerId,\n msgId: lastMsgId,\n commentId\n });\n }\n\n return this.setInnerPeer({\n ...options,\n peerId\n });\n }\n\n public openPremiumBot() {\n return this.managers.apiManager.getAppConfig().then((appConfig) => {\n return this.openUsername({userName: appConfig.premium_bot_username});\n });\n }\n\n public openUsername(options: {\n userName: string\n } & Omit) {\n const {userName} = options;\n return this.managers.appUsersManager.resolveUsername(userName).then((peer) => {\n return this.op({\n peer,\n ...options\n });\n }, (err: ApiError) => {\n if(err.type === 'USERNAME_NOT_OCCUPIED') {\n toastNew({langPackKey: 'NoUsernameFound'});\n } else if(err.type === 'USERNAME_INVALID') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n }\n\n /**\n * Opens thread when peerId of discussion group is known\n */\n public async openThread(options: {\n peerId: PeerId,\n lastMsgId: number,\n threadId: number,\n stack?: number\n }) {\n if(await this.managers.appChatsManager.isForum(options.peerId.toChatId())) {\n await this.managers.dialogsStorage.getForumTopicOrReload(options.peerId, options.threadId);\n return this.setInnerPeer(options);\n }\n\n return this.managers.appMessagesManager.reloadMessages(options.peerId, options.threadId).then((message) => {\n if(!message) {\n options.lastMsgId = undefined;\n } else {\n this.managers.appMessagesManager.generateThreadServiceStartMessage(message);\n }\n\n return this.setInnerPeer({\n ...options,\n type: 'discussion'\n });\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(options: {\n peerId: PeerId,\n msgId: number,\n commentId: number\n }) {\n return this.managers.appMessagesManager.getDiscussionMessage(options.peerId, options.msgId).then((message) => {\n return this.openThread({\n peerId: message.peerId,\n lastMsgId: options.commentId,\n threadId: message.mid\n });\n });\n }\n\n public async callUser(userId: UserId, type: CallType) {\n const call = callsController.getCallByUserId(userId);\n if(call) {\n return;\n }\n\n const userFull = await this.managers.appProfileManager.getProfile(userId);\n if(userFull.pFlags.phone_calls_private) {\n wrapPeerTitle({peerId: userId.toPeerId()}).then((element) => {\n return confirmationPopup({\n descriptionLangKey: 'Call.PrivacyErrorMessage',\n descriptionLangArgs: [element],\n button: {\n langKey: 'OK',\n isCancel: true\n }\n });\n });\n\n return;\n }\n\n await this.discardCurrentCall(userId.toPeerId());\n\n callsController.startCallInternal(userId, type === 'video');\n }\n\n private discardCurrentCall(toPeerId: PeerId, ignoreGroupCall?: GroupCallInstance, ignoreCall?: CallInstance) {\n if(groupCallsController.groupCall && groupCallsController.groupCall !== ignoreGroupCall) return this.discardGroupCallConfirmation(toPeerId);\n else if(callsController.currentCall && callsController.currentCall !== ignoreCall) return this.discardCallConfirmation(toPeerId);\n else return Promise.resolve();\n }\n\n private async discardCallConfirmation(toPeerId: PeerId) {\n const currentCall = callsController.currentCall;\n if(currentCall) {\n await Promise.all([\n wrapPeerTitle({peerId: currentCall.interlocutorUserId.toPeerId(false)}),\n wrapPeerTitle({peerId: toPeerId})\n ]).then(([title1, title2]) => {\n return confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Call.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Call.ToCall.Text' : 'Call.Confirm.Discard.Call.ToVoice.Text',\n descriptionLangArgs: [title1, title2],\n button: {\n langKey: 'OK'\n }\n });\n });\n\n if(!currentCall.isClosing) {\n await currentCall.hangUp('phoneCallDiscardReasonDisconnect');\n }\n }\n }\n\n private async discardGroupCallConfirmation(toPeerId: PeerId) {\n const currentGroupCall = groupCallsController.groupCall;\n if(currentGroupCall) {\n await Promise.all([\n wrapPeerTitle({peerId: currentGroupCall.chatId.toPeerId(true)}),\n wrapPeerTitle({peerId: toPeerId})\n ]).then(([title1, title2]) => {\n return confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Voice.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Voice.ToCall.Text' : 'Call.Confirm.Discard.Voice.ToVoice.Text',\n descriptionLangArgs: [title1, title2],\n button: {\n langKey: 'OK'\n }\n });\n });\n\n if(groupCallsController.groupCall === currentGroupCall) {\n await currentGroupCall.hangUp();\n }\n }\n }\n\n public async joinGroupCall(peerId: PeerId, groupCallId?: GroupCallId) {\n const chatId = peerId.toChatId();\n const hasRights = this.managers.appChatsManager.hasRights(chatId, 'manage_call');\n const next = async() => {\n const chatFull = await this.managers.appProfileManager.getChatFull(chatId);\n let call: MyGroupCall;\n if(!chatFull.call) {\n if(!hasRights) {\n return;\n }\n\n call = await this.managers.appGroupCallsManager.createGroupCall(chatId);\n } else {\n call = chatFull.call;\n }\n\n groupCallsController.joinGroupCall(chatId, call.id, true, false);\n };\n\n if(groupCallId) {\n const groupCall = await this.managers.appGroupCallsManager.getGroupCallFull(groupCallId);\n if(groupCall._ === 'groupCallDiscarded') {\n if(!hasRights) {\n toastNew({\n langPackKey: 'VoiceChat.Chat.Ended'\n });\n\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'VoiceChat.Chat.StartNew',\n button: {\n langKey: 'VoiceChat.Chat.StartNew.OK'\n }\n });\n }\n }\n\n // await this.discardCurrentCall(peerId);\n\n next();\n };\n\n public setCurrentBackground(broadcastEvent = false): ReturnType {\n const theme = themeController.getTheme();\n\n const slug = (theme.settings?.wallpaper as WallPaper.wallPaper)?.slug;\n if(slug) {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === theme.name);\n // const isDefaultBackground = theme.background.blur === defaultTheme.background.blur &&\n // slug === defaultslug;\n\n // if(!isDefaultBackground) {\n return this.getBackground(slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.settings = copy(defaultTheme.settings); // * reset background\n return this.setCurrentBackground(true);\n });\n // }\n }\n\n return this.setBackground('', broadcastEvent);\n }\n\n private getBackground(slug: string) {\n if(this.backgroundPromises[slug]) return this.backgroundPromises[slug];\n return this.backgroundPromises[slug] = this.cacheStorage.getFile('backgrounds/' + slug).then((blob) => {\n return URL.createObjectURL(blob);\n });\n }\n\n public setBackground(url: string, broadcastEvent = true): Promise {\n this.lastBackgroundUrl = url;\n const promises = this.chats.map((chat) => chat.setBackground(url));\n return promises[promises.length - 1].then(() => {\n if(broadcastEvent) {\n rootScope.dispatchEvent('background_change');\n }\n });\n }\n\n public saveChatPosition(chat: Chat) {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n // const bubble = chat.bubbles.getBubbleByPoint('top');\n // if(bubble) {\n // const top = bubble.getBoundingClientRect().top;\n const chatBubbles = chat.bubbles;\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const chatPositions = stateStorage.getFromCache('chatPositions');\n if(!(chatBubbles.scrollable.getDistanceToEnd() <= 16 && chatBubbles.scrollable.loadedAll.bottom) && chatBubbles.getRenderedLength()) {\n chatBubbles.sliceViewport(true);\n const top = chatBubbles.scrollable.scrollTop;\n\n const position = {\n mids: getObjectKeysAndSort(chatBubbles.bubbles, 'desc').filter((mid) => mid > 0 && !chatBubbles.skippedMids.has(mid)),\n top\n };\n\n chatPositions[key] = position;\n\n this.log('saved chat position:', position);\n } else {\n delete chatPositions[key];\n\n this.log('deleted chat position');\n }\n\n stateStorage.set({chatPositions}, true);\n // }\n }\n\n public getChatSavedPosition(chat: Chat): ChatSavedPosition {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const cache = stateStorage.getFromCache('chatPositions');\n return cache && cache[key];\n }\n\n public applyCurrentTheme(slug?: string, backgroundUrl?: string, broadcastEvent?: boolean) {\n if(backgroundUrl) {\n this.backgroundPromises[slug] = Promise.resolve(backgroundUrl);\n }\n\n themeController.setTheme();\n\n return this.setCurrentBackground(broadcastEvent === undefined ? !!slug : broadcastEvent);\n }\n\n private setSettings = () => {\n const {messagesTextSize} = rootScope.settings;\n\n this.customEmojiSize = makeMediaSize(messagesTextSize + 4, messagesTextSize + 4);\n document.documentElement.style.setProperty('--messages-text-size', messagesTextSize + 'px');\n\n const firstTime = !this.customEmojiSize;\n if(!firstTime) {\n const ellipsisElements = document.querySelectorAll('middle-ellipsis-element');\n ellipsisElements.forEach((element) => {\n element.disconnectedCallback();\n element.dataset.fontSize = '' + messagesTextSize;\n if(element.title) element.textContent = element.title;\n element.connectedCallback();\n });\n\n const renderers = document.querySelectorAll('.chat custom-emoji-renderer-element');\n renderers.forEach((renderer) => {\n renderer.forceRenderAfterSize = true;\n });\n }\n\n document.body.classList.toggle('animation-level-0', !rootScope.settings.animationsEnabled);\n document.body.classList.toggle('animation-level-1', false);\n document.body.classList.toggle('animation-level-2', rootScope.settings.animationsEnabled);\n\n this.chatsSelectTabDebounced = debounce(() => {\n const topbar = this.chat.topbar;\n topbar.pinnedMessage?.setCorrectIndex(0); // * буду молиться богам, чтобы это ничего не сломало, но это исправляет получение пиннеда после анимации\n\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }, rootScope.settings.animationsEnabled ? 250 : 0, false, true);\n\n if(lottieLoader.setLoop(rootScope.settings.stickers.loop)) {\n animationIntersector.checkAnimations2(false);\n }\n\n for(const chat of this.chats) {\n chat.setAutoDownloadMedia();\n }\n\n I18n.setTimeFormat(rootScope.settings.timeFormat);\n\n this.toggleChatGradientAnimation(this.chat);\n };\n\n // * не могу использовать тут TransitionSlider, так как мне нужен отрисованный блок рядом\n // * (или под текущим чатом) чтобы правильно отрендерить чат (напр. scrollTop)\n private chatsSelectTab(tab: HTMLElement, animate?: boolean) {\n if(this.prevTab === tab) {\n return;\n }\n\n if(animate === false && this.prevTab) { // * will be used for Safari iOS history swipe\n disableTransition([tab, this.prevTab].filter(Boolean));\n }\n\n if(this.prevTab) {\n this.prevTab.classList.remove('active');\n this.chatsSelectTabDebounced();\n\n // ! нужно переделать на animation, так как при лаге анимация будет длиться не 250мс\n if(rootScope.settings.animationsEnabled && animate !== false) {\n dispatchHeavyAnimationEvent(pause(250 + 150), 250 + 150);\n }\n\n const prevIdx = whichChild(this.prevTab);\n const idx = whichChild(tab);\n if(idx > prevIdx) {\n appNavigationController.pushItem({\n type: 'chat',\n onPop: (canAnimate) => {\n this.setPeer({}, canAnimate);\n blurActiveElement();\n }\n });\n }\n }\n\n tab.classList.add('active');\n this.prevTab = tab;\n }\n\n private init() {\n document.addEventListener('paste', this.onDocumentPaste, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n this.attachDragAndDropListeners();\n }\n\n // if(!isTouchSupported) {\n this.markupTooltip = new MarkupTooltip(this);\n this.markupTooltip.handleSelection();\n // }\n }\n\n private attachDragAndDropListeners() {\n const drops: ChatDragAndDrop[] = [];\n const mediaDrops: ChatDragAndDrop[] = [];\n let mounted = false;\n const toggle = async(e: DragEvent, mount: boolean) => {\n if(mount === mounted) return;\n\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n\n const newMediaPopup = getCurrentNewMediaPopup();\n const types: string[] = await getFilesFromEvent(e, true);\n if(!isFiles || (!(await this.canDrag()) && !newMediaPopup)) { // * skip dragging text case\n counter = 0;\n return;\n }\n\n const _dropsContainer = newMediaPopup ? mediaDropsContainer : dropsContainer;\n const _drops = newMediaPopup ? mediaDrops : drops;\n\n if(mount && !_drops.length) {\n const force = isFiles && !types.length; // * can't get file items not from 'drop' on Safari\n\n const foundMedia = types.filter((t) => MEDIA_MIME_TYPES_SUPPORTED.has(t)).length;\n // const foundDocuments = types.length - foundMedia;\n\n this.log('drag files', types);\n\n if(newMediaPopup) {\n newMediaPopup.appendDrops(_dropsContainer);\n\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n header: 'Preview.Dragging.AddItems',\n headerArgs: [types.length],\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'document');\n }\n }));\n }\n } else {\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragfiles',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropAsFilesDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'document');\n }\n }));\n }\n\n // if((foundMedia && !foundDocuments) || force) {\n if(foundMedia || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragmedia',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropQuickDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'media');\n }\n }));\n }\n\n this.chat.container.append(_dropsContainer);\n }\n }\n\n // if(!mount) return;\n\n SetTransition({\n element: _dropsContainer,\n className: 'is-visible',\n forwards: mount,\n duration: 200,\n onTransitionEnd: () => {\n if(!mount) {\n _drops.forEach((drop) => {\n drop.destroy();\n });\n\n _drops.length = 0;\n }\n }\n });\n\n if(mount) {\n _drops.forEach((drop) => {\n drop.setPath();\n });\n } else {\n counter = 0;\n }\n\n document.body.classList.toggle('is-dragging', mount);\n mounted = mount;\n };\n\n /* document.body.addEventListener('dragover', (e) => {\n cancelEvent(e);\n }); */\n\n let counter = 0;\n document.body.addEventListener('dragenter', (e) => {\n counter++;\n });\n\n document.body.addEventListener('dragover', (e) => {\n // this.log('dragover', e/* , e.dataTransfer.types[0] */);\n toggle(e, true);\n cancelEvent(e);\n });\n\n document.body.addEventListener('dragleave', (e) => {\n // this.log('dragleave', e, counter);\n // if((e.pageX <= 0 || e.pageX >= this.managers.appPhotosManager.windowW) || (e.pageY <= 0 || e.pageY >= this.managers.appPhotosManager.windowH)) {\n counter--;\n if(counter === 0) {\n // if(!findUpClassName(e.target, 'drops-container')) {\n toggle(e, false);\n }\n });\n\n const dropsContainer = document.createElement('div');\n dropsContainer.classList.add('drops-container');\n\n const mediaDropsContainer = dropsContainer.cloneNode(true) as HTMLElement;\n }\n\n private async canDrag() {\n const chat = this.chat;\n const peerId = chat?.peerId;\n return !(!peerId || overlayCounter.isOverlayActive || !(await chat.canSend('send_media')));\n }\n\n private onDocumentPaste = async(e: ClipboardEvent | DragEvent, attachType?: 'media' | 'document') => {\n const newMediaPopup = getCurrentNewMediaPopup();\n\n // console.log('document paste');\n // console.log('item', event.clipboardData.getData());\n\n if(e instanceof DragEvent) {\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n if(isFiles) {\n cancelEvent(e);\n }\n }\n\n const files = await getFilesFromEvent(e);\n if(!(await this.canDrag()) && !newMediaPopup) return;\n if(files.length) {\n if(newMediaPopup) {\n newMediaPopup.addFiles(files);\n return;\n }\n\n const chatInput = this.chat.input;\n chatInput.willAttachType = attachType || (MEDIA_MIME_TYPES_SUPPORTED.has(files[0].type) ? 'media' : 'document');\n PopupElement.createPopup(PopupNewMedia, this.chat, files, chatInput.willAttachType);\n }\n };\n\n private async overrideHash(peerId?: PeerId) {\n let str: string;\n if(peerId) {\n const username = await this.managers.appPeersManager.getPeerUsername(peerId);\n str = username ? '@' + username : '' + peerId;\n }\n\n appNavigationController.overrideHash(str);\n }\n\n public selectTab(id: APP_TABS, animate?: boolean) {\n if(animate === false) { // * will be used for Safari iOS history swipe\n disableTransition([appSidebarLeft.sidebarEl, this.columnEl, appSidebarRight.sidebarEl]);\n }\n\n document.body.classList.toggle(LEFT_COLUMN_ACTIVE_CLASSNAME, id === APP_TABS.CHATLIST);\n\n const prevTabId = this.tabId;\n if(prevTabId !== undefined) {\n this.overrideHash(id > APP_TABS.CHATLIST ? this.chat?.peerId : undefined);\n this.dispatchEvent('tab_changing', id);\n }\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(\n prevTabId !== undefined &&\n prevTabId !== id &&\n rootScope.settings.animationsEnabled &&\n animate !== false/* &&\n mediaSizes.activeScreen !== ScreenSize.large */\n ) {\n const transitionTime = (mediaSizes.isMobile ? 250 : 200) + 100; // * cause transition time could be > 250ms\n animationPromise = pause(transitionTime);\n dispatchHeavyAnimationEvent(animationPromise, transitionTime);\n\n // ! it's very heavy operation. will blink in firefox\n /* this.columnEl.classList.add('disable-hover');\n animationPromise.finally(() => {\n this.columnEl.classList.remove('disable-hover');\n }); */\n }\n\n this.tabId = id;\n blurActiveElement();\n if(mediaSizes.isMobile && prevTabId === APP_TABS.PROFILE && id < APP_TABS.PROFILE) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== undefined && id > prevTabId) {\n if(id < APP_TABS.PROFILE || !appNavigationController.findItemByType('im')) {\n appNavigationController.pushItem({\n type: 'im',\n onPop: (canAnimate) => {\n // this.selectTab(prevTabId, !isSafari);\n this.setPeer({}, canAnimate);\n }\n });\n }\n }\n\n const onImTabChange = (window as any).onImTabChange;\n onImTabChange && onImTabChange(id);\n\n // this._selectTab(id, mediaSizes.isMobile);\n // document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, id === 2);\n\n return animationPromise;\n }\n\n public updateStatus() {\n return this.managers.appUsersManager.updateMyOnlineStatus(this.offline);\n }\n\n private createNewChat() {\n const chat = new Chat(\n this,\n this.managers\n );\n\n if(this.chats.length) {\n chat.setBackground(this.lastBackgroundUrl, true);\n }\n\n this.chats.push(chat);\n\n return chat;\n }\n\n private spliceChats(fromIndex: number, justReturn = true, animate?: boolean, spliced?: Chat[]) {\n if(fromIndex >= this.chats.length) return;\n\n const chatFrom = this.chat;\n if(this.chats.length > 1 && justReturn) {\n this.dispatchEvent('peer_changing', this.chat);\n }\n\n if(!spliced) {\n spliced = this.chats.splice(fromIndex, this.chats.length - fromIndex);\n }\n\n const chatTo = this.chat;\n this.dispatchEvent('chat_changing', {from: chatFrom, to: chatTo});\n\n // * -1 because one item is being sliced when closing the chat by calling .removeByType\n for(let i = 0; i < spliced.length - 1; ++i) {\n appNavigationController.removeByType('chat', true);\n }\n\n // * fix middle chat z-index on animation\n if(spliced.length > 1) {\n spliced.slice(0, -1).forEach((chat) => {\n chat.container.remove();\n });\n }\n\n this.chatsSelectTab(chatTo.container, animate);\n\n if(justReturn) {\n this.dispatchEvent('peer_changed', chatTo);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n searchTab?.close();\n\n appSidebarRight.replaceSharedMediaTab(chatTo.sharedMediaTab);\n }\n\n spliced.forEach((chat) => {\n chat.beforeDestroy();\n });\n\n setTimeout(() => {\n // chat.setPeer(0);\n spliced.forEach((chat) => {\n chat.destroy();\n });\n }, 250 + 100);\n }\n\n public async setPeer(options: Partial = {}, animate?: boolean): Promise {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n options.peerId ??= NULL_PEER_ID;\n\n const {peerId, lastMsgId, threadId} = options;\n\n const chat = this.chat;\n const chatIndex = this.chats.indexOf(chat);\n const isSamePeer = this.isSamePeer(chat, options as any);\n if(!peerId) {\n if(chatIndex > 0) {\n this.spliceChats(chatIndex, undefined, animate);\n return;\n } else if(mediaSizes.activeScreen === ScreenSize.medium) { // * floating sidebar case\n this.selectTab(+!this.tabId, animate);\n return;\n }\n } else if(chatIndex > 0 && chat.peerId && !isSamePeer) {\n // const firstChat = this.chats[0];\n // if(firstChat.peerId !== chat.peerId) {\n /* // * slice idx > 0, set background and slice first, so new one will be the first\n const spliced = this.chats.splice(1, this.chats.length - 1);\n this.createNewChat();\n this.chats.splice(0, 1); */\n const spliced = this.chats.splice(1, this.chats.length - 1);\n if(this.chat.peerId === peerId) {\n this.spliceChats(0, true, true, spliced);\n return;\n } else {\n const ret = this.setPeer(options);\n this.spliceChats(0, false, false, spliced);\n return ret;\n }\n // } else {\n // this.spliceChats(1, false, animate);\n // }\n\n // return ret;\n }\n\n // * don't reset peer if returning\n if(isSamePeer && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(APP_TABS.CHAT, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = await chat.setPeer(options as any as Parameters[0]);\n\n // * wait for cached render\n const promise = result?.cached ? result.promise : Promise.resolve();\n if(peerId) {\n Promise.all([\n promise,\n chat.setBackgroundPromise\n ]).then(() => {\n // window.requestAnimationFrame(() => {\n setTimeout(() => { // * setTimeout is better here\n setTimeout(() => {\n this.chatsSelectTab(this.chat.container);\n }, 0);\n this.selectTab(APP_TABS.CHAT, animate);\n }, 0);\n });\n }\n }\n\n if(!peerId) {\n this.selectTab(APP_TABS.CHATLIST, animate);\n return false;\n }\n }\n\n public async setInnerPeer(options: ChatSetInnerPeerOptions) {\n const {peerId} = options;\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\n\n if(!options.type) {\n if(options.threadId && !(await this.managers.appPeersManager.isForum(options.peerId))) {\n options.type = 'discussion';\n }\n\n options.type ??= 'chat';\n }\n\n // * reuse current chat\n const existingIndex = this.chats.findIndex((chat) => this.isSamePeer(chat, options) || (mediaSizes.activeScreen === ScreenSize.mobile && this.tabId === 0));\n if(existingIndex !== -1) {\n this.spliceChats(existingIndex + 1);\n return this.setPeer(options);\n }\n\n const oldChat = this.chat;\n let chat = oldChat;\n if(oldChat.inited) { // * use first not inited chat\n chat = this.createNewChat();\n }\n\n this.dispatchEvent('chat_changing', {from: oldChat, to: chat});\n\n // this.chatsSelectTab(chat.container);\n\n return this.setPeer(options);\n }\n\n public openScheduled(peerId: PeerId) {\n this.setInnerPeer({\n peerId,\n type: 'scheduled'\n });\n }\n\n private getTypingElement(action: SendMessageAction) {\n const el = document.createElement('span');\n let c = 'peer-typing';\n el.classList.add(c);\n el.dataset.action = action._;\n switch(action._) {\n case 'sendMessageTypingAction': {\n // default: {\n c += '-text';\n for(let i = 0; i < 3; ++i) {\n const dot = document.createElement('span');\n dot.className = c + '-dot';\n el.append(dot);\n }\n break;\n }\n\n case 'sendMessageUploadAudioAction':\n case 'sendMessageUploadDocumentAction':\n case 'sendMessageUploadRoundAction':\n case 'sendMessageUploadVideoAction':\n case 'sendMessageUploadPhotoAction': {\n c += '-upload';\n /* const trail = document.createElement('span');\n trail.className = c + '-trail';\n el.append(trail); */\n break;\n }\n\n case 'sendMessageRecordAudioAction':\n case 'sendMessageRecordRoundAction':\n case 'sendMessageRecordVideoAction': {\n c += '-record';\n break;\n }\n\n case 'sendMessageEmojiInteractionSeen':\n case 'sendMessageChooseStickerAction': {\n c += '-choosing-sticker';\n for(let i = 0; i < 2; ++i) {\n const eye = document.createElement('div');\n eye.className = c + '-eye';\n el.append(eye);\n }\n break;\n }\n }\n\n el.classList.add(c);\n\n return el;\n }\n\n public async getPeerTyping(peerId: PeerId, container?: HTMLElement, threadId?: number) {\n // const log = this.log.bindPrefix('getPeerTyping-' + peerId);\n // log('getting peer typing');\n\n const isUser = peerId.isUser();\n if(isUser && await this.managers.appUsersManager.isBot(peerId)) {\n // log('a bot');\n return;\n }\n\n const typings = await this.managers.appProfileManager.getPeerTypings(peerId, threadId);\n if(!typings?.length) {\n // log('have no typing');\n return;\n }\n\n const typing = typings[0];\n\n const langPackKeys: {\n [peerType in 'private' | 'chat' | 'multi']?: Partial<{[action in SendMessageAction['_']]: LangPackKey}>\n } = {\n private: {\n 'sendMessageTypingAction': 'Peer.Activity.User.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.User.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.User.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.User.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.User.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.User.EnjoyingAnimations'\n },\n chat: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.Chat.EnjoyingAnimations'\n },\n multi: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.Multi.TypingText1',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.Multi.SendingPhoto1',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.Multi.RecordingAudio1',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.Multi.PlayingGame1',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.Multi.ChoosingSticker1'\n }\n };\n\n const mapa = isUser ? langPackKeys.private : (typings.length > 1 ? langPackKeys.multi : langPackKeys.chat);\n let action = typing.action;\n\n if(typings.length > 1) {\n const s: any = {};\n typings.forEach((typing) => {\n const type = typing.action._;\n if(s[type] === undefined) s[type] = 0;\n ++s[type];\n });\n\n if(Object.keys(s).length > 1) {\n action = {\n _: 'sendMessageTypingAction'\n };\n }\n }\n\n const langPackKey = mapa[action._];\n if(!langPackKey) {\n // log('no langPackKey');\n return;\n }\n\n let peerTitlePromise: Promise;\n let args: any[];\n if(peerId.isAnyChat()) {\n const peerTitle = new PeerTitle();\n peerTitlePromise = peerTitle.update({peerId: typing.userId.toPeerId(false), onlyFirstName: true});\n args = [\n peerTitle.element,\n typings.length - 1\n ];\n\n await peerTitlePromise;\n }\n\n if(!container) {\n container = document.createElement('span');\n container.classList.add('online', 'peer-typing-container');\n }\n\n container.classList.toggle('peer-typing-flex', action._ === 'sendMessageChooseStickerAction' || action._ === 'sendMessageEmojiInteractionSeen');\n\n let typingElement = container.firstElementChild as HTMLElement;\n if(!typingElement) {\n typingElement = this.getTypingElement(action);\n container.prepend(typingElement);\n } else {\n if(typingElement.dataset.action !== action._) {\n typingElement.replaceWith(this.getTypingElement(action));\n }\n }\n\n if(action._ === 'sendMessageEmojiInteractionSeen') {\n if(args) {\n args.pop();\n } else {\n args = [];\n }\n\n const span = htmlToSpan(wrapEmojiText(action.emoticon));\n args.push(span);\n }\n\n const descriptionElement = i18n(langPackKey, args);\n descriptionElement.classList.add('peer-typing-description');\n\n if(container.childElementCount > 1) container.lastElementChild.replaceWith(descriptionElement);\n else container.append(descriptionElement);\n\n // log('returning typing');\n return container;\n }\n\n private async getChatStatus(chatId: ChatId, noTyping?: boolean): Promise> {\n const typingEl = noTyping ? undefined : await this.getPeerTyping(chatId.toPeerId(true));\n if(typingEl) {\n return {cached: true, result: Promise.resolve(typingEl)};\n }\n\n const result = await this.managers.acknowledged.appProfileManager.getChatFull(chatId);\n const dooo = async(chatInfo: ChatFull) => {\n // this.chat.log('chatInfo res:', chatInfo);\n\n const participants_count = (chatInfo as ChatFull.channelFull).participants_count ||\n ((chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants)?.participants?.length ||\n 1;\n // if(participants_count) {\n let subtitle = await getChatMembersString(chatId);\n\n if(participants_count < 2) {\n return subtitle;\n }\n\n const onlines = await this.managers.appProfileManager.getOnlines(chatId);\n if(onlines > 1) {\n const span = document.createElement('span');\n\n span.append(...join([subtitle, i18n('OnlineCount', [numberThousandSplitter(onlines)])], false));\n subtitle = span;\n }\n\n return subtitle;\n // }\n };\n\n const promise = Promise.resolve(result.result).then(dooo);\n return {\n cached: result.cached,\n result: promise\n };\n }\n\n private async getUserStatus(userId: UserId, ignoreSelf?: boolean) {\n const result: AckedResult = {\n cached: true,\n result: Promise.resolve(undefined as HTMLElement)\n };\n\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user || (user.pFlags.self && !ignoreSelf)) {\n return result;\n }\n\n const subtitle = getUserStatusString(user);\n\n if(!user.pFlags.bot && !user.pFlags.support) {\n let typingEl = await this.getPeerTyping(userId.toPeerId());\n if(!typingEl && user.status?._ === 'userStatusOnline') {\n typingEl = document.createElement('span');\n typingEl.classList.add('online');\n typingEl.append(subtitle);\n }\n\n if(typingEl) {\n result.result = Promise.resolve(typingEl);\n return result;\n }\n }\n\n result.result = Promise.resolve(subtitle);\n return result;\n }\n\n private async getPeerStatus(peerId: PeerId, ignoreSelf?: boolean, noTyping?: boolean) {\n if(!peerId) return;\n let promise: Promise>;\n if(peerId.isAnyChat()) {\n promise = this.getChatStatus(peerId.toChatId(), noTyping);\n } else {\n promise = this.getUserStatus(peerId.toUserId(), ignoreSelf);\n }\n\n return promise;\n }\n\n public async setPeerStatus(options: {\n peerId: PeerId,\n element: HTMLElement,\n needClear: boolean,\n useWhitespace: boolean,\n middleware: () => boolean,\n ignoreSelf?: boolean,\n noTyping?: boolean\n }) {\n // const log = this.log.bindPrefix('status-' + peerId);\n // log('setting status', element);\n\n const {peerId, element, needClear, useWhitespace, middleware, ignoreSelf, noTyping} = options;\n\n if(!needClear) {\n // * good good good\n const typingContainer = element.querySelector('.peer-typing-container') as HTMLElement;\n if(typingContainer && await this.getPeerTyping(peerId, typingContainer)) {\n // log('already have a status');\n return;\n }\n }\n\n const result = await this.getPeerStatus(peerId, ignoreSelf, noTyping);\n // log('getPeerStatus result', result);\n if(!middleware()) {\n // log.warn('middleware');\n return;\n }\n\n const set = async() => {\n const subtitle = result && await result.result;\n if(!middleware()) {\n return;\n }\n\n return () => replaceContent(element, subtitle || placeholder);\n };\n\n const placeholder = useWhitespace ? NBSP : ''; // ! HERE U CAN FIND WHITESPACE\n if(!result || result.cached || needClear === undefined) {\n return await set();\n } else if(needClear) {\n return () => {\n element.textContent = placeholder;\n return set().then((callback) => callback?.());\n };\n }\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'}, undefined, this.chat.threadId);\n }\n\n public isSamePeer(options1: {peerId: PeerId, threadId?: number, type?: ChatType}, options2: typeof options1) {\n return options1.peerId === options2.peerId &&\n options1.threadId === options2.threadId &&\n (typeof(options1.type) !== typeof(options2.type) || options1.type === options2.type);\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\n","import {Message, MessageMedia} from '../../../../layer';\n\nexport default function canSaveMessageMedia(message: Message.message | Message.messageService) {\n return message &&\n !message.pFlags.is_outgoing &&\n !(message as Message.message).pFlags.noforwards &&\n !((message as Message.message).media as MessageMedia.messageMediaInvoice)?.extended_media\n}\n","import {Document, Message, MessageAction, MessageExtendedMedia, MessageMedia, Photo, WebPage} from '../../../../layer';\n\nexport default function getMediaFromMessage(message: Message) {\n if(!message) return;\n\n let media: any;\n if((message as Message.messageService).action) {\n media = ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo;\n } else if((message as Message.message).media) {\n let messageMedia = (message as Message.message).media;\n if((messageMedia as MessageMedia.messageMediaWebPage).webpage) {\n messageMedia = (messageMedia as MessageMedia.messageMediaWebPage).webpage as any as MessageMedia;\n } else if((messageMedia as MessageMedia.messageMediaInvoice).extended_media?._ === 'messageExtendedMedia') {\n messageMedia = ((messageMedia as MessageMedia.messageMediaInvoice).extended_media as MessageExtendedMedia.messageExtendedMedia).media;\n }\n\n media = (messageMedia as MessageMedia.messageMediaDocument).document ||\n (messageMedia as MessageMedia.messageMediaPhoto).photo;\n }\n\n return media as Photo.photo | Document.document;\n}\n","import {Message} from '../../../../layer';\nimport type {MyMessage} from '../../appMessagesManager';\n\nexport default function getMessageSenderPeerIdOrName(message: MyMessage) {\n if(message.fromId) {\n return {\n peerId: message.fromId\n };\n } else {\n return {\n fromName: (message as Message.message).fwd_from?.from_name\n };\n }\n}\n","import {isRestricted} from '../../../../helpers/restrictions';\nimport {Message} from '../../../../layer';\n\nexport default function isMessageRestricted(message: Message.message) {\n return !!(message.restriction_reason && isRestricted(message.restriction_reason));\n}\n","// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\n/*\n HTML-color IRC-color Description\n #c03d33 4 red\n #4fad2d 3 green\n #d09306 7 yellow\n #168acd 10 blue\n #8544d6 6 purple\n #cd4073 13 pink\n #2996ad 11 sea\n #ce671b 5 orange\n*/\nconst DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f'];\nconst DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange'];\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\n\nexport default function getPeerColorById(peerId: PeerId, pic = true) {\n if(!peerId) return '';\n\n const idx = DialogColorsMap[Math.abs(+peerId) % 7];\n const color = (pic ? DialogColors : DialogColorsFg)[idx];\n return color;\n}\n","import {Chat, User} from '../../../../layer';\n\nexport default function getPeerEditableUsername(peer: User.user | Chat.channel) {\n if(peer.username) {\n return peer.username;\n }\n\n const usernames = peer.usernames;\n const username = usernames?.find((username) => username.pFlags.editable);\n return username?.username;\n}\n","import isObject from '../../../../helpers/object/isObject';\nimport {InputChannel, InputPeer, Peer} from '../../../../layer';\nimport {NULL_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | InputChannel | PeerId | string): PeerId {\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\n // if(typeof(peerId) === 'number') return peerId;\n else if(isObject(peerId)) {\n const userId = (peerId as Peer.peerUser).user_id;\n if(userId !== undefined) {\n return userId.toPeerId(false);\n }\n\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\n if(chatId !== undefined) {\n return chatId.toPeerId(true);\n }\n\n return NULL_PEER_ID; // maybe it is an inputPeerSelf\n // } else if(!peerId) return 'u0';\n } else if(!peerId) return NULL_PEER_ID;\n\n const isUser = (peerId as string).charAt(0) === 'u';\n const peerParams = (peerId as string).substr(1).split('_');\n\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyPhoto} from '../../appPhotosManager';\nimport type {PhotoSize, VideoSize, WebDocument} from '../../../../layer';\nimport calcImageInBox from '../../../../helpers/calcImageInBox';\nimport {THUMB_TYPE_FULL} from '../../../mtproto/mtproto_config';\n\nexport default function choosePhotoSize(\n photo: MyPhoto | MyDocument | WebDocument,\n boxWidth = 0,\n boxHeight = 0,\n useBytes = false,\n pushDocumentSize = false\n) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n\n /*\n s box 100x100\n m box 320x320\n x box 800x800\n y box 1280x1280\n w box 2560x2560\n a crop 160x160\n b crop 320x320\n c crop 640x640\n d crop 1280x1280 */\n\n let sizes: PhotoSize[] = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n let bestPhotoSize: typeof sizes[0] = {_: 'photoSizeEmpty', type: THUMB_TYPE_FULL};\n if(pushDocumentSize && sizes && photo._ !== 'photo') {\n sizes = sizes.concat({\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: THUMB_TYPE_FULL\n });\n }\n\n if(sizes?.length) {\n for(let i = 0, length = sizes.length; i < length; ++i) {\n const photoSize = sizes[i];\n if(!('w' in photoSize) && !('h' in photoSize)) continue;\n\n bestPhotoSize = photoSize;\n\n const size = calcImageInBox(photoSize.w, photoSize.h, boxWidth, boxHeight);\n if(size.width >= boxWidth || size.height >= boxHeight) {\n break;\n }\n }\n\n if(useBytes && bestPhotoSize._ === 'photoSizeEmpty' && sizes[0]._ === 'photoStrippedSize') {\n bestPhotoSize = sizes[0];\n }\n }\n\n return bestPhotoSize;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\nimport createDataChannel from './helpers/createDataChannel';\nimport createPeerConnection from './helpers/createPeerConnection';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport StreamManager from './streamManager';\nimport {Ssrc} from './types';\n\nexport type CallConnectionInstanceOptions = {\n streamManager: StreamManager,\n connection?: RTCPeerConnection,\n log?: ReturnType\n};\n\nexport default abstract class CallConnectionInstanceBase {\n public connection: RTCPeerConnection;\n public streamManager: StreamManager;\n public dataChannel: RTCDataChannel;\n public description: LocalConferenceDescription;\n public sources: {\n audio: Ssrc,\n video?: Ssrc,\n };\n protected negotiating: Promise;\n protected log: ReturnType;\n\n constructor(options: CallConnectionInstanceOptions) {\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = this.connection?.log || logger('CALL-CONNECTION-BASE');\n }\n\n this.sources = {} as any;\n }\n\n public createPeerConnection(config?: RTCConfiguration) {\n return this.connection || (this.connection = createPeerConnection(config, this.log.bindPrefix('connection')).connection);\n }\n\n public createDataChannel(dict?: RTCDataChannelInit) {\n return this.dataChannel || (this.dataChannel = createDataChannel(this.connection, dict, this.log.bindPrefix('data')));\n }\n\n public createDescription() {\n return this.description || (this.description = new LocalConferenceDescription(this.connection));\n }\n\n public appendStreamToConference() {\n return this.streamManager.appendToConference(this.description);\n }\n\n public closeConnection() {\n const {connection} = this;\n if(!connection) {\n return;\n }\n\n try {\n connection.log('close');\n connection.close();\n } catch(e) {\n this.log.error(e);\n }\n }\n\n public closeConnectionAndStream(stopStream: boolean) {\n this.closeConnection();\n stopStream && this.streamManager.stop();\n }\n\n protected abstract negotiateInternal(): CallConnectionInstanceBase['negotiating'];\n\n public negotiate() {\n const promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n return this.negotiating = this.negotiateInternal().finally(() => {\n this.negotiating = undefined;\n });\n }\n\n public sendDataChannelData(data: any) {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.dataChannel.send(JSON.stringify(data));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Logger, logger} from '../../logger';\n\nexport default function createPeerConnection(config: RTCConfiguration, log?: Logger) {\n if(!log) {\n log = logger('RTCPeerConnection');\n }\n\n log('constructor');\n\n // @ts-ignore\n const connection = new RTCPeerConnection(config);\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n });\n connection.addEventListener('signalingstatechange', () => {\n log('onsignalingstatechange', connection.signalingState);\n });\n connection.addEventListener('connectionstatechange', () => {\n log('onconnectionstatechange', connection.connectionState);\n });\n connection.addEventListener('negotiationneeded', () => { // * will be fired every time input device changes\n log('onnegotiationneeded', connection.signalingState);\n });\n connection.addEventListener('icecandidate', (event) => {\n log('onicecandidate', event);\n });\n connection.addEventListener('iceconnectionstatechange', () => {\n log('oniceconnectionstatechange', connection.iceConnectionState);\n });\n connection.addEventListener('datachannel', () => {\n log('ondatachannel');\n });\n\n connection.log = log;\n\n return {connection};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Logger, logger} from '../../logger';\n\nexport default function createDataChannel(connection: RTCPeerConnection, dict?: RTCDataChannelInit, log?: Logger) {\n // return;\n\n if(!log) {\n log = logger('RTCDataChannel');\n }\n\n const channel = connection.createDataChannel('data', dict);\n\n channel.addEventListener('message', (e) => {\n log('onmessage', e);\n });\n channel.addEventListener('open', () => {\n log('onopen');\n });\n channel.addEventListener('close', () => {\n log('onclose');\n });\n\n channel.log = log;\n\n return channel;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from '../sdp';\nimport {CallSignalingData, P2PVideoCodec} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function parseSignalingData(sdp: SDP) {\n const info = parseMediaSectionInfo(sdp, sdp.media[0]);\n\n const data: CallSignalingData.initialSetup = {\n '@type': 'InitialSetup',\n 'fingerprints': [info.fingerprint],\n 'ufrag': info.ufrag,\n 'pwd': info.pwd,\n 'audio': undefined,\n 'video': undefined,\n 'screencast': undefined\n };\n\n const convertNumber = (number: number) => '' + number;\n\n for(const section of sdp.media) {\n const mediaType = section.mediaType;\n if(mediaType === 'application' || !section.isSending) {\n continue;\n }\n\n const codec: P2PVideoCodec = data[mediaType === 'video' && data['video'] ? 'screencast' : mediaType] = {} as any;\n const info = parseMediaSectionInfo(sdp, section);\n codec.ssrc = convertNumber(info.source);\n\n if(info.sourceGroups) {\n codec.ssrcGroups = info.sourceGroups.map((sourceGroup) => ({semantics: sourceGroup.semantics, ssrcs: sourceGroup.sources.map(convertNumber)}));\n }\n\n const rtpExtensions: P2PVideoCodec['rtpExtensions'] = codec.rtpExtensions = [];\n section.attributes.get('extmap').forEach((attribute) => {\n rtpExtensions.push({\n id: +attribute.key,\n uri: attribute.value\n });\n });\n\n const payloadTypesMap: Map = new Map();\n\n const getPayloadType = (id: number) => {\n let payloadType = payloadTypesMap.get(id);\n if(!payloadType) {\n payloadTypesMap.set(id, payloadType = {\n id\n } as any);\n }\n\n return payloadType;\n };\n\n section.attributes.get('rtpmap').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const splitted = attribute.value.split('/');\n const [name, clockrate, channels] = splitted;\n payloadType.name = name;\n payloadType.clockrate = +clockrate;\n payloadType.channels = channels ? +channels : 0;\n });\n\n section.attributes.get('rtcp-fb').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n payloadType.feedbackTypes = attribute.lines.map((line) => {\n const splitted = line.split(' ');\n const [type, subtype] = splitted;\n return {\n type,\n subtype: subtype || ''\n };\n });\n });\n\n section.attributes.get('fmtp').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const parameters: P2PVideoCodec['payloadTypes'][0]['parameters'] = payloadType.parameters = {};\n const splitted = attribute.value.split(';');\n for(const str of splitted) {\n const [key, value] = str.split('=');\n parameters[key] = value;\n }\n });\n\n codec.payloadTypes = Array.from(payloadTypesMap.values());\n\n /* if(codec.payloadTypes.length > 5) {\n codec.payloadTypes.length = Math.min(codec.payloadTypes.length, 5);\n } */\n }\n\n return data;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CallConnectionInstanceBase, {CallConnectionInstanceOptions} from './callConnectionInstanceBase';\nimport CallInstance from './callInstance';\nimport parseSignalingData from './helpers/parseSignalingData';\nimport {parseSdp} from './sdp/utils';\n\nexport default class CallConnectionInstance extends CallConnectionInstanceBase {\n private call: CallInstance;\n\n constructor(options: CallConnectionInstanceOptions & {\n call: CallConnectionInstance['call']\n }) {\n super(options);\n }\n\n protected async negotiateInternal() {\n const {connection, call} = this;\n\n if(!connection.localDescription && !connection.remoteDescription && !call.isOutgoing) {\n return;\n }\n\n let descriptionInit: RTCSessionDescriptionInit;\n if(call.offerReceived) {\n call.offerReceived = false;\n\n const answer = descriptionInit = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n this.log('[InitialSetup] send 2');\n } else {\n const offer = descriptionInit = await connection.createOffer();\n\n this.log('[sdp] local', offer.sdp);\n await connection.setLocalDescription(offer);\n\n call.offerSent = true;\n\n this.log('[InitialSetup] send 0');\n }\n\n const initialSetup = parseSignalingData(parseSdp(descriptionInit.sdp));\n call.sendCallSignalingData(initialSetup);\n }\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport bufferConcats from '../../../helpers/bytes/bufferConcats';\nimport subtle from '../../crypto/subtle';\nimport sha256 from '../../crypto/utils/sha256';\n\nconst kMaxIncomingPacketSize = 128 * 1024 * 1024;\n\nexport default class P2PEncryptor {\n private type: 'Signaling';\n private counter: number;\n private seqMap: Map;\n\n constructor(private isOutgoing: boolean, private p2pKey: Uint8Array) {\n this.type = 'Signaling';\n this.counter = 0;\n this.seqMap = new Map();\n }\n\n private concatSHA256(parts: Uint8Array[]) {\n return sha256(bufferConcats(...parts));\n }\n\n private async encryptPrepared(buffer: Uint8Array) {\n const result = {\n counter: 0, // this.counterFromSeq(this.readSeq(buffer)),\n bytes: new Uint8Array(16 + buffer.length)\n };\n\n const x = (this.isOutgoing ? 0 : 8) + (this.type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n\n const msgKeyLarge = await this.concatSHA256([key.subarray(x + 88, x + 88 + 32), buffer]);\n const msgKey = result.bytes;\n for(let i = 0; i < 16; ++i) {\n msgKey[i] = msgKeyLarge[i + 8];\n }\n\n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n\n const bytes = await this.aesProcessCtr(buffer, buffer.length, aesKeyIv, true);\n\n result.bytes = new Uint8Array([...result.bytes.subarray(0, 16), ...bytes]);\n\n return result;\n }\n\n public encryptRawPacket(buffer: Uint8Array) {\n const seq = ++this.counter;\n const arr = new ArrayBuffer(4);\n const view = new DataView(arr);\n view.setUint32(0, seq >>> 0, false); // byteOffset = 0; litteEndian = false\n\n const result = new Uint8Array([...new Uint8Array(arr), ...buffer]);\n\n return this.encryptPrepared(result);\n }\n\n private async prepareAesKeyIv(key: Uint8Array, msgKey: Uint8Array, x: number) {\n const [sha256a, sha256b] = await Promise.all([\n this.concatSHA256([\n msgKey.subarray(0, 16),\n key.subarray(x, x + 36)\n ]),\n\n this.concatSHA256([\n key.subarray(40 + x, 40 + x + 36),\n msgKey.subarray(0, 16)\n ])\n ]);\n\n return {\n key: new Uint8Array([\n ...sha256a.subarray(0, 8),\n ...sha256b.subarray(8, 8 + 16),\n ...sha256a.subarray(24, 24 + 8)\n ]),\n iv: new Uint8Array([\n ...sha256b.subarray(0, 4),\n ...sha256a.subarray(8, 8 + 8),\n ...sha256b.subarray(24, 24 + 4)\n ])\n };\n }\n\n private async aesProcessCtr(encryptedData: Uint8Array, dataSize: number, aesKeyIv: {key: Uint8Array, iv: Uint8Array}, encrypt = true) {\n const cryptoKey = await subtle.importKey(\n 'raw',\n aesKeyIv.key,\n {name: 'AES-CTR'},\n false,\n [encrypt ? 'encrypt' : 'decrypt']\n );\n\n const buffer: ArrayBuffer = await subtle[encrypt ? 'encrypt' : 'decrypt']({\n name: 'AES-CTR',\n counter: aesKeyIv.iv,\n length: aesKeyIv.iv.length * 8\n },\n cryptoKey,\n encryptedData\n );\n\n return new Uint8Array(buffer);\n }\n\n private constTimeIsDifferent(a: Uint8Array, b: Uint8Array, count: number) {\n let msgKeyEquals = true;\n for(let i = 0; i < count; ++i) {\n if(a[i] !== b[i]) {\n msgKeyEquals = false;\n }\n }\n\n return !msgKeyEquals;\n }\n\n public async decryptRawPacket(buffer: Uint8Array) {\n if(buffer.length < 21 || buffer.length > kMaxIncomingPacketSize) {\n return;\n }\n\n const {isOutgoing, type} = this;\n\n const x = (isOutgoing ? 8 : 0) + (type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n\n const msgKey = buffer.subarray(0, 16);\n const encryptedData = buffer.subarray(16);\n const encryptedDataSize = buffer.length - 16;\n\n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n\n const decryptionBuffer = await this.aesProcessCtr(encryptedData, encryptedDataSize, aesKeyIv, false);\n\n const msgKeyLarge = await this.concatSHA256([\n key.subarray(88 + x, 88 + x + 32),\n decryptionBuffer\n ]);\n\n if(this.constTimeIsDifferent(msgKeyLarge.subarray(8), msgKey, 16)) {\n return;\n }\n\n const dataView = new DataView(decryptionBuffer.buffer);\n const seq = dataView.getUint32(0);\n if(this.seqMap.has(seq)) {\n return;\n }\n this.seqMap.set(seq, seq);\n\n return decryptionBuffer.slice(4);\n }\n}\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then((b) => {\n // console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n\n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport StringFromLineBuilder from '../stringFromLineBuilder';\nimport {addDataChannel, addExtmap, addPayloadTypes, addSsrc} from './p2PSdpBuilder';\n\nexport default class ChromeP2PSdpBuilder {\n static generateOffer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n\n static generateAnswer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n}\n","/*\n* Copyright (c) 2018-present, Evgeny Nadymov\n*\n* This source code is licensed under the GPL v.3.0 license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\nimport ChromeP2PSdpBuilder from './chromeP2PSdpBuilder';\nimport { FirefoxP2PSdpBuilder } from './firefoxP2PSdpBuilder';\nimport { SafariP2PSdpBuilder } from './safariP2PSdpBuilder';\n// import { TG_CALLS_SDP_STRING } from '../../Stores/CallStore';\n\nexport function p2pParseCandidate(candidate) {\n if(!candidate || !candidate.startsWith('candidate:')) {\n return;\n }\n \n const sdpString = candidate;\n candidate = candidate.substr('candidate:'.length);\n \n const [foundation, component, protocol, priority, ip, port, ...other] = candidate.split(' ');\n const c = {\n sdpString,\n foundation,\n component,\n protocol,\n priority,\n address: { ip, port }\n };\n \n for(let i = 0; i < other.length; i += 2) {\n switch(other[i]) {\n case 'typ': {\n c.type = other[i + 1];\n break;\n }\n case 'raddr': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.ip = other[i + 1];\n break;\n }\n case 'rport': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.port = other[i + 1];\n break;\n }\n case 'generation': {\n c.generation = other[i + 1];\n break;\n }\n case 'tcptype': {\n c.tcpType = other[i + 1];\n break;\n }\n case 'network-id': {\n c.networkId = other[i + 1];\n break;\n }\n case 'network-cost': {\n c.networkCost = other[i + 1];\n break;\n }\n case 'ufrag': {\n c.username = other[i + 1];\n break;\n }\n }\n }\n \n return c;\n}\n\nexport function p2pParseSdp(sdp) {\n const lines = sdp.split('\\r\\n');\n const lookup = (prefix, force = true, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return line.substr(prefix.length);\n }\n }\n \n if (force) {\n console.error(\"Can't find prefix\", prefix);\n }\n \n return null;\n };\n const findIndex = (prefix, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return i;\n }\n }\n \n return -1;\n };\n \n const pwdIndex = findIndex('a=ice-pwd:');\n const ufragIndex = findIndex('a=ice-ufrag:');\n if (pwdIndex === -1 && ufragIndex === -1) {\n return {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n }\n \n const info = {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n \n let mediaIndex = findIndex('m=');\n const fingerprint = lookup('a=fingerprint:', false);\n const setup = lookup('a=setup:', false);\n if (fingerprint && setup) {\n info.fingerprints.push({\n hash: fingerprint.split(' ')[0],\n fingerprint: fingerprint.split(' ')[1],\n setup\n });\n }\n \n const ufrag = lookup('a=ice-ufrag:', false);\n const pwd = lookup('a=ice-pwd:', false);\n if (ufrag && pwd) {\n info.ufrag = ufrag;\n info.pwd = pwd;\n }\n \n while (mediaIndex !== -1) {\n let nextMediaIndex = findIndex('m=', mediaIndex + 1);\n \n const extmap = [];\n const types = [];\n const mediaType = lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0];\n const media = {\n // type: lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0],\n // mid: lookup('a=mid:', true, mediaIndex, nextMediaIndex),\n // dir: findDirection(mediaIndex, nextMediaIndex),\n rtpExtensions: extmap,\n payloadTypes: types\n }\n \n const lineTo = nextMediaIndex === -1 ? lines.length : nextMediaIndex;\n const fmtp = new Map();\n const rtcpFb = new Map();\n for (let i = mediaIndex; i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith('a=extmap:')) {\n const [ id, uri ] = line.substr('a=extmap:'.length).split(' ');\n extmap.push({ id: parseInt(id), uri });\n } else if (line.startsWith('a=fmtp:')) {\n const [ id, str ] = line.substr('a=fmtp:'.length).split(' ');\n const obj = { };\n const arr = str.split(';').map(x => {\n const [ key, value ] = x.split('=');\n obj[key] = value;\n return { [key]: value };\n });\n fmtp.set(parseInt(id), obj);\n } else if (line.startsWith('a=rtcp-fb:')) {\n const [ id, type = '', subtype = '' ] = line.substr('a=rtcp-fb:'.length).split(' ');\n if (rtcpFb.has(parseInt(id))) {\n rtcpFb.get(parseInt(id)).push({ type, subtype });\n } else {\n rtcpFb.set(parseInt(id), [{ type, subtype }])\n }\n } else if (line.startsWith('a=rtpmap')) {\n const [ id, str ] = line.substr('a=rtpmap:'.length).split(' ');\n const [ name, clockrate, channels = '0' ] = str.split('/');\n const obj = { id: parseInt(id), name, clockrate: parseInt(clockrate), channels: parseInt(channels) };\n \n types.push(obj);\n }\n }\n \n for (let i = 0; i < types.length; i++) {\n const { id } = types[i];\n if (rtcpFb.has(id)) {\n types[i].feedbackTypes = rtcpFb.get(id);\n }\n if (fmtp.has(id)) {\n types[i].parameters = fmtp.get(id);\n }\n }\n \n const ssrc = lookup('a=ssrc:', false, mediaIndex, nextMediaIndex);\n if (ssrc) {\n media.ssrc = ssrc.split(' ')[0];\n }\n \n const ssrcGroup = lookup('a=ssrc-group:', false, mediaIndex, nextMediaIndex);\n if (ssrcGroup) {\n const [ semantics, ...ssrcs ] = ssrcGroup.split(' ');\n media.ssrcGroups = [{\n semantics,\n ssrcs\n }]\n }\n \n switch (mediaType) {\n case 'audio': {\n info.audio = media;\n break;\n }\n case 'video': {\n info.video = media;\n break;\n }\n }\n \n mediaIndex = nextMediaIndex;\n }\n\n if(!info.video.ssrcGroups) {\n info.video.ssrcGroups = [];\n }\n\n info['@type'] = 'InitialSetup';\n \n // console.log('[p2pParseSdp]', sdp, info);\n return info;\n}\n\nexport function isFirefox() {\n return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n}\n\nfunction isSafari() {\n return navigator.userAgent.toLowerCase().indexOf('safari') > -1 && navigator.userAgent.toLowerCase().indexOf('chrome') === -1;\n}\n\nexport function addExtmap(extmap) {\n let sdp = [];\n // return sdp;\n for (let j = 0; j < extmap.length; j++) {\n const ext = extmap[j];\n const { id, uri } = ext;\n // if (isFirefox() && uri.indexOf(''))\n console.log('[extmap] add', id, uri);\n sdp.push(`a=extmap:${id} ${uri}`);\n }\n \n return sdp.join('\\n');\n}\n\nexport function addPayloadTypes(types) {\n let sdp = [];\n console.log('[SDP] addPayloadTypes', types);\n for (let i = 0; i < types.length; i++) {\n const type = types[i];\n const { id, name, clockrate, channels, feedbackTypes, parameters } = type;\n sdp.push(`a=rtpmap:${id} ${name}/${clockrate}${channels ? '/' + channels : ''}`);\n if (feedbackTypes) {\n feedbackTypes.forEach(x => {\n const { type, subtype } = x;\n sdp.push(`a=rtcp-fb:${id} ${[type, subtype].join(' ')}`);\n });\n }\n if (parameters) {\n const fmtp = [];\n Object.getOwnPropertyNames(parameters).forEach(pName => {\n fmtp.push(`${pName}=${parameters[pName]}`);\n });\n \n sdp.push(`a=fmtp:${id} ${fmtp.join(';')}`);\n }\n }\n \n return sdp.join('\\n');\n}\n\nexport function addSsrc(type, ssrc, ssrcGroups, streamName) {\n let sdp = [];\n \n if (ssrcGroups && ssrcGroups.length > 0) {\n ssrcGroups.forEach(ssrcGroup => {\n if (ssrcGroup && ssrcGroup.ssrcs.length > 0) {\n sdp.push(`a=ssrc-group:${ssrcGroup.semantics} ${ssrcGroup.ssrcs.join(' ')}`);\n ssrcGroup.ssrcs.forEach(ssrc => {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n });\n }\n });\n } else if (ssrc) {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n }\n \n return sdp.join('\\n');\n}\n\nexport function addDataChannel(mid) {\n return `m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144`;\n}\n\nexport class P2PSdpBuilder {\n static generateCandidate(info) {\n if (!info) return null;\n \n const { sdpString, sdpMLineIndex, sdpMid, foundation, component, protocol, priority, address, type, relAddress, generation, tcpType, networkId, networkCost, username } = info;\n if (/* TG_CALLS_SDP_STRING */true) {\n if (sdpString) {\n return {\n candidate: sdpString,\n sdpMLineIndex,\n sdpMid\n };\n }\n }\n throw 'no sdpString';\n \n let candidate = `candidate:${foundation} ${component} ${protocol} ${priority} ${address.ip} ${address.port}`;\n const attrs = []\n if (type) {\n attrs.push(`typ ${type}`);\n }\n if (relAddress) {\n attrs.push(`raddr ${relAddress.ip}`);\n attrs.push(`rport ${relAddress.port}`);\n }\n if (tcpType) {\n attrs.push(`tcptype ${tcpType}`);\n }\n if (generation) {\n attrs.push(`generation ${generation}`);\n }\n if (username) {\n attrs.push(`ufrag ${username}`);\n }\n if (networkId) {\n attrs.push(`network-id ${networkId}`);\n }\n if (networkCost) {\n attrs.push(`network-cost ${networkCost}`);\n }\n if (attrs.length > 0) {\n candidate += ` ${attrs.join(' ')}`;\n }\n \n return { candidate, sdpMid, sdpMLineIndex };\n }\n \n static generateOffer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateOffer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateOffer(info);\n }\n \n return ChromeP2PSdpBuilder.generateOffer(info);\n }\n \n static generateAnswer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateAnswer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateAnswer(info);\n }\n \n return ChromeP2PSdpBuilder.generateAnswer(info);\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class FirefoxP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, mid, ssrc, ssrcGroups, payloadTypes, dir, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class SafariP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from '../../environment/ctx';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {GroupCallParticipantVideoSourceGroup, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, Update} from '../../layer';\nimport {emojiFromCodePoints} from '../../vendor/emoji';\nimport type {CallId} from '../appManagers/appCallsManager';\nimport type {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport CallConnectionInstance from './callConnectionInstance';\nimport CallInstanceBase from './callInstanceBase';\nimport callsController from './callsController';\nimport CALL_STATE from './callState';\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS} from './constants';\nimport parseSignalingData from './helpers/parseSignalingData';\nimport stopTrack from './helpers/stopTrack';\nimport localConferenceDescription, {ConferenceEntry, generateSsrc} from './localConferenceDescription';\nimport getCallProtocol from './p2P/getCallProtocol';\nimport getRtcConfiguration from './p2P/getRtcConfiguration';\nimport P2PEncryptor from './p2P/p2PEncryptor';\nimport {p2pParseCandidate, P2PSdpBuilder} from './p2P/p2PSdpBuilder';\nimport {parseSdp} from './sdp/utils';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {AudioCodec, CallMediaState, CallSignalingData, DiffieHellmanInfo, P2PAudioCodec, P2PVideoCodec, VideoCodec} from './types';\n\nexport default class CallInstance extends CallInstanceBase<{\n state: (state: CALL_STATE) => void,\n id: (id: CallId, prevId: CallId) => void,\n muted: (muted: boolean) => void,\n mediaState: (mediaState: CallMediaState) => void,\n acceptCallOverride: () => Promise,\n}> {\n public dh: Partial;\n public id: CallId;\n public call: PhoneCall;\n public interlocutorUserId: UserId;\n public protocol: PhoneCallProtocol;\n public isOutgoing: boolean;\n public encryptionKey: Uint8Array;\n public connectionInstance: CallConnectionInstance;\n public encryptor: P2PEncryptor;\n public decryptor: P2PEncryptor;\n public candidates: RTCIceCandidate[];\n\n public offerReceived: boolean;\n public offerSent: boolean;\n\n public createdParticipantEntries: boolean;\n public release: () => Promise;\n public _connectionState: CALL_STATE;\n\n public createdAt: number;\n public connectedAt: number;\n public discardReason: string;\n\n private managers: AppManagers;\n\n private hangUpTimeout: number;\n\n private mediaStates: {\n input: CallMediaState,\n output?: CallMediaState\n };\n\n private sendMediaState: () => Promise;\n\n private decryptQueue: Uint8Array[];\n\n private getEmojisFingerprintPromise: Promise;\n private emojisFingerprint: [string, string, string, string];\n\n private wasStartingScreen: boolean;\n private wasStartingVideo: boolean;\n public wasTryingToJoin: boolean;\n\n public streamManager: StreamManager;\n\n constructor(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n managers: CallInstance['managers'],\n protocol?: PhoneCallProtocol\n }) {\n super();\n\n this.log = logger('CALL');\n\n if(!this.protocol) {\n this.protocol = getCallProtocol();\n }\n\n safeAssign(this, options);\n\n this.createdAt = Date.now();\n this.offerReceived = false;\n this.offerSent = false;\n this.decryptQueue = [];\n this.candidates = [];\n\n this.addEventListener('state', (state) => {\n this.log('state', CALL_STATE[state]);\n\n if(state === CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n\n const streamManager = this.streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n streamManager.direction = 'sendrecv';\n streamManager.types.push('screencast');\n if(!this.isOutgoing) {\n streamManager.locked = true;\n streamManager.canCreateConferenceEntry = false;\n }\n\n let mediaState: CallMediaState = {\n '@type': 'MediaState',\n 'type': 'input',\n 'lowBattery': false,\n 'muted': true,\n 'screencastState': 'inactive',\n 'videoRotation': 0,\n 'videoState': 'inactive'\n };\n\n const self = this;\n mediaState = new Proxy(mediaState, {\n set: function(target, key, value) {\n // @ts-ignore\n target[key] = value;\n self.setMediaState(mediaState);\n self.sendMediaState();\n return true;\n }\n });\n\n this.mediaStates = {\n input: mediaState\n };\n\n this.sendMediaState = debounce(this._sendMediaState.bind(this), 0, false, true);\n }\n\n get connectionState() {\n const {_connectionState, connectionInstance} = this;\n if(_connectionState !== undefined) {\n return _connectionState;\n } else if(!connectionInstance) {\n return CALL_STATE.CONNECTING;\n } else {\n const {iceConnectionState} = connectionInstance.connection;\n if(iceConnectionState === 'closed') {\n return CALL_STATE.CLOSED;\n } else if(iceConnectionState !== 'connected' && (!IS_SAFARI || iceConnectionState !== 'completed')) {\n return CALL_STATE.CONNECTING;\n } else {\n return CALL_STATE.CONNECTED;\n }\n }\n }\n\n get sortIndex() {\n const connectionState = this.connectionState;\n const state = CALL_STATE.CLOSED - connectionState + 1;\n let index = state * 10000000000000;\n index += 2147483647000 - (connectionState === CALL_STATE.PENDING && this.isOutgoing ? 0 : this.createdAt);\n return index;\n }\n\n public getVideoElement(type: CallMediaState['type']) {\n if(type === 'input') return this.elements.get('main');\n else {\n const mediaState = this.getMediaState('output');\n if(!mediaState) {\n return;\n }\n\n const type: WebRTCLineType = mediaState.videoState === 'active' ? 'video' : (mediaState.screencastState === 'active' ? 'screencast' : undefined);\n if(!type) {\n return;\n }\n\n const entry = this.description.findEntry((entry) => entry.type === type);\n if(!entry) {\n return;\n }\n\n return this.elements.get('' + entry.recvEntry.source);\n }\n }\n\n public async startScreenSharingInternal() {\n try {\n this.wasStartingScreen = true;\n this.wasStartingVideo = false;\n this.streamManager.types = ['audio', 'screencast'];\n await this.requestScreen();\n } catch(err) {\n this.log.error('startScreenSharing error', err);\n }\n }\n\n public async toggleScreenSharing() {\n if(this.isSharingVideo) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingScreen) {\n return this.stopVideoSharing();\n } else {\n return this.startScreenSharingInternal();\n }\n }\n\n public async startVideoSharingInternal() {\n try {\n this.wasStartingScreen = false;\n this.wasStartingVideo = true;\n this.streamManager.types = ['audio', 'video'];\n await this.requestInputSource(false, true, false);\n } catch(err) {\n this.log.error('startVideoSharing error', err);\n }\n }\n\n public async stopVideoSharing() {\n const mediaState = this.getMediaState('input');\n mediaState.videoState = mediaState.screencastState = 'inactive';\n\n const {streamManager, description} = this;\n const track = streamManager.inputStream.getVideoTracks()[0];\n if(track) {\n stopTrack(track);\n streamManager.appendToConference(description); // clear sender track\n }\n }\n\n public async toggleVideoSharing() {\n if(this.isSharingScreen) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharingInternal();\n }\n }\n\n public getMediaState(type: CallMediaState['type']) {\n return this.mediaStates[type];\n }\n\n public setMediaState(mediaState: CallMediaState) {\n this.mediaStates[mediaState.type] = mediaState;\n this.dispatchEvent('mediaState', mediaState);\n }\n\n public isSharingVideoType(type: 'video' | 'screencast') {\n try {\n const hasVideoTrack = super.isSharingVideo;\n return hasVideoTrack && !!((this.wasStartingScreen && type === 'screencast') || (this.wasStartingVideo && type === 'video'));\n\n // ! it will be used before the track appears\n // return !!this.description.entries.find((entry) => entry.type === type && entry.transceiver.sender.track.enabled);\n } catch(err) {\n return false;\n }\n }\n\n public get isSharingVideo() {\n return this.isSharingVideoType('video');\n }\n\n public get isSharingScreen() {\n return this.isSharingVideoType('screencast');\n }\n\n public get isMuted() {\n const audioTrack = this.streamManager.inputStream.getAudioTracks()[0];\n return !audioTrack?.enabled;\n }\n\n public get isClosing() {\n const {connectionState} = this;\n return connectionState === CALL_STATE.CLOSING || connectionState === CALL_STATE.CLOSED;\n }\n\n public get description(): localConferenceDescription {\n return this.connectionInstance?.description;\n }\n\n public setHangUpTimeout(timeout: number, reason: PhoneCallDiscardReason['_']) {\n this.clearHangUpTimeout();\n this.hangUpTimeout = ctx.setTimeout(() => {\n this.hangUpTimeout = undefined;\n this.hangUp(reason);\n }, timeout);\n }\n\n public clearHangUpTimeout() {\n if(this.hangUpTimeout !== undefined) {\n clearTimeout(this.hangUpTimeout);\n this.hangUpTimeout = undefined;\n }\n }\n\n public setPhoneCall(phoneCall: PhoneCall) {\n this.call = phoneCall;\n\n const {id} = phoneCall;\n if(this.id !== id) {\n const prevId = this.id;\n this.id = id;\n this.dispatchEvent('id', id, prevId);\n }\n }\n\n public async acceptCall() {\n const canAccept = (await Promise.all(this.dispatchResultableEvent('acceptCallOverride')))[0] ?? true;\n if(this.isClosing || !canAccept) {\n return;\n }\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n\n const call = this.call as PhoneCall.phoneCallRequested;\n this.requestInputSource(true, !!call.pFlags.video, false);\n\n const g_a_hash = call.g_a_hash;\n this.managers.appCallsManager.generateDh().then(async(dh) => {\n this.dh = { // ! it is correct\n g_a_hash,\n b: dh.a,\n g_b: dh.g_a,\n g_b_hash: dh.g_a_hash,\n p: dh.p\n };\n\n return this.managers.apiManager.invokeApi('phone.acceptCall', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n protocol: this.protocol,\n g_b: this.dh.g_b\n });\n }).then(async(phonePhoneCall) => {\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n }).catch((err) => {\n this.log.error('accept call error', err);\n // if(err.type === 'CALL_PROTOCOL_COMPAT_LAYER_INVALID') {\n\n // }\n\n this.hangUp('phoneCallDiscardReasonHangup');\n });\n }\n\n public joinCall() {\n this.log('joinCall');\n\n this.getEmojisFingerprint();\n\n this.overrideConnectionState();\n\n const {isOutgoing, encryptionKey, streamManager} = this;\n\n const configuration = getRtcConfiguration(this.call as PhoneCall.phoneCall);\n this.log('joinCall configuration', configuration);\n if(!configuration) return;\n\n const connectionInstance = this.connectionInstance = new CallConnectionInstance({\n call: this,\n streamManager,\n log: this.log.bindPrefix('connection')\n });\n\n const connection = connectionInstance.createPeerConnection(configuration);\n connection.addEventListener('iceconnectionstatechange', () => {\n const state = this.connectionState;\n if(this.connectedAt === undefined && state === CALL_STATE.CONNECTED) {\n this.connectedAt = Date.now();\n }\n\n this.dispatchEvent('state', state);\n });\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n connection.addEventListener('icecandidate', (event) => {\n const {candidate} = event;\n connection.log('onicecandidate', candidate);\n if(candidate?.candidate) {\n this.sendIceCandidate(candidate);\n }\n });\n connection.addEventListener('track', (event) => {\n const {track} = event;\n connection.log('ontrack', track);\n this.onTrack(event);\n });\n\n const description = connectionInstance.createDescription();\n\n this.encryptor = new P2PEncryptor(isOutgoing, encryptionKey);\n this.decryptor = new P2PEncryptor(!isOutgoing, encryptionKey);\n\n this.log('currentCall', this);\n\n if(isOutgoing) {\n connectionInstance.appendStreamToConference();\n }\n\n this.createDataChannel();\n\n this.processDecryptQueue();\n }\n\n private createDataChannelEntry() {\n const dataChannelEntry = this.description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n dataChannelEntry.sendEntry = dataChannelEntry.recvEntry = dataChannelEntry;\n }\n\n private createDataChannel() {\n if(this.connectionInstance.dataChannel) {\n return;\n }\n\n const channel = this.connectionInstance.createDataChannel({\n id: 0,\n negotiated: true\n });\n channel.addEventListener('message', (e) => {\n this.applyDataChannelData(JSON.parse(e.data));\n });\n channel.addEventListener('open', () => {\n this.sendMediaState();\n });\n }\n\n private applyDataChannelData(data: CallMediaState) {\n switch(data['@type']) {\n case 'MediaState': {\n data.type = 'output';\n this.log('got output media state', data);\n this.setMediaState(data);\n break;\n }\n\n default:\n this.log.error('unknown data channel data:', data);\n break;\n }\n }\n\n private _sendMediaState() {\n const {connectionInstance} = this;\n if(!connectionInstance) return;\n\n const mediaState = {...this.getMediaState('input')};\n // mediaState.videoRotation = 90;\n delete mediaState.type;\n this.log('sendMediaState', mediaState);\n\n connectionInstance.sendDataChannelData(mediaState);\n }\n\n public async sendCallSignalingData(data: CallSignalingData) {\n /* if(data['@type'] === 'InitialSetup') {\n this.filterNotVP8(data);\n } */\n\n const json = JSON.stringify(data);\n const arr = new TextEncoder().encode(json);\n const {bytes} = await this.encryptor.encryptRawPacket(arr);\n\n this.log('sendCallSignalingData', this.id, json);\n await this.managers.apiManager.invokeApi('phone.sendSignalingData', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n data: bytes\n });\n }\n\n public sendIceCandidate(iceCandidate: RTCIceCandidate) {\n this.log('sendIceCandidate', iceCandidate);\n const {candidate, sdpMLineIndex} = iceCandidate;\n if(sdpMLineIndex !== 0) {\n return;\n }\n\n const parsed = p2pParseCandidate(candidate);\n // const parsed = {sdpString: candidate};\n /* if(parsed.address.ip !== '') {\n return;\n } */\n\n this.sendCallSignalingData({\n '@type': 'Candidates',\n 'candidates': [parsed]\n });\n }\n\n public async confirmCall() {\n const {protocol, id, call} = this;\n const dh = this.dh as DiffieHellmanInfo.a;\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey((call as PhoneCall.phoneCallAccepted).g_b, dh.a, dh.p);\n\n const phonePhoneCall = await this.managers.apiManager.invokeApi('phone.confirmCall', {\n peer: await this.managers.appCallsManager.getCallInput(id),\n protocol: protocol,\n g_a: dh.g_a,\n key_fingerprint: key_fingerprint\n });\n\n this.encryptionKey = key;\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n this.joinCall();\n }\n\n public getEmojisFingerprint() {\n if(this.emojisFingerprint) return this.emojisFingerprint;\n if(this.getEmojisFingerprintPromise) return this.getEmojisFingerprintPromise;\n return this.getEmojisFingerprintPromise = apiManagerProxy.invokeCrypto('get-emojis-fingerprint', this.encryptionKey, this.dh.g_a).then((codePoints) => {\n this.getEmojisFingerprintPromise = undefined;\n return this.emojisFingerprint = codePoints.map((codePoints) => emojiFromCodePoints(codePoints)) as [string, string, string, string];\n });\n }\n\n private unlockStreamManager() {\n this.connectionInstance.streamManager.locked = false;\n this.connectionInstance.appendStreamToConference();\n }\n\n private async doTheMagic() {\n this.connectionInstance.appendStreamToConference();\n\n const connection = this.connectionInstance.connection;\n\n let answer = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n connection.getTransceivers().filter((transceiver) => transceiver.direction === 'recvonly').forEach((transceiver) => {\n const entry = this.connectionInstance.description.getEntryByMid(transceiver.mid);\n entry.transceiver = entry.recvEntry.transceiver = transceiver;\n transceiver.direction = 'sendrecv';\n });\n\n const isAnswer = false;\n\n const description = this.description;\n const bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n await connection.setRemoteDescription(sdpDescription);\n\n answer = await connection.createAnswer();\n\n await connection.setLocalDescription(answer);\n\n const initialSetup = parseSignalingData(parseSdp(answer.sdp));\n this.log('[InitialSetup] send 1');\n this.sendCallSignalingData(initialSetup);\n\n this.unlockStreamManager();\n }\n\n public overrideConnectionState(state?: CALL_STATE) {\n this._connectionState = state;\n this.dispatchEvent('state', this.connectionState);\n }\n\n public get duration() {\n return this.connectedAt !== undefined ? (Date.now() - this.connectedAt) / 1000 | 0 : 0;\n }\n\n protected onInputStream(stream: MediaStream): void {\n super.onInputStream(stream);\n\n const videoTrack = stream.getVideoTracks()[0];\n if(videoTrack) {\n const state = this.getMediaState('input');\n\n // handle starting camera\n if(!this.wasStartingScreen && !this.wasStartingVideo) {\n this.wasStartingVideo = true;\n }\n\n if(this.isSharingVideo) {\n state.videoState = 'active';\n } else if(this.isSharingScreen) {\n state.screencastState = 'active';\n }\n\n videoTrack.addEventListener('ended', () => {\n this.stopVideoSharing();\n }, {once: true});\n }\n\n if(stream.getAudioTracks().length) {\n this.onMutedChange();\n }\n }\n\n private onMutedChange() {\n const isMuted = this.isMuted;\n this.dispatchEvent('muted', isMuted);\n\n const state = this.getMediaState('input');\n state.muted = isMuted;\n }\n\n public toggleMuted(): Promise {\n return this.requestAudioSource(true).then(() => {\n this.setMuted();\n this.onMutedChange();\n });\n }\n\n public async hangUp(discardReason?: PhoneCallDiscardReason['_'], discardedByOtherParty?: boolean) {\n if(this.isClosing) {\n return;\n }\n\n this.discardReason = discardReason;\n this.log('hangUp', discardReason);\n this.overrideConnectionState(CALL_STATE.CLOSED);\n\n if(this.connectionInstance) {\n this.connectionInstance.closeConnectionAndStream(true);\n }\n\n if(discardReason && !discardedByOtherParty) {\n let hasVideo = false;\n for(const type in this.mediaStates) {\n const mediaState = this.mediaStates[type as 'input' | 'output'];\n hasVideo = mediaState.videoState === 'active' || mediaState.screencastState === 'active' || hasVideo;\n }\n\n await this.managers.appCallsManager.discardCall(this.id, this.duration, discardReason, hasVideo);\n }\n }\n\n private performCodec(_codec: P2PAudioCodec | P2PVideoCodec) {\n const payloadTypes: AudioCodec['payload-types'] = _codec.payloadTypes.map((payloadType) => {\n return {\n ...payloadType,\n 'rtcp-fbs': payloadType.feedbackTypes\n }\n });\n\n const codec: AudioCodec = {\n 'rtp-hdrexts': _codec.rtpExtensions,\n 'payload-types': payloadTypes\n };\n\n return codec;\n }\n\n private setDataToDescription(data: CallSignalingData.initialSetup) {\n this.description.setData({\n transport: {\n 'pwd': data.pwd,\n 'ufrag': data.ufrag,\n 'fingerprints': data.fingerprints,\n 'rtcp-mux': true\n },\n audio: this.performCodec(data.audio),\n video: data.video ? this.performCodec(data.video) as VideoCodec : undefined,\n screencast: data.screencast ? this.performCodec(data.screencast) as VideoCodec : undefined\n });\n }\n\n private filterNotVP8(initialSetup: CallSignalingData.initialSetup) {\n if(!this.isOutgoing) { // only VP8 works now\n [initialSetup.video, initialSetup.screencast].filter(Boolean).forEach((codec) => {\n const payloadTypes = codec.payloadTypes;\n const idx = payloadTypes.findIndex((payloadType) => payloadType.name === 'VP8');\n const vp8PayloadType = payloadTypes[idx];\n const rtxIdx = payloadTypes.findIndex((payloadType) => +payloadType.parameters?.apt === vp8PayloadType.id);\n codec.payloadTypes = [payloadTypes[idx], payloadTypes[rtxIdx]];\n });\n }\n }\n\n public async applyCallSignalingData(data: CallSignalingData) {\n this.log('applyCallSignalingData', this, data);\n\n const {connection, description} = this.connectionInstance;\n\n switch(data['@type']) {\n case 'InitialSetup': {\n this.log('[sdp] InitialSetup', data);\n\n this.filterNotVP8(data);\n this.setDataToDescription(data);\n\n const performSsrcGroups = (ssrcGroups: P2PVideoCodec['ssrcGroups']): GroupCallParticipantVideoSourceGroup[] => {\n return ssrcGroups.map((ssrcGroup) => {\n return {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics: ssrcGroup.semantics,\n sources: ssrcGroup.ssrcs.map((source) => +source)\n };\n });\n };\n\n const ssrcs = [\n generateSsrc('audio', +data.audio.ssrc),\n data.video ? generateSsrc('video', performSsrcGroups(data.video.ssrcGroups)) : undefined,\n data.screencast ? generateSsrc('screencast', performSsrcGroups(data.screencast.ssrcGroups)) : undefined\n ].filter(Boolean);\n\n ssrcs.forEach((ssrc) => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n return;\n }\n\n const sendRecvEntry = description.findFreeSendRecvEntry(ssrc.type, false);\n entry = new ConferenceEntry(sendRecvEntry.mid, ssrc.type);\n entry.setDirection('sendrecv');\n sendRecvEntry.recvEntry = entry;\n\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n });\n\n this.createDataChannelEntry();\n\n const isAnswer = this.offerSent;\n this.offerSent = false;\n\n const bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n this.log('[sdp] remote', sdpDescription.sdp);\n\n await connection.setRemoteDescription(sdpDescription);\n\n await this.tryToReleaseCandidates();\n\n if(!isAnswer) {\n await this.doTheMagic();\n }\n\n break;\n }\n\n case 'Candidates': {\n for(const candidate of data.candidates) {\n const init: RTCIceCandidateInit = P2PSdpBuilder.generateCandidate(candidate);\n init.sdpMLineIndex = 0;\n const iceCandidate = new RTCIceCandidate(init);\n this.candidates.push(iceCandidate);\n }\n\n await this.tryToReleaseCandidates();\n break;\n }\n\n default: {\n this.log.error('unrecognized signaling data', data);\n }\n }\n }\n\n public async tryToReleaseCandidates() {\n const {connectionInstance} = this;\n if(!connectionInstance) {\n return;\n }\n\n const {connection} = connectionInstance;\n if(connection.remoteDescription) {\n const promises: Promise[] = this.candidates.map((candidate) => this.addIceCandidate(connection, candidate));\n this.candidates.length = 0;\n\n await Promise.all(promises);\n } else {\n this.log('[candidates] postpone');\n }\n }\n\n private async addIceCandidate(connection: RTCPeerConnection, candidate: RTCIceCandidate) {\n this.log('[candidate] start', candidate);\n try {\n // if(!candidate.address) return;\n await connection.addIceCandidate(candidate);\n this.log('[candidate] add', candidate);\n } catch(e) {\n this.log.error('[candidate] error', candidate, e);\n }\n }\n\n private async processDecryptQueue() {\n const {encryptor} = this;\n if(!encryptor) {\n this.log.warn('got encrypted signaling data before the encryption key');\n return;\n }\n\n const length = this.decryptQueue.length;\n if(!length) {\n return;\n }\n\n const queue = this.decryptQueue.slice();\n this.decryptQueue.length = 0;\n\n for(const data of queue) {\n const decryptedData = await encryptor.decryptRawPacket(data);\n if(!decryptedData) {\n continue;\n }\n\n // this.log('[update] updateNewCallSignalingData', update, decryptedData);\n\n const str = new TextDecoder().decode(decryptedData);\n try {\n const signalingData: CallSignalingData = JSON.parse(str);\n this.log('[update] updateNewCallSignalingData', signalingData);\n this.applyCallSignalingData(signalingData);\n } catch(err) {\n this.log.error('wrong signaling data', str);\n this.hangUp('phoneCallDiscardReasonDisconnect');\n callsController.dispatchEvent('incompatible', this.interlocutorUserId);\n }\n }\n }\n\n public onUpdatePhoneCallSignalingData(data: Uint8Array) {\n this.decryptQueue.push(data);\n this.processDecryptQueue();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {PhoneCallProtocol} from '../../../layer';\n\nexport default function getCallProtocol(): PhoneCallProtocol {\n return {\n _: 'phoneCallProtocol',\n pFlags: {\n udp_p2p: true,\n udp_reflector: true\n },\n min_layer: 92,\n max_layer: 92,\n library_versions: ['4.0.0']\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {PhoneCall} from '../../../layer';\n\nexport default function getRtcConfiguration(call: PhoneCall.phoneCall): RTCConfiguration {\n const iceServers: RTCIceServer[] = [];\n call.connections.forEach((connection) => {\n switch(connection._) {\n /* case 'callServerTypeTelegramReflector': {\n break;\n } */\n case 'phoneConnectionWebrtc': {\n const {ip, ipv6, port, username, password} = connection;\n const urls: string[] = [];\n if(connection.pFlags.turn) {\n if(ip) {\n urls.push(`turn:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`turn:[${ipv6}]:${port}`);\n }\n } else if(connection.pFlags.stun) {\n if(ip) {\n urls.push(`stun:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`stun:[${ipv6}]:${port}`);\n }\n }\n\n if(urls.length > 0) {\n iceServers.push({\n urls,\n username,\n credential: password\n });\n }\n break;\n }\n }\n });\n\n return {\n iceServers,\n iceTransportPolicy: call.pFlags.p2p_allowed ? 'all' : 'relay'\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getScreenStream from './getScreenStream';\nimport getStream from './getStream';\n\n/**\n * ! Use multiple constraints together only with first invoke\n */\nexport default function getStreamCached() {\n const _cache: {\n main: Partial<{\n audio: Promise,\n video: Promise\n }>,\n screen: Partial<{\n audio: Promise,\n video: Promise\n }>\n } = {\n main: {},\n screen: {}\n };\n\n return async(options: {\n isScreen: true,\n constraints: DisplayMediaStreamOptions,\n } | {\n isScreen?: false,\n constraints: MediaStreamConstraints,\n muted: boolean\n }) => {\n const {isScreen, constraints} = options;\n const cache = _cache[isScreen ? 'screen' : 'main'];\n let promise: Promise = cache[constraints.audio ? 'audio' : 'video'];\n\n if(!promise) {\n promise = (isScreen ? getScreenStream : getStream)(constraints, (options as any).muted);\n if(constraints.audio && !cache.audio) cache.audio = promise.finally(() => cache.audio = undefined);\n if(constraints.video && !cache.video) cache.video = promise.finally(() => cache.video = undefined);\n }\n\n try {\n return await promise;\n /* let out: Partial<{\n audio: MediaStream,\n video: MediaStream\n }> = {};\n\n await Promise.all([\n constraints.audio && cache.audio.then((stream) => out.audio = stream),\n constraints.video && cache.video.then((stream) => out.video = stream)\n ].filter(Boolean));\n\n return out; */\n } catch(err) {\n throw err;\n }\n };\n}\n\n(window as any).getStreamCached = getStreamCached;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase, {EventListenerListeners} from '../../helpers/eventListenerBase';\nimport noop from '../../helpers/noop';\nimport {logger} from '../logger';\nimport getAudioConstraints from './helpers/getAudioConstraints';\nimport getScreenConstraints from './helpers/getScreenConstraints';\nimport getStreamCached from './helpers/getStreamCached';\nimport getVideoConstraints from './helpers/getVideoConstraints';\nimport stopTrack from './helpers/stopTrack';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport StreamManager, {StreamItem} from './streamManager';\n\nexport type TryAddTrackOptions = {\n stream: MediaStream,\n track: MediaStreamTrack,\n type: StreamItem['type'],\n source?: string\n};\n\nexport default abstract class CallInstanceBase extends EventListenerBase {\n protected log: ReturnType;\n protected outputDeviceId: string;\n\n protected player: HTMLElement;\n protected elements: Map;\n\n protected audio: HTMLAudioElement;\n // protected fixedSafariAudio: boolean;\n\n protected getStream: ReturnType;\n\n constructor() {\n super(false);\n\n const player = this.player = document.createElement('div');\n player.classList.add('call-player');\n player.style.display = 'none';\n document.body.append(player);\n\n this.elements = new Map();\n\n // possible Safari fix\n const audio = this.audio = new Audio();\n audio.autoplay = true;\n audio.volume = 1.0;\n this.player.append(audio);\n this.elements.set('audio', audio);\n\n this.fixSafariAudio();\n\n this.getStream = getStreamCached();\n }\n\n public get isSharingAudio() {\n return !!this.streamManager.hasInputTrackKind('audio');\n }\n\n public get isSharingVideo() {\n return !!this.streamManager.hasInputTrackKind('video');\n }\n\n public abstract get isMuted(): boolean;\n public abstract get isClosing(): boolean;\n\n public fixSafariAudio() {\n // if(this.fixedSafariAudio) return;\n this.audio.play().catch(noop);\n // this.fixedSafariAudio = true;\n }\n\n public requestAudioSource(muted: boolean) {\n return this.requestInputSource(true, false, muted);\n }\n\n public requestInputSource(audio: boolean, video: boolean, muted: boolean) {\n const {streamManager} = this;\n if(streamManager) {\n const isAudioGood = !audio || this.isSharingAudio;\n const isVideoGood = !video || this.isSharingVideo;\n if(isAudioGood && isVideoGood) {\n return Promise.resolve();\n }\n }\n\n const constraints: MediaStreamConstraints = {\n audio: audio && getAudioConstraints(),\n video: video && getVideoConstraints()\n };\n\n return this.getStream({\n constraints,\n muted\n }).then((stream) => {\n this.onInputStream(stream);\n });\n }\n\n public requestScreen() {\n return this.getStream({\n isScreen: true,\n constraints: getScreenConstraints(true)\n }).then((stream) => {\n this.onInputStream(stream);\n });\n }\n\n public getElement(endpoint: number | string) {\n return this.elements.get('' + endpoint);\n }\n\n public abstract get streamManager(): StreamManager;\n public abstract get description(): LocalConferenceDescription;\n public abstract toggleMuted(): Promise;\n\n public cleanup() {\n this.player.textContent = '';\n this.player.remove();\n this.elements.clear();\n\n // can have no connectionInstance but streamManager with input stream\n this.streamManager.stop();\n\n super.cleanup();\n }\n\n public onTrack(event: RTCTrackEvent) {\n this.tryAddTrack({\n stream: event.streams[0],\n track: event.track,\n type: 'output'\n });\n }\n\n public saveInputVideoStream(stream: MediaStream, type?: string) {\n const track = stream.getVideoTracks()[0];\n this.tryAddTrack({\n stream,\n track,\n type: 'input',\n source: type || 'main'\n });\n }\n\n public tryAddTrack({stream, track, type, source}: TryAddTrackOptions) {\n if(!source) {\n source = StreamManager.getSource(stream, type);\n }\n\n this.log('tryAddTrack', stream, track, type, source);\n\n const isOutput = type === 'output';\n\n const {player, elements, streamManager} = this;\n\n const tagName = track.kind as StreamItem['kind'];\n const isVideo = tagName === 'video';\n\n const elementEndpoint = isVideo ? source : tagName;\n let element = elements.get(elementEndpoint);\n\n if(isVideo) {\n track.addEventListener('ended', () => {\n this.log('[track] onended');\n elements.delete(elementEndpoint);\n // element.remove();\n }, {once: true});\n }\n\n if(isOutput) {\n streamManager.addTrack(stream, track, type);\n }\n\n const useStream = isVideo ? stream : streamManager.outputStream;\n if(!element) {\n element = document.createElement(tagName);\n element.autoplay = true;\n element.srcObject = useStream;\n element.volume = 1.0;\n\n if((element as any).sinkId !== 'undefined') {\n const {outputDeviceId} = this;\n if(outputDeviceId) {\n (element as any).setSinkId(outputDeviceId);\n }\n }\n\n if(!isVideo) {\n player.appendChild(element);\n } else {\n element.setAttribute('playsinline', 'true');\n element.muted = true;\n }\n // audio.play();\n\n elements.set(elementEndpoint, element);\n } else {\n if(element.paused) {\n element.play().catch(noop);\n }\n\n // ! EVEN IF MEDIASTREAM IS THE SAME NEW TRACK WON'T PLAY WITHOUT REPLACING IT WHEN NEW PARTICIPANT IS ENTERING !\n // if(element.srcObject !== useStream) {\n element.srcObject = useStream;\n // }\n }\n\n return source;\n }\n\n public setMuted(muted?: boolean) {\n this.streamManager.inputStream.getAudioTracks().forEach((track) => {\n if(track?.kind === 'audio') {\n track.enabled = muted === undefined ? !track.enabled : !muted;\n }\n });\n }\n\n protected onInputStream(stream: MediaStream): void {\n if(!this.isClosing) {\n const videoTracks = stream.getVideoTracks();\n if(videoTracks.length) {\n this.saveInputVideoStream(stream, 'main');\n }\n\n const {streamManager, description} = this;\n streamManager.addStream(stream, 'input');\n\n if(description) {\n streamManager.appendToConference(description);\n }\n } else { // if call is declined earlier than stream appears\n stream.getTracks().forEach((track) => {\n stopTrack(track);\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum CALL_STATE {\n CONNECTED,\n CONNECTING,\n EXCHANGING_KEYS,\n PENDING,\n REQUESTING,\n CLOSING,\n CLOSED\n}\n\nexport default CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\n\nexport type CallAudioAssetName = 'call_busy.mp3' | 'call_connect.mp3' | 'call_end.mp3' | 'call_incoming.mp3' | 'call_outgoing.mp3' | 'voip_failed.mp3' | 'voip_connecting.mp3';\n\nlet audioAsset: AudioAssetPlayer;\nexport default function getCallAudioAsset() {\n return audioAsset ??= new AudioAssetPlayer([\n 'call_busy.mp3',\n 'call_connect.mp3',\n 'call_end.mp3',\n 'call_incoming.mp3',\n 'call_outgoing.mp3',\n 'voip_failed.mp3'\n ]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getCallAudioAsset, {CallAudioAssetName} from '../../components/call/getAudioAsset';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport tsNow from '../../helpers/tsNow';\nimport {PhoneCallProtocol} from '../../layer';\nimport {CallId} from '../appManagers/appCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport rootScope from '../rootScope';\nimport CallInstance from './callInstance';\nimport CALL_STATE from './callState';\n\nconst CALL_REQUEST_TIMEOUT = 45e3;\n\nexport class CallsController extends EventListenerBase<{\n instance: (details: {hasCurrent: boolean, instance: CallInstance}) => void,\n accepting: (instance: CallInstance) => void, // это костыль. используется при параллельном вызове, чтобы заменить звонок в topbarCall\n incompatible: (userId: UserId) => void,\n}> {\n private log: ReturnType;\n private managers: AppManagers;\n private audioAsset: AudioAssetPlayer;\n private instances: Map;\n private sortedInstances: Array;\n private tempId: number;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n this.log = logger('CC');\n\n if(!IS_CALL_SUPPORTED) {\n return;\n }\n\n this.audioAsset = getCallAudioAsset();\n this.tempId = 0;\n this.instances = new Map();\n this.sortedInstances = [];\n\n rootScope.addEventListener('call_update', async(call) => {\n let instance = this.instances.get(call.id);\n\n if(instance) {\n instance.setPhoneCall(call);\n }\n\n switch(call._) {\n case 'phoneCallDiscarded': {\n if(instance) {\n instance.hangUp(call.reason?._, true);\n }\n\n break;\n }\n\n case 'phoneCallAccepted': {\n if(instance) {\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\n instance.hangUp('phoneCallDiscardReasonDisconnect');\n rootScope.dispatchEvent('call_incompatible', instance.interlocutorUserId);\n break;\n } */\n\n instance.confirmCall();\n }\n\n break;\n }\n\n case 'phoneCallRequested': {\n if(!instance) {\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\n rootScope.dispatchEvent('call_incompatible', call.admin_id);\n break;\n } */\n\n instance = this.createCallInstance({\n isOutgoing: false,\n interlocutorUserId: call.admin_id\n });\n\n instance.overrideConnectionState(CALL_STATE.PENDING);\n instance.setPhoneCall(call);\n instance.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonMissed');\n }\n\n break;\n }\n\n case 'phoneCall': {\n if(!instance || instance.encryptionKey) {\n break;\n }\n\n const g_a = instance.dh.g_a = call.g_a_or_b;\n const dh = instance.dh;\n const g_a_hash = await apiManagerProxy.invokeCrypto('sha256', g_a);\n if(!bytesCmp(dh.g_a_hash, g_a_hash)) {\n this.log.error('Incorrect g_a_hash', dh.g_a_hash, g_a_hash);\n break;\n }\n\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey(g_a, dh.b, dh.p);\n if(call.key_fingerprint !== key_fingerprint) {\n this.log.error('Incorrect key fingerprint', call.key_fingerprint, key_fingerprint, g_a, dh);\n instance.hangUp('phoneCallDiscardReasonDisconnect');\n break;\n }\n\n instance.encryptionKey = key;\n instance.joinCall();\n\n break;\n }\n }\n });\n\n rootScope.addEventListener('call_signaling', ({callId, data}) => {\n const instance = this.instances.get(callId);\n if(instance?.id !== callId) {\n return;\n }\n\n instance.onUpdatePhoneCallSignalingData(data);\n });\n }\n\n public get currentCall() {\n return this.sortedInstances[0];\n }\n\n public getCallByUserId(userId: UserId) {\n for(const [callId, instance] of this.instances) {\n if(instance.interlocutorUserId === userId) {\n return instance;\n }\n }\n }\n\n private createCallInstance(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n protocol?: PhoneCallProtocol\n }) {\n const call = new CallInstance({\n managers: this.managers,\n ...options\n });\n\n call.addEventListener('state', (state) => {\n const currentCall = this.currentCall;\n if(state === CALL_STATE.CLOSED) {\n this.instances.delete(call.id);\n indexOfAndSplice(this.sortedInstances, call);\n } else {\n insertInDescendSortedArray(this.sortedInstances, call, 'sortIndex');\n }\n\n if(state === CALL_STATE.EXCHANGING_KEYS) {\n call.wasTryingToJoin = true;\n }\n\n const hasConnected = call.connectedAt !== undefined;\n if(state === CALL_STATE.EXCHANGING_KEYS || (state === CALL_STATE.CONNECTING && hasConnected)) {\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonDisconnect');\n } else {\n call.clearHangUpTimeout();\n }\n\n if(currentCall === call || !currentCall) {\n if(state === CALL_STATE.CLOSED) {\n if(!call.isOutgoing && !call.wasTryingToJoin) { // incoming call has been accepted on other device or ended\n this.audioAsset.stopSound();\n } else if(call.wasTryingToJoin && !hasConnected) { // something has happened during the key exchanging\n this.audioAsset.playSound('voip_failed.mp3');\n } else {\n this.audioAsset.playSound(call.discardReason === 'phoneCallDiscardReasonBusy' ? 'call_busy.mp3' : 'call_end.mp3');\n }\n } else if(state === CALL_STATE.PENDING) {\n this.audioAsset.playSound(call.isOutgoing ? 'call_outgoing.mp3' : 'call_incoming.mp3', true);\n } else if(state === CALL_STATE.EXCHANGING_KEYS) {\n this.audioAsset.playSoundIfDifferent('call_connect.mp3');\n } else if(state === CALL_STATE.CONNECTING) {\n if(call.duration) {\n this.audioAsset.playSound('voip_connecting.mp3', true);\n }\n } else {\n this.audioAsset.stopSound();\n }\n }\n });\n\n call.addEventListener('id', (id, prevId) => {\n if(prevId !== undefined) {\n this.instances.delete(prevId);\n }\n\n const hasCurrent = !!this.currentCall;\n this.instances.set(id, call);\n\n if(prevId === undefined) {\n this.dispatchEvent('instance', {instance: call, hasCurrent: hasCurrent});\n }\n });\n\n return call;\n }\n\n public async startCallInternal(userId: UserId, isVideo: boolean) {\n this.log('p2pStartCallInternal', userId, isVideo);\n\n const fullInfo = await this.managers.appProfileManager.getProfile(userId);\n if(!fullInfo) return;\n\n const {video_calls_available} = fullInfo.pFlags;\n\n const call = this.createCallInstance({\n isOutgoing: true,\n interlocutorUserId: userId\n });\n\n call.requestInputSource(true, !!(isVideo && video_calls_available), false);\n\n call.overrideConnectionState(CALL_STATE.REQUESTING);\n call.setPhoneCall({\n _: 'phoneCallWaiting',\n access_hash: '',\n admin_id: NULL_PEER_ID,\n date: tsNow(true),\n id: --this.tempId,\n participant_id: userId,\n protocol: call.protocol,\n pFlags: {\n video: isVideo || undefined\n }\n });\n\n // return;\n this.managers.appCallsManager.generateDh().then(async(dh) => {\n call.dh = dh;\n\n return this.managers.appCallsManager.requestCall(userId, call.protocol, call.dh.g_a_hash, isVideo && video_calls_available);\n }).then((phoneCall) => {\n call.overrideConnectionState(CALL_STATE.PENDING);\n call.setPhoneCall(phoneCall);\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonHangup');\n });\n }\n}\n\nconst callsController = new CallsController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.callsController = callsController);\nexport default callsController;\n","export const GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX = 50;\nexport const GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS = 100;\nexport const GROUP_CALL_PARTICIPANTS_LOAD_LIMIT = 100;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {GroupCallConnectionType, JoinGroupCallJsonPayload} from '../appManagers/appGroupCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport rootScope from '../rootScope';\nimport CallConnectionInstanceBase, {CallConnectionInstanceOptions} from './callConnectionInstanceBase';\nimport GroupCallInstance from './groupCallInstance';\nimport filterServerCodecs from './helpers/filterServerCodecs';\nimport fixLocalOffer from './helpers/fixLocalOffer';\nimport processMediaSection from './helpers/processMediaSection';\nimport {ConferenceEntry} from './localConferenceDescription';\nimport SDP from './sdp';\nimport SDPMediaSection from './sdp/mediaSection';\nimport {WebRTCLineType} from './sdpBuilder';\nimport {UpdateGroupCallConnectionData} from './types';\n\nexport default class GroupCallConnectionInstance extends CallConnectionInstanceBase {\n private groupCall: GroupCallInstance;\n public updateConstraints?: boolean;\n private type: GroupCallConnectionType;\n private options: {\n type: Extract,\n isMuted?: boolean,\n joinVideo?: boolean,\n rejoin?: boolean\n } | {\n type: Extract,\n };\n\n private updateConstraintsInterval: number;\n public negotiateThrottled: () => void;\n\n private managers: AppManagers;\n\n constructor(options: CallConnectionInstanceOptions & {\n groupCall: GroupCallConnectionInstance['groupCall'],\n type: GroupCallConnectionInstance['type'],\n options: GroupCallConnectionInstance['options'],\n managers: AppManagers\n }) {\n super(options);\n\n this.negotiateThrottled = throttle(this.negotiate.bind(this), 0, false);\n }\n\n public createPeerConnection() {\n return this.connection || super.createPeerConnection({\n iceServers: [],\n iceTransportPolicy: 'all',\n bundlePolicy: 'max-bundle',\n rtcpMuxPolicy: 'require',\n iceCandidatePoolSize: 0\n // sdpSemantics: \"unified-plan\",\n // extmapAllowMixed: true,\n });\n }\n\n public createDataChannel() {\n if(this.dataChannel) {\n return this.dataChannel;\n }\n\n const dataChannel = super.createDataChannel();\n\n dataChannel.addEventListener('open', () => {\n this.maybeUpdateRemoteVideoConstraints();\n });\n\n dataChannel.addEventListener('close', () => {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n });\n\n return dataChannel;\n }\n\n public createDescription() {\n if(this.description) {\n return this.description;\n }\n\n const description = super.createDescription();\n\n /* const perType = 0;\n const types = ['audio' as const, 'video' as const];\n const count = types.length * perType;\n const init: RTCRtpTransceiverInit = {direction: 'recvonly'};\n types.forEach((type) => {\n for(let i = 0; i < perType; ++i) {\n description.createEntry(type).createTransceiver(connection, init);\n }\n }); */\n\n return description;\n }\n\n public appendStreamToConference() {\n super.appendStreamToConference();/* .then(() => {\n currentGroupCall.connections.main.negotiating = false;\n this.startNegotiation({\n type: type,\n isMuted: muted,\n rejoin\n });\n }); */\n }\n\n private async invokeJoinGroupCall(localSdp: SDP, mainChannels: SDPMediaSection[], options: GroupCallConnectionInstance['options']) {\n const {groupCall, description} = this;\n const groupCallId = groupCall.id;\n\n const processedChannels = mainChannels.map((section) => {\n const processed = processMediaSection(localSdp, section);\n\n this.sources[processed.entry.type as 'video' | 'audio'] = processed.entry;\n\n return processed;\n });\n\n const audioChannel = processedChannels.find((channel) => channel.media.mediaType === 'audio');\n const videoChannel = processedChannels.find((channel) => channel.media.mediaType === 'video');\n let {source, params} = audioChannel || {};\n const useChannel = videoChannel || audioChannel;\n\n const channels: {[type in WebRTCLineType]?: typeof audioChannel} = {\n audio: audioChannel,\n video: videoChannel\n };\n\n description.entries.forEach((entry) => {\n if(entry.direction === 'sendonly') {\n const channel = channels[entry.type];\n if(!channel) return;\n\n description.setEntrySource(entry, channel.sourceGroups || channel.source);\n description.setEntryPeerId(entry, rootScope.myId);\n }\n });\n\n // overwrite ssrc with audio in video params\n if(params !== useChannel.params) {\n const data: JoinGroupCallJsonPayload = JSON.parse(useChannel.params.data);\n // data.ssrc = source || data.ssrc - 1; // audio channel can be missed in screensharing\n if(source) data.ssrc = source;\n else delete data.ssrc;\n params = {\n _: 'dataJSON',\n data: JSON.stringify(data)\n };\n }\n\n const update = await this.managers.appGroupCallsManager.joinGroupCall(groupCallId, params, options);\n\n const data: UpdateGroupCallConnectionData = JSON.parse(update.params.data);\n\n data.audio = data.audio || groupCall.connections.main.description.audio;\n description.setData(data);\n filterServerCodecs(mainChannels, data);\n\n return data;\n }\n\n protected async negotiateInternal() {\n const {connection, description} = this;\n const isNewConnection = connection.iceConnectionState === 'new' && !description.getEntryByMid('0').source;\n const log = this.log.bindPrefix('startNegotiation');\n log('start');\n\n const originalOffer = await connection.createOffer({iceRestart: false});\n\n if(isNewConnection && this.dataChannel) {\n const dataChannelEntry = description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n }\n\n const {sdp: localSdp, offer} = fixLocalOffer({\n offer: originalOffer,\n data: description\n });\n\n log('[sdp] setLocalDescription', offer.sdp);\n await connection.setLocalDescription(offer);\n\n const mainChannels = localSdp.media.filter((media) => {\n return media.mediaType !== 'application' && media.isSending;\n });\n\n if(isNewConnection) {\n try {\n await this.invokeJoinGroupCall(localSdp, mainChannels, this.options);\n } catch(e) {\n this.log.error('[tdweb] joinGroupCall error', e);\n }\n }\n\n /* if(!data) {\n log('abort 0');\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n /* if(connection.iceConnectionState !== 'new') {\n log(`abort 1 connectionState=${connection.iceConnectionState}`);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n /* if(this.currentGroupCall !== currentGroupCall || connectionHandler.connection !== connection) {\n log('abort', this.currentGroupCall, currentGroupCall);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n const isAnswer = true;\n // const _bundleMids = bundleMids.slice();\n const entriesToDelete: ConferenceEntry[] = [];\n const bundle = localSdp.bundle;\n forEachReverse(bundle, (mid, idx, arr) => {\n const entry = description.getEntryByMid(mid);\n if(entry.shouldBeSkipped(isAnswer)) {\n arr.splice(idx, 1);\n entriesToDelete.push(entry);\n }\n });\n\n /* forEachReverse(description.entries, (entry, idx, arr) => {\n const mediaSection = _parsedSdp.media.find((section) => section.oa.get('mid').oa === entry.mid);\n const deleted = !mediaSection;\n // const deleted = !_bundleMids.includes(entry.mid); // ! can't use it because certain mid can be missed in bundle\n if(deleted) {\n arr.splice(idx, 1);\n }\n }); */\n\n const entries = localSdp.media.map((section) => {\n const mid = section.mid;\n let entry = description.getEntryByMid(mid);\n if(!entry) {\n entry = new ConferenceEntry(mid, section.mediaType);\n entry.setDirection('inactive');\n }\n\n return entry;\n });\n\n const answerDescription: RTCSessionDescriptionInit = {\n type: 'answer',\n sdp: description.generateSdp({\n bundle,\n entries,\n isAnswer\n })\n };\n\n entriesToDelete.forEach((entry) => {\n description.deleteEntry(entry);\n });\n\n log(`[sdp] setRemoteDescription signaling=${connection.signalingState} ice=${connection.iceConnectionState} gathering=${connection.iceGatheringState} connection=${connection.connectionState}`, answerDescription.sdp);\n await connection.setRemoteDescription(answerDescription);\n\n log('end');\n }\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n promise = super.negotiate();\n\n if(this.updateConstraints) {\n promise.then(() => {\n this.maybeUpdateRemoteVideoConstraints();\n this.updateConstraints = false;\n });\n }\n\n if(this.options.type === 'presentation') {\n promise.then(() => {\n this.connection.getTransceivers().find((transceiver) => {\n if(transceiver.sender?.track?.kind === 'video') {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n }\n });\n });\n }\n\n return promise;\n }\n\n public maybeUpdateRemoteVideoConstraints() {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.log('maybeUpdateRemoteVideoConstraints');\n\n // * https://github.com/TelegramMessenger/tgcalls/blob/6f2746e04c9b040f8c8dfc64d916a1853d09c4ce/tgcalls/group/GroupInstanceCustomImpl.cpp#L2549\n type VideoConstraints = {minHeight?: number, maxHeight: number};\n const obj: {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {[endpoint: string]: VideoConstraints},\n defaultConstraints: VideoConstraints,\n onStageEndpoints: string[]\n } = {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {},\n defaultConstraints: {maxHeight: 0},\n onStageEndpoints: []\n };\n\n for(const entry of this.description.entries) {\n if(entry.direction !== 'recvonly' || entry.type !== 'video') {\n continue;\n }\n\n const {endpoint} = entry;\n obj.onStageEndpoints.push(endpoint);\n obj.constraints[endpoint] = {\n minHeight: 180,\n maxHeight: 720\n };\n }\n\n this.sendDataChannelData(obj);\n\n if(!obj.onStageEndpoints.length) {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n } else if(!this.updateConstraintsInterval) {\n this.updateConstraintsInterval = window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this), 5000);\n }\n }\n\n public addInputVideoStream(stream: MediaStream) {\n // const {sources} = this;\n // if(sources?.video) {\n // const source = this.sources.video.source;\n // stream.source = '' + source;\n this.groupCall.saveInputVideoStream(stream, this.type);\n // }\n\n this.streamManager.addStream(stream, 'input');\n this.appendStreamToConference(); // replace sender track\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {DataJSON} from '../../../layer';\nimport {JoinGroupCallJsonPayload} from '../../appManagers/appGroupCallsManager';\nimport SDP from '../sdp';\nimport {Ssrc} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function processMediaSection(sdp: SDP, media: SDP['media'][0]) {\n const sectionInfo = parseMediaSectionInfo(sdp, media);\n\n const mediaType: Exclude = media.mediaType as any;\n const entry: Ssrc = {\n source: sectionInfo.source,\n sourceGroups: sectionInfo.sourceGroups,\n type: mediaType\n };\n\n // do not change this value, otherwise onconnectionstatechange won't fire\n sectionInfo.fingerprint.setup = 'active';\n const payload: JoinGroupCallJsonPayload = {\n 'fingerprints': [sectionInfo.fingerprint],\n 'pwd': sectionInfo.pwd,\n 'ssrc': sectionInfo.source,\n 'ssrc-groups': sectionInfo.sourceGroups || [],\n 'ufrag': sectionInfo.ufrag\n };\n const paramsDataJson = JSON.stringify(payload);\n\n const params: DataJSON = {\n _: 'dataJSON',\n data: paramsDataJson\n };\n\n return {\n params,\n source: sectionInfo.source,\n media,\n sourceGroups: sectionInfo.sourceGroups,\n entry\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport SDPMediaSection from '../sdp/mediaSection';\nimport {UpdateGroupCallConnectionData, Codec} from '../types';\n\nexport default function filterServerCodecs(mainChannels: SDPMediaSection[], data: UpdateGroupCallConnectionData) {\n // ! Need to filter server's extmap for Firefox\n const performExtmap = (channel: typeof mainChannels[0]) => {\n const out: {[id: string]: string} = {};\n const extmap = channel.attributes.get('extmap');\n extmap.forEach((extmap) => {\n const id = extmap.key.split('/', 1)[0];\n out[id] = extmap.value;\n });\n\n return out;\n };\n\n const codecsToPerform: [Codec, 'audio' | 'video'][] = /* flatten([data, dataPresentation].filter(Boolean).map((data) => {\n return */['audio' as const, 'video' as const].filter((type) => data[type]).map((type) => ([data[type], type]));\n // }));\n\n codecsToPerform.forEach(([codec, type]) => {\n const channel = mainChannels.find((line) => line.mediaType === type);\n if(!channel) {\n return;\n }\n\n const extmap = performExtmap(channel);\n forEachReverse(codec['rtp-hdrexts'], (value, index, arr) => {\n if(extmap[value.id] !== value.uri) {\n arr.splice(index, 1);\n console.log(`[sdp] filtered extmap:`, value, index, type);\n }\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport copy from '../../../helpers/object/copy';\nimport {ConferenceEntry} from '../localConferenceDescription';\nimport {parseSdp, addSimulcast} from '../sdp/utils';\nimport {generateMediaFirstLine, SDPBuilder} from '../sdpBuilder';\nimport {UpdateGroupCallConnectionData} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function fixLocalOffer(options: {\n offer: RTCSessionDescriptionInit,\n data: UpdateGroupCallConnectionData,\n skipAddingMulticast?: boolean\n // mids?: string[]\n}) {\n const {offer, data} = options;\n const sdp = parseSdp(offer.sdp);\n let hasMunged = false;\n\n if(!options.skipAddingMulticast) {\n hasMunged = addSimulcast(sdp) || hasMunged;\n }\n\n // const bundleLine = parsedSdp.session.lines.find((line) => line.Ha?.key === 'group');\n // const bundleMids = bundleLine.value.split(' ').slice(1);\n\n forEachReverse(sdp.media, (section, idx, arr) => {\n // const mid = section.oa.get('mid').oa;\n\n // это может случиться при выключении и включении видео. почему-то появится секция уже удалённая\n // ! нельзя тут модифицировать локальное описание, будет критовать\n /* if(mids && !mids.includes(mid) && !bundleMids.includes(mid)) {\n console.error('wtf');\n hasMunged = true;\n arr.splice(idx, 1);\n return;\n } */\n\n if(/* section.mediaType !== 'video' || */section.isSending) {\n return;\n }\n\n if(section.mediaType === 'application') {\n return;\n }\n\n const mediaLine = section.mediaLine;\n const mediaLineParts = mediaLine.mediaLineParts;\n const mediaCodecIds = mediaLineParts.ids;\n const localMLine = mediaLine.toString();\n\n const codec = data[section.mediaType];\n const payloadTypes = codec['payload-types'];\n\n /* forEachReverse(payloadTypes, (payloadType, idx, arr) => {\n if(!mediaCodecIds.includes('' + payloadType.id) && section.mediaType === 'video') {\n // if(payloadType.name === 'H265') {\n console.warn('[sdp] filtered unsupported codec', payloadType, mediaCodecIds, section.mediaType);\n arr.splice(idx, 1);\n }\n }); */\n\n const codecIds = payloadTypes.map((payload) => '' + payload.id);\n const correctMLine = generateMediaFirstLine(section.mediaType, undefined, codecIds);\n\n if(localMLine !== correctMLine) {\n const sectionInfo = parseMediaSectionInfo(sdp, section);\n\n const newData = {...data};\n newData.transport = copy(newData.transport);\n newData.transport.ufrag = sectionInfo.ufrag;\n newData.transport.pwd = sectionInfo.pwd;\n newData.transport.fingerprints = [sectionInfo.fingerprint];\n newData.transport.candidates = [];\n\n const entry = new ConferenceEntry(sectionInfo.mid, mediaLineParts.type);\n entry.setPort(mediaLineParts.port);\n sectionInfo.source && entry.setSource(sectionInfo.sourceGroups || sectionInfo.source);\n entry.setDirection(section.direction);\n\n const newSdp = new SDPBuilder().addSsrcEntry(entry, newData).finalize();\n\n const newChannel = parseSdp(newSdp).media[0];\n arr[idx] = newChannel;\n\n hasMunged = true;\n }\n });\n\n if(hasMunged) {\n const mungedSdp = sdp.toString();\n offer.sdp = mungedSdp;\n }\n\n return {offer, sdp/* , bundleMids */};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {GroupCallConnectionType, GroupCallId, GroupCallOutputSource} from '../appManagers/appGroupCallsManager';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {GroupCall, GroupCallParticipant} from '../../layer';\nimport {logger} from '../logger';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport rootScope from '../rootScope';\nimport CallInstanceBase, {TryAddTrackOptions} from './callInstanceBase';\nimport GroupCallConnectionInstance from './groupCallConnectionInstance';\nimport GROUP_CALL_STATE from './groupCallState';\nimport getScreenConstraints from './helpers/getScreenConstraints';\nimport getScreenStream from './helpers/getScreenStream';\nimport getStream from './helpers/getStream';\nimport getVideoConstraints from './helpers/getVideoConstraints';\nimport stopTrack from './helpers/stopTrack';\nimport localConferenceDescription from './localConferenceDescription';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {Ssrc} from './types';\nimport getPeerId from '../appManagers/utils/peers/getPeerId';\nimport {AppManagers} from '../appManagers/managers';\nimport {generateSelfVideo, makeSsrcFromParticipant, makeSsrcsFromParticipant} from './groupCallsController';\n\nexport default class GroupCallInstance extends CallInstanceBase<{\n state: (state: GROUP_CALL_STATE) => void,\n pinned: (source?: GroupCallOutputSource) => void,\n}> {\n public id: GroupCallId;\n public chatId: ChatId;\n public handleUpdateGroupCallParticipants: boolean;\n public updatingSdp: boolean;\n public isSpeakingMap: Map;\n public connections: {[k in GroupCallConnectionType]?: GroupCallConnectionInstance};\n public groupCall: GroupCall;\n public participant: GroupCallParticipant;\n\n // will be set with negotiation\n public joined: boolean;\n\n private pinnedSources: Array;\n private participantsSsrcs: Map;\n private hadAutoPinnedSources: Set;\n private dispatchPinnedThrottled: () => void;\n private startVideoSharingPromise: Promise;\n private startScreenSharingPromise: Promise;\n\n private managers: AppManagers;\n\n constructor(options: {\n id: GroupCallInstance['id'],\n chatId: GroupCallInstance['chatId'],\n isSpeakingMap?: GroupCallInstance['isSpeakingMap'],\n connections?: GroupCallInstance['connections'],\n managers: AppManagers\n }) {\n super();\n\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = logger('GROUP-CALL');\n }\n\n if(!this.connections) {\n this.connections = {};\n }\n\n if(!this.isSpeakingMap) {\n this.isSpeakingMap = new Map();\n }\n\n this.pinnedSources = [];\n this.participantsSsrcs = new Map();\n this.hadAutoPinnedSources = new Set();\n this.dispatchPinnedThrottled = throttle(() => {\n this.dispatchEvent('pinned', this.pinnedSource);\n }, 0, false);\n\n this.addEventListener('state', (state) => {\n if(state === GROUP_CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n }\n\n get connectionState() {\n return this.connections.main.connection.iceConnectionState;\n }\n\n get state() {\n const {connectionState} = this;\n if(connectionState === 'closed') {\n return GROUP_CALL_STATE.CLOSED;\n } else if(connectionState !== 'connected' && (!IS_SAFARI || connectionState !== 'completed')) {\n return GROUP_CALL_STATE.CONNECTING;\n } else {\n const {participant} = this;\n if(!participant.pFlags.can_self_unmute) {\n return GROUP_CALL_STATE.MUTED_BY_ADMIN;\n } else if(participant.pFlags.muted) {\n return GROUP_CALL_STATE.MUTED;\n } else {\n return GROUP_CALL_STATE.UNMUTED;\n }\n }\n }\n\n get participants() {\n return this.managers.appGroupCallsManager.getCachedParticipants(this.id);\n }\n\n get isSharingScreen() {\n return !!this.connections.presentation;\n }\n\n get pinnedSource() {\n return this.pinnedSources[this.pinnedSources.length - 1];\n }\n\n public get isMuted() {\n return this.state !== GROUP_CALL_STATE.UNMUTED;\n }\n\n public get isClosing() {\n const {state} = this;\n return state === GROUP_CALL_STATE.CLOSED;\n }\n\n public get streamManager(): StreamManager {\n return this.connections.main.streamManager;\n }\n\n public get description(): localConferenceDescription {\n return this.connections.main.description;\n }\n\n public pinSource(source: GroupCallOutputSource) {\n indexOfAndSplice(this.pinnedSources, source);\n this.pinnedSources.push(source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinSource(source: GroupCallOutputSource) {\n this.hadAutoPinnedSources.delete(source);\n indexOfAndSplice(this.pinnedSources, source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinAll() {\n this.pinnedSources.length = 0;\n this.dispatchPinnedThrottled();\n }\n\n public async getParticipantByPeerId(peerId: PeerId) {\n return NULL_PEER_ID === peerId ? this.participant : (await this.participants).get(peerId);\n }\n\n public toggleMuted() {\n return this.requestAudioSource(true).then(() => this.changeUserMuted(NULL_PEER_ID));\n }\n\n public async changeUserMuted(peerId: PeerId, muted?: boolean) {\n const participant = await this.getParticipantByPeerId(peerId);\n if(NULL_PEER_ID === peerId && participant.pFlags.can_self_unmute) {\n muted = muted === undefined ? !participant.pFlags.muted : muted;\n }\n\n return this.editParticipant(participant, {muted});\n }\n\n public getElement(endpoint: GroupCallOutputSource) {\n return super.getElement(endpoint);\n }\n\n public getVideoElementFromParticipantByType(participant: GroupCallParticipant, type: 'video' | 'presentation') {\n let source: GroupCallOutputSource;\n if(participant.pFlags.self) {\n const connectionType: GroupCallConnectionType = type === 'video' ? 'main' : 'presentation';\n source = connectionType;\n } else {\n const codec = participant[type];\n source = codec.source_groups[0].sources[0];\n }\n\n const element = this.getElement(source) as HTMLVideoElement;\n if(!element) return;\n\n const clone = element.cloneNode() as typeof element;\n clone.srcObject = element.srcObject;\n return {video: clone, source};\n }\n\n public createConnectionInstance(options: {\n streamManager: StreamManager,\n type: GroupCallConnectionType,\n options: GroupCallConnectionInstance['options'],\n }) {\n return this.connections[options.type] = new GroupCallConnectionInstance({\n groupCall: this,\n log: this.log.bindPrefix(options.type),\n managers: this.managers,\n ...options\n });\n }\n\n public changeRaiseHand(raise: boolean) {\n return this.editParticipant(this.participant, {raiseHand: raise});\n }\n\n public async startScreenSharingInternal() {\n try {\n const type: GroupCallConnectionType = 'presentation';\n\n const stream = await getScreenStream(getScreenConstraints());\n const streamManager = new StreamManager();\n\n const connectionInstance = this.createConnectionInstance({\n streamManager,\n type,\n options: {\n type\n }\n });\n\n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n stream.getVideoTracks()[0].addEventListener('ended', () => {\n if(this.connections.presentation) { // maybe user has stopped screensharing through browser's ui\n this.stopScreenSharing();\n }\n }, {once: true});\n\n connectionInstance.createDescription();\n connectionInstance.addInputVideoStream(stream);\n } catch(err) {\n this.log.error('start screen sharing error', err);\n }\n }\n\n public startScreenSharing() {\n return this.startScreenSharingPromise ??= this.startScreenSharingInternal().finally(() => {\n this.startScreenSharingPromise = undefined;\n });\n }\n\n public stopScreenSharing() {\n const connectionInstance = this.connections.presentation;\n if(!connectionInstance) {\n return Promise.resolve();\n }\n\n delete this.connections.presentation;\n this.unpinSource('presentation');\n connectionInstance.closeConnectionAndStream(true);\n\n delete this.participant.presentation;\n this.managers.appGroupCallsManager.saveApiParticipant(this.id, this.participant);\n\n return this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id);\n }\n\n public toggleScreenSharing() {\n if(this.isSharingScreen) {\n return this.stopScreenSharing();\n } else {\n return this.startScreenSharing();\n }\n }\n\n public async startVideoSharingInternal() {\n const constraints: MediaStreamConstraints = {\n video: getVideoConstraints()\n };\n\n try {\n const stream = await getStream(constraints, false);\n const connectionInstance = this.connections.main;\n connectionInstance.addInputVideoStream(stream);\n\n await this.editParticipant(this.participant, {\n videoPaused: false,\n videoStopped: false\n });\n } catch(err) {\n this.log.error('startVideoSharing error', err, constraints);\n }\n }\n\n public startVideoSharing() {\n return this.startVideoSharingPromise ??= this.startVideoSharingInternal().finally(() => {\n this.startVideoSharingPromise = undefined;\n });\n }\n\n public async stopVideoSharing() {\n const connectionInstance = this.connections.main;\n const track = connectionInstance.streamManager.inputStream.getVideoTracks()[0];\n if(!track) {\n return;\n }\n\n stopTrack(track);\n connectionInstance.streamManager.appendToConference(connectionInstance.description); // clear sender track\n\n await this.editParticipant(this.participant, {\n videoStopped: true\n });\n }\n\n public toggleVideoSharing() {\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharing();\n }\n }\n\n public async hangUp(discard = false, rejoin = false, isDiscarded = false) {\n for(const type in this.connections) {\n const connection = this.connections[type as GroupCallConnectionType];\n connection.closeConnectionAndStream(!rejoin);\n }\n\n this.dispatchEvent('state', this.state);\n\n if(isDiscarded) {\n return;\n }\n\n if(!rejoin) {\n const d = discard || (this.joined ? this.connections.main.sources.audio.source : undefined);\n this.managers.appGroupCallsManager.hangUp(this.id, d);\n }\n }\n\n public tryAddTrack(options: Omit) {\n const {description} = this;\n const source = super.tryAddTrack(options);\n\n if(options.type === 'output') {\n const entry = description.getEntryBySource(+source);\n this.getParticipantByPeerId(entry.peerId).then((participant) => {\n if(participant) {\n rootScope.dispatchEvent('group_call_participant', {groupCallId: this.id, participant});\n }\n });\n }\n\n return source;\n }\n\n public async editParticipant(participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n if(!Object.keys(options).length) {\n return;\n }\n\n // let processUpdate = true;\n if(participant) {\n // const {currentGroupCall} = this;\n // const isCurrentCall = currentGroupCall?.id === groupCallId;\n const isCurrentCall = true;\n const isUpdatingMeInCurrentCall = isCurrentCall && participant.pFlags.self;\n\n if(isUpdatingMeInCurrentCall) {\n if(options.muted !== undefined && !this.isSharingAudio) {\n delete options.muted;\n\n if(!Object.keys(options).length) {\n return;\n }\n }\n }\n\n // if(isCurrentCall) {\n const muted = options.muted;\n if(muted !== undefined) {\n /* const isAdmin = appChatsManager.hasRights(currentGroupCall.chatId, 'manage_call');\n if(isAdmin) {\n if(muted) {\n participant.pFlags.muted = true;\n delete participant.pFlags.can_self_unmute;\n } else {\n participant.pFlags.can_self_unmute = true;\n }\n } else */if(participant.pFlags.self) {\n if(muted) {\n participant.pFlags.muted = true;\n } else if(participant.pFlags.can_self_unmute) {\n delete participant.pFlags.muted;\n }\n }/* else {\n if(muted) {\n participant.pFlags.muted_by_you = true;\n } else {\n delete participant.pFlags.muted_by_you;\n }\n } */\n }\n // }\n\n /* const a: [keyof GroupCallParticipant['pFlags'], keyof typeof options][] = [\n ['muted', 'muted']\n ];\n\n a.forEach(([key, optionKey]) => {\n const value = options[optionKey];\n if(value === undefined) {\n return;\n }\n\n if(value) {\n participant.pFlags[key] = true;\n } else {\n delete participant.pFlags[key];\n }\n }); */\n\n if(options.raiseHand !== undefined) {\n if(options.raiseHand) participant.raise_hand_rating = '1';\n else delete participant.raise_hand_rating;\n }\n\n if(isUpdatingMeInCurrentCall) {\n if(options.videoStopped !== undefined) {\n if(options.videoStopped) delete participant.video;\n else participant.video = generateSelfVideo(this.connections.main.sources.video);\n }\n\n if(!participant.pFlags.muted && participant.pFlags.can_self_unmute) {\n this.setMuted(false);\n }\n\n this.dispatchEvent('state', this.state);\n }\n\n // rootScope.dispatchEvent('group_call_participant', {groupCallId, participant});\n\n /* if(participant.pFlags.self) {\n processUpdate = false;\n } */\n }\n\n return this.managers.appGroupCallsManager.editParticipant(this.id, participant, options);\n }\n\n public onParticipantUpdate(participant: GroupCallParticipant, doNotDispatchParticipantUpdate?: PeerId) {\n const connectionInstance = this.connections.main;\n const {connection, description} = connectionInstance;\n\n const peerId = getPeerId(participant.peer);\n const hasLeft = !!participant.pFlags.left;\n const oldSsrcs = this.participantsSsrcs.get(peerId) || [];\n\n if(participant.presentation && !hasLeft) {\n const {source} = makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint);\n if(!this.hadAutoPinnedSources.has(source)) {\n this.hadAutoPinnedSources.add(source);\n this.pinSource(participant.pFlags.self ? 'presentation' : source);\n }\n }\n\n if(participant.pFlags.self) {\n this.participant = participant;\n\n if(connectionInstance.sources.audio.source !== participant.source) {\n this.hangUp();\n }\n\n let mute = false;\n if(!participant.pFlags.can_self_unmute) {\n this.stopScreenSharing();\n this.stopVideoSharing();\n mute = true;\n } else if(participant.pFlags.muted) {\n mute = true;\n }\n\n if(mute) {\n this.setMuted(true);\n }\n\n if(doNotDispatchParticipantUpdate !== peerId) {\n this.dispatchEvent('state', this.state);\n }\n\n return;\n }\n\n const ssrcs = hasLeft ? [] : makeSsrcsFromParticipant(participant);\n\n if(!hasLeft) {\n this.participantsSsrcs.set(peerId, ssrcs);\n } else {\n this.participantsSsrcs.delete(peerId);\n }\n\n // const TEST_OLD = false;\n\n const modifiedTypes: Set = new Set();\n oldSsrcs.forEach((oldSsrc) => {\n const oldSource = oldSsrc.source;\n const newSsrc = ssrcs.find((ssrc) => ssrc.source === oldSource);\n if(!newSsrc) {\n this.unpinSource(oldSource);\n\n const oldEntry = description.getEntryBySource(oldSource);\n if(oldEntry && oldEntry.direction !== 'inactive') {\n oldEntry.setDirection('inactive');\n modifiedTypes.add(oldEntry.type);\n }\n }\n });\n\n ssrcs.forEach((ssrc) => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n if(entry.direction === 'inactive') {\n entry.setDirection(entry.originalDirection);\n modifiedTypes.add(entry.type);\n }\n\n return;\n }\n\n entry = description.createEntry(ssrc.type);\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n description.setEntryPeerId(entry, peerId);\n\n // if(TEST_OLD) {\n // description.bundleMids.push(entry.mid);\n // entry.setDirection('recvonly');\n // } else {\n ssrc.type === 'video' && entry.setEndpoint(ssrc.endpoint);\n entry.createTransceiver(connection, {direction: 'recvonly'});\n // }\n\n modifiedTypes.add(entry.type);\n });\n\n /* if(TEST_OLD) {\n this.setRemoteOffer({\n connection,\n description,\n ssrcs\n });\n } else */if(modifiedTypes.size) {\n if(modifiedTypes.has('video')) {\n connectionInstance.updateConstraints = true;\n }\n\n connectionInstance.negotiateThrottled();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum GROUP_CALL_STATE {\n UNMUTED,\n MUTED,\n MUTED_BY_ADMIN,\n CONNECTING,\n CLOSED\n}\n\nexport default GROUP_CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\n\nexport type GroupCallAudioAssetName = 'group_call_connect.mp3' | 'group_call_end.mp3' | 'group_call_start.mp3' | 'voip_onallowtalk.mp3';\n\nlet audioAsset: AudioAssetPlayer;\nexport default function getGroupCallAudioAsset() {\n return audioAsset ??= new AudioAssetPlayer([\n 'group_call_connect.mp3',\n 'group_call_end.mp3',\n 'group_call_start.mp3',\n 'voip_onallowtalk.mp3'\n ]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getGroupCallAudioAsset from '../../components/groupCall/getAudioAsset';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup} from '../../layer';\nimport {GroupCallId, GroupCallConnectionType} from '../appManagers/appGroupCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport GroupCallInstance from './groupCallInstance';\nimport GROUP_CALL_STATE from './groupCallState';\nimport createMainStreamManager from './helpers/createMainStreamManager';\nimport {generateSsrc} from './localConferenceDescription';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {Ssrc} from './types';\n\nconst IS_MUTED = true;\n\nexport function makeSsrcsFromParticipant(participant: GroupCallParticipant) {\n return [\n makeSsrcFromParticipant(participant, 'audio', participant.source),\n participant.video?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\n participant.video && makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\n participant.presentation?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\n participant.presentation && makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\n ].filter(Boolean);\n};\n\nexport function makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n return generateSsrc(type, source, endpoint);\n}\n\nexport function generateSelfVideo(source: Ssrc, audioSource?: number): GroupCallParticipantVideo {\n return source && {\n _: 'groupCallParticipantVideo',\n pFlags: {},\n endpoint: '',\n source_groups: source.sourceGroups,\n audio_source: audioSource\n };\n}\n\nexport class GroupCallsController extends EventListenerBase<{\n instance: (instance: GroupCallInstance) => void\n}> {\n private audioAsset: ReturnType;\n private log: ReturnType;\n private currentGroupCall: GroupCallInstance;\n private managers: AppManagers;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n this.audioAsset = getGroupCallAudioAsset();\n this.log = logger('GCC');\n\n rootScope.addEventListener('group_call_update', (groupCall) => {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCall.id) {\n currentGroupCall.groupCall = groupCall;\n\n if(groupCall._ === 'groupCallDiscarded') {\n currentGroupCall.hangUp(false, false, true);\n }\n }\n });\n\n rootScope.addEventListener('group_call_participant', ({groupCallId, participant}) => {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCallId) {\n currentGroupCall.onParticipantUpdate(participant/* , this.doNotDispatchParticipantUpdate */);\n }\n });\n }\n\n get groupCall() {\n return this.currentGroupCall;\n }\n\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\n this.currentGroupCall = groupCall;\n\n if(groupCall) {\n this.dispatchEvent('instance', groupCall);\n }\n }\n\n public startConnectingSound() {\n this.stopConnectingSound();\n this.audioAsset.playSoundWithTimeout('group_call_connect.mp3', true, 2500);\n }\n\n public stopConnectingSound() {\n this.audioAsset.stopSound();\n this.audioAsset.cancelDelayedPlay();\n }\n\n public async joinGroupCall(chatId: ChatId, groupCallId: GroupCallId, muted = IS_MUTED, rejoin?: boolean, joinVideo?: boolean) {\n this.audioAsset.createAudio();\n\n this.log(`joinGroupCall chatId=${chatId} id=${groupCallId} muted=${muted} rejoin=${rejoin}`);\n\n let streamManager: StreamManager;\n if(rejoin) {\n streamManager = this.currentGroupCall.connections.main.streamManager;\n } else {\n streamManager = await createMainStreamManager(muted, joinVideo);\n }\n\n return this.joinGroupCallInternal(chatId, groupCallId, streamManager, muted, rejoin, joinVideo)\n .then(() => {\n // have to refresh participants because of the new connection\n const {currentGroupCall} = this;\n currentGroupCall.participants.then((participants) => {\n if(this.currentGroupCall !== currentGroupCall || currentGroupCall.state === GROUP_CALL_STATE.CLOSED) {\n return;\n }\n\n participants.forEach((participant) => {\n if(!participant.pFlags.self) {\n currentGroupCall.onParticipantUpdate(participant);\n }\n });\n });\n });\n }\n\n private async joinGroupCallInternal(chatId: ChatId, groupCallId: GroupCallId, streamManager: StreamManager, muted: boolean, rejoin = false, joinVideo?: boolean) {\n const log = this.log.bindPrefix('joinGroupCallInternal');\n log('start', groupCallId);\n\n const type: GroupCallConnectionType = 'main';\n\n let {currentGroupCall} = this;\n if(currentGroupCall && rejoin) {\n // currentGroupCall.connections.main.connection = connection;\n currentGroupCall.handleUpdateGroupCallParticipants = false;\n currentGroupCall.updatingSdp = false;\n log('update currentGroupCall', groupCallId, currentGroupCall);\n } else {\n currentGroupCall = new GroupCallInstance({\n chatId,\n id: groupCallId,\n managers: this.managers\n });\n\n currentGroupCall.fixSafariAudio();\n\n currentGroupCall.addEventListener('state', (state) => {\n if(this.currentGroupCall === currentGroupCall && state === GROUP_CALL_STATE.CLOSED) {\n this.setCurrentGroupCall(null);\n this.stopConnectingSound();\n this.audioAsset.playSound('group_call_end.mp3');\n rootScope.dispatchEvent('chat_update', currentGroupCall.chatId);\n }\n });\n\n currentGroupCall.groupCall = await this.managers.appGroupCallsManager.getGroupCallFull(groupCallId);\n\n const connectionInstance = currentGroupCall.createConnectionInstance({\n streamManager,\n type,\n options: {\n type,\n isMuted: muted,\n joinVideo,\n rejoin\n }\n });\n\n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n currentGroupCall.onTrack(event);\n });\n\n connection.addEventListener('iceconnectionstatechange', () => {\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\n\n const {iceConnectionState} = connection;\n if(iceConnectionState === 'disconnected' || iceConnectionState === 'checking' || iceConnectionState === 'new') {\n this.startConnectingSound();\n } else {\n this.stopConnectingSound();\n }\n\n switch(iceConnectionState) {\n case 'checking': {\n break;\n }\n\n case 'closed': {\n currentGroupCall.hangUp();\n break;\n }\n\n case 'completed': {\n break;\n }\n\n case 'connected': {\n if(!currentGroupCall.joined) {\n currentGroupCall.joined = true;\n this.audioAsset.playSound('group_call_start.mp3');\n this.managers.appGroupCallsManager.getGroupCallParticipants(groupCallId);\n }\n\n break;\n }\n\n case 'disconnected': {\n break;\n }\n\n case 'failed': {\n // TODO: replace with ICE restart\n currentGroupCall.hangUp();\n // connection.restartIce();\n break;\n }\n\n case 'new': {\n break;\n }\n }\n });\n\n connectionInstance.createDescription();\n connectionInstance.createDataChannel();\n\n connectionInstance.appendStreamToConference();\n\n this.setCurrentGroupCall(currentGroupCall);\n log('set currentGroupCall', groupCallId, currentGroupCall);\n\n this.startConnectingSound();\n\n return connectionInstance.negotiate();\n }\n }\n}\n\nconst groupCallsController = new GroupCallsController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.groupCallController = groupCallsController);\nexport default groupCallsController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS} from '../constants';\nimport StreamManager from '../streamManager';\nimport getAudioConstraints from './getAudioConstraints';\nimport getStream from './getStream';\nimport getVideoConstraints from './getVideoConstraints';\n\nexport default async function createMainStreamManager(muted?: boolean, joinVideo?: boolean) {\n const constraints: MediaStreamConstraints = {\n audio: getAudioConstraints(),\n video: joinVideo && getVideoConstraints()\n };\n\n const streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n\n try {\n const stream = await getStream(constraints, muted);\n streamManager.addStream(stream, 'input');\n } catch(err) {\n console.error('joinGroupCall getStream error', err, constraints);\n streamManager.inputStream = new MediaStream();\n }\n\n return streamManager;\n}\n","import constraintSupported, {MyMediaTrackSupportedConstraints} from '../../../environment/constraintSupport';\n\nexport default function getAudioConstraints(): MediaTrackConstraints {\n const constraints: MediaTrackConstraints = {\n channelCount: 2\n };\n\n const desirable: (keyof MyMediaTrackSupportedConstraints)[] = [\n 'noiseSuppression',\n 'echoCancellation',\n 'autoGainControl'\n ];\n\n desirable.forEach((constraint) => {\n if(constraintSupported(constraint)) {\n // @ts-ignore\n constraints[constraint] = true;\n }\n });\n\n return constraints;\n}\n","export type MyMediaTrackSupportedConstraints = MediaTrackSupportedConstraints & {\n noiseSuppression?: boolean,\n autoGainControl?: boolean\n};\n\nexport default function constraintSupported(constraint: keyof MyMediaTrackSupportedConstraints) {\n return (!!navigator?.mediaDevices?.getSupportedConstraints() as any as MyMediaTrackSupportedConstraints)[constraint];\n}\n","export default function getScreenConstraints(skipAudio?: boolean) {\n const constraints: DisplayMediaStreamOptions = {\n video: {\n // @ts-ignore\n // cursor: 'always',\n width: {max: 1920},\n height: {max: 1080},\n frameRate: {max: 30}\n }\n };\n\n if(!skipAudio) {\n constraints.audio = true;\n }\n\n return constraints;\n}\n","export default async function getScreenStream(constraints: DisplayMediaStreamOptions) {\n const screenStream = await navigator.mediaDevices.getDisplayMedia(constraints);\n const track = screenStream.getVideoTracks()[0];\n track.contentHint = 'text';\n return screenStream;\n}\n","export default async function getStream(constraints: MediaStreamConstraints, muted: boolean) {\n // console.log('getStream', constraints);\n\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n stream.getTracks().forEach((x) => {\n x.enabled = !muted;\n });\n\n // console.log('getStream result', stream);\n return stream;\n}\n\n(window as any).getStream = getStream;\n","export default function getVideoConstraints(): MediaTrackConstraints {\n return {\n width: {min: 1280, max: 1920/* , ideal: 1920 */},\n height: {min: 720, max: 1080/* , ideal: 1080 */},\n frameRate: {min: 24, max: 30}\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from '../sdp';\nimport SDPMediaSection from '../sdp/mediaSection';\nimport {toTelegramSource} from '../utils';\nimport {parseSourceGroups} from './parseSourceGroups';\n\nexport default function parseMediaSectionInfo(sdp: SDP, channel: SDPMediaSection) {\n const clientInfo = channel.lookupAttributeKeys({\n 'ice-ufrag': true,\n 'ice-pwd': true,\n 'fingerprint': true,\n 'setup': true,\n 'ssrc': true,\n 'mid': true,\n 'ssrc-group': false\n });\n\n if(!clientInfo.fingerprint) { // support Firefox\n const line = sdp.session.lines.find((line) => line.parsed?.key === 'fingerprint');\n clientInfo.fingerprint = line.parsed.value;\n }\n\n const telegramSourceGroups = parseSourceGroups(clientInfo['ssrc-group']);\n const [hash, fingerprint] = clientInfo.fingerprint.split(' ', 2);\n const ssrc = clientInfo.ssrc && toTelegramSource(+clientInfo.ssrc.split(' ', 1)[0]);\n // ssrc = telegramSourceGroups ? telegramSourceGroups[0].sources[0] : ssrc;\n\n return {\n raw: clientInfo,\n ufrag: clientInfo['ice-ufrag'],\n pwd: clientInfo['ice-pwd'],\n fingerprint: {\n fingerprint,\n setup: clientInfo.setup,\n hash\n },\n source: ssrc,\n sourceGroups: telegramSourceGroups,\n mid: clientInfo.mid\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GroupCallParticipantVideoSourceGroup} from '../../../layer';\nimport {toTelegramSource} from '../utils';\n\nexport function parseSourceGroups(sdpLines: string[]) {\n const telegramSourceGroups = sdpLines.map((str) => {\n const [semantics, ...rest] = str.split(' ');\n\n const sourceGroup: GroupCallParticipantVideoSourceGroup = {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics,\n // sources: rest.map((ssrc) => +ssrc)\n sources: rest.map((ssrc) => toTelegramSource(+ssrc))\n };\n\n return sourceGroup;\n });\n\n /* const simIndex = telegramSourceGroups.findIndex((g) => g.semantics === 'SIM');\n if(simIndex !== -1) {\n const sourceGroup = telegramSourceGroups.splice(simIndex, 1)[0];\n telegramSourceGroups.unshift(sourceGroup);\n } */\n\n return telegramSourceGroups.length ? telegramSourceGroups : undefined;\n}\n","import simulateEvent from '../../../helpers/dom/dispatchEvent';\n\nexport default function stopTrack(track: MediaStreamTrack) {\n track.stop();\n simulateEvent(track, 'ended');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {GroupCallParticipantVideoSourceGroup} from '../../layer';\nimport {fixMediaLineType, SDPBuilder, WebRTCLineType, WEBRTC_MEDIA_PORT} from './sdpBuilder';\nimport {AudioCodec, GroupCallConnectionTransport, Ssrc, UpdateGroupCallConnectionData, VideoCodec} from './types';\n\nexport class ConferenceEntry {\n public source: number;\n public sourceGroups: GroupCallParticipantVideoSourceGroup[];\n public transceiver: RTCRtpTransceiver;\n public originalDirection: RTCRtpTransceiverDirection;\n public direction: RTCRtpTransceiverDirection;\n public port: string;\n public endpoint: string;\n public peerId: PeerId;\n\n public sendEntry: ConferenceEntry;\n public recvEntry: ConferenceEntry;\n\n constructor(public mid: string, public type: WebRTCLineType) {\n this.port = WEBRTC_MEDIA_PORT;\n }\n\n public setDirection(direction: RTCRtpTransceiverDirection) {\n if(!this.originalDirection) {\n this.originalDirection = direction;\n }\n\n return this.direction = direction;\n }\n\n public setPort(port: string) {\n return this.port = port;\n }\n\n public setEndpoint(endpoint: string) {\n return this.endpoint = endpoint;\n }\n\n public setPeerId(peerId: PeerId) {\n return this.peerId = peerId;\n }\n\n public createTransceiver(connection: RTCPeerConnection, init?: RTCRtpTransceiverInit) {\n if(init?.direction) {\n this.setDirection(init.direction);\n }\n\n return this.transceiver = connection.addTransceiver(fixMediaLineType(this.type), init);\n }\n\n public setSource(source: number | GroupCallParticipantVideoSourceGroup[]) {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n this.sourceGroups = sourceGroups;\n return this.source = source;\n }\n\n public shouldBeSkipped(isAnswer?: boolean) {\n return isAnswer && this.direction === 'inactive';\n }\n}\n\nexport function generateSsrc(type: WebRTCLineType, source: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n return {\n endpoint,\n type,\n source,\n sourceGroups\n };\n}\n\nexport default class LocalConferenceDescription implements UpdateGroupCallConnectionData {\n public readonly sessionId: string;\n // public ssrcs: Ssrc[];\n public readonly transport: GroupCallConnectionTransport;\n public readonly audio?: AudioCodec;\n public readonly video: VideoCodec;\n public readonly screencast?: VideoCodec;\n\n private maxSeenId: number;\n public readonly entries: ConferenceEntry[];\n private entriesByMid: Map;\n private entriesBySource: Map;\n private entriesByPeerId: Map>;\n\n constructor(public connection: RTCPeerConnection) {\n this.sessionId = '' + Date.now();\n // this.ssrcs = [];\n this.maxSeenId = -1;\n this.entries = [];\n this.entriesByMid = new Map();\n this.entriesBySource = new Map();\n this.entriesByPeerId = new Map();\n }\n\n public setData(data: UpdateGroupCallConnectionData) {\n return safeAssign(this, data);\n }\n\n public createEntry(type: WebRTCLineType) {\n const mid = '' + ++this.maxSeenId;\n const entry = new ConferenceEntry(mid, type);\n this.entries.push(entry);\n this.entriesByMid.set(mid, entry);\n return entry;\n }\n\n public deleteEntry(entry: ConferenceEntry) {\n indexOfAndSplice(this.entries, entry);\n this.entriesByMid.delete(entry.mid);\n this.entriesBySource.delete(entry.source);\n\n const set = this.entriesByPeerId.get(entry.peerId);\n if(set) {\n set.delete(entry);\n if(!set.size) {\n this.entriesByPeerId.delete(entry.peerId);\n }\n }\n }\n\n public setEntrySource(entry: ConferenceEntry, source: Parameters[0]) {\n entry.setSource(source);\n this.entriesBySource.set(entry.source, entry);\n }\n\n public setEntryPeerId(entry: ConferenceEntry, peerId: ConferenceEntry['peerId']) {\n entry.setPeerId(peerId);\n let set = this.entriesByPeerId.get(peerId);\n if(!set) {\n this.entriesByPeerId.set(peerId, set = new Set());\n }\n\n set.add(entry);\n }\n\n public findEntry(verify: Parameters[0]) {\n return this.entries.find(verify);\n }\n\n public findFreeSendRecvEntry(type: WebRTCLineType, isSending: boolean) {\n let entry = this.entries.find((entry) => {\n return entry.direction === 'sendrecv' && entry.type === type && !(isSending ? entry.sendEntry : entry.recvEntry);\n });\n\n if(!entry) {\n entry = this.createEntry(type);\n entry.setDirection('sendrecv');\n }\n\n return entry;\n }\n\n public getEntryByMid(mid: ConferenceEntry['mid']) {\n return this.entriesByMid.get(mid);\n }\n\n public getEntryBySource(source: ConferenceEntry['source']) {\n return this.entriesBySource.get(source);\n }\n\n public getEntriesByPeerId(peerId: ConferenceEntry['peerId']) {\n return this.entriesByPeerId.get(peerId);\n }\n\n public generateSdp(options: Omit[0], 'conference'>) {\n return SDPBuilder.fromConference({\n conference: this,\n ...options\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPMediaSection from './mediaSection';\nimport SDPSessionSection from './sessionSection';\n\nexport type AttributeKey = 'group' | 'rtcp' | 'ice-ufrag' |\n 'ice-pwd' | 'ice-options' | 'fingerprint' | 'setup' |\n 'mid' | 'extmap' | 'sendonly' | 'msid' | 'rtcp-mux' |\n 'rtpmap' | 'rtcp-fb' | 'fmtp' | 'ssrc' | 'ssrc-group' |\n 'extmap-allow-mixed' | 'msid-semantic';\n\nexport type AttributeMap = {[k in AttributeKey]?: boolean};\n\nexport default class SDP {\n #session: SDPSessionSection;\n #media: SDPMediaSection[];\n\n constructor(session: SDP['session'], mediaSections: SDP['media']) {\n this.#session = session;\n this.#media = mediaSections;\n }\n\n public get session() {\n return this.#session;\n }\n\n public get media() {\n return this.#media;\n }\n\n public get bundle() {\n const bundleLine = this.session.lines.find((line) => line.parsed?.key === 'group');\n return bundleLine.value.split(' ').slice(1);\n }\n\n toString() {\n return this.session.lines\n .concat(...this.media.map((section) => section.lines))\n .map((line) => line.toString()).join('\\r\\n') + '\\r\\n';\n }\n\n /* get buggedMedia() {\n const bundle = this.bundle;\n type A = {\n mid: SDPMediaSection['mid'],\n mediaType: SDPMediaSection['mediaType'],\n direction: SDPMediaSection['direction']\n };\n const out: A[] = [];\n for(let i = 0, length = this.media.length; i < length; ++i) {\n const section = this.media[i];\n const mid = section.mid;\n if(!bundle.includes(mid)) {\n out.push(section);\n }\n }\n\n return out;\n } */\n\n /* get mediaTypes() {\n return this.media.map((section) => {\n return {mid: section.oa.get('mid').oa, type: section.mediaType, direction: section.direction};\n });\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function splitStringByLimitWithRest(str: string, separator: string, limit: number) {\n const splitted = str.split(separator);\n const out: string[] = [];\n\n while(limit > 0 && splitted.length) {\n out.push(splitted.shift());\n --limit;\n }\n\n if(splitted.length) {\n out.push(splitted.join(separator));\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class UniqueNumberGenerator {\n #set: Set;\n #min: number;\n #max: number;\n\n constructor(min: number, max: number) {\n this.#set = new Set();\n this.#min = min;\n this.#max = max;\n }\n\n public generate() {\n const min = this.#min;\n const max = this.#max;\n const set = this.#set;\n\n const maxTries = max - min + 1;\n let value = Math.floor(min + maxTries * Math.random()), _try = 0;\n while(set.has(value)) {\n if(value < max) {\n ++value;\n } else {\n value = min;\n }\n\n if(++_try >= maxTries) {\n return null;\n }\n }\n\n set.add(value);\n return value;\n }\n\n public add(value: number) {\n this.#set.add(value);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AttributeKey} from '.';\n\nexport default class SDPAttributeSplitted {\n #key: AttributeKey;\n #value: string;\n\n // key = 'ssrc-group', value = 'SIM 1 2 3'\n constructor(key: AttributeKey, value: string) {\n this.#key = key;\n this.#value = value;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class SDPMediaLineParts {\n #type: 'audio' | 'video' | 'application';\n #port: string;\n #protocol: string;\n #ids: string[];\n\n constructor(\n type: SDPMediaLineParts['type'],\n port: SDPMediaLineParts['port'],\n protocol: SDPMediaLineParts['protocol'],\n ids: SDPMediaLineParts['ids']\n ) {\n this.#type = type;\n this.#port = port;\n this.#protocol = protocol;\n this.#ids = ids;\n }\n\n public get type() {\n return this.#type;\n }\n\n public get port() {\n return this.#port;\n }\n\n public get protocol() {\n return this.#protocol;\n }\n\n public get ids() {\n return this.#ids;\n }\n\n toString() {\n return this.type + ' ' + this.port + ' ' + this.protocol + ' ' + this.ids.join(' ');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from '../../../helpers/string/splitStringByLimitWithRest';\nimport SDPAttributeSplitted from './attributeSplitted';\nimport SDPMediaLineParts from './mediaLineParts';\n\nexport default class SDPLine {\n #key: 'm' | 'a' | 'o' | 'v' | 's' | 't' | 'c';\n #value: string;\n #mediaLineParts: SDPMediaLineParts;\n #parsed?: SDPAttributeSplitted;\n\n // key = 'a', value = 'ssrc-group:SIM 1 2 3'\n constructor(key: SDPLine['key'], value: string | SDPMediaLineParts | SDPAttributeSplitted) {\n this.#key = key;\n\n if(typeof(value) === 'string') {\n this.#value = value;\n\n if(key === 'm') {\n const splitted = value.split(' ');\n this.#mediaLineParts = new SDPMediaLineParts(splitted[0] as any, splitted[1], splitted[2], splitted.slice(3));\n } else {\n if(key === 'a') {\n const result = splitStringByLimitWithRest(value, ':', 1);\n value = result[0];\n this.#parsed = result.length === 1 ? new SDPAttributeSplitted(value as any, null) : new SDPAttributeSplitted(value as any, result[1]);\n }\n }\n } else {\n if(value instanceof SDPMediaLineParts) {\n this.#mediaLineParts = value;\n this.#value = value.toString();\n } else if(value instanceof SDPAttributeSplitted) {\n this.#parsed = value;\n this.#value = value.value ? `${value.key}:${value.value}` : value.key;\n }\n }\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n\n public get parsed() {\n return this.#parsed;\n }\n\n public get mediaLineParts() {\n return this.#mediaLineParts;\n }\n\n toString() {\n return `${this.key}=${this.value}`;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from '../../../helpers/string/splitStringByLimitWithRest';\n\nexport default class SDPAttributeInner {\n #key: string;\n #lines: Array;\n #prefix: string;\n #nestedMap: Map;\n #missed: boolean;\n #keys: Array;\n\n constructor(key: SDPAttributeInner['key'], lines: SDPAttributeInner['lines'], prefix: string = ':', missed = false) {\n this.#key = key;\n this.#lines = lines;\n this.#prefix = prefix;\n this.#missed = missed;\n this.#nestedMap = missed ? new Map() : null;\n this.#keys = missed ? [] : null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get value() {\n return this.#missed || !this.lines.length ? null : this.lines[0];\n }\n\n public get exists() {\n return !this.#missed;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get keys() {\n SDPAttributeInner.fill(this);\n return this.#keys;\n }\n\n public forEach(callback: Parameters['forEach']>[0]) {\n SDPAttributeInner.fill(this);\n this.#nestedMap.forEach(callback);\n }\n\n public get(key: string) {\n SDPAttributeInner.fill(this);\n return this.#nestedMap.get(key) || new SDPAttributeInner(key, [], ':', true);\n }\n\n private static fill(attribute: SDPAttributeInner) {\n if(attribute.#nestedMap !== null) {\n return;\n }\n\n const map: Map> = new Map();\n attribute.lines.forEach((str) => {\n const [key, rest] = splitStringByLimitWithRest(str, attribute.#prefix, 1);\n const values = map.get(key) || [];\n map.set(key, [...values, rest || '']);\n });\n\n const nestedMap = attribute.#nestedMap = SDPAttributeInner.makeAttributes(map);\n attribute.#keys = Array.from(nestedMap.keys());\n }\n\n private static makeAttributes(innerParts: Map>) {\n const out: Map = new Map();\n\n innerParts.forEach((lines, key) => {\n out.set(key, new SDPAttributeInner(key, lines));\n });\n\n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPAttributeInner from './attributeInner';\nimport SDPLine from './line';\n\nexport default class SDPAttributes {\n #lines: SDPLine[];\n #attributes: Map;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#attributes = new Map();\n SDPAttributes.fillAttributes(this);\n }\n\n public get(key: string) {\n return this.#attributes.get(key) || new SDPAttributeInner(key, [], ' ', true);\n }\n\n private static fillAttributes(attributes: SDPAttributes) {\n const attributesMap: Map> = new Map();\n attributes.#lines.forEach((line) => {\n if(line.key === 'a') {\n const {key, value} = line.parsed;\n\n let linesArray = attributesMap.get(key);\n if(!linesArray) {\n linesArray = [];\n attributesMap.set(key, linesArray);\n }\n\n linesArray.push(value || '');\n }\n });\n\n attributesMap.forEach((linesArray, key) => {\n attributes.#attributes.set(key, new SDPAttributeInner(key, linesArray, ' ', false));\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AttributeMap} from '.';\nimport {NoExtraProperties} from '../../../types';\nimport SDPAttributes from './attributes';\nimport SDPLine from './line';\n\nexport type SDPMediaDirection = 'sendonly' | 'recvonly' | 'inactive' | 'sendrecv';\nexport default class SDPMediaSection {\n #lines: Array;\n #mediaLine: SDPLine;\n #attributes: SDPAttributes;\n #direction: SDPMediaDirection;\n\n constructor(lines: Array) {\n this.#lines = lines;\n this.#mediaLine = lines[0];\n this.#attributes = this.#direction = null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get mediaLine() {\n return this.#mediaLine;\n }\n\n public get mediaLineParts() {\n return this.#mediaLine.mediaLineParts;\n }\n\n public get mediaType() {\n return this.mediaLineParts.type;\n }\n\n public get direction() {\n if(!this.#direction) {\n const attributes = this.attributes;\n\n let direction: SDPMediaDirection;\n if(attributes.get('sendonly').exists) direction = 'sendonly';\n else if(attributes.get('recvonly').exists) direction = 'recvonly';\n else if(attributes.get('inactive').exists) direction = 'inactive';\n else direction = 'sendrecv';\n\n this.#direction = direction;\n }\n\n return this.#direction;\n }\n\n public get isSending() {\n return this.direction === 'sendrecv' || this.direction === 'sendonly';\n }\n\n public get isReceiving() {\n return this.direction === 'sendrecv' || this.direction === 'recvonly';\n }\n\n public get attributes() {\n this.#attributes || (this.#attributes = new SDPAttributes(this.lines));\n return this.#attributes;\n }\n\n public get mid() {\n return this.attributes.get('mid').value;\n }\n\n public lookupAttributeKeys(keys: NoExtraProperties): {[k in keyof T]: T[k] extends true ? string : string[]} {\n const out: any = {};\n\n for(const key in keys) {\n const result = this.attributes.get(key);\n // @ts-ignore\n const resultShouldBeArray = !keys[key];\n if(!result) {\n out[key] = resultShouldBeArray ? [] : undefined;\n } else {\n out[key] = resultShouldBeArray ? result.lines : result.value;\n }\n }\n\n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPLine from './line';\n\nexport default class SDPSessionSection {\n #lines: SDPLine[];\n #sessionId: string;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#sessionId = lines.filter((line) => line.key === 'o').map((line) => line.value.split(' ')[1])[0];\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get sessionId() {\n return this.#sessionId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from '.';\nimport splitStringByLimitWithRest from '../../../helpers/string/splitStringByLimitWithRest';\nimport UniqueNumberGenerator from '../../../helpers/uniqueNumberGenerator';\nimport SDPLine from './line';\nimport SDPMediaSection from './mediaSection';\nimport SDPSessionSection from './sessionSection';\n\nexport function parseSdp(str: string) {\n function createSection() {\n if(sessionSection) {\n mediaSections.push(new SDPMediaSection(lines));\n } else {\n sessionSection = new SDPSessionSection(lines);\n }\n }\n\n let sessionSection: SDPSessionSection = null, lines: SDPLine[] = [];\n const mediaSections: SDPMediaSection[] = [];\n str.split(/\\r?\\n/).forEach((lineStr) => {\n if(!isIncorrectSdpLine(lineStr)) {\n const line = parseSdpLine(lineStr);\n if(line.key === 'm') {\n createSection();\n lines = [];\n }\n\n lines.push(line);\n }\n });\n\n createSection();\n return new SDP(sessionSection, mediaSections);\n}\n\nexport function isIncorrectSdpLine(str: string) {\n return /^[\\s\\xa0]*$/.test(str);\n}\n\nexport function parseSdpLine(str: string) {\n const splitted = splitStringByLimitWithRest(str, '=', 1);\n return new SDPLine(splitted[0] as any, splitted[1]);\n}\n\nexport function addSimulcast(sdp: SDP) {\n let generator: UniqueNumberGenerator;\n sdp.media.forEach((section, idx) => {\n if(section.mediaType === 'video' && section.isSending && !section.attributes.get('ssrc-group').get('SIM').exists) {\n if(!generator) {\n generator = new UniqueNumberGenerator(2, 4294967295);\n }\n\n const originalSsrcs = section.attributes.get('ssrc-group').get('FID').value.split(' ');\n const lines = section.lines;\n originalSsrcs.forEach((ssrc) => generator.add(+ssrc)); // fix possible duplicates\n const ssrcs = [originalSsrcs[0], generator.generate(), generator.generate()];\n const ssrcs2 = [originalSsrcs[1], generator.generate(), generator.generate()];\n\n lines.push(parseSdpLine('a=ssrc-group:SIM ' + ssrcs.join(' ')));\n\n const ssrcsStrLines = section.attributes.get('ssrc').get(originalSsrcs[0]).lines;\n\n ssrcs.forEach((ssrc, idx) => {\n const ssrc2 = ssrcs2[idx];\n if(idx > 0) {\n lines.push(parseSdpLine('a=ssrc-group:FID ' + ssrc + ' ' + ssrc2));\n\n ssrcsStrLines.forEach((v) => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc + ' ' + v));\n });\n\n ssrcsStrLines.forEach((v) => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc2 + ' ' + v));\n });\n }\n });\n\n sdp.media[idx] = new SDPMediaSection(lines);\n }\n });\n\n return !!generator;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport LocalConferenceDescription, {ConferenceEntry} from './localConferenceDescription';\nimport StringFromLineBuilder from './stringFromLineBuilder';\nimport {GroupCallConnectionTransport, PayloadType, UpdateGroupCallConnectionData} from './types';\nimport {fromTelegramSource} from './utils';\n\n// screencast is for Peer-to-Peer only\nexport type WebRTCLineTypeTrue = 'video' | 'audio' | 'application';\nexport type WebRTCLineType = WebRTCLineTypeTrue | 'screencast';\n\nexport const WEBRTC_MEDIA_PORT = '9';\n\nexport function fixMediaLineType(mediaType: WebRTCLineType) {\n return mediaType === 'screencast' ? 'video' : mediaType;\n}\n\nexport function performCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n const arr: string[] = [];\n arr.push('a=candidate:');\n arr.push(`${c.foundation} ${c.component} ${c.protocol.toUpperCase()} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`);\n if(c['rel-addr'] !== undefined) {\n arr.push(` raddr ${c['rel-addr']} rport ${c['rel-port']}`);\n }\n arr.push(` generation ${c.generation}`);\n return arr.join('');\n}\n\nexport function getConnectionTypeForMediaType(mediaType: WebRTCLineType) {\n // return mediaType === 'application' ? 'DTLS/SCTP' : 'RTP/SAVPF';\n return mediaType === 'application' ? 'DTLS/SCTP' : 'UDP/TLS/RTP/SAVPF';\n}\n\nexport function generateMediaFirstLine(mediaType: WebRTCLineType, port = WEBRTC_MEDIA_PORT, payloadIds: (string | number)[]) {\n const connectionType = getConnectionTypeForMediaType(mediaType);\n return `m=${fixMediaLineType(mediaType)} ${port} ${connectionType} ${payloadIds.join(' ')}`;\n}\n\ntype ConferenceData = UpdateGroupCallConnectionData | LocalConferenceDescription;\n\n// https://tools.ietf.org/id/draft-ietf-rtcweb-sdp-08.html\n// https://datatracker.ietf.org/doc/html/draft-roach-mmusic-unified-plan-00\nexport class SDPBuilder extends StringFromLineBuilder {\n public addCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n return this.add(performCandidate(c));\n }\n\n /* public addDataChannel(mid: string, transport: GroupCallConnectionTransport, isAnswer?: boolean) {\n this.add(\n 'm=application 9 UDP/DTLS/SCTP webrtc-datachannel',\n 'c=IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${mid}`\n );\n\n // if(!isAnswer) {\n this.add('a=sendrecv');\n // }\n\n this.addTransport(transport, isAnswer);\n\n return this.add(\n 'a=sctp-port:5000',\n 'a=max-message-size:262144'\n );\n } */\n\n public addHeader(sId: string, bundleMids: string[]) {\n const bundle = bundleMids.join(' ');\n return this.add(\n 'v=0', // version\n `o=- ${sId} 2 IN IP4 0.0.0.0`, // sessionId, 2=sessionVersion\n 's=-', // name of the session\n 't=0 0', // time when session is valid\n 'a=extmap-allow-mixed',\n `a=group:BUNDLE ${bundle}`,\n 'a=ice-options:trickle',\n // 'a=ice-lite', // ice-lite: is a minimal version of the ICE specification, intended for servers running on a public IP address.\n 'a=msid-semantic:WMS *'\n );\n }\n\n public addTransport(transport: GroupCallConnectionTransport, skipCandidates?: boolean) {\n this.add(\n `a=ice-ufrag:${transport.ufrag}`,\n `a=ice-pwd:${transport.pwd}`,\n 'a=ice-options:trickle' // ! test\n );\n\n for(const fingerprint of transport.fingerprints) {\n this.add(\n `a=fingerprint:${fingerprint.hash} ${fingerprint.fingerprint}`,\n `a=setup:${fingerprint.setup}`\n );\n }\n\n if(!skipCandidates && transport.candidates) {\n for(const candidate of transport.candidates) {\n this.addCandidate(candidate);\n }\n }\n\n return this;\n }\n\n public addSsrc(entry: ConferenceEntry) {\n let streamName = 'stream';\n let {type, sourceGroups} = entry;\n\n // let source = ssrc.source ?? ssrc.sourceGroups[0].sources[0];\n // source = fromTelegramSource(source);\n const source = fromTelegramSource(entry.source);\n\n streamName += source;\n type += source as any;\n\n // streamName += mid;\n // type += mid as any;\n\n // streamName = type = entry.transceiver.receiver.track.id as any;\n\n const addMsid = () => {\n this.add(`a=msid:${streamName} ${type}`);\n };\n\n const addSource = (ssrc: number) => {\n this.add(\n `a=ssrc:${ssrc} cname:${streamName}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}`,\n `a=ssrc:${ssrc} mslabel:${streamName}`,\n `a=ssrc:${ssrc} label:${type}`\n );\n };\n\n addMsid();\n if(sourceGroups?.length) {\n sourceGroups.forEach((ssrcGroup) => {\n if(ssrcGroup.sources.length) {\n const sources = ssrcGroup.sources.map(fromTelegramSource);\n this.add(`a=ssrc-group:${ssrcGroup.semantics} ${sources.join(' ')}`);\n sources.forEach(addSource);\n }\n });\n } else {\n addSource(source);\n }\n\n return this;\n }\n\n public addSsrcEntry(entry: ConferenceEntry, data: ConferenceData, isAnswer?: boolean) {\n const add = (...x: string[]) => this.add(...x);\n\n const {type, mid, direction, port} = entry;\n const transport = data.transport;\n\n /* if(type === 'application') {\n return this.addDataChannel(mid, transport, isAnswer);\n } */\n\n const isApplication = type === 'application';\n const codec = isApplication ? undefined : data[type];\n\n const isInactive = direction === 'inactive';\n if(entry.shouldBeSkipped(isAnswer)) {\n return add(\n `m=${fixMediaLineType(type)} 0 ${getConnectionTypeForMediaType(type)} 0`,\n `c=IN IP4 0.0.0.0`,\n `a=inactive`,\n `a=mid:${mid}`\n );\n }\n\n const payloadTypes = !isApplication ? codec['payload-types'] : [{id: 5000} as PayloadType];\n const ids = payloadTypes.map((type) => type.id);\n add(\n generateMediaFirstLine(type, port, ids),\n 'c=IN IP4 0.0.0.0',\n `a=rtcp:${port} IN IP4 0.0.0.0`\n );\n\n if(transport['rtcp-mux']) {\n add('a=rtcp-mux');\n }\n\n add(`a=mid:${mid}`);\n /* if(type === 'video') {\n add('b=AS:2500');\n } */\n\n let setDirection = direction;\n if(direction !== 'sendrecv' && isAnswer && !(isInactive || isApplication)) {\n setDirection = direction === 'sendonly' ? 'recvonly' : 'sendonly';\n }\n\n // a=bundle-only\n add(`a=${setDirection}`);\n\n // this.addTransport(transport, isAnswer);\n this.addTransport(transport);\n\n if(!isApplication) {\n const hdrexts = codec['rtp-hdrexts'];\n if(hdrexts?.length) {\n hdrexts.forEach((hdrext) => {\n add(`a=extmap:${hdrext.id} ${hdrext.uri}`);\n });\n }\n\n payloadTypes.forEach((type) => {\n add(`a=rtpmap:${type.id} ${type.name}/${type.clockrate}${type.channels && type.channels > 1 ? `/${type.channels}` : ''}`);\n\n const parameters = type.parameters;\n if(Array.isArray(parameters)) {\n if(parameters.length) {\n console.error('parameters is array???', parameters);\n }\n } else if(parameters && Object.keys(parameters).length) {\n const p: string[] = [];\n for(const i in parameters) {\n p.push(`${i}=${parameters[i]}`);\n }\n add(`a=fmtp:${type.id} ${p.join(';')}`);\n }\n\n const fbs = type['rtcp-fbs'];\n if(fbs?.length) {\n fbs.forEach((fb) => {\n add(`a=rtcp-fb:${type.id} ${fb.type}${fb.subtype ? ' ' + fb.subtype : ''}`);\n });\n }\n });\n } else {\n add(`a=sctpmap:${payloadTypes[0].id} webrtc-datachannel 256`);\n }\n\n if(entry.source && (setDirection === 'sendonly' || setDirection === 'sendrecv')) {\n this.addSsrc(entry);\n }\n\n return this;\n }\n\n public addConference(options: {\n conference: LocalConferenceDescription,\n bundle: string[],\n entries: ConferenceEntry[],\n isAnswer?: boolean,\n }) {\n const {conference, entries, bundle, isAnswer} = options;\n this.addHeader(conference.sessionId, bundle);\n\n if(IS_FIREFOX) {\n this.addTransport(conference.transport); // support Firefox\n }\n\n for(const entry of entries) {\n // this.addSsrcEntry(entry, conference, isAnswer);\n this.addSsrcEntry((isAnswer ? entry.recvEntry || entry.sendEntry : entry.sendEntry || entry.recvEntry) || entry, conference, isAnswer);\n }\n\n return this;\n }\n\n public static fromConference(options: Parameters[0]) {\n return new SDPBuilder().addConference(options).finalize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX} from './constants';\nimport stopTrack from './helpers/stopTrack';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport {fixMediaLineType, WebRTCLineType} from './sdpBuilder';\nimport {getAmplitude, toTelegramSource} from './utils';\n\nexport type StreamItemBase = {\n type: 'input' | 'output',\n track: MediaStreamTrack,\n source: string,\n stream: MediaStream\n};\n\nexport type StreamItem = StreamAudioItem | StreamVideoItem;\n\nexport type StreamAudioItem = StreamItemBase & {kind: 'audio', streamAnalyser: AudioStreamAnalyser};\nexport type StreamVideoItem = StreamItemBase & {kind: 'video'};\n\nexport type StreamAmplitude = {\n type: 'input' | 'output';\n source: string;\n stream: MediaStream;\n track: MediaStreamTrack;\n value: number;\n};\n\nclass AudioStreamAnalyser {\n public analyser: AnalyserNode;\n public gain: GainNode;\n public streamSource: MediaStreamAudioSourceNode;\n\n constructor(context: AudioContext, stream: MediaStream) {\n const streamSource = this.streamSource = context.createMediaStreamSource(stream);\n const analyser = this.analyser = context.createAnalyser();\n const gain = this.gain = context.createGain();\n // const streamDestination = context.createMediaStreamDestination();\n\n analyser.minDecibels = -100;\n analyser.maxDecibels = -30;\n analyser.smoothingTimeConstant = 0.05;\n analyser.fftSize = 1024;\n\n // connect Web Audio API\n streamSource.connect(analyser);\n // analyser.connect(context.destination);\n }\n}\n\nexport default class StreamManager {\n public static ANALYSER_LISTENER = new EventListenerBase<{amplitude: (details: {amplitudes: StreamAmplitude[], type: 'all' | 'input'}) => void}>();\n private context: AudioContext;\n public outputStream: MediaStream;\n public inputStream: MediaStream;\n\n private timer: number;\n private counter: number;\n\n private items: StreamItem[];\n\n private log: ReturnType;\n\n public direction: RTCRtpTransceiver['direction'];\n public canCreateConferenceEntry: boolean;\n public locked: boolean;\n public types: WebRTCLineType[];\n\n constructor(private interval?: number) {\n this.context = new (window.AudioContext || (window as any).webkitAudioContext)();\n this.items = [];\n this.outputStream = new MediaStream();\n this.inputStream = new MediaStream();\n this.counter = 0;\n this.log = logger('SM');\n this.direction = 'sendonly';\n this.canCreateConferenceEntry = true;\n // this.lol = true;\n this.types = ['audio', 'video'];\n }\n\n public addStream(stream: MediaStream, type: StreamItem['type']) {\n stream.getTracks().forEach((track) => {\n this.addTrack(stream, track, type);\n });\n }\n\n public addTrack(stream: MediaStream, track: MediaStreamTrack, type: StreamItem['type']) {\n this.log('addTrack', type, track, stream);\n\n const {context, items, inputStream, outputStream} = this;\n const kind: StreamItem['kind'] = track.kind as any;\n const source = StreamManager.getSource(stream, type);\n\n // this.removeTrack(track);\n switch(type) {\n case 'input': {\n if(!inputStream) {\n this.inputStream = stream;\n } else {\n inputStream.addTrack(track);\n }\n\n break;\n }\n\n case 'output': {\n for(let i = 0; i < items.length; ++i) {\n const {track: t, type, source: itemSource} = items[i];\n if(itemSource === source && type === 'input') {\n items.splice(i, 1);\n outputStream.removeTrack(t);\n break;\n }\n }\n\n if(kind !== 'video') {\n outputStream.addTrack(track);\n }\n\n break;\n }\n }\n\n this.finalizeAddingTrack({\n type,\n source,\n stream,\n track,\n kind,\n streamAnalyser: kind === 'audio' ? new AudioStreamAnalyser(context, stream) : undefined\n });\n\n if(kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n private finalizeAddingTrack(item: StreamItem) {\n const {track} = item;\n track.addEventListener('ended', () => {\n this.removeTrack(track);\n }, {once: true});\n\n this.items.push(item);\n }\n\n public hasInputTrackKind(kind: StreamItem['kind']) {\n return this.items.find((item) => item.type === 'input' && item.kind === kind);\n }\n\n public static getSource(stream: MediaStream, type: StreamItem['type']) {\n return type === 'input' ? (stream.source || stream.id) : '' + toTelegramSource(+stream.id.substring(6));\n }\n\n public removeTrack(track: MediaStreamTrack) {\n this.log('removeTrack', track);\n\n const {items} = this;\n\n let handled = false;\n for(let i = 0, length = items.length; !handled && i < length; ++i) {\n const {track: t, type} = items[i];\n switch(type) {\n case 'output': {\n if(t === track) {\n items.splice(i, 1);\n this.outputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n\n case 'input': {\n if(t === track) {\n items.splice(i, 1);\n this.inputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n }\n }\n\n if(track.kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n public replaceInputAudio(stream: MediaStream, oldTrack: MediaStreamTrack) {\n this.removeTrack(oldTrack);\n this.addStream(stream, 'input');\n }\n\n private changeTimer() {\n if(this.timer !== undefined) {\n clearInterval(this.timer);\n }\n\n if(this.items.length) {\n this.timer = window.setInterval(this.analyse, this.interval);\n }\n }\n\n public getAmplitude = (item: StreamAudioItem): StreamAmplitude => {\n const {streamAnalyser, stream, track, source, type} = item;\n const analyser = streamAnalyser.analyser;\n if(!analyser) return;\n\n const array = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(array);\n const value = getAmplitude(array);\n\n return {\n type,\n source,\n stream,\n track,\n value\n };\n };\n\n public analyse = () => {\n const all = this.counter % 3 === 0;\n const filteredItems = all ? this.items : this.items.filter((x) => x.type === 'input');\n const audioItems = filteredItems.filter((x) => x.kind === 'audio') as StreamAudioItem[];\n const amplitudes = audioItems.slice(0, GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX).map(this.getAmplitude);\n if(++this.counter >= 1000) {\n this.counter = 0;\n }\n\n StreamManager.ANALYSER_LISTENER.dispatchEvent('amplitude', {\n amplitudes,\n type: all ? 'all' : 'input'\n });\n };\n\n /* public appendToConnection(connection: RTCPeerConnection) {\n if(this.inputStream) {\n this.inputStream.getTracks().forEach((track) => {\n connection.log('addTrack', track);\n connection.addTrack(track, this.inputStream);\n\n if(track.kind === 'video') {\n track.enabled = true;\n }\n });\n }\n } */\n\n public appendToConference(conference: LocalConferenceDescription) {\n if(this.locked) {\n return;\n }\n\n const {inputStream, direction, canCreateConferenceEntry} = this;\n const transceiverInit: RTCRtpTransceiverInit = {direction, streams: [inputStream]};\n const types = this.types.map((type) => {\n return [\n type,\n /* type === 'video' || type === 'screencast' ?\n {sendEncodings: [{maxBitrate: 2500000}], ...transceiverInit} : */\n transceiverInit\n ] as const;\n });\n\n const tracks = inputStream.getTracks();\n // const transceivers = conference.connection.getTransceivers();\n for(const [type, transceiverInit] of types) {\n let entry = conference.findEntry((entry) => entry.direction === direction && entry.type === type);\n if(!entry) {\n if(!canCreateConferenceEntry) {\n continue;\n }\n\n entry = conference.createEntry(type);\n }\n /* const entry = conference.findFreeSendRecvEntry(type, true);\n if(!entry.transceiver) {\n entry.transceiver = transceivers.find((transceiver) => transceiver.mid === entry.mid);\n } */\n\n let {transceiver} = entry;\n if(!transceiver) {\n transceiver = entry.createTransceiver(conference.connection, transceiverInit);\n\n /* if(this.isScreenSharingManager) {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n } */\n }\n\n if(entry.direction !== transceiver.direction) {\n transceiver.direction = entry.direction;\n }\n\n const mediaTrackType = fixMediaLineType(type);\n const trackIdx = tracks.findIndex((track) => track.kind === mediaTrackType);\n const track = trackIdx !== -1 ? tracks.splice(trackIdx, 1)[0] : undefined;\n const sender = transceiver.sender;\n if(sender.track === track) {\n continue;\n }\n\n // try { // ! don't use await here. it will wait for adding track and fake one won't be visible in startNegotiation.\n /* await */sender.replaceTrack(track).catch((err) => {\n this.log.error(err);\n });\n // } catch(err) {\n\n // }\n }\n }\n\n public stop() {\n try {\n const tracks = this.inputStream.getTracks().concat(this.outputStream.getTracks());\n tracks.forEach((track) => {\n stopTrack(track);\n });\n } catch(e) {\n this.log.error(e);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport default class StringFromLineBuilder {\n private lines: string[];\n private newLine: string[];\n\n constructor(private joiner = '\\r\\n') {\n this.lines = [];\n this.newLine = [];\n }\n\n public add(...strs: string[]) {\n this.lines.push(...strs);\n return this;\n }\n\n public push(word: string) {\n this.newLine.push(word);\n return this;\n }\n\n public addJoined(separator = '') {\n this.add(this.newLine.join(separator));\n this.newLine = [];\n return this;\n }\n\n public join() {\n return this.lines.join(this.joiner);\n }\n\n public finalize() {\n return this.join() + this.joiner;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\n// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n// unsign => sign\nexport function toTelegramSource(source: number) {\n return source << 0;\n}\n\n// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n// sign => unsign\nexport function fromTelegramSource(source: number) {\n return source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n if(!array) return 0;\n\n const {length} = array;\n let total = 0;\n for(let i = 0; i < length; ++i) {\n total += array[i] * array[i];\n }\n const rms = Math.sqrt(total / length) / 255;\n\n return Math.min(1, rms * scale);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport getEmojiEntityFromEmoji from './getEmojiEntityFromEmoji';\nimport emojiRegExp from '../../vendor/emoji/regex';\n\nconst EMOJI_REG_EXP = new RegExp(`(^${emojiRegExp})`);\n\nexport default function getAbbreviation(str: string, onlyFirst = false): {\n text: string,\n entities: MessageEntity[]\n} {\n const splitted = (str || '').trim().split(' ');\n if(!splitted[0]) return {text: '', entities: []};\n\n const entities: MessageEntity.messageEntityEmoji[] = [];\n\n const firstEmojiMatch = splitted[0].match(EMOJI_REG_EXP);\n const first = firstEmojiMatch?.[0] || splitted[0][0];\n if(firstEmojiMatch) {\n entities.push(getEmojiEntityFromEmoji(first));\n }\n\n const length = splitted.length;\n if(onlyFirst || length === 1) return {text: first, entities};\n\n const lastEmojiMatch = splitted[length - 1].match(EMOJI_REG_EXP);\n const last = lastEmojiMatch?.[0] || splitted[length - 1][0];\n if(lastEmojiMatch) {\n entities.push({\n ...getEmojiEntityFromEmoji(last),\n offset: first.length\n });\n }\n\n return {text: first + last, entities};\n}\n","import {MessageEntity} from '../../layer';\nimport {toCodePoints} from '../../vendor/emoji';\n\nexport default function getEmojiEntityFromEmoji(emoji: string): MessageEntity.messageEntityEmoji {\n return {\n _: 'messageEntityEmoji',\n offset: 0,\n length: emoji.length,\n unicode: toCodePoints(emoji).join('-').replace(/-?fe0f/g, '')\n };\n}\n","import {EMAIL_REG_EXP} from '.';\n\nexport default function matchEmail(text: string) {\n return !text ? null : text.match(EMAIL_REG_EXP);\n}\n","export default function setBlankToAnchor(anchor: HTMLAnchorElement) {\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n return anchor;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport wrapEmojiText from './wrapEmojiText';\nimport getAbbreviation from './getAbbreviation';\n\nexport default function wrapAbbreviation(str: string, onlyFirst?: boolean) {\n const {text, entities} = getAbbreviation(str, onlyFirst);\n return wrapEmojiText(text, undefined, entities);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../rootScope';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapDraftText(text: string, options: Partial<{\n wrappingForPeerId: PeerId\n}> & Parameters[1] = {}) {\n if(!text) {\n return wrapRichText('');\n }\n\n let entities = options.entities;\n if(entities && !rootScope.premium && options.wrappingForPeerId !== rootScope.myId) {\n entities = entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\n }\n\n const fragment = wrapRichText(text, {\n ...options,\n entities,\n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n\n return fragment;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport parseEntities from './parseEntities';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapEmojiText(text: string, isDraft = false, entities?: MessageEntity[]) {\n if(!text) return wrapRichText('');\n\n entities ??= parseEntities(text).filter((e) => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n}\n","import IS_EMOJI_SUPPORTED from './emojiSupport';\n\nexport type EMOJI_VERSION = '' | '14';\n\nconst EMOJI_VERSIONS_SUPPORTED: {\n [v in EMOJI_VERSION]: boolean\n} = {} as any;\n\n// Thanks to WebZ for the detect\nfunction isEmojiSupported(emoji: string) {\n const ALLOWABLE_CALCULATION_ERROR_SIZE = 5;\n const inlineEl = document.createElement('span');\n inlineEl.classList.add('emoji');\n document.body.appendChild(inlineEl);\n\n inlineEl.innerText = emoji; // Emoji from 14.0 version\n const newEmojiWidth = inlineEl.offsetWidth;\n inlineEl.innerText = '❤️'; // Emoji from 1.0 version\n const legacyEmojiWidth = inlineEl.offsetWidth;\n\n document.body.removeChild(inlineEl);\n\n return Math.abs(newEmojiWidth - legacyEmojiWidth) < ALLOWABLE_CALCULATION_ERROR_SIZE;\n}\n\nif(IS_EMOJI_SUPPORTED) {\n EMOJI_VERSIONS_SUPPORTED[''] = true;\n\n const a: [keyof typeof EMOJI_VERSIONS_SUPPORTED, string][] = [\n ['14', '🫱🏻']\n ];\n\n a.forEach(([version, emoji]) => {\n EMOJI_VERSIONS_SUPPORTED[version] = isEmojiSupported(emoji);\n });\n}\n\nexport default EMOJI_VERSIONS_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {EMOJI_VERSION} from '../../environment/emojiVersionsSupport';\nimport {SITE_HASHTAGS} from '.';\nimport {EmojiVersions} from '../../config/emoji';\nimport IS_EMOJI_SUPPORTED from '../../environment/emojiSupport';\nimport buildURLHash from '../../helpers/buildURLHash';\nimport copy from '../../helpers/object/copy';\nimport encodeEntities from '../../helpers/string/encodeEntities';\nimport {MessageEntity} from '../../layer';\nimport encodeSpoiler from './encodeSpoiler';\nimport parseEntities from './parseEntities';\nimport setBlankToAnchor from './setBlankToAnchor';\nimport wrapUrl from './wrapUrl';\nimport EMOJI_VERSIONS_SUPPORTED from '../../environment/emojiVersionsSupport';\nimport {CLICK_EVENT_NAME} from '../../helpers/dom/clickEvent';\nimport IS_CUSTOM_EMOJI_SUPPORTED from '../../environment/customEmojiSupport';\nimport rootScope from '../rootScope';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport wrapSticker, {videosCache} from '../../components/wrappers/sticker';\nimport RLottiePlayer, {getLottiePixelRatio} from '../rlottie/rlottiePlayer';\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport type {MyDocument} from '../appManagers/appDocsManager';\nimport LazyLoadQueue from '../../components/lazyLoadQueue';\nimport {Awaited} from '../../types';\nimport {MediaSize} from '../../helpers/mediaSize';\nimport IS_WEBM_SUPPORTED from '../../environment/webmSupport';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\nimport {getMiddleware, Middleware, MiddlewareHelper} from '../../helpers/middleware';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport BOM from '../../helpers/string/bom';\nimport framesCache from '../../helpers/framesCache';\nimport wrapTelegramUrlToAnchor from './wrapTelegramUrlToAnchor';\n\nconst resizeObserver = new ResizeObserver((entries) => {\n for(const entry of entries) {\n const renderer = entry.target.parentElement as CustomEmojiRendererElement;\n renderer.setDimensionsFromRect(entry.contentRect);\n }\n});\n\nconst globalLazyLoadQueue = new LazyLoadQueue();\n\nexport class CustomEmojiElement extends HTMLElement {\n public elements: CustomEmojiElements;\n public renderer: CustomEmojiRendererElement;\n public player: RLottiePlayer | HTMLVideoElement;\n public paused: boolean;\n public syncedPlayer: SyncedPlayer;\n public clean: boolean;\n public lastChildWas: Node;\n // public docId: DocId;\n public placeholder: HTMLImageElement;\n public middlewareHelper: MiddlewareHelper;\n\n constructor() {\n super();\n this.paused = true;\n this.classList.add('custom-emoji');\n }\n\n public get docId() {\n return this.dataset.docId;\n }\n\n public static create(docId: DocId) {\n const element = new CustomEmojiElement();\n // element.docId = docId;\n element.dataset.docId = '' + docId;\n return element;\n }\n\n public get isConnected() {\n return this.placeholder?.isConnected ?? super.isConnected;\n }\n\n public connectedCallback() {\n // if(this.isConnected) {\n // return;\n // }\n\n if(this.player) {\n animationIntersector.addAnimation(this, this.renderer.animationGroup, undefined, true);\n }\n\n // this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected || !this.renderer?.isSelectable) { // prepend on sibling can invoke disconnectedCallback\n return;\n }\n\n this.clear();\n }\n\n public destroy() {\n this.clear();\n }\n\n public clear(replaceChildren = true) {\n if(this.clean) {\n return;\n }\n\n // if(this.docId === '5399836826758290421') {\n // console.log('clear', this, this.isConnected);\n // }\n\n this.clean = true;\n this.pause();\n\n const {syncedPlayer} = this;\n if(syncedPlayer) {\n syncedPlayer.pausedElements.delete(this);\n }\n\n this.middlewareHelper?.clean();\n\n if(this.renderer) {\n const elements = this.renderer.customEmojis.get(this.docId);\n if(elements?.delete(this) && !elements.size) {\n this.renderer.customEmojis.delete(this.docId);\n this.renderer.playersSynced.delete(elements);\n }\n\n if(replaceChildren) {\n if(this.renderer.isSelectable) {\n this.replaceChildren(createCustomFiller(true));\n } else {\n // otherwise https://bugs.chromium.org/p/chromium/issues/detail?id=1144736#c27 will happen\n this.replaceChildren();\n }\n }\n }\n\n if(this.player) {\n animationIntersector.removeAnimationByPlayer(this);\n }\n\n if(globalLazyLoadQueue) {\n globalLazyLoadQueue.delete({div: this});\n }\n\n /* this.disconnectedCallback = */this.elements =\n this.renderer =\n this.player =\n this.syncedPlayer =\n undefined;\n }\n\n public pause() {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n\n if(this.player instanceof HTMLVideoElement && !this.syncedPlayer) {\n this.renderer.lastPausedVideo = this.player;\n this.player.pause();\n }\n\n if(this.syncedPlayer && !this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.add(this);\n\n if(this.syncedPlayer.player && this.syncedPlayer.pausedElements.size === this.syncedPlayer.middlewares.size) {\n this.syncedPlayer.player.pause();\n }\n }\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n\n if(this.player instanceof HTMLVideoElement) {\n this.player.currentTime = this.renderer.lastPausedVideo?.currentTime || this.player.currentTime;\n this.player.play().catch(noop);\n }\n\n if(this.syncedPlayer && this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.delete(this);\n\n if(this.syncedPlayer.pausedElements.size !== this.syncedPlayer.middlewares.size) {\n this.player.play();\n }\n }\n }\n\n public remove() {\n this.clear();\n // this.elements = this.renderer = this.player = undefined;\n }\n\n public get autoplay() {\n return true;\n }\n}\n\ntype CustomEmojiElements = Set;\n\nexport class CustomEmojiRendererElement extends HTMLElement {\n public canvas: HTMLCanvasElement;\n public context: CanvasRenderingContext2D;\n\n public playersSynced: Map;\n public clearedElements: WeakSet;\n public customEmojis: Parameters[1]['customEmojis'];\n public lastPausedVideo: HTMLVideoElement;\n\n public lastRect: DOMRect;\n public isDimensionsSet: boolean;\n\n public animationGroup: AnimationItemGroup;\n public size: MediaSize;\n\n public isSelectable: boolean;\n public isCanvasClean: boolean;\n\n public ignoreSettingDimensions: boolean;\n\n public forceRenderAfterSize: boolean;\n\n public middlewareHelper: MiddlewareHelper;\n\n public auto: boolean;\n\n constructor() {\n super();\n\n this.classList.add('custom-emoji-renderer');\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('custom-emoji-canvas');\n this.context = this.canvas.getContext('2d');\n this.append(this.canvas);\n\n this.playersSynced = new Map();\n this.clearedElements = new WeakSet();\n this.customEmojis = new Map();\n\n this.animationGroup = 'EMOJI';\n this.isCanvasClean = false;\n }\n\n public connectedCallback() {\n if(emojiRenderers.has(this)) {\n return;\n }\n\n // this.setDimensions();\n // animationIntersector.addAnimation(this, this.animationGroup);\n resizeObserver.observe(this.canvas);\n emojiRenderers.add(this);\n\n this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected || !this.auto) {\n return;\n }\n\n this.destroy?.();\n\n this.disconnectedCallback = undefined;\n }\n\n public destroy() {\n // if(this.isConnected) {\n // return;\n // }\n\n resizeObserver.unobserve(this.canvas);\n\n this.customEmojis.forEach((elements) => {\n elements.forEach((element) => {\n element.clear();\n });\n });\n\n emojiRenderers.delete(this);\n this.playersSynced.clear();\n this.middlewareHelper?.clean();\n this.customEmojis.clear();\n\n this.destroy =\n this.lastPausedVideo =\n undefined;\n }\n\n public getOffsets(offsetsMap: Map = new Map()) {\n if(!this.playersSynced.size) {\n return offsetsMap;\n }\n\n const overflowElement = findUpClassName(this, 'scrollable') || this.offsetParent as HTMLElement;\n if(!overflowElement) {\n return offsetsMap;\n }\n\n const overflowRect = overflowElement.getBoundingClientRect();\n const rect = this.getBoundingClientRect();\n\n for(const elements of this.playersSynced.keys()) {\n const elementsArr = Array.from(elements);\n const placeholders = this.isSelectable ? elementsArr.map((element) => element.placeholder) : elementsArr;\n const {visible} = getViewportSlice({\n overflowElement,\n overflowRect,\n elements: placeholders,\n extraSize: this.size.height * 2.5 // let's add some margin\n });\n\n const offsets = visible.map(({rect: elementRect}) => {\n const top = elementRect.top - rect.top;\n const left = elementRect.left - rect.left;\n return {top, left, width: elementRect.width};\n });\n\n if(offsets.length) {\n offsetsMap.set(elements, offsets);\n }\n }\n\n // const rect = this.getBoundingClientRect();\n // const visibleRect = getVisibleRect(this, overflowElement, undefined, rect);\n // const minTop = visibleRect ? visibleRect.rect.top - this.size.height : 0;\n // const maxTop = Infinity;\n // for(const elements of this.playersSynced.keys()) {\n // const offsets = elements.map((element) => {\n // const elementRect = element.getBoundingClientRect();\n // const top = elementRect.top - rect.top;\n // const left = elementRect.left - rect.left;\n // return top >= minTop && (top + elementRect.height) <= maxTop ? {top, left} : undefined;\n // }).filter(Boolean);\n\n // if(offsets.length) {\n // offsetsMap.set(elements, offsets);\n // }\n // }\n\n return offsetsMap;\n }\n\n public clearCanvas() {\n if(this.isCanvasClean) {\n return;\n }\n\n const {context, canvas} = this;\n context.clearRect(0, 0, canvas.width, canvas.height);\n this.isCanvasClean = true;\n }\n\n public render(offsetsMap: ReturnType) {\n const {context, canvas, isDimensionsSet} = this;\n if(!isDimensionsSet) {\n this.setDimensionsFromRect(undefined, false);\n }\n\n this.isCanvasClean = false;\n\n const {width, height, dpr} = canvas;\n for(const [elements, offsets] of offsetsMap) {\n const player = this.playersSynced.get(elements);\n const frame = syncedPlayersFrames.get(player) || (player instanceof HTMLVideoElement ? player : undefined);\n if(!frame) {\n continue;\n }\n\n const isImageData = frame instanceof ImageData;\n let frameWidth: number, frameHeight: number;\n if(player instanceof HTMLVideoElement) {\n frameWidth = this.size.width * dpr;\n frameHeight = this.size.height * dpr;\n } else {\n frameWidth = frame.width;\n frameHeight = frame.height;\n }\n\n // ! check performance of scaling\n const elementWidth = Math.round(offsets[0].width * dpr);\n if(elementWidth !== frameWidth) {\n // if(this.size.width === 36) {\n // console.warn('different width', elementWidth, frameWidth, this);\n // }\n\n frameWidth = elementWidth;\n frameHeight = elementWidth;\n }\n\n const maxTop = height - frameHeight;\n const maxLeft = width - frameWidth;\n\n if(!this.clearedElements.has(elements) && !this.isSelectable) {\n if(this.isSelectable/* && false */) {\n elements.forEach((element) => {\n element.lastChildWas ??= element.lastChild;\n replaceContent(element, element.firstChild);\n });\n } else {\n elements.forEach((element) => {\n element.replaceChildren();\n });\n }\n\n this.clearedElements.add(elements);\n }\n\n offsets.forEach(({top, left}) => {\n top = Math.round(top * dpr), left = Math.round(left * dpr);\n if(left < 0 ||/* top > maxTop || */left > maxLeft) {\n return;\n }\n\n if(isImageData) {\n context.putImageData(frame, left, top);\n } else {\n // context.clearRect(left, top, width, height);\n context.drawImage(frame, left, top, frameWidth, frameHeight);\n }\n });\n }\n }\n\n public checkForAnyFrame() {\n for(const player of this.playersSynced.values()) {\n if(syncedPlayersFrames.has(player) || player instanceof HTMLVideoElement) {\n return true;\n }\n }\n\n return false;\n }\n\n public remove() {\n super.remove();\n // this.canvas.remove();\n }\n\n // public setDimensions() {\n // const {canvas} = this;\n // sequentialDom.mutateElement(canvas, () => {\n // const rect = canvas.getBoundingClientRect();\n // this.setDimensionsFromRect(rect);\n // });\n // }\n\n public setDimensionsFromRect(rect: DOMRect = this.lastRect, forceRenderAfter = true) {\n const {canvas} = this;\n const {dpr} = canvas;\n\n if(this.lastRect !== rect) {\n this.lastRect = rect;\n }\n\n if(!rect || !dpr || this.ignoreSettingDimensions) {\n return;\n }\n\n const {width, height} = rect;\n // if(this.isSelectable) {\n // height = this.parentElement.scrollHeight || height;\n\n // this.style.width = width + 'px';\n // this.style.height = height + 'px';\n // }\n\n const newWidth = Math.floor(Math.round(width * dpr));\n const newHeight = Math.floor(Math.round(height * dpr));\n if(canvas.width === newWidth && canvas.height === newHeight) {\n return;\n }\n\n canvas.width = newWidth;\n canvas.height = newHeight;\n this.isDimensionsSet = true;\n this.isCanvasClean = true;\n\n if(this.forceRenderAfterSize || (this.isSelectable && forceRenderAfter)) {\n this.forceRenderAfterSize = undefined;\n this.forceRender();\n }\n }\n\n public forceRender() {\n if(!this.isDimensionsSet) {\n return;\n }\n\n if(!renderEmojis(new Set([this]))) {\n this.clearCanvas();\n }\n }\n\n public add(\n addCustomEmojis: Parameters[1]['customEmojis'],\n lazyLoadQueue?: LazyLoadQueue | false,\n onlyThumb?: boolean,\n withThumb?: boolean\n ) {\n const renderer = this;\n\n addCustomEmojis.forEach((addElements, docId) => { // prevent adding old elements\n let elements = this.customEmojis.get(docId);\n if(!elements) this.customEmojis.set(docId, elements = new Set());\n else this.clearedElements.delete(elements);\n\n for(const el of addElements) {\n if(elements.has(el)) {\n addElements.delete(el);\n } else {\n el.clean = false;\n el.renderer = renderer;\n el.elements = elements;\n el.middlewareHelper = this.middlewareHelper.get().create();\n elements.add(el);\n\n if(el.lastChildWas && !el.lastChildWas.parentNode) {\n el.append(el.lastChildWas);\n }\n }\n }\n\n if(!addElements.size) {\n addCustomEmojis.delete(docId);\n }\n });\n\n if(!addCustomEmojis.size) {\n return;\n }\n\n const usingOwnQueue = !!(!lazyLoadQueue && lazyLoadQueue !== false && globalLazyLoadQueue);\n\n const docIds = Array.from(addCustomEmojis.keys());\n\n const managers = rootScope.managers;\n const middleware = this.middlewareHelper.get();\n const size = this.size;\n\n const loadPromise = managers.appEmojiManager.getCachedCustomEmojiDocuments(docIds).then((docs) => {\n if(middleware && !middleware()) return;\n\n const loadPromises: Promise[] = [];\n const wrap = (doc: MyDocument, _loadPromises?: Promise[]) => {\n const docId = doc.id;\n const newElements = addCustomEmojis.get(docId);\n const customEmojis = renderer.customEmojis.get(docId);\n const isLottie = doc.sticker === 2;\n const isStatic = doc.mime_type === 'video/webm' && !IS_WEBM_SUPPORTED;\n const willHaveSyncedPlayer = (isLottie || (doc.sticker === 3 && this.isSelectable)) && !onlyThumb && !isStatic;\n\n const loadPromises: Promise[] = [];\n const newElementsArray = Array.from(newElements);\n const promise = wrapSticker({\n div: newElementsArray,\n doc,\n width: size.width,\n height: size.height,\n loop: true,\n play: CUSTOM_EMOJI_INSTANT_PLAY,\n managers,\n isCustomEmoji: true,\n group: 'none',\n loadPromises,\n middleware,\n exportLoad: usingOwnQueue || lazyLoadQueue === false ? 2 : 1, // 2 - export load always, 1 - do not export load if cached static\n needFadeIn: false,\n loadStickerMiddleware: willHaveSyncedPlayer && middleware ? middleware.create().get(() => {\n // if(syncedPlayers.get(key) !== syncedPlayer) {\n // return false;\n // }\n\n // let good = false;\n // for(const middleware of syncedPlayer.middlewares) {\n // if(middleware()) {\n // good = true;\n // break;\n // }\n // }\n\n // return good;\n return !!syncedPlayer.middlewares.size;\n }) : undefined,\n static: isStatic,\n onlyThumb,\n withThumb: withThumb ?? (renderer.clearedElements.has(customEmojis) ? false : undefined),\n syncedVideo: this.isSelectable\n });\n\n if(_loadPromises) {\n promise.then(() => _loadPromises.push(...loadPromises));\n }\n\n const addition: {\n onRender?: (_p: Awaited['render']>) => Promise,\n elements: typeof newElements\n } = {\n elements: newElements\n };\n\n if(doc.sticker === 1 || onlyThumb || isStatic) {\n if(this.isSelectable) {\n addition.onRender = () => Promise.all(loadPromises).then(() => {\n if(middleware && !middleware()) return;\n newElementsArray.forEach((element) => {\n const {placeholder} = element;\n placeholder.src = (element.firstElementChild as HTMLImageElement).src;\n });\n });\n }\n\n return promise.then((res) => ({...res, ...addition}));\n }\n\n // eslint-disable-next-line prefer-const\n addition.onRender = (_p) => Promise.all(loadPromises).then(() => {\n if((middleware && !middleware()) || !doc.animated) {\n return;\n }\n\n const players = Array.isArray(_p) ? _p as HTMLVideoElement[] : [_p as RLottiePlayer];\n const player = Array.isArray(players) ? players[0] : players;\n assumeType(player);\n newElementsArray.forEach((element, idx) => {\n const player = players[idx] || players[0];\n element.player = player;\n\n if(syncedPlayer) {\n element.syncedPlayer = syncedPlayer;\n if(element.paused) {\n element.syncedPlayer.pausedElements.add(element);\n } else if(player.paused) {\n player.play();\n }\n }\n\n if(element.isConnected) {\n animationIntersector.addAnimation(element, element.renderer.animationGroup, undefined, true);\n }\n });\n\n if(player instanceof RLottiePlayer || (player instanceof HTMLVideoElement && this.isSelectable)) {\n syncedPlayer.player = player;\n renderer.playersSynced.set(customEmojis, player);\n }\n\n if(player instanceof RLottiePlayer) {\n player.group = renderer.animationGroup;\n\n player.overrideRender ??= (frame) => {\n syncedPlayersFrames.set(player, frame);\n // frames.set(containers, frame);\n };\n } else if(player instanceof HTMLVideoElement) {\n // player.play();\n\n // const cache = framesCache.getCache(key);\n // let {width, height} = renderer.size;\n // width *= dpr;\n // height *= dpr;\n\n // const onFrame = (frame: ImageBitmap | HTMLCanvasElement) => {\n // topFrames.set(player, frame);\n // player.requestVideoFrameCallback(callback);\n // };\n\n // let frameNo = -1, lastTime = 0;\n // const callback: VideoFrameRequestCallback = (now, metadata) => {\n // const time = player.currentTime;\n // if(lastTime > time) {\n // frameNo = -1;\n // }\n\n // const _frameNo = ++frameNo;\n // lastTime = time;\n // // const frameNo = Math.floor(player.currentTime * 1000 / CUSTOM_EMOJI_FRAME_INTERVAL);\n // // const frameNo = metadata.presentedFrames;\n // const imageBitmap = cache.framesNew.get(_frameNo);\n\n // if(imageBitmap) {\n // onFrame(imageBitmap);\n // } else if(IS_IMAGE_BITMAP_SUPPORTED) {\n // createImageBitmap(player, {resizeWidth: width, resizeHeight: height}).then((imageBitmap) => {\n // cache.framesNew.set(_frameNo, imageBitmap);\n // if(frameNo === _frameNo) onFrame(imageBitmap);\n // });\n // } else {\n // const canvas = document.createElement('canvas');\n // const context = canvas.getContext('2d');\n // canvas.width = width;\n // canvas.height = height;\n // context.drawImage(player, 0, 0);\n // cache.framesNew.set(_frameNo, canvas);\n // onFrame(canvas);\n // }\n // };\n\n // // player.requestVideoFrameCallback(callback);\n // // setInterval(callback, CUSTOM_EMOJI_FRAME_INTERVAL);\n }\n\n if(willHaveSyncedPlayer) {\n const dpr = getLottiePixelRatio(this.size.width, this.size.height);\n renderer.canvas.dpr = dpr;\n setRenderInterval();\n }\n });\n\n let syncedPlayer: SyncedPlayer;\n const key = [docId, size.width, size.height].join('-');\n if(willHaveSyncedPlayer) {\n syncedPlayer = syncedPlayers.get(key);\n if(!syncedPlayer) {\n syncedPlayer = {\n player: undefined,\n middlewares: new Set(),\n pausedElements: new Set(),\n key\n };\n\n syncedPlayers.set(key, syncedPlayer);\n }\n\n for(const element of newElements) {\n const middleware = element.middlewareHelper.get();\n syncedPlayer.middlewares.add(middleware);\n middleware.onClean(() => {\n syncedPlayer.middlewares.delete(middleware);\n\n if(!syncedPlayer.middlewares.size) {\n if(syncedPlayer.player) {\n const frame = syncedPlayersFrames.get(syncedPlayer.player);\n if(frame) {\n (frame as ImageBitmap).close?.();\n syncedPlayersFrames.delete(syncedPlayer.player);\n }\n\n syncedPlayersFrames.delete(syncedPlayer.player);\n if(syncedPlayer.player instanceof RLottiePlayer) {\n syncedPlayer.player.overrideRender = noop;\n syncedPlayer.player.remove();\n } else if(syncedPlayer.player instanceof HTMLVideoElement) {\n const cacheName = framesCache.generateName('' + element.docId, 0, 0, undefined, undefined);\n delete videosCache[cacheName];\n }\n\n syncedPlayer.player = undefined;\n }\n\n if(syncedPlayers.get(syncedPlayer.key) === syncedPlayer && syncedPlayers.delete(syncedPlayer.key) && !syncedPlayers.size) {\n clearRenderInterval();\n }\n }\n });\n }\n }\n\n return promise.then((res) => ({...res, ...addition}));\n };\n\n const missing: DocId[] = [];\n const cachedPromises = docs.map((doc, idx) => {\n if(!doc) {\n missing.push(docIds[idx]);\n return;\n }\n\n return wrap(doc, loadPromises);\n }).filter(Boolean);\n\n const uncachedPromisesPromise = !missing.length ?\n Promise.resolve([] as typeof cachedPromises) :\n managers.appEmojiManager.getCustomEmojiDocuments(missing).then((docs) => {\n if(middleware && !middleware()) return [];\n return docs.filter(Boolean).map((doc) => wrap(doc));\n });\n\n const loadFromPromises = (promises: typeof cachedPromises) => {\n return Promise.all(promises).then((arr) => {\n const promises = arr.map(({load, onRender, elements}) => {\n if(!load) {\n return;\n }\n\n const l = () => load().then(onRender);\n\n if(usingOwnQueue) {\n elements.forEach((element) => {\n globalLazyLoadQueue.push({\n div: element,\n load: () => {\n elements.forEach((element) => {\n globalLazyLoadQueue.delete({div: element});\n });\n\n return l();\n }\n });\n });\n } else {\n return l();\n }\n });\n\n return Promise.all(promises);\n });\n };\n\n const load = () => {\n if(middleware && !middleware()) return;\n const cached = loadFromPromises(cachedPromises);\n const uncached = uncachedPromisesPromise.then((promises) => loadFromPromises(promises));\n return Promise.all([cached, uncached]);\n };\n\n if(lazyLoadQueue) {\n lazyLoadQueue.push({\n div: renderer.canvas,\n load\n });\n } else {\n load();\n }\n\n return Promise.all(cachedPromises).then(() => Promise.all(loadPromises)).then(() => {});\n });\n\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n\n return loadPromise;\n }\n\n public static create(options: CustomEmojiRendererElementOptions) {\n const renderer = new CustomEmojiRendererElement();\n renderer.animationGroup = options.animationGroup;\n renderer.size = options.customEmojiSize || mediaSizes.active.customEmoji;\n renderer.isSelectable = options.isSelectable;\n if(options.wrappingDraft) {\n renderer.contentEditable = 'false';\n renderer.style.height = 'inherit';\n }\n // const middleware = () => !!renderer.disconnectedCallback && (!options.middleware || options.middleware());\n let middleware = options.middleware;\n if(middleware) {\n renderer.middlewareHelper = middleware.create();\n middleware = renderer.middlewareHelper.get();\n middleware.onDestroy(() => {\n renderer.destroy?.();\n });\n } else {\n // console.error('no middleware', this, options);\n renderer.auto = true;\n renderer.middlewareHelper = getMiddleware();\n }\n\n return renderer;\n }\n}\n\ntype CustomEmojiRenderer = CustomEmojiRendererElement;\ntype SyncedPlayer = {\n player: RLottiePlayer | HTMLVideoElement,\n middlewares: Set,\n pausedElements: Set,\n key: string\n};\ntype CustomEmojiFrame = Parameters[0] | HTMLVideoElement;\n\nconst CUSTOM_EMOJI_INSTANT_PLAY = true; // do not wait for animationIntersector\nlet emojiRenderInterval: number;\nconst emojiRenderers: Set = new Set();\nconst syncedPlayers: Map = new Map();\nconst syncedPlayersFrames: Map = new Map();\nexport const renderEmojis = (renderers = emojiRenderers) => {\n const r = Array.from(renderers);\n const t = r.filter((r) => r.isConnected && r.checkForAnyFrame() && !r.ignoreSettingDimensions);\n if(!t.length) {\n return false;\n }\n\n const o = t.map((renderer) => {\n const paused = [...renderer.playersSynced.values()].reduce((acc, v) => acc + +!!v.paused, 0);\n if(renderer.playersSynced.size === paused) {\n return;\n }\n\n const offsets = renderer.getOffsets();\n if(offsets.size) {\n return [renderer, offsets] as const;\n }\n }).filter(Boolean);\n\n for(const [renderer] of o) {\n renderer.clearCanvas();\n }\n\n for(const [renderer, offsets] of o) {\n renderer.render(offsets);\n }\n\n return true;\n};\nconst CUSTOM_EMOJI_FPS = 60;\nconst CUSTOM_EMOJI_FRAME_INTERVAL = 1000 / CUSTOM_EMOJI_FPS;\nconst setRenderInterval = () => {\n if(emojiRenderInterval) {\n return;\n }\n\n emojiRenderInterval = window.setInterval(renderEmojis, CUSTOM_EMOJI_FRAME_INTERVAL);\n renderEmojis();\n};\nconst clearRenderInterval = () => {\n if(!emojiRenderInterval) {\n return;\n }\n\n clearInterval(emojiRenderInterval);\n emojiRenderInterval = undefined;\n};\n\n(window as any).syncedPlayers = syncedPlayers;\n(window as any).emojiRenderers = emojiRenderers;\n\ncustomElements.define('custom-emoji-element', CustomEmojiElement);\ncustomElements.define('custom-emoji-renderer-element', CustomEmojiRendererElement);\n\ntype CustomEmojiRendererElementOptions = Partial<{\n loadPromises: Promise[],\n customEmojiRenderer: CustomEmojiRendererElement,\n\n isSelectable: boolean,\n wrappingDraft: boolean\n}> & WrapSomethingOptions;\n\n/**\n * * Expecting correctly sorted nested entities (RichTextProcessor.sortEntities)\n */\nexport default function wrapRichText(text: string, options: Partial<{\n entities: MessageEntity[],\n contextSite: string,\n highlightUsername: string,\n noLinks: boolean,\n noLinebreaks: boolean,\n noCommands: boolean,\n wrappingDraft: boolean,\n // mustWrapEmoji: boolean,\n fromBot: boolean,\n noTextFormat: boolean,\n passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }>,\n noEncoding: boolean,\n isSelectable: boolean,\n\n contextHashtag?: string,\n\n // ! recursive, do not provide\n nasty?: {\n i: number,\n usedLength: number,\n text: string,\n lastEntity?: MessageEntity\n },\n voodoo?: boolean,\n customEmojis?: Map,\n customWraps?: Set,\n}> & CustomEmojiRendererElementOptions = {}) {\n const fragment = document.createDocumentFragment();\n if(!text) {\n return fragment;\n }\n\n const nasty = options.nasty ??= {\n i: 0,\n usedLength: 0,\n text\n };\n\n const wrapSomething = (wrapElement: HTMLElement, noFiller?: boolean) => {\n const element = document.createElement('span');\n // element.append(BOM, a, BOM);\n if(options.wrappingDraft) {\n element.contentEditable = 'false';\n }\n // element.style.display = 'inline-block';\n element.classList.add('input-something');\n element.append(/* BOM, */wrapElement);\n\n (lastElement || fragment).append(element);\n\n wrapElement.classList.add('input-selectable');\n // if(wrapElement instanceof HTMLImageElement) {\n // element.prepend(f());\n // } else {\n !noFiller && wrapElement.append(createCustomFiller(true));\n // }\n\n customWraps.add(element);\n\n return element;\n };\n\n options.isSelectable ||= options.wrappingDraft;\n\n const customEmojis = options.customEmojis ??= new Map() as Map;\n const customWraps = options.customWraps ??= new Set();\n\n const entities = options.entities ??= parseEntities(nasty.text);\n\n const passEntities = options.passEntities ??= {};\n const contextSite = options.contextSite ??= 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const textLength = nasty.text.length;\n const length = entities.length;\n let lastElement: HTMLElement | DocumentFragment;\n for(; nasty.i < length; ++nasty.i) {\n let entity = entities[nasty.i];\n\n // * check whether text was sliced\n // TODO: consider about moving it to other function\n if(entity.offset >= textLength) {\n if(entity._ !== 'messageEntityCaret') { // * can set caret to the end\n continue;\n }\n } else if((entity.offset + entity.length) > textLength) {\n entity = copy(entity);\n // entity.length = entity.offset + entity.length - textLength;\n entity.length = textLength - entity.offset;\n }\n\n if(entity.length) {\n nasty.lastEntity = entity;\n }\n\n let nextEntity = entities[nasty.i + 1];\n\n const startOffset = entity.offset;\n const endOffset = startOffset + entity.length;\n const endPartOffset = Math.min(endOffset, nextEntity?.offset ?? 0xFFFF);\n const fullEntityText = nasty.text.slice(startOffset, endOffset);\n const sliced = nasty.text.slice(startOffset, endPartOffset);\n let partText = sliced;\n\n if(nasty.usedLength < startOffset) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength, startOffset));\n }\n\n if(lastElement) {\n lastElement = fragment;\n }\n\n nasty.usedLength = endPartOffset;\n\n let element: HTMLElement,\n property: 'textContent' | 'alt' = 'textContent',\n usedText = false;\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontWeight = 'bold';\n element.style.fontFamily = 'markup-bold';\n } else {\n element = document.createElement('strong');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontStyle = 'italic';\n element.style.fontFamily = 'markup-italic';\n } else {\n element = document.createElement('em');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: line-through;`;\n element.style.fontFamily = 'markup-strikethrough';\n } else/* if(!options.noTextFormat) */ {\n element = document.createElement('del');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: underline;`;\n element.style.fontFamily = 'markup-underline';\n } else if(!options.noTextFormat) {\n element = document.createElement('u');\n }\n\n break;\n }\n\n case 'messageEntityPre':\n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n element.style.fontFamily = 'markup-monospace';\n } else if(!options.noTextFormat) {\n element = document.createElement('code');\n }\n\n break;\n }\n\n // case 'messageEntityPre': {\n // if(options.wrappingDraft) {\n // element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n // } else if(!options.noTextFormat) {\n // element = document.createElement('pre');\n // const inner = document.createElement('code');\n // if(entity.language) {\n // inner.className = 'language-' + entity.language;\n // inner.textContent = entityText;\n // usedText = true;\n // }\n // }\n\n // break;\n // }\n\n case 'messageEntityHighlight': {\n element = document.createElement('i');\n element.className = 'text-highlight';\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n let command = fullEntityText.slice(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.slice(atPos + 1);\n command = command.slice(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('tg://bot_command?command=' + encodeURIComponent(command) + (bot ? '&bot=' + encodeURIComponent(bot) : ''));\n if(!contextExternal) {\n element.setAttribute('onclick', 'execBotCommand(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityCustomEmoji': {\n if(!IS_CUSTOM_EMOJI_SUPPORTED) {\n break;\n }\n\n while(nextEntity?._ === 'messageEntityEmoji' && nextEntity.offset < endOffset) {\n ++nasty.i;\n nasty.lastEntity = nextEntity;\n nasty.usedLength += nextEntity.length;\n nextEntity = entities[nasty.i + 1];\n }\n\n const customEmojiElement = element = CustomEmojiElement.create(entity.document_id);\n const {docId} = customEmojiElement;\n let set = customEmojis.get(docId);\n if(!set) customEmojis.set(docId, set = new Set());\n set.add(customEmojiElement);\n customEmojiElement.dataset.stickerEmoji = fullEntityText;\n\n if(options.wrappingDraft) {\n element = document.createElement('img');\n (element as HTMLImageElement).alt = fullEntityText;\n for(const i in customEmojiElement.dataset) {\n element.dataset[i] = customEmojiElement.dataset[i];\n }\n (element as any).customEmojiElement = customEmojiElement;\n customEmojiElement.placeholder = element as HTMLImageElement;\n element.classList.add('custom-emoji-placeholder');\n (element as HTMLImageElement).src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAAtJREFUGFdjYAACAAAFAAGq1chRAAAAAElFTkSuQmCC';\n property = 'alt';\n break;\n }\n\n if(options.isSelectable) {\n // const s = document.createElement('span');\n // s.append(fullEntityText);\n // element.append(s);\n // element.textContent = fullEntityText;\n // element.textContent = 'a';\n // element.contentEditable = 'false';\n\n // const x = f();\n // x.style.display = 'inline-block';\n // x.contentEditable = 'false';\n // (lastElement || fragment).append(BOM);\n // (lastElement || fragment).append(x);\n\n element = wrapSomething(element, !!options.customEmojiRenderer);\n\n // const a = element;\n // element = document.createElement('span');\n // element.append(BOM, a, BOM);\n // element.contentEditable = 'false';\n }\n\n property = 'alt';\n break;\n }\n\n case 'messageEntityEmoji': {\n let isSupported = IS_EMOJI_SUPPORTED;\n if(isSupported) {\n for(const version in EmojiVersions) {\n if(version) {\n const emojiData = EmojiVersions[version as EMOJI_VERSION];\n if(emojiData.hasOwnProperty(entity.unicode) && !EMOJI_VERSIONS_SUPPORTED[version as EMOJI_VERSION]) {\n isSupported = false;\n break;\n }\n }\n }\n }\n\n // if(!(options.wrappingDraft && isSupported)) { // * fix safari emoji\n if(!isSupported) { // no wrapping needed\n // if(isSupported) { // ! contenteditable=\"false\" нужен для поля ввода, иначе там будет меняться шрифт в Safari, или же рендерить смайлик напрямую, без контейнера\n // insertPart(entity, '', '');\n // } else {\n element = document.createElement('img');\n (element as HTMLImageElement).src = `assets/img/emoji/${entity.unicode}.png`;\n property = 'alt';\n element.className = 'emoji';\n\n // if(options.isSelectable) {\n // usedText = true;\n // (element as HTMLImageElement).alt = partText;\n // element = wrapSomething(element);\n // }\n\n // const a = element;\n // a.contentEditable = 'false';\n // element = document.createElement('span');\n // element.append(a);\n // element.contentEditable = 'false';\n // }\n // } else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n element = document.createElement('span');\n element.className = 'emoji';\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '', '');\n } */\n /* if(!isSupported) {\n insertPart(entity, `\"`,`);\n } */\n\n break;\n }\n\n case 'messageEntityCaret': {\n element = document.createElement('span');\n element.className = 'composer-sel';\n break;\n }\n\n // case 'messageEntityLinebreak': {\n // if(options.noLinebreaks) {\n // insertPart(entity, ' ');\n // } else {\n // insertPart(entity, '
');\n // }\n\n // break;\n // }\n\n case 'messageEntityUrl':\n case 'messageEntityTextUrl': {\n if(!(options.noLinks && !passEntities[entity._])) {\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || fullEntityText;\n let masked = false;\n let onclick: string;\n\n const wrapped = wrapUrl(url, true);\n url = wrapped.url;\n onclick = wrapped.onclick;\n\n if(entity._ === 'messageEntityTextUrl') {\n if(nextEntity?._ === 'messageEntityUrl' &&\n nextEntity.length === entity.length &&\n nextEntity.offset === entity.offset) {\n nasty.lastEntity = nextEntity;\n ++nasty.i;\n }\n\n if(url !== fullEntityText) {\n masked = true;\n }\n } else {\n // inner = encodeEntities(replaceUrlEncodings(entityText));\n }\n\n const currentContext = !!onclick;\n if(!onclick && masked && !currentContext) {\n onclick = 'showMaskedAlert';\n }\n\n if(options.wrappingDraft) {\n onclick = undefined;\n }\n\n const href = (currentContext || typeof electronHelpers === 'undefined') ?\n url :\n `javascript:electronHelpers.openExternal('${url}');`;\n\n element = document.createElement('a');\n element.className = 'anchor-url';\n (element as HTMLAnchorElement).href = href;\n\n if(!(currentContext || typeof electronHelpers !== 'undefined')) {\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n if(onclick) {\n element.setAttribute('onclick', onclick + '(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('mailto:' + fullEntityText);\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n break;\n }\n\n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && SITE_HASHTAGS[contextSite];\n if(contextUrl) {\n const hashtag = fullEntityText.slice(1);\n element = document.createElement('a');\n element.className = 'anchor-hashtag';\n (element as HTMLAnchorElement).href = contextUrl.replace('{1}', encodeURIComponent(hashtag));\n if(contextExternal) {\n setBlankToAnchor(element as HTMLAnchorElement);\n } else {\n element.setAttribute('onclick', 'searchByHashtag(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = buildURLHash('' + entity.user_id);\n element.className = 'follow';\n element.dataset.follow = '' + entity.user_id;\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const username = fullEntityText.slice(1);\n\n element = wrapTelegramUrlToAnchor('t.me/' + username);\n element.className = 'mention';\n\n // insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const encoded = encodeSpoiler(nasty.text, entity);\n nasty.text = encoded.text;\n partText = encoded.entityText;\n if(endPartOffset !== endOffset) {\n nasty.usedLength += endOffset - endPartOffset;\n }\n let n: MessageEntity;\n for(; n = entities[nasty.i + 1], n && n.offset < endOffset;) {\n // nasty.usedLength += n.length;\n ++nasty.i;\n nasty.lastEntity = n;\n nextEntity = entities[nasty.i + 1];\n }\n } else if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontFamily = 'spoiler';\n element.style.fontFamily = 'markup-spoiler';\n } else {\n const container = document.createElement('span');\n container.className = 'spoiler';\n element = document.createElement('span');\n element.className = 'spoiler-text';\n element.textContent = partText;\n usedText = true;\n container.append(element);\n fragment.append(container);\n\n container[`on${CLICK_EVENT_NAME}`] = (window as any).onSpoilerClick;\n }\n\n break;\n }\n }\n\n if(!usedText && partText) {\n if(element) {\n // @ts-ignore\n element[property] = partText;\n } else {\n (element || fragment).append(partText);\n }\n }\n\n if(element && !element.parentNode) {\n (lastElement || fragment).append(element);\n }\n\n while(nextEntity && nextEntity.offset < endOffset) {\n ++nasty.i;\n\n (element || fragment).append(wrapRichText(nasty.text, {\n ...options,\n voodoo: true\n }));\n\n nextEntity = entities[nasty.i + 1];\n }\n\n // if(!element?.parentNode) {\n // (lastElement || fragment).append(element ?? partText);\n // }\n\n if(nasty.usedLength <= endOffset) {\n if(nasty.usedLength < endOffset) {\n (element || fragment).append(nasty.text.slice(nasty.usedLength, endOffset));\n nasty.usedLength = endOffset;\n }\n\n lastElement = fragment;\n nasty.lastEntity = undefined;\n } else if(entity.length > partText.length && element) {\n lastElement = element;\n } else {\n lastElement = fragment;\n }\n\n if(options.voodoo) {\n return fragment;\n }\n }\n\n if(nasty.lastEntity) {\n nasty.usedLength = nasty.lastEntity.offset + nasty.lastEntity.length;\n }\n\n if(nasty.usedLength < textLength) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength));\n }\n\n if((!options.wrappingDraft || options.customEmojiRenderer) && customEmojis.size) {\n let renderer = options.customEmojiRenderer;\n if(!renderer) {\n renderer = CustomEmojiRendererElement.create(options);\n fragment.prepend(renderer);\n }\n\n const loadPromise = renderer.add(customEmojis, options.lazyLoadQueue, options.wrappingDraft);\n options.loadPromises?.push(loadPromise);\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n }\n\n if(customWraps.size) {\n insertCustomFillers(customWraps);\n }\n\n return fragment;\n}\n\nexport const createCustomFiller = (notFiller?: boolean) => {\n const x = document.createElement('span');\n x.classList.add(notFiller ? 'input-filler2' : 'input-filler');\n x.textContent = BOM;\n return x;\n};\n\nexport function isCustomFillerNeededBySiblingNode(node: ChildNode) {\n if(\n // !node?.textContent ||\n // node.textContent.endsWith('\\n') ||\n node?.textContent !== BOM ||\n (node as HTMLElement)?.getAttribute?.('contenteditable') === 'false'\n ) {\n // if(!node || (node as HTMLElement).firstElementChild || node.textContent.endsWith('\\n')) {\n if(!node || node.textContent !== BOM || (node as HTMLElement).firstElementChild) {\n return 2;\n } else if(node.nodeType === node.ELEMENT_NODE) {\n return 1;\n }/* else if(node.nodeType === node.TEXT_NODE && !node.nodeValue) {\n (node as CharacterData).insertData(0, BOM);\n } */\n }\n\n return 0;\n}\n\nexport function insertCustomFillers(elements: Iterable) {\n const check = (element: HTMLElement, node: ChildNode, method: 'before' | 'after') => {\n const needed = isCustomFillerNeededBySiblingNode(node);\n if(needed === 2) {\n element[method](createCustomFiller());\n } else if(needed === 1) {\n node.appendChild(document.createTextNode(BOM));\n }\n };\n\n for(const element of elements) {\n const {previousSibling, nextSibling} = element;\n check(element, previousSibling, 'before');\n check(element, nextSibling, 'after');\n }\n}\n\n(window as any).wrapRichText = wrapRichText;\n","// just for the future\nexport default function buildURLHash(str: string) {\n return '#' + encodeURIComponent(str);\n}\n","import wrapUrl from './wrapUrl';\n\nexport default function wrapTelegramUrlToAnchor(url1: string) {\n const {url, onclick} = wrapUrl(url1);\n const element = document.createElement('a');\n (element as HTMLAnchorElement).href = url;\n if(onclick) {\n element.setAttribute('onclick', `${onclick}(this)`);\n }\n\n return element;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport EventListenerBase from '../../helpers/eventListenerBase';\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => void,\n loaded: (reqId: number, frameCount: number, fps: number) => void,\n error: (reqId: number, error: Error) => void,\n workerError: (error: ErrorEvent) => void\n}> {\n constructor(private worker: Worker) {\n super();\n\n this.worker.onerror = (error) => {\n try {\n this.dispatchEvent('workerError', error);\n this.cleanup();\n this.terminate();\n } catch(err) {\n\n }\n };\n\n this.worker.onmessage = (event) => {\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(args: any[], transfer?: Transferable[]) {\n this.worker.postMessage({\n queryMethod: args.shift(),\n queryMethodArguments: args\n }, CAN_USE_TRANSFERABLES ? transfer: undefined);\n }\n}\n","const IS_WEB_ASSEMBLY_SUPPORTED = typeof(WebAssembly) !== 'undefined';\n\nexport default IS_WEB_ASSEMBLY_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport pause from '../../helpers/schedulers/pause';\nimport {logger, LogTypes} from '../logger';\nimport RLottiePlayer, {RLottieOptions} from './rlottiePlayer';\nimport QueryableWorker from './queryableWorker';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport IS_WEB_ASSEMBLY_SUPPORTED from '../../environment/webAssemblySupport';\nimport makeError from '../../helpers/makeError';\nimport App from '../../config/app';\n\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' |\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' |\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' |\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' |\n 'voice_outlined2' | 'voip_filled' | 'voice_mini' | 'jolly_roger';\n\nexport class LottieLoader {\n private loadPromise: Promise = !IS_WEB_ASSEMBLY_SUPPORTED ? Promise.reject() : undefined;\n private loaded = false;\n\n private workersLimit = App.threads;\n private players: {[reqId: number]: RLottiePlayer} = {};\n private playersByCacheName: {[cacheName: string]: Set} = {};\n\n private workers: QueryableWorker[] = [];\n private curWorkerNum = 0;\n\n private log = logger('LOTTIE', LogTypes.Error);\n\n public getAnimation(element: HTMLElement) {\n for(const i in this.players) {\n if(this.players[i].el.includes(element)) {\n return this.players[i];\n }\n }\n\n return null;\n }\n\n public setLoop(loop: boolean) {\n let changed = false;\n for(const i in this.players) {\n const player = this.players[i];\n if(player._loop && player.loop !== loop) {\n changed = true;\n player.loop = loop;\n\n // if(player._autoplay && player.autoplay !== player._autoplay) {\n player.autoplay = player._autoplay;\n // }\n }\n }\n\n return changed;\n }\n\n public loadLottieWorkers() {\n if(this.loadPromise) {\n return this.loadPromise;\n }\n\n return this.loadPromise = new Promise((resolve, reject) => {\n let remain = this.workersLimit;\n for(let i = 0; i < this.workersLimit; ++i) {\n const worker = new Worker(new URL('./rlottie.worker.ts', import.meta.url));\n const queryableWorker = this.workers[i] = new QueryableWorker(worker);\n\n queryableWorker.addEventListener('ready', () => {\n this.log('worker #' + i + ' ready');\n\n queryableWorker.addEventListener('frame', this.onFrame);\n queryableWorker.addEventListener('loaded', this.onPlayerLoaded);\n queryableWorker.addEventListener('error', this.onPlayerError);\n\n --remain;\n if(!remain) {\n this.log('workers ready');\n resolve();\n this.loaded = true;\n }\n }, {once: true});\n\n queryableWorker.addEventListener('workerError', (error) => {\n reject('rlottie load error: ' + error.message);\n this.loaded = false;\n }, {once: true});\n }\n });\n }\n\n private makeAssetUrl(name: LottieAssetName) {\n return 'assets/tgs/' + name + '.json';\n }\n\n public loadAnimationAsAsset(params: Omit, name: LottieAssetName) {\n // (params as RLottieOptions).name = name;\n return this.loadAnimationFromURL(params, this.makeAssetUrl(name));\n }\n\n public loadAnimationDataFromURL(url: string): Promise {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return this.loadPromise as any;\n }\n\n this.loadLottieWorkers();\n\n return fetch(url)\n .then((res) => {\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\n return res.arrayBuffer()\n .then((data) => apiManagerProxy.invokeCrypto('gzipUncompress', data))\n .then((arr) => blobConstruct(arr as Uint8Array, ''));\n } else {\n return res.blob();\n }\n });\n /* .then((str) => {\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\n }) */\n }\n\n public loadAnimationFromURLManually(name: LottieAssetName) {\n const url = this.makeAssetUrl(name);\n return this.loadAnimationDataFromURL(url).then((blob) => {\n return (params: Omit) => this.loadAnimationFromURLNext(blob, params, url);\n });\n }\n\n public loadAnimationFromURL(params: Omit, url: string) {\n return this.loadAnimationDataFromURL(url).then((blob) => {\n return this.loadAnimationFromURLNext(blob, params, url);\n });\n }\n\n public loadAnimationFromURLNext(blob: Blob, params: Omit, url: string) {\n const newParams = Object.assign(params, {animationData: blob, needUpscale: true});\n newParams.name ||= url;\n return this.loadAnimationWorker(newParams);\n }\n\n public waitForFirstFrame(player: RLottiePlayer) {\n return Promise.race([\n /* new Promise((resolve) => {\n player.addEventListener('firstFrame', () => {\n setTimeout(() => resolve(), 1500);\n }, true);\n }) */\n new Promise((resolve) => {\n player.addEventListener('firstFrame', resolve, {once: true});\n }),\n pause(2500)\n ]).then(() => player);\n }\n\n public async loadAnimationWorker(params: RLottieOptions): Promise {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return this.loadPromise as any;\n }\n\n if(!this.loaded) {\n await this.loadLottieWorkers();\n }\n\n const {middleware, group = ''} = params;\n if(middleware && !middleware()) {\n throw makeError('MIDDLEWARE');\n }\n\n if(params.sync) {\n const cacheName = RLottiePlayer.CACHE.generateName(params.name, params.width, params.height, params.color, params.toneIndex);\n const players = this.playersByCacheName[cacheName];\n if(players?.size) {\n return Promise.resolve(players.entries().next().value[0]);\n }\n }\n\n const containers = Array.isArray(params.container) ? params.container : [params.container];\n if(!params.width || !params.height) {\n params.width = parseInt(containers[0].style.width);\n params.height = parseInt(containers[0].style.height);\n }\n\n if(!params.width || !params.height) {\n throw new Error('No size for sticker!');\n }\n\n params.group = group;\n\n const player = this.initPlayer(containers, params);\n\n animationIntersector.addAnimation(player, group, undefined, middleware);\n\n return player;\n }\n\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\n const player = this.players[reqId];\n if(!player) {\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\n return;\n }\n\n this.log.debug('onPlayerLoaded');\n player.onLoad(frameCount, fps);\n };\n\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => {\n const player = this.players[reqId];\n if(!player) {\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\n return;\n }\n\n if(player.clamped !== undefined && frame instanceof Uint8ClampedArray) {\n player.clamped = frame;\n }\n\n player.renderFrame(frame, frameNo);\n };\n\n private onPlayerError = (reqId: number, error: Error) => {\n const player = this.players[reqId];\n if(!player) {\n return;\n }\n\n // ! will need refactoring later, this is not the best way to remove the animation\n const animations = animationIntersector.getAnimations(player.el[0]);\n animations.forEach((animation) => {\n animationIntersector.removeAnimation(animation);\n });\n };\n\n public onDestroy(reqId: number) {\n delete this.players[reqId];\n }\n\n public destroyWorkers() {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return;\n }\n\n this.workers.forEach((worker, idx) => {\n worker.terminate();\n this.log('worker #' + idx + ' terminated');\n });\n\n this.log('workers destroyed');\n this.workers.length = 0;\n this.curWorkerNum = 0;\n this.loaded = false;\n this.loadPromise = undefined;\n }\n\n private initPlayer(el: RLottiePlayer['el'], options: RLottieOptions) {\n const player = new RLottiePlayer({\n el,\n worker: this.workers[this.curWorkerNum++],\n options\n });\n\n const {reqId, cacheName} = player;\n this.players[reqId] = player;\n\n const playersByCacheName = cacheName ? this.playersByCacheName[cacheName] ??= new Set() : undefined;\n if(cacheName) {\n playersByCacheName.add(player);\n }\n\n if(this.curWorkerNum >= this.workers.length) {\n this.curWorkerNum = 0;\n }\n\n player.addEventListener('destroy', () => {\n this.onDestroy(reqId);\n if(playersByCacheName.delete(player) && !playersByCacheName.size) {\n delete this.playersByCacheName[cacheName];\n }\n });\n\n player.loadFromData(options.animationData);\n\n return player;\n }\n}\n\nconst lottieLoader = new LottieLoader();\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\nexport default lottieLoader;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AnimationItemGroup, AnimationItemWrapper} from '../../components/animationIntersector';\nimport type {Middleware} from '../../helpers/middleware';\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport IS_APPLE_MX from '../../environment/appleMx';\nimport {IS_ANDROID, IS_APPLE_MOBILE, IS_APPLE, IS_SAFARI} from '../../environment/userAgent';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport clamp from '../../helpers/number/clamp';\nimport QueryableWorker from './queryableWorker';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\nimport framesCache, {FramesCache, FramesCacheItem} from '../../helpers/framesCache';\n\nexport type RLottieOptions = {\n container: HTMLElement | HTMLElement[],\n middleware?: Middleware,\n canvas?: HTMLCanvasElement,\n autoplay?: boolean,\n animationData: Blob,\n loop?: RLottiePlayer['loop'],\n width?: number,\n height?: number,\n group?: AnimationItemGroup,\n noCache?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n initFrame?: number, // index\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n name?: string,\n skipFirstFrameRendering?: boolean,\n toneIndex?: number,\n sync?: boolean\n};\n\nexport type RLottieColor = [number, number, number];\n\nexport function getLottiePixelRatio(width: number, height: number, needUpscale?: boolean) {\n let pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1 && !needUpscale) {\n if(width > 90 && height > 90) {\n if(!IS_APPLE && mediaSizes.isMobile) {\n pixelRatio = 1;\n }\n } else if((width > 60 && height > 60) || IS_ANDROID) {\n pixelRatio = Math.max(1.5, pixelRatio - 1.5);\n }\n }\n\n return pixelRatio;\n}\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void,\n destroy: () => void\n}> implements AnimationItemWrapper {\n public static CACHE = framesCache;\n private static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n private frameCount: number;\n private fps: number;\n private skipDelta: number;\n public name: string;\n public cacheName: string;\n private toneIndex: number;\n\n private worker: QueryableWorker;\n\n private width = 0;\n private height = 0;\n\n public el: HTMLElement[];\n public canvas: HTMLCanvasElement[];\n private contexts: CanvasRenderingContext2D[];\n\n public paused = true;\n // public paused = false;\n public direction = 1;\n private speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop: number | boolean = true;\n public _loop: RLottiePlayer['loop']; // ! will be used to store original value for settings.stickers.loop\n public group: AnimationItemGroup = '';\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n // private caching = false;\n // private removed = false;\n\n private cache: FramesCacheItem;\n private imageData: ImageData;\n public clamped: Uint8ClampedArray;\n private cachingDelta = 0;\n\n private initFrame: number;\n private color: RLottieColor;\n private inverseColor: RLottieColor;\n\n public minFrame: number;\n public maxFrame: number;\n\n private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: (currentFrame: number) => void;\n private skipFirstFrameRendering: boolean;\n private playToFrameOnFrameCallback: (frameNo: number) => void;\n\n public overrideRender: (frame: ImageData | HTMLCanvasElement | ImageBitmap) => void;\n private renderedFirstFrame: boolean;\n\n private raw: boolean;\n\n constructor({el, worker, options}: {\n el: RLottiePlayer['el'],\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(const i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // ! :(\n this.initFrame = options.initFrame;\n this.color = options.color;\n this.inverseColor = options.inverseColor;\n this.name = options.name;\n this.skipFirstFrameRendering = options.skipFirstFrameRendering;\n this.toneIndex = options.toneIndex;\n this.raw = this.color !== undefined;\n\n if(this.name) {\n this.cacheName = RLottiePlayer.CACHE.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n }\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((IS_ANDROID || IS_APPLE_MOBILE || (IS_APPLE && !IS_SAFARI && !IS_APPLE_MX)) && this.width < 100 && this.height < 100 && !options.needUpscale) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n // options.needUpscale = true;\n\n // * Pixel ratio\n const pixelRatio = getLottiePixelRatio(this.width, this.height, options.needUpscale);\n\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n\n // options.noCache = true;\n\n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(IS_APPLE && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; // 2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n\n // this.cachingDelta = Infinity;\n // this.cachingDelta = 0;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n if(!this.canvas) {\n this.canvas = this.el.map(() => {\n const canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = this.width;\n canvas.height = this.height;\n canvas.dpr = pixelRatio;\n return canvas;\n });\n }\n\n this.contexts = this.canvas.map((canvas) => canvas.getContext('2d'));\n\n if(!IS_IMAGE_BITMAP_SUPPORTED || this.raw) {\n this.imageData = new ImageData(this.width, this.height);\n\n if(CAN_USE_TRANSFERABLES) {\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n }\n\n if(this.name) {\n this.cache = RLottiePlayer.CACHE.getCache(this.cacheName);\n } else {\n this.cache = FramesCache.createCache();\n }\n }\n\n public clearCache() {\n if(this.cachingDelta === Infinity) {\n return;\n }\n\n if(this.cacheName && this.cache.counter > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n\n this.cache.clearCache();\n }\n\n public sendQuery(args: any[], transfer?: Transferable[]) {\n this.worker.sendQuery([args.shift(), this.reqId, ...args], transfer);\n }\n\n public loadFromData(data: RLottieOptions['animationData']) {\n this.sendQuery(['loadFromData', data, this.width, this.height, this.toneIndex, this.color !== undefined/* , this.canvas.transferControlToOffscreen() */]);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n this.rafId = undefined;\n }\n // window.cancelAnimationFrame(this.rafId);\n }\n\n private resetCurrentFrame() {\n return this.curFrame = this.initFrame ?? (this.direction === 1 ? this.minFrame : this.maxFrame);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n const curFrame = this.resetCurrentFrame();\n if(renderFirstFrame) {\n this.requestFrame(curFrame);\n // this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public setSpeed(speed: number) {\n if(this.speed === speed) {\n return;\n }\n\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n if(this.direction === direction) {\n return;\n }\n\n this.direction = direction;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n this.pause();\n this.sendQuery(['destroy']);\n if(this.cacheName) RLottiePlayer.CACHE.releaseCache(this.cacheName);\n this.dispatchEvent('destroy');\n this.cleanup();\n }\n\n private applyColor(frame: Uint8ClampedArray) {\n const [r, g, b] = this.color;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] !== 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n }\n }\n }\n\n private applyInversing(frame: Uint8ClampedArray) {\n const [r, g, b] = this.inverseColor;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] === 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n frame[i + 3] = 255;\n } else {\n frame[i + 3] = 0;\n }\n }\n }\n\n public renderFrame2(frame: Uint8ClampedArray | HTMLCanvasElement | ImageBitmap, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(frame instanceof Uint8ClampedArray) {\n if(this.color) {\n this.applyColor(frame);\n }\n\n if(this.inverseColor) {\n this.applyInversing(frame);\n }\n\n this.imageData.data.set(frame);\n }\n\n // this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n this.contexts.forEach((context, idx) => {\n let cachedSource: HTMLCanvasElement | ImageBitmap = this.cache.framesNew.get(frameNo);\n if(!(frame instanceof Uint8ClampedArray)) {\n cachedSource = frame;\n } else if(idx > 0) {\n cachedSource = this.canvas[0];\n }\n\n if(!cachedSource) {\n // console.log('drawing from data');\n const c = document.createElement('canvas');\n c.width = context.canvas.width;\n c.height = context.canvas.height;\n c.getContext('2d').putImageData(this.imageData, 0, 0);\n this.cache.framesNew.set(frameNo, c);\n cachedSource = c;\n }\n\n if(this.overrideRender && this.renderedFirstFrame) {\n this.overrideRender(cachedSource || this.imageData);\n } else if(cachedSource) {\n // console.log('drawing from canvas');\n context.clearRect(0, 0, cachedSource.width, cachedSource.height);\n context.drawImage(cachedSource, 0, 0);\n } else {\n context.putImageData(this.imageData, 0, 0);\n }\n\n if(!this.renderedFirstFrame) {\n this.renderedFirstFrame = true;\n }\n });\n\n this.dispatchEvent('enterFrame', frameNo);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n }\n }\n\n public renderFrame(frame: Parameters[0], frameNo: number) {\n const canCacheFrame = this.cachingDelta && (frameNo % this.cachingDelta || !frameNo);\n if(canCacheFrame) {\n if(frame instanceof Uint8ClampedArray && !this.cache.frames.has(frameNo)) {\n this.cache.frames.set(frameNo, new Uint8ClampedArray(frame));// frame;\n } else if(IS_IMAGE_BITMAP_SUPPORTED && frame instanceof ImageBitmap && !this.cache.framesNew.has(frameNo)) {\n this.cache.framesNew.set(frameNo, frame);\n }\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n\n if(delta < 0) {\n const timeout = this.frInterval > -delta ? -delta % this.frInterval : this.frInterval;\n if(this.rafId) clearTimeout(this.rafId);\n this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, timeout);\n // await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n return;\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.cache.frames.get(frameNo);\n const frameNew = this.cache.framesNew.get(frameNo);\n if(frameNew) {\n this.renderFrame(frameNew, frameNo);\n } else if(frame) {\n this.renderFrame(frame, frameNo);\n } else {\n if(this.clamped && !this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n\n this.sendQuery(['renderFrame', frameNo], this.clamped ? [this.clamped.buffer] : undefined);\n }\n }\n\n private onLap() {\n if(++this.playedTimes === this.loop) {\n this.loop = false;\n }\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n\n return true;\n }\n\n private mainLoopForwards() {\n const {skipDelta, maxFrame} = this;\n const frame = (this.curFrame + skipDelta) > maxFrame ? this.curFrame = (this.loop ? this.minFrame : this.maxFrame) : this.curFrame += skipDelta;\n // console.log('mainLoopForwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + skipDelta) > maxFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n private mainLoopBackwards() {\n const {skipDelta, minFrame} = this;\n const frame = (this.curFrame - skipDelta) < minFrame ? this.curFrame = (this.loop ? this.maxFrame : this.minFrame) : this.curFrame -= skipDelta;\n // console.log('mainLoopBackwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - skipDelta) < minFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n public setMainLoop() {\n // window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n this.rafId = undefined;\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n // console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n // this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n // setTimeout(() => {\n // this.addListener('enterFrame', this.frameListener);\n // }, 0);\n\n if(this.frameListener) {\n const lastResult = this.listenerResults.enterFrame;\n if(lastResult !== undefined) {\n this.frameListener(this.curFrame);\n }\n }\n\n // this.mainLoop(method);\n // this.r(method);\n // method();\n }\n\n public playPart(options: {\n from: number,\n to: number,\n callback?: () => void\n }) {\n this.pause();\n\n const {from, to, callback} = options;\n this.curFrame = from - 1;\n\n return this.playToFrame({\n frame: to,\n direction: to > from ? 1 : -1,\n callback\n });\n }\n\n public playToFrame(options: {\n frame: number,\n speed?: number,\n direction?: number,\n callback?: () => void\n }) {\n this.pause();\n\n const {frame, speed, callback, direction} = options;\n this.setDirection(direction === undefined ? this.curFrame > frame ? -1 : 1 : direction);\n speed !== undefined && this.setSpeed(speed);\n\n const bounds = [this.curFrame, frame];\n if(this.direction === -1) bounds.reverse();\n\n this.loop = false;\n this.setMinMax(bounds[0], bounds[1]);\n\n if(this.playToFrameOnFrameCallback) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n if(callback) {\n this.playToFrameOnFrameCallback = (frameNo: number) => {\n if(frameNo === frame) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n callback();\n }\n };\n\n this.addEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n this.play();\n }\n\n public setColor(color: RLottieColor, renderIfPaused: boolean) {\n this.color = color;\n\n if(renderIfPaused && this.paused) {\n this.renderFrame2(this.imageData.data, this.curFrame);\n }\n }\n\n public setInverseColor(color: RLottieColor) {\n this.inverseColor = color;\n }\n\n private setMinMax(minFrame = 0, maxFrame = this.frameCount - 1) {\n this.minFrame = minFrame;\n this.maxFrame = maxFrame;\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.frameCount = frameCount;\n this.fps = fps;\n this.setMinMax();\n if(this.initFrame !== undefined) {\n this.initFrame = clamp(this.initFrame, this.minFrame, this.maxFrame);\n }\n\n const curFrame = this.resetCurrentFrame();\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n // this.sendQuery('renderFrame', 0);\n\n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс,\n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс.\n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n\n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n });\n }\n }\n\n console.timeEnd('cache' + this.reqId); */\n // console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n !this.skipFirstFrameRendering && this.requestFrame(curFrame);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n if(!this.canvas[0].parentNode && this.el && !this.overrideRender) {\n this.el.forEach((container, idx) => container.append(this.canvas[idx]));\n }\n\n // console.log('enterFrame firstFrame');\n\n // let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused || !this.currentMethod) {\n return;\n }\n\n const time = Date.now();\n // console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n // lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n // setInterval(this.frameListener, this.frInterval);\n\n // ! fix autoplaying since there will be no animationIntersector for it\n if(this.group === 'none' && this.autoplay) {\n this.play();\n }\n }, {once: true});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Page from './page';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport {horizontalMenu} from '../components/horizontalMenu';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\nimport whichChild from '../helpers/dom/whichChild';\n\nclass PagesManager {\n private pageId = -1;\n private page: Page;\n\n private selectTab: ReturnType;\n public pagesDiv: HTMLDivElement;\n public scrollableDiv: HTMLElement;\n\n constructor() {\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\n if(this.page?.onShown) {\n this.page.onShown();\n }\n });\n }\n\n public setPage(page: Page) {\n if(page.isAuthPage) {\n this.pagesDiv.style.display = '';\n\n const id = whichChild(page.pageEl);\n if(this.pageId === id) return;\n\n this.selectTab(id);\n\n if(this.pageId !== -1 && id > 1) {\n lottieLoader.loadLottieWorkers();\n }\n\n\n this.pageId = id;\n\n if(this.scrollableDiv) {\n fastSmoothScroll({\n container: this.scrollableDiv,\n element: this.scrollableDiv.firstElementChild as HTMLElement,\n position: 'start'\n });\n }\n } else {\n this.pagesDiv.style.display = 'none';\n page.pageEl.style.display = '';\n\n this.pageId = -1;\n }\n\n this.page = page;\n }\n}\n\nconst pagesManager = new PagesManager();\nMOUNT_CLASS_TO.pagesManager = pagesManager;\nexport default pagesManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pagesManager from './pagesManager';\n\nexport default class Page {\n public pageEl: HTMLDivElement;\n private installed = false;\n\n constructor(\n className: string,\n public isAuthPage: boolean,\n private onFirstMount?: (...args: any[]) => Promise | void,\n private onMount?: (...args: any[]) => Promise | void,\n public onShown?: () => void\n ) {\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\n }\n\n public async mount(...args: any[]) {\n // this.pageEl.style.display = '';\n\n if(this.onMount) {\n const res = this.onMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n }\n\n if(!this.installed) {\n if(this.onFirstMount) {\n try {\n const res = this.onFirstMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n } catch(err) {\n console.error('PAGE MOUNT ERROR:', err);\n }\n }\n\n this.installed = true;\n }\n\n pagesManager.setPage(this);\n }\n}\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\n\nexport function encodeEmoji(emojiText: string) {\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\n return codepoints;\n}\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\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\n\nexport function toCodePoints(unicodeSurrogates: string): Array {\n const points = [];\n let char = 0;\n let previous = 0;\n let i = 0;\n while(i < unicodeSurrogates.length) {\n char = unicodeSurrogates.charCodeAt(i++);\n if(previous) {\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\n previous = 0;\n } else if(char > 0xd800 && char <= 0xdbff) {\n previous = char;\n } else {\n points.push(char.toString(16));\n }\n }\n\n if(points.length && points[0].length === 2) {\n points[0] = '00' + points[0];\n }\n\n return points;\n}\n\nexport function getEmojiToneIndex(input: string) {\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\n}\n\nconst VIRTUAL_COUNTRIES_EMOJIS: Map = new Map([\n ['FT', '🏴‍☠']\n]);\n\nexport function getCountryEmoji(iso2: string) {\n return VIRTUAL_COUNTRIES_EMOJIS.get(iso2) ??\n String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\n}\n\nexport function emojiFromCodePoints(codePoints: string) {\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n}\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Recorder=t():e.Recorder=t()}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\"a\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\"\",o(o.s=0)}([function(e,t,o){\"use strict\";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error(\"Recording is not supported in this browser\");e||(e={}),this.state=\"inactive\",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:\"encoderWorker.min.js\",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if(\"recording\"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case\"ready\":t();break;case\"page\":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case\"done\":this.encoder.removeEventListener(\"message\",i),this.finish()}};this.encoder.addEventListener(\"message\",i),this.encoder.postMessage(Object.assign({command:\"init\",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if(\"recording\"===this.state){if(this.state=\"paused\",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{\"flushed\"===o.data.message&&(t.removeEventListener(\"message\",i),this.onpause(),e())};t.addEventListener(\"message\",i),t.postMessage({command:\"flush\"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){\"paused\"===this.state&&(this.state=\"recording\",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if(\"inactive\"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state=\"recording\",this.onstart(),this.encoder.postMessage({command:\"getHeaderPages\"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if(\"inactive\"!==this.state){this.state=\"inactive\",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{\"done\"===i.data.message&&(e.removeEventListener(\"message\",o),t())};e.addEventListener(\"message\",o),e.postMessage({command:\"done\"}),this.config.reuseWorker||e.postMessage({command:\"close\"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){\"inactive\"===this.state&&this.encoder&&(this.encoder.postMessage({command:\"close\"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(o=window)}e.exports=o}])}));","/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nvar NEWTON_ITERATIONS = 4;\nvar NEWTON_MIN_SLOPE = 0.001;\nvar SUBDIVISION_PRECISION = 0.0000001;\nvar SUBDIVISION_MAX_ITERATIONS = 10;\n\nvar kSplineTableSize = 11;\nvar kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nvar float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\nfunction B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\nfunction C (aA1) { return 3.0 * aA1; }\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }\n\nfunction binarySubdivide (aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n}\n\nfunction LinearEasing (x) {\n return x;\n}\n\nmodule.exports = function bezier (mX1, mY1, mX2, mY2) {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n\n function getTForX (aX) {\n var intervalStart = 0.0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n\n var initialSlope = getSlope(guessForT, mX1, mX2);\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n }\n\n return function BezierEasing (x) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0 || x === 1) {\n return x;\n }\n return calcBezier(getTForX(x), mY1, mY2);\n };\n};\n"],"names":["animationIntersector","constructor","this","observer","IntersectionObserver","entries","entry","target","group","byGroups","intersectionLockedGroups","animation","find","p","el","isIntersecting","visible","add","checkAnimation","delete","_animation","clearCache","Set","overrideIdleGroups","byPlayer","Map","lockedGroups","onlyOnePlayableGroup","videosLocked","doc","type","checkAnimations2","idle","setOverrideIdleGroup","override","getAnimations","element","found","player","push","removeAnimation","remove","HTMLVideoElement","IS_SAFARI","setTimeout","src","load","length","unobserve","removeAnimationByPlayer","item","get","addAnimation","observeElement","controlled","has","canvas","placeholder","HTMLElement","onClean","loop","observe","set","checkAnimations","blurred","destroy","imitateIntersection","undefined","groups","Object","keys","animations","paused","pause","autoplay","play","getOnlyOnePlayableGroup","setOnlyOnePlayableGroup","lockGroup","unlockGroup","refreshGroup","forEach","lockIntersectionGroup","unlockIntersectionGroup","toggleIntersectionGroup","lock","SHOULD_USE_SAFARI_FIX","navigator","userAgent","match","err","AppMediaPlaybackController","media","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","playbackRates","voice","video","audio","seekBackward","details","playingMedia","currentTime","Math","max","seekOffset","seekForward","min","duration","seekTo","seekTime","onMediaDocumentLoad","managers","appDocsManager","getDoc","docId","supportsStreaming","handleSafariStreamable","cacheContext","thumbsStorage","getCacheContext","url","playbackRate","id","size","onPlay","e","peerId","mid","pip","message","getMessageByMedia","stop","setMedia","verify","listLoader","current","getCurrent","jumpLength","withOtherSide","previous","getPrevious","idx","findIndex","getNext","go","setTargets","dispatchEvent","getPlayingDetails","pauseMediaInOtherTabs","onPause","onEnded","isTrusted","lockedSwitchers","round","next","toggle","clean","s","isScheduled","storage","playingMediaType","playItem","searchContext","getMedia","resolveWaitingForLoadMedia","dispatchJump","goRound","browserPlay","bindBrowserCallback","browserPause","browserStop","browserSeekBackward","browserSeekForward","browserSeekTo","browserNext","browserPrevious","seekToStart","construct","container","document","createElement","style","cssText","body","append","mediaSession","actions","seekbackward","seekforward","seekto","previoustrack","nexttrack","action","setActionHandler","console","warn","skipMediaPlayEvent","properties","key","_key","value","dispatchPlaybackParams","defineProperties","getPlaybackParams","volume","muted","setPlaybackParams","params","_volume","_muted","_playbackRate","_loop","_round","addMedia","autoload","pFlags","is_scheduled","setAttribute","addEventListener","media_unread","fromId","appMessagesManager","readMessages","once","deferred","resolve","w","waitingStorage","then","promise","isSafariBuffering","safariBuffering","setSafariBuffering","setNewMediadata","pictureInPictureElement","artwork","isVoice","title","artist","thumbs","bytes","sizes","h","thumb","appPeersManager","getPeerPhoto","plainText","onlyFirstName","attribute","attributes","_","file_name","performer","IS_APPLE","metadata","MediaMetadata","setCurrentMediadata","playbackParams","cb","willBePlayed","willBePlayedMedia","setSearchContext","context","getSearchContext","prev","reset","loadCount","loadWhenLeft","processItem","onJump","older","onEmptied","reverse","folderId","getPlaybackMediaTypeFromMessage","mediaType","setSingleMedia","wasPlaying","toggleSwitchers","playPaused","removeEventListener","enabled","setPictureInPicture","listenerSetter","removeAll","appMediaPlaybackController","AppMediaViewer","captionTimeout","super","isForDocument","inputFilter","isMediaCompatibleForDocumentViewer","onPrevClick","openMedia","getMessageByPeer","onNextClick","onDeleteClick","content","close","onForwardClick","onAuthorClick","Number","MAX_SAFE_INTEGER","threadId","tab","lastMsgId","onDownloadClick","queueId","caption","classList","setCaptionTimeout","clearTimeout","window","onAdditionalScroll","wholeDiv","buttons","btnMenuForward","icon","text","onClick","btnMenuDownload","btnMenuDelete","setBtnMenuToggle","setListeners","forward","author","onCaptionClick","a","spoiler","HTMLAnchorElement","contains","onclick","getAttribute","includes","capture","click","getScheduledMessageByPeer","setCaption","html","entities","totalEntities","firstElementChild","fromRight","prevTargets","nextTargets","setMoverPromise","fwd_from","from_name","noForwards","isServiceMessage","cantForwardMessage","canForward","cantDownloadMessage","download","canDeleteMessage","hide","button","_openMedia","date","static","mime_type","VideoPlayer","streamable","onPlaybackRackMenuToggle","onPip","onPipClose","wrapper","setup","canHideControls","playbackRateButton","showOnLeaveToClassName","ignoreClickClassName","parentNode","insertBefore","appendChild","skin","stylePlayer","controls","querySelector","progress","prepend","catch","name","finally","initDuration","buildControls","timeDuration","insertAdjacentHTML","pipButton","querySelectorAll","fullScreenButton","timeElapsed","textContent","toHHMMSS","volumeSelector","leftControls","btn","parentElement","Array","from","togglePlay","requestPictureInPicture","visibility","debounceTime","debouncedPip","debounce","listener","timeout","overlayCounter","code","good","toggleFullScreen","altKey","nextIdx","PLAYBACK_RATES","indexOf","cancelEvent","onFullScreen","bind","hideControls","showControls","setPlaybackRateIcon","onMediaLoad","IS_MOBILE","pictureInPictureEnabled","map","rate","regularText","btnMenu","onOpen","onClose","PLAYBACK_RATES_ICONS","className","IS_APPLE_MOBILE","webkitEnterFullscreen","enterFullscreen","isFull","cleanup","removeListeners","MEDIA_VIEWER_CLASSNAME","AppMediaViewerBase","topButtons","tempId","preloader","preloaderStreamable","isFirstOpen","pageEl","getElementById","zoomElements","zoomSwipeStartX","zoomSwipeStartY","zoomSwipeX","zoomSwipeY","setZoomValue","rangeSelector","moversContainer","transform","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","tagName","highlightSwitchersTimeout","isZooming","mover","classNames","findUpClassName","onKeyDown","ctrlKeyDown","changeZoom","ctrlKey","metaKey","onKeyUp","onWheel","scrollingUp","deltaY","rootScope","log","logger","cancelable","lazyLoadQueue","overlaysDiv","mainDiv","topbar","topbarLeft","onlyMobile","authorRight","avatarEl","nameEl","buttonsDiv","concat","noRipple","zoom","step","withTransition","setHandlers","onScrub","onMouseUp","main","innerHTML","onLoadedMore","setNewMover","moveLength","onSwipe","xDiff","yDiff","abs","windowSize","verifyTouchTarget","evt","enable","isVisible","mousedown","zoomValue","setProgress","videoPlayer","lockControls","zoomSwipeHandler","lastDiffX","lastDiffY","multiplier","onFirstSwipe","onReset","cursor","addProgress","btnMenuToggle","buttonOptions","direction","Promise","reject","navigationItem","appNavigationController","clear","setMoverToTarget","onAnimationEnd","appMediaViewer","removeGlobalListeners","toggleOverlay","active","toggleGlobalListeners","setGlobalListeners","passive","closing","removeCenterFromMover","wasActive","delay","realParent","rect","getBoundingClientRect","SVGImageElement","SVGForeignObjectElement","left","needOpacity","overflowElement","visibleRect","getVisibleRect","overflow","vertical","horizontal","containerRect","top","aspecter","width","HTMLImageElement","setFullAspect","offsetLeft","height","scaleX","scaleY","borderRadius","getComputedStyle","getPropertyValue","brSplitted","str","splitted","split","i","fillPropertyValue","r","parseInt","join","willBeLeft","willBeTop","path","opacity","isOut","ret","isFulfilled","isRejected","SVGSVGElement","sizeTailPath","toggleWholeActive","mediaElement","selector","queryFrom","matches","elements","pop","getContext","naturalWidth","naturalHeight","videoWidth","videoHeight","HTMLCanvasElement","drawImage","image","Image","createVideo","clipId","dataset","newClipId","newSvg","createElementNS","setAttributeNS","outerHTML","replace","lastElementChild","defs","use","SVGUseElement","d","getAttributeNS","x","y","sX","sY","br","v","generatePathData","foreignObject","renderImageFromUrl","display","proportion","upscale","start","Date","now","diff","_br","moveTheMover","toLeft","windowW","newTransform","p1","newMover","updateMediaSource","toLowerCase","setAuthorInfo","timestamp","isPeerId","wrapTitlePromise","dialog","wrapEmojiText","oldAvatar","newAvatar","cloneNode","all","updateWithOptions","peerTitle","replaceContent","replaceWith","setAuthorPromise","isDocument","isVideo","useContainerAsTarget","IS_MOBILE_SAFARI","onPop","canAnimate","maxWidth","padding","windowH","mediaSizes","maxHeight","thumbPromise","setAttachmentSize","photoSize","img","downloaded","gotThumb","getStrippedThumbIfNeeded","loadPromise","useController","div","moverVideo","canPlayThrough","createPlayer","ckin","overlay","open","otherMediaViewer","releaseSingleMedia","show","readyState","HAVE_FUTURE_DATA","attach","attachCanPlay","detach","loading","networkState","NETWORK_LOADING","isntEnoughData","unshift","appDownloadManager","toast","langPackKey","error","cancellablePromise","attachPromise","imgs","haveImage","setManual","onPopState","hash","location","state","debug","isPossibleSwipe","currentHash","overriddenHash","overrideHash","onHashChange","pushState","navigations","manual","handleItem","onEscape","back","onTouchStart","touches","options","history","scrollRestoration","replaceState","pushItem","noBlurOnPop","findItemByType","index","backByItem","splice","onItemAdded","noHistory","unshiftItem","spliceItems","items","origin","pathname","search","removeItem","removeByType","single","SearchGroup","clearable","clickable","autonomous","onFound","noIcons","list","setActive","childElementCount","AppSearch","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","scrollable","messages","setVirtualContainer","onChange","searchMore","onScrolledBottom","trim","beginSearch","inputField","input","focus","maxId","limit","res","count","shift","searchGroup","avatarSize","meAsSaved","SearchContextMenu","attachTo","searchSuper","onGotoClick","appImManager","selection","isSelecting","selectionForwardBtn","onSelectClick","toggleByElement","onClearSelectionClick","cancelSelection","selectionDeleteBtn","attachContextMenuListener","callback","init","MouseEvent","preventDefault","cancelBubble","toPeerId","isSelected","isMidSelected","withSelection","positionMenu","contextMenuController","AppSearchSuper","tabs","prevTabId","middleware","historyStorage","usedFromHistory","loadMutex","nextRates","loadPromises","loaded","loadedChats","firstLoad","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","showSender","onTransitionStart","onTransitionEnd","safeAssign","searchContextMenu","navScrollableContainer","navScrollable","nav","tabsMenu","mediaTab","mediaTabs","menuTab","span","ripple","unlockScroll","tabsContainer","swipeHandler","handleTabSwipe","prevId","selectTab","children","onTouchMove","lockers","lockTouchScroll","contentTab","searchGroupMedia","canLoadMediaTab","horizontalMenu","tabContent","animate","skipScroll","scrollIntoViewNew","position","startCallback","scrollStartCallback","newMediaTab","onChangeTab","fromMediaTab","offsetTop","scrollTop","scroll","scrollHeight","rect2","onScroll","onMediaClick","targetClassName","mediaSpoiler","event","targets","containerEl","copySearchContext","slice","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","unlockAndRefresh","filterMessagesByType","filterMessagesByInputFilter","processEmptyFilter","dialogElement","appDialogsManager","setLastMessagePromise","lastMessage","highlightWord","noop","processPhotoVideoFilter","promises","getMediaFromMessage","wrapped","choosePhotoSize","boxWidth","boxHeight","onlyPreview","withoutPreloader","noPlayButton","photo","noBlur","animationGroup","multiply","images","full","filter","Boolean","processDocumentFilter","withTime","fontWeight","voiceAsMusic","autoDownloadSize","processUrlFilter","webPage","webpage","entity","display_url","sliced","offset","matchUrl","same","URL","hostname","description","previewDiv","setInnerHTML","wrapAbbreviation","subtitleFragment","htmlToDocumentFragment","wrapRichText","innerText","decodeURIComponent","href","firstChild","wrapPlainText","row","titleRight","subtitle","havePadding","applyMediaElement","performSearchResult","elemsToAppend","sharedMediaDiv","processCallback","results","awaited","method","monthContainer","getMonthContainerByTimestamp","toggleElementCheckbox","afterPerforming","parent","child","loadChats","renderedPeerIds","inputMessagesFilterEmpty","setResults","showMembersCount","dom","peer","getPeer","participants_count","participants","regExp","RegExp","escapeRegExp","cleanSearchText","titleSpan","lastMessageSpan","getChatMembersString","toChatId","username","getPeerUsername","user","appUsersManager","getUser","phone","formatPhoneNumber","formatted","onLoad","arg","getContactsPeerIds","contacts","searchContacts","my_results","globalContacts","showMore","intlElement","isShort","update","dialogsStorage","getDialogs","offsetIndex","filterId","dialogs","minDate","renderRecentSearch","recent","replaceChildren","recentSearch","isUser","getUserStatusString","toUserId","getTopPeers","peers","people","subtitleEl","loadMembers","renderParticipants","membersList","rippleEnabled","li","findUpTag","DIALOG_LIST_ELEMENT_TAG","participant","getParticipantPeerId","isAnyChat","deleted","appChatsManager","isChannel","LOAD_COUNT","appProfileManager","getChannelParticipants","getChatFull","chatFull","loadType","justLoad","used","slicedLength","ids","notFilteredMessages","m","checkForTriggers","getSearch","nextRate","next_rate","loadFirstTime","filters","counters","canViewMembers","getSearchCounters","firstMediaTab","counter","c","membersTab","loadFirstTimePromise","toLoad","t","findAndSplice","setHours","setDate","dateTimestamp","getTime","containers","month","getFullYear","year","dateElement","haveTimestamps","getObjectKeysAndSort","positionElementByIndex","chatId","isBroadcast","hasRights","isForum","cleanScrollPositions","cleanupHTML","goFirst","putPreloader","empty","newInputFilter","copy","setQuery","maxDate","AppSelectPeers","chatsContainer","selected","freezed","loadedWhat","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","design","onInput","cachedContacts","getMoreResults","f","renderResultsFunc","renderResults","peerIds","splitUp","notRendered","filterPeerTypeBy","section","innerContainer","topContainer","selectedContainer","selectedScrollable","sectionNameLangPackKey","noShadow","checkbox","checked","debouncedInput","appendTo","getResultsPromise","onFirstRender","renderSaved","testSelfSearch","getTempId","getMoreDialogs","archived","pageCount","skipMigrated","newOffsetIndex","chatRightsAction","filterByRights","isEnd","getMoreContacts","isGlobalSearch","searchResult","resultPeerIds","arr","getMoreChannelParticipants","channelParticipants","q","getMoreSomething","call","isNonContactUser","checkboxField","label","isDialog","insertAdjacentElement","offsetWidth","getSelected","addInitial","values","requestAnimationFrame","forceDirection","constructDownloadPreloader","tryAgainOnFail","circle","totalLength","mids","attr","elem","findMediaTargets","anchor","anchorMid","isBubbles","justAudioSelector","selectors","prefix","mediaItems","AudioElement","render","isRealVoice","isOutgoing","is_outgoing","uploadingFileName","durationStr","downloadDiv","onTypeLoad","audioEl","out","waveform","Uint8Array","valueCount","result","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","svg","svgContainer","availW","barHeightMax","minW","maxW","normValue","wfSize","barCount","maxValue","maxDelta","barX","sumI","bar_value","barWidth","createWaveformBars","fakeSvgContainer","waveformContainer","timeDiv","onTimeUpdate","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","scrub","offsetX","targetTouches","pageX","scrubTime","wrapVoiceMessage","descriptionEl","audioAttribute","parts","titleEl","middleEllipsisEl","fontSize","sizeType","subtitleDiv","launched","progressLine","lastChild","wrapAudio","audioTimeDiv","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","hadSearchContext","useSearch","autoDownload","shouldPlay","onDownloadInit","pauseListener","notifyAll","done","total","cancel","Error","playListener","setDownloadFunction","disconnectedCallback","isConnected","customElements","define","AvatarListLoader","loadMore","photoId","appPhotosManager","getUserPhotos","photos","loadedAllUp","AppMediaViewerAvatar","getPhoto","onAvatarUpdate","openAvatarViewer","getTarget","hadMessage","isObject","data","believeMe","seen","getAvatarQueueKey","AvatarElement","addedToQueue","middlewareHelper","attachClickEvent","updateOptions","wasPeerId","wasThreadId","newPeerId","wrapOptions","create","onlyThumb","putPhoto","isBig","AvatarEdit","clearRect","Button","asLink","asDiv","rippleSquare","disabled","ButtonMenuItem","separator","iconDoc","noCheckboxClickListener","textElement","textArgs","iconElement","noFadeIn","processUrl","fetch","response","color","DOMParser","parseFromString","stroke","strokeWidth","keepOpen","menu","checkForClose","multiline","ButtonMenuSync","b","ButtonMenu","ButtonMenuToggleHandler","openedMenu","ButtonMenuToggle","attachListenerSetter","onOpenBefore","onCloseAfter","closeTimeout","filteredButtons","_element","ChatBackgroundGradientRenderer","_width","_height","_tails","_scrollTails","_curve","_positions","_phases","_animatingToNextPosition","_scrollDelta","_onWheelRAF","drawOnWheel","floor","ceil","changeTailAndDraw","drawNextPositionAnimated","getProgress","transitionValue","nextPositionTail","_nextPositionTail","_nextPositionTails","_nextPositionLeft","frames","_frames","drawImageData","_incrementalCurve","hexToRgb","hex","g","getPositions","positions","getNextPositions","phase","curveMax","curve","pos","distances","nextPos","distance","curPosition","tail","changeTail","_tail","_phase","curPos","drawGradient","getGradientImageData","_hctx","createImageData","pixels","centerDistanceY","centerDistanceY2","centerDistanceX","swirlFactor","sqrt","theta","sinTheta","sin","cosTheta","cos","pixelX","pixelY","distanceSum","_colors","distanceX","distanceY","putImageData","_ctx","_hc","cancelAnimationFrame","colors","alpha","_canvas","fillStyle","fillRect","toNextPosition","tails","nextPhaseOnIdx","inc","toFixed","curves","last","scrollAnimate","createCanvas","gradientRenderer","accumulateMapSet","reduce","acc","AppSelection","selectedMids","onMouseDown","targetLookupClassName","verifyTarget","selecting","firstTarget","processElement","checkBetween","isInDOM","seenSet","seenLength","findUpAsChild","elementsBetween","getElementsBetween","toggleByMid","canceledSelection","onMouseMove","getElementFromTarget","verifyMouseMoveTarget","removeManual","listenElement","documentListenerOptions","first","firstRect","lastRect","isHigher","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","lastIndex","doNotAnimate","onCancelSelection","toggleSelection","navigationType","random","attachListeners","selectedText","getSelection","toString","createRange","verifyTouchLongPress","isElementShouldBeSelected","appendCheckbox","hasCheckbox","getCheckboxInputFromElement","forwards","updateContainer","forceSelection","cantForward","cantDelete","cantSend","storageKey","cantForwardDeleteMids","onUpdateContainer","toggleCheckboxes","wasSelecting","blurActiveElement","toggleResult","onToggleSelection","updateElementSelection","toggleMid","unselect","deleteSelectedMids","SearchSelection","selectionCountEl","selectionGotoBtn","selectionContainer","BASE_CLASS","btnCancel","attachClickOptions","obj","fromPeerId","sort","isPrivate","transitionElement","ChatSelection","chat","bubbles","recording","bubble","canSelectBubble","isGroupedBubbleSelected","getMidsFromGroupContainer","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","mounted","getMountedBubble","needTranslateX","widthFrom","widthTo","center","selectionInputWrapper","selectionSendNowBtn","selectionLeft","selectionRight","translateButtonsX","right","inputContainer","toggleAttribute","skippedMids","isGrouped","groupedCheckboxInput","CheckboxField","restriction","toggleDisability","stateKey","stateValues","stateValue","setValueSilently","box","checkSvg","bg","border","withRipple","withHover","Event","disable","CodeInputField","assign","autocomplete","lastLength","setLabel","onFill","confirmationPopup","checkboxes","cancelButton","isCancel","countries","setCountries","country","hidden","default_name","localeCompare","VIRTUAL_COUNTRIES","CountryInputField","hidePicker","hideTimeout","selectWrapper","selectCountryByTarget","defaultName","phoneCodeEl","phoneCode","countryCode","simulateInputEvent","lastCountrySelected","lastCountryCodeSelected","country_codes","_countryCode","country_code","onCountryChange","liMap","arrowDown","selectList","initSelect","noPhoneCodes","iso2","emoji","liArr","Infinity","spanEmoji","select","margin","mouseDownHandlerAttached","onKeyPress","_value","names","abbr","word","test","blur","selectCountryByIso2","countryName","DotRenderer","dpr","devicePixelRatio","prepare","dots","generateDot","adding","radius","Path2D","arc","PI","mOpacity","draw","dot","addOpacity","easedOpacity","globalAlpha","fill","renderFirstFrame","dotRenderer","EditPeer","_disabled","isChanged","uploadAvatar","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","nextBtn","withoutAvatar","avatarElem","doNotEditAvatar","avatarEdit","_upload","popupOptions","lockWithPromise","unlockOnSuccess","GifsTab","gifsContainer","EmoticonsDropdown","masonry","EMOTICONSSTICKERGROUP","getGifs","docs","processInvisibleDiv","ANIMATIONGROUP","AppGifsTab","nextOffset","loadedAll","onGifsClick","fileId","inputSearch","gifsDiv","onCloseAfterTimeout","newSearch","gifBotPeerId","resolveUsername","appInlineBotsManager","getInlineResults","next_offset","AppStickersTab","setsDiv","listenTo","sticker","stickerSet","access_hash","appStickersManager","getStickerSet","toggleStickerSet","changed","installed_date","removeAttribute","renderFeatured","renderSet","header","countDiv","stickersDiv","stickerDiv","documents","withLock","getFeaturedStickers","coveredSets","filterRendered","forEachReverse","covered","searchStickerSets","scrollOptions","forceDuration","transitionFunction","ignoreOutClickClassName","tabId","onSelectTabClick","searchButton","emojiTab","deleteBtn","scrollTo","checkRights","tabsEl","tabsElements","canSendStickers","canSendGifs","canSendToPeer","stickersTab","gifsTab","whichChild","savedRange","getGoodRange","onOpened","unlock","refresh","onClosed","range","getSavedRange","setStartAfter","newRange","cloneRange","collapsed","node","endContainer","endOffset","newStartNode","previousSibling","nodeType","TEXT_NODE","nodeValue","ELEMENT_NODE","isContentEditable","selectNode","newOffset","setStart","deleteContents","HIDE_EMOJI_TAB","INIT_TAB_ID","lastMouseMoveEvent","mouseMoveEventAttached","isActive","onMouseOut","getElement","axis","clearDraft","silent","emoticonsDropdown","forceClose","addLazyLoadQueueRepeat","divs","intersector","getVisible","clearVisible","sel","rangeCount","activeElement","getRangeAt","menuOnClick","emoticons","menuScroll","prevTab","jumpedTo","getElementPosition","elementPosition","scrollToTab","scrollingToContent","stickyIntersector","stuck","getCategoryByContainer","which","getCategoryByMenuTab","additionalOffset","setActiveStatic","local","scrollLeft","clientWidth","sendDocId","loadedURLs","appendEmoji","unify","kek","getEmojiEntityFromEmoji","wrapSingleEmoji","fixEmoji","getEmojiFromElement","superEmoji","stickerEmoji","EMOJI_RECENT_ID","EMOJI_RECENT_CATEGORY","CUSTOM_EMOJI_RECENT_CATEGORY","EMOJI_CATEGORIES","sorted","category","order","EMOJI_ELEMENT_SIZE","EmojiTab","onCategoryVisibility","categoriesMap","renderer","newChildren","customEmojis","customEmojiElement","clearCanvas","onContentClick","isStandalone","langPackArguments","activeElements","menuInnerScroll","intersectionOptions","root","categoriesIntersector","menuOnClickResult","innerScrollWrapper","preparedMap","noRegularEmoji","emojis","titleLangPackKey","createLocalCategory","unified","addEmojiToCategory","batch","appEmojiManager","getRecentEmojis","stickerSetId","getLocalStickerSet","getCustomEmojis","recentCustom","mainSet","sets","recentCategory","categories","recentCustomCategory","CUSTOM_EMOJI_RECENT_ID","createRendererForCategory","paddingTop","toggleLocalCategory","resizeCategories","after","renderStickerSet","toggleCustomCategory","postponedEvent","positionCategory","toggleRenderers","ignore","ignoreSettingDimensions","setDimensionsFromRect","deleteCategory","isCategoryVisible","forceRender","closeScrollTop","createCategory","menuTabPadding","stickerEmojiRaw","setCategoryItemsHeight","getCustomCategory","hasPremium","canSeeCustomCategory","customEmojiSize","activeEmoji","spliceExceed","onLocalCategoryUpdate","LazyLoadQueueRepeat","parallelLimit","onVisibilityChange","elementsMap","queueItem","wasSeen","queue","indexOfAndSplice","setProcessQueueTimeout","SuperStickerRenderer","regularLazyLoadQueue","animated","checkAnimationContainer","processVisible","processInvisible","renderSticker","observeAnimated","unobserveAnimated","StickersTabCategory","noMenuTab","getContainerSize","getElementMediaSize","gapX","gapY","containerWidth","elementSize","itemsPerRow","rows","minHeight","EmoticonsTabC","categoryItemsClassName","args","postponedEvents","categoriesByMenuTabMap","localCategories","menuWrapper","isLocal","observeStickyHeaderChanges","posItems","foundMenuScroll","posMenu","notMountedItems","notMountedMenus","itemsIdx","menuIdx","disconnect","StickersTab","setTyping","setFavedLimit","categoryAppendStickers","superStickerRenderer","clearCategoryItems","onCategoryStickers","stickers","deleteSticker","unshiftSticker","favedCategory","clearButton","titleLangKey","descriptionLangKey","langKey","clearRecentStickers","premiumCategory","apiManager","getLimit","getFavedStickersStickers","getRecentStickersStickers","getAllStickers","getPremiumStickers","isPremium","race","rendererLazyLoadQueue","faved","createStickersContextMenu","verifyRecent","unshiftRecentSticker","saveRecentSticker","deleteRecentSticker","generateDelimiter","delimiter","generateFakeIcon","isScam","LazyLoadQueueRepeat2","spliced","findAndSpliceAll","GifsMasonry","scrollPromise","processVisibleDiv","noInfo","noPreview","transitionTime","scrollableX","proxy","Proxy","apply","that","selectTarget","result1","canChange","mutateCallback","useStripe","indicator","currentIndicator","shiftLeft","scaleFactor","insertRichTextAsHTML","wrappingForPeerId","some","createCustomEmojiRendererForInput","fragment","wrapDraftText","customEmojiRenderer","contentEditable","richInputHandler","customEmojiElements","ces","documentFragmentToHTML","pre","getCaretPosNew","createTextNode","collapse","removeAllRanges","addRange","onBeforeInput","inputType","execCommand","removeExtraBOMs","findUpAttribute","noLinebreaks","originalEvent","clipboardData","getData","usePlainText","filterEntity","curChild","nextSibling","richValue","getRichValueWithCaret","lines","textLength","line","correctedText","entities2","parseEntities","mergeEntities","InputState","wrappingDraft","isSelectable","processCustomEmojisInInput","hasSet","connectedCallback","InputField","validate","maxLength","showLengthOn","canBeEdited","labelText","onInputCallbacks","isCollapsed","centerX","focusOnNext","clientX","isInputEmpty","inputMode","labelEl","showingLength","wasError","inputLength","isError","withLinebreaks","selectNodeContents","selectElementContents","labelOptions","fromSet","originalValue","isValidToChange","setDraftValue","setOriginalValue","setState","Valid","setError","InputSearch","prevValue","onClearClick","onClear","searchIcon","clearBtn","LazyLoadQueue","ignoreHeavyAnimation","getItem","addElement","LazyLoadQueueIntersector","inProcess","loadItem","intersectorTimeout","processQueue","MediaProgressLine","useTransform","progressRAF","onLoadedData","seek","setLoadProgress","onProgress","filledLoad","setSeekMax","buf","buffered","numRanges","nearestStart","end","percents","testQueue","pendingTest","setTestQueue","testElement","getElementWidth","mapped","firstTime","font","textWidth","elementWidth","newElementWidth","widthChanged","smallerText","smallerWidth","smallerTextLength","half","half1","substr","half2","MiddleEllipsisElement","PasswordMonkey","passwordInputField","needFrame","noCache","currentFrame","setSpeed","helpers","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","TrackingMonkey","playAnimation","frame","idleAnimation","PasswordInputHelpers","onVisibilityClick","toggleVisible","stealthy","tabIndex","PasswordInputField","PeerProfileAvatars","avatar","avatars","draggable","loadCallback","intersectionObserver","loadCallbacks","addTab","gradient","info","arrowPrevious","arrowNext","checkScrollTop","SWITCH_ZONE","freeze","_e","clickX","toRight","cancelNextClick","minX","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","loadNearestToTarget","setPeer","backLimit","filterChatPhotosMessages","chat_photo","generateFakeAvatarMessage","activeTab","photo_id","setText","PeerProfile","noDelimiter","bio","contextMenu","subtitleLangKey","isAnonymous","getUserPhone","link","notifications","togglePeerMute","appNotificationsManager","isPeerLocalMuted","respectType","setPeerStatus","setMoreDetails","n","fillUsername","userId","self","fillUserPhone","setAvatar","setPeerStatusInterval","setInterval","needClear","callbacks","useWhitespace","ignoreSelf","clearSetMoreDetailsTimeout","canBeDetailed","createAvatar","_setAvatar","isTopic","oldAvatars","getUsernamesAlso","usernames","also","anchorCopy","getPeerActiveUsernames","formatUserPhone","fillNotifications","notificationsRow","fillName","withIcons","fillRows","fillProfileElements","cleaned","_setMoreDetails","peerFull","getMiddlewarePromise","getServerMessageId","about","getChat","exportedInvite","exported_invite","address","setMoreDetailsTimeout","isPeerRestricted","acknowledged","getProfileByPeerId","setPromise","cached","middlewarePromise","makeError","clearInterval","generateTitleIcons","noVerifiedIcon","noFakeIcon","noPremiumIcon","verified","use2","generateVerifiedIcon","fake","scam","premium","emojiStatus","emoji_status","generatePremiumIcon","weakMap","WeakMap","PeerTitle","setOptions","setHasInner","hasInner","fromName","limitSymbols","topic","forumTopic","getTopicIconPromise","icons","topicIcon","getPeerTitle","withPremiumIcon","inner","createDocumentFragment","PopupAvatar","closable","withConfirm","cropper","crop","removeHandlers","h6","btnClose","cropContainer","file","files","readBlobAsDataURL","contents","onload","originalImage","cropComponent","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","overlayColor","CROPWIDTH","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","startMoving","resizing","keyHandler","imgZoom","bottom","newWidth","newHeight","clientHeight","String","fromCharCode","charCode","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","currentTouch","complete","btnConfirm","toBlob","blob","darkenCanvas","onCrop","postCanvas","ctx","PopupDeleteDialog","onSelect","peerTitleElement","getDialogType","callbackLeave","flush","leave","flushHistory","callbackDelete","titleArgs","descriptionArgs","isDanger","titleLangArgs","descriptionLangArgs","PopupDeleteMessages","onConfirm","revoke","deleteScheduledMessages","deleteMessages","isMegagroup","_hasRights","canRevoke","PopupForward","peerIdMids","peerTypes","forwardMessages","DEFAULT_APPEND_TO","appendPopupTo","onFullScreenChange","PopupElement","reAppend","titleRaw","MANAGERS","confirmShortcutIsSendShortcut","withoutOverlay","overlayClosable","attachScrollableListeners","btnConfirmOnEnter","buttonsEl","buttonsElements","langArgs","POPUPS","setClassOn","attachBorderListeners","onContentUpdate","popup","popupConstructor","ctor","addCancelButton","pin","descriptionPremium","descriptionLocked","folders","P","_a","limitPremium","isLocked","limitContainer","hint","free","setHintActive","showLimitPopup","appConfig","premium_purchase_blocked","times","ONE_HOUR","PopupMute","time","mutePeer","muteUntil","radioForm","PopupPeer","noTitle","o","original","nextElementSibling","PopupPickUser","PopupSendNow","sendScheduledMessages","ANIMATION_GROUP","PopupStickers","stickerSetInput","isEmojis","onStickersClick","updateAdded","stickersFooter","onStickerSetUpdate","_set","updateButton","loadStickerSet","createStickerSetElements","headerRow","buttonRight","added","itemsContainer","setsPromises","isArray","firstSet","isStickerPack","onSend","containersPromises","docIds","toggleStickerSets","isAdd","buttonAppend","installed","ProgressivePreloader","detached","isUpload","attachMethod","loadFunc","constructContainer","bold","constructDownloadIcon","downloadSvg","cancelSvg","previousElementSibling","func","startTime","onEnd","notify","elapsedTime","TRANSITION_TIME","addNotifyListener","useRafs","getTotalLength","strokeDasharray","putAvatar","renderThumbPromise","thumbImage","isFullLoaded","loadThumbPromise","stripped_thumb","getPreviewURLFromBytes","sequentialDom","renderPromise","myId","getForumTopic","setProperty","getPeerColorById","forum","avatarAvailable","avatarRendered","appAvatarsManager","isAvatarCached","first_name","last_name","getPeerInitials","returnDiv","setButtonLoader","RadioField","alignRight","RadioForm","radios","form","RangeSelector","events","setFilled","filled","stepStr","decimals","_removeListeners","rectMax","offsetAxisValue","rippleClickId","attachListenerTo","handler","drawRipple","clickId","_handler","touchStartFired","clickY","isRippleUnneeded","touchEnd","setContent","Row","checkboxFieldOptions","radioField","noWrap","subtitleRight","subtitleRow","createRow","subtitleLangArgs","isToggle","withCheckboxSubtitle","titleRightContent","titleRightSecondary","titleRow","createTitle","navigationTab","buttonRightLangKey","_subtitle","createSubtitle","midtitle","_midtitle","createMidtitle","createMedia","disableWithPromise","makeSortable","sortIcon","toggleSorting","CreateRowFromCheckboxField","RadioFormFromRows","RadioFormFromValues","checkedRadioField","ScrollableBase","logPrefix","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","cancelMeasure","onScrolledTop","scrollPosition","scrollProperty","addScrollListener","addedScrollListener","removeScrollListener","removeHeavyAnimationListener","Scrollable","onScrollOffset","withPaddingContainer","maxScrollTop","isScrolledDown","getDistanceToEnd","setScrollTopSilently","ignoreNextScrollEvent","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","SettingSection","fakeGradientDelimiter","hr","generateContentElement","nameArgs","captionOld","captionArgs","generateSection","AppNewGroupTab","isGeoChat","setTitle","inputWrapper","groupNameInputField","groupLocationInputField","valueCheck","userLocationCoords","userLocationAddress","createChannel","geo_point","megagroup","inputFile","editPhoto","inviteToChannel","createChat","chatsSection","new","startLocating","geolocation","getCurrentPosition","lat","coords","latitude","long","longitude","uri","json","display_name","GeolocationPositionError","PrivacyType","getPrivacyRulesDetails","rules","types","allowPeers","users","chats","disallowPeers","rule","PrivacySection","onRadioChange","captions","captionElement","radioSection","exceptions","radioRows","skipTypes","noExceptions","exceptionTexts","exception","_peerIds","slider","createTab","skippable","takeOut","newPeerIds","generateStr","splitPeersByType","selectedPeerIds","appPrivacyManager","getPrivacy","inputKey","setRadio","k","eventListener","chatKey","usersKey","getUserInput","setPrivacy","AppPrivacyPhoneNumberTab","getSelf","captionEl","mePath","phoneSection","sCaption","AppTwoStepVerificationSetTab","stickerContainer","inputContent","btnReturn","sliceTabsUntilTab","AppSettingsTab","canFocus","isFirstInput","AppTwoStepVerificationEmailConfirmationTab","isFirst","email","codeInputField","passwordManager","confirmPasswordEmail","goNext","btnChange","btnResend","cancelPasswordEmail","AppTwoStepVerificationEmailTab","resendPasswordEmail","onOpenAfterTimeout","onContinueClick","btnContinue","btnSkip","matchEmail","toggleButtons","updateSettings","currentPassword","plainPassword","newPassword","symbols","AppTwoStepVerificationHintTab","onSkipClick","saveHint","AppTwoStepVerificationReEnterPasswordTab","monkey","verifyInput","AppTwoStepVerificationEnterPasswordTab","isNew","has_password","textEl","getStateInterval","getState","_state","check","auth","AppTwoStepVerificationTab","removeTabFromHistory","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","AppPrivacyLastSeenTab","AppPrivacyProfilePhotoTab","AppPrivacyForwardMessagesTab","AppPrivacyAddToGroupsTab","AppPrivacyCallsTab","AppActiveSessionsTab","Session","app_name","app_version","ip","date_active","date_created","device_model","system_version","platform","authorizations","session","btnTerminate","invokeApi","otherSection","onError","onTerminateClick","menuElement","AppBlockedUsersTab","btnAdd","toggleBlock","bot","blocked","getBlocked","convertKeyToInputKey","toUpperCase","AppPrivacyVoicesTab","AppActiveWebSessionsTab","sessions","bot_id","region","domain","browser","appSeamlessLoginManager","resetWebAuthorizations","leftLength","resetWebAuthorization","AppPrivacyAndSecurityTab","fromTab","getAppConfig","globalPrivacy","getGlobalPrivacySettings","contentSettings","webAuthorizations","getWebAuthorizations","SUBTITLE","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRowOptions","email_unconfirmed_pattern","twoFactorRow","activeSessionsRow","updateActiveSessions","websitesRow","updateActiveWebsites","websites","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","voicesRow","updatePrivacyRow","disallowLength","allowLength","destroyed","setGlobalPrivacySettings","archive_and_mute_new_noncontact_peers","settings","onPremiumToggle","autoarchive_setting_available","_enabled","sensitive_enabled","sensitive_can_change","payment","appPaymentsManager","clearSavedInfo","deleteButton","appDraftsManager","clearAllDrafts","auths","AppQuickReactionTab","appReactionsManager","getQuickReaction","getAvailableReactions","quickReaction","availableReactions","reaction","inactive","availableReaction","static_icon","setDefaultReaction","emoticon","RangeSettingSelector","initialValue","minValue","writeValue","nameDiv","valueDiv","valueContainer","AppGeneralSettingsTab","themes","allStickers","chatBackgroundButton","initArgs","animationsCheckboxField","themesContainer","themesMap","lastOnFrameNo","lastActive","themeController","theme","onFrameNo","frameNo","maxFrame","currentTheme","isNight","defaultThemes","default","baseTheme","wallpaper","base_theme","emoticonContainer","bubbleIn","enterRow","ctrlEnterRow","kilometersRow","milesRow","formats","format","runFirst","getNextTimeout","_callback","run","eachTimeout","getSeconds","eachMinute","toLocaleTimeString","hour","minute","suggestCheckboxField","bigCheckboxField","reactionsRow","renderQuickReaction","getCustomEmojiDocument","document_id","loopCheckboxField","stickerSets","stickersContent","assumeType","AppChatFoldersTab","filtersRendered","animationData","lottieLoader","renderFolder","dialogFilter","non_contacts","broadcasts","bots","folder","getFolderDialogs","channels","isAnyGroup","filtersStorage","getFilter","setInitFilter","localId","getInitArgs","createFolderBtn","foldersSection","suggestedSection","canCreateFolder","onFiltersContainerUpdate","renderFiltersPromise","toggleAllChats","getSuggestedFilters","loadAnimationPromise","onSort","prevIdx","newIdx","updateDialogFiltersOrder","getDialogFilters","getSuggestedDialogsFilters","suggestedFilters","includePeerIds","excludePeerIds","pinnedPeerIds","createDialogFilter","AppNotificationsTab","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","getNotifySettings","notifySettings","applySettings","isMuted","show_previews","mute","showPreviews","inputSettings","mute_until","flags","updateNotifySettings","notify_settings","contactsSignUpRow","soundRow","sound","getContactSignUpNotification","setContactSignUpNotification","AppLanguageTab","languages1","lang_pack","languages2","rendered","webLangCodes","language","lang_code","native_name","langPack","autoDownloadPeerTypeSection","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","AppAutoDownloadPhotoTab","AppAutoDownloadFileTab","debouncedSave","sizeMax","appStateManager","setByKey","MIN","MAX_RANGE","MAX","upTo","formatBytes","compareAndUpdate","AppAutoDownloadVideoTab","AUTO_DOWNLOAD_FOR_KEYS","private","AppDataAndStorageTab","autoCheckboxField","autoDownloadNew","autoRow","resetButton","deepEqual","setSubtitles","setAutoDownloadSubtitle","photoRow","videoRow","fileRow","file_size_max","openTab","tabConstructor","onDisabledChange","peerKeys","enabledKeys","isAll","logOut","edit","profile","fillPromise","changeAvatarBtn","upload","uploadProfilePhoto","updateChangeAvatarBtn","languageArgs","devicesRow","languageRow","buttonsSection","getEditProfileArgs","editProfileArgs","getAuthorizations","overwrite","getAuthorizationsPromise","AppNewChannelTab","channelNameInputField","channelDescriptionInputField","onLengthChange","broadcast","channelId","PopupCreateContact","importContact","nameInputField","lastNameInputField","telInputField","editPeer","AppContactsTab","openContacts","isContact","sortedUserList","createList","renderPage","AppArchivedTab","wasFilterId","ul","AppPeopleNearbyTab","isLocationWatched","parseDistance","startWatching","latestLocationSaved","getLocated","accuracy","watchPosition","isLongitudeDifferent","isLatitudeDifferent","distanceCheck","calculateDistance","stopWatching","lat1","long1","lat2","long2","asin","LEFT_COLUMN_ACTIVE_CLASSNAME","AppSidebarLeft","sidebarEl","sidebarHeader","onContactsClick","backBtn","btnArchive","isDialogsLoaded","themeCheckboxField","sessionStorage","kz_version","installPrompt","toolsBtn","btnMenuFooter","rel","archivedCount","newBtnMenu","updateBtn","reload","initSearch","unreadPeerIds","formatNumber","checkUpdateInterval","cache","status","ok","hasUpdate","onResize","documentElement","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","removeProperty","helper","unselectEntity","renderEntity","dates","dateData","pushRecentSearch","peopleContainer","hideNewBtnMenuTimeout","transition","activeClassName","onFocus","clearRecentSearchBtn","clearRecentSearch","appSidebarLeft","AppAddMembersTab","attachToPromise","isPrivacy","removeLoader","averageColorFromCanvas","pixel","getImageData","pixelsLength","outPixel","Uint8ClampedArray","highlightningColor","rgba","l","ColorPicker","hue","saturation","lightness","onGrabStart","boxDragger","onGrabEnd","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","attachGrabListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","getCurrentColor","rgbaArray","hexa","hsl","hsla","clamp","maxX","maxY","posX","posY","lightnessX","lightnessY","AppBackgroundColorTab","_applyColor","updateColorPicker","colorPicker","wallPaper","background_color","pushToState","onColorChange","applyColor","gridSection","grid","backgroundColor","throttle","isColored","AppBackgroundTab","clicked","wallPapersByElement","elementsByKey","onUploadClick","accept","requestFile","endsWith","createObjectURL","mimeType","scaleMediaElement","File","prepareWallPaperUpload","uploadPromise","uploadWallPaper","uploadDeferred","newKey","getWallPaperKey","setBackgroundDocument","addWallPaper","onResetClick","defaultTheme","blurCheckboxField","onGridClick","getWallPaperKeyFromTheme","backgrounds","uploadButton","colorButton","pattern","wallPapers","gridContainer","hasFile","isDark","dark","intensity","webkitMaskImage","themeSettings","_tempId","saveToCache","slug","hadSettings","onReady","getPixelPromise","imageUrl","imageSource","ratio","averageColorFromImageSource","averageColor","toDataURL","AppIncludedChatsTab","getContacts","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","editFolderTab","originalFilter","cmp","pinned_peers","other","otherLegacy","getInputPeerById","setFilter","onAppConfig","dialog_filters_chats_limit_premium","dialog_filters_chats_limit_default","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","selectedPeers","addedInitial","_add","flag","hasOwnProperty","AppEditFolderTab","deleting","deleteFolderButton","updateDialogFilter","bool","menuBtn","inputSection","generateList","h2Text","to","includedFlagsContainer","excludedFlagsContainer","include","include_peers","editCheckForChange","reloadMissingPromises","reloadMissingPeerIds","onEditOpen","onCreateOpen","ignoreClick","hasPeer","getDialogOnly","filtered","filterAsync","renderMore","_length","exclude_peers","purchaseUsernameCaption","purchaseText","setUsername","AppEditProfileTab","bioMaxLength","userFull","firstNameInputField","bioInputField","usernameInputField","isPurchase","availableText","takenText","invalidText","profilePromise","updateProfile","updateUsername","RIGHT_COLUMN_ACTIVE_CLASSNAME","AppSidebarRight","canHideFirst","isColumnProportionSet","toggleSidebar","setColumnProportion","createSharedMediaTab","replaceSharedMediaTab","previousTab","sharedMediaTab","historyTabIds","_selectTab","getFrom","setFrom","onCloseTab","isNavigation","willChange","animationPromise","appSidebarRight","AppEditContactTab","privacy","notificationsCheckboxField","profileNameDiv","profileSubtitleDiv","phoneRow","privacyRule","sharePhoneCheckboxField","btnDelete","deleteContacts","addContact","mediaSize","AppEditTopicTab","colorIndex","isGeneral","originalTopic","iconDiv","icon_emoji_id","setIcon","editForumTopic","topicId","iconEmojiId","createForumTopic","iconColor","onDestroy","emojiElement","icon_color","force","isMainIcon","newTopic","oldTopic","oldEl","applyFadeAnimation","fadeIn","iterations","easing","AppChatTypeTab","privateRow","publicRow","privateSection","publicContainer","chatUpdateListeners","basic","linkRow","btnRevoke","getChatInviteLink","publicSection","linkInputField","applyBtn","getValue","head","usernamesSection","getPeerEditableUsername","wasUsername","migrateChat","makeChannelPrivate","toggleNoForwards","onChatUpdate","noforwards","addChatUpdateListener","AppUserPermissionsTab","destroyListener","ChatPermissions","rights","banned_rights","editBanned","btnDeleteException","clearChannelParticipantBannedRights","kickFromChannel","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","defaultRights","combineParticipantBannedRights","restrictionText","mainFlag","until_date","AppGroupPermissionsTab","chatPermissions","editChatDefaultBannedRights","addExceptionRow","openPermissions","getChannelParticipant","setSubtitle","bannedRights","cantWhat","getPeerId","setLength","exceptionsCount","loader","setLoader","getPromise","migrateFrom","migrateTo","AppChatReactionsTab","getActiveAvailableReactions","_chatReactions","available_reactions","chatReactions","reactions","makeReactionFromEmoticons","getCaptionLangPackKey","toggleSection","reactionsSection","toggleCheckboxFieldsByEmoticons","checkboxFieldsByEmoticon","toggleCheckboxField","toggleRow","save","checkboxFields","every","saveReactionsDebounced","allow_custom","saveReactions","setChatAvailableReactions","isDebounced","AppEditChatTab","_init","canChangeType","canChangePermissions","canManageTopics","getCachedFullChat","chatNameInputField","descriptionInputField","chatTypeRow","setChatTypeSubtitle","availableReactionsLength","setReactionsLength","chatAvailableReactions","permissionsRow","setPermissionsLength","forum_upgrade_participants_min","topicsRow","setTopics","toggleForum","editTitle","editAbout","signMessagesCheckboxField","signatures","toggleSignatures","showChatHistoryCheckboxField","togglePreHistoryHidden","hidden_prehistory","historiesStorage","AppSharedMediaTab","newCloseBtn","closeBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","titleI18n","editBtn","transitionLastItem","secondTitle","setIsSharedMedia","isSharedMedia","isHeavy","onCloseBtnClick","toggleEditBtn","renderNewMessage","msgs","deleteDeletedMessages","btnAddMembers","showConfirmation","addChatUser","_renderNewMessage","getMessageThreadId","_deleteDeletedMessages","setLoadMutex","peerChanged","changeTitleKey","loadSidebarMedia","destroyable","SetTransition","raf","afterTimeout","SidebarSlider","closeTab","closingId","getMiddleware","onOpenTab","preserveTab","getTab","getHistory","isTabExists","deleteTab","doNotAppend","SliderSuperTab","_constructor","SliderSuperTabEventable","dispatchResultableEvent","SortedUserList","getIndex","getUserStatusForSort","onDelete","listEl","onListLengthChange","onUpdate","willChangeLength","onElementCreate","base","updateElementWith","updateListWith","createChatListOptions","doTimeout","updateList","SORT_INTERVAL","hasViewer","attachStickerViewerListeners","findTarget","originalFindTarget","checkForParent","closest","mediaContainer","previousGroup","_middleware","previousTransformer","doThatSticker","lockGroups","isSwitching","effectThumb","mediaRect","boxSize","fitted","aspectFitted","transformer","transformX","transformY","needFadeIn","withThumb","relativeEffect","loopEffect","firstFramePromise","prevPlayer","ready","onMousePreMove","newMediaContainer","_previousTransformer","StickyIntersector","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","elementsObserver","addSentinel","sentinel","headerSentinel","getEvent","attachGlobalListenerTo","RESET_GLOBAL","TOUCH_MOVE_OPTIONS","MOUSE_MOVE_OPTIONS","SwipeHandler","handleMove","setCursorTo","hadMove","resetValues","handleStart","isMouseDown","withDelay","xDown","yDown","eventUp","onStart","xUp","yUp","xAdded","yAdded","onSwipeResult","listenerOptions","setCursor","TelInputField","pasted","lastValue","telEl","HTMLInputElement","pixelRatio","letterSpacing","IS_ANDROID","originalFunc","formattedPhoneNumber","leftPattern","shiftKey","toastEl","hideToast","toastNew","transitions","navigation","prevTabContent","animateFirst","withAnimationListener","animationFunction","_animateFirst","onTransitionEndCallbacks","animationDeferred","listenerName","onEndEvent","overrideFrom","onTransitionEndCallback","transitionTimeout","_from","isUsernameValid","UsernameInputField","checkUsernameDebounced","checkUsername","checkUsernamePromise","checkPromise","available","UsernamesSection","CLASS_NAME","_usernames","sortedList","editable","changeActive","applyUsernames","getAll","_peerId","cancelClick","newActive","toggleUsername","reorderUsernames","VisibilityIntersector","locked","change","refreshVisible","VolumeSelector","onMuteClick","setVolume","iconIndex","ICONS","wrapCustomEmoji","repeat","wrapCustomEmojiAwaited","wrapDocument","noAutoDownload","uploadFileName","audioElement","extSplitted","ext","docDiv","icoDiv","icoTextEl","hadContext","hasThumb","performance","fileName","bytesContainer","descriptionParts","bytesMaxEl","sizeDiv","_downloadDiv","addByteProgress","sizeContainer","_bytesContainer","_d","canOpenAfter","downloadFileName","downloadId","apiFileManager","isDownloading","support","was_online","today","getDate","dateEl","timeEl","toggleMediaSpoiler","reveal","destroyAfter","onMediaSpoilerClick","wrapMediaSpoiler","wrapMediaSpoilerWithImage","wrapMessageActionTextNew","plain","hadColors","wrapJoinVoiceChatAnchor","wrapUrl","wrapLinkToMessage","savedFrom","dir","wrapSomeText","htmlToSpan","wrapTopicIcon","ns","contentSpan","gradientId","strokeColor","clone","topicAvatar","wrapMessageActionTopicIcon","wrapMessageActionTopicIconAndName","wrapMessageActionTextNewUnsafe","unsafeMessage","getNameDivHTML","formatCallDuration","post","schedule_date","daysToStart","tomorrowDate","_args","day","pinnedMessage","reply_to_mid","fetchMessageReplyTo","user_id","joined","anchorHTML","isRecurringInit","recurring_init","isRecurringUsed","recurring_used","paymentsWrapCurrencyAmount","total_amount","currency","invoiceMessage","reply_to","reply_to_peer_id","period","titleElement","authorElement","isMe","isIconChanged","isIconRemoved","isTitleChanged","isHiddenChanged","closed","waited","wrapMessageForReply","usingMids","withoutMediaType","hasAlbumKey","addPart","part","isRestricted","usingFullAlbum","grouped_id","getMidsByMessage","albumText","getAlbumText","poll","question","game","extended_media","actionWrapped","restriction_reason","exec","messageWrapped","noLinks","noTextFormat","wrapPeerTitle","wrapPhoto","withTail","noThumb","blurAfter","isImageFromDocument","startsWith","isWebDoc","isFit","renderOnLoad","canAttachPreloader","haveToDownload","onlyCache","getDownloadPromise","wrapSenderToPeer","senderTitle","fromMe","wrapSentTime","STICKER_EFFECT_MULTIPLIER","locksUrls","videosCache","wrapSticker","loadStickerMiddleware","exportLoad","needUpscale","skipRatio","asStatic","fullThumb","noPremium","isCustomEmoji","syncedVideo","stickerType","emojiSticker","animatedSticker","staticSticker","isAnimated","getStickerEffectThumb","willHaveLock","lockUrl","toneIndex","isThumbNeededForType","lottieCachedThumb","getLottieCachedThumb","haveThumbCached","afterRender","num","getPathFromBytes","getPreviewURLFromThumb","stickerThumbConverted","webpWorkerController","saveWebPConvertedStrippedThumb","getImageFromStrippedThumb","middlewareError","sync","setLockColor","skipx","skipy","imageData","sr","sg","sb","sa","outCanvas","outContext","computeLockColor","saveLottiePreview","onFirstFrame","preloadAnimatedEmojiStickerAnimation","isSingleVideo","cacheName","framesCache","cachePromise","previousTime","playedTimes","onTimeupdate","mediaLength","lastPromise","_media","preloadSticker","playing","animationDiv","stickerPromise","side","attachStickerEffectHandler","onEmojiStickerClick","getAnimatedEmojiSoundDocument","restart","getAnimatedEmojiSticker","emojiData","sendInteractionThrottled","msg_id","interaction","JSON","stringify","withRandomOffset","wrapStickerAnimation","unmountAnimation","vibrate","generateRandomSigned","randomOffsetX","randomOffsetY","setPosition","factor","stableOffsetX","stableOffsetY","rectX","rectY","addOffsetX","addOffsetY","wrapStickerEmoji","wrapStickerSetThumb","downloadOptions","getStickerSetThumbDownloadOptions","videos","getDocPromise","thumb_document_id","wrapStickerToRow","previousMedia","_size","wrapTopicNameButton","roundVideoCircumference","wrapVideo","videoSize","noAutoplayAttribute","isAlbumItem","canAutoplay","spanTime","spanPlay","needPlayButton","photoRes","divRound","halfSize","strokeDashoffset","globalVideo","onPaused","onFrame","renderDeferred","loadPhotoThumbFunc","wrapWebPageDescription","shortDescriptionText","wrapWebPageTitle","shortTitle","site_name","EmojiVersions","Emoji","version","FontFamily","FontSize","FontWeight","instances","getAnimationInstance","cancelAnimationByKey","instance","isCancelled","animateSingle","tick","createAnimationInstance","array","AudioAssetPlayer","assets","playSound","assetName","createAudio","playSoundIfDifferent","Audio","stopSound","cancelDelayedPlay","playSoundWithTimeout","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","possiblePromise","process","realResult","timedChunk","requireBlurPromise","fastBlurFunc","processBlurNext","dataUri","JPEG_HEADER","bytesFromHex","JPEG_TAIL","getPreviewBytesFromURL","needle","jpegBytes","atob","char","charCodeAt","isSticker","convertToUint8Array","dataURL","btoa","bytesToDataURL","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","getTextWidth","measureText","source","createImageBitmap","resizeWidth","resizeHeight","quality","badCharsRe","trimRe","C2L","clearBadCharsAndTrim","latinize","processSearchText","clearBadChars","ignoreCase","hasTag","includeTag","charAt","originalText","ch","latinizeCh","latinizeString","fixCyrillic","fallbackCopyTextToClipboard","textArea","removeChild","copyTextToClipboard","clipboard","writeText","ContextMenuController","diffX","diffY","isOpened","openBtnMenu","months","days","ONE_DAY","getWeekNumber","UTC","getMonth","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","formatDateAccordingToTodayNew","weekday","formatFullSentTimeRaw","formatTime","capitalize","textTransform","formatFullSentTime","getFullDate","joiner","monthAsNumber","getHours","getMinutes","noSeconds","leadingZero","noTime","minYear","yearPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","setFullYear","dayOfWeek","formatWeekLong","getDay","getDayOfWeek","setTime","g1","g2","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","T_ME","copyWhat","copyText","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","onCancel","onMove","isTouch","onTouchEnd","CLICK_EVENT_NAME","touchMouseDown","detachClickEvent","simulateClickEvent","ControlsHover","setHideTimeout","hideControlsTimeout","isShown","controlsLocked","toggleControls","relatedTarget","createContextMenu","findElement","filterButtons","onBeforeOpen","initResult","verifyFavoriteSticker","toAdd","favedStickers","_doc","disablePictureInPicture","computedStyle","getProperty","simulateEvent","childNodes","tag","requestFullScreen","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","addListener","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","getCaretPosF","childNodesLength","alt","markdownTags","entityName","underline","italic","monospace","strikethrough","mentionName","BLOCK_TAGS","BOM_REG_EXP","checkNodeForEntity","follow","getRichElementValue","selNode","selOffset","isBlock","isTableCell","wasEntitiesLength","wasLength","field","withEntities","withCaret","DocumentFragment","startOffset","startContainer","possibleChildrenFocusOffset","getCaretPos","caretPos","getViewportSlice","overflowRect","extraSize","invisibleTop","invisibleBottom","foundVisible","lookForSticky","overflowTop","overflowRight","overflowBottom","overflowLeft","sticky","windowWidth","windowHeight","handleHorizontalSwipe","cancelY","template","isSendShortcutPressed","isComposing","secondaryKey","isSwipingBackSafari","TouchEvent","placeCaretAtEnd","ignoreTouchCheck","selectionStart","selectionEnd","prevPos","backgroundImage","useCache","isImage","renderImageFromUrlPromise","renderMediaWithFadeIn","compareNodes","node1","node1Offset","node2","node2Offset","parents","commonAncestorContainer","NOT_ONLY_BOMS_REG_EXP","USING_BOMS","RichInputHandler","saveSelectionOnChange","saveRangeForElement","onFocusOut","lastNode","lastOffset","onSelectionChange","setSelectionClassName","caret","getCaretPosN","move","superMove","modify","getFiller","addInputCallback","processEmptiedFillers","fixInsertedLineBreaks","moveFirst","setEnd","isBOM","deleteData","processFilledFillers","removeEmptyTextNodes","fixBuggedCaret","savedRanges","IS_FIREFOX","inputCaptureCallbacks","anchorNode","findPreviousSmthIndex","something","fromSelectionChange","smthIndex","moved","idxidx","rangeString","onlyBOMs","restoreSavedRange","makeFocused","newCallback","sibling","needed","treeWalker","createTreeWalker","NodeFilter","SHOW_TEXT","acceptNode","FILTER_REJECT","FILTER_ACCEPT","textNode","nextNode","removePossibleBOMSiblings","removePossibleBOMSiblingsByNode","cleanSiblings","insertData","bomNode","intersectsNode","focusNode","focusNodeBefore","focusOffset","focusOffsetBefore","collapseToStart","collapseToEnd","focusNodeAfter","focusOffsetAfter","prepareApplyingMarkdown","fillers","smths","INSTANCE","Sortable","minY","elementRect","lastSiblings","siblings","property","getSortableTarget","scrollableRect","toEnd","addScrollPos","scrollPos","startScrollPos","isVertical","countNonElements","DropdownHover","onClickOut","ignoreButtons","ignoreMouseOut","toElement","willBeActive","inited","timeouts","attachButtonListener","setIgnoreMouseOut","onmouseout","onmouseover","FocusDirection","fastSmoothScroll","maxDistance","Static","scrollWithJs","getNormalSize","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","elementScrollSizeKey","scrollPositionKey","possibleElementPosition","containerSize","scrollSize","fallbackToElementStartWhenCentering","remainingPath","absPath","startAt","shortTransition","longTransition","currentPath","distanceToEnd","FILENAME_JOINER","getFileNameByLocation","thumb_size","big","stickerset","short_name","thumb_version","volume_id","local_id","strictDecimals","_decimals","dm","fixed","pow","parseFloat","CALL_DURATION_LANG_KEYS","mm","showLast","dd","formatDuration","strings","prefixes","maxPrefixLength","setPrefix","originalStr","prefixCountry","patterns","searchForPattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","symbol","FramesCache","framesNew","framesURLs","getCache","createCache","releaseCache","getCacheCounter","generateName","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","tl","tr","bl","useBlur","ignoreCache","ListLoader","loadedAllDown","setLoaded","unsetCurrent","toPrevious","goUnsafe","down","loadPromiseDown","loadPromiseUp","processedArr","processed","ListenerSetter","listeners","addManual","onceCallback","onceFired","_listener","MediaSize","aspect","aspectCovered","makeMediaSize","ScreenSize","CUSTOM_EMOJI_SIZE","ESG_CUSTOM_EMOJI_SIZE","EMOJI_STATUS_SIZE","MediaSizes","screenSizes","mobile","medium","large","handhelds","regular","album","esgSticker","documentName","invoice","extendedInvoice","customEmoji","esgCustomEmoji","popupSticker","desktop","isMobile","handleResize","innerWidth","activeScreen","wasScreen","rAF","throwWhat","numberThousandSplitter","HAVE_METADATA","useCanplayOnIos","loadEventName","errorEventName","OverlayClickHandler","withOverlay","amount","skipSymbol","isNegative","currencyData","amountExp","exp","number","dec_point","thousands_sep","isFinite","prec","sep","dec","toFixedFix","number_format","decimal_sep","space_between","symbol_left","splitter","additionalPadding","getScrollWidthFromElement","menuWidth","menuHeight","paddingRight","paddingBottom","paddingLeft","verticalSide","maxTop","maxLeft","minLeft","sides","intermediateX","intermediateY","possibleSides","platforms","getRestrictionReason","reasons","reason","savingLottiePreview","isSavingLottiePreview","saving","throttleWithRaf","fn","schedulerFn","waiting","throttleWith","ScrollableLoader","SearchListLoader","messageId","generateMessageId","filterMids","onHistoryDelete","shouldBeDeleted","onHistoryMultiappend","onMessageSent","isInner","otherSideLoader","filterMessagesByInputFilterFromStorage","goToOtherEnd","do","kind","scheduleFlush","measure","mutate","mutateElement","read","write","pushDocumentSize","_isWebDocument","replies","comments","channel_id","BatchProcessor","bindPrefix","queuePromise","addToQueue","setQueue","possibleError","perf","renderedQueue","SortedList","batchProcessor","_updateList","canUpdate","createPromise","noScheduler","encodeEntities","limitFrom","leadZero","sec_num","hours","minutes","seconds","textToSvgURL","Blob","reader","FileReader","readAsDataURL","visualViewport","innerHeight","ANIMATION_START_EVENT","ANIMATION_END_EVENT","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","_heavyAnimationPromise","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","DialogsContextMenu","onArchiveClick","editPeerFolders","folder_id","hideTopic","toggleTopic","onPinClick","toggleDialogPin","onUnmuteClick","onUnreadClick","unread_count","readHistory","top_message","markDialogUnread","onContextMenu","getDialogOrTopic","getDeleteButtonText","isDialogUnread","pinned","ConnectionStatusComponent","hadConnect","connecting","timedOut","updating","setConnectionStatus","overrideStatus","baseDcId","connectionStatus","setFirstConnectionTimeout","online","apiUpdatesManager","forceGetDifference","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","singleInstance","CHANGE_STATE_DELAY","getA","networkerFactory","forceReconnect","timerSpan","interval","forceReconnectTimeout","setStateTimeout","statusContainer","SENDING_STATUS","easeInOutSine","easeInOutSineApply","roundRect","defaultRadius","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","DPR","SIZE","MARGIN","WIDTH","RADIUS","Shimmer","currTime","diffTime","spread","pausedTime","pauseInterval","lightSource","lightSpread","currentAnimationIndex","keepTime","cycleAnimation","currentAnimation","animateGlow","animateSlide","smartInc","lightLeft","lightRight","lightCenter","createLinearGradient","customProperties","shimmerColor","addColorStop","dict","on","fillText","DialogsPlaceholder","onThemeChange","stopAnimation","startAnimation","updateCanvasSize","shimmer","generatedValues","marginVertical","totalHeight","lineHeight","lineBorderRadius","lineMarginVertical","statusWidth","getRectFrom","onRemove","blockScrollable","overflowY","availableLength","detachTime","renderDetachAnimationFrame","globalCompositeOperation","completed","elapsedRowTime","dialogHeight","renderFrame","createPattern","patternCanvas","patternContext","drawChat","firstLineWidth","secondLineWidth","marginLeft","drawCircle","drawCircleFromStart","shake","keyframes","setPromiseMiddleware","oldPromise","SortedDialogList","getDialogIndex","forumPeerId","indexKey","addListDialog","isBatch","isMainList","DialogElement","bigger","abitbigger","small","captionDiv","titleSpanContainer","peerTitlePromise","statusSpan","lastTimeSpan","rightSpan","dialogDom","setDialogActive","forumTab","createUnreadBadge","unreadBadge","badge","createUnreadAvatarBadge","unreadAvatarBadge","createMentionsBadge","mentionsBadge","toggleBadgeByKey","hasBadge","justCreated","ForumTab","init2","isFloating","toggleForumTab","createChatList","setListClickListener","xd","Some3","bindScrollable","getOptionsForMessages","fullReset","subscribeToChannelUpdates","unsubscribeFromChannelUpdates","setStatusPromise","noTyping","onChatsScroll","loadResult","setStatus","NOT_IMPLEMENTED_ERROR","Some","onChatsRegularScroll","sliceTimeout","processContact","scrollTopWas","rectContainer","rectTarget","firstY","lastY","firstElement","elementFromPoint","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialogByKey","getDialogKeyFromElement","setOffsets","offsets","getOffsetIndex","isDialogMustBeInViewport","topOffset","bottomOffset","setIndexKey","deleteDialog","getDialogKey","updateDialog","loadedDialogsAtLeastOnce","getDialogElement","setLastMessageN","setUnread","onChatsScrollTop","loadDialogs","createPlaceholder","placeholderOptions","getRectFromForPlaceholder","loadDialogsPromise","loadDialogsRenderPromise","cachedInfoPromise","chatList","getConversationsResult","loadDialogsInner","needPlaceholderAtFirstTime","isTopEnd","offsetDialog","firstDialog","lastDialog","getDialogFromElement","getDialogDom","oldTypingElement","newTypingElement","unsetTyping","paddingX","typings","topics","setUnreadMessagesN","drop","sidebarRect","currentOffsetIndex","needIndex","Some2","getUserStatus","setOnlineStatus","processDialogForCallStatus","validateDialogForFilter","getCachedDialogs","validateListForFilter","doNotRenderChatList","hasClassName","generateScrollable","getDialogIndexKey","sortedDialogList","testDialogForFilter","migratedTo","setCallStatus","callIcon","START_X","wasMounted","itemProgress","groupCallActiveIcon","call_active","call_not_empty","loadContacts","toggleAvatarUnreadBadges","sortedDialog","reuseClassNames","unreadContent","isUnreadAvatarBadgeMounted","unreadAvatarBadgeClassList","unreadBadgeClassList","AppDialogsManager","Log","menuScrollContainer","lastActiveElements","initedListeners","xds","onTabChange","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","updateContactsLength","dialogSize","verifyPeerIdForContacts","getProxiedManagers","stateMiddlewareHelper","bottomPart","forumsTabs","forumsSlider","allChatsIntlElement","isFilterIdAvailable","clearCurrent","showFiltersPromise","onStateLoaded","setFilterId","addFilter","foldersScrollable","_id","filtersNavigationItem","setFilterIdAndChangeTab","changeFiltersAllChatsKey","groupCallsController","callsController","initListeners","setFiltersUnreadCount","setFilterUnreadCount","elementThreadId","elementPeerId","onFiltersLengthChange","containerToAppend","getDialogIndexKeyByFilterId","renderedFilter","filtersArr","haveFilters","addFilters","addFiltersPromise","getNotifyPeerTypeSettings","fillConversations","unreadSpan","unread","unreadUnmutedCount","unreadCount","getFolderUnreadCount","wasShowing","generateEmptyPlaceholder","classNameType","subtitleArgs","placeholderContainer","needPlaceholder","emptyDialogsPlaceholderSubtitle","usersLength","placeholderType","updatePartClassName","updateContactsLengthPromise","newTab","hideTab","forumNavigationItem","toggleForumTabByPeerId","lastTab","isSameTab","withContext","openInner","lastActiveListElement","setPeerFunc","setLastMessage","draftMessage","draft","topMessage","isMessageRestricted","willPrepend","videoTypes","playIcon","replyTo","forum_topic","setUnreadMessages","isDialogPinned","getForumUnreadCount","hasUnmuted","isPinned","forumUnreadCount","wasMuted","unreadTopicsCount","hasUnmutedTopic","setStatusMessage","read_inbox_max_id","hasUnreadBadge","hasUnreadAvatarBadge","transitionDuration","disableAnimationIfRippleFound","iconClassName","setSendingStatus","isUnreadBadgeMounted","hasMentionsBadge","unread_mentions_count","isMentionsBadgeMounted","isBadgeMounted","unreadBadgeText","isUnread","isMention","notVisited","getDialog","originalDialog","getOutputPeer","addDialogNew","addDialogAndSetLastMessage","getMessageSenderPeerIdOrName","downloads","getNewDeferred","cancelDownload","clearDownload","getNewDeferredForUpload","getUpload","getDownload","getUploadPromise","getDownloadFileNameFromOptions","downloadMedia","promiseBefore","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","getFileNameForUpload","downloadToDisc","justAttach","pingPromise","iframe","hadProgress","getDocumentDownloadOptions","getPhotoDownloadOptions","clickEvent","createEvent","initMouseEvent","createDownloadAnchor","revokeObjectURL","partition","bad","BubbleGroup","avatarLoadPromise","avatarContainer","fwdFrom","fwdFromId","isForwardFromChannel","from_id","currentPeerId","firstTimestamp","firstItem","firstMid","lastTimestamp","lastItem","lastMid","updateClassNames","insertItem","insertInDescendSortedArray","sortGroupItemsKey","insertGroup","mount","onItemUnmount","mountItem","onItemMount","unmountItem","dateContainer","getDateContainerByTimestamp","dateGroups","_group","dateGroupsLength","unmountedLength","STICKY_OFFSET","deleteEmptyDateGroups","BubbleGroups","itemsArr","itemsMap","newGroupDiff","sortItemsKey","sortGroupsKey","removeItemFromCache","removeAndUnmountBubble","getItemByBubble","getSiblingsAtIndex","modifiedGroups","canItemsBeGrouped","groupUngrouped","mountUnmountGroups","toMount","toUnmount","getLastGroup","changeBubbleMid","insertItemToArray","changeItemBubble","changeBubbleByBubble","item1","item2","isAllMessagesForum","itemIndex","findGroupSiblingByItem","findGroupSiblingInItems","previousItem","siblingGroupedItem","nextItem","addItemToGroup","addItemToCache","getMessageFromId","viaBotId","createItem","SERVICE_AS_REGULAR","getDateForDateContainer","groupMid","splitSiblingsOnGrouping","prepareForGrouping","hadGroup","foundItem","splittedGroups","PopupDatePicker","initDate","onPick","noButtons","selectedDate","selectedMonth","minMonth","prevBtn","maxMonth","onDateClick","selectedEl","setTimeTitle","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","setMinutes","popupCenterer","timeOptions","sendDate","dateOptions","renderElement","firstDate","weekStartDate","dayIndex","clonedDate","showOverflowMonths","remainder","DivAndCaption","MEDIA_SIZE","wrapReplyDivAndCaption","mediaEl","messageMedia","isRound","mediaChildren","video_thumbs","ReplyContainer","isMediaSet","wrapReply","setColorPeerId","replyContainer","AVATAR_CLASS_NAME","AVATAR_CONTAINER_CLASS_NAME","StackedAvatars","TAG_NAME","RepliesElement","updated","postKey","leftPart","recent_repliers","stackedAvatars","read_max_id","max_id","textSpan","iconSpan","rippleContainer","subscribeRepliesThread","updateMessage","makeEdited","edited","makeSponsored","MessageRender","chatType","editedSpan","sponsoredSpan","isSponsored","sponsored","isMessage","views","postAuthor","post_author","postViewsSpan","channelViews","edit_date","edit_hide","timeSpan","clonedArgs","renderReplies","bubbleContainer","messageDiv","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","replyToPeerId","originalMessage","originalPeerTitle","titlePeerId","originalMessageFwdFromId","needUpdate","replyMid","getElementByPoint","horizontalSide","reflowScrollableElement","SEND_WHEN_ONLINE_TIMESTAMP","INTERNAL_LINK_TYPE","PopupJoinChatInvite","chatInvite","request_needed","importChatInvite","savePhoto","peopleCount","ReactionElement","reactionCount","_reactionCount","setCanRenderAvatars","canRenderAvatars","doNotRenderSticker","hadStickerContainer","getReaction","callbackify","center_icon","renderDoc","wrapPromise","wrapStickerPromise","renderCounter","displayOn","renderAvatars","recentReactions","peer_id","setIsChosen","isChosen","chosen_order","fireAroundAnimation","REACTION_INLINE_SIZE","REACTION_BLOCK_SIZE","around_animation","iconPlayer","aroundPlayer","removeOnFrame","REACTIONS_ELEMENTS","ReactionsElement","middlewareHelpers","onConnectCallback","getReactionCount","reactionElement","getMessage","isPlaceholder","changeMessage","changedResults","hasReactions","counts","reactionsEqual","totalReactions","can_see_list","recent_reactions","handleChangedResults","ScrollSaver","getSaved","findElements","replaceSaved","findAndSetElements","_save","scrollHeightMinusTop","onRestore","useReflow","setScrollTop","newScrollTop","restore","_restore","previousScrollHeightMinusTop","SuperIntersectionObserver","observing","observingQueue","freezedObservingNew","toggleObservingNew","isMentionUnread","mentioned","accumulate","stringResults","numberResults","replaceNonNumber","CARD_BRAND_REGEXP","visa","mastercard","amex","discover","diners","diners14","jcb","unionpay","elo","mir","CARD_BRANDS","minLength","cvcMaxLength","cvcMinLength","unknown","detectCardBrand","card","sanitizedCard","brand","detectUnifiedCardBrand","createArray","delta","buggedRegExp","getDistanceFromBuggedToNormal","fixBuggedNumbers","makeOptionalCharacter","consumed","makeRequiredCharacter","partial","wrapCharacterRegExpFactory","optional","_regExp","makeCharacter","makeMonthDigitPatternCharacter","digit","capitalCharacter","cleanedResult","formattingCharacter","str1","makeFormattingCharacter","optionalPattern","spaceCharacter","yearOptionalPattern","sixteenPattern","fifteenPattern","requiredPostcodes","generateFourPattern","cardFormattingPatterns","cardNumber","cardExpiry","cardCvc","cardCvcFromBrand","postalCodeFromCountry","optionalDigits","accumulateLengths","strs","nbspRegExp","makeValidationError","validateCardNumber","sanitized","getCardInfoByNumber","ignoreIncomplete","validateCompleteCardNumber","makeCardNumberError","validateCardExpiry","monthStr","yearStr","_year","nextMonth","isNaN","validateExpiry","parse","TelegramWebView","sandbox","onTelegramWebViewEvent","eventType","eventData","onMount","contentWindow","createVerificationIframe","allow","PopupPaymentVerification","openPathAfter","telegramWebView","path_full","InputFieldCorrected","lastKeyDown","lastTransformed","getPattern","pushRest","autocorrectComplete","character","getCharacter","meta","formatInputValueByPattern","formatMethod","transformedValue","validateNew","onBlur","justReturn","validateMethod","validateAnyIncomplete","errorKeys","handleInputFieldsOnChange","_onChange","createCountryZipFields","zip","countryInputField","postcodeInputField","SUPPORTED_NATIVE_PROVIDERS","PopupPaymentCard","paymentForm","savedCard","native_provider","cardOut","token","credentials","can_save_credentials","cardSection","nativeParams","native_params","lastBrand","lastBrandImg","brandIconTempId","cardInputField","invalid","incomplete","transformed","getPaymentBrandIconPath","setBrandIcon","cvcInputField","need_cardholder_name","expireInputField","switchFocusOrder","previousInputField","nextInputField","inputFieldsRow","billingSection","need_country","need_zip","canSave","saveCheckboxField","saveRow","payButton","PaymentButton","expiryFull","expiryMonth","expiryYear","cvc","cardholderName","nativeProvider","URLSearchParams","headers","publishable_key","expiration_month","expiration_year","security_code","public_token","PopupPaymentCardConfirmation","inputCheckPassword","getInputCheckPassword","tmpPassword","password","handled","PopupPaymentShipping","inputInvoice","savedInfo","saved_info","addressSection","address1InputField","address2InputField","cityInputField","stateInputField","receiverSection","emailInputField","shipping_address_requested","name_requested","email_requested","phone_requested","validateEmail","validatePhone","selectedCountry","shipping_address","street_line1","street_line2","city","country_iso2","post_code","requestedInfo","validateRequestedInfo","shippingAddress","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_CITY_INVALID","ADDRESS_STATE_INVALID","ADDRESS_POSTCODE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_EMAIL_INVALID","REQ_INFO_PHONE_INVALID","focusField","PopupPaymentShippingMethods","shippingOption","shipping_options","prices","lastShippingId","option","PopupPayment","isReceipt","tipButtonsMap","confirmed","onConfirmed","popupPaymentVerification","mediaInvoice","receipt_msg_id","isTest","itemEl","detailsClassName","photoEl","linesClassName","linesEl","botName","preloaderContainer","getPaymentReceipt","getPaymentForm","savedCredentials","saved_credentials","lastRequestedInfo","providerPeerTitle","provider_id","wrapAmount","isRecurring","recurring","peerTitle2","makeLabel","pricesClassName","makePricesElements","price","_label","wrappedAmount","pricesElements","getTipsAmount","shippingAmount","setTotal","totalAmount","totalLabel","payI18n","canTip","max_tip_amount","tip_amount","tipsClassName","getInputValue","setInputWidth","setInputValue","unsetActiveTip","tipEl","tipsLabel","haveToIgnoreEvents","ignoreNextSelectionChange","tipsEl","tipClassName","tipButtons","suggested_tip_amounts","tipAmount","prevTipEl","setRowIcon","setRowTitle","setCardSubtitle","methodRow","onMethodClick","previousCardDetails","previousToken","credentials_title","providerRow","providerAvatar","shippingAddressRow","shippingNameRow","shippingEmailRow","shippingPhoneRow","shippingMethodRow","lastShippingOption","onShippingAddressClick","onShippingMethodClick","setShippingTitle","postAddress","setShippingInfo","setShippingOption","scrollSaver","lastShippingPricesElements","shipping","acceptTermsCheckboxField","recurring_terms_url","acceptTermsRow","recurringElements","lastTmpPasword","missingInfo","tmp_password","paymentResult","sendPaymentForm","form_id","_passwordState","valid_until","tsNow","Layouter","minWidth","spacing","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","ComplexLayouter","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","RectPart","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","cropRatios","attempts","multiHeight","sum","pushAttempt","lineCounts","heights","second","third","fourth","optimalAttempt","optimalDiff","attempt","lineCount","minLineHeight","bad1","bad2","optimalCounts","optimalHeights","rowCount","colCount","col","prepareAlbum","widthItem","heightItem","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","wrapAlbum","attachmentDiv","uploading","containerHeight","hasSpoiler","itemWidth","itemHeight","AppPollResultsTab","resultsDiv","appPollsManager","getPoll","quiz","voters","total_voters","roundPercents","answer","answers","answerEl","answerTitle","answerPercents","getVotes","votesList","votes","vote","lineTotalLength","minIndex","minRemainder","maxRemainder","pollElement","isClosed","performResults","chosenIndexes","PollElement","setMaxLength","resizePolls","hideQuizHint","onHide","prevQuizHint","prevQuizHintOnHide","prevQuizHintTimeout","isListenerSet","isQuiz","isRetracted","isPublic","isMultiple","chosingIndexes","sentVote","MAX_LENGTH","MAX_OFFSET","svgLines","setLineProgress","descKey","public_voters","multiple_choice","multipleSelect","descDiv","typeDiv","avatarsDiv","close_period","close_date","timeLeftDiv","quizTimer","circumference","closeTime","quizInterval","timeLeft","getResults","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","initQuizHint","solution","solution_entities","toggleHint","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","sendVote","recent_voters","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","getPercentValue","iterate","fullTime","votersCount","rtlChars","justRtlDirCheck","IGNORE_ACTIONS","TEST_SCROLL_TIMES","TEST_SCROLL","PEER_CHANGED_ERROR","BIG_EMOJI_SIZES","BIG_EMOJI_SIZES_LENGTH","getMainMidForGrouped","ChatBubbles","unreadOut","bubblesNewByGroupedId","bubblesNew","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","messagesQueueOnRenderAdditional","firstUnreadBubble","followStack","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","renderingMessages","bubblesToEject","bubblesToReplace","setPeerTempId","renderNewPromises","extendedMediaMessages","unreadedObserverCallback","onUnreadedInViewport","viewsObserverCallback","sendViewCountersDebounced","sponsoredMessage","randomId","random_id","viewSponsoredMessage","stickerEffectObserverCallback","onBubblesMouseMove","unhoverPrevious","hoverBubble","hoverReaction","setHoverVisible","stickerWrapper","getGroupsFirstMessage","getAvailableReactionsByMessage","select_animation","sendReaction","onBubblesClick","setInnerPeer","chatInner","onDatePick","contactDiv","callDiv","callUser","getInputInvoiceByPeerId","reactionsElement","stickerEmojiEl","bubbleMid","reply_to_top_id","saved_from_msg_id","openThread","message1","getMessageWithReplies","getDiscussionMessage","via","setDraft","peerIdStr","documentDiv","groupedItem","SINGLE_MEDIA_CLASSNAME","isSingleMedia","hasAspecter","albumItem","isReplyClick","replyToMid","reply_to_msg_id","scrollDimensions","forceDown","sliceViewportDebounced","setCorrectIndexThrottled","setStickyDateManually","setPeerPromise","processBatch","loadQueue","filterQueue","avatarPromises","groupBubbles","updatePosition","timePromises","groupCollapsed","groupEnd","setUnreadDelimiter","restoreScroll","prepareToSaveScroll","ejectBubbles","oldBubble","bubbleGroups","updatePlaceholderPosition","requestHistory","setMessageId","constructBubbles","sequential","messagesStorageKey","messagesQueuePromise","newItem","_items","scrollingToBubble","scrollToEnd","deleteMessagesByIds","tempMessage","_bubble","groupedId","getMessagesByAlbum","reactionsElements","repliesElement","newDiv","safeRenderMessage","scrollToBubbleIfLast","deletedMids","wasMainMid","mainMid","createScrollSaver","appendReactionsElementToBubble","dateMessage","dateBubble","previousStickyDate","sliceViewport","setScroll","attachContainerListeners","highlightBubble","replyAfter","swipeAvatar","shouldReply","canSend","_target","_swipeAvatar","initMessageReply","constructPeerHelpers","updateGradient","setUnreadCount","updateUnreadByDialog","finishPeerChange","reloadMessages","toDelete","postViewsElements","different","postViews","incrementMessageViews","getScheduledMessagesStorage","createResizeObserver","resizeObserver","wasHeight","skip","scrolled","onResizeEnd","setEndRAF","ResizeObserver","contentRect","realDiff","_part","needScrollTop","destroyResizeObserver","setReactionsHoverListeners","getRenderedLength","readUnreaded","readPromise","idleController","bubblesMaxId","getHistoryMaxId","readContents","onGoDownClick","getBubbleByPoint","getGroupedBubble","groupId","getMidsByAlbum","findNextMountedBubbleByMsgId","filterCallback","_mid","foundMid","loadMoreHistory","getHistoryTopPromise","getHistoryBottomPromise","getHistory1","destroyScrollable","getHistoryStorage","readMaxId","readOutboxMaxId","msgId","destroyBubble","permanent","ignoreOnScroll","pollExtendedMediaMessages","getExtendedMedia","setExtendedMediaMessagesPollInterval","pollExtendedMediaMessagesPromise","setTopPadding","setPaddingTo","isPaddingNeeded","unsetPadding","newMessage","getLastBubble","performHistoryResult","scrollToBubbleEnd","scrollToBubble","isChangingHeight","messageInput","dimensions","datasetKey","createDateBubble","bubbleContent","serviceMsg","fakeBubble","bubblesToo","cleanupPlaceholders","attachedUnreadBubble","fetchNewPromise","getSponsoredMessagePromise","onAnimateLadder","resolveLadderAnimation","attachPlaceholderOnRender","emptyPlaceholderBubble","samePeer","stack","startParam","onChangePeer","getPinnedMessagesMaxId","isTarget","followingUnread","savedPosition","overrideAdditionMsgId","getChatSavedPosition","getReadMaxIdIfUnread","foundSlice","findSliceOffset","isJump","isStartButtonNeeded","setStartParam","setQueueId","messageEntityBotCommand","isBot","additionMsgId","maxBubbleId","oldChatInner","oldPlaceholderBubble","haveToScrollToBubble","fromUp","scrollFromDown","scrollFromUp","willScrollOnLoad","setPeerOptions","waitPromise","setPeerCached","mountedByLastMsgId","isPinnedMessagesNeeded","setCorrectIndex","lastBubble","onRenderScrollSet","afterSetPromise","setFetchReactionsInterval","setFetchHistoryInterval","onScrolledAllDown","isForumTopic","unread_mark","fetchReactions","getMessagesReactions","needFetchInterval","isFetchIntervalNeeded","historyMaxId","canWrite","renderMessagesQueue","isAvatarNeeded","additionalCallback","processResult","newBubble","originalPromise","renderMessage","albumMids","reactionsMessage","albumMessages","albumMustBeRenderedFull","our","isOurMessage","contentWrapper","isInUnread","ignoreAction","chat_id","is_single","messageMessage","needToSetHTML","bigEmojis","emojiEntities","strLength","curr","richText","canHaveTail","isStandaloneMedia","haveRTLChar","topicNameButtonContainer","replyMarkup","reply_markup","replyMarkupRows","containerDiv","rowDiv","buttonEl","botId","same_peer","checkSwitchReturn","switchInlineQuery","button_id","handleUrlAuth","buttonId","haveButtons","column","callbackButtonClick","callbackAnswer","messageWithReplies","getMessageWithCommentReplies","withReplies","isOutMessage","nameContainer","canHideNameIfMedia","isMessageEmpty","viewButton","processingWebPage","telegram_channel","telegram_megagroup","telegram_bot","makeViewButton","quote","previewResizer","preview","quoteTextDiv","strong","titleDiv","textDiv","isSquare","isEmoji","nopremium","newNameContainer","richTextFragment","getMidsByMid","wrapGroupedDocuments","lastContainer","contact","contactDetails","contactNameDiv","fullName","contactNumberDiv","phone_number","wrapPoll","extendedMedia","isAlreadyPaid","isNotPaid","innerMedia","wrappedPrice","priceEl","video_duration","videoTime","dc_id","file_reference","before","needName","titleVia","mustHaveName","isHidden","isForward","goto","generateTail","documentContainer","documentMessageDiv","viewportSlice","deleteViewportSlice","historyResult","needReflowScroll","setLoadedPromises","firstSlice","lastSlice","both","processLocalMessageRender","ackedResult","getScheduledMessages","animateAsLadder","additionMsgIds","isAdditionRender","targetMid","sortedMids","topIds","middleIds","bottomIds","setBubbles","lastMsDelay","elementsToAnimate","transitionDelay","topRes","middleRes","bottomRes","delays","renderEmptyPlaceholder","listElements","getRestrictionReasonText","getGreetingSticker","channel_post","start_param","chat_invite","chat_invite_hash","JOIN_CHAT","invite","processInternalLink","creator","isWaitingForAnimation","noTransition","setOn","generateLocalMessageId","addOffset","generateLocalFirstMessage","service","saveMessages","ignoreScrollSaving","invisible","checkPlaceholders","toggleSponsoredMessage","renderBotPlaceholder","checkIfEmptyPlaceholderNeeded","getSponsoredMessage","sponsoredMessages","messagePromise","_log","getProfile","processPromise","bot_info","botInfo","description_document","description_photo","isBackLimit","resultPromise","isFirstMessageRender","serviceStartMessageId","getThreadServiceMessageId","sup","_promise","mustBeCount","PopupPinMessage","unpin","canUnpin","canPinMessage","oneSide","unpinAllMessages","hidePinnedMessages","updatePinnedMessage","buttonText","getPinnedMessagesCount","pinButtonText","isSelectionEmpty","selectionRange","START_TO_END","preloadAnimatedEmojiSticker","PopupReportMessagesConfirm","reportMessages","STICKER_EMOJI","PopupReportMessages","preloadStickerPromise","marginTop","PopupSponsored","PopupReactedList","canViewReadParticipants","canViewMessageReadParticipants","loaders","hasAllReactions","createFakeReaction","hasReadParticipants","readUserIds","getMessageReadParticipants","chatlist","skipReadParticipants","skipReactionsList","getMessageReactionsListAndReadParticipants","combined","getReactionCached","allReactionsSticker","REACTIONS_CLASS_NAME","REACTION_CLASS_NAME","CAN_USE_TRANSFORM","ChatReactionsMenu","reactionsMap","players","onScrollProcessItem","reactionDiv","appear","widthContainer","reactionsContainer","reactionsScrollable","renderReaction","setVisible","canUseAnimations","scaleContainer","appearWrapper","appear_animation","selectLoadPromise","selectPlayer","REACTION_SIZE","ChatContextMenu","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","isOverBubble","isTargetAGroupedItem","viewerPeerId","canOpenReactedList","linkToMessage","getUrlToMessage","selectedMessagesText","getSelectedMessagesText","menuPadding","reactionsMenu","reactionsMenuPosition","isReactionsMenuVisible","offsetSize","nextVisiblePart","MIN_NEXT_VISIBLE_PART","minSize","onSendScheduledClick","onReplyClick","onFaveStickerClick","unfave","faveSticker","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","setButtons","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","canEditMessage","getMessageFromStorage","canSaveMessageMedia","isGoodType","hasTarget","localName","emojiInputsPromise","getUniqueCustomEmojisFromMessage","filterUnique","viewsButton","isViewingReactions","participantsCount","reactedLength","i18nElem","fakeText","AVATAR_SIZE","MAX_AVATARS","PADDING_PER_AVATAR","reactionsCount","fakeElem","readParticipants","totalSize","emojisButton","setPadding","inputsPromise","getCachedCustomEmojiDocuments","getCustomEmojiDocuments","threadMessage","SendMenu","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","setPeerId","PopupCreatePoll","onSubmitClick","send","radioLabel","isEmpty","questions","appendMoreField","correctAnswers","optionInputFields","questionInputField","sendSilent","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","getFilledAnswers","quizSolution","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","sendOther","getMessageSendingParams","helperType","clearHelper","questionField","createPosterFromMedia","getGifDuration","arrayBuffer","USELESS_REG_EXP","InputFieldAnimated","updateInnerHTML","onFakeInput","inputFake","setHeight","currentHeight","onChangeHeight","currentPopup","getCurrentNewMediaPopup","PopupNewMedia","willAttachType","ignoreInputValue","messageInputField","attachFile","willAttach","shouldCompress","itemDiv","defineNotNumerableProperties","attachMedia","attachDocument","sendFileDetails","captionMaxLength","captionLengthMax","changeType","hasAnyMedia","changeGroup","canGroupSomething","changeSpoilers","canToggleSpoilers","isMedia","wasInputValue","attachFiles","applyMediaSpoiler","removeMediaSpoiler","noAnimation","widthStr","heightStr","containerWidthStr","containerHeightStr","strippedBytes","appendDrops","mediaCount","mediaWithSpoilers","addFiles","toPush","_file","lastModified","sendingParams","sendFileParams","sendText","scaledBlob","sendAlbum","replyToMsgId","modifyMimeTypeForTelegram","scaleImageForTelegram","convertWebp","PHOTO_SIDE_LIMIT","objectURL","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onseeked","onerror","createPosterFromVideo","scaled","isPhoto","isAudio","onRender","foundPhotos","foundVideos","foundFiles","appendMediaToContainer","firstType","oldSendFileDetails","albumContainer","oldParams","HANDLE_EVENT","ACTIVE_CLASS_NAME","AXIS_Y_KEYS","AXIS_X_KEYS","attachListNavigation","waitForKey","waitForKeySet","keyNames","getCurrentTarget","setCurrentTarget","hadTarget","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","attached","resetTarget","_onKeyDown","AutocompleteHelper","onVisible","listType","attachNavigation","controller","addHelper","toggleListNavigation","fromController","skipAnimation","hideOtherHelpers","StickersHelper","onChangeScreen","checkEmoticon","getStickersByEmoticon","getMinDate","getMaxDate","PopupSchedule","canSendWhenOnline","btnSendWhenOnline","EmojiHelper","chatInput","onEmojiSelected","checkQuery","firstChar","getBothEmojiKeywords","searchEmojis","AutocompletePeerHelper","doNotShow","listElement","BASE","BASE_CLASS_LIST_ELEMENT","processPeerFullForCommands","botInfos","commands","command","indexObject","CommandsHelper","getReadyToSend","sendMessage","AutocompleteHelperController","preserveHelper","MentionsHelper","insertAtCaret","topMsgId","trimmed","getMentions","ReplyKeyboard","onBodyTouchStart","btnHover","checkAvailability","checkForceReply","touchListener","sendContact","getReplyMarkup","getHistoryStorageTransferable","InlineHelper","queryId","queryAndResultIds","generateQId","resultId","sendInlineResult","_checkQuery","botResults","query_id","gifsMasonry","isGallery","gallery","noCommands","dcId","switch_pm","btnSwitchToPM","switchToPM","ChatBotCommands","setUserId","modifyAckedResult","acked","modifyAckedPromise","ChatSendAs","sendAsButtons","previousAvatar","onSendAsMenuToggle","updateButtons","sendAsPeerId","changeSendAsPeerId","executeButtonsUpdate","sendAsPeerIds","saveDefaultSendAs","updateAvatar","getDefaultSendAs","getChannelFull","channelFull","default_send_as","updateManual","updatingPromise","wasSkippingAnimation","auto","getSendAs","sendAsPeers","sendAsPeer","premium_required","addedListener","hasMarkupInSelection","onlyFull","nodes","commonAncestor","SHOW_ELEMENT","resultBoolean","POSTING_MEDIA_NOT_ALLOWED","ChatInput","lastUrl","lastTimeType","replyElements","willSendWebPage","recordCanceled","recordStartTime","lockRedo","canRedoFromHTML","undoHistory","executedHistory","canUndoFromHTML","onCancelRecordClick","recorder","opusDecodeController","onEmoticonsOpen","toggleClass","btnToggleEmoticons","onEmoticonsClose","isUserOnlineVisible","openScheduled","prepareDocumentExecute","undoRedo","needHTML","sameHTMLTimes","currentHTML","handleMarkdownShortcut","formatKeys","markupTooltip","applyMarkdown","showLinkEditor","onMessageInput","markdownEntities","parseMarkdown","urlEntities","getWebPagePromise","appWebPagesManager","getWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","botCommands","resetCurrentFontFormatting","updateBotCommandsToggle","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","onBtnSendClick","forwarding","restricted","voice_messages_forbidden","releaseMediaPlayback","setRecording","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","ms","recordTimeEl","needReturn","getCurrentInputAsDraft","no_webpage","draftsAreEqual","onHelperClick","forwardElements","rowsWrapperWrapper","rowsWrapper","fakeRowsWrapper","fakeSelectionWrapper","goDownBtn","controlContainer","iconBtn","cancelBtn","onHideAuthorClick","isChangingAuthor","onHideCaptionClick","forwardButtons","canToggleHideAuthor","hideSender","showCaption","hideCaption","changePeer","changeForwardRecipient","forwardBtnMenu","forwardWasDroppingAuthor","replyTitle","forwardHover","modifyArgs","newMessageWrapper","replyInTopicOverlay","inputMessageContainer","goDownUnreadBadge","goMentionBtn","goMentionUnreadBadge","goToNextMention","btnScheduled","btnToggleReplyMarkup","replyKeyboard","botCommandsToggle","scaler","botCommandsIcon","attachMenuButtons","fileInput","attachMenu","attachMenuBots","appAttachMenuBotsManager","getAttachMenuBots","attachMenuBotsButtons","attachMenuBot","getAttachMenuBotIcon","requestWebView","webViewResultUrl","SANDBOX_ATTRIBUTES","verifyMap","attachMenuPeerTypeSameBotPM","attachMenuPeerTypeBotPM","attachMenuPeerTypePM","attachMenuPeerTypeChat","attachMenuPeerTypeBroadcast","peer_types","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","saveDraft","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","onstop","ondataavailable","typedArray","dataBlob","sendFile","isVoiceMessage","botStartBtn","toggleBotStartBtnDisability","startBot","pinnedControlBtn","originalChat","pinnedMessageContainer","_center","neededFakeContainer","fakeWrapperTo","oldFakeWrapperTo","fakeSelectionRect","fakeRowsRect","scale","initTranslateX","getNeededFakeContainer","isReplyInTopicOverlayNeeded","hasMentions","syncDraft","helperToo","clearInput","fromUpdate","getDraft","wrappedDraft","myEntities","apiEntities","wrapDraft","currentDraft","createSendAs","firstChange","sendAs","updateOffset","getPlaceholderKey","updateMessageInputPlaceholder","previousSendAs","ackedPeerFull","ackedScheduledMids","setSendAsCallback","filteredAttachMenuButtons","filterAttachMenuButtons","placeholderKey","hasBotCommands","updateBotCommands","updateMessageInput","haveSomethingInControl","isAnonymousSending","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","APP_TABS","CHAT","readAllHistory","commandsMap","canCombine","hasMarkup","executed","resetCurrentFormatting","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","AUTO_COMPLETE_REG_EXP","matchIndex","foundHelper","checkInlineAutocomplete","setPreloaderShow","btnPreloader","inlineMatch","bot_inline_placeholder","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","getValueAndEntities","clearReply","unicode","pushRecentEmoji","dropAuthor","dropCaptions","isDroppingCaptions","sendMessageWithDocument","hideCaptionCheckboxField","replyFragment","initMessagesForward","fromPeerIdsMids","fromPeerIds","smth","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","newReply","intl","peerTitleEl","_message","setReplyToMsgId","callerFunc","replyParent","oldReply","haveReply","CLASSNAME_BASE","PinnedContainer","floating","divAndCaption","wrapperUtils","attachOnCloseEvent","needClose","setFloating","setUtilsWidth","BAR_HEIGHTS","ChatAudio","onPlaybackParams","fasterEl","repeatEl","toggleEl","onStop","onMediaPlay","isMusic","prevEl","nextEl","attachClick","volumeProgressLineContainer","tunnel","progressWrapper","playingDetails","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","clipPathId","markTranslateY","trackTranslateY","mark","AnimatedSuper","getRow","clearRow","clearRows","currentIndex","DURATION","setNewRow","reflow","previousIndex","fromTop","ignorePrevious","previousRow","AnimatedCounter","previousNumber","getDecimal","animatedSuper","decimal","hideLeft","previousDecimalNumber","EMPTY_INDEX","setCount","previousByDecimal","decimalNumber","ChatPinnedMessage","pinnedMaxMid","pinnedMid","pinnedIndex","wasPinnedIndex","wasPinnedMediaIndex","waitForScrollBottom","loadedBottom","loadedTop","scrollDownListenerSetter","getCurrentIndexPromise","isStatic","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","setScrollDownListener","isDown","handleScrollSideEvent","refreshPosition","handleFollowingPinnedMessage","followPinnedMessage","isLast","writeTo","writeMediaTo","ChatTopbar","verifyButtons","isMenuOpen","btnMore","buttonsToVerify","menuButtons","verifyVideoChatButton","currentGroupCall","groupCall","verifyCallButton","getCachedFullUser","phone_calls_available","video_calls_available","onJoinGroupCallClick","joinGroupCall","resize","setUtilsRAF","chatUtils","chatAudio","setPeerStatusManual","btnBack","chatInfoContainer","chatInfo","person","avatarElement","deleteButtonText","btnJoin","btnPinned","btnCall","btnGroupCall","btnMute","btnSearch","pushButtonToVerify","onBtnBackClick","isFirstChat","constructUtils","linked_chat_id","onCallClick","chatContextMenuHintWasShown","contactPeerId","getAttachMenuBot","has_settings","constructAvatar","joinChannel","setMutedState","isTopMessage","hiddenPinnedMessages","byCurrent","setTitleCallback","setStatusCallback","setTitleManual","canHaveSomeButtons","wasAlreadyUsed","newPinnedMessage","AppPrivateSearchTab","appSearch","btnPickDate","ChatSearch","selectedIndex","onResultsClick","selectResult","onFooterClick","onUpClick","onDownClick","foundCountEl","upBtn","downBtn","footer","dateBtn","renderedCount","ChatBackgroundPatternRenderer","canvases","INSTANCES","renderToCanvas","fillCanvas","crossOrigin","imageBitmap","objectUrl","imageWidth","imageHeight","patternHeight","mask","centerY","topY","endY","bottomY","setCanvasDimensions","originalHeight","Chat","backgroundEl","backgroundTempId","sharedMediaTabs","setBackground","patternRenderer","gradientCanvas","previousGradientRenderer","previousPatternRenderer","previousPatternCanvas","isDarkPattern","getInstance","_gradientRenderer","setBackgroundPromise","setType","freezeObservers","beforeDestroy","cleanupBackground","destroySharedMediaTab","searchTab","_isAnyGroup","setAutoDownloadMedia","getForumTopicOrReload","isSamePeer","bubblesSetPeerPromise","photoSizeMax","videoSizeMax","fileSizeMax","photo_size_max","video_size_max","getAutoDownloadSettingsByPeerId","callbacksPromise","ignoreThreadId","historyStorageTransferable","historySerialized","MarkupTooltip","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","matchUrlProtocol","getActiveMarkupButton","currentMarkups","markup","activeButtons","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","isFirstShow","setMouseUpEvent","handleSelection","ChatDragAndDrop","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","setPath","sizeX","sizeY","disableTransition","LineBlobDrawable","maxRadius","minRadius","N","radiusNext","speed","generateBlob","radDif","generateNextBlob","amplitude","speedScale","paint","pinnedTop","progressToPinned","r1","progressNext","x1","x2","cx","y1","y2","bezierCurveTo","WeavingState","stateId","createGradient","shader","getGradientFromType","x0","y0","dt","TopbarWeave","handleDevicePixelRatioChanged","setSize","forceUpdate","resizeHandler","resizeCanvas","invokeDraw","handleFocus","focused","handleBlur","lbd","lbd1","lbd2","currentState","previousState","progressToState","lastUpdateTime","animateToAmplitude","animateAmplitudeDiff","amplitude2","animateAmplitudeDiff2","top1","top2","paint1","setCurrentState","states","componentDidMount","matchMedia","setAmplitude","componentWillUnmount","setCanvasSize","RLottieIconItemPart","playPart","RLottieIconItem","createPart","initFrame","skipFirstFrameRendering","inverseColor","onLoadForColor","onLoadForPart","getPart","RLottieIcon","startFrame","endFrame","frameCount","SuperRLottieIcon","partState","colorState","getColor","partCallback","changedPartState","changedColorState","setPartState","setColorState","prevState","renderIfPaused","invoke","GroupCallMicrophoneIcon","GROUP_CALL_MICROPHONE_BUTTON_STATE","partName","HAND","MUTED","UNMUTED","GroupCallParticipantMutedIcon","colored","GROUP_CALL_PARTICIPANT_MUTED_STATE","colorStr","MUTED_FOR_ME","MUTED_BY_ADMIN","propertyValue","getColorByMutedState","generateEqualParts","clearMutedStateModifier","GroupCallParticipantStatusElement","element2","actionClassName","GroupCallParticipantsList","getParticipantByPeerId","onElementDestroy","getGroupCallParticipantMutedState","mutedIcon","callVideoCanvasBlur","GroupCallParticipantVideoElement","setPinned","setParticipant","groupCallParticipantMutedIcon","groupCallParticipantStatus","updateParticipant","GroupCallParticipantsVideoElement","participantsElements","groupCallId","setElementDisplay","pinnedSource","pinSource","unpinAll","setInstance","shouldDisplayElement","displayPinned","shouldDisplay","hasAnyVideo","participantElements","participantVideo","getVideoElementFromParticipantByType","_onLengthChange","GroupCallParticipantContextMenu","onOpenProfileClick","PopupGroupCall","targetPeerId","toggleParticipantMuted","editParticipant","canManageCall","can_self_unmute","muted_by_you","kickFromChat","getContainer","GroupCallParticipantsElement","groupCallParticipantsVideo","appGroupCallsManager","getGroupCallParticipants","GroupCallDescriptionElement","descriptionIntl","GroupCallTitleElement","makeButton","_className","buttonDiv","isConfirm","resizeHandlerClassName","MovableElement","fixDimensions","fixPosition","addResizeHandlers","setSwipeHandler","destroyElements","handlers","startTop","startLeft","startWidth","startHeight","resizingSide","isEnlarging","resizeDiff","maxPossible","setPositionToCenter","MovablePanel","toggleMovable","movable","movableOptions","toggleClassName","raise_hand_rating","onFullScreenClick","onToggleControls","buttonsContainer","onVideoClick","btnVideo","toggleVideoSharing","onScreenClick","btnScreen","toggleScreenSharing","toggleMuted","changeRaiseHand","onLeaveClick","hangUp","discard","toggleBigLayout","btnFullScreen","btnExitFullScreen","wasFullScreen","movablePanel","videosCount","wasBig","btnInvite","btnShowColumn","toggleRightColumn","btnFullScreen2","headerInfo","newHeader","newHeaderInfo","newHeaderTitle","btnHideColumn","videosScrollable","groupCallTitle","groupCallDescription","groupCallBodyHeaderDescription","constructButtons","groupCallParticipants","updateInstance","setHasPinned","groupCallMicrophoneIcon","_makeButton","microphoneIcon","btnLeave","setDescription","microphoneButtonState","getGroupCallMicrophoneButtonState","micState","CallDescriptionElement","connectionState","connectedAt","GroupCallMicrophoneIconMini","INIT_STATE","PopupCall","resizeVideoContainers","videoContainers","interlocutorUserId","emojisSubtitle","partyStates","partyMutedState","stateText","constructFirstButtons","constructSecondButtons","wasTryingToJoin","movableElement","controlsHover","getCallInstance","firstButtonsRow","muteI18nElement","secondButtonsRow","declineI18nElement","btnDecline","btnAccept","acceptCall","createVideoContainer","isPendingIncoming","isSharingVideo","isSharingScreen","outputState","getMediaState","oldContainers","mediaState","getVideoElement","hasFrame","hasPromise","videoState","screencastState","videoContainer","output","getEmojisFingerprint","popupWidth","MAX_WIDTH_PX","MAX_HEIGHT_PX","MAX_SIZE","biggestSideSize","widthRatio","heightRatio","TopbarCall","onState","amplitudes","weave","clearCurrentInstance","currentDescription","instanceListenerSetter","isChangingInstance","callDescription","convertCallStateToGroupState","groupCallMicrophoneIconMini","throttledMuteClick","weaveContainer","uiNotificationsManager","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","faviconElements","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","novibrate","nopreview","nopush","needPush","webPushApiManager","registeredDevice","nosound","requestPermission","Notification","mozVibrate","webkitVibrate","setAppBadge","notificationsUiSupport","notifySoundEl","topMessagesDeferred","toggleToggler","peerString","soundReset","unreadUnmutedPeerIds","tokenData","unregisterDevice","registerDevice","notificationData","custom","hasChat","hasUser","buildNotification","fwdCount","peerReaction","peerTypeNotifySettings","notification","getPeerString","notificationMessage","wrappedMessage","noIncrement","notificationFromPeerId","peerPhoto","loadAvatar","resetTitle","isBlink","setFavicon","titleInterval","textBaseline","textAlign","prevFavicon","testSound","permission","appRuntimeManager","onclose","getLocalSettings","nextSoundAt","prevSoundVolume","filename","token_type","tokenType","tokenValue","other_uids","app_sandbox","secret","getFilesFromEvent","onlyTypes","scanFiles","isDirectory","directoryReader","createReader","readEntries","itemFile","getAsFile","DataTransferItem","DragEvent","dataTransfer","webkitGetAsEntry","addAnchorListener","protocol","noCancelEvent","pathnameParams","uriParams","u","host","noPathnameParams","noUriParams","parseUriParams","AppImManager","columnEl","offline","updateStatusInterval","cacheStorage","saveState","onHashChangeUnsafe","tgaddr","openUrl","postId","openUsername","userName","setSettings","messagesTextSize","forceRenderAfterSize","chatsSelectTabDebounced","toggleChatGradientAnimation","onDocumentPaste","attachType","newMediaPopup","_types","canDrag","backgroundPromises","CHATLIST","updateStatus","emojiAnimationContainer","appendEmojiAnimationContainer","createNewChat","chatsSelectTab","getPremium","compareVersion","deleteFilesIterative","applyCurrentTheme","resizeInstances","saveChatPosition","choosing","setChoosingStickerTyping","typing","onInstanceDeactivated","isUpdated","receiptMessage","onSpoilerClick","spoilerTimeout","stateStorage","topbarCall","discardCurrentCall","currentCall","setAuthorized","telegramMeWebManager","hashtag","STICKER_SET","EMOJI_SET","makeLink","INVOICE","VOICE_CHAT","USER_PHONE_NUMBER","thread","PRIVATE_POST","channel","comment","getStackFromElement","MESSAGE","attachKeydownListener","handleAutologinDomains","checkForShare","share","foundMedia","openWindow","onUrlAuthResult","urlAuthResult","botPeerTitle","logInCheckbox","allowMessagesCheckbox","request_write_access","confirmationPromise","logInChecked","allowMessagesChecked","acceptUrlAuth","onUrlAuthResultAccepted","requestUrlAuth","_appConfig","onAnchorClick","url_auth_domains","autologin_token","autologin_domains","originalUrl","searchParams","possibleBubble","timeoutOperation","requests","request","isBad","activatingChat","screen","IGNORE_KEYS","isSelectionCollapsed","getFirstMessageToEdit","getNextDialog","newEvent","KeyboardEvent","commentId","resolveChannel","op","checkChatInvite","saveApiChat","resolvePhone","getInputInvoiceBySlug","wrappedUrl","openComment","openPremiumBot","premium_bot_username","generateThreadServiceStartMessage","phone_calls_private","ignoreGroupCall","ignoreCall","discardGroupCallConfirmation","discardCallConfirmation","title1","title2","isClosing","getGroupCallFull","createGroupCall","setCurrentBackground","broadcastEvent","getBackground","getFile","lastBackgroundUrl","chatBubbles","chatPositions","backgroundUrl","attachDragAndDropListeners","drops","mediaDrops","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","PROFILE","onImTabChange","updateMyOnlineStatus","spliceChats","fromIndex","chatFrom","chatTo","chatIndex","existingIndex","oldChat","getTypingElement","eye","getPeerTyping","getPeerTypings","langPackKeys","multi","mapa","typingElement","descriptionElement","getChatStatus","typingEl","onlines","getOnlines","getPeerStatus","typingContainer","options1","options2","DialogColorsFg","DialogColors","DialogColorsMap","pic","peerParams","useBytes","bestPhotoSize","CallConnectionInstanceBase","connection","sources","createPeerConnection","config","RTCPeerConnection","signalingState","iceConnectionState","createDataChannel","dataChannel","createDescription","appendStreamToConference","streamManager","appendToConference","closeConnection","closeConnectionAndStream","stopStream","negotiate","negotiating","negotiateInternal","sendDataChannelData","parseSignalingData","sdp","parseMediaSectionInfo","fingerprint","ufrag","pwd","convertNumber","isSending","codec","ssrc","sourceGroups","ssrcGroups","sourceGroup","semantics","ssrcs","rtpExtensions","payloadTypesMap","getPayloadType","payloadType","clockrate","feedbackTypes","subtype","parameters","payloadTypes","CallConnectionInstance","localDescription","remoteDescription","descriptionInit","offerReceived","createAnswer","setLocalDescription","offer","createOffer","offerSent","initialSetup","sendCallSignalingData","crypto","subtle","P2PEncryptor","p2pKey","seqMap","concatSHA256","bufferConcats","encryptPrepared","msgKeyLarge","subarray","msgKey","aesKeyIv","prepareAesKeyIv","aesProcessCtr","encryptRawPacket","seq","ArrayBuffer","setUint32","sha256a","sha256b","iv","encryptedData","dataSize","encrypt","cryptoKey","constTimeIsDifferent","msgKeyEquals","decryptRawPacket","encryptedDataSize","decryptionBuffer","getUint32","ChromeP2PSdpBuilder","fingerprints","stringBuilder","streamName","addExtmap","addPayloadTypes","addSsrc","finalize","FirefoxP2PSdpBuilder","SafariP2PSdpBuilder","isFirefox","isSafari","extmap","j","fmtp","getOwnPropertyNames","pName","ssrcGroup","P2PSdpBuilder","sdpString","sdpMLineIndex","sdpMid","foundation","component","priority","relAddress","generation","tcpType","networkId","networkCost","candidate","generateOffer","generateAnswer","CallInstance","udp_p2p","udp_reflector","min_layer","max_layer","library_versions","createdAt","decryptQueue","candidates","canCreateConferenceEntry","setMediaState","sendMediaState","mediaStates","_sendMediaState","_connectionState","connectionInstance","sortIndex","findEntry","recvEntry","startScreenSharingInternal","wasStartingScreen","wasStartingVideo","requestScreen","stopVideoSharing","startVideoSharingInternal","requestInputSource","track","inputStream","getVideoTracks","stopTrack","isSharingVideoType","audioTrack","getAudioTracks","setHangUpTimeout","clearHangUpTimeout","hangUpTimeout","setPhoneCall","phoneCall","canAccept","overrideConnectionState","g_a_hash","appCallsManager","generateDh","dh","g_b","g_a","g_b_hash","getCallInput","phonePhoneCall","savePhonePhoneCall","joinCall","encryptionKey","configuration","iceServers","connections","ipv6","port","urls","turn","stun","credential","iceTransportPolicy","p2p_allowed","getRtcConfiguration","sendIceCandidate","onTrack","encryptor","decryptor","processDecryptQueue","createDataChannelEntry","dataChannelEntry","createEntry","sendEntry","negotiated","applyDataChannelData","TextEncoder","encode","iceCandidate","parsed","p2pParseCandidate","confirmCall","key_fingerprint","computeKey","emojisFingerprint","getEmojisFingerprintPromise","codePoints","unlockStreamManager","doTheMagic","getTransceivers","transceiver","getEntryByMid","bundle","sdpDescription","generateSdp","isAnswer","setRemoteDescription","onInputStream","stream","videoTrack","onMutedChange","requestAudioSource","setMuted","discardReason","discardedByOtherParty","hasVideo","discardCall","performCodec","_codec","setDataToDescription","setData","transport","screencast","filterNotVP8","vp8PayloadType","rtxIdx","apt","applyCallSignalingData","performSsrcGroups","getEntryBySource","sendRecvEntry","findFreeSendRecvEntry","setEntrySource","tryToReleaseCandidates","generateCandidate","RTCIceCandidate","addIceCandidate","decryptedData","TextDecoder","decode","signalingData","onUpdatePhoneCallSignalingData","getStreamCached","_cache","isScreen","constraints","getScreenStream","getStream","CallInstanceBase","fixSafariAudio","isSharingAudio","hasInputTrackKind","isAudioGood","isVideoGood","getAudioConstraints","getVideoConstraints","getScreenConstraints","endpoint","tryAddTrack","streams","saveInputVideoStream","isOutput","elementEndpoint","addTrack","useStream","outputStream","srcObject","sinkId","outputDeviceId","setSinkId","getTracks","addStream","CALL_STATE","audioAsset","CALL_REQUEST_TIMEOUT","CallsController","sortedInstances","createCallInstance","admin_id","g_a_or_b","bytesCmp","callId","getCallByUserId","hasConnected","hasCurrent","startCallInternal","fullInfo","participant_id","requestCall","GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX","GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS","GroupCallConnectionInstance","negotiateThrottled","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","invokeJoinGroupCall","localSdp","mainChannels","processedChannels","sectionInfo","payload","processMediaSection","audioChannel","videoChannel","useChannel","setEntryPeerId","performExtmap","filterServerCodecs","isNewConnection","originalOffer","iceRestart","hasMunged","skipAddingMulticast","mediaLine","mediaLineParts","localMLine","codecIds","newData","setPort","setSource","newSdp","addSsrcEntry","newChannel","mungedSdp","fixLocalOffer","entriesToDelete","shouldBeSkipped","answerDescription","deleteEntry","iceGatheringState","updateConstraints","sender","setParameters","getParameters","degradationPreference","colibriClass","defaultConstraints","onStageEndpoints","addInputVideoStream","GroupCallInstance","isSpeakingMap","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","getCachedParticipants","presentation","unpinSource","changeUserMuted","source_groups","createConnectionInstance","raise","raiseHand","stopScreenSharing","startScreenSharing","startScreenSharingPromise","saveApiParticipant","leaveGroupCallPresentation","videoPaused","videoStopped","startVideoSharing","startVideoSharingPromise","rejoin","isDiscarded","isUpdatingMeInCurrentCall","onParticipantUpdate","doNotDispatchParticipantUpdate","hasLeft","oldSsrcs","modifiedTypes","oldSsrc","oldSource","oldEntry","originalDirection","setEndpoint","createTransceiver","GROUP_CALL_STATE","makeSsrcsFromParticipant","makeSsrcFromParticipant","audio_source","generateSelfVideo","audioSource","GroupCallsController","setCurrentGroupCall","startConnectingSound","stopConnectingSound","joinVideo","MediaStream","createMainStreamManager","joinGroupCallInternal","handleUpdateGroupCallParticipants","updatingSdp","channelCount","constraint","mediaDevices","getSupportedConstraints","constraintSupported","skipAudio","frameRate","screenStream","getDisplayMedia","contentHint","getUserMedia","clientInfo","lookupAttributeKeys","telegramSourceGroups","sdpLines","rest","parseSourceGroups","raw","ConferenceEntry","addTransceiver","generateSsrc","LocalConferenceDescription","sessionId","maxSeenId","entriesByMid","entriesBySource","entriesByPeerId","getEntriesByPeerId","conference","SDP","mediaSections","splitStringByLimitWithRest","UniqueNumberGenerator","generate","maxTries","_try","SDPAttributeSplitted","SDPMediaLineParts","SDPLine","SDPAttributeInner","missed","exists","nestedMap","makeAttributes","innerParts","SDPAttributes","fillAttributes","attributesMap","linesArray","SDPMediaSection","isReceiving","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","isIncorrectSdpLine","parseSdpLine","addSimulcast","generator","originalSsrcs","ssrcs2","ssrcsStrLines","ssrc2","WEBRTC_MEDIA_PORT","fixMediaLineType","getConnectionTypeForMediaType","generateMediaFirstLine","payloadIds","connectionType","SDPBuilder","addCandidate","performCandidate","addHeader","sId","bundleMids","addTransport","skipCandidates","addSource","addMsid","isApplication","isInactive","hdrexts","hdrext","fbs","fb","addConference","AudioStreamAnalyser","streamSource","createMediaStreamSource","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","StreamManager","getAmplitude","streamAnalyser","analyse","ANALYSER_LISTENER","AudioContext","webkitAudioContext","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","substring","replaceInputAudio","oldTrack","timer","transceiverInit","tracks","mediaTrackType","trackIdx","replaceTrack","StringFromLineBuilder","newLine","addJoined","toTelegramSource","fromTelegramSource","rms","EMOJI_REG_EXP","getAbbreviation","onlyFirst","firstEmojiMatch","lastEmojiMatch","E","setBlankToAnchor","messageEntityTextUrl","messageEntityMentionName","isDraft","EMOJI_VERSIONS_SUPPORTED","inlineEl","newEmojiWidth","legacyEmojiWidth","isEmojiSupported","globalLazyLoadQueue","CustomEmojiElement","syncedPlayer","pausedElements","playersSynced","createCustomFiller","lastPausedVideo","middlewares","CustomEmojiRendererElement","clearedElements","WeakSet","isCanvasClean","emojiRenderers","getOffsets","offsetsMap","offsetParent","elementsArr","placeholders","isDimensionsSet","syncedPlayersFrames","isImageData","ImageData","frameWidth","frameHeight","lastChildWas","checkForAnyFrame","forceRenderAfter","renderEmojis","addCustomEmojis","addElements","usingOwnQueue","wrap","_loadPromises","newElements","isLottie","willHaveSyncedPlayer","newElementsArray","CUSTOM_EMOJI_INSTANT_PLAY","addition","_p","overrideRender","setRenderInterval","syncedPlayers","clearRenderInterval","missing","cachedPromises","uncachedPromisesPromise","loadFromPromises","uncached","emojiRenderInterval","renderers","nasty","usedLength","wrapSomething","wrapElement","noFiller","customWraps","contextSite","contextExternal","lastEntity","nextEntity","endPartOffset","fullEntityText","partText","usedText","fontFamily","atPos","fromBot","encodeURIComponent","isSupported","masked","currentContext","electronHelpers","contextUrl","wrapTelegramUrlToAnchor","encoded","encodeSpoiler","entityText","voodoo","insertCustomFillers","notFiller","isCustomFillerNeededBySiblingNode","url1","QueryableWorker","worker","terminate","onmessage","queryMethodListener","queryMethodArguments","postMessage","sendQuery","transfer","queryMethod","workersLimit","playersByCacheName","workers","curWorkerNum","onPlayerLoaded","reqId","fps","clamped","onPlayerError","getAnimation","setLoop","_autoplay","loadLottieWorkers","remain","Worker","queryableWorker","makeAssetUrl","loadAnimationAsAsset","loadAnimationFromURL","loadAnimationDataFromURL","blobConstruct","loadAnimationFromURLManually","loadAnimationFromURLNext","newParams","loadAnimationWorker","waitForFirstFrame","initPlayer","destroyWorkers","loadFromData","getLottiePixelRatio","RLottiePlayer","cachingDelta","CACHE","skipDelta","contexts","setMainLoop","clearPendingRAF","rafId","resetCurrentFrame","minFrame","requestFrame","applyInversing","renderFrame2","cachedSource","renderedFirstFrame","ImageBitmap","frInterval","frThen","frameNew","onLap","mainLoopForwards","mainLoopBackwards","currentMethod","frameListener","listenerResults","enterFrame","playToFrame","bounds","setMinMax","playToFrameOnFrameCallback","setInverseColor","pagesManager","pageId","pagesDiv","scrollableDiv","page","onShown","setPage","isAuthPage","Page","onFirstMount","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","unicodeSurrogates","points","getEmojiToneIndex","VIRTUAL_COUNTRIES_EMOJIS","getCountryEmoji","emojiFromCodePoints","fromCodePoint","module","exports","defineProperty","enumerable","Symbol","toStringTag","__esModule","prototype","isRecordingSupported","bufferLength","encoderApplication","encoderFrameSize","encoderPath","maxFramesPerPage","mediaTrackConstraints","resampleQuality","streamPages","wavBitDepth","encodedSamplePosition","WebAssembly","clearStream","audioContext","closeAudioContext","encodeBuffers","getChannelData","encoder","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","loadWorker","initWorker","streamPage","storePage","recordedPages","samplePosition","finish","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","setTargetAtTime","onstart","destroyWorker","Function","kSampleStepSize","float32ArraySupported","Float32Array","A","aA1","aA2","B","C","calcBezier","aT","getSlope","LinearEasing","mX1","mY1","mX2","mY2","sampleValues","aX","intervalStart","currentSample","kSplineTableSize","guessForT","initialSlope","aGuessT","currentSlope","newtonRaphsonIterate","aA","aB","currentX","currentT","binarySubdivide","getTForX"],"sourceRoot":""} \ No newline at end of file diff --git a/public/460.ecea63a28e50b5f10803.chunk.js b/public/460.ecea63a28e50b5f10803.chunk.js deleted file mode 100644 index 77574f63..00000000 --- a/public/460.ecea63a28e50b5f10803.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackChunktweb=this.webpackChunktweb||[]).push([[460],{5814:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m});var s=i(5400),n=i(3512),a=i(4762),o=i(410),r=i(8487),d=i(3772),l=i(1655),c=i(7625),h=i(2586),u=i(3013),p=i(3035);const f=new class{constructor(){this.observer=new IntersectionObserver((e=>{for(const t of e){const e=t.target;for(const i in this.byGroups){if(this.intersectionLockedGroups[i])continue;const s=this.byGroups[i].find((t=>t.el===e));if(s){if(t.isIntersecting)this.visible.add(s),this.checkAnimation(s,!1);else{this.visible.delete(s),this.checkAnimation(s,!0);const e=s.animation;e instanceof d.Z&&e.clearCache()}break}}}})),this.visible=new Set,this.overrideIdleGroups=new Set,this.byGroups={},this.byPlayer=new Map,this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,u.Z.addEventListener("play",(({doc:e})=>{"round"===e.type&&(this.videosLocked=!0,this.checkAnimations2())})),u.Z.addEventListener("pause",(()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations2())})),h.Z.addEventListener("change",(e=>{this.checkAnimations2(e)}))}setOverrideIdleGroup(e,t){t?this.overrideIdleGroups.add(e):this.overrideIdleGroups.delete(e)}getAnimations(e){const t=[];for(const i in this.byGroups)for(const s of this.byGroups[i])s.el===e&&t.push(s);return t}removeAnimation(e){const{el:t,animation:i}=e;i.remove(),i instanceof HTMLVideoElement&&a.IS_SAFARI&&setTimeout((()=>{i.src="",i.load()}),1e3);const s=this.byGroups[e.group];s&&((0,l.Z)(s,e),s.length||delete this.byGroups[e.group]),this.observer.unobserve(t),this.visible.delete(e),this.byPlayer.delete(i)}removeAnimationByPlayer(e){const t=this.byPlayer.get(e);t&&this.removeAnimation(t)}addAnimation(e,t="",i,a){var o,r,l,c;if("none"===t||this.byPlayer.has(e))return;i||(e instanceof d.Z?i=e.el[0]:e instanceof s.KZ?i=e.canvas:e instanceof s.LD?i=null!==(o=e.placeholder)&&void 0!==o?o:e:e instanceof HTMLElement&&(i=e));const h={el:i,animation:e,group:t,controlled:a};a&&"boolean"!=typeof a&&a.onClean((()=>{this.removeAnimationByPlayer(e)})),e instanceof d.Z&&!n.Z.settings.stickers.loop&&e.loop&&(e.loop=n.Z.settings.stickers.loop),(null!==(r=(l=this.byGroups)[c=t])&&void 0!==r?r:l[c]=[]).push(h),this.observer.observe(h.el),this.byPlayer.set(e,h)}checkAnimations(e,t,i,s){if(void 0!==t&&!this.byGroups[t])return;const n=void 0!==t?[t]:Object.keys(this.byGroups);for(const t of n){if(s&&this.intersectionLockedGroups[t])continue;const n=this.byGroups[t];(0,c.Z)(n,(t=>{this.checkAnimation(t,e,i)}))}}checkAnimations2(e){this.checkAnimations(e,void 0,void 0,!0)}checkAnimation(e,t,i){const{el:s,animation:n,group:a}=e;i||!this.lockedGroups[a]&&!(0,r.Z)(s)?e.controlled&&!i||this.removeAnimation(e):t||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||n instanceof HTMLVideoElement&&this.videosLocked?n.paused||n.pause():!(n.paused&&this.visible.has(e)&&n.autoplay)||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||h.Z.isIdle&&!this.overrideIdleGroups.has(e.group)||n.play()}getOnlyOnePlayableGroup(){return this.onlyOnePlayableGroup}setOnlyOnePlayableGroup(e=""){this.onlyOnePlayableGroup=e}lockGroup(e){this.lockedGroups[e]=!0}unlockGroup(e){delete this.lockedGroups[e],this.checkAnimations(void 0,e)}refreshGroup(e){const t=this.byGroups[e];(null==t?void 0:t.length)&&(t.forEach((e=>{this.observer.unobserve(e.el)})),(0,p.T2)((()=>{t.forEach((e=>{this.observer.observe(e.el)}))})))}lockIntersectionGroup(e){this.intersectionLockedGroups[e]=!0}unlockIntersectionGroup(e){delete this.intersectionLockedGroups[e],this.refreshGroup(e)}toggleIntersectionGroup(e,t){t?this.lockIntersectionGroup(e):this.unlockIntersectionGroup(e)}};o.GO&&(o.GO.animationIntersector=f);const m=f},3013:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L});var s=i(3512),n=i(3725),a=i(4762),o=i(410),r=i(6669),d=i(5432),l=i(2325),c=i(3719),h=i(8479),u=i(6848),p=i(3699),f=i(7530),m=i(493),g=i(2312),v=i(925),b=i(3241),y=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const w=(()=>{try{return a.IS_SAFARI&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(e){return!1}})();class S extends b.Z{constructor(){super(...arguments),this.media=new Map,this.scheduled=new Map,this.mediaDetails=new Map,this.waitingMediaForLoad=new Map,this.waitingScheduledMediaForLoad=new Map,this.waitingDocumentsForLoad={},this.playbackRates={voice:1,video:1,audio:1},this.seekBackward=(e,t=this.playingMedia)=>{t&&(t.currentTime=Math.max(0,t.currentTime-(e.seekOffset||10)))},this.seekForward=(e,t=this.playingMedia)=>{t&&(t.currentTime=Math.min(t.duration,t.currentTime+(e.seekOffset||10)))},this.seekTo=(e,t=this.playingMedia)=>{t&&(t.currentTime=e.seekTime)},this.onMediaDocumentLoad=e=>y(this,void 0,void 0,(function*(){const t=this.mediaDetails.get(e),i=yield this.managers.appDocsManager.getDoc(t.docId);"audio"===i.type&&i.supportsStreaming&&w&&this.handleSafariStreamable(e);const s=yield this.managers.thumbsStorage.getCacheContext(i);e.src=s.url,this.playingMedia===e&&(e.playbackRate=this.playbackRate,"audio"===i.type&&(e.loop=this.loop));const n=this.waitingDocumentsForLoad[i.id];n&&(n.delete(e),n.size||delete this.waitingDocumentsForLoad[i.id])})),this.onPlay=e=>{const t=e.target,i=this.mediaDetails.get(t),{peerId:s,mid:n}=i,a=this.pip;a&&a.pause();const o=this.getMessageByMedia(t);if(this.playingMedia!==t){this.stop(),this.setMedia(t,o);const e=e=>e.mid===n&&e.peerId===s,i=this.listLoader,a=i.getCurrent();if(!a||!e(a)){let t;for(const s of[!1,!0]){const n=i.getPrevious(s);let a=n.findIndex(e);if(-1!==a?t=-(n.length-a):(a=i.getNext(s).findIndex(e),-1!==a&&(t=a+1)),void 0!==t)break}t?this.go(t,!1):this.setTargets({peerId:s,mid:n})}}setTimeout((()=>{this.playingMedia===t&&(this.dispatchEvent("play",this.getPlayingDetails()),this.pauseMediaInOtherTabs())}),0)},this.onPause=e=>{this.dispatchEvent("pause")},this.onEnded=e=>{if(!e.isTrusted)return;this.onPause(e);const t=this.listLoader;!this.lockedSwitchers&&(this.round||!t.current||t.next.length)&&t.getNext(!0).length&&this.next()||(this.stop(),this.dispatchEvent("stop"))},this.play=()=>this.toggle(!0),this.pause=()=>this.toggle(!1),this.stop=(e=this.playingMedia)=>{if(!e)return!1;if(e.paused||e.pause(),e.currentTime=0,(0,r.Z)(e,"ended"),e===this.playingMedia){const t=this.mediaDetails.get(e);if(null==t?void 0:t.clean){e.src="";const i=t.peerId,s=t.isScheduled?this.scheduled:this.media,n=s.get(i);n&&(n.delete(t.mid),n.size||s.delete(i)),e.remove(),this.mediaDetails.delete(e)}this.playingMedia=void 0,this.playingMediaType=void 0}return!0},this.playItem=e=>{const{peerId:t,mid:i}=e,s=this.searchContext.isScheduled;this.getMedia(t,i,s).play(),setTimeout((()=>{this.resolveWaitingForLoadMedia(t,i,s)}),0)},this.go=(e,t)=>{const i=this.listLoader;if(!this.lockedSwitchers&&i)return"audio"===this.playingMediaType?i.goRound(e,t):i.go(e,t)},this.browserPlay=this.bindBrowserCallback((e=>this.toggle(!0,e))),this.browserPause=this.bindBrowserCallback((e=>this.toggle(!1,e))),this.browserStop=this.bindBrowserCallback((e=>this.stop(e))),this.browserSeekBackward=this.bindBrowserCallback(((e,t)=>this.seekBackward(t,e))),this.browserSeekForward=this.bindBrowserCallback(((e,t)=>this.seekForward(t,e))),this.browserSeekTo=this.bindBrowserCallback(((e,t)=>this.seekTo(t,e))),this.browserNext=this.bindBrowserCallback((e=>e||this.next())),this.browserPrevious=this.bindBrowserCallback((e=>e?this.seekToStart(e):this.previous())),this.next=()=>this.go(1),this.previous=()=>{if(!this.seekToStart(this.playingMedia))return this.go(-1)}}construct(e){if(this.managers=e,this.container=document.createElement("div"),this.container.style.cssText="display: none;",document.body.append(this.container),navigator.mediaSession){const e={play:this.browserPlay,pause:this.browserPause,stop:this.browserStop,seekbackward:this.browserSeekBackward,seekforward:this.browserSeekForward,seekto:this.browserSeekTo,previoustrack:this.browserPrevious,nexttrack:this.browserNext};for(const t in e)try{navigator.mediaSession.setActionHandler(t,e[t])}catch(e){console.warn("MediaSession action is not supported:",t)}}s.Z.addEventListener("document_downloaded",(e=>{const t=this.waitingDocumentsForLoad[e];if(t)for(const e of t)this.onMediaDocumentLoad(e)})),s.Z.addEventListener("media_play",(()=>{this.skipMediaPlayEvent?this.skipMediaPlayEvent=!1:!this.pause()&&this.pip&&this.pip.pause()}));const t={};["volume","muted","playbackRate","loop","round"].forEach((e=>{const i="_"+e;t[e]={get:()=>this[i],set:t=>{this[i]!==t&&(this[i]=t,!this.playingMedia||"loop"===e&&"audio"!==this.playingMediaType||"round"===e||(this.playingMedia[e]=t),"playbackRate"===e&&void 0!==this.playingMediaType&&(this.playbackRates[this.playingMediaType]=t),this.dispatchPlaybackParams())}}})),Object.defineProperties(this,t)}dispatchPlaybackParams(){this.dispatchEvent("playbackParams",this.getPlaybackParams())}getPlaybackParams(){const{volume:e,muted:t,playbackRate:i,playbackRates:s,loop:n,round:a}=this;return{volume:e,muted:t,playbackRate:i,playbackRates:s,loop:n,round:a}}setPlaybackParams(e){this.playbackRates=e.playbackRates,this._volume=e.volume,this._muted=e.muted,this._playbackRate=e.playbackRate,this._loop=e.loop,this._round=e.round}addMedia(e,t,i){const{peerId:a,mid:o}=e,r=e.pFlags.is_scheduled?this.scheduled:this.media;let d=r.get(e.peerId);d||r.set(e.peerId,d=new Map);let l=d.get(o);if(l)return l;const c=(0,f.Z)(e);d.set(o,l=document.createElement("round"===c.type||"video"===c.type?"video":"audio")),"round"===c.type&&l.setAttribute("playsinline","true");const h={peerId:a,mid:o,docId:c.id,doc:c,message:e,clean:i,isScheduled:e.pFlags.is_scheduled};this.mediaDetails.set(l,h),l.volume=1,this.container.append(l),l.addEventListener("play",this.onPlay),l.addEventListener("pause",this.onPause),l.addEventListener("ended",this.onEnded),"audio"!==c.type&&(null==e?void 0:e.pFlags.media_unread)&&e.fromId!==s.Z.myId&&l.addEventListener("timeupdate",(()=>{this.managers.appMessagesManager.readMessages(a,[o])}),{once:!0});const u=(0,n.Z)();if(t)u.resolve();else{const t=e.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let i=t.get(a);i||t.set(a,i=new Map),i.set(o,u)}return u.then((()=>y(this,void 0,void 0,(function*(){if(c.supportsStreaming||(yield this.managers.thumbsStorage.getCacheContext(c)).url)this.onMediaDocumentLoad(l);else{let e=this.waitingDocumentsForLoad[c.id];e||(e=this.waitingDocumentsForLoad[c.id]=new Set),e.add(l),g.Z.downloadMediaURL({media:c})}})))),l}getMedia(e,t,i){const s=(i?this.scheduled:this.media).get(e);return null==s?void 0:s.get(t)}handleSafariStreamable(e){e.addEventListener("play",(()=>{const t=e.currentTime;e.addEventListener("progress",(()=>{e.currentTime=e.duration-1,e.addEventListener("progress",(()=>{e.currentTime=t,e.paused||e.play()}),{once:!0})}),{once:!0})}))}resolveWaitingForLoadMedia(e,t,i){const s=i?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,n=s.get(e);if(!n)return;const a=n.get(t);a&&(a.resolve(),n.delete(t),n.size||s.delete(e))}isSafariBuffering(e){return!!e.safariBuffering}setSafariBuffering(e,t){e.safariBuffering=t}setNewMediadata(e,t=this.playingMedia){var i,s;return y(this,void 0,void 0,(function*(){if(document.pictureInPictureElement)return;yield(0,v.Z)(t,void 0,!1);const n=(0,f.Z)(e),o=[],r="voice"===n.type||"round"===n.type;let c="",h="";if(null===(i=n.thumbs)||void 0===i?void 0:i.length){const i=n.thumbs[n.thumbs.length-1];if(!i.bytes){const s=yield this.managers.thumbsStorage.getCacheContext(n,i.type);s.url?o.push({src:s.url,sizes:`${i.w}x${i.h}`,type:"image/jpeg"}):g.Z.downloadMediaURL({media:n,thumb:i}).then((()=>{this.playingMedia===t&&s.url&&this.setNewMediadata(e)}))}}else if(r){const t=e.fromId||e.peerId;yield this.managers.appPeersManager.getPeerPhoto(t),c=yield(0,m.Z)({peerId:t,plainText:!0,onlyFirstName:!1}),h=l.ZP.format("voice"===n.type?"AttachAudio":"AttachRound",!0)}if(!r){const e=n.attributes.find((e=>"documentAttributeAudio"===e._));c=null!==(s=null==e?void 0:e.title)&&void 0!==s?s:n.file_name,h=null==e?void 0:e.performer}o.length||(a.IS_APPLE?d.Z?o.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):o.push({src:"assets/img/apple-touch-icon.png",sizes:"180x180",type:"image/png"}):[72,96,144,192,256,384,512].forEach((e=>{const t=`${e}x${e}`;o.push({src:`assets/img/android-chrome-${t}.png`,sizes:t,type:"image/png"})})));const u=new MediaMetadata({title:c,artist:h,artwork:o});navigator.mediaSession.metadata=u}))}setCurrentMediadata(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);this.setNewMediadata(t,e)}getMessageByMedia(e){return this.mediaDetails.get(e).message}getPlayingDetails(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);return{doc:(0,f.Z)(t),message:t,media:e,playbackParams:this.getPlaybackParams()}}pauseMediaInOtherTabs(){this.skipMediaPlayEvent=!0,s.Z.dispatchEvent("media_play")}toggle(e,t=this.playingMedia){return!!t&&(void 0===e&&(e=t.paused),t.paused===e&&(e?t.play():t.pause(),!0))}bindBrowserCallback(e){return t=>{e(this.pip,t)}}seekToStart(e){return(null==e?void 0:e.currentTime)>5&&(e.currentTime=0,this.toggle(!0,e),!0)}willBePlayed(e){this.willBePlayedMedia=e}setSearchContext(e){return!(0,u.Z)(this.searchContext,e)&&(this.searchContext=(0,h.Z)(e),!0)}getSearchContext(){return this.searchContext}setTargets(e,t,i){let s=this.listLoader;s?s.reset():s=this.listLoader=new c.Z({loadCount:10,loadWhenLeft:5,processItem:e=>(this.addMedia(e,!1),{peerId:e.peerId,mid:e.mid}),onJump:(e,t)=>{this.playItem(e)},onEmptied:()=>{this.dispatchEvent("stop"),this.stop()}});const n=void 0===this.searchContext.folderId;t?s.setTargets(t,i,n):s.reverse=n,s.setSearchContext(this.searchContext),s.current=e,s.load(!0),s.load(!1)}getPlaybackMediaTypeFromMessage(e){const t=(0,f.Z)(e);let i="audio";return(null==t?void 0:t.type)&&("voice"===t.type||"round"===t.type?i="voice":"video"===t.type&&(i="video")),i}setMedia(e,t){const i=this.getPlaybackMediaTypeFromMessage(t);this._playbackRate=this.playbackRates[i],this.playingMedia=e,this.playingMediaType=i,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"audio"===i&&(this.playingMedia.loop=this.loop),"mediaSession"in navigator&&this.setNewMediadata(t)}setSingleMedia(e,t){const i=this.playingMedia,s=this.pause();let n;return e?(n=()=>{const e=this.pip;e&&e.pause(),this.pauseMediaInOtherTabs()},e.paused||n(),e.addEventListener("play",n)):this.pauseMediaInOtherTabs(),this.willBePlayed(void 0),e?this.setMedia(e,t):this.playingMedia=void 0,this.toggleSwitchers(!1),(t=s)=>{this.toggleSwitchers(!0),i&&(this.mediaDetails.get(i)?this.setMedia(i,this.getMessageByMedia(i)):this.next()||this.previous()),this.playingMedia===e&&(this.playingMedia=void 0,this.playingMediaType=void 0),e&&e.removeEventListener("play",n),t&&this.play()}}toggleSwitchers(e){this.lockedSwitchers=!e}setPictureInPicture(e){this.pip=e;const t=new p.Z;t.add(e)("leavepictureinpicture",(()=>{this.pip===e&&(this.pip=void 0,t.removeAll())}),{once:!0}),t.add(e)("play",(t=>{this.playingMedia!==e&&this.pause(),this.pauseMediaInOtherTabs()}))}}const C=new S;o.GO.appMediaPlaybackController=C;const L=C},1784:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L});var s=i(2341),n=i(3910),a=i(2738),o=i(8497),r=i(4668),d=i(130),l=i(4755),c=i(3719),h=i(2312),u=i(4271),p=i(3709),f=i(7530),m=i(5400),g=i(5824),v=i(5128),b=i(4524),y=i(8805),w=i(4332),S=i(1669),C=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class L extends g.Z{get searchContext(){return this.listLoader.searchContext}constructor(){let e;super(new c.Z({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:i,peerId:s}=e,n=(0,f.Z)(e);if(n&&(!t||L.isMediaCompatibleForDocumentViewer(n)))return{element:null,mid:i,peerId:s}}}),["delete","forward"]),this.onPrevClick=e=>C(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,-1)})),this.onNextClick=e=>C(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,1)})),this.onDeleteClick=()=>{const e=this.target;new v.Z(e.peerId,[e.mid],"chat",(()=>{this.target={element:this.content.media},this.close()}))},this.onForwardClick=()=>{const e=this.target;e.mid&&new b.Z({[e.peerId]:[e.mid]},(()=>this.close()))},this.onAuthorClick=e=>C(this,void 0,void 0,(function*(){const{mid:t,peerId:i}=this.target;if(t&&t!==Number.MAX_SAFE_INTEGER){const s=this.searchContext.threadId,n=yield this.getMessageByPeer(i,t);this.close(e).then((()=>C(this,void 0,void 0,(function*(){if(l.Z.isMobile){const e=w.ZP.getTab(S.Z);e&&e.close()}u.ZP.setInnerPeer({peerId:n.peerId,lastMsgId:t,type:s?"discussion":void 0,threadId:s})}))))}})),this.onDownloadClick=()=>C(this,void 0,void 0,(function*(){const{peerId:e,mid:t}=this.target,i=yield this.getMessageByPeer(e,t),s=(0,f.Z)(i);s&&h.Z.downloadToDisc({media:s,queueId:u.ZP.chat.bubbles.lazyLoadQueue.queueId})})),this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add(g.x+"-caption","spoilers-container");const t=()=>{e&&clearTimeout(e),e=window.setTimeout((()=>{e=void 0,this.content.caption.classList.remove("is-focused")}),800)};this.content.caption.addEventListener("touchstart",(()=>{l.Z.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))})),new y.ZP(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),(0,a.fc)(this.buttons.delete,this.onDeleteClick);const i=[this.btnMenuForward={icon:"forward",text:"Forward",onClick:this.onForwardClick},this.btnMenuDownload={icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick},this.btnMenuDelete={icon:"delete danger",text:"Delete",onClick:this.onDeleteClick}];this.setBtnMenuToggle(i),this.setListeners()}setListeners(){super.setListeners(),(0,a.fc)(this.buttons.forward,this.onForwardClick),(0,a.fc)(this.author.container,this.onAuthorClick);const e=t=>{const i=(0,r.Z)(t.target,"A"),s=(0,o.Z)(t.target,"spoiler");if(i instanceof HTMLAnchorElement&&(!s||this.content.caption.classList.contains("is-spoiler-visible"))){const s=i.getAttribute("onclick");if(!s||s.includes("showMaskedAlert"))return;return(0,n.Z)(t),this.close().then((()=>{this.content.caption.removeEventListener("click",e,{capture:!0}),i.click()})),!1}};this.content.caption.addEventListener("click",e,{capture:!0})}getMessageByPeer(e,t){return this.searchContext.isScheduled?this.managers.appMessagesManager.getScheduledMessageByPeer(e,t):this.managers.appMessagesManager.getMessageByPeer(e,t)}setCaption(e){const t=e.message;let i="";t&&(i=(0,m.ZP)(t,{entities:e.totalEntities})),(0,d.Z)(this.content.caption.firstElementChild,i),this.content.caption.classList.toggle("hide",!t)}setSearchContext(e){return this.listLoader.setSearchContext(e),this}openMedia(e,t,i=0,s=!1,n=[],a=[]){const o=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return C(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const r=e.mid,d=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,l=(0,f.Z)(e),c=yield this.managers.appPeersManager.noForwards(e.peerId),h="messageService"===e._,u=h||!(yield this.managers.appMessagesManager.canForward(e)),m=(h?c:u)||!(0,p.Z)(e);[[[this.buttons.forward,this.btnMenuForward],u],[[this.buttons.download,this.btnMenuDownload],m],[[this.buttons.delete,this.btnMenuDelete],!(yield this.managers.appMessagesManager.canDeleteMessage(e))]].forEach((([e,t])=>{e.forEach((e=>{e instanceof HTMLElement?e.classList.toggle("hide",t):e.verify=()=>!t}))})),this.wholeDiv.classList.toggle("no-forwards",m),this.setCaption(e);const g=o._openMedia.call(this,l,e.date,d,i,t,s,n,a,e);return this.target.mid=r,this.target.peerId=e.peerId,g}))}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||s.Z.has(e.mime_type)}}},5824:(e,t,i)=>{"use strict";i.d(t,{x:()=>Q,Z:()=>Y});var s=i(3725),n=i(4755),a=i(5432),o=i(4762),r=i(5003),d=i(3013),l=i(3910),c=i(3699),h=i(3003),u=i(5322),p=i(7529),f=i(6733),m=i(5157),g=i(7207),v=i(8427),b=i(5701),y=i(3815),w=i(925),S=i(2738);class C extends p.Z{constructor({video:e,play:t=!1,streamable:i=!1,duration:s,onPlaybackRackMenuToggle:n,onPip:a,onPipClose:o}){if(super(),this.video=e,this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.onPlaybackRackMenuToggle=n,this.onPip=a,this.onPipClose=o,this.listenerSetter=new c.Z,this.setup({element:this.wrapper,listenerSetter:this.listenerSetter,canHideControls:()=>!(this.video.paused||this.playbackRateButton&&this.playbackRateButton.classList.contains("menu-open")),showOnLeaveToClassName:"media-viewer-caption",ignoreClickClassName:"ckin__controls"}),e.parentNode.insertBefore(this.wrapper,e),this.wrapper.appendChild(e),this.skin="default",this.stylePlayer(s),this.setBtnMenuToggle(),"default"===this.skin){const t=this.wrapper.querySelector(".default__controls.ckin__controls");this.progress=new g.Z(e,i),t.prepend(this.progress.container)}t&&e.play().catch((t=>{"NotAllowedError"===t.name&&(e.muted=!0,e.autoplay=!0,e.play())})).finally((()=>{this.wrapper.classList.toggle("is-playing",!this.video.paused)}))}stylePlayer(e){const{wrapper:t,video:i,skin:s,listenerSetter:n}=this;t.classList.add(s);const o=this.buildControls();let r;if(t.insertAdjacentHTML("beforeend",o),"default"===s){this.playbackRateButton=this.wrapper.querySelector(".playback-rate"),this.pipButton=this.wrapper.querySelector(".pip");const e=t.querySelectorAll(".toggle"),s=t.querySelector(".fullscreen"),o=t.querySelector("#time-elapsed");r=t.querySelector("#time-duration"),r.textContent=(0,m.Z)(0|i.duration);const c=new v.Z(n),h=t.querySelector(".left-controls");if(c.btn.classList.remove("btn-icon"),h.insertBefore(c.btn,o.parentElement),Array.from(e).forEach((e=>{(0,S.fc)(e,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter})})),this.pipButton){(0,S.fc)(this.pipButton,(()=>{this.video.requestPictureInPicture()}),{listenerSetter:this.listenerSetter});const e=e=>{this.wrapper.style.visibility=e?"hidden":"",this.onPip&&this.onPip(e)},t=20,s=(0,b.Z)(e,t,!1,!0);n.add(i)("enterpictureinpicture",(()=>{s(!0),n.add(i)("leavepictureinpicture",(()=>{const e=n.add(i)("pause",(()=>{clearTimeout(s),this.onPipClose&&this.onPipClose()}),{once:!0}),s=setTimeout((()=>{n.remove(e)}),t)}),{once:!0})})),n.add(i)("leavepictureinpicture",(()=>{s(!1)}))}a.Z||((0,S.fc)(i,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter}),n.add(document)("keydown",(e=>{if(y.Z.overlaysActive>1||document.pictureInPictureElement===i)return;const{key:s,code:n}=e;let a=!0;if("KeyF"===n)this.toggleFullScreen();else if("KeyM"===n)d.Z.muted=!d.Z.muted;else if("Space"===n)this.togglePlay();else if(!e.altKey||"Equal"!==n&&"Minus"!==n)!t.classList.contains("ckin__fullscreen")||"ArrowLeft"!==s&&"ArrowRight"!==s?a=!1:"ArrowLeft"===s?d.Z.seekBackward({action:"seekbackward"}):d.Z.seekForward({action:"seekforward"});else{const e="Equal"===n?1:-1,t=d.Z.playbackRate,i=C.PLAYBACK_RATES.indexOf(t)+e;i>=0&&i{a.Z||this.toggleFullScreen()})),(0,S.fc)(s,(()=>{this.toggleFullScreen()}),{listenerSetter:this.listenerSetter}),(0,f.Ms)(t,this.onFullScreen.bind(this,s),n),n.add(i)("timeupdate",(()=>{o.textContent=(0,m.Z)(0|i.currentTime)})),n.add(i)("play",(()=>{t.classList.add("played"),a.Z||n.add(i)("play",(()=>{this.hideControls(!0)}))}),{once:!0}),n.add(i)("pause",(()=>{this.showControls(!1)})),n.add(d.Z)("playbackParams",(()=>{this.setPlaybackRateIcon()}))}n.add(i)("play",(()=>{t.classList.add("is-playing")})),n.add(i)("pause",(()=>{t.classList.remove("is-playing")})),i.duration||e?r.textContent=(0,m.Z)(Math.round(i.duration||e)):(0,w.Z)(i).then((()=>{r.textContent=(0,m.Z)(Math.round(i.duration))}))}togglePlay(){this.video[this.video.paused?"play":"pause"]()}buildControls(){const e=this.skin;if("default"===e)return`\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n ${!o.IS_MOBILE&&document.pictureInPictureEnabled?``:""}\n \n
\n
\n
`}setBtnMenuToggle(){const e=C.PLAYBACK_RATES.map(((e,t)=>({regularText:e+"x",onClick:()=>{d.Z.playbackRate=e}}))),t=(0,h.b)({buttons:e});t.classList.add("top-left"),(0,u.v)({el:this.playbackRateButton,onOpen:this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!0)}:void 0,onClose:this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!1)}:void 0}),this.playbackRateButton.append(t),this.setPlaybackRateIcon()}setPlaybackRateIcon(){const e=this.playbackRateButton;C.PLAYBACK_RATES_ICONS.forEach((t=>{t="tgico-"+t,e.classList.remove(t)}));let t=C.PLAYBACK_RATES.indexOf(d.Z.playbackRate);-1===t&&(t=C.PLAYBACK_RATES.indexOf(1)),e.classList.add("tgico-"+C.PLAYBACK_RATES_ICONS[t])}toggleFullScreen(){const e=this.wrapper;if(o.IS_APPLE_MOBILE){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}(0,f.rB)()?(0,f.C8)():(0,f.Dj)(e)}onFullScreen(e){const t=(0,f.rB)();this.wrapper.classList.toggle("ckin__fullscreen",t),t?(e.classList.remove("tgico-fullscreen"),e.classList.add("tgico-smallscreen"),e.setAttribute("title","Exit Full Screen")):(e.classList.remove("tgico-smallscreen"),e.classList.add("tgico-fullscreen"),e.setAttribute("title","Full Screen"))}cleanup(){super.cleanup(),this.listenerSetter.removeAll(),this.progress.removeListeners(),this.onPlaybackRackMenuToggle=this.onPip=void 0}}C.PLAYBACK_RATES=[.5,1,1.5,2],C.PLAYBACK_RATES_ICONS=["playback_05","playback_1x","playback_15","playback_2x"];var L=i(3512),E=i(5814),I=i(9331),M=i(2230),P=i(3442),Z=i(3757),T=i(632),k=i(6385),x=i(8497),A=i(6740),_=i(8204),F=i(9171),D=i(5565),R=i(3035),B=i(65),N=i(241),O=i(3241),U=i(1507),H=i(7660),z=i(8580),j=i(1713),G=i(8115),V=i(4421),K=i(2312),W=i(7362),$=i(2796),q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Q="media-viewer";class Y extends O.Z{get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}constructor(e,t){super(!1),this.listLoader=e,this.author={},this.content={},this.buttons={},this.tempId=0,this.preloader=null,this.preloaderStreamable=null,this.isFirstOpen=!0,this.pageEl=document.getElementById("page-chats"),this.zoomElements={},this.zoomSwipeStartX=0,this.zoomSwipeStartY=0,this.zoomSwipeX=0,this.zoomSwipeY=0,this.setZoomValue=(e=this.zoomElements.rangeSelector.value)=>{1===e&&(this.zoomSwipeX=0,this.zoomSwipeY=0),this.moversContainer.style.transform=`matrix(${e}, 0, 0, ${e}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`,this.zoomElements.btnOut.classList.toggle("inactive",.5===e),this.zoomElements.btnIn.classList.toggle("inactive",4===e),this.toggleZoom(1!==e)},this.onClick=e=>{if(this.setMoverAnimationPromise)return;const t=e.target;if("A"===t.tagName)return;if((0,l.Z)(e),a.Z)return this.highlightSwitchersTimeout?clearTimeout(this.highlightSwitchersTimeout):this.wholeDiv.classList.add("highlight-switchers"),void(this.highlightSwitchersTimeout=window.setTimeout((()=>{this.wholeDiv.classList.remove("highlight-switchers"),this.highlightSwitchersTimeout=0}),3e3));const i=this.isZooming();let s=null;const n=["ckin__player","media-viewer-buttons","media-viewer-author","media-viewer-caption","zoom-container"];i&&n.push("media-viewer-movers"),n.find((e=>{try{if(s=(0,x.Z)(t,e),s)return!0}catch(e){return!1}})),s&&(i||"IMG"!==t.tagName&&"image"!==t.tagName)||this.close()},this.onKeyDown=e=>{if(y.Z.overlaysActive>1)return;const t=e.key;let i=!0;"ArrowRight"===t?this.buttons.next.click():"ArrowLeft"===t?this.buttons.prev.click():"-"===t||"="===t?this.ctrlKeyDown&&this.changeZoom("="===t):i=!1,(e.ctrlKey||e.metaKey)&&(this.ctrlKeyDown=!0),i&&(0,l.Z)(e)},this.onKeyUp=e=>{y.Z.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming()&&this.setZoomValue())},this.onWheel=e=>{if(!(y.Z.overlaysActive>1||(0,x.Z)(e.target,"media-viewer-caption")&&!this.ctrlKeyDown)&&((0,l.Z)(e),this.ctrlKeyDown)){const t=e.deltaY<0;this.changeZoom(!!t)}},this.managers=L.Z.managers,this.log=(0,r.kg)("AMV"),this.preloader=new P.Z,this.preloaderStreamable=new P.Z({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new V.Z,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add(Q+"-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const i=document.createElement("div");i.classList.add(Q);const s=this.topbar=document.createElement("div");s.classList.add(Q+"-topbar",Q+"-appear");const n=document.createElement("div");n.classList.add(Q+"-topbar-left"),this.buttons["mobile-close"]=(0,M.Z)("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add(Q+"-author","no-select");const o=document.createElement("div");this.author.avatarEl=new I.Z,this.author.avatarEl.classList.add(Q+"-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add(Q+"-name"),this.author.date=document.createElement("div"),this.author.date.classList.add(Q+"-date"),o.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,o);const d=document.createElement("div");d.classList.add(Q+"-buttons"),t.concat(["download","zoom","close"]).forEach((e=>{const t=(0,M.Z)(e,{noRipple:!0});this.buttons[e]=t,d.append(t)})),this.buttons.zoom.classList.add("zoom-in"),this.zoomElements.container=document.createElement("div"),this.zoomElements.container.classList.add("zoom-container"),this.zoomElements.btnOut=(0,M.Z)("zoomout",{noRipple:!0}),(0,S.fc)(this.zoomElements.btnOut,(()=>this.changeZoom(!1))),this.zoomElements.btnIn=(0,M.Z)("zoomin",{noRipple:!0}),(0,S.fc)(this.zoomElements.btnIn,(()=>this.changeZoom(!0))),this.zoomElements.rangeSelector=new B.Z({step:.5,min:.5,max:4,withTransition:!0},1),this.zoomElements.rangeSelector.setListeners(),this.zoomElements.rangeSelector.setHandlers({onScrub:this.setZoomValue,onMouseUp:()=>this.setZoomValue()}),this.zoomElements.container.append(this.zoomElements.btnOut,this.zoomElements.rangeSelector.container,this.zoomElements.btnIn),this.wholeDiv.append(this.zoomElements.container),this.content.main=document.createElement("div"),this.content.main.classList.add(Q+"-content"),this.content.container=document.createElement("div"),this.content.container.classList.add(Q+"-container"),this.content.media=document.createElement("div"),this.content.media.classList.add(Q+"-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),i.append(this.content.main),this.overlaysDiv.append(i),n.append(this.buttons["mobile-close"],this.author.container),s.append(n,d),this.buttons.prev=document.createElement("div"),this.buttons.prev.className=`${Q}-switcher ${Q}-switcher-left`,this.buttons.prev.innerHTML=``,this.buttons.next=document.createElement("div"),this.buttons.next.className=`${Q}-switcher ${Q}-switcher-right`,this.buttons.next.innerHTML=``,this.moversContainer=document.createElement("div"),this.moversContainer.classList.add(Q+"-movers"),this.wholeDiv.append(this.overlaysDiv,this.buttons.prev,this.buttons.next,this.topbar,this.moversContainer),this.listLoader.onLoadedMore=()=>{this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length)},this.setNewMover()}setListeners(){(0,S.fc)(this.buttons.download,this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach((e=>{(0,S.fc)(e,this.close.bind(this))})),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach((([e,t])=>{t.addEventListener("click",(t=>{(0,l.Z)(t),this.setMoverPromise||this.listLoader.go(e)}))})),(0,S.fc)(this.buttons.zoom,(()=>{this.isZooming()?this.toggleZoom(!1):this.changeZoom(!0)})),this.wholeDiv.addEventListener("click",this.onClick),this.listLoader.onJump=(e,t)=>{t?this.onNextClick(e):this.onPrevClick(e)},a.Z&&new Z.Z({element:this.wholeDiv,onSwipe:(e,t)=>{if(!(0,f.rB)())return Math.abs(e)/N.Z.width>.2||e>125?(e>0?this.buttons.prev.click():this.buttons.next.click(),!0):(Math.abs(t)/N.Z.height>.2||t>125)&&(this.close(),!0)},verifyTouchTarget:e=>(console.log("verify"),"INPUT"!==e.target.tagName&&!(0,x.Z)(e.target,"media-viewer-caption"))})}toggleZoom(e){const t=this.isZooming();if((this.zoomElements.rangeSelector.mousedown||this.ctrlKeyDown)&&(e=!0),t===e)return;void 0===e&&(e=!t),this.buttons.zoom.classList.toggle("zoom-in",!e),this.zoomElements.container.classList.toggle("is-visible",e);const i=e?this.zoomElements.rangeSelector.value:1;if(this.setZoomValue(i),this.zoomElements.rangeSelector.setProgress(i),this.videoPlayer&&this.videoPlayer.lockControls(!e&&void 0),e){if(this.zoomSwipeHandler)this.zoomSwipeHandler.setListeners();else{let e,t;const i=1;this.zoomSwipeHandler=new Z.Z({element:this.moversContainer,onFirstSwipe:()=>{e=t=0,this.moversContainer.classList.add("no-transition")},onSwipe:(s,n)=>{[s,n]=[s*i,n*i],this.zoomSwipeX+=s-e,this.zoomSwipeY+=n-t,[e,t]=[s,n],this.setZoomValue()},onReset:()=>{this.moversContainer.classList.remove("no-transition")},cursor:"move"})}this.zoomElements.rangeSelector.setProgress(i)}else e||this.zoomSwipeHandler.removeListeners()}changeZoom(e){this.zoomElements.rangeSelector.addProgress(.5*(e?1:-1)),this.setZoomValue()}isZooming(){return this.zoomElements.container.classList.contains("is-visible")}setBtnMenuToggle(e){const t=(0,u.Z)({buttonOptions:{onlyMobile:!0},direction:"bottom-left",buttons:e});this.topbar.append(t)}close(e){var t;if(e&&(0,l.Z)(e),this.setMoverAnimationPromise)return Promise.reject();this.navigationItem&&k.Z.removeItem(this.navigationItem),this.lazyLoadQueue.clear();const i=this.setMoverToTarget(null===(t=this.target)||void 0===t?void 0:t.element,!0).then((({onAnimationEnd:e})=>e));return this.listLoader.reset(),this.listLoader.cleanup&&this.listLoader.cleanup(),this.setMoverPromise=null,this.tempId=-1,window.appMediaViewer===this&&(window.appMediaViewer=void 0),this.removeGlobalListeners(),this.zoomSwipeHandler=void 0,i.finally((()=>{this.wholeDiv.remove(),this.toggleOverlay(!1)})),i}toggleOverlay(e){y.Z.isOverlayActive=e,E.Z.checkAnimations2(e)}toggleGlobalListeners(e){e?this.setGlobalListeners():this.removeGlobalListeners()}removeGlobalListeners(){this.zoomSwipeHandler&&this.zoomSwipeHandler.removeListeners(),window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp),window.removeEventListener("wheel",this.onWheel,{capture:!0})}setGlobalListeners(){this.isZooming()&&this.zoomSwipeHandler.setListeners(),window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp),a.Z||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0})}setMoverToTarget(e,t=!1,i=0){return q(this,void 0,void 0,(function*(){this.dispatchEvent("setMoverBefore");const n=this.content.mover;t||(n.innerHTML="");const a=this.isZooming()&&t?this.zoomElements.rangeSelector.value:1;this.removeCenterFromMover(n);const o=0!==i,r=L.Z.settings.animationsEnabled?o?350:200:0;let d,l;e&&(e instanceof I.Z||e.classList.contains("grid-item")?(d=e,l=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(d=(0,x.Z)(e,"attachment"),l=d.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(d=(0,x.Z)(e,"profile-avatars-container"),l=d.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==l.left&&(e=d=l=void 0))),e||(e=this.content.media),l||(d=e.parentElement,l=e.getBoundingClientRect());let c=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const i=(0,x.Z)(d,"scrollable"),s=(0,_.Z)(d,i,!0);!t||s&&2!==s.overflow.vertical&&2!==s.overflow.horizontal?!s||1!==s.overflow.vertical&&1!==s.overflow.horizontal||(c=!0):(d=(e=this.content.media).parentElement,l=e.getBoundingClientRect())}const h=this.content.media.getBoundingClientRect();let u,p,f,m="";if(o?(u=1===i?N.Z.width:-h.width,p=h.top):(u=l.left,p=l.top),m+=`translate3d(${u}px,${p}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(n.firstElementChild&&n.firstElementChild.classList.contains("media-viewer-aspecter")){f=n.firstElementChild;const e=f.querySelector(".ckin__player");if(e){const t=e.firstElementChild;f.append(t),e.remove()}f.style.cssText||(n.classList.remove("active"),this.setFullAspect(f,h,l),n.offsetLeft,n.classList.add("active"))}else f=document.createElement("div"),f.classList.add("media-viewer-aspecter"),n.prepend(f);f.style.cssText=`width: ${l.width}px; height: ${l.height}px; transform: scale3d(${h.width/l.width}, ${h.height/l.height}, 1);`}n.style.width=h.width+"px",n.style.height=h.height+"px";const g=l.width/h.width,v=l.height/h.height;o||(m+=`scale3d(${g},${v},1) `);let b=window.getComputedStyle(d).getPropertyValue("border-radius");const y=function(e){const t=e.split(" ");if(4!==t.length){t[0]||(t[0]="0px");for(let e=t.length;e<4;++e)t[e]=t[e%2]||t[0]||"0px"}return t}(b);if(b=y.map((e=>parseInt(e)/g+"px")).join(" "),o||(n.style.borderRadius=b),t&&1!==a){const e=N.Z.width/2-l.width/2,t=N.Z.height/2-l.height/2,i=l.left-e,s=l.top-t;this.moversContainer.style.transform=`matrix(${g}, 0, 0, ${v}, ${i}, ${s})`}else n.style.transform=m;let w;c&&(n.style.opacity="0");const S=e.classList.contains("is-out"),C=this.setMoverAnimationPromise=(0,s.Z)(),E={onAnimationEnd:C},M=setTimeout((()=>{C.isFulfilled||C.isRejected||C.resolve()}),1e3);if(C.finally((()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===C&&(this.setMoverAnimationPromise=null),clearTimeout(M)})),t)return e instanceof SVGSVGElement&&(w=n.querySelector("path"),w&&this.sizeTailPath(w,h,g,r,!1,S,b)),e.classList.contains("media-viewer-media")&&n.classList.add("hiding"),this.toggleWholeActive(!1),setTimeout((()=>{n.style.borderRadius=b,n.firstElementChild&&(n.firstElementChild.style.borderRadius=b)}),r/2),setTimeout((()=>{n.innerHTML="",n.classList.remove("moving","active","hiding"),n.style.cssText="display: none;",C.resolve()}),r),n.classList.remove("opening"),E;{let t,i;const s="video, img, .canvas-thumbnail",a=e.matches(s)?e.parentElement:e,r=Array.from(a.querySelectorAll(s));if(r.length){e=r.pop();const t=document.createElement("canvas"),i=t.getContext("2d");e instanceof HTMLImageElement?(t.width=e.naturalWidth,t.height=e.naturalHeight):e instanceof HTMLVideoElement?(t.width=e.videoWidth,t.height=e.videoHeight):e instanceof HTMLCanvasElement&&(t.width=e.width,t.height=e.height),t.className="canvas-thumbnail thumbnail media-photo",i.drawImage(e,0,0),e=t}if("DIV"===e.tagName||"AVATAR-ELEMENT"===e.tagName){const s=Array.from(e.querySelectorAll("img")).pop();s&&(t=new Image,i=s.src,n.append(t))}else if(e instanceof HTMLImageElement)t=new Image,i=e.src;else if(e instanceof HTMLVideoElement)t=(0,H.Z)(),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,i=t+"-mv",{width:s,height:a}=h,o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttributeNS(null,"width",""+s),o.setAttributeNS(null,"height",""+a),o.setAttributeNS(null,"viewBox",`0 0 ${s} ${a}`),o.setAttributeNS(null,"preserveAspectRatio","xMidYMid meet"),o.insertAdjacentHTML("beforeend",e.firstElementChild.outerHTML.replace(t,i)),o.insertAdjacentHTML("beforeend",e.lastElementChild.outerHTML.replace(t,i));const r=o.firstElementChild,d=r.firstElementChild.firstElementChild;if(d instanceof SVGUseElement){let e,t=d.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,((e,t,i,n,o)=>`translate(${t=2!=(t=+t)?s-2/g:2/g}, ${a}) scale(${+n/g}, ${+o/v})`)),d.setAttributeNS(null,"transform",t),w=r.firstElementChild.lastElementChild;const i=b.split(" ").map((e=>parseInt(e)));e=S?(0,F.Z)(0,0,s-9/g,a,...i):(0,F.Z)(9/g,0,s-9/g,a,...i),w.setAttributeNS(null,"d",e)}const l=o.lastElementChild;l.setAttributeNS(null,"width",""+h.width),l.setAttributeNS(null,"height",""+h.height),n.prepend(o)}else e instanceof HTMLCanvasElement&&(t=e);f&&(f.style.borderRadius=b,t&&f.append(t)),t=n.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),f||(t.style.width=h.width+"px",t.style.height=h.height+"px"),i&&(yield(0,A.cj)(t,i))),n.style.display="",(0,R.T2)((()=>{n.classList.add(o?"moving":"active")}))}return n.classList.add("opening"),yield(0,R.d1)(),n.style.transform=`translate3d(${h.left}px,${h.top}px,0) scale3d(1,1,1)`,c&&(n.style.opacity=""),f&&this.setFullAspect(f,h,l),setTimeout((()=>{n.style.borderRadius="",n.firstElementChild&&(n.firstElementChild.style.borderRadius="")}),0),n.dataset.timeout=""+setTimeout((()=>{n.classList.remove("moving","opening"),f&&(n.querySelector("video"),n.classList.remove("active"),f.style.cssText="",n.offsetLeft),n.classList.add("center","no-transition"),n.classList.add("active"),delete n.dataset.timeout,C.resolve()}),r),w&&this.sizeTailPath(w,h,g,r,!0,S,b),E}))}toggleWholeActive(e){e?this.wholeDiv.classList.add("active"):(this.wholeDiv.classList.add("backwards"),setTimeout((()=>{this.wholeDiv.classList.remove("active")}),0))}setFullAspect(e,t,i){const s=t.width/t.height;let{width:n,height:a}=i;s>0?n=a*s:a=n*s,e.style.cssText=`width: ${n}px; height: ${a}px; transform: scale3d(${t.width/n}, ${t.height/a}, 1);`}sizeTailPath(e,t,i,s,n,a,o){const r=Date.now(),{width:d,height:l}=t;s/=2;const c=o.split(" ").map((e=>parseInt(e))),h=()=>{const t=Date.now()-r;let o=s?t/s:1;o>1&&(o=1),n&&(o=1-o);const u=c.map((e=>e*o));let p;p=a?(0,F.Z)(0,0,d-9/i*o,l,...u):(0,F.Z)(9/i*o,0,d,l,...u),e.setAttributeNS(null,"d",p),t{const a=t?-s.width:i;return e.replace(n,a+"px")}));e.style.transform=n,setTimeout((()=>{e.remove()}),350)}setNewMover(){const e=document.createElement("div");return e.classList.add("media-viewer-mover"),e.style.display="none",this.content.mover?this.content.mover.parentElement.append(e):this.moversContainer.append(e),this.content.mover=e}updateMediaSource(e,t,i){const s=e.tagName.toLowerCase()===i?e:e.querySelector(i);if(s&&!(0,x.Z)(e,"document")){if((0,x.Z)(e,"attachment")){const t=e.parentElement.parentElement.querySelector(".preloader-container");if(t){if("video"===i)return void(t.classList.contains("manual")&&t.click());t.remove()}}s.src!==t&&(0,A.ZP)(s,t),s.classList.contains("thumbnail")&&s.parentElement.classList.contains("media-container-aspecter")&&s.classList.remove("thumbnail")}}setAuthorInfo(e,t){const i=e.isPeerId();let s;if(i)s=(0,W.Z)({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1});else{const t=s=document.createElement("span");t.append((0,G.Z)(e)),t.classList.add("peer-title")}const n=this.author.avatarEl,a=this.author.avatarEl=n.cloneNode();return Promise.all([this.author.avatarEl.updateWithOptions({peerId:e||U.NM,peerTitle:i?void 0:""+e}),s]).then((([e,i])=>{this.author.avatarEl===a&&((0,D.Z)(this.author.date,(0,T.OD)(t)),(0,D.Z)(this.author.nameEl,i),n.replaceWith(this.author.avatarEl))}))}_openMedia(e,t,i,s,a,r=!1,c=[],h=[],u){return q(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const p=this.setAuthorInfo(i,t),f="document"===e._,m=f&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(c,h,r),window.appMediaViewer=this),this.listLoader.next.length<10&&setTimeout((()=>{this.listLoader.load(!0)}),0),this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length);const g=this.content.media,v=!a||a===g;v&&(a=g),this.target={element:a};const b=++this.tempId;g.firstElementChild&&(g.innerHTML=""),0!==s?(this.moveTheMover(this.content.mover,1===s),this.setNewMover()):(this.toggleOverlay(!0),this.setGlobalListeners(),yield p,this.wholeDiv.parentElement||(this.pageEl.insertBefore(this.wholeDiv,document.getElementById("main-columns")),this.wholeDiv.offsetLeft),this.toggleWholeActive(!0),o.IS_MOBILE_SAFARI||(this.navigationItem={type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}},k.Z.pushItem(this.navigationItem)));const y=this.content.mover,w=N.Z.width;let S=0;const L=N.Z.height;L<1e6&&!n.Z.isMobile&&(S=120);const E=L-120-S;let I=Promise.resolve();const M=(0,j.Z)(e,g,w,E,!n.Z.isMobile,void 0,!!(f&&e.w&&e.h)).photoSize;if(v){const t=yield this.managers.thumbsStorage.getCacheContext(e,M.type);let i;if(t.downloaded)i=new Image,i.src=t.url;else{const s=(0,z.Z)(e,t,!0);s&&(I=s.loadPromise,i=s.image)}i&&(i.classList.add("thumbnail"),g.append(i))}const P=!(!f||!e.supportsStreaming),Z=P?this.preloaderStreamable:this.preloader,T=()=>this.managers.thumbsStorage.getCacheContext(e,null==M?void 0:M.type);let x;if(m){const t=u&&"gif"!==e.type,i=(0,H.Z)({pip:t});this.wholeDiv.classList.contains("no-forwards")&&i.addEventListener("contextmenu",l.Z);const n=()=>this.setMoverToTarget(a,!1,s).then((({onAnimationEnd:s})=>{const n=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,r=y.querySelector("video");r&&r.remove(),i.setAttribute("playsinline","true"),i.addEventListener("timeupdate",(()=>{this.tempId!==b&&i.pause()})),this.addEventListener("setMoverAfter",(()=>{i.src="",i.load()}),{once:!0}),o.IS_SAFARI&&(i.autoplay=!0),"gif"===e.type?(i.muted=!0,i.autoplay=!0,i.loop=!0):e.duration<60&&(i.loop=!0),n.append(i);const c=new Promise((e=>{i.addEventListener("canplay",e,{once:!0})})),h=()=>{"gif"!==e.type&&(i.dataset.ckin="default",i.dataset.overlay="1",Promise.all([c,s]).then((()=>{this.tempId===b&&((this.videoPlayer=new C({video:i,play:!0,streamable:P,onPlaybackRackMenuToggle:e=>{this.wholeDiv.classList.toggle("hide-caption",!!e)},onPip:e=>{const s=window.appMediaViewer;if(!e&&s&&s!==this)return this.releaseSingleMedia=void 0,void this.close();this.moversContainer.lastElementChild.classList.toggle("hiding",e),this.toggleWholeActive(!e),this.toggleOverlay(!e),this.toggleGlobalListeners(!e),this.navigationItem&&(e?k.Z.removeItem(this.navigationItem):k.Z.pushItem(this.navigationItem)),t&&(e?(this.releaseSingleMedia(!1),this.releaseSingleMedia=void 0,d.Z.setPictureInPicture(i)):this.releaseSingleMedia=d.Z.setSingleMedia(i,u))},onPipClose:()=>{this.close()}})).addEventListener("toggleControls",(e=>{this.wholeDiv.classList.toggle("has-video-controls",e)})),this.addEventListener("setMoverBefore",(()=>{this.wholeDiv.classList.remove("has-video-controls"),this.videoPlayer.cleanup(),this.videoPlayer=void 0}),{once:!0}),this.isZooming()&&this.videoPlayer.lockControls(!1))})))};if(P){s.then((()=>{i.readyState{i.addEventListener("canplay",(()=>{Z.detach(),i.parentElement.classList.remove("is-buffering")}),{once:!0})};i.addEventListener("waiting",(()=>{const t=i.networkState===i.NETWORK_LOADING,s=i.readyState{(0,l.Z)(e)})),e()}this.lazyLoadQueue.unshift({load:()=>q(this,void 0,void 0,(function*(){const r=P?Promise.resolve():K.Z.downloadMediaURL({media:e});return P||s.then((()=>q(this,void 0,void 0,(function*(){(yield T()).url||Z.attach(y,!0,r)})))),Promise.all([r,s]).then((()=>q(this,void 0,void 0,(function*(){if(this.tempId!==b)return void this.log.warn("media viewer changed video");const e=(yield T()).url;i.addEventListener("error",(()=>{(0,$.bC)({langPackKey:o.IS_MOBILE?"Video.Unsupported.Mobile":"Video.Unsupported.Desktop"}),4!==i.error.code&&this.log.error("Error "+i.error.code+"; details: "+i.error.message),null==Z||Z.detach()}),{once:!0}),a instanceof SVGSVGElement?n.firstElementChild.lastElementChild.append(i):(0,A.ZP)(i,e),t&&(this.releaseSingleMedia=d.Z.setSingleMedia(i,u),this.addEventListener("setMoverBefore",(()=>{this.releaseSingleMedia&&(this.releaseSingleMedia(),this.releaseSingleMedia=void 0)}),{once:!0})),this.updateMediaSource(a,e,"video"),h()})))),r}))})}));x=I.then(n)}else{const t=()=>this.setMoverToTarget(a,!1,s).then((({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>q(this,void 0,void 0,(function*(){const i=f?K.Z.downloadMediaURL({media:e}):K.Z.downloadMediaURL({media:e,thumb:M});return t.then((()=>q(this,void 0,void 0,(function*(){(yield T()).url||this.preloader.attachPromise(i)})))),Promise.all([t,i]).then((()=>q(this,void 0,void 0,(function*(){var e;if(this.tempId!==b)return void this.log.warn("media viewer changed photo");const t=(yield T()).url;if(a instanceof SVGSVGElement){if(this.updateMediaSource(a,t,"img"),this.updateMediaSource(y,t,"img"),n.Z.isMobile){const e=y.querySelectorAll("img");e&&e.length&&e.forEach((e=>{e.classList.remove("thumbnail")}))}}else{const i=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,s="IMG"===(null===(e=i.firstElementChild)||void 0===e?void 0:e.tagName)?i.firstElementChild:null;if(!s||s.src!==t){const e=new Image;e.classList.add("thumbnail"),(0,A.ZP)(e,t,(()=>{this.updateMediaSource(a,t,"img"),s&&(0,R.T2)((()=>{s.remove()})),i.append(e)}))}}})))).catch((e=>{this.log.error(e),this.preloader.attach(y),this.preloader.setManual()})),i}))})}));x=I.then(t)}return this.setMoverPromise=x.catch((()=>{this.setMoverAnimationPromise=null})).finally((()=>{this.setMoverPromise=null}))}))}}},6385:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(410),n=i(4762),a=i(5003),o=i(8799),r=i(3910),d=i(3444),l=i(1655);const c=new class{constructor(){if(this.onPopState=e=>{const t=window.location.hash,i=e.state;if(this.debug&&this.log("popstate",e,this.isPossibleSwipe,t),t!==this.currentHash)if(this.debug&&this.log.warn(`hash changed, new=${t}, current=${this.currentHash}, overridden=${this.overriddenHash}`),i===this.id&&this.overriddenHash&&this.overriddenHash!==t)this.overrideHash(this.overriddenHash);else{if(!i||this.overriddenHash||!t)return this.currentHash=t,void(this.onHashChange&&this.onHashChange());this.overrideHash()}if(i!==this.id&&(this.pushState(),!this.navigations.length))return;const s=this.navigations.pop();s?(this.manual=!this.isPossibleSwipe,this.handleItem(s)):this.pushState()},this.onKeyDown=e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||((0,r.Z)(e),this.back(t.type)))},this.onTouchStart=e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),(0,d.Z)(e)&&(this.isPossibleSwipe=!0,window.addEventListener("touchend",(()=>{setTimeout((()=>{this.isPossibleSwipe=!1}),100)}),{passive:!0,once:!0})))},this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=(0,a.kg)("NC"),this.debug=!0,this.currentHash=window.location.hash,this.overriddenHash="",this.isPossibleSwipe=!1,window.addEventListener("popstate",this.onPopState),window.addEventListener("keydown",this.onKeyDown,{capture:!0,passive:!1}),n.IS_MOBILE_SAFARI){const e={passive:!0};window.addEventListener("touchstart",this.onTouchStart,e)}history.scrollRestoration="manual",this.pushState()}overrideHash(e=""){e&&"#"!==e[0]?e="#"+e:"#"===e&&(e=""),this.currentHash!==e&&(this.overriddenHash=this.currentHash=e,this.replaceState(),this.pushState())}handleItem(e){const t=e.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",e,this.navigations),!1===t?this.pushItem(e):e.noBlurOnPop||(0,o.Z)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const i=this.navigations[t];if(i.type===e)return{item:i,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}onItemAdded(e){this.debug&&this.log("onItemAdded",e,this.navigations),e.noHistory||this.pushState()}pushItem(e){this.navigations.push(e),this.onItemAdded(e)}unshiftItem(e){this.navigations.unshift(e),this.onItemAdded(e)}spliceItems(e,t,...i){this.navigations.splice(e,t,...i),i.forEach((e=>{this.onItemAdded(e)}))}pushState(){this.debug&&this.log("push"),this.manual=!1,history.pushState(this.id,"")}replaceState(){this.debug&&this.log.warn("replace");const e=location.origin+location.pathname+location.search+this.overriddenHash;history.replaceState(this.id,"",e)}removeItem(e){e&&(0,l.Z)(this.navigations,e)}removeByType(e,t=!1){for(let i=this.navigations.length-1;i>=0&&(this.navigations[i].type!==e||(this.navigations.splice(i,1),!t));--i);}};s.GO.appNavigationController=c;const h=c},5884:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,z:()=>d});var s=i(8130),n=i(8805),a=i(5565),o=i(2325),r=i(3512);class d{constructor(e,t,i=!0,n,a=!0,r=!0,d,l){this.name=e,this.type=t,this.clearable=i,this.autonomous=r,this.onFound=d,this.noIcons=l,this.list=s.default.createChatList(),this.container=document.createElement("div"),n&&(this.container.className=n),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append((0,o.ag)(e)),this.container.append(this.nameEl)),this.container.classList.add("search-group","search-group-"+t),this.container.append(this.list),this.container.style.display="none",a&&s.default.setListClickListener(this.list,d,void 0,r)}clear(){this.container.style.display="none",this.clearable&&(this.list.innerHTML="")}setActive(){this.container.style.display=""}toggle(){this.list.childElementCount?this.setActive():this.clear()}}class l{constructor(e,t,i,s,a){this.container=e,this.searchInput=t,this.searchGroups=i,this.onSearch=s,this.noIcons=a,this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1,this.searchPromise=null,this.searchTimeout=0,this.query="",this.listsContainer=null,this.threadId=0,this.scrollable=new n.ZP(this.container),this.listsContainer=this.scrollable.container;for(const e in this.searchGroups)this.listsContainer.append(this.searchGroups[e].container);this.searchGroups.messages&&this.scrollable.setVirtualContainer(this.searchGroups.messages.list),this.searchInput.onChange=e=>{this.query=e,this.reset(!1),this.searchMore()},this.scrollable.onScrolledBottom=()=>{this.query.trim()&&(this.searchTimeout||(this.searchTimeout=window.setTimeout((()=>{this.searchMore(),this.searchTimeout=0}),0)))}}reset(e=!0){e&&(this.searchInput.value="",this.query="",this.peerId=void 0,this.threadId=0),this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1;for(const e in this.searchGroups)this.searchGroups[e].clear();this.searchPromise=null}beginSearch(e,t=0,i=""){this.peerId=e,this.threadId=t,this.query!==i&&(this.searchInput.inputField.value=i),this.searchInput.input.focus()}searchMore(){if(this.searchPromise)return this.searchPromise;const e=this.query;if(!e.trim())return void(this.onSearch&&this.onSearch(0));if(-1!==this.foundCount&&this.loadedCount>=this.foundCount)return Promise.resolve();const t=this.minMsgId||0;return this.searchPromise=r.Z.managers.appMessagesManager.getSearch({peerId:this.peerId,query:e,inputFilter:{_:"inputMessagesFilterEmpty"},maxId:t,limit:20,threadId:this.threadId}).then((t=>{if(this.searchPromise=null,this.searchInput.value!==e)return;const{count:i,history:n}=t;n.length&&n[0].mid===this.minMsgId&&n.shift();const r=this.searchGroups.messages;n.forEach((t=>{try{const i=this.peerId?t.fromId:t.peerId;s.default.addDialogAndSetLastMessage({peerId:i,container:this.scrollable,avatarSize:"bigger",meAsSaved:!1,message:t,query:e,noIcons:this.noIcons})}catch(e){console.error("[appSearch] render search result",e)}})),r.toggle(),this.minMsgId=n.length&&n[n.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=n.length,-1===this.foundCount&&(this.foundCount=i,r.nameEl&&(0,a.Z)(r.nameEl,(0,o.ag)(i?"Chat.Search.MessagesFound":"Chat.Search.NoMessagesFound",[i])),this.onSearch&&this.onSearch(this.foundCount))})).catch((e=>{console.error("search error",e),this.searchPromise=null}))}}},6360:(e,t,i)=>{"use strict";i.d(t,{Z:()=>fe});var s=i(8130),n=i(5003),a=i(3512),o=i(5884),r=i(6008),d=i(2153),l=i(279),c=i(1405),h=i(8805),u=i(8594),p=i(2325),f=i(8497),m=i(3624),g=i(2894),v=i(4668),b=i(4332),y=i(4755),w=i(4271),S=i(4484),C=i(467),L=i(5432),E=i(1154),I=i(241),M=i(6272),P=i(3003),Z=i(4524),T=i(5128),k=i(7479),x=i(5705),A=i(6054),_=i(3910),F=i(2738),D=i(1784),R=i(8479),B=i(7401),N=i(5953),O=i(3738),U=i(4064),H=i(130),z=i(7030),j=i(2498),G=i(1336),V=i(5798),K=i(2342),W=i(2491),$=i(5400),q=i(5671),Q=i(1604),Y=i(7530),X=i(6566),J=i(177),ee=i(3061),te=i(2566),ie=i(6976),se=i(3416),ne=i(1483),ae=i(3855),oe=i(3699),re=i(296),de=i(9492),le=i(2887),ce=i(319),he=i(6131),ue=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class pe{constructor(e,t,i){this.attachTo=e,this.searchSuper=t,this.listenerSetter=i,this.onGotoClick=()=>{w.ZP.setInnerPeer({peerId:this.peerId,lastMsgId:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?(0,F.tH)(this.searchSuper.selection.selectionForwardBtn):new Z.Z({[this.peerId]:[this.mid]})},this.onSelectClick=()=>{this.searchSuper.selection.toggleByElement(this.target)},this.onClearSelectionClick=()=>{this.searchSuper.selection.cancelSelection()},this.onDeleteClick=()=>{this.searchSuper.selection.isSelecting?(0,F.tH)(this.searchSuper.selection.selectionDeleteBtn):new T.Z(this.peerId,[this.mid],"chat")},this.managers=t.managers;L.Z||(0,ie.E)({element:e,callback:e=>{let i;this.init&&(this.init(),this.init=null);try{i=(0,f.Z)(e.target,"search-super-item")}catch(e){}if(i){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),(()=>{ue(this,void 0,void 0,(function*(){this.target=i,this.peerId=i.dataset.peerId.toPeerId(),this.mid=+i.dataset.mid,this.isSelected=t.selection.isMidSelected(this.peerId,this.mid),yield Promise.all(this.buttons.map((e=>ue(this,void 0,void 0,(function*(){let t;t=!(this.isSelected&&!e.withSelection)&&(!e.verify||(yield e.verify())),e.element.classList.toggle("hide",!t)}))))),i.classList.add("menu-open"),(0,ne.Z)(e,this.element),se.Z.openBtnMenu(this.element,(()=>{i.classList.remove("menu-open")}))}))})()}},listenerSetter:i})}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>ue(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canForward(yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,this.mid))}))},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionForwardBtn.classList.contains("hide"),withSelection:!0},{icon:"message",text:"Message.Context.Goto",onClick:this.onGotoClick,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>ue(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canDeleteMessage(yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,this.mid))}))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionDeleteBtn.classList.contains("hide"),withSelection:!0}],this.element=(0,P.b)({buttons:this.buttons,listenerSetter:this.listenerSetter}),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class fe{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new d.Z,this.middleware=(0,m.k)(),this.historyStorage={},this.usedFromHistory={},this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=(0,n.kg)("SEARCH-SUPER"),this.monthContainers={},this.mediaTabsMap=new Map,this.asChatList=!1,this.groupByMonth=!0,this.hideEmptyTabs=!0,this.showSender=!1,this.onTransitionStart=()=>{this.container.classList.add("sliding")},this.onTransitionEnd=()=>{this.container.classList.remove("sliding")},(0,N.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.listenerSetter=new oe.Z,this.searchContextMenu=new pe(this.container,this,this.listenerSetter),this.selection=new A.e(this,this.managers,this.listenerSetter);const t=this.navScrollableContainer=document.createElement("div");t.classList.add("search-super-tabs-scrollable","menu-horizontal-scrollable","sticky");const i=this.navScrollable=new h.v7(t);i.container.classList.add("search-super-nav-scrollable");const s=this.nav=document.createElement("nav");s.classList.add("search-super-tabs","menu-horizontal-div"),this.tabsMenu=s,i.container.append(s);for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const i=document.createElement("span"),s=document.createElement("i");i.append((0,p.ag)(e.name)),i.append(s),t.append(i),(0,c.Z)(t),this.tabsMenu.append(t),this.mediaTabsMap.set(e.type,e),e.menuTab=t}let a;this.tabsContainer=document.createElement("div"),this.tabsContainer.classList.add("search-super-tabs-container","tabs-container"),L.Z&&(this.swipeHandler=(0,E.Z)({element:this.tabsContainer,onSwipe:(e,t,i)=>{e*=-1;const s=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let o;if(e>0){for(let e=s+1;e=0;--e)if(!n[e].classList.contains("hide")){o=e;break}void 0!==o&&(a=function(e){const t=e=>{(0,_.Z)(e)};let i=2;const s=()=>{--i||e.removeEventListener("touchmove",t,{capture:!0})};return e.addEventListener("touchmove",t,{capture:!0,passive:!1}),e.addEventListener("touchend",s,{once:!0}),s}(this.tabsContainer),this.selectTab(o))}}));for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("search-super-container-"+e.type,"tabs-tab");const i=document.createElement("div");i.classList.add("search-super-content-"+e.type),t.append(i),this.tabsContainer.append(t),this.tabs[e.inputFilter]=i,e.contentTab=i}this.container.append(t,this.tabsContainer),this.searchGroupMedia=new o.z(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&this.canLoadMediaTab(this.mediaTab)&&this.load(!0)},this.selectTab=(0,r.X)(this.tabsMenu,this.tabsContainer,((e,t,i)=>{if(this.prevTabId===e&&!this.skipScroll)return void this.scrollable.scrollIntoViewNew({element:this.container,position:"start",startCallback:this.scrollStartCallback});const s=this.mediaTabs[e];this.onChangeTab&&this.onChangeTab(s);const n=this.mediaTab;if(this.mediaTab=s,-1!==this.prevTabId&&i&&this.onTransitionStart(),this.skipScroll)this.skipScroll=!1;else{const e=this.container.offsetTop;let t=this.scrollable.scrollTop;if(tn&&(s.scroll={scrollTop:n,scrollHeight:0})}if(s.scroll){const e=n.scroll.scrollTop-s.scroll.scrollTop;e&&(s.contentTab.style.transform=`translateY(${e}px)`)}}-1===this.prevTabId||s.contentTab.childElementCount||this.load(!0),this.prevTabId=e}),(()=>{this.scrollable.onScroll(),void 0!==this.mediaTab.scroll&&(this.mediaTab.contentTab.style.transform="",this.scrollable.scrollTop=this.mediaTab.scroll.scrollTop),a&&(a(),a=void 0),this.onTransitionEnd()}),void 0,i,this.listenerSetter),(0,F.fc)(this.tabsContainer,(e=>{this.selection.isSelecting&&((0,_.Z)(e),this.selection.toggleByElement((0,f.Z)(e.target,"search-super-item")))}),{capture:!0,passive:!1,listenerSetter:this.listenerSetter});const l=(e,t,i,s)=>ue(this,void 0,void 0,(function*(){const n=(0,f.Z)(s.target,e);if(!n)return;const a=+n.dataset.mid;if(!a)return void this.log.warn("no messageId by click on target:",n);const o=n.querySelector(".media-spoiler-container");if(o)return void(0,he.kN)({event:s,mediaSpoiler:o});const r=n.dataset.peerId.toPeerId(),d=Array.from(this.tabs[i].querySelectorAll("."+t)).map((t=>{const i=(0,f.Z)(t,e);return{element:t,mid:+i.dataset.mid,peerId:i.dataset.peerId.toPeerId()}})),l=d.findIndex((e=>e.mid===a&&e.peerId===r)),c=yield this.managers.appMessagesManager.getMessageByPeer(r,a);(new D.Z).setSearchContext(this.copySearchContext(i)).openMedia(c,d[l].element,0,!1,d.slice(0,l),d.slice(l+1))}));(0,F.fc)(this.tabs.inputMessagesFilterPhotoVideo,l.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo"),{listenerSetter:this.listenerSetter}),(0,F.fc)(this.tabs.inputMessagesFilterDocument,l.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument"),{listenerSetter:this.listenerSetter}),this.mediaTab=this.mediaTabs[0],(0,u.ZP)((()=>{this.lazyLoadQueue.lock()}),(()=>{this.lazyLoadQueue.unlockAndRefresh()}),this.listenerSetter)}filterMessagesByType(e,t){return(0,X.Z)(t,e,e.length)}processEmptyFilter({message:e,searchGroup:t}){const i=[],n=s.default.addDialogNew({peerId:e.peerId,container:t.list,avatarSize:"bigger",loadPromises:i}),a=s.default.setLastMessageN({dialog:{_:"dialog",peerId:e.peerId},lastMessage:e,dialogElement:n,highlightWord:this.searchContext.query});return i.push(a),Promise.all(i).then(ce.Z)}processPhotoVideoFilter({message:e,promises:t,middleware:i}){return ue(this,void 0,void 0,(function*(){const s=(0,Y.Z)(e),n=document.createElement("div");let a;n.classList.add("grid-item");const o=(0,z.Z)(s,200,200);if(a="photo"!==s._?yield(yield(0,le.Z)({doc:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,photoSize:o})).thumb:yield(0,de.Z)({photo:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,withoutPreloader:!0,noBlur:!0,size:o}),e.media.pFlags.spoiler){const e=yield(0,he.ZP)({animationGroup:"chat",media:s,middleware:i,width:140,height:140,multiply:.3});n.append(e)}return[a.images.thumb,a.images.full].filter(Boolean).forEach((e=>{e.classList.add("grid-item-media")})),t.push(a.loadPromises.thumb),{element:n,message:e}}))}processDocumentFilter({message:e,inputFilter:t}){return ue(this,void 0,void 0,(function*(){const i=(0,Y.Z)(e),s=this.showSender||["voice","round"].includes(i.type),n=yield(0,re.Z)({message:e,withTime:!s,fontWeight:400,voiceAsMusic:!0,showSender:s,searchContext:this.copySearchContext(t),lazyLoadQueue:this.lazyLoadQueue,autoDownloadSize:0});return["audio","voice","round"].includes(i.type)&&n.classList.add("audio-48"),{message:e,element:n}}))}processUrlFilter({message:e,promises:t,middleware:i}){var s;return ue(this,void 0,void 0,(function*(){let n=null===(s=e.media)||void 0===s?void 0:s.webpage;if(!n){const t=e.totalEntities?e.totalEntities.find((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._)):null;let i,s,a;if(t)a=e.message.slice(t.offset,t.offset+t.length);else{const t=(0,K.Z)(e.message);if(!t)return;i=t[0]}i="messageEntityTextUrl"===(null==t?void 0:t._)?t.url:i||a,s=i;const o=e.message===i;i.match(/^(ftp|http|https):\/\//)||(s="https://"+i,i=i.includes("@")?i:"https://"+i),s=new URL(s).hostname,n={_:"webPage",url:i,display_url:s,id:"",hash:0},o||(n.description=e.message)}if("webPageEmpty"===n._)return;const a=document.createElement("div");a.classList.add("preview"),n.photo?(0,de.Z)({container:a,message:null,photo:n.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,size:(0,z.Z)(n.photo,60,60,!1),loadPromises:t,noBlur:!0}):(a.classList.add("empty"),(0,H.Z)(a,(0,V.Z)(n.title||n.display_url||n.description||n.url,!0)));const o=(0,G.Z)(n),r=(0,j.Z)(n),d=(0,x.Z)((0,$.ZP)(n.url||"")).firstElementChild;if(d instanceof HTMLAnchorElement)try{d.innerText=decodeURIComponent(d.href)}catch(e){}r.firstChild&&r.append("\n"),r.append(d),this.showSender&&r.append("\n",yield(0,q.Z)(e)),o.textContent||o.append((0,W.Z)(n.display_url.split("/",1)[0]));const l=new k.ZP({title:o,titleRight:(0,Q.Z)(e),subtitle:r,havePadding:!0,clickable:!0,noRipple:!0});return l.applyMediaElement(a,"big"),l.container.innerText.trim().length?{message:e,element:l.container}:void 0}))}performSearchResult(e,t,i=!0){return ue(this,void 0,void 0,(function*(){const s=[],n=t.contentTab,a=[],o=this.middleware.get();let r,d=t.inputFilter;yield(0,u.e9)(),"inputMessagesFilterPhotoVideo"===d&&this.searchContext.query.trim()?(d="inputMessagesFilterEmpty",r=this.searchGroupMedia,n.append(r.container)):"inputMessagesFilterEmpty"===d&&(r=this.searchGroups.messages);const l={elemsToAppend:s,inputFilter:d,message:void 0,middleware:o,promises:a,searchGroup:r};let c;switch(d){case"inputMessagesFilterEmpty":c=this.processEmptyFilter;break;case"inputMessagesFilterPhotoVideo":c=this.processPhotoVideoFilter;break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":c=this.processDocumentFilter;break;case"inputMessagesFilterUrl":c=this.processUrlFilter}if(c){c=c.bind(this);const t=e.map((e=>ue(this,void 0,void 0,(function*(){try{return l.message=e,yield c(l)}catch(t){this.log.error("error rendering filter",d,l,e,t)}})))),i=(yield Promise.all(t)).filter(Boolean);s.push(...i)}if(r&&r.list.childElementCount&&r.setActive(),this.loadMutex&&a.push(this.loadMutex),!a.length||(yield Promise.all(a),o())){if(s.length){const e=i?"append":"prepend";s.forEach((t=>{var i;const{element:s,message:n}=t,a=this.getMonthContainerByTimestamp(this.groupByMonth?n.date:0,d);s.classList.add("search-super-item"),s.dataset.mid=""+n.mid,s.dataset.peerId=""+n.peerId,a.items[e](s),(null===(i=this.selection)||void 0===i?void 0:i.isSelecting)&&this.selection.toggleElementCheckbox(s,!0)}))}this.afterPerforming("inputMessagesFilterEmpty"===d?1:s.length,n)}}))}afterPerforming(e,t){if(t){const i=t.parentElement;if(Array.from(i.children).slice(1).forEach((e=>{e.remove()})),!e&&!t.childElementCount){const e=document.createElement("div");e.innerText="Nothing interesting here yet...",e.classList.add("position-center","text-center","content-empty","no-select"),i.append(e)}}}loadChats(){const e=new Set,t=this.middleware.get();for(const e in this.searchGroups){const t=this.searchGroups[e];this.tabs.inputMessagesFilterEmpty.append(t.container),t.clear()}const i=this.searchContext.query;if(i){const n=(t,n,o=!1)=>{t.map((t=>{if(e.has(t))return;e.add(t);const{dom:i}=s.default.addDialogNew({peerId:t,container:n.list,avatarSize:"abitbigger",autonomous:n.autonomous});return{dom:i,peerId:t}})).filter(Boolean).forEach((({dom:e,peerId:t})=>ue(this,void 0,void 0,(function*(){const s=yield this.managers.appPeersManager.getPeer(t);if(o&&(s.participants_count||s.participants)){const s=new RegExp(`(${(0,O.Z)(i)}|${(0,O.Z)((0,C.ZP)(i))})`,"gi");e.titleSpan.innerHTML=e.titleSpan.innerHTML.replace(s,"$1"),e.lastMessageSpan.append(yield(0,J.Z)(t.toChatId()))}else if(t===a.Z.myId)e.lastMessageSpan.append((0,p.ag)("Presence.YourChat"));else{let i=yield this.managers.appPeersManager.getPeerUsername(t);if(i)i="@"+i;else{const e=yield this.managers.appUsersManager.getUser(t);e&&e.phone&&(i="+"+(0,M.u)(e.phone).formatted)}e.lastMessageSpan.textContent=i}})))),n.toggle()},o=e=>{if(t())return e};return Promise.all([this.managers.appUsersManager.getContactsPeerIds(i,!0,void 0,10).then(o).then((e=>{e&&n(e,this.searchGroups.contacts,!0)})),this.managers.appUsersManager.searchContacts(i,20).then(o).then((e=>{if(e&&(n(e.my_results,this.searchGroups.contacts,!0),n(e.results,this.searchGroups.globalContacts),this.searchGroups.globalContacts.container.classList.add("is-short"),this.searchGroups.globalContacts.nameEl.lastElementChild!==this.searchGroups.globalContacts.nameEl.firstElementChild&&this.searchGroups.globalContacts.nameEl.lastElementChild.remove(),this.searchGroups.globalContacts.list.childElementCount>3)){const e=document.createElement("div");e.classList.add("search-group__show-more");const t=new p.ZP.IntlElement({key:"Separator.ShowMore"});e.append(t.element),this.searchGroups.globalContacts.nameEl.append(e),(0,F.fc)(e,(()=>{const e=this.searchGroups.globalContacts.container.classList.toggle("is-short");t.key=e?"Separator.ShowMore":"Separator.ShowLess",t.update()}))}})),this.managers.dialogsStorage.getDialogs({query:i,offsetIndex:0,limit:20,filterId:0}).then(o).then((e=>{e&&n(e.dialogs.map((e=>e.peerId)),this.searchGroups.contacts,!0)}))])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>ae.Z.getState().then((i=>{t()&&(this.searchGroups.recent.list.replaceChildren(),i.recentSearch.slice(0,20).forEach((e=>ue(this,void 0,void 0,(function*(){const{dom:t}=s.default.addDialogNew({peerId:e,container:this.searchGroups.recent.list,meAsSaved:!0,avatarSize:"abitbigger",autonomous:!0});t.lastMessageSpan.append(yield e.isUser()?(0,ee.Z)(yield this.managers.appUsersManager.getUser(e.toUserId())):(0,J.Z)(e.toChatId()))})))),i.recentSearch.length?e&&this.searchGroups.recent.setActive():this.searchGroups.recent.clear())}));return Promise.all([this.managers.appUsersManager.getTopPeers("correspondents").then((e=>{if(!t())return;const i=e.findIndex((e=>e.id===a.Z.myId));-1!==i&&(e=e.slice()).splice(i,1),e.forEach((e=>{const{dom:t}=s.default.addDialogNew({peerId:e.id,container:this.searchGroups.people.list,onlyFirstName:!0,avatarSize:"bigger",autonomous:!1,noIcons:this.searchGroups.people.noIcons});t.subtitleEl.remove()})),this.searchGroups.people.toggle()})),e()])}}loadMembers(e){return ue(this,void 0,void 0,(function*(){const t=this.searchContext.peerId.toChatId(),i=this.middleware.get();let n;const a=t=>ue(this,void 0,void 0,(function*(){if(!this.loadMutex||(yield this.loadMutex,i())){this.membersList||(this.membersList=new g.Z({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1,managers:this.managers}),(0,F.fc)(this.membersList.list,(e=>{const t=(0,v.Z)(e.target,s.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=t.dataset.peerId.toPeerId();let n=Promise.resolve();y.Z.isMobile&&(n=b.ZP.toggleSidebar(!1)),n.then((()=>{w.ZP.setInnerPeer({peerId:i})}))})),e.contentTab.append(this.membersList.list),this.afterPerforming(1,e.contentTab));for(const e of t){const t=(0,te.Z)(e);t.isAnyChat()||((yield this.managers.appUsersManager.getUser(t)).pFlags.deleted||this.membersList.add(t))}}}));if(yield this.managers.appChatsManager.isChannel(t)){const s=this.membersList?200:50;n=this.managers.appProfileManager.getChannelParticipants(t,void 0,s,this.nextRates[e.inputFilter]).then((t=>{if(!i())return;const n=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(n?n.childElementCount:0)+t.participants.length,t.participants.length{if(!i())return;this.loaded[e.inputFilter]=!0;const s=t.participants;return"chatParticipantsForbidden"!==s._?a(s.participants):void 0}));return this.loadPromises[e.inputFilter]=n.finally((()=>{i()&&(this.loadPromises[e.inputFilter]=null)}))}))}loadType(e,t,i,s){var n,a;const o=e.inputFilter;if(this.loadPromises[o])return this.loadPromises[o];if("members"===e.type)return this.loadMembers(e);const r=null!==(n=(a=this.historyStorage)[o])&&void 0!==n?n:a[o]=[];if(!("inputMessagesFilterEmpty"!==o||r.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[o]=!0,Promise.resolve();const d=this.loadPromises[o]=Promise.resolve().then((()=>ue(this,void 0,void 0,(function*(){var n,a;if(r.length&&this.usedFromHistory[o]this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.mid))));t.push(...this.filterMessagesByType(a,o))}while(n{setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}const l=r.length?r[r.length-1].mid:0,c=yield this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:o},maxId:l,limit:i,nextRate:null!==(n=(a=this.nextRates)[o])&&void 0!==n?n:a[o]=0}));if(r.push(...c.history.map((e=>({mid:e.mid,peerId:e.peerId})))),s()&&((c.history.length{setTimeout((()=>{if(s()&&this.mediaTab===e){const e=this.load(!0,!0);e&&e.then((()=>{s()&&setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}}),0)})),this.performSearchResult(this.filterMessagesByType(c.history,o),e)})))).catch((e=>{this.log.error("load error:",e)})).finally((()=>{this.loadPromises[o]=null}));return d}canLoadMediaTab(e){const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"inputMessagesFilterEmpty"!==e.inputFilter)),n=s.map((e=>({_:e.inputFilter}))),[a,o]=yield Promise.all([this.managers.appMessagesManager.getSearchCounters(t,n,void 0,i),this.canViewMembers()]);if(!e())return;if(this.loadMutex&&(yield this.loadMutex,!e()))return;let r,d=0;s.forEach((e=>{const t=a.find((t=>t.filter._===e.inputFilter));e.menuTab.classList.toggle("hide",!t.count),e.menuTab.classList.remove("active"),t.count&&(void 0===r&&(r=e),++d)}));const l=this.mediaTabsMap.get("members");l.menuTab.classList.toggle("hide",!o),o&&(r=l,++d),this.container.classList.toggle("hide",!r),this.container.parentElement.classList.toggle("search-empty",!r),r&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(r),!1),this.navScrollableContainer.classList.toggle("hide",d<=1))}))}load(e=!1,t=!1){var i;return ue(this,void 0,void 0,(function*(){const s=this.searchContext.peerId;this.log("load",e,s,this.loadPromises);const n=this.middleware.get();if(this.firstLoad){if(yield null!==(i=this.loadFirstTimePromise)&&void 0!==i?i:this.loadFirstTimePromise=this.loadFirstTime(),!n())return;this.loadFirstTimePromise=void 0,this.firstLoad=!1}let a=e?[this.mediaTab]:this.mediaTabs.filter((e=>e!==this.mediaTab));if(a=a.filter((e=>this.canLoadMediaTab(e))),s.isUser()&&(0,U.Z)(a,(e=>"members"===e.type)),!a.length)return;const o=t?50:Math.round(3*(I.Z.height/130|0)*1.25),r=a.map((e=>this.loadType(e,t,o,n)));return Promise.all(r).catch((e=>{this.log.error("Load error all promises:",e)}))}))}getMonthContainerByTimestamp(e,t){var i;const s=new Date(1e3*e);s.setHours(0,0,0),s.setDate(1);const n=s.getTime(),a=null!==(i=this.monthContainers[t])&&void 0!==i?i:this.monthContainers[t]={};if(!(n in a)){const e=document.createElement("div");e.className="search-super-month";const i=document.createElement("div");i.classList.add("search-super-month-name");const o={month:"long"};s.getFullYear()!==(new Date).getFullYear()&&(o.year="numeric");const r=new p.ZP.IntlDateElement({date:s,options:o}).element;i.append(r),e.append(i);const d=document.createElement("div");d.classList.add("search-super-month-items"),e.append(i,d);const l=(0,B.Z)(a,"desc");let c=0;for(;cl[c]);++c);a[n]={container:e,items:d},(0,S.Z)(e,this.tabs[t],c)}return a[n]}canViewMembers(){const{peerId:e}=this.searchContext;if(!e.isAnyChat())return Promise.resolve(!1);const t=e.toChatId();return Promise.all([this.managers.appChatsManager.isBroadcast(t),this.managers.appChatsManager.hasRights(t,"view_participants"),this.managers.appChatsManager.isForum(t)]).then((([e,t,i])=>!e&&t&&(!this.searchContext.threadId||!i)))}cleanup(){var e;this.loadPromises={},this.loaded={},this.loadedChats=!1,this.nextRates={},this.firstLoad=!0,this.prevTabId=-1,this.lazyLoadQueue.clear(),this.mediaTabs.forEach((e=>{this.usedFromHistory[e.inputFilter]=-1})),(null===(e=this.selection)||void 0===e?void 0:e.isSelecting)&&this.selection.cancelSelection(),this.middleware.clean(),this.loadFirstTimePromise=void 0,this.cleanScrollPositions(),this.membersList=void 0}cleanScrollPositions(){this.mediaTabs.forEach((e=>{e.scroll=void 0}))}cleanupHTML(e=!1){this.mediaTabs.forEach((e=>{if(e.contentTab.replaceChildren(),this.hideEmptyTabs&&(this.container.classList.add("hide"),this.container.parentElement.classList.add("search-empty")),"chats"!==e.type&&!this.historyStorage[e.inputFilter]){const t=e.contentTab.parentElement;t.querySelector(".preloader")||(0,l.y)(t,!0);const i=t.querySelector(".content-empty");i&&i.remove()}})),this.monthContainers={},this.searchGroupMedia.clear(),this.scrollable.scrollTop=0}copySearchContext(e){const t=(0,R.Z)(this.searchContext);return t.inputFilter={_:e},t.nextRate=this.nextRates[e],t}setQuery({peerId:e,query:t,threadId:i,historyStorage:s,folderId:n,minDate:a,maxDate:o}){this.searchContext={peerId:e,query:t||"",inputFilter:{_:this.mediaTab.inputFilter},threadId:i,folderId:n,minDate:a,maxDate:o},this.historyStorage=null!=s?s:{},this.cleanup()}destroy(){var e,t;this.cleanup(),this.listenerSetter.removeAll(),this.scrollable.destroy(),null===(e=this.swipeHandler)||void 0===e||e.removeListeners(),null===(t=this.selection)||void 0===t||t.cleanup(),this.scrollStartCallback=void 0,this.onChangeTab=void 0,this.selectTab=void 0,this.searchContextMenu=void 0,this.swipeHandler=void 0,this.selection=void 0}}},5644:(e,t,i)=>{"use strict";i.d(t,{Z:()=>A});var s=i(8130),n=i(3512),a=i(8805),o=i(4789),r=i(9807),d=i(2325),l=i(8763),c=i(8497),h=i(8842),u=i(3910),p=i(5565),f=i(5701),m=i(241),g=i(2738),v=i(6690),b=i(1655),y=i(5953),w=i(4064),S=i(9331),C=i(2353),L=i(2566),E=i(177),I=i(3061),M=i(8493),P=i(7120),Z=i(8050),T=i(36),k=i(5029),x=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class A{constructor(e){this.container=document.createElement("div"),this.list=s.default.createChatList(),this.chatsContainer=document.createElement("div"),this.selected=new Set,this.freezed=!1,this.folderId=0,this.offsetIndex=0,this.query="",this.loadedWhat={},this.renderedPeerIds=new Set,this.peerType=["dialogs"],this.multiSelect=!0,this.rippleEnabled=!0,this.avatarSize="abitbigger",this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.design="round",this.onInput=()=>{const e=this.input.value;if(this.query!==e){(this.peerType.includes("contacts")||this.peerType.includes("dialogs"))&&(this.cachedContacts=void 0),this.peerType.includes("dialogs")&&(this.folderId=0,this.offsetIndex=0);for(const e in this.tempIds)++this.tempIds[e];this.list=s.default.createChatList(),this.promise=void 0,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},(0,y.Z)(this,e),this.container.classList.add("selector","selector-"+this.design);const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>x(this,void 0,void 0,(function*(){return this.needSwitchList&&(this.scrollable.splitUp.replaceWith(this.list),this.scrollable.setVirtualContainer(this.list),this.needSwitchList=!1),e=e.filter((e=>{const t=!this.renderedPeerIds.has(e);return t&&this.renderedPeerIds.add(e),t})),this.filterPeerTypeBy&&(e=yield(0,C.Z)(e,(e=>x(this,void 0,void 0,(function*(){if(e.isPeerId()&&(yield this.managers.appPeersManager.getPeer(e)))for(const t of this.filterPeerTypeBy)if(yield this.managers.appPeersManager[t](e))return!0;return!0}))))),t(e)})),this.input=document.createElement("input"),this.input.classList.add("selector-search-input"),this.placeholder?(0,d.$d)(this.input,this.placeholder,void 0,"placeholder"):(0,d.$d)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){const e=new k.Z({});e.innerContainer.classList.add("selector-search-section");const t=document.createElement("div");t.classList.add("selector-search-container"),this.selectedContainer=document.createElement("div"),this.selectedContainer.classList.add("selector-search"),this.selectedContainer.append(this.input),t.append(this.selectedContainer),this.selectedScrollable=new a.ZP(t),(0,g.fc)(this.selectedContainer,(e=>{if(this.freezed)return;let t=e.target;if(t=(0,c.Z)(t,"selector-user"),!t)return;const i=t.dataset.key,s=this.chatsContainer.querySelector('[data-peer-id="'+i+'"]');s?(0,g.tH)(s):this.remove(i.toPeerId())})),e.content.append(t),this.container.append(e.container)}this.chatsContainer.classList.add("chatlist-container");const i=new k.Z({name:this.sectionNameLangPackKey,noShadow:!0});i.content.append(this.list),this.chatsContainer.append(i.container),this.scrollable=new a.ZP(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),(0,g.fc)(this.chatsContainer,(e=>{const t=(0,l.Z)(e.target,"data-peer-id");if((0,u.Z)(e),!t)return;if(this.freezed)return;let i=t.dataset.peerId;if(i=i.isPeerId()?i.toPeerId():i,!this.multiSelect)return void this.add(i);this.selected.has(i)?this.remove(i):this.add(i);const s=t.querySelector("input");s.checked=!s.checked}));const n=(0,f.Z)(this.onInput,200,!1,!0);this.input.addEventListener("input",n),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend((0,T.G)()),this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout((()=>{const t=this.getMoreResults();e.onFirstRender&&t.then((()=>{e.onFirstRender()}))}),0)}renderSaved(){return x(this,void 0,void 0,(function*(){this.exceptSelf||this.offsetIndex||0!==this.folderId||!this.peerType.includes("dialogs")||this.query&&!(yield this.managers.appUsersManager.testSelfSearch(this.query))||(yield this.renderResultsFunc([n.Z.myId]))}))}getTempId(e){var t,i;null!==(t=(i=this.tempIds)[e])&&void 0!==t||(i[e]=0);const s=++this.tempIds[e];return{tempId:s,middleware:()=>this.tempIds[e]===s}}getMoreDialogs(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=m.Z.height/56*1.25|0,{middleware:t}=this.getTempId("dialogs"),i=this.managers.dialogsStorage.getDialogs({query:this.query,offsetIndex:this.offsetIndex,limit:e,filterId:this.folderId,skipMigrated:!0});i.catch((()=>{t()&&(this.loadedWhat[this.loadedWhat.dialogs?"archived":"dialogs"]=!0)}));const s=yield i;if(!t())return;let a=s.dialogs;if(a.length){const e=(0,Z.Z)(a[a.length-1])||0;if(a=a.slice(),(0,w.Z)(a,(e=>e.peerId===n.Z.myId)),this.chatRightsAction&&(a=yield(0,C.Z)(a,(e=>this.filterByRights(e.peerId))),!t()))return;if(yield this.renderSaved(),!t())return;this.offsetIndex=e}if(this.renderResultsFunc(a.map((e=>e.peerId))),s.isEnd){if(!this.loadedWhat.dialogs){if(yield this.renderSaved(),!t())return;return this.loadedWhat.dialogs=!0,this.offsetIndex=0,this.folderId=1,this.getMoreDialogs()}if(this.loadedWhat.archived=!0,!this.loadedWhat.contacts)return this.getMoreContacts()}}))}filterByRights(e){return x(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.getPeer(e);return e.isUser()?"send_messages"!==this.chatRightsAction||(0,M.Z)(t):!!(0,P.Z)(t,this.chatRightsAction)||void 0}))}getMoreContacts(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.contacts)return;const e=this.peerType.includes("contacts");if(!this.cachedContacts){const{middleware:t}=this.getTempId("contacts"),i=Promise.all([e?this.managers.appUsersManager.getContactsPeerIds(this.query):[],this.query?this.managers.appUsersManager.searchContacts(this.query):void 0]);i.catch((()=>{t()&&(this.loadedWhat.contacts=!0)}));const[s,a]=yield i;if(!t())return;if(a){let i=e?a.my_results.concat(a.results):a.my_results;if(this.chatRightsAction&&(i=yield(0,C.Z)(i,(e=>this.filterByRights(e))),!t()))return;this.peerType.includes("dialogs")||(i=i.filter((e=>e.isUser()))),this.cachedContacts=(0,v.Z)(s.concat(i))}else this.cachedContacts=s.slice();(0,b.Z)(this.cachedContacts,n.Z.myId)}const t=m.Z.height/56*1.25|0,i=this.cachedContacts.splice(0,t);this.renderResultsFunc(i),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.channelParticipants)return;const{middleware:e}=this.getTempId("channelParticipants"),t=this.managers.appProfileManager.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount);t.catch((()=>{e()&&(this.loadedWhat.channelParticipants=!0)}));const i=yield t;if(!e())return;const s=i.participants.map((e=>(0,L.Z)(e)));(0,b.Z)(s,n.Z.myId),this.renderResultsFunc(s),(this.list.childElementCount>=i.count||i.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){if(this.promise)return this.promise;const e=(()=>this.peerType.includes("dialogs")&&!this.loadedWhat.archived?this.getMoreSomething("dialogs"):!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts?this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants?this.getMoreSomething("channelParticipants"):void 0:this.getMoreSomething("contacts"))();if(!e)return Promise.resolve();const t=this.promise=e.catch((e=>{console.error("get more result error",e)})).finally((()=>{this.promise===t&&(this.promise=void 0),this.checkForTriggers()}));return t}getMoreSomething(e){return{dialogs:this.getMoreDialogs,contacts:this.getMoreContacts,channelParticipants:this.getMoreChannelParticipants}[e].call(this)}renderResults(e){return x(this,void 0,void 0,(function*(){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=yield(0,C.Z)(e,(e=>this.managers.appUsersManager.isNonContactUser(e)))),e.forEach((e=>x(this,void 0,void 0,(function*(){const{dom:t}=s.default.addDialogNew({peerId:e,container:this.scrollable,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const i=this.selected.has(e),s=new r.Z;i&&(s.input.checked=!0),t.containerEl.prepend(s.label)}let i;i=e.isAnyChat()?yield(0,E.Z)(e.toChatId()):e===n.Z.myId?(0,d.ag)(this.selfPresence):(0,I.Z)(yield this.managers.appUsersManager.getUser(e.toUserId())),t.lastMessageSpan.append(i)}))))}))}add(e,t,i=!0){var s;if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const n=document.createElement("div");n.classList.add("selector-user","scale-in");const a=new S.Z;if(a.classList.add("selector-user-avatar","tgico","avatar-32"),a.isDialog=!0,n.dataset.key=""+e,e.isPeerId()){if(void 0===t){const i=new h.Z;i.update({peerId:e.toPeerId(),dialog:!0}),t=i.element}a.updateWithOptions({peerId:e})}return t&&("string"==typeof t?n.innerHTML=t:((0,p.Z)(n,t),n.append(t))),n.insertAdjacentElement("afterbegin",a),this.selectedContainer.insertBefore(n,this.input),null===(s=this.onChange)||void 0===s||s.call(this,this.selected.size),i&&this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center"}),n}remove(e){if(!this.multiSelect)return;const t=this.selectedContainer.querySelector(`[data-key="${e}"]`);t.classList.remove("scale-in"),t.offsetWidth,t.classList.add("scale-out");const i=()=>{this.selected.delete(e),t.remove(),this.onChange&&this.onChange(this.selected.size)};n.Z.settings.animationsEnabled?t.addEventListener("animationend",i,{once:!0}):i()}getSelected(){return[...this.selected]}addInitial(e){e.forEach((e=>{this.add(e,void 0,!1)})),window.requestAnimationFrame((()=>{this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center",forceDirection:o.f.Static})}))}}},8448:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>F,ns:()=>_});var s=i(3442),n=i(3013),a=i(4755),o=i(4762),r=i(3512),d=i(3910),l=i(2738),c=i(3725),h=i(3699),u=i(319),p=i(8497),f=i(2325),m=i(3251),g=i(632),v=i(9966),b=i(1507),y=i(4081),w=i(5296),S=i(3228),C=i(5157),L=i(7207),E=i(130),I=i(8115),M=i(5671),P=i(1604),Z=i(7530),T=i(2312),k=i(9492),x=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function A(e=!0){const t=new s.Z({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}r.Z.addEventListener("messages_media_read",(({mids:e,peerId:t})=>{e.forEach((e=>{const i=`[data-mid="${e}"][data-peer-id="${t}"]`;Array.from(document.querySelectorAll(`audio-element.is-unread${i}, .media-round.is-unread${i}`)).forEach((e=>{e.classList.remove("is-unread")}))}))}));const _=(e,t)=>{let i,s;const n=!e.classList.contains("search-super-item"),a=(0,p.Z)(e,n?"bubbles-inner":"tabs-tab");if(a){const t=':not([data-is-outgoing="1"])',o=`.audio:not(.is-voice)${t}`;let r;if(r=e.matches(o)?[o]:[`.audio.is-voice${t}`,`.media-round${t}`],n){const e=".bubble:not(.webpage) ";r=r.map((t=>e+t))}const d=r.join(", "),l=Array.from(a.querySelectorAll(d)),c=l.indexOf(e),h=l.map((e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid})));i=h.slice(0,c),s=h.slice(c+1)}return(s.length&&s[0].midt)&&([i,s]=[s.reverse(),i.reverse()]),[i,s]};class F extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new h.Z}render(){var e,t,i;return x(this,void 0,void 0,(function*(){this.classList.add("audio"),this.managers=r.Z.managers,this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const s=(0,Z.Z)(this.message),h="voice"===s.type,p=!this.voiceAsMusic&&h,F=this.message.pFlags.is_outgoing,D=null===(e=this.message)||void 0===e?void 0:e.uploadingFileName,R=(0,C.Z)(0|s.duration);this.innerHTML='\n
\n
\n
\n
\n
\n
';const B=this.firstElementChild,N=document.createElement("div");N.classList.add("audio-download"),"audio"!==s.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),D&&(this.classList.add("is-outgoing"),this.append(N));const O=yield p?function(e){return x(this,void 0,void 0,(function*(){e.classList.add("is-voice");const t=e.message,i=(0,Z.Z)(t);t.pFlags.out&&e.classList.add("is-out");let s=i.attributes.find((e=>"documentAttributeAudio"===e._)).waveform||new Uint8Array([]);s=function(e){e instanceof Uint8Array||(e=new Uint8Array(e));const t=8*e.length/5|0;if(!t)return new Uint8Array([]);let i;try{const s=new DataView(e.buffer);i=new Uint8Array(t);for(let e=0;e>n&31}}catch(e){i=new Uint8Array([])}return i}(s.slice(0,63));const{svg:n,container:o,availW:r}=function(e,t){const i=a.Z.isMobile?16:23,s=a.Z.isMobile?152:190,n=a.Z.isMobile?190:256,o=(0,S.Z)(t/60*n,s,n),r=document.createElementNS("http://www.w3.org/2000/svg","svg");r.classList.add("audio-waveform-bars"),r.setAttributeNS(null,"width",""+o),r.setAttributeNS(null,"height",""+i),r.setAttributeNS(null,"viewBox",`0 0 ${o} ${i}`);const d=Math.max(...e),l=e.length?e.length:100,c=Math.min(o/4|0,l);let h=0;const u=i-4;let p="";for(let t=0,s=0,n=0;t=l){n=n+c-l,n<(c+1)/2&&h\n `,s+=4,h=n<(c+1)/2?0:a}else h{let t=e.audio;const i=()=>{c.style.width=t.currentTime/t.duration*100+"%"};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&i();const s=(0,v.Z)(i);return e.addAudioListener("timeupdate",s),e.addAudioListener("ended",s),e.addAudioListener("play",(()=>{(0,w.cK)((()=>!!t&&(i(),!t.paused)),e)})),e.readyPromise.then((()=>{let e=!1,i=!1;function s(e){let i;if(e instanceof MouseEvent)i=e.offsetX;else{const t=e.target.getBoundingClientRect();i=e.targetTouches[0].pageX-t.left}const s=i/r*t.duration;t.currentTime=s}f.addEventListener("mouseleave",(s=>{e&&(t.play(),e=!1),i=!1})),f.addEventListener("mousemove",(t=>{i=!0,e&&s(t)})),f.addEventListener("mousedown",(i=>{i.preventDefault(),0===i.button&&(t.paused||t.pause(),s(i),e=!0)})),f.addEventListener("mouseup",(s=>{i&&e&&(t.play(),e=!1)})),(0,l.fc)(f,(e=>{(0,d.Z)(e),t.paused||s(e)}))}),u.Z),()=>{f.remove(),f=null,t=null}}}))}(this):function(e){var t;return x(this,void 0,void 0,(function*(){const i=e.withTime,s=e.message,n=(0,Z.Z)(s),a="voice"===n.type||"round"===n.type,o=document.createElement("div");o.classList.add("audio-description");const r=n.attributes.find((e=>"documentAttributeAudio"===e._));if(!a){const t=[];(null==r?void 0:r.performer)&&t.push((0,I.Z)(r.performer)),i?t.push((0,g.OD)(s.date)):t.length||t.push((0,y.Z)(n.size)),e.showSender&&t.push(yield(0,M.Z)(s)),o.append(...(0,f.A1)(t," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const d=e.querySelector(".audio-title"),l=new m.I;l.dataset.fontWeight=e.dataset.fontWeight,l.dataset.fontSize=e.dataset.fontSize,l.dataset.sizeType=e.dataset.sizeType,a?l.append(yield(0,M.Z)(s)):(0,E.Z)(l,(0,I.Z)(null!==(t=null==r?void 0:r.title)&&void 0!==t?t:n.file_name)),d.append(l),e.showSender&&d.append((0,P.Z)(s));const c=e.querySelector(".audio-subtitle");return c.append(o),()=>{let t=!1,i=new L.Z(e.audio,n.supportsStreaming);e.addAudioListener("ended",(()=>{e.classList.remove("audio-show-progress"),c.lastChild.replaceWith(o),t=!1}));const s=()=>{t||(e.classList.add("audio-show-progress"),t=!0,i&&c.lastChild.replaceWith(i.container))};return e.addAudioListener("play",s),(!e.audio.paused||e.audio.currentTime>0)&&s(),()=>{i.removeListeners(),i.container.remove(),i=null}}}))}(this),U=this.querySelector(".audio-time");U.innerHTML=R;const H=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=n.Z.addMedia(this.message,e),i=this.readyPromise=(0,c.Z)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?i.resolve():this.addAudioListener("canplay",(()=>i.resolve()),{once:!0}),this.onTypeDisconnect=O();const s=()=>(0,C.Z)(0|t.currentTime)+(p?" / "+R:""),a=()=>{U.innerText=s(),B.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&a();const o=(e,i=t.paused)=>{if(e&&(0,d.Z)(e),i){const e=!!this.searchContext;if(n.Z.setSearchContext(this.searchContext||{peerId:b.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,i]=e?_(this,this.message.mid):[];n.Z.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,i)}t.play().catch((()=>{}))}else t.pause()};return(0,l.fc)(B,(e=>o(e)),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",(()=>{B.classList.remove("playing"),U.innerText=R})),this.addAudioListener("timeupdate",(()=>{!t.currentTime&&t.paused||n.Z.isSafariBuffering(t)||(U.innerText=s())})),this.addAudioListener("pause",(()=>{B.classList.remove("playing")})),this.addAudioListener("play",a),o};if(null===(t=s.thumbs)||void 0===t?void 0:t.length){const e=[],t=yield(0,k.Z)({photo:s,message:null,container:B,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});B.style.width=B.style.height="",t.images.thumb&&e.push(t.images.thumb),t.images.full&&e.push(t.images.full),this.classList.add("audio-with-thumb"),e.forEach((e=>e.classList.add("audio-thumb")))}if(F)D&&(this.preloader=A(!1),this.preloader.attachPromise(T.Z.getUpload(D)),this.dataset.isOutgoing="1",this.preloader.attach(N,!1));else{let e=this.preloader;const t="audio"!==s.type;H(t);const a=t=>{if(this.audio.src)return;n.Z.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(n.Z.willBePlayed(this.audio),o.IS_SAFARI&&!this.audio.autoplay&&(this.audio.autoplay=!0))};if(i(),!e)if(s.supportsStreaming){let e;this.classList.add("corner-download");const t=()=>{const t=A(!1),s=(0,c.Z)();s.notifyAll({done:75,total:100}),s.catch((()=>{this.audio.pause(),n.Z.willBePlayed(void 0)})),s.cancel=()=>{s.cancel=u.Z;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(N,!1,s),e=this.addAudioListener("pause",(()=>{s.cancel()}),{once:!0}),i()},s=this.addAudioListener("play",t);this.readyPromise.then((()=>{this.listenerSetter.remove(s),this.listenerSetter.remove(e)}))}else{e=A(),t||(this.readyPromise=(0,c.Z)());const n=()=>{i();const n=T.Z.downloadMediaURL({media:s});return t||n.then((()=>{this.readyPromise.resolve()})),e.attach(N,!1,n),{download:n}};e.setDownloadFunction(n),n()}this.classList.contains("corner-download")?B.append(N):this.append(N),this.classList.add("downloading"),this.readyPromise.then((()=>{this.classList.remove("downloading"),N.classList.add("downloaded"),setTimeout((()=>{N.remove()}),200),n.Z.willBePlayedMedia===this.audio&&(this.audio.play(),n.Z.willBePlayed(void 0))}))};(null===(i=this.audio)||void 0===i?void 0:i.src)||(t?a(!1):(0,l.fc)(B,(()=>{a(!0)}),{once:!0,capture:!0,passive:!1,listenerSetter:this.listenerSetter}))}}))}get addAudioListener(){return this.listenerSetter.add(this.audio)}disconnectedCallback(){setTimeout((()=>{this.isConnected||(this.onTypeDisconnect&&(this.onTypeDisconnect(),this.onTypeDisconnect=null),this.readyPromise&&this.readyPromise.reject(),this.listenerSetter&&(this.listenerSetter.removeAll(),this.listenerSetter=null),this.preloader&&(this.preloader=null))}),100)}}customElements.define("audio-element",F)},9331:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L,C:()=>y});var s=i(3512),n=i(2738),a=i(3910),o=i(1784),r=i(6074);class d extends r.Z{constructor(e){super(Object.assign(Object.assign({},e),{loadMore:(e,t,i)=>{if(this.peerId.isAnyChat()||!t)return Promise.resolve({count:0,items:[]});const s=null==e?void 0:e.photoId;return this.managers.appPhotosManager.getUserPhotos(this.peerId,s,i).then((e=>{const t=e.photos.map((e=>({element:null,photoId:e})));return{count:e.count,items:t}}))}})),this.loadedAllUp=!0,this.peerId=e.peerId}}var l=i(2312),c=i(4271),h=i(5824),u=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class p extends h.Z{constructor(e){super(new d({peerId:e,managers:s.Z.managers}),[]),this.onPrevClick=e=>{this.openMedia(e.photoId,e.element,-1)},this.onNextClick=e=>{this.openMedia(e.photoId,e.element,1)},this.onDownloadClick=()=>u(this,void 0,void 0,(function*(){l.Z.downloadToDisc({media:yield this.managers.appPhotosManager.getPhoto(this.target.photoId),queueId:c.ZP.chat.bubbles.lazyLoadQueue.queueId})})),this.peerId=e,this.setBtnMenuToggle([{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick}]),this.setListeners()}openMedia(e,t,i=0,s,n){const a=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return u(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const o=yield this.managers.appPhotosManager.getPhoto(e),r=a._openMedia.call(this,o,o.date,this.peerId,i,t,!1,s,n);return this.target.photoId=o.id,r}))}}var f=i(5880),m=i(9931),g=i(3624),v=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const b=({peerId:e,threadId:t})=>{let i='avatar-element[data-peer-id="'+e+'"]';t&&(i+='[data-thread-id="'+t+'"]'),Array.from(document.querySelectorAll(i)).forEach((e=>{e.update()}))};function y(e,t,i,n,a,r){return v(this,void 0,void 0,(function*(){let d=yield s.Z.managers.appProfileManager.getFullPhoto(t);if(!i()||!d)return;const l=()=>Array.from(e.querySelectorAll("img")).find((e=>!e.classList.contains("emoji")))?e:null;if(t.isAnyChat()){const e=!!n,c="inputMessagesFilterChatPhotos";if(!n&&(n=yield s.Z.managers.appMessagesManager.getSearch({peerId:t,inputFilter:{_:c},maxId:0,limit:1}).then((e=>e.history[0])),!i()))return;if(n){n.action.photo.id!==d.id&&(e||(n=s.Z.managers.appMessagesManager.generateFakeAvatarMessage(t,d)));const i=e=>e.map((e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId})));return void(new o.Z).setSearchContext({peerId:t,inputFilter:{_:c}}).openMedia(n,l(),void 0,void 0,a?i(a):void 0,r?i(r):void 0)}}if(d){!(0,f.Z)(n)&&n&&(d=yield s.Z.managers.appPhotosManager.getPhoto(n));const e=e=>e.map((e=>({element:e.element,photoId:e.item})));new p(t).openMedia(d.id,l(),void 0,a?e(a):void 0,r?e(r):void 0)}}))}s.Z.addEventListener("avatar_update",b),s.Z.addEventListener("peer_title_edit",(e=>v(void 0,void 0,void 0,(function*(){(yield s.Z.managers.appAvatarsManager.isAvatarCached(e.peerId))||b(e)}))));const w=new Map,S=new Set;function C(e,t){return e+(t?"_"+t:"")}class L extends HTMLElement{constructor(){super(),this.addedToQueue=!1,this.classList.add("avatar-like"),this.middlewareHelper=(0,g.k)()}disconnectedCallback(){var e;const t=C(this.peerId,this.threadId),i=w.get(t);(null==i?void 0:i.has(this))&&(i.delete(this),i.size||w.delete(t)),null===(e=this.lazyLoadQueue)||void 0===e||e.delete({div:this})}attachClickEvent(){let e=!1;(0,n.fc)(this,(t=>v(this,void 0,void 0,(function*(){if((0,a.Z)(t),e)return;const i=this.peerId;e=!0,yield y(this,this.peerId,(()=>this.peerId===i)),e=!1}))))}updateOptions(e){for(const t in e)this[t]=e[t]}updateWithOptions(e){var t;const i=this.peerId,s=this.threadId;this.updateOptions(e);const n=this.peerId,a=this.threadId;if(i===n&&s===a)return;if(this.dataset.peerId=""+n,a?this.dataset.threadId=""+a:s&&delete this.dataset.threadId,i){const e=C(i,s),t=w.get(e);t&&(t.delete(this),t.size||w.delete(e))}const o=null===(t=e.wrapOptions)||void 0===t?void 0:t.middleware;return this.middlewareHelper.destroy(),o?this.middlewareHelper=o.create():this.middlewareHelper.destroy(),this.update()}remove(){this.middlewareHelper.destroy(),super.remove()}r(e=!1){const t=(0,m.Z)({div:this,peerId:this.peerId,isDialog:this.isDialog,title:this.peerTitle,onlyThumb:e,isBig:this.isBig,threadId:this.threadId,wrapOptions:Object.assign({middleware:this.middlewareHelper.get()},this.wrapOptions||{})});return this.loadPromises&&(this.loadPromises.push(t),t.finally((()=>{this.loadPromises=void 0}))),t}update(){if(this.lazyLoadQueue){if(!S.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;const e=C(this.peerId,this.threadId);let t=w.get(e);return t||w.set(e,t=new Set),t.add(this),this.lazyLoadQueue.push({div:this,load:()=>(S.add(this.peerId),this.update())}),this.r(!0)}this.addedToQueue&&this.lazyLoadQueue.delete({div:this})}S.add(this.peerId);const e=this.r();this.addedToQueue&&e.finally((()=>{this.addedToQueue=!1}));const t=C(this.peerId,this.threadId),i=w.get(t);if(i){i.delete(this);const e=Array.from(i);w.delete(t);for(let t=0,i=e.length;t{"use strict";i.d(t,{Z:()=>o});var s=i(2738),n=i(1168),a=i(6765);class o{constructor(e,t){this.container=document.createElement("div"),this.container.classList.add("avatar-edit"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("avatar-edit-canvas"),this.icon=document.createElement("span"),this.icon.classList.add("tgico","tgico-cameraadd"),this.container.append(this.canvas,this.icon),(0,s.fc)(this.container,(()=>{n.Z.createPopup(a.Z,t).open(this.canvas,e)}))}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}},4494:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325),n=i(1405);function a(e,t={}){const i=document.createElement(t.asLink?"a":t.asDiv?"div":"button");return i.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&i.classList.add("rp-square"),(0,n.Z)(i)),t.onlyMobile&&i.classList.add("only-handhelds"),t.disabled&&i.setAttribute("disabled","true"),t.text&&i.append((0,s.ag)(t.text)),i}},8119:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4494);const n=(e={})=>(0,s.Z)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e)},2230:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4494);const n=(e,t={})=>(0,s.Z)("btn-icon",Object.assign({icon:e||void 0},t))},3003:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v,b:()=>g});var s=i(7238),n=i(3416),a=i(3910),o=i(2738),r=i(8497),d=i(130),l=i(2325),c=i(9492),h=i(8812),u=i(8222),p=i(4762),f=i(1405);function m(e){if(e.element)return[e.separator,e.element].filter(Boolean);const{icon:t,iconDoc:i,text:s,onClick:m,checkboxField:g,noCheckboxClickListener:v}=e,b=document.createElement("div");b.className="btn-menu-item rp-overflow"+(t?" tgico-"+t:""),p.IS_MOBILE&&(0,f.Z)(b);let y=e.textElement;if(y||(y=e.textElement=s?(0,l.ag)(s,e.textArgs):document.createElement("span"),e.regularText&&(0,d.Z)(y,e.regularText)),i){const t=document.createElement("span");t.classList.add("btn-menu-item-icon"),b.append(t),e.loadPromise=(0,c.Z)({container:t,photo:i,boxWidth:24,boxHeight:24,withoutPreloader:!0,noFadeIn:!0,noBlur:!0,processUrl:e=>fetch(e).then((e=>e.text())).then((e=>{const t=u.Z.getProperty("primary-text-color"),i=(new DOMParser).parseFromString(e,"image/svg+xml").firstElementChild;return i.querySelectorAll("path").forEach((e=>{e.setAttributeNS(null,"fill",t),e.style.stroke=t,e.style.strokeWidth=".25px"})),(0,h.Z)(i.outerHTML)}))}).then((e=>e.loadPromises.thumb))}y.classList.add("btn-menu-item-text"),b.append(y);const w=!!g||!!e.keepOpen;return m&&(0,o.fc)(b,(t=>{var i;(0,a.Z)(t);const s=(0,r.Z)(t.target,"btn-menu");s&&!s.classList.contains("active")||(m(t),!1!==(null===(i=e.checkForClose)||void 0===i?void 0:i.call(e))&&(w||n.Z.close(),g&&!v&&(g.checked="radio"===g.input.type||!g.checked)))}),e.options),g&&b.append(g.label),!0===e.separator&&(e.separator=document.createElement("hr")),e.multiline&&b.classList.add("is-multiline"),[e.separator,e.element=b].filter(Boolean)}function g({listenerSetter:e,buttons:t}){const i=document.createElement("div");i.classList.add("btn-menu"),e&&t.forEach((t=>{t.options?t.options.listenerSetter=e:t.options={listenerSetter:e}}));const n=t.map(m);return i.append(...(0,s.Z)(n)),i}function v(e){return t=this,i=void 0,n=function*(){const t=g(e);return yield Promise.all(e.buttons.map((({loadPromise:e})=>e))),t},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}},5322:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,v:()=>h});var s=i(3416),n=i(3910),a=i(2738),o=i(3699),r=i(2230),d=i(3003),l=i(2353),c=i(3035);function h({el:e,onOpen:t,options:i,onClose:o}){((null==i?void 0:i.listenerSetter)?i.listenerSetter.add(e):e.addEventListener.bind(e))(a.pf,(i=>{if(!e.classList.contains("btn-menu-toggle"))return!1;if((0,n.Z)(i),e.classList.contains("menu-open"))s.Z.close();else{const n=null==t?void 0:t(i),a=()=>{const t=e.querySelector(".btn-menu");s.Z.openBtnMenu(t,o)};n instanceof Promise?n.then(a):a()}}))}function u({buttonOptions:e,listenerSetter:t,container:i,direction:s,buttons:n,onOpenBefore:a,onOpen:u,onClose:p,onCloseAfter:f}){e&&(e.asDiv=!0);const m=null!=i?i:(0,r.Z)("more",e);m.classList.add("btn-menu-toggle");const g=new o.Z;let v,b;return h({el:m,onOpen:e=>{return t=this,i=void 0,r=function*(){if(yield null==a?void 0:a(e),b)return clearTimeout(b),void(b=void 0);const t=yield(i=n,(0,l.Z)(i,(e=>{var t,i;return null===(i=null===(t=null==e?void 0:e.verify)||void 0===t?void 0:t.call(e))||void 0===i||i})));var i;if(!t.length)return;const o=v=yield(0,d.Z)({buttons:t,listenerSetter:g});o.classList.add(s),yield null==u?void 0:u(e,o),m.append(o),yield(0,c.d1)()},new((o=void 0)||(o=Promise))((function(e,s){function n(e){try{d(r.next(e))}catch(e){s(e)}}function a(e){try{d(r.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(t,i||[])).next())}));var t,i,o,r},options:{listenerSetter:t},onClose:()=>{null==p||p(),b=window.setTimeout((()=>{null==f||f(),b=void 0,g.removeAll(),n.forEach((e=>e.element=void 0)),v.remove()}),300)}}),m}},1571:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(5296),n=i(2064);class a{constructor(){this._width=50,this._height=50,this._tails=90,this._scrollTails=50,this._curve=[0,.25,.5,.75,1,1.5,2,2.5,3,3.5,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18.3,18.6,18.9,19.2,19.5,19.8,20.1,20.4,20.7,21,21.3,21.6,21.9,22.2,22.5,22.8,23.1,23.4,23.7,24,24.3,24.6,24.9,25.2,25.5,25.8,26.1,26.3,26.4,26.5,26.6,26.7,26.8,26.9,27],this._positions=[{x:.8,y:.1},{x:.6,y:.2},{x:.35,y:.25},{x:.25,y:.6},{x:.2,y:.9},{x:.4,y:.8},{x:.65,y:.75},{x:.75,y:.4}],this._phases=this._positions.length,this.onWheel=e=>{this._animatingToNextPosition||(this._scrollDelta+=e.deltaY,void 0===this._onWheelRAF&&(this._onWheelRAF=requestAnimationFrame(this.drawOnWheel)))},this.drawOnWheel=()=>{const e=this._scrollDelta/this._scrollTails;this._scrollDelta%=this._scrollTails;const t=e>0?Math.floor(e):Math.ceil(e);t&&this.changeTailAndDraw(t),this._onWheelRAF=void 0},this.drawNextPositionAnimated=e=>{var t;let i,s;if(e){const s=e();i=s>=1;const a=-1*(n=s)*(n-2),o=null!==(t=this._nextPositionTail)&&void 0!==t?t:0,r=(this._nextPositionTail=this._nextPositionTails*a)-o;r&&(this._nextPositionLeft-=r,this.changeTailAndDraw(r))}else{const e=this._frames;s=e.shift(),i=!e.length}var n;return s&&this.drawImageData(s),i&&(this._nextPositionLeft=void 0,this._nextPositionTails=void 0,this._nextPositionTail=void 0,this._animatingToNextPosition=void 0),!i};const e=this._tails/this._curve[this._curve.length-1];for(let t=0,i=this._curve.length;t{var s;return e-(null!==(s=i[t-1])&&void 0!==s?s:0)}))}hexToRgb(e){const t=(0,n.oo)(e);return{r:t[0],g:t[1],b:t[2]}}getPositions(e){const t=this._positions.slice();t.push(...t.splice(0,e));const i=[];for(let e=0;e({x:(e.x-s[i].x)/t,y:(e.y-s[i].y)/t})));return i.map((e=>n.map(((t,i)=>({x:s[i].x+t.x*e,y:s[i].y+t.y*e})))))}curPosition(e,t){return this.getNextPositions(e,this._tails,[t])[0]}changeTail(e){for(this._tail+=e;this._tail>=this._tails;)this._tail-=this._tails,++this._phase>=this._phases&&(this._phase-=this._phases);for(;this._tail<0;)this._tail+=this._tails,--this._phase<0&&(this._phase+=this._phases)}changeTailAndDraw(e){this.changeTail(e);const t=this.curPosition(this._phase,this._tail);this.drawGradient(t)}getGradientImageData(e){const t=this._hctx.createImageData(this._width,this._height),i=t.data;let s=0;for(let t=0;tthis.hexToRgb(e))),this._hc||(this._hc=document.createElement("canvas"),this._hc.width=this._width,this._hc.height=this._height,this._hctx=this._hc.getContext("2d",{alpha:!1})),this._canvas=e,this._ctx=this._canvas.getContext("2d",{alpha:!1}),this.update()}update(){if(this._colors.length<2){const e=this._colors[0];return this._ctx.fillStyle=`rgb(${e.r}, ${e.g}, ${e.b})`,void this._ctx.fillRect(0,0,this._width,this._height)}const e=this.curPosition(this._phase,this._tail);this.drawGradient(e)}toNextPosition(e){var t,i;if(this._colors.length<2)return;if(e)return this._nextPositionLeft=this._tails+(null!==(t=this._nextPositionLeft)&&void 0!==t?t:0),this._nextPositionTails=this._nextPositionLeft,this._nextPositionTail=void 0,this._animatingToNextPosition=!0,void(0,s.cK)(this.drawNextPositionAnimated.bind(this,e),this);const n=this._tail,a=this._tails;let o;const r=[];for(let e=0,t=this._incrementalCurve.length;ea&&void 0===o&&(o=e,s%=a),r.push(s)}[r.slice(0,o),void 0!==o?r.slice(o):[]].forEach(((e,t,i)=>{const s=e[e.length-1];if(void 0!==s&&s>a&&(e[e.length-1]=+s.toFixed(2)),this._tail=null!=s?s:0,!e.length)return;const n=this.getNextPositions(this._phase,a,e);t!==i.length-1&&++this._phase>=this._phases&&(this._phase-=this._phases);const o=n.map((e=>this.getGradientImageData(e)));this._frames.push(...o)})),this._animatingToNextPosition=!0,(0,s.cK)(this.drawNextPositionAnimated,this)}scrollAnimate(e){}cleanup(){this.scrollAnimate(!1)}static createCanvas(e){const t=document.createElement("canvas");return t.width=50,t.height=50,void 0!==e&&(t.dataset.colors=e),t}static create(e){const t=this.createCanvas(e),i=new a;return i.init(t),{gradientRenderer:i,canvas:t}}}},6054:(e,t,i)=>{"use strict";i.d(t,{e:()=>k,Z:()=>x});var s=i(5432),n=i(4494),a=i(2230),o=i(9807),r=i(5128),d=i(4524),l=i(9099),c=i(1962),h=i(6385),u=i(4762),p=i(2325),f=i(8497),m=i(8799),g=i(3910),v=i(6760),b=i(5565),y=i(8487),w=i(144),S=i(2738),C=i(5975),L=i(3241),E=i(5953),I=i(6976),M=(i(6690),i(4271)),P=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Z=e=>[...e.values()].reduce(((e,t)=>e+t.size),0);class T extends L.Z{constructor(e){super(!1),this.selectedMids=new Map,this.isSelecting=!1,this.onMouseDown=e=>{const t=(0,f.Z)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,t))return;const i=new Map;let s,n=t;const a=(e,t=!0)=>{const o=+e.dataset.mid;if(!o||!e.dataset.peerId)return;const r=e.dataset.peerId.toPeerId();(0,y.Z)(n)||(n=e);let d=i.get(r);if(d||i.set(r,d=new Set),d.has(o))return;const l=this.isMidSelected(r,o);if(void 0===s&&(s=!l),d.add(o),s&&!l||!s&&l){const s=Z(i);if(this.toggleByElement&&t){s<2&&(0,C.Z)(e,n)&&(n=e);const t=this.getElementsBetween(n,e);t.length&&t.forEach((e=>{a(e,!1)}))}if(this.selectedMids.size)this.toggleByElement&&this.toggleByElement(e);else if(2===s&&this.toggleByMid)for(const[e,t]of i)for(const i of t)this.toggleByMid(e,i)}};let o=!1;const r=e=>{o||((0,v.Z)(),o=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,s)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",r),void this.listenerSetter.removeManual(document,"mouseup",d,l)):void a(t)},d=e=>{i.size&&(0,S.fc)(window,g.Z,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",r),(0,v.Z)()},l={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",r),this.listenerSetter.add(document)("mouseup",d,l)},this.getElementsBetween=(e,t)=>{if(e===t)return[];const i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),n=(i.top-s.top||i.left-s.left)<0,a=(0,f.Z)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let r=o.indexOf(e),d=o.indexOf(t);return n||([d,r]=[r,d]),o.slice(r+1,d)},this.cancelSelection=e=>P(this,void 0,void 0,(function*(){e&&(this.doNotAnimate=!0),this.onCancelSelection&&(yield this.onCancelSelection()),this.selectedMids.clear(),this.toggleSelection(),(0,v.Z)(),e&&(this.doNotAnimate=void 0)})),(0,E.Z)(this,e),this.navigationType="multiselect-"+(0,w.a)()}attachListeners(e,t){if(this.listenElement&&this.listenerSetter.removeAll(),this.listenElement=e,this.listenerSetter=t,e)return s.Z?(t.add(e)("touchend",(()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")})),void(0,I.E)({element:e,callback:t=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),e.addEventListener("touchend",(e=>{(0,g.Z)(e),document.body.classList.remove("no-select")}),{once:!0,capture:!0}),(0,v.Z)();const i=this.getElementFromTarget(t.target);i&&this.toggleByElement(i)},listenerSetter:t})):void t.add(e)("mousedown",this.onMouseDown)}isElementShouldBeSelected(e){return this.isMidSelected(e.dataset.peerId.toPeerId(),+e.dataset.mid)}appendCheckbox(e,t){e.prepend(t.label)}toggleElementCheckbox(e,t){const i=!!this.getCheckboxInputFromElement(e);if(t){if(i)return!1;const t=new o.Z({name:e.dataset.mid,round:!0});this.isSelecting&&this.isElementShouldBeSelected(e)&&(t.input.checked=!0,e.classList.add("is-selected")),this.appendCheckbox(e,t)}else i&&(this.getCheckboxInputFromElement(e).parentElement.remove(),(0,l.Z)({element:e,className:"is-selected",forwards:!1,duration:200}));return!0}getCheckboxInputFromElement(e){var t;return"LABEL"===(null===(t=e.firstElementChild)||void 0===t?void 0:t.tagName)&&e.firstElementChild.firstElementChild}updateContainer(e=!1){var t;return P(this,void 0,void 0,(function*(){const i=this.selectedMids.size;if(!i&&!e)return;let s=!i,n=!i;const a=!i;for(const[e,t]of this.selectedMids){const i=`${e}_${this.isScheduled?"scheduled":"history"}`,a=yield this.managers.appMessagesManager.cantForwardDeleteMids(i,Array.from(t));if(s=a.cantForward,n=a.cantDelete,s&&n)break}null===(t=this.onUpdateContainer)||void 0===t||t.call(this,s,n,a)}))}toggleSelection(e=!0,t=!1){var i;const n=this.isSelecting,a=this.selectedMids.size;if(this.isSelecting=!!a||t,n===this.isSelecting)return!1;this.dispatchEvent("toggle",this.isSelecting),s.Z||(this.listenElement.classList.toggle("no-select",this.isSelecting),n&&(0,v.Z)()),(0,m.Z)();const o=!!a||t,r=null===(i=this.onToggleSelection)||void 0===i?void 0:i.call(this,o,!this.doNotAnimate);return u.IS_MOBILE_SAFARI||(o?h.Z.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):h.Z.removeByType(this.navigationType)),t&&(r||Promise.resolve()).then((()=>this.updateContainer(t))),!0}cleanup(){this.doNotAnimate=!0,this.selectedMids.clear(),this.toggleSelection(!1),this.doNotAnimate=void 0}updateElementSelection(e,t){this.toggleElementCheckbox(e,!0),this.getCheckboxInputFromElement(e).checked=t,this.toggleSelection(),this.updateContainer(),(0,l.Z)({element:e,className:"is-selected",forwards:t,duration:200})}isMidSelected(e,t){const i=this.selectedMids.get(e);return null==i?void 0:i.has(t)}length(){return Z(this.selectedMids)}toggleMid(e,t,i){let s=this.selectedMids.get(e);return i||void 0===i&&(null==s?void 0:s.has(t))?s&&(s.delete(t),s.size||this.selectedMids.delete(e)):(s||(s=new Set,this.selectedMids.set(e,s)),s.add(t)),!0}deleteSelectedMids(e,t){const i=this.selectedMids.get(e);i&&(t.forEach((e=>{i.delete(e)})),i.size||this.selectedMids.delete(e),this.updateContainer(),this.toggleSelection())}}class k extends T{constructor(e,t,i){super({managers:t,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>(0,f.Z)(e,"search-super-item"),targetLookupClassName:"search-super-item",lookupBetweenParentClassName:"tabs-tab",lookupBetweenElementsQuery:".search-super-item"}),this.searchSuper=e,this.toggleByElement=e=>{const t=+e.dataset.mid,i=e.dataset.peerId.toPeerId();this.toggleMid(i,t)&&this.updateElementSelection(e,this.isMidSelected(i,t))},this.toggleByMid=(e,t)=>{const i=this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id="${e}"][data-mid="${t}"]`);this.toggleByElement(i)},this.onUpdateContainer=(e,t,i)=>{const s=this.length();(0,b.Z)(this.selectionCountEl,(0,p.ag)("messages",[s])),this.selectionGotoBtn.classList.toggle("hide",1!==s),this.selectionForwardBtn.classList.toggle("hide",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.classList.toggle("hide",t)},this.onToggleSelection=(e,t)=>{if((0,l.Z)({element:this.searchSuper.navScrollableContainer,className:"is-selecting",forwards:e,duration:t?200:0,onTransitionEnd:()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)}}),(0,l.Z)({element:this.searchSuper.container,className:"is-selecting",forwards:e,duration:200}),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=(0,a.Z)(`close ${e}-cancel`,{noRipple:!0});(0,S.fc)(t,(()=>this.cancelSelection()),{listenerSetter:this.listenerSetter,once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=(0,a.Z)(`message ${e}-goto`);const i={listenerSetter:this.listenerSetter};(0,S.fc)(this.selectionGotoBtn,(()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),M.ZP.setInnerPeer({peerId:e,lastMsgId:t})}),i),this.selectionForwardBtn=(0,a.Z)(`forward ${e}-forward`),(0,S.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new d.Z(e,(()=>{this.cancelSelection()}))}),i),this.isPrivate&&(this.selectionDeleteBtn=(0,a.Z)(`delete danger ${e}-delete`),(0,S.fc)(this.selectionDeleteBtn,(()=>{const e=[...this.selectedMids.keys()][0];new r.Z(e,[...this.selectedMids.get(e)],"chat",(()=>{this.cancelSelection()}))}),i)),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionGotoBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean));const s=this.selectionContainer;s.style.opacity="0",this.searchSuper.navScrollableContainer.append(s),s.offsetLeft,s.style.opacity=""}},this.isPrivate=!e.showSender,this.attachListeners(e.container,i)}toggleSelection(e=!0,t=!1){const i=super.toggleSelection(e,t);return i&&e&&Array.from(this.searchSuper.tabsContainer.querySelectorAll(".search-super-item")).forEach((e=>{this.toggleElementCheckbox(e,this.isSelecting)})),i}}class x extends T{constructor(e,t,i,s){super({managers:s,getElementFromTarget:e=>(0,f.Z)(e,"grouped-item")||(0,f.Z)(e,"bubble"),verifyTarget:(e,t)=>!(!this.selectedMids.size&&!e.target.classList.contains("bubble")&&!e.target.classList.contains("document-selection")&&t),verifyMouseMoveTarget:(e,t,i)=>!(e.target!==t&&!e.target.classList.contains("document-selection")&&void 0===i&&!this.selectedMids.size),verifyTouchLongPress:()=>!this.chat.input.recording,targetLookupClassName:"bubble",lookupBetweenParentClassName:"bubbles-inner",lookupBetweenElementsQuery:".bubble:not(.is-multiple-documents), .grouped-item",isScheduled:"scheduled"===e.type}),this.chat=e,this.bubbles=t,this.input=i,this.toggleByElement=e=>{if(!this.canSelectBubble(e))return;const t=+e.dataset.mid;if(e.classList.contains("is-grouped")){if(!this.isGroupedBubbleSelected(e)){const t=this.selectedMids.get(this.chat.peerId);t&&this.getMidsFromGroupContainer(e).forEach((e=>t.delete(e)))}this.bubbles.getBubbleGroupedItems(e).map(this.toggleByElement)}else if(this.toggleMid(this.chat.peerId,t)){if(e.classList.contains("grouped-item")){const t=(0,f.Z)(e,"bubble"),i=this.isGroupedBubbleSelected(t),s=this.isGroupedMidsSelected(t);(s||i)&&this.updateElementSelection(t,s)}this.updateElementSelection(e,this.isMidSelected(this.chat.peerId,t))}},this.toggleByMid=(e,t)=>P(this,void 0,void 0,(function*(){const e=yield this.bubbles.getMountedBubble(t);e&&this.toggleByElement(e.bubble)})),this.onToggleSelection=(e,t)=>P(this,void 0,void 0,(function*(){const{needTranslateX:i,widthFrom:s,widthTo:o}=yield this.chat.input.center(t);(0,l.Z)({element:this.listenElement,className:"is-selecting",forwards:e,duration:t?200:0,onTransitionEnd:()=>{this.isSelecting||(this.selectionInputWrapper.remove(),this.selectionInputWrapper=this.selectionContainer=this.selectionSendNowBtn=this.selectionForwardBtn=this.selectionDeleteBtn=this.selectionLeft=this.selectionRight=null,this.selectedText=void 0)}});const h=sthis.cancelSelection()),{once:!0,listenerSetter:this.listenerSetter}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add("selection-container-count"),"scheduled"===this.chat.type?(this.selectionSendNowBtn=(0,n.Z)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append((0,p.ag)("MessageScheduleSend")),(0,S.fc)(this.selectionSendNowBtn,(()=>{new c.Z(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],(()=>{this.cancelSelection()}))}),e)):(this.selectionForwardBtn=(0,n.Z)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append((0,p.ag)("Forward")),(0,S.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new d.Z(e,(()=>{this.cancelSelection()}))}),e)),this.selectionDeleteBtn=(0,n.Z)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append((0,p.ag)("Delete")),(0,S.fc)(this.selectionDeleteBtn,(()=>{new r.Z(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],this.chat.type,(()=>{this.cancelSelection()}))}),e);const i=this.selectionLeft=document.createElement("div");i.classList.add("selection-container-left"),i.append(t,this.selectionCountEl);const s=this.selectionRight=document.createElement("div");s.classList.add("selection-container-right"),s.append(...[this.selectionSendNowBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean)),void 0!==h&&(i.style.transform=`translateX(${-h}px)`,s.style.transform=`translateX(${h}px)`),this.selectionContainer.append(i,s),this.selectionInputWrapper.style.opacity="0",this.selectionInputWrapper.append(this.selectionContainer),this.input.inputContainer.append(this.selectionInputWrapper),this.selectionInputWrapper.offsetLeft,this.selectionInputWrapper.style.opacity="",i.style.transform="",s.style.transform=""}}else this.selectionLeft&&void 0!==h&&(this.selectionLeft.style.transform=`translateX(-${h}px)`,this.selectionRight.style.transform=`translateX(${h}px)`)})),this.onUpdateContainer=(e,t,i)=>{(0,b.Z)(this.selectionCountEl,(0,p.ag)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",i),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>P(this,void 0,void 0,(function*(){}))}appendCheckbox(e,t){t.label.classList.add("bubble-select-checkbox"),e.classList.contains("document-container")?e.querySelector(".document, audio-element").append(t.label):super.appendCheckbox(e,t)}toggleSelection(e=!0,t=!1){const i=super.toggleSelection(e,t);if(i&&e)for(const e in this.bubbles.bubbles){if(this.bubbles.skippedMids.has(+e))continue;const t=this.bubbles.bubbles[e];this.toggleElementCheckbox(t,this.isSelecting)}return i}toggleElementCheckbox(e,t){if(!this.canSelectBubble(e))return;const i=super.toggleElementCheckbox(e,t);return i&&e.classList.contains("is-grouped")&&this.bubbles.getBubbleGroupedItems(e).forEach((e=>this.toggleElementCheckbox(e,t))),i}isElementShouldBeSelected(e){const t=e.classList.contains("is-grouped");return super.isElementShouldBeSelected(e)&&(!t||this.isGroupedMidsSelected(e))}isGroupedBubbleSelected(e){const t=this.getCheckboxInputFromElement(e);return null==t?void 0:t.checked}getMidsFromGroupContainer(e){const t=this.chat.bubbles.getBubbleGroupedItems(e);return t.length||t.push(e),t.map((e=>+e.dataset.mid))}isGroupedMidsSelected(e){const t=this.getMidsFromGroupContainer(e),i=t.filter((e=>this.isMidSelected(this.chat.peerId,e)));return t.length===i.length}getCheckboxInputFromElement(e){return e.classList.contains("document-container")?e.querySelector("label input"):super.getCheckboxInputFromElement(e)}canSelectBubble(e){return!(e.classList.contains("service")||e.classList.contains("is-outgoing")||e.classList.contains("is-error")||e.classList.contains("bubble-first")||e.classList.contains("avoid-selection"))}}},9807:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(1405),n=i(2325),a=i(9750),o=i(3512),r=i(3855);class d{constructor(e={}){const t=this.label=document.createElement("label");t.classList.add("checkbox-field"),e.restriction&&t.classList.add("checkbox-field-restriction"),e.round&&t.classList.add("checkbox-field-round"),e.disabled&&this.toggleDisability(!0),this.listenerSetter=e.listenerSetter;const i=this.input=document.createElement("input");if(i.classList.add("checkbox-field-input"),i.type="checkbox",e.name&&(i.id="input-"+e.name),e.checked&&(i.checked=!0),e.stateKey){let t=!1;const s=()=>{if(!t)return;let s;s=e.stateValues?e.stateValues[i.checked?1:0]:i.checked,o.Z.managers.appStateManager.setByKey(e.stateKey,s)};r.Z.getState().then((i=>{t=!0;const s=(0,a.Z)(i,e.stateKey);let n;n=e.stateValues?1===e.stateValues.indexOf(s):s,this.setValueSilently(n)})),e.listenerSetter?e.listenerSetter.add(i)("change",s):i.addEventListener("change",s)}let d;if(e.text?(d=this.span=document.createElement("span"),d.classList.add("checkbox-caption"),(0,n.$d)(d,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(i),e.toggle){t.classList.add("checkbox-field-toggle");const e=document.createElement("div");e.classList.add("checkbox-toggle"),t.append(e)}else{const e=document.createElement("div");e.classList.add("checkbox-box");const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("checkbox-box-check"),i.setAttributeNS(null,"viewBox","0 0 24 24");const s=document.createElementNS("http://www.w3.org/2000/svg","use");s.setAttributeNS(null,"href","#check"),s.setAttributeNS(null,"x","-1"),i.append(s);const n=document.createElement("div");n.classList.add("checkbox-box-background");const a=document.createElement("div");a.classList.add("checkbox-box-border"),e.append(a,n,i),t.append(e)}d&&t.append(d),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),(0,s.Z)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},4489:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n extends s.ZP{constructor(e){super(Object.assign(e,{plainText:!0})),this.options=e;const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let i=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const s=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(s);const n=this.value.length;if(n===e.length)e.onFill(this.value);else if(n===i)return;i=n}))}}},5592:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(1168),n=i(8127);function a(e){return new Promise(((t,i)=>{var a;const{button:o,checkbox:r}=e;o.callback=i=>{t(r||!i?i?!!i.size:void 0:e.checkboxes.map((e=>i.has(e.text))))};const d=(0,s.x)(e.buttons||[o]),l=d.find((e=>e.isCancel));l.callback=()=>{i()},e.buttons=d,null!==(a=e.checkboxes)&&void 0!==a||(e.checkboxes=r&&[r]),new n.Z("popup-confirmation",e).show()}))}},5431:(e,t,i)=>{"use strict";i.d(t,{Z:()=>S});var s=i(9976),n=i(3910),a=i(8497),o=i(4668),r=i(5565),d=i(130),l=i(4789),c=i(144),h=i(2325),u=i(8115),p=i(3512),f=i(671),m=i(503),g=i(8805);let v;const b=()=>{v=h.ZP.countriesList.filter((e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)})).sort(((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name)))};let y=()=>{b(),p.Z.addEventListener("language_change",(()=>{b()}))};const w=new Set(["FT"]);class S extends m.ZP{constructor(e={}){super(Object.assign({label:"Country",name:(0,c.a)()},e)),this.options=e,this.hidePicker=()=>{void 0===this.hideTimeout&&(this.selectWrapper.classList.remove("active"),this.hideTimeout=window.setTimeout((()=>{this.selectWrapper.classList.add("hide"),this.hideTimeout=void 0}),200))},this.selectCountryByTarget=e=>{var t,i;const s=e.querySelector("[data-default-name]").dataset.defaultName,n=e.querySelector(".phone-code"),a=null==n?void 0:n.innerText,o=a&&a.replace(/\D/g,"");(0,r.Z)(this.input,(0,h.ag)(s)),this.simulateInputEvent(),this.lastCountrySelected=v.find((e=>e.default_name===s)),this.lastCountryCodeSelected=o&&this.lastCountrySelected.country_codes.find((e=>e.country_code===o)),null===(i=(t=this.options).onCountryChange)||void 0===i||i.call(t,this.lastCountrySelected,this.lastCountryCodeSelected),this.hidePicker()},y&&(y(),y=void 0),this.liMap=new Map,this.container.classList.add("input-select");const t=this.selectWrapper=document.createElement("div");t.classList.add("select-wrapper","z-depth-3","hide");const i=document.createElement("span");i.classList.add("arrow","arrow-down"),this.container.append(i);const p=document.createElement("ul");t.appendChild(p),new g.ZP(t);let m=()=>{m=null,v.forEach((t=>{if(e.noPhoneCodes&&w.has(t.iso2))return;const i=(0,f.Ml)(t.iso2),n=[];for(let a=0,o=Math.min(t.country_codes.length,e.noPhoneCodes?1:1/0);a{if(0!==e.button)return;const t=(0,o.Z)(e.target,"LI");this.selectCountryByTarget(t)})),this.container.appendChild(t)};m(),this.input.addEventListener("focus",(e=>{m?m():v.forEach((e=>{const t=this.liMap.get(e.iso2);t&&t.forEach((e=>e.style.display=""))})),clearTimeout(this.hideTimeout),this.hideTimeout=void 0,t.classList.remove("hide"),t.offsetWidth,t.classList.add("active"),this.select(),(0,l.Z)({container:(0,a.Z)(this.container,"scrollable-y"),element:this.input,position:"start",margin:4}),setTimeout((()=>{b||(document.addEventListener("mousedown",S,{capture:!0}),b=!0)}),0)}));let b=!1;const S=e=>{(0,a.Z)(e.target,"input-select")||e.target!==this.input&&(this.hidePicker(),document.removeEventListener("mousedown",S,{capture:!0}),b=!1)},C=e=>{const t=e.key;if(e.ctrlKey||"Control"===t)return!1;const i=this.value.toLowerCase(),s=[];v.forEach((e=>{const t=this.liMap.get(e.iso2);if(!t)return;const n=[e.name,e.default_name,e.iso2];n.filter(Boolean).forEach((e=>{const t=e.split(" ").filter((e=>/\w/.test(e))).map((e=>e[0])).join("");t.length>1&&n.push(t)}));const a=!!n.filter(Boolean).find((e=>-1!==e.toLowerCase().indexOf(i)));t.forEach((e=>e.style.display=a?"":"none")),a&&s.push(e)})),0===s.length?v.forEach((e=>{const t=this.liMap.get(e.iso2);t&&t.forEach((e=>e.style.display=""))})):1===s.length&&"Enter"===t&&((0,n.Z)(e),this.selectCountryByTarget(this.liMap.get(s[0].iso2)[0]))};this.input.addEventListener("keyup",C),this.input.addEventListener("keydown",(e=>{"Enter"===e.key&&C(e)})),i.addEventListener("mousedown",(e=>{this.input.matches(":focus")?(this.hidePicker(),this.input.blur()):(e.cancelBubble=!0,e.preventDefault(),this.input.focus())}))}getSelected(){return{country:this.lastCountrySelected,code:this.lastCountryCodeSelected}}selectCountryByIso2(e){this.selectCountryByTarget(this.liMap.get(e)[0])}override(e,t,i){var s,n;(0,r.Z)(this.input,e?(0,h.ag)(e.default_name):i),this.lastCountrySelected=e,this.lastCountryCodeSelected=t,null===(n=(s=this.options).onCountryChange)||void 0===n||n.call(s,this.lastCountrySelected,this.lastCountryCodeSelected)}}},6628:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(4762),n=i(5296),a=i(3228),o=i(5814);class r{constructor(e,t,i){this.width=e,this.height=t,this.multiply=i;const s=this.canvas=document.createElement("canvas"),n=this.dpr=window.devicePixelRatio;s.width=e*n,s.height=t*n,s.classList.add("canvas-thumbnail","canvas-dots"),this.paused=!0,this.autoplay=!0,this.tempId=0,this.context=s.getContext("2d")}prepare(){let e=Math.round(this.width*this.height/(35*(s.IS_MOBILE?2:1)));e*=this.multiply||1,e=Math.min(s.IS_MOBILE?1e3:2200,e),e=Math.round(e);const t=this.dots=new Array(e);for(let i=0;i=.8?1:.5)*this.dpr,a=new Path2D;return a.arc(t,i,n,0,2*Math.PI,!1),{x:t,y:i,opacity:s,radius:n,mOpacity:s,adding:null!=e?e:Math.random()>=.5,counter:0,path:a}}draw(){const{context:e,canvas:t,dots:i}=this;e.clearRect(0,0,t.width,t.height),e.fillStyle="#fff";for(let t=0,s=i.length;t=1&&(i[t]=this.generateDot(s.adding))):s.mOpacity>=1&&(s.adding=!1)}}remove(){this.pause()}pause(){this.paused||(this.paused=!0,++this.tempId)}renderFirstFrame(){this.dots||this.prepare(),this.draw()}play(){if(!this.paused)return;this.paused=!1;const e=++this.tempId;this.dots||this.prepare(),(0,n.jt)((()=>this.tempId===e&&!this.paused&&(this.draw(),!0)))}static create({width:e,height:t,middleware:i,animationGroup:s,multiply:n}){const a=new r(e,t,n);return a.renderFirstFrame(),o.Z.addAnimation(a,s,a.canvas,i),a}}},2621:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(187),n=i(9331),a=i(8119),o=i(5953),r=i(1507);class d{constructor(e){this._disabled=!1,this.avatarSize=120,this.isChanged=()=>{if(this.uploadAvatar)return!0;let e=0,t=0,i=0;return this.inputFields.forEach((s=>{s.isValid()&&(s.isChanged()&&++e,s.required&&++i),s.required&&++t})),t===i&&e>0},this.handleChange=()=>{this.nextBtn.classList.toggle("is-visible",this.isChanged())},(0,o.Z)(this,e),this.peerId||(this.peerId=r.NM),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=(0,a.Z)({icon:"check"}),e.withoutAvatar||(this.avatarElem=new n.Z,this.avatarElem.classList.add("avatar-placeholder","avatar-"+this.avatarSize),this.avatarElem.updateWithOptions({peerId:this.peerId}),e.doNotEditAvatar||(this.avatarEdit=new s.Z((e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()}),e.popupOptions),this.avatarEdit.container.append(this.avatarElem))),this.inputFields.forEach((e=>{this.listenerSetter.add(e.input)("input",this.handleChange)})),this.handleChange()}get disabled(){return this._disabled}set disabled(e){this._disabled=e,this.inputFields.forEach((t=>t.input.toggleAttribute("disabled",e))),this.handleChange()}lockWithPromise(e,t=!1){this.disabled=!0,e.then((()=>{t&&(this.disabled=!1)}),(()=>{this.disabled=!1}))}}},3173:(e,t,i)=>{"use strict";i.d(t,{Yd:()=>Y,Jo:()=>J,ZP:()=>te});var s=i(5432),n=i(4271),a=i(3512),o=i(5814),r=i(6008),d=i(2153),l=i(4332),c=i(5117),h=i(6039),u=i(1080),p=i(8805),f=i(279),m=i(2738);class g{constructor(e){this.managers=e}init(){this.content=document.getElementById("content-gifs");const e=this.content.firstElementChild;(0,m.fc)(e,J.onMediaClick);const t=this.scrollable=new p.ZP(this.content,"GIFS"),i=new u.Z(e,Y,t),s=(0,f.y)(this.content,!0);this.managers.appDocsManager.getGifs().then((e=>{e.forEach((e=>{i.add(e)})),s.remove()})),te.addLazyLoadQueueRepeat(i.lazyLoadQueue,i.processInvisibleDiv),this.init=null}onClose(){}}var v=i(6057),b=i(410),y=i(3552),w=i(3607),S=i(4755),C=i(8497),L=i(1507),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const I="GIFS-SEARCH";class M extends y._{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>E(this,void 0,void 0,(function*(){const t=(0,C.Z)(e.target,"gif");if(!t)return;const i=t.dataset.docId;(yield n.ZP.chat.input.sendMessageWithDocument(i))?S.Z.isMobile&&l.ZP.onCloseBtnClick():console.warn("got no doc by id:",i)}))}init(){this.container.id="search-gifs-container",this.inputSearch=new w.Z("SearchGifsTitle",(e=>{this.reset(),this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.gifsDiv=document.createElement("div"),this.gifsDiv.classList.add("gifs-masonry"),(0,m.fc)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new u.Z(this.gifsDiv,I,this.scrollable),l.ZP.toggleSidebar(!0).then((()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}}))}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",o.Z.checkAnimations(void 0,I),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}search(e,t=!0){return E(this,void 0,void 0,(function*(){if(!this.searchPromise&&!this.loadedAll){this.gifBotPeerId||(this.gifBotPeerId=(yield this.managers.appUsersManager.resolveUsername("gif")).id.toPeerId(!1));try{this.searchPromise=this.managers.appInlineBotsManager.getInlineResults(L.NM,this.gifBotPeerId,e,this.nextOffset);const{results:i,next_offset:s}=yield this.searchPromise;if(this.inputSearch.value!==e)return;this.searchPromise=null,this.nextOffset=s,t&&(this.gifsDiv.innerHTML=""),i.length?i.forEach((e=>{"botInlineMediaResult"===e._&&e.document&&this.masonry.add(e.document)})):this.loadedAll=!0,this.scrollable.onScroll()}catch(e){throw this.searchPromise=null,console.error("gifs loading error:",e),e}}}))}}var P=i(6787),Z=i(2325),T=i(7625),k=i(130),x=i(8115),A=i(9259),_=i(3541);class F extends y._{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new d.Z,this.inputSearch=new w.Z("StickersTab.SearchPlaceholder",(e=>{this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.setsDiv=document.createElement("div"),this.setsDiv.classList.add("sticker-sets"),this.scrollable.append(this.setsDiv),(0,A.Z)({listenTo:this.setsDiv,listenerSetter:this.listenerSetter}),(0,m.fc)(this.setsDiv,(e=>{const t=(0,C.Z)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void n.ZP.chat.input.sendMessageWithDocument(e)}const i=(0,C.Z)(e.target,"sticker-set");if(!i)return;const s=i.dataset.stickerSet,a=i.dataset.access_hash,o=(0,C.Z)(e.target,"sticker-set-button");o?(e.preventDefault(),e.cancelBubble=!0,o.setAttribute("disabled","true"),this.managers.appStickersManager.getStickerSet({id:s,access_hash:a}).then((e=>{this.managers.appStickersManager.toggleStickerSet(e.set).then((t=>{t&&(o.textContent="",o.append((0,Z.ag)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),o.classList.toggle("gray",!!e.set.installed_date))})).finally((()=>{o.removeAttribute("disabled")}))}))):this.managers.appStickersManager.getStickerSet({id:s,access_hash:a}).then((e=>{new P.Z(e.set).show()}))}),{listenerSetter:this.listenerSetter}),l.ZP.toggleSidebar(!0).then((()=>{this.renderFeatured()}))}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",o.Z.checkAnimations(void 0,"STICKERS-SEARCH"),super.onCloseAfterTimeout()}renderSet(e){const t=document.createElement("div");t.classList.add("sticker-set");const i=document.createElement("div");i.classList.add("sticker-set-header");const s=document.createElement("div");s.classList.add("sticker-set-details"),s.innerHTML='
',(0,k.Z)(s.firstElementChild,(0,x.Z)(e.title));const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append((0,Z.ag)("Stickers",[e.count])),s.append(n);const a=document.createElement("button");a.classList.add("btn-primary","btn-color-primary","sticker-set-button"),a.append((0,Z.ag)(e.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),e.installed_date&&a.classList.add("gray"),i.append(s,a);const o=document.createElement("div");o.classList.add("sticker-set-stickers");const r=Math.min(5,e.count);for(let e=0;e{for(let t=0;t{this.inputSearch.value||(e=this.filterRendered("",e)).forEach((e=>{this.renderSet(e.set)}))}))}filterRendered(e,t){t=t.slice();const i=Array.from(this.setsDiv.children);return(0,T.Z)(i,(i=>{const s=i.dataset.stickerSet,n=t.findIndex((e=>e.set.id===s));-1!==n?t.splice(n,1):e&&i.dataset.title.toLowerCase().includes(e.toLowerCase())||i.remove()})),o.Z.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?this.managers.appStickersManager.searchStickerSets(e,!1).then((t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach((e=>{this.renderSet(e.set)}))})):this.renderFeatured()}}var D,R=i(4668),B=i(8799),N=i(2648),O=i(3910),U=i(6339),H=i(5418),z=i(4762),j=i(3815),G=i(319),V=i(4789),K=i(6802),W=i.n(K),$=i(669),q=i(3299),Q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Y="emoticons-dropdown",X={forceDuration:200,transitionFunction:W()(.42,0,.58,1)};class J extends U.Z{constructor(){super({element:document.getElementById("emoji-dropdown"),ignoreOutClickClassName:"input-message-input"}),this.tabId=-1,this.onSelectTabClick=e=>{if(this.tabId!==e)o.Z.checkAnimations(!0,Y),this.tabId=e,this.searchButton.classList.toggle("hide",this.tabId===this.emojiTab.tabId),this.deleteBtn.classList.toggle("hide",this.tabId!==this.emojiTab.tabId);else{const{tab:e}=this;this.scrollTo(e,e.scrollable.container.firstElementChild)}},this.checkRights=()=>Q(this,void 0,void 0,(function*(){const{peerId:e,threadId:t}=n.ZP.chat,i=this.tabsEl.children,s=Array.from(i),[a,o]=yield Promise.all([this.managers.appMessagesManager.canSendToPeer(e,t,"send_stickers"),this.managers.appMessagesManager.canSendToPeer(e,t,"send_gifs")]);s[this.stickersTab.tabId+1].toggleAttribute("disabled",!a),s[this.gifsTab.tabId+1].toggleAttribute("disabled",!o);const r=this.tabsEl.querySelector(".active");!r||(0,N.Z)(r)===this.emojiTab.tabId+1||a&&o||this.selectTab(this.emojiTab.tabId,!1)})),this.addEventListener("open",(()=>Q(this,void 0,void 0,(function*(){var e;s.Z&&(0,B.Z)()&&(yield(0,H.Z)(100)),this.element.parentElement!==n.ZP.chat.input.chatInput&&n.ZP.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),J.lazyLoadQueue.lock(),o.Z.lockIntersectionGroup(Y);const t=this.tab;null===(e=t.onOpen)||void 0===e||e.call(t)})))),this.addEventListener("opened",(()=>{var e;o.Z.unlockIntersectionGroup(Y),J.lazyLoadQueue.unlockAndRefresh();const t=this.tab;null===(e=t.onOpened)||void 0===e||e.call(t)})),this.addEventListener("close",(()=>{var e;J.lazyLoadQueue.lock(),o.Z.lockIntersectionGroup(Y),o.Z.checkAnimations(!0,Y);const t=this.tab;null===(e=t.onClose)||void 0===e||e.call(t)})),this.addEventListener("closed",(()=>{var e;o.Z.unlockIntersectionGroup(Y),J.lazyLoadQueue.unlock(),J.lazyLoadQueue.refresh(),this.savedRange=void 0;const t=this.tab;null===(e=t.onClosed)||void 0===e||e.call(t)}))}get tab(){return this.tabs[this.tabId]}init(){this.managers=a.Z.managers,this.emojiTab=new h.ZP({managers:this.managers}),this.stickersTab=new v.ZP(this.managers),this.gifsTab=new g(this.managers),this.tabs={},[this.emojiTab,this.stickersTab,this.gifsTab].forEach(((e,t)=>{e.tabId=t,this.tabs[t]=e})),this.container=this.element.querySelector(".emoji-container .tabs-container"),this.container.prepend(this.emojiTab.container,this.stickersTab.container),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=(0,r.X)(this.tabsEl,this.container,this.onSelectTabClick,(()=>{var e;const{tab:t}=this;null===(e=t.init)||void 0===e||e.call(t),o.Z.checkAnimations(!1,Y)})),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",(()=>{this.tabId===this.stickersTab.tabId?l.ZP.isTabExists(F)||l.ZP.createTab(F).open():l.ZP.isTabExists(M)||l.ZP.createTab(M).open()})),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),(0,m.fc)(this.deleteBtn,(e=>{(0,O.Z)(e);const t=n.ZP.chat.input.messageInput;let i=$.Z.getInstance().getSavedRange(t);i||(i=document.createRange(),i.setStartAfter(t.lastChild));const s=i.cloneRange();if(i.collapsed){const{node:e,offset:n}=(0,q.q)(t,i.endContainer,i.endOffset);let a;if(n)a=e;else{if(a=e.previousSibling,!a)return;for(;a.nodeType===a.TEXT_NODE&&!a.nodeValue&&(a=a.previousSibling););if(a.nodeType===a.ELEMENT_NODE&&!a.isContentEditable)return}if(a.nodeType===a.ELEMENT_NODE&&"IMG"===a.tagName)s.selectNode(a);else{const e=[...a.textContent];let t;if(n){let i=0;t=e.find((e=>(i+=e.length,i>=n)))}else t=e.pop()||"";const i=n?n-t.length:a.textContent.length-t.length;s.setStart(a,i)}}s.deleteContents(),n.ZP.chat.input.messageInputField.simulateInputEvent()}));const e=z.IS_APPLE_MOBILE&&!1,t=e?this.stickersTab.tabId:this.emojiTab.tabId;if(e&&this.tabsEl.children[1].classList.add("hide"),(0,m.tH)(this.tabsEl.children[t+1]),this.tabs[t].init&&this.tabs[t].init(),!s.Z){let e,t=!1;const i=t=>{e=t};j.Z.addEventListener("change",(s=>{s?t||(document.body.addEventListener("mousemove",i),t=!0):t&&(document.body.removeEventListener("mousemove",i),e&&this.onMouseOut(e))}))}return n.ZP.addEventListener("peer_changing",(()=>{this.toggle(!1)})),n.ZP.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}getElement(){return this.element}scrollTo(e,t){e.scrollable.scrollIntoViewNew(Object.assign({element:t,axis:"y",position:"start"},X))}static sendDocId(e,t,i){return Q(this,void 0,void 0,(function*(){return(yield n.ZP.chat.input.sendMessageWithDocument(e,void 0,t,i))?(ee.container&&(ee.forceClose=!0,ee.toggle(!1)),!0):(console.warn("got no doc by id:",e),!1)}))}addLazyLoadQueueRepeat(e,t){this.addEventListener("close",(()=>{e.lock()})),this.addEventListener("closed",(()=>{const i=e.intersector.getVisible();for(const e of i)t(e);e.intersector.clearVisible()})),this.addEventListener("opened",(()=>{e.unlockAndRefresh()}))}getSavedRange(){return this.getGoodRange()||this.savedRange}getGoodRange(){const e=document.getSelection();if(e.rangeCount&&document.activeElement===n.ZP.chat.input.messageInput)return e.getRangeAt(0)}}D=J,J.lazyLoadQueue=new d.Z(1),J.menuOnClick=(e,t,i,s,n,a)=>{let o=-1;const r=(e,t=!0)=>{if(e===n)return!1;let i=!1;return n&&(n.elements.menuTab.classList.remove("active"),n.menuScroll&&n.menuScroll!==e.menuScroll&&(i=!0,n.menuScroll.container.parentElement.classList.remove("active"),n.menuScroll.scrollIntoViewNew(Object.assign({element:n.menuScroll.container.firstElementChild,forceDirection:t?void 0:V.f.Static,position:"center",axis:"x"},X)))),e.elements.menuTab.classList.add("active"),e.menuScroll&&(e.menuScroll.container.parentElement.classList.add("active"),t&&s.scrollIntoViewNew(Object.assign({element:e.menuScroll.container.parentElement,position:"center",axis:"x"},X))),n&&((e,t)=>{const i=e.menuScroll||s;i&&i.scrollIntoViewNew(Object.assign({element:e.elements.menuTab,position:"center",axis:"x",getElementPosition:t?({elementPosition:e})=>e-106:void 0},X))})(e,i),n=e,!0};let d=!1;const l=new c.Z(i.container,((t,s)=>{if(d)return;if(Math.abs(o-i.container.scrollTop)<=1)return;o=-1;const n=e.getCategoryByContainer(s),a=(0,N.Z)(s);(t||!a&&!n.menuScroll)&&r(n)}));(0,m.fc)(t,(t=>{let s=(0,C.Z)(t.target,"menu-horizontal-div-item");if(!s){if(s=(0,C.Z)(t.target,"menu-horizontal-inner"),!s||s.classList.contains("active"))return;s=s.firstElementChild.firstElementChild}const n=(0,N.Z)(s),a=e.getCategoryByMenuTab(s);r(a);let l=0,c=0;if(n>0||a.menuScroll){const e=a.elements.container;c=1,l=e.offsetTop+c}o=l,d=!0,i.scrollIntoViewNew(Object.assign({element:l?a.elements.container:i.container.firstElementChild,position:"start",axis:"y",getElementPosition:l?({elementPosition:e})=>e+c:void 0},X)).finally((()=>{r(a),d=!1}))}),{listenerSetter:a});const h=i.onAdditionalScroll?i.onAdditionalScroll.bind(i):G.Z;return i.onAdditionalScroll=()=>{e.content.parentElement.classList.toggle("scrolled-top",!i.scrollTop),h()},{stickyIntersector:l,setActive:r,setActiveStatic:t=>{if(null==n?void 0:n.local)return;e.scrollable.scrollTop=t.elements.container.offsetTop+1;const i=e.menuScroll.container,s=t.elements.menuTab;i.scrollLeft=s.offsetLeft-i.clientWidth/2+s.offsetWidth/2,r(t,!1)}}},J.onMediaClick=(e,t=!1,i)=>Q(void 0,void 0,void 0,(function*(){const s=(0,R.Z)(e.target,"DIV");if(!s)return!1;const n=s.dataset.docId;return!!n&&D.sendDocId(n,t,i)}));const ee=new J;b.GO.emoticonsDropdown=ee;const te=ee},6039:(e,t,i)=>{"use strict";i.d(t,{IA:()=>F,ZP:()=>j,xG:()=>D});var s=i(3173),n=i(3910),a=i(8497),o=i(3035),r=i(5418),d=i(4271),l=i(3512),c=i(671),h=i(279),u=i(8805),p=i(9976),f=i(5432),m=i(8799),g=i(3447),v=i(7746),b=i(8115),y=i(7197),w=i(5400),S=i(2738),C=i(6057),L=i(9405),E=i(2940),I=i(4755),M=i(1273),P=i(9259),Z=i(4064),T=i(4484),k=i(6787),x=i(2796),A=i(5953);const _=new Set;function F(e,t,i=!1,s=!1){var n;const a=document.createElement("span");let r;if(a.classList.add("super-emoji"),s&&!p.Z?r=function(e){return(0,w.ZP)(e,{entities:[(0,y.Z)(e)]})}(e):(e=(0,v.Z)(e),r=(0,b.Z)(e)),a.append(r),a.children.length>1){const e=a.firstElementChild;a.innerHTML="",a.append(e)}if("IMG"===(null===(n=a.firstElementChild)||void 0===n?void 0:n.tagName)){const e=a.firstElementChild,t=e.src;if(!_.has(t)){e.setAttribute("loading","lazy");const i=document.createElement("span");i.classList.add("emoji-placeholder"),l.Z.settings.animationsEnabled&&(e.style.opacity="0",i.style.opacity="1"),e.addEventListener("load",(()=>{(0,o.T2)((()=>{l.Z.settings.animationsEnabled&&(e.style.opacity="",i.style.opacity=""),a.classList.remove("empty"),_.add(t)}))}),{once:!0}),a.append(i)}}return t&&(i?t.prepend(a):t.appendChild(a)),a}function D(e){const t=(0,a.Z)(e,"super-emoji");if(!t)return;const i=t.firstElementChild;return i&&i.classList.contains("custom-emoji")?{emoji:i.dataset.stickerEmoji,docId:i.dataset.docId}:e.nodeType===e.TEXT_NODE?{emoji:e.nodeValue}:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),{emoji:e.getAttribute("alt")||e.innerText})}const R="Emoji.Recent",B=[R,"recent"],N=["",""],O=[["Emoji.SmilesAndPeople","smile"],["Emoji.AnimalsAndNature","animals"],["Emoji.FoodAndDrink","eats"],["Emoji.TravelAndPlaces","car"],["Emoji.ActivityAndSport","sport"],["Emoji.Objects","lamp"],["Emoji.Flags","flag"],["Skin Tones",""]];let U;function H(){if(U)return U;U=new Map([[N,[]],[B,[]]]);for(const e in g.Z){const t=""+g.Z[e],i=O[+t[0]-1];if(!i)continue;let s=U.get(i);s||(s=[],U.set(i,s)),s[+t.slice(1)||0]=e}U.delete(O.pop()),O.unshift(N,B);const e=O.map((([e])=>e)),t=[...U.entries()].sort(((t,i)=>e.indexOf(t[0][0])-e.indexOf(i[0][0])));return U=new Map(t),U}const z=(0,L.C)(42,42);class j extends C.pw{constructor(e){super(e.managers,"super-emojis",(()=>z),16,4,0),this.onCategoryVisibility=({target:e,visible:t})=>{const i=this.categoriesMap.get(e),s=i.elements.renderer,n=[];if(s){n.push(s);const e=new Map;t?(n.push(...i.items.map((({docId:t,element:i})=>{if(!t)return i;const s=i.firstElementChild;return s.clear(!1),e.set(s.docId,new Set([s])),i}))),s.add(e,void 0,void 0,!1)):(s.clearCanvas(),s.middlewareHelper.clean())}else t&&n.push(...i.items.map((({element:e})=>e)));if(i.elements.items.replaceChildren(...n),s&&!t){const e=new Map;i.items.forEach((({docId:t,element:i})=>{if(!t)return;const s=i.firstElementChild;s.clear(),e.set(s.docId,new Set([s]))})),s.add(e,void 0,!0)}},this.onContentClick=e=>{(0,n.Z)(e);const{target:t}=e,i=(0,a.Z)(t,"emoji-category"),s=this.categoriesMap.get(i);if((0,a.Z)(t,"category-title")){if(s.local)return;return void new k.Z({id:s.set.id,access_hash:s.set.access_hash},!0).show()}const o=D(t);if(o){if(o.docId&&!l.Z.premium&&(this.isStandalone?""!==s.id:this.peerId!==l.Z.myId)){const e=document.createElement("a");return e.onclick=()=>{d.ZP.openPremiumBot(),(0,x.PE)()},void(0,x.bC)({langPackKey:"CustomEmoji.PremiumAlert",langPackArguments:[e]})}this.onClick?this.onClick(Object.assign(Object.assign({},o),{element:(0,a.Z)(t,"super-emoji").firstElementChild})):d.ZP.chat.input.onEmojiSelected(o,!1),f.Z&&(0,m.Z)()}},(0,A.Z)(this,e),this.container.classList.add("emoji-padding"),this.content.id="content-emoji",this.activeElements=[]}destroy(){var e;super.destroy(),null===(e=this.menuInnerScroll)||void 0===e||e.destroy()}init(){super.init(),this.init=void 0;const e={root:this.isStandalone?this.content:s.ZP.getElement()};this.categoriesIntersector=new E.Z(this.onCategoryVisibility,e),this.menuOnClickResult=s.Jo.menuOnClick(this,this.menu,this.scrollable,this.menuScroll,void 0,this.listenerSetter);const t=(0,h.y)(this.content,!0);let i,n;if(!this.isStandalone){const e=this.menuInnerScroll=new u.v7(void 0);e.container.classList.add("menu-horizontal-inner-scroll"),i=document.createElement("div"),i.classList.add("menu-horizontal-inner"),i.append(e.container)}H(),n=this.noRegularEmoji?new Map([[[N[0],"recent"],[]]]):H(),n.forEach(((e,[t,i])=>{const s=this.createLocalCategory(t,t,i,!i);s.elements.container.classList.remove("hide"),s.elements.items.classList.add(i&&!this.isStandalone?"is-local":"not-local"),e.forEach((e=>{const t=(0,c.zu)(e);this.addEmojiToCategory({category:s,emoji:{emoji:t},batch:!0})}))}));const a=Promise.all([this.isStandalone?void 0:(0,r.Z)(200),!this.noRegularEmoji&&this.managers.appEmojiManager.getRecentEmojis("native"),!this.isStandalone&&this.managers.appEmojiManager.getRecentEmojis("custom"),this.stickerSetId&&this.managers.appStickersManager.getLocalStickerSet(this.stickerSetId),this.managers.appEmojiManager.getCustomEmojis()]).then((([e,n,a,o,r])=>{t.remove(),o&&(a=o.documents.map((e=>e.id)));const c=this.categories[R],h=this.categories[""];if(this.isStandalone||[c&&[c,n],h&&[h,a]].filter(Boolean).forEach((([e,t])=>{e.limit=32,t.splice(32,t.length-32)})),c&&n)for(const e of n)this.addEmojiToCategory({category:c,emoji:{emoji:e},batch:!0});if(h){if(this.createRendererForCategory(h),a)for(const e of a)this.addEmojiToCategory({category:h,emoji:{emoji:"",docId:e},batch:!0});h.elements.container.style.paddingTop=".5rem"}O.forEach((([e])=>{const t=this.categories[e];t&&(this.toggleLocalCategory(t,!0),e!==R&&""!==e&&(t.menuScroll=this.menuInnerScroll,this.menuInnerScroll.container.append(t.elements.menuTab)))})),this.resizeCategories(),c&&i&&c.elements.menuTab.after(i),r.sets.forEach((e=>{this.renderStickerSet(e)})),this.listenerSetter.add(l.Z)("premium_toggle",(()=>{this.toggleCustomCategory()})),this.listenerSetter.add(l.Z)("stickers_top",this.postponedEvent((e=>{const t=this.categories[e];t&&(this.positionCategory(t,!0),this.listenerSetter.add(s.ZP)("openAfterLayout",(()=>{this.menuOnClickResult.setActiveStatic(t)}),{once:!0}))})));const u=e=>{for(const t in this.categories){const i=this.categories[t].elements.renderer;i&&(i.ignoreSettingDimensions=e,e||i.setDimensionsFromRect(void 0,!0))}};!this.isStandalone&&this.listenerSetter.add(s.ZP)("opened",(()=>{u(!1)})),!this.isStandalone&&this.listenerSetter.add(s.ZP)("close",(()=>{u(!0)})),this.listenerSetter.add(l.Z)("stickers_installed",(e=>{!this.categories[e.id]&&e.pFlags.emojis&&this.renderStickerSet(e,!0)})),this.listenerSetter.add(l.Z)("stickers_deleted",(e=>{const t=this.categories[e.id];if(this.deleteCategory(t)){const{renderer:e}=t.elements;e&&e.middlewareHelper.clean()}})),!this.isStandalone&&this.listenerSetter.add(l.Z)("emoji_recent",this.postponedEvent((e=>{const t=this.categories[e.docId?"":R];if(!t)return;const i=e.docId?t=>t.docId===e.docId:t=>t.emoji===e.emoji,s=(0,Z.Z)(t.items,i);if(s){if(t.items.unshift(s),this.isCategoryVisible(t)){const{renderer:e}=t.elements;(0,T.Z)(s.element,t.elements.items,e?1:0,-1),null==e||e.forceRender()}}else this.addEmojiToCategory({category:t,emoji:e,batch:!1,prepend:!0});0===this.closeScrollTop&&this.menuOnClickResult.setActive(e.docId?this.categories[R]:t)}))),!this.isStandalone&&this.listenerSetter.add(d.ZP)("peer_changed",(()=>{this.toggleCustomCategory()})),this.toggleCustomCategory(),this.menuOnClickResult.setActive(null!=c?c:h)}));return(0,S.fc)(this.content,this.onContentClick,{listenerSetter:this.listenerSetter}),(0,P.Z)({listenTo:this.content,listenerSetter:this.listenerSetter}),a}renderStickerSet(e,t){const i=this.createCategory(e,(0,b.Z)(e.title));this.positionCategory(i,t);const{container:n,menuTabPadding:a}=i.elements;i.elements.items.classList.add("not-local"),i.elements.container.classList.add("is-premium-set"),i.elements.title.classList.add("tgico"),this.createRendererForCategory(i),this.managers.appStickersManager.getStickerSet(e).then((({documents:e})=>{e.forEach((e=>{this.addEmojiToCategory({category:i,emoji:{docId:e.id,emoji:e.stickerEmojiRaw},batch:!0})})),this.onCategoryVisibility({target:i.elements.container,visible:this.isCategoryVisible(i)}),i.setCategoryItemsHeight(),n.classList.remove("hide")})),(0,M.Z)({set:e,container:a,group:s.Yd,lazyLoadQueue:s.Jo.lazyLoadQueue,width:32,height:32,autoplay:!1})}get peerId(){return d.ZP.chat.peerId}getCustomCategory(){return this.categories[""]}toggleCustomCategory(){const e=this.categories[""],t=l.Z.premium||this.peerId===l.Z.myId,i=t||this.isStandalone;super.toggleLocalCategory(e,!!e.items.length&&i),this.content.classList.toggle("has-premium",t)}toggleLocalCategory(e,t){""!==e.id?super.toggleLocalCategory(e,t):this.toggleCustomCategory()}createRendererForCategory(e){const t=w.KZ.create({animationGroup:s.Yd,customEmojiSize:I.Z.active.esgCustomEmoji});e.elements.renderer=t,e.elements.items.append(t)}addEmojiToCategory(e){const{category:t,emoji:i,batch:s,prepend:n}=e;let a=e.element;if(a){const e=document.createElement("span");e.classList.add("super-emoji"),e.append(a),a=e}else if(i.docId){const e=w.LD.create(i.docId),t=document.createElement("span");t.classList.add("super-emoji"),t.append(e),a=t}else a=F(i.emoji,void 0,!1);const o=Object.assign(Object.assign({},i||{emoji:void 0}),{element:a});(e.active||this.activeEmoji&&(o.docId?this.activeEmoji.docId===o.docId:this.activeEmoji.emoji===o.emoji))&&(this.activeEmoji,this.activeElements.push(o),a.classList.add("active")),t.items[n?"unshift":"push"](o),s||this.spliceExceed(t)||this.onLocalCategoryUpdate(t)}setActive(e){var t,i;(e===this.activeEmoji||(null==e?void 0:e.docId)?e.docId!==(null===(t=this.activeEmoji)||void 0===t?void 0:t.docId):(null==e?void 0:e.emoji)!==(null===(i=this.activeEmoji)||void 0===i?void 0:i.emoji))&&(this.activeEmoji=e,this.activeElements.forEach((e=>{e.element.classList.remove("active")})),this.activeElements.length=0,this.categoriesMap.forEach((t=>{t.items.forEach((t=>{(e.docId?t.docId===e.docId:t.emoji===e.emoji)&&(t.element.classList.add("active"),this.activeElements.push(t))}))})))}onClose(){this.closeScrollTop=this.scrollable.scrollTop}}},6057:(e,t,i)=>{"use strict";i.d(t,{pw:()=>_,vT:()=>x,ZP:()=>F});var s=i(3173),n=i(8497),a=i(4755),o=i(2325),r=i(8115),d=i(3512),l=i(5814),c=i(1655),h=i(7009),u=i(2940);class p extends h.Z{constructor(e,t,i){super(e),this.onVisibilityChange=t,this.elementsMap=new Map,this.intersector=new u.Z((e=>{var t;const{target:i,visible:s}=e,n=this.elementsMap.get(i);n.visible=s,s?(n.wasSeen=!0,this.queue.includes(n)||this.queue.push(n)):(0,c.Z)(this.queue,n),null===(t=this.onVisibilityChange)||void 0===t||t.call(this,e),this.setProcessQueueTimeout()}),i)}clear(){super.clear(),this.elementsMap.clear()}observe(e){this.elementsMap.set(e.div,e),super.observe(e)}unobserve(e){this.elementsMap.delete(e.div),super.unobserve(e)}}var f=i(279),m=i(6787),g=i(8805),v=i(4064),b=i(2738),y=i(4484),w=i(319),S=i(2230),C=i(5592),L=i(3163),E=i(5975),I=i(7625),M=i(9259),P=i(3699),Z=i(3541),T=i(1273),k=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class x{constructor(e,t,i,s){this.regularLazyLoadQueue=e,this.group=t,this.managers=i,this.options=s,this.animated=new Set,this.checkAnimationContainer=(e,t)=>{l.Z.getAnimations(e).forEach((e=>{t?l.Z.checkAnimation(e,!1):l.Z.removeAnimation(e)}))},this.processVisible=e=>k(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t),s=a.Z.active.esgSticker.width,n=(0,Z.ZP)({doc:i,div:e,width:s,height:s,lazyLoadQueue:null,group:this.group,onlyThumb:!1,play:!0,loop:!0,withLock:!0}).then((({render:e})=>e));return n.then((()=>{this.checkAnimationContainer(e,this.lazyLoadQueue.intersector.isVisible(e))})),n})),this.processInvisible=e=>k(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t);this.checkAnimationContainer(e,!1),e.textContent="",this.renderSticker(i,e)})),this.lazyLoadQueue=new p(void 0,(({target:e,visible:t})=>{t||this.processInvisible(e)}),s)}clear(){this.lazyLoadQueue.clear()}renderSticker(e,t,i){return t||((t=document.createElement("div")).classList.add("grid-item","super-sticker"),t.dataset.docId=""+e.id,e.animated&&this.observeAnimated(t)),(0,Z.ZP)({doc:e,div:t,lazyLoadQueue:this.regularLazyLoadQueue,group:this.group,onlyThumb:e.animated,loadPromises:i}),t}observeAnimated(e){this.animated.add(e),this.lazyLoadQueue.observe({div:e,load:this.processVisible})}unobserveAnimated(e){this.animated.delete(e),this.lazyLoadQueue.delete({div:e})}}class A{constructor(e){var t,i;const s=document.createElement("div");s.classList.add("emoji-category");const n=document.createElement("div");let a,o,r;n.classList.add("category-items"),e.title&&(a=document.createElement("div"),a.classList.add("category-title"),a.append(e.title)),e.noMenuTab||(o=(0,S.Z)(void 0,{noRipple:!0}),o.classList.add("menu-horizontal-div-item"),r=document.createElement("div"),r.classList.add("menu-horizontal-div-item-padding"),o.append(r)),a&&s.append(a),s.append(n),this.elements={container:s,title:a,items:n,menuTab:o,menuTabPadding:r},this.id=e.id,this.items=[],this.getContainerSize=e.getContainerSize,this.getElementMediaSize=e.getElementMediaSize,this.gapX=null!==(t=e.gapX)&&void 0!==t?t:0,this.gapY=null!==(i=e.gapY)&&void 0!==i?i:0}setCategoryItemsHeight(){const{width:e}=this.getContainerSize(),t=this.getElementMediaSize().width;let i=e/t;this.gapX&&(i-=Math.floor(i-1)*this.gapX/t),i=Math.floor(i);const s=Math.ceil(this.items.length/i);let n=s*t;this.gapY&&(n+=(s-1)*this.gapY),this.elements.items.style.minHeight=n+"px"}}class _{constructor(e,t,i,n,a,o){this.managers=e,this.categoryItemsClassName=t,this.getElementMediaSize=i,this.padding=n,this.gapX=a,this.gapY=o,this.mounted=!1,this.resizeCategories=()=>{for(const[e,t]of this.categoriesMap)t.setCategoryItemsHeight()},this.postponedEvent=e=>(...t)=>{s.ZP.isActive()?this.postponedEvents.push({cb:e,args:t}):e(...t)},this.categories={},this.categoriesMap=new Map,this.categoriesByMenuTabMap=new Map,this.localCategories=[],this.postponedEvents=[],this.listenerSetter=new P.Z,this.container=document.createElement("div"),this.container.classList.add("tabs-tab","emoticons-container"),this.menuWrapper=document.createElement("div"),this.menuWrapper.classList.add("menu-wrapper","emoticons-menu-wrapper"),this.menu=document.createElement("nav"),this.menu.className="menu-horizontal-div no-stripe justify-start emoticons-menu",this.menuWrapper.append(this.menu),this.menuScroll=new g.v7(this.menuWrapper),this.content=document.createElement("div"),this.content.classList.add("emoticons-content"),this.container.append(this.menuWrapper,this.content),this.scrollable=new g.ZP(this.content,"STICKERS")}getCategoryByContainer(e){return this.categoriesMap.get(e)}getCategoryByMenuTab(e){return this.categoriesByMenuTabMap.get(e)}createCategory(e,t,i,s){const n=new A({id:""+e.id,title:t,overflowElement:this.content,getContainerSize:()=>{var e,t;const{width:i,height:s}=null!==(t=null===(e=this.getContainerSize)||void 0===e?void 0:e.call(this))&&void 0!==t?t:this.content.getBoundingClientRect();return{width:i-this.padding,height:s}},getElementMediaSize:this.getElementMediaSize,gapX:this.gapX,gapY:this.gapY,noMenuTab:s});this.categoryItemsClassName&&n.elements.items.classList.add(this.categoryItemsClassName);const a=n.elements.container;return a.classList.add("hide"),n.set=e,this.categories[e.id]=n,this.categoriesMap.set(a,n),!s&&this.categoriesByMenuTabMap.set(n.elements.menuTab,n),this.categoriesIntersector.observe(a),!s&&this.menuOnClickResult.stickyIntersector.observeStickyHeaderChanges(a),i||!s&&n.elements.menuTab.classList.add("not-local"),n}positionCategory(e,t){const{menuTab:i,container:s}=e.elements,n=t?this.localCategories.filter((e=>e.mounted)).length:65535;let a=!1;const o=t?this.localCategories.filter((e=>e.menuScroll&&!a?(a=!0,!0):e.mounted&&!e.menuScroll&&e.elements.menuTab)).length:65535;(0,y.Z)(s,this.scrollable.container,n),(0,y.Z)(i,this.menu,o)}isCategoryVisible(e){return this.categoriesIntersector.getVisible().includes(e.elements.container)}toggleLocalCategory(e,t){var i;if(t){const t=this.localCategories.indexOf(e),i=this.localCategories.slice(0,t);let s=0,n=0;i.forEach((e=>{e.mounted?e.elements.menuTab&&!e.menuScroll||++n:(++s,++n)}));const a=t-s,o=t-n;e.elements.menuTab&&(0,y.Z)(e.elements.menuTab,this.menu,o),(0,y.Z)(e.elements.container,this.scrollable.container,a)}else null===(i=e.elements.menuTab)||void 0===i||i.remove(),e.elements.container.remove();e.mounted=t}createLocalCategory(e,t,i,s){const n=this.createCategory({id:e},t&&(0,o.ag)(t),!0,s);return n.local=!0,this.localCategories.push(n),n.elements.title&&n.elements.title.classList.add("disable-hover"),s||(i&&n.elements.menuTab.classList.add("tgico","tgico-"+i),n.elements.menuTabPadding.remove()),this.toggleLocalCategory(n,!1),n}onLocalCategoryUpdate(e){e.setCategoryItemsHeight(),this.toggleLocalCategory(e,!!e.items.length)}deleteCategory(e){return!!e&&(e.elements.container.remove(),e.elements.menuTab.remove(),this.categoriesIntersector.unobserve(e.elements.container),delete this.categories[e.id],this.categoriesMap.delete(e.elements.container),this.categoriesByMenuTabMap.delete(e.elements.menuTab),!0)}spliceExceed(e){if(void 0===e.limit)return!1;const{items:t,limit:i}=e;return t.splice(i,t.length-i).forEach((({element:e})=>{e.remove()})),this.onLocalCategoryUpdate(e),!0}init(){this.listenerSetter.add(s.ZP)("closed",(()=>{this.postponedEvents.forEach((({cb:e,args:t})=>{e(...t)})),this.postponedEvents.length=0}))}destroy(){var e,t,i,s;this.getContainerSize=void 0,this.postponedEvents.length=0,null===(e=this.categoriesIntersector)||void 0===e||e.disconnect(),this.listenerSetter.removeAll(),this.scrollable.destroy(),null===(t=this.menuScroll)||void 0===t||t.destroy(),null===(s=null===(i=this.menuOnClickResult)||void 0===i?void 0:i.stickyIntersector)||void 0===s||s.disconnect()}}class F extends _{constructor(e){super(e,"super-stickers",(()=>a.Z.active.esgSticker),6,4,4),this.onCategoryVisibility=({target:e,visible:t,entry:i})=>{const s=this.categoriesMap.get(e);s.elements.items.replaceChildren(...t?s.items.map((({element:e})=>e)):[])},this.setTyping=(e=!1)=>{(e||s.ZP.isActive()&&s.ZP.tab===this)&&d.Z.dispatchEvent("choosing_sticker",!e)},this.container.classList.add("stickers-padding"),this.content.id="content-stickers"}setFavedLimit(e){this.categories.faved.limit=e}categoryAppendStickers(e,t){const{container:i}=e.elements;t.then((t=>{const s=this.isCategoryVisible(e);t.forEach((t=>{const i=this.superStickerRenderer.renderSticker(t);e.items.push({document:t,element:i}),s&&e.elements.items.append(i)})),e.setCategoryItemsHeight(),i.classList.remove("hide")}))}renderStickerSet(e,t=!1){return k(this,void 0,void 0,(function*(){const i=this.createCategory(e,(0,r.Z)(e.title)),{menuTabPadding:n}=i.elements,a=this.managers.appStickersManager.getStickerSet(e);this.categoryAppendStickers(i,a.then((e=>e.documents))),this.positionCategory(i,t),(0,T.Z)({set:e,container:n,group:s.Yd,lazyLoadQueue:s.Jo.lazyLoadQueue,width:32,height:32,autoplay:!1})}))}init(){super.init(),this.scrollable.onAdditionalScroll=()=>{this.setTyping()};const e={root:s.ZP.getElement()};this.categoriesIntersector=new u.Z(this.onCategoryVisibility,e);const t=e=>{e.elements.items.replaceChildren(),e.items.forEach((({element:e})=>this.superStickerRenderer.unobserveAnimated(e))),e.items.length=0};this.scrollable.container.addEventListener("click",(e=>{const t=e.target;if((0,n.Z)(t,"category-title")){const e=(0,n.Z)(t,"emoji-category"),i=this.categoriesMap.get(e);if(i.local)return;new m.Z({id:i.set.id,access_hash:i.set.access_hash}).show()}else s.Jo.onMediaClick(e)})),this.menuOnClickResult=s.Jo.menuOnClick(this,this.menu,this.scrollable,this.menuScroll);const i=(0,f.y)(this.content,!0),o=(e,t)=>{e.limit&&(t=t.slice(0,e.limit));const i=new Set(t.map((e=>e.id)));(0,I.Z)(e.items,(t=>{i.has(t.document.id)||this.deleteSticker(e,t.document,!0)})),this.toggleLocalCategory(e,!!t.length),(0,I.Z)(t,((t,i)=>{this.unshiftSticker(e,t,!0,i)})),this.spliceExceed(e),e.elements.container.classList.remove("hide")},r=this.createLocalCategory("faved","FavoriteStickers","savedmessages"),l=this.createLocalCategory("recent","Stickers.Recent","recent");l.limit=20;const c=(0,S.Z)("close",{noRipple:!0});l.elements.title.append(c),(0,b.fc)(c,(()=>{(0,C.Z)({titleLangKey:"ClearRecentStickersAlertTitle",descriptionLangKey:"ClearRecentStickersAlertMessage",button:{langKey:"Clear"}}).then((()=>{this.managers.appStickersManager.clearRecentStickers()}),w.Z)}));const h=this.createLocalCategory("premium","PremiumStickersShort"),p=document.createElement("span");p.classList.add("tgico-star","color-premium"),h.elements.menuTab.append(p);const g=[Promise.all([this.managers.apiManager.getLimit("favedStickers"),this.managers.appStickersManager.getFavedStickersStickers()]).then((([e,t])=>{this.setFavedLimit(e),o(r,t)})),this.managers.appStickersManager.getRecentStickersStickers().then((e=>{o(l,e)})),this.managers.appStickersManager.getAllStickers().then((e=>{for(const t of e.sets)this.renderStickerSet(t)})),this.managers.appStickersManager.getPremiumStickers().then((e=>{const t=e.length;this.toggleLocalCategory(h,d.Z.premium&&!!t),this.categoryAppendStickers(h,Promise.resolve(e)),d.Z.addEventListener("premium_toggle",(e=>{this.toggleLocalCategory(this.categories.premium,e&&!!t)}))}))];Promise.race(g).finally((()=>{i.remove()})),Promise.all(g).finally((()=>{this.mounted=!0,this.setTyping();const e=this.categories.faved,t=this.categories.recent;this.menuOnClickResult.setActive(e.items.length?e:t),d.Z.addEventListener("stickers_installed",(e=>{this.categories[e.id]||this.renderStickerSet(e,!0)}))})),this.superStickerRenderer=new x(s.Jo.lazyLoadQueue,s.Yd,this.managers,e);const v=this.superStickerRenderer.lazyLoadQueue;s.ZP.addLazyLoadQueueRepeat(v,this.superStickerRenderer.processInvisible),d.Z.addEventListener("sticker_updated",(({type:e,document:t,faved:i})=>{const s=this.categories["faved"===e?"faved":"recent"];s&&(i?this.unshiftSticker(s,t):this.deleteSticker(s,t))})),d.Z.addEventListener("stickers_deleted",(({id:e})=>{const i=this.categories[e];this.deleteCategory(i)&&t(i)})),d.Z.addEventListener("stickers_top",this.postponedEvent((e=>{const t=this.categories[e];t&&(this.positionCategory(t,!0),s.ZP.addEventListener("openAfterLayout",(()=>{this.menuOnClickResult.setActiveStatic(t)}),{once:!0}))}))),d.Z.addEventListener("stickers_updated",(({type:e,stickers:t})=>{const i=this.categories["faved"===e?"faved":"recent"];i&&o(i,t)})),d.Z.addEventListener("app_config",(()=>{this.managers.apiManager.getLimit("favedStickers").then((e=>{this.setFavedLimit(e)}))})),a.Z.addEventListener("resize",this.resizeCategories),(0,M.Z)({listenTo:this.content,listenerSetter:new P.Z});const y="menu";(0,L.Z)({listenTo:this.content,verifyRecent:e=>!!(0,E.Z)(e,this.categories.recent.elements.items),onOpen:()=>{s.ZP.setIgnoreMouseOut(y,!0)},onClose:()=>{s.ZP.setIgnoreMouseOut(y,!1)}}),this.init=null}deleteSticker(e,t,i){const s=(0,v.Z)(e.items,(e=>e.document.id===t.id));s&&(s.element.remove(),i||this.onLocalCategoryUpdate(e))}unshiftSticker(e,t,i,s){if(void 0!==s){const i=e.items[s];if(i&&i.document.id===t.id)return}let n=(0,v.Z)(e.items,(e=>e.document.id===t.id));n||(n={element:this.superStickerRenderer.renderSticker(t),document:t}),e.items.unshift(n),e.elements.items.prepend(n.element),i||this.spliceExceed(e)}unshiftRecentSticker(e){this.managers.appStickersManager.saveRecentSticker(e.id)}deleteRecentSticker(e){this.managers.appStickersManager.saveRecentSticker(e.id,!0)}onClosed(){this.setTyping(!0)}onOpened(){this.setTyping(),this.resizeCategories()}}},36:(e,t,i)=>{"use strict";i.d(t,{G:()=>s});const s=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e}},5948:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2325);function n(e){const t=document.createElement("span");return t.classList.add("badge-fake"),(0,s.$d)(t,e?"ScamMessage":"FakeMessage"),t}},1080:(e,t,i)=>{"use strict";i.d(t,{Z:()=>f});var s=i(5814),n=i(3725),a=i(3035),o=i(3512),r=i(8847),d=i(7009),l=i(2940);class c extends d.Z{constructor(e,t){super(e),this.onVisibilityChange=t,this.intersector=new l.Z((e=>{const{target:t,visible:i}=e,s=(0,r.Z)(this.queue,(e=>e.div===t));i&&s.length&&s.forEach((e=>{this.queue.unshift(e)})),this.onVisibilityChange&&this.onVisibilityChange(e),this.setProcessQueueTimeout()}))}observe(e){super.observe(e)}}var h=i(2887),u=i(319),p=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class f{constructor(e,t,i,r=!0){this.element=e,this.group=t,this.scrollable=i,this.scrollPromise=Promise.resolve(),this.timeout=0,this.onScroll=()=>{this.timeout?clearTimeout(this.timeout):this.scrollPromise=(0,n.Z)(),this.timeout=window.setTimeout((()=>{this.timeout=0,this.scrollPromise.resolve()}),150)},this.processInvisibleDiv=e=>this.scrollPromise.then((()=>p(this,void 0,void 0,(function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),i=e.querySelector("img, canvas");i&&(i.classList.remove("hide"),yield(0,a.d1)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t&&(t.remove(),t.src="",t.load(),s.Z.getAnimations(t).forEach((e=>{s.Z.removeAnimation(e)})))})))),this.managers=o.Z.managers,this.lazyLoadQueue=new c(void 0,(({target:e,visible:t})=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)})),r&&this.attach()}attach(){this.scrollable.container.addEventListener("scroll",this.onScroll)}detach(){this.clear(),this.scrollable.container.removeEventListener("scroll",this.onScroll)}clear(){this.lazyLoadQueue.clear()}processVisibleDiv(e){e.querySelector("video")||this.lazyLoadQueue.push({div:e,load:()=>{const t=e.dataset.docId;return Promise.all([this.managers.appDocsManager.getDoc(t),this.scrollPromise]).then((([t])=>p(this,void 0,void 0,(function*(){const i=(yield(0,h.Z)({doc:t,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0,noPreview:!0})).loadPromise;return i.finally((()=>{const t=e.querySelector("video"),i=e.querySelector("img, canvas");i&&i.classList.add("hide"),t&&!t.parentElement&&setTimeout((()=>{t.src="",t.load(),s.Z.getAnimations(t).forEach((e=>{s.Z.removeAnimation(e)}))}),0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)})),i}))))}})}add(e,t=this.element){const i=document.createElement("div");i.classList.add("gif","grid-item"),i.dataset.docId=""+e.id,t.append(i),this.lazyLoadQueue.observe({div:i,load:u.Z}),(0,h.Z)({doc:e,container:i,lazyLoadQueue:null,noInfo:!0,onlyPreview:!0})}}},6008:(e,t,i)=>{"use strict";i.d(t,{X:()=>c});var s=i(426),n=i(3512),a=i(3035),o=i(4789),r=i(5975),d=i(2648),l=i(2738);function c(e,t,i,c,h=200,u,p){const f=(0,s.Z)({content:t,type:e||"tabs"===t.dataset.animation?"tabs":"navigation",transitionTime:h,onTransitionEnd:c,listenerSetter:p});if(!e)return f;const m=new Proxy(f,{apply:(t,i,s)=>{const n=+s[0],a=void 0===s[1]||s[1],o=e.querySelector(`[data-tab="${n}"]`)||e.children[n];g(o,n,a)}}),g=(s,r,d=!0)=>{return l=this,c=void 0,m=function*(){const l=t.children[r];if(i){const e=i(r,l,d),t=e instanceof Promise?yield e:e;if(void 0!==t&&!t)return}u&&u.scrollIntoViewNew({element:s.parentElement.children[r],position:"center",forceDirection:d?void 0:o.f.Static,forceDuration:h,axis:"x"}),n.Z.settings.animationsEnabled||(d=!1);const c=f.prevId();if(s.classList.contains("active")||r===c)return!1;const p=d?a.T2:e=>e(),m=e.querySelector(b.toLowerCase()+".active");m&&p((()=>{m.classList.remove("active")})),v&&-1!==c&&d&&p((()=>{const e=s.querySelector("i"),t=s.parentElement.children[c].querySelector("i");t.classList.remove("animate"),e.classList.remove("animate");const i=t.parentElement.parentElement.offsetLeft-e.parentElement.parentElement.offsetLeft,n=t.clientWidth/e.clientWidth;e.style.transform=`translate3d(${i}px, 0, 0) scale3d(${n}, 1, 1)`,(0,a.T2)((()=>{e.classList.add("animate"),e.style.transform="none"}))})),p((()=>{s.classList.add("active")})),f(r,d)},new((p=void 0)||(p=Promise))((function(e,t){function i(e){try{n(m.next(e))}catch(e){t(e)}}function s(e){try{n(m.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof p?n:new p((function(e){e(n)}))).then(i,s)}n((m=m.apply(l,c||[])).next())}));var l,c,p,m},v=!e.classList.contains("no-stripe"),b=e.firstElementChild.tagName;return(0,l.fc)(e,(t=>{let i,s=t.target;if(s=(0,r.Z)(s,e),!s)return!1;if(s.dataset.tab){if(i=+s.dataset.tab,-1===i)return!1}else i=(0,d.Z)(s);g(s,i)}),{listenerSetter:p}),m}},503:(e,t,i)=>{"use strict";i.d(t,{I1:()=>C,ZP:()=>I,rf:()=>w});var s=i(3910),n=i(6669),a=i(1544),o=i(8763),r=i(4668),d=i(3299),l=i(9336),c=i(1293),h=i(5565),u=i(669),p=i(130),f=i(2325),m=i(1507),g=i(6241),v=i(6535),b=i(3066),y=i(5400);function w(e,t,i,o){return r=this,l=void 0,h=function*(){const r=[],l=(null==i?void 0:i.some((e=>"messageEntityCustomEmoji"===e._)))?L():void 0,c=(0,b.Z)(t,{entities:i,wrappingForPeerId:o,loadPromises:r,customEmojiRenderer:l});c.querySelectorAll('[contenteditable="false"]').forEach((e=>{e.contentEditable="inherit",e.classList.add("pc")})),r.length&&(yield Promise.all(r)),c.querySelectorAll(".input-selectable").forEach((e=>{e.prepend((0,y.SZ)(!0))}));const h=u.Y?u.Z.getInstance():void 0,p=Array.from(c.querySelectorAll(".custom-emoji-placeholder")).map((e=>(e.dataset.ces="1",e.customEmojiElement))),f=(0,a.Z)(c);null==l||l.destroy();const m=(0,d.Z)(e);if(m.node);else{const t=document.createRange();let i=e.lastChild;i||e.append(i=document.createTextNode("")),t.setStartAfter(i),t.collapse(!0),m.selection.removeAllRanges(),m.selection.addRange(t)}e.addEventListener("input",s.Z,{capture:!0,once:!0}),null==h||h.onBeforeInput({inputType:"insertContent"}),window.document.execCommand("insertHTML",!1,f),Array.from(e.querySelectorAll("[data-ces]")).forEach(((e,t)=>{delete e.dataset.ces;const i=p[t];e.customEmojiElement=i,i.placeholder=e})),e.querySelectorAll(".pc").forEach((e=>{e.contentEditable="false"})),null==h||h.removeExtraBOMs(e),(0,n.Z)(e,"input")},new((c=void 0)||(c=Promise))((function(e,t){function i(e){try{n(h.next(e))}catch(e){t(e)}}function s(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(i,s)}n((h=h.apply(r,l||[])).next())}));var r,l,c,h}let S=()=>{document.addEventListener("paste",(e=>{const t=(0,o.Z)(e.target,'contenteditable="true"');if(!t)return;const i=!!t.dataset.noLinebreaks;let s,n;e.preventDefault();let a=(e.originalEvent||e).clipboardData.getData("text/plain"),r=!0,d=(e.originalEvent||e).clipboardData.getData("text/html");const c=e=>"messageEntityEmoji"===e._||"messageEntityLinebreak"===e._&&!i;if(i){const e=/[\r\n]/g;a=a.replace(e,""),d=d.replace(e,"")}const h=(t.dataset.peerId||m.NM).toPeerId();if(d.trim()){d=d.replace(//,""),d=d.replace(//,""),d=d.replace('
',"");const e=d.match(/([\s\S]*)<\/body>/);e&&(d=e[1].trim());const t=(new DOMParser).parseFromString(d,"text/html").body||document.createElement("body");let i=t.firstChild;for(;i;){const e=i.nextSibling;i.nodeType===i.TEXT_NODE&&(i.nodeValue.trim()||i.remove()),i=e}const o=(0,l.Z)(t,!0,!1);h||(o.entities=o.entities.filter((e=>"messageEntityCustomEmoji"!==e._)));{const e=o.value.split("\n");let t=0;for(let i=0;i"messageEntityCustomEmoji"===e._))){s=o.value,n=o.entities,r=!1;let e=(0,v.Z)(s);e=e.filter(c),(0,g.Z)(n,e)}}r&&(s=a,n=(0,v.Z)(s),n=n.filter(c)),w(t,s,n,h)})),S=null};var C;function L(){return y.KZ.create({wrappingDraft:!0,isSelectable:!0})}function E(e){const t=Array.from(e.querySelectorAll(".custom-emoji, .custom-emoji-placeholder"));let i=e.querySelector(".custom-emoji-renderer");if(!i&&t.length)i=L(),e.prepend(i);else if(i&&!t.length)return void i.remove();if(!i)return;const s=new Map;t.forEach((e=>{const t=e instanceof y.LD?e:e.customEmojiElement,{docId:i}=t;let n=s.get(i);n||s.set(i,n=new Set),n.add(t)}));for(const[e,t]of s){let s=i.customEmojis.get(e);if(s)for(const e of s)t.has(e)||e.destroy();else s=new Set;for(const e of t)s.has(e)||e.connectedCallback()}i.add(s,!1),i.forceRender()}!function(e){e[e.Neutral=0]="Neutral",e[e.Valid=1]="Valid",e[e.Error=2]="Error"}(C||(C={}));class I{constructor(e={}){this.options=e,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=e.required,this.validate=e.validate,void 0!==e.maxLength&&void 0===e.showLengthOn&&(e.showLengthOn=Math.min(40,Math.round(e.maxLength/3)));const{placeholder:t,maxLength:i,showLengthOn:s,name:n,plainText:a,canBeEdited:o=!0,autocomplete:d}=e,h=e.label||e.labelText,m=[];let g;if(a?(this.container.innerHTML=`\n \n `,g=this.container.firstElementChild):(S&&S(),this.container.innerHTML='
',g=this.container.firstElementChild,g.contentEditable=""+!!o,u.Z.getInstance(),g.addEventListener("mousedown",(e=>{var t;const i=document.getSelection();if(!i.isCollapsed)return;const s=(0,r.Z)(e.target,"IMG");if(!s)return;const n=s.getBoundingClientRect(),a=n.left+n.width/2,o=e.clientX>=a,d=document.createRange();d.setStartAfter(o?s:null!==(t=s.previousSibling)&&void 0!==t?t:s),i.removeAllRanges(),i.addRange(d)})),m.push((()=>{(0,c.Z)(g)&&g.replaceChildren(),u.Y&&Array.from(g.querySelectorAll("br:not(.br-not-br)")).forEach((e=>{e.remove()})),(0,y.Cx)(Array.from(g.querySelectorAll(".input-something"))),E(g)}))),(0,p.m)(g),e.inputMode&&(g.inputMode=e.inputMode),t&&(0,f.$d)(g,t,void 0,"placeholder"),h||t){const e=document.createElement("div");e.classList.add("input-field-border"),this.container.append(e)}if(h&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const e=this.container.lastElementChild;let t=!1;const n=()=>{const n=g.classList.contains("error"),o=a?g.value.length:[...(0,l.Z)(g,!1,!1).value].length,r=i-o,d=r<0;g.classList.toggle("error",d),d||r<=s?(this.setLabel(),e.append(` (${i-o})`),t||(t=!0)):(n&&!d||t)&&(this.setLabel(),t=!1)};m.push(n)}!e.withLinebreaks&&!a&&(g.dataset.noLinebreaks="1",g.addEventListener("keypress",(e=>{if("Enter"===e.key)return e.preventDefault(),!1}))),m.length&&g.addEventListener("input",(()=>{m.forEach((e=>e()))})),this.input=g}select(){this.value&&(this.options.plainText?this.input.select():function(e){const t=document.createRange();t.selectNodeContents(e);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?(0,p.Z)(this.label,this.options.labelText):this.label.append((0,f.ag)(this.options.label,this.options.labelOptions))}get value(){return this.options.plainText?this.input.value:(0,l.Z)(this.input,!1,!1).value}set value(e){this.setValueSilently(e,!0),this.simulateInputEvent()}simulateInputEvent(){(0,n.Z)(this.input,"input")}setValueSilently(e,t){this.options.plainText?this.input.value=e:((0,h.Z)(this.input,e),E(this.input))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!(0,c.Z)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(e="",t){this.options.plainText||(e=(0,a.Z)((0,b.Z)(e))),t?this.setValueSilently(e,!1):this.value=e}setOriginalValue(e="",t){this.originalValue=e,this.setDraftValue(e,t)}setState(e,t){t?(this.label.textContent="",this.label.append((0,f.ag)(t,this.options.labelOptions))):this.setLabel(),this.input.classList.toggle("error",!!(e&C.Error)),this.input.classList.toggle("valid",!!(e&C.Valid))}setError(e){this.setState(C.Error,e)}}},3607:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n{constructor(e,t){this.prevValue="",this.timeout=0,this.onInput=()=>{if(!this.onChange)return;const e=this.value;e!==this.prevValue&&(this.prevValue=e,clearTimeout(this.timeout),this.timeout=window.setTimeout((()=>{this.onChange(e)}),200))},this.onClearClick=()=>{this.value="",this.onChange&&this.onChange(""),this.onClear&&this.onClear()},this.inputField=new s.ZP({placeholder:e,plainText:!0}),this.container=this.inputField.container,this.container.classList.remove("input-field"),this.container.classList.add("input-search"),this.onChange=t,this.input=this.inputField.input,this.input.classList.add("input-search-input");const i=document.createElement("i");i.classList.add("tgico","tgico-search"),this.clearBtn=document.createElement("i"),this.clearBtn.classList.add("tgico","btn-icon","tgico-close"),this.input.addEventListener("input",this.onInput),this.clearBtn.addEventListener("click",this.onClearClick),this.container.append(i,this.clearBtn)}get value(){return this.inputField.value}set value(e){this.prevValue=e,clearTimeout(this.timeout),this.inputField.value=e}remove(){clearTimeout(this.timeout),this.input.removeEventListener("input",this.onInput),this.clearBtn.removeEventListener("click",this.onClearClick)}}},2153:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(2940),n=i(8847),a=i(4064),o=i(7009),r=i(8594);class d extends o.Z{constructor(e,t){super(e),this.onVisibilityChange=({target:e,visible:t})=>{(0,n.Z)(this.queue,(t=>t.div===e)).forEach((e=>{t&&(e.wasSeen=!0),e.visible=t;const i=this.queue.findIndex((e=>!e.visible));this.queue.splice(Math.max(0,i),0,e)})),this.setProcessQueueTimeout()},this.intersector=new s.Z(this.onVisibilityChange),!t&&(0,r.ZP)((()=>{this.lock()}),(()=>{this.unlockAndRefresh()}))}getItem(){return(0,a.Z)(this.queue,(e=>e.wasSeen))}processItem(e){const t=Object.create(null,{processItem:{get:()=>super.processItem}});return i=this,s=void 0,a=function*(){yield t.processItem.call(this,e),this.intersector.unobserve(e.div)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}addElement(e,t){var i;return!!super.addElement(e,t)&&(this.observe(t),null!==(i=t.wasSeen)&&void 0!==i||(t.wasSeen=!1),!0)}}},7009:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8847),n=i(4421);class a extends n.Z{constructor(e){super(e),this.queue=[],this.inProcess=new Set}lock(){super.lock(),this.intersector.lock()}unlock(){super.unlock(),this.intersector.unlock()}unlockAndRefresh(){super.unlock(),this.intersector.unlockAndRefresh()}clear(){super.clear(),this.intersector.disconnect()}refresh(){this.intersector.refresh()}loadItem(e){return e.load(e.div)}addElement(e,t){if(this.queue.find((e=>e.div===t.div&&e.load===t.load)))return!1;for(const e of this.inProcess)if(e.div===t.div&&e.load===t.load)return!1;return this.queue[e](t),!0}setProcessQueueTimeout(){var e;null!==(e=this.intersectorTimeout)&&void 0!==e||(this.intersectorTimeout=window.setTimeout((()=>{this.intersectorTimeout=void 0,this.processQueue()}),0))}push(e){super.push(e)}unshift(e){super.unshift(e)}delete(e){(0,s.Z)(this.queue,(t=>t.div===e.div)),this.unobserve(e)}observe(e){this.intersector.observe(e.div)}unobserve(e){this.intersector.unobserve(e.div)}}},7207:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3013),n=i(65);class a extends n.Z{constructor(e,t,i,s){super({step:1e3/60/1e3,min:0,max:1,withTransition:i,useTransform:s},0),this.progressRAF=0,this.onLoadedData=()=>{this.max=this.media.duration,this.seek.setAttribute("max",""+this.max)},this.onEnded=()=>{this.setProgress()},this.onPlay=()=>{const e=()=>{this.setProgress(),this.progressRAF=this.media.paused?0:window.requestAnimationFrame(e)};this.progressRAF&&window.cancelAnimationFrame(this.progressRAF),this.streamable&&this.setLoadProgress(),this.progressRAF=window.requestAnimationFrame(e)},this.onTimeUpdate=()=>{this.media.paused&&(this.setProgress(),this.streamable&&this.setLoadProgress())},this.onProgress=e=>{this.setLoadProgress()},e&&this.setMedia(e,t)}setMedia(e,t=!1){this.media&&this.removeListeners(),t&&!this.filledLoad?(this.filledLoad=document.createElement("div"),this.filledLoad.classList.add("progress-line__filled","progress-line__loaded"),this.container.prepend(this.filledLoad)):this.filledLoad&&this.filledLoad.classList.toggle("hide",!t),this.media=e,this.streamable=t,(!e.paused||e.currentTime>0)&&this.onPlay();let i=!1;this.setSeekMax(),this.setListeners(),this.setHandlers({onMouseDown:()=>{i=!this.media.paused,i&&this.media.pause()},onMouseUp:e=>{i&&this.media.play()}})}scrub(e){const t=super.scrub(e);return this.media.currentTime=t,t}setLoadProgress(){if(s.Z.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,i=this.media.currentTime;let n=0,a=0;for(let s=0;s=t&&t>=n&&(n=t,a=e.end(s))}const o=this.media.duration?a/this.media.duration:0;this.filledLoad.style.width=100*o+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(s.Z.isSafariBuffering(this.media))return;const e=this.media.currentTime;super.setProgress(e)}setListeners(){super.setListeners(),this.media.addEventListener("ended",this.onEnded),this.media.addEventListener("play",this.onPlay),this.media.addEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.addEventListener("progress",this.onProgress)}removeListeners(){super.removeListeners(),this.media&&(this.media.removeEventListener("loadeddata",this.onLoadedData),this.media.removeEventListener("ended",this.onEnded),this.media.removeEventListener("play",this.onPlay),this.media.removeEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.removeEventListener("progress",this.onProgress)),this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=0)}}},3251:(e,t,i)=>{"use strict";i.d(t,{I:()=>f});var s=i(3189),n=i(8097),a=i(4755),o=i(3228),r=i(3035);const d=new Map,l=new Set;let c=!1;function h(){c||(c=!0,(0,r.T2)((()=>{c=!1,l.forEach(p),l.clear()})))}function u(e){const t=e.dataset.sizeType;return t?a.Z.active[t].width:e.getBoundingClientRect().width}function p(e){let t=d.get(e);const i=!t;let{text:a,textLength:r,from:l,multiplier:c,font:h,textWidth:p,elementWidth:f}=t||{};if(i){a=e.textContent,r=a.length,l=50,c=l>0&&l/100;let i=e.dataset.fontSize;i&&+i&&(i+="px"),h=`${e.dataset.fontWeight||s.U9} ${i||s.Bf} ${s.bt}`,p=(0,n.Z)(a,h),f=u(e),t={text:a,textLength:r,from:l,multiplier:c,font:h,textWidth:p,elementWidth:f},d.set(e,t)}const m=u(e),g=i||f!==m;if(!i&&g&&(t.elementWidth=f=m),g)if(p>f){e.setAttribute("title",a);let i=a,s=f;for(;i.length>3;){const t=i.length,a=c&&(0,o.Z)(c*t<<0,1,t-2)||Math.max(t+l-1,1),r=i.substr(0,a).replace(/\s*$/,""),d=i.substr(a+1).replace(/^\s*/,"");if(i=r+d,s=(0,n.Z)(i+"…",h),s{for(const[e]of d)l.add(e);h()}),{capture:!0,passive:!0});class f extends HTMLElement{connectedCallback(){d.set(this,null),this.dataset.sizeType?p(this):(l.add(this),h())}disconnectedCallback(){d.delete(this),l.delete(this)}}customElements.define("middle-ellipsis-element",f)},4425:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1447);class n{constructor(e,t){this.passwordInputField=e,this.size=t,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then((e=>(this.animation=e,this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())})),this.passwordInputField.helpers.onVisibilityClickAdditional=()=>{this.passwordInputField.helpers.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},s.Z.waitForFirstFrame(e))))}remove(){this.animation&&this.animation.remove()}}},3083:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1447);class n{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const i=e.input;i.addEventListener("blur",(()=>{this.playAnimation(0)})),i.addEventListener("input",(t=>{this.playAnimation(e.value.length)}))}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas[0].style.display="none"),this.animation.canvas[0].style.display=""):t=0;const i=this.needFrame>t?-1:1;this.animation.setDirection(i),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([s.Z.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then((e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),s.Z.waitForFirstFrame(e)))),s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then((e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas[0].style.display="none"),this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas[0].style.display="",this.idleAnimation.play(),this.animation.canvas[0].style.display="none")})),s.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},6830:(e,t,i)=>{"use strict";i.d(t,{T:()=>a,Z:()=>o});var s=i(3910),n=i(503);class a{constructor(e,t){this.container=e,this.input=t,this.passwordVisible=!1,this.onVisibilityClick=e=>{(0,s.Z)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()},t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",t.parentElement.prepend(i),t.parentElement.insertBefore(i.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),e.classList.add("input-field-password"),e.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}class o extends n.ZP{constructor(e={}){super(Object.assign({plainText:!0},e)),this.helpers=new a(this.container,this.input)}}},8261:(e,t,i)=>{"use strict";i.d(t,{Z:()=>G});var s=i(2365),n=i(3725),a=i(2166),o=i(3532),r=i(2738),d=i(5565),l=i(130),c=i(3699),h=i(5471),u=i(9405),p=i(3624),f=i(8631),m=i(4271),g=i(2790),v=i(5102),b=i(2325),y=i(5400),w=i(3512),S=i(9331),C=i(9807),L=i(36),E=i(5432),I=i(4064),M=i(3910),P=i(1708),Z=i(6074),T=i(3035),k=i(7030),x=i(9931),A=i(3757),_=i(9492),F=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class D{constructor(e,t){this.scrollable=e,this.managers=t,this.processItem=e=>F(this,void 0,void 0,(function*(){const t=document.createElement("div");let i;t.classList.add(D.BASE_CLASS+"-avatar","media-container","hide"),this.avatars.append(t),e&&(i="object"!=typeof e?yield this.managers.appPhotosManager.getPhoto(e):e.action.photo);const s=new Image;s.classList.add("avatar-photo"),s.draggable=!1;const n=()=>F(this,void 0,void 0,(function*(){if(i){const e=yield(0,_.Z)({container:t,photo:i,size:(0,k.Z)(i,420,420,!1),withoutPreloader:!0});[e.images.thumb,e.images.full].filter(Boolean).forEach((e=>{e.classList.add("avatar-photo")}))}else{const e=yield this.managers.appPeersManager.getPeerPhoto(this.peerId);yield(0,x.Y)(t,this.peerId,e,"photo_big",s)}t.classList.remove("hide")}));return this.avatars.childElementCount<=3?yield n():(this.intersectionObserver.observe(t),this.loadCallbacks.set(t,n)),this.addTab(),e})),this.container=document.createElement("div"),this.container.classList.add(D.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(D.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(D.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(D.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(D.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(D.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(D.BASE_CLASS+"-arrow",D.BASE_CLASS+"-arrow-next","tgico-avatarnext"),this.container.append(this.avatars,this.gradient,this.info,this.tabs,this.arrowPrevious,this.arrowNext),this.loadCallbacks=new Map,this.listenerSetter=new c.Z;const i=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),!1),s=1/3;let n=!1,a=!1;(0,r.fc)(this.container,(e=>F(this,void 0,void 0,(function*(){if(a)return void(0,M.Z)(e);if(n)return void(n=!1);if(!i())return;const t=this.container.getBoundingClientRect(),o=e.pageX,r=o-t.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||r>t.width*s&&r{t.push({element:this.avatars.children[i],item:e})}));const i=t.slice(0,this.listLoader.previous.length),s=t.slice(this.listLoader.previous.length+1),n=this.avatars.children[this.listLoader.previous.length];a=!0,(0,S.C)(n,e,(()=>e===this.peerId),this.listLoader.current,i,s),a=!1}else{const e=o>t.right-t.width/2;let i;this.avatars.classList.add("no-transition"),this.avatars.offsetLeft,i=0!==this.listLoader.index||e?this.listLoader.index===this.listLoader.count-1&&e?-(this.listLoader.count-1):e?1:-1:this.listLoader.count-1,this.listLoader.go(i),(0,T.T2)((()=>{this.avatars.classList.remove("no-transition")}))}}))),{listenerSetter:this.listenerSetter});const o=()=>{n=!0,document.body.addEventListener(E.Z?"touchend":"click",(e=>{n=!1}),{once:!0})};let d=0,l=0,h=0,u=0;this.swipeHandler=new A.Z({element:this.avatars,onSwipe:(e,t)=>{h=e*=-1;let i=l+e*-D.SCALE;return i>0?i=0:ii()?!this.container.classList.contains("is-single")&&!a:(o(),(0,M.Z)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();d=e.width,u=-d*(this.tabs.childElementCount-1),l=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=D.TRANSLATE_TEMPLATE.replace("{x}",l+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(h)/(d/D.SCALE))*(h>=0?1:-1);o(),this.avatars.classList.remove("no-transition"),(0,T.T2)((()=>{this.listLoader.go(e),this.container.classList.remove("is-swiping")}))}}),this.intersectionObserver=new IntersectionObserver((e=>{e.forEach((e=>{e.isIntersecting&&this.loadNearestToTarget(e.target)}))}))}setPeer(e){return F(this,void 0,void 0,(function*(){this.peerId=e;const t=yield this.managers.appPeersManager.getPeerPhoto(e);if(!t)return;const i=this.listLoader=new Z.Z({loadCount:50,loadMore:(t,s,n)=>{if(!s)return Promise.resolve({count:void 0,items:[]});if(e.isUser()){const i=t;return this.managers.appPhotosManager.getUserPhotos(e,i,n).then((e=>({count:e.count,items:e.photos})))}{const t=[];return i.current||t.push(this.managers.appProfileManager.getChatFull(e.toChatId())),t.push(this.managers.appMessagesManager.getSearch({peerId:e,maxId:Number.MAX_SAFE_INTEGER,inputFilter:{_:"inputMessagesFilterChatPhotos"},limit:n,backLimit:0})),Promise.all(t).then((e=>F(this,void 0,void 0,(function*(){const t=e.pop();if((0,P.Z)(t),!i.current){const s=e[0],n=(0,I.Z)(t.history,(e=>e.action.photo.id===s.chat_photo.id));i.current=n||(yield this.managers.appMessagesManager.generateFakeAvatarMessage(this.peerId,s.chat_photo))}return{count:t.count,items:t.history}}))))}},processItem:this.processItem,onJump:(e,t)=>{const i=this.listLoader.index,s=100*D.SCALE*i;this.avatars.style.transform=D.TRANSLATE_TEMPLATE.replace("{x}",`-${s}%`);const n=this.tabs.querySelector(".active");n&&n.classList.remove("active"),this.tabs.children[i].classList.add("active"),this.loadNearestToTarget(this.avatars.children[i])}});"userProfilePhoto"===t._&&(i.current=t.photo_id),yield this.processItem(i.current),i.load(!0)}))}addTab(){const e=document.createElement("div");e.classList.add(D.BASE_CLASS+"-tab"),this.tabs.append(e),1===this.tabs.childElementCount&&e.classList.add("active"),this.container.classList.toggle("is-single",this.tabs.childElementCount<=1)}loadNearestToTarget(e){const t=Array.from(e.parentElement.children),i=t.indexOf(e);t.slice(Math.max(0,i-3),Math.min(t.length,i+3)).forEach((e=>{const t=this.loadCallbacks.get(e);t&&(t(),this.loadCallbacks.delete(e),this.intersectionObserver.unobserve(e))}))}cleanup(){var e;this.listenerSetter.removeAll(),this.swipeHandler.removeListeners(),null===(e=this.intersectionObserver)||void 0===e||e.disconnect()}}D.BASE_CLASS="profile-avatars",D.SCALE=s.Z?2:1,D.TRANSLATE_TEMPLATE=s.Z?`translate3d({x}, 0, -1px) scale(${D.SCALE})`:"translate({x}, 0)";var R=i(7479),B=i(5029),N=i(2796),O=i(8210),U=i(7362),H=i(9102),z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const j=(e,t)=>{(0,l.Z)(t.title,e||""),t.container.style.display=e?"":"none"};class G{constructor(e,t,i,n=!0){this.managers=e,this.scrollable=t,this.listenerSetter=i,this.isDialog=n,s.Z||this.scrollable.container.classList.add("no-parallax"),i||(this.listenerSetter=new c.Z),this.middlewareHelper=(0,p.k)()}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new B.Z({noDelimiter:!0}),this.name=document.createElement("div"),this.name.classList.add("profile-name"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("profile-subtitle"),this.bio=new R.ZP({title:" ",subtitle:!0,icon:"info",clickable:e=>{"A"!==e.target.tagName&&((0,a.T)(this.bio.title.textContent),(0,N.Am)(b.ZP.format("BioCopied",!0)))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_About",onClick:()=>{(0,r.tH)(this.bio.container)},verify:()=>!this.peerId.isUser()},{icon:"copy",text:"Text.CopyLabel_Bio",onClick:()=>{(0,r.tH)(this.bio.container)},verify:()=>this.peerId.isUser()}]}}),this.bio.title.classList.add("pre-wrap"),this.username=new R.ZP({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>{(0,a.T)("@"+this.username.title.textContent),(0,N.Am)(b.ZP.format("UsernameCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_Username",onClick:()=>{(0,r.tH)(this.username.container)}}]}}),this.phone=new R.ZP({title:" ",subtitle:!0,icon:"phone",clickable:()=>{(0,a.T)(this.phone.title.textContent.replace(/\s/g,"")),(0,N.Am)(b.ZP.format("PhoneCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_PhoneNumber",onClick:()=>{(0,r.tH)(this.phone.container)}},{icon:"info",text:"PeerInfo.Phone.AnonymousInfo",textArgs:[document.createElement("a")],onClick:()=>{window.open("https://fragment.com/numbers","_blank")},separator:!0,multiline:!0,verify:()=>z(this,void 0,void 0,(function*(){const{isAnonymous:e}=(yield this.managers.appUsersManager.getUserPhone(this.peerId.toUserId()))||{};return e}))}]}}),this.link=new R.ZP({title:" ",subtitleLangKey:"SetUrlPlaceholder",icon:"link",clickable:()=>{const e=this.link.title.textContent;(0,a.T)(e);const t=e.includes("/c/");(0,N.Am)(b.ZP.format(t?"LinkCopiedPrivateInfo":"LinkCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_ShareLink",onClick:()=>{(0,r.tH)(this.link.container)}}]}}),this.location=new R.ZP({title:" ",subtitleLangKey:"ChatLocation",icon:"location"}),this.section.content.append(this.phone.container,this.username.container,this.location.container,this.bio.container,this.link.container);const{listenerSetter:e}=this;this.isDialog&&(this.notifications=new R.ZP({checkboxField:new C.Z({toggle:!0}),titleLangKey:"Notifications",icon:"unmute",listenerSetter:this.listenerSetter}),e.add(this.notifications.checkboxField.input)("change",(e=>{e.isTrusted&&this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,threadId:this.threadId})})),e.add(w.Z)("dialog_notify_settings",(e=>z(this,void 0,void 0,(function*(){if(this.peerId===e.peerId){const e=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.threadId});this.notifications.checkboxField.checked=!e}})))),this.section.content.append(this.notifications.container)),this.element.append(this.section.container),s.Z&&this.element.append((0,L.G)()),e.add(w.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),e.add(w.Z)("peer_bio_edit",(e=>{e===this.peerId&&this.setMoreDetails(!0)}));const t=({peerId:e,threadId:t})=>z(this,void 0,void 0,(function*(){return this.peerId===e&&(!(yield this.managers.appPeersManager.isForum(this.peerId))||!this.threadId||this.threadId===t)}));e.add(w.Z)("peer_title_edit",(e=>z(this,void 0,void 0,(function*(){(yield t(e))&&(this.fillUsername(),this.setMoreDetails(!0))})))),e.add(w.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),e.add(w.Z)("contacts_update",(e=>z(this,void 0,void 0,(function*(){this.peerId===e.toPeerId()&&((yield this.managers.appUsersManager.getUser(e)).pFlags.self&&this.isDialog||this.fillUserPhone())})))),e.add(w.Z)("avatar_update",(e=>z(this,void 0,void 0,(function*(){(yield t(e))&&this.setAvatar()})))),this.setPeerStatusInterval=window.setInterval((()=>this.setPeerStatus()),6e4)}setPeerStatus(e=!1,t){return z(this,void 0,void 0,(function*(){const i=this.peerId,s=[];s.push((()=>{this.element.classList.toggle("is-me",i===w.Z.myId)}));let n=Promise.resolve();if(i&&(w.Z.myId!==i||!this.isDialog)){const t=yield this.managers.appPeersManager.isForum(this.peerId),a=this.middlewareHelper.get();n=t&&this.threadId?(0,H.Z)({peerId:i,wrapOptions:{middleware:a}}).then((({element:e})=>{this.subtitle.replaceChildren(e)})):m.ZP.setPeerStatus({peerId:i,element:this.subtitle,needClear:e,useWhitespace:!0,middleware:a,ignoreSelf:!this.isDialog}),n.then((e=>e&&s.push(e)))}const a=()=>s.forEach((e=>e()));return n.then((()=>{if(t)return a;a()}))}))}cleanupHTML(){[this.bio,this.phone,this.username,this.location,this.link].forEach((e=>{e.container.style.display="none"})),this.notifications&&(this.notifications.container.style.display="",this.notifications.checkboxField.checked=!0),this.clearSetMoreDetailsTimeout()}canBeDetailed(){return this.peerId!==w.Z.myId||!this.isDialog}createAvatar(){const e=new S.Z;return e.classList.add("profile-avatar","avatar-120"),e.isDialog=this.isDialog,e.attachClickEvent(),e}_setAvatar(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this,t=!(!this.threadId||!(yield this.managers.appPeersManager.isForum(e)));if(this.canBeDetailed()&&!t&&(yield this.managers.appPeersManager.getPeerPhoto(e))){const t=this.avatars;return this.avatars=new D(this.scrollable,this.managers),yield this.avatars.setPeer(e),()=>{var e;this.avatars.info.append(this.name,this.subtitle),null===(e=this.avatar)||void 0===e||e.remove(),this.avatar=void 0,t?t.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),s.Z&&this.scrollable.container.classList.add("parallax")}}const i=this.createAvatar();return yield i.updateWithOptions({peerId:e,threadId:t?this.threadId:void 0,wrapOptions:{customEmojiSize:(0,u.C)(120,120),middleware:this.middlewareHelper.get()}}),()=>{var e;s.Z&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars.cleanup(),this.avatars=void 0),null===(e=this.avatar)||void 0===e||e.remove(),this.avatar=i,this.section.content.prepend(this.avatar,this.name,this.subtitle)}}))}setAvatar(e){const t=this._setAvatar();return e?t:t.then((e=>e()))}getUsernamesAlso(e){const t=e.slice(1);if(t.length){const e=t.map((e=>(0,o.Z)({username:e})));return(0,b.ag)("UsernameAlso",[(0,b.v_)(e,!1)])}}fillUsername(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=yield this.managers.appPeersManager.getPeerActiveUsernames(e),i=this.getUsernamesAlso(t);return()=>{this.username.subtitle.replaceChildren(i||(0,b.ag)("Username")),j(t[0],this.username)}}}))}fillUserPhone(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const{phone:t,isAnonymous:i}=(yield this.managers.appUsersManager.getUserPhone(e.toUserId()))||{};return()=>{this.phone.subtitle.replaceChildren((0,b.ag)(i?"AnonymousNumber":"Phone")),j(t?(0,O.Z)(t):void 0,this.phone)}}}))}fillNotifications(){return z(this,void 0,void 0,(function*(){const e=this.notifications;if(e){if(this.canBeDetailed()){const t=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.threadId});return()=>{e.checkboxField.checked=!t}}return()=>{e.container.style.display="none"}}}))}fillName(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this,[t]=yield Promise.all([(0,U.Z)({peerId:e,dialog:this.isDialog,withIcons:!this.threadId,threadId:this.threadId})]);return()=>{(0,d.Z)(this.name,t)}}))}fillRows(e){return z(this,void 0,void 0,(function*(){return Promise.all([this.fillName(),this.fillUsername(),this.fillUserPhone(),this.fillNotifications(),this.setMoreDetails(void 0,e),this.setPeerStatus(!0,!0)]).then((e=>()=>{e.forEach((e=>null==e?void 0:e()))}))}))}fillProfileElements(){return z(this,void 0,void 0,(function*(){if(!this.cleaned)return;this.cleaned=!1,this.cleanupHTML();const e=(0,n.Z)();this.middlewareHelper.get().onClean((()=>{e.reject()}));const t=yield Promise.all([this.setAvatar(!0),this.fillRows(e)]);return()=>{e.resolve(),t.forEach((e=>null==e?void 0:e()))}}))}_setMoreDetails(e,t){return z(this,void 0,void 0,(function*(){const i=this.getMiddlewarePromise();if(this.threadId&&(yield i(this.managers.appPeersManager.isForum(e)))){let t="https://t.me/";const s=(0,g.Z)(this.threadId),n=yield i(this.managers.appPeersManager.getPeerUsername(e));return t+=n?`${n}/${s}`:`c/${e.toChatId()}/${s}`,()=>{j(t,this.link)}}const s=[];if(s.push((()=>{this.bio.subtitle.replaceChildren((0,b.ag)(e.isUser()?"UserBio":"Info")),j(t.about?(0,y.ZP)(t.about):void 0,this.bio)})),!e.isUser()){const n=yield i(this.managers.appChatsManager.getChat(e.toChatId())),a=(0,v.Z)(n);let o;if(a.length)o=this.getUsernamesAlso(a),s.push((()=>j("https://t.me/"+a[0],this.link)));else{const e=t.exported_invite;"chatInviteExported"===(null==e?void 0:e._)&&s.push((()=>j(e.link,this.link)))}s.push((()=>this.link.subtitle.replaceChildren(o||(0,b.ag)("SetUrlPlaceholder"))))}const n=t.location;return"channelLocation"==(null==n?void 0:n._)&&s.push((()=>j(n.address,this.location))),this.setMoreDetailsTimeout=window.setTimeout((()=>this.setMoreDetails(!0)),6e4),()=>{s.forEach((e=>e()))}}))}setMoreDetails(e,t){return z(this,void 0,void 0,(function*(){this.clearSetMoreDetailsTimeout();const{peerId:i}=this,s=this.getMiddlewarePromise();if(!i||!this.canBeDetailed()||(yield s(this.managers.appPeersManager.isPeerRestricted(i))))return;const n=yield s(this.managers.acknowledged.appProfileManager.getProfileByPeerId(i,e)),a=s(n.result).then((e=>z(this,void 0,void 0,(function*(){if(!(yield s(this.managers.appPeersManager.isPeerRestricted(i))))return yield s(this._setMoreDetails(i,e))}))));if(n.cached&&t)return a;(t||Promise.resolve()).then((()=>a)).then((e=>{null==e||e()}))}))}getMiddlewarePromise(){return(0,f.Z)(this.middlewareHelper.get(),(0,h.Z)("MIDDLEWARE"))}setPeer(e,t){var i;this.peerId===e&&this.threadId===t||(null===(i=this.init)||void 0===i||i.call(this),this.peerId=e,this.threadId=t,this.middlewareHelper.clean(),this.cleaned=!0)}clearSetMoreDetailsTimeout(){void 0!==this.setMoreDetailsTimeout&&(clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=void 0)}destroy(){var e;this.peerId=this.threadId=void 0,this.clearSetMoreDetailsTimeout(),clearInterval(this.setPeerStatusInterval),null===(e=this.avatars)||void 0===e||e.cleanup(),this.middlewareHelper.destroy()}}},8842:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(3512),n=i(2325),a=i(5565),o=i(1507),r=i(8456),d=i(130),l=i(5953),c=i(8115),h=i(493),u=(i(4755),i(5948));i(3541);function p(e,t,i,n,a){return o=this,r=void 0,l=function*(){const t=[],o=yield s.Z.managers.appPeersManager.getPeer(e);if(o.pFlags.verified&&!i&&t.push(function(){const e=document.createElement("span");e.classList.add("verified-icon","tgico");const t=document.createElementNS("http://www.w3.org/2000/svg","svg");t.setAttributeNS(null,"viewBox","0 0 26 26"),t.setAttributeNS(null,"width","26"),t.setAttributeNS(null,"height","26"),t.classList.add("verified-icon-svg");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#verified-icon-background"),i.classList.add("verified-icon-background");const s=document.createElementNS("http://www.w3.org/2000/svg","use");return s.setAttributeNS(null,"href","#verified-icon-check"),s.classList.add("verified-icon-check"),t.append(s,i),e.append(t),e}()),!o.pFlags.fake&&!o.pFlags.scam||n||t.push((0,u.Z)(o.pFlags.scam)),o.pFlags.premium&&!a){const e=o.emoji_status;e&&e._,t.push(function(){const e=document.createElement("span");return e.classList.add("premium-icon","tgico-star"),e}())}return t},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}var f=i(9345);const m=new WeakMap;s.Z.addEventListener("peer_title_edit",(({peerId:e,threadId:t})=>{let i=`.peer-title[data-peer-id="${e}"]`;t&&(i+=`[data-thread-id="${t}"]`),Array.from(document.querySelectorAll(i)).forEach((e=>{const t=m.get(e);null==t||t.update()}))}));class g{constructor(e){this.element=document.createElement("span"),this.element.classList.add("peer-title"),(0,d.m)(this.element),this.options={},e&&this.update(e),m.set(this.element,this)}setOptions(e){if(e){(0,l.Z)(this.options,e);for(const t in e){const i=e[t];"object"!=typeof i&&"function"!=typeof i&&(this.element.dataset[t]=i?""+("boolean"==typeof i?+i:i):"0")}}}setHasInner(e){this.hasInner!==e&&(this.hasInner=e,this.element.classList.toggle("with-icons",e))}update(e){var t,i,l,u,m,g,v,b;return m=this,g=void 0,b=function*(){this.setOptions(e);let m,g=this.options.fromName;if(void 0!==g)return void 0!==this.options.limitSymbols&&(g=(0,r.Z)(g,this.options.limitSymbols,this.options.limitSymbols)),void(0,d.Z)(this.element,(0,c.Z)(g));null!==(t=(u=this.options).peerId)&&void 0!==t||(u.peerId=o.NM);const{peerId:v,threadId:b}=this.options;if(v===s.Z.myId&&this.options.dialog)(0,a.Z)(this.element,(0,n.ag)(this.options.onlyFirstName?"Saved":"SavedMessages"));else{if(b){const[e,t]=yield Promise.all([s.Z.managers.dialogsStorage.getForumTopic(v,b),s.Z.managers.appPeersManager.isForum(v)]);if(!e&&t)return s.Z.managers.dialogsStorage.getForumTopicById(v,b).then((e=>{if(!e&&this.options.threadId===b)return this.options.threadId=void 0,void this.update({threadId:void 0});this.update()}),(()=>{this.options.threadId===b&&(this.options.threadId=void 0,this.update({threadId:void 0}))})),(0,d.Z)(this.element,(0,n.ag)("Loading")),void this.setHasInner(!1)}const e=b&&this.options.withIcons?s.Z.managers.dialogsStorage.getForumTopic(v,b).then((e=>{var t;return(0,f.e)(Object.assign(Object.assign({},null!==(t=this.options.wrapOptions)&&void 0!==t?t:{}),{topic:e}))})):void 0,[t,a,o]=yield Promise.all([(0,h.Z)(this.options),this.options.withIcons&&p(v,null===(i=this.options.wrapOptions)||void 0===i||i.middleware)||this.options.withPremiumIcon&&p(v,null===(l=this.options.wrapOptions)||void 0===l||l.middleware,!0,!0),e]);if((null==a?void 0:a.length)||o){const e=document.createElement("span");e.classList.add("peer-title-inner"),m=!0,(0,d.Z)(e,t);const i=document.createDocumentFragment();i.append(...[o,e,...null!=a?a:[]].filter(Boolean)),(0,d.Z)(this.element,i)}else(0,d.Z)(this.element,t)}this.setHasInner(m)},new((v=void 0)||(v=Promise))((function(e,t){function i(e){try{n(b.next(e))}catch(e){t(e)}}function s(e){try{n(b.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof v?n:new v((function(e){e(n)}))).then(i,s)}n((b=b.apply(m,g||[])).next())}))}}},6765:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(1168),n=i(2325),a=i(2738),o=i(8678),r=i(2312);class d extends s.Z{constructor(e={}){super("popup-avatar",{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),(0,n.$d)(this.h6,"Popup.Avatar.Title"),this.btnClose.classList.remove("btn-icon"),this.header.append(this.h6),this.cropContainer=document.createElement("div"),this.cropContainer.classList.add("crop"),this.cropContainer.append(this.image),e.isForum&&this.cropContainer.classList.add("is-forum"),this.input=document.createElement("input"),this.input.type="file",this.input.style.display="none",this.listenerSetter.add(this.input)("change",(e=>{const t=e.target.files[0];t&&(0,o.Z)(t).then((e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=function(e,t){let i,s,n,a={},o=0,r=0,d=0,l=0,c=0;function h(){e.classList.add("crop-blur"),e.draggable=!1,n=new Image,n.src=e.src,n.draggable=!1,n.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),i=document.createElement("div"),i.classList.add("crop-component"),s=document.createElement("div"),s.classList.add("crop-overlay");const a=document.createElement("div");a.classList.add("crop-overlay-color"),i.appendChild(s),e.parentNode.appendChild(i),i.appendChild(n),i.appendChild(e),i.appendChild(a),s.appendChild(n),n.style.maxWidth=e.width+"px",c=e.naturalWidth/e.offsetWidth;const o=e.offsetWidth/2-100,r=e.offsetHeight/2-100;u(200,200),p(o,r),f(o,r),s.addEventListener("mousedown",b,!1),s.addEventListener("touchstart",b,!1),s.addEventListener("wheel",v,!1),document.addEventListener("keypress",g,!1)}function u(e,t){d=e*c,l=t*c,s.style.width=e+"px",s.style.height=t+"px"}function p(e,t){r=t*c,o=e*c,n.style.top=-t+"px",n.style.left=-e+"px"}function f(e,t){s.style.top=t+"px",s.style.left=e+"px"}function m(e){e=e*Math.PI*2;let t,i,a,o,r=Math.floor(s.clientWidth+e),d=Math.floor(s.clientHeight+e),l=n.clientWidth,c=n.clientHeight;r<50||r>l||(t=s.offsetLeft-e/2,i=s.offsetTop-e/2,a=t+r,o=i+d,t<0&&(t=0),i<0&&(i=0),a>l||o>c||(u(r,r),p(t,i),f(t,i)))}function g(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":m(4);break;case"-":m(-4)}}function v(e){e.preventDefault(),m(e.deltaY>0?1:-1)}function b(e){e.preventDefault(),e.stopPropagation(),function(e){a.container_width=s.offsetWidth,a.container_height=s.offsetHeight,a.container_left=s.offsetLeft,a.container_top=s.offsetTop,a.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,a.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",w),document.addEventListener("touchmove",w),document.addEventListener("mouseup",y),document.addEventListener("touchend",y)}function y(e){e.preventDefault(),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w)}function w(e){let t,i,o,r,d={x:0,y:0};e.preventDefault(),e.stopPropagation(),d.x=e.pageX||e.touches&&e.touches[0].pageX,d.y=e.pageY||e.touches&&e.touches[0].pageY,t=d.x-(a.mouse_x-a.container_left),i=d.y-(a.mouse_y-a.container_top),o=s.offsetWidth,r=s.offsetHeight,t<0?t=0:t>n.offsetWidth-o&&(t=n.offsetWidth-o),i<0?i=0:i>n.offsetHeight-r&&(i=n.offsetHeight-r),p(t,i),f(t,i)}return e.complete?h():e.onload=h,{crop:function(){t.width=d,t.height=l,t.getContext("2d").drawImage(e,o,r,d,l,0,0,d,l)},removeHandlers:function(){s.removeEventListener("mousedown",b),s.removeEventListener("touchstart",b),s.removeEventListener("wheel",v),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w),document.removeEventListener("keypress",g),i.remove(),s.remove(),n.remove()}}}(this.image,this.canvas),this.input.value=""}}))}),!1),this.btnConfirm.className="btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1",(0,a.fc)(this.btnConfirm,(()=>{this.cropper.crop(),this.hide(),this.canvas.toBlob((e=>{this.blob=e,this.darkenCanvas(),this.resolve()}),"image/jpeg",1)}),{listenerSetter:this.listenerSetter}),this.container.append(this.cropContainer,this.btnConfirm,this.input),this.addEventListener("closeAfterTimeout",(()=>{this.cropper.removeHandlers(),this.image&&this.image.remove()}))}resolve(){this.onCrop((()=>r.Z.upload(this.blob)))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){const e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},6194:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(1168),n=i(7362),a=i(8127);class o{constructor(e,t,i,s){this.peerId=e,this.peerType=t,this.onSelect=i,this.threadId=s,this.construct()}construct(){return e=this,t=void 0,o=function*(){let{peerId:e,peerType:t,onSelect:i,threadId:o}=this;const r=yield(0,n.Z)({peerId:e,threadId:o}),d=s.Z.MANAGERS;void 0===t&&(t=yield d.appPeersManager.getDialogType(e));const l=(t,s=g&&!!t.size)=>{let n=d.appChatsManager.leave(e.toChatId());s&&(n=n.then((()=>d.appMessagesManager.flushHistory(e)))),null==i||i(n)},c=t=>{let s;if(o)s=d.appMessagesManager.flushHistory(e,!1,!0,o);else if(e.isUser())s=d.appMessagesManager.flushHistory(e,!1,g?!!t.size:void 0);else{if(!t.size)return l(t);s=d.appChatsManager.delete(e.toChatId())}null==i||i(s)};let h,u,p,f,m,g;switch(t){case"channel":(yield d.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(h="ChannelDeleteMenu",p="AreYouSureDeleteAndExitChannel",m=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:c}],g=[{text:"DeleteChannelForAll"}]):(h="LeaveChannelMenu",p="ChannelLeaveAlertWithName",f=[r],m=[{langKey:"LeaveChannel",isDanger:!0,callback:l}]);break;case"chat":h="DeleteChatUser",p="AreYouSureDeleteThisChatWithUser",f=[r],m=[{langKey:"DeleteChatUser",isDanger:!0,callback:c}],g=[{text:"DeleteMessagesOptionAlso",textArgs:[yield(0,n.Z)({peerId:e})]}];break;case"saved":h="DeleteChatUser",p="AreYouSureDeleteThisChatSavedMessages",m=[{langKey:"DeleteChatUser",isDanger:!0,callback:c}];break;case"megagroup":case"group":o?(h="DeleteTopics",u=[1],p="DeleteSelectedTopic",f=[r],m=[{langKey:"Delete",isDanger:!0,callback:c}]):(yield d.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(h="DeleteMegaMenu",p="AreYouSureDeleteAndExit",m=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:c}],g=[{text:"DeleteChat.DeleteGroupForAll"}]):(h="LeaveMegaMenu",p="AreYouSureDeleteAndExitName",f=[r],m=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>l(e,!0)}])}new a.Z("popup-delete-chat",{peerId:e,threadId:o,titleLangKey:h,titleLangArgs:u,descriptionLangKey:p,descriptionLangArgs:f,buttons:m,checkboxes:g}).show()},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{d(o.next(e))}catch(e){n(e)}}function r(e){try{d(o.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,r)}d((o=o.apply(e,t||[])).next())}));var e,t,i,o}}},5128:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(3512),n=i(1168),a=i(8127),o=i(2325),r=i(7120),d=i(2353),l=i(7362),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class h{constructor(e,t,i,s,n){this.peerId=e,this.mids=t,this.type=i,this.onConfirm=s,this.threadId=n,this.construct()}construct(){return c(this,void 0,void 0,(function*(){let{peerId:e,mids:t,type:i,onConfirm:h,threadId:u}=this;const p=yield(0,l.Z)({peerId:e,threadId:u}),f=n.Z.MANAGERS;t=t.slice();const m=(s,n)=>{h&&h(),"scheduled"===i?f.appMessagesManager.deleteScheduledMessages(e,t):f.appMessagesManager.deleteMessages(e,t,!!s.size||n)},g=[{langKey:"Delete",isDanger:!0,callback:m}],v=[];let b,y,w,S;if(1===t.length?b="DeleteSingleMessagesTitle":(b="DeleteMessagesTitle",y=[(0,o.ag)("messages",[t.length])]),w=(yield f.appPeersManager.isMegagroup(e))?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",e===s.Z.myId||"scheduled"===i);else if(e.isUser())v.push({text:"DeleteMessagesOptionAlso",textArgs:[p]});else{const i=yield f.appChatsManager.getChat(e.toChatId()),n=(0,r.Z)(i,"delete_messages");if("chat"===i._){const i=n?t.slice():yield(0,d.Z)(t,(t=>c(this,void 0,void 0,(function*(){return(yield f.appMessagesManager.getMessageByPeer(e,t)).fromId===s.Z.myId}))));i.length&&(i.length===t.length?v.push({text:"DeleteForAll"}):(v.push({text:"DeleteMessagesOption"}),w="DeleteMessagesTextGroup",S=[(0,o.ag)("messages",[i.length])]))}else g[0].callback=e=>m(e,!0)}(0,n.x)(g),new a.Z("popup-delete-chat",{peerId:e,threadId:u,titleLangKey:b,titleLangArgs:y,descriptionLangKey:w,descriptionLangArgs:S,buttons:g,checkboxes:v}).show()}))}}},4524:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(4271),n=i(3512),a=i(2796),o=i(2995);class r extends o.Z{constructor(e,t){super({peerTypes:["dialogs","contacts"],onSelect:!e&&t?t:i=>{return o=this,r=void 0,l=function*(){if(t){const e=t(i);e instanceof Promise&&(yield e)}if(i!==n.Z.myId)s.ZP.setInnerPeer({peerId:i}),s.ZP.chat.input.initMessagesForward(e);else{let t=0;for(const s in e){const n=e[s];t+=n.length,this.managers.appMessagesManager.forwardMessages(i,s.toPeerId(),n)}(0,a.bC)({langPackKey:t>0?"FwdMessagesToSavedMessages":"FwdMessageToSavedMessages"})}},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l},placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}},1168:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L,x:()=>E});var s=i(1405),n=i(5814),a=i(6385),o=i(2325),r=i(8497),d=i(8799),l=i(3699),c=i(2738),h=i(6299),u=i(3910),p=i(3241),f=i(6733),m=i(1655),g=i(3815),v=i(8805),b=i(3624),y=i(8115);const w=document.body;let S=w;const C=()=>{S=(0,f.W7)()||w,L.reAppend()};(0,f.Ms)(w,C);class L extends p.Z{constructor(e,t={}){if(super(!1),this.element=document.createElement("div"),this.container=document.createElement("div"),this.header=document.createElement("div"),this.title=document.createElement("div"),this.onEscape=()=>!0,this.hide=()=>{a.Z.backByItem(this.navigationItem)},this.element.classList.add("popup"),this.element.className="popup"+(e?" "+e:""),this.container.classList.add("popup-container","z-depth-1"),this.header.classList.add("popup-header"),(t.title||t.titleRaw)&&(this.title.classList.add("popup-title"),"string"==typeof t.title?(0,o.$d)(this.title,t.title):t.titleRaw&&this.title.append((0,y.Z)(t.titleRaw)),this.header.append(this.title)),this.middlewareHelper=(0,b.k)(),this.listenerSetter=new l.Z,this.managers=L.MANAGERS,this.confirmShortcutIsSendShortcut=t.confirmShortcutIsSendShortcut,t.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),(0,c.fc)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=t.withoutOverlay,this.withoutOverlay&&this.element.classList.add("no-overlay"),t.overlayClosable&&(0,c.fc)(this.element,(e=>{(0,r.Z)(e.target,"popup-container")||this.hide()}),{listenerSetter:this.listenerSetter}),t.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==t.withConfirm&&this.btnConfirm.append((0,o.ag)(t.withConfirm)),this.header.append(this.btnConfirm),(0,s.Z)(this.btnConfirm)),this.container.append(this.header),t.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body)),t.scrollable){const e=this.scrollable=new v.ZP(this.body);this.attachScrollableListeners(),this.body||this.container.insertBefore(e.container,this.header.nextSibling)}let i=this.btnConfirm;const n=this.buttons=t.buttons;if(null==n?void 0:n.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons");const t=n.map((e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),e.noRipple||(0,s.Z)(t),e.text?t.textContent=e.text:t.append((0,o.ag)(e.langKey,e.langArgs)),(0,c.fc)(t,(()=>{var t;null===(t=e.callback)||void 0===t||t.call(e),this.destroy()}),{listenerSetter:this.listenerSetter,once:!0}),e.element=t}));if(!i&&2===n.length){const e=n.find((e=>!e.isCancel));e&&(i=e.element)}e.append(...t),this.container.append(e)}this.btnConfirmOnEnter=i,this.element.append(this.container),L.POPUPS.push(this)}attachScrollableListeners(e){return this.scrollable.attachBorderListeners(e)}onContentUpdate(){this.scrollable&&this.scrollable.onAdditionalScroll()}show(){this.navigationItem={type:"popup",onPop:()=>this.destroy(),onEscape:this.onEscape},a.Z.pushItem(this.navigationItem),(0,d.Z)(),S.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.onContentUpdate(),this.withoutOverlay||(g.Z.isOverlayActive=!0,n.Z.checkAnimations2(!0)),setTimeout((()=>{this.element.classList.contains("active")&&this.listenerSetter.add(document.body)("keydown",(e=>{L.POPUPS[L.POPUPS.length-1]===this&&(this.confirmShortcutIsSendShortcut?(0,h.Z)(e):"Enter"===e.key)&&((0,c.tH)(this.btnConfirmOnEnter),(0,u.Z)(e))}))}),0)}destroy(){this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.middlewareHelper.destroy(),this.withoutOverlay||(g.Z.isOverlayActive=!1),a.Z.removeItem(this.navigationItem),this.navigationItem=void 0,(0,m.Z)(L.POPUPS,this),C(),setTimeout((()=>{var e;this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),null===(e=this.scrollable)||void 0===e||e.destroy(),this.withoutOverlay||n.Z.checkAnimations2(!1)}),150)}static reAppend(){this.POPUPS.forEach((e=>{const{element:t,container:i}=e,s=t.parentElement;s&&s!==S&&S!==i&&S.append(t)}))}static getPopups(e){return this.POPUPS.filter((t=>t instanceof e))}static createPopup(e,...t){return new e(...t)}}L.POPUPS=[];const E=e=>(e.find((e=>e.isCancel))||e.push({langKey:"Cancel",isCancel:!0}),e)},3186:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3035),n=i(4271),a=i(2325),o=i(3512),r=i(8127);const d={pin:{title:"LimitReached",description:"LimitReachedPinDialogs",descriptionPremium:"LimitReachedPinDialogsPremium",descriptionLocked:"LimitReachedPinDialogsLocked",icon:"limit_pin"},folders:{title:"LimitReached",description:"LimitReachedFolders",descriptionPremium:"LimitReachedFoldersPremium",descriptionLocked:"LimitReachedFoldersLocked",icon:"limit_folders"}};class l extends r.Z{constructor(e,t){super("popup-limit",{buttons:void 0===e.isPremium?[{langKey:"LimitReached.Ok",isCancel:!0}]:e.isPremium?[{langKey:"OK",isCancel:!0}]:[{langKey:"IncreaseLimit",callback:()=>{n.ZP.openPremiumBot()},noRipple:!0},{langKey:"Cancel",isCancel:!0}],descriptionLangKey:void 0===e.isPremium?t.descriptionLocked:e.isPremium?t.descriptionPremium:t.description,descriptionLangArgs:e.isPremium?[e.limitPremium]:[e.limit,e.limitPremium],titleLangKey:t.title});const i=void 0===e.isPremium;if(i)this.element.classList.add("is-locked");else if(e.isPremium)this.element.classList.add("is-premium");else{const e=this.buttons.find((e=>!e.isCancel));e.element.classList.add("popup-limit-button");const t=document.createElement("i");t.classList.add("popup-limit-button-icon","tgico-premium_double"),e.element.append(t)}const r=document.createElement("div");r.classList.add("popup-limit-line");const d=document.createElement("div");d.classList.add("popup-limit-hint");const l=document.createElement("span");if(l.classList.add("popup-limit-hint-icon","tgico-"+t.icon),d.append(l,""+(e.isPremium?e.limitPremium:e.limit)),r.append(d),!i){const t=document.createElement("div");t.classList.add("limit-line");const i=document.createElement("div");i.classList.add("limit-line-free");const s=document.createElement("div");s.classList.add("limit-line-premium"),t.append(i,s),(0,a.$d)(i,"LimitFree"),s.append((0,a.ag)("LimitPremium"),""+e.limitPremium),r.append(t)}this.container.insertBefore(r,this.description);const c=()=>{d.classList.add("active")};o.Z.settings.animationsEnabled?(0,s.d1)().then(c):c()}}function c(e){return function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))}(this,void 0,void 0,(function*(){const t=d[e],[i,s,n]=yield Promise.all([o.Z.managers.apiManager.getAppConfig(),...[!1,!0].map((t=>o.Z.managers.apiManager.getLimit(e,t)))]),a=i.premium_purchase_blocked;new l({isPremium:a?void 0:o.Z.premium,limit:s,limitPremium:n},t).show()}))}},3897:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(7298),n=i(1507),a=i(7479),o=i(8127);const r=[{value:3600,langPackKey:"ChatList.Mute.1Hour"},{value:14400,langPackKey:"ChatList.Mute.4Hours"},{value:28800,langPackKey:"ChatList.Mute.8Hours"},{value:86400,langPackKey:"ChatList.Mute.1Day"},{value:259200,langPackKey:"ChatList.Mute.3Days"},{value:-1,langPackKey:"ChatList.Mute.Forever",checked:!0}];class d extends o.Z{constructor(e,t){let i;super("popup-mute",{peerId:e,titleLangKey:"Notifications",buttons:[{langKey:"ChatList.Context.Mute",callback:()=>{this.managers.appMessagesManager.mutePeer({peerId:e,muteUntil:-1===i?n.rU:(0,s.Z)(!0)+i,threadId:t})}}],body:!0});const o=(0,a.ZC)(r,(e=>{i=+e}));this.body.append(o),this.show()}}},8127:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(9331),n=i(1168),a=i(2325),o=i(9807),r=i(130);class d extends n.Z{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),Object.assign(Object.assign({overlayClosable:!0},t),{title:!0,buttons:t.buttons&&(0,n.x)(t.buttons)})),this.className=e,t.peerId){const e=new s.Z;e.classList.add("avatar-32"),e.updateWithOptions({isDialog:!0,peerId:t.peerId,threadId:t.threadId,wrapOptions:{middleware:this.middlewareHelper.get()}}),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append((0,a.ag)(t.titleLangKey||"AppName",t.titleLangArgs)):t.title instanceof HTMLElement?this.title.append(t.title):this.title.innerText=t.title||"");const i=document.createDocumentFragment();if(t.descriptionLangKey||t.description){const e=this.description=document.createElement("p");e.classList.add("popup-description"),t.descriptionLangKey?e.append((0,a.ag)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&(0,r.Z)(e,t.description),i.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach((e=>{e.withRipple=!0;const t=new o.Z(e);e.checkboxField=t,i.append(t.label)})),t.buttons.forEach((e=>{if(e.callback){const i=e.callback;e.callback=()=>{const e=new Set;t.checkboxes.forEach((t=>{t.checkboxField.checked&&e.add(t.text)})),i(e)}}}))),this.container.insertBefore(i,this.header.nextElementSibling)}}},2995:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5432),n=i(5644),a=i(1168);class o extends a.Z{constructor(e){super("popup-forward",{closable:!0,overlayClosable:!0,body:!0,title:!0}),this.selector=new n.Z({appendTo:this.body,onChange:()=>{return t=this,i=void 0,n=function*(){const t=this.selector.getSelected(),i=t[t.length-1].toPeerId();if(e.onSelect){const t=e.onSelect(i);if(t instanceof Promise)try{yield t}catch(e){return}}this.selector=null,this.hide()},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n},peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),s.Z||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:"abitbigger",peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence,managers:this.managers}),this.scrollable=this.selector.scrollable,this.attachScrollableListeners(),this.title.append(this.selector.input)}}},1962:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(8127);class n extends s.Z{constructor(e,t,i){super("popup-delete-chat",{title:`Send Message${t.length>1?"s":""} Now`,description:t.length>1?"Send "+t.length+" messages now?":"Send message now?",buttons:[{langKey:"Send",callback:()=>{i&&i(),this.managers.appMessagesManager.sendScheduledMessages(e,t)}}]}),this.show()}}},6787:(e,t,i)=>{"use strict";i.d(t,{Z:()=>P});var s=i(1168),n=i(3541),a=i(2153),o=i(279),r=i(5814),d=i(4271),l=i(4755),c=i(2325),h=i(4494),u=i(8497),p=i(1656),f=i(2738),m=i(2796),g=i(130),v=i(8115),b=i(3163),y=i(9259),w=i(7479),S=i(5565),C=i(3512),L=i(9083),E=i(3173),I=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const M="STICKERS-POPUP";class P extends s.Z{constructor(e,t){super("popup-stickers",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.stickerSetInput=e,this.isEmojis=t,this.onStickersClick=e=>I(this,void 0,void 0,(function*(){const t=(0,u.Z)(e.target,"sticker-set-sticker");if(!t)return;const i=t.dataset.docId;(yield d.ZP.chat.input.sendMessageWithDocument(i))&&this.hide()})),this.title.append((0,c.ag)("Loading")),this.updateAdded={},E.ZP.setIgnoreMouseOut("popup",!0),this.addEventListener("close",(()=>{E.ZP.setIgnoreMouseOut("popup",!1),r.Z.setOnlyOnePlayableGroup()})),this.appendTo=this.scrollable.container,this.appendTo.classList.add("is-loading"),(0,o.y)(this.appendTo,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer");const i=(0,h.Z)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(i),this.body.append(this.stickersFooter),(0,y.Z)({listenTo:this.appendTo,listenerSetter:this.listenerSetter});const s=e=>{const t=this.sets.findIndex((t=>t.id===e.id));if(-1===t)return;this.sets[t]=e;const i=this.updateAdded[e.id];null==i||i(!!e.installed_date),this.updateButton()};this.listenerSetter.add(C.Z)("stickers_installed",s),this.listenerSetter.add(C.Z)("stickers_deleted",s),this.loadStickerSet()}createStickerSetElements(e){const t=document.createElement("div");let i,s;t.classList.add("sticker-set"),e&&(i=new w.ZP({title:(0,v.Z)(e.title),subtitle:(0,c.ag)(e.pFlags.emojis?"EmojiCount":"Stickers",[e.count]),buttonRight:!0}),s=e=>{(0,S.Z)(i.buttonRight,(0,c.ag)(e?"Stickers.SearchAdded":"Stickers.SearchAdd")),i.buttonRight.classList.toggle("active",e)},s(!!e.installed_date),t.append(i.container));const n=document.createElement("div");return n.classList.add("sticker-set-stickers"),t.append(n),{container:t,headerRow:i,updateAdded:s,itemsContainer:n}}loadStickerSet(){var e;return I(this,void 0,void 0,(function*(){const t=this.middlewareHelper.get(),i=(Array.isArray(this.stickerSetInput)?this.stickerSetInput:[this.stickerSetInput]).map((e=>this.managers.appStickersManager.getStickerSet(e)));let s=yield Promise.all(i);if(!t())return;let o=s[0];if(1===s.length&&!o)return(0,m.bC)({langPackKey:this.isEmojis?"AddEmojiNotFound":"StickerSet.DontExist"}),void this.hide();s=s.filter(Boolean),o=s[0],this.sets=s.map((e=>e.set));const d=null!==(e=this.isEmojis)&&void 0!==e?e:this.isEmojis=!!o.set.pFlags.emojis;if(!d){(0,f.fc)(this.appendTo,this.onStickersClick,{listenerSetter:this.listenerSetter});const{destroy:e}=(0,b.Z)({listenTo:this.appendTo,isStickerPack:!0,onSend:()=>this.hide()});this.addEventListener("close",e)}r.Z.setOnlyOnePlayableGroup(M);const u=new a.Z,y=[],w=s.map((e=>I(this,void 0,void 0,(function*(){const{container:i,itemsContainer:a,headerRow:o,updateAdded:r}=this.createStickerSetElements(s.length>1?e.set:void 0);let c;o&&(0,f.fc)(o.buttonRight,(()=>{this.managers.appStickersManager.toggleStickerSet(e.set)}),{listenerSetter:this.listenerSetter}),this.updateAdded[e.set.id]=r;const h=e.documents.filter((e=>"document"===(null==e?void 0:e._)));if(d){const e=(0,L.Z)({docIds:h.map((e=>e.id)),loadPromises:y,animationGroup:M,customEmojiSize:l.Z.active.esgCustomEmoji,middleware:t});Array.from(e.children).slice(1).forEach((e=>{const t=document.createElement("span");t.classList.add("super-emoji"),e.replaceWith(t),t.append(e)})),c=[e],a.classList.replace("sticker-set-stickers","super-emojis"),a.classList.add("is-emojis","not-local")}else c=yield Promise.all(h.map((e=>I(this,void 0,void 0,(function*(){const i=document.createElement("div");i.classList.add("sticker-set-sticker");const s=l.Z.active.popupSticker.width;return yield(0,n.ZP)({doc:e,div:i,lazyLoadQueue:u,group:M,play:!0,loop:!0,width:s,height:s,withLock:!0,loadPromises:y,middleware:t}),i})))));return a.append(...c.filter(Boolean)),i})))),S=yield Promise.all(w);yield Promise.all(y);const C=this.button=(0,h.Z)("",{noRipple:!0});this.updateButton(),(0,f.fc)(C,(()=>{const e=(0,p.Z)([C],!0);this.managers.appStickersManager.toggleStickerSets(s.map((e=>e.set))).then((()=>{this.hide()})).catch((()=>{e()}))}),{listenerSetter:this.listenerSetter}),1===s.length?(0,g.Z)(this.title,(0,v.Z)(o.set.title)):(0,g.Z)(this.title,(0,c.ag)("Emoji")),this.stickersFooter.textContent="",this.stickersFooter.append(C),this.appendTo.classList.remove("is-loading"),this.appendTo.textContent="",this.appendTo.append(...S),this.scrollable.onAdditionalScroll()}))}updateButton(){const{sets:e,isEmojis:t}=this;let i,s;if(1===e.length){const n=e[0];s=(0,c.ag)(t?"EmojiCount":"Stickers",[n.count]),i=!n.installed_date}else{const t=e.filter((e=>e.installed_date));let n;e.length===t.length?(i=!1,n=e.length):(i=!0,n=e.length-t.length),s=(0,c.ag)("EmojiPackCount",[n])}this.button.className=i?"btn-primary btn-color-primary":"btn-primary btn-primary-transparent danger",(0,S.Z)(this.button,(0,c.ag)(i?"AddStickersCount":"RemoveStickersCount",[s]))}}},3442:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(9099),n=i(3035),a=i(3910),o=i(2738),r=i(8487),d=i(5953);class l{constructor(e){this.tempId=0,this.detached=!0,this.promise=null,this.isUpload=!1,this.cancelable=!0,this.streamable=!1,this.tryAgainOnFail=!0,this.attachMethod="append",this.onClick=e=>{e&&(0,a.Z)(e),this.preloader.classList.contains("manual")?this.loadFunc&&this.loadFunc(e):this.promise&&this.promise.cancel&&this.promise.cancel()},e&&(0,d.Z)(this,e),this.isUpload&&(this.tryAgainOnFail=!1)}constructContainer(e={}){this.preloader||(this.preloader=document.createElement("div"),this.preloader.classList.add("preloader-container"),e.color&&this.preloader.classList.add("preloader-"+e.color),e.bold&&this.preloader.classList.add("preloader-bold"),this.streamable&&this.preloader.classList.add("preloader-streamable"))}constructDownloadIcon(){this.constructContainer()}construct(){this.construct=null,this.constructContainer(),this.preloader.innerHTML=`\n
\n \n \n \n
`,this.streamable?this.totalLength=118.61124420166016:this.totalLength=149.82473754882812,this.cancelable?(this.preloader.innerHTML+='\n \n \n \n \n \n \n \n \n \n \n \n ',this.downloadSvg=this.preloader.lastElementChild,this.cancelSvg=this.downloadSvg.previousElementSibling):this.preloader.classList.add("preloader-swing"),this.circle=this.preloader.firstElementChild.firstElementChild.firstElementChild,this.cancelable&&(0,o.fc)(this.preloader,this.onClick)}setDownloadFunction(e){this.loadFunc=e}setManual(){this.preloader.classList.add("manual"),this.setProgress(0)}attachPromise(e){if(this.isUpload&&this.promise)return;this.promise=e;const t=--this.tempId,i=Date.now(),s=s=>{if(e.notify=e.notifyAll=null,t!==this.tempId)return;const a=Date.now()-i;if(!s&&this.cancelable){this.setProgress(100);const e=150;a{t===this.tempId&&this.detach()}),e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),(0,n.T2)((()=>{this.setManual()}))):this.detach();this.promise=e=null};e.then((()=>s(null))).catch((e=>s(e))),e.addNotifyListener&&e.addNotifyListener((e=>{if(t!==this.tempId)return;const i=e.done/e.total*100;this.setProgress(i)}))}attach(e,t=!1,i){this.construct&&this.construct(),this.preloader.parentElement&&this.preloader.classList.remove("manual"),this.detached=!1,i&&this.attachPromise(i);let n=0;(this.detached||this.preloader.parentElement!==e)&&(n=(0,r.Z)(this.preloader)?1:2,this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader)),(0,s.Z)({element:this.preloader,className:"is-visible",forwards:!0,duration:200,useRafs:n}),this.cancelable&&t&&this.setProgress(0)}detach(){var e;this.detached||(this.detached=!0,(null===(e=this.preloader)||void 0===e?void 0:e.parentElement)&&(0,s.Z)({element:this.preloader,className:"is-visible",forwards:!1,duration:200,onTransitionEnd:()=>{this.preloader.remove()},useRafs:1}))}setProgress(e){if(this.totalLength||(0,r.Z)(this.circle))if(0!==e)try{this.totalLength||(this.totalLength=this.circle.getTotalLength()),this.circle.style.strokeDasharray=Math.max(5,e/100*this.totalLength)+", "+this.totalLength}catch(e){}else this.circle.style.strokeDasharray=""}}},9931:(e,t,i)=>{"use strict";i.d(t,{Z:()=>b,Y:()=>g});var s=i(4059),n=i(6740),a=i(5565),o=i(130),r=i(9674),d=i(5990),l=i(7256),c=i(1507),h=i(5798),u=i(3512),p=i(9345),f=i(319),m=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function g(e,t,i,o,d=new Image,l=!1){return m(this,void 0,void 0,(function*(){const l=yield u.Z.managers.acknowledged.appAvatarsManager.loadAvatar(t,i,o),c=l.result,h=l.cached;let p,m,v;if(d.classList.add("avatar-photo"),h)m=()=>{(0,a.Z)(e,d),e.dataset.color=""};else{const l=u.Z.settings.animationsEnabled;l&&d.classList.add("fade-in");let c=!1;if("photo_big"===o){const s=yield g(e,t,i,"photo_small");p=s.loadThumbPromise||s.loadPromise,v=s.thumbImage}else if(i.stripped_thumb){v=new Image,e.classList.add("avatar-relative"),v.classList.add("avatar-photo","avatar-photo-thumbnail");const t=(0,s.Z)(i.stripped_thumb);p=(0,n.cj)(v,t).then((()=>{c||(0,a.Z)(e,v)}))}m=()=>{c=!0,v?e.append(d):(0,a.Z)(e,d),setTimeout((()=>{e.childElementCount&&r.Z.mutateElement(d,(()=>{e.dataset.color="",l&&d.classList.remove("fade-in"),null==v||v.remove()}))}),l?200:0)}}const b=c.then((e=>(0,n.cj)(d,e))).then(m);return p&&(yield p.catch(f.Z)),{cached:h,loadPromise:b,loadThumbPromise:h?b:p||Promise.resolve(),thumbImage:v}}))}function v(e,t,i,s,n,a){(0,o.Z)(e,t),e.dataset.color=i,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled","is-forum","is-topic"),s&&e.classList.add(s),n&&e.classList.add("is-forum"),a&&e.classList.add("is-topic")}function b({div:e,peerId:t,isDialog:i=!1,title:s="",onlyThumb:n=!1,isBig:a,threadId:o,wrapOptions:r={}}){var f,b;return m(this,void 0,void 0,(function*(){const m=u.Z.myId;if(t===m&&i)return void v(e,"","","tgico-saved");const y=u.Z.managers;if(o){const i=yield y.dialogsStorage.getForumTopic(t,o);return v(e,"","",void 0,void 0,!0),r.customEmojiSize&&e.style.setProperty("--size",r.customEmojiSize.width+"px"),(0,p.e)(Object.assign(Object.assign({},r),{topic:i,lazyLoadQueue:!1})).then((t=>{e.replaceChildren(t)}))}const w=yield y.appPeersManager.getPeer(t);if(t!==c.NM&&t.isUser()&&(null===(f=null==w?void 0:w.pFlags)||void 0===f?void 0:f.deleted))return void v(e,"",(0,d.Z)(t),"tgico-deletedaccount");const S=!!(null===(b=null==w?void 0:w.pFlags)||void 0===b?void 0:b.forum),C=a?"photo_big":"photo_small",L=(0,l.Z)(w),E=!!L,I=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!E||!I||!(yield y.appAvatarsManager.isAvatarCached(t,C))){let n="";if(!t||t===m&&i||(n=(0,d.Z)(t)),t===c.hj)return void v(e,"",n,"tgico-reply_filled");const a=s?(0,h.Z)(s):function(e){var t;let i="";return e&&(i=null!==(t=e.title)&&void 0!==t?t:[e.first_name,e.last_name].filter(Boolean).join(" ")),(0,h.Z)(i)}(w);v(e,a,n,"",S)}return E?g(e,t,L,C,void 0,n):void 0}))}},279:(e,t,i)=>{"use strict";function s(e,t=!1){const i='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=i,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",i),e.lastElementChild}function n(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,s(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.d(t,{p:()=>n,y:()=>s}),i(410).GO.putPreloader=s},1218:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(9750),n=i(2325),a=i(3855),o=i(3512);class r{constructor(e){const t=this.label=document.createElement("label");t.classList.add("radio-field"),e.alignRight&&t.classList.add("radio-field-right");const i=this.input=document.createElement("input");i.type="radio",i.name="input-radio-"+e.name,e.value&&(i.value=e.value,e.stateKey&&(a.Z.getState().then((t=>{i.checked=(0,s.Z)(t,e.stateKey)===e.value})),i.addEventListener("change",(()=>{o.Z.managers.appStateManager.setByKey(e.stateKey,e.value)}))));const r=this.main=document.createElement("div");r.classList.add("radio-field-main"),e.text?r.innerHTML=e.text:e.langKey&&(0,n.$d)(r,e.langKey),t.append(i,r)}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}}},5133:(e,t,i)=>{"use strict";function s(e,t){const i=document.createElement("form");return e.forEach((e=>{const{container:s,input:n}=e;i.append(s),n.addEventListener("change",(e=>{n.checked&&t(n.value,e)}))})),i}i.d(t,{Z:()=>s})},65:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5077),n=i(3228),a=i(5953);class o{constructor(e,t=0){this.mousedown=!1,this.events={},this.withTransition=!1,this.useTransform=!1,this.vertical=!1,this.onMouseMove=e=>{this.scrub(e)},this.onMouseDown=e=>{var t;this.rect=this.container.getBoundingClientRect(),this.mousedown=!0,this.scrub(e),this.container.classList.add("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseDown)&&this.events.onMouseDown(e)},this.onMouseUp=e=>{var t;this.mousedown=!1,this.container.classList.remove("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseUp)&&this.events.onMouseUp(e)},this.onInput=()=>{var e;const t=+this.seek.value;this.setFilled(t),(null===(e=this.events)||void 0===e?void 0:e.onScrub)&&this.events.onScrub(t)},(0,a.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("progress-line"),this.useTransform?this.container.classList.add("use-transform"):this.withTransition&&this.container.classList.add("with-transition"),this.filled=document.createElement("div"),this.filled.classList.add("progress-line__filled");const i=this.seek=document.createElement("input");i.classList.add("progress-line__seek"),i.type="range",i.step=""+this.step,i.min=""+this.min,i.max=""+this.max,i.value=""+t,t&&this.setProgress(t);const s=""+this.step,n=s.indexOf(".");this.decimals=-1===n?0:s.length-n-1,this.container.append(this.filled,i)}get value(){return+this.seek.value}setHandlers(e){this.events=e}setListeners(){this.seek.addEventListener("input",this.onInput),this._removeListeners=(0,s.Z)(this.container,this.onMouseDown,this.onMouseMove,this.onMouseUp)}setProgress(e){this.seek.value=""+e,this.setFilled(+this.seek.value)}addProgress(e){this.seek.value=""+(+this.seek.value+e),this.setFilled(+this.seek.value)}setFilled(e){let t=(e-this.min)/(this.max-this.min);t=(0,n.Z)(t,0,1),this.useTransform?this.filled.style.transform=`scaleX(${t})`:this.filled.style.width=100*t+"%"}scrub(e){var t;const i=this.vertical?this.rect.height:this.rect.width,s=(0,n.Z)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,i);let a=this.min+s/i*(this.max-this.min);return a-this.min<(this.max-this.min)/2&&(a-=this.step/10),a=+a.toFixed(this.decimals),a=(0,n.Z)(a,this.min,this.max),this.setProgress(a),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(a),a}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}},1405:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(8497),n=i(9674),a=i(5432),o=i(3512),r=i(5975),d=i(3035);let l=0;function c(e,t=(()=>Promise.resolve()),i=null,c=!1,h=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");const u=document.createElement("div");let p;u.classList.add("c-ripple"),e.classList.contains("rp-square")&&u.classList.add("is-square"),e[c?"prepend":"append"](u);const f=(e,s)=>{const o=Date.now(),r=document.createElement("div"),c=l++,h=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s",""),f=p=()=>{const e=Date.now()-o,t=()=>{n.Z.mutate((()=>{r.remove()})),null==i||i(c)};if(er.classList.add("hiding")),Math.max(i-h/2,0)),setTimeout(t,i)}else r.classList.add("hiding"),setTimeout(t,h/2);a.Z||(window.removeEventListener("contextmenu",p),window.removeEventListener("mousemove",p)),p=null,g=!1};null==t||t(c),(0,d.T2)((()=>{if(f!==p)return;const t=u.getBoundingClientRect();r.classList.add("c-ripple__circle");const i=e-t.left,n=s-t.top,a=Math.sqrt(Math.pow(Math.abs(n-t.height/2)+t.height/2,2)+Math.pow(Math.abs(i-t.width/2)+t.width/2,2)),o=i-a/2,d=n-a/2;r.style.width=r.style.height=a+"px",r.style.left=o+"px",r.style.top=d+"px",u.append(r)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,s.Z)(t.target,"c-ripple")!==u)&&(h===e||!(0,r.Z)(t.target,h));let g=!1;if(a.Z){const e=()=>{null==p||p()};h.addEventListener("touchstart",(t=>{if(!o.Z.settings.animationsEnabled)return;if(t.touches.length>1||g||m(t))return;g=!0;const{clientX:i,clientY:s}=t.touches[0];f(i,s),h.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),h.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else h.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!o.Z.settings.animationsEnabled)return;if("0"===h.dataset.ripple||m(e))return;if(g)return void(g=!1);const{clientX:t,clientY:i}=e;f(t,i),window.addEventListener("mouseup",p,{once:!0,passive:!0}),window.addEventListener("contextmenu",p,{once:!0,passive:!0})}),{passive:!0})}},7479:(e,t,i)=>{"use strict";i.d(t,{De:()=>g,ZC:()=>v,ZP:()=>f,tG:()=>m});var s=i(9807),n=i(1218),a=i(1405),o=i(5133),r=i(2325),d=i(5565),l=i(130),c=i(2738),h=i(4494),u=i(4531);const p=(e,t)=>{!0===t||("string"==typeof t?(0,l.Z)(e,t):e.append(t))};class f{constructor(e={}){this.freezed=!1,e.checkboxFieldOptions&&(e.checkboxField=new s.Z(Object.assign({listenerSetter:e.listenerSetter},e.checkboxFieldOptions)));const t=e.asLink?"a":e.radioField||e.checkboxField?"label":"div";if(this.container=document.createElement(t),this.container.classList.add("row","no-subtitle"),e.noWrap&&this.container.classList.add("no-wrap"),e.subtitle){const t=this.subtitle;if(p(t,e.subtitle),e.noWrap&&t.classList.add("no-wrap"),e.subtitleRight){this.container.append(this.subtitleRow=this.createRow()),this.subtitleRow.classList.add("row-subtitle-row");const i=this.subtitleRight=document.createElement("div");i.classList.add("row-subtitle","row-subtitle-right"),p(i,e.subtitleRight),this.subtitleRow.append(t,i)}}else e.subtitleLangKey&&this.subtitle.append((0,r.ag)(e.subtitleLangKey,e.subtitleLangArgs));let i=!!e.havePadding;if(e.radioField||e.checkboxField){if(e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label),i=!0),e.checkboxField){this.checkboxField=e.checkboxField;const t=e.checkboxField.label.classList.contains("checkbox-field-toggle");if(t?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):(i=!0,this.container.append(this.checkboxField.label)),e.withCheckboxSubtitle&&!t){const t=()=>{(0,d.Z)(this.subtitle,(0,r.ag)(this.checkboxField.input.checked?"Checkbox.Enabled":"Checkbox.Disabled"))};e.listenerSetter?e.listenerSetter.add(this.checkboxField.input)("change",t):this.checkboxField.input.addEventListener("change",t)}}(e.radioField||e.checkboxField).label.classList.add("disable-hover")}if(e.title||e.titleLangKey){let t;const i=e.titleRight||e.titleRightSecondary;if(i?(this.container.append(t=this.titleRow=this.createRow()),this.titleRow.classList.add("row-title-row")):t=this.container,this.title=this.createTitle(),e.noWrap&&this.title.classList.add("no-wrap"),e.title?p(this.title,e.title):e.titleLangKey&&this.title.append((0,r.ag)(e.titleLangKey)),t.append(this.title),i){const s=this.titleRight=document.createElement("div");s.classList.add("row-title","row-title-right"),e.titleRightSecondary&&s.classList.add("row-title-right-secondary"),p(s,i),t.append(s)}}e.icon&&(i=!0,this.container.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),i&&this.container.classList.add("row-with-padding"),e.navigationTab&&(e.clickable=()=>e.navigationTab.open()),(e.clickable||e.radioField||e.checkboxField)&&("function"==typeof e.clickable&&(0,c.fc)(this.container,(t=>{this.freezed||e.clickable(t)}),{listenerSetter:e.listenerSetter}),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||(0,a.Z)(this.container,void 0,void 0,!0)),(e.buttonRight||e.buttonRightLangKey)&&(this.buttonRight=e.buttonRight instanceof HTMLElement?e.buttonRight:(0,h.Z)("btn-primary btn-color-primary",{text:e.buttonRightLangKey}),this.container.append(this.buttonRight)),e.contextMenu&&(0,u.Z)(Object.assign(Object.assign({},e.contextMenu),{listenTo:this.container,listenerSetter:e.listenerSetter}))}get subtitle(){var e;return null!==(e=this._subtitle)&&void 0!==e?e:this._subtitle=this.createSubtitle()}get midtitle(){var e;return null!==(e=this._midtitle)&&void 0!==e?e:this._midtitle=this.createMidtitle()}createRow(){const e=document.createElement("div");return e.classList.add("row-row"),e}createTitle(){const e=document.createElement("div");return e.classList.add("row-title"),(0,l.m)(e),e}createSubtitle(){const e=document.createElement("div");return e.classList.add("row-subtitle"),(0,l.m)(e),this.title?this.title.after(e):this.container.prepend(e),this.container.classList.remove("no-subtitle"),e}createMidtitle(){const e=document.createElement("div");return e.classList.add("row-midtitle"),this.subtitle.parentElement.insertBefore(e,this.subtitle),e}createMedia(e){const t=document.createElement("div");return this.applyMediaElement(t,e)}applyMediaElement(e,t){return this.container.classList.add("row-with-padding"),this.media=e,e.classList.add("row-media"),t&&e.classList.add("row-media-"+t),this.container.append(e),e}disableWithPromise(e){this.container.classList.add("is-disabled"),e.finally((()=>{this.container.classList.remove("is-disabled")}))}makeSortable(){const e=document.createElement("span");this.container.classList.add("row-sortable","tgico"),e.classList.add("row-sortable-icon","tgico-menu"),this.container.append(e)}toggleSorting(e){this.container.classList.toggle("cant-sort",!e)}}const m=e=>new f({checkboxField:e,listenerSetter:e.listenerSetter}),g=(e,t)=>(0,o.Z)(e.map((e=>({container:e.container,input:e.radioField.input}))),t),v=(e,t)=>{const i="name-"+(8388607*Math.random()|0);let s;const a=e.map((({langPackKey:e,value:t,checked:a})=>{const o=new f({radioField:new n.Z({langKey:e,name:i,value:""+t})});return a&&(s=o.radioField),o})),o=g(a,t);return s&&(s.checked=!0),o}},8805:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>l,v7:()=>c});var s=i(5432),n=i(5003),a=i(4789),o=i(8594),r=i(3910);class d{constructor(e,t="",i=document.createElement("div")){this.el=e,this.container=i,this.onScrollMeasure=0,this.lastScrollPosition=0,this.lastScrollDirection=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.cancelMeasure(),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure||(this.onScrollMeasure=window.setTimeout((()=>{this.onScrollMeasure=0;const e=this.container[this.scrollProperty];this.lastScrollDirection=this.lastScrollPosition===e?0:this.lastScrollPositionthis.container.append(e))),e.append(this.container))}addScrollListener(){this.addedScrollListener||(this.addedScrollListener=!0,this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}))}removeScrollListener(){this.addedScrollListener&&(this.addedScrollListener=!1,this.container.removeEventListener("scroll",this.onScroll,{capture:!0}))}setListeners(){this.removeHeavyAnimationListener||(window.addEventListener("resize",this.onScroll,{passive:!0}),this.addScrollListener(),this.removeHeavyAnimationListener=(0,o.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.cancelMeasure(),this.needCheckAfterAnimation=!0)}),(()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})))}removeListeners(){this.removeHeavyAnimationListener&&(window.removeEventListener("resize",this.onScroll),this.removeScrollListener(),this.removeHeavyAnimationListener(),this.removeHeavyAnimationListener=void 0)}destroy(){this.removeListeners(),this.onAdditionalScroll=void 0,this.onScrolledTop=void 0,this.onScrolledBottom=void 0}append(...e){this.container.append(...e)}scrollIntoViewNew(e){return(0,a.Z)(Object.assign(Object.assign({},e),{container:this.container}))}cancelMeasure(){this.onScrollMeasure&&(clearTimeout(this.onScrollMeasure),this.onScrollMeasure=0)}}class l extends d{constructor(e,t="",i=300,s){super(e,t),this.onScrollOffset=i,this.loadedAll={top:!0,bottom:!1},this.checkForTriggers=()=>{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const e=this.container.scrollHeight;if(!e)return;const t=e-this.container.clientHeight,i=this.lastScrollPosition;this.onScrolledTop&&i<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-i<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners(),this.scrollProperty="scrollTop"}attachBorderListeners(e=this.container){const t=this.onAdditionalScroll;this.onAdditionalScroll=()=>{null==t||t(),e.classList.toggle("scrolled-top",!this.scrollTop),e.classList.toggle("scrolled-bottom",this.isScrolledDown)},e.classList.add("scrolled-top","scrolled-bottom","scrollable-y-bordered")}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}setScrollTopSilently(e){this.lastScrollPosition=e,this.ignoreNextScrollEvent(),this.scrollTop=e}ignoreNextScrollEvent(){this.removeHeavyAnimationListener&&(this.removeScrollListener(),this.container.addEventListener("scroll",(e=>{(0,r.Z)(e),this.addScrollListener()}),{capture:!0,passive:!1,once:!0}))}get scrollHeight(){return this.container.scrollHeight}}class c extends d{constructor(e,t="",i=300,n=15,a=document.createElement("div")){if(super(e,t,a),this.onScrollOffset=i,this.splitCount=n,this.container=a,this.container.classList.add("scrollable-x"),!s.Z){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,(0,r.Z)(e))};this.container.addEventListener("wheel",e,{passive:!1})}this.scrollProperty="scrollLeft"}}},5029:(e,t,i)=>{"use strict";i.d(t,{R:()=>r,Z:()=>o});var s=i(2325),n=i(36);const a="sidebar-left-section";class o{constructor(e={}){var t;const i=this.container=document.createElement("div");i.classList.add(a+"-container");const o=this.innerContainer=document.createElement("div");if(o.classList.add(a),e.noShadow&&o.classList.add("no-shadow"),e.fakeGradientDelimiter)o.append((0,n.G)()),o.classList.add("with-fake-delimiter");else if(e.noDelimiter)o.classList.add("no-delimiter");else{const e=document.createElement("hr");o.append(e)}const r=this.content=this.generateContentElement();if(e.name){const t=this.title=document.createElement("div");t.classList.add("sidebar-left-h2",a+"-name"),(0,s.XZ)({element:t,key:e.name,args:e.nameArgs}),r.append(t)}i.append(o);const d=null!==(t=e.caption)&&void 0!==t?t:e.captionOld;if(d){const t=this.caption=this.generateContentElement();t.classList.add(a+"-caption"),e.captionOld||i.append(t),!0!==d&&(0,s.XZ)({element:t,key:d,args:e.captionArgs})}}generateContentElement(){const e=document.createElement("div");return e.classList.add(a+"-content"),this.innerContainer.append(e),e}}const r=(e,t,i)=>{const s=new o({name:t,caption:i});return e.append(s.container),s.content}},744:(e,t,i)=>{"use strict";i.d(t,{ir:()=>jt,ZP:()=>Kt});var s=i(4271),n=i(3512),a=i(5884),o=i(9331),r=i(8805),d=i(3607),l=i(3552),c=i(426),h=i(8130),u=i(503),p=i(187),f=i(2325),m=i(8119),g=i(3061),v=i(2738),b=i(5029);class y extends l._{constructor(){super(...arguments),this.uploadAvatar=null,this.isGeoChat=!1}init(e,t=!1){this.isGeoChat=t,this.peerIds=e,this.container.classList.add("new-group-container"),this.setTitle("NewGroup"),this.avatarEdit=new p.Z((e=>{this.uploadAvatar=e}));const i=new b.Z({}),n=document.createElement("div");n.classList.add("input-wrapper"),this.groupNameInputField=new u.ZP({label:"CreateGroup.NameHolder",maxLength:128}),this.groupLocationInputField=new u.ZP({label:"ChatLocation",name:"location",canBeEdited:!1}),n.append(this.groupNameInputField.container,this.groupLocationInputField.container),this.listenerSetter.add(this.groupNameInputField.input)("input",(()=>{let e=!!this.groupNameInputField.value.length&&!this.groupNameInputField.input.classList.contains("error");this.isGeoChat&&(e=e&&!!this.userLocationCoords&&!!this.userLocationAddress),this.nextBtn.classList.toggle("is-visible",!!e)})),this.nextBtn=(0,m.Z)({icon:"arrow_next"}),(0,v.fc)(this.nextBtn,(()=>{const e=this.groupNameInputField.value;let t;if(this.isGeoChat){if(!this.userLocationAddress||!this.userLocationCoords)return;t=this.managers.appChatsManager.createChannel({title:e,about:"",geo_point:Object.assign({_:"inputGeoPoint"},this.userLocationCoords),address:this.userLocationAddress,megagroup:!0}).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),this.peerIds.length&&this.managers.appChatsManager.inviteToChannel(e,this.peerIds),e)))}else this.nextBtn.disabled=!0,t=this.managers.appChatsManager.createChat(e,this.peerIds.map((e=>e.toUserId()))).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),e)));t&&t.then((e=>{this.close(),s.ZP.setInnerPeer({peerId:e.toPeerId(!0)})}))}),{listenerSetter:this.listenerSetter});const a=new b.Z({name:"Members",nameArgs:[this.peerIds.length]}),o=this.list=h.default.createChatList({new:!0});return a.content.append(o),i.content.append(this.avatarEdit.container,n),this.content.append(this.nextBtn),this.scrollable.append(i.container,a.container),t?(this.setTitle("NearbyCreateGroup"),this.groupLocationInputField.container.classList.remove("hide"),this.groupLocationInputField.setValueSilently(f.ZP.format("Loading",!0)),this.startLocating()):this.groupLocationInputField.container.classList.add("hide"),Promise.all(this.peerIds.map((e=>{return t=this,i=void 0,n=function*(){const{dom:t}=h.default.addDialogNew({peerId:e,container:this.list,rippleEnabled:!1,avatarSize:"abitbigger"});t.lastMessageSpan.append((0,g.Z)(yield this.managers.appUsersManager.getUser(e)))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n})))}onCloseAfterTimeout(){this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.groupLocationInputField.container.classList.add("hide"),this.nextBtn.disabled=!1}startLocating(){navigator.geolocation.getCurrentPosition((e=>{this.userLocationCoords={lat:e.coords.latitude,long:e.coords.longitude};let t="https://nominatim.openstreetmap.org/reverse";t+="?lat="+e.coords.latitude,t+="&lon="+e.coords.longitude,t+="&format=json",t+="&addressdetails=1",t+="&accept-language=en",fetch(t).then((e=>e.json())).then((e=>{this.userLocationAddress=e.display_name,this.groupLocationInputField.setValueSilently(e.display_name)}))}),(e=>{e instanceof GeolocationPositionError?this.groupLocationInputField.setValueSilently("Location permission denied. Please retry later."):this.groupLocationInputField.setValueSilently("An error has occurred. Please retry later.")}))}}var w,S=i(6360),C=i(632),L=i(410),E=i(5322),I=i(4494),M=i(6024),P=i(7479),Z=i(5565),T=i(144);function k(e){const t=[],i={users:[],chats:[]},s={users:[],chats:[]};return e.forEach((e=>{switch(e._){case"privacyValueAllowAll":t.push(2);break;case"privacyValueDisallowAll":t.push(0);break;case"privacyValueAllowContacts":t.push(1);break;case"privacyValueAllowChatParticipants":i.chats.push(...e.chats);break;case"privacyValueAllowUsers":i.users.push(...e.users);break;case"privacyValueDisallowChatParticipants":s.chats.push(...e.chats);break;case"privacyValueDisallowUsers":s.users.push(...e.users)}})),{type:t[0],disallowPeers:s,allowPeers:i}}!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(w||(w={}));const x=w;var A=i(1218),_=i(5670);class F{constructor(e){this.options=e,this.onRadioChange=e=>{e=+e,this.type=e;const t=this.options.captions[this.type],i=this.radioSection.caption;t?t instanceof HTMLElement?(0,Z.Z)(i,t):(0,f.$d)(i,t):i.innerHTML="",i.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===x.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===x.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse();const t=e.managers;this.radioSection=new b.Z({name:e.title,caption:!0}),this.radioRows=new Map;let i=[{type:x.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:x.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:x.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(i=i.filter((t=>!e.skipTypes.includes(t.type))));const s=(0,T.a)();i.forEach((({type:e,langKey:t})=>{const i=new P.ZP({radioField:new A.Z({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)}));const n=(0,P.De)([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(n),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=(0,b.R)(e.appendTo,"PrivacyExceptions","PrivacySettingsController.PeerInfo");this.exceptions=new Map([["disallow",{titleLangKey:e.exceptionTexts[0],key:"disallow",row:null,icon:"deleteuser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}],["allow",{titleLangKey:e.exceptionTexts[1],key:"allow",row:null,icon:"adduser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}]]),this.exceptions.forEach((i=>{i.row=new P.ZP(i),i.row.container.addEventListener("click",(()=>{a.then((()=>{const t=this.peerIds[i.key];e.tab.slider.createTab(_.Z).open({type:"privacy",skippable:!0,title:i.titleLangKey,placeholder:"PrivacyModal.Search.Placeholder",takeOut:e=>{t.length=0,t.push(...e),i.row.subtitle.innerHTML="",i.row.subtitle.append(...this.generateStr(this.splitPeersByType(e)))},selectedPeerIds:t})}))})),t.append(i.row.container)}))}const a=t.appPrivacyManager.getPrivacy(e.inputKey).then((i=>{const s=k(i);this.setRadio(s.type),this.exceptions&&(this.peerIds={},["allow","disallow"].forEach((e=>{const t=[],i="allow"===e?s.allowPeers:s.disallowPeers;t.push(...i.users.map((e=>e.toPeerId()))),t.push(...i.chats.map((e=>e.toPeerId(!0)))),this.peerIds[e]=t;const n=this.exceptions.get(e).row.subtitle;n.innerHTML="",n.append(...this.generateStr(i))}))),e.tab.eventListener.addEventListener("destroy",(()=>{return i=this,s=void 0,a=function*(){const i=[];switch(this.type){case x.Everybody:i.push({_:"inputPrivacyValueAllowAll"});break;case x.Contacts:i.push({_:"inputPrivacyValueAllowContacts"});break;case x.Nobody:i.push({_:"inputPrivacyValueDisallowAll"})}if(this.exceptions){const e=[["allow","inputPrivacyValueAllowChatParticipants","inputPrivacyValueAllowUsers"],["disallow","inputPrivacyValueDisallowChatParticipants","inputPrivacyValueDisallowUsers"]];for(const[s,n,a]of e){if(this.exceptions.get(s).row.container.classList.contains("hide"))continue;const e=this.peerIds[s];if(e){const s=this.splitPeersByType(e);s.chats.length&&i.push({_:n,chats:s.chats}),s.users.length&&i.push({_:a,users:yield Promise.all(s.users.map((e=>t.appUsersManager.getUserInput(e))))})}}}t.appPrivacyManager.setPrivacy(e.inputKey,i)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}),{once:!0})}))}setRadio(e){const t=this.radioRows.get(e);this.onRadioChange(e),t.radioField.input.checked=!0}splitPeersByType(e){const t={users:[],chats:[]};return e.forEach((e=>{t[e.isAnyChat()?"chats":"users"].push(e.isAnyChat()?e.toChatId():e)})),t}generateStr(e){return e.users.length||e.chats.length?(0,f.v_)([e.users.length?(0,f.ag)("Users",[e.users.length]):null,e.chats.length?(0,f.ag)("Chats",[e.chats.length]):null].filter(Boolean),!1):[(0,f.ag)("PrivacySettingsController.AddUsers")]}}var D=i(3532);class R extends M.h{init(){return e=this,t=void 0,s=function*(){this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e="+"+(yield this.managers.appUsersManager.getSelf()).phone,t=document.createElement("div");t.append((0,f.ag)("PrivacyPhoneInfo"),document.createElement("br"),document.createElement("br"),(0,f.ag)("PrivacyPhoneInfo4"),document.createElement("br"),(0,D.Z)({mePath:e}));const i=new F({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:[t,t,""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{n.setRadio(x.Everybody),n.radioSection.container.classList.toggle("hide",e!==x.Nobody)},managers:this.managers}),s="PrivacyPhoneInfo3",n=new F({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:[s,s,""],noExceptions:!0,skipTypes:[x.Nobody],managers:this.managers});this.scrollable.container.insertBefore(n.radioSection.container,i.radioSection.container.nextSibling)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var B=i(8127),N=i(5772),O=i(279);class U extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new b.Z({captionOld:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({emoji:"🥳",div:t,width:160,height:160}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=(0,I.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});(0,v.fc)(n,(e=>{this.close()})),this.slider.sliceTabsUntilTab(St,this),s.append(n),i.append(s),this.scrollable.container.append(e.container)}}var H=i(4489),z=i(4762);function j(e){return!z.IS_MOBILE_SAFARI||!e}var G=i(1656);class V extends l._{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email-confirmation"),this.setTitle("TwoStepAuth.RecoveryTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0});(0,f.$d)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"📬"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=this.codeInputField=new H.Z({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{d(!0),this.managers.passwordManager.confirmPasswordEmail(""+e).then((e=>{r()})).catch((e=>{switch(e.type){case"CODE_INVALID":n.input.classList.add("error"),(0,Z.Z)(n.label,(0,f.ag)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":n.input.classList.add("error"),(0,Z.Z)(n.label,(0,f.ag)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}d(!1)}))}}),a=(0,I.Z)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),r=()=>{this.slider.createTab(U).open()},d=e=>{(0,G.Z)([n.input,a,o],e)};(0,v.fc)(a,(e=>{d(!0),this.managers.passwordManager.cancelPasswordEmail().then((e=>{this.slider.sliceTabsUntilTab($,this),this.close()}),(()=>{d(!1)}))})),(0,v.fc)(o,(e=>{d(!0);const t=(0,O.y)(o);this.managers.passwordManager.resendPasswordEmail().then((e=>{t.remove(),d(!1)}))})),s.append(n.container,a,o),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){j(this.isFirst)&&this.codeInputField.input.focus()}}var K=i(3910),W=i(1171);class $ extends l._{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"💌"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=this.inputField=new u.ZP({name:"recovery-email",label:"RecoveryEmail",plainText:!0});n.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,K.Z)(e),d()})),n.input.addEventListener("input",(e=>{n.input.classList.remove("error")}));const a=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),r=()=>{this.slider.createTab(U).open()},d=()=>{const e=n.value.trim(),t=(0,W.Z)(e);if(!t||t[0].length!==e.length)return void n.input.classList.add("error");l(!0);const i=(0,O.y)(a);this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then((e=>{r()}),(t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const i=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],s=this.slider.createTab(V);s.state=this.state,s.email=e,s.length=i,s.open()}else console.log("password set error",t);l(!1),i.remove()}))};(0,v.fc)(a,d);const l=e=>{e?(a.setAttribute("disabled","true"),o.setAttribute("disabled","true")):(a.removeAttribute("disabled"),o.removeAttribute("disabled"))};(0,v.fc)(o,(e=>{new B.Z("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{l(!0),(0,O.y)(o),this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then((()=>{r()}),(e=>{l(!1)}))},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()})),s.append(n.container,a,o),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){j(this.isFirst)&&this.inputField.input.focus()}}var q=i(130),Q=i(8115),Y=i(4425),X=i(6830),J=i(3083),ee=i(2796);class te extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new b.Z({noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"💡"}),e.content.append(t);const i=document.createElement("div");i.classList.add("input-wrapper");const s=this.inputField=new u.ZP({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});s.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,K.Z)(e),s.value?r():d()}));const n=(e,t)=>{e&&(0,K.Z)(e);const i=t?s.value:void 0;if(i&&this.newPassword===i)return void(0,ee.Am)(f.ZP.format("PasswordAsHintError",!0));const n=this.slider.createTab($);n.state=this.state,n.plainPassword=this.plainPassword,n.newPassword=this.newPassword,n.hint=i,n.open()},a=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),r=e=>n(e,!0),d=e=>n(e,!1);(0,v.fc)(a,r),(0,v.fc)(o,d),i.append(s.container,a,o),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class ie extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-enter-password","two-step-verification-re-enter-password"),this.setTitle("PleaseReEnterPassword");const e=new b.Z({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const i=this.passwordInputField=new X.Z({name:"re-enter-password",label:"PleaseReEnterPassword"}),s=new J.Z(i,157),n=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"});t.append(i.container,n),e.content.append(s.container,t),this.scrollable.container.append(e.container),i.input.addEventListener("keypress",(e=>{if(i.input.classList.contains("error")&&i.setState(u.I1.Neutral),"Enter"===e.key)return o()}));const a=()=>this.newPassword===i.value||(i.setError(),!1),o=e=>{if(e&&(0,K.Z)(e),!a())return;const t=this.slider.createTab(te);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return(0,v.fc)(n,o),s.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class se extends l._{constructor(){super(...arguments),this.isFirst=!0}init(){const e=!this.state.pFlags.has_password||this.plainPassword;this.container.classList.add("two-step-verification","two-step-verification-enter-password"),this.setTitle(e?"PleaseEnterFirstPassword":"PleaseEnterCurrentPassword");const t=new b.Z({noDelimiter:!0}),i=document.createElement("div");i.classList.add("input-wrapper");const s=this.passwordInputField=new X.Z({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?(0,Q.Z)(this.state.hint):void 0}),n=new Y.Z(s,157),a=(0,I.Z)("btn-primary btn-color-primary"),o=new f.ZP.IntlElement({key:"Continue"});a.append(o.element),i.append(s.container,a),t.content.append(n.container,i),this.scrollable.container.append(t.container),s.input.addEventListener("keypress",(e=>{if(s.input.classList.contains("error")&&(s.input.classList.remove("error"),o.key="Continue",o.update()),"Enter"===e.key)return d()}));const r=()=>!!s.value.length||(s.input.classList.add("error"),!1);let d;if(e)d=e=>{if(e&&(0,K.Z)(e),!r())return;const t=this.slider.createTab(ie);t.state=this.state,t.newPassword=s.value,t.plainPassword=this.plainPassword,t.open()};else{let e;const t=()=>(e||(e=window.setInterval(t,1e4)),this.managers.passwordManager.getState().then((e=>{this.state=e,this.state.hint?(0,q.Z)(s.label,(0,Q.Z)(this.state.hint)):(0,Z.Z)(s.label,(0,f.ag)("LoginPassword"))})));d=i=>{if(!r())return void(0,K.Z)(i);a.setAttribute("disabled","true"),o.key="PleaseWait",o.update();const d=(0,O.y)(a),l=s.value;this.managers.passwordManager.check(s.value,this.state).then((t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),n&&n.remove();const t=this.slider.createTab(ne);t.state=this.state,t.plainPassword=l,t.open(),this.slider.removeTabFromHistory(this)}}),(e=>{a.removeAttribute("disabled"),s.input.classList.add("error"),e.type,o.key="PASSWORD_HASH_INVALID",o.update(),d.remove(),s.select(),t()}))},t()}return(0,v.fc)(a,d),n.load()}onOpenAfterTimeout(){j(this.isFirst)&&this.passwordInputField.input.focus()}}class ne extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:168,height:168,emoji:"🔐"}),e.content.append(t);const i=e.generateContentElement();if(this.state.pFlags.has_password){(0,f.$d)(e.caption,"TwoStepAuth.GenericHelp");const t=(0,I.Z)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=(0,I.Z)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),n=(0,I.Z)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});(0,v.fc)(t,(()=>{const e=this.slider.createTab(se);e.state=this.state,e.plainPassword=this.plainPassword,e.open()})),(0,v.fc)(s,(()=>{new B.Z("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{this.managers.passwordManager.updateSettings({currentPassword:this.plainPassword}).then((()=>{this.slider.sliceTabsUntilTab(St,this),this.close()}))},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()})),(0,v.fc)(n,(()=>{const e=this.slider.createTab($);e.state=this.state,e.hint=this.state.hint,e.plainPassword=this.plainPassword,e.newPassword=this.plainPassword,e.isFirst=!0,e.open()})),i.append(t,s,n)}else{(0,f.$d)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=(0,I.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),(0,v.fc)(s,(e=>{const t=this.slider.createTab(se);t.state=this.state,t.open()}))}this.scrollable.container.append(e.container)}}class ae extends M.h{init(){this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new F({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,managers:this.managers})}}class oe extends M.h{init(){this.container.classList.add("privacy-tab","privacy-profile-photo"),this.setTitle("PrivacyProfilePhoto");const e="PrivacySettingsController.ProfilePhoto.CustomHelp";new F({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[x.Nobody],managers:this.managers})}}class re extends M.h{init(){this.container.classList.add("privacy-tab","privacy-forward-messages"),this.setTitle("PrivacySettings.Forwards");const e="PrivacySettingsController.Forwards.CustomHelp";new F({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}class de extends M.h{init(){this.container.classList.add("privacy-tab","privacy-add-to-groups"),this.setTitle("PrivacySettings.Groups");const e="PrivacySettingsController.GroupDescription";new F({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[x.Nobody],managers:this.managers})}}class le extends M.h{init(){this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new F({tab:this,title:"WhoCanCallMe",inputKey:"inputPrivacyKeyPhoneCall",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers});{const e="PrivacySettingsController.P2p.Desc";new F({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}}var ce=i(3003),he=i(8497),ue=i(4064),pe=i(6976),fe=i(1483),me=i(3416);class ge extends M.h{init(){this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new P.ZP({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:(0,C.zM)(new Date(1e3*Math.max(e.date_active,e.date_created)))});return t.container.dataset.hash=""+e.hash,t.midtitle.textContent=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t},t=this.authorizations.slice();{const n=new b.Z({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),a=(0,ue.Z)(t,(e=>e.pFlags.current)),o=e(a);if(n.content.append(o.container),t.length){const e=(0,I.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});(0,v.fc)(e,(t=>{new B.Z("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=(0,G.Z)([e],!0);this.managers.apiManager.invokeApi("auth.resetAuthorizations").then((t=>{e.remove(),i.container.remove()}),s).finally((()=>{t()}))}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()}),{listenerSetter:this.listenerSetter}),n.content.append(e)}this.scrollable.append(n.container)}if(!t.length)return;const i=new b.Z({name:"OtherSessions",caption:"SessionsListInfo"});t.forEach((t=>{i.content.append(e(t).container)})),this.scrollable.append(i.container);const s=e=>{"FRESH_RESET_AUTHORISATION_FORBIDDEN"===e.type&&(0,ee.Am)(f.ZP.format("RecentSessions.Error.FreshReset",!0))};let n;const a=()=>{const e=n.dataset.hash;new B.Z("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{this.managers.apiManager.invokeApi("account.resetAuthorization",{hash:e}).then((e=>{e&&n.remove()}),s)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},o=this.menuElement=(0,ce.b)({buttons:[{icon:"stop",text:"Terminate",onClick:a}]});o.id="active-sessions-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),(0,pe.E)({element:this.scrollable.container,callback:e=>{n=(0,he.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,fe.Z)(e,o),me.Z.openBtnMenu(o))},listenerSetter:this.listenerSetter}),(0,v.fc)(this.scrollable.container,(e=>{n=(0,he.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&a()}),{listenerSetter:this.listenerSetter})}onCloseAfterTimeout(){var e;return null===(e=this.menuElement)||void 0===e||e.remove(),super.onCloseAfterTimeout()}}var ve=i(2995),be=i(4668),ye=i(8210),we=i(5102);class Se extends l._{init(){this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");const e=new b.Z({caption:"BlockedUsersInfo"});e.caption.parentElement.prepend(e.caption),this.scrollable.append(e.container);const t=(0,m.Z)({icon:"add",className:"is-visible"});this.content.append(t),(0,v.fc)(t,(e=>{new ve.Z({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{this.managers.appUsersManager.toggleBlock(e,!0)}})}),{listenerSetter:this.listenerSetter});const i=h.default.createChatList();this.scrollable.container.classList.add("chatlist-container"),e.content.append(i);const s=(e,t)=>{return s=this,n=void 0,o=function*(){const{dom:s}=h.default.addDialogNew({peerId:e,container:i,rippleEnabled:!0,avatarSize:"abitbigger",append:t}),n=yield this.managers.appUsersManager.getUser(e.toUserId());if(!n)return;const a=(0,we.Z)(n)[0];n.pFlags.bot?s.lastMessageSpan.append("@"+a):n.phone?s.lastMessageSpan.innerHTML=(0,ye.Z)(n.phone):s.lastMessageSpan.append(a?"@"+a:(0,g.Z)(n))},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}d((o=o.apply(s,n||[])).next())}));var s,n,a,o};for(const e of this.peerIds)s(e,!0);let a;const o=this.menuElement=(0,ce.b)({buttons:[{icon:"lockoff",text:"Unblock",onClick:()=>{const e=a.dataset.peerId.toPeerId();this.managers.appUsersManager.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]});o.id="blocked-users-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),(0,pe.E)({element:this.scrollable.container,callback:e=>{a=(0,be.Z)(e.target,h.DIALOG_LIST_ELEMENT_TAG),a&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,fe.Z)(e,o),me.Z.openBtnMenu(o))},listenerSetter:this.listenerSetter}),this.listenerSetter.add(n.Z)("peer_block",(e=>{const{peerId:t,blocked:n}=e,a=i.querySelector(`[data-peer-id="${t}"]`);n?a||s(t,!1):a&&a.remove()}));let r=!1;this.scrollable.onScrolledBottom=()=>{r||(r=!0,this.managers.appUsersManager.getBlocked(i.childElementCount,50).then((e=>{for(const t of e.peerIds)s(t,!0);(e.peerIds.length<50||i.childElementCount===e.count)&&(this.scrollable.onScrolledBottom=null),this.scrollable.checkForTriggers()})).finally((()=>{r=!1})))}}onOpenAfterTimeout(){this.scrollable.onScroll()}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}var Ce=i(9807);function Le(e){return"input"+(e[0].toUpperCase()+e.slice(1))}var Ee=i(5592),Ie=i(319);class Me extends M.h{init(){this.container.classList.add("privacy-tab","privacy-voices"),this.setTitle("PrivacyVoiceMessages");const e="PrivacyVoiceMessagesInfo";new F({tab:this,title:"PrivacyVoiceMessagesTitle",inputKey:"inputPrivacyKeyVoiceMessages",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}var Pe=i(7362),Ze=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Te extends M.h{init(e){return Ze(this,void 0,void 0,(function*(){this.container.classList.add("active-sessions-container"),this.setTitle("WebSessionsTitle");const t=e=>Ze(this,void 0,void 0,(function*(){const t=e.bot_id.toPeerId(),i=new P.ZP({title:yield(0,Pe.Z)({peerId:t}),subtitle:[e.ip,e.region].join(" - "),clickable:!0,titleRight:(0,C.zM)(new Date(1e3*Math.max(e.date_active,e.date_created)))}),s=i.createMedia("big"),n=new o.Z;return n.classList.add("avatar-48"),yield n.updateWithOptions({peerId:t}),s.append(n),i.container.dataset.hash=""+e.hash,i.container.dataset.peerId=""+t,i.midtitle.textContent=[e.domain,e.browser,e.platform].filter(Boolean).join(", "),i}));{const e=new b.Z({caption:"ClearOtherWebSessionsHelp"}),t=(0,I.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllWebSessions"});(0,v.fc)(t,(()=>Ze(this,void 0,void 0,(function*(){yield(0,Ee.Z)({descriptionLangKey:"AreYouSureWebSessions",button:{langKey:"Disconnect",isDanger:!0}}),(0,G.Z)([t],!0),this.managers.appSeamlessLoginManager.resetWebAuthorizations().then((()=>{this.close()}))}))),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}{const i=new b.Z({name:"OtherWebSessions",caption:"TerminateWebSessionInfo"}),s=yield Promise.all(e.map(t));i.content.append(...s.map((e=>e.container)));let n=s.length;(0,v.fc)(i.content,(e=>Ze(this,void 0,void 0,(function*(){const t=(0,he.Z)(e.target,"row");if(!t)return;yield(0,Ee.Z)({descriptionLangKey:"TerminateWebSessionText",descriptionLangArgs:[yield(0,Pe.Z)({peerId:t.dataset.peerId.toPeerId()})],button:{langKey:"Disconnect",isDanger:!0}});const i=t.dataset.hash;t.classList.add("is-disabled"),this.managers.appSeamlessLoginManager.resetWebAuthorization(i).then((()=>{--n?t.remove():this.close()}))}))),{listenerSetter:this.listenerSetter}),this.scrollable.append(i.container)}}))}}class ke extends M.h{static getInitArgs(e){return{appConfig:e.managers.apiManager.getAppConfig(),globalPrivacy:e.managers.appPrivacyManager.getGlobalPrivacySettings(),contentSettings:e.managers.apiManager.invokeApi("account.getContentSettings"),webAuthorizations:e.managers.appSeamlessLoginManager.getWebAuthorizations()}}init(e){this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");const t="Loading",i=[];{const s=new b.Z({noDelimiter:!0,caption:"SessionsInfo"});let a;const o=new P.ZP({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(Se);e.peerIds=a,e.open()},listenerSetter:this.listenerSetter});let r;o.freezed=!0;const d={icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:t,clickable:e=>{let t;r.pFlags.has_password?t=this.slider.createTab(se):r.email_unconfirmed_pattern?(t=this.slider.createTab(V),t.email=r.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,this.managers.passwordManager.resendPasswordEmail()):t=this.slider.createTab(ne),t.state=r,t.open()},listenerSetter:this.listenerSetter},l=new P.ZP(d);l.freezed=!0;const c=this.activeSessionsRow=new P.ZP({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(ge);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.updateActiveSessions()}),{once:!0}),e.open()},listenerSetter:this.listenerSetter});c.freezed=!0;const h=this.websitesRow=new P.ZP({icon:"mention",titleLangKey:"OtherWebSessions",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(Te);e.eventListener.addEventListener("destroy",(()=>{this.updateActiveWebsites()})),e.open(this.websites)},listenerSetter:this.listenerSetter});h.freezed=!0,s.content.append(o.container,l.container,c.container,h.container),this.scrollable.append(s.container);const u=e=>{e?(0,Z.Z)(o.subtitle,(0,f.ag)("PrivacySettingsController.UserCount",[e])):(0,Z.Z)(o.subtitle,(0,f.ag)("BlockedEmpty",[e]))};this.listenerSetter.add(n.Z)("peer_block",(()=>{p()}));const p=()=>{this.managers.appUsersManager.getBlocked().then((e=>{o.freezed=!1,u(e.count),a=e.peerIds}))};p(),this.managers.passwordManager.getState().then((e=>{r=e,(0,Z.Z)(l.subtitle,(0,f.ag)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),l.freezed=!1})),this.updateActiveSessions(),i.push(this.updateActiveWebsites(e.webAuthorizations))}{const e=new b.Z({name:"PrivacyTitle",caption:"GroupsAndChannelsHelp"});e.content.classList.add("privacy-navigation-container");const i={},s=i.inputPrivacyKeyPhoneNumber=new P.ZP({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(R).open()},listenerSetter:this.listenerSetter}),a=i.inputPrivacyKeyStatusTimestamp=new P.ZP({titleLangKey:"LastSeenTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(ae).open()},listenerSetter:this.listenerSetter}),o=i.inputPrivacyKeyProfilePhoto=new P.ZP({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(oe).open()},listenerSetter:this.listenerSetter}),r=i.inputPrivacyKeyPhoneCall=new P.ZP({titleLangKey:"WhoCanCallMe",subtitleLangKey:t,clickable:()=>{this.slider.createTab(le).open()},listenerSetter:this.listenerSetter}),d=i.inputPrivacyKeyForwards=new P.ZP({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(re).open()},listenerSetter:this.listenerSetter}),l=i.inputPrivacyKeyChatInvite=new P.ZP({titleLangKey:"WhoCanAddMe",subtitleLangKey:t,clickable:()=>{this.slider.createTab(de).open()},listenerSetter:this.listenerSetter}),c=i.inputPrivacyKeyVoiceMessages=new P.ZP({titleLangKey:"PrivacyVoiceMessagesTitle",subtitleLangKey:t,clickable:()=>{n.Z.premium?this.slider.createTab(Me).open():(0,ee.bC)({langPackKey:"PrivacyVoiceMessagesPremiumOnly"})},listenerSetter:this.listenerSetter}),h=e=>{const t=i[e];t&&this.managers.appPrivacyManager.getPrivacy(e).then((e=>{const i=k(e),s=i.type===x.Everybody?"PrivacySettingsController.Everbody":i.type===x.Contacts?"PrivacySettingsController.MyContacts":"PrivacySettingsController.Nobody",n=i.disallowPeers.users.length+i.disallowPeers.chats.length,a=i.allowPeers.users.length+i.allowPeers.chats.length;t.subtitle.innerHTML="";const o=(0,f.ag)(s);t.subtitle.append(o),(n||a)&&t.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)}))};e.content.append(s.container,a.container,o.container,r.container,d.container,l.container,c.container),this.scrollable.append(e.container);for(const e in i)h(e);n.Z.addEventListener("privacy_update",(e=>{h(Le(e.key._))}))}{const t=new b.Z({name:"NewChatsFromNonContacts",caption:"ArchiveAndMuteInfo"}),s=new Ce.Z({text:"ArchiveAndMute"}),a=new P.ZP({checkboxField:s});let o,r;t.content.append(a.container),this.eventListener.addEventListener("destroy",(()=>{if(r=!0,void 0!==o&&o!==s.checked)return this.managers.appPrivacyManager.setGlobalPrivacySettings({_:"globalPrivacySettings",archive_and_mute_new_noncontact_peers:s.checked})}),{once:!0});const d=Promise.all([e.appConfig,e.globalPrivacy]).then((([e,i])=>{if(r)return;const a=i=>{t.container.classList.toggle("hide",!i&&!e.autoarchive_setting_available)};this.listenerSetter.add(n.Z)("premium_toggle",a),a(n.Z.premium),o=!!i.archive_and_mute_new_noncontact_peers,s.setValueSilently(o)}));i.push(d),this.scrollable.append(t.container)}{const t=new b.Z({name:"Privacy.SensitiveContent",caption:"PrivacyAndSecurity.SensitiveDesc"});t.container.classList.add("hide");const s=new Ce.Z({text:"PrivacyAndSecurity.SensitiveText"}),n=new P.ZP({checkboxField:s});let a;t.content.append(n.container),this.eventListener.addEventListener("destroy",(()=>{if(void 0===a)return;const e=n.checkboxField.checked;return e!==a?this.managers.apiManager.invokeApi("account.setContentSettings",{sensitive_enabled:e}):void 0}),{once:!0});const o=e.contentSettings.then((e=>{e.pFlags.sensitive_can_change&&(a=!!e.pFlags.sensitive_enabled,s.setValueSilently(a),t.container.classList.remove("hide"))}));i.push(o),this.scrollable.append(t.container)}{const e=new b.Z({name:"PrivacyPayments",caption:"PrivacyPaymentsClearInfo"}),t=()=>{const e={titleLangKey:"PrivacyPaymentsClearAlertTitle",descriptionLangKey:"PrivacyPaymentsClearAlertText",button:{langKey:"Clear"},checkboxes:[{text:"PrivacyClearShipping",checked:!0},{text:"PrivacyClearPayment",checked:!0}]};(0,Ee.Z)(e).then((()=>{const[t,s]=e.checkboxes.map((e=>e.checkboxField.checked)),n=(0,G.Z)([i],!0);this.managers.appPaymentsManager.clearSavedInfo(t,s).then((()=>{(t||s)&&(n(),(0,ee.bC)({langPackKey:t&&s?"PrivacyPaymentsPaymentShippingCleared":t?"PrivacyPaymentsShippingInfoCleared":"PrivacyPaymentsPaymentInfoCleared"}))}))}),Ie.Z)},i=(0,I.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyPaymentsClear"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}{const e=new b.Z({name:"FilterChats"}),t=()=>{new B.Z("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=(0,G.Z)([i],!0);this.managers.appDraftsManager.clearAllDrafts().then((()=>{e()}))},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},i=(0,I.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyDeleteCloudDrafts"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}return Promise.all(i)}updateActiveSessions(){return this.managers.apiManager.invokeApi("account.getAuthorizations").then((e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,(0,f.$d)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])}))}updateActiveWebsites(e=this.managers.appSeamlessLoginManager.getWebAuthorizations()){return e.then((e=>{this.websitesRow.freezed=!1,this.websites=e,(0,f.$d)(this.websitesRow.subtitle,"Privacy.Websites",[this.websites.length]),this.websitesRow.container.classList.toggle("hide",!this.websites.length)}))}}var xe=i(65),Ae=i(9439),_e=i(8938),Fe=i(2153),De=i(6787),Re=i(6761);var Be=i(3731),Ne=i(62);class Oe extends M.Z{init(){return this.setTitle("DoubleTapSetting"),this.container.classList.add("quick-reaction-container"),Promise.all([this.managers.appReactionsManager.getQuickReaction(),this.managers.appReactionsManager.getAvailableReactions()]).then((([e,t])=>{t=t.filter((e=>!e.pFlags.inactive));const i=new b.Z,s=t.map((t=>{const i=new A.Z({name:"quick-reaction",text:t.title,value:t.reaction,alignRight:!0}),s=new P.ZP({radioField:i,havePadding:!0});return i.main.classList.add("quick-reaction-title"),(0,Ne.Z)({row:s,doc:t.static_icon,size:"small"}),t.reaction===e.reaction&&i.setValueSilently(!0),s})),n=(0,P.De)(s,(e=>{this.managers.appReactionsManager.setDefaultReaction({_:"reactionEmoji",emoticon:e})}));i.content.append(n),this.scrollable.append(i.container)}))}}var Ue=i(1273),He=i(6714);class ze{constructor(e,t,i,s,n,a=!0){const o="range-setting-selector";this.container=document.createElement("div"),this.container.classList.add(o);const r=document.createElement("div");r.classList.add(o+"-details");const d=document.createElement("div");d.classList.add(o+"-name"),(0,f.$d)(d,e);const l=this.valueContainer=document.createElement("div");l.classList.add(o+"-value"),a&&(l.innerHTML=""+i),r.append(d,l),this.range=new xe.Z({step:t,min:s,max:n},i),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),a&&(l.innerText=""+e)}}),this.container.append(r,this.range.container)}}class je extends M.h{static getInitArgs(){return{accountThemes:n.Z.managers.apiManager.invokeApi("account.getThemes",{format:"android",hash:0}),allStickers:n.Z.managers.appStickersManager.getAllStickers(),quickReaction:n.Z.managers.appReactionsManager.getQuickReaction()}}init(e){this.container.classList.add("general-settings-container"),this.setTitle("General");const t=b.R.bind(null,this.scrollable),i=[];{const e=t("Settings"),i=new ze("TextSize",1,n.Z.settings.messagesTextSize,12,20);i.onChange=e=>{n.Z.managers.appStateManager.setByKey("settings.messagesTextSize",e)};const s=(0,I.Z)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"}),a=Ae.ZP.getInitArgs();(0,v.fc)(s,(()=>{this.slider.createTab(Ae.ZP).open(a)}));const o=new Ce.Z({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",listenerSetter:this.listenerSetter});e.append(i.container,s,(0,P.tG)(o).container)}{const e=t("General.Keyboard"),i=document.createElement("form"),s="send-shortcut",n="settings.sendShortcut",a=new P.ZP({radioField:new A.Z({langKey:"General.SendShortcut.Enter",name:s,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new P.ZP({radioField:new A.Z({name:s,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});(0,f.$d)(o.radioField.main,"General.SendShortcut.CtrlEnter",[z.IS_APPLE?"⌘":"Ctrl"]),i.append(a.container,o.container),e.append(i)}if(Be.Z){const e=t("DistanceUnitsTitle"),i=document.createElement("form"),s="distance-unit",n="settings.distanceUnit",a=new P.ZP({radioField:new A.Z({langKey:"DistanceUnitsKilometers",name:s,value:"kilometers",stateKey:n})}),o=new P.ZP({radioField:new A.Z({langKey:"DistanceUnitsMiles",name:s,value:"miles",stateKey:n})});i.append(a.container,o.container),e.append(i)}{const e=t("General.TimeFormat"),i=document.createElement("form"),s="time-format",n="settings.timeFormat",a=[["h12","General.TimeFormat.h12"],["h23","General.TimeFormat.h23"]],o=a.map((([e,t])=>new P.ZP({radioField:new A.Z({langKey:t,name:s,value:e,stateKey:n})}))),r=function(e,t=!0){return function(e,t,i=!0){const s=e;let n;return i||(e=Ie.Z),function i(){e(),n=Re.Z.setTimeout(i,t())}(),e=s,()=>{clearTimeout(n)}}(e,(()=>1e3*(60-(new Date).getSeconds())),t)}((()=>{const e=new Date;a.forEach((([t],i)=>{const s=e.toLocaleTimeString("en-us-u-hc-"+t,{hour:"2-digit",minute:"2-digit"});o[i].subtitle.textContent=s}))}));this.eventListener.addEventListener("destroy",r),i.append(...o.map((e=>e.container))),e.append(i)}{const e=t("Emoji"),i=new Ce.Z({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",listenerSetter:this.listenerSetter}),s=new Ce.Z({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",listenerSetter:this.listenerSetter});e.append((0,P.tG)(i).container,(0,P.tG)(s).container)}{const t=new b.Z({name:"Telegram.InstalledStickerPacksController",caption:"StickersBotInfo"}),s=new P.ZP({titleLangKey:"DoubleTapSetting",havePadding:!0,clickable:()=>{this.slider.createTab(Oe).open()},listenerSetter:this.listenerSetter}),a=()=>{e.quickReaction.then((e=>"availableReaction"===e._?e.static_icon:this.managers.appEmojiManager.getCustomEmojiDocument(e.document_id))).then((e=>{(0,Ne.Z)({row:s,doc:e,size:"small"})}))};a(),this.listenerSetter.add(n.Z)("quick_reaction",a);const o=new Ce.Z({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",listenerSetter:this.listenerSetter}),r=new Ce.Z({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",listenerSetter:this.listenerSetter}),d={},l=t.generateContentElement(),c=new Fe.Z,h=(e,t="append")=>{const i=new P.ZP({title:(0,Q.Z)(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new De.Z({id:e.id,access_hash:e.access_hash}).show()},listenerSetter:this.listenerSetter});d[e.id]=i;const s=document.createElement("div");s.classList.add("row-media"),(0,Ue.Z)({set:e,container:s,group:"GENERAL-SETTINGS",lazyLoadQueue:c,width:36,height:36,autoplay:!0,middleware:this.middlewareHelper.get()}),i.container.append(s),l[t](i.container)},u=e.allStickers.then((e=>{(0,_e.Z)(e);const t=e.sets.map((e=>h(e)));return Promise.all(t)}));i.push(u),this.listenerSetter.add(n.Z)("stickers_installed",(e=>{d[e.id]||h(e,"prepend")})),this.listenerSetter.add(n.Z)("stickers_deleted",(e=>{d[e.id]&&(d[e.id].container.remove(),delete d[e.id])})),t.content.append(s.container,(0,P.tG)(o).container,(0,P.tG)(r).container),this.scrollable.append(t.container)}return Promise.all(i)}}var Ge=i(2010),Ve=i(1447),Ke=i(534),We=i(4484),$e=i(1507),qe=i(2914),Qe=i(2648),Ye=i(1655),Xe=i(3186),Je=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class et extends l._{constructor(){super(...arguments),this.filtersRendered={}}static getInitArgs(){return{animationData:Ve.Z.loadAnimationFromURLManually("Folders_1"),filters:n.Z.managers.filtersStorage.getDialogFilters()}}renderFolder(e,t,i,s){return Je(this,void 0,void 0,(function*(){let n,a="";const o=[];if("dialogFilterSuggested"===e._)n=e.filter,a=e.description;else{if(n=e,1===Object.keys(n.pFlags).length){const e=n.pFlags;let t;e.contacts?t="FilterAllContacts":e.non_contacts?t="FilterAllNonContacts":e.groups?t="FilterAllGroups":e.broadcasts?t="FilterAllChannels":e.bots&&(t="FilterAllBots"),t&&o.push((0,f.ag)(t))}if(!o.length){const e=yield this.managers.dialogsStorage.getFolderDialogs(n.id);let t=0,i=0,s=0;yield Promise.all(e.map((e=>Je(this,void 0,void 0,(function*(){(yield this.managers.appPeersManager.isAnyGroup(e.peerId))?s++:(yield this.managers.appPeersManager.isBroadcast(e.peerId))?i++:t++}))))),t&&o.push((0,f.ag)("Chats",[t])),i&&o.push((0,f.ag)("Channels",[i])),s&&o.push((0,f.ag)("Groups",[s]))}}if(i)n.id!==$e.J$&&(0,Z.Z)(i.title,(0,Q.Z)(n.title)),i.subtitle.textContent="",i.subtitle.append(...(0,f.v_)(o));else if(i=new P.ZP({title:n.id===$e.J$?(0,f.ag)("FilterAllChats"):(0,Q.Z)(n.title),subtitle:a,clickable:!0,buttonRightLangKey:"dialogFilterSuggested"===e._?"Add":void 0}),o.length&&i.subtitle.append(...(0,f.v_)(o)),"dialogFilter"===e._){const e=n.id;if(!this.filtersRendered[n.id]&&n.id!==$e.J$){const t=Ke.Z.getInitArgs();(0,v.fc)(i.container,(()=>Je(this,void 0,void 0,(function*(){const i=yield this.managers.filtersStorage.getFilter(e),s=this.slider.createTab(Ke.Z);s.setInitFilter(i),s.open(t)}))),{listenerSetter:this.listenerSetter})}this.filtersRendered[n.id]=i,i.makeSortable()}const r=i.container;if(s){const e=n.localId;void 0!==e?(0,We.Z)(r,r.parentElement||t,e):t&&t.append(r)}return i}))}init(e=et.getInitArgs()){this.container.classList.add("chat-folders-container"),this.setTitle("ChatList.Filter.List.Title"),this.scrollable.container.classList.add("chat-folders"),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container");const t=document.createElement("div");t.classList.add("caption"),(0,f.XZ)({element:t,key:"ChatList.Filter.Header"}),this.createFolderBtn=(0,I.Z)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new b.Z({name:"Filters"}),this.foldersSection.container.classList.add("hide"),this.list=document.createElement("div"),this.foldersSection.content.append(this.list),this.suggestedSection=new b.Z({name:"FilterRecommended"}),this.suggestedSection.container.classList.add("hide"),this.scrollable.append(this.stickerContainer,t,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),(0,v.fc)(this.createFolderBtn,(()=>Je(this,void 0,void 0,(function*(){(yield this.canCreateFolder())?this.slider.createTab(Ke.Z).open():(0,Xe.Z)("folders")}))),{listenerSetter:this.listenerSetter});const i=()=>{this.foldersSection.container.classList.toggle("hide",!Object.keys(this.filtersRendered).length)},s=[],a=e.filters.then((e=>Je(this,void 0,void 0,(function*(){for(const t of e)t.id!==$e.Zi&&(yield this.renderFolder(t,this.list,void 0,!0));this.toggleAllChats(),i()}))));return s.push(a),this.listenerSetter.add(n.Z)("filter_update",(e=>Je(this,void 0,void 0,(function*(){const t=this.filtersRendered[e.id];t?yield this.renderFolder(e,null,t):e.id!==$e.Zi&&(yield this.renderFolder(e,this.list,void 0,!0)),i(),this.getSuggestedFilters()})))),this.listenerSetter.add(n.Z)("filter_delete",(e=>{const t=this.filtersRendered[e.id];t&&(this.getSuggestedFilters(),t.container.remove(),delete this.filtersRendered[e.id]),i()})),this.listenerSetter.add(n.Z)("filter_order",(e=>{e.filter((e=>!!this.filtersRendered[e])).forEach(((e,t)=>{const i=this.filtersRendered[e].container;(0,We.Z)(i,i.parentElement,t+1)}))})),this.listenerSetter.add(n.Z)("premium_toggle",(()=>{this.toggleAllChats()})),this.loadAnimationPromise=e.animationData.then((e=>Je(this,void 0,void 0,(function*(){const t=yield e({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86});return this.animation=t,Ve.Z.waitForFirstFrame(t)})))),s.push(this.loadAnimationPromise),new qe.Z({list:this.list,middleware:this.middlewareHelper.get(),onSort:(e,t)=>{let i=[];for(const e in this.filtersRendered){const t=this.filtersRendered[e];i[(0,Qe.Z)(t.container)]=+e}i=i.filter((e=>void 0!==e)),n.Z.premium||(0,Ye.Z)(i,$e.J$),this.managers.filtersStorage.updateDialogFiltersOrder(i)},scrollable:this.scrollable}),this.getSuggestedFilters(),Promise.all(s)}onOpenAfterTimeout(){return this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()})),super.onOpenAfterTimeout()}toggleAllChats(){this.filtersRendered[$e.J$].container.classList.toggle("hide",!n.Z.premium)}canCreateFolder(){return Je(this,void 0,void 0,(function*(){const[e,t]=yield Promise.all([this.managers.apiManager.getLimit("folders"),this.managers.filtersStorage.getDialogFilters()]);return t.filter((e=>!$e.DZ.has(e.id))).lengthJe(this,void 0,void 0,(function*(){this.suggestedSection.container.classList.toggle("hide",!e.length),Array.from(this.suggestedSection.content.children).slice(1).forEach((e=>e.remove()));for(const t of e){const e=yield this.renderFolder(t);this.suggestedSection.content.append(e.container);const i=e.buttonRight;(0,v.fc)(i,(s=>Je(this,void 0,void 0,(function*(){if((0,K.Z)(s),!(yield this.canCreateFolder()))return void(0,Xe.Z)("folders");i.setAttribute("disabled","true");const n=t.filter;n.includePeerIds=[],n.excludePeerIds=[],n.pinnedPeerIds=[],this.managers.filtersStorage.createDialogFilter(n,!0).then((()=>{e.container.remove(),this.suggestedSection.container.classList.toggle("hide",1===this.suggestedSection.content.childElementCount)})).finally((()=>{i.removeAttribute("disabled")}))}))),{listenerSetter:this.listenerSetter})}}))))}}var tt=i(8479),it=i(3855),st=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class nt extends M.h{init(){this.container.classList.add("notifications-container"),this.setTitle("Telegram.NotificationSettingsViewController");const e=e=>{const t=new b.Z({name:e.name}),i=new P.ZP({checkboxField:new Ce.Z({text:e.typeText,checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0}),s=new P.ZP({checkboxField:new Ce.Z({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0});t.content.append(i.container,s.container),this.scrollable.append(t.container);const a={_:e.inputKey},o=this.managers.appNotificationsManager.getNotifySettings(a);(o instanceof Promise?o:Promise.resolve(o)).then((t=>{const o=()=>st(this,void 0,void 0,(function*(){const e=yield this.managers.appNotificationsManager.isMuted(t);return i.checkboxField.checked=!e,s.checkboxField.checked=t.show_previews,e}));o(),this.eventListener.addEventListener("destroy",(()=>st(this,void 0,void 0,(function*(){const e=!i.checkboxField.checked,n=s.checkboxField.checked;if(e===(yield this.managers.appNotificationsManager.isMuted(t))&&n===t.show_previews)return;const o=(0,tt.Z)(t);o._="inputPeerNotifySettings",o.mute_until=e?$e.rU:0,o.show_previews=n,delete o.flags,this.managers.appNotificationsManager.updateNotifySettings(a,o)}))),{once:!0}),this.listenerSetter.add(n.Z)("notify_settings",(i=>{const s=Le(i.peer._);e.inputKey===s&&(t=i.notify_settings,o())}))}))};e({name:"NotificationsPrivateChats",typeText:"NotificationsForPrivateChats",inputKey:"inputNotifyUsers"}),e({name:"NotificationsGroups",typeText:"NotificationsForGroups",inputKey:"inputNotifyChats"}),e({name:"NotificationsChannels",typeText:"NotificationsForChannels",inputKey:"inputNotifyBroadcasts"});{const e=new b.Z({name:"NotificationsOther"}),t=new P.ZP({checkboxField:new Ce.Z({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0}),i=new P.ZP({checkboxField:new Ce.Z({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound",listenerSetter:this.listenerSetter}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0});it.Z.getState().then((e=>{i.checkboxField.checked=e.settings.notifications.sound})),e.content.append(t.container,i.container),this.scrollable.append(e.container),this.managers.appNotificationsManager.getContactSignUpNotification().then((e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",(()=>{const i=t.checkboxField.checked;e!==i&&this.managers.appNotificationsManager.setContactSignUpNotification(!i)}),{once:!0})}))}}}class at extends l._{static getInitArgs(){return{languages1:n.Z.managers.apiManager.invokeApiCacheable("langpack.getLanguages",{lang_pack:"web"}),languages2:Promise.resolve([])}}init(e){this.header.classList.add("with-border"),this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const t=new b.Z({}),i=new Map,s=Promise.all([e.languages1,e.languages2]).then((([e,s])=>{const n=new Set,a=e.map((e=>e.lang_code)),o=(0,T.a)();e.concat(s).forEach((e=>{if(n.has(e.lang_code))return;n.add(e.lang_code);const t=new P.ZP({radioField:new A.Z({text:e.name,name:o,value:e.lang_code}),subtitle:e.native_name});i.set(e.lang_code,t)}));const r=(0,P.De)([...i.values()],(e=>{f.ZP.getLangPack(e,a.includes(e))}));f.ZP.getCacheLangPack().then((e=>{const t=i.get(e.lang_code);t?t.radioField.setValueSilently(!0):console.error("no row",t,e)})),t.content.append(r)}));return this.scrollable.append(t.container),s}}var ot=i(236),rt=i(4081),dt=i(6848),lt=i(5701);function ct(e,t,i){const s=new b.Z({name:t}),n="settings.autoDownload."+e+".",a=new Ce.Z({text:"AutodownloadContacts",name:"contacts",stateKey:n+"contacts",listenerSetter:i}),o=new Ce.Z({text:"AutodownloadPrivateChats",name:"private",stateKey:n+"private",listenerSetter:i}),r=new Ce.Z({text:"AutodownloadGroupChats",name:"groups",stateKey:n+"groups",listenerSetter:i}),d=new Ce.Z({text:"AutodownloadChannels",name:"channels",stateKey:n+"channels",listenerSetter:i});return s.content.append((0,P.tG)(a).container,(0,P.tG)(o).container,(0,P.tG)(r).container,(0,P.tG)(d).container),s}class ht extends M.h{init(){this.setTitle("AutoDownloadPhotos");const e=ct("photo","AutoDownloadPhotosTitle",this.listenerSetter);this.scrollable.append(e.container)}}class ut extends M.h{init(){this.setTitle("AutoDownloadFiles");const e=(0,lt.Z)((e=>{this.managers.appStateManager.setByKey("settings.autoDownloadNew.file_size_max",e)}),200,!1,!0),t=ct("file","AutoDownloadFilesTitle",this.listenerSetter),i=524288,s=20447232,a=n.Z.settings.autoDownloadNew.file_size_max,o=Math.sqrt(Math.sqrt((a-i)/s)),r=new f.ZP.IntlElement({key:"AutodownloadSizeLimitUpTo",args:[(0,rt.Z)(a)]}),d=new ze("AutoDownloadMaxFileSize",.01,o,0,1,!1);d.onChange=t=>{const n=Math.pow(t,4)*s+i|0;r.compareAndUpdate({args:[(0,rt.Z)(n)]}),e(n)},d.valueContainer.append(r.element),t.content.append(d.container),this.scrollable.append(t.container)}}class pt extends M.h{init(){this.setTitle("AutoDownloadVideos");const e=ct("video","AutoDownloadVideosTitle",this.listenerSetter);this.scrollable.append(e.container)}}const ft={contacts:"AutoDownloadContacts",private:"AutoDownloadPm",groups:"AutoDownloadGroups",channels:"AutoDownloadChannels"};class mt extends M.h{init(){return e=this,t=void 0,s=function*(){this.setTitle("DataSettings");{const e=new b.Z({name:"AutomaticMediaDownload",caption:"AutoDownloadAudioInfo"}),t=yield it.Z.getState(),i=new Ce.Z({text:"AutoDownloadMedia",name:"auto",checked:!t.settings.autoDownloadNew.pFlags.disabled,listenerSetter:this.listenerSetter}),s=new P.ZP({checkboxField:i,listenerSetter:this.listenerSetter}),a=()=>{(0,G.Z)([h],(0,dt.Z)(t.settings.autoDownload,ot.h.settings.autoDownload)&&(0,dt.Z)(t.settings.autoDownloadNew,ot.h.settings.autoDownloadNew))},o=()=>{this.setAutoDownloadSubtitle(d,t.settings.autoDownload.photo),this.setAutoDownloadSubtitle(l,t.settings.autoDownload.video),this.setAutoDownloadSubtitle(c,t.settings.autoDownload.file,t.settings.autoDownloadNew.file_size_max)},r=e=>{const t=this.slider.createTab(e);t.open(),this.listenerSetter.add(t.eventListener)("destroy",(()=>{o(),a()}),{once:!0})},d=new P.ZP({titleLangKey:"AutoDownloadPhotos",subtitle:"",clickable:()=>{r(ht)},listenerSetter:this.listenerSetter}),l=new P.ZP({titleLangKey:"AutoDownloadVideos",subtitle:"",clickable:()=>{r(pt)},listenerSetter:this.listenerSetter}),c=new P.ZP({titleLangKey:"AutoDownloadFiles",subtitle:"",clickable:()=>{r(ut)},listenerSetter:this.listenerSetter}),h=(0,I.Z)("btn-primary btn-transparent primary",{icon:"delete",text:"ResetAutomaticMediaDownload"});(0,v.fc)(h,(()=>{(0,Ee.Z)({titleLangKey:"ResetAutomaticMediaDownloadAlertTitle",descriptionLangKey:"ResetAutomaticMediaDownloadAlert",button:{langKey:"Reset"}}).then((()=>{const e=n.Z.settings;e.autoDownloadNew=(0,tt.Z)(ot.h.settings.autoDownloadNew),e.autoDownload=(0,tt.Z)(ot.h.settings.autoDownload),t.settings=e,this.managers.appStateManager.setByKey("settings",e),o(),i.checked=!t.settings.autoDownloadNew.pFlags.disabled}))}));const u=()=>{const e=!i.checked,t=n.Z.settings;e?t.autoDownloadNew.pFlags.disabled=!0:delete t.autoDownloadNew.pFlags.disabled,[d,l,c].forEach((t=>{t.container.classList.toggle("is-disabled",e)})),this.managers.appStateManager.setByKey("settings",t),a()};i.input.addEventListener("change",u),u(),o(),e.content.append(s.container,d.container,l.container,c.container,h),this.scrollable.append(e.container)}{const e=new b.Z({name:"AutoplayMedia"});e.content.append(new P.ZP({checkboxField:new Ce.Z({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",listenerSetter:this.listenerSetter}),listenerSetter:this.listenerSetter}).container,new P.ZP({checkboxField:new Ce.Z({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",listenerSetter:this.listenerSetter}),listenerSetter:this.listenerSetter}).container),this.scrollable.append(e.container)}},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}setAutoDownloadSubtitle(e,t,i){let s;const n=[],a=Object.keys(t),o=a.map((e=>t[e]?ft[e]:void 0)).filter(Boolean);if(o.length&&0!==i){const e=o.length===a.length;if(void 0!==i?(s=e?"AutoDownloadUpToOnAllChats":"AutoDownloadOnUpToFor",n.push((0,rt.Z)(i))):s=e?"AutoDownloadOnAllChats":"AutoDownloadOnFor",!e){const e=document.createElement("span");e.append(...(0,f.v_)(o.map((e=>(0,f.ag)(e))),!0,!1)),n.push(e)}}else s="AutoDownloadOff";(0,Z.Z)(e.subtitle,(0,f.ag)(s,n))}}var gt=i(2230),vt=i(8261),bt=i(6765),yt=i(1168),wt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class St extends l._{constructor(){super(...arguments),this.buttons={}}init(){return wt(this,void 0,void 0,(function*(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=(0,E.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new B.Z("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{this.managers.apiManager.logOut()},isDanger:!0}]}).show()}}]});this.buttons.edit=(0,gt.Z)("edit"),this.header.append(this.buttons.edit,e),this.profile=new vt.Z(this.managers,this.scrollable,this.listenerSetter,!1),this.profile.init(),this.profile.setPeer(n.Z.myId);const t=this.profile.fillProfileElements(),i=(0,I.Z)("btn-circle btn-corner z-depth-1 profile-change-avatar",{icon:"cameraadd"});(0,v.fc)(i,(()=>{const e=document.createElement("canvas");yt.Z.createPopup(bt.Z).open(e,(e=>{e().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))}))}),{listenerSetter:this.listenerSetter}),this.profile.element.lastElementChild.firstElementChild.append(i);const s=()=>wt(this,void 0,void 0,(function*(){var e;const t=yield this.managers.appUsersManager.getSelf();i.classList.toggle("hide","userProfilePhoto"!==(null===(e=t.photo)||void 0===e?void 0:e._))}));s(),this.listenerSetter.add(n.Z)("avatar_update",(({peerId:e})=>{n.Z.myId===e&&s()}));const a=document.createElement("div");a.classList.add("profile-buttons");const o=(e,t,i,s)=>{if(!s){const e=i.getInitArgs;e&&(s=()=>[e(this)])}return{icon:e,text:t,tabConstructor:i,getInitArgs:s,args:null==s?void 0:s()}},r=[o("unmute","AccountSettings.Notifications",nt),o("data","DataSettings",mt),o("lock","AccountSettings.PrivacyAndSecurity",ke),o("settings","Telegram.GeneralSettingsViewController",je),o("folder","AccountSettings.Filters",et)].map((e=>{const{icon:t,text:i,tabConstructor:s,getInitArgs:n}=e;return new P.ZP({titleLangKey:i,icon:t,clickable:()=>wt(this,void 0,void 0,(function*(){const t=e.args?yield e.args:[],i=this.slider.createTab(s);i.open(...t),i instanceof M.h&&n&&i.eventListener.addEventListener("destroyAfter",(t=>{e.args=t.then((()=>n()))}))})),listenerSetter:this.listenerSetter})})),d=at.getInitArgs();r.push(this.devicesRow=new P.ZP({titleLangKey:"Devices",titleRightSecondary:" ",icon:"activesessions",clickable:()=>wt(this,void 0,void 0,(function*(){this.authorizations||(yield this.updateActiveSessions());const e=this.slider.createTab(ge);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.authorizations=void 0,this.updateActiveSessions(!0)}),{once:!0}),e.open()})),listenerSetter:this.listenerSetter}),this.languageRow=new P.ZP({titleLangKey:"AccountSettings.Language",titleRightSecondary:(0,f.ag)("LanguageName"),icon:"language",clickable:()=>{this.slider.createTab(at).open(d)},listenerSetter:this.listenerSetter})),a.append(...r.map((e=>e.container)));const l=new b.Z;l.content.append(a),this.scrollable.append(this.profile.element,l.container);const c=()=>{h=Ge.Z.getInitArgs()};let h;(0,v.fc)(this.buttons.edit,(()=>{this.slider.createTab(Ge.Z).open(h)}),{listenerSetter:this.listenerSetter}),c(),this.listenerSetter.add(n.Z)("user_update",(e=>{n.Z.myId.toUserId()===e&&c()})),Ve.Z.loadLottieWorkers(),this.updateActiveSessions(),(yield t)()}))}getAuthorizations(e){if(this.getAuthorizationsPromise&&!e)return this.getAuthorizationsPromise;const t=this.getAuthorizationsPromise=this.managers.apiManager.invokeApi("account.getAuthorizations").finally((()=>{this.getAuthorizationsPromise===t&&(this.getAuthorizationsPromise=void 0)}));return t}updateActiveSessions(e){return this.getAuthorizations(e).then((e=>{this.authorizations=e.authorizations,this.devicesRow.titleRight.textContent=""+this.authorizations.length}))}onCloseAfterTimeout(){return this.profile.destroy(),super.onCloseAfterTimeout()}}class Ct extends l._{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new p.Z((e=>{this.uploadAvatar=e}));const e=new b.Z({caption:"Channel.DescriptionHolderDescrpiton"}),t=document.createElement("div");t.classList.add("input-wrapper"),this.channelNameInputField=new u.ZP({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new u.ZP({label:"DescriptionOptionalPlaceholder",maxLength:255}),t.append(this.channelNameInputField.container,this.channelDescriptionInputField.container);const i=()=>{this.nextBtn.classList.toggle("is-visible",!!this.channelNameInputField.value.length&&!this.channelNameInputField.input.classList.contains("error")&&!this.channelDescriptionInputField.input.classList.contains("error"))};this.channelNameInputField.input.addEventListener("input",i),this.channelDescriptionInputField.input.addEventListener("input",i),this.nextBtn=(0,m.Z)({icon:"arrow_next"}),(0,v.fc)(this.nextBtn,(()=>{const e=this.channelNameInputField.value,t=this.channelDescriptionInputField.value;this.nextBtn.disabled=!0,this.managers.appChatsManager.createChannel({title:e,about:t,broadcast:!0}).then((e=>{this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),s.ZP.setInnerPeer({peerId:e.toPeerId(!0)}),Kt.removeTabFromHistory(this),this.slider.createTab(_.Z).open({type:"channel",skippable:!0,title:"GroupAddMembers",placeholder:"SendMessageTo",takeOut:t=>this.managers.appChatsManager.inviteToChannel(e,t)})}))}),{listenerSetter:this.listenerSetter}),this.content.append(this.nextBtn),e.content.append(this.avatarEdit.container,t),this.scrollable.append(e.container)}onCloseAfterTimeout(){return this.avatarEdit.clear(),this.uploadAvatar=null,this.channelNameInputField.value="",this.channelDescriptionInputField.value="",this.nextBtn.disabled=!1,super.onCloseAfterTimeout()}}var Lt=i(241),Et=i(2621),It=i(709),Mt=i(6272);class Pt extends yt.Z{constructor(){super("popup-create-contact popup-send-photo popup-new-media",{closable:!0,withConfirm:"Add",title:"AddContactTitle"}),this.construct()}construct(){return e=this,t=void 0,s=function*(){(0,v.fc)(this.btnConfirm,(()=>{const e=this.managers.appUsersManager.importContact(i.value,s.value,n.value);e.then((()=>{this.hide()}),(e=>{"NO_USER"===e.type&&((0,ee.bC)({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),d.disabled=!1)})),d.lockWithPromise(e)}),{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const i=new u.ZP({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),s=new u.ZP({label:"LastName",name:"create-contact-lastname",maxLength:70}),n=new It.Z({required:!0});e.push(i,s,n);const a=()=>{const e=i.value+" "+s.value;d.avatarElem.peerTitle=e,d.avatarElem.update()};this.listenerSetter.add(i.input)("input",a),this.listenerSetter.add(s.input)("input",a),n.validate=()=>!!n.value.match(/\d/);const o=yield this.managers.appUsersManager.getSelf(),r=(0,Mt.u)(o.phone);r.code&&(n.value="+"+r.code.country_code);const d=new Et.Z({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(i.container,s.container,d.avatarElem),this.container.append(t,n.container),this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var Zt=i(2894),Tt=i(3624);class kt extends l._{init(){this.container.id="contacts-container";const e=(0,m.Z)({icon:"add",className:"is-visible"});this.content.append(e),(0,v.fc)(e,(()=>{yt.Z.createPopup(Pt)}),{listenerSetter:this.listenerSetter}),this.inputSearch=new d.Z("Search",(e=>{this.openContacts(e)})),this.listenerSetter.add(n.Z)("contacts_update",(e=>{return t=this,i=void 0,n=function*(){const t=yield this.managers.appUsersManager.isContact(e),i=e.toPeerId();t?this.sortedUserList.add(i):this.sortedUserList.delete(i)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n})),this.title.replaceWith(this.inputSearch.container),this.middleware=(0,Tt.k)(),this.openContacts()}createList(){const e=new Zt.Z({managers:this.managers}),t=e.list;return t.id="contacts",t.classList.add("contacts-container"),h.default.setListClickListener(t,(()=>{this.close()}),void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!z.IS_MOBILE&&j(!0)&&this.inputSearch.input.focus()}openContacts(e){this.middleware.clean();const t=this.middleware.get();this.scrollable.onScrolledBottom=null,this.scrollable.container.textContent="",this.managers.appUsersManager.getContactsPeerIds(e,void 0,"online").then((e=>{if(!t())return;const i=this.sortedUserList=this.createList();let s=()=>{const t=Lt.Z.height/56*1.25|0;e.splice(0,t).forEach((e=>{i.add(e)})),e.length||(s=void 0,this.scrollable.onScrolledBottom=null)};s(),this.scrollable.onScrolledBottom=()=>{s?s():this.scrollable.onScrolledBottom=null},(0,Z.Z)(this.scrollable.container,i.list)}))}}class xt extends l._{init(){if(this.wasFilterId=h.default.filterId,this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),this.header.classList.add("can-have-forum"),this.content.classList.add("can-have-forum"),!h.default.xds[xt.filterId]){const{ul:e,scrollable:t}=h.default.l({title:void 0,id:xt.filterId,localId:$e.Zi});t.container.append(e)}const e=h.default.xds[xt.filterId].scrollable;return this.scrollable.container.replaceWith(e.container),e.attachBorderListeners(this.container),h.default.setFilterIdAndChangeTab(xt.filterId).then((({cached:e,renderPromise:t})=>{if(e)return t}))}onOpenAfterTimeout(){h.default.xds[this.wasFilterId].clear()}onClose(){this.scrollable.onAdditionalScroll=void 0,h.default.setFilterIdAndChangeTab(this.wasFilterId)}onCloseAfterTimeout(){return h.default.xds[xt.filterId].clear(),super.onCloseAfterTimeout()}}xt.filterId=$e.Zi;class At extends l._{constructor(){super(...arguments),this.isLocationWatched=!1}parseDistance(e){return"miles"===n.Z.settings.distanceUnit?e>1609.34?(0,f.ag)("MilesAway",[Math.round(e/1609)]):(0,f.ag)("FootsAway",[Math.round(3.281*e)]):e>=1e3?(0,f.ag)("KMetersAway2",[e/1e3]):(0,f.ag)("MetersAway2",[e])}startWatching(){this.latestLocationSaved&&!this.isLocationWatched&&(this.isLocationWatched=!0,(0,ee.Am)("Your position is now being shared. Do not close the page or it will be suspended."),this.managers.appUsersManager.getLocated(this.latestLocationSaved.latitude,this.latestLocationSaved.longitude,this.latestLocationSaved.accuracy,!0,2147483647),navigator.geolocation.watchPosition((e=>{const t=e.coords.longitude!==this.latestLocationSaved.longitude,i=e.coords.latitude!==this.latestLocationSaved.latitude,s=this.calculateDistance(e.coords.latitude,e.coords.longitude,this.latestLocationSaved.latitude,this.latestLocationSaved.longitude)>100;(i||t)&&s&&(this.managers.appUsersManager.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy,!0,2147483647),this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy})})))}stopWatching(){this.isLocationWatched&&(this.isLocationWatched=!1,(0,ee.Am)("The sharing of your position has been stopped. You will no longer be visible to other users."),this.managers.appUsersManager.getLocated(0,0,0,!1,0))}calculateDistance(e,t,i,s){const n=.017453292519943295;return 12742*Math.asin(Math.sqrt(.5-Math.cos((i-e)*n)+Math.cos(e*n)*Math.cos(i*n)*(1-Math.cos((s-t)*n)/2)))}}var _t=i(6385),Ft=i(8842),Dt=i(4159),Rt=i(7487),Bt=i(1405),Nt=i(2559),Ot=i(4755),Ut=i(3035),Ht=i(6472),zt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const jt="is-left-column-shown";class Gt extends l.Z{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={}}construct(e){this.managers=e,this.inputSearch=new d.Z("Search");const t=this.sidebarEl.querySelector(".item-main .sidebar-header");t.append(this.inputSearch.container);const i=()=>{this.createTab(kt).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const a={icon:"archive",text:"ArchivedChats",onClick:()=>{this.createTab(xt).open()},verify:()=>zt(this,void 0,void 0,(function*(){return!!(yield this.managers.dialogsStorage.getFolderDialogs($e.Zi,!1)).length||!(yield this.managers.dialogsStorage.isDialogsLoaded($e.Zi))}))},o=new Ce.Z({toggle:!0,checked:"night"===He.Z.getTheme().name});o.input.addEventListener("change",(()=>zt(this,void 0,void 0,(function*(){yield this.managers.appStateManager.setByKey("settings.theme",o.input.checked?"night":"day"),n.Z.dispatchEvent("theme_change")})))),n.Z.addEventListener("theme_change",(()=>{o.setValueSilently("night"===He.Z.getTheme().name)}));const r=[{icon:"savedmessages",text:"SavedMessages",onClick:()=>{setTimeout((()=>{s.ZP.setPeer({peerId:s.ZP.myId})}),0)}},a,{icon:"user",text:"Contacts",onClick:i},Be.Z?{icon:"group",text:"PeopleNearby",onClick:()=>{this.createTab(At).open()}}:void 0,{icon:"settings",text:"Settings",onClick:()=>{this.createTab(St).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:o},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new Ce.Z({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{const e=f.ZP.format("TelegramFeaturesUrl",!0);s.ZP.openUrl(e)}},{icon:"bug",text:"ReportBug",onClick:()=>{const e=document.createElement("a");e.target="_blank",e.href="https://bugs.telegram.org/?tag_ids=40&sort=time",document.body.append(e),e.click(),setTimeout((()=>{e.remove()}),0)}},{icon:"char z",text:"ChatList.Menu.SwitchTo.Z",onClick:()=>{Promise.all([Rt.Z.set({kz_version:"Z"}),Rt.Z.delete("tgme_sync")]).then((()=>{location.href="https://web.telegram.org/z/"}))},verify:()=>Dt.Z.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{Rt.Z.delete("tgme_sync").then((()=>{location.href="https://web.telegram.org/?legacy=1"}))},verify:()=>Dt.Z.isMainDomain},{icon:"download",text:"PWA.Install",onClick:()=>{const e=(0,Ht.B)();null==e||e()},verify:()=>!!(0,Ht.B)()}].filter(Boolean);this.toolsBtn=(0,E.Z)({direction:"bottom-right",buttons:r,onOpen:(e,t)=>{var i;const s=document.createElement("a");s.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",s.target="_blank",s.rel="noopener noreferrer",s.classList.add("btn-menu-footer"),s.addEventListener(v.pf,(e=>{e.stopPropagation(),me.Z.close()}));const n=document.createElement("span");n.classList.add("btn-menu-footer-text"),n.innerHTML="Telegram Web"+Dt.Z.suffix+" "+Dt.Z.versionFull,s.append(n),t.classList.add("has-footer"),t.append(s),null===(i=a.element)||void 0===i||i.append(this.archivedCount)}}),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn),this.newBtnMenu=(0,E.Z)({direction:"top-left",buttons:[{icon:"newchannel",text:"NewChannel",onClick:()=>{this.createTab(Ct).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{this.createTab(_.Z).open({type:"chat",skippable:!1,takeOut:e=>this.createTab(y).open(e),title:"GroupAddMembers",placeholder:"SendMessageTo"})}},{icon:"newprivate",text:"NewPrivateChat",onClick:i}]}),this.newBtnMenu.className="btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon",this.newBtnMenu.insertAdjacentHTML("afterbegin",'\n \n \n '),this.newBtnMenu.id="new-menu",t.nextElementSibling.append(this.newBtnMenu),this.updateBtn=document.createElement("div"),this.updateBtn.className="btn-circle rp btn-corner z-depth-1 btn-update is-hidden",(0,Bt.Z)(this.updateBtn),this.updateBtn.append((0,f.ag)("Update")),(0,v.fc)(this.updateBtn,(()=>{this.updateBtn.classList.contains("is-hidden")||location.reload()})),t.nextElementSibling.append(this.updateBtn),this.inputSearch.input.addEventListener("focus",(()=>this.initSearch()),{once:!0}),this.archivedCount=document.createElement("span"),this.archivedCount.className="archived-count badge badge-24 badge-gray",n.Z.addEventListener("folder_unread",(e=>{if(e.id===$e.Zi){const t=e.unreadPeerIds.size;this.archivedCount.textContent=""+(0,Nt.Z)(t,1),this.archivedCount.classList.toggle("hide",!t)}})),this.managers.appUsersManager.getTopPeers("correspondents");const l={type:"global-search-focus",onPop:()=>(setTimeout((()=>{this.inputSearch.input.focus()}),0),!1),noHistory:!0};_t.Z.pushItem(l),it.Z.getState().then((()=>{const e=setInterval((()=>{fetch("version",{cache:"no-cache"}).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((t=>{t!==Dt.Z.versionFull&&(this.hasUpdate=!0,clearInterval(e),this.newBtnMenu.classList.contains("is-hidden")||this.updateBtn.classList.remove("is-hidden"))})).catch(Ie.Z)}),18e5)}));const c=()=>{const e=this.rect=this.tabsContainer.getBoundingClientRect();document.documentElement.style.setProperty("--left-column-width",e.width+"px")};(0,Ut.T2)(c),Ot.Z.addEventListener("resize",c)}initSearch(){const e=this.sidebarEl.querySelector("#search-container"),t=new r.ZP(e),i=()=>{(0,v.tH)(this.backBtn)};this.searchGroups={contacts:new a.z("SearchAllChatsShort","contacts",void 0,void 0,void 0,void 0,i),globalContacts:new a.z("GlobalSearch","contacts",void 0,void 0,void 0,void 0,i),messages:new a.z("SearchMessages","messages"),people:new a.z(!1,"contacts",!0,"search-group-people",!0,!1,i,!0),recent:new a.z("Recent","contacts",!0,"search-group-recent",!0,!0,i)};const s=this.searchSuper=new S.Z({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"FilterChats",type:"chats"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:t,searchGroups:this.searchGroups,asChatList:!0,hideEmptyTabs:!1,showSender:!0,managers:this.managers});e.prepend(s.nav.parentElement.parentElement),t.container.append(s.container),s.setQuery({peerId:"".toPeerId(),folderId:0}),s.selectTab(0),s.load(!0);const n=[];let d="".toPeerId(),l=0,u=0;const p=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===n.length),this.inputSearch.container.classList.toggle("is-picked",!!n.length),n.length?this.inputSearch.input.style.setProperty("--paddingLeft",n[n.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},f=document.createElement("div");f.classList.add("search-helper"),f.addEventListener("click",(e=>{const t=(0,he.Z)(e.target,"selector-user");if(!t)return;const i=t.dataset.key;if(0===i.indexOf("date_")){const[e,t,s]=i.split("_");l=+t,u=+s}else d=i.toPeerId();t.addEventListener("click",(()=>{g(t)})),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),n.push(t),p()})),s.nav.parentElement.append(f);const m=(e,t)=>{const i=document.createElement("div");i.classList.add("selector-user");const s=new o.Z;return s.classList.add("selector-user-avatar","tgico","avatar-32"),s.isDialog=!0,i.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new Ft.Z({peerId:e.toPeerId()}).element),s.updateWithOptions({peerId:e})):s.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?i.innerHTML=t:((0,Z.Z)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",s),i},g=e=>{0===e.dataset.key.indexOf("date_")?l=u=0:d="".toPeerId(),e.remove(),(0,Ye.Z)(n,e),setTimeout((()=>{p(),this.inputSearch.onChange(this.inputSearch.value)}),0)};this.inputSearch.onClear=()=>{n.forEach((e=>{g(e)}))},this.inputSearch.onChange=e=>{if(s.cleanupHTML(),s.setQuery({peerId:d,folderId:d?void 0:0,query:e,minDate:l,maxDate:u}),s.load(!0),f.innerHTML="",s.nav.classList.remove("hide"),!d&&e.trim()){const t=s.middleware.get();Promise.all([this.managers.dialogsStorage.getDialogs({query:e}).then((({dialogs:e})=>e.map((e=>e.peerId)))),this.managers.appUsersManager.getContactsPeerIds(e,!0)]).then((e=>{t()&&(new Set(e[0].concat(e[1])).forEach((e=>{f.append(m(e))})),s.nav.classList.toggle("hide",!!f.innerHTML))}))}if(!l&&e.trim()){const t=[];(0,C.fl)(e,t),t.forEach((e=>{f.append(m("date_"+e.minDate+"_"+e.maxDate,e.title))})),s.nav.classList.toggle("hide",!!f.innerHTML)}},s.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",(e=>{const t=(0,be.Z)(e.target,h.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=(0,he.Z)(t,"search-group");if(!i||i.classList.contains("search-group-recent")||i.classList.contains("search-group-people"))return;const s=t.getAttribute("data-peer-id").toPeerId();this.managers.appUsersManager.pushRecentSearch(s)}),{capture:!0});const b=document.createElement("div");b.classList.add("search-group-scrollable"),b.append(this.searchGroups.people.list),this.searchGroups.people.container.append(b),new r.v7(b);let y,w=!0;const L=(0,c.Z)({content:e.parentElement,type:"zoom-fade",transitionTime:150,onTransitionEnd:e=>{y&&clearTimeout(y),0!==e||w||(s.selectTab(0,!1),this.inputSearch.onClearClick(),y=window.setTimeout((()=>{y=0,this.newBtnMenu.classList.remove("is-hidden"),this.hasUpdate&&this.updateBtn.classList.remove("is-hidden")}),150)),w=!1}});L(0);const E="is-visible",I=()=>{this.toolsBtn.classList.remove(E),this.backBtn.classList.add(E),this.newBtnMenu.classList.add("is-hidden"),this.updateBtn.classList.add("is-hidden"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!0);const e="global-search";z.IS_MOBILE_SAFARI||_t.Z.findItemByType(e)||_t.Z.pushItem({onPop:()=>{i()},type:e}),L(1)};this.inputSearch.input.addEventListener("focus",I),I(),(0,v.fc)(this.backBtn,(e=>{this.toolsBtn.classList.add(E),this.backBtn.classList.remove(E),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),_t.Z.removeByType("global-search"),L(0)}));const M=(0,gt.Z)("close");this.searchGroups.recent.nameEl.append(M),M.addEventListener("click",(()=>{(0,Ee.Z)({descriptionLangKey:"Search.Confirm.ClearHistory",button:{langKey:"ClearButton",isDanger:!0}}).then((()=>this.managers.appUsersManager.clearRecentSearch().then((()=>{this.searchGroups.recent.clear()}))))}))}}const Vt=new Gt;L.GO.appSidebarLeft=Vt;const Kt=Vt},5670:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(3552),n=i(5644),a=i(279),o=i(8119);class r extends s._{init(e){this.container.classList.add("add-members-container"),this.nextBtn=(0,o.Z)({icon:"arrow_next"}),this.content.append(this.nextBtn),this.scrollable.container.remove(),this.nextBtn.addEventListener("click",(()=>{const e=this.selector.getSelected().map((e=>e.toPeerId())),t=this.takeOut(e);this.skippable?this.close():t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()})),this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const t="privacy"===this.peerType;this.selector=new n.Z({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[t?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:t,filterPeerTypeBy:t?["isAnyGroup","isUser"]:void 0,managers:this.managers,design:"square"}),e.selectedPeerIds&&this.selector.addInitial(e.selectedPeerIds),this.nextBtn.classList.add("tgico-arrow_next"),this.nextBtn.innerHTML="",this.nextBtn.disabled=!1,this.nextBtn.classList.toggle("is-visible",this.skippable)}attachToPromise(e){const t=(0,a.p)(this.nextBtn,"arrow_next");e.then((()=>{this.close()}),(()=>{t()}))}}},9439:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>O,EM:()=>N});var s=i(6740);function n(e){const t=e.getContext("2d"),i=new Array(4).fill(0),s=t.getImageData(0,0,e.width,e.height).data,n=s.length/4;for(let e=0;e0&&(i=Math.min(100,i+5+.1*(100-i))),s=Math.max(0,.65*s),`hsla(${t}, ${i}%, ${s}%, .4)`}var h=i(8479),u=i(9674),p=i(1571),f=i(2312),m=i(4271),g=i(3512),v=i(4494),b=i(9807),y=i(3442),w=i(3552),S=i(6724),C=i(6714),L=i(5077),E=i(3228),I=i(503);class M{constructor(){this.hue=0,this.saturation=100,this.lightness=50,this.alpha=1,this.elements={},this.onGrabStart=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor="grabbing"},this.onGrabEnd=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor=""},this.container=document.createElement("div"),this.container.classList.add(M.BASE_CLASS);const e=`\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 `;this.container.innerHTML=e,this.elements.box=this.container.firstElementChild,this.elements.boxDragger=this.elements.box.lastElementChild,this.elements.saturation=this.elements.box.firstElementChild.firstElementChild,this.elements.sliders=this.elements.box.nextElementSibling,this.elements.hue=this.elements.sliders.firstElementChild,this.elements.hueDragger=this.elements.hue.lastElementChild,this.hexInputField=new I.ZP({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new I.ZP({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=M.BASE_CLASS+"-inputs",t.append(this.hexInputField.container,this.rgbInputField.container),this.container.append(t),this.hexInputField.input.addEventListener("input",(()=>{let e=this.hexInputField.value.replace(/#/g,"").slice(0,6);const t=e.match(/([a-fA-F\d]+)/),i=t&&t[0].length===e.length&&[6].includes(e.length);this.hexInputField.setState(i?I.I1.Neutral:I.I1.Error),e="#"+e,this.hexInputField.setValueSilently(e),i&&this.setColor(e,!1,!0)}));const i=/^(?:rgb)?\(?([01]?\d\d?|2[0-4]\d|25[0-5])(?:\W+)([01]?\d\d?|2[0-4]\d|25[0-5])\W+(?:([01]?\d\d?|2[0-4]\d|25[0-5])\)?)$/;this.rgbInputField.input.addEventListener("input",(()=>{const e=this.rgbInputField.value.match(i);this.rgbInputField.setState(e?I.I1.Neutral:I.I1.Error),e&&this.setColor((0,l.dI)(+e[1],+e[2],+e[3]),!0,!1)})),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){(0,L.Z)(this.elements.box,(()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()}),(e=>{this.saturationHandler(e.x,e.y)}),(()=>{this.onGrabEnd()}))}attachHueListeners(){(0,L.Z)(this.elements.hue,(()=>{this.onGrabStart(),this.hueRect=this.elements.hue.getBoundingClientRect()}),(e=>{this.hueHandler(e.x)}),(()=>{this.onGrabEnd()}))}setColor(e,t=!0,i=!0){if(void 0===e)e={h:0,s:100,l:50,a:1};else if("string"==typeof e)if("#"===e[0])e=(0,l.cw)(e);else{const t=e.match(/[.?\d]+/g);e=(0,l.dI)(+t[0],+t[1],+t[2],void 0===t[3]?1:+t[3])}this.boxRect=this.elements.box.getBoundingClientRect();const s=this.boxRect.width/100*e.s,n=100-e.l/(100-e.s/2)*100,a=this.boxRect.height/100*n;this.saturationHandler(this.boxRect.left+s,this.boxRect.top+a,!1),this.hueRect=this.elements.hue.getBoundingClientRect();const o=e.h/360,r=this.hueRect.left+this.hueRect.width*o;this.hueHandler(r,!1),this.hue=e.h,this.saturation=e.s,this.lightness=e.l,this.alpha=e.a,this.updatePicker(t,i)}getCurrentColor(){const e=(0,l.Y6)(this.hue,this.saturation,this.lightness,this.alpha),t=(0,l.t1)(e),i=t.slice(0,-2);return{hsl:`hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,rgb:`rgb(${e[0]}, ${e[1]}, ${e[2]})`,hex:i,hsla:`hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,rgba:`rgba(${e[0]}, ${e[1]}, ${e[2]}, ${e[3]})`,hexa:t,rgbaArray:e}}updatePicker(e=!0,t=!0){const i=this.getCurrentColor();this.elements.boxDragger.setAttributeNS(null,"fill",i.hex),e&&(this.hexInputField.setValueSilently(i.hex),this.hexInputField.setState(I.I1.Neutral)),t&&(this.rgbInputField.setValueSilently(i.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(I.I1.Neutral)),this.onChange&&this.onChange(i)}hueHandler(e,t=!0){const i=(0,E.Z)(e-this.hueRect.left,0,this.hueRect.width)/this.hueRect.width;this.hue=Math.round(360*i);const s=`hsla(${this.hue}, 100%, 50%, ${this.alpha})`;this.elements.hueDragger.setAttributeNS(null,"x",100*i+"%"),this.elements.hueDragger.setAttributeNS(null,"fill",s),this.elements.saturation.lastElementChild.setAttributeNS(null,"stop-color",s),t&&this.updatePicker()}saturationHandler(e,t,i=!0){const s=this.boxRect.width,n=this.boxRect.height,a=(0,E.Z)(e-this.boxRect.left,0,s)/s*100,o=(0,E.Z)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const d=(0,E.Z)(a,0,100),l=100-d/2,c=100-(0,E.Z)(o,0,100),h=(0,E.Z)(c/100*l,0,100);this.saturation=d,this.lightness=h,i&&this.updatePicker()}}M.BASE_CLASS="color-picker";var P=i(5029);class Z extends w._{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=(0,l.Pi)(e),i=this.theme.settings,s=c(t),n={_:"wallPaperNoFile",id:0,pFlags:{},settings:{_:"wallPaperSettings",background_color:parseInt(e.slice(1),16)}};i.wallpaper=n,i.highlightningColor=s,this.managers.appStateManager.pushToState("settings",g.Z.settings),m.ZP.applyCurrentTheme(void 0,void 0,!0),this.setActive()}},this.onColorChange=e=>{this.applyColor(e.hex,!1)}}init(){this.container.classList.add("background-container","background-color-container"),this.setTitle("SetColor"),this.theme=C.Z.getTheme();const e=new P.Z({});this.colorPicker=new M,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new P.Z({}),i=this.grid=document.createElement("div");i.classList.add("grid"),["#E6EBEE","#B2CEE1","#008DD0","#C6E7CB","#C4E1A6","#60B16E","#CCD0AF","#A6A997","#7A7072","#FDD7AF","#FDB76E","#DD8851"].forEach((e=>{const t=document.createElement("div");t.classList.add("grid-item"),t.dataset.color=e.toLowerCase();const s=document.createElement("div");s.classList.add("grid-item-media"),s.style.backgroundColor=e,t.append(s),i.append(t)})),(0,r.fc)(i,(e=>{const t=(0,d.Z)(e.target,"grid-item");if(!t||t.classList.contains("active"))return;const i=t.dataset.color;i&&this.applyColor(i)}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container),this.applyColor=(0,S.Z)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.settings.wallpaper.settings.background_color,i=t?this.grid.querySelector(`.grid-item[data-color="${t}"]`):null;e!==i&&(e&&e.classList.remove("active"),i&&i.classList.add("active"))}onOpen(){setTimeout((()=>{var e,t;const i=this.theme.settings,s=null===(t=null===(e=null==i?void 0:i.wallpaper)||void 0===e?void 0:e.settings)||void 0===t?void 0:t.background_color,n=!!s&&"wallPaperNoFile"===i.wallpaper._;n&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(s&&"#"+s.toString(16)||"#cccccc"),n||(this.colorPicker.onChange=this.onColorChange)}),0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}var T,k=i(7030),x=i(236),A=i(7814),_=i(9405),F=i(9492),D=i(7479),R=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function B(e){const t=(e<0?16777215+e:e).toString(16);return"#"+(t.length>=6?t:"0".repeat(6-t.length)+t)}function N(e){return e.settings?[e.settings.background_color,e.settings.second_background_color,e.settings.third_background_color,e.settings.fourth_background_color].filter(Boolean).map(B).join(","):""}class O extends w._{constructor(){super(...arguments),this.clicked=new Set,this.wallPapersByElement=new Map,this.elementsByKey=new Map,this.onUploadClick=()=>{(function(e){const t=document.createElement("input");t.type="file",t.style.display="none",e&&(t.accept=e),document.body.append(t);const i=new Promise(((e,i)=>{t.addEventListener("change",(t=>{const s=t.target.files[0];s?e(s):i("NO_FILE_SELECTED")}),{once:!0})})).finally((()=>{t.remove()}));return t.click(),i})("image/x-png,image/png,image/jpeg").then((e=>R(this,void 0,void 0,(function*(){if(e.name.endsWith(".png")){const t=document.createElement("img"),i=URL.createObjectURL(e);yield(0,s.cj)(t,i,!1);const n="image/jpeg",{blob:a}=yield(0,A.Z)({media:t,size:new _.c(t.naturalWidth,t.naturalHeight),mimeType:n});e=new File([a],e.name.replace(/\.png$/,".jpg"),{type:n})}const t=yield this.managers.appDocsManager.prepareWallPaperUpload(e),i=this.managers.appDocsManager.uploadWallPaper(t.id),n=f.Z.getNewDeferredForUpload(e.name,i),a=(0,o.Z)();a.addNotifyListener=n.addNotifyListener,a.cancel=n.cancel,n.then((e=>{this.clicked.delete(r),this.elementsByKey.delete(r),this.wallPapersByElement.set(l,e);const t=this.getWallPaperKey(e);this.elementsByKey.set(t,l),O.setBackgroundDocument(e).then(a.resolve,a.reject)}),a.reject);const r=this.getWallPaperKey(t);a.catch((()=>{l.remove()}));const d=new y.Z({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),{container:l}=yield this.addWallPaper(t,!1);this.clicked.add(r),d.attach(l,!1,a)}))))},this.onResetClick=()=>{var e,t,i,s;const n=x.h.settings.themes.find((e=>e.name===this.theme.name));n&&(++O.tempId,this.theme.settings=(0,h.Z)(n.settings),this.managers.appStateManager.pushToState("settings",g.Z.settings),m.ZP.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(null===(s=null===(i=null===(t=null===(e=this.theme.settings)||void 0===e?void 0:e.wallpaper)||void 0===t?void 0:t.settings)||void 0===i?void 0:i.pFlags)||void 0===s?void 0:s.blur))},this.onGridClick=e=>{const t=(0,d.Z)(e.target,"grid-item");if(!t)return;const i=this.wallPapersByElement.get(t);if("wallPaperNoFile"===i._)return void O.setBackgroundDocument(i);const s=this.getWallPaperKey(i);if(this.clicked.has(s))return;this.clicked.add(s);const n=i.document,a=new y.Z({cancelable:!0,tryAgainOnFail:!1}),o=()=>R(this,void 0,void 0,(function*(){var e,s,o,r;const d=O.setBackgroundDocument(i);(yield this.managers.thumbsStorage.getCacheContext(n)).url&&!(null===(r=null===(o=null===(s=null===(e=this.theme.settings)||void 0===e?void 0:e.wallpaper)||void 0===s?void 0:s.settings)||void 0===o?void 0:o.pFlags)||void 0===r?void 0:r.blur)||a.attach(t,!0,d)}));a.construct(),(0,r.fc)(t,(e=>{a.preloader.parentElement?(a.onClick(e),a.detach()):o()}),{listenerSetter:this.listenerSetter}),o()},this.setActive=()=>{const e=this.grid.querySelector(".active"),t=this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));e!==t&&(e&&e.classList.remove("active"),t&&t.classList.add("active"))}}static getInitArgs(){return{backgrounds:g.Z.managers.appDocsManager.getWallPapers()}}get theme(){return C.Z.getTheme()}init(e=O.getInitArgs()){var t,i,s;this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground");{const e=(0,P.R)(this.scrollable),n=(0,v.Z)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),a=(0,v.Z)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),d=(0,v.Z)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});(0,r.fc)(n,this.onUploadClick,{listenerSetter:this.listenerSetter}),(0,r.fc)(a,(()=>{this.slider.createTab(Z).open()}),{listenerSetter:this.listenerSetter}),(0,r.fc)(d,this.onResetClick,{listenerSetter:this.listenerSetter});const l=null===(t=this.theme.settings)||void 0===t?void 0:t.wallpaper,c=this.blurCheckboxField=new b.Z({text:"ChatBackground.Blur",name:"blur",checked:null===(s=null===(i=null==l?void 0:l.settings)||void 0===i?void 0:i.pFlags)||void 0===s?void 0:s.blur});this.listenerSetter.add(c.input)("change",(()=>R(this,void 0,void 0,(function*(){this.theme.settings.wallpaper.settings.pFlags.blur=c.input.checked||void 0,yield this.managers.appStateManager.pushToState("settings",g.Z.settings),setTimeout((()=>{const e=o.querySelector(".active");if(!e)return;const t=this.wallPapersByElement.get(e);t.pFlags.pattern||"wallPaperNoFile"===t._||O.setBackgroundDocument(t)}),100)})))),e.append(n,a,d,(0,D.tG)(c).container)}g.Z.addEventListener("background_change",this.setActive);const n=e.backgrounds.then((e=>{const t=e.map((e=>this.addWallPaper(e)));return Promise.all(t)})),a=(0,P.R)(this.scrollable),o=this.grid=document.createElement("div");return o.classList.add("grid"),(0,r.fc)(o,this.onGridClick,{listenerSetter:this.listenerSetter}),a.append(o),n}getWallPaperKey(e){return""+e.id}getWallPaperKeyFromTheme(e){var t;return""+(this.getWallPaperKey(null===(t=e.settings)||void 0===t?void 0:t.wallpaper)||"")}static addWallPaper(e,t=document.createElement("div")){const i=N(e),s="wallPaper"===e._;if(s&&e.pFlags.pattern&&!i)return;const n=!!e.pFlags.dark,a=s?e.document:void 0;t.classList.add("background-item"),t.dataset.id=""+e.id;const o=document.createElement("div");o.classList.add("background-item-media");const r=[];let d,l;if(s){l=(0,k.Z)(a,200,200),d=(0,F.Z)({photo:a,message:null,container:o,withoutPreloader:!0,size:l,noFadeIn:e.pFlags.pattern}),e.pFlags.pattern&&o.classList.add("is-pattern");const i=d.then((({loadPromises:e,images:t})=>R(this,void 0,void 0,(function*(){return(yield e.thumb)||e.full,t})))).then((i=>{var s;return e.pFlags.pattern&&(n?(i.full.style.display="none",i.thumb&&(i.thumb.style.display="none")):(null===(s=e.settings)||void 0===s?void 0:s.intensity)&&(i.full.style.opacity=""+Math.abs(e.settings.intensity)/100)),u.Z.mutate((()=>{t.append(o)}))}));r.push(i)}else t.append(o);if(e.settings&&void 0!==e.settings.background_color){const{canvas:t}=p.Z.create(i);if(t.classList.add("background-colors-canvas"),n&&s){const i=d.then((({loadPromises:i})=>i.full.then((()=>R(this,void 0,void 0,(function*(){const i=yield g.Z.managers.thumbsStorage.getCacheContext(a,l.type);t.style.webkitMaskImage=`url(${i.url})`,t.style.opacity=""+(e.pFlags.dark?100+e.settings.intensity:e.settings.intensity)/100,o.append(t)}))))));r.push(i)}else o.append(t)}return{container:t,media:o,loadPromise:Promise.all(r)}}addWallPaper(e,t=!0){const i=O.addWallPaper(e);if(i){const{container:s,media:n}=i;s.classList.add("grid-item"),n.classList.add("grid-item-media");const a=this.getWallPaperKey(e);this.wallPapersByElement.set(s,e),this.elementsByKey.set(a,s),this.getWallPaperKeyFromTheme(this.theme)===a&&s.classList.add("active"),this.grid[t?"append":"prepend"](s)}return i&&i.loadPromise.then((()=>i))}}T=O,O.tempId=0,O.setBackgroundDocument=e=>{const t=++T.tempId,i=()=>t===T.tempId,r=e.document,d=(0,o.Z)();let l;return r?(l=f.Z.downloadMediaURL({media:r,queueId:m.ZP.chat.bubbles?m.ZP.chat.bubbles.lazyLoadQueue.queueId:0}),d.addNotifyListener=l.addNotifyListener,d.cancel=l.cancel):l=Promise.resolve(),l.then((()=>R(void 0,void 0,void 0,(function*(){var t,o,l;if(!i())return void d.resolve();const h=C.Z.getTheme().settings,u=t=>{let a;const o=N(e);if(t&&!o)a=function(e){const t=document.createElement("img");return(0,s.cj)(t,e,!1).then((()=>function(e,t,i){const s=document.createElement("canvas"),a=t/i;return 1===a?(s.width=50,s.height=s.width/a):a>1?(s.height=50,s.width=s.height/a):s.width=s.height=50,s.getContext("2d").drawImage(e,0,0,t,i,0,0,s.width,s.height),n(s)}(t,t.naturalWidth,t.naturalHeight)))}(t);else{const{canvas:e}=p.Z.create(o);a=Promise.resolve(n(e))}a.then((s=>{var n;if(!i())return void d.resolve();const a=c(Array.from(s)),o=null!==(n=e.slug)&&void 0!==n?n:"";h.wallpaper=e,h.highlightningColor=a,g.Z.managers.appStateManager.pushToState("settings",g.Z.settings),o&&((e,t)=>{fetch(t).then((t=>{m.ZP.cacheStorage.save("backgrounds/"+e,t)}))})(o,t),m.ZP.applyCurrentTheme(o,t,!0).then(d.resolve)}))};if(!r)return void u();const f=yield g.Z.managers.thumbsStorage.getCacheContext(r);(null===(l=null===(o=null===(t=h.wallpaper)||void 0===t?void 0:t.settings)||void 0===o?void 0:o.pFlags)||void 0===l?void 0:l.blur)?setTimeout((()=>{const{canvas:e,promise:t}=(0,a.Z)(f.url,12,4);t.then((()=>{i()?u(e.toDataURL()):d.resolve()}))}),200):u(f.url)})))),d}},534:(e,t,i)=>{"use strict";i.d(t,{Z:()=>T});var s=i(8130),n=i(1447),a=i(3552),o=i(2796),r=i(503),d=i(2230),l=i(5322),c=i(4494),h=i(5644),u=i(9807),p=i(2325),f=i(8479),m=i(7625),g=i(130),v=i(8115),b=i(1507),y=i(3512),w=i(2738),S=i(5029),C=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class L extends a._{constructor(){super(...arguments),this.renderResults=e=>C(this,void 0,void 0,(function*(){yield this.managers.appUsersManager.getContacts(),e.forEach((e=>{const{dom:t}=s.default.addDialogNew({peerId:e,container:this.selector.scrollable,rippleEnabled:!0,avatarSize:"abitbigger"}),i=this.selector.selected.has(e);t.containerEl.append(this.checkbox(i));const n=[];this.dialogsByFilters.forEach(((t,i)=>{if(t.has(e)){const e=document.createElement("span");(0,g.Z)(e,(0,v.Z)(i.title)),n.push(e)}})),(0,p.v_)(n,!1).forEach((e=>{t.lastMessageSpan.append(e)}))}))})),this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(e,t,i){this.originalFilter=e,this.filter=(0,f.Z)(this.originalFilter),this.type=t,this.editFolderTab=i,this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=(0,d.Z)("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),(0,w.fc)(this.confirmBtn,(()=>C(this,void 0,void 0,(function*(){const e=this.selector.getSelected();if("included"===this.type)for(const e in this.filter.pFlags)0!==e.indexOf("exclude_")&&delete this.filter.pFlags[e];else for(const e in this.filter.pFlags)0===e.indexOf("exclude_")&&delete this.filter.pFlags[e];const t=[];for(const i of e)i.isPeerId()?t.push(i.toPeerId()):this.filter.pFlags[i]=!0;let i;i="included"===this.type?e=>t.includes(e):e=>!t.includes(e),(0,m.Z)(this.filter.pinnedPeerIds,((e,t)=>{i(e)||(this.filter.pinnedPeerIds.splice(t,1),this.filter.pinned_peers.splice(t,1))}));const s="included"===this.type?"excludePeerIds":"includePeerIds",n="included"===this.type?"exclude_peers":"include_peers";(0,m.Z)(this.filter[s],((e,i)=>{t.includes(e)&&(this.filter[s].splice(i,1),this.filter[n].splice(i,1))})),this.filter["included"===this.type?"includePeerIds":"excludePeerIds"]=t,this.filter["included"===this.type?"include_peers":"exclude_peers"]=yield Promise.all(t.map((e=>this.managers.appPeersManager.getInputPeerById(e)))),this.editFolderTab.setFilter(this.filter,!1),this.close()}))),{listenerSetter:this.listenerSetter});const s=e=>{this.limit=y.Z.premium?e.dialog_filters_chats_limit_premium:e.dialog_filters_chats_limit_default};return this.listenerSetter.add(y.Z)("app_config",s),this.dialogsByFilters=new Map,Promise.all([this.managers.filtersStorage.getDialogFilters().then((e=>C(this,void 0,void 0,(function*(){yield Promise.all(e.filter((e=>!b.DZ.has(e.id))).map((e=>C(this,void 0,void 0,(function*(){const t=(yield this.managers.dialogsStorage.getFolderDialogs(e.id)).map((e=>e.peerId));this.dialogsByFilters.set(e,new Set(t))})))))})))),this.managers.apiManager.getAppConfig().then((e=>{s(e)}))])}checkbox(e){const t=new u.Z({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=new S.Z({noDelimiter:!0,name:"FilterChatTypes"});let i;t.container.classList.add("folder-categories"),i="excluded"===this.type?{exclude_muted:{ico:"mute",text:"ChatList.Filter.MutedChats"},exclude_archived:{ico:"archive",text:"ChatList.Filter.Archive"},exclude_read:{ico:"readchats",text:"ChatList.Filter.ReadChats"}}:{contacts:{ico:"newprivate",text:"ChatList.Filter.Contacts"},non_contacts:{ico:"noncontacts",text:"ChatList.Filter.NonContacts"},groups:{ico:"group",text:"ChatList.Filter.Groups"},broadcasts:{ico:"newchannel",text:"ChatList.Filter.Channels"},bots:{ico:"bots",text:"ChatList.Filter.Bots"}};const s=document.createDocumentFragment();for(const e in i){const t=(0,c.Z)("btn-primary btn-transparent folder-category-button",{icon:i[e].ico,text:i[e].text});t.dataset.peerId=e,t.append(this.checkbox()),s.append(t)}t.content.append(s);const n=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new h.Z({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search",sectionNameLangPackKey:"FilterChats",managers:this.managers}),this.selector.selected=new Set(n);let a=!1;const r=this.selector.add.bind(this.selector);this.selector.add=(e,t,s)=>{if(this.selector.selected.size>=this.limit&&a&&!i[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);t&&setTimeout((()=>{t.checked=!1}),0);const i=p.ZP.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0);return void(0,o.Am)(i)}const n=r(e,i[e]?(0,p.ag)(i[e].text):void 0,s);return i[e]&&n.querySelector("avatar-element").classList.add("tgico-"+i[e].ico),n},this.selector.scrollable.container.append(t.container,this.selector.scrollable.container.lastElementChild),this.selector.addInitial(n),a=!0;for(const s in e.pFlags)i.hasOwnProperty(s)&&e.pFlags[s]&&(0,w.tH)(t.content.querySelector(`[data-peer-id="${s}"]`))}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}}var E=i(8127),I=i(6848),M=i(3066),P=i(2353),Z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class T extends a._{constructor(){super(...arguments),this.flags={}}static getInitArgs(){return{animationData:n.Z.loadAnimationFromURLManually("Folders_2")}}init(e=T.getInitArgs()){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append((0,p.ag)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=(0,d.Z)("check btn-confirm hide blue");let t=!1;const i={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new E.Z("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{t||(t=!0,this.managers.filtersStorage.updateDialogFilter(this.filter,!0).then((e=>{this.close()})).finally((()=>{t=!1})))},isDanger:!0}]}).show()}};this.menuBtn=(0,l.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[i]}),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const s=new S.Z({}),a=document.createElement("div");a.classList.add("input-wrapper"),this.nameInputField=new r.ZP({label:"FilterNameHint",maxLength:12}),a.append(this.nameInputField.container),s.content.append(a);const h=(e,t,i,s)=>{const n=new S.Z({name:t,noDelimiter:!0});n.container.classList.add("folder-list",e);const a=n.generateContentElement();return a.classList.add("folder-categories"),i.forEach((e=>{const t=(0,c.Z)("folder-category-button btn btn-primary btn-transparent",{icon:e.icon,text:e.text,noRipple:!e.withRipple||void 0});e.name&&(s[e.name]=t),a.append(t)})),n};this.includePeerIds=h("folder-list-included","FilterInclude",[{icon:"add primary",text:"ChatList.Filter.Include.AddChat",withRipple:!0},{text:"ChatList.Filter.Contacts",icon:"newprivate",name:"contacts"},{text:"ChatList.Filter.NonContacts",icon:"noncontacts",name:"non_contacts"},{text:"ChatList.Filter.Groups",icon:"group",name:"groups"},{text:"ChatList.Filter.Channels",icon:"channel",name:"broadcasts"},{text:"ChatList.Filter.Bots",icon:"bots",name:"bots"}],this.flags),this.excludePeerIds=h("folder-list-excluded","FilterExclude",[{icon:"minus primary",text:"ChatList.Filter.Exclude.AddChat",withRipple:!0},{text:"ChatList.Filter.MutedChats",icon:"mute",name:"exclude_muted"},{text:"ChatList.Filter.Archive",icon:"archive",name:"exclude_archived"},{text:"ChatList.Filter.ReadChats",icon:"readchats",name:"exclude_read"}],this.flags),this.scrollable.append(this.stickerContainer,this.caption,s.container,this.includePeerIds.container,this.excludePeerIds.container);const u=this.includePeerIds.container.querySelector(".folder-categories"),f=this.excludePeerIds.container.querySelector(".folder-categories");(0,w.fc)(u.querySelector(".btn"),(()=>{this.slider.createTab(L).open(this.filter,"included",this)}),{listenerSetter:this.listenerSetter}),(0,w.fc)(f.querySelector(".btn"),(()=>{this.slider.createTab(L).open(this.filter,"excluded",this)}),{listenerSetter:this.listenerSetter}),(0,w.fc)(this.confirmBtn,(()=>{if(this.nameInputField.input.classList.contains("error"))return;if(!this.nameInputField.value.trim())return void this.nameInputField.input.classList.add("error");let e,t=Array.from(u.children).slice(1).reduce(((e,t)=>e+ +!t.style.display),0);t+=this.filter.include_peers.length,t?(this.confirmBtn.setAttribute("disabled","true"),e=this.filter.id?this.managers.filtersStorage.updateDialogFilter(this.filter):this.managers.filtersStorage.createDialogFilter(this.filter),e.then((e=>{this.close()})).catch((e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?(0,o.Am)("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)})).finally((()=>{this.confirmBtn.removeAttribute("disabled")}))):(0,o.Am)("Please choose at least one chat for this folder.")}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.nameInputField.input)("input",(()=>{this.filter.title=this.nameInputField.value,this.editCheckForChange()}));const m="edit"===this.type?[this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"pinned_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"include_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"exclude_peers")]:[];return Promise.all([this.loadAnimationPromise=e.animationData.then((e=>Z(this,void 0,void 0,(function*(){const t=yield e({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86});return this.animation=t,n.Z.waitForFirstFrame(t)})))),...m]).then((()=>{"edit"===this.type?(this.setFilter(this.originalFilter,!0),this.onEditOpen()):(this.setInitFilter(),this.onCreateOpen())}))}onOpenAfterTimeout(){this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()}))}onCreateOpen(){this.setTitle("FilterNew"),this.menuBtn.classList.add("hide"),this.confirmBtn.classList.remove("hide");for(const e in this.flags)this.flags[e].style.display="none"}onEditOpen(){this.setTitle("create"===this.type?"FilterNew":"FilterHeaderEdit"),"edit"===this.type&&(this.menuBtn.classList.remove("hide"),this.confirmBtn.classList.add("hide"));const e=this.filter;this.nameInputField.value=(0,M.Z)(e.title);for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach((t=>Z(this,void 0,void 0,(function*(){const i=this[t],n=s.default.createChatList({ignoreClick:!0});let a=e[t];const o=e=>Z(this,void 0,void 0,(function*(){return!!(yield this.managers.appMessagesManager.getDialogOnly(e))||!!e.isUser()&&"user"===(yield this.managers.appUsersManager.getUser(e.toUserId()))._})),r=yield(0,P.Z)(a,(e=>o(e)));a.length=0,a.push(...r),a=a.slice();const d=e=>Z(this,void 0,void 0,(function*(){for(let t=0,i=Math.min(a.length,e);td(20)),{listenerSetter:this.listenerSetter}),l.append((0,p.ag)("FilterShowMoreChats",[a.length])),e.append(l)}d(4)}))))}editCheckForChange(){if("edit"===this.type){const e=!(0,I.Z)(this.originalFilter,this.filter);this.confirmBtn.classList.toggle("hide",!e),this.menuBtn.classList.toggle("hide",e)}}setFilter(e,t){this.container&&Array.from(this.container.querySelectorAll("ul, .load-more")).forEach((e=>e.remove())),t?(this.originalFilter=e,this.filter=(0,f.Z)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}setInitFilter(e){void 0===e?(this.setFilter({_:"dialogFilter",id:0,title:"",pFlags:{},pinned_peers:[],include_peers:[],exclude_peers:[],pinnedPeerIds:[],includePeerIds:[],excludePeerIds:[]},!0),this.type="create"):(this.setFilter(e,!0),this.type="edit")}}},2010:(e,t,i)=>{"use strict";i.d(t,{J:()=>f,Z:()=>m});var s=i(503),n=i(3552),a=i(2621),o=i(6726),r=i(2325),d=i(2738),l=i(3512),c=i(2521),h=i(6082),u=i(5029),p=i(9522);function f(){const e=document.createElement("div"),t=(0,c.Z)(document.createElement("a")),i=(0,r.ag)("Username.Purchase",[t]);return i.classList.add("username-purchase-help"),e.append(i,document.createElement("br"),document.createElement("br")),e.classList.add("hide"),{element:e,setUsername:i=>{i&&(t.href="https://fragment.com/username/"+i),e.classList.toggle("hide",!i)}}}class m extends n._{static getInitArgs(){return{bioMaxLength:l.Z.managers.apiManager.getLimit("bio"),user:l.Z.managers.appUsersManager.getSelf(),userFull:l.Z.managers.appProfileManager.getProfile(l.Z.myId.toUserId())}}init(e){return t=this,i=void 0,c=function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const t=[],[i,n,c]=yield Promise.all([e.bioMaxLength,e.user,e.userFull]);{const e=(0,u.R)(this.scrollable,void 0,"Bio.Description"),n=document.createElement("div");n.classList.add("input-wrapper"),this.firstNameInputField=new s.ZP({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new s.ZP({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new s.ZP({label:"EditProfile.BioLabel",name:"bio",maxLength:i}),n.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const o=document.createElement("div");o.classList.add("caption"),(0,r.XZ)({element:o,key:"Bio.Description"}),t.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.editPeer=new a.Z({peerId:l.Z.myId,inputFields:t,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),e.append(this.editPeer.avatarEdit.container,n)}{const e=new u.Z({name:"EditAccount.Username",caption:!0}),i=document.createElement("div");i.classList.add("input-wrapper"),this.usernameInputField=new o.l({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange();const{error:e}=this.usernameInputField,t="USERNAME_PURCHASE_AVAILABLE"===(null==e?void 0:e.type);n(t?this.usernameInputField.value:void 0)},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"},this.managers),i.append(this.usernameInputField.container);const s=e.caption,{setUsername:n,element:a}=f();s.append(a,(0,r.ag)("UsernameHelp")),t.push(this.usernameInputField),e.content.append(i),this.scrollable.append(e.container)}{const e=new p.Z({peerId:l.Z.myId,peer:n,listenerSetter:this.listenerSetter,usernameInputField:this.usernameInputField,middleware:this.middlewareHelper.get()});this.scrollable.append(e.container)}(0,d.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;const e=[],t=this.managers.appProfileManager.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value);e.push(t.then((()=>{this.close()}),(e=>{console.error("updateProfile error:",e)}))),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))),this.usernameInputField.isValidToChange()&&e.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value)),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled")}))}),{listenerSetter:this.listenerSetter}),this.firstNameInputField.setOriginalValue(n.first_name,!0),this.lastNameInputField.setOriginalValue(n.last_name,!0),this.bioInputField.setOriginalValue(c.about,!0),this.usernameInputField.setOriginalValue((0,h.Z)(n),!0),this.editPeer.handleChange()},new((n=void 0)||(n=Promise))((function(e,s){function a(e){try{r(c.next(e))}catch(e){s(e)}}function o(e){try{r(c.throw(e))}catch(e){s(e)}}function r(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(a,o)}r((c=c.apply(t,i||[])).next())}));var t,i,n,c}}},4332:(e,t,i)=>{"use strict";i.d(t,{HQ:()=>d,ZP:()=>h});var s=i(4271),n=i(3552),a=i(4755),o=i(1669),r=i(410);const d="is-right-column-shown";class l extends n.Z{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1}construct(e){this.managers=e,a.Z.addEventListener("changeScreen",((e,t)=>{t===a._.medium&&e!==a._.mobile&&this.toggleSidebar(!1)})),a.Z.addEventListener("resize",(()=>{this.setColumnProportion()}))}createSharedMediaTab(){const e=this.createTab(o.Z,!1,!0);return e.slider=this,e}replaceSharedMediaTab(e){const t=this.sharedMediaTab;if(t){const i=this.historyTabIds.indexOf(t);this._selectTab.getFrom()===t.container&&this._selectTab.setFrom(null==e?void 0:e.container),e?(-1!==i&&(this.historyTabIds[i]=e),t.container.classList.contains("active")&&e.container.classList.add("active"),t.container.replaceWith(e.container)):(-1!==i&&this.historyTabIds.splice(i,1),t.container.remove())}else this.tabsContainer.prepend(e.container);this.sharedMediaTab=e}onCloseTab(e,t,i){this.historyTabIds.length||this.toggleSidebar(!1,t),super.onCloseTab(e,t,i)}setColumnProportion(){const e=this.sidebarEl.scrollWidth/this.sidebarEl.previousElementSibling.scrollWidth;document.documentElement.style.setProperty("--right-column-proportion",""+e)}toggleSidebar(e,t){const i=document.body.classList.contains(d);let n;if(void 0!==e?e?i||(n=!0):i&&(n=!0):n=!0,!n)return Promise.resolve();i||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const a=s.ZP.selectTab(i?s.oo.CHAT:s.oo.PROFILE,t);return document.body.classList.toggle(d,e),a}}const c=new l;r.GO.appSidebarRight=c;const h=c},4240:(e,t,i)=>{"use strict";i.d(t,{Z:()=>S});var s=i(3552),n=i(503),a=i(2621),o=i(7479),r=i(9807),d=i(4494),l=i(8842),c=i(3512),h=i(8127),u=i(1168),p=i(2325),f=i(2738),m=i(1656),g=i(2946),v=i(8210),b=i(5029),y=i(7362),w=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class S extends s._{init(){return w(this,void 0,void 0,(function*(){const{peerId:e}=this,t=e.toUserId();this.container.classList.add("edit-peer-container","edit-contact-container");const[i,s]=yield Promise.all([this.managers.appUsersManager.isContact(t),this.managers.appPrivacyManager.getPrivacy("inputPrivacyKeyPhoneNumber")]),S=!i;this.setTitle(S?"AddContactTitle":"Edit");{const i=new b.Z({noDelimiter:!0}),s=[],d=document.createElement("div");if(d.classList.add("input-wrapper"),this.nameInputField=new n.ZP({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new n.ZP({label:"LastName",name:"contact-lastname",maxLength:70}),t){const e=yield this.managers.appUsersManager.getUser(t);S?(this.nameInputField.setDraftValue(e.first_name),this.lastNameInputField.setDraftValue(e.last_name)):(this.nameInputField.setOriginalValue(e.first_name),this.lastNameInputField.setOriginalValue(e.last_name))}if(d.append(this.nameInputField.container,this.lastNameInputField.container),s.push(this.nameInputField,this.lastNameInputField),this.editPeer=new a.Z({peerId:e,inputFields:s,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),e){const s=document.createElement("div");s.classList.add("avatar-edit"),s.append(this.editPeer.avatarElem);const n=new r.Z({text:"Notifications"});n.input.addEventListener("change",(t=>{t.isTrusted&&this.managers.appMessagesManager.togglePeerMute({peerId:e})})),this.listenerSetter.add(c.Z)("notify_settings",(e=>w(this,void 0,void 0,(function*(){if("notifyPeer"!==e.peer._)return;const t=(0,g.Z)(e.peer.peer);if(t==t){const t=!(yield this.managers.appNotificationsManager.isMuted(e.notify_settings));t!==n.checked&&(n.checked=t)}}))));const a=document.createElement("div");a.classList.add("profile-name"),a.append(new l.Z({peerId:e}).element);const h=document.createElement("div");if(h.classList.add("profile-subtitle"),h.append((0,p.ag)("EditContact.OriginalName")),i.content.append(s,a,h,d),S){const s=yield this.managers.appUsersManager.getUser(t),n=new o.ZP({icon:"phone",titleLangKey:s.phone?void 0:"MobileHidden",title:s.phone?(0,v.Z)(s.phone):void 0,subtitleLangKey:s.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:s.phone?void 0:[new l.Z({peerId:e}).element]});i.content.append(n.container)}else{const t=new o.ZP({checkboxField:n,withCheckboxSubtitle:!0,listenerSetter:this.listenerSetter}),s=!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1}));n.checked=s,i.content.append(t.container)}}else i.content.append(d);this.scrollable.append(i.container)}if(S){if(s.some((e=>"privacyValueDisallowAll"===e._))&&!s.some((e=>"privacyValueAllowUsers"===e._&&e.users.includes(t)))){const e=new b.Z({caption:"NewContact.Exception.ShareMyPhoneNumber.Desc",captionArgs:[yield(0,y.Z)({peerId:this.peerId})]}),t=this.sharePhoneCheckboxField=new r.Z({text:"NewContact.Exception.ShareMyPhoneNumber",checked:!0}),i=(0,o.tG)(t);e.content.append(i.container),this.scrollable.append(e.container)}}else{const i=new b.Z,s=(0,d.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});(0,f.fc)(s,(()=>{new h.Z("popup-delete-contact",{peerId:e,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:(0,u.x)([{langKey:"Delete",callback:()=>{const e=(0,m.Z)([s],!0);this.managers.appUsersManager.deleteContacts([t]).then((()=>{this.close()}),(()=>{e()}))},isDanger:!0}])}).show()}),{listenerSetter:this.listenerSetter}),i.content.append(s),this.scrollable.append(i.container)}(0,f.fc)(this.editPeer.nextBtn,(()=>w(this,void 0,void 0,(function*(){var e;this.editPeer.nextBtn.disabled=!0,this.managers.appUsersManager.addContact(t,this.nameInputField.value,this.lastNameInputField.value,(yield this.managers.appUsersManager.getUser(t)).phone,null===(e=this.sharePhoneCheckboxField)||void 0===e?void 0:e.checked).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}))),{listenerSetter:this.listenerSetter})}))}}},730:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C});var s=i(2738),n=i(1656),a=i(9405),o=i(8479),r=i(6848),d=i(4271),l=i(1507),c=i(3785),h=i(2230),u=i(9807),p=i(6039),f=i(503),m=i(7479),g=i(5029),v=i(744),b=i(6024),y=i(9345),w=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const S=(0,a.C)(64,64);class C extends b.Z{init(e,t){return w(this,void 0,void 0,(function*(){this.colorIndex=0;const i=!t,a=t===l.Ox;this.container.classList.add("edit-topic-container"),this.setTitle(i?"NewTopic":"ForumTopic.Title.Edit");const r=e.toChatId();t&&(this.topic=this.originalTopic=(0,o.Z)(yield this.managers.dialogsStorage.getForumTopic(e,t)));{const i=new g.Z({name:a?"CreateGeneralTopicTitle":"CreateTopicTitle"}),o=this.iconDiv=document.createElement("div");o.classList.add("edit-topic-icon-container"),!t&&(0,s.fc)(o,(()=>{this.topic.icon_emoji_id||(this.colorIndex=(this.colorIndex+1)%l.OS.length,this.setIcon())}),{listenerSetter:this.listenerSetter}),t&&o.classList.add("disable-hover");const c=document.createElement("div");c.classList.add("input-wrapper");const u=this.nameInputField=new f.ZP({label:"ForumTopic.Name.Placeholder",withLinebreaks:!1,name:"topic-name",maxLength:70,required:!0});this.topic&&u.setOriginalValue(this.topic.title,!0);const p=this.confirmBtn=(0,h.Z)("check btn-confirm blue hide",{noRipple:!0});this.header.append(p),(0,s.fc)(p,(()=>{const i=(0,n.Z)([p],!0);t?this.managers.appChatsManager.editForumTopic({chatId:r,topicId:t,title:u.value,iconEmojiId:this.topic.icon_emoji_id||0}).then((()=>{this.close()})).catch((e=>{console.error("edit topic error",e),i()})):this.managers.appChatsManager.createForumTopic({chatId:r,iconColor:l.OS[this.colorIndex],iconEmojiId:this.topic.icon_emoji_id,title:u.value}).then((t=>{this.close(),d.ZP.setInnerPeer({peerId:e,threadId:t})})).catch((e=>{console.error("create topic error",e),i()}))}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(u.input)("input",(()=>{var e;this.validate(),this.setIcon(null===(e=this.topic)||void 0===e?void 0:e.icon_emoji_id)})),c.append(u.container),i.content.append(o,c),this.scrollable.append(i.container)}const c=[];if(a){const e=new g.Z({caption:"EditTopicHideInfo"}),i=new u.Z({checked:!this.topic.pFlags.hidden,text:"EditTopicHide"});this.listenerSetter.add(i.input)("change",(()=>{const e=this.managers.appChatsManager.editForumTopic({chatId:r,topicId:t,hidden:!i.checked});s.disableWithPromise(e)}));const s=new m.ZP({checkboxField:i});e.content.append(s.container),this.scrollable.append(e.container)}else{const e=new g.Z({});e.container.classList.add("edit-topic-emoticons-container");const t=new p.ZP({managers:this.managers,isStandalone:!0,noRegularEmoji:!0,stickerSetId:"inputStickerSetEmojiDefaultTopicIcons",onClick:e=>{t.setActive(e.docId?e:{emoji:void 0,docId:void 0}),this.setIcon(e.docId)}});t.getContainerSize=()=>({width:v.ZP.rect.width,height:400}),this.middlewareHelper.onDestroy((()=>{t.destroy()})),t.container.classList.remove("tabs-tab"),this.emojiElement=document.createElement("span"),this.emojiElement.classList.add("super-emoji-topic-icon");const i=t.init().then((()=>w(this,void 0,void 0,(function*(){var e;const i=t.getCustomCategory(),s=null===(e=this.topic)||void 0===e?void 0:e.icon_emoji_id;t.addEmojiToCategory({category:i,element:this.emojiElement,batch:!1,prepend:!0,active:!s}),s&&t.setActive({docId:s,emoji:""})}))));c.push(i),e.content.replaceWith(t.container),this.scrollable.append(e.container)}return Promise.all(c).then((()=>this.s()))}))}validate(){let e=this.nameInputField.isValidToChange();!e&&this.originalTopic&&(e=this.topic.icon_emoji_id!==this.originalTopic.icon_emoji_id),this.confirmBtn.classList.toggle("hide",!e)}s(){var e,t;return(null===(e=this.topic)||void 0===e?void 0:e.icon_color)&&(this.colorIndex=l.OS.indexOf(this.topic.icon_color)),this.setIcon(null===(t=this.topic)||void 0===t?void 0:t.icon_emoji_id,void 0,!0)}setIcon(e,t=this.iconDiv,i){var s;return w(this,void 0,void 0,(function*(){const n=this.nameInputField.value,a=t===this.iconDiv;if(a){const t={id:null===(s=this.topic)||void 0===s?void 0:s.id,icon_color:l.OS[this.colorIndex],title:(0,c.Z)(n,!0).text||"A",icon_emoji_id:e},a=this.topic;if(this.topic=t,!i&&a&&a.icon_color===t.icon_color&&a.title===t.title||this.setIcon(void 0,this.emojiElement),(0,r.Z)(a,t)&&!i)return;this.validate()}const o=yield(0,y.e)({topic:a?this.topic:Object.assign(Object.assign({},this.topic),{icon_emoji_id:void 0}),customEmojiSize:S,middleware:this.middlewareHelper.get()}),d=document.createElement("div");d.classList.add("edit-topic-icon"),d.append(o);const h=t.lastElementChild;t.append(d);const u=(e,t)=>{const i=e.animate([{opacity:"0",transform:"scale(0.8)"},{opacity:"1",transform:"scale(1)"}],{duration:200,iterations:1,easing:"ease-in-out",fill:"forwards",direction:t?"normal":"reverse"});return new Promise((e=>{i.addEventListener("finish",(()=>{e()}),{once:!0})}))};h&&u(h,!1).then((()=>h.remove())),u(d,!0)}))}}},1669:(e,t,i)=>{"use strict";i.d(t,{Z:()=>de});var s=i(3512),n=i(6360),a=i(3552),o=i(426),r=i(503),d=i(2621),l=i(7479),c=i(4494),h=i(2166),u=i(144),p=i(279),f=i(1218),m=i(2796),g=i(6726),v=i(6024),b=i(2325),y=i(8127),w=i(8119),S=i(2738),C=i(1656),L=i(9807),E=i(5029),I=i(9522),M=i(6082),P=i(5102),Z=i(2010),T=i(5592),k=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class x extends v.h{init(){return k(this,void 0,void 0,(function*(){this.container.classList.add("edit-peer-container","group-type-container");const e=yield this.managers.appChatsManager.isBroadcast(this.chatId);this.setTitle(e?"ChannelType":"GroupType");const t=new E.Z({name:e?"ChannelType":"GroupType"}),i=(0,u.a)(),n=new l.ZP({radioField:new f.Z({langKey:e?"ChannelPrivate":"MegaPrivate",name:i,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),a=new l.ZP({radioField:new f.Z({langKey:e?"ChannelPublic":"MegaPublic",name:i,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),o=(0,l.De)([n,a],(e=>{const t=[[v.container],[H]];"public"===e&&t.reverse(),t[0].forEach((e=>e.classList.remove("hide"))),t[1].forEach((e=>e.classList.add("hide"))),R()}));let r=yield this.managers.appChatsManager.getChat(this.chatId);const d={basic:[]};this.listenerSetter.add(s.Z)("chat_update",(e=>k(this,void 0,void 0,(function*(){this.chatId===e&&(r=yield this.managers.appChatsManager.getChat(this.chatId),d.basic.forEach((e=>e())))})))),t.content.append(o);const v=new E.Z({}),x=new l.ZP({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{(0,h.T)(this.chatFull.exported_invite.link),(0,m.Am)(b.ZP.format("LinkCopied",!0))},listenerSetter:this.listenerSetter}),A=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});(0,S.fc)(A,(()=>{new y.Z("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=(0,C.Z)([A],!0);this.managers.appProfileManager.getChatInviteLink(this.chatId,!0).then((t=>{e(),x.title.innerHTML=t}))}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()}),{listenerSetter:this.listenerSetter}),v.content.append(x.container,A);const _=new E.Z({caption:!0,noDelimiter:!0}),F=document.createElement("div");F.classList.add("input-wrapper");const D="t.me/",R=()=>{const e=n.radioField.checked&&z!==D||B.isValidToChange()&&B.input.classList.contains("valid");j.classList.toggle("is-visible",e);const{error:t}=B,i="USERNAME_PURCHASE_AVAILABLE"===(null==t?void 0:t.type);N(i?B.getValue():void 0)},B=new g.l({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:R,peerId:this.chatId.toPeerId(!0),head:D},this.managers),{setUsername:N,element:O}=(0,Z.J)();_.caption.append(O,(0,b.ag)(e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup"));const U=new I.Z({peerId:this.chatId.toPeerId(!0),peer:r,listenerSetter:this.listenerSetter,usernameInputField:B,middleware:this.middlewareHelper.get()}),H=document.createElement("div");H.append(_.container,U.container);const z=D+((0,M.Z)(r)||"");F.append(B.container),_.content.append(F);const j=(0,w.Z)({icon:"check",className:"is-visible"});this.content.append(j),(0,S.fc)(j,(()=>k(this,void 0,void 0,(function*(){const t=a.radioField.checked?B.getValue():"";if(!t){const t=yield this.managers.appChatsManager.getChat(this.chatId),i=(0,M.Z)(t);i&&(yield(0,T.Z)({descriptionLangKey:e?"ChannelVisibility.Confirm.MakePrivate.Channel":"ChannelVisibility.Confirm.MakePrivate.Group",descriptionLangArgs:[i],button:{langKey:"OK"}}))}(0,p.p)(j),this.managers.appChatsManager.migrateChat(this.chatId).then((e=>t?this.managers.appChatsManager.updateUsername(e,t):this.managers.appChatsManager.makeChannelPrivate(e))).then((()=>{this.close()}))}))),{listenerSetter:this.listenerSetter}),(z!==D||(0,P.Z)(r).length?a:n).radioField.checked=!0,B.setOriginalValue(z,!0),this.scrollable.append(t.container,v.container,H);{const t=new E.Z({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),i=new L.Z({text:"RestrictSavingContent",withRipple:!0});this.listenerSetter.add(i.input)("change",(()=>{const e=i.toggleDisability(!0);this.managers.appChatsManager.toggleNoForwards(this.chatId,i.checked).then((()=>{e()}))}));const s=()=>{i.setValueSilently(!!r.pFlags.noforwards)};((e,t="basic")=>{d[t].push(e)})(s),s(),t.content.append(i.label),this.scrollable.append(t.container)}}))}}var A=i(4668),_=i(5565),F=i(8936),D=i(8130),R=i(8479),B=i(7120),N=i(2946),O=i(2995),U=i(6848),H=i(3061);class z extends v.h{init(){return e=this,t=void 0,s=function*(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new E.Z({name:"UserRestrictionsCanDo"}),i=document.createElement("div");i.classList.add("chatlist-container"),t.content.insertBefore(i,t.title);const s=D.default.createChatList({new:!0});i.append(s);const{dom:n}=D.default.addDialogNew({peerId:this.userId.toPeerId(!1),container:s,rippleEnabled:!0,avatarSize:"abitbigger"});n.lastMessageSpan.append((0,H.Z)(yield this.managers.appUsersManager.getUser(this.userId)));const a=new G({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content,participant:"channelParticipantBanned"===this.participant._?this.participant:void 0},this.managers);e=()=>{const e=a.takeOut();"channelParticipantBanned"===this.participant._&&(0,U.Z)(this.participant.banned_rights.pFlags,e.pFlags)||this.managers.appChatsManager.editBanned(this.chatId,this.participant,e)},this.eventListener.addEventListener("destroy",e,{once:!0}),this.scrollable.append(t.container)}{const t=new E.Z({});if("channelParticipantBanned"===this.participant._){const i=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});(0,S.fc)(i,(()=>{const t=(0,C.Z)([i],!0);this.managers.appChatsManager.clearChannelParticipantBannedRights(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}),(()=>{t()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i)}const i=(0,c.Z)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});(0,S.fc)(i,(()=>{(0,C.Z)([i],!0),this.managers.appChatsManager.kickFromChannel(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container)}},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var j=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class G{constructor(e,t){this.options=e,this.managers=t,this.construct()}construct(){return j(this,void 0,void 0,(function*(){this.v=[{flags:["send_messages"],text:"UserRestrictionsSend",exceptionText:"UserRestrictionsNoSend"},{flags:["send_media"],text:"UserRestrictionsSendMedia",exceptionText:"UserRestrictionsNoSendMedia"},{flags:["send_stickers","send_gifs"],text:"UserRestrictionsSendStickers",exceptionText:"UserRestrictionsNoSendStickers"},{flags:["send_polls"],text:"UserRestrictionsSendPolls",exceptionText:"UserRestrictionsNoSendPolls"},{flags:["embed_links"],text:"UserRestrictionsEmbedLinks",exceptionText:"UserRestrictionsNoEmbedLinks"},{flags:["invite_users"],text:"UserRestrictionsInviteUsers",exceptionText:"UserRestrictionsNoInviteUsers"},{flags:["pin_messages"],text:"UserRestrictionsPinMessages",exceptionText:"UserRestrictionsNoPinMessages"},{flags:["change_info"],text:"UserRestrictionsChangeInfo",exceptionText:"UserRestrictionsNoChangeInfo"}],this.toggleWith={send_messages:["send_media","send_stickers","send_polls","embed_links"]};const e=this.options,t=yield this.managers.appChatsManager.getChat(e.chatId),i=t.default_banned_rights,s=e.participant?function(e,t){if(e.default_banned_rights){t=(0,R.Z)(t);const i=e.default_banned_rights.pFlags;for(const e in i)t.pFlags[e]=i[e]}return t}(t,e.participant.banned_rights):i,n=e.participant?"UserRestrictionsDisabled":"EditCantEditPermissionsPublic";for(const a of this.v){const o=a.flags[0],r=(0,l.tG)(a.checkboxField=new L.Z({text:a.text,checked:(0,B.Z)(t,o,s),restriction:!0,listenerSetter:e.listenerSetter}));(e.participant&&i.pFlags[o]||(0,P.Z)(t)[0]&&(a.flags.includes("pin_messages")||a.flags.includes("change_info")))&&(a.checkboxField.input.disabled=!0,(0,S.fc)(a.checkboxField.label,(e=>{(0,m.Am)(b.ZP.format(n,!0))}),{listenerSetter:e.listenerSetter})),this.toggleWith[o]&&e.listenerSetter.add(a.checkboxField.input)("change",(()=>{a.checkboxField.checked||this.v.filter((e=>this.toggleWith[o].includes(e.flags[0]))).forEach((e=>{e.checkboxField.checked=!1}))})),e.appendTo.append(r.container)}}))}takeOut(){const e={_:"chatBannedRights",until_date:2147483647,pFlags:{}};for(const t of this.v)!t.checkboxField.checked&&t.flags.forEach((t=>{e.pFlags[t]=!0}));return e}}class V extends v.h{init(){return j(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new E.Z({name:"ChannelPermissionsHeader"});e=new G({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content},this.managers),this.eventListener.addEventListener("destroy",(()=>{this.managers.appChatsManager.editChatDefaultBannedRights(this.chatId,e.takeOut())}),{once:!0}),this.scrollable.append(t.container)}{const t=new E.Z({name:"PrivacyExceptions"}),i=new l.ZP({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new O.Z({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout((()=>{n(e)}),0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})},listenerSetter:this.listenerSetter}),n=e=>j(this,void 0,void 0,(function*(){let t;try{t=yield this.managers.appProfileManager.getChannelParticipant(this.chatId,e)}catch(e){return void(0,m.Am)("User is no longer participant")}const i=this.slider.createTab(z);i.participant=t,i.chatId=this.chatId,i.userId=e,i.open()}));t.content.append(i.container);const a=t.generateContentElement();a.classList.add("chatlist-container");const o=D.default.createChatList({new:!0});a.append(o),(0,S.fc)(o,(e=>{const t=(0,A.Z)(e.target,D.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=t.dataset.peerId.toPeerId();n(i)}),{listenerSetter:this.listenerSetter});const r=(t,i)=>j(this,void 0,void 0,(function*(){const s=i.banned_rights,n=(yield this.managers.appChatsManager.getChat(this.chatId)).default_banned_rights,a=[];e.v.forEach((e=>{const t=e.flags[0];s.pFlags[t]&&!n.pFlags[t]&&a.push(e.exceptionText)}));const o=t.lastMessageSpan;a.length&&o.replaceChildren(...(0,b.v_)(a.map((e=>(0,b.ag)(e))),!1)),o.classList.toggle("hide",!a.length)})),d=(e,t)=>{const{dom:i}=D.default.addDialogNew({peerId:(0,N.Z)(e.peer),container:o,rippleEnabled:!0,avatarSize:"abitbigger",append:t});r(i,e)},c=()=>{(0,_.Z)(i.subtitle,(0,b.ag)(u?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[u]))};let h,u=0;const p=()=>(h=new F.Z({scrollable:this.scrollable,getPromise:()=>this.managers.appProfileManager.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,o.childElementCount).then((e=>{for(const t of e.participants)d(t,!0);return u=e.count,c(),e.participants.length<50||e.count===o.childElementCount}))}),h.load());this.scrollable.append(t.container),(yield this.managers.appChatsManager.isChannel(this.chatId))?yield p():(c(),this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,p())})))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}var K=i(6194),W=i(5701),$=i(62),q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Q extends v.h{init(){var e;return q(this,void 0,void 0,(function*(){this.setTitle("Reactions");const t=yield this.managers.appReactionsManager.getActiveAvailableReactions(),i=yield this.managers.appProfileManager.getChatFull(this.chatId),s=yield this.managers.appChatsManager.isBroadcast(this.chatId);let n=null!==(e=i.available_reactions)&&void 0!==e?e:{_:"chatReactionsNone"},a=n,o=new Set("chatReactionsSome"===n._?n.reactions.map((e=>e.emoticon)):[]);const r=e=>e.map((e=>({_:"reactionEmoji",emoticon:e}))),d=()=>s?"EnableReactionsChannelInfo":"chatReactionsAll"===a._?"EnableAllReactionsInfo":"chatReactionsNone"===a._?"DisableReactionsInfo":"EnableSomeReactionsInfo",c=new E.Z({name:s?void 0:"AvailableReactions",caption:d()}),h=new E.Z({name:"OnlyAllowThisReactions"}),u=()=>{var e;const t=null!==(e=a.reactions)&&void 0!==e?e:[];o=new Set(t.map((({emoticon:e})=>e))),f.forEach(((e,t)=>{e.setValueSilently(o.has(t))}))};let p;if(s){p=new L.Z({toggle:!0,checked:"chatReactionsSome"===n._});const e=new l.ZP({checkboxField:p,titleLangKey:"EnableReactions",listenerSetter:this.listenerSetter});c.content.append(e.container),this.listenerSetter.add(p.input)("change",(()=>{let e=!0;p.checked?m.every((e=>!e.checked))?a={_:"chatReactionsSome",reactions:r(t.map((({reaction:e})=>e)))}:"chatReactionsSome"!==a._?a={_:"chatReactionsSome",reactions:r(Array.from(o))}:e=!1:a={_:"chatReactionsNone"},e&&(u(),v())}))}else{const e=[["chatReactionsAll","AllReactions"],["chatReactionsSome","SomeReactions"],["chatReactionsNone","NoReactions"]],t=()=>{h.container.classList.toggle("hide","chatReactionsSome"!==a._)};let i=n._;const s=(0,l.ZC)(e.map((([e,t])=>({langPackKey:t,value:e,checked:n._===e}))),(e=>{i=e,a="chatReactionsAll"===i?{_:i,pFlags:{allow_custom:!0}}:"chatReactionsNone"===i?{_:i}:{_:i,reactions:r(["👍","👎"])},(0,_.Z)(c.caption,(0,b.ag)(d())),u(),v(),t()}));c.content.append(s),t()}const f=new Map,m=t.map((e=>{const t=e.reaction,i=new L.Z({toggle:!0,checked:o.has(t)});f.set(t,i),this.listenerSetter.add(i.input)("change",(()=>{i.checked?(o.add(t),p&&!p.checked&&(p.checked=!0)):(o.delete(t),(null==p?void 0:p.checked)&&!o.size&&(p.checked=!1)),v()}));const s=new l.ZP({checkboxField:i,title:e.title,havePadding:!0,listenerSetter:this.listenerSetter});return(0,$.Z)({row:s,doc:e.static_icon,size:"small"}),h.content.append(s.container),i})),g=()=>q(this,void 0,void 0,(function*(){v.clearTimeout(),"chatReactionsSome"===a._&&(a.reactions=r(Array.from(o))),this.managers.appChatsManager.setChatAvailableReactions(this.chatId,a),n=a})),v=(0,W.Z)(g,3e3,!1,!0);this.eventListener.addEventListener("destroy",(()=>{v.isDebounced()&&g()}),{once:!0}),this.scrollable.append(c.container,h.container)}))}}var Y=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class X extends a._{_init(){return Y(this,void 0,void 0,(function*(){this.listenerSetter.removeAll(),this.scrollable.container.replaceChildren(),this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");let[e,t,i,n,a,o,h,u]=yield Promise.all([this.managers.appProfileManager.getChatFull(this.chatId,!0),this.managers.appChatsManager.getChat(this.chatId),this.managers.appChatsManager.isBroadcast(this.chatId),this.managers.appChatsManager.isChannel(this.chatId),this.managers.appChatsManager.hasRights(this.chatId,"change_type"),this.managers.appChatsManager.hasRights(this.chatId,"change_permissions"),this.managers.appChatsManager.hasRights(this.chatId,"manage_topics"),this.managers.apiManager.getAppConfig()]);const p={full:[],basic:[]},f=(e,t="basic")=>{p[t].push(e)};this.listenerSetter.add(s.Z)("chat_update",(e=>Y(this,void 0,void 0,(function*(){this.chatId===e&&(t=yield this.managers.appChatsManager.getChat(this.chatId),p.basic.forEach((e=>e())))})))),this.listenerSetter.add(s.Z)("chat_full_update",(t=>Y(this,void 0,void 0,(function*(){this.chatId===t&&(e=(yield this.managers.appProfileManager.getCachedFullChat(t))||e,p.full.forEach((e=>e())))}))));const m=this.chatId.toPeerId(!0);{const s=new E.Z({noDelimiter:!0,caption:!0}),n=[],c=document.createElement("div");if(c.classList.add("input-wrapper"),this.chatNameInputField=new r.ZP({label:i?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new r.ZP({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(t.title),this.descriptionInputField.setOriginalValue(e.about),c.append(this.chatNameInputField.container,this.descriptionInputField.container),n.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new d.Z({peerId:m,inputFields:n,listenerSetter:this.listenerSetter,popupOptions:{isForum:t.pFlags.forum}}),this.content.append(this.editPeer.nextBtn),s.content.append(this.editPeer.avatarEdit.container,c),a){const n=new l.ZP({titleLangKey:i?"ChannelType":"GroupType",clickable:()=>{const t=this.slider.createTab(x);t.chatId=this.chatId,t.chatFull=e,t.open()},icon:"lock",listenerSetter:this.listenerSetter}),a=()=>{let e;const s=(0,P.Z)(t)[0];e=i?s?"TypePublic":"TypePrivate":s?"TypePublicGroup":"TypePrivateGroup",n.subtitle.replaceChildren((0,b.ag)(e))};a(),f(a),s.content.append(n.container)}if(a||o){const t=new l.ZP({titleLangKey:"Reactions",icon:"reactions",clickable:()=>{const e=this.slider.createTab(Q);e.chatId=this.chatId,e.open()},listenerSetter:this.listenerSetter}),i=(yield this.managers.appReactionsManager.getAvailableReactions()).filter((e=>!e.pFlags.inactive)).length,n=()=>{var s;const n=null!==(s=e.available_reactions)&&void 0!==s?s:{_:"chatReactionsNone"};if("chatReactionsSome"===n._){const e=n.reactions.length;e===i?(0,_.Z)(t.subtitle,(0,b.ag)("ReactionsAll")):t.subtitle.textContent=e+"/"+i}else(0,_.Z)(t.subtitle,(0,b.ag)("chatReactionsAll"===n._?"ReactionsAll":"Checkbox.Disabled"))};n(),f(n,"full"),s.content.append(t.container)}if(o&&!i){const e=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],i=new l.ZP({titleLangKey:"ChannelPermissions",clickable:()=>{const e=this.slider.createTab(V);e.chatId=this.chatId,e.open()},icon:"permissions",listenerSetter:this.listenerSetter}),n=()=>{i.subtitle.textContent=e.reduce(((e,i)=>e+ +(0,B.Z)(t,i,t.default_banned_rights)),0)+"/"+e.length};n(),f(n),s.content.append(i.container)}if(h&&(t.participants_count>=u.forum_upgrade_participants_min||t.pFlags.forum)&&!i){const e=new l.ZP({checkboxField:new L.Z({toggle:!0}),titleLangKey:"Topics",clickable:()=>{},icon:"topics",listenerSetter:this.listenerSetter}),i=()=>{const i=!!t.pFlags.forum;this.editPeer.avatarElem.parentElement.classList.toggle("is-forum",i),e.checkboxField.setValueSilently(i)};this.listenerSetter.add(e.checkboxField.input)("change",(t=>{if(!t.isTrusted)return;const i=this.managers.appChatsManager.toggleForum(this.chatId,e.checkboxField.checked);e.disableWithPromise(i)})),i(),f(i),s.caption.replaceChildren((0,b.ag)("ForumToggleDescription")),s.content.append(e.container)}if(s.caption.classList.toggle("hide",!s.caption.childElementCount),this.scrollable.append(s.container),(0,S.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;const e=[],t=this.chatId;this.chatNameInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editTitle(t,this.chatNameInputField.value)),this.descriptionInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editAbout(t,this.descriptionInputField.value)),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appChatsManager.editPhoto(t,e)))),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}),{listenerSetter:this.listenerSetter}),i&&(yield this.managers.appChatsManager.hasRights(this.chatId,"change_info"))){const e=new L.Z({text:"ChannelSignMessages",checked:!!t.pFlags.signatures});this.listenerSetter.add(e.input)("change",(()=>{const t=e.toggleDisability(!0);this.managers.appChatsManager.toggleSignatures(this.chatId,e.checked).then((()=>{t()}))})),f((()=>{e.setValueSilently(!!t.pFlags.signatures)})),s.content.append((0,l.tG)(e).container)}}if(!i){const t=new E.Z({});if(!i&&a){const i=new L.Z({text:"ChatHistory"});this.listenerSetter.add(i.input)("change",(()=>{const e=i.toggleDisability(!0);this.managers.appChatsManager.togglePreHistoryHidden(this.chatId,!i.checked).then((()=>{e()}))}));const s=()=>{i.setValueSilently(n&&!e.pFlags.hidden_prehistory)};s(),f(s),t.content.append((0,l.tG)(i).container)}t.content.childElementCount&&this.scrollable.append(t.container)}if(yield this.managers.appChatsManager.hasRights(this.chatId,"delete_chat")){const e=new E.Z({}),t=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:i?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});(0,S.fc)(t,(()=>{new K.Z(m,void 0,(e=>{const i=(0,C.Z)([t],!0);e.then((()=>{this.close()}),(()=>{i()}))}))}),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}n||this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{m===e&&(this.chatId=t.toChatId(),this._init())}))}))}init(){return this._init()}}var J=i(8842),ee=i(4240),te=i(2230),ie=i(5670),se=i(8261),ne=i(4993),ae=i(730),oe=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const re={};class de extends a._{init(){this.container.classList.add("shared-media-container","profile-container");const e=(0,c.Z)("btn-icon sidebar-close-button",{noRipple:!0});this.closeBtn.replaceWith(e),this.closeBtn=e;const t=document.createElement("div");t.classList.add("animated-close-icon"),e.append(t),this.isFirst&&t.classList.add("state-back");const i=document.createElement("div");i.className="transition slide-fade";const a=document.createElement("div");a.classList.add("transition-item"),this.titleI18n=new b.ZP.IntlElement,this.title.append(this.titleI18n.element),this.editBtn=(0,te.Z)("edit"),a.append(this.title,this.editBtn);const r=document.createElement("div");r.classList.add("transition-item");const d=this.title.cloneNode();d.append((0,b.ag)("PeerInfo.SharedMedia")),r.append(d),i.append(a,r),this.header.append(i),this.profile=new se.Z(this.managers,this.scrollable,this.listenerSetter),this.profile.init(),this.scrollable.append(this.profile.element),this.scrollable.onAdditionalScroll=()=>{const e=this.searchSuper.nav.getBoundingClientRect();if(!e.width)return;const t=e.top-1;l(t<=56)};const l=e=>{t.classList.toggle("state-back",this.isFirst||e),this.searchSuper.container.classList.toggle("is-full-viewport",e),h(+e),e||this.searchSuper.cleanScrollPositions()},h=(0,o.Z)({content:i,type:"slide-fade",transitionTime:400,isHeavy:!1});h(0),(0,S.fc)(this.closeBtn,(e=>{h.prevId()?(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),h(0),this.isFirst||t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()}),{listenerSetter:this.listenerSetter}),(0,S.fc)(this.editBtn,(()=>oe(this,void 0,void 0,(function*(){let e;const{peerId:t,threadId:i}=this;e=i&&(yield this.managers.appPeersManager.isForum(t))?this.slider.createTab(ae.Z):t.isAnyChat()?this.slider.createTab(X):this.slider.createTab(ee.Z),e&&(e instanceof ae.Z?e.open(t,this.threadId):(e instanceof X?e.chatId=t.toChatId():e.peerId=t,e.open()))}))),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(s.Z)("contacts_update",(e=>{this.peerId===e&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("chat_update",(e=>{this.peerId===e.toPeerId(!0)&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("history_multiappend",(e=>{this.renderNewMessage(e)})),this.listenerSetter.add(s.Z)("history_delete",(({peerId:e,msgs:t})=>{this.deleteDeletedMessages(e,Array.from(t))})),this.listenerSetter.add(s.Z)("message_sent",(({message:e})=>{this.renderNewMessage(e)})),this.searchSuper=new n.Z({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"PeerMedia.Members",type:"members"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:this.scrollable,onChangeTab:e=>{const t="members"===e.type&&s.Z.settings.animationsEnabled?250:0;setTimeout((()=>{u.classList.toggle("is-hidden","members"!==e.type)}),t)},managers:this.managers}),this.searchSuper.scrollStartCallback=()=>{l(!0)},this.profile.element.append(this.searchSuper.container);const u=(0,w.Z)({icon:"addmember_filled"});this.content.append(u),(0,S.fc)(u,(()=>oe(this,void 0,void 0,(function*(){const e=this.peerId,t=this.peerId.toChatId(),i=yield this.managers.appChatsManager.isChannel(t),s=(t,s)=>{let n,a,o,r,d;if(t.length>1)n="AddMembersAlertTitle",a=[(0,b.ag)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map((e=>{const t=document.createElement("b");return t.append(new J.Z({peerId:e}).element),t})),i||(d=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new J.Z({peerId:t[0]}).element),r=[e],i||(d=[{text:"AddOneMemberForwardMessages",textArgs:[new J.Z({peerId:t[0]}).element],checked:!0}])}r.push(new J.Z({peerId:e}).element),new y.Z("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:s}],checkboxes:d}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&&(0,m.bC)({langPackKey:"InviteToGroupError"})};if(i){const e=this.slider.createTab(ie.Z);e.open({type:"channel",skippable:!1,takeOut:i=>(s(i,(()=>{const s=this.managers.appChatsManager.inviteToChannel(t,i);s.catch(n),e.attachToPromise(s)})),!1),title:"GroupAddMembers",placeholder:"SendMessageTo"})}else new O.Z({peerTypes:["contacts"],placeholder:"Search",onSelect:e=>{setTimeout((()=>{s([e],(i=>{this.managers.appChatsManager.addChatUser(t,e,i.size?void 0:0).catch(n)}))}),0)}})}))),{listenerSetter:this.listenerSetter})}_renderNewMessage(e,t){var i;const s=null===(i=re[e.peerId])||void 0===i?void 0:i[t];if(s)for(const t of this.searchSuper.mediaTabs){const i=t.inputFilter,n=s[i];if(!n)continue;const a=this.searchSuper.filterMessagesByType([e],i).filter((e=>!n.find((t=>t.mid===e.mid&&t.peerId===e.peerId))));a.length&&(n.unshift(...a.map((e=>({mid:e.mid,peerId:e.peerId})))),this.peerId===e.peerId&&-1!==this.searchSuper.usedFromHistory[i]&&(this.searchSuper.usedFromHistory[i]+=a.length,this.searchSuper.performSearchResult(a,t,!1)))}}renderNewMessage(e){return oe(this,void 0,void 0,(function*(){if(this.init)return;const{peerId:t}=e,i=yield this.managers.appPeersManager.isForum(t),s=(0,ne.Z)(e,i);this._renderNewMessage(e),s&&this._renderNewMessage(e,s)}))}_deleteDeletedMessages(e,t,i){for(const s of i)for(const i of this.searchSuper.mediaTabs){const n=i.inputFilter,a=e[n];if(!a)continue;const o=a.findIndex((e=>e.mid===s));if(-1!==o&&(a.splice(o,1),this.peerId===t)){const e=this.searchSuper.tabs[n].querySelector(`[data-mid="${s}"][data-peer-id="${t}"]`);e&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(e),e.remove()),this.searchSuper.usedFromHistory[n]>=o+1&&--this.searchSuper.usedFromHistory[n]}}}deleteDeletedMessages(e,t){if(this.init)return;const i=re[e];if(i){for(const s in i)this._deleteDeletedMessages(i[s],e,t);this.scrollable.onScroll()}}cleanupHTML(){return oe(this,void 0,void 0,(function*(){const e=this.peerId.isAnyChat(),[t,i]=yield Promise.all([!!e&&this.searchSuper.canViewMembers(),!!e&&this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"invite_users")]);return()=>{this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",t&&i)}}))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t){var i,s,n;return(this.peerId!==e||this.threadId!==t)&&(this.peerId=e,this.threadId=t,this.peerChanged=!0,this.init&&(this.init(),this.init=null),this.searchSuper.setQuery({peerId:e,threadId:t,historyStorage:null!==(s=(n=null!==(i=re[e])&&void 0!==i?i:re[e]={})[t])&&void 0!==s?s:n[t]={}}),this.profile.setPeer(e,t),!0)}changeTitleKey(){return oe(this,void 0,void 0,(function*(){const e=this.managers.appPeersManager.isForum(this.peerId);return()=>{this.titleI18n.compareAndUpdate({key:this.threadId&&e?"AccDescrTopic":"Profile"})}}))}fillProfileElements(){return oe(this,void 0,void 0,(function*(){if(!this.peerChanged)return;this.peerChanged=!1;const e=yield Promise.all([this.cleanupHTML(),this.toggleEditBtn(!0),this.profile.fillProfileElements(),this.changeTitleKey()]);return()=>{e.forEach((e=>{null==e||e()}))}}))}toggleEditBtn(e){return oe(this,void 0,void 0,(function*(){let t;if(this.peerId.isUser())t=this.peerId!==s.Z.myId&&(yield this.managers.appUsersManager.isContact(this.peerId.toUserId()));else{const e=this.peerId.toChatId(),i=this.threadId&&(yield this.managers.appChatsManager.isForum(e));t=yield this.managers.appChatsManager.hasRights(e,i?"manage_topics":"change_info")}const i=()=>{this.editBtn.classList.toggle("hide",!t)};return e?i:i()}))}loadSidebarMedia(e,t){this.searchSuper.load(e,t)}onOpenAfterTimeout(){super.onOpenAfterTimeout(),this.scrollable.onScroll()}onCloseAfterTimeout(){super.onCloseAfterTimeout(),this.destroyable&&(this.profile.destroy(),this.searchSuper.destroy())}destroy(){this.destroyable=!0,this.onCloseAfterTimeout()}}},9099:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512);const n=e=>{const{element:t,className:i,forwards:a,duration:o,onTransitionEnd:r,onTransitionStart:d,useRafs:l}=e,{timeout:c,raf:h}=t.dataset;if(void 0!==c&&clearTimeout(+c),void 0!==h&&(window.cancelAnimationFrame(+h),l||delete t.dataset.raf),l&&s.Z.settings.animationsEnabled&&o)return void(t.dataset.raf=""+window.requestAnimationFrame((()=>{delete t.dataset.raf,n(Object.assign(Object.assign({},e),{useRafs:l-1}))})));a&&i&&t.classList.add(i);const u=()=>{delete t.dataset.timeout,!a&&i&&t.classList.remove("backwards",i),t.classList.remove("animating"),null==r||r()};if(null==d||d(),!s.Z.settings.animationsEnabled||!o)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!a),t.dataset.timeout=""+setTimeout(u,o)},a=n},3552:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,_:()=>a.Z});var s=i(426),n=i(6385),a=i(6024),o=i(1655),r=i(5953),d=i(3624);class l{constructor(e){var t;this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{n.Z.findItemByType(this.navigationType)?n.Z.back(this.navigationType):this.historyTabIds.length&&this.closeTab(this.historyTabIds[this.historyTabIds.length-1])},this.closeTab=(e,t,i)=>{if(void 0!==e&&this.historyTabIds[this.historyTabIds.length-1]!==e)return this.removeTabFromHistory(e),!1;const s=this.historyTabIds.pop();this.onCloseTab(s,t,i);const n=this.historyTabIds[this.historyTabIds.length-1];return this._selectTab(void 0!==n?n instanceof a.Z?n.container:n:this.canHideFirst?-1:0,t),!0},(0,r.Z)(this,e),null!==(t=this.tabs)&&void 0!==t||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=(0,s.Z)({content:this.tabsContainer,type:"navigation",transitionTime:250}),this.canHideFirst||this._selectTab(0),this.middlewareHelper=(0,d.k)()}getMiddleware(){return this.middlewareHelper.get()}selectTab(e){var t,i,s,o,r;return i=this,s=void 0,r=function*(){if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const i=e instanceof a.Z?e:this.tabs.get(e);return this.onOpenTab&&(yield this.onOpenTab()),i&&(null===(t=i.onOpen)||void 0===t||t.call(i),i.onOpenAfterTimeout&&setTimeout((()=>{i.onOpenAfterTimeout()}),250)),n.Z.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof a.Z?e.container:e),!0},new((o=void 0)||(o=Promise))((function(e,t){function n(e){try{d(r.next(e))}catch(e){t(e)}}function a(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(i,s||[])).next())}))}removeTabFromHistory(e){(0,o.Z)(this.historyTabIds,e),this.onCloseTab(e,void 0)}sliceTabsUntilTab(e,t){for(let i=this.historyTabIds.length-1;i>=0;--i){const s=this.historyTabIds[i];if(s!==t){if(s instanceof e)break;this.removeTabFromHistory(s)}}}getTab(e){return this.historyTabIds.find((t=>t instanceof e))}getHistory(){return this.historyTabIds}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,i){var s;i||n.Z.removeByType(this.navigationType,!0);const o=e instanceof a.Z?e:this.tabs.get(e);if(o){try{null===(s=o.onClose)||void 0===s||s.call(o)}catch(e){console.error("tab onClose error",o)}o.onCloseAfterTimeout&&setTimeout((()=>{o.onCloseAfterTimeout()}),280)}}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}deleteTab(e){this.tabs.delete(e)}createTab(e,t=!0,i){const s=new e(i?void 0:this,t);return s.managers=this.managers,s}}},6024:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c,h:()=>h});var s=i(3241),n=i(3699),a=i(3624),o=i(319),r=i(2325),d=i(2230),l=i(8805);class c{constructor(e,t){this._constructor(e,t)}_constructor(e,t=!0){var i;this.slider=e,this.middlewareHelper=e?e.getMiddleware().create():(0,a.k)(),this.destroyable=t,this.container=document.createElement("div"),this.container.classList.add("tabs-tab","sidebar-slider-item"),this.header=document.createElement("div"),this.header.classList.add("sidebar-header"),this.closeBtn=(0,d.Z)("left sidebar-close-button",{noRipple:!0}),this.title=document.createElement("div"),this.title.classList.add("sidebar-header__title"),this.header.append(this.closeBtn,this.title),this.content=document.createElement("div"),this.content.classList.add("sidebar-content"),this.scrollable=new l.ZP(this.content,void 0,void 0,!0),this.scrollable.attachBorderListeners(this.container),this.container.append(this.header,this.content),null===(i=this.slider)||void 0===i||i.addTab(this),this.listenerSetter=new n.Z}close(){return this.slider.closeTab(this)}open(...e){return t=this,i=void 0,n=function*(){if(this.init)try{const t=this.init(...e);this.init=null,t instanceof Promise&&(yield t)}catch(e){console.error("open tab error",e)}this.slider.selectTab(this)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}init(...e){}onOpen(){}onOpenAfterTimeout(){}onClose(){}onCloseAfterTimeout(){var e,t,i;this.destroyable&&(null===(e=this.slider)||void 0===e||e.deleteTab(this),this.container.remove(),this.scrollable.destroy(),null===(t=this.listenerSetter)||void 0===t||t.removeAll(),null===(i=this.middlewareHelper)||void 0===i||i.destroy())}setTitle(e){this.title.replaceChildren((0,r.ag)(e))}}class h extends c{constructor(e){super(e),this.eventListener=new s.Z}onClose(){this.eventListener.dispatchEvent("close")}onCloseAfterTimeout(){const e=this.eventListener.dispatchResultableEvent("destroy");return this.eventListener.dispatchEvent("destroyAfter",Promise.all(e).then(o.Z,o.Z)),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}},2894:(e,t,i)=>{"use strict";i.d(t,{Z:()=>p});var s=i(8130),n=i(8594),a=i(8487),o=i(4484),r=i(5565),d=i(3035),l=i(5345),c=i(5953),h=i(3061),u=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class p extends l.Z{constructor(e){let t;super({getIndex:e.getIndex||(e=>this.managers.appUsersManager.getUserStatusForSort(e.id)),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onUpdate:e.onUpdate||(e=>u(this,void 0,void 0,(function*(){const t=(0,h.Z)(yield this.managers.appUsersManager.getUser(e.id));(0,r.Z)(e.dom.lastMessageSpan,t)}))),onSort:(e,t)=>{const i=e.dom.listEl.parentElement!==this.list;(0,o.Z)(e.dom.listEl,this.list,t),i&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=s.default.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,wrapOptions:{lazyLoadQueue:this.lazyLoadQueue}});return e.dom=t,e},updateElementWith:d.T2,updateListWith:e=>u(this,void 0,void 0,(function*(){return(0,a.Z)(this.list)?(yield(0,n.e9)(),(0,a.Z)(this.list)?void e(!0):e(!1)):e(!1)}))}),this.avatarSize="abitbigger",this.rippleEnabled=!0,this.autonomous=!0,(0,c.Z)(this,e),this.list=s.default.createChatList(this.createChatListOptions);const i=()=>{t=window.setTimeout((()=>{this.updateList((e=>{e&&i()}))}),p.SORT_INTERVAL)};i()}}p.SORT_INTERVAL=3e4},9259:(e,t,i)=>{"use strict";i.d(t,{Z:()=>I});var s=i(5432),n=i(3910),a=i(2738),o=i(5975),r=i(8497),d=i(8204),l=i(9405),c=i(3624),h=i(3035),u=i(5418),p=i(241),f=i(13),m=i(8115),g=i(5400),v=i(1447),b=i(3772),y=i(3512),w=i(5814),S=i(9099),C=i(3541),L=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let E=!1;function I({listenTo:e,listenerSetter:t,selector:i,findTarget:I}){if(s.Z)return;const M=(t,s)=>{let n;if(I)n=I(t);else{const e=i||".media-sticker-wrapper";n=t.target.closest(e)}return!n||s&&!(0,o.Z)(n,e)?void 0:n},P=y.Z.managers;t.add(e)("mousedown",(e=>{if(E||e.buttons>1||0!==e.button)return;let t=M(e);if(!t)return;const i=t.dataset.docId;if(!i)return;const s="sticker-viewer",y="STICKER-VIEWER",I=w.Z.getOnlyOnePlayableGroup(),Z=(0,c.k)();let T,k;const x=({mediaContainer:e,doc:t,middleware:i,lockGroups:n,isSwitching:o})=>L(this,void 0,void 0,(function*(){const c=(0,f.Z)(t),S=e.getBoundingClientRect(),L=(0,l.C)(t.w,t.h),E=c?280:360,I=(0,l.C)(E,E),M=S.width===S.height?I:L.aspectFitted(I),Z=(0,r.Z)(e,"bubble"),k=!Z||Z.classList.contains("is-out"),x=document.createElement("div");x.classList.add(s+"-transformer");const A=document.createElement("div");A.classList.add(s+"-sticker"),A.style.width=M.width+"px",A.style.height=M.height+"px";const _=document.createElement("div");if(_.classList.add(s+"-emoji"),_.append((0,m.Z)(t.stickerEmojiRaw)),c){const e=(E*C.Vp-E)/3*(k?1:-1);x.classList.add("has-effect"),x.style.setProperty("--translateX",`${e}px`),_.style.setProperty("--translateX",-e+"px")}const F=(0,r.Z)(e,"scrollable"),D=(0,d.Z)(e,F,!0,S);(D.overflow.vertical||D.overflow.horizontal)&&A.classList.add("is-overflow");const R=e.getBoundingClientRect(),B=R.width/M.width,N=R.height/M.height,O=R.left-(p.Z.width-R.width)/2,U=R.top-(p.Z.height-R.height)/2;x.style.transform=`translate(${O}px, ${U}px) scale(${B}, ${N})`,o&&x.classList.add("is-switching"),x.append(A,_),T.append(x);const H=yield(0,C.ZP)({doc:t,div:A,group:y,width:M.width,height:M.height,play:!1,loop:!0,middleware:i,managers:P,needFadeIn:!1,isOut:k,withThumb:!1,relativeEffect:!0,loopEffect:!0}).then((({render:e})=>e));if(!i())return;T.parentElement||document.body.append(T);const z=Array.isArray(H)?H[0]:H,j=z instanceof b.Z?new Promise((e=>z.addEventListener("firstFrame",e,{once:!0}))):Promise.resolve();if(yield Promise.all([j,(0,h.d1)()]),yield(0,u.Z)(0),i()){if(n&&(w.Z.setOnlyOnePlayableGroup(y),w.Z.checkAnimations2(!0)),z instanceof b.Z){const t=e instanceof g.LD?e.player:v.Z.getAnimation(e);if(t){if(z.curFrame=t.curFrame,z.play(),yield new Promise((e=>{let t=0;const i=()=>{2==++t&&(e(),z.removeEventListener("enterFrame",i))};z.addEventListener("enterFrame",i)})),!i())return;z.pause()}}else if(z instanceof HTMLVideoElement){const t=e.querySelector("video");t&&(z.currentTime=t.currentTime)}return{ready:()=>{(z instanceof b.Z||z instanceof HTMLVideoElement)&&z.play(),c&&(0,a.tH)(A)},transformer:x}}})),A=window.setTimeout((()=>L(this,void 0,void 0,(function*(){document.removeEventListener("mousemove",F),T=document.createElement("div"),T.classList.add(s),E=!0;const e=Z.get(),n=yield P.appDocsManager.getDoc(i);if(!e())return;let a;try{if(a=yield x({doc:n,mediaContainer:t,middleware:e,lockGroups:!0}),!a)return}catch(e){return}const{ready:o,transformer:r}=a;k=r,(0,S.Z)({element:T,className:"is-visible",forwards:!0,duration:200,onTransitionEnd:()=>{e()&&o()}}),document.addEventListener("mousemove",_)}))),125),_=e=>L(this,void 0,void 0,(function*(){const i=M(e,!0);if(!i||t===i)return;const s=i.dataset.docId;if(!s)return;t=i,Z.clean();const n=Z.get(),a=yield P.appDocsManager.getDoc(s);if(!n())return;let o;try{if(o=yield x({doc:a,mediaContainer:t,middleware:n,isSwitching:!0}),!o)return}catch(e){return void console.error("sticker viewer error",e)}const{ready:r,transformer:d}=o,l=k;(0,S.Z)({element:l,className:"is-switching",forwards:!0,duration:200,onTransitionEnd:()=>{l.remove()}}),k=d,(0,S.Z)({element:d,className:"is-switching",forwards:!1,duration:200,onTransitionEnd:()=>{n()&&r()}})})),F=e=>{(0,o.Z)(e.target,t)||D()},D=()=>{clearTimeout(A),Z.clean(),T&&((0,S.Z)({element:T,className:"is-visible",forwards:!1,duration:200,onTransitionEnd:()=>{T.remove(),w.Z.setOnlyOnePlayableGroup(I),w.Z.checkAnimations2(!1),E=!1}}),(0,a.fc)(document.body,n.Z,{capture:!0,once:!0})),document.removeEventListener("mousemove",F),document.removeEventListener("mousemove",_),document.removeEventListener("mouseup",D,{capture:!0})};document.addEventListener("mousemove",F),document.addEventListener("mouseup",D,{once:!0,capture:!0})}))}},5117:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e,t){this.container=e,this.handler=t,this.observeHeaders(),this.observeElements()}observeHeaders(){this.headersObserver=new IntersectionObserver((e=>{for(const t of e){const e=t.boundingClientRect,i=t.target.parentElement,s=t.rootBounds;e.bottom=s.top&&e.bottom{const t=e.filter((e=>e.boundingClientRect.tope.boundingClientRect.top-t.boundingClientRect.top))[0];if(!t)return;const i=t.isIntersecting?t.target:t.target.nextElementSibling;this.handler(!0,i)}),{root:this.container})}addSentinel(e,t){const i=document.createElement("div");return i.classList.add("sticky_sentinel",t),e.appendChild(i)}observeStickyHeaderChanges(e){const t=this.addSentinel(e,"sticky_sentinel--top");this.headersObserver.observe(t),this.elementsObserver.observe(e)}disconnect(){this.headersObserver.disconnect(),this.elementsObserver.disconnect()}unobserve(e,t){this.elementsObserver.unobserve(e),this.headersObserver.unobserve(t)}}},3757:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(3910),n=i(5432),a=i(5953),o=i(3416),r=i(3699),d=i(6976),l=i(5418),c=i(3725);const h=e=>"touches"in e?e.touches[0]:e,u=document;let p=!1;o.Z.addEventListener("toggle",(e=>{p=e}));const f={passive:!1},m=!1;class g{constructor(e){var t,i,o,d,g;this.reset=e=>{var t;n.Z?this.listenerSetter.removeManual(u,"touchmove",this.handleMove,f):(this.listenerSetter.removeManual(u,"mousemove",this.handleMove,m),this.setCursorTo.style.cursor=""),this.hadMove&&(null===(t=this.onReset)||void 0===t||t.call(this)),this.resetValues()},this.handleStart=e=>{return t=this,i=void 0,a=function*(){var t;if(this.isMouseDown)return;const i=h(e);if(0!==Math.max(0,null!==(t=i.button)&&void 0!==t?t:0))return;if(this.verifyTouchTarget&&!(yield this.verifyTouchTarget(e)))return this.reset();const s=++this.tempId;if(this.isMouseDown=!0,this.withDelay&&!n.Z){const e=Object.assign(Object.assign({},m),{once:!0}),t=(0,c.Z)(),i=()=>t.resolve(),n=this.listenerSetter.add(u)("mousemove",i,e);if(yield Promise.race([(0,l.Z)(300),t]),t.resolve(),this.listenerSetter.remove(n),this.tempId!==s)return}this.xDown=i.clientX,this.yDown=i.clientY,this.eventUp=i,n.Z?this.listenerSetter.add(u)("touchmove",this.handleMove,f):this.listenerSetter.add(u)("mousemove",this.handleMove,m),this.onStart&&(this.onStart(),this.hadMove=!0,this.handleMove(i))},new((s=void 0)||(s=Promise))((function(e,n){function o(e){try{d(a.next(e))}catch(e){n(e)}}function r(e){try{d(a.throw(e))}catch(e){n(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,s,a},this.handleMove=e=>{var t;if(void 0===this.xDown||void 0===this.yDown||p)return void this.reset();this.cancelEvent&&(0,s.Z)(e);const i=this.eventUp=h(e),a=i.clientX,o=i.clientY,r=a-this.xDown+this.xAdded,d=o-this.yDown+this.yAdded;if(!this.hadMove){if(!r&&!d)return;this.hadMove=!0,n.Z||this.setCursorTo.style.setProperty("cursor",this.cursor,"important"),null===(t=this.onFirstSwipe)||void 0===t||t.call(this,e)}const l=this.onSwipe(r,d,e);void 0!==l&&l&&this.reset()},(0,a.Z)(this,e),null!==(t=this.cursor)&&void 0!==t||(this.cursor="grabbing"),null!==(i=this.cancelEvent)&&void 0!==i||(this.cancelEvent=!0),null!==(o=this.listenerOptions)&&void 0!==o||(this.listenerOptions=f),null!==(d=this.setCursorTo)&&void 0!==d||(this.setCursorTo=this.element),this.listenerSetter=new r.Z,this.setListeners(),this.resetValues(),this.tempId=0,null===(g=e.middleware)||void 0===g||g.onDestroy((()=>{this.reset(),this.removeListeners()}))}setListeners(){n.Z?(this.withDelay?(0,d.E)({element:this.element,callback:e=>{(0,s.Z)(e),this.handleStart(e)},listenerSetter:this.listenerSetter,listenerOptions:this.listenerOptions}):this.listenerSetter.add(this.element)("touchstart",this.handleStart,this.listenerOptions),this.listenerSetter.add(u)("touchend",this.reset)):(this.listenerSetter.add(this.element)("mousedown",this.handleStart,this.listenerOptions),this.listenerSetter.add(u)("mouseup",this.reset))}removeListeners(){this.listenerSetter.removeAll()}setCursor(e=""){this.cursor=e,!n.Z&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}add(e,t){this.xAdded=e,this.yAdded=t,this.handleMove({clientX:this.eventUp.clientX,clientY:this.eventUp.clientY,target:this.eventUp.target})}resetValues(){++this.tempId,this.hadMove=!1,this.xAdded=this.yAdded=0,this.xDown=this.yDown=this.eventUp=this.isMouseDown=void 0}}},709:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(2398),n=i(6272),a=i(4762),o=i(503);class r extends o.ZP{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");const t=this.input;if(t instanceof HTMLInputElement)t.type="tel",t.autocomplete="rr55RandomRR55";else{t.inputMode="decimal";const e=window.devicePixelRatio;if(e>1){let i;a.IS_APPLE?i=-.16*e:a.IS_ANDROID&&(i=0),t.style.setProperty("--letter-spacing",i+"px")}const i=this.setValueSilently.bind(this);this.setValueSilently=e=>{i(e),(0,s.Z)(this.input,!0)}}t.addEventListener("input",(()=>{t.classList.remove("error");const i=this.value;let s;Math.abs(i.length-this.lastValue.length)>1&&!this.pasted&&a.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+i),this.pasted=!1,this.setLabel();let o,r,d,l="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(s=(0,n.u)(this.value),o=s.formatted,r=s.country,l=s.leftPattern,d=s.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),t.dataset.leftPattern=l,e.onInput&&e.onInput(s)})),t.addEventListener("paste",(()=>{this.pasted=!0})),t.addEventListener("keypress",(e=>{const t=e.key;if(/\D/.test(t)&&!e.metaKey&&!e.ctrlKey&&"Backspace"!==t&&("+"!==t||!e.shiftKey))return e.preventDefault(),!1}))}}},2796:(e,t,i)=>{"use strict";i.d(t,{Am:()=>c,PE:()=>l,bC:()=>h});var s=i(5565),n=i(2296),a=i(2325);const o=document.createElement("div");let r;o.classList.add("toast");const d=new n.Z("toast");function l(){d.close(),o.classList.remove("is-visible"),r&&clearTimeout(+r),r=window.setTimeout((()=>{o.remove(),r=void 0}),200)}function c(e,t){d.close(),(0,s.Z)(o,e),o.parentElement||(document.body.append(o),o.offsetLeft),o.classList.add("is-visible"),r&&clearTimeout(+r),d.open(o),r=window.setTimeout(l,3e3),t&&d.addEventListener("toggle",t,{once:!0})}function h(e){c((0,a.ag)(e.langPackKey,e.langPackArguments),e.onClose)}d.addEventListener("toggle",(e=>{e||l()}))},426:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(3512),n=i(3725),a=i(8594),o=i(2648),r=i(3910);const d={navigation:{callback:(e,t,i)=>{const s=t.getBoundingClientRect().width,n=[e,t];return i&&n.reverse(),n[0].style.filter="brightness(80%)",n[0].style.transform=`translate3d(${.25*-s}px, 0, 0)`,n[1].style.transform=`translate3d(${s}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",e.style.filter="",()=>{t.style.transform=t.style.filter=""}},animateFirst:!1},tabs:{callback:(e,t,i)=>{const s=t.getBoundingClientRect().width,n=[e,t];return i&&n.reverse(),n[0].style.transform=`translate3d(${-s}px, 0, 0)`,n[1].style.transform=`translate3d(${s}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",()=>{t.style.transform=""}},animateFirst:!1}},l=e=>{let{content:t,type:i,transitionTime:l,onTransitionEnd:c,isHeavy:h=!0,once:u=!1,withAnimationListener:p=!0,listenerSetter:f,animateFirst:m=!1}=e;const{callback:g,animateFirst:v}=d[i]||{};t.dataset.animation=i,void 0!==v&&(m=v);const b=new Map;let y,w=null;if(p){const e=g?"transitionend":"animationend",i=s=>{if((0,r.Z)(s),s.target.parentElement!==t)return;const n=b.get(s.target);null==n||n(),s.target===w&&(!y&&h||(y&&(y.resolve(),y=void 0),null==c||c(S.prevId()),t.classList.remove("animating","backwards","disable-hover"),u&&(f?f.removeManual(t,e,i):t.removeEventListener(e,i),w=y=void 0,b.clear())))};f?f.add(t)(e,i):t.addEventListener(e,i)}function S(e,i=!0,r){r&&(w=r),e instanceof HTMLElement&&(e=(0,o.Z)(e));const d=S.prevId();if(e===d)return!1;const u=t.children[e];if(s.Z.settings.animationsEnabled&&(-1!==d||m)||(i=!1),!p){const e=t.dataset.timeout;void 0!==e&&clearTimeout(+e),delete t.dataset.timeout}if(!i){if(w)w.classList.remove("active","to","from");else if(u){const e=b.get(u);null==e||e()}return u&&(u.classList.remove("to","from"),u.classList.add("active")),t.classList.remove("animating","backwards","disable-hover"),w=u,void(null==c||c(e))}p||(t.dataset.timeout=""+window.setTimeout((()=>{u.classList.remove("to"),w&&w.classList.remove("from"),t.classList.remove("animating","backwards","disable-hover"),delete t.dataset.timeout}),l)),w&&(w.classList.remove("to"),w.classList.add("from")),t.classList.add("animating");const f=d{u.classList.remove("to"),b.delete(u)}))}if(w){let e;const t=w,i=()=>{clearTimeout(e),t.classList.remove("active","from"),null==v||v(),b.delete(t)};u?(e=window.setTimeout(i,l+100),b.set(t,i)):(e=window.setTimeout(i,l),b.set(t,(()=>{clearTimeout(e),b.delete(t)}))),t.dataset.transitionTimeout=""+e,h&&(y||(y=(0,n.Z)()),(0,a.YW)(y,2*l))}w=u}return S.prevId=()=>w?(0,o.Z)(w):-1,S.getFrom=()=>w,S.setFrom=e=>w=e,S}},6726:(e,t,i)=>{"use strict";i.d(t,{l:()=>o});var s=i(5701),n=i(503);function a(e){return(e.length>=3&&e.length<=32||!e.length)&&/^[a-zA-Z0-9_]*$/.test(e)}class o extends n.ZP{constructor(e,t){super(e),this.managers=t,this.checkUsernameDebounced=(0,s.Z)(this.checkUsername.bind(this),150,!1,!0),e.listenerSetter.add(this.input)("input",(()=>{var e,t,i,s;const o=this.getValue();if(this.error=void 0,o===this.originalValue||!o.length)return this.setState(n.I1.Neutral),void(null===(t=(e=this.options).onChange)||void 0===t||t.call(e));a(o)?this.setState(n.I1.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?null===(s=(i=this.options).onChange)||void 0===s||s.call(i):this.checkUsernameDebounced(o)}))}getValue(){let e=this.value;return this.options.head&&(e=e.slice(this.options.head.length),this.setValueSilently(this.options.head+e)),e}checkUsername(e){if(this.checkUsernamePromise)return;let t;this.error=void 0,t=this.options.peerId?this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(),e):this.managers.appUsersManager.checkUsername(e);const i=this.checkUsernamePromise=t.then((t=>{this.getValue()===e&&(t?this.setState(n.I1.Valid,this.options.availableText):this.setError(this.options.takenText))}),(t=>{this.getValue()===e&&(this.error=t,"USERNAME_PURCHASE_AVAILABLE"===t.type?this.setError(this.options.takenText):this.setError(this.options.invalidText))})).then((()=>{var t,s;this.checkUsernamePromise===i&&(this.checkUsernamePromise=void 0),null===(s=(t=this.options).onChange)||void 0===s||s.call(t);const n=this.getValue();n!==e&&this.isValidToChange()&&a(n)&&this.checkUsername(n)}))}}},9522:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(2738),n=i(5975),a=i(2398),o=i(4484),r=i(2914),d=i(319),l=i(5345),c=i(2325),h=i(3512),u=i(5592),p=i(7479),f=i(5029),m=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class g extends f.Z{constructor(e){super({name:"UsernamesProfileHeader",caption:e.peerId.isUser()?"UsernamesProfileHelp":"UsernamesChannelHelp"});const{peerId:t,peer:i,usernameInputField:f,listenerSetter:g,middleware:v}=e,b=h.Z.managers,y=t.isUser()?void 0:t.toChatId(),w=this,S="usernames",C=document.createElement("div");let L;C.classList.add(S);const E=new l.Z({getIndex:e=>L.length-L.findIndex((t=>t.username===e.id)),onDelete:e=>{e.row.container.remove()},onSort:(e,t)=>{(0,o.Z)(e.row.container,C,t)},onElementCreate:e=>{const t=L.find((t=>t.username===e.id)),i=new p.ZP({title:"@"+t.username,subtitle:!0,clickable:!0}),s=!!t.pFlags.editable,n=!!t.pFlags.active;return s&&(i.container.dataset.editable="1"),i.container.dataset.username=t.username,i.container.classList.add(S+"-username"),i.subtitle.classList.add(S+"-username-status"),i.createMedia("medium").classList.add(S+"-username-icon","tgico"),i.makeSortable(),I(i,n),e.row=i,e}}),I=(e,t)=>{e.subtitle.replaceChildren((0,c.ag)(e.container.dataset.editable?"UsernameLinkEditable":t?"UsernameLinkActive":"UsernameLinkInactive")),e.container.classList.toggle("active",t),e.toggleSorting(t)},M=(e=[])=>{L=e,E.getAll().forEach((t=>{e.some((e=>e.username===t.id))||E.delete(t.id)})),e.forEach((e=>{if(E.has(e.username)){const t=E.get(e.username);E.update(e.username,t),I(t.row,!!e.pFlags.active)}else E.add(e.username)})),w.container.classList.toggle("hide",!E.getAll().size)};M(i.usernames),g.add(h.Z)("peer_title_edit",(({peerId:e})=>m(this,void 0,void 0,(function*(){if(e!==t)return;const i=yield b.appPeersManager.getPeer(t);M(i.usernames)}))));let P=!1;(0,s.fc)(C,(e=>m(this,void 0,void 0,(function*(){if(P)return void(P=!1);const t=(0,n.Z)(e.target,C);if(!t)return;if(t.dataset.editable)return void(0,a.Z)(f.input,!0,!0);const i=t.dataset.username,s=t.classList.contains("active");let o,r;s?(o="UsernameDeactivateLink",r=y?"UsernameDeactivateLinkChannelMessage":"UsernameDeactivateLinkProfileMessage"):(o="UsernameActivateLink",r=y?"UsernameActivateLinkChannelMessage":"UsernameActivateLinkProfileMessage");try{yield(0,u.Z)({titleLangKey:o,descriptionLangKey:r,button:{langKey:s?"Hide":"Show"}})}catch(e){return}const l=!s;let c;c=y?b.appChatsManager.toggleUsername(y,i,l):b.appUsersManager.toggleUsername(i,l),c.catch((e=>{"USERNAMES_ACTIVE_TOO_MUCH"===e.type?(0,u.Z)({titleLangKey:"UsernameActivateErrorTitle",descriptionLangKey:"UsernameActivateErrorMessage",button:{langKey:"OK",isCancel:!0}}).catch(d.Z):console.error("turn username error",e)}))})))),new r.Z({list:C,middleware:v,onSort:(e,t)=>{const i=L.splice(e,1)[0];L.splice(t,0,i),E.updateList();const s=L.filter((e=>e.pFlags.active)).map((e=>e.username));y?b.appChatsManager.reorderUsernames(y,s):b.appUsersManager.reorderUsernames(s)}}),w.content.append(C)}}},2940:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e,t){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver((t=>{if(this.locked)return;const i=[];t.forEach(((e,t)=>{const s=e.target;if(this.items.get(s)===e.isIntersecting)return;this.items.set(s,e.isIntersecting);const n={target:s,visible:e.isIntersecting,entry:e,index:t};i.push(n)})),i.forEach((t=>{e(t)}))}),t)}getVisible(){const e=[];return this.items.forEach(((t,i)=>{t&&e.push(i)})),e}clearVisible(){const e=this.getVisible();for(const t of e)this.items.set(t,!1)}isVisible(e){return this.items.get(e)}disconnect(){this.observer.disconnect(),this.items.clear()}refresh(){this.observer.disconnect();const e=[...this.items.keys()];for(const t of e)this.observer.observe(t)}refreshVisible(){const e=this.getVisible();for(const t of e)this.observer.unobserve(t);for(const t of e)this.observer.observe(t)}observe(e){this.items.set(e,!1),this.observer.observe(e)}unobserve(e){this.observer.unobserve(e),this.items.delete(e)}unlock(){this.locked=!1}unlockAndRefresh(){this.unlock(),this.refresh()}lock(){this.locked=!0}}},8427:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(3910),n=i(2738),a=i(3013),o=i(65);class r extends o.Z{constructor(e,t=!1){super({step:.01,min:0,max:1,vertical:t},1),this.listenerSetter=e,this.vertical=t,this.onMuteClick=e=>{e&&(0,s.Z)(e),a.Z.muted=!a.Z.muted},this.setVolume=()=>{const{volume:e,muted:t}=a.Z;let i;i=!e||t?0:e>.5?3:e>0&&e<.25?1:2,r.ICONS.forEach((e=>this.icon.classList.remove("tgico-"+e))),this.icon.classList.add("tgico-"+r.ICONS[i]),this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);a.Z.muted=!1,a.Z.volume=t}});const i="player-volume",o=this.btn=document.createElement("div");o.classList.add("btn-icon",i);const d=this.icon=document.createElement("span");d.classList.add(i+"__icon"),o.append(d,this.container),(0,n.fc)(d,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.Z)("playbackParams",this.setVolume),this.setVolume()}}r.ICONS=["volume_off","volume_mute","volume_down","volume_up"]},9083:(e,t,i)=>{"use strict";i.d(t,{N:()=>a,Z:()=>n});var s=i(5400);function n({docIds:e,loadPromises:t,middleware:i,lazyLoadQueue:n,customEmojiSize:a,animationGroup:o}){const r=" ".repeat(e.length),d=[];return e.forEach(((e,t)=>{d.push({_:"messageEntityCustomEmoji",offset:t,length:1,document_id:e})})),(0,s.ZP)(r,{entities:d,loadPromises:t,animationGroup:o,customEmojiSize:a,middleware:i,lazyLoadQueue:n})}function a(e){var t;const i=null!==(t=e.loadPromises)&&void 0!==t?t:e.loadPromises=[],s=n(e);return Promise.all(i).then((()=>s))}},296:(e,t,i)=>{"use strict";i.d(t,{Z:()=>I});var s=i(2341),n=i(467),a=i(632),o=i(2738),r=i(8497),d=i(4081),l=i(319),c=i(2312),h=i(4271),u=i(1243),p=i(7030),f=i(2325),m=i(1507),g=i(2491),v=i(3512),b=i(8448),y=i(3251),w=i(3442),S=i(9492),C=i(5671),L=i(1604),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function I({message:e,withTime:t,fontWeight:i,voiceAsMusic:I,showSender:M,searchContext:P,loadPromises:Z,autoDownloadSize:T,lazyLoadQueue:k,sizeType:x,managers:A=v.Z.managers,cacheContext:_,fontSize:F}){var D;return E(this,void 0,void 0,(function*(){null!=i||(i=500),null!=x||(x=""),null!=F||(F=0);const R=0===T,B=e.media.document||e.media.webpage.document,N=null==e?void 0:e.uploadingFileName;if("audio"===B.type||"voice"===B.type||"round"===B.type){const s=new b.ZP;return s.withTime=t,s.message=e,s.noAutoDownload=R,s.lazyLoadQueue=k,s.loadPromises=Z,I&&(s.voiceAsMusic=I),P&&(s.searchContext=P),M&&(s.showSender=M),s.dataset.fontWeight=""+i,s.dataset.fontSize=""+F,s.dataset.sizeType=x,yield s.render(),s}const O=B.file_name?B.file_name.split("."):"";let U="";U=O.length>1&&Array.isArray(O)?(0,n.ST)(O.pop().split(" ",1)[0].toLowerCase()):"file";const H=document.createElement("div");H.classList.add("document",`ext-${U}`),H.dataset.docId=""+B.id,H.doc=B;const z=document.createElement("div");let j;z.classList.add("document-ico");const G=!!_,V=()=>G?_:A.thumbsStorage.getCacheContext(B);_=yield V();let K=!1;if((null===(D=B.thumbs)||void 0===D?void 0:D.length)||e.pFlags.is_outgoing&&_.url&&"photo"===B.type){H.classList.add("document-with-thumb"),K=!0;const t=[];if(e.pFlags.is_outgoing&&["photo","video"].includes(B.type)&&_.url)z.innerHTML=``,t.push(z.firstElementChild);else{performance.now();const e=yield(0,S.Z)({photo:B,message:null,container:z,boxWidth:54,boxHeight:54,loadPromises:Z,withoutPreloader:!0,lazyLoadQueue:k,size:(0,p.Z)(B,54,54,!0),managers:A});z.style.width=z.style.height="",e.images.thumb&&t.push(e.images.thumb),e.images.full&&t.push(e.images.full)}t.forEach((e=>e.classList.add("document-thumb")))}else j=document.createElement("span"),j.classList.add("document-ico-text"),j.innerText=U,z.append(j);const W=B.file_name?(0,g.Z)(B.file_name):"Unknown.file";document.createElement("div").classList.add("document-description");const $=document.createElement("span"),q=[(0,d.Z)(B.size)];if(t&&q.push((0,a.OD)(e.date)),M&&q.push(yield(0,C.Z)(e)),!t&&!M){const e=document.createElement("span"),t=(0,d.Z)(B.size);e.append(" / ",t),e.style.visibility="hidden",q.push(e)}H.innerHTML=`\n ${_.downloaded&&!N||!e.mid||!K?"":'
'}\n
\n
\n `;const Q=H.querySelector(".document-name"),Y=new y.I;Y.dataset.fontWeight=""+i,Y.dataset.fontSize=""+F,Y.dataset.sizeType=x,Y.textContent=W,e.mid||H.classList.add("downloaded"),Q.append(Y),M&&Q.append((0,L.Z)(e));const X=H.querySelector(".document-size");if($.append(...(0,f.A1)(q," · ")),X.append($),H.prepend(z),!N&&e.pFlags.is_outgoing&&!e.mid)return H;let J,ee=null;const te=()=>{if(H.classList.remove("downloading"),B.size>m.Iw&&!N)return ee.setManual(),ee.attach(J),ee.preloader.classList.add("manual"),void ee.setDownloadFunction(se);if(B.size<=m.Iw&&H.classList.add("downloaded"),J){if(J!==z){const e=J;setTimeout((()=>{e.remove()}),200)}J=null}ee&&(ee=null)},ie=e=>{H.classList.add("downloading");const t=document.createElement("span"),i=(0,d.Z)(B.size);t.style.position="absolute",t.style.left="0",e.then(te,l.Z).finally((()=>{$.style.visibility="",t.remove()}));const s=e=>(0,d.Z)(e);let n=s(0);$.style.visibility="hidden",t.append(n," / ",i),$.parentElement.append(t),e.addNotifyListener((e=>{const t=s(e.done);n.replaceWith(t),n=t}))},se=e=>{var t;const i=!e||e.isTrusted,n=H.doc;let a;const o=h.ZP.chat.bubbles?h.ZP.chat.bubbles.lazyLoadQueue.queueId:void 0;if(i)if("pdf"===n.type){const e=!ee||ee.detached;a=c.Z.downloadMediaURL({media:n,queueId:o}),e&&a.then((()=>{setTimeout((()=>E(this,void 0,void 0,(function*(){const e=(yield V()).url;window.open(e)}))),v.Z.settings.animationsEnabled?250:0)}))}else a=s.Z.has(n.mime_type)&&(null===(t=n.thumbs)||void 0===t?void 0:t.length)?c.Z.downloadMediaURL({media:n,queueId:o}):c.Z.downloadToDisc({media:n,queueId:o});else a=c.Z.downloadToDisc({media:n,queueId:o},!0);a.catch((()=>{H.classList.remove("downloading")})),J&&(ee.attach(J,!0,a),ie(a))},{fileName:ne}=(0,u.Z)({media:B,downloadId:"1"});if(yield A.apiFileManager.isDownloading(ne)){J=H.querySelector(".document-download")||z;const e=c.Z.downloadToDisc({media:B},!0);ee=new w.Z,ee.attach(J,!1,e),ee.setDownloadFunction(se),ie(e)}else if(!_.downloaded||N)if(J=H.querySelector(".document-download")||z,ee=new w.Z({isUpload:!!N}),N){const e=c.Z.getUpload(N);ee.attachPromise(e),ee.attach(J),ie(e)}else ee.construct(),ee.setManual(),ee.attach(J),ee.setDownloadFunction(se),void 0!==T&&T>=B.size&&(0,o.tH)(ee.preloader);return(0,o.fc)(H,(e=>{(0,r.Z)(e.target,"time")||(ee?ee.onClick(e):se(e))})),H}))}v.Z.addEventListener("document_downloading",(e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach((e=>{e.querySelector(".preloader-container.manual")&&(0,o.tH)(e)}))}))},8210:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(6272);function n(e){return"+"+(0,s.u)(e).formatted}},177:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(2575),n=i(2325),a=i(3512);function o(e,t=a.Z.managers){var i,o,r,d,l,c;return r=this,d=void 0,c=function*(){const a=yield t.appChatsManager.getChat(e);if("chatForbidden"===a._)return(0,n.ag)("YouWereKicked");const r=yield t.appProfileManager.getCachedFullChat(e);let d;d=r?"channelFull"===r._?r.participants_count:null===(i=r.participants.participants)||void 0===i?void 0:i.length:a.participants_count||(null===(o=a.participants)||void 0===o?void 0:o.participants.length),d=d||1;const l=a.pFlags.broadcast?"Peer.Status.Subscribers":"Peer.Status.Member";return(0,n.ag)(l,[(0,s.Z)(d)])},new((l=void 0)||(l=Promise))((function(e,t){function i(e){try{n(c.next(e))}catch(e){t(e)}}function s(e){try{n(c.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof l?n:new l((function(e){e(n)}))).then(i,s)}n((c=c.apply(r,d||[])).next())}))}},493:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(8456),n=i(5102),a=i(2325),o=i(8115),r=i(3512);function d(e){return t=this,i=void 0,l=function*(){const{peerId:t=r.Z.myId,plainText:i,onlyFirstName:d,limitSymbols:l,managers:c=r.Z.managers,threadId:h}=e;let u="";if(t.isUser()){const e=yield c.appUsersManager.getUser(t.toUserId());e&&(e.first_name&&(u+=e.first_name),!e.last_name||d&&u||(u+=" "+e.last_name)),u=u?u.trim():!e||e.pFlags.deleted?a.ZP.format(d?"Deleted":"HiddenName",!0):(0,n.Z)(e)[0]||""}else{if(h){const e=yield c.dialogsStorage.getForumTopic(t,h);u=(null==e?void 0:e.title)||""}if(!u){const e=yield c.appChatsManager.getChat(t.toChatId());u=(null==e?void 0:e.title)||""}d&&(u=u.split(" ")[0])}return void 0!==l&&(u=(0,s.Z)(u,l,l)),i?u:(0,o.Z)(u)},new((d=void 0)||(d=Promise))((function(e,s){function n(e){try{o(l.next(e))}catch(e){s(e)}}function a(e){try{o(l.throw(e))}catch(e){s(e)}}function o(t){var i;t.done?e(t.value):(i=t.value,i instanceof d?i:new d((function(e){e(i)}))).then(n,a)}o((l=l.apply(t,i||[])).next())}));var t,i,d,l}},3061:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(632),n=i(2325),a=i(1507);function o(e){var t;if(!e)return document.createElement("span");let i,o;switch(e.id){case a.hj.toUserId():i="Peer.RepliesNotifications";break;case a.yF.toUserId():i="Peer.ServiceNotifications";break;default:if(e.pFlags.bot){i="Bot";break}if(e.pFlags.support){i="SupportStatus";break}switch(null===(t=e.status)||void 0===t?void 0:t._){case"userStatusRecently":i="Lately";break;case"userStatusLastWeek":i="WithinAWeek";break;case"userStatusLastMonth":i="WithinAMonth";break;case"userStatusOffline":{const t=e.status.was_online,n=new Date,a=(n.getTime()/1e3|0)-t;if(a<60)i="Peer.Status.justNow";else if(a<3600)i="Peer.Status.minAgo",o=[a/60|0];else if(a<86400&&n.getDate()===new Date(1e3*t).getDate())i="LastSeen.HoursAgo",o=[a/3600|0];else{i="Peer.Status.LastSeenAt";const{dateEl:e,timeEl:n}=(0,s.rz)(t);o=[e,n]}break}case"userStatusOnline":i="Online";break;default:i="ALongTimeAgo"}}return(0,n.ag)(i,o)}},6131:(e,t,i)=>{"use strict";i.d(t,{MR:()=>d,ZP:()=>c,kN:()=>l});var s=i(3910),n=i(1046),a=i(319),o=i(6628),r=i(9099);function d(e){const{mediaSpoiler:t,reveal:i,destroyAfter:s}=e;(0,r.Z)({element:t,forwards:i,className:"is-revealing",duration:250,onTransitionEnd:()=>{i&&s&&(t.remove(),t.middlewareHelper.destroy())}})}function l(e){const{mediaSpoiler:t,event:i}=e;if((0,s.Z)(i),t.classList.contains("is-revealing"))return;const n=t.parentElement.querySelector("video");n&&!t.parentElement.querySelector(".video-play")&&(n.autoplay=!0,n.play().catch(a.Z)),d({mediaSpoiler:t,reveal:!0,destroyAfter:!0})}function c(e){return t=this,i=void 0,a=function*(){const{media:t}=e,i=(t.sizes||t.thumbs).find((e=>"photoStrippedSize"===e._));if(!i)return;const{image:s,loadPromise:a}=(0,n.Z)(t,i,!0);return yield a,function(e){const{middleware:t,image:i}=e;if(!t())return;i.classList.add("media-spoiler-thumbnail");const s=document.createElement("div");s.classList.add("media-spoiler-container"),s.middlewareHelper=t.create();const n=o.Z.create(Object.assign(Object.assign({},e),{middleware:s.middlewareHelper.get()}));return s.append(i,n.canvas),s}(Object.assign(Object.assign({},e),{image:s}))},new((s=void 0)||(s=Promise))((function(e,n){function o(e){try{d(a.next(e))}catch(e){n(e)}}function r(e){try{d(a.throw(e))}catch(e){n(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,s,a}},6239:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(9345);function n(e){return t=this,i=void 0,a=function*(){try{return yield(0,s.Z)(e)}catch(t){return console.error("wrapMessageActionTextNewUnsafe error:",t),e.plain?"":document.createElement("span")}},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}},9345:(e,t,i)=>{"use strict";i.d(t,{Z:()=>F,e:()=>x});var s=i(1655),n=i(632),a=i(2614),o=i(130),r=i(8939),d=i(5180),l=i(2946),c=i(2325),h=i(1507),u=i(8115),p=i(2491),f=i(5400),m=i(3512),g=i(2064),v=i(5798);let b,y,w;const S=new Map;var C=i(9083),L=i(493),E=i(3591);function I(e){const t=e.action,{onclick:i,url:s}=(0,E.Z)(`tg://voicechat?chat_id=${e.peerId.toChatId()}&id=${t.call.id}&access_hash=${t.call.access_hash}`);if(!i)return document.createElement("span");const n=document.createElement("a");return n.href=s,n.setAttribute("onclick",i+"(this)"),n}var M=i(496),P=i(7362),Z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function T(e){return Z(this,void 0,void 0,(function*(){const t=yield(0,M.Z)(e);if(e.plain)return t;const i=document.createElement("i");return i.dataset.savedFrom=e.message.peerId+"_"+e.message.mid,i.dir="auto",i.append(t),i}))}function k(e,t){return t?e:(0,a.Z)((0,u.Z)(e))}function x(e){return Z(this,void 0,void 0,(function*(){const t=e.topic;let i=null==t?void 0:t.icon_emoji_id;return(null==t?void 0:t.id)===h.Ox&&(i="5390854796011906616"),i?e.plain?m.Z.managers.appEmojiManager.getCustomEmojiDocument(i).then((e=>e.stickerEmojiRaw)):(0,C.N)(Object.assign(Object.assign({},e),{docIds:[i]})).then((e=>(e.lastElementChild.classList.add("topic-icon"),e))):e.plain?"":function(e,t){if(!b){w=document.getElementById("svg-defs");const e="http://www.w3.org/2000/svg";b=document.createElementNS(e,"svg"),b.setAttributeNS(null,"width","26"),b.setAttributeNS(null,"height","26"),b.setAttributeNS(null,"viewBox","0 0 26 26"),b.classList.add("topic-icon-svg");const t=document.createElementNS(e,"use");t.setAttributeNS(null,"href","#topic-icon"),b.append(t),y=document.createElement("span"),y.classList.add("topic-icon","avatar-like");const i=document.createElement("span");i.classList.add("topic-icon-content"),y.append(b,i)}e||(console.error("NO TOPIC ICON COLOR!"),e=h.OS[0]),t||(console.error("NO TOPIC NAME!"),t="");const i=e.toString(16),s=`topic-icon-gradient-${e}`;let n=S.get(e);if(!n){const{h:t,s:a,l:o,a:r}=(0,g.cw)("#"+i);w.insertAdjacentHTML("beforeend",`\n \n \n \n \n `),S.set(e,n=`hsla(${t}, ${a}%, ${Math.max(0,o-40)}%, ${r})`)}const a=y.cloneNode(!0);return a.firstElementChild.style.fill=`url(#${s})`,a.firstElementChild.style.stroke=n,a.lastElementChild.append((0,v.Z)(t,!0)),a}(null==t?void 0:t.icon_color,null==t?void 0:t.title)}))}function A(e){const t=e.message.action;return x(Object.assign(Object.assign({},e),{topic:t}))}function _(e){return Z(this,void 0,void 0,(function*(){const t=e.message.action,i=document.createElement("span");return i.classList.add("topic-name"),i.append(yield A(e),k(t.title,e.plain)),i}))}function F(e){var t;return Z(this,void 0,void 0,(function*(){const{plain:i,message:h,middleware:u,lazyLoadQueue:g,customEmojiSize:v,animationGroup:b}=e,y=i?void 0:document.createElement("span"),w="action"in h&&h.action;if(w.message){const e=w.message;return i?(0,p.Z)(e):((0,o.Z)(y,(0,f.ZP)(e,{noLinebreaks:!0})),y)}{let o,u,p=w._;const g=m.Z.managers,v=(e,t)=>t?(0,L.Z)({peerId:e,plainText:t}):(0,P.Z)({peerId:e});switch(w._){case"messageActionPhoneCall":p+="."+w.type,u=[(0,r.Z)(w.duration,i)];break;case"messageActionGroupCall":p+="."+w.type,u=[],p.endsWith("You")||h.pFlags.post||u.push(v(h.fromId,i)),void 0!==w.duration?u.push((0,r.Z)(w.duration,i)):u.push(I(h));break;case"messageActionInviteToGroupCall":{const e=[h.fromId,w.users[0].toPeerId()];let t="Chat.Service.VoiceChatInvitation";const n=m.Z.myId;e[0]===n?t+="ByYou":e[1]===n&&(t+="ForYou"),(0,s.Z)(e,n),o=t,u=e.map((e=>v(e,i))),u.push(I(h));break}case"messageActionGroupCallScheduled":{const e=new Date,t=new Date(1e3*w.schedule_date),s=(t.getTime()-e.getTime())/864e5,a=new Date(e);a.setDate(a.getDate()+1);const r=yield g.appPeersManager.isBroadcast(h.peerId);o=r?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",u=[];const d=m.Z.myId;let l;h.fromId===d?o+="You":r||u.push(v(h.fromId,i));const p=[];s<1&&t.getDate()===e.getDate()?l="TodayAtFormattedWithToday":s<2&&t.getDate()===a.getDate()?l="Time.TomorrowAt":(l="formatDateAtTime",p.push(new c.ZP.IntlDateElement({date:t,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),p.push((0,n.mr)(t));const f=(0,c.ag)(l,p);u.push(f);break}case"messageActionChatCreate":{const e=m.Z.myId;h.fromId===e?p+="You":u=[v(h.fromId,i)];break}case"messageActionPinMessage":{const t=h.peerId,s=yield g.appMessagesManager.getMessageByPeer(t,h.reply_to_mid);u=[v(h.fromId,i)],s?u.push(T(Object.assign(Object.assign({},e),{message:s}))):(o="ActionPinnedNoText",h.reply_to_mid&&g.appMessagesManager.fetchMessageReplyTo(h));break}case"messageActionChatJoinedByRequest":{const e=yield g.appPeersManager.isBroadcast(h.peerId);h.pFlags.out?o=e?"RequestToJoinChannelApproved":"RequestToJoinGroupApproved":(o=e?"ChatService.UserJoinedChannelByRequest":"ChatService.UserJoinedGroupByRequest",u=[v(h.fromId,i)]);break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":u=[v(h.fromId,i)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":u=[],"messageActionChatEditTitle"===w._&&u.push(v(h.fromId,i)),u.push(k(w.title));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const e=w.users||[w.user_id];if(u=[v(h.fromId,i)],e.length>1){const t=(0,c.v_)(yield Promise.all(e.map((e=>v(e.toPeerId(),i)))),!1,i);if(i)u.push(...t);else{const e=document.createElement("span");e.append(...t),u.push(e)}}else u.push(v(e[0].toPeerId(),i));break}case"messageActionBotAllowed":{const e=(0,f.ZP)(w.domain,{entities:[{_:"messageEntityUrl",length:w.domain.length,offset:0}]});u=[(0,a.Z)(e)];break}case"messageActionPaymentSent":{const s=w.pFlags.recurring_init,n=w.pFlags.recurring_used;if(o=n?"Chat.Service.PaymentSentRecurringUsedNoTitle":s?"Chat.Service.PaymentSentRecurringInitNoTitle":"Chat.Service.PaymentSent1NoTitle",u=[(0,d.Z)(w.total_amount,w.currency),v(h.peerId,i)],h.reply_to_mid){const i=yield g.appMessagesManager.getMessageByPeer((null===(t=h.reply_to)||void 0===t?void 0:t.reply_to_peer_id)?(0,l.Z)(h.reply_to.reply_to_peer_id):h.peerId,h.reply_to_mid);i?(o=n?"Chat.Service.PaymentSentRecurringUsed":s?"Chat.Service.PaymentSentRecurringInit":"Chat.Service.PaymentSent1",u.push(T(Object.assign(Object.assign({},e),{message:i})).then((e=>(e instanceof HTMLElement&&e.classList.add("is-receipt-link"),e))))):g.appMessagesManager.fetchMessageReplyTo(h)}break}case"messageActionSetMessagesTTL":{u=[];const e=yield g.appPeersManager.isBroadcast(h.peerId);if(w.period){let t;if(e?o="ActionTTLChannelChanged":h.fromId===m.Z.myId?o="ActionTTLYouChanged":(o="ActionTTLChanged",u.push(v(h.fromId,i))),w.period>1814400){let e;const s=[],a=31536e3;w.period>=a?(e="Years",s.push(w.period/a|0)):(e="Months",s.push(w.period/(30*n.s2)|0)),t=i?c.ZP.format(e,!0,s):(0,c.ag)(e,s)}else t=(0,r.Z)(w.period,i);u.push(t)}else e?o="ActionTTLChannelDisabled":h.fromId===m.Z.myId?o="ActionTTLYouDisabled":(o="ActionTTLDisabled",u.push(v(h.fromId,i)));break}case"messageActionTopicEdit":{let t,s,n;const a=!!h.pFlags.out,r=void 0!==w.icon_emoji_id,d=r&&!+w.icon_emoji_id,l=void 0!==w.title,c=void 0!==w.hidden;a||(n=v(h.fromId,i)),l&&(s=k(w.title)),r&&!d&&(t=A(e)),u=n?[n]:[],w.closed?o=a?"Chat.Service.Group.TopicEdited.You.Paused":"Chat.Service.Group.TopicEdited.Paused":!1===w.closed?o=a?"Chat.Service.Group.TopicEdited.You.Resumed":"Chat.Service.Group.TopicEdited.Resumed":d&&l?(o=a?"Chat.Service.TopicEdited.You.Mixed.IconRemoved":"Chat.Service.TopicEdited.Mixed.IconRemoved",u.push(s)):r&&l?(o=a?"Chat.Service.TopicEdited.You.Mixed":"Chat.Service.TopicEdited.Mixed",u.push(_(e))):d?o=a?"Chat.Service.Group.TopicEdited.You.Icon.Removed":"Chat.Service.Group.TopicEdited.Icon.Removed":l?(o=a?"Chat.Service.Group.TopicEdited.You.Title":"Chat.Service.Group.TopicEdited.Title",u.push(s)):r?(o=a?"Chat.Service.Group.TopicEdited.You.Icon":"Chat.Service.Group.TopicEdited.Icon",u.push(t)):c&&(o=a?w.hidden?"Chat.Service.Group.TopicEdited.You.Hided":"Chat.Service.Group.TopicEdited.You.Unhided":w.hidden?"Chat.Service.Group.TopicEdited.Hided":"Chat.Service.Group.TopicEdited.Unhided");break}case"messageActionTopicCreate":u=[_(e)],o="TopicWasCreatedAction";break;default:o=c.Hz[p]||`[${w._}]`}o||(o=c.Hz[p],void 0===o&&(o="["+p+"]"));const b=u&&(yield Promise.all(u));return i?c.ZP.format(o,!0,b):(0,c.$d)(y,o,b)}}))}},496:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(8938),n=i(5705),a=i(677),o=i(3738),r=i(8456),d=i(5381),l=i(2325),c=i(1346),h=i(8115),u=i(2491),p=i(5400),f=i(3512),m=i(6239);function g(e){var t,i,g,v,b,y;return g=this,v=void 0,y=function*(){let{message:g,text:v,usingMids:b,plain:y,highlightWord:w,withoutMediaType:S}=e;null!=v||(v=g.message);const C=[];let L=!1;const E=(e,t)=>{if(e){if(void 0===t&&L)return;t=y?l.ZP.format(e,!0):(0,l.ag)(e)}if(y)C.push(t);else{const e=document.createElement("span");"string"==typeof t?e.innerHTML=t:e.append(t),C.push(e)}},I=f.Z.managers.appMessagesManager,M=(0,d.Z)(g);let P=null!==(t=g.totalEntities)&&void 0!==t?t:g.entities;if(g.media&&!M){(0,s.Z)(g);let e=!0;if(g.grouped_id){if(b){const t=yield I.getMidsByMessage(g);if(b.length===t.length){for(const i of t)if(!b.includes(i)){e=!1;break}}else e=!1}if(e){const e=yield I.getAlbumText(g.grouped_id);v=(null==e?void 0:e.message)||"",P=(null==e?void 0:e.totalEntities)||[],S||(E("AttachAlbum"),L=!0)}}else e=!1;if(!e&&!S||!v){const e=g.media;switch(e._){case"messageMediaPhoto":E("AttachPhoto");break;case"messageMediaDice":E(void 0,y?e.emoticon:(0,h.Z)(e.emoticon));break;case"messageMediaVenue":v=e.title,E("AttachLocation");break;case"messageMediaGeo":E("AttachLocation");break;case"messageMediaGeoLive":E("AttachLiveLocation");break;case"messageMediaPoll":const t="📊 "+(e.poll.question||"poll");E(void 0,y?t:(0,h.Z)(t));break;case"messageMediaContact":E("AttachContact");break;case"messageMediaGame":{const t="🎮 "+e.game.title;E(void 0,y?t:(0,h.Z)(t));break}case"messageMediaDocument":{const t=e.document;if("video"===t.type)E("AttachVideo");else if("voice"===t.type)E("AttachAudio");else if("gif"===t.type)E("AttachGif");else if("round"===t.type)E("AttachRound");else if("sticker"===t.type){const e=C.length;if(t.stickerEmojiRaw){const e=t.stickerEmojiRaw+" ";E(void 0,y?e:(0,h.Z)(e))}E("AttachSticker");const i=C.splice(e,2);if(y)C.push(i[0]+(i[1]?i[1]:""));else{const e=window.document.createElement("span");e.append(...i),C.push(e)}v=""}else if("audio"===t.type){const e=t.attributes.find((e=>"documentAttributeAudio"===e._&&(e.title||e.performer))),i="🎵 "+(e?[e.title,e.performer].filter(Boolean).join(" - "):t.file_name);E(void 0,y?i:(0,h.Z)(i))}else E(void 0,y?t.file_name:(0,h.Z)(t.file_name));break}case"messageMediaInvoice":"messageExtendedMediaPreview"===(null===(i=e.extended_media)||void 0===i?void 0:i._)?E(void 0,y?e.description:(0,h.Z)(e.description)):E(void 0,y?e.title:(0,h.Z)(e.title));break;case"messageMediaUnsupported":E(l.nK)}}const t=C.length;for(let e=1;e{"use strict";i.d(t,{Z:()=>n});var s=i(8842);function n(e){return t=this,i=void 0,a=function*(){const t=new s.Z;return yield t.update(e),t.element},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}},9492:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(2830),n=i(4755),a=i(3512),o=i(3442),r=i(6705),d=i(8580),l=i(1713),c=i(7030),h=i(2312),u=i(3114),p=i(7660),f=i(319),m=i(1507),g=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function v({photo:e,message:t,container:i,boxWidth:b,boxHeight:y,withTail:w,isOut:S,lazyLoadQueue:C,middleware:L,size:E,withoutPreloader:I,loadPromises:M,autoDownloadSize:P,noBlur:Z,noThumb:T,noFadeIn:k,blurAfter:x,managers:A=a.Z.managers,processUrl:_}){return g(this,void 0,void 0,(function*(){const F={loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null},D="document"===e._,R=D&&e.mime_type.startsWith("image/")&&!E,B=(0,u.Z)(e);if(!(e.sizes||e.thumbs||B||R))return b&&y&&!E&&D&&(0,l.Z)(e,i,b,y,void 0,t),F;let N=0===P;E||(void 0===b&&(b=n.Z.active.regular.width),void 0===y&&(y=n.Z.active.regular.height)),i.classList.add("media-container");let O,U,H,z=i,j=!0,G=Promise.resolve();if(b&&y&&!E){const s=(0,l.Z)(e,i,b,y,void 0,t,void 0,R?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:m.Pt}:void 0);if(E=s.photoSize,j=s.isFit,U=yield A.thumbsStorage.getCacheContext(e,E.type),!j&&!B){z=document.createElement("div"),z.classList.add("media-container-aspecter"),z.style.width=s.size.width+"px",z.style.height=s.size.height+"px";const n=(0,d.Z)(e,U,!Z,!0);if(n){G=n.loadPromise;const e=n.image;e.classList.add("media-photo"),i.append(e)}else(yield v({container:i,message:t,photo:e,boxWidth:0,boxHeight:0,size:E,lazyLoadQueue:C,isOut:S,loadPromises:M,middleware:L,withoutPreloader:I,withTail:w,autoDownloadSize:P,noBlur:Z,noThumb:!0,blurAfter:!0,managers:A})).images.full.classList.add("media-photo","thumbnail");i.classList.add("media-container-fitted"),i.append(z)}}else E||(E=(0,c.Z)(e,b,y,!0)),U=yield A.thumbsStorage.getCacheContext(e,null==E?void 0:E.type);if(!T&&!B){const t=(0,d.Z)(e,U,!Z);t&&(G=Promise.all([G,t.loadPromise]),F.loadPromises.thumb=F.loadPromises.full=G,O=F.images.thumb=t.image,O.classList.add("media-photo"),z.append(O))}if(F.aspecter=z,"photoSizeEmpty"===(null==E?void 0:E._)&&D||(null==E?void 0:E.bytes))return F;"videoSize"===(null==E?void 0:E._)?(H=F.images.full=(0,p.Z)(),H.autoplay=!0,H.loop=!0,H.muted=!0,H.classList.add("media-photo")):(H=F.images.full=new Image,H.classList.add("media-photo"));const V=(O||!U.downloaded)&&a.Z.settings.animationsEnabled&&!k;let K;const W=null==t?void 0:t.uploadingFileName;I||(U.downloaded&&!W||(K=new o.Z({attachMethod:"prepend",isUpload:!!W})),W&&(K.attachPromise(h.Z.getUpload(W)),K.attach(i),N=void 0));const $=e=>(0,s.Z)(i,H,e,V,z,O),q=e=>g(this,void 0,void 0,(function*(){if(!L||L()){if(_&&(e=yield _(e)),x){const t=(0,r.Z)(e,12);return t.promise.then((()=>$(t.canvas.toDataURL())))}return $(e)}}));let Q;const Y=E.w>=150&&E.h>=150||N,X=()=>g(this,void 0,void 0,(function*(){N&&!I&&K&&(K.construct(),K.setManual());const t=(()=>{const t=R&&!E;return h.Z.downloadMediaURL({media:e,thumb:E,queueId:null==C?void 0:C.queueId,onlyCache:t?void 0:N})})(),s=yield A.thumbsStorage.getCacheContext(e,null==E?void 0:E.type);K&&!s.downloaded&&!I&&Y&&K.attach(i,!1,t),N=void 0;const n=t.then(q);return n.catch(f.Z),{download:t,render:n}}));return K&&K.setDownloadFunction(X),U.downloaded?G=Q=(yield X()).render:C?C.push({div:i,load:()=>X().then((({download:e})=>e))}):Q=(yield X()).render,M&&G&&M.push(G),yield G,F.loadPromises.thumb=G,F.loadPromises.full=Q||Promise.resolve(),F.preloader=K,F}))}},5671:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(2291),n=i(2325),a=i(3512),o=i(7362);function r(e){return t=this,i=void 0,d=function*(){const t=document.createElement("span");t.classList.add("sender-title");const i=e.fromId===a.Z.myId&&e.peerId!==a.Z.myId;if(t.append(i?(0,n.ag)("FromYou"):yield(0,o.Z)(Object.assign(Object.assign({},(0,s.Z)(e)),{dialog:e.peerId===a.Z.myId}))),(yield a.Z.managers.appPeersManager.isAnyGroup(e.peerId))||i){const i=yield(0,o.Z)({peerId:e.peerId});t.append(" ➝ ",i)}return t},new((r=void 0)||(r=Promise))((function(e,s){function n(e){try{o(d.next(e))}catch(e){s(e)}}function a(e){try{o(d.throw(e))}catch(e){s(e)}}function o(t){var i;t.done?e(t.value):(i=t.value,i instanceof r?i:new r((function(e){e(i)}))).then(n,a)}o((d=d.apply(t,i||[])).next())}));var t,i,r,d}},1604:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(632);function n(e){const t=document.createElement("span");return t.classList.add("sent-time"),t.append((0,s.zM)(new Date(1e3*e.date))),t}},3541:(e,t,i)=>{"use strict";i.d(t,{Vp:()=>F,ZP:()=>B,_2:()=>N,_i:()=>R});var s=i(5269),n=i(3725),a=i(3910),o=i(2738),r=i(7660),d=i(8497),l=i(6740),c=i(1046),h=i(1185),u=i(5471),p=i(9405),f=i(4755),m=i(925),g=i(3174),v=i(6724),b=i(9674),y=i(2312),w=i(4271),S=i(2790),C=i(7030),L=i(13),E=i(1447),I=i(3512),M=i(7730),P=i(671),Z=i(5814),T=i(6787),k=i(2796),x=i(6775),A=i(645),_=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const F=1.49,D={},R={};function B({doc:e,div:t,middleware:i,loadStickerMiddleware:d,lazyLoadQueue:m,exportLoad:v,group:w,play:S,onlyThumb:B,emoji:N,width:O,height:U,withThumb:H,loop:z,loadPromises:j,needFadeIn:G,needUpscale:V,skipRatio:K,static:W,managers:$=I.Z.managers,fullThumb:q,isOut:Q,noPremium:Y,withLock:X,relativeEffect:J,loopEffect:ee,isCustomEmoji:te,syncedVideo:ie}){var se;return _(this,void 0,void 0,(function*(){t=Array.isArray(t)?t:[t],te&&(N=e.stickerEmojiRaw);const ne=e.sticker;if(1===ne&&(W=!0),!O&&!U){const t=f.Z.active,i=N?t.emojiSticker:e.animated?t.animatedSticker:t.staticSticker,s=(0,p.C)(e.w,e.h).aspectFitted(i);O=s.width,U=s.height}let ae;2===ne&&E.Z.loadLottieWorkers(),t.forEach((t=>{t.dataset.docId=""+e.id,N&&(t.dataset.stickerEmoji=N),t.classList.add("media-sticker-wrapper")}));const oe=(t=(null==ae?void 0:ae.type))=>_(this,void 0,void 0,(function*(){return ae=yield $.thumbsStorage.getCacheContext(e,t)})),re=!W&&(2===ne||3===ne),de=(0,L.Z)(e);void 0!==Q&&de&&!Q&&t.forEach((e=>e.classList.add("reflect-x")));const le=de&&X;if(le){const i=D[e.id];t.forEach((e=>{e.classList.add("is-premium-sticker","tgico-premium_lock"),i&&e.style.setProperty("--lock-url",`url(${i})`)}))}if(W&&1!==ne){const t=(0,C.Z)(e,O,U,!1);yield oe(t.type)}else yield oe(null==q?void 0:q.type);const ce=N&&!te?(0,P.tB)(N):-1,he=ae.downloaded&&!G,ue=re,pe=2===ne||3===ne?yield $.appDocsManager.getLottieCachedThumb(e.id,ce):void 0,fe={render:void 0,load:void 0};let me=(0,n.Z)(),ge=!1;if(((null===(se=e.thumbs)||void 0===se?void 0:se.length)||pe)&&!t[0].firstElementChild&&(!he||ue||B)&&!1!==H){let n=pe||e.thumbs[0];const a=(e,t)=>{e.childElementCount?me.resolve():(t.classList.add("media-sticker","thumbnail"),b.Z.mutateElement(e,(()=>{e.append(t),me.resolve()})))};if("url"in n)ge=!0,t.forEach((e=>{const t=new Image;(0,l.ZP)(t,n.url,(()=>a(e,t)))}));else if("bytes"in n){if("photoPathSize"===n._){n.bytes.length||(n=e.thumbs.find((e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length}))||n);const i=function(e){let t="M";for(let i=0,s=e.length;i=192?t+="AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,"[s-128-64]:(s>=128?t+=",":s>=64&&(t+="-"),t+=""+(63&s))}return t+="z",t}(n.bytes),s="http://www.w3.org/2000/svg",a=document.createElementNS(s,"svg");a.classList.add("rlottie-vector","media-sticker","thumbnail"),a.setAttributeNS(null,"viewBox",`0 0 ${e.w||512} ${e.h||512}`);const o=document.createElementNS(s,"path");o.setAttributeNS(null,"d",i),I.Z.settings.animationsEnabled&&!te&&o.setAttributeNS(null,"fill","url(#g)"),a.append(o),t.forEach(((e,t)=>e.append(t>0?a.cloneNode(!0):a))),ge=!0,me.resolve()}else if(ce<=0){const o=()=>{t.forEach((t=>{const i=new Image,s=(0,h.Z)(e,n,!0);(0,l.ZP)(i,s,(()=>a(t,i)))}))};s.Z||e.pFlags.stickerThumbConverted||ae.url?(ge=!0,o()):(ge=!0,M.Z.convert("main-"+e.id,n.bytes).then((s=>{$.appDocsManager.saveWebPConvertedStrippedThumb(e.id,s),n.bytes=s,e.pFlags.stickerThumbConverted=!0,i&&!i()||t[0].childElementCount?me.resolve():o()})).catch((()=>me.resolve())))}}else if((2===ne&&ce<=0||3===ne)&&(H||B)){const s=()=>_(this,void 0,void 0,(function*(){if(t[0].childElementCount||i&&!i())return void me.resolve();const s=(e,t,s)=>{e.childElementCount||i&&!i()?me.resolve():s?(0,l.ZP)(t,s,(()=>a(e,t))):a(e,t)};yield oe(),t.forEach((t=>{if(ae.url)s(t,new Image,ae.url);else if("bytes"in n){const i=(0,c.Z)(e,n,!0);i.loadPromise.then((()=>s(t,i.image,"")))}else y.Z.downloadMediaURL({media:e,thumb:n}).then((e=>_(this,void 0,void 0,(function*(){return s(t,new Image,e)}))))}))}));if(m&&B)return m.push({div:t[0],load:s}),me.resolve(),fe;s(),n.url&&(ge=!0)}}if(j&&ge&&j.push(me),B)return fe;const ve=(0,u.Z)("MIDDLEWARE"),be=()=>_(this,void 0,void 0,(function*(){if(i&&!i())throw ve;if(2===ne&&!W)return y.Z.downloadMedia({media:e,queueId:null==m?void 0:m.queueId,thumb:q}).then((s=>_(this,void 0,void 0,(function*(){if(i&&!i())throw ve;const n=yield E.Z.loadAnimationWorker({container:t[0],loop:!(N&&!te)&&z,autoplay:S,animationData:s,width:O,height:U,name:"doc"+e.id,needUpscale:V,skipRatio:K,toneIndex:ce,sync:te,middleware:null!=d?d:i,group:w}),a=le?()=>{var i,s;const a=null!==(i=D[s=e.id])&&void 0!==i?i:D[s]=function(e){var t;const i=e.getContext("2d"),s=20*(null!==(t=e.dpr)&&void 0!==t?t:1),n=s,a=s,o=(e.width-n)/2,r=e.height-a-0,d=i.getImageData(o,r,n,a).data;let l=0,c=0,h=0,u=0;for(let e=0;ee.style.setProperty("--lock-url",`url(${a})`)))}:void 0;return n.addEventListener("firstFrame",(()=>{const i=n.canvas[0];(!1!==H||te)&&(0,g.O)(e,i,ce),le&&a(),te||t.forEach(((e,t)=>{((e,t)=>{const i=e.firstElementChild;!1!==G&&(G=(G||!i||"svg"===i.tagName)&&I.Z.settings.animationsEnabled);const s=()=>{i&&i!==t&&"DIV"!==i.tagName&&i.remove()};G?b.Z.mutate((()=>{t&&t.classList.add("fade-in"),i&&i.classList.add("fade-out"),(t||i).addEventListener("animationend",(()=>{b.Z.mutate((()=>{t&&t.classList.remove("fade-in"),s()}))}),{once:!0})})):i&&b.Z.mutate(s)})(e,n.canvas[t])}))}),{once:!0}),N&&$.appStickersManager.preloadAnimatedEmojiStickerAnimation(N),n}))));if(W||3===ne){const s=re&&ie,n=s?A.Z.generateName(""+e.id,0,0,void 0,void 0):void 0,a=R[n];if(a)return a;const o=(s?t.slice(0,1):t).map((()=>{let e;if(W)e=new Image;else{const t=e=(0,r.Z)();if(t.muted=!0,S&&(t.autoplay=!0),z&&(t.loop=!0),z&&"number"==typeof z){let i=0,s=0;function n(){i>this.currentTime&&++s===z&&(this.autoplay=!1,this.loop=!1,this.pause(),t.removeEventListener("timeupdate",n)),i=this.currentTime}t.addEventListener("timeupdate",n)}}return e.classList.add("media-sticker"),e})),c=t.map(((e,t)=>e.firstElementChild!==o[t]&&e.firstElementChild));!1!==G&&(G=(G||!he||(W?c[0]:!c[0]||"svg"===c[0].tagName))&&I.Z.settings.animationsEnabled),G&&o.forEach((e=>e.classList.add("fade-in")));const h=new Promise(((n,a)=>_(this,void 0,void 0,(function*(){const r=()=>_(this,void 0,void 0,(function*(){if(i&&!i())return void a(ve);const r=o.length,d=[];let h;yield oe(),t.forEach(((t,u)=>{const p=o[u];p&&(h=(0,l.cj)(p,ae.url)),h.then((()=>((t,o,l)=>{b.Z.mutateElement(t,(()=>{if(!i||i())if(o){if(o){const t=O*window.devicePixelRatio,i=U*window.devicePixelRatio;if(!(0,g.k)(e,ce,t,i)){const s=document.createElement("canvas");s.width=t,s.height=i,s.getContext("2d").drawImage(o,0,0,s.width,s.height),(0,g.O)(e,s,ce)}}s?n(o):(t.append(o),G?(l&&l.classList.add("fade-out"),o.addEventListener("animationend",(()=>{o.classList.remove("fade-in"),null==l||l.remove()}),{once:!0})):null==l||l.remove(),re&&Z.Z.addAnimation(o,w,void 0,i),d.push(o)===r&&n(d))}else s&&re||null==l||l.remove();else a(ve)}))})(t,p,c[u])))}))}));if(yield oe(),ae.url)r();else{let t;if(1!==ne&&W){const i=(0,C.Z)(e,O,U,!1);t=y.Z.downloadMediaURL({media:e,thumb:i,queueId:null==m?void 0:m.queueId})}else t=y.Z.downloadMediaURL({media:e,queueId:null==m?void 0:m.queueId});t.then(r,a)}}))));return n&&(R[n]=h,d&&h.finally((()=>{d()||delete R[n]}))),h}}));if(v&&(1===v&&(!he||re)||2===v))return fe.load=be,fe;const ye=!m||he&&!re?be():(m.push({div:t[0],load:be}),Promise.resolve());return he&&W&&(me=ye,j&&j.push(me)),2===ne&&de&&void 0!==Q&&!Y&&function({container:e,doc:t,managers:i,middleware:s,isOut:n,width:r,loadPromise:d,relativeEffect:l,loopEffect:c}){i.appStickersManager.preloadSticker(t.id,!0);let h=!1;(0,o.fc)(e,(i=>_(this,void 0,void 0,(function*(){if((0,a.Z)(i),h){const e=document.createElement("a");return e.onclick=()=>{(0,k.PE)(),new T.Z(t.stickerSetInput).show()},void(0,k.bC)({langPackKey:"Sticker.Premium.Click.Info",langPackArguments:[e]})}h=!0,yield d;const{animationDiv:o,stickerPromise:u}=(0,x.Z)({doc:t,middleware:s,side:n?"right":"left",size:r*F,target:e,play:!0,fullThumb:(0,L.Z)(t),relativeEffect:l,loopEffect:c});void 0===n||n||o.classList.add("reflect-x"),u.then((e=>{e.addEventListener("destroy",(()=>{h=!1}))}))}))))}({container:t[0],doc:e,managers:$,middleware:i,isOut:Q,width:O,loadPromise:ye,relativeEffect:J,loopEffect:ee}),fe.render=ye,fe}))}function N({event:e,container:t,managers:i,peerId:s,middleware:n}){var o,r;return _(this,void 0,void 0,(function*(){(0,a.Z)(e);const l=(0,d.Z)(t,"bubble"),c=t.dataset.stickerEmoji,h=t.classList.contains("custom-emoji")?void 0:E.Z.getAnimation(t);if(null==h?void 0:h.paused){const e=yield i.appStickersManager.getAnimatedEmojiSoundDocument(c);if(e){const i=document.createElement("audio");i.style.display="none",t.parentElement.append(i);try{const t=yield y.Z.downloadMediaURL({media:e});i.src=t,i.play(),yield(0,m.Z)(i,void 0,!0),i.addEventListener("ended",(()=>{i.src="",i.remove()}),{once:!0})}catch(e){}}h.autoplay=!0,h.restart()}if(!s.isUser())return;const u=yield i.appStickersManager.getAnimatedEmojiSticker(c,!0);if(!u)return;const p=null!==(o=(r=t).emojiData)&&void 0!==o?o:r.emojiData={a:[],v:1},f=t.sendInteractionThrottled=(0,v.Z)((()=>{if(!p.a.length)return;const e=p.a[0].t;p.a.forEach((t=>{t.t=(t.t-e)/1e3}));const s=(0,d.Z)(t,"bubble");i.appMessagesManager.setTyping(w.ZP.chat.peerId,{_:"sendMessageEmojiInteraction",msg_id:(0,S.Z)(+s.dataset.mid),emoticon:c,interaction:{_:"dataJSON",data:JSON.stringify(p)}},!0,w.ZP.chat.threadId),p.a.length=0}),1e3,!1),g=l?l.classList.contains("is-out"):void 0,{animationDiv:b}=(0,x.Z)({doc:u,middleware:n,side:g?"right":"left",size:360,target:t,play:!0,withRandomOffset:!0});void 0===g||g||b.classList.add("reflect-x"),e.isTrusted&&(p.a.push({i:1,t:Date.now()}),f())}))}},6775:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u});var s=i(2131),n=i(8938),a=i(8487),o=i(5471),r=i(3624),d=i(9966),l=i(241),c=i(4271),h=i(3541);function u({size:e,doc:t,middleware:i,target:u,side:p,skipRatio:f,play:m,managers:g,fullThumb:v,withRandomOffset:b,relativeEffect:y,loopEffect:w}){var S;const C=document.createElement("div");let L;C.classList.add("emoji-animation"),C.style.width=e+"px",C.style.height=e+"px";const E=()=>{I.clean(),null==L||L.remove(),C.remove(),c.ZP.chat.bubbles.scrollable.container.removeEventListener("scroll",x)},I=null!==(S=null==i?void 0:i.create())&&void 0!==S?S:(0,r.k)();i=I.get();const M=(0,h.ZP)({div:C,doc:t,middleware:i,withThumb:!1,needFadeIn:!1,loop:!!w,width:e,height:e,play:m,group:"none",skipRatio:f,managers:g,fullThumb:v}).then((({render:e})=>e)).then((e=>{if((0,n.Z)(e),!i())throw e.remove(),(0,o.Z)("MIDDLEWARE");return L=e,L.addEventListener("enterFrame",(e=>{(w||e!==L.maxFrame)&&(0,a.Z)(u)||E()})),s.Z&&L.addEventListener("firstFrame",(()=>{navigator.vibrate(100)}),{once:!0}),L})),P=e=>{const t=Math.random()*e*2;return t>e?-t%e:t},Z=b?P(16):0,T=b?P(4):0,k=()=>{if(!(0,a.Z)(u))return void E();const t=u.getBoundingClientRect(),i=t.width/200,s="center"===p?0:16*("right"===p?1:-1)*i,n="center"===p?0:0*i,o="right"===p?t.right:t.left,r=t.top,d=("center"===p?(t.width-e)/2:"right"===p?-e:0)+s+Z,c=(t.height-e)/2+n+T,h=o+d,f=r+c;f<=-e||f>=l.Z.height?E():y?("center"!==p?C.style[p]=-1*Math.abs(s)+"px":C.style.left=d+"px",C.style.top=c+"px"):(C.style.top=f+"px",C.style.left=h+"px")},x=(0,d.Z)(k);return c.ZP.chat.bubbles.scrollable.container.addEventListener("scroll",x),k(),y?(C.classList.add("is-relative"),u.parentElement.append(C)):c.ZP.emojiAnimationContainer.append(C),{animationDiv:C,stickerPromise:M}}},5772:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(3541);function a(e){return t=this,i=void 0,o=function*(){const{emoji:t,div:i,managers:a=s.Z.managers}=e,o=yield a.appStickersManager.getAnimatedEmojiSticker(t);if(!o)throw i.classList.add("media-sticker-wrapper"),new Error("no sticker");return(0,n.ZP)(Object.assign(Object.assign({},e),{doc:o,loop:!1,play:!0}))},new((a=void 0)||(a=Promise))((function(e,s){function n(e){try{d(o.next(e))}catch(e){s(e)}}function r(e){try{d(o.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(n,r)}d((o=o.apply(t,i||[])).next())}));var t,i,a,o}},1273:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(7660),n=i(6740),a=i(2312),o=i(1447),r=i(3512),d=i(5814),l=i(3541),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function h({set:e,lazyLoadQueue:t,container:i,group:h,autoplay:u,width:p,height:f,managers:m=r.Z.managers,middleware:g}){var v;return c(this,void 0,void 0,(function*(){if(null===(v=e.thumbs)||void 0===v?void 0:v.length)return i.classList.add("media-sticker-wrapper"),void t.push({div:i,load:()=>c(this,void 0,void 0,(function*(){const t=yield m.appStickersManager.getStickerSetThumbDownloadOptions(e),r=a.Z.download(t);if(e.pFlags.animated&&!e.pFlags.videos)return r.then((t=>{o.Z.loadAnimationWorker({container:i,loop:!0,autoplay:u,animationData:t,width:p,height:f,needUpscale:!0,name:"setThumb"+e.id,group:h,middleware:g})}));{let t;return e.pFlags.videos?(t=(0,s.Z)(),t.autoplay=!0,t.muted=!0,t.loop=!0):t=new Image,t.classList.add("media-sticker"),r.then((s=>{(0,n.ZP)(t,URL.createObjectURL(s),(()=>{i.append(t),e.pFlags.videos&&d.Z.addAnimation(t,h)}))}))}}))});let r;r=e.thumb_document_id?m.appEmojiManager.getCustomEmojiDocument(e.thumb_document_id):m.appStickersManager.getStickerSet(e).then((e=>e.documents[0]));const b=yield r;"documentEmpty"!==b._&&(0,l.ZP)({doc:b,div:i,group:h,lazyLoadQueue:t,managers:m,width:p,height:f,middleware:g})}))}},62:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3541);function n({doc:e,row:t,size:i,managers:n}){const a=t.media,o=t.createMedia("small");a&&o.classList.add("hide");const r=a?[]:void 0,d="small"===i?32:48,l=(0,s.ZP)({div:o,doc:e,width:d,height:d,loadPromises:r,managers:n}).then((({render:e})=>e));return r&&Promise.all(r).then((()=>{o.classList.remove("hide"),a.remove()})),l}},9102:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(2790),n=i(4497),a=i(7362);function o(e){return t=this,i=void 0,r=function*(){const{peerId:t,threadId:i,lastMsgId:o}=e,r=Promise.resolve(),d=(0,n.Z)("t.me/c/"+t.toChatId()+(i?"/"+(0,s.Z)(i):"")+(o?"/"+(0,s.Z)(o):""));return d.classList.add("topic-name","topic-name-button"),d.append(yield(0,a.Z)(e)),{cached:!0,element:d,loadPromise:r}},new((o=void 0)||(o=Promise))((function(e,s){function n(e){try{d(r.next(e))}catch(e){s(e)}}function a(e){try{d(r.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(t,i||[])).next())}));var t,i,o,r}},2887:(e,t,i)=>{"use strict";i.d(t,{Z:()=>x});var s=i(4762),n=i(5296),a=i(3725),o=i(3910),r=i(2738),d=i(7660),l=i(8487),c=i(6740),h=i(8580),u=i(5471),p=i(4755),f=i(319),m=i(925),g=i(3035),v=i(6724),b=i(9674),y=i(5157),w=i(2312),S=i(4271),C=i(1507),L=i(3512),E=i(5814),I=i(3013),M=i(8448),P=i(3442),Z=i(9492),T=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let k=0;function x({doc:e,container:t,message:i,boxWidth:x,boxHeight:A,withTail:_,isOut:F,middleware:D,lazyLoadQueue:R,noInfo:B,group:N,onlyPreview:O,noPreview:U,withoutPreloader:H,loadPromises:z,noPlayButton:j,photoSize:G,videoSize:V,searchContext:K,autoDownload:W,managers:$=L.Z.managers,noAutoplayAttribute:q}){var Q;return T(this,void 0,void 0,(function*(){const Y=null==W?void 0:W.video;let X=0===Y;const J=!(x&&A),ee=("video"!==e.type||e.size<=52428800&&!J)&&("gif"===e.type?L.Z.settings.autoPlay.gifs:L.Z.settings.autoPlay.videos);let te,ie;if(!B){te=document.createElement("span"),te.classList.add("video-time"),t.append(te);let i=!1;"gif"!==e.type?(te.innerText=(0,y.Z)(e.duration,!1),j||"round"===e.type||(ee&&!X?te.classList.add("tgico","can-autoplay"):i=!0)):(te.innerText="GIF",ee||j||(i=!0,X=void 0)),i&&(ie=document.createElement("span"),ie.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(ie))}const se={};if("image/gif"===e.mime_type){const s=yield(0,Z.Z)({photo:e,message:i,container:t,boxWidth:x,boxHeight:A,withTail:_,isOut:F,lazyLoadQueue:R,middleware:D,withoutPreloader:H,loadPromises:z,autoDownloadSize:Y,size:G,managers:$});return se.thumb=s,se.loadPromise=s.loadPromises.full,se}let ne;const ae=(0,d.Z)();if(ae.classList.add("media-video"),ae.muted=!0,"round"===e.type){const s=document.createElement("div");s.classList.add("media-round","z-depth-1"),s.dataset.mid=""+i.mid,s.dataset.peerId=""+i.peerId,s.message=i;const a=p.Z.active.round,d=a.width/2,c=3.5,h=d-2*c;s.innerHTML=`\n \n `;const u=s.firstElementChild.firstElementChild;k||(k=2*Math.PI*h),u.style.strokeDasharray=k+" "+k,u.style.strokeDashoffset=""+k,te.classList.add("tgico"),i.pFlags.media_unread&&s.classList.add("is-unread");const f=document.createElement("canvas");f.width=f.height=e.w,s.prepend(f,te),s.append(ae),t.append(s);const m=f.getContext("2d"),b=()=>{const e=s.message,t=I.Z.addMedia(e,!X),i=()=>{(S.ZP.chat.setPeerPromise||Promise.resolve()).finally((()=>{(0,l.Z)(t)||(t.removeEventListener("play",h),t.removeEventListener("timeupdate",c),t.removeEventListener("pause",p),t.removeEventListener("ended",b))}))},a=()=>{m.drawImage(t,0,0);const e=k-t.currentTime/t.duration*k;return u.style.strokeDashoffset=""+e,!t.paused},d=()=>{t.duration&&((0,l.Z)(t)?(t.paused&&a(),te.innerText=(0,y.Z)(t.duration-t.currentTime,!1)):i())},c=(0,v.Z)((()=>{(0,g.T2)(d)}),1e3,!1),h=()=>{ae.classList.add("hide"),s.classList.remove("is-paused"),(0,n.cK)(a,f),ne&&ne.preloader&&ne.preloader.classList.contains("manual")&&ne.onClick()},p=()=>{(0,l.Z)(t)?s.classList.add("is-paused"):i()},b=()=>{ae.classList.remove("hide"),s.classList.add("is-paused"),ae.currentTime=0,te.innerText=(0,y.Z)(t.duration,!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",h),t.addEventListener("timeupdate",c),t.addEventListener("pause",p),t.addEventListener("ended",b),(0,r.fc)(f,(i=>{if((0,o.Z)(i),ne&&!ne.detached&&ne.onClick(),t.paused){const i=!!K;if(I.Z.setSearchContext(K||{peerId:C.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=i?(0,M.ns)(s,e.mid):[];I.Z.setTargets({peerId:e.peerId,mid:e.mid},t,n)}t.play()}else t.pause()})),t.paused?t.duration&&t.currentTime!==t.duration&&t.currentTime>0?(a(),d(),ae.classList.add("hide")):p():h()};i.pFlags.is_outgoing?(s.onLoad=b,s.dataset.isOutgoing="1"):b()}else q||(ae.autoplay=!0);let oe,re;if(i){if(oe=yield(0,Z.Z)({photo:e,message:i,container:t,boxWidth:x,boxHeight:A,withTail:_,isOut:F,lazyLoadQueue:R,middleware:D,withoutPreloader:!0,loadPromises:z,autoDownloadSize:null==W?void 0:W.photo,size:G,managers:$}),se.thumb=oe,!ee&&"gif"!==e.type||O)return se.loadPromise=oe.loadPromises.full,se;if(_){const e=(oe.images.thumb||oe.images.full).parentElement;ae.width=+e.getAttributeNS(null,"width"),ae.height=+e.getAttributeNS(null,"height"),e.append(ae)}}else if(!U){const i=(0,h.Z)(e,{},!0);if(i){const e=i.image;e.classList.add("media-poster"),t.append(e),se.thumb={loadPromises:{thumb:i.loadPromise,full:Promise.resolve()},images:{thumb:e,full:null},preloader:null,aspecter:null},null==z||z.push(i.loadPromise),se.loadPromise=i.loadPromise}}if(O)return se;!ae.parentElement&&t&&((null==oe?void 0:oe.aspecter)||t).append(ae);const de=()=>T(this,void 0,void 0,(function*(){return re=yield $.thumbsStorage.getCacheContext(e,null==V?void 0:V.type)}));yield de();const le=null==i?void 0:i.uploadingFileName;le?(ne=new P.Z({attachMethod:"prepend",isUpload:!0}),ne.attachPromise(w.Z.getUpload(le)),ne.attach(t,!1),X=void 0):re.downloaded||e.supportsStreaming||H?e.supportsStreaming&&(ne=new P.Z({cancelable:!1,attachMethod:"prepend"})):ne=new P.Z({attachMethod:"prepend"});const ce=(0,a.Z)();if(ae.addEventListener("error",(e=>{4!==ae.error.code&&console.error("Error "+ae.error.code+"; details: "+ae.error.message),ne&&!le&&ne.detach(),ce.isFulfilled||ce.resolve()}),{once:!0}),"video"===e.type){const e=()=>{ae.duration&&(te.innerText=(0,y.Z)(ae.duration-ae.currentTime,!1))},t=(0,v.Z)((()=>{(0,g.T2)(e)}),1e3,!1);ae.addEventListener("timeupdate",t),ie&&ae.addEventListener("timeupdate",(()=>{b.Z.mutateElement(ie,(()=>{ie.remove()}))}),{once:!0})}ae.muted=!0,ae.loop=!0,q||(ae.autoplay=!0);let he=X&&(null===(Q=null==oe?void 0:oe.preloader)||void 0===Q?void 0:Q.loadFunc);const ue=()=>T(this,void 0,void 0,(function*(){ne&&X&&!H&&(ne.construct(),ne.setManual()),yield de();let n=Promise.resolve();if(ne&&!le||H)if(re.downloaded||e.supportsStreaming)e.supportsStreaming&&(X?n=Promise.reject((0,u.Z)("NO_AUTO_DOWNLOAD")):!re.downloaded&&ne&&(ne.attach(t,!1,null),ae.addEventListener(s.IS_SAFARI?"timeupdate":"canplay",(()=>{ne.detach()}),{once:!0})));else{const i=n=w.Z.downloadMediaURL({media:e,queueId:null==R?void 0:R.queueId,onlyCache:X,thumb:V});ne&&ne.attach(t,!1,i)}return!X&&he&&(he(),he=null),X=void 0,n.then((()=>T(this,void 0,void 0,(function*(){!D||D()?("round"===e.type&&I.Z.resolveWaitingForLoadMedia(i.peerId,i.mid,i.pFlags.is_scheduled),yield de(),(0,m.Z)(ae).then((()=>{N&&E.Z.addAnimation(ae,N),ne&&!le&&ne.detach(),ce.resolve()}),(e=>{console.error("video load error",e),te&&te.classList.add("is-error"),ce.reject(e)})),(0,c.ZP)(ae,re.url)):ce.resolve()}))),f.Z),{download:n,render:Promise.all([n,ce])}}));return ne&&!le&&ne.setDownloadFunction(ue),"gif"!==e.type||ee?se.loadPromise=R?(R.push({div:t,load:()=>ue().then((({render:e})=>e))}),Promise.resolve()):(yield ue()).render:(0,r.fc)(t,(e=>{(0,o.Z)(e),ie.remove(),ue()}),{capture:!0,once:!0}),se.thumb&&(yield se.thumb.loadPromises.thumb),se}))}p.Z.addEventListener("changeScreen",((e,t)=>{if(t===p._.mobile||e===p._.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=p.Z.active.round.width,i=t/2,s=i-7;k=2*Math.PI*s,e.forEach((e=>{e.setAttributeNS(null,"width",""+t),e.setAttributeNS(null,"height",""+t);const n=e.firstElementChild;n.setAttributeNS(null,"cx",""+i),n.setAttributeNS(null,"cy",""+i),n.setAttributeNS(null,"r",""+s),n.style.strokeDasharray=k+" "+k,n.style.strokeDashoffset=""+k}))}}))},2498:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8456),n=i(5400);function a(e){const t=(0,s.Z)(e.description||"",150,180);return(0,n.ZP)(t)}},1336:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8456),n=i(5400);function a(e){let t=e.title||e.author||e.site_name||"";return t=(0,s.Z)(t,80,100),(0,n.ZP)(t,{noLinks:!0,noLinebreaks:!0})}},7445:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s={AED:{code:"AED",title:"United Arab Emirates Dirham",symbol:"AED",native:"د.إ.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"367",max_amount:"3673030"},AFN:{code:"AFN",title:"Afghan Afghani",symbol:"AFN",native:"؋",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8729",max_amount:"87299487"},ALL:{code:"ALL",title:"Albanian Lek",symbol:"ALL",native:"Lek",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"11842",max_amount:"118421187"},AMD:{code:"AMD",title:"Armenian Dram",symbol:"AMD",native:"դր.",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"40943",max_amount:"409436718"},ARS:{code:"ARS",title:"Argentine Peso",symbol:"ARS",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"14705",max_amount:"147059002"},AUD:{code:"AUD",title:"Australian Dollar",symbol:"AU$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"153",max_amount:"1536825"},AZN:{code:"AZN",title:"Azerbaijani Manat",symbol:"AZN",native:"ман.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"169",max_amount:"1699858"},BAM:{code:"BAM",title:"Bosnia & Herzegovina Convertible Mark",symbol:"BAM",native:"KM",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"199",max_amount:"1990677"},BDT:{code:"BDT",title:"Bangladeshi Taka",symbol:"BDT",native:"৳",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"10009",max_amount:"100094046"},BGN:{code:"BGN",title:"Bulgarian Lev",symbol:"BGN",native:"лв.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"199",max_amount:"1993315"},BND:{code:"BND",title:"Brunei Dollar",symbol:"BND",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"142",max_amount:"1421883"},BOB:{code:"BOB",title:"Bolivian Boliviano",symbol:"BOB",native:"Bs",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"683",max_amount:"6832607"},BRL:{code:"BRL",title:"Brazilian Real",symbol:"R$",native:"R$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"539",max_amount:"5397799"},BYN:{code:"BYN",title:"Belarusian ruble",symbol:"BYN",native:"BYN",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"249",max_amount:"2495801"},CAD:{code:"CAD",title:"Canadian Dollar",symbol:"CA$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"136",max_amount:"1366860"},CHF:{code:"CHF",title:"Swiss Franc",symbol:"CHF",native:"CHF",thousands_sep:"'",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"97",max_amount:"976705"},CLP:{code:"CLP",title:"Chilean Peso",symbol:"CLP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"963",max_amount:"9637495"},CNY:{code:"CNY",title:"Chinese Renminbi Yuan",symbol:"CN¥",native:"CN¥",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"709",max_amount:"7094102"},COP:{code:"COP",title:"Colombian Peso",symbol:"COP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"452870",max_amount:"4528700000"},CRC:{code:"CRC",title:"Costa Rican Colón",symbol:"CRC",native:"₡",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"62506",max_amount:"625061070"},CZK:{code:"CZK",title:"Czech Koruna",symbol:"CZK",native:"Kč",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"2497",max_amount:"24975029"},DKK:{code:"DKK",title:"Danish Krone",symbol:"DKK",native:"kr",thousands_sep:"",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"755",max_amount:"7555990"},DOP:{code:"DOP",title:"Dominican Peso",symbol:"DOP",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5275",max_amount:"52757308"},DZD:{code:"DZD",title:"Algerian Dinar",symbol:"DZD",native:"د.ج.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"14035",max_amount:"140353307"},EGP:{code:"EGP",title:"Egyptian Pound",symbol:"EGP",native:"ج.م.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1953",max_amount:"19537405"},ETB:{code:"ETB",title:"Ethiopian Birr",symbol:"ETB",native:"ብር",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5224",max_amount:"52247069"},EUR:{code:"EUR",title:"Euro",symbol:"€",native:"€",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"101",max_amount:"1016045"},GBP:{code:"GBP",title:"British Pound",symbol:"£",native:"£",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"89",max_amount:"894445"},GEL:{code:"GEL",title:"Georgian Lari",symbol:"GEL",native:"GEL",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"283",max_amount:"2830234"},GTQ:{code:"GTQ",title:"Guatemalan Quetzal",symbol:"GTQ",native:"Q",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"778",max_amount:"7781323"},HKD:{code:"HKD",title:"Hong Kong Dollar",symbol:"HK$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"784",max_amount:"7849750"},HNL:{code:"HNL",title:"Honduran Lempira",symbol:"HNL",native:"L",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"2441",max_amount:"24413729"},HRK:{code:"HRK",title:"Croatian Kuna",symbol:"HRK",native:"kn",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"764",max_amount:"7648805"},HUF:{code:"HUF",title:"Hungarian Forint",symbol:"HUF",native:"Ft",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"42685",max_amount:"426850229"},IDR:{code:"IDR",title:"Indonesian Rupiah",symbol:"IDR",native:"Rp",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"1523370",max_amount:"15233700000"},ILS:{code:"ILS",title:"Israeli New Sheqel",symbol:"₪",native:"₪",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"354",max_amount:"3543350"},INR:{code:"INR",title:"Indian Rupee",symbol:"₹",native:"₹",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8155",max_amount:"81555550"},ISK:{code:"ISK",title:"Icelandic Króna",symbol:"ISK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"142",max_amount:"1425603"},JMD:{code:"JMD",title:"Jamaican Dollar",symbol:"JMD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"15013",max_amount:"150131044"},JPY:{code:"JPY",title:"Japanese Yen",symbol:"¥",native:"¥",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"144",max_amount:"1443065"},KES:{code:"KES",title:"Kenyan Shilling",symbol:"KES",native:"Ksh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12075",max_amount:"120750271"},KGS:{code:"KGS",title:"Kyrgyzstani Som",symbol:"KGS",native:"KGS",thousands_sep:" ",decimal_sep:"-",symbol_left:!1,space_between:!0,exp:2,min_amount:"8018",max_amount:"80182898"},KRW:{code:"KRW",title:"South Korean Won",symbol:"₩",native:"₩",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"1431",max_amount:"14315201"},KZT:{code:"KZT",title:"Kazakhstani Tenge",symbol:"KZT",native:"₸",thousands_sep:" ",decimal_sep:"-",symbol_left:!0,space_between:!1,exp:2,min_amount:"47186",max_amount:"471867112"},LBP:{code:"LBP",title:"Lebanese Pound",symbol:"LBP",native:"ل.ل.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"150999",max_amount:"1509998778"},LKR:{code:"LKR",title:"Sri Lankan Rupee",symbol:"LKR",native:"රු.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"35546",max_amount:"355469651"},MAD:{code:"MAD",title:"Moroccan Dirham",symbol:"MAD",native:"د.م.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1093",max_amount:"10938136"},MDL:{code:"MDL",title:"Moldovan Leu",symbol:"MDL",native:"MDL",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1926",max_amount:"19264439"},MNT:{code:"MNT",title:"Mongolian Tögrög",symbol:"MNT",native:"MNT",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"322444",max_amount:"3224442056"},MUR:{code:"MUR",title:"Mauritian Rupee",symbol:"MUR",native:"MUR",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"4453",max_amount:"44535174"},MVR:{code:"MVR",title:"Maldivian Rufiyaa",symbol:"MVR",native:"MVR",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1546",max_amount:"15460397"},MXN:{code:"MXN",title:"Mexican Peso",symbol:"MX$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"2012",max_amount:"20122860"},MYR:{code:"MYR",title:"Malaysian Ringgit",symbol:"MYR",native:"RM",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"463",max_amount:"4632502"},MZN:{code:"MZN",title:"Mozambican Metical",symbol:"MZN",native:"MTn",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"6382",max_amount:"63829729"},NGN:{code:"NGN",title:"Nigerian Naira",symbol:"NGN",native:"₦",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"43203",max_amount:"432039828"},NIO:{code:"NIO",title:"Nicaraguan Córdoba",symbol:"NIO",native:"C$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"3556",max_amount:"35566412"},NOK:{code:"NOK",title:"Norwegian Krone",symbol:"NOK",native:"kr",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"1069",max_amount:"10690975"},NPR:{code:"NPR",title:"Nepalese Rupee",symbol:"NPR",native:"नेरू",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12954",max_amount:"129546657"},NZD:{code:"NZD",title:"New Zealand Dollar",symbol:"NZ$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"174",max_amount:"1746220"},PAB:{code:"PAB",title:"Panamanian Balboa",symbol:"PAB",native:"B/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"98",max_amount:"988722"},PEN:{code:"PEN",title:"Peruvian Nuevo Sol",symbol:"PEN",native:"S/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"390",max_amount:"3902208"},PHP:{code:"PHP",title:"Philippine Peso",symbol:"PHP",native:"₱",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5862",max_amount:"58627496"},PKR:{code:"PKR",title:"Pakistani Rupee",symbol:"PKR",native:"₨",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"22642",max_amount:"226426805"},PLN:{code:"PLN",title:"Polish Złoty",symbol:"PLN",native:"zł",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"493",max_amount:"4932350"},PYG:{code:"PYG",title:"Paraguayan Guaraní",symbol:"PYG",native:"₲",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"6977",max_amount:"69772317"},QAR:{code:"QAR",title:"Qatari Riyal",symbol:"QAR",native:"ر.ق.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"364",max_amount:"3640989"},RON:{code:"RON",title:"Romanian Leu",symbol:"RON",native:"RON",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"502",max_amount:"5028645"},RSD:{code:"RSD",title:"Serbian Dinar",symbol:"RSD",native:"дин.",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"11918",max_amount:"119184990"},RUB:{code:"RUB",title:"Russian Ruble",symbol:"RUB",native:"₽",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"7128",max_amount:"71281218"},SAR:{code:"SAR",title:"Saudi Riyal",symbol:"SAR",native:"ر.س.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"375",max_amount:"3756546"},SEK:{code:"SEK",title:"Swedish Krona",symbol:"SEK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1109",max_amount:"11094972"},SGD:{code:"SGD",title:"Singapore Dollar",symbol:"SGD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"143",max_amount:"1430495"},THB:{code:"THB",title:"Thai Baht",symbol:"฿",native:"฿",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3780",max_amount:"37800497"},TJS:{code:"TJS",title:"Tajikistani Somoni",symbol:"TJS",native:"TJS",thousands_sep:" ",decimal_sep:";",symbol_left:!1,space_between:!0,exp:2,min_amount:"975",max_amount:"9753854"},TRY:{code:"TRY",title:"Turkish Lira",symbol:"TRY",native:"TL",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1854",max_amount:"18543598"},TTD:{code:"TTD",title:"Trinidad and Tobago Dollar",symbol:"TTD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"672",max_amount:"6722681"},TWD:{code:"TWD",title:"New Taiwan Dollar",symbol:"NT$",native:"NT$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3173",max_amount:"31738502"},TZS:{code:"TZS",title:"Tanzanian Shilling",symbol:"TZS",native:"TSh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"233199",max_amount:"2331999890"},UAH:{code:"UAH",title:"Ukrainian Hryvnia",symbol:"UAH",native:"₴",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"3633",max_amount:"36338830"},UGX:{code:"UGX",title:"Ugandan Shilling",symbol:"UGX",native:"USh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"3816",max_amount:"38166726"},USD:{code:"USD",title:"United States Dollar",symbol:"$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"100",max_amount:1e6},UYU:{code:"UYU",title:"Uruguayan Peso",symbol:"UYU",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"4080",max_amount:"40801205"},UZS:{code:"UZS",title:"Uzbekistani Som",symbol:"UZS",native:"UZS",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1089058",max_amount:"10890583014"},VND:{code:"VND",title:"Vietnamese Đồng",symbol:"₫",native:"₫",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"23862",max_amount:"238625000"},YER:{code:"YER",title:"Yemeni Rial",symbol:"YER",native:"ر.ي.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"25030",max_amount:"250300677"},ZAR:{code:"ZAR",title:"South African Rand",symbol:"ZAR",native:"R",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1789",max_amount:"17894299"}}},3447:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a,i:()=>s});const s={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0}},n=s[""];for(const e in s)e&&Object.assign(n,s[e]);const a=n},3189:(e,t,i)=>{"use strict";i.d(t,{Bf:()=>n,U9:()=>a,bt:()=>s});const s='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif',n="16px",a="400"},356:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s="undefined"!=typeof ImageBitmap},5296:(e,t,i)=>{"use strict";i.d(t,{Kx:()=>r,cK:()=>d,jt:()=>l});var s=i(3035),n=i(3725);const a=new Map;function o(e){return a.get(e)}function r(e){const t=o(e);t&&(t.isCancelled=!0,t.deferred.resolve())}function d(e,t,i){return i||(i=function(e){r(e);const t={isCancelled:!1,deferred:(0,n.Z)()};return a.set(e,t),t.deferred.then((()=>{o(e)===t&&a.delete(e)})),t}(t)),(0,s.T2)((()=>{i.isCancelled||(e()?d(e,t,i):i.deferred.resolve())})),i.deferred}function l(e){(0,s.T2)((()=>{e()&&l(e)}))}},2353:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function n(e,t){return s(this,void 0,void 0,(function*(){const i=e.map(((e,i,n)=>s(this,void 0,void 0,(function*(){if(yield t(e,i,n))return e}))));return(yield Promise.all(i)).filter(Boolean)}))}},8847:(e,t,i)=>{"use strict";function s(e,t){const i=[];let s=-1;for(;-1!==(s=e.findIndex(t));)i.push(e.splice(s,1)[0]);return i}i.d(t,{Z:()=>s})},5916:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e){this.assets=e,this.tempId=0}playSound(e,t=!1){++this.tempId,this.assetName=e;try{const i=this.createAudio();i.autoplay=!0,i.src="assets/audio/"+e,i.loop=t,i.play()}catch(t){console.error("playSound",e,t)}}playSoundIfDifferent(e,t){this.assetName!==e&&this.playSound(e,t)}createAudio(){let{audio:e}=this;return e||(e=this.audio=new Audio,e.play(),e)}stopSound(){this.audio&&this.audio.pause()}cancelDelayedPlay(){++this.tempId}playSoundWithTimeout(e,t,i){const s=++this.tempId;setTimeout((()=>{this.tempId===s&&this.playSound(e,t)}),i)}}},8678:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3019);function n(e){return(0,s.Z)(e,"readAsDataURL")}},6705:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m});var s=i(3725),n=i(8594),a=i(3035);const o=[];let r=!1;function d(e,t="push"){if(!e.items.length)return Promise.resolve([]);const i=e.promise=(0,s.Z)();return o[t](e),l(),i}function l(){r||function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),i=[];return new Promise(((s,o)=>{const r=()=>{return d=this,l=void 0,h=function*(){const d=performance.now();do{yield(0,n.e9)();const s=e.process.apply(e.context,t.shift());let a;if(s instanceof Promise)try{a=yield s}catch(e){return void o(e)}else a=s;i.push(a)}while(t.length>0&&performance.now()-d<6);t.length>0?(0,a.T2)(r):s(i)},new((c=void 0)||(c=Promise))((function(e,t){function i(e){try{n(h.next(e))}catch(e){t(e)}}function s(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(i,s)}n((h=h.apply(d,l||[])).next())}));var d,l,c,h};(0,a.T2)(r)})).then(e.promise.resolve,e.promise.reject)}(o.shift()).finally((()=>{r=!1,o.length&&l()}))}var c=i(6663);let h,u;function p(e,t,i,s=document.createElement("canvas")){s.width=e.width,s.height=e.height;const n=s.getContext("2d",{alpha:!1});return c.Z?(n.filter=`blur(${t}px)`,n.drawImage(e,2*-t,2*-t,s.width+4*t,s.height+4*t)):(n.drawImage(e,0,0),u(n,0,0,s.width,s.height,t,i)),s}h=c.Z?Promise.resolve():i.e(77).then(i.bind(i,7077)).then((e=>{u=e.default}));const f=new Map;function m(e,t=2,i=2){if(!e)throw"no dataUri for blur: "+e;f.size>150&&f.clear();const s=document.createElement("canvas");s.className="canvas-thumbnail";let n=f.get(e);if(n)s.width=n.canvas.width,s.height=n.canvas.height,n.promise.then((()=>{s.getContext("2d").drawImage(n.canvas,0,0,s.width,s.height)}));else{const a=new Promise((n=>{h.then((()=>{const a=new Image;a.onload=()=>{d({items:[[a,t,i,s]],context:null,process:p},"unshift").then((()=>{n()}))},a.src=e}))}));f.set(e,n={canvas:s,promise:a})}return Object.assign(Object.assign({},n),{canvas:s})}},4059:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,o:()=>d});var s=i(4762),n=i(3306),a=i(9818);const o=(0,n.Z)("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),r=(0,n.Z)("ffd9");function d(e){const t="base64,",i=e.slice(e.indexOf(t)+t.length),s=[...atob(i)].map((e=>e.charCodeAt(0)));return new Uint8Array(s)}function l(e,t=!1){let i,n;t||1!==e[0]?i=(0,a.Z)(e):(i=new Uint8Array(o.concat(Array.from(e.slice(3)),r)),i[164]=e[1],i[166]=e[2]),n=t?s.IS_SAFARI?"image/png":"image/webp":"image/jpeg";const d=function(e,t="image/jpeg"){return`data:${t};base64,${btoa(String.fromCharCode(...e))}`}(i,n);return d}},9897:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(410),n=i(9405);function a(e,t,i,s,a=!0){if(ei/s?r=t*i/e|0:(o=e*s/t|0,o>i&&(r=r*i/o|0,o=i)),a&&o>=e&&r>=t&&(o=e,r=t),(0,n.C)(o,r)}s.GO.calcImageInBox=a},8097:(e,t,i)=>{"use strict";let s;function n(e,t){if(!s){const e=document.createElement("canvas");s=e.getContext("2d",{alpha:!1})}return s.font!==t&&(s.font=t),s.measureText(e).width}i.d(t,{Z:()=>n})},7814:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(356);function n(e){return new Promise((t=>{return i=this,n=void 0,o=function*(){var i,n,a;const o=document.createElement("canvas"),r=null!==(i=e.size)&&void 0!==i?i:e.mediaSize.aspectFitted(e.boxSize),d=window.devicePixelRatio&&1;o.width=r.width*d,o.height=r.height*d;const l=o.getContext("2d");let c;c=s.Z?yield createImageBitmap(e.media,{resizeWidth:r.width,resizeHeight:r.height}):e.media,l.drawImage(c,0,0,o.width,o.height),s.Z&&(null==c||c.close());const h=null!==(n=e.mimeType)&&void 0!==n?n:"image/jpeg",u=null!==(a=e.quality)&&void 0!==a?a:1;if(e.toDataURL){const e=o.toDataURL(h,u);t({url:e,size:r})}else o.toBlob((e=>{t({blob:e,size:r})}),h,u)},new((a=void 0)||(a=Promise))((function(e,t){function s(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}d((o=o.apply(i,n||[])).next())}));var i,n,a,o}))}},467:(e,t,i)=>{"use strict";i.d(t,{ST:()=>r,ZP:()=>d,gV:()=>l});var s=i(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,a=/^\s+|\s$/g,o={й:"q",ц:"w",у:"e",к:"r",е:"t",н:"y",г:"u",ш:"i",щ:"o",з:"p",х:"[",ъ:"]",ф:"a",ы:"s",в:"d",а:"f",п:"g",р:"h",о:"j",л:"k",д:"l",ж:";",э:"'",я:"z",ч:"x",с:"c",м:"v",и:"b",т:"n",ь:"m",б:",",ю:".",".":"/"};function r(e){return e.replace(n,"").replace(a,"")}function d(e,t=!0){return l(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function l(e,t={}){const i=t.includeTag&&"%"===e.charAt(0),n=e;return t.clearBadChars&&(e=r(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),i&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wа-я]/g,(e=>{const t=o[e];return null!=t?t:e}))}(n)),e}},2166:(e,t,i)=>{"use strict";function s(e){var t=document.createElement("textarea");t.value=e,t.style.top="0",t.style.left="0",t.style.position="fixed",document.body.appendChild(t),t.focus(),t.select();try{document.execCommand("copy")}catch(e){}document.body.removeChild(t)}function n(e){navigator.clipboard?navigator.clipboard.writeText(e).catch((t=>{console.error("clipboard error",t),s(e)})):s(e)}i.d(t,{T:()=>n})},3416:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(5432),n=i(4755),a=i(2296);class o extends a.Z{constructor(){super("menu",!0),this.onMouseMove=e=>{const t=this.element.getBoundingClientRect(),{clientX:i,clientY:s}=e,n=i>=t.right?i-t.right:t.left-i,a=s>=t.bottom?s-t.bottom:t.top-s;(n>=100||a>=100)&&this.close()},n.Z.addEventListener("resize",(()=>{this.element&&this.close()}))}isOpened(){return!!this.element}close(){this.element&&(this.element.classList.remove("active"),this.element.parentElement.classList.remove("menu-open")),super.close(),s.Z||window.removeEventListener("mousemove",this.onMouseMove)}openBtnMenu(e,t){super.open(e),this.element.classList.add("active","was-open"),this.element.parentElement.classList.add("menu-open"),t&&this.addEventListener("toggle",t,{once:!0}),s.Z||window.addEventListener("mousemove",this.onMouseMove)}}const r=new o},632:(e,t,i)=>{"use strict";i.d(t,{OD:()=>h,fl:()=>S,mr:()=>u,rz:()=>c,s2:()=>r,xE:()=>p,zM:()=>l});var s=i(410),n=i(2325);const a=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],r=86400,d=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),i=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-i);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/r+1)/7)};function l(e){const t=new Date,i=t.getTime()/1e3|0,s=e.getTime()/1e3|0,a={};return i-s{const i=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+i+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):a[e.getMonth()])+i+e.getFullYear()+(t.noTime?"":", "+s)},f=2013,m=new RegExp("20[0-9]{1,2}"),g=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),v=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),b=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),y=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),w=[31,29,31,30,31,30,31,31,30,31,30,31];function S(e,t){const i=e.trim().toLowerCase();if(i.length<3)return;if(0==="today".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-1;return void t.push({title:"Today",minDate:a,maxDate:o})}if(0==="yesterday".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime()-864e5;e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:a,maxDate:o})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let i=0;i<7;i++)if(t.setDate(t.getDate()+1),0===P(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(i);if(s>=0){const e=new Date,i=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>i&&e.setTime(e.getTime()-6048e5);const a=e.getFullYear(),o=e.getMonth(),r=e.getDate();e.setFullYear(a,o,r),e.setHours(0,0,0);const d=e.getTime();e.setFullYear(a,o,r+1),e.setHours(0,0,0);const l=e.getTime()-1;return void t.push({title:P(d),minDate:d,maxDate:l})}let n;if(null===(n=b.exec(i)))if(null===(n=y.exec(i)))if(null===(n=m.exec(i))){if(null!==(n=g.exec(i))){const e=n[1],i=n[2],s=T(e);if(s>=0){const e=+i;if(e>0&&e<=31)return void L(t,e-1,s);if(e>=f)return void C(t,s,e)}}if(null!==(n=v.exec(i))){const e=n[1],i=T(n[2]);if(i>=0){const s=+e;if(s>0&&s<=31)return void L(t,s-1,i);s>=f&&C(t,i,s)}}}else{let e=+i;const s=(new Date).getFullYear();if(e=e;i--){const e=new Date;e.setFullYear(i,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(i+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+i,minDate:s,maxDate:n})}}else if(e<=s){const i=new Date;i.setFullYear(e,0,1),i.setHours(0,0,0);const s=i.getTime();i.setFullYear(e+1,0,1),i.setHours(0,0,0);const n=i.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],i=n[3],s=n[5];if(!n[2]===n[4])return;const a=parseInt(e),o=parseInt(i)-1;let r=parseInt(s);r>=10&&r<=99&&(r+=2e3);const d=(new Date).getFullYear();if(Z(a-1,o)&&r>=f&&r<=d){const e=new Date;e.setFullYear(r,o,a),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(r,o,a+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:M(i),minDate:i,maxDate:s})}}else{const e=n[1],i=n[3],s=parseInt(e),a=parseInt(i);if(s>0&&s<=31){if(a>=f&&s<=12)return void C(t,s-1,a);a<=12&&L(t,s-1,a-1)}else s>=f&&a<=12&&C(t,a-1,s)}}function C(e,t,i){const s=(new Date).getFullYear(),n=Date.now();if(i>=f&&i<=s){const s=new Date;s.setFullYear(i,t,1),s.setHours(0,0,0);const a=s.getTime();if(a>n)return;s.setMonth(s.getMonth()+1);const o=s.getTime()-1;e.push({title:E(a),minDate:a,maxDate:o})}}function L(e,t,i){if(Z(t,i)){const n=(new Date).getFullYear(),a=Date.now();for(let o=n;o>=f;o--){if(1===i&&28===t&&((s=o)%4!=0||s%100==0)&&s%400!=0)continue;const r=new Date;r.setFullYear(o,i,t+1),r.setHours(0,0,0);const d=r.getTime();if(d>a)continue;r.setFullYear(o,i,t+2),r.setHours(0,0,0);const l=r.getTime()-1;o===n?e.push({title:I(d),minDate:d,maxDate:l}):e.push({title:M(d),minDate:d,maxDate:l})}}var s}function E(e){const t=new Date(e);return a[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function I(e){const t=new Date(e);return a[t.getMonth()].slice(0,3)+" "+t.getDate()}function M(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function P(e){const t=new Date(e);return o[t.getDay()]}function Z(e,t){return t>=0&&t<12&&e>=0&&e{"use strict";i.d(t,{Z:()=>d});var s=i(2796),n=i(2166),a=i(3910),o=i(2738);const r="https://t.me/";function d(e={}){const t=document.createElement("a");t.classList.add("anchor-copy");let i,d="LinkCopied";if(e.mePath){const s=r+e.mePath;i=t.href=t.innerText=s}if(e.username){const s=r+e.username;t.href=s,i=t.innerText="@"+e.username,d="UsernameCopied"}return(0,o.fc)(t,(e=>{(0,a.Z)(e),(0,n.T)(null!=i?i:t.href),(0,s.bC)({langPackKey:d})})),t}},6976:(e,t,i)=>{"use strict";i.d(t,{E:()=>c,s:()=>l});var s=i(5432),n=i(4762),a=i(3416),o=i(3910);let r=!1,d=0;function l(){d&&clearTimeout(d),d=window.setTimeout((()=>{d=0,r=!1}),400),r=!0}function c({element:e,callback:t,listenerSetter:i,listenerOptions:d}){const l=i?i.add(e):e.addEventListener.bind(e),c=i?i.removeManual.bind(i,e):e.removeEventListener.bind(e);if(n.IS_APPLE&&s.Z||d){let e;const i=Object.assign(Object.assign({},d||{}),{capture:!0}),s=()=>{clearTimeout(e),c("touchmove",s,i),c("touchend",s,i),c("touchcancel",s,i)};l("touchstart",(n=>{n.touches.length>1?s():(l("touchmove",s,i),l("touchend",s,i),l("touchcancel",s,i),e=window.setTimeout((()=>{r?s():(t(n),s(),a.Z.isOpened()&&l("touchend",o.Z,{once:!0}))}),400))}),d)}else l("contextmenu",s.Z?e=>{t(e),a.Z.isOpened()&&l("touchend",o.Z,{once:!0})}:t,d)}},5077:(e,t,i)=>{"use strict";function s(e,t,i,s){const n=e=>{i({x:e.pageX,y:e.pageY,event:e})},a=t=>{document.removeEventListener("mousemove",n),e.addEventListener("mousedown",o,{once:!0}),s&&s({x:t.pageX,y:t.pageY,event:t})},o=i=>{0===i.button?(t({x:i.pageX,y:i.pageY,event:i}),n(i),document.addEventListener("mousemove",n),document.addEventListener("mouseup",a,{once:!0})):e.addEventListener("mousedown",o,{once:!0})};e.addEventListener("mousedown",o,{once:!0});const r=e=>{e.preventDefault(),i({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e})},d=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",l,{passive:!1,once:!0}),s&&s({x:t.touches[0].clientX,y:t.touches[0].clientY,isTouch:!0,event:t})},l=e=>{t({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e}),r(e),document.addEventListener("touchmove",r,{passive:!1}),document.addEventListener("touchend",d,{passive:!1,once:!0})};return e.addEventListener("touchstart",l,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",l),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",d)}}i.d(t,{Z:()=>s})},6760:(e,t,i)=>{"use strict";function s(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}i.d(t,{Z:()=>s})},2738:(e,t,i)=>{"use strict";i.d(t,{EN:()=>r,fc:()=>o,pf:()=>a,tH:()=>d});var s=i(5432),n=i(6669);const a=s.Z?"mousedown":"click";function o(e,t,i={}){const s=i.listenerSetter?i.listenerSetter.add(e):e.addEventListener.bind(e),n=i.listenerSetter?i.listenerSetter.removeManual.bind(i.listenerSetter,e):e.removeEventListener.bind(e);return i.touchMouseDown=!0,s(a,t,i),()=>n(a,t,i)}function r(e,t,i){e.removeEventListener(a,t,i)}function d(e){(0,n.Z)(e,a)}},7529:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(5432),n=i(3241),a=i(5953),o=i(8497);class r extends n.Z{constructor(){super(!1),this.hideControls=(e=!1)=>{if(e)return void(this.hideControlsTimeout||(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3)));clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0;const t=this.element.classList.contains("show-controls");if(!1!==this.controlsLocked){if(this.canHideControls&&!this.canHideControls()||!t||this.controlsLocked)return}else if(!t)return;this.dispatchEvent("toggleControls",!1),this.element.classList.remove("show-controls")},this.showControls=(e=!0)=>{this.hideControlsTimeout?(clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0):this.element.classList.contains("show-controls")||!1===this.controlsLocked||(this.dispatchEvent("toggleControls",!0),this.element.classList.add("show-controls")),e&&!this.controlsLocked&&(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3))},this.toggleControls=e=>{const t=this.element.classList.contains("show-controls");if(void 0===e)t?this.hideControls():this.showControls();else{if(e===t)return;!1===e?this.hideControls():this.showControls()}},this.hideControlsTimeout=0}setup(e){(0,a.Z)(this,e);const{listenerSetter:t,element:i}=this;s.Z?t.add(i)("click",(e=>{this.ignoreClickClassName&&(0,o.Z)(e.target,this.ignoreClickClassName)||this.toggleControls()})):(t.add(i)("mousemove",(()=>{this.showControls()})),t.add(i)("mouseenter",(()=>{this.showControls(!1)})),t.add(i)("mouseleave",(e=>{e.relatedTarget&&this.showOnLeaveToClassName&&(0,o.Z)(e.relatedTarget,this.showOnLeaveToClassName)?this.showControls(!1):this.hideControls()})))}lockControls(e){this.controlsLocked=e,this.element.classList.toggle("disable-hover",!1===e),this.toggleControls(e)}}},4531:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(3003),n=i(2353),a=i(3416),o=i(3699),r=i(3624),d=i(1483),l=i(6976),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function h({buttons:e,findElement:t,listenTo:i,appendTo:h,filterButtons:u,onOpen:p,onClose:f,onBeforeOpen:m,listenerSetter:g}){null!=h||(h=document.body),null!=g||(g=new o.Z);const v=new o.Z,b=(0,r.k)();let y;(0,l.E)({element:i,callback:e=>{const s=t?t(e):i;if(!s)return;let n=y;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),n&&n.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0),(()=>{c(this,void 0,void 0,(function*(){yield null==p?void 0:p(s);const t=yield S();if(!t)return;n=t.element;const{cleanup:i,destroy:o}=t;(0,d.Z)(e,n),a.Z.openBtnMenu(n,(()=>{null==f||f(),i(),setTimeout((()=>{o()}),300)}))}))})()},listenerSetter:g});const w=()=>{v.removeAll(),b.clean()},S=()=>c(this,void 0,void 0,(function*(){w(),e.forEach((e=>e.element=void 0));const t=u||(e=>(0,n.Z)(e,(e=>{var t,i;return null===(i=null===(t=null==e?void 0:e.verify)||void 0===t?void 0:t.call(e))||void 0===i||i}))),i=yield t(e);if(!i.length)return;const a=y=yield(0,s.Z)({buttons:i,listenerSetter:v});return a.classList.add("contextmenu"),yield null==m?void 0:m(),h.append(a),{element:a,cleanup:w,destroy:()=>{a.remove()}}}));return{element:y,destroy:()=>{w(),g.removeAll()}}}},3163:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(6787),n=i(4271),a=i(3512),o=i(4531),r=i(8497),d=i(3173),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function c(e){const{listenTo:t,isStickerPack:i,verifyRecent:c,appendTo:h,onOpen:u,onClose:p,onSend:f}=e;let m,g;const v=e=>l(this,void 0,void 0,(function*(){const t=yield a.Z.managers.acknowledged.appStickersManager.getFavedStickersStickers();if(!t.cached)return!1;const i=(yield t.result).some((e=>e.id===g.id));return e?!i:i}));return(0,o.Z)({listenTo:t,appendTo:h,findElement:e=>m=(0,r.Z)(e.target,"media-sticker-wrapper"),onOpen:()=>l(this,void 0,void 0,(function*(){return g=yield a.Z.managers.appDocsManager.getDoc(m.dataset.docId),null==u?void 0:u()})),onClose:p,buttons:[{icon:"stickers",text:"Context.ViewStickerSet",onClick:()=>new s.Z(g.stickerSetInput).show(),verify:()=>!i},{icon:"favourites",text:"AddToFavorites",onClick:()=>a.Z.managers.appStickersManager.faveSticker(g.id,!1),verify:()=>v(!0)},{icon:"favourites",text:"DeleteFromFavorites",onClick:()=>a.Z.managers.appStickersManager.faveSticker(g.id,!0),verify:()=>v(!1)},{icon:"delete",text:"DeleteFromRecent",onClick:()=>a.Z.managers.appStickersManager.saveRecentSticker(g.id,!0),verify:()=>{var e;return null!==(e=null==c?void 0:c(m))&&void 0!==e&&e}},{icon:"mute",text:"Chat.Send.WithoutSound",onClick:()=>(null==f||f(),d.Jo.sendDocId(g.id,!1,!0)),verify:()=>!(!n.ZP.chat.peerId||n.ZP.chat.peerId===a.Z.myId)},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:()=>n.ZP.chat.input.scheduleSending((()=>n.ZP.chat.input.sendMessageWithDocument(g))),verify:()=>!!n.ZP.chat.peerId}]})}},7660:(e,t,i)=>{"use strict";function s(e={}){const t=document.createElement("video");return e.pip||(t.disablePictureInPicture=!0),t.setAttribute("playsinline","true"),t}i.d(t,{Z:()=>s})},8222:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3512);const n=new class{constructor(){this.cache={},s.Z.addEventListener("theme_change",(()=>{this.computedStyle=void 0;const e=this.cache;this.cache={};for(const t in e)this.getProperty(t)}))}getProperty(e){let t=this.cache[e];return t||(this.computedStyle||(this.computedStyle=window.getComputedStyle(document.documentElement)),t=this.computedStyle.getPropertyValue("--"+e).trim(),this.cache[e]=t)}}},6669:(e,t,i)=>{"use strict";function s(e,t){const i=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(i)}i.d(t,{Z:()=>s})},1544:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4056);function n(e){return Array.from(e.childNodes).map((e=>e.nodeType===e.TEXT_NODE?(0,s.Z)(e.textContent):e.outerHTML)).join("")}},5975:(e,t,i)=>{"use strict";function s(e,t){if(!e)return null;if(e.parentElement===t)return e;for(;e.parentElement;)if((e=e.parentElement).parentElement===t)return e;return null}i.d(t,{Z:()=>s})},8763:(e,t,i)=>{"use strict";function s(e,t){return e.closest(`[${t}]`)}i.d(t,{Z:()=>s})},4668:(e,t,i)=>{"use strict";function s(e,t){return e.closest(t)}i.d(t,{Z:()=>s})},6733:(e,t,i)=>{"use strict";function s(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function n(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function a(e,t,i){const s=i?i.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach((e=>{s(e,t,!1)}))}function o(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function r(){return!!o()}i.d(t,{C8:()=>n,Dj:()=>s,Ms:()=>a,W7:()=>o,rB:()=>r})},3299:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n,q:()=>a});var s=i(5975);function n(e,t){const i=document.getSelection(),n=i[t?"anchorNode":"focusNode"],o=i[t?"anchorOffset":"focusOffset"];return(0,s.Z)(n,e)||n===e?Object.assign(Object.assign({},a(e,n,o)),{selection:i}):{selection:i}}function a(e,t,i){if(t===e){const s=e.childNodes,n=s.length;n&&i>=n?i=((t=s[n-1]).textContent||t.alt||"").length:(t=s[i],i=0)}return{node:t,offset:i}}},9041:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d,o:()=>n});var s=i(6854);const n={bold:{match:'[style*="bold"], [style*="font-weight: 700"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight:600"], b, strong',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u, ins',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i, em',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face*="monospace"], pre',entityName:"messageEntityCode"},strikethrough:{match:'[style*="line-through"], [style*="strikethrough"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},a=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR","OL","UL"]),o=(new Set(["OL","UL"]),new RegExp(s.Z,"g"));function r(e,t,i,s){const a=e.parentElement;for(const e in n){const o=n[e],r=a.closest(o.match+', [contenteditable="true"]');null===(null==r?void 0:r.getAttribute("contenteditable"))&&("messageEntityTextUrl"===o.entityName?i.push({_:o.entityName,url:r.href,offset:s.offset,length:t.length}):"messageEntityMentionName"===o.entityName?i.push({_:o.entityName,offset:s.offset,length:t.length,user_id:r.dataset.follow.toUserId()}):i.push({_:o.entityName,offset:s.offset,length:t.length}))}}function d(e,t,i,s,n,l,c={offset:0}){if(e.nodeType===e.TEXT_NODE){let t=e.nodeValue;return t=t.replace(o,""),t?s===e?i.push(t.substr(0,n)+""+t.substr(n)):i.push(t):s===e&&i.push(""),l&&t.length&&e.parentNode&&r(e,t,l,c),void(c.offset+=t.length)}if(e.nodeType!==e.ELEMENT_NODE)return;const h=s===e,u=a.has(e.tagName);if(u&&(i.length||"BR"===e.tagName))t.push(i.join("")),i.length=0,++c.offset;else{const t=e.dataset.stickerEmoji||e.alt,s=e.dataset.stickerEmoji;t&&l&&r(e,t,l,c),s&&l&&l.push({_:"messageEntityCustomEmoji",document_id:e.dataset.docId,offset:c.offset,length:t.length}),t&&(i.push(t),c.offset+=t.length)}h&&!n&&i.push("");const p=e.matches('[style*="table-cell"], th, td'),f=null==l?void 0:l.length;let m=e.firstChild;for(;m;)d(m,t,i,s,n,l,c),m=m.nextSibling;if(h&&n&&i.push(""),p&&e.nextSibling&&i.length&&(i.push(" "),++c.offset,void 0!==f))for(let e=f,t=l.length;e{"use strict";i.d(t,{Z:()=>r});var s=i(410),n=i(6875),a=i(1346),o=i(9041);function r(e,t=!0,i=!0){const s=[],r=[],{node:d,offset:l}=!(e instanceof DocumentFragment)&&i&&function(e){const t=window.getSelection();let i,s;if(null==t?void 0:t.rangeCount){const n=t.getRangeAt(0),a=n.startOffset;if(n.startContainer&&n.startContainer==n.endContainer&&a==n.endOffset){const t=a-1,o=e.childNodes;if(n.startContainer===e&&o[t]){i=o[t],s=0;for(let e=0;e{"use strict";i.d(t,{Z:()=>n});var s=i(8204);function n({overflowElement:e,overflowRect:t,selector:i,extraSize:n,elements:a}){null!=t||(t=e.getBoundingClientRect()),null!=a||(a=Array.from(e.querySelectorAll(i))),n&&(t={top:t.top-n,right:t.right+n,bottom:t.bottom+n,left:t.left-n});const o=[],r=[],d=[];let l=!1;for(const i of a){const n=i.getBoundingClientRect(),a=(0,s.Z)(i,e,!1,n,t);let c;a?(l=!0,c=r):c=l?d:o,c.push({element:i,rect:n,visibleRect:a})}return{invisibleTop:o,visible:r,invisibleBottom:d}}},8204:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(241);function n(e,t,i,n=e.getBoundingClientRect(),a=t.getBoundingClientRect()){let{top:o,right:r,bottom:d,left:l}=a;if(i){const e=t.querySelector(".sticky");e&&(o=e.getBoundingClientRect().bottom)}if(n.top>=d||n.bottom<=o||n.right<=l||n.left>=r)return null;const c={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},h=s.Z.width,u=s.Z.height;return{rect:{top:n.topr&&r!==h?(c.right=!0,++c.horizontal,r):n.right,bottom:n.bottom>d&&d!==u?(c.bottom=!0,++c.vertical,d):n.bottom,left:n.left{"use strict";i.d(t,{Z:()=>r});var s=i(3757),n=i(3910),a=i(8497),o=i(3444);function r(e){let t=!1;return new s.Z(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!(0,a.Z)(t.target,"progress-line")&&!(0,o.Z)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(i,s,a)=>{if(i*=-1,s*=-1,!t&&Math.abs(s)>20)return!0;if(Math.abs(i)>Math.abs(s))(0,n.Z)(a),t=!0;else if(!t&&Math.abs(s)>Math.abs(i))return!0;return e.onSwipe(i,s,a)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}},1154:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(6976),n=i(2416);function a(e){return(0,n.Z)(Object.assign(Object.assign({},e),{onSwipe:(t,i,n)=>{if(t*=-1,i*=-1,Math.abs(t)>50)return e.onSwipe(t,i,n),(0,s.s)(),!0}}))}},5705:(e,t,i)=>{"use strict";function s(e){if(e instanceof DocumentFragment)return e;const t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}i.d(t,{Z:()=>s})},2614:(e,t,i)=>{"use strict";function s(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}i.d(t,{Z:()=>s})},8487:(e,t,i)=>{"use strict";function s(e){return null==e?void 0:e.isConnected}i.d(t,{Z:()=>s})},1293:(e,t,i)=>{"use strict";function s(e){return e.isContentEditable||"INPUT"!==e.tagName?!e.textContent.trim()&&!e.querySelector(".emoji, .custom-emoji, .custom-emoji-placeholder"):!e.value.trim()}i.d(t,{Z:()=>s})},6299:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(4762);function a(e){if("Enter"===e.key&&!n.IS_MOBILE&&!e.isComposing){if("enter"===s.Z.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=n.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(n.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},3444:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4762);function n(e){return s.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},2398:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(5432);function n(e,t=!1,i=!0){if(!s.Z||t&&("INPUT"===document.activeElement.tagName||document.activeElement.isContentEditable))if(i&&e.focus(),e instanceof HTMLInputElement){const t=e.value.length;e.selectionStart=t,e.selectionEnd=t}else{const t=document.createRange();t.selectNodeContents(e),t.collapse(!1);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}}window.placeCaretAtEnd=n},4484:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2648);function n(e,t,i,n){return void 0===n&&(n=e.parentElement===t?(0,s.Z)(e):-1),n!==i&&(-1!==n&&ni?t.insertBefore(e,t.children[i]):t.append(e):t.prepend(e),!0)}},6740:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>o,cj:()=>r});var s=i(925);const n={},a=(e,t)=>{e instanceof HTMLImageElement||e instanceof HTMLVideoElement?e.src=t:e instanceof SVGImageElement?e.setAttributeNS(null,"href",t):e.style.backgroundImage="url("+t+")"};function o(e,t,i,o=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(null==i||i());const r=e instanceof HTMLVideoElement;if(n[t]&&o||r)e&&a(e,t),i&&(r?(0,s.Z)(e).then(i):null==i||i());else{const s=e instanceof HTMLImageElement,o=s?e:new Image;o.src=t;const r=()=>{!s&&e&&a(e,t),n[t]=!0,null==i||i(),o.removeEventListener("error",d)},d=e=>{console.error("Render image from url failed:",e,t,o),o.removeEventListener("load",r),null==i||i()};o.addEventListener("load",r,{once:!0}),o.addEventListener("error",d,{once:!0})}}function r(e,t,i){return new Promise((s=>{o(e,t,s,i)}))}},2830:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(9674),n=i(6740);function a(e,t,i,a,o=e,r){return a&&t.classList.add("fade-in"),(0,n.cj)(t,i).then((()=>s.Z.mutateElement(e,(()=>{o.append(t),a?t.addEventListener("animationend",(()=>{s.Z.mutate((()=>{t.classList.remove("fade-in"),null==r||r.remove()}))}),{once:!0}):null==r||r.remove()}))))}},5565:(e,t,i)=>{"use strict";function s(e,t){if("string"==typeof t)return void(e.innerHTML=t);const i=e.firstChild;i?e.lastChild===i?i.replaceWith(t):(e.textContent="",e.append(t)):e.append(t)}i.d(t,{Z:()=>s})},669:(e,t,i)=>{"use strict";i.d(t,{Y:()=>m,Z:()=>g});var s=i(4762),n=i(5003),a=i(5400),o=i(3699),r=i(6854),d=i(3228),l=i(5975),c=i(2648);function h(e,t,i,s){let n;if(e===i)n=t-s;else if(e.parentElement===i.parentElement)n=(0,c.Z)(e,!0)-(0,c.Z)(i,!0);else{const t=[];let s=e.parentElement;do{t.push(s)}while(s=s.parentElement);s=i.parentElement;do{if(t.includes(s))break}while(s=s.parentElement);const a=s;e=(0,l.Z)(e,a),i=(0,l.Z)(i,a),n=(0,c.Z)(e,!0)-(0,c.Z)(i,!0)}return(0,d.Z)(n,-1,1)}window.compareNodes=h;var u=i(3299),p=i(2398);const f=new RegExp(`[^${r.Z}]`),m=!1;class g{constructor(){this.saveSelectionOnChange=e=>{const t=document.activeElement;this.saveRangeForElement(t)},this.onFocusOut=e=>{this.lastNode=this.lastOffset=void 0},this.onSelectionChange=e=>{var t;const{input:i}=this;if(!i)return void this.setSelectionClassName(document.getSelection());let s=this.getCaretPosN();for(;;){const{node:e,offset:n,selection:a,move:o}=s;if((null==e?void 0:e.nodeValue)!==r.Z||!this.lastNode)break;const d=h(e,n,this.lastNode,this.lastOffset)<0;void 0!==d&&(a.isCollapsed?this.superMove(i,s,d,!0):a.modify(a.isCollapsed?"move":"extend",d?"backward":"forward","character")),this.log("selectionchange",e,n,this.lastNode,this.lastOffset,e===this.lastNode,(0,c.Z)(this.getFiller(e)),(0,c.Z)(this.getFiller(this.lastNode)),d,a,document.getSelection(),document.getSelection().getRangeAt(0),null==e?void 0:e.parentNode,null===(t=this.lastNode)||void 0===t?void 0:t.parentNode),s=this.getCaretPosN(),this.lastNode=e,this.lastOffset=n;break}this.lastNode=this.lastOffset=void 0,this.setSelectionClassName(s.selection,i)},this.onBeforeInput=e=>{var t;const{input:i,log:s}=this;if(!i)return;const n=this.addInputCallback.bind(this,i),a=this.getCaretPosN();let{node:o,offset:d,selection:l,move:c}=a;if(s("beforeinput",e,o,d,l,a),this.lastNode=this.lastOffset=void 0,e.inputType.startsWith("delete")){if(n((()=>{this.processEmptiedFillers(i),this.removeExtraBOMs(i),this.fixInsertedLineBreaks(i)})),(null==o?void 0:o.nodeValue)===r.Z&&l.isCollapsed&&e.inputType.includes("deleteContent")){const t=e.inputType.includes("Backward"),s=d===r.Z.length&&t||!d&&!t;this.superMove(i,a,t,s)}}else{if(e.inputType.startsWith("insert")){if(null===(t=null==o?void 0:o.classList)||void 0===t?void 0:t.contains("input-something")){o=o.previousSibling.firstChild;const e=l.getRangeAt(0);e.setStart(o,0),e.setEnd(o,0),e.collapse(!0);const t=this.getCaretPosN();o=t.node,l=t.selection,d=t.offset}if(o&&o.textContent===r.Z&&d===r.Z.length){l.modify("move","backward","character");const e=this.getCaretPosN();o=e.node,l=e.selection,d=e.offset}e.inputType;{o&&o.nodeType===o.ELEMENT_NODE&&(o=o.firstChild,s.warn("fixing focus on span"));const t=(null==o?void 0:o.nodeValue)===r.Z;if(s("inserting line break",t,o,`"${null==o?void 0:o.nodeValue}"`,(null==o?void 0:o.parentElement)?Array.from(o.parentElement.childNodes).slice():[]),t){const e=o.parentElement;e.classList.replace("input-filler","input-filler-text"),e.childNodes.length,n((()=>{e.childNodes.length>1?(s("inserting line break, remove"),o=Array.from(e.childNodes).find((e=>e.nodeValue===r.Z)),e.t=o):o.nodeValue!==r.Z&&(s("inserting line break, deleteData"),o.deleteData(o.nodeValue.indexOf(r.Z),r.Z.length)),this.fixInsertedLineBreaks(i)}))}else"insertLineBreak"===e.inputType&&n((()=>{this.fixInsertedLineBreaks(i)}))}return}"historyUndo"===e.inputType?n((()=>{this.processFilledFillers(i),this.processEmptiedFillers(i),this.removeExtraBOMs(i),this.removeEmptyTextNodes(i),this.fixBuggedCaret()})):"historyRedo"===e.inputType&&n((()=>{this.processFilledFillers(i),this.processEmptiedFillers(i),i.querySelectorAll(".input-something:not([contenteditable])").forEach((e=>{e.contentEditable="false"})),this.removeExtraBOMs(i),this.fixBuggedCaret()}))}},this.onKeyDown=e=>{var t;const i=e.key;if("ArrowDown"===i||"ArrowUp"===i)this.lastNode=this.lastOffset=void 0;else{const{node:e,offset:t}=this.getCaretPosN();this.lastNode=e,this.lastOffset=t,this.lastNode===this.input&&(this.lastNode=this.lastOffset=void 0)}this.log("keydown",this.lastNode,null===(t=this.lastNode)||void 0===t?void 0:t.parentNode,this.lastOffset,this.getCaretPosN(),e)},this.log=(0,n.kg)("RICH-INPUT"),this.listenerSetter=new o.Z,this.savedRanges=new WeakMap,this.listenerSetter.add(document)("selectionchange",this.saveSelectionOnChange),m&&(this.listenerSetter.add(document)("focusout",this.onFocusOut),this.listenerSetter.add(document)("selectionchange",this.onSelectionChange),this.listenerSetter.add(document)("beforeinput",this.onBeforeInput),this.listenerSetter.add(document)("keydown",this.onKeyDown,{capture:!0}),s.IS_FIREFOX&&(this.inputCaptureCallbacks=[],this.listenerSetter.add(document)("input",(()=>{this.inputCaptureCallbacks.forEach((e=>e())),this.inputCaptureCallbacks.length=0}),{capture:!0})))}get input(){const e=document.getSelection(),{anchorNode:t}=e;if(t)return(t.closest?t:t.parentElement).closest('[contenteditable="true"]')}saveRangeForElement(e){e&&(e.isContentEditable||"INPUT"===e.tagName)&&document.getSelection().rangeCount&&this.savedRanges.set(e,document.getSelection().getRangeAt(0))}findPreviousSmthIndex(e,t,i){const s=Array.from(null!=i?i:e.querySelectorAll(".input-something")),n=s.findIndex((e=>h(e,0,t,0)>=0));return-1===n?s.length-1:Math.max(0,n-1)}superMove(e,t,i,s){var n,a;const{node:o,offset:d,move:l}=t,c=e.querySelectorAll(".input-something"),h=this.findPreviousSmthIndex(e,o,c),u=document.createRange();u[i?"setEnd":"setStart"](o,d),s&&l(i);const p=this.getCaretPosN();if((null===(n=p.node)||void 0===n?void 0:n.nodeValue)===r.Z&&(!s||o===this.lastNode)){const t=this.findPreviousSmthIndex(e,p.node,c);let n=!s;for(;;){const s=this.getCaretPosN(),d=this.findPreviousSmthIndex(e,s.node,c);u[i?"setStart":"setEnd"](s.node,s.offset);const p=u.toString(),m=!f.test(p);if(this.log("test cursor",p,m,t,d),!m||(null===(a=s.node)||void 0===a?void 0:a.nodeValue)!==r.Z||d!==t||!d&&!s.offset||!(d{e.classList.add("br-not-br")}))}fixBuggedCaret(){const e=document.getSelection(),t=e.getRangeAt(0);e.removeAllRanges(),e.addRange(t)}addInputCallback(e,t,i=!0){const n=()=>{this.log("input modify callback"),t()};i&&s.IS_FIREFOX?this.inputCaptureCallbacks.push(n):this.listenerSetter.add(e)("input",n,{once:!0,capture:i})}removeExtraBOMs(e){const t=e=>{var t;return null===(t=null==e?void 0:e.classList)||void 0===t?void 0:t.contains("input-something")};e.querySelectorAll(".input-filler").forEach((e=>{var i;const{previousSibling:s,nextSibling:n}=e;let o=!1;!(null===(i=null==n?void 0:n.classList)||void 0===i?void 0:i.contains("input-filler"))&&(0,a.Hc)(n)&&(o=t(s)||t(n)),o||(this.log.warn("removing empty bom node",e),e.remove())}))}getFiller(e){return e&&e.nodeType===e.TEXT_NODE&&e.parentElement!==this.input?e.parentElement:e}getCaretPosN(){const e=(0,u.Z)(this.input);return Object.assign(Object.assign({},e),{move:this.move.bind(this,e.selection)})}removeEmptyTextNodes(e){const{log:t}=this,i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:t=>t.parentElement!==e||t.nodeValue?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT});let s;for(;s=i.nextNode();)t.warn("removing empty text node",s),s.remove()}removePossibleBOMSiblings(e,t){[e,t].forEach((e=>{var t;(null===(t=null==e?void 0:e.classList)||void 0===t?void 0:t.contains("input-filler"))&&e.remove()}))}removePossibleBOMSiblingsByNode(e){const{previousSibling:t,nextSibling:i}=e;this.removePossibleBOMSiblings(t,i)}processEmptiedFillers(e){e.querySelectorAll(".input-filler-text").forEach((e=>{var t;this.removeExtraBOMs(e);let i=!0;if(e.textContent)f.test(e.textContent)||e.querySelector(".input-something")?i=!1:e.classList.replace("input-filler-text","input-filler");else{e.classList.replace("input-filler-text","input-filler");const i=Array.from(e.childNodes).find((e=>e.nodeType===e.TEXT_NODE));i?i.insertData(0,r.Z):(null===(t=e.t)||void 0===t?void 0:t.nodeValue)?e.append(e.t):e.append(document.createTextNode(r.Z))}i&&this.removePossibleBOMSiblingsByNode(e)}))}processFilledFillers(e){e.querySelectorAll(".input-filler").forEach((e=>{if(e.textContent!==r.Z){e.classList.replace("input-filler","input-filler-text");const t=e.t,i=Array.from(e.childNodes).find((e=>e.nodeType===e.TEXT_NODE&&e.nodeValue.includes(r.Z)));if(i&&!(null==t?void 0:t.nodeValue)){const e=i.nodeValue.indexOf(r.Z);-1!==e&&i.deleteData(e,r.Z.length)}}}))}setSelectionClassName(e,t){if(e.rangeCount){const i=e.getRangeAt(0);t?Array.from(t.querySelectorAll(".input-selectable")).forEach((e=>{e.classList.toggle("selection",!i.collapsed&&i.intersectsNode(e))})):Array.from(document.querySelectorAll(".input-selectable.selection")).forEach((e=>e.classList.remove("selection")))}}move(e,t){const{focusNode:i,focusOffset:s}=e;e.modify("extend",t?"backward":"forward","character"),t?e.collapseToStart():e.collapseToEnd();const{focusNode:n,focusOffset:a}=e;this.log("moving cursor",t,i,i.nodeType===i.ELEMENT_NODE?i:i.parentElement,s,n,n.nodeType===n.ELEMENT_NODE?n:n.parentElement,a)}prepareApplyingMarkdown(){const{input:e}=this,t=e.querySelectorAll(".input-filler"),i=e.querySelectorAll(".input-something");return i.forEach((e=>{e.contentEditable="inherit"})),()=>{t.forEach((e=>{e.contentEditable="inherit"})),i.forEach((e=>{e.contentEditable="false"})),this.removeExtraBOMs(e)}}static getInstance(){var e;return null!==(e=this.INSTANCE)&&void 0!==e?e:this.INSTANCE=new g}}},2914:(e,t,i)=>{"use strict";i.d(t,{Z:()=>f});var s=i(3757),n=i(5432),a=i(3512),o=i(3228),r=i(5953),d=i(5418),l=i(3910),c=i(2738),h=i(5975),u=i(4484),p=i(2648);class f{constructor(e){this.onSwipe=(e,t)=>{t=(0,o.Z)(t,this.minY,this.maxY),this.element.style.transform=`translateY(${t}px)`;const i=Math.round(Math.abs(t)/this.elementRect.height),s=this.siblings;this.siblings=[];const n=t<0?"previousElementSibling":"nextElementSibling";let a=this.element[n];for(let e=0;e{this.siblings.includes(e)||(e.style.transform="")})),this.siblings.forEach((e=>{const i=this.elementRect.height*(t<0?1:-1);e.style.transform=`translateY(${i}px)`})),this.scrollableRect){const e=t,i=e>0,s=(i?this.elementRect.bottom:this.elementRect.top)+e-this.addScrollPos;let n=2;s+(i?0:this.elementRect.height)>=this.scrollableRect.bottom||(s-(i?this.elementRect.height:0)<=this.scrollableRect.top?n*=-1:n=void 0),void 0!==n&&(this.scrollable.container[this.scrollable.scrollProperty]+=n)}},this.verifyTouchTarget=e=>!this.list.classList.contains("is-reordering")&&(this.element=this.getSortableTarget(e.target),!!this.element),this.onScroll=()=>{const e=this.scrollable.container[this.scrollable.scrollProperty],t=this.addScrollPos=e-this.startScrollPos,i="scrollTop"===this.scrollable.scrollProperty;this.swipeHandler.add(i?0:t,i?t:0)},this.onStart=()=>{this.list.classList.add("is-reordering"),this.element.classList.add("is-dragging","no-transition"),this.swipeHandler.setCursor("grabbing"),this.elementRect=this.element.getBoundingClientRect(),this.containerRect=this.list.getBoundingClientRect(),this.minY=this.containerRect.top-this.elementRect.top,this.maxY=this.containerRect.bottom-this.elementRect.bottom,this.addScrollPos=0,this.scrollable&&(this.startScrollPos=this.scrollable.container[this.scrollable.scrollProperty],this.scrollableRect=this.scrollable.container.getBoundingClientRect(),this.scrollable.container.addEventListener("scroll",this.onScroll))},this.onReset=()=>{return e=this,t=void 0,s=function*(){const e=this.siblings.length,t=e&&e*(this.siblings[0].previousElementSibling===this.element?1:-1),i=(0,p.Z)(this.element),s=i+t;this.element.classList.remove("no-transition"),this.element.style.transform=t?`translateY(${t*this.elementRect.height}px)`:"",this.swipeHandler.setCursor(""),this.scrollable&&this.scrollable.container.removeEventListener("scroll",this.onScroll),n.Z||(0,c.fc)(document.body,l.Z,{capture:!0,once:!0}),a.Z.settings.animationsEnabled&&(yield(0,d.Z)(250)),this.list.classList.remove("is-reordering"),this.element.classList.remove("is-dragging"),(0,u.Z)(this.element,this.list,s,i),[this.element,...this.siblings].forEach((e=>{e.style.transform=""})),this.element=this.siblings=this.elementRect=this.containerRect=this.minY=this.maxY=this.startScrollPos=this.addScrollPos=void 0,t&&this.onSort(i,s)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s},(0,r.Z)(this,e),this.swipeHandler=new s.Z({element:this.list,onSwipe:this.onSwipe,verifyTouchTarget:this.verifyTouchTarget,onStart:this.onStart,onReset:this.onReset,setCursorTo:document.body,middleware:this.middleware,withDelay:!0})}getSortableTarget(e){if(!e)return;let t=(0,h.Z)(e,this.list);return t&&t.classList.contains("cant-sort")&&(t=void 0),t}}},1656:(e,t,i)=>{"use strict";function s(e,t){return t?e.forEach((e=>e.setAttribute("disabled","true"))):e.forEach((e=>e.removeAttribute("disabled"))),()=>s(e,!t)}i.d(t,{Z:()=>s})},2648:(e,t,i)=>{"use strict";function s(e,t){if(!e.parentNode)return-1;if(t)return Array.from(e.parentNode.childNodes).indexOf(e);let i=0;for(;null!==(e=e.previousElementSibling);)++i;return i}i.d(t,{Z:()=>s})},6339:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(2738),n=i(5975),a=i(3241),o=i(5432),r=i(5953),d=i(6385),l=i(8497),c=i(3512);class h extends a.Z{constructor(e){super(!1),this.onClickOut=e=>{const t=e.target;(0,n.Z)(t,this.element)||Array.from(this.ignoreButtons).some((e=>(0,n.Z)(t,e)||t===e))||!(this.ignoreMouseOut.size<=1)||this.ignoreOutClickClassName&&(0,l.Z)(t,this.ignoreOutClickClassName)||this.toggle(!1)},this.onMouseOut=e=>{if(!this.isActive())return;if(this.clearTimeout("toggle"),this.ignoreMouseOut.size)return;const t=e.toElement;t&&(0,n.Z)(t,this.element)||this.setTimeout("toggle",(()=>{this.toggle(!1)}),200)},this.toggle=e=>{return t=this,i=void 0,a=function*(){const t=!!this.element.style.display&&void 0===e||e;if(this.init){if(!t)return;this.init(),this.init=null}if(t===this.isActive())return;const i=o.Z||!c.Z.settings.animationsEnabled?0:200;if(this.element.style.display&&void 0===e||e){const e=this.dispatchResultableEvent("open");yield Promise.all(e),this.element.style.display="",this.element.offsetLeft,this.element.classList.add("active"),this.dispatchEvent("openAfterLayout"),d.Z.pushItem(this.navigationItem={type:"dropdown",onPop:()=>{this.toggle(!1)}}),this.clearTimeout("toggle"),this.setTimeout("done",(()=>{this.forceClose=!1,this.dispatchEvent("opened")}),i)}else this.dispatchEvent("close"),this.ignoreMouseOut.clear(),this.ignoreButtons.clear(),this.element.classList.remove("active"),d.Z.removeItem(this.navigationItem),(0,s.EN)(window,this.onClickOut,{capture:!0}),this.clearTimeout("toggle"),this.setTimeout("done",(()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")}),i)},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a},(0,r.Z)(this,e),this.forceClose=!1,this.inited=!1,this.ignoreMouseOut=new Set,this.ignoreButtons=new Set,this.timeouts={}}attachButtonListener(e,t){let i=!0;o.Z?(0,s.fc)(e,(()=>{i?(i=!1,this.toggle(!0)):this.toggle()}),{listenerSetter:t}):(t.add(e)("mouseover",(s=>{i&&(t.add(e)("mouseout",(e=>{this.clearTimeout("toggle"),this.onMouseOut(e)})),i=!1),this.setTimeout("toggle",(()=>{this.toggle(!0)}),200)})),(0,s.fc)(e,(()=>{const t="click",i=!this.ignoreMouseOut.has(t);i&&!this.ignoreMouseOut.size&&(this.ignoreButtons.add(e),setTimeout((()=>{(0,s.fc)(window,this.onClickOut,{capture:!0})}),0)),this.setIgnoreMouseOut(t,i),this.toggle(i)}),{listenerSetter:t}))}clearTimeout(e){void 0!==this.timeouts[e]&&(clearTimeout(this.timeouts[e]),delete this.timeouts[e])}setTimeout(e,t,i){this.clearTimeout(e),this.timeouts[e]=window.setTimeout((()=>{this.clearTimeout(e),t()}),i)}init(){o.Z||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||this.clearTimeout("toggle")})}isActive(){return this.element.classList.contains("active")}setIgnoreMouseOut(e,t){t?this.ignoreMouseOut.add(e):this.ignoreMouseOut.delete(e)}}},4789:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,f:()=>s});var s,n=i(8594),a=i(3035),o=i(5296),r=i(3512),d=i(8487);function l(e){var t,i,o;if(null!==(t=e.margin)&&void 0!==t||(e.margin=0),null!==(i=e.maxDistance)&&void 0!==i||(e.maxDistance=1500),null!==(o=e.axis)&&void 0!==o||(e.axis="y"),r.Z.settings.animationsEnabled&&0!==e.forceDuration||(e.forceDirection=s.Static),e.forceDirection===s.Static)return e.forceDuration=0,c(e);const d=(0,a.AD)().then((()=>c(e)));return"y"===e.axis?(0,n.YW)(d):d}function c(e){const{element:t,container:i,getNormalSize:s,getElementPosition:n,transitionFunction:a,axis:r,margin:l,position:p,forceDirection:f,maxDistance:m,forceDuration:g}=e;if(!(0,d.Z)(t))return(0,o.Kx)(i),Promise.resolve();const v="y"===r?"top":"left",b="y"===r?"bottom":"right",y="y"===r?"height":"width",w="y"===r?"scrollHeight":"scrollWidth",S="y"===r?"scrollHeight":"offsetWidth",C="y"===r?"scrollTop":"scrollLeft",L=t.getBoundingClientRect(),E=i.getBoundingClientRect?i.getBoundingClientRect():document.body.getBoundingClientRect(),I=L[v]-E[v],M=n?n({elementRect:L,containerRect:E,elementPosition:I}):I,P=t[S],Z=s?s({rect:E}):E[y];let T=i[C];const k=i[w];let x;switch(p){case"start":x=M-l;break;case"end":x=L[b]-E[b]+l;break;case"nearest":case"center":if(Pm?(T=i.scrollTop+=x-m,x=m):x<-m&&(T=i.scrollTop+=x+m,x=-m)),x<0){const e=-T;x=Math.max(x,e)}else if(x>0){const e=k-(T+Z);x=Math.min(x,e)}const A=i[C]+x,_=Math.abs(x),F=null!=g?g:250+_/1500*350,D=Date.now(),R=null!=a?a:_<500?u:h,B=()=>F?Math.min((Date.now()-D)/F,1):1,N=()=>{const e=B(),t=R(e),s=x*(1-t);return i[C]=Math.round(A-s),e<1};if(!F||!x)return(0,o.Kx)(i),N(),Promise.resolve();if(e.startCallback){const t=k-Math.round(A+i["y"===r?"offsetHeight":"offsetWidth"]);e.startCallback({scrollSize:k,scrollPosition:T,distanceToEnd:t,path:x,duration:F,containerRect:E,elementRect:L,getProgress:B})}return(0,o.cK)(N,i)}function h(e){return 1-Math.pow(1-e,5)}function u(e){return 1-Math.pow(1-e,3.5)}!function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Static=2]="Static"}(s||(s={}))},8801:(e,t,i)=>{"use strict";i.d(t,{P:()=>n});const s="_";function n(e,t){const i=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(s);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(s);break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join(s);break;default:console.error("Unrecognized location:",e),n=""}return n+((null==t?void 0:t.downloadId)?"_download":"")+(i?"."+i:i)}},1708:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(7625);function n(e){(0,s.Z)(e.history,((t,i,s)=>{t.action.photo||(s.splice(i,1),void 0!==e.count&&--e.count)}))}},4081:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2325);function n(e,t="auto"){if(0===e)return(0,s.ag)("FileSize.B",[0]);const i="auto"===t,n=Math.floor(Math.log(e)/Math.log(1024)),a="auto"===t?Math.max(0,n-1):t,o=Math.max(0,a),r=(e/Math.pow(1024,n)).toFixed(o);return(0,s.ag)(["FileSize.B","FileSize.KB","FileSize.MB","FileSize.GB"][n],[i?r:parseFloat(r)])}},8939:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325);const n={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks",mm:"Months",y:"Years"};function a(e,t){const i=function(e,t=2){e||(e=1);const i=[],s=[{m:1,t:"s"},{m:60,t:"m"},{m:60,t:"h"},{m:24,t:"d"},{m:7,t:"w"}];let n=1;s.forEach(((t,a)=>{if(n=Math.round(n*t.m),e=0;--e)0===a[e].duration&&a.splice(e,1);return a}(e,2);if(t){const e=i.map((e=>s.ZP.format(n[e.type],!0,[e.duration])));return(0,s.v_)(e,!1,t)}const a=i.map((e=>(0,s.ag)(n[e.type],[e.duration]))),o=document.createElement("span");return o.append(...(0,s.v_)(a,!1)),o}},6272:(e,t,i)=>{"use strict";i.d(t,{u:()=>r});var s=i(2325);const n=new Map;let a=0;const o=(e,t,i="")=>{i=t.country_code+i,a=Math.max(a,i.length),n.set(i,{country:e,code:t})};function r(e){e=e||"",n.size||s.ZP.countriesList.forEach((e=>{e.country_codes.forEach((t=>{t.prefixes?t.prefixes.forEach((i=>{o(e,t,i)})):o(e,t)}))}));let t=e.replace(/\D/g,"");const i=t.slice(0,a);let r;for(let e=i.length-1;e>=0&&(r=n.get(i.slice(0,e+1)),!r);--e);if(!r)return{formatted:t,country:void 0,code:void 0,leftPattern:""};const d=r.country,l=r.code.patterns||[],c=t.slice(r.code.country_code.length);let h="",u=0,p="";for(let e=l.length-1;e>=0;--e){h=l[e];const t=h.replace(/ /g,"");let i=0;for(let e=0,s=Math.min(c.length,t.length);eu&&(u=i,p=h)}h=p||h,h=h.replace(/\d/g,"X"),h=r.code.country_code+" "+h,h.split("").forEach(((e,i)=>{" "===e&&" "!==t[i]&&t.length>i&&(t=t.slice(0,i)+" "+t.slice(i))}));let f=h&&h.length>t.length?h.slice(t.length):"";return f&&(f=f.replace(/X/g,"‒")),{formatted:t,country:d,code:r.code,leftPattern:f}}},645:(e,t,i)=>{"use strict";i.d(t,{M:()=>s,Z:()=>n});class s{constructor(){this.cache=new Map}static createCache(){const e={frames:new Map,framesNew:new Map,framesURLs:new Map,clearCache:()=>{e.framesNew.forEach((e=>{var t,i;null===(i=(t=e).close)||void 0===i||i.call(t)})),e.frames.clear(),e.framesNew.clear(),e.framesURLs.clear()},counter:0};return e}getCache(e){let t=this.cache.get(e);return t||this.cache.set(e,t=s.createCache()),++t.counter,t}releaseCache(e){const t=this.cache.get(e);t&&!--t.counter&&this.cache.delete(e)}getCacheCounter(e){const t=this.cache.get(e);return null==t?void 0:t.counter}generateName(e,t,i,s,n){return[e,t,i,s?"colored":"",n||""].filter(Boolean).join("-")}}const n=new s},9171:(e,t,i)=>{"use strict";function s(e,t,i,s,n,a,o){return[e,",",t," ",i," ",s,",",n," ",a,",",o].join("")}function n(e,t,i,n,a,o,r,d){const l=[];return l.push("M"+(e+i/2)+","+t),l.push("H"+(e+i-o)),o>0&&l.push("A"+s(o,o,0,0,1,e+i,t+o)),l.push("V"+(t+n-r)),r>0&&l.push("A"+s(r,r,0,0,1,e+i-r,t+n)),l.push("H"+(e+d)),d>0&&l.push("A"+s(d,d,0,0,1,e+0,t+n-d)),l.push("V"+(t+a)),a>0&&l.push("A"+s(a,a,0,0,1,e+a,t+0)),l.push("Z"),l.join(" ")}i.d(t,{Z:()=>n}),i(410).GO.generatePathData=n},1046:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(6740),n=i(1185),a=i(6705);function o(e,t,i){const o=(0,n.Z)(e,t,!1);let r,d;if(i){const e=(0,a.Z)(o);r=e.canvas,d=e.promise}else r=new Image,d=(0,s.cj)(r,o);return r.classList.add("thumbnail"),{image:r,loadPromise:d}}},1185:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4059);function n(e,t,i=!1){return(0,s.Z)(t.bytes,i)}},8580:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(1507),n=i(1046);function a(e,t,i,a=!1){const o=["video","gif"].includes(e.type);if(!t.downloaded||o||a){if("document"===e._&&t.downloaded&&!a&&(!o||t.type!==s.Pt))return null;const r=e.sizes||e.thumbs,d=(null==r?void 0:r.length)?r.find((e=>"photoStrippedSize"===e._)):null;if(d&&"bytes"in d)return(0,n.Z)(e,d,i)}return null}},6074:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(7625),n=i(5953);class a{constructor(e){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,(0,n.Z)(this,e)}setTargets(e,t,i){this.previous=e,this.next=t,this.reverse=i}get index(){return void 0!==this.count?this.previous.length:-1}reset(e=!1){this.current=void 0,this.previous=[],this.next=[],this.setLoaded(!0,e),this.setLoaded(!1,e)}go(e,t=!0){let i,s;if(e>0){if(i=this.next.splice(0,e),s=i.pop(),!s)return;void 0!==this.current&&i.unshift(this.current),this.previous.push(...i)}else{if(i=this.previous.splice(Math.max(0,this.previous.length+e),-e),s=i.shift(),!s)return;void 0!==this.current&&i.push(this.current),this.next.unshift(...i)}return this.next.length0),this.current}unsetCurrent(e){e?this.previous.push(this.current):this.next.unshift(this.current),this.current=void 0}goUnsafe(e,t){const i=e>0?Math.max(0,e-this.next.length):Math.min(0,e+this.previous.length),s=this.go(e,!i&&t);return{item:i?void 0:s,leftLength:i}}setLoaded(e,t){return(e?this.loadedAllDown:this.loadedAllUp)!==t&&(e?this.loadedAllDown=t:this.loadedAllUp=t,t||(e?this.loadPromiseDown=null:this.loadPromiseUp=null),!0)}load(e){if(e?this.loadedAllDown:this.loadedAllUp)return Promise.resolve();let t,i=e?this.loadPromiseDown:this.loadPromiseUp;return i||(t=e?this.reverse?this.previous[0]:this.next[this.next.length-1]:this.reverse?this.next[this.next.length-1]:this.previous[0],null!=t||(t=this.current),i=this.loadMore(t,e,this.loadCount).then((t=>{return n=this,a=void 0,r=function*(){if((e?this.loadPromiseDown:this.loadPromiseUp)!==i)return;t.items.length{const t=this.processItem?this.processItem(e):e;t&&n.push(t)}));const a=yield Promise.all(n);e?this.reverse?this.previous.unshift(...a):this.next.push(...a):this.reverse?this.next.push(...a):this.previous.unshift(...a),this.onLoadedMore&&this.onLoadedMore()},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r}),(()=>{})).then((()=>{e?this.loadPromiseDown=null:this.loadPromiseUp=null})),e?this.loadPromiseDown=i:this.loadPromiseUp=i,i)}}},3699:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(){this.listeners=new Set}add(e){return(t,i,s)=>{const n={element:e,event:t,callback:i,options:s};return this.addManual(n),n}}addManual(e){var t;e.element.addEventListener(e.event,e.callback,e.options),(null===(t=e.options)||void 0===t?void 0:t.once)&&(e.onceCallback=()=>{this.remove(e),e.onceFired=!0},e.element.addEventListener(e.event,e.onceCallback,e.options)),this.listeners.add(e)}remove(e){e.onceFired||(e.element.removeEventListener(e.event,e.callback,e.options),e.onceCallback&&e.element.removeEventListener(e.event,e.onceCallback,e.options)),this.listeners.delete(e)}removeManual(e,t,i,s){let n;for(const a of this.listeners)if(a.element===e&&a.event===t&&a.callback===i&&a.options===s){n=a;break}n&&this.remove(n)}removeAll(){this.listeners.forEach((e=>{this.remove(e)}))}}},9405:(e,t,i)=>{"use strict";i.d(t,{C:()=>a,c:()=>n});var s=i(9897);class n{constructor(e=0,t=e){this.width=e,this.height=t}aspect(e,t){return(0,s.Z)(this.width,this.height,e.width,e.height,t)}aspectFitted(e){return this.aspect(e,!0)}aspectCovered(e){return this.aspect(e,!1)}}function a(e,t){return new n(e,t)}},4755:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,_:()=>s});var s,n=i(410),a=i(3241),o=i(9405);!function(e){e[e.mobile=0]="mobile",e[e.medium=1]="medium",e[e.large=2]="large"}(s||(s={}));const r=(0,o.C)(20,20),d=(0,o.C)(36,36),l=(0,o.C)(18,18);class c extends a.Z{constructor(){super(),this.screenSizes=[{key:s.mobile,value:600},{key:s.medium,value:1275},{key:s.large,value:1680}],this.sizes={handhelds:{regular:(0,o.C)(270,270),webpage:(0,o.C)(270,200),album:(0,o.C)(270,0),esgSticker:(0,o.C)(68,68),animatedSticker:(0,o.C)(180,180),staticSticker:(0,o.C)(180,180),emojiSticker:(0,o.C)(112,112),poll:(0,o.C)(240,0),round:(0,o.C)(200,200),documentName:(0,o.C)(200,0),invoice:(0,o.C)(270,270),extendedInvoice:(0,o.C)(270,270),customEmoji:r,esgCustomEmoji:d,emojiStatus:l,popupSticker:(0,o.C)(68,68)},desktop:{regular:(0,o.C)(420,340),webpage:(0,o.C)(420,340),album:(0,o.C)(420,0),esgSticker:(0,o.C)(72,72),animatedSticker:(0,o.C)(200,200),staticSticker:(0,o.C)(200,200),emojiSticker:(0,o.C)(112,112),poll:(0,o.C)(330,0),round:(0,o.C)(280,280),documentName:(0,o.C)(240,0),invoice:(0,o.C)(320,320),extendedInvoice:(0,o.C)(420,340),customEmoji:r,esgCustomEmoji:d,emojiStatus:l,popupSticker:(0,o.C)(80,80)}},this.isMobile=!1,this.handleResize=()=>{const e=window.innerWidth;let t=this.screenSizes[0].key;for(let i=this.screenSizes.length-1;i>=0;--i)if(this.screenSizes[i].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame((()=>{this.handleResize(),this.rAF=0}))})),this.handleResize()}}const h=new c;n.GO.mediaSizes=h;const u=h},8631:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});const s=(0,i(5471).Z)("MIDDLEWARE");function n(e,t=s){return i=>{if(!(i instanceof Promise)){if(i instanceof Error)throw i;return i}return i.then((i=>{if(!e())throw t;return i}))}}},3228:(e,t,i)=>{"use strict";function s(e,t,i){return ei?i:e}i.d(t,{Z:()=>s})},2559:(e,t,i)=>{"use strict";function s(e,t=2){if(0===e)return"0";const i=t<0?0:t,s=Math.floor(Math.log(e)/Math.log(1e3));return parseFloat((e/Math.pow(1e3,s)).toFixed(i))+["","K","M","B","T"][s]}i.d(t,{Z:()=>s})},2575:(e,t,i)=>{"use strict";function s(e,t=" "){const i=e.toString().split(".");return i[0]=i[0].replace(/\B(?=(\d{3})+(?!\d))/g,t),i.join(".")}i.d(t,{Z:()=>s})},925:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4762);function n(e,t=e.HAVE_METADATA,i){return new Promise(((n,a)=>{if(e.readyState>=t)return void n();const o=s.IS_APPLE_MOBILE&&!i?"loadeddata":"canplay",r="error",d=()=>{e.removeEventListener(r,l),n()},l=t=>{e.removeEventListener(o,d),a(e.error)};e.addEventListener(o,d,{once:!0}),e.addEventListener(r,l,{once:!0})}))}},2296:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(6385),n=i(5432),a=i(4762),o=i(3910),r=i(2738),d=i(5975),l=i(3241);class c extends l.Z{constructor(e,t){super(!1),this.navigationType=e,this.withOverlay=t,this.onClick=e=>{var t;this.element&&(0,d.Z)(e.target,this.element)||((null===(t=this.listenerOptions)||void 0===t?void 0:t.capture)&&(0,o.Z)(e),this.close())},this.listenerOptions=t?{}:{capture:!0}}close(){var e;this.element&&(null===(e=this.overlay)||void 0===e||e.remove(),this.element=void 0,this.dispatchEvent("toggle",!1)),n.Z||window.removeEventListener("contextmenu",this.onClick,this.listenerOptions),document.removeEventListener(r.pf,this.onClick,this.listenerOptions),a.IS_MOBILE_SAFARI||s.Z.removeByType(this.navigationType)}open(e){this.close(),a.IS_MOBILE_SAFARI||s.Z.pushItem({type:this.navigationType,onPop:e=>{this.close()}}),this.element=e,!this.overlay&&this.withOverlay&&(this.overlay=document.createElement("div"),this.overlay.classList.add("btn-menu-overlay"),this.overlay.addEventListener(r.pf,(e=>{(0,o.Z)(e),this.onClick(e)}))),this.overlay&&this.element.parentElement.insertBefore(this.overlay,this.element),n.Z||window.addEventListener("contextmenu",this.onClick,Object.assign(Object.assign({},this.listenerOptions),{once:!0})),document.addEventListener(r.pf,this.onClick,this.listenerOptions),this.dispatchEvent("toggle",!0)}}},5180:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(7445);function n(e,t,i){const n=(e=+e)<0,a=s.Z[t];if(!a)throw new Error("CURRENCY_WRAP_INVALID");const o=e/Math.pow(10,a.exp);let r=a.exp;"IRR"==t&&Math.floor(o)==o&&(r=0);let d=function(e,t,i,s){e=(e+"").replace(/[^0-9+\-Ee.]/g,"");var n=isFinite(+e)?+e:0,a=isFinite(+t)?Math.abs(t):0,o=void 0===s?",":s,r=void 0===i?".":i,d="";return(d=(a?function(e,t){var i=Math.pow(10,t);return""+Math.round(e*i)/i}(n,a):""+Math.round(n)).split("."))[0].length>3&&(d[0]=d[0].replace(/\B(?=(?:\d{3})+(?!\d))/g,o)),(d[1]||"").length{"use strict";i.d(t,{Z:()=>n});var s=i(4755);function n(e,t,i,n){e.touches&&(e=e.touches[0]);const{pageX:a,pageY:o}=e,r=Array.from(t.children).find((e=>e.classList.contains("btn-menu-item")&&!e.classList.contains("hide")))||t;let{scrollWidth:d}=r;const{scrollHeight:l}=t,c=document.body.getBoundingClientRect(),h=c.width,u=c.height;d+=2*r.offsetLeft;let p=8,f=8,m=8,g=8;n&&(n.top&&n.top,n.right&&(f+=n.right),n.bottom&&(m+=n.bottom),n.left&&(g+=n.left)),i=s.Z.isMobile?"right":"left";let v="top";const b=u-l-m,y=h-d-f,w=g,S={x:{left:a,right:Math.min(y,a-d)},intermediateX:"right"===i?w:y,y:{top:o,bottom:o-l},intermediateY:b},C={left:S.x.left+d+f<=h,right:S.x.right>=g},L={top:S.y.top+l+m<=u,bottom:S.y.bottom-m>=m};{const e=C[i]?S.x[i]:(i="center",S.intermediateX);t.style.left=e+"px"}{const e=L[v]?S.y[v]:(v="center",S.intermediateY);t.style.top=e+"px"}return t.className=t.className.replace(/(top|center|bottom)-(left|center|right)/g,""),t.classList.add(("center"===v?v:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left")),{width:d,height:l}}},677:(e,t,i)=>{"use strict";i.d(t,{RP:()=>a,X:()=>o});const s=new Set(["all","web","webk"]),n=new Set;function a(e){return e.find((e=>s.has(e.platform)&&!n.has(e.reason)))}function o(e){return!!a(e)}},3174:(e,t,i)=>{"use strict";i.d(t,{O:()=>o,k:()=>a});var s=i(3512);const n={};function a(e,t,i,s){const a=e.id+"-"+t,o=n[a];return o&&o.width>=i&&o.height>=s}function o(e,t,i){return o=this,r=void 0,l=function*(){const o=e.id+"-"+i,{width:r,height:d}=t;if(a(e,i,r,d))return;const l=n[o]={width:r,height:d},c=yield s.Z.managers.appDocsManager.getLottieCachedThumb(e.id,i);if(n[o]!==l)return;if(c&&c.w>=r&&c.h>=d)return;const h=new Promise((e=>{t.toBlob((t=>e(t)))})),u=yield h;n[o]===l&&s.Z.managers.appDocsManager.saveLottiePreview(e.id,u,r,d,i)},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}},9966:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3035);function n(e){return function(e,t){let i,s=!1;return(...n)=>{i=n,s||(s=!0,e((()=>{s=!1,t(...i)})))}}(s.T2,e)}},8936:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(5953);class n{constructor(e){this.loading=!1,this.loaded=!1,(0,s.Z)(this,e),e.scrollable.onScrolledBottom=()=>{this.load()}}load(){return this.loaded?Promise.resolve():this.loading?this.promise:(this.loading=!0,void(this.promise=this.getPromise().then((e=>{this.loading=!1,this.promise=void 0,e?(this.loaded=!0,this.scrollable.onScrolledBottom=null):this.scrollable.checkForTriggers()}),(()=>{this.promise=void 0,this.loading=!1}))))}}},3719:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3781),n=i(2790),a=i(3512),o=i(7625),r=i(1708),d=i(6074),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class c extends d.Z{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{loadMore:(e,t,i)=>{const a=t?0:i;let o=null==e?void 0:e.mid;var d;return void 0===o&&(o=this.searchContext.maxId),t||(d=o,1,o=(0,s.Z)((0,n.Z)(d)+1)),this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==e?void 0:e.peerId),maxId:o,limit:a?0:i,backLimit:a})).then((e=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(0,r.Z)(e),e.next_rate&&(this.searchContext.nextRate=e.next_rate),{count:e.count,items:e.history})))},processItem:t=>l(this,void 0,void 0,(function*(){if((yield this.filterMids([t.mid])).length)return e.processItem(t)}))})),this.onHistoryDelete=({peerId:e,msgs:t})=>{const i=i=>i.peerId===e&&t.has(i.mid),s=(e,t,s)=>{i(e)&&s.splice(t,1)};(0,o.Z)(this.previous,s),(0,o.Z)(this.next,s),this.current&&i(this.current)&&(this.current=void 0,this.onEmptied&&this.onEmptied())},this.onHistoryMultiappend=e=>l(this,void 0,void 0,(function*(){if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;if(e.peerId!==this.searchContext.peerId)return;const t=yield this.filterMids([e.mid]),i=(yield Promise.all(t.map((e=>this.processItem(e))))).filter(Boolean);i.length&&(this.current?this.next.push(...i):this.previous.push(...i))})),this.onMessageSent=({message:e})=>{this.onHistoryMultiappend(e)},null!==(t=this.managers)&&void 0!==t||(this.managers=a.Z.managers),a.Z.addEventListener("history_delete",this.onHistoryDelete),a.Z.addEventListener("history_multiappend",this.onHistoryMultiappend),a.Z.addEventListener("message_sent",this.onMessageSent),e.isInner||(this.otherSideLoader=new c(Object.assign(Object.assign({},e),{isInner:!0})))}filterMids(e){return l(this,void 0,void 0,(function*(){const t=`${this.searchContext.peerId}_${this.searchContext.isScheduled?"scheduled":"history"}`;return yield this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._,e,t,e.length)}))}setSearchContext(e){this.searchContext=e,void 0!==this.searchContext.folderId&&(this.loadedAllUp=!0,void 0===this.searchContext.nextRate&&(this.loadedAllDown=!0)),"inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(this.loadedAllUp=!0),!1===this.searchContext.useSearch&&(this.loadedAllDown=this.loadedAllUp=!0),this.otherSideLoader&&this.otherSideLoader.setSearchContext(e)}reset(){super.reset(),this.searchContext=void 0,this.otherSideLoader&&this.otherSideLoader.reset()}getPrevious(e){let t=this.previous;return this.otherSideLoader&&e&&(t=t.concat(this.otherSideLoader.previous)),t}getNext(e){let t=this.next;return this.otherSideLoader&&e&&(t=t.concat(this.otherSideLoader.next)),t}getCurrent(){var e;return this.current||(null===(e=this.otherSideLoader)||void 0===e?void 0:e.current)}goToOtherEnd(e){return e>0?this.go(-this.previous.length):this.go(this.next.length)}goRound(e,t){var i;let s;if(null===(i=this.otherSideLoader)||void 0===i?void 0:i.current){if(s=this.otherSideLoader.goUnsafe(e,t),s.item)return s.item;if(!((e=s.leftLength)>0?this.otherSideLoader.next:this.otherSideLoader.previous).length){if(!(e>0?this.otherSideLoader.loadedAllUp:this.otherSideLoader.loadedAllDown))return;if(e>0&&(1===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllDown)||e<0&&(0===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllUp))return this.otherSideLoader.goToOtherEnd(e);this.otherSideLoader.unsetCurrent(e>0)}}if(s=this.goUnsafe(e,t),!s.item){if(this.loadedAllUp&&this.loadedAllDown)return this.goToOtherEnd(e);this.otherSideLoader&&(e=s.leftLength,s=this.otherSideLoader.goUnsafe(e,t),s.item&&this.unsetCurrent(e>0))}return null==s?void 0:s.item}setLoaded(e,t){var i;const s=super.setLoaded(e,t);if(s&&this.otherSideLoader&&t&&!1!==(null===(i=this.searchContext)||void 0===i?void 0:i.useSearch)){const e=this.loadedAllUp;this.otherSideLoader.setSearchContext(Object.assign(Object.assign({},this.searchContext),{maxId:e?1:0})),this.otherSideLoader.reverse=this.reverse,this.otherSideLoader.setLoaded(e,!0),this.otherSideLoader.load(!e)}return s}cleanup(){this.reset(),a.Z.removeEventListener("history_delete",this.onHistoryDelete),a.Z.removeEventListener("history_multiappend",this.onHistoryMultiappend),a.Z.removeEventListener("message_sent",this.onMessageSent),this.onEmptied=void 0,this.otherSideLoader&&(this.otherSideLoader.cleanup(),this.otherSideLoader=void 0)}}},9674:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(3035),n=i(3725),a=i(410),o=i(8487);const r=new class{constructor(){this.promises={},this.raf=s.T2.bind(null),this.scheduled=!1}do(e,t){let i=this.promises[e];return i||(this.scheduleFlush(),i=this.promises[e]=(0,n.Z)()),void 0!==t&&i.then((()=>t())),i}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const i=(0,o.Z)(e),s=i?this.mutate():Promise.resolve();return void 0!==t&&(i?s.then((()=>t())):t()),s}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf((()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}})))}};a.GO&&(a.GO.sequentialDom=r);const d=r},1713:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(1507),n=i(7030),a=i(9405),o=i(3114);function r(e,t,i,r,d=!0,l,c,h){const u=(0,o.Z)(e);let p;h||(h=(0,n.Z)(e,i,r,void 0,c));const f="document"===e._;p=f||u?(0,a.C)(e.w||h.w||512,e.h||h.h||512):(0,a.C)(h.w||100,h.h||100);let m=(0,a.C)(i,r);m=p=p.aspect(m,d);let g=!0;return(!f||["video","gif"].includes(e.type)||u)&&(m.width<200&&m.height<200&&(m=p=p.aspectCovered((0,a.C)(200,200))),l&&(l.message||l.reply_to_mid||l.media.webpage||l.replies&&l.replies.pFlags.comments&&l.replies.channel_id.toChatId()!==s.IA)&&m.width<320&&(m=(0,a.C)(320,m.height),g=!1),g&&m.width<120&&l&&(m=(0,a.C)(120,m.height),g=!1)),t.style.width=m.width+"px",t.style.height=m.height+"px",{photoSize:h,size:p,isFit:g}}},5345:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,s:()=>h});var s=i(5003),n=i(6519),a=i(3624),o=i(8631),r=i(5953),d=i(5418),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let c=0;class h{constructor(e){var t;(0,r.Z)(this,e),this.queue=[],null!==(t=this.middlewareHelper)&&void 0!==t||(this.middlewareHelper=(0,a.k)());const i="BATCH-PROCESSOR-"+ ++c;this.log?this.log=this.log.bindPrefix(i):this.log=(0,s.kg)(i)}get queuePromise(){return this.promise}clear(){this.log("clear"),this.queue.length=0,this.promise=void 0,this.middlewareHelper.clean()}addToQueue(e){return this.queue.push(e),this.setQueue()}setQueue(){if(!this.queue.length)return Promise.resolve();if(this.promise)return this.promise;const e=this.middlewareHelper.get(),t=this.log.bindPrefix("queue"),i=(0,o.Z)(e,this.possibleError),s=()=>l(this,void 0,void 0,(function*(){t("start",this.queue.length);const e=this.queue.splice(0,this.queue.length),n=performance.now(),a=e.map((e=>(e.then((e=>{t("render item time",performance.now()-n,e)})),e))),o=yield i(Promise.all(a));if(yield i(this.process(o,i,t)),t("queue rendered"),this.queue.length)return t("have new items to render"),s();t("end")}));t("setting pause");const n=this.promise=i((0,d.Z)(0)).then((()=>s().catch((e=>{throw e!==this.possibleError&&t.error("process queue error",e),e}))),(e=>{throw t("pause has been cleared"),e})).finally((()=>{this.promise===n&&(this.promise=void 0)}));return n}}class u{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),(0,r.Z)(this,e),this.elements=new Map,this.sorted=[],this.middleware=(0,a.k)(),this.batchProcessor=new h({log:this.log,process:(e,t,i)=>l(this,void 0,void 0,(function*(){const i=e.map((e=>this.update(e.id,e)));yield t(Promise.all(i))}))})}clear(){this.batchProcessor.clear(),this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach((e=>{this.update(e.id)})),this.onSort&&this.sorted.forEach(((e,t)=>{this.onSort(e,t)}))}updateList(e){const t=this.middleware.get();this.updateListWith((i=>{t()&&(void 0===i||i)?(this._updateList(),null==e||e(!0)):null==e||e(!1)}))}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e){return l(this,void 0,void 0,(function*(){if(this.get(e))return;const t={id:e,index:0};this.elements.set(e,t);const i=Promise.resolve(this.onElementCreate(t));return this.batchProcessor.addToQueue(i)}))}delete(e,t){const i=this.elements.get(e);if(!i)return!1;this.elements.delete(e);const s=this.sorted.indexOf(i);if(-1!==s&&this.sorted.splice(s,1),this.onDelete)if(t)this.onDelete(i);else{const e=this.middleware.get();this.updateElementWith((()=>{e()&&this.onDelete(i)}))}return!0}update(e,t=this.get(e)){var i;return l(this,void 0,void 0,(function*(){if(!t)return;if(t.index=yield this.getIndex(t),this.get(e)!==t)return;null===(i=this.onUpdate)||void 0===i||i.call(this,t);const s=(0,n.Z)(this.sorted,t,"index");this.onSort(t,s)}))}}},6854:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s="\ufeff"},4056:(e,t,i)=>{"use strict";function s(e){return e.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,(e=>"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";")).replace(/([^\#-~| |!])/g,(e=>"&#"+e.charCodeAt(0)+";")).replace(//g,">")}i.d(t,{Z:()=>s})},3738:(e,t,i)=>{"use strict";function s(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}i.d(t,{Z:()=>s})},8456:(e,t,i)=>{"use strict";function s(e,t,i=t+10){return(e=e.trim()).length>i&&(e=e.slice(0,t)+"..."),e}i.d(t,{Z:()=>s})},5157:(e,t,i)=>{"use strict";function s(e,t=!1){const i=parseInt(e+"",10),s=Math.floor(i/3600);let n=Math.floor((i-3600*s)/60),a=i-3600*s-60*n;return s&&(t=!0),n<10&&(n=t?"0"+n:n),a<10&&(a="0"+a),(s?s+":":"")+n+":"+a}i.d(t,{Z:()=>s})},8812:(e,t,i)=>{"use strict";function s(e){const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise((e=>{const i=new FileReader;i.onload=t=>{e(t.target.result)},i.readAsDataURL(t)}))}i.d(t,{Z:()=>s})},241:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1352);const n=new class{constructor(){if(s.kC)return;const e="visualViewport"in window?window.visualViewport:window,t=()=>{this.width=e.width||e.innerWidth,this.height=e.height||e.innerHeight};e.addEventListener("resize",t),t()}}},8594:(e,t,i)=>{"use strict";i.d(t,{YW:()=>p,ZP:()=>v,e9:()=>g,gp:()=>m});var s=i(3725),n=i(410),a=i(5418);const o=new(i(3241).Z),r="start",d="end";let l=!1,c=(0,s.Z)(),h=0;c.resolve();const u=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function p(e,t){l||(c=(0,s.Z)(),o.dispatchEvent(r),l=!0,n.ZP&&u("start")),++h,n.ZP&&u("attach promise, length:",h,t);const i=[void 0!==t?(0,a.Z)(t):void 0,e.finally((()=>{}))].filter(Boolean),d=performance.now(),p=c;return Promise.race(i).then((()=>{c!==p||c.isFulfilled||(--h,n.ZP&&u("promise end, length:",h,performance.now()-d),h<=0&&f())})),c}function f(){c.isFulfilled||(l=!1,h=0,o.dispatchEvent(d),c.resolve(),n.ZP&&u("end"))}function m(){f()}function g(){return c}function v(e,t,i){l&&e();const s=i?i.add(o):o.addEventListener.bind(o),n=i?i.removeManual.bind(i,o):o.removeEventListener.bind(o);return s(r,e),s(d,t),()=>{n(d,t),n(r,e)}}window.dispatchHeavyAnimationEvent=p},8130:(e,t,i)=>{"use strict";i.r(t),i.d(t,{AppDialogsManager:()=>ht,DIALOG_LIST_ELEMENT_TAG:()=>it,default:()=>pt});var s=i(9331),n=i(3512),a=i(3003),o=i(6194),r=i(2325),d=i(4668),l=i(2796),c=i(3897),h=i(1483),u=i(3416),p=i(1507),f=i(3186),m=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class g{constructor(e){this.managers=e,this.onArchiveClick=()=>m(this,void 0,void 0,(function*(){const e=yield this.managers.appMessagesManager.getDialogOnly(this.peerId);e&&this.managers.appMessagesManager.editPeerFolders([e.peerId],+!e.folder_id)})),this.hideTopic=()=>{this.managers.appChatsManager.editForumTopic({chatId:this.peerId.toChatId(),topicId:this.threadId,hidden:!0})},this.toggleTopic=()=>{this.managers.appChatsManager.editForumTopic({chatId:this.peerId.toChatId(),topicId:this.threadId,closed:!this.dialog.pFlags.closed})},this.onPinClick=()=>{const{peerId:e,filterId:t,threadId:i}=this;this.managers.appMessagesManager.toggleDialogPin({peerId:e,filterId:t,topicId:i}).catch((e=>m(this,void 0,void 0,(function*(){"PINNED_DIALOGS_TOO_MUCH"!==e.type&&"PINNED_TOO_MUCH"!==e.type||(i?this.managers.apiManager.getLimit("topicPin").then((e=>{(0,l.bC)({langPackKey:"LimitReachedPinnedTopics",langPackArguments:[e]})})):t>=1?(0,l.bC)({langPackKey:"PinFolderLimitReached"}):(0,f.Z)("pin"))}))))},this.onUnmuteClick=()=>{this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,mute:!1,threadId:this.threadId})},this.onMuteClick=()=>{new c.Z(this.peerId,this.threadId)},this.onUnreadClick=()=>m(this,void 0,void 0,(function*(){const{peerId:e,dialog:t}=this;t.unread_count?(this.managers.appMessagesManager.readHistory(e,t.top_message,this.threadId),this.threadId||this.managers.appMessagesManager.markDialogUnread(e,!0)):this.threadId||this.managers.appMessagesManager.markDialogUnread(e)})),this.onDeleteClick=()=>{new o.Z(this.peerId,void 0,void 0,this.threadId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=(0,d.Z)(e.target,it)}catch(e){}if(t){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),(()=>{m(this,void 0,void 0,(function*(){this.peerId=t.dataset.peerId.toPeerId(),this.threadId=+t.dataset.threadId||void 0,this.dialog=yield this.managers.dialogsStorage.getDialogOrTopic(this.peerId,this.threadId),this.filterId=this.threadId?void 0:pt.filterId,this.canManageTopics=this.threadId?yield this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"manage_topics"):void 0,yield Promise.all(this.buttons.map((e=>m(this,void 0,void 0,(function*(){const t=yield e.verify();e.element.classList.toggle("hide",!t)})))));const i=this.threadId?"Delete":yield this.managers.appPeersManager.getDeleteButtonText(this.peerId);this.buttons[this.buttons.length-1].element.lastChild.replaceWith((0,r.ag)(i)),t.classList.add("menu-open"),(0,h.Z)(e,this.element),u.Z.openBtnMenu(this.element,(()=>{t.classList.remove("menu-open"),this.peerId=this.dialog=this.filterId=this.threadId=this.canManageTopics=void 0}))}))})()}}}init(){this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>m(this,void 0,void 0,(function*(){return!this.threadId&&!(yield this.managers.appMessagesManager.isDialogUnread(this.dialog))}))},{icon:"readchats",text:"MarkAsRead",onClick:this.onUnreadClick,verify:()=>this.managers.appMessagesManager.isDialogUnread(this.dialog)},{icon:"pin",text:"ChatList.Context.Pin",onClick:this.onPinClick,verify:()=>m(this,void 0,void 0,(function*(){var e;return!(this.threadId&&!this.canManageTopics)&&!(void 0!==this.filterId&&this.filterId>1?(yield this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId):null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned)}))},{icon:"unpin",text:"ChatList.Context.Unpin",onClick:this.onPinClick,verify:()=>m(this,void 0,void 0,(function*(){var e;return!(this.threadId&&!this.canManageTopics)&&(void 0!==this.filterId&&this.filterId>1?(yield this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned))}))},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>m(this,void 0,void 0,(function*(){return this.peerId!==n.Z.myId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.dialog.peerId,threadId:this.threadId}))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>m(this,void 0,void 0,(function*(){return this.peerId!==n.Z.myId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.dialog.peerId,threadId:this.threadId}))}))},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.peerId!==n.Z.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.peerId!==n.Z.myId},{icon:"hide",text:"Hide",onClick:this.hideTopic,verify:()=>m(this,void 0,void 0,(function*(){return this.canManageTopics&&this.dialog.id===p.Ox}))},{icon:"lock",text:"CloseTopic",onClick:this.toggleTopic,verify:()=>this.canManageTopics&&!this.dialog.pFlags.closed},{icon:"lockoff",text:"RestartTopic",onClick:this.toggleTopic,verify:()=>this.canManageTopics&&!!this.dialog.pFlags.closed},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>m(this,void 0,void 0,(function*(){return!this.threadId||!!this.canManageTopics&&this.dialog.id!==p.Ox}))}],this.element=(0,a.b)({buttons:this.buttons}),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var v=i(6008),b=i(1405),y=i(8805),w=i(632),S=i(4762),C=i(5003),L=i(4271),E=i(4494),I=i(9099),M=i(410),P=i(8842),Z=i(1447),T=i(9492),k=i(534),x=i(744),A=i(2738),_=i(4484),F=i(5565),D=i(4159),R=i(3442),B=i(7487),N=i(9174),O=i(3910),U=i(490);class H{constructor(e,t){this.managers=e,this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=e=>{Promise.all([B.Z.get("dc"),n.Z.managers.rootScope.getConnectionStatus()]).then((([t,i])=>{t||(t=D.Z.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const s=i["NET-"+t],n=s&&(e||s.status)===N.Q.Connected;this.connecting&&n&&this.managers.apiUpdatesManager.forceGetDifference(),n&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=s&&(e||s.status)===N.Q.TimedOut,this.connecting=!n,this.retryAt=s&&s.retryAt,M.ZP&&this.log("connecting",this.connecting),this.setState()}))},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,(0,F.Z)(this.statusEl,(0,r.ag)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{if(U.Z.deactivatedReason)return;const e=H.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",(()=>this.managers.networkerFactory.forceReconnect()));this.setStatusText("ConnectionStatus.TimedOut",[e])}else if(this.hadConnect)if(void 0!==this.retryAt){const e=document.createElement("span"),t=this.retryAt,i=()=>{const i=Date.now();e.innerText=""+Math.max(0,Math.round((t-i)/1e3)),i>t&&clearInterval(s)},s=setInterval(i,1e3);i();const n=this.getA("ConnectionStatus.Reconnect",(()=>this.managers.networkerFactory.forceReconnectTimeout()));this.setStatusText("ConnectionStatus.ReconnectIn",[e,n])}else this.setStatusText("ConnectionStatus.Reconnecting");else this.setStatusText("ConnectionStatus.Waiting");else this.updating&&this.setStatusText("Updating");M.ZP&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame((()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout),this.setStateTimeout=window.setTimeout((()=>{(0,I.Z)({element:this.statusContainer,className:"is-shown",forwards:this.connecting||this.updating,duration:200}),this.setStateTimeout=0,M.ZP&&this.log("setState: isShown:",this.connecting||this.updating)}),e)}))},this.log=(0,C.kg)("CS",void 0,void 0),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=(0,E.Z)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new R.Z({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),t.prepend(this.statusContainer),n.Z.addEventListener("connection_status_change",(e=>{this.setConnectionStatus()})),n.Z.addEventListener("state_synchronizing",(e=>{e||(this.updating=!0,M.ZP&&this.log("updating",this.updating),this.setState())})),n.Z.addEventListener("state_synchronized",(e=>{M.ZP&&this.log("state_synchronized",e),e||(this.updating=!1,M.ZP&&this.log("updating",this.updating),this.setState())})),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,H.CHANGE_STATE_DELAY+1e3)}getA(e,t){const i=document.createElement("a");return i.classList.add("force-reconnect"),i.append((0,r.ag)(e)),(0,A.fc)(i,(e=>{(0,O.Z)(e),t()})),i}}H.CHANGE_STATE_DELAY=1e3;var z,j=i(6740),G=i(3035),V=i(2894),K=i(5432),W=i(1154),$=i(241),q=i(8487);!function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(z||(z={}));var Q=i(5345),Y=i(5701),X=i(5296),J=i(8222);function ee(e,t,i,s){return e>=s?t+i:function(e,t){return-t/2*(Math.cos(Math.PI*e)-1)}(e/s,i)+t}var te=i(4755);function ie(e,t,i,s,n,a,o,r){const d=e.canvas.dpr;if(d&&(t*=d,i*=d,s*=d,n*=d),"number"==typeof a)d&&(a*=d),a={tl:a,tr:a,br:a,bl:a};else{const e={tl:0,tr:0,br:0,bl:0};for(const t in e)a[t]=a[t]?d?a[t]*d:a[t]:e[t]}e.beginPath(),e.moveTo(t+a.tl,i),e.lineTo(t+s-a.tr,i),e.quadraticCurveTo(t+s,i,t+s,i+a.tr),e.lineTo(t+s,i+n-a.br),e.quadraticCurveTo(t+s,i+n,t+s-a.br,i+n),e.lineTo(t+a.bl,i+n),e.quadraticCurveTo(t,i+n,t,i+n-a.bl),e.lineTo(t,i+a.tl),e.quadraticCurveTo(t,i,t+a.tl,i),e.closePath(),o&&e.fill(),r&&e.stroke()}const se=window.devicePixelRatio,ne=20*se,ae=2.5*se,oe=2*se,re=1*se;var de=i(6818),le=i(6385),ce=i(3013),he=i(130),ue=i(4332),pe=i(1168),fe=i(7030),me=i(8115),ge=i(496),ve=i(5381),be=i(7530),ye=i(2291),we=i(5772),Se=i(3385),Ce=i(2554),Le=i(8050),Ee=i(6976),Ie=i(3725),Me=i(7362),Pe=i(8631),Ze=i(2312),Te=i(2059),ke=i(2493),xe=i(319);var Ae=i(3228);class _e{constructor(){this.font="30pt Helvetica",this.currTime=Date.now(),this.diffTime=0,this.spread=0,this.paused=!1,this.pausedTime=0,this.pauseInterval=850,this.lightSource=0,this.inc=.032,this.lightSpread=.55,this.animations=["slide","slide","slide","slide"],this.currentAnimationIndex=0}keepTime(){this.diffTime=Date.now()-this.currTime,this.currTime=Date.now()}cycleAnimation(){++this.currentAnimationIndex,this.currentAnimationIndex>=this.animations.length&&(this.currentAnimationIndex=0)}animate(){const e=this.animations[this.currentAnimationIndex];return"glow"===e?this.animateGlow():"slide"===e?this.animateSlide():void console.log("unknown animation type: "+String(e))}animateGlow(){var e=68;return()=>{var t=this.diffTime/(1e3/60)*10;return this.paused?Date.now()-this.pausedTime>800&&(e=68,this.cycleAnimation(),this.paused=!1):(e=parseInt(""+(e+t)))>=255&&(this.paused=!0,this.pausedTime=Date.now()),"rgb("+e+","+e+","+e+")"}}animateSlide(){var e,t,i,s=this.ctx.createLinearGradient(0,0,this.canvas.width,0),n=this.inc*(this.diffTime/(1e3/60));if(this.paused){if(Date.now()-this.pausedTime>this.pauseInterval)return this.lightSource=-.6,this.cycleAnimation(),this.paused=!1,this.animateSlide()}else this.lightSource+=n,this.lightSource>1+this.lightSpread&&(this.paused=!0,this.pausedTime=Date.now());i=(0,Ae.Z)(this.lightSource,0,1),e=(0,Ae.Z)(this.lightSource-this.lightSpread,0,1),t=(0,Ae.Z)(this.lightSource+this.lightSpread,0,1);const a=J.Z.getProperty("background-color-true"),o=J.Z.getProperty("surface-color");return s.addColorStop(e,a),s.addColorStop(i,o),s.addColorStop(t,a),s}settings(e={}){var t,i,s,n,a,o;this.canvas=null!==(t=e.canvas)&&void 0!==t?t:document.createElement("canvas"),this.ctx=this.canvas.getContext("2d"),this.font=null!==(i=e.font)&&void 0!==i?i:this.font,this.lightSpread=null!==(s=e.lightSpread)&&void 0!==s?s:this.lightSpread,this.inc=null!==(n=e.inc)&&void 0!==n?n:this.inc,this.animations=null!==(a=e.animations)&&void 0!==a?a:this.animations,this.text=null!==(o=e.text)&&void 0!==o?o:this.text,this.fillStyle=e.fillStyle,this.canvas.classList.add("shimmer-canvas")}on(){const{width:e,height:t}=this.canvas;this.keepTime(),this.ctx.clearRect(0,0,e,t),this.font&&(this.ctx.font=this.font),this.ctx.fillStyle=this.animate(),this.ctx.fillRect(0,0,e,t),this.fillStyle&&(this.ctx.fillStyle=this.fillStyle,this.ctx.fillRect(0,0,e,t)),this.text&&this.ctx.fillText(this.text,50,50)}}class Fe{constructor(e={}){var t,i,s;this.onThemeChange=()=>{this.stopAnimation(),this.startAnimation()},this.onResize=()=>{const{canvas:e}=this,{width:t,height:i,dpr:s}=e;this.updateCanvasSize(),e.width===t&&e.height===i&&e.dpr===s||(this.stopAnimation(),this.startAnimation())},this.shimmer=new _e,this.tempId=0,this.canvas=document.createElement("canvas"),this.canvas.classList.add("dialogs-placeholder-canvas"),this.ctx=this.canvas.getContext("2d"),this.generatedValues=[],this.avatarSize=null!==(t=e.avatarSize)&&void 0!==t?t:54,this.marginVertical=null!==(i=e.marginVertical)&&void 0!==i?i:9,this.totalHeight=null!==(s=e.totalHeight)&&void 0!==s?s:this.avatarSize+2*this.marginVertical,this.lineHeight=10,this.lineBorderRadius=6,this.lineMarginVertical=8,this.statusWidth=24}attach({container:e,rect:t,getRectFrom:i,onRemove:s,blockScrollable:n}){const{canvas:a}=this;this.onRemove=s,this.getRectFrom="function"==typeof i?i:(i||e).getBoundingClientRect.bind(i||e),(this.blockScrollable=n)&&(n.container.style.overflowY="hidden"),this.updateCanvasSize(t),this.startAnimation(),e.append(a)}detach(e){this.detachTime||(this.availableLength=e,this.detachTime=Date.now(),n.Z.settings.animationsEnabled||this.remove())}remove(){var e;this.stopAnimation(),this.canvas.parentElement&&(this.canvas.remove(),this.blockScrollable&&(this.blockScrollable.container.style.overflowY="",this.blockScrollable=void 0)),null===(e=this.onRemove)||void 0===e||e.call(this),this.onRemove=void 0}updateCanvasSize(e=this.getRectFrom()){const{canvas:t}=this,i=t.dpr=window.devicePixelRatio;t.width=e.width*i,t.height=e.height*i,t.style.width=e.width+"px",t.style.height=e.height+"px"}renderDetachAnimationFrame(){const{canvas:e,ctx:t,detachTime:i,length:s,availableLength:a}=this;if(!i)return;if(!n.Z.settings.animationsEnabled)return void this.remove();const{width:o}=e;t.globalCompositeOperation="destination-out";const r=Date.now()-i;let d=!0;for(let e=0;e=a?15*(a-1):15*e);if(i<=0){d=!1;continue}const n=ee(i,0,1,150);t.beginPath(),t.rect(0,this.dialogHeight*e,o,this.dialogHeight),t.fillStyle=`rgba(0, 0, 0, ${n})`,t.fill(),n<1&&(d=!1)}t.globalCompositeOperation="source-over",d&&this.remove()}renderFrame(){this.shimmer.on(),this.renderDetachAnimationFrame()}startAnimation(){const{canvas:e,shimmer:t}=this,i=++this.tempId,s=this.createPattern();t.settings({canvas:e,fillStyle:s});const a=()=>this.tempId===i;this.renderFrame(),(0,X.jt)((()=>!!a()&&(n.Z.settings.animationsEnabled&&this.renderFrame(),a()))),n.Z.addEventListener("theme_change",this.onThemeChange),te.Z.addEventListener("resize",this.onResize)}stopAnimation(){++this.tempId,n.Z.removeEventListener("theme_change",this.onThemeChange),te.Z.removeEventListener("resize",this.onResize)}createPattern(){const{canvas:e,ctx:t}=this,i=document.createElement("canvas"),s=i.getContext("2d"),n=e.dpr;i.dpr=n,i.width=e.width,i.height=e.height,s.fillStyle=J.Z.getProperty("surface-color"),s.fillRect(0,0,i.width,i.height),s.fillStyle="#000",s.globalCompositeOperation="destination-out";const a=this.dialogHeight=this.totalHeight*n,o=this.length=Math.ceil(e.height/a);for(let e=0;e{})).finally((()=>{e[t]===s&&delete e[t]}));const n=(0,Pe.Z)((()=>e[t]===s));return{deferred:s,middleware:n}}class nt extends Q.Z{constructor(e){super({getIndex:e=>{var t;return this.managers.dialogsStorage.getDialogIndex(null!==(t=this.forumPeerId)&&void 0!==t?t:e.id,this.indexKey,this.forumPeerId?e.id:void 0)},onDelete:e=>{var t;e.dom.listEl.remove(),null===(t=this.onListLengthChange)||void 0===t||t.call(this)},onSort:(e,t)=>{var i;const s=e.dom.listEl.parentElement!==this.list;(0,_.Z)(e.dom.listEl,this.list,t),s&&(null===(i=this.onListLengthChange)||void 0===i||i.call(this))},onElementCreate:e=>tt(this,void 0,void 0,(function*(){var t;const i=[],s=ut.addListDialog({peerId:null!==(t=this.forumPeerId)&&void 0!==t?t:e.id,loadPromises:i,isBatch:!0,threadId:this.forumPeerId?e.id:void 0,isMainList:"index_0"===this.indexKey});return e.dom=s.dom,e.dialogElement=s,yield Promise.all(i),e})),updateElementWith:G.TR,log:e.log}),(0,Ve.Z)(this,e)}clear(){this.list.replaceChildren(),super.clear()}}class at extends ze.ZP{constructor({peerId:e,rippleEnabled:t=!0,onlyFirstName:i=!1,meAsSaved:n=!0,avatarSize:a="bigger",autonomous:o,loadPromises:r,fromName:d,noIcons:l,threadId:c,wrapOptions:h={},isMainList:u}){var p;super({clickable:!0,noRipple:!t,havePadding:!c,title:!0,titleRightSecondary:!0,subtitle:!0,subtitleRight:!0,noWrap:!0,asLink:!0}),this.subtitleRight.remove();const f=c?void 0:new s.Z;if(f){const t={bigger:54,abitbigger:42,small:32}[a];f.classList.add("dialog-avatar","avatar-"+t),f.updateWithOptions({loadPromises:r,lazyLoadQueue:h.lazyLoadQueue,isDialog:!!n,peerId:e,peerTitle:d}),this.applyMediaElement(f,a)}const m=this.container,g=this.title;g.classList.add("user-title"),this.titleRow.classList.add("dialog-title");const v=new P.Z,b=v.update({peerId:e,fromName:d,dialog:n,onlyFirstName:i,withIcons:!l,threadId:c});null==r||r.push(b),g.append(v.element),g.classList.add("tgico");const y=this.subtitle,w=this.container;w.classList.add("chatlist-chat","chatlist-chat-"+a),o||(w.href="#"+e),"bigger"===a?this.container.classList.add("row-big"):"small"===a&&this.container.classList.add("row-small"),w.dataset.peerId=""+e,c&&(w.dataset.threadId=""+c);const S=document.createElement("span");S.classList.add("message-status","sending-status");const C=document.createElement("span");C.classList.add("message-time");const E=this.titleRight;E.classList.add("dialog-title-details"),E.append(S,C),this.subtitleRow.classList.add("dialog-subtitle");const I=this.dom={avatarEl:f,captionDiv:m,titleSpan:v.element,titleSpanContainer:g,statusSpan:S,lastTimeSpan:C,lastMessageSpan:y,containerEl:w,listEl:w,subtitleEl:this.subtitleRow};if(!o){w.dialogDom=I;const t=L.ZP.chat;t&&L.ZP.isSamePeer(t,{peerId:e,threadId:c,type:"chat"})&&ut.setDialogActive(w,!0),u&&(null===(p=ut.forumTab)||void 0===p?void 0:p.peerId)===e&&!c&&w.classList.add("is-forum-open")}}createUnreadBadge(){if(this.dom.unreadBadge)return;const e=this.dom.unreadBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22",this.dom.subtitleEl.append(e)}createUnreadAvatarBadge(){if(this.dom.unreadAvatarBadge)return;const e=this.dom.unreadAvatarBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22 avatar-badge",this.dom.listEl.append(e)}createMentionsBadge(){if(this.dom.mentionsBadge)return;const e=this.dom.mentionsBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22 mention mention-badge",e.innerText="@",this.dom.lastMessageSpan.after(e)}toggleBadgeByKey(e,t,i,s){(0,I.Z)({element:this.dom[e],className:"is-visible",forwards:t,duration:s?0:250,onTransitionEnd:t?void 0:()=>{this.dom[e].remove(),delete this.dom[e]},useRafs:i&&(0,q.Z)(this.dom[e])?0:2})}}class ot extends Ge.h{toggle(e){return tt(this,void 0,void 0,(function*(){this.init2&&(yield this.init2()),(0,I.Z)({element:this.container,className:"is-visible",forwards:e,duration:300,onTransitionEnd:e?void 0:()=>{this.onCloseAfterTimeout()},useRafs:this.firstTime?(this.firstTime=void 0,2):void 0})}))}init(e){(0,Ve.Z)(this,e),this.log=(0,C.kg)("FORUM"),this.firstTime=!0,this.container.classList.add("topics-container");const t=!this.slider;t&&(this.closeBtn.classList.replace("tgico-left","tgico-close"),this.container.classList.add("active","is-floating"),(0,A.fc)(this.closeBtn,(()=>{ut.toggleForumTab(void 0,this)}),{listenerSetter:this.listenerSetter})),this.rows=document.createElement("div"),this.rows.classList.add("sidebar-header__rows"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("sidebar-header__subtitle"),this.title.replaceWith(this.rows),this.rows.append(this.title,this.subtitle);const i=ut.createChatList();ut.setListClickListener(i,null,!0),this.scrollable.append(i),this.xd=new lt(this.peerId,t?80:0),this.xd.scrollable=this.scrollable,this.xd.sortedList=new nt({managers:this.managers,log:this.log,list:i,indexKey:"index_0",forumPeerId:this.peerId}),this.xd.bindScrollable();const s=()=>({peerId:this.peerId,type:"chat"}),a=(0,We.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"info",text:"ForumTopic.Context.Info",onClick:()=>tt(this,void 0,void 0,(function*(){const e=x.ZP.createTab(Qe.Z,!0);e.isFirst=!0,e.setPeer(this.peerId),(yield e.fillProfileElements())(),e.loadSidebarMedia(!0),e.open()}))},{icon:"message",text:"ForumTopic.Context.ShowAsMessages",onClick:()=>{const e=L.ZP.chat;L.ZP[(null==e?void 0:e.peerId)===this.peerId?"setPeer":"setInnerPeer"](s())},verify:()=>{const e=L.ZP.chat;return!e||!L.ZP.isSamePeer(e,s())}},{icon:"adduser",text:"ForumTopic.Context.AddMember",onClick:()=>{},verify:()=>!1},{icon:"add",text:"ForumTopic.Context.New",onClick:()=>{x.ZP.createTab(Je.Z).open(this.peerId)},separator:!0,verify:()=>this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"manage_topics")}]});if(this.listenerSetter.add(n.Z)("history_reload",(e=>{this.peerId===e&&this.xd.fullReset()})),this.listenerSetter.add(n.Z)("chat_update",(e=>tt(this,void 0,void 0,(function*(){this.peerId===e.toPeerId(!0)&&((yield this.managers.appChatsManager.getChat(e)).pFlags.forum||ut.toggleForumTab(void 0,this))})))),K.Z&&(0,W.Z)({element:this.container,onSwipe:()=>{ut.toggleForumTab(void 0,this)},middleware:this.middlewareHelper.get()}),this.header.append(a),!t)return this.init2()}init2(){return tt(this,void 0,void 0,(function*(){this.init2=void 0;const e=this.middlewareHelper.get(),t=this.peerId;this.managers.apiUpdatesManager.subscribeToChannelUpdates(this.peerId.toChatId()),e.onDestroy((()=>{this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(this.peerId.toChatId())}));const i=(0,Me.Z)({peerId:t,dialog:!0,wrapOptions:{middleware:e}}),s=L.ZP.setPeerStatus({peerId:t,element:this.subtitle,needClear:!0,useWhitespace:!1,middleware:e,noTyping:!0});return Promise.all([i,s,this.xd.onChatsScroll().then((e=>e.cached?e.renderPromise:void 0))]).then((([t,i,s])=>{e()&&(this.title.append(t),null==i||i())}))}))}onCloseAfterTimeout(){super.onCloseAfterTimeout(),this.xd.destroy()}}const rt=new Error("not implemented");class dt{constructor(){this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout((()=>{this.sliceTimeout=void 0,this.sortedList.list.childElementCount&&!ut.processContact&&(0,G.TR)((()=>{const e=performance.now(),t=this.scrollable.scrollTop,i=this.sortedList.list.firstElementChild,s=this.scrollable.container.getBoundingClientRect(),n=i.getBoundingClientRect(),a=Array.from(this.scrollable.splitUp.children);let o=this.scrollable.splitUp.offsetTop;o&&t{this.deleteDialogByKey(this.getDialogKeyFromElement(e))})),this.setOffsets(),this.scrollable.scrollTop=c.offsetTop-u,this.log("slice time",performance.now()-e)}))}),200)},this.log=(0,C.kg)("CL"),this.offsets={top:0,bottom:0},this.managers=n.Z.managers,this.listenerSetter=new Ke.Z}getOffsetIndex(e){return{index:this.scrollable.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){const t=this.getOffsetIndex("top"),i=this.getOffsetIndex("bottom");if(!t.index&&!i.index)return!0;const s=(0,Le.Z)(e,this.indexKey);return(!t.index||s<=t.index)&&(!i.index||s>=i.index)}setIndexKey(e){this.indexKey=e,this.sortedList.indexKey=e}deleteDialogByKey(e){this.sortedList.delete(e)}deleteDialog(e){return this.deleteDialogByKey(this.getDialogKey(e))}updateDialog(e){const t=this.getDialogKey(e);if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e);if(!this.sortedList.has(t)&&this.loadedDialogsAtLeastOnce)return void this.sortedList.add(t);const i=this.getDialogElement(t);i&&(ut.setLastMessageN({dialog:e,dialogElement:i,setUnread:!0}),this.sortedList.update(t))}onChatsScrollTop(){return this.onChatsScroll("top")}onChatsScroll(e="bottom"){return this.loadDialogs(e)}createPlaceholder(){const e=this.placeholder=new Fe(this.placeholderOptions),t=this.getRectFromForPlaceholder();return e.attach({container:this.sortedList.list.parentElement,getRectFrom:t,onRemove:()=>{this.placeholder===e&&(this.placeholder=void 0)},blockScrollable:this.scrollable}),e}loadDialogs(e){const t=this.log.bindPrefix("load-"+(i=1e3,s=9999,i=Math.ceil(i),s=Math.floor(s),Math.floor(Math.random()*(s-i+1))+i));var i,s;if(t("try",e),this.loadDialogsPromise||this.loadDialogsRenderPromise)return this.loadDialogsPromise;if(this.scrollable.loadedAll[e])return Promise.resolve({cached:!0,renderPromise:Promise.resolve()});t.warn("start",e);const n=(0,He.Z)("MIDDLEWARE"),a=(0,Ie.Z)(),o=new Promise(((i,s)=>tt(this,void 0,void 0,(function*(){const r=this.sortedList.list;let d=this.placeholder;try{const i=this.loadDialogsInner(e),s=yield i;if(!r.childElementCount&&!d&&(!this.loadedDialogsAtLeastOnce&&this.needPlaceholderAtFirstTime||!s.cached)){if(this.loadDialogsRenderPromise!==o)throw n;d=this.createPlaceholder(),a.resolve(!1)}const l=yield s.result;if(this.loadDialogsRenderPromise!==o)throw n;a.resolve(s.cached),"bottom"===e?l.isEnd&&(this.scrollable.loadedAll[e]=!0):l.isTopEnd&&(this.scrollable.loadedAll[e]=!0);const c=l.dialogs.length;if(t(`will render ${c} dialogs`),c){const t=("top"===e?l.dialogs.slice().reverse():l.dialogs).map((e=>this.sortedList.add(this.getDialogKey(e))));if(yield Promise.all(t).catch(),this.loadDialogsRenderPromise!==o)throw n}const h=l.dialogs["top"===e?0:c-1];h&&(this.offsets[e]=(0,Le.Z)(h,this.indexKey)),this.loadedDialogsAtLeastOnce=!0,ut.onListLengthChange(),t("getDialogs",l,r.childElementCount),setTimeout((()=>{this.scrollable.onScroll()}),0),d&&d.detach(r.childElementCount)}catch(e){return"MIDDLEWARE"!==(null==e?void 0:e.type)&&t.error(e),s(e),void a.reject(e)}i()})))).finally((()=>{this.loadDialogsRenderPromise===o?(t("end"),this.loadDialogsRenderPromise=void 0):t("has been cleared")}));this.loadDialogsRenderPromise=o;const r=this.loadDialogsPromise=a.then((e=>({cached:e,renderPromise:o}))).finally((()=>{this.loadDialogsPromise===r&&(this.loadDialogsPromise=void 0)}));return r}setOffsets(){return tt(this,void 0,void 0,(function*(){const e=this.sortedList.list,[t,i]=yield Promise.all([this.getDialogFromElement(e.firstElementChild),this.getDialogFromElement(e.lastElementChild)]),{indexKey:s}=this;this.offsets.top=(0,Le.Z)(t,s),this.offsets.bottom=(0,Le.Z)(i,s)}))}getDialogKey(e){throw rt}getDialogKeyFromElement(e){throw rt}getRectFromForPlaceholder(){throw rt}getDialogFromElement(e){throw rt}loadDialogsInner(e){throw rt}setTyping(e){return tt(this,void 0,void 0,(function*(){const t=this.getDialogKey(e),i=this.getDialogDom(t);if(!i)return;const s=i.lastMessageSpan.querySelector(".peer-typing-container"),n=yield L.ZP.getPeerTyping(e.peerId,s,"forumTopic"===e._?e.id:void 0);!s&&n&&((0,F.Z)(i.lastMessageSpan,n),i.lastMessageSpan.classList.add("user-typing"))}))}unsetTyping(e){const t=this.getDialogKey(e),i=this.getDialogElement(t);i&&(i.dom.lastMessageSpan.classList.remove("user-typing"),ut.setLastMessageN({dialog:e,lastMessage:null,dialogElement:i,setUnread:null}))}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialogElement(e){const t=this.sortedList.get(e);return null==t?void 0:t.dialogElement}bindScrollable(){this.scrollable.container.addEventListener("scroll",this.onChatsRegularScroll),this.scrollable.onScrolledTop=this.onChatsScrollTop.bind(this),this.scrollable.onScrolledBottom=this.onChatsScroll.bind(this),this.scrollable.setVirtualContainer(this.sortedList.list)}clear(){var e;this.sortedList.clear(),null===(e=this.placeholder)||void 0===e||e.remove()}reset(){this.scrollable.loadedAll.top=!0,this.scrollable.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsRenderPromise=void 0,this.loadDialogsPromise=void 0}fullReset(){return this.reset(),this.clear(),this.onChatsScroll()}destroy(){this.clear(),this.scrollable.destroy(),this.listenerSetter.removeAll()}}class lt extends dt{constructor(e,t){super(),this.peerId=e,this.paddingX=t,this.placeholderOptions={avatarSize:0,marginVertical:5,totalHeight:64},this.listenerSetter.add(n.Z)("peer_typings",(({peerId:e,threadId:t,typings:i})=>tt(this,void 0,void 0,(function*(){if(!t||this.peerId!==e)return;const s=yield this.managers.dialogsStorage.getForumTopic(e,t);s&&(i.length?this.setTyping(s):this.unsetTyping(s))})))),this.listenerSetter.add(n.Z)("dialogs_multiupdate",(e=>{for(const[t,{dialog:i,topics:s}]of e)t===this.peerId&&(null==s?void 0:s.size)&&s.forEach((e=>{this.updateDialog(e)}))})),this.listenerSetter.add(n.Z)("dialog_unread",(({dialog:e})=>{"forumTopic"===(null==e?void 0:e._)&&e.peerId===this.peerId&&ut.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))})})),this.listenerSetter.add(n.Z)("dialog_notify_settings",(e=>tt(this,void 0,void 0,(function*(){if(e.peerId===this.peerId)if("dialog"!==e._)ut.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))});else{const e=[...this.sortedList.getAll().entries()],t=e.map((([e])=>this.managers.dialogsStorage.getForumTopic(this.peerId,e))),i=yield Promise.all(t);e.forEach((([e,t],s)=>{ut.setUnreadMessagesN({dialog:i[s],dialogElement:t.dialogElement})}))}})))),this.listenerSetter.add(n.Z)("dialog_drop",(e=>{"forumTopic"===e._&&e.peerId===this.peerId&&this.deleteDialogByKey(this.getDialogKey(e))})),this.listenerSetter.add(n.Z)("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{"forumTopic"===e._&&e.peerId===this.peerId&&(t?this.deleteDialog(e):this.updateDialog(e))}))}isDialogMustBeInViewport(e){return!e.pFlags.hidden&&super.isDialogMustBeInViewport(e)}getDialogKey(e){return e.id}getDialogKeyFromElement(e){return+e.dataset.threadId}getRectFromForPlaceholder(){return()=>{const e=x.ZP.rect;return{top:56,right:e.right,bottom:0,left:this.paddingX,width:e.width-this.paddingX,height:e.height-56}}}getDialogFromElement(e){return this.managers.dialogsStorage.getForumTopic(+e.dataset.peerId,+e.dataset.threadId)}loadDialogsInner(e){return tt(this,void 0,void 0,(function*(){const{indexKey:t}=this;let i=$.Z.height/64*1.25|0,s=0;const n=this.peerId,{index:a}=this.getOffsetIndex(e);if(s=a,a)if("top"===e){const e=yield this.managers.dialogsStorage.getFolderDialogs(n,!0),o=e.findIndex((e=>(0,Le.Z)(e,t)<=a)),r=Math.max(0,o-i);i=o-r,s=(0,Le.Z)(e[r],t)+1}else s=a;return this.managers.acknowledged.dialogsStorage.getDialogs({offsetIndex:s,limit:i,filterId:n,skipMigrated:!0})}))}}class ct extends dt{constructor(e){super(),this.filterId=e,this.needPlaceholderAtFirstTime=!0,this.listenerSetter.add(n.Z)("peer_typings",(({peerId:e,typings:t})=>tt(this,void 0,void 0,(function*(){const[i,s]=yield Promise.all([this.managers.appMessagesManager.getDialogOnly(e),this.managers.appPeersManager.isForum(e)]);i&&!s&&(t.length?this.setTyping(i):this.unsetTyping(i))})))),this.listenerSetter.add(n.Z)("user_update",(e=>tt(this,void 0,void 0,(function*(){if(!this.isActive)return;const t=e.toPeerId(),i=this.getDialogDom(t);if(!i)return;const s=yield this.managers.appUsersManager.getUserStatus(e),n="userStatusOnline"===(null==s?void 0:s._);this.setOnlineStatus(i.avatarEl,n)})))),this.listenerSetter.add(n.Z)("chat_update",(e=>tt(this,void 0,void 0,(function*(){const t=e.toPeerId(!0);this.processDialogForCallStatus(t)})))),this.listenerSetter.add(n.Z)("dialog_flush",(({dialog:e})=>{this.isActive&&e&&(ut.setLastMessageN({dialog:e,setUnread:!0}),this.validateDialogForFilter(e))})),this.listenerSetter.add(n.Z)("dialogs_multiupdate",(e=>{var t;if(this.isActive)for(const[i,{dialog:s,topics:n}]of e)"dialog"===(null==s?void 0:s._)&&(this.updateDialog(s),null===(t=ut.processContact)||void 0===t||t.call(ut,i.toPeerId()),this.validateDialogForFilter(s))})),this.listenerSetter.add(n.Z)("dialog_drop",(e=>{var t;this.isActive&&"dialog"===e._&&(this.deleteDialogByKey(e.peerId),null===(t=ut.processContact)||void 0===t||t.call(ut,e.peerId))})),this.listenerSetter.add(n.Z)("dialog_unread",(({dialog:e})=>{this.isActive&&"dialog"===(null==e?void 0:e._)&&(ut.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))}),this.validateDialogForFilter(e))})),this.listenerSetter.add(n.Z)("dialog_notify_settings",(e=>{this.isActive&&"forumTopic"!==e._&&(this.validateDialogForFilter(e),ut.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))}))})),this.listenerSetter.add(n.Z)("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{var s;this.isActive&&"forumTopic"!==e._&&(t?this.deleteDialog(e):this.updateDialog(e),null===(s=ut.processContact)||void 0===s||s.call(ut,i))})),this.listenerSetter.add(n.Z)("filter_update",(e=>tt(this,void 0,void 0,(function*(){if(this.isActive&&e.id===this.filterId&&!p.DZ.has(e.id)){const e=yield this.managers.dialogsStorage.getCachedDialogs(!0);yield this.validateListForFilter();for(let t=0,i=e.length;t(0,Le.Z)(e,i)<=o)),r=Math.max(0,a-s);s=a-r,n=(0,Le.Z)(e[r],i)+1}else n=o;const r=this.managers.acknowledged.dialogsStorage.getDialogs({offsetIndex:n,limit:s,filterId:t,skipMigrated:!0}),d=yield r;return a&&(d.result=Promise.reject((0,He.Z)("MIDDLEWARE"))),d}))}setOnlineStatus(e,t){const i="is-online",s=e.classList.contains(i);!s&&t&&e.classList.add(i),(0,I.Z)({element:e,className:"is-visible",forwards:t,duration:250,onTransitionEnd:t?void 0:()=>{e.classList.remove(i)},useRafs:t&&!s?2:0})}generateScrollable(e,t){const i=t.id,s=new y.ZP(null,"CL",500);s.container.dataset.filterId=""+i;const a=(0,Se.Z)(t.localId),o=new nt({managers:n.Z.managers,log:this.log,list:e,indexKey:a,onListLengthChange:ut.onListLengthChange});return this.scrollable=s,this.sortedList=o,this.setIndexKey(a),this.bindScrollable(),s}testDialogForFilter(e){return p.DZ.has(this.filterId)?this.filterId===e.folder_id:void 0!==(0,Le.Z)(e,this.indexKey)}isDialogMustBeInViewport(e){return!(void 0!==e.migratedTo||!this.testDialogForFilter(e))&&super.isDialogMustBeInViewport(e)}validateListForFilter(){return tt(this,void 0,void 0,(function*(){this.sortedList.getAll().forEach((e=>tt(this,void 0,void 0,(function*(){const t=yield n.Z.managers.appMessagesManager.getDialogOnly(e.id);this.testDialogForFilter(t)||this.deleteDialog(t)}))))}))}validateDialogForFilter(e){this.getDialogElement(e.peerId)&&(this.testDialogForFilter(e)||this.deleteDialog(e))}setCallStatus(e,t){let{callIcon:i,listEl:s}=e;if(!i&&t){const{canvas:t,startAnimation:n}=e.callIcon=i=function(e=!1){const t=document.createElement("canvas");t.width=t.height=ne;const i=t.getContext("2d"),s=(ne-(3*oe+2*ae))/2,n=Date.now();let a=!1;const o=()=>{if(t.isConnected)a||(a=t.isConnected);else if(a)return!1;const o=ee((Date.now()-n)%1e3,0,1,1e3);i.clearRect(0,0,ne,ne),i.fillStyle=e&&!te.Z.isMobile?J.Z.getProperty("primary-color"):"#fff";for(let e=0;e<3;++e){let t;t=o>=.5?e%2?2-2*o:2*(o-.5):e%2?2*o:1-2*o;let n=4+8*t;n*=se,ie(i,s+e*oe+e*ae,(ne-n)/2,oe,n,re,!0)}return!0};return{canvas:t,startAnimation:()=>{(0,X.jt)(o),o()},setActive:t=>{e=t,o()}}}(s.classList.contains("active"));t.classList.add("dialog-group-call-icon"),s.append(t),n()}i&&(0,I.Z)({element:e.callIcon.canvas,className:"is-visible",forwards:t,duration:250,onTransitionEnd:t?void 0:()=>{e.callIcon.canvas.remove(),e.callIcon=void 0},useRafs:t?2:0})}processDialogForCallStatus(e,t){return tt(this,void 0,void 0,(function*(){if(!de.Z)return;if(t||(t=this.getDialogDom(e)),!t)return;const i=yield n.Z.managers.appChatsManager.getChat(e.toChatId());this.setCallStatus(t,!(!i.pFlags.call_active||!i.pFlags.call_not_empty))}))}onChatsScroll(e="bottom"){var t;return this.scrollable.loadedAll[e]&&(null===(t=ut.loadContacts)||void 0===t||t.call(ut)),this.log("onChatsScroll",e),super.onChatsScroll(e)}toggleAvatarUnreadBadges(e,t){if(!e)return void this.sortedList.getAll().forEach((e=>{const{dom:t,dialogElement:i}=e;t.unreadAvatarBadge&&i.toggleBadgeByKey("unreadAvatarBadge",!1,!1,!1)}));const i=["unread","mention"];this.sortedList.getAll().forEach((e=>{var t;const{dom:s,dialogElement:n}=e,a=null===(t=s.unreadBadge)||void 0===t?void 0:t.textContent;if(!a||s.unreadBadge.classList.contains("backwards"))return;const o=!!s.unreadAvatarBadge;n.createUnreadAvatarBadge(),n.toggleBadgeByKey("unreadAvatarBadge",!0,o),s.unreadAvatarBadge.textContent=a;const r=s.unreadAvatarBadge.classList,d=s.unreadBadge.classList;i.forEach((e=>{r.toggle(e,d.contains(e))}))}))}getDialogKey(e){return e.peerId}getDialogKeyFromElement(e){return+e.dataset.peerId}getDialogFromElement(e){return n.Z.managers.appMessagesManager.getDialogOnly(e.dataset.peerId.toPeerId())}}class ht{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.log=(0,C.kg)("DIALOGS",C.v9.Log|C.v9.Error|C.v9.Warn|C.v9.Debug),this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.initedListeners=!1,this.xds={},this.onTabChange=()=>(this.xd=this.xds[this.filterId],this.xd.reset(),this.xd.onChatsScroll()),this._onListLengthChange=()=>{if(!this.xd.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId!==p.J$)return;const e=this.chatList,t=e.childElementCount,i=e.parentElement.parentElement,s=e.parentElement.nextElementSibling,n=!!s.childElementCount;if(t>=10)return void(n&&this.removeContactsPlaceholder());if(n)return;i.classList.add("with-contacts");const a=new je.Z({name:"Contacts",noDelimiter:!0,fakeGradientDelimiter:!0});a.container.classList.add("hide"),this.managers.appUsersManager.getContactsPeerIds(void 0,void 0,"online").then((e=>{let t=!1;const i=()=>{t&&a.container.classList.toggle("hide",!s.list.childElementCount),this.updateContactsLength(!0)},s=new V.Z({avatarSize:"abitbigger",createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:i,managers:this.managers});this.loadContacts=()=>{const t=$.Z.height/60|0;(0,Be.Z)(e.splice(0,t),this.verifyPeerIdForContacts).then((e=>{e.forEach((e=>{s.add(e)}))})),e.length||(this.loadContacts=void 0)},this.loadContacts(),this.processContact=e=>tt(this,void 0,void 0,(function*(){if(e.isAnyChat())return;const t=yield this.verifyPeerIdForContacts(e),i=s.has(e);!i&&t?s.add(e):i&&!t&&s.delete(e)}));const n=s.list;n.classList.add("chatlist-new"),this.setListClickListener(n),a.content.append(n),t=!0,i()})),s.append(a.container)},this.verifyPeerIdForContacts=e=>tt(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([this.managers.appPeersManager.isContact(e),this.managers.appMessagesManager.getDialogOnly(e)]);return t&&!i}))}start(){const e=this.managers=(0,Ce.Z)();this.contextMenu=new g(e),this.stateMiddlewareHelper=(0,Ue.k)(),this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=(0,Y.Z)(this._onListLengthChange,100,!1,!0);const t=document.createElement("div");t.classList.add("connection-status-bottom"),t.append(this.folders.container),this.forumsTabs=new Map,this.forumsSlider=document.createElement("div"),this.forumsSlider.classList.add("topics-slider"),this.chatsContainer.parentElement.parentElement.append(this.forumsSlider),K.Z&&(0,W.Z)({element:this.folders.container,onSwipe:e=>{const t=s.prevId();s(e<0?t+1:t-1)},verifyTouchTarget:()=>!this.forumTab}),this.allChatsIntlElement=new r.ZP.IntlElement({key:"FilterAllChatsShort"}),n.Z.addEventListener("premium_toggle",(e=>tt(this,void 0,void 0,(function*(){e||(yield this.managers.filtersStorage.isFilterIdAvailable(this.filterId))||s((0,Oe.Z)(this.filtersRendered[p.J$].menu),!1)})))),n.Z.addEventListener("state_cleared",(()=>{const e=p.DZ.has(this.filterId);Re.Z.getState().then((t=>tt(this,void 0,void 0,(function*(){this.xd.loadedDialogsAtLeastOnce=!1,this.showFiltersPromise=void 0,e&&(this.xd.clear(),this.onTabChange()),this.onStateLoaded(t)}))))})),this.setFilterId(p.J$,p.J$),this.addFilter({id:p.J$,title:"",localId:p.J$});const i=new y.v7(this.folders.menuScrollContainer);t.prepend(this.folders.menuScrollContainer);const s=this.selectTab=(0,v.X)(this.folders.menu,this.folders.container,((e,t)=>tt(this,void 0,void 0,(function*(){const i=e;if(e=+t.dataset.filterId||p.J$,-1!==this.filterId&&!p.DZ.has(e)&&!(yield this.managers.filtersStorage.isFilterIdAvailable(e)))return!1;const n=this.filterId;if(S.IS_MOBILE_SAFARI||(i?this.filtersNavigationItem||(this.filtersNavigationItem={type:"filters",onPop:()=>{s(0),this.filtersNavigationItem=void 0}},le.Z.spliceItems(1,0,this.filtersNavigationItem)):this.filtersNavigationItem&&(le.Z.removeItem(this.filtersNavigationItem),this.filtersNavigationItem=void 0)),n===e)return;this.xds[e].clear();const a=this.setFilterIdAndChangeTab(e).then((({cached:e,renderPromise:t})=>{if(e)return t}));return-1!==n?a:void 0}))),(()=>{for(const e in this.xds)+e!==this.filterId&&this.xds[e].clear()}),void 0,i);Re.Z.getState().then((e=>(ce.Z.setPlaybackParams(e.playbackParams),ce.Z.addEventListener("playbackParams",(e=>{this.managers.appStateManager.pushToState("playbackParams",e)})),this.onStateLoaded(e)))),te.Z.addEventListener("resize",(()=>{this.changeFiltersAllChatsKey()})),new H(this.managers,this.chatsContainer),this.chatsContainer.append(t),setTimeout((()=>{Z.Z.loadLottieWorkers()}),200),pe.Z.MANAGERS=n.Z.managers=e,Ze.Z.construct(e),x.ZP.construct(e),ue.ZP.construct(e),Te.ZP.construct(e),ke.Z.construct(e),L.ZP.construct(e),this.xd=this.xds[this.filterId]}get chatList(){return this.xd.sortedList.list}setFilterId(e,t){this.filterId=e}setFilterIdAndChangeTab(e){return tt(this,void 0,void 0,(function*(){return this.filterId=e,this.onTabChange()}))}initListeners(){n.Z.addEventListener("dialog_flush",(({dialog:e})=>{e&&this.setFiltersUnreadCount()})),n.Z.addEventListener("folder_unread",(e=>tt(this,void 0,void 0,(function*(){if(e.id<0){const t=this.xd.getDialogElement(e.id);if(!t)return;this.setUnreadMessagesN({dialog:yield this.managers.dialogsStorage.getDialogOnly(e.id),dialogElement:t})}else this.setFilterUnreadCount(e.id)})))),n.Z.addEventListener("contacts_update",(e=>{var t;null===(t=this.processContact)||void 0===t||t.call(this,e.toPeerId())})),L.ZP.addEventListener("peer_changed",(({peerId:e,threadId:t,isForum:i})=>{const s={peerId:e,threadId:i?t:void 0};for(const e of this.lastActiveElements){const t=+e.dataset.threadId||void 0,i=e.dataset.peerId.toPeerId();L.ZP.isSamePeer({peerId:i,threadId:t},s)||this.setDialogActive(e,!1)}Array.from(document.querySelectorAll(`[data-autonomous="0"] .chatlist-chat[data-peer-id="${e}"]`)).forEach((t=>{const i=+t.dataset.threadId||void 0;L.ZP.isSamePeer({peerId:e,threadId:i},s)&&this.setDialogActive(t,!0)}))})),n.Z.addEventListener("filter_update",(e=>tt(this,void 0,void 0,(function*(){if(p.DZ.has(e.id))return;if(!this.filtersRendered[e.id])return void this.addFilter(e);const t=this.filtersRendered[e.id];(0,he.Z)(t.title,(0,me.Z)(e.title))})))),n.Z.addEventListener("filter_delete",(e=>{const t=this.filtersRendered[e.id];t&&(t.container.remove(),t.menu.remove(),this.xds[e.id].destroy(),delete this.xds[e.id],delete this.filtersRendered[e.id],this.onFiltersLengthChange(),this.filterId===e.id&&this.selectTab(0,!1))})),n.Z.addEventListener("filter_order",(e=>tt(this,void 0,void 0,(function*(){e=e.slice(),(0,Ne.Z)(e,p.Zi);const t=this.folders.menu,i=yield Promise.all(e.map((e=>tt(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([this.managers.dialogsStorage.getDialogIndexKeyByFilterId(e),this.managers.filtersStorage.getFilter(e)]);return{indexKey:t,filter:i}})))));e.forEach(((e,s)=>{const{indexKey:n,filter:a}=i[s],o=this.filtersRendered[e];this.xds[e].setIndexKey(n),(0,_.Z)(o.menu,t,a.localId),(0,_.Z)(o.container,this.folders.container,a.localId)}))}))))}setDialogActive(e,t){var i;const s=e.dialogDom;e.classList.toggle("active",t),e.classList.toggle("is-forum-open",(null===(i=this.forumTab)||void 0===i?void 0:i.peerId)===e.dataset.peerId.toPeerId()&&!e.dataset.threadId),t?this.lastActiveElements.add(e):this.lastActiveElements.delete(e),(null==s?void 0:s.callIcon)&&s.callIcon.setActive(t)}onStateLoaded(e){return tt(this,void 0,void 0,(function*(){this.stateMiddlewareHelper.clean();const t=this.stateMiddlewareHelper.get(),i=e.filtersArr,s=i.length>p.DZ.size,n=e=>{for(const t of e)this.addFilter(t)};let a;s?n(i):a=this.managers.filtersStorage.getDialogFilters().then(n),this.doNotRenderChatList=!0;const o=this.xd.onChatsScroll(),r=(0,Pe.Z)(t);try{yield r(o)}catch(e){}s||this.selectTab(0,!1),a&&(yield r(a)),this.doNotRenderChatList=void 0,this.filterId=-1,this.selectTab(0,!1),this.initedListeners||(this.initListeners(),this.initedListeners=!0),s&&this.showFiltersPromise&&(yield r(this.showFiltersPromise)),this.managers.appNotificationsManager.getNotifyPeerTypeSettings(),yield(yield r(o)).renderPromise.catch(xe.Z),this.managers.appMessagesManager.fillConversations()}))}setFilterUnreadCount(e){var t;return tt(this,void 0,void 0,(function*(){const i=null===(t=this.filtersRendered[e])||void 0===t?void 0:t.unread;if(!i)return;const{unreadUnmutedCount:s,unreadCount:n}=yield this.managers.dialogsStorage.getFolderUnreadCount(e);i.classList.toggle("badge-gray",!s);const a=e===p.J$?s:n;i.innerText=a?""+a:""}))}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e)}l(e){const t=this.createChatList(),i=this.xds[e.id]=new ct(e.id),s=i.generateScrollable(t,e);return this.setListClickListener(t,null,!0),{ul:t,xd:i,scrollable:s}}addFilter(e){if(e.id===p.Zi)return;const t=this.folders.menu,i=this.filtersRendered[e.id];if(i)return(0,_.Z)(i.menu,t,e.localId),void(0,_.Z)(i.container,this.folders.container,e.localId);const s=document.createElement("div");s.classList.add("menu-horizontal-div-item");const n=document.createElement("span"),a=document.createElement("span");a.classList.add("text-super"),e.id===p.J$?a.append(this.allChatsIntlElement.element):(0,he.Z)(a,(0,me.Z)(e.title));const o=document.createElement("div");o.classList.add("badge","badge-20","badge-primary");const r=document.createElement("i");n.append(a,o,r),(0,b.Z)(s),s.append(n),s.dataset.filterId=""+e.id,(0,_.Z)(s,t,e.localId);const{ul:d,scrollable:l}=this.l(e);l.container.classList.add("tabs-tab","chatlist-parts");const c=document.createElement("div");c.classList.add("chatlist-top");const h=document.createElement("div");h.classList.add("chatlist-bottom"),c.append(d),l.container.append(c,h);const u=l.container;(0,_.Z)(l.container,this.folders.container,e.localId),this.filtersRendered[e.id]={menu:s,container:u,unread:o,title:a},this.onFiltersLengthChange()}changeFiltersAllChatsKey(){const e=this.folders.menuScrollContainer.firstElementChild,t=e.scrollWidth>e.clientWidth?"FilterAllChatsShort":"FilterAllChats";this.allChatsIntlElement.compareAndUpdate({key:t})}onFiltersLengthChange(){let e=this.showFiltersPromise;return null!=e?e:e=this.showFiltersPromise=(0,De.Z)(0).then((()=>{if(this.showFiltersPromise!==e)return;const t=Object.keys(this.filtersRendered).length>1,i=!this.folders.menuScrollContainer.classList.contains("hide");t!==i&&(this.folders.menuScrollContainer.classList.toggle("hide",!t),t&&!i&&this.setFiltersUnreadCount(),this.chatsContainer.classList.toggle("has-filters",t)),this.changeFiltersAllChatsKey(),this.showFiltersPromise=void 0}))}generateEmptyPlaceholder(e){const t="empty-placeholder",i=document.createElement("div");i.classList.add(t,t+"-"+e.classNameType);const s=document.createElement("div");s.classList.add(t+"-header"),(0,r.$d)(s,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&(0,r.$d)(n,e.subtitle,e.subtitleArgs),i.append(s,n),{container:i,header:s,subtitle:n}}checkIfPlaceholderNeeded(){if(this.filterId===p.Zi)return;const e=this.chatList,t=e.parentElement;let i=Array.from(t.children).find((e=>e.matches(".empty-placeholder")));const s=this.xd.scrollable.loadedAll.bottom&&!e.childElementCount;if(s&&i)return;if(!s)return void(i&&(t.classList.remove("with-placeholder"),i.remove()));let n,a;if(this.filterId){n=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:a="folder"}),i=n.container;const e=document.createElement("div"),t="📂",s=128;(0,we.Z)({div:e,emoji:t,width:s,height:s}),i.prepend(e);const o=(0,E.Z)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});(0,A.fc)(o,(()=>tt(this,void 0,void 0,(function*(){const e=x.ZP.createTab(k.Z);e.setInitFilter(yield this.managers.filtersStorage.getFilter(this.filterId)),e.open()})))),i.append(o)}else{n=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:a="dialogs"}),i=n.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),this.emptyDialogsPlaceholderSubtitle=new r.ZP.IntlElement({element:n.subtitle}),Promise.all([this.updateContactsLength(!1),(0,j.cj)(e,"assets/img/EmptyChats.svg"),(0,G.AD)()]).then((([e])=>{i.classList.add("visible"),t.classList.toggle("has-contacts",!!e)})),i.prepend(e)}t.append(i),t.classList.add("with-placeholder"),t.dataset.placeholderType=a}updateContactsLength(e){var t;return null!==(t=this.updateContactsLengthPromise)&&void 0!==t?t:this.updateContactsLengthPromise=this.managers.appUsersManager.getContacts().then((t=>{const i=this.emptyDialogsPlaceholderSubtitle;if(i){let e,s;t.length?(e="ChatList.Main.EmptyPlaceholder.Subtitle",s=[(0,r.ag)("Contacts.Count",[t.length])]):(e="ChatList.Main.EmptyPlaceholder.SubtitleNoContacts",s=[]),i.compareAndUpdate({key:e,args:s})}return e&&this.chatList.parentElement.classList.toggle("has-contacts",!!t.length),this.updateContactsLengthPromise=void 0,t.length}))}removeContactsPlaceholder(){const e=this.chatList,t=e.parentElement.parentElement,i=e.parentElement.nextElementSibling;t.classList.remove("with-contacts"),i.replaceChildren(),this.loadContacts=void 0,this.processContact=void 0}toggleForumTab(e,t=this.forumTab){return tt(this,void 0,void 0,(function*(){if(!t&&!e)return;if(t){const e=this.xd.getDialogElement(t.peerId);e&&e.dom.listEl.classList.remove("is-forum-open")}t===e&&(e=void 0),null==t||t.toggle(!1);const i=null==e?void 0:e.toggle(!0);if(t===this.forumTab&&(this.forumTab=e),e){const t=this.xd.getDialogElement(e.peerId);t&&t.dom.listEl.classList.add("is-forum-open"),L.ZP.selectTab(L.oo.CHATLIST)}i&&(yield i),e&&!this.forumNavigationItem?(this.forumNavigationItem={type:"forum",onPop:()=>{this.forumNavigationItem=void 0,this.toggleForumTab()}},le.Z.pushItem(this.forumNavigationItem)):!e&&this.forumNavigationItem&&(le.Z.removeItem(this.forumNavigationItem),this.forumNavigationItem=void 0);const s=!!e,n=i?2:void 0;this.xd.toggleAvatarUnreadBadges(s,n);const a=(0,Ie.Z)();(0,I.Z)({element:this.forumsSlider.parentElement,className:"is-forum-visible",duration:300,forwards:s,useRafs:n,onTransitionEnd:()=>{a.resolve()}}),(0,Ye.YW)(a,300).then((()=>a.resolve()))}))}toggleForumTabByPeerId(e,t){const{managers:i}=this,s=x.ZP.getHistory(),n=s[s.length-1];let a;if(n)return n instanceof ot&&n.peerId===e&&t?void Xe(n.container):(a=x.ZP.createTab(ot),void a.open({peerId:e,managers:i}));a=this.forumsTabs.get(e);const o=this.forumTab&&this.forumTab===a;if(null!=t||(t=!o),t!==o)return t&&!a&&(a=new ot(void 0),a.init({peerId:e,managers:i}),this.forumsTabs.set(e,a),this.forumsSlider.append(a.container),a.managers=this.managers,a.eventListener.addEventListener("destroy",(()=>{this.forumsTabs.delete(e)}))),this.toggleForumTab(a);t&&Xe(a.container)}setListClickListener(e,t,i=!1,s=!1,n=!1){let a;const o=(n?L.ZP.setInnerPeer:L.ZP.setPeer).bind(L.ZP);e.dataset.autonomous=""+ +s,e.addEventListener("mousedown",(i=>{if(0!==i.button)return;this.log("dialogs click list");const n=i.target,r=(0,d.Z)(n,it);if(!r)return;const l=r.dataset.peerId.toPeerId(),c=+r.dataset.mid||void 0,h=+r.dataset.threadId||void 0;if(null==t||t(),!r.querySelector(".is-forum")||i.shiftKey||c){if(i.ctrlKey||i.metaKey)return window.open(r.href||"#"+l,"_blank"),void(0,O.Z)(i);s&&(a&&!(a===r)&&a.classList.remove("active"),r&&(r.classList.add("active"),a=r,this.lastActiveElements.add(r))),h&&!c||this.xd.sortedList.list!==e||this.xd===this.xds[p.Zi]||this.toggleForumTab(),o({peerId:l,lastMsgId:c,threadId:h})}else this.toggleForumTabByPeerId(l)}),{capture:!0}),e.addEventListener("click",(e=>{0===e.button&&(0,O.Z)(e)}),{capture:!0}),i&&(0,Ee.E)({element:e,callback:this.contextMenu.onContextMenu})}createChatList(e={}){const t=document.createElement("ul");return t.classList.add("chatlist"),e.new&&t.classList.add("chatlist-new"),e.dialogSize&&t.classList.add("chatlist-"+e.dialogSize),t}setLastMessageN(e){return this.setLastMessage(e).catch((e=>{"MIDDLEWARE"!==(null==e?void 0:e.type)&&this.log.error("set last message error",e)}))}setLastMessage({dialog:e,lastMessage:t,dialogElement:i,highlightWord:s,isBatch:a=!1,setUnread:o=!1}){var d,l;return tt(this,void 0,void 0,(function*(){if(!i&&!(i=this.xd.getDialogElement(e.peerId)))return;const{dom:c}=i,{peerId:h}=e,{deferred:u,middleware:p}=st(c,"setLastMessagePromise");let f;if(!t&&("draftMessage"!==(null===(d=e.draft)||void 0===d?void 0:d._)||h.isAnyChat()&&"forumTopic"!==e._&&(yield this.managers.appPeersManager.isForum(h))||(f=e.draft),(null==(t=e.topMessage)?void 0:t.mid)!==e.top_message)){const i=this.managers.appMessagesManager.getMessageByPeer(h,e.top_message);t=yield p(i)}if(this.setUnreadMessagesN({dialog:e,dialogElement:i,isBatch:a,setLastMessagePromise:u}),!t)return c.lastMessageSpan.replaceChildren(),c.lastTimeSpan.replaceChildren(),delete c.listEl.dataset.mid,void u.resolve();const m=t&&(0,ve.Z)(t);{let e;const i=[];if(t&&!f&&!m){const s=(0,be.Z)(t),n=new Set(["video","gif","round"]);if(s&&("photo"===s._||n.has(s.type))){const a=(0,fe.Z)(s,20,20);if("photoSizeEmpty"!==a._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),"round"===s.type&&e.classList.add("is-round"),i.push((0,T.Z)({photo:s,message:t,container:e,withoutPreloader:!0,size:a}).then((()=>e))),n.has(s.type))){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}if(f){const e=document.createElement("span");e.classList.add("danger"),e.append((0,r.ag)("Draft"),": "),i.unshift(e)}else if(h.isAnyChat()&&h!==t.fromId&&!t.action){const e=document.createElement("span");if(e.classList.add("primary-text"),t.fromId===n.Z.myId)e.append((0,r.ag)("FromYou")),i.unshift(e);else{const s=p((0,Me.Z)({peerId:t.fromId,onlyFirstName:!0})).then((t=>(e.prepend(t),e)),xe.Z);i.unshift(s)}e.append(": ")}const a=!!e&&!!(null==t?void 0:t.message);let o;if(o=s&&t.message?yield p((0,ge.Z)({message:t,highlightWord:s,withoutMediaType:a})):f?yield p((0,ge.Z)({message:f})):t?yield p((0,ge.Z)({message:t,withoutMediaType:a})):document.createDocumentFragment(),i.length){const e=yield p(Promise.all(i));o.prepend(...e)}(0,F.Z)(c.lastMessageSpan,o)}if(t||f){const e=f?Math.max(f.date,t.date||0):t.date;(0,F.Z)(c.lastTimeSpan,(0,w.zM)(new Date(1e3*e)))}else c.lastTimeSpan.textContent="";if(null!==o&&!o){c.listEl.dataset.mid=""+t.mid;const e=t.reply_to;(null===(l=null==e?void 0:e.pFlags)||void 0===l?void 0:l.forum_topic)&&(c.listEl.dataset.threadId=""+(0,$e.Z)(t))}u.resolve()}))}setUnreadMessagesN(e){return this.setUnreadMessages(e).catch((()=>{}))}setUnreadMessages({dialog:e,dialogElement:t,isBatch:i=!1,setLastMessagePromise:s}){var a;return tt(this,void 0,void 0,(function*(){const{dom:o}=t;if(!o)return;const r="forumTopic"===e._,{deferred:d,middleware:l}=st(o,"setUnreadMessagePromise"),{peerId:c}=e,h=Promise.all([this.managers.appNotificationsManager.isPeerLocalMuted({peerId:c,respectType:!0,threadId:r?e.id:void 0}),"draftMessage"!==(null===(a=e.draft)||void 0===a?void 0:a._)?this.managers.appMessagesManager.getMessageByPeer(c,e.top_message):void 0,r?!!e.pFlags.pinned:this.managers.dialogsStorage.isDialogPinned(c,this.filterId),this.managers.appMessagesManager.isDialogUnread(e),c.isAnyChat()&&!r?this.managers.acknowledged.dialogsStorage.getForumUnreadCount(c).then((i=>i.cached?i.result:(i.result.then((()=>{this.setUnreadMessagesN({dialog:e,dialogElement:t})})),{count:0,hasUnmuted:!1}))).catch((()=>{})):void 0]);let[u,f,m,g,v]=yield l(h);const b=o.listEl.classList.contains("is-muted"),{count:y,hasUnmuted:w}=v||{};let S;f&&f.pFlags.out&&f.peerId!==n.Z.myId&&(S=f);const C=null!=y?y:e.unread_count;void 0!==y&&(g=!!C),r&&!g&&(g=!(0,et.Z)(e.read_inbox_max_id));const L=m||g,E=this.xd!==this.xds[p.Zi]&&!r&&!!this.forumTab&&this.xd.getDialogElement(c)===t&&g;if(s)try{yield l(s)}catch(e){return}const M=i?0:250;o.listEl.classList.toggle("no-unmuted-topic",!u&&void 0!==w&&!w),u!==b&&(0,I.Z)({element:o.listEl,className:"is-muted",forwards:u,duration:M}),function(e,t,i){let s;if("string"==typeof t?s=t:(null==t?void 0:t.pFlags.out)&&(s=t.error?"sendingerror":t.pFlags.is_outgoing?"sending":t.pFlags.unread?"check":"checks"),!s)return void(e.textContent="");const n="tgico-"+s,a=e.lastElementChild;if(a&&a.classList.contains(n))return;const o=document.createElement("i");o.classList.add("sending-status-icon",n),e.append(o),a&&a.remove()}(o.statusSpan,r&&e.pFlags.closed?"premium_lock":S);const P=!!o.unreadBadge;L&&t.createUnreadBadge();const Z=!!o.unreadAvatarBadge;E&&t.createUnreadAvatarBadge();const T=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),k=!!o.mentionsBadge;if(T&&t.createMentionsBadge(),[["unreadBadge",L,P],["unreadAvatarBadge",E,Z],["mentionsBadge",T,k]].forEach((([e,s,n])=>{o[e]&&t.toggleBadgeByKey(e,s,n,i)})),!L)return void d.resolve();m?o.unreadBadge.classList.add("tgico-chatspinned","tgico"):o.unreadBadge&&o.unreadBadge.classList.remove("tgico-chatspinned","tgico");let x,A=!0,_=!1;if(e.unread_mentions_count&&1===C?(x="@",_=!0):g?x=""+(C?(0,qe.Z)(C,1):" "):(x="",A=!1),r){const e=g&&" "===x;o.unreadBadge.classList.toggle("not-visited",e)}[[o.unreadBadge,x],[o.unreadAvatarBadge,x||void 0]].filter(Boolean).forEach((([e,t])=>{void 0!==t&&(e.innerText=x),e.classList.toggle("unread",A),e.classList.toggle("mention",_)})),d.resolve()}))}getDialog(e,t){return tt(this,void 0,void 0,(function*(){if("object"!=typeof e){let i;if(t){if(i=yield this.managers.dialogsStorage.getForumTopic(e,t),!i)return{peerId:e||p.NM,pFlags:{}}}else if(i=yield this.managers.appMessagesManager.getDialogOnly(e),!i){const t=e||p.NM;return{peerId:t,peer:yield this.managers.appPeersManager.getOutputPeer(t),pFlags:{}}}return i}return e}))}addListDialog(e){var t;e.autonomous=!1;const i=this.addDialogNew(e);if(i){const{peerId:s}=e,a=this.getDialog(s,e.threadId).then((t=>{const a=[],o=s.isUser();return o||"dialog"!==t._||a.push(this.xd.processDialogForCallStatus(s,i.dom)),s!==n.Z.myId&&o&&a.push(this.managers.appUsersManager.getUserStatus(s.toUserId()).then((e=>{"userStatusOnline"===(null==e?void 0:e._)&&this.xd.setOnlineStatus(i.dom.avatarEl,!0)}))),a.push(this.setLastMessageN({dialog:t,dialogElement:i,isBatch:e.isBatch,setUnread:!0})),Promise.all(a)}));null===(t=e.loadPromises)||void 0===t||t.push(a)}return i}addDialogAndSetLastMessage(e){const{peerId:t,message:i,query:s}=e,n=this.addDialogNew(Object.assign(Object.assign(Object.assign({},e),(0,ye.Z)(i)),{peerId:t}));return this.setLastMessageN({dialog:{_:"dialog",peerId:t},lastMessage:i,dialogElement:n,highlightWord:s}),i.peerId!==t&&(n.dom.listEl.dataset.peerId=""+i.peerId),n}addDialogNew(e){const t=new at(Object.assign({autonomous:!!e.container,avatarSize:"bigger"},e));if(e.container){const i=e.append?"prepend":"append";e.container[i](t.container)}return t}}const ut=new ht;M.GO.appDialogsManager=ut;const pt=ut},2312:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(3725),n=i(2202),a=i(3512),o=i(410),r=i(319),d=i(1243),l=i(7086),c=i(1655),h=i(5471),u=i(8801),p=i(6658),f=i(7667),m=i(3855);const g=new class{constructor(){this.downloads={},this.progress={}}construct(e){this.managers=e,a.Z.addEventListener("download_progress",(e=>{var t;const i=this.downloads[e.fileName];(null===(t=null==i?void 0:i.main)||void 0===t?void 0:t.notifyAll)&&(this.progress[e.fileName]=e,i.main.notifyAll(e))}))}getNewDeferred(e,t){const i=(0,s.Z)();let n=this.downloads[e];if(n){const e=n.main;["cancel","addNotifyListener","notify","notifyAll"].forEach((t=>{e[t]&&(i[t]=e[t].bind(e))}))}else n=this.downloads[e]={main:i},i.cancel=()=>{const t=(0,h.Z)("DOWNLOAD_CANCELED");this.managers.apiFileManager.cancelDownload(e),i.reject(t),i.cancel=r.Z},i.catch((()=>{this.clearDownload(e,t)})).finally((()=>{delete this.progress[e]}));return"disc"===t&&i.catch(r.Z).finally((()=>{this.clearDownload(e,t)})),n[t]=i}getNewDeferredForUpload(e,t){const i=this.getNewDeferred(e);return t.then(i.resolve,i.reject),i.finally((()=>{this.clearDownload(e)})),i}clearDownload(e,t){const i=this.downloads[e];if(!i)return;delete i[t];const s=Object.keys(i).length;(!s||i.main&&1===s)&&delete this.downloads[e]}getUpload(e){let t=this.getDownload(e);return t||(t=this.getNewDeferred(e),this.managers.appMessagesManager.getUploadPromise(e).then(t.resolve,t.reject),t)}d(e,t,i){let s=this.getDownload(e,i);return s||(s=this.getNewDeferred(e,i),t().then(s.resolve,s.reject),s)}download(e){const t=(0,l.Z)(e);return this.d(t,(()=>this.managers.apiFileManager.download(e)),"blob")}downloadMedia(e,t="blob",i){const{downloadOptions:s,fileName:n}=(0,d.Z)(e);return this.d(n,(()=>{let s;return s="url"===t?this.managers.apiFileManager.downloadMediaURL:"void"===t?this.managers.apiFileManager.downloadMediaVoid:this.managers.apiFileManager.downloadMedia,i?i.then((()=>s(e))):s(e)}),t)}downloadMediaURL(e){return this.downloadMedia(e,"url")}downloadMediaVoid(e){return this.downloadMedia(e,"void")}upload(e,t,i){return t||(t=(0,n.Z)(e)),i||(i=this.managers.apiFileManager.upload({file:e,fileName:t})),this.getNewDeferredForUpload(t,i)}getDownload(e,t){const i=this.downloads[e];return i&&i[t]}downloadToDisc(e,t){const i=e.media,s="document"===i._;s||e.thumb||(e.thumb=i.sizes.slice().pop());const n=""+(2147483647*Math.random()|0),a=`download/${n}`;e.downloadId=n;const o=m.Z.pingServiceWorkerWithIframe(),d=this.downloadMedia(e,"disc",o);if(t)return d;const l=document.createElement("iframe");l.hidden=!0,o.then((()=>{l.src=a,document.body.append(l)}));let h,g=!1;const v=()=>{g||(g=!0,h=l,(0,c.Z)(d.listeners,v))};return d.addNotifyListener(v),d.then((t=>{if(!t)return;const n=URL.createObjectURL(t),a=s?(0,p.Z)(i):(0,f.Z)(i,e.thumb),o=e.media.file_name||(0,u.P)(a.location);!function(e,t,i){const s=document.createElement("a");s.href=e,s.download=t,s.target="_blank",s.style.position="absolute",s.style.top="1px",s.style.left="1px",document.body.append(s);try{const e=document.createEvent("MouseEvents");e.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),s.dispatchEvent(e)}catch(t){console.error("Download click error",t);try{s.click()}catch(t){window.open(e,"_blank")}}setTimeout((()=>{s.remove(),i&&i()}),100)}(n,a.fileName||o,(()=>{URL.revokeObjectURL(n)}))})).catch(r.Z).finally((()=>{g||v(),setTimeout((()=>{null==h||h.remove()}),1e3)})),d}};o.GO&&(o.GO.appDownloadManager=g);const v=g},4271:(e,t,i)=>{"use strict";i.d(t,{oo:()=>Yr,ZP:()=>td});var s=i(5814),n=i(744),a=i(4332),o=i(4755),r=i(5003),d=i(3512),l=i(3241),c=i(5432),h=i(1655),u=i(6519),p=i(4484),f=i(9331),m=i(1507),g=i(7625);function v(e,t){const i=[],s=[];for(let n=0,a=e.length;n{this.mountItem(e,s-1-i,t)})),e&&this.updateClassNames(),this.onItemMount()}mountItem(e,t=this.items.indexOf(e),i=this.offset){e.mounted||((0,p.Z)(e.bubble,this.container,i+t),e.mounted=!0)}unmountItem(e){e.mounted&&(e.bubble.remove(),e.mounted=!1,this.onItemUnmount())}onItemMount(){if(this.mounted)return;const e=this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp/1e3),t=this.groups.groups.filter((e=>e.dateTimestamp===this.dateTimestamp)),i=t.length,s=t.indexOf(this),n=t.slice(s+1).reduce(((e,t)=>e+(t.mounted?0:1)),0);(0,p.Z)(this.container,e.container,Ls+i-1-s-n),this.mounted=!0}onItemUnmount(){this.mounted&&(this.items.length?this.updateClassNames():(this.container.remove(),this.chat.bubbles.deleteEmptyDateGroups(),this.mounted=!1))}}class w{constructor(e){this.chat=e,this.itemsArr=[],this.itemsMap=new Map,this.groups=[],this.newGroupDiff=121,this.sortItemsKey="scheduled"===e.type?"timestamp":"mid",this.sortGroupsKey="scheduled"===e.type?"lastTimestamp":"lastMid",this.sortGroupItemsKey="groupMid"}removeItem(e){var t;null===(t=e.group)||void 0===t||t.removeItem(e),this.removeItemFromCache(e)}removeAndUnmountBubble(e){const t=this.getItemByBubble(e);if(!t)return e.parentElement&&e.remove(),!1;const i=this.itemsArr,s=i.indexOf(t),n=this.getSiblingsAtIndex(s,i),a=t.group;this.removeItem(t);const o=new Set;a&&(a.unmountItem(t),o.add(a));const[r,d]=n;if(r&&d&&this.canItemsBeGrouped(r,d)&&r.group!==d.group){const e=d.group;this.f(d.group.items),e.onItemUnmount(),o.add(r.group),this.groupUngrouped()}return this.mountUnmountGroups(Array.from(o)),!0}mountUnmountGroups(e){const[t,i]=v(e,(e=>!!e.items.length));i.forEach((e=>{e.onItemUnmount()})),t.forEach((e=>{e.mount(!0)}))}f(e,t=0,i=e.length){for(;ts.add(e)))}}return s}cleanup(){this.itemsArr=[],this.groups=[],this.itemsMap.clear()}}var S=i(1168),C=i(2738),L=i(2325),E=i(503);class I extends S.Z{constructor(e,t,i={}){if(super("popup-date-picker",Object.assign({body:!0,overlayClosable:!0,buttons:i.noButtons?[]:[{langKey:"JumpToDate",callback:()=>{this.onPick&&this.onPick(this.selectedDate.getTime()/1e3|0)}},{langKey:"Cancel",isCancel:!0}],title:!0},i)),this.onPick=t,this.options=i,this.onPrevClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()-1),this.setMonth(),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.nextBtn.removeAttribute("disabled")},this.onNextClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()+1),this.setMonth(),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),this.prevBtn.removeAttribute("disabled")},this.onDateClick=e=>{const t=e.target;if(!t.dataset.timestamp)return;if(this.selectedEl){if(this.selectedEl===t)return;this.selectedEl.classList.remove("active")}this.selectedEl=t,t.classList.add("active");const i=+t.dataset.timestamp;this.selectedDate=new Date(i),this.setTitle(),this.setTimeTitle()},this.minDate=i.minDate||new Date("2013-08-01T00:00:00"),e{const n=""+e;this.listenerSetter.add(t.input)("input",(a=>{let o=t.value.replace(/\D/g,"");o.length>2?o=o.slice(0,2):(1===o.length&&+o[0]>+n[0]||2===o.length&&+o>e)&&(2===o.length&&s&&s(+o[1]),o="0"+o[0]),t.setValueSilently(o),i(o.length)}))};this.hoursInputField=new E.ZP({plainText:!0}),this.minutesInputField=new E.ZP({plainText:!0}),i(23,this.hoursInputField,(e=>{2===e&&this.minutesInputField.input.focus(),this.setTimeTitle()}),(e=>{this.minutesInputField.value=(e+this.minutesInputField.value).slice(0,2)})),i(59,this.minutesInputField,(e=>{e||this.hoursInputField.input.focus(),this.setTimeTitle()})),this.selectedDate=e,e.setMinutes(e.getMinutes()+10),this.hoursInputField.setValueSilently(("0"+e.getHours()).slice(-2)),this.minutesInputField.setValueSilently(("0"+e.getMinutes()).slice(-2)),e.setHours(0,0,0,0),this.timeDiv.append(this.hoursInputField.container,t,this.minutesInputField.container),(0,C.fc)(this.btnConfirm,(()=>{this.onPick&&(this.selectedDate.setHours(+this.hoursInputField.value||0,+this.minutesInputField.value||0,0,0),this.onPick(this.selectedDate.getTime()/1e3|0)),this.hide()}),{listenerSetter:this.listenerSetter}),this.body.append(this.timeDiv),this.prevBtn.classList.add("primary"),this.nextBtn.classList.add("primary")}const s=document.createElement("div");s.classList.add("popup-centerer"),s.append(this.container),this.element.append(s),e.setHours(0,0,0,0),this.selectedDate=e,this.maxDate=i.maxDate||new Date,this.maxDate.setHours(0,0,0,0),this.selectedMonth=new Date(this.selectedDate),this.selectedMonth.setDate(1),this.maxMonth=new Date(this.maxDate),this.maxMonth.setDate(1),this.minMonth=new Date(this.minDate),this.minMonth.setHours(0,0,0,0),this.minMonth.setDate(1),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),i.noTitle&&(this.setTitle=()=>{}),this.setTimeTitle(),this.setTitle(),this.setMonth()}setTimeTitle(){if(this.btnConfirm&&this.selectedDate){let e;const t=[],i=new Date;i.setHours(0,0,0,0);const s={minute:"2-digit",hour:"2-digit"},n=new Date(this.selectedDate.getTime());if(n.setHours(+this.hoursInputField.value,+this.minutesInputField.value),this.selectedDate.getTime()===i.getTime())e="Schedule.SendToday";else{e="Schedule.SendDate";const s={month:"short",day:"numeric"};n.getFullYear()!==i.getFullYear()&&(s.year="numeric"),t.push(new L.ZP.IntlDateElement({date:n,options:s}).element)}t.push(new L.ZP.IntlDateElement({date:n,options:s}).element),this.btnConfirm.firstChild.replaceWith((0,L.ag)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new L.ZP.IntlDateElement({date:this.selectedDate,options:{day:"numeric",month:"long",weekday:"short"}}).element)}renderElement(e,t=""){const i=document.createElement("button");return i.classList.add("btn-icon","date-picker-month-date"),e&&i.setAttribute("disabled","true"),t&&i.append(t),i}setMonth(){const e=new Date(this.selectedMonth),t={year:"numeric",month:this.timeDiv&&o.Z.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new L.ZP.IntlDateElement({date:e,options:t}).element),this.month&&this.month.remove(),this.month=document.createElement("div"),this.month.classList.add("date-picker-month");const i=new Date,s=i.getDay();1!==s&&i.setHours(-24*(s-1));for(let e=0;e<7;++e){const e=this.renderElement(!0,new L.ZP.IntlDateElement({date:i,options:{weekday:"narrow"}}).element);e.classList.remove("date-picker-month-date"),e.classList.add("date-picker-month-day"),this.month.append(e),i.setDate(i.getDate()+1)}let n=e.getDay()-1;-1===n&&(n=6);const a=new Date(e.getTime());a.setDate(a.getDate()-n-1);for(let e=0;ethis.maxDate||e{f&&!f()||(p.forEach((e=>e.remove())),o&&o.classList.toggle("is-round",u))})),h}))}class X extends G{constructor(e,t){super(e,((e,i="",s)=>q(this,void 0,void 0,(function*(){this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const n=yield Y({title:e,titleEl:this.title,subtitle:i,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:s,animationGroup:t});this.container.classList.toggle("is-media",n),n?this.content.prepend(this.mediaEl):this.mediaEl.remove()})))),this.className=e,this.animationGroup=t}}function J(e,t,i,s,n){const a=new X("reply",i),o=a.fill(e,t,s);if(n){const e=(0,U.Z)(n,!1),[t,i,s]=(0,O.oo)(e);a.container.style.setProperty("--override-color",`${t}, ${i}, ${s}`),a.container.classList.add("is-overriding-color")}return{container:a.container,fillPromise:o}}const ee="stacked-avatars",te=ee+"-avatar",ie=te+"-container";class se{constructor(e){this.lazyLoadQueue=e.lazyLoadQueue,this.avatarSize=e.avatarSize,this.container=document.createElement("div"),this.container.classList.add(ee),this.container.style.setProperty("--avatar-size",e.avatarSize+"px")}render(e,t){const i=this.container.children;(e=e.slice().reverse()).length>3&&(e=e.slice(-3)),e.forEach(((e,s)=>{let n=i[s];n||(n=document.createElement("div"),n.classList.add(ie));let a=n.firstElementChild;a||(a=new f.Z,a.classList.add("avatar-"+this.avatarSize,te),a.updateOptions({isDialog:!1,loadPromises:t})),a.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e}),a.parentNode||n.append(a),n.parentNode||this.container.append(n)})),Array.from(i).slice(e.length).forEach((e=>e.remove()))}}const ne="replies-element";d.Z.addEventListener("replies_updated",(e=>{Array.from(document.querySelectorAll(ne+`[data-post-key="${e.peerId}_${e.mid}"]`)).forEach((t=>{t.message=e,t.render()}))}));class ae extends HTMLElement{constructor(){super(),this.updated=!1,this.managers=d.Z.managers}init(){this.render(),this.dataset.postKey=this.message.peerId+"_"+this.message.mid,this.classList.add("replies","replies-"+this.type)}render(){const e=this.message.replies;if("footer"===this.type){let t;this.firstElementChild&&(t=this.firstElementChild),(null==e?void 0:e.recent_repliers)?(t&&!t.classList.contains("replies-footer-avatars")&&(this.innerHTML="",t=null),this.stackedAvatars||(this.stackedAvatars=new se({lazyLoadQueue:this.lazyLoadQueue,avatarSize:30}),this.stackedAvatars.container.classList.add("replies-footer-avatars")),t=this.stackedAvatars.container,this.stackedAvatars.render(e.recent_repliers.map((e=>(0,R.Z)(e))),this.loadPromises)):(t&&!t.classList.contains("tgico-comments")&&(t.remove(),t=null),t||(t=document.createElement("span"),t.classList.add("tgico-comments"))),t.parentElement||this.prepend(t),this.text||(this.text=new L.ZP.IntlElement);const i=this.text;if(e?e.replies?i.compareAndUpdate({key:"Comments",args:[e.replies]}):i.compareAndUpdate({key:"LeaveAComment"}):i.compareAndUpdate({key:"ViewInChat"}),e){let t=!1;e.replies&&void 0!==e.read_max_id&&void 0!==e.max_id&&(t=e.read_max_id${(null==e?void 0:e.replies)?(0,D.Z)(e.replies,0):""}`;!e||this.updated||this.message.pFlags.is_outgoing||(this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId,this.message.mid),this.managers.appMessagesManager.updateMessage(this.message.peerId,this.message.mid,"replies_updated"),this.updated=!0),this.loadPromises&&(this.loadPromises=void 0)}}customElements.define(ne,ae);const oe=()=>{const e=document.createElement("i");return e.classList.add("edited"),(0,L.$d)(e,"EditedMessage"),e},re=()=>(0,L.ag)("SponsoredMessage");var de;!function(e){e.setTime=e=>{var t;const{chatType:i,message:s}=e,n=new Date(1e3*s.date),a=[];let o,r;const d=!!s.pFlags.sponsored,l=!("action"in s)&&!d,c=d?void 0:(0,_.mr)(n);if(l){if(s.views){const e=s.post_author||(null===(t=s.fwd_from)||void 0===t?void 0:t.post_author),i=document.createElement("span");i.classList.add("post-views"),i.innerHTML=(0,D.Z)(s.views,1);const n=document.createElement("i");if(n.classList.add("tgico-channelviews","time-icon"),a.push(i,n),e){const t=document.createElement("span");(0,F.Z)(t,(0,B.Z)(e)),t.insertAdjacentHTML("beforeend",", "),a.push(t)}}if(s.edit_date&&"scheduled"!==i&&!s.pFlags.edit_hide&&a.unshift(o=oe()),"pinned"!==i&&s.pFlags.pinned){const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),a.unshift(e)}}else d&&a.push(r=re());c&&a.push(c);let h=d?void 0:(0,_.xE)(n);l&&(h+=(s.edit_date&&!s.pFlags.edit_hide?`\nEdited: ${(0,_.xE)(new Date(1e3*s.edit_date))}`:"")+(s.fwd_from?`\nOriginal: ${(0,_.xE)(new Date(1e3*s.fwd_from.date))}`:""));const u=document.createElement("span");u.classList.add("time","tgico"),u.append(...a);const p=document.createElement("div");p.classList.add("inner","tgico"),h&&(p.title=h);let f=a;return o&&(f[f.indexOf(o)]=oe()),r&&(f[f.indexOf(r)]=re()),f=f.map((e=>e instanceof HTMLElement&&!e.classList.contains("i18n")&&!e.classList.contains("reactions")?e.cloneNode(!0):e)),c&&(f[f.length-1]=(0,_.mr)(n)),p.append(...f),u.append(p),u},e.renderReplies=({bubble:e,bubbleContainer:t,message:i,messageDiv:s,loadPromises:n,lazyLoadQueue:a})=>{const o=!e.classList.contains("sticker")&&!e.classList.contains("emoji-big")&&!e.classList.contains("round"),r=new ae;return r.message=i,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},e.setReply=({chat:e,bubble:t,bubbleContainer:i,message:s})=>{return n=this,a=void 0,r=function*(){const n=!i;n&&(i=t.querySelector(".bubble-content"));const a=n?i.querySelector(".reply"):null;if(!s.reply_to_mid)return null==a||a.remove(),void t.classList.remove("is-reply");const o=s.reply_to.reply_to_peer_id?(0,R.Z)(s.reply_to.reply_to_peer_id):e.peerId,r=yield d.Z.managers.appMessagesManager.getMessageByPeer(o,s.reply_to_mid);let l,c;if(r){const e=r.fwdFromId;c=s.fwdFromId&&s.fwdFromId===e?s.fwdFromId:r.fromId||e,l=new N.Z({peerId:c,dialog:!1,onlyFirstName:!1,plainText:!1}).element}else d.Z.managers.appMessagesManager.fetchMessageReplyTo(s),e.bubbles.needUpdate.push({replyToPeerId:o,replyMid:s.reply_to_mid,mid:s.mid}),l=(0,L.ag)("Loading");const{container:h,fillPromise:u}=J(l,void 0,e.animationGroup,r,e.isAnyGroup?c:void 0);return yield u,a?(a.classList.contains("floating-part")&&h.classList.add("floating-part"),a.replaceWith(h)):i.append(h),t.classList.add("is-reply"),h},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r}}(de||(de={}));var le=i(2153),ce=i(3699),he=i(8448),ue=i(4789),pe=i(8594),fe=i(3035),me=i(3725),ge=i(410),ve=i(252),be=i(8497),ye=i(4668),we=i(2796);function Se(e,t,i){const s=e.getBoundingClientRect(),n="center"===i?Math.ceil(s.left+(s.right-s.left)/2+1):Math.ceil(s.left+1),a="bottom"===t?Math.floor(s.top+s.height-1):Math.ceil(s.top+1);return document.elementFromPoint(n,a)}ge.GO.getElementByPoint=Se;var Ce=i(3624),Le=i(3910),Ee=i(5705);function Ie(e){e.style.display="none",e.offsetLeft,e.style.display=""}var Me=i(2648),Pe=i(5296),Ze=i(8938),Te=i(5701);const ke=2147483646;var xe,Ae=i(241),_e=i(6272),Fe=i(1784),De=i(9099),Re=i(2416),Be=i(8763),Ne=i(5975),Oe=i(8939),Ue=i(993),He=i(4494),ze=i(8204),je=i(2575),Ge=i(9931);class Ve extends S.Z{constructor(e,t){super("popup-join-chat-invite",{closable:!0,overlayClosable:!0,body:!0,buttons:(0,S.x)([{langKey:t.pFlags.request_needed?"RequestJoin.Button":t.pFlags.broadcast?"JoinByPeekChannelTitle":"JoinByPeekGroupTitle",callback:()=>{this.managers.appChatsManager.importChatInvite(e).then((e=>{const t=e.toPeerId(!0);td.setInnerPeer({peerId:t})}),(e=>{"INVITE_REQUEST_SENT"===e.type&&(0,we.bC)({langPackKey:"RequestToJoinSent"})}))}}])}),this.hash=e,this.chatInvite=t,this.construct()}construct(){return e=this,t=void 0,s=function*(){this.header.remove();const{chatInvite:e,managers:t,hash:i}=this,s=new f.Z;s.classList.add("avatar-100"),s.isDialog=!1,"photo"===e.photo._?(e.photo=yield t.appPhotosManager.savePhoto(e.photo),(0,K.Z)({container:s,message:null,photo:e.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):(0,Ge.Z)({div:s,peerId:m.NM,isDialog:!1,title:e.title});const n=document.createElement("div");n.classList.add("chat-title"),(0,F.Z)(n,(0,B.Z)(e.title));const a=e.pFlags.broadcast,o=(0,L.ag)(a?"Subscribers":"Members",[(0,je.Z)(e.participants_count)]);if(o.classList.add("chat-participants-count"),this.body.append(s,n,o),e.pFlags.request_needed){const e=document.createElement("div");(0,L.$d)(e,a?"RequestToJoinChannelDescription":"RequestToJoinGroupDescription"),e.classList.add("chat-participants-count","request-caption"),this.body.append(e)}this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}!function(e){e[e.MESSAGE=0]="MESSAGE",e[e.PRIVATE_POST=1]="PRIVATE_POST",e[e.STICKER_SET=2]="STICKER_SET",e[e.JOIN_CHAT=3]="JOIN_CHAT",e[e.VOICE_CHAT=4]="VOICE_CHAT",e[e.USER_PHONE_NUMBER=5]="USER_PHONE_NUMBER",e[e.INVOICE=6]="INVOICE",e[e.EMOJI_SET=7]="EMOJI_SET"}(xe||(xe={}));var Ke=i(5285),We=i(6654),$e=i(9083),qe=i(6775),Qe=i(9405),Ye=i(319);const Xe="reaction",Je=Xe+"-element";class et extends HTMLElement{constructor(){super(),this.classList.add(Xe),this.managers=d.Z.managers}get reactionCount(){return this._reactionCount}set reactionCount(e){this._reactionCount=e}get count(){return this.reactionCount.count}init(e,t){this.type=e,this.classList.add(Xe+"-"+e),this.middleware=t}setCanRenderAvatars(e){this.canRenderAvatars=e}render(e){const t=!!this.stickerContainer;t||(this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add(Xe+"-sticker"),this.append(this.stickerContainer));const i=this.reactionCount;if(!e&&!t){const e=i.reaction;if("reactionEmoji"===e._){const t=this.managers.appReactionsManager.getReaction(e.emoticon);(0,We.Z)(t,(e=>{var t;e.center_icon||this.stickerContainer.classList.add("is-static"),e.pFlags.inactive&&this.classList.add("is-inactive"),this.renderDoc(null!==(t=e.center_icon)&&void 0!==t?t:e.static_icon)}))}else if("reactionCustomEmoji"===e._){this.stickerContainer.classList.add("is-custom");const t=(0,$e.Z)({docIds:[e.document_id],customEmojiSize:(0,Qe.C)(22,22)});this.stickerContainer.append(t)}}}renderDoc(e){const t="inline"===this.type?14:22,i=this.wrapStickerPromise=(0,W.ZP)({div:this.stickerContainer,doc:e,width:t,height:t,static:!0,managers:this.managers,middleware:this.middleware}).then((({render:e})=>e)).finally((()=>{this.wrapStickerPromise===i&&(this.wrapStickerPromise=void 0)}))}renderCounter(){var e;const t=this.reactionCount,i="inline"===this.type?2:4;if(t.count>=i||"block"===this.type&&!this.canRenderAvatars){this.counter||(this.counter=document.createElement("inline"===this.type?"i":"span"),this.counter.classList.add(Xe+"-counter"));const e=(0,D.Z)(t.count);this.counter.textContent!==e&&(this.counter.textContent=e),this.counter.parentElement||this.append(this.counter)}else(null===(e=this.counter)||void 0===e?void 0:e.parentElement)&&(this.counter.remove(),this.counter=void 0)}renderAvatars(e){"inline"!==this.type&&(this.reactionCount.count>=4||!this.canRenderAvatars?this.stackedAvatars&&(this.stackedAvatars.container.remove(),this.stackedAvatars=void 0):(this.stackedAvatars||(this.stackedAvatars=new se({avatarSize:24}),this.append(this.stackedAvatars.container)),this.stackedAvatars.render(e.map((e=>(0,R.Z)(e.peer_id))))))}setIsChosen(e=void 0!==this.reactionCount.chosen_order){"inline"!==this.type&&(this.classList.contains("is-chosen")&&!this.classList.contains("backwards"))!==e&&(0,De.Z)({element:this,className:"is-chosen",forwards:e,duration:this.isConnected?300:0})}fireAroundAnimation(){const e=this.reactionCount.reaction;"reactionEmoji"===e._&&(0,We.Z)(this.managers.appReactionsManager.getReaction(e.emoticon),(e=>{const t="inline"===this.type?28:40,i=document.createElement("div");i.classList.add(Xe+"-sticker-activate"),Promise.all([(0,W.ZP)({div:i,doc:e.center_icon,width:t,height:t,withThumb:!1,needUpscale:!0,play:!1,skipRatio:1,group:"none",needFadeIn:!1,managers:this.managers,middleware:this.middleware}).then((({render:e})=>e)),(0,qe.Z)({doc:e.around_animation,size:80,target:this.stickerContainer,side:"center",skipRatio:1,play:!1,managers:this.managers,middleware:this.middleware}).stickerPromise.catch(Ye.Z)]).then((([e,t])=>{const s=()=>{e.remove(),i.remove(),this.stickerContainer.classList.remove("has-animation")};if(!t)return void s();const n=()=>{(0,fe.T2)(s)};e.addEventListener("enterFrame",(t=>{t===e.maxFrame&&(this.wrapStickerPromise?this.wrapStickerPromise.then((()=>{setTimeout(n,1e3)})):n())})),e.addEventListener("firstFrame",(()=>{this.stickerContainer.append(i),this.stickerContainer.classList.add("has-animation"),e.play(),t.play()}),{once:!0})}))}))}}customElements.define(Je,et);const tt="reactions",it=tt+"-element",st=new Map;class nt extends HTMLElement{constructor(){super(),this.classList.add(tt),this.sorted=[],this.middlewareHelpers=new Map,this.managers=d.Z.managers}connectedCallback(){let e=st.get(this.key);e||st.set(this.key,e=new Set),e.add(this),this.onConnectCallback&&this.isConnected&&(this.onConnectCallback(),this.onConnectCallback=void 0)}disconnectedCallback(){const e=st.get(this.key);e.delete(this),e.size||st.delete(this.key)}getReactionCount(e){return this.sorted[this.sorted.indexOf(e)].reactionCount}getMessage(){return this.message}init(e,t,i,s=this.isPlaceholder){void 0!==this.key&&this.disconnectedCallback(),this.middleware!==i&&i.onDestroy((()=>{this.middlewareHelpers.clear()})),this.message=e,this.key=this.message.peerId+"_"+this.message.mid,this.middleware=i,this.isPlaceholder=s,this.type!==t&&(this.type=t,this.classList.add(tt+"-"+t)),this.connectedCallback()}changeMessage(e){return this.init(e,this.type,this.middleware)}update(e,t){this.message=e,this.render(t)}render(e){const t=this.message.reactions,i=!(!t||!t.results.length);if(this.classList.toggle("has-no-reactions",!i),!i&&!this.sorted.length)return;this.managers.appReactionsManager.getAvailableReactions();const s=i?t.results:[];s.sort(((e,t)=>{var i,s;return t.count-e.count||(null!==(i=e.chosen_order)&&void 0!==i?i:0)-(null!==(s=t.chosen_order)&&void 0!==s?s:0)})),(0,g.Z)(this.sorted,((e,t,i)=>{const n=e.reactionCount.reaction;s.some((e=>(0,Ke.Z)(e.reaction,n)))||(this.middlewareHelpers.get(e).destroy(),this.middlewareHelpers.delete(e),i.splice(t,1),e.remove())}));const n=s.reduce(((e,t)=>e+t.count),0),a=t&&(!!t.pFlags.can_see_list||this.message.peerId.isUser())&&n<4;if(this.sorted=s.map(((e,i)=>{let s=this.sorted.find((t=>(0,Ke.Z)(t.reactionCount.reaction,e.reaction)));if(!s){const e=this.middleware.create();s=new et,s.init(this.type,e.get()),this.middlewareHelpers.set(s,e)}(0,p.Z)(s,this,i);const n=t.recent_reactions?t.recent_reactions.filter((t=>(0,Ke.Z)(t.reaction,e.reaction))):[];return s.reactionCount=Object.assign({},e),s.setCanRenderAvatars(a),s.render(this.isPlaceholder),s.renderCounter(),s.renderAvatars(n),s.setIsChosen(),s})),!this.isPlaceholder&&(null==e?void 0:e.length)&&(this.isConnected?this.handleChangedResults(e):this.onConnectCallback=()=>{this.handleChangedResults(e)}),!this.sorted.length&&"block"===this.type){const e=this.parentElement;if(this.remove(),e.classList.contains("document-message")&&!e.childNodes.length)return void e.remove();const t=this.querySelector(".time");t&&e.append(t)}}handleChangedResults(e){this.message.peerId===td.chat.peerId&&e.forEach((e=>{const t=this.sorted.find((t=>(0,Ke.Z)(t.reactionCount.reaction,e.reaction)));null==t||t.fireAroundAnimation()}))}}customElements.define(it,nt);var at=i(5418);class ot{constructor(e,t,i){this.scrollable=e,this.query=t,this.reverse=i}get container(){return this.scrollable.container}getSaved(){return{scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,clientHeight:this.clientHeight}}findElements(){if(!this.query)return[];const{container:e}=this,t=e.getBoundingClientRect(),i=Array.from(e.querySelectorAll(this.query)),s=[];for(const n of i){const i=n.getBoundingClientRect();if((0,ze.Z)(n,e,void 0,i,t))s.push({element:n,rect:i});else if(s.length)break}if(!s.length){const e=i[0];e&&s.push({element:e,rect:e.getBoundingClientRect()})}return s}replaceSaved(e,t){if(!this.elements)return;const i=this.elements.findIndex((({element:t})=>e===t));-1!==i&&(this.elements[i].element=t)}findAndSetElements(){this.elements=this.findElements()}save(){this.findAndSetElements(),this._save()}_save(){const{scrollTop:e,scrollHeight:t,clientHeight:i}=this.container;this.scrollHeight=t,this.scrollTop=e,this.clientHeight=i,this.scrollHeightMinusTop=this.reverse?t-e:e}onRestore(e){x.IS_SAFARI&&e&&Ie(this.container)}setScrollTop(e,t){this.scrollable.setScrollTopSilently(this.scrollTop=e),this.onRestore(t)}restore(e){var t;const{scrollTop:i,scrollHeight:s}=this.scrollable;if(this.scrollHeight=s,!this.elements.length)return void this._restore(e);let n;if(n=this.elements[this.elements.length-1],!(null===(t=null==n?void 0:n.element)||void 0===t?void 0:t.parentElement)&&(this.findAndSetElements(),n=this.elements[this.elements.length-1],!n))return void this._restore(e);const{element:a,rect:o}=n,r=a.getBoundingClientRect().bottom-o.bottom;this.setScrollTop(i+r,e)}_restore(e){const{scrollHeightMinusTop:t,scrollable:i}=this,s=this.scrollHeight,n=this.reverse?s-t:t;this.setScrollTop(n,e)}}ge.GO&&(ge.GO.ScrollSaver=ot);var rt=i(7401),dt=i(4881);class lt{constructor(e){this.observing=new Map,this.observingQueue=new Map,this.freezedObservingNew=!1,this.observer=new IntersectionObserver((e=>{const t=this.observing;for(let i=0,s=e.length;ie+t),t)}var At=i(8097);const _t=function(e){const t={},i={};return s=>{var n,a;const o="_"+s;return null!==(n=(a="string"==typeof s?t:i)[o])&&void 0!==n?n:a[o]=e(s)}};function Ft(e){return e.replace(/\D/g,"")}const Dt={visa:/^4/,mastercard:/^(51|52|53|54|55|222|23|24|25|26|27)/,amex:/^(34|37)/,discover:/^(60|64|65)/,diners:/^(30|38|39)/,diners14:/^(36)/,jcb:/^(35)/,unionpay:/^(62[0-6,8-9]|627[0-6,8-9]|6277[0-7,9]|62778[1-9]|81)/,elo:/^(5067|509|636368|627780)/,mir:/^(220[0-4])/},Rt={visa:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},mastercard:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},amex:{minLength:15,maxLength:15,cvcMaxLength:4,cvcMinLength:3},unionpay:{minLength:13,maxLength:19,cvcMaxLength:3,cvcMinLength:null},diners:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},diners14:{minLength:14,maxLength:14,cvcMaxLength:3,cvcMinLength:null},discover:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},jcb:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},elo:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},mir:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},unknown:{minLength:16,maxLength:16,cvcMaxLength:4,cvcMinLength:3}},Bt=_t(((e="")=>{const t=Object.keys(Dt),i=Ft(e);let s,n=0;return t.forEach((e=>{const t=Dt[e],a=i.match(t);if(a){const t=a[0];t&&t.length>n&&(s=e,n=t.length)}})),s||"unknown"}));function Nt(e=""){return"diners14"===(t=Bt(e))?"diners":t;var t}var Ot=i(2398),Ut=i(6740),Ht=i(1656),zt=i(7298),jt=i(9807),Gt=i(279),Vt=i(7479),Kt=i(7362);function Wt(e,t,i){const s=new Array(e);return s.fill(t),i?s.map(i):s}const $t="0".charCodeAt(0)-"0".charCodeAt(0),qt=/[0-9]/g;function Qt(e){return String.fromCharCode(e.charCodeAt(0)-$t)}function Yt(e){return e.replace(qt,Qt)}function Xt(e,t){return{type:"optional",result:e,consumed:t}}function Jt(e,t,i){return{type:"required",result:e,consumed:t,partial:i}}function ei(e,t){return i=>{const s=new RegExp("^".concat(e.source.replace(/^\^/,""))),n=i.match(s),a=t?Xt:Jt;if(n){const e=n[0];return a(e,n.index+e.length)}return a("",i.length)}}const ti=ei(/1[0-2]|0?[1-9]|0/),ii={digit:function(e){return ei(/[0-9]/)(Yt(e))},capitalCharacter:function(e){const t=ei(/\w/)(e);return t.result?Jt(t.result.toUpperCase(),t.consumed):t},month:e=>{const t=ti(Yt(e)),i=Ft(t.result);return["0","1"].includes(t.result)&&1===e.length||"0"===t.result&&e.length>=2?Jt(t.result,e.length,!0):Jt(1===i.length?"0"+i:i,t.consumed)},formattingCharacter:e=>t=>{const i=e===t[0]?1:0;return function(e,t){return{type:"formatting",result:e,consumed:t}}(e,i)},optionalPattern:e=>t=>{const i=ei(e,!0)(t);return i.result?i:Xt("",0)}},si=ii.digit,ni=ii.capitalCharacter,ai=ii.formattingCharacter(" "),oi=ii.optionalPattern(/\d\d/),ri=[si,si,si,si,ai,si,si,si,si,si,si,ai,si,si,si,si,si],di=[si,si,si,si,ai,si,si,si,si,si,si,ai,si,si,si,si],li=new Set(["DZ","AR","AM","AU","AT","AZ","PT","BD","BY","BE","BA","BR","BN","BG","CA","IC","CN","CO","HR","CY","CZ","DK","EC","GB","EE","FO","FI","FR","GE","DE","GR","GL","GU","GG","NL","HU","IN","ID","IL","IT","JP","JE","KZ","KR","FM","KG","LV","LI","LT","LU","MK","MG","PT","MY","MH","MQ","YT","MX","MN","ME","NL","NZ","GB","NO","PK","PH","PL","FM","PT","PR","RE","RU","SA","SF","RS","SG","SK","SI","ZA","ES","LK","SX","VI","VI","SE","CH","TW","TJ","TH","TU","TN","TR","TM","VI","UA","GB","US","UY","UZ","VA","VN","GB","FM"]),ci=_t((e=>{const t=[];for(let i=0,s=0;i[ii.month,ii.formattingCharacter("/"),si,si,oi],cardCvc:e=>hi.cardCvcFromBrand(Bt(e)),cardCvcFromBrand:_t((e=>{const t=Rt[e],{cvcMinLength:i,cvcMaxLength:s}=t,n=Wt(i||s,si);if(i&&i{switch(e){case"US":return Wt(5,si);case"CA":return x.IS_ANDROID?null:[ni,ni,ni,ai,ni,ni,ni];default:const t=Wt(10,ii.optionalPattern(/\d/));return li.has(e)&&(t[0]=si),t}}))},ui=hi;function pi(e){return xt(e.map((e=>e.length)),0)}const fi=new RegExp("‎","g");function mi(e){return e?{type:"invalid",code:e}:null}function gi(e,t={}){const{sanitized:i,minLength:s}=function(e){const t=Ft(e),i=Bt(e);return{sanitized:t,brand:i,minLength:Rt[i].minLength}}(e);return function(e,t,i){return e.length>=t?function(e){const t="0".charCodeAt(0),i=e.length%2;let s=0;for(let n=e.length-1;n>=0;--n){const a=i===n%2;let o=e.charCodeAt(n)-t;a&&(o*=2),o>9&&(o-=9),s+=o}return!(s%10)}(e)||"mir"===Bt(e)?null:mi("invalid"):i?null:mi("incomplete")}(i,s,t.ignoreIncomplete)}function vi(e,t={}){const i=e.replace(fi,"").split(/ ?\/ ?/),[s,n=""]=i,[a,o]=[s,n].map((e=>+e)),r=2===n.length?o%100:o;return n.length<2||3===n.length?t.ignoreIncomplete?null:mi("incomplete"):mi(function(e,t,i){const s=new Date(Date.now()),n=e<100?s.getFullYear()%100:s.getFullYear(),a=s.getMonth()+1;return isNaN(e)||isNaN(t)?(null==i?void 0:i.ignoreIncomplete)?null:"incomplete":e-n<0?"invalid_expiry_year_past":e-n>50?"invalid_expiry_year":!(e-n)&&t{const t=wi.get(e.source);t&&t(JSON.parse(e.data))}));class Si extends l.Z{constructor({url:e,sandbox:t}){super(!1),this.onTelegramWebViewEvent=({eventType:e,eventData:t})=>{""===t&&(t=void 0),console.log("onTelegramWebViewEvent",e,t),this.dispatchEvent(e,t)};const i=this.iframe=document.createElement("iframe");i.src=e,t&&i.setAttribute("sandbox",t)}onMount(){wi.set(this.iframe.contentWindow,this.onTelegramWebViewEvent)}destroy(){this.cleanup(),wi.delete(this.iframe.contentWindow)}}function Ci(e){const t=new Si(Object.assign(Object.assign({},e),{sandbox:"allow-forms allow-scripts allow-same-origin allow-modals"})),{iframe:i}=t;return i.allow="payment",i.classList.add("payment-verification"),t}class Li extends S.Z{constructor(e,t){super("popup-payment popup-payment-verification",{closable:!0,overlayClosable:!0,body:!0,title:"Checkout.WebConfirmation.Title"}),this.url=e,this.openPathAfter=t,this.d()}d(){const e=this.telegramWebView=Ci({url:this.url});e.addEventListener("web_app_open_tg_link",(e=>{this.dispatchEvent("finish"),this.hide(),this.openPathAfter&&td.openUrl("https://t.me"+e.path_full)})),this.body.append(e.iframe),this.show(),e.onMount()}destroy(){return this.telegramWebView.destroy(),super.destroy()}}var Ei=i(6830),Ii=i(5029);class Mi extends E.ZP{constructor(e){super(e),this.options=e,this.onKeyDown=e=>{var t,i;this.lastKeyDown=e.key,null===(i=(t=this.options).onKeyDown)||void 0===i||i.call(t,e)},this.onInput=()=>{var e,t;const i=this.value,s="Backspace"===this.lastKeyDown&&(this.lastTransformed&&this.lastTransformed.value.length||0)-i.length==1,n=this.lastTransformed=function(e){const{value:t,getPattern:i,deleting:s,input:n}=e,a=!s&&!!t.length,o=function(e,t,i={},s){const n=e(t);if(!n)return{value:t,selection:null,autocorrectComplete:!!t};const a=n.length,o=[],r=[];let d=0,l=0,c=0===i.selectionStart?0:null,h=0===i.selectionEnd?0:null;const u=e=>{e>0&&(null===c&&l+1>=i.selectionStart&&(c=pi(o)+(s?r.length:0)),null===h&&l+1>=i.selectionEnd&&(h=pi(o)+(s?r.length:0)),l+=e)};for(;d=t.length)break;r.push(a),++d,u(c)}}return s&&o.push(...r),{value:o.join(""),selection:{selectionStart:null===c||t.length&&i.selectionStart===t.length?pi(o):c,selectionEnd:null===h||t.length&&i.selectionEnd===t.length?pi(o):h},autocorrectComplete:d===a}}(i,t,{selectionStart:n?n.selectionStart:0,selectionEnd:n?n.selectionEnd:0},a),{value:r,selection:d}=o;return{value:r,meta:{autocorrectComplete:o.autocorrectComplete,empty:!r},selection:d}}({value:i,getPattern:this.options.formatMethod,deleting:s,input:this.input}),a=n.value;a!==i&&(this.setValueSilently(a),n.selection&&(this.input.selectionStart=n.selection.selectionStart,this.input.selectionEnd=n.selection.selectionEnd)),this.validateNew(a,{ignoreIncomplete:!0}),null===(t=(e=this.options).onChange)||void 0===t||t.call(e,n)},this.onBlur=()=>{var e;const t=null===(e=this.lastTransformed)||void 0===e?void 0:e.value;t&&this.validateNew(t)},this.validate=()=>this.validateNew(),this.input.addEventListener("keydown",this.onKeyDown),this.input.addEventListener("input",this.onInput),this.input.addEventListener("blur",this.onBlur)}update(){this.onInput()}validateNew(e,t,i){var s,n,a,o,r;let d;if(void 0===e&&(e=null!==(n=null===(s=this.lastTransformed)||void 0===s?void 0:s.value)&&void 0!==n?n:""),void 0===t&&(t={}),d=this.options.validateMethod?null===(o=(a=this.options).validateMethod)||void 0===o?void 0:o.call(a,e,t):function(e,t,i={}){return e.meta.autocorrectComplete||i.ignoreIncomplete?null:mi("incomplete")}(this.lastTransformed,0,t),null==d?void 0:d.code){const e=null===(r=this.options.errorKeys)||void 0===r?void 0:r[d.code];return!i&&this.setState(E.I1.Error,e),!1}return!i&&this.setState(E.I1.Neutral),!0}}function Pi(e,t){const i=()=>{const i=e.every((e=>"validateNew"in e?e.validateNew(void 0,void 0,!0):e.isValid()));t(i)};return e.forEach((e=>{if(e instanceof Mi){const t=e.options.onChange;e.options.onChange=(...e)=>{null==t||t(...e),i()},"update"in e&&e.update()}else e.input.addEventListener("input",i)})),{validate:i}}function Zi(e,t){let i,s;return(e||t)&&(e&&(i=new yi.Z({noPhoneCodes:!0,onCountryChange:()=>{null==s||s.update()},required:!0,autocomplete:"country"})),t&&(s=new Mi({label:"PaymentShippingZipPlaceholder",plainText:!0,inputMode:"numeric",autocomplete:"postal-code",formatMethod:()=>{const{country:e}=i.getSelected(),t=null==e?void 0:e.iso2;return ui.postalCodeFromCountry(t&&t.toUpperCase())}}))),{countryInputField:i,postcodeInputField:s}}const Ti=new Set(["stripe","smartglocal"]);class ki extends S.Z{constructor(e,t){if(super("popup-payment popup-payment-card",{closable:!0,overlayClosable:!0,body:!0,scrollable:Ti.has(e.native_provider),title:"PaymentCardInfo"}),this.paymentForm=e,this.savedCard=t,Ti.has(e.native_provider))this.d();else{const t=this.telegramWebView=Ci({url:e.url});t.addEventListener("payment_form_submit",(t=>{const i={title:t.title,save:!1};this.dispatchEvent("finish",{token:t.credentials,card:i}),this.hide(),e.pFlags.can_save_credentials&&(0,bi.Z)({titleLangKey:"PaymentCardSavePaymentInformation",descriptionLangKey:"PaymentCardSavePaymentInformationInfoLine1",button:{langKey:"Save"}}).then((()=>{i.save=!0}),Ye.Z)})),this.body.append(t.iframe),this.show(),t.onMount()}}destroy(){var e;return null===(e=this.telegramWebView)||void 0===e||e.destroy(),super.destroy()}d(){const e=this.savedCard,t=new Ii.Z({name:"PaymentInfo.Card.Title",noDelimiter:!0,noShadow:!0}),i=JSON.parse(this.paymentForm.native_params.data);let s,n,a=0;const o=new Mi({label:"PaymentCardNumber",plainText:!0,inputMode:"numeric",autocomplete:"cc-number",formatMethod:ui.cardNumber,validateMethod:gi,errorKeys:{invalid:"PaymentCard.Error.Invalid",incomplete:"PaymentCard.Error.Incomplete"},onChange:e=>{(e=>{if(s===e)return;const t=++a;s=e;const i=Oi(e);if(!i)return void(n&&(n.remove(),n=void 0));const r=new Image;r.classList.add("input-field-icon"),(0,Ut.cj)(r,i,!1).then((()=>{a===t&&(n?n.replaceWith(r):o.container.append(r),n=r)}))})(Nt(e.value)),l.update()}});let r;i.need_cardholder_name&&(r=new E.ZP({label:"Checkout.NewCard.CardholderNamePlaceholder",maxLength:255,required:!0,autocomplete:"cc-name"}));const d=new Mi({label:"SecureId.Identity.Placeholder.ExpiryDate",plainText:!0,inputMode:"numeric",autocomplete:"cc-exp",formatMethod:ui.cardExpiry,validateMethod:vi});d.input.addEventListener("input",(()=>{let e=d.value;if(e.length<5)return;const t=e.split("/");4===t[1].length&&(e=[t[0],t[1].slice(2)].join("/"),d.setValueSilently(e))}),{capture:!0});const l=new Mi({labelText:"CVC",plainText:!0,inputMode:"numeric",autocomplete:"cc-csc",name:"cvc",formatMethod:()=>ui.cardCvc(o.value)}),c=(new Ei.T(l.container,l.input),[o,d,l,r].filter(Boolean));c.forEach((e=>{const t=t=>{if(!e.value&&"Backspace"===t.key){const t=c[c.indexOf(e)-1];t&&(0,Ot.Z)(t.input,!0)}};if(e instanceof Mi){e.options.onKeyDown=t;const i=e.options.onChange;e.options.onChange=t=>{if(null==i||i(t),document.activeElement===e.input&&t.meta.autocorrectComplete)for(let t=c.indexOf(e),i=c.length;te.container))));const g=!!this.paymentForm.pFlags.can_save_credentials,v=new jt.Z({text:"PaymentCardSavePaymentInformation",checked:!!g}),b=new Vt.ZP({checkboxField:v,subtitleLangKey:g?"PaymentCardSavePaymentInformationInfoLine1":"Checkout.2FA.Text"});g||b.container.classList.add("is-disabled"),(p||t).content.append(b.container),this.scrollable.append(...[t,p].filter(Boolean).map((e=>e.container)));const y=Ui({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,n=function*(){const e={cardNumber:o.value,expiryFull:d.value,expiryMonth:d.value.split("/")[0],expiryYear:d.value.split("/")[1],cvc:l.value,cardholderName:null==r?void 0:r.value,country:null==f?void 0:f.value,zip:null==m?void 0:m.value,save:null==v?void 0:v.checked},t=this.paymentForm.native_provider;let s;if("stripe"===t){const t=new URL("https://api.stripe.com/v1/tokens");t.search=new URLSearchParams({"card[number]":e.cardNumber,"card[exp_month]":e.expiryMonth,"card[exp_year]":e.expiryYear,"card[cvc]":e.cvc,"card[address_zip]":e.zip,"card[address_country]":e.country,"card[name]":e.cardholderName}).toString();const n=yield fetch(t.toString(),{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:`Bearer ${i.publishable_key}`}});s=yield n.json()}else if("smartglocal"===t){const t={card:{number:e.cardNumber.replace(/[^\d]+/g,""),expiration_month:e.expiryMonth,expiration_year:e.expiryYear,security_code:e.cvc.replace(/[^\d]+/g,"")}},n="https://tgb.smart-glocal.com/cds/v1/tokenize/card",a=yield fetch(n,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","X-PUBLIC-TOKEN":i.public_token},body:JSON.stringify(t)});s={type:"card",token:(yield a.json()).data.token}}this.dispatchEvent("finish",{token:s,card:e}),this.hide()},new((s=void 0)||(s=Promise))((function(i,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}d((n=n.apply(e,t||[])).next())}));var e,t,s,n}});Pi([o,r,d,l,f,m].filter(Boolean),(e=>{y.disabled=!e})),e&&(o.value=e.cardNumber,d.value=e.expiryFull,l.value=e.cvc,r&&(r.value=e.cardholderName),f&&(f.value=e.country),m&&(m.value=e.zip)),this.body.append(this.btnConfirmOnEnter=y),this.show(),o.validateNew(void 0,void 0,!0)||(0,Ot.Z)(o.input)}}class xi extends S.Z{constructor(e,t){super("popup-payment popup-payment-card-confirmation",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"Checkout.PasswordEntry.Title"});const i=new Ii.Z({noDelimiter:!0,noShadow:!0,caption:"Checkout.PasswordEntry.Text",captionArgs:[e]}),s=new Ei.Z({labelText:t.hint});i.content.append(s.container),this.scrollable.append(i.container);const n=()=>{a.disabled=!s.value,s.setState(E.I1.Neutral)};s.input.addEventListener("input",n);const a=Ui({key:"Checkout.PasswordEntry.Pay",onClick:()=>{return e=this,i=void 0,a=function*(){try{const e=yield this.managers.passwordManager.getInputCheckPassword(s.value,t),i=yield this.managers.apiManager.invokeApi("account.getTmpPassword",{password:e,period:60});this.dispatchEvent("finish",i),this.hide()}catch(e){throw"PASSWORD_HASH_INVALID"===e.type&&(e.handled=!0,s.setError("PASSWORD_HASH_INVALID")),e}},new((n=void 0)||(n=Promise))((function(t,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(e){var i;e.done?t(e.value):(i=e.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(e,i||[])).next())}));var e,i,n,a}});this.body.append(this.btnConfirmOnEnter=a),n(),this.show(),(0,Ot.Z)(s.input)}}var Ai=i(1171),_i=i(709);class Fi extends S.Z{constructor(e,t,i){super("popup-payment popup-payment-shipping",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"PaymentShippingInfo"}),this.paymentForm=e,this.inputInvoice=t,this.focus=i,this.d()}d(){const e=this.paymentForm.invoice,t=this.paymentForm.saved_info;let i,s,n,a,o,r,d,l,c,h,u;if(e.pFlags.shipping_address_requested){i=new Ii.Z({name:"PaymentShippingAddress",noDelimiter:!0,noShadow:!0}),s=new E.ZP({label:"PaymentShippingAddress1Placeholder",maxLength:64,required:!0}),n=new E.ZP({label:"PaymentShippingAddress2Placeholder",maxLength:64}),a=new E.ZP({label:"PaymentShippingCityPlaceholder",maxLength:64,required:!0}),o=new E.ZP({label:"PaymentShippingStatePlaceholder",maxLength:64});const e=Zi(!0,!0);r=e.countryInputField,d=e.postcodeInputField,i.content.append(...[s,n,a,o,r,d].filter(Boolean).map((e=>e.container)))}if([e.pFlags.name_requested,e.pFlags.email_requested,e.pFlags.phone_requested].includes(!0)){l=new Ii.Z({name:"PaymentShippingReceiver",noDelimiter:!0,noShadow:!0});const t=()=>{const e=h.value,t=(0,Ai.Z)(e);return!(!t||t[0].length!==e.length)},i=()=>!!u.value.match(/\d/);e.pFlags.name_requested&&(c=new E.ZP({label:"PaymentShippingName",maxLength:256,required:!0})),e.pFlags.email_requested&&(h=new E.ZP({label:"PaymentShippingEmailPlaceholder",maxLength:64,required:!0,validate:t})),e.pFlags.phone_requested&&(u=new _i.Z({required:!0,validate:i})),l.content.append(...[c,h,u].filter(Boolean).map((e=>e.container)))}const p=new jt.Z({text:"PaymentShippingSave",checked:!0}),f=new Vt.ZP({checkboxField:p,subtitleLangKey:"PaymentShippingSaveInfo"});(l||i).content.append(f.container),this.scrollable.append(...[i,l].filter(Boolean).map((e=>e.container)));const m=Ui({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,l=function*(){const e=r&&r.getSelected().country,t={_:"paymentRequestedInfo",shipping_address:e&&{_:"postAddress",street_line1:s.value,street_line2:n.value,city:a.value,state:o.value,country_iso2:null==e?void 0:e.iso2,post_code:d.value},name:null==c?void 0:c.value,email:null==h?void 0:h.value,phone:null==u?void 0:u.value};try{const e=yield this.managers.appPaymentsManager.validateRequestedInfo(this.inputInvoice,t,null==p?void 0:p.checked);this.dispatchEvent("finish",{shippingAddress:t,requestedInfo:e}),this.hide()}catch(e){const t={ADDRESS_STREET_LINE1_INVALID:s,ADDRESS_STREET_LINE2_INVALID:n,ADDRESS_COUNTRY_INVALID:r,ADDRESS_CITY_INVALID:a,ADDRESS_STATE_INVALID:o,ADDRESS_POSTCODE_INVALID:d,REQ_INFO_NAME_INVALID:c,REQ_INFO_EMAIL_INVALID:h,REQ_INFO_PHONE_INVALID:u}[e.type];throw t&&(t.setError(),e.handled=!0),e}},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,o)}r((l=l.apply(e,t||[])).next())}));var e,t,i,l}});if(this.body.append(this.btnConfirmOnEnter=m),t){const e=t.shipping_address;e&&(s.value=e.street_line1,n.value=e.street_line2,a.value=e.city,o.value=e.state,r.selectCountryByIso2(e.country_iso2),d.value=e.post_code),t.name&&c&&(c.value=t.name),t.email&&h&&(h.value=t.email),t.phone&&u&&(u.value=t.phone)}const{validate:g}=Pi([s,n,a,o,r,d,c,h,u].filter(Boolean),(e=>{m.disabled=!e}));let v;g(),this.show(),v=this.focus?{name:c,email:h,phone:u}[this.focus]:s,v&&(0,Ot.Z)(v.input)}}var Di=i(1218);class Ri extends S.Z{constructor(e,t,i){super("popup-payment popup-payment-shipping-methods",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"PaymentShippingMethod"}),this.paymentForm=e,this.requestedInfo=t,this.shippingOption=i,this.d()}d(){const e=new Ii.Z({name:"PaymentCheckoutShippingMethod",noDelimiter:!0,noShadow:!0}),t=this.requestedInfo.shipping_options.map((e=>new Vt.ZP({radioField:new Di.Z({text:e.title,name:"shipping-method",value:e.id}),subtitle:(0,Zt.Z)(xt(e.prices.map((({amount:e})=>+e)),0),this.paymentForm.invoice.currency)})));let i;const s=(0,Vt.De)(t,(e=>{i=e}));this.shippingOption?t.find((e=>e.radioField.input.value===this.shippingOption.id)).radioField.checked=!0:t[0].radioField.checked=!0,e.content.append(s),this.scrollable.append(e.container);const n=Ui({key:"PaymentInfo.Done",onClick:()=>{this.dispatchEvent("finish",this.requestedInfo.shipping_options.find((e=>e.id===i))),this.hide()}});this.body.append(this.btnConfirmOnEnter=n),this.show()}}var Bi=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Ni=["amex","card","diners","discover","jcb","mastercard","visa","unionpay","mir","logo"];function Oi(e){if(Ni.includes(e))return`assets/img/${e}.svg`}function Ui(e){var t,i;const s=null!==(t=e.textEl)&&void 0!==t?t:new L.ZP.IntlElement({key:null!==(i=e.key)&&void 0!==i?i:"PaymentInfo.Done"}),n=s.key,a=(0,He.Z)("btn-primary btn-color-primary payment-item-pay");return a.append(s.element),(0,C.fc)(a,(()=>Bi(this,void 0,void 0,(function*(){const t=e.onClick();if(!(t instanceof Promise))return;const i=(0,Gt.y)(a),o=(0,Ht.Z)([a],!0);s.compareAndUpdate({key:"PleaseWait"});try{yield t}catch(e){e.handled||console.error("payment button error",e),o(),s.compareAndUpdate({key:n}),i.remove()}})))),a}class Hi extends S.Z{constructor(e,t,i,s){super("popup-payment",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.message=e,this.inputInvoice=t,this.paymentForm=i,this.isReceipt=s,this.tipButtonsMap=new Map,this.d().catch((e=>{console.error("payment popup error",e),this.hide()}))}d(){var e,t,i;return Bi(this,void 0,void 0,(function*(){this.element.classList.add("is-loading"),this.show();let s=!1;const n=()=>{s||(s=!0,Te&&Te.hide(),this.hide())};let{paymentForm:a,message:o}=this;o&&this.listenerSetter.add(d.Z)("payment_sent",(({peerId:e,mid:t})=>{o.peerId===e&&o.mid===t&&n()}));const r=null==o?void 0:o.media,l=null!==(e=this.isReceipt)&&void 0!==e?e:r?!!r.receipt_msg_id||"messageExtendedMedia"===(null===(t=r.extended_media)||void 0===t?void 0:t._):"payments.paymentReceipt"===a._,c=r?r.pFlags.test:a.invoice.pFlags.test,h=r?r.photo:a.photo,u=r?r.title:a.title,p=r?r.description:a.description;(0,L.$d)(this.title,l?"PaymentReceipt":"PaymentCheckout"),c&&this.title.append(" (Test)");const m="payment-item",g=document.createElement("div");g.classList.add(m);const v=m+"-details",b=document.createElement("div");let y;b.classList.add(v),h&&(y=document.createElement("div"),y.classList.add(v+"-photo","media-container-contain"),(0,K.Z)({photo:h,container:y,boxWidth:100,boxHeight:100,size:{_:"photoSizeEmpty",type:""}}),b.append(y));const w=v+"-lines",S=document.createElement("div");S.classList.add(w);const E=document.createElement("div");E.classList.add(w+"-title");const I=document.createElement("div");I.classList.add(w+"-description");const M=document.createElement("div");M.classList.add(w+"-bot-name"),S.append(E,I,M),(0,F.Z)(E,(0,B.Z)(u)),(0,F.Z)(I,(0,B.Z)(p));const P=new N.Z;M.append(P.element),b.append(S),g.append(b),this.scrollable.append(g);const Z=document.createElement("div");Z.classList.add(m+"-preloader-container"),(0,Gt.y)(Z,!0),this.scrollable.container.append(Z);const T=this.inputInvoice;a||(a=l?yield this.managers.appPaymentsManager.getPaymentReceipt(o.peerId,r.receipt_msg_id||T.msg_id):yield this.managers.appPaymentsManager.getPaymentForm(T),this.paymentForm=a);let k=a.saved_info||a.info;const x=null===(i=a.saved_credentials)||void 0===i?void 0:i[0];let[A,_,D]=yield Promise.all([!l&&k&&this.managers.appPaymentsManager.validateRequestedInfo(T,k),x&&this.managers.passwordManager.getState(),(0,Kt.Z)({peerId:a.provider_id.toPeerId()})]);yield P.update({peerId:a.bot_id.toPeerId()}),Z.remove(),this.element.classList.remove("is-loading");const R=(e,t)=>(0,Zt.Z)(e,U,t),{invoice:O}=a,U=O.currency,z=O.pFlags.recurring&&!l;yield P.update({peerId:a.bot_id.toPeerId()});const j=z?yield(0,Kt.Z)({peerId:a.bot_id.toPeerId()}):void 0;Z.remove(),this.element.classList.remove("is-loading");const G=()=>{const e=document.createElement("div");e.classList.add(V+"-price");const t=document.createElement("span"),i=document.createElement("span");return e.append(t,i),{label:e,left:t,right:i}},V=m+"-prices",W=document.createElement("div");W.classList.add(V);const $=e=>e.map((e=>{const{amount:t,label:i}=e,s=G();s.left.textContent=i;const n=R(t);return s.right.textContent=n,s.label})),q=$(O.prices);let Q=()=>0,Y=0;const X=()=>{const e=R(te+Q()+Y);ee.right.textContent=e,J.compareAndUpdate({key:"PaymentCheckoutPay",args:[e]})},J=new L.ZP.IntlElement,ee=G();ee.label.classList.add("is-total"),(0,L.$d)(ee.left,"PaymentTransactionTotal");const te=xt(O.prices.map((({amount:e})=>+e)),0),ie=void 0!==O.max_tip_amount&&!l||!!a.tip_amount;if(ie){const e=m+"-tips",t=Tt.Z[U];Q=()=>+i().replace(/\D/g,"");const i=()=>r.value,s=()=>{const e=(0,At.Z)(i(),`500 ${kt.Bf} ${kt.bt}`);r.style.width=e+"px"},n=e=>{e=Math.min(+e,+O.max_tip_amount);const t=R(e,!0);r.value=t,document.activeElement===r&&(0,Ot.Z)(r),g&&g();const i=this.tipButtonsMap.get(e);i&&i.classList.add("active"),s(),X()},o=G();(0,L.$d)(o.left,l?"PaymentTip":"PaymentTipOptional");const r=document.createElement("input");r.type="tel",r.classList.add("input-clear",e+"-input"),o.right.append(r),l?o.label.classList.add("disable-hover"):o.label.style.cursor="text",o.label.addEventListener("mousedown",(e=>{(0,Ne.Z)(e.target,r)||(0,Ot.Z)(r)}));const d=r instanceof HTMLInputElement?1:2,c=()=>{p?--p:(p=d,(0,Ot.Z)(r))},h=()=>{setTimeout((()=>{p=d,(0,Ot.Z)(r),document.addEventListener("selectionchange",c)}),0)},u=()=>{r.addEventListener("focus",h,{once:!0}),document.removeEventListener("selectionchange",c)};let p;r.addEventListener("focusout",u),u(),r.addEventListener("input",(()=>{n(Q())}));const f=[t.symbol,t.space_between?" ":""];let g;if(t.symbol_left||f.reverse(),o.right[t.symbol_left?"prepend":"append"](f.join("")),q.push(o.label),l)n(a.tip_amount);else{const t=document.createElement("div");t.classList.add(e);const i=e+"-tip",s=O.suggested_tip_amounts.map((e=>{const t=(0,He.Z)(i,{noRipple:!0});return t.textContent=R(e),this.tipButtonsMap.set(+e,t),t}));g=()=>{const e=t.querySelector(".active");e&&e.classList.remove("active")},(0,C.fc)(t,(e=>{const t=(0,be.Z)(e.target,i);if(!t)return;let s=0;if(t.classList.contains("active"))t.classList.remove("active");else{g(),t.classList.add("active");for(const[e,i]of this.tipButtonsMap)if(i===t){s=e;break}}n(s)})),n(0),t.append(...s),q.push(t)}}else X();q.push(ee.label),W.append(...q),g.append(W);const se=(e,t)=>Bi(this,void 0,void 0,(function*(){const i=document.createElement("img");i.classList.add("media-photo"),yield(0,Ut.cj)(i,Oi(t));let s=e.media;s?(0,H.Z)(s,i):(s=e.createMedia("small"),s.classList.add("media-container-cover"),s.append(i)),e.container.classList.remove("row-with-icon")})),ne=e=>{e.titleLangKey&&(e.subtitleLangKey=e.titleLangKey),e.noWrap=!0;const t=new Vt.ZP(e);return t.container.classList.add(m+"-row"),e.titleLangKey&&t.subtitle.classList.add("hide"),t},ae=(e,t)=>{if(e.title.textContent=t,!t){const t=L.ZP.weakMap.get(e.subtitle.firstElementChild);e.title.append((0,L.ag)(t.key))}e.subtitle.classList.toggle("hide",!t)},oe=e=>{let t,i,s;"title"in e?(t=e.title.split(" ").shift(),i=e.title,s=e.icon):(t=Nt(e.cardNumber),i=t+" *"+e.cardNumber.split(" ").pop()),ce.title.classList.remove("tgico","tgico-card_outline"),se(ce,s||t.toLowerCase()),ae(ce,i)},re=()=>{new ki(a,de).addEventListener("finish",(({token:e,card:t})=>{le=e,de=t,oe(t)}))};let de,le;const ce=ne({titleLangKey:"PaymentCheckoutMethod",clickable:l?void 0:re,icon:"card_outline"});ce.container.classList.add(m+"-method-row"),x?oe(x):a.credentials_title&&oe({title:a.credentials_title});const he=ne({title:D,subtitleLangKey:"PaymentCheckoutProvider"}),ue=new f.Z;let pe,fe,me,ge,ve,ye,Se,Ce;ue.classList.add("avatar-32"),he.createMedia("small").append(ue),ue.updateWithOptions({peerId:a.provider_id.toPeerId()});const Le=O.pFlags.shipping_address_requested?e=>{if(!e)return ve.subtitle.classList.add("hide"),void(0,H.Z)(ve.title,(0,L.ag)("PaymentShippingAddress"));const t=e.shipping_address;ae(pe,[t.city,t.street_line1,t.street_line2].filter(Boolean).join(", ")),ve.container.classList.toggle("hide",!A&&!l)}:void 0,Ee=e=>{Le&&Le(e),fe&&ae(fe,e.name),me&&ae(me,e.email),ge&&ae(ge,e.phone&&"+"+(0,_e.u)(e.phone).formatted)};if(l||(Se=e=>{new Fi(a,T,e).addEventListener("finish",(({shippingAddress:e,requestedInfo:t})=>{A=t,k=a.saved_info=e,Ee(e)}))}),O.pFlags.shipping_address_requested){const e=e=>{const i=new ot(this.scrollable,void 0,!0);if(i.save(),t&&t.forEach((e=>e.remove())),!e)return Y=0,X(),i.restore(),void this.onContentUpdate();ye=e,ae(ve,e.title),Y=xt(e.prices.map((({amount:e})=>+e)),0),t=$(e.prices);let s=ee.label;ie&&(s=s.previousElementSibling,l||(s=s.previousElementSibling)),t.forEach((e=>s.parentElement.insertBefore(e,s))),X(),i.restore(),this.onContentUpdate()};let t;pe=ne({icon:"location",titleLangKey:"PaymentShippingAddress",clickable:!l&&Se.bind(null,void 0)}),ve=ne({icon:"shipping",titleLangKey:"PaymentCheckoutShippingMethod",clickable:!l&&(Ce=()=>{new Ri(a,A,ye).addEventListener("finish",(t=>{e(t)}))})}),ve.container.classList.add("hide");const i=a.shipping;i&&e(i)}O.pFlags.name_requested&&(fe=ne({icon:"newprivate",titleLangKey:"PaymentCheckoutName",clickable:!l&&Se.bind(null,"name")})),O.pFlags.email_requested&&(me=ne({icon:"mention",titleLangKey:"PaymentShippingEmailPlaceholder",clickable:!l&&Se.bind(null,"email")})),O.pFlags.phone_requested&&(ge=ne({icon:"phone",titleLangKey:"PaymentCheckoutPhoneNumber",clickable:!l&&Se.bind(null,"phone")})),k&&Ee(k);const Ie=[ce,he,pe,ve,fe,me,ge].filter(Boolean),Me=z&&new jt.Z({text:"Payments.Recurrent.Accept",textArgs:[(0,mt.ZP)(O.recurring_terms_url),j]}),Pe=z&&ne({checkboxField:Me}),Ze=z?[document.createElement("hr"),Pe.container]:[];let Te,ke;this.scrollable.append(...[document.createElement("hr"),...Ie.map((e=>e.container)),...Ze].filter(Boolean));const xe=()=>{Ae.disabled=!(!Me||Me.checked)};let Ae;Ae=Ui(l?{onClick:()=>this.hide(),key:"Done"}:{onClick:()=>{const e=O.pFlags.name_requested&&!(null==k?void 0:k.name)?"name":O.pFlags.email_requested&&!(null==k?void 0:k.email)?"email":O.pFlags.phone_requested&&!(null==k?void 0:k.phone)?"phone":void 0;if(O.pFlags.shipping_address_requested){if(!A)return void Se();if(!ye)return void Ce()}else if(e)return void Se(e);return de||ke?Promise.resolve().then((()=>Bi(this,void 0,void 0,(function*(){const e=ke?{_:"inputPaymentCredentialsSaved",id:x.id,tmp_password:ke.tmp_password}:{_:"inputPaymentCredentials",data:{_:"dataJSON",data:JSON.stringify(le.token?le:{type:le.type,id:le.id})},pFlags:{save:de.save||void 0}};try{const t=yield this.managers.appPaymentsManager.sendPaymentForm(T,a.form_id,null==A?void 0:A.id,null==ye?void 0:ye.id,e,Q());"payments.paymentResult"===t._?n():(Te=new Li(t.url,!r.extended_media),Te.addEventListener("finish",(()=>{Te=void 0,n()})),yield new Promise(((e,t)=>{Te.addEventListener("close",(()=>{if(Te=void 0,s)e();else{const e=new Error("payment not finished");e.handled=!0,t(e)}}))})))}catch(e){throw"BOT_PRECHECKOUT_TIMEOUT"===e.type?((0,we.bC)({langPackKey:"Error.AnError"}),e.handled=!0):"TMP_PASSWORD_INVALID"===e.type&&(_=ke=void 0,(0,C.tH)(Ae),e.handled=!0),e}})))):x?void Promise.resolve(null!=_?_:this.managers.passwordManager.getState()).then((e=>{new xi(x.title,e).addEventListener("finish",(e=>{_=void 0,ke=e,(0,C.tH)(Ae);const t=e.valid_until-(0,zt.Z)(!0)-5;setTimeout((()=>{ke===e&&(ke=void 0)}),1e3*t)}))})):void re()},textEl:J}),xe(),Me&&Me.input.addEventListener("change",xe),this.body.append(this.btnConfirmOnEnter=Ae),this.onContentUpdate()}))}}var zi=i(8487),ji=i(13),Gi=i(9259),Vi=i(3228);class Ki{constructor(e,t,i,s,n=t){this.sizes=e,this.maxWidth=t,this.minWidth=i,this.spacing=s,this.maxHeight=n,this.count=e.length,this.ratios=Ki.countRatios(e),this.proportions=Ki.countProportions(this.ratios),this.averageRatio=xt(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find((e=>e>2))?new Wi(this.ratios,this.averageRatio,this.maxWidth,this.minWidth,this.spacing).layout():2===this.count?this.layoutTwo():3===this.count?this.layoutThree():this.layoutFour():[]}layoutTwo(){return"ww"===this.proportions&&this.averageRatio>1.4*this.maxSizeRatio&&this.ratios[1]-this.ratios[0]<.2?this.layoutTwoTopBottom():"ww"===this.proportions||"qq"===this.proportions?this.layoutTwoLeftRightEqual():this.layoutTwoLeftRight()}layoutThree(){return"n"===this.proportions[0]?this.layoutThreeLeftAndOther():this.layoutThreeTopAndOther()}layoutFour(){return"w"===this.proportions[0]?this.layoutFourTopAndOther():this.layoutFourLeftAndOther()}layoutTwoTopBottom(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],(this.maxHeight-this.spacing)/2)));return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:14}]}layoutTwoLeftRightEqual(){const e=(this.maxWidth-this.spacing)/2,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],1*this.maxHeight)));return[{geometry:{x:0,y:0,width:e,height:t},sides:13},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:7}]}layoutTwoLeftRight(){const e=Math.round(1.5*this.minWidth),t=Math.min(Math.round(Math.max(.4*(this.maxWidth-this.spacing),(this.maxWidth-this.spacing)/this.ratios[0]/(1/this.ratios[0]+1/this.ratios[1]))),this.maxWidth-this.spacing-e),i=this.maxWidth-t-this.spacing,s=Math.min(this.maxHeight,Math.round(Math.min(i/this.ratios[0],t/this.ratios[1])));return[{geometry:{x:0,y:0,width:i,height:s},sides:13},{geometry:{x:i+this.spacing,y:0,width:t,height:s},sides:7}]}layoutThreeLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min((this.maxHeight-this.spacing)/2,this.ratios[1]*(this.maxWidth-this.spacing)/(this.ratios[2]+this.ratios[1]))),i=e-t-this.spacing,s=Math.max(this.minWidth,Math.round(Math.min((this.maxWidth-this.spacing)/2,Math.min(t*this.ratios[2],i*this.ratios[1])))),n=Math.min(Math.round(e*this.ratios[0]),this.maxWidth-this.spacing-s);return[{geometry:{x:0,y:0,width:n,height:e},sides:13},{geometry:{x:n+this.spacing,y:0,width:s,height:i},sides:3},{geometry:{x:n+this.spacing,y:i+this.spacing,width:s,height:t},sides:6}]}layoutThreeTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=(this.maxWidth-this.spacing)/2,s=Math.min(this.maxHeight-t-this.spacing,Math.round(Math.min(i/this.ratios[1],i/this.ratios[2]))),n=e-i-this.spacing;return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:i,height:s},sides:12},{geometry:{x:i+this.spacing,y:t+this.spacing,width:n,height:s},sides:6}]}layoutFourTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=Math.round((this.maxWidth-2*this.spacing)/(this.ratios[1]+this.ratios[2]+this.ratios[3])),s=Math.max(this.minWidth,Math.round(Math.min(.4*(this.maxWidth-2*this.spacing),i*this.ratios[1]))),n=Math.round(Math.max(Math.max(1*this.minWidth,.33*(this.maxWidth-2*this.spacing)),i*this.ratios[3])),a=e-s-n-2*this.spacing,o=Math.min(this.maxHeight-t-this.spacing,i);return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:s,height:o},sides:12},{geometry:{x:s+this.spacing,y:t+this.spacing,width:a,height:o},sides:4},{geometry:{x:s+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:6}]}layoutFourLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min(e*this.ratios[0],.6*(this.maxWidth-this.spacing))),i=Math.round((this.maxHeight-2*this.spacing)/(1/this.ratios[1]+1/this.ratios[2]+1/this.ratios[3])),s=Math.round(i/this.ratios[1]),n=Math.round(i/this.ratios[2]),a=e-s-n-2*this.spacing,o=Math.max(this.minWidth,Math.min(this.maxWidth-t-this.spacing,i));return[{geometry:{x:0,y:0,width:t,height:e},sides:13},{geometry:{x:t+this.spacing,y:0,width:o,height:s},sides:3},{geometry:{x:t+this.spacing,y:s+this.spacing,width:o,height:n},sides:2},{geometry:{x:t+this.spacing,y:s+n+2*this.spacing,width:o,height:a},sides:6}]}static countRatios(e){return e.map((e=>e.w/e.h))}static countProportions(e){return e.map((e=>e>1.2?"w":e<.8?"n":"q")).join("")}}class Wi{constructor(e,t,i,s,n,a=4*i/3){this.averageRatio=t,this.maxWidth=i,this.minWidth=s,this.spacing=n,this.maxHeight=a,this.ratios=Wi.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map((e=>t>1.1?(0,Vi.Z)(e,1,2.75):(0,Vi.Z)(e,.6667,1)))}layout(){const e=new Array(this.count),t=[],i=(e,t)=>{const i=xt(this.ratios.slice(e,e+t),0);return(this.maxWidth-(t-1)*this.spacing)/i},s=e=>{const s=[];let n=0;for(const t of e)s.push(i(n,t)),n+=t;t.push({lineCounts:e,heights:s})};for(let e=1;e!==this.count;++e){const t=this.count-e;e>3||t>3||s([e,t])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t){const i=this.count-e-t;e>3||t>(this.averageRatio<.85?4:3)||i>3||s([e,t,i])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t)for(let i=1;i!==this.count-e-t;++i){const n=this.count-e-t-i;e>3||t>3||i>3||n>3||s([e,t,i,n])}let n=null,a=0;for(const e of t){const{heights:t,lineCounts:i}=e,s=i.length,o=xt(t,0)+this.spacing*(s-1),r=Math.min(...t),d=(Math.max(...t),r{for(let e=1;e!==s;++e)if(i[e-1]>i[e])return 1.5;return 1})(),c=Math.abs(o-this.maxHeight)*d*l;(!n||c2&e.sides)),s=i.geometry.width+i.geometry.x,n=t.find((e=>4&e.sides)),a=n.geometry.height+n.geometry.y,o=e.container;o.style.width=s+"px",o.style.height=a+"px";const r=o.children;t.forEach((({geometry:t,sides:i},n)=>{let d;if(d=r[n],d||(d=document.createElement("div"),o.append(d)),d.classList.add("album-item","grouped-item"),d.style.width=t.width/s*100+"%",d.style.height=t.height/a*100+"%",d.style.top=t.y/a*100+"%",d.style.left=t.x/s*100+"%",8&i&&1&i&&(d.style.borderTopLeftRadius="inherit"),8&i&&4&i&&(d.style.borderBottomLeftRadius="inherit"),2&i&&1&i&&(d.style.borderTopRightRadius="inherit"),2&i&&4&i&&(d.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),d.append(e)}}))}var qi=i(6131);function Qi({messages:e,attachmentDiv:t,middleware:i,uploading:s,lazyLoadQueue:n,isOut:a,chat:r,loadPromises:l,autoDownload:c,managers:h=d.Z.managers,animationGroup:u}){const p=[];for(const t of e){const e=(0,bt.Z)(t),i="photo"===e._?(0,j.Z)(e,480,480):{w:e.w,h:e.h};p.push({size:i,media:e,message:t})}$i({container:t,items:p.map((e=>({w:e.size.w,h:e.size.h}))),maxWidth:o.Z.active.album.width,minWidth:100,spacing:2,forMedia:!0});const{width:f,height:m}=t.style,g=parseInt(f),v=parseInt(m);p.forEach(((e,s)=>{var o;const{size:r,media:d,message:p}=e,f=!!(null===(o=p.media.pFlags)||void 0===o?void 0:o.spoiler),m=t.children[s];m.dataset.mid=""+p.mid,m.dataset.peerId=""+p.peerId;const b=m.firstElementChild;let y;if(y="photo"===d._?(0,K.Z)({photo:d,message:p,container:b,boxWidth:0,boxHeight:0,isOut:a,lazyLoadQueue:n,middleware:i,size:r,loadPromises:l,autoDownloadSize:c.photo,managers:h}):(0,$.Z)({doc:d,container:b,message:p,boxWidth:0,boxHeight:0,withTail:!1,isOut:a,lazyLoadQueue:n,middleware:i,loadPromises:l,autoDownload:c,managers:h,noAutoplayAttribute:f}),y&&(null==l||l.push(y)),f){const e=(y||Promise.resolve()).then((()=>{return e=this,t=void 0,n=function*(){if(!i())return;const{width:e,height:t}=m.style,s=+e.slice(0,-1)/100*g,n=+t.slice(0,-1)/100*v,a=yield(0,qi.ZP)({media:d,animationGroup:u,middleware:i,width:s,height:n});i()&&b.append(a)},new((s=void 0)||(s=Promise))((function(i,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}d((n=n.apply(e,t||[])).next())}));var e,t,s,n}));null==l||l.push(e)}}))}var Yi=i(296),Xi=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))},Ji=i(3552),es=i(8130);class ts extends Ji._{init(e){return t=this,i=void 0,n=function*(){this.container.id="poll-results-container",this.container.classList.add("chatlist-container"),this.resultsDiv=document.createElement("div"),this.resultsDiv.classList.add("poll-results"),this.scrollable.append(this.resultsDiv);const t=yield this.managers.appPollsManager.getPoll(e.media.poll.id);this.setTitle(t.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const i=document.createElement("h3");(0,F.Z)(i,(0,B.Z)(t.poll.question));const s=t.results.results.map((e=>e.voters/t.results.total_voters*100));ns(s);const n=document.createDocumentFragment();t.results.results.forEach(((i,o)=>{if(!i.voters)return;const r=document.createElement("hr"),d=t.poll.answers[o],l=document.createElement("div");l.classList.add("poll-results-answer");const c=document.createElement("div");(0,F.Z)(c,(0,B.Z)(d.text));const h=document.createElement("div");h.innerText=Math.round(s[o])+"%",l.append(c,h);const u=es.default.createChatList();u.classList.add("poll-results-voters"),es.default.setListClickListener(u,(()=>{a.ZP.onCloseBtnClick()}),void 0,!0),u.style.minHeight=48*Math.min(i.voters,4)+"px",n.append(r,l,u);let p,f=4,m=!1,g=Math.max(0,i.voters-4);const v=()=>{m||(m=!0,this.managers.appPollsManager.getVotes(e,d.option,p,f).then((e=>{e.votes.forEach((e=>{const{dom:t}=es.default.addDialogNew({peerId:e.user_id.toPeerId(!1),container:u,rippleEnabled:!1,meAsSaved:!1,avatarSize:"small"});t.lastMessageSpan.parentElement.remove()})),p&&(g=Math.max(0,g-e.votes.length),g&&b.lastElementChild.replaceWith((0,L.ag)("PollResults.LoadMore",[Math.min(20,g)]))),p=e.next_offset,f=20,g&&e.votes.length||b.remove()})).finally((()=>{m=!1})))},b=(0,He.Z)("poll-results-more btn btn-primary btn-transparent",{icon:"down"});b.addEventListener("click",v),b.append((0,L.ag)("PollResults.LoadMore",[Math.min(20,g)])),n.append(b),v()})),this.resultsDiv.append(i,n),a.ZP.toggleSidebar(!0).then((()=>{}))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}}var is=i(5157);let ss=0;const ns=e=>{const t=e.reduce(((e,t)=>e+Math.round(t)),0);if(t>100){const i=t-100,s=e.length;for(let t=0;t=.5&&si&&(i=s,t=n)}if(-1===t)return;e[t]+=1-i}}};d.Z.addEventListener("poll_update",(({poll:e,results:t})=>{Array.from(document.querySelectorAll(`poll-element[poll-id="${e.id}"]`)).forEach((i=>{i.isClosed=!!e.pFlags.closed,i.performResults(t,e.chosenIndexes)}))})),o.Z.addEventListener("resize",(()=>{cs.setMaxLength(),cs.resizePolls()})),o.Z.addEventListener("changeScreen",(()=>{cs.setMaxLength()}));const as=(e,t,i)=>{e.classList.remove("active"),clearTimeout(i),setTimeout((()=>{t(),e.remove(),os===e&&rs===t&&ds===i&&(os=rs=null,ds=0)}),200)};let os,rs,ds,ls=!1;class cs extends HTMLElement{constructor(){super(...arguments),this.isClosed=!1,this.isQuiz=!1,this.isRetracted=!1,this.isPublic=!1,this.isMultiple=!1,this.chosenIndexes=[],this.chosingIndexes=[],this.sentVote=!1}static setMaxLength(){const e=Ae.Z.width<=360?Ae.Z.width-120:o.Z.active.poll.width;this.MAX_LENGTH=e+9+this.MAX_OFFSET+-13.7}static resizePolls(){this.MAX_LENGTH&&Array.from(document.querySelectorAll("poll-element.is-voted")).forEach((e=>{e.svgLines.forEach(((t,i)=>{e.setLineProgress(i,1)}))}))}render(){return e=this,t=void 0,s=function*(){ss||(ss=document.getElementById("poll-line").getTotalLength(),cs.setMaxLength());const{poll:e,results:t}=this.message.media;let i;this.message.pFlags.is_scheduled&&this.classList.add("disable-hover"),e.pFlags&&(this.isPublic=!!e.pFlags.public_voters,this.isQuiz=!!e.pFlags.quiz,this.isClosed=!!e.pFlags.closed,this.isMultiple=!!e.pFlags.multiple_choice,this.isClosed?(i="Chat.Poll.Type.Closed",this.classList.add("is-closed")):i=this.isQuiz?this.isPublic?"Chat.Poll.Type.Quiz":"Chat.Poll.Type.AnonymousQuiz":this.isPublic?"Chat.Poll.Type.Public":"Chat.Poll.Type.Anonymous"),this.classList.toggle("is-multiple",this.isMultiple);const s=this.isMultiple?'':"",n=e.answers.map(((e,t)=>`\n
\n
\n
\n \n \n \n ${s}\n
\n
\n
\n \n \n
\n `)).join("");if(this.innerHTML=`\n
\n
\n
\n
\n
\n ${n}`,(0,F.Z)(this.firstElementChild,(0,B.Z)(e.question)),Array.from(this.querySelectorAll(".poll-answer-text")).forEach(((t,i)=>{(0,F.Z)(t,(0,B.Z)(e.answers[i].text))})),this.descDiv=this.firstElementChild.nextElementSibling,this.typeDiv=this.descDiv.firstElementChild,this.avatarsDiv=this.descDiv.lastElementChild,i&&this.typeDiv.append((0,L.ag)(i)),this.isQuiz&&(this.classList.add("is-quiz"),e.close_period&&e.close_date)){const t=document.createElement("div");t.classList.add("poll-time"),this.descDiv.append(t);const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("poll-quiz-timer"),this.quizTimer=i;const s=2,n=7,a=2*Math.PI*n,o=document.createElementNS("http://www.w3.org/2000/svg","circle");o.classList.add("poll-quiz-timer-circle"),o.setAttributeNS(null,"cx","16"),o.setAttributeNS(null,"cy","16"),o.setAttributeNS(null,"r",""+n),o.setAttributeNS(null,"stroke-width",""+s),i.append(o),this.descDiv.append(i);const r=1e3*e.close_period,l=1e3*(e.close_date-(yield d.Z.managers.timeManager.getServerTimeOffset()));this.quizInterval=window.setInterval((()=>{const e=Date.now(),i=(l-e)/r,s=(l-e)/1e3+1|0;t.innerHTML=(0,is.Z)(s),s<=5&&(t.style.color="#ee545c",o.style.stroke="#ee545c"),o.style.strokeDashoffset=a+i*a,o.style.strokeDasharray=`${a} ${a}`,e>=l&&(clearInterval(this.quizInterval),t.innerHTML="",o.style.strokeDashoffset=a,this.quizInterval=0,setTimeout((()=>{this.managers.appPollsManager.getResults(this.message)}),3e3))}),1e3)}this.answerDivs=Array.from(this.querySelectorAll(".poll-answer")),this.svgLines=Array.from(this.querySelectorAll(".poll-line")),this.numberDivs=Array.from(this.querySelectorAll(".poll-answer-percents"));const o=document.createElement("div");o.classList.add("poll-footer"),this.viewResults=document.createElement("div"),this.viewResults.className="poll-footer-button poll-view-results hide",this.viewResults.append((0,L.ag)("Chat.Poll.ViewResults")),this.votersCountDiv=document.createElement("div"),this.votersCountDiv.className="poll-votes-count",o.append(this.viewResults,this.votersCountDiv),this.append(o),this.viewResults.addEventListener("click",(e=>{(0,Le.Z)(e),a.ZP.isTabExists(ts)||a.ZP.createTab(ts).open(this.message)})),(0,A.Z)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append((0,L.ag)("Chat.Poll.SubmitVote")),(0,A.Z)(this.sendVoteBtn),e.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),(0,C.fc)(this.sendVoteBtn,(e=>{(0,Le.Z)(e),this.chosingIndexes.length&&this.sendVotes(this.chosingIndexes).then((()=>{this.chosingIndexes.length=0,this.answerDivs.forEach((e=>{e.classList.remove("is-chosing")}))}))})),o.append(this.sendVoteBtn));const r=!(e.chosenIndexes.length||this.isClosed);r&&!this.isPublic||this.performResults(t,e.chosenIndexes,!1),r&&(this.setVotersCount(t),(0,C.fc)(this,this.clickHandler))},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}initQuizHint(e){if(e.solution&&e.solution_entities){const t=document.createElement("div");if(t.classList.add("tgico-tip","poll-hint"),this.descDiv.append(t),(0,C.fc)(t,(i=>{(0,Le.Z)(i),t.classList.add("active"),((e,t,i)=>{os&&as(os,rs,ds);const s=document.createElement("div");s.classList.add("quiz-hint");const n=document.createElement("div");n.classList.add("container","tgico");const a=document.createElement("div");a.classList.add("text"),n.append(a),s.append(n),(0,F.Z)(a,(0,mt.ZP)(e,{entities:t})),td.chat.bubbles.container.append(s),s.offsetLeft,s.classList.add("active"),os=s,rs=i,ds=window.setTimeout((()=>{as(s,i,ds)}),c.Z?5e3:7e3),ls||(ls=!0,td.addEventListener("peer_changed",(()=>{os&&as(os,rs,ds)})))})(e.solution,e.solution_entities,(()=>{t.classList.remove("active")}))})),this.sentVote){const i=e.results.find((e=>e.pFlags.correct));i&&!i.pFlags.chosen&&(0,C.tH)(t)}}}clickHandler(e){const t=(0,be.Z)(e.target,"poll-answer");if(!t)return;(0,Le.Z)(e);const i=+t.dataset.index;if(this.isMultiple){t.classList.toggle("is-chosing");const e=this.chosingIndexes.indexOf(i);-1!==e?this.chosingIndexes.splice(e,1):this.chosingIndexes.push(i)}else this.sendVotes([i])}sendVotes(e){if(this.sendVotePromise)return this.sendVotePromise;const t=this.answerDivs.filter(((t,i)=>e.includes(i)));return t.forEach((e=>{e.classList.add("is-voting")})),this.classList.add("disable-hover"),this.sentVote=!0,this.sendVotePromise=this.managers.appPollsManager.sendVote(this.message,e).then((()=>{t.forEach((e=>{e.classList.remove("is-voting")})),this.classList.remove("disable-hover")})).catch((()=>{this.sentVote=!1})).finally((()=>{this.sendVotePromise=null}))}performResults(e,t,i=!0){var s,n;if(d.Z.settings.animationsEnabled||(i=!1),this.isQuiz&&((null===(s=e.results)||void 0===s?void 0:s.length)||this.isClosed)){this.answerDivs.forEach(((t,i)=>{t.classList.toggle("is-correct",!!e.results[i].pFlags.correct)})),this.initQuizHint&&(this.initQuizHint(e),this.initQuizHint=null),this.quizInterval&&(clearInterval(this.quizInterval),this.quizInterval=0),(null===(n=this.quizTimer)||void 0===n?void 0:n.parentElement)&&this.quizTimer.remove();const t=this.descDiv.querySelector(".poll-time");t&&t.remove()}if(this.isClosed&&(this.classList.add("is-closed"),(0,H.Z)(this.typeDiv,(0,L.ag)("Chat.Poll.Type.Closed"))),(this.chosenIndexes.length!==t.length||this.isClosed)&&(this.isRetracted=this.chosenIndexes.length&&!t.length,this.chosenIndexes=t.slice(),this.isRetracted?(0,C.fc)(this,this.clickHandler):(0,C.EN)(this,this.clickHandler)),this.chosenIndexes.length||this.isRetracted||this.isClosed){const t=e.results.map((t=>e.total_voters?t.voters/e.total_voters*100:0));this.classList.toggle("no-transition",!i),i&&(0,De.Z)({element:this,className:"",forwards:!this.isRetracted,duration:340}),(0,fe.T2)((()=>{this.setResults(this.isRetracted?this.percents:t,this.chosenIndexes,i),this.percents=t,this.isRetracted=!1}))}if(this.setVotersCount(e),this.isPublic){this.isMultiple||(this.viewResults.classList.toggle("hide",!e.total_voters||!this.chosenIndexes.length),this.votersCountDiv.classList.toggle("hide",!!this.chosenIndexes.length));const t=(e.recent_voters||[]).map((e=>e.toPeerId())),i=new se({avatarSize:16});i.render(t),(0,H.Z)(this.avatarsDiv,i.container)}if(this.isMultiple){const t=!!this.chosenIndexes.length,i=this.isClosed||t,s=!this.isPublic||!e.total_voters||!t&&!this.isClosed;this.sendVoteBtn.classList.toggle("hide",i),this.viewResults.classList.toggle("hide",s),this.votersCountDiv.classList.toggle("hide",!i||!s)}}setResults(e,t,i){this.svgLines.forEach((e=>e.style.display="")),this.answerDivs.forEach(((e,i)=>{e.classList.toggle("is-chosen",t.includes(i))}));const s=Math.max(...e);if(this.maxPercents=e.map((e=>e/s)),this.isRetracted)this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,-1)}));else{const e=()=>{this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,1)}))};i?(0,fe.T2)(e):e()}let n;e=e.slice(),ns(e);const a=t=>{e.forEach(((e,i)=>{const s=n(e,t);this.numberDivs[i].innerText=s+"%"}))};if(this.isRetracted)if(n=(e,t)=>Math.round(e/10*t),i)for(let e=9,t=0;e>=0;--e,++t)setTimeout((()=>{a(e)}),34*t);else a(0);else if(n=(e,t)=>Math.round(e/10*(t+1)),i)for(let e=0;e<10;++e)setTimeout((()=>{a(e)}),34*e);else a(9);if(this.isRetracted){i&&this.classList.add("is-retracting"),this.classList.remove("is-voted");const e=()=>{this.svgLines.forEach((e=>e.style.display="none"))};i?setTimeout((()=>{this.classList.remove("is-retracting"),e()}),340):e()}else this.classList.add("is-voted")}setVotersCount(e){const t=e.total_voters||0;let i;const s=[t];i=this.isClosed?this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesResultEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesResultEmpty":this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesEmpty",(0,H.Z)(this.votersCountDiv,(0,L.ag)(i,s))}setLineProgress(e,t){const i=this.svgLines[e];-1===t?(i.style.strokeDasharray="",i.style.strokeDashoffset=""):(i.style.strokeDasharray=t*this.maxPercents[e]*cs.MAX_LENGTH+", 485.9",i.style.strokeDashoffset=""+t*cs.MAX_OFFSET)}}cs.MAX_OFFSET=-46.5,cs.MAX_LENGTH=0,customElements.define("poll-element",cs);const hs="֑-߿יִ-﷽ﹰ-ﻼ",us=(new RegExp("^[^A-Za-zÀ-ÖØ-öø-ʸ̀-֐ࠀ-῿Ⰰ-﬜﷾-﹯﻽-￿]*["+hs+"]"),new RegExp("["+hs+"]"));var ps=i(6628),fs=i(5345),ms=i(3591),gs=i(9102),vs=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const bs=new Map([["messageActionHistoryClear",!0],["messageActionChatCreate",e=>e.pFlags.out]]),ys=new Set;Ue.Z&&ys.add("messageActionPhoneCall");const ws=void 0;let Ss=ws,Cs=0;const Ls=3,Es=new Error("peer changed"),Is={1:96,2:90,3:84,4:72,5:60,6:48,7:36},Ms=Object.keys(Is).length;function Ps(e){return Math.max(...e)}class Zs{constructor(e,t){let i;this.chat=e,this.managers=t,this.unreadOut=new Set,this.needUpdate=[],this.bubbles={},this.skippedMids=new Set,this.bubblesNewByGroupedId={},this.bubblesNew={},this.dateMessages={},this.scrolledDown=!0,this.isScrollingTimeout=0,this.unreaded=new Map,this.unreadedSeen=new Set,this.preloader=null,this.messagesQueueOnRenderAdditional=null,this.firstUnreadBubble=null,this.middlewareHelper=(0,Ce.k)(),this.followStack=[],this.isHeavyAnimationInProgress=!1,this.isFirstLoad=!0,this.passEntities={},this.viewsMids=new Set,this.isTopPaddingSet=!1,this.renderingMessages=new Set,this.bubblesToEject=new Set,this.bubblesToReplace=new Map,this.setPeerTempId=0,this.renderNewPromises=new Set,this.extendedMediaMessages=new Set,this.unreadedObserverCallback=e=>{if(e.isIntersecting){const t=e.target,i=this.unreaded.get(t);this.onUnreadedInViewport(t,i)}},this.viewsObserverCallback=e=>{if(e.isIntersecting){const t=+e.target.dataset.mid;if(this.observer.unobserve(e.target,this.viewsObserverCallback),t)this.viewsMids.add(t),this.sendViewCountersDebounced();else{const{sponsoredMessage:e}=this,t=null==e?void 0:e.random_id;t&&(this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(),t),delete e.random_id)}}},this.stickerEffectObserverCallback=e=>{if(e.isIntersecting){this.observer.unobserve(e.target,this.stickerEffectObserverCallback);const t=e.target.querySelector(".attachment");(0,pe.e9)().then((()=>{(0,zi.Z)(t)&&(0,C.tH)(t)}))}},this.onBubblesMouseMove=e=>vs(this,void 0,void 0,(function*(){const t=(0,be.Z)(e.target,"bubble-content");if("scheduled"===this.chat.type||!t||this.chat.selection.isSelecting||(0,be.Z)(e.target,"service")||(0,be.Z)(e.target,"bubble-beside-button"))this.unhoverPrevious();else{const e=(0,be.Z)(t,"bubble");if(!this.chat.selection.canSelectBubble(e))return void this.unhoverPrevious();let{hoverBubble:i,hoverReaction:s}=this;if(e===i)return;if(this.unhoverPrevious(),i=this.hoverBubble=e,s=this.hoverReaction,s)s.dataset.loaded&&this.setHoverVisible(s,!0);else{s=this.hoverReaction=document.createElement("div"),s.classList.add("bubble-hover-reaction");const i=document.createElement("div");i.classList.add("bubble-hover-reaction-sticker"),s.append(i),t.append(s);let n=yield this.chat.getMessage(+e.dataset.mid);if("message"!==(null==n?void 0:n._))return void this.unhoverPrevious();n=yield this.managers.appMessagesManager.getGroupsFirstMessage(n);const a=this.getMiddleware((()=>this.hoverReaction===s));Promise.all([this.managers.appReactionsManager.getAvailableReactionsByMessage(n),(0,at.Z)(400)]).then((([e])=>{const t=e[0];t?(0,W.ZP)({div:i,doc:t.select_animation,width:18,height:18,needUpscale:!0,middleware:a,group:this.chat.animationGroup,withThumb:!1,needFadeIn:!1}).then((({render:e})=>e)).then((e=>{(0,Ze.Z)(e),e.addEventListener("firstFrame",(()=>{a()&&(s.dataset.loaded="1",this.setHoverVisible(s,!0))}),{once:!0}),(0,C.fc)(s,(e=>{(0,Le.Z)(e),this.managers.appReactionsManager.sendReaction(n,t),this.unhoverPrevious()}),{listenerSetter:this.listenerSetter})}),Ye.Z):s.remove()}))}}})),this.unhoverPrevious=()=>{const{hoverBubble:e,hoverReaction:t}=this;e&&(this.setHoverVisible(t,!1),this.hoverBubble=void 0,this.hoverReaction=void 0)},this.onBubblesClick=e=>vs(this,void 0,void 0,(function*(){var t;let i=e.target,s=null;try{s=(0,be.Z)(i,"bubble")}catch(e){}if(!s&&!this.chat.selection.isSelecting){const e=(0,be.Z)(i,"user-avatar");if(!e)return;const t=e.dataset.peerId.toPeerId();return void(t!==m.NM?this.chat.appImManager.setInnerPeer({peerId:t}):(0,we.Am)(L.ZP.format("HidAccount",!0)))}if(s.classList.contains("is-date")&&(0,be.Z)(i,"bubble-content")){if(s.classList.contains("is-fake")&&(s=s.previousElementSibling),s.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages)if(this.dateMessages[e].div===s){S.Z.createPopup(I,new Date(+e),this.onDatePick).show();break}return}if(!c.Z&&(0,be.Z)(i,"time"))return void this.chat.selection.toggleByElement(s);if(this.chat.selection.isSelecting&&e.isTrusted){if(s.classList.contains("service")&&void 0===s.dataset.mid)return;return(0,Le.Z)(e),c.Z&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement((0,be.Z)(i,"grouped-item")||s)}const n=(0,be.Z)(i,"media-spoiler-container");if(n)return void(0,qi.kN)({event:e,mediaSpoiler:n});const a=(0,be.Z)(i,"contact");if(a){const t=a.dataset.peerId.toPeerId();if(t)this.chat.appImManager.setInnerPeer({peerId:t});else{const t=a.querySelector(".contact-number");(0,ht.T)(t.innerText.replace(/\s/g,"")),(0,we.bC)({langPackKey:"PhoneCopied"}),(0,Le.Z)(e)}return}const o=(0,be.Z)(i,"bubble-call");if(o)return void this.chat.appImManager.callUser(this.peerId.toUserId(),o.dataset.type);if((0,be.Z)(i,"is-buy")){(0,Le.Z)(e);const t=yield this.chat.getMessage(+s.dataset.mid);if(!t)return;return void new Hi(t,yield this.managers.appPaymentsManager.getInputInvoiceByPeerId(t.peerId,t.mid))}const r=(0,ye.Z)(i,"REACTION-ELEMENT");if(r){if((0,Le.Z)(e),r.classList.contains("is-inactive"))return;const t=r.parentElement,i=t.getReactionCount(r),s=t.getMessage();return void this.managers.appReactionsManager.sendReaction(s,i.reaction)}const d=(0,Be.Z)(i,"data-sticker-emoji");if(d&&1===d.parentElement.querySelectorAll("[data-sticker-emoji]").length&&s.classList.contains("emoji-big"))return void(0,W._2)({event:e,container:d,managers:this.managers,middleware:this.getMiddleware(),peerId:this.peerId});if((0,be.Z)(i,"replies")){const e=+s.dataset.mid;if(this.peerId===m.hj){const t=yield this.chat.getMessage(e),i=(0,R.Z)(t.reply_to.reply_to_peer_id),s=t.reply_to.reply_to_top_id,n=t.fwd_from.saved_from_msg_id;this.chat.appImManager.openThread({peerId:i,lastMsgId:n,threadId:s})}else{const t=yield this.chat.getMessage(e),i=yield this.managers.appMessagesManager.getMessageWithReplies(t),s=i.replies;s&&this.managers.appMessagesManager.getDiscussionMessage(this.peerId,i.mid).then((e=>{this.chat.appImManager.setInnerPeer({peerId:s.channel_id.toPeerId(!0),type:"discussion",threadId:e.mid})}))}return}const l=(0,be.Z)(i,"is-via");if(l){const t=l.querySelector(".peer-title");if(i===t||(0,Ne.Z)(i,t)){const i=t.innerText+" ";return this.managers.appDraftsManager.setDraft(this.peerId,this.chat.threadId,i),void(0,Le.Z)(e)}}const h=(0,be.Z)(i,"peer-title")||(0,ye.Z)(i,"AVATAR-ELEMENT")||(0,Be.Z)(i,"data-saved-from");if(h&&h!==s){i=h||i;const e=i.dataset.peerId||i.getAttribute("peer")||i.peerId,t=i.dataset.savedFrom;if("string"==typeof e||t)if(t){const[e,n]=t.split("_");if(i.classList.contains("is-receipt-link")){const t=yield this.managers.appMessagesManager.getMessageByPeer(e.toPeerId(),+n);if(t){const e=yield this.managers.appPaymentsManager.getInputInvoiceByPeerId(this.peerId,+s.dataset.mid);new Hi(t,e,void 0,!0)}}else this.chat.appImManager.setInnerPeer({peerId:e.toPeerId(),lastMsgId:+n})}else{const t=e.toPeerId();t!==m.NM?this.chat.appImManager.setInnerPeer({peerId:t}):(0,we.Am)(L.ZP.format("HidAccount",!0))}return}if(s.classList.contains("sticker")&&i.parentElement.classList.contains("attachment")){const e=+s.dataset.mid,i=null===(t=(yield this.chat.getMessage(e)).media)||void 0===t?void 0:t.document;return void((null==i?void 0:i.stickerSetInput)&&new P.Z(i.stickerSetInput).show())}const u=(0,be.Z)(i,"document-with-thumb");if("IMG"===i.tagName&&!i.classList.contains("emoji")&&!i.classList.contains("document-thumb")||i.classList.contains("album-item")||"VIDEO"===i.tagName&&!s.classList.contains("round")||u&&!u.querySelector(".preloader-container")||i.classList.contains("canvas-thumbnail")){const t=(0,be.Z)(i,"album-item")||(0,be.Z)(i,"document-container"),n=(t||s).querySelector(".preloader-container");if(n)return(0,C.tH)(n),void(0,Le.Z)(e);(0,Le.Z)(e);const a=+(t||s).dataset.mid,o=yield this.chat.getMessage(a);if(!o)return void this.log.warn("no message by messageId:",a);const r="webpage",d=s.classList.contains(r),l=u?e=>Fe.Z.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),c=[],h=d?[a]:(yield Promise.all(Object.keys(this.bubbles).map((e=>+e)).map((e=>vs(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e),i=(0,bt.Z)(t);return i&&l(i)&&e})))))).filter(Boolean).sort(((e,t)=>e-t));h.forEach((e=>{let t;u?t=".document-container":(t=".album-item video, .album-item img, .preview video, .preview img, ",t+=this.bubbles[e].classList.contains("with-media-tail")?".bubble__media-container":".attachment video, .attachment img");const i=Array.from(this.bubbles[e].querySelectorAll(t)),s=new Set;if(u)i.forEach((e=>{c.push({element:e.querySelector(".document-ico"),mid:+e.dataset.mid,peerId:this.peerId})}));else{const t=!!this.bubbles[e].querySelector(".media-container-aspecter");i.forEach((i=>{if(t&&!(0,be.Z)(i,"media-container-aspecter"))return;const n=(0,be.Z)(i,"album-item"),a=n||i.parentElement;s.has(a)||(s.add(a),c.push({element:i,mid:n?+n.dataset.mid:e,peerId:this.peerId}))}))}})),c.sort(((e,t)=>e.mid-t.mid));const p=c.findIndex((e=>e.mid===a));return ge.ZP&&this.log("open mediaViewer single with ids:",h,p,c),c[p]?void(new Fe.Z).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:u?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!d,isScheduled:"scheduled"===this.chat.type}).openMedia(o,c[p].element,0,!0,c.slice(0,p),c.slice(p+1)):void this.log("no target for media viewer!",i)}if(-1===["IMG","DIV","SPAN"].indexOf(i.tagName)&&(i=(0,ye.Z)(i,"DIV")),-1!==["DIV","SPAN"].indexOf(i.tagName)){if(i.classList.contains("goto-original")){const e=s.dataset.savedFrom,[t,i]=e.split("_");return void this.chat.appImManager.setInnerPeer({peerId:t.toPeerId(),lastMsgId:+i})}if(i.classList.contains("forward")){const e=+s.dataset.mid,t=yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,e);return void new M.Z({[this.peerId]:yield this.managers.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!(0,be.Z)(e.target,"reply")}catch(e){}if(t&&s.classList.contains("is-reply")){const e=+s.dataset.mid;this.followStack.push(e);const t=yield this.chat.getMessage(e),i=t.reply_to.reply_to_peer_id?(0,R.Z)(t.reply_to.reply_to_peer_id):this.peerId,n=t.reply_to.reply_to_msg_id;this.chat.appImManager.setInnerPeer({peerId:i,lastMsgId:n,type:this.chat.type,threadId:this.chat.threadId})}}})),this.onScroll=(e,t,i)=>{var s,n,a,o,r;if(this.isHeavyAnimationInProgress){if(null===(s=this.sliceViewportDebounced)||void 0===s||s.clearTimeout(),this.scrolledDown&&!e)return}else null===(n=this.chat.topbar.pinnedMessage)||void 0===n||n.setCorrectIndexThrottled(this.scrollable.lastScrollDirection),null===(a=this.sliceViewportDebounced)||void 0===a||a.call(this),this.setStickyDateManually();if(t&&t.distanceToEnd<300&&this.scrolledDown)return;const d=i?0:null!==(o=null==t?void 0:t.distanceToEnd)&&void 0!==o?o:this.scrollable.getDistanceToEnd();(0!==this.scrollable.lastScrollDirection&&d>0||t||i)&&(this.isScrollingTimeout?clearTimeout(this.isScrollingTimeout):this.chatInner.classList.contains("is-scrolling")||this.chatInner.classList.add("is-scrolling"),this.isScrollingTimeout=window.setTimeout((()=>{this.chatInner.classList.remove("is-scrolling"),this.isScrollingTimeout=0}),1350+(null!==(r=null==t?void 0:t.duration)&&void 0!==r?r:0))),d<300&&(i||this.scrollable.loadedAll.bottom||this.chat.setPeerPromise||!this.peerId)?(this.container.classList.add("scrolled-down"),this.scrolledDown=!0):this.container.classList.contains("scrolled-down")&&(this.container.classList.remove("scrolled-down"),this.scrolledDown=!1)},this.processBatch=(...e)=>vs(this,void 0,void 0,(function*(){var t,i,s;let[n,a,o]=e;const r=e=>e.filter((e=>e&&this.bubbles[e.bubble.dataset.mid]===e.bubble));n=r(n),o("messages rendered");const d=null===(t=n[0])||void 0===t?void 0:t.reverse,{groups:l,avatarPromises:c}=this.groupBubbles(n.filter((e=>e.updatePosition))),h=n.reduce(((e,t)=>{const i=performance.now(),s=t.promises.slice(),n=s.map((e=>vs(this,void 0,void 0,(function*(){return yield e,performance.now()-i}))));return Promise.all(n).then((e=>{o.groupCollapsed("media message time",performance.now()-i,t,e),e.forEach(((e,t)=>{o("media message time",e,t,s[t])})),o.groupEnd()})),e.push(...t.promises),e}),[]);h.push(...c),o("media promises to call",h,n,this.isHeavyAnimationInProgress),yield a(Promise.all([...h,this.setUnreadDelimiter()]).catch(Ye.Z)),yield a((0,fe.AD)()),o("media promises end"),n=r(n);const{restoreScroll:u,scrollSaver:p}=this.prepareToSaveScroll(d);null===(i=this.messagesQueueOnRenderAdditional)||void 0===i||i.call(this),this.ejectBubbles();for(const[e,t]of this.bubblesToReplace){if(p&&p.replaceSaved(t,e),!n.find((t=>t.bubble===e)))continue;const i=this.bubbleGroups.getItemByBubble(e);i?(i.mounted=!1,l.includes(i.group)||l.push(i.group)):this.log.error("NO ITEM BY BUBBLE",e),this.bubblesToReplace.delete(e)}this.chat.selection.isSelecting&&n.forEach((({bubble:e})=>{this.chat.selection.toggleElementCheckbox(e,!0)})),n.forEach((({message:e,bubble:t,updatePosition:i})=>{e.pFlags.local&&i&&this.chatInner[e.pFlags.sponsored?"append":"prepend"](t)})),this.bubbleGroups.mountUnmountGroups(l),null===(s=this.updatePlaceholderPosition)||void 0===s||s.call(this),null==u||u()})),this.onDatePick=e=>{const t=this.peerId;this.managers.appMessagesManager.requestHistory(t,0,2,-1,e,this.chat.threadId).then((e=>{var i;(null===(i=null==e?void 0:e.messages)||void 0===i?void 0:i.length)?this.peerId===t&&this.chat.setMessageId(e.messages[0].mid):this.log.error("no history!")}))},this.log=this.chat.log,this.listenerSetter=new ce.Z,this.constructBubbles(),this.batchProcessor=new fs.s({log:this.log,process:this.processBatch,possibleError:Es}),this.bubbleGroups=new w(this.chat),this.preloader=new Z.Z({cancelable:!1}),this.lazyLoadQueue=new le.Z(void 0,!0),this.lazyLoadQueue.queueId=++Cs,this.listenerSetter.add(d.Z)("history_update",(({storageKey:e,sequential:t,message:i})=>vs(this,void 0,void 0,(function*(){if(this.chat.messagesStorageKey!==e||"scheduled"===this.chat.type)return;const{mid:s}=i,n=this.bubbles[s];if(!n)return;if(this.renderNewPromises.size&&(yield Promise.all(Array.from(this.renderNewPromises))),this.messagesQueuePromise&&(yield this.messagesQueuePromise),this.bubbles[s]!==n)return;const a=this.bubbleGroups.getItemByBubble(n);if(!a)return;if(a.mid===s)return;if(t){const e=a.group,o=this.bubbleGroups.createItem(n,i),r=this.bubbleGroups.itemsArr.slice();(0,h.Z)(r,a);const l=this.bubbleGroups.findGroupSiblingByItem(o,r);if(e===(null==l?void 0:l.group)||e===this.bubbleGroups.getLastGroup()&&1===e.items.length&&o.dateTimestamp===a.dateTimestamp||this.peerId===d.Z.myId&&t&&o.dateTimestamp===a.dateTimestamp)return void this.bubbleGroups.changeBubbleMid(n,s)}this.bubbleGroups.removeAndUnmountBubble(n);const{groups:o}=this.groupBubbles([{bubble:n,message:i}]);this.bubbleGroups.mountUnmountGroups(o),this.scrollingToBubble&&this.scrollToEnd()})))),this.listenerSetter.add(d.Z)("dialog_flush",(({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map((e=>+e)))})),this.listenerSetter.add(d.Z)("message_sent",(e=>vs(this,void 0,void 0,(function*(){const{storageKey:t,tempId:i,tempMessage:s,mid:n,message:a}=e;if(this.chat.messagesStorageKey!==t)return;const o=this.bubbles,r=o[i];if(r){const e=o[i];o[n]=e,e.dataset.mid=""+n,delete o[i],(0,fe.T2)((()=>{const t=+e.dataset.mid;o[t]===e&&e.classList.contains("is-outgoing")&&(e.classList.remove("is-sending","is-outgoing"),e.classList.add(this.peerId===d.Z.myId&&"scheduled"!==this.chat.type||!this.unreadOut.has(t)?"is-read":"is-sent"))}))}if(this.unreadOut.has(i)&&(this.unreadOut.delete(i),this.unreadOut.add(n)),"scheduled"===this.chat.type&&(Date.now()/1e3|0)>=s.date-10&&this.deleteMessagesByIds([n]),!r)return;let l,c;const h=a.grouped_id;if(h){l=yield this.managers.appMessagesManager.getMessagesByAlbum(h);const e=l.map((({mid:e})=>e));if(!e.length||Ps(e)!==n||o[n]!==r)return;if(o[n]!==r)return;c=Array.from(r.querySelectorAll(".grouped-item")).map((e=>+e.dataset.mid))}else l=[a],c=[i];const u=Array.from(r.querySelectorAll("reactions-element"));u.length&&u.forEach((e=>{e.changeMessage(a)})),l.forEach(((e,t)=>{var i,n,a,o,l;if(!e)return;const u=c[t],p=e.mid,f=r.querySelector(`.document-container[data-mid="${p}"]`)||r;if("message"!==e._)return;if(e.replies){const t=r.querySelector("replies-element");t&&(t.message=e,t.init())}const m=null!==(i=e.media)&&void 0!==i?i:{},g=m.document,v=m.poll,b=m.webpage;if(g){const t=f.querySelector(`.document-container[data-mid="${u}"] .document`);if(t){const i=(0,be.Z)(t,"document-container");!(null===(o=null===(a=null===(n=s.media)||void 0===n?void 0:n.document)||void 0===a?void 0:a.thumbs)||void 0===o?void 0:o.length)&&(null===(l=g.thumbs)||void 0===l?void 0:l.length)&&(0,pe.e9)().then((()=>vs(this,void 0,void 0,(function*(){const i=t.querySelector(".time"),s=yield(0,Yi.Z)({message:e,fontSize:d.Z.settings.messagesTextSize});t.replaceWith(s),i&&(s.querySelector(".document")||s).append(i)})))),i&&(i.dataset.mid=""+p)}const i=f.querySelector(`audio-element[data-mid="${u}"], .document[data-doc-id="${u}"], .media-round[data-mid="${u}"]`);i&&(i instanceof he.ZP||i.classList.contains("media-round")?(i.dataset.mid=""+e.mid,delete i.dataset.isOutgoing,i.message=e,i.onLoad(!0)):(i.dataset.docId=""+g.id,i.doc=g))}else if(v){const t=f.querySelector("poll-element");t&&(t.message=e,t.setAttribute("poll-id",""+v.id),t.setAttribute("message-id",""+p))}else b&&!f.querySelector(".web")&&(0,pe.e9)().then((()=>{this.safeRenderMessage(e,!0,f),this.scrollToBubbleIfLast(f)}));if(h){const e=f.querySelector(`.grouped-item[data-mid="${u}"]`)||f;e&&(e.dataset.mid=""+p)}}))})))),this.listenerSetter.add(d.Z)("message_edit",(({storageKey:e,message:t})=>vs(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t.mid];i&&(yield(0,pe.e9)(),this.bubbles[t.mid]===i&&this.safeRenderMessage(t,!0,i))})))),this.listenerSetter.add(d.Z)("message_error",(({storageKey:e,tempId:t})=>vs(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t];i&&(yield(0,pe.e9)(),this.bubbles[t]===i&&(i.classList.remove("is-outgoing"),i.classList.add("is-error")))})))),this.listenerSetter.add(d.Z)("album_edit",(({peerId:e,messages:t,deletedMids:i})=>{if(e!==this.peerId)return;const s=t.map((({mid:e})=>e)),n=Ps(s.concat(Array.from(i))),a=this.bubbles[n];if(!a)return;const o=Ps(s),r=t.find((e=>e.mid===o));this.safeRenderMessage(r,!0,a)})),this.listenerSetter.add(d.Z)("messages_reactions",(e=>vs(this,void 0,void 0,(function*(){if("scheduled"===this.chat.type)return;let t;const i=e.map((({message:e,changedResults:t})=>vs(this,void 0,void 0,(function*(){if(this.peerId!==e.peerId)return;const i=yield this.getMountedBubble(e.mid,e);return i?{bubble:i.bubble,message:e,changedResults:t}:void 0}))));(yield Promise.all(i)).filter(Boolean).forEach((({bubble:e,message:i,changedResults:s})=>{t||(t=this.createScrollSaver(!1),t.save());const n=i.peerId+"_"+i.mid,a=st.get(n);if(a)for(const e of a)e.update(i,s);else{if(!i.reactions||!i.reactions.results.length)return;this.appendReactionsElementToBubble(e,i,i,s)}})),t&&t.restore()})))),this.listenerSetter.add(d.Z)("messages_downloaded",(({peerId:e,mids:t})=>vs(this,void 0,void 0,(function*(){const i=this.getMiddleware();yield(0,pe.e9)(),i()&&t.forEach((t=>{this.needUpdate;const i=[];(0,g.Z)(this.needUpdate,((s,n)=>{s.replyMid===t&&s.replyToPeerId===e&&(this.needUpdate.splice(n,1)[0],i.push(s))})),i.forEach((({mid:e,replyMid:t,replyToPeerId:i})=>vs(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(!t)return;const i=yield this.chat.getMessage(e);de.setReply({chat:this.chat,bubble:t,message:i})}))))}))})))),(0,Gi.Z)({listenTo:this.scrollable.container,listenerSetter:this.listenerSetter,findTarget:e=>{const t=e.target;return t.closest(".attachment.media-sticker-wrapper")||(0,be.Z)(t,"attachment")&&t.closest(".custom-emoji")}}),(0,C.fc)(this.scrollable.container,this.onBubblesClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.scrollable.container)("mousedown",(e=>{if(0!==e.button)return;const t=(0,ye.Z)(e.target,"CODE");if(t){(0,Le.Z)(e),i=t,(0,ht.T)(i.textContent);const s=e=>{(0,Le.Z)(e),(0,we.bC)({langPackKey:"TextCopied",onClose:()=>{n()}})},n=(0,C.fc)(window,s,{listenerSetter:this.listenerSetter,once:!0,capture:!0})}else var i})),this.stickyIntersector=new k.Z(this.scrollable.container,((e,t)=>{for(const i in this.dateMessages){const s=this.dateMessages[i];if(s.container===t){const t=s.div;t.classList.toggle("is-sticky",e),e&&(this.previousStickyDate=t);break}}this.previousStickyDate})),x.IS_SAFARI||(this.sliceViewportDebounced=(0,Te.Z)(this.sliceViewport.bind(this),3e3,!1,!0)),(0,pe.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),i=this.getMiddleware()}),(()=>{this.isHeavyAnimationInProgress=!1,(null==i?void 0:i())&&this.lazyLoadQueue.unlockAndRefresh(),i=null}),this.listenerSetter)}constructBubbles(){const e=this.container=document.createElement("div");e.classList.add("bubbles","scrolled-down"),(this.chatInner=document.createElement("div")).classList.add("bubbles-inner"),this.setScroll(),e.append(this.scrollable.container)}attachContainerListeners(){const e=this.container;if(this.chat.contextMenu.attachTo(e),this.chat.selection.attachListeners(e,new ce.Z),ge.ZP&&this.listenerSetter.add(e)("dblclick",(e=>vs(this,void 0,void 0,(function*(){const t=(0,be.Z)(e.target,"grouped-item")||(0,be.Z)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",yield this.chat.getMessage(e)),this.highlightBubble(t)}})))),x.IS_MOBILE){if(c.Z){const t="is-gesturing-reply",i=64,s=.75*i;let n,a,o,r=!1;(0,Re.Z)({element:e,verifyTouchTarget:e=>vs(this,void 0,void 0,(function*(){if("pinned"===this.chat.type||this.chat.selection.isSelecting||!(yield this.chat.canSend()))return!1;if(n=(0,be.Z)(e.target,"bubble"),n){try{const e=n.parentElement.querySelector(".bubbles-group-avatar");e&&(0,ze.Z)(e,n)&&(o=e)}catch(e){}(0,De.Z)({element:n,className:t,forwards:!0,duration:250}),n.offsetLeft,a?(a.classList.remove("is-visible"),a.style.opacity=""):(a=document.createElement("span"),a.classList.add("tgico-reply_filled","bubble-gesture-reply-icon")),n.append(a)}return!!n})),onSwipe:e=>{r=e>=s,r&&!a.classList.contains("is-visible")&&a.classList.add("is-visible"),a.style.opacity=""+Math.min(1,e/s);const t=`translateX(${-Math.max(0,Math.min(i,e))}px)`;n.style.transform=t,o&&(o.style.transform=t),(0,Lt.s)()},onReset:()=>{const e=n,i=o;n=o=void 0,(0,De.Z)({element:e,className:t,forwards:!1,duration:250,onTransitionEnd:()=>{a.parentElement===e&&(a.classList.remove("is-visible"),a.remove())}}),(0,fe.T2)((()=>{if(e.style.transform="",i&&(i.style.transform=""),r){const{mid:t}=e.dataset;this.chat.input.initMessageReply(+t),r=!1}}))},listenerOptions:{capture:!0}})}}else this.listenerSetter.add(e)("dblclick",(e=>vs(this,void 0,void 0,(function*(){if("pinned"===this.chat.type||this.chat.selection.isSelecting||!(yield this.chat.canSend()))return;const t=e.target,i=t.classList.contains("bubble")?t:t.classList.contains("document-selection")?t.parentElement:null;if(i&&!i.classList.contains("bubble-first")){const e=+i.dataset.mid;if((yield this.chat.getMessage(e)).pFlags.is_outgoing)return;this.chat.input.initMessageReply(e)}}))))}constructPeerHelpers(){this.listenerSetter.add(d.Z)("history_append",(({storageKey:e,message:t})=>vs(this,void 0,void 0,(function*(){e===this.chat.messagesStorageKey&&"scheduled"!==this.chat.type&&(d.Z.settings.animationsEnabled&&(this.updateGradient=!0),this.scrollable.loadedAll.bottom?this.renderNewMessage(t,!0):this.chat.setMessageId())})))),this.listenerSetter.add(d.Z)("history_multiappend",(e=>{this.peerId===e.peerId&&"scheduled"!==this.chat.type&&this.renderNewMessage(e)})),this.listenerSetter.add(d.Z)("history_delete",(({peerId:e,msgs:t})=>{e===this.peerId&&"scheduled"!==this.chat.type&&this.deleteMessagesByIds(Array.from(t))})),this.listenerSetter.add(d.Z)("dialog_unread",(({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),(0,pe.e9)().then((()=>{this.updateUnreadByDialog()})))})),this.listenerSetter.add(d.Z)("dialogs_multiupdate",(e=>{e.has(this.peerId)&&"scheduled"!==this.chat.type&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(d.Z)("dialog_notify_settings",(e=>{this.peerId===e.peerId&&"scheduled"!==this.chat.type&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(d.Z)("chat_update",(e=>vs(this,void 0,void 0,(function*(){const{peerId:t}=this;if(t!==e.toPeerId(!0))return;const i=yield this.managers.appChatsManager.getChat(e);this.chatInner.classList.contains("has-rights")!==(yield this.chat.canSend())&&(yield Promise.all([this.finishPeerChange(),this.chat.input.finishPeerChange()])).forEach((e=>e())),!!i.pFlags.forum!==this.chat.isForum&&"chat"===this.chat.type&&(this.chat.peerId=0,this.chat.appImManager.setPeer({peerId:t}))})))),this.listenerSetter.add(d.Z)("history_reload",(e=>{if(e!==this.peerId)return;const t=(0,rt.Z)(this.bubbles,"desc").filter((e=>e>0)),i=this.getMiddleware();this.managers.appMessagesManager.reloadMessages(this.peerId,t).then((e=>{if(!i())return;const s=[];e.forEach(((e,i)=>{const n=t[i];if(e){const t=this.bubbles[e.mid];if(!t)return;this.safeRenderMessage(e,!0,t)}else s.push(n)})),this.deleteMessagesByIds(s),this.setLoaded("top",!1),this.setLoaded("bottom",!1),this.scrollable.checkForTriggers()}))})),this.listenerSetter.add(d.Z)("settings_updated",(({key:e})=>vs(this,void 0,void 0,(function*(){if("settings.emoji.big"===e){const e=this.getMiddleware(),t=(0,rt.Z)(this.bubbles,"desc").map((e=>vs(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(t.classList.contains("can-have-big-emoji"))return{bubble:t,message:yield this.chat.getMessage(e)}})))),i=yield Promise.all(t);if(!e())return;i.filter(Boolean).forEach((({bubble:e,message:t})=>{this.bubbles[t.mid]===e&&this.safeRenderMessage(t,!0,e)}))}})))),this.listenerSetter.add(d.Z)("messages_views",(e=>{"scheduled"!==this.chat.type&&(0,fe.T2)((()=>{let t;for(const{peerId:i,views:s,mid:n}of e){if(this.peerId!==i)continue;const e=this.bubbles[n];if(!e)continue;const a=Array.from(e.querySelectorAll(".post-views"));if(!a.length)continue;const o=(0,D.Z)(s,1);let r=!1;a.forEach((e=>{(r||e.textContent!==o)&&(t||(t=this.createScrollSaver(!0),t.save()),r=!0,e.textContent=o)}))}null==t||t.restore()}))})),this.observer=new lt({root:this.scrollable.container}),this.sendViewCountersDebounced=(0,Te.Z)((()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.managers.appMessagesManager.incrementMessageViews(this.peerId,e)}),1e3,!1,!0),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e,mids:t,pinned:i})=>{"pinned"===this.chat.type&&e===this.peerId&&t&&(i||this.deleteMessagesByIds(t))}));const e=()=>vs(this,void 0,void 0,(function*(){this.chat.topbar.setTitle((yield this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size)}));this.listenerSetter.add(d.Z)("scheduled_new",(t=>{"scheduled"===this.chat.type&&t.peerId===this.peerId&&(this.renderNewMessage(t),e())})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:t,mids:i})=>{"scheduled"===this.chat.type&&t===this.peerId&&(this.deleteMessagesByIds(i),e())}))}get peerId(){return this.chat.peerId}get messagesQueuePromise(){return this.batchProcessor.queuePromise}createScrollSaver(e=!0){return new ot(this.scrollable,".bubble:not(.is-date)",e)}createResizeObserver(){if(!("ResizeObserver"in window)||this.resizeObserver)return;const e=this.scrollable.container;let t=0,i=!1,s=!1,n=0,a=0,o=0;const r=()=>{const r=e.offsetHeight,d=this.scrollable.isScrolledDown;r===t||s&&d||(a+=t-r),a&&this.scrollable.setScrollTopSilently(this.scrollable.scrollTop+Math.round(a)),t=r,n=0,o=0,a=0,i=!1,s=!1},d=e=>{o&&window.cancelAnimationFrame(o),o=window.requestAnimationFrame(e?r:()=>{o=window.requestAnimationFrame(r)})};(this.resizeObserver=new ResizeObserver((e=>{if(s)return void d(!1);const o=e[0].contentRect.height;if(!t)return void(t=o);const r=t-o;let l=r+a;const c=l%1;if(l-=c,!i&&(i=!0,r<0&&this.scrollable.isScrolledDown))return a=-r,s=!0,void d(!1);if(n+=l,l){const e=this.scrollable.scrollTop+l;this.scrollable.setScrollTopSilently(e)}d(!1),a=c,t=o}))).observe(e)}destroyResizeObserver(){const e=this.resizeObserver;e&&(e.disconnect(),this.resizeObserver=void 0)}setReactionsHoverListeners(){this.listenerSetter.add(Et.Z)("toggle",this.unhoverPrevious),this.listenerSetter.add(Ct.Z)("change",this.unhoverPrevious),this.listenerSetter.add(this.chat.selection)("toggle",this.unhoverPrevious),this.listenerSetter.add(this.container)("mousemove",this.onBubblesMouseMove)}setHoverVisible(e,t){e.parentElement&&e.parentElement.classList.toggle("hover-reaction-visible",t),(0,De.Z)({element:e,className:"is-visible",forwards:t,duration:200,onTransitionEnd:t?void 0:()=>{e.remove()},useRafs:2})}setStickyDateManually(){}getRenderedLength(){return Object.keys(this.bubbles).length-this.skippedMids.size}onUnreadedInViewport(e,t){this.unreadedSeen.add(t),this.observer.unobserve(e,this.unreadedObserverCallback),this.unreaded.delete(e),this.readUnreaded()}readUnreaded(){if(this.readPromise)return;const e=this.getMiddleware();this.readPromise=St.Z.getFocusPromise().then((()=>vs(this,void 0,void 0,(function*(){if(!e())return;let t=Math.max(...Array.from(this.unreadedSeen));if(this.scrollable.loadedAll.bottom){const e=Math.max(...Object.keys(this.bubbles).map((e=>+e)));t>=e&&(t=Math.max((yield this.chat.getHistoryMaxId())||0,t))}this.unreaded.forEach(((e,i)=>{e<=t&&this.onUnreadedInViewport(i,e)}));const i=[];for(const e of this.unreadedSeen)vt(yield this.chat.getMessage(e))&&i.push(e);return this.managers.appMessagesManager.readMessages(this.peerId,i),this.unreadedSeen.clear(),ge.ZP&&this.log("will readHistory by maxId:",t),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId).catch((e=>{this.log.error("readHistory err:",e),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId)})).finally((()=>{e()&&(this.readPromise=void 0,this.unreadedSeen.size&&this.readUnreaded())}))}))))}onGoDownClick(){return vs(this,void 0,void 0,(function*(){if(!this.followStack.length)return void this.chat.setMessageId();const e=this.getMiddleware(),t=this.followStack.slice(),i=yield Promise.all(t.map((e=>this.chat.getMessage(e))));if(!e())return;t.forEach(((e,t)=>{const s=i[t],n=this.bubbles[e];let a=!0;if(n){const e=n.getBoundingClientRect();a=Ae.Z.height/2>e.top}else s&&(a=!1);a&&this.followStack.splice(this.followStack.indexOf(e),1)})),this.followStack.sort(((e,t)=>t-e));const s=this.followStack.pop();this.chat.setMessageId(s)}))}getBubbleByPoint(e){let t=Se(this.scrollable.container,e,"center");return t&&(t=(0,be.Z)(t,"bubble")),t}getGroupedBubble(e){return vs(this,void 0,void 0,(function*(){const t=yield this.managers.appMessagesManager.getMidsByAlbum(e);for(const e of t)if(this.bubbles[e]&&!this.skippedMids.has(e))return{bubble:this.bubbles[e],mid:e}}))}getBubbleGroupedItems(e){return Array.from(e.querySelectorAll(".grouped-item"))}getMountedBubble(e,t){return vs(this,void 0,void 0,(function*(){if(void 0===t&&(t=yield this.chat.getMessage(e)),!t)return;const i=t.grouped_id;if(i){const t=yield this.getGroupedBubble(i);if(t)return t.bubble=t.bubble.querySelector(`.document-container[data-mid="${e}"]`)||t.bubble,t}const s=this.bubbles[e];return s?{bubble:s,mid:e}:void 0}))}findNextMountedBubbleByMsgId(e,t){const i=(0,rt.Z)(this.bubbles,t?"desc":"asc");let s;s=t?t=>te{var t;return!!s(e)&&!!(null===(t=this.bubbles[e])||void 0===t?void 0:t.parentElement)}));return this.bubbles[n]}loadMoreHistory(e,t=!1){if(!this.peerId||this.chat.setPeerPromise||this.isHeavyAnimationInProgress||e&&(this.getHistoryTopPromise||this.scrollable.loadedAll.top)||!e&&(this.getHistoryBottomPromise||this.scrollable.loadedAll.bottom))return;const i=Object.keys(this.bubbles).map((e=>+e)).filter((e=>e>0&&!this.skippedMids.has(e))).sort(((e,t)=>e-t));i.length||i.push(0),e?(ge.ZP&&this.log("Will load more (up) history by id:",i[0],"maxId:",i[i.length-1],t),this.getHistory1(i[0],!0,void 0,void 0,t)):(ge.ZP&&this.log("Will load more (down) history by id:",i[i.length-1],t),this.getHistory1(i[i.length-1],!1,!0,void 0,t))}setScroll(){this.scrollable&&this.destroyScrollable(),this.scrollable=new T.ZP(null,"IM",300),this.setLoaded("top",!1,!1),this.setLoaded("bottom",!1,!1),this.scrollable.container.append(this.chatInner),this.scrollable.onAdditionalScroll=this.onScroll,this.scrollable.onScrolledTop=()=>this.loadMoreHistory(!0),this.scrollable.onScrolledBottom=()=>this.loadMoreHistory(!1),c.Z}updateUnreadByDialog(){return vs(this,void 0,void 0,(function*(){const e=yield this.chat.getHistoryStorage(),t=this.peerId===d.Z.myId?e.readMaxId:e.readOutboxMaxId;for(const e of this.unreadOut)if(e>0&&e<=t){const t=this.bubbles[e];if(t){if(this.unreadOut.delete(e),t.classList.contains("is-outgoing")||t.classList.contains("is-error"))continue;t.classList.remove("is-sent","is-sending","is-outgoing"),t.classList.add("is-read")}}}))}destroyBubble(e,t=+e.dataset.mid){e.middlewareHelper.destroy(),this.bubbles[t]===e&&delete this.bubbles[t],this.skippedMids.delete(t),this.firstUnreadBubble===e&&(this.firstUnreadBubble=null),this.bubbleGroups.removeAndUnmountBubble(e),this.observer&&(this.observer.unobserve(e,this.unreadedObserverCallback),this.unreaded.delete(e),this.observer.unobserve(e,this.viewsObserverCallback),this.viewsMids.delete(t),this.observer.unobserve(e,this.stickerEffectObserverCallback))}deleteMessagesByIds(e,t=!0,i){let n=!1;e.forEach((e=>{const t=this.bubbles[e];t&&(this.destroyBubble(t,e),n=!0)})),n&&(this.scrollable.ignoreNextScrollEvent(),t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),s.Z.checkAnimations(!1,this.chat.animationGroup),this.deleteEmptyDateGroups(),i||this.scrollable.onScroll())}pollExtendedMediaMessages(){const e=Array.from(this.extendedMediaMessages);return this.managers.appMessagesManager.getExtendedMedia(this.peerId,e)}setExtendedMediaMessagesPollInterval(){!this.pollExtendedMediaMessagesPromise&&this.extendedMediaMessages.size&&(this.pollExtendedMediaMessagesPromise=(0,at.Z)(3e4).then((()=>this.pollExtendedMediaMessages())).then((()=>this.setExtendedMediaMessagesPollInterval())))}setTopPadding(e=this.getMiddleware()){let t,i=!1;if(!this.isTopPaddingSet&&"scheduled"!==this.chat.type){const{clientHeight:e,scrollHeight:s}=this.scrollable.container;i=e===s,i&&(t=this.chatInner,t.style.paddingTop=e+"px",this.scrollable.setScrollTopSilently(s),this.isTopPaddingSet=!0)}return{isPaddingNeeded:i,unsetPadding:i?()=>{e()&&i&&(t.style.paddingTop="",this.isTopPaddingSet=!1)}:void 0}}renderNewMessage(e,t){const i=this._renderNewMessage(e,t);return this.renderNewPromises.add(i),i.catch(Ye.Z).finally((()=>{this.renderNewPromises.delete(i)})),i}_renderNewMessage(e,t){return vs(this,void 0,void 0,(function*(){if(!this.scrollable.loadedAll.bottom){const t=this.chat.setPeerPromise;if(t){const i=this.getMiddleware();t.then((()=>vs(this,void 0,void 0,(function*(){if(!i())return;const t=yield this.chat.getMessage(e.mid);i()&&this.renderNewMessage(t)}))))}return}if(this.chat.threadId&&(0,b.Z)(e,this.chat.isForum)!==this.chat.threadId)return;if(this.bubbles[e.mid])return;t||(t=this.scrolledDown&&(!this.scrollingToBubble||this.scrollingToBubble===this.getLastBubble()||this.scrollingToBubble===this.chatInner));const i=this.getMiddleware(),{isPaddingNeeded:s,unsetPadding:n}=this.setTopPadding(i),a=this.performHistoryResult({history:[e]},!1);return t&&a.then((()=>{if(!i())return;let t;"scheduled"===this.chat.type&&(t=this.bubbles[e.mid]);const a=t?this.scrollToBubbleEnd(t):this.scrollToEnd();s&&a.then(n)})),a}))}getLastBubble(){var e;const t=this.bubbleGroups.getLastGroup();return null===(e=null==t?void 0:t.lastItem)||void 0===e?void 0:e.bubble}scrollToBubble(e,t,i,s){const n=(0,be.Z)(e,"bubble");let a;if(e.parentElement||this.log.error("element is not connected",n),n&&"end"!==t){const e=this.bubbleGroups.getItemByBubble(n);e&&e.group.firstItem===e&&(0,Me.Z)(e.group.container)===(this.stickyIntersector?Ls:1)&&(a=e.group.container.parentElement)}const r=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper"),d=this.scrollable.scrollIntoViewNew({element:e,position:t,margin:4,forceDirection:i,forceDuration:s,axis:"y",getNormalSize:r?({rect:e})=>{let t=Ae.Z.height;return t-=this.container.offsetTop,t-=o.Z.isMobile||Ae.Z.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a,startCallback:e=>{if(this.onScroll(!0,e),this.updateGradient){const{gradientRenderer:t}=this.chat;null==t||t.toNextPosition(e.getProgress),this.updateGradient=void 0}}});return i===ue.f.Static&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop),d}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return vs(this,void 0,void 0,(function*(){if(e){this.scrollingToBubble=e;const t=this.getMiddleware();if(yield this.scrollToBubble(e,"end",void 0,void 0),!t())return;this.scrollingToBubble=void 0}}))}scrollToBubbleIfLast(e){return vs(this,void 0,void 0,(function*(){if(this.getLastBubble()===e)return this.scrollToEnd()}))}highlightBubble(e){const t="highlightTimeout";e.dataset[t]&&(clearTimeout(+e.dataset[t]),e.classList.remove("is-highlighted"),e.offsetWidth),e.classList.add("is-highlighted"),e.dataset[t]=""+setTimeout((()=>{e.classList.remove("is-highlighted"),delete e.dataset[t]}),2e3)}createDateBubble(e,t=new Date(1e3*e)){let i;const s=new Date;s.setHours(0,0,0,0);const n="scheduled"===this.chat.type;if(s.getTime()===t.getTime())i=(0,L.ag)(n?"Chat.Date.ScheduledForToday":"Date.Today");else if(n&&e===ke)i=(0,L.ag)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};t.getFullYear()!==s.getFullYear()&&(e.year="numeric"),i=new L.ZP.IntlDateElement({date:t,options:e}).element,n&&(i=(0,L.ag)("Chat.Date.ScheduledFor",[i]))}const a=document.createElement("div");a.className="bubble service is-date";const o=document.createElement("div");o.classList.add("bubble-content");const r=document.createElement("div");return r.classList.add("service-msg"),r.append(i),o.append(r),a.append(o),a}getDateForDateContainer(e){const t=new Date(1e3*e);return t.setHours(0,0,0),{date:t,dateTimestamp:t.getTime()}}getDateContainerByTimestamp(e){var t;const{date:i,dateTimestamp:s}=this.getDateForDateContainer(e);let n=this.dateMessages[s];if(n)return n;const a=this.createDateBubble(e,i),o=this.createDateBubble(e,i);o.classList.add("is-fake");const r=document.createElement("section");r.className="bubbles-date-group",r.append(a,o),n=this.dateMessages[s]={div:a,container:r,firstTimestamp:i.getTime()};const d=(0,rt.Z)(this.dateMessages,"asc"),l=d.length;let c,h=0;for(;hthis.setPeerTempId===d,u=(0,It.Z)(h,Es);i||(yield u(this.chat.onChangePeer(e,u)));const p=this.chat.type;("scheduled"===p||this.chat.isRestricted)&&(o=0);const f=yield u(this.chat.getHistoryStorage()),g="pinned"===p?yield u(this.managers.appMessagesManager.getPinnedMessagesMaxId(n,this.chat.threadId)):null!==(t=f.maxId)&&void 0!==t?t:0,v=void 0!==o;let b,y,w,S=0;if(!v)if(i||(y=this.chat.appImManager.getChatSavedPosition(this.chat)),y);else if(g){S=yield u(this.managers.appMessagesManager.getReadMaxIdIfUnread(n,this.chat.threadId));const e=yield u(this.chat.getDialogOrTopic());if(!S||i||e&&1===e.unread_count)o=g;else{const e=f.history.findSliceOffset(S);e&&e.slice.isEnd(ve.D.Bottom)&&(w=e.slice[e.offset-25]||e.slice[0]||S),b=!v,o=S}}const C=o!==g;if(void 0===r&&(yield u(this.chat.isStartButtonNeeded()))&&(r=m.gZ),i){a&&o&&this.followStack.push(a);const e=yield u(this.getMountedBubble(o));if(e)return v?(this.scrollToBubble(e.bubble,"center"),this.highlightBubble(e.bubble),this.chat.dispatchEvent("setPeer",o,!1)):g&&!C&&(this.scrollToEnd(),this.chat.dispatchEvent("setPeer",o,!0)),void 0!==r&&this.chat.input.setStartParam(r),null}else this.peerId&&(this.lazyLoadQueue.queueId=++Cs,this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)),this.followStack.length=0,this.passEntities={messageEntityBotCommand:(yield u(this.managers.appPeersManager.isAnyGroup(n)))||this.chat.isBot};ge.ZP&&c("setPeer peerId:",n,f,o,g);const L=null!=w?w:C||"scheduled"===p||this.chat.isRestricted?0:g;let E=0;if(i){const e=this.getBubbleByPoint("bottom");e&&(E=+e.dataset.mid),E<=0&&(E=Math.max(...Object.keys(this.bubbles).map((e=>+e))))}else this.isFirstLoad=!0,this.destroyResizeObserver();const I=this.chatInner,M=this.emptyPlaceholderBubble;this.cleanup();const P=this.chatInner=document.createElement("div");i?(P.className=I.className,P.classList.remove("disable-hover","is-scrolling")):P.classList.add("bubbles-inner"),this.lazyLoadQueue.lock();const Z=i||g&&C||v,T=E>0&&(!o||Ethis.performHistoryResult({history:y.mids},!0))),cached:!0,waitPromise:Promise.resolve()}:yield u(this.getHistory1(o,!0,C,L)),this.setPeerCached=A.cached,c.warn("got history");const{promise:_,cached:F}=A;F||i||(yield u(this.chat.finishPeerChange(v,C,o,r)),this.scrollable.container.textContent="",this.preloader.attach(this.container)),s.Z.lockGroup(this.chat.animationGroup);const D=u(_).then((()=>vs(this,void 0,void 0,(function*(){var e;c.warn("promise fulfilled");const t=Z?yield u(o?this.getMountedBubble(o):{bubble:this.getLastBubble()}):void 0;F&&!i&&(c.warn("finishing peer change"),yield u(this.chat.finishPeerChange(v,C,o,r)),c.warn("finished peer change")),this.preloader.detach(),this.resolveLadderAnimation&&(this.resolveLadderAnimation(),this.resolveLadderAnimation=void 0),this.setPeerCached=void 0;const a=this.scrollable;if(a.lastScrollDirection=0,a.lastScrollPosition=0,(0,H.Z)(a.container,P),M&&this.cleanupPlaceholders(M),this.attachPlaceholderOnRender&&this.attachPlaceholderOnRender(),!v&&this.chat.isPinnedMessagesNeeded()&&(null===(e=this.chat.topbar.pinnedMessage)||void 0===e||e.setCorrectIndex(0)),this.container.classList.toggle("has-groups",!!Object.keys(this.dateMessages).length),c.warn("mounted chat",this.chatInner===P,this.chatInner.parentElement,performance.now()-l),s.Z.unlockGroup(this.chat.animationGroup),s.Z.checkAnimations(!1,this.chat.animationGroup),this.lazyLoadQueue.unlock(),y)a.setScrollTopSilently(y.top);else if(Z){let e;if(k)a.setScrollTopSilently(99999);else if(x){const t=this.setTopPadding();t.isPaddingNeeded&&(e=t.unsetPadding),a.setScrollTopSilently(0)}let s,n=b&&this.firstUnreadBubble||(null==t?void 0:t.bubble);if((null==n?void 0:n.parentElement)||(n=this.findNextMountedBubbleByMsgId(o,!1)||this.findNextMountedBubbleByMsgId(o,!0)),n){const e=this.getLastBubble(),t=b?"start":C||v||e!==n?"center":"end";s="end"===t&&e===n&&i?this.scrollToEnd():this.scrollToBubble(n,t,i?void 0:ue.f.Static),!b&&v&&this.highlightBubble(n)}e&&(s||Promise.resolve()).then((()=>{e()}))}else a.setScrollTopSilently(99999);this.onRenderScrollSet(),this.onScroll();const d=Promise.all([D,(0,pe.e9)()]);if(d.then((()=>{a.checkForTriggers()})),this.chat.dispatchEvent("setPeer",o,!C),Promise.all([this.setFetchReactionsInterval(d),this.setFetchHistoryInterval({afterSetPromise:d,lastMsgId:o,samePeer:i,savedPosition:y,topMessage:g})]).then((()=>{c("scrolledAllDown:",a.loadedAll.bottom),a.loadedAll.bottom&&g&&!this.unreaded.size&&this.onScrolledAllDown()})),"chat"===p&&!this.chat.isForumTopic){const e=yield u(this.managers.appMessagesManager.getDialogOnly(n));(null==e?void 0:e.pFlags.unread_mark)&&this.managers.appMessagesManager.markDialogUnread(n,!0)}})))).catch((e=>{throw c.error("setPeer promise error:",e),h()||this.preloader.detach(),e}));return{cached:F,promise:D}}))}setFetchReactionsInterval(e){return vs(this,void 0,void 0,(function*(){const t=this.getMiddleware();if(this.chat.isChannel){const i=()=>vs(this,void 0,void 0,(function*(){if(!t())return;const e=[];for(const t in this.bubbles){let i=yield this.chat.getMessage(+t);"message"===(null==i?void 0:i._)&&(i=yield this.managers.appMessagesManager.getGroupsFirstMessage(i),e.push(i.mid))}(e.length?this.managers.appReactionsManager.getMessagesReactions(this.peerId,e):Promise.resolve()).then((()=>{setTimeout(i,1e4)}))}));Promise.all([e,(0,pe.e9)(),(0,at.Z)(500)]).then((()=>{i()}))}}))}setFetchHistoryInterval({lastMsgId:e,topMessage:t,afterSetPromise:i,savedPosition:s,samePeer:n}){return vs(this,void 0,void 0,(function*(){const e=this.getMiddleware(),t=this.peerId,n=yield this.managers.appMessagesManager.isFetchIntervalNeeded(t);if(!s&&!n)return;if(yield i,!e())return;const a=t.toChatId();e.onClean((()=>{this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(a)})),this.managers.apiUpdatesManager.subscribeToChannelUpdates(a)}))}onScrolledAllDown(){return vs(this,void 0,void 0,(function*(){if("chat"===this.chat.type||"discussion"===this.chat.type){const e=yield this.chat.getHistoryMaxId();this.managers.appMessagesManager.readHistory(this.peerId,e,this.chat.threadId,!0)}}))}finishPeerChange(){return vs(this,void 0,void 0,(function*(){const[e,t,i]=yield Promise.all([this.chat.isChannel,this.chat.canSend(),this.chat.isAnyGroup]);return()=>{this.chatInner.classList.toggle("has-rights",t),this.container.classList.toggle("is-chat-input-hidden",!t),this.chatInner.classList.toggle("is-chat",i),this.chatInner.classList.toggle("is-channel",e),this.createResizeObserver()}}))}renderMessagesQueue(e){return this.batchProcessor.addToQueue(e)}ejectBubbles(){for(const e of this.bubblesToEject)e.remove();this.bubblesToEject.clear()}groupBubbles(e){let t;"scheduled"===this.chat.type&&(t=new Set,e.forEach((({bubble:e,message:i})=>{const s=this.bubbleGroups.getItemByBubble(e),n=null==s?void 0:s.group;n&&s.message.date!==i.date&&(this.bubbleGroups.removeItem(s),t.add(n))}))),e.forEach((({bubble:e,message:t})=>{this.bubbleGroups.prepareForGrouping(e,t)}));const i=this.bubbleGroups.groupUngrouped(),s=Array.from(i).map((e=>{if(e.avatar)return;const t=e.firstItem;return t&&this.chat.isAvatarNeeded(t.message)?e.createAvatar(t.message):void 0})).filter(Boolean);if(t)for(const e of t)i.add(e);return{groups:[...i],avatarPromises:s}}getMiddleware(e){return this.middlewareHelper.get(e)}wrapMediaSpoiler({media:e,promise:t,middleware:i,attachmentDiv:s}){return vs(this,void 0,void 0,(function*(){if(yield t,!i())return;const{width:n,height:a}=s.style,o=yield(0,qi.ZP)({media:e,width:parseInt(n),height:parseInt(a),middleware:i,animationGroup:this.chat.animationGroup});i()&&s.append(o)}))}safeRenderMessage(e,t,i,s=!0,n){return vs(this,void 0,void 0,(function*(){if(!e||this.renderingMessages.has(e.mid)||this.bubbles[e.mid]&&!i)return;const a=this.getMiddleware().create(),o=a.get();let r;try{this.renderingMessages.add(e.mid);const d=document.createElement("div");d.middlewareHelper=a,d.dataset.mid=""+e.mid,d.dataset.peerId=""+e.peerId,d.dataset.timestamp=""+e.date,i&&(i.middlewareHelper.destroy(),this.skippedMids.delete(e.mid),this.bubblesToEject.add(i),this.bubblesToReplace.delete(i),this.bubblesToReplace.set(d,i),this.bubbleGroups.changeBubbleByBubble(i,d)),i=this.bubbles[e.mid]=d;let l=this.renderMessage(e,t,i,o);n&&(l=n(l,i));const c=l.then((e=>e&&o()?Object.assign(Object.assign({},e),{updatePosition:s}):void 0));if(this.renderMessagesQueue(c.catch((()=>{}))),r=yield c,!o())return;r||this.skippedMids.add(+e.mid)}catch(e){this.log.error("renderMessage error:",e)}return o()?(this.renderingMessages.delete(e.mid),r):void 0}))}renderMessage(e,t=!1,i,s){var n,a,r;return vs(this,void 0,void 0,(function*(){const l="message"===e._,c=l&&e.grouped_id;let h,u;const p=c?yield this.managers.appMessagesManager.getMessagesByAlbum(c):void 0,g="pinned"!==this.chat.type;if(c&&g){h=p.map((e=>e.mid));const t=Ps(h);if(e.mid!==t)return}l&&(u=c?p[0]:e);const v=this.chat.isOurMessage(e),y=document.createElement("div");y.classList.add("message","spoilers-container");const w=document.createElement("div");w.classList.add("bubble-content-wrapper");const S=document.createElement("div");S.classList.add("bubble-content"),i.classList.add("bubble"),w.append(S),i.append(w);let E=!v&&!e.pFlags.out&&(e.pFlags.unread||vt(e));if(!E&&this.chat.peerId.isAnyChat()){const t=yield this.managers.appMessagesManager.getReadMaxIdIfUnread(this.chat.peerId,this.chat.threadId);void 0!==t&&t"messageEntityEmoji"===e._)),t=T.replace(/\s/g,"").length;if(e.reduce(((e,t)=>e+t.length),0)===t){O=Math.min(Ms,e.length),R=o.Z.active.customEmoji;const t=Is[O];t&&(R=(0,Qe.C)(t,t),i.style.setProperty("--emoji-size",t+"px"))}}null!=R||(R=this.chat.appImManager.customEmojiSize);const H=(0,mt.ZP)(T,{entities:k,passEntities:this.passEntities,loadPromises:I,lazyLoadQueue:this.lazyLoadQueue,customEmojiSize:R,middleware:s,animationGroup:this.chat.animationGroup});let z,j=!0,G=!1;if(O){if(d.Z.settings.emoji.big){const e=1===O&&!k.find((e=>"messageEntityCustomEmoji"===e._))&&(yield this.managers.appStickersManager.getAnimatedEmojiSticker(T));1===O&&!_&&e?_={_:"messageMediaDocument",document:e}:(z=document.createElement("div"),z.classList.add("attachment","spoilers-container"),(0,F.Z)(z,H),S.append(z)),i.classList.add("is-message-empty","emoji-big"),G=!0,j=!1,D=!1}i.classList.add("can-have-big-emoji")}D&&(0,F.Z)(y,H);const V=(q=T,us.test(q));var q;const Q=de.setTime({chatType:this.chat.type,message:e,reactionsMessage:u});let Y;if(y.append(Q),S.prepend(y),V&&Q.classList.add("is-block"),l&&this.chat.isAllMessagesForum){const t=yield(0,gs.Z)({peerId:this.peerId,threadId:(0,b.Z)(e,this.chat.isForum),lastMsgId:e.mid,wrapOptions:{middleware:s},withIcons:!0}),{element:i}=t;Y=document.createElement("div"),Y.classList.add("topic-name-button-container"),Y.append(i)}if(l&&e.views){if(i.classList.add("channel-post"),!(null===(n=e.fwd_from)||void 0===n?void 0:n.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),S.prepend(e),i.classList.add("with-beside-button")}!e.pFlags.is_outgoing&&this.observer&&this.observer.observe(i,this.viewsObserverCallback)}const X=l&&e.reply_markup;let J="replyInlineMarkup"===(null==X?void 0:X._)&&X.rows;if(J&&(J=J.filter((e=>e.buttons.length))),J){const t=document.createElement("div");t.classList.add("reply-markup"),J.forEach((i=>{const s=i.buttons,n=document.createElement("div");n.classList.add("reply-markup-row"),s.forEach((t=>{let i,s=(0,mt.ZP)(t.text,{noLinks:!0,noLinebreaks:!0});switch(t._){case"keyboardButtonUrl":{const e=(0,mt.ZP)(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]});i=(0,Ee.Z)(e).firstElementChild,i.classList.add("is-link");break}case"keyboardButtonSwitchInline":i=document.createElement("button"),i.classList.add("is-switch-inline"),(0,C.fc)(i,(i=>{(0,Le.Z)(i);const s=e.viaBotId||e.fromId;let n;n=t.pFlags.same_peer?Promise.resolve(this.peerId):this.managers.appInlineBotsManager.checkSwitchReturn(s).then((e=>e||new Promise(((e,t)=>{const i=new M.Z(void 0,(t=>{e(t)}));i.addEventListener("close",(()=>{t()}))})))),n.then((e=>{const i=this.peerId===e?this.chat.threadId:void 0;this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchInlineQuery(e,i,s,t.query)}))}));break;case"keyboardButtonBuy":{const e="messageMediaInvoice"===_._?_:void 0;if(null==e?void 0:e.extended_media)break;i=document.createElement("button"),i.classList.add("is-buy"),(null==e?void 0:e.receipt_msg_id)&&(s=(0,L.ag)("Message.ReplyActionButtonShowReceipt"));break}case"keyboardButtonUrlAuth":{i=document.createElement("button"),i.classList.add("is-url-auth");const{peerId:s}=this,{mid:n}=e,{url:a,button_id:o}=t;(0,C.fc)(i,(()=>{const e=(0,Ht.Z)([i],!0);this.chat.appImManager.handleUrlAuth({peerId:s,mid:n,url:a,buttonId:o}).then((()=>{e()}))}));break}default:i=document.createElement("button")}if(!i)return;i.classList.add("reply-markup-button","rp","tgico");const a=document.createElement("span");a.classList.add("reply-markup-button-text"),"string"==typeof s?a.insertAdjacentHTML("beforeend",s):a.append(s),(0,A.Z)(i),i.append(a),n.append(i)})),n.childElementCount&&t.append(n)}));const s=!!t.childElementCount;s&&(0,C.fc)(t,(t=>{let i=t.target;if(i.classList.contains("reply-markup-button")||(i=(0,be.Z)(i,"reply-markup-button")),!i||i.classList.contains("is-link")||i.classList.contains("is-switch-inline")||i.classList.contains("is-buy")||i.classList.contains("is-url-auth"))return;(0,Le.Z)(t);const s=(0,Me.Z)(i),n=J[(0,Me.Z)(i.parentElement)];if(!n.buttons||!n.buttons[s])return void this.log.warn("no such button",n,s,e);const a=n.buttons[s];this.managers.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,a).then((e=>{"string"==typeof e.message&&e.message.length&&(0,we.Am)((0,mt.ZP)(e.message,{noLinks:!0,noLinebreaks:!0}))}))})),s&&(i.classList.add("with-reply-markup"),w.append(t))}const ee=e.pFlags.is_outgoing;if(v){(e.pFlags.unread||ee)&&this.unreadOut.add(e.mid);let t="";t=e.error?"is-error":ee?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}ee&&!e.error&&i.classList.add("is-outgoing");const te=l&&(yield this.managers.appMessagesManager.getMessageWithCommentReplies(e)),ie=!!te&&e.mid>0;ie&&i.classList.add("with-replies");const se=l&&e.fwd_from,ne=l&&e.fwdFromId,ae=this.chat.isOutMessage(e);let oe=S;const re=!(e.viaBotId||e.fromId!==d.Z.myId&&e.pFlags.out),le=!T;let ce;if(_){z=document.createElement("div"),z.classList.add("attachment"),le&&i.classList.add("is-message-empty");let t=!1;switch(_._){case"messageMediaPhoto":{const t=_.photo;if(le&&(j=!1),re&&i.classList.add("hide-name"),i.classList.add("photo"),g&&c&&1!==h.length){i.classList.add("is-album","is-grouped"),Qi({messages:p,attachmentDiv:z,middleware:this.getMiddleware(),isOut:v,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:I,autoDownload:this.chat.autoDownload});break}const n=!x.IS_ANDROID&&j&&!ie&&!1;n&&i.classList.add("with-media-tail");const a=(0,K.Z)({photo:t,message:e,container:z,withTail:n,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:I,autoDownloadSize:this.chat.autoDownload.photo});_.pFlags.spoiler&&I.push(this.wrapMediaSpoiler({media:t,promise:a,middleware:s,attachmentDiv:z}));break}case"messageMediaWebPage":{t=!0;const s=_.webpage;if("webPage"!==s._)break;const n=(0,ms.Z)(s.url);if("im"===(null==n?void 0:n.onclick)){const e={telegram_channel:"Chat.Message.ViewChannel",telegram_megagroup:"OpenGroup",telegram_bot:"Chat.Message.ViewBot"}[s.type]||"OpenMessage";ce=this.makeViewButton({text:e,asLink:!0}),ce.href=n.url,ce.setAttribute("onclick",`${n.onclick}(this)`)}i.classList.add("webpage");const a=document.createElement("div");a.classList.add("web");const r=document.createElement("div");let l,c;r.classList.add("quote");const h=s.photo;(h||s.document)&&(l=document.createElement("div"),l.classList.add("preview-resizer"),c=document.createElement("div"),c.classList.add("preview"),l.append(c));const u=document.createElement("div");u.classList.add("quote-text");const p=s.document;if(p)if("gif"===p.type||"video"===p.type||"round"===p.type){const t="round"===p.type?o.Z.active.round:o.Z.active.webpage;"round"===p.type?(i.classList.add("round"),c.classList.add("is-round")):i.classList.add("video"),(0,$.Z)({doc:p,container:c,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:ae,group:this.chat.animationGroup,loadPromises:I,autoDownload:this.chat.autoDownload,noInfo:e.mid<0})}else{const t=yield(0,Yi.Z)({message:e,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,loadPromises:I,sizeType:"documentName",searchContext:{useSearch:!1,peerId:this.peerId,inputFilter:{_:"inputMessagesFilterEmpty"}},fontSize:d.Z.settings.messagesTextSize});c.append(t),c.classList.add("preview-with-document"),u.classList.add("has-document")}let f;if(l&&u.append(l),s.site_name){const e=(0,mt.ZP)(s.url),t=(0,Ee.Z)(e).firstElementChild;t.classList.add("webpage-name");const i=document.createElement("strong");(0,F.Z)(i,(0,B.Z)(s.site_name)),t.textContent="",t.append(i),u.append(t),f=t}const m=(0,ft.Z)(s);if(m.textContent){const e=document.createElement("div");e.classList.add("title");const t=document.createElement("strong");(0,F.Z)(t,m),e.append(t),u.append(e),f=e}const g=(0,pt.Z)(s);if(g.textContent){const e=document.createElement("div");e.classList.add("text"),(0,F.Z)(e,g),u.append(e),f=e}if(r.append(u),h&&!p){i.classList.add("photo");const t=h.sizes[h.sizes.length-1];let s=!1;t.w===t.h&&f?(i.classList.add("is-square-photo"),s=!0,(0,ut.Z)(h,c,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),(0,K.Z)({photo:h,message:e,container:c,boxWidth:s?0:o.Z.active.webpage.width,boxHeight:s?0:o.Z.active.webpage.height,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:I,withoutPreloader:s,autoDownloadSize:this.chat.autoDownload.photo})}a.append(r),y.insertBefore(a,Q);break}case"messageMediaDocument":{const n=_.document;if(n.sticker){i.classList.add("sticker"),j=!1,G=!0,n.animated&&i.classList.add("sticker-animated");const e=o.Z.active,t=i.classList.contains("emoji-big"),r=t?e.emojiSticker:n.animated?e.animatedSticker:e.staticSticker;(0,ut.Z)(n,z,r.width,r.height),S.style.minWidth=z.style.width,S.style.minHeight=z.style.height,(0,W.ZP)({doc:n,div:z,middleware:s,lazyLoadQueue:this.lazyLoadQueue,group:this.chat.animationGroup,play:!0,loop:!0,emoji:t?T:void 0,withThumb:!0,loadPromises:I,isOut:ae,noPremium:null===(a=null==_?void 0:_.pFlags)||void 0===a?void 0:a.nopremium}),((0,ji.Z)(n)||t)&&(E||ee)&&this.observer.observe(i,this.stickerEffectObserverCallback)}else if("video"===n.type||"gif"===n.type||"round"===n.type){const t="round"===n.type;if(t&&(G=!0),(t||le)&&(j=!1),re&&i.classList.add("hide-name"),i.classList.add(t?"round":"video"),g&&c&&1!==h.length)i.classList.add("is-album","is-grouped"),Qi({messages:p,attachmentDiv:z,middleware:s,isOut:v,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:I,autoDownload:this.chat.autoDownload});else{const a=!x.IS_ANDROID&&!x.IS_APPLE&&!t&&j&&!ie&&!1;a&&i.classList.add("with-media-tail");const r=(0,$.Z)({doc:n,container:z,message:e,boxWidth:o.Z.active.regular.width,boxHeight:o.Z.active.regular.height,withTail:a,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,group:this.chat.animationGroup,loadPromises:I,autoDownload:this.chat.autoDownload,searchContext:t?{peerId:this.peerId,inputFilter:{_:"inputMessagesFilterRoundVoice"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0,noInfo:e.mid<0,noAutoplayAttribute:!!_.pFlags.spoiler});_.pFlags.spoiler&&I.push(this.wrapMediaSpoiler({media:n,promise:r,middleware:s,attachmentDiv:z}))}}else{const s=yield function({albumMustBeRenderedFull:e,message:t,bubble:i,messageDiv:s,chat:n,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:d,useSearch:l,sizeType:c,managers:h,fontWeight:u,fontSize:p,richTextFragment:f}){return Xi(this,void 0,void 0,(function*(){let l;const m=e?yield n.getMidsByMid(t.mid):[t.mid],g=m.map(((e,t)=>Xi(this,void 0,void 0,(function*(){const i=yield n.getMessage(e),s=yield(0,Yi.Z)({message:i,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:d,sizeType:c,managers:h,fontWeight:u,fontSize:p}),g=document.createElement("div");g.classList.add("document-container"),g.dataset.mid=""+e,g.dataset.peerId=""+i.peerId;const v=document.createElement("div");if(v.classList.add("document-wrapper"),i.message){const e=document.createElement("div");e.classList.add("document-message"),(0,F.Z)(e,f),v.append(e)}if(m.length>1){const e=document.createElement("div");e.classList.add("document-selection"),g.append(e),g.classList.add("grouped-item"),0===t&&(l=v)}return v.append(s),g.append(v),g})))),v=yield Promise.all(g);return s.append(...v),m.length>1&&i.classList.add("is-multiple-documents","is-grouped"),l}))}({albumMustBeRenderedFull:g,message:e,bubble:i,messageDiv:y,chat:this.chat,loadPromises:I,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,searchContext:"voice"===n.type||"audio"===n.type?{peerId:this.peerId,inputFilter:{_:"voice"===n.type?"inputMessagesFilterRoundVoice":"inputMessagesFilterMusic"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0,sizeType:"documentName",fontSize:d.Z.settings.messagesTextSize,richTextFragment:H});s&&(oe=s);const a=y.lastElementChild.querySelector(".document-message, .document, .audio");a&&a.append(Q),i.classList.remove("is-message-empty"),y.classList.add((["photo","pdf"].includes(n.type)?"document":n.type||"document")+"-message"),t=!0}break}case"messageMediaCall":{const e=_.action,s=document.createElement("div");s.classList.add("bubble-call",e.pFlags.video?"tgico-videocamera":"tgico-phone");const n=e.pFlags.video?"video":"voice";s.dataset.type=n;const a=document.createElement("div");a.classList.add("bubble-call-title"),(0,L.$d)(a,ae?e.pFlags.video?"CallMessageVideoOutgoing":"CallMessageOutgoing":e.pFlags.video?"CallMessageVideoIncoming":"CallMessageIncoming");const o=document.createElement("div");if(o.classList.add("bubble-call-subtitle"),void 0!==e.duration)o.append((0,Oe.Z)(e.duration));else{let t;switch(e.reason._){case"phoneCallDiscardReasonBusy":t="Call.StatusBusy";break;case"phoneCallDiscardReasonMissed":t="Chat.Service.Call.Missed";break;default:t="Chat.Service.Call.Cancelled"}o.classList.add("is-reason"),(0,L.$d)(o,t)}o.classList.add("tgico","arrow-"+(void 0!==e.duration?"green":"red")),s.append(a,o),t=!0,i.classList.remove("is-message-empty"),y.classList.add("call-message"),y.append(s);break}case"messageMediaContact":{const e=_,s=document.createElement("div");s.classList.add("contact"),s.dataset.peerId=""+e.user_id,t=!0;const n=document.createElement("div");n.className="contact-details";const a=document.createElement("div");a.className="contact-name";const o=[e.first_name,e.last_name].filter(Boolean).join(" ");a.append(o.trim()?(0,B.Z)(o):(0,L.ag)("AttachContact"));const r=document.createElement("div");r.className="contact-number",r.textContent=e.phone_number?"+"+(0,_e.u)(e.phone_number).formatted:"Unknown phone number",s.append(n),n.append(a,r);const d=new f.Z;d.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e.user_id.toPeerId(),peerTitle:o.trim()?void 0:L.ZP.format("AttachContact",!0)[0]}),d.classList.add("contact-avatar","avatar-54"),s.prepend(d),i.classList.remove("is-message-empty"),y.classList.add("contact-message"),y.append(s);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e,t=d.Z.managers){const i=new cs;return i.message=e,i.managers=t,i.setAttribute("peer-id",""+e.peerId),i.setAttribute("poll-id",e.media.poll.id),i.setAttribute("message-id",""+e.mid),i.render(),i}(e);y.prepend(t),y.classList.add("poll-message");break}case"messageMediaInvoice":{const t=_.pFlags.test,n=_.extended_media,a="messageExtendedMedia"===(null==n?void 0:n._),r="messageExtendedMediaPreview"===(null==n?void 0:n._);let d=a?n.media.photo||n.media.document:_.photo;const l=(0,Zt.Z)(_.total_amount,_.currency);let c,h;if(n){if(r&&(c=document.createElement("span"),c.classList.add("extended-media-buy","tgico-premium_lock"),z.classList.add("is-buy"),(0,L.$d)(c,"Checkout.PayPrice",[l]),void 0!==n.video_duration)){const e=document.createElement("span");e.classList.add("video-time"),e.textContent=(0,is.Z)(n.video_duration,!1),z.append(e)}}else{c=document.createElement(d?"span":"div");const e=document.createDocumentFragment(),i=(0,L.ag)(_.receipt_msg_id?"PaymentReceipt":t?"PaymentTestInvoice":"PaymentInvoice");i.classList.add("text-uppercase");const s=" ‎",n=document.createElement("span");if(n.classList.add("text-bold"),n.textContent=l+s,e.append(n,i),t&&_.receipt_msg_id){const t=document.createElement("span");t.classList.add("text-uppercase","pre-wrap"),t.append(s+"(Test)"),e.append(t)}(0,F.Z)(c,e)}if(r&&(n.thumb.w=n.w,n.thumb.h=n.h,d={_:"photo",access_hash:"",pFlags:{},date:0,dc_id:0,file_reference:[],id:0,sizes:[n.thumb]}),d){const t=n?o.Z.active.extendedInvoice:o.Z.active.invoice;"document"===d._?((0,$.Z)({doc:d,container:z,withTail:!1,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,loadPromises:I,boxWidth:t.width,boxHeight:t.height,group:this.chat.animationGroup,message:e}),i.classList.add("video")):((0,K.Z)({photo:d,container:z,withTail:!1,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,loadPromises:I,boxWidth:t.width,boxHeight:t.height,message:a?e:void 0}),i.classList.add("photo")),c&&(n||c.classList.add("video-time"),z.append(c))}else z=void 0;if(r){const{mid:t}=e;this.extendedMediaMessages.add(t),s.onClean((()=>{this.extendedMediaMessages.delete(t)})),this.setExtendedMediaMessagesPollInterval();const{width:i,height:n}=z.style,a=ps.Z.create({width:parseInt(i),height:parseInt(n),middleware:s,animationGroup:this.chat.animationGroup});z.append(a.canvas)}n||(h=document.createElement("div"),h.classList.add("bubble-primary-color"),(0,F.Z)(h,(0,B.Z)(_.title)));const u=a?void 0:(0,B.Z)(_.description);y.prepend(...[h,!d&&c,u].filter(Boolean)),u?i.classList.remove("is-message-empty"):j=!1,i.classList.add("is-invoice");break}default:z=void 0,i.classList.remove("is-message-empty"),y.append((0,L.ag)(L.nK),Q),this.log.warn("unrecognized media type:",_._,e)}!t&&z&&S.append(z)}G&&i.classList.add("just-media"),ce&&Q.before(ce);let he="";const ue=e.fromId!==d.Z.myId&&this.chat.isAnyGroup||e.viaBotId||e.pFlags.sponsored;if(ue||se||e.reply_to_mid||Y){let t,s;const n="peerChannel"===(null===(r=e.from_id)||void 0===r?void 0:r._)&&e.fromId===ne,a=!!e.viaBotId,o=se&&!se.from_id;e.viaBotId&&(s=document.createElement("span"),s.innerText="@"+(yield this.managers.appPeersManager.getPeerUsername(e.viaBotId)),s.classList.add("peer-title")),a&&i.classList.add("must-have-name");const c=ne||se;let h,u;if(o?(t=document.createElement("span"),(0,F.Z)(t,(0,B.Z)(se.from_name)),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new N.Z({peerId:ne||e.fromId,withPremiumIcon:!c,wrapOptions:Z}).element,l&&e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&(!this.chat.isAllMessagesForum||e.reply_to.reply_to_top_id)&&(h=yield de.setReply({chat:this.chat,bubble:i,bubbleContainer:S,message:e})),c)if(this.peerId===d.Z.myId||n||i.classList.add("forwarded"),e.savedFrom&&(he=e.savedFrom,t.dataset.savedFrom=he),u=document.createElement("div"),t.dataset.peerId=""+ne,this.peerId!==d.Z.myId&&this.peerId!==m.hj&&!n||G){const e=[t];if(G){const t=document.createElement("br");t.classList.add("hide-ol"),e.unshift(t)}u.append((0,L.ag)("ForwardedFrom",[e]))}else u.style.color=(0,U.Z)(ne,!1),u.classList.add("colored-name"),u.append(t);else if(!e.viaBotId)if(!G&&ue){u=document.createElement("div"),u.append(t);const i=yield this.managers.appPeersManager.getPeer(e.fromId),s=null==i?void 0:i.pFlags;s&&(s.scam||s.fake)&&u.append((0,ct.Z)(s.scam)),v||(u.style.color=(0,U.Z)(e.fromId,!1),u.classList.add("colored-name")),u.dataset.peerId=""+e.fromId}else i.classList.add("hide-name");if(e.viaBotId){u?u.append(" "):u=document.createElement("div");const e=document.createElement("span");e.append((0,L.ag)("ViaBot")," ",s),e.classList.add("is-via"),u.append(e)}Y&&(G?Y.classList.add("floating-part"):(u||(u=document.createElement("div")),u.append(Y),i.classList.remove("hide-name"))),u?(u.classList.add("name"),G?(oe.append(oe=document.createElement("div")),oe.classList.add("name-with-reply","floating-part")):u.classList.add("floating-part"),oe.append(u),G&&h&&oe.append(h)):G&&h&&h.classList.add("floating-part"),Y&&G&&(z?z.after(Y):this.log.error("no attachment div?",i,e))}else i.classList.add("hide-name");if("pinned"===this.chat.type&&(he=`${this.chat.peerId}_${e.mid}`),te&&te.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),he&&("pinned"===this.chat.type||se.saved_from_msg_id)&&this.peerId!==m.hj){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),S.append(e),i.dataset.savedFrom=he,i.classList.add("with-beside-button")}return i.classList.add(ae?"is-out":"is-in"),ie&&(de.renderReplies({bubble:i,bubbleContainer:S,message:te,messageDiv:y,loadPromises:I,lazyLoadQueue:this.lazyLoadQueue})?j=!0:i.classList.add("with-beside-replies")),l&&this.appendReactionsElementToBubble(i,e,u),j&&(i.classList.add("can-have-tail"),S.append(Ts())),P}))}appendReactionsElementToBubble(e,t,i,s){if(this.peerId.isUser(),!(null==i?void 0:i.reactions)||!i.reactions.results.length)return;const n=new nt;if(n.init(i,"block",e.middlewareHelper.get()),n.render(s),e.classList.contains("is-message-empty"))e.querySelector(".bubble-content-wrapper").append(n);else{const s=e.querySelector(".message");if(e.classList.contains("is-multiple-documents")){const e=s.lastElementChild;let a=e.querySelector(".document-message"),o=a&&a.querySelector(".time");o||(o=de.setTime({chatType:this.chat.type,message:t,reactionsMessage:i})),n.append(o),a||(a=document.createElement("div"),a.classList.add("document-message"),e.querySelector(".document-wrapper").prepend(a)),a.append(n)}else{const t=Array.from(e.querySelectorAll(".time")).pop();n.append(t),s.append(n)}}}prepareToSaveScroll(e){if(!this.chatInner.parentElement)return{};const t=this.log.bindPrefix("prepareToSaveScroll");t("save");const i=this.createScrollSaver(e);if(i.save(),this.getRenderedLength()&&!this.chat.setPeerPromise){const e=this.getViewportSlice();this.deleteViewportSlice(e,!0)}return{restoreScroll:()=>{t("restore"),i.restore(e),this.onRenderScrollSet(i.getSaved())},scrollSaver:i}}performHistoryResult(e,t){var i;return vs(this,void 0,void 0,(function*(){let s=e.history;s=s.slice(),this.needReflowScroll&&(Ie(this.scrollable.container),this.needReflowScroll=!1);const n=yield Promise.all(s.map((e=>"number"==typeof e?this.chat.getMessage(e):e))),a=[];if(!this.scrollable.loadedAll.bottom||!this.scrollable.loadedAll.top){let t=e.isEnd;if(!t){const e=yield this.chat.getHistoryStorage(),i=e.history.first,n=e.history.last;t={top:!1,bottom:!1,both:!1},!i.isEnd(ve.D.Bottom)||i.length&&!s.includes(i[0])||(t.bottom=!0),!n.isEnd(ve.D.Top)||n.length&&!s.includes(n[n.length-1])||(t.top=!0)}if(!t.bottom&&this.setPeerOptions){const{lastMsgId:e,topMessage:i,savedPosition:s}=this.setPeerOptions;this.setPeerOptions=void 0,(!e&&!s||this.bubbles[i]||e===i)&&(t.bottom=!0)}t.top&&a.push(this.setLoaded("top",!0)),t.bottom&&a.push(this.setLoaded("bottom",!0))}yield Promise.all(a);const o=n.map((e=>e?e.pFlags.local?this.processLocalMessageRender(e):this.safeRenderMessage(e,t):void 0));yield Promise.all(o),yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),null===(i=this.messagesQueueOnRenderAdditional)||void 0===i||i.call(this))}))}onRenderScrollSet(e){const t="has-sticky-dates";if(this.container.classList.contains(t)||this.preloader.detached&&(null!=e||(e={scrollHeight:this.scrollable.scrollHeight,clientHeight:this.scrollable.container.clientHeight}),e.scrollHeight===e.clientHeight))this.willScrollOnLoad=void 0;else{const e=this.getMiddleware(),i=()=>{e()&&this.container.classList.add(t)};this.willScrollOnLoad?i():setTimeout(i,600)}}requestHistory(e,t,i){return"chat"===this.chat.type||"discussion"===this.chat.type?this.managers.acknowledged.appMessagesManager.getHistory(this.peerId,e,t,i,this.chat.threadId):"pinned"===this.chat.type?this.managers.acknowledged.appMessagesManager.getSearch({peerId:this.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:t,backLimit:i}).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.history.map((e=>e.mid))})))}))):"scheduled"===this.chat.type?this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.slice().reverse()})))}))):void 0}animateAsLadder(e,t,i,s,n){return vs(this,void 0,void 0,(function*(){const a=this.log.bindPrefix("ladder");if(this.chat.setPeerPromise&&!this.resolveLadderAnimation)return a.warn("will be delayed"),void(this.resolveLadderAnimation=this.animateAsLadder.bind(this,e,t,i,s,n));if(!Object.keys(this.bubbles).length)return void a.warn("no bubbles");let o,r=(0,rt.Z)(this.bubbles,"desc");i&&t.length&&(r=r.filter((e=>!t.includes(e)))),o=s?n||Math.max(...r):e||Math.max(...r);const d=r.slice(r.findIndex((e=>o>e))),l=i?[]:[o],c=i?[]:r.slice(0,r.findIndex((e=>o>=e))).reverse();ge.ZP&&a("targeting mid:",o,n,e,d.map((e=>(0,yt.Z)(e))),c.map((e=>(0,yt.Z)(e))));const h=[];this.chatInner.classList.add("zoom-fading");const u=i?10:40,p=i?0:1,f=(e,t=0)=>{const i=(0,me.Z)();let s=0;return e.forEach(((n,o)=>{const r=this.bubbles[n];if(!r||this.skippedMids.has(n))return void a.warn("no bubble by mid:",n);s=(o+t||.1)*u;const d=r.lastElementChild,l=[d],c=this.bubbleGroups.getItemByBubble(r);if(c&&c.group.avatar&&c.group.lastItem===c&&l.push(c.group.avatar),l.forEach((e=>{e.classList.add("zoom-fade","can-zoom-fade"),e.style.transitionDelay=s+"ms"})),o===e.length-1){const e=t=>{t.target===d&&(i.resolve(),d.removeEventListener("transitionend",e))};d.addEventListener("transitionend",e)}h.push(...l)})),e.length||i.resolve(),{lastMsDelay:s,animationPromise:i}},m=f(d,p),g=f(l),v=f(c,p),b=[m.animationPromise,g.animationPromise,v.animationPromise],y=[m.lastMsDelay,g.lastMsDelay,v.lastMsDelay];let w;return this.onAnimateLadder&&(yield this.onAnimateLadder()),(0,fe.T2)((()=>{this.setStickyDateManually(),h.forEach((e=>{e.classList.remove("zoom-fade")}))})),(d.length||l.length||c.length)&&(w=Promise.all(b),(0,pe.YW)(w,Math.max(...y)+200).then((()=>{(0,fe.T2)((()=>{h.forEach((e=>{e.style.transitionDelay="",e.classList.remove("can-zoom-fade")})),this.chatInner.classList.remove("zoom-fading")}))}))),w}))}renderEmptyPlaceholder(e,t,i,s){return vs(this,void 0,void 0,(function*(){const i="empty-bubble-placeholder";let n,a;if(t.classList.add(i,i+"-"+e),"group"===e?n=(0,L.ag)("GroupEmptyTitle1"):"saved"===e?n=(0,L.ag)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?n=(0,L.ag)("NoMessages"):"noScheduledMessages"===e?n=(0,L.ag)("NoScheduledMessages"):"restricted"===e&&(n=document.createElement("span"),n.innerText=yield this.managers.appPeersManager.getRestrictionReasonText(this.peerId)),n.classList.add("center",i+"-title"),s.push(n),"group"===e)s.push((0,L.ag)("GroupEmptyTitle2")),a=[(0,L.ag)("GroupDescription1"),(0,L.ag)("GroupDescription2"),(0,L.ag)("GroupDescription3"),(0,L.ag)("GroupDescription4")];else if("saved"===e)a=[(0,L.ag)("ChatYourSelfDescription1"),(0,L.ag)("ChatYourSelfDescription2"),(0,L.ag)("ChatYourSelfDescription3"),(0,L.ag)("ChatYourSelfDescription4")];else if("greeting"===e){const e=(0,L.ag)("NoMessagesGreetingsDescription");e.classList.add("center",i+"-subtitle");const t=document.createElement("div");t.classList.add(i+"-sticker");const n=this.getMiddleware();yield this.managers.appStickersManager.getGreetingSticker().then((e=>vs(this,void 0,void 0,(function*(){if(!n())return;const i=[];return yield(0,W.ZP)({doc:e,div:t,middleware:n,lazyLoadQueue:this.lazyLoadQueue,group:this.chat.animationGroup,play:!0,loop:!0,withThumb:!0,loadPromises:i}),(0,C.fc)(t,(e=>{(0,Le.Z)(e),Mt.Jo.onMediaClick({target:e.target})})),Promise.all(i)})))),s.push(e,t)}a&&(s.push(...a.map((e=>{const t=document.createElement("span");return t.classList.add(i+"-list-item"),t.append(e),t}))),"group"===e?a.forEach((e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)})):"saved"===e&&a.forEach((e=>{const t=document.createElement("span");t.classList.add(i+"-list-bullet"),t.innerText="•",e.prepend(t)}))),s.length>1&&t.classList.add("has-description"),s.forEach((e=>e.classList.add(i+"-line")))}))}processLocalMessageRender(e,t,i=this.getMiddleware()){return vs(this,void 0,void 0,(function*(){const s=!!e.pFlags.sponsored,n=(0,It.Z)(i);return this.safeRenderMessage(e,!s,void 0,!1,(i=>vs(this,void 0,void 0,(function*(){const{bubble:a}=yield n(i);if(!a)return i;a.message=e,a.classList.add("is-group-last","is-group-first");const o=()=>{this.updatePlaceholderPosition===o&&(this.updatePlaceholderPosition=void 0),u[p](a)};s||(a.classList.add("bubble-first"),a.classList.remove("can-have-tail","is-in"));const r=[],l=this.chat.isBot;let c,u=this.container,p="append";if(this.chat.isRestricted)c=this.renderEmptyPlaceholder("restricted",a,e,r);else if(s){let i,s,n,o;a.classList.add("avoid-selection"),a.style.order="999999";const r=this.sponsoredMessage=e.sponsoredMessage,d=(0,R.Z)(r.from_id);r.channel_post?(i="OpenChannelPost",s=(0,wt.Z)(r.channel_post)):r.start_param||l?(i="Chat.Message.ViewBot",n=r.start_param):i=(yield this.managers.appPeersManager.isAnyGroup(d))?"Chat.Message.ViewGroup":"Chat.Message.ViewChannel",o=r.chat_invite?()=>{new Ve(r.chat_invite_hash,r.chat_invite)}:r.chat_invite_hash?()=>{const e={_:xe.JOIN_CHAT,invite:r.chat_invite_hash};this.chat.appImManager.processInternalLink(e)}:()=>{this.chat.appImManager.setInnerPeer({peerId:d,lastMsgId:s,startParam:n})};const c=this.makeViewButton({text:i});this.observer.observe(c,this.viewsObserverCallback),o&&(0,C.fc)(c,o),a.querySelector(".bubble-content").prepend(c),u=this.chatInner,p="append",t=!1}else if(l&&"message"===e._){const e=document.createElement("b");e.append((0,L.ag)("BotInfoTitle")),r.push(e,"\n\n"),u=this.chatInner,p="prepend"}else c=this.chat.isAnyGroup&&(yield n(this.managers.appPeersManager.getPeer(this.peerId))).pFlags.creator?this.renderEmptyPlaceholder("group",a,e,r):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",a,e,r):d.Z.myId===this.peerId?this.renderEmptyPlaceholder("saved",a,e,r):this.peerId.isUser()&&!l&&(yield n(this.chat.canSend()))&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",a,e,r):this.renderEmptyPlaceholder("noMessages",a,e,r);c&&(yield c),r.length&&a.querySelector(".message, .service-msg").prepend(...r);const f=!!this.messagesQueueOnRenderAdditional,m=this.setPeerCached&&!f;if(m){const e=a.firstElementChild;e.classList.add("no-transition"),this.chat.setPeerPromise&&this.chat.setPeerPromise.catch(Ye.Z).finally((()=>{e.classList.remove("no-transition")}))}if(void 0!==t||m||(t=!0),f||t?(this.updatePlaceholderPosition=o,this.onAnimateLadder=()=>{if(this.onAnimateLadder=void 0,!this.messagesQueuePromise)return(0,fe.AD)()}):this.chat.setPeerPromise?this.attachPlaceholderOnRender=()=>{this.attachPlaceholderOnRender=void 0,o()}:this.updatePlaceholderPosition=o,!f&&t){yield n((0,pe.e9)());const t=(0,rt.Z)(this.bubbles);(0,h.Z)(t,e.mid),this.animateAsLadder(e.mid,t,!1,0,0)}return a.middlewareHelper.onDestroy((()=>{this.emptyPlaceholderBubble===a&&(this.emptyPlaceholderBubble=void 0)})),this.emptyPlaceholderBubble=a,i}))))}))}makeViewButton(e){return(0,He.Z)("btn-primary btn-primary-transparent bubble-view-button",e)}generateLocalMessageId(e=0){const t=("scheduled"===this.chat.type?-1:0)+e,i=-Math.abs(t);return{id:i,mid:-Math.abs((0,wt.Z)(i))}}generateLocalFirstMessage(e,t,i=0){return vs(this,void 0,void 0,(function*(){const{id:s,mid:n}=this.generateLocalMessageId(i);let a={_:e?"messageService":"message",date:0,id:s,mid:n,peer_id:yield this.managers.appPeersManager.getOutputPeer(this.peerId),pFlags:{local:!0}};return e||(a.message=""),(0,Ze.Z)(a),t&&t(a),a=(yield this.managers.appMessagesManager.saveMessages([a],{storage:new Map}))[0],a.mid=n,a}))}getViewportSlice(){return(0,dt.Z)({overflowElement:this.scrollable.container,selector:".bubbles-date-group .bubble:not(.is-date)",extraSize:2*Math.max(700,Ae.Z.height)})}deleteViewportSlice(e,t){const{invisibleTop:i,invisibleBottom:s}=e,n=i.concat(s);if(!n.length)return;i.length&&(this.setLoaded("top",!1),this.getHistoryTopPromise=void 0),s.length&&(this.setLoaded("bottom",!1),this.getHistoryBottomPromise=void 0);const a=n.map((({element:e})=>+e.dataset.mid));let o;t||(o=this.createScrollSaver(!!i.length),o.save()),this.deleteMessagesByIds(a,!1,!0),o?o.restore():i.length&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop)}sliceViewport(e){if(x.IS_SAFARI||this.isHeavyAnimationInProgress&&!e)return;const t=this.getViewportSlice();this.deleteViewportSlice(t)}setLoaded(e,t,i=!0){return vs(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll[e]!==t)return this.log.bindPrefix("setLoaded")("change",e,t),this.scrollable.loadedAll[e]=t,this.scrollable.onScroll(),i?!this.chat.isRestricted&&("bottom"===e&&this.chat.isBroadcast&&this.toggleSponsoredMessage(t),"top"===e&&t&&this.chat.isBot)?this.renderBotPlaceholder():this.checkIfEmptyPlaceholderNeeded():void 0}))}toggleSponsoredMessage(e){return vs(this,void 0,void 0,(function*(){const t=this.log.bindPrefix("sponsored");t("checking");const{mid:i}=this.generateLocalMessageId(1);if(e){const e=this.getMiddleware((()=>this.scrollable.loadedAll.bottom&&this.getSponsoredMessagePromise===i)),i=this.getSponsoredMessagePromise=this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId()).then((i=>vs(this,void 0,void 0,(function*(){if(!e()||"messages.sponsoredMessagesEmpty"===i._)return;const s=i.messages[0];if(!s)return void t("no message");const n=this.generateLocalFirstMessage(!1,(e=>{e.message=s.message,e.from_id=s.from_id,e.entities=s.entities,e.pFlags.sponsored=!0,e.sponsoredMessage=s}),1);return Promise.all([n,this.getHistoryTopPromise,this.messagesQueuePromise]).then((([i])=>{if(e())return t("rendering",i),this.performHistoryResult({history:[i]},!1)}))})))).finally((()=>{this.getSponsoredMessagePromise===i&&(this.getSponsoredMessagePromise=void 0)}))}else t("clearing rendered",i),this.getSponsoredMessagePromise=void 0,this.deleteMessagesByIds([i])}))}renderBotPlaceholder(){return vs(this,void 0,void 0,(function*(){const e=this.log.bindPrefix("bot placeholder"),t=this.getMiddleware(),i=yield this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());e("getting profile, cached:",i.cached);const s=i.result.then((s=>vs(this,void 0,void 0,(function*(){var n;if(!t())return;if(!(null===(n=s.bot_info)||void 0===n?void 0:n.description))return e.warn("no description"),this.checkIfEmptyPlaceholderNeeded();const a=yield this.generateLocalFirstMessage(!1,(e=>{const t=s.bot_info;e.message=t.description,t.description_document&&(e.media={_:"messageMediaDocument",document:t.description_document,pFlags:{}}),t.description_photo&&(e.media={_:"messageMediaPhoto",photo:t.description_photo,pFlags:{}})}));return t()?(e("rendering"),{renderPromise:this.processLocalMessageRender(a,!i.cached).then((()=>{e("done")}))}):void 0}))));if(i.cached)return s}))}checkIfEmptyPlaceholderNeeded(){return vs(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll.top&&this.scrollable.loadedAll.bottom&&void 0===this.emptyPlaceholderBubble&&(this.chat.isRestricted||!(yield this.chat.getHistoryStorage()).count||Object.keys(this.bubbles).length&&!this.getRenderedLength()||"scheduled"===this.chat.type&&!Object.keys(this.bubbles).length)){this.log("inject empty peer placeholder");const e=yield this.generateLocalFirstMessage(!0);return{renderPromise:this.processLocalMessageRender(e)}}}))}getHistory1(e,t,i,s,n){const a=this.getMiddleware(n?void 0:()=>(t?this.getHistoryTopPromise:this.getHistoryBottomPromise)===r),o=this.getHistory(e,t,i,s,n,a),r=o.then((e=>e&&(e.waitPromise||e.promise)));return t?this.getHistoryTopPromise=r:this.getHistoryBottomPromise=r,r.then((()=>{a()&&(t?this.getHistoryTopPromise=void 0:this.getHistoryBottomPromise=void 0,n||"chat"===this.chat.type&&setTimeout((()=>{t?this.loadMoreHistory(!0,!0):this.loadMoreHistory(!1,!0)}),0))})),o}getHistory(e=0,t=!1,i=!1,s=0,n=!1,a){return vs(this,void 0,void 0,(function*(){const o=this.peerId,r=this.chat.isBroadcast,l=Math.min(30,Ae.Z.height/40|0);let c=r?20:Object.keys(this.bubbles).length>0?Math.max(35,l):l;if(void 0!==Ss){if(!Ss)return{cached:!1,promise:Promise.resolve(),waitPromise:Promise.resolve()};Object.keys(this.bubbles).length>0&&--Ss}let h,u=0;if(i&&(u=c,t||(c=0)),s&&!i)if("pinned"===this.chat.type)h=[s];else{const t=(yield this.chat.getHistoryStorage()).history.slice;if(t.length=0;--e){const t=yield this.chat.getMessage(h[e]);if(!(null==t?void 0:t.grouped_id))break;h.splice(e,1)}e=h[h.length-1]||e}}let p,f=yield this.requestHistory(e,c,u);this.log("i vin brehnya",f,e,c,u);const m=(null==h?void 0:h.length)&&!f.cached,g=this.isFirstLoad&&u&&!f.cached||m;m&&(p=f.result,f={cached:!0,result:Promise.resolve({history:h})}),this.isFirstLoad=!1;const v=e=>vs(this,void 0,void 0,(function*(){var t;if(null===(t=e.isEnd)||void 0===t?void 0:t.top){if("discussion"===this.chat.type){const t=yield this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId,this.chat.threadId);t&&e.history.push(t);const i=yield this.chat.getMidsByMid(this.chat.threadId);e.history.push(...i.reverse())}yield this.managers.appProfileManager.getProfileByPeerId(o)}})),b=e=>(0,pe.e9)().then((()=>v(e))).then((()=>(!m&&s&&e.history.unshift(s),this.performHistoryResult(e,t)))),y=e=>{const t=Promise.resolve(e).then((e=>{if(a&&!a())throw Es;if(!n)return b(e);this.scrollable.onScroll()}),(e=>{throw this.log.error("getHistory error:",e),e}));return t};let w,S;if(f.cached){if(n)return this.scrollable.onScroll(),null;S=!0,w=b(yield f.result)}else S=!1,w=y(f.result);const C=m?y(p):w;if(g&&d.Z.settings.animationsEnabled){let i=m?2:1;this.messagesQueueOnRenderAdditional=()=>{this.log("messagesQueueOnRenderAdditional"),--i||(this.messagesQueueOnRenderAdditional=void 0,this.animateAsLadder(s,h,m,u,e).then((()=>{setTimeout((()=>{this.loadMoreHistory(t,!0)}),0)})))}}else this.messagesQueueOnRenderAdditional=void 0;return n?null:{cached:S,promise:w,waitPromise:C}}))}setUnreadDelimiter(){return vs(this,void 0,void 0,(function*(){if("chat"!==this.chat.type&&"discussion"!==this.chat.type)return;if(this.attachedUnreadBubble)return;const e=yield this.chat.getHistoryMaxId();let t=yield this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId,this.chat.threadId);if(t&&(t=Object.keys(this.bubbles).filter((e=>!this.bubbles[e].classList.contains("is-out"))).map((e=>+e)).sort(((e,t)=>e-t)).find((e=>e>t)),t&&this.bubbles[t])){const i=this.bubbles[t];this.firstUnreadBubble&&this.firstUnreadBubble!==i&&(this.firstUnreadBubble.classList.remove("is-first-unread"),this.firstUnreadBubble=null),t!==e&&i.classList.add("is-first-unread"),this.firstUnreadBubble=i,this.attachedUnreadBubble=!0}}))}deleteEmptyDateGroups(){const e=this.stickyIntersector?Ls:1;let t=!1;for(const i in this.dateMessages){const s=this.dateMessages[i];s.container.childElementCount===e&&(s.container.remove(),this.stickyIntersector&&this.stickyIntersector.unobserve(s.container,s.div),delete this.dateMessages[i],t=!0)}t&&(Object.keys(this.dateMessages).length||this.container.classList.remove("has-groups"),this.checkIfEmptyPlaceholderNeeded(),this.setStickyDateManually())}}function Ts(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 11 20"),e.setAttributeNS(null,"width","11"),e.setAttributeNS(null,"height","20"),e.classList.add("bubble-tail");const t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS(null,"href","#message-tail-filled"),e.append(t),e}var ks=i(3003),xs=i(5128),As=i(8127);class _s{constructor(e,t,i,s){this.peerId=e,this.mid=t,this.unpin=i,this.onConfirm=s,this.construct()}construct(){return e=this,t=void 0,s=function*(){const{peerId:e,mid:t,unpin:i,onConfirm:s}=this;let n,a,o;const r=[],l=[],c=S.Z.MANAGERS,h=yield c.appPeersManager.canPinMessage(e),u=(n,a,o)=>{setTimeout((()=>{let n;n=i&&!t?h?c.appMessagesManager.unpinAllMessages(e):c.appMessagesManager.hidePinnedMessages(e):c.appMessagesManager.updatePinnedMessage(e,t,i,o,a),s&&n.then(s)}),300)};if(i){let i="UnpinMessage";t?(n="UnpinMessageAlertTitle",a="Chat.Confirm.Unpin"):h?(n="Popup.Unpin.AllTitle",a="Chat.UnpinAllMessagesConfirmation",o=[""+((yield c.appMessagesManager.getPinnedMessagesCount(e))||1)]):(n="Popup.Unpin.HideTitle",a="Popup.Unpin.HideDescription",i="Popup.Unpin.Hide"),r.push({langKey:i,isDanger:!0,callback:u})}else{n="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(r.push({langKey:t,callback:e=>u(0,!1,!e.size)}),(yield c.appChatsManager.isBroadcast(e.toChatId()))?a="PinMessageAlertChannel":(a="PinMessageAlert",l.push({text:"PinNotify",checked:!0}))):(a="PinMessageAlertChat",e===d.Z.myId?r.push({langKey:t,callback:u}):(r.push({langKey:t,callback:e=>u(0,!e.size)}),l.push({text:"PinAlsoFor",textArgs:[yield(0,Kt.Z)({peerId:e})],checked:!0})))}(0,S.x)(r),new As.Z("popup-delete-chat",{peerId:e,titleLangKey:n,descriptionLangKey:a,descriptionLangArgs:o,buttons:r,checkboxes:l}).show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var Fs=i(1962);function Ds(e=window.getSelection()){if(!(null==e?void 0:e.rangeCount))return!0;const t=e.getRangeAt(0);return!(!t.collapsed&&t.START_TO_END)}var Rs=i(2312),Bs=i(1447),Ns=i(671),Os=i(3174);function Us(e,t,i){return d.Z.managers.appStickersManager.preloadAnimatedEmojiSticker(e).then((({doc:s})=>{if(s)return Rs.Z.downloadMedia({media:s}).then((n=>{return a=this,r=void 0,l=function*(){const a=o.Z.active.emojiSticker,r=(0,Ns.tB)(e),d=yield Bs.Z.loadAnimationWorker({container:void 0,animationData:n,width:null!=t?t:a.width,height:null!=i?i:a.height,name:"doc"+s.id,autoplay:!1,loop:!1,toneIndex:r,group:"none"});d.addEventListener("firstFrame",(()=>{(0,Os.O)(s,d.canvas[0],r),d.remove()}),{once:!0})},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(a,r||[])).next())}));var a,r,d,l}))}))}var Hs=i(5772);class zs extends As.Z{constructor(e,t,i,s){super("popup-report-messages-confirm",{noTitle:!0,descriptionLangKey:"ReportInfo",buttons:[{langKey:"ReportChat",callback:()=>{a.isValid()&&(s&&s(),this.managers.appMessagesManager.reportMessages(e,t,i,a.value).then((e=>{e&&(0,we.bC)({langPackKey:"ReportSentInfo"})})))}}],body:!0});const n=document.createElement("div");(0,Hs.Z)({div:n,emoji:zs.STICKER_EMOJI,width:100,height:100}).then((({render:e})=>e)).finally((()=>{this.show()})),this.header.replaceWith(n);const a=new E.ZP({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});a.input.addEventListener("input",(()=>{this.buttons[0].element.toggleAttribute("disabled",!a.isValid())})),this.body.append(a.container)}}zs.STICKER_EMOJI="👮‍♀️";class js extends As.Z{constructor(e,t,i){super("popup-report-messages",{titleLangKey:"ChatTitle.ReportMessages",buttons:[],body:!0}),t=t.slice();const s=[["ReportChatSpam","inputReportReasonSpam"],["ReportChatViolence","inputReportReasonViolence"],["ReportChatChild","inputReportReasonChildAbuse"],["ReportChatPornography","inputReportReasonPornography"],["ReportChatOther","inputReportReasonOther"],["ReportChatPersonalDetails","inputReportReasonPersonalDetails"],["ReportChatIllegalDrugs","inputReportReasonIllegalDrugs"]];s.forEach((e=>{const t=(0,He.Z)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)}));const n=Us(zs.STICKER_EMOJI);(0,C.fc)(this.body,(a=>{const o=(0,be.Z)(a.target,"btn-primary"),r=s[(0,Me.Z)(o)][1];n.then((()=>{this.hide(),new zs(e,t,r,i)}))}),{listenerSetter:this.listenerSetter}),this.buttonsEl.style.marginTop=".5rem",this.show()}}class Gs extends As.Z{constructor(){super("popup-sponsored",{titleLangKey:"Chat.Message.Sponsored.What",descriptionLangKey:"Chat.Message.Ad.Text",descriptionLangArgs:[(0,L.ag)("Chat.Message.Sponsored.Link")],buttons:[{langKey:"OK",isCancel:!0},{langKey:"Chat.Message.Ad.ReadMore",callback:()=>{window.open(L.ZP.format("Chat.Message.Sponsored.Link",!0))},isCancel:!0}],scrollable:!0}),this.scrollable.append(this.description),this.show()}}var Vs=i(6008),Ks=i(8936),Ws=i(3061),$s=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class qs extends S.Z{constructor(e){super("popup-reacted-list",{closable:!0,overlayClosable:!0,body:!0}),this.message=e,this.init()}init(){return $s(this,void 0,void 0,(function*(){const e=this.middlewareHelper.get(),t=yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message);if(!e())return;const i=yield this.managers.appMessagesManager.canViewMessageReadParticipants(t);if(!e())return;const s=new nt,n=Object.assign(Object.assign({},t),{mid:0,id:0,reactions:Object.assign(Object.assign({_:"messageReactions",results:[]},t.reactions),{pFlags:{},recent_reactions:[]})});n.reactions.results=n.reactions.results.map((e=>Object.assign(Object.assign({},e),{chosen_order:void 0,pFlags:{}}))),s.init(n,"block",this.middlewareHelper.get()),s.render(),s.classList.add("no-stripe"),s.classList.remove("has-no-reactions"),s.append(this.btnClose),this.header.append(s);const a=document.createElement("div");a.classList.add("tabs-container"),a.dataset.animation="tabs";const o=new Map;let r=!1;if(n.reactions.results.length){const e=this.createFakeReaction("reactions",n.reactions.results.reduce(((e,t)=>e+t.count),0));s.prepend(e),n.reactions.results.unshift(e.reactionCount),r=!0}let d=!1;if(i)try{const i=yield this.managers.appMessagesManager.getMessageReadParticipants(t.peerId,t.mid);if(!e())return;if(!i.length)throw"";const a=this.createFakeReaction("checks",i.length);s.prepend(a),n.reactions.results.unshift(a.reactionCount),d=!0}catch(e){}n.reactions.results.forEach((i=>{const s=new T.ZP(void 0);s.container.classList.add("tabs-tab");const n=new Ii.Z({noShadow:!0,noDelimiter:!0}),r=es.default.createChatList({dialogSize:72});es.default.setListClickListener(r,(()=>{this.hide()}),void 0,!1,!0),n.content.append(r),s.container.append(n.container);const d="checks"!==i.reaction,l="checks"===i.reaction;["checks","reactions"].includes(i.reaction)&&(i.reaction=void 0);const c=(0,Qe.C)(24,24);let h;const u=new Ks.Z({scrollable:s,getPromise:()=>$s(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(t,void 0,i.reaction,h,d,l);return h=s.nextOffset,yield Promise.all(s.combined.map((({peerId:t,reaction:i})=>$s(this,void 0,void 0,(function*(){const{dom:s}=es.default.addDialogNew({peerId:t,autonomous:!0,container:r,avatarSize:"abitbigger",rippleEnabled:!1,meAsSaved:!1});if(i){const t=document.createElement("div");if(t.classList.add("reacted-list-reaction-icon"),"reactionEmoji"===i._){const s=yield this.managers.appReactionsManager.getReactionCached(i.emoticon);(0,W.ZP)({doc:s.static_icon,div:t,width:24,height:24,middleware:e})}else"reactionCustomEmoji"===i._&&t.append((0,$e.Z)({docIds:[i.document_id],customEmojiSize:c,middleware:e}));s.listEl.append(t)}(0,H.Z)(s.lastMessageSpan,(0,Ws.Z)(yield this.managers.appUsersManager.getUser(t.toUserId())))}))))),!h}))});o.set(s.container,u),a.append(s.container)})),this.body.append(a);const l=(0,Vs.X)(s,a,((e,t)=>{if(e===s.childElementCount-1)return!1;const i=s.children[e],n=l.prevId();-1!==n&&s.children[n].setIsChosen(!1),i.setIsChosen(!0),o.get(t).load()}),void 0,void 0,void 0,this.listenerSetter);l(0,!1),this.show()}))}createFakeReaction(e,t){const i=new et;i.init("block",this.middlewareHelper.get()),i.reactionCount={_:"reactionCount",count:t,reaction:e},i.setCanRenderAvatars(!1),i.renderCounter();const s=document.createElement("div");return s.classList.add("reaction-counter","reaction-sticker-icon","tgico-"+e),i.prepend(s),i}}const Qs="btn-menu-reactions",Ys=Qs+"-reaction",Xs=!x.IS_SAFARI;class Js{constructor(e,t,i){this.managers=e,this.type=t,this.onScroll=()=>{this.reactionsMap.forEach(((e,t)=>{this.onScrollProcessItem(t,e)}))},this.onMouseMove=e=>{var t;const i=(0,be.Z)(e.target,Ys);if(!i)return;const s=this.reactionsMap.get(i);if(!s)return;if(!(null===(t=s.appear)||void 0===t?void 0:t.paused))return;const n=s.select;n&&n.paused&&(n.autoplay=!0,n.restart())};const n=this.widthContainer=document.createElement("div");n.classList.add(Qs+"-container"),n.classList.add(Qs+"-container-"+t);const a=this.container=document.createElement("div");a.classList.add(Qs);const o=this.scrollable="vertical"===t?new T.ZP(void 0):new T.v7(void 0);a.append(o.container),o.onAdditionalScroll=this.onScroll,o.setListeners(),o.container.classList.add("no-scrollbar"),this.reactionsMap=new Map,this.animationGroup=`CHAT-MENU-REACTIONS-${Date.now()}`,s.Z.setOverrideIdleGroup(this.animationGroup,!0),c.Z||a.addEventListener("mousemove",this.onMouseMove),(0,C.fc)(a,(e=>{const t=(0,be.Z)(e.target,Ys);if(!t)return;const i=this.reactionsMap.get(t);i&&this.managers.appReactionsManager.sendReaction(this.message,i.reaction)})),n.append(a),this.middleware=null!=i?i:(0,Ce.k)()}init(e){this.message=e;const t=this.middleware.get(),i=this.managers.appReactionsManager.getAvailableReactionsByMessage(e);(0,We.Z)(i,(e=>{if(!t()||!e.length)return;e.forEach((e=>{e.pFlags.premium&&!d.Z.premium||this.renderReaction(e)}));const s=()=>{this.container.classList.add("is-visible")};i instanceof Promise?(0,fe.T2)(s):s()}))}cleanup(){this.middleware.clean(),this.scrollable.removeListeners(),this.reactionsMap.clear(),s.Z.setOverrideIdleGroup(this.animationGroup,!1),s.Z.checkAnimations(!0,this.animationGroup,!0)}canUseAnimations(){return d.Z.settings.animationsEnabled&&!x.IS_MOBILE}renderReaction(e){const t=document.createElement("div");t.classList.add(Ys);const i=document.createElement("div");i.classList.add(Ys+"-scale");const s=document.createElement("div");let n;s.classList.add(Ys+"-appear"),this.canUseAnimations()&&(n=document.createElement("div"),n.classList.add(Ys+"-select","hide"));const a={selectWrapper:n,appearWrapper:s,reaction:{_:"reactionEmoji",emoticon:e.reaction}};this.reactionsMap.set(t,a);const o=this.middleware.get(),r=26*(c.Z?1:1.25),d={width:r,height:r,skipRatio:1,needFadeIn:!1,withThumb:!1,group:this.animationGroup,middleware:o};if(this.canUseAnimations()){let t=!0;(0,W.ZP)(Object.assign({doc:e.appear_animation,div:s,play:!0},d)).then((({render:e})=>e)).then((e=>{(0,Ze.Z)(e),a.appear=e,e.addEventListener("enterFrame",(o=>{e.maxFrame===o&&i.then((e=>{(0,Ze.Z)(e),s.classList.add("hide"),n.classList.remove("hide"),t&&(a.select=e,t=!1)}),Ye.Z)}))}),Ye.Z);const i=(0,W.ZP)(Object.assign({doc:e.select_animation,div:n},d)).then((({render:e})=>e)).then((e=>((0,Ze.Z)(e),Bs.Z.waitForFirstFrame(e)))).catch(Ye.Z)}else delete d.needFadeIn,delete d.withThumb,(0,W.ZP)(Object.assign({doc:e.static_icon,div:s},d));i.append(s),n&&i.append(n),t.append(i),this.scrollable.append(t)}onScrollProcessItem(e,t){const i=e.firstElementChild,s=(0,ze.Z)(e,this.scrollable.container);let n;if(s)if(s.overflow.left||s.overflow.right){const e=Math.abs(s.rect.left-s.rect.right);n="scale("+Math.min(Math.pow(e,2)/Math.pow(34,2),1)+")"}else n="";else{if(!t.appearWrapper.classList.contains("hide")||!t.appear)return;t.select&&t.select.stop(),t.appear.stop(),t.appear.autoplay=!0,t.appearWrapper.classList.remove("hide"),t.selectWrapper.classList.add("hide"),n=""}Xs&&(i.style.transform=n)}}var en=i(1483),tn=i(2353),sn=i(6690),nn=i(3709),an=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class on{constructor(e,t){this.chat=e,this.managers=t,this.onContextMenu=e=>{let t,i;try{i=(0,be.Z)(e.target,"bubble-content-wrapper"),t=i?i.parentElement:(0,be.Z)(e.target,"bubble")}catch(e){}if(!t||t.classList.contains("bubble-first"))return;let s=this.element;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),s&&s.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0);let n=+t.dataset.mid;n&&(()=>{an(this,void 0,void 0,(function*(){const a=this.isSponsored=n<0;this.isSelectable=this.chat.selection.canSelectBubble(t),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!Ds(),this.isAnchorTarget="A"===this.target.tagName&&("_blank"===this.target.target||this.target.classList.contains("anchor-url")),this.isUsernameTarget="A"===this.target.tagName&&this.target.classList.contains("mention");const o=yield this.chat.getMidsByMid(n);if(this.chat.selection.isSelecting&&!i){if(a)return;if(o.length>1){const e=this.chat.selection.isMidSelected(this.peerId,n)?n:o.find((e=>this.chat.selection.isMidSelected(this.peerId,e)));e&&(n=e)}}this.isOverBubble=!!i;const r=(0,be.Z)(this.target,"grouped-item");this.isTargetAGroupedItem=!!r,this.mid=r?+r.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=t.message||(yield this.chat.getMessage(this.mid)),this.albumMessages=this.message.grouped_id?yield this.managers.appMessagesManager.getMessagesByAlbum(this.message.grouped_id):void 0,this.noForwards=!a&&!(yield this.managers.appMessagesManager.canForward(this.message)),this.viewerPeerId=void 0,this.canOpenReactedList=void 0,this.linkToMessage=yield this.getUrlToMessage(),this.selectedMessagesText=yield this.getSelectedMessagesText();const d=yield this.init();if(!d)return;s=d.element;const{cleanup:l,destroy:c,menuPadding:h,reactionsMenu:u,reactionsMenuPosition:p}=d;let f=!1;if(u){const e="is-visible";if(f=u.container.classList.contains(e),f&&u.container.classList.remove(e),"horizontal"===p){const e=s.offsetWidth,t=(e-8)/34%1,i=.65;if(t{u&&u.container.classList.remove("is-visible"),this.mid=0,this.peerId=void 0,this.target=null,this.viewerPeerId=void 0,this.canOpenReactedList=void 0,l(),setTimeout((()=>{c()}),300)})),f&&u.container.classList.add("is-visible")}))})()},this.onSendScheduledClick=()=>an(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,C.tH)(this.chat.selection.selectionSendNowBtn):new Fs.Z(this.peerId,yield this.chat.getMidsByMid(this.mid))})),this.onReplyClick=()=>{this.chat.input.initMessageReply(this.mid)},this.onFaveStickerClick=e=>{const t=this.message.media.document.id;this.managers.appStickersManager.faveSticker(t,e)},this.onEditClick=()=>{this.chat.input.initMessageEditing(this.mid)},this.onCopyClick=()=>an(this,void 0,void 0,(function*(){Ds()?(0,ht.T)(this.selectedMessagesText):document.execCommand("copy")})),this.onCopyAnchorLinkClick=()=>{(0,ht.T)(this.target.href)},this.onCopyLinkClick=()=>{const{url:e,isPrivate:t}=this.linkToMessage,i=t?"LinkCopiedPrivateInfo":"LinkCopied";(0,we.Am)(L.ZP.format(i,!0)),(0,ht.T)(e)},this.onPinClick=()=>{new _s(this.peerId,this.mid)},this.onUnpinClick=()=>{new _s(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.managers.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.managers.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>an(this,void 0,void 0,(function*(){if(this.chat.selection.isSelecting)(0,C.tH)(this.chat.selection.selectionForwardBtn);else{const e=this.peerId,t=this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid);new M.Z({[e]:t})}})),this.onSelectClick=()=>{this.chat.selection.toggleByElement((0,be.Z)(this.target,"grouped-item")||(0,be.Z)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>an(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,C.tH)(this.chat.selection.selectionDeleteBtn):new xs.Z(this.peerId,this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid),this.chat.type)})),this.listenerSetter=new ce.Z,this.attachListenerSetter=new ce.Z,this.middleware=(0,Ce.k)()}attachTo(e){this.attachListenerSetter.removeAll(),c.Z?(0,C.fc)(e,(e=>{this.chat.selection.isSelecting||(this.chat.log("touchend",e),!e.target.closest([".name",".peer-title",".reply",".document","audio-element","avatar-element","a",".bubble-beside-button","replies-element","[data-saved-from]:not(.bubble)","poll-element",".attachment",".reply-markup-button"].join(", "))&&((0,Le.Z)(e),this.onContextMenu(e)))}),{listenerSetter:this.attachListenerSetter}):(0,Lt.E)({element:e,callback:this.onContextMenu,listenerSetter:this.attachListenerSetter})}cleanup(){this.listenerSetter.removeAll(),this.reactionsMenu&&this.reactionsMenu.cleanup(),this.middleware.clean()}destroy(){this.cleanup(),this.attachListenerSetter.removeAll()}filterButtons(e){return an(this,void 0,void 0,(function*(){return this.isSponsored?e.filter((e=>e.isSponsored)):(0,tn.Z)(e,(e=>an(this,void 0,void 0,(function*(){let t;return this.chat.selection.isSelecting&&!e.withSelection?t=!1:(this.isOverBubble||c.Z,t=yield e.verify()),!!t}))))}))}setButtons(){const e=e=>an(this,void 0,void 0,(function*(){var t;const i=null===(t=this.message.media)||void 0===t?void 0:t.document;if(!(null==i?void 0:i.sticker))return!1;const s=yield this.managers.acknowledged.appStickersManager.getFavedStickersStickers();if(!s.cached)return!1;const n=(yield s.result).some((e=>e.id===i.id));return e?!n:n}));this.buttons=[{icon:"send2",text:"MessageScheduleSend",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&!this.message.pFlags.is_outgoing},{icon:"send2",text:"Message.Context.Selection.SendNow",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&this.isSelected&&!this.chat.selection.selectionSendNowBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"schedule",text:"MessageScheduleEditTime",onClick:()=>{this.chat.input.scheduleSending((()=>{(0,Ze.Z)(this.message),this.managers.appMessagesManager.editMessage(this.message,this.message.message,{scheduleDate:this.chat.input.scheduleDate,entities:this.message.entities}),this.chat.input.onMessageSent(!1,!1)}),new Date(1e3*this.message.date))},verify:()=>"scheduled"===this.chat.type},{icon:"reply",text:"Reply",onClick:this.onReplyClick,verify:()=>an(this,void 0,void 0,(function*(){return(yield this.chat.canSend())&&!this.message.pFlags.is_outgoing&&!!this.chat.input.messageInput&&"scheduled"!==this.chat.type}))},{icon:"favourites",text:"AddToFavorites",onClick:this.onFaveStickerClick.bind(this,!1),verify:()=>e(!0)},{icon:"favourites",text:"DeleteFromFavorites",onClick:this.onFaveStickerClick.bind(this,!0),verify:()=>e(!1)},{icon:"edit",text:"Edit",onClick:this.onEditClick,verify:()=>an(this,void 0,void 0,(function*(){return(yield this.managers.appMessagesManager.canEditMessage(this.message,"text"))&&!!this.chat.input.messageInput}))},{icon:"copy",text:"Copy",onClick:this.onCopyClick,verify:()=>!(this.noForwards||!this.message.message||this.isTextSelected||this.isAnchorTarget&&this.message.message===this.target.innerText)},{icon:"copy",text:"Chat.CopySelectedText",onClick:this.onCopyClick,verify:()=>!this.noForwards&&!!this.message.message&&this.isTextSelected},{icon:"copy",text:"Message.Context.Selection.Copy",onClick:this.onCopyClick,verify:()=>an(this,void 0,void 0,(function*(){if(!this.isSelected||this.noForwards)return!1;for(const[e,t]of this.chat.selection.selectedMids){const i=`${e}_${"scheduled"===this.chat.type?"scheduled":"history"}`;for(const e of t)if((yield this.managers.appMessagesManager.getMessageFromStorage(i,e)).message)return!0}return!1})),notDirect:()=>!0,withSelection:!0},{icon:"copy",text:"CopyLink",onClick:this.onCopyAnchorLinkClick,verify:()=>this.isAnchorTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Username",onClick:()=>{(0,ht.T)(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{(0,ht.T)(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>an(this,void 0,void 0,(function*(){return(yield this.managers.appPeersManager.isChannel(this.peerId))&&!this.message.pFlags.is_outgoing}))},{icon:"pin",text:"Message.Context.Pin",onClick:this.onPinClick,verify:()=>an(this,void 0,void 0,(function*(){return!this.message.pFlags.is_outgoing&&"messageService"!==this.message._&&!this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))&&"scheduled"!==this.chat.type}))},{icon:"unpin",text:"Message.Context.Unpin",onClick:this.onUnpinClick,verify:()=>an(this,void 0,void 0,(function*(){return this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))}))},{icon:"download",text:"MediaViewer.Context.Download",onClick:()=>{Rs.Z.downloadToDisc({media:(0,bt.Z)(this.message)})},verify:()=>{var e,t;if(!(0,nn.Z)(this.message)||this.noForwards)return!1;let i=!1;if(null===(e=this.message.media)||void 0===e?void 0:e.photo)i=!0;else{if(!(null===(t=this.message.media)||void 0===t?void 0:t.document))return!1;i=!0}let s=!!c.Z;return i&&(s||(s=!!((0,be.Z)(this.target,"document")||(0,be.Z)(this.target,"audio")||(0,be.Z)(this.target,"media-sticker-wrapper")||(0,be.Z)(this.target,"media-photo")||(0,be.Z)(this.target,"media-video")))),i&&s}},{icon:"checkretract",text:"Chat.Poll.Unvote",onClick:this.onRetractVote,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return t&&t.chosenIndexes.length&&!t.pFlags.closed&&!t.pFlags.quiz}},{icon:"stop",text:"Chat.Poll.Stop",onClick:this.onStopPoll,verify:()=>an(this,void 0,void 0,(function*(){var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return(yield this.managers.appMessagesManager.canEditMessage(this.message,"poll"))&&t&&!t.pFlags.closed&&!this.message.pFlags.is_outgoing}))},{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>!(this.noForwards||"scheduled"===this.chat.type||this.message.pFlags.is_outgoing&&this.message.fromId!==m.yF||"messageService"===this.message._)},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.chat.selection.selectionForwardBtn&&this.isSelected&&!this.chat.selection.selectionForwardBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"flag",text:"ReportChat",onClick:()=>{new js(this.peerId,[this.mid])},verify:()=>an(this,void 0,void 0,(function*(){return!this.message.pFlags.out&&"message"===this.message._&&!this.message.pFlags.is_outgoing&&(yield this.managers.appPeersManager.isChannel(this.peerId))})),notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick,verify:()=>!this.message.action&&!this.isSelected&&this.isSelectable,notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,notDirect:()=>!0,withSelection:!0},{onClick:()=>{if(this.viewerPeerId)this.chat.appImManager.setInnerPeer({peerId:this.viewerPeerId});else{if(!this.canOpenReactedList)return!1;new qs(this.message)}},verify:()=>an(this,void 0,void 0,(function*(){var e,t;return!this.peerId.isUser()&&(!!(null===(t=null===(e=this.message.reactions)||void 0===e?void 0:e.recent_reactions)||void 0===t?void 0:t.length)||(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)))})),notDirect:()=>!0,localName:"views"},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>an(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canDeleteMessage(this.message)}))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.chat.selection.selectionDeleteBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"info",text:"Chat.Message.Sponsored.What",onClick:()=>{new Gs},verify:()=>!1,isSponsored:!0},{text:"Loading",onClick:()=>{this.emojiInputsPromise.then((e=>{new P.Z(e,!0).show()}))},verify:()=>!!this.getUniqueCustomEmojisFromMessage().length,notDirect:()=>!0,localName:"emojis"}]}getUniqueCustomEmojisFromMessage(){const e=[],t=this.albumMessages&&(0,Pt.Z)(this.albumMessages)||this.message,i=t.entities;if(i){const t=i.filter((e=>"messageEntityCustomEmoji"===e._));e.push(...t.map((e=>e.document_id)))}const s=t.reactions;if(s){const t=s.results.filter((e=>"reactionCustomEmoji"===e.reaction._));e.push(...t.map((e=>e.reaction.document_id)))}return(0,sn.Z)(e)}init(){return an(this,void 0,void 0,(function*(){this.cleanup(),this.setButtons();const e=yield this.filterButtons(this.buttons);if(!e.length)return;const t=this.element=yield(0,ks.Z)({buttons:e,listenerSetter:this.listenerSetter});t.id="bubble-contextmenu",t.classList.add("contextmenu");const i=e.find((e=>"views"===e.localName));if(i){const e=this.message.reactions,t=null==e?void 0:e.recent_reactions,s=!!(null==t?void 0:t.length),n=(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message))?(yield this.managers.appPeersManager.getPeer(this.peerId)).participants_count:void 0,a=e?e.results.reduce(((e,t)=>e+t.count),0):void 0;i.element.classList.add("tgico-"+(s?"reactions":"checks"));const o=new L.ZP.IntlElement({key:s?void 0===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted":"NobodyViewed",args:s?void 0===n?[a]:[n,n]:void 0,element:i.textElement});let r;r=s?void 0===n?(0,L.ag)("Chat.Context.ReactedFast",[a]):(0,L.ag)(t.length===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted",[t.length,n]):(0,L.ag)("Loading"),r.classList.add("btn-menu-item-text-fake"),i.element.append(r);const d=22,l=3,c=1.125;o.element.style.visibility="hidden",o.element.style.paddingRight=s?c*Math.min(l,t.length)+"rem":"1rem";const h=this.middleware.get();this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message).then((e=>{if(!h())return;r&&r.remove();const a=e.combined,u=void 0===n?e.reactionsCount:s?a.filter((e=>e.reaction)).length:a.length;let p;if(1===a.length)p=new N.Z({peerId:a[0].peerId,onlyFirstName:!0,dialog:!1}).element,(!s||e.readParticipants.length<=1)&&(this.viewerPeerId=a[0].peerId);else if(s){const e=u===a.length||void 0===n;p=(0,L.ag)(e?"Chat.Context.ReactedFast":"Chat.Context.Reacted",e?[u]:[u,a.length])}else a.length?p=(0,L.ag)("MessageSeen",[a.length]):o.element.style.visibility="";if(p&&(p.style.paddingRight=c*Math.min(l,u)+"rem",p.classList.add("btn-menu-item-text-fake"),i.element.append(p)),a.length){const e=new se({avatarSize:d});e.render(t?t.map((e=>(0,R.Z)(e.peer_id))):a.map((e=>e.peerId))),i.element.append(e.container),this.canOpenReactedList=!0}}))}let s,n,a;if(!("message"!==this.message._||this.chat.selection.isSelecting||this.message.pFlags.is_outgoing||this.message.pFlags.is_scheduled||this.message.pFlags.local)){a=x.IS_APPLE||c.Z?"horizontal":"vertical",n=this.reactionsMenu=new Js(this.managers,a,this.middleware),n.init(yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message));const e=44,t=0;s="vertical"===a?{top:t,left:e}:{top:e,right:0,left:t}}const o=e.find((e=>"emojis"===e.localName));if(o){o.element.classList.add("is-multiline"),o.element.parentElement.insertBefore(document.createElement("hr"),o.element);const e=()=>{null!=s||(s={}),s.bottom=24},t=this.getUniqueCustomEmojisFromMessage(),i=this.emojiInputsPromise=(0,me.Z)();yield this.managers.appEmojiManager.getCachedCustomEmojiDocuments(t).then((s=>an(this,void 0,void 0,(function*(){const n=t=>an(this,void 0,void 0,(function*(){const s=new Map;t.forEach((e=>{e&&!s.has(e.stickerSetInput.id)&&s.set(e.stickerSetInput.id,e.stickerSetInput)}));const n=[...s.values()];if(i.resolve(n),1===s.size){const t=yield this.managers.acknowledged.appStickersManager.getStickerSet(n[0]),i=t.result.then((e=>{const t=(0,L.ag)("MessageContainsEmojiPack",[(0,B.Z)(e.set.title)]);(0,H.Z)(o.textElement,t)}));return t.cached?i:void e()}(0,H.Z)(o.textElement,(0,L.ag)("MessageContainsEmojiPacks",[s.size]))}));if(!s.some((e=>!e)))return n(s);e(),this.managers.appEmojiManager.getCustomEmojiDocuments(t).then(n)}))))}return this.chat.container.append(t),{element:t,cleanup:()=>{this.cleanup(),n&&n.cleanup()},destroy:()=>{t.remove(),n&&n.widthContainer.remove()},menuPadding:s,reactionsMenu:n,reactionsMenuPosition:a}}))}getUrlToMessage(){return an(this,void 0,void 0,(function*(){if(this.peerId.isUser())return;let e;const{peerId:t,mid:i}=this,s=this.chat.threadId;"discussion"===this.chat.type&&(e=yield this.managers.appMessagesManager.getMessageByPeer(t,s));const n=yield this.managers.appPeersManager.getPeerUsername(e?e.fromId:t),a=(0,yt.Z)(i);let o="https://t.me/";return n?(o+=n,o+=e?`/${(0,yt.Z)(e.fwd_from.channel_post)}?comment=${a}`:s?`/${(0,yt.Z)(s)}/${a}`:"/"+a):(o+="c/"+t.toChatId(),o+=e?`/${a}?thread=${(0,yt.Z)(e.mid)}`:s?`/${(0,yt.Z)(s)}/${a}`:"/"+a),{url:o,isPrivate:!n}}))}getSelectedMessagesText(){return an(this,void 0,void 0,(function*(){if(!Ds())return"";const e=this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort(((e,t)=>e-t)):[this.mid];return(yield Promise.all(e.map((e=>an(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);return(null==t?void 0:t.message)?t.message+"\n":""})))))).join("")}))}}var rn=i(4329),dn=i.n(rn),ln=i(9043);class cn{constructor(e){this.sendMenuButtons=[{icon:"mute",text:"Chat.Send.WithoutSound",onClick:e.onSilentClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:e.onScheduleClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.SetReminder",onClick:e.onScheduleClick,verify:()=>"reminder"===this.type}],this.sendMenu=(0,ks.b)({buttons:this.sendMenuButtons,listenerSetter:e.listenerSetter}),this.sendMenu.classList.add("menu-send",e.openSide),(0,Lt.E)({element:e.onContextElement,callback:t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach((e=>{e.element.classList.toggle("hide",!e.verify())})),(0,Le.Z)(t),Et.Z.openBtnMenu(this.sendMenu))},listenerSetter:e.listenerSetter})}setPeerId(e){this.type=e===d.Z.myId?"reminder":"schedule"}}var hn=i(1293),un=i(9336),pn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class fn extends S.Z{constructor(e){super("popup-create-poll popup-new-media",{closable:!0,withConfirm:"Create",body:!0,title:"NewPoll"}),this.chat=e,this.tempId=0,this.onSubmitClick=()=>{this.send()},this.onInput=e=>{const t=e.target,i=(0,ye.Z)(t,"LABEL"),s=(0,hn.Z)(t);s||(t.parentElement.classList.add("is-filled"),i.classList.remove("hidden-widget"),i.firstElementChild.removeAttribute("disabled")),!i.nextElementSibling&&!s&&this.questions.childElementCount<10&&this.appendMoreField(),this.handleChange()},this.onDeleteClick=e=>{const t=e.target,i=(0,ye.Z)(t,"LABEL"),s=(0,Me.Z)(i);this.correctAnswers&&this.correctAnswers[0][0]===s&&(this.correctAnswers=void 0),i.remove(),this.optionInputFields.splice(s,1),this.optionInputFields.forEach(((e,t)=>{e.options.labelOptions.length=0,e.options.labelOptions.push(t+1),L.ZP.weakMap.get(e.label.firstElementChild).update()})),this.handleChange()},this.construct()}construct(){return pn(this,void 0,void 0,(function*(){if(this.questionInputField=new E.ZP({placeholder:"AskAQuestion",label:"AskAQuestion",name:"question",maxLength:255}),this.listenerSetter.add(this.questionInputField.input)("input",(()=>{this.handleChange()})),this.optionInputFields=[],"scheduled"!==this.chat.type){const e=new cn({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending((()=>{this.send()}))},openSide:"bottom-left",onContextElement:this.btnConfirm});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.header.append(this.questionInputField.container);const e=document.createElement("hr"),t=document.createElement("div");t.classList.add("caption"),(0,L.$d)(t,"PollOptions"),this.questions=document.createElement("form"),this.questions.classList.add("poll-create-questions");const i=document.createElement("div");i.classList.add("poll-create-settings");const s=document.createElement("div");s.classList.add("caption"),(0,L.$d)(s,"Settings"),(yield this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))||(this.anonymousCheckboxField=new jt.Z({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new jt.Z({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new jt.Z({text:"NewPoll.Quiz",name:"quiz"}),this.listenerSetter.add(this.multipleCheckboxField.input)("change",(()=>{const e=this.multipleCheckboxField.input.checked;this.quizCheckboxField.input.toggleAttribute("disabled",e)})),this.listenerSetter.add(this.quizCheckboxField.input)("change",(()=>{const e=this.quizCheckboxField.input.checked;Array.from(this.questions.children).map((t=>{t.classList.toggle("radio-field",e)})),e||(this.correctAnswers=void 0,this.quizSolutionField.setValueSilently("")),n.forEach((t=>t.classList.toggle("hide",!e))),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()})),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const n=[],a=document.createElement("div");a.classList.add("caption"),(0,L.$d)(a,"AccDescrQuizExplanation");const o=document.createElement("hr"),r=document.createElement("div");r.classList.add("poll-create-questions"),this.quizSolutionField=new E.ZP({placeholder:"NewPoll.Explanation.Placeholder",label:"NewPoll.Explanation.Placeholder",name:"solution",maxLength:200}),this.listenerSetter.add(this.questionInputField.input)("input",(()=>{this.handleChange()}));const d=document.createElement("div");d.classList.add("subtitle"),(0,L.$d)(d,"AddAnExplanationInfo"),r.append(this.quizSolutionField.container,d),n.push(o,a,r),n.forEach((e=>e.classList.add("hide"))),this.body.parentElement.insertBefore(e,this.body),this.body.append(t,this.questions,document.createElement("hr"),s,i,...n),(0,C.fc)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new T.ZP(this.body),this.appendMoreField(),this.onEscape=()=>!this.getFilledAnswers().length,this.handleChange()}))}getFilledAnswers(){return Array.from(this.questions.children).map(((e,t)=>{const i=e.querySelector(".input-field-input");return i instanceof HTMLInputElement?i.value:(0,un.Z)(i,!1,!1).value})).filter((e=>!!e.trim()))}validate(){var e;const t=this.questionInputField.value;if(!t)return!1;if(t.length>255)return!1;if(this.quizCheckboxField.input.checked&&!(null===(e=this.correctAnswers)||void 0===e?void 0:e.length))return!1;const i=this.getFilledAnswers();if(i.length<2)return!1;if(i.find((e=>e.length>100)))return!1;const{value:s}=(0,un.Z)(this.quizSolutionField.input,!1,!1);return!(s.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){return pn(this,void 0,void 0,(function*(){const t=this.questionInputField.value,i=this.getFilledAnswers(),{value:s,entities:n}=(0,un.Z)(this.quizSolutionField.input,!0,!1);if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending((()=>{this.send(!0)}));this.hide();const a={};this.anonymousCheckboxField&&!this.anonymousCheckboxField.input.checked&&(a.public_voters=!0),this.multipleCheckboxField.input.checked&&(a.multiple_choice=!0),this.quizCheckboxField.input.checked&&(a.quiz=!0);const o={_:"poll",pFlags:a,question:t,answers:i.map(((e,t)=>({_:"pollAnswer",text:e,option:new Uint8Array([t])}))),id:void 0},r=yield this.chat.managers.appPollsManager.getInputMediaPoll(o,this.correctAnswers,s,n);this.chat.managers.appMessagesManager.sendOther(this.chat.peerId,r,Object.assign({},this.chat.getMessageSendingParams())),"reply"===this.chat.input.helperType&&this.chat.input.clearHelper(),this.chat.input.onMessageSent(!1,!1)}))}appendMoreField(){const e=this.tempId++,t=this.questions.childElementCount+1,i=new E.ZP({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(i.input)("input",this.onInput);const s=new Di.Z({text:"",name:"question"});s.main.append(i.container),(0,C.fc)(i.input,Le.Z,{listenerSetter:this.listenerSetter}),s.label.classList.add("hidden-widget"),s.input.disabled=!0,this.quizCheckboxField.input.checked||s.label.classList.remove("radio-field"),this.listenerSetter.add(s.input)("change",(()=>{if(s.input.checked){const e=(0,Me.Z)(s.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}}));const n=document.createElement("span");n.classList.add("btn-icon","tgico-close"),i.container.append(n),(0,C.fc)(n,this.onDeleteClick,{listenerSetter:this.listenerSetter,once:!0}),this.questions.append(s.label),this.scrollable.scrollIntoViewNew({element:this.questions.lastElementChild,position:"center"}),this.optionInputFields.push(i)}}var mn=i(7814);function gn(e){let t,i;return e instanceof HTMLVideoElement?(t=e.videoWidth,i=e.videoHeight):(t=e.naturalWidth,i=e.naturalHeight),(0,mn.Z)({media:e,mediaSize:(0,Qe.C)(t,i),boxSize:(0,Qe.C)(320,240),quality:.9})}var vn=i(9897),bn=i(2341);function yn(e){const t=e.src;return fetch(t).then((e=>e.arrayBuffer())).then((e=>{const t=new Uint8Array(e);let i=0;for(let e=0,s=t.length;e${Zn.Z})|(
)`,"g");class kn extends E.ZP{constructor(e){super(e),this.input.addEventListener("input",(()=>{this.updateInnerHTML(),this.onFakeInput()})),e.placeholder&&(0,L.$d)(this.inputFake,e.placeholder,void 0,"placeholder"),this.input.classList.add("scrollable","scrollable-y","no-scrollbar"),this.inputFake=document.createElement("div"),this.inputFake.contentEditable="true",this.inputFake.tabIndex=-1,this.inputFake.className=this.input.className+" input-field-input-fake"}onFakeInput(e=!0){var t;const{scrollHeight:i}=this.inputFake,s=+this.input.style.height.replace("px","");if(s===i)return;const n=Math.round(50*Math.log(Math.abs(i-s)));this.input.style.transitionDuration=`${n}ms`,e&&(null===(t=this.onChangeHeight)||void 0===t||t.call(this,i),this.input.style.height=i?i+"px":"");const a="is-changing-height";(0,De.Z)({element:this.input,className:a,forwards:!0,duration:n,onTransitionEnd:()=>{this.input.classList.remove(a)}})}updateInnerHTML(e=this.input.innerHTML){e=e.replace(//,"").replace(/().+?\/custom-emoji-element>/g,"$1"),Pn.Y&&(e=e.replace(Tn,"")),this.inputFake.innerHTML=e}setValueSilently(e,t){super.setValueSilently(e,t),this.updateInnerHTML(),t||this.onFakeInput()}}var xn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let An;function _n(){return An}class Fn extends S.Z{constructor(e,t,i,s){super("popup-send-photo popup-new-media",{closable:!0,withConfirm:"Modal.Send",confirmShortcutIsSendShortcut:!0,body:!0,title:!0,scrollable:!0}),this.chat=e,this.files=t,this.ignoreInputValue=s,this.onScroll=()=>{const{input:e}=this.messageInputField;this.scrollable.onAdditionalScroll(),e.scrollTop>0&&e.scrollHeight>130&&this.scrollable.container.classList.remove("scrolled-bottom")},this.onKeyDown=e=>{const t=e.target,{input:i}=this.messageInputField;if(t!==i){if("INPUT"===t.tagName||t.isContentEditable)return;i.focus(),(0,Ot.Z)(i)}},this.attachFile=e=>{const t=this.willAttach,i=this.shouldCompress(e.type),s=document.createElement("div");s.classList.add("popup-item");const n={file:e};(0,En.Z)(n,["scaledBlob","middlewareHelper","itemDiv","mediaSpoiler"]),n.middlewareHelper=this.middlewareHelper.get().create(),n.itemDiv=s;const a=i?this.attachMedia(n):this.attachDocument(n);return t.sendFileDetails.push(n),a.catch((e=>{s.style.backgroundColor="#000",console.error("error rendering file",e)}))},this.animationGroup="",this.construct(i)}construct(e){return xn(this,void 0,void 0,(function*(){this.willAttach={type:e,sendFileDetails:[],group:!0};const t=yield this.managers.apiManager.getLimit("caption");if(this.captionLengthMax=t,(0,C.fc)(this.btnConfirm,(()=>this.send()),{listenerSetter:this.listenerSetter}),"scheduled"!==this.chat.type){const e=new cn({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending((()=>{this.send()}))},openSide:"bottom-left",onContextElement:this.btnConfirm,listenerSetter:this.listenerSetter});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}const i=yield(0,Mn.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"image",text:"Popup.Attach.AsMedia",onClick:()=>this.changeType("media"),verify:()=>this.hasAnyMedia()&&"document"===this.willAttach.type},{icon:"document",text:"SendAsFile",onClick:()=>this.changeType("document"),verify:()=>1===this.files.length&&"document"!==this.willAttach.type},{icon:"document",text:"SendAsFiles",onClick:()=>this.changeType("document"),verify:()=>this.files.length>1&&"document"!==this.willAttach.type},{icon:"groupmedia",text:"Popup.Attach.GroupMedia",onClick:()=>this.changeGroup(!0),verify:()=>!this.willAttach.group&&this.canGroupSomething()},{icon:"groupmediaoff",text:"Popup.Attach.UngroupMedia",onClick:()=>this.changeGroup(!1),verify:()=>this.willAttach.group&&this.canGroupSomething()},{icon:"mediaspoiler",text:"EnablePhotoSpoiler",onClick:()=>this.changeSpoilers(!0),verify:()=>this.canToggleSpoilers(!0,!0)},{icon:"mediaspoiler",text:"Popup.Attach.EnableSpoilers",onClick:()=>this.changeSpoilers(!0),verify:()=>this.canToggleSpoilers(!0,!1)},{icon:"mediaspoileroff",text:"DisablePhotoSpoiler",onClick:()=>this.changeSpoilers(!1),verify:()=>this.canToggleSpoilers(!1,!0)},{icon:"mediaspoileroff",text:"Popup.Attach.RemoveSpoilers",onClick:()=>this.changeSpoilers(!1),verify:()=>this.canToggleSpoilers(!1,!1)}]});this.header.append(i),this.btnConfirm.remove(),this.mediaContainer=document.createElement("div"),this.mediaContainer.classList.add("popup-photo"),this.scrollable.container.append(this.mediaContainer);const s=this.inputContainer=document.createElement("div");s.classList.add("popup-input-container");const n=document.createElement("div");let a,o,r;n.classList.add("popup-input-inputs","input-message-container"),this.messageInputField=new kn({placeholder:"PreviewSender.CaptionPlaceholder",name:"message",withLinebreaks:!0,maxLength:this.captionLengthMax}),this.listenerSetter.add(this.scrollable.container)("scroll",this.onScroll),this.listenerSetter.add(this.messageInputField.input)("scroll",this.onScroll),this.messageInputField.input.classList.replace("input-field-input","input-message-input"),this.messageInputField.inputFake.classList.replace("input-field-input","input-message-input"),n.append(this.messageInputField.input,this.messageInputField.inputFake),s.append(n,this.btnConfirm),this.ignoreInputValue||(this.messageInputField.value=this.wasInputValue=this.chat.input.messageInputField.input.innerHTML,this.chat.input.messageInputField.value=""),this.container.append(s),this.attachFiles(),this.addEventListener("close",(()=>{this.files.length=0,this.willAttach.sendFileDetails.length=0,An===this&&(An=void 0)})),(0,Ln.Z)({buttons:[{icon:"mediaspoiler",text:"EnablePhotoSpoiler",onClick:()=>{this.applyMediaSpoiler(r)},verify:()=>o&&!r.mediaSpoiler},{icon:"mediaspoileroff",text:"DisablePhotoSpoiler",onClick:()=>{this.removeMediaSpoiler(r)},verify:()=>!(!o||!r.mediaSpoiler)}],listenTo:this.mediaContainer,listenerSetter:this.listenerSetter,findElement:e=>(a=(0,be.Z)(e.target,"popup-item"),o=a.classList.contains("popup-item-media"),r=this.willAttach.sendFileDetails.find((e=>e.itemDiv===a)),a)}),An=this}))}applyMediaSpoiler(e,t){return xn(this,void 0,void 0,(function*(){const i=e.middlewareHelper.get(),{width:s,height:n}=e.itemDiv.style;let a,o;if(e.itemDiv.classList.contains("album-item")){const{width:t,height:i}=e.itemDiv.parentElement.style,r=parseInt(t),d=parseInt(i);a=+s.slice(0,-1)/100*r,o=+n.slice(0,-1)/100*d}else a=parseInt(s),o=parseInt(n);const{url:r}=yield(0,mn.Z)({media:e.itemDiv.firstElementChild,boxSize:(0,Qe.C)(40,40),mediaSize:(0,Qe.C)(a,o),toDataURL:!0,quality:.2}),d=(0,In.o)(r),l={_:"photoStrippedSize",bytes:d,type:"i"};e.strippedBytes=d;const c={_:"photo",sizes:[l],id:0,access_hash:0,date:0,dc_id:0,file_reference:[]},h=yield(0,qi.ZP)({middleware:i,width:a,height:o,animationGroup:this.animationGroup,media:c});i()&&(t||h.classList.add("is-revealing"),e.mediaSpoiler=h,e.itemDiv.append(h),yield(0,fe.d1)(),i()&&(0,qi.MR)({mediaSpoiler:h,reveal:!1}))}))}removeMediaSpoiler(e){(0,qi.MR)({mediaSpoiler:e.mediaSpoiler,reveal:!0,destroyAfter:!0}),e.mediaSpoiler=void 0}appendDrops(e){this.body.append(e)}get type(){return this.willAttach.type}set type(e){this.willAttach.type=e}partition(){const[e,t]=v(this.willAttach.sendFileDetails,(e=>bn.Z.has(e.file.type)));return{media:e,files:t}}mediaCount(){return this.partition().media.length}hasAnyMedia(){return this.mediaCount()>0}canGroupSomething(){const{media:e,files:t}=this.partition();return e.length>1||t.length>1}canToggleSpoilers(e,t){let i="media"===this.willAttach.type&&this.hasAnyMedia();if(t&&i&&(i=1===this.files.length),i){const s=this.willAttach.sendFileDetails.filter((e=>bn.Z.has(e.file.type))),n=s.filter((e=>e.mediaSpoiler));i=!!t||s.length>1,i&&(i=e?s.length!==n.length:s.length===n.length)}return i}changeType(e){this.willAttach.type=e,this.attachFiles()}changeGroup(e){this.willAttach.group=e,this.attachFiles()}changeSpoilers(e){this.partition().media.forEach((t=>{e&&!t.mediaSpoiler?this.applyMediaSpoiler(t):!e&&t.mediaSpoiler&&this.removeMediaSpoiler(t)}))}addFiles(e){const t=e.filter((e=>!this.files.find((t=>t.lastModified===e.lastModified&&t.name===e.name&&t.size===e.size))));t.length&&(this.files.push(...t),this.attachFiles())}send(e=!1){if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending((()=>{this.send(!0)}));let t=this.messageInputField.value;if(t.length>this.captionLengthMax)return void(0,we.Am)(L.ZP.format("Error.PreviewSender.CaptionTooLong",!0));const i=this.willAttach;i.isMedia="media"===i.type||void 0;const{sendFileDetails:s,isMedia:n}=i,{peerId:a,input:o}=this.chat,{length:r}=s,d=this.chat.getMessageSendingParams();this.iterate((e=>{t&&e.length!==r&&(this.managers.appMessagesManager.sendText(a,t,Object.assign(Object.assign({},d),{clearDraft:!0})),t=void 0);const s=e.map((e=>Object.assign(Object.assign({},e),{file:e.scaledBlob||e.file,spoiler:!!e.mediaSpoiler}))),o=Object.assign(Object.assign({},i),{sendFileDetails:s});this.managers.appMessagesManager.sendAlbum(a,Object.assign(Object.assign(Object.assign({},d),{caption:t,isMedia:n,clearDraft:!0}),o)),t=void 0})),o.replyToMsgId=this.chat.threadId,o.onMessageSent(),this.wasInputValue=void 0,this.hide()}modifyMimeTypeForTelegram(e){return"image/webp"===e?"image/jpeg":e}scaleImageForTelegram(e,t,i){return xn(this,void 0,void 0,(function*(){const s=2560;let n,a=e.src;if("image/gif"!==t&&(Math.max(e.naturalWidth,e.naturalHeight)>s||i&&"image/webp"===t)){const{blob:i}=yield(0,mn.Z)({media:e,boxSize:(0,Qe.C)(s,s),mediaSize:(0,Qe.C)(e.naturalWidth,e.naturalHeight),mimeType:this.modifyMimeTypeForTelegram(t)});n=i,URL.revokeObjectURL(a),a=yield Cn.Z.invoke("createObjectURL",i),yield(0,Ut.cj)(e,a)}return n&&{url:a,blob:n}}))}attachMedia(e){return xn(this,void 0,void 0,(function*(){const{itemDiv:t}=e;t.classList.add("popup-item-media");const i=e.file;if(i.type.startsWith("video/")){const s=(0,wn.Z)();let n;s.src=e.objectURL=yield Cn.Z.invoke("createObjectURL",i),s.autoplay=!0,s.controls=!1,s.muted=!0,s.addEventListener("timeupdate",(()=>{s.pause()}),{once:!0}),t.append(s);try{yield(0,Sn.Z)(s)}catch(e){n=e}if(e.width=s.videoWidth,e.height=s.videoHeight,e.duration=Math.floor(s.duration),n)throw n;const a=s.webkitAudioDecodedByteCount;void 0!==a&&(e.noSound=!a);const o=yield function(e){return new Promise(((t,i)=>{e.onseeked=()=>{e.onseeked=()=>{gn(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=i,e.currentTime=Math.min(e.duration,1)}))}(s);e.thumb=Object.assign({url:yield Cn.Z.invoke("createObjectURL",o.blob)},o)}else{const s=new Image;t.append(s);const n=e.objectURL=yield Cn.Z.invoke("createObjectURL",i);yield(0,Ut.cj)(s,n);const a=e.file.type,o=yield this.scaleImageForTelegram(s,a,!0);if(o&&(e.objectURL=o.url,e.scaledBlob=o.blob),e.width=s.naturalWidth,e.height=s.naturalHeight,"image/gif"===i.type)return e.noSound=!0,Promise.all([yn(s).then((t=>{e.duration=Math.ceil(t)})),gn(s).then((t=>xn(this,void 0,void 0,(function*(){e.thumb=Object.assign({url:yield Cn.Z.invoke("createObjectURL",t.blob)},t)}))))]).then((()=>{}))}}))}attachDocument(e){return xn(this,void 0,void 0,(function*(){const{itemDiv:t}=e;t.classList.add("popup-item-document");const i=e.file,s=i.type.startsWith("image/"),n=i.type.startsWith("audio/");let a;if((s||n||i.size<2e7)&&(e.objectURL||(e.objectURL=yield Cn.Z.invoke("createObjectURL",i))),s){a=new Image,yield(0,Ut.cj)(a,e.objectURL);const t=yield this.scaleImageForTelegram(a,e.file.type);t&&(e.objectURL=t.url)}const o={_:"document",file:i,file_name:i.name||"",size:i.size,type:s?"photo":"doc"};let r;e.objectURL&&(r={url:e.objectURL,downloaded:i.size,type:m.Pt});const d=yield(0,Yi.Z)({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:o}},cacheContext:r});s&&(e.width=a.naturalWidth,e.height=a.naturalHeight),t.append(d)}))}shouldCompress(e){return"media"===this.willAttach.type&&bn.Z.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),!this.ignoreInputValue&&this.addEventListener("close",(()=>{this.wasInputValue&&(this.chat.input.messageInputField.value=this.wasInputValue)})),this.show())}setTitle(){const{willAttach:e,title:t,files:i}=this;let s;const n=[];if("document"===e.type)s="PreviewSender.SendFile",n.push(i.length);else{let e=0,t=0,a=0;i.forEach((i=>{i.type.startsWith("image/")?++e:i.type.startsWith("video/")?++t:++a})),[e,t,a].filter((e=>e>0)).length>1?(s="PreviewSender.SendFile",n.push(i.length)):e?(s="PreviewSender.SendPhoto",n.push(e)):t&&(s="PreviewSender.SendVideo",n.push(t))}(0,H.Z)(t,(0,L.ag)(s,n))}appendMediaToContainer(e){if(this.shouldCompress(e.file.type)){const t=(0,vn.Z)(e.width,e.height,384,320);e.itemDiv.style.width=t.width+"px",e.itemDiv.style.height=t.height+"px"}this.mediaContainer.append(e.itemDiv)}iterate(e){const{sendFileDetails:t}=this.willAttach;if(!this.willAttach.group)return void t.forEach((t=>e([t])));const i=t.length;for(let s=0;s{e.middlewareHelper.destroy()}));const n=e.map((e=>this.attachFile(e)));Promise.all(n).then((()=>{i.replaceChildren(),e.length&&(this.setTitle(),this.iterate((e=>{const t=this.shouldCompress(e[0].file.type);if(t&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map((e=>e.itemDiv))),$i({container:t,items:e.map((e=>({w:e.width,h:e.height}))),maxWidth:384,minWidth:100,spacing:4}),i.append(t)}else e.forEach((e=>{this.appendMediaToContainer(e)}));t&&e.forEach((e=>{const t=s.find((t=>t.file===e.file));t&&t.mediaSpoiler&&this.applyMediaSpoiler(e,!0)}))})))})).then((()=>{this.onRender(),this.onScroll()}))}}var Dn=i(6057);const Rn="keydown",Bn="active",Nn=["ArrowUp","ArrowDown"],On=["ArrowLeft","ArrowRight"];function Un({list:e,type:t,onSelect:i,once:s,waitForKey:n}){let a=(null==n?void 0:n.length)?new Set(n):void 0;const o=new Set("xy"===t?Nn.concat(On):"x"===t?On:Nn);let r;const d=()=>r||e.querySelector("."+Bn)||e.firstElementChild,l=(e,i)=>{if(r===e)return;let s=!1;r&&(s=!0,r.classList.remove(Bn)),r=e,r&&(r.classList.add(Bn),s&&p&&i&&(0,ue.Z)({container:p,element:r,position:"center",forceDuration:100,axis:"x"===t?"x":"y"}))},c=(t,i)=>{let s;return s=i?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,s};let h;h="xy"===t?(t,i)=>"ArrowUp"===i||"ArrowDown"===i?((t,i)=>{const s=i?"nextElementSibling":"previousElementSibling",n=i?"firstElementChild":"lastElementChild",a=t.getBoundingClientRect();let o=t[s]||e[n];for(;o!==t;){const t=o.getBoundingClientRect();if(t.x===a.x&&t.y!==a.y)break;o=o[s]||e[n]}return o})(t,"ArrowDown"===i):c(t,"ArrowRight"===i):(e,t)=>c(e,"ArrowRight"===t||"ArrowDown"===t);let u=i=>{const s=i.key;if(o.has(s)){if((0,Le.Z)(i),e.childElementCount>1){let e=d();e=h(e,s),l(e,!0)}}else("Enter"===s||"xy"!==t&&"Tab"===s)&&((0,Le.Z)(i),g(d()))};const p=(0,be.Z)(e,"scrollable");e.classList.add("navigable-list");const f=t=>{const i=(0,Ne.Z)(t.target,e);i&&l(i,!1)},m=t=>{(0,Le.Z)(t);const i=(0,Ne.Z)(t.target,e);i&&(l(i,!1),g(d()))},g=e=>{return t=this,n=void 0,o=function*(){const t=yield i(e);(void 0!==t?!t:s)&&y()},new((a=void 0)||(a=Promise))((function(e,i){function s(e){try{d(o.next(e))}catch(e){i(e)}}function r(e){try{d(o.throw(e))}catch(e){i(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}d((o=o.apply(t,n||[])).next())}));var t,n,a,o};let v=!1;const b=()=>{v||(v=!0,document.addEventListener(Rn,u,{capture:!0,passive:!1}),e.addEventListener("mousemove",f,{passive:!0}),(0,C.fc)(e,m))},y=()=>{v&&(v=!1,document.removeEventListener(Rn,u,{capture:!0}),e.removeEventListener("mousemove",f),(0,C.EN)(e,m))},w=()=>{a||l(e.firstElementChild,!1)};if(a){const e=u;u=t=>{a.has(t.key)&&((0,Le.Z)(t),document.removeEventListener(Rn,u,{capture:!0}),u=e,document.addEventListener(Rn,u,{capture:!0,passive:!1}),a=void 0,w())}}else w();return b(),{attach:b,detach:y,resetTarget:w}}var Hn=i(6385),zn=i(5953);class jn extends l.Z{constructor(e){super(!1),this.hidden=!0,this.onVisible=()=>{this.detach&&this.detach();const e=this.list,{attach:t,detach:i,resetTarget:s}=Un({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.attach=t,this.detach=i,this.resetTarget=s,x.IS_MOBILE||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},Hn.Z.pushItem(this.navigationItem)),this.addEventListener("hidden",(()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",i(),this.navigationItem&&(Hn.Z.removeItem(this.navigationItem),this.navigationItem=void 0)}),{once:!0})},(0,zn.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("autocomplete-helper","z-depth-1"),e.appendTo.append(this.container),this.attachNavigation(),this.controller&&this.controller.addHelper(this)}toggleListNavigation(e){e?this.attach&&this.attach():this.detach&&this.detach()}attachNavigation(){this.addEventListener("visible",this.onVisible)}toggle(e,t=!1,i){if(this.init)return;if(void 0===e&&(e=this.container.classList.contains("is-visible")&&!this.container.classList.contains("backwards")),this.hidden===e)return void(e||this.dispatchEvent("visible"));this.hidden=e,e?(this.navigationItem&&(Hn.Z.removeItem(this.navigationItem),this.navigationItem=void 0),!t&&this.controller&&this.controller.hideOtherHelpers(),this.detach&&this.detach()):(this.controller&&this.controller.hideOtherHelpers(this),this.dispatchEvent("visible"));const s=this.controller||e?0:2;e&&this.dispatchEvent("hiding"),(0,De.Z)({element:this.container,className:"is-visible",forwards:!e,duration:d.Z.settings.animationsEnabled&&!i?300:0,onTransitionEnd:()=>{this.hidden&&this.dispatchEvent("hidden")},useRafs:s})}}class Gn extends jn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>{return t=this,i=void 0,n=function*(){return!(yield Mt.Jo.onMediaClick({target:e},!0))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n},waitForKey:["ArrowUp","ArrowDown"]}),this.chat=i,this.managers=s,this.container.classList.add("stickers-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0),d.Z.dispatchEvent("choosing_sticker",!0)})),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(o.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0,this.listenerSetter.removeAll(),this.listenerSetter=void 0),d.Z.dispatchEvent("choosing_sticker",!1)}))}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),Us(e),this.managers.appStickersManager.getStickersByEmoticon(e).then((e=>{if(!t())return;this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();let s;this.lazyLoadQueue.clear(),s=e.length?new Promise((t=>{const s=[];e.forEach((e=>{i.append(this.superStickerRenderer.renderSticker(e,void 0,s))})),Promise.all(s).finally(t)})):Promise.resolve(),s.then((()=>{this.list.replaceWith(i),this.list=i,this.onChangeScreen||(this.onChangeScreen=()=>{const e=this.list.childElementCount*o.Z.active.popupSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},o.Z.addEventListener("changeScreen",this.onChangeScreen),this.listenerSetter=new ce.Z,(0,Gi.Z)({listenTo:this.container,listenerSetter:this.listenerSetter})),this.onChangeScreen(),this.toggle(!e.length),this.scrollable.scrollTop=0}))}))}init(){this.list=document.createElement("div"),this.list.classList.add("stickers-helper-stickers","super-stickers"),this.container.append(this.list),this.scrollable=new T.ZP(this.container),this.lazyLoadQueue=new le.Z,this.superStickerRenderer=new Dn.vT(this.lazyLoadQueue,this.chat.animationGroup,this.managers)}}var Vn=i(2230);const Kn=()=>{const e=new Date;return e.setHours(0,0,0,0),e},Wn=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class $n extends I{constructor(e,t,i){var s;if(super((s=e).getTime()>Wn().getTime()?new Date:s,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:Kn(),maxDate:Wn(),withTime:!0,showOverflowMonths:!0,confirmShortcutIsSendShortcut:!0,title:!0}),this.element.classList.add("popup-schedule"),this.header.append(this.controlsDiv),this.title.replaceWith(this.monthTitle),this.body.append(this.btnConfirm),i){const e=(0,He.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),(0,C.fc)(e,(()=>{t(ke),this.hide()}))}}}var qn=i(8119),Qn=i(8799),Yn=i(6760),Xn=i(6299),Jn=i(6039);class ea extends jn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"x",onSelect:e=>{i.onEmojiSelected((0,Jn.xG)(e),!0)}}),this.managers=s,this.container.classList.add("emoji-helper")}init(){this.list=document.createElement("div"),this.list.classList.add("emoji-helper-emojis","super-emojis"),this.container.append(this.list),this.scrollable=new T.v7(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollLeft=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}(e=e.slice(0,80)).length&&(this.list.innerHTML="",e.forEach((e=>{(0,Jn.IA)(e,this.list,!1,!0)}))),this.waitForKey=t?["ArrowUp","ArrowDown"]:void 0,this.toggle(!e.length)}checkQuery(e,t){const i=this.controller.getMiddleware();this.managers.appEmojiManager.getBothEmojiKeywords().then((()=>{return s=this,n=void 0,o=function*(){if(!i())return;const s=e.replace(/^:/,""),n=yield this.managers.appEmojiManager.searchEmojis(s);i()&&this.render(n,":"!==t)},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}d((o=o.apply(s,n||[])).next())}));var s,n,a,o}))}}class ta extends jn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"y",onSelect:s}),this.className=i,this.container.classList.add(ta.BASE_CLASS,i)}init(){this.list=document.createElement("div"),this.list.classList.add(ta.BASE_CLASS+"-list",this.className+"-list"),this.container.append(this.list),this.scrollable=new T.ZP(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}e.length&&(this.list.innerHTML="",e.forEach((e=>{const t=ta.listElement({className:this.className,peerId:e.peerId,name:e.name,description:e.description});this.list.append(t)}))),t||this.toggle(!e.length)}static listElement(e){const t=ta.BASE_CLASS_LIST_ELEMENT;e.className+="-list-element";const i=document.createElement("div");i.classList.add(t,e.className),i.dataset.peerId=""+e.peerId;const s=new f.Z;s.classList.add("avatar-30",t+"-avatar",e.className+"-avatar"),s.updateWithOptions({isDialog:!1,peerId:e.peerId});const n=document.createElement("div");if(n.classList.add(t+"-name",e.className+"-name"),e.name?(0,F.Z)(n,(0,B.Z)(e.name)):n.append(new N.Z({peerId:e.peerId,dialog:!1,onlyFirstName:!1,plainText:!1}).element),i.append(s,n),e.description){const s=document.createElement("div");s.classList.add(t+"-description",e.className+"-description"),(0,F.Z)(s,(0,B.Z)(e.description)),i.append(s)}return i}}ta.BASE_CLASS="autocomplete-peer-helper",ta.BASE_CLASS_LIST_ELEMENT=ta.BASE_CLASS+"-list-element";var ia=i(7381);function sa(e,t,i){const s=[].concat(t.bot_info);let n;void 0!==i&&(n=new ia.Z({ignoreCase:!0}));const a=new Map;let o;if(s.forEach((t=>{t.commands&&t.commands.forEach((({command:i,description:s},o)=>{const r="/"+i;a.set(i,{peerId:t.user_id?t.user_id.toPeerId(!1):e,command:i,name:r,description:s,index:o}),n&&n.indexObject(i,r)}))})),n){const e=n.search(i);o=Array.from(e).map((e=>a.get(e)))}else o=[...a.values()];return o=o.sort(((e,t)=>a.get(e.command).index-a.get(t.command).index)),o}class na extends ta{constructor(e,t,i,s){super(e,t,"commands-helper",(e=>{const t=e.querySelector(`.${ta.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return i.getReadyToSend((()=>{i.messageInput.innerHTML=t,i.sendMessage(!0)}))})),this.managers=s}checkQuery(e,t){return i=this,s=void 0,a=function*(){if(!(yield this.managers.appUsersManager.isBot(t)))return!1;const i=this.controller.getMiddleware();return this.managers.appProfileManager.getProfileByPeerId(t).then((s=>{if(!i())return;const n=sa(t,s,e);this.render(n)})),!0},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}class aa{constructor(){this.helpers=new Set,this.middleware=(0,Ce.k)()}toggleListNavigation(e){for(const t of this.helpers)t.toggleListNavigation(e)}getMiddleware(){return this.middleware.clean(),this.middleware.get()}addHelper(e){this.helpers.add(e)}hideOtherHelpers(e){this.helpers.forEach((t=>{t!==e&&t.toggle(!0,!0)})),e||this.middleware.clean()}}var oa=i(5102),ra=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class da extends ta{constructor(e,t,i,s){super(e,t,"mentions-helper",(e=>{const t=e.dataset.peerId.toUserId();Promise.resolve(s.appUsersManager.getUser(t)).then((e=>{let t,s="";const n=(0,oa.Z)(e);n[0]?s="@"+n[0]:(s=e.first_name||e.last_name,t={_:"messageEntityMentionName",length:s.length,offset:0,user_id:e.id}),s+=" ",i.insertAtCaret(s,t)}))})),this.managers=s}checkQuery(e,t,i){const s=e.trim();if(e.length!==s.length)return!1;const n=this.controller.getMiddleware();return this.managers.appProfileManager.getMentions(t&&t.toChatId(),s,i).then((e=>ra(this,void 0,void 0,(function*(){if(!n())return;e=e.filter((e=>e!==d.Z.myId));const t=e.map((e=>ra(this,void 0,void 0,(function*(){const t=yield this.managers.appUsersManager.getUser(e),i=(0,oa.Z)(t);return{peerId:e,description:i[0]?"@"+i[0]:void 0}}))));this.render((yield Promise.all(t)).filter(Boolean))})))),!0}}var la=i(5494),ca=i(6339),ha=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class ua extends ca.Z{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;(0,Ne.Z)(t,this.element)||t===this.btnHover||((0,Le.Z)(e),this.toggle(!1))},(0,zn.Z)(this,e),this.element.classList.add(ua.BASE_CLASS),this.element.style.display="none",this.scrollable=new T.ZP,this.element.append(this.scrollable.container),this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(d.Z)("history_reply_markup",(({peerId:e})=>ha(this,void 0,void 0,(function*(){this.peerId===e&&(this.checkAvailability()&&this.isActive()&&(yield this.render()),(0,pe.e9)().then((()=>{this.checkForceReply()})))}))))}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",(()=>ha(this,void 0,void 0,(function*(){yield this.render(),c.Z&&(this.touchListener=this.listenerSetter.add(document.body)("touchstart",this.onBodyTouchStart,{passive:!1,capture:!0}),this.listenerSetter.add(this)("close",(()=>{this.listenerSetter.remove(this.touchListener)}),{once:!0}))})))),(0,C.fc)(this.element,(e=>{const t=(0,be.Z)(e.target,"btn");if(!t)return;const i=t.dataset.type,{peerId:s}=this;"keyboardButtonRequestPhone"===i?(0,bi.Z)({titleLangKey:"ShareYouPhoneNumberTitle",button:{langKey:"OK"},descriptionLangKey:"AreYouSureShareMyContactInfoBot"}).then((()=>{this.managers.appMessagesManager.sendContact(s,d.Z.myId)})):this.managers.appMessagesManager.sendText(s,t.dataset.text),this.toggle(!1)}),{listenerSetter:this.listenerSetter}),super.init()}checkForceReply(){return ha(this,void 0,void 0,(function*(){const e=yield this.getReplyMarkup();"replyKeyboardForceReply"!==e._||e.pFlags.hidden||e.pFlags.used||(e.pFlags.used=!0,this.chatInput.initMessageReply(e.mid))}))}getReplyMarkup(){var e;return ha(this,void 0,void 0,(function*(){return null!==(e=(yield this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup)&&void 0!==e?e:{_:"replyKeyboardHide"}}))}render(e){return ha(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup()),this.scrollable.container.replaceChildren();for(const t of e.rows){const e=document.createElement("div");e.classList.add(ua.BASE_CLASS+"-row");for(const i of t.buttons){const t=document.createElement("button");t.classList.add(ua.BASE_CLASS+"-button","btn"),(0,F.Z)(t,(0,B.Z)(i.text)),t.dataset.text=i.text,t.dataset.type=i._,e.append(t)}this.scrollable.container.append(e)}}))}checkAvailability(e){var t;return ha(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup());const i="replyKeyboardHide"===e._||!(null===(t=e.rows)||void 0===t?void 0:t.length);return this.btnHover.classList.toggle("hide",i),i&&this.toggle(!1),!i}))}setPeer(e){this.peerId=e,this.checkAvailability(),this.checkForceReply()}}ua.BASE_CLASS="reply-keyboard";var pa=i(1080),fa=i(8678),ma=i(2830),ga=i(515);const va="INLINE-HELPER";class ba extends jn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"xy",waitForKey:["ArrowUp","ArrowDown"],onSelect:e=>{if(!e)return!1;const{peerId:t,botId:i,queryId:s}=this.list.dataset;return this.chat.input.getReadyToSend((()=>{const n=(0,ga.Z)(s,e.dataset.resultId);this.managers.appInlineBotsManager.sendInlineResult(t.toPeerId(),i,n,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{clearDraft:!0})),this.chat.input.onMessageSent(!0,!0)}))}}),this.chat=i,this.managers=s,this._checkQuery=(e,t,i)=>{return s=this,n=void 0,r=function*(){const s=this.controller.getMiddleware(),n=yield this.managers.appUsersManager.resolveUsername(t);if(!s())throw"PEER_CHANGED";if("user"!==n._||!n.pFlags.bot)throw"NOT_A_BOT";const a=this.managers.appInlineBotsManager.getInlineResults(e,n.id,i).then((t=>{if(!s())throw"PEER_CHANGED";this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();i.dataset.peerId=""+e,i.dataset.botId=""+n.id,i.dataset.queryId=""+t.query_id;const a=new pa.Z(null,va,this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const r=[],d=!!t.pFlags.gallery;for(const e of t.results){const t=document.createElement("div");t.classList.add("inline-helper-result"),t.dataset.resultId=e.id;const n=d?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),i.append(t),d)t.classList.add("grid-item");else{n.classList.add("empty"),(0,F.Z)(n,(0,B.Z)([...e.title.trim()][0]));const s=document.createElement("div");s.classList.add("inline-helper-result-title"),(0,F.Z)(s,(0,B.Z)(e.title));const a=document.createElement("div");a.classList.add("inline-helper-result-description"),(0,F.Z)(a,(0,mt.ZP)(e.description,{noCommands:!0,noLinks:!0})),t.append(s,a);const o=document.createElement("div");o.classList.add("inline-helper-separator"),i.append(o)}if("botInlineResult"===e._){if(e.thumb&&0===e.thumb.mime_type.indexOf("image/")){let i;n?(i=document.createElement("div"),n.append(i)):i=t,i.classList.add("media-container"),d&&i.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>Rs.Z.download({dcId:4,location:{_:"inputWebFileLocation",access_hash:e.thumb.access_hash,url:e.thumb.url},size:e.thumb.size,mimeType:e.thumb.mime_type}).then((e=>{const t=new Image;t.classList.add("media-photo"),(0,fa.Z)(e).then((e=>{(0,ma.Z)(i,t,e,!0)}))}))})}}else{const i=e.document||e.photo;if(["sticker","gif"].includes(null==i?void 0:i.type)&&d)(0,Ze.Z)(i),"gif"===i.type?a.add(i,t):"sticker"===i.type&&(t.classList.add("super-sticker"),this.superStickerRenderer.renderSticker(i,t,r),i.animated&&this.superStickerRenderer.observeAnimated(t));else if(i){const e=d?48:void 0;d&&t.classList.add("no-border-radius"),(0,K.Z)({photo:i,container:d?t:n,boxWidth:e,boxHeight:e,middleware:s,lazyLoadQueue:this.lazyLoadQueue,loadPromises:r})}}}return Promise.all(r).then((()=>{if(!s())return void a.clear();i.classList.toggle("is-gallery",d),i.classList.toggle("super-stickers",d),this.container.classList.toggle("is-gallery",d);const r=this.list.parentElement;if(r.textContent="",t.switch_pm){const i=(0,He.Z)("btn-primary btn-secondary btn-primary-transparent primary");(0,F.Z)(i,(0,B.Z)(t.switch_pm.text)),(0,C.fc)(i,(i=>{this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchToPM(e,n.id,t.switch_pm.start_param)})),r.append(i)}r.append(this.list=i),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=a,a.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*o.Z.active.popupSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},o.Z.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0}))}));return{user:n,renderPromise:a}},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function o(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,o)}d((r=r.apply(s,n||[])).next())}));var s,n,a,r},this.container.classList.add("inline-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)})),this.checkQuery=(0,Te.Z)(this._checkQuery,200,!0,!0),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(o.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0)}))}init(){this.list=document.createElement("div"),this.list.classList.add("inline-helper-results"),this.container.append(this.list),this.scrollable=new T.ZP(this.container),this.lazyLoadQueue=new le.Z,this.superStickerRenderer=new Dn.vT(this.lazyLoadQueue,va,this.managers)}}var ya=i(8090),wa=i(3013),Sa=i(5133);class Ca extends ta{constructor(e,t,i){super(e,void 0,"bot-commands",(e=>{const i=e.querySelector(`.${ta.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return t.getReadyToSend((()=>{t.messageInput.innerHTML=i,t.sendMessage(!0),this.toggle(!0)}))})),this.managers=i}setUserId(e,t){var i;if(this.userId!==e||!(null===(i=this.list)||void 0===i?void 0:i.childElementCount))return this.userId=e,(0,We.Z)(this.managers.appProfileManager.getProfile(e),(i=>{if(!t())return;const s=sa(e.toPeerId(!1),i),n=50*s.length+8+24;this.container.style.setProperty("--height",n+"px"),this.render(s)}));this.toggle(!1)}}var La=i(8479),Ea=(i(1544),i(7197)),Ia=i(6241),Ma=i(6535),Pa=i(2821),Za=i(3066);function Ta(e){return t=this,i=void 0,n=function*(){return{cached:e.cached,result:e.cached?yield e.result:e.result}},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}function ka(e){return e.then(Ta)}var xa=i(177),Aa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class _a{constructor(e,t,i){this.managers=e,this.onReady=t,this.onChange=i,this.middleware=(0,Ce.k)(),this.listenerSetter=new ce.Z,this.construct()}construct(){this.container=document.createElement("div"),this.container.classList.add("new-message-send-as-container"),this.closeBtn=document.createElement("div"),this.closeBtn.classList.add("new-message-send-as-close","new-message-send-as-avatar","tgico-close");const e=[{text:"SendMessageAsTitle",onClick:void 0}];let t;this.buttons=[];const i=e=>{e&&(t=this.avatar);const i=this.avatar!==t,s=!e&&i?2:0;(0,De.Z)({element:this.closeBtn,className:"is-visible",forwards:e,duration:300,useRafs:s}),i||(0,De.Z)({element:t,className:"is-visible",forwards:!e,duration:300,useRafs:s})};(0,Mn.Z)({buttonOptions:{noRipple:!0},listenerSetter:this.listenerSetter,container:this.container,direction:"top-right",buttons:e,onOpenBefore:()=>{i(!0)},onOpen:(t,i)=>{e[0].element.classList.add("btn-menu-item-header"),this.btnMenu=i,this.btnMenu.classList.add("scrollable","scrollable-y"),this.btnMenu.append(...this.buttons.map((e=>e.element)))},onClose:()=>{i(!1)},onCloseAfter:()=>{this.btnMenu=void 0}}),this.container.append(this.closeBtn)}updateButtons(e){var t;return Aa(this,void 0,void 0,(function*(){const i=e.map(((e,t)=>Aa(this,void 0,void 0,(function*(){const i=document.createElement("div"),s=document.createElement("div");return s.classList.add("btn-menu-item-subtitle"),e.isUser()?s.append((0,L.ag)("Chat.SendAs.PersonalAccount")):e===this.peerId?s.append((0,L.ag)("VoiceChat.DiscussionGroup")):s.append(yield(0,xa.Z)(e.toChatId())),i.append(new N.Z({peerId:e}).element,s),{onClick:t?()=>Aa(this,void 0,void 0,(function*(){const t=this.peerId;this.changeSendAsPeerId(e);const i=this.middleware.get(),s=()=>{if(this.sendAsPeerId!==e||!i())return;const t=this.sendAsPeerIds.slice();(0,h.Z)(t,e),t.unshift(e),this.updateButtons(t)};d.Z.settings.animationsEnabled?setTimeout(s,250):s(),this.managers.appMessagesManager.saveDefaultSendAs(t,e)})):void 0,textElement:i}})))),s=yield Promise.all(i);(0,ks.b)({buttons:s}),s.forEach(((t,i)=>{const s=e[i],n=new f.Z;n.classList.add("avatar-26","btn-menu-item-icon"),n.updateWithOptions({peerId:s}),i||n.classList.add("active"),t.element.prepend(n)})),this.buttons=s,null===(t=this.btnMenu)||void 0===t||t.append(...this.buttons.map((e=>e.element)))}))}updateAvatar(e,t){return Aa(this,void 0,void 0,(function*(){const i=this.avatar;if(i&&i.peerId===e)return;i||(t=!0);const s=t?0:2,n=t?0:300,a=this.avatar=new f.Z;a.classList.add("new-message-send-as-avatar","avatar-30"),yield a.updateWithOptions({isDialog:!1,peerId:e}),(0,De.Z)({element:a,className:"is-visible",forwards:!0,duration:n,useRafs:s}),i&&(0,De.Z)({element:i,className:"is-visible",forwards:!1,duration:n,onTransitionEnd:()=>{i.remove()},useRafs:s}),this.container.append(a)}))}changeSendAsPeerId(e,t){return this.sendAsPeerId=e,this.onChange(e),this.updateAvatar(e,t)}getDefaultSendAs(){return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((e=>({cached:e.cached,result:e.result.then((e=>e.default_send_as?(0,R.Z)(e.default_send_as):void 0))})))}updateManual(e){return Aa(this,void 0,void 0,(function*(){const t=this.peerId;if(this.updatingPromise||!(yield this.managers.appPeersManager.isChannel(t)))return;const i=this.middleware.get((()=>!this.updatingPromise||this.updatingPromise===l)),{container:s}=this,n=t.toChatId(),a=(yield ka(this.getDefaultSendAs())).result,o=e;a instanceof Promise&&(e=void 0);const r=o&&!e,l=this.updatingPromise=(0,We.Z)(a,(t=>Aa(this,void 0,void 0,(function*(){if(!i()||void 0===t)return;if(yield this.changeSendAsPeerId(t,e),!i())return;this.managers.appChatsManager.getSendAs(n).then((e=>{if(!i())return;const s=e.filter((e=>!e.pFlags.premium_required)).map((e=>e.peer)).map((e=>(0,R.Z)(e)));this.sendAsPeerIds=s.slice(),(0,h.Z)(s,t),s.unshift(t),this.updateButtons(s)}));const a=()=>{this.onReady(s,e),this.addedListener||(this.listenerSetter.add(d.Z)("peer_full_update",(e=>{this.peerId===e&&this.update()})),this.addedListener=!0)};if(!r)return a;a()}))));return l.finally((()=>{this.updatingPromise===l&&(this.updatingPromise=void 0)})),r?void 0:l}))}update(e){return this.updateManual(e).then((e=>null==e?void 0:e()))}setPeerId(e){this.middleware.clean(),this.updatingPromise=void 0,this.peerId=e}destroy(){this.container.remove(),this.setPeerId(),this.listenerSetter.removeAll()}}var Fa=i(9041);function Da(e){const t={};e.forEach((e=>t[e]=!1));const i=window.getSelection();if(!i.isCollapsed){const s=i.getRangeAt(0),n=s.commonAncestorContainer,a=document.createTreeWalker((n.nodeType===n.ELEMENT_NODE?n:n.parentElement).closest('[contenteditable="true"]'),NodeFilter.SHOW_ELEMENT,{acceptNode:e=>s.intersectsNode(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});let o;for(;o=a.nextNode();)for(const i of e){if(t[i])continue;const e=Fa.o[i];o.matches(e.match)&&(t[i]=!0)}}return t}var Ra=i(6034),Ba=i(8794),Na=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Oa="Posting media content isn't allowed in this group.";class Ua{constructor(e,t,i){this.chat=e,this.appImManager=t,this.managers=i,this.lastUrl="",this.lastTimeType=0,this.replyElements={},this.willSendWebPage=null,this.recording=!1,this.recordCanceled=!1,this.recordStartTime=0,this.lockRedo=!1,this.canRedoFromHTML="",this.undoHistory=[],this.executedHistory=[],this.canUndoFromHTML="",this.onCancelRecordClick=e=>{e&&(0,Le.Z)(e),this.recordCanceled=!0,this.recorder.stop(),ln.Z.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=c.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=c.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>Na(this,void 0,void 0,(function*(){const{peerId:i}=this.chat,s=this.chat.bubbles.getMiddleware(),n=d.Z.myId!==i&&i.isUser()&&(yield this.managers.appUsersManager.isUserOnlineVisible(i));new $n(t,(t=>{s()&&(t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout((()=>{s()&&(S.Z.getPopups(P.Z).forEach((e=>e.hide())),this.appImManager.openScheduled(i))}),0))}),n).show()})),this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,i)=>{(0,Le.Z)(e);let s=this.messageInput.innerHTML;if(s&&s!==i){this.lockRedo=!0;let e=0;do{document.execCommand(t,!1,null);const i=this.messageInput.innerHTML;if(s===i){if(++e>2)break}else e=0;s=i}while(s!==i);this.lockRedo=!1}},this.handleMarkdownShortcut=e=>{const t={KeyB:"bold",KeyI:"italic",KeyU:"underline",KeyS:"strikethrough",KeyM:"monospace",KeyP:"spoiler"};this.appImManager.markupTooltip&&(t.KeyK="link");const i=e.code,s=t[i];if(!Ds(document.getSelection())&&s&&("KeyK"===i?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(s),(0,Le.Z)(e)),"KeyZ"===i){let t=this.messageInput.innerHTML;e.shiftKey?this.undoHistory.length&&(this.executedHistory.push(t),t=this.undoHistory.pop(),this.undoRedo(e,"redo",t),t=this.messageInput.innerHTML,this.canRedoFromHTML=this.undoHistory.length?t:"",this.canUndoFromHTML=t):!this.executedHistory.length||this.canUndoFromHTML&&t!==this.canUndoFromHTML||(this.undoHistory.push(t),t=this.executedHistory.pop(),this.undoRedo(e,"undo",t),this.canUndoFromHTML=this.canRedoFromHTML=this.messageInput.innerHTML)}},this.onMessageInput=e=>{var t;const{value:i,entities:s,caretPos:n}=(0,un.Z)(this.messageInputField.input),a=(0,Pa.Z)(i,s,!0),o=(0,Ia.Z)(s,(0,Ma.Z)(a));this.canRedoFromHTML&&!this.lockRedo&&this.messageInput.innerHTML!==this.canRedoFromHTML&&(this.canRedoFromHTML="",this.undoHistory.length=0);const r=(!(null===(t=this.editMessage)||void 0===t?void 0:t.media)||"messageMediaWebPage"===this.editMessage.media._)&&o.filter((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._));if(r.length)for(const e of r){let t;if("messageEntityTextUrl"===e._)t=e.url;else if(t=i.slice(e.offset,e.offset+e.length),!t.includes("http://")&&!t.includes("https://"))continue;if(this.lastUrl!==t){this.lastUrl=t;const e=this.getWebPagePromise=this.managers.appWebPagesManager.getWebPage(t).then((i=>{this.getWebPagePromise===e&&(this.getWebPagePromise=void 0),this.lastUrl===t&&("webPage"===i._?(this.setTopInfo("webpage",(()=>{}),i.site_name||i.title||"Webpage",i.description||i.url||""),delete this.noWebPage,this.willSendWebPage=i):this.willSendWebPage&&this.onHelperCancel())}))}break}else this.lastUrl&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.helperType?this.helperFunc():this.clearHelper());if(i.trim()){const e=Date.now();e-this.lastTimeType>=6e3&&(this.lastTimeType=e,this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageTypingAction"},void 0,this.chat.threadId)),this.botCommands&&this.botCommands.toggle(!0)}else this.lastTimeType&&this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"},void 0,this.chat.threadId),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.hide(),document.activeElement===this.messageInput&&setTimeout((()=>{document.activeElement===this.messageInput&&this.resetCurrentFontFormatting()}),0);this.botCommands&&this.updateBotCommandsToggle(),this.editMsgId||this.saveDraftDebounced(),this.checkAutocomplete(i,n,o),this.updateSendBtn()},this.onEmojiSelected=(e,t)=>{const i=e.docId?{_:"messageEntityCustomEmoji",document_id:e.docId,length:e.emoji.length,offset:0}:(0,Ea.Z)(e.emoji);this.insertAtCaret(e.emoji,i,t)},this.onBtnSendClick=e=>Na(this,void 0,void 0,(function*(){if((0,Le.Z)(e),!this.recorder||this.recording||!this.isInputEmpty()||this.forwarding||this.editMsgId)this.recording?Date.now()-this.recordStartTime<500?this.onCancelRecordClick():this.recorder.stop():this.sendMessage();else{const e=this.chat.peerId.isAnyChat();if(e&&!(yield this.chat.canSend("send_media")))return void(0,we.Am)(Oa);this.chatInput.classList.add("is-locked"),(0,Qn.Z)();let t=!1;if(!e){const e=yield this.managers.appProfileManager.getProfile(this.chat.peerId.toUserId());(null==e?void 0:e.pFlags.voice_messages_forbidden)&&((0,we.bC)({langPackKey:"Chat.SendVoice.PrivacyError",langPackArguments:[yield(0,Kt.Z)({peerId:this.chat.peerId})]}),t=!0)}if(t)return void this.chatInput.classList.remove("is-locked");this.recorder.start().then((()=>{this.releaseMediaPlayback=wa.Z.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),ln.Z.setKeepAlive(!0);const e=()=>{new As.Z("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{(0,C.tH)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",(t=>{(0,be.Z)(t.target,"chat-input")||(0,be.Z)(t.target,"popup-cancel-record")||((0,Le.Z)(t),e())}),{capture:!0,passive:!1}),Hn.Z.pushItem(this.recordingNavigationItem={type:"voice",onPop:()=>(setTimeout((()=>{e()}),0),!1)}),this.recordStartTime=Date.now();const t=this.recorder.sourceNode,i=t.context.createAnalyser();t.connect(i),i.fftSize=32;const s=new Uint8Array(i.frequencyBinCount),n=255*s.length,a=()=>{if(!this.recording)return;i.getByteFrequencyData(s);let e=0;s.forEach((t=>{e+=t}));const t=Math.min(1,e/n+.36);this.recordRippleEl.style.transform=`scale(${t})`;const o=Date.now()-this.recordStartTime,r=o%1e3,d=(0,is.Z)(o/1e3)+","+("00"+Math.round(r/10)).slice(-2);this.recordTimeEl.innerText=d,(0,fe.T2)(a)};a()})).catch((e=>{switch(e.name){case"NotAllowedError":(0,we.Am)("Please allow access to your microphone");break;case"NotReadableError":(0,we.Am)(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),(0,we.Am)(e.message)}this.setRecording(!1),this.chatInput.classList.remove("is-locked")}))}})),this.onHelperCancel=(e,t)=>Na(this,void 0,void 0,(function*(){if(e&&(0,Le.Z)(e),this.willSendWebPage){const e=this.lastUrl;let t=!1;if(this.helperType&&(yield this.helperFunc(),t=!0),this.lastUrl=e,this.noWebPage=!0,this.willSendWebPage=null,t)return}if("edit"===this.helperType&&!t){const e=this.editMessage,t=this.getCurrentInputAsDraft();if(t&&delete t.pFlags.no_webpage,!(0,Ra.Z)(t,Object.assign(Object.assign({},e),{_:"draftMessage"})))return void new As.Z("discard-editing",{buttons:[{langKey:"Alert.Confirm.Discard",callback:()=>{this.onHelperCancel(void 0,!0)}}],descriptionLangKey:"Chat.Edit.Cancel.Text"}).show()}this.clearHelper(),this.updateSendBtn()})),this.onHelperClick=e=>{if((0,Le.Z)(e),(0,be.Z)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&c.Z&&!e.container.classList.contains("active")&&Et.Z.openBtnMenu(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new ce.Z}construct(){this.chatInput=document.createElement("div"),this.chatInput.classList.add("chat-input","hide"),this.inputContainer=document.createElement("div"),this.inputContainer.classList.add("chat-input-container"),this.rowsWrapperWrapper=document.createElement("div"),this.rowsWrapperWrapper.classList.add("rows-wrapper-wrapper"),this.rowsWrapper=document.createElement("div"),this.rowsWrapper.classList.add("rows-wrapper","chat-input-wrapper"),this.rowsWrapperWrapper.append(this.rowsWrapper);const e=Ts();this.rowsWrapper.append(e);const t=this.fakeRowsWrapper=document.createElement("div");t.classList.add("fake-wrapper","fake-rows-wrapper");const i=this.fakeSelectionWrapper=document.createElement("div");i.classList.add("fake-wrapper","fake-selection-wrapper"),this.inputContainer.append(this.rowsWrapperWrapper,t,i),this.chatInput.append(this.inputContainer),this.goDownBtn=(0,qn.Z)({icon:"arrow_down",className:"bubbles-corner-button chat-secondary-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),(0,C.fc)(this.goDownBtn,(e=>{(0,Le.Z)(e),this.chat.bubbles.onGoDownClick()}),{listenerSetter:this.listenerSetter});const s=this.controlContainer=document.createElement("div");s.classList.add("chat-input-control","chat-input-wrapper"),this.inputContainer.append(s)}constructPeerHelpers(){this.replyElements.container=document.createElement("div"),this.replyElements.container.classList.add("reply-wrapper"),this.replyElements.iconBtn=(0,Vn.Z)(""),this.replyElements.cancelBtn=(0,Vn.Z)("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>{s=!0},t=()=>{s=!1},i=this.forwardElements={};let s=!1;const n=[i.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkForClose:()=>this.canToggleHideAuthor(),checkboxField:new jt.Z({checked:!0})},i.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkForClose:()=>this.canToggleHideAuthor(),checkboxField:new jt.Z({checked:!1})},i.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new jt.Z({checked:!0})},i.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new jt.Z({checked:!1})},i.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],a=i.container=(0,ks.b)({buttons:n,listenerSetter:this.listenerSetter}),o=Array.from(a.children);[{elements:o.slice(0,2),onChange:(e,t)=>{const n=!!+e;s&&(this.forwardWasDroppingAuthor=!n);const a=this.replyElements.container.querySelector(".reply-title");if(a){const e=a.firstElementChild,t=L.ZP.weakMap.get(e),s=i.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=s,t.update()}}},{elements:o.slice(2,4),onChange:e=>{const t=!!+e;let s;s=t&&void 0!==this.forwardWasDroppingAuthor?this.forwardWasDroppingAuthor?i.hideSender:i.showSender:t?i.showSender:i.hideSender,s.checkboxField.checked=!0}}].forEach((e=>{const t=(0,Sa.Z)(e.elements.map((e=>({container:e,input:e.querySelector("input")}))),e.onChange),i=document.createElement("hr");t.append(i),a.append(t)})),a.append(i.changePeer.element),c.Z||(this.forwardHover=new ca.Z({element:a})),i.modifyArgs=n.slice(0,-1),this.replyElements.container.append(a),i.modifyArgs.forEach(((e,t)=>{const{input:i}=e.checkboxField;i.type="radio",i.name=t<2?"author":"caption",i.value=""+ +!(t%2)})),this.newMessageWrapper=document.createElement("div"),this.newMessageWrapper.classList.add("new-message-wrapper"),this.replyInTopicOverlay=document.createElement("div"),this.replyInTopicOverlay.classList.add("reply-in-topic-overlay","hide"),this.replyInTopicOverlay.append((0,L.ag)("Chat.Input.ReplyToAnswer")),this.btnToggleEmoticons=(0,Vn.Z)("none toggle-emoticons",{noRipple:!0}),this.inputMessageContainer=document.createElement("div"),this.inputMessageContainer.classList.add("input-message-container"),this.goDownUnreadBadge=document.createElement("span"),this.goDownUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goDownBtn.append(this.goDownUnreadBadge),this.goMentionBtn=(0,qn.Z)({icon:"mention",className:"bubbles-corner-button chat-secondary-button bubbles-go-mention"}),this.goMentionUnreadBadge=document.createElement("span"),this.goMentionUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goMentionBtn.append(this.goMentionUnreadBadge),this.inputContainer.append(this.goMentionBtn),(0,C.fc)(this.goMentionBtn,(e=>{(0,Le.Z)(e);const t=this.chat.bubbles.getMiddleware();this.managers.appMessagesManager.goToNextMention(this.chat.peerId,this.chat.threadId).then((e=>{t()&&e&&this.chat.setMessageId(e)}))}),{listenerSetter:this.listenerSetter}),this.btnScheduled=(0,Vn.Z)("scheduled btn-scheduled float hide",{noRipple:!0}),(0,C.fc)(this.btnScheduled,(e=>{this.appImManager.openScheduled(this.chat.peerId)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(d.Z)("scheduled_new",(({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:e})=>{this.chat.peerId===e&&this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((e=>{this.btnScheduled.classList.toggle("hide",!e.length)}))})),this.btnToggleReplyMarkup=(0,Vn.Z)("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new ua({appendTo:this.rowsWrapper,listenerSetter:this.listenerSetter,managers:this.managers,btnHover:this.btnToggleReplyMarkup,chatInput:this}),this.listenerSetter.add(this.replyKeyboard)("open",(()=>this.btnToggleReplyMarkup.classList.add("active"))),this.listenerSetter.add(this.replyKeyboard)("close",(()=>this.btnToggleReplyMarkup.classList.remove("active"))),this.botCommands=new Ca(this.rowsWrapper,this,this.managers),this.botCommandsToggle=document.createElement("div"),this.botCommandsToggle.classList.add("new-message-bot-commands");const r=document.createElement("div");r.classList.add("new-message-bot-commands-icon-scale");const l=this.botCommandsIcon=document.createElement("div");l.classList.add("animated-menu-icon","animated-menu-close-icon"),r.append(l),this.botCommandsToggle.append(r),(0,C.fc)(this.botCommandsToggle,(e=>{(0,Le.Z)(e),l.classList.contains("state-back")?(this.botCommands.toggle(!0),l.classList.remove("state-back")):(this.botCommands.setUserId(this.chat.peerId.toUserId(),this.chat.bubbles.getMiddleware()),l.classList.add("state-back"))}),{listenerSetter:this.listenerSetter}),this.botCommands.addEventListener("visible",(()=>{l.classList.add("state-back")})),this.botCommands.addEventListener("hiding",(()=>{l.classList.remove("state-back")})),this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...bn.Z].join(", ");this.fileInput.setAttribute("accept",e),this.willAttachType="media",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"document",text:"Chat.Input.Attach.Document",onClick:()=>{this.fileInput.value="",this.fileInput.removeAttribute("accept"),this.willAttachType="document",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"poll",text:"Poll",onClick:()=>{S.Z.createPopup(fn,this.chat).show()},verify:()=>(this.chat.peerId.isAnyChat()||this.chat.isBot)&&this.chat.canSend("send_polls")}];const h=this.attachMenuButtons.slice();this.attachMenu=(0,Mn.Z)({buttonOptions:{noRipple:!0},listenerSetter:this.listenerSetter,direction:"top-left",buttons:this.attachMenuButtons,onOpenBefore:()=>Na(this,void 0,void 0,(function*(){const e=yield this.managers.appAttachMenuBotsManager.getAttachMenuBots(),t=h.slice(),i=e.filter((e=>!e.pFlags.inactive)).map((e=>{const t=(0,Ba.Z)(e);return{regularText:(0,B.Z)(e.short_name),onClick:()=>{this.managers.appAttachMenuBotsManager.requestWebView(Object.assign({botId:e.bot_id,peerId:this.chat.peerId},this.chat.getMessageSendingParams())).then((t=>{const i=["allow-scripts","allow-same-origin","allow-popups","allow-forms","allow-modals","allow-storage-access-by-user-activation"].join(" ");class s extends S.Z{constructor(t){super("popup-payment popup-payment-verification",{closable:!0,overlayClosable:!0,body:!0,titleRaw:e.short_name}),this.url=t,this.d()}destroy(){return this.telegramWebView.destroy(),super.destroy()}d(){const e=this.telegramWebView=new Si({url:this.url,sandbox:i});e.iframe.classList.add("payment-verification"),this.body.append(e.iframe),this.show(),e.onMount()}}new s(t.url)}))},iconDoc:null==t?void 0:t.icon,verify:()=>Na(this,void 0,void 0,(function*(){let t=!1;const i={attachMenuPeerTypeSameBotPM:()=>this.chat.peerId.toUserId()===e.bot_id,attachMenuPeerTypeBotPM:()=>this.chat.isBot,attachMenuPeerTypePM:()=>this.chat.peerId.isUser(),attachMenuPeerTypeChat:()=>this.chat.isAnyGroup,attachMenuPeerTypeBroadcast:()=>this.chat.isBroadcast};for(const s of e.peer_types){const e=i[s._];if(t=yield e(),t)break}return t}))}}));t.splice(t.length,0,...i),this.attachMenuButtons.splice(0,this.attachMenuButtons.length,...t)}))}),this.attachMenu.classList.add("attach-file","tgico-attach"),this.attachMenu.classList.remove("tgico-more"),this.recordTimeEl=document.createElement("div"),this.recordTimeEl.classList.add("record-time"),this.fileInput=document.createElement("input"),this.fileInput.type="file",this.fileInput.multiple=!0,this.fileInput.style.display="none",this.newMessageWrapper.append(...[this.botCommandsToggle,this.btnToggleEmoticons,this.inputMessageContainer,this.btnScheduled,this.btnToggleReplyMarkup,this.attachMenu,this.recordTimeEl,this.fileInput].filter(Boolean)),this.rowsWrapper.append(this.replyElements.container),this.autocompleteHelperController=new aa,this.stickersHelper=new Gn(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.emojiHelper=new ea(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.commandsHelper=new na(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.mentionsHelper=new da(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.inlineHelper=new ba(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=(0,Vn.Z)("binfilled btn-circle btn-record-cancel chat-secondary-button"),this.btnSendContainer=document.createElement("div"),this.btnSendContainer.classList.add("btn-send-container"),this.recordRippleEl=document.createElement("div"),this.recordRippleEl.classList.add("record-ripple"),this.btnSend=(0,Vn.Z)("none btn-circle btn-send animated-button-icon"),this.btnSend.insertAdjacentHTML("afterbegin",'\n \n \n \n \n '),this.btnSendContainer.append(this.recordRippleEl,this.btnSend),this.sendMenu=new cn({onSilentClick:()=>{this.sendSilent=!0,this.sendMessage()},onScheduleClick:()=>{this.scheduleSending(void 0)},listenerSetter:this.listenerSetter,openSide:"top-left",onContextElement:this.btnSend,onOpen:()=>!("scheduled"===this.chat.type||this.isInputEmpty()&&!Object.keys(this.forwarding).length)}),this.btnSendContainer.append(this.sendMenu.sendMenu),this.inputContainer.append(this.btnCancelRecord,this.btnSendContainer),Mt.ZP.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(Mt.ZP)("open",this.onEmoticonsOpen),this.listenerSetter.add(Mt.ZP)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(d.Z)("settings_updated",(()=>{var e;(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),null===(e=this.messageInputField)||void 0===e||e.onFakeInput()})),this.listenerSetter.add(d.Z)("draft_updated",(({peerId:e,threadId:t,draft:i,force:s})=>{this.chat.threadId===t&&this.chat.peerId===e&&"scheduled"!==this.chat.type&&this.setDraft(i,!0,s)})),this.listenerSetter.add(this.appImManager)("peer_changing",(e=>{this.chat!==e||"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.saveDraft()})),this.listenerSetter.add(this.appImManager)("chat_changing",(({from:e,to:t})=>{this.chat===e?this.autocompleteHelperController.toggleListNavigation(!1):this.chat===t&&this.autocompleteHelperController.toggleListNavigation(!0)})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:e,mids:t})=>{"scheduled"===this.chat.type&&this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()})),this.listenerSetter.add(d.Z)("history_delete",(({peerId:e,msgs:t})=>{this.chat.peerId===e&&"scheduled"!==this.chat.type&&(t.has(this.editMsgId)&&this.onMessageSent(),this.replyToMsgId&&t.has(this.replyToMsgId)&&this.clearHelper("reply"))})),this.listenerSetter.add(d.Z)("dialogs_multiupdate",(e=>{!e.has(this.chat.peerId)||"chat"!==this.chat.type&&"discussion"!==this.chat.type||(this.startParam===m.gZ?this.setStartParam():this.center(!0))}));try{this.recorder=new(dn())({encoderSampleRate:48e3,monitorGain:0,numberOfChannels:1,recordingGain:1,reuseWorker:!0})}catch(e){console.error("Recorder constructor error:",e)}this.updateSendBtn(),this.listenerSetter.add(this.fileInput)("change",(e=>{const t=e.target.files;t.length&&(S.Z.createPopup(Fn,this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")}),!1),(0,C.fc)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&((0,C.fc)(this.btnCancelRecord,this.onCancelRecordClick,{listenerSetter:this.listenerSetter}),this.recorder.onstop=()=>{this.setRecording(!1),this.chatInput.classList.remove("is-locked"),this.recordRippleEl.style.transform=""},this.recorder.ondataavailable=e=>{if(this.releaseMediaPlayback&&(this.releaseMediaPlayback(),this.releaseMediaPlayback=void 0),this.recordingOverlayListener&&(this.listenerSetter.remove(this.recordingOverlayListener),this.recordingOverlayListener=void 0),this.recordingNavigationItem&&(Hn.Z.removeItem(this.recordingNavigationItem),this.recordingNavigationItem=void 0),this.recordCanceled)return;const{peerId:t,threadId:i}=this.chat,s=this.replyToMsgId,n=(Date.now()-this.recordStartTime)/1e3|0,a=new Blob([e],{type:"audio/ogg"});ln.Z.decode(e,!0).then((e=>{ln.Z.setKeepAlive(!1),this.managers.appMessagesManager.sendFile(t,{file:a,isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:s,threadId:i,clearDraft:!0}),this.onMessageSent(!1,!0)}))}),(0,C.fc)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),(0,C.fc)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=(0,Te.Z)((()=>this.saveDraft()),2500,!1,!0),this.botStartBtn=(0,He.Z)("btn-primary btn-transparent text-bold chat-input-control-button"),this.botStartBtn.append((0,L.ag)("BotStart")),(0,C.fc)(this.botStartBtn,(()=>{const{startParam:e}=this;if(void 0===e)return;const t=this.toggleBotStartBtnDisability=(0,Ht.Z)([this.botStartBtn],!0),i=this.chat.peerId,s=this.chat.bubbles.getMiddleware((()=>this.chat.peerId===i&&this.startParam===e&&this.toggleBotStartBtnDisability===t));this.managers.appMessagesManager.startBot(i.toUserId(),void 0,e).then((()=>{s()&&(t(),this.toggleBotStartBtnDisability=void 0,this.setStartParam())}))}),{listenerSetter:this.listenerSetter}),this.controlContainer.append(this.botStartBtn,this.replyInTopicOverlay),this.pinnedControlBtn=(0,He.Z)("btn-primary btn-transparent text-bold chat-input-control-button",{icon:"unpin"}),this.controlContainer.append(this.pinnedControlBtn),this.listenerSetter.add(this.pinnedControlBtn)("click",(()=>{const e=this.chat.peerId;new _s(e,0,!0,(()=>{this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}))}))}_center(e,t){if(!e&&!this.inputContainer.classList.contains("is-centering"))return;if(e===this.fakeWrapperTo)return;const i=e||this.fakeWrapperTo,s=!!e,n=this.fakeWrapperTo;let a,o="",r="";const d=i.getBoundingClientRect(),l=this.fakeRowsWrapper.getBoundingClientRect(),c=l.width,h=d.width;if(c!==h){const e=h/c,t=(c-h)/2;if(a=d.left-l.left-t,s&&(o=`translateX(${a}px) scaleX(${e})`,e<1)){const t=16;r=t+t*(1-e)+"px"}}this.fakeWrapperTo=e;const u=t?200:0;return(0,De.Z)({element:this.inputContainer,className:"is-centering",forwards:s,duration:u}),(0,De.Z)({element:this.rowsWrapperWrapper,className:"is-centering-to-control",forwards:!!(s&&e&&e.classList.contains("chat-input-control")),duration:u}),this.rowsWrapper.style.transform=o,this.rowsWrapper.style.borderRadius=r,{transform:o,borderRadius:r,needTranslateX:n&&(e&&e.classList.contains("chat-input-control")&&n===this.fakeSelectionWrapper||n.classList.contains("chat-input-control"))?-.5*a:a,widthFrom:c,widthTo:h}}center(e=!1){return Na(this,void 0,void 0,(function*(){return this._center(yield this.getNeededFakeContainer(),e)}))}setStartParam(e){this.startParam!==e&&(this.startParam=e,this.center(!0))}isReplyInTopicOverlayNeeded(){return this.chat.isForum&&!this.chat.isForumTopic&&!this.replyToMsgId&&"chat"===this.chat.type}getNeededFakeContainer(e=this.startParam){return Na(this,void 0,void 0,(function*(){return this.chat.selection.isSelecting?this.fakeSelectionWrapper:void 0!==e||!(yield this.chat.canSend())||"pinned"===this.chat.type||(yield this.chat.isStartButtonNeeded())||this.isReplyInTopicOverlayNeeded()?this.controlContainer:void 0}))}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){return Na(this,void 0,void 0,(function*(){if(!this.goDownUnreadBadge)return;const e=yield this.managers.dialogsStorage.getDialogOrTopic(this.chat.peerId,"discussion"===this.chat.type?void 0:this.chat.threadId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.chat.peerId,respectType:!0,threadId:this.chat.threadId})),this.goMentionUnreadBadge&&"chat"===this.chat.type){const t=!(!(null==e?void 0:e.unread_mentions_count)||!e.unread_count);this.goMentionUnreadBadge.innerText=t?""+e.unread_mentions_count:"",this.goMentionBtn.classList.toggle("is-visible",t)}}))}getCurrentInputAsDraft(){const{value:e,entities:t}=(0,un.Z)(this.messageInputField.input,!0,!1);let i;return(e.length||this.replyToMsgId)&&(i={_:"draftMessage",date:(0,zt.Z)(!0),message:e,entities:t.length?t:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),i}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const e=this.getCurrentInputAsDraft();this.managers.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,e)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.classList.add("hide"),this.goDownBtn.classList.add("hide")),(0,Yn.Z)(),this.lastTimeType=0,this.startParam=void 0,this.toggleBotStartBtnDisability&&(this.toggleBotStartBtnDisability(),this.toggleBotStartBtnDisability=void 0),this.messageInput&&(this.clearInput(),e&&this.clearHelper())}setDraft(e,t=!0,i=!1){return Na(this,void 0,void 0,(function*(){if(!i&&!(0,hn.Z)(this.messageInput)||"scheduled"===this.chat.type)return!1;if(!e&&!(e=yield this.managers.appDraftsManager.getDraft(this.chat.peerId,this.chat.threadId)))return i&&(this.chat.container.classList.contains("is-helper-active")&&this.t(),this.messageInputField.inputFake.textContent="",this.messageInputField.onFakeInput(!1),(this.chat.bubbles.messagesQueuePromise||Promise.resolve()).then((()=>{(0,fe.T2)((()=>{this.onMessageSent()}))}))),!1;const s=function(e,t,i){const s=(0,Ma.Z)(e.message),n=e.entities||[],a=(0,Ia.Z)(n.slice(),s);return(0,Za.Z)(e.message,{entities:a,wrappingForPeerId:t,loadPromises:void 0})}(e,this.chat.peerId),n=this.getCurrentInputAsDraft();return!((0,Ra.Z)(e,n)&&this.replyToMsgId===e.reply_to_msg_id||(t&&this.clearHelper(),this.noWebPage=e.pFlags.no_webpage,e.reply_to_msg_id&&this.initMessageReply(e.reply_to_msg_id),this.setInputValue(s,t,t),0))}))}createSendAs(){if(this.sendAsPeerId=void 0,"chat"===this.chat.type||"discussion"===this.chat.type){let e=!0;this.sendAs=new _a(this.managers,((e,t)=>{let i=0;e.parentElement||(this.newMessageWrapper.prepend(e),i=2),this.updateOffset("as",!0,t,i)}),(t=>{this.sendAsPeerId=t,e?e=!1:this.getPlaceholderKey().then((e=>{this.updateMessageInputPlaceholder(e)}))}))}else this.sendAs=void 0;return this.sendAs}finishPeerChange(e){return Na(this,void 0,void 0,(function*(){const t=this.chat.peerId,{forwardElements:i,btnScheduled:s,replyKeyboard:n,sendMenu:a,goDownBtn:o,chatInput:r,botCommandsToggle:d}=this,l=this.sendAs,c=this.createSendAs(),[h,u,p,f,m,g,v,b,y]=yield Promise.all([this.managers.appPeersManager.isBroadcast(t),this.managers.appPeersManager.canPinMessage(t),this.managers.appPeersManager.isBot(t),this.chat.canSend(),this.getNeededFakeContainer(e),ka(this.managers.acknowledged.appProfileManager.getProfileByPeerId(t)),s?ka(this.managers.acknowledged.appMessagesManager.getScheduledMessages(t)):void 0,c?(c.setPeerId(this.chat.peerId),c.updateManual(!0)):void 0,this.filterAttachMenuButtons()]),w=this.messageInput?yield this.getPlaceholderKey():void 0;return()=>{var c;if(r.classList.remove("hide"),o.classList.toggle("is-broadcast",h),o.classList.remove("hide"),null===(c=this.messageInputField)||void 0===c||c.onFakeInput(),this.goDownUnreadBadge&&this.setUnreadCount(),"pinned"===this.chat.type&&r.classList.toggle("can-pin",u),i&&(this.forwardWasDroppingAuthor=!1,i.showCaption.checkboxField.setValueSilently(!0),i.showSender.checkboxField.setValueSilently(!0)),s&&v){s.classList.add("hide");const e=this.chat.bubbles.getMiddleware();(0,We.Z)(v.result,(t=>{e()&&t&&s.classList.toggle("hide",!t.length)}))}if(this.newMessageWrapper&&this.updateOffset(null,!1,!0),d&&(this.hasBotCommands=void 0,this.botCommands.toggle(!0,void 0,!0),this.updateBotCommandsToggle(!0),d.remove(),p)){const e=this.chat.bubbles.getMiddleware(),t=g.result;(0,We.Z)(t,(i=>{e()&&this.updateBotCommands(i,!(t instanceof Promise))}))}l&&l.destroy(),b&&b(),n&&n.setPeer(t),a&&a.setPeerId(t),this.messageInput&&(this.updateMessageInput(f,w,y),this.messageInput.dataset.peerId=""+t);let S=!1;if(this.pinnedControlBtn){const e="pinned"===this.chat.type;S||(S=e),this.pinnedControlBtn.classList.toggle("hide",!e),this.pinnedControlBtn.replaceChildren((0,L.ag)(u?"Chat.Input.UnpinAll":"Chat.Pinned.DontShow"))}{const e=this.chat.isForum&&!this.chat.isForumTopic&&"chat"===this.chat.type;S||(S=e),this.replyInTopicOverlay.classList.toggle("hide",!e)}this.botStartBtn.classList.toggle("hide",S),this.startParam=e,this._center(m,!1)}}))}updateOffset(e,t,i,s){e?this.newMessageWrapper.dataset.offset=e:delete this.newMessageWrapper.dataset.offset,(0,De.Z)({element:this.newMessageWrapper,className:"has-offset",forwards:t,duration:i?0:300,useRafs:s})}updateBotCommands(e,t){var i,s;this.hasBotCommands=!!(null===(s=null===(i=e.bot_info)||void 0===i?void 0:i.commands)||void 0===s?void 0:s.length),this.updateBotCommandsToggle(t)}updateBotCommandsToggle(e){const{botCommandsToggle:t,hasBotCommands:i}=this,s=!!i&&this.isInputEmpty();if(!i){if(!t.parentElement)return;t.remove()}const n=s,a=t.parentElement?0:2;t.parentElement||this.newMessageWrapper.prepend(t),this.updateOffset("commands",n,e,a)}getPlaceholderKey(){return Na(this,void 0,void 0,(function*(){const{peerId:e,threadId:t,isForum:i}=this.chat;let s;return s=t&&!i?"Comment":(yield this.managers.appPeersManager.isBroadcast(e))?"ChannelBroadcast":void 0!==this.sendAsPeerId&&this.sendAsPeerId!==d.Z.myId||(yield this.managers.appMessagesManager.isAnonymousSending(e))?"SendAnonymously":"Message",s}))}updateMessageInputPlaceholder(e){const t=L.ZP.weakMap.get(this.messageInput);t&&t.compareAndUpdate({key:e})}filterAttachMenuButtons(){if(this.attachMenuButtons)return(0,tn.Z)(this.attachMenuButtons,(e=>e.verify()))}updateMessageInput(e,t,i){const{chatInput:s,attachMenu:n,messageInput:a}=this,{peerId:o,threadId:r}=this.chat;s.classList.contains("is-hidden")!==!e&&(s.classList.add("no-transition"),s.classList.toggle("is-hidden",!e),s.offsetLeft,s.classList.remove("no-transition")),this.updateMessageInputPlaceholder(t),e?(a.contentEditable="true",this.setDraft(void 0,!1),a.innerHTML||this.messageInputField.onFakeInput()):a.contentEditable="inherit",n&&(n.toggleAttribute("disabled",!i.length),n.classList.toggle("btn-disabled",!i.length)),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new kn({placeholder:"Message",name:"message",withLinebreaks:!0}),this.messageInputField.input.classList.replace("input-field-input","input-message-input"),this.messageInputField.inputFake.classList.replace("input-field-input","input-message-input"),this.messageInput=this.messageInputField.input,this.attachMessageInputListeners(),ya.T&&(0,ya.Z)(this.messageInput),e?(e.input.replaceWith(this.messageInputField.input),e.inputFake.replaceWith(this.messageInputField.inputFake)):this.inputMessageContainer.append(this.messageInputField.input,this.messageInputField.inputFake)}attachMessageInputListeners(){this.listenerSetter.add(this.messageInput)("keydown",(e=>{const t=e.key;if((0,Xn.Z)(e))(0,Le.Z)(e),this.sendMessage();else if(e.ctrlKey||e.metaKey)this.handleMarkdownShortcut(e);else if(("PageUp"===t||"PageDown"===t)&&!e.shiftKey)if(e.preventDefault(),"PageUp"===t){const e=document.createRange(),t=window.getSelection();e.setStart(this.messageInput.childNodes[0]||this.messageInput,0),e.collapse(!0),t.removeAllRanges(),t.addRange(e)}else(0,Ot.Z)(this.messageInput)})),c.Z&&(0,C.fc)(this.messageInput,(e=>{if(Mt.ZP.isActive())return Mt.ZP.toggle(!1),(0,Qn.Z)(),void(0,Le.Z)(e);this.appImManager.selectTab(Yr.CHAT)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",(()=>{this.checkAutocomplete()})),this.listenerSetter.add(this.messageInput)("focusin",(()=>{"chat"!==this.chat.type&&"discussion"!==this.chat.type||!this.chat.bubbles.scrollable.loadedAll.bottom||this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)}))}applyMarkdown(e,t){const i={link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null)},s=e=>{i[e]=()=>{const t=(n.includes(e)?n:[e]).filter((e=>l[e]));return(0,h.Z)(t,e)||t.push(e),t.length?document.execCommand("fontName",!1,"markup-"+t.join("-")):this.resetCurrentFontFormatting()}},n=["bold","italic","underline","strikethrough","spoiler"];if(n.forEach((e=>{s(e)})),s("monospace"),!i[e])return!1;const a=i[e],o=[],r=Pn.Z.getInstance().prepareApplyingMarkdown(),d=this.listenerSetter.add(this.messageInput)("input",Le.Z,{capture:!0,passive:!1});o.push(document.execCommand("styleWithCSS",!1,"true"));const l=Da(Object.keys(i));return l.monospace&&"link"===e&&o.push(this.resetCurrentFormatting()),o.push("function"==typeof a?a():document.execCommand(a,!1,null)),o.push(document.execCommand("styleWithCSS",!1,"false")),r(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),this.listenerSetter.remove(d),this.messageInputField.simulateInputEvent(),!0}resetCurrentFormatting(){return document.execCommand("removeFormat",!1,null)}resetCurrentFontFormatting(){return document.execCommand("fontName",!1,"Roboto")}insertAtCaret(e,t,i=!0){Pn.Z.getInstance().makeFocused(this.messageInput);const{value:s,caretPos:n,entities:a}=(0,un.Z)(this.messageInput),o=n>=0?n:s.length,r=s.substr(0,o),d=(s.substr(o),i?r.match(Ua.AUTO_COMPLETE_REG_EXP):null),l=d?d.index+(d[0].length-d[2].length):r.length;if(r.slice(0,l),i&&-1!==n){const e=d[2],t=document.getSelection();let i=0;for(;t.toString()!==e;){if(++i>=1e4)throw new Error("lolwhat");t.modify("extend","backward","character")}}(0,E.rf)(this.messageInput,e,t?[t]:void 0,this.chat.peerId)}checkAutocomplete(e,t,i){return Na(this,void 0,void 0,(function*(){if(void 0===e){const s=(0,un.Z)(this.messageInputField.input,!0,!0);e=s.value,t=s.caretPos,i=s.entities}if(-1===t&&(t=e.length),void 0===i){const t=(0,Pa.Z)(e,i,!0);i=(0,Ia.Z)(i,(0,Ma.Z)(t))}if(e=e.slice(0,t),this.previousQuery===e)return;this.previousQuery=e;const s=e.match(Ua.AUTO_COMPLETE_REG_EXP);let n;if(s){const t=i[0];let a=s[2];const o=a[0];if(this.stickersHelper&&d.Z.settings.stickers.suggest&&(yield this.chat.canSend("send_stickers"))&&"messageEntityEmoji"===(null==t?void 0:t._)&&t.length===e.length&&!t.offset)n=this.stickersHelper,this.stickersHelper.checkEmoticon(e);else if("@"===o){const e=this.chat.threadId?(0,yt.Z)(this.chat.threadId):void 0;(yield this.mentionsHelper.checkQuery(a,this.chat.peerId.isUser()?m.NM:this.chat.peerId,e))&&(n=this.mentionsHelper)}else s[1]||"/"!==o?d.Z.settings.emoji.suggest&&(a=a.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!a||(n=this.emojiHelper,this.emojiHelper.checkQuery(a,o))):(yield this.commandsHelper.checkQuery(a,this.chat.peerId))&&(n=this.commandsHelper)}n=this.checkInlineAutocomplete(e,n),this.autocompleteHelperController.hideOtherHelpers(n)}))}checkInlineAutocomplete(e,t){let i=!1;const s=e=>{this.btnPreloader&&(0,De.Z)({element:this.btnPreloader,className:"show",forwards:e,duration:400})};if(!t){const n=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(n){const a=n[1],o=e.slice(n[0].length);i=n[0].length===e.length,t=this.inlineHelper,this.btnPreloader?s(!0):(this.btnPreloader=(0,Vn.Z)("none btn-preloader float show disable-hover",{noRipple:!0}),(0,Gt.y)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,a,o).then((({user:e,renderPromise:t})=>{i&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then((()=>{s(!1)}))})).catch((e=>{s(!1)}))}}return i||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&s(!1),t}setRecording(e){this.recording!==e&&((0,De.Z)({element:this.chatInput,className:"is-recording",forwards:e,duration:200}),this.recording=e,this.updateSendBtn())}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=(0,La.Z)(this.forwarding),t=this.helperFunc;this.clearHelper(),this.updateSendBtn();let i=!1;new M.Z(e,(()=>{i=!0})).addEventListener("close",(()=>{this.helperWaitingForward=!1,i||t()}))}clearInput(e=!0,t=!0,i=""){return Na(this,void 0,void 0,(function*(){if(document.activeElement===this.messageInput&&x.IS_MOBILE_SAFARI){const e=document.createElement("input");document.body.append(e),(0,la.Z)(e),this.messageInputField.setValueSilently(i),(0,la.Z)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(i);c.Z||(this.canRedoFromHTML="",this.undoHistory.length=0,this.executedHistory.length=0,this.canUndoFromHTML="");let s=!1;e&&(s=yield this.setDraft(void 0,!1)),!s&&t&&this.onMessageInput()}))}isInputEmpty(){return(0,hn.Z)(this.messageInput)}updateSendBtn(){let e;const t=this.isInputEmpty();e=this.editMsgId?"edit":!this.recorder||this.recording||!t||this.forwarding?"scheduled"===this.chat.type?"schedule":"send":"record",["send","record","edit","schedule"].forEach((t=>{this.btnSend.classList.toggle(t,e===t)})),this.btnScheduled&&this.btnScheduled.classList.toggle("show",t&&"scheduled"!==this.chat.type),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t&&"scheduled"!==this.chat.type)}getValueAndEntities(e){const{entities:t,value:i}=(0,un.Z)(this.messageInput,!0,!1),s=(0,Ma.Z)(i);return{value:i,totalEntities:(0,Ia.Z)(t,s)}}onMessageSent(e=!0,t){"scheduled"!==this.chat.type&&this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId,!0),this.scheduleDate=void 0,this.sendSilent=void 0;const{totalEntities:i}=this.getValueAndEntities(this.messageInput);let s=0;i.filter((e=>{if("messageEntityEmoji"===e._||"messageEntityCustomEmoji"===e._){const t=e.offset+e.length;return!(t<=s||(s=t,0))}return!1})).forEach((e=>{const t="messageEntityEmoji"===e._?{emoji:(0,Ns.zu)(e.unicode)}:{docId:e.document_id,emoji:""};this.managers.appEmojiManager.pushRecentEmoji(t)})),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.clearInput()),(t||e)&&this.clearHelper(),this.updateSendBtn()}sendMessage(e=!1){const{editMsgId:t,chat:i}=this;if("scheduled"===i.type&&!e&&!t)return void this.scheduleSending();const{peerId:s}=i,{noWebPage:n}=this,a=this.chat.getMessageSendingParams(),{value:o,entities:r}=(0,un.Z)(this.messageInputField.input,!0,!1);if(t){const e=this.editMessage;if(!o.trim()&&!e.media)return void new xs.Z(s,[t],i.type);this.managers.appMessagesManager.editMessage(e,o,{entities:r,noWebPage:n}),this.onMessageSent()}else o.trim()&&(this.managers.appMessagesManager.sendText(s,o,Object.assign(Object.assign({entities:r},a),{noWebPage:n,webPage:this.getWebPagePromise?void 0:this.willSendWebPage,clearDraft:!0})),"scheduled"===this.chat.type?this.onMessageSent(!0):this.onMessageSent(!1,!1));if(this.forwarding){const e=(0,La.Z)(this.forwarding);for(const t in e)this.managers.appMessagesManager.forwardMessages(s,t.toPeerId(),e[t],Object.assign(Object.assign({},a),{dropAuthor:this.forwardElements&&this.forwardElements.hideSender.checkboxField.checked,dropCaptions:this.isDroppingCaptions()})).catch((e=>Na(this,void 0,void 0,(function*(){"VOICE_MESSAGES_FORBIDDEN"===e.type&&(0,we.bC)({langPackKey:"Chat.SendVoice.PrivacyError",langPackArguments:[yield(0,Kt.Z)({peerId:s})]})}))));o||this.onMessageSent()}}sendMessageWithDocument(e,t=!1,i=!1,s=!1){return Na(this,void 0,void 0,(function*(){const n="sticker"===(e=yield this.managers.appDocsManager.getDoc(e)).type?"send_stickers":"gif"===e.type?"send_gifs":"send_media";return this.chat.peerId.isAnyChat()&&!(yield this.chat.canSend(n))?((0,we.Am)(Oa),!1):"scheduled"!==this.chat.type||t?!(!e||e.sticker&&(0,ji.Z)(e)&&!d.Z.premium||(this.managers.appMessagesManager.sendFile(this.chat.peerId,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{file:e,isMedia:!0,clearDraft:i,silent:s})),this.onMessageSent(i,!0),"sticker"===e.type&&this.managers.appStickersManager.saveRecentSticker(e.id),0)):(this.scheduleSending((()=>this.sendMessageWithDocument(e,!0,i,s))),!1)}))}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||(0,ye.Z)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){return Na(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);let i=(0,Za.Z)(t.message,{entities:t.totalEntities,wrappingForPeerId:this.chat.peerId});const s=()=>Na(this,void 0,void 0,(function*(){const n=yield(0,V.Z)({message:t,usingMids:[t.mid]});this.setTopInfo("edit",s,(0,L.ag)("AccDescrEditing"),n,i,t),this.editMsgId=e,this.editMessage=t,i=void 0}));s()}))}initMessagesForward(e){const t=()=>Na(this,void 0,void 0,(function*(){const i=Object.keys(e).map((e=>e.toPeerId())),s=new Set;let n=0,a=0;const o=i.map((t=>Na(this,void 0,void 0,(function*(){const i=e[t],o=i.map((e=>Na(this,void 0,void 0,(function*(){var i;const n=yield this.managers.appMessagesManager.getMessageByPeer(t,e);!(null===(i=n.fwd_from)||void 0===i?void 0:i.from_name)||n.fromId||n.fwdFromId?s.add("P"+n.fromId):s.add("N"+n.fwd_from.from_name),n.media&&n.message&&++a}))));yield Promise.all(o),n+=i.length}))));yield Promise.all(o);const r=s.size>2,l=[...s].map((e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===d.Z.myId?(0,L.ag)("Chat.Accessory.Forward.You"):new N.Z({peerId:t,dialog:!1,onlyFirstName:r}).element}return r?e.split(" ")[0]:e})),{forwardElements:c}=this;(0,ye.Z)(c.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!a);const h=c.hideCaption.checkboxField.checked;a&&h?c.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?c.hideSender:c.showSender).checkboxField.setValueSilently(!0);const u=c.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",p=(0,L.ag)(u,[n]),f=document.createDocumentFragment();let m,g;if(l.length<3?f.append(...(0,L.v_)(l,!1)):f.append(l[0],(0,L.ag)("AndOther",[l.length-1])),1===i.length){const t=i[0],s=e[t];if(m=yield this.managers.appMessagesManager.getMessageByPeer(t,s[0]),g=!!m.grouped_id,g){const e=yield this.managers.appMessagesManager.getMidsByMessage(m);(e.length!==n||e.find((e=>!s.includes(e))))&&(g=!1)}}const v=document.createDocumentFragment();if(g||1===n){const t=e[i[0]],s=yield(0,V.Z)({message:m,usingMids:t});v.append(f,": ",s)}else v.append((0,L.ag)("Chat.Accessory.Forward.From"),": ",f);const b=this.setTopInfo("forward",t,p,v);c.modifyArgs.forEach(((e,t)=>{const s=e.textElement,n=L.ZP.weakMap.get(s);n.args=[t<2?i.length:a],n.update()})),this.forwardHover&&this.forwardHover.attachButtonListener(b,this.listenerSetter),this.forwarding=e}));t()}initMessageReply(e){return Na(this,void 0,void 0,(function*(){if(this.replyToMsgId===e)return;let t=yield this.chat.getMessage(e);const i=()=>{let s;t?s=new N.Z({peerId:t.fromId,dialog:!1}).element:(s=(0,L.ag)("Loading"),this.managers.appMessagesManager.reloadMessages(this.chat.peerId,e).then((s=>{this.replyToMsgId===e&&(t=s,t?i():this.clearHelper("reply"))}))),this.setTopInfo("reply",i,s,t&&t.message,void 0,t),this.setReplyToMsgId(e)};i()}))}setReplyToMsgId(e){this.replyToMsgId=e,this.center(!0)}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.setReplyToMsgId(void 0),this.forwarding=void 0),this.editMsgId=this.editMessage=void 0,this.helperType=this.helperFunc=void 0,this.chat.container.classList.contains("is-helper-active")&&(Hn.Z.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){const e="is-toggling-helper";(0,De.Z)({element:this.chat.container,className:e,forwards:!0,duration:150,onTransitionEnd:()=>{this.chat.container.classList.remove(e)}})}setInputValue(e,t=!0,i=!0){e||(e=""),t?this.clearInput(!1,!1,e):this.messageInputField.setValueSilently(e),(0,fe.T2)((()=>{i&&(0,Ot.Z)(this.messageInput),this.onMessageInput(),this.messageInput.scrollTop=this.messageInput.scrollHeight}))}setTopInfo(e,t,i="",s="",n,a){if(this.willSendWebPage&&"reply"===e)return;"webpage"!==e&&(this.clearHelper(e),this.helperType=e,this.helperFunc=t);const o=this.replyElements.container,r=o.lastElementChild.previousElementSibling,d=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=(0,Vn.Z)(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const{container:l}=J(i,s,this.chat.animationGroup,a);return d?r.replaceWith(l):o.insertBefore(l,o.lastElementChild),"webpage"===e&&(l.style.cursor="default"),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),x.IS_MOBILE||Hn.Z.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout((()=>{this.updateSendBtn()}),0),l}}Ua.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;var Ha=i(6054);const za="pinned-container";class ja{constructor(e){this.floating=!1,(0,zn.Z)(this,e);const{divAndCaption:t,className:i}=this;t.container.classList.add(za,"hide"),t.title.classList.add(za+"-title"),t.subtitle.classList.add(za+"-subtitle"),t.content.classList.add(za+"-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add(za+"-close",`pinned-${i}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add(za+"-wrapper"),(0,A.Z)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add(za+"-wrapper-utils"),this.wrapperUtils.append(this.btnClose),this.wrapper.append(...Array.from(t.container.children),this.wrapperUtils),t.container.append(this.wrapper),this.attachOnCloseEvent(this.btnClose)}attachOnCloseEvent(e){(0,C.fc)(e,(e=>{(0,Le.Z)(e),((this.onClose?this.onClose():null)||Promise.resolve(!0)).then((e=>{e&&this.toggle(!0)}))}),{listenerSetter:this.listenerSetter})}toggle(e){const t=this.divAndCaption.container.classList.contains("hide");if(void 0===e)e=!t;else if(e===t)return;const i=(this.floating||o.Z.isMobile)&&!e;this.divAndCaption.container.classList.toggle("is-floating",i),this.divAndCaption.container.classList.toggle("hide",e),this.topbar.container.classList.toggle("is-pinned-floating",i),this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`,!e),this.topbar.setFloating(),this.topbar.setUtilsWidth()}isVisible(){return!this.divAndCaption.container.classList.contains("hide")}isFloating(){return this.divAndCaption.container.classList.contains("is-floating")}fill(e,t,i){this.divAndCaption.container.dataset.peerId=""+i.peerId,this.divAndCaption.container.dataset.mid=""+i.mid,this.divAndCaption.fill(e,t,i),this.topbar.setUtilsWidth()}}var Ga,Va=i(7207),Ka=i(8427);class Wa extends ja{constructor(e,t,i){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new G("pinned-audio",((e,t)=>{(0,H.Z)(this.divAndCaption.title,e),(0,H.Z)(this.divAndCaption.subtitle,t)})),onClose:()=>{wa.Z.stop()},floating:!0}),this.topbar=e,this.chat=t,this.managers=i,this.onPlaybackParams=e=>{this.fasterEl.classList.toggle("active",e.playbackRate>1),this.repeatEl.classList.remove("tgico-audio_repeat","tgico-audio_repeat_single"),this.repeatEl.classList.add(e.loop?"tgico-audio_repeat_single":"tgico-audio_repeat"),this.repeatEl.classList.toggle("active",e.loop||e.round)},this.onPause=()=>{this.toggleEl.classList.remove("flip-icon")},this.onStop=()=>{this.toggle(!0)},this.onMediaPlay=({doc:e,message:t,media:i,playbackParams:s})=>{var n,a;let o,r;const d="voice"!==e.type&&"round"!==e.type;if(d){const t=e.attributes.find((e=>"documentAttributeAudio"===e._));o=(0,B.Z)(null!==(a=null==t?void 0:t.title)&&void 0!==a?a:e.file_name),r=(null==t?void 0:t.performer)?(0,B.Z)(t.performer):(0,L.ag)("AudioUnknownArtist")}else o=new N.Z({peerId:t.fromId,fromName:null===(n=t.fwd_from)||void 0===n?void 0:n.from_name}).element,r=(0,_.OD)(t.date);this.fasterEl.classList.toggle("hide",d),this.repeatEl.classList.toggle("hide",!d),this.onPlaybackParams(s),this.volumeSelector.setVolume(),this.progressLine.setMedia(i),this.fill(o,r,t),this.toggleEl.classList.toggle("flip-icon",!i.paused),this.toggle(!1)},this.divAndCaption.border.remove();const s=(0,Vn.Z)("fast_rewind active",{noRipple:!0}),n=(0,Vn.Z)("fast_forward active",{noRipple:!0}),a=(e,t)=>{(0,C.fc)(e,(e=>{(0,Le.Z)(e),t()}),{listenerSetter:this.topbar.listenerSetter})};a(s,(()=>{wa.Z.previous()})),a(n,(()=>{wa.Z.next()})),this.toggleEl=(0,Vn.Z)("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),a(this.toggleEl,(()=>{wa.Z.toggle()})),this.wrapper.prepend(this.wrapper.firstElementChild,s,this.toggleEl,n),this.volumeSelector=new Ka.Z(this.listenerSetter,!0);const o=document.createElement("div");o.classList.add("progress-line-container"),o.append(this.volumeSelector.container);const r=document.createElement("div");r.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(r),this.volumeSelector.btn.append(o),this.repeatEl=(0,Vn.Z)("audio_repeat",{noRipple:!0}),a(this.repeatEl,(()=>{const e=wa.Z.getPlaybackParams();e.round?e.loop?(wa.Z.round=!1,wa.Z.loop=!1):wa.Z.loop=!wa.Z.loop:wa.Z.round=!0}));const d=this.fasterEl=(0,Vn.Z)("playback_2x",{noRipple:!0});a(d,(()=>{wa.Z.playbackRate=d.classList.contains("active")?1:1.75})),this.wrapperUtils.prepend(this.volumeSelector.btn,d,this.repeatEl);const l=document.createElement("div");l.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new Va.Z(void 0,void 0,!0,!0),this.progressLine.container.classList.add("pinned-audio-progress"),l.append(this.progressLine.container),this.wrapper.insertBefore(l,this.wrapperUtils),this.topbar.listenerSetter.add(wa.Z)("play",this.onMediaPlay),this.topbar.listenerSetter.add(wa.Z)("pause",this.onPause),this.topbar.listenerSetter.add(wa.Z)("stop",this.onStop),this.topbar.listenerSetter.add(wa.Z)("playbackParams",this.onPlaybackParams);const c=wa.Z.getPlayingDetails();c&&(this.onMediaPlay(c),this.onPlaybackParams(c.playbackParams))}destroy(){this.progressLine&&this.progressLine.removeListeners()}}!function(e){e[e.ONE=32]="ONE",e[e.TWO=15]="TWO",e[e.THREE=10]="THREE",e[e.FOUR=8]="FOUR",e[e.MORE=8]="MORE"}(Ga||(Ga={}));const $a="pinned-message-border";class qa{constructor(){this.drawRect=(e,t,i,s,n)=>`M${e},${t+n}a${n},${n},0,0,1,${i},0v${s-2*n}a${n},${n},0,0,1,${-i},0Z`,this.getClipPath=(e,t,i)=>{let s="";if(2===i)s=this.drawRect(0,0,2,t,1)+this.drawRect(0,t+2,2,t,1);else for(let e=0;e{let i;return e<=1?i=Ga.ONE:2===e?i=Ga.TWO:3===e?i=Ga.THREE:4===e?i=Ga.FOUR:e>3&&(i=Ga.MORE),i},this.getMarkHeight=(e,t)=>{let i;return e<=1?i=Ga.ONE:2===e?i=Ga.TWO:3===e?i=Ga.THREE:4===e?i=Ga.FOUR:e>3&&(i=Ga.MORE),i},this.getMarkTranslateY=(e,t,i)=>1===i?0:2===i?e?t+1:0:3===i?e?1===e?t+1:2*t+2+1:0:(t+1)*e,this.getTrackTranslateY=(e,t,i,s)=>t<=4||e<=1?0:e>=t-2?s-Ga.ONE-i:(e-2)*i+1*e,this.getTrackHeight=(e,t)=>e<=3?Ga.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add($a),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className=$a+"-wrapper-1",this.border.classList.remove($a+"-mask"),this.wrapper.innerHTML=this.wrapper.style.cssText=""),this.border;const i=this.getBarHeight(e,t),s=this.getMarkHeight(e,t),n=this.getTrackHeight(e,i),a=`clipPath_${e}`,o=this.getClipPath(a,i,e),r=this.getMarkTranslateY(t,i,e),d=this.getTrackTranslateY(t,e,i,n);return this.border.classList.toggle($a+"-mask",e>4),t<=1?(this.border.classList.add("mask-bottom"),this.border.classList.remove("mask-top")):t>=e-2?(this.border.classList.add("mask-top"),this.border.classList.remove("mask-bottom")):this.border.classList.add("mask-top","mask-bottom"),this.wrapper.className=$a+"-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${d}px);`,this.svg||(this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.setAttributeNS(null,"height","0"),this.svg.setAttributeNS(null,"width","0"),this.defs=document.createElementNS("http://www.w3.org/2000/svg","defs"),this.defs.append(o),this.svg.append(this.defs),this.mark=document.createElement("div"),this.mark.classList.add($a+"-mark")),this.svg.parentElement||this.wrapper.append(this.svg,this.mark),this.mark.style.cssText=`height: ${s}px; transform: translateY(${r}px);`,this.count=e,this.index=t,this.border}}var Qa=i(6724),Ya=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Xa{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=Xa.BASE_CLASS}getRow(e,t=!1){if(this.rows[e])return this.rows[e].element;const i=document.createElement("div"),s=!Object.keys(this.rows).length&&!t;return i.className=Xa.BASE_CLASS+"-row"+(s?"":" is-hiding hide"),this.rows[e]={element:i,new:!0},this.container.append(i),i}clearRow(e){this.rows[e]&&(this.rows[e].element.remove(),delete this.rows[e])}clearRows(e){this.clearTimeout&&clearTimeout(this.clearTimeout),this.clearTimeout=window.setTimeout((()=>{for(const t in this.rows)+t!==e&&this.clearRow(+t)}),Xa.DURATION)}setNewRow(e,t=!1){const i=this.rows[e];i.new&&(t?(i.element.classList.remove("hide"),i.element.offsetLeft):i.element.classList.remove("is-hiding","hide"),delete i.new),this.clearRows(e)}animate(e,t,i=e>t,s=!1){if(e===t)return this.setNewRow(e);const n=this.rows[e],a=this.rows[t];if(!a&&!s)return this.setNewRow(e);const o=["from-top","from-bottom"];i||o.reverse(),n.element.classList.add(o[0]),n.element.classList.remove(o[1]),a&&(a.element.classList.add(o[1]),a.element.classList.remove(o[0])),n.new&&this.setNewRow(e,!0),n.element.classList.toggle("is-hiding",!1),a&&a.element.classList.toggle("is-hiding",!0),this.clearRows(e)}}Xa.DURATION=200,Xa.BASE_CLASS="animated-super";class Ja{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=Ja.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=Ja.BASE_CLASS+"-decimal";const i=document.createElement("div");i.className=Ja.BASE_CLASS+"-decimal-placeholder";const s=new Xa;return s.container.className=Ja.BASE_CLASS+"-decimal-wrapper",t.append(i,s.container),this.container.append(t),this.decimals[e]={container:t,placeholder:i,animatedSuper:s}}clear(e){this.clearTimeout&&clearTimeout(this.clearTimeout);const t=(""+e).length;t>=this.decimals.length||(this.clearTimeout=window.setTimeout((()=>{this.decimals.splice(t,this.decimals.length-t).forEach((e=>{e.container.remove()}))}),Xa.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach((t=>{const i=+t.placeholder.innerText||0;t.animatedSuper.getRow(Ja.EMPTY_INDEX,!0),t.animatedSuper.animate(Ja.EMPTY_INDEX,i,this.reverse?ethis.previousNumber,!0)})),this.clear(e)}setCount(e){const t=Array.from(""+this.previousNumber).map((e=>+e));Array.from(""+e).map((e=>+e)).forEach(((i,s)=>{var n;const a=this.getDecimal(s),o=a.animatedSuper.getRow(i,!0),r=null!==(n=t[s])&&void 0!==n?n:Ja.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+i,a.animatedSuper.animate(i,r,this.reverse?ethis.previousNumber,!0)})),this.hideLeft(e),this.previousNumber=e}}Ja.EMPTY_INDEX=-1,Ja.BASE_CLASS="animated-counter";class eo{constructor(e,t,i){this.topbar=e,this.chat=t,this.managers=i,this.pinnedMaxMid=0,this.pinnedMid=0,this.pinnedIndex=-1,this.wasPinnedIndex=0,this.wasPinnedMediaIndex=0,this.locked=!1,this.waitForScrollBottom=!1,this.count=0,this.mids=[],this.offsetIndex=0,this.loading=!1,this.loadedBottom=!1,this.loadedTop=!1,this.scrollDownListenerSetter=null,this.hidden=!1,this.getCurrentIndexPromise=null,this.listenerSetter=new ce.Z,this.log=(0,r.kg)("PM"),this.debug=!0,this.isStatic=!1;const s=new X("pinned-message",t.animationGroup);this.pinnedMessageContainer=new ja({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:s,onClose:()=>Ya(this,void 0,void 0,(function*(){return(yield i.appPeersManager.canPinMessage(this.chat.peerId))?new _s(this.chat.peerId,this.pinnedMid,!0):new _s(this.chat.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new qa,s.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new Xa,s.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new Xa,this.animatedMedia.container.classList.add("pinned-message-media-container"),s.content.prepend(this.animatedMedia.container),this.animatedCounter=new Ja(!0),s.title.append((0,L.ag)("PinnedMessage")," ",this.animatedCounter.container);const n=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(n),s.container.prepend(n),this.btnOpen=(0,Vn.Z)("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),(0,C.fc)(this.btnOpen,(e=>{(0,Le.Z)(e),this.topbar.openPinned(!0)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e})=>{e===this.chat.peerId&&(this.hidden&&this.pinnedMessageContainer.toggle(this.hidden=!1),this.loadedTop=this.loadedBottom=!1,this.pinnedIndex=-1,this.pinnedMid=0,this.count=0,this.mids=[],this.offsetIndex=0,this.pinnedMaxMid=0,this.setCorrectIndex(0))})),this.listenerSetter.add(d.Z)("peer_pinned_hidden",(({peerId:e})=>{e===this.chat.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)})),this.setPinnedMessage=(0,Te.Z)((()=>this._setPinnedMessage()),100,!0,!0),this.setCorrectIndexThrottled=(0,Qa.Z)(this.setCorrectIndex.bind(this),100,!1),this.isStatic=!this.chat.isPinnedMessagesNeeded()}destroy(){this.pinnedMessageContainer.divAndCaption.container.remove(),this.pinnedMessageContainer.toggle(!0),this.listenerSetter.removeAll(),this.unsetScrollDownListener(!1)}setCorrectIndex(e){if(this.isStatic)return;if(this.locked||this.hidden)return;if((this.loadedBottom||this.loadedTop)&&!this.count)return;const t=this.chat.bubbles.getBubbleByPoint("bottom");if(!t)return;const i=t.dataset.mid;t&&void 0!==i&&this.testMid(+i,e)}testMid(e,t){if(this.isStatic)return;if(this.hidden)return;let i=this.mids.findIndex((t=>t<=e));if(-1===i||this.isNeededMore(i)){if(!(this.loadedTop&&ei))return;this.pinnedIndex=i,this.pinnedMid=this.mids.find((t=>t<=e))||this.mids[this.mids.length-1],this.setPinnedMessage()}}isNeededMore(e){return this.count>eo.LOAD_COUNT&&(!this.loadedBottom&&e<=eo.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=eo.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return Ya(this,void 0,void 0,(function*(){if(!this.loading){this.loading=!0;try{const i=this.debug?this.log.bindPrefix("getCurrentIndex"):void 0;i&&i("start",e,t);let s=!1;const n=[this.managers.appMessagesManager.getSearch({peerId:this.chat.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:eo.LOAD_COUNT,backLimit:eo.LOAD_COUNT,threadId:this.chat.threadId}).then((e=>(s=!0,e)))];if(!this.pinnedMaxMid){const e=this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId,this.chat.threadId).then((e=>{e.maxId&&(this.pinnedMaxMid=e.maxId,!s&&t&&(this.mids=[this.pinnedMaxMid],this.count=e.count,this.pinnedIndex=0,this.pinnedMid=this.mids[0],this.setPinnedMessage()))}));n.push(e)}const a=(yield Promise.all(n))[0];let o=a.history.findIndex((t=>t.mid<=e));-1===o&&(o=a.history.length),this.offsetIndex=a.offset_id_offset?a.offset_id_offset-o:0,this.mids=a.history.map((e=>e.mid)).slice(),this.count=a.count,this.count||this.pinnedMessageContainer.toggle(!0),this.loadedTop=this.offsetIndex+this.mids.length===this.count,this.loadedBottom=!this.offsetIndex,i&&i("result",e,a,o,this.offsetIndex,this.loadedTop,this.loadedBottom)}catch(e){this.log.error("getCurrentIndex error",e)}this.loading=!1,this.locked?this.testMid(e):t&&this.setCorrectIndex(0),this.getCurrentIndexPromise=null}}))}setScrollDownListener(){this.waitForScrollBottom=!0,this.scrollDownListenerSetter||(this.scrollDownListenerSetter=new ce.Z,function(e,t,i,s){if(c.Z){let t;const n={passive:!0};s.add(e)("touchstart",(i=>{i.touches.length>1?o():(t=i.touches[0].clientY,s.add(e)("touchmove",a,n),s.add(e)("touchend",o,n))}),n);const a=e=>{const s=e.touches[0].clientY,n=s{s.removeManual(e,"touchmove",a,n),s.removeManual(e,"touchend",o,n)}}else s.add(e)("wheel",(e=>{const t=e.deltaY>0;!t||i()}),{passive:!0})}(this.chat.bubbles.scrollable.container,0,(()=>{this.unsetScrollDownListener()}),this.scrollDownListenerSetter))}unsetScrollDownListener(e=!0){this.waitForScrollBottom=!1,this.scrollDownListenerSetter&&(this.scrollDownListenerSetter.removeAll(),this.scrollDownListenerSetter=null),e&&this.setCorrectIndex(0)}handleFollowingPinnedMessage(){return Ya(this,void 0,void 0,(function*(){this.locked=!0,this.debug&&this.log("handleFollowingPinnedMessage");try{this.setScrollDownListener();const e=this.chat.setPeerPromise;e instanceof Promise&&(yield e),yield(0,pe.e9)(),this.getCurrentIndexPromise&&(yield this.getCurrentIndexPromise),this.debug&&this.log("handleFollowingPinnedMessage: unlock"),this.locked=!1}catch(e){this.log.error("handleFollowingPinnedMessage error:",e),this.locked=!1,this.waitForScrollBottom=!1,this.setCorrectIndex(0)}}))}followPinnedMessage(e){return Ya(this,void 0,void 0,(function*(){(yield this.chat.getMessage(e))&&(this.chat.setMessageId(e),(this.chat.setPeerPromise||Promise.resolve()).then((()=>{this.handleFollowingPinnedMessage(),this.testMid(this.pinnedIndex>=this.count-1?this.pinnedMaxMid:e-1)})))}))}_setPinnedMessage(){return Ya(this,void 0,void 0,(function*(){const e=this.count;if(e){const t=this.pinnedIndex,i=yield this.chat.getMessage(this.pinnedMid),s=0===t;this.animatedCounter.container.classList.toggle("is-last",s),s||this.animatedCounter.setCount(e-t),this.pinnedMessageContainer.toggle(!1);const n=t>this.wasPinnedIndex;this.debug&&this.log("setPinnedMessage: fromTop",n,t,this.wasPinnedIndex);const a=this.animatedSubtitle.getRow(t),o=this.animatedMedia.getRow(t);o.classList.add("pinned-message-media");const r=[],d=yield Y({title:void 0,titleEl:null,subtitle:i.message,subtitleEl:a,message:i,mediaEl:o,loadPromises:r,animationGroup:this.chat.animationGroup});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",d),this.animatedSubtitle.animate(t,this.wasPinnedIndex),d?(this.animatedMedia.animate(t,this.wasPinnedMediaIndex),this.wasPinnedMediaIndex=t):this.animatedMedia.clearRows(),this.pinnedMessageBorder.render(e,e-t-1),this.wasPinnedIndex=t,this.pinnedMessageContainer.divAndCaption.container.dataset.mid=""+i.mid}else this.pinnedMessageContainer.toggle(!0),this.wasPinnedIndex=0;this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-many",this.count>1)}))}}eo.LOAD_COUNT=50,eo.LOAD_OFFSET=5;var to=i(6194),io=i(2995),so=i(4240),no=i(6818),ao=i(3897),oo=i(7120),ro=i(2059),lo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class co{constructor(e,t,i){this.chat=e,this.appSidebarRight=t,this.managers=i,this.verifyButtons=e=>{const t=!!e||!(!this.btnMore||!this.btnMore.classList.contains("menu-open"));e&&(0,Le.Z)(e),(()=>{lo(this,void 0,void 0,(function*(){const e=this.buttonsToVerify.concat(t?this.menuButtons:[]);(yield Promise.all(e.map((e=>lo(this,void 0,void 0,(function*(){return{result:yield e.verify(),button:e}})))))).forEach((({button:e,result:t})=>{e.element.classList.toggle("hide",!t)}))}))})()},this.verifyVideoChatButton=e=>lo(this,void 0,void 0,(function*(){var t;if(!no.Z||this.peerId.isUser()||"chat"!==this.chat.type||this.chat.threadId)return!1;const i=ro.ZP.groupCall,s=this.peerId.toChatId();if((null==i?void 0:i.chatId)===s)return!1;if(e&&((yield this.managers.appPeersManager.isBroadcast(this.peerId))&&"group"===e||(yield this.managers.appPeersManager.isAnyGroup(this.peerId))&&"broadcast"===e))return!1;const n=yield this.managers.appChatsManager.getChat(s);return(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)||(0,oo.Z)(n,"manage_call")})),this.verifyCallButton=e=>lo(this,void 0,void 0,(function*(){if(!Ue.Z||!this.peerId.isUser())return!1;const t=this.peerId.toUserId(),i=yield this.managers.appProfileManager.getCachedFullUser(t);return!!i&&!!("voice"===e?i.pFlags.phone_calls_available:i.pFlags.video_calls_available)})),this.onJoinGroupCallClick=()=>{this.chat.appImManager.joinGroupCall(this.peerId)},this.onMuteClick=()=>{new ao.Z(this.peerId)},this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",o.Z.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===o._.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),x.IS_SAFARI&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame((()=>{x.IS_SAFARI&&e&&this.chatUtils.classList.remove("hide");const t=this.chatUtils.getBoundingClientRect().width;this.chat.log("utils width:",t),this.container.style.setProperty("--utils-width",t+"px"),this.setUtilsRAF=0}))},this.setFloating=()=>{var e;const t=[this.chatAudio,null===(e=this.pinnedMessage)||void 0===e?void 0:e.pinnedMessageContainer].filter(Boolean).reduce(((e,t)=>{const i=t.isFloating();return this.container.classList.toggle(`is-pinned-${t.className}-floating`,i),t.isVisible()?e+ +i:e}),0);this.container.dataset.floating=""+t},this.setPeerStatusManual=(e=!1)=>lo(this,void 0,void 0,(function*(){if(!this.subtitle||"chat"!==this.chat.type)return;if(this.chat.threadId){const e=yield(0,Kt.Z)({peerId:this.peerId,dialog:!0}),t=(0,L.ag)("TopicProfileStatus",[e]);return()=>(0,H.Z)(this.subtitle,t)}const t=this.peerId;return this.chat.appImManager.setPeerStatus({peerId:t,element:this.subtitle,needClear:e,useWhitespace:!1,middleware:()=>t===this.peerId})})),this.setPeerStatus=e=>this.setPeerStatusManual(e).then((e=>{null==e||e()})),this.listenerSetter=new ce.Z,this.menuButtons=[],this.buttonsToVerify=[]}construct(){this.container=document.createElement("div"),this.container.classList.add("sidebar-header","topbar","hide"),this.container.dataset.floating="0",this.btnBack=(0,Vn.Z)("left sidebar-close-button",{noRipple:!0}),this.chatInfoContainer=document.createElement("div"),this.chatInfoContainer.classList.add("chat-info-container"),this.chatInfo=document.createElement("div"),this.chatInfo.classList.add("chat-info");const e=this.person=document.createElement("div");e.classList.add("person");const t=document.createElement("div");t.classList.add("content");const i=document.createElement("div");i.classList.add("top"),this.title=document.createElement("div"),this.title.classList.add("user-title"),i.append(this.title);const s=document.createElement("div");s.classList.add("bottom"),this.subtitle&&s.append(this.subtitle),t.append(i,s),this.avatarElement&&e.append(this.avatarElement),e.append(t),this.chatInfo.append(e),this.chatUtils=document.createElement("div"),this.chatUtils.classList.add("chat-utils"),this.chatAudio=new Wa(this,this.chat,this.managers),this.menuButtons.length&&(this.btnMore=(0,Mn.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:this.menuButtons,onOpen:(e,t)=>lo(this,void 0,void 0,(function*(){const e=this.menuButtons[this.menuButtons.length-1];if(null==e?void 0:e.element){const t=yield this.managers.appPeersManager.getDeleteButtonText(this.peerId);e.element.lastChild.replaceWith((0,L.ag)(t))}}))})),this.chatUtils.append(...[this.pinnedMessage?this.pinnedMessage.pinnedMessageContainer.divAndCaption.container:null,this.btnJoin,this.btnPinned,this.btnCall,this.btnGroupCall,this.btnMute,this.btnSearch,this.btnMore].filter(Boolean)),this.pushButtonToVerify(this.btnCall,this.verifyCallButton.bind(this,"voice")),this.pushButtonToVerify(this.btnGroupCall,this.verifyVideoChatButton),this.chatInfoContainer.append(this.btnBack,this.chatInfo,this.chatUtils),this.container.append(this.chatInfoContainer),this.chatAudio&&this.container.append(this.chatAudio.divAndCaption.container),this.listenerSetter.add(window)("resize",this.onResize),this.listenerSetter.add(o.Z)("changeScreen",this.onChangeScreen),(0,C.fc)(this.container,(e=>{const t=(0,be.Z)(e.target,"pinned-container");if((0,Qn.Z)(),t){if((0,Le.Z)(e),(0,be.Z)(e.target,"progress-line"))return;const i=+t.dataset.mid;if(t.classList.contains("pinned-message"))this.pinnedMessage.followPinnedMessage(i);else{const e=t.dataset.peerId.toPeerId(),s=wa.Z.getSearchContext();this.chat.appImManager.setInnerPeer({peerId:e,lastMsgId:i,type:s.isScheduled?"scheduled":s.threadId?"discussion":void 0,threadId:s.threadId})}}else o.Z.activeScreen===o._.medium&&document.body.classList.contains(n.ir)?r():(0,ye.Z)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains(a.HQ)):this.appSidebarRight.toggleSidebar(!0)}),{listenerSetter:this.listenerSetter});const r=e=>{if(e&&(0,Le.Z)(e),o.Z.activeScreen===o._.medium&&document.body.classList.contains(n.ir))this.chat.appImManager.setPeer({peerId:this.peerId});else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);Hn.Z.back(e?"im":"chat")}};(0,C.fc)(this.btnBack,r,{listenerSetter:this.listenerSetter})}pushButtonToVerify(e,t){e&&this.buttonsToVerify.push({element:e,verify:t})}constructUtils(){this.menuButtons=[{icon:"search",text:"Search",onClick:()=>{this.chat.initSearch()},verify:()=>o.Z.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>lo(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&d.Z.myId!==this.peerId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.chat.threadId}))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,threadId:this.chat.threadId})},verify:()=>lo(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&d.Z.myId!==this.peerId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.chat.threadId}))}))},{icon:"comments",text:"ViewDiscussion",onClick:()=>{const e=this.chat.bubbles.getMiddleware();Promise.resolve(this.managers.appProfileManager.getChannelFull(this.peerId.toChatId())).then((t=>{e()&&t.linked_chat_id&&this.chat.appImManager.setInnerPeer({peerId:t.linked_chat_id.toPeerId(!0)})}))},verify:()=>lo(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getCachedFullChat(this.peerId.toChatId());return"chat"===this.chat.type&&!!(null==e?void 0:e.linked_chat_id)}))},{icon:"phone",text:"Call",onClick:this.onCallClick.bind(this,"voice"),verify:this.verifyCallButton.bind(this,"voice")},{icon:"videocamera",text:"VideoCall",onClick:this.onCallClick.bind(this,"video"),verify:this.verifyCallButton.bind(this,"video")},{icon:"videochat",text:"PeerInfo.Action.LiveStream",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"broadcast")},{icon:"videochat",text:"PeerInfo.Action.VoiceChat",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"group")},{icon:"select",text:"Chat.Menu.SelectMessages",onClick:()=>{const e=this.chat.selection;e.toggleSelection(!0,!0),Cn.Z.getState().then((t=>{if(t.chatContextMenuHintWasShown)return;const i=e.toggleByElement.bind(e);e.toggleByElement=t=>lo(this,void 0,void 0,(function*(){this.managers.appStateManager.pushToState("chatContextMenuHintWasShown",!0),(0,we.Am)((0,L.ag)("Chat.Menu.Hint")),e.toggleByElement=i,e.toggleByElement(t)}))}))},verify:()=>!this.chat.selection.isSelecting&&!!this.chat.bubbles.getRenderedLength()},{icon:"select",text:"Chat.Menu.ClearSelection",onClick:()=>{this.chat.selection.cancelSelection()},verify:()=>this.chat.selection.isSelecting},{icon:"adduser",text:"AddContact",onClick:()=>{if(!this.appSidebarRight.isTabExists(so.Z)){const e=this.appSidebarRight.createTab(so.Z);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>lo(this,void 0,void 0,(function*(){return this.peerId.isUser()&&!(yield this.managers.appPeersManager.isContact(this.peerId))}))},{icon:"forward",text:"ShareContact",onClick:()=>{const e=this.peerId;new io.Z({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise(((i,s)=>{new As.Z("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new N.Z({peerId:t,dialog:!0}).element],buttons:[{langKey:"Send",callback:()=>{i(),this.managers.appMessagesManager.sendContact(t,e),this.chat.appImManager.setInnerPeer({peerId:t})}},{langKey:"Cancel",callback:()=>{s()},isCancel:!0}],peerId:t,overlayClosable:!0}).show()})),placeholder:"ShareModal.Search.Placeholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})},verify:()=>lo(this,void 0,void 0,(function*(){return d.Z.myId!==this.peerId&&this.peerId.isUser()&&(yield this.managers.appPeersManager.isContact(this.peerId))&&!!(yield this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone}))},{icon:"bots",text:"Settings",onClick:()=>{this.managers.appMessagesManager.sendText(this.peerId,"/settings")},verify:()=>lo(this,void 0,void 0,(function*(){var e;try{const t=yield this.managers.appAttachMenuBotsManager.getAttachMenuBot(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.has_settings)}catch(e){return!1}}))},{icon:"lock",text:"BlockUser",onClick:()=>{new As.Z("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new N.Z({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!0).then((e=>{e&&(0,we.bC)({langPackKey:"UserBlocked"})}))}}]}).show()},verify:()=>lo(this,void 0,void 0,(function*(){var e;if(!this.peerId.isUser())return!1;const t=yield this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());return this.peerId!==d.Z.myId&&t&&!(null===(e=t.pFlags)||void 0===e?void 0:e.blocked)}))},{icon:"lockoff",text:"Unblock",onClick:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!1).then((e=>{e&&(0,we.bC)({langPackKey:"UserUnblocked"})}))},verify:()=>lo(this,void 0,void 0,(function*(){var e;const t=yield this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.blocked)}))},{icon:"delete danger",text:"Delete",onClick:()=>{new to.Z(this.peerId)},verify:()=>lo(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&!!(yield this.managers.appMessagesManager.getDialogOnly(this.peerId))}))}],this.btnSearch=(0,Vn.Z)("search"),this.attachClickEvent(this.btnSearch,(e=>{this.chat.initSearch()}),!0)}attachClickEvent(e,t,i){(0,C.fc)(e,(e=>{(0,Le.Z)(e),!i&&(0,Qn.Z)(),t(e)}),{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructAvatar(){const e=new f.Z;return e.isDialog=!0,e.classList.add("avatar-42","person-avatar"),e}get peerId(){return this.chat.peerId}constructPeerHelpers(){return this.avatarElement=this.constructAvatar(),this.subtitle=document.createElement("div"),this.subtitle.classList.add("info"),this.pinnedMessage=new eo(this,this.chat,this.managers),this.btnJoin=(0,He.Z)("btn-primary btn-color-primary chat-join hide"),this.btnCall=(0,Vn.Z)("phone"),this.btnGroupCall=(0,Vn.Z)("videochat"),this.btnPinned=(0,Vn.Z)("pinlist"),this.btnMute=(0,Vn.Z)("mute"),this.attachClickEvent(this.btnCall,this.onCallClick.bind(this,"voice")),this.attachClickEvent(this.btnGroupCall,this.onJoinGroupCallClick),this.attachClickEvent(this.btnPinned,(()=>{this.openPinned(!0)})),this.attachClickEvent(this.btnMute,this.onMuteClick),this.attachClickEvent(this.btnJoin,(()=>lo(this,void 0,void 0,(function*(){const e=this.chat.bubbles.getMiddleware();this.btnJoin.setAttribute("disabled","true");const t=this.peerId.toChatId();let i;i=(yield this.managers.appChatsManager.isChannel(t))?this.managers.appChatsManager.joinChannel(t):this.managers.appChatsManager.addChatUser(t,d.Z.myId),i.finally((()=>{e()&&this.btnJoin.removeAttribute("disabled")}))})))),this.listenerSetter.add(d.Z)("chat_update",(e=>lo(this,void 0,void 0,(function*(){var t;if(this.peerId===e.toPeerId(!0)){const i=yield this.managers.appChatsManager.getChat(e);this.btnJoin.classList.toggle("hide",!(null===(t=null==i?void 0:i.pFlags)||void 0===t?void 0:t.left)),this.setUtilsWidth(),this.verifyButtons()}})))),this.listenerSetter.add(d.Z)("dialog_notify_settings",(e=>{e.peerId===this.peerId&&this.setMutedState()})),this.listenerSetter.add(d.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),this.listenerSetter.add(d.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),this.listenerSetter.add(d.Z)("peer_full_update",(e=>{this.peerId===e&&this.verifyButtons()})),this.chat.addEventListener("setPeer",((e,t)=>{const i=this.chat.bubbles.getMiddleware();Cn.Z.getState().then((s=>{i()&&this.pinnedMessage&&(this.pinnedMessage.hidden=!!s.hiddenPinnedMessages[this.chat.peerId],t?(this.pinnedMessage.unsetScrollDownListener(),this.pinnedMessage.testMid(e,0)):this.pinnedMessage.locked||(this.pinnedMessage.handleFollowingPinnedMessage(),this.pinnedMessage.testMid(e)))}))})),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e,mids:t})=>{"pinned"===this.chat.type&&e===this.peerId&&t&&this.setTitle()})),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}openPinned(e){this.chat.appImManager.setInnerPeer({peerId:this.peerId,lastMsgId:e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,type:"pinned"})}destroy(){var e,t;this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),null===(e=this.pinnedMessage)||void 0===e||e.destroy(),null===(t=this.chatAudio)||void 0===t||t.destroy(),delete this.chatAudio,delete this.pinnedMessage}cleanup(){this.chat.peerId||this.container.classList.add("hide")}finishPeerChange(e){var t;return lo(this,void 0,void 0,(function*(){const{peerId:e,threadId:i}=this.chat;let s;"chat"===this.chat.type&&(s=(null===(t=this.avatarElement)||void 0===t?void 0:t.peerId)!==this.peerId||this.avatarElement.threadId!==this.chat.threadId?this.constructAvatar():this.avatarElement);const[n,a,o,r,d,l,c]=yield Promise.all([this.managers.appPeersManager.isBroadcast(e),this.managers.appPeersManager.isAnyChat(e),e.isAnyChat()?this.managers.appChatsManager.getChat(e.toChatId()):void 0,s?s.updateWithOptions({peerId:e,threadId:i,wrapOptions:{customEmojiSize:(0,Qe.C)(32,32)}}):void 0,this.setTitleManual(),this.setPeerStatusManual(!0),Cn.Z.getState()]);return()=>{var t,i;const r=!("pinned"===this.chat.type||"scheduled"===this.chat.type);this.btnMute&&this.btnMute.classList.toggle("hide",!n||!r),this.btnJoin&&(a&&!this.chat.isRestricted&&r?((0,H.Z)(this.btnJoin,(0,L.ag)(n?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(t=null==o?void 0:o.pFlags)||void 0===t?void 0:t.left))):this.btnJoin.classList.add("hide")),this.btnSearch&&this.btnSearch.classList.toggle("hide",!r),this.btnPinned&&this.btnPinned.classList.toggle("hide",!r),this.avatarElement!==s&&(s&&(this.avatarElement?this.avatarElement.replaceWith(s):this.person.prepend(s)),null===(i=this.avatarElement)||void 0===i||i.remove(),this.avatarElement=s),this.setUtilsWidth(),this.verifyButtons(),this.btnMore&&this.btnMore.classList.toggle("hide",!r);const h=this.chat.isPinnedMessagesNeeded();if(h||"discussion"===this.chat.type){if(this.chat.wasAlreadyUsed||!this.pinnedMessage){const e=new eo(this,this.chat,this.managers);this.pinnedMessage?(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy()):this.chatUtils.prepend(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage=e}h?this.pinnedMessage.hidden=!!c.hiddenPinnedMessages[e]:"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage())}else this.pinnedMessage&&(this.pinnedMessage.destroy(),this.pinnedMessage=void 0);d(),null==l||l(),this.subtitle.classList.toggle("hide",!l),this.setMutedState(),this.container.classList.remove("hide")}}))}setTitleManual(e){return lo(this,void 0,void 0,(function*(){const{peerId:t,threadId:i}=this.chat,s=()=>this.chat.bubbles.getMiddleware();let n;if("pinned"===this.chat.type)n=void 0===e?(0,L.ag)("Loading"):(0,L.ag)("PinnedMessagesCount",[e]),void 0===e&&this.managers.appMessagesManager.getSearchCounters(t,[{_:"inputMessagesFilterPinned"}],!1).then((e=>{if(!s())return;const t=e[0].count;if(this.setTitle(t),!t){this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}}));else if("scheduled"===this.chat.type)n=(0,L.ag)(t===d.Z.myId?"Reminders":"ScheduledMessages");else if("discussion"===this.chat.type){if(void 0===e){const n=yield this.managers.acknowledged.appMessagesManager.getHistory(t,0,1,0,i);if(!s())return;if(n.cached){const t=yield n.result;if(!s())return;e=t.count}else n.result.then((e=>{s()&&this.setTitle(e.count)}))}n=void 0===e?(0,L.ag)("Loading"):(0,L.ag)("Chat.Title.Comments",[e])}else if("chat"===this.chat.type&&([n]=yield Promise.all([(0,Kt.Z)({peerId:t,dialog:!0,withIcons:!i,threadId:i})]),!s()))return;return()=>{(0,H.Z)(this.title,n)}}))}setTitle(e){this.setTitleManual(e).then((e=>e()))}setMutedState(){return lo(this,void 0,void 0,(function*(){if(!this.btnMute)return;const e=this.peerId,t=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1,threadId:this.chat.threadId});(yield this.managers.appPeersManager.isBroadcast(e))?(this.btnMute.classList.remove("tgico-mute","tgico-unmute"),this.btnMute.classList.add(t?"tgico-unmute":"tgico-mute"),this.btnMute.style.display=""):this.btnMute.style.display="none"}))}}var ho=i(5884),uo=i(3607);class po extends Ji._{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(e,t,i,s){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new uo.Z("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=(0,Vn.Z)("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const n=document.createElement("div");n.classList.add("chatlist-container"),this.scrollable.container.replaceWith(n),this.appSearch=new ho.Z(n,this.inputSearch,{messages:new ho.z("Chat.Search.PrivateSearch","messages")}),this.peerId?this.appSearch.beginSearch(this.peerId,this.threadId,s):(this.query=s,this.peerId=e,this.threadId=t,this.onDatePick=i,this.btnPickDate.classList.toggle("hide",!this.onDatePick),this.onDatePick&&(0,C.fc)(this.btnPickDate,(()=>{S.Z.createPopup(I,new Date,this.onDatePick).show()})),s&&this.appSearch.searchInput.inputField.setValueSilently(s),a.ZP.toggleSidebar(!0))}}class fo{constructor(e,t,i){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{(0,Le.Z)(e),S.Z.createPopup(I,new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=(0,ye.Z)(e.target,es.DIALOG_LIST_ELEMENT_TAG);t&&this.selectResult(t)},this.onFooterClick=e=>{this.foundCount&&(this.chat.bubbles.container.classList.toggle("search-results-active"),this.results.classList.toggle("active"))},this.onUpClick=e=>{(0,Le.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{(0,Le.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex-1])},this.element=document.createElement("div"),this.element.classList.add("sidebar-header","chat-search","chatlist-container"),this.backBtn=document.createElement("button"),this.backBtn.classList.add("btn-icon","tgico-left","sidebar-close-button"),(0,A.Z)(this.backBtn);const s=this.listenerSetter=new ce.Z,n=(e,t)=>{(0,C.fc)(e,t,{listenerSetter:s})};n(this.backBtn,(()=>{this.destroy()})),this.inputSearch=new uo.Z("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new ho.z(!1,"messages",void 0,"",!1),n(this.searchGroup.list,this.onResultsClick),this.appSearch=new ho.Z(this.results,this.inputSearch,{messages:this.searchGroup},(e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):((0,H.Z)(this.foundCountEl,this.inputSearch.value?(0,L.ag)("NoResult"):""),this.results.classList.remove("active"),this.chat.bubbles.container.classList.remove("search-results-active"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"))})),this.appSearch.beginSearch(this.chat.peerId,this.chat.threadId),this.chat.bubbles.container.append(this.results),this.footer=document.createElement("div"),this.footer.classList.add("chat-search-footer"),n(this.footer,this.onFooterClick),(0,A.Z)(this.footer),this.foundCountEl=document.createElement("span"),this.foundCountEl.classList.add("chat-search-count"),this.dateBtn=document.createElement("button"),this.dateBtn.classList.add("btn-icon","tgico-calendar"),this.controls=document.createElement("div"),this.controls.classList.add("chat-search-controls"),this.upBtn=document.createElement("button"),this.upBtn.classList.add("btn-icon","tgico-up"),this.downBtn=document.createElement("button"),this.downBtn.classList.add("btn-icon","tgico-down"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"),n(this.dateBtn,this.onDateClick),n(this.upBtn,this.onUpClick),n(this.downBtn,this.onDownClick),this.controls.append(this.upBtn,this.downBtn),this.footer.append(this.foundCountEl,this.dateBtn,this.controls),this.topbar.container.parentElement.insertBefore(this.footer,t.input.chatInput),this.element.append(this.backBtn,this.inputSearch.container),this.topbar.container.classList.add("hide-pinned"),this.topbar.container.parentElement.append(this.element),this.inputSearch.input.focus(),i&&this.setQuery(i),x.IS_MOBILE_SAFARI||(this.navigationItem={type:"mobile-search",onPop:()=>{this.destroy()}},Hn.Z.pushItem(this.navigationItem))}destroy(){this.topbar.container.classList.remove("hide-pinned"),this.element.remove(),this.inputSearch.remove(),this.results.remove(),this.footer.remove(),this.listenerSetter.removeAll(),this.chat.bubbles.container.classList.remove("search-results-active"),this.chat.search=void 0,Hn.Z.removeItem(this.navigationItem)}setQuery(e){this.inputSearch.inputField.value=e}selectResult(e){if(this.setPeerPromise)return this.setPeerPromise;const t=e.dataset.peerId.toPeerId(),i=+e.dataset.mid||void 0,s=(0,Me.Z)(e);s===this.foundCount-1?this.upBtn.setAttribute("disabled","true"):this.upBtn.removeAttribute("disabled"),s?this.downBtn.removeAttribute("disabled"):this.downBtn.setAttribute("disabled","true"),this.results.classList.remove("active"),this.chat.bubbles.container.classList.remove("search-results-active");const n=this.chat.setPeer({peerId:t,lastMsgId:i});this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then((()=>{this.selectedIndex=s,(0,H.Z)(this.foundCountEl,(0,L.ag)("Of",[s+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()})).finally((()=>{this.setPeerPromise=null}))}}var mo=i(1571),go=i(6848),vo=i(356);class bo{constructor(){this.canvases=new Set}static getInstance(e){let t=this.INSTANCES.find((t=>(0,go.Z)(t.options,e)));return t||(t=new bo,t.init(e),this.INSTANCES.push(t)),t}init(e){this.options=e}renderToCanvas(e){return this.renderImageFromUrl(this.options.url).then((()=>this.fillCanvas(e)))}renderImageFromUrl(e){if(this.renderImageFromUrlPromise)return this.renderImageFromUrlPromise;const t=this.image=document.createElement("img");return t.crossOrigin="anonymous",this.renderImageFromUrlPromise=(0,Ut.cj)(t,e,!1).then((()=>vo.Z?createImageBitmap(t,{resizeWidth:1440,resizeHeight:2960}).then((e=>(this.imageBitmap=e,t))):t))}cleanup(e){var t;this.canvases.delete(e),this.canvases.size||((0,h.Z)(bo.INSTANCES,this),this.objectUrl&&(null===(t=this.imageBitmap)||void 0===t||t.close(),URL.revokeObjectURL(this.objectUrl)))}fillCanvas(e){const t=e.getContext("2d"),{width:i,height:s}=e,n=this.imageBitmap||this.image;let a=n.width,o=n.height;const r=(500+Ae.Z.height/2.5)*e.dpr;a*=r/o,o=r,this.options.mask?(t.fillStyle="#000",t.fillRect(0,0,i,s),t.globalCompositeOperation="destination-out"):t.globalCompositeOperation="source-over";const d=e=>{for(let s=0;s0){let e=l;do{d(e-=o)}while(e>=0)}const c=s-1;for(let e=l+o;ei.resize(e,t))))}}bo.INSTANCES=[];var yo=i(6714),wo=i(9439),So=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Co extends l.Z{constructor(e,t){super(),this.appImManager=e,this.managers=t,this.type="chat",this.animationGroup=`chat-${Math.round(65535*Math.random())}`,this.container=document.createElement("div"),this.container.classList.add("chat","tabs-tab"),this.backgroundEl=document.createElement("div"),this.backgroundEl.classList.add("chat-background"),this.log=(0,r.kg)("CHAT",r.v9.Log|r.v9.Warn|r.v9.Debug|r.v9.Error),this.log.warn("constructor"),this.peerId=m.NM,this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container),this.backgroundTempId=0,this.sharedMediaTabs=[]}setBackground(e,t){var i;const s=yo.Z.getTheme().settings.wallpaper,n=(0,wo.EM)(s);let a;if(n&&!s.slug&&!s.settings.intensity&&"grabbing"===document.documentElement.style.cursor&&this.gradientRenderer&&!this.patternRenderer)return this.gradientCanvas.dataset.colors=n,this.gradientRenderer.init(this.gradientCanvas),Promise.resolve();const o=++this.backgroundTempId,r=this.gradientRenderer,l=this.patternRenderer,c=(this.gradientCanvas,this.patternCanvas);this.gradientRenderer=this.patternRenderer=this.gradientCanvas=this.patternCanvas=void 0;const h=(null===(i=s.settings)||void 0===i?void 0:i.intensity)&&s.settings.intensity/100,u=!!h&&h<0;let p,f,m,g=null==a?void 0:a.firstElementChild;if(!a)if(a=document.createElement("div"),a.classList.add("chat-background-item"),e)if(h){a.classList.add("is-pattern");const t=this.appImManager.chatsContainer.getBoundingClientRect();p=this.patternRenderer=bo.getInstance({url:e,width:t.width,height:t.height,mask:u}),g=this.patternCanvas=p.createCanvas(),g.classList.add("chat-background-item-canvas","chat-background-item-pattern-canvas"),u&&a.classList.add("is-dark")}else a.classList.add("is-image");else a.classList.add("is-color");if(n){const{canvas:e,gradientRenderer:t}=mo.Z.create(n);m=this.gradientRenderer=t,f=this.gradientCanvas=e,f.classList.add("chat-background-item-canvas","chat-background-item-color-canvas"),d.Z.settings.animationsEnabled&&m.scrollAnimate(!0)}p&&(u?f:g).style.setProperty("--opacity-max",""+Math.abs(h)*(u?.5:1));const v=new Promise((i=>{const s=()=>{if(this.backgroundTempId!==o)return p&&p.cleanup(g),void(m&&m.cleanup());const e=this.backgroundEl.lastElementChild;if(e===a)return void i();const s=[f,g].filter(Boolean);s.length&&a.append(...s),this.backgroundEl.append(a),(0,De.Z)({element:a,className:"is-visible",forwards:!0,duration:t?0:200,onTransitionEnd:e?()=>{null==l||l.cleanup(c),null==r||r.cleanup(),e.remove()}:null,useRafs:2}),i()};p?p.renderToCanvas(g).then((()=>{this.backgroundTempId===o&&s()})):e?(0,Ut.ZP)(a,e,s):s()}));return this.setBackgroundPromise=Promise.race([(0,at.Z)(500),v])}setType(e){this.type=e}init(){this.topbar=new co(this,a.ZP,this.managers),this.bubbles=new Zs(this,this.managers),this.input=new Ua(this,this.appImManager,this.managers),this.contextMenu=new on(this,this.managers),this.selection=new Ha.Z(this,this.bubbles,this.input,this.managers),this.topbar.constructUtils(),this.topbar.constructPeerHelpers(),this.topbar.construct(),this.input.construct(),this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers(),c.Z||this.bubbles.setReactionsHoverListeners(),this.bubbles.attachContainerListeners(),this.container.append(this.topbar.container,this.bubbles.container,this.input.chatInput),this.bubbles.listenerSetter.add(d.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer({peerId:t})})),this.bubbles.listenerSetter.add(d.Z)("dialog_drop",(e=>{e.peerId!==this.peerId||"dialog"!==e._&&this.threadId!==e.id||this.appImManager.setPeer()}));const e=e=>{const t=()=>{var t;null===(t=this.bubbles.observer)||void 0===t||t.toggleObservingNew(e),s.Z.toggleIntersectionGroup(this.animationGroup,e),e&&s.Z.checkAnimations(e,this.animationGroup)};e?t():setTimeout((()=>{t()}),400)};this.bubbles.listenerSetter.add(this.appImManager)("chat_changing",(({to:t})=>{e(t!==this)})),this.bubbles.listenerSetter.add(this.appImManager)("tab_changing",(t=>{e(this.appImManager.chat!==this||t!==Yr.CHAT&&o.Z.activeScreen===o._.mobile)}))}beforeDestroy(){this.bubbles.cleanup()}cleanupBackground(){++this.backgroundTempId,this.patternRenderer&&(this.patternRenderer.cleanup(this.patternCanvas),this.patternRenderer=void 0),this.gradientRenderer&&(this.gradientRenderer.cleanup(),this.gradientRenderer=void 0)}destroy(){this.destroySharedMediaTab(),this.topbar.destroy(),this.bubbles.destroy(),this.input.destroy(),this.contextMenu&&this.contextMenu.destroy(),this.selection&&this.selection.attachListeners(void 0,void 0),this.cleanupBackground(),delete this.topbar,delete this.bubbles,delete this.input,delete this.selection,delete this.contextMenu,this.container.remove()}cleanup(e=!0){this.input.cleanup(e),this.topbar.cleanup(),this.selection.cleanup()}get isForumTopic(){return!(!this.isForum||!this.threadId)}onChangePeer(e,t){var i;return So(this,void 0,void 0,(function*(){const{peerId:s,threadId:n}=this,o=a.ZP.getTab(po);null==o||o.close();const[r,d,l,c,h,u,p,f,m]=yield t(Promise.all([this.managers.appPeersManager.noForwards(s),this.managers.appPeersManager.isPeerRestricted(s),this._isAnyGroup(s),this.setAutoDownloadMedia(),this.managers.appPeersManager.isMegagroup(s),this.managers.appPeersManager.isBroadcast(s),this.managers.appPeersManager.isChannel(s),this.managers.appPeersManager.isBot(s),this.managers.appPeersManager.isForum(s)]));m&&n&&(yield t(this.managers.dialogsStorage.getForumTopicOrReload(s,n))),this.noForwards=r,this.isRestricted=d,this.isAnyGroup=l,this.isMegagroup=h,this.isBroadcast=u,this.isChannel=p,this.isBot=f,this.isForum=m,this.isAllMessagesForum=m&&!n,n&&!this.isForum&&(e.type="discussion");const g=null!==(i=e.type)&&void 0!==i?i:"chat";this.setType(g),this.messagesStorageKey=`${this.peerId}_${"scheduled"===this.type?"scheduled":"history"}`,this.container.classList.toggle("no-forwards",this.noForwards),this.sharedMediaTab=a.ZP.createSharedMediaTab(),this.sharedMediaTabs.push(this.sharedMediaTab),this.sharedMediaTab.setPeer(s,n),this.input.clearHelper(),this.selection.cleanup()}))}setPeer(e){const{peerId:t,threadId:i}=e;t?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=void 0;const s=this.appImManager.isSamePeer(this,e);if(s){if(this.setPeerPromise)return}else this.appImManager.dispatchEvent("peer_changing",this),this.peerId=t||m.NM,this.threadId=i;if(!t)return a.ZP.toggleSidebar(!1),this.cleanup(!0),this.bubbles.setPeer({samePeer:!1,peerId:t}),this.peerId=0,this.appImManager.dispatchEvent("peer_changed",this),a.ZP.replaceSharedMediaTab(),this.destroySharedMediaTab(),void(this.sharedMediaTab=void 0);this.peerChanged=s;const n=this.bubbles.setPeer(Object.assign(Object.assign({},e),{samePeer:s})),o=this.setPeerPromise=n.then((e=>e.promise)).catch(Ye.Z).finally((()=>{this.setPeerPromise===o&&(this.setPeerPromise=null)}));return n}destroySharedMediaTab(e=this.sharedMediaTab){e&&((0,h.Z)(this.sharedMediaTabs,e),e.destroy())}setAutoDownloadMedia(){return So(this,void 0,void 0,(function*(){this.autoDownload=yield function(e){return t=this,i=void 0,n=function*(){let t,i=0,s=0,n=0;const a=d.Z.settings,o=d.Z.managers.appPeersManager;return!a.autoDownloadNew.pFlags.disabled&&e&&(t=e.isUser()?(yield o.isContact(e))?"contacts":"private":(yield o.isBroadcast(e))?"channels":"groups",a.autoDownload.photo[t]&&(i=a.autoDownloadNew.photo_size_max),a.autoDownload.video[t]&&(s=a.autoDownloadNew.video_size_max),a.autoDownload.file[t]&&(n=a.autoDownloadNew.file_size_max)),{photo:i,video:s,file:n}},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}(this.peerId)}))}setMessageId(e){return this.setPeer({peerId:this.peerId,threadId:this.threadId,lastMsgId:e})}finishPeerChange(e,t,i,s){return So(this,void 0,void 0,(function*(){if(this.peerChanged)return;const t=this.peerId;this.peerChanged=!0,this.wasAlreadyUsed=!0;const i=this.bubbles.getMiddleware();this.cleanup(!1);const n=this.sharedMediaTab,o=Promise.all([this.topbar.finishPeerChange(e),this.bubbles.finishPeerChange(),this.input.finishPeerChange(s),n.fillProfileElements()]),r=yield o;n.loadSidebarMedia(!0),i()&&(r.forEach((e=>{null==e||e()})),a.ZP.replaceSharedMediaTab(n),this.sharedMediaTabs.filter((e=>e!==n)).forEach((e=>this.destroySharedMediaTab(e))),this.container.dataset.type=this.type,this.log.setPrefix("CHAT-"+t+"-"+this.type),this.appImManager.dispatchEvent("peer_changed",this))}))}getMessage(e){return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey,e)}getMidsByMid(e){return So(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.getMidsByMessage(yield this.getMessage(e))}))}getHistoryStorage(e){return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId,e?void 0:this.threadId).then((e=>Object.assign(Object.assign({},e),{history:ve.Z.fromJSON(e.historySerialized)})))}getDialogOrTopic(){return this.isForum&&this.threadId?this.managers.dialogsStorage.getForumTopic(this.peerId,this.threadId):this.managers.dialogsStorage.getDialogOnly(this.peerId)}getHistoryMaxId(){return this.getHistoryStorage().then((e=>e.maxId))}_isAnyGroup(e){return So(this,void 0,void 0,(function*(){return e===d.Z.myId||e===m.hj||(yield this.managers.appPeersManager.isAnyGroup(e))}))}initSearch(e){if(this.peerId)if(o.Z.isMobile)this.search?this.search.setQuery(e):this.search=new fo(this.topbar,this,e);else{let t=a.ZP.getTab(po);t||(t=a.ZP.createTab(po)),t.open(this.peerId,this.threadId,this.bubbles.onDatePick,e)}}canSend(e){return this.managers.appMessagesManager.canSendToPeer(this.peerId,this.threadId,e)}isStartButtonNeeded(){return Promise.all([this.managers.appPeersManager.isBot(this.peerId),this.managers.appMessagesManager.getDialogOnly(this.peerId),this.getHistoryStorage(!0)]).then((([e,t,i])=>e&&!t&&!i.history.length))}getMessageSendingParams(){return{threadId:this.threadId,replyToMsgId:this.input.replyToMsgId,scheduleDate:this.input.scheduleDate,silent:this.input.sendSilent,sendAsPeerId:this.input.sendAsPeerId}}isOurMessage(e){return e.fromId===d.Z.myId||!!e.pFlags.out&&this.isMegagroup}isOutMessage(e){const t=e.fwd_from;return!(!this.isOurMessage(e)||t&&this.peerId===d.Z.myId)}isAvatarNeeded(e){return this.isAnyGroup&&!this.isOutMessage(e)}isPinnedMessagesNeeded(){return"chat"===this.type||this.isForum}}var Lo=i(2342),Eo=i(6637);class Io{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,c.Z){if(e&&(0,Le.Z)(e),0!=this.mouseUpCounter++)return void this.hide();this.resetSelection(this.savedRange)}this.show()}}init(){this.container=document.createElement("div"),this.container.classList.add("markup-tooltip","z-depth-1","hide"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("markup-tooltip-wrapper");const e=document.createElement("div"),t=document.createElement("div");e.classList.add("markup-tooltip-tools"),t.classList.add("markup-tooltip-tools"),["bold","italic","underline","strikethrough","monospace","spoiler","link"].forEach((t=>{const i=(0,Vn.Z)(t,{noRipple:!0});e.append(this.buttons[t]=i),"link"!==t?i.addEventListener("mousedown",(e=>{(0,Le.Z)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()})):(0,C.fc)(i,(e=>{(0,Le.Z)(e),this.showLinkEditor(),this.cancelClosening()}))})),this.linkBackButton=(0,Vn.Z)("left",{noRipple:!0}),this.linkInput=document.createElement("input"),(0,L.$d)(this.linkInput,"MarkupTooltip.LinkPlaceholder",void 0,"placeholder"),this.linkInput.classList.add("input-clear"),this.linkInput.addEventListener("keydown",(e=>{const t=!this.linkInput.value.length||!!(0,Lo.Z)(this.linkInput.value);"Enter"===e.key&&(t?this.applyLink(e):(this.linkInput.classList.contains("error")&&(this.linkInput.classList.remove("error"),this.linkInput.offsetLeft),this.linkInput.classList.add("error")))})),this.linkInput.addEventListener("input",(e=>{const t=this.isLinkValid();this.linkInput.classList.toggle("is-valid",t),this.linkInput.classList.remove("error")})),this.linkBackButton.addEventListener("mousedown",(e=>{(0,Le.Z)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()})),this.linkApplyButton=(0,Vn.Z)("check markup-tooltip-link-apply",{noRipple:!0}),this.linkApplyButton.addEventListener("mousedown",(e=>{this.applyLink(e)}));const i=document.createElement("div");i.classList.add("markup-tooltip-link-apply-container");const s=document.createElement("span"),n=document.createElement("span"),a=document.createElement("span");s.classList.add("markup-tooltip-delimiter"),n.classList.add("markup-tooltip-delimiter"),a.classList.add("markup-tooltip-delimiter"),e.insertBefore(s,this.buttons.link),i.append(a,this.linkApplyButton),t.append(this.linkBackButton,n,this.linkInput,i),this.wrapper.append(e,t),this.container.append(this.wrapper),document.body.append(this.container),window.addEventListener("resize",(()=>{this.hide()}))}showLinkEditor(){this.container&&this.container.classList.contains("is-visible")||this.show();const e=this.buttons.link;this.container.classList.add("is-link");const t=document.getSelection();if(this.savedRange=t.getRangeAt(0),e.classList.contains("active")){const e=this.savedRange.startContainer.parentElement;this.linkInput.value=e.href}else this.linkInput.value="";this.setTooltipPosition(!0),setTimeout((()=>{this.linkInput.focus()}),200),this.linkInput.classList.toggle("is-valid",this.isLinkValid())}applyLink(e){(0,Le.Z)(e),this.resetSelection();let t=this.linkInput.value;t&&!(0,Eo.Z)(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout((()=>{this.hide()}),0)}isLinkValid(){return!this.linkInput.value.length||!!(0,Lo.Z)(this.linkInput.value)}resetSelection(e=this.savedRange){const t=window.getSelection();t.removeAllRanges(),t.addRange(e),this.appImManager.chat.input.messageInput.focus()}hide(){this.init||(this.container.classList.remove("is-visible"),document.removeEventListener("mouseup",this.onMouseUpSingle),this.waitingForMouseUp=!1,Hn.Z.removeByType("markup"),this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=window.setTimeout((()=>{this.hideTimeout=void 0,this.container.classList.add("hide"),this.container.classList.remove("is-link")}),200))}getActiveMarkupButton(){const e=new Set,t=Object.keys(this.buttons),i=Da(t);return t.forEach((t=>{i[t]&&e.add(this.buttons[t])})),[...e]}setActiveMarkupButton(){const e=this.getActiveMarkupButton();for(const t in this.buttons){const i=this.buttons[t];i.classList.toggle("active",e.includes(i))}}setTooltipPosition(e=!1){const t=document.getSelection().getRangeAt(0),i=document.body.getBoundingClientRect(),s=t.getBoundingClientRect(),n=this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();this.container.style.maxWidth=n.width+"px";const a=(0,ze.Z)(void 0,this.appImManager.chat.input.messageInput,!1,s).rect.top+-1*i.top,o=(this.container.classList.contains("is-link")?this.wrapper.lastElementChild:this.wrapper.firstElementChild).getBoundingClientRect(),r=a-o.height-8,d=n.left,l=n.left+n.width-Math.min(n.width,o.width);let c;if(e){const e=this.container.getBoundingClientRect();c=(0,Vi.Z)(e.left,d,l)}else{const e=s.left+(s.width-o.width)/2;c=(0,Vi.Z)(e,d,l)}this.container.style.transform=`translate3d(${c}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),Ds())return void this.hide();if(void 0!==this.hideTimeout&&clearTimeout(this.hideTimeout),this.container.classList.contains("is-visible"))return;this.setActiveMarkupButton(),this.container.classList.remove("is-link");const e=this.container.classList.contains("hide");e&&(this.container.classList.remove("hide"),this.container.classList.add("no-transition")),this.setTooltipPosition(),e&&(this.container.offsetLeft,this.container.classList.remove("no-transition")),this.container.classList.add("is-visible"),x.IS_MOBILE||Hn.Z.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){c.Z&&!x.IS_APPLE&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",(e=>{(0,Le.Z)(e),this.mouseUpCounter=1,this.waitingForMouseUp=!1,this.setMouseUpEvent()}),{once:!0}))}handleSelection(){this.addedListener||(this.addedListener=!0,document.addEventListener("selectionchange",(e=>{if(document.activeElement===this.linkInput)return;const t=this.appImManager.chat.input.messageInput;if(document.activeElement!==t)return void this.hide();const i=document.getSelection();if(Ds(i))this.hide();else if(c.Z)if(x.IS_APPLE)this.show(),this.setTooltipPosition();else{if(2===this.mouseUpCounter)return void(this.mouseUpCounter=0);this.savedRange=i.getRangeAt(0),this.setMouseUpEvent()}else this.container&&this.container.classList.contains("is-visible")?this.setTooltipPosition():t.matches(":active")?this.setMouseUpEvent():this.show()})),document.addEventListener("beforeinput",(e=>{"historyRedo"!==e.inputType&&"historyUndo"!==e.inputType||e.target.addEventListener("input",(()=>this.setActiveMarkupButton()),{once:!0})})))}}var Mo=i(9171);class Po{constructor(e,t){let i;this.options=t,this.onDragOver=e=>{this.container.classList.add("is-dragover")},this.onDragLeave=e=>{this.container.classList.remove("is-dragover")},this.onDrop=e=>{this.options.onDrop(e)},this.container=document.createElement("div"),this.container.classList.add("drop","z-depth-1"),this.outlineWrapper=document.createElement("div"),this.outlineWrapper.classList.add("drop-outline-wrapper"),this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.classList.add("drop-outline"),this.path=document.createElementNS("http://www.w3.org/2000/svg","path"),this.path.classList.add("drop-outline-path"),t.icon&&(i=document.createElement("div"),i.classList.add("drop-icon","tgico-"+t.icon));const s=document.createElement("div");let n;s.classList.add("drop-header"),s.append((0,L.ag)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append((0,L.ag)(t.subtitle))),this.svg.append(this.path),this.outlineWrapper.append(this.svg),this.container.append(...[this.outlineWrapper,i,s,n].filter(Boolean)),e.append(this.container),this.container.addEventListener("dragover",this.onDragOver),this.container.addEventListener("dragleave",this.onDragLeave),this.container.addEventListener("drop",this.onDrop)}destroy(){delete this.options,this.container.remove(),this.container.removeEventListener("dragover",this.onDragOver),this.container.removeEventListener("dragleave",this.onDragLeave),this.container.removeEventListener("drop",this.onDrop)}setPath(){const e=this.outlineWrapper.getBoundingClientRect();this.svg.setAttributeNS(null,"preserveAspectRatio","none"),this.svg.setAttributeNS(null,"viewBox",`0 0 ${e.width} ${e.height}`),this.svg.setAttributeNS(null,"width",`${e.width}`),this.svg.setAttributeNS(null,"height",`${e.height}`);const t=10,i=e.width-t,s=e.height-t,n=(0,Mo.Z)(5,5,i,s,t,t,t,t);this.path.setAttributeNS(null,"d",n)}}var Zo=i(7922);function To(e){e.forEach((e=>e.classList.add("no-transition"))),(0,fe.d1)().then((()=>{e.forEach((e=>e.classList.remove("no-transition")))}))}var ko=i(490),xo=i(2831),Ao=i(2207);class _o{constructor(e){this.maxRadius=10,this.minRadius=0,this.N=e,this.radius=new Array(e+1),this.radiusNext=new Array(e+1),this.progress=new Array(e+1),this.speed=new Array(e+1);for(let t=0;t<=e;t++)this.generateBlob(this.radius,t),this.generateBlob(this.radiusNext,t),this.progress[t]=0}generateBlob(e,t){const{maxRadius:i,minRadius:s,speed:n}=this,a=i-s;e[t]=s+Math.random()*a,n[t]=.017+.003*Math.random()}generateNextBlob(){const{radius:e,radiusNext:t,progress:i,N:s}=this;for(let n=0;n=1&&(s[r]=0,a[r]=o[r],this.generateBlob(o,r))}draw(e,t,i,s,n,a,o,r){if(n.getContext){const d=n.getContext("2d");d.beginPath(),d.moveTo(i,s),d.lineTo(e,s);const{radius:l,radiusNext:c,N:h}=this;for(let n=0;n<=h;n++)if(0===n){const i=this.progress[n],s=(t-(l[n]*(1-i)+c[n]*i))*r+o*(1-r);d.lineTo(e,s)}else{const a=this.progress[n-1],u=l[n-1]*(1-a)+c[n-1]*a,p=this.progress[n],f=(i-e)/h*(n-1),m=(i-e)/h*n,g=f+(m-f)/2,v=(t-u)*r+o*(1-r),b=(t-(l[n]*(1-p)+c[n]*p))*r+o*(1-r);d.bezierCurveTo(g,v,g,b,m,b),n===h&&d.lineTo(i,s)}a(d),d.fill(),d.closePath()}}}class Fo{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,i,s,n,a)=>{t.fillStyle=Fo.getGradientFromType(t,e,i,s,n,a)}}static getGradientFromType(e,t,i,s,n,a){const o=e.createLinearGradient(i,s,n,a);return t===Ao.Z.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===Ao.Z.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===Ao.Z.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===Ao.Z.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,i,s){}}class Do{constructor(){this.handleDevicePixelRatioChanged=e=>{this.setSize(),this.forceUpdate()},this.handleResize=()=>{this.resizeHandler&&(clearTimeout(this.resizeHandler),this.resizeHandler=null),this.resizing=!0,this.resizeCanvas(),this.resizeHandler=window.setTimeout((()=>{this.resizing=!1,this.invokeDraw()}),250)},this.handleFocus=()=>{this.focused=!0,this.invokeDraw()},this.handleBlur=()=>{this.focused=!1},this.invokeDraw=()=>{this.raf||this.draw()},this.draw=(e=!1)=>{if(this.raf=null,!this.mounted)return;const{lbd:t,lbd1:i,lbd2:s,scale:n,left:a,top:o,right:r,bottom:d,currentState:l,previousState:c,focused:h,resizing:u,canvas:p}=this;if(!h&&!u&&this.progressToState>=1)return;let f=Date.now()-this.lastUpdateTime;f>20&&(f=17),this.animateToAmplitude!==this.amplitude&&(this.amplitude+=this.animateAmplitudeDiff*f,this.animateAmplitudeDiff>0?this.amplitude>this.animateToAmplitude&&(this.amplitude=this.animateToAmplitude):this.amplitude0?this.amplitude2>this.animateToAmplitude&&(this.amplitude2=this.animateToAmplitude):this.amplitude21&&(this.progressToState=1,this.previousState=null));const{amplitude:m,amplitude2:g,progressToState:v}=this,b=6*g*n,y=6*g*n;p.getContext("2d").clearRect(0,0,p.width,p.height),t.minRadius=0,t.maxRadius=(2+2*m)*n,i.minRadius=0,i.maxRadius=(3+9*m)*n,s.minRadius=0,s.maxRadius=(3+9*m)*n,t.update(m,.3),i.update(m,.7),s.update(m,.7);for(let e=0;e<2;e++){if(0===e&&!c)continue;let n=1,h=null;0===e?(n=1-v,h=c):(n=c?v:1,l.update(d-o,r-a,f,m),h=l);const u=e=>{e.globalAlpha=.3*n,h.shader(e,a,o,r,d)},g=t=>{t.globalAlpha=0===e?1:n,h.shader(t,a,o,r,d)};i.draw(a,o-b,r,d,p,u,o,1),s.draw(a,o-y,r,d,p,u,o,1),t.draw(a,o,r,d,p,g,o,1)}e||(this.raf=requestAnimationFrame((()=>this.draw())))},this.setCurrentState=(e,t)=>{const{currentState:i,states:s}=this;(null==i?void 0:i.stateId)!==e&&(this.previousState=t?i:null,this.currentState=s.get(e),this.progressToState=this.previousState?0:1)},this.focused=!0,this.resizing=!1,this.lastUpdateTime=Date.now(),this.amplitude=0,this.amplitude2=0,this.states=new Map([[Ao.Z.UNMUTED,new Fo(Ao.Z.UNMUTED)],[Ao.Z.MUTED,new Fo(Ao.Z.MUTED)],[Ao.Z.MUTED_BY_ADMIN,new Fo(Ao.Z.MUTED_BY_ADMIN)],[Ao.Z.CONNECTING,new Fo(Ao.Z.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(Ao.Z.CONNECTING),this.progressToState=1}componentDidMount(){this.mounted||(this.mounted=!0,window.addEventListener("resize",this.handleResize),this.media=window.matchMedia("screen and (min-resolution: 2dppx)"),this.media.addEventListener("change",this.handleDevicePixelRatioChanged),this.setSize(),this.forceUpdate(),this.lbd=new _o(3),this.lbd1=new _o(7),this.lbd2=new _o(8),this.setAmplitude(this.amplitude),this.draw())}componentWillUnmount(){this.mounted=!1,window.removeEventListener("resize",this.handleResize),this.media.addEventListener("change",this.handleDevicePixelRatioChanged);const{canvas:e}=this;e.getContext("2d").clearRect(0,0,e.width,e.height)}setSize(){this.scale=window.devicePixelRatio,this.top=20*this.scale,this.right=(this.mounted?this.container.offsetWidth:1261)*this.scale,this.bottom=(this.mounted?this.container.offsetHeight:68)*this.scale,this.left=0*this.scale,this.setCanvasSize()}setCanvasSize(){this.canvas.width=this.right,this.canvas.height=this.bottom}resizeCanvas(){this.scale=window.devicePixelRatio,this.right=this.container.offsetWidth*this.scale,this.forceUpdate(),this.invokeDraw()}setAmplitude(e){const{amplitude:t}=this;this.animateToAmplitude=e,this.animateAmplitudeDiff=(e-t)/250,this.animateAmplitudeDiff2=(e-t)/120}forceUpdate(){this.setCanvasSize()}render(e){const t=this.container=document.createElement("div");t.classList.add(e);const i=this.canvas=document.createElement("canvas");return i.classList.add(e+"-canvas"),t.append(i),t}}var Ro=i(8222);class Bo{constructor(e,t){this.item=e,(0,zn.Z)(this,t)}play(e){return this.item.playPart(this,e)}}class No{constructor(e,t){this.icon=e,this.autoplay=!1,(0,zn.Z)(this,t),this.parts=this.parts.map((e=>this.createPart(e)))}load(){var e;let t=this.loadPromise;if(t)return t;const{container:i,canvas:s,width:n,height:a}=this.icon;return t=Bs.Z.loadAnimationAsAsset({container:i,canvas:s,width:n,height:a,group:"none",loop:!1,autoplay:null!==(e=this.autoplay)&&void 0!==e&&e,initFrame:this.initFrame,skipFirstFrameRendering:void 0===this.initFrame,color:this.color,inverseColor:this.inverseColor},this.name).then((e=>Bs.Z.waitForFirstFrame(e))).then((e=>{this.player=e,this.onLoadForColor&&(this.onLoadForColor(),this.onLoadForColor=void 0),this.onLoadForPart&&(this.onLoadForPart(),this.onLoadForPart=void 0)})),this.loadPromise=t,this.icon.loadPromises.set(this.name,t),t}createPart(e){return new Bo(this,e)}getPart(e){return e instanceof Bo?e:"string"==typeof e?this.parts.find((t=>t.name===e)):this.parts[e]}playPart(e,t){return this.icon.playPart(this,e,t)}}class Oo{constructor(e){(0,zn.Z)(this,e),this.container||(this.container=document.createElement("div")),this.container.classList.add("rlottie-icon");const{width:t,height:i}=this;this.container.style.width=t+"px",this.container.style.height=i+"px";const s=this.canvas=document.createElement("canvas");s.classList.add("rlottie"),s.width=t,s.height=i,this.items=new Map,this.loadPromises=new Map}get loadPromise(){return Promise.all([...this.loadPromises.values()]).then(Ye.Z)}getItem(e){return e||1!==this.items.size?this.items.get(e):this.items.values().next().value}add(e){const t=new No(this,e);return this.items.set(e.name,t),t}playPart(e,t,i){if(!e.player)return void(e.onLoadForPart=()=>{this.playPart(e,t,i)});const s=e.getPart(t);e.player.playPart({from:d.Z.settings.animationsEnabled&&!this.skipAnimation?s.startFrame:s.endFrame,to:s.endFrame,callback:i})}static generateEqualParts(e,t){return new Array(e).fill(0).map(((e,i)=>{const s=i*t;return{startFrame:s,endFrame:s+t-1}}))}}class Uo extends Oo{constructor(e){super({width:e.width,height:e.height}),(0,zn.Z)(this,e)}load(e,t){if(this.loaded)return this.loadPromise;this.loaded=!0,this.partState=e,this.colorState=t;const i=this.getPart(e),s=void 0!==t&&this.getColor&&this.getColor(t),n=i.item;n.initFrame=i.endFrame,n.color=s;const a=[...this.items.values()].map((e=>e.load()));return Promise.all(a).then(Ye.Z)}setState(e,t,i){this.loaded||this.load(e,t);let s=!1,n=!1;return void 0!==e?s=this.setPartState(e,t,i):void 0!==t&&(n=this.setColorState(t)),s||n}setPartState(e,t,i){const{partState:s}=this;return s===e?void 0!==t&&this.setColorState(t):(void 0!==t&&this.setColorState(t,!1),this.partState=e,this.getPart(e,s).play(i),!0)}setColorState(e,t=!0){const{colorState:i}=this;if(i===e||!this.getColor)return!1;this.colorState=e;const s=this.getItem(),n=this.getColor(e,i),a=()=>{s.player.setColor(n,t)};return s.player?a():s.onLoadForColor=a,!0}destroy(){this.items.forEach((e=>{e.loadPromise.then((()=>{e.player.remove()}))}))}}class Ho extends Uo{constructor(){super({width:36,height:36,getPart:(e,t)=>{const i=mr;let s;switch(e){case i.HAND:s=t===i.MUTED?"muted-to-hand":"unmuted-to-hand";break;case i.MUTED:s=t===i.HAND?"hand-to-muted":"mute";break;case i.UNMUTED:s="unmute"}return this.getItem().getPart(s)}}),this.container.classList.add("group-call-microphone-icon-container"),this.add({name:"voip_filled",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:172,name:"unmuted-to-hand"},{startFrame:173,endFrame:201,name:"scheduled-crossing"},{startFrame:202,endFrame:236,name:"scheduled-to-muted"},{startFrame:237,endFrame:273,name:"scheduled-to-hand"},{startFrame:274,endFrame:310,name:"scheduled-crossed-to-hand"},{startFrame:311,endFrame:343,name:"scheduled-uncrossing"},{startFrame:344,endFrame:375,name:"scheduled-to-muted"},{startFrame:376,endFrame:403,name:"play-to-muted"}]})}}var zo=i(6733);class jo extends Uo{constructor(e){super({width:32,height:32,getPart:(e,t)=>{const i=fr;let s;switch(e){case i.HAND:s=3;break;case i.MUTED:s=t===i.HAND?0:2;break;case i.UNMUTED:s=1}return this.getItem().getPart(s)},getColor:e?(e,t)=>function(e){const t=fr;let i;switch(e){case t.HAND:i="blue";break;case t.MUTED:case t.MUTED_FOR_ME:case t.MUTED_BY_ADMIN:i=e===t.MUTED?"secondary":"red";break;case t.UNMUTED:i="green"}const s=Ro.Z.getProperty("gc-"+i+"-text-color");return(0,O.oo)(s)}(e):void 0}),this.colored=e,this.container.classList.add("group-call-participant-muted-icon-container");const t=Oo.generateEqualParts(4,21);this.add({name:"voice_outlined2",parts:t})}setState(e){return super.setState(function(e){const t=fr;switch(e){case t.MUTED_BY_ADMIN:case t.MUTED_FOR_ME:return t.MUTED;default:return e}}(e),e)}}const Go="group-call-participant-status";class Vo{constructor(e){this.withIcons=e,this.container=document.createElement("div"),this.container.classList.add(Go+"-container")}setState(e,t){const i=fr,s=this.withIcons.filter((e=>!!t[e])).map((e=>{const t="tgico-"+("presentation"===e?"listscreenshare":"videocamera_filled"),i=document.createElement("i");return i.classList.add(Go+"-icon",Go+"-icon-"+e,t),i}));let n,a;if(e===i.MUTED_FOR_ME)n=(0,L.ag)("VoiceChat.Status.MutedForYou"),a="is-muted";else if(e===i.UNMUTED)n=(0,L.ag)("VoiceChat.Status.Speaking"),a="is-speaking";else if(e===i.HAND)n=(0,L.ag)("VoiceChat.Status.WantsSpeak"),a="is-waiting";else{if(t.about&&!s.length)return void(0,F.Z)(this.container,(0,B.Z)(t.about));n=(0,L.ag)("VoiceChat.Status.Listening"),a="is-listening"}const o=document.createElement("span");o.classList.add(Go,a),o.append(...s,n),(0,H.Z)(this.container,o)}}var Ko=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Wo extends fs.Z{constructor(e){super({getIndex:e=>Ko(this,void 0,void 0,(function*(){return(yield this.instance.getParticipantByPeerId(e.id)).date})),onDelete:e=>{e.dom.listEl.remove(),this.onElementDestroy(e)},onUpdate:e=>Ko(this,void 0,void 0,(function*(){const t=yield this.instance.getParticipantByPeerId(e.id),i=gr(t);e.mutedIcon.setState(i),e.status.setState(i,t)})),onSort:(e,t)=>{(0,p.Z)(e.dom.listEl,this.list,t)},onElementCreate:e=>{const{dom:t}=es.default.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,wrapOptions:{lazyLoadQueue:this.lazyLoadQueue}});t.listEl.classList.add("group-call-participant");const i=new jo(!0),s=new Vo(["presentation","video"]);return(0,H.Z)(t.lastMessageSpan,s.container),t.listEl.append(i.container),e.mutedIcon=i,e.status=s,e.dom=t,e},updateElementWith:fe.T2}),this.instance=e,this.avatarSize="abitbigger",this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=es.default.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach((e=>{this.onElementDestroy(e)}))}onElementDestroy(e){e.mutedIcon.destroy()}}var $o=i(7529);function qo(e){const t=document.createElement("canvas");t.classList.add("call-video-blur"),t.width=16,t.height=16;const i=t.getContext("2d",{alpha:!1});i.filter="blur(2px)";const s=()=>{i.drawImage(e,0,0,e.videoWidth,e.videoHeight,0,0,t.width,t.height)};return(0,Pe.jt)((()=>(s(),t.isConnected))),s(),t}const Qo="group-call-participant-video";class Yo{constructor(e,t,i){this.managers=e,this.instance=t,this.source=i,this.container=document.createElement("div"),this.container.classList.add(Qo+"-container"),this.info=document.createElement("div"),this.info.classList.add(Qo+"-info"),this.left=document.createElement("div"),this.left.classList.add(Qo+"-info-left"),this.right=document.createElement("div"),this.right.classList.add(Qo+"-info-right"),this.info.append(this.left,this.right),this.container.append(this.info)}setPinned(e){if(!e)return void(this.header&&(this.header.remove(),this.header=void 0));if(this.header)return;this.header=document.createElement("div"),this.header.classList.add(Qo+"-header");const t=document.createElement("i");t.classList.add("group-call-pin-icon","tgico-pin"),this.header.append(t),this.container.append(this.header)}setParticipant(e,t,i){let s;e.pFlags.self?(s=(0,L.ag)("VoiceChat.Status.You"),s.classList.add("peer-title")):(this.peerTitle=new N.Z({peerId:(0,R.Z)(e.peer)}),s=this.peerTitle.element),this.groupCallParticipantMutedIcon=new jo(!1),this.groupCallParticipantStatus=new Vo([t]),this.left.append(s,this.groupCallParticipantStatus.container),this.right.append(this.groupCallParticipantMutedIcon.container),i.classList.add(Qo,"call-video"),i.paused&&i.play();const n=qo(i);n.classList.add(Qo+"-blur"),this.container.prepend(n,i),this.updateParticipant(e)}updateParticipant(e){const t=gr(e);this.groupCallParticipantMutedIcon.setState(t),this.groupCallParticipantStatus.setState(t,e)}destroy(){this.groupCallParticipantMutedIcon.destroy()}}class Xo extends $o.Z{constructor(e){super(),(0,zn.Z)(this,e);const t=this.container=document.createElement("div");this.container.classList.add("group-call-participants-video-container"),e.appendTo.append(t),this.participantsElements=new Map,this.containers=new Map;const{listenerSetter:i}=this;i.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),i.add(this.instance)("pinned",(e=>{this.participantsElements.forEach((t=>{t.forEach((t=>{this.setElementDisplay(t,e)}))}))})),(0,C.fc)(this.container,(e=>{const t=(0,be.Z)(e.target,"group-call-participant-video-container");if(!t)return;const i=this.containers.get(t);this.instance.pinnedSource!==i.source?this.instance.pinSource(i.source):this.instance.unpinAll()}),{listenerSetter:i}),this.setInstance(this.instance),this.setup({element:t,listenerSetter:i,showOnLeaveToClassName:"group-call-buttons"})}shouldDisplayElement(e,t){return this.displayPinned?!t||e.source===t:t&&e.source!==t}setElementDisplay(e,t){const i=this.shouldDisplayElement(e,t);e.container.classList.toggle("video-hidden",!i);const s=e.source===t;e.setPinned(s)}updateParticipant(e){const t=(0,R.Z)(e.peer),i=["video","presentation"],s=i.some((t=>!!e[t]));let n=this.participantsElements.get(t);(s||n)&&(n||this.participantsElements.set(t,n=new Map),i.forEach((i=>{let s=n.get(i);const a=e[i];if(!!a!=!!s){if(a){const t=this.instance.getVideoElementFromParticipantByType(e,i);if(!t)return;const{video:a,source:o}=t;s=new Yo(this.managers,this.instance,o),this.containers.set(s.container,s),this.setElementDisplay(s,this.instance.pinnedSource),n.set(i,s),s.setParticipant(e,i,a),this.container.prepend(s.container)}else n.delete(i),s.container.remove(),n.size||(this.participantsElements.delete(t),this.containers.delete(s.container),s.destroy());this._onLengthChange()}else s&&s.updateParticipant(e)})))}_onLengthChange(){const e=this.container.childElementCount;this.container.dataset.length=""+e,this.container.dataset.layout=e<=2?"1":3===e?"3":"4",this.onLengthChange&&this.onLengthChange(e)}setInstance(e){return t=this,i=void 0,n=function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}destroy(){this.containers.forEach((e=>{e.destroy()}))}}var Jo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class er{constructor(e){this.onOpenProfileClick=()=>{const e=S.Z.getPopups(yr)[0];e&&e.hide(),td.setInnerPeer({peerId:this.targetPeerId})},this.toggleParticipantMuted=e=>{this.instance.editParticipant(this.participant,{muted:e})},this.buttons=[{icon:"gc_microphoneoff",text:"VoiceChat.MutePeer",verify:()=>this.canManageCall&&this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmutePeer",verify:()=>this.canManageCall&&!this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"gc_microphoneoff",text:"VoiceChat.MuteForMe",verify:()=>!this.canManageCall&&!this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmuteForMe",verify:()=>!this.canManageCall&&this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"newprivate",text:"VoiceChat.OpenProfile",verify:()=>!0,onClick:this.onOpenProfileClick},{icon:"deleteuser danger",text:"VoiceChat.RemovePeer",verify:()=>this.managers.appChatsManager.hasRights(this.chatId,"ban_users"),onClick:()=>Jo(this,void 0,void 0,(function*(){(0,bi.Z)({peerId:this.targetPeerId,title:new N.Z({peerId:this.targetPeerId}).element,descriptionLangKey:(yield this.managers.appChatsManager.isBroadcast(this.chatId))?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new N.Z({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then((()=>{this.managers.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)}),Ye.Z)}))}];const{listenerSetter:t}=e;this.managers=e.managers,this.instance=e.instance,this.chatId=this.instance.chatId,this.element=(0,ks.b)({buttons:this.buttons,listenerSetter:t}),this.element.classList.add("group-call-participant-menu","night"),(0,Lt.E)({element:e.onContextElement,callback:e=>Jo(this,void 0,void 0,(function*(){const t=(0,be.Z)(e.target,"group-call-participant");if(!t)return;this.element.parentElement!==i&&i.append(this.element),(0,Le.Z)(e);const s=this.targetPeerId=t.dataset.peerId.toPeerId();this.participant=yield this.instance.getParticipantByPeerId(s),this.participant.pFlags.self||(this.canManageCall=yield this.managers.appChatsManager.hasRights(this.chatId,"manage_call"),yield(0,tn.Z)(this.buttons,(e=>Jo(this,void 0,void 0,(function*(){const t=yield e.verify(s);return e.element.classList.toggle("hide",!t),t})))),(0,en.Z)(e.touches?e.touches[0]:e,this.element,"right"),Et.Z.openBtnMenu(this.element))})),listenerSetter:t}),t.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{if(this.instance.id===e){const e=(0,R.Z)(t.peer);this.targetPeerId===e&&Et.Z.close()}}));let i=document.body;(0,zo.Ms)(document.body,(()=>{const e=(0,zo.rB)();i=e?S.Z.getPopups(yr)[0].getContainer():document.body,e||Et.Z.close()}),t)}}class tr{constructor(e){(0,zn.Z)(this,e);const t="group-call-participants",i=new T.ZP(void 0);i.container.classList.add(t+"-scrollable");const s=this.container=document.createElement("div");s.classList.add(t);const n=this.sortedList=new Wo(this.instance),{instance:a,listenerSetter:o}=this;this.contextMenu=new er(Object.assign(Object.assign({},e),{onContextElement:n.list,listenerSetter:o,instance:a})),this.groupCallParticipantsVideo=new Xo(Object.assign(Object.assign({},e),{appendTo:i.container,displayPinned:!1})),i.append(n.list),s.append(i.container),e.appendTo.append(s),o.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),new Ks.Z({scrollable:i,getPromise:()=>this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then((({participants:e,isEnd:t})=>(e.forEach((e=>{this.updateParticipant(e)})),t)))}),this.setInstance(a)}updateParticipant(e){const t=(0,R.Z)(e.peer),i=this.sortedList.has(t);e.pFlags.left?i&&this.sortedList.delete(t):i?this.sortedList.update(t):this.sortedList.add(t)}setInstance(e){return Jo(this,void 0,void 0,(function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))}))}destroy(){this.sortedList.destroy(),this.groupCallParticipantsVideo.destroy()}}class ir{constructor(e){this.appendTo=e,this.descriptionIntl=new L.ZP.IntlElement({key:"VoiceChat.Status.Connecting"}),this.descriptionIntl.element.classList.add("group-call-description")}detach(){this.descriptionIntl.element.remove()}update(e){const{state:t}=e;let i,s;t===Ao.Z.CONNECTING?i="VoiceChat.Status.Connecting":(i="VoiceChat.Status.Members",s=[e.groupCall.participants_count]);const{descriptionIntl:n}=this;n.compareAndUpdate({key:i,args:s}),this.descriptionIntl.element.parentElement||this.appendTo.append(this.descriptionIntl.element)}}class sr{constructor(e){this.appendTo=e,this.peerTitle=new N.Z({peerId:0})}update(e){const{peerTitle:t,appendTo:i}=this,s=e.groupCall,n=e.chatId.toPeerId(!0);s.title?(0,F.Z)(i,(0,B.Z)(s.title)):(t.options.peerId!==n&&(t.options.peerId=n,t.update()),t.element.parentElement!==i&&i.append(t.element))}}var nr=i(2820);function ar(e,t,i){const s=e+"-button",n=document.createElement("div");n.classList.add(s,"call-button","rp-overflow"),i.icon&&n.classList.add("tgico-"+i.icon),i.noRipple||(0,A.Z)(n),i.isDanger&&n.classList.add(s+"-red"),i.isConfirm&&n.classList.add(s+"-green"),i.callback&&(0,C.fc)(n,i.callback,{listenerSetter:t});let a=n;if(i.text){const e=document.createElement("div");e.classList.add(s+"-container","call-button-container");const t="string"==typeof i.text?(0,L.ag)(i.text):i.text;t.classList.add(s+"-text","call-button-text"),e.append(n,t),a=e}return a}var or=i(3757);const rr="movable-element",dr=rr+"-resize-handler";class lr extends l.Z{constructor(e){super(!0),this.onResize=()=>{this.fixDimensions(),this.fixPosition(),this.setPosition()},(0,zn.Z)(this,e),this.top=this.left=this.width=this.height=0,this.element.classList.add(rr),this.addResizeHandlers(),this.setSwipeHandler(),o.Z.addEventListener("resize",this.onResize)}destroyElements(){this.element.classList.remove(rr),this.handlers&&this.handlers.forEach((e=>{e.remove()}))}destroy(){o.Z.removeEventListener("resize",this.onResize),this.swipeHandler.removeListeners()}addResizeHandlers(){this.handlers=["n","e","s","w","ne","se","sw","nw"].map((e=>{const t=document.createElement("div");return t.dataset.side=e,t.classList.add(dr,dr+"-side-"+e),this.element.append(t),t}))}setSwipeHandler(){let e,t,i,s,n;const a=this.swipeHandler=new or.Z({element:this.element,onSwipe:(a,o,r)=>{if(n){if(n.includes("e")||n.includes("w")){const e=n.includes("e")&&a>0||n.includes("w")&&a<0,s=Math.abs(a)*(e?1:-1),o=n.includes("e")?Ae.Z.width-t:i+t;this.width=Math.min(o,i+s)}if(n.includes("n")||n.includes("s")){const t=n.includes("s")&&o>0||n.includes("n")&&o<0,i=Math.abs(o)*(t?1:-1),a=n.includes("s")?Ae.Z.height-e:s+e;this.height=Math.min(a,s+i)}this.fixDimensions(),n.includes("w")&&(this.left=Math.min(t+i-this.minWidth,t+a)),n.includes("n")&&(this.top=Math.min(e+s-this.minHeight,e+o))}else this.top=e+o,this.left=t+a;this.fixPosition(),this.setPosition()},verifyTouchTarget:e=>{const t=e.target;if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return!1;const i=(0,be.Z)(t,dr);return i?(n=i.dataset.side,a.setCursor("")):(n=void 0,a.setCursor("grabbing")),!0},onFirstSwipe:()=>{e=this.top,t=this.left,i=this.width,s=this.height}})}setPositionToCenter(){this.top=Ae.Z.height/2-this.height/2,this.left=Ae.Z.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=(0,Vi.Z)(this.width,this.minWidth,Ae.Z.width),this.height=(0,Vi.Z)(this.height,this.minHeight,Ae.Z.height)}fixPosition(){this.top=(0,Vi.Z)(this.top,0,Ae.Z.height-this.height),this.left=(0,Vi.Z)(this.left,0,Ae.Z.width-this.width)}setPosition(){this.element.style.top=this.top+"px",this.element.style.left=this.left+"px",this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.width=this.width+"px",this.element.style.height=this.height+"px",this.dispatchEvent("resize")}get width(){return this._width}get height(){return this._height}set width(e){this._width=e}set height(e){this._height=e}get state(){const{top:e,left:t,width:i,height:s}=this;return{top:e,left:t,width:i,height:s}}set state(e){const{top:t,left:i,width:s,height:n}=e;this.top=t,this.left=i,this.width=s,this.height=n,this.onResize()}}var cr,hr=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i};class ur{constructor(e){cr.set(this,void 0),(0,zn.Z)(this,e),this.toggleMovable(!c.Z),this.listenerSetter.add(o.Z)("changeScreen",((e,t)=>{t!==o._.mobile&&e!==o._.mobile||this.toggleMovable(!c.Z)}))}destroy(){const e=this.movable;e&&e.destroy()}get movable(){return function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)}(this,cr,"f")}get state(){return this.movable?this.movable.state:this.previousState}set state(e){this.previousState=e}toggleMovable(e){let{movable:t}=this;if(e){if(t)return;t=hr(this,cr,new lr(this.movableOptions),"f"),t.state=this.previousState,void 0===this.previousState.top&&t.setPositionToCenter(),this.onResize&&this.listenerSetter.add(t)("resize",this.onResize)}else{if(!t)return;this.previousState=t.state,t.destroyElements(),t.destroy(),hr(this,cr,void 0,"f")}}}function pr(e,t,i){return t.forEach((t=>{t.classList.toggle(e,i)})),()=>pr(e,t,!i)}cr=new WeakMap;var fr,mr;function gr(e){const t=fr;return e.pFlags.muted_by_you?t.MUTED_FOR_ME:void 0!==e.raise_hand_rating?t.HAND:e.pFlags.muted?e.pFlags.can_self_unmute?t.MUTED:t.MUTED_BY_ADMIN:t.UNMUTED}!function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_FOR_ME=2]="MUTED_FOR_ME",e[e.MUTED_BY_ADMIN=3]="MUTED_BY_ADMIN",e[e.HAND=4]="HAND"}(fr||(fr={})),function(e){e[e.HAND=0]="HAND",e[e.MUTED=1]="MUTED",e[e.UNMUTED=2]="UNMUTED"}(mr||(mr={}));let vr={width:420,height:640};const br="group-call";class yr extends S.Z{constructor(){super("popup-group-call",{body:!0,withoutOverlay:!0,closable:!0,title:!0}),this.onFullScreenClick=()=>{(0,zo.Dj)(this.container)},this.onToggleControls=e=>{this.container.classList.toggle("show-controls",e),this.buttonsContainer.classList.toggle("show-controls",e)},this.toggleDisability=pr.bind(null,"btn-disabled"),this.onVideoClick=()=>{const e=this.toggleDisability([this.btnVideo],!0);this.instance.toggleVideoSharing().finally((()=>{e()}))},this.onScreenClick=()=>{const e=this.toggleDisability([this.btnScreen],!0);this.instance.toggleScreenSharing().finally((()=>{e()}))},this.onMuteClick=()=>{const e=this.instance.participant;e.pFlags.can_self_unmute?this.instance.toggleMuted():void 0===e.raise_hand_rating&&this.instance.changeRaiseHand(!0)},this.onLeaveClick=()=>{return e=this,t=void 0,s=function*(){const e=e=>{this.instance.hangUp(e)};(yield this.managers.appChatsManager.hasRights(this.instance.chatId,"manage_call"))?new As.Z("popup-end-video-chat",{titleLangKey:"VoiceChat.End.Title",descriptionLangKey:"VoiceChat.End.Text",checkboxes:[{text:"VoiceChat.End.Third"}],buttons:[{langKey:"VoiceChat.End.OK",callback:t=>{e(!!t.size)},isDanger:!0}]}).show():e(!1)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s},this.onFullScreenChange=()=>{this.toggleBigLayout();const e=(0,zo.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,n=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==n&&(s.Z.checkAnimations2(e),yo.Z.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{var e;const t=(0,zo.rB)(),i=null===(e=this.movablePanel)||void 0===e?void 0:e.movable,s=(t||!!(i&&i.width>=680))&&!!this.videosCount,n=this.container.classList.contains("is-big-layout");let a;s&&!n&&(a=Array.from(this.buttonsContainer.children),a.forEach((e=>{e.style.opacity="0"})),this.buttonsContainer.offsetLeft),this.container.classList.toggle("is-big-layout",s),this.btnInvite.classList.toggle("hide",s),this.btnShowColumn.classList.toggle("hide",!s),a&&a.forEach((e=>{e.style.opacity=""}))},this.toggleRightColumn=()=>{this.container.classList.toggle("is-right-column-shown")},this.videosCount=0,this.container.classList.add(br,"night");const e=this.instance=ro.ZP.groupCall,{listenerSetter:t}=this;if(!x.IS_APPLE_MOBILE){const e=this.btnFullScreen=(0,Vn.Z)("fullscreen"),i=this.btnFullScreen2=(0,Vn.Z)("fullscreen "+br+"-cfs"),s=this.btnExitFullScreen=(0,Vn.Z)("smallscreen");(0,C.fc)(e,this.onFullScreenClick,{listenerSetter:t}),(0,C.fc)(i,this.onFullScreenClick,{listenerSetter:t}),(0,C.fc)(s,(()=>{(0,zo.C8)()}),{listenerSetter:t}),(0,zo.Ms)(this.container,this.onFullScreenChange,t)}this.btnInvite=(0,Vn.Z)("adduser");const i=this.btnShowColumn=(0,Vn.Z)("rightpanel "+br+"-only-big");(0,C.fc)(i,this.toggleRightColumn,{listenerSetter:t});const n=document.createElement("div");n.classList.add(br+"-header-info"),this.title.classList.add(br+"-header-title");const a=document.createElement("div");a.classList.add(br+"-header-subtitle"),n.append(this.title,a),this.header.classList.add(br+"-header"),this.header.append(...[this.btnExitFullScreen,n,this.btnFullScreen,i].filter(Boolean));const o=this.header.cloneNode(!1),r=n.cloneNode(!1),l=this.title.cloneNode(!1);r.append(l);const c=(0,Vn.Z)("rightpanel");o.append(...[c,r,this.btnFullScreen2].filter(Boolean)),(0,C.fc)(c,this.toggleRightColumn,{listenerSetter:t}),this.body.prepend(o);const h=new T.ZP(void 0);h.container.classList.add("group-call-big-video-container"),this.container.append(h.container),this.groupCallTitle=new sr(this.title),this.groupCallDescription=new ir(a),this.groupCallBodyHeaderDescription=new ir(l),this.constructButtons(),this.groupCallParticipantsVideo=new Xo({appendTo:h.container,instance:e,listenerSetter:t,displayPinned:!0,onLengthChange:e=>{this.videosCount=e,this.toggleBigLayout()},managers:this.managers}),this.groupCallParticipants=new tr({appendTo:this.body,instance:e,listenerSetter:t,managers:this.managers}),this.movablePanel=new ur({listenerSetter:t,movableOptions:{minWidth:400,minHeight:480,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,be.Z)(t,"chatlist")||(0,be.Z)(t,"group-call-button")||(0,be.Z)(t,"btn-icon")||(0,be.Z)(t,"group-call-participants-video-container")||(0,zo.rB)())}},onResize:()=>this.toggleBigLayout(),previousState:vr}),t.add(e)("state",(()=>{this.updateInstance()})),t.add(d.Z)("group_call_update",(e=>{var t;(null===(t=this.instance)||void 0===t?void 0:t.id)===e.id&&this.updateInstance()})),t.add(e)("pinned",(()=>{this.setHasPinned()})),t.add(this.groupCallParticipantsVideo)("toggleControls",this.onToggleControls),this.addEventListener("close",(()=>{const{movablePanel:e}=this;vr=e.state,this.groupCallParticipantsVideo.destroy(),this.groupCallParticipants.destroy(),this.groupCallMicrophoneIcon.destroy(),e.destroy()})),this.toggleRightColumn(),this.onFullScreenChange(),this.updateInstance()}constructButtons(){const e=this.buttonsContainer=document.createElement("div");e.classList.add(br+"-buttons");const t=ar.bind(null,br,this.listenerSetter),i=this.btnVideo=t({callback:this.onVideoClick,icon:"videocamera_filled"}),s=this.btnScreen=t({callback:this.onScreenClick,icon:"sharescreen_filled"});s.classList.toggle("hide",!nr.Z);const n=t({noRipple:!0,callback:(0,Qa.Z)(this.onMuteClick,600,!0)});n.classList.add(br+"-microphone-button");const a=this.groupCallMicrophoneIcon=new Ho;n.append(a.container);const o=t({icon:"settings_filled"});o.classList.add("btn-disabled"),o.classList.toggle("hide",!nr.Z);const r=t({isDanger:!0,callback:this.onLeaveClick,icon:"close"});e.append(i,s,n,o,r),this.container.append(e)}getContainer(){return this.container}setHasPinned(){this.container.classList.toggle("has-pinned",!!this.instance.pinnedSource)}updateInstance(){if(this.instance.state===Ao.Z.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,zo.C8)(),void this.hide();const{participant:e,groupCall:t}=this.instance;if(!e)return;this.setTitle(),this.setDescription(),this.setHasPinned();const i=function(e,t){const i=mr;return t.pFlags.can_self_unmute?t.pFlags.muted?i.MUTED:i.UNMUTED:i.HAND}(0,e);this.container.dataset.micState=i===mr.HAND?"hand":i===mr.MUTED?"muted":"unmuted",this.groupCallMicrophoneIcon.setState(i)}setTitle(){this.groupCallTitle.update(this.instance)}setDescription(){this.groupCallDescription.update(this.instance),this.groupCallBodyHeaderDescription.update(this.instance)}}var wr=i(9078),Sr=i(3335);class Cr{constructor(e){this.appendTo=e,this.container=document.createElement("div"),this.container.classList.add("call-description")}detach(){void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0),this.container.remove(),this.state=void 0}update(e){const{connectionState:t}=e;if(this.state===t)return;let i;if(this.state=t,t===Sr.Z.CONNECTED){i=document.createElement("span"),i.classList.add("call-description-duration");const t=()=>{i.innerText=(0,is.Z)(e.duration,!0)};this.interval=window.setInterval(t,1e3),t()}else{let s;switch(t){case Sr.Z.PENDING:s=e.isOutgoing?"Call.StatusRinging":"Call.StatusCalling";break;case Sr.Z.REQUESTING:s="Call.StatusRequesting";break;case Sr.Z.EXCHANGING_KEYS:s="VoipExchangingKeys";break;case Sr.Z.CLOSED:s=void 0!==e.connectedAt?"Call.StatusEnded":"Call.StatusFailed";break;default:s="Call.StatusConnecting"}i=(0,L.ag)(s),void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0)}this.container.classList.toggle("has-duration",t===Sr.Z.CONNECTED),(0,H.Z)(this.container,i),this.container.parentElement||this.appendTo.append(this.container)}}class Lr extends Uo{constructor(e,t){super({width:36,height:36,getPart:e=>this.getItem().getPart(e?"unmute":"mute"),getColor:e?e=>e?[255,255,255]:[158,158,158]:void 0,skipAnimation:t}),this.add({name:"voice_mini",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:171,name:"unmuted-to-hand"}]})}}const Er="call",Ir={width:400,height:580};let Mr=Object.assign({},Ir);class Pr extends S.Z{constructor(e){super("popup-call",{withoutOverlay:!0,closable:!0}),this.instance=e,this.onFullScreenClick=()=>{(0,zo.Dj)(this.container)},this.onFullScreenChange=()=>{const e=(0,zo.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,n=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==n&&(s.Z.checkAnimations(e),yo.Z.setThemeColor(e?"#000000":void 0),this.resizeVideoContainers())},this.videoContainers={};const{container:t,listenerSetter:i}=this;t.classList.add(Er,"night");const n=document.createElement("div");n.classList.add(Er+"-avatar");const a=this.peerId=this.instance.interlocutorUserId.toPeerId(),o=new f.Z;o.classList.add("avatar-full"),o.updateWithOptions({isBig:!0,peerId:a}),n.append(o);const r=new N.Z({peerId:a}).element;r.classList.add(Er+"-title");const d=document.createElement("div");d.classList.add(Er+"-subtitle"),this.description=new Cr(d);const l=this.emojisSubtitle=document.createElement("div");l.classList.add(Er+"-emojis"),t.append(n,r,d),x.IS_MOBILE?this.header.append(l):(this.btnFullScreen=(0,Vn.Z)("fullscreen"),this.btnExitFullScreen=(0,Vn.Z)("smallscreen hide"),(0,C.fc)(this.btnFullScreen,this.onFullScreenClick,{listenerSetter:i}),(0,C.fc)(this.btnExitFullScreen,(()=>(0,zo.C8)()),{listenerSetter:i}),(0,zo.Ms)(this.container,this.onFullScreenChange,i),this.header.prepend(this.btnExitFullScreen),this.header.append(this.btnFullScreen),t.append(l)),this.partyStates=document.createElement("div"),this.partyStates.classList.add(Er+"-party-states"),this.partyMutedState=document.createElement("div"),this.partyMutedState.classList.add(Er+"-party-state");const c=(0,L.ag)("VoipUserMicrophoneIsOff",[new N.Z({peerId:a,onlyFirstName:!0,limitSymbols:18}).element]);c.classList.add(Er+"-party-state-text");const h=new Lr(!1,!0);h.setState(!1,!1),this.partyMutedState.append(h.container,c),this.partyStates.append(this.partyMutedState),this.container.append(this.partyStates),this.makeButton=ar.bind(null,Er,this.listenerSetter),this.constructFirstButtons(),this.constructSecondButtons(),i.add(e)("state",(()=>{this.updateInstance()})),i.add(e)("mediaState",(()=>{this.updateInstance()})),this.movablePanel=new ur({listenerSetter:i,movableOptions:{minWidth:400,minHeight:580,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,be.Z)(t,"call-button")||(0,be.Z)(t,"btn-icon")||(0,zo.rB)())}},previousState:this.instance.wasTryingToJoin||this.instance.isOutgoing?Mr:Object.assign({},Ir)});const u=this.movablePanel.movable;u&&this.listenerSetter.add(u)("resize",(()=>{this.resizeVideoContainers()}));const p=this.controlsHover=new $o.Z;p.setup({element:this.container,listenerSetter:this.listenerSetter,showOnLeaveToClassName:"call-buttons"}),p.showControls(!1),this.addEventListener("close",(()=>{const{movablePanel:e}=this;Mr=e.state,this.microphoneIcon.destroy(),e.destroy()})),this.updateInstance()}getCallInstance(){return this.instance}constructFirstButtons(){const e=this.firstButtonsRow=document.createElement("div");e.classList.add(Er+"-buttons","is-first");const t=pr.bind(null,"btn-disabled"),i=this.btnVideo=this.makeButton({text:"Call.Camera",icon:"videocamera_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleVideoSharing().finally(e)}}),s=this.btnScreen=this.makeButton({text:"Call.Screen",icon:"sharescreen_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleScreenSharing().finally(e)}});nr.Z||(s.classList.add("hide"),this.container.classList.add("no-screen")),this.muteI18nElement=new L.ZP.IntlElement({key:"Call.Mute"});const n=this.btnMute=this.makeButton({text:this.muteI18nElement.element,callback:()=>{this.instance.toggleMuted()}}),a=this.microphoneIcon=new Lr(!0,!0);n.firstElementChild.append(a.container),e.append(i,s,n),this.container.append(e)}constructSecondButtons(){const e=this.secondButtonsRow=document.createElement("div");e.classList.add(Er+"-buttons","is-second"),this.declineI18nElement=new L.ZP.IntlElement({key:"Call.Decline"});const t=this.btnDecline=this.makeButton({text:this.declineI18nElement.element,icon:"endcall_filled",callback:()=>{this.instance.hangUp("phoneCallDiscardReasonHangup")},isDanger:!0}),i=this.btnAccept=this.makeButton({text:"Call.Accept",icon:"phone_filled",callback:()=>{this.instance.acceptCall()},isConfirm:!0});e.append(t,i),this.container.append(e)}createVideoContainer(e){const t=Er+"-video",i=document.createElement("div");i.classList.add(t+"-container"),e.classList.add(t),e.paused&&e.play(),(0,C.fc)(i,(()=>{if(!i.classList.contains("small"))return;const e=Object.values(this.videoContainers).find((e=>!e.classList.contains("small")));e.classList.add("small"),e.style.cssText=i.style.cssText,i.classList.remove("small"),i.style.cssText="",this.resizeVideoContainers()}));const s=qo(e);return s.classList.add(t+"-blur"),i.append(s,e),i}updateInstance(){const{instance:e}=this,{connectionState:t}=e;if(t===Sr.Z.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,zo.C8)(),this.btnVideo.classList.add("disabled"),void this.hide();const i=!e.isOutgoing&&t===Sr.Z.PENDING;this.declineI18nElement.compareAndUpdate({key:t===Sr.Z.PENDING?"Call.Decline":"Call.End"}),this.btnAccept.classList.toggle("disable",!i),this.btnAccept.classList.toggle("hide-me",!i),this.container.classList.toggle("two-button-rows",i);const s=e.isMuted,n=()=>{this.btnMute.firstElementChild.classList.toggle("active",s)},a=this.microphoneIcon.getItem().player;this.microphoneIcon.setState(!s,!s,n),a||n(),this.muteI18nElement.compareAndUpdate({key:s?"VoipUnmute":"Call.Mute"});const o=e.isSharingVideo;this.btnVideo.firstElementChild.classList.toggle("active",o);const r=e.isSharingScreen;this.btnScreen.firstElementChild.classList.toggle("active",r);const d=e.getMediaState("output");(0,De.Z)({element:this.partyMutedState,className:"is-visible",forwards:!!(null==d?void 0:d.muted),duration:300});const l=this.videoContainers,c=Object.assign({},l);["input","output"].forEach((t=>{const i=e.getMediaState(t),s=e.getVideoElement(t),n=!!(s&&s.videoWidth&&s.videoHeight);!s||n||s.dataset.hasPromise||(s.dataset.hasPromise="1",(0,Sn.Z)(s).then((()=>{delete s.dataset.hasPromise,this.updateInstance()})));const a=!!s&&n&&!(!i||"active"!==i.videoState&&"active"!==i.screencastState);let o=l[t];a&&s&&!o&&(o=l[t]=this.createVideoContainer(s),this.container.append(o)),!a&&o&&(o.remove(),delete l[t])}));{const e=l.input,t=l.output;Object.keys(c).length!==Object.keys(l).length&&e&&e.classList.toggle("small",!!t),t&&!e&&t.classList.remove("small")}this.resizeVideoContainers(),this.container.classList.toggle("no-video",!Object.keys(l).length),!this.emojisSubtitle.textContent&&t{(0,H.Z)(this.emojisSubtitle,(0,B.Z)(e.join("")))})),this.setDescription()}resizeVideoContainers(){Object.values(this.videoContainers).forEach((e=>{if(e.classList.contains("small")){const t=e.querySelector("video"),i=this.movablePanel.state,s=240,n=240,a=t.videoHeight>t.videoWidth,o=a?n:s,r=1/3*((0,zo.rB)()?65535:a?i.height:i.width),d=a?t.videoWidth/t.videoHeight:1,l=a?1:t.videoHeight/t.videoWidth;e.style.width=r*d+"px",e.style.height=r*l+"px",e.style.maxWidth=o*d+"px",e.style.maxHeight=o*l+"px"}else e.style.cssText=""}))}setDescription(){this.description.update(this.instance)}}var Zr=i(2069),Tr=i(9585),kr=i(2493);const xr="topbar-call";class Ar{constructor(e){this.managers=e,this.onState=()=>{this.updateInstance(this.instance)};const t=this.listenerSetter=new ce.Z;t.add(kr.Z)("instance",(({instance:e})=>{this.instance||this.updateInstance(e)})),t.add(kr.Z)("accepting",(e=>{this.instance!==e&&this.updateInstance(e)})),t.add(ro.ZP)("instance",(e=>{this.updateInstance(e)})),t.add(d.Z)("group_call_update",(e=>{const t=ro.ZP.groupCall;(null==t?void 0:t.id)===e.id&&this.updateInstance(t)})),t.add(Tr.Z.ANALYSER_LISTENER)("amplitude",(({amplitudes:e,type:t})=>{const{weave:i}=this;if(!e.length||!i)return;let s=0;for(let t=0;ts?n:s}i.setAmplitude(s)}))}clearCurrentInstance(){this.instance&&(this.center.textContent="",this.currentDescription&&(this.currentDescription.detach(),this.currentDescription=void 0),this.instance=void 0,this.instanceListenerSetter.removeAll())}updateInstance(e){this.construct&&(this.construct(),this.construct=void 0);const t=this.instance!==e;t&&(this.clearCurrentInstance(),this.instance=e,this.instanceListenerSetter=new ce.Z,this.instanceListenerSetter.add(e)("state",this.onState),e instanceof wr.Z?this.currentDescription=this.groupCallDescription:(this.currentDescription=this.callDescription,this.instanceListenerSetter.add(e)("muted",this.onState)),this.container.classList.toggle("is-call",!(e instanceof wr.Z)));const i=this.instance.isMuted,s=e instanceof wr.Z?e.state:function(e,t){switch(e){case Sr.Z.CLOSING:case Sr.Z.CLOSED:return Ao.Z.CLOSED;case Sr.Z.CONNECTED:return t?Ao.Z.MUTED:Ao.Z.UNMUTED;default:return Ao.Z.CONNECTING}}(e.connectionState,i),{weave:n}=this;n.componentDidMount();const a=s===Ao.Z.CLOSED;(!document.body.classList.contains("is-calling")||t||a)&&(a&&n.setAmplitude(0),(0,De.Z)({element:document.body,className:"is-calling",forwards:!a,duration:250,onTransitionEnd:a?()=>{n.componentWillUnmount(),this.clearCurrentInstance()}:void 0})),a||(n.setCurrentState(s,!0),this.setTitle(e),this.setDescription(e),this.groupCallMicrophoneIconMini.setState(!i))}setDescription(e){return this.currentDescription.update(e)}setTitle(e){if(e instanceof wr.Z)return this.groupCallTitle.update(e);(0,H.Z)(this.center,new N.Z({peerId:e.interlocutorUserId.toPeerId()}).element)}construct(){const{listenerSetter:e}=this,t=this.container=document.createElement("div");t.classList.add("sidebar-header",xr+"-container");const i=document.createElement("div");i.classList.add(xr+"-left");const s=this.groupCallMicrophoneIconMini=new Lr,n=(0,Vn.Z)();n.append(s.container),i.append(n);const a=(0,Qa.Z)((()=>{this.instance.toggleMuted()}),600,!0);(0,C.fc)(n,(e=>{(0,Le.Z)(e),a()}),{listenerSetter:e});const o=this.center=document.createElement("div");o.classList.add(xr+"-center"),this.groupCallTitle=new sr(o),this.groupCallDescription=new ir(i),this.callDescription=new Cr(i);const r=document.createElement("div");r.classList.add(xr+"-right");const d=(0,Vn.Z)("endcall_filled");r.append(d),(0,C.fc)(d,(e=>{(0,Le.Z)(e);const{instance:t}=this;t&&(t instanceof wr.Z?t.hangUp():t.hangUp("phoneCallDiscardReasonHangup"))}),{listenerSetter:e}),(0,C.fc)(t,(()=>{if(this.instance instanceof wr.Z){if(S.Z.getPopups(yr).length)return;(new yr).show()}else if(this.instance instanceof Zr.Z){if(S.Z.getPopups(Pr).find((e=>e.getCallInstance()===this.instance)))return;new Pr(this.instance).show()}}),{listenerSetter:e}),t.append(i,o,r);const l=this.weave=new Do,c=l.render(xr+"-weave");t.prepend(c),document.getElementById("column-center").prepend(t),l.componentDidMount()}}var _r=i(2614),Fr=i(6009),Dr=i(493),Rr=i(2131),Br=i(6702),Nr=i(7746),Or=i(2491),Ur=i(1722),Hr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const zr=new class{constructor(){this.notificationsShown={},this.notificationIndex=0,this.notificationsCount=0,this.soundsPlayed={},this.vibrateSupport=Rr.Z,this.faviconElements=Array.from(document.head.querySelectorAll('link[rel="icon"], link[rel="alternate icon"]')),this.titleBackup=document.title,this.titleChanged=!1,this.stopped=!1,this.settings={},this.pushInited=!1,this.updateLocalSettings=()=>{const e=["notify_nodesktop","notify_volume","notify_novibrate","notify_nopreview","notify_nopush"].map((()=>{}));Promise.all(e).then((e=>{if(this.settings.nodesktop=e[0],this.settings.volume=void 0===e[1]?.5:e[1],this.settings.novibrate=e[2],this.settings.nopreview=e[3],this.settings.nopush=e[4],this.pushInited){const e=!this.settings.nopush&&!this.settings.nodesktop&&Br.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?Br.default.subscribe():Br.default.unsubscribe())}Br.default.setSettings(this.settings)})),Cn.Z.getState().then((e=>{this.settings.nosound=!e.settings.notifications.sound}))},this.requestPermission=()=>{Notification.requestPermission(),window.removeEventListener("click",this.requestPermission)}}construct(e){this.managers=e,navigator.vibrate=navigator.vibrate||navigator.mozVibrate||navigator.webkitVibrate,this.setAppBadge=navigator.setAppBadge&&navigator.setAppBadge.bind(navigator),this.setAppBadge&&this.setAppBadge(0),this.notificationsUiSupport="Notification"in window||"mozNotification"in navigator,this.notifySoundEl=document.createElement("div"),this.notifySoundEl.id="notify-sound",document.body.append(this.notifySoundEl),this.topMessagesDeferred=(0,me.Z)(),ko.Z.addEventListener("deactivated",(()=>{this.stop()})),ko.Z.addEventListener("activated",(()=>{this.stopped&&this.start()})),St.Z.addEventListener("change",(e=>{this.stopped||(e||this.clear(),this.toggleToggler())})),d.Z.addEventListener("notification_reset",(e=>{this.soundReset(e)})),d.Z.addEventListener("notification_cancel",(e=>{this.cancel(e)})),this.setAppBadge&&d.Z.addEventListener("folder_unread",(e=>{0===e.id&&this.setAppBadge(e.unreadUnmutedPeerIds.size)})),Br.default.addEventListener("push_init",(e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):Br.default.subscribe()})),Br.default.addEventListener("push_subscribe",(e=>{this.registerDevice(e)})),Br.default.addEventListener("push_unsubscribe",(e=>{this.unregisterDevice(e)})),d.Z.addEventListener("dialogs_multiupdate",(()=>{this.topMessagesDeferred.resolve()}),{once:!0}),Br.default.addEventListener("push_notification_click",(e=>{if("push_settings"===e.action)return;if("mute1d"===e.action)return void this.managers.apiManager.invokeApi("account.updateDeviceLocked",{period:86400}).then((()=>{}));const t=e.custom&&e.custom.peerId.toPeerId();console.log("click",e,t),t&&this.topMessagesDeferred.then((()=>Hr(this,void 0,void 0,(function*(){e.custom.channel_id&&!(yield this.managers.appChatsManager.hasChat(e.custom.channel_id))||t.isUser()&&!(yield this.managers.appUsersManager.hasUser(t))||td.setInnerPeer({peerId:t,lastMsgId:(0,wt.Z)(+e.custom.msg_id)})}))))}))}buildNotification({message:e,fwdCount:t,peerReaction:i,peerTypeNotifySettings:s}){return Hr(this,void 0,void 0,(function*(){const n=e.peerId,a=n.isAnyChat(),o={},[r,d=!1]=yield Promise.all([this.managers.appPeersManager.getPeerString(n),a&&this.managers.appPeersManager.isForum(n)]);let l,c=!1;if(s.show_previews)if("message"===e._&&e.fwd_from&&t>1)l=L.ZP.format("Notifications.Forwarded",!0,[t]);else{l=yield(0,V.Z)({message:e,plain:!0});const t=null==i?void 0:i.reaction;if("reactionEmoji"===(null==t?void 0:t._)){const e="Notification.Contact.Reacted",i=[(0,Nr.Z)(t.emoticon),l];l=L.ZP.format(e,!0,i)}else c=!0}else l=L.ZP.format("Notifications.New",!0);i&&(o.noIncrement=!0,o.silent=!0);const h=d?(0,b.Z)(e,d):void 0,u=i?(0,R.Z)(i.peer_id):e.fromId;if(o.title=yield(0,Dr.Z)({peerId:n,plainText:!0,managers:this.managers,threadId:h}),d){const t=yield(0,Dr.Z)({peerId:n,plainText:!0,managers:this.managers});o.title+=` (${t})`,c&&u!==e.peerId&&(l=(yield(0,Dr.Z)({peerId:u,plainText:!0,managers:this.managers}))+": "+l)}else a&&u!==e.peerId&&(o.title=(yield(0,Dr.Z)({peerId:u,plainText:!0,managers:this.managers}))+" @ "+o.title);o.title=(0,Or.Z)(o.title),o.onclick=()=>{td.setInnerPeer({peerId:n,lastMsgId:e.mid,threadId:h})},o.message=l,o.key="msg"+e.mid,o.tag=r,o.silent=!0;const p=yield this.managers.appPeersManager.getPeerPhoto(n);p?this.managers.appAvatarsManager.loadAvatar(n,p,"photo_small").then((t=>{(e.pFlags.unread||i)&&(o.image=t,this.notify(o))})):this.notify(o)}))}toggleToggler(e=St.Z.isIdle){if(x.IS_MOBILE)return;const t=e=>{this.titleChanged=!1,document.title=this.titleBackup,this.setFavicon()};window.clearInterval(this.titleInterval),this.titleInterval=0,e?this.titleInterval=window.setInterval((()=>{const e=this.notificationsCount;if(e)if(this.titleChanged)t();else{this.titleChanged=!0,document.title=L.ZP.format("Notifications.Count",!0,[e]);const t=document.createElement("canvas");t.width=32*window.devicePixelRatio,t.height=t.width;const i=t.getContext("2d");i.beginPath(),i.arc(t.width/2,t.height/2,t.width/2,0,2*Math.PI,!1),i.fillStyle="#3390ec",i.fill();let s=24,n=""+e;e<10?s=22:e<100?s=20:(n="99+",s=16),s*=window.devicePixelRatio,i.font=`700 ${s}px ${kt.bt}`,i.textBaseline="middle",i.textAlign="center",i.fillStyle="white",i.fillText(n,t.width/2,.5625*t.height),this.setFavicon(t.toDataURL())}else this.toggleToggler(!1)}),1e3):t()}setFavicon(e){this.prevFavicon!==e&&(this.prevFavicon=e,this.faviconElements.forEach(((t,i,s)=>{const n=t.cloneNode();n.dataset.href||(n.dataset.href=n.href),null!=e||(e=n.dataset.href),n.href=e,t.replaceWith(s[i]=n)})))}notify(e){if(this.stopped)return;e.image||(e.image="assets/img/logo_filled_rounded.png"),e.noIncrement||++this.notificationsCount,this.titleInterval||this.toggleToggler();const t=++this.notificationIndex,i=e.key||"k"+t;this.notificationsShown[i]=!0;const s=(0,zt.Z)();if(this.settings.volume>0&&!this.settings.nosound&&(this.testSound(this.settings.volume),this.soundsPlayed[e.tag]=s),!this.notificationsUiSupport||"Notification"in window&&"granted"!==Notification.permission)return!1;if(this.settings.nodesktop)return this.vibrateSupport&&!this.settings.novibrate?void navigator.vibrate([200,100,200]):void 0;let n;if("Notification"in window){try{if(e.tag)for(const t in this.notificationsShown){const i=this.notificationsShown[t];"boolean"!=typeof i&&i.tag===e.tag&&(i.hidden=!0)}n=new Notification(e.title,{icon:e.image||"",body:e.message||"",tag:e.tag||"",silent:e.silent||!1})}catch(e){return this.notificationsUiSupport=!1,void Br.default.setLocalNotificationsDisabled()}n.onclick=()=>{n.close(),Ur.Z.focus(),this.clear(),e.onclick&&e.onclick()},n.onclose=()=>{n.hidden||(delete this.notificationsShown[i],this.clear())},n.show&&n.show(),this.notificationsShown[i]=n,x.IS_MOBILE||setTimeout((()=>{this.hide(i)}),8e3)}}getLocalSettings(){return this.settings}hide(e){const t=this.notificationsShown[e];if(t&&"boolean"!=typeof t)try{t.close&&(t.hidden=!0,t.close())}catch(e){}}soundReset(e){delete this.soundsPlayed[e]}testSound(e){const t=(0,zt.Z)();if(this.nextSoundAt&&t\n \n `,this.notifySoundEl.append(s),s.addEventListener("ended",(()=>{s.remove()}),{once:!0})}cancel(e){const t=this.notificationsShown[e];if(t){this.notificationsCount>0&&--this.notificationsCount;try{"boolean"!=typeof t&&t.close&&(t.hidden=!0,t.close())}catch(e){}delete this.notificationsShown[e]}}clear(){for(const e in this.notificationsShown){const t=this.notificationsShown[e];try{"boolean"!=typeof t&&t.close&&t.close()}catch(e){}}this.notificationsShown={},this.notificationsCount=0,Br.default.hidePushNotifications()}start(){if(this.updateLocalSettings(),d.Z.addEventListener("settings_updated",this.updateLocalSettings),Br.default.start(),!this.notificationsUiSupport)return!1;"Notification"in window&&"granted"!==Notification.permission&&"denied"!==Notification.permission&&window.addEventListener("click",this.requestPermission);try{"onbeforeunload"in window&&window.addEventListener("beforeunload",this.clear)}catch(e){}}stop(){this.clear(),window.clearInterval(this.titleInterval),this.titleInterval=0,this.setFavicon(),this.stopped=!0}registerDevice(e){if(this.registeredDevice&&(0,go.Z)(this.registeredDevice,e))return!1;this.managers.apiManager.invokeApi("account.registerDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[],app_sandbox:!1,secret:new Uint8Array}).then((()=>{this.registeredDevice=e}),(e=>{e.handled=!0}))}unregisterDevice(e){if(!this.registeredDevice)return!1;this.managers.apiManager.invokeApi("account.unregisterDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[]}).then((()=>{this.registeredDevice=!1}),(e=>{e.handled=!0}))}};ge.GO&&(ge.GO.uiNotificationsManager=zr);const jr=zr;var Gr=i(2423),Vr=i(236),Kr=i(5936),Wr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function $r(e,t=!1){return Wr(this,void 0,void 0,(function*(){const i=[],s=(e,n)=>Wr(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise(((e,i)=>{t.readEntries((t=>Wr(this,void 0,void 0,(function*(){for(const e of t)yield s(e,n);e()}))))}))}else if(e)if(t)i.push(e.type);else{const t=n.getAsFile(),s=e instanceof File?e:e instanceof DataTransferItem?e.getAsFile():yield new Promise(((i,s)=>e.file(i,(e=>i(t)))));if(!s)return;i.push(s)}}));if(e instanceof DragEvent&&e.dataTransfer.files&&!e.dataTransfer.items)for(let s=0;s{!e.noCancelEvent&&(0,Le.Z)(null);let i,s,n=t.href;const a=new URL(n),o=a.host.match(/(.+?)\.t(?:elegram)?\.me/);o&&!m.BX.has(o[1])&&(a.pathname=o[1]+("/"===a.pathname?"":a.pathname),n=a.toString()),e.noPathnameParams||(i=new URL(n).pathname.split("/").slice(1)),e.noUriParams||(s=(0,qr.Z)(n));const r=e.callback({pathnameParams:i,uriParams:s},t);return void 0===r&&r}}var Yr,Xr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};!function(e){e[e.CHATLIST=0]="CHATLIST",e[e.CHAT=1]="CHAT",e[e.PROFILE=2]="PROFILE"}(Yr||(Yr={}));class Jr extends l.Z{constructor(){super(...arguments),this.columnEl=document.getElementById("column-center"),this.offline=!1,this.updateStatusInterval=0,this.setPeerPromise=null,this.chats=[],this.cacheStorage=new Kr.Z("cachedFiles"),this.onHashChange=e=>{try{this.onHashChangeUnsafe(e)}catch(e){this.log.error("hash change error",e)}},this.onHashChangeUnsafe=e=>{const t=location.hash;e||Hn.Z.replaceState();const i=t.split("?"),s=(0,qr.Z)(t,i);if(this.log("hashchange",t,i[0],s),t)if(s.tgaddr)this.openUrl(s.tgaddr);else switch(i[0]){default:s.p=i[0].slice(1);case"#/im":{if(!Object.keys(s).length)break;const e=s.p,t=void 0!==s.post?(0,wt.Z)(+s.post):void 0;"@"===e[0]?this.openUsername({userName:e,lastMsgId:t}):this.setInnerPeer({peerId:t?e.toPeerId(!0):e.toPeerId(),lastMsgId:t})}}},this.setSettings=()=>{const{messagesTextSize:e}=d.Z.settings;this.customEmojiSize=(0,Qe.C)(e+4,e+4),document.documentElement.style.setProperty("--messages-text-size",e+"px"),this.customEmojiSize&&(document.querySelectorAll("middle-ellipsis-element").forEach((t=>{t.disconnectedCallback(),t.dataset.fontSize=""+e,t.title&&(t.textContent=t.title),t.connectedCallback()})),document.querySelectorAll(".chat custom-emoji-renderer-element").forEach((e=>{e.forceRenderAfterSize=!0}))),document.body.classList.toggle("animation-level-0",!d.Z.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",d.Z.settings.animationsEnabled),this.chatsSelectTabDebounced=(0,Te.Z)((()=>{var e;null===(e=this.chat.topbar.pinnedMessage)||void 0===e||e.setCorrectIndex(0),this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)}),d.Z.settings.animationsEnabled?250:0,!1,!0),Bs.Z.setLoop(d.Z.settings.stickers.loop),s.Z.checkAnimations2(!1);for(const e of this.chats)e.setAutoDownloadMedia();L.ZP.setTimeFormat(d.Z.settings.timeFormat),this.toggleChatGradientAnimation(this.chat)},this.onDocumentPaste=(e,t)=>Xr(this,void 0,void 0,(function*(){const i=_n();if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&(0,Le.Z)(e)}const s=yield $r(e);if(((yield this.canDrag())||i)&&s.length){if(i)return void i.addFiles(s);const e=this.chat.input;e.willAttachType=t||(bn.Z.has(s[0].type)?"media":"document"),S.Z.createPopup(Fn,this.chat,s,e.willAttachType)}}))}get myId(){return d.Z.myId}get chat(){return this.chats[this.chats.length-1]}construct(e){this.managers=e;const{apiUpdatesManager:t}=e;t.attach(L.ZP.lastRequestedLangCode),wa.Z.construct(e),jr.construct(e),jr.start(),this.log=(0,r.kg)("IM",r.v9.Log|r.v9.Warn|r.v9.Debug|r.v9.Error),this.backgroundPromises={},Vr.h.settings.themes.forEach((e=>{const t=e.settings;if(!t)return;const{wallpaper:i}=t,s=i.slug;if(!s)return;const n="assets/img/"+s+".svg"+(x.IS_FIREFOX?"?1":"");this.backgroundPromises[s]=Promise.resolve(n)})),this.selectTab(Yr.CHATLIST),St.Z.addEventListener("change",(e=>{this.offline=e,this.updateStatus(),e?clearInterval(this.updateStatusInterval):this.updateStatusInterval=window.setInterval((()=>this.updateStatus()),5e4)})),this.chatsContainer=document.createElement("div"),this.chatsContainer.classList.add("chats-container","tabs-container"),this.chatsContainer.dataset.animation="navigation",this.emojiAnimationContainer=document.createElement("div"),this.emojiAnimationContainer.classList.add("emoji-animation-container"),this.appendEmojiAnimationContainer(o.Z.activeScreen),this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),Hn.Z.onHashChange=this.onHashChange,this.setSettings(),d.Z.addEventListener("settings_updated",this.setSettings);const i=e=>{document.body.classList.toggle("is-premium",e)};d.Z.addEventListener("premium_toggle",i),i(d.Z.premium),this.managers.rootScope.getPremium().then(i),(0,pe.ZP)((()=>{s.Z.setOnlyOnePlayableGroup("lock"),s.Z.checkAnimations2(!0)}),(()=>{s.Z.setOnlyOnePlayableGroup(),s.Z.checkAnimations2(!1)})),x.IS_FIREFOX&&Cn.Z.oldVersion&&-1===(0,Fr.Z)(Cn.Z.oldVersion,"1.4.3")?this.deleteFilesIterative((e=>"image/svg+xml"===e.headers.get("Content-Type"))).then((()=>{this.applyCurrentTheme()})):this.applyCurrentTheme(),o.Z.addEventListener("changeScreen",((e,t)=>{document.body.classList.contains(n.ir)&&document.body.classList.contains(a.HQ)&&a.ZP.toggleSidebar(!1),this.appendEmojiAnimationContainer(t)})),o.Z.addEventListener("resize",(()=>{const e=this.chatsContainer.getBoundingClientRect();bo.resizeInstances(e.width,e.height).then((()=>{}))})),this.addEventListener("peer_changing",(e=>{this.saveChatPosition(e)})),d.Z.addEventListener("theme_change",(()=>{this.applyCurrentTheme()})),d.Z.addEventListener("choosing_sticker",(e=>{this.setChoosingStickerTyping(!e)})),d.Z.addEventListener("peer_title_edit",(({peerId:e,threadId:t})=>{var i;(null===(i=this.chat)||void 0===i?void 0:i.peerId)!==e||t||void 0===this.tabId||this.overrideHash(e)})),d.Z.addEventListener("peer_typings",(({peerId:e,typings:t})=>{var i;const s=this.chat;if(!s||s.peerId!==e||Ct.Z.isOverlayActive||o.Z.activeScreen===o._.mobile&&this.tabId!==Yr.CHAT)return;const n=t.find((e=>"sendMessageEmojiInteraction"===e.action._));if("sendMessageEmojiInteraction"===(null===(i=null==n?void 0:n.action)||void 0===i?void 0:i._)){const t=n.action,i=s.bubbles.bubbles[(0,wt.Z)(n.action.msg_id)];if(i&&i.classList.contains("emoji-big")&&(0,ze.Z)(i,s.bubbles.scrollable.container)){const s=i.querySelector(".media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)");JSON.parse(t.interaction.data).a.forEach((e=>{setTimeout((()=>{(0,C.tH)(s)}),1e3*e.t)})),this.managers.appMessagesManager.setTyping(e,{_:"sendMessageEmojiInteractionSeen",emoticon:t.emoticon})}}}));const l=e=>{const t="version"===e,i=new S.Z("popup-instance-deactivated",{overlayClosable:!0}),s=document.createElement("div");s.classList.add("instance-deactivated-container"),i.container.replaceWith(s);const n=document.createElement("div");n.classList.add("header"),n.append((0,L.ag)(t?"Deactivated.Version.Title":"Deactivated.Title"));const a=document.createElement("div");a.classList.add("subtitle"),a.append((0,L.ag)(t?"Deactivated.Version.Subtitle":"Deactivated.Subtitle")),s.append(n,a),document.body.classList.add("deactivated");const o=t?()=>{Ur.Z.reload()}:()=>{document.body.classList.add("deactivated-backwards"),ko.Z.activateInstance(),setTimeout((()=>{document.body.classList.remove("deactivated","deactivated-backwards")}),333)};i.addEventListener("close",o),i.show()};ko.Z.addEventListener("deactivated",l),ko.Z.deactivatedReason&&l(ko.Z.deactivatedReason),this.addEventListener("chat_changing",(({to:e})=>{this.toggleChatGradientAnimation(e)})),d.Z.addEventListener("service_notification",(e=>{(0,bi.Z)({button:{langKey:"OK",isCancel:!0},description:(0,mt.ZP)(e.message)})})),d.Z.addEventListener("payment_sent",(({peerId:e,mid:t,receiptMessage:i})=>Xr(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageByPeer(e,t);if(!s)return;const n=i.action;(0,we.bC)({langPackKey:"PaymentInfoHint",langPackArguments:[(0,Zt.Z)(n.total_amount,n.currency),(0,B.Z)(s.media.title)]})})))),window.onSpoilerClick=e=>{const t=(0,be.Z)(e.target,"spoiler"),i=(0,be.Z)(t,"spoilers-container")||t.parentElement,s="is-spoiler-visible",n=i.classList.contains(s);n||((0,Le.Z)(e),"click"!==C.pf&&window.addEventListener("click",Le.Z,{capture:!0,once:!0}));const a=n?0:2;a&&i.classList.add("will-change");const o=i.dataset.spoilerTimeout;null!==o&&(clearTimeout(+o),delete i.dataset.spoilerTimeout),(0,De.Z)({element:i,className:s,forwards:!0,duration:200,onTransitionEnd:()=>{i.dataset.spoilerTimeout=""+window.setTimeout((()=>{(0,De.Z)({element:i,className:s,forwards:!1,duration:200,onTransitionEnd:()=>{i.classList.remove("will-change"),delete i.dataset.spoilerTimeout}})}),5e3)},useRafs:a})},d.Z.addEventListener("sticker_updated",(({type:e,faved:t})=>{"faved"===e?(0,we.bC)({langPackKey:t?"AddedToFavorites":"RemovedFromFavorites"}):t||(0,we.bC)({langPackKey:"RemovedFromRecent"})})),Cn.Z.addEventListener("notificationBuild",(e=>Xr(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.isForum(e.message.peerId),i=(0,b.Z)(e.message,t);(this.chat.peerId!==e.message.peerId||this.chat.threadId!==i||St.Z.isIdle)&&jr.buildNotification(e)})))),this.addEventListener("peer_changed",(({peerId:e})=>Xr(this,void 0,void 0,(function*(){document.body.classList.toggle("has-chat",!!e),this.emojiAnimationContainer.textContent="",this.overrideHash(e),Cn.Z.updateTabState("chatPeerIds",this.chats.map((e=>e.peerId)).filter(Boolean))})))),Zo.Z.setToCache("chatPositions",{}),(Ue.Z||no.Z)&&(this.topbarCall=new Ar(e)),Ue.Z&&(kr.Z.addEventListener("instance",(({instance:e})=>{const t=new Pr(e);e.addEventListener("acceptCallOverride",(()=>this.discardCurrentCall(e.interlocutorUserId.toPeerId(),void 0,e).then((()=>(kr.Z.dispatchEvent("accepting",e),!0))).catch((()=>!1)))),t.addEventListener("close",(()=>{const t=kr.Z.currentCall;t&&t!==e&&!e.wasTryingToJoin&&e.hangUp("phoneCallDiscardReasonBusy")}),{once:!0}),t.show()})),kr.Z.addEventListener("incompatible",(e=>Xr(this,void 0,void 0,(function*(){(0,we.bC)({langPackKey:"VoipPeerIncompatible",langPackArguments:[yield(0,Kt.Z)({peerId:e.toPeerId()})]})}))))),ko.Z.activateInstance();const c=()=>{xo.default.setAuthorized(!0)};setInterval(c,_.s2),c(),Qr({name:"showMaskedAlert",callback:(e,t)=>{const i=t.href,s=t.cloneNode(!0);s.className="anchor-url",s.innerText=i,s.removeAttribute("onclick"),new As.Z("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[s],buttons:[{langKey:"Open",callback:()=>{s.click()}}]}).show()}}),Qr({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:i}=e;this.managers.appMessagesManager.sendText(this.chat.peerId,"/"+t+(i?"@"+i:""))}}),Qr({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),[["addstickers",xe.STICKER_SET],["addemoji",xe.EMOJI_SET]].forEach((([e,t])=>{Qr({name:e,callback:({pathnameParams:e})=>{if(!e[1])return;const i={_:t,set:e[1]};this.processInternalLink(i)}}),Qr({name:e,protocol:"tg",callback:({uriParams:e})=>{const i=this.makeLink(t,e);this.processInternalLink(i)}})})),Qr({name:"invoice",callback:({pathnameParams:e})=>{const t={_:xe.INVOICE,slug:e.length>1?e[1]:e[0].slice(1)};this.processInternalLink(t)}}),Qr({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:xe.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),no.Z&&Qr({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(xe.VOICE_CHAT,e);this.processInternalLink(t)}}),Qr({name:"im",callback:({pathnameParams:e,uriParams:t},i)=>Xr(this,void 0,void 0,(function*(){let s;if(Gr.kO.test(e[0]))s={_:xe.USER_PHONE_NUMBER,phone:e[0].slice(1)};else if("c"===e[0]){e.shift();const n="thread"in t?t.thread:e[2]&&e[1];s={_:xe.PRIVATE_POST,channel:e[0],post:e[2]||e[1],thread:n,comment:t.comment,stack:this.getStackFromElement(i)}}else{const n="thread"in t?t.thread:e[2]&&e[1];s={_:xe.MESSAGE,domain:e[0],post:e[2]||e[1],thread:n,comment:t.comment,start:"start"in t?t.start:void 0,stack:this.getStackFromElement(i)}}this.processInternalLink(s)}))}),Qr({name:"resolve",protocol:"tg",callback:({uriParams:e},t)=>{let i;e.phone?i=this.makeLink(xe.USER_PHONE_NUMBER,e):"telegrampassport"===e.domain||(i=this.makeLink(xe.MESSAGE,Object.assign(Object.assign({},e),{stack:this.getStackFromElement(t)}))),this.processInternalLink(i)}}),Qr({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(xe.PRIVATE_POST,e);this.processInternalLink(t)}}),Qr({name:"invoice",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(xe.INVOICE,e);this.processInternalLink(t)}}),["joinchat","join"].forEach((e=>{Qr({name:e,protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(xe.JOIN_CHAT,e);this.processInternalLink(t)}})})),this.onHashChange(!0),this.attachKeydownListener(),this.handleAutologinDomains(),this.checkForShare()}checkForShare(){const e=Cn.Z.share;e&&(Cn.Z.share=void 0,new M.Z(void 0,(t=>Xr(this,void 0,void 0,(function*(){var i;if(yield this.setPeer({peerId:t}),null===(i=e.files)||void 0===i?void 0:i.length){const t=e.files.some((e=>bn.Z.has(e.type)));new Fn(this.chat,e.files,t?"media":"document")}else this.managers.appMessagesManager.sendText(t,e.text)})))))}handleUrlAuth(e){const{peerId:t,mid:i,buttonId:s,url:n}=e,a=e=>{window.open(e,"_blank")},o=e=>Xr(this,void 0,void 0,(function*(){if("urlAuthResultRequest"===e._){const r=document.createElement("b");r.append(e.domain);const l=yield(0,Kt.Z)({peerId:d.Z.myId}),c=yield(0,Kt.Z)({peerId:e.bot.id.toPeerId()}),h={text:"OpenUrlOption1",textArgs:[r.cloneNode(!0),l],checked:!0},u=e.pFlags.request_write_access?{text:"OpenUrlOption2",textArgs:[c],checked:!0}:void 0,p=[h,u],f=(0,bi.Z)({titleLangKey:"OpenUrlTitle",button:{langKey:"Open"},descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[r],checkboxes:p.filter(Boolean)});u&&h.checkboxField.input.addEventListener("change",(()=>{const e=!h.checkboxField.checked;u.checkboxField.toggleDisability(e),e&&(u.checkboxField.checked=!1)}));const[m,g]=yield f;if(!m)return void a(n);const v=yield this.managers.appSeamlessLoginManager.acceptUrlAuth(n,t,i,s,g);return o(v)}"urlAuthResultAccepted"===e._?(e=>{a(e.url)})(e):a(n)}));return this.managers.appSeamlessLoginManager.requestUrlAuth(n,t,i,s).then((e=>{o(e)}))}handleAutologinDomains(){let e;d.Z.addEventListener("app_config",(t=>{e=t}));const t=t=>{var i,s;const n=new URL(t.href);if(e.url_auth_domains.includes(n.hostname))return this.handleUrlAuth({url:t.href}),void(0,Le.Z)();if(!e.autologin_token||!e.autologin_domains)return;const a=null!==(i=(s=t.dataset).originalUrl)&&void 0!==i?i:s.originalUrl=t.href;e.autologin_domains.includes(n.hostname)&&(n.searchParams.set("autologin_token",e.autologin_token),t.href=n.toString(),setTimeout((()=>{t.href=a,delete t.dataset.originalUrl}),0))};document.addEventListener("click",(e=>{const i=(0,ye.Z)(e.target,"A");(null==i?void 0:i.href)&&t(i)}))}getStackFromElement(e){const t=(0,be.Z)(e,"bubble");return t?+t.dataset.mid:void 0}deleteFilesIterative(e){return this.cacheStorage.timeoutOperation((t=>{const i=performance.now();return t.keys().then((i=>{const s=i.map((i=>t.match(i).then((t=>e(t)))));return Promise.all(s).then((e=>(e.map(((e,s)=>{if(!e)return;const n=i[s];return t.delete(n)})),Promise.all(e.filter(Boolean)))))})).then((()=>{this.log("deleted files",performance.now()-i)}))}))}toggleChatGradientAnimation(e){this.chats.forEach((t=>{t.gradientRenderer&&t.gradientRenderer.scrollAnimate(d.Z.settings.animationsEnabled&&t===e)}))}appendEmojiAnimationContainer(e){const t=e===o._.mobile?this.columnEl:document.body;this.emojiAnimationContainer.parentElement!==t&&t.append(this.emojiAnimationContainer)}attachKeydownListener(){const e=new Set(["PageUp","PageDown","Meta","Control"]);document.body.addEventListener("keydown",(t=>{var i;const s=t.key,n=document.getSelection().isCollapsed;if(Ct.Z.isOverlayActive||e.has(s))return;const a=t.target,r=this.chat;if((!(s.startsWith("Arrow")||t.shiftKey&&"Shift"===s)||n)&&("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===a.tagName)){if(!t.altKey||"ArrowUp"!==s&&"ArrowDown"!==s){if("ArrowUp"===s&&"scheduled"!==this.chat.type){if(r.input.editMsgId||!r.input.isInputEmpty())return;this.managers.appMessagesManager.getFirstMessageToEdit(r.peerId,r.threadId).then((e=>{e&&(r.input.initMessageEditing(e.mid),(0,Le.Z)(t))}))}else if("ArrowDown"===s)return}else(0,Le.Z)(t),this.managers.dialogsStorage.getNextDialog(this.chat.peerId,"ArrowDown"===s,es.default.filterId).then((e=>{e&&this.setPeer({peerId:e.peerId})}));if((null===(i=null==r?void 0:r.input)||void 0===i?void 0:i.messageInput)&&t.target!==r.input.messageInput&&"INPUT"!==a.tagName&&!a.isContentEditable&&!c.Z&&(!o.Z.isMobile||this.tabId===Yr.CHAT)&&!r.selection.isSelecting&&!r.input.recording){r.input.messageInput.focus(),(0,Ot.Z)(r.input.messageInput);const e=new KeyboardEvent(t.type,t);r.input.messageInput.dispatchEvent(e)}}}))}makeLink(e,t){return Object.assign({_:e},t)}processInternalLink(e){return Xr(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case xe.MESSAGE:{const t=e.post?(0,wt.Z)(+e.post):void 0,i=e.comment?(0,wt.Z)(+e.comment):void 0,s=e.thread?(0,wt.Z)(+e.thread):void 0;this.openUsername({userName:e.domain,lastMsgId:t,commentId:i,startParam:e.start,stack:e.stack,threadId:s});break}case xe.PRIVATE_POST:{const t=e.channel.toChatId(),i=(t.toPeerId(!0),yield this.managers.appChatsManager.getChat(t));if(!i)try{yield this.managers.appChatsManager.resolveChannel(t)}catch(e){throw(0,we.bC)({langPackKey:"LinkNotFound"}),e}const s=(0,wt.Z)(+e.post),n=e.thread?(0,wt.Z)(+e.thread):void 0;this.op({peer:i,lastMsgId:s,threadId:n,stack:e.stack});break}case xe.EMOJI_SET:case xe.STICKER_SET:new P.Z({id:e.set},e._===xe.EMOJI_SET).show();break;case xe.JOIN_CHAT:this.managers.appChatsManager.checkChatInvite(e.invite).then((t=>{t.chat&&this.managers.appChatsManager.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new Ve(e.invite,t):this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})}),(e=>{"INVITE_HASH_EXPIRED"===e.type&&(0,we.Am)((0,L.ag)("InviteExpired"))}));break;case xe.VOICE_CHAT:no.Z&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;case xe.USER_PHONE_NUMBER:this.managers.appUsersManager.resolvePhone(e.phone).then((e=>{this.setInnerPeer({peerId:e.id.toPeerId(!1)})})).catch((e=>{"PHONE_NOT_OCCUPIED"===e.type&&(0,we.bC)({langPackKey:"Alert.UserDoesntExists"})}));break;case xe.INVOICE:this.managers.appPaymentsManager.getInputInvoiceBySlug(e.slug).then((e=>{this.managers.appPaymentsManager.getPaymentForm(e).then((t=>{new Hi(void 0,e,t)}))}));break;default:this.log.warn("Not supported internal link:",e)}}))}openUrl(e){const{url:t,onclick:i}=(0,ms.Z)(e);if(!i)return;const s=document.createElement("a");s.href=t,window[i](s)}op(e){return Xr(this,void 0,void 0,(function*(){let{peer:t,commentId:i,threadId:s,lastMsgId:n}=e;const a="user"===t._,o=t.id.toPeerId(!a),r="channel"===t._&&t.pFlags.forum;if(i||s||n||!r){if(r&&n&&!s){const t=yield this.managers.appMessagesManager.reloadMessages(o,n);t?s=e.threadId=(0,b.Z)(t,r):(s=e.threadId=n,n=e.lastMsgId=void 0)}return s?this.openThread(Object.assign(Object.assign({},e),{peerId:o})):i?this.openComment({peerId:o,msgId:n,commentId:i}):this.setInnerPeer(Object.assign(Object.assign({},e),{peerId:o}))}es.default.toggleForumTabByPeerId(o,!0)}))}openPremiumBot(){return this.managers.apiManager.getAppConfig().then((e=>this.openUsername({userName:e.premium_bot_username})))}openUsername(e){const{userName:t}=e;return this.managers.appUsersManager.resolveUsername(t).then((t=>this.op(Object.assign({peer:t},e))),(e=>{"USERNAME_NOT_OCCUPIED"===e.type?(0,we.bC)({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&(0,we.bC)({langPackKey:"Alert.UserDoesntExists"})}))}openThread(e){return Xr(this,void 0,void 0,(function*(){return(yield this.managers.appChatsManager.isForum(e.peerId.toChatId()))?(yield this.managers.dialogsStorage.getForumTopicOrReload(e.peerId,e.threadId),this.setInnerPeer(e)):this.managers.appMessagesManager.reloadMessages(e.peerId,e.threadId).then((t=>(t?this.managers.appMessagesManager.generateThreadServiceStartMessage(t):e.lastMsgId=void 0,this.setInnerPeer(Object.assign(Object.assign({},e),{type:"discussion"})))))}))}openComment(e){return this.managers.appMessagesManager.getDiscussionMessage(e.peerId,e.msgId).then((t=>this.openThread({peerId:t.peerId,lastMsgId:e.commentId,threadId:t.mid})))}callUser(e,t){return Xr(this,void 0,void 0,(function*(){kr.Z.getCallByUserId(e)||((yield this.managers.appProfileManager.getProfile(e)).pFlags.phone_calls_private?(0,Kt.Z)({peerId:e.toPeerId()}).then((e=>(0,bi.Z)({descriptionLangKey:"Call.PrivacyErrorMessage",descriptionLangArgs:[e],button:{langKey:"OK",isCancel:!0}}))):(yield this.discardCurrentCall(e.toPeerId()),kr.Z.startCallInternal(e,"video"===t)))}))}discardCurrentCall(e,t,i){return ro.ZP.groupCall&&ro.ZP.groupCall!==t?this.discardGroupCallConfirmation(e):kr.Z.currentCall&&kr.Z.currentCall!==i?this.discardCallConfirmation(e):Promise.resolve()}discardCallConfirmation(e){return Xr(this,void 0,void 0,(function*(){const t=kr.Z.currentCall;t&&(yield Promise.all([(0,Kt.Z)({peerId:t.interlocutorUserId.toPeerId(!1)}),(0,Kt.Z)({peerId:e})]).then((([t,i])=>(0,bi.Z)({titleLangKey:"Call.Confirm.Discard.Call.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Call.ToCall.Text":"Call.Confirm.Discard.Call.ToVoice.Text",descriptionLangArgs:[t,i],button:{langKey:"OK"}}))),t.isClosing||(yield t.hangUp("phoneCallDiscardReasonDisconnect")))}))}discardGroupCallConfirmation(e){return Xr(this,void 0,void 0,(function*(){const t=ro.ZP.groupCall;t&&(yield Promise.all([(0,Kt.Z)({peerId:t.chatId.toPeerId(!0)}),(0,Kt.Z)({peerId:e})]).then((([t,i])=>(0,bi.Z)({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Voice.ToCall.Text":"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[t,i],button:{langKey:"OK"}}))),ro.ZP.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return Xr(this,void 0,void 0,(function*(){const i=e.toChatId(),s=this.managers.appChatsManager.hasRights(i,"manage_call");if(t&&"groupCallDiscarded"===(yield this.managers.appGroupCallsManager.getGroupCallFull(t))._){if(!s)return void(0,we.bC)({langPackKey:"VoiceChat.Chat.Ended"});yield(0,bi.Z)({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}(()=>{Xr(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getChatFull(i);let t;if(e.call)t=e.call;else{if(!s)return;t=yield this.managers.appGroupCallsManager.createGroupCall(i)}ro.ZP.joinGroupCall(i,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){var t,i;const s=yo.Z.getTheme(),n=null===(i=null===(t=s.settings)||void 0===t?void 0:t.wallpaper)||void 0===i?void 0:i.slug;if(n){const t=Vr.h.settings.themes.find((e=>e.name===s.name));return this.getBackground(n).then((t=>this.setBackground(t,e)),(()=>(s.settings=(0,La.Z)(t.settings),this.setCurrentBackground(!0))))}return this.setBackground("",e)}getBackground(e){return this.backgroundPromises[e]?this.backgroundPromises[e]:this.backgroundPromises[e]=this.cacheStorage.getFile("backgrounds/"+e).then((e=>URL.createObjectURL(e)))}setBackground(e,t=!0){this.lastBackgroundUrl=e;const i=this.chats.map((t=>t.setBackground(e)));return i[i.length-1].then((()=>{t&&d.Z.dispatchEvent("background_change")}))}saveChatPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.bubbles,i=e.peerId+(e.threadId?"_"+e.threadId:""),s=Zo.Z.getFromCache("chatPositions");if(t.scrollable.getDistanceToEnd()<=16&&t.scrollable.loadedAll.bottom||!t.getRenderedLength())delete s[i],this.log("deleted chat position");else{t.sliceViewport(!0);const e=t.scrollable.scrollTop,n={mids:(0,rt.Z)(t.bubbles,"desc").filter((e=>e>0&&!t.skippedMids.has(e))),top:e};s[i]=n,this.log("saved chat position:",n)}Zo.Z.set({chatPositions:s},!0)}getChatSavedPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.peerId+(e.threadId?"_"+e.threadId:""),i=Zo.Z.getFromCache("chatPositions");return i&&i[t]}applyCurrentTheme(e,t,i){return t&&(this.backgroundPromises[e]=Promise.resolve(t)),yo.Z.setTheme(),this.setCurrentBackground(void 0===i?!!e:i)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&To([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),d.Z.settings.animationsEnabled&&!1!==t&&(0,pe.YW)((0,at.Z)(400),400);const i=(0,Me.Z)(this.prevTab);(0,Me.Z)(e)>i&&Hn.Z.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),(0,Qn.Z)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),c.Z||this.attachDragAndDropListeners(),this.markupTooltip=new Io(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let i=!1;const s=(r,d)=>Xr(this,void 0,void 0,(function*(){if(d===i)return;const l=r.dataTransfer.types,c=l.contains?l.contains("Files"):l.indexOf("Files")>=0,h=_n(),u=yield $r(r,!0);if(!c||!(yield this.canDrag())&&!h)return void(n=0);const p=h?o:a,f=h?t:e;if(d&&!f.length){const e=c&&!u.length,t=u.filter((e=>bn.Z.has(e))).length;this.log("drag files",u),h?(h.appendDrops(p),(u.length||e)&&f.push(new Po(p,{header:"Preview.Dragging.AddItems",headerArgs:[u.length],onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}}))):((u.length||e)&&f.push(new Po(p,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}})),(t||e)&&f.push(new Po(p,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"media")}})),this.chat.container.append(p))}(0,De.Z)({element:p,className:"is-visible",forwards:d,duration:200,onTransitionEnd:()=>{d||(f.forEach((e=>{e.destroy()})),f.length=0)}}),d?f.forEach((e=>{e.setPath()})):n=0,document.body.classList.toggle("is-dragging",d),i=d}));let n=0;document.body.addEventListener("dragenter",(e=>{n++})),document.body.addEventListener("dragover",(e=>{s(e,!0),(0,Le.Z)(e)})),document.body.addEventListener("dragleave",(e=>{n--,0===n&&s(e,!1)}));const a=document.createElement("div");a.classList.add("drops-container");const o=a.cloneNode(!0)}canDrag(){return Xr(this,void 0,void 0,(function*(){const e=this.chat;return!(!(null==e?void 0:e.peerId)||Ct.Z.isOverlayActive||!(yield e.canSend("send_media")))}))}overrideHash(e){return Xr(this,void 0,void 0,(function*(){let t;if(e){const i=yield this.managers.appPeersManager.getPeerUsername(e);t=i?"@"+i:""+e}Hn.Z.overrideHash(t)}))}selectTab(e,t){var i;!1===t&&To([n.ZP.sidebarEl,this.columnEl,a.ZP.sidebarEl]),document.body.classList.toggle(n.ir,e===Yr.CHATLIST);const s=this.tabId;void 0!==s&&(this.overrideHash(e>Yr.CHATLIST?null===(i=this.chat)||void 0===i?void 0:i.peerId:void 0),this.dispatchEvent("tab_changing",e)),this.log("selectTab",e,s);let r=d.Z.settings.animationsEnabled?(0,fe.d1)():Promise.resolve();if(void 0!==s&&s!==e&&d.Z.settings.animationsEnabled&&!1!==t){const e=100+(o.Z.isMobile?250:200);r=(0,at.Z)(e),(0,pe.YW)(r,e)}this.tabId=e,(0,Qn.Z)(),o.Z.isMobile&&s===Yr.PROFILE&&es&&(e{this.setPeer({},e)}});const l=window.onImTabChange;return l&&l(e),r}updateStatus(){return this.managers.appUsersManager.updateMyOnlineStatus(this.offline)}createNewChat(){const e=new Co(this,this.managers);return this.chats.length&&e.setBackground(this.lastBackgroundUrl,!0),this.chats.push(e),e}spliceChats(e,t=!0,i,s){if(e>=this.chats.length)return;const n=this.chat;this.chats.length>1&&t&&this.dispatchEvent("peer_changing",this.chat),s||(s=this.chats.splice(e,this.chats.length-e));const o=this.chat;this.dispatchEvent("chat_changing",{from:n,to:o});for(let e=0;e1&&s.slice(0,-1).forEach((e=>{e.container.remove()})),this.chatsSelectTab(o.container,i),t){this.dispatchEvent("peer_changed",o);const e=a.ZP.getTab(po);null==e||e.close(),a.ZP.replaceSharedMediaTab(o.sharedMediaTab)}s.forEach((e=>{e.beforeDestroy()})),setTimeout((()=>{s.forEach((e=>{e.destroy()}))}),350)}setPeer(e={},t){var i;return Xr(this,void 0,void 0,(function*(){this.init&&(this.init(),this.init=null),null!==(i=e.peerId)&&void 0!==i||(e.peerId=m.NM);const{peerId:s,lastMsgId:a,threadId:r}=e,d=this.chat,l=this.chats.indexOf(d),c=this.isSamePeer(d,e);if(s){if(l>0&&d.peerId&&!c){const t=this.chats.splice(1,this.chats.length-1);if(this.chat.peerId===s)return void this.spliceChats(0,!0,!0,t);{const i=this.setPeer(e);return this.spliceChats(0,!1,!1,t),i}}}else{if(l>0)return void this.spliceChats(l,void 0,t);if(o.Z.activeScreen===o._.medium)return void this.selectTab(+!this.tabId,t)}if(c&&o.Z.activeScreen<=o._.medium&&document.body.classList.contains(n.ir))return this.selectTab(Yr.CHAT,t),!1;if(s||o.Z.activeScreen!==o._.mobile){const i=yield d.setPeer(e),n=(null==i?void 0:i.cached)?i.promise:Promise.resolve();s&&Promise.all([n,d.setBackgroundPromise]).then((()=>{setTimeout((()=>{setTimeout((()=>{this.chatsSelectTab(this.chat.container)}),0),this.selectTab(Yr.CHAT,t)}),0)}))}return s?void 0:(this.selectTab(Yr.CHATLIST,t),!1)}))}setInnerPeer(e){var t;return Xr(this,void 0,void 0,(function*(){const{peerId:i}=e;if(i===m.NM||!i)return;e.type||(e.threadId&&!(yield this.managers.appPeersManager.isForum(e.peerId))&&(e.type="discussion"),null!==(t=e.type)&&void 0!==t||(e.type="chat"));const s=this.chats.findIndex((t=>this.isSamePeer(t,e)||o.Z.activeScreen===o._.mobile&&0===this.tabId));if(-1!==s)return this.spliceChats(s+1),this.setPeer(e);const n=this.chat;let a=n;return n.inited&&(a=this.createNewChat()),this.dispatchEvent("chat_changing",{from:n,to:a}),this.setPeer(e)}))}openScheduled(e){this.setInnerPeer({peerId:e,type:"scheduled"})}getTypingElement(e){const t=document.createElement("span");let i="peer-typing";switch(t.classList.add(i),t.dataset.action=e._,e._){case"sendMessageTypingAction":i+="-text";for(let e=0;e<3;++e){const e=document.createElement("span");e.className=i+"-dot",t.append(e)}break;case"sendMessageUploadAudioAction":case"sendMessageUploadDocumentAction":case"sendMessageUploadRoundAction":case"sendMessageUploadVideoAction":case"sendMessageUploadPhotoAction":i+="-upload";break;case"sendMessageRecordAudioAction":case"sendMessageRecordRoundAction":case"sendMessageRecordVideoAction":i+="-record";break;case"sendMessageEmojiInteractionSeen":case"sendMessageChooseStickerAction":i+="-choosing-sticker";for(let e=0;e<2;++e){const e=document.createElement("div");e.className=i+"-eye",t.append(e)}}return t.classList.add(i),t}getPeerTyping(e,t,i){return Xr(this,void 0,void 0,(function*(){const s=e.isUser();if(s&&(yield this.managers.appUsersManager.isBot(e)))return;const n=yield this.managers.appProfileManager.getPeerTypings(e,i);if(!(null==n?void 0:n.length))return;const a=n[0],o={private:{sendMessageTypingAction:"Peer.Activity.User.TypingText",sendMessageUploadAudioAction:"Peer.Activity.User.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.User.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.User.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.User.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.User.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.User.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.User.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.User.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.User.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.User.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.User.EnjoyingAnimations"},chat:{sendMessageTypingAction:"Peer.Activity.Chat.TypingText",sendMessageUploadAudioAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.Chat.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.Chat.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.Chat.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.Chat.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.Chat.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.Chat.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.Chat.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.Chat.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.Chat.EnjoyingAnimations"},multi:{sendMessageTypingAction:"Peer.Activity.Chat.Multi.TypingText1",sendMessageUploadAudioAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadDocumentAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadPhotoAction:"Peer.Activity.Chat.Multi.SendingPhoto1",sendMessageUploadVideoAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageUploadRoundAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageRecordVideoAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageRecordAudioAction:"Peer.Activity.Chat.Multi.RecordingAudio1",sendMessageRecordRoundAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageGamePlayAction:"Peer.Activity.Chat.Multi.PlayingGame1",sendMessageChooseStickerAction:"Peer.Activity.Chat.Multi.ChoosingSticker1"}},r=s?o.private:n.length>1?o.multi:o.chat;let d=a.action;if(n.length>1){const e={};n.forEach((t=>{const i=t.action._;void 0===e[i]&&(e[i]=0),++e[i]})),Object.keys(e).length>1&&(d={_:"sendMessageTypingAction"})}const l=r[d._];if(!l)return;let c,h;if(e.isAnyChat()){const e=new N.Z;c=e.update({peerId:a.userId.toPeerId(!1),onlyFirstName:!0}),h=[e.element,n.length-1],yield c}t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),t.classList.toggle("peer-typing-flex","sendMessageChooseStickerAction"===d._||"sendMessageEmojiInteractionSeen"===d._);let u=t.firstElementChild;if(u?u.dataset.action!==d._&&u.replaceWith(this.getTypingElement(d)):(u=this.getTypingElement(d),t.prepend(u)),"sendMessageEmojiInteractionSeen"===d._){h?h.pop():h=[];const e=(0,_r.Z)((0,B.Z)(d.emoticon));h.push(e)}const p=(0,L.ag)(l,h);return p.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(p):t.append(p),t}))}getChatStatus(e,t){return Xr(this,void 0,void 0,(function*(){const i=t?void 0:yield this.getPeerTyping(e.toPeerId(!0));if(i)return{cached:!0,result:Promise.resolve(i)};const s=yield this.managers.acknowledged.appProfileManager.getChatFull(e),n=Promise.resolve(s.result).then((t=>Xr(this,void 0,void 0,(function*(){var i,s;const n=t.participants_count||(null===(s=null===(i=t.participants)||void 0===i?void 0:i.participants)||void 0===s?void 0:s.length)||1;let a=yield(0,xa.Z)(e);if(n<2)return a;const o=yield this.managers.appProfileManager.getOnlines(e);if(o>1){const e=document.createElement("span");e.append(...(0,L.v_)([a,(0,L.ag)("OnlineCount",[(0,je.Z)(o)])],!1)),a=e}return a}))));return{cached:s.cached,result:n}}))}getUserStatus(e,t){var i;return Xr(this,void 0,void 0,(function*(){const s={cached:!0,result:Promise.resolve(void 0)},n=yield this.managers.appUsersManager.getUser(e);if(!n||n.pFlags.self&&!t)return s;const a=(0,Ws.Z)(n);if(!n.pFlags.bot&&!n.pFlags.support){let t=yield this.getPeerTyping(e.toPeerId());if(t||"userStatusOnline"!==(null===(i=n.status)||void 0===i?void 0:i._)||(t=document.createElement("span"),t.classList.add("online"),t.append(a)),t)return s.result=Promise.resolve(t),s}return s.result=Promise.resolve(a),s}))}getPeerStatus(e,t,i){return Xr(this,void 0,void 0,(function*(){if(!e)return;let s;return s=e.isAnyChat()?this.getChatStatus(e.toChatId(),i):this.getUserStatus(e.toUserId(),t),s}))}setPeerStatus(e){return Xr(this,void 0,void 0,(function*(){const{peerId:t,element:i,needClear:s,useWhitespace:n,middleware:a,ignoreSelf:o,noTyping:r}=e;if(!s){const e=i.querySelector(".peer-typing-container");if(e&&(yield this.getPeerTyping(t,e)))return}const d=yield this.getPeerStatus(t,o,r);if(!a())return;const l=()=>Xr(this,void 0,void 0,(function*(){const e=d&&(yield d.result);if(a())return()=>(0,H.Z)(i,e||c)})),c=n?"‎":"";return!d||d.cached||void 0===s?yield l():s?()=>(i.textContent=c,l().then((e=>null==e?void 0:e()))):void 0}))}setChoosingStickerTyping(e){this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"},void 0,this.chat.threadId)}isSamePeer(e,t){return e.peerId===t.peerId&&e.threadId===t.threadId&&(typeof e.type!=typeof t.type||e.type===t.type)}}const ed=new Jr;ge.GO&&(ge.GO.appImManager=ed);const td=ed},3709:(e,t,i)=>{"use strict";function s(e){var t;return e&&!e.pFlags.is_outgoing&&!e.pFlags.noforwards&&!(null===(t=e.media)||void 0===t?void 0:t.extended_media)}i.d(t,{Z:()=>s})},7530:(e,t,i)=>{"use strict";function s(e){var t;if(!e)return;let i;if(e.action)i=e.action.photo;else if(e.media){let s=e.media;s.webpage?s=s.webpage:"messageExtendedMedia"===(null===(t=s.extended_media)||void 0===t?void 0:t._)&&(s=s.extended_media.media),i=s.document||s.photo}return i}i.d(t,{Z:()=>s})},2291:(e,t,i)=>{"use strict";function s(e){var t;return e.fromId?{peerId:e.fromId}:{fromName:null===(t=e.fwd_from)||void 0===t?void 0:t.from_name}}i.d(t,{Z:()=>s})},5381:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(677);function n(e){return!(!e.restriction_reason||!(0,s.X)(e.restriction_reason))}},5990:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});const s=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],n=["red","green","yellow","blue","violet","pink","cyan","orange"],a=[0,7,4,1,6,3,5];function o(e,t=!0){if(!e)return"";const i=a[Math.abs(+e)%7];return(t?n:s)[i]}},6082:(e,t,i)=>{"use strict";function s(e){if(e.username)return e.username;const t=e.usernames,i=null==t?void 0:t.find((e=>e.pFlags.editable));return null==i?void 0:i.username}i.d(t,{Z:()=>s})},2946:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(5880),n=i(1507);function a(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,s.Z)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const i=e.channel_id||e.chat_id;return void 0!==i?i.toPeerId(!0):n.NM}if(!e)return n.NM;const t="u"===e.charAt(0),i=e.substr(1).split("_");return t?i[0].toPeerId():(i[0]||"").toPeerId(!0)}},7030:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(9897),n=i(1507);function a(e,t=0,i=0,a=!1,o=!1){window.devicePixelRatio>1&&(t*=2,i*=2);let r=e.sizes||e.thumbs,d={_:"photoSizeEmpty",type:n.Pt};if(o&&r&&"photo"!==e._&&(r=r.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:n.Pt})),null==r?void 0:r.length){for(let e=0,n=r.length;e=t||a.height>=i)break}a&&"photoSizeEmpty"===d._&&"photoStrippedSize"===r[0]._&&(d=r[0])}return d}},3075:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5953),n=i(5003),a=i(6752);class o{constructor(e){var t;(0,s.Z)(this,e),this.log||(this.log=(null===(t=this.connection)||void 0===t?void 0:t.log)||(0,n.kg)("CALL-CONNECTION-BASE")),this.sources={}}createPeerConnection(e){return this.connection||(this.connection=function(e,t){t||(t=(0,n.kg)("RTCPeerConnection")),t("constructor");const i=new RTCPeerConnection(e);return i.addEventListener("track",(e=>{t("ontrack",e)})),i.addEventListener("signalingstatechange",(()=>{t("onsignalingstatechange",i.signalingState)})),i.addEventListener("connectionstatechange",(()=>{t("onconnectionstatechange",i.connectionState)})),i.addEventListener("negotiationneeded",(()=>{t("onnegotiationneeded",i.signalingState)})),i.addEventListener("icecandidate",(e=>{t("onicecandidate",e)})),i.addEventListener("iceconnectionstatechange",(()=>{t("oniceconnectionstatechange",i.iceConnectionState)})),i.addEventListener("datachannel",(()=>{t("ondatachannel")})),i.log=t,{connection:i}}(e,this.log.bindPrefix("connection")).connection)}createDataChannel(e){return this.dataChannel||(this.dataChannel=function(e,t,i){i||(i=(0,n.kg)("RTCDataChannel"));const s=e.createDataChannel("data",t);return s.addEventListener("message",(e=>{i("onmessage",e)})),s.addEventListener("open",(()=>{i("onopen")})),s.addEventListener("close",(()=>{i("onclose")})),s.log=i,s}(this.connection,e,this.log.bindPrefix("data")))}createDescription(){return this.description||(this.description=new a.ZP(this.connection))}appendStreamToConference(){return this.streamManager.appendToConference(this.description)}closeConnection(){const{connection:e}=this;if(e)try{e.log("close"),e.close()}catch(e){this.log.error(e)}}closeConnectionAndStream(e){this.closeConnection(),e&&this.streamManager.stop()}negotiate(){return this.negotiating||(this.negotiating=this.negotiateInternal().finally((()=>{this.negotiating=void 0})))}sendDataChannelData(e){"open"===this.dataChannel.readyState&&this.dataChannel.send(JSON.stringify(e))}}},2069:(e,t,i)=>{"use strict";i.d(t,{Z:()=>N});var s=i(6761),n=i(4762),a=i(5953),o=i(5701),r=i(671),d=i(5003),l=i(3855),c=i(3075),h=i(3773);function u(e){const t=(0,h.Z)(e,e.media[0]),i={"@type":"InitialSetup",fingerprints:[t.fingerprint],ufrag:t.ufrag,pwd:t.pwd,audio:void 0,video:void 0,screencast:void 0},s=e=>""+e;for(const t of e.media){const n=t.mediaType;if("application"===n||!t.isSending)continue;const a=i["video"===n&&i.video?"screencast":n]={},o=(0,h.Z)(e,t);a.ssrc=s(o.source),o.sourceGroups&&(a.ssrcGroups=o.sourceGroups.map((e=>({semantics:e.semantics,ssrcs:e.sources.map(s)}))));const r=a.rtpExtensions=[];t.attributes.get("extmap").forEach((e=>{r.push({id:+e.key,uri:e.value})}));const d=new Map,l=e=>{let t=d.get(e);return t||d.set(e,t={id:e}),t};t.attributes.get("rtpmap").forEach((e=>{const t=+e.key,i=l(t),s=e.value.split("/"),[n,a,o]=s;i.name=n,i.clockrate=+a,i.channels=o?+o:0})),t.attributes.get("rtcp-fb").forEach((e=>{const t=+e.key;l(t).feedbackTypes=e.lines.map((e=>{const t=e.split(" "),[i,s]=t;return{type:i,subtype:s||""}}))})),t.attributes.get("fmtp").forEach((e=>{const t=+e.key,i=l(t).parameters={},s=e.value.split(";");for(const e of s){const[t,s]=e.split("=");i[t]=s}})),a.payloadTypes=Array.from(d.values())}return i}var p=i(9124);class f extends c.Z{constructor(e){super(e)}negotiateInternal(){return e=this,t=void 0,s=function*(){const{connection:e,call:t}=this;if(!e.localDescription&&!e.remoteDescription&&!t.isOutgoing)return;let i;if(t.offerReceived){t.offerReceived=!1;const s=i=yield e.createAnswer();this.log("[sdp] local",s.type,s.sdp),yield e.setLocalDescription(s),this.log("[InitialSetup] send 2")}else{const s=i=yield e.createOffer();this.log("[sdp] local",s.sdp),yield e.setLocalDescription(s),t.offerSent=!0,this.log("[InitialSetup] send 0")}const s=u((0,p.DV)(i.sdp));t.sendCallSignalingData(s)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var m=i(8500),g=i(2493),v=i(3335),b=i(1677),y=i(49),w=i(6752),S=i(4903);const C="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var L=i(9818),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class I{constructor(e,t){this.isOutgoing=e,this.p2pKey=t,this.type="Signaling",this.counter=0,this.seqMap=new Map}concatSHA256(e){return t=(0,S.Z)(...e),C.digest("SHA-256",(0,L.Z)(t)).then((e=>new Uint8Array(e)));var t}encryptPrepared(e){return E(this,void 0,void 0,(function*(){const t={counter:0,bytes:new Uint8Array(16+e.length)},i=(this.isOutgoing?0:8)+("Signaling"===this.type?128:0),s=this.p2pKey,n=yield this.concatSHA256([s.subarray(i+88,i+88+32),e]),a=t.bytes;for(let e=0;e<16;++e)a[e]=n[e+8];const o=yield this.prepareAesKeyIv(s,a,i),r=yield this.aesProcessCtr(e,e.length,o,!0);return t.bytes=new Uint8Array([...t.bytes.subarray(0,16),...r]),t}))}encryptRawPacket(e){const t=++this.counter,i=new ArrayBuffer(4);new DataView(i).setUint32(0,t>>>0,!1);const s=new Uint8Array([...new Uint8Array(i),...e]);return this.encryptPrepared(s)}prepareAesKeyIv(e,t,i){return E(this,void 0,void 0,(function*(){const[s,n]=yield Promise.all([this.concatSHA256([t.subarray(0,16),e.subarray(i,i+36)]),this.concatSHA256([e.subarray(40+i,40+i+36),t.subarray(0,16)])]);return{key:new Uint8Array([...s.subarray(0,8),...n.subarray(8,24),...s.subarray(24,32)]),iv:new Uint8Array([...n.subarray(0,4),...s.subarray(8,16),...n.subarray(24,28)])}}))}aesProcessCtr(e,t,i,s=!0){return E(this,void 0,void 0,(function*(){const t=yield C.importKey("raw",i.key,{name:"AES-CTR"},!1,[s?"encrypt":"decrypt"]),n=yield C[s?"encrypt":"decrypt"]({name:"AES-CTR",counter:i.iv,length:8*i.iv.length},t,e);return new Uint8Array(n)}))}constTimeIsDifferent(e,t,i){let s=!0;for(let n=0;n134217728)return;const{isOutgoing:t,type:i}=this,s=(t?8:0)+("Signaling"===i?128:0),n=this.p2pKey,a=e.subarray(0,16),o=e.subarray(16),r=e.length-16,d=yield this.prepareAesKeyIv(n,a,s),l=yield this.aesProcessCtr(o,r,d,!1),c=yield this.concatSHA256([n.subarray(88+s,88+s+32),l]);if(this.constTimeIsDifferent(c.subarray(8),a,16))return;const h=new DataView(l.buffer).getUint32(0);return this.seqMap.has(h)?void 0:(this.seqMap.set(h,h),l.slice(4))}))}}var M=i(630);class P{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new M.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} audio${s}`),r.add("a=rtcp-mux",_(a),F(i,s,n,d));break;case"video":r.add(`m=video 61986 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",_(a),F(i,s,n,d))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new M.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} audio${s}`),r.add("a=rtcp-mux",_(a),F(i,s,n,d));break;case"video":r.add(`m=video 61986 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",_(a),F(i,s,n,d))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}}class Z{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(l),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(l),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(h),r+="\na=rtcp-mux",r+=_(l),r+=F(i,n,a,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${l.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(h),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(l),r+=F(i,n,a,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}class T{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} audio${s}`),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} audio${s}`),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}function k(){return navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function x(){return navigator.userAgent.toLowerCase().indexOf("safari")>-1&&-1===navigator.userAgent.toLowerCase().indexOf("chrome")}function A(e){let t=[];for(let i=0;i{const{type:i,subtype:s}=e;t.push(`a=rtcp-fb:${n} ${[i,s].join(" ")}`)})),l){const e=[];Object.getOwnPropertyNames(l).forEach((t=>{e.push(`${t}=${l[t]}`)})),t.push(`a=fmtp:${n} ${e.join(";")}`)}}return t.join("\n")}function F(e,t,i,s){let n=[];return i&&i.length>0?i.forEach((t=>{t&&t.ssrcs.length>0&&(n.push(`a=ssrc-group:${t.semantics} ${t.ssrcs.join(" ")}`),t.ssrcs.forEach((t=>{n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`)})))})):t&&n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`),n.join("\n")}class D{static generateCandidate(e){if(!e)return null;const{sdpString:t,sdpMLineIndex:i,sdpMid:s,foundation:n,component:a,protocol:o,priority:r,address:d,type:l,relAddress:c,generation:h,tcpType:u,networkId:p,networkCost:f,username:m}=e;if(t)return{candidate:t,sdpMLineIndex:i,sdpMid:s};throw"no sdpString"}static generateOffer(e){return k()?Z.generateOffer(e):x()?T.generateOffer(e):P.generateOffer(e)}static generateAnswer(e){return k()?Z.generateAnswer(e):x()?T.generateAnswer(e):P.generateAnswer(e)}}var R=i(9585),B=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class N extends m.Z{constructor(e){super(),this.log=(0,d.kg)("CALL"),this.protocol||(this.protocol={_:"phoneCallProtocol",pFlags:{udp_p2p:!0,udp_reflector:!0},min_layer:92,max_layer:92,library_versions:["4.0.0"]}),(0,a.Z)(this,e),this.createdAt=Date.now(),this.offerReceived=!1,this.offerSent=!1,this.decryptQueue=[],this.candidates=[],this.addEventListener("state",(e=>{this.log("state",v.Z[e]),e===v.Z.CLOSED&&this.cleanup()}));const t=this.streamManager=new R.Z(b.iK);t.direction="sendrecv",t.types.push("screencast"),this.isOutgoing||(t.locked=!0,t.canCreateConferenceEntry=!1);let i={"@type":"MediaState",type:"input",lowBattery:!1,muted:!0,screencastState:"inactive",videoRotation:0,videoState:"inactive"};const s=this;i=new Proxy(i,{set:function(e,t,n){return e[t]=n,s.setMediaState(i),s.sendMediaState(),!0}}),this.mediaStates={input:i},this.sendMediaState=(0,o.Z)(this._sendMediaState.bind(this),0,!1,!0)}get connectionState(){const{_connectionState:e,connectionInstance:t}=this;if(void 0!==e)return e;if(t){const{iceConnectionState:e}=t.connection;return"closed"===e?v.Z.CLOSED:"connected"===e||n.IS_SAFARI&&"completed"===e?v.Z.CONNECTED:v.Z.CONNECTING}return v.Z.CONNECTING}get sortIndex(){const e=this.connectionState;let t=1e13*(v.Z.CLOSED-e+1);return t+=2147483647e3-(e===v.Z.PENDING&&this.isOutgoing?0:this.createdAt),t}getVideoElement(e){if("input"===e)return this.elements.get("main");{const e=this.getMediaState("output");if(!e)return;const t="active"===e.videoState?"video":"active"===e.screencastState?"screencast":void 0;if(!t)return;const i=this.description.findEntry((e=>e.type===t));if(!i)return;return this.elements.get(""+i.recvEntry.source)}}startScreenSharingInternal(){return B(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!0,this.wasStartingVideo=!1,this.streamManager.types=["audio","screencast"],yield this.requestScreen()}catch(e){this.log.error("startScreenSharing error",e)}}))}toggleScreenSharing(){return B(this,void 0,void 0,(function*(){return this.isSharingVideo&&(yield this.stopVideoSharing()),this.isSharingScreen?this.stopVideoSharing():this.startScreenSharingInternal()}))}startVideoSharingInternal(){return B(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!1,this.wasStartingVideo=!0,this.streamManager.types=["audio","video"],yield this.requestInputSource(!1,!0,!1)}catch(e){this.log.error("startVideoSharing error",e)}}))}stopVideoSharing(){return B(this,void 0,void 0,(function*(){const e=this.getMediaState("input");e.videoState=e.screencastState="inactive";const{streamManager:t,description:i}=this,s=t.inputStream.getVideoTracks()[0];s&&((0,y.Z)(s),t.appendToConference(i))}))}toggleVideoSharing(){return B(this,void 0,void 0,(function*(){return this.isSharingScreen&&(yield this.stopVideoSharing()),this.isSharingVideo?this.stopVideoSharing():this.startVideoSharingInternal()}))}getMediaState(e){return this.mediaStates[e]}setMediaState(e){this.mediaStates[e.type]=e,this.dispatchEvent("mediaState",e)}isSharingVideoType(e){try{return super.isSharingVideo&&!!(this.wasStartingScreen&&"screencast"===e||this.wasStartingVideo&&"video"===e)}catch(e){return!1}}get isSharingVideo(){return this.isSharingVideoType("video")}get isSharingScreen(){return this.isSharingVideoType("screencast")}get isMuted(){const e=this.streamManager.inputStream.getAudioTracks()[0];return!(null==e?void 0:e.enabled)}get isClosing(){const{connectionState:e}=this;return e===v.Z.CLOSING||e===v.Z.CLOSED}get description(){var e;return null===(e=this.connectionInstance)||void 0===e?void 0:e.description}setHangUpTimeout(e,t){this.clearHangUpTimeout(),this.hangUpTimeout=s.Z.setTimeout((()=>{this.hangUpTimeout=void 0,this.hangUp(t)}),e)}clearHangUpTimeout(){void 0!==this.hangUpTimeout&&(clearTimeout(this.hangUpTimeout),this.hangUpTimeout=void 0)}setPhoneCall(e){this.call=e;const{id:t}=e;if(this.id!==t){const e=this.id;this.id=t,this.dispatchEvent("id",t,e)}}acceptCall(){var e;return B(this,void 0,void 0,(function*(){const t=null===(e=(yield Promise.all(this.dispatchResultableEvent("acceptCallOverride")))[0])||void 0===e||e;if(this.isClosing||!t)return;this.overrideConnectionState(v.Z.EXCHANGING_KEYS);const i=this.call;this.requestInputSource(!0,!!i.pFlags.video,!1);const s=i.g_a_hash;this.managers.appCallsManager.generateDh().then((e=>B(this,void 0,void 0,(function*(){return this.dh={g_a_hash:s,b:e.a,g_b:e.g_a,g_b_hash:e.g_a_hash,p:e.p},this.managers.apiManager.invokeApi("phone.acceptCall",{peer:yield this.managers.appCallsManager.getCallInput(this.id),protocol:this.protocol,g_b:this.dh.g_b})})))).then((e=>B(this,void 0,void 0,(function*(){yield this.managers.appCallsManager.savePhonePhoneCall(e)})))).catch((e=>{this.log.error("accept call error",e),this.hangUp("phoneCallDiscardReasonHangup")}))}))}joinCall(){this.log("joinCall"),this.getEmojisFingerprint(),this.overrideConnectionState();const{isOutgoing:e,encryptionKey:t,streamManager:i}=this,s=function(e){const t=[];return e.connections.forEach((e=>{switch(e._){case"phoneConnectionWebrtc":{const{ip:i,ipv6:s,port:n,username:a,password:o}=e,r=[];e.pFlags.turn?(i&&r.push(`turn:${i}:${n}`),s&&r.push(`turn:[${s}]:${n}`)):e.pFlags.stun&&(i&&r.push(`stun:${i}:${n}`),s&&r.push(`stun:[${s}]:${n}`)),r.length>0&&t.push({urls:r,username:a,credential:o});break}}})),{iceServers:t,iceTransportPolicy:e.pFlags.p2p_allowed?"all":"relay"}}(this.call);if(this.log("joinCall configuration",s),!s)return;const n=this.connectionInstance=new f({call:this,streamManager:i,log:this.log.bindPrefix("connection")}),a=n.createPeerConnection(s);a.addEventListener("iceconnectionstatechange",(()=>{const e=this.connectionState;void 0===this.connectedAt&&e===v.Z.CONNECTED&&(this.connectedAt=Date.now()),this.dispatchEvent("state",e)})),a.addEventListener("negotiationneeded",(()=>{n.negotiate()})),a.addEventListener("icecandidate",(e=>{const{candidate:t}=e;a.log("onicecandidate",t),(null==t?void 0:t.candidate)&&this.sendIceCandidate(t)})),a.addEventListener("track",(e=>{const{track:t}=e;a.log("ontrack",t),this.onTrack(e)})),n.createDescription(),this.encryptor=new I(e,t),this.decryptor=new I(!e,t),this.log("currentCall",this),e&&n.appendStreamToConference(),this.createDataChannel(),this.processDecryptQueue()}createDataChannelEntry(){const e=this.description.createEntry("application");e.setDirection("sendrecv"),e.sendEntry=e.recvEntry=e}createDataChannel(){if(this.connectionInstance.dataChannel)return;const e=this.connectionInstance.createDataChannel({id:0,negotiated:!0});e.addEventListener("message",(e=>{this.applyDataChannelData(JSON.parse(e.data))})),e.addEventListener("open",(()=>{this.sendMediaState()}))}applyDataChannelData(e){"MediaState"===e["@type"]?(e.type="output",this.log("got output media state",e),this.setMediaState(e)):this.log.error("unknown data channel data:",e)}_sendMediaState(){const{connectionInstance:e}=this;if(!e)return;const t=Object.assign({},this.getMediaState("input"));delete t.type,this.log("sendMediaState",t),e.sendDataChannelData(t)}sendCallSignalingData(e){return B(this,void 0,void 0,(function*(){const t=JSON.stringify(e),i=(new TextEncoder).encode(t),{bytes:s}=yield this.encryptor.encryptRawPacket(i);this.log("sendCallSignalingData",this.id,t),yield this.managers.apiManager.invokeApi("phone.sendSignalingData",{peer:yield this.managers.appCallsManager.getCallInput(this.id),data:s})}))}sendIceCandidate(e){this.log("sendIceCandidate",e);const{candidate:t,sdpMLineIndex:i}=e;if(0!==i)return;const s=function(e){if(!e||!e.startsWith("candidate:"))return;const t=e;e=e.substr("candidate:".length);const[i,s,n,a,o,r,...d]=e.split(" "),l={sdpString:t,foundation:i,component:s,protocol:n,priority:a,address:{ip:o,port:r}};for(let e=0;e(this.getEmojisFingerprintPromise=void 0,this.emojisFingerprint=e.map((e=>(0,r.zu)(e))))))}unlockStreamManager(){this.connectionInstance.streamManager.locked=!1,this.connectionInstance.appendStreamToConference()}doTheMagic(){return B(this,void 0,void 0,(function*(){this.connectionInstance.appendStreamToConference();const e=this.connectionInstance.connection;let t=yield e.createAnswer();this.log("[sdp] local",t.type,t.sdp),yield e.setLocalDescription(t),e.getTransceivers().filter((e=>"recvonly"===e.direction)).forEach((e=>{const t=this.connectionInstance.description.getEntryByMid(e.mid);t.transceiver=t.recvEntry.transceiver=e,e.direction="sendrecv"}));const i=this.description,s=i.entries.map((e=>e.mid)),n={type:"offer",sdp:i.generateSdp({bundle:s,entries:i.entries.filter((e=>s.includes(e.mid))),isAnswer:!0})};yield e.setRemoteDescription(n),t=yield e.createAnswer(),yield e.setLocalDescription(t);const a=u((0,p.DV)(t.sdp));this.log("[InitialSetup] send 1"),this.sendCallSignalingData(a),this.unlockStreamManager()}))}overrideConnectionState(e){this._connectionState=e,this.dispatchEvent("state",this.connectionState)}get duration(){return void 0!==this.connectedAt?(Date.now()-this.connectedAt)/1e3|0:0}onInputStream(e){super.onInputStream(e);const t=e.getVideoTracks()[0];if(t){const e=this.getMediaState("input");this.wasStartingScreen||this.wasStartingVideo||(this.wasStartingVideo=!0),this.isSharingVideo?e.videoState="active":this.isSharingScreen&&(e.screencastState="active"),t.addEventListener("ended",(()=>{this.stopVideoSharing()}),{once:!0})}e.getAudioTracks().length&&this.onMutedChange()}onMutedChange(){const e=this.isMuted;this.dispatchEvent("muted",e),this.getMediaState("input").muted=e}toggleMuted(){return this.requestAudioSource(!0).then((()=>{this.setMuted(),this.onMutedChange()}))}hangUp(e,t){return B(this,void 0,void 0,(function*(){if(!this.isClosing&&(this.discardReason=e,this.log("hangUp",e),this.overrideConnectionState(v.Z.CLOSED),this.connectionInstance&&this.connectionInstance.closeConnectionAndStream(!0),e&&!t)){let t=!1;for(const e in this.mediaStates){const i=this.mediaStates[e];t="active"===i.videoState||"active"===i.screencastState||t}yield this.managers.appCallsManager.discardCall(this.id,this.duration,e,t)}}))}performCodec(e){const t=e.payloadTypes.map((e=>Object.assign(Object.assign({},e),{"rtcp-fbs":e.feedbackTypes})));return{"rtp-hdrexts":e.rtpExtensions,"payload-types":t}}setDataToDescription(e){this.description.setData({transport:{pwd:e.pwd,ufrag:e.ufrag,fingerprints:e.fingerprints,"rtcp-mux":!0},audio:this.performCodec(e.audio),video:e.video?this.performCodec(e.video):void 0,screencast:e.screencast?this.performCodec(e.screencast):void 0})}filterNotVP8(e){this.isOutgoing||[e.video,e.screencast].filter(Boolean).forEach((e=>{const t=e.payloadTypes,i=t.findIndex((e=>"VP8"===e.name)),s=t[i],n=t.findIndex((e=>{var t;return+(null===(t=e.parameters)||void 0===t?void 0:t.apt)===s.id}));e.payloadTypes=[t[i],t[n]]}))}applyCallSignalingData(e){return B(this,void 0,void 0,(function*(){this.log("applyCallSignalingData",this,e);const{connection:t,description:i}=this.connectionInstance;switch(e["@type"]){case"InitialSetup":{this.log("[sdp] InitialSetup",e),this.filterNotVP8(e),this.setDataToDescription(e);const s=e=>e.map((e=>({_:"groupCallParticipantVideoSourceGroup",semantics:e.semantics,sources:e.ssrcs.map((e=>+e))})));[(0,w.z_)("audio",+e.audio.ssrc),e.video?(0,w.z_)("video",s(e.video.ssrcGroups)):void 0,e.screencast?(0,w.z_)("screencast",s(e.screencast.ssrcGroups)):void 0].filter(Boolean).forEach((e=>{let t=i.getEntryBySource(e.source);if(t)return;const s=i.findFreeSendRecvEntry(e.type,!1);t=new w.Lp(s.mid,e.type),t.setDirection("sendrecv"),s.recvEntry=t,i.setEntrySource(t,e.sourceGroups||e.source)})),this.createDataChannelEntry();const n=this.offerSent;this.offerSent=!1;const a=i.entries.map((e=>e.mid)),o={type:n?"answer":"offer",sdp:i.generateSdp({bundle:a,entries:i.entries.filter((e=>a.includes(e.mid))),isAnswer:!n})};this.log("[sdp] remote",o.sdp),yield t.setRemoteDescription(o),yield this.tryToReleaseCandidates(),n||(yield this.doTheMagic());break}case"Candidates":for(const t of e.candidates){const e=D.generateCandidate(t);e.sdpMLineIndex=0;const i=new RTCIceCandidate(e);this.candidates.push(i)}yield this.tryToReleaseCandidates();break;default:this.log.error("unrecognized signaling data",e)}}))}tryToReleaseCandidates(){return B(this,void 0,void 0,(function*(){const{connectionInstance:e}=this;if(!e)return;const{connection:t}=e;if(t.remoteDescription){const e=this.candidates.map((e=>this.addIceCandidate(t,e)));this.candidates.length=0,yield Promise.all(e)}else this.log("[candidates] postpone")}))}addIceCandidate(e,t){return B(this,void 0,void 0,(function*(){this.log("[candidate] start",t);try{yield e.addIceCandidate(t),this.log("[candidate] add",t)}catch(e){this.log.error("[candidate] error",t,e)}}))}processDecryptQueue(){return B(this,void 0,void 0,(function*(){const{encryptor:e}=this;if(!e)return void this.log.warn("got encrypted signaling data before the encryption key");if(!this.decryptQueue.length)return;const t=this.decryptQueue.slice();this.decryptQueue.length=0;for(const i of t){const t=yield e.decryptRawPacket(i);if(!t)continue;const s=(new TextDecoder).decode(t);try{const e=JSON.parse(s);this.log("[update] updateNewCallSignalingData",e),this.applyCallSignalingData(e)}catch(e){this.log.error("wrong signaling data",s),this.hangUp("phoneCallDiscardReasonDisconnect"),g.Z.dispatchEvent("incompatible",this.interlocutorUserId)}}}))}onUpdatePhoneCallSignalingData(e){this.decryptQueue.push(e),this.processDecryptQueue()}}},8500:(e,t,i)=>{"use strict";i.d(t,{Z:()=>p});var s=i(3241),n=i(319),a=i(9125),o=i(9337),r=i(382),d=i(5424);function l(){const e={main:{},screen:{}};return t=>{return i=this,s=void 0,a=function*(){const{isScreen:i,constraints:s}=t,n=e[i?"screen":"main"];let a=n[s.audio?"audio":"video"];a||(a=(i?r.Z:d.Z)(s,t.muted),s.audio&&!n.audio&&(n.audio=a.finally((()=>n.audio=void 0))),s.video&&!n.video&&(n.video=a.finally((()=>n.video=void 0))));try{return yield a}catch(e){throw e}},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}window.getStreamCached=l;var c=i(312),h=i(49),u=i(9585);class p extends s.Z{constructor(){super(!1);const e=this.player=document.createElement("div");e.classList.add("call-player"),e.style.display="none",document.body.append(e),this.elements=new Map;const t=this.audio=new Audio;t.autoplay=!0,t.volume=1,this.player.append(t),this.elements.set("audio",t),this.fixSafariAudio(),this.getStream=l()}get isSharingAudio(){return!!this.streamManager.hasInputTrackKind("audio")}get isSharingVideo(){return!!this.streamManager.hasInputTrackKind("video")}fixSafariAudio(){this.audio.play().catch(n.Z)}requestAudioSource(e){return this.requestInputSource(!0,!1,e)}requestInputSource(e,t,i){const{streamManager:s}=this;if(s){const i=!e||this.isSharingAudio,s=!t||this.isSharingVideo;if(i&&s)return Promise.resolve()}const n={audio:e&&(0,a.Z)(),video:t&&(0,c.Z)()};return this.getStream({constraints:n,muted:i}).then((e=>{this.onInputStream(e)}))}requestScreen(){return this.getStream({isScreen:!0,constraints:(0,o.Z)(!0)}).then((e=>{this.onInputStream(e)}))}getElement(e){return this.elements.get(""+e)}cleanup(){this.player.textContent="",this.player.remove(),this.elements.clear(),this.streamManager.stop(),super.cleanup()}onTrack(e){this.tryAddTrack({stream:e.streams[0],track:e.track,type:"output"})}saveInputVideoStream(e,t){const i=e.getVideoTracks()[0];this.tryAddTrack({stream:e,track:i,type:"input",source:t||"main"})}tryAddTrack({stream:e,track:t,type:i,source:s}){s||(s=u.Z.getSource(e,i)),this.log("tryAddTrack",e,t,i,s);const a="output"===i,{player:o,elements:r,streamManager:d}=this,l=t.kind,c="video"===l,h=c?s:l;let p=r.get(h);c&&t.addEventListener("ended",(()=>{this.log("[track] onended"),r.delete(h)}),{once:!0}),a&&d.addTrack(e,t,i);const f=c?e:d.outputStream;if(p)p.paused&&p.play().catch(n.Z),p.srcObject=f;else{if(p=document.createElement(l),p.autoplay=!0,p.srcObject=f,p.volume=1,"undefined"!==p.sinkId){const{outputDeviceId:e}=this;e&&p.setSinkId(e)}c?(p.setAttribute("playsinline","true"),p.muted=!0):o.appendChild(p),r.set(h,p)}return s}setMuted(e){this.streamManager.inputStream.getAudioTracks().forEach((t=>{"audio"===(null==t?void 0:t.kind)&&(t.enabled=void 0===e?!t.enabled:!e)}))}onInputStream(e){if(this.isClosing)e.getTracks().forEach((e=>{(0,h.Z)(e)}));else{e.getVideoTracks().length&&this.saveInputVideoStream(e,"main");const{streamManager:t,description:i}=this;t.addStream(e,"input"),i&&t.appendToConference(i)}}}},3335:(e,t,i)=>{"use strict";var s;i.d(t,{Z:()=>n}),function(e){e[e.CONNECTED=0]="CONNECTED",e[e.CONNECTING=1]="CONNECTING",e[e.EXCHANGING_KEYS=2]="EXCHANGING_KEYS",e[e.PENDING=3]="PENDING",e[e.REQUESTING=4]="REQUESTING",e[e.CLOSING=5]="CLOSING",e[e.CLOSED=6]="CLOSED"}(s||(s={}));const n=s},2493:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C});var s=i(5916);let n;var a=i(410),o=i(993),r=i(1655),d=i(6519),l=i(9895),c=i(3241),h=i(7298),u=i(5003),p=i(3855),f=i(1507),m=i(3512),g=i(2069),v=i(3335),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const y=45e3;class w extends c.Z{construct(e){this.managers=e,this.log=(0,u.kg)("CC"),o.Z&&(this.audioAsset=null!=n?n:n=new s.Z(["call_busy.mp3","call_connect.mp3","call_end.mp3","call_incoming.mp3","call_outgoing.mp3","voip_failed.mp3"]),this.tempId=0,this.instances=new Map,this.sortedInstances=[],m.Z.addEventListener("call_update",(e=>b(this,void 0,void 0,(function*(){var t;let i=this.instances.get(e.id);switch(i&&i.setPhoneCall(e),e._){case"phoneCallDiscarded":i&&i.hangUp(null===(t=e.reason)||void 0===t?void 0:t._,!0);break;case"phoneCallAccepted":i&&i.confirmCall();break;case"phoneCallRequested":i||(i=this.createCallInstance({isOutgoing:!1,interlocutorUserId:e.admin_id}),i.overrideConnectionState(v.Z.PENDING),i.setPhoneCall(e),i.setHangUpTimeout(y,"phoneCallDiscardReasonMissed"));break;case"phoneCall":{if(!i||i.encryptionKey)break;const t=i.dh.g_a=e.g_a_or_b,s=i.dh,n=yield p.Z.invokeCrypto("sha256",t);if(!(0,l.Z)(s.g_a_hash,n)){this.log.error("Incorrect g_a_hash",s.g_a_hash,n);break}const{key:a,key_fingerprint:o}=yield this.managers.appCallsManager.computeKey(t,s.b,s.p);if(e.key_fingerprint!==o){this.log.error("Incorrect key fingerprint",e.key_fingerprint,o,t,s),i.hangUp("phoneCallDiscardReasonDisconnect");break}i.encryptionKey=a,i.joinCall();break}}})))),m.Z.addEventListener("call_signaling",(({callId:e,data:t})=>{const i=this.instances.get(e);(null==i?void 0:i.id)===e&&i.onUpdatePhoneCallSignalingData(t)})))}get currentCall(){return this.sortedInstances[0]}getCallByUserId(e){for(const[t,i]of this.instances)if(i.interlocutorUserId===e)return i}createCallInstance(e){const t=new g.Z(Object.assign({managers:this.managers},e));return t.addEventListener("state",(e=>{const i=this.currentCall;e===v.Z.CLOSED?(this.instances.delete(t.id),(0,r.Z)(this.sortedInstances,t)):(0,d.Z)(this.sortedInstances,t,"sortIndex"),e===v.Z.EXCHANGING_KEYS&&(t.wasTryingToJoin=!0);const s=void 0!==t.connectedAt;e===v.Z.EXCHANGING_KEYS||e===v.Z.CONNECTING&&s?t.setHangUpTimeout(y,"phoneCallDiscardReasonDisconnect"):t.clearHangUpTimeout(),i!==t&&i||(e===v.Z.CLOSED?t.isOutgoing||t.wasTryingToJoin?t.wasTryingToJoin&&!s?this.audioAsset.playSound("voip_failed.mp3"):this.audioAsset.playSound("phoneCallDiscardReasonBusy"===t.discardReason?"call_busy.mp3":"call_end.mp3"):this.audioAsset.stopSound():e===v.Z.PENDING?this.audioAsset.playSound(t.isOutgoing?"call_outgoing.mp3":"call_incoming.mp3",!0):e===v.Z.EXCHANGING_KEYS?this.audioAsset.playSoundIfDifferent("call_connect.mp3"):e===v.Z.CONNECTING?t.duration&&this.audioAsset.playSound("voip_connecting.mp3",!0):this.audioAsset.stopSound())})),t.addEventListener("id",((e,i)=>{void 0!==i&&this.instances.delete(i);const s=!!this.currentCall;this.instances.set(e,t),void 0===i&&this.dispatchEvent("instance",{instance:t,hasCurrent:s})})),t}startCallInternal(e,t){return b(this,void 0,void 0,(function*(){this.log("p2pStartCallInternal",e,t);const i=yield this.managers.appProfileManager.getProfile(e);if(!i)return;const{video_calls_available:s}=i.pFlags,n=this.createCallInstance({isOutgoing:!0,interlocutorUserId:e});n.requestInputSource(!0,!(!t||!s),!1),n.overrideConnectionState(v.Z.REQUESTING),n.setPhoneCall({_:"phoneCallWaiting",access_hash:"",admin_id:f.NM,date:(0,h.Z)(!0),id:--this.tempId,participant_id:e,protocol:n.protocol,pFlags:{video:t||void 0}}),this.managers.appCallsManager.generateDh().then((i=>b(this,void 0,void 0,(function*(){return n.dh=i,this.managers.appCallsManager.requestCall(e,n.protocol,n.dh.g_a_hash,t&&s)})))).then((e=>{n.overrideConnectionState(v.Z.PENDING),n.setPhoneCall(e),n.setHangUpTimeout(y,"phoneCallDiscardReasonHangup")}))}))}}const S=new w;a.GO&&(a.GO.callsController=S);const C=S},1677:(e,t,i)=>{"use strict";i.d(t,{KM:()=>s,iK:()=>n});const s=50,n=100},9078:(e,t,i)=>{"use strict";i.d(t,{Z:()=>k});var s=i(4762),n=i(1655),a=i(5953),o=i(6724),r=i(5003),d=i(1507),l=i(3512),c=i(8500),h=i(7625),u=i(3075),p=i(8479),f=i(6752),m=i(9124),g=i(4373),v=i(3773),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class y extends u.Z{constructor(e){super(e),this.negotiateThrottled=(0,o.Z)(this.negotiate.bind(this),0,!1)}createPeerConnection(){return this.connection||super.createPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",iceCandidatePoolSize:0})}createDataChannel(){if(this.dataChannel)return this.dataChannel;const e=super.createDataChannel();return e.addEventListener("open",(()=>{this.maybeUpdateRemoteVideoConstraints()})),e.addEventListener("close",(()=>{this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)})),e}createDescription(){return this.description?this.description:super.createDescription()}appendStreamToConference(){super.appendStreamToConference()}invokeJoinGroupCall(e,t,i){return b(this,void 0,void 0,(function*(){const{groupCall:s,description:n}=this,a=s.id,o=t.map((t=>{const i=function(e,t){const i=(0,v.Z)(e,t),s=t.mediaType,n={source:i.source,sourceGroups:i.sourceGroups,type:s};i.fingerprint.setup="active";const a={fingerprints:[i.fingerprint],pwd:i.pwd,ssrc:i.source,"ssrc-groups":i.sourceGroups||[],ufrag:i.ufrag};return{params:{_:"dataJSON",data:JSON.stringify(a)},source:i.source,media:t,sourceGroups:i.sourceGroups,entry:n}}(e,t);return this.sources[i.entry.type]=i.entry,i})),r=o.find((e=>"audio"===e.media.mediaType)),d=o.find((e=>"video"===e.media.mediaType));let{source:c,params:u}=r||{};const p=d||r,f={audio:r,video:d};if(n.entries.forEach((e=>{if("sendonly"===e.direction){const t=f[e.type];if(!t)return;n.setEntrySource(e,t.sourceGroups||t.source),n.setEntryPeerId(e,l.Z.myId)}})),u!==p.params){const e=JSON.parse(p.params.data);c?e.ssrc=c:delete e.ssrc,u={_:"dataJSON",data:JSON.stringify(e)}}const m=yield this.managers.appGroupCallsManager.joinGroupCall(a,u,i),g=JSON.parse(m.params.data);return g.audio=g.audio||s.connections.main.description.audio,n.setData(g),function(e,t){["audio","video"].filter((e=>t[e])).map((e=>[t[e],e])).forEach((([t,i])=>{const s=e.find((e=>e.mediaType===i));if(!s)return;const n=(e=>{const t={};return e.attributes.get("extmap").forEach((e=>{const i=e.key.split("/",1)[0];t[i]=e.value})),t})(s);(0,h.Z)(t["rtp-hdrexts"],((e,t,s)=>{n[e.id]!==e.uri&&(s.splice(t,1),console.log("[sdp] filtered extmap:",e,t,i))}))}))}(t,g),g}))}negotiateInternal(){return b(this,void 0,void 0,(function*(){const{connection:e,description:t}=this,i="new"===e.iceConnectionState&&!t.getEntryByMid("0").source,s=this.log.bindPrefix("startNegotiation");s("start");const n=yield e.createOffer({iceRestart:!1});i&&this.dataChannel&&t.createEntry("application").setDirection("sendrecv");const{sdp:a,offer:o}=function(e){const{offer:t,data:i}=e,s=(0,m.DV)(t.sdp);let n=!1;if(e.skipAddingMulticast||(n=(0,m.e6)(s)||n),(0,h.Z)(s.media,((e,t,a)=>{if(e.isSending)return;if("application"===e.mediaType)return;const o=e.mediaLine,r=o.mediaLineParts,d=(r.ids,o.toString()),l=i[e.mediaType]["payload-types"].map((e=>""+e.id));if(d!==(0,g.Px)(e.mediaType,void 0,l)){const o=(0,v.Z)(s,e),d=Object.assign({},i);d.transport=(0,p.Z)(d.transport),d.transport.ufrag=o.ufrag,d.transport.pwd=o.pwd,d.transport.fingerprints=[o.fingerprint],d.transport.candidates=[];const l=new f.Lp(o.mid,r.type);l.setPort(r.port),o.source&&l.setSource(o.sourceGroups||o.source),l.setDirection(e.direction);const c=(new g.DY).addSsrcEntry(l,d).finalize(),h=(0,m.DV)(c).media[0];a[t]=h,n=!0}})),n){const e=s.toString();t.sdp=e}return{offer:t,sdp:s}}({offer:n,data:t});s("[sdp] setLocalDescription",o.sdp),yield e.setLocalDescription(o);const r=a.media.filter((e=>"application"!==e.mediaType&&e.isSending));if(i)try{yield this.invokeJoinGroupCall(a,r,this.options)}catch(e){this.log.error("[tdweb] joinGroupCall error",e)}const d=[],l=a.bundle;(0,h.Z)(l,((e,i,s)=>{const n=t.getEntryByMid(e);n.shouldBeSkipped(!0)&&(s.splice(i,1),d.push(n))}));const c=a.media.map((e=>{const i=e.mid;let s=t.getEntryByMid(i);return s||(s=new f.Lp(i,e.mediaType),s.setDirection("inactive")),s})),u={type:"answer",sdp:t.generateSdp({bundle:l,entries:c,isAnswer:!0})};d.forEach((e=>{t.deleteEntry(e)})),s(`[sdp] setRemoteDescription signaling=${e.signalingState} ice=${e.iceConnectionState} gathering=${e.iceGatheringState} connection=${e.connectionState}`,u.sdp),yield e.setRemoteDescription(u),s("end")}))}negotiate(){let e=this.negotiating;return e||(e=super.negotiate(),this.updateConstraints&&e.then((()=>{this.maybeUpdateRemoteVideoConstraints(),this.updateConstraints=!1})),"presentation"===this.options.type&&e.then((()=>{this.connection.getTransceivers().find((e=>{var t,i;"video"===(null===(i=null===(t=e.sender)||void 0===t?void 0:t.track)||void 0===i?void 0:i.kind)&&e.sender.setParameters(Object.assign(Object.assign({},e.sender.getParameters()),{degradationPreference:"maintain-resolution"}))}))})),e)}maybeUpdateRemoteVideoConstraints(){if("open"!==this.dataChannel.readyState)return;this.log("maybeUpdateRemoteVideoConstraints");const e={colibriClass:"ReceiverVideoConstraints",constraints:{},defaultConstraints:{maxHeight:0},onStageEndpoints:[]};for(const t of this.description.entries){if("recvonly"!==t.direction||"video"!==t.type)continue;const{endpoint:i}=t;e.onStageEndpoints.push(i),e.constraints[i]={minHeight:180,maxHeight:720}}this.sendDataChannelData(e),e.onStageEndpoints.length?this.updateConstraintsInterval||(this.updateConstraintsInterval=window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this),5e3)):this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)}addInputVideoStream(e){this.groupCall.saveInputVideoStream(e,this.type),this.streamManager.addStream(e,"input"),this.appendStreamToConference()}}var w=i(2207),S=i(9337),C=i(382),L=i(5424),E=i(312),I=i(49),M=i(9585),P=i(2946),Z=i(2059),T=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class k extends c.Z{constructor(e){super(),(0,a.Z)(this,e),this.log||(this.log=(0,r.kg)("GROUP-CALL")),this.connections||(this.connections={}),this.isSpeakingMap||(this.isSpeakingMap=new Map),this.pinnedSources=[],this.participantsSsrcs=new Map,this.hadAutoPinnedSources=new Set,this.dispatchPinnedThrottled=(0,o.Z)((()=>{this.dispatchEvent("pinned",this.pinnedSource)}),0,!1),this.addEventListener("state",(e=>{e===w.Z.CLOSED&&this.cleanup()}))}get connectionState(){return this.connections.main.connection.iceConnectionState}get state(){const{connectionState:e}=this;if("closed"===e)return w.Z.CLOSED;if("connected"===e||s.IS_SAFARI&&"completed"===e){const{participant:e}=this;return e.pFlags.can_self_unmute?e.pFlags.muted?w.Z.MUTED:w.Z.UNMUTED:w.Z.MUTED_BY_ADMIN}return w.Z.CONNECTING}get participants(){return this.managers.appGroupCallsManager.getCachedParticipants(this.id)}get isSharingScreen(){return!!this.connections.presentation}get pinnedSource(){return this.pinnedSources[this.pinnedSources.length-1]}get isMuted(){return this.state!==w.Z.UNMUTED}get isClosing(){const{state:e}=this;return e===w.Z.CLOSED}get streamManager(){return this.connections.main.streamManager}get description(){return this.connections.main.description}pinSource(e){(0,n.Z)(this.pinnedSources,e),this.pinnedSources.push(e),this.dispatchPinnedThrottled()}unpinSource(e){this.hadAutoPinnedSources.delete(e),(0,n.Z)(this.pinnedSources,e),this.dispatchPinnedThrottled()}unpinAll(){this.pinnedSources.length=0,this.dispatchPinnedThrottled()}getParticipantByPeerId(e){return T(this,void 0,void 0,(function*(){return d.NM===e?this.participant:(yield this.participants).get(e)}))}toggleMuted(){return this.requestAudioSource(!0).then((()=>this.changeUserMuted(d.NM)))}changeUserMuted(e,t){return T(this,void 0,void 0,(function*(){const i=yield this.getParticipantByPeerId(e);return d.NM===e&&i.pFlags.can_self_unmute&&(t=void 0===t?!i.pFlags.muted:t),this.editParticipant(i,{muted:t})}))}getElement(e){return super.getElement(e)}getVideoElementFromParticipantByType(e,t){let i;i=e.pFlags.self?"video"===t?"main":"presentation":e[t].source_groups[0].sources[0];const s=this.getElement(i);if(!s)return;const n=s.cloneNode();return n.srcObject=s.srcObject,{video:n,source:i}}createConnectionInstance(e){return this.connections[e.type]=new y(Object.assign({groupCall:this,log:this.log.bindPrefix(e.type),managers:this.managers},e))}changeRaiseHand(e){return this.editParticipant(this.participant,{raiseHand:e})}startScreenSharingInternal(){return T(this,void 0,void 0,(function*(){try{const e="presentation",t=yield(0,C.Z)((0,S.Z)()),i=new M.Z,s=this.createConnectionInstance({streamManager:i,type:e,options:{type:e}});s.createPeerConnection().addEventListener("negotiationneeded",(()=>{s.negotiate()})),t.getVideoTracks()[0].addEventListener("ended",(()=>{this.connections.presentation&&this.stopScreenSharing()}),{once:!0}),s.createDescription(),s.addInputVideoStream(t)}catch(e){this.log.error("start screen sharing error",e)}}))}startScreenSharing(){var e;return null!==(e=this.startScreenSharingPromise)&&void 0!==e?e:this.startScreenSharingPromise=this.startScreenSharingInternal().finally((()=>{this.startScreenSharingPromise=void 0}))}stopScreenSharing(){const e=this.connections.presentation;return e?(delete this.connections.presentation,this.unpinSource("presentation"),e.closeConnectionAndStream(!0),delete this.participant.presentation,this.managers.appGroupCallsManager.saveApiParticipant(this.id,this.participant),this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id)):Promise.resolve()}toggleScreenSharing(){return this.isSharingScreen?this.stopScreenSharing():this.startScreenSharing()}startVideoSharingInternal(){return T(this,void 0,void 0,(function*(){const e={video:(0,E.Z)()};try{const t=yield(0,L.Z)(e,!1);this.connections.main.addInputVideoStream(t),yield this.editParticipant(this.participant,{videoPaused:!1,videoStopped:!1})}catch(t){this.log.error("startVideoSharing error",t,e)}}))}startVideoSharing(){var e;return null!==(e=this.startVideoSharingPromise)&&void 0!==e?e:this.startVideoSharingPromise=this.startVideoSharingInternal().finally((()=>{this.startVideoSharingPromise=void 0}))}stopVideoSharing(){return T(this,void 0,void 0,(function*(){const e=this.connections.main,t=e.streamManager.inputStream.getVideoTracks()[0];t&&((0,I.Z)(t),e.streamManager.appendToConference(e.description),yield this.editParticipant(this.participant,{videoStopped:!0}))}))}toggleVideoSharing(){return this.isSharingVideo?this.stopVideoSharing():this.startVideoSharing()}hangUp(e=!1,t=!1,i=!1){return T(this,void 0,void 0,(function*(){for(const e in this.connections)this.connections[e].closeConnectionAndStream(!t);if(this.dispatchEvent("state",this.state),!i&&!t){const t=e||(this.joined?this.connections.main.sources.audio.source:void 0);this.managers.appGroupCallsManager.hangUp(this.id,t)}}))}tryAddTrack(e){const{description:t}=this,i=super.tryAddTrack(e);if("output"===e.type){const e=t.getEntryBySource(+i);this.getParticipantByPeerId(e.peerId).then((e=>{e&&l.Z.dispatchEvent("group_call_participant",{groupCallId:this.id,participant:e})}))}return i}editParticipant(e,t){return T(this,void 0,void 0,(function*(){if(Object.keys(t).length){if(e){const i=e.pFlags.self;if(i&&void 0!==t.muted&&!this.isSharingAudio&&(delete t.muted,!Object.keys(t).length))return;const s=t.muted;void 0!==s&&e.pFlags.self&&(s?e.pFlags.muted=!0:e.pFlags.can_self_unmute&&delete e.pFlags.muted),void 0!==t.raiseHand&&(t.raiseHand?e.raise_hand_rating="1":delete e.raise_hand_rating),i&&(void 0!==t.videoStopped&&(t.videoStopped?delete e.video:e.video=(0,Z.KR)(this.connections.main.sources.video)),!e.pFlags.muted&&e.pFlags.can_self_unmute&&this.setMuted(!1),this.dispatchEvent("state",this.state))}return this.managers.appGroupCallsManager.editParticipant(this.id,e,t)}}))}onParticipantUpdate(e,t){const i=this.connections.main,{connection:s,description:n}=i,a=(0,P.Z)(e.peer),o=!!e.pFlags.left,r=this.participantsSsrcs.get(a)||[];if(e.presentation&&!o){const{source:t}=(0,Z._f)(e,"video",e.presentation.source_groups,e.presentation.endpoint);this.hadAutoPinnedSources.has(t)||(this.hadAutoPinnedSources.add(t),this.pinSource(e.pFlags.self?"presentation":t))}if(e.pFlags.self){this.participant=e,i.sources.audio.source!==e.source&&this.hangUp();let s=!1;return e.pFlags.can_self_unmute?e.pFlags.muted&&(s=!0):(this.stopScreenSharing(),this.stopVideoSharing(),s=!0),s&&this.setMuted(!0),void(t!==a&&this.dispatchEvent("state",this.state))}const d=o?[]:(0,Z.s$)(e);o?this.participantsSsrcs.delete(a):this.participantsSsrcs.set(a,d);const l=new Set;r.forEach((e=>{const t=e.source;if(!d.find((e=>e.source===t))){this.unpinSource(t);const e=n.getEntryBySource(t);e&&"inactive"!==e.direction&&(e.setDirection("inactive"),l.add(e.type))}})),d.forEach((e=>{let t=n.getEntryBySource(e.source);t?"inactive"===t.direction&&(t.setDirection(t.originalDirection),l.add(t.type)):(t=n.createEntry(e.type),n.setEntrySource(t,e.sourceGroups||e.source),n.setEntryPeerId(t,a),"video"===e.type&&t.setEndpoint(e.endpoint),t.createTransceiver(s,{direction:"recvonly"}),l.add(t.type))})),l.size&&(l.has("video")&&(i.updateConstraints=!0),i.negotiateThrottled())}}},2207:(e,t,i)=>{"use strict";var s;i.d(t,{Z:()=>n}),function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_BY_ADMIN=2]="MUTED_BY_ADMIN",e[e.CONNECTING=3]="CONNECTING",e[e.CLOSED=4]="CLOSED"}(s||(s={}));const n=s},2059:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>L,KR:()=>w,_f:()=>y,s$:()=>b});var s=i(5916);let n;var a=i(410),o=i(3241),r=i(5003),d=i(3512),l=i(9078),c=i(2207),h=i(1677),u=i(9585),p=i(9125),f=i(5424),m=i(312),g=i(6752),v=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function b(e){var t,i;return[y(0,"audio",e.source),(null===(t=e.video)||void 0===t?void 0:t.audio_source)&&y(0,"audio",e.video.audio_source),e.video&&y(0,"video",e.video.source_groups,e.video.endpoint),(null===(i=e.presentation)||void 0===i?void 0:i.audio_source)&&y(0,"audio",e.presentation.audio_source),e.presentation&&y(0,"video",e.presentation.source_groups,e.presentation.endpoint)].filter(Boolean)}function y(e,t,i,s){return(0,g.z_)(t,i,s)}function w(e,t){return e&&{_:"groupCallParticipantVideo",pFlags:{},endpoint:"",source_groups:e.sourceGroups,audio_source:t}}class S extends o.Z{construct(e){this.managers=e,this.audioAsset=null!=n?n:n=new s.Z(["group_call_connect.mp3","group_call_end.mp3","group_call_start.mp3","voip_onallowtalk.mp3"]),this.log=(0,r.kg)("GCC"),d.Z.addEventListener("group_call_update",(e=>{const{currentGroupCall:t}=this;(null==t?void 0:t.id)===e.id&&(t.groupCall=e,"groupCallDiscarded"===e._&&t.hangUp(!1,!1,!0))})),d.Z.addEventListener("group_call_participant",(({groupCallId:e,participant:t})=>{const{currentGroupCall:i}=this;(null==i?void 0:i.id)===e&&i.onParticipantUpdate(t)}))}get groupCall(){return this.currentGroupCall}setCurrentGroupCall(e){this.currentGroupCall=e,e&&this.dispatchEvent("instance",e)}startConnectingSound(){this.stopConnectingSound(),this.audioAsset.playSoundWithTimeout("group_call_connect.mp3",!0,2500)}stopConnectingSound(){this.audioAsset.stopSound(),this.audioAsset.cancelDelayedPlay()}joinGroupCall(e,t,i=!0,s,n){return v(this,void 0,void 0,(function*(){let a;return this.audioAsset.createAudio(),this.log(`joinGroupCall chatId=${e} id=${t} muted=${i} rejoin=${s}`),a=s?this.currentGroupCall.connections.main.streamManager:yield function(e,t){return i=this,s=void 0,a=function*(){const i={audio:(0,p.Z)(),video:t&&(0,m.Z)()},s=new u.Z(h.iK);try{const t=yield(0,f.Z)(i,e);s.addStream(t,"input")}catch(e){console.error("joinGroupCall getStream error",e,i),s.inputStream=new MediaStream}return s},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}(i,n),this.joinGroupCallInternal(e,t,a,i,s,n).then((()=>{const{currentGroupCall:e}=this;e.participants.then((t=>{this.currentGroupCall===e&&e.state!==c.Z.CLOSED&&t.forEach((t=>{t.pFlags.self||e.onParticipantUpdate(t)}))}))}))}))}joinGroupCallInternal(e,t,i,s,n=!1,a){return v(this,void 0,void 0,(function*(){const o=this.log.bindPrefix("joinGroupCallInternal");o("start",t);const r="main";let{currentGroupCall:h}=this;if(!h||!n){h=new l.Z({chatId:e,id:t,managers:this.managers}),h.fixSafariAudio(),h.addEventListener("state",(e=>{this.currentGroupCall===h&&e===c.Z.CLOSED&&(this.setCurrentGroupCall(null),this.stopConnectingSound(),this.audioAsset.playSound("group_call_end.mp3"),d.Z.dispatchEvent("chat_update",h.chatId))})),h.groupCall=yield this.managers.appGroupCallsManager.getGroupCallFull(t);const u=h.createConnectionInstance({streamManager:i,type:r,options:{type:r,isMuted:s,joinVideo:a,rejoin:n}}),p=u.createPeerConnection();return p.addEventListener("negotiationneeded",(()=>{u.negotiate()})),p.addEventListener("track",(e=>{o("ontrack",e),h.onTrack(e)})),p.addEventListener("iceconnectionstatechange",(()=>{h.dispatchEvent("state",h.state);const{iceConnectionState:e}=p;switch("disconnected"===e||"checking"===e||"new"===e?this.startConnectingSound():this.stopConnectingSound(),e){case"checking":case"completed":case"disconnected":case"new":break;case"closed":case"failed":h.hangUp();break;case"connected":h.joined||(h.joined=!0,this.audioAsset.playSound("group_call_start.mp3"),this.managers.appGroupCallsManager.getGroupCallParticipants(t))}})),u.createDescription(),u.createDataChannel(),u.appendStreamToConference(),this.setCurrentGroupCall(h),o("set currentGroupCall",t,h),this.startConnectingSound(),u.negotiate()}h.handleUpdateGroupCallParticipants=!1,h.updatingSdp=!1,o("update currentGroupCall",t,h)}))}}const C=new S;a.GO&&(a.GO.groupCallController=C);const L=C},9125:(e,t,i)=>{"use strict";function s(){const e={channelCount:2};return["noiseSuppression","echoCancellation","autoGainControl"].forEach((t=>{(function(e){var t;return(!!(null===(t=null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||void 0===t?void 0:t.getSupportedConstraints()))[e]})(t)&&(e[t]=!0)})),e}i.d(t,{Z:()=>s})},9337:(e,t,i)=>{"use strict";function s(e){const t={video:{width:{max:1920},height:{max:1080},frameRate:{max:30}}};return e||(t.audio=!0),t}i.d(t,{Z:()=>s})},382:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});function s(e){return t=this,i=void 0,n=function*(){const t=yield navigator.mediaDevices.getDisplayMedia(e);return t.getVideoTracks()[0].contentHint="text",t},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}},5424:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});function s(e,t){return i=this,s=void 0,a=function*(){const i=yield navigator.mediaDevices.getUserMedia(e);return i.getTracks().forEach((e=>{e.enabled=!t})),i},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}window.getStream=s},312:(e,t,i)=>{"use strict";function s(){return{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}}i.d(t,{Z:()=>s})},3773:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(8957);function n(e,t){const i=t.lookupAttributeKeys({"ice-ufrag":!0,"ice-pwd":!0,fingerprint:!0,setup:!0,ssrc:!0,mid:!0,"ssrc-group":!1});if(!i.fingerprint){const t=e.session.lines.find((e=>{var t;return"fingerprint"===(null===(t=e.parsed)||void 0===t?void 0:t.key)}));i.fingerprint=t.parsed.value}const n=function(e){const t=e.map((e=>{const[t,...i]=e.split(" ");return{_:"groupCallParticipantVideoSourceGroup",semantics:t,sources:i.map((e=>(0,s.Fk)(+e)))}}));return t.length?t:void 0}(i["ssrc-group"]),[a,o]=i.fingerprint.split(" ",2),r=i.ssrc&&(0,s.Fk)(+i.ssrc.split(" ",1)[0]);return{raw:i,ufrag:i["ice-ufrag"],pwd:i["ice-pwd"],fingerprint:{fingerprint:o,setup:i.setup,hash:a},source:r,sourceGroups:n,mid:i.mid}}},49:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(6669);function n(e){e.stop(),(0,s.Z)(e,"ended")}},6752:(e,t,i)=>{"use strict";i.d(t,{Lp:()=>o,ZP:()=>d,z_:()=>r});var s=i(1655),n=i(5953),a=i(4373);class o{constructor(e,t){this.mid=e,this.type=t,this.port=a._D}setDirection(e){return this.originalDirection||(this.originalDirection=e),this.direction=e}setPort(e){return this.port=e}setEndpoint(e){return this.endpoint=e}setPeerId(e){return this.peerId=e}createTransceiver(e,t){return(null==t?void 0:t.direction)&&this.setDirection(t.direction),this.transceiver=e.addTransceiver((0,a.pl)(this.type),t)}setSource(e){let t;if(Array.isArray(e)){if(!e[0])return;t=e,e=t[0].sources[0]}return this.sourceGroups=t,this.source=e}shouldBeSkipped(e){return e&&"inactive"===this.direction}}function r(e,t,i){let s;if(Array.isArray(t)){if(!t[0])return;s=t,t=s[0].sources[0]}return{endpoint:i,type:e,source:t,sourceGroups:s}}class d{constructor(e){this.connection=e,this.sessionId=""+Date.now(),this.maxSeenId=-1,this.entries=[],this.entriesByMid=new Map,this.entriesBySource=new Map,this.entriesByPeerId=new Map}setData(e){return(0,n.Z)(this,e)}createEntry(e){const t=""+ ++this.maxSeenId,i=new o(t,e);return this.entries.push(i),this.entriesByMid.set(t,i),i}deleteEntry(e){(0,s.Z)(this.entries,e),this.entriesByMid.delete(e.mid),this.entriesBySource.delete(e.source);const t=this.entriesByPeerId.get(e.peerId);t&&(t.delete(e),t.size||this.entriesByPeerId.delete(e.peerId))}setEntrySource(e,t){e.setSource(t),this.entriesBySource.set(e.source,e)}setEntryPeerId(e,t){e.setPeerId(t);let i=this.entriesByPeerId.get(t);i||this.entriesByPeerId.set(t,i=new Set),i.add(e)}findEntry(e){return this.entries.find(e)}findFreeSendRecvEntry(e,t){let i=this.entries.find((i=>"sendrecv"===i.direction&&i.type===e&&!(t?i.sendEntry:i.recvEntry)));return i||(i=this.createEntry(e),i.setDirection("sendrecv")),i}getEntryByMid(e){return this.entriesByMid.get(e)}getEntryBySource(e){return this.entriesBySource.get(e)}getEntriesByPeerId(e){return this.entriesByPeerId.get(e)}generateSdp(e){return a.DY.fromConference(Object.assign({conference:this},e))}}},9124:(e,t,i)=>{"use strict";i.d(t,{e6:()=>de,DV:()=>oe});var s,n,a=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},o=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class r{constructor(e,t){s.set(this,void 0),n.set(this,void 0),a(this,s,e,"f"),a(this,n,t,"f")}get session(){return o(this,s,"f")}get media(){return o(this,n,"f")}get bundle(){return this.session.lines.find((e=>{var t;return"group"===(null===(t=e.parsed)||void 0===t?void 0:t.key)})).value.split(" ").slice(1)}toString(){return this.session.lines.concat(...this.media.map((e=>e.lines))).map((e=>e.toString())).join("\r\n")+"\r\n"}}function d(e,t,i){const s=e.split(t),n=[];for(;i>0&&s.length;)n.push(s.shift()),--i;return s.length&&n.push(s.join(t)),n}s=new WeakMap,n=new WeakMap;var l,c,h,u=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},p=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class f{constructor(e,t){l.set(this,void 0),c.set(this,void 0),h.set(this,void 0),u(this,l,new Set,"f"),u(this,c,e,"f"),u(this,h,t,"f")}generate(){const e=p(this,c,"f"),t=p(this,h,"f"),i=p(this,l,"f"),s=t-e+1;let n=Math.floor(e+s*Math.random()),a=0;for(;i.has(n);)if(n=s)return null;return i.add(n),n}add(e){p(this,l,"f").add(e)}}l=new WeakMap,c=new WeakMap,h=new WeakMap;var m,g,v=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},b=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class y{constructor(e,t){m.set(this,void 0),g.set(this,void 0),v(this,m,e,"f"),v(this,g,t,"f")}get key(){return b(this,m,"f")}get value(){return b(this,g,"f")}}m=new WeakMap,g=new WeakMap;var w,S,C,L,E=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},I=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class M{constructor(e,t,i,s){w.set(this,void 0),S.set(this,void 0),C.set(this,void 0),L.set(this,void 0),E(this,w,e,"f"),E(this,S,t,"f"),E(this,C,i,"f"),E(this,L,s,"f")}get type(){return I(this,w,"f")}get port(){return I(this,S,"f")}get protocol(){return I(this,C,"f")}get ids(){return I(this,L,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}w=new WeakMap,S=new WeakMap,C=new WeakMap,L=new WeakMap;var P,Z,T,k,x=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},A=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class _{constructor(e,t){if(P.set(this,void 0),Z.set(this,void 0),T.set(this,void 0),k.set(this,void 0),x(this,P,e,"f"),"string"==typeof t){if(x(this,Z,t,"f"),"m"===e){const e=t.split(" ");x(this,T,new M(e[0],e[1],e[2],e.slice(3)),"f")}else if("a"===e){const e=d(t,":",1);t=e[0],x(this,k,1===e.length?new y(t,null):new y(t,e[1]),"f")}}else t instanceof M?(x(this,T,t,"f"),x(this,Z,t.toString(),"f")):t instanceof y&&(x(this,k,t,"f"),x(this,Z,t.value?`${t.key}:${t.value}`:t.key,"f"))}get key(){return A(this,P,"f")}get value(){return A(this,Z,"f")}get parsed(){return A(this,k,"f")}get mediaLineParts(){return A(this,T,"f")}toString(){return`${this.key}=${this.value}`}}P=new WeakMap,Z=new WeakMap,T=new WeakMap,k=new WeakMap;var F,D,R,B,N,O,U=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},H=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class z{constructor(e,t,i=":",s=!1){F.set(this,void 0),D.set(this,void 0),R.set(this,void 0),B.set(this,void 0),N.set(this,void 0),O.set(this,void 0),U(this,F,e,"f"),U(this,D,t,"f"),U(this,R,i,"f"),U(this,N,s,"f"),U(this,B,s?new Map:null,"f"),U(this,O,s?[]:null,"f")}get lines(){return H(this,D,"f")}get value(){return H(this,N,"f")||!this.lines.length?null:this.lines[0]}get exists(){return!H(this,N,"f")}get key(){return H(this,F,"f")}get keys(){return z.fill(this),H(this,O,"f")}forEach(e){z.fill(this),H(this,B,"f").forEach(e)}get(e){return z.fill(this),H(this,B,"f").get(e)||new z(e,[],":",!0)}static fill(e){if(null!==H(e,B,"f"))return;const t=new Map;e.lines.forEach((i=>{const[s,n]=d(i,H(e,R,"f"),1),a=t.get(s)||[];t.set(s,[...a,n||""])}));const i=U(e,B,z.makeAttributes(t),"f");U(e,O,Array.from(i.keys()),"f")}static makeAttributes(e){const t=new Map;return e.forEach(((e,i)=>{t.set(i,new z(i,e))})),t}}F=new WeakMap,D=new WeakMap,R=new WeakMap,B=new WeakMap,N=new WeakMap,O=new WeakMap;var j,G,V=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},K=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class W{constructor(e){j.set(this,void 0),G.set(this,void 0),V(this,j,e,"f"),V(this,G,new Map,"f"),W.fillAttributes(this)}get(e){return K(this,G,"f").get(e)||new z(e,[]," ",!0)}static fillAttributes(e){const t=new Map;K(e,j,"f").forEach((e=>{if("a"===e.key){const{key:i,value:s}=e.parsed;let n=t.get(i);n||(n=[],t.set(i,n)),n.push(s||"")}})),t.forEach(((t,i)=>{K(e,G,"f").set(i,new z(i,t," ",!1))}))}}j=new WeakMap,G=new WeakMap;var $,q,Q,Y,X=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},J=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class ee{constructor(e){$.set(this,void 0),q.set(this,void 0),Q.set(this,void 0),Y.set(this,void 0),X(this,$,e,"f"),X(this,q,e[0],"f"),X(this,Q,X(this,Y,null,"f"),"f")}get lines(){return J(this,$,"f")}get mediaLine(){return J(this,q,"f")}get mediaLineParts(){return J(this,q,"f").mediaLineParts}get mediaType(){return this.mediaLineParts.type}get direction(){if(!J(this,Y,"f")){const e=this.attributes;let t;t=e.get("sendonly").exists?"sendonly":e.get("recvonly").exists?"recvonly":e.get("inactive").exists?"inactive":"sendrecv",X(this,Y,t,"f")}return J(this,Y,"f")}get isSending(){return"sendrecv"===this.direction||"sendonly"===this.direction}get isReceiving(){return"sendrecv"===this.direction||"recvonly"===this.direction}get attributes(){return J(this,Q,"f")||X(this,Q,new W(this.lines),"f"),J(this,Q,"f")}get mid(){return this.attributes.get("mid").value}lookupAttributeKeys(e){const t={};for(const i in e){const s=this.attributes.get(i),n=!e[i];t[i]=s?n?s.lines:s.value:n?[]:void 0}return t}}$=new WeakMap,q=new WeakMap,Q=new WeakMap,Y=new WeakMap;var te,ie,se=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},ne=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class ae{constructor(e){te.set(this,void 0),ie.set(this,void 0),se(this,te,e,"f"),se(this,ie,e.filter((e=>"o"===e.key)).map((e=>e.value.split(" ")[1]))[0],"f")}get lines(){return ne(this,te,"f")}get sessionId(){return ne(this,ie,"f")}}function oe(e){function t(){i?n.push(new ee(s)):i=new ae(s)}let i=null,s=[];const n=[];return e.split(/\r?\n/).forEach((e=>{if(!function(e){return/^[\s\xa0]*$/.test(e)}(e)){const i=re(e);"m"===i.key&&(t(),s=[]),s.push(i)}})),t(),new r(i,n)}function re(e){const t=d(e,"=",1);return new _(t[0],t[1])}function de(e){let t;return e.media.forEach(((i,s)=>{if("video"===i.mediaType&&i.isSending&&!i.attributes.get("ssrc-group").get("SIM").exists){t||(t=new f(2,4294967295));const n=i.attributes.get("ssrc-group").get("FID").value.split(" "),a=i.lines;n.forEach((e=>t.add(+e)));const o=[n[0],t.generate(),t.generate()],r=[n[1],t.generate(),t.generate()];a.push(re("a=ssrc-group:SIM "+o.join(" ")));const d=i.attributes.get("ssrc").get(n[0]).lines;o.forEach(((e,t)=>{const i=r[t];t>0&&(a.push(re("a=ssrc-group:FID "+e+" "+i)),d.forEach((t=>{a.push(re("a=ssrc:"+e+" "+t))})),d.forEach((e=>{a.push(re("a=ssrc:"+i+" "+e))})))})),e.media[s]=new ee(a)}})),!!t}te=new WeakMap,ie=new WeakMap},4373:(e,t,i)=>{"use strict";i.d(t,{DY:()=>c,Px:()=>l,_D:()=>o,pl:()=>r});var s=i(4762),n=i(630),a=i(8957);const o="9";function r(e){return"screencast"===e?"video":e}function d(e){return"application"===e?"DTLS/SCTP":"UDP/TLS/RTP/SAVPF"}function l(e,t=o,i){const s=d(e);return`m=${r(e)} ${t} ${s} ${i.join(" ")}`}class c extends n.Z{addCandidate(e){return this.add(function(e){const t=[];return t.push("a=candidate:"),t.push(`${e.foundation} ${e.component} ${e.protocol.toUpperCase()} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`),void 0!==e["rel-addr"]&&t.push(` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t.push(` generation ${e.generation}`),t.join("")}(e))}addHeader(e,t){const i=t.join(" ");return this.add("v=0",`o=- ${e} 2 IN IP4 0.0.0.0`,"s=-","t=0 0","a=extmap-allow-mixed",`a=group:BUNDLE ${i}`,"a=ice-options:trickle","a=msid-semantic:WMS *")}addTransport(e,t){this.add(`a=ice-ufrag:${e.ufrag}`,`a=ice-pwd:${e.pwd}`,"a=ice-options:trickle");for(const t of e.fingerprints)this.add(`a=fingerprint:${t.hash} ${t.fingerprint}`,`a=setup:${t.setup}`);if(!t&&e.candidates)for(const t of e.candidates)this.addCandidate(t);return this}addSsrc(e){let t="stream",{type:i,sourceGroups:s}=e;const n=(0,a.h)(e.source);t+=n,i+=n;const o=e=>{this.add(`a=ssrc:${e} cname:${t}`,`a=ssrc:${e} msid:${t} ${i}`,`a=ssrc:${e} mslabel:${t}`,`a=ssrc:${e} label:${i}`)};return(()=>{this.add(`a=msid:${t} ${i}`)})(),(null==s?void 0:s.length)?s.forEach((e=>{if(e.sources.length){const t=e.sources.map(a.h);this.add(`a=ssrc-group:${e.semantics} ${t.join(" ")}`),t.forEach(o)}})):o(n),this}addSsrcEntry(e,t,i){const s=(...e)=>this.add(...e),{type:n,mid:a,direction:o,port:c}=e,h=t.transport,u="application"===n,p=u?void 0:t[n],f="inactive"===o;if(e.shouldBeSkipped(i))return s(`m=${r(n)} 0 ${d(n)} 0`,"c=IN IP4 0.0.0.0","a=inactive",`a=mid:${a}`);const m=u?[{id:5e3}]:p["payload-types"],g=m.map((e=>e.id));s(l(n,c,g),"c=IN IP4 0.0.0.0",`a=rtcp:${c} IN IP4 0.0.0.0`),h["rtcp-mux"]&&s("a=rtcp-mux"),s(`a=mid:${a}`);let v=o;if("sendrecv"===o||!i||f||u||(v="sendonly"===o?"recvonly":"sendonly"),s(`a=${v}`),this.addTransport(h),u)s(`a=sctpmap:${m[0].id} webrtc-datachannel 256`);else{const e=p["rtp-hdrexts"];(null==e?void 0:e.length)&&e.forEach((e=>{s(`a=extmap:${e.id} ${e.uri}`)})),m.forEach((e=>{s(`a=rtpmap:${e.id} ${e.name}/${e.clockrate}${e.channels&&e.channels>1?`/${e.channels}`:""}`);const t=e.parameters;if(Array.isArray(t))t.length&&console.error("parameters is array???",t);else if(t&&Object.keys(t).length){const i=[];for(const e in t)i.push(`${e}=${t[e]}`);s(`a=fmtp:${e.id} ${i.join(";")}`)}const i=e["rtcp-fbs"];(null==i?void 0:i.length)&&i.forEach((t=>{s(`a=rtcp-fb:${e.id} ${t.type}${t.subtype?" "+t.subtype:""}`)}))}))}return!e.source||"sendonly"!==v&&"sendrecv"!==v||this.addSsrc(e),this}addConference(e){const{conference:t,entries:i,bundle:n,isAnswer:a}=e;this.addHeader(t.sessionId,n),s.IS_FIREFOX&&this.addTransport(t.transport);for(const e of i)this.addSsrcEntry((a?e.recvEntry||e.sendEntry:e.sendEntry||e.recvEntry)||e,t,a);return this}static fromConference(e){return(new c).addConference(e).finalize()}}},9585:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3241),n=i(5003),a=i(1677),o=i(49),r=i(4373),d=i(8957);class l{constructor(e,t){const i=this.streamSource=e.createMediaStreamSource(t),s=this.analyser=e.createAnalyser();this.gain=e.createGain(),s.minDecibels=-100,s.maxDecibels=-30,s.smoothingTimeConstant=.05,s.fftSize=1024,i.connect(s)}}class c{constructor(e){this.interval=e,this.getAmplitude=e=>{const{streamAnalyser:t,stream:i,track:s,source:n,type:a}=e,o=t.analyser;if(!o)return;const r=new Uint8Array(o.frequencyBinCount);return o.getByteFrequencyData(r),{type:a,source:n,stream:i,track:s,value:(0,d.UN)(r)}},this.analyse=()=>{const e=this.counter%3==0,t=(e?this.items:this.items.filter((e=>"input"===e.type))).filter((e=>"audio"===e.kind)).slice(0,a.KM).map(this.getAmplitude);++this.counter>=1e3&&(this.counter=0),c.ANALYSER_LISTENER.dispatchEvent("amplitude",{amplitudes:t,type:e?"all":"input"})},this.context=new(window.AudioContext||window.webkitAudioContext),this.items=[],this.outputStream=new MediaStream,this.inputStream=new MediaStream,this.counter=0,this.log=(0,n.kg)("SM"),this.direction="sendonly",this.canCreateConferenceEntry=!0,this.types=["audio","video"]}addStream(e,t){e.getTracks().forEach((i=>{this.addTrack(e,i,t)}))}addTrack(e,t,i){this.log("addTrack",i,t,e);const{context:s,items:n,inputStream:a,outputStream:o}=this,r=t.kind,d=c.getSource(e,i);switch(i){case"input":a?a.addTrack(t):this.inputStream=e;break;case"output":for(let e=0;e{this.removeTrack(t)}),{once:!0}),this.items.push(e)}hasInputTrackKind(e){return this.items.find((t=>"input"===t.type&&t.kind===e))}static getSource(e,t){return"input"===t?e.source||e.id:""+(0,d.Fk)(+e.id.substring(6))}removeTrack(e){this.log("removeTrack",e);const{items:t}=this;let i=!1;for(let s=0,n=t.length;!i&&s[e,n])),o=t.getTracks();for(const[t,n]of a){let a=e.findEntry((e=>e.direction===i&&e.type===t));if(!a){if(!s)continue;a=e.createEntry(t)}let{transceiver:d}=a;d||(d=a.createTransceiver(e.connection,n)),a.direction!==d.direction&&(d.direction=a.direction);const l=(0,r.pl)(t),c=o.findIndex((e=>e.kind===l)),h=-1!==c?o.splice(c,1)[0]:void 0,u=d.sender;u.track!==h&&u.replaceTrack(h).catch((e=>{this.log.error(e)}))}}stop(){try{this.inputStream.getTracks().concat(this.outputStream.getTracks()).forEach((e=>{(0,o.Z)(e)}))}catch(e){this.log.error(e)}}}c.ANALYSER_LISTENER=new s.Z},630:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e="\r\n"){this.joiner=e,this.lines=[],this.newLine=[]}add(...e){return this.lines.push(...e),this}push(e){return this.newLine.push(e),this}addJoined(e=""){return this.add(this.newLine.join(e)),this.newLine=[],this}join(){return this.lines.join(this.joiner)}finalize(){return this.join()+this.joiner}}},8957:(e,t,i)=>{"use strict";function s(e){return e<<0}function n(e){return e>>>0}function a(e,t=3){if(!e)return 0;const{length:i}=e;let s=0;for(let t=0;ts,UN:()=>a,h:()=>n})},3785:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(7197),n=i(1229);const a=new RegExp(`(^${n.Z})`);function o(e,t=!1){const i=(e||"").trim().split(" ");if(!i[0])return{text:"",entities:[]};const n=[],o=i[0].match(a),r=(null==o?void 0:o[0])||i[0][0];o&&n.push((0,s.Z)(r));const d=i.length;if(t||1===d)return{text:r,entities:n};const l=i[d-1].match(a),c=(null==l?void 0:l[0])||i[d-1][0];return l&&n.push(Object.assign(Object.assign({},(0,s.Z)(c)),{offset:r.length})),{text:r+c,entities:n}}},7197:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(671);function n(e){return{_:"messageEntityEmoji",offset:0,length:e.length,unicode:(0,s.w1)(e).join("-").replace(/-?fe0f/g,"")}}},1171:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2423);function n(e){return e?e.match(s.E):null}},2521:(e,t,i)=>{"use strict";function s(e){return e.target="_blank",e.rel="noopener noreferrer",e}i.d(t,{Z:()=>s})},5798:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8115),n=i(3785);function a(e,t){const{text:i,entities:a}=(0,n.Z)(e,t);return(0,s.Z)(i,void 0,a)}},3066:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(5400);function a(e,t={}){if(!e)return(0,n.ZP)("");let i=t.entities;return i&&!s.Z.premium&&t.wrappingForPeerId!==s.Z.myId&&(i=i.filter((e=>"messageEntityCustomEmoji"!==e._))),(0,n.ZP)(e,Object.assign(Object.assign({},t),{entities:i,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}))}},8115:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(6535),n=i(5400);function a(e,t=!1,i){return e?(null!=i||(i=(0,s.Z)(e).filter((e=>"messageEntityEmoji"===e._))),(0,n.ZP)(e,{entities:i,wrappingDraft:t})):(0,n.ZP)("")}},5400:(e,t,i)=>{"use strict";i.d(t,{LD:()=>_,KZ:()=>F,SZ:()=>G,ZP:()=>j,Cx:()=>K,Hc:()=>V});var s=i(2423),n=i(3447),a=i(9976),o=i(8479),r=i(4056),d=i(1379),l=i(6535),c=i(2521),h=i(3591);const u={};a.Z&&(u[""]=!0,[["14","🫱🏻"]].forEach((([e,t])=>{u[e]=function(e){const t=document.createElement("span");t.classList.add("emoji"),document.body.appendChild(t),t.innerText=e;const i=t.offsetWidth;t.innerText="❤️";const s=t.offsetWidth;return document.body.removeChild(t),Math.abs(i-s)<5}(t)})));const p=u;var f=i(2738),m=i(3512),g=i(4755),v=i(3541),b=i(3772),y=i(5814),w=i(2153),S=i(393),C=i(8938),L=i(319),E=i(8497),I=i(4881),M=i(3624),P=i(5565),Z=i(6854),T=i(645),k=i(4497);const x=new ResizeObserver((e=>{for(const t of e)t.target.parentElement.setDimensionsFromRect(t.contentRect)})),A=new w.Z;class _ extends HTMLElement{constructor(){super(),this.paused=!0,this.classList.add("custom-emoji")}get docId(){return this.dataset.docId}static create(e){const t=new _;return t.dataset.docId=""+e,t}get isConnected(){var e,t;return null!==(t=null===(e=this.placeholder)||void 0===e?void 0:e.isConnected)&&void 0!==t?t:super.isConnected}connectedCallback(){this.player&&y.Z.addAnimation(this,this.renderer.animationGroup,void 0,!0)}disconnectedCallback(){var e;!this.isConnected&&(null===(e=this.renderer)||void 0===e?void 0:e.isSelectable)&&this.clear()}destroy(){this.clear()}clear(e=!0){var t;if(this.clean)return;this.clean=!0,this.pause();const{syncedPlayer:i}=this;if(i&&i.pausedElements.delete(this),null===(t=this.middlewareHelper)||void 0===t||t.clean(),this.renderer){const t=this.renderer.customEmojis.get(this.docId);(null==t?void 0:t.delete(this))&&!t.size&&(this.renderer.customEmojis.delete(this.docId),this.renderer.playersSynced.delete(t)),e&&(this.renderer.isSelectable?this.replaceChildren(G(!0)):this.replaceChildren())}this.player&&y.Z.removeAnimationByPlayer(this),A&&A.delete({div:this}),this.elements=this.renderer=this.player=this.syncedPlayer=void 0}pause(){this.paused||(this.paused=!0,this.player instanceof HTMLVideoElement&&!this.syncedPlayer&&(this.renderer.lastPausedVideo=this.player,this.player.pause()),this.syncedPlayer&&!this.syncedPlayer.pausedElements.has(this)&&(this.syncedPlayer.pausedElements.add(this),this.syncedPlayer.player&&this.syncedPlayer.pausedElements.size===this.syncedPlayer.middlewares.size&&this.syncedPlayer.player.pause()))}play(){var e;this.paused&&(this.paused=!1,this.player instanceof HTMLVideoElement&&(this.player.currentTime=(null===(e=this.renderer.lastPausedVideo)||void 0===e?void 0:e.currentTime)||this.player.currentTime,this.player.play().catch(L.Z)),this.syncedPlayer&&this.syncedPlayer.pausedElements.has(this)&&(this.syncedPlayer.pausedElements.delete(this),this.syncedPlayer.pausedElements.size!==this.syncedPlayer.middlewares.size&&this.player.play()))}remove(){this.clear()}get autoplay(){return!0}}class F extends HTMLElement{constructor(){super(),this.classList.add("custom-emoji-renderer"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("custom-emoji-canvas"),this.context=this.canvas.getContext("2d"),this.append(this.canvas),this.playersSynced=new Map,this.clearedElements=new WeakSet,this.customEmojis=new Map,this.animationGroup="EMOJI",this.isCanvasClean=!1}connectedCallback(){B.has(this)||(x.observe(this.canvas),B.add(this),this.connectedCallback=void 0)}disconnectedCallback(){var e;!this.isConnected&&this.auto&&(null===(e=this.destroy)||void 0===e||e.call(this),this.disconnectedCallback=void 0)}destroy(){var e;x.unobserve(this.canvas),this.customEmojis.forEach((e=>{e.forEach((e=>{e.clear()}))})),B.delete(this),this.playersSynced.clear(),null===(e=this.middlewareHelper)||void 0===e||e.clean(),this.customEmojis.clear(),this.destroy=this.lastPausedVideo=void 0}getOffsets(e=new Map){if(!this.playersSynced.size)return e;const t=(0,E.Z)(this,"scrollable")||this.offsetParent;if(!t)return e;const i=t.getBoundingClientRect(),s=this.getBoundingClientRect();for(const n of this.playersSynced.keys()){const a=Array.from(n),o=this.isSelectable?a.map((e=>e.placeholder)):a,{visible:r}=(0,I.Z)({overflowElement:t,overflowRect:i,elements:o,extraSize:2.5*this.size.height}),d=r.map((({rect:e})=>({top:e.top-s.top,left:e.left-s.left,width:e.width})));d.length&&e.set(n,d)}return e}clearCanvas(){if(this.isCanvasClean)return;const{context:e,canvas:t}=this;e.clearRect(0,0,t.width,t.height),this.isCanvasClean=!0}render(e){const{context:t,canvas:i,isDimensionsSet:s}=this;s||this.setDimensionsFromRect(void 0,!1),this.isCanvasClean=!1;const{width:n,height:a,dpr:o}=i;for(const[i,s]of e){const e=this.playersSynced.get(i),a=O.get(e)||(e instanceof HTMLVideoElement?e:void 0);if(!a)continue;const r=a instanceof ImageData;let d,l;e instanceof HTMLVideoElement?(d=this.size.width*o,l=this.size.height*o):(d=a.width,l=a.height);const c=Math.round(s[0].width*o);c!==d&&(d=c,l=c);const h=n-d;this.clearedElements.has(i)||this.isSelectable||(this.isSelectable?i.forEach((e=>{var t;null!==(t=e.lastChildWas)&&void 0!==t||(e.lastChildWas=e.lastChild),(0,P.Z)(e,e.firstChild)})):i.forEach((e=>{e.replaceChildren()})),this.clearedElements.add(i)),s.forEach((({top:e,left:i})=>{e=Math.round(e*o),(i=Math.round(i*o))<0||i>h||(r?t.putImageData(a,i,e):t.drawImage(a,i,e,d,l))}))}}checkForAnyFrame(){for(const e of this.playersSynced.values())if(O.has(e)||e instanceof HTMLVideoElement)return!0;return!1}remove(){super.remove()}setDimensionsFromRect(e=this.lastRect,t=!0){const{canvas:i}=this,{dpr:s}=i;if(this.lastRect!==e&&(this.lastRect=e),!e||!s||this.ignoreSettingDimensions)return;const{width:n,height:a}=e,o=Math.floor(Math.round(n*s)),r=Math.floor(Math.round(a*s));i.width===o&&i.height===r||(i.width=o,i.height=r,this.isDimensionsSet=!0,this.isCanvasClean=!0,(this.forceRenderAfterSize||this.isSelectable&&t)&&(this.forceRenderAfterSize=void 0,this.forceRender()))}forceRender(){this.isDimensionsSet&&(U(new Set([this]))||this.clearCanvas())}add(e,t,i,s){const n=this;if(e.forEach(((t,i)=>{let s=this.customEmojis.get(i);s?this.clearedElements.delete(s):this.customEmojis.set(i,s=new Set);for(const e of t)s.has(e)?t.delete(e):(e.clean=!1,e.renderer=n,e.elements=s,e.middlewareHelper=this.middlewareHelper.get().create(),s.add(e),e.lastChildWas&&!e.lastChildWas.parentNode&&e.append(e.lastChildWas));t.size||e.delete(i)})),!e.size)return;const a=!(t||!1===t||!A),o=Array.from(e.keys()),r=m.Z.managers,d=this.middlewareHelper.get(),l=this.size;return r.appEmojiManager.getCachedCustomEmojiDocuments(o).then((c=>{if(d&&!d())return;const h=[],u=(o,c)=>{const h=o.id,u=e.get(h),p=n.customEmojis.get(h),f=2===o.sticker,m="video/webm"===o.mime_type&&!S.Z,g=(f||3===o.sticker&&this.isSelectable)&&!i&&!m,w=[],E=Array.from(u),I=(0,v.ZP)({div:E,doc:o,width:l.width,height:l.height,loop:!0,play:D,managers:r,isCustomEmoji:!0,group:"none",loadPromises:w,middleware:d,exportLoad:a||!1===t?2:1,needFadeIn:!1,loadStickerMiddleware:g&&d?d.create().get((()=>!!P.middlewares.size)):void 0,static:m,onlyThumb:i,withThumb:null!=s?s:!n.clearedElements.has(p)&&void 0,syncedVideo:this.isSelectable});c&&I.then((()=>c.push(...w)));const M={elements:u};if(1===o.sticker||i||m)return this.isSelectable&&(M.onRender=()=>Promise.all(w).then((()=>{d&&!d()||E.forEach((e=>{const{placeholder:t}=e;t.src=e.firstElementChild.src}))}))),I.then((e=>Object.assign(Object.assign({},e),M)));let P;M.onRender=e=>Promise.all(w).then((()=>{var t;if(d&&!d()||!o.animated)return;const i=Array.isArray(e)?e:[e],s=Array.isArray(i)?i[0]:i;if((0,C.Z)(s),E.forEach(((e,t)=>{const s=i[t]||i[0];e.player=s,P&&(e.syncedPlayer=P,e.paused?e.syncedPlayer.pausedElements.add(e):s.paused&&s.play()),e.isConnected&&y.Z.addAnimation(e,e.renderer.animationGroup,void 0,!0)})),(s instanceof b.Z||s instanceof HTMLVideoElement&&this.isSelectable)&&(P.player=s,n.playersSynced.set(p,s)),s instanceof b.Z?(s.group=n.animationGroup,null!==(t=s.overrideRender)&&void 0!==t||(s.overrideRender=e=>{O.set(s,e)})):HTMLVideoElement,g){const e=(0,b.a)(this.size.width,this.size.height);n.canvas.dpr=e,H()}}));const Z=[h,l.width,l.height].join("-");if(g){P=N.get(Z),P||(P={player:void 0,middlewares:new Set,pausedElements:new Set,key:Z},N.set(Z,P));for(const e of u){const t=e.middlewareHelper.get();P.middlewares.add(t),t.onClean((()=>{var i,s;if(P.middlewares.delete(t),!P.middlewares.size){if(P.player){const t=O.get(P.player);if(t&&(null===(s=(i=t).close)||void 0===s||s.call(i),O.delete(P.player)),O.delete(P.player),P.player instanceof b.Z)P.player.overrideRender=L.Z,P.player.remove();else if(P.player instanceof HTMLVideoElement){const t=T.Z.generateName(""+e.docId,0,0,void 0,void 0);delete v._i[t]}P.player=void 0}N.get(P.key)===P&&N.delete(P.key)&&!N.size&&z()}}))}}return I.then((e=>Object.assign(Object.assign({},e),M)))},p=[],f=c.map(((e,t)=>{if(e)return u(e,h);p.push(o[t])})).filter(Boolean),m=p.length?r.appEmojiManager.getCustomEmojiDocuments(p).then((e=>d&&!d()?[]:e.filter(Boolean).map((e=>u(e))))):Promise.resolve([]),g=e=>Promise.all(e).then((e=>{const t=e.map((({load:e,onRender:t,elements:i})=>{if(!e)return;const s=()=>e().then(t);if(!a)return s();i.forEach((e=>{A.push({div:e,load:()=>(i.forEach((e=>{A.delete({div:e})})),s())})}))}));return Promise.all(t)})),w=()=>{if(d&&!d())return;const e=g(f),t=m.then((e=>g(e)));return Promise.all([e,t])};return t?t.push({div:n.canvas,load:w}):w(),Promise.all(f).then((()=>Promise.all(h))).then((()=>{}))}))}static create(e){const t=new F;t.animationGroup=e.animationGroup,t.size=e.customEmojiSize||g.Z.active.customEmoji,t.isSelectable=e.isSelectable,e.wrappingDraft&&(t.contentEditable="false",t.style.height="inherit");let i=e.middleware;return i?(t.middlewareHelper=i.create(),i=t.middlewareHelper.get(),i.onDestroy((()=>{var e;null===(e=t.destroy)||void 0===e||e.call(t)}))):(t.auto=!0,t.middlewareHelper=(0,M.k)()),t}}const D=!0;let R;const B=new Set,N=new Map,O=new Map,U=(e=B)=>{const t=Array.from(e).filter((e=>e.isConnected&&e.checkForAnyFrame()&&!e.ignoreSettingDimensions));if(!t.length)return!1;const i=t.map((e=>{const t=[...e.playersSynced.values()].reduce(((e,t)=>e+ +!!t.paused),0);if(e.playersSynced.size===t)return;const i=e.getOffsets();return i.size?[e,i]:void 0})).filter(Boolean);for(const[e]of i)e.clearCanvas();for(const[e,t]of i)e.render(t);return!0},H=()=>{R||(R=window.setInterval(U,16.666666666666668),U())},z=()=>{R&&(clearInterval(R),R=void 0)};function j(e,t={}){var i,u,m,g,v,b,y,w;const S=document.createDocumentFragment();if(!e)return S;const C=null!==(i=t.nasty)&&void 0!==i?i:t.nasty={i:0,usedLength:0,text:e},L=(e,i)=>{const s=document.createElement("span");return t.wrappingDraft&&(s.contentEditable="false"),s.classList.add("input-something"),s.append(e),(D||S).append(s),e.classList.add("input-selectable"),!i&&e.append(G(!0)),I.add(s),s};t.isSelectable||(t.isSelectable=t.wrappingDraft);const E=null!==(u=t.customEmojis)&&void 0!==u?u:t.customEmojis=new Map,I=null!==(m=t.customWraps)&&void 0!==m?m:t.customWraps=new Set,M=null!==(g=t.entities)&&void 0!==g?g:t.entities=(0,l.Z)(C.text),P=null!==(v=t.passEntities)&&void 0!==v?v:t.passEntities={},Z=null!==(b=t.contextSite)&&void 0!==b?b:t.contextSite="Telegram",T="Telegram"!==Z,x=C.text.length,A=M.length;let D;for(;C.i=x){if("messageEntityCaret"!==e._)continue}else e.offset+e.length>x&&(e=(0,o.Z)(e),e.length=x-e.offset);e.length&&(C.lastEntity=e);let i=M[C.i+1];const l=e.offset,u=l+e.length,m=Math.min(u,null!==(y=null==i?void 0:i.offset)&&void 0!==y?y:65535),g=C.text.slice(l,u);let v=C.text.slice(l,m);C.usedLengthv.length&&b?b:S,t.voodoo)return S}var R;if(C.lastEntity&&(C.usedLength=C.lastEntity.offset+C.lastEntity.length),C.usedLength{const t=document.createElement("span");return t.classList.add(e?"input-filler2":"input-filler"),t.textContent=Z.Z,t};function V(e){var t;if((null==e?void 0:e.textContent)!==Z.Z||"false"===(null===(t=null==e?void 0:e.getAttribute)||void 0===t?void 0:t.call(e,"contenteditable"))){if(!e||e.textContent!==Z.Z||e.firstElementChild)return 2;if(e.nodeType===e.ELEMENT_NODE)return 1}return 0}function K(e){const t=(e,t,i)=>{const s=V(t);2===s?e[i](G()):1===s&&t.appendChild(document.createTextNode(Z.Z))};for(const i of e){const{previousSibling:e,nextSibling:s}=i;t(i,e,"before"),t(i,s,"after")}}window.wrapRichText=j},4497:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3591);function n(e){const{url:t,onclick:i}=(0,s.Z)(e),n=document.createElement("a");return n.href=t,i&&n.setAttribute("onclick",`${i}(this)`),n}},1447:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(5814),n=i(410),a=i(5418),o=i(5003),r=i(3772),d=i(7328),l=i(3241);class c extends l.Z{constructor(e){super(),this.worker=e,this.worker.onerror=e=>{try{this.dispatchEvent("workerError",e),this.cleanup(),this.terminate()}catch(e){}},this.worker.onmessage=e=>{this.dispatchEvent(e.data.queryMethodListener,...e.data.queryMethodArguments)}}postMessage(e){this.worker.postMessage(e)}terminate(){this.worker.terminate()}sendQuery(e,t){this.worker.postMessage({queryMethod:e.shift(),queryMethodArguments:e},d.Z?t:void 0)}}var h=i(8975),u=i(3855);const p="undefined"!=typeof WebAssembly;var f=i(5471),m=i(4159);const g=new class{constructor(){this.loadPromise=p?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=m.Z.threads,this.players={},this.playersByCacheName={},this.workers=[],this.curWorkerNum=0,this.log=(0,o.kg)("LOTTIE",o.v9.Error),this.onPlayerLoaded=(e,t,i)=>{const s=this.players[e];s?(this.log.debug("onPlayerLoaded"),s.onLoad(t,i)):this.log.warn("onPlayerLoaded on destroyed player:",e,t)},this.onFrame=(e,t,i)=>{const s=this.players[e];s?(void 0!==s.clamped&&i instanceof Uint8ClampedArray&&(s.clamped=i),s.renderFrame(i,t)):this.log.warn("onFrame on destroyed player:",e,t)},this.onPlayerError=(e,t)=>{const i=this.players[e];i&&s.Z.getAnimations(i.el[0]).forEach((e=>{s.Z.removeAnimation(e)}))}}getAnimation(e){for(const t in this.players)if(this.players[t].el.includes(e))return this.players[t];return null}setLoop(e){for(const t in this.players){const i=this.players[t];i.loop=e,i.autoplay=i._autoplay}}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise(((e,t)=>{let s=this.workersLimit;for(let n=0;n{this.log("worker #"+n+" ready"),o.addEventListener("frame",this.onFrame),o.addEventListener("loaded",this.onPlayerLoaded),o.addEventListener("error",this.onPlayerError),--s,s||(this.log("workers ready"),e(),this.loaded=!0)}),{once:!0}),o.addEventListener("workerError",(e=>{t("rlottie load error: "+e.message),this.loaded=!1}),{once:!0})}}))}makeAssetUrl(e){return"assets/tgs/"+e+".json"}loadAnimationAsAsset(e,t){return this.loadAnimationFromURL(e,this.makeAssetUrl(t))}loadAnimationDataFromURL(e){return p?(this.loadLottieWorkers(),fetch(e).then((e=>e.headers&&"application/octet-stream"!==e.headers.get("content-type")?e.blob():e.arrayBuffer().then((e=>u.Z.invokeCrypto("gzipUncompress",e))).then((e=>(0,h.Z)(e,"")))))):this.loadPromise}loadAnimationFromURLManually(e){const t=this.makeAssetUrl(e);return this.loadAnimationDataFromURL(t).then((e=>i=>this.loadAnimationFromURLNext(e,i,t)))}loadAnimationFromURL(e,t){return this.loadAnimationDataFromURL(t).then((i=>this.loadAnimationFromURLNext(i,e,t)))}loadAnimationFromURLNext(e,t,i){const s=Object.assign(t,{animationData:e,needUpscale:!0});return s.name||(s.name=i),this.loadAnimationWorker(s)}waitForFirstFrame(e){return Promise.race([new Promise((t=>{e.addEventListener("firstFrame",t,{once:!0})})),(0,a.Z)(2500)]).then((()=>e))}loadAnimationWorker(e){return t=this,i=void 0,a=function*(){if(!p)return this.loadPromise;this.loaded||(yield this.loadLottieWorkers());const{middleware:t,group:i=""}=e;if(t&&!t())throw(0,f.Z)("MIDDLEWARE");if(e.sync){const t=r.Z.CACHE.generateName(e.name,e.width,e.height,e.color,e.toneIndex),i=this.playersByCacheName[t];if(null==i?void 0:i.size)return Promise.resolve(i.entries().next().value[0])}const n=Array.isArray(e.container)?e.container:[e.container];if(e.width&&e.height||(e.width=parseInt(n[0].style.width),e.height=parseInt(n[0].style.height)),!e.width||!e.height)throw new Error("No size for sticker!");e.group=i;const a=this.initPlayer(n,e);return s.Z.addAnimation(a,i,void 0,t),a},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}onDestroy(e){delete this.players[e]}destroyWorkers(){p&&(this.workers.forEach(((e,t)=>{e.terminate(),this.log("worker #"+t+" terminated")})),this.log("workers destroyed"),this.workers.length=0,this.curWorkerNum=0,this.loaded=!1,this.loadPromise=void 0)}initPlayer(e,t){var i,s;const n=new r.Z({el:e,worker:this.workers[this.curWorkerNum++],options:t}),{reqId:a,cacheName:o}=n;this.players[a]=n;const d=o?null!==(i=(s=this.playersByCacheName)[o])&&void 0!==i?i:s[o]=new Set:void 0;return o&&d.add(n),this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),n.addEventListener("destroy",(()=>{this.onDestroy(a),d.delete(n)&&!d.size&&delete this.playersByCacheName[o]})),n.loadFromData(t.animationData),n}};n.GO.lottieLoader=g;const v=g},3772:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,a:()=>h});var s=i(7328),n=i(8189),a=i(4762),o=i(3241),r=i(4755),d=i(3228),l=i(356),c=i(645);function h(e,t,i){let s=(0,d.Z)(window.devicePixelRatio,1,2);return s>1&&!i&&(e>90&&t>90?!a.IS_APPLE&&r.Z.isMobile&&(s=1):(e>60&&t>60||a.IS_ANDROID)&&(s=Math.max(1.5,s-1.5))),s}class u extends o.Z{constructor({el:e,worker:t,options:i}){super(!0),this.reqId=0,this.width=0,this.height=0,this.paused=!0,this.direction=1,this.speed=1,this.autoplay=!0,this.loop=!0,this.group="",this.cachingDelta=0,this.playedTimes=0,this.reqId=++u.reqId,this.el=e,this.worker=t;for(const e in i)this.hasOwnProperty(e)&&(this[e]=i[e]);let o;this._loop=this.loop,this._autoplay=this.autoplay,this.initFrame=i.initFrame,this.color=i.color,this.inverseColor=i.inverseColor,this.name=i.name,this.skipFirstFrameRendering=i.skipFirstFrameRendering,this.toneIndex=i.toneIndex,this.raw=void 0!==this.color,this.name&&(this.cacheName=u.CACHE.generateName(this.name,this.width,this.height,this.color,this.toneIndex)),void 0!==i.skipRatio?o=i.skipRatio:(a.IS_ANDROID||a.IS_APPLE_MOBILE||a.IS_APPLE&&!a.IS_SAFARI&&!n.Z)&&this.width<100&&this.height<100&&!i.needUpscale&&(o=.5),this.skipDelta=void 0!==o?1/o|0:1;const r=h(this.width,this.height,i.needUpscale);this.width=Math.round(this.width*r),this.height=Math.round(this.height*r),i.noCache||(a.IS_APPLE&&this.width>100&&this.height>100?this.cachingDelta=2:this.width<100&&this.height<100?this.cachingDelta=1/0:this.cachingDelta=4),this.canvas||(this.canvas=this.el.map((()=>{const e=document.createElement("canvas");return e.classList.add("rlottie"),e.width=this.width,e.height=this.height,e.dpr=r,e}))),this.contexts=this.canvas.map((e=>e.getContext("2d"))),l.Z&&!this.raw||(this.imageData=new ImageData(this.width,this.height),s.Z&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4))),this.name?this.cache=u.CACHE.getCache(this.cacheName):this.cache=c.M.createCache()}clearCache(){this.cachingDelta!==1/0&&(this.cacheName&&this.cache.counter>1||this.cache.clearCache())}sendQuery(e,t){this.worker.sendQuery([e.shift(),this.reqId,...e],t)}loadFromData(e){this.sendQuery(["loadFromData",e,this.width,this.height,this.toneIndex,void 0!==this.color])}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(e=!0){this.paused||(this.paused=!0,e&&(clearTimeout(this.rafId),this.rafId=void 0))}resetCurrentFrame(){var e;return this.curFrame=null!==(e=this.initFrame)&&void 0!==e?e:1===this.direction?this.minFrame:this.maxFrame}stop(e=!0){this.pause();const t=this.resetCurrentFrame();e&&this.requestFrame(t)}restart(){this.stop(!1),this.play()}setSpeed(e){this.speed!==e&&(this.speed=e,this.paused||this.setMainLoop())}setDirection(e){this.direction!==e&&(this.direction=e,this.paused||this.setMainLoop())}remove(){this.pause(),this.sendQuery(["destroy"]),this.cacheName&&u.CACHE.releaseCache(this.cacheName),this.dispatchEvent("destroy"),this.cleanup()}applyColor(e){const[t,i,s]=this.color;for(let n=0,a=e.length;n{let n=this.cache.framesNew.get(t);if(e instanceof Uint8ClampedArray?s>0&&(n=this.canvas[0]):n=e,!n){const e=document.createElement("canvas");e.width=i.canvas.width,e.height=i.canvas.height,e.getContext("2d").putImageData(this.imageData,0,0),this.cache.framesNew.set(t,e),n=e}this.overrideRender&&this.renderedFirstFrame?this.overrideRender(n||this.imageData):n?(i.clearRect(0,0,n.width,n.height),i.drawImage(n,0,0)):i.putImageData(this.imageData,0,0),this.renderedFirstFrame||(this.renderedFirstFrame=!0)})),this.dispatchEvent("enterFrame",t)}catch(e){console.error("RLottiePlayer renderFrame error:",e,this.width,this.height),this.autoplay=!1,this.pause()}}renderFrame(e,t){if(this.cachingDelta&&(t%this.cachingDelta||!t)&&(e instanceof Uint8ClampedArray&&!this.cache.frames.has(t)?this.cache.frames.set(t,new Uint8ClampedArray(e)):l.Z&&e instanceof ImageBitmap&&!this.cache.framesNew.has(t)&&this.cache.framesNew.set(t,e)),this.frInterval){const i=Date.now()-this.frThen;if(i<0){const s=this.frInterval>-i?-i%this.frInterval:this.frInterval;return this.rafId&&clearTimeout(this.rafId),void(this.rafId=window.setTimeout((()=>{this.renderFrame2(e,t)}),s))}}this.renderFrame2(e,t)}requestFrame(e){const t=this.cache.frames.get(e),i=this.cache.framesNew.get(e);i?this.renderFrame(i,e):t?this.renderFrame(t,e):(this.clamped&&!this.clamped.length&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery(["renderFrame",e],this.clamped?[this.clamped.buffer]:void 0))}onLap(){return++this.playedTimes===this.loop&&(this.loop=!1),!!this.loop||(this.pause(!1),!1)}mainLoopForwards(){const{skipDelta:e,maxFrame:t}=this,i=this.curFrame+e>t?this.curFrame=this.loop?this.minFrame:this.maxFrame:this.curFrame+=e;return this.requestFrame(i),!(i+e>t)||this.onLap()}mainLoopBackwards(){const{skipDelta:e,minFrame:t}=this,i=this.curFrame-et?1:-1,callback:s})}playToFrame(e){this.pause();const{frame:t,speed:i,callback:s,direction:n}=e;this.setDirection(void 0===n?this.curFrame>t?-1:1:n),void 0!==i&&this.setSpeed(i);const a=[this.curFrame,t];-1===this.direction&&a.reverse(),this.loop=!1,this.setMinMax(a[0],a[1]),this.playToFrameOnFrameCallback&&this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s&&(this.playToFrameOnFrameCallback=e=>{e===t&&(this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s())},this.addEventListener("enterFrame",this.playToFrameOnFrameCallback)),this.play()}setColor(e,t){this.color=e,t&&this.paused&&this.renderFrame2(this.imageData.data,this.curFrame)}setInverseColor(e){this.inverseColor=e}setMinMax(e=0,t=this.frameCount-1){this.minFrame=e,this.maxFrame=t}onLoad(e,t){return i=this,s=void 0,a=function*(){this.frameCount=e,this.fps=t,this.setMinMax(),void 0!==this.initFrame&&(this.initFrame=(0,d.Z)(this.initFrame,this.minFrame,this.maxFrame));const i=this.resetCurrentFrame();if(this.fps<60&&1!==this.skipDelta){const e=60/t;this.skipDelta=this.skipDelta/e|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,!this.skipFirstFrameRendering&&this.requestFrame(i),this.dispatchEvent("ready"),this.addEventListener("enterFrame",(()=>{this.dispatchEvent("firstFrame"),this.canvas[0].parentNode||!this.el||this.overrideRender||this.el.forEach(((e,t)=>e.append(this.canvas[t]))),this.frameListener=()=>{if(this.paused||!this.currentMethod)return;const e=Date.now();this.frThen=e+this.frInterval,this.currentMethod()||this.loop||!this.autoplay||(this.autoplay=!1)},this.addEventListener("enterFrame",this.frameListener),"none"===this.group&&this.autoplay&&this.play()}),{once:!0})},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}u.CACHE=c.Z,u.reqId=0},4874:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(1447),n=i(6008),a=i(410),o=i(4789),r=i(2648);const d=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=(0,n.X)(null,this.scrollableDiv.querySelector(".tabs-container"),null,(()=>{var e;(null===(e=this.page)||void 0===e?void 0:e.onShown)&&this.page.onShown()}))}setPage(e){if(e.isAuthPage){this.pagesDiv.style.display="";const t=(0,r.Z)(e.pageEl);if(this.pageId===t)return;this.selectTab(t),-1!==this.pageId&&t>1&&s.Z.loadLottieWorkers(),this.pageId=t,this.scrollableDiv&&(0,o.Z)({container:this.scrollableDiv,element:this.scrollableDiv.firstElementChild,position:"start"})}else this.pagesDiv.style.display="none",e.pageEl.style.display="",this.pageId=-1;this.page=e}};a.GO.pagesManager=d;const l=d;class c{constructor(e,t,i,s,n){this.isAuthPage=t,this.onFirstMount=i,this.onMount=s,this.onShown=n,this.installed=!1,this.pageEl=document.body.querySelector("."+e)}mount(...e){return t=this,i=void 0,n=function*(){if(this.onMount){const t=this.onMount(...e);t instanceof Promise&&(yield t)}if(!this.installed){if(this.onFirstMount)try{const t=this.onFirstMount(...e);t instanceof Promise&&(yield t)}catch(e){console.error("PAGE MOUNT ERROR:",e)}this.installed=!0}l.setPage(this)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}}},671:(e,t,i)=>{"use strict";function s(e){return r(o(e)).join("-")}i.d(t,{Ml:()=>c,N0:()=>s,tB:()=>d,w1:()=>r,zu:()=>h});const n=/\uFE0F/g,a=String.fromCharCode(8205),o=e=>e.indexOf(a)<0?e.replace(n,""):e;function r(e){const t=[];let i=0,s=0,n=0;for(;n55296&&i<=56319?s=i:t.push(i.toString(16));return t.length&&2===t[0].length&&(t[0]="00"+t[0]),t}function d(e){const t=e.match(/[\uDFFB-\uDFFF]/);return t?5-(57343-t[0].charCodeAt(0)):0}const l=new Map([["FT","🏴‍☠"]]);function c(e){var t;return null!==(t=l.get(e))&&void 0!==t?t:String.fromCharCode(55356,56741+e.charCodeAt(0),55356,56741+e.charCodeAt(1))}function h(e){return e.split("-").reduce(((e,t)=>e+String.fromCodePoint(parseInt(t,16))),"")}},4329:function(e){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function i(s){if(t[s])return t[s].exports;var n=t[s]={i:s,l:!1,exports:{}};return e[s].call(n.exports,n,n.exports,i),n.l=!0,n.exports}return i.m=e,i.c=t,i.d=function(e,t,s){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(i.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(s,n,function(t){return e[t]}.bind(null,n));return s},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=0)}([function(e,t,i){"use strict";(function(t){var i=t.AudioContext||t.webkitAudioContext,s=function(e){if(!s.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};s.isRecordingSupported=function(){return i&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},s.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},s.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],i=0;i{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},s.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then((e=>(this.stream=e,this.audioContext.createMediaStreamSource(e))))},s.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},s.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise(((t,i)=>{var s=i=>{switch(i.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=i.data.samplePosition,e(i.data.page);break;case"done":this.encoder.removeEventListener("message",s),this.finish()}};this.encoder.addEventListener("message",s),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))}))},s.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise(((e,i)=>{var s=i=>{"flushed"===i.data.message&&(t.removeEventListener("message",s),this.onpause(),e())};t.addEventListener("message",s),t.postMessage({command:"flush"})}))}return this.onpause(),Promise.resolve()}},s.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},s.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then((()=>this.initSourceNode(e))).then((e=>{this.sourceNode=e,this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)}))},s.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise((t=>{var i=s=>{"done"===s.data.message&&(e.removeEventListener("message",i),t())};e.addEventListener("message",i),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})}))}return Promise.resolve()},s.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},s.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},s.prototype.streamPage=function(e){this.ondataavailable(e)},s.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,i){return e.set(i,t),t+i.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},s.prototype.ondataavailable=function(){},s.prototype.onpause=function(){},s.prototype.onresume=function(){},s.prototype.onstart=function(){},s.prototype.onstop=function(){},e.exports=s}).call(this,i(1))},function(e,t){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(e){"object"==typeof window&&(i=window)}e.exports=i}])},6802:e=>{var t=.1,i="function"==typeof Float32Array;function s(e,t){return 1-3*t+3*e}function n(e,t){return 3*t-6*e}function a(e){return 3*e}function o(e,t,i){return((s(t,i)*e+n(t,i))*e+a(t))*e}function r(e,t,i){return 3*s(t,i)*e*e+2*n(t,i)*e+a(t)}function d(e){return e}e.exports=function(e,s,n,a){if(!(0<=e&&e<=1&&0<=n&&n<=1))throw new Error("bezier x values must be in [0, 1] range");if(e===s&&n===a)return d;for(var l=i?new Float32Array(11):new Array(11),c=0;c<11;++c)l[c]=o(c*t,e,n);return function(i){return 0===i||1===i?i:o(function(i){for(var s=0,a=1;10!==a&&l[a]<=i;++a)s+=t;--a;var d=s+(i-l[a])/(l[a+1]-l[a])*t,c=r(d,e,n);return c>=.001?function(e,t,i,s){for(var n=0;n<4;++n){var a=r(t,i,s);if(0===a)return t;t-=(o(t,i,s)-e)/a}return t}(i,d,e,n):0===c?d:function(e,t,i,s,n){var a,r,d=0;do{(a=o(r=t+(i-t)/2,s,n)-e)>0?i=r:t=r}while(Math.abs(a)>1e-7&&++d<10);return r}(i,s,s+t,e,n)}(i),s,a)}}}}]); -//# sourceMappingURL=460.ecea63a28e50b5f10803.chunk.js.map \ No newline at end of file diff --git a/public/460.ecea63a28e50b5f10803.chunk.js.map b/public/460.ecea63a28e50b5f10803.chunk.js.map deleted file mode 100644 index f8963ae1..00000000 --- a/public/460.ecea63a28e50b5f10803.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"460.ecea63a28e50b5f10803.chunk.js","mappings":"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KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,OAAO,MAAO,OAAO,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,MAAO,kBAAkB,MAAO,QAAQ,MAAO,kBAAkB,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,wCAAwC,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,IAAK,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,iBAAiB,KAAM,iBAAiB,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,I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","sources":["webpack://tweb/./src/components/animationIntersector.ts","webpack://tweb/./src/components/appMediaPlaybackController.ts","webpack://tweb/./src/components/appMediaViewer.ts","webpack://tweb/./src/lib/mediaPlayer.ts","webpack://tweb/./src/components/appMediaViewerBase.ts","webpack://tweb/./src/helpers/fillPropertyValue.ts","webpack://tweb/./src/components/appNavigationController.ts","webpack://tweb/./src/components/appSearch.ts","webpack://tweb/./src/components/appSearchSuper..ts","webpack://tweb/./src/helpers/dom/lockTouchScroll.ts","webpack://tweb/./src/components/appSelectPeers.ts","webpack://tweb/./src/components/audio.ts","webpack://tweb/./src/helpers/avatarListLoader.ts","webpack://tweb/./src/components/appMediaViewerAvatar.ts","webpack://tweb/./src/components/avatar.ts","webpack://tweb/./src/components/avatarEdit.ts","webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/buttonCorner.ts","webpack://tweb/./src/components/buttonIcon.ts","webpack://tweb/./src/components/buttonMenu.ts","webpack://tweb/./src/components/buttonMenuToggle.ts","webpack://tweb/./src/components/chat/gradientRenderer.ts","webpack://tweb/./src/helpers/easing/easeOutQuad.ts","webpack://tweb/./src/components/chat/selection.ts","webpack://tweb/./src/helpers/dom/getSelectedText.ts","webpack://tweb/./src/components/checkboxField.ts","webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/confirmationPopup.ts","webpack://tweb/./src/components/countryInputField.ts","webpack://tweb/./src/components/dotRenderer.ts","webpack://tweb/./src/components/editPeer.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/stickers.ts","webpack://tweb/./src/components/emoticonsDropdown/index.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/emoji.ts","webpack://tweb/./src/lib/richTextProcessor/wrapSingleEmoji.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/stickers.ts","webpack://tweb/./src/components/generateDelimiter.ts","webpack://tweb/./src/components/generateFakeIcon.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat2.ts","webpack://tweb/./src/components/gifsMasonry.ts","webpack://tweb/./src/components/horizontalMenu.ts","webpack://tweb/./src/components/inputField.ts","webpack://tweb/./src/helpers/dom/selectElementContents.ts","webpack://tweb/./src/components/inputSearch.ts","webpack://tweb/./src/components/lazyLoadQueue.ts","webpack://tweb/./src/components/lazyLoadQueueIntersector.ts","webpack://tweb/./src/components/mediaProgressLine.ts","webpack://tweb/./src/components/middleEllipsis.ts","webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/components/peerProfileAvatars.ts","webpack://tweb/./src/components/peerProfile.ts","webpack://tweb/./src/components/generateTitleIcons.ts","webpack://tweb/./src/components/generateVerifiedIcon.ts","webpack://tweb/./src/components/generatePremiumIcon.ts","webpack://tweb/./src/components/peerTitle.ts","webpack://tweb/./src/components/popups/avatar.ts","webpack://tweb/./src/lib/cropper.ts","webpack://tweb/./src/components/popups/deleteDialog.ts","webpack://tweb/./src/components/popups/deleteMessages.ts","webpack://tweb/./src/components/popups/forward.ts","webpack://tweb/./src/components/popups/index.ts","webpack://tweb/./src/components/popups/limit.ts","webpack://tweb/./src/components/popups/mute.ts","webpack://tweb/./src/components/popups/peer.ts","webpack://tweb/./src/components/popups/pickUser.ts","webpack://tweb/./src/components/popups/sendNow.ts","webpack://tweb/./src/components/popups/stickers.ts","webpack://tweb/./src/components/preloader.ts","webpack://tweb/./src/components/putPhoto.ts","webpack://tweb/./src/components/wrappers/getPeerInitials.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/radioField.ts","webpack://tweb/./src/components/radioForm.ts","webpack://tweb/./src/components/rangeSelector.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/components/row.ts","webpack://tweb/./src/components/scrollable.ts","webpack://tweb/./src/components/settingSection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newGroup.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/privacyType.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/getPrivacyRulesDetails.ts","webpack://tweb/./src/components/privacySection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/passwordSet.ts","webpack://tweb/./src/helpers/dom/canFocus.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/emailConfirmation.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/email.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/hint.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/reEnterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/enterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/lastSeen.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/profilePhoto.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/forwardMessages.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/addToGroups.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/calls.ts","webpack://tweb/./src/components/sidebarLeft/tabs/activeSessions.ts","webpack://tweb/./src/components/sidebarLeft/tabs/blockedUsers.ts","webpack://tweb/./src/helpers/string/convertKeyToInputKey.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/voices.ts","webpack://tweb/./src/components/sidebarLeft/tabs/activeWebSessions.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacyAndSecurity.ts","webpack://tweb/./src/components/sidebarLeft/tabs/quickReaction.ts","webpack://tweb/./src/components/sidebarLeft/tabs/generalSettings.ts","webpack://tweb/./src/helpers/eachMinute.ts","webpack://tweb/./src/helpers/eachTimeout.ts","webpack://tweb/./src/components/sidebarLeft/tabs/chatFolders.ts","webpack://tweb/./src/components/sidebarLeft/tabs/notifications.ts","webpack://tweb/./src/components/sidebarLeft/tabs/language.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/photo.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/file.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/video.ts","webpack://tweb/./src/components/sidebarLeft/tabs/dataAndStorage.ts","webpack://tweb/./src/components/sidebarLeft/tabs/settings.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newChannel.ts","webpack://tweb/./src/components/popups/createContact.ts","webpack://tweb/./src/components/sidebarLeft/tabs/contacts.ts","webpack://tweb/./src/components/sidebarLeft/tabs/archivedTab.ts","webpack://tweb/./src/components/sidebarLeft/tabs/peopleNearby.ts","webpack://tweb/./src/components/sidebarLeft/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/addMembers.ts","webpack://tweb/./src/helpers/averageColor.ts","webpack://tweb/./src/helpers/highlightningColor.ts","webpack://tweb/./src/components/colorPicker.ts","webpack://tweb/./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack://tweb/./src/components/sidebarLeft/tabs/background.ts","webpack://tweb/./src/helpers/files/requestFile.ts","webpack://tweb/./src/components/sidebarLeft/tabs/includedChats.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editFolder.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editProfile.ts","webpack://tweb/./src/components/sidebarRight/index.ts","webpack://tweb/./src/components/sidebarRight/tabs/editContact.ts","webpack://tweb/./src/components/sidebarRight/tabs/editTopic.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatType.ts","webpack://tweb/./src/components/sidebarRight/tabs/userPermissions.ts","webpack://tweb/./src/components/sidebarRight/tabs/groupPermissions.ts","webpack://tweb/./src/lib/appManagers/utils/chats/combineParticipantBannedRights.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatReactions.ts","webpack://tweb/./src/components/sidebarRight/tabs/editChat.ts","webpack://tweb/./src/components/sidebarRight/tabs/sharedMedia.ts","webpack://tweb/./src/components/singleTransition.ts","webpack://tweb/./src/components/slider.ts","webpack://tweb/./src/components/sliderTab.ts","webpack://tweb/./src/components/sortedUserList.ts","webpack://tweb/./src/components/stickerViewer.ts","webpack://tweb/./src/components/stickyIntersector.ts","webpack://tweb/./src/components/swipeHandler.ts","webpack://tweb/./src/components/telInputField.ts","webpack://tweb/./src/components/toast.ts","webpack://tweb/./src/components/transition.ts","webpack://tweb/./src/lib/richTextProcessor/isUsernameValid.ts","webpack://tweb/./src/components/usernameInputField.ts","webpack://tweb/./src/components/usernamesSection.ts","webpack://tweb/./src/components/visibilityIntersector.ts","webpack://tweb/./src/components/volumeSelector.ts","webpack://tweb/./src/components/wrappers/customEmoji.ts","webpack://tweb/./src/components/wrappers/document.ts","webpack://tweb/./src/components/wrappers/formatUserPhone.ts","webpack://tweb/./src/components/wrappers/getChatMembersString.ts","webpack://tweb/./src/components/wrappers/getPeerTitle.ts","webpack://tweb/./src/components/wrappers/getUserStatusString.ts","webpack://tweb/./src/components/wrappers/mediaSpoiler.ts","webpack://tweb/./src/components/wrappers/messageActionTextNew.ts","webpack://tweb/./src/components/topicAvatar.ts","webpack://tweb/./src/components/wrappers/joinVoiceChatAnchor.ts","webpack://tweb/./src/components/wrappers/messageActionTextNewUnsafe.ts","webpack://tweb/./src/components/wrappers/messageForReply.ts","webpack://tweb/./src/components/wrappers/peerTitle.ts","webpack://tweb/./src/components/wrappers/photo.ts","webpack://tweb/./src/components/wrappers/senderToPeer.ts","webpack://tweb/./src/components/wrappers/sentTime.ts","webpack://tweb/./src/components/wrappers/sticker.ts","webpack://tweb/./src/helpers/bytes/getPathFromBytes.ts","webpack://tweb/./src/helpers/computeLockColor.ts","webpack://tweb/./src/components/wrappers/stickerAnimation.ts","webpack://tweb/./src/components/wrappers/stickerEmoji.ts","webpack://tweb/./src/components/wrappers/stickerSetThumb.ts","webpack://tweb/./src/components/wrappers/stickerToRow.ts","webpack://tweb/./src/components/wrappers/topicNameButton.ts","webpack://tweb/./src/components/wrappers/video.ts","webpack://tweb/./src/components/wrappers/webPageDescription.ts","webpack://tweb/./src/components/wrappers/webPageTitle.ts","webpack://tweb/./src/config/currencies.ts","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/config/font.ts","webpack://tweb/./src/environment/imageBitmapSupport.ts","webpack://tweb/./src/helpers/animation.ts","webpack://tweb/./src/helpers/array/filterAsync.ts","webpack://tweb/./src/helpers/array/findAndSpliceAll.ts","webpack://tweb/./src/helpers/audioAssetPlayer.ts","webpack://tweb/./src/helpers/blob/readBlobAsDataURL.ts","webpack://tweb/./src/helpers/heavyQueue.ts","webpack://tweb/./src/helpers/blur.ts","webpack://tweb/./src/helpers/bytes/getPreviewURLFromBytes.ts","webpack://tweb/./src/helpers/bytes/bytesToDataURL.ts","webpack://tweb/./src/helpers/calcImageInBox.ts","webpack://tweb/./src/helpers/canvas/getTextWidth.ts","webpack://tweb/./src/helpers/canvas/scaleMediaElement.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/clipboard.ts","webpack://tweb/./src/helpers/contextMenuController.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/dom/anchorCopy.ts","webpack://tweb/./src/helpers/dom/attachContextMenuListener.ts","webpack://tweb/./src/helpers/dom/attachGrabListeners.ts","webpack://tweb/./src/helpers/dom/cancelSelection.ts","webpack://tweb/./src/helpers/dom/clickEvent.ts","webpack://tweb/./src/helpers/dom/controlsHover.ts","webpack://tweb/./src/helpers/dom/createContextMenu.ts","webpack://tweb/./src/helpers/dom/createStickersContextMenu.ts","webpack://tweb/./src/helpers/dom/createVideo.ts","webpack://tweb/./src/helpers/dom/customProperties.ts","webpack://tweb/./src/helpers/dom/dispatchEvent.ts","webpack://tweb/./src/helpers/dom/documentFragmentToHTML.ts","webpack://tweb/./src/helpers/dom/findUpAsChild.ts","webpack://tweb/./src/helpers/dom/findUpAttribute.ts","webpack://tweb/./src/helpers/dom/findUpTag.ts","webpack://tweb/./src/helpers/dom/fullScreen.ts","webpack://tweb/./src/helpers/dom/getCaretPosNew.ts","webpack://tweb/./src/helpers/dom/getRichElementValue.ts","webpack://tweb/./src/helpers/dom/getRichValueWithCaret.ts","webpack://tweb/./src/helpers/dom/getViewportSlice.ts","webpack://tweb/./src/helpers/dom/getVisibleRect.ts","webpack://tweb/./src/helpers/dom/handleHorizontalSwipe.ts","webpack://tweb/./src/helpers/dom/handleTabSwipe.ts","webpack://tweb/./src/helpers/dom/htmlToDocumentFragment.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/dom/isInDOM.ts","webpack://tweb/./src/helpers/dom/isInputEmpty.ts","webpack://tweb/./src/helpers/dom/isSendShortcutPressed.ts","webpack://tweb/./src/helpers/dom/isSwipingBackSafari.ts","webpack://tweb/./src/helpers/dom/placeCaretAtEnd.ts","webpack://tweb/./src/helpers/dom/positionElementByIndex.ts","webpack://tweb/./src/helpers/dom/renderImageFromUrl.ts","webpack://tweb/./src/helpers/dom/renderMediaWithFadeIn.ts","webpack://tweb/./src/helpers/dom/replaceContent.ts","webpack://tweb/./src/helpers/dom/compareNodes.ts","webpack://tweb/./src/helpers/dom/richInputHandler.ts","webpack://tweb/./src/helpers/dom/sortable.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/helpers/dom/whichChild.ts","webpack://tweb/./src/helpers/dropdownHover.ts","webpack://tweb/./src/helpers/fastSmoothScroll.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/filterChatPhotosMessages.ts","webpack://tweb/./src/helpers/formatBytes.ts","webpack://tweb/./src/helpers/formatCallDuration.ts","webpack://tweb/./src/helpers/formatDuration.ts","webpack://tweb/./src/helpers/formatPhoneNumber.ts","webpack://tweb/./src/helpers/framesCache.ts","webpack://tweb/./src/helpers/generatePathData.ts","webpack://tweb/./src/helpers/getImageFromStrippedThumb.ts","webpack://tweb/./src/helpers/getPreviewURLFromThumb.ts","webpack://tweb/./src/helpers/getStrippedThumbIfNeeded.ts","webpack://tweb/./src/helpers/listLoader.ts","webpack://tweb/./src/helpers/listenerSetter.ts","webpack://tweb/./src/helpers/mediaSize.ts","webpack://tweb/./src/helpers/mediaSizes.ts","webpack://tweb/./src/helpers/middlewarePromise.ts","webpack://tweb/./src/helpers/number/clamp.ts","webpack://tweb/./src/helpers/number/formatNumber.ts","webpack://tweb/./src/helpers/number/numberThousandSplitter.ts","webpack://tweb/./src/helpers/onMediaLoad.ts","webpack://tweb/./src/helpers/overlayClickHandler.ts","webpack://tweb/./src/helpers/paymentsWrapCurrencyAmount.ts","webpack://tweb/./src/helpers/positionMenu.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/helpers/saveLottiePreview.ts","webpack://tweb/./src/helpers/schedulers/throttleWithRaf.ts","webpack://tweb/./src/helpers/schedulers/throttleWith.ts","webpack://tweb/./src/helpers/scrollableLoader.ts","webpack://tweb/./src/helpers/searchListLoader.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/incrementMessageId.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/helpers/setAttachmentSize.ts","webpack://tweb/./src/helpers/sortedList.ts","webpack://tweb/./src/helpers/string/bom.ts","webpack://tweb/./src/helpers/string/encodeEntities.ts","webpack://tweb/./src/helpers/string/escapeRegExp.ts","webpack://tweb/./src/helpers/string/limitSymbols.ts","webpack://tweb/./src/helpers/string/toHHMMSS.ts","webpack://tweb/./src/helpers/textToSvgURL.ts","webpack://tweb/./src/helpers/windowSize.ts","webpack://tweb/./src/hooks/useHeavyAnimationCheck.ts","webpack://tweb/./src/components/dialogsContextMenu.ts","webpack://tweb/./src/components/connectionStatus.ts","webpack://tweb/./src/components/sendingStatus.ts","webpack://tweb/./src/helpers/easing/easeInOutSine.ts","webpack://tweb/./src/helpers/canvas/roundRect.ts","webpack://tweb/./src/components/groupCallActiveIcon.ts","webpack://tweb/./src/helpers/canvas/shimmer.ts","webpack://tweb/./src/helpers/dialogsPlaceholder.ts","webpack://tweb/./src/helpers/canvas/drawCircle.ts","webpack://tweb/./src/helpers/dom/shake.ts","webpack://tweb/./src/lib/appManagers/appDialogsManager.ts","webpack://tweb/./src/helpers/number/getUnsafeRandomInt.ts","webpack://tweb/./src/lib/appManagers/appDownloadManager.ts","webpack://tweb/./src/helpers/dom/createDownloadAnchor.ts","webpack://tweb/./src/helpers/array/partition.ts","webpack://tweb/./src/components/chat/bubbleGroups.ts","webpack://tweb/./src/components/popups/datePicker.ts","webpack://tweb/./src/components/divAndCaption.ts","webpack://tweb/./src/components/chat/replyContainer.ts","webpack://tweb/./src/components/wrappers/reply.ts","webpack://tweb/./src/components/stackedAvatars.ts","webpack://tweb/./src/components/chat/replies.ts","webpack://tweb/./src/components/chat/messageRender.ts","webpack://tweb/./src/helpers/dom/getElementByPoint.ts","webpack://tweb/./src/helpers/dom/reflowScrollableElement.ts","webpack://tweb/./src/lib/mtproto/constants.ts","webpack://tweb/./src/lib/appManagers/internalLink.ts","webpack://tweb/./src/components/popups/joinChatInvite.ts","webpack://tweb/./src/components/chat/reaction.ts","webpack://tweb/./src/components/chat/reactions.ts","webpack://tweb/./src/helpers/scrollSaver.ts","webpack://tweb/./src/helpers/dom/superIntersectionObserver.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMentionUnread.ts","webpack://tweb/./src/helpers/array/accumulate.ts","webpack://tweb/./src/helpers/cacheCallback.ts","webpack://tweb/./src/helpers/string/replaceNonNumber.ts","webpack://tweb/./src/helpers/cards/cardBrands.ts","webpack://tweb/./src/helpers/array/createArray.ts","webpack://tweb/./src/helpers/string/buggedNumbers.ts","webpack://tweb/./src/helpers/cards/patternCharacters.ts","webpack://tweb/./src/helpers/cards/cardFormattingPatterns.ts","webpack://tweb/./src/helpers/cards/formatValueByPattern.ts","webpack://tweb/./src/helpers/cards/validateCard.ts","webpack://tweb/./src/helpers/string/nbsp.ts","webpack://tweb/./src/components/telegramWebView.ts","webpack://tweb/./src/components/popups/paymentVerification.ts","webpack://tweb/./src/components/popups/paymentCard.ts","webpack://tweb/./src/helpers/cards/formatInputValueByPattern.ts","webpack://tweb/./src/components/popups/paymentCardConfirmation.ts","webpack://tweb/./src/components/popups/paymentShipping.ts","webpack://tweb/./src/components/popups/paymentShippingMethods.ts","webpack://tweb/./src/components/popups/payment.ts","webpack://tweb/./src/components/groupedLayout.ts","webpack://tweb/./src/components/prepareAlbum.ts","webpack://tweb/./src/components/wrappers/album.ts","webpack://tweb/./src/components/sidebarRight/tabs/pollResults.ts","webpack://tweb/./src/components/poll.ts","webpack://tweb/./src/helpers/string/isRTL.ts","webpack://tweb/./src/components/chat/bubbles.ts","webpack://tweb/./src/helpers/dom/copyFromElement.ts","webpack://tweb/./src/components/wrappers/groupedDocuments.ts","webpack://tweb/./src/components/wrappers/poll.ts","webpack://tweb/./src/components/popups/unpinMessage.ts","webpack://tweb/./src/helpers/dom/isSelectionEmpty.ts","webpack://tweb/./src/helpers/preloadAnimatedEmojiSticker.ts","webpack://tweb/./src/components/popups/reportMessagesConfirm.ts","webpack://tweb/./src/components/popups/reportMessages.ts","webpack://tweb/./src/components/popups/sponsored.ts","webpack://tweb/./src/components/popups/reactedList.ts","webpack://tweb/./src/components/chat/reactionsMenu.ts","webpack://tweb/./src/components/chat/contextMenu.ts","webpack://tweb/./src/components/chat/sendContextMenu.ts","webpack://tweb/./src/components/popups/createPoll.ts","webpack://tweb/./src/helpers/createPoster.ts","webpack://tweb/./src/helpers/getGifDuration.ts","webpack://tweb/./src/components/inputFieldAnimated.ts","webpack://tweb/./src/components/popups/newMedia.ts","webpack://tweb/./src/helpers/dom/attachListNavigation.ts","webpack://tweb/./src/components/chat/autocompleteHelper.ts","webpack://tweb/./src/components/chat/stickersHelper.ts","webpack://tweb/./src/components/popups/schedule.ts","webpack://tweb/./src/components/chat/emojiHelper.ts","webpack://tweb/./src/components/chat/autocompletePeerHelper.ts","webpack://tweb/./src/components/chat/commandsHelper.ts","webpack://tweb/./src/components/chat/autocompleteHelperController.ts","webpack://tweb/./src/components/chat/mentionsHelper.ts","webpack://tweb/./src/components/chat/replyKeyboard.ts","webpack://tweb/./src/components/chat/inlineHelper.ts","webpack://tweb/./src/components/chat/botCommands.ts","webpack://tweb/./src/helpers/modifyAckedResult.ts","webpack://tweb/./src/components/chat/sendAs.ts","webpack://tweb/./src/helpers/dom/hasMarkupInSelection.ts","webpack://tweb/./src/components/chat/input.ts","webpack://tweb/./src/components/wrappers/draft.ts","webpack://tweb/./src/components/chat/pinnedContainer.ts","webpack://tweb/./src/components/chat/pinnedMessageBorder.ts","webpack://tweb/./src/components/chat/audio.ts","webpack://tweb/./src/components/chat/pinnedMessage.ts","webpack://tweb/./src/helpers/dom/handleScrollSideEvent.ts","webpack://tweb/./src/components/chat/topbar.ts","webpack://tweb/./src/components/sidebarRight/tabs/search.ts","webpack://tweb/./src/components/chat/search.ts","webpack://tweb/./src/components/chat/patternRenderer.ts","webpack://tweb/./src/components/chat/chat.ts","webpack://tweb/./src/helpers/autoDownload.ts","webpack://tweb/./src/components/chat/markupTooltip.ts","webpack://tweb/./src/components/chat/dragAndDrop.ts","webpack://tweb/./src/helpers/dom/disableTransition.ts","webpack://tweb/./src/components/lineBlobDrawable.ts","webpack://tweb/./src/components/topbarWeave.ts","webpack://tweb/./src/lib/rlottie/rlottieIcon.ts","webpack://tweb/./src/components/superIcon.ts","webpack://tweb/./src/components/groupCall/microphoneIcon.ts","webpack://tweb/./src/components/groupCall/participantMutedIcon.ts","webpack://tweb/./src/components/groupCall/index.ts","webpack://tweb/./src/components/groupCall/participantStatus.ts","webpack://tweb/./src/components/groupCall/participantsList.ts","webpack://tweb/./src/components/call/videoCanvasBlur.ts","webpack://tweb/./src/components/groupCall/participantVideo.ts","webpack://tweb/./src/components/groupCall/participantVideos.ts","webpack://tweb/./src/components/groupCall/participants.ts","webpack://tweb/./src/components/groupCall/description.ts","webpack://tweb/./src/components/groupCall/title.ts","webpack://tweb/./src/components/call/button.ts","webpack://tweb/./src/components/movableElement.ts","webpack://tweb/./src/helpers/movablePanel.ts","webpack://tweb/./src/helpers/toggleClassName.ts","webpack://tweb/./src/components/call/description.ts","webpack://tweb/./src/components/groupCall/microphoneIconMini.ts","webpack://tweb/./src/components/call/index.ts","webpack://tweb/./src/components/topbarCall.ts","webpack://tweb/./src/lib/appManagers/uiNotificationsManager.ts","webpack://tweb/./src/helpers/files/getFilesFromEvent.ts","webpack://tweb/./src/helpers/addAnchorListener.ts","webpack://tweb/./src/lib/appManagers/appImManager.ts","webpack://tweb/./src/lib/appManagers/utils/messages/canSaveMessageMedia.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMediaFromMessage.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMessageSenderPeerIdOrName.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMessageRestricted.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerColorById.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerEditableUsername.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/photos/choosePhotoSize.ts","webpack://tweb/./src/lib/calls/callConnectionInstanceBase.ts","webpack://tweb/./src/lib/calls/helpers/createPeerConnection.ts","webpack://tweb/./src/lib/calls/helpers/createDataChannel.ts","webpack://tweb/./src/lib/calls/helpers/parseSignalingData.ts","webpack://tweb/./src/lib/calls/callConnectionInstance.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/calls/p2P/p2PEncryptor.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/calls/p2P/chromeP2PSdpBuilder.ts","webpack://tweb/./src/lib/calls/p2P/p2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/firefoxP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/safariP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/callInstance.ts","webpack://tweb/./src/lib/calls/p2P/getCallProtocol.ts","webpack://tweb/./src/lib/calls/p2P/getRtcConfiguration.ts","webpack://tweb/./src/lib/calls/helpers/getStreamCached.ts","webpack://tweb/./src/lib/calls/callInstanceBase.ts","webpack://tweb/./src/lib/calls/callState.ts","webpack://tweb/./src/components/call/getAudioAsset.ts","webpack://tweb/./src/lib/calls/callsController.ts","webpack://tweb/./src/lib/calls/constants.ts","webpack://tweb/./src/lib/calls/groupCallConnectionInstance.ts","webpack://tweb/./src/lib/calls/helpers/processMediaSection.ts","webpack://tweb/./src/lib/calls/helpers/filterServerCodecs.ts","webpack://tweb/./src/lib/calls/helpers/fixLocalOffer.ts","webpack://tweb/./src/lib/calls/groupCallInstance.ts","webpack://tweb/./src/lib/calls/groupCallState.ts","webpack://tweb/./src/components/groupCall/getAudioAsset.ts","webpack://tweb/./src/lib/calls/groupCallsController.ts","webpack://tweb/./src/lib/calls/helpers/createMainStreamManager.ts","webpack://tweb/./src/lib/calls/helpers/getAudioConstraints.ts","webpack://tweb/./src/environment/constraintSupport.ts","webpack://tweb/./src/lib/calls/helpers/getScreenConstraints.ts","webpack://tweb/./src/lib/calls/helpers/getScreenStream.ts","webpack://tweb/./src/lib/calls/helpers/getStream.ts","webpack://tweb/./src/lib/calls/helpers/getVideoConstraints.ts","webpack://tweb/./src/lib/calls/helpers/parseMediaSectionInfo.ts","webpack://tweb/./src/lib/calls/helpers/parseSourceGroups.ts","webpack://tweb/./src/lib/calls/helpers/stopTrack.ts","webpack://tweb/./src/lib/calls/localConferenceDescription.ts","webpack://tweb/./src/lib/calls/sdp/index.ts","webpack://tweb/./src/helpers/string/splitStringByLimitWithRest.ts","webpack://tweb/./src/helpers/uniqueNumberGenerator.ts","webpack://tweb/./src/lib/calls/sdp/attributeSplitted.ts","webpack://tweb/./src/lib/calls/sdp/mediaLineParts.ts","webpack://tweb/./src/lib/calls/sdp/line.ts","webpack://tweb/./src/lib/calls/sdp/attributeInner.ts","webpack://tweb/./src/lib/calls/sdp/attributes.ts","webpack://tweb/./src/lib/calls/sdp/mediaSection.ts","webpack://tweb/./src/lib/calls/sdp/sessionSection.ts","webpack://tweb/./src/lib/calls/sdp/utils.ts","webpack://tweb/./src/lib/calls/sdpBuilder.ts","webpack://tweb/./src/lib/calls/streamManager.ts","webpack://tweb/./src/lib/calls/stringFromLineBuilder.ts","webpack://tweb/./src/lib/calls/utils.ts","webpack://tweb/./src/lib/richTextProcessor/getAbbreviation.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiEntityFromEmoji.ts","webpack://tweb/./src/lib/richTextProcessor/matchEmail.ts","webpack://tweb/./src/lib/richTextProcessor/setBlankToAnchor.ts","webpack://tweb/./src/lib/richTextProcessor/wrapAbbreviation.ts","webpack://tweb/./src/lib/richTextProcessor/wrapDraftText.ts","webpack://tweb/./src/lib/richTextProcessor/wrapEmojiText.ts","webpack://tweb/./src/environment/emojiVersionsSupport.ts","webpack://tweb/./src/lib/richTextProcessor/wrapRichText.ts","webpack://tweb/./src/helpers/buildURLHash.ts","webpack://tweb/./src/lib/richTextProcessor/wrapTelegramUrlToAnchor.ts","webpack://tweb/./src/lib/rlottie/queryableWorker.ts","webpack://tweb/./src/environment/webAssemblySupport.ts","webpack://tweb/./src/lib/rlottie/lottieLoader.ts","webpack://tweb/./src/lib/rlottie/rlottiePlayer.ts","webpack://tweb/./src/pages/pagesManager.ts","webpack://tweb/./src/pages/page.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/./public/recorder.min.js","webpack://tweb/./src/vendor/bezier-easing/index.js"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CustomEmojiElement, CustomEmojiRendererElement} from '../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../lib/rootScope';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport forEachReverse from '../helpers/array/forEachReverse';\nimport idleController from '../helpers/idleController';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport {fastRaf} from '../helpers/schedulers';\nimport {Middleware} from '../helpers/middleware';\n\nexport type AnimationItemGroup = '' | 'none' | 'chat' | 'lock' |\n 'STICKERS-POPUP' | 'emoticons-dropdown' | 'STICKERS-SEARCH' | 'GIFS-SEARCH' |\n `CHAT-MENU-REACTIONS-${number}` | 'INLINE-HELPER' | 'GENERAL-SETTINGS' | 'STICKER-VIEWER' | 'EMOJI' |\n 'EMOJI-STATUS' | `chat-${number}`;\nexport interface AnimationItem {\n el: HTMLElement,\n group: AnimationItemGroup,\n animation: AnimationItemWrapper,\n controlled?: boolean | Middleware\n};\n\nexport interface AnimationItemWrapper {\n remove: () => void;\n paused: boolean;\n pause: () => any;\n play: () => any;\n autoplay: boolean;\n // onVisibilityChange?: (visible: boolean) => boolean;\n};\n\nexport class AnimationIntersector {\n private observer: IntersectionObserver;\n private visible: Set;\n\n private overrideIdleGroups: Set;\n private byGroups: {[group in AnimationItemGroup]?: AnimationItem[]};\n private byPlayer: Map;\n private lockedGroups: {[group in AnimationItemGroup]?: true};\n private onlyOnePlayableGroup: AnimationItemGroup;\n\n private intersectionLockedGroups: {[group in AnimationItemGroup]?: true};\n private videosLocked: boolean;\n\n constructor() {\n this.observer = new IntersectionObserver((entries) => {\n // if(rootScope.idle.isIDLE) return;\n\n for(const entry of entries) {\n const target = entry.target;\n\n for(const group in this.byGroups) {\n if(this.intersectionLockedGroups[group as AnimationItemGroup]) {\n continue;\n }\n\n const animation = this.byGroups[group as AnimationItemGroup].find((p) => p.el === target);\n if(!animation) {\n continue;\n }\n\n if(entry.isIntersecting) {\n this.visible.add(animation);\n this.checkAnimation(animation, false);\n\n /* if(animation instanceof HTMLVideoElement && animation.dataset.src) {\n animation.src = animation.dataset.src;\n animation.load();\n } */\n } else {\n this.visible.delete(animation);\n this.checkAnimation(animation, true);\n\n const _animation = animation.animation;\n if(_animation instanceof RLottiePlayer/* && animation.cachingDelta === 2 */) {\n // console.warn('will clear cache', player);\n _animation.clearCache();\n }/* else if(animation instanceof HTMLVideoElement && animation.src) {\n animation.dataset.src = animation.src;\n animation.src = '';\n animation.load();\n } */\n }\n\n break;\n }\n }\n });\n\n this.visible = new Set();\n\n this.overrideIdleGroups = new Set();\n this.byGroups = {};\n this.byPlayer = new Map();\n this.lockedGroups = {};\n this.onlyOnePlayableGroup = '';\n\n this.intersectionLockedGroups = {};\n this.videosLocked = false;\n\n appMediaPlaybackController.addEventListener('play', ({doc}) => {\n if(doc.type === 'round') {\n this.videosLocked = true;\n this.checkAnimations2();\n }\n });\n\n appMediaPlaybackController.addEventListener('pause', () => {\n if(this.videosLocked) {\n this.videosLocked = false;\n this.checkAnimations2();\n }\n });\n\n idleController.addEventListener('change', (idle) => {\n this.checkAnimations2(idle);\n });\n }\n\n public setOverrideIdleGroup(group: string, override: boolean) {\n if(override) this.overrideIdleGroups.add(group);\n else this.overrideIdleGroups.delete(group);\n }\n\n public getAnimations(element: HTMLElement) {\n const found: AnimationItem[] = [];\n for(const group in this.byGroups) {\n for(const player of this.byGroups[group as AnimationItemGroup]) {\n if(player.el === element) {\n found.push(player);\n }\n }\n }\n\n return found;\n }\n\n public removeAnimation(player: AnimationItem) {\n const {el, animation} = player;\n // if(!(animation instanceof CustomEmojiElement)) {\n animation.remove();\n // }\n\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\n animation.src = '';\n animation.load();\n }, 1e3);\n }\n\n const group = this.byGroups[player.group];\n if(group) {\n indexOfAndSplice(group, player);\n if(!group.length) {\n delete this.byGroups[player.group];\n }\n }\n\n this.observer.unobserve(el);\n this.visible.delete(player);\n this.byPlayer.delete(animation);\n }\n\n public removeAnimationByPlayer(player: AnimationItemWrapper) {\n const item = this.byPlayer.get(player);\n if(item) {\n this.removeAnimation(item);\n }\n }\n\n public addAnimation(\n animation: AnimationItem['animation'],\n group: AnimationItemGroup = '',\n observeElement?: HTMLElement,\n controlled?: AnimationItem['controlled']\n ) {\n if(group === 'none' || this.byPlayer.has(animation)) {\n return;\n }\n\n if(!observeElement) {\n if(animation instanceof RLottiePlayer) {\n observeElement = animation.el[0];\n } else if(animation instanceof CustomEmojiRendererElement) {\n observeElement = animation.canvas;\n } else if(animation instanceof CustomEmojiElement) {\n observeElement = animation.placeholder ?? animation;\n } else if(animation instanceof HTMLElement) {\n observeElement = animation;\n }\n }\n\n const item: AnimationItem = {\n el: observeElement,\n animation: animation,\n group,\n controlled\n };\n\n if(controlled && typeof(controlled) !== 'boolean') {\n controlled.onClean(() => {\n this.removeAnimationByPlayer(animation);\n });\n }\n\n if(animation instanceof RLottiePlayer) {\n if(!rootScope.settings.stickers.loop && animation.loop) {\n animation.loop = rootScope.settings.stickers.loop;\n }\n }\n\n (this.byGroups[group as AnimationItemGroup] ??= []).push(item);\n this.observer.observe(item.el);\n this.byPlayer.set(animation, item);\n }\n\n public checkAnimations(\n blurred?: boolean,\n group?: AnimationItemGroup,\n destroy?: boolean,\n imitateIntersection?: boolean\n ) {\n // if(rootScope.idle.isIDLE) return;\n\n if(group !== undefined && !this.byGroups[group]) {\n // console.warn('no animation group:', group);\n return;\n }\n\n const groups = group !== undefined /* && false */ ? [group] : Object.keys(this.byGroups) as AnimationItemGroup[];\n\n for(const group of groups) {\n if(imitateIntersection && this.intersectionLockedGroups[group]) {\n continue;\n }\n\n const animations = this.byGroups[group];\n\n forEachReverse(animations, (animation) => {\n this.checkAnimation(animation, blurred, destroy);\n });\n }\n }\n\n public checkAnimations2(blurred?: boolean) {\n this.checkAnimations(blurred, undefined, undefined, true);\n }\n\n public checkAnimation(player: AnimationItem, blurred?: boolean, destroy?: boolean) {\n const {el, animation, group} = player;\n // return;\n if(destroy || (!this.lockedGroups[group] && !isInDOM(el))) {\n if(!player.controlled || destroy) {\n this.removeAnimation(player);\n }\n\n return;\n }\n\n if(blurred ||\n (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) ||\n (animation instanceof HTMLVideoElement && this.videosLocked)\n ) {\n if(!animation.paused) {\n // console.warn('pause animation:', animation);\n animation.pause();\n }\n } else if(animation.paused &&\n this.visible.has(player) &&\n animation.autoplay &&\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group) &&\n (!idleController.isIdle || this.overrideIdleGroups.has(player.group))\n ) {\n // console.warn('play animation:', animation);\n animation.play();\n }\n }\n\n public getOnlyOnePlayableGroup() {\n return this.onlyOnePlayableGroup;\n }\n\n public setOnlyOnePlayableGroup(group: AnimationItemGroup = '') {\n this.onlyOnePlayableGroup = group;\n }\n\n public lockGroup(group: AnimationItemGroup) {\n this.lockedGroups[group] = true;\n }\n\n public unlockGroup(group: AnimationItemGroup) {\n delete this.lockedGroups[group];\n this.checkAnimations(undefined, group);\n }\n\n public refreshGroup(group: AnimationItemGroup) {\n const animations = this.byGroups[group];\n if(!animations?.length) {\n return;\n }\n\n animations.forEach((animation) => {\n this.observer.unobserve(animation.el);\n });\n\n fastRaf(() => {\n animations.forEach((animation) => {\n this.observer.observe(animation.el);\n });\n });\n }\n\n public lockIntersectionGroup(group: AnimationItemGroup) {\n this.intersectionLockedGroups[group] = true;\n }\n\n public unlockIntersectionGroup(group: AnimationItemGroup) {\n delete this.intersectionLockedGroups[group];\n this.refreshGroup(group);\n }\n\n public toggleIntersectionGroup(group: AnimationItemGroup, lock: boolean) {\n if(lock) this.lockIntersectionGroup(group);\n else this.unlockIntersectionGroup(group);\n }\n}\n\nconst animationIntersector = new AnimationIntersector();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.animationIntersector = animationIntersector);\nexport default animationIntersector;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {IS_APPLE, IS_SAFARI} from '../environment/userAgent';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport simulateEvent from '../helpers/dom/dispatchEvent';\nimport type {SearchSuperContext} from './appSearchSuper.';\nimport {Document, DocumentAttribute, Message, PhotoSize} from '../layer';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport I18n from '../lib/langPack';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport copy from '../helpers/object/copy';\nimport deepEqual from '../helpers/object/deepEqual';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport getPeerTitle from './wrappers/getPeerTitle';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport onMediaLoad from '../helpers/onMediaLoad';\nimport EventListenerBase from '../helpers/eventListenerBase';\n\n// TODO: Safari: проверить стрим, включить его и сразу попробовать включить видео или другую песню\n// TODO: Safari: попробовать замаскировать подгрузку последнего чанка\n// TODO: Safari: пофиксить момент, когда заканчивается песня и пытаешься включить её заново - прогресс сразу в конце\n\nexport type MediaItem = {mid: number, peerId: PeerId};\n\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\n\nconst SHOULD_USE_SAFARI_FIX = (() => {\n try {\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\n } catch(err) {\n return false;\n }\n})();\n\nconst SEEK_OFFSET = 10;\n\nexport type MediaSearchContext = SearchSuperContext & Partial<{\n isScheduled: boolean,\n useSearch: boolean\n}>;\n\ntype MediaDetails = {\n peerId: PeerId,\n mid: number,\n docId: DocId,\n doc: MyDocument,\n message: Message.message,\n clean?: boolean,\n isScheduled?: boolean,\n isSingle?: boolean\n};\n\nexport type PlaybackMediaType = 'voice' | 'video' | 'audio';\n\nexport class AppMediaPlaybackController extends EventListenerBase<{\n play: (details: ReturnType) => void,\n pause: () => void,\n playbackParams: (params: ReturnType) => void,\n stop: () => void,\n}> {\n private container: HTMLElement;\n private media: Map> = new Map();\n private scheduled: AppMediaPlaybackController['media'] = new Map();\n private mediaDetails: Map = new Map();\n private playingMedia: HTMLMediaElement;\n private playingMediaType: PlaybackMediaType;\n\n private waitingMediaForLoad: Map>> = new Map();\n private waitingScheduledMediaForLoad: AppMediaPlaybackController['waitingMediaForLoad'] = new Map();\n private waitingDocumentsForLoad: {[docId: string]: Set} = {};\n\n public willBePlayedMedia: HTMLMediaElement;\n private searchContext: MediaSearchContext;\n\n private listLoader: SearchListLoader;\n\n public volume: number;\n public muted: boolean;\n public playbackRate: number;\n public loop: boolean;\n public round: boolean;\n private _volume: number;\n private _muted: boolean;\n private _playbackRate: number;\n private _loop: boolean;\n private _round: boolean;\n private lockedSwitchers: boolean;\n private playbackRates: Record = {\n voice: 1,\n video: 1,\n audio: 1\n };\n\n private pip: HTMLVideoElement;\n private managers: AppManagers;\n private skipMediaPlayEvent: boolean;\n\n construct(managers: AppManagers) {\n this.managers = managers;\n this.container = document.createElement('div');\n // this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\n this.container.style.cssText = 'display: none;';\n document.body.append(this.container);\n\n if(navigator.mediaSession) {\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\n play: this.browserPlay,\n pause: this.browserPause,\n stop: this.browserStop,\n seekbackward: this.browserSeekBackward,\n seekforward: this.browserSeekForward,\n seekto: this.browserSeekTo,\n previoustrack: this.browserPrevious,\n nexttrack: this.browserNext\n };\n\n for(const action in actions) {\n try {\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\n } catch(err) {\n console.warn('MediaSession action is not supported:', action);\n }\n }\n }\n\n rootScope.addEventListener('document_downloaded', (docId) => {\n const set = this.waitingDocumentsForLoad[docId];\n if(set) {\n for(const media of set) {\n this.onMediaDocumentLoad(media);\n }\n }\n });\n\n rootScope.addEventListener('media_play', () => {\n if(this.skipMediaPlayEvent) {\n this.skipMediaPlayEvent = false;\n return;\n }\n\n if(!this.pause() && this.pip) {\n this.pip.pause();\n }\n });\n\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\n const keys = [\n 'volume' as const,\n 'muted' as const,\n 'playbackRate' as const,\n 'loop' as const,\n 'round' as const\n ];\n keys.forEach((key) => {\n const _key = ('_' + key) as `_${typeof key}`;\n properties[key] = {\n get: () => this[_key],\n set: (value: number | boolean) => {\n if(this[_key] === value) {\n return;\n }\n\n // @ts-ignore\n this[_key] = value;\n if(this.playingMedia && (key !== 'loop' || this.playingMediaType === 'audio') && key !== 'round') {\n // @ts-ignore\n this.playingMedia[key] = value;\n }\n\n if(key === 'playbackRate' && this.playingMediaType !== undefined) {\n this.playbackRates[this.playingMediaType] = value as number;\n }\n\n this.dispatchPlaybackParams();\n }\n };\n });\n Object.defineProperties(this, properties);\n }\n\n private dispatchPlaybackParams() {\n this.dispatchEvent('playbackParams', this.getPlaybackParams());\n }\n\n public getPlaybackParams() {\n const {volume, muted, playbackRate, playbackRates, loop, round} = this;\n return {\n volume,\n muted,\n playbackRate,\n playbackRates,\n loop,\n round\n };\n }\n\n public setPlaybackParams(params: ReturnType) {\n this.playbackRates = params.playbackRates;\n this._volume = params.volume;\n this._muted = params.muted;\n this._playbackRate = params.playbackRate;\n this._loop = params.loop;\n this._round = params.round;\n }\n\n public seekBackward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\n }\n };\n\n public seekForward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\n }\n };\n\n public seekTo = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = details.seekTime;\n }\n };\n\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\n const {peerId, mid} = message;\n\n const isScheduled = !!message.pFlags.is_scheduled;\n const s = isScheduled ? this.scheduled : this.media;\n let storage = s.get(message.peerId);\n if(!storage) {\n s.set(message.peerId, storage = new Map());\n }\n\n let media = storage.get(mid);\n if(media) {\n return media;\n }\n\n const doc = getMediaFromMessage(message) as Document.document;\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\n // const source = document.createElement('source');\n // source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\n\n if(doc.type === 'round') {\n media.setAttribute('playsinline', 'true');\n // media.muted = true;\n }\n\n const details: MediaDetails = {\n peerId,\n mid,\n docId: doc.id,\n doc,\n message,\n clean,\n isScheduled: message.pFlags.is_scheduled\n };\n\n this.mediaDetails.set(media, details);\n\n // media.autoplay = true;\n media.volume = 1;\n // media.append(source);\n\n this.container.append(media);\n\n media.addEventListener('play', this.onPlay);\n media.addEventListener('pause', this.onPause);\n media.addEventListener('ended', this.onEnded);\n\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\n media.addEventListener('timeupdate', () => {\n this.managers.appMessagesManager.readMessages(peerId, [mid]);\n }, {once: true});\n }\n\n /* const onError = (e: Event) => {\n //console.log('appMediaPlaybackController: video onError', e);\n\n if(this.nextMid === mid) {\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\n if(this.nextMid && storage[this.nextMid]) {\n storage[this.nextMid].play();\n }\n });\n }\n };\n\n media.addEventListener('error', onError); */\n\n const deferred = deferredPromise();\n if(autoload) {\n deferred.resolve();\n } else {\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\n let waitingStorage = w.get(peerId);\n if(!waitingStorage) {\n w.set(peerId, waitingStorage = new Map());\n }\n\n waitingStorage.set(mid, deferred);\n }\n\n deferred.then(async() => {\n // media.autoplay = true;\n // console.log('will set media url:', media, doc, doc.type, doc.url);\n\n if(doc.supportsStreaming || (await this.managers.thumbsStorage.getCacheContext(doc)).url) {\n this.onMediaDocumentLoad(media);\n } else {\n let set = this.waitingDocumentsForLoad[doc.id];\n if(!set) {\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\n }\n\n set.add(media);\n appDownloadManager.downloadMediaURL({media: doc});\n }\n }/* , onError */);\n\n return media;\n }\n\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\n return s?.get(mid);\n }\n\n private onMediaDocumentLoad = async(media: HTMLMediaElement) => {\n const details = this.mediaDetails.get(media);\n const doc = await this.managers.appDocsManager.getDoc(details.docId);\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\n this.handleSafariStreamable(media);\n }\n\n // setTimeout(() => {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\n media.src = cacheContext.url;\n\n if(this.playingMedia === media) {\n media.playbackRate = this.playbackRate;\n\n if(doc.type === 'audio') {\n media.loop = this.loop;\n }\n }\n // }, doc.supportsStreaming ? 500e3 : 0);\n\n const set = this.waitingDocumentsForLoad[doc.id];\n if(set) {\n set.delete(media);\n\n if(!set.size) {\n delete this.waitingDocumentsForLoad[doc.id];\n }\n }\n };\n\n // safari подгрузит последний чанк и песня включится,\n // при этом этот чанк нельзя руками отдать из SW, потому что браузер тогда теряется\n private handleSafariStreamable(media: HTMLMediaElement) {\n media.addEventListener('play', () => {\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\n return;\n } */\n\n // media.volume = 0;\n const currentTime = media.currentTime;\n // this.setSafariBuffering(media, true);\n\n media.addEventListener('progress', () => {\n media.currentTime = media.duration - 1;\n\n media.addEventListener('progress', () => {\n media.currentTime = currentTime;\n // media.volume = 1;\n // this.setSafariBuffering(media, false);\n\n if(!media.paused) {\n media.play()/* .catch(() => {}) */;\n }\n }, {once: true});\n }, {once: true});\n }/* , {once: true} */);\n }\n\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\n const storage = w.get(peerId);\n if(!storage) {\n return;\n }\n\n const promise = storage.get(mid);\n if(promise) {\n promise.resolve();\n storage.delete(mid);\n\n if(!storage.size) {\n w.delete(peerId);\n }\n }\n }\n\n /**\n * Only for audio\n */\n public isSafariBuffering(media: HTMLMediaElement) {\n // @ts-ignore\n return !!media.safariBuffering;\n }\n\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\n // @ts-ignore\n media.safariBuffering = value;\n }\n\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\n if(document.pictureInPictureElement) {\n return;\n }\n\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\n\n const doc = getMediaFromMessage(message) as MyDocument;\n\n const artwork: MediaImage[] = [];\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n let title = '', artist = '';\n\n if(doc.thumbs?.length) {\n const size = doc.thumbs[doc.thumbs.length - 1];\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\n\n if(cacheContext.url) {\n artwork.push({\n src: cacheContext.url,\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\n type: 'image/jpeg'\n });\n } else {\n const download = appDownloadManager.downloadMediaURL({media: doc, thumb: size});\n download.then(() => {\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\n return;\n }\n\n this.setNewMediadata(message);\n });\n }\n }\n } else if(isVoice) {\n const peerId = message.fromId || message.peerId;\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n // const result = this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\n // if(result.cached) {\n // const url = await result.loadPromise;\n // artwork.push({\n // src: url,\n // sizes: '160x160',\n // type: 'image/jpeg'\n // });\n // } else {\n // result.loadPromise.then((url) => {\n // if(this.playingMedia !== playingMedia || !url) {\n // return;\n // }\n\n // this.setNewMediadata(message);\n // });\n // }\n }\n\n title = await getPeerTitle({peerId, plainText: true, onlyFirstName: false});\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\n }\n\n if(!isVoice) {\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n title = attribute?.title ?? doc.file_name;\n artist = attribute?.performer;\n }\n\n if(!artwork.length) {\n if(IS_APPLE) {\n if(IS_TOUCH_SUPPORTED) {\n artwork.push({\n src: `assets/img/apple-touch-icon-precomposed.png`,\n sizes: '180x180',\n type: 'image/png'\n });\n } else {\n artwork.push({\n src: `assets/img/apple-touch-icon.png`,\n sizes: '180x180',\n type: 'image/png'\n });\n }\n } else {\n [72, 96, 144, 192, 256, 384, 512].forEach((size) => {\n const sizes = `${size}x${size}`;\n artwork.push({\n src: `assets/img/android-chrome-${sizes}.png`,\n sizes,\n type: 'image/png'\n });\n });\n }\n }\n\n const metadata = new MediaMetadata({\n title,\n artist,\n artwork\n });\n\n navigator.mediaSession.metadata = metadata;\n }\n\n public setCurrentMediadata() {\n const {playingMedia} = this;\n if(!playingMedia) return;\n const message = this.getMessageByMedia(playingMedia);\n this.setNewMediadata(message, playingMedia);\n }\n\n private getMessageByMedia(media: HTMLMediaElement): Message.message {\n const details = this.mediaDetails.get(media);\n return details.message;\n // const {peerId, mid} = details;\n // const message = details.isScheduled ?\n // this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) :\n // this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n // return message;\n }\n\n public getPlayingDetails() {\n const {playingMedia} = this;\n if(!playingMedia) {\n return;\n }\n\n const message = this.getMessageByMedia(playingMedia);\n return {\n doc: getMediaFromMessage(message) as MyDocument,\n message,\n media: playingMedia,\n playbackParams: this.getPlaybackParams()\n };\n }\n\n private onPlay = (e?: Event) => {\n const media = e.target as HTMLMediaElement;\n const details = this.mediaDetails.get(media);\n const {peerId, mid} = details;\n\n // console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\n\n const pip = this.pip;\n if(pip) {\n pip.pause();\n }\n\n const message = this.getMessageByMedia(media);\n\n const previousMedia = this.playingMedia;\n if(previousMedia !== media) {\n this.stop();\n this.setMedia(media, message);\n\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\n const listLoader = this.listLoader;\n const current = listLoader.getCurrent();\n if(!current || !verify(current)) {\n let jumpLength: number;\n\n for(const withOtherSide of [false, true]) {\n const previous = listLoader.getPrevious(withOtherSide);\n\n let idx = previous.findIndex(verify);\n if(idx !== -1) {\n jumpLength = -(previous.length - idx);\n } else {\n const next = listLoader.getNext(withOtherSide);\n idx = next.findIndex(verify);\n if(idx !== -1) {\n jumpLength = idx + 1;\n }\n }\n\n if(jumpLength !== undefined) {\n break;\n }\n }\n\n if(jumpLength) {\n this.go(jumpLength, false);\n } else {\n this.setTargets({peerId, mid});\n }\n }\n }\n\n // audio_pause не успеет сработать без таймаута\n setTimeout(() => {\n if(this.playingMedia !== media) {\n return;\n }\n\n this.dispatchEvent('play', this.getPlayingDetails());\n this.pauseMediaInOtherTabs();\n }, 0);\n };\n\n private onPause = (e?: Event) => {\n /* const target = e.target as HTMLMediaElement;\n if(!isInDOM(target)) {\n this.container.append(target);\n target.play();\n return;\n } */\n\n // if(this.pip) {\n // this.pip.play();\n // }\n\n this.dispatchEvent('pause');\n };\n\n private onEnded = (e?: Event) => {\n if(!e.isTrusted) {\n return;\n }\n\n this.onPause(e);\n\n // console.log('on media end');\n\n const listLoader = this.listLoader;\n if(this.lockedSwitchers ||\n (!this.round && listLoader.current && !listLoader.next.length) ||\n !listLoader.getNext(true).length ||\n !this.next()) {\n this.stop();\n this.dispatchEvent('stop');\n }\n };\n\n public pauseMediaInOtherTabs() {\n this.skipMediaPlayEvent = true;\n rootScope.dispatchEvent('media_play');\n }\n\n // public get pip() {\n // return document.pictureInPictureElement as HTMLVideoElement;\n // }\n\n public toggle(play?: boolean, media = this.playingMedia) {\n if(!media) {\n return false;\n }\n\n if(play === undefined) {\n play = media.paused;\n }\n\n if(media.paused !== play) {\n return false;\n }\n\n if(play) {\n media.play();\n } else {\n media.pause();\n }\n\n return true;\n }\n\n public play = () => {\n return this.toggle(true);\n };\n\n public pause = () => {\n return this.toggle(false);\n };\n\n public stop = (media = this.playingMedia) => {\n if(!media) {\n return false;\n }\n\n if(!media.paused) {\n media.pause();\n }\n\n media.currentTime = 0;\n simulateEvent(media, 'ended');\n\n if(media === this.playingMedia) {\n const details = this.mediaDetails.get(media);\n if(details?.clean) {\n media.src = '';\n const peerId = details.peerId;\n const s = details.isScheduled ? this.scheduled : this.media;\n const storage = s.get(peerId);\n if(storage) {\n storage.delete(details.mid);\n\n if(!storage.size) {\n s.delete(peerId);\n }\n }\n\n media.remove();\n\n this.mediaDetails.delete(media);\n }\n\n this.playingMedia = undefined;\n this.playingMediaType = undefined;\n }\n\n return true;\n };\n\n public playItem = (item: MediaItem) => {\n const {peerId, mid} = item;\n const isScheduled = this.searchContext.isScheduled;\n const media = this.getMedia(peerId, mid, isScheduled);\n\n /* if(isSafari) {\n media.autoplay = true;\n } */\n\n media.play();\n\n setTimeout(() => {\n this.resolveWaitingForLoadMedia(peerId, mid, isScheduled);\n }, 0);\n };\n\n public go = (length: number, dispatchJump?: boolean) => {\n const listLoader = this.listLoader;\n if(this.lockedSwitchers || !listLoader) {\n return;\n }\n\n if(this.playingMediaType === 'audio') {\n return listLoader.goRound(length, dispatchJump);\n } else {\n return listLoader.go(length, dispatchJump);\n }\n };\n\n private bindBrowserCallback(cb: (video: HTMLVideoElement, details: MediaSessionActionDetails) => void) {\n const handler: MediaSessionActionHandler = (details) => {\n cb(this.pip, details);\n };\n\n return handler;\n }\n\n public browserPlay = this.bindBrowserCallback((video) => this.toggle(true, video));\n public browserPause = this.bindBrowserCallback((video) => this.toggle(false, video));\n public browserStop = this.bindBrowserCallback((video) => this.stop(video));\n public browserSeekBackward = this.bindBrowserCallback((video, details) => this.seekBackward(details, video));\n public browserSeekForward = this.bindBrowserCallback((video, details) => this.seekForward(details, video));\n public browserSeekTo = this.bindBrowserCallback((video, details) => this.seekTo(details, video));\n public browserNext = this.bindBrowserCallback((video) => video || this.next());\n public browserPrevious = this.bindBrowserCallback((video) => video ? this.seekToStart(video) : this.previous());\n\n public next = () => {\n return this.go(1);\n };\n\n public previous = () => {\n if(this.seekToStart(this.playingMedia)) {\n return;\n }\n\n return this.go(-1);\n };\n\n public seekToStart(media: HTMLMediaElement) {\n if(media?.currentTime > 5) {\n media.currentTime = 0;\n this.toggle(true, media);\n return true;\n }\n\n return false;\n }\n\n public willBePlayed(media: HTMLMediaElement) {\n this.willBePlayedMedia = media;\n }\n\n public setSearchContext(context: MediaSearchContext) {\n if(deepEqual(this.searchContext, context)) {\n return false;\n }\n\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\n return true;\n }\n\n public getSearchContext() {\n return this.searchContext;\n }\n\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\n let listLoader = this.listLoader;\n if(!listLoader) {\n listLoader = this.listLoader = new SearchListLoader({\n loadCount: 10,\n loadWhenLeft: 5,\n processItem: (message: Message.message) => {\n this.addMedia(message, false);\n return {peerId: message.peerId, mid: message.mid};\n },\n onJump: (item, older) => {\n this.playItem(item);\n },\n onEmptied: () => {\n this.dispatchEvent('stop');\n this.stop();\n }\n });\n } else {\n listLoader.reset();\n }\n\n const reverse = this.searchContext.folderId !== undefined ? false : true;\n if(prev) {\n listLoader.setTargets(prev, next, reverse);\n } else {\n listLoader.reverse = reverse;\n }\n\n listLoader.setSearchContext(this.searchContext);\n listLoader.current = current;\n\n listLoader.load(true);\n listLoader.load(false);\n }\n\n private getPlaybackMediaTypeFromMessage(message: Message.message) {\n const doc = getMediaFromMessage(message) as MyDocument;\n let mediaType: PlaybackMediaType = 'audio';\n if(doc?.type) {\n if(doc.type === 'voice' || doc.type === 'round') {\n mediaType = 'voice';\n } else if(doc.type === 'video') {\n mediaType = 'video';\n }\n }\n\n return mediaType;\n }\n\n public setMedia(media: HTMLMediaElement, message: Message.message) {\n const mediaType = this.getPlaybackMediaTypeFromMessage(message);\n\n this._playbackRate = this.playbackRates[mediaType];\n\n this.playingMedia = media;\n this.playingMediaType = mediaType;\n this.playingMedia.volume = this.volume;\n this.playingMedia.muted = this.muted;\n this.playingMedia.playbackRate = this.playbackRate;\n\n if(mediaType === 'audio') {\n this.playingMedia.loop = this.loop;\n }\n\n if('mediaSession' in navigator) {\n this.setNewMediadata(message);\n }\n }\n\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\n const playingMedia = this.playingMedia;\n\n const wasPlaying = this.pause();\n\n let onPlay: () => void;\n if(media) {\n onPlay = () => {\n const pip = this.pip;\n if(pip) {\n pip.pause();\n }\n\n this.pauseMediaInOtherTabs();\n };\n\n if(!media.paused) {\n onPlay();\n }\n\n media.addEventListener('play', onPlay);\n } else { // maybe it's voice recording\n this.pauseMediaInOtherTabs();\n }\n\n this.willBePlayed(undefined);\n if(media) this.setMedia(media, message);\n else this.playingMedia = undefined;\n this.toggleSwitchers(false);\n\n return (playPaused = wasPlaying) => {\n this.toggleSwitchers(true);\n\n if(playingMedia) {\n if(this.mediaDetails.get(playingMedia)) {\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\n } else {\n this.next() || this.previous();\n }\n }\n\n // If it's still not cleaned\n if(this.playingMedia === media) {\n this.playingMedia = undefined;\n this.playingMediaType = undefined;\n }\n\n if(media) {\n media.removeEventListener('play', onPlay);\n }\n\n // I don't remember what it was for\n // if(media && this.playingMedia === media) {\n // this.stop();\n // }\n\n if(playPaused) {\n this.play();\n }\n };\n }\n\n public toggleSwitchers(enabled: boolean) {\n this.lockedSwitchers = !enabled;\n }\n\n public setPictureInPicture(video: HTMLVideoElement) {\n this.pip = video;\n\n // let wasPlaying = this.pause();\n\n const listenerSetter = new ListenerSetter();\n listenerSetter.add(video)('leavepictureinpicture', () => {\n if(this.pip !== video) {\n return;\n }\n\n this.pip = undefined;\n // if(wasPlaying) {\n // this.play();\n // }\n\n listenerSetter.removeAll();\n }, {once: true});\n\n listenerSetter.add(video)('play', (e) => {\n if(this.playingMedia !== video) {\n this.pause();\n }\n\n this.pauseMediaInOtherTabs();\n // if(this.pause()) {\n // listenerSetter.add(video)('pause', () => {\n // this.play();\n // }, {once: true});\n // }\n });\n }\n}\n\nconst appMediaPlaybackController = new AppMediaPlaybackController();\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\nexport default appMediaPlaybackController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../environment/mediaMimeTypesSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport mediaSizes from '../helpers/mediaSizes';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport {Message} from '../layer';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport canSaveMessageMedia from '../lib/appManagers/utils/messages/canSaveMessageMedia';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport {MediaSearchContext} from './appMediaPlaybackController';\nimport AppMediaViewerBase, {MEDIA_VIEWER_CLASSNAME} from './appMediaViewerBase';\nimport {ButtonMenuItemOptionsVerifiable} from './buttonMenu';\nimport PopupDeleteMessages from './popups/deleteMessages';\nimport PopupForward from './popups/forward';\nimport Scrollable from './scrollable';\nimport appSidebarRight from './sidebarRight';\nimport AppSharedMediaTab from './sidebarRight/tabs/sharedMedia';\n\ntype AppMediaViewerTargetType = {\n element: HTMLElement,\n mid: number,\n peerId: PeerId\n};\nexport default class AppMediaViewer extends AppMediaViewerBase<'caption', 'delete' | 'forward', AppMediaViewerTargetType> {\n protected listLoader: SearchListLoader;\n protected btnMenuForward: ButtonMenuItemOptionsVerifiable;\n protected btnMenuDownload: ButtonMenuItemOptionsVerifiable;\n protected btnMenuDelete: ButtonMenuItemOptionsVerifiable;\n\n get searchContext() {\n return this.listLoader.searchContext;\n }\n\n constructor() {\n super(new SearchListLoader({\n processItem: (item) => {\n const isForDocument = this.searchContext.inputFilter._ === 'inputMessagesFilterDocument';\n const {mid, peerId} = item;\n const media: MyPhoto | MyDocument = getMediaFromMessage(item);\n\n if(!media) return;\n\n if(isForDocument && !AppMediaViewer.isMediaCompatibleForDocumentViewer(media)) {\n return;\n }\n\n return {element: null as HTMLElement, mid, peerId};\n }\n }), ['delete', 'forward']);\n\n this.listLoader.onEmptied = () => {\n this.close();\n };\n\n /* const stub = document.createElement('div');\n stub.classList.add(MEDIA_VIEWER_CLASSNAME + '-stub');\n this.content.main.prepend(stub); */\n\n this.content.caption = document.createElement('div');\n this.content.caption.classList.add(MEDIA_VIEWER_CLASSNAME + '-caption', 'spoilers-container'/* , 'media-viewer-stub' */);\n\n let captionTimeout: number;\n const setCaptionTimeout = () => {\n if(captionTimeout) {\n clearTimeout(captionTimeout);\n }\n\n captionTimeout = window.setTimeout(() => {\n captionTimeout = undefined;\n this.content.caption.classList.remove('is-focused');\n }, 800);\n };\n this.content.caption.addEventListener('touchstart', () => {\n if(!mediaSizes.isMobile) return;\n\n this.content.caption.classList.add('is-focused');\n\n if(captionTimeout) {\n clearTimeout(captionTimeout);\n captionTimeout = undefined;\n }\n\n document.addEventListener('touchend', setCaptionTimeout, {once: true});\n });\n\n const captionScrollable = new Scrollable(this.content.caption);\n captionScrollable.onAdditionalScroll = setCaptionTimeout;\n\n // this.content.main.append(this.content.caption);\n this.wholeDiv.append(this.content.caption);\n\n attachClickEvent(this.buttons.delete, this.onDeleteClick);\n\n const buttons: ButtonMenuItemOptionsVerifiable[] = [this.btnMenuForward = {\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick\n }, this.btnMenuDownload = {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }, this.btnMenuDelete = {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick\n }];\n\n this.setBtnMenuToggle(buttons);\n\n // * constructing html end\n\n this.setListeners();\n }\n\n protected setListeners() {\n super.setListeners();\n attachClickEvent(this.buttons.forward, this.onForwardClick);\n attachClickEvent(this.author.container, this.onAuthorClick);\n\n const onCaptionClick = (e: MouseEvent) => {\n const a = findUpTag(e.target, 'A');\n const spoiler = findUpClassName(e.target, 'spoiler');\n if(a instanceof HTMLAnchorElement && (!spoiler || this.content.caption.classList.contains('is-spoiler-visible'))) { // close viewer if it's t.me/ redirect\n const onclick = a.getAttribute('onclick');\n if(!onclick || onclick.includes('showMaskedAlert')) {\n return;\n }\n\n cancelEvent(e);\n\n this.close().then(() => {\n this.content.caption.removeEventListener('click', onCaptionClick, {capture: true});\n a.click();\n });\n\n return false;\n }\n };\n\n this.content.caption.addEventListener('click', onCaptionClick, {capture: true});\n }\n\n /* public close(e?: MouseEvent) {\n const good = !this.setMoverAnimationPromise;\n const promise = super.close(e);\n\n if(good) { // clear\n this.currentMessageId = 0;\n this.peerId = 0;\n }\n\n return promise;\n } */\n\n protected getMessageByPeer(peerId: PeerId, mid: number) {\n return this.searchContext.isScheduled ? this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) : this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n }\n\n onPrevClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await this.getMessageByPeer(target.peerId, target.mid), target.element, -1);\n };\n\n onNextClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await this.getMessageByPeer(target.peerId, target.mid), target.element, 1);\n };\n\n onDeleteClick = () => {\n const target = this.target;\n new PopupDeleteMessages(target.peerId, [target.mid], 'chat', () => {\n this.target = {element: this.content.media} as any;\n this.close();\n });\n };\n\n onForwardClick = () => {\n const target = this.target;\n if(target.mid) {\n // appSidebarRight.forwardTab.open([target.mid]);\n new PopupForward({\n [target.peerId]: [target.mid]\n }, () => {\n return this.close();\n });\n }\n };\n\n onAuthorClick = async(e: MouseEvent) => {\n const {mid, peerId} = this.target;\n if(mid && mid !== Number.MAX_SAFE_INTEGER) {\n const threadId = this.searchContext.threadId;\n const message = await this.getMessageByPeer(peerId, mid);\n this.close(e)\n // .then(() => mediaSizes.isMobile ? appSidebarRight.sharedMediaTab.closeBtn.click() : Promise.resolve())\n .then(async() => {\n if(mediaSizes.isMobile) {\n const tab = appSidebarRight.getTab(AppSharedMediaTab);\n if(tab) {\n tab.close();\n }\n }\n\n appImManager.setInnerPeer({\n peerId: message.peerId,\n lastMsgId: mid,\n type: threadId ? 'discussion' : undefined,\n threadId\n });\n });\n }\n };\n\n onDownloadClick = async() => {\n const {peerId, mid} = this.target;\n const message = await this.getMessageByPeer(peerId, mid);\n const media = getMediaFromMessage(message);\n if(!media) return;\n appDownloadManager.downloadToDisc({media, queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId});\n };\n\n private setCaption(message: MyMessage) {\n const caption = (message as Message.message).message;\n let html: Parameters[1] = '';\n if(caption) {\n html = wrapRichText(caption, {\n entities: (message as Message.message).totalEntities\n });\n }\n\n // html = 'Dandelion are a family of flowering plants that grow in many parts of the world.';\n setInnerHTML(this.content.caption.firstElementChild, html);\n this.content.caption.classList.toggle('hide', !caption);\n // this.content.container.classList.toggle('with-caption', !!caption);\n }\n\n public setSearchContext(context: MediaSearchContext) {\n this.listLoader.setSearchContext(context);\n\n return this;\n }\n\n public async openMedia(message: MyMessage, target?: HTMLElement, fromRight = 0, reverse = false,\n prevTargets: AppMediaViewerTargetType[] = [], nextTargets: AppMediaViewerTargetType[] = []/* , needLoadMore = true */) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const mid = message.mid;\n const fromId = (message as Message.message).fwd_from && !message.fromId ? (message as Message.message).fwd_from.from_name : message.fromId;\n const media = getMediaFromMessage(message);\n\n const noForwards = await this.managers.appPeersManager.noForwards(message.peerId);\n const isServiceMessage = message._ === 'messageService';\n const cantForwardMessage = isServiceMessage || !(await this.managers.appMessagesManager.canForward(message));\n const cantDownloadMessage = (isServiceMessage ? noForwards : cantForwardMessage) || !canSaveMessageMedia(message);\n const a: [(HTMLElement | ButtonMenuItemOptionsVerifiable)[], boolean][] = [\n [[this.buttons.forward, this.btnMenuForward], cantForwardMessage],\n [[this.buttons.download, this.btnMenuDownload], cantDownloadMessage],\n [[this.buttons.delete, this.btnMenuDelete], !(await this.managers.appMessagesManager.canDeleteMessage(message))]\n ];\n\n a.forEach(([buttons, hide]) => {\n buttons.forEach((button) => {\n if(button instanceof HTMLElement) {\n button.classList.toggle('hide', hide);\n } else {\n button.verify = () => !hide;\n }\n });\n });\n\n this.wholeDiv.classList.toggle('no-forwards', cantDownloadMessage);\n\n this.setCaption(message);\n const promise = super._openMedia(media, message.date, fromId, fromRight, target, reverse, prevTargets, nextTargets, message/* , needLoadMore */);\n this.target.mid = mid;\n this.target.peerId = message.peerId;\n\n return promise;\n }\n\n public static isMediaCompatibleForDocumentViewer(media: MyPhoto | MyDocument) {\n return media._ === 'photo' || MEDIA_MIME_TYPES_SUPPORTED.has(media.mime_type);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMediaPlaybackController from '../components/appMediaPlaybackController';\nimport {IS_APPLE_MOBILE, IS_MOBILE} from '../environment/userAgent';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport ListenerSetter, {Listener} from '../helpers/listenerSetter';\nimport {ButtonMenuSync} from '../components/buttonMenu';\nimport {ButtonMenuToggleHandler} from '../components/buttonMenuToggle';\nimport ControlsHover from '../helpers/dom/controlsHover';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../helpers/dom/fullScreen';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport MediaProgressLine from '../components/mediaProgressLine';\nimport VolumeSelector from '../components/volumeSelector';\nimport debounce from '../helpers/schedulers/debounce';\nimport overlayCounter from '../helpers/overlayCounter';\nimport onMediaLoad from '../helpers/onMediaLoad';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\n\nexport default class VideoPlayer extends ControlsHover {\n private static PLAYBACK_RATES = [0.5, 1, 1.5, 2];\n private static PLAYBACK_RATES_ICONS = ['playback_05', 'playback_1x', 'playback_15', 'playback_2x'];\n\n protected video: HTMLVideoElement;\n protected wrapper: HTMLDivElement;\n protected progress: MediaProgressLine;\n protected skin: 'default';\n\n protected listenerSetter: ListenerSetter;\n protected playbackRateButton: HTMLElement;\n protected pipButton: HTMLElement;\n\n /* protected videoParent: HTMLElement;\n protected videoWhichChild: number; */\n\n protected onPlaybackRackMenuToggle?: (open: boolean) => void;\n protected onPip?: (pip: boolean) => void;\n protected onPipClose?: () => void;\n\n constructor({video, play = false, streamable = false, duration, onPlaybackRackMenuToggle, onPip, onPipClose}: {\n video: HTMLVideoElement,\n play?: boolean,\n streamable?: boolean,\n duration?: number,\n onPlaybackRackMenuToggle?: VideoPlayer['onPlaybackRackMenuToggle'],\n onPip?: VideoPlayer['onPip'],\n onPipClose?: VideoPlayer['onPipClose']\n }) {\n super();\n\n this.video = video;\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('ckin__player');\n\n this.onPlaybackRackMenuToggle = onPlaybackRackMenuToggle;\n this.onPip = onPip;\n this.onPipClose = onPipClose;\n\n this.listenerSetter = new ListenerSetter();\n\n this.setup({\n element: this.wrapper,\n listenerSetter: this.listenerSetter,\n canHideControls: () => {\n return !this.video.paused && (!this.playbackRateButton || !this.playbackRateButton.classList.contains('menu-open'));\n },\n showOnLeaveToClassName: 'media-viewer-caption',\n ignoreClickClassName: 'ckin__controls'\n });\n\n video.parentNode.insertBefore(this.wrapper, video);\n this.wrapper.appendChild(video);\n\n this.skin = 'default';\n\n this.stylePlayer(duration);\n this.setBtnMenuToggle();\n\n if(this.skin === 'default') {\n const controls = this.wrapper.querySelector('.default__controls.ckin__controls') as HTMLDivElement;\n this.progress = new MediaProgressLine(video, streamable);\n controls.prepend(this.progress.container);\n }\n\n if(play/* && video.paused */) {\n const promise = video.play();\n promise.catch((err: Error) => {\n if(err.name === 'NotAllowedError') {\n video.muted = true;\n video.autoplay = true;\n video.play();\n }\n }).finally(() => { // due to autoplay, play will not call\n this.wrapper.classList.toggle('is-playing', !this.video.paused);\n });\n }\n }\n\n private stylePlayer(initDuration: number) {\n const {wrapper, video, skin, listenerSetter} = this;\n\n wrapper.classList.add(skin);\n\n const html = this.buildControls();\n wrapper.insertAdjacentHTML('beforeend', html);\n let timeDuration: HTMLElement;\n\n if(skin === 'default') {\n this.playbackRateButton = this.wrapper.querySelector('.playback-rate') as HTMLElement;\n this.pipButton = this.wrapper.querySelector('.pip') as HTMLElement;\n\n const toggle = wrapper.querySelectorAll('.toggle') as NodeListOf;\n const fullScreenButton = wrapper.querySelector('.fullscreen') as HTMLElement;\n const timeElapsed = wrapper.querySelector('#time-elapsed');\n timeDuration = wrapper.querySelector('#time-duration') as HTMLElement;\n timeDuration.textContent = toHHMMSS(video.duration | 0);\n\n const volumeSelector = new VolumeSelector(listenerSetter);\n\n const leftControls = wrapper.querySelector('.left-controls');\n volumeSelector.btn.classList.remove('btn-icon');\n leftControls.insertBefore(volumeSelector.btn, timeElapsed.parentElement);\n\n Array.from(toggle).forEach((button) => {\n attachClickEvent(button, () => {\n this.togglePlay();\n }, {listenerSetter: this.listenerSetter});\n });\n\n if(this.pipButton) {\n attachClickEvent(this.pipButton, () => {\n this.video.requestPictureInPicture();\n }, {listenerSetter: this.listenerSetter});\n\n const onPip = (pip: boolean) => {\n this.wrapper.style.visibility = pip ? 'hidden': '';\n if(this.onPip) {\n this.onPip(pip);\n }\n };\n\n const debounceTime = 20;\n const debouncedPip = debounce(onPip, debounceTime, false, true);\n\n listenerSetter.add(video)('enterpictureinpicture', () => {\n debouncedPip(true);\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n const onPause = () => {\n clearTimeout(timeout);\n if(this.onPipClose) {\n this.onPipClose();\n }\n };\n const listener = listenerSetter.add(video)('pause', onPause, {once: true}) as any as Listener;\n const timeout = setTimeout(() => {\n listenerSetter.remove(listener);\n }, debounceTime);\n }, {once: true});\n });\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n debouncedPip(false);\n });\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n attachClickEvent(video, () => {\n this.togglePlay();\n }, {listenerSetter: this.listenerSetter});\n\n listenerSetter.add(document)('keydown', (e: KeyboardEvent) => {\n if(overlayCounter.overlaysActive > 1 || document.pictureInPictureElement === video) { // forward popup is active, etc\n return;\n }\n\n const {key, code} = e;\n\n let good = true;\n if(code === 'KeyF') {\n this.toggleFullScreen();\n } else if(code === 'KeyM') {\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n } else if(code === 'Space') {\n this.togglePlay();\n } else if(e.altKey && (code === 'Equal' || code === 'Minus')) {\n const add = code === 'Equal' ? 1 : -1;\n const playbackRate = appMediaPlaybackController.playbackRate;\n const idx = VideoPlayer.PLAYBACK_RATES.indexOf(playbackRate);\n const nextIdx = idx + add;\n if(nextIdx >= 0 && nextIdx < VideoPlayer.PLAYBACK_RATES.length) {\n appMediaPlaybackController.playbackRate = VideoPlayer.PLAYBACK_RATES[nextIdx];\n }\n } else if(wrapper.classList.contains('ckin__fullscreen') && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n if(key === 'ArrowLeft') appMediaPlaybackController.seekBackward({action: 'seekbackward'});\n else appMediaPlaybackController.seekForward({action: 'seekforward'});\n } else {\n good = false;\n }\n\n if(good) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n listenerSetter.add(video)('dblclick', () => {\n if(!IS_TOUCH_SUPPORTED) {\n this.toggleFullScreen();\n }\n });\n\n attachClickEvent(fullScreenButton, () => {\n this.toggleFullScreen();\n }, {listenerSetter: this.listenerSetter});\n\n addFullScreenListener(wrapper, this.onFullScreen.bind(this, fullScreenButton), listenerSetter);\n\n listenerSetter.add(video)('timeupdate', () => {\n timeElapsed.textContent = toHHMMSS(video.currentTime | 0);\n });\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('played');\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('play', () => {\n this.hideControls(true);\n });\n }\n }, {once: true});\n\n listenerSetter.add(video)('pause', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(appMediaPlaybackController)('playbackParams', () => {\n this.setPlaybackRateIcon();\n });\n }\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('is-playing');\n });\n\n listenerSetter.add(video)('pause', () => {\n wrapper.classList.remove('is-playing');\n });\n\n if(video.duration || initDuration) {\n timeDuration.textContent = toHHMMSS(Math.round(video.duration || initDuration));\n } else {\n onMediaLoad(video).then(() => {\n timeDuration.textContent = toHHMMSS(Math.round(video.duration));\n });\n }\n }\n\n protected togglePlay() {\n this.video[this.video.paused ? 'play' : 'pause']();\n }\n\n private buildControls() {\n const skin = this.skin;\n if(skin === 'default') {\n return `\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n ${!IS_MOBILE && document.pictureInPictureEnabled ? `` : ''}\n \n
\n
\n
`;\n }\n }\n\n protected setBtnMenuToggle() {\n const buttons: Parameters[0]['buttons'] = VideoPlayer.PLAYBACK_RATES.map((rate, idx) => {\n return {\n // icon: VideoPlayer.PLAYBACK_RATES_ICONS[idx],\n regularText: rate + 'x',\n onClick: () => {\n appMediaPlaybackController.playbackRate = rate;\n }\n };\n });\n const btnMenu = ButtonMenuSync({buttons});\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler({\n el: this.playbackRateButton,\n onOpen: this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(true);\n } : undefined,\n onClose: this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(false);\n } : undefined\n });\n this.playbackRateButton.append(btnMenu);\n\n this.setPlaybackRateIcon();\n }\n\n protected setPlaybackRateIcon() {\n const playbackRateButton = this.playbackRateButton;\n VideoPlayer.PLAYBACK_RATES_ICONS.forEach((className) => {\n className = 'tgico-' + className;\n playbackRateButton.classList.remove(className);\n });\n\n let idx = VideoPlayer.PLAYBACK_RATES.indexOf(appMediaPlaybackController.playbackRate);\n if(idx === -1) idx = VideoPlayer.PLAYBACK_RATES.indexOf(1);\n\n playbackRateButton.classList.add('tgico-' + VideoPlayer.PLAYBACK_RATES_ICONS[idx]);\n }\n\n protected toggleFullScreen() {\n const player = this.wrapper;\n\n // * https://caniuse.com/#feat=fullscreen\n if(IS_APPLE_MOBILE) {\n const video = this.video as any;\n video.webkitEnterFullscreen();\n video.enterFullscreen();\n return;\n }\n\n if(!isFullScreen()) {\n /* const videoParent = this.video.parentElement;\n const videoWhichChild = whichChild(this.video);\n const needVideoRemount = videoParent !== player;\n\n if(needVideoRemount) {\n this.videoParent = videoParent;\n this.videoWhichChild = videoWhichChild;\n player.prepend(this.video);\n } */\n\n requestFullScreen(player);\n } else {\n /* if(this.videoParent) {\n const {videoWhichChild, videoParent} = this;\n if(!videoWhichChild) {\n videoParent.prepend(this.video);\n } else {\n videoParent.insertBefore(this.video, videoParent.children[videoWhichChild]);\n }\n\n this.videoParent = null;\n this.videoWhichChild = -1;\n } */\n\n cancelFullScreen();\n }\n }\n\n protected onFullScreen(fullScreenButton: HTMLElement) {\n const isFull = isFullScreen();\n this.wrapper.classList.toggle('ckin__fullscreen', isFull);\n if(!isFull) {\n fullScreenButton.classList.remove('tgico-smallscreen');\n fullScreenButton.classList.add('tgico-fullscreen');\n fullScreenButton.setAttribute('title', 'Full Screen');\n } else {\n fullScreenButton.classList.remove('tgico-fullscreen');\n fullScreenButton.classList.add('tgico-smallscreen');\n fullScreenButton.setAttribute('title', 'Exit Full Screen');\n }\n }\n\n public cleanup() {\n super.cleanup();\n this.listenerSetter.removeAll();\n this.progress.removeListeners();\n this.onPlaybackRackMenuToggle = this.onPip = undefined;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise from '../helpers/cancellablePromise';\nimport mediaSizes from '../helpers/mediaSizes';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from '../environment/userAgent';\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {logger} from '../lib/logger';\nimport VideoPlayer from '../lib/mediaPlayer';\nimport rootScope from '../lib/rootScope';\nimport animationIntersector from './animationIntersector';\nimport appMediaPlaybackController, {AppMediaPlaybackController} from './appMediaPlaybackController';\nimport AvatarElement from './avatar';\nimport ButtonIcon from './buttonIcon';\nimport {ButtonMenuItemOptions} from './buttonMenu';\nimport ButtonMenuToggle from './buttonMenuToggle';\nimport ProgressivePreloader from './preloader';\nimport SwipeHandler from './swipeHandler';\nimport {formatFullSentTime} from '../helpers/date';\nimport appNavigationController, {NavigationItem} from './appNavigationController';\nimport {Message} from '../layer';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport renderImageFromUrl, {renderImageFromUrlPromise} from '../helpers/dom/renderImageFromUrl';\nimport getVisibleRect from '../helpers/dom/getVisibleRect';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport fillPropertyValue from '../helpers/fillPropertyValue';\nimport generatePathData from '../helpers/generatePathData';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {doubleRaf, fastRaf} from '../helpers/schedulers';\nimport RangeSelector from './rangeSelector';\nimport windowSize from '../helpers/windowSize';\nimport ListLoader from '../helpers/listLoader';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport {isFullScreen} from '../helpers/dom/fullScreen';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport createVideo from '../helpers/dom/createVideo';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getStrippedThumbIfNeeded from '../helpers/getStrippedThumbIfNeeded';\nimport setAttachmentSize from '../helpers/setAttachmentSize';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport LazyLoadQueueBase from './lazyLoadQueueBase';\nimport overlayCounter from '../helpers/overlayCounter';\nimport {ThumbCache} from '../lib/storages/thumbs';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport wrapPeerTitle from './wrappers/peerTitle';\nimport {toastNew} from './toast';\n\nconst ZOOM_STEP = 0.5;\nconst ZOOM_INITIAL_VALUE = 1;\nconst ZOOM_MIN_VALUE = 0.5;\nconst ZOOM_MAX_VALUE = 4;\n\n// TODO: масштабирование картинок (не SVG) при ресайзе, и правильный возврат на исходную позицию\n// TODO: картинки \"обрезаются\" если возвращаются или появляются с места, где есть их перекрытие (топбар, поле ввода)\n// TODO: видео в мобильной вёрстке, если показываются элементы управления: если свайпнуть в сторону, то элементы вернутся на место, т.е. прыгнут - это не ок, надо бы замаскировать\n\nexport const MEDIA_VIEWER_CLASSNAME = 'media-viewer';\n\nexport default class AppMediaViewerBase<\n ContentAdditionType extends string,\n ButtonsAdditionType extends string,\n TargetType extends {element: HTMLElement\n}> extends EventListenerBase<{\n setMoverBefore: () => void,\n setMoverAfter: () => void\n}> {\n protected wholeDiv: HTMLElement;\n protected overlaysDiv: HTMLElement;\n protected author: {[k in 'container' | 'avatarEl' | 'nameEl' | 'date']: HTMLElement} = {} as any;\n protected content: {[k in 'main' | 'container' | 'media' | 'mover' | ContentAdditionType]: HTMLElement} = {} as any;\n protected buttons: {[k in 'download' | 'close' | 'prev' | 'next' | 'mobile-close' | 'zoom' | ButtonsAdditionType]: HTMLElement} = {} as any;\n protected topbar: HTMLElement;\n protected moversContainer: HTMLElement;\n\n protected tempId = 0;\n protected preloader: ProgressivePreloader = null;\n protected preloaderStreamable: ProgressivePreloader = null;\n\n // protected targetContainer: HTMLElement = null;\n // protected loadMore: () => void = null;\n\n protected log: ReturnType;\n\n protected isFirstOpen = true;\n\n // protected needLoadMore = true;\n\n protected pageEl = document.getElementById('page-chats') as HTMLDivElement;\n\n protected setMoverPromise: Promise;\n protected setMoverAnimationPromise: Promise;\n\n protected lazyLoadQueue: LazyLoadQueueBase;\n\n protected highlightSwitchersTimeout: number;\n\n protected onDownloadClick: (e: MouseEvent) => void;\n protected onPrevClick: (target: TargetType) => void;\n protected onNextClick: (target: TargetType) => void;\n\n protected videoPlayer: VideoPlayer;\n\n protected zoomElements: {\n container: HTMLElement,\n btnOut: HTMLElement,\n btnIn: HTMLElement,\n rangeSelector: RangeSelector\n } = {} as any;\n // protected zoomValue = ZOOM_INITIAL_VALUE;\n protected zoomSwipeHandler: SwipeHandler;\n protected zoomSwipeStartX = 0;\n protected zoomSwipeStartY = 0;\n protected zoomSwipeX = 0;\n protected zoomSwipeY = 0;\n\n protected ctrlKeyDown: boolean;\n protected releaseSingleMedia: ReturnType;\n protected navigationItem: NavigationItem;\n\n protected managers: AppManagers;\n\n get target() {\n return this.listLoader.current;\n }\n\n set target(value) {\n this.listLoader.current = value;\n }\n\n constructor(\n protected listLoader: ListLoader,\n topButtons: Array['buttons']>\n ) {\n super(false);\n\n this.managers = rootScope.managers;\n\n this.log = logger('AMV');\n this.preloader = new ProgressivePreloader();\n this.preloaderStreamable = new ProgressivePreloader({\n cancelable: false,\n streamable: true\n });\n this.preloader.construct();\n this.preloaderStreamable.construct();\n this.lazyLoadQueue = new LazyLoadQueueBase();\n\n this.wholeDiv = document.createElement('div');\n this.wholeDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-whole');\n\n this.overlaysDiv = document.createElement('div');\n this.overlaysDiv.classList.add('overlays');\n\n const mainDiv = document.createElement('div');\n mainDiv.classList.add(MEDIA_VIEWER_CLASSNAME);\n\n const topbar = this.topbar = document.createElement('div');\n topbar.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar', MEDIA_VIEWER_CLASSNAME + '-appear');\n\n const topbarLeft = document.createElement('div');\n topbarLeft.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar-left');\n\n this.buttons['mobile-close'] = ButtonIcon('close', {onlyMobile: true});\n\n // * author\n this.author.container = document.createElement('div');\n this.author.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-author', 'no-select');\n const authorRight = document.createElement('div');\n\n this.author.avatarEl = new AvatarElement();\n this.author.avatarEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-userpic', 'avatar-44');\n\n this.author.nameEl = document.createElement('div');\n this.author.nameEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-name');\n\n this.author.date = document.createElement('div');\n this.author.date.classList.add(MEDIA_VIEWER_CLASSNAME + '-date');\n\n authorRight.append(this.author.nameEl, this.author.date);\n\n this.author.container.append(this.author.avatarEl, authorRight);\n\n // * buttons\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-buttons');\n\n topButtons.concat(['download', 'zoom', 'close']).forEach((name) => {\n const button = ButtonIcon(name, {noRipple: true});\n this.buttons[name] = button;\n buttonsDiv.append(button);\n });\n\n this.buttons.zoom.classList.add('zoom-in');\n\n // * zoom\n this.zoomElements.container = document.createElement('div');\n this.zoomElements.container.classList.add('zoom-container');\n\n this.zoomElements.btnOut = ButtonIcon('zoomout', {noRipple: true});\n attachClickEvent(this.zoomElements.btnOut, () => this.changeZoom(false));\n this.zoomElements.btnIn = ButtonIcon('zoomin', {noRipple: true});\n attachClickEvent(this.zoomElements.btnIn, () => this.changeZoom(true));\n\n this.zoomElements.rangeSelector = new RangeSelector({\n step: ZOOM_STEP,\n min: ZOOM_MIN_VALUE,\n max: ZOOM_MAX_VALUE,\n withTransition: true\n }, ZOOM_INITIAL_VALUE);\n this.zoomElements.rangeSelector.setListeners();\n this.zoomElements.rangeSelector.setHandlers({\n onScrub: this.setZoomValue,\n onMouseUp: () => this.setZoomValue()\n });\n\n this.zoomElements.container.append(this.zoomElements.btnOut, this.zoomElements.rangeSelector.container, this.zoomElements.btnIn);\n\n this.wholeDiv.append(this.zoomElements.container);\n\n // * content\n this.content.main = document.createElement('div');\n this.content.main.classList.add(MEDIA_VIEWER_CLASSNAME + '-content');\n\n this.content.container = document.createElement('div');\n this.content.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-container');\n\n this.content.media = document.createElement('div');\n this.content.media.classList.add(MEDIA_VIEWER_CLASSNAME + '-media');\n\n this.content.container.append(this.content.media);\n\n this.content.main.append(this.content.container);\n mainDiv.append(this.content.main);\n this.overlaysDiv.append(mainDiv);\n // * overlays end\n\n topbarLeft.append(this.buttons['mobile-close'], this.author.container);\n topbar.append(topbarLeft, buttonsDiv);\n\n this.buttons.prev = document.createElement('div');\n this.buttons.prev.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-left`;\n this.buttons.prev.innerHTML = ``;\n\n this.buttons.next = document.createElement('div');\n this.buttons.next.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-right`;\n this.buttons.next.innerHTML = ``;\n\n this.moversContainer = document.createElement('div');\n this.moversContainer.classList.add(MEDIA_VIEWER_CLASSNAME + '-movers');\n\n this.wholeDiv.append(this.overlaysDiv, this.buttons.prev, this.buttons.next, this.topbar, this.moversContainer);\n\n // * constructing html end\n\n this.listLoader.onLoadedMore = () => {\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n };\n\n this.setNewMover();\n }\n\n protected setListeners() {\n attachClickEvent(this.buttons.download, this.onDownloadClick);\n [this.buttons.close, this.buttons['mobile-close'], this.preloaderStreamable.preloader].forEach((el) => {\n attachClickEvent(el, this.close.bind(this));\n });\n\n ([[-1, this.buttons.prev], [1, this.buttons.next]] as [number, HTMLElement][]).forEach(([moveLength, button]) => {\n // attachClickEvent(button, (e) => {\n button.addEventListener('click', (e) => {\n cancelEvent(e);\n if(this.setMoverPromise) return;\n\n this.listLoader.go(moveLength);\n });\n });\n\n attachClickEvent(this.buttons.zoom, () => {\n if(this.isZooming()) this.toggleZoom(false);\n else {\n this.changeZoom(true);\n }\n });\n\n // ! cannot use the function because it'll cancel slide event on touch devices\n // attachClickEvent(this.wholeDiv, this.onClick);\n this.wholeDiv.addEventListener('click', this.onClick);\n\n this.listLoader.onJump = (item, older) => {\n if(older) this.onNextClick(item);\n else this.onPrevClick(item);\n };\n\n if(IS_TOUCH_SUPPORTED) {\n const swipeHandler = new SwipeHandler({\n element: this.wholeDiv,\n onSwipe: (xDiff, yDiff) => {\n if(isFullScreen()) {\n return;\n }\n\n const percents = Math.abs(xDiff) / windowSize.width;\n if(percents > .2 || xDiff > 125) {\n // console.log('will swipe', xDiff);\n\n if(xDiff > 0) {\n this.buttons.prev.click();\n } else {\n this.buttons.next.click();\n }\n\n return true;\n }\n\n const percentsY = Math.abs(yDiff) / windowSize.height;\n if(percentsY > .2 || yDiff > 125) {\n this.close();\n return true;\n }\n\n return false;\n },\n verifyTouchTarget: (evt) => {\n console.log('verify');\n // * Fix for seek input\n if((evt.target as HTMLElement).tagName === 'INPUT' || findUpClassName(evt.target, 'media-viewer-caption')) {\n return false;\n }\n\n return true;\n }\n });\n }\n }\n\n protected toggleZoom(enable?: boolean) {\n const isVisible = this.isZooming();\n if(this.zoomElements.rangeSelector.mousedown || this.ctrlKeyDown) {\n enable = true;\n }\n\n if(isVisible === enable) return;\n\n if(enable === undefined) {\n enable = !isVisible;\n }\n\n this.buttons.zoom.classList.toggle('zoom-in', !enable);\n this.zoomElements.container.classList.toggle('is-visible', enable);\n const zoomValue = enable ? this.zoomElements.rangeSelector.value : 1;\n this.setZoomValue(zoomValue);\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n\n if(this.videoPlayer) {\n this.videoPlayer.lockControls(enable ? false : undefined);\n }\n\n if(enable) {\n if(!this.zoomSwipeHandler) {\n let lastDiffX: number, lastDiffY: number;\n const multiplier = 1;\n this.zoomSwipeHandler = new SwipeHandler({\n element: this.moversContainer,\n onFirstSwipe: () => {\n lastDiffX = lastDiffY = 0;\n this.moversContainer.classList.add('no-transition');\n },\n onSwipe: (xDiff, yDiff) => {\n [xDiff, yDiff] = [xDiff * multiplier, yDiff * multiplier];\n this.zoomSwipeX += xDiff - lastDiffX;\n this.zoomSwipeY += yDiff - lastDiffY;\n [lastDiffX, lastDiffY] = [xDiff, yDiff];\n\n this.setZoomValue();\n },\n onReset: () => {\n this.moversContainer.classList.remove('no-transition');\n },\n cursor: 'move'\n });\n } else {\n this.zoomSwipeHandler.setListeners();\n }\n\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n } else if(!enable) {\n this.zoomSwipeHandler.removeListeners();\n }\n }\n\n protected changeZoom(add: boolean) {\n this.zoomElements.rangeSelector.addProgress(ZOOM_STEP * (add ? 1 : -1));\n this.setZoomValue();\n }\n\n protected setZoomValue = (value = this.zoomElements.rangeSelector.value) => {\n // this.zoomValue = value;\n if(value === ZOOM_INITIAL_VALUE) {\n this.zoomSwipeX = 0;\n this.zoomSwipeY = 0;\n }\n\n this.moversContainer.style.transform = `matrix(${value}, 0, 0, ${value}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`;\n\n this.zoomElements.btnOut.classList.toggle('inactive', value === ZOOM_MIN_VALUE);\n this.zoomElements.btnIn.classList.toggle('inactive', value === ZOOM_MAX_VALUE);\n\n this.toggleZoom(value !== ZOOM_INITIAL_VALUE);\n };\n\n protected isZooming() {\n return this.zoomElements.container.classList.contains('is-visible');\n }\n\n protected setBtnMenuToggle(buttons: ButtonMenuItemOptions[]) {\n const btnMenuToggle = ButtonMenuToggle({buttonOptions: {onlyMobile: true}, direction: 'bottom-left', buttons});\n this.topbar.append(btnMenuToggle);\n }\n\n public close(e?: MouseEvent) {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.setMoverAnimationPromise) return Promise.reject();\n\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n }\n\n this.lazyLoadQueue.clear();\n\n const promise = this.setMoverToTarget(this.target?.element, true).then(({onAnimationEnd}) => onAnimationEnd);\n\n this.listLoader.reset();\n (this.listLoader as SearchListLoader).cleanup && (this.listLoader as SearchListLoader).cleanup();\n this.setMoverPromise = null;\n this.tempId = -1;\n if((window as any).appMediaViewer === this) {\n (window as any).appMediaViewer = undefined;\n }\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n promise.then(() => {\n appSidebarRight.forwardTab.closeBtn.click();\n });\n } */\n\n this.removeGlobalListeners();\n\n this.zoomSwipeHandler = undefined;\n\n promise.finally(() => {\n this.wholeDiv.remove();\n this.toggleOverlay(false);\n });\n\n return promise;\n }\n\n protected toggleOverlay(active: boolean) {\n overlayCounter.isOverlayActive = active;\n animationIntersector.checkAnimations2(active);\n }\n\n protected toggleGlobalListeners(active: boolean) {\n if(active) this.setGlobalListeners();\n else this.removeGlobalListeners();\n }\n\n protected removeGlobalListeners() {\n if(this.zoomSwipeHandler) {\n this.zoomSwipeHandler.removeListeners();\n }\n\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n window.removeEventListener('wheel', this.onWheel, {capture: true});\n }\n\n protected setGlobalListeners() {\n if(this.isZooming()) {\n this.zoomSwipeHandler.setListeners();\n }\n\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n if(!IS_TOUCH_SUPPORTED) window.addEventListener('wheel', this.onWheel, {passive: false, capture: true});\n }\n\n onClick = (e: MouseEvent) => {\n if(this.setMoverAnimationPromise) return;\n\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') return;\n cancelEvent(e);\n\n if(IS_TOUCH_SUPPORTED) {\n if(this.highlightSwitchersTimeout) {\n clearTimeout(this.highlightSwitchersTimeout);\n } else {\n this.wholeDiv.classList.add('highlight-switchers');\n }\n\n this.highlightSwitchersTimeout = window.setTimeout(() => {\n this.wholeDiv.classList.remove('highlight-switchers');\n this.highlightSwitchersTimeout = 0;\n }, 3e3);\n\n return;\n }\n\n const isZooming = this.isZooming();\n let mover: HTMLElement = null;\n const classNames = ['ckin__player', 'media-viewer-buttons', 'media-viewer-author', 'media-viewer-caption', 'zoom-container'];\n if(isZooming) {\n classNames.push('media-viewer-movers');\n }\n\n classNames.find((s) => {\n try {\n mover = findUpClassName(target, s);\n if(mover) return true;\n } catch(err) {return false;}\n });\n\n if(/* target === this.mediaViewerDiv */!mover || (!isZooming && (target.tagName === 'IMG' || target.tagName === 'image'))) {\n this.close();\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n // this.log('onKeyDown', e);\n if(overlayCounter.overlaysActive > 1) {\n return;\n }\n\n const key = e.key;\n\n let good = true;\n if(key === 'ArrowRight') {\n this.buttons.next.click();\n } else if(key === 'ArrowLeft') {\n this.buttons.prev.click();\n } else if(key === '-' || key === '=') {\n if(this.ctrlKeyDown) {\n this.changeZoom(key === '=');\n }\n } else {\n good = false;\n }\n\n if(e.ctrlKey || e.metaKey) {\n this.ctrlKeyDown = true;\n }\n\n if(good) {\n cancelEvent(e);\n }\n };\n\n private onKeyUp = (e: KeyboardEvent) => {\n if(overlayCounter.overlaysActive > 1) {\n return;\n }\n\n if(!(e.ctrlKey || e.metaKey)) {\n this.ctrlKeyDown = false;\n\n if(this.isZooming()) {\n this.setZoomValue();\n }\n }\n };\n\n private onWheel = (e: WheelEvent) => {\n if(overlayCounter.overlaysActive > 1 || (findUpClassName(e.target, 'media-viewer-caption') && !this.ctrlKeyDown)) {\n return;\n }\n\n cancelEvent(e);\n\n if(this.ctrlKeyDown) {\n const scrollingUp = e.deltaY < 0;\n // if(!scrollingUp && !this.isZooming()) return;\n this.changeZoom(!!scrollingUp);\n }\n };\n\n protected async setMoverToTarget(target: HTMLElement, closing = false, fromRight = 0) {\n this.dispatchEvent('setMoverBefore');\n\n const mover = this.content.mover;\n\n if(!closing) {\n mover.innerHTML = '';\n // mover.append(this.buttons.prev, this.buttons.next);\n }\n\n const zoomValue = this.isZooming() && closing /* && false */ ? this.zoomElements.rangeSelector.value : ZOOM_INITIAL_VALUE;\n /* if(!(zoomValue > 1 && closing)) */ this.removeCenterFromMover(mover);\n\n const wasActive = fromRight !== 0;\n\n const delay = rootScope.settings.animationsEnabled ? (wasActive ? 350 : 200) : 0;\n // let delay = wasActive ? 350 : 10000;\n\n /* if(wasActive) {\n this.moveTheMover(mover);\n mover = this.setNewMover();\n } */\n\n /* if(DEBUG) {\n this.log('setMoverToTarget', target, closing, wasActive, fromRight);\n } */\n\n let realParent: HTMLElement;\n\n let rect: DOMRect;\n if(target) {\n if(target instanceof AvatarElement || target.classList.contains('grid-item')/* || target.classList.contains('document-ico') */) {\n realParent = target;\n rect = target.getBoundingClientRect();\n } else if(target instanceof SVGImageElement || target.parentElement instanceof SVGForeignObjectElement) {\n realParent = findUpClassName(target, 'attachment');\n rect = realParent.getBoundingClientRect();\n } else if(target.classList.contains('profile-avatars-avatar')) {\n realParent = findUpClassName(target, 'profile-avatars-container');\n rect = realParent.getBoundingClientRect();\n\n // * if not active avatar\n if(closing && target.getBoundingClientRect().left !== rect.left) {\n target = realParent = rect = undefined;\n }\n }\n }\n\n if(!target) {\n target = this.content.media;\n }\n\n if(!rect) {\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n }\n\n let needOpacity = false;\n if(target !== this.content.media && !target.classList.contains('profile-avatars-avatar')) {\n const overflowElement = findUpClassName(realParent, 'scrollable');\n const visibleRect = getVisibleRect(realParent, overflowElement, true);\n\n if(closing && (!visibleRect || visibleRect.overflow.vertical === 2 || visibleRect.overflow.horizontal === 2)) {\n target = this.content.media;\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n } else if(visibleRect && (visibleRect.overflow.vertical === 1 || visibleRect.overflow.horizontal === 1)) {\n needOpacity = true;\n }\n }\n\n const containerRect = this.content.media.getBoundingClientRect();\n\n let transform = '';\n let left: number;\n let top: number;\n\n if(wasActive) {\n left = fromRight === 1 ? windowSize.width : -containerRect.width;\n top = containerRect.top;\n } else {\n left = rect.left;\n top = rect.top;\n }\n\n /* if(zoomValue > 1) { // 33\n // const diffX = (rect.width * zoomValue - rect.width) / 4;\n const diffX = (rect.width * zoomValue - rect.width) / 2;\n const diffY = (rect.height * zoomValue - rect.height) / 4;\n // left -= diffX;\n // top += diffY;\n } */\n\n transform += `translate3d(${left}px,${top}px,0) `;\n\n /* if(wasActive) {\n left = fromRight === 1 ? appPhotosManager.windowW / 2 : -(containerRect.width + appPhotosManager.windowW / 2);\n transform += `translate(${left}px,-50%) `;\n } else {\n left = rect.left - (appPhotosManager.windowW / 2);\n top = rect.top - (appPhotosManager.windowH / 2);\n transform += `translate(${left}px,${top}px) `;\n } */\n\n let aspecter: HTMLDivElement;\n if(target instanceof HTMLImageElement || target instanceof HTMLVideoElement || target.tagName === 'DIV') {\n if(mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter')) {\n aspecter = mover.firstElementChild as HTMLDivElement;\n\n const player = aspecter.querySelector('.ckin__player');\n if(player) {\n const video = player.firstElementChild as HTMLVideoElement;\n aspecter.append(video);\n player.remove();\n }\n\n if(!aspecter.style.cssText) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n mover.classList.remove('active');\n this.setFullAspect(aspecter, containerRect, rect);\n void mover.offsetLeft; // reflow\n mover.classList.add('active');\n }\n } else {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-viewer-aspecter'/* , 'disable-hover' */);\n mover.prepend(aspecter);\n }\n\n aspecter.style.cssText = `width: ${rect.width}px; height: ${rect.height}px; transform: scale3d(${containerRect.width / rect.width}, ${containerRect.height / rect.height}, 1);`;\n }\n\n mover.style.width = containerRect.width + 'px';\n mover.style.height = containerRect.height + 'px';\n\n // const scaleX = rect.width / (containerRect.width * zoomValue);\n // const scaleY = rect.height / (containerRect.height * zoomValue);\n const scaleX = rect.width / containerRect.width;\n const scaleY = rect.height / containerRect.height;\n if(!wasActive) {\n transform += `scale3d(${scaleX},${scaleY},1) `;\n }\n\n let borderRadius = window.getComputedStyle(realParent).getPropertyValue('border-radius');\n const brSplitted = fillPropertyValue(borderRadius) as string[];\n borderRadius = brSplitted.map((r) => (parseInt(r) / scaleX) + 'px').join(' ');\n if(!wasActive) {\n mover.style.borderRadius = borderRadius;\n }\n // let borderRadius = '0px 0px 0px 0px';\n\n if(closing && zoomValue !== 1) {\n // const width = this.moversContainer.scrollWidth * scaleX;\n // const height = this.moversContainer.scrollHeight * scaleY;\n const willBeLeft = windowSize.width / 2 - rect.width / 2;\n const willBeTop = windowSize.height / 2 - rect.height / 2;\n const left = rect.left - willBeLeft/* + (width - rect.width) / 2 */;\n const top = rect.top - willBeTop/* + (height - rect.height) / 2 */;\n this.moversContainer.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${left}, ${top})`;\n } else {\n mover.style.transform = transform;\n }\n\n needOpacity && (mover.style.opacity = '0'/* !closing ? '0' : '' */);\n\n /* if(wasActive) {\n this.log('setMoverToTarget', mover.style.transform);\n } */\n\n let path: SVGPathElement;\n const isOut = target.classList.contains('is-out');\n\n const deferred = this.setMoverAnimationPromise = deferredPromise();\n const ret = {onAnimationEnd: deferred};\n\n const timeout = setTimeout(() => {\n if(!deferred.isFulfilled && !deferred.isRejected) {\n deferred.resolve();\n }\n }, 1000);\n\n deferred.finally(() => {\n this.dispatchEvent('setMoverAfter');\n\n if(this.setMoverAnimationPromise === deferred) {\n this.setMoverAnimationPromise = null;\n }\n\n clearTimeout(timeout);\n });\n\n if(!closing) {\n let mediaElement: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\n let src: string;\n\n // if(target instanceof HTMLVideoElement) {\n const selector = 'video, img, .canvas-thumbnail';\n const queryFrom = target.matches(selector) ? target.parentElement : target;\n const elements = Array.from(queryFrom.querySelectorAll(selector)) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if(target instanceof HTMLImageElement) {\n canvas.width = target.naturalWidth;\n canvas.height = target.naturalHeight;\n } else if(target instanceof HTMLVideoElement) {\n canvas.width = target.videoWidth;\n canvas.height = target.videoHeight;\n } else if(target instanceof HTMLCanvasElement) {\n canvas.width = target.width;\n canvas.height = target.height;\n }\n\n canvas.className = 'canvas-thumbnail thumbnail media-photo';\n context.drawImage(target as HTMLImageElement | HTMLCanvasElement, 0, 0);\n target = canvas;\n }\n // }\n\n if(target.tagName === 'DIV' || target.tagName === 'AVATAR-ELEMENT') { // useContainerAsTarget\n const images = Array.from(target.querySelectorAll('img')) as HTMLImageElement[];\n const image = images.pop();\n if(image) {\n mediaElement = new Image();\n src = image.src;\n mover.append(mediaElement);\n }\n /* mediaElement = new Image();\n src = target.style.backgroundImage.slice(5, -2); */\n } else if(target instanceof HTMLImageElement) {\n mediaElement = new Image();\n src = target.src;\n } else if(target instanceof HTMLVideoElement) {\n mediaElement = createVideo();\n mediaElement.src = target.src;\n } else if(target instanceof SVGSVGElement) {\n const clipId = target.dataset.clipId;\n const newClipId = clipId + '-mv';\n\n const {width, height} = containerRect;\n\n const newSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n newSvg.setAttributeNS(null, 'width', '' + width);\n newSvg.setAttributeNS(null, 'height', '' + height);\n\n // нижние два свойства для масштабирования\n newSvg.setAttributeNS(null, 'viewBox', `0 0 ${width} ${height}`);\n newSvg.setAttributeNS(null, 'preserveAspectRatio', 'xMidYMid meet');\n\n newSvg.insertAdjacentHTML('beforeend', target.firstElementChild.outerHTML.replace(clipId, newClipId));\n newSvg.insertAdjacentHTML('beforeend', target.lastElementChild.outerHTML.replace(clipId, newClipId));\n\n // теперь надо выставить новую позицию для хвостика\n const defs = newSvg.firstElementChild;\n const use = defs.firstElementChild.firstElementChild as SVGUseElement;\n if(use instanceof SVGUseElement) {\n let transform = use.getAttributeNS(null, 'transform');\n transform = transform.replace(/translate\\((.+?), (.+?)\\) scale\\((.+?), (.+?)\\)/, (match, x, y, sX, sY) => {\n x = +x;\n if(x !== 2) {\n x = width - (2 / scaleX);\n } else {\n x = 2 / scaleX;\n }\n\n y = height;\n\n return `translate(${x}, ${y}) scale(${+sX / scaleX}, ${+sY / scaleY})`;\n });\n use.setAttributeNS(null, 'transform', transform);\n\n // и новый RECT\n path = defs.firstElementChild.lastElementChild as SVGPathElement;\n\n // код ниже нужен только чтобы скрыть моргание до момента как сработает таймаут\n let d: string;\n const br: [number, number, number, number] = borderRadius.split(' ').map((v) => parseInt(v)) as any;\n if(isOut) d = generatePathData(0, 0, width - 9 / scaleX, height, ...br);\n else d = generatePathData(9 / scaleX, 0, width - 9 / scaleX, height, ...br);\n path.setAttributeNS(null, 'd', d);\n }\n\n const foreignObject = newSvg.lastElementChild;\n foreignObject.setAttributeNS(null, 'width', '' + containerRect.width);\n foreignObject.setAttributeNS(null, 'height', '' + containerRect.height);\n\n mover.prepend(newSvg);\n } else if(target instanceof HTMLCanvasElement) {\n mediaElement = target;\n }\n\n if(aspecter) {\n aspecter.style.borderRadius = borderRadius;\n\n if(mediaElement) {\n aspecter.append(mediaElement);\n }\n }\n\n mediaElement = mover.querySelector('video, img');\n if(mediaElement instanceof HTMLImageElement) {\n mediaElement.classList.add('thumbnail');\n if(!aspecter) {\n mediaElement.style.width = containerRect.width + 'px';\n mediaElement.style.height = containerRect.height + 'px';\n }\n\n if(src) {\n await renderImageFromUrlPromise(mediaElement, src);\n }\n }/* else if(mediaElement instanceof HTMLVideoElement && mediaElement.firstElementChild && ((mediaElement.firstElementChild as HTMLSourceElement).src || src)) {\n await new Promise((resolve, reject) => {\n mediaElement.addEventListener('loadeddata', resolve);\n\n if(src) {\n (mediaElement.firstElementChild as HTMLSourceElement).src = src;\n }\n });\n } */\n\n mover.style.display = '';\n\n fastRaf(() => {\n mover.classList.add(wasActive ? 'moving' : 'active');\n });\n } else {\n /* if(mover.classList.contains('center')) {\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n } */\n\n if(target instanceof SVGSVGElement) {\n path = mover.querySelector('path');\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, false, isOut, borderRadius);\n }\n }\n\n if(target.classList.contains('media-viewer-media')) {\n mover.classList.add('hiding');\n }\n\n this.toggleWholeActive(false);\n\n // return ret;\n\n setTimeout(() => {\n mover.style.borderRadius = borderRadius;\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = borderRadius;\n }\n }, delay / 2);\n\n setTimeout(() => {\n mover.innerHTML = '';\n mover.classList.remove('moving', 'active', 'hiding');\n mover.style.cssText = 'display: none;';\n\n deferred.resolve();\n }, delay);\n\n mover.classList.remove('opening');\n\n return ret;\n }\n\n mover.classList.add('opening');\n\n // await new Promise((resolve) => setTimeout(resolve, 0));\n // await new Promise((resolve) => window.requestAnimationFrame(resolve));\n // * одного RAF'а недостаточно, иногда анимация с одним не срабатывает (преимущественно на мобильных)\n await doubleRaf();\n\n // чтобы проверить установленную позицию - раскомментировать\n // throw '';\n\n // await new Promise((resolve) => setTimeout(resolve, 5e3));\n\n mover.style.transform = `translate3d(${containerRect.left}px,${containerRect.top}px,0) scale3d(1,1,1)`;\n // mover.style.transform = `translate(-50%,-50%) scale(1,1)`;\n needOpacity && (mover.style.opacity = ''/* closing ? '0' : '' */);\n\n if(aspecter) {\n this.setFullAspect(aspecter, containerRect, rect);\n }\n\n // throw '';\n\n setTimeout(() => {\n mover.style.borderRadius = '';\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = '';\n }\n }, 0/* delay / 2 */);\n\n mover.dataset.timeout = '' + setTimeout(() => {\n mover.classList.remove('moving', 'opening');\n\n if(aspecter) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n if(mover.querySelector('video') || true) {\n mover.classList.remove('active');\n aspecter.style.cssText = '';\n void mover.offsetLeft; // reflow\n }\n\n // aspecter.classList.remove('disable-hover');\n }\n\n // эти строки нужны для установки центральной позиции, в случае ресайза это будет нужно\n mover.classList.add('center', 'no-transition');\n /* mover.style.left = mover.style.top = '50%';\n mover.style.transform = 'translate(-50%, -50%)';\n void mover.offsetLeft; // reflow */\n\n // это уже нужно для будущих анимаций\n mover.classList.add('active');\n delete mover.dataset.timeout;\n\n deferred.resolve();\n }, delay);\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, true, isOut, borderRadius);\n }\n\n return ret;\n }\n\n protected toggleWholeActive(active: boolean) {\n if(active) {\n this.wholeDiv.classList.add('active');\n } else {\n this.wholeDiv.classList.add('backwards');\n setTimeout(() => {\n this.wholeDiv.classList.remove('active');\n }, 0);\n }\n }\n\n protected setFullAspect(aspecter: HTMLDivElement, containerRect: DOMRect, rect: DOMRect) {\n /* let media = aspecter.firstElementChild;\n let proportion: number;\n if(media instanceof HTMLImageElement) {\n proportion = media.naturalWidth / media.naturalHeight;\n } else if(media instanceof HTMLVideoElement) {\n proportion = media.videoWidth / media.videoHeight;\n } */\n const proportion = containerRect.width / containerRect.height;\n\n let {width, height} = rect;\n /* if(proportion === 1) {\n aspecter.style.cssText = '';\n } else { */\n if(proportion > 0) {\n width = height * proportion;\n } else {\n height = width * proportion;\n }\n\n // this.log('will set style aspecter:', `width: ${width}px; height: ${height}px; transform: scale(${containerRect.width / width}, ${containerRect.height / height});`);\n\n aspecter.style.cssText = `width: ${width}px; height: ${height}px; transform: scale3d(${containerRect.width / width}, ${containerRect.height / height}, 1);`;\n // }\n }\n\n protected sizeTailPath(path: SVGPathElement, rect: DOMRect, scaleX: number, delay: number, upscale: boolean, isOut: boolean, borderRadius: string) {\n const start = Date.now();\n const {width, height} = rect;\n delay = delay / 2;\n\n const br = borderRadius.split(' ').map((v) => parseInt(v));\n\n const step = () => {\n const diff = Date.now() - start;\n\n let progress = delay ? diff / delay : 1;\n if(progress > 1) progress = 1;\n if(upscale) progress = 1 - progress;\n\n const _br: [number, number, number, number] = br.map((v) => v * progress) as any;\n\n let d: string;\n if(isOut) d = generatePathData(0, 0, width - (9 / scaleX * progress), height, ..._br);\n else d = generatePathData(9 / scaleX * progress, 0, width/* width - (9 / scaleX * progress) */, height, ..._br);\n path.setAttributeNS(null, 'd', d);\n\n if(diff < delay) fastRaf(step);\n };\n\n // window.requestAnimationFrame(step);\n step();\n }\n\n protected removeCenterFromMover(mover: HTMLElement) {\n if(mover.classList.contains('center')) {\n // const rect = mover.getBoundingClientRect();\n const rect = this.content.media.getBoundingClientRect();\n mover.style.transform = `translate3d(${rect.left}px,${rect.top}px,0)`;\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n mover.classList.remove('no-transition');\n }\n }\n\n protected moveTheMover(mover: HTMLElement, toLeft = true) {\n const windowW = windowSize.width;\n\n this.removeCenterFromMover(mover);\n\n // mover.classList.remove('active');\n mover.classList.add('moving');\n\n if(mover.dataset.timeout) { // и это тоже всё из-за скейла видео, так бы это не нужно было\n clearTimeout(+mover.dataset.timeout);\n }\n\n const rect = mover.getBoundingClientRect();\n\n const newTransform = mover.style.transform.replace(/translate3d\\((.+?),/, (match, p1) => {\n const x = toLeft ? -rect.width : windowW;\n // const x = toLeft ? -(rect.right + (rect.width / 2)) : windowW / 2;\n\n return match.replace(p1, x + 'px');\n });\n\n // //////this.log('set newTransform:', newTransform, mover.style.transform, toLeft);\n mover.style.transform = newTransform;\n\n setTimeout(() => {\n mover.remove();\n }, 350);\n }\n\n protected setNewMover() {\n const newMover = document.createElement('div');\n newMover.classList.add('media-viewer-mover');\n newMover.style.display = 'none';\n\n if(this.content.mover) {\n const oldMover = this.content.mover;\n oldMover.parentElement.append(newMover);\n } else {\n this.moversContainer.append(newMover);\n }\n\n return this.content.mover = newMover;\n }\n\n protected updateMediaSource(target: HTMLElement, url: string, tagName: 'video' | 'img') {\n // if(target instanceof SVGSVGElement) {\n const el = target.tagName.toLowerCase() === tagName ? target : target.querySelector(tagName) as HTMLElement;\n if(el && !findUpClassName(target, 'document')) {\n if(findUpClassName(target, 'attachment')) {\n // two parentElements because element can be contained in aspecter\n const preloader = target.parentElement.parentElement.querySelector('.preloader-container') as HTMLElement;\n if(preloader) {\n if(tagName === 'video') {\n if(preloader.classList.contains('manual')) {\n preloader.click();\n // return;\n }\n\n return;\n }\n\n preloader.remove();\n }\n }\n\n if((el as HTMLImageElement).src !== url) {\n renderImageFromUrl(el, url);\n }\n\n // ! костыль, но он тут даже и не нужен\n if(el.classList.contains('thumbnail') && el.parentElement.classList.contains('media-container-aspecter')) {\n el.classList.remove('thumbnail');\n }\n }\n /* } else {\n\n } */\n }\n\n protected setAuthorInfo(fromId: PeerId | string, timestamp: number) {\n const isPeerId = fromId.isPeerId();\n let wrapTitlePromise: Promise | HTMLElement;\n if(isPeerId) {\n wrapTitlePromise = wrapPeerTitle({\n peerId: fromId as PeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n })\n } else {\n const title = wrapTitlePromise = document.createElement('span');\n title.append(wrapEmojiText(fromId));\n title.classList.add('peer-title');\n }\n\n const oldAvatar = this.author.avatarEl;\n const newAvatar = this.author.avatarEl = (oldAvatar.cloneNode() as AvatarElement);\n\n return Promise.all([\n (this.author.avatarEl as AvatarElement).updateWithOptions({\n peerId: fromId as PeerId || NULL_PEER_ID,\n peerTitle: isPeerId ? undefined : '' + fromId\n }),\n\n wrapTitlePromise\n ]).then(([_, title]) => {\n if(this.author.avatarEl !== newAvatar) {\n return;\n }\n\n replaceContent(this.author.date, formatFullSentTime(timestamp));\n replaceContent(this.author.nameEl, title);\n oldAvatar.replaceWith(this.author.avatarEl);\n });\n }\n\n protected async _openMedia(\n media: MyDocument | MyPhoto,\n timestamp: number,\n fromId: PeerId | string,\n fromRight: number,\n target?: HTMLElement,\n reverse = false,\n prevTargets: TargetType[] = [],\n nextTargets: TargetType[] = [],\n message?: MyMessage\n /* , needLoadMore = true */\n ) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n /* if(DEBUG) {\n this.log('openMedia:', media, fromId, prevTargets, nextTargets);\n } */\n\n const setAuthorPromise = this.setAuthorInfo(fromId, timestamp);\n\n const isDocument = media._ === 'document';\n const isVideo = isDocument && media.mime_type && ((['video', 'gif'] as MyDocument['type'][]).includes(media.type) || media.mime_type.indexOf('video/') === 0);\n\n if(this.isFirstOpen) {\n // this.targetContainer = targetContainer;\n // this.needLoadMore = needLoadMore;\n this.isFirstOpen = false;\n this.listLoader.setTargets(prevTargets, nextTargets, reverse);\n (window as any).appMediaViewer = this;\n // this.loadMore = loadMore;\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n appSidebarRight.forwardTab.closeBtn.click();\n await new Promise((resolve) => setTimeout(resolve, 200));\n } */\n }\n\n if(this.listLoader.next.length < 10) {\n setTimeout(() => {\n this.listLoader.load(true);\n }, 0);\n }\n\n // if(prevTarget && (!prevTarget.parentElement || !this.isElementVisible(this.targetContainer, prevTarget))) prevTarget = null;\n // if(nextTarget && (!nextTarget.parentElement || !this.isElementVisible(this.targetContainer, nextTarget))) nextTarget = null;\n\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n\n const container = this.content.media;\n const useContainerAsTarget = !target || target === container;\n if(useContainerAsTarget) target = container;\n\n this.target = {element: target} as any;\n const tempId = ++this.tempId;\n\n if(container.firstElementChild) {\n container.innerHTML = '';\n }\n\n // ok set\n\n const wasActive = fromRight !== 0;\n if(wasActive) {\n this.moveTheMover(this.content.mover, fromRight === 1);\n this.setNewMover();\n } else {\n this.toggleOverlay(true);\n this.setGlobalListeners();\n await setAuthorPromise;\n\n if(!this.wholeDiv.parentElement) {\n this.pageEl.insertBefore(this.wholeDiv, document.getElementById('main-columns'));\n void this.wholeDiv.offsetLeft; // reflow\n }\n\n this.toggleWholeActive(true);\n\n if(!IS_MOBILE_SAFARI) {\n this.navigationItem = {\n type: 'media',\n onPop: (canAnimate) => {\n if(this.setMoverAnimationPromise) {\n return false;\n }\n\n this.close();\n }\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n }\n\n // //////this.log('wasActive:', wasActive);\n\n const mover = this.content.mover;\n\n const maxWidth = windowSize.width;\n // const maxWidth = this.pageEl.scrollWidth;\n // TODO: const maxHeight = mediaSizes.isMobile ? appPhotosManager.windowH : appPhotosManager.windowH - 100;\n let padding = 0;\n const windowH = windowSize.height;\n if(windowH < 1000000 && !mediaSizes.isMobile) {\n padding = 120;\n }\n const maxHeight = windowH - 120 - padding;\n let thumbPromise: Promise = Promise.resolve();\n const size = setAttachmentSize(media, container, maxWidth, maxHeight, mediaSizes.isMobile ? false : true, undefined, !!(isDocument && media.w && media.h)).photoSize;\n if(useContainerAsTarget) {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(media, size.type);\n let img: HTMLImageElement | HTMLCanvasElement;\n if(cacheContext.downloaded) {\n img = new Image();\n img.src = cacheContext.url;\n } else {\n const gotThumb = getStrippedThumbIfNeeded(media, cacheContext, true);\n if(gotThumb) {\n thumbPromise = gotThumb.loadPromise;\n img = gotThumb.image;\n }\n }\n\n if(img) {\n img.classList.add('thumbnail');\n container.append(img);\n }\n }\n\n // need after setAttachmentSize\n /* if(useContainerAsTarget) {\n target = target.querySelector('img, video') || target;\n } */\n\n const supportsStreaming: boolean = !!(isDocument && media.supportsStreaming);\n const preloader = supportsStreaming ? this.preloaderStreamable : this.preloader;\n\n const getCacheContext = () => {\n return this.managers.thumbsStorage.getCacheContext(media, size?.type);\n };\n\n let setMoverPromise: Promise;\n if(isVideo) {\n // //////this.log('will wrap video', media, size);\n\n // потому что для safari нужно создать элемент из event'а\n // const video = document.createElement('video');\n const useController = message && media.type !== 'gif';\n const video = /* useController ?\n appMediaPlaybackController.addMedia(message, false, true) as HTMLVideoElement :\n */createVideo({pip: useController});\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', cancelEvent);\n }\n\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n // return; // set and don't move\n // if(wasActive) return;\n // return;\n\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n // const video = mover.querySelector('video') || document.createElement('video');\n\n const moverVideo = mover.querySelector('video');\n if(moverVideo) {\n moverVideo.remove();\n }\n\n // video.src = '';\n\n video.setAttribute('playsinline', 'true');\n\n // * fix for playing video if viewer is closed (https://contest.com/javascript-web-bonus/entry1425#issue11629)\n video.addEventListener('timeupdate', () => {\n if(this.tempId !== tempId) {\n video.pause();\n }\n });\n\n this.addEventListener('setMoverAfter', () => {\n video.src = '';\n video.load();\n }, {once: true});\n\n if(IS_SAFARI) {\n // test stream\n // video.controls = true;\n video.autoplay = true;\n }\n\n if(media.type === 'gif') {\n video.muted = true;\n video.autoplay = true;\n video.loop = true;\n } else if(media.duration < 60) {\n video.loop = true;\n }\n\n // if(!video.parentElement) {\n div.append(video);\n // }\n\n const canPlayThrough = new Promise((resolve) => {\n video.addEventListener('canplay', resolve, {once: true});\n });\n\n const createPlayer = () => {\n if(media.type !== 'gif') {\n video.dataset.ckin = 'default';\n video.dataset.overlay = '1';\n\n Promise.all([canPlayThrough, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n return;\n }\n\n // const play = useController ? appMediaPlaybackController.willBePlayedMedia === video : true;\n const play = true;\n const player = this.videoPlayer = new VideoPlayer({\n video,\n play,\n streamable: supportsStreaming,\n onPlaybackRackMenuToggle: (open) => {\n this.wholeDiv.classList.toggle('hide-caption', !!open);\n },\n onPip: (pip) => {\n const otherMediaViewer = (window as any).appMediaViewer;\n if(!pip && otherMediaViewer && otherMediaViewer !== this) {\n this.releaseSingleMedia = undefined;\n this.close();\n return;\n }\n\n const mover = this.moversContainer.lastElementChild as HTMLElement;\n mover.classList.toggle('hiding', pip);\n this.toggleWholeActive(!pip);\n this.toggleOverlay(!pip);\n this.toggleGlobalListeners(!pip);\n\n if(this.navigationItem) {\n if(pip) appNavigationController.removeItem(this.navigationItem);\n else appNavigationController.pushItem(this.navigationItem);\n }\n\n if(useController) {\n if(pip) {\n // appMediaPlaybackController.toggleSwitchers(true);\n\n this.releaseSingleMedia(false);\n this.releaseSingleMedia = undefined;\n\n appMediaPlaybackController.setPictureInPicture(video);\n } else {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n }\n }\n },\n onPipClose: () => {\n // this.target = undefined;\n // this.toggleWholeActive(false);\n // this.toggleOverlay(false);\n this.close();\n }\n });\n player.addEventListener('toggleControls', (show) => {\n this.wholeDiv.classList.toggle('has-video-controls', show);\n });\n\n this.addEventListener('setMoverBefore', () => {\n this.wholeDiv.classList.remove('has-video-controls');\n this.videoPlayer.cleanup();\n this.videoPlayer = undefined;\n }, {once: true});\n\n if(this.isZooming()) {\n this.videoPlayer.lockControls(false);\n }\n /* div.append(video);\n mover.append(player.wrapper); */\n });\n }\n };\n\n if(supportsStreaming) {\n onAnimationEnd.then(() => {\n if(video.readyState < video.HAVE_FUTURE_DATA) {\n // console.log('ppp 1');\n preloader.attach(mover, true);\n }\n\n /* canPlayThrough.then(() => {\n preloader.detach();\n }); */\n });\n\n const attachCanPlay = () => {\n video.addEventListener('canplay', () => {\n // console.log('ppp 2');\n preloader.detach();\n video.parentElement.classList.remove('is-buffering');\n }, {once: true});\n };\n\n video.addEventListener('waiting', () => {\n const loading = video.networkState === video.NETWORK_LOADING;\n const isntEnoughData = video.readyState < video.HAVE_FUTURE_DATA;\n\n // this.log('video waiting for progress', loading, isntEnoughData);\n if(loading && isntEnoughData) {\n attachCanPlay();\n\n // console.log('ppp 3');\n preloader.attach(mover, true);\n\n // поставлю класс для плеера, чтобы убрать большую иконку пока прелоадер на месте\n video.parentElement.classList.add('is-buffering');\n }\n });\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', (e) => {\n cancelEvent(e);\n });\n }\n\n attachCanPlay();\n }\n\n // if(!video.src || media.url !== video.src) {\n const load = async() => {\n /* if(useController) {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n } */\n\n const promise: Promise = supportsStreaming ? Promise.resolve() : appDownloadManager.downloadMediaURL({media});\n\n if(!supportsStreaming) {\n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n // console.log('ppp 4');\n preloader.attach(mover, true, promise);\n }\n });\n }\n\n Promise.all([promise, onAnimationEnd]).then(async() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed video');\n return;\n }\n\n const url = (await getCacheContext()).url;\n\n video.addEventListener('error', () => {\n toastNew({\n langPackKey: IS_MOBILE ? 'Video.Unsupported.Mobile' : 'Video.Unsupported.Desktop'\n });\n\n if(video.error.code !== 4) {\n this.log.error('Error ' + video.error.code + '; details: ' + video.error.message);\n }\n\n preloader?.detach();\n }, {once: true});\n\n if(target instanceof SVGSVGElement/* && (video.parentElement || !isSafari) */) { // if video exists\n // if(!video.parentElement) {\n div.firstElementChild.lastElementChild.append(video);\n // }\n } else {\n renderImageFromUrl(video, url);\n }\n\n // * have to set options (especially playbackRate) after src\n // * https://github.com/videojs/video.js/issues/2516\n if(useController) {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n\n this.addEventListener('setMoverBefore', () => {\n if(this.releaseSingleMedia) {\n this.releaseSingleMedia();\n this.releaseSingleMedia = undefined;\n }\n }, {once: true});\n }\n\n this.updateMediaSource(target, url, 'video');\n\n createPlayer();\n });\n\n return promise;\n };\n\n this.lazyLoadQueue.unshift({load});\n // } else createPlayer();\n });\n\n setMoverPromise = thumbPromise.then(set);\n } else {\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n // return; // set and don't move\n // if(wasActive) return;\n // return;\n\n const load = async() => {\n const cancellablePromise = isDocument ? appDownloadManager.downloadMediaURL({media}) : appDownloadManager.downloadMediaURL({media, thumb: size});\n\n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n this.preloader.attachPromise(cancellablePromise);\n // this.preloader.attach(mover, true, cancellablePromise);\n }\n });\n\n Promise.all([onAnimationEnd, cancellablePromise]).then(async() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed photo');\n return;\n }\n\n // /////this.log('indochina', blob);\n\n const url = (await getCacheContext()).url;\n if(target instanceof SVGSVGElement) {\n this.updateMediaSource(target, url, 'img');\n this.updateMediaSource(mover, url, 'img');\n\n if(mediaSizes.isMobile) {\n const imgs = mover.querySelectorAll('img');\n if(imgs && imgs.length) {\n imgs.forEach((img) => {\n img.classList.remove('thumbnail'); // может здесь это вообще не нужно\n });\n }\n }\n } else {\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n const haveImage = div.firstElementChild?.tagName === 'IMG' ? div.firstElementChild as HTMLImageElement : null;\n if(!haveImage || haveImage.src !== url) {\n const image = new Image();\n image.classList.add('thumbnail');\n\n // this.log('will renderImageFromUrl:', image, div, target);\n\n renderImageFromUrl(image, url, () => {\n this.updateMediaSource(target, url, 'img');\n\n if(haveImage) {\n fastRaf(() => {\n haveImage.remove();\n });\n }\n\n div.append(image);\n });\n }\n }\n\n // this.preloader.detach();\n }).catch((err) => {\n this.log.error(err);\n this.preloader.attach(mover);\n this.preloader.setManual();\n });\n\n return cancellablePromise;\n };\n\n this.lazyLoadQueue.unshift({load});\n });\n\n setMoverPromise = thumbPromise.then(set);\n }\n\n return this.setMoverPromise = setMoverPromise.catch(() => {\n this.setMoverAnimationPromise = null;\n }).finally(() => {\n this.setMoverPromise = null;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function fillPropertyValue(str: string) {\n const splitted = str.split(' ');\n if(splitted.length !== 4) {\n if(!splitted[0]) splitted[0] = '0px';\n for(let i = splitted.length; i < 4; ++i) {\n splitted[i] = splitted[i % 2] || splitted[0] || '0px';\n }\n }\n\n return splitted;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {IS_MOBILE_SAFARI} from '../environment/userAgent';\nimport {logger} from '../lib/logger';\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport isSwipingBackSafari from '../helpers/dom/isSwipingBackSafari';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\n\nexport type NavigationItem = {\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' |\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' |\n 'global-search' | 'voice' | 'mobile-search' | 'filters' | 'global-search-focus' |\n 'toast' | 'dropdown' | 'forum',\n onPop: (canAnimate: boolean) => boolean | void,\n onEscape?: () => boolean,\n noHistory?: boolean,\n noBlurOnPop?: boolean,\n};\n\nexport class AppNavigationController {\n private navigations: Array;\n private id: number;\n private manual: boolean;\n private log: ReturnType;\n private debug: boolean;\n private currentHash: string; // have to start with # if not empty\n private overriddenHash: string; // have to start with # if not empty\n private isPossibleSwipe: boolean;\n public onHashChange: () => void;\n\n constructor() {\n this.navigations = [];\n this.id = Date.now();\n this.manual = false;\n this.log = logger('NC');\n this.debug = true;\n this.currentHash = window.location.hash;\n this.overriddenHash = '';\n this.isPossibleSwipe = false;\n\n window.addEventListener('popstate', this.onPopState);\n window.addEventListener('keydown', this.onKeyDown, {capture: true, passive: false});\n\n if(IS_MOBILE_SAFARI) {\n const options = {passive: true};\n window.addEventListener('touchstart', this.onTouchStart, options);\n }\n\n history.scrollRestoration = 'manual';\n\n this.pushState(); // * push init state\n }\n\n private onPopState = (e: PopStateEvent) => {\n const hash = window.location.hash;\n const id: number = e.state;\n this.debug && this.log('popstate', e, this.isPossibleSwipe, hash);\n if(hash !== this.currentHash) {\n this.debug && this.log.warn(`hash changed, new=${hash}, current=${this.currentHash}, overridden=${this.overriddenHash}`);\n // fix for returning to wrong hash (e.g. chat -> archive -> chat -> 3x back)\n if(id === this.id && this.overriddenHash && this.overriddenHash !== hash) {\n this.overrideHash(this.overriddenHash);\n } else if(id/* === this.id */ && !this.overriddenHash && hash) {\n this.overrideHash();\n } else {\n this.currentHash = hash;\n this.onHashChange && this.onHashChange();\n // this.replaceState();\n return;\n }\n }\n\n if(id !== this.id/* && !this.navigations.length */) {\n this.pushState();\n\n if(!this.navigations.length) {\n return;\n }\n }\n\n const item = this.navigations.pop();\n if(!item) {\n this.pushState();\n return;\n }\n\n this.manual = !this.isPossibleSwipe;\n this.handleItem(item);\n // this.pushState(); // * prevent adding forward arrow\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n const item = this.navigations[this.navigations.length - 1];\n if(!item) return;\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\n cancelEvent(e);\n this.back(item.type);\n }\n };\n\n private onTouchStart = (e: TouchEvent) => {\n if(e.touches.length > 1) return;\n this.debug && this.log('touchstart');\n\n if(isSwipingBackSafari(e)) {\n this.isPossibleSwipe = true;\n\n window.addEventListener('touchend', () => {\n setTimeout(() => {\n this.isPossibleSwipe = false;\n }, 100);\n }, {passive: true, once: true});\n }\n\n /* const detach = () => {\n window.removeEventListener('touchend', onTouchEnd);\n window.removeEventListener('touchmove', onTouchMove);\n };\n\n let moved = false;\n const onTouchMove = (e: TouchEvent) => {\n this.debug && this.log('touchmove');\n if(e.touches.length > 1) {\n detach();\n return;\n }\n\n moved = true;\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n this.debug && this.log('touchend');\n if(e.touches.length > 1 || !moved) {\n detach();\n return;\n }\n\n isPossibleSwipe = true;\n doubleRaf().then(() => {\n isPossibleSwipe = false;\n });\n\n detach();\n };\n\n window.addEventListener('touchend', onTouchEnd, options);\n window.addEventListener('touchmove', onTouchMove, options); */\n };\n\n public overrideHash(hash: string = '') {\n if(hash && hash[0] !== '#') hash = '#' + hash;\n else if(hash === '#') hash = '';\n\n if(this.currentHash === hash) {\n return;\n }\n\n this.overriddenHash = this.currentHash = hash;\n this.replaceState();\n this.pushState();\n }\n\n private handleItem(item: NavigationItem) {\n const good = item.onPop(!this.manual ? false : undefined);\n this.debug && this.log('popstate, navigation:', item, this.navigations);\n if(good === false) {\n this.pushItem(item);\n } else if(!item.noBlurOnPop) {\n blurActiveElement(); // no better place for it\n }\n\n this.manual = false;\n }\n\n public findItemByType(type: NavigationItem['type']) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n return {item, index: i};\n }\n }\n }\n\n public back(type?: NavigationItem['type']) {\n if(type) {\n const ret = this.findItemByType(type);\n if(ret) {\n this.backByItem(ret.item, ret.index);\n return;\n }\n }\n\n history.back();\n }\n\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\n this.manual = true;\n // ! commented because 'popstate' event will be fired with delay\n // if(index !== (this.navigations.length - 1)) {\n this.navigations.splice(index, 1);\n this.handleItem(item);\n // }\n }\n\n private onItemAdded(item: NavigationItem) {\n this.debug && this.log('onItemAdded', item, this.navigations);\n\n if(!item.noHistory) {\n this.pushState();\n }\n }\n\n public pushItem(item: NavigationItem) {\n this.navigations.push(item);\n this.onItemAdded(item);\n }\n\n public unshiftItem(item: NavigationItem) {\n this.navigations.unshift(item);\n this.onItemAdded(item);\n }\n\n public spliceItems(index: number, length: number, ...items: NavigationItem[]) {\n this.navigations.splice(index, length, ...items);\n items.forEach((item) => {\n this.onItemAdded(item);\n });\n }\n\n private pushState() {\n this.debug && this.log('push');\n this.manual = false;\n history.pushState(this.id, '');\n }\n\n public replaceState() {\n this.debug && this.log.warn('replace');\n\n const url = location.origin + location.pathname + location.search + this.overriddenHash;\n history.replaceState(this.id, '', url);\n }\n\n public removeItem(item: NavigationItem) {\n if(!item) {\n return;\n }\n\n indexOfAndSplice(this.navigations, item);\n }\n\n public removeByType(type: NavigationItem['type'], single = false) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n this.navigations.splice(i, 1);\n\n if(single) {\n break;\n }\n }\n }\n }\n}\n\nconst appNavigationController = new AppNavigationController();\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\nexport default appNavigationController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from '../lib/appManagers/appDialogsManager';\nimport Scrollable from './scrollable';\nimport InputSearch from './inputSearch';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\n\nexport class SearchGroup {\n container: HTMLDivElement;\n nameEl: HTMLDivElement;\n list: HTMLUListElement;\n\n constructor(\n public name: LangPackKey | boolean,\n public type: string,\n private clearable = true,\n className?: string,\n clickable = true,\n public autonomous = true,\n public onFound?: () => void,\n public noIcons?: boolean\n ) {\n this.list = appDialogsManager.createChatList();\n this.container = document.createElement('div');\n if(className) this.container.className = className;\n\n if(name) {\n this.nameEl = document.createElement('div');\n this.nameEl.classList.add('search-group__name');\n if(typeof(name) === 'string') {\n this.nameEl.append(i18n(name));\n }\n this.container.append(this.nameEl);\n }\n\n this.container.classList.add('search-group', 'search-group-' + type);\n this.container.append(this.list);\n this.container.style.display = 'none';\n\n if(clickable) {\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\n }\n }\n\n clear() {\n this.container.style.display = 'none';\n\n if(this.clearable) {\n this.list.innerHTML = '';\n }\n }\n\n setActive() {\n this.container.style.display = '';\n }\n\n toggle() {\n if(this.list.childElementCount) {\n this.setActive();\n } else {\n this.clear();\n }\n }\n}\n\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\n\nexport default class AppSearch {\n private minMsgId = 0;\n private loadedCount = -1;\n private foundCount = -1;\n\n private searchPromise: Promise = null;\n private searchTimeout: number = 0;\n\n private query = '';\n\n private listsContainer: HTMLDivElement = null;\n\n private peerId: PeerId; // 0 - means global\n private threadId = 0;\n\n private scrollable: Scrollable;\n\n constructor(\n public container: HTMLElement,\n public searchInput: InputSearch,\n public searchGroups: {[group in SearchGroupType]: SearchGroup},\n public onSearch?: (count: number) => void,\n public noIcons?: boolean\n ) {\n this.scrollable = new Scrollable(this.container);\n this.listsContainer = this.scrollable.container as HTMLDivElement;\n for(const i in this.searchGroups) {\n this.listsContainer.append(this.searchGroups[i as SearchGroupType].container);\n }\n\n if(this.searchGroups.messages) {\n this.scrollable.setVirtualContainer(this.searchGroups.messages.list);\n }\n\n this.searchInput.onChange = (value) => {\n /* if(!value.trim()) {\n //this.peerId = 0;\n return;\n } */\n\n this.query = value;\n this.reset(false);\n this.searchMore();\n };\n\n this.scrollable.onScrolledBottom = () => {\n if(!this.query.trim()) return;\n\n if(!this.searchTimeout) {\n this.searchTimeout = window.setTimeout(() => {\n this.searchMore();\n this.searchTimeout = 0;\n }, 0);\n }\n };\n }\n\n public reset(all = true) {\n if(all) {\n this.searchInput.value = '';\n this.query = '';\n this.peerId = undefined;\n this.threadId = 0;\n }\n\n this.minMsgId = 0;\n this.loadedCount = -1;\n this.foundCount = -1;\n\n for(const i in this.searchGroups) {\n this.searchGroups[i as SearchGroupType].clear();\n }\n\n this.searchPromise = null;\n }\n\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\n this.peerId = peerId;\n this.threadId = threadId;\n\n if(this.query !== query) {\n this.searchInput.inputField.value = query;\n }\n\n this.searchInput.input.focus();\n }\n\n public searchMore() {\n if(this.searchPromise) return this.searchPromise;\n\n const query = this.query;\n\n if(!query.trim()) {\n this.onSearch && this.onSearch(0);\n return;\n }\n\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\n return Promise.resolve();\n }\n\n const maxId = this.minMsgId || 0;\n\n return this.searchPromise = rootScope.managers.appMessagesManager.getSearch({\n peerId: this.peerId,\n query,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n maxId,\n limit: 20,\n threadId: this.threadId\n }).then((res) => {\n this.searchPromise = null;\n\n if(this.searchInput.value !== query) {\n return;\n }\n\n // console.log('input search result:', this.peerId, query, null, maxId, 20, res);\n\n const {count, history} = res;\n\n if(history.length && history[0].mid === this.minMsgId) {\n history.shift();\n }\n\n const searchGroup = this.searchGroups.messages;\n\n history.forEach((message) => {\n try {\n const peerId = this.peerId ? message.fromId : message.peerId;\n appDialogsManager.addDialogAndSetLastMessage({\n peerId,\n container: this.scrollable/* searchGroup.list */,\n avatarSize: 'bigger',\n meAsSaved: false,\n message,\n query,\n noIcons: this.noIcons\n });\n } catch(err) {\n console.error('[appSearch] render search result', err);\n }\n });\n\n searchGroup.toggle();\n\n this.minMsgId = history.length && history[history.length - 1].mid;\n\n if(this.loadedCount === -1) {\n this.loadedCount = 0;\n }\n this.loadedCount += history.length;\n\n if(this.foundCount === -1) {\n this.foundCount = count;\n\n if(searchGroup.nameEl) {\n replaceContent(searchGroup.nameEl, i18n(count ? 'Chat.Search.MessagesFound' : 'Chat.Search.NoMessagesFound', [count]));\n }\n\n this.onSearch && this.onSearch(this.foundCount);\n }\n }).catch((err) => {\n console.error('search error', err);\n this.searchPromise = null;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyInputMessagesFilter, MyMessage} from '../lib/appManagers/appMessagesManager';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport {logger} from '../lib/logger';\nimport rootScope from '../lib/rootScope';\nimport {SearchGroup, SearchGroupType} from './appSearch';\nimport {horizontalMenu} from './horizontalMenu';\nimport LazyLoadQueue from './lazyLoadQueue';\nimport {putPreloader} from './putPreloader';\nimport ripple from './ripple';\nimport Scrollable, {ScrollableX} from './scrollable';\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport I18n, {LangPackKey, i18n} from '../lib/langPack';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport {getMiddleware, Middleware} from '../helpers/middleware';\nimport {ChannelParticipant, Chat, ChatFull, ChatParticipant, ChatParticipants, Document, Message, MessageMedia, Photo, WebPage} from '../layer';\nimport SortedUserList from './sortedUserList';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport appSidebarRight from './sidebarRight';\nimport mediaSizes from '../helpers/mediaSizes';\nimport appImManager from '../lib/appManagers/appImManager';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport cleanSearchText from '../helpers/cleanSearchText';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport handleTabSwipe from '../helpers/dom/handleTabSwipe';\nimport windowSize from '../helpers/windowSize';\nimport {formatPhoneNumber} from '../helpers/formatPhoneNumber';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from './buttonMenu';\nimport PopupForward from './popups/forward';\nimport PopupDeleteMessages from './popups/deleteMessages';\nimport Row from './row';\nimport htmlToDocumentFragment from '../helpers/dom/htmlToDocumentFragment';\nimport {SearchSelection} from './chat/selection';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport AppMediaViewer from './appMediaViewer';\nimport lockTouchScroll from '../helpers/dom/lockTouchScroll';\nimport copy from '../helpers/object/copy';\nimport getObjectKeysAndSort from '../helpers/object/getObjectKeysAndSort';\nimport safeAssign from '../helpers/object/safeAssign';\nimport escapeRegExp from '../helpers/string/escapeRegExp';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport {ScrollStartCallbackDimensions} from '../helpers/fastSmoothScroll';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport wrapWebPageDescription from './wrappers/webPageDescription';\nimport wrapWebPageTitle from './wrappers/webPageTitle';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\nimport matchUrl from '../lib/richTextProcessor/matchUrl';\nimport wrapPlainText from '../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport wrapSenderToPeer from './wrappers/senderToPeer';\nimport wrapSentTime from './wrappers/sentTime';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport filterMessagesByInputFilter from '../lib/appManagers/utils/messages/filterMessagesByInputFilter';\nimport getChatMembersString from './wrappers/getChatMembersString';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport getParticipantPeerId from '../lib/appManagers/utils/chats/getParticipantPeerId';\nimport {Awaited} from '../types';\nimport {attachContextMenuListener} from '../helpers/dom/attachContextMenuListener';\nimport contextMenuController from '../helpers/contextMenuController';\nimport positionMenu from '../helpers/positionMenu';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport SwipeHandler from './swipeHandler';\nimport wrapDocument from './wrappers/document';\nimport wrapPhoto from './wrappers/photo';\nimport wrapVideo from './wrappers/video';\nimport noop from '../helpers/noop';\nimport wrapMediaSpoiler, {onMediaSpoilerClick} from './wrappers/mediaSpoiler';\n\n// const testScroll = false;\n\nexport type SearchSuperType = MyInputMessagesFilter/* | 'members' */;\nexport type SearchSuperContext = {\n peerId: PeerId,\n inputFilter: {_: MyInputMessagesFilter},\n query?: string,\n maxId?: number,\n folderId?: number,\n threadId?: number,\n date?: number,\n nextRate?: number,\n minDate?: number,\n maxDate?: number\n};\n\nexport type SearchSuperMediaType = 'members' | 'media' | 'files' | 'links' | 'music' | 'chats' | 'voice';\nexport type SearchSuperMediaTab = {\n inputFilter: SearchSuperType,\n name: LangPackKey,\n type: SearchSuperMediaType,\n contentTab?: HTMLElement,\n menuTab?: HTMLElement,\n scroll?: {scrollTop: number, scrollHeight: number}\n};\n\nclass SearchContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify?: () => boolean | Promise, withSelection?: true})[];\n private element: HTMLElement;\n private target: HTMLElement;\n private peerId: PeerId;\n private mid: number;\n private isSelected: boolean;\n private managers: AppManagers;\n\n constructor(\n private attachTo: HTMLElement,\n private searchSuper: AppSearchSuper,\n private listenerSetter: ListenerSetter\n ) {\n this.managers = searchSuper.managers;\n\n const onContextMenu: Parameters[0]['callback'] = (e) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let item: HTMLElement;\n try {\n item = findUpClassName(e.target, 'search-super-item');\n } catch(e) {}\n\n if(!item) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n const r = async() => {\n this.target = item;\n this.peerId = item.dataset.peerId.toPeerId();\n this.mid = +item.dataset.mid;\n this.isSelected = searchSuper.selection.isMidSelected(this.peerId, this.mid);\n\n await Promise.all(this.buttons.map(async(button) => {\n let good: boolean;\n\n if(this.isSelected && !button.withSelection) {\n good = false;\n } else {\n good = button.verify ? await button.verify() : true;\n }\n\n button.element.classList.toggle('hide', !good);\n }));\n\n item.classList.add('menu-open');\n\n positionMenu(e, this.element);\n contextMenuController.openBtnMenu(this.element, () => {\n item.classList.remove('menu-open');\n });\n };\n\n r();\n };\n\n if(IS_TOUCH_SUPPORTED) {\n\n } else {\n attachContextMenuListener({\n element: attachTo,\n callback: onContextMenu as any,\n listenerSetter\n });\n }\n }\n\n private init() {\n this.buttons = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick,\n verify: async() => this.managers.appMessagesManager.canForward(await this.managers.appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.isSelected &&\n !this.searchSuper.selection.selectionForwardBtn.classList.contains('hide'),\n withSelection: true\n }, {\n icon: 'message',\n text: 'Message.Context.Goto',\n onClick: this.onGotoClick,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n withSelection: true\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(await this.managers.appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.searchSuper.selection.selectionDeleteBtn.classList.contains('hide'),\n withSelection: true\n }];\n\n this.element = ButtonMenuSync({buttons: this.buttons, listenerSetter: this.listenerSetter});\n this.element.classList.add('search-contextmenu', 'contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onGotoClick = () => {\n appImManager.setInnerPeer({\n peerId: this.peerId,\n lastMsgId: this.mid,\n threadId: this.searchSuper.searchContext.threadId\n });\n };\n\n private onForwardClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionForwardBtn);\n } else {\n new PopupForward({\n [this.peerId]: [this.mid]\n });\n }\n };\n\n private onSelectClick = () => {\n this.searchSuper.selection.toggleByElement(this.target);\n };\n\n private onClearSelectionClick = () => {\n this.searchSuper.selection.cancelSelection();\n };\n\n private onDeleteClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, [this.mid], 'chat');\n }\n };\n}\n\nexport type ProcessSearchSuperResult = {\n message: Message.message,\n middleware: Middleware,\n promises: Promise[],\n elemsToAppend: {element: HTMLElement, message: any}[],\n inputFilter: MyInputMessagesFilter,\n searchGroup?: SearchGroup\n};\n\nexport default class AppSearchSuper {\n public tabs: {[t in SearchSuperType]: HTMLDivElement} = {} as any;\n\n public mediaTab: SearchSuperMediaTab;\n\n public container: HTMLElement;\n public nav: HTMLElement;\n public navScrollableContainer: HTMLDivElement;\n public tabsContainer: HTMLElement;\n public navScrollable: ScrollableX;\n private tabsMenu: HTMLElement;\n private prevTabId = -1;\n\n private lazyLoadQueue = new LazyLoadQueue();\n public middleware = getMiddleware();\n\n public historyStorage: Partial<{[type in SearchSuperType]: {mid: number, peerId: PeerId}[]}> = {};\n public usedFromHistory: Partial<{[type in SearchSuperType]: number}> = {};\n\n public searchContext: SearchSuperContext;\n public loadMutex: Promise = Promise.resolve();\n\n private nextRates: Partial<{[type in SearchSuperType]: number}> = {};\n private loadPromises: Partial<{[type in SearchSuperType]: Promise}> = {};\n private loaded: Partial<{[type in SearchSuperType]: boolean}> = {};\n private loadedChats = false;\n private firstLoad = true;\n\n private log = logger('SEARCH-SUPER');\n public selectTab: ReturnType;\n\n private monthContainers: Partial<{\n [type in SearchSuperType]: {\n [timestamp: number]: {\n container: HTMLElement,\n items: HTMLElement\n }\n }\n }> = {};\n\n private searchGroupMedia: SearchGroup;\n\n public mediaTabsMap: Map = new Map();\n\n private membersList: SortedUserList;\n\n private skipScroll: boolean;\n\n // * arguments\n public mediaTabs: SearchSuperMediaTab[];\n public scrollable: Scrollable;\n public searchGroups?: {[group in SearchGroupType]: SearchGroup};\n public asChatList? = false;\n public groupByMonth? = true;\n public hideEmptyTabs? = true;\n public onChangeTab?: (mediaTab: SearchSuperMediaTab) => void;\n public showSender? = false;\n\n private searchContextMenu: SearchContextMenu;\n public selection: SearchSelection;\n\n public scrollStartCallback: (dimensions: ScrollStartCallbackDimensions) => void;\n\n public managers: AppManagers;\n private loadFirstTimePromise: Promise;\n\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\n\n constructor(options: Pick) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('search-super');\n\n this.listenerSetter = new ListenerSetter();\n this.searchContextMenu = new SearchContextMenu(this.container, this, this.listenerSetter);\n this.selection = new SearchSelection(this, this.managers, this.listenerSetter);\n\n const navScrollableContainer = this.navScrollableContainer = document.createElement('div');\n navScrollableContainer.classList.add('search-super-tabs-scrollable', 'menu-horizontal-scrollable', 'sticky');\n\n const navScrollable = this.navScrollable = new ScrollableX(navScrollableContainer);\n navScrollable.container.classList.add('search-super-nav-scrollable');\n\n const nav = this.nav = document.createElement('nav');\n nav.classList.add('search-super-tabs', 'menu-horizontal-div');\n this.tabsMenu = nav;\n\n navScrollable.container.append(nav);\n\n for(const mediaTab of this.mediaTabs) {\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const i = document.createElement('i');\n\n span.append(i18n(mediaTab.name));\n span.append(i);\n\n menuTab.append(span);\n\n ripple(menuTab);\n\n this.tabsMenu.append(menuTab);\n\n this.mediaTabsMap.set(mediaTab.type, mediaTab);\n\n mediaTab.menuTab = menuTab;\n }\n\n this.tabsContainer = document.createElement('div');\n this.tabsContainer.classList.add('search-super-tabs-container', 'tabs-container');\n\n let unlockScroll: ReturnType;\n if(IS_TOUCH_SUPPORTED) {\n this.swipeHandler = handleTabSwipe({\n element: this.tabsContainer,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\n const prevId = this.selectTab.prevId();\n const children = Array.from(this.tabsMenu.children) as HTMLElement[];\n let idx: number;\n if(xDiff > 0) {\n for(let i = prevId + 1; i < children.length; ++i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n } else {\n for(let i = prevId - 1; i >= 0; --i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n }\n\n if(idx !== undefined) {\n unlockScroll = lockTouchScroll(this.tabsContainer);\n this.selectTab(idx);\n }\n }\n });\n }\n\n for(const mediaTab of this.mediaTabs) {\n const container = document.createElement('div');\n container.classList.add('search-super-container-' + mediaTab.type, 'tabs-tab');\n\n const content = document.createElement('div');\n content.classList.add('search-super-content-' + mediaTab.type);\n\n container.append(content);\n\n this.tabsContainer.append(container);\n\n this.tabs[mediaTab.inputFilter] = content;\n\n mediaTab.contentTab = content;\n }\n\n this.container.append(navScrollableContainer, this.tabsContainer);\n\n // * construct end\n\n this.searchGroupMedia = new SearchGroup(false, 'messages', true);\n\n this.scrollable.onScrolledBottom = () => {\n if(this.mediaTab.contentTab && this.canLoadMediaTab(this.mediaTab)/* && false */) {\n // this.log('onScrolledBottom will load media');\n this.load(true);\n }\n };\n // this.scroll.attachSentinels(undefined, 400);\n\n this.selectTab = horizontalMenu(this.tabsMenu, this.tabsContainer, (id, tabContent, animate) => {\n if(this.prevTabId === id && !this.skipScroll) {\n this.scrollable.scrollIntoViewNew({\n element: this.container,\n position: 'start',\n startCallback: this.scrollStartCallback\n });\n return;\n }\n\n const newMediaTab = this.mediaTabs[id];\n if(this.onChangeTab) {\n this.onChangeTab(newMediaTab);\n }\n\n const fromMediaTab = this.mediaTab;\n this.mediaTab = newMediaTab;\n\n if(this.prevTabId !== -1 && animate) {\n this.onTransitionStart();\n }\n\n if(this.skipScroll) {\n this.skipScroll = false;\n } else {\n const offsetTop = this.container.offsetTop;\n let scrollTop = this.scrollable.scrollTop;\n if(scrollTop < offsetTop) {\n this.scrollable.scrollIntoViewNew({\n element: this.container,\n position: 'start',\n startCallback: this.scrollStartCallback\n });\n scrollTop = offsetTop;\n }\n\n fromMediaTab.scroll = {scrollTop: scrollTop, scrollHeight: this.scrollable.scrollHeight};\n\n if(newMediaTab.scroll === undefined) {\n const rect = this.container.getBoundingClientRect();\n const rect2 = this.container.parentElement.getBoundingClientRect();\n const diff = rect.y - rect2.y;\n\n if(scrollTop > diff) {\n newMediaTab.scroll = {scrollTop: diff, scrollHeight: 0};\n }\n }\n\n if(newMediaTab.scroll) {\n const diff = fromMediaTab.scroll.scrollTop - newMediaTab.scroll.scrollTop;\n // console.log('what you gonna do', this.goingHard, diff);\n\n // this.scrollable.scrollTop = scrollTop;\n if(diff/* && diff < 0 */) {\n /* if(diff > -(fromMediaTab.contentTab.scrollHeight + this.nav.scrollHeight)) {\n fromMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n this.scrollable.scrollTop = scrollTop - diff;\n } else { */\n newMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n // }\n }\n }\n }\n\n /* if(this.prevTabId !== -1 && nav.offsetTop) {\n this.scrollable.scrollTop -= nav.offsetTop;\n } */\n\n /* this.log('setVirtualContainer', id, this.sharedMediaSelected, this.sharedMediaSelected.childElementCount);\n this.scroll.setVirtualContainer(this.sharedMediaSelected); */\n\n if(this.prevTabId !== -1 && !newMediaTab.contentTab.childElementCount) { // quick brown fix\n // this.contentContainer.classList.remove('loaded');\n this.load(true);\n }\n\n this.prevTabId = id;\n }, () => {\n this.scrollable.onScroll();\n\n // console.log('what y', this.tabSelected.style.transform);\n if(this.mediaTab.scroll !== undefined) {\n this.mediaTab.contentTab.style.transform = '';\n this.scrollable.scrollTop = this.mediaTab.scroll.scrollTop;\n }\n\n if(unlockScroll) {\n unlockScroll();\n unlockScroll = undefined;\n }\n\n this.onTransitionEnd();\n }, undefined, navScrollable, this.listenerSetter);\n\n attachClickEvent(this.tabsContainer, (e) => {\n if(this.selection.isSelecting) {\n cancelEvent(e);\n this.selection.toggleByElement(findUpClassName(e.target, 'search-super-item'));\n }\n }, {capture: true, passive: false, listenerSetter: this.listenerSetter});\n\n const onMediaClick = async(className: string, targetClassName: string, inputFilter: MyInputMessagesFilter, e: MouseEvent) => {\n const target = findUpClassName(e.target as HTMLDivElement, className);\n if(!target) return;\n\n const mid = +target.dataset.mid;\n if(!mid) {\n this.log.warn('no messageId by click on target:', target);\n return;\n }\n\n const mediaSpoiler: HTMLElement = target.querySelector('.media-spoiler-container');\n if(mediaSpoiler) {\n onMediaSpoilerClick({\n event: e,\n mediaSpoiler\n })\n return;\n }\n\n const peerId = target.dataset.peerId.toPeerId();\n\n const targets = (Array.from(this.tabs[inputFilter].querySelectorAll('.' + targetClassName)) as HTMLElement[]).map((el) => {\n const containerEl = findUpClassName(el, className);\n return {\n element: el,\n mid: +containerEl.dataset.mid,\n peerId: containerEl.dataset.peerId.toPeerId()\n };\n });\n\n // const ids = Object.keys(this.mediaDivsByIds).map((k) => +k).sort((a, b) => a - b);\n const idx = targets.findIndex((item) => item.mid === mid && item.peerId === peerId);\n\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n new AppMediaViewer()\n .setSearchContext(this.copySearchContext(inputFilter))\n .openMedia(message, targets[idx].element, 0, false, targets.slice(0, idx), targets.slice(idx + 1));\n };\n\n attachClickEvent(this.tabs.inputMessagesFilterPhotoVideo, onMediaClick.bind(null, 'grid-item', 'grid-item', 'inputMessagesFilterPhotoVideo'), {listenerSetter: this.listenerSetter});\n attachClickEvent(this.tabs.inputMessagesFilterDocument, onMediaClick.bind(null, 'document-with-thumb', 'media-container', 'inputMessagesFilterDocument'), {listenerSetter: this.listenerSetter});\n\n /* attachClickEvent(this.tabs.inputMessagesFilterUrl, (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') {\n return;\n }\n\n try {\n const a = findUpClassName(target, 'row').querySelector('.anchor-url:last-child') as HTMLAnchorElement;\n a.click();\n } catch(err) {}\n }); */\n\n this.mediaTab = this.mediaTabs[0];\n\n useHeavyAnimationCheck(() => {\n this.lazyLoadQueue.lock();\n }, () => {\n this.lazyLoadQueue.unlockAndRefresh(); // ! maybe not so efficient\n }, this.listenerSetter);\n }\n\n private onTransitionStart = () => {\n this.container.classList.add('sliding');\n };\n\n private onTransitionEnd = () => {\n this.container.classList.remove('sliding');\n };\n\n public filterMessagesByType(messages: any[], type: SearchSuperType): MyMessage[] {\n return filterMessagesByInputFilter(type, messages, messages.length);\n }\n\n private processEmptyFilter({message, searchGroup}: ProcessSearchSuperResult) {\n const loadPromises: Promise[] = [];\n const dialogElement = appDialogsManager.addDialogNew({\n peerId: message.peerId,\n container: searchGroup.list,\n avatarSize: 'bigger',\n loadPromises\n });\n\n const setLastMessagePromise = appDialogsManager.setLastMessageN({\n dialog: {\n _: 'dialog',\n peerId: message.peerId\n } as any,\n lastMessage: message,\n dialogElement,\n highlightWord: this.searchContext.query\n });\n\n loadPromises.push(setLastMessagePromise);\n return Promise.all(loadPromises).then(noop);\n }\n\n private async processPhotoVideoFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n const media = getMediaFromMessage(message);\n\n const div = document.createElement('div');\n div.classList.add('grid-item');\n // this.log(message, photo);\n\n let wrapped: Awaited>;\n const size = choosePhotoSize(media, 200, 200);\n if(media._ !== 'photo') {\n wrapped = await (await wrapVideo({\n doc: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n onlyPreview: true,\n withoutPreloader: true,\n noPlayButton: true,\n photoSize: size\n })).thumb;\n } else {\n wrapped = await wrapPhoto({\n photo: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n noBlur: true,\n size\n });\n }\n\n if((message.media as MessageMedia.messageMediaPhoto).pFlags.spoiler) {\n const mediaSpoiler = await wrapMediaSpoiler({\n animationGroup: 'chat',\n media,\n middleware,\n width: 140,\n height: 140,\n multiply: 0.3\n });\n\n div.append(mediaSpoiler);\n }\n\n [\n wrapped.images.thumb,\n wrapped.images.full\n ].filter(Boolean).forEach((image) => {\n image.classList.add('grid-item-media');\n });\n\n promises.push(wrapped.loadPromises.thumb);\n\n return {element: div, message};\n }\n\n private async processDocumentFilter({message, inputFilter}: ProcessSearchSuperResult) {\n const document = getMediaFromMessage(message) as Document.document;\n const showSender = this.showSender || (['voice', 'round'] as MyDocument['type'][]).includes(document.type);\n\n const div = await wrapDocument({\n message,\n withTime: !showSender,\n fontWeight: 400,\n voiceAsMusic: true,\n showSender,\n searchContext: this.copySearchContext(inputFilter),\n lazyLoadQueue: this.lazyLoadQueue,\n autoDownloadSize: 0\n });\n\n if((['audio', 'voice', 'round'] as MyDocument['type'][]).includes(document.type)) {\n div.classList.add('audio-48');\n }\n\n return {message, element: div};\n }\n\n private async processUrlFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n let webPage = (message.media as MessageMedia.messageMediaWebPage)?.webpage as WebPage.webPage | WebPage.webPageEmpty;\n\n if(!webPage) {\n const entity = message.totalEntities ? message.totalEntities.find((e: any) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') : null;\n let url: string, display_url: string, sliced: string;\n\n if(!entity) {\n const match = matchUrl(message.message);\n if(!match) {\n return;\n }\n\n url = match[0];\n } else {\n sliced = message.message.slice(entity.offset, entity.offset + entity.length);\n }\n\n if(entity?._ === 'messageEntityTextUrl') {\n url = entity.url;\n // display_url = sliced;\n } else {\n url = url || sliced;\n }\n\n display_url = url;\n\n const same = message.message === url;\n if(!url.match(/^(ftp|http|https):\\/\\//)) {\n display_url = 'https://' + url;\n url = url.includes('@') ? url : 'https://' + url;\n }\n\n display_url = new URL(display_url).hostname;\n\n webPage = {\n _: 'webPage',\n url,\n display_url,\n id: '',\n hash: 0\n };\n\n if(!same) {\n webPage.description = message.message;\n }\n }\n\n if(webPage._ === 'webPageEmpty') {\n return;\n }\n\n const previewDiv = document.createElement('div');\n previewDiv.classList.add('preview');\n\n // this.log('wrapping webpage', webpage);\n\n if(webPage.photo) {\n const res = wrapPhoto({\n container: previewDiv,\n message: null,\n photo: webPage.photo as Photo.photo,\n boxWidth: 0,\n boxHeight: 0,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n size: choosePhotoSize(webPage.photo as Photo.photo, 60, 60, false),\n loadPromises: promises,\n noBlur: true\n });\n } else {\n previewDiv.classList.add('empty');\n setInnerHTML(previewDiv, wrapAbbreviation(webPage.title || webPage.display_url || webPage.description || webPage.url, true));\n }\n\n const title = wrapWebPageTitle(webPage);\n\n const subtitleFragment = wrapWebPageDescription(webPage);\n const aFragment = htmlToDocumentFragment(wrapRichText(webPage.url || ''));\n const a = aFragment.firstElementChild;\n if(a instanceof HTMLAnchorElement) {\n try { // can have 'URIError: URI malformed'\n a.innerText = decodeURIComponent(a.href);\n } catch(err) {\n\n }\n }\n\n if(subtitleFragment.firstChild) {\n subtitleFragment.append('\\n');\n }\n\n subtitleFragment.append(a);\n\n if(this.showSender) {\n subtitleFragment.append('\\n', await wrapSenderToPeer(message));\n }\n\n if(!title.textContent) {\n // title = new URL(webpage.url).hostname;\n title.append(wrapPlainText(webPage.display_url.split('/', 1)[0]));\n }\n\n const row = new Row({\n title,\n titleRight: wrapSentTime(message),\n subtitle: subtitleFragment,\n havePadding: true,\n clickable: true,\n noRipple: true\n });\n\n row.applyMediaElement(previewDiv, 'big');\n\n if(row.container.innerText.trim().length) {\n return {message, element: row.container};\n }\n }\n\n public async performSearchResult(messages: any[], mediaTab: SearchSuperMediaTab, append = true) {\n const elemsToAppend: {element: HTMLElement, message: any}[] = [];\n const sharedMediaDiv: HTMLElement = mediaTab.contentTab;\n const promises: Promise[] = [];\n const middleware = this.middleware.get();\n let inputFilter = mediaTab.inputFilter;\n\n await getHeavyAnimationPromise();\n\n let searchGroup: SearchGroup;\n if(inputFilter === 'inputMessagesFilterPhotoVideo' && !!this.searchContext.query.trim()) {\n inputFilter = 'inputMessagesFilterEmpty';\n searchGroup = this.searchGroupMedia;\n sharedMediaDiv.append(searchGroup.container);\n } else if(inputFilter === 'inputMessagesFilterEmpty') {\n searchGroup = this.searchGroups.messages;\n }\n\n const options: ProcessSearchSuperResult = {\n elemsToAppend,\n inputFilter,\n message: undefined,\n middleware,\n promises,\n searchGroup\n };\n\n let processCallback: (options: ProcessSearchSuperResult) => any;\n\n // https://core.telegram.org/type/MessagesFilter\n switch(inputFilter) {\n case 'inputMessagesFilterEmpty': {\n processCallback = this.processEmptyFilter;\n break;\n }\n\n case 'inputMessagesFilterPhotoVideo': {\n processCallback = this.processPhotoVideoFilter;\n break;\n }\n\n case 'inputMessagesFilterVoice':\n case 'inputMessagesFilterRoundVoice':\n case 'inputMessagesFilterMusic':\n case 'inputMessagesFilterDocument': {\n processCallback = this.processDocumentFilter;\n break;\n }\n\n case 'inputMessagesFilterUrl': {\n processCallback = this.processUrlFilter;\n break;\n }\n\n default:\n // this.log.warn('death is my friend', messages);\n break;\n }\n\n if(processCallback) {\n processCallback = processCallback.bind(this);\n\n type K = {element: HTMLElement, message: Message.message | Message.messageService};\n const results: (Promise | K)[] = messages.map(async(message) => {\n try {\n options.message = message;\n return await processCallback(options);\n } catch(err) {\n this.log.error('error rendering filter', inputFilter, options, message, err);\n }\n });\n\n const awaited = (await Promise.all(results)).filter(Boolean);\n elemsToAppend.push(...awaited);\n }\n\n if(searchGroup && searchGroup.list.childElementCount) {\n searchGroup.setActive();\n }\n\n if(this.loadMutex) {\n promises.push(this.loadMutex);\n }\n\n if(promises.length) {\n await Promise.all(promises);\n if(!middleware()) {\n // this.log.warn('peer changed');\n return;\n }\n }\n\n if(elemsToAppend.length) {\n const method = append ? 'append' : 'prepend';\n elemsToAppend.forEach((details) => {\n const {element, message} = details;\n if(!message) {\n debugger;\n }\n\n const monthContainer = this.getMonthContainerByTimestamp(this.groupByMonth ? message.date : 0, inputFilter);\n element.classList.add('search-super-item');\n element.dataset.mid = '' + message.mid;\n element.dataset.peerId = '' + message.peerId;\n monthContainer.items[method](element);\n\n if(this.selection?.isSelecting) {\n this.selection.toggleElementCheckbox(element, true);\n }\n });\n }\n\n // if(type !== 'inputMessagesFilterEmpty') {\n this.afterPerforming(inputFilter === 'inputMessagesFilterEmpty' ? 1 : elemsToAppend.length, sharedMediaDiv);\n // }\n }\n\n private afterPerforming(length: number, contentTab: HTMLElement) {\n if(contentTab) {\n const parent = contentTab.parentElement;\n Array.from(parent.children).slice(1).forEach((child) => {\n child.remove();\n });\n\n // this.contentContainer.classList.add('loaded');\n\n if(!length && !contentTab.childElementCount) {\n const div = document.createElement('div');\n div.innerText = 'Nothing interesting here yet...';\n div.classList.add('position-center', 'text-center', 'content-empty', 'no-select');\n\n parent.append(div);\n }\n }\n }\n\n private loadChats() {\n const renderedPeerIds: Set = new Set();\n const middleware = this.middleware.get();\n\n for(const i in this.searchGroups) {\n const group = this.searchGroups[i as SearchGroupType];\n this.tabs.inputMessagesFilterEmpty.append(group.container);\n group.clear();\n }\n\n const query = this.searchContext.query;\n if(query) {\n const setResults = (results: PeerId[], group: SearchGroup, showMembersCount = false) => {\n results.map((peerId) => {\n if(renderedPeerIds.has(peerId)) {\n return;\n }\n\n renderedPeerIds.add(peerId);\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: group.list,\n avatarSize: 'abitbigger',\n autonomous: group.autonomous\n });\n\n return {dom, peerId};\n }).filter(Boolean).forEach(async({dom, peerId}) => {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(showMembersCount && ((peer as Chat.channel).participants_count || (peer as any).participants)) {\n const regExp = new RegExp(`(${escapeRegExp(query)}|${escapeRegExp(cleanSearchText(query))})`, 'gi');\n dom.titleSpan.innerHTML = dom.titleSpan.innerHTML.replace(regExp, '$1');\n dom.lastMessageSpan.append(await getChatMembersString(peerId.toChatId()));\n } else if(peerId === rootScope.myId) {\n dom.lastMessageSpan.append(i18n('Presence.YourChat'));\n } else {\n let username = await this.managers.appPeersManager.getPeerUsername(peerId);\n if(!username) {\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user && user.phone) {\n username = '+' + formatPhoneNumber(user.phone).formatted;\n }\n } else {\n username = '@' + username;\n }\n\n dom.lastMessageSpan.textContent = username;\n }\n });\n\n group.toggle();\n };\n\n const onLoad = (arg: T) => {\n if(!middleware()) {\n return;\n }\n\n // this.loadedContacts = true;\n\n return arg;\n };\n\n return Promise.all([\n this.managers.appUsersManager.getContactsPeerIds(query, true, undefined, 10)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts, this.searchGroups.contacts, true);\n }\n }),\n\n this.managers.appUsersManager.searchContacts(query, 20)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts.my_results, this.searchGroups.contacts, true);\n setResults(contacts.results/* .concat(contacts.results, contacts.results, contacts.results) */, this.searchGroups.globalContacts);\n\n this.searchGroups.globalContacts.container.classList.add('is-short');\n\n if(this.searchGroups.globalContacts.nameEl.lastElementChild !== this.searchGroups.globalContacts.nameEl.firstElementChild) {\n this.searchGroups.globalContacts.nameEl.lastElementChild.remove();\n }\n\n if(this.searchGroups.globalContacts.list.childElementCount > 3) {\n const showMore = document.createElement('div');\n showMore.classList.add('search-group__show-more');\n const intlElement = new I18n.IntlElement({\n key: 'Separator.ShowMore'\n });\n showMore.append(intlElement.element);\n this.searchGroups.globalContacts.nameEl.append(showMore);\n attachClickEvent(showMore, () => {\n const isShort = this.searchGroups.globalContacts.container.classList.toggle('is-short');\n intlElement.key = isShort ? 'Separator.ShowMore' : 'Separator.ShowLess';\n intlElement.update();\n });\n }\n }\n }),\n\n this.managers.dialogsStorage.getDialogs({query, offsetIndex: 0, limit: 20, filterId: 0})\n .then(onLoad)\n .then((value) => {\n if(value) {\n setResults(value.dialogs.map((d) => d.peerId), this.searchGroups.contacts, true);\n }\n })\n ]);\n } else if(!this.searchContext.peerId && !this.searchContext.minDate) {\n const renderRecentSearch = (setActive = true) => {\n return apiManagerProxy.getState().then((state) => {\n if(!middleware()) {\n return;\n }\n\n this.searchGroups.recent.list.replaceChildren();\n\n state.recentSearch.slice(0, 20).forEach(async(peerId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.searchGroups.recent.list,\n meAsSaved: true,\n avatarSize: 'abitbigger',\n autonomous: true\n });\n\n dom.lastMessageSpan.append(await (peerId.isUser() ?\n getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())) :\n getChatMembersString(peerId.toChatId())));\n });\n\n if(!state.recentSearch.length) {\n this.searchGroups.recent.clear();\n } else if(setActive) {\n this.searchGroups.recent.setActive();\n }\n });\n };\n\n return Promise.all([\n this.managers.appUsersManager.getTopPeers('correspondents').then((peers) => {\n if(!middleware()) return;\n\n const idx = peers.findIndex((peer) => peer.id === rootScope.myId);\n if(idx !== -1) {\n peers = peers.slice();\n peers.splice(idx, 1);\n }\n\n peers.forEach((peer) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peer.id,\n container: this.searchGroups.people.list,\n onlyFirstName: true,\n avatarSize: 'bigger',\n autonomous: false,\n noIcons: this.searchGroups.people.noIcons\n });\n\n dom.subtitleEl.remove();\n });\n\n this.searchGroups.people.toggle();\n }),\n\n renderRecentSearch()\n ]);\n } else return Promise.resolve();\n }\n\n private async loadMembers(mediaTab: SearchSuperMediaTab) {\n const id = this.searchContext.peerId.toChatId();\n const middleware = this.middleware.get();\n let promise: Promise;\n\n const renderParticipants = async(participants: (ChatParticipant | ChannelParticipant)[]) => {\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n if(!this.membersList) {\n this.membersList = new SortedUserList({\n lazyLoadQueue: this.lazyLoadQueue,\n rippleEnabled: false,\n managers: this.managers\n });\n attachClickEvent(this.membersList.list, (e) => {\n const li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!li) {\n return;\n }\n\n const peerId = li.dataset.peerId.toPeerId();\n let promise: Promise = Promise.resolve();\n if(mediaSizes.isMobile) {\n promise = appSidebarRight.toggleSidebar(false);\n }\n\n promise.then(() => {\n appImManager.setInnerPeer({peerId});\n });\n });\n mediaTab.contentTab.append(this.membersList.list);\n this.afterPerforming(1, mediaTab.contentTab);\n }\n\n for(const participant of participants) {\n const peerId = getParticipantPeerId(participant);\n if(peerId.isAnyChat()) {\n continue;\n }\n\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user.pFlags.deleted) {\n continue;\n }\n\n this.membersList.add(peerId);\n }\n };\n\n if(await this.managers.appChatsManager.isChannel(id)) {\n const LOAD_COUNT = !this.membersList ? 50 : 200;\n promise = this.managers.appProfileManager.getChannelParticipants(id, undefined, LOAD_COUNT, this.nextRates[mediaTab.inputFilter]).then((participants) => {\n if(!middleware()) {\n return;\n }\n\n const list = mediaTab.contentTab.firstElementChild as HTMLUListElement;\n this.nextRates[mediaTab.inputFilter] = (list ? list.childElementCount : 0) + participants.participants.length;\n\n if(participants.participants.length < LOAD_COUNT) {\n this.loaded[mediaTab.inputFilter] = true;\n }\n\n return renderParticipants(participants.participants);\n });\n } else {\n promise = this.managers.appProfileManager.getChatFull(id).then((chatFull) => {\n if(!middleware()) {\n return;\n }\n\n // console.log('anymore', chatFull);\n this.loaded[mediaTab.inputFilter] = true;\n const participants = (chatFull as ChatFull.chatFull).participants;\n if(participants._ === 'chatParticipantsForbidden') {\n return;\n }\n\n return renderParticipants(participants.participants);\n });\n }\n\n return this.loadPromises[mediaTab.inputFilter] = promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadPromises[mediaTab.inputFilter] = null;\n });\n }\n\n private loadType(mediaTab: SearchSuperMediaTab, justLoad: boolean, loadCount: number, middleware: () => boolean) {\n const type = mediaTab.inputFilter;\n\n if(this.loadPromises[type]) {\n return this.loadPromises[type];\n }\n\n if(mediaTab.type === 'members') {\n return this.loadMembers(mediaTab);\n }\n\n const history = this.historyStorage[type] ??= [];\n\n if(type === 'inputMessagesFilterEmpty' && !history.length) {\n if(!this.loadedChats) {\n this.loadChats();\n this.loadedChats = true;\n }\n\n if(!this.searchContext.query.trim() && !this.searchContext.peerId && !this.searchContext.minDate) {\n this.loaded[type] = true;\n return Promise.resolve();\n }\n }\n\n const promise = this.loadPromises[type] = Promise.resolve().then(async() => {\n // render from cache\n if(history.length && this.usedFromHistory[type] < history.length && !justLoad) {\n const messages: any[] = [];\n let used = Math.max(0, this.usedFromHistory[type]);\n let slicedLength = 0;\n\n do {\n const ids = history.slice(used, used + loadCount);\n used += ids.length;\n slicedLength += ids.length;\n\n const notFilteredMessages = await Promise.all(ids.map((m) => this.managers.appMessagesManager.getMessageByPeer(m.peerId, m.mid)));\n\n messages.push(...this.filterMessagesByType(notFilteredMessages, type));\n } while(slicedLength < loadCount && used < history.length);\n\n // если перебор\n /* if(slicedLength > loadCount) {\n let diff = messages.length - loadCount;\n messages = messages.slice(0, messages.length - diff);\n used -= diff;\n } */\n\n this.usedFromHistory[type] = used;\n // if(messages.length) {\n return this.performSearchResult(messages, mediaTab).finally(() => {\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n // }\n }\n\n const maxId = history.length ? history[history.length - 1].mid : 0;\n\n const value = await this.managers.appMessagesManager.getSearch({\n ...this.searchContext,\n inputFilter: {_: type},\n maxId,\n limit: loadCount,\n nextRate: this.nextRates[type] ??= 0\n });\n\n history.push(...value.history.map((m) => ({mid: m.mid, peerId: m.peerId})));\n\n if(!middleware()) {\n // this.log.warn('peer changed');\n return;\n }\n\n // ! Фикс случая, когда не загружаются документы при открытой панели разработчиков (происходит из-за того, что не совпадают критерии отбора документов в getSearch)\n if(value.history.length < loadCount || (this.searchContext.folderId !== undefined && !value.next_rate) || value.history.length === value.count) {\n // if((value.count || history.length === value.count) && history.length >= value.count) {\n // this.log(logStr + 'loaded all media', value, loadCount);\n this.loaded[type] = true;\n }\n\n this.nextRates[type] = value.next_rate;\n\n if(justLoad) {\n return;\n }\n\n this.usedFromHistory[type] = history.length;\n\n if(!this.loaded[type]) {\n promise.then(() => {\n setTimeout(() => {\n if(!middleware()) return;\n // this.log('will preload more');\n if(this.mediaTab === mediaTab) {\n const promise = this.load(true, true);\n if(promise) {\n promise.then(() => {\n if(!middleware()) return;\n // this.log('preloaded more');\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n }\n }\n }, 0);\n });\n }\n\n // if(value.history.length) {\n return this.performSearchResult(this.filterMessagesByType(value.history, type), mediaTab);\n // }\n }).catch((err) => {\n this.log.error('load error:', err);\n }).finally(() => {\n this.loadPromises[type] = null;\n });\n\n return promise;\n }\n\n private canLoadMediaTab(mediaTab: SearchSuperMediaTab) {\n const inputFilter = mediaTab.inputFilter;\n return !this.loaded[inputFilter] || (this.historyStorage[inputFilter] && this.usedFromHistory[inputFilter] < this.historyStorage[inputFilter].length);\n }\n\n private async loadFirstTime() {\n const middleware = this.middleware.get();\n const {peerId, threadId} = this.searchContext;\n if(!this.hideEmptyTabs) {\n return;\n }\n\n const mediaTabs = this.mediaTabs.filter((mediaTab) => mediaTab.inputFilter !== 'inputMessagesFilterEmpty');\n const filters = mediaTabs.map((mediaTab) => ({_: mediaTab.inputFilter}));\n\n const [counters, canViewMembers] = await Promise.all([\n this.managers.appMessagesManager.getSearchCounters(peerId, filters, undefined, threadId),\n this.canViewMembers()\n ]);\n\n if(!middleware()) {\n return;\n }\n\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n let firstMediaTab: SearchSuperMediaTab;\n let count = 0;\n mediaTabs.forEach((mediaTab) => {\n const counter = counters.find((c) => c.filter._ === mediaTab.inputFilter);\n\n mediaTab.menuTab.classList.toggle('hide', !counter.count);\n mediaTab.menuTab.classList.remove('active');\n // mediaTab.contentTab.classList.toggle('hide', !counter.count);\n\n if(counter.count) {\n if(firstMediaTab === undefined) {\n firstMediaTab = mediaTab;\n }\n\n ++count;\n }\n });\n\n const membersTab = this.mediaTabsMap.get('members');\n membersTab.menuTab.classList.toggle('hide', !canViewMembers);\n\n if(canViewMembers) {\n firstMediaTab = membersTab;\n ++count;\n }\n\n this.container.classList.toggle('hide', !firstMediaTab);\n this.container.parentElement.classList.toggle('search-empty', !firstMediaTab);\n if(firstMediaTab) {\n this.skipScroll = true;\n this.selectTab(this.mediaTabs.indexOf(firstMediaTab), false);\n // firstMediaTab.menuTab.classList.add('active');\n\n this.navScrollableContainer.classList.toggle('hide', count <= 1);\n }\n }\n\n public async load(single = false, justLoad = false) {\n const peerId = this.searchContext.peerId;\n this.log('load', single, peerId, this.loadPromises);\n const middleware = this.middleware.get();\n\n if(this.firstLoad) {\n await (this.loadFirstTimePromise ??= this.loadFirstTime());\n if(!middleware()) {\n return;\n }\n\n this.loadFirstTimePromise = undefined;\n this.firstLoad = false;\n }\n\n let toLoad = single ? [this.mediaTab] : this.mediaTabs.filter((t) => t !== this.mediaTab);\n toLoad = toLoad.filter((mediaTab) => {\n return this.canLoadMediaTab(mediaTab);\n });\n\n if(peerId.isUser()) {\n findAndSplice(toLoad, (mediaTab) => mediaTab.type === 'members');\n }\n\n if(!toLoad.length) {\n return;\n }\n\n const loadCount = justLoad ? 50 : Math.round((windowSize.height / 130 | 0) * 3 * 1.25); // that's good for all types\n\n const promises: Promise[] = toLoad.map((mediaTab) => {\n return this.loadType(mediaTab, justLoad, loadCount, middleware);\n });\n\n return Promise.all(promises).catch((err) => {\n this.log.error('Load error all promises:', err);\n });\n }\n\n private getMonthContainerByTimestamp(timestamp: number, type: SearchSuperType) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n date.setDate(1);\n const dateTimestamp = date.getTime();\n const containers = this.monthContainers[type] ?? (this.monthContainers[type] = {});\n if(!(dateTimestamp in containers)) {\n const container = document.createElement('div');\n container.className = 'search-super-month';\n\n const name = document.createElement('div');\n name.classList.add('search-super-month-name');\n\n const options: Intl.DateTimeFormatOptions = {\n month: 'long'\n };\n\n if(date.getFullYear() !== new Date().getFullYear()) {\n options.year = 'numeric';\n }\n\n const dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n name.append(dateElement);\n\n container.append(name);\n\n const items = document.createElement('div');\n items.classList.add('search-super-month-items');\n\n container.append(name, items);\n\n const haveTimestamps = getObjectKeysAndSort(containers, 'desc');\n let i = 0;\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n if(dateTimestamp > t) {\n break;\n }\n }\n\n containers[dateTimestamp] = {container, items};\n positionElementByIndex(container, this.tabs[type], i);\n }\n\n return containers[dateTimestamp];\n }\n\n public canViewMembers() {\n const {peerId} = this.searchContext;\n const isAnyChat = peerId.isAnyChat();\n if(!isAnyChat) return Promise.resolve(false);\n const chatId = peerId.toChatId();\n return Promise.all([\n this.managers.appChatsManager.isBroadcast(chatId),\n this.managers.appChatsManager.hasRights(chatId, 'view_participants'),\n this.managers.appChatsManager.isForum(chatId)\n ]).then(([isBroadcast, hasRights, isForum]) => {\n return !isBroadcast && hasRights && (!this.searchContext.threadId || !isForum);\n });\n }\n\n public cleanup() {\n this.loadPromises = {};\n this.loaded = {};\n this.loadedChats = false;\n this.nextRates = {};\n this.firstLoad = true;\n this.prevTabId = -1;\n\n this.lazyLoadQueue.clear();\n\n this.mediaTabs.forEach((mediaTab) => {\n this.usedFromHistory[mediaTab.inputFilter] = -1;\n });\n\n if(this.selection?.isSelecting) {\n this.selection.cancelSelection();\n }\n\n // * must go to first tab (это костыль)\n /* const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n const tab = this.canViewMembers() ? membersTab : this.mediaTabs[this.mediaTabs.indexOf(membersTab) + 1];\n this.mediaTab = tab;\n } */\n\n this.middleware.clean();\n this.loadFirstTimePromise = undefined;\n this.cleanScrollPositions();\n this.membersList = undefined;\n }\n\n public cleanScrollPositions() {\n this.mediaTabs.forEach((mediaTab) => {\n mediaTab.scroll = undefined;\n });\n }\n\n public cleanupHTML(goFirst = false) {\n this.mediaTabs.forEach((tab) => {\n tab.contentTab.replaceChildren();\n\n if(this.hideEmptyTabs) {\n // tab.menuTab.classList.add('hide');\n this.container.classList.add('hide');\n this.container.parentElement.classList.add('search-empty');\n }\n\n if(tab.type === 'chats') {\n return;\n }\n\n if(!this.historyStorage[tab.inputFilter]) {\n const parent = tab.contentTab.parentElement;\n // if(!testScroll) {\n if(!parent.querySelector('.preloader')) {\n putPreloader(parent, true);\n }\n // }\n\n const empty = parent.querySelector('.content-empty');\n if(empty) {\n empty.remove();\n }\n }\n });\n\n /* if(goFirst) {\n const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n let idx = this.canViewMembers() ? 0 : 1;\n membersTab.menuTab.classList.toggle('hide', idx !== 0);\n\n this.selectTab(idx, false);\n } else {\n this.selectTab(0, false);\n }\n } */\n\n this.monthContainers = {};\n this.searchGroupMedia.clear();\n this.scrollable.scrollTop = 0;\n\n /* if(testScroll) {\n for(let i = 0; i < 1500; ++i) {\n let div = document.createElement('div');\n div.insertAdjacentHTML('beforeend', ``);\n div.classList.add('grid-item');\n div.dataset.id = '' + (i / 3 | 0);\n //div.innerText = '' + (i / 3 | 0);\n this.tabs.inputMessagesFilterPhotoVideo.append(div);\n }\n } */\n }\n\n private copySearchContext(newInputFilter: MyInputMessagesFilter) {\n const context = copy(this.searchContext);\n context.inputFilter = {_: newInputFilter};\n context.nextRate = this.nextRates[newInputFilter];\n return context;\n }\n\n public setQuery({peerId, query, threadId, historyStorage, folderId, minDate, maxDate}: {\n peerId: PeerId,\n query?: string,\n threadId?: number,\n historyStorage?: AppSearchSuper['historyStorage'],\n folderId?: number,\n minDate?: number,\n maxDate?: number\n }) {\n this.searchContext = {\n peerId,\n query: query || '',\n inputFilter: {_: this.mediaTab.inputFilter},\n threadId,\n folderId,\n minDate,\n maxDate\n };\n\n this.historyStorage = historyStorage ?? {};\n\n this.cleanup();\n }\n\n public destroy() {\n this.cleanup();\n this.listenerSetter.removeAll();\n this.scrollable.destroy();\n this.swipeHandler?.removeListeners();\n this.selection?.cleanup();\n\n this.scrollStartCallback = undefined;\n this.onChangeTab = undefined;\n this.selectTab = undefined;\n this.searchContextMenu = undefined;\n this.swipeHandler = undefined;\n this.selection = undefined;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from './cancelEvent';\n\nexport default function lockTouchScroll(container: HTMLElement) {\n const onTouchMove = (e: TouchEvent) => {\n cancelEvent(e);\n };\n\n let lockers = 2;\n const cb = () => {\n if(!--lockers) {\n container.removeEventListener('touchmove', onTouchMove, {capture: true});\n }\n };\n\n container.addEventListener('touchmove', onTouchMove, {capture: true, passive: false});\n container.addEventListener('touchend', cb, {once: true});\n\n return cb;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ChatRights} from '../lib/appManagers/appChatsManager';\nimport type {Dialog} from '../lib/appManagers/appMessagesManager';\nimport appDialogsManager, {DialogElementSize as DialogElementSize} from '../lib/appManagers/appDialogsManager';\nimport rootScope from '../lib/rootScope';\nimport Scrollable from './scrollable';\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\nimport CheckboxField from './checkboxField';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport findUpAttribute from '../helpers/dom/findUpAttribute';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport PeerTitle from './peerTitle';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport debounce from '../helpers/schedulers/debounce';\nimport windowSize from '../helpers/windowSize';\nimport type {IsPeerType} from '../lib/appManagers/appPeersManager';\nimport {attachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport filterUnique from '../helpers/array/filterUnique';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport safeAssign from '../helpers/object/safeAssign';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport AvatarElement from './avatar';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport filterAsync from '../helpers/array/filterAsync';\nimport getParticipantPeerId from '../lib/appManagers/utils/chats/getParticipantPeerId';\nimport getChatMembersString from './wrappers/getChatMembersString';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport {Chat, User} from '../layer';\nimport canSendToUser from '../lib/appManagers/utils/users/canSendToUser';\nimport hasRights from '../lib/appManagers/utils/chats/hasRights';\nimport getDialogIndex from '../lib/appManagers/utils/dialogs/getDialogIndex';\nimport {generateDelimiter} from './generateDelimiter';\nimport SettingSection from './settingSection';\n\ntype SelectSearchPeerType = 'contacts' | 'dialogs' | 'channelParticipants';\n\n// TODO: правильная сортировка для addMembers, т.е. для peerType: 'contacts', потому что там идут сначала контакты - потом неконтакты, а должно всё сортироваться по имени\n\nexport default class AppSelectPeers {\n public container = document.createElement('div');\n public list = appDialogsManager.createChatList(/* {\n handheldsSize: 66,\n avatarSize: 48\n } */);\n private chatsContainer = document.createElement('div');\n public scrollable: Scrollable;\n private selectedScrollable: Scrollable;\n\n private selectedContainer: HTMLElement;\n public input: HTMLInputElement;\n\n // public selected: {[peerId: PeerId]: HTMLElement} = {};\n public selected = new Set();\n\n public freezed = false;\n\n private folderId = 0;\n private offsetIndex = 0;\n private promise: Promise;\n\n private query = '';\n private cachedContacts: PeerId[];\n\n private loadedWhat: Partial<{[k in 'dialogs' | 'archived' | 'contacts' | 'channelParticipants']: true}> = {};\n\n private renderedPeerIds: Set = new Set();\n\n private appendTo: HTMLElement;\n private onChange: (length: number) => void;\n private peerType: SelectSearchPeerType[] = ['dialogs'];\n private renderResultsFunc: (peerIds: PeerId[]) => void | Promise;\n private chatRightsAction: ChatRights;\n private multiSelect = true;\n private rippleEnabled = true;\n private avatarSize: DialogElementSize = 'abitbigger';\n private exceptSelf = false;\n private filterPeerTypeBy: IsPeerType[];\n\n private tempIds: {[k in keyof AppSelectPeers['loadedWhat']]: number} = {};\n private peerId: PeerId;\n\n private placeholder: LangPackKey;\n\n private selfPresence: LangPackKey = 'Presence.YourChat';\n\n private needSwitchList = false;\n\n private sectionNameLangPackKey: LangPackKey;\n\n private managers: AppManagers;\n\n private design: 'round' | 'square' = 'round';\n\n constructor(options: {\n appendTo: AppSelectPeers['appendTo'],\n onChange?: AppSelectPeers['onChange'],\n peerType?: AppSelectPeers['peerType'],\n peerId?: AppSelectPeers['peerId'],\n onFirstRender?: () => void,\n renderResultsFunc?: AppSelectPeers['renderResultsFunc'],\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\n multiSelect?: AppSelectPeers['multiSelect'],\n rippleEnabled?: AppSelectPeers['rippleEnabled'],\n avatarSize?: AppSelectPeers['avatarSize'],\n placeholder?: AppSelectPeers['placeholder'],\n selfPresence?: AppSelectPeers['selfPresence'],\n exceptSelf?: AppSelectPeers['exceptSelf'],\n filterPeerTypeBy?: AppSelectPeers['filterPeerTypeBy'],\n sectionNameLangPackKey?: AppSelectPeers['sectionNameLangPackKey'],\n managers: AppSelectPeers['managers'],\n design?: AppSelectPeers['design']\n }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector', 'selector-' + this.design);\n\n const f = (this.renderResultsFunc || this.renderResults).bind(this);\n this.renderResultsFunc = async(peerIds) => {\n if(this.needSwitchList) {\n this.scrollable.splitUp.replaceWith(this.list);\n this.scrollable.setVirtualContainer(this.list);\n this.needSwitchList = false;\n }\n\n peerIds = peerIds.filter((peerId) => {\n const notRendered = !this.renderedPeerIds.has(peerId);\n if(notRendered) this.renderedPeerIds.add(peerId);\n return notRendered;\n });\n\n if(this.filterPeerTypeBy) {\n peerIds = await filterAsync(peerIds, async(peerId) => {\n if(peerId.isPeerId()) {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(peer) {\n for(const method of this.filterPeerTypeBy) {\n if(await this.managers.appPeersManager[method](peerId)) {\n return true;\n }\n }\n }\n }\n\n return true;\n });\n }\n\n return f(peerIds);\n };\n\n this.input = document.createElement('input');\n this.input.classList.add('selector-search-input');\n if(this.placeholder) {\n _i18n(this.input, this.placeholder, undefined, 'placeholder');\n } else {\n _i18n(this.input, 'SendMessageTo', undefined, 'placeholder');\n }\n\n this.input.type = 'text';\n\n if(this.multiSelect) {\n const section = new SettingSection({});\n section.innerContainer.classList.add('selector-search-section');\n const topContainer = document.createElement('div');\n topContainer.classList.add('selector-search-container');\n\n this.selectedContainer = document.createElement('div');\n this.selectedContainer.classList.add('selector-search');\n\n this.selectedContainer.append(this.input);\n topContainer.append(this.selectedContainer);\n this.selectedScrollable = new Scrollable(topContainer);\n\n // let delimiter = document.createElement('hr');\n\n attachClickEvent(this.selectedContainer, (e) => {\n if(this.freezed) return;\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'selector-user');\n\n if(!target) return;\n\n const peerId = target.dataset.key;\n const li = this.chatsContainer.querySelector('[data-peer-id=\"' + peerId + '\"]') as HTMLElement;\n if(!li) {\n this.remove(peerId.toPeerId());\n } else {\n simulateClickEvent(li);\n }\n });\n\n section.content.append(topContainer);\n this.container.append(section.container/* , delimiter */);\n }\n\n this.chatsContainer.classList.add('chatlist-container');\n // this.chatsContainer.append(this.list);\n const section = new SettingSection({\n name: this.sectionNameLangPackKey,\n noShadow: true\n });\n section.content.append(this.list);\n this.chatsContainer.append(section.container);\n this.scrollable = new Scrollable(this.chatsContainer);\n this.scrollable.setVirtualContainer(this.list);\n\n attachClickEvent(this.chatsContainer, (e) => {\n const target = findUpAttribute(e.target, 'data-peer-id') as HTMLElement;\n cancelEvent(e);\n\n if(!target) return;\n if(this.freezed) return;\n\n let key: PeerId | string = target.dataset.peerId;\n key = key.isPeerId() ? key.toPeerId() : key;\n\n if(!this.multiSelect) {\n this.add(key);\n return;\n }\n\n // target.classList.toggle('active');\n if(this.selected.has(key)) {\n this.remove(key);\n } else {\n this.add(key);\n }\n\n const checkbox = target.querySelector('input') as HTMLInputElement;\n checkbox.checked = !checkbox.checked;\n });\n\n const debouncedInput = debounce(this.onInput, 200, false, true);\n this.input.addEventListener('input', debouncedInput);\n\n this.scrollable.onScrolledBottom = () => {\n this.getMoreResults();\n };\n\n this.scrollable.container.prepend(generateDelimiter());\n\n this.container.append(this.chatsContainer);\n this.appendTo.append(this.container);\n\n // WARNING TIMEOUT\n setTimeout(() => {\n const getResultsPromise = this.getMoreResults() as Promise;\n if(options.onFirstRender) {\n getResultsPromise.then(() => {\n options.onFirstRender();\n });\n }\n }, 0);\n }\n\n private onInput = () => {\n const value = this.input.value;\n if(this.query !== value) {\n if(this.peerType.includes('contacts') || this.peerType.includes('dialogs')) {\n this.cachedContacts = undefined;\n }\n\n if(this.peerType.includes('dialogs')) {\n this.folderId = 0;\n this.offsetIndex = 0;\n }\n\n for(const i in this.tempIds) {\n // @ts-ignore\n ++this.tempIds[i];\n }\n\n this.list = appDialogsManager.createChatList();\n\n this.promise = undefined;\n this.loadedWhat = {};\n this.query = value;\n this.renderedPeerIds.clear();\n this.needSwitchList = true;\n\n // console.log('selectPeers input:', this.query);\n this.getMoreResults();\n }\n };\n\n private async renderSaved() {\n if(\n !this.exceptSelf &&\n !this.offsetIndex &&\n this.folderId === 0 &&\n this.peerType.includes('dialogs') &&\n (!this.query || await this.managers.appUsersManager.testSelfSearch(this.query))\n ) {\n await this.renderResultsFunc([rootScope.myId]);\n }\n }\n\n private getTempId(type: keyof AppSelectPeers['tempIds']) {\n this.tempIds[type] ??= 0;\n const tempId = ++this.tempIds[type];\n return {\n tempId,\n middleware: () => this.tempIds[type] === tempId\n };\n }\n\n private async getMoreDialogs(): Promise {\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n\n // в десктопе - сначала без группы, потом архивные, потом контакты без сообщений\n const pageCount = windowSize.height / 56 * 1.25 | 0;\n\n const {middleware} = this.getTempId('dialogs');\n const promise = this.managers.dialogsStorage.getDialogs({\n query: this.query,\n offsetIndex: this.offsetIndex,\n limit: pageCount,\n filterId: this.folderId,\n skipMigrated: true\n });\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat[this.loadedWhat.dialogs ? 'archived' : 'dialogs'] = true;\n });\n\n const value = await promise;\n if(!middleware()) {\n return;\n }\n\n let dialogs = value.dialogs as Dialog[];\n if(dialogs.length) {\n const newOffsetIndex = getDialogIndex(dialogs[dialogs.length - 1]) || 0;\n\n dialogs = dialogs.slice();\n findAndSplice(dialogs, d => d.peerId === rootScope.myId); // no my account\n\n if(this.chatRightsAction) {\n dialogs = await filterAsync(dialogs, (d) => this.filterByRights(d.peerId));\n if(!middleware()) {\n return;\n }\n }\n\n await this.renderSaved();\n if(!middleware()) {\n return;\n }\n\n this.offsetIndex = newOffsetIndex;\n }\n\n this.renderResultsFunc(dialogs.map((dialog) => dialog.peerId));\n\n if(value.isEnd) {\n if(!this.loadedWhat.dialogs) {\n await this.renderSaved();\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.dialogs = true;\n this.offsetIndex = 0;\n this.folderId = 1;\n\n return this.getMoreDialogs();\n } else {\n this.loadedWhat.archived = true;\n\n if(!this.loadedWhat.contacts/* && this.peerType.includes('contacts') */) {\n return this.getMoreContacts();\n }\n }\n }\n }\n\n private async filterByRights(peerId: PeerId) {\n const peer: User | Chat = await this.managers.appPeersManager.getPeer(peerId);\n if(peerId.isUser()) {\n return this.chatRightsAction !== 'send_messages' || canSendToUser(peer as User.user);\n } else if(hasRights(peer as Chat.chat, this.chatRightsAction)) {\n return true;\n }\n }\n\n private async getMoreContacts() {\n if(this.loadedWhat.contacts) {\n return;\n }\n\n const isGlobalSearch = this.peerType.includes('contacts');\n\n if(!this.cachedContacts) {\n /* const promises: Promise[] = [appUsersManager.getContacts(this.query)];\n if(!this.peerType.includes('dialogs')) {\n promises.push(appMessagesManager.getConversationsAll());\n }\n\n this.promise = Promise.all(promises);\n this.cachedContacts = (await this.promise)[0].slice(); */\n const {middleware} = this.getTempId('contacts');\n const promise = Promise.all([\n isGlobalSearch ? this.managers.appUsersManager.getContactsPeerIds(this.query) : [],\n this.query ? this.managers.appUsersManager.searchContacts(this.query) : undefined\n ]);\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.contacts = true;\n });\n\n const [cachedContacts, searchResult] = await promise;\n if(!middleware()) {\n return;\n }\n\n if(searchResult) {\n // do not add global result if only dialogs needed\n let resultPeerIds = isGlobalSearch ? searchResult.my_results.concat(searchResult.results) : searchResult.my_results;\n\n if(this.chatRightsAction) {\n resultPeerIds = await filterAsync(resultPeerIds, (peerId) => this.filterByRights(peerId));\n if(!middleware()) {\n return;\n }\n }\n\n if(!this.peerType.includes('dialogs')) {\n resultPeerIds = resultPeerIds.filter((peerId) => peerId.isUser());\n }\n\n this.cachedContacts = filterUnique(cachedContacts.concat(resultPeerIds));\n } else this.cachedContacts = cachedContacts.slice();\n\n indexOfAndSplice(this.cachedContacts, rootScope.myId); // no my account\n }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.height / 56 * 1.25 | 0;\n const arr = this.cachedContacts.splice(0, pageCount);\n this.renderResultsFunc(arr);\n // }\n\n if(!this.cachedContacts.length) {\n this.loadedWhat.contacts = true;\n\n // need to load non-contacts\n /* if(!this.peerType.includes('dialogs')) {\n return this.getMoreDialogs();\n } */\n }\n }\n\n private async getMoreChannelParticipants() {\n if(this.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const {middleware} = this.getTempId('channelParticipants');\n const promise = this.managers.appProfileManager.getChannelParticipants(\n this.peerId.toChatId(),\n {\n _: 'channelParticipantsSearch',\n q: this.query\n },\n pageCount,\n this.list.childElementCount\n );\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.channelParticipants = true;\n });\n\n const participants = await promise;\n if(!middleware()) {\n return;\n }\n\n const peerIds = participants.participants.map((participant) => {\n return getParticipantPeerId(participant);\n });\n indexOfAndSplice(peerIds, rootScope.myId);\n this.renderResultsFunc(peerIds);\n\n if(this.list.childElementCount >= participants.count || participants.participants.length < pageCount) {\n this.loadedWhat.channelParticipants = true;\n }\n }\n\n checkForTriggers = () => {\n this.scrollable.checkForTriggers();\n };\n\n private getMoreResults() {\n if(this.promise) {\n return this.promise;\n }\n\n const get = () => {\n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n return this.getMoreSomething('dialogs');\n }\n\n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n return this.getMoreSomething('contacts');\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n return this.getMoreSomething('channelParticipants');\n }\n };\n\n const loadPromise = get();\n if(!loadPromise) {\n return Promise.resolve();\n }\n\n const promise = this.promise = loadPromise.catch((err) => {\n console.error('get more result error', err);\n }).finally(() => {\n if(this.promise === promise) {\n this.promise = undefined;\n }\n\n this.checkForTriggers();\n });\n\n return promise;\n }\n\n private getMoreSomething(peerType: SelectSearchPeerType) {\n const map: {[type in SelectSearchPeerType]: () => Promise} = {\n dialogs: this.getMoreDialogs,\n contacts: this.getMoreContacts,\n channelParticipants: this.getMoreChannelParticipants\n };\n\n const promise = map[peerType].call(this);\n return promise;\n }\n\n private async renderResults(peerIds: PeerId[]) {\n // console.log('will renderResults:', peerIds);\n\n // оставим только неконтакты с диалогов\n if(!this.peerType.includes('dialogs') && this.loadedWhat.contacts) {\n peerIds = await filterAsync(peerIds, (peerId) => {\n return this.managers.appUsersManager.isNonContactUser(peerId);\n });\n }\n\n peerIds.forEach(async(peerId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.scrollable,\n rippleEnabled: this.rippleEnabled,\n avatarSize: this.avatarSize\n });\n\n if(this.multiSelect) {\n const selected = this.selected.has(peerId);\n const checkboxField = new CheckboxField();\n\n if(selected) {\n // dom.listEl.classList.add('active');\n checkboxField.input.checked = true;\n }\n\n dom.containerEl.prepend(checkboxField.label);\n }\n\n let subtitleEl: HTMLElement;\n if(peerId.isAnyChat()) {\n subtitleEl = await getChatMembersString(peerId.toChatId());\n } else if(peerId === rootScope.myId) {\n subtitleEl = i18n(this.selfPresence);\n } else {\n subtitleEl = getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId()));\n }\n\n dom.lastMessageSpan.append(subtitleEl);\n });\n }\n\n public add(key: PeerId | string, title?: string | HTMLElement, scroll = true) {\n // console.trace('add');\n this.selected.add(key);\n\n if(!this.multiSelect) {\n this.onChange(this.selected.size);\n return;\n }\n\n if(this.query.trim()) {\n this.input.value = '';\n this.onInput();\n }\n\n const div = document.createElement('div');\n div.classList.add('selector-user', 'scale-in');\n\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-32');\n avatarEl.isDialog = true;\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n const peerTitle = new PeerTitle();\n peerTitle.update({peerId: key.toPeerId(), dialog: true});\n title = peerTitle.element;\n }\n\n avatarEl.updateWithOptions({\n peerId: key as PeerId\n });\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n this.selectedContainer.insertBefore(div, this.input);\n // this.selectedScrollable.scrollTop = this.selectedScrollable.scrollHeight;\n this.onChange?.(this.selected.size);\n\n if(scroll) {\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input,\n position: 'center'\n });\n }\n\n return div;\n }\n\n public remove(key: PeerId | string) {\n if(!this.multiSelect) return;\n // const div = this.selected[peerId];\n const div = this.selectedContainer.querySelector(`[data-key=\"${key}\"]`) as HTMLElement;\n div.classList.remove('scale-in');\n void div.offsetWidth;\n div.classList.add('scale-out');\n\n const onAnimationEnd = () => {\n this.selected.delete(key);\n div.remove();\n this.onChange && this.onChange(this.selected.size);\n };\n\n if(rootScope.settings.animationsEnabled) {\n div.addEventListener('animationend', onAnimationEnd, {once: true});\n } else {\n onAnimationEnd();\n }\n }\n\n public getSelected() {\n return [...this.selected];\n }\n\n public addInitial(values: any[]) {\n values.forEach((value) => {\n this.add(value, undefined, false);\n });\n\n window.requestAnimationFrame(() => { // ! not the best place for this raf though it works\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input,\n position: 'center',\n forceDirection: FocusDirection.Static\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport ProgressivePreloader from './preloader';\nimport appMediaPlaybackController, {MediaItem, MediaSearchContext} from './appMediaPlaybackController';\nimport {DocumentAttribute, Message} from '../layer';\nimport mediaSizes from '../helpers/mediaSizes';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport rootScope from '../lib/rootScope';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport LazyLoadQueue from './lazyLoadQueue';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport ListenerSetter, {Listener} from '../helpers/listenerSetter';\nimport noop from '../helpers/noop';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport {joinElementsWith} from '../lib/langPack';\nimport {MiddleEllipsisElement} from './middleEllipsis';\nimport {formatFullSentTime} from '../helpers/date';\nimport throttleWithRaf from '../helpers/schedulers/throttleWithRaf';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport formatBytes from '../helpers/formatBytes';\nimport {animateSingle} from '../helpers/animation';\nimport clamp from '../helpers/number/clamp';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport MediaProgressLine from './mediaProgressLine';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport wrapSenderToPeer from './wrappers/senderToPeer';\nimport wrapSentTime from './wrappers/sentTime';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport wrapPhoto from './wrappers/photo';\n\nrootScope.addEventListener('messages_media_read', ({mids, peerId}) => {\n mids.forEach((mid) => {\n const attr = `[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`;\n (Array.from(document.querySelectorAll(`audio-element.is-unread${attr}, .media-round.is-unread${attr}`)) as AudioElement[]).forEach((elem) => {\n elem.classList.remove('is-unread');\n });\n });\n});\n\n// https://github.com/LonamiWebs/Telethon/blob/4393ec0b83d511b6a20d8a20334138730f084375/telethon/utils.py#L1285\nexport function decodeWaveform(waveform: Uint8Array | number[]) {\n if(!(waveform instanceof Uint8Array)) {\n waveform = new Uint8Array(waveform);\n }\n\n const bitCount = waveform.length * 8;\n const valueCount = bitCount / 5 | 0;\n if(!valueCount) {\n return new Uint8Array([]);\n }\n\n let result: Uint8Array;\n try {\n const dataView = new DataView(waveform.buffer);\n result = new Uint8Array(valueCount);\n for(let i = 0; i < valueCount; i++) {\n const byteIndex = i * 5 / 8 | 0;\n const bitShift = i * 5 % 8;\n const value = dataView.getUint16(byteIndex, true);\n result[i] = (value >> bitShift) & 0b00011111;\n }\n } catch(err) {\n result = new Uint8Array([]);\n }\n\n /* var byteIndex = (valueCount - 1) / 8 | 0;\n var bitShift = (valueCount - 1) % 8;\n if(byteIndex === waveform.length - 1) {\n var value = waveform[byteIndex];\n } else {\n var value = dataView.getUint16(byteIndex, true);\n }\n console.log('decoded waveform, setting last value:', value, byteIndex, bitShift);\n result[valueCount - 1] = (value >> bitShift) & 0b00011111; */\n return result;\n}\n\nfunction createWaveformBars(waveform: Uint8Array, duration: number) {\n const barWidth = 2;\n const barMargin = 2; // mediaSizes.isMobile ? 2 : 1;\n const barHeightMin = 4; // mediaSizes.isMobile ? 3 : 2;\n const barHeightMax = mediaSizes.isMobile ? 16 : 23;\n // const availW = 150; //mediaSizes.isMobile ? 152 : 190;\n\n const minW = mediaSizes.isMobile ? 152 : 190;\n const maxW = mediaSizes.isMobile ? 190 : 256;\n const availW = clamp(duration / 60 * maxW, minW, maxW); // mediaSizes.isMobile ? 152 : 224;\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.classList.add('audio-waveform-bars');\n svg.setAttributeNS(null, 'width', '' + availW);\n svg.setAttributeNS(null, 'height', '' + barHeightMax);\n svg.setAttributeNS(null, 'viewBox', `0 0 ${availW} ${barHeightMax}`);\n\n // console.log('decoded waveform:', waveform);\n\n const normValue = Math.max(...waveform);\n const wfSize = waveform.length ? waveform.length : 100;\n const barCount = Math.min((availW / (barWidth + barMargin)) | 0, wfSize);\n\n let maxValue = 0;\n const maxDelta = barHeightMax - barHeightMin;\n\n let html = '';\n for(let i = 0, barX = 0, sumI = 0; i < wfSize; ++i) {\n const value = waveform[i] || 0;\n if((sumI + barCount) >= wfSize) { // draw bar\n sumI = sumI + barCount - wfSize;\n if(sumI < (barCount + 1) / 2) {\n if(maxValue < value) maxValue = value;\n }\n\n const bar_value = Math.max(((maxValue * maxDelta) + ((normValue + 1) / 2)) / (normValue + 1), barHeightMin);\n\n const h = `\n \n `;\n html += h;\n\n barX += barWidth + barMargin;\n\n if(sumI < (barCount + 1) / 2) {\n maxValue = 0;\n } else {\n maxValue = value;\n }\n } else {\n if(maxValue < value) maxValue = value;\n\n sumI += barCount;\n }\n }\n\n const container = document.createElement('div');\n container.classList.add('audio-waveform');\n container.append(svg);\n\n svg.insertAdjacentHTML('beforeend', html);\n return {svg, container, availW};\n}\n\nasync function wrapVoiceMessage(audioEl: AudioElement) {\n audioEl.classList.add('is-voice');\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n if(message.pFlags.out) {\n audioEl.classList.add('is-out');\n }\n\n let waveform = (doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio).waveform || new Uint8Array([]);\n waveform = decodeWaveform(waveform.slice(0, 63));\n\n const {svg, container: svgContainer, availW} = createWaveformBars(waveform, doc.duration);\n\n const fakeSvgContainer = svgContainer.cloneNode(true) as HTMLElement;\n fakeSvgContainer.classList.add('audio-waveform-fake');\n svgContainer.classList.add('audio-waveform-background');\n\n const waveformContainer = document.createElement('div');\n waveformContainer.classList.add('audio-waveform-container');\n waveformContainer.append(svgContainer, fakeSvgContainer);\n\n const timeDiv = document.createElement('div');\n timeDiv.classList.add('audio-time');\n audioEl.append(waveformContainer, timeDiv);\n\n let progress = svg as any as HTMLElement;\n\n const onLoad = () => {\n let audio = audioEl.audio;\n\n const setAnimation = () => {\n animateSingle(() => {\n if(!audio) return false;\n onTimeUpdate();\n return !audio.paused;\n }, audioEl);\n };\n\n const onTimeUpdate = () => {\n fakeSvgContainer.style.width = (audio.currentTime / audio.duration * 100) + '%';\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onTimeUpdate();\n }\n\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\n audioEl.addAudioListener('timeupdate', throttledTimeUpdate);\n audioEl.addAudioListener('ended', throttledTimeUpdate);\n audioEl.addAudioListener('play', setAnimation);\n\n audioEl.readyPromise.then(() => {\n let mousedown = false, mousemove = false;\n progress.addEventListener('mouseleave', (e) => {\n if(mousedown) {\n audio.play();\n mousedown = false;\n }\n mousemove = false;\n });\n progress.addEventListener('mousemove', (e) => {\n mousemove = true;\n if(mousedown) scrub(e);\n });\n progress.addEventListener('mousedown', (e) => {\n e.preventDefault();\n if(e.button !== 0) return;\n if(!audio.paused) {\n audio.pause();\n }\n\n scrub(e);\n mousedown = true;\n });\n progress.addEventListener('mouseup', (e) => {\n if(mousemove && mousedown) {\n audio.play();\n mousedown = false;\n }\n });\n attachClickEvent(progress, (e) => {\n cancelEvent(e);\n if(!audio.paused) scrub(e);\n });\n\n function scrub(e: MouseEvent | TouchEvent) {\n let offsetX: number;\n if(e instanceof MouseEvent) {\n offsetX = e.offsetX;\n } else { // touch\n const rect = (e.target as HTMLElement).getBoundingClientRect();\n offsetX = e.targetTouches[0].pageX - rect.left;\n }\n\n const scrubTime = offsetX / availW /* width */ * audio.duration;\n audio.currentTime = scrubTime;\n }\n }, noop);\n\n return () => {\n progress.remove();\n progress = null;\n audio = null;\n };\n };\n\n return onLoad;\n}\n\nasync function wrapAudio(audioEl: AudioElement) {\n const withTime = audioEl.withTime;\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('audio-description');\n\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n\n if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(audioAttribute?.performer) {\n parts.push(wrapEmojiText(audioAttribute.performer));\n }\n\n if(withTime) {\n parts.push(formatFullSentTime(message.date));\n } else if(!parts.length) {\n parts.push(formatBytes(doc.size));\n }\n\n if(audioEl.showSender) {\n parts.push(await wrapSenderToPeer(message));\n }\n\n descriptionEl.append(...joinElementsWith(parts, ' • '));\n }\n\n const html = `\n
\n
\n
\n
`;\n audioEl.insertAdjacentHTML('beforeend', html);\n\n const titleEl = audioEl.querySelector('.audio-title') as HTMLElement;\n\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = audioEl.dataset.fontWeight;\n middleEllipsisEl.dataset.fontSize = audioEl.dataset.fontSize;\n middleEllipsisEl.dataset.sizeType = audioEl.dataset.sizeType;\n if(isVoice) {\n middleEllipsisEl.append(await wrapSenderToPeer(message));\n } else {\n setInnerHTML(middleEllipsisEl, wrapEmojiText(audioAttribute?.title ?? doc.file_name));\n }\n\n titleEl.append(middleEllipsisEl);\n\n if(audioEl.showSender) {\n titleEl.append(wrapSentTime(message));\n }\n\n const subtitleDiv = audioEl.querySelector('.audio-subtitle') as HTMLDivElement;\n subtitleDiv.append(descriptionEl);\n\n const onLoad = () => {\n let launched = false;\n\n let progressLine = new MediaProgressLine(audioEl.audio, doc.supportsStreaming);\n\n audioEl.addAudioListener('ended', () => {\n audioEl.classList.remove('audio-show-progress');\n // Reset subtitle\n subtitleDiv.lastChild.replaceWith(descriptionEl);\n launched = false;\n });\n\n const onPlay = () => {\n if(!launched) {\n audioEl.classList.add('audio-show-progress');\n launched = true;\n\n if(progressLine) {\n subtitleDiv.lastChild.replaceWith(progressLine.container);\n }\n }\n };\n\n audioEl.addAudioListener('play', onPlay);\n\n if(!audioEl.audio.paused || audioEl.audio.currentTime > 0) {\n onPlay();\n }\n\n return () => {\n progressLine.removeListeners();\n progressLine.container.remove();\n progressLine = null;\n };\n };\n\n return onLoad;\n}\n\nfunction constructDownloadPreloader(tryAgainOnFail = true) {\n const preloader = new ProgressivePreloader({cancelable: true, tryAgainOnFail});\n preloader.construct();\n\n if(!tryAgainOnFail) {\n preloader.circle.setAttributeNS(null, 'r', '23');\n preloader.totalLength = 143.58203125;\n }\n\n return preloader;\n}\n\nexport const findMediaTargets = (anchor: HTMLElement, anchorMid: number/* , useSearch: boolean */) => {\n let prev: MediaItem[], next: MediaItem[];\n // if(anchor.classList.contains('search-super-item') || !useSearch) {\n const isBubbles = !anchor.classList.contains('search-super-item');\n const container = findUpClassName(anchor, !isBubbles ? 'tabs-tab' : 'bubbles-inner');\n if(container) {\n const attr = `:not([data-is-outgoing=\"1\"])`;\n const justAudioSelector = `.audio:not(.is-voice)${attr}`;\n let selectors: string[];\n if(!anchor.matches(justAudioSelector)) {\n selectors = [`.audio.is-voice${attr}`, `.media-round${attr}`];\n } else {\n selectors = [justAudioSelector];\n }\n\n if(isBubbles) {\n const prefix = '.bubble:not(.webpage) ';\n selectors = selectors.map((s) => prefix + s);\n }\n\n const selector = selectors.join(', ');\n\n const elements = Array.from(container.querySelectorAll(selector)) as HTMLElement[];\n const idx = elements.indexOf(anchor);\n\n const mediaItems: MediaItem[] = elements.map((element) => ({peerId: element.dataset.peerId.toPeerId(), mid: +element.dataset.mid}));\n\n prev = mediaItems.slice(0, idx);\n next = mediaItems.slice(idx + 1);\n }\n // }\n\n if((next.length && next[0].mid < anchorMid) || (prev.length && prev[prev.length - 1].mid > anchorMid)) {\n [prev, next] = [next.reverse(), prev.reverse()];\n }\n\n // prev = next = undefined;\n\n return [prev, next];\n};\n\nexport default class AudioElement extends HTMLElement {\n public audio: HTMLAudioElement;\n public preloader: ProgressivePreloader;\n public message: Message.message;\n public withTime = false;\n public voiceAsMusic = false;\n public searchContext: MediaSearchContext;\n public showSender = false;\n public noAutoDownload: boolean;\n public lazyLoadQueue: LazyLoadQueue;\n public loadPromises: Promise[];\n public managers: AppManagers;\n\n private listenerSetter = new ListenerSetter();\n private onTypeDisconnect: () => void;\n public onLoad: (autoload?: boolean) => void;\n public readyPromise: CancellablePromise;\n\n public async render() {\n this.classList.add('audio');\n this.managers = rootScope.managers;\n\n this.dataset.mid = '' + this.message.mid;\n this.dataset.peerId = '' + this.message.peerId;\n\n const doc = getMediaFromMessage(this.message) as MyDocument;\n const isRealVoice = doc.type === 'voice';\n const isVoice = !this.voiceAsMusic && isRealVoice;\n const isOutgoing = this.message.pFlags.is_outgoing;\n const uploadingFileName = this.message?.uploadingFileName;\n\n const durationStr = toHHMMSS(doc.duration | 0);\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n
`;\n\n const toggle = this.firstElementChild as HTMLElement;\n\n const downloadDiv = document.createElement('div');\n downloadDiv.classList.add('audio-download');\n\n const isUnread = doc.type !== 'audio' && this.message && this.message.pFlags.media_unread;\n if(isUnread) {\n this.classList.add('is-unread');\n }\n\n if(uploadingFileName) {\n this.classList.add('is-outgoing');\n this.append(downloadDiv);\n }\n\n const onTypeLoad = await (isVoice ? wrapVoiceMessage(this) : wrapAudio(this));\n\n const audioTimeDiv = this.querySelector('.audio-time') as HTMLDivElement;\n audioTimeDiv.innerHTML = durationStr;\n\n const onLoad = this.onLoad = (autoload: boolean) => {\n this.onLoad = undefined;\n\n const audio = this.audio = appMediaPlaybackController.addMedia(this.message, autoload);\n\n const readyPromise = this.readyPromise = deferredPromise();\n if(this.audio.readyState >= this.audio.HAVE_CURRENT_DATA) readyPromise.resolve();\n else {\n this.addAudioListener('canplay', () => readyPromise.resolve(), {once: true});\n }\n\n this.onTypeDisconnect = onTypeLoad();\n\n const getTimeStr = () => toHHMMSS(audio.currentTime | 0) + (isVoice ? (' / ' + durationStr) : '');\n\n const onPlay = () => {\n audioTimeDiv.innerText = getTimeStr();\n toggle.classList.toggle('playing', !audio.paused);\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onPlay();\n }\n\n const togglePlay = (e?: Event, paused = audio.paused) => {\n e && cancelEvent(e);\n\n if(paused) {\n const hadSearchContext = !!this.searchContext;\n if(appMediaPlaybackController.setSearchContext(this.searchContext || {\n peerId: NULL_PEER_ID,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(this, this.message.mid/* , this.searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: this.message.peerId, mid: this.message.mid}, prev, next);\n }\n\n audio.play().catch(() => {});\n } else {\n audio.pause();\n }\n };\n\n attachClickEvent(toggle, (e) => togglePlay(e), {listenerSetter: this.listenerSetter});\n\n this.addAudioListener('ended', () => {\n toggle.classList.remove('playing');\n audioTimeDiv.innerText = durationStr;\n });\n\n this.addAudioListener('timeupdate', () => {\n if((!audio.currentTime && audio.paused) || appMediaPlaybackController.isSafariBuffering(audio)) return;\n audioTimeDiv.innerText = getTimeStr();\n });\n\n this.addAudioListener('pause', () => {\n toggle.classList.remove('playing');\n });\n\n this.addAudioListener('play', onPlay);\n\n return togglePlay;\n };\n\n if(doc.thumbs?.length) {\n const imgs: HTMLElement[] = [];\n const wrapped = await wrapPhoto({\n photo: doc,\n message: null,\n container: toggle,\n boxWidth: 48,\n boxHeight: 48,\n loadPromises: this.loadPromises,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue\n });\n toggle.style.width = toggle.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n\n this.classList.add('audio-with-thumb');\n imgs.forEach((img) => img.classList.add('audio-thumb'));\n }\n\n if(!isOutgoing) {\n let preloader: ProgressivePreloader = this.preloader;\n\n const autoDownload = doc.type !== 'audio'/* || !this.noAutoDownload */;\n onLoad(autoDownload);\n\n const r = (shouldPlay: boolean) => {\n if(this.audio.src) {\n return;\n }\n\n appMediaPlaybackController.resolveWaitingForLoadMedia(this.message.peerId, this.message.mid, this.message.pFlags.is_scheduled);\n\n const onDownloadInit = () => {\n if(shouldPlay) {\n appMediaPlaybackController.willBePlayed(this.audio); // prepare for loading audio\n\n if(IS_SAFARI && !this.audio.autoplay) {\n this.audio.autoplay = true;\n }\n }\n };\n\n onDownloadInit();\n\n if(!preloader) {\n if(doc.supportsStreaming) {\n this.classList.add('corner-download');\n\n let pauseListener: Listener;\n const onPlay = () => {\n const preloader = constructDownloadPreloader(false);\n const deferred = deferredPromise();\n deferred.notifyAll({done: 75, total: 100});\n deferred.catch(() => {\n this.audio.pause();\n appMediaPlaybackController.willBePlayed(undefined);\n });\n deferred.cancel = () => {\n deferred.cancel = noop;\n const err = new Error();\n (err as any).type = 'CANCELED';\n deferred.reject(err);\n };\n preloader.attach(downloadDiv, false, deferred);\n\n pauseListener = this.addAudioListener('pause', () => {\n deferred.cancel();\n }, {once: true}) as any;\n\n onDownloadInit();\n };\n\n /* if(!this.audio.paused) {\n onPlay();\n } */\n\n const playListener: any = this.addAudioListener('play', onPlay);\n this.readyPromise.then(() => {\n this.listenerSetter.remove(playListener);\n this.listenerSetter.remove(pauseListener);\n });\n } else {\n preloader = constructDownloadPreloader();\n\n if(!shouldPlay) {\n this.readyPromise = deferredPromise();\n }\n\n const load = () => {\n onDownloadInit();\n\n const download = appDownloadManager.downloadMediaURL({media: doc});\n\n if(!shouldPlay) {\n download.then(() => {\n this.readyPromise.resolve();\n });\n }\n\n preloader.attach(downloadDiv, false, download);\n return {download};\n };\n\n preloader.setDownloadFunction(load);\n load();\n }\n }\n\n if(this.classList.contains('corner-download')) {\n toggle.append(downloadDiv);\n } else {\n this.append(downloadDiv);\n }\n\n this.classList.add('downloading');\n\n this.readyPromise.then(() => {\n this.classList.remove('downloading');\n downloadDiv.classList.add('downloaded');\n setTimeout(() => {\n downloadDiv.remove();\n }, 200);\n\n // setTimeout(() => {\n // release loaded audio\n if(appMediaPlaybackController.willBePlayedMedia === this.audio) {\n this.audio.play();\n appMediaPlaybackController.willBePlayed(undefined);\n }\n // }, 10e3);\n });\n };\n\n if(!this.audio?.src) {\n if(autoDownload) {\n r(false);\n } else {\n attachClickEvent(toggle, () => {\n r(true);\n }, {once: true, capture: true, passive: false, listenerSetter: this.listenerSetter});\n }\n }\n } else if(uploadingFileName) {\n this.preloader = constructDownloadPreloader(false);\n this.preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\n this.dataset.isOutgoing = '1';\n this.preloader.attach(downloadDiv, false);\n // onLoad();\n }\n }\n\n get addAudioListener() {\n return this.listenerSetter.add(this.audio);\n }\n\n disconnectedCallback() {\n setTimeout(() => {\n if(this.isConnected) {\n return;\n }\n\n if(this.onTypeDisconnect) {\n this.onTypeDisconnect();\n this.onTypeDisconnect = null;\n }\n\n if(this.readyPromise) {\n this.readyPromise.reject();\n }\n\n if(this.listenerSetter) {\n this.listenerSetter.removeAll();\n this.listenerSetter = null;\n }\n\n if(this.preloader) {\n this.preloader = null;\n }\n }, 100);\n }\n}\n\ncustomElements.define('audio-element', AudioElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Photo} from '../layer';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport ListLoader, {ListLoaderOptions} from './listLoader';\n\nexport default class AvatarListLoader extends ListLoader {\n private peerId: PeerId;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {peerId: PeerId, managers: AppManagers}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n if(this.peerId.isAnyChat() || !older) return Promise.resolve({count: 0, items: []}); // ! это значит, что открыло аватар чата, но следующих фотографий нет.\n\n const maxId = anchor?.photoId;\n return this.managers.appPhotosManager.getUserPhotos(this.peerId, maxId, loadCount).then((value) => {\n const items = value.photos.map((photoId) => {\n return {element: null as HTMLElement, photoId} as any;\n });\n\n return {count: value.count, items};\n });\n }\n });\n\n this.loadedAllUp = true;\n this.peerId = options.peerId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarListLoader from '../helpers/avatarListLoader';\nimport {Photo} from '../layer';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport rootScope from '../lib/rootScope';\nimport AppMediaViewerBase from './appMediaViewerBase';\n\ntype AppMediaViewerAvatarTargetType = {element: HTMLElement, photoId: Photo.photo['id']};\nexport default class AppMediaViewerAvatar extends AppMediaViewerBase<'', 'delete', AppMediaViewerAvatarTargetType> {\n public peerId: PeerId;\n\n constructor(peerId: PeerId) {\n super(new AvatarListLoader({peerId, managers: rootScope.managers}), [/* 'delete' */]);\n\n this.peerId = peerId;\n\n this.setBtnMenuToggle([{\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }/* , {\n icon: 'delete danger btn-disabled',\n text: 'Delete',\n onClick: () => {}\n } */]);\n\n // * constructing html end\n\n this.setListeners();\n }\n\n onPrevClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, 1);\n };\n\n onDownloadClick = async() => {\n appDownloadManager.downloadToDisc({\n media: await this.managers.appPhotosManager.getPhoto(this.target.photoId),\n queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId\n });\n };\n\n public async openMedia(photoId: Photo.photo['id'], target?: HTMLElement, fromRight = 0, prevTargets?: AppMediaViewerAvatarTargetType[], nextTargets?: AppMediaViewerAvatarTargetType[]) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const photo = await this.managers.appPhotosManager.getPhoto(photoId);\n const ret = super._openMedia(photo, photo.date, this.peerId, fromRight, target, false, prevTargets, nextTargets);\n this.target.photoId = photo.id;\n\n return ret;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport {Message, Photo} from '../layer';\nimport type LazyLoadQueue from './lazyLoadQueue';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport AppMediaViewer from './appMediaViewer';\nimport AppMediaViewerAvatar from './appMediaViewerAvatar';\nimport isObject from '../helpers/object/isObject';\nimport {ArgumentTypes} from '../types';\nimport putPhoto from './putPhoto';\nimport {recordPromise} from '../helpers/recordPromise';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\n\nconst onAvatarUpdate = ({peerId, threadId}: {peerId: PeerId, threadId?: number}) => {\n let query = 'avatar-element[data-peer-id=\"' + peerId + '\"]';\n if(threadId) {\n query += '[data-thread-id=\"' + threadId + '\"]';\n }\n\n (Array.from(document.querySelectorAll(query)) as AvatarElement[]).forEach((elem) => {\n // console.log('updating avatar:', elem);\n elem.update();\n });\n};\n\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\nrootScope.addEventListener('peer_title_edit', async(data) => {\n if(!(await rootScope.managers.appAvatarsManager.isAvatarCached(data.peerId))) {\n onAvatarUpdate(data);\n }\n});\n\nexport async function openAvatarViewer(\n target: HTMLElement,\n peerId: PeerId,\n middleware: () => boolean,\n message?: any,\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[],\n nextTargets?: typeof prevTargets\n) {\n let photo = await rootScope.managers.appProfileManager.getFullPhoto(peerId);\n if(!middleware() || !photo) {\n return;\n }\n\n const getTarget = () => {\n const good = Array.from(target.querySelectorAll('img')).find((img) => !img.classList.contains('emoji'));\n return good ? target : null;\n };\n\n if(peerId.isAnyChat()) {\n const hadMessage = !!message;\n const inputFilter = 'inputMessagesFilterChatPhotos';\n if(!message) {\n message = await rootScope.managers.appMessagesManager.getSearch({\n peerId,\n inputFilter: {_: inputFilter},\n maxId: 0,\n limit: 1\n }).then((value) => {\n // console.log(lol);\n // ! by descend\n return value.history[0];\n });\n\n if(!middleware()) {\n return;\n }\n }\n\n if(message) {\n // ! гений в деле, костылируем (но это гениально)\n const messagePhoto = message.action.photo;\n if(messagePhoto.id !== photo.id) {\n if(!hadMessage) {\n message = rootScope.managers.appMessagesManager.generateFakeAvatarMessage(peerId, photo);\n } else {\n\n }\n }\n\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\n element: el.element,\n mid: (el.item as Message.messageService).mid,\n peerId: (el.item as Message.messageService).peerId\n }));\n\n new AppMediaViewer()\n .setSearchContext({\n peerId,\n inputFilter: {_: inputFilter}\n })\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\n\n return;\n }\n }\n\n if(photo) {\n if(!isObject(message) && message) {\n photo = await rootScope.managers.appPhotosManager.getPhoto(message);\n }\n\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\n element: el.element,\n photoId: el.item as string\n }));\n\n new AppMediaViewerAvatar(peerId).openMedia(\n photo.id,\n getTarget(),\n undefined,\n prevTargets ? f(prevTargets) : undefined,\n nextTargets ? f(nextTargets) : undefined\n );\n }\n}\n\nconst believeMe: Map> = new Map();\nconst seen: Set = new Set();\n\nfunction getAvatarQueueKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n}\n\nexport default class AvatarElement extends HTMLElement {\n public peerId: PeerId;\n public isDialog: boolean;\n public peerTitle: string;\n public loadPromises: Promise[];\n public lazyLoadQueue: LazyLoadQueue;\n public isBig: boolean;\n public threadId: number;\n private addedToQueue = false;\n public wrapOptions: WrapSomethingOptions;\n\n public middlewareHelper: MiddlewareHelper;\n\n constructor() {\n super();\n this.classList.add('avatar-like');\n this.middlewareHelper = getMiddleware();\n }\n\n disconnectedCallback() {\n // браузер вызывает этот метод при удалении элемента из документа\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n const set = believeMe.get(key);\n if(set?.has(this)) {\n set.delete(this);\n if(!set.size) {\n believeMe.delete(key);\n }\n }\n\n this.lazyLoadQueue?.delete({div: this});\n }\n\n public attachClickEvent() {\n let loading = false;\n attachClickEvent(this, async(e) => {\n cancelEvent(e);\n if(loading) return;\n const peerId = this.peerId;\n loading = true;\n await openAvatarViewer(this, this.peerId, () => this.peerId === peerId);\n loading = false;\n });\n }\n\n public updateOptions(options: Partial[0]>) {\n for(const i in options) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n public updateWithOptions(options: {\n peerId: PeerId,\n threadId?: number,\n isDialog?: boolean,\n isBig?: boolean,\n peerTitle?: string,\n lazyLoadQueue?: LazyLoadQueue | false,\n loadPromises?: Promise[],\n wrapOptions?: WrapSomethingOptions\n }) {\n const wasPeerId = this.peerId;\n const wasThreadId = this.threadId;\n this.updateOptions(options);\n const newPeerId = this.peerId;\n const threadId = this.threadId;\n\n if(wasPeerId === newPeerId && wasThreadId === threadId) {\n return;\n }\n\n this.dataset.peerId = '' + newPeerId;\n\n if(threadId) {\n this.dataset.threadId = '' + threadId;\n } else if(wasThreadId) {\n delete this.dataset.threadId;\n }\n\n if(wasPeerId) {\n const key = getAvatarQueueKey(wasPeerId, wasThreadId);\n const set = believeMe.get(key);\n if(set) {\n set.delete(this);\n if(!set.size) {\n believeMe.delete(key);\n }\n }\n }\n\n const middleware = options.wrapOptions?.middleware;\n this.middlewareHelper.destroy();\n if(middleware) {\n this.middlewareHelper = middleware.create();\n } else {\n this.middlewareHelper.destroy();\n }\n\n return this.update();\n }\n\n public remove() {\n this.middlewareHelper.destroy();\n super.remove();\n }\n\n private r(onlyThumb = false) {\n const promise = putPhoto({\n div: this,\n peerId: this.peerId,\n isDialog: this.isDialog,\n title: this.peerTitle,\n onlyThumb,\n isBig: this.isBig,\n threadId: this.threadId,\n wrapOptions: {\n middleware: this.middlewareHelper.get(),\n ...(this.wrapOptions || {})\n }\n });\n // recordPromise(promise, 'avatar putPhoto-' + this.peerId);\n\n if(this.loadPromises) {\n this.loadPromises.push(promise);\n\n promise.finally(() => {\n this.loadPromises = undefined;\n });\n }\n\n return promise;\n }\n\n public update() {\n if(this.lazyLoadQueue) {\n if(!seen.has(this.peerId)) {\n if(this.addedToQueue) return;\n this.addedToQueue = true;\n\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n let set = believeMe.get(key);\n if(!set) {\n believeMe.set(key, set = new Set());\n }\n\n set.add(this);\n\n this.lazyLoadQueue.push({\n div: this,\n load: () => {\n seen.add(this.peerId);\n return this.update();\n }\n });\n\n return this.r(true);\n } else if(this.addedToQueue) {\n this.lazyLoadQueue.delete({div: this});\n }\n }\n\n seen.add(this.peerId);\n\n const promise = this.r();\n\n if(this.addedToQueue) {\n promise.finally(() => {\n this.addedToQueue = false;\n });\n }\n\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n const set = believeMe.get(key);\n if(set) {\n set.delete(this);\n const arr = Array.from(set);\n believeMe.delete(key);\n\n for(let i = 0, length = arr.length; i < length; ++i) {\n arr[i].update();\n }\n }\n\n return promise;\n }\n}\n\ncustomElements.define('avatar-element', AvatarElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {CancellablePromise} from '../helpers/cancellablePromise';\nimport type {InputFile} from '../layer';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport PopupElement from './popups';\nimport PopupAvatar from './popups/avatar';\n\nexport default class AvatarEdit {\n public container: HTMLElement;\n private canvas: HTMLCanvasElement;\n private icon: HTMLSpanElement;\n\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void, options?: ConstructorParameters[0]) {\n this.container = document.createElement('div');\n this.container.classList.add('avatar-edit');\n\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('avatar-edit-canvas');\n\n this.icon = document.createElement('span');\n this.icon.classList.add('tgico', 'tgico-cameraadd');\n\n this.container.append(this.canvas, this.icon);\n\n attachClickEvent(this.container, () => {\n PopupElement.createPopup(PopupAvatar, options).open(this.canvas, onChange);\n });\n }\n\n public clear() {\n const ctx = this.canvas.getContext('2d');\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport ripple from './ripple';\n\nexport type ButtonOptions = Partial<{\n noRipple: true,\n onlyMobile: true,\n icon: string,\n rippleSquare: true,\n text: LangPackKey,\n disabled: boolean,\n asDiv: boolean,\n asLink: boolean\n}>;\n\nexport default function Button(className: string, options: T = {} as T): T['asLink'] extends true ? HTMLAnchorElement : HTMLButtonElement {\n const button = document.createElement(options.asLink ? 'a' : (options.asDiv ? 'div' : 'button'));\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\n\n if(!options.noRipple) {\n if(options.rippleSquare) {\n button.classList.add('rp-square');\n }\n\n ripple(button);\n }\n\n if(options.onlyMobile) {\n button.classList.add('only-handhelds');\n }\n\n if(options.disabled) {\n button.setAttribute('disabled', 'true');\n }\n\n if(options.text) {\n button.append(i18n(options.text));\n }\n\n return button as any;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Button from './button';\n\nconst ButtonCorner = (options: Partial<{className: string, icon: string, noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\n const button = Button('btn-circle btn-corner z-depth-1' + (options.className ? ' ' + options.className : ''), options);\n return button;\n};\n\nexport default ButtonCorner;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Button from './button';\n\nconst ButtonIcon = (className?: string, options: Partial<{noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\n const button = Button('btn-icon', {\n icon: className || undefined,\n ...options\n });\n\n return button;\n};\n\nexport default ButtonIcon;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport flatten from '../helpers/array/flatten';\nimport contextMenuController from '../helpers/contextMenuController';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {AttachClickOptions, attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\nimport CheckboxField from './checkboxField';\nimport {Document} from '../layer';\nimport wrapPhoto from './wrappers/photo';\nimport textToSvgURL from '../helpers/textToSvgURL';\nimport customProperties from '../helpers/dom/customProperties';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport ripple from './ripple';\n\nexport type ButtonMenuItemOptions = {\n icon?: string,\n iconDoc?: Document.document,\n text?: LangPackKey,\n textArgs?: FormatterArguments,\n regularText?: Parameters[1],\n onClick: (e: MouseEvent | TouchEvent) => any,\n checkForClose?: () => boolean,\n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean,\n separator?: boolean | HTMLElement,\n multiline?: boolean,\n loadPromise?: Promise,\n waitForAnimation?: boolean\n /* , cancelEvent?: true */\n};\n\nexport type ButtonMenuItemOptionsVerifiable = ButtonMenuItemOptions & {\n verify?: () => boolean | Promise\n};\n\nfunction ButtonMenuItem(options: ButtonMenuItemOptions) {\n if(options.element) return [options.separator as HTMLElement, options.element].filter(Boolean);\n\n const {icon, iconDoc, text, onClick, checkboxField, noCheckboxClickListener} = options;\n const el = document.createElement('div');\n el.className = 'btn-menu-item rp-overflow' + (icon ? ' tgico-' + icon : '');\n\n if(IS_MOBILE) {\n ripple(el);\n }\n\n let textElement = options.textElement;\n if(!textElement) {\n textElement = options.textElement = text ? i18n(text, options.textArgs) : document.createElement('span');\n if(options.regularText) {\n setInnerHTML(textElement, options.regularText);\n }\n }\n\n if(iconDoc) {\n const iconElement = document.createElement('span');\n iconElement.classList.add('btn-menu-item-icon');\n el.append(iconElement);\n\n options.loadPromise = wrapPhoto({\n container: iconElement,\n photo: iconDoc,\n boxWidth: 24,\n boxHeight: 24,\n withoutPreloader: true,\n noFadeIn: true,\n noBlur: true,\n processUrl: (url) => {\n return fetch(url)\n .then((response) => response.text())\n .then((text) => {\n const color = customProperties.getProperty('primary-text-color');\n const doc = new DOMParser().parseFromString(text, 'image/svg+xml');\n const svg = doc.firstElementChild as HTMLElement;\n svg.querySelectorAll('path').forEach((path) => {\n path.setAttributeNS(null, 'fill', color);\n path.style.stroke = color;\n path.style.strokeWidth = '.25px';\n });\n return textToSvgURL(svg.outerHTML);\n });\n }\n }).then((ret) => ret.loadPromises.thumb);\n }\n\n textElement.classList.add('btn-menu-item-text');\n el.append(textElement);\n\n const keepOpen = !!checkboxField || !!options.keepOpen;\n\n // * cancel mobile keyboard close\n onClick && attachClickEvent(el, /* CLICK_EVENT_NAME !== 'click' || keepOpen ? */ /* async */(e) => {\n cancelEvent(e);\n\n const menu = findUpClassName(e.target, 'btn-menu');\n if(menu && !menu.classList.contains('active')) {\n return;\n }\n\n // let closed = false;\n // if(!keepOpen && !options.checkForClose) {\n // closed = true;\n // contextMenuController.close();\n // }\n\n // wait for closing animation\n // if(options.waitForAnimation && rootScope.settings.animationsEnabled && !options.checkForClose) {\n // await pause(125);\n // }\n\n onClick(e);\n if(options.checkForClose?.() === false) {\n return;\n }\n\n if(!keepOpen/* && !closed */) {\n contextMenuController.close();\n }\n\n if(checkboxField && !noCheckboxClickListener/* && result !== false */) {\n checkboxField.checked = checkboxField.input.type === 'radio' ? true : !checkboxField.checked;\n }\n }/* : onClick */, options.options);\n\n if(checkboxField) {\n el.append(checkboxField.label);\n }\n\n if(options.separator === true) {\n options.separator = document.createElement('hr');\n }\n\n if(options.multiline) {\n el.classList.add('is-multiline');\n }\n\n return [options.separator as HTMLElement, options.element = el].filter(Boolean);\n}\n\nexport function ButtonMenuSync({listenerSetter, buttons}: {\n buttons: ButtonMenuItemOptions[],\n listenerSetter?: ListenerSetter\n}) {\n const el: HTMLElement = document.createElement('div');\n el.classList.add('btn-menu');\n\n if(listenerSetter) {\n buttons.forEach((b) => {\n if(b.options) {\n b.options.listenerSetter = listenerSetter;\n } else {\n b.options = {listenerSetter};\n }\n });\n }\n\n const items = buttons.map(ButtonMenuItem);\n el.append(...flatten(items));\n\n return el;\n}\n\nexport default async function ButtonMenu(options: Parameters[0]) {\n const el = ButtonMenuSync(options);\n await Promise.all(options.buttons.map(({loadPromise}) => loadPromise));\n return el;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport contextMenuController from '../helpers/contextMenuController';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {AttachClickOptions, CLICK_EVENT_NAME} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ButtonIcon from './buttonIcon';\nimport ButtonMenu, {ButtonMenuItemOptionsVerifiable} from './buttonMenu';\nimport filterAsync from '../helpers/array/filterAsync';\nimport {doubleRaf} from '../helpers/schedulers';\n\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\nexport function ButtonMenuToggleHandler({\n el,\n onOpen,\n options,\n onClose\n}: {\n el: HTMLElement,\n onOpen?: (e: Event) => any,\n options?: AttachClickOptions,\n onClose?: () => void\n}) {\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\n\n add(CLICK_EVENT_NAME, (e: Event) => {\n if(!el.classList.contains('btn-menu-toggle')) return false;\n\n cancelEvent(e);\n\n if(el.classList.contains('menu-open')) {\n contextMenuController.close();\n } else {\n const result = onOpen?.(e);\n const open = () => {\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\n contextMenuController.openBtnMenu(openedMenu, onClose);\n };\n\n if(result instanceof Promise) {\n result.then(open);\n } else {\n open();\n }\n }\n });\n}\n\nexport default function ButtonMenuToggle({\n buttonOptions,\n listenerSetter: attachListenerSetter,\n container,\n direction,\n buttons,\n onOpenBefore,\n onOpen,\n onClose,\n onCloseAfter\n}: {\n buttonOptions?: Parameters[1],\n listenerSetter?: ListenerSetter,\n container?: HTMLElement\n direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right',\n buttons: ButtonMenuItemOptionsVerifiable[],\n onOpenBefore?: (e: Event) => any,\n onOpen?: (e: Event, element: HTMLElement) => any,\n onClose?: () => void,\n onCloseAfter?: () => void\n}) {\n if(buttonOptions) {\n buttonOptions.asDiv = true;\n }\n\n const button = container ?? ButtonIcon('more', buttonOptions);\n button.classList.add('btn-menu-toggle');\n\n const listenerSetter = new ListenerSetter();\n\n let element: HTMLElement, closeTimeout: number;\n ButtonMenuToggleHandler({\n el: button,\n onOpen: async(e) => {\n await onOpenBefore?.(e);\n if(closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n return;\n }\n\n const f = (b: (typeof buttons[0])[]) => filterAsync(b, (button) => button?.verify?.() ?? true);\n\n const filteredButtons = await f(buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const _element = element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter\n });\n _element.classList.add(direction);\n\n await onOpen?.(e, _element);\n\n button.append(_element);\n await doubleRaf();\n },\n options: {\n listenerSetter: attachListenerSetter\n },\n onClose: () => {\n onClose?.();\n\n closeTimeout = window.setTimeout(() => {\n onCloseAfter?.();\n closeTimeout = undefined;\n listenerSetter.removeAll();\n buttons.forEach((button) => button.element = undefined);\n element.remove();\n }, 300);\n }\n });\n\n return button;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko, Artem Kolnogorov and unknown creator of the script taken from http://useless.altervista.org/gradient.html\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {animateSingle} from '../../helpers/animation';\nimport {hexToRgb} from '../../helpers/color';\nimport {easeOutQuadApply} from '../../helpers/easing/easeOutQuad';\n\nconst WIDTH = 50;\nconst HEIGHT = WIDTH;\n\nexport default class ChatBackgroundGradientRenderer {\n private readonly _width = WIDTH;\n private readonly _height = HEIGHT;\n private _phase: number;\n private _tail: number;\n private readonly _tails = 90;\n private readonly _scrollTails = 50;\n private _frames: ImageData[];\n private _colors: {r: number, g: number, b: number}[];\n private readonly _curve = [\n 0, 0.25, 0.50, 0.75, 1, 1.5, 2, 2.5, 3, 3.5, 4, 5, 6, 7, 8, 9, 10, 11, 12,\n 13, 14, 15, 16, 17, 18, 18.3, 18.6, 18.9, 19.2, 19.5, 19.8, 20.1, 20.4, 20.7,\n 21.0, 21.3, 21.6, 21.9, 22.2, 22.5, 22.8, 23.1, 23.4, 23.7, 24.0, 24.3, 24.6,\n 24.9, 25.2, 25.5, 25.8, 26.1, 26.3, 26.4, 26.5, 26.6, 26.7, 26.8, 26.9, 27\n ];\n private readonly _incrementalCurve: number[];\n private readonly _positions = [\n {x: 0.80, y: 0.10},\n {x: 0.60, y: 0.20},\n {x: 0.35, y: 0.25},\n {x: 0.25, y: 0.60},\n {x: 0.20, y: 0.90},\n {x: 0.40, y: 0.80},\n {x: 0.65, y: 0.75},\n {x: 0.75, y: 0.40}\n ];\n private readonly _phases = this._positions.length;\n private _onWheelRAF: number;\n private _scrollDelta: number;\n\n // private _ts = 0;\n // private _fps = 15;\n // private _frametime = 1000 / this._fps;\n // private _raf: number;\n\n private _canvas: HTMLCanvasElement;\n private _ctx: CanvasRenderingContext2D;\n private _hc: HTMLCanvasElement;\n private _hctx: CanvasRenderingContext2D;\n\n private _addedScrollListener: boolean;\n private _animatingToNextPosition: boolean;\n private _nextPositionTail: number;\n private _nextPositionTails: number;\n private _nextPositionLeft: number;\n\n constructor() {\n const diff = this._tails / this._curve[this._curve.length - 1];\n\n for(let i = 0, length = this._curve.length; i < length; ++i) {\n this._curve[i] = this._curve[i] * diff;\n }\n\n this._incrementalCurve = this._curve.map((v, i, arr) => {\n return v - (arr[i - 1] ?? 0);\n });\n }\n\n private hexToRgb(hex: string) {\n const result = hexToRgb(hex);\n return {r: result[0], g: result[1], b: result[2]};\n }\n\n private getPositions(shift: number) {\n const positions = this._positions.slice();\n positions.push(...positions.splice(0, shift));\n\n const result: typeof positions = [];\n for(let i = 0; i < positions.length; i += 2) {\n result.push(positions[i]);\n }\n return result;\n }\n\n private getNextPositions(phase: number, curveMax: number, curve: number[]) {\n const pos = this.getPositions(phase);\n if(!curve[0] && curve.length === 1) {\n return [pos];\n }\n\n const nextPos = this.getPositions(++phase % this._phases);\n const distances = nextPos.map((nextPos, idx) => {\n return {\n x: (nextPos.x - pos[idx].x) / curveMax,\n y: (nextPos.y - pos[idx].y) / curveMax\n };\n });\n\n const positions = curve.map((value) => {\n return distances.map((distance, idx) => {\n return {\n x: pos[idx].x + distance.x * value,\n y: pos[idx].y + distance.y * value\n };\n });\n });\n\n return positions;\n }\n\n private curPosition(phase: number, tail: number) {\n const positions = this.getNextPositions(phase, this._tails, [tail]);\n return positions[0];\n }\n\n private changeTail(diff: number) {\n this._tail += diff;\n\n while(this._tail >= this._tails) {\n this._tail -= this._tails;\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n while(this._tail < 0) {\n this._tail += this._tails;\n if(--this._phase < 0) {\n this._phase += this._phases;\n }\n }\n }\n\n private onWheel = (e: {deltaY: number}) => {\n if(this._animatingToNextPosition) {\n return;\n }\n\n this._scrollDelta += e.deltaY;\n if(this._onWheelRAF === undefined) {\n this._onWheelRAF = requestAnimationFrame(this.drawOnWheel);\n }\n };\n\n private changeTailAndDraw(diff: number) {\n this.changeTail(diff);\n const curPos = this.curPosition(this._phase, this._tail);\n this.drawGradient(curPos);\n }\n\n private drawOnWheel = () => {\n const value = this._scrollDelta / this._scrollTails;\n this._scrollDelta %= this._scrollTails;\n const diff = value > 0 ? Math.floor(value) : Math.ceil(value);\n if(diff) {\n this.changeTailAndDraw(diff);\n }\n this._onWheelRAF = undefined;\n };\n\n private drawNextPositionAnimated = (getProgress?: () => number) => {\n let done: boolean, id: ImageData;\n if(getProgress) {\n const value = getProgress();\n done = value >= 1;\n const transitionValue = easeOutQuadApply(value, 1);\n const nextPositionTail = this._nextPositionTail ?? 0;\n const tail = this._nextPositionTail = this._nextPositionTails * transitionValue;\n const diff = tail - nextPositionTail;\n if(diff) {\n this._nextPositionLeft -= diff;\n this.changeTailAndDraw(diff);\n }\n } else {\n const frames = this._frames;\n id = frames.shift();\n done = !frames.length;\n }\n\n if(id) {\n this.drawImageData(id);\n }\n\n if(done) {\n this._nextPositionLeft = undefined;\n this._nextPositionTails = undefined;\n this._nextPositionTail = undefined;\n this._animatingToNextPosition = undefined;\n }\n\n return !done;\n };\n\n private getGradientImageData(positions: {x: number, y: number}[]) {\n const id = this._hctx.createImageData(this._width, this._height);\n const pixels = id.data;\n\n let offset = 0;\n for(let y = 0; y < this._height; ++y) {\n const directPixelY = y / this._height;\n const centerDistanceY = directPixelY - 0.5;\n const centerDistanceY2 = centerDistanceY * centerDistanceY;\n\n for(let x = 0; x < this._width; ++x) {\n const directPixelX = x / this._width;\n\n const centerDistanceX = directPixelX - 0.5;\n const centerDistance = Math.sqrt(centerDistanceX * centerDistanceX + centerDistanceY2);\n\n const swirlFactor = 0.35 * centerDistance;\n const theta = swirlFactor * swirlFactor * 0.8 * 8.0;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n\n const pixelX = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * cosTheta - centerDistanceY * sinTheta));\n const pixelY = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * sinTheta + centerDistanceY * cosTheta));\n\n let distanceSum = 0.0;\n\n let r = 0.0;\n let g = 0.0;\n let b = 0.0;\n\n for(let i = 0; i < this._colors.length; i++) {\n const colorX = positions[i].x;\n const colorY = positions[i].y;\n\n const distanceX = pixelX - colorX;\n const distanceY = pixelY - colorY;\n\n let distance = Math.max(0.0, 0.9 - Math.sqrt(distanceX * distanceX + distanceY * distanceY));\n distance = distance * distance * distance * distance;\n distanceSum += distance;\n\n r += distance * this._colors[i].r / 255;\n g += distance * this._colors[i].g / 255;\n b += distance * this._colors[i].b / 255;\n }\n\n pixels[offset++] = r / distanceSum * 255.0;\n pixels[offset++] = g / distanceSum * 255.0;\n pixels[offset++] = b / distanceSum * 255.0;\n pixels[offset++] = 0xFF;\n }\n }\n return id;\n }\n\n private drawImageData(id: ImageData) {\n this._hctx.putImageData(id, 0, 0);\n this._ctx.drawImage(this._hc, 0, 0, this._width, this._height);\n }\n\n private drawGradient(positions: {x: number, y: number}[]) {\n this.drawImageData(this.getGradientImageData(positions));\n }\n\n // private doAnimate = () => {\n // const now = +Date.now();\n // if(!document.hasFocus() || (now - this._ts) < this._frametime) {\n // this._raf = requestAnimationFrame(this.doAnimate);\n // return;\n // }\n\n // this._ts = now;\n // this.changeTail(1);\n // const cur_pos = this.curPosition(this._phase, this._tail);\n // this.drawGradient(cur_pos);\n // this._raf = requestAnimationFrame(this.doAnimate);\n // };\n\n // public animate(start?: boolean) {\n // if(!start) {\n // cancelAnimationFrame(this._raf);\n // return;\n // }\n // this.doAnimate();\n // }\n\n public init(el: HTMLCanvasElement) {\n this._frames = [];\n this._phase = 0;\n this._tail = 0;\n this._scrollDelta = 0;\n if(this._onWheelRAF !== undefined) {\n cancelAnimationFrame(this._onWheelRAF);\n this._onWheelRAF = undefined;\n }\n\n const colors = el.getAttribute('data-colors').split(',').reverse();\n this._colors = colors.map((color) => {\n return this.hexToRgb(color);\n });\n\n if(!this._hc) {\n this._hc = document.createElement('canvas');\n this._hc.width = this._width;\n this._hc.height = this._height;\n this._hctx = this._hc.getContext('2d', {alpha: false});\n }\n\n this._canvas = el;\n this._ctx = this._canvas.getContext('2d', {alpha: false});\n this.update();\n }\n\n public update() {\n if(this._colors.length < 2) {\n const color = this._colors[0];\n this._ctx.fillStyle = `rgb(${color.r}, ${color.g}, ${color.b})`;\n this._ctx.fillRect(0, 0, this._width, this._height);\n return;\n }\n\n const pos = this.curPosition(this._phase, this._tail);\n this.drawGradient(pos);\n }\n\n public toNextPosition(getProgress?: () => number) {\n if(this._colors.length < 2) {\n return;\n }\n\n if(getProgress) {\n this._nextPositionLeft = this._tails + (this._nextPositionLeft ?? 0);\n this._nextPositionTails = this._nextPositionLeft;\n this._nextPositionTail = undefined;\n this._animatingToNextPosition = true;\n animateSingle(this.drawNextPositionAnimated.bind(this, getProgress), this);\n return;\n }\n\n const tail = this._tail;\n const tails = this._tails;\n\n let nextPhaseOnIdx: number;\n\n const curve: number[] = [];\n for(let i = 0, length = this._incrementalCurve.length; i < length; ++i) {\n const inc = this._incrementalCurve[i];\n let value = (curve[i - 1] ?? tail) + inc;\n\n if(+value.toFixed(2) > tails && nextPhaseOnIdx === undefined) {\n nextPhaseOnIdx = i;\n value %= tails;\n }\n\n curve.push(value);\n }\n\n const currentPhaseCurve = curve.slice(0, nextPhaseOnIdx);\n const nextPhaseCurve = nextPhaseOnIdx !== undefined ? curve.slice(nextPhaseOnIdx) : [];\n\n [currentPhaseCurve, nextPhaseCurve].forEach((curve, idx, curves) => {\n const last = curve[curve.length - 1];\n if(last !== undefined && last > tails) {\n curve[curve.length - 1] = +last.toFixed(2);\n }\n\n this._tail = last ?? 0;\n\n if(!curve.length) {\n return;\n }\n\n const positions = this.getNextPositions(this._phase, tails, curve);\n if(idx !== (curves.length - 1)) {\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n const ids = positions.map((pos) => {\n return this.getGradientImageData(pos);\n });\n\n this._frames.push(...ids);\n });\n\n this._animatingToNextPosition = true;\n animateSingle(this.drawNextPositionAnimated, this);\n }\n\n // public toNextPositionThrottled = throttle(this.toNextPosition.bind(this), 100, true);\n\n public scrollAnimate(start?: boolean) {\n return;\n\n if(this._colors.length < 2 && start) {\n return;\n }\n\n if(start && !this._addedScrollListener) {\n document.addEventListener('wheel', this.onWheel);\n this._addedScrollListener = true;\n } else if(!start && this._addedScrollListener) {\n document.removeEventListener('wheel', this.onWheel);\n this._addedScrollListener = false;\n }\n }\n\n public cleanup() {\n this.scrollAnimate(false);\n // this.animate(false);\n }\n\n public static createCanvas(colors?: string) {\n const canvas = document.createElement('canvas');\n canvas.width = WIDTH;\n canvas.height = HEIGHT;\n if(colors !== undefined) {\n canvas.dataset.colors = colors;\n }\n\n return canvas;\n }\n\n public static create(colors?: string) {\n const canvas = this.createCanvas(colors);\n const gradientRenderer = new ChatBackgroundGradientRenderer();\n gradientRenderer.init(canvas);\n\n return {gradientRenderer, canvas};\n }\n}\n","export default function easeOutQuad(t: number, b: number, c: number, d: number) {\n return t >= d ? b + c : easeOutQuadApply(t / d, c) + b;\n}\n\nexport function easeOutQuadApply(v: number, c: number) {\n return -c * v * (v - 2);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppMessagesManager, MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport type ChatBubbles from './bubbles';\nimport type ChatInput from './input';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport Button from '../button';\nimport ButtonIcon from '../buttonIcon';\nimport CheckboxField from '../checkboxField';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport PopupForward from '../popups/forward';\nimport SetTransition from '../singleTransition';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport PopupSendNow from '../popups/sendNow';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport I18n, {i18n, _i18n} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport cancelSelection from '../../helpers/dom/cancelSelection';\nimport getSelectedText from '../../helpers/dom/getSelectedText';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport AppSearchSuper from '../appSearchSuper.';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport {randomLong} from '../../helpers/random';\nimport {attachClickEvent, AttachClickOptions} from '../../helpers/dom/clickEvent';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport appImManager from '../../lib/appManagers/appImManager';\n\nconst accumulateMapSet = (map: Map>) => {\n return [...map.values()].reduce((acc, v) => acc + v.size, 0);\n};\n\n// const MIN_CLICK_MOVE = 32; // minimum bubble height\n\nclass AppSelection extends EventListenerBase<{\n toggle: (isSelecting: boolean) => void\n}> {\n public selectedMids: Map> = new Map();\n public isSelecting = false;\n\n public selectedText: string;\n\n protected listenerSetter: ListenerSetter;\n protected isScheduled: boolean;\n protected listenElement: HTMLElement;\n\n protected onToggleSelection: (forwards: boolean, animate: boolean) => void | Promise;\n protected onUpdateContainer: (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => void;\n protected onCancelSelection: () => void;\n protected toggleByMid: (peerId: PeerId, mid: number) => void;\n protected toggleByElement: (bubble: HTMLElement) => void;\n\n protected navigationType: NavigationItem['type'];\n\n protected getElementFromTarget: (target: HTMLElement) => HTMLElement;\n protected verifyTarget: (e: MouseEvent, target: HTMLElement) => boolean;\n protected verifyMouseMoveTarget: (e: MouseEvent, element: HTMLElement, selecting: boolean) => boolean;\n protected verifyTouchLongPress: () => boolean;\n protected targetLookupClassName: string;\n protected lookupBetweenParentClassName: string;\n protected lookupBetweenElementsQuery: string;\n\n protected doNotAnimate: boolean;\n protected managers: AppManagers;\n\n constructor(options: {\n managers: AppManagers,\n getElementFromTarget: AppSelection['getElementFromTarget'],\n verifyTarget?: AppSelection['verifyTarget'],\n verifyMouseMoveTarget?: AppSelection['verifyMouseMoveTarget'],\n verifyTouchLongPress?: AppSelection['verifyTouchLongPress'],\n targetLookupClassName: string,\n lookupBetweenParentClassName: string,\n lookupBetweenElementsQuery: string,\n isScheduled?: AppSelection['isScheduled']\n }) {\n super(false);\n\n safeAssign(this, options);\n\n this.navigationType = 'multiselect-' + randomLong() as any;\n }\n\n public attachListeners(listenElement: HTMLElement, listenerSetter: ListenerSetter) {\n if(this.listenElement) {\n this.listenerSetter.removeAll();\n }\n\n this.listenElement = listenElement;\n this.listenerSetter = listenerSetter;\n\n if(!listenElement) {\n return;\n }\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(listenElement)('touchend', () => {\n if(!this.isSelecting) return;\n this.selectedText = getSelectedText();\n });\n\n attachContextMenuListener({\n element: listenElement,\n callback: (e) => {\n if(this.isSelecting || (this.verifyTouchLongPress && !this.verifyTouchLongPress())) return;\n\n // * these two lines will fix instant text selection on iOS Safari\n document.body.classList.add('no-select'); // * need no-select on body because chat-input transforms in channels\n listenElement.addEventListener('touchend', (e) => {\n cancelEvent(e); // ! this one will fix propagation to document loader button, etc\n document.body.classList.remove('no-select');\n\n // this.chat.bubbles.onBubblesClick(e);\n }, {once: true, capture: true});\n\n cancelSelection();\n // cancelEvent(e as any);\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(element) {\n this.toggleByElement(element);\n }\n },\n listenerSetter\n });\n\n return;\n }\n\n listenerSetter.add(listenElement)('mousedown', this.onMouseDown);\n }\n\n private onMouseDown = (e: MouseEvent) => {\n // console.log('selection mousedown', e);\n const element = findUpClassName(e.target, this.targetLookupClassName);\n if(e.button !== 0) {\n return;\n }\n\n if(this.verifyTarget && !this.verifyTarget(e, element)) {\n return;\n }\n\n const seen: AppSelection['selectedMids'] = new Map();\n let selecting: boolean;\n\n /* let good = false;\n const {x, y} = e; */\n\n /* const bubbles = appImManager.bubbles;\n for(const mid in bubbles) {\n const bubble = bubbles[mid];\n bubble.addEventListener('mouseover', () => {\n console.log('mouseover');\n }, {once: true});\n } */\n\n let firstTarget = element;\n\n const processElement = (element: HTMLElement, checkBetween = true) => {\n const mid = +element.dataset.mid;\n if(!mid || !element.dataset.peerId) return;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!isInDOM(firstTarget)) {\n firstTarget = element;\n }\n\n let seenSet = seen.get(peerId);\n if(!seenSet) {\n seen.set(peerId, seenSet = new Set());\n }\n\n if(seenSet.has(mid)) {\n return;\n }\n\n const isSelected = this.isMidSelected(peerId, mid);\n if(selecting === undefined) {\n // bubblesContainer.classList.add('no-select');\n selecting = !isSelected;\n }\n\n seenSet.add(mid);\n\n if((selecting && !isSelected) || (!selecting && isSelected)) {\n const seenLength = accumulateMapSet(seen);\n if(this.toggleByElement && checkBetween) {\n if(seenLength < 2) {\n if(findUpAsChild(element, firstTarget)) {\n firstTarget = element;\n }\n }\n\n const elementsBetween = this.getElementsBetween(firstTarget, element);\n // console.log(elementsBetween);\n if(elementsBetween.length) {\n elementsBetween.forEach((element) => {\n processElement(element, false);\n });\n }\n }\n\n if(!this.selectedMids.size) {\n if(seenLength === 2 && this.toggleByMid) {\n for(const [peerId, mids] of seen) {\n for(const mid of mids) {\n this.toggleByMid(peerId, mid);\n }\n }\n }\n } else if(this.toggleByElement) {\n this.toggleByElement(element);\n }\n }\n };\n\n // const foundTargets: Map = new Map();\n let canceledSelection = false;\n const onMouseMove = (e: MouseEvent) => {\n if(!canceledSelection) {\n cancelSelection();\n canceledSelection = true;\n }\n /* if(!good) {\n if(Math.abs(e.x - x) > MIN_CLICK_MOVE || Math.abs(e.y - y) > MIN_CLICK_MOVE) {\n good = true;\n } else {\n return;\n }\n } */\n\n /* if(foundTargets.has(e.target as HTMLElement)) return;\n foundTargets.set(e.target as HTMLElement, true); */\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(!element) {\n // console.error('found no bubble', e);\n return;\n }\n\n if(this.verifyMouseMoveTarget && !this.verifyMouseMoveTarget(e, element, selecting)) {\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n this.listenerSetter.removeManual(document, 'mouseup', onMouseUp, documentListenerOptions);\n return;\n }\n\n processElement(element);\n };\n\n const onMouseUp = (e: MouseEvent) => {\n if(seen.size) {\n attachClickEvent(window, cancelEvent, {capture: true, once: true, passive: false});\n }\n\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n // bubblesContainer.classList.remove('no-select');\n\n // ! CANCEL USER SELECTION !\n cancelSelection();\n };\n\n const documentListenerOptions = {once: true};\n this.listenerSetter.add(this.listenElement)('mousemove', onMouseMove);\n this.listenerSetter.add(document)('mouseup', onMouseUp, documentListenerOptions);\n };\n\n private getElementsBetween = (first: HTMLElement, last: HTMLElement) => {\n if(first === last) {\n return [];\n }\n\n const firstRect = first.getBoundingClientRect();\n const lastRect = last.getBoundingClientRect();\n const difference = (firstRect.top - lastRect.top) || (firstRect.left - lastRect.left);\n const isHigher = difference < 0;\n\n const parent = findUpClassName(first, this.lookupBetweenParentClassName);\n if(!parent) {\n return [];\n }\n\n const elements = Array.from(parent.querySelectorAll(this.lookupBetweenElementsQuery)) as HTMLElement[];\n let firstIndex = elements.indexOf(first);\n let lastIndex = elements.indexOf(last);\n\n if(!isHigher) {\n [lastIndex, firstIndex] = [firstIndex, lastIndex];\n }\n\n const slice = elements.slice(firstIndex + 1, lastIndex);\n\n // console.log('getElementsBetween', first, last, slice, firstIndex, lastIndex, isHigher);\n\n return slice;\n };\n\n protected isElementShouldBeSelected(element: HTMLElement) {\n return this.isMidSelected(element.dataset.peerId.toPeerId(), +element.dataset.mid);\n }\n\n protected appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n element.prepend(checkboxField.label);\n }\n\n public toggleElementCheckbox(element: HTMLElement, show: boolean) {\n const hasCheckbox = !!this.getCheckboxInputFromElement(element);\n if(show) {\n if(hasCheckbox) {\n return false;\n }\n\n const checkboxField = new CheckboxField({\n name: element.dataset.mid,\n round: true\n });\n\n // * if it is a render of new message\n if(this.isSelecting) { // ! avoid breaking animation on start\n if(this.isElementShouldBeSelected(element)) {\n checkboxField.input.checked = true;\n element.classList.add('is-selected');\n }\n }\n\n this.appendCheckbox(element, checkboxField);\n } else if(hasCheckbox) {\n this.getCheckboxInputFromElement(element).parentElement.remove();\n SetTransition({\n element,\n className: 'is-selected',\n forwards: false,\n duration: 200\n });\n }\n\n return true;\n }\n\n protected getCheckboxInputFromElement(element: HTMLElement): HTMLInputElement {\n return element.firstElementChild?.tagName === 'LABEL' &&\n element.firstElementChild.firstElementChild as HTMLInputElement;\n }\n\n protected async updateContainer(forceSelection = false) {\n const size = this.selectedMids.size;\n if(!size && !forceSelection) return;\n\n let cantForward = !size,\n cantDelete = !size;\n const cantSend = !size;\n for(const [peerId, mids] of this.selectedMids) {\n const storageKey: MessagesStorageKey = `${peerId}_${this.isScheduled ? 'scheduled' : 'history'}`;\n const r = await this.managers.appMessagesManager.cantForwardDeleteMids(storageKey, Array.from(mids));\n cantForward = r.cantForward;\n cantDelete = r.cantDelete;\n\n if(cantForward && cantDelete) break;\n }\n\n this.onUpdateContainer?.(cantForward, cantDelete, cantSend);\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const wasSelecting = this.isSelecting;\n const size = this.selectedMids.size;\n this.isSelecting = !!size || forceSelection;\n\n if(wasSelecting === this.isSelecting) return false;\n\n this.dispatchEvent('toggle', this.isSelecting);\n\n // const bubblesContainer = this.bubbles.bubblesContainer;\n // bubblesContainer.classList.toggle('is-selecting', !!size);\n\n /* if(bubblesContainer.classList.contains('is-chat-input-hidden')) {\n const scrollable = this.appImManager.scrollable;\n if(scrollable.isScrolledDown) {\n scrollable.scrollTo(scrollable.scrollHeight, 'top', true, true, 200);\n }\n } */\n\n if(!IS_TOUCH_SUPPORTED) {\n this.listenElement.classList.toggle('no-select', this.isSelecting);\n\n if(wasSelecting) {\n // ! CANCEL USER SELECTION !\n cancelSelection();\n }\n }/* else {\n if(!wasSelecting) {\n bubblesContainer.classList.add('no-select');\n setTimeout(() => {\n cancelSelection();\n bubblesContainer.classList.remove('no-select');\n cancelSelection();\n }, 100);\n }\n } */\n\n blurActiveElement();\n\n const forwards = !!size || forceSelection;\n const toggleResult = this.onToggleSelection?.(forwards, !this.doNotAnimate);\n\n if(!IS_MOBILE_SAFARI) {\n if(forwards) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: () => {\n this.cancelSelection();\n }\n });\n } else {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n if(forceSelection) {\n (toggleResult || Promise.resolve()).then(() => this.updateContainer(forceSelection));\n }\n\n return true;\n }\n\n public cancelSelection = async(doNotAnimate?: boolean) => {\n if(doNotAnimate) this.doNotAnimate = true;\n this.onCancelSelection && await this.onCancelSelection();\n this.selectedMids.clear();\n this.toggleSelection();\n cancelSelection();\n if(doNotAnimate) this.doNotAnimate = undefined;\n };\n\n public cleanup() {\n this.doNotAnimate = true;\n this.selectedMids.clear();\n this.toggleSelection(false);\n this.doNotAnimate = undefined;\n }\n\n protected updateElementSelection(element: HTMLElement, isSelected: boolean) {\n this.toggleElementCheckbox(element, true);\n const input = this.getCheckboxInputFromElement(element);\n input.checked = isSelected;\n\n this.toggleSelection();\n this.updateContainer();\n SetTransition({\n element,\n className: 'is-selected',\n forwards: isSelected,\n duration: 200\n });\n }\n\n public isMidSelected(peerId: PeerId, mid: number) {\n const set = this.selectedMids.get(peerId);\n return set?.has(mid);\n }\n\n public length() {\n return accumulateMapSet(this.selectedMids);\n }\n\n protected toggleMid(peerId: PeerId, mid: number, unselect?: boolean) {\n let set = this.selectedMids.get(peerId);\n if(unselect || (unselect === undefined && set?.has(mid))) {\n if(set) {\n set.delete(mid);\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n }\n } else {\n // const diff = rootScope.config.forwarded_count_max - this.length() - 1;\n // if(diff < 0) {\n // toast(I18n.format('Chat.Selection.LimitToast', true));\n // return false;\n // /* const it = this.selectedMids.values();\n // do {\n // const mid = it.next().value;\n // const mounted = this.appImManager.getMountedBubble(mid);\n // if(mounted) {\n // this.toggleByBubble(mounted.bubble);\n // } else {\n // const mids = this.appMessagesManager.getMidsByMid(mid);\n // for(const mid of mids) {\n // this.selectedMids.delete(mid);\n // }\n // }\n // } while(this.selectedMids.size > MAX_SELECTION_LENGTH); */\n // }\n\n if(!set) {\n set = new Set();\n this.selectedMids.set(peerId, set);\n }\n\n set.add(mid);\n }\n\n return true;\n }\n\n /**\n * ! Call this method only to handle deleted messages\n */\n public deleteSelectedMids(peerId: PeerId, mids: number[]) {\n const set = this.selectedMids.get(peerId);\n if(!set) {\n return;\n }\n\n mids.forEach((mid) => {\n set.delete(mid);\n });\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n\n this.updateContainer();\n this.toggleSelection();\n }\n}\n\nexport class SearchSelection extends AppSelection {\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n public selectionGotoBtn: HTMLElement;\n\n private isPrivate: boolean;\n\n constructor(private searchSuper: AppSearchSuper, managers: AppManagers, listenerSetter: ListenerSetter) {\n super({\n managers,\n verifyTarget: (e, target) => !!target && this.isSelecting,\n getElementFromTarget: (target) => findUpClassName(target, 'search-super-item'),\n targetLookupClassName: 'search-super-item',\n lookupBetweenParentClassName: 'tabs-tab',\n lookupBetweenElementsQuery: '.search-super-item'\n });\n\n this.isPrivate = !searchSuper.showSender;\n this.attachListeners(searchSuper.container, listenerSetter);\n }\n\n /* public appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(element.classList.contains('document') || element.tagName === 'AUDIO-ELEMENT') {\n element.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n } */\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n const elements = Array.from(this.searchSuper.tabsContainer.querySelectorAll('.search-super-item')) as HTMLElement[];\n elements.forEach((element) => {\n this.toggleElementCheckbox(element, this.isSelecting);\n });\n }\n\n return ret;\n }\n\n public toggleByElement = (element: HTMLElement) => {\n const mid = +element.dataset.mid;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!this.toggleMid(peerId, mid)) {\n return;\n }\n\n this.updateElementSelection(element, this.isMidSelected(peerId, mid));\n };\n\n public toggleByMid = (peerId: PeerId, mid: number) => {\n const element = this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id=\"${peerId}\"][data-mid=\"${mid}\"]`) as HTMLElement;\n this.toggleByElement(element);\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n const length = this.length();\n replaceContent(this.selectionCountEl, i18n('messages', [length]));\n this.selectionGotoBtn.classList.toggle('hide', length !== 1);\n this.selectionForwardBtn.classList.toggle('hide', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.classList.toggle('hide', cantDelete);\n };\n\n protected onToggleSelection = (forwards: boolean, animate: boolean) => {\n SetTransition({\n element: this.searchSuper.navScrollableContainer,\n className: 'is-selecting',\n forwards,\n duration: animate ? 200 : 0,\n onTransitionEnd: () => {\n if(!this.isSelecting) {\n this.selectionContainer.remove();\n this.selectionContainer =\n this.selectionForwardBtn =\n this.selectionDeleteBtn =\n null;\n this.selectedText = undefined;\n }\n }\n });\n\n SetTransition({\n element: this.searchSuper.container,\n className: 'is-selecting',\n forwards,\n duration: 200\n });\n\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n const BASE_CLASS = 'search-super-selection';\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add(BASE_CLASS + '-container');\n\n const btnCancel = ButtonIcon(`close ${BASE_CLASS}-cancel`, {noRipple: true});\n attachClickEvent(btnCancel, () => this.cancelSelection(), {listenerSetter: this.listenerSetter, once: true});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add(BASE_CLASS + '-count');\n\n this.selectionGotoBtn = ButtonIcon(`message ${BASE_CLASS}-goto`);\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n attachClickEvent(this.selectionGotoBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n const mid = [...this.selectedMids.get(peerId)][0];\n this.cancelSelection();\n\n appImManager.setInnerPeer({peerId, lastMsgId: mid});\n }, attachClickOptions);\n\n this.selectionForwardBtn = ButtonIcon(`forward ${BASE_CLASS}-forward`);\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n if(this.isPrivate) {\n this.selectionDeleteBtn = ButtonIcon(`delete danger ${BASE_CLASS}-delete`);\n attachClickEvent(this.selectionDeleteBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n new PopupDeleteMessages(peerId, [...this.selectedMids.get(peerId)], 'chat', () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionContainer.append(...[\n btnCancel,\n this.selectionCountEl,\n this.selectionGotoBtn,\n this.selectionForwardBtn,\n this.selectionDeleteBtn\n ].filter(Boolean));\n\n const transitionElement = this.selectionContainer;\n transitionElement.style.opacity = '0';\n this.searchSuper.navScrollableContainer.append(transitionElement);\n\n void transitionElement.offsetLeft; // reflow\n transitionElement.style.opacity = '';\n }\n }\n };\n}\n\nexport default class ChatSelection extends AppSelection {\n protected selectionInputWrapper: HTMLElement;\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionSendNowBtn: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n private selectionLeft: HTMLDivElement;\n private selectionRight: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private bubbles: ChatBubbles,\n private input: ChatInput,\n managers: AppManagers\n ) {\n super({\n managers,\n getElementFromTarget: (target) => findUpClassName(target, 'grouped-item') || findUpClassName(target, 'bubble'),\n verifyTarget: (e, target) => {\n // LEFT BUTTON\n // проверка внизу нужна для того, чтобы не активировать селект если target потомок .bubble\n const bad = !this.selectedMids.size &&\n !(e.target as HTMLElement).classList.contains('bubble') &&\n !(e.target as HTMLElement).classList.contains('document-selection') &&\n target;\n\n return !bad;\n },\n verifyMouseMoveTarget: (e, element, selecting) => {\n const bad = e.target !== element &&\n !(e.target as HTMLElement).classList.contains('document-selection') &&\n selecting === undefined &&\n !this.selectedMids.size;\n return !bad;\n },\n verifyTouchLongPress: () => !this.chat.input.recording,\n targetLookupClassName: 'bubble',\n lookupBetweenParentClassName: 'bubbles-inner',\n lookupBetweenElementsQuery: '.bubble:not(.is-multiple-documents), .grouped-item',\n isScheduled: chat.type === 'scheduled'\n });\n }\n\n public appendCheckbox(bubble: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(bubble.classList.contains('document-container')) {\n bubble.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n for(const mid in this.bubbles.bubbles) {\n if(this.bubbles.skippedMids.has(+mid)) {\n continue;\n }\n\n const bubble = this.bubbles.bubbles[mid];\n this.toggleElementCheckbox(bubble, this.isSelecting);\n }\n }\n\n return ret;\n }\n\n public toggleElementCheckbox(bubble: HTMLElement, show: boolean) {\n if(!this.canSelectBubble(bubble)) return;\n\n const ret = super.toggleElementCheckbox(bubble, show);\n if(ret) {\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n this.bubbles.getBubbleGroupedItems(bubble).forEach((item) => this.toggleElementCheckbox(item, show));\n }\n }\n\n return ret;\n }\n\n public toggleByElement = (bubble: HTMLElement): Promise => {\n if(!this.canSelectBubble(bubble)) return;\n\n const mid = +bubble.dataset.mid;\n\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n if(!this.isGroupedBubbleSelected(bubble)) {\n const set = this.selectedMids.get(this.chat.peerId);\n if(set) {\n // const mids = await this.chat.getMidsByMid(mid);\n const mids = this.getMidsFromGroupContainer(bubble);\n mids.forEach((mid) => set.delete(mid));\n }\n }\n\n /* const promises = */this.bubbles.getBubbleGroupedItems(bubble).map(this.toggleByElement);\n // await Promise.all(promises);\n return;\n }\n\n if(!this.toggleMid(this.chat.peerId, mid)) {\n return;\n }\n\n const isGroupedItem = bubble.classList.contains('grouped-item');\n if(isGroupedItem) {\n const groupContainer = findUpClassName(bubble, 'bubble');\n const isGroupedSelected = this.isGroupedBubbleSelected(groupContainer);\n const isGroupedMidsSelected = this.isGroupedMidsSelected(groupContainer);\n\n const willChange = isGroupedMidsSelected || isGroupedSelected;\n if(willChange) {\n this.updateElementSelection(groupContainer, isGroupedMidsSelected);\n }\n }\n\n this.updateElementSelection(bubble, this.isMidSelected(this.chat.peerId, mid));\n };\n\n protected toggleByMid = async(peerId: PeerId, mid: number) => {\n const mounted = await this.bubbles.getMountedBubble(mid);\n if(mounted) {\n this.toggleByElement(mounted.bubble);\n }\n };\n\n public isElementShouldBeSelected(element: HTMLElement) {\n const isGrouped = element.classList.contains('is-grouped');\n return super.isElementShouldBeSelected(element) && (!isGrouped || this.isGroupedMidsSelected(element));\n }\n\n protected isGroupedBubbleSelected(bubble: HTMLElement) {\n const groupedCheckboxInput = this.getCheckboxInputFromElement(bubble);\n return groupedCheckboxInput?.checked;\n }\n\n protected getMidsFromGroupContainer(groupContainer: HTMLElement) {\n const elements = this.chat.bubbles.getBubbleGroupedItems(groupContainer);\n if(!elements.length) {\n elements.push(groupContainer);\n }\n\n return elements.map((element) => +element.dataset.mid);\n }\n\n protected isGroupedMidsSelected(groupContainer: HTMLElement) {\n const mids = this.getMidsFromGroupContainer(groupContainer);\n const selectedMids = mids.filter((mid) => this.isMidSelected(this.chat.peerId, mid));\n return mids.length === selectedMids.length;\n }\n\n protected getCheckboxInputFromElement(bubble: HTMLElement) {\n /* let perf = performance.now();\n let checkbox = bubble.firstElementChild.tagName === 'LABEL' && bubble.firstElementChild.firstElementChild as HTMLInputElement;\n console.log('getCheckboxInputFromBubble firstElementChild time:', performance.now() - perf);\n\n perf = performance.now();\n checkbox = bubble.querySelector('label input');\n console.log('getCheckboxInputFromBubble querySelector time:', performance.now() - perf); */\n /* let perf = performance.now();\n let contains = bubble.classList.contains('document-container');\n console.log('getCheckboxInputFromBubble classList time:', performance.now() - perf);\n\n perf = performance.now();\n contains = bubble.className.includes('document-container');\n console.log('getCheckboxInputFromBubble className time:', performance.now() - perf); */\n\n return bubble.classList.contains('document-container') ?\n bubble.querySelector('label input') as HTMLInputElement :\n super.getCheckboxInputFromElement(bubble);\n }\n\n public canSelectBubble(bubble: HTMLElement) {\n return !bubble.classList.contains('service') &&\n !bubble.classList.contains('is-outgoing') &&\n !bubble.classList.contains('is-error') &&\n !bubble.classList.contains('bubble-first') &&\n !bubble.classList.contains('avoid-selection');\n }\n\n protected onToggleSelection = async(forwards: boolean, animate: boolean) => {\n const {needTranslateX, widthFrom, widthTo} = await this.chat.input.center(animate);\n\n SetTransition({\n element: this.listenElement,\n className: 'is-selecting',\n forwards,\n duration: animate ? 200 : 0,\n onTransitionEnd: () => {\n if(!this.isSelecting) {\n this.selectionInputWrapper.remove();\n this.selectionInputWrapper =\n this.selectionContainer =\n this.selectionSendNowBtn =\n this.selectionForwardBtn =\n this.selectionDeleteBtn =\n this.selectionLeft =\n this.selectionRight =\n null;\n this.selectedText = undefined;\n }\n\n /* fastRaf(() => {\n this.bubbles.onScroll();\n }); */\n }\n });\n\n // const chatInput = this.appImManager.chatInput;\n\n const translateButtonsX = widthFrom < widthTo ? undefined : needTranslateX * 2;\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n this.selectionInputWrapper = document.createElement('div');\n this.selectionInputWrapper.classList.add('chat-input-wrapper', 'selection-wrapper');\n\n // const background = document.createElement('div');\n // background.classList.add('chat-input-wrapper-background');\n\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add('selection-container');\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n const btnCancel = ButtonIcon('close', {noRipple: true});\n attachClickEvent(btnCancel, () => this.cancelSelection(), {once: true, listenerSetter: this.listenerSetter});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add('selection-container-count');\n\n if(this.chat.type === 'scheduled') {\n this.selectionSendNowBtn = Button('btn-primary btn-transparent btn-short text-bold selection-container-send', {icon: 'send2'});\n this.selectionSendNowBtn.append(i18n('MessageScheduleSend'));\n attachClickEvent(this.selectionSendNowBtn, () => {\n new PopupSendNow(this.chat.peerId, [...this.selectedMids.get(this.chat.peerId)], () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n } else {\n this.selectionForwardBtn = Button('btn-primary btn-transparent text-bold selection-container-forward', {icon: 'forward'});\n this.selectionForwardBtn.append(i18n('Forward'));\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionDeleteBtn = Button('btn-primary btn-transparent danger text-bold selection-container-delete', {icon: 'delete'});\n this.selectionDeleteBtn.append(i18n('Delete'));\n attachClickEvent(this.selectionDeleteBtn, () => {\n new PopupDeleteMessages(this.chat.peerId, [...this.selectedMids.get(this.chat.peerId)], this.chat.type, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n const left = this.selectionLeft = document.createElement('div');\n left.classList.add('selection-container-left');\n left.append(btnCancel, this.selectionCountEl);\n\n const right = this.selectionRight = document.createElement('div');\n right.classList.add('selection-container-right');\n right.append(...[\n this.selectionSendNowBtn,\n this.selectionForwardBtn,\n this.selectionDeleteBtn\n ].filter(Boolean))\n\n if(translateButtonsX !== undefined) {\n left.style.transform = `translateX(${-translateButtonsX}px)`;\n right.style.transform = `translateX(${translateButtonsX}px)`;\n }\n\n this.selectionContainer.append(left, right);\n\n // background.style.opacity = '0';\n this.selectionInputWrapper.style.opacity = '0';\n this.selectionInputWrapper.append(/* background, */this.selectionContainer);\n this.input.inputContainer.append(this.selectionInputWrapper);\n\n void this.selectionInputWrapper.offsetLeft; // reflow\n // background.style.opacity = '';\n this.selectionInputWrapper.style.opacity = '';\n left.style.transform = '';\n right.style.transform = '';\n }\n } else if(this.selectionLeft && translateButtonsX !== undefined) {\n this.selectionLeft.style.transform = `translateX(-${translateButtonsX}px)`;\n this.selectionRight.style.transform = `translateX(${translateButtonsX}px)`;\n }\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n replaceContent(this.selectionCountEl, i18n('messages', [this.length()]));\n this.selectionSendNowBtn && this.selectionSendNowBtn.toggleAttribute('disabled', cantSend);\n this.selectionForwardBtn && this.selectionForwardBtn.toggleAttribute('disabled', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.toggleAttribute('disabled', cantDelete);\n };\n\n protected onCancelSelection = async() => {\n return;\n const promises: Promise[] = [];\n for(const [peerId, mids] of this.selectedMids) {\n for(const mid of mids) {\n promises.push(this.bubbles.getMountedBubble(mid).then((m) => m?.bubble));\n }\n }\n\n const bubbles = filterUnique((await Promise.all(promises)).filter(Boolean));\n bubbles.forEach((bubble) => {\n this.toggleByElement(bubble);\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function getSelectedText(): string {\n if(window.getSelection) {\n return window.getSelection().toString();\n // @ts-ignore\n } else if(document.selection) {\n // @ts-ignore\n return document.selection.createRange().text;\n }\n\n return '';\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../helpers/listenerSetter';\nimport ripple from './ripple';\nimport {LangPackKey, _i18n} from '../lib/langPack';\nimport getDeepProperty from '../helpers/object/getDeepProperty';\nimport rootScope from '../lib/rootScope';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\n\nexport type CheckboxFieldOptions = {\n text?: LangPackKey,\n textArgs?: any[],\n name?: string,\n round?: boolean,\n toggle?: boolean,\n stateKey?: string,\n stateValues?: any[],\n disabled?: boolean,\n checked?: boolean,\n restriction?: boolean,\n withRipple?: boolean,\n withHover?: boolean,\n listenerSetter?: ListenerSetter\n};\nexport default class CheckboxField {\n public input: HTMLInputElement;\n public label: HTMLLabelElement;\n public span: HTMLSpanElement;\n public listenerSetter: ListenerSetter;\n\n constructor(options: CheckboxFieldOptions = {}) {\n const label = this.label = document.createElement('label');\n label.classList.add('checkbox-field');\n\n if(options.restriction) {\n label.classList.add('checkbox-field-restriction');\n }\n\n if(options.round) {\n label.classList.add('checkbox-field-round');\n }\n\n if(options.disabled) {\n this.toggleDisability(true);\n }\n\n this.listenerSetter = options.listenerSetter;\n\n const input = this.input = document.createElement('input');\n input.classList.add('checkbox-field-input');\n input.type = 'checkbox';\n if(options.name) {\n input.id = 'input-' + options.name;\n }\n\n if(options.checked) {\n input.checked = true;\n }\n\n if(options.stateKey) {\n let loaded = false;\n const onChange = () => {\n if(!loaded) {\n return;\n }\n\n let value: any;\n if(options.stateValues) {\n value = options.stateValues[input.checked ? 1 : 0];\n } else {\n value = input.checked;\n }\n\n rootScope.managers.appStateManager.setByKey(options.stateKey, value);\n };\n\n apiManagerProxy.getState().then((state) => {\n loaded = true;\n const stateValue = getDeepProperty(state, options.stateKey);\n let checked: boolean;\n if(options.stateValues) {\n checked = options.stateValues.indexOf(stateValue) === 1;\n } else {\n checked = stateValue;\n }\n\n this.setValueSilently(checked);\n });\n\n if(options.listenerSetter) options.listenerSetter.add(input)('change', onChange);\n else input.addEventListener('change', onChange);\n }\n\n let span: HTMLSpanElement;\n if(options.text) {\n span = this.span = document.createElement('span');\n span.classList.add('checkbox-caption');\n _i18n(span, options.text, options.textArgs);\n } else {\n label.classList.add('checkbox-without-caption');\n }\n\n label.append(input);\n\n if(options.toggle) {\n label.classList.add('checkbox-field-toggle');\n\n const toggle = document.createElement('div');\n toggle.classList.add('checkbox-toggle');\n label.append(toggle);\n } else {\n const box = document.createElement('div');\n box.classList.add('checkbox-box');\n\n const checkSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n checkSvg.classList.add('checkbox-box-check');\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#check');\n use.setAttributeNS(null, 'x', '-1');\n checkSvg.append(use);\n\n const bg = document.createElement('div');\n bg.classList.add('checkbox-box-background');\n\n const border = document.createElement('div');\n border.classList.add('checkbox-box-border');\n\n box.append(border, bg, checkSvg);\n\n label.append(box);\n }\n\n if(span) {\n label.append(span);\n }\n\n if(options.withRipple) {\n label.classList.add('checkbox-ripple', 'hover-effect');\n ripple(label, undefined, undefined, true);\n // label.prepend(input);\n } else if(options.withHover) {\n label.classList.add('hover-effect');\n }\n }\n\n get checked() {\n return this.input.checked;\n }\n\n set checked(checked: boolean) {\n /* if(this.checked === checked) {\n return;\n } */\n\n this.setValueSilently(checked);\n\n const event = new Event('change', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(checked: boolean) {\n this.input.checked = checked;\n }\n\n public toggleDisability(disable: boolean) {\n this.label.classList.toggle('checkbox-disabled', disable);\n return () => this.toggleDisability(!disable);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField, {InputFieldOptions} from './inputField';\n\nexport default class CodeInputField extends InputField {\n constructor(public options: InputFieldOptions & {\n length: number,\n onFill: (code: string) => void\n }) {\n super(Object.assign(options, {\n plainText: true\n }));\n\n const input = this.input as HTMLInputElement;\n input.type = 'tel';\n input.setAttribute('required', '');\n input.autocomplete = 'off';\n\n let lastLength = 0;\n this.input.addEventListener('input', (e) => {\n this.input.classList.remove('error');\n this.setLabel();\n\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\n this.setValueSilently(value);\n\n const length = this.value.length;\n if(length === options.length) { // submit code\n options.onFill(this.value);\n } else if(length === lastLength) {\n return;\n }\n\n lastLength = length;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {addCancelButton} from './popups';\nimport PopupPeer, {PopupPeerCheckboxOptions, PopupPeerOptions} from './popups/peer';\n\n// type PopupConfirmationOptions = Pick;\nexport type PopupConfirmationOptions = PopupPeerOptions & {\n button: PopupPeerOptions['buttons'][0],\n checkbox?: PopupPeerOptions['checkboxes'][0]\n};\n\nexport default function confirmationPopup(\n options: T\n): Promise : (T['checkbox'] extends PopupPeerCheckboxOptions ? boolean : void)> {\n return new Promise((resolve, reject) => {\n const {button, checkbox} = options;\n button.callback = (set) => {\n if(checkbox || !set) {\n resolve(set ? !!set.size : undefined);\n } else {\n resolve(options.checkboxes.map((checkbox) => set.has(checkbox.text)));\n }\n };\n\n const buttons = addCancelButton(options.buttons || [button]);\n const cancelButton = buttons.find((button) => button.isCancel);\n cancelButton.callback = () => {\n reject();\n };\n\n options.buttons = buttons;\n options.checkboxes ??= checkbox && [checkbox];\n\n new PopupPeer('popup-confirmation', options).show();\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\nimport {randomLong} from '../helpers/random';\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport I18n, {i18n} from '../lib/langPack';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../lib/rootScope';\nimport {getCountryEmoji} from '../vendor/emoji';\nimport InputField, {InputFieldOptions} from './inputField';\nimport Scrollable from './scrollable';\n\nlet countries: HelpCountry.helpCountry[];\nconst setCountries = () => {\n countries = I18n.countriesList\n .filter((country) => !country.pFlags?.hidden)\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\n};\n\nlet init = () => {\n setCountries();\n rootScope.addEventListener('language_change', () => {\n setCountries();\n });\n};\n\nconst VIRTUAL_COUNTRIES = new Set(['FT']);\n\nexport default class CountryInputField extends InputField {\n private lastCountrySelected: HelpCountry;\n private lastCountryCodeSelected: HelpCountryCode;\n\n private hideTimeout: number;\n private selectWrapper: HTMLElement;\n\n private liMap: Map;\n\n constructor(public options: InputFieldOptions & {\n onCountryChange?: (country: HelpCountry.helpCountry, code: HelpCountryCode.helpCountryCode) => void,\n noPhoneCodes?: boolean\n } = {}) {\n super({\n label: 'Country',\n name: randomLong(),\n ...options\n });\n\n if(init) {\n init();\n init = undefined;\n }\n\n this.liMap = new Map();\n\n this.container.classList.add('input-select');\n\n const selectWrapper = this.selectWrapper = document.createElement('div');\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\n\n const arrowDown = document.createElement('span');\n arrowDown.classList.add('arrow', 'arrow-down');\n this.container.append(arrowDown);\n\n const selectList = document.createElement('ul');\n selectWrapper.appendChild(selectList);\n\n const scroll = new Scrollable(selectWrapper);\n\n let initSelect = () => {\n initSelect = null;\n\n countries.forEach((c) => {\n if(options.noPhoneCodes && VIRTUAL_COUNTRIES.has(c.iso2)) {\n return;\n }\n\n const emoji = getCountryEmoji(c.iso2);\n\n const liArr: Array = [];\n for(let i = 0, length = Math.min(c.country_codes.length, options.noPhoneCodes ? 1 : Infinity); i < length; ++i) {\n const countryCode = c.country_codes[i];\n const li = document.createElement('li');\n\n const wrapped = wrapEmojiText(emoji);\n if(IS_EMOJI_SUPPORTED) {\n const spanEmoji = document.createElement('span');\n setInnerHTML(spanEmoji, wrapped);\n li.append(spanEmoji);\n } else {\n setInnerHTML(li, wrapped);\n }\n\n const el = i18n(c.default_name as any);\n el.dataset.defaultName = c.default_name;\n li.append(el);\n\n if(!options.noPhoneCodes) {\n const span = document.createElement('span');\n span.classList.add('phone-code');\n span.innerText = '+' + countryCode.country_code;\n li.appendChild(span);\n }\n\n liArr.push(li);\n selectList.append(li);\n }\n\n this.liMap.set(c.iso2, liArr);\n });\n\n selectList.addEventListener('mousedown', (e) => {\n if(e.button !== 0) { // other buttons but left shall not pass\n return;\n }\n\n const target = findUpTag(e.target, 'LI')\n this.selectCountryByTarget(target);\n // console.log('clicked', e, countryName, phoneCode);\n });\n\n this.container.appendChild(selectWrapper);\n };\n\n initSelect();\n\n this.input.addEventListener('focus', (e) => {\n if(initSelect) {\n initSelect();\n } else {\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) return;\n arr.forEach((li) => li.style.display = '');\n });\n }\n\n clearTimeout(this.hideTimeout);\n this.hideTimeout = undefined;\n\n selectWrapper.classList.remove('hide');\n void selectWrapper.offsetWidth; // reflow\n selectWrapper.classList.add('active');\n\n this.select();\n\n fastSmoothScroll({\n // container: page.pageEl.parentElement.parentElement,\n container: findUpClassName(this.container, 'scrollable-y'),\n element: this.input,\n position: 'start',\n margin: 4\n });\n\n setTimeout(() => {\n if(!mouseDownHandlerAttached) {\n document.addEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = true;\n }\n }, 0);\n });\n\n let mouseDownHandlerAttached = false;\n const onMouseDown = (e: MouseEvent) => {\n if(findUpClassName(e.target, 'input-select')) {\n return;\n }\n if(e.target === this.input) {\n return;\n }\n\n this.hidePicker();\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = false;\n };\n\n /* false && this.input.addEventListener('blur', function(this: typeof this.input, e) {\n hidePicker();\n\n e.cancelBubble = true;\n }, {capture: true}); */\n\n const onKeyPress = (e: KeyboardEvent) => {\n const key = e.key;\n if(e.ctrlKey || key === 'Control') return false;\n\n // let i = new RegExp('^' + this.value, 'i');\n const _value = this.value.toLowerCase();\n const matches: HelpCountry[] = [];\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) {\n return;\n }\n\n const names = [\n c.name,\n c.default_name,\n c.iso2\n ];\n\n names.filter(Boolean).forEach((name) => {\n const abbr = name.split(' ').filter((word) => /\\w/.test(word)).map((word) => word[0]).join('');\n if(abbr.length > 1) {\n names.push(abbr);\n }\n });\n\n const good = !!names.filter(Boolean).find((str) => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;// i.test(c.name);\n\n arr.forEach((li) => li.style.display = good ? '' : 'none');\n if(good) matches.push(c);\n });\n\n // Код ниже автоматически выберет страну если она осталась одна при поиске\n /* if(matches.length === 1 && matches[0].li.length === 1) {\n if(matches[0].name === lastCountrySelected) return false;\n //console.log('clicking', matches[0]);\n\n var clickEvent = document.createEvent('MouseEvents');\n clickEvent.initEvent('mousedown', true, true);\n matches[0].li[0].dispatchEvent(clickEvent);\n return false;\n } else */if(matches.length === 0) {\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) {\n return;\n }\n\n arr.forEach((li) => li.style.display = '');\n });\n } else if(matches.length === 1 && key === 'Enter') {\n cancelEvent(e);\n this.selectCountryByTarget(this.liMap.get(matches[0].iso2)[0]);\n }\n };\n\n this.input.addEventListener('keyup', onKeyPress);\n this.input.addEventListener('keydown', (e) => {\n if(e.key === 'Enter') {\n onKeyPress(e);\n }\n });\n\n arrowDown.addEventListener('mousedown', (e) => {\n if(this.input.matches(':focus')) {\n this.hidePicker();\n this.input.blur();\n } else {\n e.cancelBubble = true;\n e.preventDefault();\n this.input.focus();\n }\n });\n }\n\n public getSelected() {\n return {country: this.lastCountrySelected, code: this.lastCountryCodeSelected};\n }\n\n public hidePicker = () => {\n if(this.hideTimeout !== undefined) return;\n this.selectWrapper.classList.remove('active');\n this.hideTimeout = window.setTimeout(() => {\n this.selectWrapper.classList.add('hide');\n this.hideTimeout = undefined;\n }, 200);\n }\n\n public selectCountryByTarget = (target: HTMLElement) => {\n const defaultName = target.querySelector('[data-default-name]').dataset.defaultName;\n const phoneCodeEl = target.querySelector('.phone-code');\n const phoneCode = phoneCodeEl?.innerText;\n const countryCode = phoneCode && phoneCode.replace(/\\D/g, '');\n\n replaceContent(this.input, i18n(defaultName as any));\n this.simulateInputEvent();\n this.lastCountrySelected = countries.find((c) => c.default_name === defaultName);\n this.lastCountryCodeSelected = countryCode && this.lastCountrySelected.country_codes.find((_countryCode) => _countryCode.country_code === countryCode);\n\n this.options.onCountryChange?.(this.lastCountrySelected, this.lastCountryCodeSelected);\n this.hidePicker();\n }\n\n public selectCountryByIso2(iso2: string) {\n this.selectCountryByTarget(this.liMap.get(iso2)[0]);\n }\n\n public override(country: HelpCountry, code: HelpCountryCode, countryName?: string) {\n replaceContent(this.input, country ? i18n(country.default_name as any) : countryName);\n this.lastCountrySelected = country;\n this.lastCountryCodeSelected = code;\n this.options.onCountryChange?.(this.lastCountrySelected, this.lastCountryCodeSelected);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_MOBILE} from '../environment/userAgent';\nimport {animate} from '../helpers/animation';\nimport {Middleware} from '../helpers/middleware';\nimport clamp from '../helpers/number/clamp';\nimport animationIntersector, {AnimationItemGroup, AnimationItemWrapper} from './animationIntersector';\n\ntype DotRendererDot = {\n x: number,\n y: number,\n opacity: number,\n radius: number\n mOpacity: number,\n adding: boolean,\n counter: number,\n path: Path2D\n};\nexport default class DotRenderer implements AnimationItemWrapper {\n public canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n private dots: DotRendererDot[];\n\n public paused: boolean;\n public autoplay: boolean;\n public tempId: number;\n\n private dpr: number;\n\n constructor(\n private width: number,\n private height: number,\n private multiply?: number\n ) {\n const canvas = this.canvas = document.createElement('canvas');\n const dpr = this.dpr = window.devicePixelRatio;\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n canvas.classList.add('canvas-thumbnail', 'canvas-dots');\n\n this.paused = true;\n this.autoplay = true;\n this.tempId = 0;\n this.context = canvas.getContext('2d');\n }\n\n private prepare() {\n let count = Math.round(this.width * this.height / (35 * (IS_MOBILE ? 2 : 1)));\n count *= this.multiply || 1;\n count = Math.min(IS_MOBILE ? 1000 : 2200, count);\n count = Math.round(count);\n const dots: DotRendererDot[] = this.dots = new Array(count);\n\n for(let i = 0; i < count; ++i) {\n dots[i] = this.generateDot();\n }\n }\n\n private generateDot(adding?: boolean): DotRendererDot {\n const x = Math.floor(Math.random() * this.canvas.width);\n const y = Math.floor(Math.random() * this.canvas.height);\n const opacity = adding ? 0 : Math.random();\n const radius = (Math.random() >= .8 ? 1 : 0.5) * this.dpr;\n const path = new Path2D();\n path.arc(x, y, radius, 0, 2 * Math.PI, false);\n return {\n x,\n y,\n opacity,\n radius,\n mOpacity: opacity,\n adding: adding ?? Math.random() >= .5,\n counter: 0,\n path\n };\n }\n\n private draw() {\n const {context, canvas, dots} = this;\n context.clearRect(0, 0, canvas.width, canvas.height);\n context.fillStyle = '#fff';\n\n const add = 0.02;\n for(let i = 0, length = dots.length; i < length; ++i) {\n const dot = dots[i];\n const addOpacity = dot.adding ? add : -add;\n\n dot.mOpacity += addOpacity;\n // if(dot.mOpacity <= 0) dot.mOpacity = dot.opacity;\n\n // const easedOpacity = easing(dot.mOpacity);\n const easedOpacity = clamp(dot.mOpacity, 0, 1);\n context.globalAlpha = easedOpacity;\n context.fill(dot.path);\n\n if(dot.mOpacity <= 0) {\n dot.adding = true;\n\n if(++dot.counter >= 1) {\n dots[i] = this.generateDot(dot.adding);\n }\n } else if(dot.mOpacity >= 1) {\n dot.adding = false;\n }\n }\n }\n\n public remove() {\n this.pause();\n }\n\n public pause() {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n ++this.tempId;\n }\n\n public renderFirstFrame() {\n if(!this.dots) {\n this.prepare();\n }\n\n this.draw();\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n const tempId = ++this.tempId;\n\n if(!this.dots) {\n this.prepare();\n }\n\n animate(() => {\n if(this.tempId !== tempId || this.paused) {\n return false;\n }\n\n this.draw();\n return true;\n });\n }\n\n public static create({\n width,\n height,\n middleware,\n animationGroup,\n multiply\n }: {\n width: number,\n height: number,\n middleware: Middleware,\n animationGroup: AnimationItemGroup,\n multiply?: number\n }) {\n const dotRenderer = new DotRenderer(width, height, multiply);\n dotRenderer.renderFirstFrame();\n\n animationIntersector.addAnimation(dotRenderer, animationGroup, dotRenderer.canvas, middleware);\n\n return dotRenderer;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputFile} from '../layer';\nimport AvatarEdit from './avatarEdit';\nimport AvatarElement from './avatar';\nimport InputField from './inputField';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ButtonCorner from './buttonCorner';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\n\nexport default class EditPeer {\n public nextBtn: HTMLButtonElement;\n\n public uploadAvatar: () => Promise;\n public avatarEdit: AvatarEdit;\n public avatarElem: AvatarElement;\n\n private inputFields: InputField[];\n private listenerSetter: ListenerSetter;\n\n private peerId: PeerId;\n\n private _disabled = false;\n private avatarSize = 120;\n\n constructor(options: {\n peerId?: EditPeer['peerId'],\n inputFields: EditPeer['inputFields'],\n listenerSetter: ListenerSetter,\n doNotEditAvatar?: boolean,\n withoutAvatar?: boolean,\n nextBtn?: HTMLButtonElement,\n avatarSize?: number,\n popupOptions?: ConstructorParameters[1]\n }) {\n safeAssign(this, options);\n\n this.peerId ||= NULL_PEER_ID;\n\n if(!this.nextBtn) {\n this.nextBtn = ButtonCorner({icon: 'check'});\n } else if(!this.nextBtn.classList.contains('btn-corner')) {\n this.handleChange = () => {\n this.nextBtn.toggleAttribute('disabled', !this.isChanged() || this.disabled);\n };\n }\n\n if(!options.withoutAvatar) {\n this.avatarElem = new AvatarElement();\n this.avatarElem.classList.add('avatar-placeholder', 'avatar-' + this.avatarSize);\n this.avatarElem.updateWithOptions({peerId: this.peerId});\n\n if(!options.doNotEditAvatar) {\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n this.handleChange();\n this.avatarElem.remove();\n }, options.popupOptions);\n\n this.avatarEdit.container.append(this.avatarElem);\n }\n }\n\n this.inputFields.forEach((inputField) => {\n this.listenerSetter.add(inputField.input)('input', this.handleChange);\n });\n\n this.handleChange();\n }\n\n public get disabled() {\n return this._disabled;\n }\n\n public set disabled(value) {\n this._disabled = value;\n this.inputFields.forEach((inputField) => inputField.input.toggleAttribute('disabled', value));\n this.handleChange();\n }\n\n public lockWithPromise(promise: Promise, unlockOnSuccess = false) {\n this.disabled = true;\n promise.then(() => {\n if(unlockOnSuccess) {\n this.disabled = false;\n }\n }, () => {\n this.disabled = false;\n });\n }\n\n public isChanged = () => {\n if(this.uploadAvatar) {\n return true;\n }\n\n let changedLength = 0, requiredLength = 0, requiredValidLength = 0;\n this.inputFields.forEach((inputField) => {\n if(inputField.isValid()) {\n if(inputField.isChanged()) {\n ++changedLength;\n }\n\n if(inputField.required) {\n ++requiredValidLength;\n }\n }\n\n if(inputField.required) {\n ++requiredLength;\n }\n });\n\n return requiredLength === requiredValidLength && changedLength > 0;\n };\n\n public handleChange = () => {\n this.nextBtn.classList.toggle('is-visible', this.isChanged());\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, {EmoticonsDropdown, EmoticonsTab, EMOTICONSSTICKERGROUP} from '..';\nimport GifsMasonry from '../../gifsMasonry';\nimport Scrollable from '../../scrollable';\nimport {putPreloader} from '../../putPreloader';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\n\nexport default class GifsTab implements EmoticonsTab {\n public content: HTMLElement;\n public scrollable: Scrollable;\n public tabId: number;\n\n constructor(private managers: AppManagers) {\n\n }\n\n init() {\n this.content = document.getElementById('content-gifs');\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\n attachClickEvent(gifsContainer, EmoticonsDropdown.onMediaClick);\n\n const scroll = this.scrollable = new Scrollable(this.content, 'GIFS');\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\n const preloader = putPreloader(this.content, true);\n\n this.managers.appDocsManager.getGifs().then((docs) => {\n docs.forEach((doc) => {\n masonry.add(doc);\n });\n\n preloader.remove();\n });\n\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\n\n this.init = null;\n }\n\n onClose() {\n\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport {SliderSuperTab} from '../../slider';\nimport InputSearch from '../../inputSearch';\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\nimport appSidebarRight from '..';\nimport {AppInlineBotsManager} from '../../../lib/appManagers/appInlineBotsManager';\nimport GifsMasonry from '../../gifsMasonry';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport {NULL_PEER_ID} from '../../../lib/mtproto/mtproto_config';\n\nconst ANIMATIONGROUP: AnimationItemGroup = 'GIFS-SEARCH';\n\nexport default class AppGifsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private gifsDiv: HTMLDivElement;\n\n private nextOffset = '';\n private loadedAll = false;\n\n private gifBotPeerId: PeerId;\n private masonry: GifsMasonry;\n\n private searchPromise: ReturnType;\n\n public init() {\n this.container.id = 'search-gifs-container';\n\n this.inputSearch = new InputSearch('SearchGifsTitle', (value) => {\n this.reset();\n this.search(value);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.gifsDiv = document.createElement('div');\n this.gifsDiv.classList.add('gifs-masonry');\n attachClickEvent(this.gifsDiv, this.onGifsClick, {listenerSetter: this.listenerSetter});\n\n this.scrollable.append(this.gifsDiv);\n\n this.masonry = new GifsMasonry(this.gifsDiv, ANIMATIONGROUP, this.scrollable);\n // this.backBtn.parentElement.append(this.inputSearch.container);\n\n appSidebarRight.toggleSidebar(true).then(() => {\n this.search('', true);\n\n this.scrollable.onScrolledBottom = () => {\n this.search(this.inputSearch.value, false);\n };\n });\n }\n\n private onGifsClick = async(e: MouseEvent | TouchEvent) => {\n const target = findUpClassName(e.target, 'gif');\n if(!target) return;\n\n const fileId = target.dataset.docId;\n if(await appImManager.chat.input.sendMessageWithDocument(fileId)) {\n if(mediaSizes.isMobile) {\n appSidebarRight.onCloseBtnClick();\n }\n } else {\n console.warn('got no doc by id:', fileId);\n }\n };\n\n public onClose() {\n this.scrollable.onScrolledBottom = () => {};\n }\n\n public onCloseAfterTimeout() {\n this.reset();\n this.gifsDiv.innerHTML = '';\n animationIntersector.checkAnimations(undefined, ANIMATIONGROUP);\n this.inputSearch.remove();\n return super.onCloseAfterTimeout();\n }\n\n private reset() {\n this.searchPromise = null;\n this.nextOffset = '';\n this.loadedAll = false;\n this.masonry.clear();\n }\n\n public async search(query: string, newSearch = true) {\n if(this.searchPromise || this.loadedAll) return;\n\n if(!this.gifBotPeerId) {\n this.gifBotPeerId = (await this.managers.appUsersManager.resolveUsername('gif')).id.toPeerId(false);\n }\n\n try {\n this.searchPromise = this.managers.appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\n const {results, next_offset} = await this.searchPromise;\n\n if(this.inputSearch.value !== query) {\n return;\n }\n\n this.searchPromise = null;\n this.nextOffset = next_offset;\n if(newSearch) {\n this.gifsDiv.innerHTML = '';\n }\n\n if(results.length) {\n results.forEach((result) => {\n if(result._ === 'botInlineMediaResult' && result.document) {\n this.masonry.add(result.document as MyDocument);\n }\n });\n } else {\n this.loadedAll = true;\n }\n\n this.scrollable.onScroll();\n } catch(err) {\n this.searchPromise = null;\n console.error('gifs loading error:', err);\n throw err;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport InputSearch from '../../inputSearch';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport PopupStickers from '../../popups/stickers';\nimport animationIntersector from '../../animationIntersector';\nimport appSidebarRight from '..';\nimport {StickerSet, StickerSetCovered} from '../../../layer';\nimport {i18n} from '../../../lib/langPack';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport wrapSticker from '../../wrappers/sticker';\n\nexport default class AppStickersTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private setsDiv: HTMLDivElement;\n private lazyLoadQueue: LazyLoadQueue;\n\n public init() {\n this.container.id = 'stickers-container';\n this.container.classList.add('chatlist-container');\n\n this.lazyLoadQueue = new LazyLoadQueue();\n\n this.inputSearch = new InputSearch('StickersTab.SearchPlaceholder', (value) => {\n this.search(value);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.setsDiv = document.createElement('div');\n this.setsDiv.classList.add('sticker-sets');\n this.scrollable.append(this.setsDiv);\n\n attachStickerViewerListeners({listenTo: this.setsDiv, listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.setsDiv, (e) => {\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\n if(sticker) {\n const docId = sticker.dataset.docId;\n appImManager.chat.input.sendMessageWithDocument(docId);\n return;\n }\n\n const target = findUpClassName(e.target, 'sticker-set');\n if(!target) return;\n\n const id = target.dataset.stickerSet as string;\n const access_hash = target.dataset.access_hash as string;\n\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\n if(button) {\n e.preventDefault();\n e.cancelBubble = true;\n\n button.setAttribute('disabled', 'true');\n\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\n this.managers.appStickersManager.toggleStickerSet(full.set).then((changed) => {\n if(changed) {\n button.textContent = '';\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n button.classList.toggle('gray', !!full.set.installed_date);\n }\n }).finally(() => {\n // button.style.width = set.installed_date ? '68px' : '52px';\n button.removeAttribute('disabled');\n });\n });\n } else {\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\n new PopupStickers(full.set).show();\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n appSidebarRight.toggleSidebar(true).then(() => {\n this.renderFeatured();\n });\n }\n\n public onCloseAfterTimeout() {\n this.setsDiv.innerHTML = '';\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\n return super.onCloseAfterTimeout();\n }\n\n public renderSet(set: StickerSet.stickerSet) {\n // console.log('renderSet:', set);\n const div = document.createElement('div');\n div.classList.add('sticker-set');\n\n const header = document.createElement('div');\n header.classList.add('sticker-set-header');\n\n const details = document.createElement('div');\n details.classList.add('sticker-set-details');\n details.innerHTML = `
`;\n\n setInnerHTML(details.firstElementChild, wrapEmojiText(set.title));\n\n const countDiv = document.createElement('div');\n countDiv.classList.add('sticker-set-count');\n countDiv.append(i18n('Stickers', [set.count]));\n details.append(countDiv);\n\n const button = document.createElement('button');\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n // button.style.width = set.installed_date ? '68px' : '52px';\n\n if(set.installed_date) {\n button.classList.add('gray');\n }\n\n // ripple(button);\n\n header.append(details, button);\n\n const stickersDiv = document.createElement('div');\n stickersDiv.classList.add('sticker-set-stickers');\n\n const count = Math.min(5, set.count);\n for(let i = 0; i < count; ++i) {\n const stickerDiv = document.createElement('div');\n stickerDiv.classList.add('sticker-set-sticker');\n\n stickersDiv.append(stickerDiv);\n }\n\n this.managers.appStickersManager.getStickerSet(set).then((set) => {\n // console.log('renderSet got set:', set);\n\n for(let i = 0; i < count; ++i) {\n const div = stickersDiv.children[i] as HTMLDivElement;\n const doc = set.documents[i];\n if(doc._ === 'documentEmpty') {\n continue;\n }\n\n wrapSticker({\n doc,\n div,\n lazyLoadQueue: this.lazyLoadQueue,\n group: 'STICKERS-SEARCH',\n /* play: false,\n loop: false, */\n play: true,\n loop: true,\n width: 68,\n height: 68,\n withLock: true\n });\n }\n });\n\n /* const onMouseOver = () => {\n const animations: AnimationItem['animation'][] = [];\n for(let i = 0; i < count; ++i) {\n const stickerDiv = stickersDiv.children[i] as HTMLElement;\n const animationItem = animationIntersector.getAnimation(stickerDiv);\n if(!animationItem) continue;\n\n const animation = animationItem.animation;\n\n animations.push(animation);\n animation.loop = true;\n animation.play();\n }\n\n div.addEventListener('mouseout', () => {\n animations.forEach((animation) => {\n animation.loop = false;\n });\n\n div.addEventListener('mouseover', onMouseOver, {once: true});\n }, {once: true});\n };\n\n div.addEventListener('mouseover', onMouseOver, {once: true}); */\n\n div.dataset.stickerSet = '' + set.id;\n div.dataset.access_hash = '' + set.access_hash;\n div.dataset.title = set.title;\n\n div.append(header, stickersDiv);\n\n this.setsDiv.append(div);\n }\n\n public renderFeatured() {\n return this.managers.appStickersManager.getFeaturedStickers().then((coveredSets) => {\n if(this.inputSearch.value) {\n return;\n }\n\n coveredSets = this.filterRendered('', coveredSets);\n coveredSets.forEach((set) => {\n this.renderSet(set.set);\n });\n });\n }\n\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\n coveredSets = coveredSets.slice();\n\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\n forEachReverse(children, el => {\n const id = el.dataset.stickerSet;\n const index = coveredSets.findIndex((covered) => covered.set.id === id);\n\n if(index !== -1) {\n coveredSets.splice(index, 1);\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\n el.remove();\n }\n });\n\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\n\n return coveredSets;\n }\n\n public search(query: string) {\n if(!query) {\n return this.renderFeatured();\n }\n\n return this.managers.appStickersManager.searchStickerSets(query, false).then((coveredSets) => {\n if(this.inputSearch.value !== query) {\n return;\n }\n\n // console.log('search result:', coveredSets);\n\n coveredSets = this.filterRendered(query, coveredSets);\n coveredSets.forEach((set) => {\n this.renderSet(set.set);\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport {horizontalMenu} from '../horizontalMenu';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable, {ScrollableX} from '../scrollable';\nimport appSidebarRight from '../sidebarRight';\nimport StickyIntersector from '../stickyIntersector';\nimport EmojiTab from './tabs/emoji';\nimport GifsTab from './tabs/gifs';\nimport StickersTab, {EmoticonsTabC, StickersTabCategory} from './tabs/stickers';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport AppGifsTab from '../sidebarRight/tabs/gifs';\nimport AppStickersTab from '../sidebarRight/tabs/stickers';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport whichChild from '../../helpers/dom/whichChild';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport pause from '../../helpers/schedulers/pause';\nimport {IS_APPLE_MOBILE} from '../../environment/userAgent';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport type LazyLoadQueueIntersector from '../lazyLoadQueueIntersector';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport noop from '../../helpers/noop';\nimport {FocusDirection, ScrollOptions} from '../../helpers/fastSmoothScroll';\nimport BezierEasing from '../../vendor/bezier-easing';\nimport RichInputHandler from '../../helpers/dom/richInputHandler';\nimport {getCaretPosF} from '../../helpers/dom/getCaretPosNew';\nimport ListenerSetter from '../../helpers/listenerSetter';\n\nexport const EMOTICONSSTICKERGROUP: AnimationItemGroup = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n content: HTMLElement;\n scrollable: Scrollable;\n menuScroll?: ScrollableX;\n tabId: number;\n init: () => void;\n onOpen?: () => void;\n onOpened?: () => void;\n onClose?: () => void;\n onClosed?: () => void;\n}\n\nconst easing = BezierEasing(0.42, 0.0, 0.58, 1.0);\nconst scrollOptions: Partial = {\n forceDuration: 200,\n transitionFunction: easing\n};\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue(1);\n\n private emojiTab: EmojiTab;\n private stickersTab: StickersTab;\n private gifsTab: GifsTab;\n\n private container: HTMLElement;\n private tabsEl: HTMLElement;\n private tabId = -1;\n\n private tabs: {[id: number]: EmoticonsTab};\n\n private searchButton: HTMLElement;\n private deleteBtn: HTMLElement;\n\n private selectTab: ReturnType;\n\n private savedRange: Range;\n private managers: AppManagers;\n\n constructor() {\n super({\n element: document.getElementById('emoji-dropdown') as HTMLDivElement,\n ignoreOutClickClassName: 'input-message-input'\n });\n\n this.addEventListener('open', async() => {\n if(IS_TOUCH_SUPPORTED) {\n // appImManager.chat.input.saveScroll();\n if(blurActiveElement()) {\n await pause(100);\n }\n }\n\n if(this.element.parentElement !== appImManager.chat.input.chatInput) {\n appImManager.chat.input.chatInput.append(this.element);\n }\n\n this.savedRange = this.getGoodRange();\n\n EmoticonsDropdown.lazyLoadQueue.lock();\n // EmoticonsDropdown.lazyLoadQueue.unlock();\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n\n const tab = this.tab;\n tab.onOpen?.();\n });\n\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlockAndRefresh();\n\n // this.container.classList.remove('disable-hover');\n\n const tab = this.tab;\n tab.onOpened?.();\n });\n\n this.addEventListener('close', () => {\n EmoticonsDropdown.lazyLoadQueue.lock();\n // EmoticonsDropdown.lazyLoadQueue.lock();\n\n // нужно залочить группу и выключить стикеры\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n const tab = this.tab;\n tab.onClose?.();\n });\n\n this.addEventListener('closed', () => {\n // теперь можно убрать visible, чтобы они не включились после фокуса\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n // this.container.classList.remove('disable-hover');\n\n this.savedRange = undefined;\n\n const tab = this.tab;\n tab.onClosed?.();\n });\n }\n\n public get tab() {\n return this.tabs[this.tabId];\n }\n\n public init() {\n this.managers = rootScope.managers;\n this.emojiTab = new EmojiTab({managers: this.managers});\n this.stickersTab = new StickersTab(this.managers);\n this.gifsTab = new GifsTab(this.managers);\n\n this.tabs = {};\n [this.emojiTab, this.stickersTab, this.gifsTab].forEach((tab, idx) => {\n tab.tabId = idx;\n this.tabs[idx] = tab;\n });\n\n this.container = this.element.querySelector('.emoji-container .tabs-container') as HTMLDivElement;\n this.container.prepend(this.emojiTab.container, this.stickersTab.container);\n this.tabsEl = this.element.querySelector('.emoji-tabs') as HTMLUListElement;\n this.selectTab = horizontalMenu(this.tabsEl, this.container, this.onSelectTabClick, () => {\n const {tab} = this;\n tab.init?.();\n animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n });\n\n this.searchButton = this.element.querySelector('.emoji-tabs-search');\n this.searchButton.addEventListener('click', () => {\n if(this.tabId === this.stickersTab.tabId) {\n if(!appSidebarRight.isTabExists(AppStickersTab)) {\n appSidebarRight.createTab(AppStickersTab).open();\n }\n } else {\n if(!appSidebarRight.isTabExists(AppGifsTab)) {\n appSidebarRight.createTab(AppGifsTab).open();\n }\n }\n });\n\n this.deleteBtn = this.element.querySelector('.emoji-tabs-delete');\n attachClickEvent(this.deleteBtn, (e) => {\n cancelEvent(e);\n const input = appImManager.chat.input.messageInput;\n // RichInputHandler.getInstance().makeFocused(appImManager.chat.input.messageInput);\n let range = RichInputHandler.getInstance().getSavedRange(input);\n if(!range) {\n range = document.createRange();\n range.setStartAfter(input.lastChild);\n }\n\n const newRange = range.cloneRange();\n // if(range.endOffset === range.startOffset && range.endContainer === range.startContainer) {\n if(range.collapsed) {\n const {node, offset} = getCaretPosF(input, range.endContainer, range.endOffset);\n let newStartNode: Node;\n if(offset) {\n newStartNode = node;\n } else {\n newStartNode = node.previousSibling;\n if(!newStartNode) {\n return;\n }\n\n while(newStartNode.nodeType === newStartNode.TEXT_NODE && !newStartNode.nodeValue && (newStartNode = newStartNode.previousSibling)) {\n\n }\n\n if(newStartNode.nodeType === newStartNode.ELEMENT_NODE && !(newStartNode as HTMLElement).isContentEditable) {\n return;\n }\n }\n\n if(newStartNode.nodeType === newStartNode.ELEMENT_NODE && (newStartNode as any).tagName === 'IMG') {\n newRange.selectNode(newStartNode);\n } else {\n const text = [...newStartNode.textContent];\n let t: string;\n if(offset) {\n let length = 0;\n t = text.find((text) => (length += text.length, length >= offset));\n } else {\n t = text.pop() || '';\n }\n\n const newOffset = offset ? offset - t.length : newStartNode.textContent.length - t.length;\n newRange.setStart(newStartNode, newOffset);\n }\n }\n\n newRange.deleteContents();\n\n appImManager.chat.input.messageInputField.simulateInputEvent();\n // const selection = document.getSelection();\n // if(selection.isCollapsed) {\n // selection.modify('extend', 'backward', 'character');\n // }\n\n // selection.deleteFromDocument();\n // (document.activeElement as HTMLElement).blur();\n\n // document.execCommand('undo', false, null);\n // const input = appImManager.chat.input.messageInput;\n // if((input.lastChild as any)?.tagName) {\n // input.lastElementChild.remove();\n // } else if(input.lastChild) {\n // if(!input.lastChild.textContent.length) {\n // input.lastChild.remove();\n // } else {\n // input.lastChild.textContent = input.lastChild.textContent.slice(0, -1);\n // }\n // }\n\n // const event = new Event('input', {bubbles: true, cancelable: true});\n // appImManager.chat.input.messageInput.dispatchEvent(event);\n // // appSidebarRight.stickersTab.init();\n });\n\n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE && false;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? this.stickersTab.tabId : this.emojiTab.tabId;\n\n if(HIDE_EMOJI_TAB) {\n (this.tabsEl.children[1] as HTMLElement).classList.add('hide');\n }\n\n simulateClickEvent(this.tabsEl.children[INIT_TAB_ID + 1] as HTMLElement);\n if(this.tabs[INIT_TAB_ID].init) {\n this.tabs[INIT_TAB_ID].init(); // onTransitionEnd не вызовется, т.к. это первая открытая вкладка\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n let lastMouseMoveEvent: MouseEvent, mouseMoveEventAttached = false;\n const onMouseMove = (e: MouseEvent) => {\n lastMouseMoveEvent = e;\n };\n overlayCounter.addEventListener('change', (isActive) => {\n if(isActive) {\n if(!mouseMoveEventAttached) {\n document.body.addEventListener('mousemove', onMouseMove);\n mouseMoveEventAttached = true;\n }\n } else if(mouseMoveEventAttached) {\n document.body.removeEventListener('mousemove', onMouseMove);\n if(lastMouseMoveEvent) {\n this.onMouseOut(lastMouseMoveEvent);\n }\n }\n });\n }\n\n appImManager.addEventListener('peer_changing', () => {\n this.toggle(false);\n });\n appImManager.addEventListener('peer_changed', this.checkRights);\n this.checkRights();\n\n return super.init();\n }\n\n public getElement() {\n return this.element;\n }\n\n public scrollTo(tab: EmoticonsTab, element: HTMLElement) {\n tab.scrollable.scrollIntoViewNew({\n element: element as HTMLElement,\n axis: 'y',\n position: 'start',\n ...scrollOptions\n });\n }\n\n private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n const {tab} = this;\n this.scrollTo(tab, tab.scrollable.container.firstElementChild as HTMLElement);\n return;\n }\n\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === this.emojiTab.tabId);\n this.deleteBtn.classList.toggle('hide', this.tabId !== this.emojiTab.tabId);\n };\n\n private checkRights = async() => {\n const {peerId, threadId} = appImManager.chat;\n const children = this.tabsEl.children;\n const tabsElements = Array.from(children) as HTMLElement[];\n\n const [canSendStickers, canSendGifs] = await Promise.all([\n this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_stickers'),\n this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_gifs')\n ]);\n\n tabsElements[this.stickersTab.tabId + 1].toggleAttribute('disabled', !canSendStickers);\n tabsElements[this.gifsTab.tabId + 1].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== (this.emojiTab.tabId + 1) && (!canSendStickers || !canSendGifs)) {\n this.selectTab(this.emojiTab.tabId, false);\n }\n };\n\n public static menuOnClick = (\n emoticons: EmoticonsTabC,\n menu: HTMLElement,\n scrollable: Scrollable,\n menuScroll?: ScrollableX,\n prevTab?: StickersTabCategory,\n listenerSetter?: ListenerSetter\n ) => {\n let jumpedTo = -1;\n\n const scrollToTab = (tab: typeof prevTab, f?: boolean) => {\n const m = tab.menuScroll || menuScroll;\n if(m) {\n m.scrollIntoViewNew({\n element: tab.elements.menuTab,\n position: 'center',\n axis: 'x',\n getElementPosition: f ? ({elementPosition}) => {\n return elementPosition - 106;\n } : undefined,\n ...scrollOptions\n });\n }\n };\n\n const setActive = (tab: typeof prevTab, scroll = true) => {\n if(tab === prevTab) {\n return false;\n }\n\n let f = false;\n if(prevTab) {\n prevTab.elements.menuTab.classList.remove('active');\n if(prevTab.menuScroll && prevTab.menuScroll !== tab.menuScroll) {\n f = true;\n // scroll to first\n prevTab.menuScroll.container.parentElement.classList.remove('active');\n prevTab.menuScroll.scrollIntoViewNew({\n element: prevTab.menuScroll.container.firstElementChild as HTMLElement,\n forceDirection: scroll ? undefined : FocusDirection.Static,\n position: 'center',\n axis: 'x',\n ...scrollOptions\n });\n }\n }\n\n tab.elements.menuTab.classList.add('active');\n\n if(tab.menuScroll) {\n tab.menuScroll.container.parentElement.classList.add('active');\n scroll && menuScroll.scrollIntoViewNew({\n element: tab.menuScroll.container.parentElement,\n position: 'center',\n axis: 'x',\n ...scrollOptions\n });\n }\n\n if(prevTab) {\n scrollToTab(tab, f);\n }\n\n prevTab = tab;\n\n return true;\n };\n\n const setActiveStatic = (tab: typeof prevTab) => {\n if(prevTab?.local) {\n return;\n }\n\n emoticons.scrollable.scrollTop = tab.elements.container.offsetTop + 1;\n const s = emoticons.menuScroll.container;\n const e = tab.elements.menuTab;\n s.scrollLeft = e.offsetLeft - s.clientWidth / 2 + e.offsetWidth / 2;\n setActive(tab, false);\n };\n\n let scrollingToContent = false;\n const stickyIntersector = new StickyIntersector(scrollable.container, (stuck, target) => {\n if(scrollingToContent) {\n return;\n }\n\n // console.log('sticky scrollTop', stuck, target, scrollable.container.scrollTop, jumpedTo);\n\n if(Math.abs(jumpedTo - scrollable.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const tab = emoticons.getCategoryByContainer(target);\n const which = whichChild(target);\n if(!stuck && (which || tab.menuScroll)) {\n return;\n }\n\n setActive(tab);\n });\n\n attachClickEvent(menu, (e) => {\n let target = findUpClassName(e.target as HTMLElement, 'menu-horizontal-div-item');\n if(!target) {\n target = findUpClassName(e.target as HTMLElement, 'menu-horizontal-inner');\n if(!target || target.classList.contains('active')) {\n return;\n }\n\n target = target.firstElementChild.firstElementChild as HTMLElement;\n }\n\n const which = whichChild(target);\n\n const tab = emoticons.getCategoryByMenuTab(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(setActive(tab)) {\n // scrollToTab(tab);\n // return;\n }\n\n let offsetTop = 0, additionalOffset = 0;\n if(which > 0 || tab.menuScroll) {\n const element = tab.elements.container;\n additionalOffset = 1;\n offsetTop = element.offsetTop + additionalOffset; // * due to stickyIntersector\n }\n\n jumpedTo = offsetTop;\n\n scrollingToContent = true;\n scrollable.scrollIntoViewNew({\n element: offsetTop ? tab.elements.container : scrollable.container.firstElementChild,\n position: 'start',\n axis: 'y',\n getElementPosition: offsetTop ? ({elementPosition}) => elementPosition + additionalOffset : undefined,\n ...scrollOptions\n }).finally(() => {\n setActive(tab);\n scrollingToContent = false;\n });\n }, {listenerSetter});\n\n const a = scrollable.onAdditionalScroll ? scrollable.onAdditionalScroll.bind(scrollable) : noop;\n scrollable.onAdditionalScroll = () => {\n emoticons.content.parentElement.classList.toggle('scrolled-top', !scrollable.scrollTop);\n a();\n };\n\n return {stickyIntersector, setActive, setActiveStatic};\n };\n\n public static onMediaClick = async(e: {target: EventTarget | Element}, clearDraft = false, silent?: boolean) => {\n const target = findUpTag(e.target as HTMLElement, 'DIV');\n if(!target) return false;\n\n const docId = target.dataset.docId;\n if(!docId) return false;\n\n return this.sendDocId(docId, clearDraft, silent);\n };\n\n public static async sendDocId(docId: DocId, clearDraft?: boolean, silent?: boolean) {\n if(await appImManager.chat.input.sendMessageWithDocument(docId, undefined, clearDraft, silent)) {\n /* dropdown.classList.remove('active');\n toggleEl.classList.remove('active'); */\n if(emoticonsDropdown.container) {\n emoticonsDropdown.forceClose = true;\n // emoticonsDropdown.container.classList.add('disable-hover');\n emoticonsDropdown.toggle(false);\n }\n\n return true;\n } else {\n console.warn('got no doc by id:', docId);\n return false;\n }\n }\n\n public addLazyLoadQueueRepeat(lazyLoadQueue: LazyLoadQueueIntersector, processInvisibleDiv: (div: HTMLElement) => void) {\n this.addEventListener('close', () => {\n lazyLoadQueue.lock();\n });\n\n this.addEventListener('closed', () => {\n const divs = lazyLoadQueue.intersector.getVisible();\n\n for(const div of divs) {\n processInvisibleDiv(div);\n }\n\n lazyLoadQueue.intersector.clearVisible();\n });\n\n this.addEventListener('opened', () => {\n lazyLoadQueue.unlockAndRefresh();\n });\n }\n\n public getSavedRange() {\n return this.getGoodRange() || this.savedRange;\n }\n\n private getGoodRange() {\n const sel = document.getSelection();\n if(sel.rangeCount && document.activeElement === appImManager.chat.input.messageInput) {\n return sel.getRangeAt(0);\n }\n }\n}\n\nconst emoticonsDropdown = new EmoticonsDropdown();\nMOUNT_CLASS_TO.emoticonsDropdown = emoticonsDropdown;\nexport default emoticonsDropdown;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, {EmoticonsDropdown, EMOTICONSSTICKERGROUP} from '..';\nimport cancelEvent from '../../../helpers/dom/cancelEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {fastRaf} from '../../../helpers/schedulers';\nimport pause from '../../../helpers/schedulers/pause';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport {emojiFromCodePoints} from '../../../vendor/emoji';\nimport {putPreloader} from '../../putPreloader';\nimport Scrollable, {ScrollableX} from '../../scrollable';\nimport IS_EMOJI_SUPPORTED from '../../../environment/emojiSupport';\nimport IS_TOUCH_SUPPORTED from '../../../environment/touchSupport';\nimport blurActiveElement from '../../../helpers/dom/blurActiveElement';\nimport Emoji from '../../../config/emoji';\nimport fixEmoji from '../../../lib/richTextProcessor/fixEmoji';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport wrapSingleEmoji from '../../../lib/richTextProcessor/wrapSingleEmoji';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport {EmoticonsTabC, StickersTabCategory} from './stickers';\nimport {makeMediaSize} from '../../../helpers/mediaSize';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport VisibilityIntersector, {OnVisibilityChangeItem} from '../../visibilityIntersector';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport {Document, StickerSet} from '../../../layer';\nimport {CustomEmojiElement, CustomEmojiRendererElement} from '../../../lib/richTextProcessor/wrapRichText';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport PopupStickers from '../../popups/stickers';\nimport {hideToast, toastNew} from '../../toast';\nimport safeAssign from '../../../helpers/object/safeAssign';\nimport type {AppStickersManager} from '../../../lib/appManagers/appStickersManager';\n\nconst loadedURLs: Set = new Set();\nexport function appendEmoji(emoji: string, container?: HTMLElement, prepend = false, unify = false) {\n // const emoji = details.unified;\n // const emoji = (details.unified as string).split('-')\n // .reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n\n let kek: DocumentFragment;\n if(unify && !IS_EMOJI_SUPPORTED) {\n kek = wrapSingleEmoji(emoji);\n } else {\n emoji = fixEmoji(emoji);\n kek = wrapEmojiText(emoji);\n }\n\n /* if(!kek.includes('emoji')) {\n console.log(emoji, kek, spanEmoji, emoji.length, new TextEncoder().encode(emoji), emojiUnicode(emoji));\n return;\n } */\n\n // console.log(kek);\n\n spanEmoji.append(kek);\n\n if(spanEmoji.children.length > 1) {\n const first = spanEmoji.firstElementChild;\n spanEmoji.innerHTML = '';\n spanEmoji.append(first);\n }\n\n if(spanEmoji.firstElementChild?.tagName === 'IMG') {\n const image = spanEmoji.firstElementChild as HTMLImageElement;\n\n const url = image.src;\n if(!loadedURLs.has(url)) {\n image.setAttribute('loading', 'lazy');\n const placeholder = document.createElement('span');\n placeholder.classList.add('emoji-placeholder');\n\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '0';\n placeholder.style.opacity = '1';\n }\n\n image.addEventListener('load', () => {\n fastRaf(() => {\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '';\n placeholder.style.opacity = '';\n }\n\n spanEmoji.classList.remove('empty');\n\n loadedURLs.add(url);\n });\n }, {once: true});\n\n spanEmoji.append(placeholder);\n }\n }\n\n // spanEmoji = spanEmoji.firstElementChild as HTMLSpanElement;\n // spanEmoji.setAttribute('emoji', emoji);\n if(container) {\n if(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n }\n\n return spanEmoji;\n}\n\nexport function getEmojiFromElement(element: HTMLElement): {docId?: DocId, emoji: string} {\n const superEmoji = findUpClassName(element, 'super-emoji');\n if(!superEmoji) return;\n\n const firstElementChild = superEmoji.firstElementChild as HTMLElement;\n if(firstElementChild && firstElementChild.classList.contains('custom-emoji')) {\n return {emoji: firstElementChild.dataset.stickerEmoji, docId: firstElementChild.dataset.docId} as const;\n } else {\n if(element.nodeType === element.TEXT_NODE) return {emoji: element.nodeValue};\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n\n return {emoji: element.getAttribute('alt') || element.innerText} as const;\n }\n}\n\nconst EMOJI_RECENT_ID: (typeof EMOJI_CATEGORIES)[0][0] = 'Emoji.Recent';\nconst EMOJI_RECENT_CATEGORY: (typeof EMOJI_CATEGORIES)[0] = [EMOJI_RECENT_ID, 'recent'];\nconst CUSTOM_EMOJI_RECENT_ID: (typeof EMOJI_CATEGORIES)[0][0] = '';\nconst CUSTOM_EMOJI_RECENT_CATEGORY: (typeof EMOJI_CATEGORIES)[0] = [CUSTOM_EMOJI_RECENT_ID, ''];\nconst EMOJI_CATEGORIES: [LangPackKey | '', string][] = [\n ['Emoji.SmilesAndPeople', 'smile'],\n ['Emoji.AnimalsAndNature', 'animals'],\n ['Emoji.FoodAndDrink', 'eats'],\n ['Emoji.TravelAndPlaces', 'car'],\n ['Emoji.ActivityAndSport', 'sport'],\n ['Emoji.Objects', 'lamp'],\n // ['Emoji.Symbols', 'info'],\n ['Emoji.Flags', 'flag'],\n ['Skin Tones' as any, '']\n];\n\nlet sorted: Map<(typeof EMOJI_CATEGORIES)[0], string[]>;\nfunction prepare() {\n if(sorted) {\n return sorted;\n }\n\n const a: Array<[(typeof EMOJI_CATEGORIES)[0], string[]]> = [\n [CUSTOM_EMOJI_RECENT_CATEGORY, []],\n [EMOJI_RECENT_CATEGORY, []]\n ];\n\n sorted = new Map(a);\n for(const emoji in Emoji) {\n const details = Emoji[emoji];\n const i = '' + details;\n const category = EMOJI_CATEGORIES[+i[0] - 1];\n if(!category) continue; // maybe it's skin tones\n\n let s = sorted.get(category);\n if(!s) {\n s = [];\n sorted.set(category, s);\n }\n\n s[+i.slice(1) || 0] = emoji;\n }\n\n sorted.delete(EMOJI_CATEGORIES.pop());\n EMOJI_CATEGORIES.unshift(CUSTOM_EMOJI_RECENT_CATEGORY, EMOJI_RECENT_CATEGORY);\n const order = EMOJI_CATEGORIES.map(([id]) => id);\n const entries = [...sorted.entries()].sort((a, b) => order.indexOf(a[0][0]) - order.indexOf(b[0][0]));\n sorted = new Map(entries);\n\n return sorted;\n}\n\nconst EMOJI_ELEMENT_SIZE = makeMediaSize(42, 42);\nconst RECENT_MAX_LENGTH = 32;\n\ntype EmojiTabItem = {element: HTMLElement} & ReturnType;\ntype EmojiTabCategory = StickersTabCategory;\nexport default class EmojiTab extends EmoticonsTabC {\n private closeScrollTop: number;\n private menuInnerScroll: ScrollableX;\n private isStandalone?: boolean;\n private noRegularEmoji?: boolean;\n private stickerSetId?: Parameters[0];\n private onClick: (emoji: EmojiTabItem) => void;\n private activeEmoji: ReturnType;\n private activeElements: EmojiTabItem[];\n\n constructor(options: {\n managers: AppManagers,\n isStandalone?: boolean,\n noRegularEmoji?: boolean,\n stickerSetId?: EmojiTab['stickerSetId'],\n onClick?: EmojiTab['onClick']\n }) {\n super(\n options.managers,\n 'super-emojis',\n () => EMOJI_ELEMENT_SIZE,\n 16,\n 4,\n 0\n );\n\n safeAssign(this, options);\n this.container.classList.add('emoji-padding');\n this.content.id = 'content-emoji';\n this.activeElements = [];\n }\n\n private onCategoryVisibility = ({target, visible}: Pick) => {\n const category = this.categoriesMap.get(target);\n // console.log(target, visible, category);\n // if(category.local) return;\n\n const renderer = category.elements.renderer;\n const newChildren: HTMLElement[] = [];\n if(renderer) {\n newChildren.push(renderer);\n const customEmojis: Parameters[0] = new Map();\n if(visible) {\n newChildren.push(...category.items.map(({docId, element}) => {\n if(!docId) {\n return element;\n }\n\n // return element;\n\n // if(element.firstElementChild) {\n // return element;\n // }\n\n const customEmojiElement = element.firstElementChild as CustomEmojiElement;\n customEmojiElement.clear(false);\n // const customEmojiElement = CustomEmojiElement.create(document.id);\n customEmojis.set(customEmojiElement.docId, new Set([customEmojiElement]));\n // element.append(customEmojiElement);\n return element;\n }));\n\n renderer.add(customEmojis/* , EmoticonsDropdown.lazyLoadQueue */, undefined, undefined, false);\n } else {\n renderer.clearCanvas();\n renderer.middlewareHelper.clean();\n }\n } else if(visible) {\n newChildren.push(...category.items.map(({element}) => element));\n }\n\n // if(visible)\n category.elements.items.replaceChildren(...newChildren);\n\n if(renderer && !visible) {\n const customEmojis: Parameters[0] = new Map();\n category.items.forEach(({docId, element}) => {\n if(!docId) {\n return;\n }\n\n const customEmojiElement = element.firstElementChild as CustomEmojiElement;\n customEmojiElement.clear();\n customEmojis.set(customEmojiElement.docId, new Set([customEmojiElement]));\n });\n\n /* const promise = */renderer.add(customEmojis/* , EmoticonsDropdown.lazyLoadQueue */, undefined, true);\n // promise.then(() => {\n // customEmojis.forEach((elements) => {\n // elements.forEach((element) => {\n // if(!element.innerHTML) {\n // console.log('no thumb', element);\n // // debugger;\n // }\n // });\n // });\n\n // const set = customEmojis.get('5766933926429854499');\n // console.log(`wrapped ${customEmojis.size} thumbs`, set && set.values().next().value.innerHTML);\n // });\n }\n\n // if(!visible) {\n // const customEmojis: Parameters[0] = {};\n // category.items.forEach((item) => {\n // const {element, document} = item;\n // if(!element.firstElementChild) {\n // return;\n // }\n\n // const customEmojiElement = CustomEmojiElement.create(document.id);\n // customEmojis[customEmojiElement.docId] = new Set([customEmojiElement]);\n // element.firstElementChild.replaceWith(customEmojiElement);\n // });\n\n // renderer.add(customEmojis, EmoticonsDropdown.lazyLoadQueue);\n // }\n };\n\n public destroy() {\n super.destroy();\n this.menuInnerScroll?.destroy();\n }\n\n public init() {\n super.init();\n this.init = undefined;\n\n const intersectionOptions: IntersectionObserverInit = {\n root: this.isStandalone ? this.content : emoticonsDropdown.getElement()\n };\n\n this.categoriesIntersector = new VisibilityIntersector(this.onCategoryVisibility, intersectionOptions);\n\n this.menuOnClickResult = EmoticonsDropdown.menuOnClick(this, this.menu, this.scrollable, this.menuScroll, undefined, this.listenerSetter);\n\n const preloader = putPreloader(this.content, true);\n\n let innerScrollWrapper: HTMLElement;\n\n if(!this.isStandalone) {\n const x = this.menuInnerScroll = new ScrollableX(undefined);\n x.container.classList.add('menu-horizontal-inner-scroll');\n\n innerScrollWrapper = document.createElement('div');\n innerScrollWrapper.classList.add('menu-horizontal-inner');\n innerScrollWrapper.append(x.container);\n }\n\n let preparedMap: ReturnType;\n prepare();\n if(!this.noRegularEmoji) {\n preparedMap = prepare();\n } else {\n preparedMap = new Map([\n [[CUSTOM_EMOJI_RECENT_CATEGORY[0], 'recent'], []]\n // [EMOJI_RECENT_CATEGORY, []]\n ]);\n }\n\n preparedMap.forEach((emojis, [titleLangPackKey, icon]) => {\n const category = this.createLocalCategory(titleLangPackKey, titleLangPackKey, icon, !icon);\n category.elements.container.classList.remove('hide');\n category.elements.items.classList.add(icon && !this.isStandalone ? 'is-local' : 'not-local');\n\n emojis.forEach((unified) => {\n /* if(emojiUnicode(emoji) === '1f481-200d-2642') {\n console.log('append emoji', emoji, emojiUnicode(emoji));\n } */\n\n const emoji = emojiFromCodePoints(unified);\n // if(emoji.includes('🕵')) {\n // console.log('toCodePoints', toCodePoints(emoji));\n // emoji = emoji.replace(/(\\u200d[\\u2640\\u2642\\u2695])(?!\\ufe0f)/, '\\ufe0f$1');\n // const zwjIndex = emoji.indexOf('\\u200d');\n // if(zwjIndex !== -1 && !emoji.includes('\\ufe0f')) {\n // /* if(zwjIndex !== (emoji.length - 1)) {\n // emoji = emoji.replace(/(\\u200d)/g, '\\ufe0f$1');\n // } */\n\n // emoji += '\\ufe0f';\n // //emoji += '\\ufe0f';\n // }\n\n // debugger;\n // }\n\n this.addEmojiToCategory({\n category,\n emoji: {emoji},\n batch: true\n });\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n });\n\n const promise = Promise.all([\n this.isStandalone ? undefined : pause(200),\n !this.noRegularEmoji && this.managers.appEmojiManager.getRecentEmojis('native'),\n !this.isStandalone && this.managers.appEmojiManager.getRecentEmojis('custom'),\n this.stickerSetId && this.managers.appStickersManager.getLocalStickerSet(this.stickerSetId),\n this.managers.appEmojiManager.getCustomEmojis()\n ]).then(([_, recent, recentCustom, mainSet, sets]) => {\n preloader.remove();\n\n if(mainSet) {\n recentCustom = mainSet.documents.map((doc) => doc.id);\n }\n\n const recentCategory = this.categories[EMOJI_RECENT_ID];\n const recentCustomCategory = this.categories[CUSTOM_EMOJI_RECENT_ID];\n\n if(!this.isStandalone) {\n const a = [\n recentCategory && [recentCategory, recent] as const,\n recentCustomCategory && [recentCustomCategory, recentCustom] as const\n ];\n\n a.filter(Boolean).forEach(([category, recent]) => {\n category.limit = RECENT_MAX_LENGTH;\n recent.splice(RECENT_MAX_LENGTH, recent.length - RECENT_MAX_LENGTH);\n });\n }\n\n if(recentCategory && recent) for(const emoji of recent) {\n this.addEmojiToCategory({\n category: recentCategory,\n emoji: {emoji},\n batch: true\n });\n }\n\n if(recentCustomCategory) {\n this.createRendererForCategory(recentCustomCategory);\n if(recentCustom) for(const docId of recentCustom) {\n this.addEmojiToCategory({\n category: recentCustomCategory,\n emoji: {emoji: '', docId},\n batch: true\n });\n }\n recentCustomCategory.elements.container.style.paddingTop = '.5rem';\n }\n\n EMOJI_CATEGORIES.forEach(([id]) => {\n const category = this.categories[id];\n if(!category) {\n return;\n }\n\n this.toggleLocalCategory(category, true);\n\n if(id !== EMOJI_RECENT_ID && id !== CUSTOM_EMOJI_RECENT_ID) {\n category.menuScroll = this.menuInnerScroll;\n this.menuInnerScroll.container.append(category.elements.menuTab);\n }\n });\n\n this.resizeCategories();\n\n recentCategory && innerScrollWrapper && recentCategory.elements.menuTab.after(innerScrollWrapper);\n\n sets.sets.forEach((set) => {\n this.renderStickerSet(set);\n });\n\n this.listenerSetter.add(rootScope)('premium_toggle', () => {\n this.toggleCustomCategory();\n });\n\n this.listenerSetter.add(rootScope)('stickers_top', this.postponedEvent((id) => {\n const category = this.categories[id];\n if(!category) {\n return;\n }\n\n this.positionCategory(category, true);\n\n this.listenerSetter.add(emoticonsDropdown)('openAfterLayout', () => {\n this.menuOnClickResult.setActiveStatic(category);\n }, {once: true});\n }));\n\n const toggleRenderers = (ignore: boolean) => {\n for(const id in this.categories) {\n const category = this.categories[id];\n const renderer = category.elements.renderer;\n if(renderer) {\n renderer.ignoreSettingDimensions = ignore;\n if(!ignore) {\n renderer.setDimensionsFromRect(undefined, true);\n }\n }\n }\n };\n\n !this.isStandalone && this.listenerSetter.add(emoticonsDropdown)('opened', () => {\n toggleRenderers(false);\n });\n\n !this.isStandalone && this.listenerSetter.add(emoticonsDropdown)('close', () => {\n toggleRenderers(true);\n });\n\n this.listenerSetter.add(rootScope)('stickers_installed', (set) => {\n if(!this.categories[set.id] && set.pFlags.emojis) {\n this.renderStickerSet(set, true);\n }\n });\n\n this.listenerSetter.add(rootScope)('stickers_deleted', (set) => {\n const category = this.categories[set.id];\n if(this.deleteCategory(category)) {\n const {renderer} = category.elements;\n if(renderer) {\n renderer.middlewareHelper.clean();\n }\n }\n });\n\n !this.isStandalone && this.listenerSetter.add(rootScope)('emoji_recent', this.postponedEvent((emoji) => {\n const category = this.categories[emoji.docId ? CUSTOM_EMOJI_RECENT_ID : EMOJI_RECENT_ID];\n if(!category) {\n return;\n }\n\n const verify: (item: EmojiTabItem) => boolean = emoji.docId ?\n (item) => item.docId === emoji.docId :\n (item) => item.emoji === emoji.emoji;\n const found = findAndSplice(category.items, verify);\n if(found) {\n category.items.unshift(found);\n if(this.isCategoryVisible(category)) {\n const {renderer} = category.elements;\n positionElementByIndex(found.element, category.elements.items, renderer ? 1 : 0, -1);\n renderer?.forceRender();\n }\n } else {\n this.addEmojiToCategory({\n category,\n emoji,\n batch: false,\n prepend: true\n });\n }\n\n if(this.closeScrollTop === 0) {\n this.menuOnClickResult.setActive(emoji.docId ? this.categories[EMOJI_RECENT_ID] : category);\n }\n }));\n\n !this.isStandalone && this.listenerSetter.add(appImManager)('peer_changed', () => {\n this.toggleCustomCategory();\n });\n\n this.toggleCustomCategory();\n\n this.menuOnClickResult.setActive(recentCategory ?? recentCustomCategory);\n });\n\n attachClickEvent(this.content, this.onContentClick, {listenerSetter: this.listenerSetter});\n attachStickerViewerListeners({listenTo: this.content, listenerSetter: this.listenerSetter});\n\n return promise;\n }\n\n private renderStickerSet(set: StickerSet.stickerSet, prepend?: boolean) {\n const category = this.createCategory(set, wrapEmojiText(set.title));\n this.positionCategory(category, prepend);\n const {container, menuTabPadding} = category.elements;\n category.elements.items.classList.add('not-local');\n category.elements.container.classList.add('is-premium-set');\n category.elements.title.classList.add('tgico');\n\n this.createRendererForCategory(category);\n\n const promise = this.managers.appStickersManager.getStickerSet(set);\n promise.then(({documents}) => {\n documents.forEach((document) => {\n this.addEmojiToCategory({\n category,\n emoji: {docId: document.id, emoji: (document as Document.document).stickerEmojiRaw},\n batch: true\n });\n });\n\n // if(this.isCategoryVisible(category)) {\n // category.elements.items.append(...category.items.map(({element}) => element));\n // }\n\n this.onCategoryVisibility({target: category.elements.container, visible: this.isCategoryVisible(category)});\n\n category.setCategoryItemsHeight();\n container.classList.remove('hide');\n });\n\n wrapStickerSetThumb({\n set,\n container: menuTabPadding,\n group: EMOTICONSSTICKERGROUP,\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n width: 32,\n height: 32,\n autoplay: false\n });\n }\n\n private get peerId() {\n return appImManager.chat.peerId;\n }\n\n public getCustomCategory() {\n return this.categories[CUSTOM_EMOJI_RECENT_ID];\n }\n\n private toggleCustomCategory() {\n const category = this.categories[CUSTOM_EMOJI_RECENT_ID];\n const hasPremium = rootScope.premium || this.peerId === rootScope.myId;\n const canSeeCustomCategory = hasPremium || this.isStandalone;\n super.toggleLocalCategory(category, !!category.items.length && canSeeCustomCategory);\n this.content.classList.toggle('has-premium', hasPremium);\n }\n\n protected toggleLocalCategory(category: EmojiTabCategory, visible: boolean) {\n if(category.id === CUSTOM_EMOJI_RECENT_ID) {\n this.toggleCustomCategory();\n return;\n }\n\n super.toggleLocalCategory(category, visible);\n }\n\n private createRendererForCategory(category: EmojiTabCategory) {\n const renderer = CustomEmojiRendererElement.create({\n animationGroup: EMOTICONSSTICKERGROUP,\n customEmojiSize: mediaSizes.active.esgCustomEmoji\n });\n\n category.elements.renderer = renderer;\n category.elements.items.append(renderer);\n }\n\n public addEmojiToCategory(options: {\n category: EmojiTabCategory,\n emoji?: ReturnType,\n element?: HTMLElement,\n batch?: boolean,\n prepend?: boolean,\n active?: boolean\n }) {\n const {category, emoji, batch, prepend} = options;\n let element = options.element;\n if(element) {\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n spanEmoji.append(element);\n element = spanEmoji;\n } else if(emoji.docId) {\n const customEmojiElement = CustomEmojiElement.create(emoji.docId);\n const span = document.createElement('span');\n span.classList.add(/* 'emoji', */'super-emoji');\n span.append(customEmojiElement);\n element = span;\n } else {\n element = appendEmoji(emoji.emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, undefined, false/* , false */);\n }\n\n const item: typeof category['items'][0] = {\n ...(emoji || {emoji: undefined}),\n element\n };\n\n if(\n options.active || (\n this.activeEmoji && (\n item.docId ?\n this.activeEmoji.docId === item.docId :\n this.activeEmoji.emoji === item.emoji\n )\n )\n ) {\n this.activeEmoji === emoji;\n this.activeElements.push(item);\n element.classList.add('active');\n }\n\n category.items[prepend ? 'unshift' : 'push'](item);\n if(!batch && !this.spliceExceed(category)) {\n this.onLocalCategoryUpdate(category);\n }\n }\n\n // private addEmojisToCategory(category: EmojiTabCategory, emojis: string[], prepend?: boolean) {\n // emojis.forEach((emoji) => {\n // this.addEmojiToCategory(category, emoji, true, prepend);\n // });\n\n // this.onLocalCategoryUpdate(category);\n // }\n\n private onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n\n const {target} = e;\n\n const container = findUpClassName(target, 'emoji-category');\n const category = this.categoriesMap.get(container);\n if(findUpClassName(target, 'category-title')) {\n if(category.local) {\n return;\n }\n\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}, true).show();\n return;\n }\n\n const emoji = getEmojiFromElement(target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n if(\n emoji.docId &&\n !rootScope.premium && (\n this.isStandalone ? category.id !== CUSTOM_EMOJI_RECENT_ID : this.peerId !== rootScope.myId\n )\n ) {\n const a = document.createElement('a');\n a.onclick = () => {\n appImManager.openPremiumBot();\n hideToast();\n };\n toastNew({\n langPackKey: 'CustomEmoji.PremiumAlert',\n langPackArguments: [a]\n });\n return;\n }\n\n if(this.onClick) {\n this.onClick({\n ...emoji,\n element: findUpClassName(target, 'super-emoji').firstElementChild as HTMLElement\n });\n } else {\n appImManager.chat.input.onEmojiSelected(emoji, false);\n }\n\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\n };\n\n public setActive(emoji: ReturnType) {\n if(\n emoji === this.activeEmoji ||\n emoji?.docId ? emoji.docId === this.activeEmoji?.docId : emoji?.emoji === this.activeEmoji?.emoji\n ) {\n return;\n }\n\n this.activeEmoji = emoji;\n\n this.activeElements.forEach((item) => {\n item.element.classList.remove('active');\n });\n\n this.activeElements.length = 0;\n\n this.categoriesMap.forEach((category) => {\n category.items.forEach((item) => {\n if(emoji.docId ? item.docId === emoji.docId : item.emoji === emoji.emoji) {\n item.element.classList.add('active');\n this.activeElements.push(item);\n }\n });\n });\n }\n\n public onClose() {\n this.closeScrollTop = this.scrollable.scrollTop;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getEmojiEntityFromEmoji from './getEmojiEntityFromEmoji';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapSingleEmoji(emoji: string) {\n return wrapRichText(emoji, {\n entities: [getEmojiEntityFromEmoji(emoji)]\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport VisibilityIntersector, {OnVisibilityChange} from './visibilityIntersector';\n\nexport default class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\n private elementsMap: Map = new Map();\n\n constructor(\n parallelLimit?: number,\n protected onVisibilityChange?: OnVisibilityChange,\n options?: IntersectionObserverInit\n ) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((item) => {\n const {target, visible} = item;\n\n const queueItem = this.elementsMap.get(target);\n queueItem.visible = visible;\n\n if(visible) {\n queueItem.wasSeen = true;\n if(!this.queue.includes(queueItem)) {\n this.queue.push(queueItem);\n }\n } else {\n indexOfAndSplice(this.queue, queueItem);\n }\n\n this.onVisibilityChange?.(item);\n this.setProcessQueueTimeout();\n }, options);\n }\n\n public clear() {\n super.clear();\n this.elementsMap.clear();\n }\n\n /* public async processItem(item: LazyLoadElement) {\n //await super.processItem(item);\n await LazyLoadQueueBase.prototype.processItem.call(this, item);\n\n if(this.lazyLoadMedia.length) {\n this.processQueue();\n }\n } */\n\n public observe(el: LazyLoadElement) {\n this.elementsMap.set(el.div, el);\n super.observe(el);\n }\n\n public unobserve(el: LazyLoadElement) {\n this.elementsMap.delete(el.div);\n super.unobserve(el);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, {EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab} from '..';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport {Document, MessagesAllStickers, StickerSet} from '../../../layer';\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport LazyLoadQueueRepeat from '../../lazyLoadQueueRepeat';\nimport {putPreloader} from '../../putPreloader';\nimport PopupStickers from '../../popups/stickers';\nimport Scrollable, {ScrollableX} from '../../scrollable';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport noop from '../../../helpers/noop';\nimport ButtonIcon from '../../buttonIcon';\nimport confirmationPopup from '../../confirmationPopup';\nimport VisibilityIntersector, {OnVisibilityChangeItem} from '../../visibilityIntersector';\nimport createStickersContextMenu from '../../../helpers/dom/createStickersContextMenu';\nimport findUpAsChild from '../../../helpers/dom/findUpAsChild';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport wrapSticker from '../../wrappers/sticker';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport {MediaSize} from '../../../helpers/mediaSize';\nimport {AnyFunction} from '../../../types';\nimport {IgnoreMouseOutType} from '../../../helpers/dropdownHover';\n\nexport class SuperStickerRenderer {\n public lazyLoadQueue: LazyLoadQueueRepeat;\n private animated: Set = new Set();\n\n constructor(\n private regularLazyLoadQueue: LazyLoadQueue,\n private group: AnimationItemGroup,\n private managers: AppManagers,\n private options?: IntersectionObserverInit\n ) {\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, ({target, visible}) => {\n if(!visible) {\n this.processInvisible(target);\n }\n }, options);\n }\n\n public clear() {\n this.lazyLoadQueue.clear();\n }\n\n public renderSticker(doc: MyDocument, element?: HTMLElement, loadPromises?: Promise[]) {\n if(!element) {\n element = document.createElement('div');\n element.classList.add('grid-item', 'super-sticker');\n element.dataset.docId = '' + doc.id;\n\n if(doc.animated) {\n this.observeAnimated(element);\n }\n }\n\n // * This will wrap only a thumb\n /* !doc.animated && */wrapSticker({\n doc,\n div: element,\n lazyLoadQueue: this.regularLazyLoadQueue,\n group: this.group,\n onlyThumb: doc.animated,\n loadPromises\n });\n\n return element;\n }\n\n public observeAnimated(element: HTMLElement) {\n this.animated.add(element);\n this.lazyLoadQueue.observe({\n div: element,\n load: this.processVisible\n });\n }\n\n public unobserveAnimated(element: HTMLElement) {\n this.animated.delete(element);\n this.lazyLoadQueue.delete({div: element});\n }\n\n private checkAnimationContainer = (element: HTMLElement, visible: boolean) => {\n // console.error('checkAnimationContainer', div, visible);\n const players = animationIntersector.getAnimations(element);\n players.forEach((player) => {\n if(!visible) {\n animationIntersector.removeAnimation(player);\n } else {\n animationIntersector.checkAnimation(player, false);\n }\n });\n };\n\n private processVisible = async(element: HTMLElement) => {\n const docId = element.dataset.docId;\n const doc = await this.managers.appDocsManager.getDoc(docId);\n\n const size = mediaSizes.active.esgSticker.width;\n\n // console.log('processVisibleDiv:', element);\n\n const promise = wrapSticker({\n doc,\n div: element,\n width: size,\n height: size,\n lazyLoadQueue: null,\n group: this.group,\n onlyThumb: false,\n play: true,\n loop: true,\n withLock: true\n }).then(({render}) => render);\n\n promise.then(() => {\n // clearTimeout(timeout);\n this.checkAnimationContainer(element, this.lazyLoadQueue.intersector.isVisible(element));\n });\n\n /* let timeout = window.setTimeout(() => {\n console.error('processVisibleDiv timeout', div, doc);\n }, 1e3); */\n\n return promise;\n };\n\n public processInvisible = async(element: HTMLElement) => {\n const docId = element.dataset.docId;\n const doc = await this.managers.appDocsManager.getDoc(docId);\n\n // console.log('STICKER INvisible:', /* div, */docId);\n\n this.checkAnimationContainer(element, false);\n\n element.textContent = '';\n this.renderSticker(doc, element as HTMLDivElement);\n };\n}\n\nexport type StickersTabCategoryItem = {element: HTMLElement};\n\nexport class StickersTabCategory = {}> {\n public elements: {\n container: HTMLElement,\n title: HTMLElement,\n items: HTMLElement,\n menuTab: HTMLElement,\n menuTabPadding: HTMLElement\n } & AdditionalElements;\n public items: Item[];\n public mounted: boolean;\n public id: string;\n public limit: number;\n\n public getContainerSize: () => {width: number, height: number};\n private getElementMediaSize: () => MediaSize;\n\n private gapX: number;\n private gapY: number;\n\n public set?: StickerSet;\n public local?: boolean;\n public menuScroll?: ScrollableX;\n\n constructor(options: {\n id: string,\n title: HTMLElement | DocumentFragment,\n overflowElement: HTMLElement,\n getContainerSize: StickersTabCategory['getContainerSize'],\n getElementMediaSize: StickersTabCategory['getElementMediaSize'],\n gapX: number,\n gapY: number,\n noMenuTab?: boolean\n }) {\n const container = document.createElement('div');\n container.classList.add('emoji-category');\n\n const items = document.createElement('div');\n items.classList.add('category-items');\n\n let title: HTMLElement;\n if(options.title) {\n title = document.createElement('div');\n title.classList.add('category-title');\n title.append(options.title);\n }\n\n let menuTab: HTMLElement, menuTabPadding: HTMLElement;\n if(!options.noMenuTab) {\n menuTab = ButtonIcon(undefined, {noRipple: true});\n menuTab.classList.add('menu-horizontal-div-item');\n\n menuTabPadding = document.createElement('div');\n menuTabPadding.classList.add('menu-horizontal-div-item-padding');\n\n menuTab.append(menuTabPadding);\n }\n\n if(title) container.append(title);\n container.append(items);\n\n this.elements = {\n container,\n title,\n items,\n menuTab,\n menuTabPadding\n } as any;\n this.id = options.id;\n this.items = [];\n\n this.getContainerSize = options.getContainerSize;\n this.getElementMediaSize = options.getElementMediaSize;\n this.gapX = options.gapX ?? 0;\n this.gapY = options.gapY ?? 0;\n }\n\n public setCategoryItemsHeight() {\n const {width: containerWidth} = this.getContainerSize();\n const elementSize = this.getElementMediaSize().width;\n\n let itemsPerRow = containerWidth / elementSize;\n if(this.gapX) itemsPerRow -= Math.floor(itemsPerRow - 1) * this.gapX / elementSize;\n itemsPerRow = Math.floor(itemsPerRow);\n\n const rows = Math.ceil(this.items.length / itemsPerRow);\n let height = rows * elementSize;\n if(this.gapY) height += (rows - 1) * this.gapY;\n\n this.elements.items.style.minHeight = height + 'px';\n }\n}\n\nexport class EmoticonsTabC> implements EmoticonsTab {\n public content: HTMLElement;\n public menuScroll: ScrollableX;\n public container: HTMLElement;\n public menuWrapper: HTMLElement;\n public menu: HTMLElement;\n\n protected categories: {[id: string]: Category};\n protected categoriesMap: Map;\n protected categoriesByMenuTabMap: Map;\n protected categoriesIntersector: VisibilityIntersector;\n protected localCategories: Category[];\n\n protected listenerSetter: ListenerSetter;\n\n public scrollable: Scrollable;\n protected mounted = false;\n protected menuOnClickResult: ReturnType;\n\n public tabId: number;\n\n protected postponedEvents: {cb: AnyFunction, args: any[]}[];\n\n public getContainerSize: Category['getContainerSize'];\n\n constructor(\n protected managers: AppManagers,\n protected categoryItemsClassName: string,\n protected getElementMediaSize: () => MediaSize,\n protected padding: number,\n protected gapX: number,\n protected gapY: number\n ) {\n this.categories = {};\n this.categoriesMap = new Map();\n this.categoriesByMenuTabMap = new Map();\n this.localCategories = [];\n this.postponedEvents = [];\n\n this.listenerSetter = new ListenerSetter();\n\n this.container = document.createElement('div');\n this.container.classList.add('tabs-tab', 'emoticons-container');\n\n this.menuWrapper = document.createElement('div');\n this.menuWrapper.classList.add('menu-wrapper', 'emoticons-menu-wrapper');\n\n this.menu = document.createElement('nav');\n this.menu.className = 'menu-horizontal-div no-stripe justify-start emoticons-menu';\n\n this.menuWrapper.append(this.menu);\n this.menuScroll = new ScrollableX(this.menuWrapper);\n\n this.content = document.createElement('div');\n this.content.classList.add('emoticons-content');\n\n this.container.append(this.menuWrapper, this.content);\n\n this.scrollable = new Scrollable(this.content, 'STICKERS');\n }\n\n public getCategoryByContainer(container: HTMLElement) {\n return this.categoriesMap.get(container);\n }\n\n public getCategoryByMenuTab(menuTab: HTMLElement) {\n return this.categoriesByMenuTabMap.get(menuTab);\n }\n\n protected createCategory(stickerSet: StickerSet, title: HTMLElement | DocumentFragment, isLocal?: boolean, noMenuTab?: boolean) {\n const category: Category = new StickersTabCategory({\n id: '' + stickerSet.id,\n title,\n overflowElement: this.content,\n getContainerSize: () => {\n const {width, height} = this.getContainerSize?.() ?? this.content.getBoundingClientRect();\n return {width: width - this.padding, height};\n },\n getElementMediaSize: this.getElementMediaSize,\n gapX: this.gapX,\n gapY: this.gapY,\n noMenuTab\n }) as any;\n\n if(this.categoryItemsClassName) {\n category.elements.items.classList.add(this.categoryItemsClassName);\n }\n\n const container = category.elements.container;\n container.classList.add('hide');\n\n category.set = stickerSet;\n this.categories[stickerSet.id] = category;\n this.categoriesMap.set(container, category);\n !noMenuTab && this.categoriesByMenuTabMap.set(category.elements.menuTab, category);\n\n this.categoriesIntersector.observe(container);\n !noMenuTab && this.menuOnClickResult.stickyIntersector.observeStickyHeaderChanges(container);\n\n if(!isLocal) {\n !noMenuTab && category.elements.menuTab.classList.add('not-local');\n }\n\n return category;\n }\n\n protected positionCategory(category: Category, prepend?: boolean) {\n const {menuTab, container} = category.elements;\n const posItems = prepend ? this.localCategories.filter((category) => category.mounted).length : 0xFFFF;\n let foundMenuScroll = false;\n const posMenu = prepend ? this.localCategories.filter((category) => {\n if(category.menuScroll && !foundMenuScroll) {\n foundMenuScroll = true;\n return true;\n }\n\n return category.mounted && !category.menuScroll && category.elements.menuTab;\n }).length : 0xFFFF;\n positionElementByIndex(container, this.scrollable.container, posItems);\n positionElementByIndex(menuTab, this.menu, posMenu);\n }\n\n protected isCategoryVisible(category: Category) {\n return this.categoriesIntersector.getVisible().includes(category.elements.container);\n }\n\n protected toggleLocalCategory(category: Category, visible: boolean) {\n if(!visible) {\n category.elements.menuTab?.remove();\n category.elements.container.remove();\n } else {\n const idx = this.localCategories.indexOf(category);\n const sliced = this.localCategories.slice(0, idx);\n let notMountedItems = 0, notMountedMenus = 0;\n sliced.forEach((category) => {\n if(!category.mounted) {\n ++notMountedItems;\n ++notMountedMenus;\n } else if(!category.elements.menuTab || category.menuScroll) {\n ++notMountedMenus;\n }\n });\n const itemsIdx = idx - notMountedItems, menuIdx = idx - notMountedMenus;\n category.elements.menuTab && positionElementByIndex(category.elements.menuTab, this.menu, menuIdx);\n positionElementByIndex(category.elements.container, this.scrollable.container, itemsIdx);\n }\n\n category.mounted = visible;\n // category.elements.container.classList.toggle('hide', !visible);\n }\n\n protected createLocalCategory(id: string, title: LangPackKey | '', icon?: string, noMenuTab?: boolean) {\n const category = this.createCategory({id} as any, title && i18n(title), true, noMenuTab);\n category.local = true;\n this.localCategories.push(category);\n if(category.elements.title) {\n category.elements.title.classList.add('disable-hover');\n }\n\n if(!noMenuTab) {\n if(icon) {\n category.elements.menuTab.classList.add('tgico', 'tgico-' + icon);\n }\n\n category.elements.menuTabPadding.remove();\n }\n\n this.toggleLocalCategory(category, false);\n return category;\n }\n\n protected onLocalCategoryUpdate(category: Category) {\n category.setCategoryItemsHeight();\n this.toggleLocalCategory(category, !!category.items.length);\n }\n\n protected resizeCategories = () => {\n for(const [container, category] of this.categoriesMap) {\n category.setCategoryItemsHeight();\n }\n };\n\n protected deleteCategory(category: Category) {\n if(category) {\n category.elements.container.remove();\n category.elements.menuTab.remove();\n this.categoriesIntersector.unobserve(category.elements.container);\n delete this.categories[category.id];\n this.categoriesMap.delete(category.elements.container);\n this.categoriesByMenuTabMap.delete(category.elements.menuTab);\n\n return true;\n }\n\n return false;\n }\n\n protected spliceExceed(category: Category) {\n if(category.limit === undefined) {\n return false;\n }\n\n const {items, limit} = category;\n items.splice(limit, items.length - limit).forEach(({element}) => {\n element.remove();\n });\n\n this.onLocalCategoryUpdate(category);\n\n return true;\n }\n\n public init() {\n this.listenerSetter.add(emoticonsDropdown)('closed', () => {\n this.postponedEvents.forEach(({cb, args}) => {\n cb(...args);\n });\n\n this.postponedEvents.length = 0;\n });\n }\n\n public destroy() {\n this.getContainerSize = undefined;\n this.postponedEvents.length = 0;\n this.categoriesIntersector?.disconnect();\n this.listenerSetter.removeAll();\n this.scrollable.destroy();\n this.menuScroll?.destroy();\n this.menuOnClickResult?.stickyIntersector?.disconnect();\n }\n\n protected postponedEvent = (cb: (...args: K[]) => void) => {\n return (...args: K[]) => {\n if(emoticonsDropdown.isActive()) {\n this.postponedEvents.push({cb, args});\n } else {\n cb(...args);\n }\n };\n };\n}\n\ntype StickersTabItem = {element: HTMLElement, document: Document.document};\nexport default class StickersTab extends EmoticonsTabC> {\n private superStickerRenderer: SuperStickerRenderer;\n\n constructor(managers: AppManagers) {\n super(\n managers,\n 'super-stickers',\n () => mediaSizes.active.esgSticker,\n 3 * 2,\n 4,\n 4\n );\n\n this.container.classList.add('stickers-padding');\n this.content.id = 'content-stickers';\n }\n\n private setFavedLimit(limit: number) {\n const category = this.categories['faved'];\n category.limit = limit;\n }\n\n private categoryAppendStickers(\n category: StickersTabCategory,\n promise: Promise\n ) {\n const {container} = category.elements;\n\n promise.then((documents) => {\n const isVisible = this.isCategoryVisible(category);\n\n documents.forEach((document) => {\n const element = this.superStickerRenderer.renderSticker(document);\n category.items.push({document, element});\n\n if(isVisible) {\n category.elements.items.append(element);\n }\n });\n\n category.setCategoryItemsHeight();\n container.classList.remove('hide');\n });\n }\n\n private async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\n const category = this.createCategory(set, wrapEmojiText(set.title));\n const {menuTabPadding} = category.elements;\n\n const promise = this.managers.appStickersManager.getStickerSet(set);\n this.categoryAppendStickers(\n category,\n promise.then((stickerSet) => stickerSet.documents as MyDocument[])\n );\n\n this.positionCategory(category, prepend);\n\n wrapStickerSetThumb({\n set,\n container: menuTabPadding,\n group: EMOTICONSSTICKERGROUP,\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n width: 32,\n height: 32,\n autoplay: false\n });\n }\n\n private onCategoryVisibility = ({target, visible, entry}: OnVisibilityChangeItem) => {\n const category = this.categoriesMap.get(target);\n category.elements.items.replaceChildren(...(!visible ? [] : category.items.map(({element}) => element)));\n };\n\n public init() {\n super.init();\n\n this.scrollable.onAdditionalScroll = () => {\n this.setTyping();\n };\n\n /* stickersDiv.addEventListener('mouseover', (e) => {\n let target = e.target as HTMLElement;\n\n if(target.tagName === 'CANVAS') { // turn on sticker\n let animation = lottieLoader.getAnimation(target.parentElement, EMOTICONSSTICKERGROUP);\n\n if(animation) {\n // @ts-ignore\n if(animation.currentFrame === animation.totalFrames - 1) {\n animation.goToAndPlay(0, true);\n } else {\n animation.play();\n }\n }\n }\n }); */\n\n const intersectionOptions: IntersectionObserverInit = {root: emoticonsDropdown.getElement()};\n this.categoriesIntersector = new VisibilityIntersector(this.onCategoryVisibility, intersectionOptions);\n\n const clearCategoryItems = (category: StickersTabCategory) => {\n category.elements.items.replaceChildren();\n category.items.forEach(({element}) => this.superStickerRenderer.unobserveAnimated(element));\n category.items.length = 0;\n };\n\n this.scrollable.container.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n if(findUpClassName(target, 'category-title')) {\n const container = findUpClassName(target, 'emoji-category');\n const category = this.categoriesMap.get(container);\n if(category.local) {\n return;\n }\n\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}).show();\n return;\n }\n\n EmoticonsDropdown.onMediaClick(e);\n });\n\n this.menuOnClickResult = EmoticonsDropdown.menuOnClick(this, this.menu, this.scrollable, this.menuScroll);\n\n const preloader = putPreloader(this.content, true);\n\n const onCategoryStickers = (category: StickersTabCategory, stickers: MyDocument[]) => {\n // if(category.id === 'faved' && category.limit && category.limit < stickers.length) {\n // category.limit = stickers.length;\n // }\n\n if(category.limit) {\n stickers = stickers.slice(0, category.limit);\n }\n\n const ids = new Set(stickers.map((doc) => doc.id));\n forEachReverse(category.items, (item) => {\n if(!ids.has(item.document.id)) {\n this.deleteSticker(category, item.document, true);\n }\n });\n\n this.toggleLocalCategory(category, !!stickers.length);\n forEachReverse(stickers, (doc, idx) => {\n this.unshiftSticker(category, doc, true, idx);\n });\n this.spliceExceed(category);\n category.elements.container.classList.remove('hide');\n };\n\n const favedCategory = this.createLocalCategory('faved', 'FavoriteStickers', 'savedmessages');\n // favedCategory.elements.menuTab.classList.add('active');\n\n const recentCategory = this.createLocalCategory('recent', 'Stickers.Recent', 'recent');\n recentCategory.limit = 20;\n\n const clearButton = ButtonIcon('close', {noRipple: true});\n recentCategory.elements.title.append(clearButton);\n attachClickEvent(clearButton, () => {\n confirmationPopup({\n titleLangKey: 'ClearRecentStickersAlertTitle',\n descriptionLangKey: 'ClearRecentStickersAlertMessage',\n button: {\n langKey: 'Clear'\n }\n }).then(() => {\n this.managers.appStickersManager.clearRecentStickers();\n }, noop);\n });\n\n const premiumCategory = this.createLocalCategory('premium', 'PremiumStickersShort');\n const s = document.createElement('span');\n s.classList.add('tgico-star', 'color-premium');\n premiumCategory.elements.menuTab.append(s);\n\n const promises = [\n Promise.all([\n this.managers.apiManager.getLimit('favedStickers'),\n this.managers.appStickersManager.getFavedStickersStickers()\n ]).then(([limit, stickers]) => {\n this.setFavedLimit(limit);\n onCategoryStickers(favedCategory, stickers);\n }),\n\n this.managers.appStickersManager.getRecentStickersStickers().then((stickers) => {\n onCategoryStickers(recentCategory, stickers);\n }),\n\n this.managers.appStickersManager.getAllStickers().then((res) => {\n for(const set of (res as MessagesAllStickers.messagesAllStickers).sets) {\n this.renderStickerSet(set);\n }\n }),\n\n this.managers.appStickersManager.getPremiumStickers().then((stickers) => {\n const length = stickers.length;\n this.toggleLocalCategory(premiumCategory, rootScope.premium && !!length);\n this.categoryAppendStickers(premiumCategory, Promise.resolve(stickers));\n\n rootScope.addEventListener('premium_toggle', (isPremium) => {\n this.toggleLocalCategory(this.categories['premium'], isPremium && !!length);\n });\n })\n ];\n\n Promise.race(promises).finally(() => {\n preloader.remove();\n });\n\n Promise.all(promises).finally(() => {\n this.mounted = true;\n this.setTyping();\n\n const favedCategory = this.categories['faved'];\n const recentCategory = this.categories['recent'];\n this.menuOnClickResult.setActive(favedCategory.items.length ? favedCategory : recentCategory);\n\n rootScope.addEventListener('stickers_installed', (set) => {\n if(!this.categories[set.id]) {\n this.renderStickerSet(set, true);\n }\n });\n });\n\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP, this.managers, intersectionOptions);\n\n const rendererLazyLoadQueue = this.superStickerRenderer.lazyLoadQueue;\n emoticonsDropdown.addLazyLoadQueueRepeat(rendererLazyLoadQueue, this.superStickerRenderer.processInvisible);\n\n // emoticonsDropdown.addEventListener('close', () => {\n // this.categoriesIntersector.lock();\n // });\n\n // emoticonsDropdown.addEventListener('closed', () => {\n // for(const [container] of this.categoriesMap) {\n // onCategoryVisibility(container, false);\n // }\n // });\n\n // emoticonsDropdown.addEventListener('opened', () => {\n // this.categoriesIntersector.unlockAndRefresh();\n // });\n\n // setInterval(() => {\n // // @ts-ignore\n // const players = Object.values(lottieLoader.players).filter((p) => p.width >= 80);\n\n // console.log(\n // 'STICKERS RENDERED IN PANEL:',\n // players.length,\n // players.filter((p) => !p.paused).length,\n // rendererLazyLoadQueue.intersector.getVisible().length\n // );\n // }, .25e3);\n\n rootScope.addEventListener('sticker_updated', ({type, document, faved}) => {\n // if(type === 'faved') {\n // return;\n // }\n\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\n if(category) {\n if(faved) {\n this.unshiftSticker(category, document);\n } else {\n this.deleteSticker(category, document);\n }\n }\n });\n\n rootScope.addEventListener('stickers_deleted', ({id}) => {\n const category = this.categories[id];\n if(this.deleteCategory(category)) {\n clearCategoryItems(category);\n }\n });\n\n rootScope.addEventListener('stickers_top', this.postponedEvent((id) => {\n const category = this.categories[id];\n if(category) {\n this.positionCategory(category, true);\n emoticonsDropdown.addEventListener('openAfterLayout', () => {\n this.menuOnClickResult.setActiveStatic(category);\n }, {once: true});\n }\n }));\n\n rootScope.addEventListener('stickers_updated', ({type, stickers}) => {\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\n if(category) {\n onCategoryStickers(category, stickers);\n }\n });\n\n rootScope.addEventListener('app_config', () => {\n this.managers.apiManager.getLimit('favedStickers').then((limit) => {\n this.setFavedLimit(limit);\n });\n });\n\n mediaSizes.addEventListener('resize', this.resizeCategories);\n\n attachStickerViewerListeners({listenTo: this.content, listenerSetter: new ListenerSetter()});\n\n const type: IgnoreMouseOutType = 'menu';\n createStickersContextMenu({\n listenTo: this.content,\n verifyRecent: (target) => !!findUpAsChild(target, this.categories['recent'].elements.items),\n onOpen: () => {\n emoticonsDropdown.setIgnoreMouseOut(type, true);\n },\n onClose: () => {\n emoticonsDropdown.setIgnoreMouseOut(type, false);\n }\n });\n\n this.init = null;\n }\n\n public deleteSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean) {\n const item = findAndSplice(category.items, (item) => item.document.id === doc.id);\n if(item) {\n item.element.remove();\n\n if(!batch) {\n this.onLocalCategoryUpdate(category);\n }\n }\n }\n\n public unshiftSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean, idx?: number) {\n if(idx !== undefined) {\n const i = category.items[idx];\n if(i && i.document.id === doc.id) {\n return;\n }\n }\n\n let item = findAndSplice(category.items, (item) => item.document.id === doc.id);\n if(!item) {\n item = {\n element: this.superStickerRenderer.renderSticker(doc),\n document: doc\n };\n }\n\n category.items.unshift(item);\n category.elements.items.prepend(item.element);\n\n if(!batch) {\n this.spliceExceed(category);\n }\n }\n\n public unshiftRecentSticker(doc: MyDocument) {\n this.managers.appStickersManager.saveRecentSticker(doc.id);\n }\n\n public deleteRecentSticker(doc: MyDocument) {\n this.managers.appStickersManager.saveRecentSticker(doc.id, true);\n }\n\n public setTyping = (cancel = false) => {\n if(!cancel && (!emoticonsDropdown.isActive() || emoticonsDropdown.tab !== this)) {\n return;\n }\n\n rootScope.dispatchEvent('choosing_sticker', !cancel);\n };\n\n public onClosed() {\n this.setTyping(true);\n }\n\n public onOpened() {\n this.setTyping();\n this.resizeCategories();\n }\n}\n","export const generateDelimiter = () => {\n const delimiter = document.createElement('div');\n delimiter.classList.add('gradient-delimiter');\n return delimiter;\n};\n","import {_i18n} from '../lib/langPack';\n\nexport default function generateFakeIcon(isScam?: boolean) {\n const span = document.createElement('span');\n span.classList.add('badge-fake');\n _i18n(span, isScam ? 'ScamMessage' : 'FakeMessage');\n return span;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport VisibilityIntersector, {OnVisibilityChange} from './visibilityIntersector';\n\nexport default class LazyLoadQueueRepeat2 extends LazyLoadQueueIntersector {\n constructor(parallelLimit?: number, protected onVisibilityChange?: OnVisibilityChange) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((item) => {\n const {target, visible} = item;\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\n if(visible && spliced.length) {\n spliced.forEach((item) => {\n this.queue.unshift(item);\n });\n }\n\n this.onVisibilityChange && this.onVisibilityChange(item);\n this.setProcessQueueTimeout();\n });\n }\n\n public observe(el: LazyLoadElement) {\n super.observe(el);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport animationIntersector, {AnimationItemGroup} from './animationIntersector';\nimport Scrollable from './scrollable';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport calcImageInBox from '../helpers/calcImageInBox';\nimport {doubleRaf} from '../helpers/schedulers';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport rootScope from '../lib/rootScope';\nimport LazyLoadQueueRepeat2 from './lazyLoadQueueRepeat2';\nimport wrapVideo from './wrappers/video';\nimport noop from '../helpers/noop';\n\nconst width = 400;\nconst maxSingleWidth = width - 100;\nconst height = 100;\n\nexport default class GifsMasonry {\n public lazyLoadQueue: LazyLoadQueueRepeat2;\n private scrollPromise: CancellablePromise = Promise.resolve();\n private timeout: number = 0;\n private managers: AppManagers;\n\n constructor(\n private element: HTMLElement,\n private group: AnimationItemGroup,\n private scrollable: Scrollable,\n attach = true\n ) {\n this.managers = rootScope.managers;\n\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, ({target, visible}) => {\n if(visible) {\n this.processVisibleDiv(target);\n } else {\n this.processInvisibleDiv(target);\n }\n });\n\n /* setInterval(() => {\n // @ts-ignore\n const players = animationIntersector.byGroups[group];\n\n if(players) {\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter((p) => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\n }\n }, .25e3); */\n\n if(attach) {\n this.attach();\n }\n }\n\n private onScroll = () => {\n if(this.timeout) {\n clearTimeout(this.timeout);\n } else {\n this.scrollPromise = deferredPromise();\n // animationIntersector.checkAnimations(true, group);\n }\n\n this.timeout = window.setTimeout(() => {\n this.timeout = 0;\n this.scrollPromise.resolve();\n // animationIntersector.checkAnimations(false, group);\n }, 150);\n };\n\n public attach() {\n this.scrollable.container.addEventListener('scroll', this.onScroll);\n }\n\n public detach() {\n this.clear();\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\n }\n\n public clear() {\n this.lazyLoadQueue.clear();\n }\n\n private processVisibleDiv(div: HTMLElement) {\n const video = div.querySelector('video');\n if(video) {\n return;\n }\n\n const load = () => {\n const docId = div.dataset.docId;\n const promise = Promise.all([this.managers.appDocsManager.getDoc(docId), this.scrollPromise]).then(async([doc]) => {\n const res = await wrapVideo({\n doc,\n container: div as HTMLDivElement,\n lazyLoadQueue: null,\n // lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n group: this.group,\n noInfo: true,\n noPreview: true\n });\n\n const promise = res.loadPromise;\n promise.finally(() => {\n const video = div.querySelector('video');\n const thumb = div.querySelector('img, canvas');\n\n // div.style.opacity = '';\n thumb && thumb.classList.add('hide');\n\n if(video && !video.parentElement) {\n setTimeout(() => {\n video.src = '';\n video.load();\n const animations = animationIntersector.getAnimations(video);\n animations.forEach((item) => {\n animationIntersector.removeAnimation(item);\n });\n }, 0);\n }\n\n // clearTimeout(timeout);\n if(!this.lazyLoadQueue.intersector.isVisible(div)) {\n this.processInvisibleDiv(div);\n }\n });\n\n return promise;\n });\n\n /* let timeout = window.setTimeout(() => {\n console.error('processVisibleDiv timeout', div, doc);\n }, 1e3); */\n\n return promise;\n };\n\n // return load();\n\n this.lazyLoadQueue.push({div, load});\n }\n\n public processInvisibleDiv = (div: HTMLElement) => {\n return this.scrollPromise.then(async() => {\n // return;\n\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\n return;\n }\n\n const video = div.querySelector('video');\n const thumb = div.querySelector('img, canvas');\n\n if(thumb) {\n thumb.classList.remove('hide');\n\n await doubleRaf();\n }\n\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\n return;\n }\n\n if(video) {\n video.remove();\n video.src = '';\n video.load();\n const animations = animationIntersector.getAnimations(video);\n animations.forEach((item) => {\n animationIntersector.removeAnimation(item);\n });\n }\n });\n };\n\n public add(doc: MyDocument, appendTo = this.element) {\n // let gifWidth = doc.w;\n // let gifHeight = doc.h;\n // if(gifHeight < height) {\n // gifWidth = height / gifHeight * gifWidth;\n // gifHeight = height;\n // }\n\n // const willUseWidth = Math.min(maxSingleWidth, width, gifWidth);\n // const size = calcImageInBox(gifWidth, gifHeight, willUseWidth, height);\n\n const div = document.createElement('div');\n div.classList.add('gif', 'grid-item'/* , 'fade-in-transition' */);\n // div.style.width = size.width + 'px';\n // div.style.opacity = '0';\n // div.style.height = h + 'px';\n div.dataset.docId = '' + doc.id;\n\n appendTo.append(div);\n\n this.lazyLoadQueue.observe({div, load: noop as any});\n\n // let preloader = new ProgressivePreloader(div);\n\n wrapVideo({\n doc,\n container: div as HTMLDivElement,\n lazyLoadQueue: null,\n noInfo: true,\n onlyPreview: true\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport TransitionSlider from './transition';\nimport {ScrollableX} from './scrollable';\nimport rootScope from '../lib/rootScope';\nimport {fastRaf} from '../helpers/schedulers';\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport whichChild from '../helpers/dom/whichChild';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\n\nexport function horizontalMenu(\n tabs: HTMLElement,\n content: HTMLElement,\n onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean | Promise,\n onTransitionEnd?: () => void,\n transitionTime = 200,\n scrollableX?: ScrollableX,\n listenerSetter?: ListenerSetter\n) {\n const selectTab = TransitionSlider({\n content,\n type: tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation',\n transitionTime,\n onTransitionEnd,\n listenerSetter\n });\n\n if(!tabs) {\n return selectTab;\n }\n\n const proxy = new Proxy(selectTab, {\n apply: (target, that, args) => {\n const id = +args[0];\n const animate = args[1] !== undefined ? args[1] : true;\n\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\n selectTarget(el, id, animate);\n }\n });\n\n const selectTarget = async(target: HTMLElement, id: number, animate = true) => {\n const tabContent = content.children[id] as HTMLDivElement;\n\n if(onClick) {\n const result1 = onClick(id, tabContent, animate);\n const canChange = result1 instanceof Promise ? await result1 : result1;\n if(canChange !== undefined && !canChange) {\n return;\n }\n }\n\n if(scrollableX) {\n scrollableX.scrollIntoViewNew({\n element: target.parentElement.children[id] as HTMLElement,\n position: 'center',\n forceDirection: animate ? undefined : FocusDirection.Static,\n forceDuration: transitionTime,\n axis: 'x'\n });\n }\n\n if(!rootScope.settings.animationsEnabled) {\n animate = false;\n }\n\n const prevId = selectTab.prevId();\n if(target.classList.contains('active') || id === prevId) {\n return false;\n }\n\n const mutateCallback = animate ? fastRaf : (cb: () => void) => cb();\n\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\n if(prev) {\n mutateCallback(() => {\n prev.classList.remove('active');\n });\n }\n\n // a great stripe from Jolly Cobra\n if(useStripe && prevId !== -1 && animate) {\n mutateCallback(() => {\n const indicator = target.querySelector('i')!;\n const currentIndicator = target.parentElement.children[prevId].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.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\n\n // console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\n\n fastRaf(() => {\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\n mutateCallback(() => {\n target.classList.add('active');\n });\n\n selectTab(id, animate);\n };\n\n const useStripe = !tabs.classList.contains('no-stripe');\n\n // const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\n const tagName = tabs.firstElementChild.tagName;\n attachClickEvent(tabs, (e) => {\n let target = e.target as HTMLElement;\n\n target = findUpAsChild(target, tabs);\n\n // console.log('tabs click:', target);\n\n if(!target) return false;\n\n let id: number;\n if(target.dataset.tab) {\n id = +target.dataset.tab;\n if(id === -1) {\n return false;\n }\n } else {\n id = whichChild(target);\n }\n\n selectTarget(target, id);\n }, {listenerSetter});\n\n return proxy;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport simulateEvent from '../helpers/dom/dispatchEvent';\nimport documentFragmentToHTML from '../helpers/dom/documentFragmentToHTML';\nimport findUpAttribute from '../helpers/dom/findUpAttribute';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport getCaretPosNew from '../helpers/dom/getCaretPosNew';\nimport getRichValueWithCaret from '../helpers/dom/getRichValueWithCaret';\nimport isInputEmpty from '../helpers/dom/isInputEmpty';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport RichInputHandler, {USING_BOMS} from '../helpers/dom/richInputHandler';\nimport selectElementContents from '../helpers/dom/selectElementContents';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport {MessageEntity} from '../layer';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport mergeEntities from '../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../lib/richTextProcessor/parseEntities';\nimport wrapDraftText from '../lib/richTextProcessor/wrapDraftText';\nimport {createCustomFiller, CustomEmojiElement, CustomEmojiRendererElement, insertCustomFillers, renderEmojis} from '../lib/richTextProcessor/wrapRichText';\n\nexport async function insertRichTextAsHTML(input: HTMLElement, text: string, entities: MessageEntity[], wrappingForPeerId: PeerId) {\n const loadPromises: Promise[] = [];\n const wrappingCustomEmoji = entities?.some((entity) => entity._ === 'messageEntityCustomEmoji');\n const renderer = wrappingCustomEmoji ? createCustomEmojiRendererForInput() : undefined;\n const fragment = wrapDraftText(text, {entities, wrappingForPeerId, loadPromises, customEmojiRenderer: renderer});\n const something = fragment.querySelectorAll('[contenteditable=\"false\"]');\n something.forEach((el) => {\n el.contentEditable = 'inherit';\n el.classList.add('pc');\n });\n\n loadPromises.length && await Promise.all(loadPromises);\n\n fragment.querySelectorAll('.input-selectable').forEach((el) => {\n el.prepend(createCustomFiller(true));\n });\n\n const richInputHandler = USING_BOMS ? RichInputHandler.getInstance() : undefined;\n // const restore = richInputHandler.prepareApplyingMarkdown();\n\n // fragment.querySelectorAll('.input-filler').forEach((el) => el.remove());\n\n // const fillers = Array.from(input.querySelectorAll('.input-filler')).map((el) => {\n // el.contentEditable = 'false';\n // return el;\n // });\n\n const customEmojiElements = Array.from(fragment.querySelectorAll('.custom-emoji-placeholder')).map((el) => {\n el.dataset.ces = '1';\n return (el as any).customEmojiElement as CustomEmojiElement;\n });\n\n const html = documentFragmentToHTML(fragment);\n renderer?.destroy();\n\n // console.log(html);\n\n const pre = getCaretPosNew(input);\n // console.log('pre', pre);\n let textNode: ChildNode, textNodeValue: string;\n if(pre.node) {\n // if(pre.node?.nodeValue === BOM && false) {\n // textNode = document.createTextNode(textNodeValue = BOM);\n // (pre.node.parentNode as any as ChildNode).after(textNode);\n // pre.selection.modify('extend', 'forward', 'character');\n // pre.selection.collapseToEnd();\n // }\n } else {\n const range = document.createRange();\n let node = input.lastChild;\n if(!node) {\n input.append(node /* = textNode */ = document.createTextNode(''));\n }\n\n range.setStartAfter(node);\n range.collapse(true);\n pre.selection.removeAllRanges();\n pre.selection.addRange(range);\n }\n\n // const fragmentLastChild = fragment.lastChild;\n\n // const s = document.createElement('span');\n // (node as ChildNode).replaceWith(s);\n // s.append(node);\n input.addEventListener('input', cancelEvent, {capture: true, once: true});\n richInputHandler?.onBeforeInput({inputType: 'insertContent'});\n window.document.execCommand('insertHTML', false, html);\n Array.from(input.querySelectorAll('[data-ces]')).forEach((el, idx) => {\n delete el.dataset.ces;\n const customEmojiElement = customEmojiElements[idx];\n (el as any).customEmojiElement = customEmojiElement;\n customEmojiElement.placeholder = el;\n });\n // fillers.forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n input.querySelectorAll('.pc').forEach((el) => {\n el.contentEditable = 'false';\n });\n if(textNode) {\n const {nodeValue} = textNode;\n if(nodeValue === textNodeValue) {\n textNode.remove();\n } else {\n (textNode as CharacterData).replaceData(nodeValue.indexOf(textNodeValue), textNodeValue.length, '');\n }\n }\n // restore();\n richInputHandler?.removeExtraBOMs(input);\n simulateEvent(input, 'input');\n\n // if(textNode) {\n // const selection = document.getSelection();\n // const node = fragmentLastChild.nextSibling || fragmentLastChild;\n // const range = document.createRange();\n // range.setStartAfter(node);\n // range.collapse(true);\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }\n\n // const after = getCaretPosNew(input);\n // console.log('after', after);\n // if(after.node?.nodeValue === BOM) {\n // const smth = findUpClassName(after.node.parentElement, 'input-something');\n // if(smth) {\n // const selection = document.getSelection();\n // const node = smth.nextSibling;\n // const range = document.createRange();\n // range.setStartAfter(node);\n // range.collapse(true);\n // selection.removeAllRanges();\n // selection.addRange(range);\n\n // // if(after.offset === 0) after.selection.modify('extend', 'forward', 'character');\n // // after.selection.modify('extend', 'forward', 'character');\n // // after.selection.collapseToEnd();\n // }\n // }\n\n // setCaretAt(fragmentLastChild.nextSibling);\n\n // console.log('ASD');\n}\n\nlet init = () => {\n document.addEventListener('paste', (e) => {\n const input = findUpAttribute(e.target, 'contenteditable=\"true\"');\n if(!input) {\n return;\n }\n\n const noLinebreaks = !!input.dataset.noLinebreaks;\n e.preventDefault();\n let text: string, entities: MessageEntity[];\n\n // @ts-ignore\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\n let usePlainText = true;\n\n // @ts-ignore\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\n\n const filterEntity = (e: MessageEntity) => e._ === 'messageEntityEmoji' || (e._ === 'messageEntityLinebreak' && !noLinebreaks);\n if(noLinebreaks) {\n const regExp = /[\\r\\n]/g;\n plainText = plainText.replace(regExp, '');\n html = html.replace(regExp, '');\n }\n\n const peerId = (input.dataset.peerId || NULL_PEER_ID).toPeerId();\n if(html.trim()) {\n // console.log(html.replace(/ (style|class|id)=\".+?\"/g, ''));\n\n html = html.replace(//, '');\n html = html.replace(//, '');\n html = html.replace('
', '');\n\n const match = html.match(/([\\s\\S]*)<\\/body>/);\n if(match) {\n html = match[1].trim();\n }\n\n // const s = cleanHTML(html, true) as NodeList;\n // console.log(s);\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const span = doc.body || document.createElement('body');\n\n // const span: HTMLElement = document.createElement('span');\n // span.innerHTML = html;\n // span.append(...Array.from(s));\n\n let curChild = span.firstChild;\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\n const nextSibling = curChild.nextSibling;\n if(curChild.nodeType === curChild.TEXT_NODE) {\n if(!curChild.nodeValue.trim()) {\n curChild.remove();\n }\n }\n\n curChild = nextSibling;\n }\n\n const richValue = getRichValueWithCaret(span, true, false);\n\n const canWrapCustomEmojis = !!peerId;\n if(!canWrapCustomEmojis) {\n richValue.entities = richValue.entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\n }\n\n { // * fix extra new lines appearing from

(can have them from some sources, like macOS Terminal)\n const lines = richValue.value.split('\\n');\n let textLength = 0;\n for(let i = 0; i < lines.length; ++i) {\n const line = lines[i];\n textLength += line.length;\n const index = textLength;\n if(plainText[index] !== '\\n' && i !== (lines.length - 1)) {\n lines[i] = line + lines.splice(i + 1, 1)[0];\n }\n textLength += 1;\n }\n\n const correctedText = lines.join('\\n');\n richValue.value = correctedText;\n }\n\n const richTextLength = richValue.value.replace(/\\s/g, '').length;\n const plainTextLength = plainText.replace(/\\s/g, '').length;\n if(richTextLength === plainTextLength ||\n richValue.entities.find((entity) => entity._ === 'messageEntityCustomEmoji')) {\n text = richValue.value;\n entities = richValue.entities;\n usePlainText = false;\n\n let entities2 = parseEntities(text);\n entities2 = entities2.filter(filterEntity);\n mergeEntities(entities, entities2);\n }\n }\n\n if(usePlainText) {\n text = plainText;\n entities = parseEntities(text);\n entities = entities.filter(filterEntity);\n }\n\n insertRichTextAsHTML(input, text, entities, peerId);\n });\n\n init = null;\n};\n\n// ! it doesn't respect symbols other than strongs\n/* const checkAndSetRTL = (input: HTMLElement) => {\n //const isEmpty = isInputEmpty(input);\n //console.log('input', isEmpty);\n\n //const char = [...getRichValue(input)][0];\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\n let direction = 'ltr';\n if(char && checkRTL(char)) {\n direction = 'rtl';\n }\n\n //console.log('RTL', direction, char);\n\n input.style.direction = direction;\n}; */\n\nexport enum InputState {\n Neutral = 0,\n Valid = 1,\n Error = 2\n};\n\nexport type InputFieldOptions = {\n placeholder?: LangPackKey,\n label?: LangPackKey,\n labelOptions?: any[],\n labelText?: string | DocumentFragment,\n name?: string,\n maxLength?: number,\n showLengthOn?: number,\n plainText?: true,\n required?: boolean,\n canBeEdited?: boolean,\n validate?: () => boolean,\n inputMode?: 'tel' | 'numeric',\n withLinebreaks?: boolean,\n autocomplete?: string\n};\n\nfunction createCustomEmojiRendererForInput() {\n const renderer = CustomEmojiRendererElement.create({\n wrappingDraft: true,\n isSelectable: true\n });\n return renderer;\n}\n\nfunction processCustomEmojisInInput(input: HTMLElement) {\n const customEmojiElements = Array.from(input.querySelectorAll('.custom-emoji, .custom-emoji-placeholder'));\n let renderer = input.querySelector('.custom-emoji-renderer');\n if(!renderer && customEmojiElements.length) {\n renderer = createCustomEmojiRendererForInput();\n input.prepend(renderer);\n } else if(renderer && !customEmojiElements.length) {\n renderer.remove();\n return;\n }\n\n if(!renderer) {\n return;\n }\n\n const customEmojis: Parameters[0] = new Map();\n customEmojiElements.forEach((element) => {\n const customEmojiElement = element instanceof CustomEmojiElement ? element : (element as any).customEmojiElement as CustomEmojiElement;\n const {docId} = customEmojiElement;\n let set = customEmojis.get(docId);\n if(!set) {\n customEmojis.set(docId, set = new Set());\n }\n\n set.add(customEmojiElement);\n });\n\n for(const [docId, customEmojiElements] of customEmojis) {\n let hasSet = renderer.customEmojis.get(docId);\n if(hasSet) {\n for(const customEmojiElement of hasSet) {\n if(!customEmojiElements.has(customEmojiElement)) {\n customEmojiElement.destroy();\n }\n }\n } else {\n hasSet = new Set();\n }\n\n for(const customEmojiElement of customEmojiElements) {\n if(!hasSet.has(customEmojiElement)) {\n customEmojiElement.connectedCallback();\n }\n }\n }\n\n renderer.add(customEmojis, false);\n renderer.forceRender();\n}\n\nexport default class InputField {\n public container: HTMLElement;\n public input: HTMLElement;\n public label: HTMLLabelElement;\n\n public originalValue: string;\n\n public required: boolean;\n public validate: () => boolean;\n\n constructor(public options: InputFieldOptions = {}) {\n this.container = document.createElement('div');\n this.container.classList.add('input-field');\n\n this.required = options.required;\n this.validate = options.validate;\n\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\n }\n\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true, autocomplete} = options;\n const label = options.label || options.labelText;\n\n const onInputCallbacks: Array<() => void> = [];\n let input: HTMLElement;\n if(!plainText) {\n if(init) {\n init();\n }\n\n this.container.innerHTML = `

`;\n\n input = this.container.firstElementChild as HTMLElement;\n input.contentEditable = '' + !!canBeEdited;\n // const observer = new MutationObserver(() => {\n // //checkAndSetRTL(input);\n\n // if(processInput) {\n // processInput();\n // }\n // });\n\n RichInputHandler.getInstance();\n\n input.addEventListener('mousedown', (e) => {\n const selection = document.getSelection();\n if(!selection.isCollapsed) {\n return;\n }\n\n const placeholder = findUpTag(e.target, 'IMG');\n if(!placeholder) {\n return;\n }\n\n const rect = placeholder.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const focusOnNext = e.clientX >= centerX;\n\n const range = document.createRange();\n range.setStartAfter(focusOnNext ? placeholder : placeholder.previousSibling ?? placeholder);\n selection.removeAllRanges();\n selection.addRange(range);\n });\n\n onInputCallbacks.push(() => {\n // console.log('input');\n // return;\n // * because if delete all characters there will br left\n if(isInputEmpty(input)) {\n // const textNode = Array.from(input.childNodes).find((node) => node.nodeType === node.TEXT_NODE) || document.createTextNode('');\n input.replaceChildren();\n // input.append(document.createTextNode('')); // need first text node to support history stack\n }\n\n // const fillers = Array.from(input.querySelectorAll('.emoji-filler')) as HTMLElement[];\n // fillers.forEach((filler) => {\n // const textContent = filler.textContent;\n // if(textContent === BOM) {\n // return;\n // }\n\n // if(textContent) {\n\n // } else {\n // let curChild = filler.firstChild;\n // while(curChild) {\n // curChild = curChild.nextSibling;\n // }\n // }\n\n // filler.classList.remove('emoji-filler');\n // });\n\n // Array.from(input.querySelectorAll('br, span:empty')).forEach((el) => {\n // const parentElement = el.parentElement;\n // (parentElement === input ? el : parentElement).remove();\n // });\n USING_BOMS && Array.from(input.querySelectorAll('br:not(.br-not-br)')).forEach((el) => {\n // const parentElement = el.parentElement;\n el.remove();\n // if(!parentElement.children.length && !parentElement.textContent) {\n // parentElement.textContent = '';\n // }\n });\n\n insertCustomFillers(Array.from(input.querySelectorAll('.input-something')));\n\n processCustomEmojisInInput(input);\n\n // .forEach((el) => el.remove());\n });\n\n // ! childList for paste first symbol\n // observer.observe(input, {characterData: true, childList: true, subtree: true});\n } else {\n this.container.innerHTML = `\n \n `;\n\n input = this.container.firstElementChild as HTMLElement;\n // input.addEventListener('input', () => checkAndSetRTL(input));\n }\n\n setDirection(input);\n\n if(options.inputMode) {\n input.inputMode = options.inputMode;\n }\n\n if(placeholder) {\n _i18n(input, placeholder, undefined, 'placeholder');\n }\n\n if(label || placeholder) {\n const border = document.createElement('div');\n border.classList.add('input-field-border');\n this.container.append(border);\n }\n\n if(label) {\n this.label = document.createElement('label');\n this.setLabel();\n this.container.append(this.label);\n }\n\n if(maxLength) {\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\n let showingLength = false;\n\n const onInput = () => {\n const wasError = input.classList.contains('error');\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValueWithCaret(input, false, false).value].length;\n const diff = maxLength - inputLength;\n const isError = diff < 0;\n input.classList.toggle('error', isError);\n\n // this.onLengthChange && this.onLengthChange(inputLength, isError);\n\n if(isError || diff <= showLengthOn) {\n this.setLabel();\n labelEl.append(` (${maxLength - inputLength})`);\n if(!showingLength) showingLength = true;\n } else if((wasError && !isError) || showingLength) {\n this.setLabel();\n showingLength = false;\n }\n };\n\n onInputCallbacks.push(onInput);\n }\n\n const noLinebreaks = !options.withLinebreaks;\n if(noLinebreaks && !plainText) {\n input.dataset.noLinebreaks = '1';\n input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n e.preventDefault();\n return false;\n }\n });\n }\n\n if(onInputCallbacks.length) {\n input.addEventListener('input', () => {\n onInputCallbacks.forEach((callback) => callback());\n });\n }\n\n this.input = input;\n }\n\n public select() {\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\n return;\n }\n\n if(this.options.plainText) {\n (this.input as HTMLInputElement).select(); // * select text\n } else {\n selectElementContents(this.input);\n }\n }\n\n public setLabel() {\n this.label.textContent = '';\n if(this.options.labelText) {\n setInnerHTML(this.label, this.options.labelText);\n } else {\n this.label.append(i18n(this.options.label, this.options.labelOptions));\n }\n }\n\n get value(): string {\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValueWithCaret(this.input, false, false).value;\n // return getRichValue(this.input);\n }\n\n set value(value: Parameters[1]) {\n this.setValueSilently(value, true);\n this.simulateInputEvent();\n }\n\n public simulateInputEvent() {\n simulateEvent(this.input, 'input');\n }\n\n public setValueSilently(value: Parameters[1], fromSet?: boolean) {\n if(this.options.plainText) {\n (this.input as HTMLInputElement).value = value as string;\n } else {\n replaceContent(this.input, value);\n processCustomEmojisInInput(this.input);\n }\n }\n\n public isChanged() {\n return this.value !== this.originalValue;\n }\n\n public isValid() {\n return !this.input.classList.contains('error') &&\n (!this.validate || this.validate()) &&\n (!this.required || !isInputEmpty(this.input));\n }\n\n public isValidToChange() {\n return this.isValid() && this.isChanged();\n }\n\n public setDraftValue(value = '', silent?: boolean) {\n if(!this.options.plainText) {\n value = documentFragmentToHTML(wrapDraftText(value));\n }\n\n if(silent) {\n this.setValueSilently(value, false);\n } else {\n this.value = value;\n }\n }\n\n public setOriginalValue(value: InputField['originalValue'] = '', silent?: boolean) {\n this.originalValue = value;\n this.setDraftValue(value, silent);\n }\n\n public setState(state: InputState, label?: LangPackKey) {\n if(label) {\n this.label.textContent = '';\n this.label.append(i18n(label, this.options.labelOptions));\n } else {\n this.setLabel();\n }\n\n this.input.classList.toggle('error', !!(state & InputState.Error));\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\n }\n\n public setError(label?: LangPackKey) {\n this.setState(InputState.Error, label);\n }\n}\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { getRichValue } from \"../helpers/dom\";\nimport {LangPackKey} from '../lib/langPack';\nimport InputField from './inputField';\n\nexport default class InputSearch {\n public container: HTMLElement;\n public input: HTMLElement;\n public inputField: InputField;\n public clearBtn: HTMLElement;\n\n public prevValue = '';\n public timeout = 0;\n public onChange: (value: string) => void;\n public onClear: () => void;\n\n constructor(placeholder: LangPackKey, onChange?: (value: string) => void) {\n this.inputField = new InputField({\n placeholder,\n plainText: true\n });\n\n this.container = this.inputField.container;\n this.container.classList.remove('input-field');\n this.container.classList.add('input-search');\n\n this.onChange = onChange;\n\n this.input = this.inputField.input;\n this.input.classList.add('input-search-input');\n\n const searchIcon = document.createElement('i');\n searchIcon.classList.add('tgico', 'tgico-search');\n\n this.clearBtn = document.createElement('i');\n this.clearBtn.classList.add('tgico', 'btn-icon', 'tgico-close');\n\n this.input.addEventListener('input', this.onInput);\n this.clearBtn.addEventListener('click', this.onClearClick);\n\n this.container.append(searchIcon, this.clearBtn);\n }\n\n onInput = () => {\n if(!this.onChange) return;\n\n const value = this.value;\n\n // this.input.classList.toggle('is-empty', !value.trim());\n\n if(value !== this.prevValue) {\n this.prevValue = value;\n clearTimeout(this.timeout);\n this.timeout = window.setTimeout(() => {\n this.onChange(value);\n }, 200);\n }\n };\n\n onClearClick = () => {\n this.value = '';\n this.onChange && this.onChange('');\n this.onClear && this.onClear();\n };\n\n get value() {\n return this.inputField.value;\n }\n\n set value(value: string) {\n this.prevValue = value;\n clearTimeout(this.timeout);\n this.inputField.value = value;\n }\n\n public remove() {\n clearTimeout(this.timeout);\n this.input.removeEventListener('input', this.onInput);\n this.clearBtn.removeEventListener('click', this.onClearClick);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport VisibilityIntersector, {OnVisibilityChangeItem} from './visibilityIntersector';\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\n\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\n constructor(parallelLimit?: number, ignoreHeavyAnimation?: boolean) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\n\n !ignoreHeavyAnimation && useHeavyAnimationCheck(() => {\n this.lock();\n }, () => {\n this.unlockAndRefresh();\n });\n }\n\n private onVisibilityChange = ({target, visible}: OnVisibilityChangeItem) => {\n // if(DEBUG) {\n // this.log('isIntersecting', target, visible);\n // }\n\n // if visible - will move to the end of visible arary\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach((item) => {\n if(visible) {\n item.wasSeen = true;\n }\n\n item.visible = visible;\n const index = this.queue.findIndex((item) => !item.visible);\n this.queue.splice(Math.max(0, index), 0, item);\n });\n\n this.setProcessQueueTimeout();\n };\n\n protected getItem() {\n return findAndSplice(this.queue, (item) => item.wasSeen);\n }\n\n public async processItem(item: LazyLoadElement) {\n await super.processItem(item);\n this.intersector.unobserve(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const inserted = super.addElement(method, el);\n\n if(!inserted) return false;\n\n this.observe(el);\n /* if(el.wasSeen) {\n this.processQueue(el);\n } else */\n el.wasSeen ??= false;\n\n return true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueBase, {LazyLoadElementBase} from './lazyLoadQueueBase';\nimport VisibilityIntersector from './visibilityIntersector';\n\nexport type LazyLoadElement = Omit & {\n load: (target?: HTMLElement) => Promise,\n div: HTMLElement\n wasSeen?: boolean,\n visible?: boolean\n};\n\nexport default class LazyLoadQueueIntersector extends LazyLoadQueueBase {\n protected queue: Array = [];\n protected inProcess: Set = new Set();\n\n public intersector: VisibilityIntersector;\n protected intersectorTimeout: number;\n\n constructor(parallelLimit?: number) {\n super(parallelLimit);\n }\n\n public lock() {\n super.lock();\n this.intersector.lock();\n }\n\n public unlock() {\n super.unlock();\n this.intersector.unlock();\n }\n\n public unlockAndRefresh() {\n super.unlock();\n this.intersector.unlockAndRefresh();\n }\n\n public clear() {\n super.clear();\n this.intersector.disconnect();\n }\n\n public refresh() {\n this.intersector.refresh();\n }\n\n protected loadItem(item: LazyLoadElement) {\n return item.load(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const item = this.queue.find((i) => i.div === el.div && i.load === el.load);\n if(item) {\n return false;\n } else {\n for(const item of this.inProcess) {\n if(item.div === el.div && item.load === el.load) {\n return false;\n }\n }\n }\n\n this.queue[method](el);\n return true;\n }\n\n protected setProcessQueueTimeout() {\n this.intersectorTimeout ??= window.setTimeout(() => {\n this.intersectorTimeout = undefined;\n this.processQueue();\n }, 0);\n }\n\n public push(el: LazyLoadElement) {\n super.push(el);\n }\n\n public unshift(el: LazyLoadElement) {\n super.unshift(el);\n }\n\n public delete(el: Omit) {\n findAndSpliceAll(this.queue, (i) => i.div === el.div);\n this.unobserve(el);\n }\n\n public observe(el: LazyLoadElement) {\n this.intersector.observe(el.div);\n }\n\n public unobserve(el: Omit) {\n this.intersector.unobserve(el.div);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GrabEvent} from '../helpers/dom/attachGrabListeners';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport RangeSelector from './rangeSelector';\n\nexport default class MediaProgressLine extends RangeSelector {\n protected filledLoad: HTMLDivElement;\n\n protected progressRAF = 0;\n\n protected media: HTMLMediaElement;\n protected streamable: boolean;\n\n constructor(media?: HTMLAudioElement | HTMLVideoElement, streamable?: boolean, withTransition?: boolean, useTransform?: boolean) {\n super({\n step: 1000 / 60 / 1000,\n min: 0,\n max: 1,\n withTransition,\n useTransform\n }, 0);\n\n if(media) {\n this.setMedia(media, streamable);\n }\n }\n\n public setMedia(media: HTMLMediaElement, streamable = false) {\n if(this.media) {\n this.removeListeners();\n }\n\n if(streamable && !this.filledLoad) {\n this.filledLoad = document.createElement('div');\n this.filledLoad.classList.add('progress-line__filled', 'progress-line__loaded');\n this.container.prepend(this.filledLoad);\n // this.setLoadProgress();\n } else if(this.filledLoad) {\n this.filledLoad.classList.toggle('hide', !streamable);\n }\n\n this.media = media;\n this.streamable = streamable;\n if(!media.paused || media.currentTime > 0) {\n this.onPlay();\n }\n\n let wasPlaying = false;\n this.setSeekMax();\n this.setListeners();\n this.setHandlers({\n onMouseDown: () => {\n wasPlaying = !this.media.paused;\n wasPlaying && this.media.pause();\n },\n\n onMouseUp: (e) => {\n // cancelEvent(e.event);\n wasPlaying && this.media.play();\n }\n });\n }\n\n protected onLoadedData = () => {\n this.max = this.media.duration;\n this.seek.setAttribute('max', '' + this.max);\n };\n\n protected onEnded = () => {\n this.setProgress();\n };\n\n protected onPlay = () => {\n const r = () => {\n this.setProgress();\n\n this.progressRAF = this.media.paused ? 0 : window.requestAnimationFrame(r);\n };\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n }\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n\n this.progressRAF = window.requestAnimationFrame(r);\n };\n\n protected onTimeUpdate = () => {\n if(this.media.paused) {\n this.setProgress();\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n }\n };\n\n protected onProgress = (e: Event) => {\n this.setLoadProgress();\n };\n\n protected scrub(e: GrabEvent) {\n const scrubTime = super.scrub(e);\n this.media.currentTime = scrubTime;\n return scrubTime;\n }\n\n protected setLoadProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const buf = this.media.buffered;\n const numRanges = buf.length;\n\n const currentTime = this.media.currentTime;\n let nearestStart = 0, end = 0;\n for(let i = 0; i < numRanges; ++i) {\n const start = buf.start(i);\n if(currentTime >= start && start >= nearestStart) {\n nearestStart = start;\n end = buf.end(i);\n }\n\n // console.log('onProgress range:', i, buf.start(i), buf.end(i), this.media);\n }\n\n // console.log('onProgress correct range:', nearestStart, end, this.media);\n\n const percents = this.media.duration ? end / this.media.duration : 0;\n this.filledLoad.style.width = (percents * 100) + '%';\n // this.filledLoad.style.transform = 'scaleX(' + percents + ')';\n }\n\n protected setSeekMax() {\n this.max = this.media.duration || 0;\n if(this.max > 0) {\n this.onLoadedData();\n } else {\n this.media.addEventListener('loadeddata', this.onLoadedData);\n }\n }\n\n public setProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const currentTime = this.media.currentTime;\n\n super.setProgress(currentTime);\n }\n\n public setListeners() {\n super.setListeners();\n this.media.addEventListener('ended', this.onEnded);\n this.media.addEventListener('play', this.onPlay);\n this.media.addEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.addEventListener('progress', this.onProgress);\n }\n\n public removeListeners() {\n super.removeListeners();\n\n if(this.media) {\n this.media.removeEventListener('loadeddata', this.onLoadedData);\n this.media.removeEventListener('ended', this.onEnded);\n this.media.removeEventListener('play', this.onPlay);\n this.media.removeEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.removeEventListener('progress', this.onProgress);\n }\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n this.progressRAF = 0;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {FontFamily, FontSize, FontWeight} from '../config/font';\nimport getTextWidth from '../helpers/canvas/getTextWidth';\nimport mediaSizes from '../helpers/mediaSizes';\nimport clamp from '../helpers/number/clamp';\nimport {fastRaf} from '../helpers/schedulers';\n\n// Thanks to https://stackoverflow.com/a/49349813\n\n/**\n * Attibute modifier to create middle ellipsis\n * When the attribute value is left blank the ellipsis will be in the middle\n * When positive the attribute value will be used as a percentage\n * When negative the attribute value will be used as character index counted from the end\n * @example\n *
A Javascript solution to middle ellipsis
\n *
A Javascript solution to middle ellipsis
\n *
A Javascript solution to middle ellipsis
\n */\nconst ellipsis = '…';\nconst map: Map = new Map();\n\nconst testQueue: Set = new Set();\nconst fontSize = '16px';\nlet pendingTest = false;\n\nfunction setTestQueue() {\n if(pendingTest) {\n return;\n }\n\n pendingTest = true;\n fastRaf(() => {\n pendingTest = false;\n testQueueElements();\n });\n}\n\nfunction testQueueElements() {\n testQueue.forEach(testElement);\n testQueue.clear();\n}\n\nwindow.addEventListener('resize', () => {\n for(const [key] of map) {\n testQueue.add(key);\n }\n\n setTestQueue();\n}, {capture: true, passive: true});\n\nfunction getElementWidth(element: HTMLElement) {\n const type = element.dataset.sizeType;\n if(type) {\n const mediaSize = mediaSizes.active;\n // @ts-ignore\n const size: MediaSize = mediaSize[type];\n return size.width;\n }\n\n return element.getBoundingClientRect().width;\n}\n\nfunction testElement(element: HTMLElement) {\n // const perf = performance.now();\n // do not recalculate variables a second time\n let mapped = map.get(element);\n const firstTime = !mapped;\n\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\n // console.log('[MEE] testElement got mapped', mapped);\n\n if(firstTime) {\n text = element.textContent;\n textLength = text.length;\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\n multiplier = from > 0 && from / 100;\n\n let fontSize = element.dataset.fontSize;\n if(fontSize && +fontSize) fontSize += 'px';\n // const perf = performance.now();\n font = `${element.dataset.fontWeight || FontWeight} ${fontSize || FontSize} ${FontFamily}`;\n /* const computedStyle = window.getComputedStyle(elm, null);\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\n // console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\n\n textWidth = getTextWidth(text, font);\n // const perf = performance.now();\n elementWidth = getElementWidth(element);\n // console.log('testMiddleEllipsis get offsetWidth:', performance.now() - perf, font);\n mapped = {text, textLength, from, multiplier, font, textWidth, elementWidth};\n map.set(element, mapped);\n\n // console.log('[MEE] testElement map set', element);\n }\n\n const newElementWidth = getElementWidth(element);\n const widthChanged = firstTime || elementWidth !== newElementWidth;\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\n\n if(widthChanged) {\n if(textWidth > elementWidth) {\n element.setAttribute('title', text);\n let smallerText = text;\n let smallerWidth = elementWidth;\n while(smallerText.length > 3) {\n const smallerTextLength = smallerText.length;\n const half = multiplier &&\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\n Math.max(smallerTextLength + from - 1, 1);\n const half1 = smallerText.substr(0, half).replace(/\\s*$/, '');\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/, '');\n smallerText = half1 + half2;\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\n if(smallerWidth < elementWidth) {\n element.textContent = half1 + ellipsis + half2;\n break;\n }\n }\n\n // * set new width after cutting text\n mapped.elementWidth = getElementWidth(element);\n // mapped.textWidth = smallerWidth;\n } else {\n element.removeAttribute('title');\n }\n }\n\n // console.log('testMiddleEllipsis for element:', elm, performance.now() - perf);\n}\n\nexport class MiddleEllipsisElement extends HTMLElement {\n connectedCallback() {\n // console.log('[MEE]: connectedCallback before', map.has(this), testQueue.has(this), map.size, this.textContent, map);\n\n map.set(this, null);\n if(this.dataset.sizeType) {\n testElement(this);\n } else {\n testQueue.add(this);\n setTestQueue();\n }\n // testElement(this);\n\n // console.log('[MEE]: connectedCallback after', map.has(this), map.size, testQueue.has(this), testQueue.size);\n }\n\n disconnectedCallback() {\n const deleted = map.delete(this);\n testQueue.delete(this);\n // console.log('[MEE]: disconnectedCallback', deleted, map.has(this), map.size, this.textContent, map);\n }\n}\n\ncustomElements.define('middle-ellipsis-element', MiddleEllipsisElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport lottieLoader, {LottieLoader} from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport PasswordInputField from '../passwordInputField';\n\nexport default class PasswordMonkey {\n public container: HTMLElement;\n public animation: RLottiePlayer;\n public needFrame = 0;\n protected loadPromise: ReturnType;\n\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size,\n noCache: true\n // }, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\n // return;\n this.animation = _animation;\n this.animation.addEventListener('enterFrame', currentFrame => {\n // console.log('enterFrame', currentFrame, this.needFrame);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n }\n });\n\n this.passwordInputField.helpers.onVisibilityClickAdditional = () => {\n if(this.passwordInputField.helpers.passwordVisible) {\n this.animation.setDirection(1);\n this.animation.curFrame = 0;\n this.needFrame = 16;\n this.animation.play();\n } else {\n this.animation.setDirection(-1);\n this.animation.curFrame = 16;\n this.needFrame = 0;\n this.animation.play();\n }\n };\n\n return lottieLoader.waitForFirstFrame(_animation);\n });\n }\n\n public remove() {\n if(this.animation) {\n this.animation.remove();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from '../inputField';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\n\nexport default class TrackingMonkey {\n public container: HTMLElement;\n\n protected max = 45;\n protected needFrame = 0;\n\n protected animation: RLottiePlayer;\n protected idleAnimation: RLottiePlayer;\n\n protected loadPromise: Promise;\n\n constructor(protected inputField: InputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n\n const input = inputField.input;\n\n input.addEventListener('blur', () => {\n this.playAnimation(0);\n });\n\n input.addEventListener('input', (e) => {\n this.playAnimation(inputField.value.length);\n });\n\n /* codeInput.addEventListener('focus', () => {\n playAnimation(Math.max(codeInput.value.length, 1));\n }); */\n }\n\n // 1st symbol = frame 15\n // end symbol = frame 165\n public playAnimation(length: number) {\n if(!this.animation) return;\n\n length = Math.min(length, 30);\n let frame: number;\n if(length) {\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\n\n if(this.idleAnimation) {\n this.idleAnimation.stop(true);\n this.idleAnimation.canvas[0].style.display = 'none';\n }\n\n this.animation.canvas[0].style.display = '';\n } else {\n /* const cb = (frameNo: number) => {\n if(frameNo <= 1) { */\n /* idleAnimation.play();\n idleAnimation.canvas.style.display = '';\n animation.canvas.style.display = 'none'; */\n /* animation.removeListener('enterFrame', cb);\n }\n };\n animation.addListener('enterFrame', cb); */\n\n frame = 0;\n }\n // animation.playSegments([1, 2]);\n\n const direction = this.needFrame > frame ? -1 : 1;\n // console.log('keydown', length, frame, direction);\n\n this.animation.setDirection(direction);\n if(this.needFrame !== 0 && frame === 0) {\n this.animation.setSpeed(7);\n }\n /* let diff = Math.abs(needFrame - frame * direction);\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\n this.needFrame = frame;\n\n this.animation.play();\n\n /* animation.goToAndStop(15, true); */\n // animation.goToAndStop(length / max * );\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = Promise.all([\n lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: true,\n autoplay: true,\n width: this.size,\n height: this.size\n }, 'TwoFactorSetupMonkeyIdle').then((animation) => {\n this.idleAnimation = animation;\n\n // ! animationIntersector will stop animation instantly\n if(!this.inputField.value.length) {\n animation.play();\n }\n\n return lottieLoader.waitForFirstFrame(animation);\n }),\n\n lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size\n }, 'TwoFactorSetupMonkeyTracking').then((_animation) => {\n this.animation = _animation;\n\n if(!this.inputField.value.length) {\n this.animation.canvas[0].style.display = 'none';\n }\n\n this.animation.addEventListener('enterFrame', currentFrame => {\n // console.log('enterFrame', currentFrame, needFrame);\n // let currentFrame = Math.round(e.currentTime);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n }\n\n if(currentFrame === 0 && this.needFrame === 0) {\n // animation.curFrame = 0;\n\n if(this.idleAnimation) {\n this.idleAnimation.canvas[0].style.display = '';\n this.idleAnimation.play();\n this.animation.canvas[0].style.display = 'none';\n }\n }\n });\n // console.log(animation.getDuration(), animation.getDuration(true));\n\n return lottieLoader.waitForFirstFrame(_animation);\n })\n ]);\n }\n\n public remove() {\n if(this.animation) this.animation.remove();\n if(this.idleAnimation) this.idleAnimation.remove();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport InputField, {InputFieldOptions} from './inputField';\n\nexport class PasswordInputHelpers {\n public passwordVisible = false;\n public toggleVisible: HTMLElement;\n public onVisibilityClickAdditional: () => void;\n\n constructor(public container: HTMLElement, public input: HTMLInputElement) {\n input.type = 'password';\n input.setAttribute('required', '');\n input.name = 'notsearch_password';\n input.autocomplete = 'off';\n\n // * https://stackoverflow.com/a/35949954/6758968\n const stealthy = document.createElement('input');\n stealthy.classList.add('stealthy');\n stealthy.tabIndex = -1;\n stealthy.type = 'password';\n input.parentElement.prepend(stealthy);\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\n\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\n input.setAttribute('readonly', '');\n input.addEventListener('focus', () => {\n input.removeAttribute('readonly');\n }, {once: true});\n } */\n\n const toggleVisible = this.toggleVisible = document.createElement('span');\n toggleVisible.classList.add('toggle-visible', 'tgico');\n\n container.classList.add('input-field-password');\n container.append(toggleVisible);\n\n toggleVisible.addEventListener('click', this.onVisibilityClick);\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\n }\n\n public onVisibilityClick = (e: Event) => {\n cancelEvent(e);\n this.passwordVisible = !this.passwordVisible;\n\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\n };\n}\n\nexport default class PasswordInputField extends InputField {\n public helpers: PasswordInputHelpers;\n\n constructor(options: InputFieldOptions = {}) {\n super({\n plainText: true,\n ...options\n });\n\n this.helpers = new PasswordInputHelpers(this.container, this.input as HTMLInputElement);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from '../environment/parallaxSupport';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport filterChatPhotosMessages from '../helpers/filterChatPhotosMessages';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ListLoader from '../helpers/listLoader';\nimport {fastRaf} from '../helpers/schedulers';\nimport {Message, ChatFull, MessageAction, Photo} from '../layer';\nimport type {AppMessagesManager} from '../lib/appManagers/appMessagesManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport {openAvatarViewer} from './avatar';\nimport {putAvatar} from './putPhoto';\nimport Scrollable from './scrollable';\nimport SwipeHandler from './swipeHandler';\nimport wrapPhoto from './wrappers/photo';\n\nconst LOAD_NEAREST = 3;\n\nexport default class PeerProfileAvatars {\n private static BASE_CLASS = 'profile-avatars';\n private static SCALE = IS_PARALLAX_SUPPORTED ? 2 : 1;\n private static TRANSLATE_TEMPLATE = IS_PARALLAX_SUPPORTED ? `translate3d({x}, 0, -1px) scale(${PeerProfileAvatars.SCALE})` : 'translate({x}, 0)';\n public container: HTMLElement;\n public avatars: HTMLElement;\n public gradient: HTMLElement;\n public info: HTMLElement;\n public arrowPrevious: HTMLElement;\n public arrowNext: HTMLElement;\n private tabs: HTMLDivElement;\n private listLoader: ListLoader;\n private peerId: PeerId;\n private intersectionObserver: IntersectionObserver;\n private loadCallbacks: Map void>;\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\n\n constructor(\n public scrollable: Scrollable,\n private managers: AppManagers\n ) {\n this.container = document.createElement('div');\n this.container.classList.add(PeerProfileAvatars.BASE_CLASS + '-container');\n\n this.avatars = document.createElement('div');\n this.avatars.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatars');\n\n this.gradient = document.createElement('div');\n this.gradient.classList.add(PeerProfileAvatars.BASE_CLASS + '-gradient');\n\n this.info = document.createElement('div');\n this.info.classList.add(PeerProfileAvatars.BASE_CLASS + '-info');\n\n this.tabs = document.createElement('div');\n this.tabs.classList.add(PeerProfileAvatars.BASE_CLASS + '-tabs');\n\n this.arrowPrevious = document.createElement('div');\n this.arrowPrevious.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', 'tgico-avatarprevious');\n\n /* const previousIcon = document.createElement('i');\n previousIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-previous');\n this.arrowBack.append(previousIcon); */\n\n this.arrowNext = document.createElement('div');\n this.arrowNext.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', PeerProfileAvatars.BASE_CLASS + '-arrow-next', 'tgico-avatarnext');\n\n /* const nextIcon = document.createElement('i');\n nextIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-next');\n this.arrowNext.append(nextIcon); */\n\n this.container.append(this.avatars, this.gradient, this.info, this.tabs, this.arrowPrevious, this.arrowNext);\n\n this.loadCallbacks = new Map();\n this.listenerSetter = new ListenerSetter();\n\n const checkScrollTop = () => {\n if(this.scrollable.scrollTop !== 0) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement,\n position: 'start'\n });\n return false;\n }\n\n return true;\n };\n\n const SWITCH_ZONE = 1 / 3;\n let cancel = false;\n let freeze = false;\n attachClickEvent(this.container, async(_e) => {\n if(freeze) {\n cancelEvent(_e);\n return;\n }\n\n if(cancel) {\n cancel = false;\n return;\n }\n\n if(!checkScrollTop()) {\n return;\n }\n\n const rect = this.container.getBoundingClientRect();\n\n // const e = (_e as TouchEvent).touches ? (_e as TouchEvent).touches[0] : _e as MouseEvent;\n const e = _e;\n const x = e.pageX;\n\n const clickX = x - rect.left;\n if((!this.listLoader.previous.length && !this.listLoader.next.length) ||\n (clickX > (rect.width * SWITCH_ZONE) && clickX < (rect.width - rect.width * SWITCH_ZONE))) {\n const peerId = this.peerId;\n\n const targets: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[] = [];\n this.listLoader.previous.concat(this.listLoader.current, this.listLoader.next).forEach((item, idx) => {\n targets.push({\n element: /* null */this.avatars.children[idx] as HTMLElement,\n item\n });\n });\n\n const prevTargets = targets.slice(0, this.listLoader.previous.length);\n const nextTargets = targets.slice(this.listLoader.previous.length + 1);\n\n const target = this.avatars.children[this.listLoader.previous.length] as HTMLElement;\n freeze = true;\n openAvatarViewer(target, peerId, () => peerId === this.peerId, this.listLoader.current, prevTargets, nextTargets);\n freeze = false;\n } else {\n const centerX = rect.right - (rect.width / 2);\n const toRight = x > centerX;\n\n // this.avatars.classList.remove('no-transition');\n // fastRaf(() => {\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n\n let distance: number;\n if(this.listLoader.index === 0 && !toRight) distance = this.listLoader.count - 1;\n else if(this.listLoader.index === (this.listLoader.count - 1) && toRight) distance = -(this.listLoader.count - 1);\n else distance = toRight ? 1 : -1;\n this.listLoader.go(distance);\n\n fastRaf(() => {\n this.avatars.classList.remove('no-transition');\n });\n // });\n }\n }, {listenerSetter: this.listenerSetter});\n\n const cancelNextClick = () => {\n cancel = true;\n document.body.addEventListener(IS_TOUCH_SUPPORTED ? 'touchend' : 'click', (e) => {\n cancel = false;\n }, {once: true});\n };\n\n let width = 0, x = 0, lastDiffX = 0, /* lastIndex = 0, */ minX = 0;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.avatars,\n onSwipe: (xDiff, yDiff) => {\n xDiff *= -1;\n yDiff *= -1;\n\n lastDiffX = xDiff;\n let lastX = x + xDiff * -PeerProfileAvatars.SCALE;\n if(lastX > 0) lastX = 0;\n else if(lastX < minX) lastX = minX;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', lastX + 'px');\n // console.log(xDiff, yDiff);\n return false;\n },\n verifyTouchTarget: (e) => {\n if(!checkScrollTop()) {\n cancelNextClick();\n cancelEvent(e as any as Event);\n return false;\n } else if(this.container.classList.contains('is-single') || freeze) {\n return false;\n }\n\n return true;\n },\n onFirstSwipe: () => {\n const rect = this.avatars.getBoundingClientRect();\n width = rect.width;\n minX = -width * (this.tabs.childElementCount - 1);\n\n /* lastIndex = whichChild(this.tabs.querySelector('.active'));\n x = -width * lastIndex; */\n x = rect.left - this.container.getBoundingClientRect().left;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', x + 'px');\n\n this.container.classList.add('is-swiping');\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n },\n onReset: () => {\n const addIndex = Math.ceil(Math.abs(lastDiffX) / (width / PeerProfileAvatars.SCALE)) * (lastDiffX >= 0 ? 1 : -1);\n cancelNextClick();\n\n // console.log(addIndex);\n\n this.avatars.classList.remove('no-transition');\n fastRaf(() => {\n this.listLoader.go(addIndex);\n this.container.classList.remove('is-swiping');\n });\n }\n });\n\n this.intersectionObserver = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if(!entry.isIntersecting) {\n return;\n }\n\n this.loadNearestToTarget(entry.target);\n });\n });\n\n /* this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\n if(this.peerId === peerId) {\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(photo) {\n const id = photo.photo_id;\n const previous = this.listLoader.previous;\n for(let i = 0; i < previous.length; ++i) {\n if(previous[i] === id)\n }\n this.listLoader.previous.forEach((_id, idx, arr) => {});\n }\n }\n }); */\n }\n\n public async setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n const photo = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(!photo) {\n return;\n }\n\n const listLoader: PeerProfileAvatars['listLoader'] = this.listLoader = new ListLoader({\n loadCount: 50,\n loadMore: (anchor, older, loadCount) => {\n if(!older) return Promise.resolve({count: undefined, items: []});\n\n if(peerId.isUser()) {\n const maxId: Photo.photo['id'] = anchor as any;\n return this.managers.appPhotosManager.getUserPhotos(peerId, maxId, loadCount).then((value) => {\n return {\n count: value.count,\n items: value.photos\n };\n });\n } else {\n const promises: [Promise | ChatFull, ReturnType] = [] as any;\n if(!listLoader.current) {\n promises.push(this.managers.appProfileManager.getChatFull(peerId.toChatId()));\n }\n\n promises.push(this.managers.appMessagesManager.getSearch({\n peerId,\n maxId: Number.MAX_SAFE_INTEGER,\n inputFilter: {\n _: 'inputMessagesFilterChatPhotos'\n },\n limit: loadCount,\n backLimit: 0\n }));\n\n return Promise.all(promises).then(async(result) => {\n const value = result.pop() as typeof result[1];\n\n filterChatPhotosMessages(value);\n\n if(!listLoader.current) {\n const chatFull = result[0];\n const message = findAndSplice(value.history, (message) => {\n return ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo.id === chatFull.chat_photo.id;\n }) as Message.messageService;\n\n listLoader.current = message || await this.managers.appMessagesManager.generateFakeAvatarMessage(this.peerId, chatFull.chat_photo);\n }\n\n // console.log('avatars loaded:', value);\n return {\n count: value.count,\n items: value.history\n };\n });\n }\n },\n processItem: this.processItem,\n onJump: (item, older) => {\n const id = this.listLoader.index;\n // const nextId = Math.max(0, id);\n const x = 100 * PeerProfileAvatars.SCALE * id;\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', `-${x}%`);\n\n const activeTab = this.tabs.querySelector('.active');\n if(activeTab) activeTab.classList.remove('active');\n\n const tab = this.tabs.children[id] as HTMLElement;\n tab.classList.add('active');\n\n this.loadNearestToTarget(this.avatars.children[id]);\n }\n });\n\n if(photo._ === 'userProfilePhoto') {\n listLoader.current = photo.photo_id;\n }\n\n await this.processItem(listLoader.current);\n\n // listLoader.loaded\n listLoader.load(true);\n }\n\n public addTab() {\n const tab = document.createElement('div');\n tab.classList.add(PeerProfileAvatars.BASE_CLASS + '-tab');\n this.tabs.append(tab);\n\n if(this.tabs.childElementCount === 1) {\n tab.classList.add('active');\n }\n\n this.container.classList.toggle('is-single', this.tabs.childElementCount <= 1);\n }\n\n public processItem = async(photoId: Photo.photo['id'] | Message.messageService) => {\n const avatar = document.createElement('div');\n avatar.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatar', 'media-container', 'hide');\n\n this.avatars.append(avatar);\n\n let photo: Photo.photo;\n if(photoId) {\n photo = typeof(photoId) !== 'object' ?\n await this.managers.appPhotosManager.getPhoto(photoId) :\n (photoId.action as MessageAction.messageActionChannelEditPhoto).photo as Photo.photo;\n }\n\n const img = new Image();\n img.classList.add('avatar-photo');\n img.draggable = false;\n\n const loadCallback = async() => {\n if(photo) {\n const res = await wrapPhoto({\n container: avatar,\n photo,\n size: choosePhotoSize(photo, 420, 420, false),\n withoutPreloader: true\n });\n\n [res.images.thumb, res.images.full].filter(Boolean).forEach((img) => {\n img.classList.add('avatar-photo');\n });\n } else {\n const photo = await this.managers.appPeersManager.getPeerPhoto(this.peerId);\n await putAvatar(avatar, this.peerId, photo, 'photo_big', img);\n }\n\n avatar.classList.remove('hide');\n };\n\n if(this.avatars.childElementCount <= LOAD_NEAREST) {\n await loadCallback();\n } else {\n this.intersectionObserver.observe(avatar);\n this.loadCallbacks.set(avatar, loadCallback);\n }\n\n this.addTab();\n\n return photoId;\n };\n\n private loadNearestToTarget(target: Element) {\n const children = Array.from(target.parentElement.children);\n const idx = children.indexOf(target);\n const slice = children.slice(Math.max(0, idx - LOAD_NEAREST), Math.min(children.length, idx + LOAD_NEAREST));\n\n slice.forEach((target) => {\n const callback = this.loadCallbacks.get(target);\n if(callback) {\n callback();\n this.loadCallbacks.delete(target);\n this.intersectionObserver.unobserve(target);\n }\n });\n }\n\n public cleanup() {\n this.listenerSetter.removeAll();\n this.swipeHandler.removeListeners();\n this.intersectionObserver?.disconnect();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from '../environment/parallaxSupport';\nimport deferredPromise from '../helpers/cancellablePromise';\nimport {copyTextToClipboard} from '../helpers/clipboard';\nimport anchorCopy from '../helpers/dom/anchorCopy';\nimport {simulateClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport makeError from '../helpers/makeError';\nimport {makeMediaSize} from '../helpers/mediaSize';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport middlewarePromise from '../helpers/middlewarePromise';\nimport {Chat, ChatFull, User, UserFull} from '../layer';\nimport appImManager from '../lib/appManagers/appImManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getServerMessageId from '../lib/appManagers/utils/messageId/getServerMessageId';\nimport getPeerActiveUsernames from '../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport I18n, {i18n, join} from '../lib/langPack';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../lib/rootScope';\nimport AvatarElement from './avatar';\nimport CheckboxField from './checkboxField';\nimport {generateDelimiter} from './generateDelimiter';\nimport PeerProfileAvatars from './peerProfileAvatars';\nimport Row from './row';\nimport Scrollable from './scrollable';\nimport SettingSection from './settingSection';\nimport {toast} from './toast';\nimport formatUserPhone from './wrappers/formatUserPhone';\nimport wrapPeerTitle from './wrappers/peerTitle';\nimport wrapTopicNameButton from './wrappers/topicNameButton';\n\nconst setText = (text: Parameters[1], row: Row) => {\n // fastRaf(() => {\n setInnerHTML(row.title, text || '');\n row.container.style.display = text ? '' : 'none';\n // });\n};\n\nexport default class PeerProfile {\n public element: HTMLElement;\n private avatars: PeerProfileAvatars;\n private avatar: AvatarElement;\n private section: SettingSection;\n private name: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private bio: Row;\n private username: Row;\n private phone: Row;\n private notifications: Row;\n private location: Row;\n private link: Row;\n\n private cleaned: boolean;\n private setMoreDetailsTimeout: number;\n private setPeerStatusInterval: number;\n\n private peerId: PeerId;\n private threadId: number;\n\n private middlewareHelper: MiddlewareHelper;\n\n constructor(\n private managers: AppManagers,\n public scrollable: Scrollable,\n private listenerSetter?: ListenerSetter,\n private isDialog = true\n ) {\n if(!IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('no-parallax');\n }\n\n if(!listenerSetter) {\n this.listenerSetter = new ListenerSetter();\n }\n\n this.middlewareHelper = getMiddleware();\n }\n\n public init() {\n this.init = null;\n\n\n this.element = document.createElement('div');\n this.element.classList.add('profile-content');\n\n this.section = new SettingSection({\n noDelimiter: true\n });\n\n this.name = document.createElement('div');\n this.name.classList.add('profile-name');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('profile-subtitle');\n\n this.bio = new Row({\n title: ' ',\n subtitle: true,\n icon: 'info',\n clickable: (e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n\n copyTextToClipboard(this.bio.title.textContent);\n toast(I18n.format('BioCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_About',\n onClick: () => {\n simulateClickEvent(this.bio.container);\n },\n verify: () => !this.peerId.isUser()\n }, {\n icon: 'copy',\n text: 'Text.CopyLabel_Bio',\n onClick: () => {\n simulateClickEvent(this.bio.container);\n },\n verify: () => this.peerId.isUser()\n }]\n }\n });\n\n this.bio.title.classList.add('pre-wrap');\n\n this.username = new Row({\n title: ' ',\n subtitleLangKey: 'Username',\n icon: 'username',\n clickable: () => {\n // const username = await this.managers.appPeersManager.getPeerUsername(this.peerId);\n copyTextToClipboard('@' + this.username.title.textContent);\n toast(I18n.format('UsernameCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_Username',\n onClick: () => {\n simulateClickEvent(this.username.container);\n }\n }]\n }\n });\n\n this.phone = new Row({\n title: ' ',\n subtitle: true,\n icon: 'phone',\n clickable: () => {\n copyTextToClipboard(this.phone.title.textContent.replace(/\\s/g, ''));\n toast(I18n.format('PhoneCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_PhoneNumber',\n onClick: () => {\n simulateClickEvent(this.phone.container);\n }\n }, {\n icon: 'info',\n text: 'PeerInfo.Phone.AnonymousInfo',\n textArgs: [(() => {\n const a = document.createElement('a');\n return a;\n })()],\n onClick: () => {\n window.open('https://fragment.com/numbers', '_blank');\n },\n separator: true,\n multiline: true,\n verify: async() => {\n const {isAnonymous} = await this.managers.appUsersManager.getUserPhone(this.peerId.toUserId()) || {};\n return isAnonymous;\n }\n }]\n }\n });\n\n this.link = new Row({\n title: ' ',\n subtitleLangKey: 'SetUrlPlaceholder',\n icon: 'link',\n clickable: () => {\n const url = this.link.title.textContent;\n copyTextToClipboard(url);\n // Promise.resolve(appProfileManager.getChatFull(this.peerId.toChatId())).then((chatFull) => {\n // copyTextToClipboard(chatFull.exported_invite.link);\n const isPrivate = url.includes('/c/');\n toast(I18n.format(isPrivate ? 'LinkCopiedPrivateInfo' : 'LinkCopied', true));\n // });\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_ShareLink',\n onClick: () => {\n simulateClickEvent(this.link.container);\n }\n }]\n }\n });\n\n this.location = new Row({\n title: ' ',\n subtitleLangKey: 'ChatLocation',\n icon: 'location'\n });\n\n this.section.content.append(\n this.phone.container,\n this.username.container,\n this.location.container,\n this.bio.container,\n this.link.container\n );\n\n const {listenerSetter} = this;\n if(this.isDialog) {\n this.notifications = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Notifications',\n icon: 'unmute',\n listenerSetter: this.listenerSetter\n });\n\n listenerSetter.add(this.notifications.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n // let checked = this.notificationsCheckbox.checked;\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, threadId: this.threadId});\n });\n\n listenerSetter.add(rootScope)('dialog_notify_settings', async(dialog) => {\n if(this.peerId === dialog.peerId) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.threadId});\n this.notifications.checkboxField.checked = !muted;\n }\n });\n\n this.section.content.append(this.notifications.container);\n }\n\n this.element.append(this.section.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.element.append(generateDelimiter());\n }\n\n listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('peer_bio_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.setMoreDetails(true);\n }\n });\n\n const n = async({peerId, threadId}: {peerId: PeerId, threadId?: number}) => {\n if(this.peerId !== peerId) {\n return false;\n }\n\n const isForum = await this.managers.appPeersManager.isForum(this.peerId);\n if(isForum && this.threadId ? this.threadId === threadId : true) {\n return true;\n }\n\n return false;\n };\n\n listenerSetter.add(rootScope)('peer_title_edit', async(data) => {\n if(await n(data)) {\n this.fillUsername();\n this.setMoreDetails(true);\n }\n });\n\n listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('contacts_update', async(userId) => {\n if(this.peerId === userId.toPeerId()) {\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user.pFlags.self || !this.isDialog) {\n this.fillUserPhone();\n }\n }\n });\n\n listenerSetter.add(rootScope)('avatar_update', async(data) => {\n if(await n(data)) {\n this.setAvatar();\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(() => this.setPeerStatus(), 60e3);\n }\n\n private async setPeerStatus(\n needClear = false,\n manual?: T\n ): Promise void : void> {\n const peerId = this.peerId;\n\n const callbacks: Array<() => void> = [];\n callbacks.push(() => {\n this.element.classList.toggle('is-me', peerId === rootScope.myId);\n });\n\n let promise: Promise<(() => void) | void> = Promise.resolve();\n if(!(!peerId || (rootScope.myId === peerId && this.isDialog))) {\n const isForum = await this.managers.appPeersManager.isForum(this.peerId);\n const middleware = this.middlewareHelper.get();\n if(isForum && this.threadId) {\n promise = wrapTopicNameButton({\n peerId,\n wrapOptions: {\n middleware\n }\n }).then(({element}) => {\n this.subtitle.replaceChildren(element);\n });\n } else {\n promise = appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear,\n useWhitespace: true,\n middleware,\n ignoreSelf: !this.isDialog\n });\n }\n\n promise.then((callback) => callback && callbacks.push(callback));\n }\n\n const callback = () => callbacks.forEach((callback) => callback());\n\n return promise.then(() => {\n if(manual) {\n return callback;\n }\n\n callback();\n }) as any;\n }\n\n public cleanupHTML() {\n [\n this.bio,\n this.phone,\n this.username,\n this.location,\n this.link\n ].forEach((row) => {\n row.container.style.display = 'none';\n });\n\n if(this.notifications) {\n this.notifications.container.style.display = '';\n this.notifications.checkboxField.checked = true;\n }\n\n this.clearSetMoreDetailsTimeout();\n }\n\n private canBeDetailed() {\n return this.peerId !== rootScope.myId || !this.isDialog;\n }\n\n private createAvatar() {\n const avatar = new AvatarElement();\n avatar.classList.add('profile-avatar', 'avatar-120');\n avatar.isDialog = this.isDialog;\n avatar.attachClickEvent();\n return avatar;\n }\n\n private async _setAvatar() {\n const {peerId} = this;\n const isTopic = !!(this.threadId && await this.managers.appPeersManager.isForum(peerId));\n if(this.canBeDetailed() && !isTopic) {\n const photo = await this.managers.appPeersManager.getPeerPhoto(peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable, this.managers);\n await this.avatars.setPeer(peerId);\n\n return () => {\n this.avatars.info.append(this.name, this.subtitle);\n\n this.avatar?.remove();\n this.avatar = undefined;\n\n if(oldAvatars) oldAvatars.container.replaceWith(this.avatars.container);\n else this.element.prepend(this.avatars.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('parallax');\n }\n };\n }\n }\n\n const avatar = this.createAvatar();\n await avatar.updateWithOptions({\n peerId,\n threadId: isTopic ? this.threadId : undefined,\n wrapOptions: {\n customEmojiSize: makeMediaSize(120, 120),\n middleware: this.middlewareHelper.get()\n }\n });\n\n return () => {\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.remove('parallax');\n }\n\n if(this.avatars) {\n this.avatars.container.remove();\n this.avatars.cleanup();\n this.avatars = undefined;\n }\n\n this.avatar?.remove();\n this.avatar = avatar;\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n };\n }\n\n private setAvatar(manual?: T): T extends true ? Promise<() => void> : Promise {\n const promise = this._setAvatar();\n return manual ? promise : promise.then((callback) => callback()) as any;\n }\n\n private getUsernamesAlso(usernames: string[]) {\n const also = usernames.slice(1);\n if(also.length) {\n const a = also.map((username) => anchorCopy({username}));\n const i = i18n('UsernameAlso', [join(a, false)]);\n return i;\n }\n }\n\n private async fillUsername() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const usernames = await this.managers.appPeersManager.getPeerActiveUsernames(peerId);\n const also = this.getUsernamesAlso(usernames);\n\n return () => {\n this.username.subtitle.replaceChildren(also || i18n('Username'));\n setText(usernames[0], this.username);\n };\n }\n }\n\n private async fillUserPhone() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const {phone, isAnonymous} = await this.managers.appUsersManager.getUserPhone(peerId.toUserId()) || {};\n\n return () => {\n this.phone.subtitle.replaceChildren(i18n(isAnonymous ? 'AnonymousNumber' : 'Phone'));\n setText(phone ? formatUserPhone(phone) : undefined, this.phone);\n };\n }\n }\n\n private async fillNotifications() {\n const notificationsRow = this.notifications;\n if(!notificationsRow) {\n return;\n }\n\n if(this.canBeDetailed()) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.threadId});\n return () => {\n notificationsRow.checkboxField.checked = !muted;\n };\n } else {\n return () => {\n // fastRaf(() => {\n notificationsRow.container.style.display = 'none';\n // });\n };\n }\n }\n\n private async fillName() {\n const {peerId} = this;\n const [element/* , icons */] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: this.isDialog,\n withIcons: !this.threadId,\n threadId: this.threadId\n })\n\n // generateTitleIcons(peerId)\n ]);\n\n return () => {\n replaceContent(this.name, element);\n // this.name.append(...icons);\n };\n }\n\n private async fillRows(manual: Promise) {\n return Promise.all([\n this.fillName(),\n this.fillUsername(),\n this.fillUserPhone(),\n this.fillNotifications(),\n this.setMoreDetails(undefined, manual),\n this.setPeerStatus(true, true)\n ]).then((callbacks) => {\n return () => {\n callbacks.forEach((callback) => callback?.());\n };\n });\n }\n\n public async fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n\n this.cleanupHTML();\n const deferred = deferredPromise();\n const middleware = this.middlewareHelper.get();\n middleware.onClean(() => {\n deferred.reject();\n });\n\n const callbacks = await Promise.all([\n this.setAvatar(true),\n this.fillRows(deferred)\n ]);\n\n return () => {\n deferred.resolve();\n callbacks.forEach((callback) => callback?.());\n };\n }\n\n private async _setMoreDetails(peerId: PeerId, peerFull?: ChatFull | UserFull) {\n const m = this.getMiddlewarePromise();\n const isTopic = !!(this.threadId && await m(this.managers.appPeersManager.isForum(peerId)));\n if(isTopic) {\n let url = 'https://t.me/';\n const threadId = getServerMessageId(this.threadId);\n const username = await m(this.managers.appPeersManager.getPeerUsername(peerId));\n if(username) {\n url += `${username}/${threadId}`;\n } else {\n url += `c/${peerId.toChatId()}/${threadId}`;\n }\n\n return () => {\n setText(url, this.link);\n };\n }\n\n const callbacks: (() => void)[] = [];\n // if(peerFull.about) {\n callbacks.push(() => {\n this.bio.subtitle.replaceChildren(i18n(peerId.isUser() ? 'UserBio' : 'Info'));\n setText(peerFull.about ? wrapRichText(peerFull.about) : undefined, this.bio);\n });\n // }\n\n if(!peerId.isUser()) {\n const chat = await m(this.managers.appChatsManager.getChat(peerId.toChatId())) as Chat.channel;\n const usernames = getPeerActiveUsernames(chat);\n let also: HTMLElement;\n if(usernames.length) {\n also = this.getUsernamesAlso(usernames);\n callbacks.push(() => setText('https://t.me/' + usernames[0], this.link));\n } else {\n const exportedInvite = (peerFull as ChatFull.channelFull).exported_invite;\n if(exportedInvite?._ === 'chatInviteExported') {\n callbacks.push(() => setText(exportedInvite.link, this.link));\n }\n }\n\n callbacks.push(() => this.link.subtitle.replaceChildren(also || i18n('SetUrlPlaceholder')));\n }\n\n const location = (peerFull as ChatFull.channelFull).location;\n if(location?._ == 'channelLocation') {\n callbacks.push(() => setText(location.address, this.location));\n }\n\n this.setMoreDetailsTimeout = window.setTimeout(() => this.setMoreDetails(true), 60e3);\n\n return () => {\n callbacks.forEach((callback) => callback());\n };\n }\n\n private async setMoreDetails(override?: true, manual?: Promise) {\n this.clearSetMoreDetailsTimeout();\n\n const {peerId} = this;\n const m = this.getMiddlewarePromise();\n\n if(!peerId || !this.canBeDetailed() || await m(this.managers.appPeersManager.isPeerRestricted(peerId))) {\n return;\n }\n\n const result = await m(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId, override));\n const setPromise = m(result.result).then(async(peerFull) => {\n if(await m(this.managers.appPeersManager.isPeerRestricted(peerId))) {\n // this.log.warn('peer changed');\n return;\n }\n\n return await m(this._setMoreDetails(peerId, peerFull));\n });\n\n if(result.cached && manual) {\n return setPromise;\n } else {\n (manual || Promise.resolve())\n .then(() => setPromise)\n .then((callback) => {\n callback?.();\n });\n }\n }\n\n private getMiddlewarePromise() {\n return middlewarePromise(this.middlewareHelper.get(), makeError('MIDDLEWARE'));\n }\n\n public setPeer(peerId: PeerId, threadId?: number) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n this.init?.();\n\n this.peerId = peerId;\n this.threadId = threadId;\n\n this.middlewareHelper.clean();\n this.cleaned = true;\n }\n\n public clearSetMoreDetailsTimeout() {\n if(this.setMoreDetailsTimeout !== undefined) {\n clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = undefined;\n }\n }\n\n public destroy() {\n this.peerId = this.threadId = undefined;\n this.clearSetMoreDetailsTimeout();\n clearInterval(this.setPeerStatusInterval);\n this.avatars?.cleanup();\n this.middlewareHelper.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport mediaSizes from '../helpers/mediaSizes';\nimport {Middleware} from '../helpers/middleware';\nimport {Chat, Document, EmojiStatus, User} from '../layer';\nimport rootScope from '../lib/rootScope';\nimport generateFakeIcon from './generateFakeIcon';\nimport generatePremiumIcon from './generatePremiumIcon';\nimport generateVerifiedIcon from './generateVerifiedIcon';\nimport wrapSticker from './wrappers/sticker';\n\nexport default async function generateTitleIcons(\n peerId: PeerId,\n middleware?: Middleware,\n noVerifiedIcon?: boolean,\n noFakeIcon?: boolean,\n noPremiumIcon?: boolean\n) {\n const elements: HTMLElement[] = [];\n const peer: Chat | User = await rootScope.managers.appPeersManager.getPeer(peerId);\n if((peer as Chat.channel).pFlags.verified && !noVerifiedIcon) {\n elements.push(generateVerifiedIcon());\n }\n\n if(((peer as Chat.channel).pFlags.fake || (peer as User.user).pFlags.scam) && !noFakeIcon) {\n elements.push(generateFakeIcon((peer as User.user).pFlags.scam));\n }\n\n if((peer as User.user).pFlags.premium && !noPremiumIcon) {\n const emojiStatus = (peer as User.user).emoji_status;\n if(emojiStatus && emojiStatus._ !== 'emojiStatusEmpty' && false) {\n const container = document.createElement('span');\n container.classList.add('emoji-status');\n const result = await rootScope.managers.acknowledged.appEmojiManager.getCustomEmojiDocument((emojiStatus as EmojiStatus.emojiStatus).document_id);\n const wrap = async(doc: Document.document) => {\n const size = mediaSizes.active.emojiStatus\n const loadPromises: Promise[] = [];\n await wrapSticker({\n doc,\n div: container,\n width: size.width,\n height: size.height,\n loop: 2,\n play: true,\n group: 'EMOJI-STATUS',\n loadPromises,\n middleware\n // group: 'none'\n });\n\n await Promise.all(loadPromises);\n };\n\n const p = result.result.then(wrap);\n if(result.cached) {\n await p;\n }\n\n elements.push(container);\n } else {\n elements.push(generatePremiumIcon());\n }\n }\n\n return elements;\n}\n","export default function generateVerifiedIcon() {\n const span = document.createElement('span');\n span.classList.add('verified-icon', 'tgico');\n\n const size = 26; // 24\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${size} ${size}`);\n svg.setAttributeNS(null, 'width', `${size}`);\n svg.setAttributeNS(null, 'height', `${size}`);\n svg.classList.add('verified-icon-svg');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#verified-icon-background');\n use.classList.add('verified-icon-background');\n\n const use2 = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use2.setAttributeNS(null, 'href', '#verified-icon-check');\n use2.classList.add('verified-icon-check');\n\n // svg.append(use, use2);\n svg.append(use2, use);\n\n span.append(svg);\n\n return span;\n // const span = document.createElement('span');\n // span.classList.add('verified-icon', 'tgico-verified_filled');\n // return span;\n}\n","export default function generatePremiumIcon() {\n const span = document.createElement('span');\n span.classList.add('premium-icon', 'tgico-star');\n return span;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport {i18n} from '../lib/langPack';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport limitSymbols from '../helpers/string/limitSymbols';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport safeAssign from '../helpers/object/safeAssign';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport getPeerTitle from './wrappers/getPeerTitle';\nimport generateTitleIcons from './generateTitleIcons';\nimport {wrapTopicIcon} from './wrappers/messageActionTextNewUnsafe';\n\nexport type PeerTitleOptions = {\n peerId?: PeerId,\n fromName?: string,\n plainText?: boolean,\n onlyFirstName?: boolean,\n dialog?: boolean,\n limitSymbols?: number,\n withIcons?: boolean,\n withPremiumIcon?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions\n};\n\nconst weakMap: WeakMap = new WeakMap();\n\nrootScope.addEventListener('peer_title_edit', ({peerId, threadId}) => {\n let query = `.peer-title[data-peer-id=\"${peerId}\"]`;\n if(threadId) {\n query += `[data-thread-id=\"${threadId}\"]`;\n }\n\n const elements = Array.from(document.querySelectorAll(query)) as HTMLElement[];\n elements.forEach((element) => {\n const peerTitle = weakMap.get(element);\n peerTitle?.update();\n });\n});\n\nexport default class PeerTitle {\n public element: HTMLElement;\n public options: PeerTitleOptions;\n private hasInner: boolean;\n\n constructor(options?: PeerTitleOptions) {\n this.element = document.createElement('span');\n this.element.classList.add('peer-title');\n setDirection(this.element);\n\n this.options = {};\n\n if(options) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n public setOptions(options?: PeerTitleOptions) {\n if(!options) {\n return;\n }\n\n safeAssign(this.options, options);\n for(const i in options) {\n // @ts-ignore\n const value = options[i];\n\n if(typeof(value) !== 'object' && typeof(value) !== 'function') {\n // @ts-ignore\n this.element.dataset[i] = value ? '' + (typeof(value) === 'boolean' ? +value : value) : '0';\n }\n }\n }\n\n private setHasInner(hasInner: boolean) {\n if(this.hasInner !== hasInner) {\n this.hasInner = hasInner;\n this.element.classList.toggle('with-icons', hasInner);\n }\n }\n\n public async update(options?: PeerTitleOptions) {\n this.setOptions(options);\n\n let fromName = this.options.fromName;\n if(fromName !== undefined) {\n if(this.options.limitSymbols !== undefined) {\n fromName = limitSymbols(fromName, this.options.limitSymbols, this.options.limitSymbols);\n }\n\n setInnerHTML(this.element, wrapEmojiText(fromName));\n return;\n }\n\n this.options.peerId ??= NULL_PEER_ID;\n\n let hasInner: boolean;\n const {peerId, threadId} = this.options;\n if(peerId !== rootScope.myId || !this.options.dialog) {\n if(threadId) {\n const [topic, isForum] = await Promise.all([\n rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId),\n rootScope.managers.appPeersManager.isForum(peerId)\n ]);\n\n if(!topic && isForum) {\n rootScope.managers.dialogsStorage.getForumTopicById(peerId, threadId).then((forumTopic) => {\n if(!forumTopic && this.options.threadId === threadId) {\n this.options.threadId = undefined;\n this.update({threadId: undefined});\n return;\n }\n\n this.update();\n }, () => {\n if(this.options.threadId === threadId) {\n this.options.threadId = undefined;\n this.update({threadId: undefined});\n }\n });\n\n setInnerHTML(this.element, i18n('Loading'));\n this.setHasInner(false);\n return;\n }\n }\n\n const getTopicIconPromise = threadId && this.options.withIcons ?\n rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId).then((topic) => wrapTopicIcon({...(this.options.wrapOptions ?? {}), topic})) :\n undefined;\n\n const [title, icons, topicIcon] = await Promise.all([\n getPeerTitle(this.options as Required),\n (this.options.withIcons && generateTitleIcons(peerId, this.options.wrapOptions?.middleware)) || (this.options.withPremiumIcon && generateTitleIcons(peerId, this.options.wrapOptions?.middleware, true, true)),\n getTopicIconPromise\n ]);\n\n if(icons?.length || topicIcon) {\n const inner = document.createElement('span');\n inner.classList.add('peer-title-inner');\n hasInner = true;\n setInnerHTML(inner, title);\n\n const fragment = document.createDocumentFragment();\n fragment.append(...[topicIcon, inner, ...(icons ?? [])].filter(Boolean));\n setInnerHTML(this.element, fragment);\n } else {\n setInnerHTML(this.element, title);\n }\n } else {\n replaceContent(this.element, i18n(this.options.onlyFirstName ? 'Saved' : 'SavedMessages'));\n }\n\n this.setHasInner(hasInner);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppDownloadManager} from '../../lib/appManagers/appDownloadManager';\nimport resizeableImage from '../../lib/cropper';\nimport PopupElement from '.';\nimport {_i18n} from '../../lib/langPack';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\nimport rootScope from '../../lib/rootScope';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\n\nexport default class PopupAvatar extends PopupElement {\n private cropContainer: HTMLElement;\n private input: HTMLInputElement;\n private h6: HTMLElement;\n\n private image = new Image();\n\n private canvas: HTMLCanvasElement;\n private blob: Blob;\n private cropper = {\n crop: () => {},\n removeHandlers: () => {}\n };\n\n private onCrop: (upload: () => ReturnType) => void;\n\n constructor(options: Partial<{\n isForum: boolean\n }> = {}) {\n super('popup-avatar', {closable: true, withConfirm: true});\n\n this.h6 = document.createElement('h6');\n _i18n(this.h6, 'Popup.Avatar.Title');\n\n this.btnClose.classList.remove('btn-icon');\n\n this.header.append(this.h6);\n\n this.cropContainer = document.createElement('div');\n this.cropContainer.classList.add('crop');\n this.cropContainer.append(this.image);\n\n if(options.isForum) {\n this.cropContainer.classList.add('is-forum');\n }\n\n this.input = document.createElement('input');\n this.input.type = 'file';\n this.input.style.display = 'none';\n this.listenerSetter.add(this.input)('change', (e: any) => {\n const file = e.target.files[0];\n if(!file) {\n return;\n }\n\n readBlobAsDataURL(file).then((contents) => {\n this.image = new Image();\n this.cropContainer.append(this.image);\n this.image.src = contents;\n\n this.image.onload = () => {\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\n cropContainer.style.width = w + 'px';\n cropContainer.style.height = h + 'px'; */\n this.show();\n\n this.cropper = resizeableImage(this.image, this.canvas);\n this.input.value = '';\n };\n });\n }, false);\n\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\n attachClickEvent(this.btnConfirm, () => {\n this.cropper.crop();\n this.hide();\n\n this.canvas.toBlob((blob) => {\n this.blob = blob; // save blob to send after reg\n this.darkenCanvas();\n this.resolve();\n }, 'image/jpeg', 1);\n }, {listenerSetter: this.listenerSetter});\n\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\n\n this.addEventListener('closeAfterTimeout', () => {\n this.cropper.removeHandlers();\n if(this.image) {\n this.image.remove();\n }\n });\n }\n\n private resolve() {\n this.onCrop(() => {\n return appDownloadManager.upload(this.blob);\n });\n }\n\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\n this.canvas = postCanvas;\n this.onCrop = onCrop;\n\n this.input.click();\n }\n\n public darkenCanvas() {\n const ctx = this.canvas.getContext('2d');\n ctx.fillStyle = 'rgba(0, 0, 0, 0.3)';\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\n let cropComponent: HTMLDivElement,\n container: HTMLDivElement,\n cropImage: HTMLImageElement,\n event_state: Partial<{\n mouse_x: number,\n mouse_y: number,\n container_width: number,\n container_height: number,\n container_left: number,\n container_top: number\n }> = {},\n keyZoomValue = 4.0,\n MINWIDTH = 50,\n MINHEIGHT = 50,\n CROPWIDTH = 200,\n CROPHEIGHT = 200,\n cropLeft = 0,\n cropTop = 0,\n cropWidth = 0,\n cropHeight = 0,\n scaledRatio = 0;\n\n if(originalImage.complete) init();\n else originalImage.onload = init;\n\n function removeHandlers() {\n container.removeEventListener('mousedown', startMoving);\n container.removeEventListener('touchstart', startMoving);\n container.removeEventListener('wheel', resizing);\n\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n document.removeEventListener('keypress', keyHandler);\n\n cropComponent.remove();\n container.remove();\n cropImage.remove();\n }\n\n function addHandlers() {\n container.addEventListener('mousedown', startMoving, false);\n container.addEventListener('touchstart', startMoving, false);\n container.addEventListener('wheel', resizing, false);\n\n document.addEventListener('keypress', keyHandler, false);\n // document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\n }\n\n function init() {\n originalImage.classList.add('crop-blur');\n originalImage.draggable = false;\n\n cropImage = new Image();\n cropImage.src = originalImage.src;\n cropImage.draggable = false;\n cropImage.classList.add('crop-overlay-image');\n\n if(!canvas) {\n canvas = document.createElement('canvas');\n }\n\n cropComponent = document.createElement('div');\n cropComponent.classList.add('crop-component');\n\n container = document.createElement('div');\n container.classList.add('crop-overlay');\n\n const overlayColor = document.createElement('div');\n overlayColor.classList.add('crop-overlay-color');\n\n cropComponent.appendChild(container);\n const wrapper = originalImage.parentNode as HTMLElement;\n wrapper.appendChild(cropComponent);\n cropComponent.appendChild(cropImage);\n cropComponent.appendChild(originalImage);\n cropComponent.appendChild(overlayColor);\n container.appendChild(cropImage);\n\n cropImage.style.maxWidth = originalImage.width + 'px';\n\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\n\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\n\n updateCropSize(CROPWIDTH, CROPHEIGHT);\n updateCropImage(left, top);\n updateContainer(left, top);\n addHandlers();\n // crop();\n }\n\n function updateCropSize(width: number, height: number) {\n cropWidth = width * scaledRatio;\n cropHeight = height * scaledRatio;\n\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n }\n\n function updateCropImage(left: number, top: number) {\n cropTop = top * scaledRatio;\n cropLeft = left * scaledRatio;\n\n cropImage.style.top = -top + 'px';\n cropImage.style.left = -left + 'px';\n }\n\n function updateContainer(left: number, top: number) {\n container.style.top = top + 'px';\n container.style.left = left + 'px';\n }\n\n // Save the initial event details and container state\n function saveEventState(e: any) {\n event_state.container_width = container.offsetWidth;\n event_state.container_height = container.offsetHeight;\n\n event_state.container_left = container.offsetLeft;\n event_state.container_top = container.offsetTop;\n\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\n }\n\n function imgZoom(zoom: number) {\n zoom = zoom * Math.PI * 2\n let newWidth = Math.floor(container.clientWidth + zoom),\n newHeight = Math.floor(container.clientHeight + zoom),\n w = cropImage.clientWidth,\n h = cropImage.clientHeight,\n left: number,\n top: number,\n right: number,\n bottom: number;\n\n if(newWidth < MINWIDTH) {\n return;\n } else if(newWidth > w) {\n return;\n }\n\n left = container.offsetLeft - (zoom / 2);\n top = container.offsetTop - (zoom / 2);\n right = left + newWidth;\n bottom = top + newHeight;\n\n if(left < 0) left = 0;\n if(top < 0) top = 0;\n\n if(right > w) return;\n if(bottom > h) return;\n\n updateCropSize(newWidth, newWidth);\n updateCropImage(left, top);\n updateContainer(left, top);\n // crop();\n }\n\n function keyHandler(e: KeyboardEvent) {\n e.preventDefault();\n\n switch(String.fromCharCode(e.charCode)) {\n case '+':\n imgZoom(keyZoomValue);\n break;\n case '-':\n imgZoom(-keyZoomValue);\n break;\n }\n }\n\n function resizing(e: any) {\n e.preventDefault();\n imgZoom(e.deltaY > 0 ? 1 : -1);\n }\n\n function startMoving(e: MouseEvent | TouchEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n saveEventState(e);\n\n document.addEventListener('mousemove', moving);\n document.addEventListener('touchmove', moving);\n document.addEventListener('mouseup', endMoving);\n document.addEventListener('touchend', endMoving);\n }\n\n function endMoving(e: MouseEvent | TouchEvent) {\n e.preventDefault();\n\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n }\n\n function moving(e: any) {\n let currentTouch = {x: 0, y: 0},\n left: number,\n top: number,\n w: number,\n h: number;\n\n e.preventDefault();\n e.stopPropagation();\n\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\n\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\n w = container.offsetWidth;\n h = container.offsetHeight;\n\n if(left < 0) left = 0;\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\n\n if(top < 0) top = 0;\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\n\n updateCropImage(left, top);\n updateContainer(left, top);\n // crop();\n }\n\n function crop() {\n canvas.width = cropWidth;\n canvas.height = cropHeight;\n\n const ctx = canvas.getContext('2d');\n ctx.drawImage(originalImage,\n cropLeft, cropTop,\n cropWidth, cropHeight,\n 0, 0,\n cropWidth, cropHeight\n );\n }\n\n return {crop, removeHandlers};\n}\n\nexport default resizeableImage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport type {PeerType} from '../../lib/appManagers/appPeersManager';\nimport {FormatterArguments, LangPackKey} from '../../lib/langPack';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\n\nexport default class PopupDeleteDialog {\n constructor(\n private peerId: PeerId,\n // actionType: 'leave' | 'delete',\n private peerType?: PeerType,\n private onSelect?: (promise: Promise) => void,\n private threadId?: number\n ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, peerType, onSelect, threadId} = this;\n const peerTitleElement = await wrapPeerTitle({peerId, threadId: threadId});\n\n const managers = PopupElement.MANAGERS;\n if(peerType === undefined) {\n peerType = await managers.appPeersManager.getDialogType(peerId);\n }\n\n /* const callbackFlush = (checked: PopupPeerButtonCallbackCheckboxes) => {\n const promise = appMessagesManager.flushHistory(peerId, checkboxes ? !checked[checkboxes[0].text] : undefined);\n onSelect && onSelect(promise);\n }; */\n\n const callbackLeave = (checked: PopupPeerButtonCallbackCheckboxes, flush = checkboxes && !!checked.size) => {\n let promise = managers.appChatsManager.leave(peerId.toChatId());\n\n if(flush) {\n promise = promise.then(() => {\n return managers.appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n\n onSelect?.(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n if(threadId) {\n promise = managers.appMessagesManager.flushHistory(peerId, false, true, threadId);\n } else if(peerId.isUser()) {\n promise = managers.appMessagesManager.flushHistory(peerId, false, checkboxes ? !!checked.size : undefined);\n } else {\n if(checked.size) {\n promise = managers.appChatsManager.delete(peerId.toChatId());\n } else {\n return callbackLeave(checked);\n }\n }\n\n onSelect?.(promise);\n };\n\n let title: LangPackKey,\n titleArgs: FormatterArguments,\n description: LangPackKey,\n descriptionArgs: FormatterArguments,\n buttons: PopupPeerOptions['buttons'],\n checkboxes: PopupPeerOptions['checkboxes'];\n switch(peerType) {\n case 'channel': {\n if(/* actionType === 'delete' && */await managers.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'ChannelDeleteMenu';\n description = 'AreYouSureDeleteAndExitChannel';\n buttons = [{\n langKey: 'ChannelDeleteMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChannelForAll'\n }];\n } else {\n title = 'LeaveChannelMenu';\n description = 'ChannelLeaveAlertWithName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'LeaveChannel',\n isDanger: true,\n callback: callbackLeave\n }];\n }\n\n break;\n }\n\n /* case 'megagroup': {\n title = 'Leave Group?';\n description = `Are you sure you want to leave this group?`;\n buttons = [{\n text: 'LEAVE ' + peerTitleElement,\n isDanger: true,\n callback: callbackLeave\n }];\n\n break;\n } */\n\n case 'chat': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatWithUser';\n descriptionArgs = [peerTitleElement];\n\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteMessagesOptionAlso',\n textArgs: [\n await wrapPeerTitle({peerId})\n ]\n }];\n\n break;\n }\n\n case 'saved': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatSavedMessages';\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n break;\n }\n\n case 'megagroup':\n case 'group': {\n if(threadId) {\n title = 'DeleteTopics';\n titleArgs = [1];\n description = 'DeleteSelectedTopic';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'Delete',\n isDanger: true,\n callback: callbackDelete\n }];\n } else if(/* actionType === 'delete' && */await managers.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'DeleteMegaMenu';\n description = 'AreYouSureDeleteAndExit';\n buttons = [{\n langKey: 'DeleteMegaMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChat.DeleteGroupForAll'\n }];\n } else {\n title = 'LeaveMegaMenu';\n description = 'AreYouSureDeleteAndExitName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: (checkboxes) => callbackLeave(checkboxes, true)\n }];\n }\n\n break;\n }\n }\n\n new PopupPeer('popup-delete-chat', {\n peerId,\n threadId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n }).show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\nimport PopupElement, {addCancelButton} from '.';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\nimport {ChatType} from '../chat/chat';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport hasRights from '../../lib/appManagers/utils/chats/hasRights';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport wrapPeerTitle from '../wrappers/peerTitle';\n\nexport default class PopupDeleteMessages {\n constructor(\n private peerId: PeerId,\n private mids: number[],\n private type: ChatType,\n private onConfirm?: () => void,\n private threadId?: number\n ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, mids, type, onConfirm, threadId} = this;\n\n const peerTitleElement = await wrapPeerTitle({peerId, threadId});\n\n const managers = PopupElement.MANAGERS;\n\n mids = mids.slice();\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, revoke?: boolean) => {\n onConfirm && onConfirm();\n if(type === 'scheduled') {\n managers.appMessagesManager.deleteScheduledMessages(peerId, mids);\n } else {\n managers.appMessagesManager.deleteMessages(peerId, mids, !!checked.size || revoke);\n }\n };\n\n const buttons: PopupPeerOptions['buttons'] = [{\n langKey: 'Delete',\n isDanger: true,\n callback\n }];\n const checkboxes: PopupPeerOptions['checkboxes'] = [];\n let title: LangPackKey, titleArgs: any[], description: LangPackKey, descriptionArgs: any[];\n if(mids.length === 1) {\n title = 'DeleteSingleMessagesTitle';\n } else {\n title = 'DeleteMessagesTitle';\n titleArgs = [i18n('messages', [mids.length])];\n }\n\n if(await managers.appPeersManager.isMegagroup(peerId)) {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessageMega' : 'AreYouSureDeleteFewMessagesMega';\n } else {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessage' : 'AreYouSureDeleteFewMessages';\n }\n\n if(peerId === rootScope.myId || type === 'scheduled') {\n\n } else {\n if(peerId.isUser()) {\n checkboxes.push({\n text: 'DeleteMessagesOptionAlso',\n textArgs: [peerTitleElement]\n });\n } else {\n const chat = await managers.appChatsManager.getChat(peerId.toChatId());\n\n const _hasRights = hasRights(chat, 'delete_messages');\n if(chat._ === 'chat') {\n const canRevoke = _hasRights ? mids.slice() : await filterAsync(mids, async(mid) => {\n const message = await managers.appMessagesManager.getMessageByPeer(peerId, mid);\n return message.fromId === rootScope.myId;\n });\n\n if(canRevoke.length) {\n if(canRevoke.length === mids.length) {\n checkboxes.push({\n text: 'DeleteForAll'\n });\n } else {\n checkboxes.push({\n text: 'DeleteMessagesOption'\n });\n\n description = 'DeleteMessagesTextGroup';\n descriptionArgs = [i18n('messages', [canRevoke.length])];\n // description = `You can also delete the ${canRevoke.length} message${canRevoke.length > 1 ? 's' : ''} you sent from the inboxes of other group members by pressing \"${buttonText}\".`;\n }\n }\n } else {\n buttons[0].callback = (checked) => callback(checked, true);\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n threadId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport {toastNew} from '../toast';\nimport PopupPickUser from './pickUser';\n\nexport default class PopupForward extends PopupPickUser {\n constructor(\n peerIdMids?: {[fromPeerId: PeerId]: number[]},\n onSelect?: (peerId: PeerId) => Promise | void\n ) {\n super({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: !peerIdMids && onSelect ? onSelect : async(peerId) => {\n if(onSelect) {\n const res = onSelect(peerId);\n if(res instanceof Promise) {\n await res;\n }\n }\n\n if(peerId === rootScope.myId) {\n let count = 0;\n for(const fromPeerId in peerIdMids) {\n const mids = peerIdMids[fromPeerId];\n count += mids.length;\n this.managers.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), mids);\n }\n\n toastNew({\n langPackKey: count > 0 ? 'FwdMessagesToSavedMessages' : 'FwdMessageToSavedMessages'\n });\n\n return;\n }\n\n appImManager.setInnerPeer({peerId});\n appImManager.chat.input.initMessagesForward(peerIdMids);\n },\n placeholder: 'ShareModal.Search.ForwardPlaceholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ripple from '../ripple';\nimport animationIntersector from '../animationIntersector';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {i18n, LangPackKey, _i18n} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport EventListenerBase, {EventListenerListeners} from '../../helpers/eventListenerBase';\nimport {addFullScreenListener, getFullScreenElement} from '../../helpers/dom/fullScreen';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport Scrollable from '../scrollable';\nimport {getMiddleware, MiddlewareHelper} from '../../helpers/middleware';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\n\nexport type PopupButton = {\n text?: string,\n callback?: () => void,\n langKey?: LangPackKey,\n langArgs?: any[],\n isDanger?: boolean,\n isCancel?: boolean,\n element?: HTMLButtonElement,\n noRipple?: boolean\n};\n\nexport type PopupOptions = Partial<{\n closable: boolean,\n overlayClosable: boolean,\n withConfirm: LangPackKey | boolean,\n body: boolean,\n confirmShortcutIsSendShortcut: boolean,\n withoutOverlay: boolean,\n scrollable: boolean,\n buttons: Array,\n title: boolean | LangPackKey,\n titleRaw: string\n}>;\n\nexport interface PopupElementConstructable {\n new(...args: any[]): T;\n}\n\nconst DEFAULT_APPEND_TO = document.body;\nlet appendPopupTo = DEFAULT_APPEND_TO;\n\nconst onFullScreenChange = () => {\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\n PopupElement.reAppend();\n};\n\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\n\ntype PopupListeners = {\n close: () => void,\n closeAfterTimeout: () => void\n};\n\nexport default class PopupElement extends EventListenerBase {\n private static POPUPS: PopupElement[] = [];\n public static MANAGERS: AppManagers;\n\n protected element = document.createElement('div');\n protected container = document.createElement('div');\n protected header = document.createElement('div');\n protected title = document.createElement('div');\n protected btnClose: HTMLElement;\n protected btnConfirm: HTMLButtonElement;\n protected body: HTMLElement;\n protected buttonsEl: HTMLElement;\n\n protected onEscape: () => boolean = () => true;\n\n protected navigationItem: NavigationItem;\n\n protected listenerSetter: ListenerSetter;\n\n protected confirmShortcutIsSendShortcut: boolean;\n protected btnConfirmOnEnter: HTMLElement;\n\n protected withoutOverlay: boolean;\n\n protected managers: AppManagers;\n\n protected scrollable: Scrollable;\n\n protected buttons: Array;\n\n protected middlewareHelper: MiddlewareHelper;\n\n constructor(className: string, options: PopupOptions = {}) {\n super(false);\n this.element.classList.add('popup');\n this.element.className = 'popup' + (className ? ' ' + className : '');\n this.container.classList.add('popup-container', 'z-depth-1');\n\n this.header.classList.add('popup-header');\n\n if(options.title || options.titleRaw) {\n this.title.classList.add('popup-title');\n if(typeof(options.title) === 'string') {\n _i18n(this.title, options.title);\n } else if(options.titleRaw) {\n this.title.append(wrapEmojiText(options.titleRaw));\n }\n\n this.header.append(this.title);\n }\n\n this.middlewareHelper = getMiddleware();\n this.listenerSetter = new ListenerSetter();\n this.managers = PopupElement.MANAGERS;\n\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\n\n if(options.closable) {\n this.btnClose = document.createElement('span');\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\n // ripple(this.closeBtn);\n this.header.prepend(this.btnClose);\n\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\n }\n\n this.withoutOverlay = options.withoutOverlay;\n if(this.withoutOverlay) {\n this.element.classList.add('no-overlay');\n }\n\n if(options.overlayClosable) {\n attachClickEvent(this.element, (e: MouseEvent) => {\n if(!findUpClassName(e.target, 'popup-container')) {\n this.hide();\n }\n }, {listenerSetter: this.listenerSetter});\n }\n\n if(options.withConfirm) {\n this.btnConfirm = document.createElement('button');\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\n if(options.withConfirm !== true) {\n this.btnConfirm.append(i18n(options.withConfirm));\n }\n this.header.append(this.btnConfirm);\n ripple(this.btnConfirm);\n }\n\n this.container.append(this.header);\n if(options.body) {\n this.body = document.createElement('div');\n this.body.classList.add('popup-body');\n this.container.append(this.body);\n }\n\n if(options.scrollable) {\n const scrollable = this.scrollable = new Scrollable(this.body);\n this.attachScrollableListeners();\n\n if(!this.body) {\n this.container.insertBefore(scrollable.container, this.header.nextSibling);\n }\n }\n\n let btnConfirmOnEnter = this.btnConfirm;\n const buttons = this.buttons = options.buttons;\n if(buttons?.length) {\n const buttonsDiv = this.buttonsEl = document.createElement('div');\n buttonsDiv.classList.add('popup-buttons');\n\n const buttonsElements = buttons.map((b) => {\n const button = document.createElement('button');\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\n\n if(!b.noRipple) {\n ripple(button);\n }\n\n if(b.text) {\n button.textContent = b.text;\n } else {\n button.append(i18n(b.langKey, b.langArgs));\n }\n\n attachClickEvent(button, () => {\n b.callback?.();\n this.destroy();\n }, {listenerSetter: this.listenerSetter, once: true});\n\n return b.element = button;\n });\n\n if(!btnConfirmOnEnter && buttons.length === 2) {\n const button = buttons.find((button) => !button.isCancel);\n if(button) {\n btnConfirmOnEnter = button.element;\n }\n }\n\n buttonsDiv.append(...buttonsElements);\n this.container.append(buttonsDiv);\n }\n\n this.btnConfirmOnEnter = btnConfirmOnEnter;\n\n this.element.append(this.container);\n\n PopupElement.POPUPS.push(this);\n }\n\n protected attachScrollableListeners(setClassOn?: HTMLElement) {\n return this.scrollable.attachBorderListeners(setClassOn);\n }\n\n protected onContentUpdate() {\n if(this.scrollable) {\n this.scrollable.onAdditionalScroll();\n }\n }\n\n public show() {\n this.navigationItem = {\n type: 'popup',\n onPop: () => this.destroy(),\n onEscape: this.onEscape\n };\n\n appNavigationController.pushItem(this.navigationItem);\n\n blurActiveElement(); // * hide mobile keyboard\n appendPopupTo.append(this.element);\n void this.element.offsetWidth; // reflow\n this.element.classList.add('active');\n\n this.onContentUpdate();\n\n if(!this.withoutOverlay) {\n overlayCounter.isOverlayActive = true;\n animationIntersector.checkAnimations2(true);\n }\n\n // cannot add event instantly because keydown propagation will fire it\n // if(this.btnConfirmOnEnter) {\n setTimeout(() => {\n if(!this.element.classList.contains('active')) {\n return;\n }\n\n this.listenerSetter.add(document.body)('keydown', (e) => {\n if(PopupElement.POPUPS[PopupElement.POPUPS.length - 1] !== this) {\n return;\n }\n\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\n simulateClickEvent(this.btnConfirmOnEnter);\n cancelEvent(e);\n }\n });\n }, 0);\n // }\n }\n\n public hide = () => {\n appNavigationController.backByItem(this.navigationItem);\n };\n\n protected destroy() {\n this.dispatchEvent('close');\n this.element.classList.add('hiding');\n this.element.classList.remove('active');\n this.listenerSetter.removeAll();\n this.middlewareHelper.destroy();\n\n if(!this.withoutOverlay) {\n overlayCounter.isOverlayActive = false;\n }\n\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n\n indexOfAndSplice(PopupElement.POPUPS, this);\n\n // ! calm\n onFullScreenChange();\n\n setTimeout(() => {\n this.element.remove();\n this.dispatchEvent('closeAfterTimeout');\n this.cleanup();\n this.scrollable?.destroy();\n\n if(!this.withoutOverlay) {\n animationIntersector.checkAnimations2(false);\n }\n }, 150);\n }\n\n public static reAppend() {\n this.POPUPS.forEach((popup) => {\n const {element, container} = popup;\n const parentElement = element.parentElement;\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\n appendPopupTo.append(element);\n }\n });\n }\n\n public static getPopups(popupConstructor: PopupElementConstructable) {\n return this.POPUPS.filter((element) => element instanceof popupConstructor) as T[];\n }\n\n public static createPopup>(ctor: {new(...args: A): T}, ...args: A) {\n const popup = new ctor(...args);\n return popup;\n }\n}\n\nexport const addCancelButton = (buttons: PopupButton[]) => {\n const button = buttons.find((b) => b.isCancel);\n if(!button) {\n buttons.push({\n langKey: 'Cancel',\n isCancel: true\n });\n }\n\n return buttons;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {doubleRaf} from '../../helpers/schedulers';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {LangPackKey, _i18n, i18n} from '../../lib/langPack';\nimport {ApiLimitType} from '../../lib/mtproto/api_methods';\nimport rootScope from '../../lib/rootScope';\nimport PopupPeer from './peer';\n\nconst a: {[type in ApiLimitType]?: {\n title: LangPackKey,\n description: LangPackKey,\n descriptionPremium: LangPackKey,\n descriptionLocked: LangPackKey,\n icon: string\n}} = {\n pin: {\n title: 'LimitReached',\n description: 'LimitReachedPinDialogs',\n descriptionPremium: 'LimitReachedPinDialogsPremium',\n descriptionLocked: 'LimitReachedPinDialogsLocked',\n icon: 'limit_pin'\n },\n folders: {\n title: 'LimitReached',\n description: 'LimitReachedFolders',\n descriptionPremium: 'LimitReachedFoldersPremium',\n descriptionLocked: 'LimitReachedFoldersLocked',\n icon: 'limit_folders'\n }\n};\n\nclass P extends PopupPeer {\n constructor(options: {\n isPremium: boolean,\n limit: number,\n limitPremium: number\n }, _a: typeof a[keyof typeof a]) {\n super('popup-limit', {\n buttons: options.isPremium === undefined ? [{\n langKey: 'LimitReached.Ok',\n isCancel: true\n }] : (options.isPremium ? [{\n langKey: 'OK',\n isCancel: true\n }] : [{\n langKey: 'IncreaseLimit',\n callback: () => {\n appImManager.openPremiumBot();\n },\n noRipple: true\n }, {\n langKey: 'Cancel',\n isCancel: true\n }]),\n descriptionLangKey: options.isPremium === undefined ? _a.descriptionLocked : (options.isPremium ? _a.descriptionPremium : _a.description),\n descriptionLangArgs: options.isPremium ? [options.limitPremium] : [options.limit, options.limitPremium],\n titleLangKey: _a.title\n });\n\n const isLocked = options.isPremium === undefined;\n if(isLocked) {\n this.element.classList.add('is-locked');\n } else if(options.isPremium) {\n this.element.classList.add('is-premium');\n } else {\n const button = this.buttons.find((b) => !b.isCancel);\n button.element.classList.add('popup-limit-button');\n const i = document.createElement('i');\n i.classList.add('popup-limit-button-icon', 'tgico-premium_double');\n button.element.append(i);\n }\n\n const limitContainer = document.createElement('div');\n limitContainer.classList.add('popup-limit-line');\n\n const hint = document.createElement('div');\n hint.classList.add('popup-limit-hint');\n const i = document.createElement('span');\n i.classList.add('popup-limit-hint-icon', 'tgico-' + _a.icon);\n hint.append(i, '' + (options.isPremium ? options.limitPremium : options.limit));\n\n limitContainer.append(hint);\n\n if(!isLocked) {\n const limit = document.createElement('div');\n limit.classList.add('limit-line');\n\n const free = document.createElement('div');\n free.classList.add('limit-line-free');\n\n const premium = document.createElement('div');\n premium.classList.add('limit-line-premium');\n\n limit.append(free, premium);\n\n _i18n(free, 'LimitFree');\n premium.append(i18n('LimitPremium'), '' + options.limitPremium);\n\n limitContainer.append(limit);\n }\n\n this.container.insertBefore(limitContainer, this.description);\n\n // if(options.isPremium === false) {\n // this.buttons.pop().element.remove();\n // }\n\n const setHintActive = () => {\n hint.classList.add('active');\n };\n\n if(rootScope.settings.animationsEnabled) {\n doubleRaf().then(setHintActive);\n } else {\n setHintActive();\n }\n }\n}\n\nexport default async function showLimitPopup(type: keyof typeof a) {\n const _a = a[type];\n const [appConfig, limit, limitPremium] = await Promise.all([\n rootScope.managers.apiManager.getAppConfig(),\n ...[false, true].map((v) => rootScope.managers.apiManager.getLimit(type, v))\n ]);\n const isLocked = appConfig.premium_purchase_blocked;\n new P({\n isPremium: isLocked ? undefined : rootScope.premium,\n limit,\n limitPremium\n }, _a).show();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport tsNow from '../../helpers/tsNow';\nimport {LangPackKey} from '../../lib/langPack';\nimport {MUTE_UNTIL} from '../../lib/mtproto/mtproto_config';\nimport {RadioFormFromValues} from '../row';\nimport PopupPeer from './peer';\n\nconst ONE_HOUR = 3600;\nconst times: {value: number | string, langPackKey: LangPackKey, checked?: boolean}[] = [{\n value: ONE_HOUR,\n langPackKey: 'ChatList.Mute.1Hour'\n}, {\n value: ONE_HOUR * 4,\n langPackKey: 'ChatList.Mute.4Hours'\n}, {\n value: ONE_HOUR * 8,\n langPackKey: 'ChatList.Mute.8Hours'\n}, {\n value: ONE_HOUR * 24,\n langPackKey: 'ChatList.Mute.1Day'\n}, {\n value: ONE_HOUR * 24 * 3,\n langPackKey: 'ChatList.Mute.3Days'\n}, {\n value: -1,\n langPackKey: 'ChatList.Mute.Forever',\n checked: true\n}];\n\nexport default class PopupMute extends PopupPeer {\n constructor(peerId: PeerId, threadId?: number) {\n super('popup-mute', {\n peerId,\n titleLangKey: 'Notifications',\n buttons: [{\n langKey: 'ChatList.Context.Mute',\n callback: () => {\n this.managers.appMessagesManager.mutePeer({peerId, muteUntil: time === -1 ? MUTE_UNTIL : tsNow(true) + time, threadId});\n }\n }],\n body: true\n });\n\n let time: number;\n const radioForm = RadioFormFromValues(times, (value) => {\n time = +value;\n });\n\n this.body.append(radioForm);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from '../avatar';\nimport PopupElement, {addCancelButton, PopupButton, PopupOptions} from '.';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport CheckboxField, {CheckboxFieldOptions} from '../checkboxField';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\n\nexport type PopupPeerButton = Omit & Partial<{callback: PopupPeerButtonCallback}>;\nexport type PopupPeerButtonCallbackCheckboxes = Set;\nexport type PopupPeerButtonCallback = (checkboxes?: PopupPeerButtonCallbackCheckboxes) => void;\nexport type PopupPeerCheckboxOptions = CheckboxFieldOptions & {checkboxField?: CheckboxField};\n\nexport type PopupPeerOptions = Omit & Partial<{\n peerId: PeerId,\n threadId: number,\n title: string | HTMLElement,\n titleLangKey: LangPackKey,\n titleLangArgs: any[],\n noTitle: boolean,\n description: string | DocumentFragment,\n descriptionLangKey: LangPackKey,\n descriptionLangArgs: any[],\n buttons: Array,\n checkboxes: Array\n}>;\nexport default class PopupPeer extends PopupElement {\n protected description: HTMLParagraphElement;\n\n constructor(private className: string, options: PopupPeerOptions = {}) {\n super('popup-peer' + (className ? ' ' + className : ''), {\n overlayClosable: true,\n ...options,\n title: true,\n buttons: options.buttons && addCancelButton(options.buttons)\n });\n\n if(options.peerId) {\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('avatar-32');\n avatarEl.updateWithOptions({\n isDialog: true,\n peerId: options.peerId,\n threadId: options.threadId,\n wrapOptions: {\n middleware: this.middlewareHelper.get()\n }\n });\n this.header.prepend(avatarEl);\n }\n\n if(!options.noTitle) {\n if(options.titleLangKey || !options.title) this.title.append(i18n(options.titleLangKey || 'AppName', options.titleLangArgs));\n else if(options.title instanceof HTMLElement) {\n this.title.append(options.title);\n } else this.title.innerText = options.title || '';\n }\n\n const fragment = document.createDocumentFragment();\n\n if(options.descriptionLangKey || options.description) {\n const p = this.description = document.createElement('p');\n p.classList.add('popup-description');\n if(options.descriptionLangKey) p.append(i18n(options.descriptionLangKey, options.descriptionLangArgs));\n else if(options.description) setInnerHTML(p, options.description);\n\n fragment.append(p);\n }\n\n if(options.checkboxes) {\n this.container.classList.add('have-checkbox');\n\n options.checkboxes.forEach((o) => {\n o.withRipple = true;\n const checkboxField = new CheckboxField(o);\n o.checkboxField = checkboxField;\n fragment.append(checkboxField.label);\n });\n\n options.buttons.forEach((button) => {\n if(button.callback) {\n const original = button.callback;\n button.callback = () => {\n const c: Set = new Set();\n options.checkboxes.forEach((o) => {\n if(o.checkboxField.checked) {\n c.add(o.text);\n }\n });\n original(c);\n };\n }\n });\n }\n\n this.container.insertBefore(fragment, this.header.nextElementSibling);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport AppSelectPeers from '../appSelectPeers';\nimport PopupElement from '.';\nimport {LangPackKey, _i18n} from '../../lib/langPack';\n\nexport default class PopupPickUser extends PopupElement {\n protected selector: AppSelectPeers;\n\n constructor(options: {\n peerTypes: AppSelectPeers['peerType'],\n onSelect?: (peerId: PeerId) => Promise | void,\n placeholder: LangPackKey,\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\n peerId?: number,\n selfPresence?: LangPackKey\n }) {\n super('popup-forward', {closable: true, overlayClosable: true, body: true, title: true});\n\n this.selector = new AppSelectPeers({\n appendTo: this.body,\n onChange: async() => {\n const selected = this.selector.getSelected();\n const peerId = selected[selected.length - 1].toPeerId();\n\n if(options.onSelect) {\n const res = options.onSelect(peerId);\n if(res instanceof Promise) {\n try {\n await res;\n } catch(err) {\n return;\n }\n }\n }\n\n this.selector = null;\n this.hide();\n },\n peerType: options.peerTypes,\n onFirstRender: () => {\n this.show();\n this.selector.checkForTriggers(); // ! due to zero height before mounting\n\n if(!IS_TOUCH_SUPPORTED) {\n this.selector.input.focus();\n }\n },\n chatRightsAction: options.chatRightsAction,\n multiSelect: false,\n rippleEnabled: false,\n avatarSize: 'abitbigger',\n peerId: options.peerId,\n placeholder: options.placeholder,\n selfPresence: options.selfPresence,\n managers: this.managers\n });\n\n this.scrollable = this.selector.scrollable;\n this.attachScrollableListeners();\n\n // this.scrollable = new Scrollable(this.body);\n\n this.title.append(this.selector.input);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupPeer from './peer';\n\nexport default class PopupSendNow extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-delete-chat', {\n title: `Send Message${mids.length > 1 ? 's' : ''} Now`,\n description: mids.length > 1 ? 'Send ' + mids.length + ' messages now?' : 'Send message now?',\n buttons: [{\n langKey: 'Send',\n callback: () => {\n onConfirm && onConfirm();\n this.managers.appMessagesManager.sendScheduledMessages(peerId, mids);\n }\n }]\n });\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppStickersManager} from '../../lib/appManagers/appStickersManager';\nimport PopupElement from '.';\nimport wrapSticker from '../wrappers/sticker';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport {putPreloader} from '../putPreloader';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {i18n} from '../../lib/langPack';\nimport Button from '../button';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {toastNew} from '../toast';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport createStickersContextMenu from '../../helpers/dom/createStickersContextMenu';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport {Document, StickerSet} from '../../layer';\nimport Row from '../row';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport rootScope from '../../lib/rootScope';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport emoticonsDropdown from '../emoticonsDropdown';\n\nconst ANIMATION_GROUP: AnimationItemGroup = 'STICKERS-POPUP';\n\nexport default class PopupStickers extends PopupElement {\n private stickersFooter: HTMLElement;\n private appendTo: HTMLElement;\n private updateAdded: {[setId: Long]: (added: boolean) => void};\n private sets: StickerSet.stickerSet[];\n private button: HTMLElement;\n\n constructor(\n private stickerSetInput: Parameters[0] | Parameters[0][],\n private isEmojis?: boolean\n ) {\n super('popup-stickers', {closable: true, overlayClosable: true, body: true, scrollable: true, title: true});\n\n this.title.append(i18n('Loading'));\n this.updateAdded = {};\n\n emoticonsDropdown.setIgnoreMouseOut('popup', true);\n this.addEventListener('close', () => {\n emoticonsDropdown.setIgnoreMouseOut('popup', false);\n animationIntersector.setOnlyOnePlayableGroup();\n });\n\n this.appendTo = this.scrollable.container;\n\n this.appendTo.classList.add('is-loading');\n putPreloader(this.appendTo, true);\n\n this.stickersFooter = document.createElement('div');\n this.stickersFooter.classList.add('sticker-set-footer');\n\n const btn = Button('btn-primary btn-primary-transparent disable-hover', {noRipple: true, text: 'Loading'});\n this.stickersFooter.append(btn);\n\n this.body.append(this.stickersFooter);\n\n attachStickerViewerListeners({listenTo: this.appendTo, listenerSetter: this.listenerSetter});\n\n const onStickerSetUpdate = (set: StickerSet.stickerSet) => {\n const idx = this.sets.findIndex((_set) => _set.id === set.id);\n if(idx === -1) {\n return;\n }\n\n this.sets[idx] = set;\n const updateAdded = this.updateAdded[set.id];\n updateAdded?.(!!set.installed_date);\n this.updateButton();\n };\n\n this.listenerSetter.add(rootScope)('stickers_installed', onStickerSetUpdate);\n this.listenerSetter.add(rootScope)('stickers_deleted', onStickerSetUpdate);\n\n this.loadStickerSet();\n }\n\n private createStickerSetElements(set?: StickerSet.stickerSet) {\n const container = document.createElement('div');\n container.classList.add('sticker-set');\n\n let headerRow: Row, updateAdded: (added: boolean) => void;\n if(set) {\n headerRow = new Row({\n title: wrapEmojiText(set.title),\n subtitle: i18n(set.pFlags.emojis ? 'EmojiCount' : 'Stickers', [set.count]),\n buttonRight: true\n });\n\n updateAdded = (added) => {\n replaceContent(headerRow.buttonRight, i18n(added ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n headerRow.buttonRight.classList.toggle('active', added);\n };\n\n updateAdded(!!set.installed_date);\n\n container.append(headerRow.container);\n }\n\n const itemsContainer = document.createElement('div');\n itemsContainer.classList.add('sticker-set-stickers');\n\n container.append(itemsContainer);\n\n return {container, headerRow, updateAdded, itemsContainer};\n }\n\n private onStickersClick = async(e: MouseEvent) => {\n const target = findUpClassName(e.target, 'sticker-set-sticker');\n if(!target) return;\n\n const docId = target.dataset.docId;\n if(await appImManager.chat.input.sendMessageWithDocument(docId)) {\n this.hide();\n }\n };\n\n private async loadStickerSet() {\n const middleware = this.middlewareHelper.get();\n const inputs = Array.isArray(this.stickerSetInput) ? this.stickerSetInput : [this.stickerSetInput];\n const setsPromises = inputs.map((input) => this.managers.appStickersManager.getStickerSet(input));\n let sets = await Promise.all(setsPromises);\n if(!middleware()) return;\n let firstSet = sets[0];\n if(sets.length === 1 && !firstSet) {\n toastNew({langPackKey: this.isEmojis ? 'AddEmojiNotFound' : 'StickerSet.DontExist'});\n this.hide();\n return;\n }\n\n sets = sets.filter(Boolean);\n firstSet = sets[0];\n\n this.sets = sets.map((set) => set.set);\n\n const isEmojis = this.isEmojis ??= !!firstSet.set.pFlags.emojis;\n\n if(!isEmojis) {\n attachClickEvent(this.appendTo, this.onStickersClick, {listenerSetter: this.listenerSetter});\n\n const {destroy} = createStickersContextMenu({\n listenTo: this.appendTo,\n isStickerPack: true,\n onSend: () => this.hide()\n });\n\n this.addEventListener('close', destroy);\n }\n\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\n\n const lazyLoadQueue = new LazyLoadQueue();\n const loadPromises: Promise[] = [];\n\n const containersPromises = sets.map(async(set) => {\n const {container, itemsContainer, headerRow, updateAdded} = this.createStickerSetElements(sets.length > 1 ? set.set : undefined);\n\n if(headerRow) {\n attachClickEvent(headerRow.buttonRight, () => {\n this.managers.appStickersManager.toggleStickerSet(set.set);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.updateAdded[set.set.id] = updateAdded;\n\n let divs: (HTMLElement | DocumentFragment)[];\n\n const docs = set.documents.filter((doc) => doc?._ === 'document') as Document.document[];\n if(isEmojis) {\n const fragment = wrapCustomEmoji({\n docIds: docs.map((doc) => doc.id),\n loadPromises,\n animationGroup: ANIMATION_GROUP,\n customEmojiSize: mediaSizes.active.esgCustomEmoji,\n middleware\n // lazyLoadQueue\n });\n\n (Array.from(fragment.children) as HTMLElement[]).slice(1).forEach((element) => {\n const span = document.createElement('span');\n span.classList.add('super-emoji');\n element.replaceWith(span);\n span.append(element);\n });\n\n divs = [fragment];\n\n itemsContainer.classList.replace('sticker-set-stickers', 'super-emojis');\n itemsContainer.classList.add('is-emojis', 'not-local');\n } else {\n divs = await Promise.all(docs.map(async(doc) => {\n const div = document.createElement('div');\n div.classList.add('sticker-set-sticker');\n\n const size = mediaSizes.active.popupSticker.width;\n\n await wrapSticker({\n doc,\n div,\n lazyLoadQueue,\n group: ANIMATION_GROUP,\n play: true,\n loop: true,\n width: size,\n height: size,\n withLock: true,\n loadPromises,\n middleware\n });\n\n return div;\n }));\n }\n\n itemsContainer.append(...divs.filter(Boolean));\n\n return container;\n });\n\n const containers = await Promise.all(containersPromises);\n await Promise.all(loadPromises);\n\n const button = this.button = Button('', {noRipple: true});\n\n this.updateButton();\n\n attachClickEvent(button, () => {\n const toggle = toggleDisability([button], true);\n\n this.managers.appStickersManager.toggleStickerSets(sets.map((set) => set.set)).then(() => {\n this.hide();\n }).catch(() => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n\n if(sets.length === 1) {\n setInnerHTML(this.title, wrapEmojiText(firstSet.set.title));\n } else {\n setInnerHTML(this.title, i18n('Emoji'));\n }\n\n this.stickersFooter.textContent = '';\n this.stickersFooter.append(button);\n\n this.appendTo.classList.remove('is-loading');\n this.appendTo.textContent = '';\n this.appendTo.append(...containers);\n\n this.scrollable.onAdditionalScroll();\n }\n\n private updateButton() {\n const {sets, isEmojis} = this;\n let isAdd: boolean, buttonAppend: HTMLElement;\n if(sets.length === 1) {\n const firstSet = sets[0];\n buttonAppend = i18n(isEmojis ? 'EmojiCount' : 'Stickers', [firstSet.count]);\n isAdd = !firstSet.installed_date;\n } else {\n const installed = sets.filter((set) => set.installed_date);\n let count: number;\n if(sets.length === installed.length) {\n isAdd = false;\n count = sets.length;\n } else {\n isAdd = true;\n count = sets.length - installed.length;\n }\n\n buttonAppend = i18n('EmojiPackCount', [count]);\n }\n\n this.button.className = isAdd ? 'btn-primary btn-color-primary' : 'btn-primary btn-primary-transparent danger';\n replaceContent(this.button, i18n(isAdd ? 'AddStickersCount' : 'RemoveStickersCount', [buttonAppend]));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CancellablePromise} from '../helpers/cancellablePromise';\nimport SetTransition from './singleTransition';\nimport {fastRaf} from '../helpers/schedulers';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport safeAssign from '../helpers/object/safeAssign';\n\nconst TRANSITION_TIME = 200;\n\nexport default class ProgressivePreloader {\n public preloader: HTMLDivElement;\n public circle: SVGCircleElement;\n private cancelSvg: SVGSVGElement;\n private downloadSvg: HTMLElement;\n\n private tempId = 0;\n public detached = true;\n\n public promise: CancellablePromise = null;\n\n public isUpload = false;\n private cancelable = true;\n private streamable = false;\n private tryAgainOnFail = true;\n private attachMethod: 'append' | 'prepend' = 'append';\n\n public loadFunc: (e?: Event) => any;\n\n public totalLength: number;\n\n constructor(options?: Partial<{\n isUpload: ProgressivePreloader['isUpload'],\n cancelable: ProgressivePreloader['cancelable'],\n streamable: ProgressivePreloader['streamable'],\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\n attachMethod: ProgressivePreloader['attachMethod']\n }>) {\n if(options) {\n safeAssign(this, options);\n }\n\n if(this.isUpload) {\n this.tryAgainOnFail = false;\n }\n }\n\n public constructContainer(options: Partial<{\n color: 'transparent',\n bold: boolean\n }> = {}) {\n if(!this.preloader) {\n this.preloader = document.createElement('div');\n this.preloader.classList.add('preloader-container');\n\n if(options.color) {\n this.preloader.classList.add('preloader-' + options.color);\n }\n\n if(options.bold) {\n this.preloader.classList.add('preloader-bold');\n }\n\n if(this.streamable) {\n this.preloader.classList.add('preloader-streamable');\n }\n }\n }\n\n public constructDownloadIcon() {\n this.constructContainer();\n }\n\n public construct() {\n this.construct = null;\n\n this.constructContainer();\n\n this.preloader.innerHTML = `\n
\n \n \n \n
`;\n\n if(this.streamable) {\n this.totalLength = 118.61124420166016;\n } else {\n this.totalLength = 149.82473754882812;\n }\n\n if(this.cancelable) {\n this.preloader.innerHTML += `\n \n \n \n \n \n \n \n \n \n \n \n `;\n\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\n } else {\n this.preloader.classList.add('preloader-swing');\n }\n\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\n\n if(this.cancelable) {\n attachClickEvent(this.preloader, this.onClick);\n }\n }\n\n public onClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.preloader.classList.contains('manual')) {\n if(this.loadFunc) {\n this.loadFunc(e);\n }\n } else {\n if(this.promise && this.promise.cancel) {\n this.promise.cancel();\n }\n }\n };\n\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\n this.loadFunc = func;\n }\n\n public setManual() {\n this.preloader.classList.add('manual');\n this.setProgress(0);\n }\n\n public attachPromise(promise: CancellablePromise) {\n if(this.isUpload && this.promise) return;\n\n this.promise = promise;\n\n const tempId = --this.tempId;\n const startTime = Date.now();\n\n const onEnd = (err: Error) => {\n promise.notify = promise.notifyAll = null;\n\n if(tempId !== this.tempId) {\n return;\n }\n\n const elapsedTime = Date.now() - startTime;\n\n // console.log('[PP]: end', this.detached, performance.now());\n\n if(!err && this.cancelable) {\n this.setProgress(100);\n\n const delay = TRANSITION_TIME * 0.75;\n\n if(elapsedTime < delay) {\n this.detach();\n } else {\n setTimeout(() => { // * wait for transition complete\n if(tempId === this.tempId) {\n this.detach();\n }\n }, delay);\n }\n } else {\n if(this.tryAgainOnFail) {\n this.attach(this.preloader.parentElement);\n fastRaf(() => {\n this.setManual();\n });\n } else {\n this.detach();\n }\n }\n\n this.promise = promise = null;\n };\n\n promise\n .then(() => onEnd(null))\n .catch((err) => onEnd(err));\n\n if(promise.addNotifyListener) {\n promise.addNotifyListener((details: {done: number, total: number}) => {\n /* if(details.done >= details.total) {\n onEnd();\n } */\n\n if(tempId !== this.tempId) return;\n\n // console.log('preloader download', promise, details);\n const percents = details.done / details.total * 100;\n this.setProgress(percents);\n });\n }\n }\n\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\n if(this.construct) {\n this.construct();\n }\n\n if(this.preloader.parentElement) {\n this.preloader.classList.remove('manual');\n }\n\n this.detached = false;\n\n if(promise/* && false */) {\n this.attachPromise(promise);\n }\n\n let useRafs = 0;\n if(this.detached || this.preloader.parentElement !== elem) {\n useRafs = isInDOM(this.preloader) ? 1 : 2;\n if(this.preloader.parentElement !== elem) {\n elem[this.attachMethod](this.preloader);\n }\n }\n\n SetTransition({\n element: this.preloader,\n className: 'is-visible',\n forwards: true,\n duration: TRANSITION_TIME,\n useRafs\n });\n\n if(this.cancelable && reset) {\n this.setProgress(0);\n }\n }\n\n public detach() {\n if(this.detached) {\n return;\n }\n // return;\n\n this.detached = true;\n\n // return;\n\n if(this.preloader?.parentElement) {\n /* setTimeout(() => */// fastRaf(() => {\n /* if(!this.detached) return;\n this.detached = true; */\n\n // fastRaf(() => {\n // console.log('[PP]: detach after rAF', this.detached, performance.now());\n\n // if(!this.detached || !this.preloader.parentElement) {\n // return;\n // }\n\n SetTransition({\n element: this.preloader,\n className: 'is-visible',\n forwards: false,\n duration: TRANSITION_TIME,\n onTransitionEnd: () => {\n this.preloader.remove();\n },\n useRafs: 1\n });\n // });\n // })/* , 5e3) */;\n }\n }\n\n public setProgress(percents: number) {\n if(!this.totalLength && !isInDOM(this.circle)) {\n return;\n }\n\n if(percents === 0) {\n this.circle.style.strokeDasharray = '';\n return;\n }\n\n try {\n if(!this.totalLength) {\n this.totalLength = this.circle.getTotalLength();\n }\n\n // console.log('setProgress', (percents / 100 * totalLength));\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\n } catch(err) {}\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {PeerPhotoSize} from '../lib/appManagers/appAvatarsManager';\nimport getPreviewURLFromBytes from '../helpers/bytes/getPreviewURLFromBytes';\nimport {renderImageFromUrlPromise} from '../helpers/dom/renderImageFromUrl';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {recordPromise} from '../helpers/recordPromise';\nimport sequentialDom from '../helpers/sequentialDom';\nimport {UserProfilePhoto, ChatPhoto, User, Chat} from '../layer';\nimport getPeerColorById from '../lib/appManagers/utils/peers/getPeerColorById';\nimport getPeerPhoto from '../lib/appManagers/utils/peers/getPeerPhoto';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\nimport rootScope from '../lib/rootScope';\nimport getPeerInitials from './wrappers/getPeerInitials';\nimport {wrapTopicIcon} from './wrappers/messageActionTextNewUnsafe';\nimport makeError from '../helpers/makeError';\nimport noop from '../helpers/noop';\n\nexport async function putAvatar(\n div: HTMLElement,\n peerId: PeerId,\n photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto,\n size: PeerPhotoSize,\n img = new Image(),\n onlyThumb = false\n) {\n const r = await rootScope.managers.acknowledged.appAvatarsManager.loadAvatar(peerId, photo, size);\n const loadPromise = r.result;\n const cached = r.cached;\n\n img.classList.add('avatar-photo');\n\n let renderThumbPromise: Promise;\n let callback: () => void;\n let thumbImage: HTMLImageElement;\n if(cached) {\n // смотри в misc.ts: renderImageFromUrl\n callback = () => {\n replaceContent(div, img);\n div.dataset.color = '';\n };\n } else {\n const animate = rootScope.settings.animationsEnabled;\n if(animate) {\n img.classList.add('fade-in');\n }\n\n let isFullLoaded = false;\n if(size === 'photo_big') { // let's load small photo first\n const res = await putAvatar(div, peerId, photo, 'photo_small');\n renderThumbPromise = res.loadThumbPromise || res.loadPromise;\n thumbImage = res.thumbImage;\n } else if(photo.stripped_thumb) {\n thumbImage = new Image();\n div.classList.add('avatar-relative');\n thumbImage.classList.add('avatar-photo', 'avatar-photo-thumbnail');\n const url = getPreviewURLFromBytes(photo.stripped_thumb);\n renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => {\n if(isFullLoaded) {\n return;\n }\n\n replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\n isFullLoaded = true;\n\n if(thumbImage) {\n div.append(img);\n } else {\n replaceContent(div, img);\n }\n\n setTimeout(() => {\n if(div.childElementCount) {\n sequentialDom.mutateElement(img, () => {\n div.dataset.color = '';\n\n if(animate) {\n img.classList.remove('fade-in');\n }\n\n thumbImage?.remove();\n });\n }\n }, animate ? 200 : 0);\n };\n }\n\n const renderPromise = loadPromise\n .then((url) => renderImageFromUrlPromise(img, url/* , !cached */))\n .then(callback);\n\n renderThumbPromise && await renderThumbPromise.catch(noop);\n\n return {\n cached,\n loadPromise: renderPromise,\n loadThumbPromise: cached ? renderPromise : renderThumbPromise || Promise.resolve(),\n thumbImage\n };\n}\n\nfunction set(\n div: HTMLElement,\n innerHTML: Parameters[1],\n color: string,\n icon?: string,\n isForum?: boolean,\n isTopic?: boolean\n) {\n setInnerHTML(div, innerHTML);\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled', 'is-forum', 'is-topic');\n icon && div.classList.add(icon);\n isForum && div.classList.add('is-forum');\n isTopic && div.classList.add('is-topic');\n}\n\n// peerId === peerId || title\nexport default async function putPhoto({\n div,\n peerId,\n isDialog = false,\n title = '',\n onlyThumb = false,\n isBig,\n threadId,\n wrapOptions = {}\n}: {\n div: HTMLElement,\n peerId: PeerId,\n isDialog?: boolean,\n title?: string,\n onlyThumb?: boolean,\n isBig?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions\n}) {\n const myId = rootScope.myId;\n\n if(peerId === myId && isDialog) {\n set(div, '', '', 'tgico-saved');\n return;\n }\n\n const managers = rootScope.managers;\n\n if(threadId) {\n const topic = await managers.dialogsStorage.getForumTopic(peerId, threadId);\n set(div, '', '', undefined, undefined, true);\n\n if(wrapOptions.customEmojiSize) {\n div.style.setProperty('--size', wrapOptions.customEmojiSize.width + 'px');\n }\n\n return wrapTopicIcon({\n ...wrapOptions,\n topic,\n lazyLoadQueue: false\n }).then((icon) => {\n div.replaceChildren(icon);\n });\n }\n\n const peer = await managers.appPeersManager.getPeer(peerId);\n if(peerId !== NULL_PEER_ID && peerId.isUser() && (peer as User.user)?.pFlags?.deleted) {\n set(div, '', getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n\n const isForum = !!(peer as Chat.channel)?.pFlags?.forum;\n const size: PeerPhotoSize = isBig ? 'photo_big' : 'photo_small';\n const photo = getPeerPhoto(peer);\n const avatarAvailable = !!photo;\n const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji');\n if(!avatarAvailable || !avatarRendered || !(await managers.appAvatarsManager.isAvatarCached(peerId, size))) {\n let color = '';\n if(peerId && (peerId !== myId || !isDialog)) {\n color = getPeerColorById(peerId);\n }\n\n if(peerId === REPLIES_PEER_ID) {\n set(div, '', color, 'tgico-reply_filled');\n return;\n }\n\n const abbr = title ? wrapAbbreviation(title) : getPeerInitials(peer);\n set(div, abbr, color, '', isForum);\n // return Promise.resolve(true);\n }\n\n if(avatarAvailable/* && false */) {\n const promise = putAvatar(div, peerId, photo, size, undefined, onlyThumb);\n // recordPromise(promise, 'putAvatar-' + peerId);\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Chat, User} from '../../layer';\nimport wrapAbbreviation from '../../lib/richTextProcessor/wrapAbbreviation';\n\nexport default function getPeerInitials(peer: Chat | User) {\n let str = '';\n if(peer) {\n str = (peer as Chat.chat).title ?? [\n (peer as User.user).first_name,\n (peer as User.user).last_name\n ].filter(Boolean).join(' ');\n }\n\n return wrapAbbreviation(str);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\n\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\n const html = `\n \n \n `;\n\n if(returnDiv) {\n const div = document.createElement('div');\n div.classList.add('preloader');\n div.innerHTML = html;\n\n if(elem) {\n elem.appendChild(div);\n }\n\n return div;\n }\n\n elem.insertAdjacentHTML('beforeend', html);\n return elem.lastElementChild as HTMLElement;\n}\n\nMOUNT_CLASS_TO.putPreloader = putPreloader;\n\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\n elem.classList.remove('tgico-' + icon);\n elem.disabled = true;\n putPreloader(elem);\n\n return () => {\n elem.innerHTML = '';\n elem.classList.add('tgico-' + icon);\n elem.removeAttribute('disabled');\n };\n}\n\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\n Array.from(elements).forEach((el) => {\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\n if(!match) return;\n to[match[1]] = el as HTMLElement;\n });\n} */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getDeepProperty from '../helpers/object/getDeepProperty';\nimport {LangPackKey, _i18n} from '../lib/langPack';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport rootScope from '../lib/rootScope';\n\nexport default class RadioField {\n public input: HTMLInputElement;\n public label: HTMLLabelElement;\n public main: HTMLElement;\n\n constructor(options: {\n text?: string,\n langKey?: LangPackKey,\n name: string,\n value?: string,\n stateKey?: string,\n alignRight?: boolean\n }) {\n const label = this.label = document.createElement('label');\n label.classList.add('radio-field');\n\n if(options.alignRight) {\n label.classList.add('radio-field-right');\n }\n\n const input = this.input = document.createElement('input');\n input.type = 'radio';\n /* input.id = */input.name = 'input-radio-' + options.name;\n\n if(options.value) {\n input.value = options.value;\n\n if(options.stateKey) {\n apiManagerProxy.getState().then((state) => {\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\n });\n\n input.addEventListener('change', () => {\n rootScope.managers.appStateManager.setByKey(options.stateKey, options.value);\n });\n }\n }\n\n const main = this.main = document.createElement('div');\n main.classList.add('radio-field-main');\n\n if(options.text) {\n main.innerHTML = options.text;\n /* const caption = document.createElement('div');\n caption.classList.add('radio-field-main-caption');\n caption.innerHTML = text;\n\n if(subtitle) {\n label.classList.add('radio-field-with-subtitle');\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\n }\n\n main.append(caption); */\n } else if(options.langKey) {\n _i18n(main, options.langKey);\n }\n\n label.append(input, main);\n }\n\n get checked() {\n return this.input.checked;\n }\n\n set checked(checked: boolean) {\n this.setValueSilently(checked);\n\n const event = new Event('change', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(checked: boolean) {\n this.input.checked = checked;\n }\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function RadioForm(radios: {container: HTMLElement, input: HTMLInputElement}[], onChange: (value: string, event: Event) => void) {\n const form = document.createElement('form');\n\n radios.forEach((r) => {\n const {container, input} = r;\n form.append(container);\n input.addEventListener('change', (e) => {\n if(input.checked) {\n onChange(input.value, e);\n }\n });\n });\n\n return form;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport attachGrabListeners, {GrabEvent} from '../helpers/dom/attachGrabListeners';\nimport clamp from '../helpers/number/clamp';\nimport safeAssign from '../helpers/object/safeAssign';\n\nexport default class RangeSelector {\n public container: HTMLDivElement;\n protected filled: HTMLDivElement;\n protected seek: HTMLInputElement;\n\n public mousedown = false;\n protected rect: DOMRect;\n protected _removeListeners: () => void;\n\n private events: Partial<{\n // onMouseMove: ProgressLine['onMouseMove'],\n onMouseDown: RangeSelector['onMouseDown'],\n onMouseUp: RangeSelector['onMouseUp'],\n onScrub: (value: number) => void\n }> = {};\n\n protected decimals: number;\n\n protected step: number;\n protected min: number;\n protected max: number;\n protected withTransition = false;\n protected useTransform = false;\n protected vertical = false;\n\n constructor(\n options: {\n step: RangeSelector['step'],\n min: RangeSelector['min'],\n max: RangeSelector['max'],\n withTransition?: RangeSelector['withTransition'],\n useTransform?: RangeSelector['useTransform'],\n vertical?: RangeSelector['vertical']\n },\n value = 0\n ) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('progress-line');\n\n // there is no sense in using transition with transform, because it is updating every frame\n if(this.useTransform) {\n this.container.classList.add('use-transform');\n } else if(this.withTransition) {\n this.container.classList.add('with-transition');\n }\n\n this.filled = document.createElement('div');\n this.filled.classList.add('progress-line__filled');\n\n const seek = this.seek = document.createElement('input');\n seek.classList.add('progress-line__seek');\n // seek.setAttribute('max', '0');\n seek.type = 'range';\n seek.step = '' + this.step;\n seek.min = '' + this.min;\n seek.max = '' + this.max;\n seek.value = '' + value;\n\n if(value) {\n this.setProgress(value);\n }\n\n const stepStr = '' + this.step;\n const index = stepStr.indexOf('.');\n this.decimals = index === -1 ? 0 : stepStr.length - index - 1;\n\n // this.setListeners();\n\n this.container.append(this.filled, seek);\n }\n\n get value() {\n return +this.seek.value;\n }\n\n public setHandlers(events: RangeSelector['events']) {\n this.events = events;\n }\n\n protected onMouseMove = (event: GrabEvent) => {\n this.scrub(event);\n };\n\n protected onMouseDown = (event: GrabEvent) => {\n this.rect = this.container.getBoundingClientRect();\n this.mousedown = true;\n this.scrub(event);\n this.container.classList.add('is-focused');\n this.events?.onMouseDown && this.events.onMouseDown(event);\n };\n\n protected onMouseUp = (event: GrabEvent) => {\n this.mousedown = false;\n this.container.classList.remove('is-focused');\n this.events?.onMouseUp && this.events.onMouseUp(event);\n };\n\n public setListeners() {\n this.seek.addEventListener('input', this.onInput);\n this._removeListeners = attachGrabListeners(this.container, this.onMouseDown, this.onMouseMove, this.onMouseUp);\n }\n\n public onInput = () => {\n const value = +this.seek.value;\n this.setFilled(value);\n this.events?.onScrub && this.events.onScrub(value);\n };\n\n public setProgress(value: number) {\n this.seek.value = '' + value;\n this.setFilled(+this.seek.value); // clamp\n }\n\n public addProgress(value: number) {\n this.seek.value = '' + (+this.seek.value + value);\n this.setFilled(+this.seek.value); // clamp\n }\n\n public setFilled(value: number) {\n let percents = (value - this.min) / (this.max - this.min);\n percents = clamp(percents, 0, 1);\n\n // using scaleX and width even with vertical because it will be rotated\n if(this.useTransform) {\n this.filled.style.transform = `scaleX(${percents})`;\n } else {\n this.filled.style.width = (percents * 100) + '%';\n }\n }\n\n protected scrub(event: GrabEvent) {\n const rectMax = this.vertical ? this.rect.height : this.rect.width;\n const offsetAxisValue = clamp(this.vertical ? -(event.y - this.rect.bottom) : event.x - this.rect.left, 0, rectMax);\n\n let value = this.min + (offsetAxisValue / rectMax * (this.max - this.min));\n\n if((value - this.min) < ((this.max - this.min) / 2)) {\n value -= this.step / 10;\n }\n\n value = +value.toFixed(this.decimals);\n value = clamp(value, this.min, this.max);\n\n // this.seek.value = '' + value;\n // this.onInput();\n\n this.setProgress(value);\n this.events?.onScrub && this.events.onScrub(value);\n\n return value;\n }\n\n public removeListeners() {\n if(this._removeListeners) {\n this._removeListeners();\n this._removeListeners = null;\n }\n\n this.seek.removeEventListener('input', this.onInput);\n\n this.events = {};\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport sequentialDom from '../helpers/sequentialDom';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport rootScope from '../lib/rootScope';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport {fastRaf} from '../helpers/schedulers';\n\nlet rippleClickId = 0;\nexport default function ripple(\n elem: HTMLElement,\n callback: (id: number) => Promise = () => Promise.resolve(),\n onEnd: (id: number) => void = null,\n prepend = false,\n attachListenerTo = elem\n) {\n // return;\n if(elem.querySelector('.c-ripple')) return;\n elem.classList.add('rp');\n\n const r = document.createElement('div');\n r.classList.add('c-ripple');\n\n const isSquare = elem.classList.contains('rp-square');\n if(isSquare) {\n r.classList.add('is-square');\n }\n\n elem[prepend ? 'prepend' : 'append'](r);\n\n let handler: () => void;\n // let animationEndPromise: Promise;\n const drawRipple = (clientX: number, clientY: number) => {\n const startTime = Date.now();\n const circle = document.createElement('div');\n\n const clickId = rippleClickId++;\n\n // console.log('ripple drawRipple');\n\n // const auto = elem.classList.contains('row-sortable') && !elem.classList.contains('cant-sort');\n const auto = false;\n const duration = (auto ? .3 : +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '')) * 1000;\n // console.log('ripple duration', duration);\n\n const _handler = handler = () => {\n // handler = () => animationEndPromise.then((duration) => {\n // console.log('ripple animation was:', duration);\n\n // const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\n // return;\n const elapsedTime = Date.now() - startTime;\n const cb = () => {\n // console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\n sequentialDom.mutate(() => {\n circle.remove();\n });\n\n onEnd?.(clickId);\n };\n if(elapsedTime < duration) {\n const delay = Math.max(duration - elapsedTime, duration / 2);\n setTimeout(() => circle.classList.add('hiding'), Math.max(delay - duration / 2, 0));\n\n setTimeout(cb, delay);\n } else {\n circle.classList.add('hiding');\n setTimeout(cb, duration / 2);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n window.removeEventListener('contextmenu', handler);\n window.removeEventListener('mousemove', handler);\n }\n\n handler = null;\n touchStartFired = false;\n };\n // });\n\n callback?.(clickId);\n\n /* callback().then((bad) => {\n if(bad) {\n span.remove();\n return;\n } */\n\n // console.log('ripple after promise', Date.now() - startTime);\n // console.log('ripple tooSlow:', tooSlow);\n /* if(tooSlow) {\n span.remove();\n return;\n } */\n\n fastRaf(() => {\n if(_handler !== handler) {\n return;\n }\n\n const rect = r.getBoundingClientRect();\n circle.classList.add('c-ripple__circle');\n\n const clickX = clientX - rect.left;\n const clickY = clientY - rect.top;\n\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\n const size = radius;\n\n // center of circle\n const x = clickX - size / 2;\n const y = clickY - size / 2;\n\n // console.log('ripple click', offsetFromCenter, size, clickX, clickY);\n\n circle.style.width = circle.style.height = size + 'px';\n circle.style.left = x + 'px';\n circle.style.top = y + 'px';\n\n // нижний код выполняется с задержкой\n /* animationEndPromise = new Promise((resolve) => {\n span.addEventListener('animationend', () => {\n // 713 -> 700\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\n }, {once: true});\n }); */\n\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\n /* span.style.display = 'none';\n r.append(span);\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\n span.style.display = ''; */\n\n r.append(circle);\n\n if(auto) {\n // window.addEventListener('mousemove', handler, {once: true, passive: true});\n handler();\n }\n\n // r.classList.add('active');\n // handler();\n });\n // });\n };\n\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) ||\n findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\n ) && (\n attachListenerTo === elem ||\n !findUpAsChild(e.target as HTMLElement, attachListenerTo)\n );\n\n // TODO: rename this variable\n let touchStartFired = false;\n if(IS_TOUCH_SUPPORTED) {\n const touchEnd = () => {\n handler?.();\n };\n\n attachListenerTo.addEventListener('touchstart', (e) => {\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n\n // console.log('ripple touchstart', e);\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\n return;\n }\n\n // console.log('touchstart', e);\n touchStartFired = true;\n\n const {clientX, clientY} = e.touches[0];\n drawRipple(clientX, clientY);\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\n\n window.addEventListener('touchmove', (e) => {\n e.cancelBubble = true;\n e.stopPropagation();\n touchEnd();\n attachListenerTo.removeEventListener('touchend', touchEnd);\n }, {once: true});\n }, {passive: true});\n } else {\n attachListenerTo.addEventListener('mousedown', (e) => {\n if(![0, 2].includes(e.button)) { // only left and right buttons\n return;\n }\n\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n // console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\n\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\n return;\n } else if(touchStartFired) {\n touchStartFired = false;\n return;\n }\n\n const {clientX, clientY} = e;\n drawRipple(clientX, clientY);\n window.addEventListener('mouseup', handler, {once: true, passive: true});\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\n }, {passive: true});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CheckboxField, {CheckboxFieldOptions} from './checkboxField';\nimport RadioField from './radioField';\nimport ripple from './ripple';\nimport {SliderSuperTab} from './slider';\nimport RadioForm from './radioForm';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport Button from './button';\nimport createContextMenu from '../helpers/dom/createContextMenu';\n\ntype K = string | HTMLElement | DocumentFragment | true;\n\nconst setContent = (element: HTMLElement, content: K) => {\n if(content === true) {\n\n } else if(typeof(content) === 'string') {\n setInnerHTML(element, content);\n } else {\n element.append(content);\n }\n};\n\nexport type RowMediaSizeType = 'small' | 'medium' | 'big' | 'abitbigger' | 'bigger';\n\nexport default class Row {\n public container: HTMLElement;\n public title: HTMLElement;\n public titleRow: HTMLElement;\n public titleRight: HTMLElement;\n public media: HTMLElement;\n\n public subtitleRow: HTMLElement;\n public subtitleRight: HTMLElement;\n\n public checkboxField: CheckboxField;\n public radioField: RadioField;\n\n public freezed = false;\n\n public buttonRight: HTMLElement;\n\n private _subtitle: HTMLElement;\n private _midtitle: HTMLElement;\n\n constructor(options: Partial<{\n icon: string,\n subtitle: K,\n subtitleLangKey: LangPackKey,\n subtitleLangArgs: any[],\n subtitleRight: K,\n radioField: Row['radioField'],\n checkboxField: Row['checkboxField'],\n checkboxFieldOptions: CheckboxFieldOptions,\n withCheckboxSubtitle: boolean,\n title: K,\n titleLangKey: LangPackKey,\n titleRight: K,\n titleRightSecondary: K,\n clickable: boolean | ((e: Event) => void),\n navigationTab: SliderSuperTab,\n havePadding: boolean,\n noRipple: boolean,\n noWrap: boolean,\n listenerSetter: ListenerSetter,\n buttonRight?: HTMLElement | boolean,\n buttonRightLangKey: LangPackKey,\n asLink: boolean,\n contextMenu: Omit[0], 'findElement' | 'listenTo' | 'listenerSetter'>\n }> = {}) {\n if(options.checkboxFieldOptions) {\n options.checkboxField = new CheckboxField({\n listenerSetter: options.listenerSetter,\n ...options.checkboxFieldOptions\n });\n }\n\n const tagName = options.asLink ? 'a' : (options.radioField || options.checkboxField ? 'label' : 'div');\n this.container = document.createElement(tagName);\n this.container.classList.add('row', 'no-subtitle');\n\n if(options.noWrap) {\n this.container.classList.add('no-wrap');\n }\n\n if(options.subtitle) {\n const subtitle = this.subtitle;\n setContent(subtitle, options.subtitle);\n\n if(options.noWrap) subtitle.classList.add('no-wrap');\n\n if(options.subtitleRight) {\n this.container.append(this.subtitleRow = this.createRow());\n this.subtitleRow.classList.add('row-subtitle-row');\n const subtitleRight = this.subtitleRight = document.createElement('div');\n subtitleRight.classList.add('row-subtitle', 'row-subtitle-right');\n\n setContent(subtitleRight, options.subtitleRight);\n this.subtitleRow.append(subtitle, subtitleRight);\n }\n } else if(options.subtitleLangKey) {\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\n }\n\n let havePadding = !!options.havePadding;\n if(options.radioField || options.checkboxField) {\n if(options.radioField) {\n this.radioField = options.radioField;\n this.container.append(this.radioField.label);\n havePadding = true;\n }\n\n if(options.checkboxField) {\n this.checkboxField = options.checkboxField;\n\n const isToggle = options.checkboxField.label.classList.contains('checkbox-field-toggle');\n if(isToggle) {\n this.container.classList.add('row-with-toggle');\n options.titleRight = this.checkboxField.label;\n } else {\n havePadding = true;\n this.container.append(this.checkboxField.label);\n }\n\n if(options.withCheckboxSubtitle && !isToggle) {\n const onChange = () => {\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\n };\n\n if(options.listenerSetter) options.listenerSetter.add(this.checkboxField.input)('change', onChange);\n else this.checkboxField.input.addEventListener('change', onChange);\n }\n }\n\n const i = options.radioField || options.checkboxField;\n i.label.classList.add('disable-hover');\n }\n\n if(options.title || options.titleLangKey) {\n let c: HTMLElement;\n const titleRightContent = options.titleRight || options.titleRightSecondary;\n if(titleRightContent) {\n this.container.append(c = this.titleRow = this.createRow());\n this.titleRow.classList.add('row-title-row');\n } else {\n c = this.container;\n }\n\n this.title = this.createTitle();\n if(options.noWrap) this.title.classList.add('no-wrap');\n if(options.title) {\n setContent(this.title, options.title);\n } else if(options.titleLangKey) {\n this.title.append(i18n(options.titleLangKey));\n }\n\n c.append(this.title);\n\n if(titleRightContent) {\n const titleRight = this.titleRight = document.createElement('div');\n titleRight.classList.add('row-title', 'row-title-right');\n\n if(options.titleRightSecondary) {\n titleRight.classList.add('row-title-right-secondary');\n }\n\n setContent(titleRight, titleRightContent);\n c.append(titleRight);\n }\n }\n\n if(options.icon) {\n havePadding = true;\n // this.title.classList.add('tgico', 'tgico-' + options.icon);\n this.container.classList.add('tgico', 'tgico-' + options.icon);\n this.container.classList.add('row-with-icon');\n }\n\n if(havePadding) {\n this.container.classList.add('row-with-padding');\n }\n\n if(options.navigationTab) {\n options.clickable = () => options.navigationTab.open();\n }\n\n if(options.clickable || options.radioField || options.checkboxField) {\n if(typeof(options.clickable) === 'function') {\n attachClickEvent(this.container, (e) => {\n if(this.freezed) return;\n (options.clickable as any)(e);\n }, {listenerSetter: options.listenerSetter});\n }\n\n this.container.classList.add('row-clickable', 'hover-effect');\n\n if(!options.noRipple) {\n ripple(this.container, undefined, undefined, true);\n }\n\n /* if(options.radioField || options.checkboxField) {\n this.container.prepend(this.container.lastElementChild);\n } */\n }\n\n if(options.buttonRight || options.buttonRightLangKey) {\n this.buttonRight = options.buttonRight instanceof HTMLElement ?\n options.buttonRight :\n Button('btn-primary btn-color-primary', {text: options.buttonRightLangKey});\n this.container.append(this.buttonRight);\n }\n\n if(options.contextMenu) {\n createContextMenu({\n ...options.contextMenu,\n listenTo: this.container,\n listenerSetter: options.listenerSetter\n });\n }\n }\n\n public get subtitle() {\n return this._subtitle ??= this.createSubtitle();\n }\n\n public get midtitle() {\n return this._midtitle ??= this.createMidtitle();\n }\n\n private createRow() {\n const c = document.createElement('div');\n c.classList.add('row-row');\n return c;\n }\n\n private createTitle() {\n const title = document.createElement('div');\n title.classList.add('row-title');\n setDirection(title);\n return title;\n }\n\n private createSubtitle() {\n const subtitle = document.createElement('div');\n subtitle.classList.add('row-subtitle');\n setDirection(subtitle);\n if(this.title) this.title.after(subtitle);\n else this.container.prepend(subtitle);\n this.container.classList.remove('no-subtitle');\n return subtitle;\n }\n\n private createMidtitle() {\n const midtitle = document.createElement('div');\n midtitle.classList.add('row-midtitle');\n this.subtitle.parentElement.insertBefore(midtitle, this.subtitle);\n return midtitle;\n }\n\n public createMedia(size?: RowMediaSizeType) {\n const media = document.createElement('div');\n return this.applyMediaElement(media, size);\n }\n\n public applyMediaElement(media: HTMLElement, size?: RowMediaSizeType) {\n this.container.classList.add('row-with-padding');\n\n this.media = media;\n media.classList.add('row-media');\n\n if(size) {\n media.classList.add('row-media-' + size);\n }\n\n this.container.append(media);\n\n return media;\n }\n\n public disableWithPromise(promise: Promise) {\n this.container.classList.add('is-disabled');\n promise.finally(() => {\n this.container.classList.remove('is-disabled');\n });\n }\n\n public makeSortable() {\n const sortIcon = document.createElement('span');\n this.container.classList.add('row-sortable', 'tgico');\n sortIcon.classList.add('row-sortable-icon', 'tgico-menu');\n this.container.append(sortIcon);\n }\n\n public toggleSorting(enabled?: boolean) {\n this.container.classList.toggle('cant-sort', !enabled);\n }\n}\n\nexport const CreateRowFromCheckboxField = (checkboxField: CheckboxField) => {\n return new Row({checkboxField, listenerSetter: checkboxField.listenerSetter});\n};\n\nexport const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {\n return RadioForm(rows.map((r) => ({container: r.container, input: r.radioField.input})), onChange);\n};\n\nexport const RadioFormFromValues = (values: {langPackKey: LangPackKey, value: number | string, checked?: boolean}[], onChange: Parameters[1]) => {\n const name = 'name-' + (Math.random() * 0x7FFFFF | 0);\n let checkedRadioField: RadioField;\n const rows = values.map(({langPackKey, value, checked}) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: langPackKey,\n name,\n value: '' + value\n })\n });\n\n if(checked) {\n checkedRadioField = row.radioField;\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, onChange);\n if(checkedRadioField) {\n checkedRadioField.checked = true;\n }\n return form;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {logger, LogTypes} from '../lib/logger';\nimport fastSmoothScroll, {ScrollOptions} from '../helpers/fastSmoothScroll';\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {IS_ANDROID} from '../environment/userAgent';\n/*\nvar el = $0;\nvar height = 0;\nvar checkUp = false;\n\ndo {\n height += el.scrollHeight;\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\nconsole.log(height);\n*/\n\n/*\nArray.from($0.querySelectorAll('.bubble-content')).forEach((_el) => {\n //_el.style.display = '';\n //return;\n\n let el = _el.parentElement;\n let height = el.scrollHeight;\n let width = el.scrollWidth;\n el.style.width = width + 'px';\n el.style.height = height + 'px';\n _el.style.display = 'none';\n});\n*/\n\n/* const scrollables: Map = new Map();\nconst scrollsIntersector = new IntersectionObserver((entries) => {\n for(let entry of entries) {\n const scrollable = scrollables.get(entry.target as HTMLElement);\n\n if(entry.isIntersecting) {\n scrollable.isVisible = true;\n } else {\n scrollable.isVisible = false;\n\n if(!isInDOM(entry.target)) {\n scrollsIntersector.unobserve(scrollable.container);\n scrollables.delete(scrollable.container);\n }\n }\n }\n}); */\n\nconst SCROLL_THROTTLE = /* IS_ANDROID ? 200 : */24;\n\nexport class ScrollableBase {\n protected log: ReturnType;\n\n public splitUp: HTMLElement;\n public onScrollMeasure: number = 0;\n\n public lastScrollPosition: number = 0;\n public lastScrollDirection: number = 0;\n\n public onAdditionalScroll: () => void;\n public onScrolledTop: () => void;\n public onScrolledBottom: () => void;\n\n public isHeavyAnimationInProgress = false;\n protected needCheckAfterAnimation = false;\n\n public checkForTriggers?: () => void;\n\n public scrollProperty: 'scrollTop' | 'scrollLeft';\n\n protected removeHeavyAnimationListener: () => void;\n protected addedScrollListener: boolean;\n\n constructor(public el?: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\n this.container.classList.add('scrollable');\n\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\n\n if(el) {\n Array.from(el.children).forEach((c) => this.container.append(c));\n\n el.append(this.container);\n }\n // this.onScroll();\n }\n\n public addScrollListener() {\n if(this.addedScrollListener) {\n return;\n }\n\n this.addedScrollListener = true;\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\n }\n\n public removeScrollListener() {\n if(!this.addedScrollListener) {\n return;\n }\n\n this.addedScrollListener = false;\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\n }\n\n public setListeners() {\n if(this.removeHeavyAnimationListener) {\n return;\n }\n\n window.addEventListener('resize', this.onScroll, {passive: true});\n this.addScrollListener();\n\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\n this.isHeavyAnimationInProgress = true;\n\n if(this.onScrollMeasure) {\n this.cancelMeasure();\n this.needCheckAfterAnimation = true;\n }\n }, () => {\n this.isHeavyAnimationInProgress = false;\n\n if(this.needCheckAfterAnimation) {\n this.onScroll();\n this.needCheckAfterAnimation = false;\n }\n });\n }\n\n public removeListeners() {\n if(!this.removeHeavyAnimationListener) {\n return;\n }\n\n window.removeEventListener('resize', this.onScroll);\n this.removeScrollListener();\n\n this.removeHeavyAnimationListener();\n this.removeHeavyAnimationListener = undefined;\n }\n\n public destroy() {\n this.removeListeners();\n this.onAdditionalScroll = undefined;\n this.onScrolledTop = undefined;\n this.onScrolledBottom = undefined;\n }\n\n public append(...args: Parameters) {\n this.container.append(...args);\n }\n\n public scrollIntoViewNew(options: Omit) {\n // return Promise.resolve();\n // this.removeListeners();\n return fastSmoothScroll({\n ...options,\n container: this.container\n });/* .finally(() => {\n this.setListeners();\n }); */\n }\n\n public onScroll = () => {\n // if(this.debug) {\n // this.log('onScroll call', this.onScrollMeasure);\n // }\n\n // return;\n\n if(this.isHeavyAnimationInProgress) {\n this.cancelMeasure();\n this.needCheckAfterAnimation = true;\n return;\n }\n\n // if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\n if(this.onScrollMeasure) return;\n // if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\n // this.onScrollMeasure = window.requestAnimationFrame(() => {\n this.onScrollMeasure = window.setTimeout(() => {\n this.onScrollMeasure = 0;\n\n const scrollPosition = this.container[this.scrollProperty];\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\n this.lastScrollPosition = scrollPosition;\n\n // lastScrollDirection check is useless here, every callback should decide on its own\n if(this.onAdditionalScroll/* && this.lastScrollDirection !== 0 */) {\n this.onAdditionalScroll();\n }\n\n if(this.checkForTriggers) {\n this.checkForTriggers();\n }\n // });\n }, SCROLL_THROTTLE);\n };\n\n public cancelMeasure() {\n if(this.onScrollMeasure) {\n // window.cancelAnimationFrame(this.onScrollMeasure);\n clearTimeout(this.onScrollMeasure);\n this.onScrollMeasure = 0;\n }\n }\n}\n\nexport type SliceSides = 'top' | 'bottom';\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\n\nexport default class Scrollable extends ScrollableBase {\n public padding: HTMLElement;\n\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\n\n constructor(el?: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\n super(el, logPrefix);\n\n /* if(withPaddingContainer) {\n this.padding = document.createElement('div');\n this.padding.classList.add('scrollable-padding');\n Array.from(this.container.children).forEach((c) => this.padding.append(c));\n this.container.append(this.padding);\n } */\n\n this.container.classList.add('scrollable-y');\n this.setListeners();\n this.scrollProperty = 'scrollTop';\n }\n\n public attachBorderListeners(setClassOn = this.container) {\n const cb = this.onAdditionalScroll;\n this.onAdditionalScroll = () => {\n cb?.();\n setClassOn.classList.toggle('scrolled-top', !this.scrollTop);\n setClassOn.classList.toggle('scrolled-bottom', this.isScrolledDown);\n };\n\n setClassOn.classList.add('scrolled-top', 'scrolled-bottom', 'scrollable-y-bordered');\n }\n\n public setVirtualContainer(el?: HTMLElement) {\n this.splitUp = el;\n this.log('setVirtualContainer:', el, this);\n }\n\n public checkForTriggers = () => {\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\n\n if(this.isHeavyAnimationInProgress) {\n this.onScroll();\n return;\n }\n\n const scrollHeight = this.container.scrollHeight;\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\n return;\n }\n\n const clientHeight = this.container.clientHeight;\n const maxScrollTop = scrollHeight - clientHeight;\n const scrollTop = this.lastScrollPosition;\n\n // this.log('checkForTriggers:', scrollTop, maxScrollTop);\n\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\n this.onScrolledTop();\n }\n\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\n this.onScrolledBottom();\n }\n };\n\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\n (this.splitUp || this.padding || this.container).prepend(...elements);\n }\n\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\n (this.splitUp || this.padding || this.container).append(...elements);\n }\n\n public getDistanceToEnd() {\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\n }\n\n get isScrolledDown() {\n return this.getDistanceToEnd() <= 1;\n }\n\n set scrollTop(y: number) {\n this.container.scrollTop = y;\n }\n\n get scrollTop() {\n // this.log.trace('get scrollTop');\n return this.container.scrollTop;\n }\n\n public setScrollTopSilently(value: number) {\n this.lastScrollPosition = value;\n this.ignoreNextScrollEvent();\n\n this.scrollTop = value;\n }\n\n public ignoreNextScrollEvent() {\n if(this.removeHeavyAnimationListener) {\n this.removeScrollListener();\n this.container.addEventListener('scroll', (e) => {\n cancelEvent(e);\n this.addScrollListener();\n }, {capture: true, passive: false, once: true});\n }\n }\n\n get scrollHeight() {\n return this.container.scrollHeight;\n }\n}\n\nexport class ScrollableX extends ScrollableBase {\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\n super(el, logPrefix, container);\n\n this.container.classList.add('scrollable-x');\n\n if(!IS_TOUCH_SUPPORTED) {\n const scrollHorizontally = (e: any) => {\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\n this.container.scrollLeft += e.deltaY / 4;\n cancelEvent(e);\n }\n };\n\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\n }\n\n this.scrollProperty = 'scrollLeft';\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {LangPackKey, FormatterArguments, i18n_} from '../lib/langPack';\nimport {generateDelimiter} from './generateDelimiter';\nimport Scrollable from './scrollable';\n\nexport type SettingSectionOptions = {\n name?: LangPackKey,\n nameArgs?: FormatterArguments,\n caption?: LangPackKey | true,\n captionArgs?: FormatterArguments,\n captionOld?: SettingSectionOptions['caption'],\n noDelimiter?: boolean,\n fakeGradientDelimiter?: boolean,\n noShadow?: boolean,\n // fullWidth?: boolean,\n // noPaddingTop?: boolean\n};\n\nconst className = 'sidebar-left-section';\nexport default class SettingSection {\n public container: HTMLElement;\n public innerContainer: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public caption: HTMLElement;\n\n private fullWidth: boolean;\n\n constructor(options: SettingSectionOptions = {}) {\n const container = this.container = document.createElement('div');\n container.classList.add(className + '-container');\n\n const innerContainer = this.innerContainer = document.createElement('div');\n innerContainer.classList.add(className);\n\n if(options.noShadow) {\n innerContainer.classList.add('no-shadow');\n }\n\n if(options.fakeGradientDelimiter) {\n innerContainer.append(generateDelimiter());\n innerContainer.classList.add('with-fake-delimiter');\n } else if(!options.noDelimiter) {\n const hr = document.createElement('hr');\n innerContainer.append(hr);\n } else {\n innerContainer.classList.add('no-delimiter');\n }\n\n // if(options.fullWidth) {\n // this.fullWidth = true;\n // }\n\n // if(options.noPaddingTop) {\n // innerContainer.classList.add('no-padding-top');\n // }\n\n const content = this.content = this.generateContentElement();\n\n if(options.name) {\n const title = this.title = document.createElement('div');\n title.classList.add('sidebar-left-h2', className + '-name');\n i18n_({element: title, key: options.name, args: options.nameArgs});\n content.append(title);\n }\n\n container.append(innerContainer);\n\n const caption = options.caption ?? options.captionOld;\n if(caption) {\n const el = this.caption = this.generateContentElement();\n el.classList.add(className + '-caption');\n\n if(!options.captionOld) {\n container.append(el);\n }\n\n if(caption !== true) {\n i18n_({element: el, key: caption, args: options.captionArgs});\n }\n }\n }\n\n public generateContentElement() {\n const content = document.createElement('div');\n content.classList.add(className + '-content');\n\n // if(this.fullWidth) {\n // content.classList.add('full-width');\n // }\n\n this.innerContainer.append(content);\n return content;\n }\n}\n\nexport const generateSection = (appendTo: Scrollable, name?: LangPackKey, caption?: LangPackKey) => {\n const section = new SettingSection({name, caption});\n appendTo.append(section.container);\n return section.content;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputFile} from '../../../layer';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport AvatarEdit from '../../avatarEdit';\nimport I18n from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\ninterface OpenStreetMapInterface {\n place_id?: number;\n license?: string;\n osm_type?: string;\n osm_id?: number;\n lat?: string;\n lon?: string;\n display_name: string;\n address?: object;\n boundingbox?: object;\n}\n\nexport default class AppNewGroupTab extends SliderSuperTab {\n private avatarEdit: AvatarEdit;\n private uploadAvatar: () => Promise = null;\n private peerIds: PeerId[];\n private isGeoChat: boolean = false;\n private nextBtn: HTMLButtonElement;\n private groupNameInputField: InputField;\n private list: HTMLUListElement;\n private groupLocationInputField: InputField;\n private userLocationCoords: {lat: number, long: number};\n private userLocationAddress: string;\n\n public init(\n peerIds: PeerId[],\n isGeoChat: boolean = false\n ) {\n this.isGeoChat = isGeoChat;\n this.peerIds = peerIds;\n\n this.container.classList.add('new-group-container');\n this.setTitle('NewGroup');\n\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n });\n\n const section = new SettingSection({});\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.groupNameInputField = new InputField({\n label: 'CreateGroup.NameHolder',\n maxLength: 128\n });\n\n this.groupLocationInputField = new InputField({\n label: 'ChatLocation',\n name: 'location',\n canBeEdited: false\n });\n\n inputWrapper.append(\n this.groupNameInputField.container,\n this.groupLocationInputField.container\n );\n\n this.listenerSetter.add(this.groupNameInputField.input)('input', () => {\n const value = this.groupNameInputField.value;\n let valueCheck = !!value.length && !this.groupNameInputField.input.classList.contains('error');\n if(this.isGeoChat) valueCheck = valueCheck && !!this.userLocationCoords && !!this.userLocationAddress;\n this.nextBtn.classList.toggle('is-visible', !!valueCheck);\n });\n\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n\n attachClickEvent(this.nextBtn, () => {\n const title = this.groupNameInputField.value;\n\n let promise: Promise;\n if(this.isGeoChat) {\n if(!this.userLocationAddress || !this.userLocationCoords) return;\n promise = this.managers.appChatsManager.createChannel({\n title,\n about: '',\n geo_point: {\n _: 'inputGeoPoint',\n ...this.userLocationCoords\n },\n address: this.userLocationAddress,\n megagroup: true\n }).then((chatId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\n });\n }\n\n if(this.peerIds.length) {\n this.managers.appChatsManager.inviteToChannel(chatId, this.peerIds);\n }\n\n return chatId;\n });\n } else {\n this.nextBtn.disabled = true;\n promise = this.managers.appChatsManager.createChat(title, this.peerIds.map((peerId) => peerId.toUserId())).then((chatId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\n });\n }\n\n return chatId;\n });\n }\n\n if(!promise) {\n return;\n }\n\n promise.then((chatId) => {\n this.close();\n\n appImManager.setInnerPeer({peerId: chatId.toPeerId(true)});\n });\n }, {listenerSetter: this.listenerSetter});\n\n const chatsSection = new SettingSection({\n name: 'Members',\n nameArgs: [this.peerIds.length]\n });\n\n const list = this.list = appDialogsManager.createChatList({\n new: true\n });\n\n chatsSection.content.append(list);\n\n section.content.append(this.avatarEdit.container, inputWrapper);\n\n this.content.append(this.nextBtn);\n this.scrollable.append(section.container, chatsSection.container);\n\n if(isGeoChat) {\n this.setTitle('NearbyCreateGroup');\n this.groupLocationInputField.container.classList.remove('hide');\n this.groupLocationInputField.setValueSilently(I18n.format('Loading', true));\n this.startLocating();\n } else {\n this.groupLocationInputField.container.classList.add('hide');\n }\n\n return Promise.all(this.peerIds.map(async(userId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: userId,\n container: this.list,\n rippleEnabled: false,\n avatarSize: 'abitbigger'\n });\n\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(userId)));\n }));\n }\n\n public onCloseAfterTimeout() {\n this.avatarEdit.clear();\n this.uploadAvatar = null;\n this.groupNameInputField.value = '';\n this.groupLocationInputField.container.classList.add('hide');\n this.nextBtn.disabled = false;\n }\n\n private startLocating() {\n navigator.geolocation.getCurrentPosition((location) => {\n this.userLocationCoords = {\n lat: location.coords.latitude,\n long: location.coords.longitude\n };\n\n let uri = 'https://nominatim.openstreetmap.org/reverse';\n uri += '?lat='+location.coords.latitude;\n uri += '&lon='+location.coords.longitude;\n uri += '&format=json';\n uri += '&addressdetails=1';\n uri += '&accept-language=en';\n fetch(uri)\n .then((response) => response.json())\n .then((response: OpenStreetMapInterface) => {\n this.userLocationAddress = response.display_name;\n this.groupLocationInputField.setValueSilently(response.display_name);\n });\n }, (error) => {\n if(error instanceof GeolocationPositionError) {\n this.groupLocationInputField.setValueSilently('Location permission denied. Please retry later.');\n } else {\n this.groupLocationInputField.setValueSilently('An error has occurred. Please retry later.');\n }\n });\n }\n}\n","enum PrivacyType {\n Everybody = 2,\n Contacts = 1,\n Nobody = 0\n}\n\nexport default PrivacyType;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PrivacyRule} from '../../../../layer';\nimport PrivacyType from './privacyType';\n\nexport default function getPrivacyRulesDetails(rules: PrivacyRule[]) {\n const types: PrivacyType[] = [];\n\n type peers = {users: UserId[], chats: ChatId[]};\n const allowPeers: peers = {users: [], chats: []}, disallowPeers: peers = {users: [], chats: []};\n rules.forEach((rule) => {\n switch(rule._) {\n case 'privacyValueAllowAll':\n types.push(2);\n break;\n case 'privacyValueDisallowAll':\n types.push(0);\n break;\n case 'privacyValueAllowContacts':\n types.push(1);\n break;\n /* case 'privacyValueDisallowContacts':\n types.push('Except My Contacts');\n break; */\n case 'privacyValueAllowChatParticipants':\n allowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueAllowUsers':\n allowPeers.users.push(...rule.users);\n break;\n case 'privacyValueDisallowChatParticipants':\n disallowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueDisallowUsers':\n disallowPeers.users.push(...rule.users);\n break;\n }\n });\n\n return {type: types[0], disallowPeers, allowPeers};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {randomLong} from '../helpers/random';\nimport {InputPrivacyKey, InputPrivacyRule} from '../layer';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getPrivacyRulesDetails from '../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\nimport PrivacyType from '../lib/appManagers/utils/privacy/privacyType';\nimport {i18n, join, LangPackKey, _i18n} from '../lib/langPack';\nimport RadioField from './radioField';\nimport Row, {RadioFormFromRows} from './row';\nimport Scrollable from './scrollable';\nimport SettingSection, {generateSection} from './settingSection';\nimport AppAddMembersTab from './sidebarLeft/tabs/addMembers';\nimport {SliderSuperTabEventable} from './sliderTab';\n\nexport type PrivacySectionStr = LangPackKey | '' | HTMLElement;\nexport default class PrivacySection {\n public radioRows: Map;\n public radioSection: SettingSection;\n public exceptions: Map;\n public peerIds: {\n disallow?: PeerId[],\n allow?: PeerId[]\n };\n public type: PrivacyType;\n\n constructor(public options: {\n tab: SliderSuperTabEventable,\n title: LangPackKey,\n inputKey: InputPrivacyKey['_'],\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\n appendTo?: Scrollable,\n noExceptions?: boolean,\n onRadioChange?: (value: number) => any,\n skipTypes?: PrivacyType[],\n exceptionTexts?: [LangPackKey, LangPackKey],\n managers: AppManagers\n }) {\n if(options.captions) {\n options.captions.reverse();\n }\n\n const managers = options.managers;\n\n this.radioSection = new SettingSection({name: options.title, caption: true});\n\n this.radioRows = new Map();\n\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\n type: PrivacyType.Everybody,\n langKey: 'PrivacySettingsController.Everbody'\n }, {\n type: PrivacyType.Contacts,\n langKey: 'PrivacySettingsController.MyContacts'\n }, {\n type: PrivacyType.Nobody,\n langKey: 'PrivacySettingsController.Nobody'\n }];\n\n if(options.skipTypes) {\n r = r.filter((r) => !options.skipTypes.includes(r.type));\n }\n\n const random = randomLong();\n r.forEach(({type, langKey}) => {\n const row = new Row({\n radioField: new RadioField({\n langKey,\n name: random,\n value: '' + type\n })\n });\n\n this.radioRows.set(type, row);\n });\n\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\n\n this.radioSection.content.append(form);\n if(options.appendTo) {\n options.appendTo.append(this.radioSection.container);\n }\n\n if(!options.noExceptions) {\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\n\n this.exceptions = new Map([[\n 'disallow',\n {\n titleLangKey: options.exceptionTexts[0],\n key: 'disallow',\n row: null,\n icon: 'deleteuser',\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\n clickable: true\n }\n ], [\n 'allow',\n {\n titleLangKey: options.exceptionTexts[1],\n key: 'allow',\n row: null,\n icon: 'adduser',\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\n clickable: true\n }\n ]]);\n\n this.exceptions.forEach((exception) => {\n exception.row = new Row(exception);\n\n exception.row.container.addEventListener('click', () => {\n promise.then(() => {\n const _peerIds = this.peerIds[exception.key];\n options.tab.slider.createTab(AppAddMembersTab).open({\n type: 'privacy',\n skippable: true,\n title: exception.titleLangKey,\n placeholder: 'PrivacyModal.Search.Placeholder',\n takeOut: (newPeerIds) => {\n _peerIds.length = 0;\n _peerIds.push(...newPeerIds);\n exception.row.subtitle.innerHTML = '';\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\n },\n selectedPeerIds: _peerIds\n });\n });\n });\n\n container.append(exception.row.container);\n });\n }\n\n /* setTimeout(() => {\n this.setRadio(PrivacyType.Contacts);\n }, 0); */\n\n const promise = managers.appPrivacyManager.getPrivacy(options.inputKey).then((rules) => {\n const details = getPrivacyRulesDetails(rules);\n this.setRadio(details.type);\n\n if(this.exceptions) {\n this.peerIds = {};\n ['allow' as const, 'disallow' as const].forEach((k) => {\n const arr = [];\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\n arr.push(...from.users.map((id) => id.toPeerId()));\n arr.push(...from.chats.map((id) => id.toPeerId(true)));\n this.peerIds[k] = arr;\n const s = this.exceptions.get(k).row.subtitle;\n s.innerHTML = '';\n s.append(...this.generateStr(from));\n });\n }\n\n options.tab.eventListener.addEventListener('destroy', async() => {\n const rules: InputPrivacyRule[] = [];\n\n switch(this.type) {\n case PrivacyType.Everybody:\n rules.push({_: 'inputPrivacyValueAllowAll'});\n break;\n case PrivacyType.Contacts:\n rules.push({_: 'inputPrivacyValueAllowContacts'});\n break;\n case PrivacyType.Nobody:\n rules.push({_: 'inputPrivacyValueDisallowAll'});\n break;\n }\n\n if(this.exceptions) {\n const a = ([\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\n ] as Array<[\n 'allow' | 'disallow',\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants',\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\n ]>);\n for(const [k, chatKey, usersKey] of a) {\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\n continue;\n }\n\n const _peerIds = this.peerIds[k];\n if(_peerIds) {\n const splitted = this.splitPeersByType(_peerIds);\n if(splitted.chats.length) {\n rules.push({_: chatKey, chats: splitted.chats});\n }\n\n if(splitted.users.length) {\n rules.push({\n _: usersKey,\n users: await Promise.all(splitted.users.map((id) => managers.appUsersManager.getUserInput(id)))\n });\n }\n }\n }\n }\n\n managers.appPrivacyManager.setPrivacy(options.inputKey, rules);\n }, {once: true});\n });\n }\n\n private onRadioChange = (value: string | PrivacySection['type']) => {\n value = +value as PrivacySection['type'];\n this.type = value;\n\n const caption = this.options.captions[this.type];\n const captionElement = this.radioSection.caption;\n if(!caption) {\n captionElement.innerHTML = '';\n } else if(caption instanceof HTMLElement) {\n replaceContent(captionElement, caption);\n } else {\n _i18n(captionElement, caption);\n }\n captionElement.classList.toggle('hide', !caption);\n\n if(this.exceptions) {\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\n }\n\n this.options.onRadioChange && this.options.onRadioChange(value);\n };\n\n public setRadio(type: PrivacySection['type']) {\n const row = this.radioRows.get(type);\n this.onRadioChange(type);\n row.radioField.input.checked = true;\n }\n\n private splitPeersByType(peerIds: PeerId[]) {\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\n peerIds.forEach((peerId) => {\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\n });\n\n return peers;\n }\n\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\n if(!peers.users.length && !peers.chats.length) {\n return [i18n('PrivacySettingsController.AddUsers')];\n }\n\n return join([\n peers.users.length ? i18n('Users', [peers.users.length]) : null,\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\n ].filter(Boolean), false);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {i18n, LangPackKey} from '../../../../lib/langPack';\nimport anchorCopy from '../../../../helpers/dom/anchorCopy';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\n public async init() {\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\n this.setTitle('PrivacyPhone');\n\n const formatted = '+' + (await this.managers.appUsersManager.getSelf()).phone;\n const captionEl = document.createElement('div');\n captionEl.append(\n i18n('PrivacyPhoneInfo'),\n document.createElement('br'),\n document.createElement('br'),\n i18n('PrivacyPhoneInfo4'),\n document.createElement('br'),\n anchorCopy({\n mePath: formatted\n })\n );\n\n const phoneSection = new PrivacySection({\n tab: this,\n title: 'PrivacyPhoneTitle',\n inputKey: 'inputPrivacyKeyPhoneNumber',\n captions: [captionEl, captionEl, ''],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n onRadioChange: (type) => {\n s.setRadio(PrivacyType.Everybody);\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\n },\n managers: this.managers\n });\n\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\n const s = new PrivacySection({\n tab: this,\n title: 'PrivacyPhoneTitle2',\n inputKey: 'inputPrivacyKeyAddedByPhone',\n captions: [sCaption, sCaption, ''],\n noExceptions: true,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\n });\n\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport Button from '../../../button';\nimport SettingSection from '../../../settingSection';\nimport {SliderSuperTab} from '../../../slider';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport AppSettingsTab from '../settings';\n\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-set');\n this.setTitle('TwoStepVerificationPasswordSet');\n\n const section = new SettingSection({\n captionOld: 'TwoStepVerificationPasswordSetInfo',\n noDelimiter: true\n });\n\n const emoji = '🥳';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n emoji,\n div: stickerContainer,\n width: 160,\n height: 160\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\n\n attachClickEvent(btnReturn, (e) => {\n this.close();\n });\n\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\n\n inputWrapper.append(btnReturn);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\n\nexport function canFocus(isFirstInput: boolean) {\n return !IS_MOBILE_SAFARI || !isFirstInput;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport AppTwoStepVerificationSetTab from './passwordSet';\nimport CodeInputField from '../../../codeInputField';\nimport AppTwoStepVerificationEmailTab from './email';\nimport {putPreloader} from '../../../putPreloader';\nimport {i18n, _i18n} from '../../../../lib/langPack';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../../helpers/dom/replaceContent';\nimport toggleDisability from '../../../../helpers/dom/toggleDisability';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\n public codeInputField: CodeInputField;\n public state: AccountPassword;\n public email: string;\n public length: number;\n public isFirst = false;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-email-confirmation');\n this.setTitle('TwoStepAuth.RecoveryTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\n\n const emoji = '📬';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.codeInputField = new CodeInputField({\n name: 'recovery-email-code',\n label: 'TwoStepAuth.RecoveryCode',\n length: this.length,\n onFill: (code) => {\n freeze(true);\n\n this.managers.passwordManager.confirmPasswordEmail('' + code)\n .then((value) => {\n if(!value) {\n\n }\n\n goNext();\n })\n .catch((err) => {\n switch(err.type) {\n case 'CODE_INVALID':\n inputField.input.classList.add('error');\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\n break;\n\n case 'EMAIL_HASH_EXPIRED':\n inputField.input.classList.add('error');\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\n break;\n\n default:\n console.error('confirm error', err);\n break;\n }\n\n freeze(false);\n });\n }\n });\n\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\n\n const goNext = () => {\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\n };\n\n const freeze = (disable: boolean) => {\n toggleDisability([inputField.input, btnChange, btnResend], disable);\n };\n\n attachClickEvent(btnChange, (e) => {\n freeze(true);\n this.managers.passwordManager.cancelPasswordEmail().then((value) => {\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\n this.close();\n }, () => {\n freeze(false);\n });\n });\n\n attachClickEvent(btnResend, (e) => {\n freeze(true);\n const d = putPreloader(btnResend);\n this.managers.passwordManager.resendPasswordEmail().then((value) => {\n d.remove();\n freeze(false);\n });\n });\n\n inputWrapper.append(inputField.container, btnChange, btnResend);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.codeInputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport InputField from '../../../inputField';\nimport {putPreloader} from '../../../putPreloader';\nimport AppTwoStepVerificationSetTab from './passwordSet';\nimport AppTwoStepVerificationEmailConfirmationTab from './emailConfirmation';\nimport PopupPeer from '../../../popups/peer';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport matchEmail from '../../../../lib/richTextProcessor/matchEmail';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\n public inputField: InputField;\n public state: AccountPassword;\n public plainPassword: string;\n public newPassword: string;\n public hint: string;\n public isFirst = false;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-email');\n this.setTitle('RecoveryEmailTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n const emoji = '💌';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.inputField = new InputField({\n name: 'recovery-email',\n label: 'RecoveryEmail',\n plainText: true\n });\n\n inputField.input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n cancelEvent(e);\n return onContinueClick();\n }\n });\n\n inputField.input.addEventListener('input', (e) => {\n inputField.input.classList.remove('error');\n });\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\n\n const goNext = () => {\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\n };\n\n const onContinueClick = () => {\n const email = inputField.value.trim();\n const match = matchEmail(email);\n if(!match || match[0].length !== email.length) {\n inputField.input.classList.add('error');\n return;\n }\n\n toggleButtons(true);\n const d = putPreloader(btnContinue);\n\n this.managers.passwordManager.updateSettings({\n hint: this.hint,\n currentPassword: this.plainPassword,\n newPassword: this.newPassword,\n email\n }).then((value) => {\n goNext();\n }, (err) => {\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\n\n const tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\n tab.state = this.state;\n tab.email = email;\n tab.length = symbols;\n tab.open();\n } else {\n console.log('password set error', err);\n }\n\n toggleButtons(false);\n d.remove();\n });\n };\n attachClickEvent(btnContinue, onContinueClick);\n\n const toggleButtons = (freeze: boolean) => {\n if(freeze) {\n btnContinue.setAttribute('disabled', 'true');\n btnSkip.setAttribute('disabled', 'true');\n } else {\n btnContinue.removeAttribute('disabled');\n btnSkip.removeAttribute('disabled');\n }\n };\n\n attachClickEvent(btnSkip, (e) => {\n const popup = new PopupPeer('popup-skip-email', {\n buttons: [{\n langKey: 'Cancel',\n isCancel: true\n }, {\n langKey: 'YourEmailSkip',\n callback: () => {\n // inputContent.classList.add('sidebar-left-section-disabled');\n toggleButtons(true);\n putPreloader(btnSkip);\n this.managers.passwordManager.updateSettings({\n hint: this.hint,\n currentPassword: this.plainPassword,\n newPassword: this.newPassword,\n email: ''\n }).then(() => {\n goNext();\n }, (err) => {\n toggleButtons(false);\n });\n },\n isDanger: true\n }],\n titleLangKey: 'YourEmailSkipWarning',\n descriptionLangKey: 'YourEmailSkipWarningText'\n });\n\n popup.show();\n });\n\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.inputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport InputField from '../../../inputField';\nimport AppTwoStepVerificationEmailTab from './email';\nimport {toast} from '../../../toast';\nimport I18n from '../../../../lib/langPack';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\n public inputField: InputField;\n public state: AccountPassword;\n public plainPassword: string;\n public newPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\n this.setTitle('TwoStepAuth.SetupHintTitle');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const emoji = '💡';\n const stickerContainer = document.createElement('div');\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.inputField = new InputField({\n name: 'hint',\n label: 'TwoStepAuth.SetupHintPlaceholder'\n });\n\n inputField.input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n cancelEvent(e);\n return inputField.value ? onContinueClick() : onSkipClick();\n }\n });\n\n const goNext = (e?: Event, saveHint?: boolean) => {\n if(e) {\n cancelEvent(e);\n }\n\n const hint = saveHint ? inputField.value : undefined;\n if(hint && this.newPassword === hint) {\n toast(I18n.format('PasswordAsHintError', true));\n return;\n }\n\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.newPassword;\n tab.hint = hint;\n\n tab.open();\n };\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\n\n const onContinueClick = (e?: Event) => goNext(e, true);\n const onSkipClick = (e?: Event) => goNext(e, false);\n attachClickEvent(btnContinue, onContinueClick);\n attachClickEvent(btnSkip, onSkipClick);\n\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\n\n section.content.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n this.inputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport PasswordInputField from '../../../passwordInputField';\nimport {SliderSuperTab} from '../../../slider';\nimport TrackingMonkey from '../../../monkeys/tracking';\nimport AppTwoStepVerificationHintTab from './hint';\nimport {InputState} from '../../../inputField';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\n public state: AccountPassword;\n public passwordInputField: PasswordInputField;\n public plainPassword: string;\n public newPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\n this.setTitle('PleaseReEnterPassword');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const passwordInputField = this.passwordInputField = new PasswordInputField({\n name: 're-enter-password',\n label: 'PleaseReEnterPassword'\n });\n\n const monkey = new TrackingMonkey(passwordInputField, 157);\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n\n inputWrapper.append(passwordInputField.container, btnContinue);\n section.content.append(monkey.container, inputWrapper);\n\n this.scrollable.container.append(section.container);\n\n passwordInputField.input.addEventListener('keypress', (e) => {\n if(passwordInputField.input.classList.contains('error')) {\n passwordInputField.setState(InputState.Neutral);\n }\n\n if(e.key === 'Enter') {\n return onContinueClick();\n }\n });\n\n const verifyInput = () => {\n if(this.newPassword !== passwordInputField.value) {\n passwordInputField.setError();\n return false;\n }\n\n return true;\n };\n\n const onContinueClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!verifyInput()) return;\n\n const tab = this.slider.createTab(AppTwoStepVerificationHintTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.newPassword;\n tab.open();\n };\n attachClickEvent(btnContinue, onContinueClick);\n\n return monkey.load();\n }\n\n onOpenAfterTimeout() {\n this.passwordInputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AppTwoStepVerificationTab from '.';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../../../helpers/dom/setInnerHTML';\nimport {AccountPassword} from '../../../../layer';\nimport I18n, {i18n} from '../../../../lib/langPack';\nimport wrapEmojiText from '../../../../lib/richTextProcessor/wrapEmojiText';\nimport Button from '../../../button';\nimport {putPreloader} from '../../../putPreloader';\nimport PasswordMonkey from '../../../monkeys/password';\nimport PasswordInputField from '../../../passwordInputField';\nimport {SliderSuperTab} from '../../../slider';\nimport AppTwoStepVerificationReEnterPasswordTab from './reEnterPassword';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\n public state: AccountPassword;\n public passwordInputField: PasswordInputField;\n public plainPassword: string;\n public isFirst = true;\n\n public init() {\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const passwordInputField = this.passwordInputField = new PasswordInputField({\n name: 'enter-password',\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\n labelText: !isNew && this.state.hint ? wrapEmojiText(this.state.hint) : undefined\n });\n\n const monkey = new PasswordMonkey(passwordInputField, 157);\n\n const btnContinue = Button('btn-primary btn-color-primary');\n const textEl = new I18n.IntlElement({key: 'Continue'});\n\n btnContinue.append(textEl.element);\n\n inputWrapper.append(passwordInputField.container, btnContinue);\n section.content.append(monkey.container, inputWrapper);\n\n this.scrollable.container.append(section.container);\n\n passwordInputField.input.addEventListener('keypress', (e) => {\n if(passwordInputField.input.classList.contains('error')) {\n passwordInputField.input.classList.remove('error');\n textEl.key = 'Continue';\n textEl.update();\n }\n\n if(e.key === 'Enter') {\n return onContinueClick();\n }\n });\n\n const verifyInput = () => {\n if(!passwordInputField.value.length) {\n passwordInputField.input.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n let onContinueClick: (e?: Event) => void;\n if(!isNew) {\n let getStateInterval: number;\n\n const getState = () => {\n // * just to check session relevance\n if(!getStateInterval) {\n getStateInterval = window.setInterval(getState, 10e3);\n }\n\n return this.managers.passwordManager.getState().then((_state) => {\n this.state = _state;\n\n if(this.state.hint) {\n setInnerHTML(passwordInputField.label, wrapEmojiText(this.state.hint));\n } else {\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\n }\n });\n };\n\n const submit = (e?: Event) => {\n if(!verifyInput()) {\n cancelEvent(e);\n return;\n }\n\n btnContinue.setAttribute('disabled', 'true');\n textEl.key = 'PleaseWait';\n textEl.update();\n const preloader = putPreloader(btnContinue);\n\n const plainPassword = passwordInputField.value;\n this.managers.passwordManager.check(passwordInputField.value, this.state).then((auth) => {\n console.log(auth);\n\n if(auth._ === 'auth.authorization') {\n clearInterval(getStateInterval);\n if(monkey) monkey.remove();\n const tab = this.slider.createTab(AppTwoStepVerificationTab);\n tab.state = this.state;\n tab.plainPassword = plainPassword;\n tab.open();\n this.slider.removeTabFromHistory(this);\n }\n }, (err) => {\n btnContinue.removeAttribute('disabled');\n passwordInputField.input.classList.add('error');\n\n switch(err.type) {\n default:\n // btnContinue.innerText = err.type;\n textEl.key = 'PASSWORD_HASH_INVALID';\n textEl.update();\n preloader.remove();\n passwordInputField.select();\n break;\n }\n\n getState();\n });\n };\n\n onContinueClick = submit;\n\n getState();\n } else {\n onContinueClick = (e) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!verifyInput()) return;\n\n const tab = this.slider.createTab(AppTwoStepVerificationReEnterPasswordTab);\n tab.state = this.state;\n tab.newPassword = passwordInputField.value;\n tab.plainPassword = this.plainPassword;\n tab.open();\n };\n }\n\n attachClickEvent(btnContinue, onContinueClick);\n\n return monkey.load();\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.passwordInputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport {AccountPassword} from '../../../../layer';\nimport {_i18n} from '../../../../lib/langPack';\nimport Button from '../../../button';\nimport PopupPeer from '../../../popups/peer';\nimport SettingSection from '../../../settingSection';\nimport {SliderSuperTab} from '../../../slider';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport AppSettingsTab from '../settings';\nimport AppTwoStepVerificationEmailTab from './email';\nimport AppTwoStepVerificationEnterPasswordTab from './enterPassword';\n\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\n public state: AccountPassword;\n public plainPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-main');\n this.setTitle('TwoStepVerificationTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n const emoji = '🔐';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 168,\n height: 168,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const c = section.generateContentElement();\n if(this.state.pFlags.has_password) {\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\n\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\n\n attachClickEvent(btnChangePassword, () => {\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.open();\n });\n\n attachClickEvent(btnDisablePassword, () => {\n const popup = new PopupPeer('popup-disable-password', {\n buttons: [{\n langKey: 'Disable',\n callback: () => {\n this.managers.passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\n this.close();\n });\n },\n isDanger: true\n }],\n titleLangKey: 'TurnPasswordOffQuestionTitle',\n descriptionLangKey: 'TurnPasswordOffQuestion'\n });\n\n popup.show();\n });\n\n attachClickEvent(btnSetRecoveryEmail, () => {\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\n tab.state = this.state;\n tab.hint = this.state.hint;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.plainPassword;\n tab.isFirst = true;\n tab.open();\n });\n\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\n } else {\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\n\n inputWrapper.append(btnSetPassword);\n c.append(inputWrapper);\n\n attachClickEvent(btnSetPassword, (e) => {\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n tab.state = this.state;\n tab.open();\n });\n }\n\n this.scrollable.container.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\n this.setTitle('PrivacyLastSeen');\n\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\n new PrivacySection({\n tab: this,\n title: 'LastSeenTitle',\n inputKey: 'inputPrivacyKeyStatusTimestamp',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\n this.setTitle('PrivacyProfilePhoto');\n\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\n new PrivacySection({\n tab: this,\n title: 'PrivacyProfilePhotoTitle',\n inputKey: 'inputPrivacyKeyProfilePhoto',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\n this.setTitle('PrivacySettings.Forwards');\n\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\n new PrivacySection({\n tab: this,\n title: 'PrivacyForwardsTitle',\n inputKey: 'inputPrivacyKeyForwards',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\n this.setTitle('PrivacySettings.Groups');\n\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\n new PrivacySection({\n tab: this,\n title: 'WhoCanAddMe',\n inputKey: 'inputPrivacyKeyChatInvite',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-calls');\n this.setTitle('PrivacySettings.VoiceCalls');\n\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\n new PrivacySection({\n tab: this,\n title: 'WhoCanCallMe',\n inputKey: 'inputPrivacyKeyPhoneCall',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n\n {\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\n new PrivacySection({\n tab: this,\n title: 'PrivacyP2PHeader',\n inputKey: 'inputPrivacyKeyPhoneP2P',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Button from '../../button';\nimport Row from '../../row';\nimport {Authorization} from '../../../layer';\nimport {formatDateAccordingToTodayNew} from '../../../helpers/date';\nimport {ButtonMenuSync} from '../../buttonMenu';\nimport {toast} from '../../toast';\nimport I18n from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\nimport positionMenu from '../../../helpers/positionMenu';\nimport contextMenuController from '../../../helpers/contextMenuController';\nimport SettingSection from '../../settingSection';\n\nexport default class AppActiveSessionsTab extends SliderSuperTabEventable {\n public authorizations: Authorization.authorization[];\n private menuElement: HTMLElement;\n\n public init() {\n this.container.classList.add('active-sessions-container');\n this.setTitle('SessionsTitle');\n\n const Session = (auth: Authorization.authorization) => {\n const row = new Row({\n title: [auth.app_name, auth.app_version].join(' '),\n subtitle: [auth.ip, auth.country].join(' - '),\n clickable: true,\n titleRight: auth.pFlags.current ? undefined : formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\n });\n\n row.container.dataset.hash = '' + auth.hash;\n\n row.midtitle.textContent = [auth.device_model, auth.system_version || auth.platform].filter(Boolean).join(', ');\n\n return row;\n };\n\n const authorizations = this.authorizations.slice();\n\n {\n const section = new SettingSection({\n name: 'CurrentSession',\n caption: 'ClearOtherSessionsHelp'\n });\n\n const auth = findAndSplice(authorizations, auth => auth.pFlags.current);\n const session = Session(auth);\n\n section.content.append(session.container);\n\n if(authorizations.length) {\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\n attachClickEvent(btnTerminate, (e) => {\n new PopupPeer('revoke-session', {\n buttons: [{\n langKey: 'Terminate',\n isDanger: true,\n callback: () => {\n const toggle = toggleDisability([btnTerminate], true);\n this.managers.apiManager.invokeApi('auth.resetAuthorizations').then((value) => {\n // toggleDisability([btnTerminate], false);\n btnTerminate.remove();\n otherSection.container.remove();\n }, onError).finally(() => {\n toggle();\n });\n }\n }],\n titleLangKey: 'AreYouSureSessionsTitle',\n descriptionLangKey: 'AreYouSureSessions'\n }).show();\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnTerminate);\n }\n\n this.scrollable.append(section.container);\n }\n\n if(!authorizations.length) {\n return;\n }\n\n const otherSection = new SettingSection({\n name: 'OtherSessions',\n caption: 'SessionsListInfo'\n });\n\n authorizations.forEach((auth) => {\n otherSection.content.append(Session(auth).container);\n });\n\n this.scrollable.append(otherSection.container);\n\n const onError = (err: any) => {\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\n }\n };\n\n let target: HTMLElement;\n const onTerminateClick = () => {\n const hash = target.dataset.hash;\n\n new PopupPeer('revoke-session', {\n buttons: [{\n langKey: 'Terminate',\n isDanger: true,\n callback: () => {\n this.managers.apiManager.invokeApi('account.resetAuthorization', {hash})\n .then((value) => {\n if(value) {\n target.remove();\n }\n }, onError);\n }\n }],\n titleLangKey: 'AreYouSureSessionTitle',\n descriptionLangKey: 'TerminateSessionText'\n }).show();\n };\n\n const element = this.menuElement = ButtonMenuSync({\n buttons: [{\n icon: 'stop',\n text: 'Terminate',\n onClick: onTerminateClick\n }]\n });\n element.id = 'active-sessions-contextmenu';\n element.classList.add('contextmenu');\n\n document.getElementById('page-chats').append(element);\n\n attachContextMenuListener({\n element: this.scrollable.container,\n callback: (e) => {\n target = findUpClassName(e.target, 'row');\n if(!target || target.dataset.hash === '0') {\n return;\n }\n\n if(e instanceof MouseEvent) e.preventDefault();\n // smth\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n positionMenu(e, element);\n contextMenuController.openBtnMenu(element);\n },\n listenerSetter: this.listenerSetter\n });\n\n attachClickEvent(this.scrollable.container, (e) => {\n target = findUpClassName(e.target, 'row');\n if(!target || target.dataset.hash === '0') {\n return;\n }\n\n onTerminateClick();\n }, {listenerSetter: this.listenerSetter});\n }\n\n onCloseAfterTimeout() {\n this.menuElement?.remove();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport {ButtonMenuSync} from '../../buttonMenu';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../../../lib/appManagers/appDialogsManager';\nimport PopupPickUser from '../../popups/pickUser';\nimport rootScope from '../../../lib/rootScope';\nimport findUpTag from '../../../helpers/dom/findUpTag';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport formatUserPhone from '../../wrappers/formatUserPhone';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\nimport positionMenu from '../../../helpers/positionMenu';\nimport contextMenuController from '../../../helpers/contextMenuController';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport SettingSection from '../../settingSection';\n\nexport default class AppBlockedUsersTab extends SliderSuperTab {\n public peerIds: PeerId[];\n private menuElement: HTMLElement;\n\n public init() {\n this.container.classList.add('blocked-users-container');\n this.setTitle('BlockedUsers');\n\n const section = new SettingSection({\n caption: 'BlockedUsersInfo'\n });\n\n section.caption.parentElement.prepend(section.caption);\n\n this.scrollable.append(section.container);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, (e) => {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'BlockModal.Search.Placeholder',\n onSelect: (peerId) => {\n // console.log('block', peerId);\n this.managers.appUsersManager.toggleBlock(peerId, true);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n const list = appDialogsManager.createChatList();\n this.scrollable.container.classList.add('chatlist-container');\n section.content.append(list);\n\n const add = async(peerId: PeerId, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger',\n append\n });\n\n const user = await this.managers.appUsersManager.getUser(peerId.toUserId());\n if(!user) {\n return;\n }\n\n const usernames = getPeerActiveUsernames(user);\n const username = usernames[0];\n if(user.pFlags.bot) {\n dom.lastMessageSpan.append('@' + username);\n } else {\n if(user.phone) dom.lastMessageSpan.innerHTML = formatUserPhone(user.phone);\n else dom.lastMessageSpan.append(username ? '@' + username : getUserStatusString(user));\n }\n\n // dom.titleSpan.innerHTML = 'Raaid El Syed';\n // dom.lastMessageSpan.innerHTML = '+1 234 567891';\n };\n\n for(const peerId of this.peerIds) {\n add(peerId, true);\n }\n\n let target: HTMLElement;\n const onUnblock = () => {\n const peerId = target.dataset.peerId.toPeerId();\n this.managers.appUsersManager.toggleBlock(peerId, false);\n };\n\n const element = this.menuElement = ButtonMenuSync({\n buttons: [{\n icon: 'lockoff',\n text: 'Unblock',\n onClick: onUnblock,\n options: {listenerSetter: this.listenerSetter}\n }]\n });\n element.id = 'blocked-users-contextmenu';\n element.classList.add('contextmenu');\n\n document.getElementById('page-chats').append(element);\n\n attachContextMenuListener({\n element: this.scrollable.container,\n callback: (e) => {\n target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!target) {\n return;\n }\n\n if(e instanceof MouseEvent) e.preventDefault();\n // smth\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n positionMenu(e, element);\n contextMenuController.openBtnMenu(element);\n },\n listenerSetter: this.listenerSetter\n });\n\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\n const {peerId, blocked} = update;\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\n if(blocked) {\n if(!li) {\n add(peerId, false);\n }\n } else {\n if(li) {\n li.remove();\n }\n }\n });\n\n const LOAD_COUNT = 50;\n let loading = false;\n this.scrollable.onScrolledBottom = () => {\n if(loading) {\n return;\n }\n\n loading = true;\n this.managers.appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then((res) => {\n for(const peerId of res.peerIds) {\n add(peerId, true);\n }\n\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\n this.scrollable.onScrolledBottom = null;\n }\n\n this.scrollable.checkForTriggers();\n }).finally(() => {\n loading = false;\n });\n };\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n\n onCloseAfterTimeout() {\n if(this.menuElement) {\n this.menuElement.remove();\n }\n\n return super.onCloseAfterTimeout();\n }\n}\n","export default function convertKeyToInputKey(key: string) {\n key = key[0].toUpperCase() + key.slice(1);\n key = 'input' + key;\n return key;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyVoicesTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-voices');\n this.setTitle('PrivacyVoiceMessages');\n\n const caption: LangPackKey = 'PrivacyVoiceMessagesInfo';\n new PrivacySection({\n tab: this,\n title: 'PrivacyVoiceMessagesTitle',\n inputKey: 'inputPrivacyKeyVoiceMessages',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatDateAccordingToTodayNew} from '../../../helpers/date';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {WebAuthorization} from '../../../layer';\nimport AvatarElement from '../../avatar';\nimport Button from '../../button';\nimport confirmationPopup from '../../confirmationPopup';\nimport Row from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport wrapPeerTitle from '../../wrappers/peerTitle';\n\nexport default class AppActiveWebSessionsTab extends SliderSuperTabEventable {\n public async init(sessions: WebAuthorization[]) {\n this.container.classList.add('active-sessions-container');\n this.setTitle('WebSessionsTitle');\n\n const Session = async(auth: WebAuthorization) => {\n const peerId = auth.bot_id.toPeerId();\n const row = new Row({\n title: await wrapPeerTitle({peerId}),\n subtitle: [auth.ip, auth.region].join(' - '),\n clickable: true,\n titleRight: formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\n });\n\n const media = row.createMedia('big');\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-48');\n await avatar.updateWithOptions({peerId});\n media.append(avatar);\n\n row.container.dataset.hash = '' + auth.hash;\n row.container.dataset.peerId = '' + peerId;\n\n row.midtitle.textContent = [auth.domain, auth.browser, auth.platform].filter(Boolean).join(', ');\n\n return row;\n };\n\n {\n const section = new SettingSection({\n caption: 'ClearOtherWebSessionsHelp'\n });\n\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllWebSessions'});\n\n attachClickEvent(btnTerminate, async() => {\n await confirmationPopup({\n descriptionLangKey: 'AreYouSureWebSessions',\n button: {\n langKey: 'Disconnect',\n isDanger: true\n }\n });\n\n const toggle = toggleDisability([btnTerminate], true);\n this.managers.appSeamlessLoginManager.resetWebAuthorizations().then(() => {\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnTerminate);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({\n name: 'OtherWebSessions',\n caption: 'TerminateWebSessionInfo'\n });\n\n const rows = await Promise.all(sessions.map(Session));\n section.content.append(...rows.map((row) => row.container));\n\n let leftLength = rows.length;\n attachClickEvent(section.content, async(e) => {\n const row = findUpClassName(e.target, 'row');\n if(!row) {\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'TerminateWebSessionText',\n descriptionLangArgs: [await wrapPeerTitle({peerId: row.dataset.peerId.toPeerId()})],\n button: {\n langKey: 'Disconnect',\n isDanger: true\n }\n });\n\n const hash = row.dataset.hash;\n row.classList.add('is-disabled');\n this.managers.appSeamlessLoginManager.resetWebAuthorization(hash).then(() => {\n if(!--leftLength) {\n this.close();\n } else {\n row.remove();\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SliderSuperTab, {SliderSuperTabEventable} from '../../sliderTab';\nimport Row from '../../row';\nimport {AccountPassword, Authorization, InputPrivacyKey, Updates, WebAuthorization} from '../../../layer';\nimport AppPrivacyPhoneNumberTab from './privacy/phoneNumber';\nimport AppTwoStepVerificationTab from './2fa';\nimport AppTwoStepVerificationEnterPasswordTab from './2fa/enterPassword';\nimport AppTwoStepVerificationEmailConfirmationTab from './2fa/emailConfirmation';\nimport AppPrivacyLastSeenTab from './privacy/lastSeen';\nimport AppPrivacyProfilePhotoTab from './privacy/profilePhoto';\nimport AppPrivacyForwardMessagesTab from './privacy/forwardMessages';\nimport AppPrivacyAddToGroupsTab from './privacy/addToGroups';\nimport AppPrivacyCallsTab from './privacy/calls';\nimport AppActiveSessionsTab from './activeSessions';\nimport AppBlockedUsersTab from './blockedUsers';\nimport rootScope from '../../../lib/rootScope';\nimport {i18n, LangPackKey, _i18n} from '../../../lib/langPack';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport CheckboxField from '../../checkboxField';\nimport PopupPeer from '../../popups/peer';\nimport Button from '../../button';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\nimport getPrivacyRulesDetails from '../../../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\nimport PrivacyType from '../../../lib/appManagers/utils/privacy/privacyType';\nimport confirmationPopup, {PopupConfirmationOptions} from '../../confirmationPopup';\nimport noop from '../../../helpers/noop';\nimport {toastNew} from '../../toast';\nimport AppPrivacyVoicesTab from './privacy/voices';\nimport SettingSection from '../../settingSection';\nimport AppActiveWebSessionsTab from './activeWebSessions';\n\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\n private activeSessionsRow: Row;\n private authorizations: Authorization.authorization[];\n\n private websitesRow: Row;\n private websites: WebAuthorization[];\n\n public static getInitArgs(fromTab: SliderSuperTab) {\n return {\n appConfig: fromTab.managers.apiManager.getAppConfig(),\n globalPrivacy: fromTab.managers.appPrivacyManager.getGlobalPrivacySettings(),\n contentSettings: fromTab.managers.apiManager.invokeApi('account.getContentSettings'),\n webAuthorizations: fromTab.managers.appSeamlessLoginManager.getWebAuthorizations()\n };\n }\n\n public init(p: ReturnType) {\n this.container.classList.add('dont-u-dare-block-me');\n this.setTitle('PrivacySettings');\n\n const SUBTITLE: LangPackKey = 'Loading';\n const promises: Promise[] = [];\n\n {\n const section = new SettingSection({noDelimiter: true, caption: 'SessionsInfo'});\n\n let blockedPeerIds: PeerId[];\n const blockedUsersRow = new Row({\n icon: 'deleteuser',\n titleLangKey: 'BlockedUsers',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppBlockedUsersTab);\n tab.peerIds = blockedPeerIds;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n blockedUsersRow.freezed = true;\n\n let passwordState: AccountPassword;\n const twoFactorRowOptions = {\n icon: 'lock',\n titleLangKey: 'TwoStepVerification' as LangPackKey,\n subtitleLangKey: SUBTITLE,\n clickable: (e: Event) => {\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\n if(passwordState.pFlags.has_password) {\n tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n } else if(passwordState.email_unconfirmed_pattern) {\n tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\n tab.email = passwordState.email_unconfirmed_pattern;\n tab.length = 6;\n tab.isFirst = true;\n this.managers.passwordManager.resendPasswordEmail();\n } else {\n tab = this.slider.createTab(AppTwoStepVerificationTab);\n }\n\n tab.state = passwordState;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n };\n\n const twoFactorRow = new Row(twoFactorRowOptions);\n twoFactorRow.freezed = true;\n\n const activeSessionsRow = this.activeSessionsRow = new Row({\n icon: 'activesessions',\n titleLangKey: 'SessionsTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppActiveSessionsTab);\n tab.authorizations = this.authorizations;\n tab.eventListener.addEventListener('destroy', () => {\n this.updateActiveSessions();\n }, {once: true});\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n activeSessionsRow.freezed = true;\n\n const websitesRow = this.websitesRow = new Row({\n icon: 'mention',\n titleLangKey: 'OtherWebSessions',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppActiveWebSessionsTab);\n tab.eventListener.addEventListener('destroy', () => {\n this.updateActiveWebsites();\n });\n tab.open(this.websites);\n },\n listenerSetter: this.listenerSetter\n });\n websitesRow.freezed = true;\n\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container, websitesRow.container);\n this.scrollable.append(section.container);\n\n const setBlockedCount = (count: number) => {\n if(count) {\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\n } else {\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\n }\n };\n\n this.listenerSetter.add(rootScope)('peer_block', () => {\n /* const {blocked, peerId} = update;\n if(!blocked) blockedPeerIds.findAndSplice((p) => p === peerId);\n else blockedPeerIds.unshift(peerId);\n blockedCount += blocked ? 1 : -1;\n setBlockedCount(blockedCount); */\n updateBlocked();\n });\n\n const updateBlocked = () => {\n this.managers.appUsersManager.getBlocked().then((res) => {\n blockedUsersRow.freezed = false;\n setBlockedCount(res.count);\n blockedPeerIds = res.peerIds;\n });\n };\n\n updateBlocked();\n\n this.managers.passwordManager.getState().then((state) => {\n passwordState = state;\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\n twoFactorRow.freezed = false;\n\n // console.log('password state', state);\n });\n\n this.updateActiveSessions();\n promises.push(this.updateActiveWebsites(p.webAuthorizations));\n }\n\n {\n const section = new SettingSection({name: 'PrivacyTitle', caption: 'GroupsAndChannelsHelp'});\n\n section.content.classList.add('privacy-navigation-container');\n\n const rowsByKeys: Partial<{\n [key in InputPrivacyKey['_']]: Row\n }> = {};\n\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\n titleLangKey: 'PrivacyPhoneTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyPhoneNumberTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\n titleLangKey: 'LastSeenTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyLastSeenTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\n titleLangKey: 'PrivacyProfilePhotoTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyProfilePhotoTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\n titleLangKey: 'WhoCanCallMe',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyCallsTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\n titleLangKey: 'PrivacyForwardsTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyForwardMessagesTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\n titleLangKey: 'WhoCanAddMe',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyAddToGroupsTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const voicesRow = rowsByKeys['inputPrivacyKeyVoiceMessages'] = new Row({\n titleLangKey: 'PrivacyVoiceMessagesTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n if(!rootScope.premium) {\n toastNew({langPackKey: 'PrivacyVoiceMessagesPremiumOnly'});\n } else {\n this.slider.createTab(AppPrivacyVoicesTab).open();\n }\n },\n listenerSetter: this.listenerSetter\n });\n\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\n const row = rowsByKeys[key];\n if(!row) {\n return;\n }\n\n this.managers.appPrivacyManager.getPrivacy(key).then((rules) => {\n const details = getPrivacyRulesDetails(rules);\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\n\n row.subtitle.innerHTML = '';\n const s = i18n(langKey);\n row.subtitle.append(s);\n if(disallowLength || allowLength) {\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\n }\n });\n };\n\n section.content.append(\n numberVisibilityRow.container,\n lastSeenTimeRow.container,\n photoVisibilityRow.container,\n callRow.container,\n linkAccountRow.container,\n groupChatsAddRow.container,\n voicesRow.container\n );\n this.scrollable.append(section.container);\n\n for(const key in rowsByKeys) {\n updatePrivacyRow(key as keyof typeof rowsByKeys);\n }\n\n rootScope.addEventListener('privacy_update', (update) => {\n updatePrivacyRow(convertKeyToInputKey(update.key._) as any);\n });\n }\n\n {\n const section = new SettingSection({name: 'NewChatsFromNonContacts', caption: 'ArchiveAndMuteInfo'});\n\n const checkboxField = new CheckboxField({text: 'ArchiveAndMute'});\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n let enabled: boolean, destroyed: boolean;\n this.eventListener.addEventListener('destroy', () => {\n destroyed = true;\n if(enabled === undefined || enabled === checkboxField.checked) return;\n return this.managers.appPrivacyManager.setGlobalPrivacySettings({\n _: 'globalPrivacySettings',\n archive_and_mute_new_noncontact_peers: checkboxField.checked\n });\n }, {once: true});\n\n const promise = Promise.all([\n p.appConfig,\n p.globalPrivacy\n ]).then(([appConfig, settings]) => {\n if(destroyed) {\n return;\n }\n\n const onPremiumToggle = (isPremium: boolean) => {\n section.container.classList.toggle('hide', !isPremium && !appConfig.autoarchive_setting_available);\n };\n\n this.listenerSetter.add(rootScope)('premium_toggle', onPremiumToggle);\n onPremiumToggle(rootScope.premium);\n\n enabled = !!settings.archive_and_mute_new_noncontact_peers;\n\n checkboxField.setValueSilently(enabled);\n });\n\n promises.push(promise);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'Privacy.SensitiveContent', caption: 'PrivacyAndSecurity.SensitiveDesc'});\n section.container.classList.add('hide');\n\n const checkboxField = new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText'});\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n let enabled: boolean;\n this.eventListener.addEventListener('destroy', () => {\n if(enabled === undefined) return;\n const _enabled = row.checkboxField.checked;\n const isChanged = _enabled !== enabled;\n if(!isChanged) {\n return;\n }\n\n return this.managers.apiManager.invokeApi('account.setContentSettings', {\n sensitive_enabled: _enabled\n });\n }, {once: true});\n\n const promise = p.contentSettings.then((settings) => {\n if(!settings.pFlags.sensitive_can_change) {\n return;\n }\n\n enabled = !!settings.pFlags.sensitive_enabled;\n checkboxField.setValueSilently(enabled);\n section.container.classList.remove('hide');\n });\n\n promises.push(promise);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'PrivacyPayments', caption: 'PrivacyPaymentsClearInfo'});\n\n const onClearClick = () => {\n const options: PopupConfirmationOptions = {\n titleLangKey: 'PrivacyPaymentsClearAlertTitle',\n descriptionLangKey: 'PrivacyPaymentsClearAlertText',\n button: {\n langKey: 'Clear'\n },\n checkboxes: [{\n text: 'PrivacyClearShipping',\n checked: true\n }, {\n text: 'PrivacyClearPayment',\n checked: true\n }]\n };\n\n confirmationPopup(options).then(() => {\n const [info, payment] = options.checkboxes.map((c) => c.checkboxField.checked);\n const toggle = toggleDisability([clearButton], true);\n this.managers.appPaymentsManager.clearSavedInfo(info, payment).then(() => {\n if(!info && !payment) {\n return;\n }\n\n toggle();\n toastNew({\n langPackKey: info && payment ? 'PrivacyPaymentsPaymentShippingCleared' : (info ? 'PrivacyPaymentsShippingInfoCleared' : 'PrivacyPaymentsPaymentInfoCleared')\n });\n });\n }, noop);\n };\n\n const clearButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyPaymentsClear'});\n this.listenerSetter.add(clearButton)('click', onClearClick);\n section.content.append(clearButton);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'FilterChats'});\n\n const onDeleteClick = () => {\n const popup = new PopupPeer('popup-delete-drafts', {\n buttons: [{\n langKey: 'Delete',\n callback: () => {\n const toggle = toggleDisability([deleteButton], true);\n this.managers.appDraftsManager.clearAllDrafts().then(() => {\n toggle();\n });\n },\n isDanger: true\n }],\n titleLangKey: 'AreYouSureClearDraftsTitle',\n descriptionLangKey: 'AreYouSureClearDrafts'\n });\n\n popup.show();\n };\n\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\n section.content.append(deleteButton);\n\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then((drafts) => {\n const draftsRow = new Row({\n titleLangKey: 'PrivacyDeleteCloudDrafts',\n subtitleLangKey: 'Drafts',\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\n icon: 'delete',\n clickable: onDeleteClick\n });\n\n section.content.append(draftsRow.container);\n })); */\n\n this.scrollable.append(section.container);\n }\n\n // {\n // const section = new SettingSection({\n // name: 'OtherWebSessions'\n // });\n\n // const row = new Row({\n\n // });\n\n // this.scrollable.append(section.container);\n // }\n\n return Promise.all(promises);\n }\n\n public updateActiveSessions() {\n return this.managers.apiManager.invokeApi('account.getAuthorizations').then((auths) => {\n this.activeSessionsRow.freezed = false;\n this.authorizations = auths.authorizations;\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\n });\n }\n\n public updateActiveWebsites(promise = this.managers.appSeamlessLoginManager.getWebAuthorizations()) {\n return promise.then((authorizations) => {\n this.websitesRow.freezed = false;\n this.websites = authorizations;\n _i18n(this.websitesRow.subtitle, 'Privacy.Websites', [this.websites.length]);\n this.websitesRow.container.classList.toggle('hide', !this.websites.length);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AvailableReaction} from '../../../layer';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport SettingSection from '../../settingSection';\nimport SliderSuperTab from '../../sliderTab';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\n\nexport default class AppQuickReactionTab extends SliderSuperTab {\n public init() {\n this.setTitle('DoubleTapSetting');\n this.container.classList.add('quick-reaction-container');\n\n return Promise.all([\n this.managers.appReactionsManager.getQuickReaction(),\n this.managers.appReactionsManager.getAvailableReactions()\n ]).then(([quickReaction, availableReactions]) => {\n availableReactions = availableReactions.filter((reaction) => !reaction.pFlags.inactive);\n\n const section = new SettingSection();\n\n const name = 'quick-reaction';\n const rows = availableReactions.map((availableReaction) => {\n const radioField = new RadioField({\n name,\n text: availableReaction.title,\n value: availableReaction.reaction,\n alignRight: true\n });\n\n const row = new Row({\n radioField,\n havePadding: true\n });\n\n radioField.main.classList.add('quick-reaction-title');\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n if(availableReaction.reaction === (quickReaction as AvailableReaction).reaction) {\n radioField.setValueSilently(true);\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, (value) => {\n this.managers.appReactionsManager.setDefaultReaction({_: 'reactionEmoji', emoticon: value});\n });\n\n section.content.append(form);\n this.scrollable.append(section.container);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport RangeSelector from '../../rangeSelector';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport RadioField from '../../radioField';\nimport rootScope from '../../../lib/rootScope';\nimport {IS_APPLE} from '../../../environment/userAgent';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport AppBackgroundTab, {getHexColorFromTelegramColor, getRgbColorFromTelegramColor} from './background';\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport assumeType from '../../../helpers/assumeType';\nimport {AvailableReaction, BaseTheme, MessagesAllStickers, StickerSet} from '../../../layer';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport PopupStickers from '../../popups/stickers';\nimport eachMinute from '../../../helpers/eachMinute';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport IS_GEOLOCATION_SUPPORTED from '../../../environment/geolocationSupport';\nimport AppQuickReactionTab from './quickReaction';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {State} from '../../../config/state';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\nimport SettingSection, {generateSection} from '../../settingSection';\nimport {ScrollableX} from '../../scrollable';\nimport wrapStickerEmoji from '../../wrappers/stickerEmoji';\nimport {Theme} from '../../../layer';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport {hexToRgb, ColorRgb, rgbaToHexa, rgbaToHsla, rgbToHsv, hsvToRgb} from '../../../helpers/color';\nimport clamp from '../../../helpers/number/clamp';\nimport themeController from '../../../helpers/themeController';\n\nexport class RangeSettingSelector {\n public container: HTMLDivElement;\n public valueContainer: HTMLElement;\n private range: RangeSelector;\n\n public onChange: (value: number) => void;\n\n constructor(\n name: LangPackKey,\n step: number,\n initialValue: number,\n minValue: number,\n maxValue: number,\n writeValue = true\n ) {\n const BASE_CLASS = 'range-setting-selector';\n this.container = document.createElement('div');\n this.container.classList.add(BASE_CLASS);\n\n const details = document.createElement('div');\n details.classList.add(BASE_CLASS + '-details');\n\n const nameDiv = document.createElement('div');\n nameDiv.classList.add(BASE_CLASS + '-name');\n _i18n(nameDiv, name);\n\n const valueDiv = this.valueContainer = document.createElement('div');\n valueDiv.classList.add(BASE_CLASS + '-value');\n\n if(writeValue) {\n valueDiv.innerHTML = '' + initialValue;\n }\n\n details.append(nameDiv, valueDiv);\n\n this.range = new RangeSelector({\n step,\n min: minValue,\n max: maxValue\n }, initialValue);\n this.range.setListeners();\n this.range.setHandlers({\n onScrub: value => {\n if(this.onChange) {\n this.onChange(value);\n }\n\n if(writeValue) {\n // console.log('font size scrub:', value);\n valueDiv.innerText = '' + value;\n }\n }\n });\n\n this.container.append(details, this.range.container);\n }\n}\n\nexport default class AppGeneralSettingsTab extends SliderSuperTabEventable {\n public static getInitArgs() {\n return {\n accountThemes: rootScope.managers.apiManager.invokeApi('account.getThemes', {format: 'android', hash: 0}),\n allStickers: rootScope.managers.appStickersManager.getAllStickers(),\n quickReaction: rootScope.managers.appReactionsManager.getQuickReaction()\n };\n }\n\n public init(p: ReturnType) {\n this.container.classList.add('general-settings-container');\n this.setTitle('General');\n\n const section = generateSection.bind(null, this.scrollable);\n const promises: Promise[] = [];\n\n {\n const container = section('Settings');\n\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\n range.onChange = (value) => {\n rootScope.managers.appStateManager.setByKey('settings.messagesTextSize', value);\n };\n\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\n\n const initArgs = AppBackgroundTab.getInitArgs();\n attachClickEvent(chatBackgroundButton, () => {\n this.slider.createTab(AppBackgroundTab).open(initArgs);\n });\n\n const animationsCheckboxField = new CheckboxField({\n text: 'EnableAnimations',\n name: 'animations',\n stateKey: 'settings.animationsEnabled',\n listenerSetter: this.listenerSetter\n });\n\n container.append(\n range.container,\n chatBackgroundButton,\n CreateRowFromCheckboxField(animationsCheckboxField).container\n );\n }\n\n if(false) {\n const container = section('ColorTheme');\n\n const scrollable = new ScrollableX(null);\n const themesContainer = scrollable.container;\n themesContainer.classList.add('themes-container');\n\n type K = {theme: Theme, player?: RLottiePlayer};\n const themesMap = new Map();\n\n type AppColorName = 'primary-color' | 'message-out-primary-color';\n type AppColor = {\n rgb?: boolean,\n light?: boolean,\n lightFilled?: boolean,\n dark?: boolean,\n darkRgb?: boolean,\n darkFilled?: boolean\n };\n\n const appColorMap: {[name in AppColorName]: AppColor} = {\n 'primary-color': {\n rgb: true,\n light: true,\n lightFilled: true,\n dark: true,\n darkRgb: true\n },\n 'message-out-primary-color': {\n rgb: true,\n light: true,\n lightFilled: true,\n dark: true\n }\n };\n\n var mix = function(color1: ColorRgb, color2: ColorRgb, weight: number) {\n const out = new Array(3) as ColorRgb;\n for(let i = 0; i < 3; ++i) {\n const v1 = color1[i], v2 = color2[i];\n out[i] = Math.floor(v2 + (v1 - v2) * (weight / 100.0));\n }\n\n return out;\n };\n\n function computePerceivedBrightness(color: ColorRgb) {\n return (color[0] * 0.2126 + color[1] * 0.7152 + color[2] * 0.0722) / 255;\n }\n\n function getAverageColor(color1: ColorRgb, color2: ColorRgb): ColorRgb {\n return color1.map((v, i) => Math.round((v + color2[i]) / 2)) as ColorRgb;\n }\n\n const getAccentColor = (baseHsv: number[], baseColor: ColorRgb, elementColor: ColorRgb): ColorRgb => {\n const hsvTemp3 = rgbToHsv(...baseColor);\n const hsvTemp4 = rgbToHsv(...elementColor);\n\n const dist = Math.min(1.5 * hsvTemp3[1] / baseHsv[1], 1);\n\n hsvTemp3[0] = Math.min(360, hsvTemp4[0] - hsvTemp3[0] + baseHsv[0]);\n hsvTemp3[1] = Math.min(1, hsvTemp4[1] * baseHsv[1] / hsvTemp3[1]);\n hsvTemp3[2] = Math.min(1, (hsvTemp4[2] / hsvTemp3[2] + dist - 1) * baseHsv[2] / dist);\n if(hsvTemp3[2] < 0.3) {\n return elementColor;\n }\n return hsvToRgb(...hsvTemp3);\n };\n\n const changeColorAccent = (baseHsv: number[], accentHsv: number[], color: ColorRgb, isDarkTheme = themeController.isNight()) => {\n const colorHsv = rgbToHsv(...color);\n\n const diffH = Math.min(Math.abs(colorHsv[0] - baseHsv[0]), Math.abs(colorHsv[0] - baseHsv[0] - 360));\n if(diffH > 30) {\n return color;\n }\n\n const dist = Math.min(1.5 * colorHsv[1] / baseHsv[1], 1);\n\n colorHsv[0] = Math.min(360, colorHsv[0] + accentHsv[0] - baseHsv[0]);\n colorHsv[1] = Math.min(1, colorHsv[1] * accentHsv[1] / baseHsv[1]);\n colorHsv[2] = Math.min(1, colorHsv[2] * (1 - dist + dist * accentHsv[2] / baseHsv[2]));\n\n let newColor = hsvToRgb(...colorHsv);\n\n const origBrightness = computePerceivedBrightness(color);\n const newBrightness = computePerceivedBrightness(newColor);\n\n // We need to keep colors lighter in dark themes and darker in light themes\n const needRevertBrightness = isDarkTheme ? origBrightness > newBrightness : origBrightness < newBrightness;\n\n if(needRevertBrightness) {\n const amountOfNew = 0.6;\n const fallbackAmount = (1 - amountOfNew) * origBrightness / newBrightness + amountOfNew;\n newColor = changeBrightness(newColor, fallbackAmount);\n }\n\n return newColor;\n };\n\n const changeBrightness = (color: ColorRgb, amount: number) => {\n return color.map((v) => clamp(Math.round(v * amount), 0, 255)) as ColorRgb;\n };\n\n const applyAppColor = ({\n name,\n hex,\n element = document.documentElement,\n lightenAlpha = 0.08,\n darkenAlpha = lightenAlpha\n }: {\n name: AppColorName,\n hex: string,\n element?: HTMLElement,\n lightenAlpha?: number\n darkenAlpha?: number\n }) => {\n const appColor = appColorMap[name];\n const rgb = hexToRgb(hex);\n const hsla = rgbaToHsla(...rgb);\n\n const mixColor2 = hexToRgb(themeController.isNight() ? '#212121' : '#ffffff');\n const lightenedRgb = mix(rgb, mixColor2, lightenAlpha * 100);\n\n const darkenedHsla: typeof hsla = {\n ...hsla,\n l: hsla.l - darkenAlpha * 100\n };\n\n element.style.setProperty('--' + name, hex);\n appColor.rgb && element.style.setProperty('--' + name + '-rgb', rgb.join(','));\n appColor.light && element.style.setProperty('--light-' + name, `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, ${lightenAlpha})`);\n appColor.lightFilled && element.style.setProperty('--light-filled-' + name, `rgb(${lightenedRgb[0]}, ${lightenedRgb[1]}, ${lightenedRgb[2]})`);\n appColor.dark && element.style.setProperty('--dark-' + name, `hsl(${darkenedHsla.h}, ${darkenedHsla.s}%, ${darkenedHsla.l}%)`);\n // appColor.darkFilled && element.style.setProperty('--dark-' + name, `hsl(${darkenedHsla.h}, ${darkenedHsla.s}%, ${darkenedHsla.l}%)`);\n };\n\n const applyTheme = (theme: Theme, element = document.documentElement) => {\n const isNight = themeController.isNight();\n const themeSettings = theme.settings.find((settings) => settings.base_theme._ === (isNight ? 'baseThemeNight' : 'baseThemeClassic'));\n\n console.log('applyTheme', theme, themeSettings);\n\n // android `accentBaseColor` and `key_chat_outBubble`\n const PRIMARY_COLOR = isNight ? '#3e88f6' : '#328ace';\n const LIGHT_PRIMARY_COLOR = isNight ? '#366cae' : '#e6f2fb';\n\n const hsvTemp1 = rgbToHsv(...hexToRgb(PRIMARY_COLOR)); // primary base\n let hsvTemp2 = rgbToHsv(...getRgbColorFromTelegramColor(themeSettings.accent_color)); // new primary\n\n const newAccentRgb = changeColorAccent(\n hsvTemp1,\n hsvTemp2,\n hexToRgb(PRIMARY_COLOR)\n // hexToRgb('#eeffde')\n );\n const newAccentHex = rgbaToHexa(newAccentRgb);\n\n let h = getHexColorFromTelegramColor(themeSettings.accent_color);\n console.log(h, newAccentHex);\n h = newAccentHex;\n\n applyAppColor({\n name: 'primary-color',\n hex: h,\n // hex: newAccentHex,\n element,\n darkenAlpha: 0.04\n });\n\n if(element === document.documentElement) {\n AppBackgroundTab.setBackgroundDocument(themeSettings.wallpaper);\n }\n\n if(!themeSettings.message_colors?.length) {\n return;\n }\n\n const messageOutRgbColor = hexToRgb(LIGHT_PRIMARY_COLOR); // light primary\n\n const firstColor = getRgbColorFromTelegramColor(themeSettings.message_colors[0]);\n\n let messageColor = firstColor;\n if(themeSettings.message_colors.length > 1) {\n themeSettings.message_colors.slice(1).forEach((nextColor) => {\n messageColor = getAverageColor(messageColor, getRgbColorFromTelegramColor(nextColor));\n });\n\n messageColor = getAccentColor(hsvTemp1, messageOutRgbColor, firstColor);\n }\n\n const o = messageColor;\n // const hsvTemp1 = rgbToHsv(...hexToRgb('#4fae4e'));\n // const hsvTemp1 = rgbToHsv(...hexToRgb('#328ace'));\n hsvTemp2 = rgbToHsv(...o);\n\n const c = changeColorAccent(\n hsvTemp1,\n hsvTemp2,\n messageOutRgbColor\n // hexToRgb('#eeffde')\n );\n\n console.log(o, c);\n\n applyAppColor({\n name: 'message-out-primary-color',\n hex: rgbaToHexa(messageColor),\n element,\n lightenAlpha: isNight ? 0.76 : 0.12\n });\n };\n\n attachClickEvent(themesContainer, (e) => {\n const container = findUpClassName(e.target, 'theme-container');\n if(!container) {\n return;\n }\n\n const lastActive = themesContainer.querySelector('.active');\n if(lastActive) {\n lastActive.classList.remove('active');\n }\n\n const item = themesMap.get(container);\n container.classList.add('active');\n\n if(item.player) {\n if(item.player.paused) {\n item.player.restart();\n }\n }\n\n applyTheme(item.theme);\n }, {listenerSetter: this.listenerSetter});\n\n const promise = p.accountThemes.then(async(accountThemes) => {\n if(accountThemes._ === 'account.themesNotModified') {\n return;\n }\n\n console.log(accountThemes);\n\n const defaultThemes = accountThemes.themes.filter((theme) => theme.pFlags.default);\n const promises = defaultThemes.map(async(theme, idx) => {\n const baseTheme: BaseTheme['_'] = themeController.isNight() ? 'baseThemeNight' : 'baseThemeClassic';\n const wallpaper = theme.settings.find((settings) => settings.base_theme._ === baseTheme).wallpaper;\n const result = AppBackgroundTab.addWallPaper(wallpaper);\n\n const container = result.container;\n const k: K = {theme};\n themesMap.set(container, k);\n\n applyTheme(theme, container);\n\n if(idx === 0) {\n container.classList.add('active');\n }\n\n const emoticon = theme.emoticon;\n const loadPromises: Promise[] = [];\n let emoticonContainer: HTMLElement;\n if(emoticon) {\n emoticonContainer = document.createElement('div');\n emoticonContainer.classList.add('theme-emoticon');\n const size = 28;\n wrapStickerEmoji({\n div: emoticonContainer,\n width: size,\n height: size,\n emoji: theme.emoticon,\n managers: this.managers,\n loadPromises,\n middleware: this.middlewareHelper.get()\n }).then(({render}) => render).then((player) => {\n k.player = player as RLottiePlayer;\n });\n }\n\n const bubble = document.createElement('div');\n bubble.classList.add('theme-bubble');\n\n const bubbleIn = bubble.cloneNode() as HTMLElement;\n\n bubbleIn.classList.add('is-in');\n bubble.classList.add('is-out');\n\n loadPromises.push(result.loadPromise);\n\n container.classList.add('theme-container');\n\n await Promise.all(loadPromises);\n\n if(emoticonContainer) {\n container.append(emoticonContainer);\n }\n\n container.append(bubbleIn, bubble);\n\n return container;\n });\n\n const containers = await Promise.all(promises);\n\n scrollable.append(...containers);\n });\n\n promises.push(promise);\n\n container.append(\n themesContainer\n );\n }\n\n {\n const container = section('General.Keyboard');\n\n const form = document.createElement('form');\n\n const name = 'send-shortcut';\n const stateKey = 'settings.sendShortcut';\n\n const enterRow = new Row({\n radioField: new RadioField({\n langKey: 'General.SendShortcut.Enter',\n name,\n value: 'enter',\n stateKey\n }),\n subtitleLangKey: 'General.SendShortcut.NewLine.ShiftEnter'\n });\n\n const ctrlEnterRow = new Row({\n radioField: new RadioField({\n name,\n value: 'ctrlEnter',\n stateKey\n }),\n subtitleLangKey: 'General.SendShortcut.NewLine.Enter'\n });\n _i18n(ctrlEnterRow.radioField.main, 'General.SendShortcut.CtrlEnter', [IS_APPLE ? '⌘' : 'Ctrl']);\n\n form.append(enterRow.container, ctrlEnterRow.container);\n container.append(form);\n }\n\n if(IS_GEOLOCATION_SUPPORTED) {\n const container = section('DistanceUnitsTitle');\n\n const form = document.createElement('form');\n\n const name = 'distance-unit';\n const stateKey = 'settings.distanceUnit';\n\n const kilometersRow = new Row({\n radioField: new RadioField({\n langKey: 'DistanceUnitsKilometers',\n name,\n value: 'kilometers',\n stateKey\n })\n });\n\n const milesRow = new Row({\n radioField: new RadioField({\n langKey: 'DistanceUnitsMiles',\n name,\n value: 'miles',\n stateKey\n })\n });\n\n form.append(kilometersRow.container, milesRow.container);\n container.append(form);\n }\n\n {\n const container = section('General.TimeFormat');\n\n const form = document.createElement('form');\n\n const name = 'time-format';\n const stateKey = 'settings.timeFormat';\n\n const formats: [State['settings']['timeFormat'], LangPackKey][] = [\n ['h12', 'General.TimeFormat.h12'],\n ['h23', 'General.TimeFormat.h23']\n ];\n\n const rows = formats.map(([format, langPackKey]) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: langPackKey,\n name,\n value: format,\n stateKey\n })\n });\n\n return row;\n });\n\n const cancel = eachMinute(() => {\n const date = new Date();\n\n formats.forEach(([format], idx) => {\n const str = date.toLocaleTimeString('en-us-u-hc-' + format, {\n hour: '2-digit',\n minute: '2-digit'\n });\n\n rows[idx].subtitle.textContent = str;\n });\n });\n\n this.eventListener.addEventListener('destroy', cancel);\n\n form.append(...rows.map((row) => row.container));\n container.append(form);\n }\n\n {\n const container = section('Emoji');\n\n const suggestCheckboxField = new CheckboxField({\n text: 'GeneralSettings.EmojiPrediction',\n name: 'suggest-emoji',\n stateKey: 'settings.emoji.suggest',\n listenerSetter: this.listenerSetter\n });\n const bigCheckboxField = new CheckboxField({\n text: 'GeneralSettings.BigEmoji',\n name: 'emoji-big',\n stateKey: 'settings.emoji.big',\n listenerSetter: this.listenerSetter\n });\n\n container.append(\n CreateRowFromCheckboxField(suggestCheckboxField).container,\n CreateRowFromCheckboxField(bigCheckboxField).container\n );\n }\n\n {\n const section = new SettingSection({name: 'Telegram.InstalledStickerPacksController', caption: 'StickersBotInfo'});\n\n const reactionsRow = new Row({\n titleLangKey: 'DoubleTapSetting',\n havePadding: true,\n clickable: () => {\n this.slider.createTab(AppQuickReactionTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const renderQuickReaction = () => {\n p.quickReaction.then((reaction) => {\n if(reaction._ === 'availableReaction') {\n return reaction.static_icon;\n } else {\n return this.managers.appEmojiManager.getCustomEmojiDocument(reaction.document_id);\n }\n }).then((doc) => {\n wrapStickerToRow({\n row: reactionsRow,\n doc,\n size: 'small'\n });\n });\n };\n\n renderQuickReaction();\n\n this.listenerSetter.add(rootScope)('quick_reaction', renderQuickReaction);\n\n const suggestCheckboxField = new CheckboxField({\n text: 'Stickers.SuggestStickers',\n name: 'suggest',\n stateKey: 'settings.stickers.suggest',\n listenerSetter: this.listenerSetter\n });\n const loopCheckboxField = new CheckboxField({\n text: 'InstalledStickers.LoopAnimated',\n name: 'loop',\n stateKey: 'settings.stickers.loop',\n listenerSetter: this.listenerSetter\n });\n\n const stickerSets: {[id: string]: Row} = {};\n\n const stickersContent = section.generateContentElement();\n\n const lazyLoadQueue = new LazyLoadQueue();\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\n const row = new Row({\n title: wrapEmojiText(stickerSet.title),\n subtitleLangKey: 'Stickers',\n subtitleLangArgs: [stickerSet.count],\n havePadding: true,\n clickable: () => {\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\n },\n listenerSetter: this.listenerSetter\n });\n\n stickerSets[stickerSet.id] = row;\n\n const div = document.createElement('div');\n div.classList.add('row-media');\n\n wrapStickerSetThumb({\n set: stickerSet,\n container: div,\n group: 'GENERAL-SETTINGS',\n lazyLoadQueue,\n width: 36,\n height: 36,\n autoplay: true,\n middleware: this.middlewareHelper.get()\n });\n\n row.container.append(div);\n\n stickersContent[method](row.container);\n };\n\n const promise = p.allStickers.then((allStickers) => {\n assumeType(allStickers);\n const promises = allStickers.sets.map((stickerSet) => renderStickerSet(stickerSet));\n return Promise.all(promises);\n });\n\n promises.push(promise);\n\n this.listenerSetter.add(rootScope)('stickers_installed', (set) => {\n if(!stickerSets[set.id]) {\n renderStickerSet(set, 'prepend');\n }\n });\n\n this.listenerSetter.add(rootScope)('stickers_deleted', (set) => {\n if(stickerSets[set.id]) {\n stickerSets[set.id].container.remove();\n delete stickerSets[set.id];\n }\n });\n\n section.content.append(\n reactionsRow.container,\n CreateRowFromCheckboxField(suggestCheckboxField).container,\n CreateRowFromCheckboxField(loopCheckboxField).container\n );\n this.scrollable.append(section.container);\n }\n\n return Promise.all(promises);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport eachTimeout from './eachTimeout';\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachMinute(callback: () => any, runFirst = true) {\n return eachTimeout(callback, () => (60 - new Date().getSeconds()) * 1000, runFirst);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from '../environment/ctx';\nimport noop from './noop';\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachTimeout(callback: () => any, getNextTimeout: () => number, runFirst = true) {\n const cancel = () => {\n clearTimeout(timeout);\n };\n\n // replace callback to run noop and restore after\n const _callback = callback;\n if(!runFirst) {\n callback = noop;\n }\n\n let timeout: number;\n (function run() {\n callback();\n timeout = ctx.setTimeout(run, getNextTimeout());\n })();\n\n callback = _callback;\n\n return cancel;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter} from '../../../lib/storages/filters';\nimport type {DialogFilterSuggested} from '../../../layer';\nimport type _rootScope from '../../../lib/rootScope';\nimport {SliderSuperTab} from '../../slider';\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\nimport Button from '../../button';\nimport rootScope from '../../../lib/rootScope';\nimport AppEditFolderTab from './editFolder';\nimport Row from '../../row';\nimport {i18n, i18n_, LangPackKey, join} from '../../../lib/langPack';\nimport cancelEvent from '../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport SettingSection from '../../settingSection';\nimport Sortable from '../../../helpers/dom/sortable';\nimport whichChild from '../../../helpers/dom/whichChild';\nimport indexOfAndSplice from '../../../helpers/array/indexOfAndSplice';\nimport showLimitPopup from '../../popups/limit';\n\nexport default class AppChatFoldersTab extends SliderSuperTab {\n private createFolderBtn: HTMLElement;\n private foldersSection: SettingSection;\n private suggestedSection: SettingSection;\n private stickerContainer: HTMLElement;\n private animation: RLottiePlayer;\n private list: HTMLElement;\n\n private filtersRendered: {[filterId: number]: Row} = {};\n private loadAnimationPromise: ReturnType;\n\n public static getInitArgs() {\n return {\n animationData: lottieLoader.loadAnimationFromURLManually('Folders_1'),\n filters: rootScope.managers.filtersStorage.getDialogFilters()\n };\n }\n\n private async renderFolder(\n dialogFilter: DialogFilterSuggested | MyDialogFilter,\n container?: HTMLElement,\n row?: Row,\n append?: boolean\n ) {\n let filter: MyDialogFilter;\n let description = '';\n const d: HTMLElement[] = [];\n if(dialogFilter._ === 'dialogFilterSuggested') {\n filter = dialogFilter.filter as MyDialogFilter;\n description = dialogFilter.description;\n } else {\n filter = dialogFilter;\n\n const enabledFilters = Object.keys(filter.pFlags).length;\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach((key) => {\n enabledFilters += +!!filter[key].length;\n }); */\n\n if(enabledFilters === 1) {\n const pFlags = filter.pFlags;\n let k: LangPackKey;\n if(pFlags.contacts) k = 'FilterAllContacts';\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\n else if(pFlags.groups) k = 'FilterAllGroups';\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\n else if(pFlags.bots) k = 'FilterAllBots';\n\n if(k) {\n d.push(i18n(k));\n }\n }\n\n if(!d.length) {\n const folder = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\n let chats = 0, channels = 0, groups = 0;\n await Promise.all(folder.map(async(dialog) => {\n if(await this.managers.appPeersManager.isAnyGroup(dialog.peerId)) groups++;\n else if(await this.managers.appPeersManager.isBroadcast(dialog.peerId)) channels++;\n else chats++;\n }));\n\n if(chats) d.push(i18n('Chats', [chats]));\n if(channels) d.push(i18n('Channels', [channels]));\n if(groups) d.push(i18n('Groups', [groups]));\n }\n }\n\n if(!row) {\n row = new Row({\n title: filter.id === FOLDER_ID_ALL ? i18n('FilterAllChats') : wrapEmojiText(filter.title),\n subtitle: description,\n clickable: true,\n buttonRightLangKey: dialogFilter._ === 'dialogFilterSuggested' ? 'Add' : undefined\n });\n\n if(d.length) {\n row.subtitle.append(...join(d));\n }\n\n if(dialogFilter._ === 'dialogFilter') {\n const filterId = filter.id;\n if(!this.filtersRendered[filter.id] && filter.id !== FOLDER_ID_ALL) {\n const initArgs = AppEditFolderTab.getInitArgs();\n attachClickEvent(row.container, async() => {\n const filter = await this.managers.filtersStorage.getFilter(filterId);\n const tab = this.slider.createTab(AppEditFolderTab);\n tab.setInitFilter(filter);\n tab.open(initArgs);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.filtersRendered[filter.id] = row;\n\n row.makeSortable();\n }\n } else {\n if(filter.id !== FOLDER_ID_ALL) {\n replaceContent(row.title, wrapEmojiText(filter.title));\n }\n\n row.subtitle.textContent = '';\n row.subtitle.append(...join(d));\n }\n\n const div = row.container;\n\n if(append) {\n const localId = (filter as MyDialogFilter).localId;\n if(localId !== undefined) {\n // ! header will be at 0 index\n positionElementByIndex(div, div.parentElement || container, localId);\n } else if(container) {\n container.append(div);\n }\n }\n\n return row;\n }\n\n public init(p: ReturnType = AppChatFoldersTab.getInitArgs()) {\n this.container.classList.add('chat-folders-container');\n this.setTitle('ChatList.Filter.List.Title');\n\n this.scrollable.container.classList.add('chat-folders');\n\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add('sticker-container');\n\n const caption = document.createElement('div');\n caption.classList.add('caption');\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\n\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'ChatList.Filter.NewTitle',\n icon: 'add'\n });\n\n this.foldersSection = new SettingSection({\n name: 'Filters'\n });\n this.foldersSection.container.classList.add('hide');\n\n this.list = document.createElement('div');\n this.foldersSection.content.append(this.list);\n\n this.suggestedSection = new SettingSection({\n name: 'FilterRecommended'\n });\n this.suggestedSection.container.classList.add('hide');\n\n this.scrollable.append(\n this.stickerContainer,\n caption,\n this.createFolderBtn,\n this.foldersSection.container,\n this.suggestedSection.container\n );\n\n attachClickEvent(this.createFolderBtn, async() => {\n if(!(await this.canCreateFolder())) {\n showLimitPopup('folders');\n } else {\n this.slider.createTab(AppEditFolderTab).open();\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onFiltersContainerUpdate = () => {\n this.foldersSection.container.classList.toggle('hide', !Object.keys(this.filtersRendered).length);\n };\n\n const loadPromises: Promise[] = [];\n const renderFiltersPromise = p.filters.then(async(filters) => {\n for(const filter of filters) {\n if(filter.id === FOLDER_ID_ARCHIVE) {\n continue;\n }\n\n await this.renderFolder(filter, this.list, undefined, true);\n }\n\n this.toggleAllChats();\n\n onFiltersContainerUpdate();\n });\n\n loadPromises.push(renderFiltersPromise);\n\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\n const filterRendered = this.filtersRendered[filter.id];\n if(filterRendered) {\n await this.renderFolder(filter, null, filterRendered);\n } else if(filter.id !== FOLDER_ID_ARCHIVE) {\n await this.renderFolder(filter, this.list, undefined, true);\n }\n\n onFiltersContainerUpdate();\n\n this.getSuggestedFilters();\n });\n\n this.listenerSetter.add(rootScope)('filter_delete', (filter) => {\n const filterRendered = this.filtersRendered[filter.id];\n if(filterRendered) {\n /* for(const suggested of this.suggestedFilters) {\n if(deepEqual(suggested.filter, filter)) {\n\n }\n } */\n this.getSuggestedFilters();\n\n filterRendered.container.remove();\n delete this.filtersRendered[filter.id];\n }\n\n onFiltersContainerUpdate();\n });\n\n this.listenerSetter.add(rootScope)('filter_order', (order) => {\n order.filter((filterId) => !!this.filtersRendered[filterId]).forEach((filterId, idx) => {\n const filterRendered = this.filtersRendered[filterId];\n const container = filterRendered.container;\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header\n });\n });\n\n this.listenerSetter.add(rootScope)('premium_toggle', () => {\n this.toggleAllChats();\n });\n\n this.loadAnimationPromise = p.animationData.then(async(cb) => {\n const player = await cb({\n container: this.stickerContainer,\n loop: false,\n autoplay: false,\n width: 86,\n height: 86\n });\n\n this.animation = player;\n\n return lottieLoader.waitForFirstFrame(player);\n });\n\n loadPromises.push(this.loadAnimationPromise);\n\n new Sortable({\n list: this.list,\n middleware: this.middlewareHelper.get(),\n onSort: (prevIdx, newIdx) => {\n let order: number[] = [];\n for(const filterId in this.filtersRendered) {\n const row = this.filtersRendered[filterId];\n const idx = whichChild(row.container);\n order[idx] = +filterId;\n }\n\n order = order.filter((filterId) => filterId !== undefined);\n if(!rootScope.premium) {\n indexOfAndSplice(order, FOLDER_ID_ALL);\n // order.unshift(FOLDER_ID_ALL);\n }\n\n this.managers.filtersStorage.updateDialogFiltersOrder(order);\n },\n scrollable: this.scrollable\n });\n\n this.getSuggestedFilters();\n\n /* return Promise.all([\n this.loadAnimationPromise\n ]); */\n return Promise.all(loadPromises);\n }\n\n onOpenAfterTimeout() {\n this.loadAnimationPromise.then(() => {\n this.animation.autoplay = true;\n this.animation.play();\n });\n\n return super.onOpenAfterTimeout();\n }\n\n private toggleAllChats() {\n const filterRendered = this.filtersRendered[FOLDER_ID_ALL];\n filterRendered.container.classList.toggle('hide', !rootScope.premium);\n }\n\n private async canCreateFolder() {\n const [limit, filters] = await Promise.all([\n this.managers.apiManager.getLimit('folders'),\n this.managers.filtersStorage.getDialogFilters()\n ]);\n\n const filtersLength = filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).length;\n return filtersLength < limit;\n }\n\n private getSuggestedFilters() {\n return this.managers.filtersStorage.getSuggestedDialogsFilters().then(async(suggestedFilters) => {\n this.suggestedSection.container.classList.toggle('hide', !suggestedFilters.length);\n Array.from(this.suggestedSection.content.children).slice(1).forEach((el) => el.remove());\n\n for(const filter of suggestedFilters) {\n const row = await this.renderFolder(filter);\n this.suggestedSection.content.append(row.container);\n\n const button = row.buttonRight;\n attachClickEvent(button, async(e) => {\n cancelEvent(e);\n\n if(!(await this.canCreateFolder())) {\n showLimitPopup('folders');\n return;\n }\n\n button.setAttribute('disabled', 'true');\n\n const f = filter.filter as MyDialogFilter;\n f.includePeerIds = [];\n f.excludePeerIds = [];\n f.pinnedPeerIds = [];\n\n this.managers.filtersStorage.createDialogFilter(f, true).then(() => {\n row.container.remove();\n this.suggestedSection.container.classList.toggle('hide', this.suggestedSection.content.childElementCount === 1);\n }).finally(() => {\n button.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Row from '../../row';\nimport CheckboxField from '../../checkboxField';\nimport {InputNotifyPeer, InputPeerNotifySettings, Update} from '../../../layer';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport rootScope from '../../../lib/rootScope';\nimport {LangPackKey} from '../../../lib/langPack';\nimport copy from '../../../helpers/object/copy';\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\nimport {MUTE_UNTIL} from '../../../lib/mtproto/mtproto_config';\nimport apiManagerProxy from '../../../lib/mtproto/mtprotoworker';\nimport SettingSection from '../../settingSection';\n\ntype InputNotifyKey = Exclude;\n\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('notifications-container');\n this.setTitle('Telegram.NotificationSettingsViewController');\n\n const NotifySection = (options: {\n name: LangPackKey,\n typeText: LangPackKey,\n inputKey: InputNotifyKey,\n }) => {\n const section = new SettingSection({\n name: options.name\n });\n\n const enabledRow = new Row({\n checkboxField: new CheckboxField({text: options.typeText, checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n const previewEnabledRow = new Row({\n checkboxField: new CheckboxField({text: 'MessagePreview', checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n section.content.append(enabledRow.container, previewEnabledRow.container);\n\n this.scrollable.append(section.container);\n\n const inputNotifyPeer = {_: options.inputKey};\n const ret = this.managers.appNotificationsManager.getNotifySettings(inputNotifyPeer);\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\n const applySettings = async() => {\n const muted = await this.managers.appNotificationsManager.isMuted(notifySettings);\n enabledRow.checkboxField.checked = !muted;\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\n\n return muted;\n };\n\n applySettings();\n\n this.eventListener.addEventListener('destroy', async() => {\n const mute = !enabledRow.checkboxField.checked;\n const showPreviews = previewEnabledRow.checkboxField.checked;\n\n if(mute === (await this.managers.appNotificationsManager.isMuted(notifySettings)) && showPreviews === notifySettings.show_previews) {\n return;\n }\n\n const inputSettings: InputPeerNotifySettings = copy(notifySettings) as any;\n inputSettings._ = 'inputPeerNotifySettings';\n inputSettings.mute_until = mute ? MUTE_UNTIL : 0;\n inputSettings.show_previews = showPreviews;\n delete inputSettings.flags;\n\n this.managers.appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\n }, {once: true});\n\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\n const inputKey = convertKeyToInputKey(update.peer._) as any;\n if(options.inputKey === inputKey) {\n notifySettings = update.notify_settings;\n applySettings();\n }\n });\n });\n };\n\n NotifySection({\n name: 'NotificationsPrivateChats',\n typeText: 'NotificationsForPrivateChats',\n inputKey: 'inputNotifyUsers'\n });\n\n NotifySection({\n name: 'NotificationsGroups',\n typeText: 'NotificationsForGroups',\n inputKey: 'inputNotifyChats'\n });\n\n NotifySection({\n name: 'NotificationsChannels',\n typeText: 'NotificationsForChannels',\n inputKey: 'inputNotifyBroadcasts'\n });\n\n {\n const section = new SettingSection({\n name: 'NotificationsOther'\n });\n\n const contactsSignUpRow = new Row({\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n const soundRow = new Row({\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound', listenerSetter: this.listenerSetter}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n apiManagerProxy.getState().then((state) => {\n soundRow.checkboxField.checked = state.settings.notifications.sound;\n });\n\n section.content.append(contactsSignUpRow.container, soundRow.container);\n\n this.scrollable.append(section.container);\n\n this.managers.appNotificationsManager.getContactSignUpNotification().then((enabled) => {\n contactsSignUpRow.checkboxField.checked = enabled;\n\n this.eventListener.addEventListener('destroy', () => {\n const _enabled = contactsSignUpRow.checkboxField.checked;\n if(enabled !== _enabled) {\n this.managers.appNotificationsManager.setContactSignUpNotification(!_enabled);\n }\n }, {once: true});\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {randomLong} from '../../../helpers/random';\nimport {LangPackLanguage} from '../../../layer';\nimport I18n from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTab} from '../../slider'\n\nexport default class AppLanguageTab extends SliderSuperTab {\n public static getInitArgs() {\n return {\n languages1: rootScope.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\n lang_pack: 'web'\n }),\n // languages2: rootScope.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\n // lang_pack: 'macos'\n // })\n languages2: Promise.resolve([] as LangPackLanguage[])\n };\n }\n\n public init(p: ReturnType) {\n this.header.classList.add('with-border');\n this.container.classList.add('language-container');\n this.setTitle('Telegram.LanguageViewController');\n\n const section = new SettingSection({});\n\n const radioRows: Map = new Map();\n\n const promise = Promise.all([\n p.languages1,\n p.languages2\n ]).then(([languages1, languages2]) => {\n const rendered: Set = new Set();\n const webLangCodes = languages1.map((language) => language.lang_code);\n\n const random = randomLong();\n languages1.concat(languages2).forEach((language) => {\n if(rendered.has(language.lang_code)) return;\n rendered.add(language.lang_code);\n\n const row = new Row({\n radioField: new RadioField({\n text: language.name,\n name: random,\n value: language.lang_code\n }),\n subtitle: language.native_name\n });\n\n radioRows.set(language.lang_code, row);\n });\n\n const form = RadioFormFromRows([...radioRows.values()], (value) => {\n I18n.getLangPack(value, webLangCodes.includes(value));\n });\n\n I18n.getCacheLangPack().then((langPack) => {\n const row = radioRows.get(langPack.lang_code);\n if(!row) {\n console.error('no row', row, langPack);\n return;\n }\n\n row.radioField.setValueSilently(true);\n });\n\n section.content.append(form);\n });\n\n this.scrollable.append(section.container);\n\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../../../../helpers/listenerSetter';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport CheckboxField from '../../../checkboxField';\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport Row, {CreateRowFromCheckboxField} from '../../../row';\nimport SettingSection from '../../../settingSection';\n\nexport function autoDownloadPeerTypeSection(type: 'photo' | 'video' | 'file', title: LangPackKey, listenerSetter: ListenerSetter) {\n const section = new SettingSection({name: title});\n\n const key = 'settings.autoDownload.' + type + '.';\n const contactsCheckboxField = new CheckboxField({\n text: 'AutodownloadContacts',\n name: 'contacts',\n stateKey: key + 'contacts',\n listenerSetter\n });\n const privateCheckboxField = new CheckboxField({\n text: 'AutodownloadPrivateChats',\n name: 'private',\n stateKey: key + 'private',\n listenerSetter\n });\n const groupsCheckboxField = new CheckboxField({\n text: 'AutodownloadGroupChats',\n name: 'groups',\n stateKey: key + 'groups',\n listenerSetter\n });\n const channelsCheckboxField = new CheckboxField({\n text: 'AutodownloadChannels',\n name: 'channels',\n stateKey: key + 'channels',\n listenerSetter\n });\n\n section.content.append(\n CreateRowFromCheckboxField(contactsCheckboxField).container,\n CreateRowFromCheckboxField(privateCheckboxField).container,\n CreateRowFromCheckboxField(groupsCheckboxField).container,\n CreateRowFromCheckboxField(channelsCheckboxField).container\n );\n\n return section;\n}\n\nexport default class AppAutoDownloadPhotoTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadPhotos');\n\n const section = autoDownloadPeerTypeSection('photo', 'AutoDownloadPhotosTitle', this.listenerSetter);\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport formatBytes from '../../../../helpers/formatBytes';\nimport debounce from '../../../../helpers/schedulers/debounce';\nimport I18n from '../../../../lib/langPack';\nimport rootScope from '../../../../lib/rootScope';\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport {RangeSettingSelector} from '../generalSettings';\nimport {autoDownloadPeerTypeSection} from './photo';\n\nexport default class AppAutoDownloadFileTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadFiles');\n\n const debouncedSave = debounce((sizeMax: number) => {\n this.managers.appStateManager.setByKey('settings.autoDownloadNew.file_size_max', sizeMax);\n }, 200, false, true);\n\n const section = autoDownloadPeerTypeSection('file', 'AutoDownloadFilesTitle', this.listenerSetter);\n\n const MIN = 512 * 1024;\n // const MAX = 2 * 1024 * 1024 * 1024;\n const MAX = 20 * 1024 * 1024;\n const MAX_RANGE = MAX - MIN;\n\n const sizeMax = rootScope.settings.autoDownloadNew.file_size_max;\n const value = Math.sqrt(Math.sqrt((sizeMax - MIN) / MAX_RANGE));\n const upTo = new I18n.IntlElement({\n key: 'AutodownloadSizeLimitUpTo',\n args: [formatBytes(sizeMax)]\n });\n const range = new RangeSettingSelector('AutoDownloadMaxFileSize', 0.01, value, 0, 1, false);\n range.onChange = (value) => {\n const sizeMax = (value ** 4 * MAX_RANGE + MIN) | 0;\n\n upTo.compareAndUpdate({args: [formatBytes(sizeMax)]});\n\n debouncedSave(sizeMax);\n };\n\n range.valueContainer.append(upTo.element);\n\n section.content.append(range.container);\n\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport {autoDownloadPeerTypeSection} from './photo';\n\nexport default class AppAutoDownloadVideoTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadVideos');\n\n const section = autoDownloadPeerTypeSection('video', 'AutoDownloadVideosTitle', this.listenerSetter);\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AutoDownloadPeerTypeSettings, STATE_INIT} from '../../../config/state';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport formatBytes from '../../../helpers/formatBytes';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {FormatterArguments, i18n, join, LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport confirmationPopup from '../../confirmationPopup';\nimport Row from '../../row';\nimport {SliderSuperTabEventable, SliderSuperTabEventableConstructable} from '../../sliderTab';\nimport AppAutoDownloadFileTab from './autoDownload/file';\nimport AppAutoDownloadPhotoTab from './autoDownload/photo';\nimport AppAutoDownloadVideoTab from './autoDownload/video';\nimport apiManagerProxy from '../../../lib/mtproto/mtprotoworker';\nimport SettingSection from '../../settingSection';\n\nconst AUTO_DOWNLOAD_FOR_KEYS: {[k in keyof AutoDownloadPeerTypeSettings]: LangPackKey} = {\n contacts: 'AutoDownloadContacts',\n private: 'AutoDownloadPm',\n groups: 'AutoDownloadGroups',\n channels: 'AutoDownloadChannels'\n};\n\nexport default class AppDataAndStorageTab extends SliderSuperTabEventable {\n public async init() {\n this.setTitle('DataSettings');\n\n {\n const section = new SettingSection({name: 'AutomaticMediaDownload', caption: 'AutoDownloadAudioInfo'});\n\n const state = await apiManagerProxy.getState();\n\n const autoCheckboxField = new CheckboxField({\n text: 'AutoDownloadMedia',\n name: 'auto',\n checked: !state.settings.autoDownloadNew.pFlags.disabled,\n listenerSetter: this.listenerSetter\n });\n\n const autoRow = new Row({\n checkboxField: autoCheckboxField,\n listenerSetter: this.listenerSetter\n });\n\n const onChange = () => {\n toggleDisability([resetButton],\n deepEqual(state.settings.autoDownload, STATE_INIT.settings.autoDownload) &&\n deepEqual(state.settings.autoDownloadNew, STATE_INIT.settings.autoDownloadNew));\n };\n\n const setSubtitles = () => {\n this.setAutoDownloadSubtitle(photoRow, state.settings.autoDownload.photo /* state.settings.autoDownloadNew.photo_size_max */);\n this.setAutoDownloadSubtitle(videoRow, state.settings.autoDownload.video/* , state.settings.autoDownloadNew.video_size_max */);\n this.setAutoDownloadSubtitle(fileRow, state.settings.autoDownload.file, state.settings.autoDownloadNew.file_size_max);\n };\n\n const openTab = (tabConstructor: SliderSuperTabEventableConstructable) => {\n const tab = this.slider.createTab(tabConstructor);\n tab.open();\n\n this.listenerSetter.add(tab.eventListener)('destroy', () => {\n setSubtitles();\n onChange();\n }, {once: true});\n };\n\n const photoRow = new Row({\n titleLangKey: 'AutoDownloadPhotos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadPhotoTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const videoRow = new Row({\n titleLangKey: 'AutoDownloadVideos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadVideoTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const fileRow = new Row({\n titleLangKey: 'AutoDownloadFiles',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadFileTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const resetButton = Button('btn-primary btn-transparent primary', {icon: 'delete', text: 'ResetAutomaticMediaDownload'});\n attachClickEvent(resetButton, () => {\n confirmationPopup({\n titleLangKey: 'ResetAutomaticMediaDownloadAlertTitle',\n descriptionLangKey: 'ResetAutomaticMediaDownloadAlert',\n button: {\n langKey: 'Reset'\n }\n }).then(() => {\n const settings = rootScope.settings;\n settings.autoDownloadNew = copy(STATE_INIT.settings.autoDownloadNew);\n settings.autoDownload = copy(STATE_INIT.settings.autoDownload);\n state.settings = settings;\n this.managers.appStateManager.setByKey('settings', settings);\n\n setSubtitles();\n autoCheckboxField.checked = !state.settings.autoDownloadNew.pFlags.disabled;\n });\n });\n\n const onDisabledChange = () => {\n const disabled = !autoCheckboxField.checked;\n\n const settings = rootScope.settings;\n if(disabled) {\n settings.autoDownloadNew.pFlags.disabled = true;\n } else {\n delete settings.autoDownloadNew.pFlags.disabled;\n }\n\n [photoRow, videoRow, fileRow].forEach((row) => {\n row.container.classList.toggle('is-disabled', disabled);\n });\n\n this.managers.appStateManager.setByKey('settings', settings);\n\n onChange();\n };\n\n autoCheckboxField.input.addEventListener('change', onDisabledChange);\n onDisabledChange();\n setSubtitles();\n\n section.content.append(\n autoRow.container,\n photoRow.container,\n videoRow.container,\n fileRow.container,\n resetButton\n );\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'AutoplayMedia'});\n\n section.content.append(new Row({\n checkboxField: new CheckboxField({\n text: 'AutoplayGIF',\n name: 'gifs',\n stateKey: 'settings.autoPlay.gifs',\n listenerSetter: this.listenerSetter\n }),\n listenerSetter: this.listenerSetter\n }).container, new Row({\n checkboxField: new CheckboxField({\n text: 'AutoplayVideo',\n name: 'videos',\n stateKey: 'settings.autoPlay.videos',\n listenerSetter: this.listenerSetter\n }),\n listenerSetter: this.listenerSetter\n }).container);\n\n this.scrollable.append(section.container);\n }\n }\n\n private setAutoDownloadSubtitle(row: Row, settings: AutoDownloadPeerTypeSettings, sizeMax?: number) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n\n const peerKeys = Object.keys(settings) as (keyof typeof AUTO_DOWNLOAD_FOR_KEYS)[];\n const enabledKeys = peerKeys.map((key) => settings[key] ? AUTO_DOWNLOAD_FOR_KEYS[key] : undefined).filter(Boolean);\n if(!enabledKeys.length || sizeMax === 0) {\n key = 'AutoDownloadOff';\n } else {\n const isAll = enabledKeys.length === peerKeys.length;\n if(sizeMax !== undefined) {\n key = isAll ? 'AutoDownloadUpToOnAllChats' : 'AutoDownloadOnUpToFor';\n args.push(formatBytes(sizeMax));\n } else {\n key = isAll ? 'AutoDownloadOnAllChats' : 'AutoDownloadOnFor';\n }\n\n if(!isAll) {\n const fragment = document.createElement('span');\n fragment.append(...join(enabledKeys.map((key) => i18n(key)), true, false));\n args.push(fragment);\n }\n }\n\n replaceContent(row.subtitle, i18n(key, args));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport ButtonMenuToggle from '../../buttonMenuToggle';\nimport Button from '../../button';\nimport AppPrivacyAndSecurityTab from './privacyAndSecurity';\nimport AppGeneralSettingsTab from './generalSettings';\nimport AppEditProfileTab from './editProfile';\nimport AppChatFoldersTab from './chatFolders';\nimport AppNotificationsTab from './notifications';\nimport AppLanguageTab from './language';\nimport lottieLoader from '../../../lib/rlottie/lottieLoader';\nimport PopupPeer from '../../popups/peer';\nimport AppDataAndStorageTab from './dataAndStorage';\nimport ButtonIcon from '../../buttonIcon';\nimport PeerProfile from '../../peerProfile';\nimport rootScope from '../../../lib/rootScope';\nimport Row from '../../row';\nimport AppActiveSessionsTab from './activeSessions';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport {SliderSuperTabConstructable, SliderSuperTabEventable} from '../../sliderTab';\nimport PopupAvatar from '../../popups/avatar';\nimport {AccountAuthorizations, Authorization} from '../../../layer';\nimport PopupElement from '../../popups';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n// import AppMediaViewer from \"../../appMediaViewerNew\";\n\nexport default class AppSettingsTab extends SliderSuperTab {\n private buttons: {\n edit: HTMLButtonElement,\n folders: HTMLButtonElement,\n general: HTMLButtonElement,\n notifications: HTMLButtonElement,\n storage: HTMLButtonElement,\n privacy: HTMLButtonElement,\n } = {} as any;\n private profile: PeerProfile;\n\n private languageRow: Row;\n private devicesRow: Row;\n\n private authorizations: Authorization.authorization[];\n private getAuthorizationsPromise: Promise;\n\n public async init() {\n this.container.classList.add('settings-container');\n this.setTitle('Settings');\n\n const btnMenu = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'logout',\n text: 'EditAccount.Logout',\n onClick: () => {\n new PopupPeer('logout', {\n titleLangKey: 'LogOut',\n descriptionLangKey: 'LogOut.Description',\n buttons: [{\n langKey: 'LogOut',\n callback: () => {\n this.managers.apiManager.logOut();\n },\n isDanger: true\n }]\n }).show();\n }\n }]\n });\n\n this.buttons.edit = ButtonIcon('edit');\n\n this.header.append(this.buttons.edit, btnMenu);\n\n this.profile = new PeerProfile(this.managers, this.scrollable, this.listenerSetter, false);\n this.profile.init();\n this.profile.setPeer(rootScope.myId);\n const fillPromise = this.profile.fillProfileElements();\n\n const changeAvatarBtn = Button('btn-circle btn-corner z-depth-1 profile-change-avatar', {icon: 'cameraadd'});\n attachClickEvent(changeAvatarBtn, () => {\n const canvas = document.createElement('canvas');\n PopupElement.createPopup(PopupAvatar).open(canvas, (upload) => {\n upload().then((inputFile) => {\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\n });\n });\n }, {listenerSetter: this.listenerSetter});\n this.profile.element.lastElementChild.firstElementChild.append(changeAvatarBtn);\n\n const updateChangeAvatarBtn = async() => {\n const user = await this.managers.appUsersManager.getSelf();\n changeAvatarBtn.classList.toggle('hide', user.photo?._ !== 'userProfilePhoto');\n };\n\n updateChangeAvatarBtn();\n this.listenerSetter.add(rootScope)('avatar_update', ({peerId}) => {\n if(rootScope.myId === peerId) {\n updateChangeAvatarBtn();\n }\n });\n\n /* const div = document.createElement('div');\n //div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem 0 10rem auto;';\n //div.style.width = '135px';\n //div.style.height = '100px';\n div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem auto 10rem 0;';\n div.style.width = '135px';\n div.style.height = '100px';\n\n const img = document.createElement('img');\n img.src = 'assets/img/pepe.jpg';\n img.classList.add('media-photo');\n img.style.cssText = 'max-width: 100%;max-height: 100%;';\n\n div.append(img);\n\n div.addEventListener('click', () => {\n new AppMediaViewer().setSearchContext({peerId: 61004386, inputFilter: 'inputMessagesFilterPhotos'}).openMedia({\n _: 'message',\n mid: 1,\n peerId: 61004386,\n fromId: 61004386,\n message: '',\n media: {\n _: 'messageMediaPhoto',\n photo: {\n _: 'photo',\n url: img.src,\n downloaded: 111,\n sizes: [{\n _: 'photoSize',\n type: 'x',\n w: 618,\n h: 412\n }]\n }\n },\n date: Date.now() / 1000 | 0\n }, img);\n });\n\n this.scrollable.append(div); */\n\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add('profile-buttons');\n\n type ConstructorP = T extends {\n new (...args: any[]): infer U;\n } ? U : never;\n\n const m = (\n icon: string,\n text: LangPackKey,\n c: T,\n getInitArgs?: () => Promise['init']>>\n ): {\n icon: string,\n text: LangPackKey,\n tabConstructor: T,\n getInitArgs?: typeof getInitArgs,\n // args?: ReturnType\n args?: any\n } => {\n if(!getInitArgs) {\n const g = (c as any as typeof SliderSuperTab).getInitArgs;\n if(g) {\n // @ts-ignore\n getInitArgs = () => [g(this)];\n }\n }\n\n return {\n icon,\n text,\n tabConstructor: c,\n getInitArgs,\n args: getInitArgs?.()\n };\n };\n\n // const k = (c: T): () => [ReturnType['getInitArgs']>] => {\n // return () => (c as any).getInitArgs(this);\n // };\n\n const b = [\n m('unmute', 'AccountSettings.Notifications', AppNotificationsTab),\n m('data', 'DataSettings', AppDataAndStorageTab),\n m('lock', 'AccountSettings.PrivacyAndSecurity', AppPrivacyAndSecurityTab),\n m('settings', 'Telegram.GeneralSettingsViewController', AppGeneralSettingsTab),\n m('folder', 'AccountSettings.Filters', AppChatFoldersTab)\n ];\n\n const rows = b.map((item) => {\n const {icon, text: langPackKey, tabConstructor, getInitArgs} = item;\n return new Row({\n titleLangKey: langPackKey,\n icon,\n clickable: async() => {\n const args = item.args ? await item.args : [];\n const tab = this.slider.createTab(tabConstructor as any);\n tab.open(...args);\n\n if(tab instanceof SliderSuperTabEventable && getInitArgs) {\n tab.eventListener.addEventListener('destroyAfter', (promise) => {\n item.args = promise.then(() => getInitArgs() as any);\n });\n }\n },\n listenerSetter: this.listenerSetter\n });\n });\n\n const languageArgs = AppLanguageTab.getInitArgs();\n rows.push(\n this.devicesRow = new Row({\n titleLangKey: 'Devices',\n titleRightSecondary: ' ',\n icon: 'activesessions',\n clickable: async() => {\n if(!this.authorizations) {\n await this.updateActiveSessions();\n }\n\n const tab = this.slider.createTab(AppActiveSessionsTab);\n tab.authorizations = this.authorizations;\n tab.eventListener.addEventListener('destroy', () => {\n this.authorizations = undefined;\n this.updateActiveSessions(true);\n }, {once: true});\n tab.open();\n },\n listenerSetter: this.listenerSetter\n }),\n\n this.languageRow = new Row({\n titleLangKey: 'AccountSettings.Language',\n titleRightSecondary: i18n('LanguageName'),\n icon: 'language',\n clickable: () => {\n this.slider.createTab(AppLanguageTab).open(languageArgs);\n },\n listenerSetter: this.listenerSetter\n })\n );\n\n buttonsDiv.append(...rows.map((row) => row.container));\n\n // const profileSection = new SettingSection({fullWidth: true, noPaddingTop: true});\n // profileSection.content.append(this.profile.element);\n\n const buttonsSection = new SettingSection();\n buttonsSection.content.append(buttonsDiv);\n\n this.scrollable.append(this.profile.element/* profileSection.container */, buttonsSection.container);\n\n const getEditProfileArgs = () => {\n editProfileArgs = AppEditProfileTab.getInitArgs();\n };\n let editProfileArgs: ReturnType;\n attachClickEvent(this.buttons.edit, () => {\n const tab = this.slider.createTab(AppEditProfileTab);\n tab.open(editProfileArgs);\n }, {listenerSetter: this.listenerSetter});\n getEditProfileArgs();\n // this.listenerSetter.add(rootScope)('user_full_update', (userId) => {\n // if(rootScope.myId.toUserId() === userId) {\n // getEditProfileArgs();\n // }\n // });\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(rootScope.myId.toUserId() === userId) {\n getEditProfileArgs();\n }\n });\n\n lottieLoader.loadLottieWorkers();\n\n this.updateActiveSessions();\n\n (await fillPromise)();\n }\n\n private getAuthorizations(overwrite?: boolean) {\n if(this.getAuthorizationsPromise && !overwrite) return this.getAuthorizationsPromise;\n\n const promise = this.getAuthorizationsPromise = this.managers.apiManager.invokeApi('account.getAuthorizations')\n .finally(() => {\n if(this.getAuthorizationsPromise === promise) {\n this.getAuthorizationsPromise = undefined;\n }\n });\n\n return promise;\n }\n\n public updateActiveSessions(overwrite?: boolean) {\n return this.getAuthorizations(overwrite).then((auths) => {\n this.authorizations = auths.authorizations;\n this.devicesRow.titleRight.textContent = '' + this.authorizations.length;\n });\n }\n\n public onCloseAfterTimeout() {\n this.profile.destroy();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appSidebarLeft from '..';\nimport {InputFile} from '../../../layer';\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport AvatarEdit from '../../avatarEdit';\nimport AppAddMembersTab from './addMembers';\nimport {_i18n} from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nexport default class AppNewChannelTab extends SliderSuperTab {\n private uploadAvatar: () => Promise = null;\n\n private channelNameInputField: InputField;\n private channelDescriptionInputField: InputField;\n private nextBtn: HTMLButtonElement;\n private avatarEdit: AvatarEdit;\n\n public init() {\n this.container.classList.add('new-channel-container');\n this.setTitle('NewChannel');\n\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n });\n\n const section = new SettingSection({\n caption: 'Channel.DescriptionHolderDescrpiton'\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.channelNameInputField = new InputField({\n label: 'EnterChannelName',\n maxLength: 128\n });\n\n this.channelDescriptionInputField = new InputField({\n label: 'DescriptionOptionalPlaceholder',\n maxLength: 255\n });\n\n inputWrapper.append(this.channelNameInputField.container, this.channelDescriptionInputField.container);\n\n const onLengthChange = () => {\n this.nextBtn.classList.toggle('is-visible', !!this.channelNameInputField.value.length &&\n !this.channelNameInputField.input.classList.contains('error') &&\n !this.channelDescriptionInputField.input.classList.contains('error'));\n };\n\n this.channelNameInputField.input.addEventListener('input', onLengthChange);\n this.channelDescriptionInputField.input.addEventListener('input', onLengthChange);\n\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n\n attachClickEvent(this.nextBtn, () => {\n const title = this.channelNameInputField.value;\n const about = this.channelDescriptionInputField.value;\n\n this.nextBtn.disabled = true;\n this.managers.appChatsManager.createChannel({\n title,\n about,\n broadcast: true\n }).then((channelId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(channelId, inputFile);\n });\n }\n\n appImManager.setInnerPeer({peerId: channelId.toPeerId(true)});\n\n appSidebarLeft.removeTabFromHistory(this);\n this.slider.createTab(AppAddMembersTab).open({\n type: 'channel',\n skippable: true,\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo',\n takeOut: (peerIds) => {\n return this.managers.appChatsManager.inviteToChannel(channelId, peerIds);\n }\n });\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.content.append(this.nextBtn);\n section.content.append(this.avatarEdit.container, inputWrapper);\n this.scrollable.append(section.container);\n }\n\n public onCloseAfterTimeout() {\n this.avatarEdit.clear();\n this.uploadAvatar = null;\n this.channelNameInputField.value = '';\n this.channelDescriptionInputField.value = '';\n this.nextBtn.disabled = false;\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from '../inputField';\nimport PopupElement from '.';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport EditPeer from '../editPeer';\nimport {_i18n} from '../../lib/langPack';\nimport TelInputField from '../telInputField';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport {toastNew} from '../toast';\n\nexport default class PopupCreateContact extends PopupElement {\n constructor() {\n super('popup-create-contact popup-send-photo popup-new-media', {closable: true, withConfirm: 'Add', title: 'AddContactTitle'});\n this.construct();\n }\n\n private async construct() {\n attachClickEvent(this.btnConfirm, () => {\n const promise = this.managers.appUsersManager.importContact(nameInputField.value, lastNameInputField.value, telInputField.value);\n\n promise.then(() => {\n this.hide();\n }, (err) => {\n if(err.type === 'NO_USER') {\n toastNew({langPackKey: 'Contacts.PhoneNumber.NotRegistred'});\n editPeer.disabled = false;\n }\n });\n\n editPeer.lockWithPromise(promise);\n }, {listenerSetter: this.listenerSetter});\n\n const inputFields: InputField[] = [];\n const div = document.createElement('div');\n div.classList.add('name-fields');\n const nameInputField = new InputField({\n label: 'FirstName',\n name: 'create-contact-name',\n maxLength: 70,\n required: true\n });\n const lastNameInputField = new InputField({\n label: 'LastName',\n name: 'create-contact-lastname',\n maxLength: 70\n });\n const telInputField = new TelInputField({required: true});\n inputFields.push(nameInputField, lastNameInputField, telInputField);\n\n const onInput = () => {\n const name = nameInputField.value + ' ' + lastNameInputField.value;\n // const abbr = getAbbreviation(name);\n editPeer.avatarElem.peerTitle = name;\n editPeer.avatarElem.update();\n };\n\n this.listenerSetter.add(nameInputField.input)('input', onInput);\n this.listenerSetter.add(lastNameInputField.input)('input', onInput);\n\n telInputField.validate = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n const user = await this.managers.appUsersManager.getSelf();\n const formatted = formatPhoneNumber(user.phone);\n if(formatted.code) {\n telInputField.value = '+' + formatted.code.country_code;\n }\n\n const editPeer = new EditPeer({\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true,\n nextBtn: this.btnConfirm,\n avatarSize: 100\n });\n\n div.append(nameInputField.container, lastNameInputField.container, editPeer.avatarElem);\n this.container.append(div, telInputField.container);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport InputSearch from '../../inputSearch';\nimport {IS_MOBILE} from '../../../environment/userAgent';\nimport {canFocus} from '../../../helpers/dom/canFocus';\nimport windowSize from '../../../helpers/windowSize';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport PopupCreateContact from '../../popups/createContact';\nimport SortedUserList from '../../sortedUserList';\nimport {getMiddleware} from '../../../helpers/middleware';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport rootScope from '../../../lib/rootScope';\nimport PopupElement from '../../popups';\n\n// TODO: поиск по людям глобальный, если не нашло в контактах никого\n\nexport default class AppContactsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private middleware: ReturnType;\n private sortedUserList: SortedUserList;\n\n public init() {\n this.container.id = 'contacts-container';\n\n // this.list = appDialogsManager.createChatList(/* {avatarSize: 48, handheldsSize: 66} */);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, () => {\n PopupElement.createPopup(PopupCreateContact);\n }, {listenerSetter: this.listenerSetter});\n\n this.inputSearch = new InputSearch('Search', (value) => {\n this.openContacts(value);\n });\n\n this.listenerSetter.add(rootScope)('contacts_update', async(userId) => {\n const isContact = await this.managers.appUsersManager.isContact(userId);\n const peerId = userId.toPeerId();\n if(isContact) this.sortedUserList.add(peerId);\n else this.sortedUserList.delete(peerId);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.middleware = getMiddleware();\n\n this.openContacts();\n\n // preload contacts\n // appUsersManager.getContacts();\n }\n\n protected createList() {\n const sortedUserList = new SortedUserList({\n managers: this.managers\n });\n const list = sortedUserList.list;\n list.id = 'contacts';\n list.classList.add('contacts-container');\n appDialogsManager.setListClickListener(list, () => {\n this.close();\n }, undefined, true);\n return sortedUserList;\n }\n\n protected onClose() {\n this.middleware.clean();\n /* // need to clear, and left 1 page for smooth slide\n let pageCount = appPhotosManager.windowH / 56 * 1.25 | 0;\n (Array.from(this.list.children) as HTMLElement[]).slice(pageCount).forEach((el) => el.remove()); */\n }\n\n protected onOpenAfterTimeout() {\n if(IS_MOBILE || !canFocus(true)) return;\n this.inputSearch.input.focus();\n }\n\n public openContacts(query?: string) {\n this.middleware.clean();\n const middleware = this.middleware.get();\n this.scrollable.onScrolledBottom = null;\n this.scrollable.container.textContent = '';\n\n this.managers.appUsersManager.getContactsPeerIds(query, undefined, 'online').then((contacts) => {\n if(!middleware()) {\n return;\n }\n\n const sortedUserList = this.sortedUserList = this.createList();\n\n let renderPage = () => {\n const pageCount = windowSize.height / 56 * 1.25 | 0;\n const arr = contacts.splice(0, pageCount); // надо splice!\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n renderPage = undefined;\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n renderPage();\n this.scrollable.onScrolledBottom = () => {\n if(renderPage) {\n renderPage();\n } else {\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n replaceContent(this.scrollable.container, sortedUserList.list);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {SliderSuperTab} from '../../slider';\nimport {FOLDER_ID_ARCHIVE, REAL_FOLDER_ID} from '../../../lib/mtproto/mtproto_config';\n\nexport default class AppArchivedTab extends SliderSuperTab {\n private static filterId: REAL_FOLDER_ID = FOLDER_ID_ARCHIVE;\n private wasFilterId: number;\n\n public init() {\n this.wasFilterId = appDialogsManager.filterId;\n\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n this.header.classList.add('can-have-forum');\n this.content.classList.add('can-have-forum');\n\n if(!appDialogsManager.xds[AppArchivedTab.filterId]) {\n const {ul, scrollable} = appDialogsManager.l({\n title: undefined,\n id: AppArchivedTab.filterId,\n localId: FOLDER_ID_ARCHIVE\n });\n scrollable.container.append(ul);\n }\n\n const scrollable = appDialogsManager.xds[AppArchivedTab.filterId].scrollable;\n this.scrollable.container.replaceWith(scrollable.container);\n scrollable.attachBorderListeners(this.container);\n // ! DO NOT UNCOMMENT NEXT LINE - chats will stop loading on scroll after closing the tab\n // this.scrollable = scrollable;\n return appDialogsManager.setFilterIdAndChangeTab(AppArchivedTab.filterId).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n }\n\n // вообще, так делать нельзя, но нет времени чтобы переделать главный чатлист на слайд...\n onOpenAfterTimeout() {\n appDialogsManager.xds[this.wasFilterId].clear();\n }\n\n onClose() {\n this.scrollable.onAdditionalScroll = undefined;\n appDialogsManager.setFilterIdAndChangeTab(this.wasFilterId);\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.xds[AppArchivedTab.filterId].clear();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport ButtonCorner from '../../buttonCorner';\nimport AppNewGroupTab from './newGroup';\nimport {toast} from '../../toast';\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\nimport {i18n, join, _i18n} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport wrapSticker from '../../wrappers/sticker';\nimport SortedUserList from '../../sortedUserList';\nimport {PeerLocated, Update, Updates} from '../../../layer';\nimport {SettingChatListSection} from '..';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport confirmationPopup from '../../confirmationPopup';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport type LazyLoadQueue from '../../lazyLoadQueue';\n\nexport default class AppPeopleNearbyTab extends SliderSuperTab {\n private latestLocationSaved: {latitude: number, longitude: number, accuracy: number};\n private isLocationWatched: boolean = false;\n private errorCategory: HTMLElement;\n private retryBtn: HTMLButtonElement;\n private btnOptions: HTMLButtonElement;\n private menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[];\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected peopleSection: SettingChatListSection;\n protected chatsSection: SettingChatListSection;\n\n protected locatedPeers: Map;\n\n // public async init() {\n // this.container.classList.add('people-nearby-container');\n // this.setTitle('PeopleNearby');\n\n // this.errorCategory = document.createElement('div');\n // this.errorCategory.classList.add('text', 'hide', 'nearby-error');\n\n // this.retryBtn = ButtonCorner({icon: 'check'});\n\n // const emoji = '🧭';\n // const doc = await this.managers.appStickersManager.getAnimatedEmojiSticker(emoji);\n // const stickerContainer = document.createElement('div');\n // stickerContainer.classList.add('sticker-container');\n\n // if(doc) {\n // wrapSticker({\n // doc,\n // div: stickerContainer,\n // loop: false,\n // play: true,\n // width: 86,\n // height: 86,\n // emoji,\n // needUpscale: true\n // }).then(() => {\n // // this.animation = player;\n // });\n // } else {\n // stickerContainer.classList.add('media-sticker-wrapper');\n // }\n\n // const caption = document.createElement('div');\n // caption.classList.add('caption');\n // _i18n(caption, 'PeopleNearbyInfo2');\n\n // this.locatedPeers = new Map();\n\n // const m = () => {\n // const sortedUserList = new SortedUserList({\n // avatarSize: 42,\n // createChatListOptions: {\n // dialogSize: 48,\n // new: true\n // },\n // autonomous: false,\n // onUpdate: (element) => {\n // const peer = this.locatedPeers.get(element.id);\n // const elements: HTMLElement[] = [\n // this.parseDistance(peer.distance)\n // ];\n\n // if(!element.id.isUser()) {\n // elements.push(this.managers.appProfileManager.getChatMembersString(element.id.toChatId()));\n // }\n\n // element.dom.lastMessageSpan.textContent = '';\n // element.dom.lastMessageSpan.append(...join(elements, false));\n // },\n // getIndex: (element) => {\n // const peer = this.locatedPeers.get(element.id);\n // return 0x7FFFFFFF - peer.distance;\n // },\n // appUsersManager: this.managers.appUsersManager\n // });\n\n // appDialogsManager.setListClickListener(sortedUserList.list, undefined, undefined, false);\n\n // return sortedUserList;\n // };\n\n // const peopleSection = this.peopleSection = new SettingChatListSection({\n // name: 'PeopleNearbyHeader',\n // sortedList: m()\n // });\n\n // const chatsSection = this.chatsSection = new SettingChatListSection({\n // name: 'ChatsNearbyHeader',\n // sortedList: m()\n // });\n\n // const btnMakeVisible = peopleSection.makeButton({\n // text: 'MakeMyselfVisible',\n // icon: 'location'\n // });\n\n // const btnMakeInvisible = peopleSection.makeButton({\n // text: 'StopShowingMe',\n // icon: 'location'\n // });\n\n // const btnCreateGroup = chatsSection.makeButton({\n // text: 'NearbyCreateGroup',\n // icon: 'newgroup'\n // });\n\n // attachClickEvent(btnMakeVisible, () => {\n // confirmationPopup({\n // titleLangKey: 'MakeMyselfVisibleTitle',\n // descriptionLangKey: 'MakeMyselfVisibleInfo',\n // button: {\n // langKey: 'OK'\n // }\n // }).then(() => {\n // this.startWatching();\n // });\n // }, {listenerSetter: this.listenerSetter});\n\n // attachClickEvent(btnMakeInvisible, () => {\n // this.stopWatching();\n // }, {listenerSetter: this.listenerSetter});\n\n // attachClickEvent(btnCreateGroup, () => {\n // this.slider.createTab(AppNewGroupTab).open([], true);\n // }, {listenerSetter: this.listenerSetter});\n\n // btnMakeVisible.classList.add('primary');\n // btnMakeInvisible.classList.add('danger');\n // btnCreateGroup.classList.add('primary');\n\n // this.content.append(this.retryBtn);\n // this.scrollable.append(\n // stickerContainer,\n // caption,\n // peopleSection.container,\n // chatsSection.container,\n // this.errorCategory\n // );\n // }\n\n private parseDistance(distance: number) {\n if(rootScope.settings.distanceUnit === 'miles') {\n if(distance > 1609.34) {\n return i18n('MilesAway', [Math.round(distance / 1609)]);\n } else {\n return i18n('FootsAway', [Math.round(distance * 3.281)]);\n }\n } else {\n if(distance >= 1000) {\n return i18n('KMetersAway2', [distance / 1000]);\n } else {\n return i18n('MetersAway2', [distance]);\n }\n }\n }\n\n // public open() {\n // const result = super.open();\n // result.then(() => {\n // this.retryBtn.classList.remove('is-visible');\n // navigator.geolocation.getCurrentPosition((location) => {\n // this.latestLocationSaved = {\n // latitude: location.coords.latitude,\n // longitude: location.coords.longitude,\n // accuracy: location.coords.accuracy\n // };\n\n // console.log(this.latestLocationSaved);\n\n // this.managers.appUsersManager.getLocated(\n // location.coords.latitude,\n // location.coords.longitude,\n // location.coords.accuracy\n // ).then((response) => {\n // const update = (response as Updates.updates).updates[0] as Update.updatePeerLocated;\n // const peers = update.peers as PeerLocated.peerLocated[];\n // const orderedPeers = peers.sort((a, b) => a.distance - b.distance);\n // const groupsCounter = peers.filter((e) => e.peer._ == 'peerChannel').length;\n // const usersCounter = peers.filter((e) => e.peer._ != 'peerChannel').length;\n // orderedPeers?.forEach((peer) => {\n // const peerId = getPeerId(peer.peer);\n // const section = peerId.isUser() ? this.peopleSection : this.chatsSection;\n // this.locatedPeers.set(peerId, peer);\n // section.sortedList.add(peerId);\n // });\n\n // this.errorCategory.classList.toggle('hide', !!(usersCounter || groupsCounter));\n // this.errorCategory.innerHTML = 'No groups or channels found around you.';\n // });\n // }, (error) => {\n // this.errorCategory.classList.remove('hide');\n // this.retryBtn.classList.add('is-visible');\n // this.retryBtn.addEventListener('click', this.open);\n // if(error instanceof GeolocationPositionError) {\n // this.errorCategory.innerHTML = 'Location permission denied. Click below to retry.';\n // } else {\n // this.errorCategory.innerHTML = 'An error has occurred. Please retry later clicking the button below.';\n // }\n // });\n // });\n\n // return result;\n // }\n\n private startWatching() {\n if(!this.latestLocationSaved || this.isLocationWatched) return;\n this.isLocationWatched = true;\n\n toast('Your position is now being shared. Do not close the page or it will be suspended.');\n\n this.managers.appUsersManager.getLocated(\n this.latestLocationSaved.latitude,\n this.latestLocationSaved.longitude,\n this.latestLocationSaved.accuracy,\n true, // background parameter\n 0x7fffffff // self_expires parameter\n );\n\n navigator.geolocation.watchPosition((result) => {\n const isLongitudeDifferent = result.coords.longitude !== this.latestLocationSaved.longitude;\n const isLatitudeDifferent = result.coords.latitude !== this.latestLocationSaved.latitude;\n const distanceCheck = this.calculateDistance(\n result.coords.latitude, result.coords.longitude,\n this.latestLocationSaved.latitude, this.latestLocationSaved.longitude\n ) > 100;\n\n if((isLatitudeDifferent || isLongitudeDifferent) && distanceCheck) {\n this.managers.appUsersManager.getLocated(\n result.coords.latitude,\n result.coords.longitude,\n result.coords.accuracy,\n true, // background parameter\n 0x7fffffff // self_expires parameter\n );\n this.latestLocationSaved = {\n latitude: result.coords.latitude,\n longitude: result.coords.longitude,\n accuracy: result.coords.accuracy\n }\n }\n });\n }\n\n private stopWatching() {\n if(!this.isLocationWatched) return;\n this.isLocationWatched = false;\n toast('The sharing of your position has been stopped. You will no longer be visible to other users.');\n this.managers.appUsersManager.getLocated(\n 0, // latitude parameter\n 0, // longitude parameter\n 0, // accuracy parameter\n false, // background parameter\n 0 // self_expires parameter\n );\n }\n\n private calculateDistance(lat1: number, long1: number, lat2: number, long2: number) {\n const p = 0.017453292519943295; // Math.PI/180\n return (\n 12742 * Math.asin(\n Math.sqrt(\n (0.5 - Math.cos((lat2 - lat1) * p)) +\n (\n Math.cos(lat1 * p) * Math.cos(lat2 * p) *\n (1 - Math.cos((long2 - long1) * p)/2)\n )\n )\n )\n );\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport {SearchGroup} from '../appSearch';\nimport '../avatar';\nimport Scrollable, {ScrollableX} from '../scrollable';\nimport InputSearch from '../inputSearch';\nimport SidebarSlider from '../slider';\nimport TransitionSlider from '../transition';\nimport AppNewGroupTab from './tabs/newGroup';\nimport AppSearchSuper from '../appSearchSuper.';\nimport {DateData, fillTipDates} from '../../helpers/date';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport AppSettingsTab from './tabs/settings';\nimport AppNewChannelTab from './tabs/newChannel';\nimport AppContactsTab from './tabs/contacts';\nimport AppArchivedTab from './tabs/archivedTab';\nimport AppAddMembersTab from './tabs/addMembers';\nimport I18n, {FormatterArguments, i18n, i18n_, LangPackKey} from '../../lib/langPack';\nimport AppPeopleNearbyTab from './tabs/peopleNearby';\nimport {ButtonMenuItemOptions} from '../buttonMenu';\nimport CheckboxField from '../checkboxField';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport PeerTitle from '../peerTitle';\nimport App from '../../config/app';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport sessionStorage from '../../lib/sessionStorage';\nimport {attachClickEvent, CLICK_EVENT_NAME, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport ButtonIcon from '../buttonIcon';\nimport confirmationPopup from '../confirmationPopup';\nimport IS_GEOLOCATION_SUPPORTED from '../../environment/geolocationSupport';\nimport type SortedUserList from '../sortedUserList';\nimport Button, {ButtonOptions} from '../button';\nimport noop from '../../helpers/noop';\nimport ripple from '../ripple';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport AvatarElement from '../avatar';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport themeController from '../../helpers/themeController';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {DIALOG_LIST_ELEMENT_TAG} from '../../lib/appManagers/appDialogsManager';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport SettingSection, {SettingSectionOptions} from '../settingSection';\nimport {FOLDER_ID_ARCHIVE} from '../../lib/mtproto/mtproto_config';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {fastRaf} from '../../helpers/schedulers';\nimport {getInstallPrompt} from '../../helpers/dom/installPrompt';\n\nexport const LEFT_COLUMN_ACTIVE_CLASSNAME = 'is-left-column-shown';\n\nexport class AppSidebarLeft extends SidebarSlider {\n private toolsBtn: HTMLElement;\n private backBtn: HTMLButtonElement;\n // private searchInput = document.getElementById('global-search') as HTMLInputElement;\n private inputSearch: InputSearch;\n\n public archivedCount: HTMLSpanElement;\n public rect: DOMRect;\n\n private newBtnMenu: HTMLElement;\n\n // private log = logger('SL');\n\n private searchGroups: {[k in 'contacts' | 'globalContacts' | 'messages' | 'people' | 'recent']: SearchGroup} = {} as any;\n private searchSuper: AppSearchSuper;\n\n private updateBtn: HTMLElement;\n private hasUpdate: boolean;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-left') as HTMLDivElement,\n navigationType: 'left'\n });\n }\n\n construct(managers: AppManagers) {\n this.managers = managers;\n // this._selectTab(0); // make first tab as default\n\n this.inputSearch = new InputSearch('Search');\n const sidebarHeader = this.sidebarEl.querySelector('.item-main .sidebar-header');\n sidebarHeader.append(this.inputSearch.container);\n\n const onNewGroupClick = () => {\n this.createTab(AppAddMembersTab).open({\n type: 'chat',\n skippable: false,\n takeOut: (peerIds) => this.createTab(AppNewGroupTab).open(peerIds),\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n };\n\n const onContactsClick = () => {\n this.createTab(AppContactsTab).open();\n };\n\n // this.toolsBtn = this.sidebarEl.querySelector('.sidebar-tools-button') as HTMLButtonElement;\n this.backBtn = this.sidebarEl.querySelector('.sidebar-back-button') as HTMLButtonElement;\n\n const btnArchive: typeof menuButtons[0] = {\n icon: 'archive',\n text: 'ArchivedChats',\n onClick: () => {\n this.createTab(AppArchivedTab).open();\n },\n verify: async() => {\n const folder = await this.managers.dialogsStorage.getFolderDialogs(FOLDER_ID_ARCHIVE, false);\n return !!folder.length || !(await this.managers.dialogsStorage.isDialogsLoaded(FOLDER_ID_ARCHIVE));\n }\n };\n\n const themeCheckboxField = new CheckboxField({\n toggle: true,\n checked: themeController.getTheme().name === 'night'\n });\n themeCheckboxField.input.addEventListener('change', async() => {\n await this.managers.appStateManager.setByKey('settings.theme', themeCheckboxField.input.checked ? 'night' : 'day');\n rootScope.dispatchEvent('theme_change');\n });\n\n rootScope.addEventListener('theme_change', () => {\n themeCheckboxField.setValueSilently(themeController.getTheme().name === 'night');\n });\n\n const menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean | Promise})[] = [{\n icon: 'savedmessages',\n text: 'SavedMessages',\n onClick: () => {\n setTimeout(() => { // menu doesn't close if no timeout (lol)\n appImManager.setPeer({\n peerId: appImManager.myId\n });\n }, 0);\n }\n }, btnArchive, {\n icon: 'user',\n text: 'Contacts',\n onClick: onContactsClick\n }, IS_GEOLOCATION_SUPPORTED ? {\n icon: 'group',\n text: 'PeopleNearby',\n onClick: () => {\n this.createTab(AppPeopleNearbyTab).open();\n }\n } : undefined, {\n icon: 'settings',\n text: 'Settings',\n onClick: () => {\n this.createTab(AppSettingsTab).open();\n }\n }, {\n icon: 'darkmode',\n text: 'DarkMode',\n onClick: () => {\n\n },\n checkboxField: themeCheckboxField\n }, {\n icon: 'animations',\n text: 'Animations',\n onClick: () => {\n\n },\n checkboxField: new CheckboxField({\n toggle: true,\n checked: true,\n stateKey: 'settings.animationsEnabled'\n })\n }, {\n icon: 'help',\n text: 'TelegramFeatures',\n onClick: () => {\n const url = I18n.format('TelegramFeaturesUrl', true);\n appImManager.openUrl(url);\n }\n }, {\n icon: 'bug',\n text: 'ReportBug',\n onClick: () => {\n const a = document.createElement('a');\n a.target = '_blank';\n a.href = 'https://bugs.telegram.org/?tag_ids=40&sort=time';\n document.body.append(a);\n a.click();\n setTimeout(() => {\n a.remove();\n }, 0);\n }\n }, {\n icon: 'char z',\n text: 'ChatList.Menu.SwitchTo.Z',\n onClick: () => {\n Promise.all([\n sessionStorage.set({kz_version: 'Z'}),\n sessionStorage.delete('tgme_sync')\n ]).then(() => {\n location.href = 'https://web.telegram.org/z/';\n });\n },\n verify: () => App.isMainDomain\n }, {\n icon: 'char w',\n text: 'ChatList.Menu.SwitchTo.Webogram',\n onClick: () => {\n sessionStorage.delete('tgme_sync').then(() => {\n location.href = 'https://web.telegram.org/?legacy=1';\n });\n },\n verify: () => App.isMainDomain\n }, {\n icon: 'download',\n text: 'PWA.Install',\n onClick: () => {\n const installPrompt = getInstallPrompt();\n installPrompt?.();\n },\n verify: () => !!getInstallPrompt()\n }];\n\n const filteredButtons = menuButtons.filter(Boolean);\n\n this.toolsBtn = ButtonMenuToggle({\n direction: 'bottom-right',\n buttons: filteredButtons,\n onOpen: (e, btnMenu) => {\n const btnMenuFooter = document.createElement('a');\n btnMenuFooter.href = 'https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md';\n btnMenuFooter.target = '_blank';\n btnMenuFooter.rel = 'noopener noreferrer';\n btnMenuFooter.classList.add('btn-menu-footer');\n btnMenuFooter.addEventListener(CLICK_EVENT_NAME, (e) => {\n e.stopPropagation();\n contextMenuController.close();\n });\n const t = document.createElement('span');\n t.classList.add('btn-menu-footer-text');\n t.innerHTML = 'Telegram Web' + App.suffix + ' '/* ' alpha ' */ + App.versionFull;\n btnMenuFooter.append(t);\n btnMenu.classList.add('has-footer');\n btnMenu.append(btnMenuFooter);\n\n btnArchive.element?.append(this.archivedCount);\n }\n });\n this.toolsBtn.classList.remove('tgico-more');\n this.toolsBtn.classList.add('sidebar-tools-button', 'is-visible');\n\n this.backBtn.parentElement.insertBefore(this.toolsBtn, this.backBtn);\n\n this.newBtnMenu = ButtonMenuToggle({\n direction: 'top-left',\n buttons: [{\n icon: 'newchannel',\n text: 'NewChannel',\n onClick: () => {\n this.createTab(AppNewChannelTab).open();\n }\n }, {\n icon: 'newgroup',\n text: 'NewGroup',\n onClick: onNewGroupClick\n }, {\n icon: 'newprivate',\n text: 'NewPrivateChat',\n onClick: onContactsClick\n }]\n });\n this.newBtnMenu.className = 'btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon';\n this.newBtnMenu.insertAdjacentHTML('afterbegin', `\n \n \n `);\n this.newBtnMenu.id = 'new-menu';\n sidebarHeader.nextElementSibling.append(this.newBtnMenu);\n\n this.updateBtn = document.createElement('div');\n this.updateBtn.className = 'btn-circle rp btn-corner z-depth-1 btn-update is-hidden';\n ripple(this.updateBtn);\n this.updateBtn.append(i18n('Update'));\n\n attachClickEvent(this.updateBtn, () => {\n if(this.updateBtn.classList.contains('is-hidden')) {\n return;\n }\n\n location.reload();\n });\n\n sidebarHeader.nextElementSibling.append(this.updateBtn);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === FOLDER_ID_ARCHIVE) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadPeerIds.size;\n this.archivedCount.textContent = '' + formatNumber(count, 1);\n this.archivedCount.classList.toggle('hide', !count);\n }\n });\n\n this.managers.appUsersManager.getTopPeers('correspondents');\n\n // Focus search input by pressing Escape\n const navigationItem: NavigationItem = {\n type: 'global-search-focus',\n onPop: () => {\n setTimeout(() => {\n this.inputSearch.input.focus();\n }, 0);\n\n return false;\n },\n noHistory: true\n };\n appNavigationController.pushItem(navigationItem);\n\n apiManagerProxy.getState().then(() => {\n const CHECK_UPDATE_INTERVAL = 1800e3;\n const checkUpdateInterval = setInterval(() => {\n fetch('version', {cache: 'no-cache'})\n .then((res) => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then((text) => {\n if(text !== App.versionFull) {\n this.hasUpdate = true;\n clearInterval(checkUpdateInterval);\n\n if(!this.newBtnMenu.classList.contains('is-hidden')) {\n this.updateBtn.classList.remove('is-hidden');\n }\n }\n })\n .catch(noop);\n }, CHECK_UPDATE_INTERVAL);\n });\n\n const onResize = () => {\n const rect = this.rect = this.tabsContainer.getBoundingClientRect();\n document.documentElement.style.setProperty('--left-column-width', rect.width + 'px');\n };\n\n fastRaf(onResize);\n mediaSizes.addEventListener('resize', onResize);\n }\n\n private initSearch() {\n const searchContainer = this.sidebarEl.querySelector('#search-container') as HTMLDivElement;\n\n const scrollable = new Scrollable(searchContainer);\n\n const close = () => {\n // setTimeout(() => {\n simulateClickEvent(this.backBtn);\n // }, 0);\n };\n\n this.searchGroups = {\n contacts: new SearchGroup('SearchAllChatsShort', 'contacts', undefined, undefined, undefined, undefined, close),\n globalContacts: new SearchGroup('GlobalSearch', 'contacts', undefined, undefined, undefined, undefined, close),\n messages: new SearchGroup('SearchMessages', 'messages'),\n people: new SearchGroup(false, 'contacts', true, 'search-group-people', true, false, close, true),\n recent: new SearchGroup('Recent', 'contacts', true, 'search-group-recent', true, true, close)\n };\n\n const searchSuper = this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'FilterChats',\n type: 'chats'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }],\n scrollable,\n searchGroups: this.searchGroups,\n asChatList: true,\n hideEmptyTabs: false,\n showSender: true,\n managers: this.managers\n });\n\n searchContainer.prepend(searchSuper.nav.parentElement.parentElement);\n scrollable.container.append(searchSuper.container);\n\n const resetSearch = () => {\n searchSuper.setQuery({\n peerId: ''.toPeerId(),\n folderId: 0\n });\n searchSuper.selectTab(0);\n searchSuper.load(true);\n };\n\n resetSearch();\n\n const pickedElements: HTMLElement[] = [];\n let selectedPeerId: PeerId = ''.toPeerId();\n let selectedMinDate = 0;\n let selectedMaxDate = 0;\n const updatePicked = () => {\n // (this.inputSearch.input as HTMLInputElement).placeholder = pickedElements.length ? 'Search' : 'Telegram Search';\n this.inputSearch.container.classList.toggle('is-picked-twice', pickedElements.length === 2);\n this.inputSearch.container.classList.toggle('is-picked', !!pickedElements.length);\n\n if(pickedElements.length) {\n this.inputSearch.input.style.setProperty('--paddingLeft', (pickedElements[pickedElements.length - 1].getBoundingClientRect().right - this.inputSearch.input.getBoundingClientRect().left) + 'px');\n } else {\n this.inputSearch.input.style.removeProperty('--paddingLeft');\n }\n };\n\n const helper = document.createElement('div');\n helper.classList.add('search-helper');\n helper.addEventListener('click', (e) => {\n const target = findUpClassName(e.target, 'selector-user');\n if(!target) {\n return;\n }\n\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n const [_, minDate, maxDate] = key.split('_');\n selectedMinDate = +minDate;\n selectedMaxDate = +maxDate;\n } else {\n selectedPeerId = key.toPeerId();\n }\n\n target.addEventListener('click', () => {\n unselectEntity(target);\n });\n\n this.inputSearch.container.append(target);\n this.inputSearch.onChange(this.inputSearch.value = '');\n pickedElements.push(target);\n updatePicked();\n });\n\n searchSuper.nav.parentElement.append(helper);\n\n const renderEntity = (key: PeerId | string, title?: string | HTMLElement) => {\n const div = document.createElement('div');\n div.classList.add('selector-user'/* , 'scale-in' */);\n\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-32');\n avatarEl.isDialog = true;\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId()}).element;\n }\n\n avatarEl.updateWithOptions({peerId: key as PeerId});\n } else {\n avatarEl.classList.add('tgico-calendarfilter');\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n return div;\n };\n\n const unselectEntity = (target: HTMLElement) => {\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n selectedMinDate = selectedMaxDate = 0;\n } else {\n selectedPeerId = ''.toPeerId();\n }\n\n target.remove();\n indexOfAndSplice(pickedElements, target);\n\n setTimeout(() => {\n updatePicked();\n this.inputSearch.onChange(this.inputSearch.value);\n }, 0);\n };\n\n this.inputSearch.onClear = () => {\n pickedElements.forEach((el) => {\n unselectEntity(el);\n });\n };\n\n this.inputSearch.onChange = (value) => {\n searchSuper.cleanupHTML();\n searchSuper.setQuery({\n peerId: selectedPeerId,\n folderId: selectedPeerId ? undefined : 0,\n query: value,\n minDate: selectedMinDate,\n maxDate: selectedMaxDate\n });\n searchSuper.load(true);\n\n helper.innerHTML = '';\n searchSuper.nav.classList.remove('hide');\n if(!value) {\n }\n\n if(!selectedPeerId && value.trim()) {\n const middleware = searchSuper.middleware.get();\n Promise.all([\n // appMessagesManager.getConversationsAll(value).then((dialogs) => dialogs.map((d) => d.peerId)),\n this.managers.dialogsStorage.getDialogs({query: value}).then(({dialogs}) => dialogs.map((d) => d.peerId)),\n this.managers.appUsersManager.getContactsPeerIds(value, true)\n ]).then((results) => {\n if(!middleware()) return;\n const peerIds = new Set(results[0].concat(results[1]));\n\n peerIds.forEach((peerId) => {\n helper.append(renderEntity(peerId));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n // console.log('got peerIds by value:', value, [...peerIds]);\n });\n }\n\n if(!selectedMinDate && value.trim()) {\n const dates: DateData[] = [];\n fillTipDates(value, dates);\n dates.forEach((dateData) => {\n helper.append(renderEntity('date_' + dateData.minDate + '_' + dateData.maxDate, dateData.title));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n }\n };\n\n searchSuper.tabs.inputMessagesFilterEmpty.addEventListener('mousedown', (e) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG) as HTMLElement;\n if(!target) {\n return;\n }\n\n const searchGroup = findUpClassName(target, 'search-group');\n if(!searchGroup || searchGroup.classList.contains('search-group-recent') || searchGroup.classList.contains('search-group-people')) {\n return;\n }\n\n const peerId = target.getAttribute('data-peer-id').toPeerId();\n this.managers.appUsersManager.pushRecentSearch(peerId);\n }, {capture: true});\n\n const peopleContainer = document.createElement('div');\n peopleContainer.classList.add('search-group-scrollable');\n peopleContainer.append(this.searchGroups.people.list);\n this.searchGroups.people.container.append(peopleContainer);\n const peopleScrollable = new ScrollableX(peopleContainer);\n\n let first = true;\n let hideNewBtnMenuTimeout: number;\n // const transition = Transition.bind(null, searchContainer.parentElement, 150);\n const transition = TransitionSlider({\n content: searchContainer.parentElement,\n type: 'zoom-fade',\n transitionTime: 150,\n onTransitionEnd: (id) => {\n if(hideNewBtnMenuTimeout) clearTimeout(hideNewBtnMenuTimeout);\n\n if(id === 0 && !first) {\n searchSuper.selectTab(0, false);\n this.inputSearch.onClearClick();\n hideNewBtnMenuTimeout = window.setTimeout(() => {\n hideNewBtnMenuTimeout = 0;\n this.newBtnMenu.classList.remove('is-hidden');\n this.hasUpdate && this.updateBtn.classList.remove('is-hidden');\n }, 150);\n }\n\n first = false;\n }\n });\n\n transition(0);\n\n const activeClassName = 'is-visible';\n const onFocus = () => {\n this.toolsBtn.classList.remove(activeClassName);\n this.backBtn.classList.add(activeClassName);\n this.newBtnMenu.classList.add('is-hidden');\n this.updateBtn.classList.add('is-hidden');\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', true);\n\n const navigationType: NavigationItem['type'] = 'global-search';\n if(!IS_MOBILE_SAFARI && !appNavigationController.findItemByType(navigationType)) {\n appNavigationController.pushItem({\n onPop: () => {\n close();\n },\n type: navigationType\n });\n }\n\n transition(1);\n };\n\n this.inputSearch.input.addEventListener('focus', onFocus);\n onFocus();\n\n attachClickEvent(this.backBtn, (e) => {\n this.toolsBtn.classList.add(activeClassName);\n this.backBtn.classList.remove(activeClassName);\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', false);\n\n appNavigationController.removeByType('global-search');\n\n transition(0);\n });\n\n const clearRecentSearchBtn = ButtonIcon('close');\n this.searchGroups.recent.nameEl.append(clearRecentSearchBtn);\n clearRecentSearchBtn.addEventListener('click', () => {\n confirmationPopup({\n descriptionLangKey: 'Search.Confirm.ClearHistory',\n button: {\n langKey: 'ClearButton',\n isDanger: true\n }\n }).then(() => {\n return this.managers.appUsersManager.clearRecentSearch().then(() => {\n this.searchGroups.recent.clear();\n });\n });\n });\n }\n}\n\nexport class SettingChatListSection extends SettingSection {\n public sortedList: SortedUserList;\n\n constructor(options: SettingSectionOptions & {sortedList: SortedUserList}) {\n super(options);\n\n this.sortedList = options.sortedList;\n\n this.content.append(this.sortedList.list);\n }\n\n public makeButton(options: ButtonOptions) {\n const button = Button('folder-category-button btn btn-primary btn-transparent', options);\n if(this.title) this.content.insertBefore(button, this.title.nextSibling);\n else this.content.prepend(button);\n return button;\n }\n}\n\nconst appSidebarLeft = new AppSidebarLeft();\nMOUNT_CLASS_TO.appSidebarLeft = appSidebarLeft;\nexport default appSidebarLeft;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport AppSelectPeers from '../../appSelectPeers';\nimport {setButtonLoader} from '../../putPreloader';\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\n\nexport default class AppAddMembersTab extends SliderSuperTab {\n private nextBtn: HTMLButtonElement;\n private selector: AppSelectPeers;\n private peerType: 'channel' | 'chat' | 'privacy';\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\n private skippable: boolean;\n\n public init(options: {\n title: LangPackKey,\n placeholder: LangPackKey,\n type: AppAddMembersTab['peerType'],\n takeOut?: AppAddMembersTab['takeOut'],\n skippable: boolean,\n selectedPeerIds?: PeerId[]\n }) {\n this.container.classList.add('add-members-container');\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n this.content.append(this.nextBtn);\n this.scrollable.container.remove();\n\n this.nextBtn.addEventListener('click', () => {\n const peerIds = this.selector.getSelected().map((sel) => sel.toPeerId());\n const result = this.takeOut(peerIds);\n\n if(this.skippable) {\n this.close();\n } else if(result instanceof Promise) {\n this.attachToPromise(result);\n } else if(result === undefined) {\n this.close();\n }\n });\n\n //\n this.setTitle(options.title);\n this.peerType = options.type;\n this.takeOut = options.takeOut;\n this.skippable = options.skippable;\n\n const isPrivacy = this.peerType === 'privacy';\n this.selector = new AppSelectPeers({\n appendTo: this.content,\n onChange: this.skippable ? null : (length) => {\n this.nextBtn.classList.toggle('is-visible', !!length);\n },\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\n placeholder: options.placeholder,\n exceptSelf: isPrivacy,\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined,\n managers: this.managers,\n design: 'square'\n });\n\n if(options.selectedPeerIds) {\n this.selector.addInitial(options.selectedPeerIds);\n }\n\n this.nextBtn.classList.add('tgico-arrow_next');\n this.nextBtn.innerHTML = '';\n this.nextBtn.disabled = false;\n this.nextBtn.classList.toggle('is-visible', this.skippable);\n }\n\n public attachToPromise(promise: Promise) {\n const removeLoader = setButtonLoader(this.nextBtn, 'arrow_next');\n\n promise.then(() => {\n this.close();\n }, () => {\n removeLoader();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {renderImageFromUrlPromise} from './dom/renderImageFromUrl';\n\nexport function averageColorFromCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n\n const pixel = new Array(4).fill(0);\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\n const pixelsLength = pixels.length / 4;\n for(let i = 0; i < pixels.length; i += 4) {\n // const alphaPixel = pixels[i + 3];\n pixel[0] += pixels[i]/* * (alphaPixel / 255) */;\n pixel[1] += pixels[i + 1]/* * (alphaPixel / 255) */;\n pixel[2] += pixels[i + 2]/* * (alphaPixel / 255) */;\n pixel[3] += pixels[i + 3];\n }\n\n const outPixel = new Uint8ClampedArray(4);\n outPixel[0] = pixel[0] / pixelsLength;\n outPixel[1] = pixel[1] / pixelsLength;\n outPixel[2] = pixel[2] / pixelsLength;\n outPixel[3] = pixel[3] / pixelsLength;\n // outPixel[3] = 255;\n return outPixel;\n}\n\nexport function averageColorFromImageSource(imageSource: CanvasImageSource, width: number, height: number) {\n const canvas = document.createElement('canvas');\n const ratio = width / height;\n const DIMENSIONS = 50;\n if(ratio === 1) {\n canvas.width = DIMENSIONS;\n canvas.height = canvas.width / ratio;\n } else if(ratio > 1) {\n canvas.height = DIMENSIONS;\n canvas.width = canvas.height / ratio;\n } else {\n canvas.width = canvas.height = DIMENSIONS;\n }\n\n const context = canvas.getContext('2d');\n context.drawImage(imageSource, 0, 0, width, height, 0, 0, canvas.width, canvas.height);\n return averageColorFromCanvas(canvas);\n}\n\nexport function averageColor(imageUrl: string) {\n const img = document.createElement('img');\n return renderImageFromUrlPromise(img, imageUrl, false).then(() => {\n return averageColorFromImageSource(img, img.naturalWidth, img.naturalHeight);\n });\n};\n","import {rgbaToHsla} from './color';\n\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\n if(s > 0) {\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\n }\n l = Math.max(0, l * .65);\n\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\n return hsla;\n}\n","import {ColorHsla, ColorRgba, hexaToHsla, hslaToRgba, rgbaToHexa as rgbaToHexa, rgbaToHsla} from '../helpers/color';\nimport attachGrabListeners from '../helpers/dom/attachGrabListeners';\nimport clamp from '../helpers/number/clamp';\nimport InputField, {InputState} from './inputField';\n\nexport type ColorPickerColor = {\n hsl: string;\n rgb: string;\n hex: string;\n hsla: string;\n rgba: string;\n hexa: string;\n rgbaArray: ColorRgba;\n};\n\nexport default class ColorPicker {\n private static BASE_CLASS = 'color-picker';\n public container: HTMLElement;\n\n private boxRect: DOMRect;\n // private boxDraggerRect: DOMRect;\n private hueRect: DOMRect;\n // private hueDraggerRect: DOMRect;\n\n private hue = 0;\n private saturation = 100;\n private lightness = 50;\n private alpha = 1;\n private elements: {\n box: SVGSVGElement,\n boxDragger: SVGSVGElement,\n sliders: HTMLElement,\n hue: SVGSVGElement,\n hueDragger: SVGSVGElement,\n saturation: SVGLinearGradientElement,\n } = {} as any;\n private hexInputField: InputField;\n private rgbInputField: InputField;\n public onChange: (color: ReturnType) => void;\n\n constructor() {\n this.container = document.createElement('div');\n this.container.classList.add(ColorPicker.BASE_CLASS);\n\n const html = `\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 this.container.innerHTML = html;\n\n this.elements.box = this.container.firstElementChild as any;\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\n\n this.elements.sliders = this.elements.box.nextElementSibling as any;\n\n this.elements.hue = this.elements.sliders.firstElementChild as any;\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\n\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\n\n const inputs = document.createElement('div');\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\n this.container.append(inputs);\n\n this.hexInputField.input.addEventListener('input', () => {\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\n\n const match = value.match(/([a-fA-F\\d]+)/);\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\n\n value = '#' + value;\n this.hexInputField.setValueSilently(value);\n\n if(valid) {\n this.setColor(value, false, true);\n }\n });\n\n // patched https://stackoverflow.com/a/34029238/6758968\n const rgbRegExp = /^(?:rgb)?\\(?([01]?\\d\\d?|2[0-4]\\d|25[0-5])(?:\\W+)([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\W+(?:([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\)?)$/;\n this.rgbInputField.input.addEventListener('input', () => {\n const match = this.rgbInputField.value.match(rgbRegExp);\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\n\n if(match) {\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\n }\n });\n\n this.attachBoxListeners();\n this.attachHueListeners();\n }\n\n private onGrabStart = () => {\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\n };\n\n private onGrabEnd = () => {\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\n };\n\n private attachBoxListeners() {\n attachGrabListeners(this.elements.box as any, () => {\n this.onGrabStart();\n this.boxRect = this.elements.box.getBoundingClientRect();\n // this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\n }, (pos) => {\n this.saturationHandler(pos.x, pos.y);\n }, () => {\n this.onGrabEnd();\n });\n }\n\n private attachHueListeners() {\n attachGrabListeners(this.elements.hue as any, () => {\n this.onGrabStart();\n this.hueRect = this.elements.hue.getBoundingClientRect();\n // this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\n }, (pos) => {\n this.hueHandler(pos.x);\n }, () => {\n this.onGrabEnd();\n });\n }\n\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\n if(color === undefined) { // * set to red\n color = {\n h: 0,\n s: 100,\n l: 50,\n a: 1\n };\n } else if(typeof(color) === 'string') {\n if(color[0] === '#') {\n color = hexaToHsla(color);\n } else {\n const rgb = color.match(/[.?\\d]+/g);\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\n }\n }\n\n // Set box\n this.boxRect = this.elements.box.getBoundingClientRect();\n\n const boxX = this.boxRect.width / 100 * color.s;\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\n const boxY = this.boxRect.height / 100 * percentY;\n\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\n\n // Set hue\n this.hueRect = this.elements.hue.getBoundingClientRect();\n\n const percentHue = color.h / 360;\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\n\n this.hueHandler(hueX, false);\n\n // Set values\n this.hue = color.h;\n this.saturation = color.s;\n this.lightness = color.l;\n this.alpha = color.a;\n\n this.updatePicker(updateHexInput, updateRgbInput);\n };\n\n public getCurrentColor(): ColorPickerColor {\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\n const hexa = rgbaToHexa(rgbaArray);\n const hex = hexa.slice(0, -2);\n\n return {\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\n hex: hex,\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\n hexa: hexa,\n rgbaArray: rgbaArray\n };\n }\n\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\n const color = this.getCurrentColor();\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\n\n if(updateHexInput) {\n this.hexInputField.setValueSilently(color.hex);\n this.hexInputField.setState(InputState.Neutral);\n }\n\n if(updateRgbInput) {\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\n this.rgbInputField.setState(InputState.Neutral);\n }\n\n if(this.onChange) {\n this.onChange(color);\n }\n }\n\n private hueHandler(pageX: number, update = true) {\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\n\n const percents = eventX / this.hueRect.width;\n this.hue = Math.round(360 * percents);\n\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\n\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\n\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\n\n if(update) {\n this.updatePicker();\n }\n }\n\n private saturationHandler(pageX: number, pageY: number, update = true) {\n const maxX = this.boxRect.width;\n const maxY = this.boxRect.height;\n\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\n\n const posX = eventX / maxX * 100;\n const posY = eventY / maxY * 100;\n\n const boxDragger = this.elements.boxDragger;\n boxDragger.setAttributeNS(null, 'x', posX + '%');\n boxDragger.setAttributeNS(null, 'y', posY + '%');\n\n const saturation = clamp(posX, 0, 100);\n\n const lightnessX = 100 - saturation / 2;\n const lightnessY = 100 - clamp(posY, 0, 100);\n\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\n\n this.saturation = saturation;\n this.lightness = lightness;\n\n if(update) {\n this.updatePicker();\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppTheme} from '../../../config/state';\nimport {hexaToRgba} from '../../../helpers/color';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport highlightningColor from '../../../helpers/highlightningColor';\nimport throttle from '../../../helpers/schedulers/throttle';\nimport themeController from '../../../helpers/themeController';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport rootScope from '../../../lib/rootScope';\nimport ColorPicker, {ColorPickerColor} from '../../colorPicker';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTab} from '../../slider';\nimport {WallPaper} from '../../../layer';\n\nexport default class AppBackgroundColorTab extends SliderSuperTab {\n private colorPicker: ColorPicker;\n private grid: HTMLElement;\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\n private theme: AppTheme;\n\n init() {\n this.container.classList.add('background-container', 'background-color-container');\n this.setTitle('SetColor');\n\n this.theme = themeController.getTheme();\n\n const section = new SettingSection({});\n this.colorPicker = new ColorPicker();\n\n section.content.append(this.colorPicker.container);\n\n this.scrollable.append(section.container);\n\n const gridSection = new SettingSection({});\n\n const grid = this.grid = document.createElement('div');\n grid.classList.add('grid');\n\n const colors = [\n '#E6EBEE',\n '#B2CEE1',\n '#008DD0',\n '#C6E7CB',\n '#C4E1A6',\n '#60B16E',\n '#CCD0AF',\n '#A6A997',\n '#7A7072',\n '#FDD7AF',\n '#FDB76E',\n '#DD8851'\n ];\n\n colors.forEach((color) => {\n const item = document.createElement('div');\n item.classList.add('grid-item');\n item.dataset.color = color.toLowerCase();\n\n // * need for transform scale\n const media = document.createElement('div');\n media.classList.add('grid-item-media');\n media.style.backgroundColor = color;\n\n item.append(media);\n grid.append(item);\n });\n\n attachClickEvent(grid, (e) => {\n const target = findUpClassName(e.target, 'grid-item');\n if(!target || target.classList.contains('active')) {\n return;\n }\n\n const color = target.dataset.color;\n if(!color) {\n return;\n }\n\n this.applyColor(color);\n }, {listenerSetter: this.listenerSetter});\n\n gridSection.content.append(grid);\n this.scrollable.append(gridSection.container);\n\n this.applyColor = throttle(this._applyColor, 16, true);\n }\n\n private setActive() {\n const active = this.grid.querySelector('.active');\n const background = this.theme.settings;\n const wallPaper = background.wallpaper;\n const color = wallPaper.settings.background_color;\n const target = color ? this.grid.querySelector(`.grid-item[data-color=\"${color}\"]`) : null;\n if(active === target) {\n return;\n }\n\n if(active) {\n active.classList.remove('active');\n }\n\n if(target) {\n target.classList.add('active');\n }\n }\n\n private _applyColor = (hex: string, updateColorPicker = true) => {\n if(updateColorPicker) {\n this.colorPicker.setColor(hex);\n } else {\n const rgba = hexaToRgba(hex);\n const settings = this.theme.settings;\n const hsla = highlightningColor(rgba);\n\n const wallPaper: WallPaper.wallPaperNoFile = {\n _: 'wallPaperNoFile',\n id: 0,\n pFlags: {},\n settings: {\n _: 'wallPaperSettings',\n background_color: parseInt(hex.slice(1), 16)\n }\n };\n\n settings.wallpaper = wallPaper;\n settings.highlightningColor = hsla;\n\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n appImManager.applyCurrentTheme(undefined, undefined, true);\n this.setActive();\n }\n };\n\n private onColorChange = (color: ColorPickerColor) => {\n this.applyColor(color.hex, false);\n };\n\n onOpen() {\n setTimeout(() => {\n const settings = this.theme.settings;\n const color = settings?.wallpaper?.settings?.background_color;\n\n const isColored = !!color && settings.wallpaper._ === 'wallPaperNoFile';\n\n // * set active if type is color\n if(isColored) {\n this.colorPicker.onChange = this.onColorChange;\n }\n\n this.colorPicker.setColor((color && '#' + color.toString(16)) || '#cccccc');\n\n if(!isColored) {\n this.colorPicker.onChange = this.onColorChange;\n }\n }, 0);\n }\n\n onCloseAfterTimeout() {\n this.colorPicker.onChange = undefined;\n this.colorPicker = undefined;\n\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {averageColor, averageColorFromCanvas} from '../../../helpers/averageColor';\nimport blur from '../../../helpers/blur';\nimport deferredPromise, {CancellablePromise} from '../../../helpers/cancellablePromise';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport highlightningColor from '../../../helpers/highlightningColor';\nimport copy from '../../../helpers/object/copy';\nimport sequentialDom from '../../../helpers/sequentialDom';\nimport ChatBackgroundGradientRenderer from '../../chat/gradientRenderer';\nimport {Document, PhotoSize, WallPaper} from '../../../layer';\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport appDownloadManager, {AppDownloadManager, DownloadBlob} from '../../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport rootScope from '../../../lib/rootScope';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport ProgressivePreloader from '../../preloader';\nimport {SliderSuperTab} from '../../slider';\nimport AppBackgroundColorTab from './backgroundColor';\nimport choosePhotoSize from '../../../lib/appManagers/utils/photos/choosePhotoSize';\nimport {STATE_INIT, AppTheme} from '../../../config/state';\nimport themeController from '../../../helpers/themeController';\nimport requestFile from '../../../helpers/files/requestFile';\nimport {renderImageFromUrlPromise} from '../../../helpers/dom/renderImageFromUrl';\nimport scaleMediaElement from '../../../helpers/canvas/scaleMediaElement';\nimport {MediaSize} from '../../../helpers/mediaSize';\nimport wrapPhoto from '../../wrappers/photo';\nimport {CreateRowFromCheckboxField} from '../../row';\nimport {generateSection} from '../../settingSection';\nimport {hexToRgb} from '../../../helpers/color';\n\nexport function getHexColorFromTelegramColor(color: number) {\n const hex = (color < 0 ? 0xFFFFFF + color : color).toString(16);\n return '#' + (hex.length >= 6 ? hex : '0'.repeat(6 - hex.length) + hex);\n}\n\nexport function getRgbColorFromTelegramColor(color: number) {\n return hexToRgb(getHexColorFromTelegramColor(color));\n}\n\nexport function getColorsFromWallPaper(wallPaper: WallPaper) {\n return wallPaper.settings ? [\n wallPaper.settings.background_color,\n wallPaper.settings.second_background_color,\n wallPaper.settings.third_background_color,\n wallPaper.settings.fourth_background_color\n ].filter(Boolean).map(getHexColorFromTelegramColor).join(',') : '';\n}\n\nexport default class AppBackgroundTab extends SliderSuperTab {\n public static tempId = 0;\n private grid: HTMLElement;\n private clicked: Set = new Set();\n private blurCheckboxField: CheckboxField;\n\n private wallPapersByElement: Map = new Map();\n private elementsByKey: Map = new Map();\n\n public static getInitArgs() {\n return {\n backgrounds: rootScope.managers.appDocsManager.getWallPapers()\n };\n }\n\n private get theme() {\n return themeController.getTheme();\n }\n\n public init(p: ReturnType = AppBackgroundTab.getInitArgs()) {\n this.container.classList.add('background-container', 'background-image-container');\n this.setTitle('ChatBackground');\n\n {\n const container = generateSection(this.scrollable);\n\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\n\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(colorButton, () => {\n this.slider.createTab(AppBackgroundColorTab).open();\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\n\n const wallPaper = this.theme.settings?.wallpaper;\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\n text: 'ChatBackground.Blur',\n name: 'blur',\n checked: (wallPaper as WallPaper.wallPaper)?.settings?.pFlags?.blur\n });\n\n this.listenerSetter.add(blurCheckboxField.input)('change', async() => {\n this.theme.settings.wallpaper.settings.pFlags.blur = blurCheckboxField.input.checked || undefined;\n await this.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n // * wait for animation end\n setTimeout(() => {\n const active = grid.querySelector('.active') as HTMLElement;\n if(!active) return;\n\n const wallpaper = this.wallPapersByElement.get(active);\n if((wallpaper as WallPaper.wallPaper).pFlags.pattern || wallpaper._ === 'wallPaperNoFile') {\n return;\n }\n\n AppBackgroundTab.setBackgroundDocument(wallpaper);\n }, 100);\n });\n\n container.append(\n uploadButton,\n colorButton,\n resetButton,\n CreateRowFromCheckboxField(blurCheckboxField).container\n );\n }\n\n rootScope.addEventListener('background_change', this.setActive);\n\n const promise = p.backgrounds.then((wallPapers) => {\n const promises = wallPapers.map((wallPaper) => {\n return this.addWallPaper(wallPaper);\n });\n\n return Promise.all(promises);\n });\n\n const gridContainer = generateSection(this.scrollable);\n const grid = this.grid = document.createElement('div');\n grid.classList.add('grid');\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\n gridContainer.append(grid);\n\n return promise;\n }\n\n private onUploadClick = () => {\n requestFile('image/x-png,image/png,image/jpeg').then(async(file) => {\n if(file.name.endsWith('.png')) {\n const img = document.createElement('img');\n const url = URL.createObjectURL(file);\n await renderImageFromUrlPromise(img, url, false);\n const mimeType = 'image/jpeg';\n const {blob} = await scaleMediaElement({media: img, size: new MediaSize(img.naturalWidth, img.naturalHeight), mimeType});\n file = new File([blob], file.name.replace(/\\.png$/, '.jpg'), {type: mimeType});\n }\n\n const wallPaper = await this.managers.appDocsManager.prepareWallPaperUpload(file);\n const uploadPromise = this.managers.appDocsManager.uploadWallPaper(wallPaper.id);\n const uploadDeferred: CancellablePromise = appDownloadManager.getNewDeferredForUpload(file.name, uploadPromise);\n\n const deferred = deferredPromise();\n deferred.addNotifyListener = uploadDeferred.addNotifyListener;\n deferred.cancel = uploadDeferred.cancel;\n\n uploadDeferred.then((wallPaper) => {\n this.clicked.delete(key);\n this.elementsByKey.delete(key);\n this.wallPapersByElement.set(container, wallPaper);\n const newKey = this.getWallPaperKey(wallPaper);\n this.elementsByKey.set(newKey, container);\n\n AppBackgroundTab.setBackgroundDocument(wallPaper).then(deferred.resolve, deferred.reject);\n }, deferred.reject);\n\n const key = this.getWallPaperKey(wallPaper);\n deferred.catch(() => {\n container.remove();\n });\n\n const preloader = new ProgressivePreloader({\n isUpload: true,\n cancelable: true,\n tryAgainOnFail: false\n });\n\n const {container} = await this.addWallPaper(wallPaper, false);\n this.clicked.add(key);\n\n preloader.attach(container, false, deferred);\n });\n };\n\n private onResetClick = () => {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === this.theme.name);\n if(defaultTheme) {\n ++AppBackgroundTab.tempId;\n this.theme.settings = copy(defaultTheme.settings);\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\n appImManager.applyCurrentTheme(undefined, undefined, true);\n this.blurCheckboxField.setValueSilently(this.theme.settings?.wallpaper?.settings?.pFlags?.blur);\n }\n };\n\n private getWallPaperKey(wallPaper: WallPaper) {\n return '' + wallPaper.id;\n }\n\n private getWallPaperKeyFromTheme(theme: AppTheme) {\n return '' + (this.getWallPaperKey(theme.settings?.wallpaper) || '');\n }\n\n public static addWallPaper(\n wallPaper: WallPaper,\n container = document.createElement('div')\n ) {\n const colors = getColorsFromWallPaper(wallPaper);\n const hasFile = wallPaper._ === 'wallPaper';\n if((hasFile && wallPaper.pFlags.pattern && !colors)/* ||\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0 */) {\n return;\n }\n\n const isDark = !!wallPaper.pFlags.dark;\n\n const doc = hasFile ? wallPaper.document as Document.document : undefined;\n\n container.classList.add('background-item');\n container.dataset.id = '' + wallPaper.id;\n\n const media = document.createElement('div');\n media.classList.add('background-item-media');\n\n const loadPromises: Promise[] = [];\n let wrapped: ReturnType, size: ReturnType;\n if(hasFile) {\n size = choosePhotoSize(doc, 200, 200);\n wrapped = wrapPhoto({\n photo: doc,\n message: null,\n container: media,\n withoutPreloader: true,\n size: size,\n noFadeIn: wallPaper.pFlags.pattern\n });\n\n if(wallPaper.pFlags.pattern) {\n media.classList.add('is-pattern');\n }\n\n const promise = wrapped.then(async({loadPromises, images}) => {\n await loadPromises.thumb || loadPromises.full;\n return images;\n }).then((images) => {\n if(wallPaper.pFlags.pattern) {\n if(isDark) {\n images.full.style.display = 'none';\n if(images.thumb) {\n images.thumb.style.display = 'none';\n }\n } else if(wallPaper.settings?.intensity) {\n images.full.style.opacity = '' + Math.abs(wallPaper.settings.intensity) / 100;\n }\n }\n\n return sequentialDom.mutate(() => {\n container.append(media);\n });\n });\n\n loadPromises.push(promise);\n } else {\n container.append(media);\n }\n\n if(wallPaper.settings && wallPaper.settings.background_color !== undefined) {\n const {canvas} = ChatBackgroundGradientRenderer.create(colors);\n canvas.classList.add('background-colors-canvas');\n\n if(isDark && hasFile) {\n const promise = wrapped.then(({loadPromises}) => {\n return loadPromises.full.then(async() => {\n const cacheContext = await rootScope.managers.thumbsStorage.getCacheContext(doc, size.type);\n canvas.style.webkitMaskImage = `url(${cacheContext.url})`;\n canvas.style.opacity = '' + (wallPaper.pFlags.dark ? 100 + wallPaper.settings.intensity : wallPaper.settings.intensity) / 100;\n media.append(canvas);\n });\n });\n\n loadPromises.push(promise);\n } else {\n media.append(canvas);\n }\n }\n\n return {\n container,\n media,\n loadPromise: Promise.all(loadPromises)\n };\n }\n\n private addWallPaper(wallPaper: WallPaper, append = true) {\n const result = AppBackgroundTab.addWallPaper(wallPaper);\n if(result) {\n const {container, media} = result;\n container.classList.add('grid-item');\n media.classList.add('grid-item-media');\n\n const key = this.getWallPaperKey(wallPaper);\n this.wallPapersByElement.set(container, wallPaper);\n this.elementsByKey.set(key, container);\n\n if(this.getWallPaperKeyFromTheme(this.theme) === key) {\n container.classList.add('active');\n }\n\n this.grid[append ? 'append' : 'prepend'](container);\n }\n\n return result && result.loadPromise.then(() => result);\n }\n\n private onGridClick = (e: MouseEvent | TouchEvent) => {\n const target = findUpClassName(e.target, 'grid-item') as HTMLElement;\n if(!target) return;\n\n const wallpaper = this.wallPapersByElement.get(target);\n if(wallpaper._ === 'wallPaperNoFile') {\n AppBackgroundTab.setBackgroundDocument(wallpaper);\n return;\n }\n\n const key = this.getWallPaperKey(wallpaper);\n if(this.clicked.has(key)) return;\n this.clicked.add(key);\n\n const doc = wallpaper.document as MyDocument;\n const preloader = new ProgressivePreloader({\n cancelable: true,\n tryAgainOnFail: false\n });\n\n const load = async() => {\n const promise = AppBackgroundTab.setBackgroundDocument(wallpaper);\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\n if(!cacheContext.url || this.theme.settings?.wallpaper?.settings?.pFlags?.blur) {\n preloader.attach(target, true, promise);\n }\n };\n\n preloader.construct();\n\n attachClickEvent(target, (e) => {\n if(preloader.preloader.parentElement) {\n preloader.onClick(e);\n preloader.detach();\n } else {\n load();\n }\n }, {listenerSetter: this.listenerSetter});\n\n load();\n\n // console.log(doc);\n };\n\n public static setBackgroundDocument = (wallPaper: WallPaper) => {\n const _tempId = ++this.tempId;\n const middleware = () => _tempId === this.tempId;\n\n const doc = (wallPaper as WallPaper.wallPaper).document as MyDocument;\n const deferred = deferredPromise();\n let download: Promise | ReturnType;\n if(doc) {\n download = appDownloadManager.downloadMediaURL({\n media: doc,\n queueId: appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0\n });\n deferred.addNotifyListener = download.addNotifyListener;\n deferred.cancel = download.cancel;\n } else {\n download = Promise.resolve();\n }\n\n const saveToCache = (slug: string, url: string) => {\n fetch(url).then((response) => {\n appImManager.cacheStorage.save('backgrounds/' + slug, response);\n });\n };\n\n download.then(async() => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n const themeSettings = themeController.getTheme().settings;\n const onReady = (url?: string) => {\n let getPixelPromise: Promise;\n const backgroundColor = getColorsFromWallPaper(wallPaper);\n if(url && !backgroundColor) {\n getPixelPromise = averageColor(url);\n } else {\n const {canvas} = ChatBackgroundGradientRenderer.create(backgroundColor);\n getPixelPromise = Promise.resolve(averageColorFromCanvas(canvas));\n }\n\n getPixelPromise.then((pixel) => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n const hsla = highlightningColor(Array.from(pixel) as any);\n\n const slug = (wallPaper as WallPaper.wallPaper).slug ?? '';\n themeSettings.wallpaper = wallPaper;\n themeSettings.highlightningColor = hsla;\n rootScope.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n if(slug) {\n saveToCache(slug, url);\n }\n\n appImManager.applyCurrentTheme(slug, url, true).then(deferred.resolve);\n });\n };\n\n if(!doc) {\n onReady();\n return;\n }\n\n const cacheContext = await rootScope.managers.thumbsStorage.getCacheContext(doc);\n if(themeSettings.wallpaper?.settings?.pFlags?.blur) {\n setTimeout(() => {\n const {canvas, promise} = blur(cacheContext.url, 12, 4);\n promise.then(() => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n onReady(canvas.toDataURL());\n });\n }, 200);\n } else {\n onReady(cacheContext.url);\n }\n });\n\n return deferred;\n };\n\n private setActive = () => {\n const active = this.grid.querySelector('.active');\n const target = this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));\n if(active === target) {\n return;\n }\n\n if(active) {\n active.classList.remove('active');\n }\n\n if(target) {\n target.classList.add('active');\n }\n };\n}\n","export default function requestFile(accept?: string) {\n const input = document.createElement('input');\n input.type = 'file';\n input.style.display = 'none';\n\n if(accept) {\n input.accept = accept;\n }\n\n document.body.append(input);\n\n const promise = new Promise((resolve, reject) => {\n input.addEventListener('change', (e: any) => {\n const file: File = e.target.files[0];\n if(!file) {\n reject('NO_FILE_SELECTED');\n return;\n }\n\n resolve(file);\n }, {once: true});\n }).finally(() => {\n input.remove();\n });\n\n input.click();\n\n return promise;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport AppSelectPeers from '../../appSelectPeers';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\nimport ButtonIcon from '../../buttonIcon';\nimport CheckboxField from '../../checkboxField';\nimport Button from '../../button';\nimport AppEditFolderTab from './editFolder';\nimport I18n, {i18n, LangPackKey, _i18n, join} from '../../../lib/langPack';\nimport {toast} from '../../toast';\nimport copy from '../../../helpers/object/copy';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\nimport rootScope from '../../../lib/rootScope';\nimport {MTAppConfig} from '../../../lib/mtproto/appConfig';\nimport {attachClickEvent, simulateClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nexport default class AppIncludedChatsTab extends SliderSuperTab {\n private editFolderTab: AppEditFolderTab;\n private confirmBtn: HTMLElement;\n\n private selector: AppSelectPeers;\n private type: 'included' | 'excluded';\n private filter: DialogFilter;\n private originalFilter: DialogFilter;\n\n private dialogsByFilters: Map>;\n private limit: number;\n\n public init(\n filter: DialogFilter,\n type: 'included' | 'excluded',\n editFolderTab: AppIncludedChatsTab['editFolderTab']\n ) {\n this.originalFilter = filter;\n this.filter = copy(this.originalFilter);\n this.type = type;\n this.editFolderTab = editFolderTab;\n\n this.content.remove();\n this.container.classList.add('included-chatlist-container');\n this.confirmBtn = ButtonIcon('check btn-confirm blue', {noRipple: true});\n this.confirmBtn.style.display = 'none';\n\n this.header.append(this.confirmBtn);\n\n attachClickEvent(this.confirmBtn, async() => {\n const selected = this.selector.getSelected();\n\n // this.filter.pFlags = {};\n\n if(this.type === 'included') {\n for(const key in this.filter.pFlags) {\n if(key.indexOf('exclude_') === 0) {\n continue;\n }\n\n // @ts-ignore\n delete this.filter.pFlags[key];\n }\n } else {\n for(const key in this.filter.pFlags) {\n if(key.indexOf('exclude_') !== 0) {\n continue;\n }\n\n // @ts-ignore\n delete this.filter.pFlags[key];\n }\n }\n\n const peerIds: PeerId[] = [];\n for(const key of selected) {\n if(key.isPeerId()) {\n peerIds.push(key.toPeerId());\n } else {\n // @ts-ignore\n this.filter.pFlags[key] = true;\n }\n }\n\n let cmp: (peerId: PeerId) => boolean;\n if(this.type === 'included') {\n cmp = (peerId) => peerIds.includes(peerId);\n } else {\n cmp = (peerId) => !peerIds.includes(peerId);\n }\n\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\n if(!cmp(peerId)) {\n this.filter.pinnedPeerIds.splice(idx, 1);\n this.filter.pinned_peers.splice(idx, 1);\n }\n });\n\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\n forEachReverse(this.filter[other], (peerId, idx) => {\n if(peerIds.includes(peerId)) {\n this.filter[other].splice(idx, 1);\n this.filter[otherLegacy].splice(idx, 1);\n }\n });\n\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = await Promise.all(peerIds.map((peerId) => this.managers.appPeersManager.getInputPeerById(peerId)));\n // this.filter.pinned_peers = this.filter.pinned_peers.filter((peerId) => this.filter.include_peers.includes(peerId));\n\n this.editFolderTab.setFilter(this.filter, false);\n this.close();\n }, {listenerSetter: this.listenerSetter});\n\n const onAppConfig = (appConfig: MTAppConfig) => {\n this.limit = rootScope.premium ? appConfig.dialog_filters_chats_limit_premium : appConfig.dialog_filters_chats_limit_default;\n };\n\n this.listenerSetter.add(rootScope)('app_config', onAppConfig);\n\n this.dialogsByFilters = new Map();\n return Promise.all([\n this.managers.filtersStorage.getDialogFilters().then(async(filters) => {\n await Promise.all(filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).map(async(filter) => {\n const dialogs = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\n const peerIds = dialogs.map((d) => d.peerId);\n this.dialogsByFilters.set(filter, new Set(peerIds));\n }));\n }),\n\n this.managers.apiManager.getAppConfig().then((appConfig) => {\n onAppConfig(appConfig);\n })\n ]);\n }\n\n checkbox(selected?: boolean) {\n const checkboxField = new CheckboxField({\n round: true\n });\n if(selected) {\n checkboxField.input.checked = selected;\n }\n\n return checkboxField.label;\n }\n\n renderResults = async(peerIds: PeerId[]) => {\n // const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\n\n await this.managers.appUsersManager.getContacts();\n peerIds.forEach((peerId) => {\n // if(other.includes(peerId)) return;\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.selector.scrollable,\n rippleEnabled: true,\n avatarSize: 'abitbigger'\n });\n\n const selected = this.selector.selected.has(peerId);\n dom.containerEl.append(this.checkbox(selected));\n // if(selected) dom.listEl.classList.add('active');\n\n const foundInFilters: HTMLElement[] = [];\n this.dialogsByFilters.forEach((dialogs, filter) => {\n if(dialogs.has(peerId)) {\n const span = document.createElement('span');\n setInnerHTML(span, wrapEmojiText(filter.title));\n foundInFilters.push(span);\n }\n });\n\n const joined = join(foundInFilters, false);\n joined.forEach((el) => {\n dom.lastMessageSpan.append(el);\n });\n });\n };\n\n onOpen() {\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\n\n const filter = this.filter;\n\n const categoriesSection = new SettingSection({\n noDelimiter: true,\n name: 'FilterChatTypes'\n });\n\n categoriesSection.container.classList.add('folder-categories');\n\n let details: {[flag: string]: {ico: string, text: LangPackKey}};\n if(this.type === 'excluded') {\n details = {\n exclude_muted: {ico: 'mute', text: 'ChatList.Filter.MutedChats'},\n exclude_archived: {ico: 'archive', text: 'ChatList.Filter.Archive'},\n exclude_read: {ico: 'readchats', text: 'ChatList.Filter.ReadChats'}\n };\n } else {\n details = {\n contacts: {ico: 'newprivate', text: 'ChatList.Filter.Contacts'},\n non_contacts: {ico: 'noncontacts', text: 'ChatList.Filter.NonContacts'},\n groups: {ico: 'group', text: 'ChatList.Filter.Groups'},\n broadcasts: {ico: 'newchannel', text: 'ChatList.Filter.Channels'},\n bots: {ico: 'bots', text: 'ChatList.Filter.Bots'}\n };\n }\n\n const f = document.createDocumentFragment();\n for(const key in details) {\n const button = Button('btn-primary btn-transparent folder-category-button', {icon: details[key].ico, text: details[key].text});\n button.dataset.peerId = key;\n button.append(this.checkbox());\n f.append(button);\n }\n categoriesSection.content.append(f);\n\n // ///////////////\n\n const selectedPeers = (this.type === 'included' ? filter.includePeerIds : filter.excludePeerIds).slice();\n\n this.selector = new AppSelectPeers({\n appendTo: this.container,\n onChange: this.onSelectChange,\n peerType: ['dialogs'],\n renderResultsFunc: this.renderResults,\n placeholder: 'Search',\n sectionNameLangPackKey: 'FilterChats',\n managers: this.managers\n });\n this.selector.selected = new Set(selectedPeers);\n\n let addedInitial = false;\n const _add = this.selector.add.bind(this.selector);\n this.selector.add = (peerId, title, scroll) => {\n if(this.selector.selected.size >= this.limit && addedInitial && !details[peerId]) {\n const el: HTMLInputElement = this.selector.list.querySelector(`[data-peer-id=\"${peerId}\"] [type=\"checkbox\"]`);\n if(el) {\n setTimeout(() => {\n el.checked = false;\n }, 0);\n }\n\n const str = I18n.format(this.type === 'excluded' ? 'ChatList.Filter.Exclude.LimitReached': 'ChatList.Filter.Include.LimitReached', true);\n toast(str);\n return;\n }\n\n const div = _add(peerId, details[peerId] ? i18n(details[peerId].text) : undefined, scroll);\n if(details[peerId]) {\n div.querySelector('avatar-element').classList.add('tgico-' + details[peerId].ico);\n }\n return div;\n };\n\n this.selector.scrollable.container.append(categoriesSection.container, this.selector.scrollable.container.lastElementChild);\n\n this.selector.addInitial(selectedPeers);\n addedInitial = true;\n\n for(const flag in filter.pFlags) {\n // @ts-ignore\n if(details.hasOwnProperty(flag) && !!filter.pFlags[flag]) {\n simulateClickEvent(categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement);\n }\n }\n }\n\n onSelectChange = (length: number) => {\n // const changed = !deepEqual(this.filter, this.originalFilter);\n if(this.type === 'included') {\n this.confirmBtn.style.display = length ? '' : 'none';\n }\n };\n\n onCloseAfterTimeout() {\n if(this.selector) {\n this.selector.container.remove();\n this.selector = null;\n }\n\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\nimport {SliderSuperTab} from '../../slider';\nimport {toast} from '../../toast';\nimport InputField from '../../inputField';\nimport ButtonIcon from '../../buttonIcon';\nimport ButtonMenuToggle from '../../buttonMenuToggle';\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\nimport Button from '../../button';\nimport AppIncludedChatsTab from './includedChats';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport wrapDraftText from '../../../lib/richTextProcessor/wrapDraftText';\nimport filterAsync from '../../../helpers/array/filterAsync';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nconst MAX_FOLDER_NAME_LENGTH = 12;\n\nexport default class AppEditFolderTab extends SliderSuperTab {\n private caption: HTMLElement;\n private stickerContainer: HTMLElement;\n\n private confirmBtn: HTMLElement;\n private menuBtn: HTMLElement;\n private nameInputField: InputField;\n\n private includePeerIds: SettingSection;\n private excludePeerIds: SettingSection;\n private flags: {[k in 'contacts' | 'non_contacts' | 'groups' | 'broadcasts' | 'bots' | 'exclude_muted' | 'exclude_archived' | 'exclude_read']: HTMLElement} = {} as any;\n\n private animation: RLottiePlayer;\n private filter: DialogFilter;\n private originalFilter: DialogFilter;\n\n private type: 'edit' | 'create';\n private loadAnimationPromise: ReturnType;\n\n public static getInitArgs() {\n return {\n animationData: lottieLoader.loadAnimationFromURLManually('Folders_2')\n };\n }\n\n public init(p: ReturnType = AppEditFolderTab.getInitArgs()) {\n this.container.classList.add('edit-folder-container');\n this.caption = document.createElement('div');\n this.caption.classList.add('caption');\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add('sticker-container');\n\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\n let deleting = false;\n const deleteFolderButton: ButtonMenuItemOptions = {\n icon: 'delete danger',\n text: 'FilterMenuDelete',\n onClick: () => {\n new PopupPeer('filter-delete', {\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\n buttons: [{\n langKey: 'Delete',\n callback: () => {\n if(deleting) {\n return;\n }\n\n deleting = true;\n\n this.managers.filtersStorage.updateDialogFilter(this.filter, true).then((bool) => {\n this.close();\n }).finally(() => {\n deleting = false;\n });\n },\n isDanger: true\n }]\n }).show();\n }\n };\n this.menuBtn = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [deleteFolderButton]\n });\n this.menuBtn.classList.add('hide');\n\n this.header.append(this.confirmBtn, this.menuBtn);\n\n const inputSection = new SettingSection({});\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.nameInputField = new InputField({\n label: 'FilterNameHint',\n maxLength: MAX_FOLDER_NAME_LENGTH\n });\n\n inputWrapper.append(this.nameInputField.container);\n inputSection.content.append(inputWrapper);\n\n const generateList = (className: string, h2Text: LangPackKey, buttons: {icon: string, name?: string, withRipple?: true, text: LangPackKey}[], to: any) => {\n const section = new SettingSection({\n name: h2Text,\n noDelimiter: true\n });\n\n section.container.classList.add('folder-list', className);\n\n const categories = section.generateContentElement();\n categories.classList.add('folder-categories');\n\n buttons.forEach((o) => {\n const button = Button('folder-category-button btn btn-primary btn-transparent', {\n icon: o.icon,\n text: o.text,\n noRipple: o.withRipple ? undefined : true\n });\n\n if(o.name) {\n to[o.name] = button;\n }\n\n categories.append(button);\n });\n\n return section;\n };\n\n this.includePeerIds = generateList('folder-list-included', 'FilterInclude', [{\n icon: 'add primary',\n text: 'ChatList.Filter.Include.AddChat',\n withRipple: true\n }, {\n text: 'ChatList.Filter.Contacts',\n icon: 'newprivate',\n name: 'contacts'\n }, {\n text: 'ChatList.Filter.NonContacts',\n icon: 'noncontacts',\n name: 'non_contacts'\n }, {\n text: 'ChatList.Filter.Groups',\n icon: 'group',\n name: 'groups'\n }, {\n text: 'ChatList.Filter.Channels',\n icon: 'channel',\n name: 'broadcasts'\n }, {\n text: 'ChatList.Filter.Bots',\n icon: 'bots',\n name: 'bots'\n }], this.flags);\n\n this.excludePeerIds = generateList('folder-list-excluded', 'FilterExclude', [{\n icon: 'minus primary',\n text: 'ChatList.Filter.Exclude.AddChat',\n withRipple: true\n }, {\n text: 'ChatList.Filter.MutedChats',\n icon: 'mute',\n name: 'exclude_muted'\n }, {\n text: 'ChatList.Filter.Archive',\n icon: 'archive',\n name: 'exclude_archived'\n }, {\n text: 'ChatList.Filter.ReadChats',\n icon: 'readchats',\n name: 'exclude_read'\n }], this.flags);\n\n this.scrollable.append(this.stickerContainer, this.caption, inputSection.container, this.includePeerIds.container, this.excludePeerIds.container);\n\n const includedFlagsContainer = this.includePeerIds.container.querySelector('.folder-categories');\n const excludedFlagsContainer = this.excludePeerIds.container.querySelector('.folder-categories');\n\n attachClickEvent(includedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'included', this);\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(excludedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'excluded', this);\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.confirmBtn, () => {\n if(this.nameInputField.input.classList.contains('error')) {\n return;\n }\n\n if(!this.nameInputField.value.trim()) {\n this.nameInputField.input.classList.add('error');\n return;\n }\n\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\n include += this.filter.include_peers.length;\n\n if(!include) {\n toast('Please choose at least one chat for this folder.');\n return;\n }\n\n this.confirmBtn.setAttribute('disabled', 'true');\n\n let promise: Promise;\n if(!this.filter.id) {\n promise = this.managers.filtersStorage.createDialogFilter(this.filter);\n } else {\n promise = this.managers.filtersStorage.updateDialogFilter(this.filter);\n }\n\n promise.then((bool) => {\n this.close();\n }).catch((err) => {\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\n toast('Sorry, you can\\'t create more folders.');\n } else {\n console.error('updateDialogFilter error:', err);\n }\n }).finally(() => {\n this.confirmBtn.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(this.nameInputField.input)('input', () => {\n this.filter.title = this.nameInputField.value;\n this.editCheckForChange();\n });\n\n const reloadMissingPromises: Promise[] = this.type === 'edit' ? [\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'pinned_peers'),\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'include_peers'),\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'exclude_peers')\n ] : [];\n\n return Promise.all([\n this.loadAnimationPromise = p.animationData.then(async(cb) => {\n const player = await cb({\n container: this.stickerContainer,\n loop: false,\n autoplay: false,\n width: 86,\n height: 86\n });\n\n this.animation = player;\n\n return lottieLoader.waitForFirstFrame(player);\n }),\n\n ...reloadMissingPromises\n ]).then(() => {\n if(this.type === 'edit') {\n this.setFilter(this.originalFilter, true);\n this.onEditOpen();\n } else {\n this.setInitFilter();\n this.onCreateOpen();\n }\n });\n }\n\n onOpenAfterTimeout() {\n this.loadAnimationPromise.then(() => {\n this.animation.autoplay = true;\n this.animation.play();\n });\n }\n\n private onCreateOpen() {\n // this.caption.style.display = '';\n this.setTitle('FilterNew');\n this.menuBtn.classList.add('hide');\n this.confirmBtn.classList.remove('hide');\n\n for(const flag in this.flags) {\n // @ts-ignore\n this.flags[flag].style.display = 'none';\n }\n }\n\n private onEditOpen() {\n // this.caption.style.display = 'none';\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\n\n if(this.type === 'edit') {\n this.menuBtn.classList.remove('hide');\n this.confirmBtn.classList.add('hide');\n }\n\n const filter = this.filter;\n this.nameInputField.value = wrapDraftText(filter.title);\n\n for(const flag in this.flags) {\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\n }\n\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(async(key) => {\n const section = this[key];\n const ul = appDialogsManager.createChatList({ignoreClick: true});\n\n let peers = filter[key];\n\n // filter peers where we're kicked\n const hasPeer = async(peerId: PeerId) => {\n return !!(await this.managers.appMessagesManager.getDialogOnly(peerId)) || (peerId.isUser() ? (await this.managers.appUsersManager.getUser(peerId.toUserId()))._ === 'user' : false);\n };\n\n const filtered = await filterAsync(peers, (peerId) => hasPeer(peerId));\n peers.length = 0;\n peers.push(...filtered);\n\n peers = peers.slice();\n\n const renderMore = async(_length: number) => {\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\n const peerId = peers.shift();\n if(peerId.isUser() ? false : !(await this.managers.appMessagesManager.getDialogOnly(peerId))) {\n continue;\n }\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: ul,\n rippleEnabled: false,\n meAsSaved: true,\n avatarSize: 'small'\n });\n dom.lastMessageSpan.parentElement.remove();\n }\n\n if(peers.length) {\n showMore.lastElementChild.replaceWith(i18n('FilterShowMoreChats', [peers.length]));\n } else if(showMore) {\n showMore.remove();\n }\n };\n\n section.generateContentElement().append(ul);\n\n let showMore: HTMLElement;\n if(peers.length) {\n const content = section.generateContentElement();\n showMore = Button('folder-category-button btn btn-primary btn-transparent', {icon: 'down'});\n showMore.classList.add('load-more', 'rp-overflow');\n attachClickEvent(showMore, () => renderMore(20), {listenerSetter: this.listenerSetter});\n showMore.append(i18n('FilterShowMoreChats', [peers.length]));\n\n content.append(showMore);\n }\n\n renderMore(4);\n });\n }\n\n editCheckForChange() {\n if(this.type === 'edit') {\n const changed = !deepEqual(this.originalFilter, this.filter);\n this.confirmBtn.classList.toggle('hide', !changed);\n this.menuBtn.classList.toggle('hide', changed);\n }\n };\n\n setFilter(filter: DialogFilter, firstTime: boolean) {\n if(this.container) {\n // cleanup\n Array.from(this.container.querySelectorAll('ul, .load-more')).forEach((el) => el.remove());\n }\n\n if(firstTime) {\n this.originalFilter = filter;\n this.filter = copy(filter);\n } else {\n this.filter = filter;\n this.onEditOpen();\n this.editCheckForChange();\n }\n }\n\n public setInitFilter(filter?: DialogFilter) {\n if(filter === undefined) {\n this.setFilter({\n _: 'dialogFilter',\n id: 0,\n title: '',\n pFlags: {},\n pinned_peers: [],\n include_peers: [],\n exclude_peers: [],\n pinnedPeerIds: [],\n includePeerIds: [],\n excludePeerIds: []\n }, true);\n this.type = 'create';\n } else {\n this.setFilter(filter, true);\n this.type = 'edit';\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport EditPeer from '../../editPeer';\nimport {UsernameInputField} from '../../usernameInputField';\nimport {i18n, i18n_, LangPackKey} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport rootScope from '../../../lib/rootScope';\nimport setBlankToAnchor from '../../../lib/richTextProcessor/setBlankToAnchor';\nimport getPeerEditableUsername from '../../../lib/appManagers/utils/peers/getPeerEditableUsername';\nimport SettingSection, {generateSection} from '../../settingSection';\nimport UsernamesSection from '../../usernamesSection';\n\n// TODO: аватарка не поменяется в этой вкладке после изменения почему-то (если поставить в другом клиенте, и потом тут проверить, для этого ещё вышел в чатлист)\n\nexport function purchaseUsernameCaption() {\n const p = document.createElement('div');\n const FRAGMENT_USERNAME_URL = 'https://fragment.com/username/';\n const a = setBlankToAnchor(document.createElement('a'));\n const purchaseText = i18n('Username.Purchase', [a]);\n purchaseText.classList.add('username-purchase-help');\n p.append(\n purchaseText,\n document.createElement('br'),\n document.createElement('br')\n );\n p.classList.add('hide');\n\n return {\n element: p,\n setUsername: (username: string) => {\n if(username) {\n a.href = FRAGMENT_USERNAME_URL + username;\n }\n\n p.classList.toggle('hide', !username);\n }\n };\n}\n\nexport default class AppEditProfileTab extends SliderSuperTab {\n private firstNameInputField: InputField;\n private lastNameInputField: InputField;\n private bioInputField: InputField;\n private usernameInputField: UsernameInputField;\n\n private profileUrlContainer: HTMLDivElement;\n private profileUrlAnchor: HTMLAnchorElement;\n\n private editPeer: EditPeer;\n\n public static getInitArgs() {\n return {\n bioMaxLength: rootScope.managers.apiManager.getLimit('bio'),\n user: rootScope.managers.appUsersManager.getSelf(),\n userFull: rootScope.managers.appProfileManager.getProfile(rootScope.myId.toUserId())\n };\n }\n\n public async init(p: ReturnType) {\n this.container.classList.add('edit-profile-container');\n this.setTitle('EditAccount.Title');\n\n const inputFields: InputField[] = [];\n\n const [bioMaxLength, user, userFull] = await Promise.all([p.bioMaxLength, p.user, p.userFull]);\n\n {\n const section = generateSection(this.scrollable, undefined, 'Bio.Description');\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.firstNameInputField = new InputField({\n label: 'EditProfile.FirstNameLabel',\n name: 'first-name',\n maxLength: 70\n });\n this.lastNameInputField = new InputField({\n label: 'Login.Register.LastName.Placeholder',\n name: 'last-name',\n maxLength: 64\n });\n this.bioInputField = new InputField({\n label: 'EditProfile.BioLabel',\n name: 'bio',\n maxLength: bioMaxLength\n });\n\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\n\n const caption = document.createElement('div');\n caption.classList.add('caption');\n i18n_({element: caption, key: 'Bio.Description'});\n\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\n\n this.editPeer = new EditPeer({\n peerId: rootScope.myId,\n inputFields,\n listenerSetter: this.listenerSetter\n });\n\n this.content.append(this.editPeer.nextBtn);\n\n section.append(this.editPeer.avatarEdit.container, inputWrapper);\n }\n\n {\n const section = new SettingSection({\n name: 'EditAccount.Username',\n caption: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.usernameInputField = new UsernameInputField({\n label: 'EditProfile.Username.Label',\n name: 'username',\n plainText: true,\n listenerSetter: this.listenerSetter,\n onChange: () => {\n this.editPeer.handleChange();\n // this.setProfileUrl();\n\n const {error} = this.usernameInputField;\n const isPurchase = error?.type === 'USERNAME_PURCHASE_AVAILABLE';\n setUsername(isPurchase ? this.usernameInputField.value : undefined);\n },\n availableText: 'EditProfile.Username.Available',\n takenText: 'EditProfile.Username.Taken',\n invalidText: 'EditProfile.Username.Invalid'\n }, this.managers);\n\n inputWrapper.append(this.usernameInputField.container);\n\n const caption = section.caption;\n\n const {setUsername, element: p} = purchaseUsernameCaption();\n\n caption.append(\n p,\n i18n('UsernameHelp')\n // document.createElement('br'),\n // document.createElement('br')\n );\n\n // const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\n // profileUrlContainer.classList.add('profile-url-container');\n // const profileUrlAnchor = this.profileUrlAnchor = anchorCopy();\n // profileUrlContainer.append(i18n('UsernameHelpLink', [profileUrlAnchor]));\n // caption.append(profileUrlContainer);\n\n inputFields.push(this.usernameInputField);\n section.content.append(inputWrapper);\n this.scrollable.append(section.container);\n }\n\n {\n const section = new UsernamesSection({\n peerId: rootScope.myId,\n peer: user,\n listenerSetter: this.listenerSetter,\n usernameInputField: this.usernameInputField,\n middleware: this.middlewareHelper.get()\n });\n\n this.scrollable.append(section.container);\n }\n\n attachClickEvent(this.editPeer.nextBtn, () => {\n this.editPeer.nextBtn.disabled = true;\n\n const promises: Promise[] = [];\n\n const profilePromise = this.managers.appProfileManager.updateProfile(\n this.firstNameInputField.value,\n this.lastNameInputField.value,\n this.bioInputField.value\n );\n promises.push(profilePromise.then(() => {\n this.close();\n }, (err) => {\n console.error('updateProfile error:', err);\n }));\n\n if(this.editPeer.uploadAvatar) {\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\n }));\n }\n\n if(this.usernameInputField.isValidToChange()) {\n promises.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value));\n }\n\n Promise.race(promises).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.firstNameInputField.setOriginalValue(user.first_name, true);\n this.lastNameInputField.setOriginalValue(user.last_name, true);\n this.bioInputField.setOriginalValue(userFull.about, true);\n this.usernameInputField.setOriginalValue(getPeerEditableUsername(user), true);\n\n // this.setProfileUrl();\n this.editPeer.handleChange();\n }\n\n // private setProfileUrl() {\n // if(this.usernameInputField.input.classList.contains('error') || !this.usernameInputField.value.length) {\n // this.profileUrlContainer.style.display = 'none';\n // } else {\n // this.profileUrlContainer.style.display = '';\n // this.profileUrlAnchor.replaceWith(this.profileUrlAnchor = anchorCopy({mePath: this.usernameInputField.value}));\n // }\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appImManager, {APP_TABS} from '../../lib/appManagers/appImManager';\nimport SidebarSlider from '../slider';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport AppSharedMediaTab from './tabs/sharedMedia';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\n\nexport class AppSidebarRight extends SidebarSlider {\n private isColumnProportionSet = false;\n private sharedMediaTab: AppSharedMediaTab;\n // public rect: DOMRect;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-right') as HTMLElement,\n canHideFirst: true,\n navigationType: 'right'\n });\n }\n\n construct(managers: AppManagers) {\n this.managers = managers;\n\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\n this.toggleSidebar(false);\n }\n });\n\n mediaSizes.addEventListener('resize', () => {\n this.setColumnProportion();\n });\n }\n\n public createSharedMediaTab() {\n const tab = this.createTab(AppSharedMediaTab, false, true);\n tab.slider = this;\n // this.tabsContainer.prepend(tab.container);\n return tab;\n }\n\n public replaceSharedMediaTab(tab?: AppSharedMediaTab) {\n const previousTab = this.sharedMediaTab;\n if(previousTab) {\n const idx = this.historyTabIds.indexOf(previousTab);\n\n if(this._selectTab.getFrom() === previousTab.container) {\n this._selectTab.setFrom(tab?.container);\n }\n\n if(tab) {\n if(idx !== -1) {\n this.historyTabIds[idx] = tab;\n }\n\n const wasActive = previousTab.container.classList.contains('active');\n if(wasActive) {\n tab.container.classList.add('active');\n }\n\n previousTab.container.replaceWith(tab.container);\n } else {\n if(idx !== -1) {\n this.historyTabIds.splice(idx, 1);\n }\n\n previousTab.container.remove();\n }\n } else {\n this.tabsContainer.prepend(tab.container);\n }\n\n this.sharedMediaTab = tab;\n }\n\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\n if(!this.historyTabIds.length) {\n this.toggleSidebar(false, animate);\n }\n\n super.onCloseTab(id, animate, isNavigation);\n }\n\n private setColumnProportion() {\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\n // this.rect = this.sidebarEl.getBoundingClientRect();\n }\n\n public toggleSidebar(enable?: boolean, animate?: boolean) {\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n let willChange: boolean;\n if(enable !== undefined) {\n if(enable) {\n if(!active) {\n willChange = true;\n }\n } else if(active) {\n willChange = true;\n }\n } else {\n willChange = true;\n }\n\n if(!willChange) return Promise.resolve();\n\n if(!active && !this.historyTabIds.length) {\n this.sharedMediaTab.open();\n }\n\n if(!this.isColumnProportionSet) {\n this.setColumnProportion();\n this.isColumnProportionSet = true;\n }\n\n const animationPromise = appImManager.selectTab(active ? APP_TABS.CHAT : APP_TABS.PROFILE, animate);\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\n return animationPromise;\n\n /* return new Promise((resolve, reject) => {\n const hidden: {element: HTMLDivElement, height: number}[] = [];\n const observer = new IntersectionObserver((entries) => {\n for(const entry of entries) {\n const bubble = entry.target as HTMLDivElement;\n if(!entry.isIntersecting) {\n hidden.push({element: bubble, height: bubble.scrollHeight});\n }\n }\n\n for(const item of hidden) {\n item.element.style.minHeight = item.height + 'px';\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\n item.element.style.width = '1px';\n }\n\n //console.log('hidden', hidden);\n observer.disconnect();\n\n set();\n\n setTimeout(() => {\n for(const item of hidden) {\n item.element.style.minHeight = '';\n item.element.style.width = '';\n (item.element.firstElementChild as HTMLElement).style.display = '';\n }\n\n resolve();\n }, 200);\n });\n\n const length = Object.keys(appImManager.bubbles).length;\n if(length) {\n for(const i in appImManager.bubbles) {\n observer.observe(appImManager.bubbles[i]);\n }\n } else {\n set();\n setTimeout(resolve, 200);\n }\n }); */\n }\n}\n\nconst appSidebarRight = new AppSidebarRight();\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\nexport default appSidebarRight;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider'\nimport InputField from '../../inputField';\nimport EditPeer from '../../editPeer';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport CheckboxField from '../../checkboxField';\nimport Button from '../../button';\nimport PeerTitle from '../../peerTitle';\nimport rootScope from '../../../lib/rootScope';\nimport PopupPeer from '../../popups/peer';\nimport {addCancelButton} from '../../popups';\nimport {i18n} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport formatUserPhone from '../../wrappers/formatUserPhone';\nimport SettingSection from '../../settingSection';\nimport wrapPeerTitle from '../../wrappers/peerTitle';\n\nexport default class AppEditContactTab extends SliderSuperTab {\n private nameInputField: InputField;\n private lastNameInputField: InputField;\n private editPeer: EditPeer;\n private sharePhoneCheckboxField: CheckboxField;\n public peerId: PeerId;\n\n public async init() {\n const {peerId} = this;\n const userId = peerId.toUserId();\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\n const [isContact, privacy] = await Promise.all([\n this.managers.appUsersManager.isContact(userId),\n this.managers.appPrivacyManager.getPrivacy('inputPrivacyKeyPhoneNumber')\n ]);\n const isNew = !isContact;\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\n\n {\n const section = new SettingSection({noDelimiter: true});\n const inputFields: InputField[] = [];\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.nameInputField = new InputField({\n label: 'FirstName',\n name: 'contact-name',\n maxLength: 70,\n required: true\n });\n this.lastNameInputField = new InputField({\n label: 'LastName',\n name: 'contact-lastname',\n maxLength: 70\n });\n\n if(userId) {\n const user = await this.managers.appUsersManager.getUser(userId);\n\n if(isNew) {\n this.nameInputField.setDraftValue(user.first_name);\n this.lastNameInputField.setDraftValue(user.last_name);\n } else {\n this.nameInputField.setOriginalValue(user.first_name);\n this.lastNameInputField.setOriginalValue(user.last_name);\n }\n }\n\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\n inputFields.push(this.nameInputField, this.lastNameInputField);\n\n this.editPeer = new EditPeer({\n peerId: peerId,\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true\n });\n this.content.append(this.editPeer.nextBtn);\n\n if(peerId) {\n const div = document.createElement('div');\n div.classList.add('avatar-edit');\n div.append(this.editPeer.avatarElem);\n\n const notificationsCheckboxField = new CheckboxField({\n text: 'Notifications'\n });\n\n notificationsCheckboxField.input.addEventListener('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n this.managers.appMessagesManager.togglePeerMute({peerId});\n });\n\n this.listenerSetter.add(rootScope)('notify_settings', async(update) => {\n if(update.peer._ !== 'notifyPeer') return;\n const peerId = getPeerId(update.peer.peer);\n if(peerId === peerId) {\n const enabled = !(await this.managers.appNotificationsManager.isMuted(update.notify_settings));\n if(enabled !== notificationsCheckboxField.checked) {\n notificationsCheckboxField.checked = enabled;\n }\n }\n });\n\n const profileNameDiv = document.createElement('div');\n profileNameDiv.classList.add('profile-name');\n profileNameDiv.append(new PeerTitle({\n peerId: peerId\n }).element);\n // profileNameDiv.innerHTML = 'Karen Stanford';\n\n const profileSubtitleDiv = document.createElement('div');\n profileSubtitleDiv.classList.add('profile-subtitle');\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\n\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\n\n if(!isNew) {\n const notificationsRow = new Row({\n checkboxField: notificationsCheckboxField,\n withCheckboxSubtitle: true,\n listenerSetter: this.listenerSetter\n });\n\n const enabled = !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false}));\n notificationsCheckboxField.checked = enabled;\n\n section.content.append(notificationsRow.container);\n } else {\n const user = await this.managers.appUsersManager.getUser(userId);\n\n const phoneRow = new Row({\n icon: 'phone',\n titleLangKey: user.phone ? undefined : 'MobileHidden',\n title: user.phone ? formatUserPhone(user.phone) : undefined,\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: peerId}).element]\n });\n\n section.content.append(phoneRow.container);\n }\n } else {\n section.content.append(inputWrapper);\n }\n\n this.scrollable.append(section.container);\n }\n\n if(!isNew) {\n const section = new SettingSection();\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\n\n attachClickEvent(btnDelete, () => {\n new PopupPeer('popup-delete-contact', {\n peerId: peerId,\n titleLangKey: 'DeleteContact',\n descriptionLangKey: 'AreYouSureDeleteContact',\n buttons: addCancelButton([{\n langKey: 'Delete',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n this.managers.appUsersManager.deleteContacts([userId]).then(() => {\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show();\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n } else if(\n privacy.some((privacyRule) => privacyRule._ === 'privacyValueDisallowAll') &&\n !privacy.some((privacyRule) => privacyRule._ === 'privacyValueAllowUsers' && privacyRule.users.includes(userId))\n ) {\n const section = new SettingSection({\n caption: 'NewContact.Exception.ShareMyPhoneNumber.Desc',\n captionArgs: [await wrapPeerTitle({peerId: this.peerId})]\n });\n const checkboxField = this.sharePhoneCheckboxField = new CheckboxField({\n text: 'NewContact.Exception.ShareMyPhoneNumber',\n checked: true\n });\n const row = CreateRowFromCheckboxField(checkboxField);\n\n section.content.append(row.container);\n\n this.scrollable.append(section.container);\n }\n\n attachClickEvent(this.editPeer.nextBtn, async() => {\n this.editPeer.nextBtn.disabled = true;\n\n this.managers.appUsersManager.addContact(\n userId,\n this.nameInputField.value,\n this.lastNameInputField.value,\n (await this.managers.appUsersManager.getUser(userId)).phone,\n this.sharePhoneCheckboxField?.checked\n ).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {makeMediaSize} from '../../../helpers/mediaSize';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {ForumTopic} from '../../../layer';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {GENERAL_TOPIC_ID, TOPIC_COLORS} from '../../../lib/mtproto/mtproto_config';\nimport getAbbreviation from '../../../lib/richTextProcessor/getAbbreviation';\nimport ButtonIcon from '../../buttonIcon';\nimport CheckboxField from '../../checkboxField';\nimport EmojiTab from '../../emoticonsDropdown/tabs/emoji';\nimport InputField from '../../inputField';\nimport Row from '../../row';\nimport SettingSection from '../../settingSection';\nimport appSidebarLeft from '../../sidebarLeft';\nimport SliderSuperTab from '../../sliderTab';\nimport {wrapTopicIcon} from '../../wrappers/messageActionTextNewUnsafe';\n\nconst size = 64;\nconst mediaSize = makeMediaSize(size, size);\n\nexport default class AppEditTopicTab extends SliderSuperTab {\n private iconDiv: HTMLElement;\n private colorIndex: number;\n private nameInputField: InputField;\n private topic: Parameters[0]['topic'];\n private emojiElement: HTMLElement;\n private confirmBtn: HTMLButtonElement;\n private originalTopic: ForumTopic.forumTopic;\n\n public async init(peerId: PeerId, threadId?: number) {\n this.colorIndex = 0;\n const isNew = !threadId;\n const isGeneral = threadId === GENERAL_TOPIC_ID;\n this.container.classList.add('edit-topic-container');\n this.setTitle(isNew ? 'NewTopic' : 'ForumTopic.Title.Edit');\n const chatId = peerId.toChatId();\n\n if(threadId) {\n this.topic = this.originalTopic = copy(await this.managers.dialogsStorage.getForumTopic(peerId, threadId));\n }\n\n {\n const section = new SettingSection({\n name: isGeneral ? 'CreateGeneralTopicTitle' : 'CreateTopicTitle'\n });\n\n const iconDiv = this.iconDiv = document.createElement('div');\n iconDiv.classList.add('edit-topic-icon-container');\n\n !threadId && attachClickEvent(iconDiv, () => {\n if(this.topic.icon_emoji_id) {\n return;\n }\n\n this.colorIndex = (this.colorIndex + 1) % TOPIC_COLORS.length;\n this.setIcon();\n }, {listenerSetter: this.listenerSetter});\n\n if(threadId) {\n iconDiv.classList.add('disable-hover');\n }\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const nameInputField = this.nameInputField = new InputField({\n label: 'ForumTopic.Name.Placeholder',\n withLinebreaks: false,\n name: 'topic-name',\n maxLength: 70,\n required: true\n });\n\n if(this.topic) {\n nameInputField.setOriginalValue(this.topic.title, true);\n }\n\n const confirmBtn = this.confirmBtn = ButtonIcon('check btn-confirm blue hide', {noRipple: true});\n this.header.append(confirmBtn);\n\n attachClickEvent(confirmBtn, () => {\n const toggle = toggleDisability([confirmBtn], true);\n if(threadId) {\n this.managers.appChatsManager.editForumTopic({\n chatId,\n topicId: threadId,\n title: nameInputField.value,\n iconEmojiId: this.topic.icon_emoji_id || 0\n }).then(() => {\n this.close();\n }).catch((err) => {\n console.error('edit topic error', err);\n toggle();\n });\n } else {\n this.managers.appChatsManager.createForumTopic({\n chatId,\n iconColor: TOPIC_COLORS[this.colorIndex],\n iconEmojiId: this.topic.icon_emoji_id,\n title: nameInputField.value\n }).then((threadId) => {\n this.close();\n appImManager.setInnerPeer({\n peerId,\n threadId\n });\n }).catch((err) => {\n console.error('create topic error', err);\n toggle();\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(nameInputField.input)('input', () => {\n this.validate();\n this.setIcon(this.topic?.icon_emoji_id);\n });\n\n inputWrapper.append(nameInputField.container);\n\n section.content.append(iconDiv, inputWrapper);\n\n this.scrollable.append(section.container);\n }\n\n const promises: Promise[] = [];\n\n if(!isGeneral) {\n const section = new SettingSection({});\n section.container.classList.add('edit-topic-emoticons-container');\n const emojiTab = new EmojiTab({\n managers: this.managers,\n isStandalone: true,\n noRegularEmoji: true,\n stickerSetId: 'inputStickerSetEmojiDefaultTopicIcons',\n onClick: (emoji) => {\n emojiTab.setActive(!emoji.docId ? {emoji: undefined, docId: undefined} : emoji);\n this.setIcon(emoji.docId);\n }\n });\n emojiTab.getContainerSize = () => ({\n width: appSidebarLeft.rect.width,\n height: 400\n });\n\n this.middlewareHelper.onDestroy(() => {\n emojiTab.destroy();\n });\n\n emojiTab.container.classList.remove('tabs-tab');\n\n this.emojiElement = document.createElement('span');\n this.emojiElement.classList.add('super-emoji-topic-icon');\n\n const promise = emojiTab.init().then(async() => {\n const category = emojiTab.getCustomCategory();\n\n const iconEmojiId = this.topic?.icon_emoji_id;\n emojiTab.addEmojiToCategory({\n category,\n element: this.emojiElement,\n batch: false,\n prepend: true,\n active: !iconEmojiId\n });\n\n if(iconEmojiId) {\n emojiTab.setActive({docId: iconEmojiId, emoji: ''});\n }\n });\n\n promises.push(promise);\n\n section.content.replaceWith(emojiTab.container);\n this.scrollable.append(section.container);\n } else {\n const section = new SettingSection({caption: 'EditTopicHideInfo'});\n\n const checkboxField = new CheckboxField({\n // toggle: true,\n checked: !(this.topic as ForumTopic.forumTopic).pFlags.hidden,\n text: 'EditTopicHide'\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n const promise = this.managers.appChatsManager.editForumTopic({\n chatId,\n topicId: threadId,\n hidden: !checkboxField.checked\n });\n\n row.disableWithPromise(promise);\n });\n\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n this.scrollable.append(section.container);\n }\n\n return Promise.all(promises).then(() => {\n return this.s();\n });\n }\n\n private validate() {\n let isChanged = this.nameInputField.isValidToChange();\n if(!isChanged && this.originalTopic) {\n isChanged = this.topic.icon_emoji_id !== this.originalTopic.icon_emoji_id;\n }\n\n this.confirmBtn.classList.toggle('hide', !isChanged);\n }\n\n private s() {\n if(this.topic?.icon_color) {\n this.colorIndex = TOPIC_COLORS.indexOf(this.topic.icon_color);\n }\n\n return this.setIcon(this.topic?.icon_emoji_id, undefined, true);\n }\n\n private async setIcon(iconEmojiId?: Long, appendTo = this.iconDiv, force?: boolean) {\n const title = this.nameInputField.value;\n\n const isMainIcon = appendTo === this.iconDiv;\n\n if(isMainIcon) {\n const newTopic: AppEditTopicTab['topic'] = {\n id: this.topic?.id,\n icon_color: TOPIC_COLORS[this.colorIndex],\n title: getAbbreviation(title, true).text || 'A',\n icon_emoji_id: iconEmojiId\n };\n\n const oldTopic = this.topic;\n this.topic = newTopic;\n\n if(\n force ||\n !oldTopic ||\n oldTopic.icon_color !== newTopic.icon_color ||\n oldTopic.title !== newTopic.title\n ) {\n this.setIcon(undefined, this.emojiElement);\n }\n\n if(deepEqual(oldTopic, newTopic) && !force) {\n return;\n }\n\n this.validate();\n }\n\n const el = await wrapTopicIcon({\n topic: isMainIcon ? this.topic : {...this.topic, icon_emoji_id: undefined},\n customEmojiSize: mediaSize,\n middleware: this.middlewareHelper.get()\n });\n\n const span = document.createElement('div');\n span.classList.add('edit-topic-icon');\n span.append(el);\n\n const oldEl = appendTo.lastElementChild as HTMLElement;\n appendTo.append(span);\n\n const applyFadeAnimation = (el: HTMLElement, fadeIn: boolean) => {\n const frames: Keyframe[] = [\n {opacity: '0', transform: 'scale(0.8)'},\n {opacity: '1', transform: 'scale(1)'}\n ];\n\n const animation = el.animate(frames, {\n duration: 200,\n iterations: 1,\n easing: 'ease-in-out',\n fill: 'forwards',\n direction: fadeIn ? 'normal' : 'reverse'\n });\n\n return new Promise((resolve) => {\n animation.addEventListener('finish', () => {\n resolve();\n }, {once: true});\n });\n };\n\n if(oldEl) {\n applyFadeAnimation(oldEl, false).then(() => oldEl.remove());\n }\n\n applyFadeAnimation(span, true);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {copyTextToClipboard} from '../../../helpers/clipboard';\nimport {randomLong} from '../../../helpers/random';\nimport {Chat, ChatFull, ExportedChatInvite} from '../../../layer';\nimport Button from '../../button';\nimport {setButtonLoader} from '../../putPreloader';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport {toast} from '../../toast';\nimport {UsernameInputField} from '../../usernameInputField';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport I18n, {i18n} from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport CheckboxField from '../../checkboxField';\nimport rootScope from '../../../lib/rootScope';\nimport SettingSection from '../../settingSection';\nimport UsernamesSection from '../../usernamesSection';\nimport getPeerEditableUsername from '../../../lib/appManagers/utils/peers/getPeerEditableUsername';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport {purchaseUsernameCaption} from '../../sidebarLeft/tabs/editProfile';\nimport confirmationPopup from '../../confirmationPopup';\n\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n public chatFull: ChatFull;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'group-type-container');\n\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\n\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\n\n const section = new SettingSection({\n name: isBroadcast ? 'ChannelType' : 'GroupType'\n });\n\n const random = randomLong();\n const privateRow = new Row({\n radioField: new RadioField({\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate',\n name: random,\n value: 'private'\n }),\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\n });\n const publicRow = new Row({\n radioField: new RadioField({\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic',\n name: random,\n value: 'public'\n }),\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\n });\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\n const a: HTMLElement[][] = [[privateSection.container], [publicContainer]];\n if(value === 'public') a.reverse();\n\n a[0].forEach((container) => container.classList.remove('hide'));\n a[1].forEach((container) => container.classList.add('hide'));\n\n onChange();\n });\n\n let chat: Chat = await this.managers.appChatsManager.getChat(this.chatId);\n\n const chatUpdateListeners: {[type in 'basic']: (() => void)[]} = {basic: []};\n const addChatUpdateListener = (callback: () => void, type: 'basic' = 'basic') => {\n chatUpdateListeners[type].push(callback);\n };\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.chatId === chatId) {\n chat = await this.managers.appChatsManager.getChat(this.chatId) as typeof chat;\n chatUpdateListeners['basic'].forEach((callback) => callback());\n }\n });\n\n section.content.append(form);\n\n const privateSection = new SettingSection({});\n\n // let revoked = false;\n const linkRow = new Row({\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\n clickable: () => {\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\n toast(I18n.format('LinkCopied', true));\n },\n listenerSetter: this.listenerSetter\n });\n\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\n\n attachClickEvent(btnRevoke, () => {\n new PopupPeer('revoke-link', {\n buttons: [{\n langKey: 'RevokeButton',\n callback: () => {\n const toggle = toggleDisability([btnRevoke], true);\n\n this.managers.appProfileManager.getChatInviteLink(this.chatId, true).then((link) => {\n toggle();\n linkRow.title.innerHTML = link;\n // revoked = true;\n // onChange();\n });\n }\n }],\n titleLangKey: 'RevokeLink',\n descriptionLangKey: 'RevokeAlert'\n }).show();\n }, {listenerSetter: this.listenerSetter});\n\n privateSection.content.append(linkRow.container, btnRevoke);\n\n const publicSection = new SettingSection({\n caption: true,\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const placeholder = 't.me/';\n\n const onChange = () => {\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) ||\n (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\n applyBtn.classList.toggle('is-visible', changed);\n\n const {error} = linkInputField;\n const isPurchase = error?.type === 'USERNAME_PURCHASE_AVAILABLE';\n setUsername(isPurchase ? linkInputField.getValue() : undefined);\n };\n\n const linkInputField = new UsernameInputField({\n label: 'SetUrlPlaceholder',\n name: 'group-public-link',\n plainText: true,\n listenerSetter: this.listenerSetter,\n availableText: 'Link.Available',\n invalidText: 'Link.Invalid',\n takenText: 'Link.Taken',\n onChange: onChange,\n peerId: this.chatId.toPeerId(true),\n head: placeholder\n }, this.managers);\n\n const {setUsername, element: p} = purchaseUsernameCaption();\n\n publicSection.caption.append(\n p,\n i18n(isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup')\n );\n\n const usernamesSection = new UsernamesSection({\n peerId: this.chatId.toPeerId(true),\n peer: chat as Chat.channel,\n listenerSetter: this.listenerSetter,\n usernameInputField: linkInputField,\n middleware: this.middlewareHelper.get()\n });\n\n const publicContainer = document.createElement('div');\n publicContainer.append(publicSection.container, usernamesSection.container);\n\n const originalValue = placeholder + (getPeerEditableUsername(chat as Chat.channel) || '');\n\n inputWrapper.append(linkInputField.container)\n publicSection.content.append(inputWrapper);\n\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\n this.content.append(applyBtn);\n\n attachClickEvent(applyBtn, async() => {\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\n if(!username) {\n const chat = await this.managers.appChatsManager.getChat(this.chatId);\n const wasUsername = getPeerEditableUsername(chat as Chat.channel);\n if(wasUsername) {\n await confirmationPopup({\n descriptionLangKey: isBroadcast ? 'ChannelVisibility.Confirm.MakePrivate.Channel' : 'ChannelVisibility.Confirm.MakePrivate.Group',\n descriptionLangArgs: [wasUsername],\n button: {\n langKey: 'OK'\n }\n });\n }\n }\n\n /* const unsetLoader = */setButtonLoader(applyBtn);\n this.managers.appChatsManager.migrateChat(this.chatId).then((channelId) => {\n if(!username) {\n return this.managers.appChatsManager.makeChannelPrivate(channelId);\n } else {\n return this.managers.appChatsManager.updateUsername(channelId, username);\n }\n }).then(() => {\n // unsetLoader();\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n (originalValue !== placeholder || getPeerActiveUsernames(chat as Chat.channel).length ? publicRow : privateRow).radioField.checked = true;\n linkInputField.setOriginalValue(originalValue, true);\n\n this.scrollable.append(section.container, privateSection.container, publicContainer);\n\n {\n const section = new SettingSection({\n name: 'SavingContentTitle',\n caption: isBroadcast ? 'RestrictSavingContentInfoChannel' : 'RestrictSavingContentInfoGroup'\n });\n\n const checkboxField = new CheckboxField({\n text: 'RestrictSavingContent',\n withRipple: true\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n const toggle = checkboxField.toggleDisability(true);\n this.managers.appChatsManager.toggleNoForwards(this.chatId, checkboxField.checked).then(() => {\n toggle();\n });\n });\n\n const onChatUpdate = () => {\n checkboxField.setValueSilently(!!(chat as Chat.channel).pFlags.noforwards);\n };\n\n addChatUpdateListener(onChatUpdate);\n\n onChatUpdate();\n\n section.content.append(checkboxField.label);\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {ChannelParticipant} from '../../../layer';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport Button from '../../button';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport {ChatPermissions} from './groupPermissions';\n\nexport default class AppUserPermissionsTab extends SliderSuperTabEventable {\n public participant: ChannelParticipant;\n public chatId: ChatId;\n public userId: UserId;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'user-permissions-container');\n this.setTitle('UserRestrictions');\n\n let destroyListener: () => void;\n\n {\n const section = new SettingSection({\n name: 'UserRestrictionsCanDo'\n });\n\n const div = document.createElement('div');\n div.classList.add('chatlist-container');\n section.content.insertBefore(div, section.title);\n\n const list = appDialogsManager.createChatList({new: true});\n div.append(list);\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: this.userId.toPeerId(false),\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger'\n });\n\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(this.userId)));\n\n const p = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n participant: this.participant._ === 'channelParticipantBanned' ? this.participant : undefined\n }, this.managers);\n\n destroyListener = () => {\n // appChatsManager.editChatDefaultBannedRights(this.chatId, p.takeOut());\n const rights = p.takeOut();\n if(this.participant._ === 'channelParticipantBanned' && deepEqual(this.participant.banned_rights.pFlags, rights.pFlags)) {\n return;\n }\n\n this.managers.appChatsManager.editBanned(this.chatId, this.participant, rights);\n };\n\n this.eventListener.addEventListener('destroy', destroyListener, {once: true});\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({});\n\n if(this.participant._ === 'channelParticipantBanned') {\n const btnDeleteException = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'GroupPermission.Delete'});\n\n attachClickEvent(btnDeleteException, () => {\n const toggle = toggleDisability([btnDeleteException], true);\n this.managers.appChatsManager.clearChannelParticipantBannedRights(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDeleteException);\n }\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'deleteuser', text: 'UserRestrictionsBlock'});\n\n attachClickEvent(btnDelete, () => {\n const toggle = toggleDisability([btnDelete], true);\n this.managers.appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n });\n /* new PopupPeer('popup-group-kick-user', {\n peerId: -this.chatId,\n title: 'Ban User?',\n description: `Are you sure you want to ban ${appPeersManager.getPeerTitle(this.userId)}`,\n buttons: addCancelButton([{\n text: 'BAN',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show(); */\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpTag from '../../../helpers/dom/findUpTag';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport ScrollableLoader from '../../../helpers/scrollableLoader';\nimport {ChannelParticipant, Chat, ChatBannedRights, Update} from '../../../layer';\nimport {ChatRights} from '../../../lib/appManagers/appChatsManager';\nimport appDialogsManager, {DialogDom, DIALOG_LIST_ELEMENT_TAG} from '../../../lib/appManagers/appDialogsManager';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport combineParticipantBannedRights from '../../../lib/appManagers/utils/chats/combineParticipantBannedRights';\nimport hasRights from '../../../lib/appManagers/utils/chats/hasRights';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport I18n, {i18n, join, LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport CheckboxField from '../../checkboxField';\nimport PopupPickUser from '../../popups/pickUser';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport {toast} from '../../toast';\nimport AppUserPermissionsTab from './userPermissions';\n\nexport class ChatPermissions {\n public v: Array<{\n flags: ChatRights[],\n text: LangPackKey,\n exceptionText: LangPackKey,\n checkboxField?: CheckboxField,\n }>;\n private toggleWith: Partial<{[chatRight in ChatRights]: ChatRights[]}>;\n\n constructor(private options: {\n chatId: ChatId,\n listenerSetter: ListenerSetter,\n appendTo: HTMLElement,\n participant?: ChannelParticipant.channelParticipantBanned\n }, private managers: AppManagers) {\n this.construct();\n }\n\n public async construct() {\n this.v = [\n {flags: ['send_messages'], text: 'UserRestrictionsSend', exceptionText: 'UserRestrictionsNoSend'},\n {flags: ['send_media'], text: 'UserRestrictionsSendMedia', exceptionText: 'UserRestrictionsNoSendMedia'},\n {flags: ['send_stickers', 'send_gifs'], text: 'UserRestrictionsSendStickers', exceptionText: 'UserRestrictionsNoSendStickers'},\n {flags: ['send_polls'], text: 'UserRestrictionsSendPolls', exceptionText: 'UserRestrictionsNoSendPolls'},\n {flags: ['embed_links'], text: 'UserRestrictionsEmbedLinks', exceptionText: 'UserRestrictionsNoEmbedLinks'},\n {flags: ['invite_users'], text: 'UserRestrictionsInviteUsers', exceptionText: 'UserRestrictionsNoInviteUsers'},\n {flags: ['pin_messages'], text: 'UserRestrictionsPinMessages', exceptionText: 'UserRestrictionsNoPinMessages'},\n {flags: ['change_info'], text: 'UserRestrictionsChangeInfo', exceptionText: 'UserRestrictionsNoChangeInfo'}\n ];\n\n this.toggleWith = {\n 'send_messages': ['send_media', 'send_stickers', 'send_polls', 'embed_links']\n };\n\n const options = this.options;\n const chat = await this.managers.appChatsManager.getChat(options.chatId) as Chat.chat | Chat.channel;\n const defaultBannedRights = chat.default_banned_rights;\n const rights = options.participant ? combineParticipantBannedRights(chat as Chat.channel, options.participant.banned_rights) : defaultBannedRights;\n\n const restrictionText: LangPackKey = options.participant ? 'UserRestrictionsDisabled' : 'EditCantEditPermissionsPublic';\n for(const info of this.v) {\n const mainFlag = info.flags[0];\n const row = CreateRowFromCheckboxField(\n info.checkboxField = new CheckboxField({\n text: info.text,\n checked: hasRights(chat, mainFlag, rights),\n restriction: true,\n listenerSetter: options.listenerSetter\n })\n );\n\n if((\n options.participant &&\n defaultBannedRights.pFlags[mainFlag as keyof typeof defaultBannedRights['pFlags']]\n ) || (\n getPeerActiveUsernames(chat as Chat.channel)[0] &&\n (\n info.flags.includes('pin_messages') ||\n info.flags.includes('change_info')\n )\n )\n ) {\n info.checkboxField.input.disabled = true;\n\n /* options.listenerSetter.add(info.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n cancelEvent(e);\n toast('This option is disabled for all members in Group Permissions.');\n info.checkboxField.checked = false;\n }); */\n\n attachClickEvent(info.checkboxField.label, (e) => {\n toast(I18n.format(restrictionText, true));\n }, {listenerSetter: options.listenerSetter});\n }\n\n if(this.toggleWith[mainFlag]) {\n options.listenerSetter.add(info.checkboxField.input)('change', () => {\n if(!info.checkboxField.checked) {\n const other = this.v.filter((i) => this.toggleWith[mainFlag].includes(i.flags[0]));\n other.forEach((info) => {\n info.checkboxField.checked = false;\n });\n }\n });\n }\n\n options.appendTo.append(row.container);\n }\n }\n\n public takeOut() {\n const rights: ChatBannedRights = {\n _: 'chatBannedRights',\n until_date: 0x7FFFFFFF,\n pFlags: {}\n };\n\n for(const info of this.v) {\n const banned = !info.checkboxField.checked;\n if(banned) {\n info.flags.forEach((flag) => {\n // @ts-ignore\n rights.pFlags[flag] = true;\n });\n }\n }\n\n return rights;\n }\n}\n\nexport default class AppGroupPermissionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'group-permissions-container');\n this.setTitle('ChannelPermissions');\n\n let chatPermissions: ChatPermissions;\n {\n const section = new SettingSection({\n name: 'ChannelPermissionsHeader'\n });\n\n chatPermissions = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content\n }, this.managers);\n\n this.eventListener.addEventListener('destroy', () => {\n this.managers.appChatsManager.editChatDefaultBannedRights(this.chatId, chatPermissions.takeOut());\n }, {once: true});\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({\n name: 'PrivacyExceptions'\n });\n\n const addExceptionRow = new Row({\n titleLangKey: 'ChannelAddException',\n subtitleLangKey: 'Loading',\n icon: 'adduser',\n clickable: () => {\n new PopupPickUser({\n peerTypes: ['channelParticipants'],\n onSelect: (peerId) => {\n setTimeout(() => {\n openPermissions(peerId);\n }, 0);\n },\n placeholder: 'ExceptionModal.Search.Placeholder',\n peerId: -this.chatId\n });\n },\n listenerSetter: this.listenerSetter\n });\n\n const openPermissions = async(peerId: PeerId) => {\n let participant: AppUserPermissionsTab['participant'];\n try {\n participant = await this.managers.appProfileManager.getChannelParticipant(this.chatId, peerId) as any;\n } catch(err) {\n toast('User is no longer participant');\n return;\n }\n\n const tab = this.slider.createTab(AppUserPermissionsTab);\n tab.participant = participant;\n tab.chatId = this.chatId;\n tab.userId = peerId;\n tab.open();\n };\n\n section.content.append(addExceptionRow.container);\n\n /* const removedUsersRow = new Row({\n titleLangKey: 'ChannelBlockedUsers',\n subtitleLangKey: 'NoBlockedUsers',\n icon: 'deleteuser',\n clickable: true\n });\n\n section.content.append(removedUsersRow.container); */\n\n const c = section.generateContentElement();\n c.classList.add('chatlist-container');\n\n const list = appDialogsManager.createChatList({new: true});\n c.append(list);\n\n attachClickEvent(list, (e) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!target) return;\n\n const peerId = target.dataset.peerId.toPeerId();\n openPermissions(peerId);\n }, {listenerSetter: this.listenerSetter});\n\n const setSubtitle = async(dom: DialogDom, participant: ChannelParticipant.channelParticipantBanned) => {\n const bannedRights = participant.banned_rights;// appChatsManager.combineParticipantBannedRights(this.chatId, participant.banned_rights);\n const defaultBannedRights = ((await this.managers.appChatsManager.getChat(this.chatId)) as Chat.channel).default_banned_rights;\n // const combinedRights = appChatsManager.combineParticipantBannedRights(this.chatId, bannedRights);\n\n const cantWhat: LangPackKey[] = []/* , canWhat: LangPackKey[] = [] */;\n chatPermissions.v.forEach((info) => {\n const mainFlag = info.flags[0];\n // @ts-ignore\n if(bannedRights.pFlags[mainFlag] && !defaultBannedRights.pFlags[mainFlag]) {\n cantWhat.push(info.exceptionText);\n // @ts-ignore\n }/* else if(!combinedRights.pFlags[mainFlag]) {\n canWhat.push(info.exceptionText);\n } */\n });\n\n const el = dom.lastMessageSpan as HTMLElement;\n\n if(cantWhat.length) {\n el.replaceChildren(...join(cantWhat.map((t) => i18n(t)), false));\n }/* else if(canWhat.length) {\n str = 'Can ' + canWhat.join(canWhat.length === 2 ? ' and ' : ', ');\n } */\n\n el.classList.toggle('hide', !cantWhat.length);\n };\n\n const add = (participant: ChannelParticipant.channelParticipantBanned, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: getPeerId(participant.peer),\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger',\n append\n });\n\n setSubtitle(dom, participant);\n\n // dom.titleSpan.innerHTML = 'Chinaza Akachi';\n // dom.lastMessageSpan.innerHTML = 'Can Add Users and Pin Messages';\n };\n\n // this.listenerSetter.add(rootScope)('updateChannelParticipant', (update: Update.updateChannelParticipant) => {\n // const needAdd = update.new_participant?._ === 'channelParticipantBanned' && !update.new_participant.banned_rights.pFlags.view_messages;\n // const li = list.querySelector(`[data-peer-id=\"${update.user_id}\"]`);\n // if(needAdd) {\n // if(!li) {\n // add(update.new_participant as ChannelParticipant.channelParticipantBanned, false);\n // } else {\n // setSubtitle(li, update.new_participant as ChannelParticipant.channelParticipantBanned);\n // }\n\n // if(update.prev_participant?._ !== 'channelParticipantBanned') {\n // ++exceptionsCount;\n // }\n // } else {\n // if(li) {\n // li.remove();\n // }\n\n // if(update.prev_participant?._ === 'channelParticipantBanned') {\n // --exceptionsCount;\n // }\n // }\n\n // setLength();\n // });\n\n const setLength = () => {\n replaceContent(addExceptionRow.subtitle, i18n(exceptionsCount ? 'Permissions.ExceptionsCount' : 'Permissions.NoExceptions', [exceptionsCount]));\n };\n\n let exceptionsCount = 0;\n let loader: ScrollableLoader;\n const setLoader = () => {\n const LOAD_COUNT = 50;\n loader = new ScrollableLoader({\n scrollable: this.scrollable,\n getPromise: () => {\n return this.managers.appProfileManager.getChannelParticipants(this.chatId, {_: 'channelParticipantsBanned', q: ''}, LOAD_COUNT, list.childElementCount).then((res) => {\n for(const participant of res.participants) {\n add(participant as ChannelParticipant.channelParticipantBanned, true);\n }\n\n exceptionsCount = res.count;\n setLength();\n\n return res.participants.length < LOAD_COUNT || res.count === list.childElementCount;\n });\n }\n });\n\n return loader.load();\n };\n\n this.scrollable.append(section.container);\n\n if(await this.managers.appChatsManager.isChannel(this.chatId)) {\n await setLoader();\n } else {\n setLength();\n\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.chatId === migrateFrom) {\n this.chatId = migrateTo;\n setLoader();\n }\n });\n }\n }\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport copy from '../../../../helpers/object/copy';\nimport {ChatBannedRights, Chat} from '../../../../layer';\n\nexport default function combineParticipantBannedRights(chat: Chat.channel, rights: ChatBannedRights) {\n if(chat.default_banned_rights) {\n rights = copy(rights);\n const defaultRights = chat.default_banned_rights.pFlags;\n for(const i in defaultRights) {\n // @ts-ignore\n rights.pFlags[i] = defaultRights[i];\n }\n }\n\n return rights;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport debounce from '../../../helpers/schedulers/debounce';\nimport {ChatReactions, Reaction} from '../../../layer';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport CheckboxField from '../../checkboxField';\nimport Row, {RadioFormFromValues} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\n\nexport default class AppChatReactionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n public async init() {\n this.setTitle('Reactions');\n\n const availableReactions = await this.managers.appReactionsManager.getActiveAvailableReactions();\n const chatFull = await this.managers.appProfileManager.getChatFull(this.chatId);\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\n\n let _chatReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n let chatReactions = _chatReactions;\n let emoticons = new Set(_chatReactions._ === 'chatReactionsSome' ? _chatReactions.reactions.map((reaction) => (reaction as Reaction.reactionEmoji).emoticon) : []);\n\n const makeReactionFromEmoticons = (emoticons: Array): Reaction[] => emoticons.map((emoticon) => ({_: 'reactionEmoji', emoticon}));\n\n const getCaptionLangPackKey = (): LangPackKey => {\n if(isBroadcast) {\n return 'EnableReactionsChannelInfo';\n }\n\n return chatReactions._ === 'chatReactionsAll' ? 'EnableAllReactionsInfo' : (chatReactions._ === 'chatReactionsNone' ? 'DisableReactionsInfo' : 'EnableSomeReactionsInfo');\n };\n\n const toggleSection = new SettingSection({\n name: isBroadcast ? undefined : 'AvailableReactions',\n caption: getCaptionLangPackKey()\n });\n\n const reactionsSection = new SettingSection({\n name: 'OnlyAllowThisReactions'\n });\n\n const toggleCheckboxFieldsByEmoticons = () => {\n const r: Reaction.reactionEmoji[] = (chatReactions as ChatReactions.chatReactionsSome).reactions as any ?? [];\n emoticons = new Set(r.map(({emoticon}) => emoticon));\n checkboxFieldsByEmoticon.forEach((checkboxField, emoticon) => {\n checkboxField.setValueSilently(emoticons.has(emoticon));\n });\n };\n\n let toggleCheckboxField: CheckboxField;\n if(isBroadcast) {\n toggleCheckboxField = new CheckboxField({toggle: true, checked: _chatReactions._ === 'chatReactionsSome'});\n const toggleRow = new Row({\n checkboxField: toggleCheckboxField,\n titleLangKey: 'EnableReactions',\n listenerSetter: this.listenerSetter\n });\n\n toggleSection.content.append(toggleRow.container);\n\n this.listenerSetter.add(toggleCheckboxField.input)('change', () => {\n let save = true;\n if(!toggleCheckboxField.checked) {\n chatReactions = {_: 'chatReactionsNone'};\n } else if(checkboxFields.every((checkboxField) => !checkboxField.checked)) {\n chatReactions = {_: 'chatReactionsSome', reactions: makeReactionFromEmoticons(availableReactions.map(({reaction}) => reaction))};\n } else if(chatReactions._ !== 'chatReactionsSome') {\n chatReactions = {_: 'chatReactionsSome', reactions: makeReactionFromEmoticons(Array.from(emoticons))};\n } else {\n save = false;\n }\n\n if(save) {\n toggleCheckboxFieldsByEmoticons();\n saveReactionsDebounced();\n }\n });\n } else {\n const a: [ChatReactions['_'], LangPackKey][] = [\n ['chatReactionsAll', 'AllReactions'],\n ['chatReactionsSome', 'SomeReactions'],\n ['chatReactionsNone', 'NoReactions']\n ];\n\n const onChange = () => {\n reactionsSection.container.classList.toggle('hide', chatReactions._ !== 'chatReactionsSome');\n };\n\n let value = _chatReactions._;\n const form = RadioFormFromValues(a.map(([value, langPackKey]) => {\n return {\n langPackKey,\n value,\n checked: _chatReactions._ === value\n };\n }), (_value) => {\n value = _value as any;\n\n if(value === 'chatReactionsAll') {\n chatReactions = {\n _: value,\n pFlags: {\n allow_custom: true\n }\n };\n } else if(value === 'chatReactionsNone') {\n chatReactions = {\n _: value\n };\n } else {\n chatReactions = {\n _: value,\n reactions: makeReactionFromEmoticons(['👍', '👎'])\n };\n }\n\n replaceContent(toggleSection.caption, i18n(getCaptionLangPackKey()));\n toggleCheckboxFieldsByEmoticons();\n saveReactionsDebounced();\n onChange();\n });\n\n toggleSection.content.append(form);\n onChange();\n }\n\n const checkboxFieldsByEmoticon: Map = new Map();\n const checkboxFields = availableReactions.map((availableReaction) => {\n const emoticon = availableReaction.reaction;\n const checkboxField = new CheckboxField({\n toggle: true,\n checked: emoticons.has(emoticon)\n });\n\n checkboxFieldsByEmoticon.set(emoticon, checkboxField);\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n if(checkboxField.checked) {\n emoticons.add(emoticon);\n\n if(toggleCheckboxField && !toggleCheckboxField.checked) {\n toggleCheckboxField.checked = true;\n }\n } else {\n emoticons.delete(emoticon);\n\n if(toggleCheckboxField?.checked && !emoticons.size) {\n toggleCheckboxField.checked = false;\n }\n }\n\n saveReactionsDebounced();\n });\n\n const row = new Row({\n checkboxField,\n title: availableReaction.title,\n havePadding: true,\n listenerSetter: this.listenerSetter\n });\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n reactionsSection.content.append(row.container);\n\n return checkboxField;\n });\n\n const saveReactions = async() => {\n saveReactionsDebounced.clearTimeout();\n // const newReactions = Array.from(enabledReactions);\n // if([...newReactions].sort().join() === [...originalReactions].sort().join()) {\n // return;\n // }\n\n if(chatReactions._ === 'chatReactionsSome') {\n chatReactions.reactions = makeReactionFromEmoticons(Array.from(emoticons));\n }\n\n // const r = (chatReactions as ChatReactions.chatReactionsSome).reactions;\n // if(r?.length === availableReactions.length) {\n // chatReactions = {_: 'chatReactionsAll'};\n // }\n\n this.managers.appChatsManager.setChatAvailableReactions(this.chatId, chatReactions);\n _chatReactions = chatReactions;\n };\n\n const saveReactionsDebounced = debounce(saveReactions, 3000, false, true);\n\n this.eventListener.addEventListener('destroy', () => {\n if(saveReactionsDebounced.isDebounced()) {\n saveReactions();\n }\n }, {once: true});\n\n this.scrollable.append(toggleSection.container, reactionsSection.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider'\nimport InputField from '../../inputField';\nimport EditPeer from '../../editPeer';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport Button from '../../button';\nimport {ChatRights} from '../../../lib/appManagers/appChatsManager';\nimport {Chat, ChatFull} from '../../../layer';\nimport AppChatTypeTab from './chatType';\nimport rootScope from '../../../lib/rootScope';\nimport AppGroupPermissionsTab from './groupPermissions';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport PopupDeleteDialog from '../../popups/deleteDialog';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport CheckboxField from '../../checkboxField';\nimport AppChatReactionsTab from './chatReactions';\nimport hasRights from '../../../lib/appManagers/utils/chats/hasRights';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport SettingSection from '../../settingSection';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\n\nexport default class AppEditChatTab extends SliderSuperTab {\n private chatNameInputField: InputField;\n private descriptionInputField: InputField;\n private editPeer: EditPeer;\n public chatId: ChatId;\n\n protected async _init() {\n // * cleanup prev\n this.listenerSetter.removeAll();\n this.scrollable.container.replaceChildren();\n\n this.container.classList.add('edit-peer-container', 'edit-group-container');\n this.setTitle('Edit');\n\n let [\n chatFull,\n chat,\n isBroadcast,\n isChannel,\n canChangeType,\n canChangePermissions,\n canManageTopics,\n appConfig\n ] = await Promise.all([\n this.managers.appProfileManager.getChatFull(this.chatId, true),\n this.managers.appChatsManager.getChat(this.chatId) as Promise,\n this.managers.appChatsManager.isBroadcast(this.chatId),\n this.managers.appChatsManager.isChannel(this.chatId),\n this.managers.appChatsManager.hasRights(this.chatId, 'change_type'),\n this.managers.appChatsManager.hasRights(this.chatId, 'change_permissions'),\n this.managers.appChatsManager.hasRights(this.chatId, 'manage_topics'),\n this.managers.apiManager.getAppConfig()\n ]);\n\n const chatUpdateListeners: {[type in 'full' | 'basic']: (() => void)[]} = {full: [], basic: []};\n const addChatUpdateListener = (callback: () => void, type: 'full' | 'basic' = 'basic') => {\n chatUpdateListeners[type].push(callback);\n };\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.chatId === chatId) {\n chat = await this.managers.appChatsManager.getChat(this.chatId) as typeof chat;\n chatUpdateListeners['basic'].forEach((callback) => callback());\n }\n });\n\n this.listenerSetter.add(rootScope)('chat_full_update', async(chatId) => {\n if(this.chatId === chatId) {\n chatFull = await this.managers.appProfileManager.getCachedFullChat(chatId) || chatFull;\n chatUpdateListeners['full'].forEach((callback) => callback());\n }\n });\n\n const peerId = this.chatId.toPeerId(true);\n\n {\n const section = new SettingSection({noDelimiter: true, caption: true});\n const inputFields: InputField[] = [];\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.chatNameInputField = new InputField({\n label: isBroadcast ? 'EnterChannelName' : 'CreateGroup.NameHolder',\n name: 'chat-name',\n maxLength: 255,\n required: true\n });\n this.descriptionInputField = new InputField({\n label: 'DescriptionPlaceholder',\n name: 'chat-description',\n maxLength: 255\n });\n\n this.chatNameInputField.setOriginalValue(chat.title);\n this.descriptionInputField.setOriginalValue(chatFull.about);\n\n inputWrapper.append(this.chatNameInputField.container, this.descriptionInputField.container);\n\n inputFields.push(this.chatNameInputField, this.descriptionInputField);\n\n this.editPeer = new EditPeer({\n peerId,\n inputFields,\n listenerSetter: this.listenerSetter,\n popupOptions: {isForum: (chat as Chat.channel).pFlags.forum}\n });\n this.content.append(this.editPeer.nextBtn);\n\n section.content.append(this.editPeer.avatarEdit.container, inputWrapper);\n\n if(canChangeType) {\n const chatTypeRow = new Row({\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\n clickable: () => {\n const tab = this.slider.createTab(AppChatTypeTab);\n tab.chatId = this.chatId;\n tab.chatFull = chatFull;\n tab.open();\n },\n icon: 'lock',\n listenerSetter: this.listenerSetter\n });\n\n const setChatTypeSubtitle = () => {\n let key: LangPackKey;\n const username = getPeerActiveUsernames(chat as Chat.channel)[0];\n if(isBroadcast) {\n key = username ? 'TypePublic' : 'TypePrivate';\n } else {\n key = username ? 'TypePublicGroup' : 'TypePrivateGroup';\n }\n\n chatTypeRow.subtitle.replaceChildren(i18n(key));\n };\n\n setChatTypeSubtitle();\n addChatUpdateListener(setChatTypeSubtitle);\n section.content.append(chatTypeRow.container);\n }\n\n if(canChangeType || canChangePermissions) {\n const reactionsRow = new Row({\n titleLangKey: 'Reactions',\n icon: 'reactions',\n clickable: () => {\n const tab = this.slider.createTab(AppChatReactionsTab);\n tab.chatId = this.chatId;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const availableReactions = await this.managers.appReactionsManager.getAvailableReactions();\n const availableReactionsLength = availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive).length;\n const setReactionsLength = () => {\n const chatAvailableReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n if(chatAvailableReactions._ === 'chatReactionsSome') {\n const length = chatAvailableReactions.reactions.length;\n if(length === availableReactionsLength) {\n replaceContent(reactionsRow.subtitle, i18n('ReactionsAll'));\n } else {\n reactionsRow.subtitle.textContent = length + '/' + availableReactionsLength;\n }\n } else {\n replaceContent(reactionsRow.subtitle, i18n(chatAvailableReactions._ === 'chatReactionsAll' ? 'ReactionsAll' : 'Checkbox.Disabled'));\n }\n };\n\n setReactionsLength();\n addChatUpdateListener(setReactionsLength, 'full');\n section.content.append(reactionsRow.container);\n }\n\n if(canChangePermissions && !isBroadcast) {\n const flags = [\n 'send_messages',\n 'send_media',\n 'send_stickers',\n 'send_polls',\n 'embed_links',\n 'invite_users',\n 'pin_messages',\n 'change_info'\n ] as ChatRights[];\n\n const permissionsRow = new Row({\n titleLangKey: 'ChannelPermissions',\n clickable: () => {\n const tab = this.slider.createTab(AppGroupPermissionsTab);\n tab.chatId = this.chatId;\n tab.open();\n },\n icon: 'permissions',\n listenerSetter: this.listenerSetter\n });\n\n const setPermissionsLength = () => {\n permissionsRow.subtitle.textContent = flags.reduce((acc, f) => acc + +hasRights(chat, f, (chat as Chat.chat).default_banned_rights), 0) + '/' + flags.length;\n };\n\n setPermissionsLength();\n addChatUpdateListener(setPermissionsLength);\n section.content.append(permissionsRow.container);\n }\n\n if(canManageTopics && (chat.participants_count >= appConfig.forum_upgrade_participants_min || (chat as Chat.channel).pFlags.forum) && !isBroadcast) {\n const topicsRow = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Topics',\n clickable: () => {},\n icon: 'topics',\n listenerSetter: this.listenerSetter\n });\n\n const setTopics = () => {\n const isForum = !!(chat as Chat.channel).pFlags.forum;\n this.editPeer.avatarElem.parentElement.classList.toggle('is-forum', isForum);\n topicsRow.checkboxField.setValueSilently(isForum);\n };\n\n this.listenerSetter.add(topicsRow.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n const promise = this.managers.appChatsManager.toggleForum(this.chatId, topicsRow.checkboxField.checked);\n topicsRow.disableWithPromise(promise);\n });\n\n setTopics();\n addChatUpdateListener(setTopics);\n\n section.caption.replaceChildren(i18n('ForumToggleDescription'));\n section.content.append(topicsRow.container);\n }\n\n section.caption.classList.toggle('hide', !section.caption.childElementCount);\n\n /* const administratorsRow = new Row({\n titleLangKey: 'PeerInfo.Administrators',\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\n icon: 'admin',\n clickable: true\n });\n\n section.content.append(administratorsRow.container); */\n\n this.scrollable.append(section.container);\n\n attachClickEvent(this.editPeer.nextBtn, () => {\n this.editPeer.nextBtn.disabled = true;\n\n const promises: Promise[] = [];\n\n const id = this.chatId;\n if(this.chatNameInputField.isValidToChange()) {\n promises.push(this.managers.appChatsManager.editTitle(id, this.chatNameInputField.value));\n }\n\n if(this.descriptionInputField.isValidToChange()) {\n promises.push(this.managers.appChatsManager.editAbout(id, this.descriptionInputField.value));\n }\n\n if(this.editPeer.uploadAvatar) {\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\n return this.managers.appChatsManager.editPhoto(id, inputFile);\n }));\n }\n\n Promise.race(promises).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\n const discussionRow = new Row({\n titleLangKey: 'PeerInfo.Discussion',\n subtitleLangKey: 'PeerInfo.Discussion.Add',\n clickable: true,\n icon: 'message'\n });\n\n section.content.append(discussionRow.container);\n }\n\n const administratorsRow = new Row({\n titleLangKey: 'PeerInfo.Administrators',\n subtitle: '' + chatFull.admins_count,\n icon: 'admin',\n clickable: true\n });\n\n section.content.append(administratorsRow.container); */\n\n if(isBroadcast && await this.managers.appChatsManager.hasRights(this.chatId, 'change_info')) {\n const signMessagesCheckboxField = new CheckboxField({\n text: 'ChannelSignMessages',\n checked: !!(chat as Chat.channel).pFlags.signatures\n });\n\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\n const toggle = signMessagesCheckboxField.toggleDisability(true);\n this.managers.appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\n toggle();\n });\n });\n\n addChatUpdateListener(() => {\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\n });\n\n section.content.append(CreateRowFromCheckboxField(signMessagesCheckboxField).container);\n }\n }\n\n if(!isBroadcast) {\n const section = new SettingSection({\n\n });\n\n /* const membersRow = new Row({\n titleLangKey: isBroadcast ? 'PeerInfo.Subscribers' : 'GroupMembers',\n icon: 'newgroup',\n clickable: true\n });\n\n membersRow.subtitle.append(i18n('Subscribers', [numberThousandSplitter(335356)]));\n\n section.content.append(membersRow.container); */\n\n if(!isBroadcast && canChangeType) {\n const showChatHistoryCheckboxField = new CheckboxField({\n text: 'ChatHistory'\n });\n\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\n this.managers.appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\n toggle();\n });\n });\n\n // ! it won't be updated because chatFull will be old\n const onChatUpdate = () => {\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\n };\n\n onChatUpdate();\n addChatUpdateListener(onChatUpdate);\n\n section.content.append(CreateRowFromCheckboxField(showChatHistoryCheckboxField).container);\n }\n\n if(section.content.childElementCount) {\n this.scrollable.append(section.container);\n }\n }\n\n if(await this.managers.appChatsManager.hasRights(this.chatId, 'delete_chat')) {\n const section = new SettingSection({});\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\n\n attachClickEvent(btnDelete, () => {\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\n const toggle = toggleDisability([btnDelete], true);\n promise.then(() => {\n this.close();\n }, () => {\n toggle();\n });\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n\n if(!isChannel) {\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(peerId === migrateFrom) {\n this.chatId = migrateTo.toChatId();\n this._init();\n }\n });\n }\n }\n\n public init() {\n return this._init();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../../lib/rootScope';\nimport AppSearchSuper, {SearchSuperType} from '../../appSearchSuper.';\nimport SidebarSlider, {SliderSuperTab} from '../../slider';\nimport TransitionSlider from '../../transition';\nimport AppEditChatTab from './editChat';\nimport PeerTitle from '../../peerTitle';\nimport AppEditContactTab from './editContact';\nimport Button from '../../button';\nimport ButtonIcon from '../../buttonIcon';\nimport I18n, {i18n, LangPackKey} from '../../../lib/langPack';\nimport {toastNew} from '../../toast';\nimport AppAddMembersTab from '../../sidebarLeft/tabs/addMembers';\nimport PopupPickUser from '../../popups/pickUser';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerCheckboxOptions} from '../../popups/peer';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport PeerProfile from '../../peerProfile';\nimport {Message} from '../../../layer';\nimport getMessageThreadId from '../../../lib/appManagers/utils/messages/getMessageThreadId';\nimport AppEditTopicTab from './editTopic';\n\ntype SharedMediaHistoryStorage = Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n}>;\n\nconst historiesStorage: {\n [peerId: PeerId]: {\n [threadId: number]: SharedMediaHistoryStorage\n }\n} = {};\n\n// TODO: отредактированное сообщение не изменится\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId: number;\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n private titleI18n: I18n.IntlElement;\n\n public isFirst: boolean;\n\n public init() {\n // const perf = performance.now();\n\n this.container.classList.add('shared-media-container', 'profile-container');\n\n // * header\n const newCloseBtn = Button('btn-icon sidebar-close-button', {noRipple: true});\n this.closeBtn.replaceWith(newCloseBtn);\n this.closeBtn = newCloseBtn;\n\n const animatedCloseIcon = document.createElement('div');\n animatedCloseIcon.classList.add('animated-close-icon');\n newCloseBtn.append(animatedCloseIcon);\n\n if(this.isFirst) {\n animatedCloseIcon.classList.add('state-back');\n }\n\n const transitionContainer = document.createElement('div');\n transitionContainer.className = 'transition slide-fade';\n\n const transitionFirstItem = document.createElement('div');\n transitionFirstItem.classList.add('transition-item');\n\n this.titleI18n = new I18n.IntlElement();\n this.title.append(this.titleI18n.element);\n this.editBtn = ButtonIcon('edit');\n // const moreBtn = ButtonIcon('more');\n\n transitionFirstItem.append(this.title, this.editBtn/* , moreBtn */);\n\n const transitionLastItem = document.createElement('div');\n transitionLastItem.classList.add('transition-item');\n\n const secondTitle: HTMLElement = this.title.cloneNode() as any;\n secondTitle.append(i18n('PeerInfo.SharedMedia'));\n\n transitionLastItem.append(secondTitle);\n\n transitionContainer.append(transitionFirstItem, transitionLastItem);\n\n this.header.append(transitionContainer);\n\n // * body\n\n this.profile = new PeerProfile(this.managers, this.scrollable, this.listenerSetter);\n this.profile.init();\n\n this.scrollable.append(this.profile.element);\n\n const HEADER_HEIGHT = 56;\n this.scrollable.onAdditionalScroll = () => {\n const rect = this.searchSuper.nav.getBoundingClientRect();\n if(!rect.width) return;\n\n const top = rect.top - 1;\n setIsSharedMedia(top <= HEADER_HEIGHT);\n };\n\n const setIsSharedMedia = (isSharedMedia: boolean) => {\n animatedCloseIcon.classList.toggle('state-back', this.isFirst || isSharedMedia);\n this.searchSuper.container.classList.toggle('is-full-viewport', isSharedMedia);\n transition(+isSharedMedia);\n\n if(!isSharedMedia) {\n this.searchSuper.cleanScrollPositions();\n }\n };\n\n const transition = TransitionSlider({\n content: transitionContainer,\n type: 'slide-fade',\n transitionTime: 400,\n isHeavy: false\n });\n\n transition(0);\n\n attachClickEvent(this.closeBtn, (e) => {\n if(transition.prevId()) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement,\n position: 'start'\n });\n transition(0);\n\n if(!this.isFirst) {\n animatedCloseIcon.classList.remove('state-back');\n }\n } else if(!this.scrollable.isHeavyAnimationInProgress) {\n this.slider.onCloseBtnClick();\n }\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.editBtn, async() => {\n let tab: AppEditChatTab | AppEditContactTab | AppEditTopicTab;\n const {peerId, threadId} = this;\n if(threadId && await this.managers.appPeersManager.isForum(peerId)) {\n tab = this.slider.createTab(AppEditTopicTab)\n } else if(peerId.isAnyChat()) {\n tab = this.slider.createTab(AppEditChatTab);\n } else {\n tab = this.slider.createTab(AppEditContactTab);\n }\n\n if(tab) {\n if(tab instanceof AppEditTopicTab) {\n tab.open(peerId, this.threadId);\n } else {\n if(tab instanceof AppEditChatTab) {\n tab.chatId = peerId.toChatId();\n } else {\n tab.peerId = peerId;\n }\n\n tab.open();\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('contacts_update', (userId) => {\n if(this.peerId === userId) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\n this.renderNewMessage(message);\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n this.deleteDeletedMessages(peerId, Array.from(msgs));\n });\n\n // Calls when message successfully sent and we have an id\n this.listenerSetter.add(rootScope)('message_sent', ({message}) => {\n this.renderNewMessage(message);\n });\n\n // this.container.prepend(this.closeBtn.parentElement);\n\n this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'PeerMedia.Members',\n type: 'members'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }],\n scrollable: this.scrollable,\n onChangeTab: (mediaTab) => {\n const timeout = mediaTab.type === 'members' && rootScope.settings.animationsEnabled ? 250 : 0;\n setTimeout(() => {\n btnAddMembers.classList.toggle('is-hidden', mediaTab.type !== 'members');\n }, timeout);\n },\n managers: this.managers\n });\n\n this.searchSuper.scrollStartCallback = () => {\n setIsSharedMedia(true);\n };\n\n this.profile.element.append(this.searchSuper.container);\n\n const btnAddMembers = ButtonCorner({icon: 'addmember_filled'});\n this.content.append(btnAddMembers);\n\n attachClickEvent(btnAddMembers, async() => {\n const peerId = this.peerId;\n const id = this.peerId.toChatId();\n const isChannel = await this.managers.appChatsManager.isChannel(id);\n\n const showConfirmation = (peerIds: PeerId[], callback: (checked: PopupPeerButtonCallbackCheckboxes) => void) => {\n let titleLangKey: LangPackKey, titleLangArgs: any[],\n descriptionLangKey: LangPackKey, descriptionLangArgs: any[],\n checkboxes: PopupPeerCheckboxOptions[];\n\n if(peerIds.length > 1) {\n titleLangKey = 'AddMembersAlertTitle';\n titleLangArgs = [i18n('Members', [peerIds.length])];\n descriptionLangKey = 'AddMembersAlertCountText';\n descriptionLangArgs = peerIds.map((peerId) => {\n const b = document.createElement('b');\n b.append(new PeerTitle({peerId}).element);\n return b;\n });\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddMembersForwardMessages',\n checked: true\n }];\n }\n } else {\n titleLangKey = 'AddOneMemberAlertTitle';\n descriptionLangKey = 'AddMembersAlertNamesText';\n const b = document.createElement('b');\n b.append(new PeerTitle({\n peerId: peerIds[0]\n }).element);\n descriptionLangArgs = [b];\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddOneMemberForwardMessages',\n textArgs: [new PeerTitle({peerId: peerIds[0]}).element],\n checked: true\n }];\n }\n }\n\n descriptionLangArgs.push(new PeerTitle({\n peerId\n }).element);\n\n new PopupPeer('popup-add-members', {\n peerId,\n titleLangKey,\n descriptionLangKey,\n descriptionLangArgs,\n buttons: [{\n langKey: 'Add',\n callback\n }],\n checkboxes\n }).show();\n };\n\n const onError = (err: any) => {\n if(err.type === 'USER_PRIVACY_RESTRICTED') {\n toastNew({langPackKey: 'InviteToGroupError'});\n }\n };\n\n if(isChannel) {\n const tab = this.slider.createTab(AppAddMembersTab);\n tab.open({\n type: 'channel',\n skippable: false,\n takeOut: (peerIds) => {\n showConfirmation(peerIds, () => {\n const promise = this.managers.appChatsManager.inviteToChannel(id, peerIds);\n promise.catch(onError);\n tab.attachToPromise(promise);\n });\n\n return false;\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n } else {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'Search',\n onSelect: (peerId) => {\n setTimeout(() => {\n showConfirmation([peerId], (checked) => {\n this.managers.appChatsManager.addChatUser(id, peerId, checked.size ? undefined : 0)\n .catch(onError);\n });\n }, 0);\n }\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n // console.log('construct shared media time:', performance.now() - perf);\n }\n\n private _renderNewMessage(message: Message.message | Message.messageService, threadId?: number) {\n const historyStorage = historiesStorage[message.peerId]?.[threadId];\n if(!historyStorage) return;\n\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const history = historyStorage[inputFilter];\n if(!history) {\n continue;\n }\n\n const filtered = this.searchSuper.filterMessagesByType([message], inputFilter)\n .filter((message) => !history.find((m) => m.mid === message.mid && m.peerId === message.peerId));\n if(filtered.length) {\n history.unshift(...filtered.map((message) => ({mid: message.mid, peerId: message.peerId})));\n\n if(this.peerId === message.peerId && this.searchSuper.usedFromHistory[inputFilter] !== -1) {\n this.searchSuper.usedFromHistory[inputFilter] += filtered.length;\n this.searchSuper.performSearchResult(filtered, mediaTab, false);\n }\n }\n }\n }\n\n private async renderNewMessage(message: Message.message | Message.messageService) {\n if(this.init) return; // * not inited yet\n\n const {peerId} = message;\n const isForum = await this.managers.appPeersManager.isForum(peerId);\n const threadId = getMessageThreadId(message, isForum);\n\n this._renderNewMessage(message);\n if(threadId) {\n this._renderNewMessage(message, threadId);\n }\n }\n\n public _deleteDeletedMessages(historyStorage: SharedMediaHistoryStorage, peerId: PeerId, mids: number[]) {\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = historyStorage[inputFilter];\n if(!history) continue;\n\n const idx = history.findIndex((m) => m.mid === mid);\n if(idx === -1) {\n continue;\n }\n\n history.splice(idx, 1);\n\n if(this.peerId === peerId) {\n const container = this.searchSuper.tabs[inputFilter];\n const div = container.querySelector(`[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`) as HTMLElement;\n if(div) {\n if(this.searchSuper.selection.isSelecting) {\n this.searchSuper.selection.toggleByElement(div);\n }\n\n div.remove();\n }\n\n if(this.searchSuper.usedFromHistory[inputFilter] >= (idx + 1)) {\n --this.searchSuper.usedFromHistory[inputFilter];\n }\n }\n\n // can have element in different tabs somehow\n // break;\n }\n }\n }\n\n public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n const h = historiesStorage[peerId];\n if(!h) return;\n\n for(const threadId in h) {\n this._deleteDeletedMessages(h[threadId], peerId, mids);\n }\n\n this.scrollable.onScroll();\n }\n\n private async cleanupHTML() {\n // const perf = performance.now();\n const isAnyChat = this.peerId.isAnyChat();\n const [canViewMembers, hasRights] = await Promise.all([\n isAnyChat ? this.searchSuper.canViewMembers() : false,\n isAnyChat ? this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users') : false\n ]);\n\n return () => {\n this.profile.cleanupHTML();\n this.editBtn.classList.add('hide');\n this.searchSuper.cleanupHTML(true);\n this.container.classList.toggle('can-add-members', canViewMembers && hasRights);\n };\n // console.log('cleanupHTML shared media time:', performance.now() - perf);\n }\n\n public setLoadMutex(promise: Promise) {\n this.searchSuper.loadMutex = promise;\n }\n\n public setPeer(peerId: PeerId, threadId?: number) {\n if(this.peerId === peerId && this.threadId === threadId) return false;\n\n this.peerId = peerId;\n this.threadId = threadId;\n this.peerChanged = true;\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.searchSuper.setQuery({\n peerId,\n threadId,\n historyStorage: (historiesStorage[peerId] ??= {})[threadId] ??= {}\n });\n\n this.profile.setPeer(peerId, threadId);\n\n return true;\n }\n\n private async changeTitleKey() {\n const isForum = this.managers.appPeersManager.isForum(this.peerId);\n\n return () => {\n this.titleI18n.compareAndUpdate({key: this.threadId && isForum ? 'AccDescrTopic' : 'Profile'});\n };\n }\n\n public async fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n const callbacks = await Promise.all([\n this.cleanupHTML(),\n this.toggleEditBtn(true),\n this.profile.fillProfileElements(),\n this.changeTitleKey()\n ]);\n\n return () => {\n callbacks.forEach((callback) => {\n callback?.();\n });\n };\n }\n\n private async toggleEditBtn(manual?: T): Promise void : void> {\n let show: boolean;\n if(this.peerId.isUser()) {\n show = this.peerId !== rootScope.myId && await this.managers.appUsersManager.isContact(this.peerId.toUserId());\n } else {\n const chatId = this.peerId.toChatId();\n const isTopic = this.threadId && await this.managers.appChatsManager.isForum(chatId);\n show = await this.managers.appChatsManager.hasRights(chatId, isTopic ? 'manage_topics' : 'change_info');\n }\n\n const callback = () => {\n this.editBtn.classList.toggle('hide', !show);\n };\n\n return manual ? callback : callback() as any;\n }\n\n public loadSidebarMedia(single: boolean, justLoad?: boolean) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n super.onOpenAfterTimeout();\n\n this.scrollable.onScroll();\n }\n\n onCloseAfterTimeout() {\n super.onCloseAfterTimeout();\n\n if(this.destroyable) {\n this.profile.destroy();\n this.searchSuper.destroy();\n }\n }\n\n public destroy() {\n this.destroyable = true;\n this.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\n\ntype SetTransitionOptions = {\n element: HTMLElement,\n className: string,\n forwards: boolean,\n duration: number,\n onTransitionEnd?: () => void,\n useRafs?: number,\n onTransitionStart?: () => void\n};\nconst SetTransition = (options: SetTransitionOptions) => {\n const {element, className, forwards, duration, onTransitionEnd, onTransitionStart, useRafs} = options;\n const {timeout, raf} = element.dataset;\n if(timeout !== undefined) {\n clearTimeout(+timeout);\n }\n\n // useRafs = undefined;\n // duration = 0;\n\n if(raf !== undefined) {\n window.cancelAnimationFrame(+raf);\n if(!useRafs) {\n delete element.dataset.raf;\n }\n }\n\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\n // return;\n // }\n\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\n delete element.dataset.raf;\n SetTransition({\n ...options,\n useRafs: useRafs - 1\n });\n });\n\n return;\n }\n\n if(forwards && className) {\n element.classList.add(className);\n }\n\n const afterTimeout = () => {\n delete element.dataset.timeout;\n if(!forwards && className) {\n element.classList.remove('backwards', className);\n }\n\n element.classList.remove('animating');\n\n onTransitionEnd?.();\n };\n\n onTransitionStart?.();\n if(!rootScope.settings.animationsEnabled || !duration) {\n element.classList.remove('animating', 'backwards');\n afterTimeout();\n return;\n }\n\n element.classList.add('animating');\n\n element.classList.toggle('backwards', !forwards);\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\n};\n\nexport default SetTransition;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {horizontalMenu} from './horizontalMenu';\nimport TransitionSlider from './transition';\nimport appNavigationController, {NavigationItem} from './appNavigationController';\nimport SliderSuperTab, {SliderSuperTabConstructable} from './sliderTab';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport {MaybePromise} from '../types';\n\nconst TRANSITION_TIME = 250;\n\nexport {SliderSuperTab};\n\nexport default class SidebarSlider {\n protected _selectTab: ReturnType;\n protected historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\n protected tabsContainer: HTMLElement;\n public sidebarEl: HTMLElement;\n protected tabs: Map; // * key is any, since right sidebar is ugly now\n private canHideFirst = false;\n private navigationType: NavigationItem['type'];\n protected managers: AppManagers;\n protected middlewareHelper: MiddlewareHelper;\n public onOpenTab: () => MaybePromise;\n\n constructor(options: {\n sidebarEl: SidebarSlider['sidebarEl'],\n tabs?: SidebarSlider['tabs'],\n canHideFirst?: SidebarSlider['canHideFirst'],\n navigationType: SidebarSlider['navigationType']\n }) {\n safeAssign(this, options);\n\n this.tabs ??= new Map();\n\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\n this._selectTab = TransitionSlider({\n content: this.tabsContainer,\n type: 'navigation',\n transitionTime: TRANSITION_TIME\n });\n if(!this.canHideFirst) {\n this._selectTab(0);\n }\n\n this.middlewareHelper = getMiddleware();\n\n // Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach((el) => {\n // attachClickEvent(el, this.onCloseBtnClick);\n // });\n }\n\n public getMiddleware() {\n return this.middlewareHelper.get();\n }\n\n public onCloseBtnClick = () => {\n const item = appNavigationController.findItemByType(this.navigationType);\n if(item) {\n appNavigationController.back(this.navigationType);\n } else if(this.historyTabIds.length) {\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\n }\n // this.closeTab();\n };\n\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\n this.removeTabFromHistory(id);\n return false;\n }\n\n // console.log('sidebar-close-button click:', this.historyTabIDs);\n const closingId = this.historyTabIds.pop(); // pop current\n this.onCloseTab(closingId, animate, isNavigation);\n\n const tab = this.historyTabIds[this.historyTabIds.length - 1];\n this._selectTab(tab !== undefined ? (tab instanceof SliderSuperTab ? tab.container : tab) : (this.canHideFirst ? -1 : 0), animate);\n return true;\n };\n\n public async selectTab(id: number | SliderSuperTab) {\n /* if(id instanceof SliderSuperTab) {\n id = id.id;\n } */\n\n if(this.historyTabIds[this.historyTabIds.length - 1] === id) {\n return false;\n }\n\n const tab: SliderSuperTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\n this.onOpenTab && await this.onOpenTab();\n\n if(tab) {\n // @ts-ignore\n tab.onOpen?.();\n\n // @ts-ignore\n if(tab.onOpenAfterTimeout) {\n setTimeout(() => {\n // @ts-ignore\n tab.onOpenAfterTimeout();\n }, TRANSITION_TIME);\n }\n }\n\n // if(!this.canHideFirst || this.historyTabIds.length) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: (canAnimate) => {\n this.closeTab(undefined, canAnimate, true);\n return true;\n }\n });\n // }\n\n this.historyTabIds.push(id);\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\n return true;\n }\n\n public removeTabFromHistory(id: number | SliderSuperTab) {\n indexOfAndSplice(this.historyTabIds, id);\n this.onCloseTab(id, undefined);\n }\n\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\n const tab = this.historyTabIds[i];\n if(tab === preserveTab) continue;\n else if(tab instanceof tabConstructor) {\n break;\n }\n\n this.removeTabFromHistory(tab);\n // appNavigationController.removeByType(this.navigationType, true);\n }\n }\n\n public getTab(tabConstructor: SliderSuperTabConstructable) {\n return this.historyTabIds.find((t) => t instanceof tabConstructor) as T;\n }\n\n public getHistory() {\n return this.historyTabIds;\n }\n\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\n return !!this.getTab(tabConstructor);\n }\n\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\n if(!isNavigation) {\n appNavigationController.removeByType(this.navigationType, true);\n }\n\n const tab: SliderSuperTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\n if(tab) {\n try {\n // @ts-ignore\n tab.onClose?.();\n } catch(err) {\n console.error('tab onClose error', tab);\n }\n\n // @ts-ignore\n if(tab.onCloseAfterTimeout) {\n setTimeout(() => {\n // @ts-ignore\n tab.onCloseAfterTimeout();\n }, TRANSITION_TIME + 30);\n }\n }\n }\n\n public addTab(tab: SliderSuperTab) {\n if(!tab.container.parentElement) {\n this.tabsContainer.append(tab.container);\n\n if(tab.closeBtn) {\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\n }\n }\n }\n\n public deleteTab(tab: SliderSuperTab) {\n this.tabs.delete(tab);\n }\n\n public createTab(\n ctor: SliderSuperTabConstructable,\n destroyable = true,\n doNotAppend?: boolean\n ) {\n const tab = new ctor(doNotAppend ? undefined : this, destroyable);\n tab.managers = this.managers;\n return tab;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport noop from '../helpers/noop';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport ButtonIcon from './buttonIcon';\nimport Scrollable from './scrollable';\nimport SidebarSlider from './slider';\n\nexport interface SliderSuperTabConstructable {\n new(slider: SidebarSlider, destroyable: boolean): T;\n}\n\nexport interface SliderSuperTabEventableConstructable {\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTabEventable;\n}\n\nexport default class SliderSuperTab {\n public static getInitArgs?(fromTab: SliderSuperTab): any;\n\n public container: HTMLElement;\n\n public header: HTMLElement;\n public closeBtn: HTMLElement;\n public title: HTMLElement;\n\n public content: HTMLElement;\n public scrollable: Scrollable;\n\n public slider: SidebarSlider;\n public destroyable: boolean;\n public listenerSetter: ListenerSetter;\n\n public managers: AppManagers;\n public middlewareHelper: MiddlewareHelper;\n\n constructor(slider: SidebarSlider, destroyable?: boolean) {\n this._constructor(slider, destroyable);\n }\n\n public _constructor(slider: SidebarSlider, destroyable = true): any {\n this.slider = slider;\n this.middlewareHelper = slider ? slider.getMiddleware().create() : getMiddleware();\n this.destroyable = destroyable;\n\n this.container = document.createElement('div');\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\n\n // * Header\n this.header = document.createElement('div');\n this.header.classList.add('sidebar-header');\n\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\n this.title = document.createElement('div');\n this.title.classList.add('sidebar-header__title');\n this.header.append(this.closeBtn, this.title);\n\n // * Content\n this.content = document.createElement('div');\n this.content.classList.add('sidebar-content');\n\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\n this.scrollable.attachBorderListeners(this.container);\n\n this.container.append(this.header, this.content);\n\n this.slider?.addTab(this);\n\n this.listenerSetter = new ListenerSetter();\n }\n\n public close() {\n return this.slider.closeTab(this);\n }\n\n public async open(...args: Parameters) {\n if(this.init) {\n try {\n const result = this.init(...args);\n this.init = null;\n\n if(result instanceof Promise) {\n await result;\n }\n } catch(err) {\n console.error('open tab error', err);\n }\n }\n\n this.slider.selectTab(this);\n }\n\n public init(...args: any[]): Promise | any {\n\n }\n\n protected onOpen() {}\n protected onOpenAfterTimeout() {}\n protected onClose() {}\n\n protected onCloseAfterTimeout() {\n if(this.destroyable) { // ! WARNING, пока что это будет работать только с самой последней внутренней вкладкой !\n this.slider?.deleteTab(this);\n this.container.remove();\n this.scrollable.destroy();\n this.listenerSetter?.removeAll();\n this.middlewareHelper?.destroy();\n }\n }\n\n protected setTitle(key: LangPackKey) {\n this.title.replaceChildren(i18n(key));\n }\n}\n\nexport class SliderSuperTabEventable extends SliderSuperTab {\n public eventListener: EventListenerBase<{\n destroy: () => void | Promise,\n destroyAfter: (promise: Promise) => void,\n close: () => void\n }>;\n\n constructor(slider: SidebarSlider) {\n super(slider);\n this.eventListener = new EventListenerBase();\n }\n\n onClose() {\n this.eventListener.dispatchEvent('close');\n }\n\n onCloseAfterTimeout() {\n const results = this.eventListener.dispatchResultableEvent('destroy');\n this.eventListener.dispatchEvent('destroyAfter', Promise.all(results).then(noop, noop));\n this.eventListener.cleanup();\n return super.onCloseAfterTimeout();\n }\n}\n\n/* // @ts-ignore\ninterface SliderSuperEventsTab extends SliderSuperTab, EventListenerBase<{}> {\n superConstructor: (...args: any[]) => any;\n}\nclass SliderSuperEventsTab implements SliderSuperEventsTab {\n constructor(slider: SidebarSlider) {\n this.superConstructor([slider, true]);\n }\n}\napplyMixins(SliderSuperEventsTab, [SliderSuperTab, EventListenerBase]);\n\n(window as any).lol = SliderSuperEventsTab\n\nexport {SliderSuperEventsTab}; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager, {AppDialogsManager, DialogDom, DialogElementSize} from '../lib/appManagers/appDialogsManager';\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {fastRaf} from '../helpers/schedulers';\nimport SortedList, {SortedElementBase} from '../helpers/sortedList';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport type LazyLoadQueue from './lazyLoadQueue';\n\ninterface SortedUser extends SortedElementBase {\n dom: DialogDom\n}\n\nexport default class SortedUserList extends SortedList {\n protected static SORT_INTERVAL = 30e3;\n public list: HTMLUListElement;\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected avatarSize: DialogElementSize = 'abitbigger';\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0];\n protected onListLengthChange: () => void;\n protected getIndex: (element: SortedUser) => number;\n protected onUpdate: (element: SortedUser) => void;\n protected managers: AppManagers;\n\n constructor(options: Partial<{\n lazyLoadQueue: SortedUserList['lazyLoadQueue'],\n avatarSize: SortedUserList['avatarSize'],\n rippleEnabled: SortedUserList['rippleEnabled'],\n createChatListOptions: SortedUserList['createChatListOptions'],\n autonomous: SortedUserList['autonomous'],\n onListLengthChange: SortedUserList['onListLengthChange'],\n getIndex: SortedUserList['getIndex'],\n onUpdate: SortedUserList['onUpdate']\n }> & {\n managers: SortedUserList['managers']\n }) {\n super({\n getIndex: options.getIndex || ((element) => this.managers.appUsersManager.getUserStatusForSort(element.id)),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onUpdate: options.onUpdate || (async(element) => {\n const status = getUserStatusString(await this.managers.appUsersManager.getUser(element.id));\n replaceContent(element.dom.lastMessageSpan, status);\n }),\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength && this.onListLengthChange) {\n this.onListLengthChange();\n }\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n wrapOptions: {\n lazyLoadQueue: this.lazyLoadQueue\n }\n });\n\n (base as SortedUser).dom = dom;\n return base as SortedUser;\n },\n updateElementWith: fastRaf,\n updateListWith: async(callback) => {\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n await getHeavyAnimationPromise();\n\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n callback(true);\n }\n });\n\n safeAssign(this, options);\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n\n let timeout: number;\n const doTimeout = () => {\n timeout = window.setTimeout(() => {\n this.updateList((good) => {\n if(good) {\n doTimeout();\n }\n });\n }, SortedUserList.SORT_INTERVAL);\n };\n\n doTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {simulateClickEvent, attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport getVisibleRect from '../helpers/dom/getVisibleRect';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {makeMediaSize} from '../helpers/mediaSize';\nimport {getMiddleware, Middleware} from '../helpers/middleware';\nimport {doubleRaf} from '../helpers/schedulers';\nimport pause from '../helpers/schedulers/pause';\nimport windowSize from '../helpers/windowSize';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport getStickerEffectThumb from '../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport {CustomEmojiElement} from '../lib/richTextProcessor/wrapRichText';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport rootScope from '../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from './animationIntersector';\nimport SetTransition from './singleTransition';\nimport wrapSticker from './wrappers/sticker';\nimport {STICKER_EFFECT_MULTIPLIER} from './wrappers/sticker';\n\nlet hasViewer = false;\nexport default function attachStickerViewerListeners({listenTo, listenerSetter, selector, findTarget: originalFindTarget}: {\n listenerSetter: ListenerSetter,\n listenTo: HTMLElement,\n selector?: string,\n findTarget?: (e: MouseEvent) => HTMLElement\n}) {\n if(IS_TOUCH_SUPPORTED) {\n return;\n }\n\n const findTarget = (e: MouseEvent, checkForParent?: boolean) => {\n let el: HTMLElement;\n if(originalFindTarget) el = originalFindTarget(e);\n else {\n const s = selector || `.media-sticker-wrapper`;\n el = (e.target as HTMLElement).closest(s) as HTMLElement;\n }\n\n return el && (!checkForParent || findUpAsChild(el, listenTo)) ? el : undefined;\n };\n\n const managers = rootScope.managers;\n\n listenerSetter.add(listenTo)('mousedown', (e) => {\n if(hasViewer || e.buttons > 1 || e.button !== 0) return;\n let mediaContainer = findTarget(e);\n if(!mediaContainer) {\n return;\n }\n\n // const img: HTMLImageElement = mediaContainer.querySelector('img.media-sticker');\n\n const docId = mediaContainer.dataset.docId;\n if(!docId) {\n return;\n }\n\n const className = 'sticker-viewer';\n const group: AnimationItemGroup = 'STICKER-VIEWER';\n const openDuration = 200;\n const switchDuration = 200;\n const previousGroup = animationIntersector.getOnlyOnePlayableGroup();\n const _middleware = getMiddleware();\n let container: HTMLElement, previousTransformer: HTMLElement;\n\n const doThatSticker = async({mediaContainer, doc, middleware, lockGroups, isSwitching}: {\n mediaContainer: HTMLElement,\n doc: MyDocument,\n middleware: Middleware,\n lockGroups?: boolean,\n isSwitching?: boolean\n }) => {\n const effectThumb = getStickerEffectThumb(doc);\n const mediaRect: DOMRect = mediaContainer.getBoundingClientRect();\n const s = makeMediaSize(doc.w, doc.h);\n const size = effectThumb ? 280 : 360;\n const boxSize = makeMediaSize(size, size);\n const fitted = mediaRect.width === mediaRect.height ? boxSize : s.aspectFitted(boxSize);\n\n const bubble = findUpClassName(mediaContainer, 'bubble');\n const isOut = bubble ? bubble.classList.contains('is-out') : true;\n\n const transformer = document.createElement('div');\n transformer.classList.add(className + '-transformer');\n\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add(className + '-sticker');\n /* transformer.style.width = */stickerContainer.style.width = fitted.width + 'px';\n /* transformer.style.height = */stickerContainer.style.height = fitted.height + 'px';\n\n const stickerEmoji = document.createElement('div');\n stickerEmoji.classList.add(className + '-emoji');\n stickerEmoji.append(wrapEmojiText(doc.stickerEmojiRaw));\n\n if(effectThumb) {\n const margin = (size * STICKER_EFFECT_MULTIPLIER - size) / 3 * (isOut ? 1 : -1);\n transformer.classList.add('has-effect');\n // const property = `--margin-${isOut ? 'right' : 'left'}`;\n // stickerContainer.style.setProperty(property, `${margin * 2}px`);\n transformer.style.setProperty('--translateX', `${margin}px`);\n stickerEmoji.style.setProperty('--translateX', `${-margin}px`);\n }\n\n const overflowElement = findUpClassName(mediaContainer, 'scrollable');\n const visibleRect = getVisibleRect(mediaContainer, overflowElement, true, mediaRect);\n if(visibleRect.overflow.vertical || visibleRect.overflow.horizontal) {\n stickerContainer.classList.add('is-overflow');\n }\n\n // if(img) {\n // const ratio = img.naturalWidth / img.naturalHeight;\n // if((mediaRect.width / mediaRect.height).toFixed(1) !== ratio.toFixed(1)) {\n\n // mediaRect = mediaRect.toJSON();\n // }\n // }\n\n const rect = mediaContainer.getBoundingClientRect();\n const scaleX = rect.width / fitted.width;\n const scaleY = rect.height / fitted.height;\n const transformX = rect.left - (windowSize.width - rect.width) / 2;\n const transformY = rect.top - (windowSize.height - rect.height) / 2;\n transformer.style.transform = `translate(${transformX}px, ${transformY}px) scale(${scaleX}, ${scaleY})`;\n if(isSwitching) transformer.classList.add('is-switching');\n transformer.append(stickerContainer, stickerEmoji);\n container.append(transformer);\n\n const o = await wrapSticker({\n doc,\n div: stickerContainer,\n group,\n width: fitted.width,\n height: fitted.height,\n play: false,\n loop: true,\n middleware,\n managers,\n needFadeIn: false,\n isOut,\n withThumb: false,\n relativeEffect: true,\n loopEffect: true\n }).then(({render}) => render);\n if(!middleware()) return;\n\n if(!container.parentElement) {\n document.body.append(container);\n }\n\n const player = Array.isArray(o) ? o[0] : o;\n\n const firstFramePromise = player instanceof RLottiePlayer ?\n new Promise((resolve) => player.addEventListener('firstFrame', resolve, {once: true})) :\n Promise.resolve();\n await Promise.all([firstFramePromise, doubleRaf()]);\n await pause(0); // ! need it because firstFrame will be called just from the loop\n if(!middleware()) return;\n\n if(lockGroups) {\n animationIntersector.setOnlyOnePlayableGroup(group);\n animationIntersector.checkAnimations2(true);\n }\n\n if(player instanceof RLottiePlayer) {\n const prevPlayer = mediaContainer instanceof CustomEmojiElement ?\n mediaContainer.player as RLottiePlayer :\n lottieLoader.getAnimation(mediaContainer);\n if(prevPlayer) {\n player.curFrame = prevPlayer.curFrame;\n player.play();\n await new Promise((resolve) => {\n let i = 0;\n const c = () => {\n if(++i === 2) {\n resolve();\n player.removeEventListener('enterFrame', c);\n }\n };\n\n player.addEventListener('enterFrame', c);\n });\n if(!middleware()) return;\n player.pause();\n }\n } else if(player instanceof HTMLVideoElement) {\n const prevPlayer = mediaContainer.querySelector('video');\n if(prevPlayer) {\n player.currentTime = prevPlayer.currentTime;\n }\n }\n\n return {\n ready: () => {\n if(player instanceof RLottiePlayer || player instanceof HTMLVideoElement) {\n player.play();\n }\n\n if(effectThumb) {\n simulateClickEvent(stickerContainer);\n }\n },\n transformer\n };\n };\n\n const timeout = window.setTimeout(async() => {\n document.removeEventListener('mousemove', onMousePreMove);\n\n container = document.createElement('div');\n container.classList.add(className);\n hasViewer = true;\n\n const middleware = _middleware.get();\n const doc = await managers.appDocsManager.getDoc(docId);\n if(!middleware()) return;\n\n let result: Awaited>;\n try {\n result = await doThatSticker({\n doc,\n mediaContainer,\n middleware,\n lockGroups: true\n });\n if(!result) return;\n } catch(err) {\n return;\n }\n\n const {ready, transformer} = result;\n\n previousTransformer = transformer;\n\n SetTransition({\n element: container,\n className: 'is-visible',\n forwards: true,\n duration: openDuration,\n onTransitionEnd: () => {\n if(!middleware()) return;\n ready();\n }\n });\n\n document.addEventListener('mousemove', onMouseMove);\n }, 125);\n\n const onMouseMove = async(e: MouseEvent) => {\n const newMediaContainer = findTarget(e, true);\n if(!newMediaContainer || mediaContainer === newMediaContainer) {\n return;\n }\n\n const docId = newMediaContainer.dataset.docId;\n if(!docId) {\n return;\n }\n\n mediaContainer = newMediaContainer;\n _middleware.clean();\n const middleware = _middleware.get();\n\n const doc = await managers.appDocsManager.getDoc(docId);\n if(!middleware()) return;\n\n let r: Awaited>;\n try {\n r = await doThatSticker({\n doc,\n mediaContainer,\n middleware,\n isSwitching: true\n });\n if(!r) return;\n } catch(err) {\n console.error('sticker viewer error', err);\n return;\n }\n\n const {ready, transformer} = r;\n\n const _previousTransformer = previousTransformer;\n SetTransition({\n element: _previousTransformer,\n className: 'is-switching',\n forwards: true,\n duration: switchDuration,\n onTransitionEnd: () => {\n _previousTransformer.remove();\n }\n });\n\n previousTransformer = transformer;\n\n SetTransition({\n element: transformer,\n className: 'is-switching',\n forwards: false,\n duration: switchDuration,\n onTransitionEnd: () => {\n if(!middleware()) return;\n ready();\n }\n });\n };\n\n const onMousePreMove = (e: MouseEvent) => {\n if(!findUpAsChild(e.target as HTMLElement, mediaContainer)) {\n onMouseUp();\n }\n };\n\n const onMouseUp = () => {\n clearTimeout(timeout);\n _middleware.clean();\n\n if(container) {\n SetTransition({\n element: container,\n className: 'is-visible',\n forwards: false,\n duration: openDuration,\n onTransitionEnd: () => {\n container.remove();\n animationIntersector.setOnlyOnePlayableGroup(previousGroup);\n animationIntersector.checkAnimations2(false);\n hasViewer = false;\n }\n });\n\n attachClickEvent(document.body, cancelEvent, {capture: true, once: true});\n }\n\n document.removeEventListener('mousemove', onMousePreMove);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp, {capture: true});\n };\n\n document.addEventListener('mousemove', onMousePreMove);\n document.addEventListener('mouseup', onMouseUp, {once: true, capture: true});\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class StickyIntersector {\n private headersObserver: IntersectionObserver;\n private elementsObserver: IntersectionObserver;\n\n constructor(private container: HTMLElement, private handler: (stuck: boolean, target: HTMLElement) => void) {\n this.observeHeaders();\n this.observeElements();\n }\n\n /**\n * Sets up an intersection observer to notify when elements with the class\n * `.sticky_sentinel--top` become visible/invisible at the top of the container.\n * @param {!Element} container\n */\n private observeHeaders() {\n this.headersObserver = new IntersectionObserver((entries) => {\n for(const entry of entries) {\n const targetInfo = entry.boundingClientRect;\n const stickyTarget = entry.target.parentElement;\n const rootBoundsInfo = entry.rootBounds;\n\n // Started sticking.\n if(targetInfo.bottom < rootBoundsInfo.top) {\n this.handler(true, stickyTarget);\n }\n\n // Stopped sticking.\n if(targetInfo.bottom >= rootBoundsInfo.top &&\n targetInfo.bottom < rootBoundsInfo.bottom) {\n this.handler(false, stickyTarget);\n }\n }\n }, {threshold: 0, root: this.container});\n }\n\n private observeElements() {\n this.elementsObserver = new IntersectionObserver((entries) => {\n const entry = entries\n .filter((entry) => entry.boundingClientRect.top < entry.rootBounds.top)\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\n if(!entry) return;\n\n const container = entry.isIntersecting ? entry.target : entry.target.nextElementSibling;\n this.handler(true, container as HTMLElement);\n }, {root: this.container});\n }\n\n /**\n * @param {!Element} container\n * @param {string} className\n */\n private addSentinel(container: HTMLElement, className: string) {\n const sentinel = document.createElement('div');\n sentinel.classList.add('sticky_sentinel', className);\n return container.appendChild(sentinel);\n }\n\n /**\n * Notifies when elements w/ the `sticky` class begin to stick or stop sticking.\n * Note: the elements should be children of `container`.\n * @param {!Element} container\n */\n public observeStickyHeaderChanges(element: HTMLElement) {\n const headerSentinel = this.addSentinel(element, 'sticky_sentinel--top');\n this.headersObserver.observe(headerSentinel);\n\n this.elementsObserver.observe(element);\n }\n\n public disconnect() {\n this.headersObserver.disconnect();\n this.elementsObserver.disconnect();\n }\n\n public unobserve(element: HTMLElement, headerSentinel: HTMLElement) {\n this.elementsObserver.unobserve(element);\n this.headersObserver.unobserve(headerSentinel);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport safeAssign from '../helpers/object/safeAssign';\nimport contextMenuController from '../helpers/contextMenuController';\nimport {Middleware} from '../helpers/middleware';\nimport ListenerSetter, {Listener, ListenerOptions} from '../helpers/listenerSetter';\nimport {attachContextMenuListener} from '../helpers/dom/attachContextMenuListener';\nimport pause from '../helpers/schedulers/pause';\nimport deferredPromise from '../helpers/cancellablePromise';\n\ntype E = {\n clientX: number,\n clientY: number,\n target: EventTarget,\n button?: number\n};\n\ntype EE = E | (Exclude & {\n touches: E[]\n});\n\nconst getEvent = (e: EE) => {\n return 'touches' in e ? e.touches[0] : e;\n};\n\nconst attachGlobalListenerTo = document;\n\nlet RESET_GLOBAL = false;\ncontextMenuController.addEventListener('toggle', (visible) => {\n RESET_GLOBAL = visible;\n});\n\nexport type SwipeHandlerOptions = {\n element: SwipeHandler['element'],\n onSwipe: SwipeHandler['onSwipe'],\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\n onReset?: SwipeHandler['onReset'],\n onStart?: SwipeHandler['onStart'],\n cursor?: SwipeHandler['cursor'],\n cancelEvent?: SwipeHandler['cancelEvent'],\n listenerOptions?: SwipeHandler['listenerOptions'],\n setCursorTo?: HTMLElement,\n middleware?: Middleware,\n withDelay?: boolean\n};\n\nconst TOUCH_MOVE_OPTIONS: ListenerOptions = {passive: false};\nconst MOUSE_MOVE_OPTIONS: ListenerOptions = false as any;\n\nexport default class SwipeHandler {\n private element: HTMLElement;\n private onSwipe: (xDiff: number, yDiff: number, e: EE) => boolean | void;\n private verifyTouchTarget: (evt: EE) => boolean | Promise;\n private onFirstSwipe: (e: EE) => void;\n private onReset: () => void;\n private onStart: () => void;\n private cursor: 'grabbing' | 'move' | 'row-resize' | 'col-resize' | 'nesw-resize' | 'nwse-resize' | 'ne-resize' | 'se-resize' | 'sw-resize' | 'nw-resize' | 'n-resize' | 'e-resize' | 's-resize' | 'w-resize' | '';\n private cancelEvent: boolean;\n private listenerOptions: ListenerOptions;\n private setCursorTo: HTMLElement;\n\n private isMouseDown: boolean;\n private tempId: number;\n\n private hadMove: boolean;\n private eventUp: E;\n private xDown: number;\n private yDown: number;\n private xAdded: number;\n private yAdded: number;\n\n private withDelay: boolean;\n private listenerSetter: ListenerSetter;\n\n constructor(options: SwipeHandlerOptions) {\n safeAssign(this, options);\n\n this.cursor ??= 'grabbing';\n this.cancelEvent ??= true;\n // this.listenerOptions ??= false as any;\n this.listenerOptions ??= TOUCH_MOVE_OPTIONS;\n\n this.setCursorTo ??= this.element;\n this.listenerSetter = new ListenerSetter();\n this.setListeners();\n\n this.resetValues();\n this.tempId = 0;\n\n options.middleware?.onDestroy(() => {\n this.reset();\n this.removeListeners();\n });\n }\n\n public setListeners() {\n if(!IS_TOUCH_SUPPORTED) {\n // @ts-ignore\n this.listenerSetter.add(this.element)('mousedown', this.handleStart, this.listenerOptions);\n this.listenerSetter.add(attachGlobalListenerTo)('mouseup', this.reset);\n } else {\n if(this.withDelay) {\n attachContextMenuListener({\n element: this.element,\n callback: (e) => {\n cancelEvent(e);\n // @ts-ignore\n this.handleStart(e);\n },\n listenerSetter: this.listenerSetter,\n listenerOptions: this.listenerOptions\n });\n } else {\n // @ts-ignore\n this.listenerSetter.add(this.element)('touchstart', this.handleStart, this.listenerOptions);\n }\n\n this.listenerSetter.add(attachGlobalListenerTo)('touchend', this.reset);\n }\n }\n\n public removeListeners() {\n this.listenerSetter.removeAll();\n }\n\n public setCursor(cursor: SwipeHandler['cursor'] = '') {\n this.cursor = cursor;\n\n if(!IS_TOUCH_SUPPORTED && this.hadMove) {\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\n }\n }\n\n public add(x: number, y: number) {\n this.xAdded = x;\n this.yAdded = y;\n this.handleMove({\n clientX: this.eventUp.clientX,\n clientY: this.eventUp.clientY,\n target: this.eventUp.target\n });\n }\n\n protected resetValues() {\n ++this.tempId;\n this.hadMove = false;\n this.xAdded = this.yAdded = 0;\n this.xDown =\n this.yDown =\n this.eventUp =\n this.isMouseDown =\n undefined;\n }\n\n protected reset = (e?: Event) => {\n /* if(e) {\n cancelEvent(e);\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n this.listenerSetter.removeManual(attachGlobalListenerTo, 'touchmove', this.handleMove, TOUCH_MOVE_OPTIONS);\n } else {\n this.listenerSetter.removeManual(attachGlobalListenerTo, 'mousemove', this.handleMove, MOUSE_MOVE_OPTIONS);\n this.setCursorTo.style.cursor = '';\n }\n\n if(this.hadMove) {\n this.onReset?.();\n }\n\n this.resetValues();\n };\n\n protected handleStart = async(_e: EE) => {\n if(this.isMouseDown) {\n return;\n }\n\n const e = getEvent(_e);\n if(Math.max(0, e.button ?? 0) !== 0) {\n return;\n }\n\n if(this.verifyTouchTarget && !(await this.verifyTouchTarget(_e))) {\n return this.reset();\n }\n\n const tempId = ++this.tempId;\n this.isMouseDown = true;\n\n if(this.withDelay && !IS_TOUCH_SUPPORTED) {\n const options = {...MOUSE_MOVE_OPTIONS, once: true};\n const deferred = deferredPromise();\n const cb = () => deferred.resolve();\n const listener = this.listenerSetter.add(attachGlobalListenerTo)('mousemove', cb, options) as any as Listener;\n\n await Promise.race([\n pause(300),\n deferred\n ]);\n\n deferred.resolve();\n this.listenerSetter.remove(listener);\n\n if(this.tempId !== tempId) {\n return;\n }\n }\n\n this.xDown = e.clientX;\n this.yDown = e.clientY;\n this.eventUp = e;\n\n if(IS_TOUCH_SUPPORTED) {\n // @ts-ignore\n this.listenerSetter.add(attachGlobalListenerTo)('touchmove', this.handleMove, TOUCH_MOVE_OPTIONS);\n } else {\n // @ts-ignore\n this.listenerSetter.add(attachGlobalListenerTo)('mousemove', this.handleMove, MOUSE_MOVE_OPTIONS);\n }\n\n if(this.onStart) {\n this.onStart();\n\n // have to initiate move instantly\n this.hadMove = true;\n this.handleMove(e);\n }\n };\n\n protected handleMove = (_e: EE) => {\n if(this.xDown === undefined || this.yDown === undefined || RESET_GLOBAL) {\n this.reset();\n return;\n }\n\n if(this.cancelEvent) {\n cancelEvent(_e as any);\n }\n\n const e = this.eventUp = getEvent(_e);\n const xUp = e.clientX;\n const yUp = e.clientY;\n\n const xDiff = xUp - this.xDown + this.xAdded;\n const yDiff = yUp - this.yDown + this.yAdded;\n\n if(!this.hadMove) {\n if(!xDiff && !yDiff) {\n return;\n }\n\n this.hadMove = true;\n\n if(!IS_TOUCH_SUPPORTED) {\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\n }\n\n this.onFirstSwipe?.(_e);\n }\n\n const onSwipeResult = this.onSwipe(xDiff, yDiff, _e);\n if(onSwipeResult !== undefined && onSwipeResult) {\n this.reset();\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\nimport {formatPhoneNumber} from '../helpers/formatPhoneNumber';\nimport {IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE} from '../environment/userAgent';\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport InputField, {InputFieldOptions} from './inputField';\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n\n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n // plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n const telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n // console.log('input', this.value);\n telEl.classList.remove('error');\n\n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n\n this.pasted = false;\n\n this.setLabel();\n\n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n\n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n\n // console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n\n telEl.addEventListener('paste', () => {\n this.pasted = true;\n // console.log('paste', telEl.value);\n });\n\n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n\n telEl.addEventListener('keypress', (e) => {\n // console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../helpers/dom/replaceContent';\nimport OverlayClickHandler from '../helpers/overlayClickHandler';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\n\nconst toastEl = document.createElement('div');\ntoastEl.classList.add('toast');\nlet timeout: number;\n\nconst x = new OverlayClickHandler('toast');\nx.addEventListener('toggle', (open) => {\n if(!open) {\n hideToast();\n }\n});\n\nexport function hideToast() {\n x.close();\n\n toastEl.classList.remove('is-visible');\n timeout && clearTimeout(+timeout);\n\n timeout = window.setTimeout(() => {\n toastEl.remove();\n timeout = undefined;\n }, 200);\n}\n\nexport function toast(content: string | Node, onClose?: () => void) {\n x.close();\n\n replaceContent(toastEl, content);\n\n if(!toastEl.parentElement) {\n document.body.append(toastEl);\n void toastEl.offsetLeft; // reflow\n }\n\n toastEl.classList.add('is-visible');\n\n timeout && clearTimeout(+timeout);\n x.open(toastEl);\n\n timeout = window.setTimeout(hideToast, 3000);\n\n if(onClose) {\n x.addEventListener('toggle', onClose, {once: true});\n }\n}\n\nexport function toastNew(options: Partial<{\n langPackKey: LangPackKey,\n langPackArguments: FormatterArguments,\n onClose: () => void\n}>) {\n toast(i18n(options.langPackKey, options.langPackArguments), options.onClose);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\nimport whichChild from '../helpers/dom/whichChild';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\n\nfunction makeTransitionFunction(options: TransitionFunction) {\n return options;\n}\n\nconst slideNavigation = makeTransitionFunction({\n callback: (tabContent, prevTabContent, toRight) => {\n const width = prevTabContent.getBoundingClientRect().width;\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.filter = `brightness(80%)`;\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n tabContent.style.filter = '';\n\n return () => {\n prevTabContent.style.transform = prevTabContent.style.filter = '';\n };\n },\n animateFirst: false\n});\n\nconst slideTabs = makeTransitionFunction({\n callback: (tabContent, prevTabContent, toRight) => {\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\n // scrollableContainer.style.overflowY = 'hidden';\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\n // // this.container.classList.add('sliding');\n // }\n\n // window.requestAnimationFrame(() => {\n const width = prevTabContent.getBoundingClientRect().width;\n /* tabContent.style.setProperty('--width', width + 'px');\n prevTabContent.style.setProperty('--width', width + 'px');\n\n tabContent.classList.add('active'); */\n // void tabContent.offsetWidth; // reflow\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n // });\n\n return () => {\n prevTabContent.style.transform = '';\n\n // if(scrollableContainer) {\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\n // scrollableContainer.style.display = 'none';\n // }\n\n // scrollableContainer.style.overflowY = '';\n\n // if(isSafari) {\n // void scrollableContainer.offsetLeft; // reflow\n // scrollableContainer.style.display = '';\n // }\n\n // // scrollableContainer.style.paddingRight = '0';\n // // this.container.classList.remove('sliding');\n // }\n };\n },\n animateFirst: false\n});\n\nconst slideTopics = makeTransitionFunction({\n callback: (tabContent, prevTabContent) => {\n const rect = tabContent.getBoundingClientRect();\n const offsetX = rect.width - 80;\n\n tabContent.style.transform = `transformX(${offsetX}px)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n\n return () => {};\n },\n animateFirst: true\n});\n\nconst transitions: {[type in TransitionSliderType]?: TransitionFunction} = {\n navigation: slideNavigation,\n tabs: slideTabs\n // topics: slideTopics\n};\n\ntype TransitionSliderType = 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'topics' | 'none'/* | 'counter' */;\n\ntype TransitionSliderOptions = {\n content: HTMLElement,\n type: TransitionSliderType,\n transitionTime: number,\n onTransitionEnd?: (id: number) => void,\n isHeavy?: boolean,\n once?: boolean,\n withAnimationListener?: boolean,\n listenerSetter?: ListenerSetter,\n animateFirst?: boolean\n};\n\ntype TransitionFunction = {\n callback: (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => () => void,\n animateFirst: boolean\n};\n\nconst TransitionSlider = (options: TransitionSliderOptions) => {\n let {\n content,\n type,\n transitionTime,\n onTransitionEnd,\n isHeavy = true,\n once = false,\n withAnimationListener = true,\n listenerSetter,\n animateFirst = false\n } = options;\n\n const {callback: animationFunction, animateFirst: _animateFirst} = transitions[type] || {};\n content.dataset.animation = type;\n\n if(_animateFirst !== undefined) {\n animateFirst = _animateFirst;\n }\n\n const onTransitionEndCallbacks: Map = new Map();\n let animationDeferred: CancellablePromise;\n // let animationStarted = 0;\n let from: HTMLElement = null;\n\n if(withAnimationListener) {\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\n\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\n cancelEvent(e);\n\n if((e.target as HTMLElement).parentElement !== content) {\n return;\n }\n\n // console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\n\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\n callback?.();\n\n if(e.target !== from) {\n return;\n }\n\n if(!animationDeferred && isHeavy) return;\n\n if(animationDeferred) {\n animationDeferred.resolve();\n animationDeferred = undefined;\n }\n\n onTransitionEnd?.(selectTab.prevId());\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n if(once) {\n if(listenerSetter) listenerSetter.removeManual(content, listenerName, onEndEvent);\n else content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\n from = animationDeferred = undefined;\n onTransitionEndCallbacks.clear();\n }\n };\n\n // TODO: check for transition type (transform, etc) using by animationFunction\n if(listenerSetter) listenerSetter.add(content)(listenerName, onEndEvent);\n else content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\n }\n\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\n if(overrideFrom) {\n from = overrideFrom;\n }\n\n if(id instanceof HTMLElement) {\n id = whichChild(id);\n }\n\n const prevId = selectTab.prevId();\n if(id === prevId) return false;\n\n // console.log('selectTab id:', id);\n\n const to = content.children[id] as HTMLElement;\n\n if(!rootScope.settings.animationsEnabled || (prevId === -1 && !animateFirst)) {\n animate = false;\n }\n\n if(!withAnimationListener) {\n const timeout = content.dataset.timeout;\n if(timeout !== undefined) {\n clearTimeout(+timeout);\n }\n\n delete content.dataset.timeout;\n }\n\n if(!animate) {\n if(from) from.classList.remove('active', 'to', 'from');\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\n const callback = onTransitionEndCallbacks.get(to);\n callback?.();\n }\n\n if(to) {\n to.classList.remove('to', 'from');\n to.classList.add('active');\n }\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n from = to;\n\n onTransitionEnd?.(id);\n return;\n }\n\n if(!withAnimationListener) {\n content.dataset.timeout = '' + window.setTimeout(() => {\n to.classList.remove('to');\n from && from.classList.remove('from');\n content.classList.remove('animating', 'backwards', 'disable-hover');\n delete content.dataset.timeout;\n }, transitionTime);\n }\n\n if(from) {\n from.classList.remove('to');\n from.classList.add('from');\n }\n\n content.classList.add('animating'/* , 'disable-hover' */);\n const toRight = prevId < id;\n content.classList.toggle('backwards', !toRight);\n\n let onTransitionEndCallback: ReturnType;\n if(!to) {\n // prevTabContent.classList.remove('active');\n } else {\n if(animationFunction) {\n onTransitionEndCallback = animationFunction(to, from, toRight);\n } else {\n to.classList.add('active');\n }\n\n to.classList.remove('from');\n to.classList.add('to');\n }\n\n if(to) {\n const transitionTimeout = to.dataset.transitionTimeout;\n if(transitionTimeout) {\n clearTimeout(+transitionTimeout);\n }\n\n onTransitionEndCallbacks.set(to, () => {\n to.classList.remove('to');\n onTransitionEndCallbacks.delete(to);\n });\n }\n\n if(from/* && false */) {\n let timeout: number;\n const _from = from;\n const callback = () => {\n clearTimeout(timeout);\n _from.classList.remove('active', 'from');\n\n onTransitionEndCallback?.();\n\n onTransitionEndCallbacks.delete(_from);\n };\n\n if(to) {\n timeout = window.setTimeout(callback, transitionTime + 100); // something happened to container\n onTransitionEndCallbacks.set(_from, callback);\n } else {\n timeout = window.setTimeout(callback, transitionTime);\n onTransitionEndCallbacks.set(_from, () => {\n clearTimeout(timeout);\n onTransitionEndCallbacks.delete(_from);\n });\n }\n\n _from.dataset.transitionTimeout = '' + timeout;\n\n if(isHeavy) {\n if(!animationDeferred) {\n animationDeferred = deferredPromise();\n // animationStarted = performance.now();\n }\n\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\n }\n }\n\n from = to;\n }\n\n // selectTab.prevId = -1;\n selectTab.prevId = () => from ? whichChild(from) : -1;\n selectTab.getFrom = () => from;\n selectTab.setFrom = (_from: HTMLElement) => from = _from;\n\n return selectTab;\n};\n\nexport default TransitionSlider;\n","export default function isUsernameValid(username: string) {\n return ((username.length >= 3 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ListenerSetter from '../helpers/listenerSetter';\nimport debounce from '../helpers/schedulers/debounce';\nimport {LangPackKey} from '../lib/langPack';\nimport InputField, {InputFieldOptions, InputState} from './inputField';\nimport isUsernameValid from '../lib/richTextProcessor/isUsernameValid';\nimport {AppManagers} from '../lib/appManagers/managers';\n\nexport class UsernameInputField extends InputField {\n private checkUsernamePromise: Promise;\n private checkUsernameDebounced: (username: string) => void;\n public options: InputFieldOptions & {\n peerId?: PeerId,\n listenerSetter: ListenerSetter,\n onChange?: () => void,\n invalidText: LangPackKey,\n takenText: LangPackKey,\n availableText: LangPackKey,\n head?: string\n };\n public error: ApiError;\n\n constructor(\n options: UsernameInputField['options'],\n private managers: AppManagers\n ) {\n super(options);\n\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\n\n options.listenerSetter.add(this.input)('input', () => {\n const value = this.getValue();\n\n this.error = undefined;\n if(value === this.originalValue || !value.length) {\n this.setState(InputState.Neutral);\n this.options.onChange?.();\n return;\n } else if(!isUsernameValid(value)) { // does not check the last underscore\n this.setError(this.options.invalidText);\n } else {\n this.setState(InputState.Neutral);\n }\n\n if(this.input.classList.contains('error')) {\n this.options.onChange?.();\n return;\n }\n\n this.checkUsernameDebounced(value);\n });\n }\n\n public getValue() {\n let value = this.value;\n if(this.options.head) {\n value = value.slice(this.options.head.length);\n this.setValueSilently(this.options.head + value);\n }\n\n return value;\n }\n\n private checkUsername(username: string) {\n if(this.checkUsernamePromise) return;\n\n this.error = undefined;\n let checkPromise: Promise\n if(this.options.peerId) {\n checkPromise = this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(), username);\n } else {\n checkPromise = this.managers.appUsersManager.checkUsername(username);\n }\n\n const promise = this.checkUsernamePromise = checkPromise.then((available) => {\n if(this.getValue() !== username) return;\n\n if(available) {\n this.setState(InputState.Valid, this.options.availableText);\n } else {\n this.setError(this.options.takenText);\n }\n }, (err) => {\n if(this.getValue() !== username) return;\n\n this.error = err;\n switch((err as ApiError).type) {\n case 'USERNAME_PURCHASE_AVAILABLE': {\n this.setError(this.options.takenText);\n break;\n }\n\n case 'USERNAME_INVALID':\n default: {\n this.setError(this.options.invalidText);\n break;\n }\n }\n }).then(() => {\n if(this.checkUsernamePromise === promise) {\n this.checkUsernamePromise = undefined;\n }\n\n this.options.onChange?.();\n\n const value = this.getValue();\n if(value !== username && this.isValidToChange() && isUsernameValid(value)) {\n this.checkUsername(value);\n }\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport Sortable from '../helpers/dom/sortable';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {Middleware} from '../helpers/middleware';\nimport noop from '../helpers/noop';\nimport SortedList, {SortedElementBase} from '../helpers/sortedList';\nimport {Chat, User, Username} from '../layer';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport confirmationPopup from './confirmationPopup';\nimport Row from './row';\nimport SettingSection from './settingSection';\nimport {UsernameInputField} from './usernameInputField';\n\nexport default class UsernamesSection extends SettingSection {\n // public section: SettingSection;\n\n constructor(options: {\n peerId: PeerId,\n peer: Chat.channel | User.user,\n listenerSetter: ListenerSetter,\n usernameInputField: UsernameInputField,\n middleware: Middleware\n }) {\n /* const section = this.section = new SettingSection */super({\n name: 'UsernamesProfileHeader',\n caption: !options.peerId.isUser() ? 'UsernamesChannelHelp' : 'UsernamesProfileHelp'\n });\n\n const {peerId, peer, usernameInputField, listenerSetter, middleware} = options;\n const managers = rootScope.managers;\n const channelId = peerId.isUser() ? undefined : peerId.toChatId();\n\n const section = this;\n\n const CLASS_NAME = 'usernames';\n const list = document.createElement('div');\n list.classList.add(CLASS_NAME);\n\n let _usernames: Username[];\n\n interface SortedUsername extends SortedElementBase {\n row: Row\n }\n\n const sortedList = new SortedList({\n getIndex: (element) => _usernames.length - _usernames.findIndex((username) => username.username === element.id),\n onDelete: (element) => {\n element.row.container.remove();\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.row.container, list, idx);\n },\n onElementCreate: (base) => {\n const username = _usernames.find((username) => username.username === base.id);\n const row = new Row({\n title: '@' + username.username,\n subtitle: true,\n clickable: true\n });\n\n const editable = !!username.pFlags.editable;\n const active = !!username.pFlags.active;\n\n if(editable) row.container.dataset.editable = '1';\n row.container.dataset.username = username.username;\n row.container.classList.add(CLASS_NAME + '-username');\n row.subtitle.classList.add(CLASS_NAME + '-username-status');\n const media = row.createMedia('medium');\n media.classList.add(CLASS_NAME + '-username-icon', 'tgico');\n\n row.makeSortable();\n\n changeActive(row, active);\n\n (base as SortedUsername).row = row;\n\n return base as SortedUsername;\n }\n });\n\n const changeActive = (row: Row, active: boolean) => {\n row.subtitle.replaceChildren(i18n(row.container.dataset.editable ? 'UsernameLinkEditable' : (active ? 'UsernameLinkActive' : 'UsernameLinkInactive')));\n row.container.classList.toggle('active', active);\n row.toggleSorting(active);\n };\n\n const applyUsernames = (usernames: Username[] = []) => {\n _usernames = usernames;\n\n sortedList.getAll().forEach((element) => {\n if(!usernames.some((username) => username.username === element.id)) {\n sortedList.delete(element.id);\n }\n });\n\n usernames.forEach((username) => {\n if(!sortedList.has(username.username)) {\n sortedList.add(username.username);\n } else {\n const element = sortedList.get(username.username);\n sortedList.update(username.username, element);\n changeActive(element.row, !!username.pFlags.active);\n }\n });\n\n section.container.classList.toggle('hide', !sortedList.getAll().size);\n };\n\n applyUsernames(peer.usernames);\n\n listenerSetter.add(rootScope)('peer_title_edit', async({peerId: _peerId}) => {\n if(_peerId !== peerId) {\n return;\n }\n\n const peer = await managers.appPeersManager.getPeer(peerId);\n applyUsernames((peer as User.user).usernames);\n });\n\n let cancelClick = false;\n attachClickEvent(list, async(e) => {\n if(cancelClick) {\n cancelClick = false;\n return;\n }\n\n const container = findUpAsChild(e.target as HTMLElement, list);\n if(!container) {\n return;\n }\n\n if(container.dataset.editable) {\n placeCaretAtEnd(usernameInputField.input, true, true);\n return;\n }\n\n const username = container.dataset.username;\n\n const active = container.classList.contains('active');\n let titleLangKey: LangPackKey, descriptionLangKey: LangPackKey;\n if(active) {\n titleLangKey = 'UsernameDeactivateLink';\n descriptionLangKey = channelId ? 'UsernameDeactivateLinkChannelMessage' : 'UsernameDeactivateLinkProfileMessage';\n } else {\n titleLangKey = 'UsernameActivateLink';\n descriptionLangKey = channelId ? 'UsernameActivateLinkChannelMessage' : 'UsernameActivateLinkProfileMessage';\n }\n\n try {\n await confirmationPopup({\n titleLangKey,\n descriptionLangKey,\n button: {\n langKey: active ? 'Hide' : 'Show'\n }\n });\n } catch(err) {\n return;\n }\n\n const newActive = !active;\n let promise: Promise;\n if(channelId) {\n promise = managers.appChatsManager.toggleUsername(channelId, username, newActive);\n } else {\n promise = managers.appUsersManager.toggleUsername(username, newActive);\n }\n\n promise.catch((err: ApiError) => {\n if(err.type === 'USERNAMES_ACTIVE_TOO_MUCH') {\n confirmationPopup({\n titleLangKey: 'UsernameActivateErrorTitle',\n descriptionLangKey: 'UsernameActivateErrorMessage',\n button: {langKey: 'OK', isCancel: true}\n }).catch(noop);\n } else {\n console.error('turn username error', err);\n }\n });\n });\n\n new Sortable({\n list,\n middleware,\n onSort: (idx, newIdx) => {\n const username = _usernames.splice(idx, 1)[0];\n _usernames.splice(newIdx, 0, username);\n sortedList.updateList();\n // can't just update particular element, have to change indexes\n // sortedList.update(username.username);\n\n const usernames = _usernames.filter((username) => username.pFlags.active).map((username) => username.username);\n if(channelId) {\n managers.appChatsManager.reorderUsernames(channelId, usernames);\n } else {\n managers.appUsersManager.reorderUsernames(usernames);\n }\n }\n });\n\n section.content.append(list);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\ntype TargetType = HTMLElement;\nexport type OnVisibilityChangeItem = {target: TargetType, visible: boolean, entry: IntersectionObserverEntry, index: number};\nexport type OnVisibilityChange = (item: OnVisibilityChangeItem) => void;\n\nexport default class VisibilityIntersector {\n private observer: IntersectionObserver;\n private items: Map = new Map();\n private locked = false;\n\n constructor(onVisibilityChange: OnVisibilityChange, options?: IntersectionObserverInit) {\n this.observer = new IntersectionObserver((entries) => {\n if(this.locked) {\n return;\n }\n\n const changed: OnVisibilityChangeItem[] = [];\n\n entries.forEach((entry, index) => {\n const target = entry.target as TargetType;\n\n if(this.items.get(target) === entry.isIntersecting) {\n return;\n } else {\n this.items.set(target, entry.isIntersecting);\n }\n\n /* if(entry.isIntersecting) {\n console.log('ooo', entry);\n } */\n\n /* if(this.locked) {\n return;\n } */\n\n const change: typeof changed[0] = {target, visible: entry.isIntersecting, entry, index};\n\n // ! order will be incorrect so can't use it\n // changed[entry.isIntersecting ? 'unshift' : 'push'](change);\n changed.push(change);\n\n // onVisibilityChange(target, entry.isIntersecting);\n });\n\n changed.forEach((item) => {\n onVisibilityChange(item);\n });\n }, options);\n }\n\n public getVisible() {\n const items: TargetType[] = [];\n this.items.forEach((value, key) => {\n if(value) {\n items.push(key);\n }\n });\n\n return items;\n }\n\n public clearVisible() {\n const visible = this.getVisible();\n for(const target of visible) {\n this.items.set(target, false);\n }\n }\n\n public isVisible(target: TargetType) {\n return this.items.get(target);\n }\n\n public disconnect() {\n this.observer.disconnect();\n this.items.clear();\n }\n\n public refresh() {\n this.observer.disconnect();\n\n // window.requestAnimationFrame(() => {\n const targets = [...this.items.keys()];\n for(const target of targets) {\n // this.items.set(target, false);\n this.observer.observe(target);\n }\n // });\n }\n\n public refreshVisible() {\n const visible = this.getVisible();\n for(const target of visible) {\n this.observer.unobserve(target);\n }\n\n for(const target of visible) {\n this.observer.observe(target);\n }\n }\n\n public observe(target: TargetType) {\n this.items.set(target, false);\n this.observer.observe(target);\n }\n\n public unobserve(target: TargetType) {\n this.observer.unobserve(target);\n this.items.delete(target);\n }\n\n public unlock() {\n this.locked = false;\n }\n\n public unlockAndRefresh() {\n this.unlock();\n this.refresh();\n }\n\n public lock() {\n this.locked = true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport rootScope from '../lib/rootScope';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport RangeSelector from './rangeSelector';\n\nexport default class VolumeSelector extends RangeSelector {\n private static ICONS = ['volume_off', 'volume_mute', 'volume_down', 'volume_up'];\n public btn: HTMLElement;\n protected icon: HTMLSpanElement;\n\n constructor(protected listenerSetter: ListenerSetter, protected vertical = false) {\n super({\n step: 0.01,\n min: 0,\n max: 1,\n vertical\n }, 1);\n\n this.setListeners();\n this.setHandlers({\n onScrub: currentTime => {\n const value = Math.max(Math.min(currentTime, 1), 0);\n\n // console.log('volume scrub:', currentTime, value);\n\n appMediaPlaybackController.muted = false;\n appMediaPlaybackController.volume = value;\n }\n\n /* onMouseUp: (e) => {\n cancelEvent(e.event);\n } */\n });\n\n const className = 'player-volume';\n const btn = this.btn = document.createElement('div');\n btn.classList.add('btn-icon', className);\n const icon = this.icon = document.createElement('span');\n icon.classList.add(className + '__icon');\n\n btn.append(icon, this.container);\n\n attachClickEvent(icon, this.onMuteClick, {listenerSetter: this.listenerSetter});\n this.listenerSetter.add(appMediaPlaybackController)('playbackParams', this.setVolume);\n\n this.setVolume();\n }\n\n private onMuteClick = (e?: Event) => {\n e && cancelEvent(e);\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n };\n\n public setVolume = () => {\n // const volume = video.volume;\n const {volume, muted} = appMediaPlaybackController;\n let d: string;\n let iconIndex: number;\n if(!volume || muted) {\n iconIndex = 0;\n } else if(volume > .5) {\n iconIndex = 3;\n } else if(volume > 0 && volume < .25) {\n iconIndex = 1;\n } else {\n iconIndex = 2;\n }\n\n VolumeSelector.ICONS.forEach((icon) => this.icon.classList.remove('tgico-' + icon));\n this.icon.classList.add('tgico-' + VolumeSelector.ICONS[iconIndex]);\n\n if(!this.mousedown) {\n this.setProgress(muted ? 0 : volume);\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapCustomEmoji({\n docIds,\n loadPromises,\n middleware,\n lazyLoadQueue,\n customEmojiSize,\n animationGroup\n}: {\n docIds: DocId[],\n loadPromises?: Promise[]\n} & WrapSomethingOptions) {\n const text = ' '.repeat(docIds.length);\n const entities: MessageEntity[] = [];\n docIds.forEach((docId, idx) => {\n entities.push({\n _: 'messageEntityCustomEmoji',\n offset: idx,\n length: 1,\n document_id: docId\n });\n });\n\n const wrapped = wrapRichText(text, {\n entities,\n loadPromises,\n animationGroup,\n customEmojiSize,\n middleware,\n lazyLoadQueue\n });\n\n return wrapped;\n}\n\nexport function wrapCustomEmojiAwaited(options: Parameters[0]) {\n const loadPromises: Promise[] = options.loadPromises ??= [];\n const wrapped = wrapCustomEmoji(options);\n return Promise.all(loadPromises).then(() => wrapped);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {clearBadCharsAndTrim} from '../../helpers/cleanSearchText';\nimport {formatFullSentTime} from '../../helpers/date';\nimport {simulateClickEvent, attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport formatBytes from '../../helpers/formatBytes';\nimport {MediaSizeType} from '../../helpers/mediaSizes';\nimport noop from '../../helpers/noop';\nimport {Message, MessageMedia, WebPage} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager, {Progress} from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getDownloadMediaDetails from '../../lib/appManagers/utils/download/getDownloadMediaDetails';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport {joinElementsWith} from '../../lib/langPack';\nimport {MAX_FILE_SAVE_SIZE} from '../../lib/mtproto/mtproto_config';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport rootScope from '../../lib/rootScope';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport {MediaSearchContext} from '../appMediaPlaybackController';\nimport AudioElement from '../audio';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport {MiddleEllipsisElement} from '../middleEllipsis';\nimport ProgressivePreloader from '../preloader';\nimport wrapPhoto from './photo';\nimport wrapSenderToPeer from './senderToPeer';\nimport wrapSentTime from './sentTime';\n\nrootScope.addEventListener('document_downloading', (docId) => {\n const elements = Array.from(document.querySelectorAll(`.document[data-doc-id=\"${docId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n if(element.querySelector('.preloader-container.manual')) {\n simulateClickEvent(element);\n }\n });\n});\n\nexport default async function wrapDocument({message, withTime, fontWeight, voiceAsMusic, showSender, searchContext, loadPromises, autoDownloadSize, lazyLoadQueue, sizeType, managers = rootScope.managers, cacheContext, fontSize}: {\n message: Message.message,\n withTime?: boolean,\n fontWeight?: number,\n voiceAsMusic?: boolean,\n showSender?: boolean,\n searchContext?: MediaSearchContext,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n sizeType?: MediaSizeType,\n managers?: AppManagers,\n cacheContext?: ThumbCache,\n fontSize?: number\n}): Promise {\n fontWeight ??= 500;\n sizeType ??= '' as any;\n fontSize ??= 0;\n const noAutoDownload = autoDownloadSize === 0;\n\n const doc = ((message.media as MessageMedia.messageMediaDocument).document || ((message.media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage).document) as MyDocument;\n const uploadFileName = message?.uploadingFileName;\n if(doc.type === 'audio' || doc.type === 'voice' || doc.type === 'round') {\n const audioElement = new AudioElement();\n audioElement.withTime = withTime;\n audioElement.message = message;\n audioElement.noAutoDownload = noAutoDownload;\n audioElement.lazyLoadQueue = lazyLoadQueue;\n audioElement.loadPromises = loadPromises;\n\n if(voiceAsMusic) audioElement.voiceAsMusic = voiceAsMusic;\n if(searchContext) audioElement.searchContext = searchContext;\n if(showSender) audioElement.showSender = showSender;\n\n audioElement.dataset.fontWeight = '' + fontWeight;\n audioElement.dataset.fontSize = '' + fontSize;\n audioElement.dataset.sizeType = sizeType;\n await audioElement.render();\n return audioElement;\n }\n\n const extSplitted = doc.file_name ? doc.file_name.split('.') : '';\n let ext = '';\n ext = extSplitted.length > 1 && Array.isArray(extSplitted) ?\n clearBadCharsAndTrim(extSplitted.pop().split(' ', 1)[0].toLowerCase()) :\n 'file';\n\n const docDiv = document.createElement('div');\n docDiv.classList.add('document', `ext-${ext}`);\n docDiv.dataset.docId = '' + doc.id;\n (docDiv as any).doc = doc;\n\n // return docDiv;\n\n const icoDiv = document.createElement('div');\n icoDiv.classList.add('document-ico');\n let icoTextEl: HTMLElement;\n\n const hadContext = !!cacheContext;\n const getCacheContext = () => {\n return hadContext ? cacheContext : managers.thumbsStorage.getCacheContext(doc);\n };\n\n cacheContext = await getCacheContext();\n let hasThumb = false;\n if((doc.thumbs?.length || (message.pFlags.is_outgoing && cacheContext.url && doc.type === 'photo'))/* && doc.mime_type !== 'image/gif' */) {\n docDiv.classList.add('document-with-thumb');\n hasThumb = true;\n\n const imgs: (HTMLImageElement | HTMLCanvasElement | HTMLVideoElement)[] = [];\n // ! WARNING, use thumbs for check when thumb will be generated for media\n if(message.pFlags.is_outgoing && ['photo', 'video'].includes(doc.type) && cacheContext.url) {\n icoDiv.innerHTML = ``;\n imgs.push(icoDiv.firstElementChild as HTMLImageElement);\n } else {\n const perf = performance.now();\n const wrapped = await wrapPhoto({\n photo: doc,\n message: null,\n container: icoDiv,\n boxWidth: 54,\n boxHeight: 54,\n loadPromises,\n withoutPreloader: true,\n lazyLoadQueue,\n size: choosePhotoSize(doc, 54, 54, true),\n managers\n });\n // console.log('was wrapping photo', performance.now() - perf);\n icoDiv.style.width = icoDiv.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n }\n\n imgs.forEach((img) => img.classList.add('document-thumb'));\n } else {\n icoTextEl = document.createElement('span');\n icoTextEl.classList.add('document-ico-text');\n icoTextEl.innerText = ext;\n icoDiv.append(icoTextEl);\n }\n\n // let fileName = stringMiddleOverflow(doc.file_name || 'Unknown.file', 26);\n const fileName = doc.file_name ? wrapPlainText(doc.file_name) : 'Unknown.file';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('document-description');\n const bytesContainer = document.createElement('span');\n const bytesEl = formatBytes(doc.size);\n const bytesJoiner = ' / ';\n\n const descriptionParts: (HTMLElement | string | DocumentFragment)[] = [bytesEl];\n\n if(withTime) {\n descriptionParts.push(formatFullSentTime(message.date));\n }\n\n if(showSender) {\n descriptionParts.push(await wrapSenderToPeer(message));\n }\n\n if(!withTime && !showSender) {\n const b = document.createElement('span');\n const bytesMaxEl = formatBytes(doc.size);\n b.append(bytesJoiner, bytesMaxEl);\n b.style.visibility = 'hidden';\n descriptionParts.push(b);\n }\n\n docDiv.innerHTML = `\n ${(cacheContext.downloaded && !uploadFileName) || !message.mid || !hasThumb ? '' : `
`}\n
\n
\n `;\n\n const nameDiv = docDiv.querySelector('.document-name') as HTMLElement;\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = '' + fontWeight;\n middleEllipsisEl.dataset.fontSize = '' + fontSize;\n middleEllipsisEl.dataset.sizeType = sizeType;\n middleEllipsisEl.textContent = fileName;\n // setInnerHTML(middleEllipsisEl, fileName);\n\n // * new media popup\n if(!message.mid) {\n docDiv.classList.add('downloaded');\n }\n\n nameDiv.append(middleEllipsisEl);\n\n if(showSender) {\n nameDiv.append(wrapSentTime(message));\n }\n\n const sizeDiv = docDiv.querySelector('.document-size') as HTMLElement;\n bytesContainer.append(...joinElementsWith(descriptionParts, ' · '));\n sizeDiv.append(bytesContainer);\n\n docDiv.prepend(icoDiv);\n\n if(!uploadFileName && message.pFlags.is_outgoing && !message.mid) {\n return docDiv;\n }\n\n let downloadDiv: HTMLElement, preloader: ProgressivePreloader = null;\n const onLoad = () => {\n docDiv.classList.remove('downloading');\n\n if(/* !hasThumb || */(doc.size > MAX_FILE_SAVE_SIZE && !uploadFileName)) {\n preloader.setManual();\n preloader.attach(downloadDiv);\n preloader.preloader.classList.add('manual');\n preloader.setDownloadFunction(load);\n return;\n }\n\n if(doc.size <= MAX_FILE_SAVE_SIZE) {\n docDiv.classList.add('downloaded');\n }\n\n if(downloadDiv) {\n if(downloadDiv !== icoDiv) {\n const _downloadDiv = downloadDiv;\n setTimeout(() => {\n _downloadDiv.remove();\n }, 200);\n }\n\n downloadDiv = null;\n }\n\n if(preloader) {\n preloader = null;\n }\n };\n\n const addByteProgress = (promise: CancellablePromise) => {\n docDiv.classList.add('downloading');\n\n const sizeContainer = document.createElement('span');\n const _bytesContainer = formatBytes(doc.size);\n sizeContainer.style.position = 'absolute';\n sizeContainer.style.left = '0';\n promise.then(onLoad, noop).finally(() => {\n // sizeContainer.replaceWith(bytesContainer);\n bytesContainer.style.visibility = '';\n sizeContainer.remove();\n // b && b.classList.remove('hide');\n });\n\n // b && b.classList.add('hide');\n\n const format = (bytes: number) => formatBytes(bytes);\n let d = format(0);\n bytesContainer.style.visibility = 'hidden';\n // bytesContainer.replaceWith(sizeContainer);\n sizeContainer.append(d, bytesJoiner, _bytesContainer);\n bytesContainer.parentElement.append(sizeContainer);\n promise.addNotifyListener((progress: Progress) => {\n const _d = format(progress.done);\n d.replaceWith(_d);\n d = _d;\n });\n };\n\n // ! DO NOT USE ASYNC/AWAIT HERE ! SAFARI WON'T LET DOWNLOAD THE FILE BECAUSE OF ASYNC\n const load = (e?: Event) => {\n const save = !e || e.isTrusted;\n const doc = (docDiv as any).doc;\n // const doc = await managers.appDocsManager.getDoc(docDiv.dataset.docId);\n let download: CancellablePromise;\n const queueId = appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : undefined;\n if(!save) {\n download = appDownloadManager.downloadToDisc({media: doc, queueId}, true);\n } else if(doc.type === 'pdf') {\n const canOpenAfter = /* managers.appDocsManager.downloading.has(doc.id) || */!preloader || preloader.detached;\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n if(canOpenAfter) {\n download.then(() => {\n setTimeout(async() => { // wait for preloader animation end\n const url = (await getCacheContext()).url;\n window.open(url);\n }, rootScope.settings.animationsEnabled ? 250 : 0);\n });\n }\n } else if(MEDIA_MIME_TYPES_SUPPORTED.has(doc.mime_type) && doc.thumbs?.length) {\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n } else {\n download = appDownloadManager.downloadToDisc({media: doc, queueId});\n }\n\n download.catch(() => {\n docDiv.classList.remove('downloading');\n });\n\n if(downloadDiv) {\n preloader.attach(downloadDiv, true, download);\n addByteProgress(download);\n }\n };\n\n const {fileName: downloadFileName} = getDownloadMediaDetails({media: doc, downloadId: '1'});\n if(await managers.apiFileManager.isDownloading(downloadFileName)) {\n downloadDiv = docDiv.querySelector('.document-download') || icoDiv;\n const promise = appDownloadManager.downloadToDisc({media: doc}, true);\n\n preloader = new ProgressivePreloader();\n preloader.attach(downloadDiv, false, promise);\n preloader.setDownloadFunction(load);\n addByteProgress(promise);\n } else if(!cacheContext.downloaded || uploadFileName) {\n downloadDiv = docDiv.querySelector('.document-download') || icoDiv;\n preloader = new ProgressivePreloader({\n isUpload: !!uploadFileName\n });\n\n if(!uploadFileName) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(downloadDiv);\n preloader.setDownloadFunction(load);\n\n if(autoDownloadSize !== undefined && autoDownloadSize >= doc.size) {\n simulateClickEvent(preloader.preloader);\n }\n } else {\n const uploadPromise = appDownloadManager.getUpload(uploadFileName);\n preloader.attachPromise(uploadPromise);\n preloader.attach(downloadDiv);\n addByteProgress(uploadPromise);\n }\n }\n\n attachClickEvent(docDiv, (e) => {\n if(findUpClassName(e.target, 'time')) { // prevent downloading by clicking on time\n return;\n }\n\n if(preloader) {\n preloader.onClick(e);\n } else {\n load(e);\n }\n });\n\n return docDiv;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\n\nexport default function formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport {Chat, ChatParticipants} from '../../layer';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport rootScope from '../../lib/rootScope';\n\nexport default async function getChatMembersString(chatId: ChatId, managers = rootScope.managers) {\n const chat: Chat = await managers.appChatsManager.getChat(chatId);\n if(chat._ === 'chatForbidden') {\n return i18n('YouWereKicked');\n }\n\n const chatFull = await managers.appProfileManager.getCachedFullChat(chatId);\n let count: number;\n if(chatFull) {\n if(chatFull._ === 'channelFull') {\n count = chatFull.participants_count;\n } else {\n count = (chatFull.participants as ChatParticipants.chatParticipants).participants?.length;\n }\n } else {\n count = (chat as Chat.chat).participants_count || (chat as any).participants?.participants.length;\n }\n\n const isBroadcast = (chat as Chat.channel).pFlags.broadcast;\n count = count || 1;\n\n const key: LangPackKey = isBroadcast ? 'Peer.Status.Subscribers' : 'Peer.Status.Member';\n return i18n(key, [numberThousandSplitter(count)]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport _limitSymbols from '../../helpers/string/limitSymbols';\nimport {Chat} from '../../layer';\nimport getPeerActiveUsernames from '../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport I18n from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../lib/rootScope';\n\ntype GetPeerTitleOptions = {\n peerId: PeerId,\n plainText?: boolean,\n onlyFirstName?: boolean,\n limitSymbols?: number,\n threadId?: number\n} & Pick;\n\nexport default async function getPeerTitle(\n options: T\n): Promise {\n const {\n peerId = rootScope.myId,\n plainText,\n onlyFirstName,\n limitSymbols,\n managers = rootScope.managers,\n threadId\n } = options;\n\n let title = '';\n if(peerId.isUser()) {\n const user = await managers.appUsersManager.getUser(peerId.toUserId());\n if(user) {\n if(user.first_name) title += user.first_name;\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\n }\n\n if(!title) title = !user || user.pFlags.deleted ? I18n.format(onlyFirstName ? 'Deleted' : 'HiddenName', true) : getPeerActiveUsernames(user)[0] || '';\n else title = title.trim();\n } else {\n if(threadId) {\n const topic = await managers.dialogsStorage.getForumTopic(peerId, threadId);\n title = topic?.title || '';\n }\n\n if(!title) {\n const chat = await managers.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n title = chat?.title || '';\n }\n\n if(onlyFirstName) {\n title = title.split(' ')[0];\n }\n }\n\n if(limitSymbols !== undefined) {\n title = _limitSymbols(title, limitSymbols, limitSymbols);\n }\n\n return plainText ? title : wrapEmojiText(title) as any;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatFullSentTimeRaw} from '../../helpers/date';\nimport {User} from '../../layer';\nimport {LangPackKey, i18n} from '../../lib/langPack';\nimport {REPLIES_PEER_ID, SERVICE_PEER_ID} from '../../lib/mtproto/mtproto_config';\n\nexport default function getUserStatusString(user: User.user): HTMLElement {\n if(!user) {\n return document.createElement('span');\n }\n\n let key: LangPackKey;\n let args: any[];\n\n switch(user.id) {\n case REPLIES_PEER_ID.toUserId():\n key = 'Peer.RepliesNotifications';\n break;\n case SERVICE_PEER_ID.toUserId():\n key = 'Peer.ServiceNotifications';\n break;\n default: {\n if(user.pFlags.bot) {\n key = 'Bot';\n break;\n }\n\n if(user.pFlags.support) {\n key = 'SupportStatus';\n break;\n }\n\n switch(user.status?._) {\n case 'userStatusRecently': {\n key = 'Lately';\n break;\n }\n\n case 'userStatusLastWeek': {\n key = 'WithinAWeek';\n break;\n }\n\n case 'userStatusLastMonth': {\n key = 'WithinAMonth';\n break;\n }\n\n case 'userStatusOffline': {\n const date = user.status.was_online;\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n\n const diff = now - date;\n if(diff < 60) {\n key = 'Peer.Status.justNow';\n } else if(diff < 3600) {\n key = 'Peer.Status.minAgo';\n const c = diff / 60 | 0;\n args = [c];\n } else if(diff < 86400 && today.getDate() === new Date(date * 1000).getDate()) {\n key = 'LastSeen.HoursAgo';\n const c = diff / 3600 | 0;\n args = [c];\n } else {\n key = 'Peer.Status.LastSeenAt';\n const {dateEl, timeEl} = formatFullSentTimeRaw(date);\n args = [dateEl, timeEl];\n }\n\n break;\n }\n\n case 'userStatusOnline': {\n key = 'Online';\n break;\n }\n\n default: {\n key = 'ALongTimeAgo';\n break;\n }\n }\n\n break;\n }\n }\n\n return i18n(key, args);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport getImageFromStrippedThumb from '../../helpers/getImageFromStrippedThumb';\nimport noop from '../../helpers/noop';\nimport {Document, Photo, PhotoSize} from '../../layer';\nimport DotRenderer from '../dotRenderer';\nimport SetTransition from '../singleTransition';\n\nexport function toggleMediaSpoiler(options: {\n mediaSpoiler: HTMLElement,\n reveal: boolean,\n destroyAfter?: boolean\n}) {\n const {mediaSpoiler, reveal, destroyAfter} = options;\n SetTransition({\n element: mediaSpoiler,\n forwards: reveal,\n className: 'is-revealing',\n duration: 250,\n onTransitionEnd: () => {\n if(reveal && destroyAfter) {\n mediaSpoiler.remove();\n mediaSpoiler.middlewareHelper.destroy();\n }\n }\n });\n}\n\nexport function onMediaSpoilerClick(options: {\n mediaSpoiler: HTMLElement,\n event: Event\n}) {\n const {mediaSpoiler, event} = options;\n cancelEvent(event);\n\n if(mediaSpoiler.classList.contains('is-revealing')) {\n return;\n }\n\n const video = mediaSpoiler.parentElement.querySelector('video');\n if(video && !mediaSpoiler.parentElement.querySelector('.video-play')) {\n video.autoplay = true;\n video.play().catch(noop);\n }\n\n toggleMediaSpoiler({\n mediaSpoiler,\n reveal: true,\n destroyAfter: true\n });\n}\n\nexport function wrapMediaSpoilerWithImage(options: {\n image: Awaited>['image']\n} & Parameters[0]) {\n const {middleware, image} = options;\n if(!middleware()) {\n return;\n }\n\n image.classList.add('media-spoiler-thumbnail');\n\n const container = document.createElement('div');\n container.classList.add('media-spoiler-container');\n container.middlewareHelper = middleware.create();\n\n const dotRenderer = DotRenderer.create({\n ...options,\n middleware: container.middlewareHelper.get()\n });\n\n container.append(image, dotRenderer.canvas);\n\n return container;\n}\n\nexport default async function wrapMediaSpoiler(\n options: Omit[0], 'image'> & {\n media: Document.document | Photo.photo\n }\n) {\n const {media} = options;\n const sizes = (media as Photo.photo).sizes || (media as Document.document).thumbs;\n const thumb = sizes.find((size) => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n if(!thumb) {\n return;\n }\n\n const {image, loadPromise} = getImageFromStrippedThumb(media, thumb, true);\n await loadPromise;\n\n return wrapMediaSpoilerWithImage({\n ...options,\n image\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport wrapMessageActionTextNewUnsafe from './messageActionTextNewUnsafe';\n\nexport type WrapMessageActionTextOptions = {\n message: MyMessage,\n plain?: boolean\n} & WrapSomethingOptions;\n\nexport default async function wrapMessageActionTextNew(\n options: T\n): Promise {\n try {\n return await wrapMessageActionTextNewUnsafe(options) as any;\n } catch(err) {\n console.error('wrapMessageActionTextNewUnsafe error:', err);\n return options.plain ? '' : document.createElement('span') as any;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {hexaToHsla} from '../helpers/color';\nimport {TOPIC_COLORS} from '../lib/mtproto/mtproto_config';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\n\nlet svg: SVGSVGElement, span: HTMLElement, defs: HTMLElement;\nconst hadColors: Map = new Map();\nexport default function topicAvatar(color: number, content: string) {\n if(!svg) {\n defs = document.getElementById('svg-defs') as HTMLElement;\n\n const ns = 'http://www.w3.org/2000/svg';\n\n svg = document.createElementNS(ns, 'svg');\n svg.setAttributeNS(null, 'width', '26');\n svg.setAttributeNS(null, 'height', '26');\n svg.setAttributeNS(null, 'viewBox', '0 0 26 26');\n svg.classList.add('topic-icon-svg');\n\n const use = document.createElementNS(ns, 'use');\n use.setAttributeNS(null, 'href', '#topic-icon');\n svg.append(use);\n\n span = document.createElement('span');\n span.classList.add('topic-icon', 'avatar-like');\n\n const contentSpan = document.createElement('span');\n contentSpan.classList.add('topic-icon-content');\n span.append(svg, contentSpan);\n }\n\n if(!color) {\n console.error('NO TOPIC ICON COLOR!');\n color = TOPIC_COLORS[0];\n }\n\n if(!content) {\n console.error('NO TOPIC NAME!');\n content = '';\n }\n\n const hex = color.toString(16);\n\n const gradientId = `topic-icon-gradient-${color}`;\n let strokeColor = hadColors.get(color);\n if(!strokeColor) {\n const {h, s, l, a} = hexaToHsla('#' + hex);\n defs.insertAdjacentHTML('beforeend', `\n \n \n \n \n `);\n\n hadColors.set(color, strokeColor = `hsla(${h}, ${s}%, ${Math.max(0, l - 40)}%, ${a})`);\n }\n\n const clone = span.cloneNode(true) as typeof span;\n (clone.firstElementChild as HTMLElement).style.fill = `url(#${gradientId})`;\n // (clone.firstElementChild as HTMLElement).style.stroke = `var(--peer-avatar-${color}-filled)`;\n (clone.firstElementChild as HTMLElement).style.stroke = strokeColor;\n clone.lastElementChild.append(wrapAbbreviation(content, true));\n return clone;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message, MessageAction} from '../../layer';\nimport wrapUrl from '../../lib/richTextProcessor/wrapUrl';\n\nexport default function wrapJoinVoiceChatAnchor(message: Message.messageService) {\n const action = message.action as MessageAction.messageActionInviteToGroupCall;\n const {onclick, url} = wrapUrl(`tg://voicechat?chat_id=${message.peerId.toChatId()}&id=${action.call.id}&access_hash=${action.call.access_hash}`);\n if(!onclick) {\n return document.createElement('span');\n }\n\n const a = document.createElement('a');\n a.href = url;\n a.setAttribute('onclick', onclick + '(this)');\n\n return a;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {formatTime, ONE_DAY} from '../../helpers/date';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport formatCallDuration from '../../helpers/formatCallDuration';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport {ForumTopic, Message, MessageAction} from '../../layer';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport I18n, {FormatterArgument, FormatterArguments, i18n, join, langPack, LangPackKey, _i18n} from '../../lib/langPack';\nimport {GENERAL_TOPIC_ID} from '../../lib/mtproto/mtproto_config';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport topicAvatar from '../topicAvatar';\nimport {wrapCustomEmojiAwaited} from './customEmoji';\nimport getPeerTitle from './getPeerTitle';\nimport wrapJoinVoiceChatAnchor from './joinVoiceChatAnchor';\nimport {WrapMessageActionTextOptions} from './messageActionTextNew';\nimport wrapMessageForReply, {WrapMessageForReplyOptions} from './messageForReply';\nimport wrapPeerTitle from './peerTitle';\n\nasync function wrapLinkToMessage(options: WrapMessageForReplyOptions) {\n const wrapped = await wrapMessageForReply(options);\n\n if(options.plain) {\n return wrapped;\n }\n\n const a = document.createElement('i');\n a.dataset.savedFrom = (options.message as Message.message).peerId + '_' + (options.message as Message.message).mid;\n a.dir = 'auto';\n a.append(wrapped);\n return a;\n}\n\nfunction wrapSomeText(text: string, plain?: boolean) {\n return plain ? text : htmlToSpan(wrapEmojiText(text));\n}\n\ntype WrapTopicIconOptions = {\n topic: Pick,\n plain?: boolean\n} & WrapSomethingOptions;\nexport async function wrapTopicIcon(options: T): Promise {\n const topic = options.topic;\n\n let iconEmojiId = topic?.icon_emoji_id;\n if(topic?.id === GENERAL_TOPIC_ID) {\n iconEmojiId = '5390854796011906616';\n }\n\n if(!iconEmojiId) {\n if(options.plain) return '' as any;\n\n // if(topic?.id === GENERAL_TOPIC_ID) {\n // const span = document.createElement('span');\n // span.innerHTML = `\n // \n // \n // \n // `;\n\n // span.classList.add('topic-icon');\n\n // return span as any;\n // }\n\n return topicAvatar(topic?.icon_color, topic?.title) as any;\n }\n\n return options.plain ?\n rootScope.managers.appEmojiManager.getCustomEmojiDocument(iconEmojiId).then((doc) => doc.stickerEmojiRaw) :\n wrapCustomEmojiAwaited({\n ...options,\n docIds: [iconEmojiId]\n }).then((fragment) => {\n fragment.lastElementChild.classList.add('topic-icon');\n return fragment;\n }) as any;\n}\n\nfunction wrapMessageActionTopicIcon(options: WrapMessageActionTextOptions) {\n const action = ((options.message as Message.messageService).action as MessageAction.messageActionTopicCreate);\n return wrapTopicIcon({\n ...options,\n topic: action as any as ForumTopic.forumTopic\n });\n}\n\nasync function wrapMessageActionTopicIconAndName(options: WrapMessageActionTextOptions) {\n const action = ((options.message as Message.messageService).action as MessageAction.messageActionTopicCreate);\n const span = document.createElement('span');\n span.classList.add('topic-name');\n span.append(await wrapMessageActionTopicIcon(options), wrapSomeText(action.title, options.plain));\n return span;\n}\n\nexport default async function wrapMessageActionTextNewUnsafe(options: WrapMessageActionTextOptions) {\n const {plain, message, middleware, lazyLoadQueue, customEmojiSize, animationGroup} = options;\n const element: HTMLElement = plain ? undefined : document.createElement('span');\n const action = 'action' in message && message.action;\n\n // this.log('message action:', action);\n\n if((action as MessageAction.messageActionCustomAction).message) {\n const unsafeMessage = (action as MessageAction.messageActionCustomAction).message;\n if(plain) {\n return wrapPlainText(unsafeMessage);\n } else {\n setInnerHTML(element, wrapRichText(unsafeMessage, {noLinebreaks: true}));\n return element;\n }\n } else {\n let _ = action._;\n // let suffix = '';\n let langPackKey: LangPackKey;\n let args: Array>;\n\n const managers = rootScope.managers;\n\n const getNameDivHTML = (peerId: PeerId, plain: boolean) => {\n return plain ? getPeerTitle({peerId, plainText: plain}) : wrapPeerTitle({peerId});\n };\n\n switch(action._) {\n case 'messageActionPhoneCall': {\n _ += '.' + (action as any).type;\n\n args = [formatCallDuration(action.duration, plain)];\n break;\n }\n\n case 'messageActionGroupCall': {\n _ += '.' + (action as any).type;\n\n args = [];\n if(!_.endsWith('You') && !message.pFlags.post) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n if(action.duration !== undefined) {\n args.push(formatCallDuration(action.duration, plain));\n } else {\n args.push(wrapJoinVoiceChatAnchor(message as any));\n }\n\n break;\n }\n\n case 'messageActionInviteToGroupCall': {\n const peerIds = [message.fromId, action.users[0].toPeerId()];\n let a = 'Chat.Service.VoiceChatInvitation';\n const myId = rootScope.myId;\n if(peerIds[0] === myId) a += 'ByYou';\n else if(peerIds[1] === myId) a += 'ForYou';\n indexOfAndSplice(peerIds, myId);\n\n langPackKey = a as LangPackKey;\n args = peerIds.map((peerId) => getNameDivHTML(peerId, plain));\n args.push(wrapJoinVoiceChatAnchor(message as any));\n break;\n }\n\n case 'messageActionGroupCallScheduled': {\n const today = new Date();\n const date = new Date(action.schedule_date * 1000);\n const daysToStart = (date.getTime() - today.getTime()) / 86400e3;\n const tomorrowDate = new Date(today);\n tomorrowDate.setDate(tomorrowDate.getDate() + 1);\n\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n langPackKey = isBroadcast ? 'ChatList.Service.VoiceChatScheduled.Channel' : 'ChatList.Service.VoiceChatScheduled';\n args = [];\n const myId = rootScope.myId;\n if(message.fromId === myId) {\n langPackKey += 'You';\n } else if(!isBroadcast) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let k: LangPackKey;\n const _args: FormatterArguments = [];\n if(daysToStart < 1 && date.getDate() === today.getDate()) {\n k = 'TodayAtFormattedWithToday';\n } else if(daysToStart < 2 && date.getDate() === tomorrowDate.getDate()) {\n k = 'Time.TomorrowAt';\n } else {\n k = 'formatDateAtTime';\n _args.push(new I18n.IntlDateElement({\n date,\n options: {\n day: '2-digit',\n month: '2-digit',\n year: '2-digit'\n }\n }).element);\n }\n\n _args.push(formatTime(date));\n const t = i18n(k, _args);\n args.push(t);\n\n break;\n }\n\n case 'messageActionChatCreate': {\n const myId = rootScope.myId;\n if(message.fromId === myId) {\n _ += 'You';\n } else {\n args = [getNameDivHTML(message.fromId, plain)];\n }\n\n break;\n }\n\n case 'messageActionPinMessage': {\n const peerId = message.peerId;\n const pinnedMessage = await managers.appMessagesManager.getMessageByPeer(peerId, message.reply_to_mid);\n\n args = [\n getNameDivHTML(message.fromId, plain)\n ];\n\n if(!pinnedMessage/* || true */) {\n langPackKey = 'ActionPinnedNoText';\n\n if(message.reply_to_mid) { // refresh original message\n managers.appMessagesManager.fetchMessageReplyTo(message);\n }\n } else {\n args.push(wrapLinkToMessage({\n ...options,\n message: pinnedMessage\n }));\n }\n\n break;\n }\n\n case 'messageActionChatJoinedByRequest': {\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n if(message.pFlags.out) {\n langPackKey = isBroadcast ? 'RequestToJoinChannelApproved' : 'RequestToJoinGroupApproved';\n } else {\n langPackKey = isBroadcast ? 'ChatService.UserJoinedChannelByRequest' : 'ChatService.UserJoinedGroupByRequest';\n args = [getNameDivHTML(message.fromId, plain)];\n }\n break;\n }\n\n case 'messageActionContactSignUp':\n case 'messageActionChatReturn':\n case 'messageActionChatLeave':\n case 'messageActionChatJoined':\n case 'messageActionChatEditPhoto':\n case 'messageActionChatDeletePhoto':\n case 'messageActionChatEditVideo':\n case 'messageActionChatJoinedByLink':\n case 'messageActionChannelEditVideo':\n case 'messageActionChannelDeletePhoto': {\n args = [getNameDivHTML(message.fromId, plain)];\n break;\n }\n\n case 'messageActionChannelEditTitle':\n case 'messageActionChatEditTitle': {\n args = [];\n if(action._ === 'messageActionChatEditTitle') {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n args.push(wrapSomeText(action.title));\n break;\n }\n\n case 'messageActionChatDeleteUser':\n case 'messageActionChatAddUsers':\n case 'messageActionChatAddUser': {\n const users = (action as MessageAction.messageActionChatAddUser).users ||\n [(action as MessageAction.messageActionChatDeleteUser).user_id];\n\n args = [getNameDivHTML(message.fromId, plain)];\n\n if(users.length > 1) {\n const joined = join(\n await Promise.all(users.map((userId: UserId) => getNameDivHTML(userId.toPeerId(), plain))),\n false,\n plain\n );\n\n if(plain) {\n args.push(...joined);\n } else {\n const fragment = document.createElement('span');\n fragment.append(...joined);\n args.push(fragment);\n }\n } else {\n args.push(getNameDivHTML(users[0].toPeerId(), plain));\n }\n\n break;\n }\n\n case 'messageActionBotAllowed': {\n const anchorHTML = wrapRichText(action.domain, {\n entities: [{\n _: 'messageEntityUrl',\n length: action.domain.length,\n offset: 0\n }]\n });\n\n const node = htmlToSpan(anchorHTML);\n\n args = [node];\n break;\n }\n\n case 'messageActionPaymentSent': {\n const isRecurringInit = action.pFlags.recurring_init;\n const isRecurringUsed = action.pFlags.recurring_used;\n langPackKey = isRecurringUsed ? 'Chat.Service.PaymentSentRecurringUsedNoTitle' : (isRecurringInit ? 'Chat.Service.PaymentSentRecurringInitNoTitle' : 'Chat.Service.PaymentSent1NoTitle');\n const price = paymentsWrapCurrencyAmount(action.total_amount, action.currency);\n args = [price, getNameDivHTML(message.peerId, plain)];\n\n if(message.reply_to_mid) {\n const invoiceMessage = await managers.appMessagesManager.getMessageByPeer(\n message.reply_to?.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : message.peerId,\n message.reply_to_mid\n );\n\n if(!invoiceMessage) {\n managers.appMessagesManager.fetchMessageReplyTo(message);\n } else {\n langPackKey = isRecurringUsed ? 'Chat.Service.PaymentSentRecurringUsed' : (isRecurringInit ? 'Chat.Service.PaymentSentRecurringInit' : 'Chat.Service.PaymentSent1');\n args.push(wrapLinkToMessage({\n ...options,\n message: invoiceMessage\n }).then((el) => {\n if(el instanceof HTMLElement) {\n el.classList.add('is-receipt-link');\n }\n\n return el;\n }));\n }\n }\n\n break;\n }\n\n case 'messageActionSetMessagesTTL': {\n args = [];\n\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n if(action.period) {\n if(isBroadcast) {\n langPackKey = 'ActionTTLChannelChanged';\n } else if(message.fromId === rootScope.myId) {\n langPackKey = 'ActionTTLYouChanged';\n } else {\n langPackKey = 'ActionTTLChanged';\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let duration: ReturnType;\n if(action.period > 1814400) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n const year = 31536000;\n if(action.period >= year) {\n key = 'Years';\n args.push(action.period / year | 0);\n } else {\n key = 'Months';\n args.push(action.period / (ONE_DAY * 30) | 0);\n }\n\n duration = plain ? I18n.format(key, true, args) : i18n(key, args);\n } else {\n duration = formatCallDuration(action.period, plain);\n }\n\n args.push(duration);\n } else {\n if(isBroadcast) {\n langPackKey = 'ActionTTLChannelDisabled';\n } else if(message.fromId === rootScope.myId) {\n langPackKey = 'ActionTTLYouDisabled';\n } else {\n langPackKey = 'ActionTTLDisabled';\n args.push(getNameDivHTML(message.fromId, plain));\n }\n }\n break;\n }\n\n case 'messageActionTopicEdit': {\n let iconElement: (typeof args)[0];\n let titleElement: typeof iconElement;\n let authorElement: ReturnType;\n const isMe = !!message.pFlags.out;\n const isIconChanged = action.icon_emoji_id !== undefined;\n const isIconRemoved = isIconChanged && !+action.icon_emoji_id;\n const isTitleChanged = action.title !== undefined;\n const isHiddenChanged = action.hidden !== undefined;\n\n if(!isMe) {\n authorElement = getNameDivHTML(message.fromId, plain);\n }\n\n if(isTitleChanged) {\n titleElement = wrapSomeText(action.title);\n }\n\n if(isIconChanged && !isIconRemoved) {\n iconElement = wrapMessageActionTopicIcon(options);\n }\n\n args = authorElement ? [authorElement] : [];\n\n if(action.closed) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Paused' : 'Chat.Service.Group.TopicEdited.Paused';\n } else if(action.closed === false) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Resumed' : 'Chat.Service.Group.TopicEdited.Resumed';\n } else if(isIconRemoved && isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.TopicEdited.You.Mixed.IconRemoved' : 'Chat.Service.TopicEdited.Mixed.IconRemoved';\n args.push(titleElement);\n } else if(isIconChanged && isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.TopicEdited.You.Mixed' : 'Chat.Service.TopicEdited.Mixed';\n args.push(wrapMessageActionTopicIconAndName(options));\n } else if(isIconRemoved) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Icon.Removed' : 'Chat.Service.Group.TopicEdited.Icon.Removed';\n } else if(isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Title' : 'Chat.Service.Group.TopicEdited.Title';\n args.push(titleElement);\n } else if(isIconChanged) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Icon' : 'Chat.Service.Group.TopicEdited.Icon';\n args.push(iconElement);\n } else if(isHiddenChanged) {\n langPackKey = isMe ?\n (action.hidden ? 'Chat.Service.Group.TopicEdited.You.Hided' : 'Chat.Service.Group.TopicEdited.You.Unhided') :\n (action.hidden ? 'Chat.Service.Group.TopicEdited.Hided' : 'Chat.Service.Group.TopicEdited.Unhided');\n }\n\n break;\n }\n\n case 'messageActionTopicCreate': {\n args = [wrapMessageActionTopicIconAndName(options)];\n langPackKey = 'TopicWasCreatedAction';\n break;\n }\n\n default:\n langPackKey = (langPack[_] || `[${action._}]`) as any;\n break;\n }\n\n if(!langPackKey) {\n langPackKey = langPack[_];\n if(langPackKey === undefined) {\n langPackKey = '[' + _ + ']' as any;\n }\n }\n\n const waited = args && await Promise.all(args);\n\n if(plain) {\n return I18n.format(langPackKey, true, waited);\n } else {\n return _i18n(element, langPackKey, waited);\n }\n\n // str = !langPackKey || langPackKey[0].toUpperCase() === langPackKey[0] ? langPackKey : getNameDivHTML(message.fromId) + langPackKey + (suffix ? ' ' : '');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport assumeType from '../../helpers/assumeType';\nimport htmlToDocumentFragment from '../../helpers/dom/htmlToDocumentFragment';\nimport {getRestrictionReason} from '../../helpers/restrictions';\nimport escapeRegExp from '../../helpers/string/escapeRegExp';\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {Message, DocumentAttribute, DraftMessage} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {MyDraftMessage} from '../../lib/appManagers/appDraftsManager';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport isMessageRestricted from '../../lib/appManagers/utils/messages/isMessageRestricted';\nimport I18n, {LangPackKey, i18n, UNSUPPORTED_LANG_PACK_KEY} from '../../lib/langPack';\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport {Modify} from '../../types';\nimport wrapMessageActionTextNew, {WrapMessageActionTextOptions} from './messageActionTextNew';\n\nexport type WrapMessageForReplyOptions = Modify & {\n text?: string,\n usingMids?: number[],\n highlightWord?: string,\n withoutMediaType?: boolean\n};\n\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): Promise;\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): Promise;\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): Promise {\nexport default async function wrapMessageForReply(\n options: T\n): Promise {\n let {message, text, usingMids, plain, highlightWord, withoutMediaType} = options;\n text ??= (message as Message.message).message;\n\n const parts: (Node | string)[] = [];\n\n let hasAlbumKey = false;\n const addPart = (langKey: LangPackKey, part?: string | HTMLElement | DocumentFragment) => {\n if(langKey) {\n if(part === undefined && hasAlbumKey) {\n return;\n }\n\n part = plain ? I18n.format(langKey, true) : i18n(langKey);\n }\n\n if(plain) {\n parts.push(part);\n } else {\n const el = document.createElement('span');\n if(typeof(part) === 'string') el.innerHTML = part;\n else el.append(part);\n parts.push(el);\n }\n };\n\n const managers = rootScope.managers;\n const appMessagesManager = managers.appMessagesManager;\n\n const isRestricted = isMessageRestricted(message as any);\n\n let entities = (message as Message.message).totalEntities ?? (message as DraftMessage.draftMessage).entities;\n if((message as Message.message).media && !isRestricted) {\n assumeType(message);\n let usingFullAlbum = true;\n if(message.grouped_id) {\n if(usingMids) {\n const mids = await appMessagesManager.getMidsByMessage(message);\n if(usingMids.length === mids.length) {\n for(const mid of mids) {\n if(!usingMids.includes(mid)) {\n usingFullAlbum = false;\n break;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n }\n\n if(usingFullAlbum) {\n const albumText = await appMessagesManager.getAlbumText(message.grouped_id);\n text = albumText?.message || '';\n entities = albumText?.totalEntities || [];\n\n if(!withoutMediaType) {\n addPart('AttachAlbum');\n hasAlbumKey = true;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n\n if((!usingFullAlbum && !withoutMediaType) || !text) {\n const media = message.media;\n switch(media._) {\n case 'messageMediaPhoto':\n addPart('AttachPhoto');\n break;\n case 'messageMediaDice':\n addPart(undefined, plain ? media.emoticon : wrapEmojiText(media.emoticon));\n break;\n case 'messageMediaVenue': {\n text = media.title;\n addPart('AttachLocation');\n break;\n }\n case 'messageMediaGeo':\n addPart('AttachLocation');\n break;\n case 'messageMediaGeoLive':\n addPart('AttachLiveLocation');\n break;\n case 'messageMediaPoll':\n const f = '📊' + ' ' + (media.poll.question || 'poll');\n addPart(undefined, plain ? f : wrapEmojiText(f));\n break;\n case 'messageMediaContact':\n addPart('AttachContact');\n break;\n case 'messageMediaGame': {\n const f = '🎮' + ' ' + media.game.title;\n addPart(undefined, plain ? f : wrapEmojiText(f));\n break;\n }\n case 'messageMediaDocument': {\n const document = media.document as MyDocument;\n\n if(document.type === 'video') {\n addPart('AttachVideo');\n } else if(document.type === 'voice') {\n addPart('AttachAudio');\n } else if(document.type === 'gif') {\n addPart('AttachGif');\n } else if(document.type === 'round') {\n addPart('AttachRound');\n } else if(document.type === 'sticker') {\n const i = parts.length;\n if(document.stickerEmojiRaw) {\n const f = document.stickerEmojiRaw + ' ';\n addPart(undefined, plain ? f : wrapEmojiText(f));\n }\n\n addPart('AttachSticker');\n\n // will combine two parts into one\n const p = parts.splice(i, 2);\n if(plain) parts.push((p[0] as string) + (p[1] ? p[1] as string : ''));\n else {\n const span = window.document.createElement('span');\n span.append(...p);\n parts.push(span);\n }\n\n text = '';\n } else if(document.type === 'audio') {\n const attribute = document.attributes.find((attribute) => attribute._ === 'documentAttributeAudio' && (attribute.title || attribute.performer)) as DocumentAttribute.documentAttributeAudio;\n const f = '🎵' + ' ' + (attribute ? [attribute.title, attribute.performer].filter(Boolean).join(' - ') : document.file_name);\n addPart(undefined, plain ? f : wrapEmojiText(f));\n } else {\n addPart(undefined, plain ? document.file_name : wrapEmojiText(document.file_name));\n }\n\n break;\n }\n\n case 'messageMediaInvoice': {\n if(media.extended_media?._ === 'messageExtendedMediaPreview') {\n addPart(undefined, plain ? media.description : wrapEmojiText(media.description));\n } else {\n addPart(undefined, plain ? media.title : wrapEmojiText(media.title));\n }\n\n break;\n }\n\n case 'messageMediaUnsupported': {\n addPart(UNSUPPORTED_LANG_PACK_KEY);\n break;\n }\n\n default:\n // messageText += media._;\n // /////appMessagesManager.log.warn('Got unknown media type!', message);\n break;\n }\n }\n\n const length = parts.length;\n for(let i = 1; i < length; i += 2) {\n parts.splice(i, 0, ', ');\n }\n\n if(text && length) {\n parts.push(', ');\n }\n }\n\n if((message as Message.messageService).action) {\n const actionWrapped = await wrapMessageActionTextNew({message: (message as Message.messageService), plain});\n if(actionWrapped) {\n addPart(undefined, actionWrapped);\n }\n }\n\n if(isRestricted) {\n text = getRestrictionReason((message as Message.message).restriction_reason).text;\n entities = [];\n }\n\n if(text) {\n text = limitSymbols(text, 100);\n\n if(!entities) {\n entities = [];\n }\n\n if(plain) {\n parts.push(wrapPlainText(text, entities));\n } else {\n // let entities = parseEntities(text.replace(/\\n/g, ' '));\n\n if(highlightWord) {\n highlightWord = highlightWord.trim();\n let found = false;\n let match: any;\n const regExp = new RegExp(escapeRegExp(highlightWord), 'gi');\n entities = entities.slice(); // fix leaving highlight entity\n while((match = regExp.exec(text)) !== null) {\n entities.push({_: 'messageEntityHighlight', length: highlightWord.length, offset: match.index});\n found = true;\n }\n\n if(found) {\n sortEntities(entities);\n }\n }\n\n const messageWrapped = wrapRichText(text, {\n noLinebreaks: true,\n entities,\n noLinks: true,\n noTextFormat: true\n });\n\n parts.push(htmlToDocumentFragment(messageWrapped));\n }\n }\n\n if(plain) {\n return parts.join('') as any;\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment as any;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PeerTitle, {PeerTitleOptions} from '../peerTitle';\n\nexport default async function wrapPeerTitle(options: PeerTitleOptions) {\n const peerTitle = new PeerTitle();\n await peerTitle.update(options);\n return peerTitle.element;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport renderMediaWithFadeIn from '../../helpers/dom/renderMediaWithFadeIn';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Message, PhotoSize, VideoSize, WebDocument} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../../lib/appManagers/appPhotosManager';\nimport rootScope from '../../lib/rootScope';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ProgressivePreloader from '../preloader';\nimport blur from '../../helpers/blur';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getStrippedThumbIfNeeded from '../../helpers/getStrippedThumbIfNeeded';\nimport setAttachmentSize from '../../helpers/setAttachmentSize';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport isWebDocument from '../../lib/appManagers/utils/webDocs/isWebDocument';\nimport createVideo from '../../helpers/dom/createVideo';\nimport noop from '../../helpers/noop';\nimport {THUMB_TYPE_FULL} from '../../lib/mtproto/mtproto_config';\nimport {Middleware} from '../../helpers/middleware';\n\nexport default async function wrapPhoto({photo, message, container, boxWidth, boxHeight, withTail, isOut, lazyLoadQueue, middleware, size, withoutPreloader, loadPromises, autoDownloadSize, noBlur, noThumb, noFadeIn, blurAfter, managers = rootScope.managers, processUrl}: {\n photo: MyPhoto | MyDocument | WebDocument,\n message?: Message.message | Message.messageService,\n container: HTMLElement,\n boxWidth?: number,\n boxHeight?: number,\n withTail?: boolean,\n isOut?: boolean,\n lazyLoadQueue?: LazyLoadQueue,\n middleware?: Middleware,\n size?: PhotoSize | VideoSize,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n noBlur?: boolean,\n noThumb?: boolean,\n noFadeIn?: boolean,\n blurAfter?: boolean,\n managers?: AppManagers,\n processUrl?: (url: string) => Promise\n}) {\n const ret = {\n loadPromises: {\n thumb: Promise.resolve() as Promise,\n full: Promise.resolve() as Promise\n },\n images: {\n thumb: null as HTMLImageElement | HTMLCanvasElement,\n full: null as HTMLVideoElement | HTMLImageElement\n },\n preloader: null as ProgressivePreloader,\n aspecter: null as HTMLElement\n };\n\n const isDocument = photo._ === 'document';\n const isImageFromDocument = isDocument && photo.mime_type.startsWith('image/') && !size;\n const isWebDoc = isWebDocument(photo);\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs) && !isWebDoc && !isImageFromDocument) {\n if(boxWidth && boxHeight && !size && isDocument) {\n setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\n }\n\n return ret;\n }\n\n let noAutoDownload = autoDownloadSize === 0;\n\n if(!size) {\n if(boxWidth === undefined) boxWidth = mediaSizes.active.regular.width;\n if(boxHeight === undefined) boxHeight = mediaSizes.active.regular.height;\n }\n\n container.classList.add('media-container');\n let aspecter = container;\n\n let isFit = true;\n let loadThumbPromise: Promise = Promise.resolve();\n let thumbImage: HTMLImageElement | HTMLCanvasElement;\n // let image: HTMLImageElement;\n let cacheContext: ThumbCache;\n // if(withTail) {\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\n // } else {\n\n if(boxWidth && boxHeight && !size) { // !album\n const set = setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message, undefined, isImageFromDocument ? {\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: THUMB_TYPE_FULL\n } : undefined);\n size = set.photoSize;\n isFit = set.isFit;\n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size.type);\n\n if(!isFit && !isWebDoc) {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-container-aspecter');\n aspecter.style.width = set.size.width + 'px';\n aspecter.style.height = set.size.height + 'px';\n\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur, true);\n if(gotThumb) {\n loadThumbPromise = gotThumb.loadPromise;\n const thumbImage = gotThumb.image; // local scope\n thumbImage.classList.add('media-photo');\n container.append(thumbImage);\n } else {\n const res = await wrapPhoto({\n container,\n message,\n photo,\n boxWidth: 0,\n boxHeight: 0,\n size,\n lazyLoadQueue,\n isOut,\n loadPromises,\n middleware,\n withoutPreloader,\n withTail,\n autoDownloadSize,\n noBlur,\n noThumb: true,\n blurAfter: true,\n managers\n // noFadeIn: true\n });\n const thumbImage = res.images.full;\n thumbImage.classList.add('media-photo', 'thumbnail');\n // container.append(thumbImage);\n }\n\n container.classList.add('media-container-fitted');\n container.append(aspecter);\n }\n } else {\n if(!size) {\n size = choosePhotoSize(photo, boxWidth, boxHeight, true);\n }\n\n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n }\n\n if(!noThumb && !isWebDoc) {\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur);\n if(gotThumb) {\n loadThumbPromise = Promise.all([loadThumbPromise, gotThumb.loadPromise]);\n ret.loadPromises.thumb = ret.loadPromises.full = loadThumbPromise;\n thumbImage = ret.images.thumb = gotThumb.image;\n thumbImage.classList.add('media-photo');\n aspecter.append(thumbImage);\n }\n }\n // }\n\n ret.aspecter = aspecter;\n\n if((size?._ === 'photoSizeEmpty' && isDocument) || (size as PhotoSize.photoStrippedSize)?.bytes) {\n return ret;\n }\n\n let media: HTMLVideoElement | HTMLImageElement;\n if(size?._ === 'videoSize') {\n media = ret.images.full = createVideo();\n media.autoplay = true;\n media.loop = true;\n media.muted = true;\n media.classList.add('media-photo');\n } else {\n media = ret.images.full = new Image();\n media.classList.add('media-photo');\n }\n\n // console.log('wrapPhoto downloaded:', photo, photo.downloaded, container);\n\n const needFadeIn = (thumbImage || !cacheContext.downloaded) && rootScope.settings.animationsEnabled && !noFadeIn;\n\n let preloader: ProgressivePreloader;\n const uploadingFileName = (message as Message.message)?.uploadingFileName;\n if(!withoutPreloader) {\n if(!cacheContext.downloaded || uploadingFileName) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: !!uploadingFileName\n });\n }\n\n if(uploadingFileName) { // means upload\n preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\n preloader.attach(container);\n noAutoDownload = undefined;\n }\n }\n\n\n const getDownloadPromise = () => {\n // const promise = isGif && !size ?\n // managers.appDocsManager.downloadDoc(photo, /* undefined, */lazyLoadQueue?.queueId) :\n // managers.appPhotosManager.preloadPhoto(photo, size, lazyLoadQueue?.queueId, noAutoDownload);\n const haveToDownload = isImageFromDocument && !size;\n const promise = appDownloadManager.downloadMediaURL({\n media: photo,\n thumb: size,\n queueId: lazyLoadQueue?.queueId,\n onlyCache: haveToDownload ? undefined : noAutoDownload\n });\n\n return promise;\n };\n\n const renderOnLoad = (url: string) => {\n return renderMediaWithFadeIn(container, media, url, needFadeIn, aspecter, thumbImage);\n };\n\n const onLoad = async(url: string) => {\n if(middleware && !middleware()) return;\n\n if(processUrl) {\n url = await processUrl(url);\n }\n\n if(blurAfter) {\n const result = blur(url, 12);\n return result.promise.then(() => {\n // image = result.canvas;\n return renderOnLoad(result.canvas.toDataURL());\n });\n }\n\n return renderOnLoad(url);\n };\n\n let loadPromise: Promise;\n const canAttachPreloader = (\n (size as PhotoSize.photoSize).w >= 150 &&\n (size as PhotoSize.photoSize).h >= 150\n ) || noAutoDownload;\n const load = async() => {\n if(noAutoDownload && !withoutPreloader && preloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n const promise = getDownloadPromise();\n const cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n if(\n preloader &&\n !cacheContext.downloaded &&\n !withoutPreloader &&\n canAttachPreloader\n ) {\n preloader.attach(container, false, promise);\n }\n\n noAutoDownload = undefined;\n\n const renderPromise = promise.then(onLoad);\n renderPromise.catch(noop);\n return {download: promise, render: renderPromise};\n };\n\n if(preloader) {\n preloader.setDownloadFunction(load);\n }\n\n if(cacheContext.downloaded) {\n loadThumbPromise = loadPromise = (await load()).render;\n } else {\n if(!lazyLoadQueue) loadPromise = (await load()).render;\n /* else if(noAutoDownload) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(container);\n } */ else lazyLoadQueue.push({div: container, load: () => load().then(({download}) => download)});\n }\n\n if(loadPromises && loadThumbPromise) {\n loadPromises.push(loadThumbPromise);\n }\n\n // const perf = performance.now();\n await loadThumbPromise;\n ret.loadPromises.thumb = loadThumbPromise;\n ret.loadPromises.full = loadPromise || Promise.resolve();\n ret.preloader = preloader;\n\n // const elapsedTime = performance.now() - perf;\n // if(elapsedTime > 4) {\n // console.log('wrapping photo thumb time', elapsedTime, photo, size);\n // }\n\n return ret;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport getMessageSenderPeerIdOrName from '../../lib/appManagers/utils/messages/getMessageSenderPeerIdOrName';\nimport {i18n} from '../../lib/langPack';\nimport rootScope from '../../lib/rootScope';\nimport wrapPeerTitle from './peerTitle';\n\nexport default async function wrapSenderToPeer(message: MyMessage) {\n const senderTitle: HTMLElement = document.createElement('span');\n senderTitle.classList.add('sender-title');\n\n const fromMe = message.fromId === rootScope.myId && message.peerId !== rootScope.myId;\n senderTitle.append(\n fromMe ?\n i18n('FromYou') :\n await wrapPeerTitle({\n ...getMessageSenderPeerIdOrName(message),\n dialog: message.peerId === rootScope.myId\n })\n );\n\n if(await rootScope.managers.appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = await wrapPeerTitle({peerId: message.peerId});\n senderTitle.append(' ➝ ', peerTitle);\n }\n\n return senderTitle;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatDateAccordingToTodayNew} from '../../helpers/date';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\n\nexport default function wrapSentTime(message: MyMessage) {\n const el: HTMLElement = document.createElement('span');\n el.classList.add('sent-time');\n el.append(formatDateAccordingToTodayNew(new Date(message.date * 1000)));\n\n return el;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport assumeType from '../../helpers/assumeType';\nimport getPathFromBytes from '../../helpers/bytes/getPathFromBytes';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport computeLockColor from '../../helpers/computeLockColor';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport renderImageFromUrl, {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport getImageFromStrippedThumb from '../../helpers/getImageFromStrippedThumb';\nimport getPreviewURLFromThumb from '../../helpers/getPreviewURLFromThumb';\nimport makeError from '../../helpers/makeError';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport {isSavingLottiePreview, saveLottiePreview} from '../../helpers/saveLottiePreview';\nimport throttle from '../../helpers/schedulers/throttle';\nimport sequentialDom from '../../helpers/sequentialDom';\nimport {PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport type RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport webpWorkerController from '../../lib/webp/webpWorkerController';\nimport {Awaited, SendMessageEmojiInteractionData} from '../../types';\nimport {getEmojiToneIndex} from '../../vendor/emoji';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport PopupStickers from '../popups/stickers';\nimport {hideToast, toastNew} from '../toast';\nimport wrapStickerAnimation from './stickerAnimation';\nimport framesCache from '../../helpers/framesCache';\n\n// https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/history/view/media/history_view_sticker.cpp#L40\nexport const STICKER_EFFECT_MULTIPLIER = 1 + 0.245 * 2;\nconst EMOJI_EFFECT_MULTIPLIER = 3;\n\nconst locksUrls: {[docId: string]: string} = {};\n\nexport const videosCache: {[key: string]: Promise} = {};\n\nexport default async function wrapSticker({doc, div, middleware, loadStickerMiddleware, lazyLoadQueue, exportLoad, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn, needUpscale, skipRatio, static: asStatic, managers = rootScope.managers, fullThumb, isOut, noPremium, withLock, relativeEffect, loopEffect, isCustomEmoji, syncedVideo}: {\n doc: MyDocument,\n div: HTMLElement | HTMLElement[],\n middleware?: Middleware,\n loadStickerMiddleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n exportLoad?: number,\n group?: AnimationItemGroup,\n play?: boolean,\n onlyThumb?: boolean,\n emoji?: string,\n width?: number,\n height?: number,\n withThumb?: boolean,\n loop?: RLottiePlayer['loop'],\n loadPromises?: Promise[],\n needFadeIn?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n static?: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | VideoSize,\n isOut?: boolean,\n noPremium?: boolean,\n withLock?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean,\n isCustomEmoji?: boolean,\n syncedVideo?: boolean\n}) {\n div = Array.isArray(div) ? div : [div];\n\n if(isCustomEmoji) {\n emoji = doc.stickerEmojiRaw;\n }\n\n const stickerType = doc.sticker;\n if(stickerType === 1) {\n asStatic = true;\n }\n\n if(!width && !height) {\n const sizes = mediaSizes.active;\n const boxSize = emoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\n const size = makeMediaSize(doc.w, doc.h).aspectFitted(boxSize);\n width = size.width;\n height = size.height;\n }\n\n if(stickerType === 2) {\n // LottieLoader.loadLottie();\n lottieLoader.loadLottieWorkers();\n }\n\n div.forEach((div) => {\n div.dataset.docId = '' + doc.id;\n if(emoji) {\n div.dataset.stickerEmoji = emoji;\n }\n\n div.classList.add('media-sticker-wrapper');\n });\n\n /* if(stickerType === 3) {\n const videoRes = wrapVideo({\n doc,\n boxWidth: width,\n boxHeight: height,\n container: div,\n group,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n noPlayButton: true,\n noInfo: true\n });\n\n if(videoRes.thumb) {\n if(videoRes.thumb.images.thumb) {\n videoRes.thumb.images.thumb.classList.add('media-sticker', 'thumbnail');\n }\n\n if(videoRes.thumb.images.full) {\n videoRes.thumb.images.full.classList.add('media-sticker');\n }\n }\n\n return videoRes.loadPromise;\n } */\n\n // console.log('wrap sticker', doc, div, onlyThumb);\n\n let cacheContext: ThumbCache;\n const getCacheContext = async(type: string = cacheContext?.type) => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, type);\n };\n\n const isAnimated = !asStatic && (stickerType === 2 || stickerType === 3);\n\n const effectThumb = getStickerEffectThumb(doc);\n if(isOut !== undefined && effectThumb && !isOut) {\n div.forEach((div) => div.classList.add('reflect-x'));\n }\n\n const willHaveLock = effectThumb && withLock;\n if(willHaveLock) {\n const lockUrl = locksUrls[doc.id];\n div.forEach((div) => {\n div.classList.add('is-premium-sticker', 'tgico-premium_lock');\n lockUrl && div.style.setProperty('--lock-url', `url(${lockUrl})`);\n });\n }\n\n if(asStatic && stickerType !== 1) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n await getCacheContext(thumb.type);\n } else {\n await getCacheContext(fullThumb?.type);\n }\n\n const toneIndex = emoji && !isCustomEmoji ? getEmojiToneIndex(emoji) : -1;\n const downloaded = cacheContext.downloaded && !needFadeIn;\n\n const isThumbNeededForType = isAnimated;\n const lottieCachedThumb = stickerType === 2 || stickerType === 3 ? await managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex) : undefined;\n\n const ret = {render: undefined as typeof loadPromise, load: undefined as typeof load};\n let loadThumbPromise = deferredPromise();\n let haveThumbCached = false;\n if((\n doc.thumbs?.length ||\n lottieCachedThumb\n ) &&\n !div[0].firstElementChild && (\n !downloaded ||\n isThumbNeededForType ||\n onlyThumb\n ) && withThumb !== false/* && doc.thumbs[0]._ !== 'photoSizeEmpty' */\n ) {\n let thumb = lottieCachedThumb || doc.thumbs[0];\n\n // console.log('wrap sticker', thumb, div);\n\n const afterRender = (div: HTMLElement, thumbImage: HTMLElement) => {\n if(!div.childElementCount) {\n thumbImage.classList.add('media-sticker', 'thumbnail');\n\n sequentialDom.mutateElement(div, () => {\n div.append(thumbImage);\n loadThumbPromise.resolve();\n });\n } else {\n loadThumbPromise.resolve();\n }\n };\n\n if('url' in thumb) {\n haveThumbCached = true;\n div.forEach((div) => {\n const thumbImage = new Image();\n renderImageFromUrl(thumbImage, (thumb as any).url, () => afterRender(div, thumbImage));\n });\n } else if('bytes' in thumb) {\n if(thumb._ === 'photoPathSize') {\n if(!thumb.bytes.length) {\n thumb = doc.thumbs.find((t) => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\n }\n\n const d = getPathFromBytes((thumb as PhotoSize.photoStrippedSize).bytes);\n const ns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(ns, 'svg');\n svg.classList.add('rlottie-vector', 'media-sticker', 'thumbnail');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${doc.w || 512} ${doc.h || 512}`);\n\n // const defs = document.createElementNS(ns, 'defs');\n // const linearGradient = document.createElementNS(ns, 'linearGradient');\n // linearGradient.setAttributeNS(null, 'id', 'g');\n // linearGradient.setAttributeNS(null, 'x1', '-300%');\n // linearGradient.setAttributeNS(null, 'x2', '-200%');\n // linearGradient.setAttributeNS(null, 'y1', '0');\n // linearGradient.setAttributeNS(null, 'y2', '0');\n // const stops = [\n // ['-10%', '.1'],\n // ['30%', '.07'],\n // ['70%', '.07'],\n // ['110%', '.1']\n // ].map(([offset, stopOpacity]) => {\n // const stop = document.createElementNS(ns, 'stop');\n // stop.setAttributeNS(null, 'offset', offset);\n // stop.setAttributeNS(null, 'stop-opacity', stopOpacity);\n // return stop;\n // });\n // const animates = [\n // ['-300%', '1200%'],\n // ['-200%', '1300%']\n // ].map(([from, to], idx) => {\n // const animate = document.createElementNS(ns, 'animate');\n // animate.setAttributeNS(null, 'attributeName', 'x' + (idx + 1));\n // animate.setAttributeNS(null, 'from', from);\n // animate.setAttributeNS(null, 'to', to);\n // animate.setAttributeNS(null, 'dur', '3s');\n // animate.setAttributeNS(null, 'repeatCount', 'indefinite');\n // return animate;\n // });\n // linearGradient.append(...stops, ...animates);\n // defs.append(linearGradient);\n // svg.append(defs);\n\n const path = document.createElementNS(ns, 'path');\n path.setAttributeNS(null, 'd', d);\n if(rootScope.settings.animationsEnabled && !isCustomEmoji) path.setAttributeNS(null, 'fill', 'url(#g)');\n svg.append(path);\n div.forEach((div, idx) => div.append(idx > 0 ? svg.cloneNode(true) : svg));\n haveThumbCached = true;\n loadThumbPromise.resolve();\n } else if(toneIndex <= 0) {\n const r = () => {\n (div as HTMLElement[]).forEach((div) => {\n const thumbImage = new Image();\n const url = getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage));\n });\n };\n\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\n haveThumbCached = true;\n r();\n } else {\n haveThumbCached = true;\n webpWorkerController.convert('main-' + doc.id, thumb.bytes).then((bytes) => {\n managers.appDocsManager.saveWebPConvertedStrippedThumb(doc.id, bytes);\n (thumb as PhotoSize.photoStrippedSize).bytes = bytes;\n doc.pFlags.stickerThumbConverted = true;\n\n if((middleware && !middleware()) || (div as HTMLElement[])[0].childElementCount) {\n loadThumbPromise.resolve();\n return;\n }\n\n r();\n }).catch(() => loadThumbPromise.resolve());\n }\n }\n } else if(((stickerType === 2 && toneIndex <= 0) || stickerType === 3) && (withThumb || onlyThumb)) {\n const load = async() => {\n if((div as HTMLElement[])[0].childElementCount || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n const r = (div: HTMLElement, thumbImage: HTMLElement, url: string) => {\n if(div.childElementCount || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n if(!url) afterRender(div, thumbImage);\n else renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage));\n };\n\n await getCacheContext();\n (div as HTMLElement[]).forEach((div) => {\n if(cacheContext.url) {\n r(div, new Image(), cacheContext.url);\n } else if('bytes' in thumb) {\n const res = getImageFromStrippedThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n res.loadPromise.then(() => r(div, res.image, ''));\n\n // return managers.appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\n } else {\n appDownloadManager.downloadMediaURL({\n media: doc,\n thumb: thumb as PhotoSize\n }).then(async(url) => {\n return r(div, new Image(), url);\n });\n }\n });\n };\n\n if(lazyLoadQueue && onlyThumb) {\n lazyLoadQueue.push({div: div[0], load});\n loadThumbPromise.resolve();\n return ret;\n } else {\n load();\n\n if((thumb as any).url) {\n haveThumbCached = true;\n }\n }\n }\n }\n\n if(loadPromises && haveThumbCached) {\n loadPromises.push(loadThumbPromise);\n }\n\n if(onlyThumb/* || true */) { // for sticker panel\n return ret;\n }\n\n const middlewareError = makeError('MIDDLEWARE');\n const load = async() => {\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n if(stickerType === 2 && !asStatic) {\n return appDownloadManager.downloadMedia({media: doc, queueId: lazyLoadQueue?.queueId, thumb: fullThumb})\n .then(async(blob) => {\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n const animation = await lottieLoader.loadAnimationWorker({\n container: (div as HTMLElement[])[0],\n loop: !!(!emoji || isCustomEmoji) && loop,\n autoplay: play,\n animationData: blob,\n width,\n height,\n name: 'doc' + doc.id,\n needUpscale,\n skipRatio,\n toneIndex,\n sync: isCustomEmoji,\n middleware: loadStickerMiddleware ?? middleware,\n group\n });\n\n // const deferred = deferredPromise();\n\n const setLockColor = willHaveLock ? () => {\n const lockUrl = locksUrls[doc.id] ??= computeLockColor(animation.canvas[0]);\n (div as HTMLElement[]).forEach((div) => div.style.setProperty('--lock-url', `url(${lockUrl})`));\n } : undefined;\n\n const onFirstFrame = (container: HTMLElement, canvas: HTMLCanvasElement) => {\n const element = container.firstElementChild;\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\n }\n\n const cb = () => {\n if(element && element !== canvas && element.tagName !== 'DIV') {\n element.remove();\n }\n };\n\n if(!needFadeIn) {\n if(element) {\n sequentialDom.mutate(cb);\n }\n } else {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.add('fade-in');\n if(element) {\n element.classList.add('fade-out');\n }\n\n (canvas || element).addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.remove('fade-in');\n cb();\n });\n }, {once: true});\n });\n }\n };\n\n animation.addEventListener('firstFrame', () => {\n const canvas = animation.canvas[0];\n if(withThumb !== false || isCustomEmoji) {\n saveLottiePreview(doc, canvas, toneIndex);\n }\n\n if(willHaveLock) {\n setLockColor();\n }\n\n if(!isCustomEmoji) {\n (div as HTMLElement[]).forEach((container, idx) => {\n onFirstFrame(container, animation.canvas[idx]);\n });\n }\n }, {once: true});\n\n if(emoji) {\n managers.appStickersManager.preloadAnimatedEmojiStickerAnimation(emoji);\n }\n\n return animation;\n\n // return deferred;\n // await new Promise((resolve) => setTimeout(resolve, 5e3));\n });\n } else if(asStatic || stickerType === 3) {\n const isSingleVideo = isAnimated && syncedVideo;\n const cacheName = isSingleVideo ? framesCache.generateName('' + doc.id, 0, 0, undefined, undefined) : undefined;\n\n const cachePromise = videosCache[cacheName];\n if(cachePromise) {\n return cachePromise as typeof promise;\n }\n\n const d = isSingleVideo ? (div as HTMLElement[]).slice(0, 1) : div as HTMLElement[];\n const media: HTMLElement[] = d.map(() => {\n let media: HTMLElement;\n if(asStatic) {\n media = new Image();\n } else {\n const video = media = createVideo();\n video.muted = true;\n if(play) video.autoplay = true;\n if(loop) video.loop = true;\n\n if(loop && typeof(loop) === 'number') {\n let previousTime = 0, playedTimes = 0;\n function onTimeupdate(this: HTMLVideoElement) {\n if(previousTime > this.currentTime && ++playedTimes === loop as number) {\n this.autoplay = false;\n this.loop = false;\n this.pause();\n video.removeEventListener('timeupdate', onTimeupdate);\n }\n\n previousTime = this.currentTime;\n }\n\n video.addEventListener('timeupdate', onTimeupdate);\n }\n }\n\n media.classList.add('media-sticker');\n return media;\n });\n\n const thumbImage = (div as HTMLElement[]).map((div, idx) => (div.firstElementChild as HTMLElement) !== media[idx] && div.firstElementChild) as HTMLElement[];\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !downloaded || (asStatic ? thumbImage[0] : (!thumbImage[0] || thumbImage[0].tagName === 'svg'))) && rootScope.settings.animationsEnabled;\n }\n\n if(needFadeIn) {\n media.forEach((media) => media.classList.add('fade-in'));\n }\n\n const promise = new Promise(async(resolve, reject) => {\n const r = async() => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n const mediaLength = media.length;\n const loaded: HTMLElement[] = [];\n const onLoad = (div: HTMLElement, media: HTMLElement, thumbImage: HTMLElement) => {\n sequentialDom.mutateElement(div, () => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n if(!media) {\n if(!isSingleVideo || !isAnimated) {\n thumbImage?.remove();\n }\n\n return;\n }\n\n if(media as HTMLVideoElement) {\n const w = width * window.devicePixelRatio;\n const h = height * window.devicePixelRatio;\n if(!isSavingLottiePreview(doc, toneIndex, w, h)) {\n // const perf = performance.now();\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(media as HTMLVideoElement, 0, 0, canvas.width, canvas.height);\n saveLottiePreview(doc, canvas, toneIndex);\n // console.log('perf', performance.now() - perf);\n }\n }\n\n if(isSingleVideo) {\n resolve(media as any);\n return;\n }\n\n div.append(media);\n\n if(needFadeIn) {\n thumbImage && thumbImage.classList.add('fade-out');\n media.addEventListener('animationend', () => {\n media.classList.remove('fade-in');\n thumbImage?.remove();\n }, {once: true});\n } else {\n thumbImage?.remove();\n }\n\n if(isAnimated) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group, undefined, middleware);\n }\n\n if(loaded.push(media) === mediaLength) {\n resolve(loaded as any);\n }\n });\n };\n\n await getCacheContext();\n let lastPromise: Promise;\n (div as HTMLElement[]).forEach((div, idx) => {\n const _media = media[idx];\n const cb = () => onLoad(div, _media, thumbImage[idx]);\n if(_media) lastPromise = renderImageFromUrlPromise(_media, cacheContext.url);\n lastPromise.then(cb);\n });\n };\n\n await getCacheContext();\n if(cacheContext.url) r();\n else {\n let promise: Promise;\n if(stickerType !== 1 && asStatic) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n // promise = managers.appDocsManager.getThumbURL(doc, thumb).promise\n promise = appDownloadManager.downloadMediaURL({media: doc, thumb, queueId: lazyLoadQueue?.queueId});\n } else {\n promise = appDownloadManager.downloadMediaURL({media: doc, queueId: lazyLoadQueue?.queueId});\n }\n\n promise.then(r, reject);\n }\n });\n\n if(cacheName) {\n videosCache[cacheName] = promise as any;\n loadStickerMiddleware && promise.finally(() => {\n if(!loadStickerMiddleware()) {\n delete videosCache[cacheName];\n }\n });\n }\n\n return promise;\n }\n };\n\n if(exportLoad && ((exportLoad === 1 && (!downloaded || isAnimated)) || exportLoad === 2)) {\n ret.load = load;\n return ret;\n }\n\n const loadPromise: Promise> | void> = lazyLoadQueue && (!downloaded || isAnimated) ?\n (lazyLoadQueue.push({div: div[0], load}), Promise.resolve()) :\n load();\n\n if(downloaded && (asStatic/* || stickerType === 3 */)) {\n loadThumbPromise = loadPromise as any;\n if(loadPromises) {\n loadPromises.push(loadThumbPromise);\n }\n }\n\n if(stickerType === 2 && effectThumb && isOut !== undefined && !noPremium) {\n attachStickerEffectHandler({\n container: div[0],\n doc,\n managers,\n middleware,\n isOut,\n width,\n loadPromise,\n relativeEffect,\n loopEffect\n });\n }\n\n ret.render = loadPromise as any;\n return ret;\n}\n\nfunction attachStickerEffectHandler({container, doc, managers, middleware, isOut, width, loadPromise, relativeEffect, loopEffect}: {\n container: HTMLElement,\n doc: MyDocument,\n managers: AppManagers,\n middleware: Middleware,\n isOut: boolean,\n width: number,\n loadPromise: Promise,\n relativeEffect?: boolean,\n loopEffect?: boolean\n}) {\n managers.appStickersManager.preloadSticker(doc.id, true);\n\n let playing = false;\n attachClickEvent(container, async(e) => {\n cancelEvent(e);\n if(playing) {\n const a = document.createElement('a');\n a.onclick = () => {\n hideToast();\n new PopupStickers(doc.stickerSetInput).show();\n };\n\n toastNew({\n langPackKey: 'Sticker.Premium.Click.Info',\n langPackArguments: [a]\n });\n\n return;\n }\n\n playing = true;\n\n await loadPromise;\n const {animationDiv, stickerPromise} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: width * STICKER_EFFECT_MULTIPLIER,\n target: container,\n play: true,\n fullThumb: getStickerEffectThumb(doc),\n relativeEffect,\n loopEffect\n });\n\n if(isOut !== undefined && !isOut/* && !relativeEffect */) {\n animationDiv.classList.add('reflect-x');\n }\n\n stickerPromise.then((player) => {\n player.addEventListener('destroy', () => {\n playing = false;\n });\n });\n });\n}\n\nexport async function onEmojiStickerClick({event, container, managers, peerId, middleware}: {\n event: Event,\n container: HTMLElement,\n managers: AppManagers,\n peerId: PeerId,\n middleware: Middleware\n}) {\n cancelEvent(event);\n\n const bubble = findUpClassName(container, 'bubble');\n const emoji = container.dataset.stickerEmoji;\n\n const animation = !container.classList.contains('custom-emoji') ? lottieLoader.getAnimation(container) : undefined;\n if(animation?.paused) {\n const doc = await managers.appStickersManager.getAnimatedEmojiSoundDocument(emoji);\n if(doc) {\n const audio = document.createElement('audio');\n audio.style.display = 'none';\n container.parentElement.append(audio);\n\n try {\n const url = await appDownloadManager.downloadMediaURL({media: doc});\n\n audio.src = url;\n audio.play();\n await onMediaLoad(audio, undefined, true);\n\n audio.addEventListener('ended', () => {\n audio.src = '';\n audio.remove();\n }, {once: true});\n } catch(err) {\n\n }\n }\n\n animation.autoplay = true;\n animation.restart();\n }\n\n if(!peerId.isUser()) {\n return;\n }\n\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji, true);\n if(!doc) {\n return;\n }\n\n const data: SendMessageEmojiInteractionData = (container as any).emojiData ??= {\n a: [],\n v: 1\n };\n\n const sendInteractionThrottled: () => void = (container as any).sendInteractionThrottled = throttle(() => {\n const length = data.a.length;\n if(!length) {\n return;\n }\n\n const firstTime = data.a[0].t;\n\n data.a.forEach((a) => {\n a.t = (a.t - firstTime) / 1000;\n });\n\n const bubble = findUpClassName(container, 'bubble');\n managers.appMessagesManager.setTyping(appImManager.chat.peerId, {\n _: 'sendMessageEmojiInteraction',\n msg_id: getServerMessageId(+bubble.dataset.mid),\n emoticon: emoji,\n interaction: {\n _: 'dataJSON',\n data: JSON.stringify(data)\n }\n }, true, appImManager.chat.threadId);\n\n data.a.length = 0;\n }, 1000, false);\n\n const isOut = bubble ? bubble.classList.contains('is-out') : undefined;\n const {animationDiv} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: 360,\n target: container,\n play: true,\n withRandomOffset: true\n });\n\n if(isOut !== undefined && !isOut) {\n animationDiv.classList.add('reflect-x');\n }\n\n // using a trick here: simulated event from interlocutor's interaction won't fire ours\n if(event.isTrusted) {\n data.a.push({\n i: 1,\n t: Date.now()\n });\n\n sendInteractionThrottled();\n }\n // });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n/**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\nexport default function getPathFromBytes(bytes: Uint8Array) {\n const lookup = 'AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,';\n\n let path = 'M';\n for(let i = 0, length = bytes.length; i < length; ++i) {\n const num = bytes[i];\n\n if(num >= (128 + 64)) {\n path += lookup[num - 128 - 64];\n } else {\n if(num >= 128) {\n path += ',';\n } else if(num >= 64) {\n path += '-';\n }\n path += '' + (num & 63);\n }\n }\n path += 'z';\n\n return path;\n}\n","// https://github.com/telegramdesktop/tdesktop/blob/543bfab24a76402992421063f1e6444f347d31fe/Telegram/SourceFiles/boxes/sticker_set_box.cpp#L75\nexport default function computeLockColor(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n const size = 20 * (canvas.dpr ?? 1);\n const width = size;\n const height = size;\n const skipx = (canvas.width - width) / 2;\n const margin = 0/* * (canvas.dpr ?? 1) */;\n const skipy = canvas.height - height - margin;\n const imageData = context.getImageData(skipx, skipy, width, height).data;\n let sr = 0, sg = 0, sb = 0, sa = 0;\n for(let i = 0; i < imageData.length; i += 4) {\n sr += imageData[i];\n sg += imageData[i + 1];\n sb += imageData[i + 2];\n sa += imageData[i + 3];\n }\n\n const outCanvas = document.createElement('canvas');\n outCanvas.width = size;\n outCanvas.height = size;\n const outContext = outCanvas.getContext('2d');\n const color = new Uint8ClampedArray([sr * 255 / sa, sg * 255 / sa, sb * 255 / sa, 255]);\n const rgba = `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})`;\n outContext.fillStyle = rgba;\n outContext.fillRect(0, 0, outCanvas.width, outCanvas.height);\n outContext.fillStyle = `rgba(112, 117, 121, 0.3)`;\n outContext.fillRect(0, 0, outCanvas.width, outCanvas.height);\n // document.querySelector('.popup-title').append(c);\n return outCanvas.toDataURL('image/jpeg');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport assumeType from '../../helpers/assumeType';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport makeError from '../../helpers/makeError';\nimport {getMiddleware, Middleware} from '../../helpers/middleware';\nimport throttleWithRaf from '../../helpers/schedulers/throttleWithRaf';\nimport windowSize from '../../helpers/windowSize';\nimport {PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport wrapSticker from './sticker';\n\nexport default function wrapStickerAnimation({\n size,\n doc,\n middleware,\n target,\n side,\n skipRatio,\n play,\n managers,\n fullThumb,\n withRandomOffset,\n relativeEffect,\n loopEffect\n}: {\n size: number,\n doc: MyDocument,\n middleware?: Middleware,\n target: HTMLElement,\n side: 'left' | 'center' | 'right',\n skipRatio?: number,\n play: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | VideoSize,\n withRandomOffset?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean\n}) {\n const animationDiv = document.createElement('div');\n animationDiv.classList.add('emoji-animation');\n\n // const size = 280;\n animationDiv.style.width = size + 'px';\n animationDiv.style.height = size + 'px';\n\n let animation: RLottiePlayer;\n const unmountAnimation = () => {\n middlewareHelper.clean();\n animation?.remove();\n animationDiv.remove();\n appImManager.chat.bubbles.scrollable.container.removeEventListener('scroll', onScroll);\n };\n\n const middlewareHelper = middleware?.create() ?? getMiddleware();\n middleware = middlewareHelper.get();\n\n const stickerPromise = wrapSticker({\n div: animationDiv,\n doc,\n middleware,\n withThumb: false,\n needFadeIn: false,\n loop: !!loopEffect,\n width: size,\n height: size,\n play,\n group: 'none',\n skipRatio,\n managers,\n fullThumb\n }).then(({render}) => render).then((_animation) => {\n assumeType(_animation);\n if(!middleware()) {\n _animation.remove();\n throw makeError('MIDDLEWARE');\n }\n\n animation = _animation;\n animation.addEventListener('enterFrame', (frameNo) => {\n if((!loopEffect && frameNo === animation.maxFrame) || !isInDOM(target)) {\n unmountAnimation();\n }\n });\n\n if(IS_VIBRATE_SUPPORTED) {\n animation.addEventListener('firstFrame', () => {\n navigator.vibrate(100);\n }, {once: true});\n }\n\n return animation;\n });\n\n const generateRandomSigned = (max: number) => {\n const r = Math.random() * max * 2;\n return r > max ? -r % max : r;\n };\n\n const randomOffsetX = withRandomOffset ? generateRandomSigned(16) : 0;\n const randomOffsetY = withRandomOffset ? generateRandomSigned(4) : 0;\n const setPosition = () => {\n if(!isInDOM(target)) {\n unmountAnimation();\n return;\n }\n\n const rect = target.getBoundingClientRect();\n\n const factor = rect.width / 200;\n const stableOffsetX = side === 'center' ? 0 : 16 * (side === 'right' ? 1 : -1) * factor;\n // const stableOffsetY = side === 'center' ? 0 : -50 * factor;\n const stableOffsetY = side === 'center' ? 0 : 0 * factor;\n\n const rectX = side === 'right' ? rect.right : rect.left;\n const rectY = rect.top;\n\n const addOffsetX = (side === 'center' ? (rect.width - size) / 2 : (side === 'right' ? -size : 0)) + stableOffsetX + randomOffsetX;\n const addOffsetY = (side === 'center' || true ? (rect.height - size) / 2 : 0) + stableOffsetY + randomOffsetY;\n const x = rectX + addOffsetX;\n const y = rectY + addOffsetY;\n\n if(y <= -size || y >= windowSize.height) {\n unmountAnimation();\n return;\n }\n\n if(relativeEffect) {\n if(side !== 'center') animationDiv.style[side] = Math.abs(stableOffsetX) * -1 + 'px';\n else animationDiv.style.left = addOffsetX + 'px';\n animationDiv.style.top = addOffsetY + 'px';\n } else {\n animationDiv.style.top = y + 'px';\n animationDiv.style.left = x + 'px';\n }\n };\n\n const onScroll = throttleWithRaf(setPosition);\n appImManager.chat.bubbles.scrollable.container.addEventListener('scroll', onScroll);\n\n setPosition();\n\n if(relativeEffect) {\n animationDiv.classList.add('is-relative');\n target.parentElement.append(animationDiv);\n } else {\n appImManager.emojiAnimationContainer.append(animationDiv);\n }\n\n return {animationDiv, stickerPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport wrapSticker from './sticker'\nimport {Modify} from '../../types';\n\nexport default async function wrapStickerEmoji(options: Modify[0], {\n div: HTMLElement,\n doc?: never\n}>) {\n const {\n emoji,\n div,\n managers = rootScope.managers\n } = options;\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji);\n if(!doc) {\n div.classList.add('media-sticker-wrapper');\n throw new Error('no sticker');\n }\n\n return wrapSticker({\n ...options,\n doc,\n loop: false,\n play: true\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport createVideo from '../../helpers/dom/createVideo';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport {Document, StickerSet} from '../../layer';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport wrapSticker from './sticker';\nimport {Middleware} from '../../helpers/middleware';\n\nexport default async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height, managers = rootScope.managers, middleware}: {\n set: StickerSet.stickerSet,\n lazyLoadQueue: LazyLoadQueue,\n container: HTMLElement,\n group: AnimationItemGroup,\n autoplay: boolean,\n width: number,\n height: number,\n managers?: AppManagers\n middleware?: Middleware\n}) {\n if(set.thumbs?.length) {\n container.classList.add('media-sticker-wrapper');\n lazyLoadQueue.push({\n div: container,\n load: async() => {\n const downloadOptions = await managers.appStickersManager.getStickerSetThumbDownloadOptions(set);\n const promise = appDownloadManager.download(downloadOptions);\n\n if(set.pFlags.animated && !set.pFlags.videos) {\n return promise\n .then((blob) => {\n lottieLoader.loadAnimationWorker({\n container,\n loop: true,\n autoplay,\n animationData: blob,\n width,\n height,\n needUpscale: true,\n name: 'setThumb' + set.id,\n group,\n middleware\n });\n });\n } else {\n let media: HTMLElement;\n if(set.pFlags.videos) {\n media = createVideo();\n (media as HTMLVideoElement).autoplay = true;\n (media as HTMLVideoElement).muted = true;\n (media as HTMLVideoElement).loop = true;\n } else {\n media = new Image();\n }\n\n media.classList.add('media-sticker');\n\n return promise.then((blob) => {\n renderImageFromUrl(media, URL.createObjectURL(blob), () => {\n container.append(media);\n\n if(set.pFlags.videos) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\n }\n });\n });\n }\n }\n });\n\n return;\n }\n\n let getDocPromise: Promise;\n\n if(set.thumb_document_id) {\n getDocPromise = managers.appEmojiManager.getCustomEmojiDocument(set.thumb_document_id);\n } else {\n getDocPromise = managers.appStickersManager.getStickerSet(set).then((stickerSet) => stickerSet.documents[0]);\n }\n\n const doc = await getDocPromise;\n if(doc._ !== 'documentEmpty') { // as thumb will be used first sticker\n wrapSticker({\n doc,\n div: container,\n group: group,\n lazyLoadQueue,\n managers,\n width,\n height,\n middleware\n }); // kostil\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport Row from '../row';\nimport wrapSticker from './sticker';\n\nexport default function wrapStickerToRow({doc, row, size, managers}: {\n doc: MyDocument,\n row: Row,\n size?: 'small' | 'large',\n managers?: AppManagers\n}) {\n const previousMedia = row.media;\n const media = row.createMedia('small');\n\n if(previousMedia) {\n media.classList.add('hide');\n }\n\n const loadPromises: Promise[] = previousMedia ? [] : undefined;\n\n const _size = size === 'small' ? 32 : 48;\n const result = wrapSticker({\n div: media,\n doc: doc,\n width: _size,\n height: _size,\n loadPromises,\n managers\n }).then(({render}) => render);\n\n loadPromises && Promise.all(loadPromises).then(() => {\n media.classList.remove('hide');\n previousMedia.remove();\n });\n\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {i18n} from '../../lib/langPack';\nimport wrapTelegramUrlToAnchor from '../../lib/richTextProcessor/wrapTelegramUrlToAnchor';\nimport rootScope from '../../lib/rootScope';\nimport wrapPeerTitle from './peerTitle';\n\nexport default async function wrapTopicNameButton(\n options: {\n lastMsgId?: number\n } & Pick[0], 'peerId' | 'threadId' | 'wrapOptions' | 'withIcons'>\n) {\n const {peerId, threadId, lastMsgId} = options;\n\n const loadPromise: Promise = Promise.resolve();\n const a = wrapTelegramUrlToAnchor('t.me/c/' + peerId.toChatId() + (threadId ? '/' + getServerMessageId(threadId) : '') + (lastMsgId ? '/' + getServerMessageId(lastMsgId) : ''));\n a.classList.add('topic-name', 'topic-name-button');\n // if(threadId) {\n // const topic = await rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId);\n // if(!topic) {\n // a.append(i18n('Loading'));\n // loadPromise = rootScope.managers.dialogsStorage.getForumTopicById(peerId, threadId)\n // }\n // } else {\n a.append(await wrapPeerTitle(options));\n // }\n\n return {\n cached: true,\n element: a,\n loadPromise\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport {animateSingle} from '../../helpers/animation';\nimport {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport getStrippedThumbIfNeeded from '../../helpers/getStrippedThumbIfNeeded';\nimport makeError from '../../helpers/makeError';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport noop from '../../helpers/noop';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport {fastRaf} from '../../helpers/schedulers';\nimport throttle from '../../helpers/schedulers/throttle';\nimport sequentialDom from '../../helpers/sequentialDom';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport {Message, PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport rootScope from '../../lib/rootScope';\nimport {ThumbCache} from '../../lib/storages/thumbs';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport appMediaPlaybackController, {MediaSearchContext} from '../appMediaPlaybackController';\nimport {findMediaTargets} from '../audio';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ProgressivePreloader from '../preloader';\nimport wrapPhoto from './photo';\n\nconst MAX_VIDEO_AUTOPLAY_SIZE = 50 * 1024 * 1024; // 50 MB\n\nlet roundVideoCircumference = 0;\nmediaSizes.addEventListener('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n const elements = Array.from(document.querySelectorAll('.media-round .progress-ring')) as SVGSVGElement[];\n const width = mediaSizes.active.round.width;\n const halfSize = width / 2;\n const radius = halfSize - 7;\n roundVideoCircumference = 2 * Math.PI * radius;\n elements.forEach((element) => {\n element.setAttributeNS(null, 'width', '' + width);\n element.setAttributeNS(null, 'height', '' + width);\n\n const circle = element.firstElementChild as SVGCircleElement;\n circle.setAttributeNS(null, 'cx', '' + halfSize);\n circle.setAttributeNS(null, 'cy', '' + halfSize);\n circle.setAttributeNS(null, 'r', '' + radius);\n\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n });\n }\n});\n\nexport default async function wrapVideo({doc, container, message, boxWidth, boxHeight, withTail, isOut, middleware, lazyLoadQueue, noInfo, group, onlyPreview, noPreview, withoutPreloader, loadPromises, noPlayButton, photoSize, videoSize, searchContext, autoDownload, managers = rootScope.managers, noAutoplayAttribute}: {\n doc: MyDocument,\n container?: HTMLElement,\n message?: Message.message,\n boxWidth?: number,\n boxHeight?: number,\n withTail?: boolean,\n isOut?: boolean,\n middleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n noInfo?: boolean,\n noPlayButton?: boolean,\n group?: AnimationItemGroup,\n onlyPreview?: boolean,\n noPreview?: boolean,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n photoSize?: PhotoSize,\n videoSize?: VideoSize,\n searchContext?: MediaSearchContext,\n managers?: AppManagers,\n noAutoplayAttribute?: boolean\n}) {\n const autoDownloadSize = autoDownload?.video;\n let noAutoDownload = autoDownloadSize === 0;\n const isAlbumItem = !(boxWidth && boxHeight);\n const canAutoplay = /* doc.sticker || */(\n (\n doc.type !== 'video' || (\n doc.size <= MAX_VIDEO_AUTOPLAY_SIZE &&\n !isAlbumItem\n )\n ) && (doc.type === 'gif' ? rootScope.settings.autoPlay.gifs : rootScope.settings.autoPlay.videos)\n );\n let spanTime: HTMLElement, spanPlay: HTMLElement;\n\n if(!noInfo) {\n spanTime = document.createElement('span');\n spanTime.classList.add('video-time');\n container.append(spanTime);\n\n let needPlayButton = false;\n if(doc.type !== 'gif') {\n spanTime.innerText = toHHMMSS(doc.duration, false);\n\n if(!noPlayButton && doc.type !== 'round') {\n if(canAutoplay && !noAutoDownload) {\n spanTime.classList.add('tgico', 'can-autoplay');\n } else {\n needPlayButton = true;\n }\n }\n } else {\n spanTime.innerText = 'GIF';\n\n if(!canAutoplay && !noPlayButton) {\n needPlayButton = true;\n noAutoDownload = undefined;\n }\n }\n\n if(needPlayButton) {\n spanPlay = document.createElement('span');\n spanPlay.classList.add('video-play', 'tgico-largeplay', 'btn-circle', 'position-center');\n container.append(spanPlay);\n }\n }\n\n const res: {\n thumb?: typeof photoRes,\n loadPromise: Promise\n } = {} as any;\n\n if(doc.mime_type === 'image/gif') {\n const photoRes = await wrapPhoto({\n photo: doc,\n message,\n container,\n boxWidth,\n boxHeight,\n withTail,\n isOut,\n lazyLoadQueue,\n middleware,\n withoutPreloader,\n loadPromises,\n autoDownloadSize,\n size: photoSize,\n managers\n });\n\n res.thumb = photoRes;\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n /* const video = doc.type === 'round' ? appMediaPlaybackController.addMedia(doc, message.mid) as HTMLVideoElement : document.createElement('video');\n if(video.parentElement) {\n video.remove();\n } */\n\n let preloader: ProgressivePreloader; // it must be here, otherwise will get error before initialization in round onPlay\n\n const video = createVideo();\n video.classList.add('media-video');\n video.muted = true;\n if(doc.type === 'round') {\n const divRound = document.createElement('div');\n divRound.classList.add('media-round', 'z-depth-1');\n divRound.dataset.mid = '' + message.mid;\n divRound.dataset.peerId = '' + message.peerId;\n (divRound as any).message = message;\n\n const size = mediaSizes.active.round;\n const halfSize = size.width / 2;\n const strokeWidth = 3.5;\n const radius = halfSize - (strokeWidth * 2);\n divRound.innerHTML = `\n \n `;\n\n const circle = divRound.firstElementChild.firstElementChild as SVGCircleElement;\n if(!roundVideoCircumference) {\n roundVideoCircumference = 2 * Math.PI * radius;\n }\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n\n spanTime.classList.add('tgico');\n\n const isUnread = message.pFlags.media_unread;\n if(isUnread) {\n divRound.classList.add('is-unread');\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = doc.w/* * window.devicePixelRatio */;\n\n divRound.prepend(canvas, spanTime);\n divRound.append(video);\n container.append(divRound);\n\n const ctx = canvas.getContext('2d');\n /* ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2);\n ctx.clip(); */\n\n const onLoad = () => {\n const message: Message.message = (divRound as any).message;\n const globalVideo = appMediaPlaybackController.addMedia(message, !noAutoDownload) as HTMLVideoElement;\n const clear = () => {\n (appImManager.chat.setPeerPromise || Promise.resolve()).finally(() => {\n if(isInDOM(globalVideo)) {\n return;\n }\n\n globalVideo.removeEventListener('play', onPlay);\n globalVideo.removeEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.removeEventListener('pause', onPaused);\n globalVideo.removeEventListener('ended', onEnded);\n });\n };\n\n const onFrame = () => {\n ctx.drawImage(globalVideo, 0, 0);\n\n const offset = roundVideoCircumference - globalVideo.currentTime / globalVideo.duration * roundVideoCircumference;\n circle.style.strokeDashoffset = '' + offset;\n\n return !globalVideo.paused;\n };\n\n const onTimeUpdate = () => {\n if(!globalVideo.duration) {\n return;\n }\n\n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n\n if(globalVideo.paused) {\n onFrame();\n }\n\n spanTime.innerText = toHHMMSS(globalVideo.duration - globalVideo.currentTime, false);\n };\n\n const throttledTimeUpdate = throttle(() => {\n fastRaf(onTimeUpdate);\n }, 1000, false);\n\n const onPlay = () => {\n video.classList.add('hide');\n divRound.classList.remove('is-paused');\n animateSingle(onFrame, canvas);\n\n if(preloader && preloader.preloader && preloader.preloader.classList.contains('manual')) {\n preloader.onClick();\n }\n };\n\n const onPaused = () => {\n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n\n divRound.classList.add('is-paused');\n };\n\n const onEnded = () => {\n video.classList.remove('hide');\n divRound.classList.add('is-paused');\n\n video.currentTime = 0;\n spanTime.innerText = toHHMMSS(globalVideo.duration, false);\n\n if(globalVideo.currentTime) {\n globalVideo.currentTime = 0;\n }\n };\n\n globalVideo.addEventListener('play', onPlay);\n globalVideo.addEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.addEventListener('pause', onPaused);\n globalVideo.addEventListener('ended', onEnded);\n\n attachClickEvent(canvas, (e) => {\n cancelEvent(e);\n\n // ! костыль\n if(preloader && !preloader.detached) {\n preloader.onClick();\n }\n\n // ! can't use it here. on Safari iOS video won't start.\n /* if(globalVideo.readyState < 2) {\n return;\n } */\n\n if(globalVideo.paused) {\n const hadSearchContext = !!searchContext;\n if(appMediaPlaybackController.setSearchContext(searchContext || {\n peerId: NULL_PEER_ID,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(divRound, message.mid/* , searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: message.peerId, mid: message.mid}, prev, next);\n }\n\n globalVideo.play();\n } else {\n globalVideo.pause();\n }\n });\n\n if(globalVideo.paused) {\n if(globalVideo.duration && globalVideo.currentTime !== globalVideo.duration && globalVideo.currentTime > 0) {\n onFrame();\n onTimeUpdate();\n video.classList.add('hide');\n } else {\n onPaused();\n }\n } else {\n onPlay();\n }\n };\n\n if(message.pFlags.is_outgoing) {\n (divRound as any).onLoad = onLoad;\n divRound.dataset.isOutgoing = '1';\n } else {\n onLoad();\n }\n } else if(!noAutoplayAttribute) {\n video.autoplay = true; // для safari\n }\n\n let photoRes: Awaited>;\n if(message) {\n photoRes = await wrapPhoto({\n photo: doc,\n message,\n container,\n boxWidth,\n boxHeight,\n withTail,\n isOut,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n autoDownloadSize: autoDownload?.photo,\n size: photoSize,\n managers\n });\n\n res.thumb = photoRes;\n\n if((!canAutoplay && doc.type !== 'gif') || onlyPreview) {\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n if(withTail) {\n const foreignObject = (photoRes.images.thumb || photoRes.images.full).parentElement;\n video.width = +foreignObject.getAttributeNS(null, 'width');\n video.height = +foreignObject.getAttributeNS(null, 'height');\n foreignObject.append(video);\n }\n } else if(!noPreview) { // * gifs masonry\n const gotThumb = getStrippedThumbIfNeeded(doc, {} as ThumbCache, true);\n if(gotThumb) {\n const thumbImage = gotThumb.image;\n thumbImage.classList.add('media-poster');\n container.append(thumbImage);\n res.thumb = {\n loadPromises: {\n thumb: gotThumb.loadPromise,\n full: Promise.resolve()\n },\n images: {\n thumb: thumbImage,\n full: null\n },\n preloader: null,\n aspecter: null\n };\n\n loadPromises?.push(gotThumb.loadPromise);\n res.loadPromise = gotThumb.loadPromise;\n }\n }\n\n if(onlyPreview) {\n return res;\n }\n\n if(!video.parentElement && container) {\n (photoRes?.aspecter || container).append(video);\n }\n\n let cacheContext: ThumbCache;\n const getCacheContext = async() => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, videoSize?.type);\n };\n\n await getCacheContext();\n\n const uploadFileName = message?.uploadingFileName;\n if(uploadFileName) { // means upload\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: true\n });\n preloader.attachPromise(appDownloadManager.getUpload(uploadFileName));\n preloader.attach(container, false);\n noAutoDownload = undefined;\n } else if(!cacheContext.downloaded && !doc.supportsStreaming && !withoutPreloader) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend'\n });\n } else if(doc.supportsStreaming) {\n preloader = new ProgressivePreloader({\n cancelable: false,\n attachMethod: 'prepend'\n });\n }\n\n const renderDeferred = deferredPromise();\n video.addEventListener('error', (e) => {\n if(video.error.code !== 4) {\n console.error('Error ' + video.error.code + '; details: ' + video.error.message);\n }\n\n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n if(!renderDeferred.isFulfilled) {\n renderDeferred.resolve();\n }\n }, {once: true});\n\n if(doc.type === 'video') {\n const onTimeUpdate = () => {\n if(!video.duration) {\n return;\n }\n\n spanTime.innerText = toHHMMSS(video.duration - video.currentTime, false);\n };\n\n const throttledTimeUpdate = throttle(() => {\n fastRaf(onTimeUpdate);\n }, 1e3, false);\n\n video.addEventListener('timeupdate', throttledTimeUpdate);\n\n if(spanPlay) {\n video.addEventListener('timeupdate', () => {\n sequentialDom.mutateElement(spanPlay, () => {\n spanPlay.remove();\n });\n }, {once: true});\n }\n }\n\n video.muted = true;\n video.loop = true;\n // video.play();\n if(!noAutoplayAttribute) {\n video.autoplay = true;\n }\n\n let loadPhotoThumbFunc = noAutoDownload && photoRes?.preloader?.loadFunc;\n const load = async() => {\n if(preloader && noAutoDownload && !withoutPreloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n await getCacheContext();\n let loadPromise: Promise = Promise.resolve();\n if((preloader && !uploadFileName) || withoutPreloader) {\n if(!cacheContext.downloaded && !doc.supportsStreaming) {\n const promise = loadPromise = appDownloadManager.downloadMediaURL({\n media: doc,\n queueId: lazyLoadQueue?.queueId,\n onlyCache: noAutoDownload,\n thumb: videoSize\n });\n\n if(preloader) {\n preloader.attach(container, false, promise);\n }\n } else if(doc.supportsStreaming) {\n if(noAutoDownload) {\n loadPromise = Promise.reject(makeError('NO_AUTO_DOWNLOAD'));\n } else if(!cacheContext.downloaded && preloader) { // * check for uploading video\n preloader.attach(container, false, null);\n video.addEventListener(IS_SAFARI ? 'timeupdate' : 'canplay', () => {\n preloader.detach();\n }, {once: true});\n }\n }\n }\n\n if(!noAutoDownload && loadPhotoThumbFunc) {\n loadPhotoThumbFunc();\n loadPhotoThumbFunc = null;\n }\n\n noAutoDownload = undefined;\n\n loadPromise.then(async() => {\n if(middleware && !middleware()) {\n renderDeferred.resolve();\n return;\n }\n\n if(doc.type === 'round') {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n }\n\n await getCacheContext();\n\n onMediaLoad(video).then(() => {\n if(group) {\n animationIntersector.addAnimation(video, group);\n }\n\n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n renderDeferred.resolve();\n }, (err) => {\n console.error('video load error', err);\n if(spanTime) {\n spanTime.classList.add('is-error');\n }\n renderDeferred.reject(err);\n });\n\n renderImageFromUrl(video, cacheContext.url);\n }, noop);\n\n return {download: loadPromise, render: Promise.all([loadPromise, renderDeferred])};\n };\n\n if(preloader && !uploadFileName) {\n preloader.setDownloadFunction(load);\n }\n\n /* if(doc.size >= 20e6 && !doc.downloaded) {\n let downloadDiv = document.createElement('div');\n downloadDiv.classList.add('download');\n\n let span = document.createElement('span');\n span.classList.add('btn-circle', 'tgico-download');\n downloadDiv.append(span);\n\n downloadDiv.addEventListener('click', () => {\n downloadDiv.remove();\n loadVideo();\n });\n\n container.prepend(downloadDiv);\n\n return;\n } */\n\n if(doc.type === 'gif' && !canAutoplay) {\n attachClickEvent(container, (e) => {\n cancelEvent(e);\n spanPlay.remove();\n load();\n }, {capture: true, once: true});\n } else {\n res.loadPromise = !lazyLoadQueue ?\n (await load()).render :\n (lazyLoadQueue.push({div: container, load: () => load().then(({render}) => render)}), Promise.resolve());\n }\n\n if(res.thumb) {\n await res.thumb.loadPromises.thumb;\n }\n\n return res;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {WebPage} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapWebPageDescription(webPage: WebPage.webPage) {\n const shortDescriptionText = limitSymbols(webPage.description || '', 150, 180);\n // const siteName = webPage.site_name;\n // let contextHashtag = '';\n // if(siteName === 'GitHub') {\n // const matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/);\n // if(matches) {\n // contextHashtag = matches[0] + '/issues/{1}';\n // }\n // }\n return wrapRichText(shortDescriptionText/* , {\n contextSite: siteName || 'external',\n contextHashtag: contextHashtag\n } */);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {WebPage} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapWebPageTitle(webPage: WebPage.webPage) {\n let shortTitle = webPage.title || webPage.author || webPage.site_name || '';\n shortTitle = limitSymbols(shortTitle, 80, 100);\n return wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\n}\n","// Taken from https://core.telegram.org/bots/payments/currencies.json\nexport type Currency = {\n code: string,\n title: string,\n symbol: string,\n native: string,\n thousands_sep: string,\n decimal_sep: string,\n symbol_left: boolean,\n space_between: boolean,\n exp: number,\n min_amount: string | number,\n max_amount: string | number\n};\n\n// eslint-disable-next-line quotes, comma-spacing\nconst Currencies: {[currency: string]: Currency} = {\"AED\":{\"code\":\"AED\",\"title\":\"United Arab Emirates Dirham\",\"symbol\":\"AED\",\"native\":\"د.إ.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"367\",\"max_amount\":\"3673030\"},\"AFN\":{\"code\":\"AFN\",\"title\":\"Afghan Afghani\",\"symbol\":\"AFN\",\"native\":\"؋\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"8729\",\"max_amount\":\"87299487\"},\"ALL\":{\"code\":\"ALL\",\"title\":\"Albanian Lek\",\"symbol\":\"ALL\",\"native\":\"Lek\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"11842\",\"max_amount\":\"118421187\"},\"AMD\":{\"code\":\"AMD\",\"title\":\"Armenian Dram\",\"symbol\":\"AMD\",\"native\":\"դր.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"40943\",\"max_amount\":\"409436718\"},\"ARS\":{\"code\":\"ARS\",\"title\":\"Argentine Peso\",\"symbol\":\"ARS\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"14705\",\"max_amount\":\"147059002\"},\"AUD\":{\"code\":\"AUD\",\"title\":\"Australian Dollar\",\"symbol\":\"AU$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"153\",\"max_amount\":\"1536825\"},\"AZN\":{\"code\":\"AZN\",\"title\":\"Azerbaijani Manat\",\"symbol\":\"AZN\",\"native\":\"ман.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"169\",\"max_amount\":\"1699858\"},\"BAM\":{\"code\":\"BAM\",\"title\":\"Bosnia & Herzegovina Convertible Mark\",\"symbol\":\"BAM\",\"native\":\"KM\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"199\",\"max_amount\":\"1990677\"},\"BDT\":{\"code\":\"BDT\",\"title\":\"Bangladeshi Taka\",\"symbol\":\"BDT\",\"native\":\"৳\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"10009\",\"max_amount\":\"100094046\"},\"BGN\":{\"code\":\"BGN\",\"title\":\"Bulgarian Lev\",\"symbol\":\"BGN\",\"native\":\"лв.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"199\",\"max_amount\":\"1993315\"},\"BND\":{\"code\":\"BND\",\"title\":\"Brunei Dollar\",\"symbol\":\"BND\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"142\",\"max_amount\":\"1421883\"},\"BOB\":{\"code\":\"BOB\",\"title\":\"Bolivian Boliviano\",\"symbol\":\"BOB\",\"native\":\"Bs\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"683\",\"max_amount\":\"6832607\"},\"BRL\":{\"code\":\"BRL\",\"title\":\"Brazilian Real\",\"symbol\":\"R$\",\"native\":\"R$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"539\",\"max_amount\":\"5397799\"},\"BYN\":{\"code\":\"BYN\",\"title\":\"Belarusian ruble\",\"symbol\":\"BYN\",\"native\":\"BYN\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"249\",\"max_amount\":\"2495801\"},\"CAD\":{\"code\":\"CAD\",\"title\":\"Canadian Dollar\",\"symbol\":\"CA$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"136\",\"max_amount\":\"1366860\"},\"CHF\":{\"code\":\"CHF\",\"title\":\"Swiss Franc\",\"symbol\":\"CHF\",\"native\":\"CHF\",\"thousands_sep\":\"'\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"97\",\"max_amount\":\"976705\"},\"CLP\":{\"code\":\"CLP\",\"title\":\"Chilean Peso\",\"symbol\":\"CLP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"963\",\"max_amount\":\"9637495\"},\"CNY\":{\"code\":\"CNY\",\"title\":\"Chinese Renminbi Yuan\",\"symbol\":\"CN¥\",\"native\":\"CN¥\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"709\",\"max_amount\":\"7094102\"},\"COP\":{\"code\":\"COP\",\"title\":\"Colombian Peso\",\"symbol\":\"COP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"452870\",\"max_amount\":\"4528700000\"},\"CRC\":{\"code\":\"CRC\",\"title\":\"Costa Rican Colón\",\"symbol\":\"CRC\",\"native\":\"₡\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"62506\",\"max_amount\":\"625061070\"},\"CZK\":{\"code\":\"CZK\",\"title\":\"Czech Koruna\",\"symbol\":\"CZK\",\"native\":\"Kč\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"2497\",\"max_amount\":\"24975029\"},\"DKK\":{\"code\":\"DKK\",\"title\":\"Danish Krone\",\"symbol\":\"DKK\",\"native\":\"kr\",\"thousands_sep\":\"\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"755\",\"max_amount\":\"7555990\"},\"DOP\":{\"code\":\"DOP\",\"title\":\"Dominican Peso\",\"symbol\":\"DOP\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5275\",\"max_amount\":\"52757308\"},\"DZD\":{\"code\":\"DZD\",\"title\":\"Algerian Dinar\",\"symbol\":\"DZD\",\"native\":\"د.ج.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"14035\",\"max_amount\":\"140353307\"},\"EGP\":{\"code\":\"EGP\",\"title\":\"Egyptian Pound\",\"symbol\":\"EGP\",\"native\":\"ج.م.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1953\",\"max_amount\":\"19537405\"},\"ETB\":{\"code\":\"ETB\",\"title\":\"Ethiopian Birr\",\"symbol\":\"ETB\",\"native\":\"ብር\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5224\",\"max_amount\":\"52247069\"},\"EUR\":{\"code\":\"EUR\",\"title\":\"Euro\",\"symbol\":\"€\",\"native\":\"€\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"101\",\"max_amount\":\"1016045\"},\"GBP\":{\"code\":\"GBP\",\"title\":\"British Pound\",\"symbol\":\"£\",\"native\":\"£\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"89\",\"max_amount\":\"894445\"},\"GEL\":{\"code\":\"GEL\",\"title\":\"Georgian Lari\",\"symbol\":\"GEL\",\"native\":\"GEL\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"283\",\"max_amount\":\"2830234\"},\"GTQ\":{\"code\":\"GTQ\",\"title\":\"Guatemalan Quetzal\",\"symbol\":\"GTQ\",\"native\":\"Q\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"778\",\"max_amount\":\"7781323\"},\"HKD\":{\"code\":\"HKD\",\"title\":\"Hong Kong Dollar\",\"symbol\":\"HK$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"784\",\"max_amount\":\"7849750\"},\"HNL\":{\"code\":\"HNL\",\"title\":\"Honduran Lempira\",\"symbol\":\"HNL\",\"native\":\"L\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"2441\",\"max_amount\":\"24413729\"},\"HRK\":{\"code\":\"HRK\",\"title\":\"Croatian Kuna\",\"symbol\":\"HRK\",\"native\":\"kn\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"764\",\"max_amount\":\"7648805\"},\"HUF\":{\"code\":\"HUF\",\"title\":\"Hungarian Forint\",\"symbol\":\"HUF\",\"native\":\"Ft\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"42685\",\"max_amount\":\"426850229\"},\"IDR\":{\"code\":\"IDR\",\"title\":\"Indonesian Rupiah\",\"symbol\":\"IDR\",\"native\":\"Rp\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"1523370\",\"max_amount\":\"15233700000\"},\"ILS\":{\"code\":\"ILS\",\"title\":\"Israeli New Sheqel\",\"symbol\":\"₪\",\"native\":\"₪\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"354\",\"max_amount\":\"3543350\"},\"INR\":{\"code\":\"INR\",\"title\":\"Indian Rupee\",\"symbol\":\"₹\",\"native\":\"₹\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"8155\",\"max_amount\":\"81555550\"},\"ISK\":{\"code\":\"ISK\",\"title\":\"Icelandic Króna\",\"symbol\":\"ISK\",\"native\":\"kr\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":0,\"min_amount\":\"142\",\"max_amount\":\"1425603\"},\"JMD\":{\"code\":\"JMD\",\"title\":\"Jamaican Dollar\",\"symbol\":\"JMD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"15013\",\"max_amount\":\"150131044\"},\"JPY\":{\"code\":\"JPY\",\"title\":\"Japanese Yen\",\"symbol\":\"¥\",\"native\":\"¥\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"144\",\"max_amount\":\"1443065\"},\"KES\":{\"code\":\"KES\",\"title\":\"Kenyan Shilling\",\"symbol\":\"KES\",\"native\":\"Ksh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"12075\",\"max_amount\":\"120750271\"},\"KGS\":{\"code\":\"KGS\",\"title\":\"Kyrgyzstani Som\",\"symbol\":\"KGS\",\"native\":\"KGS\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"8018\",\"max_amount\":\"80182898\"},\"KRW\":{\"code\":\"KRW\",\"title\":\"South Korean Won\",\"symbol\":\"₩\",\"native\":\"₩\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"1431\",\"max_amount\":\"14315201\"},\"KZT\":{\"code\":\"KZT\",\"title\":\"Kazakhstani Tenge\",\"symbol\":\"KZT\",\"native\":\"₸\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"47186\",\"max_amount\":\"471867112\"},\"LBP\":{\"code\":\"LBP\",\"title\":\"Lebanese Pound\",\"symbol\":\"LBP\",\"native\":\"ل.ل.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"150999\",\"max_amount\":\"1509998778\"},\"LKR\":{\"code\":\"LKR\",\"title\":\"Sri Lankan Rupee\",\"symbol\":\"LKR\",\"native\":\"රු.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"35546\",\"max_amount\":\"355469651\"},\"MAD\":{\"code\":\"MAD\",\"title\":\"Moroccan Dirham\",\"symbol\":\"MAD\",\"native\":\"د.م.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1093\",\"max_amount\":\"10938136\"},\"MDL\":{\"code\":\"MDL\",\"title\":\"Moldovan Leu\",\"symbol\":\"MDL\",\"native\":\"MDL\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1926\",\"max_amount\":\"19264439\"},\"MNT\":{\"code\":\"MNT\",\"title\":\"Mongolian Tögrög\",\"symbol\":\"MNT\",\"native\":\"MNT\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"322444\",\"max_amount\":\"3224442056\"},\"MUR\":{\"code\":\"MUR\",\"title\":\"Mauritian Rupee\",\"symbol\":\"MUR\",\"native\":\"MUR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"4453\",\"max_amount\":\"44535174\"},\"MVR\":{\"code\":\"MVR\",\"title\":\"Maldivian Rufiyaa\",\"symbol\":\"MVR\",\"native\":\"MVR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1546\",\"max_amount\":\"15460397\"},\"MXN\":{\"code\":\"MXN\",\"title\":\"Mexican Peso\",\"symbol\":\"MX$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"2012\",\"max_amount\":\"20122860\"},\"MYR\":{\"code\":\"MYR\",\"title\":\"Malaysian Ringgit\",\"symbol\":\"MYR\",\"native\":\"RM\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"463\",\"max_amount\":\"4632502\"},\"MZN\":{\"code\":\"MZN\",\"title\":\"Mozambican Metical\",\"symbol\":\"MZN\",\"native\":\"MTn\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"6382\",\"max_amount\":\"63829729\"},\"NGN\":{\"code\":\"NGN\",\"title\":\"Nigerian Naira\",\"symbol\":\"NGN\",\"native\":\"₦\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"43203\",\"max_amount\":\"432039828\"},\"NIO\":{\"code\":\"NIO\",\"title\":\"Nicaraguan Córdoba\",\"symbol\":\"NIO\",\"native\":\"C$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"3556\",\"max_amount\":\"35566412\"},\"NOK\":{\"code\":\"NOK\",\"title\":\"Norwegian Krone\",\"symbol\":\"NOK\",\"native\":\"kr\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1069\",\"max_amount\":\"10690975\"},\"NPR\":{\"code\":\"NPR\",\"title\":\"Nepalese Rupee\",\"symbol\":\"NPR\",\"native\":\"नेरू\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"12954\",\"max_amount\":\"129546657\"},\"NZD\":{\"code\":\"NZD\",\"title\":\"New Zealand Dollar\",\"symbol\":\"NZ$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"174\",\"max_amount\":\"1746220\"},\"PAB\":{\"code\":\"PAB\",\"title\":\"Panamanian Balboa\",\"symbol\":\"PAB\",\"native\":\"B\\/.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"98\",\"max_amount\":\"988722\"},\"PEN\":{\"code\":\"PEN\",\"title\":\"Peruvian Nuevo Sol\",\"symbol\":\"PEN\",\"native\":\"S\\/.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"390\",\"max_amount\":\"3902208\"},\"PHP\":{\"code\":\"PHP\",\"title\":\"Philippine Peso\",\"symbol\":\"PHP\",\"native\":\"₱\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5862\",\"max_amount\":\"58627496\"},\"PKR\":{\"code\":\"PKR\",\"title\":\"Pakistani Rupee\",\"symbol\":\"PKR\",\"native\":\"₨\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"22642\",\"max_amount\":\"226426805\"},\"PLN\":{\"code\":\"PLN\",\"title\":\"Polish Złoty\",\"symbol\":\"PLN\",\"native\":\"zł\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"493\",\"max_amount\":\"4932350\"},\"PYG\":{\"code\":\"PYG\",\"title\":\"Paraguayan Guaraní\",\"symbol\":\"PYG\",\"native\":\"₲\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"6977\",\"max_amount\":\"69772317\"},\"QAR\":{\"code\":\"QAR\",\"title\":\"Qatari Riyal\",\"symbol\":\"QAR\",\"native\":\"ر.ق.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"364\",\"max_amount\":\"3640989\"},\"RON\":{\"code\":\"RON\",\"title\":\"Romanian Leu\",\"symbol\":\"RON\",\"native\":\"RON\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"502\",\"max_amount\":\"5028645\"},\"RSD\":{\"code\":\"RSD\",\"title\":\"Serbian Dinar\",\"symbol\":\"RSD\",\"native\":\"дин.\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"11918\",\"max_amount\":\"119184990\"},\"RUB\":{\"code\":\"RUB\",\"title\":\"Russian Ruble\",\"symbol\":\"RUB\",\"native\":\"₽\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"7128\",\"max_amount\":\"71281218\"},\"SAR\":{\"code\":\"SAR\",\"title\":\"Saudi Riyal\",\"symbol\":\"SAR\",\"native\":\"ر.س.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"375\",\"max_amount\":\"3756546\"},\"SEK\":{\"code\":\"SEK\",\"title\":\"Swedish Krona\",\"symbol\":\"SEK\",\"native\":\"kr\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1109\",\"max_amount\":\"11094972\"},\"SGD\":{\"code\":\"SGD\",\"title\":\"Singapore Dollar\",\"symbol\":\"SGD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"143\",\"max_amount\":\"1430495\"},\"THB\":{\"code\":\"THB\",\"title\":\"Thai Baht\",\"symbol\":\"฿\",\"native\":\"฿\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"3780\",\"max_amount\":\"37800497\"},\"TJS\":{\"code\":\"TJS\",\"title\":\"Tajikistani Somoni\",\"symbol\":\"TJS\",\"native\":\"TJS\",\"thousands_sep\":\" \",\"decimal_sep\":\";\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"975\",\"max_amount\":\"9753854\"},\"TRY\":{\"code\":\"TRY\",\"title\":\"Turkish Lira\",\"symbol\":\"TRY\",\"native\":\"TL\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1854\",\"max_amount\":\"18543598\"},\"TTD\":{\"code\":\"TTD\",\"title\":\"Trinidad and Tobago Dollar\",\"symbol\":\"TTD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"672\",\"max_amount\":\"6722681\"},\"TWD\":{\"code\":\"TWD\",\"title\":\"New Taiwan Dollar\",\"symbol\":\"NT$\",\"native\":\"NT$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"3173\",\"max_amount\":\"31738502\"},\"TZS\":{\"code\":\"TZS\",\"title\":\"Tanzanian Shilling\",\"symbol\":\"TZS\",\"native\":\"TSh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"233199\",\"max_amount\":\"2331999890\"},\"UAH\":{\"code\":\"UAH\",\"title\":\"Ukrainian Hryvnia\",\"symbol\":\"UAH\",\"native\":\"₴\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"3633\",\"max_amount\":\"36338830\"},\"UGX\":{\"code\":\"UGX\",\"title\":\"Ugandan Shilling\",\"symbol\":\"UGX\",\"native\":\"USh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"3816\",\"max_amount\":\"38166726\"},\"USD\":{\"code\":\"USD\",\"title\":\"United States Dollar\",\"symbol\":\"$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"100\",\"max_amount\":1000000},\"UYU\":{\"code\":\"UYU\",\"title\":\"Uruguayan Peso\",\"symbol\":\"UYU\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"4080\",\"max_amount\":\"40801205\"},\"UZS\":{\"code\":\"UZS\",\"title\":\"Uzbekistani Som\",\"symbol\":\"UZS\",\"native\":\"UZS\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1089058\",\"max_amount\":\"10890583014\"},\"VND\":{\"code\":\"VND\",\"title\":\"Vietnamese Đồng\",\"symbol\":\"₫\",\"native\":\"₫\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":0,\"min_amount\":\"23862\",\"max_amount\":\"238625000\"},\"YER\":{\"code\":\"YER\",\"title\":\"Yemeni Rial\",\"symbol\":\"YER\",\"native\":\"ر.ي.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"25030\",\"max_amount\":\"250300677\"},\"ZAR\":{\"code\":\"ZAR\",\"title\":\"South African Rand\",\"symbol\":\"ZAR\",\"native\":\"R\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1789\",\"max_amount\":\"17894299\"}};\n\nexport default Currencies;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\n\nexport const EmojiVersions: {[version in EMOJI_VERSION]: {[emoji: string]: number}} = {'14':{'1f6dd':4867, '1f6de':4916, '1f6df':4923, '1f7f0':62832, '1f979':183, '1f9cc':1557, '1fa7b':61332, '1fa7c':61330, '1faa9':51093, '1faaa':61364, '1faab':61189, '1faac':51085, '1fab7':2651, '1fab8':2631, '1fab9':2672, '1faba':2673, '1fac3':1520, '1fac4':1521, '1fac5':1505, '1fad7':3793, '1fad8':3707, '1fad9':3804, '1fae0':111, '1fae1':136, '1fae2':132, '1fae3':133, '1fae4':174, '1fae5':142, '1fae6':1385, '1fae7':61353, '1faf0':1341, '1faf1':1332, '1faf2':1333, '1faf3':1334, '1faf4':1335, '1faf5':1351, '1faf6':1360, '1faf1-1f3fb-200d-1faf2-1f3fc':0, '1faf1-1f3fb-200d-1faf2-1f3fd':0, '1faf1-1f3fb-200d-1faf2-1f3fe':0, '1faf1-1f3fb-200d-1faf2-1f3ff':0, '1faf1-1f3fc-200d-1faf2-1f3fb':0, '1faf1-1f3fc-200d-1faf2-1f3fd':0, '1faf1-1f3fc-200d-1faf2-1f3fe':0, '1faf1-1f3fc-200d-1faf2-1f3ff':0, '1faf1-1f3fd-200d-1faf2-1f3fb':0, '1faf1-1f3fd-200d-1faf2-1f3fc':0, '1faf1-1f3fd-200d-1faf2-1f3fe':0, '1faf1-1f3fd-200d-1faf2-1f3ff':0, '1faf1-1f3fe-200d-1faf2-1f3fb':0, '1faf1-1f3fe-200d-1faf2-1f3fc':0, '1faf1-1f3fe-200d-1faf2-1f3fd':0, '1faf1-1f3fe-200d-1faf2-1f3ff':0, '1faf1-1f3ff-200d-1faf2-1f3fb':0, '1faf1-1f3ff-200d-1faf2-1f3fc':0, '1faf1-1f3ff-200d-1faf2-1f3fd':0, '1faf1-1f3ff-200d-1faf2-1f3fe':0, '1fac3-1f3fb':0, '1fac3-1f3fc':0, '1fac3-1f3fd':0, '1fac3-1f3fe':0, '1fac3-1f3ff':0, '1fac4-1f3fb':0, '1fac4-1f3fc':0, '1fac4-1f3fd':0, '1fac4-1f3fe':0, '1fac4-1f3ff':0, '1fac5-1f3fb':0, '1fac5-1f3fc':0, '1fac5-1f3fd':0, '1fac5-1f3fe':0, '1fac5-1f3ff':0, '1faf0-1f3fb':0, '1faf0-1f3fc':0, '1faf0-1f3fd':0, '1faf0-1f3fe':0, '1faf0-1f3ff':0, '1faf1-1f3fb':0, '1faf1-1f3fc':0, '1faf1-1f3fd':0, '1faf1-1f3fe':0, '1faf1-1f3ff':0, '1faf2-1f3fb':0, '1faf2-1f3fc':0, '1faf2-1f3fd':0, '1faf2-1f3fe':0, '1faf2-1f3ff':0, '1faf3-1f3fb':0, '1faf3-1f3fc':0, '1faf3-1f3fd':0, '1faf3-1f3fe':0, '1faf3-1f3ff':0, '1faf4-1f3fb':0, '1faf4-1f3fc':0, '1faf4-1f3fd':0, '1faf4-1f3fe':0, '1faf4-1f3ff':0, '1faf5-1f3fb':0, '1faf5-1f3fc':0, '1faf5-1f3fd':0, '1faf5-1f3fe':0, '1faf5-1f3ff':0, '1faf6-1f3fb':0, '1faf6-1f3fc':0, '1faf6-1f3fd':0, '1faf6-1f3fe':0, '1faf6-1f3ff':0}, '':{'2049':62835, '2122':62863, '2139':62888, '2194':62764, '2195':62763, '2196':62762, '2197':62756, '2198':62758, '2199':62760, '2328':61194, '2600':4990, '2601':4998, '2602':41013, '2603':41018, '2604':41020, '2611':62851, '2614':41014, '2615':3781, '2618':2667, '2620':1106, '2622':62753, '2623':62754, '2626':62783, '2638':62780, '2639':177, '2648':62788, '2649':62789, '2650':62796, '2651':62797, '2652':62798, '2653':62799, '2660':51095, '2663':51098, '2665':51096, '2666':51097, '2668':4865, '2692':61297, '2693':4922, '2694':61300, '2696':61311, '2697':61319, '2699':61309, '2702':61284, '2705':62850, '2708':4931, '2709':61245, '2712':61259, '2714':62852, '2716':62828, '2721':62779, '2728':51029, '2733':62858, '2734':62859, '2744':41017, '2747':62860, '2753':62836, '2754':62837, '2755':62838, '2757':62839, '2763':1137, '2764':1141, '2795':62829, '2796':62830, '2797':62831, '2934':62767, '2935':62768, '3030':62840, '3297':62912, '3299':62913, '0023-20e3':62864, '002a-20e3':62865, '0030-20e3':62866, '0031-20e3':62867, '0032-20e3':62868, '0033-20e3':62869, '0034-20e3':62870, '0035-20e3':62871, '0036-20e3':62872, '0037-20e3':62873, '0038-20e3':62874, '0039-20e3':62875, '00a9':62861, '00ae':62862, '1f004':51101, '1f0cf':51100, '1f170':62882, '1f171':62884, '1f17e':62893, '1f17f':62895, '1f18e':62883, '1f191':62885, '1f192':62886, '1f193':62887, '1f194':62889, '1f195':62891, '1f196':62892, '1f197':62894, '1f198':62896, '1f199':62897, '1f19a':62898, '1f1e6-1f1e8':71594, '1f1e6-1f1e9':71595, '1f1e6-1f1ea':71596, '1f1e6-1f1eb':71597, '1f1e6-1f1ec':71598, '1f1e6-1f1ee':71599, '1f1e6-1f1f1':71600, '1f1e6-1f1f2':71601, '1f1e6-1f1f4':71602, '1f1e6-1f1f6':71603, '1f1e6-1f1f7':71604, '1f1e6-1f1f8':71605, '1f1e6-1f1f9':71606, '1f1e6-1f1fa':71607, '1f1e6-1f1fc':71608, '1f1e6-1f1fd':71609, '1f1e6-1f1ff':71610, '1f1e7-1f1e6':71611, '1f1e7-1f1e7':71612, '1f1e7-1f1e9':71613, '1f1e7-1f1ea':71614, '1f1e7-1f1eb':71615, '1f1e7-1f1ec':71616, '1f1e7-1f1ed':71617, '1f1e7-1f1ee':71618, '1f1e7-1f1ef':71619, '1f1e7-1f1f1':71620, '1f1e7-1f1f2':71621, '1f1e7-1f1f3':71622, '1f1e7-1f1f4':71623, '1f1e7-1f1f6':71624, '1f1e7-1f1f7':71625, '1f1e7-1f1f8':71626, '1f1e7-1f1f9':71627, '1f1e7-1f1fb':71628, '1f1e7-1f1fc':71629, '1f1e7-1f1fe':71630, '1f1e7-1f1ff':71631, '1f1e8-1f1e6':71632, '1f1e8-1f1e8':71633, '1f1e8-1f1e9':71634, '1f1e8-1f1eb':71635, '1f1e8-1f1ec':71636, '1f1e8-1f1ed':71637, '1f1e8-1f1ee':71638, '1f1e8-1f1f0':71639, '1f1e8-1f1f1':71640, '1f1e8-1f1f2':71641, '1f1e8-1f1f3':71642, '1f1e8-1f1f4':71643, '1f1e8-1f1f5':71644, '1f1e8-1f1f7':71645, '1f1e8-1f1fa':71646, '1f1e8-1f1fb':71647, '1f1e8-1f1fc':71648, '1f1e8-1f1fd':71649, '1f1e8-1f1fe':71650, '1f1e8-1f1ff':71651, '1f1e9-1f1ea':71652, '1f1e9-1f1ec':71653, '1f1e9-1f1ef':71654, '1f1e9-1f1f0':71655, '1f1e9-1f1f2':71656, '1f1e9-1f1f4':71657, '1f1e9-1f1ff':71658, '1f1ea-1f1e6':71659, '1f1ea-1f1e8':71660, '1f1ea-1f1ea':71661, '1f1ea-1f1ec':71662, '1f1ea-1f1ed':71663, '1f1ea-1f1f7':71664, '1f1ea-1f1f8':71665, '1f1ea-1f1f9':71666, '1f1ea-1f1fa':71667, '1f1eb-1f1ee':71668, '1f1eb-1f1ef':71669, '1f1eb-1f1f0':71670, '1f1eb-1f1f2':71671, '1f1eb-1f1f4':71672, '1f1eb-1f1f7':71673, '1f1ec-1f1e6':71674, '1f1ec-1f1e7':71675, '1f1ec-1f1e9':71676, '1f1ec-1f1ea':71677, '1f1ec-1f1eb':71678, '1f1ec-1f1ec':71679, '1f1ec-1f1ed':71680, '1f1ec-1f1ee':71681, '1f1ec-1f1f1':71682, '1f1ec-1f1f2':71683, '1f1ec-1f1f3':71684, '1f1ec-1f1f5':71685, '1f1ec-1f1f6':71686, '1f1ec-1f1f7':71687, '1f1ec-1f1f8':71688, '1f1ec-1f1f9':71689, '1f1ec-1f1fa':71690, '1f1ec-1f1fc':71691, '1f1ec-1f1fe':71692, '1f1ed-1f1f0':71693, '1f1ed-1f1f2':71694, '1f1ed-1f1f3':71695, '1f1ed-1f1f7':71696, '1f1ed-1f1f9':71697, '1f1ed-1f1fa':71698, '1f1ee-1f1e8':71699, '1f1ee-1f1e9':71700, '1f1ee-1f1ea':71701, '1f1ee-1f1f1':71702, '1f1ee-1f1f2':71703, '1f1ee-1f1f3':71704, '1f1ee-1f1f4':71705, '1f1ee-1f1f6':71706, '1f1ee-1f1f7':71707, '1f1ee-1f1f8':71708, '1f1ee-1f1f9':71709, '1f1ef-1f1ea':71710, '1f1ef-1f1f2':71711, '1f1ef-1f1f4':71712, '1f1ef-1f1f5':71713, '1f1f0-1f1ea':71714, '1f1f0-1f1ec':71715, '1f1f0-1f1ed':71716, '1f1f0-1f1ee':71717, '1f1f0-1f1f2':71718, '1f1f0-1f1f3':71719, '1f1f0-1f1f5':71720, '1f1f0-1f1f7':71721, '1f1f0-1f1fc':71722, '1f1f0-1f1fe':71723, '1f1f0-1f1ff':71724, '1f1f1-1f1e6':71725, '1f1f1-1f1e7':71726, '1f1f1-1f1e8':71727, '1f1f1-1f1ee':71728, '1f1f1-1f1f0':71729, '1f1f1-1f1f7':71730, '1f1f1-1f1f8':71731, '1f1f1-1f1f9':71732, '1f1f1-1f1fa':71733, '1f1f1-1f1fb':71734, '1f1f1-1f1fe':71735, '1f1f2-1f1e6':71736, '1f1f2-1f1e8':71737, '1f1f2-1f1e9':71738, '1f1f2-1f1ea':71739, '1f1f2-1f1eb':71740, '1f1f2-1f1ec':71741, '1f1f2-1f1ed':71742, '1f1f2-1f1f0':71743, '1f1f2-1f1f1':71744, '1f1f2-1f1f2':71745, '1f1f2-1f1f3':71746, '1f1f2-1f1f4':71747, '1f1f2-1f1f5':71748, '1f1f2-1f1f6':71749, '1f1f2-1f1f7':71750, '1f1f2-1f1f8':71751, '1f1f2-1f1f9':71752, '1f1f2-1f1fa':71753, '1f1f2-1f1fb':71754, '1f1f2-1f1fc':71755, '1f1f2-1f1fd':71756, '1f1f2-1f1fe':71757, '1f1f2-1f1ff':71758, '1f1f3-1f1e6':71759, '1f1f3-1f1e8':71760, '1f1f3-1f1ea':71761, '1f1f3-1f1eb':71762, '1f1f3-1f1ec':71763, '1f1f3-1f1ee':71764, '1f1f3-1f1f1':71765, '1f1f3-1f1f4':71766, '1f1f3-1f1f5':71767, '1f1f3-1f1f7':71768, '1f1f3-1f1fa':71769, '1f1f3-1f1ff':71770, '1f1f4-1f1f2':71771, '1f1f5-1f1e6':71772, '1f1f5-1f1ea':71773, '1f1f5-1f1eb':71774, '1f1f5-1f1ec':71775, '1f1f5-1f1ed':71776, '1f1f5-1f1f0':71777, '1f1f5-1f1f1':71778, '1f1f5-1f1f2':71779, '1f1f5-1f1f3':71780, '1f1f5-1f1f7':71781, '1f1f5-1f1f8':71782, '1f1f5-1f1f9':71783, '1f1f5-1f1fc':71784, '1f1f5-1f1fe':71785, '1f1f6-1f1e6':71786, '1f1f7-1f1ea':71787, '1f1f7-1f1f4':71788, '1f1f7-1f1f8':71789, '1f1f7-1f1fa':71790, '1f1f7-1f1fc':71791, '1f1f8-1f1e6':71792, '1f1f8-1f1e7':71793, '1f1f8-1f1e8':71794, '1f1f8-1f1e9':71795, '1f1f8-1f1ea':71796, '1f1f8-1f1ec':71797, '1f1f8-1f1ed':71798, '1f1f8-1f1ee':71799, '1f1f8-1f1ef':71800, '1f1f8-1f1f0':71801, '1f1f8-1f1f1':71802, '1f1f8-1f1f2':71803, '1f1f8-1f1f3':71804, '1f1f8-1f1f4':71805, '1f1f8-1f1f7':71806, '1f1f8-1f1f8':71807, '1f1f8-1f1f9':71808, '1f1f8-1f1fb':71809, '1f1f8-1f1fd':71810, '1f1f8-1f1fe':71811, '1f1f8-1f1ff':71812, '1f1f9-1f1e6':71813, '1f1f9-1f1e8':71814, '1f1f9-1f1e9':71815, '1f1f9-1f1eb':71816, '1f1f9-1f1ec':71817, '1f1f9-1f1ed':71818, '1f1f9-1f1ef':71819, '1f1f9-1f1f0':71820, '1f1f9-1f1f1':71821, '1f1f9-1f1f2':71822, '1f1f9-1f1f3':71823, '1f1f9-1f1f4':71824, '1f1f9-1f1f7':71825, '1f1f9-1f1f9':71826, '1f1f9-1f1fb':71827, '1f1f9-1f1fc':71828, '1f1f9-1f1ff':71829, '1f1fa-1f1e6':71830, '1f1fa-1f1ec':71831, '1f1fa-1f1f2':71832, '1f1fa-1f1f3':71833, '1f1fa-1f1f8':71834, '1f1fa-1f1fe':71835, '1f1fa-1f1ff':71836, '1f1fb-1f1e6':71837, '1f1fb-1f1e8':71838, '1f1fb-1f1ea':71839, '1f1fb-1f1ec':71840, '1f1fb-1f1ee':71841, '1f1fb-1f1f3':71842, '1f1fb-1f1fa':71843, '1f1fc-1f1eb':71844, '1f1fc-1f1f8':71845, '1f1fd-1f1f0':71846, '1f1fe-1f1ea':71847, '1f1fe-1f1f9':71848, '1f1ff-1f1e6':71849, '1f1ff-1f1f2':71850, '1f1ff-1f1fc':71851, '1f201':62899, '1f202':62900, '1f21a':62906, '1f22f':62903, '1f232':62907, '1f233':62911, '1f234':62910, '1f235':62915, '1f236':62902, '1f237':62901, '1f238':62909, '1f239':62905, '1f23a':62914, '1f250':62904, '1f251':62908, '1f300':41010, '1f301':4857, '1f302':41012, '1f303':4858, '1f304':4860, '1f305':4861, '1f306':4862, '1f307':4863, '1f308':41011, '1f309':4864, '1f30a':41023, '1f30b':4815, '1f30c':4997, '1f30d':4806, '1f30e':4807, '1f30f':4808, '1f310':4809, '1f311':4977, '1f312':4978, '1f313':4979, '1f314':4980, '1f315':4981, '1f316':4982, '1f317':4983, '1f318':4984, '1f319':4985, '1f31a':4986, '1f31b':4987, '1f31c':4988, '1f31d':4991, '1f31e':4992, '1f31f':4995, '1f320':4996, '1f321':4989, '1f324':41001, '1f325':41002, '1f326':41003, '1f327':41004, '1f328':41005, '1f329':41006, '1f32a':41007, '1f32b':41008, '1f32c':41009, '1f32d':3725, '1f32e':3727, '1f32f':3728, '1f330':3708, '1f331':2659, '1f332':2661, '1f333':2662, '1f334':2663, '1f335':2664, '1f336':3698, '1f337':2658, '1f338':2649, '1f339':2653, '1f33a':2655, '1f33b':2656, '1f33c':2657, '1f33d':3697, '1f33e':2665, '1f33f':2666, '1f340':2668, '1f341':2669, '1f342':2670, '1f343':2671, '1f344':3705, '1f345':3690, '1f346':3694, '1f347':3674, '1f348':3675, '1f349':3676, '1f34a':3677, '1f34b':3678, '1f34c':3679, '1f34d':3680, '1f34e':3682, '1f34f':3683, '1f350':3684, '1f351':3685, '1f352':3686, '1f353':3687, '1f354':3722, '1f355':3724, '1f356':3718, '1f357':3719, '1f358':3744, '1f359':3745, '1f35a':3746, '1f35b':3747, '1f35c':3748, '1f35d':3749, '1f35e':3709, '1f35f':3723, '1f360':3750, '1f361':3756, '1f362':3751, '1f363':3752, '1f364':3753, '1f365':3754, '1f366':3765, '1f367':3766, '1f368':3767, '1f369':3768, '1f36a':3769, '1f36b':3774, '1f36c':3775, '1f36d':3776, '1f36e':3777, '1f36f':3778, '1f370':3771, '1f371':3743, '1f372':3735, '1f373':3733, '1f374':3801, '1f375':3783, '1f376':3784, '1f377':3786, '1f378':3787, '1f379':3788, '1f37a':3789, '1f37b':3790, '1f37c':3779, '1f37d':3800, '1f37e':3785, '1f37f':3739, '1f380':51040, '1f381':51041, '1f382':3770, '1f383':51024, '1f384':51025, '1f385':1527, '1f386':51026, '1f387':51027, '1f388':51030, '1f389':51031, '1f38a':51032, '1f38b':51033, '1f38c':71588, '1f38d':51034, '1f38e':51035, '1f38f':51036, '1f390':51037, '1f391':51038, '1f392':61134, '1f393':61147, '1f396':51045, '1f397':51042, '1f399':61167, '1f39a':61168, '1f39b':61169, '1f39e':61203, '1f39f':51043, '1f3a0':4866, '1f3a1':4868, '1f3a2':4869, '1f3a3':51072, '1f3a4':61170, '1f3a5':61202, '1f3a6':62819, '1f3a7':61171, '1f3a8':51105, '1f3a9':61146, '1f3aa':4871, '1f3ab':51044, '1f3ac':61205, '1f3ad':51103, '1f3ae':51086, '1f3af':51078, '1f3b0':51088, '1f3b1':51081, '1f3b2':51089, '1f3b3':51060, '1f3b4':51102, '1f3b5':61165, '1f3b6':61166, '1f3b7':61173, '1f3b8':61175, '1f3b9':61176, '1f3ba':61177, '1f3bb':61178, '1f3bc':61164, '1f3bd':51074, '1f3be':51058, '1f3bf':51075, '1f3c0':51054, '1f3c1':71586, '1f3c2':1600, '1f3c3-200d-2640':1584, '1f3c3-200d-2642':1583, '1f3c3':1582, '1f3c4-200d-2640':1606, '1f3c4-200d-2642':1605, '1f3c4':1604, '1f3c5':51047, '1f3c6':51046, '1f3c7':1598, '1f3c8':51056, '1f3c9':51057, '1f3ca-200d-2640':1612, '1f3ca-200d-2642':1611, '1f3ca':1610, '1f3cb-200d-2640':1618, '1f3cb-200d-2642':1617, '1f3cb':1616, '1f3cc-200d-2640':1603, '1f3cc-200d-2642':1602, '1f3cc':1601, '1f3cd':4902, '1f3ce':4901, '1f3cf':51061, '1f3d0':51055, '1f3d1':51062, '1f3d2':51063, '1f3d3':51065, '1f3d4':4813, '1f3d5':4817, '1f3d6':4818, '1f3d7':4824, '1f3d8':4829, '1f3d9':4859, '1f3da':4830, '1f3db':4823, '1f3dc':4819, '1f3dd':4820, '1f3de':4821, '1f3df':4822, '1f3e0':4831, '1f3e1':4832, '1f3e2':4833, '1f3e3':4834, '1f3e4':4835, '1f3e5':4836, '1f3e6':4837, '1f3e7':62729, '1f3e8':4838, '1f3e9':4839, '1f3ea':4840, '1f3eb':4841, '1f3ec':4842, '1f3ed':4843, '1f3ee':61216, '1f3ef':4844, '1f3f0':4845, '1f3f3-200d-1f308':71591, '1f3f3-200d-26a7':71592, '1f3f3':71590, '1f3f4-200d-2620':71593, '1f3f4-e0067-e0062-e0065-e006e-e0067-e007f':71852, '1f3f4-e0067-e0062-e0073-e0063-e0074-e007f':71853, '1f3f4-e0067-e0062-e0077-e006c-e0073-e007f':71854, '1f3f4':71589, '1f3f5':2652, '1f3f7':61234, '1f3f8':51066, '1f3f9':61303, '1f3fa':3805, '1f3fb':9525, '1f3fc':9526, '1f3fd':9527, '1f3fe':9528, '1f3ff':9529, '1f400':2576, '1f401':2575, '1f402':2556, '1f403':2557, '1f404':2558, '1f405':2547, '1f406':2548, '1f407':2579, '1f408-200d-2b1b':2544, '1f408':2543, '1f409':2618, '1f40a':2613, '1f40b':2622, '1f40c':2632, '1f40d':2616, '1f40e':2550, '1f40f':2563, '1f410':2565, '1f411':2564, '1f412':2531, '1f413':2596, '1f414':2595, '1f415-200d-1f9ba':2537, '1f415':2535, '1f416':2560, '1f417':2561, '1f418':2570, '1f419':2629, '1f41a':2630, '1f41b':2634, '1f41c':2635, '1f41d':2636, '1f41e':2638, '1f41f':2625, '1f420':2626, '1f421':2627, '1f422':2614, '1f423':2597, '1f424':2598, '1f425':2599, '1f426':2600, '1f427':2601, '1f428':2586, '1f429':2538, '1f42a':2566, '1f42b':2567, '1f42c':2623, '1f42d':2574, '1f42e':2555, '1f42f':2546, '1f430':2578, '1f431':2542, '1f432':2617, '1f433':2621, '1f434':2549, '1f435':2530, '1f436':2534, '1f437':2559, '1f438':2612, '1f439':2577, '1f43a':2539, '1f43b-200d-2744':2585, '1f43b':2584, '1f43c':2587, '1f43d':2562, '1f43e':2593, '1f43f':2580, '1f440':1381, '1f441-200d-1f5e8':1159, '1f441':1382, '1f442':1373, '1f443':1375, '1f444':1384, '1f445':1383, '1f446':1347, '1f447':1349, '1f448':1345, '1f449':1346, '1f44a':1355, '1f44b':1327, '1f44c':1336, '1f44d':1352, '1f44e':1353, '1f44f':1358, '1f450':1361, '1f451':61144, '1f452':61145, '1f453':61110, '1f454':61115, '1f455':61116, '1f456':61117, '1f457':61122, '1f458':61123, '1f459':61128, '1f45a':61129, '1f45b':61130, '1f45c':61131, '1f45d':61132, '1f45e':61136, '1f45f':61137, '1f460':61140, '1f461':61141, '1f462':61143, '1f463':1687, '1f464':1684, '1f465':1685, '1f466':1388, '1f467':1389, '1f468-200d-1f33e':1457, '1f468-200d-1f373':1460, '1f468-200d-1f37c':1524, '1f468-200d-1f393':1448, '1f468-200d-1f3a4':1478, '1f468-200d-1f3a8':1481, '1f468-200d-1f3eb':1451, '1f468-200d-1f3ed':1466, '1f468-200d-1f466-200d-1f466':1674, '1f468-200d-1f466':1673, '1f468-200d-1f467-200d-1f466':1676, '1f468-200d-1f467-200d-1f467':1677, '1f468-200d-1f467':1675, '1f468-200d-1f468-200d-1f466':1663, '1f468-200d-1f468-200d-1f466-200d-1f466':1666, '1f468-200d-1f468-200d-1f467':1664, '1f468-200d-1f468-200d-1f467-200d-1f466':1665, '1f468-200d-1f468-200d-1f467-200d-1f467':1667, '1f468-200d-1f469-200d-1f466':1658, '1f468-200d-1f469-200d-1f466-200d-1f466':1661, '1f468-200d-1f469-200d-1f467':1659, '1f468-200d-1f469-200d-1f467-200d-1f466':1660, '1f468-200d-1f469-200d-1f467-200d-1f467':1662, '1f468-200d-1f4bb':1475, '1f468-200d-1f4bc':1469, '1f468-200d-1f527':1463, '1f468-200d-1f52c':1472, '1f468-200d-1f680':1487, '1f468-200d-1f692':1490, '1f468-200d-1f9af':1574, '1f468-200d-1f9b0':1396, '1f468-200d-1f9b1':1397, '1f468-200d-1f9b2':1399, '1f468-200d-1f9b3':1398, '1f468-200d-1f9bc':1577, '1f468-200d-1f9bd':1580, '1f468-200d-2695':1445, '1f468-200d-2696':1454, '1f468-200d-2708':1484, '1f468-200d-2764-200d-1f468':1655, '1f468-200d-2764-200d-1f48b-200d-1f468':1651, '1f468':1392, '1f469-200d-1f33e':1458, '1f469-200d-1f373':1461, '1f469-200d-1f37c':1523, '1f469-200d-1f393':1449, '1f469-200d-1f3a4':1479, '1f469-200d-1f3a8':1482, '1f469-200d-1f3eb':1452, '1f469-200d-1f3ed':1467, '1f469-200d-1f466-200d-1f466':1679, '1f469-200d-1f466':1678, '1f469-200d-1f467-200d-1f466':1681, '1f469-200d-1f467-200d-1f467':1682, '1f469-200d-1f467':1680, '1f469-200d-1f469-200d-1f466':1668, '1f469-200d-1f469-200d-1f466-200d-1f466':1671, '1f469-200d-1f469-200d-1f467':1669, '1f469-200d-1f469-200d-1f467-200d-1f466':1670, '1f469-200d-1f469-200d-1f467-200d-1f467':1672, '1f469-200d-1f4bb':1476, '1f469-200d-1f4bc':1470, '1f469-200d-1f527':1464, '1f469-200d-1f52c':1473, '1f469-200d-1f680':1488, '1f469-200d-1f692':1491, '1f469-200d-1f9af':1575, '1f469-200d-1f9b0':1401, '1f469-200d-1f9b1':1403, '1f469-200d-1f9b2':1407, '1f469-200d-1f9b3':1405, '1f469-200d-1f9bc':1578, '1f469-200d-1f9bd':1581, '1f469-200d-2695':1446, '1f469-200d-2696':1455, '1f469-200d-2708':1485, '1f469-200d-2764-200d-1f468':1654, '1f469-200d-2764-200d-1f469':1656, '1f469-200d-2764-200d-1f48b-200d-1f468':1650, '1f469-200d-2764-200d-1f48b-200d-1f469':1652, '1f469':1400, '1f46a':1657, '1f46b':1647, '1f46c':1648, '1f46d':1646, '1f46e-200d-2640':1494, '1f46e-200d-2642':1493, '1f46e':1492, '1f46f-200d-2640':1590, '1f46f-200d-2642':1589, '1f46f':1588, '1f470-200d-2640':1518, '1f470-200d-2642':1517, '1f470':1516, '1f471-200d-2640':1409, '1f471-200d-2642':1410, '1f471':1391, '1f472':1511, '1f473-200d-2640':1510, '1f473-200d-2642':1509, '1f473':1508, '1f474':1412, '1f475':1413, '1f476':1386, '1f477-200d-2640':1504, '1f477-200d-2642':1503, '1f477':1502, '1f478':1507, '1f479':1109, '1f47a':1110, '1f47b':1111, '1f47c':1526, '1f47d':1112, '1f47e':1113, '1f47f':1104, '1f480':1105, '1f481-200d-2640':1428, '1f481-200d-2642':1427, '1f481':1426, '1f482-200d-2640':1500, '1f482-200d-2642':1499, '1f482':1498, '1f483':1585, '1f484':61152, '1f485':1366, '1f486-200d-2640':1560, '1f486-200d-2642':1559, '1f486':1558, '1f487-200d-2640':1563, '1f487-200d-2642':1562, '1f487':1561, '1f488':4870, '1f489':61326, '1f48a':61328, '1f48b':1127, '1f48c':1128, '1f48d':61153, '1f48e':61154, '1f48f':1649, '1f490':2648, '1f491':1653, '1f492':4846, '1f493':1133, '1f494':1138, '1f495':1135, '1f496':1131, '1f497':1132, '1f498':1129, '1f499':1145, '1f49a':1144, '1f49b':1143, '1f49c':1146, '1f49d':1130, '1f49e':1134, '1f49f':1136, '1f4a0':62946, '1f4a1':61214, '1f4a2':1151, '1f4a3':1157, '1f4a4':1163, '1f4a5':1152, '1f4a6':1154, '1f4a7':41022, '1f4a8':1155, '1f4a9':1107, '1f4aa':1368, '1f4ab':1153, '1f4ac':1158, '1f4ad':1162, '1f4ae':2650, '1f4af':1150, '1f4b0':61235, '1f4b1':62841, '1f4b2':62842, '1f4b3':61242, '1f4b4':61237, '1f4b5':61238, '1f4b6':61239, '1f4b7':61240, '1f4b8':61241, '1f4b9':61244, '1f4ba':4936, '1f4bb':61191, '1f4bc':61265, '1f4bd':61197, '1f4be':61198, '1f4bf':61199, '1f4c0':61200, '1f4c1':61266, '1f4c2':61267, '1f4c3':61227, '1f4c4':61229, '1f4c5':61269, '1f4c6':61270, '1f4c7':61273, '1f4c8':61274, '1f4c9':61275, '1f4ca':61276, '1f4cb':61277, '1f4cc':61278, '1f4cd':61279, '1f4ce':61280, '1f4cf':61282, '1f4d0':61283, '1f4d1':61232, '1f4d2':61226, '1f4d3':61225, '1f4d4':61218, '1f4d5':61219, '1f4d6':61220, '1f4d7':61221, '1f4d8':61222, '1f4d9':61223, '1f4da':61224, '1f4db':62847, '1f4dc':61228, '1f4dd':61264, '1f4de':61185, '1f4df':61186, '1f4e0':61187, '1f4e1':61325, '1f4e2':61159, '1f4e3':61160, '1f4e4':61249, '1f4e5':61250, '1f4e6':61251, '1f4e7':61246, '1f4e8':61247, '1f4e9':61248, '1f4ea':61253, '1f4eb':61252, '1f4ec':61254, '1f4ed':61255, '1f4ee':61256, '1f4ef':61161, '1f4f0':61230, '1f4f1':61182, '1f4f2':61183, '1f4f3':62823, '1f4f4':62824, '1f4f5':62751, '1f4f6':62822, '1f4f7':61207, '1f4f8':61208, '1f4f9':61209, '1f4fa':61206, '1f4fb':61172, '1f4fc':61210, '1f4fd':61204, '1f4ff':61151, '1f500':62801, '1f501':62802, '1f502':62803, '1f503':62769, '1f504':62770, '1f505':62820, '1f506':62821, '1f507':61155, '1f508':61156, '1f509':61157, '1f50a':61158, '1f50b':61188, '1f50c':61190, '1f50d':61211, '1f50e':61212, '1f50f':61290, '1f510':61291, '1f511':61292, '1f512':61288, '1f513':61289, '1f514':61162, '1f515':61163, '1f516':61233, '1f517':61313, '1f518':62947, '1f519':62771, '1f51a':62772, '1f51b':62773, '1f51c':62774, '1f51d':62775, '1f51e':62752, '1f51f':62876, '1f520':62877, '1f521':62878, '1f522':62879, '1f523':62880, '1f524':62881, '1f525':41021, '1f526':61215, '1f527':61306, '1f528':61294, '1f529':61308, '1f52a':3803, '1f52b':61301, '1f52c':61323, '1f52d':61324, '1f52e':51082, '1f52f':62787, '1f530':62848, '1f531':62846, '1f532':62949, '1f533':62948, '1f534':62916, '1f535':62920, '1f536':62940, '1f537':62941, '1f538':62942, '1f539':62943, '1f53a':62944, '1f53b':62945, '1f53c':62811, '1f53d':62813, '1f549':62778, '1f54a':2602, '1f54b':4854, '1f54c':4850, '1f54d':4852, '1f54e':62786, '1f550':4955, '1f551':4957, '1f552':4959, '1f553':4961, '1f554':4963, '1f555':4965, '1f556':4967, '1f557':4969, '1f558':4971, '1f559':4973, '1f55a':4975, '1f55b':4953, '1f55c':4956, '1f55d':4958, '1f55e':4960, '1f55f':4962, '1f560':4964, '1f561':4966, '1f562':4968, '1f563':4970, '1f564':4972, '1f565':4974, '1f566':4976, '1f567':4954, '1f56f':61213, '1f570':4952, '1f573':1156, '1f574':1587, '1f575-200d-2640':1497, '1f575-200d-2642':1496, '1f575':1495, '1f576':61111, '1f577':2641, '1f578':2642, '1f579':51087, '1f57a':1586, '1f587':61281, '1f58a':61261, '1f58b':61260, '1f58c':61262, '1f58d':61263, '1f590':1329, '1f595':1348, '1f596':1331, '1f5a4':1148, '1f5a5':61192, '1f5a8':61193, '1f5b1':61195, '1f5b2':61196, '1f5bc':51104, '1f5c2':61268, '1f5c3':61285, '1f5c4':61286, '1f5d1':61287, '1f5d2':61271, '1f5d3':61272, '1f5dc':61310, '1f5dd':61293, '1f5de':61231, '1f5e1':61299, '1f5e3':1683, '1f5e8':1160, '1f5ef':1161, '1f5f3':61257, '1f5fa':4810, '1f5fb':4816, '1f5fc':4847, '1f5fd':4848, '1f5fe':4811, '1f5ff':61362, '1f600':11, '1f601':14, '1f602':18, '1f603':12, '1f604':13, '1f605':16, '1f606':15, '1f607':114, '1f608':1103, '1f609':112, '1f60a':113, '1f60b':124, '1f60c':150, '1f60d':116, '1f60e':170, '1f60f':144, '1f610':139, '1f611':140, '1f612':145, '1f613':195, '1f614':151, '1f615':173, '1f616':192, '1f617':119, '1f618':118, '1f619':122, '1f61a':121, '1f61b':125, '1f61c':126, '1f61d':128, '1f61e':194, '1f61f':175, '1f620':1101, '1f621':1100, '1f622':189, '1f623':193, '1f624':199, '1f625':188, '1f626':184, '1f627':185, '1f628':186, '1f629':196, '1f62a':152, '1f62b':197, '1f62c':147, '1f62d':190, '1f62e-200d-1f4a8':148, '1f62e':178, '1f62f':179, '1f630':187, '1f631':191, '1f632':180, '1f633':181, '1f634':154, '1f635-200d-1f4ab':165, '1f635':164, '1f636-200d-1f32b':143, '1f636':141, '1f637':155, '1f638':1116, '1f639':1117, '1f63a':1115, '1f63b':1118, '1f63c':1119, '1f63d':1120, '1f63e':1123, '1f63f':1122, '1f640':1121, '1f641':176, '1f642':19, '1f643':110, '1f644':146, '1f645-200d-2640':1422, '1f645-200d-2642':1421, '1f645':1420, '1f646-200d-2640':1425, '1f646-200d-2642':1424, '1f646':1423, '1f647-200d-2640':1437, '1f647-200d-2642':1436, '1f647':1435, '1f648':1124, '1f649':1125, '1f64a':1126, '1f64b-200d-2640':1431, '1f64b-200d-2642':1430, '1f64b':1429, '1f64c':1359, '1f64d-200d-2640':1416, '1f64d-200d-2642':1415, '1f64d':1414, '1f64e-200d-2640':1419, '1f64e-200d-2642':1418, '1f64e':1417, '1f64f':1364, '1f680':4942, '1f681':4937, '1f682':4872, '1f683':4873, '1f684':4874, '1f685':4875, '1f686':4876, '1f687':4877, '1f688':4878, '1f689':4879, '1f68a':4880, '1f68b':4883, '1f68c':4884, '1f68d':4885, '1f68e':4886, '1f68f':4911, '1f690':4887, '1f691':4888, '1f692':4889, '1f693':4890, '1f694':4891, '1f695':4892, '1f696':4893, '1f697':4894, '1f698':4895, '1f699':4896, '1f69a':4898, '1f69b':4899, '1f69c':4900, '1f69d':4881, '1f69e':4882, '1f69f':4938, '1f6a0':4939, '1f6a1':4940, '1f6a2':4930, '1f6a3-200d-2640':1609, '1f6a3-200d-2642':1608, '1f6a3':1607, '1f6a4':4926, '1f6a5':4918, '1f6a6':4919, '1f6a7':4921, '1f6a8':4917, '1f6a9':71587, '1f6aa':61333, '1f6ab':62745, '1f6ac':61358, '1f6ad':62747, '1f6ae':62730, '1f6af':62748, '1f6b0':62731, '1f6b1':62749, '1f6b2':4907, '1f6b3':62746, '1f6b4-200d-2640':1621, '1f6b4-200d-2642':1620, '1f6b4':1619, '1f6b5-200d-2640':1624, '1f6b5-200d-2642':1623, '1f6b5':1622, '1f6b6-200d-2640':1566, '1f6b6-200d-2642':1565, '1f6b6':1564, '1f6b7':62750, '1f6b8':62743, '1f6b9':62733, '1f6ba':62734, '1f6bb':62735, '1f6bc':62736, '1f6bd':61340, '1f6be':62737, '1f6bf':61342, '1f6c0':1643, '1f6c1':61343, '1f6c2':62738, '1f6c3':62739, '1f6c4':62740, '1f6c5':62741, '1f6cb':61338, '1f6cc':1644, '1f6cd':61133, '1f6ce':4944, '1f6cf':61337, '1f6d0':62776, '1f6d1':4920, '1f6d2':61357, '1f6d5':4851, '1f6d6':4828, '1f6d7':61334, '1f6e0':61298, '1f6e1':61304, '1f6e2':4914, '1f6e3':4912, '1f6e4':4913, '1f6e5':4929, '1f6e9':4932, '1f6eb':4933, '1f6ec':4934, '1f6f0':4941, '1f6f3':4927, '1f6f4':4908, '1f6f5':4903, '1f6f6':4925, '1f6f7':51076, '1f6f8':4943, '1f6f9':4909, '1f6fa':4906, '1f6fb':4897, '1f6fc':4910, '1f7e0':62917, '1f7e1':62918, '1f7e2':62919, '1f7e3':62921, '1f7e4':62922, '1f7e5':62925, '1f7e6':62929, '1f7e7':62926, '1f7e8':62927, '1f7e9':62928, '1f7ea':62930, '1f7eb':62931, '1f90c':1337, '1f90d':1149, '1f90e':1147, '1f90f':1338, '1f910':137, '1f911':129, '1f912':156, '1f913':171, '1f914':135, '1f915':157, '1f916':1114, '1f917':130, '1f918':1343, '1f919':1344, '1f91a':1328, '1f91b':1356, '1f91c':1357, '1f91d':1363, '1f91e':1340, '1f91f':1342, '1f920':167, '1f921':1108, '1f922':158, '1f923':17, '1f924':153, '1f925':149, '1f926-200d-2640':1440, '1f926-200d-2642':1439, '1f926':1438, '1f927':160, '1f928':138, '1f929':117, '1f92a':127, '1f92b':134, '1f92c':1102, '1f92d':131, '1f92e':159, '1f92f':166, '1f930':1519, '1f931':1522, '1f932':1362, '1f933':1367, '1f934':1506, '1f935-200d-2640':1515, '1f935-200d-2642':1514, '1f935':1513, '1f936':1528, '1f937-200d-2640':1443, '1f937-200d-2642':1442, '1f937':1441, '1f938-200d-2640':1627, '1f938-200d-2642':1626, '1f938':1625, '1f939-200d-2640':1639, '1f939-200d-2642':1638, '1f939':1637, '1f93a':1597, '1f93c-200d-2640':1630, '1f93c-200d-2642':1629, '1f93c':1628, '1f93d-200d-2640':1633, '1f93d-200d-2642':1632, '1f93d':1631, '1f93e-200d-2640':1636, '1f93e-200d-2642':1635, '1f93e':1634, '1f93f':51073, '1f940':2654, '1f941':61180, '1f942':3791, '1f943':3792, '1f944':3802, '1f945':51069, '1f947':51048, '1f948':51049, '1f949':51050, '1f94a':51067, '1f94b':51068, '1f94c':51077, '1f94d':51064, '1f94e':51053, '1f94f':51059, '1f950':3710, '1f951':3693, '1f952':3700, '1f953':3721, '1f954':3695, '1f955':3696, '1f956':3711, '1f957':3738, '1f958':3734, '1f959':3730, '1f95a':3732, '1f95b':3780, '1f95c':3706, '1f95d':3689, '1f95e':3715, '1f95f':3757, '1f960':3758, '1f961':3759, '1f962':3799, '1f963':3737, '1f964':3794, '1f965':3692, '1f966':3702, '1f967':3773, '1f968':3713, '1f969':3720, '1f96a':3726, '1f96b':3742, '1f96c':3701, '1f96d':3681, '1f96e':3755, '1f96f':3714, '1f970':115, '1f971':198, '1f972':123, '1f973':168, '1f974':163, '1f975':161, '1f976':162, '1f977':1501, '1f978':169, '1f97a':182, '1f97b':61124, '1f97c':61113, '1f97d':61112, '1f97e':61138, '1f97f':61139, '1f980':3760, '1f981':2545, '1f982':2643, '1f983':2594, '1f984':2551, '1f985':2603, '1f986':2604, '1f987':2583, '1f988':2628, '1f989':2606, '1f98a':2540, '1f98b':2633, '1f98c':2553, '1f98d':2532, '1f98e':2615, '1f98f':2572, '1f990':3762, '1f991':3763, '1f992':2569, '1f993':2552, '1f994':2582, '1f995':2619, '1f996':2620, '1f997':2639, '1f998':2591, '1f999':2568, '1f99a':2610, '1f99b':2573, '1f99c':2611, '1f99d':2541, '1f99e':3761, '1f99f':2644, '1f9a0':2647, '1f9a1':2592, '1f9a2':2605, '1f9a3':2571, '1f9a4':2607, '1f9a5':2588, '1f9a6':2589, '1f9a7':2533, '1f9a8':2590, '1f9a9':2609, '1f9aa':3764, '1f9ab':2581, '1f9ac':2554, '1f9ad':2624, '1f9ae':2536, '1f9af':61312, '1f9b4':1380, '1f9b5':1371, '1f9b6':1372, '1f9b7':1379, '1f9b8-200d-2640':1532, '1f9b8-200d-2642':1531, '1f9b8':1530, '1f9b9-200d-2640':1535, '1f9b9-200d-2642':1534, '1f9b9':1533, '1f9ba':61114, '1f9bb':1374, '1f9bc':4905, '1f9bd':4904, '1f9be':1369, '1f9bf':1370, '1f9c0':3717, '1f9c1':3772, '1f9c2':3741, '1f9c3':3796, '1f9c4':3703, '1f9c5':3704, '1f9c6':3731, '1f9c7':3716, '1f9c8':3740, '1f9c9':3797, '1f9ca':3798, '1f9cb':3795, '1f9cd-200d-2640':1569, '1f9cd-200d-2642':1568, '1f9cd':1567, '1f9ce-200d-2640':1572, '1f9ce-200d-2642':1571, '1f9ce':1570, '1f9cf-200d-2640':1434, '1f9cf-200d-2642':1433, '1f9cf':1432, '1f9d0':172, '1f9d1-200d-1f33e':1456, '1f9d1-200d-1f373':1459, '1f9d1-200d-1f37c':1525, '1f9d1-200d-1f384':1529, '1f9d1-200d-1f393':1447, '1f9d1-200d-1f3a4':1477, '1f9d1-200d-1f3a8':1480, '1f9d1-200d-1f3eb':1450, '1f9d1-200d-1f3ed':1465, '1f9d1-200d-1f4bb':1474, '1f9d1-200d-1f4bc':1468, '1f9d1-200d-1f527':1462, '1f9d1-200d-1f52c':1471, '1f9d1-200d-1f680':1486, '1f9d1-200d-1f692':1489, '1f9d1-200d-1f91d-200d-1f9d1':1645, '1f9d1-200d-1f9af':1573, '1f9d1-200d-1f9b0':1402, '1f9d1-200d-1f9b1':1404, '1f9d1-200d-1f9b2':1408, '1f9d1-200d-1f9b3':1406, '1f9d1-200d-1f9bc':1576, '1f9d1-200d-1f9bd':1579, '1f9d1-200d-2695':1444, '1f9d1-200d-2696':1453, '1f9d1-200d-2708':1483, '1f9d1':1390, '1f9d2':1387, '1f9d3':1411, '1f9d4-200d-2640':1395, '1f9d4-200d-2642':1394, '1f9d4':1393, '1f9d5':1512, '1f9d6-200d-2640':1593, '1f9d6-200d-2642':1592, '1f9d6':1591, '1f9d7-200d-2640':1596, '1f9d7-200d-2642':1595, '1f9d7':1594, '1f9d8-200d-2640':1642, '1f9d8-200d-2642':1641, '1f9d8':1640, '1f9d9-200d-2640':1538, '1f9d9-200d-2642':1537, '1f9d9':1536, '1f9da-200d-2640':1541, '1f9da-200d-2642':1540, '1f9da':1539, '1f9db-200d-2640':1544, '1f9db-200d-2642':1543, '1f9db':1542, '1f9dc-200d-2640':1547, '1f9dc-200d-2642':1546, '1f9dc':1545, '1f9dd-200d-2640':1550, '1f9dd-200d-2642':1549, '1f9dd':1548, '1f9de-200d-2640':1553, '1f9de-200d-2642':1552, '1f9de':1551, '1f9df-200d-2640':1556, '1f9df-200d-2642':1555, '1f9df':1554, '1f9e0':1376, '1f9e1':1142, '1f9e2':61148, '1f9e3':61118, '1f9e4':61119, '1f9e5':61120, '1f9e6':61121, '1f9e7':51039, '1f9e8':51028, '1f9e9':51090, '1f9ea':61320, '1f9eb':61321, '1f9ec':61322, '1f9ed':4812, '1f9ee':61201, '1f9ef':61356, '1f9f0':61316, '1f9f1':4825, '1f9f2':61317, '1f9f3':4945, '1f9f4':61346, '1f9f5':51106, '1f9f6':51108, '1f9f7':61347, '1f9f8':51091, '1f9f9':61348, '1f9fa':61349, '1f9fb':61350, '1f9fc':61352, '1f9fd':61355, '1f9fe':61243, '1f9ff':51084, '1fa70':61142, '1fa71':61125, '1fa72':61126, '1fa73':61127, '1fa74':61135, '1fa78':61327, '1fa79':61329, '1fa7a':61331, '1fa80':51079, '1fa81':51080, '1fa82':4935, '1fa83':61302, '1fa84':51083, '1fa85':51092, '1fa86':51094, '1fa90':4993, '1fa91':61339, '1fa92':61345, '1fa93':61295, '1fa94':61217, '1fa95':61179, '1fa96':61149, '1fa97':61174, '1fa98':61181, '1fa99':61236, '1fa9a':61305, '1fa9b':61307, '1fa9c':61318, '1fa9d':61315, '1fa9e':61335, '1fa9f':61336, '1faa0':61341, '1faa1':51107, '1faa2':51109, '1faa3':61351, '1faa4':61344, '1faa5':61354, '1faa6':61360, '1faa7':61363, '1faa8':4826, '1fab0':2645, '1fab1':2646, '1fab2':2637, '1fab3':2640, '1fab4':2660, '1fab5':4827, '1fab6':2608, '1fac0':1377, '1fac1':1378, '1fac2':1686, '1fad0':3688, '1fad1':3699, '1fad2':3691, '1fad3':3712, '1fad4':3729, '1fad5':3736, '1fad6':3782, '203c':62834, '21a9':62765, '21aa':62766, '231a':4948, '231b':4946, '23cf':62818, '23e9':62805, '23ea':62809, '23eb':62812, '23ec':62814, '23ed':62806, '23ee':62810, '23ef':62807, '23f0':4949, '23f1':4950, '23f2':4951, '23f3':4947, '23f8':62815, '23f9':62816, '23fa':62817, '24c2':62890, '25aa':62938, '25ab':62939, '25b6':62804, '25c0':62808, '25fb':62935, '25fc':62934, '25fd':62937, '25fe':62936, '260e':61184, '261d':1350, '262a':62784, '262e':62785, '262f':62781, '263a':120, '264a':62790, '264b':62791, '264c':62792, '264d':62793, '264e':62794, '264f':62795, '265f':51099, '267b':62844, '267e':62833, '267f':62732, '269b':62777, '269c':62845, '26a0':62742, '26a1':41016, '26a7':62827, '26aa':62924, '26ab':62923, '26b0':61359, '26b1':61361, '26bd':51051, '26be':51052, '26c4':41019, '26c5':4999, '26c8':41000, '26ce':62800, '26cf':61296, '26d1':61150, '26d3':61314, '26d4':62744, '26e9':4853, '26ea':4849, '26f0':4814, '26f1':41015, '26f2':4855, '26f3':51070, '26f4':4928, '26f5':4924, '26f7':1599, '26f8':51071, '26f9-200d-2640':1615, '26f9-200d-2642':1614, '26f9':1613, '26fa':4856, '26fd':4915, '270a':1354, '270b':1330, '270c':1339, '270d':1365, '270f':61258, '271d':62782, '274c':62853, '274e':62854, '2764-200d-1f525':1139, '2764-200d-1fa79':1140, '27a1':62757, '27b0':62855, '27bf':62856, '2b05':62761, '2b06':62755, '2b07':62759, '2b1b':62932, '2b1c':62933, '2b50':4994, '2b55':62849, '303d':62857, '1f385-1f3fb':0, '1f385-1f3fc':0, '1f385-1f3fd':0, '1f385-1f3fe':0, '1f385-1f3ff':0, '1f3c2-1f3fb':0, '1f3c2-1f3fc':0, '1f3c2-1f3fd':0, '1f3c2-1f3fe':0, '1f3c2-1f3ff':0, '1f3c3-1f3fb-200d-2640':0, '1f3c3-1f3fc-200d-2640':0, '1f3c3-1f3fd-200d-2640':0, '1f3c3-1f3fe-200d-2640':0, '1f3c3-1f3ff-200d-2640':0, '1f3c3-1f3fb-200d-2642':0, '1f3c3-1f3fc-200d-2642':0, '1f3c3-1f3fd-200d-2642':0, '1f3c3-1f3fe-200d-2642':0, '1f3c3-1f3ff-200d-2642':0, '1f3c3-1f3fb':0, '1f3c3-1f3fc':0, '1f3c3-1f3fd':0, '1f3c3-1f3fe':0, '1f3c3-1f3ff':0, '1f3c4-1f3fb-200d-2640':0, '1f3c4-1f3fc-200d-2640':0, '1f3c4-1f3fd-200d-2640':0, '1f3c4-1f3fe-200d-2640':0, '1f3c4-1f3ff-200d-2640':0, '1f3c4-1f3fb-200d-2642':0, '1f3c4-1f3fc-200d-2642':0, '1f3c4-1f3fd-200d-2642':0, '1f3c4-1f3fe-200d-2642':0, '1f3c4-1f3ff-200d-2642':0, '1f3c4-1f3fb':0, '1f3c4-1f3fc':0, '1f3c4-1f3fd':0, '1f3c4-1f3fe':0, '1f3c4-1f3ff':0, '1f3c7-1f3fb':0, '1f3c7-1f3fc':0, '1f3c7-1f3fd':0, '1f3c7-1f3fe':0, '1f3c7-1f3ff':0, '1f3ca-1f3fb-200d-2640':0, '1f3ca-1f3fc-200d-2640':0, '1f3ca-1f3fd-200d-2640':0, '1f3ca-1f3fe-200d-2640':0, '1f3ca-1f3ff-200d-2640':0, '1f3ca-1f3fb-200d-2642':0, '1f3ca-1f3fc-200d-2642':0, '1f3ca-1f3fd-200d-2642':0, '1f3ca-1f3fe-200d-2642':0, '1f3ca-1f3ff-200d-2642':0, '1f3ca-1f3fb':0, '1f3ca-1f3fc':0, '1f3ca-1f3fd':0, '1f3ca-1f3fe':0, '1f3ca-1f3ff':0, '1f3cb-1f3fb-200d-2640':0, '1f3cb-1f3fc-200d-2640':0, '1f3cb-1f3fd-200d-2640':0, '1f3cb-1f3fe-200d-2640':0, '1f3cb-1f3ff-200d-2640':0, '1f3cb-1f3fb-200d-2642':0, '1f3cb-1f3fc-200d-2642':0, '1f3cb-1f3fd-200d-2642':0, '1f3cb-1f3fe-200d-2642':0, '1f3cb-1f3ff-200d-2642':0, '1f3cb-1f3fb':0, '1f3cb-1f3fc':0, '1f3cb-1f3fd':0, '1f3cb-1f3fe':0, '1f3cb-1f3ff':0, '1f3cc-1f3fb-200d-2640':0, '1f3cc-1f3fc-200d-2640':0, '1f3cc-1f3fd-200d-2640':0, '1f3cc-1f3fe-200d-2640':0, '1f3cc-1f3ff-200d-2640':0, '1f3cc-1f3fb-200d-2642':0, '1f3cc-1f3fc-200d-2642':0, '1f3cc-1f3fd-200d-2642':0, '1f3cc-1f3fe-200d-2642':0, '1f3cc-1f3ff-200d-2642':0, '1f3cc-1f3fb':0, '1f3cc-1f3fc':0, '1f3cc-1f3fd':0, '1f3cc-1f3fe':0, '1f3cc-1f3ff':0, '1f442-1f3fb':0, '1f442-1f3fc':0, '1f442-1f3fd':0, '1f442-1f3fe':0, '1f442-1f3ff':0, '1f443-1f3fb':0, '1f443-1f3fc':0, '1f443-1f3fd':0, '1f443-1f3fe':0, '1f443-1f3ff':0, '1f446-1f3fb':0, '1f446-1f3fc':0, '1f446-1f3fd':0, '1f446-1f3fe':0, '1f446-1f3ff':0, '1f447-1f3fb':0, '1f447-1f3fc':0, '1f447-1f3fd':0, '1f447-1f3fe':0, '1f447-1f3ff':0, '1f448-1f3fb':0, '1f448-1f3fc':0, '1f448-1f3fd':0, '1f448-1f3fe':0, '1f448-1f3ff':0, '1f449-1f3fb':0, '1f449-1f3fc':0, '1f449-1f3fd':0, '1f449-1f3fe':0, '1f449-1f3ff':0, '1f44a-1f3fb':0, '1f44a-1f3fc':0, '1f44a-1f3fd':0, '1f44a-1f3fe':0, '1f44a-1f3ff':0, '1f44b-1f3fb':0, '1f44b-1f3fc':0, '1f44b-1f3fd':0, '1f44b-1f3fe':0, '1f44b-1f3ff':0, '1f44c-1f3fb':0, '1f44c-1f3fc':0, '1f44c-1f3fd':0, '1f44c-1f3fe':0, '1f44c-1f3ff':0, '1f44d-1f3fb':0, '1f44d-1f3fc':0, '1f44d-1f3fd':0, '1f44d-1f3fe':0, '1f44d-1f3ff':0, '1f44e-1f3fb':0, '1f44e-1f3fc':0, '1f44e-1f3fd':0, '1f44e-1f3fe':0, '1f44e-1f3ff':0, '1f44f-1f3fb':0, '1f44f-1f3fc':0, '1f44f-1f3fd':0, '1f44f-1f3fe':0, '1f44f-1f3ff':0, '1f450-1f3fb':0, '1f450-1f3fc':0, '1f450-1f3fd':0, '1f450-1f3fe':0, '1f450-1f3ff':0, '1f466-1f3fb':0, '1f466-1f3fc':0, '1f466-1f3fd':0, '1f466-1f3fe':0, '1f466-1f3ff':0, '1f467-1f3fb':0, '1f467-1f3fc':0, '1f467-1f3fd':0, '1f467-1f3fe':0, '1f467-1f3ff':0, '1f468-1f3fb-200d-1f33e':0, '1f468-1f3fc-200d-1f33e':0, '1f468-1f3fd-200d-1f33e':0, '1f468-1f3fe-200d-1f33e':0, '1f468-1f3ff-200d-1f33e':0, '1f468-1f3fb-200d-1f373':0, '1f468-1f3fc-200d-1f373':0, '1f468-1f3fd-200d-1f373':0, '1f468-1f3fe-200d-1f373':0, '1f468-1f3ff-200d-1f373':0, '1f468-1f3fb-200d-1f37c':0, '1f468-1f3fc-200d-1f37c':0, '1f468-1f3fd-200d-1f37c':0, '1f468-1f3fe-200d-1f37c':0, '1f468-1f3ff-200d-1f37c':0, '1f468-1f3fb-200d-1f393':0, '1f468-1f3fc-200d-1f393':0, '1f468-1f3fd-200d-1f393':0, '1f468-1f3fe-200d-1f393':0, '1f468-1f3ff-200d-1f393':0, '1f468-1f3fb-200d-1f3a4':0, '1f468-1f3fc-200d-1f3a4':0, '1f468-1f3fd-200d-1f3a4':0, '1f468-1f3fe-200d-1f3a4':0, '1f468-1f3ff-200d-1f3a4':0, '1f468-1f3fb-200d-1f3a8':0, '1f468-1f3fc-200d-1f3a8':0, '1f468-1f3fd-200d-1f3a8':0, '1f468-1f3fe-200d-1f3a8':0, '1f468-1f3ff-200d-1f3a8':0, '1f468-1f3fb-200d-1f3eb':0, '1f468-1f3fc-200d-1f3eb':0, '1f468-1f3fd-200d-1f3eb':0, '1f468-1f3fe-200d-1f3eb':0, '1f468-1f3ff-200d-1f3eb':0, '1f468-1f3fb-200d-1f3ed':0, '1f468-1f3fc-200d-1f3ed':0, '1f468-1f3fd-200d-1f3ed':0, '1f468-1f3fe-200d-1f3ed':0, '1f468-1f3ff-200d-1f3ed':0, '1f468-1f3fb-200d-1f4bb':0, '1f468-1f3fc-200d-1f4bb':0, '1f468-1f3fd-200d-1f4bb':0, '1f468-1f3fe-200d-1f4bb':0, '1f468-1f3ff-200d-1f4bb':0, '1f468-1f3fb-200d-1f4bc':0, '1f468-1f3fc-200d-1f4bc':0, '1f468-1f3fd-200d-1f4bc':0, '1f468-1f3fe-200d-1f4bc':0, '1f468-1f3ff-200d-1f4bc':0, '1f468-1f3fb-200d-1f527':0, '1f468-1f3fc-200d-1f527':0, '1f468-1f3fd-200d-1f527':0, '1f468-1f3fe-200d-1f527':0, '1f468-1f3ff-200d-1f527':0, '1f468-1f3fb-200d-1f52c':0, '1f468-1f3fc-200d-1f52c':0, '1f468-1f3fd-200d-1f52c':0, '1f468-1f3fe-200d-1f52c':0, '1f468-1f3ff-200d-1f52c':0, '1f468-1f3fb-200d-1f680':0, '1f468-1f3fc-200d-1f680':0, '1f468-1f3fd-200d-1f680':0, '1f468-1f3fe-200d-1f680':0, '1f468-1f3ff-200d-1f680':0, '1f468-1f3fb-200d-1f692':0, '1f468-1f3fc-200d-1f692':0, '1f468-1f3fd-200d-1f692':0, '1f468-1f3fe-200d-1f692':0, '1f468-1f3ff-200d-1f692':0, '1f468-1f3fb-200d-1f9af':0, '1f468-1f3fc-200d-1f9af':0, '1f468-1f3fd-200d-1f9af':0, '1f468-1f3fe-200d-1f9af':0, '1f468-1f3ff-200d-1f9af':0, '1f468-1f3fb-200d-1f9b0':0, '1f468-1f3fc-200d-1f9b0':0, '1f468-1f3fd-200d-1f9b0':0, '1f468-1f3fe-200d-1f9b0':0, '1f468-1f3ff-200d-1f9b0':0, '1f468-1f3fb-200d-1f9b1':0, '1f468-1f3fc-200d-1f9b1':0, '1f468-1f3fd-200d-1f9b1':0, '1f468-1f3fe-200d-1f9b1':0, '1f468-1f3ff-200d-1f9b1':0, '1f468-1f3fb-200d-1f9b2':0, '1f468-1f3fc-200d-1f9b2':0, '1f468-1f3fd-200d-1f9b2':0, '1f468-1f3fe-200d-1f9b2':0, '1f468-1f3ff-200d-1f9b2':0, '1f468-1f3fb-200d-1f9b3':0, '1f468-1f3fc-200d-1f9b3':0, '1f468-1f3fd-200d-1f9b3':0, '1f468-1f3fe-200d-1f9b3':0, '1f468-1f3ff-200d-1f9b3':0, '1f468-1f3fb-200d-1f9bc':0, '1f468-1f3fc-200d-1f9bc':0, '1f468-1f3fd-200d-1f9bc':0, '1f468-1f3fe-200d-1f9bc':0, '1f468-1f3ff-200d-1f9bc':0, '1f468-1f3fb-200d-1f9bd':0, '1f468-1f3fc-200d-1f9bd':0, '1f468-1f3fd-200d-1f9bd':0, '1f468-1f3fe-200d-1f9bd':0, '1f468-1f3ff-200d-1f9bd':0, '1f468-1f3fb-200d-2695':0, '1f468-1f3fc-200d-2695':0, '1f468-1f3fd-200d-2695':0, '1f468-1f3fe-200d-2695':0, '1f468-1f3ff-200d-2695':0, '1f468-1f3fb-200d-2696':0, '1f468-1f3fc-200d-2696':0, '1f468-1f3fd-200d-2696':0, '1f468-1f3fe-200d-2696':0, '1f468-1f3ff-200d-2696':0, '1f468-1f3fb-200d-2708':0, '1f468-1f3fc-200d-2708':0, '1f468-1f3fd-200d-2708':0, '1f468-1f3fe-200d-2708':0, '1f468-1f3ff-200d-2708':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fb':0, '1f468-1f3fc':0, '1f468-1f3fd':0, '1f468-1f3fe':0, '1f468-1f3ff':0, '1f469-1f3fb-200d-1f33e':0, '1f469-1f3fc-200d-1f33e':0, '1f469-1f3fd-200d-1f33e':0, '1f469-1f3fe-200d-1f33e':0, '1f469-1f3ff-200d-1f33e':0, '1f469-1f3fb-200d-1f373':0, '1f469-1f3fc-200d-1f373':0, '1f469-1f3fd-200d-1f373':0, '1f469-1f3fe-200d-1f373':0, '1f469-1f3ff-200d-1f373':0, '1f469-1f3fb-200d-1f37c':0, '1f469-1f3fc-200d-1f37c':0, '1f469-1f3fd-200d-1f37c':0, '1f469-1f3fe-200d-1f37c':0, '1f469-1f3ff-200d-1f37c':0, '1f469-1f3fb-200d-1f393':0, '1f469-1f3fc-200d-1f393':0, '1f469-1f3fd-200d-1f393':0, '1f469-1f3fe-200d-1f393':0, '1f469-1f3ff-200d-1f393':0, '1f469-1f3fb-200d-1f3a4':0, '1f469-1f3fc-200d-1f3a4':0, '1f469-1f3fd-200d-1f3a4':0, '1f469-1f3fe-200d-1f3a4':0, '1f469-1f3ff-200d-1f3a4':0, '1f469-1f3fb-200d-1f3a8':0, '1f469-1f3fc-200d-1f3a8':0, '1f469-1f3fd-200d-1f3a8':0, '1f469-1f3fe-200d-1f3a8':0, '1f469-1f3ff-200d-1f3a8':0, '1f469-1f3fb-200d-1f3eb':0, '1f469-1f3fc-200d-1f3eb':0, '1f469-1f3fd-200d-1f3eb':0, '1f469-1f3fe-200d-1f3eb':0, '1f469-1f3ff-200d-1f3eb':0, '1f469-1f3fb-200d-1f3ed':0, '1f469-1f3fc-200d-1f3ed':0, '1f469-1f3fd-200d-1f3ed':0, '1f469-1f3fe-200d-1f3ed':0, '1f469-1f3ff-200d-1f3ed':0, '1f469-1f3fb-200d-1f4bb':0, '1f469-1f3fc-200d-1f4bb':0, '1f469-1f3fd-200d-1f4bb':0, '1f469-1f3fe-200d-1f4bb':0, '1f469-1f3ff-200d-1f4bb':0, '1f469-1f3fb-200d-1f4bc':0, '1f469-1f3fc-200d-1f4bc':0, '1f469-1f3fd-200d-1f4bc':0, '1f469-1f3fe-200d-1f4bc':0, '1f469-1f3ff-200d-1f4bc':0, '1f469-1f3fb-200d-1f527':0, '1f469-1f3fc-200d-1f527':0, '1f469-1f3fd-200d-1f527':0, '1f469-1f3fe-200d-1f527':0, '1f469-1f3ff-200d-1f527':0, '1f469-1f3fb-200d-1f52c':0, '1f469-1f3fc-200d-1f52c':0, '1f469-1f3fd-200d-1f52c':0, '1f469-1f3fe-200d-1f52c':0, '1f469-1f3ff-200d-1f52c':0, '1f469-1f3fb-200d-1f680':0, '1f469-1f3fc-200d-1f680':0, '1f469-1f3fd-200d-1f680':0, '1f469-1f3fe-200d-1f680':0, '1f469-1f3ff-200d-1f680':0, '1f469-1f3fb-200d-1f692':0, '1f469-1f3fc-200d-1f692':0, '1f469-1f3fd-200d-1f692':0, '1f469-1f3fe-200d-1f692':0, '1f469-1f3ff-200d-1f692':0, '1f469-1f3fb-200d-1f9af':0, '1f469-1f3fc-200d-1f9af':0, '1f469-1f3fd-200d-1f9af':0, '1f469-1f3fe-200d-1f9af':0, '1f469-1f3ff-200d-1f9af':0, '1f469-1f3fb-200d-1f9b0':0, '1f469-1f3fc-200d-1f9b0':0, '1f469-1f3fd-200d-1f9b0':0, '1f469-1f3fe-200d-1f9b0':0, '1f469-1f3ff-200d-1f9b0':0, '1f469-1f3fb-200d-1f9b1':0, '1f469-1f3fc-200d-1f9b1':0, '1f469-1f3fd-200d-1f9b1':0, '1f469-1f3fe-200d-1f9b1':0, '1f469-1f3ff-200d-1f9b1':0, '1f469-1f3fb-200d-1f9b2':0, '1f469-1f3fc-200d-1f9b2':0, '1f469-1f3fd-200d-1f9b2':0, '1f469-1f3fe-200d-1f9b2':0, '1f469-1f3ff-200d-1f9b2':0, '1f469-1f3fb-200d-1f9b3':0, '1f469-1f3fc-200d-1f9b3':0, '1f469-1f3fd-200d-1f9b3':0, '1f469-1f3fe-200d-1f9b3':0, '1f469-1f3ff-200d-1f9b3':0, '1f469-1f3fb-200d-1f9bc':0, '1f469-1f3fc-200d-1f9bc':0, '1f469-1f3fd-200d-1f9bc':0, '1f469-1f3fe-200d-1f9bc':0, '1f469-1f3ff-200d-1f9bc':0, '1f469-1f3fb-200d-1f9bd':0, '1f469-1f3fc-200d-1f9bd':0, '1f469-1f3fd-200d-1f9bd':0, '1f469-1f3fe-200d-1f9bd':0, '1f469-1f3ff-200d-1f9bd':0, '1f469-1f3fb-200d-2695':0, '1f469-1f3fc-200d-2695':0, '1f469-1f3fd-200d-2695':0, '1f469-1f3fe-200d-2695':0, '1f469-1f3ff-200d-2695':0, '1f469-1f3fb-200d-2696':0, '1f469-1f3fc-200d-2696':0, '1f469-1f3fd-200d-2696':0, '1f469-1f3fe-200d-2696':0, '1f469-1f3ff-200d-2696':0, '1f469-1f3fb-200d-2708':0, '1f469-1f3fc-200d-2708':0, '1f469-1f3fd-200d-2708':0, '1f469-1f3fe-200d-2708':0, '1f469-1f3ff-200d-2708':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fb':0, '1f469-1f3fc':0, '1f469-1f3fd':0, '1f469-1f3fe':0, '1f469-1f3ff':0, '1f46b-1f3fb':0, '1f46b-1f3fc':0, '1f46b-1f3fd':0, '1f46b-1f3fe':0, '1f46b-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46c-1f3fb':0, '1f46c-1f3fc':0, '1f46c-1f3fd':0, '1f46c-1f3fe':0, '1f46c-1f3ff':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46d-1f3fb':0, '1f46d-1f3fc':0, '1f46d-1f3fd':0, '1f46d-1f3fe':0, '1f46d-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe':0, '1f46e-1f3fb-200d-2640':0, '1f46e-1f3fc-200d-2640':0, '1f46e-1f3fd-200d-2640':0, '1f46e-1f3fe-200d-2640':0, '1f46e-1f3ff-200d-2640':0, '1f46e-1f3fb-200d-2642':0, '1f46e-1f3fc-200d-2642':0, '1f46e-1f3fd-200d-2642':0, '1f46e-1f3fe-200d-2642':0, '1f46e-1f3ff-200d-2642':0, '1f46e-1f3fb':0, '1f46e-1f3fc':0, '1f46e-1f3fd':0, '1f46e-1f3fe':0, '1f46e-1f3ff':0, '1f470-1f3fb-200d-2640':0, '1f470-1f3fc-200d-2640':0, '1f470-1f3fd-200d-2640':0, '1f470-1f3fe-200d-2640':0, '1f470-1f3ff-200d-2640':0, '1f470-1f3fb-200d-2642':0, '1f470-1f3fc-200d-2642':0, '1f470-1f3fd-200d-2642':0, '1f470-1f3fe-200d-2642':0, '1f470-1f3ff-200d-2642':0, '1f470-1f3fb':0, '1f470-1f3fc':0, '1f470-1f3fd':0, '1f470-1f3fe':0, '1f470-1f3ff':0, '1f471-1f3fb-200d-2640':0, '1f471-1f3fc-200d-2640':0, '1f471-1f3fd-200d-2640':0, '1f471-1f3fe-200d-2640':0, '1f471-1f3ff-200d-2640':0, '1f471-1f3fb-200d-2642':0, '1f471-1f3fc-200d-2642':0, '1f471-1f3fd-200d-2642':0, '1f471-1f3fe-200d-2642':0, '1f471-1f3ff-200d-2642':0, '1f471-1f3fb':0, '1f471-1f3fc':0, '1f471-1f3fd':0, '1f471-1f3fe':0, '1f471-1f3ff':0, '1f472-1f3fb':0, '1f472-1f3fc':0, '1f472-1f3fd':0, '1f472-1f3fe':0, '1f472-1f3ff':0, '1f473-1f3fb-200d-2640':0, '1f473-1f3fc-200d-2640':0, '1f473-1f3fd-200d-2640':0, '1f473-1f3fe-200d-2640':0, '1f473-1f3ff-200d-2640':0, '1f473-1f3fb-200d-2642':0, '1f473-1f3fc-200d-2642':0, '1f473-1f3fd-200d-2642':0, '1f473-1f3fe-200d-2642':0, '1f473-1f3ff-200d-2642':0, '1f473-1f3fb':0, '1f473-1f3fc':0, '1f473-1f3fd':0, '1f473-1f3fe':0, '1f473-1f3ff':0, '1f474-1f3fb':0, '1f474-1f3fc':0, '1f474-1f3fd':0, '1f474-1f3fe':0, '1f474-1f3ff':0, '1f475-1f3fb':0, '1f475-1f3fc':0, '1f475-1f3fd':0, '1f475-1f3fe':0, '1f475-1f3ff':0, '1f476-1f3fb':0, '1f476-1f3fc':0, '1f476-1f3fd':0, '1f476-1f3fe':0, '1f476-1f3ff':0, '1f477-1f3fb-200d-2640':0, '1f477-1f3fc-200d-2640':0, '1f477-1f3fd-200d-2640':0, '1f477-1f3fe-200d-2640':0, '1f477-1f3ff-200d-2640':0, '1f477-1f3fb-200d-2642':0, '1f477-1f3fc-200d-2642':0, '1f477-1f3fd-200d-2642':0, '1f477-1f3fe-200d-2642':0, '1f477-1f3ff-200d-2642':0, '1f477-1f3fb':0, '1f477-1f3fc':0, '1f477-1f3fd':0, '1f477-1f3fe':0, '1f477-1f3ff':0, '1f478-1f3fb':0, '1f478-1f3fc':0, '1f478-1f3fd':0, '1f478-1f3fe':0, '1f478-1f3ff':0, '1f47c-1f3fb':0, '1f47c-1f3fc':0, '1f47c-1f3fd':0, '1f47c-1f3fe':0, '1f47c-1f3ff':0, '1f481-1f3fb-200d-2640':0, '1f481-1f3fc-200d-2640':0, '1f481-1f3fd-200d-2640':0, '1f481-1f3fe-200d-2640':0, '1f481-1f3ff-200d-2640':0, '1f481-1f3fb-200d-2642':0, '1f481-1f3fc-200d-2642':0, '1f481-1f3fd-200d-2642':0, '1f481-1f3fe-200d-2642':0, '1f481-1f3ff-200d-2642':0, '1f481-1f3fb':0, '1f481-1f3fc':0, '1f481-1f3fd':0, '1f481-1f3fe':0, '1f481-1f3ff':0, '1f482-1f3fb-200d-2640':0, '1f482-1f3fc-200d-2640':0, '1f482-1f3fd-200d-2640':0, '1f482-1f3fe-200d-2640':0, '1f482-1f3ff-200d-2640':0, '1f482-1f3fb-200d-2642':0, '1f482-1f3fc-200d-2642':0, '1f482-1f3fd-200d-2642':0, '1f482-1f3fe-200d-2642':0, '1f482-1f3ff-200d-2642':0, '1f482-1f3fb':0, '1f482-1f3fc':0, '1f482-1f3fd':0, '1f482-1f3fe':0, '1f482-1f3ff':0, '1f483-1f3fb':0, '1f483-1f3fc':0, '1f483-1f3fd':0, '1f483-1f3fe':0, '1f483-1f3ff':0, '1f485-1f3fb':0, '1f485-1f3fc':0, '1f485-1f3fd':0, '1f485-1f3fe':0, '1f485-1f3ff':0, '1f486-1f3fb-200d-2640':0, '1f486-1f3fc-200d-2640':0, '1f486-1f3fd-200d-2640':0, '1f486-1f3fe-200d-2640':0, '1f486-1f3ff-200d-2640':0, '1f486-1f3fb-200d-2642':0, '1f486-1f3fc-200d-2642':0, '1f486-1f3fd-200d-2642':0, '1f486-1f3fe-200d-2642':0, '1f486-1f3ff-200d-2642':0, '1f486-1f3fb':0, '1f486-1f3fc':0, '1f486-1f3fd':0, '1f486-1f3fe':0, '1f486-1f3ff':0, '1f487-1f3fb-200d-2640':0, '1f487-1f3fc-200d-2640':0, '1f487-1f3fd-200d-2640':0, '1f487-1f3fe-200d-2640':0, '1f487-1f3ff-200d-2640':0, '1f487-1f3fb-200d-2642':0, '1f487-1f3fc-200d-2642':0, '1f487-1f3fd-200d-2642':0, '1f487-1f3fe-200d-2642':0, '1f487-1f3ff-200d-2642':0, '1f487-1f3fb':0, '1f487-1f3fc':0, '1f487-1f3fd':0, '1f487-1f3fe':0, '1f487-1f3ff':0, '1f48f-1f3fb':0, '1f48f-1f3fc':0, '1f48f-1f3fd':0, '1f48f-1f3fe':0, '1f48f-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f491-1f3fb':0, '1f491-1f3fc':0, '1f491-1f3fd':0, '1f491-1f3fe':0, '1f491-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe':0, '1f4aa-1f3fb':0, '1f4aa-1f3fc':0, '1f4aa-1f3fd':0, '1f4aa-1f3fe':0, '1f4aa-1f3ff':0, '1f574-1f3fb':0, '1f574-1f3fc':0, '1f574-1f3fd':0, '1f574-1f3fe':0, '1f574-1f3ff':0, '1f575-1f3fb-200d-2640':0, '1f575-1f3fc-200d-2640':0, '1f575-1f3fd-200d-2640':0, '1f575-1f3fe-200d-2640':0, '1f575-1f3ff-200d-2640':0, '1f575-1f3fb-200d-2642':0, '1f575-1f3fc-200d-2642':0, '1f575-1f3fd-200d-2642':0, '1f575-1f3fe-200d-2642':0, '1f575-1f3ff-200d-2642':0, '1f575-1f3fb':0, '1f575-1f3fc':0, '1f575-1f3fd':0, '1f575-1f3fe':0, '1f575-1f3ff':0, '1f57a-1f3fb':0, '1f57a-1f3fc':0, '1f57a-1f3fd':0, '1f57a-1f3fe':0, '1f57a-1f3ff':0, '1f590-1f3fb':0, '1f590-1f3fc':0, '1f590-1f3fd':0, '1f590-1f3fe':0, '1f590-1f3ff':0, '1f595-1f3fb':0, '1f595-1f3fc':0, '1f595-1f3fd':0, '1f595-1f3fe':0, '1f595-1f3ff':0, '1f596-1f3fb':0, '1f596-1f3fc':0, '1f596-1f3fd':0, '1f596-1f3fe':0, '1f596-1f3ff':0, '1f645-1f3fb-200d-2640':0, '1f645-1f3fc-200d-2640':0, '1f645-1f3fd-200d-2640':0, '1f645-1f3fe-200d-2640':0, '1f645-1f3ff-200d-2640':0, '1f645-1f3fb-200d-2642':0, '1f645-1f3fc-200d-2642':0, '1f645-1f3fd-200d-2642':0, '1f645-1f3fe-200d-2642':0, '1f645-1f3ff-200d-2642':0, '1f645-1f3fb':0, '1f645-1f3fc':0, '1f645-1f3fd':0, '1f645-1f3fe':0, '1f645-1f3ff':0, '1f646-1f3fb-200d-2640':0, '1f646-1f3fc-200d-2640':0, '1f646-1f3fd-200d-2640':0, '1f646-1f3fe-200d-2640':0, '1f646-1f3ff-200d-2640':0, '1f646-1f3fb-200d-2642':0, '1f646-1f3fc-200d-2642':0, '1f646-1f3fd-200d-2642':0, '1f646-1f3fe-200d-2642':0, '1f646-1f3ff-200d-2642':0, '1f646-1f3fb':0, '1f646-1f3fc':0, '1f646-1f3fd':0, '1f646-1f3fe':0, '1f646-1f3ff':0, '1f647-1f3fb-200d-2640':0, '1f647-1f3fc-200d-2640':0, '1f647-1f3fd-200d-2640':0, '1f647-1f3fe-200d-2640':0, '1f647-1f3ff-200d-2640':0, '1f647-1f3fb-200d-2642':0, '1f647-1f3fc-200d-2642':0, '1f647-1f3fd-200d-2642':0, '1f647-1f3fe-200d-2642':0, '1f647-1f3ff-200d-2642':0, '1f647-1f3fb':0, '1f647-1f3fc':0, '1f647-1f3fd':0, '1f647-1f3fe':0, '1f647-1f3ff':0, '1f64b-1f3fb-200d-2640':0, '1f64b-1f3fc-200d-2640':0, '1f64b-1f3fd-200d-2640':0, '1f64b-1f3fe-200d-2640':0, '1f64b-1f3ff-200d-2640':0, '1f64b-1f3fb-200d-2642':0, '1f64b-1f3fc-200d-2642':0, '1f64b-1f3fd-200d-2642':0, '1f64b-1f3fe-200d-2642':0, '1f64b-1f3ff-200d-2642':0, '1f64b-1f3fb':0, '1f64b-1f3fc':0, '1f64b-1f3fd':0, '1f64b-1f3fe':0, '1f64b-1f3ff':0, '1f64c-1f3fb':0, '1f64c-1f3fc':0, '1f64c-1f3fd':0, '1f64c-1f3fe':0, '1f64c-1f3ff':0, '1f64d-1f3fb-200d-2640':0, '1f64d-1f3fc-200d-2640':0, '1f64d-1f3fd-200d-2640':0, '1f64d-1f3fe-200d-2640':0, '1f64d-1f3ff-200d-2640':0, '1f64d-1f3fb-200d-2642':0, '1f64d-1f3fc-200d-2642':0, '1f64d-1f3fd-200d-2642':0, '1f64d-1f3fe-200d-2642':0, '1f64d-1f3ff-200d-2642':0, '1f64d-1f3fb':0, '1f64d-1f3fc':0, '1f64d-1f3fd':0, '1f64d-1f3fe':0, '1f64d-1f3ff':0, '1f64e-1f3fb-200d-2640':0, '1f64e-1f3fc-200d-2640':0, '1f64e-1f3fd-200d-2640':0, '1f64e-1f3fe-200d-2640':0, '1f64e-1f3ff-200d-2640':0, '1f64e-1f3fb-200d-2642':0, '1f64e-1f3fc-200d-2642':0, '1f64e-1f3fd-200d-2642':0, '1f64e-1f3fe-200d-2642':0, '1f64e-1f3ff-200d-2642':0, '1f64e-1f3fb':0, '1f64e-1f3fc':0, '1f64e-1f3fd':0, '1f64e-1f3fe':0, '1f64e-1f3ff':0, '1f64f-1f3fb':0, '1f64f-1f3fc':0, '1f64f-1f3fd':0, '1f64f-1f3fe':0, '1f64f-1f3ff':0, '1f6a3-1f3fb-200d-2640':0, '1f6a3-1f3fc-200d-2640':0, '1f6a3-1f3fd-200d-2640':0, '1f6a3-1f3fe-200d-2640':0, '1f6a3-1f3ff-200d-2640':0, '1f6a3-1f3fb-200d-2642':0, '1f6a3-1f3fc-200d-2642':0, '1f6a3-1f3fd-200d-2642':0, '1f6a3-1f3fe-200d-2642':0, '1f6a3-1f3ff-200d-2642':0, '1f6a3-1f3fb':0, '1f6a3-1f3fc':0, '1f6a3-1f3fd':0, '1f6a3-1f3fe':0, '1f6a3-1f3ff':0, '1f6b4-1f3fb-200d-2640':0, '1f6b4-1f3fc-200d-2640':0, '1f6b4-1f3fd-200d-2640':0, '1f6b4-1f3fe-200d-2640':0, '1f6b4-1f3ff-200d-2640':0, '1f6b4-1f3fb-200d-2642':0, '1f6b4-1f3fc-200d-2642':0, '1f6b4-1f3fd-200d-2642':0, '1f6b4-1f3fe-200d-2642':0, '1f6b4-1f3ff-200d-2642':0, '1f6b4-1f3fb':0, '1f6b4-1f3fc':0, '1f6b4-1f3fd':0, '1f6b4-1f3fe':0, '1f6b4-1f3ff':0, '1f6b5-1f3fb-200d-2640':0, '1f6b5-1f3fc-200d-2640':0, '1f6b5-1f3fd-200d-2640':0, '1f6b5-1f3fe-200d-2640':0, '1f6b5-1f3ff-200d-2640':0, '1f6b5-1f3fb-200d-2642':0, '1f6b5-1f3fc-200d-2642':0, '1f6b5-1f3fd-200d-2642':0, '1f6b5-1f3fe-200d-2642':0, '1f6b5-1f3ff-200d-2642':0, '1f6b5-1f3fb':0, '1f6b5-1f3fc':0, '1f6b5-1f3fd':0, '1f6b5-1f3fe':0, '1f6b5-1f3ff':0, '1f6b6-1f3fb-200d-2640':0, '1f6b6-1f3fc-200d-2640':0, '1f6b6-1f3fd-200d-2640':0, '1f6b6-1f3fe-200d-2640':0, '1f6b6-1f3ff-200d-2640':0, '1f6b6-1f3fb-200d-2642':0, '1f6b6-1f3fc-200d-2642':0, '1f6b6-1f3fd-200d-2642':0, '1f6b6-1f3fe-200d-2642':0, '1f6b6-1f3ff-200d-2642':0, '1f6b6-1f3fb':0, '1f6b6-1f3fc':0, '1f6b6-1f3fd':0, '1f6b6-1f3fe':0, '1f6b6-1f3ff':0, '1f6c0-1f3fb':0, '1f6c0-1f3fc':0, '1f6c0-1f3fd':0, '1f6c0-1f3fe':0, '1f6c0-1f3ff':0, '1f6cc-1f3fb':0, '1f6cc-1f3fc':0, '1f6cc-1f3fd':0, '1f6cc-1f3fe':0, '1f6cc-1f3ff':0, '1f90c-1f3fb':0, '1f90c-1f3fc':0, '1f90c-1f3fd':0, '1f90c-1f3fe':0, '1f90c-1f3ff':0, '1f90f-1f3fb':0, '1f90f-1f3fc':0, '1f90f-1f3fd':0, '1f90f-1f3fe':0, '1f90f-1f3ff':0, '1f918-1f3fb':0, '1f918-1f3fc':0, '1f918-1f3fd':0, '1f918-1f3fe':0, '1f918-1f3ff':0, '1f919-1f3fb':0, '1f919-1f3fc':0, '1f919-1f3fd':0, '1f919-1f3fe':0, '1f919-1f3ff':0, '1f91a-1f3fb':0, '1f91a-1f3fc':0, '1f91a-1f3fd':0, '1f91a-1f3fe':0, '1f91a-1f3ff':0, '1f91b-1f3fb':0, '1f91b-1f3fc':0, '1f91b-1f3fd':0, '1f91b-1f3fe':0, '1f91b-1f3ff':0, '1f91c-1f3fb':0, '1f91c-1f3fc':0, '1f91c-1f3fd':0, '1f91c-1f3fe':0, '1f91c-1f3ff':0, '1f91d-1f3fb':0, '1f91d-1f3fc':0, '1f91d-1f3fd':0, '1f91d-1f3fe':0, '1f91d-1f3ff':0, '1f91e-1f3fb':0, '1f91e-1f3fc':0, '1f91e-1f3fd':0, '1f91e-1f3fe':0, '1f91e-1f3ff':0, '1f91f-1f3fb':0, '1f91f-1f3fc':0, '1f91f-1f3fd':0, '1f91f-1f3fe':0, '1f91f-1f3ff':0, '1f926-1f3fb-200d-2640':0, '1f926-1f3fc-200d-2640':0, '1f926-1f3fd-200d-2640':0, '1f926-1f3fe-200d-2640':0, '1f926-1f3ff-200d-2640':0, '1f926-1f3fb-200d-2642':0, '1f926-1f3fc-200d-2642':0, '1f926-1f3fd-200d-2642':0, '1f926-1f3fe-200d-2642':0, '1f926-1f3ff-200d-2642':0, '1f926-1f3fb':0, '1f926-1f3fc':0, '1f926-1f3fd':0, '1f926-1f3fe':0, '1f926-1f3ff':0, '1f930-1f3fb':0, '1f930-1f3fc':0, '1f930-1f3fd':0, '1f930-1f3fe':0, '1f930-1f3ff':0, '1f931-1f3fb':0, '1f931-1f3fc':0, '1f931-1f3fd':0, '1f931-1f3fe':0, '1f931-1f3ff':0, '1f932-1f3fb':0, '1f932-1f3fc':0, '1f932-1f3fd':0, '1f932-1f3fe':0, '1f932-1f3ff':0, '1f933-1f3fb':0, '1f933-1f3fc':0, '1f933-1f3fd':0, '1f933-1f3fe':0, '1f933-1f3ff':0, '1f934-1f3fb':0, '1f934-1f3fc':0, '1f934-1f3fd':0, '1f934-1f3fe':0, '1f934-1f3ff':0, '1f935-1f3fb-200d-2640':0, '1f935-1f3fc-200d-2640':0, '1f935-1f3fd-200d-2640':0, '1f935-1f3fe-200d-2640':0, '1f935-1f3ff-200d-2640':0, '1f935-1f3fb-200d-2642':0, '1f935-1f3fc-200d-2642':0, '1f935-1f3fd-200d-2642':0, '1f935-1f3fe-200d-2642':0, '1f935-1f3ff-200d-2642':0, '1f935-1f3fb':0, '1f935-1f3fc':0, '1f935-1f3fd':0, '1f935-1f3fe':0, '1f935-1f3ff':0, '1f936-1f3fb':0, '1f936-1f3fc':0, '1f936-1f3fd':0, '1f936-1f3fe':0, '1f936-1f3ff':0, '1f937-1f3fb-200d-2640':0, '1f937-1f3fc-200d-2640':0, '1f937-1f3fd-200d-2640':0, '1f937-1f3fe-200d-2640':0, '1f937-1f3ff-200d-2640':0, '1f937-1f3fb-200d-2642':0, '1f937-1f3fc-200d-2642':0, '1f937-1f3fd-200d-2642':0, '1f937-1f3fe-200d-2642':0, '1f937-1f3ff-200d-2642':0, '1f937-1f3fb':0, '1f937-1f3fc':0, '1f937-1f3fd':0, '1f937-1f3fe':0, '1f937-1f3ff':0, '1f938-1f3fb-200d-2640':0, '1f938-1f3fc-200d-2640':0, '1f938-1f3fd-200d-2640':0, '1f938-1f3fe-200d-2640':0, '1f938-1f3ff-200d-2640':0, '1f938-1f3fb-200d-2642':0, '1f938-1f3fc-200d-2642':0, '1f938-1f3fd-200d-2642':0, '1f938-1f3fe-200d-2642':0, '1f938-1f3ff-200d-2642':0, '1f938-1f3fb':0, '1f938-1f3fc':0, '1f938-1f3fd':0, '1f938-1f3fe':0, '1f938-1f3ff':0, '1f939-1f3fb-200d-2640':0, '1f939-1f3fc-200d-2640':0, '1f939-1f3fd-200d-2640':0, '1f939-1f3fe-200d-2640':0, '1f939-1f3ff-200d-2640':0, '1f939-1f3fb-200d-2642':0, '1f939-1f3fc-200d-2642':0, '1f939-1f3fd-200d-2642':0, '1f939-1f3fe-200d-2642':0, '1f939-1f3ff-200d-2642':0, '1f939-1f3fb':0, '1f939-1f3fc':0, '1f939-1f3fd':0, '1f939-1f3fe':0, '1f939-1f3ff':0, '1f93d-1f3fb-200d-2640':0, '1f93d-1f3fc-200d-2640':0, '1f93d-1f3fd-200d-2640':0, '1f93d-1f3fe-200d-2640':0, '1f93d-1f3ff-200d-2640':0, '1f93d-1f3fb-200d-2642':0, '1f93d-1f3fc-200d-2642':0, '1f93d-1f3fd-200d-2642':0, '1f93d-1f3fe-200d-2642':0, '1f93d-1f3ff-200d-2642':0, '1f93d-1f3fb':0, '1f93d-1f3fc':0, '1f93d-1f3fd':0, '1f93d-1f3fe':0, '1f93d-1f3ff':0, '1f93e-1f3fb-200d-2640':0, '1f93e-1f3fc-200d-2640':0, '1f93e-1f3fd-200d-2640':0, '1f93e-1f3fe-200d-2640':0, '1f93e-1f3ff-200d-2640':0, '1f93e-1f3fb-200d-2642':0, '1f93e-1f3fc-200d-2642':0, '1f93e-1f3fd-200d-2642':0, '1f93e-1f3fe-200d-2642':0, '1f93e-1f3ff-200d-2642':0, '1f93e-1f3fb':0, '1f93e-1f3fc':0, '1f93e-1f3fd':0, '1f93e-1f3fe':0, '1f93e-1f3ff':0, '1f977-1f3fb':0, '1f977-1f3fc':0, '1f977-1f3fd':0, '1f977-1f3fe':0, '1f977-1f3ff':0, '1f9b5-1f3fb':0, '1f9b5-1f3fc':0, '1f9b5-1f3fd':0, '1f9b5-1f3fe':0, '1f9b5-1f3ff':0, '1f9b6-1f3fb':0, '1f9b6-1f3fc':0, '1f9b6-1f3fd':0, '1f9b6-1f3fe':0, '1f9b6-1f3ff':0, '1f9b8-1f3fb-200d-2640':0, '1f9b8-1f3fc-200d-2640':0, '1f9b8-1f3fd-200d-2640':0, '1f9b8-1f3fe-200d-2640':0, '1f9b8-1f3ff-200d-2640':0, '1f9b8-1f3fb-200d-2642':0, '1f9b8-1f3fc-200d-2642':0, '1f9b8-1f3fd-200d-2642':0, '1f9b8-1f3fe-200d-2642':0, '1f9b8-1f3ff-200d-2642':0, '1f9b8-1f3fb':0, '1f9b8-1f3fc':0, '1f9b8-1f3fd':0, '1f9b8-1f3fe':0, '1f9b8-1f3ff':0, '1f9b9-1f3fb-200d-2640':0, '1f9b9-1f3fc-200d-2640':0, '1f9b9-1f3fd-200d-2640':0, '1f9b9-1f3fe-200d-2640':0, '1f9b9-1f3ff-200d-2640':0, '1f9b9-1f3fb-200d-2642':0, '1f9b9-1f3fc-200d-2642':0, '1f9b9-1f3fd-200d-2642':0, '1f9b9-1f3fe-200d-2642':0, '1f9b9-1f3ff-200d-2642':0, '1f9b9-1f3fb':0, '1f9b9-1f3fc':0, '1f9b9-1f3fd':0, '1f9b9-1f3fe':0, '1f9b9-1f3ff':0, '1f9bb-1f3fb':0, '1f9bb-1f3fc':0, '1f9bb-1f3fd':0, '1f9bb-1f3fe':0, '1f9bb-1f3ff':0, '1f9cd-1f3fb-200d-2640':0, '1f9cd-1f3fc-200d-2640':0, '1f9cd-1f3fd-200d-2640':0, '1f9cd-1f3fe-200d-2640':0, '1f9cd-1f3ff-200d-2640':0, '1f9cd-1f3fb-200d-2642':0, '1f9cd-1f3fc-200d-2642':0, '1f9cd-1f3fd-200d-2642':0, '1f9cd-1f3fe-200d-2642':0, '1f9cd-1f3ff-200d-2642':0, '1f9cd-1f3fb':0, '1f9cd-1f3fc':0, '1f9cd-1f3fd':0, '1f9cd-1f3fe':0, '1f9cd-1f3ff':0, '1f9ce-1f3fb-200d-2640':0, '1f9ce-1f3fc-200d-2640':0, '1f9ce-1f3fd-200d-2640':0, '1f9ce-1f3fe-200d-2640':0, '1f9ce-1f3ff-200d-2640':0, '1f9ce-1f3fb-200d-2642':0, '1f9ce-1f3fc-200d-2642':0, '1f9ce-1f3fd-200d-2642':0, '1f9ce-1f3fe-200d-2642':0, '1f9ce-1f3ff-200d-2642':0, '1f9ce-1f3fb':0, '1f9ce-1f3fc':0, '1f9ce-1f3fd':0, '1f9ce-1f3fe':0, '1f9ce-1f3ff':0, '1f9cf-1f3fb-200d-2640':0, '1f9cf-1f3fc-200d-2640':0, '1f9cf-1f3fd-200d-2640':0, '1f9cf-1f3fe-200d-2640':0, '1f9cf-1f3ff-200d-2640':0, '1f9cf-1f3fb-200d-2642':0, '1f9cf-1f3fc-200d-2642':0, '1f9cf-1f3fd-200d-2642':0, '1f9cf-1f3fe-200d-2642':0, '1f9cf-1f3ff-200d-2642':0, '1f9cf-1f3fb':0, '1f9cf-1f3fc':0, '1f9cf-1f3fd':0, '1f9cf-1f3fe':0, '1f9cf-1f3ff':0, '1f9d1-1f3fb-200d-1f33e':0, '1f9d1-1f3fc-200d-1f33e':0, '1f9d1-1f3fd-200d-1f33e':0, '1f9d1-1f3fe-200d-1f33e':0, '1f9d1-1f3ff-200d-1f33e':0, '1f9d1-1f3fb-200d-1f373':0, '1f9d1-1f3fc-200d-1f373':0, '1f9d1-1f3fd-200d-1f373':0, '1f9d1-1f3fe-200d-1f373':0, '1f9d1-1f3ff-200d-1f373':0, '1f9d1-1f3fb-200d-1f37c':0, '1f9d1-1f3fc-200d-1f37c':0, '1f9d1-1f3fd-200d-1f37c':0, '1f9d1-1f3fe-200d-1f37c':0, '1f9d1-1f3ff-200d-1f37c':0, '1f9d1-1f3fb-200d-1f384':0, '1f9d1-1f3fc-200d-1f384':0, '1f9d1-1f3fd-200d-1f384':0, '1f9d1-1f3fe-200d-1f384':0, '1f9d1-1f3ff-200d-1f384':0, '1f9d1-1f3fb-200d-1f393':0, '1f9d1-1f3fc-200d-1f393':0, '1f9d1-1f3fd-200d-1f393':0, '1f9d1-1f3fe-200d-1f393':0, '1f9d1-1f3ff-200d-1f393':0, '1f9d1-1f3fb-200d-1f3a4':0, '1f9d1-1f3fc-200d-1f3a4':0, '1f9d1-1f3fd-200d-1f3a4':0, '1f9d1-1f3fe-200d-1f3a4':0, '1f9d1-1f3ff-200d-1f3a4':0, '1f9d1-1f3fb-200d-1f3a8':0, '1f9d1-1f3fc-200d-1f3a8':0, '1f9d1-1f3fd-200d-1f3a8':0, '1f9d1-1f3fe-200d-1f3a8':0, '1f9d1-1f3ff-200d-1f3a8':0, '1f9d1-1f3fb-200d-1f3eb':0, '1f9d1-1f3fc-200d-1f3eb':0, '1f9d1-1f3fd-200d-1f3eb':0, '1f9d1-1f3fe-200d-1f3eb':0, '1f9d1-1f3ff-200d-1f3eb':0, '1f9d1-1f3fb-200d-1f3ed':0, '1f9d1-1f3fc-200d-1f3ed':0, '1f9d1-1f3fd-200d-1f3ed':0, '1f9d1-1f3fe-200d-1f3ed':0, '1f9d1-1f3ff-200d-1f3ed':0, '1f9d1-1f3fb-200d-1f4bb':0, '1f9d1-1f3fc-200d-1f4bb':0, '1f9d1-1f3fd-200d-1f4bb':0, '1f9d1-1f3fe-200d-1f4bb':0, '1f9d1-1f3ff-200d-1f4bb':0, '1f9d1-1f3fb-200d-1f4bc':0, '1f9d1-1f3fc-200d-1f4bc':0, '1f9d1-1f3fd-200d-1f4bc':0, '1f9d1-1f3fe-200d-1f4bc':0, '1f9d1-1f3ff-200d-1f4bc':0, '1f9d1-1f3fb-200d-1f527':0, '1f9d1-1f3fc-200d-1f527':0, '1f9d1-1f3fd-200d-1f527':0, '1f9d1-1f3fe-200d-1f527':0, '1f9d1-1f3ff-200d-1f527':0, '1f9d1-1f3fb-200d-1f52c':0, '1f9d1-1f3fc-200d-1f52c':0, '1f9d1-1f3fd-200d-1f52c':0, '1f9d1-1f3fe-200d-1f52c':0, '1f9d1-1f3ff-200d-1f52c':0, '1f9d1-1f3fb-200d-1f680':0, '1f9d1-1f3fc-200d-1f680':0, '1f9d1-1f3fd-200d-1f680':0, '1f9d1-1f3fe-200d-1f680':0, '1f9d1-1f3ff-200d-1f680':0, '1f9d1-1f3fb-200d-1f692':0, '1f9d1-1f3fc-200d-1f692':0, '1f9d1-1f3fd-200d-1f692':0, '1f9d1-1f3fe-200d-1f692':0, '1f9d1-1f3ff-200d-1f692':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fb-200d-1f9af':0, '1f9d1-1f3fc-200d-1f9af':0, '1f9d1-1f3fd-200d-1f9af':0, '1f9d1-1f3fe-200d-1f9af':0, '1f9d1-1f3ff-200d-1f9af':0, '1f9d1-1f3fb-200d-1f9b0':0, '1f9d1-1f3fc-200d-1f9b0':0, '1f9d1-1f3fd-200d-1f9b0':0, '1f9d1-1f3fe-200d-1f9b0':0, '1f9d1-1f3ff-200d-1f9b0':0, '1f9d1-1f3fb-200d-1f9b1':0, '1f9d1-1f3fc-200d-1f9b1':0, '1f9d1-1f3fd-200d-1f9b1':0, '1f9d1-1f3fe-200d-1f9b1':0, '1f9d1-1f3ff-200d-1f9b1':0, '1f9d1-1f3fb-200d-1f9b2':0, '1f9d1-1f3fc-200d-1f9b2':0, '1f9d1-1f3fd-200d-1f9b2':0, '1f9d1-1f3fe-200d-1f9b2':0, '1f9d1-1f3ff-200d-1f9b2':0, '1f9d1-1f3fb-200d-1f9b3':0, '1f9d1-1f3fc-200d-1f9b3':0, '1f9d1-1f3fd-200d-1f9b3':0, '1f9d1-1f3fe-200d-1f9b3':0, '1f9d1-1f3ff-200d-1f9b3':0, '1f9d1-1f3fb-200d-1f9bc':0, '1f9d1-1f3fc-200d-1f9bc':0, '1f9d1-1f3fd-200d-1f9bc':0, '1f9d1-1f3fe-200d-1f9bc':0, '1f9d1-1f3ff-200d-1f9bc':0, '1f9d1-1f3fb-200d-1f9bd':0, '1f9d1-1f3fc-200d-1f9bd':0, '1f9d1-1f3fd-200d-1f9bd':0, '1f9d1-1f3fe-200d-1f9bd':0, '1f9d1-1f3ff-200d-1f9bd':0, '1f9d1-1f3fb-200d-2695':0, '1f9d1-1f3fc-200d-2695':0, '1f9d1-1f3fd-200d-2695':0, '1f9d1-1f3fe-200d-2695':0, '1f9d1-1f3ff-200d-2695':0, '1f9d1-1f3fb-200d-2696':0, '1f9d1-1f3fc-200d-2696':0, '1f9d1-1f3fd-200d-2696':0, '1f9d1-1f3fe-200d-2696':0, '1f9d1-1f3ff-200d-2696':0, '1f9d1-1f3fb-200d-2708':0, '1f9d1-1f3fc-200d-2708':0, '1f9d1-1f3fd-200d-2708':0, '1f9d1-1f3fe-200d-2708':0, '1f9d1-1f3ff-200d-2708':0, '1f9d1-1f3fb':0, '1f9d1-1f3fc':0, '1f9d1-1f3fd':0, '1f9d1-1f3fe':0, '1f9d1-1f3ff':0, '1f9d2-1f3fb':0, '1f9d2-1f3fc':0, '1f9d2-1f3fd':0, '1f9d2-1f3fe':0, '1f9d2-1f3ff':0, '1f9d3-1f3fb':0, '1f9d3-1f3fc':0, '1f9d3-1f3fd':0, '1f9d3-1f3fe':0, '1f9d3-1f3ff':0, '1f9d4-1f3fb-200d-2640':0, '1f9d4-1f3fc-200d-2640':0, '1f9d4-1f3fd-200d-2640':0, '1f9d4-1f3fe-200d-2640':0, '1f9d4-1f3ff-200d-2640':0, '1f9d4-1f3fb-200d-2642':0, '1f9d4-1f3fc-200d-2642':0, '1f9d4-1f3fd-200d-2642':0, '1f9d4-1f3fe-200d-2642':0, '1f9d4-1f3ff-200d-2642':0, '1f9d4-1f3fb':0, '1f9d4-1f3fc':0, '1f9d4-1f3fd':0, '1f9d4-1f3fe':0, '1f9d4-1f3ff':0, '1f9d5-1f3fb':0, '1f9d5-1f3fc':0, '1f9d5-1f3fd':0, '1f9d5-1f3fe':0, '1f9d5-1f3ff':0, '1f9d6-1f3fb-200d-2640':0, '1f9d6-1f3fc-200d-2640':0, '1f9d6-1f3fd-200d-2640':0, '1f9d6-1f3fe-200d-2640':0, '1f9d6-1f3ff-200d-2640':0, '1f9d6-1f3fb-200d-2642':0, '1f9d6-1f3fc-200d-2642':0, '1f9d6-1f3fd-200d-2642':0, '1f9d6-1f3fe-200d-2642':0, '1f9d6-1f3ff-200d-2642':0, '1f9d6-1f3fb':0, '1f9d6-1f3fc':0, '1f9d6-1f3fd':0, '1f9d6-1f3fe':0, '1f9d6-1f3ff':0, '1f9d7-1f3fb-200d-2640':0, '1f9d7-1f3fc-200d-2640':0, '1f9d7-1f3fd-200d-2640':0, '1f9d7-1f3fe-200d-2640':0, '1f9d7-1f3ff-200d-2640':0, '1f9d7-1f3fb-200d-2642':0, '1f9d7-1f3fc-200d-2642':0, '1f9d7-1f3fd-200d-2642':0, '1f9d7-1f3fe-200d-2642':0, '1f9d7-1f3ff-200d-2642':0, '1f9d7-1f3fb':0, '1f9d7-1f3fc':0, '1f9d7-1f3fd':0, '1f9d7-1f3fe':0, '1f9d7-1f3ff':0, '1f9d8-1f3fb-200d-2640':0, '1f9d8-1f3fc-200d-2640':0, '1f9d8-1f3fd-200d-2640':0, '1f9d8-1f3fe-200d-2640':0, '1f9d8-1f3ff-200d-2640':0, '1f9d8-1f3fb-200d-2642':0, '1f9d8-1f3fc-200d-2642':0, '1f9d8-1f3fd-200d-2642':0, '1f9d8-1f3fe-200d-2642':0, '1f9d8-1f3ff-200d-2642':0, '1f9d8-1f3fb':0, '1f9d8-1f3fc':0, '1f9d8-1f3fd':0, '1f9d8-1f3fe':0, '1f9d8-1f3ff':0, '1f9d9-1f3fb-200d-2640':0, '1f9d9-1f3fc-200d-2640':0, '1f9d9-1f3fd-200d-2640':0, '1f9d9-1f3fe-200d-2640':0, '1f9d9-1f3ff-200d-2640':0, '1f9d9-1f3fb-200d-2642':0, '1f9d9-1f3fc-200d-2642':0, '1f9d9-1f3fd-200d-2642':0, '1f9d9-1f3fe-200d-2642':0, '1f9d9-1f3ff-200d-2642':0, '1f9d9-1f3fb':0, '1f9d9-1f3fc':0, '1f9d9-1f3fd':0, '1f9d9-1f3fe':0, '1f9d9-1f3ff':0, '1f9da-1f3fb-200d-2640':0, '1f9da-1f3fc-200d-2640':0, '1f9da-1f3fd-200d-2640':0, '1f9da-1f3fe-200d-2640':0, '1f9da-1f3ff-200d-2640':0, '1f9da-1f3fb-200d-2642':0, '1f9da-1f3fc-200d-2642':0, '1f9da-1f3fd-200d-2642':0, '1f9da-1f3fe-200d-2642':0, '1f9da-1f3ff-200d-2642':0, '1f9da-1f3fb':0, '1f9da-1f3fc':0, '1f9da-1f3fd':0, '1f9da-1f3fe':0, '1f9da-1f3ff':0, '1f9db-1f3fb-200d-2640':0, '1f9db-1f3fc-200d-2640':0, '1f9db-1f3fd-200d-2640':0, '1f9db-1f3fe-200d-2640':0, '1f9db-1f3ff-200d-2640':0, '1f9db-1f3fb-200d-2642':0, '1f9db-1f3fc-200d-2642':0, '1f9db-1f3fd-200d-2642':0, '1f9db-1f3fe-200d-2642':0, '1f9db-1f3ff-200d-2642':0, '1f9db-1f3fb':0, '1f9db-1f3fc':0, '1f9db-1f3fd':0, '1f9db-1f3fe':0, '1f9db-1f3ff':0, '1f9dc-1f3fb-200d-2640':0, '1f9dc-1f3fc-200d-2640':0, '1f9dc-1f3fd-200d-2640':0, '1f9dc-1f3fe-200d-2640':0, '1f9dc-1f3ff-200d-2640':0, '1f9dc-1f3fb-200d-2642':0, '1f9dc-1f3fc-200d-2642':0, '1f9dc-1f3fd-200d-2642':0, '1f9dc-1f3fe-200d-2642':0, '1f9dc-1f3ff-200d-2642':0, '1f9dc-1f3fb':0, '1f9dc-1f3fc':0, '1f9dc-1f3fd':0, '1f9dc-1f3fe':0, '1f9dc-1f3ff':0, '1f9dd-1f3fb-200d-2640':0, '1f9dd-1f3fc-200d-2640':0, '1f9dd-1f3fd-200d-2640':0, '1f9dd-1f3fe-200d-2640':0, '1f9dd-1f3ff-200d-2640':0, '1f9dd-1f3fb-200d-2642':0, '1f9dd-1f3fc-200d-2642':0, '1f9dd-1f3fd-200d-2642':0, '1f9dd-1f3fe-200d-2642':0, '1f9dd-1f3ff-200d-2642':0, '1f9dd-1f3fb':0, '1f9dd-1f3fc':0, '1f9dd-1f3fd':0, '1f9dd-1f3fe':0, '1f9dd-1f3ff':0, '261d-1f3fb':0, '261d-1f3fc':0, '261d-1f3fd':0, '261d-1f3fe':0, '261d-1f3ff':0, '26f9-1f3fb-200d-2640':0, '26f9-1f3fc-200d-2640':0, '26f9-1f3fd-200d-2640':0, '26f9-1f3fe-200d-2640':0, '26f9-1f3ff-200d-2640':0, '26f9-1f3fb-200d-2642':0, '26f9-1f3fc-200d-2642':0, '26f9-1f3fd-200d-2642':0, '26f9-1f3fe-200d-2642':0, '26f9-1f3ff-200d-2642':0, '26f9-1f3fb':0, '26f9-1f3fc':0, '26f9-1f3fd':0, '26f9-1f3fe':0, '26f9-1f3ff':0, '270a-1f3fb':0, '270a-1f3fc':0, '270a-1f3fd':0, '270a-1f3fe':0, '270a-1f3ff':0, '270b-1f3fb':0, '270b-1f3fc':0, '270b-1f3fd':0, '270b-1f3fe':0, '270b-1f3ff':0, '270c-1f3fb':0, '270c-1f3fc':0, '270c-1f3fd':0, '270c-1f3fe':0, '270c-1f3ff':0, '270d-1f3fb':0, '270d-1f3fc':0, '270d-1f3fd':0, '270d-1f3fe':0, '270d-1f3ff':0}};\n\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\nfor(const version in EmojiVersions) {\n if(version) {\n Object.assign(Emoji, EmojiVersions[version as EMOJI_VERSION]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport const FontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif';\nexport const FontSize = '16px';\nexport const FontWeight = '400';\n","const IS_IMAGE_BITMAP_SUPPORTED = typeof(ImageBitmap) !== 'undefined';\n\nexport default IS_IMAGE_BITMAP_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's animation.ts\n\nimport {fastRaf} from './schedulers';\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n deferred: CancellablePromise\n}\n\ntype AnimationInstanceKey = any;\nconst instances: Map = new Map();\n\nexport function createAnimationInstance(key: AnimationInstanceKey) {\n cancelAnimationByKey(key);\n\n const instance: AnimationInstance = {\n isCancelled: false,\n deferred: deferredPromise()\n };\n\n instances.set(key, instance);\n instance.deferred.then(() => {\n if(getAnimationInstance(key) === instance) {\n instances.delete(key);\n }\n });\n\n return instance;\n}\n\nexport function getAnimationInstance(key: AnimationInstanceKey) {\n return instances.get(key);\n}\n\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\n const instance = getAnimationInstance(key);\n if(instance) {\n instance.isCancelled = true;\n instance.deferred.resolve();\n }\n}\n\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\n if(!instance) {\n instance = createAnimationInstance(key);\n }\n\n fastRaf(() => {\n if(instance.isCancelled) {\n return;\n }\n\n if(tick()) {\n animateSingle(tick, key, instance);\n } else {\n instance.deferred.resolve();\n }\n });\n\n return instance.deferred;\n}\n\nexport function animate(tick: Function) {\n fastRaf(() => {\n if(tick()) {\n animate(tick);\n }\n });\n}\n","type K = boolean;\nexport default async function filterAsync(arr: T[], callback: (item: T, idx: number, arr: T[]) => Promise | K) {\n const promises = arr.map(async(item, idx, arr) => {\n if(await callback(item, idx, arr)) {\n return item;\n }\n });\n\n return (await Promise.all(promises)).filter(Boolean);\n}\n","export default function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\n const out: typeof array = [];\n let idx = -1;\n while((idx = array.findIndex(verify)) !== -1) {\n out.push(array.splice(idx, 1)[0]);\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst ASSETS_PATH = 'assets/audio/';\n\nexport default class AudioAssetPlayer {\n private audio: HTMLAudioElement;\n private tempId: number;\n private assetName: AssetName;\n\n constructor(private assets: AssetName[]) {\n this.tempId = 0;\n }\n\n public playSound(name: AssetName, loop = false) {\n ++this.tempId;\n this.assetName = name;\n\n try {\n const audio = this.createAudio();\n audio.autoplay = true;\n audio.src = ASSETS_PATH + name;\n audio.loop = loop;\n audio.play();\n } catch(e) {\n console.error('playSound', name, e);\n }\n }\n\n public playSoundIfDifferent(name: AssetName, loop?: boolean) {\n if(this.assetName !== name) {\n this.playSound(name, loop);\n }\n }\n\n public createAudio() {\n let {audio} = this;\n if(audio) {\n return audio;\n }\n\n audio = this.audio = new Audio();\n audio.play();\n return audio;\n }\n\n public stopSound() {\n if(!this.audio) {\n return;\n }\n\n this.audio.pause();\n }\n\n public cancelDelayedPlay() {\n ++this.tempId;\n }\n\n public playSoundWithTimeout(name: AssetName, loop: boolean, timeout: number) {\n // timeout = 0;\n const tempId = ++this.tempId;\n setTimeout(() => {\n if(this.tempId !== tempId) {\n return;\n }\n\n this.playSound(name, loop);\n }, timeout);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsDataURL(blob: Blob) {\n return readBlobAs(blob, 'readAsDataURL');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport {fastRaf} from './schedulers';\nimport {ArgumentTypes} from '../types';\n\ntype HeavyQueue> = {\n items: ArgumentTypes[],\n process: (...args: any[]) => ReturnType,\n context: any,\n promise?: CancellablePromise[]>\n};\nconst heavyQueue: HeavyQueue[] = [];\nlet processingQueue = false;\n\nexport default function addHeavyTask>(queue: T, method: 'push' | 'unshift' = 'push') {\n if(!queue.items.length) {\n return Promise.resolve([]) as typeof promise;\n }\n\n const promise = queue.promise = deferredPromise();\n heavyQueue[method](queue);\n processHeavyQueue();\n\n return promise;\n}\n\nfunction processHeavyQueue() {\n if(!processingQueue) {\n const queue = heavyQueue.shift();\n timedChunk(queue).finally(() => {\n processingQueue = false;\n if(heavyQueue.length) {\n processHeavyQueue();\n }\n });\n }\n}\n\nfunction timedChunk>(queue: HeavyQueue) {\n if(!queue.items.length) {\n queue.promise.resolve([] as any);\n return Promise.resolve([]);\n }\n\n const todo = queue.items.slice();\n const results: ReturnType[] = [];\n\n return new Promise((resolve, reject) => {\n const f = async() => {\n const start = performance.now();\n\n do {\n await getHeavyAnimationPromise();\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\n let realResult: typeof results[0];\n // @ts-ignore\n if(possiblePromise instanceof Promise) {\n try {\n realResult = await possiblePromise;\n } catch(err) {\n reject(err);\n return;\n }\n } else {\n realResult = possiblePromise;\n }\n\n results.push(realResult);\n } while(todo.length > 0 && (performance.now() - start) < 6);\n\n if(todo.length > 0) {\n fastRaf(f);\n // setTimeout(f, 25);\n } else {\n resolve(results);\n }\n };\n\n fastRaf(f);\n // setTimeout(f, 25);\n }).then(queue.promise.resolve, queue.promise.reject);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type fastBlur from '../vendor/fastBlur';\nimport addHeavyTask from './heavyQueue';\nimport IS_CANVAS_FILTER_SUPPORTED from '../environment/canvasFilterSupport';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nlet requireBlurPromise: Promise;\nlet fastBlurFunc: typeof fastBlur;\nif(!IS_CANVAS_FILTER_SUPPORTED) {\n requireBlurPromise = import('../vendor/fastBlur').then((m) => {\n fastBlurFunc = m.default;\n });\n} else {\n requireBlurPromise = Promise.resolve();\n}\n\nfunction processBlurNext(\n img: HTMLImageElement,\n radius: number,\n iterations: number,\n canvas: HTMLCanvasElement = document.createElement('canvas')\n) {\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d', {alpha: false});\n if(IS_CANVAS_FILTER_SUPPORTED) {\n ctx.filter = `blur(${radius}px)`;\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\n } else {\n ctx.drawImage(img, 0, 0);\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\n }\n\n return canvas;\n}\n\ntype CacheValue = {canvas: HTMLCanvasElement, promise: Promise};\nconst cache: Map = new Map();\nconst CACHE_SIZE = 150;\n\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\n if(!dataUri) {\n throw 'no dataUri for blur: ' + dataUri;\n }\n\n if(cache.size > CACHE_SIZE) {\n cache.clear();\n }\n\n const canvas = document.createElement('canvas');\n canvas.className = 'canvas-thumbnail';\n\n let cached = cache.get(dataUri);\n if(!cached) {\n const promise: CacheValue['promise'] = new Promise((resolve) => {\n // return resolve(dataUri);\n requireBlurPromise.then(() => {\n const img = new Image();\n img.onload = () => {\n // if(IS_CANVAS_FILTER_SUPPORTED) {\n // resolve(processBlurNext(img, radius, iterations));\n // } else {\n const promise = addHeavyTask({\n items: [[img, radius, iterations, canvas]],\n context: null,\n process: processBlurNext\n }, 'unshift');\n\n promise.then(() => {\n resolve();\n });\n // }\n };\n img.src = dataUri;\n });\n });\n\n cache.set(dataUri, cached = {\n canvas,\n promise\n });\n } else {\n canvas.width = cached.canvas.width;\n canvas.height = cached.canvas.height;\n cached.promise.then(() => {\n canvas.getContext('2d').drawImage(cached.canvas, 0, 0, canvas.width, canvas.height);\n });\n }\n\n return {\n ...cached,\n canvas\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport bytesFromHex from './bytesFromHex';\nimport bytesToDataURL from './bytesToDataURL';\nimport convertToUint8Array from './convertToUint8Array';\n\nconst JPEG_HEADER_HEX = 'ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00';\n\nconst JPEG_HEADER = bytesFromHex(JPEG_HEADER_HEX);\nconst JPEG_TAIL = bytesFromHex('ffd9');\n\nexport function getPreviewBytesFromURL(url: string) {\n const needle = 'base64,';\n const sliced = url.slice(url.indexOf(needle) + needle.length);\n const jpegBytes = [...atob(sliced)].map((char) => char.charCodeAt(0));\n\n return new Uint8Array(jpegBytes);\n // console.log('getPreviewBytesFromURL', bytesToHex(jpegBytes));\n\n // const n = JPEG_HEADER_HEX.slice(-10);\n // const one = jpegBytes[164];\n // const two = jpegBytes[166];\n\n // const body = jpegBytes.slice(bytesToHex(jpegBytes).indexOf(n) / 2 + n.length / 2/* JPEG_HEADER.length */, jpegBytes.length - JPEG_TAIL.length);\n // const original = new Uint8Array([\n // 0xFF,\n // one,\n // two,\n // ...body\n // ]);\n\n // console.log(bytesToHex(body));\n\n // return original;\n}\n\nexport default function getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker && bytes[0] === 0x1) {\n arr = new Uint8Array(JPEG_HEADER.concat(Array.from(bytes.slice(3)), JPEG_TAIL));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = convertToUint8Array(bytes);\n }\n\n let mimeType: string;\n if(isSticker) {\n mimeType = IS_SAFARI ? 'image/png' : 'image/webp';\n } else {\n mimeType = 'image/jpeg';\n }\n\n const dataURL = bytesToDataURL(arr, mimeType);\n return dataURL;\n}\n","export default function bytesToDataURL(bytes: Uint8Array, mimeType: string = 'image/jpeg') {\n return `data:${mimeType};base64,${btoa(String.fromCharCode(...bytes))}`;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {makeMediaSize} from './mediaSize';\n\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\n if(imageW < boxW && imageH < boxH && noZoom) {\n return makeMediaSize(imageW, imageH);\n }\n\n let boxedImageW = boxW;\n let boxedImageH = boxH;\n\n if((imageW / imageH) > (boxW / boxH)) {\n boxedImageH = (imageH * boxW / imageW) | 0;\n } else {\n boxedImageW = (imageW * boxH / imageH) | 0;\n if(boxedImageW > boxW) {\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\n boxedImageW = boxW;\n }\n }\n\n // if (Config.Navigator.retina) {\n // imageW = Math.floor(imageW / 2)\n // imageH = Math.floor(imageH / 2)\n // }\n\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\n boxedImageW = imageW;\n boxedImageH = imageH;\n }\n\n return makeMediaSize(boxedImageW, boxedImageH);\n}\n\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { MOUNT_CLASS_TO } from \"../../config/debug\";\n\nlet context: CanvasRenderingContext2D;\n/**\n * Get the text width\n * @param {string} text\n * @param {string} font\n */\nexport default function getTextWidth(text: string, font: string) {\n // const perf = performance.now();\n if(!context) {\n const canvas = document.createElement('canvas');\n context = canvas.getContext('2d', {alpha: false});\n }\n\n if(context.font !== font) {\n context.font = font;\n }\n\n // context.font = font;\n const metrics = context.measureText(text);\n // console.log('getTextWidth perf:', performance.now() - perf);\n return metrics.width;\n // return Math.round(metrics.width);\n}\n\n// MOUNT_CLASS_TO && (MOUNT_CLASS_TO.getTextWidth = getTextWidth);\n","import type {MediaSize} from '../mediaSize';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\n\nexport default function scaleMediaElement(options: T): Promise {\n return new Promise(async(resolve) => {\n const canvas = document.createElement('canvas');\n const size = options.size ?? options.mediaSize.aspectFitted(options.boxSize);\n const dpr = window.devicePixelRatio && 1;\n canvas.width = size.width * dpr;\n canvas.height = size.height * dpr;\n const ctx = canvas.getContext('2d');\n\n let source: CanvasImageSource;\n if(IS_IMAGE_BITMAP_SUPPORTED) {\n source = await createImageBitmap(options.media, {resizeWidth: size.width, resizeHeight: size.height});\n } else {\n source = options.media;\n }\n\n ctx.drawImage(source, 0, 0, canvas.width, canvas.height);\n\n if(IS_IMAGE_BITMAP_SUPPORTED) {\n (source as ImageBitmap)?.close();\n }\n\n const mimeType = options.mimeType ?? 'image/jpeg';\n const quality = options.quality ?? 1;\n if(options.toDataURL) {\n const url = canvas.toDataURL(mimeType, quality);\n resolve({url, size} as any);\n } else {\n canvas.toBlob((blob) => {\n resolve({blob, size} as any);\n }, mimeType, quality);\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LatinizeMap from '../config/latinizeMap';\n\nexport const badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nconst C2L: {[k: string]: string} = {\n 'й': 'q',\n 'ц': 'w',\n 'у': 'e',\n 'к': 'r',\n 'е': 't',\n 'н': 'y',\n 'г': 'u',\n 'ш': 'i',\n 'щ': 'o',\n 'з': 'p',\n 'х': '[',\n 'ъ': ']',\n 'ф': 'a',\n 'ы': 's',\n 'в': 'd',\n 'а': 'f',\n 'п': 'g',\n 'р': 'h',\n 'о': 'j',\n 'л': 'k',\n 'д': 'l',\n 'ж': ';',\n 'э': '\\'',\n 'я': 'z',\n 'ч': 'x',\n 'с': 'c',\n 'м': 'v',\n 'и': 'b',\n 'т': 'n',\n 'ь': 'm',\n 'б': ',',\n 'ю': '.',\n '.': '/'\n};\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function fixCyrillic(text: string) {\n return text.toLowerCase().replace(/[\\wа-я]/g, (ch) => {\n const latinizeCh = C2L[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = LatinizeMap[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n return processSearchText(text, {\n clearBadChars: true,\n latinize,\n ignoreCase: true\n });\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n const originalText = text;\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n if(options.latinize) text += '\\x01' + fixCyrillic(originalText);\n return text;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// https://stackoverflow.com/a/30810322\nfunction fallbackCopyTextToClipboard(text: string) {\n var textArea = document.createElement('textarea');\n textArea.value = text;\n\n // Avoid scrolling to bottom\n textArea.style.top = '0';\n textArea.style.left = '0';\n textArea.style.position = 'fixed';\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n try {\n document.execCommand('copy');\n // const successful = document.execCommand('copy');\n // const msg = successful ? 'successful' : 'unsuccessful';\n // console.log('Fallback: Copying text command was ' + msg);\n } catch(err) {\n // console.error('Fallback: Oops, unable to copy', err);\n }\n\n document.body.removeChild(textArea);\n}\n\nexport function copyTextToClipboard(text: string) {\n if(!navigator.clipboard) {\n fallbackCopyTextToClipboard(text);\n return;\n }\n\n navigator.clipboard.writeText(text).catch((err) => {\n console.error('clipboard error', err);\n fallbackCopyTextToClipboard(text);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport mediaSizes from './mediaSizes';\nimport OverlayClickHandler from './overlayClickHandler';\n\nclass ContextMenuController extends OverlayClickHandler {\n constructor() {\n super('menu', true);\n\n mediaSizes.addEventListener('resize', () => {\n if(this.element) {\n this.close();\n }\n\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\n const rect = openedMenu.getBoundingClientRect();\n const {innerWidth, innerHeight} = window;\n\n console.log(innerWidth, innerHeight, rect);\n } */\n });\n }\n\n public isOpened() {\n return !!this.element;\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const rect = this.element.getBoundingClientRect();\n const {clientX, clientY} = e;\n\n const diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\n const diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\n\n if(diffX >= 100 || diffY >= 100) {\n this.close();\n // openedMenu.parentElement.click();\n }\n // console.log('mousemove', diffX, diffY);\n };\n\n public close() {\n if(this.element) {\n this.element.classList.remove('active');\n this.element.parentElement.classList.remove('menu-open');\n }\n\n super.close();\n\n if(!IS_TOUCH_SUPPORTED) {\n window.removeEventListener('mousemove', this.onMouseMove);\n }\n }\n\n public openBtnMenu(element: HTMLElement, onClose?: () => void) {\n super.open(element);\n\n this.element.classList.add('active', 'was-open');\n this.element.parentElement.classList.add('menu-open');\n\n if(onClose) {\n this.addEventListener('toggle', onClose, {once: true});\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n window.addEventListener('mousemove', this.onMouseMove);\n }\n }\n}\n\nconst contextMenuController = new ContextMenuController();\nexport default contextMenuController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport I18n, {i18n} from '../lib/langPack';\n\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const ONE_DAY = 86400;\n\n// https://stackoverflow.com/a/6117889\nexport const getWeekNumber = (date: Date) => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\n};\n\nexport function formatDateAccordingToTodayNew(time: Date) {\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n const options: Intl.DateTimeFormatOptions = {};\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\n options.hour = options.minute = '2-digit';\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\n options.year = options.day = 'numeric';\n options.month = '2-digit';\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\n options.weekday = 'short';\n } else { // same year\n options.month = 'short';\n options.day = 'numeric';\n }\n\n return new I18n.IntlDateElement({\n date: time,\n options\n }).element;\n}\n\nexport function formatFullSentTimeRaw(timestamp: number, options: {\n capitalize?: boolean\n} = {}) {\n const date = new Date();\n const time = new Date(timestamp * 1000);\n const now = date.getTime() / 1000;\n\n const timeEl = formatTime(time);\n\n let dateEl: Node | string;\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\n\n if(options.capitalize) {\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\n }\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\n } else {\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\n }\n\n return {dateEl, timeEl};\n}\n\nexport function formatFullSentTime(timestamp: number) {\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\n capitalize: true\n });\n\n const fragment = document.createDocumentFragment();\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\n return fragment;\n}\n\nexport function formatTime(date: Date) {\n return new I18n.IntlDateElement({\n date,\n options: {\n hour: '2-digit',\n minute: '2-digit'\n }\n }).element;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\n\nexport const getFullDate = (date: Date, options: Partial<{\n noTime: true,\n noSeconds: true,\n monthAsNumber: true,\n leadingZero: true\n}> = {}) => {\n const joiner = options.monthAsNumber ? '.' : ' ';\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\n\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\n joiner + date.getFullYear() +\n (options.noTime ? '' : ', ' + time);\n};\n\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\nconst minYear = 2013;\nconst yearPattern = new RegExp('20[0-9]{1,2}');\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nexport type DateData = {\n title: string,\n minDate: number,\n maxDate: number,\n};\nexport function fillTipDates(query: string, dates: DateData[]) {\n const q = query.trim().toLowerCase();\n\n if(q.length < 3) {\n return;\n }\n\n if('today'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: 'Today',\n minDate,\n maxDate\n });\n return;\n }\n\n if('yesterday'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime() - 86400000;\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 86400001;\n dates.push({\n title: 'Yesterday',\n minDate,\n maxDate\n });\n return;\n }\n\n const dayOfWeek = getDayOfWeek(q);\n if(dayOfWeek >= 0) {\n const date = new Date();\n const now = date.getTime();\n const currentDay = date.getDay();\n const distance = dayOfWeek - currentDay;\n date.setDate(date.getDate() + distance);\n if(date.getTime() > now) {\n date.setTime(date.getTime() - 604800000);\n }\n const year = date.getFullYear()\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatWeekLong(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n let matches: any[];\n if((matches = shortDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const k = parseInt(g1);\n const k1 = parseInt(g2);\n if(k > 0 && k <= 31) {\n if(k1 >= minYear && k <= 12) {\n const selectedYear = k1;\n const month = k - 1;\n createForMonthYear(dates, month, selectedYear);\n return;\n } else if(k1 <= 12) {\n const day = k - 1;\n const month = k1 - 1;\n createForDayMonth(dates, day, month);\n }\n } else if(k >= minYear && k1 <= 12) {\n const selectedYear = k;\n const month = k1 - 1;\n createForMonthYear(dates, month, selectedYear);\n }\n\n return;\n }\n\n if((matches = longDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const g3 = matches[5];\n if(!matches[2] === matches[4]) {\n return;\n }\n\n const day = parseInt(g1);\n const month = parseInt(g2) - 1;\n let year = parseInt(g3);\n if(year >= 10 && year <= 99) {\n year += 2000;\n }\n\n const currentYear = new Date().getFullYear();\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\n const date = new Date();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n return;\n }\n\n if((matches = yearPattern.exec(q)) !== null) {\n let selectedYear = +q;\n const currentYear = new Date().getFullYear();\n if(selectedYear < minYear) {\n selectedYear = minYear;\n for(let i = currentYear; i >= selectedYear; i--) {\n const date = new Date();\n date.setFullYear(i, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(i + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + i,\n minDate,\n maxDate\n });\n }\n } else if(selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(selectedYear + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + selectedYear,\n minDate,\n maxDate\n });\n }\n\n return;\n }\n\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g1);\n if(month >= 0) {\n const k = +g2;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n return;\n }\n }\n }\n\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g2);\n if(month >= 0) {\n const k = +g1;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n }\n }\n }\n}\n\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n if(selectedYear >= minYear && selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, month, 1);\n date.setHours(0, 0, 0);\n const minDate = date.getTime();\n if(minDate > today) {\n return;\n }\n date.setMonth(date.getMonth() + 1);\n const maxDate = date.getTime() - 1;\n\n dates.push({\n title: formatterMonthYear(minDate),\n minDate,\n maxDate\n });\n }\n}\n\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\n if(validDateForMonth(day, month)) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n\n for(let i = currentYear; i >= minYear; i--) {\n if(month === 1 && day === 28 && !isLeapYear(i)) {\n continue;\n }\n\n const date = new Date();\n date.setFullYear(i, month, day + 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n if(minDate > today) {\n continue;\n }\n\n date.setFullYear(i, month, day + 2);\n date.setHours(0, 0, 0);\n const maxDate = date.getTime() - 1;\n if(i === currentYear) {\n dates.push({\n title: formatterDayMonth(minDate),\n minDate,\n maxDate\n });\n } else {\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n }\n }\n }\n}\n\nfunction formatterMonthYear(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\n}\n\nfunction formatterDayMonth(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\n}\n\nfunction formatterYearMax(timestamp: number) {\n const date = new Date(timestamp);\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\n}\n\nfunction formatWeekLong(timestamp: number) {\n const date = new Date(timestamp);\n return days[date.getDay()];\n}\n\nfunction validDateForMonth(day: number, month: number) {\n if(month >= 0 && month < 12) {\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLeapYear(year: number) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n}\n\nfunction getMonth(q: string) {\n /* String[] months = new String[]{\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\n }; */\n\n /* String[] monthsEng = new String[12];\n Calendar c = Calendar.getInstance();\n for (int i = 1; i <= 12; i++) {\n c.set(0, 0, 0, 0, 0, 0);\n c.set(Calendar.MONTH, i);\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\n } */\n\n q = q.toLowerCase();\n for(let i = 0; i < 12; i++) {\n const month = months[i].toLowerCase();\n if(month.indexOf(q) === 0) {\n return i;\n }\n }\n return -1;\n}\n\nfunction getDayOfWeek(q: string) {\n const c = new Date();\n if(q.length <= 3) {\n return -1;\n }\n\n for(let i = 0; i < 7; i++) {\n c.setDate(c.getDate() + 1);\n\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\n return c.getDay();\n }\n }\n return -1;\n}\n\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {toastNew} from '../../components/toast';\nimport {LangPackKey} from '../../lib/langPack';\nimport {copyTextToClipboard} from '../clipboard';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent} from './clickEvent';\n\nconst T_ME = 'https://t.me/';\nexport default function anchorCopy(options: Partial<{\n // href: string,\n mePath: string,\n username: string\n}> = {}) {\n const anchor = document.createElement('a');\n anchor.classList.add('anchor-copy');\n\n let copyWhat: string, copyText: LangPackKey = 'LinkCopied';\n if(options.mePath) {\n const href = T_ME + options.mePath;\n copyWhat = anchor.href = anchor.innerText = href;\n }\n\n if(options.username) {\n const href = T_ME + options.username;\n anchor.href = href;\n copyWhat = anchor.innerText = '@' + options.username;\n copyText = 'UsernameCopied';\n }\n\n attachClickEvent(anchor, (e) => {\n cancelEvent(e);\n copyTextToClipboard(copyWhat ?? anchor.href);\n toastNew({langPackKey: copyText});\n });\n\n return anchor;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_APPLE} from '../../environment/userAgent';\nimport contextMenuController from '../contextMenuController';\nimport ListenerSetter, {ListenerOptions} from '../listenerSetter';\nimport cancelEvent from './cancelEvent';\n\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\nexport function cancelContextMenuOpening() {\n if(_cancelContextMenuOpeningTimeout) {\n clearTimeout(_cancelContextMenuOpeningTimeout);\n }\n\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\n _cancelContextMenuOpeningTimeout = 0;\n _cancelContextMenuOpening = false;\n }, .4e3);\n\n _cancelContextMenuOpening = true;\n}\n\nexport function attachContextMenuListener({\n element,\n callback,\n listenerSetter,\n listenerOptions\n}: {\n element: HTMLElement,\n callback: (e: TouchEvent | MouseEvent) => void,\n listenerSetter?: ListenerSetter,\n listenerOptions?: ListenerOptions\n}) {\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\n\n // can't cancel further events coming after 'contextmenu' event\n if((IS_APPLE && IS_TOUCH_SUPPORTED) || listenerOptions) {\n let timeout: number;\n\n const options: EventListenerOptions = {\n ...(listenerOptions || {}),\n capture: true\n };\n\n const onCancel = () => {\n clearTimeout(timeout);\n // @ts-ignore\n remove('touchmove', onCancel, options);\n // @ts-ignore\n remove('touchend', onCancel, options);\n // @ts-ignore\n remove('touchcancel', onCancel, options);\n };\n\n add('touchstart', (e: TouchEvent) => {\n if(e.touches.length > 1) {\n onCancel();\n return;\n }\n\n add('touchmove', onCancel, options);\n add('touchend', onCancel, options);\n add('touchcancel', onCancel, options);\n\n timeout = window.setTimeout(() => {\n if(_cancelContextMenuOpening) {\n onCancel();\n return;\n }\n\n callback(e);\n onCancel();\n\n if(contextMenuController.isOpened()) {\n add('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n }, .4e3);\n }, listenerOptions);\n\n /* if(!isSafari) {\n add('contextmenu', (e: any) => {\n cancelEvent(e);\n }, {passive: false, capture: true});\n } */\n } else {\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\n callback(e);\n\n if(contextMenuController.isOpened()) {\n add('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n } : callback, listenerOptions);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type GrabEvent = {x: number, y: number, isTouch?: boolean, event: TouchEvent | MouseEvent};\n\nexport default function attachGrabListeners(element: HTMLElement,\n onStart: (position: GrabEvent) => void,\n onMove: (position: GrabEvent) => void,\n onEnd?: (position: GrabEvent) => void) {\n // * Mouse\n const onMouseMove = (event: MouseEvent) => {\n onMove({x: event.pageX, y: event.pageY, event});\n };\n\n const onMouseUp = (event: MouseEvent) => {\n document.removeEventListener('mousemove', onMouseMove);\n element.addEventListener('mousedown', onMouseDown, {once: true});\n onEnd && onEnd({x: event.pageX, y: event.pageY, event});\n };\n\n const onMouseDown = (event: MouseEvent) => {\n if(event.button !== 0) {\n element.addEventListener('mousedown', onMouseDown, {once: true});\n return;\n }\n\n onStart({x: event.pageX, y: event.pageY, event});\n onMouseMove(event);\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp, {once: true});\n };\n\n element.addEventListener('mousedown', onMouseDown, {once: true});\n\n // * Touch\n const onTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n onMove({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n };\n\n const onTouchEnd = (event: TouchEvent) => {\n document.removeEventListener('touchmove', onTouchMove);\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\n onEnd && onEnd({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n };\n\n const onTouchStart = (event: TouchEvent) => {\n onStart({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n onTouchMove(event);\n\n document.addEventListener('touchmove', onTouchMove, {passive: false});\n document.addEventListener('touchend', onTouchEnd, {passive: false, once: true});\n };\n\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\n\n return () => {\n element.removeEventListener('mousedown', onMouseDown);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n\n element.removeEventListener('touchstart', onTouchStart);\n document.removeEventListener('touchmove', onTouchMove);\n document.removeEventListener('touchend', onTouchEnd);\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function cancelSelection() {\n if(window.getSelection) {\n if(window.getSelection().empty) { // Chrome\n window.getSelection().empty();\n } else if(window.getSelection().removeAllRanges) { // Firefox\n window.getSelection().removeAllRanges();\n }\n // @ts-ignore\n } else if(document.selection) { // IE?\n // @ts-ignore\n document.selection.empty();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport simulateEvent from './dispatchEvent';\n\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\n const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\n\n options.touchMouseDown = true;\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\n add('mousedown', callback, options);\n } else if(CLICK_EVENT_NAME === 'touchend') {\n const o = {...options, once: true};\n\n const onTouchStart = (e: TouchEvent) => {\n const onTouchMove = (e: TouchEvent) => {\n remove('touchmove', onTouchMove, o);\n remove('touchend', onTouchEnd, o);\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n remove('touchmove', onTouchMove, o);\n callback(e);\n if(options.once) {\n remove('touchstart', onTouchStart);\n }\n };\n\n add('touchend', onTouchEnd, o);\n add('touchmove', onTouchMove, o);\n };\n\n add('touchstart', onTouchStart);\n } else {\n add(CLICK_EVENT_NAME, callback, options);\n } */\n add(CLICK_EVENT_NAME, callback, options);\n\n // @ts-ignore\n return () => remove(CLICK_EVENT_NAME, callback, options);\n}\n\nexport function detachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options?: AddEventListenerOptions) {\n // if(CLICK_EVENT_NAME === 'touchend') {\n // elem.removeEventListener('touchstart', callback, options);\n // } else {\n elem.removeEventListener(CLICK_EVENT_NAME, callback as any, options);\n // }\n}\n\nexport function simulateClickEvent(elem: HTMLElement) {\n simulateEvent(elem, CLICK_EVENT_NAME);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport EventListenerBase from '../eventListenerBase';\nimport ListenerSetter from '../listenerSetter';\nimport safeAssign from '../object/safeAssign';\nimport findUpClassName from './findUpClassName';\n\nexport default class ControlsHover extends EventListenerBase<{\n toggleControls: (show: boolean) => void\n}> {\n protected hideControlsTimeout: number;\n protected controlsLocked: boolean;\n\n protected canHideControls: () => boolean;\n protected element: HTMLElement;\n protected listenerSetter: ListenerSetter;\n protected showOnLeaveToClassName: string;\n protected ignoreClickClassName: string;\n\n constructor() {\n super(false);\n this.hideControlsTimeout = 0;\n }\n\n public setup(options: {\n element: HTMLElement,\n listenerSetter: ListenerSetter,\n canHideControls?: () => boolean,\n showOnLeaveToClassName?: string,\n ignoreClickClassName?: string\n }) {\n safeAssign(this, options);\n\n const {listenerSetter, element} = this;\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(element)('click', (e) => {\n if(this.ignoreClickClassName && findUpClassName(e.target, this.ignoreClickClassName)) {\n return;\n }\n\n this.toggleControls();\n });\n\n /* listenerSetter.add(player)('touchstart', () => {\n showControls(false);\n });\n\n listenerSetter.add(player)('touchend', () => {\n if(player.classList.contains('is-playing')) {\n showControls();\n }\n }); */\n } else {\n listenerSetter.add(element)('mousemove', () => {\n this.showControls();\n });\n\n listenerSetter.add(element)('mouseenter', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(element)('mouseleave', (e) => {\n if(e.relatedTarget && this.showOnLeaveToClassName && findUpClassName(e.relatedTarget, this.showOnLeaveToClassName)) {\n this.showControls(false);\n return;\n }\n\n this.hideControls();\n });\n }\n }\n\n public hideControls = (setHideTimeout = false) => {\n if(setHideTimeout) {\n if(!this.hideControlsTimeout) {\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n }\n\n return;\n }\n\n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 0;\n\n const isShown = this.element.classList.contains('show-controls');\n if(this.controlsLocked !== false) {\n if((this.canHideControls ? !this.canHideControls() : false) || !isShown || this.controlsLocked) {\n return;\n }\n } else if(!isShown) {\n return;\n }\n\n this.dispatchEvent('toggleControls', false);\n this.element.classList.remove('show-controls');\n };\n\n public showControls = (setHideTimeout = true) => {\n if(this.hideControlsTimeout) {\n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 0;\n } else if(!this.element.classList.contains('show-controls') && this.controlsLocked !== false) {\n this.dispatchEvent('toggleControls', true);\n this.element.classList.add('show-controls');\n }\n\n if(!setHideTimeout || this.controlsLocked) {\n return;\n }\n\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n };\n\n public toggleControls = (show?: boolean) => {\n const isShown = this.element.classList.contains('show-controls');\n\n if(show === undefined) {\n if(isShown) this.hideControls();\n else this.showControls();\n } else if(show === isShown) return;\n else if(show === false) this.hideControls();\n else this.showControls();\n };\n\n public lockControls(visible: boolean) {\n this.controlsLocked = visible;\n\n this.element.classList.toggle('disable-hover', visible === false);\n this.toggleControls(visible);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ButtonMenu, {ButtonMenuItemOptionsVerifiable} from '../../components/buttonMenu';\nimport filterAsync from '../array/filterAsync';\nimport contextMenuController from '../contextMenuController';\nimport ListenerSetter from '../listenerSetter';\nimport {getMiddleware} from '../middleware';\nimport positionMenu from '../positionMenu';\nimport {attachContextMenuListener} from './attachContextMenuListener';\n\nexport default function createContextMenu({\n buttons,\n findElement,\n listenTo,\n appendTo,\n filterButtons,\n onOpen,\n onClose,\n onBeforeOpen,\n listenerSetter: attachListenerSetter\n}: {\n buttons: T[],\n findElement?: (e: MouseEvent | TouchEvent) => HTMLElement,\n listenTo: HTMLElement,\n appendTo?: HTMLElement,\n filterButtons?: (buttons: T[]) => Promise,\n onOpen?: (target: HTMLElement) => any,\n onClose?: () => any,\n onBeforeOpen?: () => any,\n listenerSetter?: ListenerSetter\n}) {\n appendTo ??= document.body;\n\n attachListenerSetter ??= new ListenerSetter();\n const listenerSetter = new ListenerSetter();\n const middleware = getMiddleware();\n let element: HTMLElement;\n\n attachContextMenuListener({\n element: listenTo,\n callback: (e) => {\n const target = findElement ? findElement(e as any) : listenTo;\n if(!target) {\n return;\n }\n\n let _element = element;\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\n if(_element && _element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\n\n const r = async() => {\n await onOpen?.(target);\n\n const initResult = await init();\n if(!initResult) {\n return;\n }\n\n _element = initResult.element;\n const {cleanup, destroy} = initResult;\n\n positionMenu(e, _element);\n contextMenuController.openBtnMenu(_element, () => {\n onClose?.();\n cleanup();\n\n setTimeout(() => {\n destroy();\n }, 300);\n });\n };\n\n r();\n },\n listenerSetter: attachListenerSetter\n });\n\n const cleanup = () => {\n listenerSetter.removeAll();\n middleware.clean();\n };\n\n const destroy = () => {\n cleanup();\n attachListenerSetter.removeAll();\n };\n\n const init = async() => {\n cleanup();\n\n buttons.forEach((button) => button.element = undefined);\n const f = filterButtons || ((buttons: T[]) => filterAsync(buttons, (button) => button?.verify?.() ?? true));\n\n const filteredButtons = await f(buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const _element = element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter\n });\n _element.classList.add('contextmenu');\n\n await onBeforeOpen?.();\n\n appendTo.append(_element);\n\n return {\n element: _element,\n cleanup,\n destroy: () => {\n _element.remove();\n }\n };\n };\n\n return {element, destroy};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport PopupStickers from '../../components/popups/stickers';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport createContextMenu from './createContextMenu';\nimport findUpClassName from './findUpClassName';\nimport emoticonsDropdown, {EmoticonsDropdown} from '../../components/emoticonsDropdown';\n\nexport default function createStickersContextMenu(options: {\n listenTo: HTMLElement,\n isStickerPack?: boolean,\n verifyRecent?: (target: HTMLElement) => boolean,\n appendTo?: HTMLElement,\n onOpen?: () => any,\n onClose?: () => any,\n onSend?: () => any\n}) {\n const {listenTo, isStickerPack, verifyRecent, appendTo, onOpen, onClose, onSend} = options;\n let target: HTMLElement, doc: MyDocument;\n const verifyFavoriteSticker = async(toAdd: boolean) => {\n const favedStickers = await rootScope.managers.acknowledged.appStickersManager.getFavedStickersStickers();\n if(!favedStickers.cached) {\n return false;\n }\n\n const found = (await favedStickers.result).some((_doc) => _doc.id === doc.id);\n return toAdd ? !found : found;\n };\n\n return createContextMenu({\n listenTo: listenTo,\n appendTo,\n findElement: (e) => target = findUpClassName(e.target, 'media-sticker-wrapper'),\n onOpen: async() => {\n doc = await rootScope.managers.appDocsManager.getDoc(target.dataset.docId);\n return onOpen?.();\n },\n onClose,\n buttons: [{\n icon: 'stickers',\n text: 'Context.ViewStickerSet',\n onClick: () => new PopupStickers(doc.stickerSetInput).show(),\n verify: () => !isStickerPack\n }, {\n icon: 'favourites',\n text: 'AddToFavorites',\n onClick: () => rootScope.managers.appStickersManager.faveSticker(doc.id, false),\n verify: () => verifyFavoriteSticker(true)\n }, {\n icon: 'favourites',\n text: 'DeleteFromFavorites',\n onClick: () => rootScope.managers.appStickersManager.faveSticker(doc.id, true),\n verify: () => verifyFavoriteSticker(false)\n }, {\n icon: 'delete',\n text: 'DeleteFromRecent',\n onClick: () => rootScope.managers.appStickersManager.saveRecentSticker(doc.id, true),\n verify: () => verifyRecent?.(target) ?? false\n }, {\n icon: 'mute',\n text: 'Chat.Send.WithoutSound',\n onClick: () => {\n onSend?.();\n return EmoticonsDropdown.sendDocId(doc.id, false, true);\n },\n verify: () => !!(appImManager.chat.peerId && appImManager.chat.peerId !== rootScope.myId)\n }, {\n icon: 'schedule',\n text: 'Chat.Send.ScheduledMessage',\n onClick: () => appImManager.chat.input.scheduleSending(() => appImManager.chat.input.sendMessageWithDocument(doc)),\n verify: () => !!appImManager.chat.peerId\n }]\n });\n}\n","export default function createVideo(options: {\n pip?: boolean\n} = {}) {\n const video = document.createElement('video');\n if(!options.pip) video.disablePictureInPicture = true;\n video.setAttribute('playsinline', 'true');\n return video;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\n\nexport type CustomProperty = string;\n\nexport class CustomProperties {\n private cache: {[k in CustomProperty]?: string};\n private computedStyle: CSSStyleDeclaration;\n\n constructor() {\n this.cache = {};\n\n rootScope.addEventListener('theme_change', () => {\n this.computedStyle = undefined;\n const cache = this.cache;\n this.cache = {};\n\n for(const i in cache) {\n this.getProperty(i);\n }\n });\n }\n\n public getProperty(name: CustomProperty) {\n let value = this.cache[name];\n if(value) {\n return value;\n }\n\n if(!this.computedStyle) {\n this.computedStyle = window.getComputedStyle(document.documentElement);\n }\n\n value = this.computedStyle.getPropertyValue('--' + name).trim();\n return this.cache[name] = value;\n }\n}\n\nconst customProperties = new CustomProperties();\nexport default customProperties;\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","import encodeEntities from '../string/encodeEntities';\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === node.TEXT_NODE ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).join('');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function findUpAsChild(el: T, parent: HTMLElement): T {\n if(!el) return null;\n if(el.parentElement === parent) return el;\n\n while(el.parentElement) {\n el = el.parentElement as any;\n if(el.parentElement === parent) {\n return el;\n }\n }\n\n return null;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\n return el.closest(`[${attribute}]`);\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.getAttribute(attribute) !== null)\n return el;\n }\n return null; */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function findUpTag(el: any, tag: string): HTMLElement {\n return el.closest(tag);\n /* if(el.tagName === tag) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.tagName === tag)\n return el;\n }\n return null; */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../listenerSetter';\n\nexport function requestFullScreen(element: HTMLElement) {\n if(element.requestFullscreen) {\n element.requestFullscreen();\n // @ts-ignore\n } else if(element.mozRequestFullScreen) {\n // @ts-ignore\n element.mozRequestFullScreen(); // Firefox\n // @ts-ignore\n } else if(element.webkitRequestFullscreen) {\n // @ts-ignore\n element.webkitRequestFullscreen(); // Chrome and Safari\n // @ts-ignore\n } else if(element.msRequestFullscreen) {\n // @ts-ignore\n element.msRequestFullscreen();\n }\n}\n\nexport function cancelFullScreen() {\n // @ts-ignore\n if(document.cancelFullScreen) {\n // @ts-ignore\n document.cancelFullScreen();\n // @ts-ignore\n } else if(document.mozCancelFullScreen) {\n // @ts-ignore\n document.mozCancelFullScreen();\n // @ts-ignore\n } else if(document.webkitCancelFullScreen) {\n // @ts-ignore\n document.webkitCancelFullScreen();\n // @ts-ignore\n } else if(document.msExitFullscreen) {\n // @ts-ignore\n document.msExitFullscreen();\n }\n}\n\nexport function addFullScreenListener(element: HTMLElement, callback: (e: Event) => any, listenerSetter?: ListenerSetter) {\n const addListener = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange'.split(' ').forEach((eventName) => {\n addListener(eventName, callback, false);\n });\n}\n\nexport function getFullScreenElement(): HTMLElement {\n // @ts-ignore\n return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;\n}\n\nexport function isFullScreen() {\n return !!getFullScreenElement();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpAsChild from './findUpAsChild';\n\nexport default function getCaretPosNew(input: HTMLElement, anchor?: boolean): ReturnType & {selection: Selection} {\n const selection = document.getSelection();\n // let {focusNode: node, focusOffset: offset} = selection;\n const node = selection[anchor ? 'anchorNode' : 'focusNode'];\n const offset = selection[anchor ? 'anchorOffset' : 'focusOffset'];\n if(!findUpAsChild(node, input) && node !== input) {\n return {selection} as any;\n }\n\n return {...getCaretPosF(input, node, offset), selection};\n}\n\nexport function getCaretPosF(input: HTMLElement, node: Node, offset: number) {\n if(node === input) {\n const childNodes = input.childNodes;\n const childNodesLength = childNodes.length;\n if(childNodesLength && offset >= childNodesLength) {\n node = childNodes[childNodesLength - 1];\n offset = (node.textContent || (node as HTMLImageElement).alt || '').length;\n } else {\n node = childNodes[offset];\n offset = 0;\n }\n }\n\n return {node: node as ChildNode, offset};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport BOM from '../string/bom';\n\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler'/* | 'customEmoji' */;\nexport type MarkdownTag = {\n match: string,\n entityName: Extract;\n};\n\n// https://core.telegram.org/bots/api#html-style\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\n bold: {\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\n entityName: 'messageEntityBold'\n },\n underline: {\n match: '[style*=\"underline\"], u, ins',\n entityName: 'messageEntityUnderline'\n },\n italic: {\n match: '[style*=\"italic\"], i, em',\n entityName: 'messageEntityItalic'\n },\n monospace: {\n match: '[style*=\"monospace\"], [face*=\"monospace\"], pre',\n entityName: 'messageEntityCode'\n },\n strikethrough: {\n match: '[style*=\"line-through\"], [style*=\"strikethrough\"], strike, del, s',\n entityName: 'messageEntityStrike'\n },\n link: {\n match: 'A:not(.follow)',\n entityName: 'messageEntityTextUrl'\n },\n mentionName: {\n match: 'A.follow',\n entityName: 'messageEntityMentionName'\n },\n spoiler: {\n match: '[style*=\"spoiler\"]',\n entityName: 'messageEntitySpoiler'\n }\n // customEmoji: {\n // match: '.custom-emoji',\n // entityName: 'messageEntityCustomEmoji'\n // }\n};\n\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\n\n/* export function getDepth(child: Node, container?: Node) {\n let depth = 0;\n\n do {\n if(child === container) {\n return depth;\n }\n\n ++depth;\n } while((child = child.parentNode) !== null);\n\n return depth;\n} */\n\nconst BLOCK_TAGS = new Set([\n 'DIV',\n 'P',\n 'BR',\n 'LI',\n 'SECTION',\n 'H6',\n 'H5',\n 'H4',\n 'H3',\n 'H2',\n 'H1',\n 'TR',\n 'OL',\n 'UL'\n]);\n\nconst INSERT_NEW_LINE_TAGS = new Set([\n 'OL',\n 'UL'\n]);\n\nconst BOM_REG_EXP = new RegExp(BOM, 'g');\n\nfunction checkNodeForEntity(node: Node, value: string, entities: MessageEntity[], offset: {offset: number}) {\n const parentElement = node.parentElement;\n\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\n for(const type in markdownTags) {\n const tag = markdownTags[type as MarkdownType];\n const closest: HTMLElement = parentElement.closest(tag.match + ', [contenteditable=\"true\"]');\n if(closest?.getAttribute('contenteditable') !== null) {\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\n if(closestDepth > depth) {\n closestDepth = depth;\n closestTag = tag;\n closestElementByTag = closest;\n } */\n continue;\n }\n\n if(tag.entityName === 'messageEntityTextUrl') {\n entities.push({\n _: tag.entityName,\n url: (closest as HTMLAnchorElement).href,\n offset: offset.offset,\n length: value.length\n });\n } else if(tag.entityName === 'messageEntityMentionName') {\n entities.push({\n _: tag.entityName,\n offset: offset.offset,\n length: value.length,\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\n });\n }/* else if(tag.entityName === 'messageEntityCustomEmoji') {\n entities.push({\n _: tag.entityName,\n document_id: (closest as HTMLElement).dataset.docId,\n offset: offset.offset,\n length: emoji.length\n });\n } */ else {\n entities.push({\n _: tag.entityName,\n offset: offset.offset,\n length: value.length\n });\n }\n }\n}\n\nexport default function getRichElementValue(\n node: HTMLElement,\n lines: string[],\n line: string[],\n selNode?: Node,\n selOffset?: number,\n entities?: MessageEntity[],\n offset = {offset: 0}\n) {\n if(node.nodeType === node.TEXT_NODE) { // TEXT\n let nodeValue = node.nodeValue;\n // if(nodeValue[0] === BOM) {\n nodeValue = nodeValue.replace(BOM_REG_EXP, '');\n // }\n\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\n if(tabulation?.getAttribute('contenteditable') === null) {\n nodeValue += ' ';\n // line.push('\\t');\n // ++offset.offset;\n } */\n\n if(nodeValue) {\n if(selNode === node) {\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\n } else {\n line.push(nodeValue);\n }\n } else if(selNode === node) {\n line.push('\\x01');\n }\n\n if(entities && nodeValue.length && node.parentNode) {\n checkNodeForEntity(node, nodeValue, entities, offset);\n }\n\n offset.offset += nodeValue.length;\n return;\n }\n\n if(node.nodeType !== node.ELEMENT_NODE) { // NON-ELEMENT\n return;\n }\n\n const isSelected = selNode === node;\n const isBlock = BLOCK_TAGS.has(node.tagName);\n if(isBlock && (line.length || node.tagName === 'BR'/* || (BLOCK_TAGS.has(node.tagName) && lines.length) */)) {\n lines.push(line.join(''));\n line.length = 0;\n ++offset.offset;\n } else {\n const alt = node.dataset.stickerEmoji || (node as HTMLImageElement).alt;\n const stickerEmoji = node.dataset.stickerEmoji;\n\n if(alt && entities) {\n checkNodeForEntity(node, alt, entities, offset);\n }\n\n if(stickerEmoji && entities) {\n entities.push({\n _: 'messageEntityCustomEmoji',\n document_id: node.dataset.docId,\n offset: offset.offset,\n length: alt.length\n });\n }\n\n if(alt) {\n line.push(alt);\n offset.offset += alt.length;\n }\n }\n\n if(isSelected && !selOffset) {\n line.push('\\x01');\n }\n\n const isTableCell = node.matches(tabulationMatch);\n const wasEntitiesLength = entities?.length;\n\n let curChild = node.firstChild as HTMLElement;\n while(curChild) {\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\n curChild = curChild.nextSibling as any;\n }\n\n if(isSelected && selOffset) {\n line.push('\\x01');\n }\n\n if(isTableCell && node.nextSibling && line.length) {\n line.push(' ');\n ++offset.offset;\n\n // * combine entities such as url after adding space\n if(wasEntitiesLength !== undefined) {\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\n ++entities[i].length;\n }\n }\n }\n\n const wasLength = line.length;\n if(isBlock && wasLength) {\n lines.push(line.join(''));\n line.splice(0, wasLength);\n ++offset.offset;\n }\n\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\n lines.push('');\n ++offset.offset;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {MessageEntity} from '../../layer';\nimport combineSameEntities from '../../lib/richTextProcessor/combineSameEntities';\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\nimport getRichElementValue from './getRichElementValue';\n\nexport function getCaretPos(field: HTMLElement) {\n const sel = window.getSelection();\n let selNode: Node;\n let selOffset: number;\n if(sel?.rangeCount) {\n const range = sel.getRangeAt(0);\n const startOffset = range.startOffset;\n if(\n range.startContainer &&\n range.startContainer == range.endContainer &&\n startOffset == range.endOffset\n ) {\n // * if focused on img, or caret has been set via placeCaretAtEnd\n const possibleChildrenFocusOffset = startOffset - 1;\n const childNodes = field.childNodes;\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\n selNode = childNodes[possibleChildrenFocusOffset];\n selOffset = 0;\n\n for(let i = 0; i < range.endOffset; ++i) {\n const node = childNodes[i];\n const value = node.nodeValue || (node as HTMLImageElement).alt;\n\n if(value) {\n selOffset += value.length;\n }\n }\n } else {\n selNode = range.startContainer;\n selOffset = startOffset;\n }\n }\n }\n\n return {node: selNode, offset: selOffset};\n}\n\nexport default function getRichValueWithCaret(\n field: HTMLElement | DocumentFragment,\n withEntities = true,\n withCaret = true\n) {\n const lines: string[] = [];\n const line: string[] = [];\n\n const {node: selNode, offset: selOffset} = !(field instanceof DocumentFragment) && withCaret && getCaretPos(field);\n\n const entities: MessageEntity[] = withEntities ? [] : undefined;\n const offset = {offset: 0};\n if(field instanceof DocumentFragment) {\n let curChild = field.firstChild as HTMLElement;\n while(curChild) {\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\n curChild = curChild.nextSibling as any;\n }\n } else {\n getRichElementValue(field, lines, line, selNode, selOffset, entities, offset);\n }\n\n if(line.length) {\n lines.push(line.join(''));\n }\n\n let value = lines.join('\\n');\n const caretPos = value.indexOf('\\x01');\n if(caretPos !== -1) {\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\n }\n value = value.replace(/\\u00A0/g, ' ');\n\n if(entities?.length) {\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\n /* const entity = entities[entities.length - 1];\n const length = value.length;\n const trimmedLength = value.trimRight().length;\n if(length !== trimmedLength) {\n entity.length -= length - trimmedLength;\n } */\n\n combineSameEntities(entities);\n sortEntities(entities);\n }\n\n return {value, entities, caretPos};\n}\n\nMOUNT_CLASS_TO.getRichValueWithCaret = getRichValueWithCaret;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getVisibleRect from './getVisibleRect';\n\nexport type ViewportSlicePart = {element: HTMLElement, rect: DOMRect, visibleRect: ReturnType}[];\n\nexport default function getViewportSlice({overflowElement, overflowRect, selector, extraSize, elements}: {\n overflowElement: HTMLElement,\n overflowRect?: DOMRectMinified,\n extraSize?: number,\n selector?: string,\n elements?: HTMLElement[]\n}) {\n // const perf = performance.now();\n overflowRect ??= overflowElement.getBoundingClientRect();\n elements ??= Array.from(overflowElement.querySelectorAll(selector));\n\n if(extraSize) {\n overflowRect = {\n top: overflowRect.top - extraSize,\n right: overflowRect.right + extraSize,\n bottom: overflowRect.bottom + extraSize,\n left: overflowRect.left - extraSize\n };\n }\n\n const invisibleTop: ViewportSlicePart = [],\n visible: typeof invisibleTop = [],\n invisibleBottom: typeof invisibleTop = [];\n let foundVisible = false;\n for(const element of elements) {\n const rect = element.getBoundingClientRect();\n const visibleRect = getVisibleRect(element, overflowElement, false, rect, overflowRect);\n\n const isVisible = !!visibleRect;\n let array: typeof invisibleTop;\n if(isVisible) {\n foundVisible = true;\n array = visible;\n } else if(foundVisible) {\n array = invisibleBottom;\n } else {\n array = invisibleTop;\n }\n\n array.push({\n element,\n rect,\n visibleRect\n });\n }\n\n // if(extraSize && visible.length) {\n // const maxTop = visible[0].rect.top;\n // const minTop = maxTop - extraSize;\n // const minBottom = visible[visible.length - 1].rect.bottom;\n // const maxBottom = minBottom + extraSize;\n\n // for(let length = invisibleTop.length, i = length - 1; i >= 0; --i) {\n // const element = invisibleTop[i];\n // if(element.rect.top >= minTop) {\n // invisibleTop.splice(i, 1);\n // visible.unshift(element);\n // }\n // }\n\n // for(let i = 0, length = invisibleBottom.length; i < length; ++i) {\n // const element = invisibleBottom[i];\n // if(element.rect.bottom <= maxBottom) {\n // invisibleBottom.splice(i--, 1);\n // --length;\n // visible.push(element);\n // }\n // }\n // }\n\n // console.log('getViewportSlice time:', performance.now() - perf);\n\n return {invisibleTop, visible, invisibleBottom};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport windowSize from '../windowSize';\n\nexport default function getVisibleRect(\n element: HTMLElement,\n overflowElement: HTMLElement,\n lookForSticky?: boolean,\n rect: DOMRectMinified = element.getBoundingClientRect(),\n overflowRect: DOMRectMinified = overflowElement.getBoundingClientRect()\n) {\n let {top: overflowTop, right: overflowRight, bottom: overflowBottom, left: overflowLeft} = overflowRect;\n\n // * respect sticky headers\n if(lookForSticky) {\n const sticky = overflowElement.querySelector('.sticky');\n if(sticky) {\n const stickyRect = sticky.getBoundingClientRect();\n overflowTop = stickyRect.bottom;\n }\n }\n\n if(rect.top >= overflowBottom ||\n rect.bottom <= overflowTop ||\n rect.right <= overflowLeft ||\n rect.left >= overflowRight) {\n return null;\n }\n\n const overflow = {\n top: false,\n right: false,\n bottom: false,\n left: false,\n vertical: 0 as 0 | 1 | 2,\n horizontal: 0 as 0 | 1 | 2\n };\n\n const windowWidth = windowSize.width;\n const windowHeight = windowSize.height;\n\n return {\n rect: {\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\n right: rect.right > overflowRight && overflowRight !== windowWidth ? (overflow.right = true, ++overflow.horizontal, overflowRight) : rect.right,\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\n left: rect.left < overflowLeft && overflowLeft !== 0 ? (overflow.left = true, ++overflow.horizontal, overflowLeft) : rect.left\n },\n overflow\n };\n}\n\n(window as any).getVisibleRect = getVisibleRect;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SwipeHandler, {SwipeHandlerOptions} from '../../components/swipeHandler';\nimport cancelEvent from './cancelEvent';\nimport findUpClassName from './findUpClassName';\nimport isSwipingBackSafari from './isSwipingBackSafari';\n\nexport type SwipeHandlerHorizontalOptions = SwipeHandlerOptions & {\n // xThreshold?: number\n};\n\nexport default function handleHorizontalSwipe(options: SwipeHandlerHorizontalOptions) {\n let cancelY = false;\n return new SwipeHandler({\n ...options,\n verifyTouchTarget: (e) => {\n return !findUpClassName(e.target, 'progress-line') &&\n !isSwipingBackSafari(e as any as TouchEvent) &&\n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\n\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e as any as Event);\n cancelY = true;\n } else if(!cancelY && Math.abs(yDiff) > Math.abs(xDiff)/* || Math.abs(yDiff) > 20 */) {\n return true;\n }\n\n /* if(!cancelY && options.xThreshold !== undefined && xDiff >= options.xThreshold) {\n cancelY = true;\n } */\n\n return options.onSwipe(xDiff, yDiff, e);\n },\n onReset: () => {\n cancelY = false;\n options.onReset && options.onReset();\n },\n cancelEvent: false // cannot use cancelEvent on Safari iOS because scroll will be canceled too\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {cancelContextMenuOpening} from './attachContextMenuListener';\nimport handleHorizontalSwipe, {SwipeHandlerHorizontalOptions} from './handleHorizontalSwipe';\n\nexport default function handleTabSwipe(options: SwipeHandlerHorizontalOptions) {\n return handleHorizontalSwipe({\n ...options,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\n\n if(Math.abs(xDiff) > 50) {\n options.onSwipe(xDiff, yDiff, e);\n cancelContextMenuOpening();\n\n return true;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function htmlToDocumentFragment(html: string | DocumentFragment) {\n if(html instanceof DocumentFragment) return html;\n const template = document.createElement('template');\n html = html.trim(); // Never return a text node of whitespace as the result\n template.innerHTML = html;\n return template.content;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function htmlToSpan(html: string | DocumentFragment) {\n const span = document.createElement('span');\n if(typeof(html) === 'string') span.innerHTML = html;\n else span.append(html);\n return span;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\n if(!element) {\n return false;\n }\n\n parentNode = parentNode || document.body;\n if(element === parentNode) {\n return true;\n }\n return isInDOM(element.parentNode as HTMLElement, parentNode);\n} */\nexport default function isInDOM(element: Element): boolean {\n return element?.isConnected;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function isInputEmpty(element: HTMLElement) {\n if(element.isContentEditable || element.tagName !== 'INPUT') {\n /* const value = element.innerText;\n\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\n // return !getRichValueWithCaret(element, false, false).value.trim();\n return !element.textContent.trim() && !element.querySelector('.emoji, .custom-emoji, .custom-emoji-placeholder');\n } else {\n return !(element as HTMLInputElement).value.trim();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\nimport {IS_MOBILE, IS_APPLE} from '../../environment/userAgent';\n\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\n /* if(e.ctrlKey || e.metaKey) {\n this.messageInput.innerHTML += '
';\n placeCaretAtEnd(this.message)\n return;\n } */\n\n if(rootScope.settings.sendShortcut === 'enter') {\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\n return;\n }\n\n return true;\n } else {\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\n return;\n }\n\n if(secondaryKey) {\n return true;\n }\n }\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false, focus = true) {\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || (document.activeElement.tagName !== 'INPUT' && !(document.activeElement as HTMLElement).isContentEditable))) {\n return;\n }\n\n focus && el.focus();\n if(el instanceof HTMLInputElement) {\n const length = el.value.length;\n el.selectionStart = length;\n el.selectionEnd = length;\n } else {\n const range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n\n(window as any).placeCaretAtEnd = placeCaretAtEnd;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport whichChild from './whichChild';\n\nexport default function positionElementByIndex(element: HTMLElement, container: HTMLElement, pos: number, prevPos?: number) {\n if(prevPos === undefined) {\n prevPos = element.parentElement === container ? whichChild(element) : -1;\n }\n\n if(prevPos === pos) {\n return false;\n } else if(prevPos !== -1 && prevPos < pos) { // was higher\n pos += 1;\n }\n\n if(!pos) {\n container.prepend(element);\n } else if(container.childElementCount > pos) {\n container.insertBefore(element, container.children[pos]);\n } else {\n container.append(element);\n }\n\n return true;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport onMediaLoad from '../onMediaLoad';\n\n// import { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\n\nexport const loadedURLs: {[url: string]: boolean} = {};\nconst set = (elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string) => {\n if(elem instanceof HTMLImageElement || elem instanceof HTMLVideoElement) elem.src = url;\n else if(elem instanceof SVGImageElement) elem.setAttributeNS(null, 'href', url);\n else elem.style.backgroundImage = 'url(' + url + ')';\n};\n\n// проблема функции в том, что она не подходит для ссылок, пригодна только для blob'ов, потому что обычным ссылкам нужен 'load' каждый раз.\nexport default function renderImageFromUrl(\n elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement,\n url: string,\n callback?: () => void,\n useCache = true\n) {\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback?.();\n return;\n }\n\n const isVideo = elem instanceof HTMLVideoElement;\n if(((loadedURLs[url]/* && false */) && useCache) || isVideo) {\n if(elem) {\n set(elem, url);\n }\n\n if(callback) {\n if(isVideo) {\n onMediaLoad(elem).then(callback);\n } else {\n callback?.();\n }\n // callback && getHeavyAnimationPromise().then(() => callback());\n }\n } else {\n const isImage = elem instanceof HTMLImageElement;\n const loader = isImage ? elem as HTMLImageElement : new Image();\n // const loader = new Image();\n loader.src = url;\n // let perf = performance.now();\n\n const onLoad = () => {\n if(!isImage && elem) {\n set(elem, url);\n }\n\n loadedURLs[url] = true;\n // console.log('onload:', url, performance.now() - perf);\n // TODO: переделать прогрузки аватаров до начала анимации, иначе с этим ожиданием они неприятно появляются\n // callback && getHeavyAnimationPromise().then(() => callback());\n callback?.();\n\n loader.removeEventListener('error', onError);\n };\n\n const onError = (err: ErrorEvent) => {\n console.error('Render image from url failed:', err, url, loader);\n loader.removeEventListener('load', onLoad);\n callback?.();\n };\n\n loader.addEventListener('load', onLoad, {once: true});\n loader.addEventListener('error', onError, {once: true});\n }\n}\n\nexport function renderImageFromUrlPromise(elem: Parameters[0], url: string, useCache?: boolean) {\n return new Promise((resolve) => {\n renderImageFromUrl(elem, url, resolve, useCache);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport sequentialDom from '../sequentialDom';\nimport {renderImageFromUrlPromise} from './renderImageFromUrl';\n\nexport default function renderMediaWithFadeIn(\n container: HTMLElement,\n media: Parameters[0],\n url: string,\n needFadeIn: boolean,\n aspecter = container,\n thumbImage?: HTMLElement\n) {\n if(needFadeIn) {\n media.classList.add('fade-in');\n }\n\n const promise = renderImageFromUrlPromise(media, url).then(() => {\n return sequentialDom.mutateElement(container, () => {\n aspecter.append(media);\n\n if(needFadeIn) {\n media.addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n media.classList.remove('fade-in');\n thumbImage?.remove();\n });\n }, {once: true});\n } else {\n thumbImage?.remove();\n }\n });\n });\n\n // recordPromise(promise, 'renderImageWithFadeIn');\n\n return promise;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\n if(typeof(node) === 'string') {\n elem.innerHTML = node;\n return;\n }\n\n // * children.length doesn't count text nodes\n const firstChild = elem.firstChild;\n if(firstChild) {\n if(elem.lastChild === firstChild) {\n firstChild.replaceWith(node);\n } else {\n elem.textContent = '';\n elem.append(node);\n }\n } else {\n elem.append(node);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport clamp from '../number/clamp';\nimport findUpAsChild from './findUpAsChild';\nimport whichChild from './whichChild';\n\nexport default function compareNodes(node1: ChildNode, node1Offset: number, node2: ChildNode, node2Offset: number) {\n let diff: number;\n if(node1 === node2) {\n diff = node1Offset - node2Offset;\n } else if(node1.parentElement === node2.parentElement) {\n diff = whichChild(node1, true) - whichChild(node2, true);\n } else {\n const parents: HTMLElement[] = [];\n let parentElement = node1.parentElement;\n do {\n parents.push(parentElement);\n } while(parentElement = parentElement.parentElement);\n\n parentElement = node2.parentElement;\n do {\n if(parents.includes(parentElement)) {\n break;\n }\n } while(parentElement = parentElement.parentElement);\n\n const commonAncestorContainer = parentElement;\n // const range = document.createRange();\n // range.setStart(node1, 0);\n // range.setEnd(node2, node2.textContent.length);\n // const {commonAncestorContainer} = range;\n node1 = findUpAsChild(node1 as HTMLElement, commonAncestorContainer as HTMLElement);\n node2 = findUpAsChild(node2 as HTMLElement, commonAncestorContainer as HTMLElement);\n diff = whichChild(node1, true) - whichChild(node2, true);\n }\n\n return clamp(diff, -1, 1);\n}\n\n(window as any).compareNodes = compareNodes;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport {logger} from '../../lib/logger';\nimport {isCustomFillerNeededBySiblingNode} from '../../lib/richTextProcessor/wrapRichText';\nimport ListenerSetter from '../listenerSetter';\nimport BOM from '../string/bom';\nimport compareNodes from './compareNodes';\nimport getCaretPosNew from './getCaretPosNew';\nimport placeCaretAtEnd from './placeCaretAtEnd';\nimport whichChild from './whichChild';\n\nconst NOT_ONLY_BOMS_REG_EXP = new RegExp(`[^${BOM}]`);\n\nexport const USING_BOMS = false;\n\nexport default class RichInputHandler {\n private static INSTANCE: RichInputHandler;\n\n private listenerSetter: ListenerSetter;\n\n private lastNode: Node;\n private lastOffset: number;\n private savedRanges: WeakMap;\n\n private log: ReturnType;\n\n private inputCaptureCallbacks: Function[];\n\n constructor() {\n this.log = logger('RICH-INPUT');\n this.listenerSetter = new ListenerSetter();\n this.savedRanges = new WeakMap();\n\n this.listenerSetter.add(document)('selectionchange', this.saveSelectionOnChange);\n if(USING_BOMS) {\n this.listenerSetter.add(document)('focusout', this.onFocusOut);\n this.listenerSetter.add(document)('selectionchange', this.onSelectionChange);\n this.listenerSetter.add(document)('beforeinput', this.onBeforeInput);\n this.listenerSetter.add(document)('keydown', this.onKeyDown, {capture: true});\n\n if(IS_FIREFOX) {\n this.inputCaptureCallbacks = [];\n this.listenerSetter.add(document)('input', () => {\n this.inputCaptureCallbacks.forEach((callback) => callback());\n this.inputCaptureCallbacks.length = 0;\n }, {capture: true});\n }\n }\n }\n\n private get input() {\n const selection = document.getSelection();\n const {anchorNode: node} = selection;\n if(!node) return;\n return ((node as HTMLElement).closest ? node as HTMLElement : node.parentElement).closest('[contenteditable=\"true\"]');\n }\n\n private saveRangeForElement(element: HTMLElement) {\n if(element && (element.isContentEditable || element.tagName === 'INPUT')) {\n const selection = document.getSelection();\n if(selection.rangeCount) {\n this.savedRanges.set(element as HTMLElement, document.getSelection().getRangeAt(0));\n }\n }\n }\n\n private saveSelectionOnChange = (e: Event) => {\n const element = document.activeElement as HTMLElement; // e.target as HTMLElement;\n this.saveRangeForElement(element);\n };\n\n private onFocusOut = (e: FocusEvent) => {\n this.lastNode = this.lastOffset = undefined;\n };\n\n private findPreviousSmthIndex(input: HTMLElement, node: ChildNode, something?: NodeListOf) {\n // node = this.getFiller(node);\n // const childNodes = Array.from(node.parentElement.childNodes);\n // fillerIndex = childNodes.indexOf(node);\n // let smthIndex = -1;\n // for(let i = fillerIndex; i >= 0; --i) {\n // const node = childNodes[i];\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // smthIndex = i;\n // break;\n // }\n // }\n // return smthIndex;\n\n const elements = Array.from(something ?? input.querySelectorAll('.input-something'));\n const index = elements.findIndex((element) => compareNodes(element, 0, node, 0) >= 0);\n return index === -1 ? elements.length - 1 : Math.max(0, index - 1);\n }\n\n private superMove(\n input: HTMLElement,\n caret: ReturnType,\n toLeft: boolean,\n fromSelectionChange: boolean\n ) {\n const {node, offset, move} = caret;\n const something = input.querySelectorAll('.input-something');\n const smthIndex = this.findPreviousSmthIndex(input, node, something);\n const r = document.createRange();\n r[toLeft ? 'setEnd' : 'setStart'](node, offset);\n\n if(fromSelectionChange) {\n move(toLeft);\n }\n\n const c = this.getCaretPosN();\n if(c.node?.nodeValue === BOM && (!fromSelectionChange || node === this.lastNode)) {\n const idx = this.findPreviousSmthIndex(input, c.node, something);\n\n let moved = !fromSelectionChange;\n\n do {\n const c = this.getCaretPosN();\n const idxidx = this.findPreviousSmthIndex(input, c.node, something);\n r[toLeft ? 'setStart' : 'setEnd'](c.node, c.offset);\n const rangeString = r.toString();\n const onlyBOMs = !NOT_ONLY_BOMS_REG_EXP.test(rangeString);\n this.log('test cursor', rangeString, onlyBOMs, idx, idxidx);\n if(\n onlyBOMs &&\n c.node?.nodeValue === BOM &&\n idxidx === idx &&\n // (idxidx > 1 || c.offset) &&\n // (idxidx < (getFiller(c.node).parentElement.childNodes.length - 2) || c.offset < BOM.length)\n (idxidx || c.offset) &&\n (idxidx < (something.length - 1) || c.offset < BOM.length)\n ) {\n move(toLeft);\n moved = true;\n } else if(!moved) {\n break;\n } else {\n if((!this.getFiller(node as HTMLElement).classList.contains('input-filler-text') && idx !== smthIndex) || c.offset === BOM.length) {\n move(!toLeft);\n }\n\n break;\n }\n } while(true);\n }\n }\n\n private onSelectionChange = (e: Event) => {\n const {input} = this;\n if(!input) {\n this.setSelectionClassName(document.getSelection());\n return;\n }\n\n // return;\n\n // this.log('selectionchange', document.getSelection(), document.getSelection().rangeCount && document.getSelection().getRangeAt(0), getCaretPosN());\n // let {node, offset} = getCaretPos(this.messageInput);\n\n let caret = this.getCaretPosN();\n do {\n const {node, offset, selection, move} = caret;\n\n const nodeValue = node?.nodeValue;\n // if(!nodeValue?.includes(BOM)) {\n if(nodeValue !== BOM || !this.lastNode) {\n break;\n }\n\n // node = getFiller(node);\n\n // const childIndex = whichChild(getFiller(node), true);\n // let toLeft: boolean;\n // // if(node === lastNode) toLeft = lastOffset >= offset;\n // if(node === lastNode) toLeft = lastOffset > offset;\n // else {\n // // toLeft = whichChild(getFiller(lastNode)) > childIndex;\n // toLeft = (lastNode.nodeValue === BOM ? whichChild(getFiller(lastNode), true) : whichChild(findUpAsChild(lastNode as any, getFiller(node).parentElement), true)) > childIndex;\n // }\n\n const toLeft = compareNodes(node, offset, this.lastNode as ChildNode, this.lastOffset) < 0;\n\n // const childNodes = Array.from(node.parentElement.childNodes);\n // if(toLeft) {\n // for(let i = childIndex; i >= 0; --i) {\n // const sibling = childNodes[i];\n // const {textContent} = sibling;\n // for()\n // }\n // }\n\n // {\n // if(toLeft === undefined) {\n // return;\n // }\n\n // const selection = window.getSelection();\n // selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // return;\n // }\n\n // const parent = getFiller(node);\n if(toLeft !== undefined) {\n // let newNode = toLeft ? parent.previousSibling : parent.nextSibling;\n if(selection.isCollapsed) {\n this.superMove(input, caret, toLeft, true);\n\n // if(offset === BOM.length) {\n // newNode = toLeft ? newNode.nextSibling.nextSibling : parent.previousSibling.previousSibling;\n // }\n\n // setCaretAt(newNode);\n } else {\n selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // const range = selection.getRangeAt(0);\n\n // if(toLeft) {\n // newNode = parent.previousSibling.previousSibling.firstChild;\n // const value = newNode.nodeValue;\n // range.setStart(newNode, value?.length);\n // } else {\n // newNode = parent.nextSibling.nextSibling.firstChild;\n // range.setEnd(newNode, 0);\n // }\n }\n }\n\n this.log('selectionchange',\n node,\n offset,\n this.lastNode,\n this.lastOffset,\n node === this.lastNode,\n whichChild(this.getFiller(node)),\n whichChild(this.getFiller(this.lastNode)),\n toLeft,\n selection,\n document.getSelection(),\n document.getSelection().getRangeAt(0),\n node?.parentNode,\n this.lastNode?.parentNode\n );\n\n caret = this.getCaretPosN();\n this.lastNode = node;\n this.lastOffset = offset;\n\n break;\n\n // if(findPreviousSmthIndex(caret.node) !== smthIndex) {\n // break;\n // }\n } while(true);\n\n this.lastNode = this.lastOffset = undefined;\n\n // if(offset === BOM.length) {\n // setCaretAt(parent);\n // } else {\n // setCaretAt(parent.nextSibling);\n // }\n\n this.setSelectionClassName(caret.selection, input);\n };\n\n public restoreSavedRange(input: HTMLElement) {\n const range = this.getSavedRange(input);\n if(!range) {\n return false;\n }\n\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n return true;\n }\n\n public getSavedRange(input: HTMLElement) {\n return this.savedRanges.get(input);\n }\n\n public makeFocused(input: HTMLElement) {\n if(document.activeElement !== input && !this.restoreSavedRange(input)) {\n placeCaretAtEnd(input, false, false);\n }\n }\n\n private fixInsertedLineBreaks(input: HTMLElement) {\n input.querySelectorAll('br').forEach((br) => {\n br.classList.add('br-not-br');\n });\n }\n\n private fixBuggedCaret() {\n const selection = document.getSelection();\n const range = selection.getRangeAt(0);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n public onBeforeInput = (e: Pick) => {\n const {input, log} = this;\n if(!input) {\n return;\n }\n\n const addInputCallback = this.addInputCallback.bind(this, input);\n\n const caretPos = this.getCaretPosN();\n let {node, offset, selection, move} = caretPos;\n log('beforeinput', e, node, offset, selection, caretPos);\n this.lastNode = this.lastOffset = undefined;\n\n if(e.inputType.startsWith('delete')) { // delete current BOM\n addInputCallback(() => {\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.fixInsertedLineBreaks(input);\n });\n\n if(node?.nodeValue === BOM && selection.isCollapsed && e.inputType.includes('deleteContent')) {\n const toLeft = e.inputType.includes('Backward');\n const moveFirst = (offset === BOM.length && toLeft) || (!offset && !toLeft);\n this.superMove(input, caretPos, toLeft, moveFirst);\n // if((offset === BOM.length && toLeft) || (!offset && !toLeft)) {\n // move(toLeft);\n // }\n\n // addInputCallback(() => {\n // removePossibleBOMSiblingsByNode(getFiller(node));\n // });\n\n // if(node.parentNode.childNodes.length === 1) {\n // (node.parentNode as HTMLElement).remove();\n // move(e.inputType.includes('Backward') ? false : true);\n // } else {\n // move(e.inputType.includes('Backward') ? true : false);\n // addInputCallback(() => {\n // move(e.inputType.includes('Backward') ? false : true);\n // });\n // }\n\n // for(let i = 0, length = BOM.length + (direction === 'backward' ? offset : BOM.length - offset); i < length; ++i) {\n // selection.modify('extend', direction, 'character');\n // }\n\n // selection.modify('extend', direction, 'character');\n // selection.modify('extend', direction, 'character');\n\n // selection.deleteFromDocument();\n // e.preventDefault();\n } else {\n // const filler = getFiller(node);\n // if(filler?.classList?.contains('input-filler-text')) {\n // const {previousSibling, nextSibling} = filler;\n // addInputCallback(() => {\n // if(!filler.isConnected) {\n // removePossibleBOMSiblings(previousSibling, nextSibling);\n // }\n // // removeExtraBOMs();\n // // processEmptiedFillers();\n // });\n // }\n // addInputCallback(() => {\n // this.fixInsertedLineBreaks(input);\n // });\n }\n } else if(e.inputType.startsWith('insert')) { // clear current BOM\n if((node as HTMLElement)?.classList?.contains('input-something')/* || (node.textContent === BOM && offset === BOM.length) */) {\n node = node.previousSibling.firstChild;\n const range = selection.getRangeAt(0);\n range.setStart(node, 0);\n range.setEnd(node, 0);\n range.collapse(true);\n // selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n if(node && node.textContent === BOM && offset === BOM.length) {\n // const range = selection.getRangeAt(0);\n // range.setStart(node, 0);\n // range.setEnd(node, 0);\n // range.collapse(true);\n selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n // if(node && node.textContent === BOM && offset === 0) {\n // selection.modify('move', 'forward', 'character');\n // offset = BOM.length;\n // }\n\n if(e.inputType === 'insertLineBreak' || true) {\n // const appendix = 'X';\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // selection.modify('move', 'forward', 'character');\n // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n /* if(node?.nodeValue === BOM) */ {\n // const parent = node.parentElement;\n // parent.contentEditable = 'false';\n // addInputCallback(() => {\n // parent.contentEditable = 'inherit';\n // });\n // node.parentElement.remove();\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // fix case when focused somehow on span instead of text node\n if(node && node.nodeType === node.ELEMENT_NODE) {\n node = node.firstChild;\n log.warn('fixing focus on span');\n }\n\n const isBOM = node?.nodeValue === BOM;\n log('inserting line break', isBOM, node, `\"${node?.nodeValue}\"`, node?.parentElement ? Array.from(node.parentElement.childNodes).slice() : []);\n if(isBOM) {\n // (node as ChildNode).replaceWith(this.messageInput.querySelector('.lol'));\n\n const parentElement = node.parentElement;\n parentElement.classList.replace('input-filler', 'input-filler-text');\n const childNodesLength = parentElement.childNodes.length;\n addInputCallback(() => {\n const newChildNodesLength = parentElement.childNodes.length;\n if(newChildNodesLength > 1/* && newChildNodesLength !== childNodesLength */) {\n log('inserting line break, remove');\n node = Array.from(parentElement.childNodes).find((node) => node.nodeValue === BOM);\n (parentElement as any).t = node;\n // node?.remove();\n\n // const n = parentElement.firstChild;\n // const range = selection.getRangeAt(0);\n // range.setStart(n, n.nodeValue.length);\n // range.setEnd(n, n.nodeValue.length);\n } else if(node.nodeValue !== BOM) {\n log('inserting line break, deleteData');\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // node = document.createTextNode(BOM);\n }\n\n this.fixInsertedLineBreaks(input);\n // (parentElement as any).t = node;\n // node.remove();\n });\n // addInputCallback(() => {\n // node.parentElement.classList.replace('input-filler', 'input-filler3');\n // const s = document.createElement('span');\n // s.style.display = 'none';\n // node.replaceWith(s);\n // s.prepend(node);\n // });\n } else if(e.inputType === 'insertLineBreak') {\n addInputCallback(() => {\n this.fixInsertedLineBreaks(input);\n });\n // const range = selection.getRangeAt(0);\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }, false);\n }/* else if(node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n\n } */\n\n // if(e.inputType === 'insertLineBreak') {\n // e.preventDefault();\n // document.execCommand('insertHTML', false, '\\n');\n\n // this.messageInputField.simulateInputEvent();\n // }\n\n // node.parentElement.replaceWith(node);\n // selection.removeAllRanges();\n // const range = new Range();\n // range.setStart(node, 0);\n // range.setEnd(node, node.nodeValue.length);\n // selection.addRange(range);\n // node.parentElement.classList.remove('input-filler');\n // node.parentElement\n }\n\n // document.execCommand('insertHTML', false, '\\n');\n // e.preventDefault();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // if(node?.nodeValue === BOM) {\n // addInputCallback(() => {\n // node.remove();\n // });\n // }\n // this.messageInputField.simulateInputEvent();\n\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n // });\n return;\n }\n\n if(node?.nodeValue === BOM) {\n // node.nodeValue = ''; // ! will move cursor forward\n // addInputCallback(() => {\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // });\n\n if(e.inputType === 'insertLineBreak') {\n if(offset === BOM.length) {\n selection.modify('move', 'backward', 'character');\n }\n\n // if(offset !== BOM.length) {\n // selection.modify('move', 'forward', 'character');\n // }\n\n addInputCallback(() => {\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n\n setTimeout(() => {\n selection.modify('move', 'forward', 'character');\n }, 0);\n });\n }\n\n // node.parentElement.replaceWith(node);\n\n // node.parentElement.replaceWith(node);\n if(e.inputType === 'insertLineBreak') {\n // const previousParentSibling = node.parentNode.previousSibling;\n // addInputCallback(() => {\n // if(previousParentSibling.nextSibling.nodeValue === '\\n') {\n // previousParentSibling.nextSibling.remove();\n\n // setTimeout(() => {\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // }, 0);\n // } else {\n // previousParentSibling.nextSibling.nodeValue = previousParentSibling.nextSibling.nodeValue.replace('\\n\\n', '\\n');\n // }\n // });\n } else {\n // if(node.parentElement !== this.messageInput) {\n // node.parentElement.replaceWith(node);\n // }\n\n // setTimeout(() => {\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // node.nodeValue = node.nodeValue.replace(BOM, '');\n // // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // }, 1000);\n\n addInputCallback(() => {\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n if(!node.nodeValue) {\n node.remove();\n }\n\n // selection.modify('move', 'forward', 'character');\n });\n }\n\n if(selection.isCollapsed && false) {\n node.parentElement.replaceWith(node);\n // const textNode = document.createTextNode(BOM);\n // (node.parentNode as any as ChildNode).after(textNode);\n // setCaretAt(textNode.nextSibling);\n // selection.modify('move', 'forward', 'character');\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n // selection.collapseToEnd();\n\n // addInputCallback(() => {\n // (textNode as CharacterData).deleteData(textNode.nodeValue.indexOf(BOM), BOM.length);\n // node.parentElement.remove();\n // });\n }\n } else if(e.inputType === 'insertLineBreak' &&\n node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n log('inserting line break');\n // const appendix = '\\x01';\n\n input.querySelectorAll('.input-something').forEach((el) => {\n el.contentEditable = 'inherit';\n });\n addInputCallback(() => {\n input.querySelectorAll('.input-something').forEach((el) => {\n el.contentEditable = 'false';\n });\n });\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // const offset = node.nodeValue.length;\n // (node as CharacterData).insertData(offset, appendix);\n // addInputCallback(() => {\n // selection.modify('move', 'forward', 'character');\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(appendix), appendix.length);\n // if(!node.nodeValue) {\n // node.remove();\n // }\n // });\n }\n } else if(e.inputType === 'historyUndo') { // have to remove extra BOMs\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.removeEmptyTextNodes(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n\n // lol\n // this.messageInput.querySelectorAll('.has-text').forEach((el) => {\n // if(el.textContent === BOM) {\n // el.firstElementChild.replaceWith(el.firstElementChild.firstChild);\n // el.classList.replace('input-filler3', 'input-filler');\n // }\n // });\n });\n } else if(e.inputType === 'historyRedo') {\n // if(node?.nodeValue === BOM && offset === BOM.length) {\n // selection.modify('move', 'backward', 'character');\n // }\n\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n\n // fix contenteditable attribute\n input.querySelectorAll('.input-something:not([contenteditable])').forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n });\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n\n // // have to ignore line up and down\n if(key === 'ArrowDown' || key === 'ArrowUp') {\n this.lastNode = this.lastOffset = undefined;\n } else {\n const {node, offset} = this.getCaretPosN();\n this.lastNode = node/* getFiller(node) */, this.lastOffset = offset;\n if(this.lastNode === this.input) {\n this.lastNode = this.lastOffset = undefined;\n }\n }\n\n this.log('keydown', this.lastNode, this.lastNode?.parentNode, this.lastOffset, this.getCaretPosN(), e);\n };\n\n private addInputCallback(input: HTMLElement, callback: () => void, capture = true) {\n const newCallback = () => {\n this.log('input modify callback');\n callback();\n };\n\n if(capture && IS_FIREFOX) this.inputCaptureCallbacks.push(newCallback);\n else this.listenerSetter.add(input)('input', newCallback, {once: true, capture});\n }\n\n public removeExtraBOMs(input: HTMLElement) {\n const c = (sibling: ChildNode) => {\n return (sibling as HTMLElement)?.classList?.contains('input-something');\n };\n\n input.querySelectorAll('.input-filler').forEach((el) => {\n const {previousSibling, nextSibling} = el;\n let needed = false;\n\n // if(!(previousSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(previousSibling)) {\n if(!(nextSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(nextSibling)) {\n needed = c(previousSibling) || c(nextSibling);\n }\n\n if(!needed) {\n this.log.warn('removing empty bom node', el);\n el.remove();\n }\n });\n }\n\n private getFiller(node: Node) {\n return node && node.nodeType === node.TEXT_NODE && node.parentElement !== this.input ? node.parentElement : node as HTMLElement;\n }\n\n private getCaretPosN() {\n const ret = getCaretPosNew(this.input);\n // const {node} = ret;\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // ret.node = node.previousSibling;\n // ret.offset = ret.node.textContent.length;\n // }\n\n return {...ret, move: this.move.bind(this, ret.selection)};\n }\n\n private removeEmptyTextNodes(input: HTMLElement) {\n const {log} = this;\n // let i = -1;\n // remove empty text nodes\n const treeWalker = document.createTreeWalker(\n input,\n NodeFilter.SHOW_TEXT,\n {acceptNode: (node) => node.parentElement === input && !node.nodeValue/* && !++i */ ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT}\n );\n\n let textNode: Text;\n while(textNode = treeWalker.nextNode() as Text) {\n log.warn('removing empty text node', textNode);\n textNode.remove();\n }\n }\n\n private removePossibleBOMSiblings(previousSibling: ChildNode, nextSibling: ChildNode) {\n [previousSibling, nextSibling].forEach((sibling) => {\n if((sibling as HTMLElement)?.classList?.contains('input-filler')) {\n sibling.remove();\n }\n });\n }\n\n private removePossibleBOMSiblingsByNode(node: ChildNode) {\n const {previousSibling, nextSibling} = node;\n this.removePossibleBOMSiblings(previousSibling, nextSibling);\n };\n\n private processEmptiedFillers(input: HTMLElement) {\n input.querySelectorAll('.input-filler-text').forEach((el) => {\n this.removeExtraBOMs(el);\n\n let cleanSiblings = true;\n if(!el.textContent) {\n el.classList.replace('input-filler-text', 'input-filler');\n\n const textNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE);\n if(textNode) {\n (textNode as CharacterData).insertData(0, BOM);\n } else if(((el as any).t as ChildNode)?.nodeValue) {\n el.append((el as any).t);\n } else {\n el.append(document.createTextNode(BOM));\n }\n } else if(!NOT_ONLY_BOMS_REG_EXP.test(el.textContent) && !el.querySelector('.input-something')) {\n el.classList.replace('input-filler-text', 'input-filler');\n } else {\n cleanSiblings = false;\n }\n\n if(cleanSiblings) {\n this.removePossibleBOMSiblingsByNode(el);\n }\n });\n }\n\n private processFilledFillers(input: HTMLElement) {\n // remove the BOM when changing to text\n input.querySelectorAll('.input-filler').forEach((el) => {\n if(el.textContent !== BOM) {\n el.classList.replace('input-filler', 'input-filler-text');\n const t = (el as any).t as ChildNode;\n const bomNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE && node.nodeValue.includes(BOM));\n if(bomNode && !t?.nodeValue) {\n const idx = bomNode.nodeValue.indexOf(BOM);\n if(idx !== -1) {\n (bomNode as CharacterData).deleteData(idx, BOM.length);\n }\n }\n\n // t?.remove();\n }\n });\n }\n\n private setSelectionClassName(selection: Selection, input?: HTMLElement) {\n // Array.from(this.messageInput.querySelectorAll('.selection')).forEach((element) => {\n // element.classList.remove('selection');\n // });\n\n if(selection.rangeCount) {\n const range = selection.getRangeAt(0);\n\n if(input) {\n Array.from(input.querySelectorAll('.input-selectable')).forEach((element) => {\n element.classList.toggle('selection', !range.collapsed && range.intersectsNode(element));\n });\n } else {\n Array.from(document.querySelectorAll('.input-selectable.selection')).forEach((element) => element.classList.remove('selection'));\n }\n }\n }\n\n private move(selection: Selection, left: boolean) {\n const {focusNode: focusNodeBefore, focusOffset: focusOffsetBefore} = selection;\n selection.modify('extend', left ? 'backward' : 'forward', 'character');\n // if(offset === nodeValue.length) {\n // selection.modify('extend', !left ? 'backward' : 'forward', 'character');\n // }\n if(left) selection.collapseToStart();\n else selection.collapseToEnd();\n const {focusNode: focusNodeAfter, focusOffset: focusOffsetAfter} = selection;\n this.log(\n 'moving cursor',\n left,\n focusNodeBefore,\n focusNodeBefore.nodeType === focusNodeBefore.ELEMENT_NODE ? focusNodeBefore : focusNodeBefore.parentElement,\n focusOffsetBefore,\n focusNodeAfter,\n focusNodeAfter.nodeType === focusNodeAfter.ELEMENT_NODE ? focusNodeAfter : focusNodeAfter.parentElement,\n focusOffsetAfter\n );\n }\n\n public prepareApplyingMarkdown() {\n const {input} = this;\n\n // do not wrap fillers into spans\n const fillers = input.querySelectorAll('.input-filler');\n // fillers.forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n const smths = input.querySelectorAll('.input-something');\n smths.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n return () => {\n fillers.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n smths.forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n };\n }\n\n public static getInstance() {\n return this.INSTANCE ??= new RichInputHandler();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ScrollableBase} from '../../components/scrollable';\nimport SwipeHandler from '../../components/swipeHandler';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport rootScope from '../../lib/rootScope';\nimport {Middleware} from '../middleware';\nimport clamp from '../number/clamp';\nimport safeAssign from '../object/safeAssign';\nimport pause from '../schedulers/pause';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent} from './clickEvent';\nimport findUpAsChild from './findUpAsChild';\nimport positionElementByIndex from './positionElementByIndex';\nimport whichChild from './whichChild';\n\nexport default class Sortable {\n private element: HTMLElement;\n private elementRect: DOMRect;\n private containerRect: DOMRect;\n private scrollableRect: DOMRect;\n private minY: number;\n private maxY: number;\n private siblings: HTMLElement[];\n private swipeHandler: SwipeHandler;\n private startScrollPos: number;\n private addScrollPos: number;\n\n private list: HTMLElement;\n private middleware: Middleware;\n private onSort: (prevIdx: number, newIdx: number) => void;\n private scrollable: ScrollableBase;\n\n constructor(options: {\n list: HTMLElement,\n middleware: Middleware,\n onSort: Sortable['onSort'],\n scrollable?: Sortable['scrollable']\n }) {\n safeAssign(this, options);\n\n this.swipeHandler = new SwipeHandler({\n element: this.list,\n onSwipe: this.onSwipe,\n verifyTouchTarget: this.verifyTouchTarget,\n onStart: this.onStart,\n onReset: this.onReset,\n setCursorTo: document.body,\n middleware: this.middleware,\n withDelay: true\n });\n }\n\n private onSwipe = (xDiff: number, yDiff: number) => {\n yDiff = clamp(yDiff, this.minY, this.maxY);\n this.element.style.transform = `translateY(${yDiff}px)`;\n const count = Math.round(Math.abs(yDiff) / this.elementRect.height);\n const lastSiblings = this.siblings;\n this.siblings = [];\n const property = yDiff < 0 ? 'previousElementSibling' : 'nextElementSibling';\n let sibling = this.element[property] as HTMLElement;\n for(let i = 0; i < count; ++i) {\n if(this.getSortableTarget(sibling)) {\n this.siblings.push(sibling);\n sibling = sibling[property] as HTMLElement;\n } else {\n break;\n }\n }\n\n (lastSiblings || []).forEach((sibling) => {\n if(!this.siblings.includes(sibling)) {\n sibling.style.transform = '';\n }\n });\n\n this.siblings.forEach((sibling) => {\n const y = this.elementRect.height * (yDiff < 0 ? 1 : -1);\n sibling.style.transform = `translateY(${y}px)`;\n });\n\n if(this.scrollableRect) {\n const diff = yDiff;\n const toEnd = diff > 0;\n const elementEndPos = toEnd ? this.elementRect.bottom : this.elementRect.top;\n const clientY = elementEndPos + diff - this.addScrollPos;\n // console.log(clientY, this.scrollableRect.top, elementEndPos, diff, this.addScrollPos, toEnd);\n let change = 2;\n if((clientY + (toEnd ? 0 : this.elementRect.height)) >= this.scrollableRect.bottom/* && diff < this.maxY */) {\n\n } else if((clientY - (toEnd ? this.elementRect.height : 0)) <= this.scrollableRect.top/* && diff > this.minY */) {\n change *= -1;\n } else {\n change = undefined;\n }\n\n if(change !== undefined) {\n this.scrollable.container[this.scrollable.scrollProperty] += change;\n }\n }\n };\n\n private verifyTouchTarget = (e: {target: EventTarget}) => {\n if(this.list.classList.contains('is-reordering')) {\n return false;\n }\n\n this.element = this.getSortableTarget(e.target as HTMLElement);\n return !!this.element/* && pause(150).then(() => true) */;\n };\n\n private onScroll = () => {\n const scrollPos = this.scrollable.container[this.scrollable.scrollProperty];\n const diff = this.addScrollPos = scrollPos - this.startScrollPos;\n const isVertical = this.scrollable.scrollProperty === 'scrollTop';\n this.swipeHandler.add(isVertical ? 0 : diff, isVertical ? diff : 0);\n };\n\n private onStart = () => {\n this.list.classList.add('is-reordering');\n this.element.classList.add('is-dragging', 'no-transition');\n this.swipeHandler.setCursor('grabbing');\n this.elementRect = this.element.getBoundingClientRect();\n this.containerRect = this.list.getBoundingClientRect();\n\n this.minY = this.containerRect.top - this.elementRect.top;\n this.maxY = this.containerRect.bottom - this.elementRect.bottom;\n this.addScrollPos = 0;\n\n if(this.scrollable) {\n this.startScrollPos = this.scrollable.container[this.scrollable.scrollProperty];\n this.scrollableRect = this.scrollable.container.getBoundingClientRect();\n this.scrollable.container.addEventListener('scroll', this.onScroll);\n }\n };\n\n private onReset = async() => {\n const length = this.siblings.length;\n const move = length && length * (this.siblings[0].previousElementSibling === this.element ? 1 : -1);\n const idx = whichChild(this.element);\n const newIdx = idx + move;\n\n this.element.classList.remove('no-transition');\n this.element.style.transform = move ? `translateY(${move * this.elementRect.height}px)` : '';\n this.swipeHandler.setCursor('');\n\n if(this.scrollable) {\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n attachClickEvent(document.body, cancelEvent, {capture: true, once: true});\n }\n\n if(rootScope.settings.animationsEnabled) {\n await pause(250);\n }\n\n this.list.classList.remove('is-reordering');\n this.element.classList.remove('is-dragging');\n positionElementByIndex(this.element, this.list, newIdx, idx);\n [this.element, ...this.siblings].forEach((element) => {\n element.style.transform = '';\n });\n\n this.element =\n this.siblings =\n this.elementRect =\n this.containerRect =\n this.minY =\n this.maxY =\n this.startScrollPos =\n this.addScrollPos =\n undefined;\n\n // cancelClick = true;\n\n if(!move) {\n return;\n }\n\n this.onSort(idx, newIdx);\n };\n\n private getSortableTarget(target: HTMLElement) {\n if(!target) {\n return;\n }\n\n let child = findUpAsChild(target as HTMLElement, this.list);\n if(child && child.classList.contains('cant-sort')) {\n child = undefined;\n }\n\n return child;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\n if(disable) {\n elements.forEach((el) => el.setAttribute('disabled', 'true'));\n } else {\n elements.forEach((el) => el.removeAttribute('disabled'));\n }\n\n return () => toggleDisability(elements, !disable);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function whichChild(elem: Node, countNonElements?: boolean) {\n if(!elem.parentNode) {\n return -1;\n }\n\n if(countNonElements) {\n return Array.from(elem.parentNode.childNodes).indexOf(elem as ChildNode);\n }\n\n let i = 0;\n // @ts-ignore\n while((elem = elem.previousElementSibling) !== null) ++i;\n return i;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent, detachClickEvent} from './dom/clickEvent';\nimport findUpAsChild from './dom/findUpAsChild';\nimport EventListenerBase from './eventListenerBase';\nimport ListenerSetter from './listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport safeAssign from './object/safeAssign';\nimport appNavigationController, {NavigationItem} from '../components/appNavigationController';\nimport findUpClassName from './dom/findUpClassName';\nimport rootScope from '../lib/rootScope';\n\nconst KEEP_OPEN = false;\nconst TOGGLE_TIMEOUT = 200;\nconst ANIMATION_DURATION = 200;\n\nexport type IgnoreMouseOutType = 'click' | 'menu' | 'popup';\ntype DropdownHoverTimeoutType = 'toggle' | 'done';\n\nexport default class DropdownHover extends EventListenerBase<{\n open: () => Promise | void,\n openAfterLayout: () => void,\n opened: () => any,\n close: () => any,\n closed: () => any\n}> {\n protected element: HTMLElement;\n protected forceClose: boolean;\n protected inited: boolean;\n protected ignoreMouseOut: Set;\n protected ignoreButtons: Set;\n protected navigationItem: NavigationItem;\n protected ignoreOutClickClassName: string;\n protected timeouts: {[type in DropdownHoverTimeoutType]?: number};\n\n constructor(options: {\n element: DropdownHover['element'],\n ignoreOutClickClassName?: string\n }) {\n super(false);\n safeAssign(this, options);\n this.forceClose = false;\n this.inited = false;\n this.ignoreMouseOut = new Set();\n this.ignoreButtons = new Set();\n this.timeouts = {};\n }\n\n public attachButtonListener(\n button: HTMLElement,\n listenerSetter: ListenerSetter\n ) {\n let firstTime = true;\n if(IS_TOUCH_SUPPORTED) {\n attachClickEvent(button, () => {\n if(firstTime) {\n firstTime = false;\n this.toggle(true);\n } else {\n this.toggle();\n }\n }, {listenerSetter});\n } else {\n listenerSetter.add(button)('mouseover', (e) => {\n if(firstTime) {\n listenerSetter.add(button)('mouseout', (e) => {\n this.clearTimeout('toggle');\n this.onMouseOut(e);\n });\n firstTime = false;\n }\n\n this.setTimeout('toggle', () => {\n this.toggle(true);\n }, TOGGLE_TIMEOUT);\n });\n\n attachClickEvent(button, () => {\n const type: IgnoreMouseOutType = 'click';\n const ignore = !this.ignoreMouseOut.has(type);\n\n if(ignore && !this.ignoreMouseOut.size) {\n this.ignoreButtons.add(button);\n setTimeout(() => {\n attachClickEvent(window, this.onClickOut, {capture: true});\n }, 0);\n }\n\n this.setIgnoreMouseOut(type, ignore);\n this.toggle(ignore);\n }, {listenerSetter});\n }\n }\n\n protected onClickOut = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if(\n !findUpAsChild(target, this.element) &&\n !Array.from(this.ignoreButtons).some((button) => findUpAsChild(target, button) || target === button) &&\n this.ignoreMouseOut.size <= 1 &&\n (!this.ignoreOutClickClassName || !findUpClassName(target, this.ignoreOutClickClassName))\n ) {\n this.toggle(false);\n }\n };\n\n protected onMouseOut = (e: MouseEvent) => {\n if(KEEP_OPEN || !this.isActive()) return;\n this.clearTimeout('toggle');\n\n if(this.ignoreMouseOut.size) {\n return;\n }\n\n const toElement = (e as any).toElement as HTMLElement;\n if(toElement && findUpAsChild(toElement, this.element)) {\n return;\n }\n\n this.setTimeout('toggle', () => {\n this.toggle(false);\n }, TOGGLE_TIMEOUT);\n };\n\n protected clearTimeout(type: DropdownHoverTimeoutType) {\n if(this.timeouts[type] !== undefined) {\n clearTimeout(this.timeouts[type]);\n delete this.timeouts[type];\n }\n }\n\n protected setTimeout(type: DropdownHoverTimeoutType, cb: () => void, timeout: number) {\n this.clearTimeout(type);\n this.timeouts[type] = window.setTimeout(() => {\n this.clearTimeout(type);\n cb();\n }, timeout);\n }\n\n public init() {\n if(!IS_TOUCH_SUPPORTED) {\n this.element.onmouseout = this.onMouseOut;\n this.element.onmouseover = (e) => {\n if(this.forceClose) {\n return;\n }\n\n // console.log('onmouseover element');\n this.clearTimeout('toggle');\n };\n }\n }\n\n public toggle = async(enable?: boolean) => {\n // if(!this.element) return;\n const willBeActive = (!!this.element.style.display && enable === undefined) || enable;\n if(this.init) {\n if(willBeActive) {\n this.init();\n this.init = null;\n } else {\n return;\n }\n }\n\n if(willBeActive === this.isActive()) {\n return;\n }\n\n const delay = IS_TOUCH_SUPPORTED || !rootScope.settings.animationsEnabled ? 0 : ANIMATION_DURATION;\n if((this.element.style.display && enable === undefined) || enable) {\n const res = this.dispatchResultableEvent('open');\n await Promise.all(res);\n\n this.element.style.display = '';\n void this.element.offsetLeft; // reflow\n this.element.classList.add('active');\n\n this.dispatchEvent('openAfterLayout');\n\n appNavigationController.pushItem(this.navigationItem = {\n type: 'dropdown',\n onPop: () => {\n this.toggle(false);\n }\n });\n\n this.clearTimeout('toggle');\n this.setTimeout('done', () => {\n this.forceClose = false;\n this.dispatchEvent('opened');\n }, delay);\n\n // ! can't use together with resizeObserver\n /* if(isTouchSupported) {\n const height = this.element.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\n console.log('[ESG]: toggle: enable height', height);\n appImManager.chat.bubbles.scrollable.scrollTop += height;\n } */\n\n /* if(touchSupport) {\n this.restoreScroll();\n } */\n } else {\n this.dispatchEvent('close');\n this.ignoreMouseOut.clear();\n this.ignoreButtons.clear();\n\n this.element.classList.remove('active');\n\n appNavigationController.removeItem(this.navigationItem);\n detachClickEvent(window, this.onClickOut, {capture: true});\n\n this.clearTimeout('toggle');\n this.setTimeout('done', () => {\n this.element.style.display = 'none';\n this.forceClose = false;\n this.dispatchEvent('closed');\n }, delay);\n\n /* if(isTouchSupported) {\n const scrollHeight = this.container.scrollHeight;\n if(scrollHeight) {\n const height = this.container.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\n appImManager.chat.bubbles.scrollable.scrollTop -= height;\n }\n } */\n\n /* if(touchSupport) {\n this.restoreScroll();\n } */\n }\n\n // animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n };\n\n public isActive() {\n return this.element.classList.contains('active');\n }\n\n public setIgnoreMouseOut(type: IgnoreMouseOutType, ignore: boolean) {\n ignore ? this.ignoreMouseOut.add(type) : this.ignoreMouseOut.delete(type);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's fastSmoothScroll slightly patched\n\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\nimport {fastRafPromise} from './schedulers';\nimport {animateSingle, cancelAnimationByKey} from './animation';\nimport rootScope from '../lib/rootScope';\nimport isInDOM from './dom/isInDOM';\n\nconst MIN_JS_DURATION = 250;\nconst MAX_JS_DURATION = 600;\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n};\n\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\nexport type ScrollGetElementPositionCallback = (options: {elementRect: DOMRect, containerRect: DOMRect, elementPosition: number}) => number;\nexport type ScrollStartCallbackDimensions = {\n scrollSize: number,\n scrollPosition: number,\n distanceToEnd: number,\n path: number,\n duration: number,\n containerRect: DOMRect,\n elementRect: DOMRect,\n getProgress: () => number\n};\n\nexport type ScrollOptions = {\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin?: number,\n maxDistance?: number,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n axis?: 'x' | 'y',\n getNormalSize?: ScrollGetNormalSizeCallback,\n getElementPosition?: ScrollGetElementPositionCallback,\n fallbackToElementStartWhenCentering?: HTMLElement,\n startCallback?: (dimensions: ScrollStartCallbackDimensions) => void,\n transitionFunction?: (value: number) => number\n};\n\nexport default function fastSmoothScroll(options: ScrollOptions) {\n options.margin ??= 0;\n options.maxDistance ??= LONG_TRANSITION_MAX_DISTANCE;\n options.axis ??= 'y';\n // return;\n\n if(!rootScope.settings.animationsEnabled || options.forceDuration === 0) {\n options.forceDirection = FocusDirection.Static;\n }\n\n if(options.forceDirection === FocusDirection.Static) {\n options.forceDuration = 0;\n return scrollWithJs(options);\n /* return Promise.resolve();\n\n element.scrollIntoView({ block: position });\n\n cancelAnimationByKey(container);\n return Promise.resolve(); */\n }\n\n const promise = fastRafPromise().then(() => scrollWithJs(options));\n\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\n}\n\nfunction scrollWithJs(options: ScrollOptions): Promise {\n const {element, container, getNormalSize, getElementPosition, transitionFunction, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\n if(!isInDOM(element)) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n\n const rectStartKey = axis === 'y' ? 'top' : 'left';\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\n const sizeKey = axis === 'y' ? 'height' : 'width';\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\n const elementScrollSizeKey = axis === 'y' ? 'scrollHeight' : 'offsetWidth'; // can use offsetWidth for X, since it's almost same as scrollWidth\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n // const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const elementRect = element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\n\n // const transformable = container.firstElementChild as HTMLElement;\n\n const possibleElementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\n const elementPosition = getElementPosition ? getElementPosition({elementRect, containerRect, elementPosition: possibleElementPosition}) : possibleElementPosition;\n const elementSize = element[elementScrollSizeKey]; // margin is exclusive in DOMRect\n\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\n\n let scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n /* const elementPosition = element.offsetTop;\n const elementSize = element.offsetHeight;\n\n const scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n const containerSize = container.offsetHeight; */\n\n let path!: number;\n\n switch(position) {\n case 'start':\n path = elementPosition - margin;\n break;\n case 'end':\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n if(elementSize < containerSize) {\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\n } else {\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\n options.element = options.fallbackToElementStartWhenCentering;\n options.position = 'start';\n return scrollWithJs(options);\n }\n\n path = elementPosition - margin;\n }\n\n break;\n }\n /* switch (position) {\n case 'start':\n path = (elementPosition - margin) - scrollPosition;\n break;\n case 'end':\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementSize < containerSize\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\n : (elementPosition - margin) - scrollPosition;\n break;\n } */\n\n if(Math.abs(path - (margin || 0)) < 1) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n\n if(axis === 'y') {\n if(forceDirection === undefined) {\n if(path > maxDistance) {\n scrollPosition = container.scrollTop += path - maxDistance;\n path = maxDistance;\n } else if(path < -maxDistance) {\n scrollPosition = container.scrollTop += path + maxDistance;\n path = -maxDistance;\n }\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\n } */\n }\n\n // console.log('scrollWithJs: will scroll path:', path, element);\n\n /* let existsTransform = 0;\n const currentTransform = transformable.style.transform;\n if(currentTransform) {\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\n //path += existsTransform;\n } */\n\n if(path < 0) {\n const remainingPath = -scrollPosition;\n path = Math.max(path, remainingPath);\n } else if(path > 0) {\n const remainingPath = scrollSize - (scrollPosition + containerSize);\n path = Math.min(path, remainingPath);\n }\n\n const target = container[scrollPositionKey] + path;\n const absPath = Math.abs(path);\n const duration = forceDuration ?? (\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\n );\n const startAt = Date.now();\n\n /* transformable.classList.add('no-transition');\n\n const tickTransform = () => {\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const currentPath = path * transition(t);\n\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\n container.dataset.translate = '' + -currentPath;\n\n const willContinue = t < 1;\n if(!willContinue) {\n fastRaf(() => {\n delete container.dataset.transform;\n container.dataset.transform = '';\n transformable.style.transform = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n container[scrollPositionKey] = Math.round(target);\n });\n }\n\n return willContinue;\n };\n\n return animateSingle(tickTransform, container); */\n\n /* return new Promise((resolve) => {\n fastRaf(() => {\n transformable.style.transform = '';\n transformable.style.transition = '';\n\n setTimeout(resolve, duration);\n });\n });\n\n const transformableHeight = transformable.scrollHeight;\n //transformable.style.minHeight = `${transformableHeight}px`;\n */\n\n const transition = transitionFunction ?? (absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition);\n const getProgress = () => duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const tick = () => {\n const t = getProgress();\n const value = transition(t);\n const currentPath = path * (1 - value);\n container[scrollPositionKey] = Math.round(target - currentPath);\n\n return t < 1;\n };\n\n if(!duration || !path) {\n cancelAnimationByKey(container);\n tick();\n return Promise.resolve();\n }\n\n /* return new Promise((resolve) => {\n setTimeout(resolve, duration);\n }).then(() => {\n transformable.classList.add('no-transition');\n void transformable.offsetLeft; // reflow\n transformable.style.transform = '';\n transformable.style.transition = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n fastRaf(() => {\n\n container[scrollPositionKey] = Math.round(target);\n //transformable.style.minHeight = ``;\n });\n\n }); */\n\n if(options.startCallback) {\n const distanceToEnd = scrollSize - Math.round(target + container[axis === 'y' ? 'offsetHeight' : 'offsetWidth']);\n options.startCallback({\n scrollSize,\n scrollPosition,\n distanceToEnd,\n path,\n duration,\n containerRect,\n elementRect,\n getProgress\n });\n }\n\n return animateSingle(tick, container);\n}\n\nfunction longTransition(t: number) {\n return 1 - ((1 - t) ** 5);\n}\n\nfunction shortTransition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\n\nconst FILENAME_JOINER = '_';\n\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\n fileName: string,\n downloadId: string\n}>) {\n const fileName = '';// (options?.fileName || '').split('.');\n const ext = fileName[fileName.length - 1] || '';\n\n let str: string;\n switch(location._) {\n case 'inputPhotoFileLocation': {\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputDocumentFileLocation': {\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputPeerPhotoFileLocation':\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\n break;\n\n case 'inputStickerSetThumb': {\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\n location.stickerset._;\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputFileLocation': {\n str = location.volume_id + '_' + location.local_id;\n break;\n }\n\n case 'inputWebFileLocation': {\n str = ['webFile', location.url].join(FILENAME_JOINER);\n break;\n }\n\n default: {\n console.error('Unrecognized location:', location);\n str = '';\n break;\n }\n }\n\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\n}\n\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\n // console.log('getFileURL', location);\n // const perf = performance.now();\n const encoded = encodeURIComponent(JSON.stringify(options));\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\n\n return /* '/' + */type + '/' + encoded;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, MessageAction} from '../layer';\nimport type {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport forEachReverse from './array/forEachReverse';\n\nexport default function filterChatPhotosMessages(value: {\n count: number;\n next_rate: number;\n offset_id_offset: number;\n history: MyMessage[];\n}) {\n forEachReverse(value.history, (message, idx, arr) => {\n if(!((message as Message.messageService).action as MessageAction.messageActionChatEditPhoto).photo) {\n arr.splice(idx, 1);\n if(value.count !== undefined) {\n --value.count;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {i18n, LangPackKey} from '../lib/langPack';\n\nexport default function formatBytes(bytes: number, decimals: number | 'auto' = 'auto') {\n if(bytes === 0) return i18n('FileSize.B', [0]);\n\n const strictDecimals = decimals === 'auto';\n\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const _decimals = decimals === 'auto' ? Math.max(0, i - 1) : decimals;\n\n const dm = Math.max(0, _decimals);\n const sizes: LangPackKey[] = ['FileSize.B', 'FileSize.KB', 'FileSize.MB', 'FileSize.GB'];\n\n const fixed = (bytes / Math.pow(k, i)).toFixed(dm);\n return i18n(sizes[i], [strictDecimals ? fixed : parseFloat(fixed)]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport I18n, {i18n, join, LangPackKey} from '../lib/langPack';\nimport formatDuration, {DurationType} from './formatDuration';\n\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\n s: 'Seconds',\n m: 'Minutes',\n h: 'Hours',\n d: 'Days',\n w: 'Weeks',\n mm: 'Months',\n y: 'Years'\n};\nexport default function formatCallDuration(duration: number, plain?: boolean) {\n const a = formatDuration(duration, 2);\n if(plain) {\n const strings = a.map((d) => I18n.format(CALL_DURATION_LANG_KEYS[d.type], true, [d.duration]));\n return join(strings, false, plain);\n }\n\n const elements = a.map((d) => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\n\n const fragment = document.createElement('span');\n fragment.append(...join(elements, false));\n\n return fragment;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type DurationType = 's' | 'm' | 'h' | 'd' | 'w' | 'mm' | 'y';\nexport default function formatDuration(duration: number, showLast = 2) {\n if(!duration) {\n duration = 1;\n }\n\n const d: {duration: number, type: DurationType}[] = [];\n const p = [\n {m: 1, t: 's'},\n {m: 60, t: 'm'},\n {m: 60, t: 'h'},\n {m: 24, t: 'd'},\n {m: 7, t: 'w'}\n ] as Array<{m?: number, t: DurationType}>\n const s = 1;\n let t = s;\n p.forEach((o, idx) => {\n t = Math.round(t * o.m);\n\n if(duration < t) {\n return;\n }\n\n let dd = duration / t;\n if(idx !== (p.length - 1)) {\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\n dd %= modulus;\n }\n\n d.push({\n duration: dd | 0,\n type: o.t\n });\n });\n\n const out = d.slice(-showLast).reverse();\n for(let i = out.length - 1; i >= 0; --i) {\n if(out[i].duration === 0) {\n out.splice(i, 1);\n }\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport I18n from '../lib/langPack';\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n\n if(!prefixes.size) {\n I18n.countriesList.forEach((country) => {\n country.country_codes.forEach((code) => {\n if(code.prefixes) {\n code.prefixes.forEach((prefix) => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n const phoneCode = str.slice(0, maxPrefixLength);\n\n // //console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n\n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str,\n country: undefined,\n code: undefined,\n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n\n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k]) {\n patternMatches += 1.01;\n } else if(_pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n\n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n\n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {RLottieColor} from '../lib/rlottie/rlottiePlayer';\n\nexport type FramesCacheMap = Map;\nexport type FramesCacheMapNew = Map;\nexport type FramesCacheMapURLs = Map;\nexport type FramesCacheItem = {\n frames: FramesCacheMap,\n framesNew: FramesCacheMapNew,\n framesURLs: FramesCacheMapURLs,\n clearCache: () => void,\n counter: number\n};\n\nexport class FramesCache {\n private cache: Map;\n\n constructor() {\n this.cache = new Map();\n }\n\n public static createCache(): FramesCacheItem {\n const cache: FramesCacheItem = {\n frames: new Map(),\n framesNew: new Map(),\n framesURLs: new Map(),\n clearCache: () => {\n cache.framesNew.forEach((value) => {\n (value as ImageBitmap).close?.();\n });\n\n cache.frames.clear();\n cache.framesNew.clear();\n cache.framesURLs.clear();\n },\n counter: 0\n };\n\n return cache;\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = FramesCache.createCache());\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache;\n }\n\n public releaseCache(name: string) {\n const cache = this.cache.get(name);\n if(cache && !--cache.counter) {\n this.cache.delete(name);\n // console.warn('[RLottieCache] released cache', cache);\n }\n }\n\n public getCacheCounter(name: string) {\n const cache = this.cache.get(name);\n return cache?.counter;\n }\n\n public generateName(name: string, width: number, height: number, color: RLottieColor, toneIndex: number) {\n return [\n name,\n width,\n height,\n // color ? rgbaToHexa(color) : ''\n color ? 'colored' : '',\n toneIndex || ''\n ].filter(Boolean).join('-');\n }\n}\n\nconst framesCache = new FramesCache();\n\nexport default framesCache;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// generate a path's arc data parameter\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\n\n// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\nfunction arcParameter(rx: number, ry: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, x: number, y: number) {\n return [rx, ',', ry, ' ',\n xAxisRotation, ' ',\n largeArcFlag, ',',\n sweepFlag, ' ',\n x, ',', y].join('');\n}\n\nexport default function generatePathData(x: number, y: number, width: number, height: number, tl: number, tr: number, br: number, bl: number) {\n const data: string[] = [];\n\n // start point in top-middle of the rectangle\n data.push('M' + (x + width / 2) + ',' + y);\n\n // next we go to the right\n data.push('H' + (x + width - tr));\n\n if(tr > 0) {\n // now we draw the arc in the top-right corner\n data.push('A' + arcParameter(tr, tr, 0, 0, 1, (x + width), (y + tr)));\n }\n\n // next we go down\n data.push('V' + (y + height - br));\n\n if(br > 0) {\n // now we draw the arc in the lower-right corner\n data.push('A' + arcParameter(br, br, 0, 0, 1, (x + width - br), (y + height)));\n }\n\n // now we go to the left\n data.push('H' + (x + bl));\n\n if(bl > 0) {\n // now we draw the arc in the lower-left corner\n data.push('A' + arcParameter(bl, bl, 0, 0, 1, (x + 0), (y + height - bl)));\n }\n\n // next we go up\n data.push('V' + (y + tl));\n\n if(tl > 0) {\n // now we draw the arc in the top-left corner\n data.push('A' + arcParameter(tl, tl, 0, 0, 1, (x + tl), (y + 0)));\n }\n\n // and we close the path\n data.push('Z');\n\n return data.join(' ');\n}\n\nMOUNT_CLASS_TO.generatePathData = generatePathData;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PhotoSize} from '../layer';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {renderImageFromUrlPromise} from './dom/renderImageFromUrl';\nimport getPreviewURLFromThumb from './getPreviewURLFromThumb';\nimport blur from './blur';\n\nexport default function getImageFromStrippedThumb(\n photo: MyPhoto | MyDocument,\n thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize,\n useBlur: boolean\n) {\n const url = getPreviewURLFromThumb(photo, thumb, false);\n\n let element: HTMLImageElement | HTMLCanvasElement, loadPromise: Promise;\n if(!useBlur) {\n element = new Image();\n loadPromise = renderImageFromUrlPromise(element, url);\n } else {\n const result = blur(url);\n element = result.canvas;\n loadPromise = result.promise;\n }\n\n element.classList.add('thumbnail');\n\n return {image: element, loadPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {PhotoSize} from '../layer';\n// import appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport getPreviewURLFromBytes from './bytes/getPreviewURLFromBytes';\n\nexport default function getPreviewURLFromThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, isSticker = false) {\n // const cacheContext = appDownloadManager.getCacheContext(photo, thumb.type);\n // return cacheContext.url || (cacheContext.url = getPreviewURLFromBytes(thumb.bytes, isSticker));\n return getPreviewURLFromBytes(thumb.bytes, isSticker);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {THUMB_TYPE_FULL} from '../lib/mtproto/mtproto_config';\nimport type {ThumbCache} from '../lib/storages/thumbs';\nimport getImageFromStrippedThumb from './getImageFromStrippedThumb';\n\nexport default function getStrippedThumbIfNeeded(photo: MyPhoto | MyDocument, cacheContext: ThumbCache, useBlur: boolean, ignoreCache = false) {\n const isVideo = (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type);\n if(!cacheContext.downloaded || isVideo || ignoreCache) {\n if(\n photo._ === 'document' &&\n cacheContext.downloaded &&\n !ignoreCache &&\n (!isVideo || cacheContext.type !== THUMB_TYPE_FULL)\n ) {\n return null;\n }\n\n const sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs;\n const thumb = sizes?.length ? sizes.find((size) => size._ === 'photoStrippedSize') : null;\n if(thumb && ('bytes' in thumb)) {\n return getImageFromStrippedThumb(photo, thumb as any, useBlur);\n }\n }\n\n return null;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from './array/forEachReverse';\nimport safeAssign from './object/safeAssign';\n\nexport type ListLoaderOptions = {\n loadMore: ListLoader['loadMore'],\n loadCount?: ListLoader['loadCount'],\n loadWhenLeft?: ListLoader['loadWhenLeft'],\n processItem?: ListLoader['processItem'],\n onJump?: ListLoader['onJump'],\n onLoadedMore?: ListLoader['onLoadedMore']\n};\n\nexport type ListLoaderResult = {count: number, items: any[]};\nexport default class ListLoader {\n public current: T;\n public previous: T[] = [];\n public next: T[] = [];\n public count: number;\n public reverse = false; // reverse means next = higher msgid\n\n protected loadMore: (anchor: T, older: boolean, loadCount: number) => Promise>;\n protected processItem: (item: P) => T | Promise;\n protected loadCount = 50;\n protected loadWhenLeft = 20;\n\n public onJump: (item: T, older: boolean) => void;\n public onLoadedMore: () => void;\n\n protected loadedAllUp = false;\n protected loadedAllDown = false;\n protected loadPromiseUp: Promise;\n protected loadPromiseDown: Promise;\n\n constructor(options: ListLoaderOptions) {\n safeAssign(this, options);\n }\n\n public setTargets(previous: T[], next: T[], reverse: boolean) {\n this.previous = previous;\n this.next = next;\n this.reverse = reverse;\n }\n\n public get index() {\n return this.count !== undefined ? this.previous.length : -1;\n }\n\n /* public filter(callback: (item: T, idx: number, arr: T[]) => boolean) {\n const filter = (item: T, idx: number, arr: T[]) => {\n if(!callback(item, idx, arr)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n } */\n\n public reset(loadedAll = false) {\n this.current = undefined;\n this.previous = [];\n this.next = [];\n this.setLoaded(true, loadedAll);\n this.setLoaded(false, loadedAll);\n }\n\n public go(length: number, dispatchJump = true) {\n let items: T[], item: T;\n if(length > 0) {\n items = this.next.splice(0, length);\n item = items.pop();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.unshift(this.current);\n this.previous.push(...items);\n } else {\n items = this.previous.splice(Math.max(0, this.previous.length + length), -length);\n item = items.shift();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.push(this.current);\n this.next.unshift(...items);\n }\n\n if(this.next.length < this.loadWhenLeft) {\n this.load(!this.reverse);\n }\n\n if(this.previous.length < this.loadWhenLeft) {\n this.load(this.reverse);\n }\n\n this.current = item;\n dispatchJump && this.onJump && this.onJump(item, length > 0);\n return this.current;\n }\n\n protected unsetCurrent(toPrevious: boolean) {\n if(toPrevious) this.previous.push(this.current);\n else this.next.unshift(this.current);\n\n this.current = undefined;\n }\n\n public goUnsafe(length: number, dispatchJump?: boolean) {\n const leftLength = length > 0 ? Math.max(0, length - this.next.length) : Math.min(0, length + this.previous.length);\n const item = this.go(length, leftLength ? false : dispatchJump);\n\n /* if(length > 0 ? this.loadedAllUp : this.loadedAllDown) {\n this.unsetCurrent(length > 0);\n } */\n\n return {\n item: !leftLength ? item : undefined,\n leftLength\n };\n }\n\n protected setLoaded(down: boolean, value: boolean) {\n const isChanged = (down ? this.loadedAllDown : this.loadedAllUp) !== value;\n if(!isChanged) {\n return false;\n }\n\n if(down) this.loadedAllDown = value;\n else this.loadedAllUp = value;\n\n if(!value) {\n if(down) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n }\n\n return true;\n }\n\n // нет смысла делать проверку для reverse и loadMediaPromise\n public load(older: boolean) {\n if(older ? this.loadedAllDown : this.loadedAllUp) return Promise.resolve();\n\n let promise = older ? this.loadPromiseDown : this.loadPromiseUp;\n if(promise) return promise;\n\n let anchor: T;\n if(older) {\n anchor = this.reverse ? this.previous[0] : this.next[this.next.length - 1];\n } else {\n anchor = this.reverse ? this.next[this.next.length - 1] : this.previous[0];\n }\n\n anchor ??= this.current;\n promise = this.loadMore(anchor, older, this.loadCount).then(async(result) => {\n if((older ? this.loadPromiseDown : this.loadPromiseUp) !== promise) {\n return;\n }\n\n if(result.items.length < this.loadCount) {\n this.setLoaded(older, true);\n }\n\n if(this.count === undefined) {\n this.count = result.count || result.items.length;\n }\n\n const processedArr: (Promise | any)[] = [];\n const method = older ? result.items.forEach.bind(result.items) : forEachReverse.bind(null, result.items);\n method((item: any) => {\n const processed = this.processItem ? this.processItem(item) : item;\n\n if(!processed) return;\n processedArr.push(processed);\n });\n\n const results = await Promise.all(processedArr);\n if(older) {\n if(this.reverse) this.previous.unshift(...results);\n else this.next.push(...results);\n } else {\n if(this.reverse) this.next.push(...results);\n else this.previous.unshift(...results);\n }\n\n this.onLoadedMore && this.onLoadedMore();\n }, () => {}).then(() => {\n if(older) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n });\n\n if(older) this.loadPromiseDown = promise;\n else this.loadPromiseUp = promise;\n\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type EventListenerBase from './eventListenerBase';\n\nexport type Listener = {\n element: ListenerElement,\n event: ListenerEvent,\n callback: ListenerCallback,\n options?: ListenerOptions,\n\n onceFired?: true, // will be set only when options.once is set\n onceCallback?: () => void,\n};\n\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\nexport type ListenerEvent = string;\nexport type ListenerCallback = Function;\nexport type ListenerOptions = AddEventListenerOptions;\n\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\n console.log('nu zdarova', name);\n originalAddEventListener.call(this, name, callback, options);\n\n if(options?.ls) {\n return options.ls.addFromElement(this, name, callback as any, options);\n }\n}; */\n\nexport default class ListenerSetter {\n private listeners: Set = new Set();\n\n public add(element: T): T['addEventListener'] {\n return ((event: string, callback: Function, options: ListenerOptions) => {\n const listener: Listener = {element, event, callback, options};\n this.addManual(listener);\n return listener;\n }) as any;\n }\n\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\n const listener: Listener = {element, event, callback, options};\n this.addManual(listener);\n return listener;\n } */\n\n public addManual(listener: Listener) {\n // @ts-ignore\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\n\n if(listener.options?.once) { // remove listener when its called\n listener.onceCallback = () => {\n this.remove(listener);\n listener.onceFired = true;\n };\n\n // @ts-ignore\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\n }\n\n this.listeners.add(listener);\n }\n\n public remove(listener: Listener) {\n if(!listener.onceFired) {\n // @ts-ignore\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\n\n if(listener.onceCallback) {\n // @ts-ignore\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\n }\n }\n\n this.listeners.delete(listener);\n }\n\n public removeManual(\n element: T,\n event: ListenerEvent,\n callback: ListenerCallback,\n options?: ListenerOptions\n ) {\n let listener: Listener;\n for(const _listener of this.listeners) {\n if(_listener.element === element &&\n _listener.event === event &&\n _listener.callback === callback &&\n _listener.options === options) {\n listener = _listener;\n break;\n }\n }\n\n if(listener) {\n this.remove(listener);\n }\n }\n\n public removeAll() {\n this.listeners.forEach((listener) => {\n this.remove(listener);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport calcImageInBox from './calcImageInBox';\n\nexport class MediaSize {\n constructor(public width = 0, public height = width) {\n\n }\n\n public aspect(boxSize: MediaSize, fitted: boolean) {\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\n }\n\n public aspectFitted(boxSize: MediaSize) {\n return this.aspect(boxSize, true);\n }\n\n public aspectCovered(boxSize: MediaSize) {\n return this.aspect(boxSize, false);\n }\n}\n\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\n return new MediaSize(width, height);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport EventListenerBase from './eventListenerBase';\nimport {makeMediaSize, MediaSize} from './mediaSize';\n\ntype MediaTypeSizes = {\n regular: MediaSize,\n webpage: MediaSize,\n album: MediaSize,\n esgSticker: MediaSize,\n animatedSticker: MediaSize,\n staticSticker: MediaSize,\n emojiSticker: MediaSize,\n poll: MediaSize,\n round: MediaSize,\n documentName: MediaSize,\n invoice: MediaSize,\n extendedInvoice: MediaSize,\n customEmoji: MediaSize,\n esgCustomEmoji: MediaSize,\n emojiStatus: MediaSize,\n popupSticker: MediaSize\n};\n\nexport type MediaSizeType = keyof MediaTypeSizes;\n\nexport enum ScreenSize {\n mobile,\n medium,\n large\n}\n\nconst MOBILE_SIZE = 600;\nconst MEDIUM_SIZE = 1275;\nconst LARGE_SIZE = 1680;\n\nconst CUSTOM_EMOJI_SIZE = makeMediaSize(20, 20);\nconst ESG_CUSTOM_EMOJI_SIZE = makeMediaSize(36, 36);\nconst EMOJI_STATUS_SIZE = makeMediaSize(18, 18);\n\nclass MediaSizes extends EventListenerBase<{\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\n resize: () => void\n}> {\n private screenSizes: {key: ScreenSize, value: number}[] = [\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\n {key: ScreenSize.large, value: LARGE_SIZE}\n ];\n\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\n handhelds: {\n regular: makeMediaSize(270, 270),\n webpage: makeMediaSize(270, 200),\n album: makeMediaSize(270, 0),\n esgSticker: makeMediaSize(68, 68),\n animatedSticker: makeMediaSize(180, 180),\n staticSticker: makeMediaSize(180, 180),\n emojiSticker: makeMediaSize(112, 112),\n poll: makeMediaSize(240, 0),\n round: makeMediaSize(200, 200),\n documentName: makeMediaSize(200, 0),\n invoice: makeMediaSize(270, 270),\n extendedInvoice: makeMediaSize(270, 270),\n customEmoji: CUSTOM_EMOJI_SIZE,\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\n emojiStatus: EMOJI_STATUS_SIZE,\n popupSticker: makeMediaSize(68, 68)\n },\n desktop: {\n regular: makeMediaSize(420, 340),\n webpage: makeMediaSize(420, 340),\n album: makeMediaSize(420, 0),\n esgSticker: makeMediaSize(72, 72),\n animatedSticker: makeMediaSize(200, 200),\n staticSticker: makeMediaSize(200, 200),\n emojiSticker: makeMediaSize(112, 112),\n poll: makeMediaSize(330, 0),\n round: makeMediaSize(280, 280),\n documentName: makeMediaSize(240, 0),\n invoice: makeMediaSize(320, 320),\n extendedInvoice: makeMediaSize(420, 340),\n customEmoji: CUSTOM_EMOJI_SIZE,\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\n emojiStatus: EMOJI_STATUS_SIZE,\n popupSticker: makeMediaSize(80, 80)\n }\n };\n\n public isMobile = false;\n public active: MediaTypeSizes;\n public activeScreen: ScreenSize;\n private rAF: number;\n\n constructor() {\n super();\n\n window.addEventListener('resize', () => {\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\n this.rAF = window.requestAnimationFrame(() => {\n this.handleResize();\n this.rAF = 0;\n });\n });\n this.handleResize();\n }\n\n private handleResize = () => {\n const innerWidth = window.innerWidth;\n // this.isMobile = innerWidth <= 720;\n\n let activeScreen = this.screenSizes[0].key;\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\n if(this.screenSizes[i].value < innerWidth) {\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\n break;\n }\n }\n\n const wasScreen = this.activeScreen;\n this.activeScreen = activeScreen;\n this.isMobile = this.activeScreen === ScreenSize.mobile;\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\n\n // console.time('esg');\n // const computedStyle = window.getComputedStyle(document.documentElement);\n // this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\n // console.timeEnd('esg');\n\n if(wasScreen !== activeScreen) {\n // console.log('changeScreen', this.activeScreen, activeScreen);\n\n if(wasScreen !== undefined) {\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\n }\n }\n\n if(wasScreen !== undefined) {\n this.dispatchEvent('resize');\n }\n\n /* if(this.isMobile) {\n for(let i in this.active) {\n // @ts-ignore\n let size = this.active[i];\n size.width = innerWidth\n }\n } */\n };\n}\n\nconst mediaSizes = new MediaSizes();\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\nexport default mediaSizes;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport makeError from './makeError';\n\nconst error = makeError('MIDDLEWARE');\nexport default function middlewarePromise(middleware: () => boolean, throwWhat: any = error) {\n return (promise: T): T => {\n if(!(promise instanceof Promise)) {\n if(promise instanceof Error) {\n throw promise;\n } else {\n return promise;\n }\n }\n\n return (promise as any as Promise).then((result) => {\n if(!middleware()) {\n throw throwWhat;\n }\n\n return result;\n }) as any;\n };\n}\n","export default function clamp(v: number, min: number, max: number): number {\n return v < min ? min : ((v > max) ? max : v);\n}\n","export default function formatNumber(bytes: number, decimals = 2) {\n if(bytes === 0) return '0';\n\n const k = 1000;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['', 'K', 'M', 'B', 'T'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];\n}\n","export default function numberThousandSplitter(x: number, joiner = ' ') {\n const parts = x.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, joiner);\n return parts.join('.');\n}\n","import {IS_APPLE_MOBILE} from '../environment/userAgent';\n\nexport default function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\n return new Promise((resolve, reject) => {\n if(media.readyState >= readyState) {\n resolve();\n return;\n }\n\n const loadEventName = IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay';\n const errorEventName = 'error';\n const onLoad = () => {\n media.removeEventListener(errorEventName, onError);\n resolve();\n };\n const onError = (e: ErrorEvent) => {\n media.removeEventListener(loadEventName, onLoad);\n reject(media.error);\n };\n media.addEventListener(loadEventName, onLoad, {once: true});\n media.addEventListener(errorEventName, onError, {once: true});\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appNavigationController, {NavigationItem} from '../components/appNavigationController';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {IS_MOBILE_SAFARI} from '../environment/userAgent';\nimport cancelEvent from './dom/cancelEvent';\nimport {CLICK_EVENT_NAME} from './dom/clickEvent';\nimport findUpAsChild from './dom/findUpAsChild';\nimport EventListenerBase from './eventListenerBase';\n\nexport default class OverlayClickHandler extends EventListenerBase<{\n toggle: (open: boolean) => void\n}> {\n protected element: HTMLElement;\n protected overlay: HTMLElement;\n protected listenerOptions: AddEventListenerOptions;\n\n constructor(\n protected navigationType: NavigationItem['type'],\n protected withOverlay?: boolean\n ) {\n super(false);\n this.listenerOptions = withOverlay ? {} : {capture: true};\n }\n\n protected onClick = (e: MouseEvent | TouchEvent) => {\n if(this.element && findUpAsChild(e.target as HTMLElement, this.element)) {\n return;\n }\n\n if(this.listenerOptions?.capture) {\n cancelEvent(e);\n }\n\n this.close();\n };\n\n public close() {\n if(this.element) {\n this.overlay?.remove();\n this.element = undefined;\n this.dispatchEvent('toggle', false);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n // window.removeEventListener('keydown', onKeyDown, {capture: true});\n window.removeEventListener('contextmenu', this.onClick, this.listenerOptions);\n }\n\n document.removeEventListener(CLICK_EVENT_NAME, this.onClick, this.listenerOptions);\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n public open(element: HTMLElement) {\n this.close();\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: (canAnimate) => {\n this.close();\n }\n });\n }\n\n this.element = element;\n\n if(!this.overlay && this.withOverlay) {\n this.overlay = document.createElement('div');\n this.overlay.classList.add('btn-menu-overlay');\n\n // ! because this event must be canceled, and can't cancel on menu click (below)\n this.overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n this.onClick(e);\n });\n }\n\n this.overlay && this.element.parentElement.insertBefore(this.overlay, this.element);\n\n // document.body.classList.add('disable-hover');\n\n if(!IS_TOUCH_SUPPORTED) {\n // window.addEventListener('keydown', onKeyDown, {capture: true});\n window.addEventListener('contextmenu', this.onClick, {...this.listenerOptions, once: true});\n }\n\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n onClick(e);\n }); */\n\n // ! safari iOS doesn't handle window click event on overlay, idk why\n document.addEventListener(CLICK_EVENT_NAME, this.onClick, this.listenerOptions);\n\n this.dispatchEvent('toggle', true);\n }\n}\n","import Currencies from '../config/currencies';\n\n// https://stackoverflow.com/a/34141813\nfunction number_format(number: any, decimals: any, dec_point: any, thousands_sep: any): string {\n // Strip all characters but numerical ones.\n number = (number + '').replace(/[^0-9+\\-Ee.]/g, '');\n var n = !isFinite(+number) ? 0 : +number,\n prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),\n sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,\n dec = (typeof dec_point === 'undefined') ? '.' : dec_point,\n s: any = '',\n toFixedFix = function(n: number, prec: number) {\n var k = Math.pow(10, prec);\n return '' + Math.round(n * k) / k;\n };\n // Fix for IE parseFloat(0.55).toFixed(0) = 0;\n s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');\n if(s[0].length > 3) {\n s[0] = s[0].replace(/\\B(?=(?:\\d{3})+(?!\\d))/g, sep);\n }\n if((s[1] || '').length < prec) {\n s[1] = s[1] || '';\n s[1] += new Array(prec - s[1].length + 1).join('0');\n }\n return s.join(dec);\n}\n\nexport default function paymentsWrapCurrencyAmount(amount: number | string, currency: string, skipSymbol?: boolean) {\n amount = +amount;\n\n const isNegative = amount < 0;\n\n const currencyData = Currencies[currency];\n if(!currencyData) {\n throw new Error('CURRENCY_WRAP_INVALID');\n }\n\n const amountExp = amount / Math.pow(10, currencyData.exp);\n\n let decimals = currencyData.exp;\n if(currency == 'IRR' && Math.floor(amountExp) == amountExp) {\n decimals = 0; // у иранцев копейки почти всегда = 0 и не показываются в UI\n }\n\n let formatted = number_format(amountExp, decimals, currencyData.decimal_sep, currencyData.thousands_sep);\n if(skipSymbol) {\n return formatted;\n }\n\n let symbol = currencyData.symbol;\n if(isNegative && !currencyData.space_between && currencyData.symbol_left) {\n symbol = '-' + symbol;\n formatted = formatted.replace('-', '');\n }\n\n let out: string;\n const splitter = currencyData.space_between ? ' ' : '';\n if(currencyData.symbol_left) {\n out = symbol + splitter + formatted;\n } else {\n out = formatted + splitter + symbol;\n }\n return out;\n}\n\n(window as any).p = paymentsWrapCurrencyAmount;\n\n// function paymentsGetCurrencyExp($currency: string) {\n// if($currency == 'CLF') {\n// return 4;\n// }\n// if(['BHD','IQD','JOD','KWD','LYD','OMR','TND'].includes($currency)) {\n// return 3;\n// }\n// if(['BIF','BYR','CLP','CVE','DJF','GNF','ISK','JPY','KMF','KRW','MGA', 'PYG','RWF','UGX','UYI','VND','VUV','XAF','XOF','XPF'].includes($currency)) {\n// return 0;\n// }\n// if($currency == 'MRO') {\n// return 1;\n// }\n// return 2;\n// }\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport mediaSizes from './mediaSizes';\n\nexport type MenuPositionPadding = {\n top?: number,\n right?: number,\n bottom?: number,\n left?: number\n};\n\nconst PADDING_TOP = 8;\nconst PADDING_BOTTOM = PADDING_TOP;\nconst PADDING_LEFT = 8;\nconst PADDING_RIGHT = PADDING_LEFT;\nexport default function positionMenu(e: MouseEvent | Touch | TouchEvent, elem: HTMLElement, side?: 'left' | 'right' | 'center', additionalPadding?: MenuPositionPadding) {\n if((e as TouchEvent).touches) {\n e = (e as TouchEvent).touches[0];\n }\n\n const {pageX, pageY} = e as Touch;\n // let {clientX, clientY} = e;\n\n // * side mean the OPEN side\n\n const getScrollWidthFromElement = (Array.from(elem.children) as HTMLElement[]).find((element) => element.classList.contains('btn-menu-item') && !element.classList.contains('hide')) || elem;\n\n let {scrollWidth: menuWidth} = getScrollWidthFromElement;\n const {scrollHeight: menuHeight} = elem;\n // let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\n const rect = document.body.getBoundingClientRect();\n const windowWidth = rect.width;\n const windowHeight = rect.height;\n\n menuWidth += getScrollWidthFromElement.offsetLeft * 2;\n\n let paddingTop = PADDING_TOP, paddingRight = PADDING_RIGHT, paddingBottom = PADDING_BOTTOM, paddingLeft = PADDING_LEFT;\n if(additionalPadding) {\n if(additionalPadding.top) paddingTop += additionalPadding.top;\n if(additionalPadding.right) paddingRight += additionalPadding.right;\n if(additionalPadding.bottom) paddingBottom += additionalPadding.bottom;\n if(additionalPadding.left) paddingLeft += additionalPadding.left;\n }\n\n side = mediaSizes.isMobile ? 'right' : 'left';\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\n\n const maxTop = windowHeight - menuHeight - paddingBottom;\n const maxLeft = windowWidth - menuWidth - paddingRight;\n const minTop = paddingTop;\n const minLeft = paddingLeft;\n\n const getSides = () => {\n return {\n x: {\n left: pageX,\n right: Math.min(maxLeft, pageX - menuWidth)\n },\n intermediateX: side === 'right' ? minLeft : maxLeft,\n // intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\n y: {\n top: pageY,\n bottom: pageY - menuHeight\n },\n // intermediateY: verticalSide === 'top' ? paddingTop : windowHeight - menuHeight - paddingTop,\n // intermediateY: pageY < (windowHeight / 2) ? paddingTop : windowHeight - menuHeight - paddingBottom,\n intermediateY: maxTop\n };\n };\n\n const sides = getSides();\n\n const possibleSides = {\n x: {\n left: (sides.x.left + menuWidth + paddingRight) <= windowWidth,\n right: sides.x.right >= paddingLeft\n },\n y: {\n top: (sides.y.top + menuHeight + paddingBottom) <= windowHeight,\n bottom: (sides.y.bottom - paddingBottom) >= paddingBottom\n }\n };\n\n /* if(side === undefined) {\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\n side = 'right';\n }\n } */\n\n {\n /* const x = sides.x;\n\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\n if(side) {\n s.findAndSplice((s) => s === side);\n s.unshift(side);\n }\n\n const possibleSide = s.find((s) => possibleSides.x[s]); */\n // let left: number;\n /* if(possibleSide) {\n left = x[possibleSide];\n side = possibleSide;\n } else {\n left = sides.intermediateX;\n side = undefined;\n } */\n const left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\n\n elem.style.left = left + 'px';\n }\n\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\n verticalSide = 'bottom';\n } else {\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\n verticalSide = 'top';\n } */\n\n {\n const top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\n\n elem.style.top = top + 'px';\n }\n\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\n elem.classList.add(\n // (verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\n (verticalSide === 'center' ? verticalSide : 'bottom') +\n '-' +\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\n\n return {\n width: menuWidth,\n height: menuHeight\n };\n}\n","import {RestrictionReason} from '../layer';\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach((reason) => {\n ignore.add(reason);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport rootScope from '../lib/rootScope';\n\nconst savingLottiePreview: {[docId: DocId]: {width: number, height: number}} = {};\n\nexport function isSavingLottiePreview(doc: MyDocument, toneIndex: number, width: number, height: number) {\n const key = doc.id + '-' + toneIndex;\n const saving = savingLottiePreview[key];\n return saving && saving.width >= width && saving.height >= height;\n}\n\nexport async function saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n const {width, height} = canvas;\n if(isSavingLottiePreview(doc, toneIndex, width, height)) {\n return;\n }\n\n const saving = savingLottiePreview[key] = {\n width,\n height\n };\n\n const thumb = await rootScope.managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex);\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n const promise = new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob));\n });\n\n const blob = await promise;\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n // console.log('got lottie preview', doc, blob, URL.createObjectURL(blob));\n\n rootScope.managers.appDocsManager.saveLottiePreview(doc.id, blob, width, height, toneIndex);\n\n // delete savingLottiePreview[key];\n\n /* const reader = new FileReader();\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n const thumb: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: uint8,\n type: 'i'\n };\n\n doc.stickerSavedThumbWidth = canvas.width;\n doc.stickerSavedThumbHeight = canvas.width;\n\n defineNotNumerableProperties(thumb, ['url']);\n thumb.url = URL.createObjectURL(blob);\n doc.thumbs.findAndSplice((t) => t._ === thumb._);\n doc.thumbs.unshift(thumb);\n\n if(!webpWorkerController.isWebpSupported()) {\n doc.pFlags.stickerThumbConverted = true;\n }\n\n delete this.savingLottiePreview[doc.id];\n };\n reader.readAsArrayBuffer(blob); */\n}\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\nimport {fastRaf} from '../schedulers';\nimport throttleWith from './throttleWith';\n\nexport default function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\n\nexport default function throttleWith(schedulerFn: AnyToVoidFunction, 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport safeAssign from './object/safeAssign';\n\nexport default class ScrollableLoader {\n public loading = false;\n private scrollable: Scrollable;\n private getPromise: () => Promise;\n private promise: Promise;\n private loaded = false;\n\n constructor(options: {\n scrollable: ScrollableLoader['scrollable'],\n getPromise: ScrollableLoader['getPromise']\n }) {\n safeAssign(this, options);\n\n options.scrollable.onScrolledBottom = () => {\n this.load();\n };\n }\n\n public load() {\n if(this.loaded) {\n return Promise.resolve();\n }\n\n if(this.loading) {\n return this.promise;\n }\n\n this.loading = true;\n this.promise = this.getPromise().then((done) => {\n this.loading = false;\n this.promise = undefined;\n\n if(done) {\n this.loaded = true;\n this.scrollable.onScrolledBottom = null;\n } else {\n this.scrollable.checkForTriggers();\n }\n }, () => {\n this.promise = undefined;\n this.loading = false;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MediaSearchContext} from '../components/appMediaPlaybackController';\nimport type {SearchSuperContext} from '../components/appSearchSuper.';\nimport type {Message} from '../layer';\nimport type {MessagesStorageKey, MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport incrementMessageId from '../lib/appManagers/utils/messageId/incrementMessageId';\nimport rootScope from '../lib/rootScope';\nimport forEachReverse from './array/forEachReverse';\nimport filterChatPhotosMessages from './filterChatPhotosMessages';\nimport ListLoader, {ListLoaderOptions} from './listLoader';\n\nexport default class SearchListLoader extends ListLoader {\n public searchContext: MediaSearchContext;\n public onEmptied: () => void;\n\n private otherSideLoader: SearchListLoader;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {\n onEmptied?: () => void,\n isInner?: boolean,\n managers?: AppManagers\n } = {}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n const backLimit = older ? 0 : loadCount;\n let maxId = anchor?.mid;\n\n if(maxId === undefined) maxId = this.searchContext.maxId;\n if(!older) maxId = incrementMessageId(maxId, 1);\n\n return this.managers.appMessagesManager.getSearch({\n ...this.searchContext,\n peerId: this.searchContext.peerId || anchor?.peerId,\n maxId,\n limit: backLimit ? 0 : loadCount,\n backLimit\n }).then((value) => {\n /* if(DEBUG) {\n this.log('loaded more media by maxId:', maxId, value, older, this.reverse);\n } */\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n filterChatPhotosMessages(value);\n }\n\n if(value.next_rate) {\n this.searchContext.nextRate = value.next_rate;\n }\n\n return {count: value.count, items: value.history};\n });\n },\n processItem: async(message) => {\n const filtered = await this.filterMids([message.mid]);\n if(!filtered.length) {\n return;\n }\n\n return options.processItem(message);\n }\n });\n\n this.managers ??= rootScope.managers;\n rootScope.addEventListener('history_delete', this.onHistoryDelete);\n rootScope.addEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.addEventListener('message_sent', this.onMessageSent);\n\n if(!options.isInner) {\n this.otherSideLoader = new SearchListLoader({\n ...options,\n isInner: true\n });\n\n // this.otherSideLoader.onLoadedMore = () => {\n\n // };\n }\n }\n\n protected async filterMids(mids: number[]) {\n const storageKey: MessagesStorageKey = `${this.searchContext.peerId}_${this.searchContext.isScheduled ? 'scheduled' : 'history'}`;\n const filtered = (await this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._, mids, storageKey, mids.length)) as Message.message[];\n return filtered;\n }\n\n protected onHistoryDelete = ({peerId, msgs}: {peerId: PeerId, msgs: Set}) => {\n const shouldBeDeleted = (item: Item) => item.peerId === peerId && msgs.has(item.mid);\n const filter = (item: Item, idx: number, arr: Item[]) => {\n if(shouldBeDeleted(item)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n\n if(this.current && shouldBeDeleted(this.current)) {\n this.current = undefined;\n /* if(this.go(1)) {\n this.previous.splice(this.previous.length - 1, 1);\n } else if(this.go(-1)) {\n this.next.splice(0, 1);\n } else */if(this.onEmptied) {\n this.onEmptied();\n }\n }\n };\n\n protected onHistoryMultiappend = async(message: Message.message | Message.messageService) => {\n if(this.searchContext.folderId !== undefined) {\n return;\n }\n\n // because it's reversed\n if(!this.loadedAllUp || this.loadPromiseUp) {\n return;\n }\n\n if(message.peerId !== this.searchContext.peerId) {\n return;\n }\n\n const filtered = await this.filterMids([message.mid]);\n const targets = (await Promise.all(filtered.map((message) => this.processItem(message)))).filter(Boolean);\n if(targets.length) {\n /* const {previous, current, next} = this;\n const targets = previous.concat(current, next);\n const currentIdx = targets.length;\n const mid = targets[0].mid;\n let i = 0, length = targets.length;\n for(; i < length; ++i) {\n const target = targets[i];\n if(!target || mid < target.mid) {\n break;\n }\n }\n\n if(i < currentIdx) previous.push(...targets);\n else next. */\n\n if(!this.current) {\n this.previous.push(...targets);\n } else {\n this.next.push(...targets);\n }\n }\n };\n\n protected onMessageSent = ({message}: {message: MyMessage}) => {\n this.onHistoryMultiappend(message);\n };\n\n public setSearchContext(context: SearchSuperContext) {\n this.searchContext = context;\n\n if(this.searchContext.folderId !== undefined) {\n this.loadedAllUp = true;\n\n if(this.searchContext.nextRate === undefined) {\n this.loadedAllDown = true;\n }\n }\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n this.loadedAllUp = true;\n }\n\n if(this.searchContext.useSearch === false) {\n this.loadedAllDown = this.loadedAllUp = true;\n }\n\n if(this.otherSideLoader) {\n this.otherSideLoader.setSearchContext(context);\n }\n }\n\n public reset() {\n super.reset();\n this.searchContext = undefined;\n\n if(this.otherSideLoader) {\n this.otherSideLoader.reset();\n }\n }\n\n public getPrevious(withOtherSide?: boolean) {\n let previous = this.previous;\n\n if(this.otherSideLoader && withOtherSide) {\n previous = previous.concat(this.otherSideLoader.previous);\n }\n\n return previous;\n }\n\n public getNext(withOtherSide?: boolean) {\n let next = this.next;\n\n if(this.otherSideLoader && withOtherSide) {\n next = next.concat(this.otherSideLoader.next);\n }\n\n return next;\n }\n\n public getCurrent() {\n return this.current || this.otherSideLoader?.current;\n }\n\n private goToOtherEnd(length: number) {\n if(length > 0) return this.go(-this.previous.length);\n else return this.go(this.next.length);\n }\n\n public goRound(length: number, dispatchJump?: boolean) {\n let ret: ReturnType['goUnsafe']>;\n\n if(this.otherSideLoader?.current) {\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n if(ret.item) {\n return ret.item;\n }\n\n length = ret.leftLength;\n if(!(length > 0 ? this.otherSideLoader.next : this.otherSideLoader.previous).length) {\n const loaded = length > 0 ? this.otherSideLoader.loadedAllUp : this.otherSideLoader.loadedAllDown;\n if(!loaded) { // do not reset anything until it's loaded\n return;\n }\n\n // if other side is loaded too will start from its begin\n if((length > 0 && (this.otherSideLoader.searchContext.maxId === 1 || this.otherSideLoader.loadedAllDown)) ||\n (length < 0 && (this.otherSideLoader.searchContext.maxId === 0 || this.otherSideLoader.loadedAllUp))) {\n return this.otherSideLoader.goToOtherEnd(length);\n }\n\n this.otherSideLoader.unsetCurrent(length > 0);\n }\n }\n\n ret = this.goUnsafe(length, dispatchJump);\n if(!ret.item) {\n if(this.loadedAllUp && this.loadedAllDown) { // just use the same loader if the list is too short\n return this.goToOtherEnd(length);\n } else if(this.otherSideLoader) {\n length = ret.leftLength;\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n\n if(ret.item) {\n this.unsetCurrent(length > 0);\n }\n }\n }\n\n return ret?.item;\n }\n\n // public setTargets(previous: Item[], next: Item[], reverse: boolean) {\n // super.setTargets(previous, next, reverse);\n // }\n\n protected setLoaded(down: boolean, value: boolean) {\n const changed = super.setLoaded(down, value);\n\n if(changed &&\n this.otherSideLoader &&\n value &&\n this.searchContext?.useSearch !== false/* &&\n (this.reverse ? this.loadedAllUp : this.loadedAllDown) */) {\n const reverse = this.loadedAllUp;\n this.otherSideLoader.setSearchContext({\n ...this.searchContext,\n maxId: reverse ? 1 : 0\n });\n\n // these 'reverse' are different, not a mistake here.\n this.otherSideLoader.reverse = this.reverse;\n this.otherSideLoader.setLoaded(reverse, true);\n this.otherSideLoader.load(!reverse);\n }\n\n return changed;\n }\n\n public cleanup() {\n this.reset();\n rootScope.removeEventListener('history_delete', this.onHistoryDelete);\n rootScope.removeEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.removeEventListener('message_sent', this.onMessageSent);\n this.onEmptied = undefined;\n\n if(this.otherSideLoader) {\n this.otherSideLoader.cleanup();\n this.otherSideLoader = undefined;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport generateMessageId from './generateMessageId';\nimport getServerMessageId from './getServerMessageId';\n\nexport default function incrementMessageId(messageId: number, increment: number) {\n return generateMessageId(getServerMessageId(messageId) + increment);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {fastRaf} from './schedulers';\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport isInDOM from './dom/isInDOM';\n\nclass SequentialDom {\n private promises: Partial<{\n read: CancellablePromise,\n write: CancellablePromise\n }> = {};\n private raf = fastRaf.bind(null);\n private scheduled = false;\n\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\n let promise = this.promises[kind];\n if(!promise) {\n this.scheduleFlush();\n promise = this.promises[kind] = deferredPromise();\n }\n\n if(callback !== undefined) {\n promise.then(() => callback());\n }\n\n return promise;\n }\n\n public measure(callback?: VoidFunction) {\n return this.do('read', callback);\n }\n\n public mutate(callback?: VoidFunction) {\n return this.do('write', callback);\n }\n\n /**\n * Will fire instantly if element is not connected\n * @param element\n * @param callback\n */\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\n const isConnected = isInDOM(element);\n const promise = isConnected ? this.mutate() : Promise.resolve();\n\n if(callback !== undefined) {\n if(!isConnected) {\n callback();\n } else {\n promise.then(() => callback());\n }\n }\n\n return promise;\n }\n\n private scheduleFlush() {\n if(!this.scheduled) {\n this.scheduled = true;\n\n this.raf(() => {\n this.promises.read && this.promises.read.resolve();\n this.promises.write && this.promises.write.resolve();\n\n this.scheduled = false;\n this.promises = {};\n });\n }\n }\n}\n\nconst sequentialDom = new SequentialDom();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\nexport default sequentialDom;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PhotoSize, WebDocument} from '../layer';\nimport {REPLIES_HIDDEN_CHANNEL_ID} from '../lib/mtproto/mtproto_config';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport {MediaSize, makeMediaSize} from './mediaSize';\nimport isWebDocument from '../lib/appManagers/utils/webDocs/isWebDocument';\n\nexport default function setAttachmentSize(\n photo: MyPhoto | MyDocument | WebDocument,\n element: HTMLElement | SVGForeignObjectElement,\n boxWidth: number,\n boxHeight: number,\n noZoom = true,\n message?: any,\n pushDocumentSize?: boolean,\n photoSize?: ReturnType\n) {\n const _isWebDocument = isWebDocument(photo);\n // if(_isWebDocument && pushDocumentSize === undefined) {\n // pushDocumentSize = true;\n // }\n\n if(!photoSize) {\n photoSize = choosePhotoSize(photo, boxWidth, boxHeight, undefined, pushDocumentSize);\n }\n // console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div);\n\n let size: MediaSize;\n const isDocument = photo._ === 'document';\n if(isDocument || _isWebDocument) {\n size = makeMediaSize(photo.w || (photoSize as PhotoSize.photoSize).w || 512, photo.h || (photoSize as PhotoSize.photoSize).h || 512);\n } else {\n size = makeMediaSize((photoSize as PhotoSize.photoSize).w || 100, (photoSize as PhotoSize.photoSize).h || 100);\n }\n\n let boxSize = makeMediaSize(boxWidth, boxHeight);\n\n boxSize = size = size.aspect(boxSize, noZoom);\n\n let isFit = true;\n\n if(!isDocument || ['video', 'gif'].includes(photo.type) || _isWebDocument) {\n if(boxSize.width < 200 && boxSize.height < 200) { // make at least one side this big\n boxSize = size = size.aspectCovered(makeMediaSize(200, 200));\n }\n\n if(message &&\n (message.message ||\n message.reply_to_mid ||\n message.media.webpage ||\n (message.replies && message.replies.pFlags.comments && message.replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)\n )\n ) { // make sure that bubble block is human-readable\n if(boxSize.width < 320) {\n boxSize = makeMediaSize(320, boxSize.height);\n isFit = false;\n }\n }\n\n if(isFit && boxSize.width < 120 && message) { // if image is too narrow\n boxSize = makeMediaSize(120, boxSize.height);\n isFit = false;\n }\n }\n\n // if(element instanceof SVGForeignObjectElement) {\n // element.setAttributeNS(null, 'width', '' + w);\n // element.setAttributeNS(null, 'height', '' + h);\n\n // //console.log('set dimensions to svg element:', element, w, h);\n // } else {\n element.style.width = boxSize.width + 'px';\n element.style.height = boxSize.height + 'px';\n // }\n\n return {photoSize, size, isFit};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {logger} from '../lib/logger';\nimport insertInDescendSortedArray from './array/insertInDescendSortedArray';\nimport {getMiddleware, MiddlewareHelper} from './middleware';\nimport middlewarePromise from './middlewarePromise';\nimport safeAssign from './object/safeAssign';\nimport pause from './schedulers/pause';\n\nexport type SortedElementBase = {\n id: T,\n index: number\n};\n\nlet id = 0;\n\nexport class BatchProcessor {\n protected queue: Promise[];\n protected promise: Promise;\n\n protected middlewareHelper: MiddlewareHelper;\n protected log: ReturnType;\n\n protected process: (batch: Item[], m: ReturnType, log: BatchProcessor['log']) => Promise;\n protected possibleError: any;\n\n constructor(options: {\n log?: BatchProcessor['log'],\n // middleware: MiddlewareHelper,\n process: BatchProcessor['process'],\n possibleError?: BatchProcessor['possibleError']\n }) {\n safeAssign(this, options);\n\n this.queue = [];\n this.middlewareHelper ??= getMiddleware();\n\n const prefix = 'BATCH-PROCESSOR-' + ++id;\n if(this.log) {\n this.log = this.log.bindPrefix(prefix);\n } else {\n this.log = logger(prefix);\n }\n }\n\n public get queuePromise() {\n return this.promise;\n }\n\n public clear() {\n this.log('clear');\n this.queue.length = 0;\n this.promise = undefined;\n this.middlewareHelper.clean();\n }\n\n public addToQueue(item: BatchProcessor['queue'][0]) {\n this.queue.push(item);\n return this.setQueue();\n }\n\n protected setQueue() {\n if(!this.queue.length) {\n return Promise.resolve();\n }\n\n if(this.promise) {\n return this.promise;\n }\n\n const middleware = this.middlewareHelper.get();\n const log = this.log.bindPrefix('queue');\n const m = middlewarePromise(middleware, this.possibleError);\n\n const processQueue = async(): Promise => {\n log('start', this.queue.length);\n\n const queue = this.queue.splice(0, this.queue.length);\n\n const perf = performance.now();\n const promises = queue.map((promise) => {\n promise.then((details) => {\n log('render item time', performance.now() - perf, details);\n });\n\n return promise;\n });\n\n const renderedQueue = await m(Promise.all(promises));\n await m(this.process(renderedQueue, m, log));\n\n log('queue rendered');\n\n if(this.queue.length) {\n log('have new items to render');\n return processQueue();\n } else {\n log('end');\n }\n };\n\n log('setting pause');\n const promise = this.promise = m(pause(0))\n .then(\n () => processQueue().catch((err: ApiError) => {\n if(err !== this.possibleError) {\n log.error('process queue error', err);\n }\n\n throw err;\n }),\n (err) => {\n log('pause has been cleared');\n throw err;\n }\n )\n .finally(() => {\n if(this.promise === promise) {\n this.promise = undefined;\n }\n });\n\n return promise;\n }\n}\n\nexport default class SortedList {\n protected elements: Map;\n protected sorted: Array;\n\n protected getIndex: (element: SortedElement) => PromiseLike | number;\n protected onDelete: (element: SortedElement) => void;\n protected onUpdate: (element: SortedElement) => void;\n protected onSort: (element: SortedElement, idx: number) => void;\n protected onElementCreate: (base: SortedElementBase) => PromiseLike | SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware: MiddlewareHelper;\n\n protected batchProcessor: BatchProcessor;\n\n protected log: ReturnType;\n\n constructor(options: {\n getIndex: SortedList['getIndex'],\n onDelete?: SortedList['onDelete'],\n onUpdate?: SortedList['onUpdate'],\n onSort?: SortedList['onSort'],\n onElementCreate: SortedList['onElementCreate'],\n\n updateElementWith?: SortedList['updateElementWith'],\n updateListWith?: SortedList['updateListWith'],\n\n log?: SortedList['log']\n }) {\n safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n this.middleware = getMiddleware();\n\n this.batchProcessor = new BatchProcessor({\n log: this.log,\n process: async(batch, m, log) => {\n // const elements = await Promise.all(batch.map((element) => this.onElementCreate(element)));\n const elements = batch;\n const promises = elements.map((element) => this.update(element.id, element));\n await m(Promise.all(promises));\n }\n });\n }\n\n public clear() {\n this.batchProcessor.clear();\n this.middleware.clean();\n this.elements.clear();\n this.sorted.length = 0;\n }\n\n protected _updateList() {\n this.elements.forEach((element) => {\n this.update(element.id);\n });\n\n if(this.onSort) {\n this.sorted.forEach((element, idx) => {\n this.onSort(element, idx);\n });\n }\n }\n\n public updateList(callback?: (updated: boolean) => void) {\n const middleware = this.middleware.get();\n this.updateListWith((canUpdate) => {\n if(!middleware() || (canUpdate !== undefined && !canUpdate)) {\n callback?.(false);\n return;\n }\n\n this._updateList();\n\n callback?.(true);\n });\n }\n\n public has(id: SortedElementId) {\n return this.elements.has(id);\n }\n\n public get(id: SortedElementId) {\n return this.elements.get(id);\n }\n\n public getAll() {\n return this.elements;\n }\n\n public async add(id: SortedElementId) {\n const element = this.get(id);\n if(element) {\n return;\n // return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n this.elements.set(id, base as SortedElement);\n const createPromise = Promise.resolve(this.onElementCreate(base));\n return this.batchProcessor.addToQueue(createPromise);\n\n // return element;\n }\n\n public delete(id: SortedElementId, noScheduler?: boolean) {\n const element = this.elements.get(id);\n if(!element) {\n return false;\n }\n\n this.elements.delete(id);\n\n const idx = this.sorted.indexOf(element);\n if(idx !== -1) {\n this.sorted.splice(idx, 1);\n }\n\n if(this.onDelete) {\n if(noScheduler) {\n this.onDelete(element);\n } else {\n const middleware = this.middleware.get();\n this.updateElementWith(() => {\n if(!middleware()) {\n return;\n }\n\n this.onDelete(element);\n });\n }\n }\n\n return true;\n }\n\n public async update(id: SortedElementId, element = this.get(id)) {\n if(!element) {\n return;\n }\n\n element.index = await this.getIndex(element);\n if(this.get(id) !== element) {\n return;\n }\n\n this.onUpdate?.(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n this.onSort(element, idx);\n }\n}\n","const BOM = '';\n// const BOM = 'K';\nexport default BOM;\n","export default function encodeEntities(value: string) {\n return value.replace(/&/g, '&').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, (value) => {\n const hi = value.charCodeAt(0);\n const low = value.charCodeAt(1);\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n }).replace(/([^\\#-~| |!])/g, (value) => { // non-alphanumeric\n return '&#' + value.charCodeAt(0) + ';';\n }).replace(//g, '>');\n}\n","// credits to https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js\nexport default function escapeRegExp(str: string) {\n return str\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n .replace(/-/g, '\\\\x2d');\n}\n","export default function limitSymbols(str: string, length: number, limitFrom = length + 10) {\n str = str.trim();\n if(str.length > limitFrom) {\n str = str.slice(0, length)/* .replace(/\\s*$/, '') */ + '...';\n }\n\n return str;\n}\n","export default function toHHMMSS(str: string | number, leadZero = false) {\n const sec_num = parseInt(str + '', 10);\n const hours = Math.floor(sec_num / 3600);\n let minutes: any = Math.floor((sec_num - (hours * 3600)) / 60);\n let seconds: any = sec_num - (hours * 3600) - (minutes * 60);\n\n if(hours) leadZero = true;\n if(minutes < 10) minutes = leadZero ? '0' + minutes : minutes;\n if(seconds < 10) seconds = '0' + seconds;\n return (hours ? /* ('0' + hours).slice(-2) */hours + ':' : '') + minutes + ':' + seconds;\n}\n","export default function textToSvgURL(text: string) {\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\n\n // * because iOS Safari doesn't want to eat objectURL\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n resolve(e.target.result as string);\n };\n reader.readAsDataURL(blob);\n });\n // return URL.createObjectURL(blob);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_WORKER} from './context';\n\nexport class WindowSize {\n public width: number;\n public height: number;\n\n constructor() {\n if(IS_WORKER) {\n return;\n }\n\n // @ts-ignore\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\n const set = () => {\n this.width = w.width || w.innerWidth;\n this.height = w.height || w.innerHeight;\n };\n w.addEventListener('resize', set);\n set();\n }\n}\n\nconst windowSize = new WindowSize();\nexport default windowSize;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\n\nimport {AnyToVoidFunction} from '../types';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport DEBUG from '../config/debug';\nimport pause from '../helpers/schedulers/pause';\nimport EventListenerBase from '../helpers/eventListenerBase';\n\nconst eventListener = new EventListenerBase<{\n start: () => void,\n end: () => void\n}>();\nconst ANIMATION_START_EVENT = 'start';\nconst ANIMATION_END_EVENT = 'end';\n\nlet isAnimating = false;\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\nlet promisesInQueue = 0;\n\nheavyAnimationPromise.resolve();\n\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\n\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\n if(!isAnimating) {\n heavyAnimationPromise = deferredPromise();\n eventListener.dispatchEvent(ANIMATION_START_EVENT);\n isAnimating = true;\n DEBUG && log('start');\n }\n\n ++promisesInQueue;\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\n\n const promises = [\n timeout !== undefined ? pause(timeout) : undefined,\n promise.finally(() => {})\n ].filter(Boolean);\n\n const perf = performance.now();\n const _heavyAnimationPromise = heavyAnimationPromise;\n Promise.race(promises).then(() => {\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\n return;\n }\n\n --promisesInQueue;\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\n if(promisesInQueue <= 0) {\n onHeavyAnimationEnd();\n }\n });\n\n return heavyAnimationPromise;\n}\n\n(window as any).dispatchHeavyAnimationEvent = dispatchHeavyAnimationEvent;\n\nfunction onHeavyAnimationEnd() {\n if(heavyAnimationPromise.isFulfilled) {\n return;\n }\n\n isAnimating = false;\n promisesInQueue = 0;\n eventListener.dispatchEvent(ANIMATION_END_EVENT);\n heavyAnimationPromise.resolve();\n\n DEBUG && log('end');\n}\n\nexport function interruptHeavyAnimation() {\n onHeavyAnimationEnd();\n}\n\nexport function getHeavyAnimationPromise() {\n return heavyAnimationPromise;\n}\n\nexport default function(\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n listenerSetter?: ListenerSetter\n) {\n // useEffect(() => {\n if(isAnimating) {\n handleAnimationStart();\n }\n\n const add = listenerSetter ? listenerSetter.add(eventListener) : eventListener.addEventListener.bind(eventListener);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, eventListener) : eventListener.removeEventListener.bind(eventListener);\n add(ANIMATION_START_EVENT, handleAnimationStart);\n add(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\n remove(ANIMATION_START_EVENT, handleAnimationStart);\n };\n // }, [handleAnimationEnd, handleAnimationStart]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Dialog} from '../lib/appManagers/appMessagesManager';\nimport type {ApiLimitType} from '../lib/mtproto/api_methods';\nimport type {ForumTopic} from '../layer';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport rootScope from '../lib/rootScope';\nimport {ButtonMenuItemOptionsVerifiable, ButtonMenuSync} from './buttonMenu';\nimport PopupDeleteDialog from './popups/deleteDialog';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport {toastNew} from './toast';\nimport PopupMute from './popups/mute';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport positionMenu from '../helpers/positionMenu';\nimport contextMenuController from '../helpers/contextMenuController';\nimport {GENERAL_TOPIC_ID} from '../lib/mtproto/mtproto_config';\nimport showLimitPopup from './popups/limit';\n\nexport default class DialogsContextMenu {\n private element: HTMLElement;\n private buttons: ButtonMenuItemOptionsVerifiable[];\n\n private peerId: PeerId;\n private filterId: number;\n private threadId: number;\n private dialog: Dialog | ForumTopic.forumTopic;\n private canManageTopics: boolean;\n\n constructor(private managers: AppManagers) {\n\n }\n\n private init() {\n this.buttons = [{\n icon: 'unread',\n text: 'MarkAsUnread',\n onClick: this.onUnreadClick,\n verify: async() => !this.threadId && !(await this.managers.appMessagesManager.isDialogUnread(this.dialog))\n }, {\n icon: 'readchats',\n text: 'MarkAsRead',\n onClick: this.onUnreadClick,\n verify: () => this.managers.appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'pin',\n text: 'ChatList.Context.Pin',\n onClick: this.onPinClick,\n verify: async() => {\n if(this.threadId && !this.canManageTopics) {\n return false;\n }\n\n const isPinned = this.filterId !== undefined && this.filterId > 1 ?\n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) :\n !!this.dialog.pFlags?.pinned;\n return !isPinned;\n }\n }, {\n icon: 'unpin',\n text: 'ChatList.Context.Unpin',\n onClick: this.onPinClick,\n verify: async() => {\n if(this.threadId && !this.canManageTopics) {\n return false;\n }\n\n const isPinned = this.filterId !== undefined && this.filterId > 1 ?\n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) :\n !!this.dialog.pFlags?.pinned;\n return isPinned;\n }\n }, {\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: async() => {\n return this.peerId !== rootScope.myId && !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.dialog.peerId, threadId: this.threadId}));\n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: async() => {\n return this.peerId !== rootScope.myId && (await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.dialog.peerId, threadId: this.threadId}));\n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.peerId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.peerId !== rootScope.myId\n }, {\n icon: 'hide',\n text: 'Hide',\n onClick: this.hideTopic,\n verify: async() => {\n return this.canManageTopics && (this.dialog as ForumTopic.forumTopic).id === GENERAL_TOPIC_ID;\n }\n }, {\n icon: 'lock',\n text: 'CloseTopic',\n onClick: this.toggleTopic,\n verify: () => {\n return this.canManageTopics && !(this.dialog as ForumTopic.forumTopic).pFlags.closed;\n }\n }, {\n icon: 'lockoff',\n text: 'RestartTopic',\n onClick: this.toggleTopic,\n verify: () => {\n return this.canManageTopics && !!(this.dialog as ForumTopic.forumTopic).pFlags.closed;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => {\n if(this.threadId) {\n if(!this.canManageTopics) {\n return false;\n }\n\n return (this.dialog as ForumTopic.forumTopic).id !== GENERAL_TOPIC_ID;\n }\n\n return true;\n }\n }];\n\n this.element = ButtonMenuSync({buttons: this.buttons});\n this.element.id = 'dialogs-contextmenu';\n this.element.classList.add('contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onArchiveClick = async() => {\n const dialog = await this.managers.appMessagesManager.getDialogOnly(this.peerId);\n if(dialog) {\n this.managers.appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private hideTopic = () => {\n this.managers.appChatsManager.editForumTopic({\n chatId: this.peerId.toChatId(),\n topicId: this.threadId,\n hidden: true\n });\n };\n\n private toggleTopic = () => {\n this.managers.appChatsManager.editForumTopic({\n chatId: this.peerId.toChatId(),\n topicId: this.threadId,\n closed: !(this.dialog as ForumTopic.forumTopic).pFlags.closed\n });\n };\n\n private onPinClick = () => {\n const {peerId, filterId, threadId} = this;\n this.managers.appMessagesManager.toggleDialogPin({\n peerId,\n filterId,\n topicId: threadId\n }).catch(async(err: ApiError) => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH' || err.type === 'PINNED_TOO_MUCH') {\n if(threadId) {\n this.managers.apiManager.getLimit('topicPin').then((limit) => {\n toastNew({langPackKey: 'LimitReachedPinnedTopics', langPackArguments: [limit]});\n });\n } else if(filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n showLimitPopup('pin');\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, mute: false, threadId: this.threadId});\n };\n\n private onMuteClick = () => {\n new PopupMute(this.peerId, this.threadId);\n };\n\n private onUnreadClick = async() => {\n const {peerId, dialog} = this;\n if(dialog.unread_count) {\n this.managers.appMessagesManager.readHistory(peerId, dialog.top_message, this.threadId);\n\n if(!this.threadId) {\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\n }\n } else if(!this.threadId) {\n this.managers.appMessagesManager.markDialogUnread(peerId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.peerId, undefined, undefined, this.threadId);\n };\n\n onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let li: HTMLElement = null;\n\n try {\n li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n } catch(e) {}\n\n if(!li) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n const r = async() => {\n this.peerId = li.dataset.peerId.toPeerId();\n this.threadId = +li.dataset.threadId || undefined;\n this.dialog = await this.managers.dialogsStorage.getDialogOrTopic(this.peerId, this.threadId);\n this.filterId = this.threadId ? undefined : appDialogsManager.filterId;\n this.canManageTopics = this.threadId ? await this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'manage_topics') : undefined;\n\n await Promise.all(this.buttons.map(async(button) => {\n const good = await button.verify();\n\n button.element.classList.toggle('hide', !good);\n }));\n\n const langPackKey: LangPackKey = this.threadId ? 'Delete' : await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n // delete button\n this.buttons[this.buttons.length - 1].element.lastChild.replaceWith(i18n(langPackKey));\n\n li.classList.add('menu-open');\n positionMenu(e, this.element);\n contextMenuController.openBtnMenu(this.element, () => {\n li.classList.remove('menu-open');\n this.peerId = this.dialog = this.filterId = this.threadId = this.canManageTopics = undefined;\n });\n };\n\n r();\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../config/app';\nimport DEBUG from '../config/debug';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {LangPackKey, i18n} from '../lib/langPack';\nimport {logger} from '../lib/logger';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport ProgressivePreloader from './preloader';\nimport SetTransition from './singleTransition';\nimport sessionStorage from '../lib/sessionStorage';\nimport {ConnectionStatus} from '../lib/mtproto/connectionStatus';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport singleInstance from '../lib/mtproto/singleInstance';\n\nexport default class ConnectionStatusComponent {\n public static CHANGE_STATE_DELAY = 1000;\n\n private statusContainer: HTMLElement;\n private statusEl: HTMLElement;\n private statusPreloader: ProgressivePreloader;\n\n private currentLangPackKey: LangPackKey;\n\n private hadConnect = false;\n private retryAt: number;\n private connecting = false;\n private timedOut = false;\n private updating = false;\n\n private log: ReturnType;\n\n private setFirstConnectionTimeout: number;\n private setStateTimeout: number;\n\n constructor(private managers: AppManagers, chatsContainer: HTMLElement) {\n this.log = logger('CS', undefined, undefined);\n\n this.statusContainer = document.createElement('div');\n this.statusContainer.classList.add('connection-status'/* , 'hide' */);\n\n this.statusEl = Button('btn-primary bg-warning connection-status-button', {noRipple: true});\n this.statusPreloader = new ProgressivePreloader({cancelable: false});\n this.statusPreloader.constructContainer({color: 'transparent', bold: true});\n this.statusContainer.append(this.statusEl);\n\n chatsContainer.prepend(this.statusContainer);\n\n rootScope.addEventListener('connection_status_change', (status) => {\n // console.log(status);\n\n this.setConnectionStatus();\n });\n\n rootScope.addEventListener('state_synchronizing', (channelId) => {\n if(!channelId) {\n this.updating = true;\n DEBUG && this.log('updating', this.updating);\n this.setState();\n }\n });\n\n rootScope.addEventListener('state_synchronized', (channelId) => {\n DEBUG && this.log('state_synchronized', channelId);\n if(!channelId) {\n this.updating = false;\n DEBUG && this.log('updating', this.updating);\n this.setState();\n }\n });\n\n this.setFirstConnectionTimeout = window.setTimeout(this.setConnectionStatus, ConnectionStatusComponent.CHANGE_STATE_DELAY + 1e3);\n\n // let bool = true;\n // document.addEventListener('dblclick', () => {\n // this.setConnectionStatus(bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected));\n // });\n }\n\n private setConnectionStatus = (overrideStatus?: ConnectionStatus) => {\n Promise.all([\n sessionStorage.get('dc'),\n rootScope.managers.rootScope.getConnectionStatus()\n ]).then(([baseDcId, connectionStatus]) => {\n if(!baseDcId) {\n baseDcId = App.baseDcId;\n }\n\n if(this.setFirstConnectionTimeout) {\n clearTimeout(this.setFirstConnectionTimeout);\n this.setFirstConnectionTimeout = 0;\n }\n\n const status = connectionStatus['NET-' + baseDcId];\n const online = status && (overrideStatus || status.status) === ConnectionStatus.Connected;\n\n if(this.connecting && online) {\n this.managers.apiUpdatesManager.forceGetDifference();\n }\n\n if(online && !this.hadConnect) {\n this.hadConnect = true;\n }\n\n this.timedOut = status && (overrideStatus || status.status) === ConnectionStatus.TimedOut;\n this.connecting = !online;\n this.retryAt = status && status.retryAt;\n DEBUG && this.log('connecting', this.connecting);\n this.setState();\n });\n };\n\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\n if(this.currentLangPackKey === langPackKey) return;\n this.currentLangPackKey = langPackKey;\n replaceContent(this.statusEl, i18n(langPackKey, args));\n this.statusPreloader.attach(this.statusEl);\n };\n\n private getA(langPackKey: LangPackKey, callback: () => void) {\n const a = document.createElement('a');\n a.classList.add('force-reconnect');\n a.append(i18n(langPackKey));\n attachClickEvent(a, (e) => {\n cancelEvent(e);\n callback();\n });\n\n return a;\n }\n\n private setState = () => {\n if(singleInstance.deactivatedReason) {\n return;\n }\n\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\n if(this.connecting) {\n if(this.timedOut) {\n const a = this.getA('ConnectionStatus.ForceReconnect', () => this.managers.networkerFactory.forceReconnect());\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\n } else if(this.hadConnect) {\n if(this.retryAt !== undefined) {\n const timerSpan = document.createElement('span');\n const retryAt = this.retryAt;\n const setTime = () => {\n const now = Date.now();\n timerSpan.innerText = '' + Math.max(0, Math.round((retryAt - now) / 1000));\n if(now > retryAt) {\n clearInterval(interval);\n }\n };\n const interval = setInterval(setTime, 1e3);\n setTime();\n\n const a = this.getA('ConnectionStatus.Reconnect', () => this.managers.networkerFactory.forceReconnectTimeout());\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\n } else {\n this.setStatusText('ConnectionStatus.Reconnecting');\n }\n } else {\n this.setStatusText('ConnectionStatus.Waiting');\n }\n } else if(this.updating) {\n this.setStatusText('Updating');\n }\n\n DEBUG && this.log('setState', this.connecting || this.updating);\n window.requestAnimationFrame(() => {\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\n\n const cb = () => {\n SetTransition({\n element: this.statusContainer,\n className: 'is-shown',\n forwards: this.connecting || this.updating,\n duration: 200\n });\n this.setStateTimeout = 0;\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\n };\n\n this.setStateTimeout = window.setTimeout(cb, timeout);\n // cb();\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\n else cb(); */\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message} from '../layer';\n/* import findUpClassName from \"../helpers/dom/findUpClassName\";\nimport rootScope from \"../lib/rootScope\";\nimport Transition from \"./transition\"; */\n\nexport enum SENDING_STATUS {\n Error = -1,\n Pending,\n Sent,\n Read\n}\n\nexport function getSendingStatus(message: Message.message | Message.messageService) {\n return message.pFlags.is_outgoing ?\n SENDING_STATUS.Pending : (\n message.pFlags.unread ?\n SENDING_STATUS.Sent :\n SENDING_STATUS.Read\n );\n}\n\ntype C = 'check' | 'checks' | 'sending' | 'sendingerror' | 'premium_lock';\nexport function setSendingStatus(\n container: HTMLElement,\n message?: C | Message.message | Message.messageService,\n disableAnimationIfRippleFound?: boolean\n) {\n let className: C;\n if(typeof(message) === 'string') {\n className = message;\n } else if(message?.pFlags.out) {\n if(message.error) {\n className = 'sendingerror';\n } else if(message.pFlags.is_outgoing) {\n className = 'sending';\n } else if(message.pFlags.unread) {\n className = 'check';\n } else {\n className = 'checks';\n }\n }\n\n if(!className) {\n container.textContent = '';\n return;\n }\n\n const iconClassName = 'tgico-' + className;\n const lastElement = container.lastElementChild as HTMLElement;\n if(lastElement && lastElement.classList.contains(iconClassName)) {\n return;\n }\n\n const element = document.createElement('i');\n element.classList.add('sending-status-icon', /* 'transition-item', */ iconClassName);\n container.append(element);\n\n if(lastElement) {\n lastElement.remove();\n }\n\n /* if(!lastElement) {\n element.classList.add('active');\n return;\n }\n\n const select = Transition(container, undefined, 350, () => {\n lastElement.remove();\n }, false, true, false);\n\n let animate = rootScope.settings.animationsEnabled && className !== 'sending' && !lastElement.classList.contains('tgico-sending');\n if(disableAnimationIfRippleFound && animate) {\n const parent = findUpClassName(container, 'rp');\n if(parent.querySelector('.c-ripple__circle') || parent.matches(':hover')) {\n animate = false;\n }\n }\n\n select(element, animate, lastElement); */\n\n /* SetTransition(lastElement, 'is-visible', false, 350, () => {\n // lastElement.remove();\n }, 2);\n SetTransition(element, 'is-visible', true, 350, undefined, 2); */\n}\n","// https://spicyyoghurt.com/tools/easing-functions\nexport default function easeInOutSine(t: number, b: number, c: number, d: number) {\n return t >= d ? b + c : easeInOutSineApply(t / d, c) + b;\n}\n\nexport function easeInOutSineApply(v: number, c: number) {\n return -c / 2 * (Math.cos(Math.PI * v) - 1);\n}\n","export default function roundRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radius: {[k in 'tl' | 'tr' | 'br' | 'bl']?: number} | number,\n fill?: boolean,\n stroke?: boolean\n) {\n const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n width *= dpr;\n height *= dpr;\n }\n\n if(typeof(radius) === 'number') {\n if(dpr) radius *= dpr;\n radius = {tl: radius, tr: radius, br: radius, bl: radius};\n } else {\n const defaultRadius = {tl: 0, tr: 0, br: 0, bl: 0};\n for(const side in defaultRadius) {\n // @ts-ignore\n radius[side] = radius[side] ? (dpr ? radius[side] * dpr : radius[side]) : defaultRadius[side];\n }\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {animate} from '../helpers/animation';\nimport customProperties from '../helpers/dom/customProperties';\nimport easeInOutSine from '../helpers/easing/easeInOutSine';\nimport mediaSizes from '../helpers/mediaSizes';\nimport roundRect from '../helpers/canvas/roundRect';\n\nconst DPR = window.devicePixelRatio;\nconst SIZE = 20 * DPR;\nconst MARGIN = 2.5 * DPR;\nconst WIDTH = 2 * DPR;\nconst RADIUS = 1 * DPR;\nconst LENGTH = 3;\n\nconst MIN_HEIGHT = 4;\nconst MAX_HEIGHT = 12;\nconst DURATION = 1000;\n\nexport default function groupCallActiveIcon(isActive = false) {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = SIZE;\n const context = canvas.getContext('2d');\n\n const TOTAL_WIDTH = LENGTH * WIDTH + (LENGTH - 1) * MARGIN;\n const START_X = (SIZE - TOTAL_WIDTH) / 2;\n\n const startTime = Date.now();\n let wasMounted = false;\n // let hadRound = false;\n const renderFrame = () => {\n if(!canvas.isConnected) {\n if(wasMounted) {\n return false;\n }\n } else if(!wasMounted) {\n wasMounted = canvas.isConnected;\n }\n\n const time = Date.now();\n // if(((time - startTime) / DURATION) >= 1) {\n // hadRound = true;\n // }\n\n const progress = easeInOutSine((time - startTime) % DURATION, 0, 1, DURATION);\n\n context.clearRect(0, 0, SIZE, SIZE);\n context.fillStyle = isActive && !mediaSizes.isMobile ? customProperties.getProperty('primary-color') : '#fff';\n\n for(let i = 0; i < LENGTH; ++i) {\n const x = START_X + (i * WIDTH) + (i * MARGIN);\n\n let itemProgress: number;\n if(progress >= .5) {\n itemProgress = i % 2 ? 2 - progress * 2 : (progress - .5) * 2;\n } else {\n itemProgress = i % 2 ? progress * 2 : 1 - progress * 2;\n }\n\n let height = MIN_HEIGHT + (itemProgress * (MAX_HEIGHT - MIN_HEIGHT));\n /* if(!hadRound && i === 1) {\n console.log('call status animation', itemProgress, height, progress, progress >= .5);\n } */\n\n height *= DPR;\n const y = (SIZE - height) / 2;\n\n roundRect(context, x, y, WIDTH, height, RADIUS, true);\n }\n\n return true;\n };\n\n return {\n canvas,\n startAnimation: () => {\n animate(renderFrame);\n renderFrame();\n },\n setActive: (active: boolean) => {\n isActive = active;\n renderFrame();\n }\n };\n}\n","import customProperties from '../dom/customProperties';\nimport clamp from '../number/clamp';\n\nexport default class Shimmer {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private font = '30pt Helvetica';\n private currTime = Date.now();\n private diffTime = 0;\n private spread = 0;\n private paused = false;\n private pausedTime = 0;\n private pauseInterval = 850;\n private lightSource = 0;\n private inc = 0.032;\n private lightSpread = 0.55;\n private animations = ['slide', 'slide', 'slide', 'slide'];\n private currentAnimationIndex = 0;\n private text: string;\n private fillStyle: CanvasRenderingContext2D['fillStyle'];\n\n private keepTime() {\n this.diffTime = Date.now() - this.currTime;\n this.currTime = Date.now();\n }\n\n private cycleAnimation() {\n ++this.currentAnimationIndex;\n if(this.currentAnimationIndex >= this.animations.length) {\n this.currentAnimationIndex = 0;\n }\n }\n\n private animate() {\n const currentAnimation = this.animations[this.currentAnimationIndex];\n if(currentAnimation === 'glow') {\n return this.animateGlow(); // return glow style\n } else if(currentAnimation === 'slide') {\n return this.animateSlide(); // return slide gradient\n } else {\n console.log('unknown animation type: ' + String(currentAnimation));\n }\n }\n\n private animateGlow() {\n var glowEnd = 255,\n rgbStart = 68,\n r = rgbStart,\n g = r,\n b = r,\n increment = 10,\n interval = 800;\n\n return () => {\n var smartInc = increment * (this.diffTime / (1000 / 60));\n if(this.paused) {\n if((Date.now() - this.pausedTime) > interval) {\n r = rgbStart;\n this.cycleAnimation()\n this.paused = false;\n }\n } else {\n r = parseInt('' + (r + smartInc));\n if(r >= glowEnd) {\n this.paused = true;\n this.pausedTime = Date.now()\n }\n }\n return 'rgb('+ r + ',' + r + ',' + r + ')';\n };\n }\n\n private animateSlide(): CanvasGradient {\n var gradient = this.ctx.createLinearGradient(0, 0, this.canvas.width, 0),\n smartInc = this.inc * (this.diffTime / (1000 / 60)),\n lightLeft,\n lightRight,\n lightCenter;\n if(this.paused) {\n if((Date.now() - this.pausedTime) > this.pauseInterval) {\n this.lightSource = -0.6;\n this.cycleAnimation()\n this.paused = false;\n return this.animateSlide();\n }\n } else {\n this.lightSource += smartInc;\n if(this.lightSource > (1 + this.lightSpread)) {\n this.paused = true;\n this.pausedTime = Date.now();\n }\n }\n // lighting positions:\n lightCenter = clamp(this.lightSource, 0, 1);\n lightLeft = clamp(this.lightSource - this.lightSpread, 0, 1);\n lightRight = clamp(this.lightSource + this.lightSpread, 0, 1);\n\n const backgroundColor = customProperties.getProperty('background-color-true');\n const shimmerColor = customProperties.getProperty('surface-color');\n gradient.addColorStop(lightLeft, backgroundColor);\n gradient.addColorStop(lightCenter, shimmerColor);\n gradient.addColorStop(lightRight, backgroundColor);\n\n return gradient;\n }\n\n public settings(dict: Partial<{\n canvas: Shimmer['canvas'],\n fillStyle: Shimmer['fillStyle'],\n font: Shimmer['font'],\n lightSpread: Shimmer['lightSpread'],\n inc: Shimmer['inc'],\n animations: Shimmer['animations'],\n text: Shimmer['text']\n }> = {}) {\n this.canvas = dict.canvas ?? document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n this.font = dict.font ?? this.font;\n this.lightSpread = dict.lightSpread ?? this.lightSpread;\n this.inc = dict.inc ?? this.inc;\n this.animations = dict.animations ?? this.animations;\n this.text = dict.text ?? this.text;\n this.fillStyle = dict.fillStyle;\n\n this.canvas.classList.add('shimmer-canvas');\n }\n\n public on() {\n const {width, height} = this.canvas;\n // record the time we ran:\n this.keepTime();\n // clear and fill the canvas:\n this.ctx.clearRect(0, 0, width, height);\n\n if(this.font) {\n this.ctx.font = this.font;\n }\n\n this.ctx.fillStyle = this.animate() as any;\n this.ctx.fillRect(0, 0, width, height);\n\n if(this.fillStyle) {\n this.ctx.fillStyle = this.fillStyle;\n this.ctx.fillRect(0, 0, width, height);\n }\n\n if(this.text) {\n this.ctx.fillText(this.text, 50, 50);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport rootScope from '../lib/rootScope';\nimport {animate} from './animation';\nimport {drawCircleFromStart} from './canvas/drawCircle';\nimport roundRect from './canvas/roundRect';\nimport Shimmer from './canvas/shimmer';\nimport customProperties from './dom/customProperties';\nimport easeInOutSine from './easing/easeInOutSine';\nimport mediaSizes from './mediaSizes';\n\nexport default class DialogsPlaceholder {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private shimmer: Shimmer;\n private tempId: number;\n private detachTime: number;\n\n private length: number;\n private dialogHeight: number;\n private availableLength: number;\n\n private avatarSize: number;\n private marginVertical: number;\n private totalHeight: number;\n private lineHeight: number;\n private lineBorderRadius: number;\n private lineMarginVertical: number;\n private statusWidth: number;\n private generatedValues: {\n firstLineWidth: number,\n secondLineWidth: number,\n statusWidth: number\n }[];\n\n private getRectFrom: () => DOMRectEditable;\n private onRemove: () => void;\n private blockScrollable: Scrollable;\n\n constructor(sizes: Partial<{\n avatarSize: number,\n marginVertical: number,\n totalHeight: number\n }> = {}) {\n this.shimmer = new Shimmer();\n this.tempId = 0;\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('dialogs-placeholder-canvas');\n this.ctx = this.canvas.getContext('2d');\n\n this.generatedValues = [];\n this.avatarSize = sizes.avatarSize ?? 54;\n this.marginVertical = sizes.marginVertical ?? 9;\n this.totalHeight = sizes.totalHeight ?? (this.avatarSize + this.marginVertical * 2);\n this.lineHeight = 10;\n this.lineBorderRadius = 6;\n this.lineMarginVertical = 8;\n this.statusWidth = 24;\n }\n\n public attach({container, rect, getRectFrom, onRemove, blockScrollable}: {\n container: HTMLElement,\n rect?: ReturnType,\n getRectFrom?: HTMLElement | DialogsPlaceholder['getRectFrom'],\n onRemove?: DialogsPlaceholder['onRemove'],\n blockScrollable?: DialogsPlaceholder['blockScrollable']\n }) {\n const {canvas} = this;\n\n this.onRemove = onRemove;\n this.getRectFrom = typeof(getRectFrom) === 'function' ? getRectFrom : (getRectFrom || container).getBoundingClientRect.bind(getRectFrom || container);\n if(this.blockScrollable = blockScrollable) {\n blockScrollable.container.style.overflowY = 'hidden';\n }\n\n this.updateCanvasSize(rect);\n this.startAnimation();\n container.append(canvas);\n }\n\n public detach(availableLength: number) {\n if(this.detachTime) {\n return;\n }\n\n this.availableLength = availableLength;\n this.detachTime = Date.now();\n\n if(!rootScope.settings.animationsEnabled) {\n this.remove();\n }\n }\n\n public remove() {\n this.stopAnimation();\n\n if(this.canvas.parentElement) {\n this.canvas.remove();\n\n if(this.blockScrollable) {\n this.blockScrollable.container.style.overflowY = '';\n this.blockScrollable = undefined;\n }\n }\n\n this.onRemove?.();\n this.onRemove = undefined;\n }\n\n private updateCanvasSize(rect = this.getRectFrom()) {\n const {canvas} = this;\n const dpr = canvas.dpr = window.devicePixelRatio;\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n canvas.style.width = rect.width + 'px';\n canvas.style.height = rect.height + 'px';\n }\n\n private renderDetachAnimationFrame() {\n const {\n canvas,\n ctx,\n detachTime,\n length,\n availableLength\n } = this;\n\n if(!detachTime) {\n return;\n } else if(!rootScope.settings.animationsEnabled) {\n this.remove();\n return;\n }\n\n const {width} = canvas;\n\n ctx.globalCompositeOperation = 'destination-out';\n\n // ctx.fillStyle = 'rgba(0, 0, 0, 0)';\n // ctx.fillRect(0, 0, width, height);\n\n // const DURATION = 500;\n // const DELAY = DURATION;\n const DURATION = 150;\n const DELAY = 15;\n const elapsedTime = Date.now() - detachTime;\n let completed = true;\n for(let i = 0; i < length; ++i) {\n const delay = availableLength < length && i >= availableLength ? DELAY * (availableLength - 1) : DELAY * i;\n const elapsedRowTime = elapsedTime - delay;\n if(elapsedRowTime <= 0) {\n completed = false;\n continue;\n }\n\n const progress = easeInOutSine(elapsedRowTime, 0, 1, DURATION);\n\n ctx.beginPath();\n ctx.rect(0, this.dialogHeight * i, width, this.dialogHeight);\n ctx.fillStyle = `rgba(0, 0, 0, ${progress})`;\n ctx.fill();\n\n if(progress < 1) {\n completed = false;\n }\n }\n\n // const totalRadius = Math.sqrt(width ** 2 + height ** 2);\n // const gradient = ctx.createRadialGradient(\n // 0, 0, 0,\n // 0, 0, totalRadius);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n // const gradient = ctx.createLinearGradient(0, 0, 0, height);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n // ctx.fillStyle = gradient;\n // ctx.fillRect(0, 0, width, height);\n\n ctx.globalCompositeOperation = 'source-over';\n\n if(completed) {\n this.remove();\n }\n }\n\n private renderFrame() {\n this.shimmer.on();\n this.renderDetachAnimationFrame();\n }\n\n private startAnimation() {\n const {canvas, shimmer} = this;\n const tempId = ++this.tempId;\n const pattern = this.createPattern();\n\n shimmer.settings({\n canvas,\n fillStyle: pattern\n });\n\n const middleware = () => {\n return this.tempId === tempId;\n };\n\n this.renderFrame();\n animate(() => {\n if(!middleware()) {\n return false;\n }\n\n // ! should've removed the loop if animations are disabled\n if(rootScope.settings.animationsEnabled) {\n this.renderFrame();\n }\n\n // ! tempId can be changed during renderFrame\n return middleware();\n });\n\n rootScope.addEventListener('theme_change', this.onThemeChange);\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private stopAnimation() {\n ++this.tempId;\n rootScope.removeEventListener('theme_change', this.onThemeChange);\n mediaSizes.removeEventListener('resize', this.onResize);\n }\n\n private onThemeChange = () => {\n this.stopAnimation();\n this.startAnimation();\n };\n\n private onResize = () => {\n const {canvas} = this;\n const {width, height, dpr} = canvas;\n this.updateCanvasSize();\n if(canvas.width === width && canvas.height === height && canvas.dpr === dpr) {\n return;\n }\n\n this.stopAnimation();\n this.startAnimation();\n };\n\n private createPattern() {\n const {canvas, ctx} = this;\n\n const patternCanvas = document.createElement('canvas');\n const patternContext = patternCanvas.getContext('2d');\n const dpr = canvas.dpr;\n patternCanvas.dpr = dpr;\n patternCanvas.width = canvas.width;\n patternCanvas.height = canvas.height;\n\n patternContext.fillStyle = customProperties.getProperty('surface-color');\n patternContext.fillRect(0, 0, patternCanvas.width, patternCanvas.height);\n\n patternContext.fillStyle = '#000';\n patternContext.globalCompositeOperation = 'destination-out';\n\n const dialogHeight = this.dialogHeight = this.totalHeight * dpr;\n const length = this.length = Math.ceil(canvas.height / dialogHeight);\n for(let i = 0; i < length; ++i) {\n this.drawChat(patternContext, i, i * dialogHeight);\n }\n\n return ctx.createPattern(patternCanvas, 'no-repeat');\n }\n\n private drawChat(ctx: CanvasRenderingContext2D, i: number, y: number) {\n let generatedValues = this.generatedValues[i];\n if(!generatedValues) {\n generatedValues = this.generatedValues[i] = {\n firstLineWidth: 40 + Math.random() * 100, // 120\n secondLineWidth: 120 + Math.random() * 130, // 240\n statusWidth: 24 + Math.random() * 16\n };\n }\n\n const {\n firstLineWidth,\n secondLineWidth,\n statusWidth\n } = generatedValues;\n\n const {canvas} = ctx;\n const {dpr} = canvas;\n y /= dpr;\n\n const {\n avatarSize,\n marginVertical,\n lineHeight,\n lineBorderRadius,\n lineMarginVertical\n } = this;\n\n let marginLeft = 17;\n\n if(avatarSize) {\n drawCircleFromStart(ctx, marginLeft, y + marginVertical, avatarSize / 2, true);\n marginLeft += avatarSize + 10;\n }\n\n // 9 + 54 - 10 - 8 = 45 ........ 72 - 9 - 10 - 8\n roundRect(ctx, marginLeft, y + marginVertical + lineMarginVertical, firstLineWidth, lineHeight, lineBorderRadius, true);\n // roundRect(ctx, marginLeft, y + marginVertical + avatarSize - lineHeight - lineMarginVertical, secondLineWidth, lineHeight, lineBorderRadius, true);\n roundRect(ctx, marginLeft, y + this.totalHeight - marginVertical - lineHeight - lineMarginVertical, secondLineWidth, lineHeight, lineBorderRadius, true);\n\n roundRect(ctx, canvas.width / dpr - 24 - statusWidth, y + marginVertical + lineMarginVertical, statusWidth, lineHeight, lineBorderRadius, true);\n }\n}\n","export default function drawCircle(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n radius *= dpr;\n }\n\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, 2 * Math.PI, false);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n\nexport function drawCircleFromStart(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n return drawCircle(ctx, x + radius, y + radius, radius, fill, stroke);\n}\n","import rootScope from '../../lib/rootScope';\n\nexport default function shake(element: HTMLElement) {\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n\n const keyframes: Keyframe[] = [\n {transform: 'translateX(0)'},\n {transform: 'translateX(.25rem)'},\n {transform: 'translateX(-.25rem)'},\n {transform: 'translateX(0)'}\n ];\n\n element.animate([...keyframes, ...keyframes, ...keyframes], {\n duration: 300,\n iterations: 1,\n easing: 'ease-in-out'\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter as DialogFilter, MyDialogFilter} from '../storages/filters';\nimport type LazyLoadQueue from '../../components/lazyLoadQueue';\nimport type {Dialog, ForumTopic, MyMessage} from './appMessagesManager';\nimport type {MyPhoto} from './appPhotosManager';\nimport type {MyDocument} from './appDocsManager';\nimport type {State} from '../../config/state';\nimport AvatarElement from '../../components/avatar';\nimport DialogsContextMenu from '../../components/dialogsContextMenu';\nimport {horizontalMenu} from '../../components/horizontalMenu';\nimport ripple from '../../components/ripple';\nimport Scrollable, {ScrollableX, SliceSides} from '../../components/scrollable';\nimport {formatDateAccordingToTodayNew} from '../../helpers/date';\nimport {IS_MOBILE_SAFARI, IS_SAFARI} from '../../environment/userAgent';\nimport {logger, LogTypes} from '../logger';\nimport rootScope from '../rootScope';\nimport appImManager, {AppImManager, APP_TABS} from './appImManager';\nimport Button from '../../components/button';\nimport SetTransition from '../../components/singleTransition';\nimport {MyDraftMessage} from './appDraftsManager';\nimport DEBUG, {MOUNT_CLASS_TO} from '../../config/debug';\nimport PeerTitle from '../../components/peerTitle';\nimport I18n, {FormatterArguments, i18n, LangPackKey, _i18n} from '../langPack';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport wrapPhoto from '../../components/wrappers/photo';\nimport AppEditFolderTab from '../../components/sidebarLeft/tabs/editFolder';\nimport appSidebarLeft from '../../components/sidebarLeft';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport ConnectionStatusComponent from '../../components/connectionStatus';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport {fastRafConventional, fastRafPromise} from '../../helpers/schedulers';\nimport SortedUserList from '../../components/sortedUserList';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport handleTabSwipe from '../../helpers/dom/handleTabSwipe';\nimport windowSize from '../../helpers/windowSize';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport {setSendingStatus} from '../../components/sendingStatus';\nimport SortedList, {SortedElementBase} from '../../helpers/sortedList';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, NULL_PEER_ID, REAL_FOLDERS, REAL_FOLDER_ID} from '../mtproto/mtproto_config';\nimport groupCallActiveIcon from '../../components/groupCallActiveIcon';\nimport {Chat, Message, NotifyPeer} from '../../layer';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport appNavigationController, {NavigationItem} from '../../components/appNavigationController';\nimport appMediaPlaybackController from '../../components/appMediaPlaybackController';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {AppManagers} from './managers';\nimport appSidebarRight from '../../components/sidebarRight';\nimport PopupElement from '../../components/popups';\nimport choosePhotoSize from './utils/photos/choosePhotoSize';\nimport wrapEmojiText from '../richTextProcessor/wrapEmojiText';\nimport wrapMessageForReply from '../../components/wrappers/messageForReply';\nimport isMessageRestricted from './utils/messages/isMessageRestricted';\nimport getMediaFromMessage from './utils/messages/getMediaFromMessage';\nimport getMessageSenderPeerIdOrName from './utils/messages/getMessageSenderPeerIdOrName';\nimport wrapStickerEmoji from '../../components/wrappers/stickerEmoji';\nimport getDialogIndexKey from './utils/dialogs/getDialogIndexKey';\nimport getProxiedManagers from './getProxiedManagers';\nimport getDialogIndex from './utils/dialogs/getDialogIndex';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport wrapPeerTitle from '../../components/wrappers/peerTitle';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport appDownloadManager from './appDownloadManager';\nimport groupCallsController from '../calls/groupCallsController';\nimport callsController from '../calls/callsController';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport noop from '../../helpers/noop';\nimport DialogsPlaceholder from '../../helpers/dialogsPlaceholder';\nimport pause from '../../helpers/schedulers/pause';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {getMiddleware, MiddlewareHelper} from '../../helpers/middleware';\nimport makeError from '../../helpers/makeError';\nimport getUnsafeRandomInt from '../../helpers/number/getUnsafeRandomInt';\nimport Row, {RowMediaSizeType} from '../../components/row'\nimport SettingSection from '../../components/settingSection';\nimport {SliderSuperTabEventable} from '../../components/sliderTab';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport ButtonMenuToggle from '../../components/buttonMenuToggle';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport AppSharedMediaTab from '../../components/sidebarRight/tabs/sharedMedia';\nimport {dispatchHeavyAnimationEvent} from '../../hooks/useHeavyAnimationCheck';\nimport AppArchivedTab from '../../components/sidebarLeft/tabs/archivedTab';\nimport shake from '../../helpers/dom/shake';\nimport AppEditTopicTab from '../../components/sidebarRight/tabs/editTopic';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport const DIALOG_LIST_ELEMENT_TAG = 'A';\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge?: HTMLElement,\n unreadAvatarBadge?: HTMLElement,\n callIcon?: ReturnType,\n mentionsBadge?: HTMLElement,\n lastMessageSpan: HTMLSpanElement,\n containerEl: HTMLElement,\n listEl: HTMLElement,\n subtitleEl: HTMLElement,\n\n setLastMessagePromise?: CancellablePromise,\n setUnreadMessagePromise?: CancellablePromise\n};\n\ninterface SortedDialog extends SortedElementBase {\n dom: DialogDom,\n dialogElement: DialogElement\n}\n\nfunction setPromiseMiddleware}, K extends keyof T>(obj: T, key: K) {\n const oldPromise: CancellablePromise = obj[key] as any;\n oldPromise?.reject();\n\n // @ts-ignore\n const deferred = obj[key] = deferredPromise();\n deferred.catch(() => {}).finally(() => {\n if((obj[key] as any) === deferred) {\n delete obj[key];\n }\n });\n\n const middleware = middlewarePromise(() => (obj[key] as any) === deferred);\n return {deferred, middleware};\n}\n\nconst BADGE_SIZE = 22;\nconst BADGE_TRANSITION_TIME = 250;\n\nclass SortedDialogList extends SortedList {\n public managers: AppManagers;\n public log: ReturnType;\n public list: HTMLElement;\n public indexKey: ReturnType;\n public onListLengthChange: () => void;\n public forumPeerId: PeerId;\n\n constructor(options: {\n managers: SortedDialogList['managers'],\n log?: SortedDialogList['log'],\n list: SortedDialogList['list'],\n indexKey: SortedDialogList['indexKey'],\n onListLengthChange?: SortedDialogList['onListLengthChange'],\n forumPeerId?: SortedDialogList['forumPeerId']\n }) {\n super({\n getIndex: (element) => this.managers.dialogsStorage.getDialogIndex(this.forumPeerId ?? element.id, this.indexKey, this.forumPeerId ? element.id : undefined),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange?.();\n },\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength) {\n this.onListLengthChange?.();\n }\n },\n onElementCreate: async(base) => {\n const loadPromises: Promise[] = [];\n\n const dialogElement = appDialogsManager.addListDialog({\n peerId: this.forumPeerId ?? base.id,\n loadPromises,\n isBatch: true,\n threadId: this.forumPeerId ? base.id : undefined,\n isMainList: this.indexKey === 'index_0'\n });\n (base as SortedDialog).dom = dialogElement.dom;\n (base as SortedDialog).dialogElement = dialogElement;\n\n await Promise.all(loadPromises);\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional,\n log: options.log\n });\n\n safeAssign(this, options);\n }\n\n public clear() {\n this.list.replaceChildren();\n super.clear();\n }\n}\n\nexport type DialogElementSize = RowMediaSizeType;\ntype DialogElementOptions = {\n peerId: PeerId,\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n avatarSize?: RowMediaSizeType,\n autonomous?: boolean,\n loadPromises?: Promise[],\n fromName?: string,\n noIcons?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions,\n isMainList?: boolean\n};\nclass DialogElement extends Row {\n public dom: DialogDom;\n\n constructor({\n peerId,\n rippleEnabled = true,\n onlyFirstName = false,\n meAsSaved = true,\n avatarSize = 'bigger',\n autonomous,\n loadPromises,\n fromName,\n noIcons,\n threadId,\n wrapOptions = {},\n isMainList\n }: DialogElementOptions) {\n super({\n clickable: true,\n noRipple: !rippleEnabled,\n havePadding: !threadId,\n title: true,\n titleRightSecondary: true,\n subtitle: true,\n subtitleRight: true,\n noWrap: true,\n asLink: true\n });\n\n this.subtitleRight.remove();\n\n const avatarEl = threadId ? undefined : new AvatarElement();\n if(avatarEl) {\n const avatarSizeMap: {[k in DialogElementSize]?: number} = {\n bigger: 54,\n abitbigger: 42,\n small: 32\n };\n const s = avatarSizeMap[avatarSize];\n avatarEl.classList.add('dialog-avatar', 'avatar-' + s);\n avatarEl.updateWithOptions({\n loadPromises,\n lazyLoadQueue: wrapOptions.lazyLoadQueue,\n isDialog: !!meAsSaved,\n peerId,\n peerTitle: fromName\n });\n\n this.applyMediaElement(avatarEl, avatarSize);\n }\n\n const captionDiv = this.container;\n\n const titleSpanContainer = this.title;\n titleSpanContainer.classList.add('user-title');\n\n this.titleRow.classList.add('dialog-title');\n\n const peerTitle = new PeerTitle();\n const peerTitlePromise = peerTitle.update({\n peerId,\n fromName,\n dialog: meAsSaved,\n onlyFirstName,\n withIcons: !noIcons,\n threadId: threadId\n });\n\n loadPromises?.push(peerTitlePromise);\n titleSpanContainer.append(peerTitle.element);\n\n // for muted icon\n titleSpanContainer.classList.add('tgico'); // * эта строка будет актуальна только для !container, но ладно\n\n // const titleIconsPromise = generateTitleIcons(peerId).then((elements) => {\n // titleSpanContainer.append(...elements);\n // });\n\n // if(loadPromises) {\n // loadPromises.push(titleIconsPromise);\n // }\n // }\n\n const span = this.subtitle;\n // span.classList.add('user-last-message');\n\n const li = this.container;\n li.classList.add('chatlist-chat', 'chatlist-chat-' + avatarSize);\n if(!autonomous) {\n (li as HTMLAnchorElement).href = '#' + peerId;\n }\n // if(rippleEnabled) {\n // ripple(li);\n // }\n\n if(avatarSize === 'bigger') {\n this.container.classList.add('row-big');\n } else if(avatarSize === 'small') {\n this.container.classList.add('row-small');\n }\n\n li.dataset.peerId = '' + peerId;\n if(threadId) {\n li.dataset.threadId = '' + threadId;\n }\n\n const statusSpan = document.createElement('span');\n statusSpan.classList.add('message-status', 'sending-status'/* , 'transition', 'reveal' */);\n\n const lastTimeSpan = document.createElement('span');\n lastTimeSpan.classList.add('message-time');\n\n const rightSpan = this.titleRight;\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n\n this.subtitleRow.classList.add('dialog-subtitle');\n\n const dom: DialogDom = this.dom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl: this.subtitleRow\n };\n\n if(!autonomous) {\n (li as any).dialogDom = dom;\n\n const chat = appImManager.chat;\n if(chat && appImManager.isSamePeer(chat, {peerId, threadId: threadId, type: 'chat'})) {\n appDialogsManager.setDialogActive(li, true);\n }\n\n if(isMainList && appDialogsManager.forumTab?.peerId === peerId && !threadId) {\n li.classList.add('is-forum-open');\n }\n }\n }\n\n public createUnreadBadge() {\n if(this.dom.unreadBadge) return;\n const badge = this.dom.unreadBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE}`;\n this.dom.subtitleEl.append(badge);\n }\n\n public createUnreadAvatarBadge() {\n if(this.dom.unreadAvatarBadge) return;\n const badge = this.dom.unreadAvatarBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE} avatar-badge`;\n this.dom.listEl.append(badge);\n }\n\n public createMentionsBadge() {\n if(this.dom.mentionsBadge) return;\n const badge = this.dom.mentionsBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE} mention mention-badge`;\n badge.innerText = '@';\n this.dom.lastMessageSpan.after(badge);\n }\n\n public toggleBadgeByKey(\n key: Extract,\n hasBadge: boolean,\n justCreated: boolean,\n batch?: boolean\n ) {\n SetTransition({\n element: this.dom[key],\n className: 'is-visible',\n forwards: hasBadge,\n duration: batch ? 0 : BADGE_TRANSITION_TIME,\n onTransitionEnd: hasBadge ? undefined : () => {\n this.dom[key].remove();\n delete this.dom[key];\n },\n useRafs: !justCreated || !isInDOM(this.dom[key]) ? 2 : 0\n });\n }\n}\n\nclass ForumTab extends SliderSuperTabEventable {\n private rows: HTMLElement;\n private subtitle: HTMLElement;\n\n public peerId: PeerId;\n private firstTime: boolean;\n\n private log: ReturnType;\n\n private xd: Some3;\n\n public async toggle(value: boolean) {\n if(this.init2) {\n await this.init2();\n }\n\n SetTransition({\n element: this.container,\n className: 'is-visible',\n forwards: value,\n duration: 300,\n onTransitionEnd: !value ? () => {\n this.onCloseAfterTimeout();\n } : undefined,\n useRafs: this.firstTime ? (this.firstTime = undefined, 2) : undefined\n });\n }\n\n public init(options: {\n peerId: PeerId,\n managers: AppManagers\n }) {\n safeAssign(this, options);\n\n this.log = logger('FORUM');\n this.firstTime = true;\n this.container.classList.add('topics-container');\n\n const isFloating = !this.slider;\n if(isFloating) {\n this.closeBtn.classList.replace('tgico-left', 'tgico-close');\n this.container.classList.add('active', 'is-floating');\n\n attachClickEvent(this.closeBtn, () => {\n appDialogsManager.toggleForumTab(undefined, this);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.rows = document.createElement('div');\n this.rows.classList.add('sidebar-header__rows');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('sidebar-header__subtitle');\n\n this.title.replaceWith(this.rows);\n this.rows.append(this.title, this.subtitle);\n\n const list = appDialogsManager.createChatList();\n appDialogsManager.setListClickListener(list, null, true);\n this.scrollable.append(list);\n\n this.xd = new Some3(this.peerId, isFloating ? 80 : 0);\n this.xd.scrollable = this.scrollable;\n this.xd.sortedList = new SortedDialogList({\n managers: this.managers,\n log: this.log,\n list,\n indexKey: 'index_0',\n forumPeerId: this.peerId\n });\n this.xd.bindScrollable();\n\n const getOptionsForMessages = (): Parameters[0] => {\n return {\n peerId: this.peerId,\n type: 'chat'\n };\n };\n\n const btnMenu = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'info',\n text: 'ForumTopic.Context.Info',\n onClick: async() => {\n const tab = appSidebarLeft.createTab(AppSharedMediaTab, true);\n tab.isFirst = true;\n tab.setPeer(this.peerId);\n (await tab.fillProfileElements())();\n tab.loadSidebarMedia(true);\n tab.open();\n }\n }, {\n icon: 'message',\n text: 'ForumTopic.Context.ShowAsMessages',\n onClick: () => {\n const chat = appImManager.chat;\n appImManager[chat?.peerId === this.peerId ? 'setPeer' : 'setInnerPeer'](getOptionsForMessages());\n },\n verify: () => {\n const chat = appImManager.chat;\n return !chat || !appImManager.isSamePeer(chat, getOptionsForMessages());\n }\n }, {\n icon: 'adduser',\n text: 'ForumTopic.Context.AddMember',\n onClick: () => {},\n verify: () => false && this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users')\n }, {\n icon: 'add',\n text: 'ForumTopic.Context.New',\n onClick: () => {\n appSidebarLeft.createTab(AppEditTopicTab).open(this.peerId);\n },\n separator: true,\n verify: () => this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'manage_topics')\n }]\n });\n\n this.listenerSetter.add(rootScope)('history_reload', (peerId) => {\n if(this.peerId !== peerId) {\n return;\n }\n\n this.xd.fullReset();\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.peerId !== chatId.toPeerId(true)) {\n return;\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n if(!(chat as Chat.channel).pFlags.forum) {\n appDialogsManager.toggleForumTab(undefined, this);\n }\n });\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.container,\n onSwipe: () => {\n appDialogsManager.toggleForumTab(undefined, this);\n },\n middleware: this.middlewareHelper.get()\n });\n }\n\n this.header.append(btnMenu);\n\n if(!isFloating) {\n return this.init2();\n }\n }\n\n public async init2() {\n this.init2 = undefined;\n\n const middleware = this.middlewareHelper.get();\n const peerId = this.peerId;\n\n this.managers.apiUpdatesManager.subscribeToChannelUpdates(this.peerId.toChatId());\n middleware.onDestroy(() => {\n this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(this.peerId.toChatId());\n });\n\n const peerTitlePromise = wrapPeerTitle({\n peerId,\n dialog: true,\n wrapOptions: {middleware}\n });\n\n const setStatusPromise = appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear: true,\n useWhitespace: false,\n middleware,\n noTyping: true\n });\n\n // this.managers.dialogsStorage.getForumTopics(this.peerId).then((messagesForumTopics) => {\n // console.log(messagesForumTopics);\n\n // const promises = messagesForumTopics.topics.map((forumTopic) => {\n // return this.sortedDialogList.add(forumTopic.id);\n // });\n\n // return Promise.all(promises);\n // }).then(() => {\n // this.dialogsPlaceholder.detach(this.sortedDialogList.getAll().size);\n // });\n\n return Promise.all([\n peerTitlePromise,\n setStatusPromise,\n this.xd.onChatsScroll().then((loadResult) => {\n return loadResult.cached ? loadResult.renderPromise : undefined\n })\n ]).then(([\n peerTitle,\n setStatus,\n _\n ]) => {\n if(!middleware()) {\n return;\n }\n\n this.title.append(peerTitle);\n setStatus?.();\n });\n }\n\n public onCloseAfterTimeout() {\n super.onCloseAfterTimeout();\n this.xd.destroy();\n }\n}\n\nconst NOT_IMPLEMENTED_ERROR = new Error('not implemented');\n\ntype DialogKey = Parameters[0];\nclass Some {\n public sortedList: SortedDialogList;\n public scrollable: Scrollable;\n public loadedDialogsAtLeastOnce: boolean;\n public needPlaceholderAtFirstTime: boolean;\n protected offsets: {top: number, bottom: number};\n protected indexKey: ReturnType;\n protected sliceTimeout: number;\n protected managers: AppManagers;\n protected listenerSetter: ListenerSetter;\n protected loadDialogsPromise: Promise<{cached: boolean, renderPromise: Some2['loadDialogsRenderPromise']}>;\n protected loadDialogsRenderPromise: Promise;\n protected placeholder: DialogsPlaceholder;\n protected log: ReturnType;\n protected placeholderOptions: ConstructorParameters[0];\n\n constructor() {\n this.log = logger('CL');\n this.offsets = {top: 0, bottom: 0};\n this.managers = rootScope.managers;\n this.listenerSetter = new ListenerSetter();\n }\n\n public getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scrollable.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n protected isDialogMustBeInViewport(dialog: T) {\n // return true;\n const topOffset = this.getOffsetIndex('top');\n const bottomOffset = this.getOffsetIndex('bottom');\n\n if(!topOffset.index && !bottomOffset.index) {\n return true;\n }\n\n const index = getDialogIndex(dialog, this.indexKey);\n return (!topOffset.index || index <= topOffset.index) &&\n (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n public setIndexKey(indexKey: Some['indexKey']) {\n this.indexKey = indexKey;\n this.sortedList.indexKey = indexKey;\n }\n\n protected deleteDialogByKey(key: DialogKey) {\n this.sortedList.delete(key);\n }\n\n public deleteDialog(dialog: T) {\n return this.deleteDialogByKey(this.getDialogKey(dialog));\n }\n\n public updateDialog(dialog: T) {\n const key = this.getDialogKey(dialog);\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(key) && this.loadedDialogsAtLeastOnce) {\n this.sortedList.add(key);\n return;\n }\n } else {\n this.deleteDialog(dialog);\n return;\n }\n\n const dialogElement = this.getDialogElement(key);\n if(dialogElement) {\n appDialogsManager.setLastMessageN({\n dialog,\n dialogElement,\n setUnread: true\n });\n this.sortedList.update(key);\n }\n }\n\n public onChatsRegularScroll = () => {\n // return;\n\n if(this.sliceTimeout) clearTimeout(this.sliceTimeout);\n this.sliceTimeout = window.setTimeout(() => {\n this.sliceTimeout = undefined;\n\n if(!this.sortedList.list.childElementCount || appDialogsManager.processContact) {\n return;\n }\n\n /* const observer = new IntersectionObserver((entries) => {\n const\n });\n\n Array.from(this.chatList.children).forEach((el) => {\n observer.observe(el);\n }); */\n\n fastRafConventional(() => {\n const perf = performance.now();\n\n const scrollTopWas = this.scrollable.scrollTop;\n\n const firstElementChild = this.sortedList.list.firstElementChild;\n const rectContainer = this.scrollable.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scrollable.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scrollable.splitUp.offsetTop;\n if(offsetTop && scrollTopWas < offsetTop) offsetTop -= scrollTopWas;\n // const offsetTop = scrollTopWas < padding ? padding - scrollTopWas : 0;\n const firstY = rectContainer.y + offsetTop;\n const lastY = rectContainer.y/* - 8 */; // 8px - .chatlist padding-bottom\n\n const firstElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.ceil(firstY + 1)), firstElementChild.tagName) as HTMLElement;\n const lastElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.floor(lastY + rectContainer.height - 1)), firstElementChild.tagName) as HTMLElement;\n\n // alert('got element:' + rect.y);\n\n if(!firstElement || !lastElement) {\n return;\n }\n\n // alert('got element:' + !!firstElement);\n\n const firstElementRect = firstElement.getBoundingClientRect();\n const elementOverflow = firstElementRect.y - firstY;\n\n const sliced: HTMLElement[] = [];\n const firstIndex = children.indexOf(firstElement);\n const lastIndex = children.indexOf(lastElement);\n\n const saveLength = 10;\n\n const sliceFromStart = IS_SAFARI ? [] : children.slice(0, Math.max(0, firstIndex - saveLength));\n const sliceFromEnd = children.slice(lastIndex + saveLength);\n\n /* if(sliceFromStart.length !== sliceFromEnd.length) {\n console.log('not equal', sliceFromStart.length, sliceFromEnd.length);\n }\n\n if(sliceFromStart.length > sliceFromEnd.length) {\n const diff = sliceFromStart.length - sliceFromEnd.length;\n sliceFromStart.splice(0, diff);\n } else if(sliceFromEnd.length > sliceFromStart.length) {\n const diff = sliceFromEnd.length - sliceFromStart.length;\n sliceFromEnd.splice(sliceFromEnd.length - diff, diff);\n } */\n\n if(sliceFromStart.length) {\n this.scrollable.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scrollable.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach((el) => {\n this.deleteDialogByKey(this.getDialogKeyFromElement(el));\n });\n\n this.setOffsets();\n\n // this.log('[slicer] elements', firstElement, lastElement, rect, sliced, sliceFromStart.length, sliceFromEnd.length);\n\n // this.log('[slicer] reset scrollTop', this.scroll.scrollTop, firstElement.offsetTop, firstElementRect.y, rect.y, elementOverflow);\n\n // alert('left length:' + children.length);\n\n this.scrollable.scrollTop = firstElement.offsetTop - elementOverflow;\n\n this.log('slice time', performance.now() - perf);\n /* const firstElementRect = firstElement.getBoundingClientRect();\n const scrollTop = */\n\n // this.scroll.scrollIntoView(firstElement, false);\n });\n }, 200);\n };\n\n public onChatsScrollTop() {\n return this.onChatsScroll('top');\n };\n\n public onChatsScroll(side: SliceSides = 'bottom') {\n return this.loadDialogs(side);\n };\n\n public createPlaceholder(): DialogsPlaceholder {\n const placeholder = this.placeholder = new DialogsPlaceholder(this.placeholderOptions);\n const getRectFrom = this.getRectFromForPlaceholder();\n placeholder.attach({\n container: this.sortedList.list.parentElement,\n getRectFrom,\n onRemove: () => {\n if(this.placeholder === placeholder) {\n this.placeholder = undefined;\n }\n },\n blockScrollable: this.scrollable\n });\n\n return placeholder;\n }\n\n public loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n\n const log = this.log.bindPrefix('load-' + getUnsafeRandomInt(1000, 9999));\n log('try', side);\n\n if(this.loadDialogsPromise || this.loadDialogsRenderPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n else if(this.scrollable.loadedAll[side]) {\n return Promise.resolve({\n cached: true,\n renderPromise: Promise.resolve()\n });\n }\n\n log.warn('start', side);\n const middlewareError = makeError('MIDDLEWARE');\n\n const cachedInfoPromise = deferredPromise();\n const renderPromise = new Promise(async(resolve, reject) => {\n const chatList = this.sortedList.list;\n\n let placeholder = this.placeholder;\n try {\n const getConversationsResult = this.loadDialogsInner(side);\n const a = await getConversationsResult;\n\n if(\n !chatList.childElementCount &&\n !placeholder &&\n (\n (!this.loadedDialogsAtLeastOnce && this.needPlaceholderAtFirstTime) ||\n !a.cached\n )\n ) {\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n\n placeholder = this.createPlaceholder();\n\n cachedInfoPromise.resolve(false);\n }\n\n const result = await a.result;\n // await pause(5000);\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n\n cachedInfoPromise.resolve(a.cached);\n\n // console.timeEnd('getDialogs time');\n\n // * loaded all\n // if(!result.dialogs.length || chatList.childElementCount === result.count) {\n // !result.dialogs.length не подходит, так как при супердревном диалоге getConversations его не выдаст.\n // if(chatList.childElementCount === result.count) {\n if(side === 'bottom') {\n if(result.isEnd) {\n this.scrollable.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scrollable.loadedAll[side] = true;\n }\n\n const length = result.dialogs.length;\n log(`will render ${length} dialogs`);\n if(length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n\n const loadPromises = dialogs.map((dialog) => {\n return this.sortedList.add(this.getDialogKey(dialog as T));\n });\n\n await Promise.all(loadPromises).catch();\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : length - 1];\n if(offsetDialog) {\n this.offsets[side] = getDialogIndex(offsetDialog, this.indexKey);\n }\n\n // don't set it before - no need to fire length change with every dialog\n this.loadedDialogsAtLeastOnce = true;\n appDialogsManager.onListLengthChange();\n\n log('getDialogs', result, chatList.childElementCount);\n\n setTimeout(() => {\n this.scrollable.onScroll();\n }, 0);\n\n if(placeholder) {\n // await pause(500);\n placeholder.detach(chatList.childElementCount);\n }\n } catch(err) {\n if((err as ApiError)?.type !== 'MIDDLEWARE') {\n log.error(err);\n }\n\n reject(err);\n cachedInfoPromise.reject(err);\n return;\n }\n\n resolve();\n }).finally(() => {\n if(this.loadDialogsRenderPromise === renderPromise) {\n log('end');\n this.loadDialogsRenderPromise = undefined;\n } else {\n log('has been cleared');\n }\n });\n\n this.loadDialogsRenderPromise = renderPromise;\n const loadDialogsPromise = this.loadDialogsPromise = cachedInfoPromise.then((cached) => {\n return {\n cached,\n renderPromise\n };\n }).finally(() => {\n if(this.loadDialogsPromise === loadDialogsPromise) {\n this.loadDialogsPromise = undefined;\n }\n });\n\n return loadDialogsPromise;\n }\n\n public async setOffsets() {\n const chatList = this.sortedList.list;\n const [firstDialog, lastDialog] = await Promise.all([\n this.getDialogFromElement(chatList.firstElementChild as HTMLElement),\n this.getDialogFromElement(chatList.lastElementChild as HTMLElement)\n ]);\n\n const {indexKey} = this;\n this.offsets.top = getDialogIndex(firstDialog, indexKey);\n this.offsets.bottom = getDialogIndex(lastDialog, indexKey);\n }\n\n public getDialogKey(dialog: T): DialogKey {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getDialogKeyFromElement(element: HTMLElement): DialogKey {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getRectFromForPlaceholder(): Parameters[0]['getRectFrom'] {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getDialogFromElement(element: HTMLElement): Promise {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public loadDialogsInner(side: SliceSides): ReturnType {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public async setTyping(dialog: T) {\n const key = this.getDialogKey(dialog);\n const dom = this.getDialogDom(key);\n if(!dom) {\n return;\n }\n\n const oldTypingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n const newTypingElement = await appImManager.getPeerTyping(\n dialog.peerId,\n oldTypingElement,\n dialog._ === 'forumTopic' ? dialog.id : undefined\n );\n if(!oldTypingElement && newTypingElement) {\n replaceContent(dom.lastMessageSpan, newTypingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: T) {\n const key = this.getDialogKey(dialog);\n const dialogElement = this.getDialogElement(key);\n if(!dialogElement) {\n return;\n }\n\n dialogElement.dom.lastMessageSpan.classList.remove('user-typing');\n appDialogsManager.setLastMessageN({\n dialog,\n lastMessage: null,\n dialogElement,\n setUnread: null\n });\n }\n\n public getDialogDom(key: DialogKey) {\n // return this.doms[peerId];\n const element = this.sortedList.get(key);\n return element?.dom;\n }\n\n public getDialogElement(key: DialogKey) {\n const element = this.sortedList.get(key);\n return element?.dialogElement;\n }\n\n public bindScrollable() {\n this.scrollable.container.addEventListener('scroll', this.onChatsRegularScroll);\n this.scrollable.onScrolledTop = this.onChatsScrollTop.bind(this);\n this.scrollable.onScrolledBottom = this.onChatsScroll.bind(this);\n this.scrollable.setVirtualContainer(this.sortedList.list);\n }\n\n public clear() {\n this.sortedList.clear();\n this.placeholder?.remove();\n }\n\n public reset() {\n this.scrollable.loadedAll.top = true;\n this.scrollable.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsRenderPromise = undefined;\n this.loadDialogsPromise = undefined;\n }\n\n public fullReset() {\n this.reset();\n this.clear();\n return this.onChatsScroll();\n }\n\n public destroy() {\n this.clear();\n this.scrollable.destroy();\n this.listenerSetter.removeAll();\n }\n}\n\nclass Some3 extends Some {\n constructor(public peerId: PeerId, public paddingX: number) {\n super();\n\n this.placeholderOptions = {\n avatarSize: 0,\n marginVertical: 5,\n totalHeight: 64\n };\n\n this.listenerSetter.add(rootScope)('peer_typings', async({peerId, threadId, typings}) => {\n if(!threadId || this.peerId !== peerId) {\n return;\n }\n\n const dialog = await this.managers.dialogsStorage.getForumTopic(peerId, threadId);\n\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n for(const [peerId, {dialog, topics}] of dialogs) {\n if(peerId !== this.peerId || !topics?.size) {\n continue;\n }\n\n topics.forEach((forumTopic) => {\n this.updateDialog(forumTopic);\n });\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({dialog}) => {\n if(dialog?._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))});\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', async(dialog) => {\n if(dialog.peerId !== this.peerId) {\n return;\n }\n\n if(dialog._ === 'dialog') {\n const all = this.sortedList.getAll();\n const entries = [...all.entries()];\n const promises = entries.map(([id]) => this.managers.dialogsStorage.getForumTopic(this.peerId, id));\n const topics = await Promise.all(promises);\n entries.forEach(([id, element], idx) => {\n appDialogsManager.setUnreadMessagesN({dialog: topics[idx], dialogElement: element.dialogElement}); // возможно это не нужно, но нужно менять is-muted\n });\n\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))}); // возможно это не нужно, но нужно менять is-muted\n });\n\n this.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(dialog._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n this.deleteDialogByKey(this.getDialogKey(dialog));\n });\n\n this.listenerSetter.add(rootScope)('dialog_draft', ({dialog, drop, peerId}) => {\n if(dialog._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n if(drop) {\n this.deleteDialog(dialog);\n } else {\n this.updateDialog(dialog);\n }\n });\n }\n\n protected isDialogMustBeInViewport(dialog: ForumTopic) {\n if(dialog.pFlags.hidden) return false;\n return super.isDialogMustBeInViewport(dialog);\n }\n\n public getDialogKey(dialog: ForumTopic) {\n return dialog.id;\n }\n\n public getDialogKeyFromElement(element: HTMLElement) {\n return +element.dataset.threadId;\n }\n\n public getRectFromForPlaceholder() {\n return (): DOMRectEditable => {\n const sidebarRect = appSidebarLeft.rect;\n const paddingY = 56;\n return {\n top: paddingY,\n right: sidebarRect.right,\n bottom: 0,\n left: this.paddingX,\n width: sidebarRect.width - this.paddingX,\n height: sidebarRect.height - paddingY\n };\n };\n }\n\n public getDialogFromElement(element: HTMLElement) {\n return this.managers.dialogsStorage.getForumTopic(+element.dataset.peerId, +element.dataset.threadId);\n }\n\n public async loadDialogsInner(side: SliceSides) {\n const {indexKey} = this;\n let loadCount = windowSize.height / 64 * 1.25 | 0;\n let offsetIndex = 0;\n\n const filterId = this.peerId;\n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n offsetIndex = currentOffsetIndex;\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = await this.managers.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex((dialog) => getDialogIndex(dialog, indexKey) <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = getDialogIndex(storage[needIndex], indexKey) + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n\n return this.managers.acknowledged.dialogsStorage.getDialogs({\n offsetIndex,\n limit: loadCount,\n filterId,\n skipMigrated: true\n });\n }\n}\n\nclass Some2 extends Some {\n constructor(protected filterId: number) {\n super();\n\n this.needPlaceholderAtFirstTime = true;\n\n this.listenerSetter.add(rootScope)('peer_typings', async({peerId, typings}) => {\n const [dialog, isForum] = await Promise.all([\n this.managers.appMessagesManager.getDialogOnly(peerId),\n this.managers.appPeersManager.isForum(peerId)\n ]);\n\n if(!dialog || isForum) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', async(userId) => {\n if(!this.isActive) {\n return;\n }\n\n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(!dom) {\n return;\n }\n\n const status = await this.managers.appUsersManager.getUserStatus(userId);\n const online = status?._ === 'userStatusOnline';\n this.setOnlineStatus(dom.avatarEl, online);\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n const peerId = chatId.toPeerId(true);\n this.processDialogForCallStatus(peerId);\n });\n\n this.listenerSetter.add(rootScope)('dialog_flush', ({dialog}) => {\n if(!this.isActive || !dialog) {\n return;\n }\n\n appDialogsManager.setLastMessageN({\n dialog,\n setUnread: true\n });\n this.validateDialogForFilter(dialog);\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(!this.isActive) {\n return;\n }\n\n for(const [peerId, {dialog, topics}] of dialogs) {\n if(dialog?._ !== 'dialog') {\n continue;\n }\n\n this.updateDialog(dialog);\n\n appDialogsManager.processContact?.(peerId.toPeerId());\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(!this.isActive || dialog._ !== 'dialog') {\n return;\n }\n\n this.deleteDialogByKey(dialog.peerId);\n appDialogsManager.processContact?.(dialog.peerId);\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({dialog}) => {\n if(!this.isActive || dialog?._ !== 'dialog') {\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))});\n this.validateDialogForFilter(dialog);\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(!this.isActive || dialog._ === 'forumTopic') {\n return;\n }\n\n this.validateDialogForFilter(dialog);\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))}); // возможно это не нужно, но нужно менять is-muted\n });\n\n this.listenerSetter.add(rootScope)('dialog_draft', ({dialog, drop, peerId}) => {\n if(!this.isActive || dialog._ === 'forumTopic') {\n return;\n }\n\n if(drop) {\n this.deleteDialog(dialog);\n } else {\n this.updateDialog(dialog);\n }\n\n appDialogsManager.processContact?.(peerId);\n });\n\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\n if(this.isActive && filter.id === this.filterId && !REAL_FOLDERS.has(filter.id)) {\n const dialogs = await this.managers.dialogsStorage.getCachedDialogs(true);\n await this.validateListForFilter();\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n this.updateDialog(dialog);\n }\n }\n });\n }\n\n private get isActive() {\n return appDialogsManager.xd === this;\n }\n\n public getRectFromForPlaceholder() {\n return this.filterId === FOLDER_ID_ARCHIVE ? appDialogsManager.chatsContainer : appDialogsManager.folders.container;\n }\n\n public async loadDialogsInner(side: SliceSides) {\n const {filterId, indexKey} = this;\n let loadCount = windowSize.height / 72 * 1.25 | 0;\n let offsetIndex = 0;\n\n const doNotRenderChatList = appDialogsManager.doNotRenderChatList; // cache before awaits\n\n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = await this.managers.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex((dialog) => getDialogIndex(dialog, indexKey) <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = getDialogIndex(storage[needIndex], indexKey) + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n\n const promise = this.managers.acknowledged.dialogsStorage.getDialogs({\n offsetIndex,\n limit: loadCount,\n filterId,\n skipMigrated: true\n });\n\n const a = await promise;\n if(doNotRenderChatList) {\n a.result = Promise.reject(makeError('MIDDLEWARE'));\n }\n\n return a;\n }\n\n public setOnlineStatus(element: HTMLElement, online: boolean) {\n const className = 'is-online';\n const hasClassName = element.classList.contains(className);\n !hasClassName && online && element.classList.add(className);\n SetTransition({\n element: element,\n className: 'is-visible',\n forwards: online,\n duration: 250,\n onTransitionEnd: online ? undefined : () => {\n element.classList.remove(className);\n },\n useRafs: online && !hasClassName ? 2 : 0\n });\n }\n\n public generateScrollable(list: HTMLUListElement, filter: Parameters[0]) {\n const filterId = filter.id;\n const scrollable = new Scrollable(null, 'CL', 500);\n scrollable.container.dataset.filterId = '' + filterId;\n\n const indexKey = getDialogIndexKey(filter.localId);\n const sortedDialogList = new SortedDialogList({\n managers: rootScope.managers,\n log: this.log,\n list: list,\n indexKey,\n onListLengthChange: appDialogsManager.onListLengthChange\n });\n\n this.scrollable = scrollable;\n this.sortedList = sortedDialogList;\n this.setIndexKey(indexKey);\n this.bindScrollable();\n\n // list.classList.add('hide');\n // scrollable.container.style.backgroundColor = '#' + (Math.random() * (16 ** 6 - 1) | 0).toString(16);\n\n return scrollable;\n }\n\n public testDialogForFilter(dialog: Dialog) {\n if(!REAL_FOLDERS.has(this.filterId) ? getDialogIndex(dialog, this.indexKey) === undefined : this.filterId !== dialog.folder_id) {\n return false;\n }\n\n return true;\n }\n\n protected isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\n return super.isDialogMustBeInViewport(dialog);\n }\n\n /**\n * Удалит неподходящие чаты из списка, но не добавит их(!)\n */\n public async validateListForFilter() {\n this.sortedList.getAll().forEach(async(element) => {\n const dialog = await rootScope.managers.appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog);\n }\n });\n }\n\n /**\n * Удалит неподходящий чат из списка, но не добавит его(!)\n */\n public validateDialogForFilter(dialog: Dialog) {\n if(!this.getDialogElement(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog);\n }\n }\n\n public setCallStatus(dom: DialogDom, visible: boolean) {\n let {callIcon, listEl} = dom;\n if(!callIcon && visible) {\n const {canvas, startAnimation} = dom.callIcon = callIcon = groupCallActiveIcon(listEl.classList.contains('active'));\n canvas.classList.add('dialog-group-call-icon');\n listEl.append(canvas);\n startAnimation();\n }\n\n if(!callIcon) {\n return;\n }\n\n SetTransition({\n element: dom.callIcon.canvas,\n className: 'is-visible',\n forwards: visible,\n duration: BADGE_TRANSITION_TIME,\n onTransitionEnd: visible ? undefined : () => {\n dom.callIcon.canvas.remove();\n dom.callIcon = undefined;\n },\n useRafs: visible ? 2 : 0\n });\n }\n\n public async processDialogForCallStatus(peerId: PeerId, dom?: DialogDom) {\n if(!IS_GROUP_CALL_SUPPORTED) {\n return;\n }\n\n if(!dom) dom = this.getDialogDom(peerId);\n if(!dom) return;\n\n const chat = await rootScope.managers.appChatsManager.getChat(peerId.toChatId()) as Chat.chat | Chat.channel;\n this.setCallStatus(dom, !!(chat.pFlags.call_active && chat.pFlags.call_not_empty));\n }\n\n public onChatsScroll(side: SliceSides = 'bottom') {\n if(this.scrollable.loadedAll[side]) {\n appDialogsManager.loadContacts?.();\n }\n\n this.log('onChatsScroll', side);\n return super.onChatsScroll(side);\n }\n\n public toggleAvatarUnreadBadges(value: boolean, useRafs: number) {\n if(!value) {\n this.sortedList.getAll().forEach((sortedDialog) => {\n const {dom, dialogElement} = sortedDialog;\n if(!dom.unreadAvatarBadge) {\n return;\n }\n\n dialogElement.toggleBadgeByKey('unreadAvatarBadge', false, false, false);\n });\n\n return;\n }\n\n const reuseClassNames = ['unread', 'mention'];\n this.sortedList.getAll().forEach((sortedDialog) => {\n const {dom, dialogElement} = sortedDialog;\n const unreadContent = dom.unreadBadge?.textContent;\n if(!unreadContent || dom.unreadBadge.classList.contains('backwards')) {\n return;\n }\n\n const isUnreadAvatarBadgeMounted = !!dom.unreadAvatarBadge;\n dialogElement.createUnreadAvatarBadge();\n dialogElement.toggleBadgeByKey('unreadAvatarBadge', true, isUnreadAvatarBadgeMounted);\n dom.unreadAvatarBadge.textContent = unreadContent;\n const unreadAvatarBadgeClassList = dom.unreadAvatarBadge.classList;\n const unreadBadgeClassList = dom.unreadBadge.classList;\n reuseClassNames.forEach((className) => {\n unreadAvatarBadgeClassList.toggle(className, unreadBadgeClassList.contains(className));\n });\n });\n }\n\n public getDialogKey(dialog: Dialog) {\n return dialog.peerId;\n }\n\n public getDialogKeyFromElement(element: HTMLElement) {\n return +element.dataset.peerId;\n }\n\n public getDialogFromElement(element: HTMLElement) {\n return rootScope.managers.appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n}\n\n// const testScroll = false;\n// let testTopSlice = 1;\n\nexport class AppDialogsManager {\n public chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n\n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu: DialogsContextMenu;\n\n public filterId: number;\n public folders: {[k in 'menu' | 'container' | 'menuScrollContainer']: HTMLElement} = {\n menu: document.getElementById('folders-tabs'),\n menuScrollContainer: null,\n container: document.getElementById('folders-container')\n };\n private filtersRendered: {\n [filterId: string]: {\n menu: HTMLElement,\n container: HTMLElement,\n unread: HTMLElement,\n title: HTMLElement\n }\n } = {};\n private showFiltersPromise: Promise;\n\n private lastActiveElements: Set = new Set();\n\n public loadContacts: () => void;\n public processContact: (peerId: PeerId) => void;\n\n private initedListeners = false;\n\n public onListLengthChange: () => Promise;\n private allChatsIntlElement: I18n.IntlElement;\n\n private emptyDialogsPlaceholderSubtitle: I18n.IntlElement;\n private updateContactsLengthPromise: Promise;\n\n private filtersNavigationItem: NavigationItem;\n\n private managers: AppManagers;\n private selectTab: ReturnType;\n\n public doNotRenderChatList: boolean;\n\n private stateMiddlewareHelper: MiddlewareHelper;\n\n private forumsTabs: Map;\n private forumsSlider: HTMLElement;\n public forumTab: ForumTab;\n private forumNavigationItem: NavigationItem;\n\n public xd: Some2;\n public xds: {[filterId: number]: Some2} = {};\n\n public start() {\n const managers = this.managers = getProxiedManagers();\n\n this.contextMenu = new DialogsContextMenu(managers);\n this.stateMiddlewareHelper = getMiddleware();\n\n this.folders.menuScrollContainer = this.folders.menu.parentElement;\n\n this.onListLengthChange = debounce(this._onListLengthChange, 100, false, true);\n\n const bottomPart = document.createElement('div');\n bottomPart.classList.add('connection-status-bottom');\n bottomPart.append(this.folders.container);\n\n this.forumsTabs = new Map();\n this.forumsSlider = document.createElement('div');\n this.forumsSlider.classList.add('topics-slider');\n this.chatsContainer.parentElement.parentElement.append(this.forumsSlider);\n // findUpClassName(this.chatsContainer, 'chatlist-container').append(this.forumsSlider);\n\n // appSidebarLeft.onOpenTab = () => {\n // return this.toggleForumTab();\n // };\n\n /* if(isTouchSupported && isSafari) {\n let allowUp: boolean, allowDown: boolean, slideBeginY: number;\n const container = this.scroll.container;\n container.addEventListener('touchstart', (event) => {\n allowUp = container.scrollTop > 0;\n allowDown = (container.scrollTop < container.scrollHeight - container.clientHeight);\n // @ts-ignore\n slideBeginY = event.pageY;\n });\n\n container.addEventListener('touchmove', (event: any) => {\n var up = (event.pageY > slideBeginY);\n var down = (event.pageY < slideBeginY);\n slideBeginY = event.pageY;\n if((up && allowUp) || (down && allowDown)) {\n event.stopPropagation();\n } else if(up || down) {\n event.preventDefault();\n }\n });\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.folders.container,\n onSwipe: (xDiff) => {\n const prevId = selectTab.prevId();\n selectTab(xDiff < 0 ? prevId + 1 : prevId - 1);\n },\n verifyTouchTarget: () => {\n return !this.forumTab;\n }\n });\n }\n\n this.allChatsIntlElement = new I18n.IntlElement({\n key: 'FilterAllChatsShort'\n });\n\n rootScope.addEventListener('premium_toggle', async(isPremium) => {\n if(isPremium) {\n return;\n }\n\n const isFolderAvailable = await this.managers.filtersStorage.isFilterIdAvailable(this.filterId);\n if(!isFolderAvailable) {\n selectTab(whichChild(this.filtersRendered[FOLDER_ID_ALL].menu), false);\n }\n });\n\n rootScope.addEventListener('state_cleared', () => {\n const clearCurrent = REAL_FOLDERS.has(this.filterId);\n // setTimeout(() =>\n apiManagerProxy.getState().then(async(state) => {\n this.xd.loadedDialogsAtLeastOnce = false;\n this.showFiltersPromise = undefined;\n\n /* const clearPromises: Promise[] = [];\n for(const name in this.managers.appStateManager.storagesResults) {\n const results = this.managers.appStateManager.storagesResults[name as keyof AppStateManager['storages']];\n const storage = this.managers.appStateManager.storages[name as keyof AppStateManager['storages']];\n results.length = 0;\n clearPromises.push(storage.clear());\n } */\n\n if(clearCurrent) {\n this.xd.clear();\n this.onTabChange();\n }\n\n this.onStateLoaded(state);\n })// , 5000);\n });\n\n this.setFilterId(FOLDER_ID_ALL, FOLDER_ID_ALL);\n this.addFilter({\n id: FOLDER_ID_ALL,\n title: '',\n localId: FOLDER_ID_ALL\n });\n\n const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);\n bottomPart.prepend(this.folders.menuScrollContainer);\n const selectTab = this.selectTab = horizontalMenu(this.folders.menu, this.folders.container, async(id, tabContent) => {\n /* if(id !== 0) {\n id += 1;\n } */\n\n const _id = id;\n id = +tabContent.dataset.filterId || FOLDER_ID_ALL;\n\n const isFilterAvailable = this.filterId === -1 || REAL_FOLDERS.has(id) || await this.managers.filtersStorage.isFilterIdAvailable(id);\n if(!isFilterAvailable) {\n return false;\n }\n\n const wasFilterId = this.filterId;\n if(!IS_MOBILE_SAFARI) {\n if(_id) {\n if(!this.filtersNavigationItem) {\n this.filtersNavigationItem = {\n type: 'filters',\n onPop: () => {\n selectTab(0);\n this.filtersNavigationItem = undefined;\n }\n };\n\n appNavigationController.spliceItems(1, 0, this.filtersNavigationItem);\n }\n } else if(this.filtersNavigationItem) {\n appNavigationController.removeItem(this.filtersNavigationItem);\n this.filtersNavigationItem = undefined;\n }\n }\n\n if(wasFilterId === id) return;\n\n this.xds[id].clear();\n const promise = this.setFilterIdAndChangeTab(id).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n\n if(wasFilterId !== -1) {\n return promise;\n }\n }, () => {\n for(const folderId in this.xds) {\n if(+folderId !== this.filterId) {\n this.xds[folderId].clear();\n }\n }\n }, undefined, foldersScrollable);\n\n apiManagerProxy.getState().then((state) => {\n // * it should've had a better place :(\n appMediaPlaybackController.setPlaybackParams(state.playbackParams);\n appMediaPlaybackController.addEventListener('playbackParams', (params) => {\n this.managers.appStateManager.pushToState('playbackParams', params);\n });\n\n return this.onStateLoaded(state);\n })/* .then(() => {\n const isLoadedMain = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(0);\n const isLoadedArchive = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n const wasLoaded = isLoadedMain || isLoadedArchive;\n const a: Promise = isLoadedMain ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 0);\n const b: Promise = isLoadedArchive ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 1);\n a.finally(() => {\n b.then(() => {\n if(wasLoaded) {\n (apiUpdatesManager.updatesState.syncLoading || Promise.resolve()).then(() => {\n this.managers.appMessagesManager.refreshConversations();\n });\n }\n });\n });\n }) */;\n\n mediaSizes.addEventListener('resize', () => {\n this.changeFiltersAllChatsKey();\n });\n\n new ConnectionStatusComponent(this.managers, this.chatsContainer);\n this.chatsContainer.append(bottomPart);\n\n setTimeout(() => {\n lottieLoader.loadLottieWorkers();\n }, 200);\n\n PopupElement.MANAGERS = rootScope.managers = managers;\n appDownloadManager.construct(managers);\n appSidebarLeft.construct(managers);\n appSidebarRight.construct(managers);\n groupCallsController.construct(managers);\n callsController.construct(managers);\n appImManager.construct(managers);\n\n // start\n\n this.xd = this.xds[this.filterId];\n\n // selectTab(0, false);\n }\n\n public get chatList() {\n return this.xd.sortedList.list;\n }\n\n public setFilterId(filterId: number, localId: MyDialogFilter['localId']) {\n this.filterId = filterId;\n }\n\n public async setFilterIdAndChangeTab(filterId: number) {\n this.filterId = filterId;\n return this.onTabChange();\n }\n\n private initListeners() {\n rootScope.addEventListener('dialog_flush', ({dialog}) => {\n if(!dialog) {\n return;\n }\n\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('folder_unread', async(folder) => {\n if(folder.id < 0) {\n const dialogElement = this.xd.getDialogElement(folder.id);\n if(!dialogElement) {\n return;\n }\n\n this.setUnreadMessagesN({\n dialog: await this.managers.dialogsStorage.getDialogOnly(folder.id),\n dialogElement\n });\n } else {\n this.setFilterUnreadCount(folder.id);\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact?.(userId.toPeerId());\n });\n\n appImManager.addEventListener('peer_changed', ({peerId, threadId, isForum}) => {\n const options: Parameters[0] = {peerId, threadId: isForum ? threadId : undefined};\n // const perf = performance.now();\n for(const element of this.lastActiveElements) {\n const elementThreadId = +element.dataset.threadId || undefined;\n const elementPeerId = element.dataset.peerId.toPeerId();\n if(!appImManager.isSamePeer({peerId: elementPeerId, threadId: elementThreadId}, options)) {\n this.setDialogActive(element, false);\n }\n }\n\n const elements = Array.from(document.querySelectorAll(`[data-autonomous=\"0\"] .chatlist-chat[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n const elementThreadId = +element.dataset.threadId || undefined;\n if(appImManager.isSamePeer({peerId, threadId: elementThreadId}, options)) {\n this.setDialogActive(element, true);\n }\n });\n // this.log('peer_changed total time:', performance.now() - perf);\n });\n\n rootScope.addEventListener('filter_update', async(filter) => {\n if(REAL_FOLDERS.has(filter.id)) {\n return;\n }\n\n if(!this.filtersRendered[filter.id]) {\n this.addFilter(filter);\n return;\n }\n\n const elements = this.filtersRendered[filter.id];\n setInnerHTML(elements.title, wrapEmojiText(filter.title));\n });\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const elements = this.filtersRendered[filter.id];\n if(!elements) return;\n\n // set tab\n // (this.folders.menu.firstElementChild.children[Math.max(0, filter.id - 2)] as HTMLElement).click();\n elements.container.remove();\n elements.menu.remove();\n\n this.xds[filter.id].destroy();\n delete this.xds[filter.id];\n delete this.filtersRendered[filter.id];\n\n this.onFiltersLengthChange();\n\n if(this.filterId === filter.id) {\n this.selectTab(0, false);\n }\n });\n\n rootScope.addEventListener('filter_order', async(order) => {\n order = order.slice();\n indexOfAndSplice(order, FOLDER_ID_ARCHIVE);\n\n const containerToAppend = this.folders.menu as HTMLElement;\n const r = await Promise.all(order.map(async(filterId) => {\n const [indexKey, filter] = await Promise.all([\n this.managers.dialogsStorage.getDialogIndexKeyByFilterId(filterId),\n this.managers.filtersStorage.getFilter(filterId)\n ]);\n\n return {indexKey, filter};\n }));\n\n order.forEach((filterId, idx) => {\n const {indexKey, filter} = r[idx];\n const renderedFilter = this.filtersRendered[filterId];\n\n this.xds[filterId].setIndexKey(indexKey);\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.localId);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.localId);\n });\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n }\n\n public setDialogActive(listEl: HTMLElement, active: boolean) {\n const dom = (listEl as any).dialogDom as DialogDom;\n listEl.classList.toggle('active', active);\n listEl.classList.toggle('is-forum-open', this.forumTab?.peerId === listEl.dataset.peerId.toPeerId() && !listEl.dataset.threadId);\n if(active) {\n this.lastActiveElements.add(listEl);\n } else {\n this.lastActiveElements.delete(listEl);\n }\n\n if(dom?.callIcon) {\n dom.callIcon.setActive(active);\n }\n }\n\n private async onStateLoaded(state: State) {\n this.stateMiddlewareHelper.clean();\n const middleware = this.stateMiddlewareHelper.get();\n const filtersArr = state.filtersArr;\n const haveFilters = filtersArr.length > REAL_FOLDERS.size;\n // const filter = filtersArr.find((filter) => filter.id !== FOLDER_ID_ARCHIVE);\n\n const addFilters = (filters: MyDialogFilter[]) => {\n for(const filter of filters) {\n this.addFilter(filter);\n }\n };\n\n let addFiltersPromise: Promise;\n if(haveFilters) {\n addFilters(filtersArr);\n } else {\n addFiltersPromise = this.managers.filtersStorage.getDialogFilters().then(addFilters);\n }\n\n this.doNotRenderChatList = true;\n const loadDialogsPromise = this.xd.onChatsScroll();\n const m = middlewarePromise(middleware);\n try {\n await m(loadDialogsPromise);\n } catch(err) {\n\n }\n\n // show the placeholder before the filters, and then will reset to the default tab again\n if(!haveFilters) {\n this.selectTab(0, false);\n }\n\n addFiltersPromise && await m(addFiltersPromise);\n // this.folders.menu.children[0].classList.add('active');\n\n this.doNotRenderChatList = undefined;\n\n this.filterId = -1;\n this.selectTab(0, false);\n\n if(!this.initedListeners) {\n this.initListeners();\n this.initedListeners = true;\n }\n\n haveFilters && this.showFiltersPromise && await m(this.showFiltersPromise);\n\n this.managers.appNotificationsManager.getNotifyPeerTypeSettings();\n\n await (await m(loadDialogsPromise)).renderPromise.catch(noop);\n this.managers.appMessagesManager.fillConversations();\n }\n\n /* private getOffset(side: 'top' | 'bottom'): {index: number, pos: number} {\n if(!this.scroll.loadedAll[side]) {\n const element = (side === 'top' ? this.chatList.firstElementChild : this.chatList.lastElementChild) as HTMLElement;\n if(element) {\n const peerId = element.dataset.peerId;\n const dialog = this.managers.appMessagesManager.getDialogByPeerId(peerId);\n return {index: dialog[0].index, pos: dialog[1]};\n }\n }\n\n return {index: 0, pos: -1};\n } */\n\n public onTabChange = () => {\n this.xd = this.xds[this.filterId];\n this.xd.reset();\n return this.xd.onChatsScroll();\n };\n\n private async setFilterUnreadCount(filterId: number) {\n // if(filterId === FOLDER_ID_ALL) {\n // return;\n // }\n\n const unreadSpan = this.filtersRendered[filterId]?.unread;\n if(!unreadSpan) {\n return;\n }\n\n const {unreadUnmutedCount, unreadCount} = await this.managers.dialogsStorage.getFolderUnreadCount(filterId);\n\n unreadSpan.classList.toggle('badge-gray', !unreadUnmutedCount);\n const count = filterId === FOLDER_ID_ALL ? unreadUnmutedCount : unreadCount;\n unreadSpan.innerText = count ? '' + count : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n }\n\n public l(filter: Parameters[0]) {\n const ul = this.createChatList();\n const xd = this.xds[filter.id] = new Some2(filter.id);\n const scrollable = xd.generateScrollable(ul, filter);\n this.setListClickListener(ul, null, true);\n\n return {ul, xd, scrollable};\n }\n\n private addFilter(filter: Pick) {\n if(filter.id === FOLDER_ID_ARCHIVE) {\n return;\n }\n\n const containerToAppend = this.folders.menu as HTMLElement;\n const renderedFilter = this.filtersRendered[filter.id];\n if(renderedFilter) {\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.localId);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.localId);\n return;\n }\n\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const titleSpan = document.createElement('span');\n titleSpan.classList.add('text-super');\n if(filter.id === FOLDER_ID_ALL) titleSpan.append(this.allChatsIntlElement.element);\n else setInnerHTML(titleSpan, wrapEmojiText(filter.title));\n const unreadSpan = document.createElement('div');\n unreadSpan.classList.add('badge', 'badge-20', 'badge-primary');\n const i = document.createElement('i');\n span.append(titleSpan, unreadSpan, i);\n ripple(menuTab);\n menuTab.append(span);\n\n menuTab.dataset.filterId = '' + filter.id;\n\n positionElementByIndex(menuTab, containerToAppend, filter.localId);\n // containerToAppend.append(li);\n\n const {ul, scrollable} = this.l(filter);\n scrollable.container.classList.add('tabs-tab', 'chatlist-parts');\n\n /* const parts = document.createElement('div');\n parts.classList.add('chatlist-parts'); */\n\n const top = document.createElement('div');\n top.classList.add('chatlist-top');\n\n const bottom = document.createElement('div');\n bottom.classList.add('chatlist-bottom');\n\n top.append(ul);\n scrollable.container.append(top, bottom);\n /* parts.append(top, bottom);\n scrollable.container.append(parts); */\n\n const div = scrollable.container;\n // this.folders.container.append(div);\n positionElementByIndex(scrollable.container, this.folders.container, filter.localId);\n\n this.filtersRendered[filter.id] = {\n menu: menuTab,\n container: div,\n unread: unreadSpan,\n title: titleSpan\n };\n\n this.onFiltersLengthChange();\n }\n\n private changeFiltersAllChatsKey() {\n const scrollable = this.folders.menuScrollContainer.firstElementChild;\n const key: LangPackKey = scrollable.scrollWidth > scrollable.clientWidth ? 'FilterAllChatsShort' : 'FilterAllChats';\n this.allChatsIntlElement.compareAndUpdate({key});\n }\n\n private onFiltersLengthChange() {\n let promise = this.showFiltersPromise;\n return promise ??= this.showFiltersPromise = pause(0).then(() => {\n if(this.showFiltersPromise !== promise) {\n return;\n }\n\n const length = Object.keys(this.filtersRendered).length;\n const show = length > 1;\n const wasShowing = !this.folders.menuScrollContainer.classList.contains('hide');\n\n if(show !== wasShowing) {\n this.folders.menuScrollContainer.classList.toggle('hide', !show);\n if(show && !wasShowing) {\n this.setFiltersUnreadCount();\n }\n\n this.chatsContainer.classList.toggle('has-filters', show);\n }\n\n this.changeFiltersAllChatsKey();\n\n this.showFiltersPromise = undefined;\n });\n }\n\n private generateEmptyPlaceholder(options: {\n title: LangPackKey,\n subtitle?: LangPackKey,\n subtitleArgs?: FormatterArguments,\n classNameType: string\n }) {\n const BASE_CLASS = 'empty-placeholder';\n const container = document.createElement('div');\n container.classList.add(BASE_CLASS, BASE_CLASS + '-' + options.classNameType);\n\n const header = document.createElement('div');\n header.classList.add(BASE_CLASS + '-header');\n _i18n(header, options.title);\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(BASE_CLASS + '-subtitle');\n if(options.subtitle) {\n _i18n(subtitle, options.subtitle, options.subtitleArgs);\n }\n\n container.append(header, subtitle);\n\n return {container, header, subtitle};\n }\n\n private checkIfPlaceholderNeeded() {\n if(this.filterId === FOLDER_ID_ARCHIVE) {\n return;\n }\n\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n let placeholderContainer = (Array.from(part.children) as HTMLElement[]).find((el) => el.matches('.empty-placeholder'));\n const needPlaceholder = this.xd.scrollable.loadedAll.bottom && !chatList.childElementCount/* || true */;\n // chatList.style.display = 'none';\n\n if(needPlaceholder && placeholderContainer) {\n return;\n } else if(!needPlaceholder) {\n if(placeholderContainer) {\n part.classList.remove('with-placeholder');\n placeholderContainer.remove();\n }\n\n return;\n }\n\n let placeholder: ReturnType, type: 'dialogs' | 'folder';\n if(!this.filterId) {\n placeholder = this.generateEmptyPlaceholder({\n title: 'ChatList.Main.EmptyPlaceholder.Title',\n classNameType: type = 'dialogs'\n });\n\n placeholderContainer = placeholder.container;\n\n const img = document.createElement('img');\n img.classList.add('empty-placeholder-dialogs-icon');\n\n this.emptyDialogsPlaceholderSubtitle = new I18n.IntlElement({\n element: placeholder.subtitle\n });\n\n Promise.all([\n this.updateContactsLength(false),\n renderImageFromUrlPromise(img, 'assets/img/EmptyChats.svg'),\n fastRafPromise()\n ]).then(([usersLength]) => {\n placeholderContainer.classList.add('visible');\n part.classList.toggle('has-contacts', !!usersLength);\n });\n\n placeholderContainer.prepend(img);\n } else {\n placeholder = this.generateEmptyPlaceholder({\n title: 'FilterNoChatsToDisplay',\n subtitle: 'FilterNoChatsToDisplayInfo',\n classNameType: type = 'folder'\n });\n\n placeholderContainer = placeholder.container;\n\n const div = document.createElement('div');\n const emoji = '📂';\n const size = 128;\n wrapStickerEmoji({\n div,\n emoji: emoji,\n width: size,\n height: size\n });\n\n placeholderContainer.prepend(div);\n\n const button = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'FilterHeaderEdit',\n icon: 'settings'\n });\n\n attachClickEvent(button, async() => {\n const tab = appSidebarLeft.createTab(AppEditFolderTab);\n tab.setInitFilter(await this.managers.filtersStorage.getFilter(this.filterId));\n tab.open();\n });\n\n placeholderContainer.append(button);\n }\n\n part.append(placeholderContainer);\n part.classList.add('with-placeholder');\n part.dataset.placeholderType = type;\n }\n\n private updateContactsLength(updatePartClassName: boolean) {\n return this.updateContactsLengthPromise ??= this.managers.appUsersManager.getContacts().then((users) => {\n const subtitle = this.emptyDialogsPlaceholderSubtitle;\n if(subtitle) {\n let key: LangPackKey, args: FormatterArguments;\n\n if(users.length/* && false */) {\n key = 'ChatList.Main.EmptyPlaceholder.Subtitle';\n args = [i18n('Contacts.Count', [users.length])];\n } else {\n key = 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts';\n args = [];\n }\n\n subtitle.compareAndUpdate({\n key,\n args\n });\n }\n\n if(updatePartClassName) {\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n part.classList.toggle('has-contacts', !!users.length);\n }\n\n this.updateContactsLengthPromise = undefined;\n\n return users.length;\n });\n }\n\n private removeContactsPlaceholder() {\n const chatList = this.chatList;\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n parts.classList.remove('with-contacts');\n bottom.replaceChildren();\n this.loadContacts = undefined;\n this.processContact = undefined;\n }\n\n private _onListLengthChange = () => {\n if(!this.xd.loadedDialogsAtLeastOnce) {\n return;\n }\n\n this.checkIfPlaceholderNeeded();\n\n if(this.filterId !== FOLDER_ID_ALL) return;\n\n const chatList = this.chatList;\n const count = chatList.childElementCount;\n\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n const hasContacts = !!bottom.childElementCount;\n if(count >= 10) {\n if(hasContacts) {\n this.removeContactsPlaceholder();\n }\n\n return;\n } else if(hasContacts) return;\n\n parts.classList.add('with-contacts');\n\n const section = new SettingSection({\n name: 'Contacts',\n noDelimiter: true,\n fakeGradientDelimiter: true\n });\n\n section.container.classList.add('hide');\n\n this.managers.appUsersManager.getContactsPeerIds(undefined, undefined, 'online').then((contacts) => {\n let ready = false;\n const onListLengthChange = () => {\n if(ready) {\n section.container.classList.toggle('hide', !sortedUserList.list.childElementCount);\n }\n\n this.updateContactsLength(true);\n };\n\n const sortedUserList = new SortedUserList({\n avatarSize: 'abitbigger',\n createChatListOptions: {\n dialogSize: 48,\n new: true\n },\n autonomous: false,\n onListLengthChange,\n managers: this.managers\n });\n\n this.loadContacts = () => {\n const pageCount = windowSize.height / 60 | 0;\n const promise = filterAsync(contacts.splice(0, pageCount), this.verifyPeerIdForContacts);\n\n promise.then((arr) => {\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n });\n\n if(!contacts.length) {\n this.loadContacts = undefined;\n }\n };\n\n this.loadContacts();\n\n this.processContact = async(peerId) => {\n if(peerId.isAnyChat()) {\n return;\n }\n\n const good = await this.verifyPeerIdForContacts(peerId);\n const added = sortedUserList.has(peerId);\n if(!added && good) sortedUserList.add(peerId);\n else if(added && !good) sortedUserList.delete(peerId);\n };\n\n const list = sortedUserList.list;\n list.classList.add('chatlist-new');\n this.setListClickListener(list);\n section.content.append(list);\n\n ready = true;\n onListLengthChange();\n });\n\n bottom.append(section.container);\n };\n\n private verifyPeerIdForContacts = async(peerId: PeerId) => {\n const [isContact, dialog] = await Promise.all([\n this.managers.appPeersManager.isContact(peerId),\n this.managers.appMessagesManager.getDialogOnly(peerId)\n ]);\n\n return isContact && !dialog;\n };\n\n public async toggleForumTab(newTab?: ForumTab, hideTab = this.forumTab) {\n if(!hideTab && !newTab) {\n return;\n }\n\n if(hideTab) {\n const dialogElement = this.xd.getDialogElement(hideTab.peerId);\n if(dialogElement) {\n dialogElement.dom.listEl.classList.remove('is-forum-open');\n }\n }\n\n if(hideTab === newTab) {\n newTab = undefined;\n }\n\n hideTab?.toggle(false);\n const promise = newTab?.toggle(true);\n if(hideTab === this.forumTab) {\n this.forumTab = newTab;\n }\n\n if(newTab) {\n const dialogElement = this.xd.getDialogElement(newTab.peerId);\n if(dialogElement) {\n dialogElement.dom.listEl.classList.add('is-forum-open');\n }\n\n appImManager.selectTab(APP_TABS.CHATLIST);\n }\n\n if(promise) {\n await promise;\n }\n\n if(newTab && !this.forumNavigationItem) {\n this.forumNavigationItem = {\n type: 'forum',\n onPop: () => {\n this.forumNavigationItem = undefined;\n this.toggleForumTab();\n }\n };\n\n appNavigationController.pushItem(this.forumNavigationItem);\n } else if(!newTab && this.forumNavigationItem) {\n appNavigationController.removeItem(this.forumNavigationItem);\n this.forumNavigationItem = undefined;\n }\n\n const forwards = !!newTab;\n const useRafs = promise ? 2 : undefined;\n this.xd.toggleAvatarUnreadBadges(forwards, useRafs);\n\n const deferred = deferredPromise();\n const duration = 300;\n SetTransition({\n element: this.forumsSlider.parentElement,\n className: 'is-forum-visible',\n duration,\n forwards,\n useRafs,\n onTransitionEnd: () => {\n deferred.resolve();\n }\n });\n\n dispatchHeavyAnimationEvent(deferred, duration).then(() => deferred.resolve());\n }\n\n public toggleForumTabByPeerId(peerId: PeerId, show?: boolean) {\n const {managers} = this;\n const history = appSidebarLeft.getHistory();\n const lastTab = history[history.length - 1];\n let forumTab: ForumTab;\n if(lastTab/* && !(lastTab instanceof AppArchivedTab) */) {\n if(lastTab instanceof ForumTab && lastTab.peerId === peerId && show) {\n shake(lastTab.container);\n return;\n }\n\n forumTab = appSidebarLeft.createTab(ForumTab);\n forumTab.open({peerId, managers});\n return;\n }\n\n forumTab = this.forumsTabs.get(peerId);\n const isSameTab = this.forumTab && this.forumTab === forumTab;\n show ??= !isSameTab;\n if(show === isSameTab) {\n if(show) {\n shake(forumTab.container);\n }\n\n return;\n }\n\n if(show && !forumTab) {\n forumTab = new ForumTab(undefined);\n forumTab.init({peerId, managers});\n\n this.forumsTabs.set(peerId, forumTab);\n this.forumsSlider.append(forumTab.container);\n\n forumTab.managers = this.managers;\n forumTab.eventListener.addEventListener('destroy', () => {\n this.forumsTabs.delete(peerId);\n });\n }\n\n return this.toggleForumTab(forumTab);\n }\n\n public setListClickListener(\n list: HTMLUListElement,\n onFound?: () => void,\n withContext = false,\n autonomous = false,\n openInner = false\n ) {\n let lastActiveListElement: HTMLElement;\n\n const setPeerFunc = (openInner ? appImManager.setInnerPeer : appImManager.setPeer).bind(appImManager);\n\n list.dataset.autonomous = '' + +autonomous;\n list.addEventListener('mousedown', (e) => {\n if(e.button !== 0) return;\n\n this.log('dialogs click list');\n const target = e.target as HTMLElement;\n const elem = findUpTag(target, DIALOG_LIST_ELEMENT_TAG);\n\n if(!elem) {\n return;\n }\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n const threadId = +elem.dataset.threadId || undefined;\n\n onFound?.();\n\n const isForum = !!elem.querySelector('.is-forum');\n if(isForum && !e.shiftKey && !lastMsgId) {\n this.toggleForumTabByPeerId(peerId);\n return;\n }\n\n if(e.ctrlKey || e.metaKey) {\n window.open((elem as HTMLAnchorElement).href || ('#' + peerId), '_blank');\n cancelEvent(e);\n return;\n }\n\n if(autonomous) {\n const sameElement = lastActiveListElement === elem;\n if(lastActiveListElement && !sameElement) {\n lastActiveListElement.classList.remove('active');\n }\n\n if(elem) {\n elem.classList.add('active');\n lastActiveListElement = elem;\n this.lastActiveElements.add(elem);\n }\n }\n\n if(\n (!threadId || lastMsgId) &&\n this.xd.sortedList.list === list &&\n this.xd !== this.xds[FOLDER_ID_ARCHIVE]\n ) {\n this.toggleForumTab();\n }\n\n setPeerFunc({\n peerId,\n lastMsgId,\n threadId: threadId\n });\n }, {capture: true});\n\n // cancel link click\n // ! do not change it to attachClickEvent\n list.addEventListener('click', (e) => {\n if(e.button === 0) {\n cancelEvent(e);\n }\n }, {capture: true});\n\n if(withContext) {\n attachContextMenuListener({\n element: list,\n callback: this.contextMenu.onContextMenu\n });\n }\n }\n\n public createChatList(options: {\n // avatarSize?: number,\n // handheldsSize?: number,\n // size?: number,\n new?: boolean,\n dialogSize?: number,\n ignoreClick?: boolean\n } = {}) {\n const list = document.createElement('ul');\n list.classList.add('chatlist'/* ,\n 'chatlist-avatar-' + (options.avatarSize || 54) *//* , 'chatlist-' + (options.size || 72) */);\n\n if(options.new) {\n list.classList.add('chatlist-new');\n }\n\n if(options.dialogSize) {\n list.classList.add('chatlist-' + options.dialogSize);\n }\n\n // if(options.ignoreClick) {\n // list.classList.add('disable-hover');\n // }\n\n /* if(options.handheldsSize) {\n list.classList.add('chatlist-handhelds-' + options.handheldsSize);\n } */\n\n return list;\n }\n\n public setLastMessageN(options: Parameters[0]) {\n const promise = this.setLastMessage(options);\n return promise.catch((err: ApiError) => {\n if(err?.type !== 'MIDDLEWARE') {\n this.log.error('set last message error', err);\n }\n });\n }\n\n private async setLastMessage({\n dialog,\n lastMessage,\n dialogElement,\n highlightWord,\n isBatch = false,\n setUnread = false\n }: {\n dialog: Dialog | ForumTopic,\n lastMessage?: Message.message | Message.messageService,\n dialogElement?: DialogElement,\n highlightWord?: string,\n isBatch?: boolean,\n setUnread?: boolean\n }) {\n if(!dialogElement) {\n dialogElement = this.xd.getDialogElement(dialog.peerId);\n\n if(!dialogElement) {\n return;\n }\n }\n\n const {dom} = dialogElement;\n const {peerId} = dialog;\n\n const {deferred: promise, middleware} = setPromiseMiddleware(dom, 'setLastMessagePromise');\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(\n dialog.draft?._ === 'draftMessage' && (\n !peerId.isAnyChat() ||\n dialog._ === 'forumTopic' ||\n !(await this.managers.appPeersManager.isForum(peerId))\n )\n ) {\n draftMessage = dialog.draft;\n }\n\n lastMessage = (dialog as Dialog).topMessage;\n if(lastMessage?.mid !== dialog.top_message) {\n const promise = this.managers.appMessagesManager.getMessageByPeer(peerId, dialog.top_message);\n lastMessage = await middleware(promise);\n }\n }\n\n // * do not uncomment next line - unsetTyping right after this call will interrupt setting unread badges\n // if(setUnread) {\n this.setUnreadMessagesN({dialog, dialogElement, isBatch, setLastMessagePromise: promise});\n // }\n\n if(!lastMessage/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.replaceChildren();\n dom.lastTimeSpan.replaceChildren();\n delete dom.listEl.dataset.mid;\n\n promise.resolve();\n return;\n }\n\n const isRestricted = lastMessage && isMessageRestricted(lastMessage as Message.message);\n\n /* if(!dom.lastMessageSpan.classList.contains('user-typing')) */ {\n let mediaContainer: HTMLElement;\n const willPrepend: (Promise | HTMLElement)[] = [];\n if(lastMessage && !draftMessage && !isRestricted) {\n const media: MyDocument | MyPhoto = getMediaFromMessage(lastMessage);\n const videoTypes: Set = new Set(['video', 'gif', 'round']);\n if(media && (media._ === 'photo' || videoTypes.has(media.type))) {\n const size = choosePhotoSize(media, 20, 20);\n\n if(size._ !== 'photoSizeEmpty') {\n mediaContainer = document.createElement('div');\n mediaContainer.classList.add('dialog-subtitle-media');\n\n if((media as MyDocument).type === 'round') {\n mediaContainer.classList.add('is-round');\n }\n\n willPrepend.push(wrapPhoto({\n photo: media,\n message: lastMessage,\n container: mediaContainer,\n withoutPreloader: true,\n size\n }).then(() => mediaContainer));\n\n if(videoTypes.has((media as MyDocument).type)) {\n const playIcon = document.createElement('span');\n playIcon.classList.add('tgico-play');\n\n mediaContainer.append(playIcon);\n }\n }\n }\n }\n\n /* if(lastMessage.from_id === auth.id) { // You: */\n if(draftMessage) {\n const span = document.createElement('span');\n span.classList.add('danger');\n span.append(i18n('Draft'), ': ');\n willPrepend.unshift(span);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !(lastMessage as Message.messageService).action) {\n const span = document.createElement('span');\n span.classList.add('primary-text');\n\n if(lastMessage.fromId === rootScope.myId) {\n span.append(i18n('FromYou'));\n willPrepend.unshift(span);\n } else {\n // str = sender.first_name || sender.last_name || sender.username;\n const p = middleware(wrapPeerTitle({\n peerId: lastMessage.fromId,\n onlyFirstName: true\n })).then((element) => {\n span.prepend(element);\n return span;\n }, noop);\n\n willPrepend.unshift(p);\n }\n\n span.append(': ');\n // console.log(sender, senderBold.innerText);\n }\n\n const withoutMediaType = !!mediaContainer && !!(lastMessage as Message.message)?.message;\n\n let fragment: DocumentFragment;\n if(highlightWord && (lastMessage as Message.message).message) {\n fragment = await middleware(wrapMessageForReply({message: lastMessage, highlightWord, withoutMediaType}));\n } else if(draftMessage) {\n fragment = await middleware(wrapMessageForReply({message: draftMessage}));\n } else if(lastMessage) {\n fragment = await middleware(wrapMessageForReply({message: lastMessage, withoutMediaType}));\n } else { // rare case\n fragment = document.createDocumentFragment();\n }\n\n if(willPrepend.length) {\n const elements = await middleware(Promise.all(willPrepend));\n fragment.prepend(...elements);\n }\n\n replaceContent(dom.lastMessageSpan, fragment);\n }\n\n if(lastMessage || draftMessage/* && lastMessage._ !== 'draftMessage' */) {\n const date = draftMessage ? Math.max(draftMessage.date, lastMessage.date || 0) : lastMessage.date;\n replaceContent(dom.lastTimeSpan, formatDateAccordingToTodayNew(new Date(date * 1000)));\n } else dom.lastTimeSpan.textContent = '';\n\n if(setUnread !== null && !setUnread) { // means search\n dom.listEl.dataset.mid = '' + lastMessage.mid;\n\n const replyTo = lastMessage.reply_to;\n if(replyTo?.pFlags?.forum_topic) {\n dom.listEl.dataset.threadId = '' + getMessageThreadId(lastMessage);\n }\n }\n\n promise.resolve();\n }\n\n public setUnreadMessagesN(options: Parameters[0]) {\n return this.setUnreadMessages(options).catch(() => {});\n }\n\n private async setUnreadMessages({\n dialog,\n dialogElement,\n isBatch = false,\n setLastMessagePromise\n }: {\n dialog: Dialog | ForumTopic,\n dialogElement: DialogElement,\n isBatch?: boolean,\n setLastMessagePromise?: Promise\n }) {\n const {dom} = dialogElement;\n if(!dom) {\n // this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n const isTopic = dialog._ === 'forumTopic';\n\n const {deferred, middleware} = setPromiseMiddleware(dom, 'setUnreadMessagePromise');\n\n const {peerId} = dialog;\n const promises = Promise.all([\n this.managers.appNotificationsManager.isPeerLocalMuted({peerId: peerId, respectType: true, threadId: isTopic ? dialog.id : undefined}),\n dialog.draft?._ !== 'draftMessage' ? this.managers.appMessagesManager.getMessageByPeer(peerId, dialog.top_message) : undefined,\n isTopic ? !!dialog.pFlags.pinned : this.managers.dialogsStorage.isDialogPinned(peerId, this.filterId),\n this.managers.appMessagesManager.isDialogUnread(dialog),\n peerId.isAnyChat() && !isTopic ? this.managers.acknowledged.dialogsStorage.getForumUnreadCount(peerId).then((result) => {\n if(result.cached) {\n return result.result;\n } else {\n result.result.then(() => {\n this.setUnreadMessagesN({dialog, dialogElement});\n });\n\n return {count: 0, hasUnmuted: false};\n }\n }).catch(() => undefined as {count: number, hasUnmuted: boolean}) : undefined\n ]);\n\n let [isMuted, lastMessage, isPinned, isDialogUnread, forumUnreadCount] = await middleware(promises);\n const wasMuted = dom.listEl.classList.contains('is-muted');\n\n const {count: unreadTopicsCount, hasUnmuted: hasUnmutedTopic} = forumUnreadCount || {};\n\n let setStatusMessage: MyMessage;\n if(lastMessage && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n\n const unreadCount = unreadTopicsCount ?? dialog.unread_count;\n if(unreadTopicsCount !== undefined) {\n isDialogUnread = !!unreadCount;\n }\n\n if(isTopic && !isDialogUnread) {\n isDialogUnread = !getServerMessageId(dialog.read_inbox_max_id);\n }\n\n const hasUnreadBadge = isPinned || isDialogUnread;\n const hasUnreadAvatarBadge = this.xd !== this.xds[FOLDER_ID_ARCHIVE] && !isTopic && !!this.forumTab && this.xd.getDialogElement(peerId) === dialogElement && isDialogUnread;\n // dom.messageEl.classList.toggle('has-badge', hasBadge);\n\n // * have to await all promises before modifying something\n\n if(setLastMessagePromise) {\n try {\n await middleware(setLastMessagePromise);\n } catch(err) {\n return;\n }\n }\n\n const transitionDuration = isBatch ? 0 : BADGE_TRANSITION_TIME;\n\n dom.listEl.classList.toggle('no-unmuted-topic', !isMuted && hasUnmutedTopic !== undefined && !hasUnmutedTopic);\n\n if(isMuted !== wasMuted) {\n SetTransition({\n element: dom.listEl,\n className: 'is-muted',\n forwards: isMuted,\n duration: transitionDuration\n });\n }\n\n setSendingStatus(dom.statusSpan, isTopic && dialog.pFlags.closed ? 'premium_lock' : setStatusMessage, true);\n\n // if(isTopic) {\n // dom.statusSpan.parentElement.classList.toggle('is-closed', !!dialog.pFlags.closed);\n // }\n\n const isUnreadBadgeMounted = !!dom.unreadBadge;\n if(hasUnreadBadge) {\n dialogElement.createUnreadBadge();\n }\n\n const isUnreadAvatarBadgeMounted = !!dom.unreadAvatarBadge;\n if(hasUnreadAvatarBadge) {\n dialogElement.createUnreadAvatarBadge();\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionsBadgeMounted = !!dom.mentionsBadge;\n if(hasMentionsBadge) {\n dialogElement.createMentionsBadge();\n }\n\n const a: [Parameters[0], boolean, boolean][] = [\n ['unreadBadge', hasUnreadBadge, isUnreadBadgeMounted],\n ['unreadAvatarBadge', hasUnreadAvatarBadge, isUnreadAvatarBadgeMounted],\n ['mentionsBadge', hasMentionsBadge, isMentionsBadgeMounted]\n ];\n\n a.forEach(([key, hasBadge, isBadgeMounted]) => {\n const badge = dom[key];\n if(!badge) {\n return;\n }\n\n dialogElement.toggleBadgeByKey(key, hasBadge, isBadgeMounted, isBatch);\n });\n\n if(!hasUnreadBadge) {\n deferred.resolve();\n return;\n }\n\n if(isPinned) {\n dom.unreadBadge.classList.add('tgico-chatspinned', 'tgico');\n } else if(dom.unreadBadge) {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false, unreadBadgeText: string;\n if(dialog.unread_mentions_count && unreadCount === 1) {\n unreadBadgeText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n // dom.unreadMessagesSpan.innerText = '' + (unreadCount ? formatNumber(unreadCount, 1) : ' ');\n unreadBadgeText = '' + (unreadCount ? formatNumber(unreadCount, 1) : ' ');\n } else {\n unreadBadgeText = '';\n isUnread = false;\n }\n\n if(isTopic) {\n const notVisited = isDialogUnread && unreadBadgeText === ' ';\n dom.unreadBadge.classList.toggle('not-visited', notVisited);\n }\n\n const b: Array<[HTMLElement, string]> = [\n [dom.unreadBadge, unreadBadgeText],\n [dom.unreadAvatarBadge, unreadBadgeText || undefined]\n ];\n\n b.filter(Boolean).forEach(([badge, text]) => {\n if(text !== undefined) {\n badge.innerText = unreadBadgeText;\n }\n\n badge.classList.toggle('unread', isUnread);\n badge.classList.toggle('mention', isMention);\n });\n\n deferred.resolve();\n }\n\n private async getDialog(dialog: Dialog | ForumTopic | PeerId, threadId?: number) {\n if(typeof(dialog) !== 'object') {\n let originalDialog: Dialog | ForumTopic;\n if(threadId) {\n originalDialog = await this.managers.dialogsStorage.getForumTopic(dialog, threadId);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n pFlags: {}\n } as any as ForumTopic;\n }\n } else {\n originalDialog = await this.managers.appMessagesManager.getDialogOnly(dialog);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n peer: await this.managers.appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } as any as Dialog;\n }\n }\n\n return originalDialog;\n }\n\n return dialog as Dialog | ForumTopic;\n }\n\n public addListDialog(options: Parameters[0] & {isBatch?: boolean}) {\n options.autonomous = false;\n\n const ret = this.addDialogNew(options);\n\n if(ret) {\n const {peerId} = options;\n const getDialogPromise = this.getDialog(peerId, options.threadId);\n const promise = getDialogPromise.then((dialog) => {\n const promises: Promise[] = [];\n const isUser = peerId.isUser();\n if(!isUser && dialog._ === 'dialog') {\n promises.push(this.xd.processDialogForCallStatus(peerId, ret.dom));\n }\n\n if(peerId !== rootScope.myId && isUser) {\n promises.push(this.managers.appUsersManager.getUserStatus(peerId.toUserId()).then((status) => {\n if(status?._ === 'userStatusOnline') {\n this.xd.setOnlineStatus(ret.dom.avatarEl, true);\n }\n }));\n }\n\n promises.push(this.setLastMessageN({\n dialog,\n dialogElement: ret,\n isBatch: options.isBatch,\n setUnread: true\n }));\n\n return Promise.all(promises);\n });\n\n options.loadPromises?.push(promise);\n }\n\n return ret;\n }\n\n /**\n * use for rendering search result\n */\n public addDialogAndSetLastMessage(options: Omit[0], 'dialog'> & {\n message: MyMessage,\n peerId: PeerId,\n query?: string\n }) {\n const {peerId, message, query} = options;\n const ret = this.addDialogNew({\n ...options,\n ...getMessageSenderPeerIdOrName(message),\n peerId\n });\n\n this.setLastMessageN({\n dialog: {_: 'dialog', peerId} as any,\n lastMessage: message,\n dialogElement: ret,\n highlightWord: query\n });\n\n if(message.peerId !== peerId) {\n ret.dom.listEl.dataset.peerId = '' + message.peerId;\n }\n\n return ret;\n }\n\n public addDialogNew(options: DialogElementOptions & {container?: HTMLElement | Scrollable | false, append?: boolean}) {\n const d = new DialogElement({\n autonomous: !!options.container,\n avatarSize: 'bigger',\n ...options\n // avatarSize: !options.avatarSize || options.avatarSize >= 54 ? 'bigger' : 'abitbigger',\n });\n\n if(options.container) {\n const method = !options.append ? 'append' : 'prepend';\n options.container[method](d.container);\n }\n\n return d;\n // return this.addDialog(options.peerId, options.container, options.rippleEnabled, options.onlyFirstName, options.meAsSaved, options.append, options.avatarSize, options.autonomous, options.lazyLoadQueue, options.loadPromises, options.fromName, options.noIcons);\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\n","export default function getUnsafeRandomInt(min: number, max: number) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {DownloadMediaOptions, DownloadOptions} from '../mtproto/apiFileManager';\nimport type {AppMessagesManager} from './appMessagesManager';\nimport type {MyDocument} from './appDocsManager';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {InputFile, Photo, PhotoSize} from '../../layer';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport {AppManagers} from './managers';\nimport rootScope from '../rootScope';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport noop from '../../helpers/noop';\nimport getDownloadMediaDetails from './utils/download/getDownloadMediaDetails';\nimport getDownloadFileNameFromOptions from './utils/download/getDownloadFileNameFromOptions';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport makeError from '../../helpers/makeError';\nimport createDownloadAnchor from '../../helpers/dom/createDownloadAnchor';\nimport {getFileNameByLocation} from '../../helpers/fileName';\nimport getDocumentDownloadOptions from './utils/docs/getDocumentDownloadOptions';\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\n\nexport type ResponseMethodBlob = 'blob';\nexport type ResponseMethodJson = 'json';\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\n\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\nexport type DownloadBlob = CancellablePromise;\nexport type DownloadUrl = CancellablePromise;\nexport type DownloadJson = CancellablePromise;\n// export type Download = DownloadBlob/* | DownloadJson */;\nexport type Download = DownloadBlob | DownloadUrl/* | DownloadJson */;\n\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\nexport type ProgressCallback = (details: Progress) => void;\n\ntype DownloadType = 'url' | 'blob' | 'void' | 'disc';\n\nexport class AppDownloadManager {\n private downloads: {[fileName: string]: {main: Download} & {[type in DownloadType]?: Download}} = {};\n // private downloadsToDisc: {[fileName: string]: Download} = {};\n private progress: {[fileName: string]: Progress} = {};\n // private progressCallbacks: {[fileName: string]: Array} = {};\n private managers: AppManagers;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n rootScope.addEventListener('download_progress', (details) => {\n // const callbacks = this.progressCallbacks[details.fileName];\n // if(callbacks) {\n // callbacks.forEach((callback) => callback(details));\n // }\n\n const download = this.downloads[details.fileName];\n if(download?.main?.notifyAll) {\n this.progress[details.fileName] = details;\n download.main.notifyAll(details);\n }\n });\n }\n\n private getNewDeferred(fileName: string, type?: DownloadType) {\n const deferred = deferredPromise();\n\n let download = this.downloads[fileName];\n if(!download) {\n download = this.downloads[fileName] = {\n main: deferred as any\n };\n\n deferred.cancel = () => {\n const error = makeError('DOWNLOAD_CANCELED');\n\n this.managers.apiFileManager.cancelDownload(fileName);\n\n deferred.reject(error);\n deferred.cancel = noop;\n };\n\n deferred.catch(() => {\n this.clearDownload(fileName, type);\n }).finally(() => {\n delete this.progress[fileName];\n // delete this.progressCallbacks[fileName];\n });\n } else {\n const main = download.main;\n (['cancel', 'addNotifyListener', 'notify', 'notifyAll'] as (keyof CancellablePromise)[]).forEach((key) => {\n if(!main[key]) {\n return;\n }\n\n // @ts-ignore\n deferred[key] = main[key].bind(main);\n });\n }\n\n const haveToClear = type === 'disc';\n if(haveToClear) {\n deferred.catch(noop).finally(() => {\n this.clearDownload(fileName, type);\n });\n }\n\n return download[type] = deferred as any;\n }\n\n public getNewDeferredForUpload>(fileName: string, promise: T) {\n const deferred = this.getNewDeferred(fileName);\n promise.then(deferred.resolve, deferred.reject);\n\n deferred.finally(() => {\n this.clearDownload(fileName);\n });\n\n return deferred as CancellablePromise>;\n }\n\n private clearDownload(fileName: string, type?: DownloadType) {\n const downloads = this.downloads[fileName];\n if(!downloads) {\n return;\n }\n\n delete downloads[type];\n\n const length = Object.keys(downloads).length;\n if(!length || (downloads.main && length === 1)) {\n delete this.downloads[fileName];\n }\n }\n\n public getUpload(fileName: string): ReturnType['promise'] {\n let deferred: CancellablePromise = this.getDownload(fileName);\n if(deferred) {\n return deferred;\n }\n\n deferred = this.getNewDeferred(fileName);\n this.managers.appMessagesManager.getUploadPromise(fileName).then(deferred.resolve, deferred.reject);\n return deferred;\n }\n\n /* public fakeDownload(fileName: string, value: Blob | string) {\n const deferred = this.getNewDeferred(fileName);\n if(typeof(value) === 'string') {\n fetch(value)\n .then((response) => response.blob())\n .then((blob) => deferred.resolve(blob));\n } else {\n deferred.resolve(value);\n }\n\n return deferred;\n } */\n\n private d(fileName: string, getPromise: () => Promise, type?: DownloadType) {\n let deferred = this.getDownload(fileName, type);\n if(deferred) return deferred;\n\n deferred = this.getNewDeferred(fileName, type);\n getPromise().then(deferred.resolve, deferred.reject);\n return deferred;\n }\n\n public download(options: DownloadOptions): DownloadBlob {\n const fileName = getDownloadFileNameFromOptions(options);\n return this.d(fileName, () => this.managers.apiFileManager.download(options), 'blob') as any;\n }\n\n public downloadMedia(options: DownloadMediaOptions, type: DownloadType = 'blob', promiseBefore?: Promise): DownloadBlob {\n const {downloadOptions, fileName} = getDownloadMediaDetails(options);\n\n return this.d(fileName, () => {\n let cb: any;\n if(type === 'url') {\n cb = this.managers.apiFileManager.downloadMediaURL;\n } else if(type === 'void'/* || type === 'disc' */) {\n cb = this.managers.apiFileManager.downloadMediaVoid;\n } else /* if(type === 'blob') */ {\n cb = this.managers.apiFileManager.downloadMedia;\n }\n\n if(promiseBefore) {\n return promiseBefore.then(() => cb(options));\n }\n\n return cb(options);\n }, type) as any;\n }\n\n public downloadMediaURL(options: DownloadMediaOptions): DownloadUrl {\n return this.downloadMedia(options, 'url') as any;\n }\n\n public downloadMediaVoid(options: DownloadMediaOptions): DownloadBlob {\n return this.downloadMedia(options, 'void');\n }\n\n public upload(file: File | Blob, fileName?: string, promise?: Promise) {\n if(!fileName) {\n fileName = getFileNameForUpload(file);\n }\n\n if(!promise) {\n promise = this.managers.apiFileManager.upload({file, fileName});\n }\n\n const deferred = this.getNewDeferredForUpload(fileName, promise);\n return deferred as any as CancellablePromise;\n }\n\n public getDownload(fileName: string, type?: DownloadType) {\n const d = this.downloads[fileName];\n return d && d[type];\n }\n\n // public addProgressCallback(fileName: string, callback: ProgressCallback) {\n // const progress = this.progress[fileName];\n // (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\n\n // if(progress) {\n // callback(progress);\n // }\n // }\n\n public downloadToDisc(options: DownloadMediaOptions, justAttach?: boolean) {\n const media = options.media;\n const isDocument = media._ === 'document';\n if(!isDocument && !options.thumb) {\n options.thumb = (media as Photo.photo).sizes.slice().pop() as PhotoSize.photoSize;\n }\n\n // const {fileName: cacheFileName} = getDownloadMediaDetails(options);\n // if(justAttach) {\n // const promise = this.downloadsToDisc[cacheFileName];\n // if(promise) {\n // return promise;\n // }\n // }\n\n // const {downloadOptions, fileName} = getDownloadMediaDetails(options);\n // if(downloadOptions.size && downloadOptions.size > MAX_FILE_SAVE_SIZE) {\n const id = '' + (Math.random() * 0x7FFFFFFF | 0);\n // const id = 'test';\n const url = `download/${id}`;\n options.downloadId = id;\n\n const pingPromise = apiManagerProxy.pingServiceWorkerWithIframe();\n\n const promise = this.downloadMedia(options, 'disc', pingPromise);\n // this.downloadsToDisc[cacheFileName] = promise;\n\n if(justAttach) {\n return promise;\n }\n\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n\n pingPromise.then(() => {\n iframe.src = url;\n document.body.append(iframe);\n });\n\n // createDownloadAnchor(url, 'asd.txt');\n\n // const events = [\n // 'emptied',\n // 'abort',\n // 'suspend',\n // 'reset',\n // 'error',\n // 'ended',\n // 'load'\n // ].forEach((event) => {\n // iframe.addEventListener(event, () => alert(event));\n // iframe.contentWindow.addEventListener(event, () => alert(event));\n // });\n\n let element: HTMLElement, hadProgress = false;\n const onProgress = () => {\n if(hadProgress) {\n return;\n }\n\n hadProgress = true;\n element = iframe;\n\n indexOfAndSplice(promise.listeners, onProgress);\n };\n\n promise.addNotifyListener(onProgress);\n promise.then((blob) => {\n if(!blob) {\n return;\n }\n\n const url = URL.createObjectURL(blob);\n const downloadOptions = isDocument ?\n getDocumentDownloadOptions(media) :\n getPhotoDownloadOptions(media as any, options.thumb as PhotoSize.photoSize);\n const fileName = (options.media as MyDocument).file_name || getFileNameByLocation(downloadOptions.location);\n createDownloadAnchor(url, downloadOptions.fileName || fileName, () => {\n URL.revokeObjectURL(url);\n });\n }).catch(noop).finally(() => {\n if(!hadProgress) {\n onProgress();\n }\n\n setTimeout(() => {\n element?.remove();\n }, 1000);\n\n // if(this.downloadsToDisc[cacheFileName] === promise) {\n // delete this.downloadsToDisc[cacheFileName];\n // }\n });\n\n return promise;\n }\n}\n\nconst appDownloadManager = new AppDownloadManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\nexport default appDownloadManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n a.target = '_blank';\n\n a.style.position = 'absolute';\n a.style.top = '1px';\n a.style.left = '1px';\n\n document.body.append(a);\n\n try {\n const clickEvent = document.createEvent('MouseEvents');\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n a.dispatchEvent(clickEvent);\n } catch(e) {\n console.error('Download click error', e);\n try {\n a.click();\n } catch(e) {\n window.open(url as string, '_blank');\n }\n }\n\n setTimeout(() => {\n a.remove();\n onRemove && onRemove();\n }, 100);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function partition(arr: T[], callback: (item: T, idx: number, arr: T[]) => boolean) {\n const good: T[] = [], bad: T[] = [];\n for(let i = 0, length = arr.length; i < length; ++i) {\n const item = arr[i];\n (callback(item, i, arr) ? good : bad).push(item);\n }\n\n return [good, bad];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\n// import { generatePathData } from \"../../helpers/dom\";\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport type Chat from './chat';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport AvatarElement from '../avatar';\nimport {Message} from '../../layer';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {SERVICE_AS_REGULAR, STICKY_OFFSET} from './bubbles';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport partition from '../../helpers/array/partition';\nimport noop from '../../helpers/noop';\nimport getMessageThreadId from '../../lib/appManagers/utils/messages/getMessageThreadId';\n\ntype GroupItem = {\n bubble: HTMLElement,\n fromId: PeerId,\n mid: number,\n groupMid?: number,\n timestamp: number,\n dateTimestamp: number,\n mounted: boolean,\n single: boolean,\n group?: BubbleGroup,\n message: Message.message | Message.messageService // use it only to set avatar\n};\n\nclass BubbleGroup {\n container: HTMLElement;\n chat: Chat;\n groups: BubbleGroups;\n items: GroupItem[]; // descend sorted\n avatarContainer: HTMLElement;\n avatarLoadPromise: ReturnType;\n avatar: AvatarElement;\n mounted: boolean;\n dateTimestamp: number;\n offset: number;\n\n constructor(chat: Chat, groups: BubbleGroups, dateTimestamp: number) {\n this.container = document.createElement('div');\n this.container.classList.add('bubbles-group');\n this.chat = chat;\n this.groups = groups;\n this.items = [];\n this.dateTimestamp = dateTimestamp;\n this.offset = 0;\n }\n\n createAvatar(message: Message.message | Message.messageService) {\n if(this.avatarLoadPromise) {\n return this.avatarLoadPromise;\n } else if(message._ === 'messageService') {\n return;\n }\n\n this.avatarContainer = document.createElement('div');\n this.avatarContainer.classList.add('bubbles-group-avatar-container');\n ++this.offset;\n\n const fwdFrom = message.fwd_from;\n const fwdFromId = message.fwdFromId;\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\n const currentPeerId = this.chat.peerId;\n const avatar = this.avatar = new AvatarElement();\n this.avatar.classList.add('bubbles-group-avatar', 'user-avatar', 'avatar-40'/* , 'can-zoom-fade' */);\n const peerId = ((fwdFrom && (currentPeerId === rootScope.myId || currentPeerId === REPLIES_PEER_ID)) || isForwardFromChannel ? fwdFromId : message.fromId) || NULL_PEER_ID;\n const avatarLoadPromise = this.avatar.updateWithOptions({\n lazyLoadQueue: this.chat.bubbles.lazyLoadQueue,\n peerId,\n peerTitle: !fwdFromId && fwdFrom && fwdFrom.from_name ? /* '🔥 FF 🔥' */fwdFrom.from_name : undefined\n });\n\n // this.avatarLoadPromise = Promise.all([\n // avatarLoadPromise,\n // peerId && peerId.isUser() ? this.chat.managers.appUsersManager.getUser(peerId.toUserId()) : undefined\n // ]).then(([result, user]) => {\n // if(user?.pFlags?.premium) {\n // avatar.classList.add('is-premium', 'tgico-star');\n // }\n\n // return result;\n // });\n this.avatarLoadPromise = avatarLoadPromise;\n\n this.avatarContainer.append(this.avatar);\n this.container.append(this.avatarContainer);\n\n return this.avatarLoadPromise;\n }\n\n get firstTimestamp() {\n return this.firstItem.timestamp;\n }\n\n get firstMid() {\n return this.firstItem.mid;\n }\n\n get firstItem() {\n return this.items[this.items.length - 1];\n }\n\n get lastTimestamp() {\n return this.lastItem.timestamp;\n }\n\n get lastMid() {\n return this.lastItem.mid;\n }\n\n get lastItem() {\n return this.items[0];\n }\n\n updateClassNames() {\n const items = this.items;\n const length = items.length;\n if(!length) {\n return;\n }\n\n // const elements = Array.from(this.container.children);\n // if(this.offset) elements.splice(0, this.offset);\n\n // const length = elements.length;\n // if(!length) {\n // return;\n // }\n\n const first = items[length - 1].bubble;\n\n if(items.length === 1) {\n first.classList.add('is-group-first', 'is-group-last');\n // this.setClipIfNeeded(first);\n return;\n } else {\n first.classList.remove('is-group-last');\n first.classList.add('is-group-first');\n // this.setClipIfNeeded(first, true);\n }\n\n for(let i = 1, _length = length - 1; i < _length; ++i) {\n const bubble = items[i].bubble;\n bubble.classList.remove('is-group-last', 'is-group-first');\n // this.setClipIfNeeded(bubble, true);\n }\n\n const last = items[0].bubble;\n last.classList.remove('is-group-first');\n last.classList.add('is-group-last');\n // this.setClipIfNeeded(last);\n }\n\n insertItem(item: GroupItem) {\n const {items} = this;\n insertInDescendSortedArray(items, item, this.groups.sortGroupItemsKey);\n\n item.group = this;\n if(items.length === 1) {\n this.groups.insertGroup(this);\n }\n }\n\n removeItem(item: GroupItem) {\n indexOfAndSplice(this.items, item);\n\n if(!this.items.length) {\n indexOfAndSplice(this.groups.groups, this);\n }\n\n item.group = undefined;\n }\n\n mount(updateClassNames?: boolean) {\n if(!this.groups.groups.includes(this) || !this.items.length) { // group can be already removed\n debugger;\n\n if(this.mounted) {\n this.onItemUnmount();\n }\n\n return;\n }\n\n const {offset, items} = this;\n const {length} = items;\n forEachReverse(items, (item, idx) => {\n this.mountItem(item, length - 1 - idx, offset);\n });\n\n if(updateClassNames) {\n this.updateClassNames();\n }\n\n this.onItemMount();\n }\n\n mountItem(item: GroupItem, idx = this.items.indexOf(item), offset = this.offset) {\n if(item.mounted) {\n return;\n }\n\n positionElementByIndex(item.bubble, this.container, offset + idx);\n item.mounted = true;\n }\n\n unmountItem(item: GroupItem) {\n if(!item.mounted) {\n return;\n }\n\n item.bubble.remove();\n item.mounted = false;\n this.onItemUnmount();\n }\n\n onItemMount() {\n if(this.mounted) {\n return;\n }\n\n const dateContainer = this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp / 1000);\n // const idx = this.groups.indexOf(group);\n const dateGroups = this.groups.groups.filter((_group) => _group.dateTimestamp === this.dateTimestamp);\n const dateGroupsLength = dateGroups.length;\n const idx = dateGroups.indexOf(this);\n const unmountedLength = dateGroups.slice(idx + 1).reduce((acc, v) => acc + (v.mounted ? 0 : 1), 0);\n positionElementByIndex(this.container, dateContainer.container, STICKY_OFFSET + dateGroupsLength - 1 - idx - unmountedLength);\n this.mounted = true;\n }\n\n onItemUnmount() {\n if(!this.mounted) {\n return;\n }\n\n if(!this.items.length) {\n this.container.remove();\n this.chat.bubbles.deleteEmptyDateGroups();\n this.mounted = false;\n } else {\n this.updateClassNames();\n }\n }\n}\n\n// class BubbleGroupItem implements GroupItem {\n// bubble: HTMLElement;\n// fromId: PeerId;\n// mid: number;\n// timestamp: number;\n// dateTimestamp: number;\n// mounted: boolean;\n// single: boolean;\n// group: BubbleGroup;\n\n// constructor(details: GroupItem) {\n// Object.assign(this, details);\n// }\n// }\n\nexport default class BubbleGroups {\n public itemsArr: Array = []; // descend sorted\n private itemsMap: Map = new Map();\n public groups: Array = []; // descend sorted\n private newGroupDiff = 121; // * 121 in scheduled messages\n private sortItemsKey: Extract;\n private sortGroupsKey: Extract;\n public sortGroupItemsKey: Extract;\n\n constructor(private chat: Chat) {\n this.sortItemsKey = chat.type === 'scheduled' ? 'timestamp' : 'mid';\n this.sortGroupsKey = chat.type === 'scheduled' ? 'lastTimestamp' : 'lastMid';\n this.sortGroupItemsKey = /* chat.type === 'scheduled' ? 'timestamp' : */'groupMid';\n }\n\n removeItem(item: GroupItem) {\n item.group?.removeItem(item);\n this.removeItemFromCache(item);\n }\n\n removeAndUnmountBubble(bubble: HTMLElement) {\n const item = this.getItemByBubble(bubble);\n if(!item) {\n if(bubble.parentElement) {\n bubble.remove(); // * can be a placeholder\n }\n\n return false;\n }\n\n const items = this.itemsArr;\n const index = items.indexOf(item);\n const siblings = this.getSiblingsAtIndex(index, items);\n\n const group = item.group;\n this.removeItem(item);\n\n const modifiedGroups: Set = new Set();\n if(group) {\n group.unmountItem(item);\n modifiedGroups.add(group);\n }\n\n const [previousSibling, nextSibling] = siblings;\n if(\n previousSibling &&\n nextSibling &&\n this.canItemsBeGrouped(previousSibling, nextSibling) &&\n previousSibling.group !== nextSibling.group\n ) {\n const group = nextSibling.group;\n this.f(nextSibling.group.items);\n group.onItemUnmount();\n modifiedGroups.add(previousSibling.group);\n this.groupUngrouped();\n }\n\n this.mountUnmountGroups(Array.from(modifiedGroups));\n\n return true;\n }\n\n mountUnmountGroups(groups: BubbleGroup[]) {\n // groups.sort((a, b) => (b.lastItem?.mid ?? 0) - (a.lastItem?.mid ?? 0));\n\n const [toMount, toUnmount] = partition(groups, (group) => !!group.items.length);\n toUnmount.forEach((group) => {\n group.onItemUnmount();\n })\n\n toMount.forEach((group) => {\n group.mount(true);\n });\n\n // toMount.forEach((group) => {\n // group.updateClassNames();\n // });\n }\n\n f(items: GroupItem[], index: number = 0, length = items.length) {\n for(; index < length; ++index) {\n const item = items[index];\n item.mounted = false;\n item.group.removeItem(item);\n --length;\n --index;\n }\n }\n\n getItemByBubble(bubble: HTMLElement) {\n return this.itemsMap.get(bubble);\n }\n\n getLastGroup() {\n return this.groups[0];\n }\n\n changeBubbleMid(bubble: HTMLElement, mid: number) {\n const item = this.getItemByBubble(bubble);\n if(!item) {\n return;\n }\n\n item.mid = mid;\n\n // indexOfAndSplice(item.group.items, item);\n // // const canChangeGroupMid = !item.group.items.length || item.group.items.every((item) => item.groupMid === item.mid);\n // // if(canChangeGroupMid) item.groupMid = mid;\n // item.group.insertItem(item);\n\n indexOfAndSplice(this.itemsArr, item);\n this.insertItemToArray(item, this.itemsArr);\n }\n\n changeItemBubble(item: GroupItem, bubble: HTMLElement) {\n this.itemsMap.delete(item.bubble);\n item.bubble = bubble;\n this.itemsMap.set(bubble, item);\n }\n\n changeBubbleByBubble(from: HTMLElement, to: HTMLElement) {\n const item = this.getItemByBubble(from);\n if(!item) {\n return;\n }\n\n this.changeItemBubble(item, to);\n }\n\n canItemsBeGrouped(item1: GroupItem, item2: GroupItem) {\n return item2.fromId === item1.fromId &&\n Math.abs(item2.timestamp - item1.timestamp) <= this.newGroupDiff &&\n item1.dateTimestamp === item2.dateTimestamp &&\n !item1.single &&\n !item2.single &&\n item1.message.pFlags.out === item2.message.pFlags.out &&\n (!this.chat.isAllMessagesForum || getMessageThreadId(item1.message, true) === getMessageThreadId(item2.message, true));\n }\n\n getSiblingsAtIndex(itemIndex: number, items: GroupItem[]) {\n return [items[itemIndex - 1], items[itemIndex + 1]] as const;\n }\n\n // findGroupSiblingInSiblings(item: GroupItem, siblings: ReturnType) {\n // return siblings.find((sibling) => sibling && this.canItemsBeGrouped(item, sibling));\n // }\n\n findGroupSiblingByItem(item: GroupItem, items: GroupItem[]) {\n items = items.slice();\n const idx = this.insertItemToArray(item, items);\n // return this.findGroupSiblingInSiblings(item, this.getSiblingsAtIndex(idx, items));\n return this.findGroupSiblingInItems(item, items, idx);\n }\n\n findGroupSiblingInItems(item: GroupItem, items: GroupItem[], index = items.indexOf(item), length = items.length) {\n const previousItem = items[index - 1];\n let siblingGroupedItem: GroupItem;\n if(previousItem?.group && this.canItemsBeGrouped(item, previousItem)) {\n siblingGroupedItem = previousItem;\n } else {\n for(let k = index + 1; k < length; ++k) {\n const nextItem = items[k];\n if(this.canItemsBeGrouped(item, nextItem)) {\n if(nextItem.group) {\n siblingGroupedItem = nextItem;\n }\n } else {\n break;\n }\n }\n }\n\n return siblingGroupedItem;\n }\n\n addItemToGroup(item: GroupItem, group: BubbleGroup) {\n group.insertItem(item);\n this.addItemToCache(item);\n }\n\n insertItemToArray(item: GroupItem, array: GroupItem[]) {\n return insertInDescendSortedArray(array, item, this.sortItemsKey);\n }\n\n insertGroup(group: BubbleGroup) {\n return insertInDescendSortedArray(this.groups, group, this.sortGroupsKey);\n }\n\n addItemToCache(item: GroupItem) {\n this.insertItemToArray(item, this.itemsArr);\n this.itemsMap.set(item.bubble, item);\n }\n\n removeItemFromCache(item: GroupItem) {\n indexOfAndSplice(this.itemsArr, item);\n this.itemsMap.delete(item.bubble);\n }\n\n getMessageFromId(message: MyMessage) {\n let fromId = message.viaBotId || message.fromId;\n\n // fix for saved messages forward to self\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as Message.message).fwdFromId === fromId) {\n fromId = fromId.toPeerId(true);\n }\n\n return fromId;\n }\n\n createItem(bubble: HTMLElement, message: MyMessage) {\n const single = !(message._ === 'message' || (message.action && SERVICE_AS_REGULAR.has(message.action._)));\n const {mid, date: timestamp} = message;\n const {dateTimestamp} = this.chat.bubbles.getDateForDateContainer(timestamp);\n const item: GroupItem = {\n mid,\n groupMid: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : mid,\n fromId: this.getMessageFromId(message),\n bubble,\n // timestamp: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : timestamp,\n timestamp,\n dateTimestamp,\n mounted: false,\n single,\n message\n };\n\n return item;\n }\n\n splitSiblingsOnGrouping(siblings: ReturnType) {\n const [previousSibling, nextSibling] = siblings;\n const previousGroup = previousSibling?.group;\n const nextGroup = nextSibling?.group;\n\n if(!previousGroup) {\n return;\n }\n\n // will refresh group\n // if(previousGroup === nextGroup) {\n const items = previousGroup.items;\n const index = items.indexOf(previousSibling) + 1;\n const length = items.length;\n if(index === length) {\n return;\n }\n\n const modifiedGroups: BubbleGroup[] = [previousGroup];\n // if(previousGroup !== nextGroup && nextGroup) {\n // modifiedGroups.push(nextGroup);\n // }\n\n this.f(items, index, length);\n return modifiedGroups;\n // }\n }\n\n prepareForGrouping(bubble: HTMLElement, message: MyMessage) {\n const foundItem = this.getItemByBubble(bubble);\n if(foundItem) { // should happen only on edit\n // debugger;\n return;\n }\n\n const item = this.createItem(bubble, message);\n this.addItemToCache(item);\n }\n\n groupUngrouped() {\n const items = this.itemsArr;\n const length = items.length;\n const modifiedGroups: Set = new Set();\n // for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const item = items[i];\n if(item.group) {\n continue;\n }\n\n let hadGroup = true;\n const siblings = this.getSiblingsAtIndex(i, items);\n const siblingGroupedItem = this.findGroupSiblingInItems(item, items, i, length);\n\n // const foundItem = this.findGroupSiblingInSiblings(item, siblings);\n const foundItem = siblingGroupedItem;\n const group = foundItem?.group ?? (hadGroup = false, new BubbleGroup(this.chat, this, item.dateTimestamp));\n\n modifiedGroups.add(group);\n group.insertItem(item);\n\n if(!hadGroup) {\n const splittedGroups = this.splitSiblingsOnGrouping(siblings);\n if(splittedGroups) {\n splittedGroups.forEach((group) => modifiedGroups.add(group));\n }\n }\n }\n\n return modifiedGroups;\n }\n\n // addBubble(bubble: HTMLElement, message: MyMessage, unmountIfFound?: boolean) {\n // const oldItem = this.getItemByBubble(bubble);\n // if(unmountIfFound) { // updating position\n // this.removeAndUnmountBubble(bubble);\n // } else if(oldItem) { // editing\n // const group = oldItem.group;\n // this.changeItemBubble(oldItem, bubble);\n // oldItem.mounted = false;\n\n // return {item: oldItem, group};\n // }\n\n // const item = this.createItem(bubble, message);\n\n // const foundItem = this.findSameGroupItem(item, this.itemsArr);\n\n // const group = foundItem?.group ?? new BubbleGroup(this.chat, this, item.dateTimestamp);\n // this.addItemToGroup(item, group);\n\n // return {item, group};\n // }\n\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\n //console.log('setClipIfNeeded', bubble, remove);\n const className = bubble.className;\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\n //console.log('setClipIfNeeded', bubble, remove, container);\n if(!container) return;\n\n try {\n Array.from(container.children).forEach((object) => {\n if(object instanceof SVGDefsElement) return;\n\n if(remove) {\n object.removeAttributeNS(null, 'clip-path');\n } else {\n let clipId = container.dataset.clipId;\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\n let width = +object.getAttributeNS(null, 'width');\n let height = +object.getAttributeNS(null, 'height');\n let isOut = className.includes('is-out');\n let isReply = className.includes('is-reply');\n let d = '';\n\n //console.log('setClipIfNeeded', object, width, height, isOut);\n\n let tr: number, tl: number;\n if(className.includes('forwarded') || isReply) {\n tr = tl = 0;\n } else if(isOut) {\n tr = className.includes('is-group-first') ? 12 : 6;\n tl = 12;\n } else {\n tr = 12;\n tl = className.includes('is-group-first') ? 12 : 6;\n }\n\n if(isOut) {\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\n } else {\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\n }\n\n path.setAttributeNS(null, 'd', d);\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\n }\n });\n } catch(err) {}\n }\n } */\n\n // updateGroupByMessageId(mid: number) {\n // const item = this.itemsArr.find((g) => g.mid === mid);\n // if(item) {\n // item.group.updateGroup();\n // }\n // }\n\n cleanup() {\n this.itemsArr = [];\n this.groups = [];\n this.itemsMap.clear();\n }\n\n // findIncorrentPositions() {\n // var bubbles = Array.from(this.chat.bubbles.chatInner.querySelectorAll('.bubbles-group .bubble')).reverse();\n // var items = this.itemsArr;\n // for(var i = 0, length = items.length; i < length; ++i) {\n // const item = items[i];\n // const foundBubble = bubbles[i];\n // if(item.bubble !== foundBubble) {\n // console.log('incorrect position', i, item, foundBubble);\n // // debugger;\n // // break;\n // }\n // }\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement, {PopupOptions} from '.';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport I18n, {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\nimport InputField from '../inputField';\n\nexport default class PopupDatePicker extends PopupElement {\n protected controlsDiv: HTMLElement;\n protected monthTitle: HTMLElement;\n protected prevBtn: HTMLElement;\n protected nextBtn: HTMLElement;\n\n protected monthsContainer: HTMLElement;\n protected month: HTMLElement;\n\n protected minMonth: Date;\n protected maxMonth: Date;\n protected minDate: Date;\n protected maxDate: Date;\n protected selectedDate: Date;\n protected selectedMonth: Date;\n protected selectedEl: HTMLElement;\n\n protected timeDiv: HTMLDivElement;\n protected hoursInputField: InputField;\n protected minutesInputField: InputField;\n\n constructor(initDate: Date, public onPick: (timestamp: number) => void, protected options: Partial<{\n noButtons: true,\n noTitle: true,\n minDate: Date,\n maxDate: Date\n withTime: true,\n showOverflowMonths: true\n }> & PopupOptions = {}) {\n super('popup-date-picker', {\n body: true,\n overlayClosable: true,\n buttons: options.noButtons ? [] : [{\n langKey: 'JumpToDate',\n callback: () => {\n if(this.onPick) {\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\n }\n }\n }, {\n langKey: 'Cancel',\n isCancel: true\n }],\n title: true,\n ...options\n });\n\n this.minDate = options.minDate || new Date('2013-08-01T00:00:00');\n\n if(initDate < this.minDate) {\n initDate.setFullYear(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\n }\n\n // Controls\n this.controlsDiv = document.createElement('div');\n this.controlsDiv.classList.add('date-picker-controls');\n\n this.prevBtn = document.createElement('button');\n this.prevBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-prev');\n attachClickEvent(this.prevBtn, this.onPrevClick, {listenerSetter: this.listenerSetter});\n\n this.nextBtn = document.createElement('button');\n this.nextBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-next');\n attachClickEvent(this.nextBtn, this.onNextClick, {listenerSetter: this.listenerSetter});\n\n this.monthTitle = document.createElement('div');\n this.monthTitle.classList.add('date-picker-month-title');\n\n this.controlsDiv.append(this.prevBtn, this.monthTitle, this.nextBtn);\n\n // Month\n this.monthsContainer = document.createElement('div');\n this.monthsContainer.classList.add('date-picker-months');\n attachClickEvent(this.monthsContainer, this.onDateClick, {listenerSetter: this.listenerSetter});\n\n this.body.append(this.controlsDiv, this.monthsContainer);\n\n // Time inputs\n if(options.withTime) {\n this.timeDiv = document.createElement('div');\n this.timeDiv.classList.add('date-picker-time');\n\n const delimiter = document.createElement('div');\n delimiter.classList.add('date-picker-time-delimiter');\n delimiter.append(':');\n\n const handleTimeInput = (max: number, inputField: InputField, onInput: (length: number) => void, onOverflow?: (number: number) => void) => {\n const maxString = '' + max;\n this.listenerSetter.add(inputField.input)('input', (e) => {\n let value = inputField.value.replace(/\\D/g, '');\n if(value.length > 2) {\n value = value.slice(0, 2);\n } else {\n if((value.length === 1 && +value[0] > +maxString[0]) || (value.length === 2 && +value > max)) {\n if(value.length === 2 && onOverflow) {\n onOverflow(+value[1]);\n }\n\n value = '0' + value[0];\n }\n }\n\n inputField.setValueSilently(value);\n onInput(value.length);\n });\n };\n\n this.hoursInputField = new InputField({plainText: true});\n this.minutesInputField = new InputField({plainText: true});\n\n handleTimeInput(23, this.hoursInputField, (length) => {\n if(length === 2) {\n this.minutesInputField.input.focus();\n }\n\n this.setTimeTitle();\n }, (number) => {\n this.minutesInputField.value = (number + this.minutesInputField.value).slice(0, 2);\n });\n handleTimeInput(59, this.minutesInputField, (length) => {\n if(!length) {\n this.hoursInputField.input.focus();\n }\n\n this.setTimeTitle();\n });\n\n this.selectedDate = initDate;\n\n initDate.setMinutes(initDate.getMinutes() + 10);\n\n this.hoursInputField.setValueSilently(('0' + initDate.getHours()).slice(-2));\n this.minutesInputField.setValueSilently(('0' + initDate.getMinutes()).slice(-2));\n\n initDate.setHours(0, 0, 0, 0);\n\n this.timeDiv.append(this.hoursInputField.container, delimiter, this.minutesInputField.container);\n\n attachClickEvent(this.btnConfirm, () => {\n if(this.onPick) {\n this.selectedDate.setHours(+this.hoursInputField.value || 0, +this.minutesInputField.value || 0, 0, 0);\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\n }\n\n this.hide();\n }, {listenerSetter: this.listenerSetter});\n\n this.body.append(this.timeDiv);\n\n this.prevBtn.classList.add('primary');\n this.nextBtn.classList.add('primary');\n }\n\n const popupCenterer = document.createElement('div');\n popupCenterer.classList.add('popup-centerer');\n popupCenterer.append(this.container);\n this.element.append(popupCenterer);\n\n // const passed = (initDate.getTime() - (initDate.getTimezoneOffset() * 60000)) % 86400000;\n // this.selectedDate = this.maxDate = new Date(initDate.getTime() - passed);\n initDate.setHours(0, 0, 0, 0);\n this.selectedDate = initDate;\n\n this.maxDate = options.maxDate || new Date();\n this.maxDate.setHours(0, 0, 0, 0);\n\n this.selectedMonth = new Date(this.selectedDate);\n this.selectedMonth.setDate(1);\n\n this.maxMonth = new Date(this.maxDate);\n this.maxMonth.setDate(1);\n\n this.minMonth = new Date(this.minDate);\n this.minMonth.setHours(0, 0, 0, 0);\n this.minMonth.setDate(1);\n\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\n this.prevBtn.setAttribute('disabled', 'true');\n }\n\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\n this.nextBtn.setAttribute('disabled', 'true');\n }\n\n if(options.noTitle) {\n this.setTitle = () => {};\n }\n\n this.setTimeTitle();\n this.setTitle();\n this.setMonth();\n }\n\n onPrevClick = (e: MouseEvent) => {\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() - 1);\n this.setMonth();\n\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\n this.prevBtn.setAttribute('disabled', 'true');\n }\n\n this.nextBtn.removeAttribute('disabled');\n };\n\n onNextClick = (e: MouseEvent) => {\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() + 1);\n this.setMonth();\n\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\n this.nextBtn.setAttribute('disabled', 'true');\n }\n\n this.prevBtn.removeAttribute('disabled');\n };\n\n onDateClick = (e: MouseEvent) => {\n // cancelEvent(e);\n const target = e.target as HTMLElement;\n\n if(!target.dataset.timestamp) return;\n\n if(this.selectedEl) {\n if(this.selectedEl === target) return;\n this.selectedEl.classList.remove('active');\n }\n\n this.selectedEl = target;\n\n target.classList.add('active');\n const timestamp = +target.dataset.timestamp;\n\n this.selectedDate = new Date(timestamp);\n\n this.setTitle();\n this.setTimeTitle();\n };\n\n public setTimeTitle() {\n if(this.btnConfirm && this.selectedDate) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n const date = new Date();\n date.setHours(0, 0, 0, 0);\n\n const timeOptions: Intl.DateTimeFormatOptions = {\n minute: '2-digit',\n hour: '2-digit'\n };\n\n const sendDate = new Date(this.selectedDate.getTime());\n sendDate.setHours(+this.hoursInputField.value, +this.minutesInputField.value);\n\n if(this.selectedDate.getTime() === date.getTime()) {\n key = 'Schedule.SendToday';\n }/* else if(this.selectedDate.getTime() === (date.getTime() + 86400e3)) {\n dayStr = 'Tomorrow';\n } */ else {\n key = 'Schedule.SendDate';\n\n const dateOptions: Intl.DateTimeFormatOptions = {\n month: 'short',\n day: 'numeric'\n };\n\n if(sendDate.getFullYear() !== date.getFullYear()) {\n dateOptions.year = 'numeric';\n }\n\n args.push(new I18n.IntlDateElement({\n date: sendDate,\n options: dateOptions\n }).element);\n }\n\n args.push(new I18n.IntlDateElement({\n date: sendDate,\n options: timeOptions\n }).element);\n\n this.btnConfirm.firstChild.replaceWith(i18n(key, args));\n }\n }\n\n public setTitle() {\n // const splitted = this.selectedDate.toString().split(' ', 3);\n // this.title.innerText = splitted[0] + ', ' + splitted[1] + ' ' + splitted[2];\n this.title.textContent = '';\n this.title.append(new I18n.IntlDateElement({\n date: this.selectedDate,\n options: {\n day: 'numeric',\n month: 'long',\n weekday: 'short'\n }\n }).element);\n }\n\n private renderElement(disabled: boolean, innerText: string | HTMLElement = '') {\n const el = document.createElement('button');\n el.classList.add('btn-icon', 'date-picker-month-date');\n\n if(disabled) {\n el.setAttribute('disabled', 'true');\n }\n\n if(innerText) {\n el.append(innerText);\n }\n\n return el;\n }\n\n public setMonth() {\n const firstDate = new Date(this.selectedMonth);\n\n const options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: this.timeDiv && mediaSizes.isMobile ? 'short' : 'long'\n };\n\n this.monthTitle.textContent = '';\n this.monthTitle.append(new I18n.IntlDateElement({date: firstDate, options}).element);\n // this.monthTitle.innerText = (this.timeDiv && mediaSizes.isMobile ? monthName.slice(0, 3) : monthName) + ' ' + this.selectedMonth.getFullYear();\n\n if(this.month) {\n this.month.remove();\n }\n\n this.month = document.createElement('div');\n this.month.classList.add('date-picker-month');\n\n const weekStartDate = new Date();\n const day = weekStartDate.getDay();\n if(day !== 1) {\n weekStartDate.setHours(-24 * (day - 1));\n }\n\n for(let i = 0; i < 7; ++i) {\n const el = this.renderElement(true, new I18n.IntlDateElement({date: weekStartDate, options: {weekday: 'narrow'}}).element);\n el.classList.remove('date-picker-month-date');\n el.classList.add('date-picker-month-day');\n this.month.append(el);\n weekStartDate.setDate(weekStartDate.getDate() + 1);\n }\n\n // 0 - sunday\n let dayIndex = firstDate.getDay() - 1;\n if(dayIndex === -1) dayIndex = 7 - 1;\n\n const clonedDate = new Date(firstDate.getTime());\n clonedDate.setDate(clonedDate.getDate() - dayIndex - 1);\n\n // Padding first week\n for(let i = 0; i < dayIndex; ++i) {\n if(this.options.showOverflowMonths) {\n clonedDate.setDate(clonedDate.getDate() + 1);\n this.month.append(this.renderElement(true, '' + clonedDate.getDate()));\n } else {\n this.month.append(this.renderElement(true));\n }\n }\n\n do {\n const date = firstDate.getDate();\n const el = this.renderElement(firstDate > this.maxDate || firstDate < this.minDate, '' + date);\n el.dataset.timestamp = '' + firstDate.getTime();\n\n if(firstDate.getTime() === this.selectedDate.getTime()) {\n this.selectedEl = el;\n el.classList.add('active');\n }\n\n this.month.append(el);\n\n firstDate.setDate(date + 1);\n } while(firstDate.getDate() !== 1);\n\n const remainder = this.month.childElementCount % 7;\n if(this.options.showOverflowMonths && remainder) {\n for(let i = remainder; i < 7; ++i) {\n this.month.append(this.renderElement(true, '' + firstDate.getDate()));\n firstDate.setDate(firstDate.getDate() + 1);\n }\n }\n\n const lines = Math.ceil(this.month.childElementCount / 7);\n this.container.dataset.lines = '' + lines;\n\n this.monthsContainer.append(this.month);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {setDirection} from '../helpers/dom/setInnerHTML';\n\nexport default class DivAndCaption {\n public container: HTMLElement;\n public border: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public subtitle: HTMLElement;\n\n constructor(protected className: string, public fill?: T) {\n this.container = document.createElement('div');\n this.container.className = className;\n\n this.border = document.createElement('div');\n this.border.classList.add(className + '-border');\n\n this.content = document.createElement('div');\n this.content.classList.add(className + '-content');\n\n this.title = document.createElement('div');\n this.title.classList.add(className + '-title');\n setDirection(this.title);\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add(className + '-subtitle');\n setDirection(this.subtitle);\n\n this.content.append(this.title, this.subtitle);\n this.container.append(this.border, this.content);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {Middleware} from '../../helpers/middleware';\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {Document, Message, MessageMedia, Photo, WebPage} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport DivAndCaption from '../divAndCaption';\nimport wrapMessageForReply from '../wrappers/messageForReply';\nimport wrapPhoto from '../wrappers/photo';\nimport wrapSticker from '../wrappers/sticker';\nimport wrapVideo from '../wrappers/video';\nimport {AnimationItemGroup} from '../animationIntersector';\n\nconst MEDIA_SIZE = 32;\n\nexport async function wrapReplyDivAndCaption(options: {\n title: string | HTMLElement | DocumentFragment,\n titleEl: HTMLElement,\n subtitle: string | HTMLElement | DocumentFragment,\n subtitleEl: HTMLElement,\n message: Message.message | Message.messageService,\n mediaEl: HTMLElement,\n loadPromises?: Promise[],\n animationGroup: AnimationItemGroup\n}) {\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises, animationGroup} = options;\n if(title !== undefined) {\n if(typeof(title) === 'string') {\n title = limitSymbols(title, 140);\n title = wrapEmojiText(title);\n }\n\n replaceContent(titleEl, title);\n }\n\n if(!loadPromises) {\n loadPromises = [];\n }\n\n let messageMedia: MessageMedia | WebPage.webPage = (message as Message.message)?.media;\n let setMedia = false, isRound = false;\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\n let middleware: Middleware;\n if(messageMedia && mediaEl) {\n subtitleEl.textContent = '';\n subtitleEl.append(await wrapMessageForReply({message, animationGroup, withoutMediaType: true}));\n\n messageMedia = (messageMedia as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || messageMedia;\n const photo = (messageMedia as MessageMedia.messageMediaPhoto).photo as Photo.photo;\n const document = (messageMedia as MessageMedia.messageMediaDocument).document as Document.document;\n if(photo || (document && document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(document.type) !== -1) */) {\n middleware = appImManager.chat.bubbles.getMiddleware();\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\n\n if(document?.type === 'sticker') {\n await wrapSticker({\n doc: document,\n div: mediaEl,\n lazyLoadQueue,\n group: animationGroup,\n // onlyThumb: document.sticker === 2,\n width: MEDIA_SIZE,\n height: MEDIA_SIZE,\n middleware,\n loadPromises\n });\n setMedia = true;\n } else if(document?.type === 'gif' && document.video_thumbs) {\n setMedia = true;\n await wrapVideo({\n doc: document,\n container: mediaEl,\n boxWidth: MEDIA_SIZE,\n boxHeight: MEDIA_SIZE,\n lazyLoadQueue,\n noPlayButton: true,\n noInfo: true,\n middleware,\n loadPromises,\n withoutPreloader: true,\n videoSize: document.video_thumbs[0],\n group: animationGroup\n });\n } else {\n const m = photo || document;\n isRound = document?.type === 'round';\n\n try {\n await wrapPhoto({\n photo: m,\n container: mediaEl,\n boxWidth: MEDIA_SIZE,\n boxHeight: MEDIA_SIZE,\n size: choosePhotoSize(m, MEDIA_SIZE, MEDIA_SIZE),\n middleware,\n lazyLoadQueue,\n noBlur: true,\n withoutPreloader: true,\n loadPromises\n });\n setMedia = true;\n } catch(err) {\n\n }\n }\n }\n } else {\n if(message) {\n subtitleEl.textContent = '';\n subtitleEl.append(await wrapMessageForReply({message}));\n } else {\n if(typeof(subtitle) === 'string') {\n subtitle = limitSymbols(subtitle, 140);\n subtitle = wrapEmojiText(subtitle);\n }\n\n replaceContent(subtitleEl, subtitle || '');\n }\n }\n\n Promise.all(loadPromises).then(() => {\n if(middleware && !middleware()) return;\n mediaChildren.forEach((child) => child.remove());\n\n if(mediaEl) {\n mediaEl.classList.toggle('is-round', isRound);\n }\n });\n\n return setMedia;\n}\n\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => Promise> {\n private mediaEl: HTMLElement;\n\n constructor(protected className: string, protected animationGroup: AnimationItemGroup) {\n super(className, async(title, subtitle = '', message?) => {\n if(!this.mediaEl) {\n this.mediaEl = document.createElement('div');\n this.mediaEl.classList.add(this.className + '-media');\n }\n\n const isMediaSet = await wrapReplyDivAndCaption({\n title,\n titleEl: this.title,\n subtitle,\n subtitleEl: this.subtitle,\n mediaEl: this.mediaEl,\n message,\n animationGroup\n });\n\n this.container.classList.toggle('is-media', isMediaSet);\n if(isMediaSet) {\n this.content.prepend(this.mediaEl);\n } else {\n this.mediaEl.remove();\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {hexToRgb} from '../../helpers/color';\nimport {Message} from '../../layer';\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport ReplyContainer from '../chat/replyContainer';\n\nexport default function wrapReply(\n title: Parameters[0],\n subtitle: Parameters[1],\n animationGroup: AnimationItemGroup,\n message?: Message.message | Message.messageService,\n setColorPeerId?: PeerId\n) {\n const replyContainer = new ReplyContainer('reply', animationGroup);\n const fillPromise = replyContainer.fill(title, subtitle, message);\n\n if(setColorPeerId) {\n const hex = getPeerColorById(setColorPeerId, false);\n const [r, g, b] = hexToRgb(hex);\n replyContainer.container.style.setProperty('--override-color', `${r}, ${g}, ${b}`);\n replyContainer.container.classList.add('is-overriding-color');\n // replyContainer.border.style.backgroundColor = hex;\n // replyContainer.title.style.color = hex;\n }\n\n return {container: replyContainer.container, fillPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from './avatar';\nimport type LazyLoadQueue from './lazyLoadQueue';\n\nconst CLASS_NAME = 'stacked-avatars';\nconst AVATAR_CLASS_NAME = CLASS_NAME + '-avatar';\nconst AVATAR_CONTAINER_CLASS_NAME = AVATAR_CLASS_NAME + '-container';\n\nexport default class StackedAvatars {\n public container: HTMLElement;\n private lazyLoadQueue: LazyLoadQueue;\n private avatarSize: number;\n\n constructor(options: {\n lazyLoadQueue?: StackedAvatars['lazyLoadQueue'],\n avatarSize: StackedAvatars['avatarSize']\n }) {\n this.lazyLoadQueue = options.lazyLoadQueue;\n this.avatarSize = options.avatarSize;\n\n this.container = document.createElement('div');\n this.container.classList.add(CLASS_NAME);\n\n this.container.style.setProperty('--avatar-size', options.avatarSize + 'px');\n }\n /**\n * MACOS, ANDROID - без реверса\n * WINDOWS DESKTOP - реверс\n * все приложения накладывают аватарку первую на вторую, а в макете зато вторая на первую, ЛОЛ!\n */\n public render(peerIds: PeerId[], loadPromises?: Promise[]) {\n const children = this.container.children;\n peerIds = peerIds.slice().reverse();\n if(peerIds.length > 3) {\n peerIds = peerIds.slice(-3);\n }\n\n peerIds.forEach((peerId, idx) => {\n let avatarContainer = children[idx] as HTMLElement;\n if(!avatarContainer) {\n avatarContainer = document.createElement('div');\n avatarContainer.classList.add(AVATAR_CONTAINER_CLASS_NAME);\n }\n\n let avatarElem = avatarContainer.firstElementChild as AvatarElement;\n if(!avatarElem) {\n avatarElem = new AvatarElement();\n avatarElem.classList.add('avatar-' + this.avatarSize, AVATAR_CLASS_NAME);\n avatarElem.updateOptions({\n isDialog: false,\n loadPromises\n });\n }\n\n avatarElem.updateWithOptions({\n lazyLoadQueue: this.lazyLoadQueue,\n peerId: peerId\n });\n\n if(!avatarElem.parentNode) {\n avatarContainer.append(avatarElem);\n }\n\n if(!avatarContainer.parentNode) {\n this.container.append(avatarContainer);\n }\n });\n\n // if were 3 and became 2\n (Array.from(children) as HTMLElement[]).slice(peerIds.length).forEach((el) => el.remove());\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message} from '../../layer';\nimport rootScope from '../../lib/rootScope';\nimport ripple from '../ripple';\nimport I18n from '../../lib/langPack';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport StackedAvatars from '../stackedAvatars';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport type LazyLoadQueue from '../lazyLoadQueue';\n\nconst TAG_NAME = 'replies-element';\n\nrootScope.addEventListener('replies_updated', (message) => {\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach((element) => {\n element.message = message;\n element.render();\n });\n});\n\nexport default class RepliesElement extends HTMLElement {\n public message: Message.message;\n public type: 'footer' | 'beside';\n public loadPromises: Promise[];\n public lazyLoadQueue: LazyLoadQueue;\n public stackedAvatars: StackedAvatars;\n public text: I18n.IntlElement;\n public managers: AppManagers;\n\n private updated = false;\n\n constructor() {\n super();\n this.managers = rootScope.managers;\n }\n\n public init() {\n this.render();\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\n this.classList.add('replies', 'replies-' + this.type);\n }\n\n public render() {\n const replies = this.message.replies;\n\n /* if(this.firstChild) {\n this.innerHTML = '';\n } */\n\n if(this.type === 'footer') {\n let leftPart: HTMLElement;\n if(this.firstElementChild) {\n leftPart = this.firstElementChild as HTMLElement;\n }\n\n if(replies?.recent_repliers) {\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\n this.innerHTML = '';\n leftPart = null;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n lazyLoadQueue: this.lazyLoadQueue,\n avatarSize: 30\n });\n\n this.stackedAvatars.container.classList.add('replies-footer-avatars');\n }\n\n leftPart = this.stackedAvatars.container;\n\n this.stackedAvatars.render(replies.recent_repliers.map((peer) => getPeerId(peer)), this.loadPromises);\n } else {\n if(leftPart && !leftPart.classList.contains('tgico-comments')) {\n leftPart.remove();\n leftPart = null;\n }\n\n if(!leftPart) {\n leftPart = document.createElement('span');\n leftPart.classList.add('tgico-comments');\n }\n }\n\n if(!leftPart.parentElement) {\n this.prepend(leftPart);\n }\n\n if(!this.text) {\n this.text = new I18n.IntlElement();\n }\n\n const text = this.text;\n if(replies) {\n if(replies.replies) {\n text.compareAndUpdate({key: 'Comments', args: [replies.replies]});\n } else {\n text.compareAndUpdate({key: 'LeaveAComment'});\n }\n } else {\n text.compareAndUpdate({key: 'ViewInChat'});\n }\n\n if(replies) {\n // const historyStorage = appMessagesManager.getHistoryStorage(replies.channel_id.toPeerId(true));\n let isUnread = false;\n if(replies.replies) {\n if(replies.read_max_id !== undefined && replies.max_id !== undefined) {\n isUnread = replies.read_max_id < replies.max_id;\n }/* else {\n isUnread = !historyStorage.readMaxId || historyStorage.readMaxId < (replies.max_id || 0);\n } */\n }\n this.classList.toggle('is-unread', isUnread);\n }\n\n let textSpan = this.children[1] as HTMLElement;\n if(!textSpan) {\n textSpan = document.createElement('span');\n textSpan.classList.add('replies-footer-text');\n\n const iconSpan = document.createElement('span');\n iconSpan.classList.add('tgico-next');\n\n const rippleContainer = document.createElement('div');\n ripple(rippleContainer);\n\n this.append(textSpan, iconSpan, rippleContainer);\n }\n\n replaceContent(textSpan, text.element);\n } else {\n this.classList.add('bubble-beside-button');\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\n }\n\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\n this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\n this.managers.appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\n this.updated = true;\n }\n\n if(this.loadPromises) {\n this.loadPromises = undefined;\n }\n }\n}\n\ncustomElements.define(TAG_NAME, RepliesElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatTime, getFullDate} from '../../helpers/date';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {Message} from '../../layer';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {i18n, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../lib/rootScope';\nimport type LazyLoadQueue from '../lazyLoadQueue';\nimport PeerTitle from '../peerTitle';\nimport wrapReply from '../wrappers/reply';\nimport Chat, {ChatType} from './chat';\nimport RepliesElement from './replies';\n\nconst NBSP = ' ';\n\nconst makeEdited = () => {\n const edited = document.createElement('i');\n edited.classList.add('edited');\n _i18n(edited, 'EditedMessage');\n return edited;\n};\n\nconst makeSponsored = () => i18n('SponsoredMessage');\n\nexport namespace MessageRender {\n /* export const setText = () => {\n\n }; */\n\n export const setTime = (options: {\n chatType: ChatType,\n message: Message.message | Message.messageService,\n reactionsMessage?: Message.message\n }) => {\n const {chatType, message} = options;\n const date = new Date(message.date * 1000);\n const args: (HTMLElement | string)[] = [];\n\n let editedSpan: HTMLElement,\n sponsoredSpan: HTMLElement;\n // reactionsElement: ReactionsElement,\n // reactionsMessage: Message.message;\n\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const isMessage = !('action' in message) && !isSponsored;\n // let hasReactions: boolean;\n\n const time: HTMLElement = isSponsored ? undefined : formatTime(date);\n if(isMessage) {\n if(message.views) {\n const postAuthor = message.post_author || message.fwd_from?.post_author;\n\n const postViewsSpan = document.createElement('span');\n postViewsSpan.classList.add('post-views');\n postViewsSpan.innerHTML = formatNumber(message.views, 1);\n\n const channelViews = document.createElement('i');\n channelViews.classList.add('tgico-channelviews', 'time-icon');\n\n args.push(postViewsSpan, channelViews);\n if(postAuthor) {\n const span = document.createElement('span');\n setInnerHTML(span, wrapEmojiText(postAuthor));\n span.insertAdjacentHTML('beforeend', ',' + NBSP)\n args.push(span);\n }\n }\n\n if(message.edit_date && chatType !== 'scheduled' && !message.pFlags.edit_hide) {\n args.unshift(editedSpan = makeEdited());\n }\n\n if(chatType !== 'pinned' && message.pFlags.pinned) {\n const i = document.createElement('i');\n i.classList.add('tgico-pinnedchat', 'time-icon');\n args.unshift(i);\n }\n\n // if(USER_REACTIONS_INLINE && message.peer_id._ === 'peerUser'/* && message.reactions?.results?.length */) {\n // hasReactions = true;\n\n // reactionsMessage = options.reactionsMessage;\n // reactionsElement = new ReactionsElement();\n // reactionsElement.init(reactionsMessage, 'inline', true);\n // reactionsElement.render();\n // args.unshift(reactionsElement);\n // }\n } else if(isSponsored) {\n args.push(sponsoredSpan = makeSponsored());\n }\n\n if(time) {\n args.push(time);\n }\n\n let title = isSponsored ? undefined : getFullDate(date);\n if(isMessage) {\n title += (message.edit_date && !message.pFlags.edit_hide ? `\\nEdited: ${getFullDate(new Date(message.edit_date * 1000))}` : '') +\n (message.fwd_from ? `\\nOriginal: ${getFullDate(new Date(message.fwd_from.date * 1000))}` : '');\n }\n\n const timeSpan = document.createElement('span');\n timeSpan.classList.add('time', 'tgico');\n // if(title) timeSpan.title = title;\n timeSpan.append(...args);\n\n const inner = document.createElement('div');\n inner.classList.add('inner', 'tgico');\n if(title) inner.title = title;\n\n let clonedArgs = args;\n if(editedSpan) {\n clonedArgs[clonedArgs.indexOf(editedSpan)] = makeEdited();\n }\n if(sponsoredSpan) {\n clonedArgs[clonedArgs.indexOf(sponsoredSpan)] = makeSponsored();\n }\n // if(reactionsElement) {\n // const _reactionsElement = clonedArgs[clonedArgs.indexOf(reactionsElement)] = new ReactionsElement();\n // _reactionsElement.init(reactionsMessage, 'inline');\n // _reactionsElement.render();\n // }\n clonedArgs = clonedArgs.map((a) => a instanceof HTMLElement && !a.classList.contains('i18n') && !a.classList.contains('reactions') ? a.cloneNode(true) as HTMLElement : a);\n if(time) {\n clonedArgs[clonedArgs.length - 1] = formatTime(date); // clone time\n }\n inner.append(...clonedArgs);\n\n timeSpan.append(inner);\n\n return timeSpan;\n };\n\n export const renderReplies = ({bubble, bubbleContainer, message, messageDiv, loadPromises, lazyLoadQueue}: {\n bubble: HTMLElement,\n bubbleContainer: HTMLElement,\n message: Message.message,\n messageDiv: HTMLElement,\n loadPromises?: Promise[],\n lazyLoadQueue?: LazyLoadQueue\n }) => {\n const isFooter = !bubble.classList.contains('sticker') && !bubble.classList.contains('emoji-big') && !bubble.classList.contains('round');\n const repliesFooter = new RepliesElement();\n repliesFooter.message = message;\n repliesFooter.type = isFooter ? 'footer' : 'beside';\n repliesFooter.loadPromises = loadPromises;\n repliesFooter.lazyLoadQueue = lazyLoadQueue;\n repliesFooter.init();\n bubbleContainer.prepend(repliesFooter);\n return isFooter;\n };\n\n export const setReply = async({chat, bubble, bubbleContainer, message}: {\n chat: Chat,\n bubble: HTMLElement,\n bubbleContainer?: HTMLElement,\n message: Message.message\n }) => {\n const isReplacing = !bubbleContainer;\n if(isReplacing) {\n bubbleContainer = bubble.querySelector('.bubble-content');\n }\n\n const currentReplyDiv = isReplacing ? bubbleContainer.querySelector('.reply') : null;\n if(!message.reply_to_mid) {\n currentReplyDiv?.remove();\n\n bubble.classList.remove('is-reply');\n return;\n }\n\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : chat.peerId;\n\n const originalMessage = await rootScope.managers.appMessagesManager.getMessageByPeer(replyToPeerId, message.reply_to_mid);\n let originalPeerTitle: string | HTMLElement;\n\n // ///////this.log('message to render reply', originalMessage, originalPeerTitle, bubble, message);\n\n let titlePeerId: PeerId;\n // need to download separately\n if(!originalMessage) {\n // ////////this.log('message to render reply empty, need download', message, message.reply_to_mid);\n rootScope.managers.appMessagesManager.fetchMessageReplyTo(message);\n chat.bubbles.needUpdate.push({replyToPeerId, replyMid: message.reply_to_mid, mid: message.mid});\n\n originalPeerTitle = i18n('Loading');\n } else {\n const originalMessageFwdFromId = (originalMessage as Message.message).fwdFromId;\n titlePeerId = message.fwdFromId && message.fwdFromId === originalMessageFwdFromId ? message.fwdFromId : originalMessage.fromId || originalMessageFwdFromId;\n originalPeerTitle = new PeerTitle({\n peerId: titlePeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n }\n\n const {container, fillPromise} = wrapReply(originalPeerTitle, undefined, chat.animationGroup, originalMessage, chat.isAnyGroup ? titlePeerId : undefined);\n await fillPromise;\n if(currentReplyDiv) {\n if(currentReplyDiv.classList.contains('floating-part')) {\n container.classList.add('floating-part');\n }\n currentReplyDiv.replaceWith(container);\n } else {\n bubbleContainer.append(container);\n }\n // bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\n\n return container;\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport function getElementByPoint(container: HTMLElement, verticalSide: 'top' | 'bottom', horizontalSide: 'center' | 'left'): HTMLElement {\n // return null;\n const rect = container.getBoundingClientRect();\n const x = horizontalSide === 'center' ? Math.ceil(rect.left + ((rect.right - rect.left) / 2) + 1) : Math.ceil(rect.left + 1);\n const y = verticalSide === 'bottom' ? Math.floor(rect.top + rect.height - 1) : Math.ceil(rect.top + 1);\n return document.elementFromPoint(x, y) as any;\n};\n\nMOUNT_CLASS_TO.getElementByPoint = getElementByPoint;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function reflowScrollableElement(element: HTMLElement) {\n element.style.display = 'none';\n void element.offsetLeft; // reflow\n element.style.display = '';\n}\n","export const SEND_WHEN_ONLINE_TIMESTAMP = 0x7FFFFFFE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport enum INTERNAL_LINK_TYPE {\n MESSAGE,\n PRIVATE_POST,\n STICKER_SET,\n JOIN_CHAT,\n VOICE_CHAT,\n USER_PHONE_NUMBER,\n INVOICE,\n EMOJI_SET\n};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat | InternalLink.InternalLinkVoiceChat | InternalLink.InternalLinkUserPhoneNumber | InternalLink.InternalLinkInvoice | InternalLink.InternalLinkEmojiSet;\n\nexport namespace InternalLink {\n export interface InternalLinkMessage {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: string,\n post?: string,\n comment?: string,\n thread?: string,\n start?: string,\n stack?: number // local\n }\n\n export interface InternalLinkPrivatePost {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: string,\n post: string,\n thread?: string,\n comment?: string,\n stack?: number // local\n }\n\n export interface InternalLinkStickerSet {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: string\n }\n\n export interface InternalLinkJoinChat {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: string\n }\n\n /**\n * LOCAL LINK\n */\n export interface InternalLinkVoiceChat {\n _: INTERNAL_LINK_TYPE.VOICE_CHAT,\n id: string,\n access_hash: string,\n chat_id: string\n }\n\n export interface InternalLinkUserPhoneNumber {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: string\n }\n\n export interface InternalLinkInvoice {\n _: INTERNAL_LINK_TYPE.INVOICE,\n slug: string\n }\n\n export interface InternalLinkEmojiSet {\n _: INTERNAL_LINK_TYPE.EMOJI_SET,\n set: string\n }\n}\n\nexport type InternalLinkTypeMap = {\n [INTERNAL_LINK_TYPE.MESSAGE]: InternalLink.InternalLinkMessage,\n [INTERNAL_LINK_TYPE.PRIVATE_POST]: InternalLink.InternalLinkPrivatePost,\n [INTERNAL_LINK_TYPE.STICKER_SET]: InternalLink.InternalLinkStickerSet,\n [INTERNAL_LINK_TYPE.JOIN_CHAT]: InternalLink.InternalLinkJoinChat,\n [INTERNAL_LINK_TYPE.VOICE_CHAT]: InternalLink.InternalLinkVoiceChat,\n [INTERNAL_LINK_TYPE.USER_PHONE_NUMBER]: InternalLink.InternalLinkUserPhoneNumber,\n [INTERNAL_LINK_TYPE.INVOICE]: InternalLink.InternalLinkInvoice,\n [INTERNAL_LINK_TYPE.EMOJI_SET]: InternalLink.InternalLinkEmojiSet\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement, {addCancelButton} from '.';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport {ChatInvite} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {i18n, _i18n} from '../../lib/langPack';\nimport {NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport AvatarElement from '../avatar';\nimport putPhoto from '../putPhoto';\nimport {toastNew} from '../toast';\nimport wrapPhoto from '../wrappers/photo';\n\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\n\nexport default class PopupJoinChatInvite extends PopupElement {\n constructor(\n private hash: string,\n private chatInvite: ChatInvite.chatInvite\n ) {\n super('popup-join-chat-invite', {\n closable: true,\n overlayClosable: true,\n body: true,\n buttons: addCancelButton([{\n langKey: chatInvite.pFlags.request_needed ? 'RequestJoin.Button' : (chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle'),\n callback: () => {\n this.managers.appChatsManager.importChatInvite(hash)\n .then((chatId) => {\n const peerId = chatId.toPeerId(true);\n appImManager.setInnerPeer({peerId});\n }, (error) => {\n if(error.type === 'INVITE_REQUEST_SENT') {\n toastNew({langPackKey: 'RequestToJoinSent'});\n }\n });\n }\n }])\n });\n\n this.construct();\n }\n\n private async construct() {\n this.header.remove();\n /* const fakeChat: Chat.channel | Chat.chat = {\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\n id: FAKE_CHAT_ID,\n title: chatInvite.title,\n photo: chatInvite.photo as any,\n date: Date.now() / 1000 | 0,\n version: 0,\n participants_count: chatInvite.participants_count,\n pFlags: chatInvite.pFlags as any\n };\n\n appChatsManager.saveApiChat(fakeChat); */\n\n const {chatInvite, managers, hash} = this;\n\n const avatarElem = new AvatarElement();\n avatarElem.classList.add('avatar-100');\n avatarElem.isDialog = false;\n if(chatInvite.photo._ === 'photo') {\n chatInvite.photo = await managers.appPhotosManager.savePhoto(chatInvite.photo);\n wrapPhoto({\n container: avatarElem,\n message: null,\n photo: chatInvite.photo,\n boxHeight: 100,\n boxWidth: 100,\n withoutPreloader: true\n });\n avatarElem.style.width = avatarElem.style.height = '';\n } else {\n putPhoto({\n div: avatarElem,\n peerId: NULL_PEER_ID,\n isDialog: false,\n title: chatInvite.title\n });\n }\n\n const title = document.createElement('div');\n title.classList.add('chat-title');\n setInnerHTML(title, wrapEmojiText(chatInvite.title));\n // avatarElem.setAttribute('peer', '' + -fakeChat.id);\n\n const isBroadcast = chatInvite.pFlags.broadcast;\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [numberThousandSplitter(chatInvite.participants_count)]);\n peopleCount.classList.add('chat-participants-count');\n\n this.body.append(avatarElem, title, peopleCount);\n\n if(chatInvite.pFlags.request_needed) {\n const caption = document.createElement('div');\n _i18n(caption, isBroadcast ? 'RequestToJoinChannelDescription' : 'RequestToJoinGroupDescription');\n caption.classList.add('chat-participants-count', 'request-caption');\n\n this.body.append(caption);\n }\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport callbackify from '../../helpers/callbackify';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {Document, MessagePeerReaction, ReactionCount} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport rootScope from '../../lib/rootScope';\nimport SetTransition from '../singleTransition';\nimport StackedAvatars from '../stackedAvatars';\nimport {Awaited} from '../../types';\nimport wrapSticker from '../wrappers/sticker';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport wrapStickerAnimation from '../wrappers/stickerAnimation';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport {fastRaf} from '../../helpers/schedulers';\nimport noop from '../../helpers/noop';\nimport {Middleware} from '../../helpers/middleware';\n\nconst CLASS_NAME = 'reaction';\nconst TAG_NAME = CLASS_NAME + '-element';\nconst REACTION_INLINE_SIZE = 14;\nconst REACTION_BLOCK_SIZE = 22;\n\nexport const REACTION_DISPLAY_INLINE_COUNTER_AT = 2;\nexport const REACTION_DISPLAY_BLOCK_COUNTER_AT = 4;\n\nexport type ReactionLayoutType = 'block' | 'inline';\n\nexport default class ReactionElement extends HTMLElement {\n private type: ReactionLayoutType;\n private counter: HTMLElement;\n private stickerContainer: HTMLElement;\n private stackedAvatars: StackedAvatars;\n private canRenderAvatars: boolean;\n private _reactionCount: ReactionCount;\n private wrapStickerPromise: Awaited>['render'];\n private managers: AppManagers;\n private middleware: Middleware;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.managers = rootScope.managers;\n }\n\n public get reactionCount() {\n return this._reactionCount;\n }\n\n public set reactionCount(reactionCount: ReactionCount) {\n this._reactionCount = reactionCount;\n }\n\n public get count() {\n return this.reactionCount.count;\n }\n\n public init(type: ReactionLayoutType, middleware: Middleware) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n this.middleware = middleware;\n }\n\n public setCanRenderAvatars(canRenderAvatars: boolean) {\n this.canRenderAvatars = canRenderAvatars;\n }\n\n public render(doNotRenderSticker?: boolean) {\n const hadStickerContainer = !!this.stickerContainer;\n if(!hadStickerContainer) {\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add(CLASS_NAME + '-sticker');\n this.append(this.stickerContainer);\n }\n\n const reactionCount = this.reactionCount;\n if(!doNotRenderSticker && !hadStickerContainer) {\n const reaction = reactionCount.reaction;\n if(reaction._ === 'reactionEmoji') {\n const availableReaction = this.managers.appReactionsManager.getReaction(reaction.emoticon);\n callbackify(availableReaction, (availableReaction) => {\n if(!availableReaction.center_icon) {\n this.stickerContainer.classList.add('is-static');\n }\n\n if(availableReaction.pFlags.inactive) {\n this.classList.add('is-inactive');\n }\n\n this.renderDoc(availableReaction.center_icon ?? availableReaction.static_icon);\n });\n } else if(reaction._ === 'reactionCustomEmoji') {\n this.stickerContainer.classList.add('is-custom');\n const wrapped = wrapCustomEmoji({\n docIds: [reaction.document_id],\n customEmojiSize: makeMediaSize(REACTION_BLOCK_SIZE, REACTION_BLOCK_SIZE)\n });\n\n this.stickerContainer.append(wrapped);\n }\n }\n }\n\n private renderDoc(doc: Document.document) {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE : REACTION_BLOCK_SIZE;\n const wrapPromise = this.wrapStickerPromise = wrapSticker({\n div: this.stickerContainer,\n doc,\n width: size,\n height: size,\n static: true,\n managers: this.managers,\n middleware: this.middleware\n }).then(({render}) => render).finally(() => {\n if(this.wrapStickerPromise === wrapPromise) {\n this.wrapStickerPromise = undefined;\n }\n });\n }\n\n public renderCounter() {\n const reactionCount = this.reactionCount;\n const displayOn = this.type === 'inline' ? REACTION_DISPLAY_INLINE_COUNTER_AT : REACTION_DISPLAY_BLOCK_COUNTER_AT;\n if(reactionCount.count >= displayOn || (this.type === 'block' && !this.canRenderAvatars)) {\n if(!this.counter) {\n this.counter = document.createElement(this.type === 'inline' ? 'i' : 'span');\n this.counter.classList.add(CLASS_NAME + '-counter');\n }\n\n const formatted = formatNumber(reactionCount.count);\n if(this.counter.textContent !== formatted) {\n this.counter.textContent = formatted;\n }\n\n if(!this.counter.parentElement) {\n this.append(this.counter);\n }\n } else if(this.counter?.parentElement) {\n this.counter.remove();\n this.counter = undefined;\n }\n }\n\n public renderAvatars(recentReactions: MessagePeerReaction[]) {\n if(this.type === 'inline') {\n return;\n }\n\n if(this.reactionCount.count >= REACTION_DISPLAY_BLOCK_COUNTER_AT || !this.canRenderAvatars) {\n if(this.stackedAvatars) {\n this.stackedAvatars.container.remove();\n this.stackedAvatars = undefined;\n }\n\n return;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n avatarSize: 24\n });\n\n this.append(this.stackedAvatars.container);\n }\n\n this.stackedAvatars.render(recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n public setIsChosen(isChosen = this.reactionCount.chosen_order !== undefined) {\n if(this.type === 'inline') return;\n const wasChosen = this.classList.contains('is-chosen') && !this.classList.contains('backwards');\n if(wasChosen !== isChosen) {\n SetTransition({\n element: this,\n className: 'is-chosen',\n forwards: isChosen,\n duration: this.isConnected ? 300 : 0\n });\n }\n }\n\n public fireAroundAnimation() {\n const reaction = this.reactionCount.reaction;\n if(reaction._ !== 'reactionEmoji') return;\n callbackify(this.managers.appReactionsManager.getReaction(reaction.emoticon), (availableReaction) => {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE + 14 : REACTION_BLOCK_SIZE + 18;\n const div = document.createElement('div');\n div.classList.add(CLASS_NAME + '-sticker-activate');\n\n Promise.all([\n wrapSticker({\n div: div,\n doc: availableReaction.center_icon,\n width: size,\n height: size,\n withThumb: false,\n needUpscale: true,\n play: false,\n skipRatio: 1,\n group: 'none',\n needFadeIn: false,\n managers: this.managers,\n middleware: this.middleware\n }).then(({render}) => render as Promise),\n\n wrapStickerAnimation({\n doc: availableReaction.around_animation,\n size: 80,\n target: this.stickerContainer,\n side: 'center',\n skipRatio: 1,\n play: false,\n managers: this.managers,\n middleware: this.middleware\n }).stickerPromise.catch(noop)\n ]).then(([iconPlayer, aroundPlayer]) => {\n const remove = () => {\n // if(!isInDOM(div)) return;\n iconPlayer.remove();\n div.remove();\n this.stickerContainer.classList.remove('has-animation');\n };\n\n if(!aroundPlayer) {\n remove();\n return;\n }\n\n const removeOnFrame = () => {\n // if(!isInDOM(div)) return;\n fastRaf(remove);\n };\n\n iconPlayer.addEventListener('enterFrame', (frameNo) => {\n if(frameNo === iconPlayer.maxFrame) {\n if(this.wrapStickerPromise) { // wait for fade in animation\n this.wrapStickerPromise.then(() => {\n setTimeout(removeOnFrame, 1e3);\n });\n } else {\n removeOnFrame();\n }\n }\n });\n\n iconPlayer.addEventListener('firstFrame', () => {\n this.stickerContainer.append(div);\n this.stickerContainer.classList.add('has-animation');\n iconPlayer.play();\n aroundPlayer.play();\n }, {once: true});\n });\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport {Middleware, MiddlewareHelper} from '../../helpers/middleware';\nimport {Message, ReactionCount} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport reactionsEqual from '../../lib/appManagers/utils/reactions/reactionsEqual';\nimport rootScope from '../../lib/rootScope';\nimport ReactionElement, {ReactionLayoutType, REACTION_DISPLAY_BLOCK_COUNTER_AT} from './reaction';\n\nconst CLASS_NAME = 'reactions';\nconst TAG_NAME = CLASS_NAME + '-element';\n\nconst REACTIONS_ELEMENTS: Map> = new Map();\nexport {REACTIONS_ELEMENTS};\n\nexport default class ReactionsElement extends HTMLElement {\n private message: Message.message;\n private key: string;\n private isPlaceholder: boolean;\n private type: ReactionLayoutType;\n private sorted: ReactionElement[];\n private onConnectCallback: () => void;\n private managers: AppManagers;\n private middleware: Middleware;\n private middlewareHelpers: Map;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.sorted = [];\n this.middlewareHelpers = new Map();\n this.managers = rootScope.managers;\n }\n\n connectedCallback() {\n let set = REACTIONS_ELEMENTS.get(this.key);\n if(!set) {\n REACTIONS_ELEMENTS.set(this.key, set = new Set());\n }\n\n set.add(this);\n\n if(this.onConnectCallback && this.isConnected) {\n this.onConnectCallback();\n this.onConnectCallback = undefined;\n }\n }\n\n disconnectedCallback() {\n const set = REACTIONS_ELEMENTS.get(this.key);\n set.delete(this);\n if(!set.size) {\n REACTIONS_ELEMENTS.delete(this.key);\n }\n }\n\n public getReactionCount(reactionElement: ReactionElement) {\n return this.sorted[this.sorted.indexOf(reactionElement)].reactionCount;\n }\n\n public getMessage() {\n return this.message;\n }\n\n public init(\n message: Message.message,\n type: ReactionLayoutType,\n middleware: Middleware,\n isPlaceholder = this.isPlaceholder\n ) {\n if(this.key !== undefined) {\n this.disconnectedCallback();\n }\n\n if(this.middleware !== middleware) {\n middleware.onDestroy(() => {\n this.middlewareHelpers.clear();\n });\n }\n\n this.message = message;\n this.key = this.message.peerId + '_' + this.message.mid;\n this.middleware = middleware;\n this.isPlaceholder = isPlaceholder;\n\n if(this.type !== type) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n }\n\n this.connectedCallback();\n }\n\n public changeMessage(message: Message.message) {\n return this.init(message, this.type, this.middleware);\n }\n\n public update(message: Message.message, changedResults?: ReactionCount[]) {\n this.message = message;\n this.render(changedResults);\n }\n\n public render(changedResults?: ReactionCount[]) {\n const reactions = this.message.reactions;\n const hasReactions = !!(reactions && reactions.results.length);\n this.classList.toggle('has-no-reactions', !hasReactions);\n if(!hasReactions && !this.sorted.length) return;\n\n const availableReactionsResult = this.managers.appReactionsManager.getAvailableReactions();\n // callbackify(availableReactionsResult, () => {\n const counts = hasReactions ? (\n reactions.results\n // availableReactionsResult instanceof Promise ?\n // reactions.results :\n // reactions.results.filter((reactionCount) => {\n // return this.managers.appReactionsManager.isReactionActive(reactionCount.reaction);\n // })\n ) : [];\n\n // if(this.message.peerId.isUser()) {\n // counts.sort((a, b) => (b.count - a.count) || ((b.chosen_order ?? 0) - (a.chosen_order ?? 0)));\n // } else {\n counts.sort((a, b) => (b.count - a.count) || ((a.chosen_order ?? 0) - (b.chosen_order ?? 0)));\n // }\n\n forEachReverse(this.sorted, (reactionElement, idx, arr) => {\n const reaction = reactionElement.reactionCount.reaction;\n const found = counts.some((reactionCount) => reactionsEqual(reactionCount.reaction, reaction));\n if(!found) {\n const middlewareHelper = this.middlewareHelpers.get(reactionElement);\n middlewareHelper.destroy();\n this.middlewareHelpers.delete(reactionElement);\n arr.splice(idx, 1);\n reactionElement.remove();\n }\n });\n\n const totalReactions = counts.reduce((acc, c) => acc + c.count, 0);\n const canRenderAvatars = reactions && (!!reactions.pFlags.can_see_list || this.message.peerId.isUser()) && totalReactions < REACTION_DISPLAY_BLOCK_COUNTER_AT;\n this.sorted = counts.map((reactionCount, idx) => {\n let reactionElement = this.sorted.find((reactionElement) => reactionsEqual(reactionElement.reactionCount.reaction, reactionCount.reaction));\n if(!reactionElement) {\n const middlewareHelper = this.middleware.create();\n reactionElement = new ReactionElement();\n reactionElement.init(this.type, middlewareHelper.get());\n this.middlewareHelpers.set(reactionElement, middlewareHelper);\n }\n\n positionElementByIndex(reactionElement, this, idx);\n\n const recentReactions = reactions.recent_reactions ? reactions.recent_reactions.filter((reaction) => reactionsEqual(reaction.reaction, reactionCount.reaction)) : [];\n reactionElement.reactionCount = {...reactionCount};\n reactionElement.setCanRenderAvatars(canRenderAvatars);\n reactionElement.render(this.isPlaceholder);\n reactionElement.renderCounter();\n reactionElement.renderAvatars(recentReactions);\n reactionElement.setIsChosen();\n\n return reactionElement;\n });\n\n // this.sorted.forEach((reactionElement, idx) => {\n // /* if(this.type === 'block' && this.childElementCount !== this.sorted.length) { // because of appended time\n // idx += 1;\n // } */\n\n // positionElementByIndex(reactionElement, this, idx);\n // });\n\n if(!this.isPlaceholder && changedResults?.length) {\n if(this.isConnected) {\n this.handleChangedResults(changedResults);\n } else {\n this.onConnectCallback = () => {\n this.handleChangedResults(changedResults);\n };\n }\n }\n // });\n\n // ! тут вообще не должно быть этого кода, но пока он побудет тут\n if(!this.sorted.length && this.type === 'block') {\n const parentElement = this.parentElement;\n this.remove();\n\n if(parentElement.classList.contains('document-message') && !parentElement.childNodes.length) {\n parentElement.remove();\n return;\n }\n\n const timeSpan = this.querySelector('.time');\n if(timeSpan) {\n parentElement.append(timeSpan);\n }\n }\n }\n\n private handleChangedResults(changedResults: ReactionCount[]) {\n // ! temp\n if(this.message.peerId !== appImManager.chat.peerId) return;\n\n changedResults.forEach((reactionCount) => {\n const reactionElement = this.sorted.find((reactionElement) => reactionsEqual(reactionElement.reactionCount.reaction, reactionCount.reaction));\n reactionElement?.fireAroundAnimation();\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionsElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport getVisibleRect from './dom/getVisibleRect';\nimport reflowScrollableElement from './dom/reflowScrollableElement';\n\nexport default class ScrollSaver {\n private scrollHeight: number;\n private scrollHeightMinusTop: number;\n private scrollTop: number;\n private clientHeight: number;\n private elements: {element: HTMLElement, rect: DOMRect}[];\n\n /**\n *\n * @param scrollable to reset scroll position and direction\n * @param reverse true means top\n */\n constructor(\n private scrollable: Scrollable,\n private query: string,\n private reverse: boolean\n ) {\n\n }\n\n private get container() {\n return this.scrollable.container;\n }\n\n public getSaved() {\n return {\n scrollHeight: this.scrollHeight,\n scrollTop: this.scrollTop,\n clientHeight: this.clientHeight\n };\n }\n\n public findElements() {\n if(!this.query) return [];\n\n const {container} = this;\n const containerRect = container.getBoundingClientRect();\n const bubbles = Array.from(container.querySelectorAll(this.query)) as HTMLElement[];\n const elements: ScrollSaver['elements'] = [];\n for(const bubble of bubbles) {\n const elementRect = bubble.getBoundingClientRect();\n const visibleRect = getVisibleRect(bubble, container, undefined, elementRect, containerRect);\n if(visibleRect) {\n elements.push({element: bubble, rect: elementRect});\n // break; // find first\n } else if(elements.length) { // find last\n break;\n }\n }\n\n if(!elements.length) {\n const bubble = bubbles[0];\n if(bubble) {\n elements.push({element: bubble, rect: bubble.getBoundingClientRect()});\n }\n }\n\n return elements;\n }\n\n public replaceSaved(from: HTMLElement, to: HTMLElement) {\n if(!this.elements) {\n return;\n }\n\n const idx = this.elements.findIndex(({element}) => from === element);\n if(idx !== -1) {\n this.elements[idx].element = to;\n }\n }\n\n public findAndSetElements() {\n this.elements = this.findElements();\n }\n\n public save() {\n this.findAndSetElements();\n // console.warn('scroll save', this.elements);\n this._save();\n }\n\n public _save() {\n const {scrollTop, scrollHeight, clientHeight} = this.container;\n\n // previousScrollHeight = scrollHeight;\n // previousScrollHeight = scrollHeight + padding;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n this.clientHeight = clientHeight;\n this.scrollHeightMinusTop = this.reverse ? scrollHeight - scrollTop : scrollTop;\n\n // this.chatInner.style.paddingTop = padding + 'px';\n /* if(reverse) {\n previousScrollHeightMinusTop = this.scrollable.scrollHeight - scrollTop;\n } else {\n previousScrollHeightMinusTop = scrollTop;\n } */\n }\n\n private onRestore(useReflow?: boolean) {\n if(IS_SAFARI && useReflow/* && !isAppleMobile */) { // * fix blinking and jumping\n reflowScrollableElement(this.container);\n }\n }\n\n private setScrollTop(newScrollTop: number, useReflow?: boolean) {\n // touchSupport for safari iOS\n // isTouchSupported && isApple && (container.container.style.overflow = 'hidden');\n this.scrollable.setScrollTopSilently(this.scrollTop = newScrollTop);\n // container.scrollTop = scrollHeight;\n // isTouchSupported && isApple && (container.container.style.overflow = '');\n\n this.onRestore(useReflow);\n }\n\n public restore(useReflow?: boolean) {\n const {scrollTop, scrollHeight} = this.scrollable;\n this.scrollHeight = scrollHeight;\n\n if(!this.elements.length) { // maybe all messages have been deleted\n this._restore(useReflow);\n return;\n }\n\n let anchor: ScrollSaver['elements'][0];\n // for(let i = this.elements.length - 1; i >= 0; --i) {\n // const _anchor = this.elements[i];\n // if(_anchor.element.parentElement) {\n // anchor = _anchor;\n // break;\n // }\n // }\n anchor = this.elements[this.elements.length - 1];\n\n if(!anchor?.element?.parentElement) { // try to find new anchor\n this.findAndSetElements();\n anchor = this.elements[this.elements.length - 1];\n\n if(!anchor) { // fallback to old method if smth is really strange\n this._restore(useReflow);\n return;\n }\n }\n\n const {element, rect} = anchor;\n const newRect = element.getBoundingClientRect();\n const diff = newRect.bottom - rect.bottom;\n this.setScrollTop(scrollTop + diff, useReflow);\n // if(diff) debugger;\n // console.warn('scroll restore', rect, diff, newRect);\n }\n\n public _restore(useReflow?: boolean) {\n const {scrollHeightMinusTop: previousScrollHeightMinusTop, scrollable} = this;\n // if(previousScrollHeightMinusTop === undefined) {\n // throw new Error('scroll was not saved');\n // }\n\n // const scrollHeight = container.scrollHeight;\n const scrollHeight = this.scrollHeight;\n // if(scrollHeight === this.scrollHeight) {\n // return;\n // }\n\n // this.scrollHeight = scrollHeight;\n\n /* const scrollHeight = container.scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n\n this.chatInner.style.paddingTop = (10000 - addedHeight) + 'px'; */\n /* const scrollHeight = scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n\n this.chatInner.style.paddingTop = (padding - addedHeight) + 'px';\n\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = reverse ? scrollHeight - addedHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n this.log('performHistoryResult: will set scrollTop',\n previousScrollHeightMinusTop, scrollHeight,\n newScrollTop, container.container.clientHeight); */\n // const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = this.reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n\n /* if(DEBUG) {\n this.log('performHistoryResult: will set up scrollTop:', newScrollTop, this.isHeavyAnimationInProgress);\n } */\n\n this.setScrollTop(newScrollTop, useReflow);\n\n /* if(DEBUG) {\n this.log('performHistoryResult: have set up scrollTop:', newScrollTop, container.scrollTop, container.scrollHeight, this.isHeavyAnimationInProgress);\n } */\n }\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.ScrollSaver = ScrollSaver);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type IntersectionTarget = Element;\nexport type IntersectionCallback = (entry: IntersectionObserverEntry) => void;\n\nexport default class SuperIntersectionObserver {\n private observing: Map>;\n private observingQueue: SuperIntersectionObserver['observing'];\n private observer: IntersectionObserver;\n private freezedObservingNew: boolean;\n\n constructor(init?: IntersectionObserverInit) {\n this.observing = new Map();\n this.observingQueue = new Map();\n this.freezedObservingNew = false;\n\n this.observer = new IntersectionObserver((entries) => {\n const observing = this.observing;\n for(let i = 0, length = entries.length; i < length; ++i) {\n const entry = entries[i];\n const callbacks = observing.get(entry.target);\n if(!callbacks) {\n console.error('intersection process no callbacks:', entry);\n debugger;\n continue;\n }\n\n for(const callback of callbacks) {\n try {\n callback(entry);\n } catch(err) {\n console.error('intersection process callback error:', err);\n }\n }\n }\n }, init);\n }\n\n public disconnect() {\n this.observing.clear();\n this.observingQueue.clear();\n this.observer.disconnect();\n }\n\n public toggleObservingNew(value: boolean) {\n if(this.freezedObservingNew === value) {\n return;\n }\n\n this.freezedObservingNew = value;\n\n const queue = this.observingQueue;\n if(!value && queue.size) {\n for(const [target, callbacks] of queue) {\n for(const callback of callbacks) {\n this.observe(target, callback);\n }\n }\n\n queue.clear();\n }\n }\n\n public has(target: IntersectionTarget, callback: IntersectionCallback, observing = this.observing) {\n const callbacks = observing.get(target);\n return !!(callbacks && callbacks.has(callback));\n }\n\n public observe(target: IntersectionTarget, callback: IntersectionCallback) {\n if(this.freezedObservingNew && this.has(target, callback)) {\n return;\n }\n\n const observing = this.freezedObservingNew ? this.observingQueue : this.observing;\n let callbacks = observing.get(target);\n if(callbacks && callbacks.has(callback)) {\n return;\n }\n\n if(!callbacks) {\n callbacks = new Set();\n observing.set(target, callbacks);\n\n if(observing === this.observing) {\n this.observer.observe(target);\n }\n }\n\n callbacks.add(callback);\n }\n\n public unobserve(target: IntersectionTarget, callback: IntersectionCallback) {\n const observing = this.freezedObservingNew && !this.has(target, callback) ? this.observingQueue : this.observing;\n const callbacks = observing.get(target);\n if(!callbacks) {\n return;\n }\n\n callbacks.delete(callback);\n if(!callbacks.size) {\n observing.delete(target);\n this.observer.unobserve(target);\n }\n }\n}\n","import type {MyDocument} from '../../appDocsManager';\nimport type {MyMessage} from '../../appMessagesManager';\nimport {Message, MessageMedia} from '../../../../layer';\n\nexport default function isMentionUnread(message: MyMessage) {\n if(!message) {\n return false;\n }\n\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n return !!(\n message.pFlags.media_unread &&\n message.pFlags.mentioned &&\n (\n !doc ||\n !(['voice', 'round'] as MyDocument['type'][]).includes(doc.type)\n )\n );\n}\n","export default function accumulate(arr: number[], initialValue: number) {\n return arr.reduce((acc, value) => acc + value, initialValue);\n}\n","function cacheCallback(callback: (str: A) => T) {\n const stringResults: any = {}, numberResults: any = {};\n return (value: A): T => {\n const key = '_' + value;\n return (typeof(value) === 'string' ? stringResults : numberResults)[key] ??= callback(value);\n };\n}\n\nexport default cacheCallback;\n","export default function replaceNonNumber(str: string) {\n return str.replace(/\\D/g, '');\n}\n","import cacheCallback from '../cacheCallback';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nconst CARD_BRAND_REGEXP: {[brand: string]: RegExp} = {\n visa: /^4/,\n mastercard: /^(51|52|53|54|55|222|23|24|25|26|27)/,\n amex: /^(34|37)/,\n discover: /^(60|64|65)/,\n diners: /^(30|38|39)/,\n diners14: /^(36)/,\n jcb: /^(35)/,\n unionpay: /^(62[0-6,8-9]|627[0-6,8-9]|6277[0-7,9]|62778[1-9]|81)/,\n elo: /^(5067|509|636368|627780)/,\n mir: /^(220[0-4])/\n};\n\n// * taken from Stripe\nexport const CARD_BRANDS: {[b: string]: {\n minLength: number,\n maxLength: number,\n cvcMaxLength: number,\n cvcMinLength: number | null\n}} = {\n visa: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n mastercard: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n amex: {\n minLength: 15,\n maxLength: 15,\n cvcMaxLength: 4,\n cvcMinLength: 3\n },\n unionpay: {\n minLength: 13,\n maxLength: 19,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n diners: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n diners14: {\n minLength: 14,\n maxLength: 14,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n discover: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n jcb: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n elo: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n mir: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n unknown: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 4,\n cvcMinLength: 3\n }\n};\n\nexport const detectCardBrand = cacheCallback((card: string = '') => {\n const keys = Object.keys(CARD_BRAND_REGEXP);\n const sanitizedCard = replaceNonNumber(card);\n let brand: string;\n let last = 0;\n keys.forEach((key) => {\n const regExp = CARD_BRAND_REGEXP[key];\n const match = sanitizedCard.match(regExp);\n if(match) {\n const result = match[0];\n if(result && result.length > last) {\n brand = key;\n last = result.length;\n }\n }\n });\n\n return brand || 'unknown';\n});\n\nexport function cardBrandToUnifiedBrand(brand: string) {\n return brand === 'diners14' ? 'diners' : brand;\n}\n\nexport function detectUnifiedCardBrand(card = '') {\n const brand = detectCardBrand(card);\n return cardBrandToUnifiedBrand(brand);\n}\n","export default function createArray(length: number, fill?: T1, map?: any): T1[] {\n const arr = new Array(length);\n arr.fill(fill);\n return map ? arr.map(map) : arr;\n}\n","const delta = '0'.charCodeAt(0) - '0'.charCodeAt(0);\nconst buggedRegExp = /[0-9]/g;\n\n// function hasBuggedNumbers(str: string) {\n// return !!str.match(a);\n// }\n\nfunction getDistanceFromBuggedToNormal(char: string) {\n return String.fromCharCode(char.charCodeAt(0) - delta);\n}\n\nexport function fixBuggedNumbers(str: string) {\n return str.replace(buggedRegExp, getDistanceFromBuggedToNormal);\n}\n","import {fixBuggedNumbers} from '../string/buggedNumbers';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nexport type PatternCharacter = {\n type: 'optional',\n result: string,\n consumed: number\n} | {\n type: 'required',\n result: string,\n consumed: number,\n partial?: boolean\n} | {\n type: 'formatting',\n result: string,\n consumed: number\n};\n\nexport type PatternFunction = (str: string) => ((str: string) => PatternCharacter)[];\n\nfunction makeOptionalCharacter(result: string, consumed: number): PatternCharacter {\n return {type: 'optional', result, consumed};\n}\n\nfunction makeRequiredCharacter(result: string, consumed: number, partial?: boolean): PatternCharacter {\n return {type: 'required', result, consumed, partial};\n}\n\nfunction makeFormattingCharacter(result: string, consumed: number): PatternCharacter {\n return {type: 'formatting', result, consumed};\n}\n\nfunction wrapCharacterRegExpFactory(regExp: RegExp, optional?: boolean) {\n return (str: string) => {\n const _regExp = new RegExp('^'.concat(regExp.source.replace(/^\\^/, '')));\n const match = str.match(_regExp);\n const makeCharacter = optional ? makeOptionalCharacter : makeRequiredCharacter;\n if(match) {\n const result = match[0];\n return makeCharacter(result, match.index + result.length);\n }\n\n return makeCharacter('', str.length);\n };\n}\n\nfunction makeCapitalPatternCharacter(str: string) {\n const char = wrapCharacterRegExpFactory(/\\w/)(str);\n return char.result ? makeRequiredCharacter(char.result.toUpperCase(), char.consumed) : char;\n}\n\nconst makeMonthDigitPatternCharacter = wrapCharacterRegExpFactory(/1[0-2]|0?[1-9]|0/);\n\nfunction digit(str: string) {\n return wrapCharacterRegExpFactory(/[0-9]/)(fixBuggedNumbers(str));\n}\n\nconst patternCharacters = {\n digit,\n capitalCharacter: makeCapitalPatternCharacter,\n month: (str: string) => {\n const char = makeMonthDigitPatternCharacter(fixBuggedNumbers(str));\n const cleanedResult = replaceNonNumber(char.result);\n const isPartial = ['0', '1'].includes(char.result) && str.length === 1;\n if(isPartial || (char.result === '0' && str.length >= 2)) {\n return makeRequiredCharacter(char.result, str.length, true);\n }\n\n return makeRequiredCharacter(cleanedResult.length === 1 ? '0' + cleanedResult : cleanedResult, char.consumed);\n },\n formattingCharacter: (str: string) => {\n return (str1: string) => {\n const consumed = str === str1[0] ? 1 : 0;\n return makeFormattingCharacter(str, consumed);\n }\n },\n optionalPattern: (regExp: RegExp) => {\n return (str: string) => {\n const char = wrapCharacterRegExpFactory(regExp, true)(str);\n return char.result ? char : makeOptionalCharacter('', 0);\n };\n }\n};\n\nexport default patternCharacters;\n","import {IS_ANDROID} from '../../environment/userAgent';\nimport createArray from '../array/createArray';\nimport cacheCallback from '../cacheCallback';\nimport replaceNonNumber from '../string/replaceNonNumber';\nimport {CARD_BRANDS, detectCardBrand} from './cardBrands';\nimport patternCharacters from './patternCharacters';\n\nconst digit = patternCharacters.digit;\nconst capitalCharacter = patternCharacters.capitalCharacter;\nconst spaceCharacter = patternCharacters.formattingCharacter(' ');\nconst yearOptionalPattern = patternCharacters.optionalPattern(/\\d\\d/);\nconst sixteenPattern = [digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit];\nconst fifteenPattern = [digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit];\n\nconst requiredPostcodes = new Set(['DZ', 'AR', 'AM', 'AU', 'AT', 'AZ', 'PT', 'BD', 'BY', 'BE', 'BA', 'BR', 'BN', 'BG', 'CA', 'IC', 'CN', 'CO', 'HR', 'CY', 'CZ', 'DK', 'EC', 'GB', 'EE', 'FO', 'FI', 'FR', 'GE', 'DE', 'GR', 'GL', 'GU', 'GG', 'NL', 'HU', 'IN', 'ID', 'IL', 'IT', 'JP', 'JE', 'KZ', 'KR', 'FM', 'KG', 'LV', 'LI', 'LT', 'LU', 'MK', 'MG', 'PT', 'MY', 'MH', 'MQ', 'YT', 'MX', 'MN', 'ME', 'NL', 'NZ', 'GB', 'NO', 'PK', 'PH', 'PL', 'FM', 'PT', 'PR', 'RE', 'RU', 'SA', 'SF', 'RS', 'SG', 'SK', 'SI', 'ZA', 'ES', 'LK', 'SX', 'VI', 'VI', 'SE', 'CH', 'TW', 'TJ', 'TH', 'TU', 'TN', 'TR', 'TM', 'VI', 'UA', 'GB', 'US', 'UY', 'UZ', 'VA', 'VN', 'GB', 'FM']);\n\nconst generateFourPattern = cacheCallback((length: number) => {\n const out: Array = [];\n\n for(let i = 0, k = 0; i < length;) {\n if(k === 4) {\n out.push(spaceCharacter);\n k = 0;\n } else {\n out.push(digit);\n ++i;\n ++k;\n }\n }\n\n return out;\n});\n\nfunction generateCardNumberPattern(card: string) {\n const brand = detectCardBrand(card);\n if(brand === 'amex') return sixteenPattern;\n if(brand === 'diners14') return fifteenPattern;\n const {minLength, maxLength} = CARD_BRANDS[brand];\n const s = replaceNonNumber(card).length;\n const d = Math.min(Math.max(minLength, s), maxLength);\n return generateFourPattern(d);\n}\n\nconst cardFormattingPatterns = {\n cardNumber: generateCardNumberPattern,\n cardExpiry: () => [patternCharacters.month, patternCharacters.formattingCharacter('/'), digit, digit, yearOptionalPattern],\n cardCvc: (card?: string) => cardFormattingPatterns.cardCvcFromBrand(detectCardBrand(card)),\n cardCvcFromBrand: cacheCallback((brand: string) => {\n const info = CARD_BRANDS[brand];\n const {cvcMinLength, cvcMaxLength} = info;\n const pattern = createArray(cvcMinLength || cvcMaxLength, digit);\n if(cvcMinLength && cvcMinLength < cvcMaxLength) {\n const i = cvcMaxLength - cvcMinLength;\n const h = patternCharacters.optionalPattern(/\\d/);\n if(i) {\n pattern.push(...createArray(i, h));\n }\n }\n\n return pattern;\n }),\n postalCodeFromCountry: cacheCallback((iso2: string) => {\n switch(iso2) {\n case 'US':\n return createArray(5, digit);\n case 'CA':\n return IS_ANDROID ? null : [capitalCharacter, capitalCharacter, capitalCharacter, spaceCharacter, capitalCharacter, capitalCharacter, capitalCharacter];\n default:\n const optionalDigits = createArray(10, patternCharacters.optionalPattern(/\\d/));\n if(requiredPostcodes.has(iso2)) {\n optionalDigits[0] = digit;\n }\n return optionalDigits;\n }\n })\n};\n\nexport default cardFormattingPatterns;\n","import accumulate from '../array/accumulate';\nimport {PatternFunction} from './patternCharacters';\n\nfunction accumulateLengths(strs: string[]) {\n return accumulate(strs.map((str) => str.length), 0);\n}\n\nfunction formatValueByPattern(\n getPattern: PatternFunction,\n value: string,\n options: Partial<{\n selectionStart: number,\n selectionEnd: number\n }> = {},\n pushRest?: boolean\n) {\n const pattern = getPattern(value);\n\n if(!pattern) {\n return {\n value: value,\n selection: null as typeof options,\n autocorrectComplete: !!value\n };\n }\n\n const length = pattern.length;\n const c: string[] = [];\n const s: string[] = [];\n\n let l = 0;\n let i = 0;\n let f = options.selectionStart === 0 ? 0 : null;\n let d = options.selectionEnd === 0 ? 0 : null;\n const p = () => {\n if(f === null && (i + 1) >= options.selectionStart) f = accumulateLengths(c) + (pushRest ? s.length : 0);\n if(d === null && (i + 1) >= options.selectionEnd) d = accumulateLengths(c) + (pushRest ? s.length : 0);\n };\n const m = (e: number) => {\n if(e > 0) {\n p();\n i += e;\n }\n };\n\n for(; l < length;) {\n const getCharacter = pattern[l];\n const character = getCharacter(value.slice(i));\n const {type, result, consumed} = character;\n if(type === 'required') {\n if(result) {\n c.push(...s, result);\n s.length = 0;\n ++l;\n\n if(character.partial) {\n m(value.length - i);\n break;\n }\n\n m(consumed);\n } else {\n if(!consumed) {\n break;\n }\n\n m(1);\n }\n } else if(type === 'optional') {\n if(result) {\n c.push(...s, result);\n s.length = 0;\n m(consumed);\n }\n\n ++l;\n } else if(type === 'formatting') {\n if(!pushRest && i >= value.length) {\n break;\n }\n\n s.push(result);\n ++l;\n m(consumed);\n }\n }\n\n if(pushRest) {\n c.push(...s);\n }\n\n return {\n value: c.join(''),\n selection: {\n selectionStart: f === null || value.length && options.selectionStart === value.length ? accumulateLengths(c) : f,\n selectionEnd: d === null || value.length && options.selectionEnd === value.length ? accumulateLengths(c) : d\n },\n autocorrectComplete: l === length\n };\n}\n\nexport default formatValueByPattern;\n","import {CARD_BRANDS, detectCardBrand} from './cardBrands';\nimport formatInputValueByPattern from './formatInputValueByPattern';\nimport NBSP from '../string/nbsp';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nexport type PatternValidationOptions = Partial<{\n ignoreIncomplete: boolean\n}>;\n\nconst nbspRegExp = new RegExp(NBSP, 'g');\n\nfunction makeValidationError(code?: string) {\n return code ? {\n type: 'invalid',\n code\n } : null;\n}\n\n// Luhn algorithm\nfunction validateCompleteCardNumber(card: string) {\n const t = '0'.charCodeAt(0);\n const n = card.length % 2;\n let a = 0;\n for(let i = card.length - 1; i >= 0; --i) {\n const c = n === (i % 2);\n let o = card.charCodeAt(i) - t;\n if(c) o *= 2;\n if(o > 9) o -= 9;\n a += o;\n }\n return !(a % 10);\n}\n\nfunction validateExpiry(year: number, month: number, options?: PatternValidationOptions) {\n const date = new Date(Date.now());\n const _year = year < 100 ? date.getFullYear() % 100 : date.getFullYear();\n const nextMonth = date.getMonth() + 1;\n\n if(isNaN(year) || isNaN(month)) {\n return options?.ignoreIncomplete ? null : 'incomplete';\n }\n\n if((year - _year) < 0) {\n return 'invalid_expiry_year_past';\n }\n\n if((year - _year) > 50) {\n return 'invalid_expiry_year';\n }\n\n return !(year - _year) && month < nextMonth ? 'invalid_expiry_month_past' : null;\n}\n\nfunction getCardInfoByNumber(card: string) {\n const sanitized = replaceNonNumber(card);\n const brand = detectCardBrand(card);\n return {\n sanitized,\n brand,\n minLength: CARD_BRANDS[brand].minLength\n };\n}\n\nfunction makeCardNumberError(str: string, length: number, ignoreIncomplete: boolean) {\n if(str.length >= length) {\n return validateCompleteCardNumber(str) || detectCardBrand(str) === 'mir' ? null : makeValidationError('invalid');\n }\n\n return ignoreIncomplete ? null : makeValidationError('incomplete');\n}\n\nexport function validateCardNumber(str: string, options: PatternValidationOptions = {}) {\n const {sanitized, minLength} = getCardInfoByNumber(str);\n return makeCardNumberError(sanitized, minLength, options.ignoreIncomplete);\n}\n\nexport function validateCardExpiry(str: string, options: PatternValidationOptions = {}) {\n const sanitized = str.replace(nbspRegExp, '').split(/ ?\\/ ?/);\n const [monthStr, yearStr = ''] = sanitized;\n const [month, year] = [monthStr, yearStr].map((str) => +str);\n const s = yearStr.length === 2 ? year % 100 : year;\n return yearStr.length < 2 || yearStr.length === 3 ? (options.ignoreIncomplete ? null : makeValidationError('incomplete')) : makeValidationError(validateExpiry(s, month, options));\n}\n\nexport function validateAnyIncomplete(formatted: ReturnType, str: string, options: PatternValidationOptions = {}) {\n return formatted.meta.autocorrectComplete || options.ignoreIncomplete ? null : makeValidationError('incomplete');\n}\n","const NBSP = '‎';\nexport default NBSP;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {TelegramWebViewEvent, TelegramWebViewEventCallback, TelegramWebViewEventMap} from '../types';\n\nconst weakMap: WeakMap = new WeakMap();\nwindow.addEventListener('message', (e) => {\n const callback = weakMap.get(e.source as Window);\n if(!callback) {\n return;\n }\n\n callback(JSON.parse(e.data));\n});\n\nexport default class TelegramWebView extends EventListenerBase<{\n [type in keyof TelegramWebViewEventMap]: (data: TelegramWebViewEventMap[type]) => void\n}> {\n public iframe: HTMLIFrameElement;\n\n constructor({url, sandbox}: {\n url: string,\n sandbox?: string\n }) {\n super(false);\n\n const iframe = this.iframe = document.createElement('iframe');\n iframe.src = url;\n if(sandbox) iframe.setAttribute('sandbox', sandbox);\n }\n\n public onMount() {\n weakMap.set(this.iframe.contentWindow, this.onTelegramWebViewEvent);\n }\n\n public destroy() {\n this.cleanup();\n weakMap.delete(this.iframe.contentWindow);\n }\n\n private onTelegramWebViewEvent = ({eventType, eventData}: TelegramWebViewEvent) => {\n if((eventData as any) === '') {\n eventData = undefined;\n }\n\n console.log('onTelegramWebViewEvent', eventType, eventData);\n this.dispatchEvent(eventType, eventData as any);\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport TelegramWebView from '../telegramWebView';\n\nexport function createVerificationIframe(options: ConstructorParameters[0]) {\n const result = new TelegramWebView({\n ...options,\n sandbox: 'allow-forms allow-scripts allow-same-origin allow-modals'\n });\n const {iframe} = result;\n iframe.allow = 'payment';\n iframe.classList.add('payment-verification');\n return result;\n}\n\nexport default class PopupPaymentVerification extends PopupElement<{\n finish: () => void\n}> {\n private telegramWebView: TelegramWebView;\n\n constructor(private url: string, private openPathAfter?: boolean) {\n super('popup-payment popup-payment-verification', {\n closable: true,\n overlayClosable: true,\n body: true,\n title: 'Checkout.WebConfirmation.Title'\n });\n\n this.d();\n }\n\n private d() {\n const telegramWebView = this.telegramWebView = createVerificationIframe({\n url: this.url\n });\n\n telegramWebView.addEventListener('web_app_open_tg_link', (e) => {\n this.dispatchEvent('finish');\n this.hide();\n if(this.openPathAfter) {\n appImManager.openUrl('https://t.me' + e.path_full);\n }\n });\n\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n\n protected destroy() {\n this.telegramWebView.destroy();\n return super.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport cardFormattingPatterns from '../../helpers/cards/cardFormattingPatterns';\nimport {detectUnifiedCardBrand} from '../../helpers/cards/cardBrands';\nimport formatInputValueByPattern from '../../helpers/cards/formatInputValueByPattern';\nimport {validateAnyIncomplete, validateCardExpiry, validateCardNumber} from '../../helpers/cards/validateCard';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport noop from '../../helpers/noop';\nimport {PaymentsPaymentForm} from '../../layer';\nimport {LangPackKey, _i18n} from '../../lib/langPack';\nimport CheckboxField from '../checkboxField';\nimport confirmationPopup from '../confirmationPopup';\nimport CountryInputField from '../countryInputField';\nimport InputField, {InputFieldOptions, InputState} from '../inputField';\nimport Row from '../row';\nimport {getPaymentBrandIconPath, PaymentButton, PaymentsCredentialsToken} from './payment';\nimport {createVerificationIframe} from './paymentVerification';\nimport {PasswordInputHelpers} from '../passwordInputField';\nimport SettingSection from '../settingSection';\nimport TelegramWebView from '../telegramWebView';\n\nexport type PaymentCardDetails = {\n cardNumber: string;\n cardholderName: string;\n expiryFull: string;\n expiryMonth: string;\n expiryYear: string;\n cvc: string;\n country: string;\n zip: string;\n save?: boolean;\n};\n\nexport type PaymentCardDetailsShort = {\n title: string,\n save?: boolean;\n icon?: string;\n};\n\nexport type PaymentCardDetailsResult = PaymentCardDetails | PaymentCardDetailsShort;\n\nexport class InputFieldCorrected extends InputField {\n private lastKeyDown: string;\n private lastTransformed: ReturnType;\n\n constructor(public options: InputFieldOptions & {\n formatMethod: typeof cardFormattingPatterns['cardNumber'],\n validateMethod?: typeof validateCardNumber,\n errorKeys?: {[code: string]: LangPackKey},\n optional?: boolean,\n onChange?: (transformed: InputFieldCorrected['lastTransformed']) => void,\n onKeyDown?: (e: KeyboardEvent) => void\n }) {\n super(options);\n\n // const handleIncomplete = (t?: any) => {\n // if(\n // (!lastTransformed.value && t) ||\n // lastTransformed.meta.autocorrectComplete ||\n // lastTransformed.meta.error ||\n // optional\n // ) {\n // return;\n // }\n\n\n // };\n\n this.input.addEventListener('keydown', this.onKeyDown);\n this.input.addEventListener('input', this.onInput);\n this.input.addEventListener('blur', this.onBlur);\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n this.lastKeyDown = e.key;\n this.options.onKeyDown?.(e);\n };\n\n private onInput = () => {\n const value = this.value;\n const deleting = this.lastKeyDown === 'Backspace' && (((this.lastTransformed && this.lastTransformed.value.length) || 0) - value.length) === 1;\n const result = this.lastTransformed = formatInputValueByPattern({\n value: value,\n getPattern: this.options.formatMethod,\n deleting,\n input: this.input\n });\n\n const transformedValue = result.value;\n if(transformedValue !== value) {\n this.setValueSilently(transformedValue);\n\n if(result.selection) {\n (this.input as HTMLInputElement).selectionStart = result.selection.selectionStart;\n (this.input as HTMLInputElement).selectionEnd = result.selection.selectionEnd;\n }\n }\n\n this.validateNew(transformedValue, {ignoreIncomplete: true/* !result.meta.autocorrectComplete */});\n\n this.options.onChange?.(result);\n };\n\n private onBlur = () => {\n const value = this.lastTransformed?.value;\n if(value) {\n this.validateNew(value);\n }\n };\n\n public update() {\n this.onInput();\n }\n\n public validate = () => {\n return this.validateNew();\n };\n\n public validateNew(\n value = this.lastTransformed?.value ?? '',\n t: any = {},\n justReturn?: boolean\n ) {\n let result: ReturnType;\n if(this.options.validateMethod) {\n result = this.options.validateMethod?.(value, t);\n } else {\n result = validateAnyIncomplete(this.lastTransformed, value, t);\n }\n\n if(result?.code) {\n const langPackKey: LangPackKey = this.options.errorKeys?.[result.code];\n !justReturn && this.setState(InputState.Error, langPackKey);\n return false;\n }\n\n !justReturn && this.setState(InputState.Neutral);\n return true;\n }\n}\n\nexport function handleInputFieldsOnChange(inputFields: (CountryInputField | InputField | InputFieldCorrected)[], _onChange: (valid: boolean) => void) {\n const onChange = () => {\n const valid = inputFields.every((inputField) => {\n return 'validateNew' in inputField ? inputField.validateNew(undefined, undefined, true) : inputField.isValid();\n });\n\n _onChange(valid);\n };\n\n inputFields.forEach((inputField) => {\n if(inputField instanceof InputFieldCorrected) {\n const original = inputField.options.onChange;\n inputField.options.onChange = (...args: any[]) => {\n // @ts-ignore\n original?.(...args);\n onChange();\n };\n\n if('update' in inputField) {\n inputField.update();\n }\n } else {\n inputField.input.addEventListener('input', onChange);\n }\n });\n\n return {validate: onChange};\n}\n\nexport function createCountryZipFields(country?: boolean, zip?: boolean) {\n let countryInputField: CountryInputField, postcodeInputField: InputFieldCorrected;\n if(country || zip) {\n if(country) countryInputField = new CountryInputField({\n noPhoneCodes: true,\n onCountryChange: () => {\n postcodeInputField?.update();\n },\n required: true,\n autocomplete: 'country'\n });\n if(zip) postcodeInputField = new InputFieldCorrected({\n label: 'PaymentShippingZipPlaceholder',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'postal-code',\n formatMethod: (/* ...args */) => {\n const {country} = countryInputField.getSelected();\n const iso2 = country?.iso2;\n return cardFormattingPatterns.postalCodeFromCountry(iso2 && iso2.toUpperCase());\n }\n });\n }\n\n return {countryInputField, postcodeInputField};\n}\n\nexport type PaymentsNativeProvider = 'stripe' | 'smartglocal';\nexport type PaymentsNativeParams = {\n need_country?: boolean,\n need_zip?: boolean,\n need_cardholder_name?: boolean,\n publishable_key?: string, // stripe\n public_token?: string, // smartglocal\n gpay_params: string,\n};\nconst SUPPORTED_NATIVE_PROVIDERS: Set = new Set(['stripe', 'smartglocal']);\n\nexport default class PopupPaymentCard extends PopupElement<{\n finish: (obj: {token: any, card: PaymentCardDetailsResult}) => void\n}> {\n protected telegramWebView: TelegramWebView;\n\n constructor(private paymentForm: PaymentsPaymentForm, private savedCard?: PaymentCardDetails) {\n super('popup-payment popup-payment-card', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: SUPPORTED_NATIVE_PROVIDERS.has(paymentForm.native_provider as PaymentsNativeProvider),\n title: 'PaymentCardInfo'\n });\n\n if(SUPPORTED_NATIVE_PROVIDERS.has(paymentForm.native_provider as PaymentsNativeProvider)) {\n this.d();\n } else {\n const telegramWebView = this.telegramWebView = createVerificationIframe({\n url: paymentForm.url\n });\n\n telegramWebView.addEventListener('payment_form_submit', (data) => {\n const cardOut = {title: data.title, save: false} as any as PaymentCardDetails;\n this.dispatchEvent('finish', {\n token: data.credentials,\n card: cardOut\n });\n\n this.hide();\n\n if(paymentForm.pFlags.can_save_credentials) {\n confirmationPopup({\n titleLangKey: 'PaymentCardSavePaymentInformation',\n descriptionLangKey: 'PaymentCardSavePaymentInformationInfoLine1',\n button: {\n langKey: 'Save'\n }\n }).then(() => {\n cardOut.save = true;\n }, noop);\n }\n });\n\n // putPreloader(this.body, true);\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n }\n\n protected destroy() {\n this.telegramWebView?.destroy();\n return super.destroy();\n }\n\n private d() {\n const savedCard = this.savedCard;\n const cardSection = new SettingSection({name: 'PaymentInfo.Card.Title', noDelimiter: true, noShadow: true});\n\n const nativeParams: PaymentsNativeParams = JSON.parse(this.paymentForm.native_params.data);\n\n let lastBrand: string, brandIconTempId = 0, lastBrandImg: HTMLImageElement;\n const setBrandIcon = (brand: string) => {\n if(lastBrand === brand) {\n return;\n }\n\n const tempId = ++brandIconTempId;\n lastBrand = brand;\n\n const path = getPaymentBrandIconPath(brand);\n if(!path) {\n if(lastBrandImg) {\n lastBrandImg.remove();\n lastBrandImg = undefined;\n }\n\n return;\n }\n\n const img = new Image();\n img.classList.add('input-field-icon');\n renderImageFromUrlPromise(img, path, false).then(() => {\n if(brandIconTempId !== tempId) {\n return;\n }\n\n if(lastBrandImg) {\n lastBrandImg.replaceWith(img);\n } else {\n cardInputField.container.append(img);\n }\n\n lastBrandImg = img;\n });\n };\n const cardInputField = new InputFieldCorrected({\n label: 'PaymentCardNumber',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-number',\n formatMethod: cardFormattingPatterns.cardNumber,\n validateMethod: validateCardNumber,\n errorKeys: {\n invalid: 'PaymentCard.Error.Invalid',\n incomplete: 'PaymentCard.Error.Incomplete'\n },\n onChange: (transformed) => {\n setBrandIcon(detectUnifiedCardBrand(transformed.value));\n cvcInputField.update(); // format cvc\n }\n });\n\n let nameInputField: InputField;\n if(nativeParams.need_cardholder_name) nameInputField = new InputField({\n label: 'Checkout.NewCard.CardholderNamePlaceholder',\n maxLength: 255,\n required: true,\n autocomplete: 'cc-name'\n });\n\n const expireInputField = new InputFieldCorrected({\n label: 'SecureId.Identity.Placeholder.ExpiryDate',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-exp',\n formatMethod: cardFormattingPatterns.cardExpiry,\n validateMethod: validateCardExpiry\n });\n\n // handle autocomplete: 01/2345 -> 01/45\n expireInputField.input.addEventListener('input', () => {\n let value = expireInputField.value;\n if(value.length < 5) {\n return;\n }\n\n const splitted = value.split('/');\n if(splitted[1].length !== 4) {\n return;\n }\n\n value = [splitted[0], splitted[1].slice(2)].join('/');\n expireInputField.setValueSilently(value);\n }, {capture: true});\n\n const cvcInputField = new InputFieldCorrected({\n labelText: 'CVC',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-csc',\n name: 'cvc',\n formatMethod: () => cardFormattingPatterns.cardCvc(cardInputField.value)\n // validateMethod: (...args) => _5AH3.a.cardCvc(cardInputField.value)(...args)\n });\n\n const passwordHelpers = new PasswordInputHelpers(cvcInputField.container, cvcInputField.input as HTMLInputElement);\n\n const switchFocusOrder: (InputFieldCorrected | InputField)[] = [\n cardInputField,\n expireInputField,\n cvcInputField,\n nameInputField\n ].filter(Boolean);\n switchFocusOrder.forEach((inputField) => {\n const onKeyDown = (e: KeyboardEvent) => {\n if(!inputField.value && e.key === 'Backspace') {\n const previousInputField = switchFocusOrder[switchFocusOrder.indexOf(inputField) - 1];\n if(previousInputField) {\n // previousInputField.value = previousInputField.value.slice(0, -1);\n placeCaretAtEnd(previousInputField.input, true);\n }\n }\n };\n\n if(inputField instanceof InputFieldCorrected) {\n inputField.options.onKeyDown = onKeyDown;\n\n const original = inputField.options.onChange;\n inputField.options.onChange = (transformed) => {\n original?.(transformed);\n\n if(document.activeElement === inputField.input && transformed.meta.autocorrectComplete) {\n for(let i = switchFocusOrder.indexOf(inputField), length = switchFocusOrder.length; i < length; ++i) {\n const nextInputField = switchFocusOrder[i];\n if(\n nextInputField instanceof InputFieldCorrected ?\n !nextInputField.validateNew(undefined, undefined, true) :\n !nextInputField.value\n ) {\n placeCaretAtEnd(nextInputField.input, true);\n break;\n }\n }\n }\n };\n } else {\n inputField.input.addEventListener('keydown', onKeyDown);\n }\n });\n\n const inputFieldsRow = document.createElement('div');\n inputFieldsRow.classList.add('input-fields-row');\n inputFieldsRow.append(expireInputField.container, cvcInputField.container);\n\n const form = document.createElement('form');\n form.append(...[\n cardInputField.container,\n inputFieldsRow,\n nameInputField?.container\n ].filter(Boolean))\n\n cardSection.content.append(form);\n\n let billingSection: SettingSection;\n // let saveCheckboxField: CheckboxField;\n const {countryInputField, postcodeInputField} = createCountryZipFields(nativeParams.need_country, nativeParams.need_zip);\n if(nativeParams.need_country || nativeParams.need_zip) {\n billingSection = new SettingSection({name: 'PaymentInfo.Billing.Title', noDelimiter: true, noShadow: true});\n\n // const inputFieldsRow2 = inputFieldsRow.cloneNode() as HTMLElement;\n // inputFieldsRow2.append(countryInputField.container, postcodeInputField.container);\n // billingSection.content.append(inputFieldsRow2);\n billingSection.content.append(...[countryInputField, postcodeInputField].filter(Boolean).map((i) => i.container));\n }\n\n const canSave = !!this.paymentForm.pFlags.can_save_credentials;\n const saveCheckboxField = new CheckboxField({\n text: 'PaymentCardSavePaymentInformation',\n checked: !!canSave\n });\n const saveRow = new Row({\n checkboxField: saveCheckboxField,\n subtitleLangKey: canSave ? 'PaymentCardSavePaymentInformationInfoLine1' : 'Checkout.2FA.Text'\n });\n\n if(!canSave) {\n saveRow.container.classList.add('is-disabled');\n }\n\n (billingSection || cardSection).content.append(saveRow.container);\n\n this.scrollable.append(...[cardSection, billingSection].filter(Boolean).map((s) => s.container));\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: async() => {\n const data: PaymentCardDetails = {\n cardNumber: cardInputField.value,\n expiryFull: expireInputField.value,\n expiryMonth: expireInputField.value.split('/')[0],\n expiryYear: expireInputField.value.split('/')[1],\n cvc: cvcInputField.value,\n\n cardholderName: nameInputField?.value,\n country: countryInputField?.value,\n zip: postcodeInputField?.value,\n\n save: saveCheckboxField?.checked\n };\n\n const nativeProvider: PaymentsNativeProvider = this.paymentForm.native_provider as any;\n let out: PaymentsCredentialsToken;\n if(nativeProvider === 'stripe') {\n const url = new URL('https://api.stripe.com/v1/tokens');\n url.search = new URLSearchParams({\n 'card[number]': data.cardNumber,\n 'card[exp_month]': data.expiryMonth,\n 'card[exp_year]': data.expiryYear,\n 'card[cvc]': data.cvc,\n 'card[address_zip]': data.zip,\n 'card[address_country]': data.country,\n 'card[name]': data.cardholderName\n }).toString();\n\n const response = await fetch(url.toString(), {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Authorization': `Bearer ${nativeParams.publishable_key}`\n }\n });\n\n out = await response.json();\n } else if(nativeProvider === 'smartglocal') {\n const params = {\n card: {\n number: data.cardNumber.replace(/[^\\d]+/g, ''),\n expiration_month: data.expiryMonth,\n expiration_year: data.expiryYear,\n security_code: data.cvc.replace(/[^\\d]+/g, '')\n }\n };\n\n const url = /* DEBUG_PAYMENT_SMART_GLOCAL */false ?\n 'https://tgb-playground.smart-glocal.com/cds/v1/tokenize/card' :\n 'https://tgb.smart-glocal.com/cds/v1/tokenize/card';\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'X-PUBLIC-TOKEN': nativeParams.public_token\n },\n body: JSON.stringify(params)\n });\n\n const json: { // smartglocal\n data: {\n info: {\n card_network: string,\n card_type: string,\n masked_card_number: string\n },\n token: string\n },\n status: 'ok'\n } = await response.json();\n\n out = {type: 'card', token: json.data.token}\n }\n\n this.dispatchEvent('finish', {token: out, card: data});\n this.hide();\n }\n });\n\n const inputFields = ([\n cardInputField,\n nameInputField,\n expireInputField,\n cvcInputField,\n countryInputField,\n postcodeInputField\n ] as const).filter(Boolean);\n handleInputFieldsOnChange(inputFields, (valid) => {\n payButton.disabled = !valid;\n // payButton.classList.toggle('btn-disabled', !valid);\n });\n\n if(savedCard) {\n cardInputField.value = savedCard.cardNumber;\n expireInputField.value = savedCard.expiryFull;\n cvcInputField.value = savedCard.cvc;\n nameInputField && (nameInputField.value = savedCard.cardholderName);\n countryInputField && (countryInputField.value = savedCard.country);\n postcodeInputField && (postcodeInputField.value = savedCard.zip);\n }\n\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.show();\n\n if(!cardInputField.validateNew(undefined, undefined, true)) {\n placeCaretAtEnd(cardInputField.input);\n }\n }\n}\n","import formatValueByPattern from './formatValueByPattern';\n\nexport default function formatInputValueByPattern(options: {\n value: string,\n getPattern: Parameters[0],\n deleting?: boolean,\n input?: HTMLElement\n}) {\n const {value: originalValue, getPattern, deleting, input} = options;\n const pushRest = !deleting && !!originalValue.length;\n const result = formatValueByPattern(getPattern, originalValue, {\n selectionStart: input ? (input as HTMLInputElement).selectionStart : 0,\n selectionEnd: input ? (input as HTMLInputElement).selectionEnd : 0\n }, pushRest)\n const {value, selection} = result;\n\n return {\n value,\n meta: {\n autocorrectComplete: result.autocorrectComplete,\n empty: !value\n },\n selection\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {AccountPassword, AccountTmpPassword} from '../../layer';\nimport {InputState} from '../inputField';\nimport PasswordInputField from '../passwordInputField';\nimport SettingSection from '../settingSection';\nimport {PaymentButton} from './payment';\n\nexport default class PopupPaymentCardConfirmation extends PopupElement<{\n finish: (tmpPassword: AccountTmpPassword) => void\n}> {\n constructor(card: string, passwordState: AccountPassword) {\n super('popup-payment popup-payment-card-confirmation', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'Checkout.PasswordEntry.Title'\n });\n\n const section = new SettingSection({noDelimiter: true, noShadow: true, caption: 'Checkout.PasswordEntry.Text', captionArgs: [card]});\n const passwordInputField = new PasswordInputField({labelText: passwordState.hint});\n section.content.append(passwordInputField.container);\n this.scrollable.append(section.container);\n\n const onInput = () => {\n payButton.disabled = !passwordInputField.value;\n passwordInputField.setState(InputState.Neutral);\n };\n\n passwordInputField.input.addEventListener('input', onInput);\n\n const payButton = PaymentButton({\n key: 'Checkout.PasswordEntry.Pay',\n onClick: async() => {\n try {\n const inputCheckPassword = await this.managers.passwordManager.getInputCheckPassword(passwordInputField.value, passwordState);\n const tmpPassword = await this.managers.apiManager.invokeApi('account.getTmpPassword', {\n password: inputCheckPassword,\n period: 60\n });\n\n this.dispatchEvent('finish', tmpPassword);\n this.hide();\n } catch(err) {\n if((err as ApiError).type === 'PASSWORD_HASH_INVALID') {\n (err as ApiError).handled = true;\n passwordInputField.setError('PASSWORD_HASH_INVALID');\n }\n\n throw err;\n }\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n onInput();\n\n this.show();\n\n placeCaretAtEnd(passwordInputField.input);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {InputInvoice, PaymentRequestedInfo, PaymentsPaymentForm, PaymentsValidatedRequestedInfo} from '../../layer';\nimport matchEmail from '../../lib/richTextProcessor/matchEmail';\nimport CheckboxField from '../checkboxField';\nimport CountryInputField from '../countryInputField';\nimport InputField from '../inputField';\nimport Row from '../row';\nimport SettingSection from '../settingSection';\nimport TelInputField from '../telInputField';\nimport {PaymentButton} from './payment';\nimport {createCountryZipFields, handleInputFieldsOnChange, InputFieldCorrected} from './paymentCard';\n\nexport type PaymentShippingAddress = PaymentRequestedInfo;\n\ntype ShippingFocusField = 'name' | 'email' | 'phone';\n\nexport default class PopupPaymentShipping extends PopupElement<{\n finish: (o: {shippingAddress: PaymentShippingAddress, requestedInfo: PaymentsValidatedRequestedInfo}) => void\n}> {\n constructor(\n private paymentForm: PaymentsPaymentForm,\n private inputInvoice: InputInvoice,\n private focus?: ShippingFocusField\n ) {\n super('popup-payment popup-payment-shipping', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'PaymentShippingInfo'\n });\n\n this.d();\n }\n\n private d() {\n const paymentForm = this.paymentForm;\n const invoice = paymentForm.invoice;\n const savedInfo = this.paymentForm.saved_info;\n\n let addressSection: SettingSection,\n address1InputField: InputField,\n address2InputField: InputField,\n cityInputField: InputField,\n stateInputField: InputField,\n countryInputField: CountryInputField,\n postcodeInputField: InputFieldCorrected;\n if(invoice.pFlags.shipping_address_requested) {\n addressSection = new SettingSection({name: 'PaymentShippingAddress', noDelimiter: true, noShadow: true});\n address1InputField = new InputField({label: 'PaymentShippingAddress1Placeholder', maxLength: 64, required: true});\n address2InputField = new InputField({label: 'PaymentShippingAddress2Placeholder', maxLength: 64});\n cityInputField = new InputField({label: 'PaymentShippingCityPlaceholder', maxLength: 64, required: true});\n stateInputField = new InputField({label: 'PaymentShippingStatePlaceholder', maxLength: 64});\n const res = createCountryZipFields(true, true);\n countryInputField = res.countryInputField;\n postcodeInputField = res.postcodeInputField;\n\n addressSection.content.append(...[\n address1InputField,\n address2InputField,\n cityInputField,\n stateInputField,\n countryInputField,\n postcodeInputField\n ].filter(Boolean).map((inputField) => inputField.container));\n }\n\n let receiverSection: SettingSection;\n let nameInputField: InputField, emailInputField: InputField, telInputField: TelInputField;\n if([invoice.pFlags.name_requested, invoice.pFlags.email_requested, invoice.pFlags.phone_requested].includes(true)) {\n receiverSection = new SettingSection({name: 'PaymentShippingReceiver', noDelimiter: true, noShadow: true});\n\n const validateEmail = () => {\n const value = emailInputField.value;\n const match = matchEmail(value);\n if(!match || match[0].length !== value.length) {\n return false;\n }\n\n return true;\n };\n\n const validatePhone = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n if(invoice.pFlags.name_requested) nameInputField = new InputField({label: 'PaymentShippingName', maxLength: 256, required: true});\n if(invoice.pFlags.email_requested) emailInputField = new InputField({label: 'PaymentShippingEmailPlaceholder', maxLength: 64, required: true, validate: validateEmail});\n if(invoice.pFlags.phone_requested) telInputField = new TelInputField({required: true, validate: validatePhone});\n\n receiverSection.content.append(...[\n nameInputField,\n emailInputField,\n telInputField\n ].filter(Boolean).map((inputField) => inputField.container));\n }\n\n const saveCheckboxField = new CheckboxField({\n text: 'PaymentShippingSave',\n checked: true\n });\n const saveRow = new Row({\n checkboxField: saveCheckboxField,\n subtitleLangKey: 'PaymentShippingSaveInfo'\n });\n\n (receiverSection || addressSection).content.append(saveRow.container);\n\n this.scrollable.append(...[addressSection, receiverSection].filter(Boolean).map((section) => section.container));\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: async() => {\n const selectedCountry = countryInputField && countryInputField.getSelected().country;\n const data: PaymentShippingAddress = {\n _: 'paymentRequestedInfo',\n shipping_address: selectedCountry && {\n _: 'postAddress',\n street_line1: address1InputField.value,\n street_line2: address2InputField.value,\n city: cityInputField.value,\n state: stateInputField.value,\n // country: countryInputField.value,\n country_iso2: selectedCountry?.iso2,\n post_code: postcodeInputField.value\n },\n name: nameInputField?.value,\n email: emailInputField?.value,\n phone: telInputField?.value\n };\n\n try {\n const requestedInfo = await this.managers.appPaymentsManager.validateRequestedInfo(this.inputInvoice, data, saveCheckboxField?.checked);\n\n this.dispatchEvent('finish', {\n shippingAddress: data,\n requestedInfo\n });\n\n this.hide();\n } catch(err: any) {\n const errorMap: {[err: string]: InputField} = {\n ADDRESS_STREET_LINE1_INVALID: address1InputField,\n ADDRESS_STREET_LINE2_INVALID: address2InputField,\n ADDRESS_COUNTRY_INVALID: countryInputField,\n ADDRESS_CITY_INVALID: cityInputField,\n ADDRESS_STATE_INVALID: stateInputField,\n ADDRESS_POSTCODE_INVALID: postcodeInputField,\n\n REQ_INFO_NAME_INVALID: nameInputField,\n REQ_INFO_EMAIL_INVALID: emailInputField,\n REQ_INFO_PHONE_INVALID: telInputField\n };\n\n const inputField = errorMap[(err as ApiError).type];\n if(inputField) {\n inputField.setError();\n (err as any).handled = true;\n }\n\n throw err;\n }\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n if(savedInfo) {\n const shippingAddress = savedInfo.shipping_address;\n if(shippingAddress) {\n address1InputField.value = shippingAddress.street_line1;\n address2InputField.value = shippingAddress.street_line2;\n cityInputField.value = shippingAddress.city;\n stateInputField.value = shippingAddress.state;\n countryInputField.selectCountryByIso2(shippingAddress.country_iso2);\n postcodeInputField.value = shippingAddress.post_code;\n }\n\n savedInfo.name && nameInputField && (nameInputField.value = savedInfo.name);\n savedInfo.email && emailInputField && (emailInputField.value = savedInfo.email);\n savedInfo.phone && telInputField && (telInputField.value = savedInfo.phone);\n }\n\n const {validate} = handleInputFieldsOnChange([\n address1InputField,\n address2InputField,\n cityInputField,\n stateInputField,\n countryInputField,\n postcodeInputField,\n nameInputField,\n emailInputField,\n telInputField\n ].filter(Boolean), (valid) => {\n payButton.disabled = !valid;\n });\n\n validate();\n\n this.show();\n\n let focusField: InputField;\n if(this.focus) {\n const focusMap: {[field in ShippingFocusField]?: InputField} = {\n name: nameInputField,\n email: emailInputField,\n phone: telInputField\n };\n\n focusField = focusMap[this.focus];\n } else {\n focusField = address1InputField;\n }\n\n if(focusField) {\n placeCaretAtEnd(focusField.input);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport accumulate from '../../helpers/array/accumulate';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport {PaymentsPaymentForm, PaymentsValidatedRequestedInfo, ShippingOption} from '../../layer';\nimport RadioField from '../radioField';\nimport Row, {RadioFormFromRows} from '../row';\nimport SettingSection from '../settingSection';\nimport {PaymentButton} from './payment';\n\nexport default class PopupPaymentShippingMethods extends PopupElement<{\n finish: (shippingOption: ShippingOption) => void\n}> {\n constructor(\n private paymentForm: PaymentsPaymentForm,\n private requestedInfo: PaymentsValidatedRequestedInfo,\n private shippingOption: ShippingOption\n ) {\n super('popup-payment popup-payment-shipping-methods', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'PaymentShippingMethod'\n });\n\n this.d();\n }\n\n private d() {\n const section = new SettingSection({name: 'PaymentCheckoutShippingMethod', noDelimiter: true, noShadow: true});\n\n const rows = this.requestedInfo.shipping_options.map((shippingOption) => {\n return new Row({\n radioField: new RadioField({\n text: shippingOption.title,\n name: 'shipping-method',\n value: shippingOption.id\n }),\n subtitle: paymentsWrapCurrencyAmount(\n accumulate(shippingOption.prices.map(({amount}) => +amount), 0),\n this.paymentForm.invoice.currency\n )\n });\n });\n\n let lastShippingId: string;\n const form = RadioFormFromRows(rows, (value) => {\n lastShippingId = value;\n });\n\n if(this.shippingOption) {\n rows.find((row) => row.radioField.input.value === this.shippingOption.id).radioField.checked = true;\n } else {\n rows[0].radioField.checked = true;\n }\n\n section.content.append(form);\n\n this.scrollable.append(section.container);\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: () => {\n this.dispatchEvent('finish', this.requestedInfo.shipping_options.find((option) => option.id === lastShippingId));\n this.hide();\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport Currencies from '../../config/currencies';\nimport {FontFamily, FontSize} from '../../config/font';\nimport accumulate from '../../helpers/array/accumulate';\nimport getTextWidth from '../../helpers/canvas/getTextWidth';\nimport {detectUnifiedCardBrand} from '../../helpers/cards/cardBrands';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport ScrollSaver from '../../helpers/scrollSaver';\nimport tsNow from '../../helpers/tsNow';\nimport {AccountTmpPassword, InputInvoice, InputPaymentCredentials, LabeledPrice, Message, MessageMedia, PaymentRequestedInfo, PaymentSavedCredentials, PaymentsPaymentForm, PaymentsPaymentReceipt, PaymentsValidatedRequestedInfo, PostAddress, ShippingOption} from '../../layer';\nimport I18n, {i18n, LangPackKey, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport Button from '../button';\nimport CheckboxField from '../checkboxField';\nimport PeerTitle from '../peerTitle';\nimport {putPreloader} from '../putPreloader';\nimport Row from '../row';\nimport {toastNew} from '../toast';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport wrapPhoto from '../wrappers/photo';\nimport PopupPaymentCard, {PaymentCardDetails, PaymentCardDetailsResult} from './paymentCard';\nimport PopupPaymentCardConfirmation from './paymentCardConfirmation';\nimport PopupPaymentShipping, {PaymentShippingAddress} from './paymentShipping';\nimport PopupPaymentShippingMethods from './paymentShippingMethods';\nimport PopupPaymentVerification from './paymentVerification';\n\nconst iconPath = 'assets/img/';\nconst icons = [\n 'amex',\n 'card',\n 'diners',\n 'discover',\n 'jcb',\n 'mastercard',\n 'visa',\n 'unionpay',\n 'mir',\n 'logo'\n];\n\nexport function getPaymentBrandIconPath(brand: string) {\n if(!icons.includes(brand)) {\n return;\n }\n\n return `${iconPath}${brand}.svg`;\n}\n\nexport function PaymentButton(options: {\n onClick: () => Promise | void,\n key?: LangPackKey,\n textEl?: I18n.IntlElement\n}) {\n const textEl = options.textEl ?? new I18n.IntlElement({key: options.key ?? 'PaymentInfo.Done'});\n const key = textEl.key;\n const payButton = Button('btn-primary btn-color-primary payment-item-pay');\n payButton.append(textEl.element);\n attachClickEvent(payButton, async() => {\n const result = options.onClick();\n if(!(result instanceof Promise)) {\n return;\n }\n\n const d = putPreloader(payButton);\n const toggle = toggleDisability([payButton], true);\n textEl.compareAndUpdate({key: 'PleaseWait'});\n try {\n await result;\n } catch(err) {\n if(!(err as any).handled) {\n console.error('payment button error', err);\n }\n\n toggle();\n textEl.compareAndUpdate({key});\n d.remove();\n }\n });\n return payButton;\n}\n\nexport type PaymentsCredentialsToken = {type: 'card', token?: string, id?: string};\n\nexport default class PopupPayment extends PopupElement {\n private tipButtonsMap: Map;\n\n constructor(\n private message: Message.message,\n private inputInvoice: InputInvoice,\n private paymentForm?: PaymentsPaymentForm | PaymentsPaymentReceipt,\n private isReceipt?: boolean\n ) {\n super('popup-payment', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: true\n });\n\n this.tipButtonsMap = new Map();\n this.d().catch((err) => {\n console.error('payment popup error', err);\n this.hide();\n });\n }\n\n private async d() {\n this.element.classList.add('is-loading');\n this.show();\n\n let confirmed = false;\n const onConfirmed = () => {\n if(confirmed) {\n return;\n }\n\n confirmed = true;\n if(popupPaymentVerification) {\n popupPaymentVerification.hide();\n }\n\n this.hide();\n };\n\n let {paymentForm, message} = this;\n\n if(message) {\n this.listenerSetter.add(rootScope)('payment_sent', ({peerId, mid}) => {\n if(message.peerId === peerId && message.mid === mid) {\n onConfirmed();\n }\n });\n }\n\n const mediaInvoice = message?.media as MessageMedia.messageMediaInvoice;\n const isReceipt = this.isReceipt ??\n (\n mediaInvoice ?\n !!mediaInvoice.receipt_msg_id || mediaInvoice.extended_media?._ === 'messageExtendedMedia' :\n paymentForm._ === 'payments.paymentReceipt'\n );\n const isTest = mediaInvoice ? mediaInvoice.pFlags.test : paymentForm.invoice.pFlags.test;\n\n const photo = mediaInvoice ? mediaInvoice.photo : paymentForm.photo;\n const title = mediaInvoice ? mediaInvoice.title : paymentForm.title;\n const description = mediaInvoice ? mediaInvoice.description : paymentForm.description;\n\n _i18n(this.title, isReceipt ? 'PaymentReceipt' : 'PaymentCheckout');\n if(isTest) {\n this.title.append(' (Test)');\n }\n\n const className = 'payment-item';\n\n const itemEl = document.createElement('div');\n itemEl.classList.add(className);\n\n const detailsClassName = className + '-details';\n const details = document.createElement('div');\n details.classList.add(detailsClassName);\n\n let photoEl: HTMLElement;\n if(photo) {\n photoEl = document.createElement('div');\n photoEl.classList.add(detailsClassName + '-photo', 'media-container-contain');\n wrapPhoto({\n photo: photo,\n container: photoEl,\n boxWidth: 100,\n boxHeight: 100,\n size: {_: 'photoSizeEmpty', type: ''}\n });\n details.append(photoEl);\n }\n\n const linesClassName = detailsClassName + '-lines';\n const linesEl = document.createElement('div');\n linesEl.classList.add(linesClassName);\n\n const titleEl = document.createElement('div');\n titleEl.classList.add(linesClassName + '-title');\n\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add(linesClassName + '-description');\n\n const botName = document.createElement('div');\n botName.classList.add(linesClassName + '-bot-name');\n\n linesEl.append(titleEl, descriptionEl, botName);\n\n setInnerHTML(titleEl, wrapEmojiText(title));\n setInnerHTML(descriptionEl, wrapEmojiText(description));\n\n const peerTitle = new PeerTitle();\n botName.append(peerTitle.element);\n\n details.append(linesEl);\n itemEl.append(details);\n this.scrollable.append(itemEl);\n\n const preloaderContainer = document.createElement('div');\n preloaderContainer.classList.add(className + '-preloader-container');\n const preloader = putPreloader(preloaderContainer, true);\n this.scrollable.container.append(preloaderContainer);\n\n const inputInvoice = this.inputInvoice;\n if(!paymentForm) {\n if(isReceipt) paymentForm = await this.managers.appPaymentsManager.getPaymentReceipt(message.peerId, mediaInvoice.receipt_msg_id || (inputInvoice as InputInvoice.inputInvoiceMessage).msg_id);\n else paymentForm = await this.managers.appPaymentsManager.getPaymentForm(inputInvoice);\n this.paymentForm = paymentForm;\n }\n\n let savedInfo = (paymentForm as PaymentsPaymentForm).saved_info || (paymentForm as PaymentsPaymentReceipt).info;\n const savedCredentials = (paymentForm as PaymentsPaymentForm).saved_credentials?.[0];\n let [lastRequestedInfo, passwordState, providerPeerTitle] = await Promise.all([\n !isReceipt && savedInfo && this.managers.appPaymentsManager.validateRequestedInfo(inputInvoice, savedInfo),\n savedCredentials && this.managers.passwordManager.getState(),\n wrapPeerTitle({peerId: paymentForm.provider_id.toPeerId()})\n ]);\n\n // console.log(paymentForm, lastRequestedInfo);\n\n await peerTitle.update({peerId: paymentForm.bot_id.toPeerId()});\n preloaderContainer.remove();\n this.element.classList.remove('is-loading');\n\n const wrapAmount = (amount: string | number, skipSymbol?: boolean) => {\n return paymentsWrapCurrencyAmount(amount, currency, skipSymbol);\n };\n\n const {invoice} = paymentForm;\n const currency = invoice.currency;\n\n const isRecurring = invoice.pFlags.recurring && !isReceipt;\n\n await peerTitle.update({peerId: paymentForm.bot_id.toPeerId()});\n const peerTitle2 = isRecurring ? await wrapPeerTitle({peerId: paymentForm.bot_id.toPeerId()}) : undefined;\n preloaderContainer.remove();\n this.element.classList.remove('is-loading');\n\n const makeLabel = () => {\n const labelEl = document.createElement('div');\n labelEl.classList.add(pricesClassName + '-price');\n\n const left = document.createElement('span');\n const right = document.createElement('span');\n labelEl.append(left, right);\n return {label: labelEl, left, right};\n };\n\n const pricesClassName = className + '-prices';\n const prices = document.createElement('div');\n prices.classList.add(pricesClassName);\n const makePricesElements = (prices: LabeledPrice[]) => {\n return prices.map((price) => {\n const {amount, label} = price;\n\n const _label = makeLabel();\n _label.left.textContent = label;\n\n const wrappedAmount = wrapAmount(amount);\n _label.right.textContent = wrappedAmount;\n\n return _label.label;\n });\n };\n\n const pricesElements = makePricesElements(invoice.prices);\n\n let getTipsAmount = (): number => 0;\n let shippingAmount = 0;\n\n const getTotalTotal = () => totalAmount + getTipsAmount() + shippingAmount;\n const setTotal = () => {\n const wrapped = wrapAmount(getTotalTotal());\n totalLabel.right.textContent = wrapped;\n payI18n.compareAndUpdate({\n key: 'PaymentCheckoutPay',\n args: [wrapped]\n });\n };\n\n const payI18n = new I18n.IntlElement();\n\n const totalLabel = makeLabel();\n totalLabel.label.classList.add('is-total');\n _i18n(totalLabel.left, 'PaymentTransactionTotal');\n const totalAmount = accumulate(invoice.prices.map(({amount}) => +amount), 0);\n\n const canTip = (invoice.max_tip_amount !== undefined && !isReceipt) || !!(paymentForm as PaymentsPaymentReceipt).tip_amount;\n if(canTip) {\n const tipsClassName = className + '-tips';\n\n const currencyData = Currencies[currency];\n\n getTipsAmount = () => +getInputValue().replace(/\\D/g, '');\n\n const getInputValue = () => {\n // return input.textContent;\n return input.value;\n };\n\n const setInputWidth = () => {\n const width = getTextWidth(getInputValue(), `500 ${FontSize} ${FontFamily}`);\n input.style.width = width + 'px';\n };\n\n const setInputValue = (amount: string | number) => {\n amount = Math.min(+amount, +invoice.max_tip_amount);\n const wrapped = wrapAmount(amount, true);\n\n input.value = wrapped;\n // input.textContent = wrapped;\n if(document.activeElement === input) {\n placeCaretAtEnd(input);\n }\n\n unsetActiveTip && unsetActiveTip();\n const tipEl = this.tipButtonsMap.get(amount);\n if(tipEl) {\n tipEl.classList.add('active');\n }\n\n setInputWidth();\n setTotal();\n };\n\n const tipsLabel = makeLabel();\n _i18n(tipsLabel.left, isReceipt ? 'PaymentTip' : 'PaymentTipOptional');\n const input = document.createElement('input');\n input.type = 'tel';\n // const input: HTMLElement = document.createElement('div');\n // input.contentEditable = 'true';\n input.classList.add('input-clear', tipsClassName + '-input');\n tipsLabel.right.append(input);\n\n if(!isReceipt) {\n tipsLabel.label.style.cursor = 'text';\n } else {\n tipsLabel.label.classList.add('disable-hover');\n }\n\n tipsLabel.label.addEventListener('mousedown', (e) => {\n if(!findUpAsChild(e.target as HTMLElement, input)) {\n placeCaretAtEnd(input);\n }\n });\n\n const haveToIgnoreEvents = input instanceof HTMLInputElement ? 1 : 2;\n const onSelectionChange = () => {\n if(ignoreNextSelectionChange) {\n --ignoreNextSelectionChange;\n return;\n }\n\n // setTimeout(() => {\n ignoreNextSelectionChange = haveToIgnoreEvents;\n placeCaretAtEnd(input);\n // }, 0);\n };\n\n const onFocus = () => {\n // cancelEvent(e);\n setTimeout(() => {\n ignoreNextSelectionChange = haveToIgnoreEvents;\n placeCaretAtEnd(input);\n document.addEventListener('selectionchange', onSelectionChange);\n }, 0);\n };\n\n const onFocusOut = () => {\n input.addEventListener('focus', onFocus, {once: true});\n document.removeEventListener('selectionchange', onSelectionChange);\n };\n\n let ignoreNextSelectionChange: number;\n input.addEventListener('focusout', onFocusOut);\n onFocusOut();\n\n input.addEventListener('input', () => {\n setInputValue(getTipsAmount());\n });\n\n const s = [currencyData.symbol, currencyData.space_between ? ' ' : ''];\n if(!currencyData.symbol_left) s.reverse();\n tipsLabel.right[currencyData.symbol_left ? 'prepend' : 'append'](s.join(''));\n\n pricesElements.push(tipsLabel.label);\n\n //\n let unsetActiveTip: () => void;\n if(!isReceipt) {\n const tipsEl = document.createElement('div');\n tipsEl.classList.add(tipsClassName);\n\n const tipClassName = tipsClassName + '-tip';\n const tipButtons = invoice.suggested_tip_amounts.map((tipAmount) => {\n const button = Button(tipClassName, {noRipple: true});\n button.textContent = wrapAmount(tipAmount);\n\n this.tipButtonsMap.set(+tipAmount, button);\n return button;\n });\n\n unsetActiveTip = () => {\n const prevTipEl = tipsEl.querySelector('.active');\n if(prevTipEl) {\n prevTipEl.classList.remove('active');\n }\n };\n\n attachClickEvent(tipsEl, (e) => {\n const tipEl = findUpClassName(e.target, tipClassName);\n if(!tipEl) {\n return;\n }\n\n let tipAmount = 0;\n if(tipEl.classList.contains('active')) {\n tipEl.classList.remove('active');\n } else {\n unsetActiveTip();\n tipEl.classList.add('active');\n\n for(const [amount, el] of this.tipButtonsMap) {\n if(el === tipEl) {\n tipAmount = amount;\n break;\n }\n }\n }\n\n setInputValue(tipAmount);\n });\n\n setInputValue(0);\n\n tipsEl.append(...tipButtons);\n pricesElements.push(tipsEl);\n } else {\n setInputValue((paymentForm as PaymentsPaymentReceipt).tip_amount);\n }\n } else {\n setTotal();\n }\n\n pricesElements.push(totalLabel.label);\n\n prices.append(...pricesElements);\n itemEl.append(prices);\n\n // /\n\n const setRowIcon = async(row: Row, icon?: string) => {\n const img = document.createElement('img');\n img.classList.add('media-photo');\n await renderImageFromUrlPromise(img, getPaymentBrandIconPath(icon));\n let container = row.media;\n if(!container) {\n container = row.createMedia('small');\n container.classList.add('media-container-cover');\n container.append(img);\n } else {\n replaceContent(container, img);\n }\n\n row.container.classList.remove('row-with-icon');\n };\n\n const createRow = (options: ConstructorParameters[0]) => {\n if(options.titleLangKey) {\n options.subtitleLangKey = options.titleLangKey;\n }\n\n options.noWrap = true;\n const row = new Row(options);\n row.container.classList.add(className + '-row');\n\n if(options.titleLangKey) {\n row.subtitle.classList.add('hide');\n }\n\n return row;\n };\n\n const setRowTitle = (row: Row, textContent: string) => {\n row.title.textContent = textContent;\n if(!textContent) {\n const e = I18n.weakMap.get(row.subtitle.firstElementChild as HTMLElement) as I18n.IntlElement;\n row.title.append(i18n(e.key));\n }\n\n row.subtitle.classList.toggle('hide', !textContent);\n };\n\n const setCardSubtitle = (card: PaymentCardDetailsResult) => {\n let brand: string;\n let str: string;\n let icon: string;\n if('title' in card) {\n brand = card.title.split(' ').shift();\n str = card.title;\n icon = card.icon;\n } else {\n brand = detectUnifiedCardBrand(card.cardNumber);\n str = brand + ' *' + card.cardNumber.split(' ').pop();\n }\n\n methodRow.title.classList.remove('tgico', 'tgico-card_outline');\n setRowIcon(methodRow, icon || brand.toLowerCase());\n setRowTitle(methodRow, str);\n };\n\n const onMethodClick = () => {\n new PopupPaymentCard(paymentForm as PaymentsPaymentForm, previousCardDetails as PaymentCardDetails).addEventListener('finish', ({token, card}) => {\n previousToken = token, previousCardDetails = card;\n\n setCardSubtitle(card);\n });\n };\n\n let previousCardDetails: PaymentCardDetailsResult, previousToken: PaymentsCredentialsToken;\n const methodRow = createRow({\n titleLangKey: 'PaymentCheckoutMethod',\n clickable: isReceipt ? undefined : onMethodClick,\n icon: 'card_outline'\n });\n\n methodRow.container.classList.add(className + '-method-row');\n\n if(savedCredentials) {\n setCardSubtitle(savedCredentials);\n } else if((paymentForm as PaymentsPaymentReceipt).credentials_title) {\n setCardSubtitle({title: (paymentForm as PaymentsPaymentReceipt).credentials_title});\n }\n\n const providerRow = createRow({\n title: providerPeerTitle,\n subtitleLangKey: 'PaymentCheckoutProvider'\n });\n\n const providerAvatar = new AvatarElement();\n providerAvatar.classList.add('avatar-32');\n providerRow.createMedia('small').append(providerAvatar);\n /* await */ providerAvatar.updateWithOptions({peerId: paymentForm.provider_id.toPeerId()});\n\n let shippingAddressRow: Row, shippingNameRow: Row, shippingEmailRow: Row, shippingPhoneRow: Row, shippingMethodRow: Row;\n let lastShippingOption: ShippingOption, onShippingAddressClick: (focus?: ConstructorParameters[2]) => void, onShippingMethodClick: () => void;\n const setShippingTitle = invoice.pFlags.shipping_address_requested ? (shippingAddress?: PaymentShippingAddress) => {\n if(!shippingAddress) {\n shippingMethodRow.subtitle.classList.add('hide');\n replaceContent(shippingMethodRow.title, i18n('PaymentShippingAddress'));\n return;\n }\n\n const postAddress = shippingAddress.shipping_address;\n setRowTitle(shippingAddressRow, [postAddress.city, postAddress.street_line1, postAddress.street_line2].filter(Boolean).join(', '));\n\n shippingMethodRow.container.classList.toggle('hide', !lastRequestedInfo && !isReceipt);\n } : undefined;\n\n const setShippingInfo = (info: PaymentRequestedInfo) => {\n setShippingTitle && setShippingTitle(info);\n shippingNameRow && setRowTitle(shippingNameRow, info.name);\n shippingEmailRow && setRowTitle(shippingEmailRow, info.email);\n shippingPhoneRow && setRowTitle(shippingPhoneRow, info.phone && ('+' + formatPhoneNumber(info.phone).formatted));\n };\n\n if(!isReceipt) {\n onShippingAddressClick = (focus) => {\n new PopupPaymentShipping(paymentForm as PaymentsPaymentForm, inputInvoice, focus).addEventListener('finish', ({shippingAddress, requestedInfo}) => {\n lastRequestedInfo = requestedInfo;\n savedInfo = (paymentForm as PaymentsPaymentForm).saved_info = shippingAddress;\n setShippingInfo(shippingAddress);\n });\n };\n }\n\n if(invoice.pFlags.shipping_address_requested) {\n const setShippingOption = (shippingOption?: ShippingOption) => {\n const scrollSaver = new ScrollSaver(this.scrollable, undefined, true);\n scrollSaver.save();\n if(lastShippingPricesElements) {\n lastShippingPricesElements.forEach((node) => node.remove());\n }\n\n if(!shippingOption) {\n shippingAmount = 0;\n\n setTotal();\n scrollSaver.restore();\n this.onContentUpdate();\n return;\n }\n\n lastShippingOption = shippingOption;\n setRowTitle(shippingMethodRow, shippingOption.title);\n\n shippingAmount = accumulate(shippingOption.prices.map(({amount}) => +amount), 0);\n lastShippingPricesElements = makePricesElements(shippingOption.prices);\n let l = totalLabel.label;\n if(canTip) {\n l = l.previousElementSibling as any;\n if(!isReceipt) {\n l = l.previousElementSibling as any;\n }\n }\n\n lastShippingPricesElements.forEach((element) => l.parentElement.insertBefore(element, l));\n\n setTotal();\n scrollSaver.restore();\n this.onContentUpdate();\n };\n\n shippingAddressRow = createRow({\n icon: 'location',\n titleLangKey: 'PaymentShippingAddress',\n clickable: !isReceipt && onShippingAddressClick.bind(null, undefined)\n });\n\n let lastShippingPricesElements: HTMLElement[];\n shippingMethodRow = createRow({\n icon: 'shipping',\n titleLangKey: 'PaymentCheckoutShippingMethod',\n clickable: !isReceipt && (onShippingMethodClick = () => {\n new PopupPaymentShippingMethods(paymentForm as PaymentsPaymentForm, lastRequestedInfo, lastShippingOption).addEventListener('finish', (shippingOption) => {\n setShippingOption(shippingOption);\n });\n })\n });\n\n shippingMethodRow.container.classList.add('hide');\n\n const shippingOption = (paymentForm as PaymentsPaymentReceipt).shipping;\n if(shippingOption) {\n setShippingOption(shippingOption);\n }\n }\n\n if(invoice.pFlags.name_requested) {\n shippingNameRow = createRow({\n icon: 'newprivate',\n titleLangKey: 'PaymentCheckoutName',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'name')\n });\n }\n\n if(invoice.pFlags.email_requested) {\n shippingEmailRow = createRow({\n icon: 'mention',\n titleLangKey: 'PaymentShippingEmailPlaceholder',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'email')\n });\n }\n\n if(invoice.pFlags.phone_requested) {\n shippingPhoneRow = createRow({\n icon: 'phone',\n titleLangKey: 'PaymentCheckoutPhoneNumber',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'phone')\n });\n }\n\n if(savedInfo) {\n setShippingInfo(savedInfo);\n }\n\n const rows = [\n methodRow,\n providerRow,\n shippingAddressRow,\n shippingMethodRow,\n shippingNameRow,\n shippingEmailRow,\n shippingPhoneRow\n ].filter(Boolean);\n\n const acceptTermsCheckboxField = isRecurring && new CheckboxField({\n text: 'Payments.Recurrent.Accept',\n textArgs: [wrapRichText(invoice.recurring_terms_url), peerTitle2]\n });\n\n const acceptTermsRow = isRecurring && createRow({\n checkboxField: acceptTermsCheckboxField\n });\n\n const recurringElements = isRecurring ? [document.createElement('hr'), acceptTermsRow.container] : [];\n\n this.scrollable.append(...[\n document.createElement('hr'),\n ...rows.map((row) => row.container),\n ...recurringElements\n ].filter(Boolean));\n\n // /\n let popupPaymentVerification: PopupPaymentVerification, lastTmpPasword: AccountTmpPassword;\n const onClick = () => {\n const missingInfo = invoice.pFlags.name_requested && !savedInfo?.name ? 'name' : (invoice.pFlags.email_requested && !savedInfo?.email ? 'email' : (invoice.pFlags.phone_requested && !savedInfo?.phone ? 'phone' : undefined));\n if(invoice.pFlags.shipping_address_requested) {\n if(!lastRequestedInfo) {\n onShippingAddressClick();\n return;\n } else if(!lastShippingOption) {\n onShippingMethodClick();\n return;\n }\n } else if(missingInfo) {\n onShippingAddressClick(missingInfo);\n return;\n }\n\n if(!previousCardDetails && !lastTmpPasword) {\n if(!savedCredentials) {\n onMethodClick();\n return;\n }\n\n Promise.resolve(passwordState ?? this.managers.passwordManager.getState()).then((_passwordState) => {\n new PopupPaymentCardConfirmation(savedCredentials.title, _passwordState).addEventListener('finish', (tmpPassword) => {\n passwordState = undefined;\n lastTmpPasword = tmpPassword;\n simulateClickEvent(payButton);\n\n // * reserve 5 seconds\n const diff = tmpPassword.valid_until - tsNow(true) - 5;\n setTimeout(() => {\n if(lastTmpPasword === tmpPassword) {\n lastTmpPasword = undefined;\n }\n }, diff * 1000);\n });\n });\n\n return;\n }\n\n return Promise.resolve().then(async() => {\n const credentials: InputPaymentCredentials = lastTmpPasword ? {\n _: 'inputPaymentCredentialsSaved',\n id: savedCredentials.id,\n tmp_password: lastTmpPasword.tmp_password\n } : {\n _: 'inputPaymentCredentials',\n data: {\n _: 'dataJSON',\n data: JSON.stringify(previousToken.token ? previousToken : {type: previousToken.type, id: previousToken.id})\n },\n pFlags: {\n save: previousCardDetails.save || undefined\n }\n };\n\n try {\n const paymentResult = await this.managers.appPaymentsManager.sendPaymentForm(\n inputInvoice,\n (paymentForm as PaymentsPaymentForm).form_id,\n lastRequestedInfo?.id,\n lastShippingOption?.id,\n credentials,\n getTipsAmount()\n );\n\n if(paymentResult._ === 'payments.paymentResult') {\n onConfirmed();\n } else {\n popupPaymentVerification = new PopupPaymentVerification(paymentResult.url, !mediaInvoice.extended_media);\n popupPaymentVerification.addEventListener('finish', () => {\n popupPaymentVerification = undefined;\n\n onConfirmed();\n });\n await new Promise((resolve, reject) => {\n popupPaymentVerification.addEventListener('close', () => {\n popupPaymentVerification = undefined;\n if(confirmed) {\n resolve();\n } else {\n const err = new Error('payment not finished');\n (err as ApiError).handled = true;\n reject(err);\n }\n });\n });\n }\n } catch(err) {\n if((err as ApiError).type === 'BOT_PRECHECKOUT_TIMEOUT') {\n toastNew({langPackKey: 'Error.AnError'});\n (err as ApiError).handled = true;\n } else if((err as ApiError).type === 'TMP_PASSWORD_INVALID') {\n passwordState = lastTmpPasword = undefined;\n simulateClickEvent(payButton);\n (err as ApiError).handled = true;\n }\n\n throw err;\n }\n });\n };\n\n const onChange = () => {\n payButton.disabled = !!(acceptTermsCheckboxField && !acceptTermsCheckboxField.checked);\n };\n\n let payButton: HTMLButtonElement;\n if(isReceipt) {\n payButton = PaymentButton({\n onClick: () => this.hide(),\n key: 'Done'\n });\n } else {\n payButton = PaymentButton({\n onClick: onClick,\n textEl: payI18n\n });\n }\n\n onChange();\n if(acceptTermsCheckboxField) {\n acceptTermsCheckboxField.input.addEventListener('change', onChange);\n }\n\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.onContentUpdate();\n }\n}\n","/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\nFor license and copyright information please follow this link:\nhttps://github.com/telegramdesktop/tdesktop/blob/master/LEGAL\n*/\n\nimport accumulate from '../helpers/array/accumulate';\nimport clamp from '../helpers/number/clamp';\n\ntype Size = {w: number, h: number};\nexport type GroupMediaLayout = {\n geometry: {\n x: number,\n y: number,\n width: number,\n height: number\n },\n sides: number\n};\ntype Attempt = {\n lineCounts: number[],\n heights: number[]\n};\nexport const RectPart = {\n None: 0,\n Top: 1,\n Right: 2,\n Bottom: 4,\n Left: 8\n};\n\n// https://github.com/telegramdesktop/tdesktop/blob/4669c07dc5335cbf4795bbbe5b0ab7c007b9aee2/Telegram/SourceFiles/ui/grouped_layout.cpp\nexport class Layouter {\n private count: number;\n private ratios: number[];\n private proportions: string;\n private averageRatio: number;\n private maxSizeRatio: number;\n\n constructor(private sizes: Size[], private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth) {\n this.count = sizes.length;\n this.ratios = Layouter.countRatios(sizes);\n this.proportions = Layouter.countProportions(this.ratios);\n this.averageRatio = accumulate(this.ratios, 1) / this.count; // warn\n this.maxSizeRatio = maxWidth / this.maxHeight;\n }\n\n public layout(): GroupMediaLayout[] {\n if(!this.count) return [];\n // else if(this.count === 1) return this.layoutOne();\n\n if(this.count >= 5 || this.ratios.find((r) => r > 2)) {\n return new ComplexLayouter(this.ratios, this.averageRatio, this.maxWidth, this.minWidth, this.spacing).layout();\n }\n\n if(this.count === 2) return this.layoutTwo();\n else if(this.count === 3) return this.layoutThree();\n return this.layoutFour();\n }\n\n private layoutTwo(): ReturnType {\n if((this.proportions === 'ww') &&\n (this.averageRatio > 1.4 * this.maxSizeRatio) &&\n (this.ratios[1] - this.ratios[0] < 0.2)) {\n return this.layoutTwoTopBottom();\n } else if(this.proportions === 'ww' || this.proportions === 'qq') {\n return this.layoutTwoLeftRightEqual();\n }\n return this.layoutTwoLeftRight();\n }\n\n private layoutThree(): ReturnType {\n // console.log('layoutThree:', this);\n if(this.proportions[0] === 'n') {\n return this.layoutThreeLeftAndOther();\n }\n return this.layoutThreeTopAndOther();\n }\n\n private layoutFour(): ReturnType {\n if(this.proportions[0] === 'w') {\n return this.layoutFourTopAndOther();\n }\n return this.layoutFourLeftAndOther();\n }\n\n private layoutTwoTopBottom(): ReturnType {\n const width = this.maxWidth;\n const height = Math.round(Math.min(\n width / this.ratios[0],\n Math.min(\n width / this.ratios[1],\n (this.maxHeight - this.spacing) / 2)));\n\n return [\n {\n geometry: {x: 0, y: 0, width, height},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: height + this.spacing, width, height},\n sides: RectPart.Left | RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutTwoLeftRightEqual(): ReturnType {\n const width = (this.maxWidth - this.spacing) / 2;\n const height = Math.round(Math.min(\n width / this.ratios[0],\n Math.min(width / this.ratios[1], this.maxHeight * 1)));\n\n return [\n {\n geometry: {x: 0, y: 0, width, height},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: width + this.spacing, y: 0, width, height},\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutTwoLeftRight(): ReturnType {\n const minimalWidth = Math.round(this.minWidth * 1.5);\n const secondWidth = Math.min(\n Math.round(Math.max(\n 0.4 * (this.maxWidth - this.spacing),\n (this.maxWidth - this.spacing) / this.ratios[0] /\n (1 / this.ratios[0] + 1 / this.ratios[1]))),\n this.maxWidth - this.spacing - minimalWidth);\n const firstWidth = this.maxWidth -\n secondWidth -\n this.spacing;\n const height = Math.min(\n this.maxHeight,\n Math.round(Math.min(\n firstWidth / this.ratios[0],\n secondWidth / this.ratios[1])));\n\n return [\n {\n geometry: {x: 0, y: 0, width: firstWidth, height},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: firstWidth + this.spacing, y: 0, width: secondWidth, height},\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutThreeLeftAndOther(): ReturnType {\n const firstHeight = this.maxHeight;\n const thirdHeight = Math.round(Math.min(\n (this.maxHeight - this.spacing) / 2.,\n (this.ratios[1] * (this.maxWidth - this.spacing) /\n (this.ratios[2] + this.ratios[1]))));\n const secondHeight = firstHeight -\n thirdHeight -\n this.spacing;\n const rightWidth = Math.max(\n this.minWidth,\n Math.round(Math.min(\n (this.maxWidth - this.spacing) / 2.,\n Math.min(\n thirdHeight * this.ratios[2],\n secondHeight * this.ratios[1]))));\n const leftWidth = Math.min(\n Math.round(firstHeight * this.ratios[0]),\n this.maxWidth - this.spacing - rightWidth);\n\n return [\n {\n geometry: {x: 0, y: 0, width: leftWidth, height: firstHeight},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: leftWidth + this.spacing, y: 0, width: rightWidth, height: secondHeight},\n sides: RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: leftWidth + this.spacing, y: secondHeight + this.spacing, width: rightWidth, height: thirdHeight},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutThreeTopAndOther(): ReturnType {\n const firstWidth = this.maxWidth;\n const firstHeight = Math.round(Math.min(\n firstWidth / this.ratios[0],\n (this.maxHeight - this.spacing) * 0.66));\n const secondWidth = (this.maxWidth - this.spacing) / 2;\n const secondHeight = Math.min(\n this.maxHeight - firstHeight - this.spacing,\n Math.round(Math.min(\n secondWidth / this.ratios[1],\n secondWidth / this.ratios[2])));\n const thirdWidth = firstWidth - secondWidth - this.spacing;\n\n return [\n {\n geometry: {x: 0, y: 0, width: firstWidth, height: firstHeight},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: firstHeight + this.spacing, width: secondWidth, height: secondHeight},\n sides: RectPart.Bottom | RectPart.Left\n },\n {\n geometry: {x: secondWidth + this.spacing, y: firstHeight + this.spacing, width: thirdWidth, height: secondHeight},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutFourTopAndOther(): ReturnType {\n const w = this.maxWidth;\n const h0 = Math.round(Math.min(\n w / this.ratios[0],\n (this.maxHeight - this.spacing) * 0.66));\n const h = Math.round(\n (this.maxWidth - 2 * this.spacing) /\n (this.ratios[1] + this.ratios[2] + this.ratios[3]));\n const w0 = Math.max(\n this.minWidth,\n Math.round(Math.min(\n (this.maxWidth - 2 * this.spacing) * 0.4,\n h * this.ratios[1])));\n const w2 = Math.round(Math.max(\n Math.max(\n this.minWidth * 1.,\n (this.maxWidth - 2 * this.spacing) * 0.33),\n h * this.ratios[3]));\n const w1 = w - w0 - w2 - 2 * this.spacing;\n const h1 = Math.min(\n this.maxHeight - h0 - this.spacing,\n h);\n\n return [\n {\n geometry: {x: 0, y: 0, width: w, height: h0},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: h0 + this.spacing, width: w0, height: h1},\n sides: RectPart.Bottom | RectPart.Left\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\n sides: RectPart.Bottom\n },\n {\n geometry: {x: w0 + this.spacing + w1 + this.spacing, y: h0 + this.spacing, width: w2, height: h1},\n sides: RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutFourLeftAndOther(): ReturnType {\n const h = this.maxHeight;\n const w0 = Math.round(Math.min(\n h * this.ratios[0],\n (this.maxWidth - this.spacing) * 0.6));\n\n const w = Math.round(\n (this.maxHeight - 2 * this.spacing) /\n (1. / this.ratios[1] + 1. / this.ratios[2] + 1. / this.ratios[3])\n );\n const h0 = Math.round(w / this.ratios[1]);\n const h1 = Math.round(w / this.ratios[2]);\n const h2 = h - h0 - h1 - 2 * this.spacing;\n const w1 = Math.max(\n this.minWidth,\n Math.min(this.maxWidth - w0 - this.spacing, w));\n\n return [\n {\n geometry: {x: 0, y: 0, width: w0, height: h},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: w0 + this.spacing, y: 0, width: w1, height: h0},\n sides: RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\n sides: RectPart.Right\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + h1 + 2 * this.spacing, width: w1, height: h2},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private static countRatios(sizes: Size[]) {\n return sizes.map((size) => size.w / size.h);\n }\n\n private static countProportions(ratios: number[]) {\n return ratios.map((ratio) => (ratio > 1.2) ? 'w' : (ratio < 0.8) ? 'n' : 'q').join('');\n }\n}\n\nclass ComplexLayouter {\n private ratios: number[];\n private count: number;\n\n constructor(ratios: number[], private averageRatio: number, private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth * 4 / 3) {\n this.ratios = ComplexLayouter.cropRatios(ratios, averageRatio);\n this.count = ratios.length;\n }\n\n private static cropRatios(ratios: number[], averageRatio: number) {\n const kMaxRatio = 2.75;\n const kMinRatio = 0.6667;\n return ratios.map((ratio) => {\n return averageRatio > 1.1 ?\n clamp(ratio, 1., kMaxRatio) :\n clamp(ratio, kMinRatio, 1.);\n });\n }\n\n public layout(): GroupMediaLayout[] {\n const result = new Array(this.count);\n\n const attempts: Attempt[] = [];\n const multiHeight = (offset: number, count: number) => {\n const ratios = this.ratios.slice(offset, offset + count); // warn\n const sum = accumulate(ratios, 0);\n return (this.maxWidth - (count - 1) * this.spacing) / sum;\n };\n const pushAttempt = (lineCounts: number[]) => {\n const heights: number[] = [];\n let offset = 0;\n for(const count of lineCounts) {\n heights.push(multiHeight(offset, count));\n offset += count;\n }\n attempts.push({lineCounts, heights}); // warn\n };\n\n for(let first = 1; first !== this.count; ++first) {\n const second = this.count - first;\n if(first > 3 || second > 3) {\n continue;\n }\n pushAttempt([first, second]);\n }\n for(let first = 1; first !== this.count - 1; ++first) {\n for(let second = 1; second !== this.count - first; ++second) {\n const third = this.count - first - second;\n if((first > 3) ||\n (second > ((this.averageRatio < 0.85) ? 4 : 3)) ||\n (third > 3)) {\n continue;\n }\n pushAttempt([first, second, third]);\n }\n }\n for(let first = 1; first !== this.count - 1; ++first) {\n for(let second = 1; second !== this.count - first; ++second) {\n for(let third = 1; third !== this.count - first - second; ++third) {\n const fourth = this.count - first - second - third;\n if(first > 3 || second > 3 || third > 3 || fourth > 3) {\n continue;\n }\n pushAttempt([first, second, third, fourth]);\n }\n }\n }\n\n let optimalAttempt: Attempt = null;\n let optimalDiff = 0;\n for(const attempt of attempts) {\n const {heights, lineCounts: counts} = attempt;\n const lineCount = counts.length;\n const totalHeight = accumulate(heights, 0) +\n this.spacing * (lineCount - 1);\n const minLineHeight = Math.min(...heights);\n const maxLineHeight = Math.max(...heights);\n const bad1 = (minLineHeight < this.minWidth) ? 1.5 : 1;\n const bad2 = (() => {\n for(let line = 1; line !== lineCount; ++line) {\n if(counts[line - 1] > counts[line]) {\n return 1.5;\n }\n }\n return 1.;\n })();\n const diff = Math.abs(totalHeight - this.maxHeight) * bad1 * bad2;\n if(!optimalAttempt || diff < optimalDiff) {\n optimalAttempt = attempt;\n optimalDiff = diff;\n }\n }\n\n const optimalCounts = optimalAttempt.lineCounts;\n const optimalHeights = optimalAttempt.heights;\n const rowCount = optimalCounts.length;\n\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\n let x = 0;\n for(let col = 0; col !== colCount; ++col) {\n const sides = RectPart.None |\n (row === 0 ? RectPart.Top : RectPart.None) |\n (row === rowCount - 1 ? RectPart.Bottom : RectPart.None) |\n (col === 0 ? RectPart.Left : RectPart.None) |\n (col === colCount - 1 ? RectPart.Right : RectPart.None);\n\n const ratio = this.ratios[index];\n const width = (col === colCount - 1) ?\n (this.maxWidth - x) :\n Math.round(ratio * lineHeight);\n result[index] = {\n geometry: {x, y, width, height},\n sides\n };\n\n x += width + this.spacing;\n ++index;\n }\n y += height + this.spacing;\n }\n\n return result;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Layouter, RectPart} from './groupedLayout';\n\nexport default function prepareAlbum(options: {\n container: HTMLElement,\n items: {w: number, h: number}[],\n maxWidth: number,\n minWidth: number,\n spacing: number,\n maxHeight?: number,\n forMedia?: true\n}) {\n const layouter = new Layouter(options.items, options.maxWidth, options.minWidth, options.spacing, options.maxHeight);\n const layout = layouter.layout();\n\n const widthItem = layout.find((item) => item.sides & RectPart.Right);\n const width = widthItem.geometry.width + widthItem.geometry.x;\n\n const heightItem = layout.find((item) => item.sides & RectPart.Bottom);\n const height = heightItem.geometry.height + heightItem.geometry.y;\n\n const container = options.container;\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n const children = container.children;\n\n layout.forEach(({geometry, sides}, idx) => {\n let div: HTMLElement;\n div = children[idx] as HTMLElement;\n if(!div) {\n div = document.createElement('div');\n container.append(div);\n }\n\n div.classList.add('album-item', 'grouped-item');\n\n div.style.width = (geometry.width / width * 100) + '%';\n div.style.height = (geometry.height / height * 100) + '%';\n div.style.top = (geometry.y / height * 100) + '%';\n div.style.left = (geometry.x / width * 100) + '%';\n\n if(sides & RectPart.Left && sides & RectPart.Top) {\n div.style.borderTopLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Left && sides & RectPart.Bottom) {\n div.style.borderBottomLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Top) {\n div.style.borderTopRightRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Bottom) {\n div.style.borderBottomRightRadius = 'inherit';\n }\n\n if(options.forMedia) {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n\n div.append(mediaDiv);\n }\n\n // @ts-ignore\n // div.style.backgroundColor = '#' + Math.floor(Math.random() * (2 ** 24 - 1)).toString(16).padStart(6, '0');\n });\n\n /* if(options.forMedia) {\n layout.forEach((_, i) => {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n\n options.container.children[i].append(mediaDiv);\n });\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport {Document, Message, MessageMedia, Photo, PhotoSize} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport rootScope from '../../lib/rootScope';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport Chat from '../chat/chat';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport prepareAlbum from '../prepareAlbum';\nimport wrapMediaSpoiler from './mediaSpoiler';\nimport wrapPhoto from './photo';\nimport wrapVideo from './video';\n\nexport default function wrapAlbum({messages, attachmentDiv, middleware, uploading, lazyLoadQueue, isOut, chat, loadPromises, autoDownload, managers = rootScope.managers, animationGroup}: {\n messages: Message.message[],\n attachmentDiv: HTMLElement,\n middleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n uploading?: boolean,\n isOut: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n managers?: AppManagers,\n animationGroup?: AnimationItemGroup\n}) {\n const items: {size: PhotoSize.photoSize, media: Photo.photo | Document.document, message: Message.message}[] = [];\n\n // !lowest msgID will be the FIRST in album\n for(const message of messages) {\n const media: Photo.photo | Document.document = getMediaFromMessage(message);\n\n const size: any = media._ === 'photo' ? choosePhotoSize(media, 480, 480) : {w: media.w, h: media.h};\n items.push({size, media, message});\n }\n\n /* // * pending\n if(storage[0] < 0) {\n items.reverse();\n } */\n\n prepareAlbum({\n container: attachmentDiv,\n items: items.map((i) => ({w: i.size.w, h: i.size.h})),\n maxWidth: mediaSizes.active.album.width,\n minWidth: 100,\n spacing: 2,\n forMedia: true\n });\n\n const {width, height} = attachmentDiv.style;\n const containerWidth = parseInt(width);\n const containerHeight = parseInt(height);\n\n items.forEach((item, idx) => {\n const {size, media, message} = item;\n\n const messageMedia = message.media;\n const hasSpoiler = !!(messageMedia as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument).pFlags?.spoiler;\n\n const div = attachmentDiv.children[idx] as HTMLElement;\n div.dataset.mid = '' + message.mid;\n div.dataset.peerId = '' + message.peerId;\n const mediaDiv = div.firstElementChild as HTMLElement;\n const isPhoto = media._ === 'photo';\n let thumbPromise: Promise;\n if(isPhoto) {\n thumbPromise = wrapPhoto({\n photo: media,\n message,\n container: mediaDiv,\n boxWidth: 0,\n boxHeight: 0,\n isOut,\n lazyLoadQueue,\n middleware,\n size,\n loadPromises,\n autoDownloadSize: autoDownload.photo,\n managers\n });\n } else {\n thumbPromise = wrapVideo({\n doc: media,\n container: mediaDiv,\n message,\n boxWidth: 0,\n boxHeight: 0,\n withTail: false,\n isOut,\n lazyLoadQueue,\n middleware,\n loadPromises,\n autoDownload,\n managers,\n noAutoplayAttribute: hasSpoiler\n });\n }\n\n if(thumbPromise) {\n loadPromises?.push(thumbPromise);\n }\n\n if(hasSpoiler) {\n const promise = (thumbPromise || Promise.resolve()).then(async() => {\n if(!middleware()) {\n return;\n }\n\n const {width, height} = div.style;\n const itemWidth = +width.slice(0, -1) / 100 * containerWidth;\n const itemHeight = +height.slice(0, -1) / 100 * containerHeight;\n const container = await wrapMediaSpoiler({\n media,\n animationGroup,\n middleware,\n width: itemWidth,\n height: itemHeight\n });\n\n if(!middleware()) {\n return;\n }\n\n mediaDiv.append(container);\n });\n\n loadPromises?.push(promise);\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport appSidebarRight from '..';\nimport {roundPercents} from '../../poll';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {i18n} from '../../../lib/langPack';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport Button from '../../button';\nimport {Message, MessageMedia} from '../../../layer';\n\nexport default class AppPollResultsTab extends SliderSuperTab {\n private resultsDiv: HTMLElement;\n\n public async init(message: Message.message) {\n this.container.id = 'poll-results-container';\n this.container.classList.add('chatlist-container');\n\n this.resultsDiv = document.createElement('div');\n this.resultsDiv.classList.add('poll-results');\n this.scrollable.append(this.resultsDiv);\n\n const poll = await this.managers.appPollsManager.getPoll((message.media as MessageMedia.messageMediaPoll).poll.id);\n\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\n\n const title = document.createElement('h3');\n setInnerHTML(title, wrapEmojiText(poll.poll.question));\n\n const percents = poll.results.results.map((v) => v.voters / poll.results.total_voters * 100);\n roundPercents(percents);\n\n const fragment = document.createDocumentFragment();\n poll.results.results.forEach((result, idx) => {\n if(!result.voters) return;\n\n const hr = document.createElement('hr');\n\n const answer = poll.poll.answers[idx];\n\n // Head\n const answerEl = document.createElement('div');\n answerEl.classList.add('poll-results-answer');\n\n const answerTitle = document.createElement('div');\n setInnerHTML(answerTitle, wrapEmojiText(answer.text));\n\n const answerPercents = document.createElement('div');\n answerPercents.innerText = Math.round(percents[idx]) + '%';\n\n answerEl.append(answerTitle, answerPercents);\n\n // Humans\n const list = appDialogsManager.createChatList();\n list.classList.add('poll-results-voters');\n\n appDialogsManager.setListClickListener(list, () => {\n appSidebarRight.onCloseBtnClick();\n }, undefined, true);\n\n list.style.minHeight = Math.min(result.voters, 4) * 48 + 'px';\n\n fragment.append(hr, answerEl, list);\n\n let offset: string, limit = 4, loading = false, left = Math.max(0, result.voters - 4);\n const load = () => {\n if(loading) return;\n loading = true;\n\n this.managers.appPollsManager.getVotes(message, answer.option, offset, limit).then((votesList) => {\n votesList.votes.forEach((vote) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: vote.user_id.toPeerId(false),\n container: list,\n rippleEnabled: false,\n meAsSaved: false,\n avatarSize: 'small'\n });\n dom.lastMessageSpan.parentElement.remove();\n });\n\n if(offset) {\n left = Math.max(0, left - votesList.votes.length);\n\n if(left) {\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\n }\n }\n\n offset = votesList.next_offset;\n limit = 20;\n\n if(!left || !votesList.votes.length) {\n showMore.remove();\n }\n }).finally(() => {\n loading = false;\n });\n };\n\n const showMore = Button('poll-results-more btn btn-primary btn-transparent', {icon: 'down'});\n showMore.addEventListener('click', load);\n showMore.append(i18n('PollResults.LoadMore', [Math.min(20, left)]));\n\n fragment.append(showMore);\n\n load();\n });\n\n this.resultsDiv.append(title, fragment);\n\n appSidebarRight.toggleSidebar(true).then(() => {\n /* appPollsManager.getVotes(mid).then((votes) => {\n console.log('gOt VotEs', votes);\n }); */\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport mediaSizes from '../helpers/mediaSizes';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport appImManager from '../lib/appManagers/appImManager';\nimport rootScope from '../lib/rootScope';\nimport ripple from './ripple';\nimport appSidebarRight from './sidebarRight';\nimport AppPollResultsTab from './sidebarRight/tabs/pollResults';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\nimport {fastRaf} from '../helpers/schedulers';\nimport SetTransition from './singleTransition';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent, detachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport windowSize from '../helpers/windowSize';\nimport {Message, MessageMedia, Poll, PollResults} from '../layer';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport StackedAvatars from './stackedAvatars';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\n\nlet lineTotalLength = 0;\nconst tailLength = 9;\nconst times = 10;\nconst fullTime = 340;\nconst oneTime = fullTime / times;\n\nexport const roundPercents = (percents: number[]) => {\n // console.log('roundPercents before percents:', percents);\n\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\n if(sum > 100) {\n const diff = sum - 100;\n const length = percents.length;\n for(let i = 0; i < diff; ++i) {\n let minIndex = -1, minRemainder = 1;\n for(let k = 0; k < length; ++k) {\n const remainder = percents[k] % 1;\n if(remainder >= 0.5 && remainder < minRemainder) {\n minRemainder = remainder;\n minIndex = k;\n }\n }\n\n if(minIndex === -1) {\n // throw new Error('lol chto');\n return;\n }\n\n percents[minIndex] -= minRemainder;\n }\n } else if(sum < 100) {\n const diff = 100 - sum;\n const length = percents.length;\n for(let i = 0; i < diff; ++i) {\n let minIndex = -1, maxRemainder = 0;\n for(let k = 0; k < length; ++k) {\n const remainder = percents[k] % 1;\n if(remainder < 0.5 && remainder > maxRemainder) {\n maxRemainder = remainder;\n minIndex = k;\n }\n }\n\n if(minIndex === -1) {\n // throw new Error('lol chto');\n return;\n }\n\n percents[minIndex] += 1 - maxRemainder;\n }\n }\n\n // console.log('roundPercents after percents:', percents);\n};\n\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\nrootScope.on('poll_update', (e) => {\n const {poll, results} = e as {poll: Poll, results: PollResults};\n\n //console.log('poll_update', poll, results);\n for(const connected of connectedPolls) {\n if(connected.id === poll.id) {\n const pollElement = connected.element;\n pollElement.isClosed = !!poll.pFlags.closed;\n pollElement.performResults(results, poll.chosenIndexes);\n }\n }\n}); */\n\nrootScope.addEventListener('poll_update', ({poll, results}) => {\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\n pollElements.forEach((pollElement) => {\n // console.log('poll_update', poll, results);\n pollElement.isClosed = !!poll.pFlags.closed;\n pollElement.performResults(results, poll.chosenIndexes);\n });\n});\n\nmediaSizes.addEventListener('resize', () => {\n PollElement.setMaxLength();\n PollElement.resizePolls();\n});\n\nmediaSizes.addEventListener('changeScreen', () => {\n PollElement.setMaxLength();\n});\n\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\n element.classList.remove('active');\n\n clearTimeout(timeout);\n setTimeout(() => {\n onHide();\n element.remove();\n\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\n prevQuizHint = prevQuizHintOnHide = null;\n prevQuizHintTimeout = 0;\n }\n }, 200);\n};\n\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\nlet isListenerSet = false;\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\n if(prevQuizHint) {\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\n }\n\n const element = document.createElement('div');\n element.classList.add('quiz-hint');\n\n const container = document.createElement('div');\n container.classList.add('container', 'tgico');\n\n const textEl = document.createElement('div');\n textEl.classList.add('text');\n\n container.append(textEl);\n element.append(container);\n\n setInnerHTML(textEl, wrapRichText(solution, {entities: solution_entities}));\n appImManager.chat.bubbles.container.append(element);\n\n void element.offsetLeft; // reflow\n element.classList.add('active');\n\n prevQuizHint = element;\n prevQuizHintOnHide = onHide;\n prevQuizHintTimeout = window.setTimeout(() => {\n hideQuizHint(element, onHide, prevQuizHintTimeout);\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\n\n if(!isListenerSet) {\n isListenerSet = true;\n appImManager.addEventListener('peer_changed', () => {\n if(prevQuizHint) {\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\n }\n });\n }\n};\n\nexport default class PollElement extends HTMLElement {\n public static MAX_OFFSET = -46.5;\n public static MAX_LENGTH = 0;\n public svgLines: SVGSVGElement[];\n private numberDivs: HTMLDivElement[];\n private answerDivs: HTMLDivElement[];\n private descDiv: HTMLElement;\n private typeDiv: HTMLElement;\n private avatarsDiv: HTMLElement;\n private viewResults: HTMLElement;\n private votersCountDiv: HTMLDivElement;\n\n // private maxLength: number;\n // private maxLengths: number[];\n private maxPercents: number[];\n\n public isClosed = false;\n private isQuiz = false;\n private isRetracted = false;\n private isPublic = false;\n private isMultiple = false;\n private chosenIndexes: number[] = [];\n private percents: number[];\n\n public message: Message.message;\n public managers: AppManagers;\n\n private quizInterval: number;\n private quizTimer: SVGSVGElement;\n\n private sendVoteBtn: HTMLElement;\n private chosingIndexes: number[] = [];\n\n private sendVotePromise: Promise;\n private sentVote = false;\n\n public static setMaxLength() {\n const width = windowSize.width <= 360 ? windowSize.width - 120 : mediaSizes.active.poll.width;\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\n }\n\n public static resizePolls() {\n if(!this.MAX_LENGTH) return;\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\n pollElements.forEach((pollElement) => {\n pollElement.svgLines.forEach((svg, idx) => {\n // void svg.getBoundingClientRect(); // reflow\n pollElement.setLineProgress(idx, 1);\n });\n });\n }\n\n public async render() {\n // браузер вызывает этот метод при добавлении элемента в документ\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\n\n if(!lineTotalLength) {\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\n // console.log('line total length:', lineTotalLength);\n PollElement.setMaxLength();\n }\n\n // const {poll, results} = this.managers.appPollsManager.getPoll(pollId);\n const {poll, results} = this.message.media as MessageMedia.messageMediaPoll;\n\n /* const timestamp = Date.now() / 1000 | 0;\n if(timestamp < this.message.date) { */\n if(this.message.pFlags.is_scheduled) {\n this.classList.add('disable-hover');\n }\n\n // console.log('pollElement poll:', poll, results);\n\n let descKey: LangPackKey;\n if(poll.pFlags) {\n this.isPublic = !!poll.pFlags.public_voters;\n this.isQuiz = !!poll.pFlags.quiz;\n this.isClosed = !!poll.pFlags.closed;\n this.isMultiple = !!poll.pFlags.multiple_choice;\n\n if(this.isClosed) {\n descKey = 'Chat.Poll.Type.Closed';\n this.classList.add('is-closed');\n } else if(this.isQuiz) {\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\n } else {\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\n }\n }\n\n this.classList.toggle('is-multiple', this.isMultiple);\n\n const multipleSelect = this.isMultiple ? '' : '';\n const votes = poll.answers.map((answer, idx) => {\n return `\n
\n
\n
\n \n \n \n ${multipleSelect}\n
\n
\n
\n \n \n \n \n
\n `;\n }).join('');\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n ${votes}`;\n\n setInnerHTML(this.firstElementChild, wrapEmojiText(poll.question));\n\n Array.from(this.querySelectorAll('.poll-answer-text')).forEach((el, idx) => {\n setInnerHTML(el, wrapEmojiText(poll.answers[idx].text));\n });\n\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\n\n if(descKey) {\n this.typeDiv.append(i18n(descKey));\n }\n\n if(this.isQuiz) {\n this.classList.add('is-quiz');\n\n if(poll.close_period && poll.close_date) {\n const timeLeftDiv = document.createElement('div');\n timeLeftDiv.classList.add('poll-time');\n this.descDiv.append(timeLeftDiv);\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n // svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\n svg.classList.add('poll-quiz-timer');\n\n this.quizTimer = svg;\n\n const strokeWidth = 2;\n const radius = 7;\n const circumference = 2 * Math.PI * radius;\n\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n circle.classList.add('poll-quiz-timer-circle');\n circle.setAttributeNS(null, 'cx', '16');\n circle.setAttributeNS(null, 'cy', '16');\n circle.setAttributeNS(null, 'r', '' + radius);\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\n\n svg.append(circle);\n this.descDiv.append(svg);\n\n const period = poll.close_period * 1000;\n const closeTime = (poll.close_date - await rootScope.managers.timeManager.getServerTimeOffset()) * 1000;\n\n // console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\n\n // let time = Date.now();\n // let percents = (closeTime - time) / period;\n\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\n\n // // @ts-ignore\n // circle.style.strokeDashoffset = circumference + percents * circumference;\n // circle.style.strokeDasharray = ${circumference} ${circumference};\n\n this.quizInterval = window.setInterval(() => {\n const time = Date.now();\n const percents = (closeTime - time) / period;\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\n timeLeftDiv.innerHTML = toHHMMSS(timeLeft);\n\n if(timeLeft <= 5) {\n timeLeftDiv.style.color = '#ee545c';\n circle.style.stroke = '#ee545c';\n }\n // timeLeftDiv.style.visibility = 'visible';\n\n // @ts-ignore\n circle.style.strokeDashoffset = circumference + percents * circumference;\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\n\n if(time >= closeTime) {\n clearInterval(this.quizInterval);\n timeLeftDiv.innerHTML = '';\n // @ts-ignore\n circle.style.strokeDashoffset = circumference;\n this.quizInterval = 0;\n\n setTimeout(() => {\n // нужно запросить апдейт чтобы опрос обновился\n this.managers.appPollsManager.getResults(this.message);\n }, 3e3);\n }\n }, 1e3);\n }\n }\n\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\n\n const footerDiv = document.createElement('div');\n footerDiv.classList.add('poll-footer');\n\n this.viewResults = document.createElement('div');\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\n\n this.votersCountDiv = document.createElement('div');\n this.votersCountDiv.className = 'poll-votes-count';\n\n footerDiv.append(this.viewResults, this.votersCountDiv);\n this.append(footerDiv);\n\n this.viewResults.addEventListener('click', (e) => {\n cancelEvent(e);\n\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\n appSidebarRight.createTab(AppPollResultsTab).open(this.message);\n }\n });\n ripple(this.viewResults);\n\n if(this.isMultiple) {\n this.sendVoteBtn = document.createElement('div');\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\n ripple(this.sendVoteBtn);\n\n if(!poll.chosenIndexes.length) {\n this.votersCountDiv.classList.add('hide');\n }\n\n attachClickEvent(this.sendVoteBtn, (e) => {\n cancelEvent(e);\n /* const indexes = this.answerDivs.filter((el) => el.classList.contains('is-chosing')).map((el) => +el.dataset.index);\n if(indexes.length) {\n\n } */\n if(this.chosingIndexes.length) {\n this.sendVotes(this.chosingIndexes).then(() => {\n this.chosingIndexes.length = 0;\n this.answerDivs.forEach((el) => {\n el.classList.remove('is-chosing');\n });\n });\n }\n });\n\n footerDiv.append(this.sendVoteBtn);\n }\n\n // const width = this.getBoundingClientRect().width;\n // const width = mediaSizes.active.poll.width;\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\n\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\n if(!canVote || this.isPublic) {\n this.performResults(results, poll.chosenIndexes, false);\n }\n\n if(canVote) {\n this.setVotersCount(results);\n attachClickEvent(this, this.clickHandler);\n }\n }\n\n initQuizHint(results: PollResults) {\n if(results.solution && results.solution_entities) {\n const toggleHint = document.createElement('div');\n toggleHint.classList.add('tgico-tip', 'poll-hint');\n this.descDiv.append(toggleHint);\n\n // let active = false;\n attachClickEvent(toggleHint, (e) => {\n cancelEvent(e);\n\n // active = true;\n toggleHint.classList.add('active');\n setQuizHint(results.solution, results.solution_entities, () => {\n // active = false;\n toggleHint.classList.remove('active');\n });\n });\n\n if(this.sentVote) {\n const correctResult = results.results.find((r) => r.pFlags.correct);\n if(correctResult && !correctResult.pFlags.chosen) {\n simulateClickEvent(toggleHint);\n }\n }\n }\n }\n\n clickHandler(e: Event) {\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\n if(!target) {\n return;\n }\n\n cancelEvent(e);\n const answerIndex = +target.dataset.index;\n if(this.isMultiple) {\n target.classList.toggle('is-chosing');\n\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\n if(foundIndex !== -1) {\n this.chosingIndexes.splice(foundIndex, 1);\n } else {\n this.chosingIndexes.push(answerIndex);\n }\n } else {\n this.sendVotes([answerIndex]);\n }\n\n /* target.classList.add('is-voting');\n setTimeout(() => { // simulate\n this.setResults([100, 0], answerIndex);\n target.classList.remove('is-voting');\n }, 1000); */\n }\n\n sendVotes(indexes: number[]) {\n if(this.sendVotePromise) return this.sendVotePromise;\n\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\n targets.forEach((target) => {\n target.classList.add('is-voting');\n });\n\n this.classList.add('disable-hover');\n this.sentVote = true;\n return this.sendVotePromise = this.managers.appPollsManager.sendVote(this.message, indexes).then(() => {\n targets.forEach((target) => {\n target.classList.remove('is-voting');\n });\n\n this.classList.remove('disable-hover');\n }).catch(() => {\n this.sentVote = false;\n }).finally(() => {\n this.sendVotePromise = null;\n });\n }\n\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\n if(!rootScope.settings.animationsEnabled) {\n animate = false;\n }\n\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\n this.answerDivs.forEach((el, idx) => {\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\n });\n\n if(this.initQuizHint) {\n this.initQuizHint(results);\n this.initQuizHint = null;\n }\n\n if(this.quizInterval) {\n clearInterval(this.quizInterval);\n this.quizInterval = 0;\n }\n\n if(this.quizTimer?.parentElement) {\n this.quizTimer.remove();\n }\n\n const timeEl = this.descDiv.querySelector('.poll-time');\n if(timeEl) {\n timeEl.remove();\n }\n }\n\n if(this.isClosed) {\n this.classList.add('is-closed');\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\n }\n\n // set chosen\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\n this.chosenIndexes = chosenIndexes.slice();\n\n if(this.isRetracted) {\n attachClickEvent(this, this.clickHandler);\n } else {\n detachClickEvent(this, this.clickHandler);\n }\n }\n\n // is need update\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\n const percents = results.results.map((v) => results.total_voters ? v.voters / results.total_voters * 100 : 0);\n\n this.classList.toggle('no-transition', !animate);\n if(animate) {\n SetTransition({\n element: this,\n className: '',\n forwards: !this.isRetracted,\n duration: 340\n });\n }\n\n fastRaf(() => {\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\n this.percents = percents;\n this.isRetracted = false;\n });\n }\n\n this.setVotersCount(results);\n\n if(this.isPublic) {\n if(!this.isMultiple) {\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\n }\n\n const peerIds = (results.recent_voters || []).map((userId) => userId.toPeerId());\n const stackedAvatars = new StackedAvatars({avatarSize: 16});\n stackedAvatars.render(peerIds);\n replaceContent(this.avatarsDiv, stackedAvatars.container);\n }\n\n if(this.isMultiple) {\n const isVoted = !!this.chosenIndexes.length;\n\n const hideSendVoteBtn = this.isClosed || isVoted;\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\n }\n }\n\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\n this.svgLines.forEach((svg) => svg.style.display = '');\n\n this.answerDivs.forEach((el, idx) => {\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\n });\n\n const maxValue = Math.max(...percents);\n // this.maxLengths = percents.map((p) => p / maxValue * this.maxLength);\n this.maxPercents = percents.map((p) => p / maxValue);\n\n // line\n if(this.isRetracted) {\n this.svgLines.forEach((svg, idx) => {\n this.setLineProgress(idx, -1);\n });\n } else {\n const cb = () => {\n this.svgLines.forEach((svg, idx) => {\n // void svg.getBoundingClientRect(); // reflow\n this.setLineProgress(idx, 1);\n });\n };\n\n animate ? fastRaf(cb) : cb();\n }\n\n percents = percents.slice();\n roundPercents(percents);\n let getPercentValue: (percents: number, index: number) => number;\n const iterate = (i: number) => {\n percents.forEach((percents, idx) => {\n const value = getPercentValue(percents, i);\n this.numberDivs[idx].innerText = value + '%';\n });\n };\n // numbers\n if(this.isRetracted) {\n getPercentValue = (percents, index) => Math.round(percents / times * index);\n\n if(animate) {\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\n setTimeout(() => {\n iterate(i);\n }, oneTime * k);\n }\n } else {\n iterate(0);\n }\n } else {\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\n\n if(animate) {\n for(let i = 0; i < times; ++i) {\n setTimeout(() => {\n iterate(i);\n }, oneTime * i);\n }\n } else {\n iterate(times - 1);\n }\n }\n\n if(this.isRetracted) {\n if(animate) {\n this.classList.add('is-retracting');\n }\n\n this.classList.remove('is-voted');\n const cb = () => {\n this.svgLines.forEach((svg) => svg.style.display = 'none');\n };\n\n if(animate) {\n setTimeout(() => {\n this.classList.remove('is-retracting');\n cb();\n }, fullTime);\n } else {\n cb();\n }\n } else {\n this.classList.add('is-voted');\n }\n }\n\n setVotersCount(results: PollResults) {\n const votersCount = results.total_voters || 0;\n let key: LangPackKey;\n const args: FormatterArguments = [votersCount];\n if(this.isClosed) {\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesResultEmpty';\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesResultEmpty';\n } else {\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesEmpty';\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesEmpty';\n }\n\n replaceContent(this.votersCountDiv, i18n(key, args));\n }\n\n setLineProgress(index: number, multiplier: number) {\n const svg = this.svgLines[index];\n\n if(multiplier === -1) {\n svg.style.strokeDasharray = '';\n svg.style.strokeDashoffset = '';\n } else {\n // svg.style.strokeDasharray = (multiplier * this.maxLengths[index]) + ', 485.9';\n svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * PollElement.MAX_LENGTH) + ', 485.9';\n // svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * 100) + '%, 485.9';\n svg.style.strokeDashoffset = '' + multiplier * PollElement.MAX_OFFSET;\n }\n }\n\n // у элемента могут быть ещё другие методы и свойства\n}\n\ncustomElements.define('poll-element', PollElement);\n","// https://stackoverflow.com/a/14824756/6758968\nconst ltrChars = 'A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF'+'\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF',\n rtlChars = '\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC',\n fullRtlDirCheck = new RegExp('^[^'+ltrChars+']*['+rtlChars+']'),\n justRtlDirCheck = new RegExp('['+rtlChars+']');\n\nexport default function isRTL(s: string, anyChar?: boolean) {\n return anyChar ? justRtlDirCheck.test(s) : fullRtlDirCheck.test(s);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppImManager, ChatSavedPosition, ChatSetPeerOptions} from '../../lib/appManagers/appImManager';\nimport type {HistoryResult, MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {logger} from '../../lib/logger';\nimport rootScope from '../../lib/rootScope';\nimport BubbleGroups from './bubbleGroups';\nimport PopupDatePicker from '../popups/datePicker';\nimport PopupForward from '../popups/forward';\nimport PopupStickers from '../popups/stickers';\nimport ProgressivePreloader from '../preloader';\nimport Scrollable, {SliceSides} from '../scrollable';\nimport StickyIntersector from '../stickyIntersector';\nimport animationIntersector from '../animationIntersector';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport I18n, {FormatterArguments, i18n, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n} from '../../lib/langPack';\nimport AvatarElement from '../avatar';\nimport ripple from '../ripple';\nimport {MessageRender} from './messageRender';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport PollElement from '../poll';\nimport AudioElement from '../audio';\nimport {Chat as MTChat, ChatInvite, Document, Message, MessageEntity, MessageMedia, MessageReplyHeader, Photo, PhotoSize, ReactionCount, ReplyMarkup, SponsoredMessage, Update, UrlAuthResult, User, WebPage} from '../../layer';\nimport {BOT_START_PARAM, NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {FocusDirection, ScrollStartCallbackDimensions} from '../../helpers/fastSmoothScroll';\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation} from '../../hooks/useHeavyAnimationCheck';\nimport {fastRaf, fastRafPromise} from '../../helpers/schedulers';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport RepliesElement from './replies';\nimport DEBUG from '../../config/debug';\nimport {SliceEnd} from '../../helpers/slicedArray';\nimport PeerTitle from '../peerTitle';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {toast, toastNew} from '../toast';\nimport {getElementByPoint} from '../../helpers/dom/getElementByPoint';\nimport {getMiddleware, Middleware} from '../../helpers/middleware';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent, detachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport htmlToDocumentFragment from '../../helpers/dom/htmlToDocumentFragment';\nimport reflowScrollableElement from '../../helpers/dom/reflowScrollableElement';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {cancelAnimationByKey} from '../../helpers/animation';\nimport assumeType from '../../helpers/assumeType';\nimport debounce, {DebounceReturnType} from '../../helpers/schedulers/debounce';\nimport {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\nimport windowSize from '../../helpers/windowSize';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport AppMediaViewer from '../appMediaViewer';\nimport SetTransition from '../singleTransition';\nimport handleHorizontalSwipe from '../../helpers/dom/handleHorizontalSwipe';\nimport findUpAttribute from '../../helpers/dom/findUpAttribute';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport formatCallDuration from '../../helpers/formatCallDuration';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport Button from '../button';\nimport {CallType} from '../../lib/calls/types';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport PopupJoinChatInvite from '../popups/joinChatInvite';\nimport {InternalLink, INTERNAL_LINK_TYPE} from '../../lib/appManagers/internalLink';\nimport ReactionsElement, {REACTIONS_ELEMENTS} from './reactions';\nimport type ReactionElement from './reaction';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport pause from '../../helpers/schedulers/pause';\nimport ScrollSaver from '../../helpers/scrollSaver';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\nimport SuperIntersectionObserver from '../../helpers/dom/superIntersectionObserver';\nimport generateFakeIcon from '../generateFakeIcon';\nimport copyFromElement from '../../helpers/dom/copyFromElement';\nimport PopupElement from '../popups';\nimport setAttachmentSize from '../../helpers/setAttachmentSize';\nimport wrapWebPageDescription from '../wrappers/webPageDescription';\nimport wrapWebPageTitle from '../wrappers/webPageTitle';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport wrapMessageActionTextNew from '../wrappers/messageActionTextNew';\nimport isMentionUnread from '../../lib/appManagers/utils/messages/isMentionUnread';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport generateMessageId from '../../lib/appManagers/utils/messageId/generateMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {Awaited, SendMessageEmojiInteractionData} from '../../types';\nimport idleController from '../../helpers/idleController';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport {cancelContextMenuOpening} from '../../helpers/dom/attachContextMenuListener';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport noop from '../../helpers/noop';\nimport getAlbumText from '../../lib/appManagers/utils/messages/getAlbumText';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport PopupPayment from '../popups/payment';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport wrapSticker, {onEmojiStickerClick} from '../wrappers/sticker';\nimport wrapAlbum from '../wrappers/album';\nimport wrapDocument from '../wrappers/document';\nimport wrapGroupedDocuments from '../wrappers/groupedDocuments';\nimport wrapPhoto from '../wrappers/photo';\nimport wrapPoll from '../wrappers/poll';\nimport wrapVideo from '../wrappers/video';\nimport isRTL from '../../helpers/string/isRTL';\nimport NBSP from '../../helpers/string/nbsp';\nimport DotRenderer from '../dotRenderer';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport {BatchProcessor} from '../../helpers/sortedList';\nimport wrapUrl from '../../lib/richTextProcessor/wrapUrl';\nimport getMessageThreadId from '../../lib/appManagers/utils/messages/getMessageThreadId';\nimport wrapTopicNameButton from '../wrappers/topicNameButton';\nimport wrapMediaSpoiler, {onMediaSpoilerClick, toggleMediaSpoiler} from '../wrappers/mediaSpoiler';\nimport confirmationPopup from '../confirmationPopup';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport {PopupPeerCheckboxOptions} from '../popups/peer';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {copyTextToClipboard} from '../../helpers/clipboard';\n\nexport const USER_REACTIONS_INLINE = false;\nconst USE_MEDIA_TAILS = false;\ntype MESSAGE_ACTION_TYPE = Message.messageService['action']['_'];\ntype IGNORE_ACTION_KEY = MESSAGE_ACTION_TYPE;\ntype IGNORE_ACTION_VALUE = true | ((message: Message.messageService) => boolean);\nconst IGNORE_ACTIONS: Map = new Map([\n ['messageActionHistoryClear', true],\n ['messageActionChatCreate', (message) => message.pFlags.out]\n // 'messageActionChannelMigrateFrom'\n] as [IGNORE_ACTION_KEY, IGNORE_ACTION_VALUE][]);\n\nexport const SERVICE_AS_REGULAR: Set = new Set();\n\nif(IS_CALL_SUPPORTED) {\n SERVICE_AS_REGULAR.add('messageActionPhoneCall');\n}\n\nconst TEST_SCROLL_TIMES: number = undefined;\nlet TEST_SCROLL = TEST_SCROLL_TIMES;\n\nlet queueId = 0;\n\ntype GenerateLocalMessageType = IsService extends true ? Message.messageService : Message.message;\n\nconst SPONSORED_MESSAGE_ID_OFFSET = 1;\nexport const STICKY_OFFSET = 3;\nconst SCROLLED_DOWN_THRESHOLD = 300;\nconst PEER_CHANGED_ERROR = new Error('peer changed');\n\nconst DO_NOT_SLICE_VIEWPORT = false;\nconst DO_NOT_SLICE_VIEWPORT_ON_RENDER = false;\nconst DO_NOT_UPDATE_MESSAGE_VIEWS = false;\nconst DO_NOT_UPDATE_MESSAGE_REACTIONS = false;\nconst DO_NOT_UPDATE_MESSAGE_REPLY = false;\n\nconst BIG_EMOJI_SIZES: {[size: number]: number} = {\n 1: 96,\n 2: 90,\n 3: 84,\n 4: 72,\n 5: 60,\n 6: 48,\n 7: 36\n};\nconst BIG_EMOJI_SIZES_LENGTH = Object.keys(BIG_EMOJI_SIZES).length;\n\ntype Bubble = {\n bubble: HTMLElement,\n mids: Set,\n groupedId?: string\n};\n\ntype MyHistoryResult = HistoryResult | {history: number[]};\n\nfunction getMainMidForGrouped(mids: number[]) {\n return Math.max(...mids);\n}\n\nexport default class ChatBubbles {\n public container: HTMLDivElement;\n public chatInner: HTMLDivElement;\n public scrollable: Scrollable;\n\n private getHistoryTopPromise: Promise;\n private getHistoryBottomPromise: Promise;\n\n // public messagesCount: number = -1;\n\n private unreadOut = new Set();\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\n\n public bubbles: {[mid: string]: HTMLElement} = {};\n public skippedMids: Set = new Set();\n public bubblesNewByGroupedId: {[groupId: string]: Bubble} = {};\n public bubblesNew: {[mid: string]: Bubble} = {};\n private dateMessages: {[timestamp: number]: {\n div: HTMLElement,\n firstTimestamp: number,\n container: HTMLElement,\n timeout?: number\n }} = {};\n\n private scrolledDown = true;\n private isScrollingTimeout = 0;\n\n private stickyIntersector: StickyIntersector;\n\n private unreaded: Map = new Map();\n private unreadedSeen: Set = new Set();\n private readPromise: Promise;\n\n private bubbleGroups: BubbleGroups;\n\n private preloader: ProgressivePreloader = null;\n\n // private messagesQueueOnRender: () => void = null;\n private messagesQueueOnRenderAdditional: () => void = null;\n\n private firstUnreadBubble: HTMLElement = null;\n private attachedUnreadBubble: boolean;\n\n public lazyLoadQueue: LazyLoadQueue;\n\n private middlewareHelper = getMiddleware();\n\n private log: ReturnType;\n\n public listenerSetter: ListenerSetter;\n\n private followStack: number[] = [];\n\n private isHeavyAnimationInProgress = false;\n private scrollingToBubble: HTMLElement;\n\n private isFirstLoad = true;\n private needReflowScroll: boolean;\n\n private fetchNewPromise: Promise;\n\n private passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }> = {};\n\n private onAnimateLadder: () => Promise | void;\n // private ladderDeferred: CancellablePromise;\n private resolveLadderAnimation: () => Promise;\n private emptyPlaceholderBubble: HTMLElement;\n\n private viewsMids: Set = new Set();\n private sendViewCountersDebounced: () => Promise;\n\n private isTopPaddingSet = false;\n\n private getSponsoredMessagePromise: Promise;\n\n private previousStickyDate: HTMLElement;\n private sponsoredMessage: SponsoredMessage.sponsoredMessage;\n\n private hoverBubble: HTMLElement;\n private hoverReaction: HTMLElement;\n private sliceViewportDebounced: DebounceReturnType;\n private resizeObserver: ResizeObserver;\n private willScrollOnLoad: boolean;\n public observer: SuperIntersectionObserver;\n\n private renderingMessages: Set = new Set();\n private setPeerCached: boolean;\n private attachPlaceholderOnRender: () => void;\n\n private bubblesToEject: Set = new Set();\n private bubblesToReplace: Map = new Map(); // TO -> FROM\n private updatePlaceholderPosition: () => void;\n private setPeerOptions: {lastMsgId: number; topMessage: number; savedPosition: ChatSavedPosition};\n\n private setPeerTempId: number = 0;\n\n private renderNewPromises: Set> = new Set();\n private updateGradient: boolean;\n\n private extendedMediaMessages: Set = new Set();\n private pollExtendedMediaMessagesPromise: Promise;\n\n private batchProcessor: BatchProcessor>>;\n\n // private reactions: Map;\n\n constructor(\n private chat: Chat,\n private managers: AppManagers\n ) {\n this.log = this.chat.log;\n // this.chat.log.error('Bubbles construction');\n\n this.listenerSetter = new ListenerSetter();\n\n this.constructBubbles();\n\n // * constructor end\n\n this.batchProcessor = new BatchProcessor({\n log: this.log,\n process: this.processBatch,\n possibleError: PEER_CHANGED_ERROR\n });\n this.bubbleGroups = new BubbleGroups(this.chat);\n this.preloader = new ProgressivePreloader({\n cancelable: false\n });\n this.lazyLoadQueue = new LazyLoadQueue(undefined, true);\n this.lazyLoadQueue.queueId = ++queueId;\n\n // this.reactions = new Map();\n\n // * events\n\n // will call when sent for update pos\n this.listenerSetter.add(rootScope)('history_update', async({storageKey, sequential, message}) => {\n if(this.chat.messagesStorageKey !== storageKey || this.chat.type === 'scheduled') {\n return;\n }\n\n const {mid} = message;\n const log = false ? this.log.bindPrefix('history_update-' + mid) : undefined;\n log && log('start');\n\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n if(this.renderNewPromises.size) {\n log && log.error('will await new messages render');\n await Promise.all(Array.from(this.renderNewPromises));\n }\n\n if(this.messagesQueuePromise) {\n log && log.error('messages render in process');\n await this.messagesQueuePromise;\n }\n\n if(this.bubbles[mid] !== bubble) return;\n\n // await getHeavyAnimationPromise();\n\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(!item) { // probably a group item\n log && log.error('no item by bubble', bubble);\n return;\n } else if(item.mid === mid) {\n log && log.warn('wow what', item, mid);\n return;\n }\n\n if(sequential) {\n const group = item.group;\n const newItem = this.bubbleGroups.createItem(bubble, message);\n // newItem.mid = item.mid;\n const _items = this.bubbleGroups.itemsArr.slice();\n indexOfAndSplice(_items, item);\n const foundItem = this.bubbleGroups.findGroupSiblingByItem(newItem, _items);\n if(\n group === foundItem?.group ||\n (group === this.bubbleGroups.getLastGroup() && group.items.length === 1 && newItem.dateTimestamp === item.dateTimestamp) ||\n (this.peerId === rootScope.myId && sequential && newItem.dateTimestamp === item.dateTimestamp)\n ) {\n log && log('item has correct position', item);\n this.bubbleGroups.changeBubbleMid(bubble, mid);\n return;\n }\n }\n\n // return;\n\n // await fastRafPromise();\n // if(this.bubbles[mid] !== bubble) return;\n\n // const groupIndex = this.bubbleGroups.groups.indexOf(group);\n this.bubbleGroups.removeAndUnmountBubble(bubble);\n // if(!group.items.length) { // group has collapsed, next message can have higher mid so have to reposition them too\n // log && log('group has collapsed', item);\n\n // const siblingGroups = this.bubbleGroups.groups.slice(0, groupIndex + 1);\n // for(let length = siblingGroups.length, i = length - 2; i >= 0; --i) {\n // const siblingGroup = siblingGroups[i];\n // const siblingItems = siblingGroup.items;\n // const nextGroup = siblingGroups[i + 1];\n // const nextItems = nextGroup.items;\n\n // let _break = false, moved = false;\n // for(let j = siblingItems.length - 1; j >= 0; --j) {\n // const siblingItem = siblingItems[j];\n // const foundItem = this.bubbleGroups.findGroupSiblingByItem(siblingItem, nextItems);\n // if(!foundItem) {\n // _break = true;\n // break;\n // }\n\n // log('will move item', siblingItem, nextGroup);\n // this.bubbleGroups.removeAndUnmountBubble(siblingItem.bubble);\n // this.bubbleGroups.addItemToGroup(siblingItem, nextGroup);\n // moved = true;\n // }\n\n // if(moved) {\n // nextGroup.mount();\n // }\n\n // if(_break) {\n // break;\n // }\n // }\n // }\n\n const {groups} = this.groupBubbles([{bubble, message}]);\n this.bubbleGroups.mountUnmountGroups(groups);\n\n if(this.scrollingToBubble) {\n this.scrollToEnd();\n }\n\n log && log('end');\n\n // this.bubbleGroups.findIncorrentPositions();\n });\n\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\n if(this.peerId === peerId) {\n this.deleteMessagesByIds(Object.keys(this.bubbles).map((m) => +m));\n }\n });\n\n // Calls when message successfully sent and we have an id\n this.listenerSetter.add(rootScope)('message_sent', async(e) => {\n const {storageKey, tempId, tempMessage, mid, message} = e;\n\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\n if(this.chat.messagesStorageKey !== storageKey) {\n return;\n }\n\n const bubbles = this.bubbles;\n const _bubble = bubbles[tempId];\n if(_bubble) {\n const bubble = bubbles[tempId];\n bubbles[mid] = bubble;\n bubble.dataset.mid = '' + mid;\n delete bubbles[tempId];\n\n fastRaf(() => {\n const mid = +bubble.dataset.mid;\n if(bubbles[mid] === bubble && bubble.classList.contains('is-outgoing')) {\n bubble.classList.remove('is-sending', 'is-outgoing');\n bubble.classList.add((this.peerId === rootScope.myId && this.chat.type !== 'scheduled') || !this.unreadOut.has(mid) ? 'is-read' : 'is-sent');\n }\n });\n }\n\n if(this.unreadOut.has(tempId)) {\n this.unreadOut.delete(tempId);\n this.unreadOut.add(mid);\n }\n\n // * check timing of scheduled message\n if(this.chat.type === 'scheduled') {\n const timestamp = Date.now() / 1000 | 0;\n const maxTimestamp = tempMessage.date - 10;\n if(timestamp >= maxTimestamp) {\n this.deleteMessagesByIds([mid]);\n }\n }\n\n if(!_bubble) {\n return;\n }\n\n let messages: (Message.message | Message.messageService)[], tempIds: number[];\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n messages = await this.managers.appMessagesManager.getMessagesByAlbum(groupedId);\n const mids = messages.map(({mid}) => mid);\n if(!mids.length || getMainMidForGrouped(mids) !== mid || bubbles[mid] !== _bubble) {\n return;\n }\n\n if(bubbles[mid] !== _bubble) {\n return;\n }\n\n tempIds = (Array.from(_bubble.querySelectorAll('.grouped-item')) as HTMLElement[]).map((el) => +el.dataset.mid);\n } else {\n messages = [message];\n tempIds = [tempId];\n }\n\n const reactionsElements = Array.from(_bubble.querySelectorAll('reactions-element')) as ReactionsElement[];\n if(reactionsElements.length) {\n reactionsElements.forEach((reactionsElement) => {\n reactionsElement.changeMessage(message as Message.message);\n });\n }\n\n (messages as Message.message[]).forEach((message, idx) => {\n if(!message) {\n return;\n }\n\n const tempId = tempIds[idx];\n const mid = message.mid;\n const bubble: HTMLElement = _bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || _bubble;\n\n if(message._ !== 'message') {\n return;\n }\n\n if(message.replies) {\n const repliesElement = _bubble.querySelector('replies-element') as RepliesElement;\n if(repliesElement) {\n repliesElement.message = message;\n repliesElement.init();\n }\n }\n\n const media = message.media ?? {} as MessageMedia.messageMediaEmpty;\n const doc = (media as MessageMedia.messageMediaDocument).document as Document.document;\n const poll = (media as MessageMedia.messageMediaPoll).poll;\n const webPage = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage;\n if(doc) {\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\n if(div) {\n const container = findUpClassName(div, 'document-container');\n\n if(!tempMessage.media?.document?.thumbs?.length && doc.thumbs?.length) {\n getHeavyAnimationPromise().then(async() => {\n const timeSpan = div.querySelector('.time');\n const newDiv = await wrapDocument({message, fontSize: rootScope.settings.messagesTextSize});\n div.replaceWith(newDiv);\n\n if(timeSpan) {\n (newDiv.querySelector('.document') || newDiv).append(timeSpan);\n }\n });\n }\n\n if(container) {\n container.dataset.mid = '' + mid;\n }\n }\n\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\n if(element) {\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\n element.dataset.mid = '' + message.mid;\n delete element.dataset.isOutgoing;\n (element as any).message = message;\n (element as any).onLoad(true);\n } else {\n element.dataset.docId = '' + doc.id;\n (element as any).doc = doc;\n }\n }\n } else if(poll) {\n const pollElement = bubble.querySelector('poll-element') as PollElement;\n if(pollElement) {\n pollElement.message = message;\n pollElement.setAttribute('poll-id', '' + poll.id);\n pollElement.setAttribute('message-id', '' + mid);\n }\n } else if(webPage && !bubble.querySelector('.web')) {\n getHeavyAnimationPromise().then(() => {\n this.safeRenderMessage(message, true, bubble);\n this.scrollToBubbleIfLast(bubble);\n });\n }\n\n // set new mids to album items for mediaViewer\n if(groupedId) {\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\n if(item) {\n item.dataset.mid = '' + mid;\n }\n }\n });\n });\n\n this.listenerSetter.add(rootScope)('message_edit', async({storageKey, message}) => {\n if(storageKey !== this.chat.messagesStorageKey) return;\n\n const bubble = this.bubbles[message.mid];\n if(!bubble) return;\n\n await getHeavyAnimationPromise();\n if(this.bubbles[message.mid] !== bubble) return;\n\n this.safeRenderMessage(message, true, bubble);\n });\n\n this.listenerSetter.add(rootScope)('message_error', async({storageKey, tempId}) => {\n if(storageKey !== this.chat.messagesStorageKey) return;\n\n const bubble = this.bubbles[tempId];\n if(!bubble) return;\n\n await getHeavyAnimationPromise();\n if(this.bubbles[tempId] !== bubble) return;\n\n bubble.classList.remove('is-outgoing');\n bubble.classList.add('is-error');\n });\n\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, messages, deletedMids}) => {\n if(peerId !== this.peerId) return;\n\n const mids = messages.map(({mid}) => mid);\n const oldMids = mids.concat(Array.from(deletedMids));\n const wasMainMid = getMainMidForGrouped(oldMids);\n const bubble = this.bubbles[wasMainMid];\n if(!bubble) {\n return;\n }\n\n const mainMid = getMainMidForGrouped(mids);\n const message = messages.find((message) => message.mid === mainMid);\n this.safeRenderMessage(message, true, bubble);\n });\n\n // this.listenerSetter.add(rootScope)('peer_title_edit', async(peerId) => {\n // if(peerId.isUser()) {\n // const middleware = this.getMiddleware();\n // const user = await this.managers.appUsersManager.getUser(peerId.toUserId());\n // if(!middleware()) return;\n\n // const isPremium = user?.pFlags?.premium;\n // const groups = this.bubbleGroups.groups.filter((group) => group.avatar?.peerId === peerId);\n // groups.forEach((group) => {\n // group.avatar.classList.toggle('is-premium', isPremium);\n // group.avatar.classList.toggle('tgico-star', isPremium);\n // });\n // }\n // });\n\n if(!DO_NOT_UPDATE_MESSAGE_REACTIONS/* && false */) {\n this.listenerSetter.add(rootScope)('messages_reactions', async(arr) => {\n if(this.chat.type === 'scheduled') {\n return;\n }\n\n let scrollSaver: ScrollSaver;\n\n const a = arr.map(async({message, changedResults}) => {\n if(this.peerId !== message.peerId) {\n return;\n }\n\n const result = await this.getMountedBubble(message.mid, message);\n if(!result) {\n return;\n }\n\n return {bubble: result.bubble, message, changedResults};\n });\n\n let top: number;\n (await Promise.all(a)).filter(Boolean).forEach(({bubble, message, changedResults}) => {\n if(!scrollSaver) {\n scrollSaver = this.createScrollSaver(false);\n scrollSaver.save();\n }\n\n const key = message.peerId + '_' + message.mid;\n const set = REACTIONS_ELEMENTS.get(key);\n if(set) {\n for(const element of set) {\n element.update(message, changedResults);\n }\n } else if(!message.reactions || !message.reactions.results.length) {\n return;\n } else {\n this.appendReactionsElementToBubble(bubble, message, message, changedResults);\n }\n });\n\n if(scrollSaver) {\n scrollSaver.restore();\n }\n });\n }\n\n !DO_NOT_UPDATE_MESSAGE_REPLY && this.listenerSetter.add(rootScope)('messages_downloaded', async({peerId, mids}) => {\n const middleware = this.getMiddleware();\n await getHeavyAnimationPromise();\n if(!middleware()) return;\n\n (mids as number[]).forEach((mid) => {\n const needUpdate = this.needUpdate;\n const filtered: typeof needUpdate[0][] = [];\n forEachReverse(this.needUpdate, (obj, idx) => {\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\n this.needUpdate.splice(idx, 1)[0];\n filtered.push(obj);\n }\n });\n\n filtered.forEach(async({mid, replyMid, replyToPeerId}) => {\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n const message = (await this.chat.getMessage(mid)) as Message.message;\n\n MessageRender.setReply({\n chat: this.chat,\n bubble,\n message\n });\n });\n });\n });\n\n attachStickerViewerListeners({\n listenTo: this.scrollable.container,\n listenerSetter: this.listenerSetter,\n findTarget: (e) => {\n const target = e.target as HTMLElement;\n const found = target.closest('.attachment.media-sticker-wrapper') || (findUpClassName(target, 'attachment') && target.closest('.custom-emoji'));\n return found as HTMLElement;\n }\n });\n attachClickEvent(this.scrollable.container, this.onBubblesClick, {listenerSetter: this.listenerSetter});\n // this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\n\n this.listenerSetter.add(this.scrollable.container)('mousedown', (e) => {\n if(e.button !== 0) return;\n\n const code: HTMLElement = findUpTag(e.target, 'CODE');\n if(code) {\n cancelEvent(e);\n copyFromElement(code);\n\n const onClick = (e: MouseEvent) => {\n cancelEvent(e);\n toastNew({\n langPackKey: 'TextCopied',\n onClose: () => {\n detach();\n }\n });\n };\n\n const detach = attachClickEvent(window, onClick, {listenerSetter: this.listenerSetter, once: true, capture: true});\n return;\n }\n });\n\n /* if(false) */this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\n for(const timestamp in this.dateMessages) {\n const dateMessage = this.dateMessages[timestamp];\n if(dateMessage.container === target) {\n const dateBubble = dateMessage.div;\n\n // dateMessage.container.classList.add('has-sticky-dates');\n\n // SetTransition(dateBubble, 'kek', stuck, this.previousStickyDate ? 300 : 0);\n // if(this.previousStickyDate) {\n // dateBubble.classList.add('kek');\n // }\n\n dateBubble.classList.toggle('is-sticky', stuck);\n if(stuck) {\n this.previousStickyDate = dateBubble;\n }\n\n break;\n }\n }\n\n if(this.previousStickyDate) {\n // fastRaf(() => {\n // this.bubblesContainer.classList.add('has-sticky-dates');\n // });\n }\n });\n\n if(!IS_SAFARI) {\n this.sliceViewportDebounced = debounce(this.sliceViewport.bind(this), 3000, false, true);\n }\n\n let middleware: ReturnType;\n useHeavyAnimationCheck(() => {\n this.isHeavyAnimationInProgress = true;\n this.lazyLoadQueue.lock();\n middleware = this.getMiddleware();\n\n // if(this.sliceViewportDebounced) {\n // this.sliceViewportDebounced.clearTimeout();\n // }\n }, () => {\n this.isHeavyAnimationInProgress = false;\n\n if(middleware?.()) {\n this.lazyLoadQueue.unlockAndRefresh();\n\n // if(this.sliceViewportDebounced) {\n // this.sliceViewportDebounced();\n // }\n }\n\n middleware = null;\n }, this.listenerSetter);\n }\n\n private constructBubbles() {\n const container = this.container = document.createElement('div');\n container.classList.add('bubbles', 'scrolled-down');\n\n const chatInner = this.chatInner = document.createElement('div');\n chatInner.classList.add('bubbles-inner');\n\n this.setScroll();\n\n container.append(this.scrollable.container);\n }\n\n public attachContainerListeners() {\n const container = this.container;\n\n this.chat.contextMenu.attachTo(container);\n this.chat.selection.attachListeners(container, new ListenerSetter());\n\n if(DEBUG) {\n this.listenerSetter.add(container)('dblclick', async(e) => {\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\n if(bubble) {\n const mid = +bubble.dataset.mid\n this.log('debug message:', await this.chat.getMessage(mid));\n this.highlightBubble(bubble);\n }\n });\n }\n\n if(!IS_MOBILE) {\n this.listenerSetter.add(container)('dblclick', async(e) => {\n if(this.chat.type === 'pinned' ||\n this.chat.selection.isSelecting ||\n !(await this.chat.canSend())) {\n return;\n }\n\n const target = e.target as HTMLElement;\n const bubble = target.classList.contains('bubble') ?\n target :\n (target.classList.contains('document-selection') ? target.parentElement : null);\n if(bubble && !bubble.classList.contains('bubble-first')) {\n const mid = +bubble.dataset.mid;\n const message = await this.chat.getMessage(mid);\n if(message.pFlags.is_outgoing) {\n return;\n }\n\n this.chat.input.initMessageReply(mid);\n }\n });\n } else if(IS_TOUCH_SUPPORTED) {\n const className = 'is-gesturing-reply';\n const MAX = 64;\n const replyAfter = MAX * .75;\n let shouldReply = false;\n let target: HTMLElement;\n let icon: HTMLElement;\n let swipeAvatar: HTMLElement;\n handleHorizontalSwipe({\n element: container,\n verifyTouchTarget: async(e) => {\n if(this.chat.type === 'pinned' || this.chat.selection.isSelecting || !(await this.chat.canSend())) {\n return false;\n }\n\n // cancelEvent(e);\n target = findUpClassName(e.target, 'bubble');\n if(target) {\n try {\n const avatar = target.parentElement.querySelector('.bubbles-group-avatar') as HTMLElement\n if(avatar) {\n const visibleRect = getVisibleRect(avatar, target);\n if(visibleRect) {\n swipeAvatar = avatar;\n }\n }\n } catch(err) {}\n\n SetTransition({\n element: target,\n className,\n forwards: true,\n duration: 250\n });\n void target.offsetLeft; // reflow\n\n if(!icon) {\n icon = document.createElement('span');\n icon.classList.add('tgico-reply_filled', 'bubble-gesture-reply-icon');\n } else {\n icon.classList.remove('is-visible');\n icon.style.opacity = '';\n }\n\n target/* .querySelector('.bubble-content') */.append(icon);\n }\n\n return !!target;\n },\n onSwipe: (xDiff) => {\n shouldReply = xDiff >= replyAfter;\n\n if(shouldReply && !icon.classList.contains('is-visible')) {\n icon.classList.add('is-visible');\n }\n icon.style.opacity = '' + Math.min(1, xDiff / replyAfter);\n\n const x = -Math.max(0, Math.min(MAX, xDiff));\n const transform = `translateX(${x}px)`;\n target.style.transform = transform;\n if(swipeAvatar) {\n swipeAvatar.style.transform = transform;\n }\n cancelContextMenuOpening();\n },\n onReset: () => {\n const _target = target;\n const _swipeAvatar = swipeAvatar;\n target = swipeAvatar = undefined;\n SetTransition({\n element: _target,\n className,\n forwards: false,\n duration: 250,\n onTransitionEnd: () => {\n if(icon.parentElement === _target) {\n icon.classList.remove('is-visible');\n icon.remove();\n }\n }\n });\n\n fastRaf(() => {\n _target.style.transform = '';\n if(_swipeAvatar) {\n _swipeAvatar.style.transform = '';\n }\n\n if(shouldReply) {\n const {mid} = _target.dataset;\n this.chat.input.initMessageReply(+mid);\n shouldReply = false;\n }\n });\n },\n listenerOptions: {capture: true}\n });\n }\n }\n\n public constructPeerHelpers() {\n // will call when message is sent (only 1)\n this.listenerSetter.add(rootScope)('history_append', async({storageKey, message}) => {\n if(storageKey !== this.chat.messagesStorageKey || this.chat.type === 'scheduled') return;\n\n if(rootScope.settings.animationsEnabled) {\n this.updateGradient = true;\n }\n\n if(!this.scrollable.loadedAll.bottom) {\n this.chat.setMessageId();\n } else {\n this.renderNewMessage(message, true);\n }\n });\n\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\n if(this.peerId !== message.peerId || this.chat.type === 'scheduled') return;\n this.renderNewMessage(message);\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n if(peerId !== this.peerId || this.chat.type === 'scheduled') {\n return;\n }\n\n this.deleteMessagesByIds(Array.from(msgs));\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({peerId}) => {\n if(peerId === this.peerId) {\n this.chat.input.setUnreadCount();\n\n getHeavyAnimationPromise().then(() => {\n this.updateUnreadByDialog();\n });\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(!dialogs.has(this.peerId) || this.chat.type === 'scheduled') {\n return;\n }\n\n this.chat.input.setUnreadCount();\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(this.peerId !== dialog.peerId || this.chat.type === 'scheduled') {\n return;\n }\n\n this.chat.input.setUnreadCount();\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n const {peerId} = this;\n if(peerId !== chatId.toPeerId(true)) {\n return;\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n const hadRights = this.chatInner.classList.contains('has-rights');\n const hasRights = await this.chat.canSend();\n\n if(hadRights !== hasRights) {\n const callbacks = await Promise.all([\n this.finishPeerChange(),\n this.chat.input.finishPeerChange()\n ]);\n\n callbacks.forEach((callback) => callback());\n }\n\n if(!!(chat as MTChat.channel).pFlags.forum !== this.chat.isForum && this.chat.type === 'chat') {\n this.chat.peerId = 0;\n this.chat.appImManager.setPeer({peerId});\n }\n });\n\n this.listenerSetter.add(rootScope)('history_reload', (peerId) => {\n if(peerId !== this.peerId) {\n return;\n }\n\n const mids = getObjectKeysAndSort(this.bubbles, 'desc').filter((mid) => mid > 0);\n const middleware = this.getMiddleware();\n this.managers.appMessagesManager.reloadMessages(this.peerId, mids).then((messages) => {\n if(!middleware()) return;\n\n const toDelete: number[] = [];\n messages.forEach((message, idx) => {\n const mid = mids[idx];\n if(message) {\n const bubble = this.bubbles[message.mid];\n if(!bubble) return;\n\n this.safeRenderMessage(message, true, bubble);\n } else {\n toDelete.push(mid);\n }\n });\n\n this.deleteMessagesByIds(toDelete);\n\n this.setLoaded('top', false);\n this.setLoaded('bottom', false);\n this.scrollable.checkForTriggers();\n });\n });\n\n this.listenerSetter.add(rootScope)('settings_updated', async({key}) => {\n if(key === 'settings.emoji.big') {\n const middleware = this.getMiddleware();\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\n const m = mids.map(async(mid) => {\n const bubble = this.bubbles[mid];\n if(bubble.classList.contains('can-have-big-emoji')) {\n return {bubble, message: await this.chat.getMessage(mid)};\n }\n });\n\n const awaited = await Promise.all(m);\n if(!middleware()) {\n return;\n }\n\n awaited.filter(Boolean).forEach(({bubble, message}) => {\n if(this.bubbles[message.mid] !== bubble) {\n return;\n }\n\n this.safeRenderMessage(message, true, bubble);\n });\n }\n });\n\n !DO_NOT_UPDATE_MESSAGE_VIEWS && this.listenerSetter.add(rootScope)('messages_views', (arr) => {\n if(this.chat.type === 'scheduled') return;\n\n fastRaf(() => {\n let scrollSaver: ScrollSaver;\n for(const {peerId, views, mid} of arr) {\n if(this.peerId !== peerId) continue;\n\n const bubble = this.bubbles[mid];\n if(!bubble) continue;\n\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\n if(!postViewsElements.length) continue;\n\n const str = formatNumber(views, 1);\n let different = false;\n postViewsElements.forEach((postViews) => {\n if(different || postViews.textContent !== str) {\n if(!scrollSaver) {\n scrollSaver = this.createScrollSaver(true);\n scrollSaver.save();\n }\n\n different = true;\n postViews.textContent = str;\n }\n });\n }\n\n scrollSaver?.restore();\n });\n });\n\n this.observer = new SuperIntersectionObserver({root: this.scrollable.container});\n\n this.sendViewCountersDebounced = debounce(() => {\n const mids = [...this.viewsMids];\n this.viewsMids.clear();\n\n this.managers.appMessagesManager.incrementMessageViews(this.peerId, mids);\n }, 1000, false, true);\n\n // * pinned part start\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids, pinned}) => {\n if(this.chat.type !== 'pinned' || peerId !== this.peerId) {\n return;\n }\n\n if(mids) {\n if(!pinned) {\n this.deleteMessagesByIds(mids);\n }\n }\n });\n // * pinned part end\n\n // * scheduled part start\n const onUpdate = async() => {\n this.chat.topbar.setTitle((await this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size);\n };\n\n this.listenerSetter.add(rootScope)('scheduled_new', (message) => {\n if(this.chat.type !== 'scheduled' || message.peerId !== this.peerId) return;\n\n this.renderNewMessage(message);\n onUpdate();\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\n if(this.chat.type !== 'scheduled' || peerId !== this.peerId) return;\n\n this.deleteMessagesByIds(mids);\n onUpdate();\n });\n // * scheduled part end\n }\n\n private get peerId() {\n return this.chat.peerId;\n }\n\n public get messagesQueuePromise() {\n return this.batchProcessor.queuePromise;\n }\n\n private createScrollSaver(reverse = true) {\n const scrollSaver = new ScrollSaver(this.scrollable, '.bubble:not(.is-date)', reverse);\n return scrollSaver;\n }\n\n private unreadedObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n const target = entry.target as HTMLElement;\n const mid = this.unreaded.get(target as HTMLElement);\n this.onUnreadedInViewport(target, mid);\n }\n };\n\n private viewsObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n const mid = +(entry.target as HTMLElement).dataset.mid;\n this.observer.unobserve(entry.target, this.viewsObserverCallback);\n\n if(mid) {\n this.viewsMids.add(mid);\n this.sendViewCountersDebounced();\n } else {\n const {sponsoredMessage} = this;\n const randomId = sponsoredMessage?.random_id;\n if(randomId) {\n this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(), randomId);\n delete sponsoredMessage.random_id;\n }\n }\n }\n };\n\n private stickerEffectObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n this.observer.unobserve(entry.target, this.stickerEffectObserverCallback);\n\n const attachmentDiv: HTMLElement = entry.target.querySelector('.attachment');\n getHeavyAnimationPromise().then(() => {\n if(isInDOM(attachmentDiv)) {\n simulateClickEvent(attachmentDiv);\n }\n });\n }\n };\n\n private createResizeObserver() {\n if(!('ResizeObserver' in window) || this.resizeObserver) {\n return;\n }\n\n const container = this.scrollable.container;\n let wasHeight = 0/* container.offsetHeight */;\n let resizing = false;\n let skip = false;\n let scrolled = 0;\n let part = 0;\n let rAF = 0;\n // let skipNext = true;\n\n const onResizeEnd = () => {\n const height = container.offsetHeight;\n const isScrolledDown = this.scrollable.isScrolledDown;\n if(height !== wasHeight && (!skip || !isScrolledDown)) { // * fix opening keyboard while ESG is active, offsetHeight will change right between 'start' and this first frame\n part += wasHeight - height;\n }\n\n /* if(DEBUG) {\n this.log('resize end', scrolled, part, this.scrollable.scrollTop, height, wasHeight, this.scrollable.isScrolledDown);\n } */\n\n if(part) {\n this.scrollable.setScrollTopSilently(this.scrollable.scrollTop + Math.round(part));\n }\n\n wasHeight = height;\n scrolled = 0;\n rAF = 0;\n part = 0;\n resizing = false;\n skip = false;\n };\n\n const setEndRAF = (single: boolean) => {\n if(rAF) window.cancelAnimationFrame(rAF);\n rAF = window.requestAnimationFrame(single ? onResizeEnd : () => {\n rAF = window.requestAnimationFrame(onResizeEnd);\n // this.log('resize after RAF', part);\n });\n };\n\n const processEntries: ResizeObserverCallback = (entries) => {\n /* if(skipNext) {\n skipNext = false;\n return;\n } */\n\n if(skip) {\n setEndRAF(false);\n return;\n }\n\n const entry = entries[0];\n const height = entry.contentRect.height;/* Math.ceil(entry.contentRect.height); */\n\n if(!wasHeight) {\n wasHeight = height;\n return;\n }\n\n const realDiff = wasHeight - height;\n let diff = realDiff + part;\n const _part = diff % 1;\n diff -= _part;\n\n if(!resizing) {\n resizing = true;\n\n /* if(DEBUG) {\n this.log('resize start', realDiff, this.scrollable.scrollTop, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown);\n } */\n\n if(realDiff < 0 && this.scrollable.isScrolledDown) {\n // if(isSafari) { // * fix opening keyboard while ESG is active\n part = -realDiff;\n // }\n\n skip = true;\n setEndRAF(false);\n return;\n }\n }\n\n scrolled += diff;\n\n /* if(DEBUG) {\n this.log('resize', wasHeight - height, diff, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown, height, wasHeight);\n } */\n\n if(diff) {\n const needScrollTop = this.scrollable.scrollTop + diff;\n this.scrollable.setScrollTopSilently(needScrollTop);\n }\n\n setEndRAF(false);\n\n part = _part;\n wasHeight = height;\n };\n\n const resizeObserver = this.resizeObserver = new ResizeObserver(processEntries);\n resizeObserver.observe(container);\n }\n\n private destroyResizeObserver() {\n const resizeObserver = this.resizeObserver;\n if(!resizeObserver) {\n return;\n }\n\n resizeObserver.disconnect();\n this.resizeObserver = undefined;\n }\n\n private onBubblesMouseMove = async(e: MouseEvent) => {\n const content = findUpClassName(e.target, 'bubble-content');\n if(\n this.chat.type !== 'scheduled' &&\n content &&\n !this.chat.selection.isSelecting &&\n !findUpClassName(e.target, 'service') &&\n !findUpClassName(e.target, 'bubble-beside-button')\n ) {\n const bubble = findUpClassName(content, 'bubble');\n if(!this.chat.selection.canSelectBubble(bubble)) {\n this.unhoverPrevious();\n return;\n }\n\n let {hoverBubble, hoverReaction} = this;\n if(bubble === hoverBubble) {\n return;\n }\n\n this.unhoverPrevious();\n\n hoverBubble = this.hoverBubble = bubble;\n hoverReaction = this.hoverReaction;\n // hoverReaction = contentWrapper.querySelector('.bubble-hover-reaction');\n if(!hoverReaction) {\n hoverReaction = this.hoverReaction = document.createElement('div');\n hoverReaction.classList.add('bubble-hover-reaction');\n\n const stickerWrapper = document.createElement('div');\n stickerWrapper.classList.add('bubble-hover-reaction-sticker');\n hoverReaction.append(stickerWrapper);\n\n content.append(hoverReaction);\n\n let message = await this.chat.getMessage(+bubble.dataset.mid);\n if(message?._ !== 'message') {\n this.unhoverPrevious();\n return;\n }\n\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\n\n const middleware = this.getMiddleware(() => this.hoverReaction === hoverReaction);\n Promise.all([\n this.managers.appReactionsManager.getAvailableReactionsByMessage(message),\n pause(400)\n ]).then(([availableReactions]) => {\n const availableReaction = availableReactions[0];\n if(!availableReaction) {\n hoverReaction.remove();\n return;\n }\n\n wrapSticker({\n div: stickerWrapper,\n doc: availableReaction.select_animation,\n width: 18,\n height: 18,\n needUpscale: true,\n middleware,\n group: this.chat.animationGroup,\n withThumb: false,\n needFadeIn: false\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n player.addEventListener('firstFrame', () => {\n if(!middleware()) {\n // debugger;\n return;\n }\n\n hoverReaction.dataset.loaded = '1';\n this.setHoverVisible(hoverReaction, true);\n }, {once: true});\n\n attachClickEvent(hoverReaction, (e) => {\n cancelEvent(e); // cancel triggering selection\n\n this.managers.appReactionsManager.sendReaction(message as Message.message, availableReaction);\n this.unhoverPrevious();\n }, {listenerSetter: this.listenerSetter});\n }, noop);\n });\n } else if(hoverReaction.dataset.loaded) {\n this.setHoverVisible(hoverReaction, true);\n }\n } else {\n this.unhoverPrevious();\n }\n };\n\n public setReactionsHoverListeners() {\n this.listenerSetter.add(contextMenuController)('toggle', this.unhoverPrevious);\n this.listenerSetter.add(overlayCounter)('change', this.unhoverPrevious);\n this.listenerSetter.add(this.chat.selection)('toggle', this.unhoverPrevious);\n this.listenerSetter.add(this.container)('mousemove', this.onBubblesMouseMove);\n }\n\n private setHoverVisible(hoverReaction: HTMLElement, visible: boolean) {\n if(hoverReaction.parentElement) {\n hoverReaction.parentElement.classList.toggle('hover-reaction-visible', visible);\n }\n\n SetTransition({\n element: hoverReaction,\n className: 'is-visible',\n forwards: visible,\n duration: 200,\n onTransitionEnd: visible ? undefined : () => {\n hoverReaction.remove();\n },\n useRafs: 2\n });\n }\n\n private unhoverPrevious = () => {\n const {hoverBubble, hoverReaction} = this;\n if(hoverBubble) {\n this.setHoverVisible(hoverReaction, false);\n this.hoverBubble = undefined;\n this.hoverReaction = undefined;\n }\n };\n\n public setStickyDateManually() {\n return;\n\n const timestamps = Object.keys(this.dateMessages).map((k) => +k).sort((a, b) => b - a);\n let lastVisible: HTMLElement;\n\n // if(this.chatInner.classList.contains('is-scrolling')) {\n const {scrollTop} = this.scrollable.container;\n const isOverflown = scrollTop > 0;\n if(isOverflown) {\n for(const timestamp of timestamps) {\n const dateMessage = this.dateMessages[timestamp];\n const visibleRect = getVisibleRect(dateMessage.container, this.scrollable.container);\n if(visibleRect && visibleRect.overflow.top) {\n lastVisible = dateMessage.div;\n } else if(lastVisible) {\n break;\n }\n }\n }\n // }\n\n if(lastVisible === this.previousStickyDate) {\n return;\n }\n\n if(lastVisible) {\n const needReflow = /* !!this.chat.setPeerPromise || */!this.previousStickyDate;\n if(needReflow) {\n lastVisible.classList.add('no-transition');\n }\n\n lastVisible.classList.add('is-sticky');\n\n if(needReflow) {\n void lastVisible.offsetLeft; // reflow\n lastVisible.classList.remove('no-transition');\n }\n }\n\n if(this.previousStickyDate && this.previousStickyDate !== lastVisible) {\n this.previousStickyDate.classList.remove('is-sticky');\n }\n\n this.previousStickyDate = lastVisible;\n }\n\n public getRenderedLength() {\n return Object.keys(this.bubbles).length - this.skippedMids.size;\n }\n\n private onUnreadedInViewport(target: HTMLElement, mid: number) {\n this.unreadedSeen.add(mid);\n this.observer.unobserve(target, this.unreadedObserverCallback);\n this.unreaded.delete(target);\n this.readUnreaded();\n }\n\n private readUnreaded() {\n if(this.readPromise) return;\n\n const middleware = this.getMiddleware();\n this.readPromise = idleController.getFocusPromise().then(async() => {\n if(!middleware()) return;\n let maxId = Math.max(...Array.from(this.unreadedSeen));\n\n // ? if message with maxId is not rendered ?\n if(this.scrollable.loadedAll.bottom) {\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map((i) => +i));\n if(maxId >= bubblesMaxId) {\n maxId = Math.max((await this.chat.getHistoryMaxId()) || 0, maxId);\n }\n }\n\n this.unreaded.forEach((mid, target) => {\n if(mid <= maxId) {\n this.onUnreadedInViewport(target, mid);\n }\n });\n\n const readContents: number[] = [];\n for(const mid of this.unreadedSeen) {\n const message: MyMessage = await this.chat.getMessage(mid);\n if(isMentionUnread(message)) {\n readContents.push(mid);\n }\n }\n\n this.managers.appMessagesManager.readMessages(this.peerId, readContents);\n\n this.unreadedSeen.clear();\n\n if(DEBUG) {\n this.log('will readHistory by maxId:', maxId);\n }\n\n // return;\n\n return this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\n this.log.error('readHistory err:', err);\n this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\n }).finally(() => {\n if(!middleware()) return;\n this.readPromise = undefined;\n\n if(this.unreadedSeen.size) {\n this.readUnreaded();\n }\n });\n });\n }\n\n public onBubblesClick = async(e: Event) => {\n let target = e.target as HTMLElement;\n let bubble: HTMLElement = null;\n try {\n bubble = findUpClassName(target, 'bubble');\n } catch(err) {}\n\n if(!bubble && !this.chat.selection.isSelecting) {\n const avatar = findUpClassName(target, 'user-avatar');\n if(!avatar) {\n return;\n }\n\n const peerId = avatar.dataset.peerId.toPeerId();\n if(peerId !== NULL_PEER_ID) {\n this.chat.appImManager.setInnerPeer({peerId});\n } else {\n toast(I18n.format('HidAccount', true));\n }\n return;\n }\n\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\n if(bubble.classList.contains('is-fake')) {\n bubble = bubble.previousElementSibling as HTMLElement;\n }\n\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\n return;\n }\n\n for(const timestamp in this.dateMessages) {\n const d = this.dateMessages[timestamp];\n if(d.div === bubble) {\n PopupElement.createPopup(PopupDatePicker, new Date(+timestamp), this.onDatePick).show();\n break;\n }\n }\n\n return;\n }\n\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\n this.chat.selection.toggleByElement(bubble);\n return;\n }\n\n // ! Trusted - due to audio autoclick\n if(this.chat.selection.isSelecting && e.isTrusted) {\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\n return;\n }\n\n cancelEvent(e);\n // console.log('bubble click', e);\n\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\n this.chat.selection.selectedText = undefined;\n return;\n }\n\n // this.chatSelection.toggleByBubble(bubble);\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\n return;\n }\n\n const mediaSpoiler: HTMLElement = findUpClassName(target, 'media-spoiler-container');\n if(mediaSpoiler) {\n onMediaSpoilerClick({\n event: e,\n mediaSpoiler\n });\n return;\n }\n\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\n if(contactDiv) {\n const peerId = contactDiv.dataset.peerId.toPeerId();\n if(peerId) {\n this.chat.appImManager.setInnerPeer({\n peerId\n });\n } else {\n const phone = contactDiv.querySelector('.contact-number');\n copyTextToClipboard(phone.innerText.replace(/\\s/g, ''));\n toastNew({langPackKey: 'PhoneCopied'});\n cancelEvent(e);\n }\n\n return;\n }\n\n const callDiv: HTMLElement = findUpClassName(target, 'bubble-call');\n if(callDiv) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), callDiv.dataset.type as any);\n return;\n }\n\n const buyButton: HTMLElement = findUpClassName(target, 'is-buy');\n if(buyButton) {\n cancelEvent(e);\n\n const message = await this.chat.getMessage(+bubble.dataset.mid);\n if(!message) {\n return;\n }\n\n new PopupPayment(\n message as Message.message,\n await this.managers.appPaymentsManager.getInputInvoiceByPeerId(message.peerId, message.mid)\n );\n return;\n }\n\n const reactionElement = findUpTag(target, 'REACTION-ELEMENT') as ReactionElement;\n if(reactionElement) {\n cancelEvent(e);\n if(reactionElement.classList.contains('is-inactive')) {\n return;\n }\n\n const reactionsElement = reactionElement.parentElement as ReactionsElement;\n const reactionCount = reactionsElement.getReactionCount(reactionElement);\n\n const message = reactionsElement.getMessage();\n this.managers.appReactionsManager.sendReaction(message, reactionCount.reaction);\n\n return;\n }\n\n const stickerEmojiEl = findUpAttribute(target, 'data-sticker-emoji');\n if(stickerEmojiEl && stickerEmojiEl.parentElement.querySelectorAll('[data-sticker-emoji]').length === 1 && bubble.classList.contains('emoji-big')) {\n onEmojiStickerClick({\n event: e,\n container: stickerEmojiEl,\n managers: this.managers,\n middleware: this.getMiddleware(),\n peerId: this.peerId\n });\n\n return;\n }\n\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\n if(commentsDiv) {\n const bubbleMid = +bubble.dataset.mid;\n if(this.peerId === REPLIES_PEER_ID) {\n const message = await this.chat.getMessage(bubbleMid) as Message.message;\n const peerId = getPeerId(message.reply_to.reply_to_peer_id);\n const threadId = message.reply_to.reply_to_top_id;\n const lastMsgId = message.fwd_from.saved_from_msg_id;\n this.chat.appImManager.openThread({\n peerId,\n lastMsgId,\n threadId\n });\n } else {\n const message1 = await this.chat.getMessage(bubbleMid);\n const message = await this.managers.appMessagesManager.getMessageWithReplies(message1 as Message.message);\n const replies = message.replies;\n if(replies) {\n this.managers.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then((message) => {\n this.chat.appImManager.setInnerPeer({\n peerId: replies.channel_id.toPeerId(true),\n type: 'discussion',\n threadId: (message as MyMessage).mid\n });\n });\n }\n }\n\n return;\n }\n\n const via = findUpClassName(target, 'is-via');\n if(via) {\n const el = via.querySelector('.peer-title') as HTMLElement;\n if(target === el || findUpAsChild(target, el)) {\n const message = el.innerText + ' ';\n this.managers.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\n cancelEvent(e);\n\n return;\n }\n }\n\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\n if(nameDiv && nameDiv !== bubble) {\n target = nameDiv || target;\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer') || (target as AvatarElement).peerId;\n const savedFrom = target.dataset.savedFrom;\n if(typeof(peerIdStr) === 'string' || savedFrom) {\n if(savedFrom) {\n const [peerId, mid] = savedFrom.split('_');\n if(target.classList.contains('is-receipt-link')) {\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId.toPeerId(), +mid);\n if(message) {\n const inputInvoice = await this.managers.appPaymentsManager.getInputInvoiceByPeerId(this.peerId, +bubble.dataset.mid);\n new PopupPayment(message as Message.message, inputInvoice, undefined, true);\n }\n } else {\n this.chat.appImManager.setInnerPeer({\n peerId: peerId.toPeerId(),\n lastMsgId: +mid\n });\n }\n } else {\n const peerId = peerIdStr.toPeerId();\n if(peerId !== NULL_PEER_ID) {\n this.chat.appImManager.setInnerPeer({peerId});\n } else {\n toast(I18n.format('HidAccount', true));\n }\n }\n }\n\n return;\n }\n\n // this.log('chatInner click:', target);\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\n /* if(isVideoComponentElement) {\n const video = target.parentElement.querySelector('video') as HTMLElement;\n if(video) {\n video.click(); // hot-fix for time and play button\n return;\n }\n } */\n\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\n const messageId = +bubble.dataset.mid;\n const message = await this.chat.getMessage(messageId);\n\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as Document.document;\n\n if(doc?.stickerSetInput) {\n new PopupStickers(doc.stickerSetInput).show();\n }\n\n return;\n }\n\n const documentDiv = findUpClassName(target, 'document-with-thumb');\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) ||\n target.classList.contains('album-item') ||\n // || isVideoComponentElement\n (target.tagName === 'VIDEO' && !bubble.classList.contains('round')) ||\n (documentDiv && !documentDiv.querySelector('.preloader-container')) ||\n target.classList.contains('canvas-thumbnail')) {\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\n const preloader = (groupedItem || bubble).querySelector('.preloader-container');\n if(preloader) {\n simulateClickEvent(preloader);\n cancelEvent(e);\n return;\n }\n\n cancelEvent(e);\n const messageId = +(groupedItem || bubble).dataset.mid;\n const message = await this.chat.getMessage(messageId);\n if(!message) {\n this.log.warn('no message by messageId:', messageId);\n return;\n }\n\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\n\n const f = documentDiv ? (media: any) => {\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\n } : (media: any) => {\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\n };\n\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\n const ids = isSingleMedia ? [messageId] : (await Promise.all(Object.keys(this.bubbles).map((k) => +k).map(async(mid) => {\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\n return false;\n } */\n // if(!this.scrollable.visibleElements.find((e) => e.element === this.bubbles[id])) return false;\n\n const message = await this.chat.getMessage(mid);\n const media = getMediaFromMessage(message);\n\n return media && f(media) && mid;\n }))).filter(Boolean).sort((a, b) => a - b);\n\n ids.forEach((id) => {\n let selector: string;\n if(documentDiv) {\n selector = '.document-container';\n } else {\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\n if(withTail) {\n selector += '.bubble__media-container';\n } else {\n selector += '.attachment video, .attachment img';\n }\n }\n\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\n const parents: Set = new Set();\n if(documentDiv) {\n elements.forEach((element) => {\n targets.push({\n element: element.querySelector('.document-ico'),\n mid: +element.dataset.mid,\n peerId: this.peerId\n });\n });\n } else {\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\n elements.forEach((element) => {\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\n const albumItem = findUpClassName(element, 'album-item');\n const parent = albumItem || element.parentElement;\n if(parents.has(parent)) return;\n parents.add(parent);\n targets.push({\n element,\n mid: albumItem ? +albumItem.dataset.mid : id,\n peerId: this.peerId\n });\n });\n }\n });\n\n targets.sort((a, b) => a.mid - b.mid);\n\n const idx = targets.findIndex((t) => t.mid === messageId);\n\n if(DEBUG) {\n this.log('open mediaViewer single with ids:', ids, idx, targets);\n }\n\n if(!targets[idx]) {\n this.log('no target for media viewer!', target);\n return;\n }\n\n new AppMediaViewer()\n .setSearchContext({\n threadId: this.chat.threadId,\n peerId: this.peerId,\n inputFilter: {_: documentDiv ? 'inputMessagesFilterDocument' : 'inputMessagesFilterPhotoVideo'},\n useSearch: this.chat.type !== 'scheduled' && !isSingleMedia,\n isScheduled: this.chat.type === 'scheduled'\n })\n .openMedia(message, targets[idx].element, 0, true, targets.slice(0, idx), targets.slice(idx + 1));\n\n // appMediaViewer.openMedia(message, target as HTMLImageElement);\n return;\n }\n\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\n\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\n if(target.classList.contains('goto-original')) {\n const savedFrom = bubble.dataset.savedFrom;\n const [peerId, mid] = savedFrom.split('_');\n // //this.log('savedFrom', peerId, msgID);\n this.chat.appImManager.setInnerPeer({\n peerId: peerId.toPeerId(),\n lastMsgId: +mid\n });\n return;\n } else if(target.classList.contains('forward')) {\n const mid = +bubble.dataset.mid;\n const message = await this.managers.appMessagesManager.getMessageByPeer(this.peerId, mid);\n new PopupForward({\n [this.peerId]: await this.managers.appMessagesManager.getMidsByMessage(message)\n });\n // appSidebarRight.forwardTab.open([mid]);\n return;\n }\n\n let isReplyClick = false;\n\n try {\n isReplyClick = !!findUpClassName(e.target, 'reply');\n } catch(err) {}\n\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\n const bubbleMid = +bubble.dataset.mid;\n this.followStack.push(bubbleMid);\n\n const message = (await this.chat.getMessage(bubbleMid)) as Message.message;\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\n const replyToMid = message.reply_to.reply_to_msg_id;\n\n this.chat.appImManager.setInnerPeer({\n peerId: replyToPeerId,\n lastMsgId: replyToMid,\n type: this.chat.type,\n threadId: this.chat.threadId\n });\n\n /* if(this.chat.type === 'discussion') {\n this.chat.appImManager.setMessageId(, originalMessageId);\n } else {\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\n } */\n // this.chat.setMessageId(, originalMessageId);\n }\n }\n\n // console.log('chatInner click', e);\n };\n\n public async onGoDownClick() {\n if(!this.followStack.length) {\n // this.onScroll(true, undefined, true);\n this.chat.setMessageId(/* , dialog.top_message */);\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\n\n // if(dialog) {\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\n // } else {\n // this.log('will scroll down 3');\n // this.scroll.scrollTop = this.scroll.scrollHeight;\n // }\n\n return;\n }\n\n const middleware = this.getMiddleware();\n const slice = this.followStack.slice();\n const messages = await Promise.all(slice.map((mid) => this.chat.getMessage(mid)));\n if(!middleware()) return;\n\n slice.forEach((mid, idx) => {\n const message = messages[idx];\n\n const bubble = this.bubbles[mid];\n let bad = true;\n if(bubble) {\n const rect = bubble.getBoundingClientRect();\n bad = (windowSize.height / 2) > rect.top;\n } else if(message) {\n bad = false;\n }\n\n if(bad) {\n this.followStack.splice(this.followStack.indexOf(mid), 1);\n }\n });\n\n this.followStack.sort((a, b) => b - a);\n\n const mid = this.followStack.pop();\n this.chat.setMessageId(mid);\n }\n\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\n let element = getElementByPoint(this.scrollable.container, verticalSide, 'center');\n /* if(element) {\n if(element.classList.contains('bubbles-date-group')) {\n const children = Array.from(element.children) as HTMLElement[];\n if(verticalSide === 'top') {\n element = children[this.stickyIntersector ? 2 : 1];\n } else {\n element = children[children.length - 1];\n }\n } else {\n element = findUpClassName(element, 'bubble');\n if(element && element.classList.contains('is-date')) {\n element = element.nextElementSibling as HTMLElement;\n }\n }\n } */\n if(element) element = findUpClassName(element, 'bubble');\n\n return element;\n }\n\n public async getGroupedBubble(groupId: string) {\n const mids = await this.managers.appMessagesManager.getMidsByAlbum(groupId);\n for(const mid of mids) {\n if(this.bubbles[mid] && !this.skippedMids.has(mid)) {\n // const maxId = Math.max(...mids); // * because in scheduled album can be rendered by lowest mid during sending\n return {\n bubble: this.bubbles[mid],\n mid: mid\n // message: await this.chat.getMessage(maxId) as Message.message\n };\n }\n }\n }\n\n public getBubbleGroupedItems(bubble: HTMLElement) {\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\n }\n\n public async getMountedBubble(mid: number, message?: Message.message | Message.messageService) {\n if(message === undefined) {\n message = await this.chat.getMessage(mid);\n }\n\n if(!message) {\n return;\n }\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const a = await this.getGroupedBubble(groupedId);\n if(a) {\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\n return a;\n }\n }\n\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n return {bubble, mid};\n }\n\n private findNextMountedBubbleByMsgId(mid: number, prev?: boolean) {\n const mids = getObjectKeysAndSort(this.bubbles, prev ? 'desc' : 'asc');\n\n let filterCallback: (_mid: number) => boolean;\n if(prev) filterCallback = (_mid) => _mid < mid;\n else filterCallback = (_mid) => mid < _mid;\n\n const foundMid = mids.find((_mid) => {\n if(!filterCallback(_mid)) return false;\n return !!this.bubbles[_mid]?.parentElement;\n });\n\n return this.bubbles[foundMid];\n }\n\n public loadMoreHistory(top: boolean, justLoad = false) {\n // this.log('loadMoreHistory', top);\n if(\n !this.peerId ||\n /* TEST_SCROLL || */\n this.chat.setPeerPromise ||\n this.isHeavyAnimationInProgress ||\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) ||\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\n ) {\n return;\n }\n\n // warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)\n // some messages can have negative id (such as sponsored message)\n const history = Object.keys(this.bubbles)\n .map((id) => +id)\n .filter((id) => id > 0 && !this.skippedMids.has(id))\n .sort((a, b) => a - b);\n\n if(!history.length) {\n history.push(0);\n }\n\n if(top) {\n if(DEBUG) {\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\n }\n\n this.getHistory1(history[0], true, undefined, undefined, justLoad);\n } else {\n // let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\n // const historyMaxId = await this.chat.getHistoryMaxId();\n\n // // if scroll down after search\n // if(history.indexOf(historyMaxId) !== -1) {\n // this.setLoaded('bottom', true);\n // return;\n // }\n\n if(DEBUG) {\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\n }\n\n this.getHistory1(history[history.length - 1], false, true, undefined, justLoad);\n }\n }\n\n public onScroll = (ignoreHeavyAnimation?: boolean, scrollDimensions?: ScrollStartCallbackDimensions, forceDown?: boolean) => {\n // return;\n\n if(this.isHeavyAnimationInProgress) {\n this.sliceViewportDebounced?.clearTimeout();\n\n // * В таком случае, кнопка не будет моргать если чат в самом низу, и правильно отработает случай написания нового сообщения и проскролла вниз\n if(this.scrolledDown && !ignoreHeavyAnimation) {\n return;\n }\n } else {\n this.chat.topbar.pinnedMessage?.setCorrectIndexThrottled(this.scrollable.lastScrollDirection);\n this.sliceViewportDebounced?.();\n this.setStickyDateManually();\n }\n\n // lottieLoader.checkAnimations(false, 'chat');\n\n if(scrollDimensions && scrollDimensions.distanceToEnd < SCROLLED_DOWN_THRESHOLD && this.scrolledDown) {\n return;\n }\n\n const distanceToEnd = forceDown ? 0 : scrollDimensions?.distanceToEnd ?? this.scrollable.getDistanceToEnd();\n if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 && distanceToEnd > 0) || scrollDimensions || forceDown) {\n // if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 || scrollDimensions) && distanceToEnd > 0) {\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\n this.chatInner.classList.add('is-scrolling');\n }\n\n this.isScrollingTimeout = window.setTimeout(() => {\n this.chatInner.classList.remove('is-scrolling');\n this.isScrollingTimeout = 0;\n }, 1350 + (scrollDimensions?.duration ?? 0));\n }\n\n if(distanceToEnd < SCROLLED_DOWN_THRESHOLD && (forceDown || this.scrollable.loadedAll.bottom || this.chat.setPeerPromise || !this.peerId)) {\n this.container.classList.add('scrolled-down');\n this.scrolledDown = true;\n } else if(this.container.classList.contains('scrolled-down')) {\n this.container.classList.remove('scrolled-down');\n this.scrolledDown = false;\n }\n };\n\n public setScroll() {\n if(this.scrollable) {\n this.destroyScrollable();\n }\n\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\n this.setLoaded('top', false, false);\n this.setLoaded('bottom', false, false);\n\n this.scrollable.container.append(this.chatInner);\n\n /* const getScrollOffset = () => {\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\n return 300;\n };\n\n window.addEventListener('resize', () => {\n this.scrollable.onScrollOffset = getScrollOffset();\n });\n\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\n\n this.scrollable.onAdditionalScroll = this.onScroll;\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\n // this.scrollable.attachSentinels(undefined, 300);\n\n if(IS_TOUCH_SUPPORTED && false) {\n this.scrollable.container.addEventListener('touchmove', () => {\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\n this.chatInner.classList.add('is-scrolling');\n }\n }, {passive: true});\n\n this.scrollable.container.addEventListener('touchend', () => {\n if(!this.chatInner.classList.contains('is-scrolling')) {\n return;\n }\n\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n }\n\n this.isScrollingTimeout = window.setTimeout(() => {\n this.chatInner.classList.remove('is-scrolling');\n this.isScrollingTimeout = 0;\n }, 1350);\n }, {passive: true});\n }\n }\n\n public async updateUnreadByDialog() {\n const historyStorage = await this.chat.getHistoryStorage();\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\n\n // /////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\n\n for(const msgId of this.unreadOut) {\n if(msgId > 0 && msgId <= maxId) {\n const bubble = this.bubbles[msgId];\n if(bubble) {\n this.unreadOut.delete(msgId);\n\n if(bubble.classList.contains('is-outgoing') || bubble.classList.contains('is-error')) {\n continue;\n }\n\n bubble.classList.remove('is-sent', 'is-sending', 'is-outgoing'); // is-sending can be when there are bulk of updates (e.g. sending command to Stickers bot)\n bubble.classList.add('is-read');\n }\n }\n }\n }\n\n public destroyBubble(bubble: HTMLElement, mid = +bubble.dataset.mid) {\n // this.log.warn('destroy bubble', bubble, mid);\n bubble.middlewareHelper.destroy();\n\n /* const mounted = this.getMountedBubble(mid);\n if(!mounted) return; */\n\n if(this.bubbles[mid] === bubble) { // have to check because can clear bubble with same id later\n delete this.bubbles[mid];\n }\n\n this.skippedMids.delete(mid);\n\n if(this.firstUnreadBubble === bubble) {\n this.firstUnreadBubble = null;\n }\n\n this.bubbleGroups.removeAndUnmountBubble(bubble);\n if(this.observer) {\n this.observer.unobserve(bubble, this.unreadedObserverCallback);\n this.unreaded.delete(bubble);\n\n this.observer.unobserve(bubble, this.viewsObserverCallback);\n this.viewsMids.delete(mid);\n\n this.observer.unobserve(bubble, this.stickerEffectObserverCallback);\n }\n\n // this.reactions.delete(mid);\n }\n\n public deleteMessagesByIds(mids: number[], permanent = true, ignoreOnScroll?: boolean) {\n let deleted = false;\n mids.forEach((mid) => {\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n this.destroyBubble(bubble, mid);\n\n deleted = true;\n });\n\n if(!deleted) {\n return;\n }\n\n this.scrollable.ignoreNextScrollEvent();\n if(permanent && this.chat.selection.isSelecting) {\n this.chat.selection.deleteSelectedMids(this.peerId, mids);\n }\n\n animationIntersector.checkAnimations(false, this.chat.animationGroup);\n this.deleteEmptyDateGroups();\n\n if(!ignoreOnScroll) {\n this.scrollable.onScroll();\n // this.onScroll();\n }\n }\n\n private pollExtendedMediaMessages() {\n const mids = Array.from(this.extendedMediaMessages);\n return this.managers.appMessagesManager.getExtendedMedia(this.peerId, mids);\n }\n\n private setExtendedMediaMessagesPollInterval() {\n if(this.pollExtendedMediaMessagesPromise || !this.extendedMediaMessages.size) {\n return;\n }\n\n this.pollExtendedMediaMessagesPromise = pause(30000)\n .then(() => this.pollExtendedMediaMessages())\n .then(() => this.setExtendedMediaMessagesPollInterval());\n }\n\n private setTopPadding(middleware = this.getMiddleware()) {\n let isPaddingNeeded = false;\n let setPaddingTo: HTMLElement;\n if(!this.isTopPaddingSet && this.chat.type !== 'scheduled') {\n const {clientHeight, scrollHeight} = this.scrollable.container;\n isPaddingNeeded = clientHeight === scrollHeight;\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\n if(this.chatInner.firstElementChild) {\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\n } else {\n isPaddingNeeded = true;\n } */\n\n if(isPaddingNeeded) {\n /* const add = clientHeight - scrollHeight;\n this.chatInner.style.paddingTop = add + 'px';\n this.scrollable.scrollTop += add; */\n setPaddingTo = this.chatInner;\n setPaddingTo.style.paddingTop = clientHeight + 'px';\n this.scrollable.setScrollTopSilently(scrollHeight);\n this.isTopPaddingSet = true;\n }\n }\n\n return {\n isPaddingNeeded,\n unsetPadding: isPaddingNeeded ? () => {\n if(middleware() && isPaddingNeeded) {\n setPaddingTo.style.paddingTop = '';\n this.isTopPaddingSet = false;\n }\n } : undefined\n };\n }\n\n private renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\n const promise = this._renderNewMessage(message, scrolledDown);\n this.renderNewPromises.add(promise);\n promise.catch(noop).finally(() => {\n this.renderNewPromises.delete(promise);\n });\n return promise;\n }\n\n private async _renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\n if(!this.scrollable.loadedAll.bottom) { // seems search active or sliced\n // this.log('renderNewMessagesByIds: seems search is active, skipping render:', mids);\n const setPeerPromise = this.chat.setPeerPromise;\n if(setPeerPromise) {\n const middleware = this.getMiddleware();\n setPeerPromise.then(async() => {\n if(!middleware()) return;\n const newMessage = await this.chat.getMessage(message.mid);\n if(!middleware()) return;\n this.renderNewMessage(newMessage);\n });\n }\n\n return;\n }\n\n if(this.chat.threadId && getMessageThreadId(message, this.chat.isForum) !== this.chat.threadId) {\n return;\n }\n\n if(this.bubbles[message.mid]) {\n return;\n }\n // ! should scroll even without new messages\n /* if(!mids.length) {\n return;\n } */\n\n if(!scrolledDown) {\n scrolledDown = this.scrolledDown && (\n !this.scrollingToBubble ||\n this.scrollingToBubble === this.getLastBubble() ||\n this.scrollingToBubble === this.chatInner\n );\n }\n\n const middleware = this.getMiddleware();\n const {isPaddingNeeded, unsetPadding} = this.setTopPadding(middleware);\n\n const promise = this.performHistoryResult({history: [message]}, false);\n if(scrolledDown) {\n promise.then(() => {\n if(!middleware()) return;\n // this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\n // const bubble = this.bubbles[Math.max(...mids)];\n\n let bubble: HTMLElement;\n if(this.chat.type === 'scheduled') {\n bubble = this.bubbles[message.mid];\n }\n\n const promise = bubble ? this.scrollToBubbleEnd(bubble) : this.scrollToEnd();\n if(isPaddingNeeded) {\n // it will be called only once even if was set multiple times (that won't happen)\n promise.then(unsetPadding);\n }\n\n // this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\n\n /* setTimeout(() => {\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\n }, 10); */\n });\n }\n\n return promise;\n }\n\n public getLastBubble() {\n const group = this.bubbleGroups.getLastGroup();\n return group?.lastItem?.bubble;\n }\n\n public scrollToBubble(\n element: HTMLElement,\n position: ScrollLogicalPosition,\n forceDirection?: FocusDirection,\n forceDuration?: number\n ) {\n const bubble = findUpClassName(element, 'bubble');\n\n if(!element.parentElement) {\n this.log.error('element is not connected', bubble);\n }\n\n let fallbackToElementStartWhenCentering: HTMLElement;\n // * if it's a start, then scroll to start of the group\n if(bubble && position !== 'end') {\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(item && item.group.firstItem === item && whichChild(item.group.container) === (this.stickyIntersector ? STICKY_OFFSET : 1)) {\n const dateGroup = item.group.container.parentElement;\n // if(whichChild(dateGroup) === 0) {\n fallbackToElementStartWhenCentering = dateGroup;\n // position = 'start';\n // element = dateGroup;\n // }\n }\n }\n\n // const isLastBubble = this.getLastBubble() === bubble;\n /* if(isLastBubble) {\n element = this.getLastDateGroup();\n } */\n\n const margin = 4; // * 4 = .25rem\n /* if(isLastBubble && this.chat.type === 'chat' && this.bubblesContainer.classList.contains('is-chat-input-hidden')) {\n margin = 20;\n } */\n\n const isChangingHeight = (this.chat.input.messageInput && this.chat.input.messageInput.classList.contains('is-changing-height')) || this.chat.container.classList.contains('is-toggling-helper');\n const promise = this.scrollable.scrollIntoViewNew({\n element,\n position,\n margin,\n forceDirection,\n forceDuration,\n axis: 'y',\n getNormalSize: isChangingHeight ? ({rect}) => {\n // return rect.height;\n\n let height = windowSize.height;\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\n height -= this.container.offsetTop;\n height -= mediaSizes.isMobile || windowSize.height < 570 ? 58 : 78;\n return height;\n\n /* const rowsWrapperHeight = this.chat.input.rowsWrapper.getBoundingClientRect().height;\n const diff = rowsWrapperHeight - 54;\n return rect.height + diff; */\n } : undefined,\n fallbackToElementStartWhenCentering,\n startCallback: (dimensions) => {\n // this.onScroll(true, this.scrolledDown && dimensions.distanceToEnd <= SCROLLED_DOWN_THRESHOLD ? undefined : dimensions);\n this.onScroll(true, dimensions);\n\n if(this.updateGradient) {\n const {gradientRenderer} = this.chat;\n gradientRenderer?.toNextPosition(dimensions.getProgress);\n this.updateGradient = undefined;\n }\n }\n });\n\n // fix flickering date when opening unread chat and focusing message\n if(forceDirection === FocusDirection.Static) {\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\n }\n\n return promise;\n }\n\n public scrollToEnd() {\n return this.scrollToBubbleEnd(this.chatInner);\n }\n\n public async scrollToBubbleEnd(bubble: HTMLElement) {\n /* if(DEBUG) {\n this.log('scrollToNewLastBubble: will scroll into view:', bubble);\n } */\n\n if(bubble) {\n this.scrollingToBubble = bubble;\n const middleware = this.getMiddleware();\n await this.scrollToBubble(bubble, 'end', undefined, undefined);\n if(!middleware()) return;\n this.scrollingToBubble = undefined;\n }\n }\n\n // ! can't get it by chatInner.lastElementChild because placeholder can be the last...\n // private getLastDateGroup() {\n // let lastTime = 0, lastElem: HTMLElement;\n // for(const i in this.dateMessages) {\n // const dateMessage = this.dateMessages[i];\n // if(dateMessage.firstTimestamp > lastTime) {\n // lastElem = dateMessage.container;\n // lastTime = dateMessage.firstTimestamp;\n // }\n // }\n\n // return lastElem;\n // }\n\n public async scrollToBubbleIfLast(bubble: HTMLElement) {\n if(this.getLastBubble() === bubble) {\n // return this.scrollToBubbleEnd(bubble);\n return this.scrollToEnd();\n }\n }\n\n public highlightBubble(element: HTMLElement) {\n const datasetKey = 'highlightTimeout';\n if(element.dataset[datasetKey]) {\n clearTimeout(+element.dataset[datasetKey]);\n element.classList.remove('is-highlighted');\n void element.offsetWidth; // reflow\n }\n\n element.classList.add('is-highlighted');\n element.dataset[datasetKey] = '' + setTimeout(() => {\n element.classList.remove('is-highlighted');\n delete element.dataset[datasetKey];\n }, 2000);\n }\n\n private createDateBubble(timestamp: number, date: Date = new Date(timestamp * 1000)) {\n let dateElement: HTMLElement;\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const isScheduled = this.chat.type === 'scheduled';\n\n if(today.getTime() === date.getTime()) {\n dateElement = i18n(isScheduled ? 'Chat.Date.ScheduledForToday' : 'Date.Today');\n } else if(isScheduled && timestamp === SEND_WHEN_ONLINE_TIMESTAMP) {\n dateElement = i18n('MessageScheduledUntilOnline');\n } else {\n const options: Intl.DateTimeFormatOptions = {\n day: 'numeric',\n month: 'long'\n };\n\n if(date.getFullYear() !== today.getFullYear()) {\n options.year = 'numeric';\n }\n\n dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n\n if(isScheduled) {\n dateElement = i18n('Chat.Date.ScheduledFor', [dateElement]);\n }\n }\n\n const bubble = document.createElement('div');\n bubble.className = 'bubble service is-date';\n const bubbleContent = document.createElement('div');\n bubbleContent.classList.add('bubble-content');\n const serviceMsg = document.createElement('div');\n serviceMsg.classList.add('service-msg');\n\n serviceMsg.append(dateElement);\n\n bubbleContent.append(serviceMsg);\n bubble.append(bubbleContent);\n\n return bubble;\n }\n\n public getDateForDateContainer(timestamp: number) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n return {date, dateTimestamp: date.getTime()};\n }\n\n public getDateContainerByTimestamp(timestamp: number) {\n const {date, dateTimestamp} = this.getDateForDateContainer(timestamp);\n let ret = this.dateMessages[dateTimestamp];\n if(ret) {\n return ret;\n }\n\n const bubble = this.createDateBubble(timestamp, date);\n // bubble.classList.add('is-sticky');\n const fakeBubble = this.createDateBubble(timestamp, date);\n fakeBubble.classList.add('is-fake');\n\n const container = document.createElement('section');\n container.className = 'bubbles-date-group';\n container.append(bubble, fakeBubble);\n\n ret = this.dateMessages[dateTimestamp] = {\n div: bubble,\n container,\n firstTimestamp: date.getTime()\n };\n\n const haveTimestamps = getObjectKeysAndSort(this.dateMessages, 'asc');\n const length = haveTimestamps.length;\n let i = 0, insertBefore: HTMLElement; // there can be 'first bubble' (e.g. bot description) so can't insert by index\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n insertBefore = this.dateMessages[t].container;\n if(dateTimestamp < t) {\n break;\n }\n }\n\n if(i === length && insertBefore) {\n insertBefore = insertBefore.nextElementSibling as HTMLElement;\n }\n\n if(!insertBefore) {\n this.chatInner.append(container);\n } else {\n this.chatInner.insertBefore(container, insertBefore);\n }\n\n this.stickyIntersector?.observeStickyHeaderChanges(container);\n\n if(this.chatInner.parentElement) {\n this.container.classList.add('has-groups');\n }\n\n return ret;\n }\n\n private destroyScrollable() {\n this.scrollable.destroy();\n }\n\n public destroy() {\n // this.chat.log.error('Bubbles destroying');\n\n this.destroyScrollable();\n\n this.listenerSetter.removeAll();\n\n this.lazyLoadQueue.clear();\n this.observer && this.observer.disconnect();\n this.stickyIntersector && this.stickyIntersector.disconnect();\n\n delete this.lazyLoadQueue;\n this.observer && delete this.observer;\n this.stickyIntersector && delete this.stickyIntersector;\n }\n\n public cleanup(bubblesToo = false) {\n this.log('cleanup');\n\n this.bubbles = {}; // clean it before so sponsored message won't be deleted faster on peer changing\n // //console.time('appImManager cleanup');\n this.setLoaded('top', false, false);\n this.setLoaded('bottom', false, false);\n\n // cancel scroll\n cancelAnimationByKey(this.scrollable.container);\n\n // do not wait ending of previous scale animation\n interruptHeavyAnimation();\n\n if(TEST_SCROLL !== undefined) {\n TEST_SCROLL = TEST_SCROLL_TIMES;\n }\n\n this.skippedMids.clear();\n this.dateMessages = {};\n this.bubbleGroups.cleanup();\n this.unreadOut.clear();\n this.needUpdate.length = 0;\n this.lazyLoadQueue.clear();\n this.renderNewPromises.clear();\n\n // clear messages\n if(bubblesToo) {\n this.scrollable.container.textContent = '';\n this.chatInner.textContent = '';\n this.cleanupPlaceholders();\n }\n\n this.firstUnreadBubble = null;\n this.attachedUnreadBubble = false;\n\n this.batchProcessor.clear();\n\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\n this.fetchNewPromise = undefined;\n this.getSponsoredMessagePromise = undefined;\n this.updateGradient = undefined;\n\n if(this.stickyIntersector) {\n this.stickyIntersector.disconnect();\n }\n\n if(this.observer) {\n this.observer.disconnect();\n\n this.unreaded.clear();\n this.unreadedSeen.clear();\n this.readPromise = undefined;\n\n this.viewsMids.clear();\n }\n\n this.middlewareHelper.clean();\n\n this.onAnimateLadder = undefined;\n this.resolveLadderAnimation = undefined;\n this.attachPlaceholderOnRender = undefined;\n this.emptyPlaceholderBubble = undefined;\n this.sponsoredMessage = undefined;\n this.previousStickyDate = undefined;\n\n this.scrollingToBubble = undefined;\n // //console.timeEnd('appImManager cleanup');\n\n this.isTopPaddingSet = false;\n\n this.renderingMessages.clear();\n this.bubblesToEject.clear();\n this.bubblesToReplace.clear();\n\n // this.reactions.clear();\n\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n this.isScrollingTimeout = 0;\n }\n\n this.container.classList.remove('has-sticky-dates');\n this.scrollable.cancelMeasure();\n }\n\n private cleanupPlaceholders(bubble = this.emptyPlaceholderBubble) {\n if(bubble) {\n this.destroyBubble(bubble);\n }\n }\n\n public async setPeer(options: ChatSetPeerOptions & {samePeer: boolean}): Promise<{cached?: boolean, promise: Chat['setPeerPromise']}> {\n const {samePeer, peerId, stack} = options;\n let {lastMsgId, startParam} = options;\n const tempId = ++this.setPeerTempId;\n\n if(!peerId) {\n this.cleanup(true);\n this.preloader.detach();\n return null;\n }\n\n const perf = performance.now();\n const log = this.log.bindPrefix('setPeer');\n log.warn('start');\n\n const middleware = () => {\n return this.setPeerTempId === tempId;\n };\n\n const m = middlewarePromise(middleware, PEER_CHANGED_ERROR);\n\n if(!samePeer) {\n await m(this.chat.onChangePeer(options, m));\n }\n\n /* if(samePeer && this.chat.setPeerPromise) {\n return {cached: true, promise: this.chat.setPeerPromise};\n } */\n\n const chatType = this.chat.type;\n\n if(chatType === 'scheduled' || this.chat.isRestricted) {\n lastMsgId = 0;\n }\n\n const historyStorage = await m(this.chat.getHistoryStorage());\n const topMessage = chatType === 'pinned' ? await m(this.managers.appMessagesManager.getPinnedMessagesMaxId(peerId, this.chat.threadId)) : historyStorage.maxId ?? 0;\n const isTarget = lastMsgId !== undefined;\n\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\n topMessage = 0;\n } */\n\n let followingUnread: boolean;\n let readMaxId = 0, savedPosition: ReturnType, overrideAdditionMsgId: number;\n if(!isTarget) {\n if(!samePeer) {\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\n }\n\n if(savedPosition) {\n\n } else if(topMessage) {\n readMaxId = await m(this.managers.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId));\n const dialog = await m(this.chat.getDialogOrTopic());\n if(/* dialog.unread_count */readMaxId && !samePeer && (!dialog || dialog.unread_count !== 1)) {\n const foundSlice = historyStorage.history.findSliceOffset(readMaxId);\n if(foundSlice && foundSlice.slice.isEnd(SliceEnd.Bottom)) {\n overrideAdditionMsgId = foundSlice.slice[foundSlice.offset - 25] || foundSlice.slice[0] || readMaxId;\n }\n\n followingUnread = !isTarget;\n lastMsgId = readMaxId;\n } else {\n lastMsgId = topMessage;\n // lastMsgID = topMessage;\n }\n }\n }\n\n const isJump = lastMsgId !== topMessage/* && overrideAdditionMsgId === undefined */;\n\n if(startParam === undefined && await m(this.chat.isStartButtonNeeded())) {\n startParam = BOT_START_PARAM;\n }\n\n if(samePeer) {\n if(stack && lastMsgId) {\n this.followStack.push(stack);\n }\n\n const mounted = await m(this.getMountedBubble(lastMsgId));\n if(mounted) {\n if(isTarget) {\n this.scrollToBubble(mounted.bubble, 'center');\n this.highlightBubble(mounted.bubble);\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\n } else if(topMessage && !isJump) {\n // log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\n // scrollable.setScrollTopSilently(scrollable.scrollHeight);\n this.scrollToEnd();\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\n }\n\n if(startParam !== undefined) {\n this.chat.input.setStartParam(startParam);\n }\n\n return null;\n }\n } else {\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\n this.lazyLoadQueue.queueId = ++queueId;\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }\n\n this.followStack.length = 0;\n\n this.passEntities = {\n messageEntityBotCommand: await m(this.managers.appPeersManager.isAnyGroup(peerId)) || this.chat.isBot\n };\n }\n\n if(DEBUG) {\n log('setPeer peerId:', peerId, historyStorage, lastMsgId, topMessage);\n }\n\n // add last message, bc in getHistory will load < max_id\n const additionMsgId = overrideAdditionMsgId ?? (isJump || chatType === 'scheduled' || this.chat.isRestricted ? 0 : topMessage);\n\n let maxBubbleId = 0;\n if(samePeer) {\n const el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\n // this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\n if(el) {\n maxBubbleId = +el.dataset.mid;\n }\n\n if(maxBubbleId <= 0) {\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map((mid) => +mid));\n }\n } else {\n this.isFirstLoad = true;\n this.destroyResizeObserver();\n }\n\n const oldChatInner = this.chatInner;\n const oldPlaceholderBubble = this.emptyPlaceholderBubble;\n this.cleanup();\n const chatInner = this.chatInner = document.createElement('div');\n if(samePeer) {\n chatInner.className = oldChatInner.className;\n chatInner.classList.remove('disable-hover', 'is-scrolling');\n } else {\n chatInner.classList.add('bubbles-inner');\n }\n\n this.lazyLoadQueue.lock();\n\n // const haveToScrollToBubble = (topMessage && (isJump || samePeer)) || isTarget;\n const haveToScrollToBubble = samePeer || (topMessage && isJump) || isTarget;\n const fromUp = maxBubbleId > 0 && (!lastMsgId || maxBubbleId < lastMsgId || lastMsgId < 0);\n const scrollFromDown = !fromUp && samePeer;\n const scrollFromUp = !scrollFromDown && fromUp/* && (samePeer || forwardingUnread) */;\n this.willScrollOnLoad = scrollFromDown || scrollFromUp;\n\n this.setPeerOptions = {\n lastMsgId,\n topMessage,\n savedPosition\n };\n\n let result: Awaited>;\n if(!savedPosition) {\n result = await m(this.getHistory1(lastMsgId, true, isJump, additionMsgId));\n } else {\n result = {\n promise: getHeavyAnimationPromise().then(() => {\n return this.performHistoryResult({history: savedPosition.mids}, true);\n }) as any,\n cached: true,\n waitPromise: Promise.resolve()\n };\n }\n\n this.setPeerCached = result.cached;\n\n log.warn('got history');// warning\n\n const {promise, cached} = result;\n\n if(!cached && !samePeer) {\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam));\n this.scrollable.container.textContent = '';\n // oldContainer.textContent = '';\n // oldChatInner.remove();\n this.preloader.attach(this.container);\n }\n\n /* this.ladderDeferred && this.ladderDeferred.resolve();\n this.ladderDeferred = deferredPromise(); */\n\n animationIntersector.lockGroup(this.chat.animationGroup);\n const setPeerPromise = m(promise).then(async() => {\n log.warn('promise fulfilled');\n\n const mountedByLastMsgId = haveToScrollToBubble ? await m(lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()}) : undefined;\n if(cached && !samePeer) {\n log.warn('finishing peer change');\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam)); // * костыль\n log.warn('finished peer change');\n }\n\n this.preloader.detach();\n\n if(this.resolveLadderAnimation) {\n this.resolveLadderAnimation();\n this.resolveLadderAnimation = undefined;\n }\n\n this.setPeerCached = undefined;\n\n // this.ladderDeferred.resolve();\n\n const scrollable = this.scrollable;\n scrollable.lastScrollDirection = 0;\n scrollable.lastScrollPosition = 0;\n replaceContent(scrollable.container, chatInner);\n // this.chat.topbar.container.nextElementSibling.replaceWith(container);\n\n if(oldPlaceholderBubble) {\n this.cleanupPlaceholders(oldPlaceholderBubble);\n }\n\n if(this.attachPlaceholderOnRender) {\n this.attachPlaceholderOnRender();\n }\n\n if(!isTarget && this.chat.isPinnedMessagesNeeded()) {\n this.chat.topbar.pinnedMessage?.setCorrectIndex(0);\n }\n\n this.container.classList.toggle('has-groups', !!Object.keys(this.dateMessages).length);\n\n log.warn('mounted chat', this.chatInner === chatInner, this.chatInner.parentElement, performance.now() - perf);\n\n animationIntersector.unlockGroup(this.chat.animationGroup);\n animationIntersector.checkAnimations(false, this.chat.animationGroup/* , true */);\n\n // fastRaf(() => {\n this.lazyLoadQueue.unlock();\n // });\n\n // if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\n if(savedPosition) {\n scrollable.setScrollTopSilently(savedPosition.top);\n /* const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\n let bubble: HTMLElement = mountedByLastMsgId?.bubble;\n if(!bubble?.parentElement) {\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\n }\n\n if(bubble) {\n const top = bubble.getBoundingClientRect().top;\n const distance = savedPosition.top - top;\n scrollable.scrollTop += distance;\n } */\n } else if(haveToScrollToBubble) {\n let unsetPadding: () => void;\n if(scrollFromDown) {\n scrollable.setScrollTopSilently(99999);\n } else if(scrollFromUp) {\n const set = this.setTopPadding();\n if(set.isPaddingNeeded) {\n unsetPadding = set.unsetPadding;\n }\n\n scrollable.setScrollTopSilently(0);\n }\n\n // const mountedByLastMsgId = lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()};\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\n if(!bubble?.parentElement) {\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId, false) || this.findNextMountedBubbleByMsgId(lastMsgId, true);\n }\n\n let promise: Promise;\n // ! sometimes there can be no bubble\n if(bubble) {\n const lastBubble = this.getLastBubble();\n const position: ScrollLogicalPosition = followingUnread ? 'start' : (!isJump && !isTarget && lastBubble === bubble ? 'end' : 'center');\n\n if(position === 'end' && lastBubble === bubble && samePeer) {\n promise = this.scrollToEnd();\n } else {\n promise = this.scrollToBubble(bubble, position, !samePeer ? FocusDirection.Static : undefined);\n }\n\n if(!followingUnread && isTarget) {\n this.highlightBubble(bubble);\n }\n }\n\n if(unsetPadding) {\n (promise || Promise.resolve()).then(() => {\n unsetPadding();\n });\n }\n } else {\n scrollable.setScrollTopSilently(99999);\n }\n\n // if(!cached) {\n this.onRenderScrollSet();\n // }\n\n this.onScroll();\n\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\n afterSetPromise.then(() => { // check whether list isn't full\n scrollable.checkForTriggers();\n\n // if(cached) {\n // this.onRenderScrollSet();\n // }\n });\n\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\n\n Promise.all([\n this.setFetchReactionsInterval(afterSetPromise),\n this.setFetchHistoryInterval({\n afterSetPromise,\n lastMsgId,\n samePeer,\n savedPosition,\n topMessage\n })\n ]).then(() => {\n log('scrolledAllDown:', scrollable.loadedAll.bottom);\n // if(!this.unreaded.length && dialog) { // lol\n if(scrollable.loadedAll.bottom && topMessage && !this.unreaded.size) { // lol\n this.onScrolledAllDown();\n }\n });\n\n if(chatType === 'chat' && !this.chat.isForumTopic) {\n const dialog = await m(this.managers.appMessagesManager.getDialogOnly(peerId));\n if(dialog?.pFlags.unread_mark) {\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\n }\n }\n\n // this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\n }).catch((err) => {\n log.error('setPeer promise error:', err);\n if(!middleware()) {\n this.preloader.detach();\n }\n\n throw err;\n });\n\n return {cached, promise: setPeerPromise};\n }\n\n private async setFetchReactionsInterval(afterSetPromise: Promise) {\n const middleware = this.getMiddleware();\n const needReactionsInterval = this.chat.isChannel;\n if(needReactionsInterval) {\n const fetchReactions = async() => {\n if(!middleware()) return;\n\n const mids: number[] = [];\n for(const mid in this.bubbles) {\n let message = await this.chat.getMessage(+mid);\n if(message?._ !== 'message') {\n continue;\n }\n\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\n mids.push(message.mid);\n }\n\n const promise = mids.length ? this.managers.appReactionsManager.getMessagesReactions(this.peerId, mids) : Promise.resolve();\n promise.then(() => {\n setTimeout(fetchReactions, 10e3);\n });\n };\n\n Promise.all([afterSetPromise, getHeavyAnimationPromise(), pause(500)]).then(() => {\n fetchReactions();\n });\n }\n }\n\n private async setFetchHistoryInterval({\n lastMsgId,\n topMessage,\n afterSetPromise,\n savedPosition,\n samePeer\n }: {\n lastMsgId: number,\n topMessage: number,\n afterSetPromise: Promise,\n savedPosition: ChatSavedPosition,\n samePeer: boolean\n }) {\n const middleware = this.getMiddleware();\n const peerId = this.peerId;\n\n const needFetchInterval = await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId);\n const needFetchNew = savedPosition || needFetchInterval;\n if(!needFetchNew) {\n return;\n }\n\n await afterSetPromise;\n if(!middleware()) {\n return;\n }\n\n const chatId = peerId.toChatId();\n middleware.onClean(() => {\n this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(chatId);\n });\n\n this.managers.apiUpdatesManager.subscribeToChannelUpdates(chatId);\n return;\n\n this.setLoaded('bottom', false);\n this.scrollable.checkForTriggers();\n\n if(!needFetchInterval) {\n return;\n }\n\n const f = () => {\n this.fetchNewPromise = new Promise(async(resolve) => {\n if(!middleware() || !(await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId))) {\n resolve();\n return;\n }\n\n this.managers.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((result) => {\n if(!middleware() || !result) {\n resolve();\n return;\n }\n\n const {isBottomEnd} = result;\n if(this.scrollable.loadedAll.bottom && this.scrollable.loadedAll.bottom !== isBottomEnd) {\n this.setLoaded('bottom', isBottomEnd);\n this.onScroll();\n }\n\n setTimeout(f, 30e3);\n resolve();\n });\n }).finally(() => {\n this.fetchNewPromise = undefined;\n });\n };\n\n if(samePeer) {\n setTimeout(f, 30e3);\n } else {\n f();\n }\n }\n\n public async onScrolledAllDown() {\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n const historyMaxId = await this.chat.getHistoryMaxId();\n this.managers.appMessagesManager.readHistory(this.peerId, historyMaxId, this.chat.threadId, true);\n }\n }\n\n public async finishPeerChange() {\n const [isChannel, canWrite, isAnyGroup] = await Promise.all([\n this.chat.isChannel,\n this.chat.canSend(),\n this.chat.isAnyGroup\n ]);\n\n return () => {\n this.chatInner.classList.toggle('has-rights', canWrite);\n this.container.classList.toggle('is-chat-input-hidden', !canWrite);\n\n this.chatInner.classList.toggle('is-chat', isAnyGroup);\n this.chatInner.classList.toggle('is-channel', isChannel);\n\n this.createResizeObserver();\n };\n }\n\n private processBatch = async(...args: Parameters) => {\n let [loadQueue, m, log] = args;\n\n const filterQueue = (queue: typeof loadQueue) => {\n return queue.filter((details) => {\n // message can be deleted during rendering\n return details && this.bubbles[details.bubble.dataset.mid] === details.bubble;\n });\n };\n\n loadQueue = filterQueue(loadQueue);\n\n log('messages rendered');\n\n const reverse = loadQueue[0]?.reverse;\n\n const {groups, avatarPromises} = this.groupBubbles(loadQueue.filter((details) => details.updatePosition));\n\n // if(groups.length > 2 && loadQueue.length === 1) {\n // debugger;\n // }\n\n const promises = loadQueue.reduce((acc, details) => {\n const perf = performance.now();\n\n const promises = details.promises.slice();\n const timePromises = promises.map(async(promise) => (await promise, performance.now() - perf));\n Promise.all(timePromises).then((times) => {\n log.groupCollapsed('media message time', performance.now() - perf, details, times);\n times.forEach((time, idx) => {\n log('media message time', time, idx, promises[idx]);\n });\n log.groupEnd();\n });\n\n // if(details.updatePosition) {\n // if(res) {\n // groups.add(res.group);\n // if(details.needAvatar) {\n // details.promises.push(res.group.createAvatar(details.message));\n // }\n // }\n // }\n\n acc.push(...details.promises);\n return acc;\n }, [] as Promise[]);\n\n promises.push(...avatarPromises);\n // promises.push(pause(200));\n\n // * это нужно для того, чтобы если захочет подгрузить reply или какое-либо сообщение, то скролл не прервался\n // * если добавить этот промис - в таком случае нужно сделать, чтобы скроллило к последнему сообщению после рендера\n // promises.push(getHeavyAnimationPromise());\n\n log('media promises to call', promises, loadQueue, this.isHeavyAnimationInProgress);\n await m(Promise.all([...promises, this.setUnreadDelimiter()]).catch(noop)); // не нашёл места лучше\n await m(fastRafPromise()); // have to be the last\n log('media promises end');\n\n loadQueue = filterQueue(loadQueue);\n\n const {restoreScroll, scrollSaver} = this.prepareToSaveScroll(reverse);\n // if(this.messagesQueueOnRender) {\n // this.messagesQueueOnRender();\n // }\n\n this.messagesQueueOnRenderAdditional?.();\n\n this.ejectBubbles();\n for(const [bubble, oldBubble] of this.bubblesToReplace) {\n if(scrollSaver) {\n scrollSaver.replaceSaved(oldBubble, bubble);\n }\n\n if(!loadQueue.find((details) => details.bubble === bubble)) {\n continue;\n }\n\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(!item) {\n this.log.error('NO ITEM BY BUBBLE', bubble);\n } else {\n item.mounted = false;\n if(!groups.includes(item.group)) {\n groups.push(item.group);\n }\n }\n\n this.bubblesToReplace.delete(bubble);\n }\n\n if(this.chat.selection.isSelecting) {\n loadQueue.forEach(({bubble}) => {\n this.chat.selection.toggleElementCheckbox(bubble, true);\n });\n }\n\n loadQueue.forEach(({message, bubble, updatePosition}) => {\n if(message.pFlags.local && updatePosition) {\n this.chatInner[(message as Message.message).pFlags.sponsored ? 'append' : 'prepend'](bubble);\n return;\n }\n });\n\n this.bubbleGroups.mountUnmountGroups(groups);\n // this.bubbleGroups.findIncorrentPositions();\n\n this.updatePlaceholderPosition?.();\n\n restoreScroll?.();\n\n // this.setStickyDateManually();\n };\n\n public renderMessagesQueue(options: ReturnType) {\n return this.batchProcessor.addToQueue(options);\n }\n\n private ejectBubbles() {\n for(const bubble of this.bubblesToEject) {\n bubble.remove();\n // this.bubbleGroups.removeAndUnmountBubble(bubble);\n }\n\n this.bubblesToEject.clear();\n }\n\n public groupBubbles(items: Array<{\n // Awaited> &\n bubble: HTMLElement,\n message: Message.message | Message.messageService\n }/* & {\n unmountIfFound?: boolean\n } */>) {\n let modifiedGroups: typeof groups;\n\n if(this.chat.type === 'scheduled') {\n modifiedGroups = new Set();\n items.forEach(({bubble, message}) => {\n const item = this.bubbleGroups.getItemByBubble(bubble);\n const group = item?.group;\n if(group && item.message.date !== message.date) {\n this.bubbleGroups.removeItem(item);\n modifiedGroups.add(group);\n }\n });\n }\n\n items.forEach(({bubble, message}) => {\n this.bubbleGroups.prepareForGrouping(bubble, message);\n });\n\n const groups = this.bubbleGroups.groupUngrouped();\n\n const avatarPromises = Array.from(groups).map((group) => {\n if(group.avatar) return;\n const firstItem = group.firstItem;\n if(firstItem && this.chat.isAvatarNeeded(firstItem.message)) {\n return group.createAvatar(firstItem.message);\n }\n }).filter(Boolean);\n\n if(modifiedGroups) {\n for(const group of modifiedGroups) {\n groups.add(group);\n }\n }\n\n return {\n groups: [...groups],\n avatarPromises\n };\n }\n\n public getMiddleware(additionalCallback?: () => boolean) {\n return this.middlewareHelper.get(additionalCallback);\n }\n\n private async wrapMediaSpoiler({\n media,\n promise,\n middleware,\n attachmentDiv\n }: {\n media: Photo.photo | MyDocument,\n promise: Promise,\n middleware: Middleware,\n attachmentDiv: HTMLElement\n }) {\n await promise;\n if(!middleware()) {\n return;\n }\n\n const {width, height} = attachmentDiv.style;\n const container = await wrapMediaSpoiler({\n media,\n width: parseInt(width),\n height: parseInt(height),\n middleware,\n animationGroup: this.chat.animationGroup\n });\n\n if(!middleware()) {\n return;\n }\n\n attachmentDiv.append(container);\n }\n\n private async safeRenderMessage(\n message: Message.message | Message.messageService,\n reverse?: boolean,\n bubble?: HTMLElement,\n updatePosition = true,\n processResult?: (result: ReturnType, bubble: HTMLElement) => typeof result\n ) {\n if(!message || this.renderingMessages.has(message.mid) || (this.bubbles[message.mid] && !bubble)) {\n return;\n }\n\n const middlewareHelper = this.getMiddleware().create();\n const middleware = middlewareHelper.get();\n\n let result: Awaited> & {updatePosition: typeof updatePosition};\n try {\n this.renderingMessages.add(message.mid);\n\n // const groupedId = (message as Message.message).grouped_id;\n const newBubble = document.createElement('div');\n newBubble.middlewareHelper = middlewareHelper;\n newBubble.dataset.mid = '' + message.mid;\n newBubble.dataset.peerId = '' + message.peerId;\n newBubble.dataset.timestamp = '' + message.date;\n\n // const bubbleNew: Bubble = this.bubblesNew[message.mid] ??= {\n // bubble: newBubble,\n // mids: new Set(),\n // groupedId\n // };\n\n // bubbleNew.mids.add(message.mid);\n\n if(bubble) {\n bubble.middlewareHelper.destroy();\n this.skippedMids.delete(message.mid);\n\n this.bubblesToEject.add(bubble);\n this.bubblesToReplace.delete(bubble);\n this.bubblesToReplace.set(newBubble, bubble);\n this.bubbleGroups.changeBubbleByBubble(bubble, newBubble);\n }\n\n bubble = this.bubbles[message.mid] = newBubble;\n let originalPromise = this.renderMessage(message, reverse, bubble, middleware);\n if(processResult) {\n originalPromise = processResult(originalPromise, bubble);\n }\n\n const promise = originalPromise.then((r) => ((r && middleware() ? {...r, updatePosition} : undefined) as typeof result));\n\n this.renderMessagesQueue(promise.catch(() => undefined));\n\n result = await promise;\n if(!middleware()) {\n return;\n }\n\n if(!result) {\n this.skippedMids.add(+message.mid);\n }\n } catch(err) {\n this.log.error('renderMessage error:', err);\n }\n\n if(!middleware()) {\n return;\n }\n\n this.renderingMessages.delete(message.mid);\n return result;\n }\n\n // reverse means top\n private async renderMessage(\n message: Message.message | Message.messageService,\n reverse = false,\n bubble: HTMLElement,\n middleware: Middleware\n ) {\n // if(DEBUG) {\n // this.log('message to render:', message);\n // }\n\n // if(!bubble && this.bubbles[message.mid]) {\n // return;\n // }\n\n // await pause(1000);\n\n const isMessage = message._ === 'message';\n const groupedId = isMessage && message.grouped_id;\n let albumMids: number[], reactionsMessage: Message.message;\n const albumMessages = groupedId ? await this.managers.appMessagesManager.getMessagesByAlbum(groupedId) : undefined;\n\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\n\n if(groupedId && albumMustBeRenderedFull) { // will render only last album's message\n albumMids = albumMessages.map((message) => message.mid);\n const mainMid = getMainMidForGrouped(albumMids);\n if(message.mid !== mainMid) {\n return;\n }\n }\n\n if(isMessage) {\n reactionsMessage = groupedId ? albumMessages[0] : message;\n }\n\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\n const our = this.chat.isOurMessage(message);\n\n const messageDiv = document.createElement('div');\n messageDiv.classList.add('message', 'spoilers-container');\n\n const contentWrapper = document.createElement('div');\n contentWrapper.classList.add('bubble-content-wrapper');\n\n const bubbleContainer = document.createElement('div');\n bubbleContainer.classList.add('bubble-content');\n\n bubble.classList.add('bubble');\n contentWrapper.append(bubbleContainer);\n bubble.append(contentWrapper);\n\n let isInUnread = !our &&\n !message.pFlags.out &&\n (\n message.pFlags.unread ||\n isMentionUnread(message)\n );\n\n if(!isInUnread && this.chat.peerId.isAnyChat()) {\n const readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.chat.peerId, this.chat.threadId);\n if(readMaxId !== undefined && readMaxId < message.mid) {\n isInUnread = true;\n }\n }\n\n if(isInUnread && this.observer) {\n // this.log('not our message', message, message.pFlags.unread);\n this.observer.observe(bubble, this.unreadedObserverCallback);\n this.unreaded.set(bubble, message.mid);\n }\n\n const loadPromises: Promise[] = [];\n const ret = {\n bubble,\n promises: loadPromises,\n message,\n reverse\n };\n\n const wrapOptions: WrapSomethingOptions = {\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n customEmojiSize: this.chat.appImManager.customEmojiSize,\n animationGroup: this.chat.animationGroup\n };\n\n if(message._ === 'messageService' && (!message.action || !SERVICE_AS_REGULAR.has(message.action._))) {\n const action = message.action;\n if(action) {\n const _ = action._;\n\n const ignoreAction = IGNORE_ACTIONS.get(_);\n if(ignoreAction && (ignoreAction === true || ignoreAction(message))) {\n return;\n }\n\n if(langPack.hasOwnProperty(_) && !langPack[_]) {\n return;\n }\n }\n\n bubble.className = 'bubble service';\n\n bubbleContainer.innerHTML = '';\n const s = document.createElement('div');\n s.classList.add('service-msg');\n if(action) {\n let promise: Promise;\n if(action._ === 'messageActionChannelMigrateFrom') {\n const peerTitle = new PeerTitle();\n promise = peerTitle.update({peerId: action.chat_id.toPeerId(true), wrapOptions});\n s.append(i18n('ChatMigration.From', [peerTitle.element]));\n } else if(action._ === 'messageActionChatMigrateTo') {\n const peerTitle = new PeerTitle();\n promise = peerTitle.update({peerId: action.channel_id.toPeerId(true), wrapOptions});\n s.append(i18n('ChatMigration.To', [peerTitle.element]));\n } else {\n s.append(await wrapMessageActionTextNew({\n message,\n ...wrapOptions\n }));\n }\n }\n bubbleContainer.append(s);\n\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\n bubble.classList.add('is-group-last');\n }\n\n return ret;\n }\n\n let messageMedia: MessageMedia = isMessage && message.media;\n let needToSetHTML = true;\n let messageMessage: string, totalEntities: MessageEntity[];\n if(isMessage) {\n if(groupedId && albumMustBeRenderedFull) {\n const t = getAlbumText(albumMessages);\n messageMessage = t?.message || '';\n // totalEntities = t.entities;\n totalEntities = t?.totalEntities || [];\n } else {\n messageMessage = message.message;\n // totalEntities = message.entities;\n totalEntities = message.totalEntities;\n }\n\n const document = (messageMedia as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n if(document?.type === 'sticker') {\n messageMessage = totalEntities = undefined;\n } else if(!['video', 'gif'].includes(document.type)) {\n needToSetHTML = false;\n }\n }\n } else {\n if(message.action._ === 'messageActionPhoneCall') {\n messageMedia = {\n _: 'messageMediaCall',\n action: message.action\n };\n }\n }\n\n let bigEmojis = 0, customEmojiSize: MediaSize;\n if(totalEntities && !messageMedia) {\n const emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji'/* || e._ === 'messageEntityCustomEmoji' */);\n const strLength = messageMessage.replace(/\\s/g, '').length;\n const emojiStrLength = emojiEntities.reduce((acc, curr) => acc + curr.length, 0);\n\n if(emojiStrLength === strLength /* && emojiEntities.length <= 3 *//* && totalEntities.length === emojiEntities.length */) {\n bigEmojis = Math.min(BIG_EMOJI_SIZES_LENGTH, emojiEntities.length);\n\n customEmojiSize = mediaSizes.active.customEmoji;\n\n const size = BIG_EMOJI_SIZES[bigEmojis];\n if(size) {\n customEmojiSize = makeMediaSize(size, size);\n bubble.style.setProperty('--emoji-size', size + 'px');\n }\n }\n }\n\n customEmojiSize ??= this.chat.appImManager.customEmojiSize;\n\n const richText = wrapRichText(messageMessage, {\n entities: totalEntities,\n passEntities: this.passEntities,\n loadPromises,\n lazyLoadQueue: this.lazyLoadQueue,\n customEmojiSize,\n middleware,\n animationGroup: this.chat.animationGroup\n });\n\n let canHaveTail = true;\n let isStandaloneMedia = false;\n let attachmentDiv: HTMLElement;\n if(bigEmojis) {\n if(rootScope.settings.emoji.big) {\n const sticker = bigEmojis === 1 &&\n !totalEntities.find((entity) => entity._ === 'messageEntityCustomEmoji') &&\n await this.managers.appStickersManager.getAnimatedEmojiSticker(messageMessage);\n if(bigEmojis === 1 && !messageMedia && sticker) {\n messageMedia = {\n _: 'messageMediaDocument',\n document: sticker\n };\n } else {\n attachmentDiv = document.createElement('div');\n attachmentDiv.classList.add('attachment', 'spoilers-container');\n\n setInnerHTML(attachmentDiv, richText);\n\n bubbleContainer.append(attachmentDiv);\n }\n\n bubble.classList.add('is-message-empty', 'emoji-big');\n isStandaloneMedia = true;\n canHaveTail = false;\n needToSetHTML = false;\n }\n\n bubble.classList.add('can-have-big-emoji');\n }\n\n if(needToSetHTML) {\n setInnerHTML(messageDiv, richText);\n }\n\n const haveRTLChar = isRTL(messageMessage, true);\n\n const timeSpan = MessageRender.setTime({\n chatType: this.chat.type,\n message,\n reactionsMessage\n });\n messageDiv.append(timeSpan);\n bubbleContainer.prepend(messageDiv);\n // bubble.prepend(timeSpan, messageDiv); // that's bad\n\n if(haveRTLChar) {\n timeSpan.classList.add('is-block');\n }\n\n let topicNameButtonContainer: HTMLElement;\n if(isMessage && this.chat.isAllMessagesForum) {\n const result = await wrapTopicNameButton({\n peerId: this.peerId,\n threadId: getMessageThreadId(message, this.chat.isForum),\n lastMsgId: message.mid,\n wrapOptions: {\n middleware\n },\n withIcons: true\n });\n\n const {element} = result;\n // if(isStandaloneMedia) {\n // element.classList.add('floating-part');\n // }\n\n topicNameButtonContainer = document.createElement('div');\n topicNameButtonContainer.classList.add(/* 'name', */'topic-name-button-container');\n topicNameButtonContainer.append(element);\n }\n\n if(isMessage && message.views) {\n bubble.classList.add('channel-post');\n\n if(!message.fwd_from?.saved_from_msg_id && this.chat.type !== 'pinned') {\n const forward = document.createElement('div');\n forward.classList.add('bubble-beside-button', 'forward', 'tgico-forward_filled');\n bubbleContainer.prepend(forward);\n bubble.classList.add('with-beside-button');\n }\n\n if(!message.pFlags.is_outgoing && this.observer) {\n this.observer.observe(bubble, this.viewsObserverCallback);\n }\n }\n\n const replyMarkup = isMessage && message.reply_markup;\n let replyMarkupRows = replyMarkup?._ === 'replyInlineMarkup' && replyMarkup.rows;\n if(replyMarkupRows) {\n replyMarkupRows = replyMarkupRows.filter((row) => row.buttons.length);\n }\n\n if(replyMarkupRows) {\n const containerDiv = document.createElement('div');\n containerDiv.classList.add('reply-markup');\n replyMarkupRows.forEach((row) => {\n const buttons = row.buttons;\n\n const rowDiv = document.createElement('div');\n rowDiv.classList.add('reply-markup-row');\n\n buttons.forEach((button) => {\n let text: DocumentFragment | HTMLElement | string = wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\n\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\n\n switch(button._) {\n case 'keyboardButtonUrl': {\n const r = wrapRichText(' ', {\n entities: [{\n _: 'messageEntityTextUrl',\n length: 1,\n offset: 0,\n url: button.url\n }]\n });\n\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\n buttonEl.classList.add('is-link');\n\n break;\n }\n\n case 'keyboardButtonSwitchInline': {\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-switch-inline');\n attachClickEvent(buttonEl, (e) => {\n cancelEvent(e);\n\n const botId = message.viaBotId || message.fromId;\n let promise: Promise;\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\n else promise = this.managers.appInlineBotsManager.checkSwitchReturn(botId).then((peerId) => {\n if(peerId) {\n return peerId;\n }\n\n return new Promise((resolve, reject) => {\n const popup = new PopupForward(undefined, (peerId) => {\n resolve(peerId);\n });\n\n popup.addEventListener('close', () => {\n reject();\n });\n });\n });\n\n promise.then((peerId) => {\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\n this.chat.appImManager.setInnerPeer({peerId});\n this.managers.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\n });\n });\n break;\n }\n\n case 'keyboardButtonBuy': {\n const mediaInvoice = messageMedia._ === 'messageMediaInvoice' ? messageMedia : undefined;\n if(mediaInvoice?.extended_media) {\n break;\n }\n\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-buy');\n\n if(mediaInvoice?.receipt_msg_id) {\n text = i18n('Message.ReplyActionButtonShowReceipt');\n }\n\n break;\n }\n\n case 'keyboardButtonUrlAuth': {\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-url-auth');\n\n const {peerId} = this;\n const {mid} = message;\n const {url, button_id} = button;\n\n attachClickEvent(buttonEl, () => {\n const toggle = toggleDisability([buttonEl], true);\n this.chat.appImManager.handleUrlAuth({\n peerId,\n mid,\n url,\n buttonId: button_id\n }).then(() => {\n toggle();\n });\n });\n break;\n }\n\n default: {\n buttonEl = document.createElement('button');\n break;\n }\n }\n\n if(!buttonEl) {\n return;\n }\n\n buttonEl.classList.add('reply-markup-button', 'rp', 'tgico');\n const t = document.createElement('span');\n t.classList.add('reply-markup-button-text');\n if(typeof(text) === 'string') {\n t.insertAdjacentHTML('beforeend', text);\n } else {\n t.append(text);\n }\n\n ripple(buttonEl);\n buttonEl.append(t);\n\n rowDiv.append(buttonEl);\n });\n\n if(!rowDiv.childElementCount) {\n return;\n }\n\n containerDiv.append(rowDiv);\n });\n\n const haveButtons = !!containerDiv.childElementCount;\n\n haveButtons && attachClickEvent(containerDiv, (e) => {\n let target = e.target as HTMLElement;\n\n if(!target.classList.contains('reply-markup-button')) target = findUpClassName(target, 'reply-markup-button');\n if(\n !target ||\n target.classList.contains('is-link') ||\n target.classList.contains('is-switch-inline') ||\n target.classList.contains('is-buy') ||\n target.classList.contains('is-url-auth')\n ) return;\n\n cancelEvent(e);\n\n const column = whichChild(target);\n const row = replyMarkupRows[whichChild(target.parentElement)];\n\n if(!row.buttons || !row.buttons[column]) {\n this.log.warn('no such button', row, column, message);\n return;\n }\n\n const button = row.buttons[column];\n this.managers.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button).then((callbackAnswer) => {\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\n toast(wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\n }\n\n // console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\n });\n });\n\n if(haveButtons) {\n // canHaveTail = false;\n bubble.classList.add('with-reply-markup');\n contentWrapper.append(containerDiv);\n }\n }\n\n const isOutgoing = message.pFlags.is_outgoing/* && this.peerId !== rootScope.myId */;\n if(our) {\n if(message.pFlags.unread || isOutgoing) this.unreadOut.add(message.mid);\n let status = '';\n if(message.error) status = 'is-error';\n else if(isOutgoing) status = 'is-sending';\n else status = message.pFlags.unread || (message as Message.message).pFlags.is_scheduled ? 'is-sent' : 'is-read';\n bubble.classList.add(status);\n }\n\n if(isOutgoing && !message.error) {\n bubble.classList.add('is-outgoing');\n }\n\n const messageWithReplies = isMessage && await this.managers.appMessagesManager.getMessageWithCommentReplies(message);\n const withReplies = !!messageWithReplies && message.mid > 0;\n\n if(withReplies) {\n bubble.classList.add('with-replies');\n }\n\n const fwdFrom = isMessage && message.fwd_from;\n const fwdFromId = isMessage && message.fwdFromId;\n\n const isOut = this.chat.isOutMessage(message);\n let nameContainer: HTMLElement = bubbleContainer;\n\n const canHideNameIfMedia = !message.viaBotId && (message.fromId === rootScope.myId || !message.pFlags.out);\n\n const isMessageEmpty = !messageMessage/* && (!topicNameButtonContainer || isStandaloneMedia) */;\n\n let viewButton: HTMLAnchorElement;\n // media\n if(messageMedia/* && messageMedia._ === 'messageMediaPhoto' */) {\n attachmentDiv = document.createElement('div');\n attachmentDiv.classList.add('attachment');\n\n if(isMessageEmpty) {\n bubble.classList.add('is-message-empty');\n }\n\n let processingWebPage = false;\n\n /* if(isMessage) */switch(messageMedia._) {\n case 'messageMediaPhoto': {\n const photo = messageMedia.photo;\n // //////this.log('messageMediaPhoto', photo);\n\n if(isMessageEmpty) {\n canHaveTail = false;\n }\n\n if(canHideNameIfMedia) {\n bubble.classList.add('hide-name');\n }\n\n bubble.classList.add('photo');\n\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\n bubble.classList.add('is-album', 'is-grouped');\n wrapAlbum({\n messages: albumMessages,\n attachmentDiv,\n middleware: this.getMiddleware(),\n isOut: our,\n lazyLoadQueue: this.lazyLoadQueue,\n chat: this.chat,\n loadPromises,\n autoDownload: this.chat.autoDownload\n });\n\n break;\n }\n\n const withTail = !IS_ANDROID && canHaveTail && !withReplies && USE_MEDIA_TAILS;\n if(withTail) bubble.classList.add('with-media-tail');\n const p = wrapPhoto({\n photo: photo as Photo.photo,\n message,\n container: attachmentDiv,\n withTail,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n loadPromises,\n autoDownloadSize: this.chat.autoDownload.photo\n });\n\n if(messageMedia.pFlags.spoiler) {\n loadPromises.push(this.wrapMediaSpoiler({\n media: photo as Photo.photo,\n promise: p,\n middleware,\n attachmentDiv\n }));\n }\n\n break;\n }\n\n case 'messageMediaWebPage': {\n processingWebPage = true;\n\n const webPage: WebPage = messageMedia.webpage;\n // //////this.log('messageMediaWebPage', webpage);\n if(webPage._ !== 'webPage') {\n break;\n }\n\n const wrapped = wrapUrl(webPage.url);\n if(wrapped?.onclick === 'im') {\n const map: {[type: string]: LangPackKey} = {\n telegram_channel: 'Chat.Message.ViewChannel',\n telegram_megagroup: 'OpenGroup',\n telegram_bot: 'Chat.Message.ViewBot'\n };\n\n const langPackKey = map[webPage.type] || 'OpenMessage';\n viewButton = this.makeViewButton({text: langPackKey, asLink: true});\n viewButton.href = wrapped.url;\n viewButton.setAttribute('onclick', `${wrapped.onclick}(this)`);\n }\n\n bubble.classList.add('webpage');\n\n const box = document.createElement('div');\n box.classList.add('web');\n\n const quote = document.createElement('div');\n quote.classList.add('quote');\n\n let previewResizer: HTMLDivElement, preview: HTMLDivElement;\n const photo: Photo.photo = webPage.photo as any;\n if(photo || webPage.document) {\n previewResizer = document.createElement('div');\n previewResizer.classList.add('preview-resizer');\n preview = document.createElement('div');\n preview.classList.add('preview');\n previewResizer.append(preview);\n }\n\n const quoteTextDiv = document.createElement('div');\n quoteTextDiv.classList.add('quote-text');\n\n const doc = webPage.document as MyDocument;\n if(doc) {\n if(doc.type === 'gif' || doc.type === 'video' || doc.type === 'round') {\n // if(doc.size <= 20e6) {\n const mediaSize = doc.type === 'round' ? mediaSizes.active.round : mediaSizes.active.webpage;\n if(doc.type === 'round') {\n bubble.classList.add('round');\n preview.classList.add('is-round');\n } else {\n bubble.classList.add('video');\n }\n wrapVideo({\n doc,\n container: preview,\n message: message as Message.message,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n isOut,\n group: this.chat.animationGroup,\n loadPromises,\n autoDownload: this.chat.autoDownload,\n noInfo: message.mid < 0\n });\n // }\n } else {\n const docDiv = await wrapDocument({\n message: message as Message.message,\n autoDownloadSize: this.chat.autoDownload.file,\n lazyLoadQueue: this.lazyLoadQueue,\n loadPromises,\n sizeType: 'documentName',\n searchContext: {\n useSearch: false,\n peerId: this.peerId,\n inputFilter: {\n _: 'inputMessagesFilterEmpty'\n }\n },\n fontSize: rootScope.settings.messagesTextSize\n });\n preview.append(docDiv);\n preview.classList.add('preview-with-document');\n quoteTextDiv.classList.add('has-document');\n // messageDiv.classList.add((webpage.type || 'document') + '-message');\n // doc = null;\n }\n }\n\n if(previewResizer) {\n quoteTextDiv.append(previewResizer);\n }\n\n let t: HTMLElement;\n if(webPage.site_name) {\n const html = wrapRichText(webPage.url);\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\n a.classList.add('webpage-name');\n const strong = document.createElement('strong');\n setInnerHTML(strong, wrapEmojiText(webPage.site_name));\n a.textContent = '';\n a.append(strong);\n quoteTextDiv.append(a);\n t = a;\n }\n\n const title = wrapWebPageTitle(webPage);\n if(title.textContent) {\n const titleDiv = document.createElement('div');\n titleDiv.classList.add('title');\n const strong = document.createElement('strong');\n setInnerHTML(strong, title);\n titleDiv.append(strong);\n quoteTextDiv.append(titleDiv);\n t = titleDiv;\n }\n\n const description = wrapWebPageDescription(webPage);\n if(description.textContent) {\n const textDiv = document.createElement('div');\n textDiv.classList.add('text');\n setInnerHTML(textDiv, description);\n quoteTextDiv.append(textDiv);\n t = textDiv;\n }\n\n /* if(t) {\n t.append(timeSpan);\n } else {\n box.classList.add('no-text');\n } */\n\n quote.append(quoteTextDiv);\n\n if(photo && !doc) {\n bubble.classList.add('photo');\n\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\n let isSquare = false;\n if(size.w === size.h && t) {\n bubble.classList.add('is-square-photo');\n isSquare = true;\n setAttachmentSize(photo, preview, 48, 48, false);\n\n /* if(t) {\n t.append(timeSpan);\n } */\n } else if(size.h > size.w) {\n bubble.classList.add('is-vertical-photo');\n }\n\n wrapPhoto({\n photo,\n message,\n container: preview,\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width,\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n loadPromises,\n withoutPreloader: isSquare,\n autoDownloadSize: this.chat.autoDownload.photo\n });\n }\n\n box.append(quote);\n\n // bubble.prepend(box);\n // if(timeSpan.parentElement === messageDiv) {\n messageDiv.insertBefore(box, timeSpan);\n // } else {\n // messageDiv.append(box);\n // }\n\n // this.log('night running', bubble.scrollHeight);\n\n break;\n }\n\n case 'messageMediaDocument': {\n const doc = messageMedia.document as MyDocument;\n\n // this.log('messageMediaDocument', doc, bubble);\n\n if(doc.sticker/* && doc.size <= 1e6 */) {\n bubble.classList.add('sticker');\n canHaveTail = false;\n isStandaloneMedia = true;\n\n if(doc.animated) {\n bubble.classList.add('sticker-animated');\n }\n\n const sizes = mediaSizes.active;\n const isEmoji = bubble.classList.contains('emoji-big');\n const boxSize = isEmoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\n setAttachmentSize(doc, attachmentDiv, boxSize.width, boxSize.height);\n // let preloader = new ProgressivePreloader(attachmentDiv, false);\n bubbleContainer.style.minWidth = attachmentDiv.style.width;\n bubbleContainer.style.minHeight = attachmentDiv.style.height;\n // appPhotosManager.setAttachmentSize(doc, bubble);\n wrapSticker({\n doc,\n div: attachmentDiv,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n group: this.chat.animationGroup,\n // play: !!message.pending || !multipleRender,\n play: true,\n loop: true,\n emoji: isEmoji ? messageMessage : undefined,\n withThumb: true,\n loadPromises,\n isOut,\n noPremium: messageMedia?.pFlags?.nopremium\n });\n\n if((getStickerEffectThumb(doc) || isEmoji) && (isInUnread || isOutgoing)/* || true */) {\n this.observer.observe(bubble, this.stickerEffectObserverCallback);\n }\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\n // this.log('never get free 2', doc);\n\n const isRound = doc.type === 'round';\n if(isRound) {\n isStandaloneMedia = true;\n }\n\n if(isRound || isMessageEmpty) {\n canHaveTail = false;\n }\n\n if(canHideNameIfMedia) {\n bubble.classList.add('hide-name');\n }\n\n bubble.classList.add(isRound ? 'round' : 'video');\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\n bubble.classList.add('is-album', 'is-grouped');\n\n wrapAlbum({\n messages: albumMessages,\n attachmentDiv,\n middleware,\n isOut: our,\n lazyLoadQueue: this.lazyLoadQueue,\n chat: this.chat,\n loadPromises,\n autoDownload: this.chat.autoDownload\n });\n } else {\n const withTail = !IS_ANDROID && !IS_APPLE && !isRound && canHaveTail && !withReplies && USE_MEDIA_TAILS;\n if(withTail) bubble.classList.add('with-media-tail');\n const p = wrapVideo({\n doc,\n container: attachmentDiv,\n message: message as Message.message,\n boxWidth: mediaSizes.active.regular.width,\n boxHeight: mediaSizes.active.regular.height,\n withTail,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n group: this.chat.animationGroup,\n loadPromises,\n autoDownload: this.chat.autoDownload,\n searchContext: isRound ? {\n peerId: this.peerId,\n inputFilter: {_: 'inputMessagesFilterRoundVoice'},\n threadId: this.chat.threadId,\n useSearch: !(message as Message.message).pFlags.is_scheduled,\n isScheduled: (message as Message.message).pFlags.is_scheduled\n } : undefined,\n noInfo: message.mid < 0,\n noAutoplayAttribute: !!messageMedia.pFlags.spoiler\n });\n\n if(messageMedia.pFlags.spoiler) {\n loadPromises.push(this.wrapMediaSpoiler({\n media: doc,\n promise: p,\n middleware,\n attachmentDiv\n }));\n }\n }\n } else {\n const newNameContainer = await wrapGroupedDocuments({\n albumMustBeRenderedFull,\n message,\n bubble,\n messageDiv,\n chat: this.chat,\n loadPromises,\n autoDownloadSize: this.chat.autoDownload.file,\n lazyLoadQueue: this.lazyLoadQueue,\n searchContext: doc.type === 'voice' || doc.type === 'audio' ? {\n peerId: this.peerId,\n inputFilter: {_: doc.type === 'voice' ? 'inputMessagesFilterRoundVoice' : 'inputMessagesFilterMusic'},\n threadId: this.chat.threadId,\n useSearch: !(message as Message.message).pFlags.is_scheduled,\n isScheduled: (message as Message.message).pFlags.is_scheduled\n } : undefined,\n sizeType: 'documentName',\n fontSize: rootScope.settings.messagesTextSize,\n richTextFragment: richText\n });\n\n if(newNameContainer) {\n nameContainer = newNameContainer;\n }\n\n const lastContainer = messageDiv.lastElementChild.querySelector('.document-message, .document, .audio');\n // lastContainer && lastContainer.append(timeSpan.cloneNode(true));\n lastContainer && lastContainer.append(timeSpan);\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add((!(['photo', 'pdf'] as MyDocument['type'][]).includes(doc.type) ? doc.type || 'document' : 'document') + '-message');\n processingWebPage = true;\n }\n\n break;\n }\n\n case 'messageMediaCall': {\n const action = messageMedia.action;\n const div = document.createElement('div');\n div.classList.add('bubble-call', action.pFlags.video ? 'tgico-videocamera' : 'tgico-phone');\n\n const type: CallType = action.pFlags.video ? 'video' : 'voice';\n div.dataset.type = type;\n\n const title = document.createElement('div');\n title.classList.add('bubble-call-title');\n\n _i18n(title, isOut ?\n (action.pFlags.video ? 'CallMessageVideoOutgoing' : 'CallMessageOutgoing') :\n (action.pFlags.video ? 'CallMessageVideoIncoming' : 'CallMessageIncoming'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('bubble-call-subtitle');\n\n if(action.duration !== undefined) {\n subtitle.append(formatCallDuration(action.duration));\n } else {\n let langPackKey: LangPackKey;\n switch(action.reason._) {\n case 'phoneCallDiscardReasonBusy':\n langPackKey = 'Call.StatusBusy';\n break;\n case 'phoneCallDiscardReasonMissed':\n langPackKey = 'Chat.Service.Call.Missed';\n break;\n // case 'phoneCallDiscardReasonHangup':\n default:\n langPackKey = 'Chat.Service.Call.Cancelled';\n break;\n }\n\n subtitle.classList.add('is-reason');\n _i18n(subtitle, langPackKey);\n }\n\n subtitle.classList.add('tgico', 'arrow-' + (action.duration !== undefined ? 'green' : 'red'));\n\n div.append(title, subtitle);\n\n processingWebPage = true;\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add('call-message');\n messageDiv.append(div);\n\n break;\n }\n\n case 'messageMediaContact': {\n // this.log('wrapping contact', message);\n\n const contact = messageMedia;\n const contactDiv = document.createElement('div');\n contactDiv.classList.add('contact');\n contactDiv.dataset.peerId = '' + contact.user_id;\n\n processingWebPage = true;\n\n const contactDetails = document.createElement('div');\n contactDetails.className = 'contact-details';\n const contactNameDiv = document.createElement('div');\n contactNameDiv.className = 'contact-name';\n const fullName = [\n contact.first_name,\n contact.last_name\n ].filter(Boolean).join(' ');\n contactNameDiv.append(\n fullName.trim() ? wrapEmojiText(fullName) : i18n('AttachContact')\n );\n\n const contactNumberDiv = document.createElement('div');\n contactNumberDiv.className = 'contact-number';\n contactNumberDiv.textContent = contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number';\n\n contactDiv.append(contactDetails);\n contactDetails.append(contactNameDiv, contactNumberDiv);\n\n const avatarElem = new AvatarElement();\n avatarElem.updateWithOptions({\n lazyLoadQueue: this.lazyLoadQueue,\n peerId: contact.user_id.toPeerId(),\n peerTitle: fullName.trim() ? undefined : I18n.format('AttachContact', true)[0]\n });\n avatarElem.classList.add('contact-avatar', 'avatar-54');\n\n contactDiv.prepend(avatarElem);\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add('contact-message');\n messageDiv.append(contactDiv);\n\n break;\n }\n\n case 'messageMediaPoll': {\n bubble.classList.remove('is-message-empty');\n\n const pollElement = wrapPoll(message);\n messageDiv.prepend(pollElement);\n messageDiv.classList.add('poll-message');\n\n break;\n }\n\n case 'messageMediaInvoice': {\n const isTest = messageMedia.pFlags.test;\n const extendedMedia = messageMedia.extended_media;\n const isAlreadyPaid = extendedMedia?._ === 'messageExtendedMedia';\n const isNotPaid = extendedMedia?._ === 'messageExtendedMediaPreview';\n let innerMedia = isAlreadyPaid ?\n (extendedMedia.media as MessageMedia.messageMediaPhoto).photo as Photo.photo ||\n (extendedMedia.media as MessageMedia.messageMediaDocument).document as Document.document :\n messageMedia.photo;\n\n const wrappedPrice = paymentsWrapCurrencyAmount(messageMedia.total_amount, messageMedia.currency);\n let priceEl: HTMLElement;\n if(!extendedMedia) {\n priceEl = document.createElement(innerMedia ? 'span' : 'div');\n const f = document.createDocumentFragment();\n const l = i18n(messageMedia.receipt_msg_id ? 'PaymentReceipt' : (isTest ? 'PaymentTestInvoice' : 'PaymentInvoice'));\n l.classList.add('text-uppercase');\n const joiner = ' ' + NBSP;\n const p = document.createElement('span');\n p.classList.add('text-bold');\n p.textContent = wrappedPrice + joiner;\n f.append(p, l);\n if(isTest && messageMedia.receipt_msg_id) {\n const a = document.createElement('span');\n a.classList.add('text-uppercase', 'pre-wrap');\n a.append(joiner + '(Test)');\n f.append(a);\n }\n setInnerHTML(priceEl, f);\n } else if(isNotPaid) {\n priceEl = document.createElement('span');\n priceEl.classList.add('extended-media-buy', 'tgico-premium_lock');\n attachmentDiv.classList.add('is-buy');\n _i18n(priceEl, 'Checkout.PayPrice', [wrappedPrice]);\n\n if(extendedMedia.video_duration !== undefined) {\n const videoTime = document.createElement('span');\n videoTime.classList.add('video-time');\n videoTime.textContent = toHHMMSS(extendedMedia.video_duration, false);\n attachmentDiv.append(videoTime);\n }\n }\n\n if(isNotPaid) {\n (extendedMedia.thumb as PhotoSize.photoStrippedSize).w = extendedMedia.w;\n (extendedMedia.thumb as PhotoSize.photoStrippedSize).h = extendedMedia.h;\n innerMedia = {\n _: 'photo',\n access_hash: '',\n pFlags: {},\n date: 0,\n dc_id: 0,\n file_reference: [],\n id: 0,\n sizes: [extendedMedia.thumb]\n };\n }\n\n if(innerMedia) {\n const mediaSize = extendedMedia ? mediaSizes.active.extendedInvoice : mediaSizes.active.invoice;\n if(innerMedia._ === 'document') {\n wrapVideo({\n doc: innerMedia,\n container: attachmentDiv,\n withTail: false,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n loadPromises,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n group: this.chat.animationGroup,\n message: message as Message.message\n });\n bubble.classList.add('video');\n } else {\n wrapPhoto({\n photo: innerMedia,\n container: attachmentDiv,\n withTail: false,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n loadPromises,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n message: isAlreadyPaid ? message : undefined\n });\n bubble.classList.add('photo');\n }\n\n if(priceEl) {\n if(!extendedMedia) {\n priceEl.classList.add('video-time');\n }\n\n attachmentDiv.append(priceEl);\n }\n } else {\n attachmentDiv = undefined;\n }\n\n if(isNotPaid) {\n const {mid} = message;\n this.extendedMediaMessages.add(mid);\n middleware.onClean(() => {\n this.extendedMediaMessages.delete(mid);\n });\n this.setExtendedMediaMessagesPollInterval();\n\n const {width, height} = attachmentDiv.style;\n const dotRenderer = DotRenderer.create({\n width: parseInt(width),\n height: parseInt(height),\n middleware,\n animationGroup: this.chat.animationGroup\n });\n attachmentDiv.append(dotRenderer.canvas);\n }\n\n let titleDiv: HTMLElement;\n if(!extendedMedia) {\n titleDiv = document.createElement('div');\n titleDiv.classList.add('bubble-primary-color');\n setInnerHTML(titleDiv, wrapEmojiText(messageMedia.title));\n }\n\n const richText = isAlreadyPaid ? undefined : wrapEmojiText(messageMedia.description);\n messageDiv.prepend(...[titleDiv, !innerMedia && priceEl, richText].filter(Boolean));\n\n if(!richText) canHaveTail = false;\n else bubble.classList.remove('is-message-empty');\n bubble.classList.add('is-invoice');\n\n break;\n }\n\n default:\n attachmentDiv = undefined;\n bubble.classList.remove('is-message-empty');\n messageDiv.append(i18n(UNSUPPORTED_LANG_PACK_KEY), timeSpan);\n this.log.warn('unrecognized media type:', messageMedia._, message);\n break;\n }\n\n if(!processingWebPage && attachmentDiv) {\n bubbleContainer.append(attachmentDiv);\n }\n\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\n bubble.classList.add('no-tail');\n\n if(!bubble.classList.contains('with-media-tail')) {\n bubble.classList.add('use-border-radius');\n }\n } */\n }\n\n if(isStandaloneMedia) {\n bubble.classList.add('just-media');\n }\n\n if(viewButton) {\n timeSpan.before(viewButton);\n // messageDiv.append(viewButton);\n }\n\n let savedFrom = '';\n\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\n const needName = (message.fromId !== rootScope.myId && this.chat.isAnyGroup) || message.viaBotId || (message as Message.message).pFlags.sponsored;\n if(needName || fwdFrom || message.reply_to_mid || topicNameButtonContainer) { // chat\n let title: HTMLElement | DocumentFragment;\n let titleVia: typeof title;\n\n const isForwardFromChannel = message.from_id?._ === 'peerChannel' && message.fromId === fwdFromId;\n\n const mustHaveName = !!(message.viaBotId/* || topicNameButtonContainer */);\n const isHidden = fwdFrom && !fwdFrom.from_id;\n if(message.viaBotId) {\n titleVia = document.createElement('span');\n titleVia.innerText = '@' + (await this.managers.appPeersManager.getPeerUsername(message.viaBotId));\n titleVia.classList.add('peer-title');\n }\n\n if(mustHaveName) {\n bubble.classList.add('must-have-name');\n }\n\n const isForward = fwdFromId || fwdFrom;\n if(isHidden) {\n // /////this.log('message to render hidden', message);\n title = document.createElement('span');\n setInnerHTML(title, wrapEmojiText(fwdFrom.from_name));\n title.classList.add('peer-title');\n // title = fwdFrom.from_name;\n bubble.classList.add('hidden-profile');\n } else {\n title = new PeerTitle({peerId: fwdFromId || message.fromId, withPremiumIcon: !isForward, wrapOptions}).element;\n }\n\n let replyContainer: HTMLElement;\n if(\n isMessage &&\n message.reply_to_mid &&\n message.reply_to_mid !== this.chat.threadId &&\n (!this.chat.isAllMessagesForum || message.reply_to.reply_to_top_id)\n ) {\n replyContainer = await MessageRender.setReply({\n chat: this.chat,\n bubble,\n bubbleContainer,\n message\n });\n }\n\n // this.log(title);\n\n let nameDiv: HTMLElement;\n if(isForward) {\n if(this.peerId !== rootScope.myId && !isForwardFromChannel) {\n bubble.classList.add('forwarded');\n }\n\n if(message.savedFrom) {\n savedFrom = message.savedFrom;\n title.dataset.savedFrom = savedFrom;\n }\n\n nameDiv = document.createElement('div');\n title.dataset.peerId = '' + fwdFromId;\n\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\n nameDiv.style.color = getPeerColorById(fwdFromId, false);\n nameDiv.classList.add('colored-name');\n nameDiv.append(title);\n } else {\n /* const fromTitle = message.fromId === this.myID || appPeersManager.isBroadcast(fwdFromId || message.fromId) ? '' : `
${appPeersManager.getPeerTitle(message.fromId)}
`;\n nameDiv.innerHTML = fromTitle + 'Forwarded from ' + title; */\n const args: FormatterArguments = [title];\n if(isStandaloneMedia) {\n const br = document.createElement('br');\n br.classList.add('hide-ol');\n args.unshift(br);\n }\n nameDiv.append(i18n('ForwardedFrom', [args]));\n }\n } else if(!message.viaBotId) {\n if(!isStandaloneMedia && needName) {\n nameDiv = document.createElement('div');\n nameDiv.append(title);\n\n const peer = await this.managers.appPeersManager.getPeer(message.fromId);\n const pFlags = (peer as User.user)?.pFlags;\n if(pFlags && (pFlags.scam || pFlags.fake)) {\n nameDiv.append(generateFakeIcon(pFlags.scam));\n }\n\n if(!our) {\n nameDiv.style.color = getPeerColorById(message.fromId, false);\n nameDiv.classList.add('colored-name');\n }\n\n nameDiv.dataset.peerId = '' + message.fromId;\n } else /* if(!message.reply_to_mid) */ {\n bubble.classList.add('hide-name');\n }\n }\n\n if(message.viaBotId) {\n if(!nameDiv) {\n nameDiv = document.createElement('div');\n } else {\n nameDiv.append(' ');\n }\n\n const span = document.createElement('span');\n span.append(i18n('ViaBot'), ' ', titleVia);\n span.classList.add('is-via');\n\n nameDiv.append(span);\n }\n\n if(topicNameButtonContainer) {\n if(isStandaloneMedia) {\n topicNameButtonContainer.classList.add('floating-part');\n } else {\n if(!nameDiv) {\n nameDiv = document.createElement('div');\n }\n\n nameDiv.append(topicNameButtonContainer);\n\n bubble.classList.remove('hide-name');\n }\n }\n\n if(nameDiv) {\n nameDiv.classList.add('name');\n\n if(isStandaloneMedia) {\n nameContainer.append(nameContainer = document.createElement('div'));\n nameContainer.classList.add('name-with-reply', 'floating-part');\n } else {\n nameDiv.classList.add('floating-part');\n }\n\n nameContainer.append(nameDiv);\n\n if(isStandaloneMedia && replyContainer) {\n nameContainer.append(replyContainer);\n }\n } else if(isStandaloneMedia && replyContainer) {\n replyContainer.classList.add('floating-part');\n }\n\n if(topicNameButtonContainer && isStandaloneMedia) {\n if(!attachmentDiv) {\n this.log.error('no attachment div?', bubble, message);\n debugger;\n } else {\n attachmentDiv.after(topicNameButtonContainer);\n }\n }\n } else {\n bubble.classList.add('hide-name');\n }\n\n if(this.chat.type === 'pinned') {\n savedFrom = `${this.chat.peerId}_${message.mid}`;\n }\n\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\n if(isThreadStarter) {\n bubble.classList.add('is-thread-starter', 'is-group-last');\n }\n\n if(savedFrom && (this.chat.type === 'pinned' || fwdFrom.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\n const goto = document.createElement('div');\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\n bubbleContainer.append(goto);\n bubble.dataset.savedFrom = savedFrom;\n bubble.classList.add('with-beside-button');\n }\n\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\n\n if(withReplies) {\n const isFooter = MessageRender.renderReplies({\n bubble,\n bubbleContainer,\n message: messageWithReplies,\n messageDiv,\n loadPromises,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n if(isFooter) {\n canHaveTail = true;\n } else {\n bubble.classList.add('with-beside-replies');\n }\n }\n\n if(isMessage) {\n this.appendReactionsElementToBubble(bubble, message, reactionsMessage);\n }\n\n /* if(isMessage) {\n const reactionHover = document.createElement('div');\n reactionHover.classList.add('bubble-reaction-hover');\n contentWrapper.append(reactionHover);\n } */\n\n if(canHaveTail) {\n bubble.classList.add('can-have-tail');\n\n bubbleContainer.append(generateTail());\n }\n\n return ret;\n }\n\n private appendReactionsElementToBubble(\n bubble: HTMLElement,\n message: Message.message,\n reactionsMessage: Message.message,\n changedResults?: ReactionCount[]\n ) {\n if(this.peerId.isUser() && USER_REACTIONS_INLINE/* || true */) {\n return;\n }\n\n if(!reactionsMessage?.reactions || !reactionsMessage.reactions.results.length) {\n return;\n }\n\n // message = this.appMessagesManager.getMessageWithReactions(message);\n\n const reactionsElement = new ReactionsElement();\n reactionsElement.init(reactionsMessage, 'block', bubble.middlewareHelper.get());\n reactionsElement.render(changedResults);\n\n if(bubble.classList.contains('is-message-empty')) {\n bubble.querySelector('.bubble-content-wrapper').append(reactionsElement);\n } else {\n const messageDiv = bubble.querySelector('.message');\n if(bubble.classList.contains('is-multiple-documents')) {\n const documentContainer = messageDiv.lastElementChild as HTMLElement;\n let documentMessageDiv = documentContainer.querySelector('.document-message');\n\n let timeSpan: HTMLElement = documentMessageDiv && documentMessageDiv.querySelector('.time');\n if(!timeSpan) {\n timeSpan = MessageRender.setTime({\n chatType: this.chat.type,\n message,\n reactionsMessage\n });\n }\n\n reactionsElement.append(timeSpan);\n\n if(!documentMessageDiv) {\n documentMessageDiv = document.createElement('div');\n documentMessageDiv.classList.add('document-message');\n documentContainer.querySelector('.document-wrapper').prepend(documentMessageDiv);\n }\n\n documentMessageDiv.append(reactionsElement);\n } else {\n const timeSpan = Array.from(bubble.querySelectorAll('.time')).pop();\n reactionsElement.append(timeSpan);\n\n messageDiv.append(reactionsElement);\n }\n }\n }\n\n private prepareToSaveScroll(reverse?: boolean) {\n const isMounted = !!this.chatInner.parentElement;\n if(!isMounted) {\n return {};\n }\n\n const log = this.log.bindPrefix('prepareToSaveScroll');\n log('save');\n const scrollSaver = this.createScrollSaver(reverse);\n scrollSaver.save(); // * let's save scroll position by point before the slicing, not after\n\n if(this.getRenderedLength() && !this.chat.setPeerPromise) {\n const viewportSlice = this.getViewportSlice();\n this.deleteViewportSlice(viewportSlice, true);\n }\n\n // scrollSaver.save(); // ! slicing will corrupt scroll position\n // const saved = scrollSaver.getSaved();\n // const hadScroll = saved.scrollHeight !== saved.clientHeight;\n\n return {\n restoreScroll: () => {\n log('restore');\n // scrollSaver.restore(_history.length === 1 && !reverse ? false : true);\n scrollSaver.restore(reverse);\n this.onRenderScrollSet(scrollSaver.getSaved());\n },\n scrollSaver\n };\n }\n\n public async performHistoryResult(\n historyResult: HistoryResult | {history: (Message.message | Message.messageService | number)[]},\n reverse: boolean\n ) {\n const log = false ? this.log.bindPrefix('perform-' + (Math.random() * 1000 | 0)) : undefined;\n log?.('start', this.chatInner.parentElement);\n\n let history = historyResult.history;\n history = history.slice(); // need\n\n if(this.needReflowScroll) {\n reflowScrollableElement(this.scrollable.container);\n this.needReflowScroll = false;\n }\n\n const cb = (message: Message.message | Message.messageService) => {\n if(!message) {\n return;\n } else if(message.pFlags.local) {\n return this.processLocalMessageRender(message);\n } else {\n return this.safeRenderMessage(message, reverse);\n }\n };\n\n const messages = await Promise.all(history.map((mid) => {\n return typeof(mid) === 'number' ? this.chat.getMessage(mid) : mid;\n }));\n\n const setLoadedPromises: Promise[] = [];\n if(!this.scrollable.loadedAll['bottom'] || !this.scrollable.loadedAll['top']) {\n let isEnd = (historyResult as HistoryResult).isEnd;\n if(!isEnd) {\n const historyStorage = await this.chat.getHistoryStorage();\n const firstSlice = historyStorage.history.first;\n const lastSlice = historyStorage.history.last;\n isEnd = {top: false, bottom: false, both: false};\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\n isEnd.bottom = true;\n }\n\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\n isEnd.top = true;\n }\n }\n\n if(!isEnd.bottom && this.setPeerOptions) {\n const {lastMsgId, topMessage, savedPosition} = this.setPeerOptions;\n this.setPeerOptions = undefined;\n if((!lastMsgId && !savedPosition) || this.bubbles[topMessage] || lastMsgId === topMessage) {\n isEnd.bottom = true;\n }\n }\n\n if(isEnd.top) setLoadedPromises.push(this.setLoaded('top', true));\n if(isEnd.bottom) setLoadedPromises.push(this.setLoaded('bottom', true));\n }\n\n await Promise.all(setLoadedPromises);\n\n // ! it is important to insert bubbles to group reversed way\n // const length = history.length, promises: Promise[] = [];\n // if(reverse) for(let i = 0; i < length; ++i) promises.push(cb(messages[i]));\n // else for(let i = length - 1; i >= 0; --i) promises.push(cb(messages[i]));\n const promises = messages.map(cb);\n\n // cannot combine them into one promise\n await Promise.all(promises);\n await this.messagesQueuePromise;\n\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\n this.messagesQueueOnRenderAdditional();\n this.messagesQueueOnRenderAdditional?.(); // * can set it second time\n }\n\n log?.('performHistoryResult end');\n }\n\n private onRenderScrollSet(state?: {scrollHeight: number, clientHeight: number}) {\n const className = 'has-sticky-dates';\n if(!this.container.classList.contains(className)) {\n const isLoading = !this.preloader.detached;\n\n if(isLoading ||\n (\n state ??= {\n scrollHeight: this.scrollable.scrollHeight,\n clientHeight: this.scrollable.container.clientHeight\n },\n state.scrollHeight !== state.clientHeight\n )\n ) {\n /* for(const timestamp in this.dateMessages) {\n const dateMessage = this.dateMessages[timestamp];\n dateMessage.div.classList.add('is-sticky');\n } */\n\n const middleware = this.getMiddleware();\n const callback = () => {\n if(!middleware()) return;\n this.container.classList.add(className);\n };\n\n if(this.willScrollOnLoad) {\n callback();\n } else {\n setTimeout(callback, 600);\n }\n\n return;\n }\n }\n\n this.willScrollOnLoad = undefined;\n }\n\n public onDatePick = (timestamp: number) => {\n const peerId = this.peerId;\n this.managers.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then((history) => {\n if(!history?.messages?.length) {\n this.log.error('no history!');\n return;\n } else if(this.peerId !== peerId) {\n return;\n }\n\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\n // console.log('got history date:', history);\n });\n };\n\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\n // const middleware = this.getMiddleware();\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n return this.managers.acknowledged.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\n } else if(this.chat.type === 'pinned') {\n return this.managers.acknowledged.appMessagesManager.getSearch({\n peerId: this.peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId,\n limit: loadCount,\n backLimit\n }).then((ackedResult) => {\n return {\n cached: ackedResult.cached,\n result: Promise.resolve(ackedResult.result).then((value) => {\n return {history: value.history.map((m) => m.mid)};\n })\n };\n });\n } else if(this.chat.type === 'scheduled') {\n return this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((ackedResult) => {\n // this.setLoaded('top', true);\n // this.setLoaded('bottom', true);\n return {\n cached: ackedResult.cached,\n result: Promise.resolve(ackedResult.result).then((mids) => ({history: mids.slice().reverse()}))\n };\n });\n }\n }\n\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\n /* const middleware = this.getMiddleware();\n await this.ladderDeferred; */\n\n const log = this.log.bindPrefix('ladder');\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\n log.warn('will be delayed');\n // @ts-ignore\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\n return;\n }\n\n /* if(!middleware()) {\n return;\n } */\n\n if(!Object.keys(this.bubbles).length) {\n log.warn('no bubbles');\n return;\n }\n\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\n\n if(isAdditionRender && additionMsgIds.length) {\n sortedMids = sortedMids.filter((mid) => !additionMsgIds.includes(mid));\n }\n\n let targetMid: number;\n if(backLimit) {\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\n } else {\n if(additionMsgId) {\n targetMid = additionMsgId;\n } else { // * if maxId === 0\n targetMid = Math.max(...sortedMids);\n }\n }\n\n const topIds = sortedMids.slice(sortedMids.findIndex((mid) => targetMid > mid));\n const middleIds = isAdditionRender ? [] : [targetMid];\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex((mid) => targetMid >= mid)).reverse();\n\n if(DEBUG) {\n log('targeting mid:', targetMid, maxId, additionMsgId,\n topIds.map((m) => getServerMessageId(m)),\n bottomIds.map((m) => getServerMessageId(m)));\n }\n\n const setBubbles: HTMLElement[] = [];\n\n this.chatInner.classList.add('zoom-fading');\n const delay = isAdditionRender ? 10 : 40;\n const offsetIndex = isAdditionRender ? 0 : 1;\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\n const animationPromise = deferredPromise();\n let lastMsDelay = 0;\n mids.forEach((mid, idx) => {\n const bubble = this.bubbles[mid];\n if(!bubble || this.skippedMids.has(mid)) {\n log.warn('no bubble by mid:', mid);\n return;\n }\n\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\n // lastMsDelay = (idx + offsetIndex) * delay;\n // lastMsDelay = (idx || 0.1) * 1000;\n\n const contentWrapper = bubble.lastElementChild as HTMLElement;\n const elementsToAnimate: HTMLElement[] = [contentWrapper];\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(item && item.group.avatar && item.group.lastItem === item) {\n elementsToAnimate.push(item.group.avatar);\n }\n\n elementsToAnimate.forEach((element) => {\n element.classList.add('zoom-fade', 'can-zoom-fade');\n element.style.transitionDelay = lastMsDelay + 'ms';\n });\n\n if(idx === (mids.length - 1)) {\n const onTransitionEnd = (e: TransitionEvent) => {\n if(e.target !== contentWrapper) {\n return;\n }\n\n animationPromise.resolve();\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\n };\n\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\n }\n\n setBubbles.push(...elementsToAnimate);\n });\n\n if(!mids.length) {\n animationPromise.resolve();\n }\n\n return {lastMsDelay, animationPromise};\n };\n\n const topRes = animateAsLadder(topIds, offsetIndex);\n const middleRes = animateAsLadder(middleIds);\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\n\n if(this.onAnimateLadder) {\n await this.onAnimateLadder();\n }\n\n fastRaf(() => {\n this.setStickyDateManually(); // ! maybe it's not efficient\n\n setBubbles.forEach((element) => {\n element.classList.remove('zoom-fade');\n });\n });\n\n let promise: Promise;\n if(topIds.length || middleIds.length || bottomIds.length) {\n promise = Promise.all(promises);\n\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\n .then(() => {\n fastRaf(() => {\n setBubbles.forEach((element) => {\n element.style.transitionDelay = '';\n element.classList.remove('can-zoom-fade');\n });\n\n this.chatInner.classList.remove('zoom-fading');\n });\n\n // ! в хроме, каким-то образом из-за zoom-fade класса начинает прыгать скролл при подгрузке сообщений вверх,\n // ! т.е. скролл не ставится, так же, как в сафари при translateZ на блок выше scrollable\n // if(!IS_SAFARI) {\n // this.needReflowScroll = true;\n // }\n });\n }\n\n return promise;\n }\n\n private async renderEmptyPlaceholder(\n type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting' | 'restricted',\n bubble: HTMLElement,\n message: any,\n elements: (Node | string)[]\n ) {\n const BASE_CLASS = 'empty-bubble-placeholder';\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\n\n let title: HTMLElement;\n if(type === 'group') title = i18n('GroupEmptyTitle1');\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\n else if(type === 'restricted') {\n title = document.createElement('span');\n title.innerText = await this.managers.appPeersManager.getRestrictionReasonText(this.peerId);\n }\n title.classList.add('center', BASE_CLASS + '-title');\n\n elements.push(title);\n\n let listElements: HTMLElement[];\n if(type === 'group') {\n elements.push(i18n('GroupEmptyTitle2'));\n listElements = [\n i18n('GroupDescription1'),\n i18n('GroupDescription2'),\n i18n('GroupDescription3'),\n i18n('GroupDescription4')\n ];\n } else if(type === 'saved') {\n listElements = [\n i18n('ChatYourSelfDescription1'),\n i18n('ChatYourSelfDescription2'),\n i18n('ChatYourSelfDescription3'),\n i18n('ChatYourSelfDescription4')\n ];\n } else if(type === 'greeting') {\n const subtitle = i18n('NoMessagesGreetingsDescription');\n subtitle.classList.add('center', BASE_CLASS + '-subtitle');\n\n // findAndSplice(this.messagesQueue, q => q.bubble === bubble);\n\n const stickerDiv = document.createElement('div');\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\n\n const middleware = this.getMiddleware();\n\n await this.managers.appStickersManager.getGreetingSticker().then(async(doc) => {\n if(!middleware()) return;\n\n const loadPromises: Promise[] = [];\n await wrapSticker({\n doc,\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\n div: stickerDiv,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n group: this.chat.animationGroup,\n // play: !!message.pending || !multipleRender,\n play: true,\n loop: true,\n withThumb: true,\n loadPromises\n });\n\n attachClickEvent(stickerDiv, (e) => {\n cancelEvent(e);\n EmoticonsDropdown.onMediaClick({target: e.target});\n });\n\n return Promise.all(loadPromises);\n });\n\n // this.renderMessagesQueue({\n // message,\n // bubble,\n // reverse: false,\n // promises: [loadPromise]\n // });\n\n elements.push(subtitle, stickerDiv);\n }\n\n if(listElements) {\n elements.push(\n ...listElements.map((elem) => {\n const span = document.createElement('span');\n span.classList.add(BASE_CLASS + '-list-item');\n span.append(elem);\n return span;\n })\n );\n\n if(type === 'group') {\n listElements.forEach((elem) => {\n const i = document.createElement('span');\n i.classList.add('tgico-check');\n elem.prepend(i);\n });\n } else if(type === 'saved') {\n listElements.forEach((elem) => {\n const i = document.createElement('span');\n i.classList.add(BASE_CLASS + '-list-bullet');\n i.innerText = '•';\n elem.prepend(i);\n });\n }\n }\n\n if(elements.length > 1) {\n bubble.classList.add('has-description');\n }\n\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\n }\n\n private async processLocalMessageRender(\n message: Message.message | Message.messageService,\n animate?: boolean,\n middleware = this.getMiddleware()\n ) {\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const m = middlewarePromise(middleware);\n\n const p: Parameters[4] = async(result) => {\n const {bubble} = await m(result);\n if(!bubble) {\n return result;\n }\n\n (bubble as any).message = message;\n\n bubble.classList.add('is-group-last', 'is-group-first');\n\n const updatePosition = () => {\n if(this.updatePlaceholderPosition === updatePosition) {\n this.updatePlaceholderPosition = undefined;\n }\n\n appendTo[method](bubble);\n };\n\n if(!isSponsored) {\n bubble.classList.add('bubble-first');\n bubble.classList.remove('can-have-tail', 'is-in');\n }\n\n const elements: (Node | string)[] = [];\n const isBot = this.chat.isBot;\n let renderPromise: Promise, appendTo = this.container, method: 'append' | 'prepend' = 'append';\n if(this.chat.isRestricted) {\n renderPromise = this.renderEmptyPlaceholder('restricted', bubble, message, elements);\n } else if(isSponsored) {\n let text: LangPackKey, mid: number, startParam: string, callback: () => void;\n\n bubble.classList.add('avoid-selection');\n bubble.style.order = '999999';\n\n const sponsoredMessage = this.sponsoredMessage = (message as Message.message).sponsoredMessage;\n const peerId = getPeerId(sponsoredMessage.from_id);\n // const peer = this.appPeersManager.getPeer(peerId);\n if(sponsoredMessage.channel_post) {\n text = 'OpenChannelPost';\n mid = generateMessageId(sponsoredMessage.channel_post);\n } else if(sponsoredMessage.start_param || isBot) {\n text = 'Chat.Message.ViewBot';\n startParam = sponsoredMessage.start_param;\n } else {\n text = await this.managers.appPeersManager.isAnyGroup(peerId) ? 'Chat.Message.ViewGroup' : 'Chat.Message.ViewChannel';\n }\n\n if(sponsoredMessage.chat_invite) {\n callback = () => {\n new PopupJoinChatInvite(sponsoredMessage.chat_invite_hash, sponsoredMessage.chat_invite as ChatInvite.chatInvite);\n };\n } else if(sponsoredMessage.chat_invite_hash) {\n callback = () => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: sponsoredMessage.chat_invite_hash\n };\n\n this.chat.appImManager.processInternalLink(link);\n };\n } else {\n callback = () => {\n this.chat.appImManager.setInnerPeer({\n peerId,\n lastMsgId: mid,\n startParam\n });\n };\n }\n\n const button = this.makeViewButton({text});\n\n this.observer.observe(button, this.viewsObserverCallback);\n\n if(callback) {\n attachClickEvent(button, callback);\n }\n\n bubble.querySelector('.bubble-content').prepend(button);\n\n appendTo = this.chatInner;\n method = 'append';\n animate = false;\n\n // return result;\n } else if(isBot && message._ === 'message') {\n const b = document.createElement('b');\n b.append(i18n('BotInfoTitle'));\n elements.push(b, '\\n\\n');\n appendTo = this.chatInner;\n method = 'prepend';\n } else if(this.chat.isAnyGroup && ((await m(this.managers.appPeersManager.getPeer(this.peerId))) as MTChat.chat).pFlags.creator) {\n renderPromise = this.renderEmptyPlaceholder('group', bubble, message, elements);\n } else if(this.chat.type === 'scheduled') {\n renderPromise = this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\n } else if(rootScope.myId === this.peerId) {\n renderPromise = this.renderEmptyPlaceholder('saved', bubble, message, elements);\n } else if(this.peerId.isUser() && !isBot && await m(this.chat.canSend()) && this.chat.type === 'chat') {\n renderPromise = this.renderEmptyPlaceholder('greeting', bubble, message, elements);\n } else {\n renderPromise = this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\n }\n\n if(renderPromise) {\n await renderPromise;\n }\n\n if(elements.length) {\n const messageDiv = bubble.querySelector('.message, .service-msg');\n messageDiv.prepend(...elements);\n }\n\n const isWaitingForAnimation = !!this.messagesQueueOnRenderAdditional;\n const noTransition = this.setPeerCached && !isWaitingForAnimation;\n if(noTransition) {\n const setOn = bubble.firstElementChild;\n setOn.classList.add('no-transition');\n\n if(this.chat.setPeerPromise) {\n this.chat.setPeerPromise.catch(noop).finally(() => {\n setOn.classList.remove('no-transition');\n });\n }\n }\n\n if(animate === undefined && !noTransition) {\n animate = true;\n }\n\n if(isWaitingForAnimation || animate) {\n this.updatePlaceholderPosition = updatePosition;\n\n this.onAnimateLadder = () => {\n // appendTo[method](bubble);\n this.onAnimateLadder = undefined;\n\n // need raf here because animation won't fire if this message is single\n if(!this.messagesQueuePromise) {\n return fastRafPromise();\n }\n };\n } else if(this.chat.setPeerPromise) {\n this.attachPlaceholderOnRender = () => {\n this.attachPlaceholderOnRender = undefined;\n updatePosition();\n // appendTo[method](bubble);\n };\n } else {\n this.updatePlaceholderPosition = updatePosition;\n // appendTo[method](bubble);\n }\n\n if(!isWaitingForAnimation && animate) {\n await m(getHeavyAnimationPromise());\n const additionMsgIds = getObjectKeysAndSort(this.bubbles);\n indexOfAndSplice(additionMsgIds, message.mid);\n this.animateAsLadder(message.mid, additionMsgIds, false, 0, 0);\n }\n\n bubble.middlewareHelper.onDestroy(() => {\n if(this.emptyPlaceholderBubble === bubble) {\n this.emptyPlaceholderBubble = undefined;\n }\n });\n\n this.emptyPlaceholderBubble = bubble;\n\n return result;\n };\n\n return this.safeRenderMessage(\n message,\n !isSponsored,\n undefined,\n false,\n p\n );\n }\n\n private makeViewButton[1]>(options: T) {\n return Button('btn-primary btn-primary-transparent bubble-view-button', options);\n }\n\n private generateLocalMessageId(addOffset = 0) {\n // const INCREMENT = 0x10;\n const offset = (this.chat.type === 'scheduled' ? -1 : 0) + addOffset;\n // offset = generateMessageId(offset);\n // id: -Math.abs(+this.peerId * INCREMENT + offset),\n const id = -Math.abs(offset);\n const mid = -Math.abs(generateMessageId(id));\n return {id, mid};\n }\n\n private async generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void, addOffset = 0): Promise> {\n const {id, mid} = this.generateLocalMessageId(addOffset);\n let message: Omit & {message?: string} = {\n _: service ? 'messageService' : 'message',\n date: 0,\n id,\n mid,\n peer_id: await this.managers.appPeersManager.getOutputPeer(this.peerId),\n pFlags: {\n local: true\n }\n };\n\n if(!service) {\n message.message = '';\n }/* else {\n (message as Message.messageService).action = {} as any;\n } */\n\n assumeType>(message);\n\n fill && fill(message);\n\n const savedMessages = await this.managers.appMessagesManager.saveMessages([message], {storage: new Map() as any});\n message = savedMessages[0];\n message.mid = mid;\n return message as any;\n }\n\n public getViewportSlice() {\n // this.log.trace('viewport slice');\n return getViewportSlice({\n overflowElement: this.scrollable.container,\n selector: '.bubbles-date-group .bubble:not(.is-date)',\n extraSize: Math.max(700, windowSize.height) * 2\n });\n }\n\n public deleteViewportSlice(slice: ReturnType, ignoreScrollSaving?: boolean) {\n if(DO_NOT_SLICE_VIEWPORT_ON_RENDER) {\n return;\n }\n\n const {invisibleTop, invisibleBottom} = slice;\n const invisible = invisibleTop.concat(invisibleBottom);\n if(!invisible.length) {\n return;\n }\n\n if(invisibleTop.length) {\n this.setLoaded('top', false);\n this.getHistoryTopPromise = undefined;\n }\n\n if(invisibleBottom.length) {\n this.setLoaded('bottom', false);\n this.getHistoryBottomPromise = undefined;\n }\n\n const mids = invisible.map(({element}) => +element.dataset.mid);\n\n let scrollSaver: ScrollSaver;\n if(/* !!invisibleTop.length !== !!invisibleBottom.length && */!ignoreScrollSaving) {\n scrollSaver = this.createScrollSaver(!!invisibleTop.length);\n scrollSaver.save();\n }\n\n this.deleteMessagesByIds(mids, false, true);\n\n if(scrollSaver) {\n scrollSaver.restore();\n } else if(invisibleTop.length) {\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\n }\n }\n\n public sliceViewport(ignoreHeavyAnimation?: boolean) {\n // Safari cannot reset the scroll.\n if(IS_SAFARI || (this.isHeavyAnimationInProgress && !ignoreHeavyAnimation) || DO_NOT_SLICE_VIEWPORT) {\n return;\n }\n\n // const scrollSaver = new ScrollSaver(this.scrollable, true);\n // scrollSaver.save();\n const slice = this.getViewportSlice();\n // if(IS_SAFARI) slice.invisibleTop = [];\n this.deleteViewportSlice(slice);\n // scrollSaver.restore();\n }\n\n private async setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\n const willChange = this.scrollable.loadedAll[side] !== value;\n if(!willChange) {\n return;\n }\n\n const log = this.log.bindPrefix('setLoaded');\n log('change', side, value);\n\n this.scrollable.loadedAll[side] = value;\n this.scrollable.onScroll(); // ! WARNING\n // return;\n\n if(!checkPlaceholders) {\n return;\n }\n\n if(!this.chat.isRestricted) {\n if(side === 'bottom' && this.chat.isBroadcast/* && false */) {\n this.toggleSponsoredMessage(value);\n }\n\n if(side === 'top' && value && this.chat.isBot) {\n return this.renderBotPlaceholder();\n }\n }\n\n return this.checkIfEmptyPlaceholderNeeded();\n }\n\n private async toggleSponsoredMessage(value: boolean) {\n const log = this.log.bindPrefix('sponsored');\n log('checking');\n const {mid} = this.generateLocalMessageId(SPONSORED_MESSAGE_ID_OFFSET);\n if(value) {\n const middleware = this.getMiddleware(() => {\n return this.scrollable.loadedAll.bottom && this.getSponsoredMessagePromise === promise;\n });\n\n const promise = this.getSponsoredMessagePromise = this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId())\n .then(async(sponsoredMessages) => {\n if(!middleware() || sponsoredMessages._ === 'messages.sponsoredMessagesEmpty') {\n return;\n }\n\n const sponsoredMessage = sponsoredMessages.messages[0];\n if(!sponsoredMessage) {\n log('no message');\n return;\n }\n\n const messagePromise = this.generateLocalFirstMessage(false, (message) => {\n message.message = sponsoredMessage.message;\n message.from_id = sponsoredMessage.from_id;\n message.entities = sponsoredMessage.entities;\n message.pFlags.sponsored = true;\n message.sponsoredMessage = sponsoredMessage;\n }, SPONSORED_MESSAGE_ID_OFFSET);\n\n return Promise.all([\n messagePromise,\n this.getHistoryTopPromise, // wait for top load and execute rendering after or with it\n this.messagesQueuePromise\n ]).then(([message]) => {\n if(!middleware()) return;\n // this.processLocalMessageRender(message);\n log('rendering', message);\n return this.performHistoryResult({history: [message]}, false);\n });\n }).finally(() => {\n if(this.getSponsoredMessagePromise === promise) {\n this.getSponsoredMessagePromise = undefined;\n }\n });\n } else {\n log('clearing rendered', mid);\n this.getSponsoredMessagePromise = undefined;\n this.deleteMessagesByIds([mid]);\n }\n }\n\n private async renderBotPlaceholder() {\n const _log = this.log.bindPrefix('bot placeholder');\n\n const middleware = this.getMiddleware();\n const result = await this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());\n _log('getting profile, cached:', result.cached);\n const processPromise = result.result.then(async(userFull) => {\n if(!middleware()) {\n return;\n }\n\n if(!userFull.bot_info?.description) {\n _log.warn('no description');\n return this.checkIfEmptyPlaceholderNeeded();\n }\n\n const message = await this.generateLocalFirstMessage(false, (message) => {\n const botInfo = userFull.bot_info;\n message.message = botInfo.description;\n if(botInfo.description_document) message.media = {_: 'messageMediaDocument', document: botInfo.description_document, pFlags: {}};\n if(botInfo.description_photo) message.media = {_: 'messageMediaPhoto', photo: botInfo.description_photo, pFlags: {}};\n });\n\n if(!middleware()) {\n return;\n }\n\n _log('rendering');\n const renderPromise = this.processLocalMessageRender(message, !result.cached).then(() => {\n _log('done');\n });\n\n return {renderPromise};\n });\n\n if(!result.cached) {\n return;\n }\n\n return processPromise;\n }\n\n public async checkIfEmptyPlaceholderNeeded() {\n if(this.scrollable.loadedAll.top &&\n this.scrollable.loadedAll.bottom &&\n this.emptyPlaceholderBubble === undefined &&\n (\n this.chat.isRestricted ||\n !(await this.chat.getHistoryStorage()).count ||\n (\n // !Object.keys(this.bubbles).length ||\n // ! WARNING ! ! ! ! ! ! REPLACE LINE ABOVE WITH THESE\n Object.keys(this.bubbles).length &&\n !this.getRenderedLength()\n ) ||\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\n )\n ) {\n this.log('inject empty peer placeholder');\n\n const message = await this.generateLocalFirstMessage(true);\n return {renderPromise: this.processLocalMessageRender(message)};\n }\n }\n\n public getHistory1(maxId?: number, reverse?: boolean, isBackLimit?: boolean, additionMsgId?: number, justLoad?: boolean) {\n const middleware = this.getMiddleware(justLoad ? undefined : () => {\n return (reverse ? this.getHistoryTopPromise : this.getHistoryBottomPromise) === waitPromise;\n });\n\n const result = this.getHistory(maxId, reverse, isBackLimit, additionMsgId, justLoad, middleware);\n const waitPromise = result.then((res) => res && (res.waitPromise || res.promise));\n\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\n waitPromise.then(() => {\n if(!middleware()) {\n return;\n }\n\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\n\n if(!justLoad) {\n // preload more\n // if(!isFirstMessageRender) {\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\n setTimeout(() => {\n if(reverse) {\n this.loadMoreHistory(true, true);\n } else {\n this.loadMoreHistory(false, true);\n }\n }, 0);\n // }\n }\n // }\n\n // this.scrollable.onScroll();\n }\n });\n\n return result;\n }\n\n /**\n * Load and render history\n * @param maxId max message id\n * @param reverse 'true' means up\n * @param isBackLimit is search\n * @param additionMsgId for the last message\n * @param justLoad do not render\n */\n public async getHistory(\n maxId = 0,\n reverse = false,\n isBackLimit = false,\n additionMsgId = 0,\n justLoad = false,\n middleware?: () => boolean\n ): Promise<{cached: boolean, promise: Promise, waitPromise: Promise}> {\n const peerId = this.peerId;\n\n const isBroadcast = this.chat.isBroadcast;\n // console.time('appImManager call getHistory');\n const pageCount = Math.min(30, windowSize.height / 40/* * 1.25 */ | 0);\n // const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\n const realLoadCount = isBroadcast ? 20 : (Object.keys(this.bubbles).length > 0 ? Math.max(35, pageCount) : pageCount);\n // const realLoadCount = pageCount;//const realLoadCount = 50;\n let loadCount = realLoadCount;\n\n /* if(TEST_SCROLL) {\n //loadCount = 1;\n if(Object.keys(this.bubbles).length > 0)\n return {cached: false, promise: Promise.resolve(true)};\n } */\n if(TEST_SCROLL !== undefined) {\n if(TEST_SCROLL) {\n if(Object.keys(this.bubbles).length > 0) {\n --TEST_SCROLL;\n }\n } else {\n return {cached: false, promise: Promise.resolve(), waitPromise: Promise.resolve()};\n }\n }\n\n // //console.time('render history total');\n\n let backLimit = 0;\n if(isBackLimit) {\n backLimit = loadCount;\n\n if(!reverse) { // if not jump\n loadCount = 0;\n // maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\n }\n }\n\n let additionMsgIds: number[];\n if(additionMsgId && !isBackLimit) {\n if(this.chat.type === 'pinned') {\n additionMsgIds = [additionMsgId];\n } else {\n const historyStorage = await this.chat.getHistoryStorage();\n const slice = historyStorage.history.slice;\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\n additionMsgIds = slice.slice();\n\n // * filter last album, because we don't know is it the last item\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\n const message = await this.chat.getMessage(additionMsgIds[i]);\n if((message as Message.message)?.grouped_id) additionMsgIds.splice(i, 1);\n else break;\n }\n\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\n }\n }\n }\n\n /* const result = additionMsgID ?\n {history: [additionMsgID]} :\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\n let result: AckedResult = await this.requestHistory(maxId, loadCount, backLimit) as any;\n let resultPromise: typeof result['result'];\n\n this.log('i vin brehnya', result, maxId, loadCount, backLimit);\n\n // const isFirstMessageRender = !!additionMsgID && result.cached && !appMessagesManager.getMessage(additionMsgID).grouped_id;\n const isAdditionRender = additionMsgIds?.length && !result.cached;\n const isFirstMessageRender = (this.isFirstLoad && backLimit && !result.cached) || isAdditionRender;\n if(isAdditionRender) {\n resultPromise = result.result;\n\n result = {\n cached: true,\n result: Promise.resolve({history: additionMsgIds})\n };\n\n // additionMsgID = 0;\n }\n\n this.isFirstLoad = false;\n\n const processResult = async(historyResult: Awaited) => {\n if((historyResult as HistoryResult).isEnd?.top) {\n if(this.chat.type === 'discussion') { // * inject discussion start\n const serviceStartMessageId = await this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId, this.chat.threadId);\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\n const mids = await this.chat.getMidsByMid(this.chat.threadId);\n historyResult.history.push(...mids.reverse());\n }\n\n // synchronize bot placeholder appearance\n await this.managers.appProfileManager.getProfileByPeerId(peerId);\n\n // await this.setLoaded('top', true);\n }\n };\n\n const sup = (historyResult: Awaited) => {\n return getHeavyAnimationPromise().then(() => {\n return processResult(historyResult);\n }).then(() => {\n if(!isAdditionRender && additionMsgId) {\n historyResult.history.unshift(additionMsgId);\n }\n\n return this.performHistoryResult(historyResult, reverse);\n });\n };\n\n const processPromise = (_promise: typeof result['result']) => {\n const promise = Promise.resolve(_promise).then((result) => {\n if(middleware && !middleware()) {\n throw PEER_CHANGED_ERROR;\n }\n\n if(justLoad) {\n // нужно делать из-за ранней прогрузки\n this.scrollable.onScroll();\n // fastRaf(() => {\n // this.scrollable.checkForTriggers();\n // });\n return;\n }\n\n return sup(result);\n }, (err) => {\n this.log.error('getHistory error:', err);\n throw err;\n });\n\n return promise;\n };\n\n let promise: Promise, cached: boolean;\n if(!result.cached) {\n cached = false;\n promise = processPromise(result.result);\n } else if(justLoad) {\n // нужно делать из-за ранней прогрузки\n this.scrollable.onScroll();\n return null;\n } else {\n cached = true;\n promise = sup(await result.result);\n }\n\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\n\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\n let times = isAdditionRender ? 2 : 1;\n this.messagesQueueOnRenderAdditional = () => {\n this.log('messagesQueueOnRenderAdditional');\n\n if(--times) return;\n\n this.messagesQueueOnRenderAdditional = undefined;\n\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\n promise.then(() => {\n setTimeout(() => { // preload messages\n this.loadMoreHistory(reverse, true);\n }, 0);\n });\n };\n } else {\n this.messagesQueueOnRenderAdditional = undefined;\n }\n\n if(justLoad) {\n return null;\n }\n\n return {cached, promise, waitPromise};\n }\n\n public async setUnreadDelimiter() {\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n return;\n }\n\n if(this.attachedUnreadBubble) {\n return;\n }\n\n const historyMaxId = await this.chat.getHistoryMaxId();\n let readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\n if(!readMaxId) return;\n\n readMaxId = Object.keys(this.bubbles)\n .filter((mid) => !this.bubbles[mid].classList.contains('is-out'))\n .map((i) => +i)\n .sort((a, b) => a - b)\n .find((i) => i > readMaxId);\n\n if(readMaxId && this.bubbles[readMaxId]) {\n const bubble = this.bubbles[readMaxId];\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\n this.firstUnreadBubble.classList.remove('is-first-unread');\n this.firstUnreadBubble = null;\n }\n\n if(readMaxId !== historyMaxId) {\n bubble.classList.add('is-first-unread');\n }\n\n this.firstUnreadBubble = bubble;\n this.attachedUnreadBubble = true;\n }\n }\n\n public deleteEmptyDateGroups() {\n const mustBeCount = this.stickyIntersector ? STICKY_OFFSET : 1;\n let deleted = false;\n for(const i in this.dateMessages) {\n const dateMessage = this.dateMessages[i];\n\n if(dateMessage.container.childElementCount === mustBeCount) { // only date div + sentinel div\n dateMessage.container.remove();\n if(this.stickyIntersector) {\n this.stickyIntersector.unobserve(dateMessage.container, dateMessage.div);\n }\n delete this.dateMessages[i];\n deleted = true;\n\n // * no sense in it\n /* if(dateMessage.div === this.previousStickyDate) {\n this.previousStickyDate = undefined;\n } */\n }\n }\n\n if(!deleted) {\n return;\n }\n\n if(!Object.keys(this.dateMessages).length) {\n this.container.classList.remove('has-groups');\n }\n\n this.checkIfEmptyPlaceholderNeeded();\n this.setStickyDateManually();\n }\n}\n\nexport function generateTail() {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\n svg.setAttributeNS(null, 'width', '11');\n svg.setAttributeNS(null, 'height', '20');\n svg.classList.add('bubble-tail');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#message-tail-filled');\n\n svg.append(use);\n\n return svg;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {copyTextToClipboard} from '../clipboard';\n// import SelectionSaver from \"../selectionSaver\";\n// import selectElementContents from \"./selectElementContents\";\n\nexport default function copyFromElement(element: HTMLElement) {\n copyTextToClipboard(element.textContent);\n // const saver = new SelectionSaver();\n // saver.save();\n // selectElementContents(element);\n // document.execCommand('copy');\n // saver.restore();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {MediaSizeType} from '../../helpers/mediaSizes';\nimport {Message} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {MediaSearchContext} from '../appMediaPlaybackController';\nimport Chat from '../chat/chat';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport wrapDocument from './document';\n\nexport default async function wrapGroupedDocuments({albumMustBeRenderedFull, message, bubble, messageDiv, chat, loadPromises, autoDownloadSize, lazyLoadQueue, searchContext, useSearch, sizeType, managers, fontWeight, fontSize, richTextFragment}: {\n albumMustBeRenderedFull: boolean,\n message: any,\n messageDiv: HTMLElement,\n bubble: HTMLElement,\n uploading?: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n searchContext?: MediaSearchContext,\n useSearch?: boolean,\n sizeType?: MediaSizeType,\n managers?: AppManagers,\n fontWeight?: number,\n fontSize?: number,\n richTextFragment?: DocumentFragment\n}) {\n let nameContainer: HTMLElement;\n const mids = albumMustBeRenderedFull ? await chat.getMidsByMid(message.mid) : [message.mid];\n /* if(isPending) {\n mids.reverse();\n } */\n\n const promises = mids.map(async(mid, idx) => {\n const message = (await chat.getMessage(mid)) as Message.message;\n const div = await wrapDocument({\n message,\n loadPromises,\n autoDownloadSize,\n lazyLoadQueue,\n searchContext,\n sizeType,\n managers,\n fontWeight,\n fontSize\n });\n\n const container = document.createElement('div');\n container.classList.add('document-container');\n container.dataset.mid = '' + mid;\n container.dataset.peerId = '' + message.peerId;\n\n const wrapper = document.createElement('div');\n wrapper.classList.add('document-wrapper');\n\n if(message.message) {\n const messageDiv = document.createElement('div');\n messageDiv.classList.add('document-message');\n\n setInnerHTML(messageDiv, richTextFragment);\n wrapper.append(messageDiv);\n }\n\n if(mids.length > 1) {\n const selection = document.createElement('div');\n selection.classList.add('document-selection');\n container.append(selection);\n\n container.classList.add('grouped-item');\n\n if(idx === 0) {\n nameContainer = wrapper;\n }\n }\n\n wrapper.append(div);\n container.append(wrapper);\n return container;\n });\n\n const containers = await Promise.all(promises);\n messageDiv.append(...containers);\n\n if(mids.length > 1) {\n bubble.classList.add('is-multiple-documents', 'is-grouped');\n }\n\n return nameContainer;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport PollElement from '../poll';\n\nexport default function wrapPoll(message: any, managers: AppManagers = rootScope.managers) {\n const elem = new PollElement();\n elem.message = message;\n elem.managers = managers;\n elem.setAttribute('peer-id', '' + message.peerId);\n elem.setAttribute('poll-id', message.media.poll.id);\n elem.setAttribute('message-id', '' + message.mid);\n elem.render();\n return elem;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement, {addCancelButton} from '.';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\nimport rootScope from '../../lib/rootScope';\nimport {FormatterArguments, LangPackKey} from '../../lib/langPack';\nimport wrapPeerTitle from '../wrappers/peerTitle';\n\nexport default class PopupPinMessage {\n constructor(private peerId: PeerId, private mid: number, private unpin?: true, private onConfirm?: () => void) {\n this.construct();\n }\n\n private async construct() {\n const {peerId, mid, unpin, onConfirm} = this;\n let title: LangPackKey, description: LangPackKey, descriptionArgs: FormatterArguments;\n const buttons: PopupPeerOptions['buttons'] = [], checkboxes: PopupPeerOptions['checkboxes'] = [];\n\n const managers = PopupElement.MANAGERS;\n\n const canUnpin = await managers.appPeersManager.canPinMessage(peerId);\n\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, oneSide?: boolean, silent?: boolean) => {\n setTimeout(() => { // * костыль, потому что document.elementFromPoint вернёт popup-peer пока он будет закрываться\n let promise: Promise;\n if(unpin && !mid) {\n if(canUnpin) {\n promise = managers.appMessagesManager.unpinAllMessages(peerId);\n } else {\n promise = managers.appMessagesManager.hidePinnedMessages(peerId);\n }\n } else {\n promise = managers.appMessagesManager.updatePinnedMessage(peerId, mid, unpin, silent, oneSide);\n }\n\n if(onConfirm) {\n promise.then(onConfirm);\n }\n }, 300);\n };\n\n if(unpin) {\n let buttonText: LangPackKey = 'UnpinMessage';\n if(!mid) {\n if(canUnpin) {\n title = 'Popup.Unpin.AllTitle';\n description = 'Chat.UnpinAllMessagesConfirmation';\n descriptionArgs = ['' + ((await managers.appMessagesManager.getPinnedMessagesCount(peerId)) || 1)];\n } else {\n title = 'Popup.Unpin.HideTitle';\n description = 'Popup.Unpin.HideDescription';\n buttonText = 'Popup.Unpin.Hide';\n }\n } else {\n title = 'UnpinMessageAlertTitle';\n description = 'Chat.Confirm.Unpin';\n }\n\n buttons.push({\n langKey: buttonText,\n isDanger: true,\n callback\n });\n } else {\n title = 'PinMessageAlertTitle';\n const pinButtonText: LangPackKey = 'PinMessage';\n\n if(peerId.isAnyChat()) {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, false, !checked.size)\n });\n\n if(await managers.appChatsManager.isBroadcast(peerId.toChatId())) {\n description = 'PinMessageAlertChannel';\n } else {\n description = 'PinMessageAlert';\n\n checkboxes.push({\n text: 'PinNotify',\n checked: true\n });\n }\n } else {\n description = 'PinMessageAlertChat';\n\n if(peerId === rootScope.myId) {\n buttons.push({\n langKey: pinButtonText,\n callback\n });\n } else {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, !checked.size)\n });\n\n checkboxes.push({\n text: 'PinAlsoFor',\n textArgs: [await wrapPeerTitle({peerId})],\n checked: true\n });\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function isSelectionEmpty(selection = window.getSelection()) {\n if(!selection?.rangeCount) {\n return true;\n }\n\n const selectionRange = selection.getRangeAt(0);\n if(selectionRange.collapsed || !selectionRange.START_TO_END) {\n return true;\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport rootScope from '../lib/rootScope';\nimport {getEmojiToneIndex} from '../vendor/emoji';\nimport mediaSizes from './mediaSizes';\nimport {saveLottiePreview} from './saveLottiePreview';\n\nexport default function preloadAnimatedEmojiSticker(emoji: string, width?: number, height?: number) {\n return rootScope.managers.appStickersManager.preloadAnimatedEmojiSticker(emoji).then(({doc}) => {\n if(!doc) {\n return;\n }\n\n return appDownloadManager.downloadMedia({media: doc})\n .then(async(blob) => {\n const mediaSize = mediaSizes.active.emojiSticker;\n const toneIndex = getEmojiToneIndex(emoji);\n const animation = await lottieLoader.loadAnimationWorker({\n container: undefined,\n animationData: blob,\n width: width ?? mediaSize.width,\n height: height ?? mediaSize.height,\n name: 'doc' + doc.id,\n autoplay: false,\n loop: false,\n toneIndex,\n group: 'none'\n });\n\n animation.addEventListener('firstFrame', () => {\n saveLottiePreview(doc, animation.canvas[0], toneIndex);\n animation.remove();\n }, {once: true});\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ReportReason} from '../../layer';\nimport InputField from '../inputField';\nimport {toastNew} from '../toast';\nimport wrapStickerEmoji from '../wrappers/stickerEmoji';\nimport PopupPeer from './peer';\n\nexport default class PopupReportMessagesConfirm extends PopupPeer {\n public static STICKER_EMOJI = '👮‍♀️';\n constructor(peerId: PeerId, mids: number[], reason: ReportReason['_'], onConfirm?: () => void) {\n super('popup-report-messages-confirm', {\n noTitle: true,\n descriptionLangKey: 'ReportInfo',\n buttons: [{\n langKey: 'ReportChat',\n callback: () => {\n if(!inputField.isValid()) {\n return;\n }\n\n onConfirm && onConfirm();\n this.managers.appMessagesManager.reportMessages(peerId, mids, reason, inputField.value).then((bool) => {\n if(!bool) return;\n\n toastNew({\n langPackKey: 'ReportSentInfo'\n });\n });\n }\n }],\n body: true\n });\n\n const div = document.createElement('div');\n const size = 100;\n wrapStickerEmoji({\n div,\n emoji: PopupReportMessagesConfirm.STICKER_EMOJI,\n width: size,\n height: size\n }).then(({render}) => render).finally(() => {\n this.show();\n });\n\n this.header.replaceWith(div);\n\n const inputField = new InputField({\n label: 'ReportHint',\n maxLength: 512,\n placeholder: 'ReportChatDescription'\n });\n\n inputField.input.addEventListener('input', () => {\n this.buttons[0].element.toggleAttribute('disabled', !inputField.isValid());\n });\n\n this.body.append(inputField.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport whichChild from '../../helpers/dom/whichChild';\nimport preloadAnimatedEmojiSticker from '../../helpers/preloadAnimatedEmojiSticker';\nimport {ReportReason} from '../../layer';\nimport {LangPackKey} from '../../lib/langPack';\nimport Button from '../button';\nimport PopupPeer from './peer';\nimport PopupReportMessagesConfirm from './reportMessagesConfirm';\n\nexport default class PopupReportMessages extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-report-messages', {titleLangKey: 'ChatTitle.ReportMessages', buttons: [], body: true});\n\n mids = mids.slice();\n\n const buttons: [LangPackKey, ReportReason['_']][] = [\n ['ReportChatSpam', 'inputReportReasonSpam'],\n ['ReportChatViolence', 'inputReportReasonViolence'],\n ['ReportChatChild', 'inputReportReasonChildAbuse'],\n ['ReportChatPornography', 'inputReportReasonPornography'],\n ['ReportChatOther', 'inputReportReasonOther'],\n ['ReportChatPersonalDetails', 'inputReportReasonPersonalDetails'],\n ['ReportChatIllegalDrugs', 'inputReportReasonIllegalDrugs']\n ];\n\n const className = 'btn-primary btn-transparent';\n buttons.forEach((b) => {\n const button = Button(className, {/* icon: 'edit', */text: b[0]});\n this.body.append(button);\n });\n\n const preloadStickerPromise = preloadAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n\n attachClickEvent(this.body, (e) => {\n const target = findUpClassName(e.target, 'btn-primary');\n const reason = buttons[whichChild(target)][1];\n\n preloadStickerPromise.then(() => {\n this.hide();\n\n new PopupReportMessagesConfirm(peerId, mids, reason, onConfirm);\n });\n }, {listenerSetter: this.listenerSetter});\n\n // this.body.style.margin = '0 -1rem';\n this.buttonsEl.style.marginTop = '.5rem';\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport I18n, {i18n} from '../../lib/langPack';\nimport PopupPeer from './peer';\n\nexport default class PopupSponsored extends PopupPeer {\n constructor() {\n super('popup-sponsored', {\n titleLangKey: 'Chat.Message.Sponsored.What',\n descriptionLangKey: 'Chat.Message.Ad.Text',\n descriptionLangArgs: [i18n('Chat.Message.Sponsored.Link')],\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'Chat.Message.Ad.ReadMore',\n callback: () => {\n window.open(I18n.format('Chat.Message.Sponsored.Link', true));\n },\n isCancel: true\n }],\n scrollable: true\n });\n\n this.scrollable.append(this.description);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport {Message, Reaction} from '../../layer';\nimport ReactionsElement from '../chat/reactions';\nimport {horizontalMenu} from '../horizontalMenu';\nimport Scrollable from '../scrollable';\nimport ScrollableLoader from '../../helpers/scrollableLoader';\nimport appDialogsManager from '../../lib/appManagers/appDialogsManager';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport wrapSticker from '../wrappers/sticker';\nimport ReactionElement from '../chat/reaction';\nimport getUserStatusString from '../wrappers/getUserStatusString';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport SettingSection from '../settingSection';\n\nexport default class PopupReactedList extends PopupElement {\n constructor(\n private message: Message.message\n ) {\n super('popup-reacted-list', {closable: true, overlayClosable: true, body: true});\n\n this.init();\n }\n\n private async init() {\n const middleware = this.middlewareHelper.get();\n const message = await this.managers.appMessagesManager.getGroupsFirstMessage(this.message);\n if(!middleware()) return;\n const canViewReadParticipants = await this.managers.appMessagesManager.canViewMessageReadParticipants(message);\n if(!middleware()) return;\n // this.body.append(generateDelimiter());\n\n const reactionsElement = new ReactionsElement();\n const newMessage: Message.message = {\n ...message,\n mid: 0,\n id: 0,\n reactions: {\n _: 'messageReactions',\n results: [],\n\n ...message.reactions,\n\n pFlags: {},\n recent_reactions: []\n }\n };\n\n newMessage.reactions.results = newMessage.reactions.results.map((reactionCount) => {\n return {\n ...reactionCount,\n chosen_order: undefined,\n pFlags: {}\n };\n });\n\n reactionsElement.init(newMessage, 'block', this.middlewareHelper.get());\n reactionsElement.render();\n reactionsElement.classList.add('no-stripe');\n reactionsElement.classList.remove('has-no-reactions');\n\n reactionsElement.append(this.btnClose);\n\n this.header.append(reactionsElement);\n\n const tabsContainer = document.createElement('div');\n tabsContainer.classList.add('tabs-container');\n tabsContainer.dataset.animation = 'tabs';\n\n const loaders: Map = new Map();\n\n let hasAllReactions = false;\n if(newMessage.reactions.results.length) {\n const reaction = this.createFakeReaction('reactions', newMessage.reactions.results.reduce((acc, r) => acc + r.count, 0));\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasAllReactions = true;\n }\n\n let hasReadParticipants = false;\n if(canViewReadParticipants) {\n try {\n const readUserIds = await this.managers.appMessagesManager.getMessageReadParticipants(message.peerId, message.mid);\n if(!middleware()) return;\n if(!readUserIds.length) {\n throw '';\n }\n\n const reaction = this.createFakeReaction('checks', readUserIds.length);\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasReadParticipants = true;\n } catch(err) {\n\n }\n }\n\n newMessage.reactions.results.forEach((reactionCount) => {\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add('tabs-tab');\n\n const section = new SettingSection({\n noShadow: true,\n noDelimiter: true\n });\n\n const chatlist = appDialogsManager.createChatList({\n dialogSize: 72\n });\n\n appDialogsManager.setListClickListener(chatlist, () => {\n this.hide();\n }, undefined, false, true);\n\n section.content.append(chatlist);\n scrollable.container.append(section.container);\n\n const skipReadParticipants = (reactionCount.reaction as any) !== 'checks';\n const skipReactionsList = (reactionCount.reaction as any) === 'checks';\n if(['checks', 'reactions'].includes(reactionCount.reaction as any)) {\n reactionCount.reaction = undefined;\n }\n\n const size = 24;\n const mediaSize = makeMediaSize(size, size);\n\n let nextOffset: string;\n const loader = new ScrollableLoader({\n scrollable,\n getPromise: async() => {\n const result = await this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(message, undefined, reactionCount.reaction, nextOffset, skipReadParticipants, skipReactionsList);\n nextOffset = result.nextOffset;\n\n await Promise.all(result.combined.map(async({peerId, reaction}) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n autonomous: true,\n container: chatlist,\n avatarSize: 'abitbigger',\n rippleEnabled: false,\n meAsSaved: false\n });\n\n if(reaction) {\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add('reacted-list-reaction-icon');\n\n if(reaction._ === 'reactionEmoji') {\n const availableReaction = await this.managers.appReactionsManager.getReactionCached(reaction.emoticon);\n\n wrapSticker({\n doc: availableReaction.static_icon,\n div: stickerContainer,\n width: 24,\n height: 24,\n middleware\n });\n } else if(reaction._ === 'reactionCustomEmoji') {\n stickerContainer.append(wrapCustomEmoji({\n docIds: [reaction.document_id],\n customEmojiSize: mediaSize,\n middleware\n }));\n }\n\n dom.listEl.append(stickerContainer);\n }\n\n replaceContent(dom.lastMessageSpan, getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())));\n }));\n\n return !nextOffset;\n }\n });\n\n loaders.set(scrollable.container, loader);\n\n tabsContainer.append(scrollable.container);\n });\n\n this.body.append(tabsContainer);\n\n const selectTab = horizontalMenu(reactionsElement, tabsContainer, (id, tabContent) => {\n if(id === (reactionsElement.childElementCount - 1)) {\n return false;\n }\n\n const reaction = reactionsElement.children[id] as ReactionElement;\n const prevId = selectTab.prevId();\n if(prevId !== -1) {\n (reactionsElement.children[prevId] as ReactionElement).setIsChosen(false);\n }\n\n reaction.setIsChosen(true);\n\n const loader = loaders.get(tabContent);\n loader.load();\n }, undefined, undefined, undefined, this.listenerSetter);\n\n // selectTab(hasAllReactions && hasReadParticipants ? 1 : 0, false);\n selectTab(0, false);\n\n this.show();\n }\n\n private createFakeReaction(icon: string, count: number) {\n const reaction = new ReactionElement();\n reaction.init('block', this.middlewareHelper.get());\n reaction.reactionCount = {\n _: 'reactionCount',\n count: count,\n reaction: icon as any\n };\n reaction.setCanRenderAvatars(false);\n reaction.renderCounter();\n\n const allReactionsSticker = document.createElement('div');\n allReactionsSticker.classList.add('reaction-counter', 'reaction-sticker-icon', 'tgico-' + icon);\n reaction.prepend(allReactionsSticker);\n\n return reaction;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport assumeType from '../../helpers/assumeType';\nimport callbackify from '../../helpers/callbackify';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport {getMiddleware} from '../../helpers/middleware';\nimport noop from '../../helpers/noop';\nimport {fastRaf} from '../../helpers/schedulers';\nimport {Message, AvailableReaction, Reaction} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport Scrollable, {ScrollableBase, ScrollableX} from '../scrollable';\nimport wrapSticker from '../wrappers/sticker';\n\nconst REACTIONS_CLASS_NAME = 'btn-menu-reactions';\nconst REACTION_CLASS_NAME = REACTIONS_CLASS_NAME + '-reaction';\n\nconst REACTION_SIZE = 26;\nconst PADDING = 4;\nexport const REACTION_CONTAINER_SIZE = REACTION_SIZE + PADDING * 2;\n\nconst CAN_USE_TRANSFORM = !IS_SAFARI;\n\ntype ChatReactionsMenuPlayers = {\n select?: RLottiePlayer,\n appear?: RLottiePlayer,\n selectWrapper: HTMLElement,\n appearWrapper: HTMLElement,\n reaction: Reaction\n};\nexport class ChatReactionsMenu {\n public widthContainer: HTMLElement;\n public container: HTMLElement;\n private reactionsMap: Map;\n public scrollable: ScrollableBase;\n private animationGroup: AnimationItemGroup;\n private middleware: ReturnType;\n private message: Message.message;\n\n constructor(\n private managers: AppManagers,\n private type: 'horizontal' | 'vertical',\n middleware: ChatReactionsMenu['middleware']\n ) {\n const widthContainer = this.widthContainer = document.createElement('div');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container-' + type);\n\n const reactionsContainer = this.container = document.createElement('div');\n reactionsContainer.classList.add(REACTIONS_CLASS_NAME);\n\n const reactionsScrollable = this.scrollable = type === 'vertical' ? new Scrollable(undefined) : new ScrollableX(undefined);\n reactionsContainer.append(reactionsScrollable.container);\n reactionsScrollable.onAdditionalScroll = this.onScroll;\n reactionsScrollable.setListeners();\n\n reactionsScrollable.container.classList.add('no-scrollbar');\n\n // ['big'].forEach((type) => {\n // const bubble = document.createElement('div');\n // bubble.classList.add(REACTIONS_CLASS_NAME + '-bubble', REACTIONS_CLASS_NAME + '-bubble-' + type);\n // reactionsContainer.append(bubble);\n // });\n\n this.reactionsMap = new Map();\n this.animationGroup = `CHAT-MENU-REACTIONS-${Date.now()}`;\n animationIntersector.setOverrideIdleGroup(this.animationGroup, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n reactionsContainer.addEventListener('mousemove', this.onMouseMove);\n }\n\n attachClickEvent(reactionsContainer, (e) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) return;\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) return;\n\n this.managers.appReactionsManager.sendReaction(this.message, players.reaction);\n });\n\n widthContainer.append(reactionsContainer);\n\n this.middleware = middleware ?? getMiddleware();\n }\n\n public init(message: Message.message) {\n this.message = message;\n\n const middleware = this.middleware.get();\n // const result = Promise.resolve(this.appReactionsManager.getAvailableReactionsForPeer(message.peerId)).then((res) => pause(1000).then(() => res));\n const result = this.managers.appReactionsManager.getAvailableReactionsByMessage(message);\n callbackify(result, (reactions) => {\n if(!middleware() || !reactions.length) return;\n reactions.forEach((reaction) => {\n if(reaction.pFlags.premium && !rootScope.premium) return;\n this.renderReaction(reaction);\n });\n\n const setVisible = () => {\n this.container.classList.add('is-visible');\n };\n\n if(result instanceof Promise) {\n fastRaf(setVisible);\n } else {\n setVisible();\n }\n });\n }\n\n public cleanup() {\n this.middleware.clean();\n this.scrollable.removeListeners();\n this.reactionsMap.clear();\n animationIntersector.setOverrideIdleGroup(this.animationGroup, false);\n animationIntersector.checkAnimations(true, this.animationGroup, true);\n }\n\n private onScroll = () => {\n this.reactionsMap.forEach((players, div) => {\n this.onScrollProcessItem(div, players);\n });\n };\n\n private canUseAnimations() {\n return rootScope.settings.animationsEnabled && !IS_MOBILE;\n }\n\n private renderReaction(reaction: AvailableReaction) {\n const reactionDiv = document.createElement('div');\n reactionDiv.classList.add(REACTION_CLASS_NAME);\n\n const scaleContainer = document.createElement('div');\n scaleContainer.classList.add(REACTION_CLASS_NAME + '-scale');\n\n const appearWrapper = document.createElement('div');\n let selectWrapper: HTMLElement;;\n appearWrapper.classList.add(REACTION_CLASS_NAME + '-appear');\n\n if(this.canUseAnimations()) {\n selectWrapper = document.createElement('div');\n selectWrapper.classList.add(REACTION_CLASS_NAME + '-select', 'hide');\n }\n\n const players: ChatReactionsMenuPlayers = {\n selectWrapper,\n appearWrapper,\n reaction: {_: 'reactionEmoji', emoticon: reaction.reaction}\n };\n this.reactionsMap.set(reactionDiv, players);\n\n const middleware = this.middleware.get();\n\n const hoverScale = IS_TOUCH_SUPPORTED ? 1 : 1.25;\n const size = REACTION_SIZE * hoverScale;\n\n const options = {\n width: size,\n height: size,\n skipRatio: 1,\n needFadeIn: false,\n withThumb: false,\n group: this.animationGroup,\n middleware\n };\n\n if(!this.canUseAnimations()) {\n delete options.needFadeIn;\n delete options.withThumb;\n\n wrapSticker({\n doc: reaction.static_icon,\n div: appearWrapper,\n ...options\n });\n } else {\n let isFirst = true;\n wrapSticker({\n doc: reaction.appear_animation,\n div: appearWrapper,\n play: true,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n players.appear = player;\n\n player.addEventListener('enterFrame', (frameNo) => {\n if(player.maxFrame === frameNo) {\n selectLoadPromise.then((selectPlayer) => {\n assumeType(selectPlayer);\n appearWrapper.classList.add('hide');\n selectWrapper.classList.remove('hide');\n\n if(isFirst) {\n players.select = selectPlayer;\n isFirst = false;\n }\n }, noop);\n }\n });\n }, noop);\n\n const selectLoadPromise = wrapSticker({\n doc: reaction.select_animation,\n div: selectWrapper,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n return lottieLoader.waitForFirstFrame(player);\n }).catch(noop);\n }\n\n scaleContainer.append(appearWrapper);\n selectWrapper && scaleContainer.append(selectWrapper);\n reactionDiv.append(scaleContainer);\n this.scrollable.append(reactionDiv);\n }\n\n private onScrollProcessItem(div: HTMLElement, players: ChatReactionsMenuPlayers) {\n // return;\n\n const scaleContainer = div.firstElementChild as HTMLElement;\n const visibleRect = getVisibleRect(div, this.scrollable.container);\n let transform: string;\n if(!visibleRect) {\n if(!players.appearWrapper.classList.contains('hide') || !players.appear) {\n return;\n }\n\n if(players.select) {\n players.select.stop();\n }\n\n players.appear.stop();\n players.appear.autoplay = true;\n players.appearWrapper.classList.remove('hide');\n players.selectWrapper.classList.add('hide');\n\n transform = '';\n } else if(visibleRect.overflow.left || visibleRect.overflow.right) {\n const diff = Math.abs(visibleRect.rect.left - visibleRect.rect.right);\n const scale = Math.min(diff ** 2 / REACTION_CONTAINER_SIZE ** 2, 1);\n\n transform = 'scale(' + scale + ')';\n } else {\n transform = '';\n }\n\n if(CAN_USE_TRANSFORM) {\n scaleContainer.style.transform = transform;\n }\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) {\n return;\n }\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) {\n return;\n }\n\n // do not play select animation when appearing\n if(!players.appear?.paused) {\n return;\n }\n\n const player = players.select;\n if(!player) {\n return;\n }\n\n if(player.paused) {\n player.autoplay = true;\n player.restart();\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport ButtonMenu, {ButtonMenuItemOptions} from '../buttonMenu';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport PopupForward from '../popups/forward';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport {copyTextToClipboard} from '../../helpers/clipboard';\nimport PopupSendNow from '../popups/sendNow';\nimport {toast} from '../toast';\nimport I18n, {i18n, LangPackKey} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport {Message, Poll, Chat as MTChat, MessageMedia, AvailableReaction, MessageEntity, InputStickerSet, StickerSet, Document, Reaction} from '../../layer';\nimport PopupReportMessages from '../popups/reportMessages';\nimport assumeType from '../../helpers/assumeType';\nimport PopupSponsored from '../popups/sponsored';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {getMiddleware} from '../../helpers/middleware';\nimport PeerTitle from '../peerTitle';\nimport StackedAvatars from '../stackedAvatars';\nimport {IS_APPLE} from '../../environment/userAgent';\nimport PopupReactedList from '../popups/reactedList';\nimport {ChatReactionsMenu, REACTION_CONTAINER_SIZE} from './reactionsMenu';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport positionMenu, {MenuPositionPadding} from '../../helpers/positionMenu';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {SERVICE_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport PopupStickers from '../popups/stickers';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport canSaveMessageMedia from '../../lib/appManagers/utils/messages/canSaveMessageMedia';\nimport getAlbumText from '../../lib/appManagers/utils/messages/getAlbumText';\n\nexport default class ChatContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean | Promise, notDirect?: () => boolean, withSelection?: true, isSponsored?: true, localName?: 'views' | 'emojis'})[];\n private element: HTMLElement;\n\n private isSelectable: boolean;\n private isSelected: boolean;\n private target: HTMLElement;\n private isTargetAGroupedItem: boolean;\n private isTextSelected: boolean;\n private isAnchorTarget: boolean;\n private isUsernameTarget: boolean;\n private isSponsored: boolean;\n private isOverBubble: boolean;\n private peerId: PeerId;\n private mid: number;\n private message: Message.message | Message.messageService;\n private noForwards: boolean;\n\n private reactionsMenu: ChatReactionsMenu;\n private listenerSetter: ListenerSetter;\n private attachListenerSetter: ListenerSetter;\n\n private viewerPeerId: PeerId;\n private middleware: ReturnType;\n private canOpenReactedList: boolean;\n\n private emojiInputsPromise: CancellablePromise;\n private albumMessages: Message.message[];\n private linkToMessage: Awaited>;\n private selectedMessagesText: string;\n\n constructor(\n private chat: Chat,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n this.attachListenerSetter = new ListenerSetter();\n this.middleware = getMiddleware();\n }\n\n public attachTo(element: HTMLElement) {\n this.attachListenerSetter.removeAll();\n\n if(IS_TOUCH_SUPPORTED/* && false */) {\n attachClickEvent(element, (e) => {\n if(this.chat.selection.isSelecting) {\n return;\n }\n\n this.chat.log('touchend', e);\n\n const badSelectors = [\n '.name',\n '.peer-title',\n '.reply',\n '.document',\n 'audio-element',\n 'avatar-element',\n 'a',\n '.bubble-beside-button',\n 'replies-element',\n '[data-saved-from]:not(.bubble)',\n 'poll-element',\n '.attachment',\n '.reply-markup-button'\n ];\n const good = !(e.target as HTMLElement).closest(badSelectors.join(', '));\n if(good) {\n cancelEvent(e);\n // onContextMenu((e as TouchEvent).changedTouches[0]);\n // onContextMenu((e as TouchEvent).changedTouches ? (e as TouchEvent).changedTouches[0] : e as MouseEvent);\n this.onContextMenu(e);\n }\n }, {listenerSetter: this.attachListenerSetter});\n } else attachContextMenuListener({\n element,\n callback: this.onContextMenu,\n listenerSetter: this.attachListenerSetter\n });\n }\n\n private onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\n let bubble: HTMLElement, contentWrapper: HTMLElement;\n\n try {\n contentWrapper = findUpClassName(e.target, 'bubble-content-wrapper');\n bubble = contentWrapper ? contentWrapper.parentElement : findUpClassName(e.target, 'bubble');\n } catch(e) {}\n\n // ! context menu click by date bubble (there is no pointer-events)\n if(!bubble || bubble.classList.contains('bubble-first')) return;\n\n let element = this.element;\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\n if(element && element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\n\n let mid = +bubble.dataset.mid;\n if(!mid) return;\n\n const r = async() => {\n const isSponsored = this.isSponsored = mid < 0;\n this.isSelectable = this.chat.selection.canSelectBubble(bubble);\n this.peerId = this.chat.peerId;\n // this.msgID = msgID;\n this.target = e.target as HTMLElement;\n this.isTextSelected = !isSelectionEmpty();\n this.isAnchorTarget = this.target.tagName === 'A' && (\n (this.target as HTMLAnchorElement).target === '_blank' ||\n this.target.classList.contains('anchor-url')\n );\n this.isUsernameTarget = this.target.tagName === 'A' && this.target.classList.contains('mention');\n\n const mids = await this.chat.getMidsByMid(mid);\n // * если открыть контекстное меню для альбома не по бабблу, и последний элемент не выбран, чтобы показать остальные пункты\n if(this.chat.selection.isSelecting && !contentWrapper) {\n if(isSponsored) {\n return;\n }\n\n if(mids.length > 1) {\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ?\n mid :\n mids.find((mid) => this.chat.selection.isMidSelected(this.peerId, mid));\n if(selectedMid) {\n mid = selectedMid;\n }\n }\n }\n\n this.isOverBubble = !!contentWrapper;\n\n const groupedItem = findUpClassName(this.target, 'grouped-item');\n this.isTargetAGroupedItem = !!groupedItem;\n if(groupedItem) {\n this.mid = +groupedItem.dataset.mid;\n } else {\n this.mid = mid;\n }\n\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\n this.message = (bubble as any).message || await this.chat.getMessage(this.mid);\n this.albumMessages = (this.message as Message.message).grouped_id ? await this.managers.appMessagesManager.getMessagesByAlbum((this.message as Message.message).grouped_id) : undefined;\n this.noForwards = !isSponsored && !(await this.managers.appMessagesManager.canForward(this.message));\n this.viewerPeerId = undefined;\n this.canOpenReactedList = undefined;\n this.linkToMessage = await this.getUrlToMessage();\n this.selectedMessagesText = await this.getSelectedMessagesText();\n\n const initResult = await this.init();\n if(!initResult) {\n return;\n }\n\n element = initResult.element;\n const {cleanup, destroy, menuPadding, reactionsMenu, reactionsMenuPosition} = initResult;\n let isReactionsMenuVisible = false;\n if(reactionsMenu) {\n const className = 'is-visible';\n isReactionsMenuVisible = reactionsMenu.container.classList.contains(className);\n if(isReactionsMenuVisible) reactionsMenu.container.classList.remove(className);\n\n if(reactionsMenuPosition === 'horizontal') {\n const offsetSize = element[/* reactionsMenuPosition === 'vertical' ? 'offsetHeight' : */'offsetWidth'];\n // if(reactionsMenu.scrollable.container.scrollWidth > offsetWidth) {\n const INNER_CONTAINER_PADDING = 8;\n const visibleLength = (offsetSize - INNER_CONTAINER_PADDING) / REACTION_CONTAINER_SIZE;\n const nextVisiblePart = visibleLength % 1;\n const MIN_NEXT_VISIBLE_PART = 0.65;\n if(nextVisiblePart < MIN_NEXT_VISIBLE_PART) {\n const minSize = (offsetSize + (MIN_NEXT_VISIBLE_PART - nextVisiblePart) * REACTION_CONTAINER_SIZE) | 0;\n element.style[/* reactionsMenuPosition === 'vertical' ? 'minHeight' : */'minWidth'] = minSize + 'px';\n }\n // }\n }\n }\n\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\n // bubble.parentElement.append(element);\n // appImManager.log('contextmenu', e, bubble, side);\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, element, side, menuPadding);\n\n if(reactionsMenu) {\n reactionsMenu.widthContainer.style.top = element.style.top;\n reactionsMenu.widthContainer.style.left = element.style.left;\n reactionsMenu.widthContainer.style.setProperty('--menu-width', element[reactionsMenuPosition === 'vertical' ? 'offsetHeight' : 'offsetWidth'] + 'px');\n element.parentElement.append(reactionsMenu.widthContainer);\n if(isReactionsMenuVisible) void reactionsMenu.container.offsetLeft; // reflow\n }\n\n contextMenuController.openBtnMenu(element, () => {\n if(reactionsMenu) {\n reactionsMenu.container.classList.remove('is-visible');\n }\n\n this.mid = 0;\n this.peerId = undefined;\n this.target = null;\n this.viewerPeerId = undefined;\n this.canOpenReactedList = undefined;\n cleanup();\n\n setTimeout(() => {\n destroy();\n }, 300);\n });\n\n if(isReactionsMenuVisible) {\n reactionsMenu.container.classList.add('is-visible');\n }\n };\n\n r();\n };\n\n public cleanup() {\n this.listenerSetter.removeAll();\n this.reactionsMenu && this.reactionsMenu.cleanup();\n this.middleware.clean();\n }\n\n public destroy() {\n this.cleanup();\n this.attachListenerSetter.removeAll();\n }\n\n private async filterButtons(buttons: ChatContextMenu['buttons']) {\n if(this.isSponsored) {\n return buttons.filter((button) => {\n return button.isSponsored;\n });\n } else {\n return filterAsync(buttons, async(button) => {\n let good: boolean;\n\n // if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\n if(this.chat.selection.isSelecting && !button.withSelection) {\n good = false;\n } else {\n good = this.isOverBubble || IS_TOUCH_SUPPORTED || true ?\n await button.verify() :\n button.notDirect && await button.verify() && button.notDirect();\n }\n\n return !!good;\n });\n }\n }\n\n private setButtons() {\n const verifyFavoriteSticker = async(toAdd: boolean) => {\n const doc = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document;\n if(!(doc as MyDocument)?.sticker) {\n return false;\n }\n\n const favedStickers = await this.managers.acknowledged.appStickersManager.getFavedStickersStickers();\n if(!favedStickers.cached) {\n return false;\n }\n\n const found = (await favedStickers.result).some((_doc) => _doc.id === doc.id);\n return toAdd ? !found : found;\n };\n\n this.buttons = [{\n icon: 'send2',\n text: 'MessageScheduleSend',\n onClick: this.onSendScheduledClick,\n verify: () => this.chat.type === 'scheduled' && !this.message.pFlags.is_outgoing\n }, {\n icon: 'send2',\n text: 'Message.Context.Selection.SendNow',\n onClick: this.onSendScheduledClick,\n verify: () => this.chat.type === 'scheduled' && this.isSelected && !this.chat.selection.selectionSendNowBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'schedule',\n text: 'MessageScheduleEditTime',\n onClick: () => {\n this.chat.input.scheduleSending(() => {\n assumeType(this.message);\n this.managers.appMessagesManager.editMessage(this.message, this.message.message, {\n scheduleDate: this.chat.input.scheduleDate,\n entities: this.message.entities\n });\n\n this.chat.input.onMessageSent(false, false);\n }, new Date(this.message.date * 1000));\n },\n verify: () => this.chat.type === 'scheduled'\n }, {\n icon: 'reply',\n text: 'Reply',\n onClick: this.onReplyClick,\n verify: async() => await this.chat.canSend() &&\n !this.message.pFlags.is_outgoing &&\n !!this.chat.input.messageInput &&\n this.chat.type !== 'scheduled'/* ,\n cancelEvent: true */\n }, {\n icon: 'favourites',\n text: 'AddToFavorites',\n onClick: this.onFaveStickerClick.bind(this, false),\n verify: () => verifyFavoriteSticker(true)\n }, {\n icon: 'favourites',\n text: 'DeleteFromFavorites',\n onClick: this.onFaveStickerClick.bind(this, true),\n verify: () => verifyFavoriteSticker(false)\n }, {\n icon: 'edit',\n text: 'Edit',\n onClick: this.onEditClick,\n verify: async() => (await this.managers.appMessagesManager.canEditMessage(this.message, 'text')) && !!this.chat.input.messageInput\n }, {\n icon: 'copy',\n text: 'Copy',\n onClick: this.onCopyClick,\n verify: () => !this.noForwards && !!(this.message as Message.message).message && !this.isTextSelected && (!this.isAnchorTarget || (this.message as Message.message).message !== this.target.innerText)\n }, {\n icon: 'copy',\n text: 'Chat.CopySelectedText',\n onClick: this.onCopyClick,\n verify: () => !this.noForwards && !!(this.message as Message.message).message && this.isTextSelected\n }, {\n icon: 'copy',\n text: 'Message.Context.Selection.Copy',\n onClick: this.onCopyClick,\n verify: async() => {\n if(!this.isSelected || this.noForwards) {\n return false;\n }\n\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\n const storageKey: MessagesStorageKey = `${peerId}_${this.chat.type === 'scheduled' ? 'scheduled' : 'history'}`;\n for(const mid of mids) {\n const message = (await this.managers.appMessagesManager.getMessageFromStorage(storageKey, mid)) as Message.message;\n if(!!message.message) {\n return true;\n }\n }\n }\n\n return false;\n },\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'CopyLink',\n onClick: this.onCopyAnchorLinkClick,\n verify: () => this.isAnchorTarget,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'Text.Context.Copy.Username',\n onClick: () => {\n copyTextToClipboard(this.target.innerHTML);\n },\n verify: () => this.isUsernameTarget,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'Text.Context.Copy.Hashtag',\n onClick: () => {\n copyTextToClipboard(this.target.innerHTML);\n },\n verify: () => this.target.classList.contains('anchor-hashtag'),\n withSelection: true\n }, {\n icon: 'link',\n text: 'MessageContext.CopyMessageLink1',\n onClick: this.onCopyLinkClick,\n verify: async() => await this.managers.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\n }, {\n icon: 'pin',\n text: 'Message.Context.Pin',\n onClick: this.onPinClick,\n verify: async() => !this.message.pFlags.is_outgoing &&\n this.message._ !== 'messageService' &&\n !this.message.pFlags.pinned &&\n await this.managers.appPeersManager.canPinMessage(this.peerId) &&\n this.chat.type !== 'scheduled'\n }, {\n icon: 'unpin',\n text: 'Message.Context.Unpin',\n onClick: this.onUnpinClick,\n verify: async() => (this.message as Message.message).pFlags.pinned && await this.managers.appPeersManager.canPinMessage(this.peerId)\n }, {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: () => {\n appDownloadManager.downloadToDisc({media: getMediaFromMessage(this.message)});\n },\n verify: () => {\n if(!canSaveMessageMedia(this.message) || this.noForwards) {\n return false;\n }\n\n const isPhoto: boolean = !!((this.message as Message.message).media as MessageMedia.messageMediaPhoto)?.photo;\n let isGoodType = false\n\n if(isPhoto) {\n isGoodType = true;\n } else {\n const doc: MyDocument = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document as any;\n if(!doc) return false;\n // isGoodType = doc.type && (['gif', 'video', 'audio', 'voice', 'sticker'] as MyDocument['type'][]).includes(doc.type)\n isGoodType = true;\n }\n\n let hasTarget = !!IS_TOUCH_SUPPORTED;\n\n if(isGoodType) hasTarget ||= !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio') || !!findUpClassName(this.target, 'media-sticker-wrapper') || !!findUpClassName(this.target, 'media-photo') || !!findUpClassName(this.target, 'media-video');\n\n return isGoodType && hasTarget;\n }\n }, {\n icon: 'checkretract',\n text: 'Chat.Poll.Unvote',\n onClick: this.onRetractVote,\n verify: () => {\n const poll = (this.message as any).media?.poll as Poll;\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\n }/* ,\n cancelEvent: true */\n }, {\n icon: 'stop',\n text: 'Chat.Poll.Stop',\n onClick: this.onStopPoll,\n verify: async() => {\n const poll = (this.message as any).media?.poll;\n return await this.managers.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\n }/* ,\n cancelEvent: true */\n }, {\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick, // let forward the message if it's outgoing but not ours (like a changelog)\n verify: () => !this.noForwards && this.chat.type !== 'scheduled' && (!this.message.pFlags.is_outgoing || this.message.fromId === SERVICE_PEER_ID) && this.message._ !== 'messageService'\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.chat.selection.selectionForwardBtn &&\n this.isSelected &&\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'flag',\n text: 'ReportChat',\n onClick: () => {\n new PopupReportMessages(this.peerId, [this.mid]);\n },\n verify: async() => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && await this.managers.appPeersManager.isChannel(this.peerId),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick,\n verify: () => !(this.message as Message.messageService).action && !this.isSelected && this.isSelectable,\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n notDirect: () => true,\n withSelection: true\n }, {\n onClick: () => {\n if(this.viewerPeerId) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.viewerPeerId\n });\n } else if(this.canOpenReactedList) {\n new PopupReactedList(this.message as Message.message);\n } else {\n return false;\n }\n },\n verify: async() => !this.peerId.isUser() && (!!(this.message as Message.message).reactions?.recent_reactions?.length || await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)),\n notDirect: () => true,\n localName: 'views'\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(this.message)\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'info',\n text: 'Chat.Message.Sponsored.What',\n onClick: () => {\n new PopupSponsored();\n },\n verify: () => false,\n isSponsored: true\n }, {\n // icon: 'smile',\n text: 'Loading',\n onClick: () => {\n this.emojiInputsPromise.then((inputs) => {\n new PopupStickers(inputs, true).show();\n });\n },\n verify: () => !!this.getUniqueCustomEmojisFromMessage().length,\n notDirect: () => true,\n localName: 'emojis'\n }];\n }\n\n private getUniqueCustomEmojisFromMessage() {\n const docIds: DocId[] = [];\n\n const message = this.albumMessages ? getAlbumText(this.albumMessages) || this.message : this.message;\n\n const entities = (message as Message.message).entities;\n if(entities) {\n const filtered = entities.filter((entity) => entity._ === 'messageEntityCustomEmoji') as MessageEntity.messageEntityCustomEmoji[];\n docIds.push(...filtered.map((entity) => entity.document_id));\n }\n\n const reactions = (message as Message.message).reactions;\n if(reactions) {\n const results = reactions.results.filter((reactionCount) => reactionCount.reaction._ === 'reactionCustomEmoji');\n docIds.push(...results.map((reactionCount) => (reactionCount.reaction as Reaction.reactionCustomEmoji).document_id));\n }\n\n return filterUnique(docIds);\n }\n\n private async init() {\n this.cleanup();\n this.setButtons();\n\n const filteredButtons = await this.filterButtons(this.buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const element = this.element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter: this.listenerSetter\n });\n element.id = 'bubble-contextmenu';\n element.classList.add('contextmenu');\n\n const viewsButton = filteredButtons.find((button) => button.localName === 'views');\n if(viewsButton) {\n const reactions = (this.message as Message.message).reactions;\n const recentReactions = reactions?.recent_reactions;\n const isViewingReactions = !!recentReactions?.length;\n const participantsCount = await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message) ?\n ((await this.managers.appPeersManager.getPeer(this.peerId)) as MTChat.chat).participants_count :\n undefined;\n const reactedLength = reactions ? reactions.results.reduce((acc, r) => acc + r.count, 0) : undefined;\n\n viewsButton.element.classList.add('tgico-' + (isViewingReactions ? 'reactions' : 'checks'));\n const i18nElem = new I18n.IntlElement({\n key: isViewingReactions ? (\n participantsCount === undefined ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted'\n ) : 'NobodyViewed',\n args: isViewingReactions ? (\n participantsCount === undefined ? [reactedLength] : [participantsCount, participantsCount]\n ) : undefined,\n element: viewsButton.textElement\n });\n\n let fakeText: HTMLElement;\n if(isViewingReactions) {\n if(participantsCount === undefined) {\n fakeText = i18n('Chat.Context.ReactedFast', [reactedLength]);\n } else {\n fakeText = i18n(\n recentReactions.length === participantsCount ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\n [recentReactions.length, participantsCount]\n );\n }\n } else {\n fakeText = i18n('Loading');\n }\n\n fakeText.classList.add('btn-menu-item-text-fake');\n viewsButton.element.append(fakeText);\n\n const AVATAR_SIZE = 22;\n const MAX_AVATARS = 3;\n const PADDING_PER_AVATAR = 1.125;\n i18nElem.element.style.visibility = 'hidden';\n i18nElem.element.style.paddingRight = isViewingReactions ? PADDING_PER_AVATAR * Math.min(MAX_AVATARS, recentReactions.length) + 'rem' : '1rem';\n const middleware = this.middleware.get();\n this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message as Message.message).then((result) => {\n if(!middleware()) {\n return;\n }\n\n if(fakeText) {\n fakeText.remove();\n }\n\n const reactions = result.combined;\n const reactedLength = participantsCount === undefined ?\n result.reactionsCount :\n (\n isViewingReactions ?\n reactions.filter((reaction) => reaction.reaction).length :\n reactions.length\n );\n\n let fakeElem: HTMLElement;\n if(reactions.length === 1) {\n fakeElem = new PeerTitle({\n peerId: reactions[0].peerId,\n onlyFirstName: true,\n dialog: false\n }).element;\n\n if(!isViewingReactions || result.readParticipants.length <= 1) {\n this.viewerPeerId = reactions[0].peerId;\n }\n } else if(isViewingReactions) {\n const isFull = reactedLength === reactions.length || participantsCount === undefined;\n fakeElem = i18n(\n isFull ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\n isFull ? [reactedLength] : [reactedLength, reactions.length]\n );\n } else {\n if(!reactions.length) {\n i18nElem.element.style.visibility = '';\n } else {\n fakeElem = i18n('MessageSeen', [reactions.length]);\n }\n }\n\n if(fakeElem) {\n fakeElem.style.paddingRight = PADDING_PER_AVATAR * Math.min(MAX_AVATARS, reactedLength) + 'rem';\n fakeElem.classList.add('btn-menu-item-text-fake');\n viewsButton.element.append(fakeElem);\n }\n\n if(reactions.length) {\n const avatars = new StackedAvatars({avatarSize: AVATAR_SIZE});\n avatars.render(recentReactions ? recentReactions.map((r) => getPeerId(r.peer_id)) : reactions.map((reaction) => reaction.peerId));\n viewsButton.element.append(avatars.container);\n\n // if(reactions.length > 1) {\n // if(isViewingReactions) {\n this.canOpenReactedList = true;\n // }\n }\n });\n }\n\n let menuPadding: MenuPositionPadding;\n let reactionsMenu: ChatReactionsMenu;\n let reactionsMenuPosition: 'horizontal' | 'vertical';\n if(\n this.message._ === 'message' &&\n !this.chat.selection.isSelecting &&\n !this.message.pFlags.is_outgoing &&\n !this.message.pFlags.is_scheduled &&\n !this.message.pFlags.local\n ) {\n reactionsMenuPosition = (IS_APPLE || IS_TOUCH_SUPPORTED)/* && false */ ? 'horizontal' : 'vertical';\n reactionsMenu = this.reactionsMenu = new ChatReactionsMenu(this.managers, reactionsMenuPosition, this.middleware);\n reactionsMenu.init(await this.managers.appMessagesManager.getGroupsFirstMessage(this.message));\n // element.prepend(reactionsMenu.widthContainer);\n\n const size = 36;\n const margin = 8;\n const totalSize = size + margin;\n const paddingLeft = 0, paddingRight = 0;\n if(reactionsMenuPosition === 'vertical') {\n menuPadding = {\n top: paddingLeft,\n // bottom: 36, // positionMenu will detect it itself somehow\n left: totalSize\n };\n } else {\n menuPadding = {\n top: totalSize,\n right: paddingRight,\n left: paddingLeft\n };\n }\n }\n\n const emojisButton = filteredButtons.find((button) => button.localName === 'emojis');\n if(emojisButton) {\n emojisButton.element.classList.add('is-multiline');\n emojisButton.element.parentElement.insertBefore(document.createElement('hr'), emojisButton.element);\n\n const setPadding = () => {\n menuPadding ??= {};\n menuPadding.bottom = 24;\n };\n\n const docIds = this.getUniqueCustomEmojisFromMessage();\n const inputsPromise = this.emojiInputsPromise = deferredPromise();\n\n await this.managers.appEmojiManager.getCachedCustomEmojiDocuments(docIds).then(async(docs) => {\n const p = async(docs: Document.document[]) => {\n const s: Map = new Map();\n docs.forEach((doc) => {\n if(!doc || s.has(doc.stickerSetInput.id)) {\n return;\n }\n\n s.set(doc.stickerSetInput.id, doc.stickerSetInput);\n });\n\n const inputs = [...s.values()];\n inputsPromise.resolve(inputs);\n if(s.size === 1) {\n const result = await this.managers.acknowledged.appStickersManager.getStickerSet(inputs[0]);\n const promise = result.result.then((set) => {\n const el = i18n('MessageContainsEmojiPack', [wrapEmojiText(set.set.title)]);\n replaceContent(emojisButton.textElement, el);\n });\n\n return result.cached ? promise : (setPadding(), undefined);\n }\n\n replaceContent(emojisButton.textElement, i18n('MessageContainsEmojiPacks', [s.size]));\n };\n\n if(docs.some((doc) => !doc)) {\n setPadding();\n this.managers.appEmojiManager.getCustomEmojiDocuments(docIds).then(p);\n } else {\n return p(docs);\n }\n });\n // emojisButton.element.append(i18n('Loading'));\n }\n\n this.chat.container.append(element);\n\n return {\n element,\n cleanup: () => {\n this.cleanup();\n reactionsMenu && reactionsMenu.cleanup();\n },\n destroy: () => {\n element.remove();\n reactionsMenu && reactionsMenu.widthContainer.remove();\n },\n menuPadding,\n reactionsMenu,\n reactionsMenuPosition\n };\n }\n\n private async getUrlToMessage() {\n if(this.peerId.isUser()) {\n return;\n }\n\n let threadMessage: Message.message;\n const {peerId, mid} = this;\n const threadId = this.chat.threadId;\n if(this.chat.type === 'discussion') {\n threadMessage = (await this.managers.appMessagesManager.getMessageByPeer(peerId, threadId)) as Message.message;\n }\n\n const username = await this.managers.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : peerId);\n const msgId = getServerMessageId(mid);\n let url = 'https://t.me/';\n if(username) {\n url += username;\n if(threadMessage) url += `/${getServerMessageId(threadMessage.fwd_from.channel_post)}?comment=${msgId}`;\n else if(threadId) url += `/${getServerMessageId(threadId)}/${msgId}`;\n else url += '/' + msgId;\n } else {\n url += 'c/' + peerId.toChatId();\n if(threadMessage) url += `/${msgId}?thread=${getServerMessageId(threadMessage.mid)}`;\n else if(threadId) url += `/${getServerMessageId(threadId)}/${msgId}`;\n else url += '/' + msgId;\n }\n\n return {url, isPrivate: !username};\n }\n\n private async getSelectedMessagesText() {\n if(!isSelectionEmpty()) {\n return '';\n }\n\n const mids = this.chat.selection.isSelecting ?\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) :\n [this.mid];\n\n const parts: string[] = await Promise.all(mids.map(async(mid) => {\n const message = (await this.chat.getMessage(mid)) as Message.message;\n return message?.message ? message.message + '\\n' : '';\n }));\n\n return parts.join('');\n }\n\n private onSendScheduledClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\n } else {\n new PopupSendNow(this.peerId, await this.chat.getMidsByMid(this.mid));\n }\n };\n\n private onReplyClick = () => {\n this.chat.input.initMessageReply(this.mid);\n };\n\n private onFaveStickerClick = (unfave?: boolean) => {\n const docId = ((this.message as Message.message).media as MessageMedia.messageMediaDocument).document.id;\n this.managers.appStickersManager.faveSticker(docId, unfave);\n };\n\n private onEditClick = () => {\n this.chat.input.initMessageEditing(this.mid);\n };\n\n private onCopyClick = async() => {\n if(isSelectionEmpty()) {\n copyTextToClipboard(this.selectedMessagesText);\n } else {\n document.execCommand('copy');\n // cancelSelection();\n }\n };\n\n private onCopyAnchorLinkClick = () => {\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\n };\n\n private onCopyLinkClick = () => {\n const {url, isPrivate} = this.linkToMessage;\n const key: LangPackKey = isPrivate ? 'LinkCopiedPrivateInfo' : 'LinkCopied';\n toast(I18n.format(key, true));\n copyTextToClipboard(url);\n };\n\n private onPinClick = () => {\n new PopupPinMessage(this.peerId, this.mid);\n };\n\n private onUnpinClick = () => {\n new PopupPinMessage(this.peerId, this.mid, true);\n };\n\n private onRetractVote = () => {\n this.managers.appPollsManager.sendVote(this.message as Message.message, []);\n };\n\n private onStopPoll = () => {\n this.managers.appPollsManager.stopPoll(this.message as Message.message);\n };\n\n private onForwardClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\n } else {\n const peerId = this.peerId;\n const mids = this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid);\n new PopupForward({\n [peerId]: mids\n });\n }\n };\n\n private onSelectClick = () => {\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\n };\n\n private onClearSelectionClick = () => {\n this.chat.selection.cancelSelection();\n };\n\n private onDeleteClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid), this.chat.type);\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport rootScope from '../../lib/rootScope';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\n\nexport default class SendMenu {\n public sendMenu: HTMLElement;\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n private type: 'schedule' | 'reminder';\n\n constructor(options: {\n onSilentClick: () => void,\n onScheduleClick: () => void,\n listenerSetter?: ListenerSetter,\n openSide: string,\n onContextElement: HTMLElement,\n onOpen?: () => boolean\n }) {\n this.sendMenuButtons = [{\n icon: 'mute',\n text: 'Chat.Send.WithoutSound',\n onClick: options.onSilentClick,\n verify: () => this.type === 'schedule'\n }, {\n icon: 'schedule',\n text: 'Chat.Send.ScheduledMessage',\n onClick: options.onScheduleClick,\n verify: () => this.type === 'schedule'\n }, {\n icon: 'schedule',\n text: 'Chat.Send.SetReminder',\n onClick: options.onScheduleClick,\n verify: () => this.type === 'reminder'\n }];\n\n this.sendMenu = ButtonMenuSync({buttons: this.sendMenuButtons, listenerSetter: options.listenerSetter});\n this.sendMenu.classList.add('menu-send', options.openSide);\n\n attachContextMenuListener({\n element: options.onContextElement,\n callback: (e) => {\n if(options.onOpen && !options.onOpen()) {\n return;\n }\n\n this.sendMenuButtons.forEach((button) => {\n button.element.classList.toggle('hide', !button.verify());\n });\n\n cancelEvent(e);\n contextMenuController.openBtnMenu(this.sendMenu);\n },\n listenerSetter: options.listenerSetter\n });\n }\n\n public setPeerId(peerId: PeerId) {\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\n }\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from '../chat/chat';\nimport PopupElement from '.';\nimport CheckboxField from '../checkboxField';\nimport InputField from '../inputField';\nimport RadioField from '../radioField';\nimport Scrollable from '../scrollable';\nimport SendContextMenu from '../chat/sendContextMenu';\nimport I18n, {_i18n} from '../../lib/langPack';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {Poll} from '../../layer';\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\n\nconst MAX_LENGTH_QUESTION = 255;\nconst MAX_LENGTH_OPTION = 100;\nconst MAX_LENGTH_SOLUTION = 200;\n\nexport default class PopupCreatePoll extends PopupElement {\n private questionInputField: InputField;\n private questions: HTMLElement;\n protected scrollable: Scrollable;\n private tempId = 0;\n\n private anonymousCheckboxField: CheckboxField;\n private multipleCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\n private quizCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\n\n private correctAnswers: Uint8Array[];\n private quizSolutionField: InputField;\n private optionInputFields: InputField[];\n\n constructor(private chat: Chat) {\n super('popup-create-poll popup-new-media', {closable: true, withConfirm: 'Create', body: true, title: 'NewPoll'});\n this.construct();\n }\n\n private async construct() {\n this.questionInputField = new InputField({\n placeholder: 'AskAQuestion',\n label: 'AskAQuestion',\n name: 'question',\n maxLength: MAX_LENGTH_QUESTION\n });\n\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\n this.handleChange();\n });\n\n this.optionInputFields = [];\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.header.append(this.questionInputField.container);\n\n const hr = document.createElement('hr');\n const d = document.createElement('div');\n d.classList.add('caption');\n _i18n(d, 'PollOptions');\n\n this.questions = document.createElement('form');\n this.questions.classList.add('poll-create-questions');\n\n const dd = document.createElement('div');\n dd.classList.add('poll-create-settings');\n\n const settingsCaption = document.createElement('div');\n settingsCaption.classList.add('caption');\n _i18n(settingsCaption, 'Settings');\n\n if(!(await this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))) {\n this.anonymousCheckboxField = new CheckboxField({\n text: 'NewPoll.Anonymous',\n name: 'anonymous'\n });\n this.anonymousCheckboxField.input.checked = true;\n dd.append(this.anonymousCheckboxField.label);\n }\n\n this.multipleCheckboxField = new CheckboxField({\n text: 'NewPoll.MultipleChoice',\n name: 'multiple'\n });\n this.quizCheckboxField = new CheckboxField({\n text: 'NewPoll.Quiz',\n name: 'quiz'\n });\n\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\n const checked = this.multipleCheckboxField.input.checked;\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\n });\n\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\n const checked = this.quizCheckboxField.input.checked;\n\n (Array.from(this.questions.children) as HTMLElement[]).map((el) => {\n el.classList.toggle('radio-field', checked);\n });\n\n if(!checked) {\n this.correctAnswers = undefined;\n this.quizSolutionField.setValueSilently('');\n }\n\n quizElements.forEach((el) => el.classList.toggle('hide', !checked));\n\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\n this.handleChange();\n });\n\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\n\n const quizElements: HTMLElement[] = [];\n\n const quizSolutionCaption = document.createElement('div');\n quizSolutionCaption.classList.add('caption');\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\n\n const quizHr = document.createElement('hr');\n\n const quizSolutionContainer = document.createElement('div');\n quizSolutionContainer.classList.add('poll-create-questions');\n\n this.quizSolutionField = new InputField({\n placeholder: 'NewPoll.Explanation.Placeholder',\n label: 'NewPoll.Explanation.Placeholder',\n name: 'solution',\n maxLength: MAX_LENGTH_SOLUTION\n });\n\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\n this.handleChange();\n });\n\n const quizSolutionSubtitle = document.createElement('div');\n quizSolutionSubtitle.classList.add('subtitle');\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\n\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\n\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\n quizElements.forEach((el) => el.classList.add('hide'));\n\n this.body.parentElement.insertBefore(hr, this.body);\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\n\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\n\n this.scrollable = new Scrollable(this.body);\n this.appendMoreField();\n\n this.onEscape = () => {\n return !this.getFilledAnswers().length;\n };\n\n this.handleChange();\n }\n\n private getFilledAnswers() {\n const answers = Array.from(this.questions.children).map((el, idx) => {\n const input = el.querySelector('.input-field-input') as HTMLElement;\n return input instanceof HTMLInputElement ? input.value : getRichValueWithCaret(input, false, false).value;\n }).filter((v) => !!v.trim());\n\n return answers;\n }\n\n private onSubmitClick = () => {\n this.send();\n };\n\n private validate() {\n const question = this.questionInputField.value;\n if(!question) {\n return false;\n }\n\n if(question.length > MAX_LENGTH_QUESTION) {\n return false;\n }\n\n if(this.quizCheckboxField.input.checked && !this.correctAnswers?.length) {\n return false;\n }\n\n const answers = this.getFilledAnswers();\n if(answers.length < 2) {\n return false;\n }\n\n const tooLongOption = answers.find((a) => a.length > MAX_LENGTH_OPTION);\n if(tooLongOption) {\n return false;\n }\n\n const {value: quizSolution} = getRichValueWithCaret(this.quizSolutionField.input, false, false);\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\n return false;\n }\n\n return true;\n }\n\n private handleChange() {\n const valid = this.validate();\n this.btnConfirm.toggleAttribute('disabled', !valid);\n }\n\n public async send(force = false) {\n const question = this.questionInputField.value;\n\n const answers = this.getFilledAnswers();\n\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValueWithCaret(this.quizSolutionField.input, true, false);\n\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n\n return;\n }\n\n this.hide();\n\n // const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\n // const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\n\n const pFlags: Poll['pFlags'] = {};\n\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\n pFlags.public_voters = true;\n }\n\n if(this.multipleCheckboxField.input.checked) {\n pFlags.multiple_choice = true;\n }\n\n if(this.quizCheckboxField.input.checked) {\n pFlags.quiz = true;\n }\n\n const poll: Poll = {\n _: 'poll',\n pFlags,\n question,\n answers: answers.map((value, idx) => {\n return {\n _: 'pollAnswer',\n text: value,\n option: new Uint8Array([idx])\n };\n }),\n id: undefined\n };\n // poll.id = randomIDS;\n\n const inputMediaPoll = await this.chat.managers.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\n\n // console.log('Will try to create poll:', inputMediaPoll);\n\n this.chat.managers.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\n ...this.chat.getMessageSendingParams()\n });\n\n if(this.chat.input.helperType === 'reply') {\n this.chat.input.clearHelper();\n }\n\n this.chat.input.onMessageSent(false, false);\n }\n\n onInput = (e: Event) => {\n const target = e.target as HTMLInputElement;\n\n const radioLabel = findUpTag(target, 'LABEL');\n const isEmpty = isInputEmpty(target);\n if(!isEmpty) {\n target.parentElement.classList.add('is-filled');\n radioLabel.classList.remove('hidden-widget');\n radioLabel.firstElementChild.removeAttribute('disabled');\n }\n\n const isLast = !radioLabel.nextElementSibling;\n if(isLast && !isEmpty && this.questions.childElementCount < 10) {\n this.appendMoreField();\n }\n\n this.handleChange();\n };\n\n onDeleteClick = (e: MouseEvent) => {\n const target = e.target as HTMLSpanElement;\n const label = findUpTag(target, 'LABEL');\n const idx = whichChild(label);\n\n if(this.correctAnswers && this.correctAnswers[0][0] === idx) {\n this.correctAnswers = undefined;\n }\n\n label.remove();\n this.optionInputFields.splice(idx, 1);\n\n this.optionInputFields.forEach((inputField, idx) => {\n inputField.options.labelOptions.length = 0;\n inputField.options.labelOptions.push(idx + 1);\n const i18nElement = I18n.weakMap.get(inputField.label.firstElementChild as HTMLElement);\n i18nElement.update();\n });\n\n this.handleChange();\n };\n\n private appendMoreField() {\n const tempId = this.tempId++;\n const idx = this.questions.childElementCount + 1;\n const questionField = new InputField({\n placeholder: 'NewPoll.OptionsAddOption',\n label: 'NewPoll.OptionLabel',\n labelOptions: [idx],\n name: 'question-' + tempId,\n maxLength: MAX_LENGTH_OPTION\n });\n this.listenerSetter.add(questionField.input)('input', this.onInput);\n\n const radioField = new RadioField({\n text: '',\n name: 'question'\n });\n radioField.main.append(questionField.container);\n attachClickEvent(questionField.input, cancelEvent, {listenerSetter: this.listenerSetter});\n radioField.label.classList.add('hidden-widget');\n radioField.input.disabled = true;\n if(!this.quizCheckboxField.input.checked) {\n radioField.label.classList.remove('radio-field');\n }\n this.listenerSetter.add(radioField.input)('change', () => {\n const checked = radioField.input.checked;\n if(checked) {\n const idx = whichChild(radioField.label);\n this.correctAnswers = [new Uint8Array([idx])];\n this.handleChange();\n }\n });\n\n const deleteBtn = document.createElement('span');\n deleteBtn.classList.add('btn-icon', 'tgico-close');\n questionField.container.append(deleteBtn);\n\n attachClickEvent(deleteBtn, this.onDeleteClick, {listenerSetter: this.listenerSetter, once: true});\n\n this.questions.append(radioField.label);\n\n this.scrollable.scrollIntoViewNew({\n element: this.questions.lastElementChild as HTMLElement,\n position: 'center'\n });\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\n\n this.optionInputFields.push(questionField);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from './schedulers/pause';\nimport {makeMediaSize} from './mediaSize';\nimport scaleMediaElement from './canvas/scaleMediaElement';\nimport preloadVideo from './preloadVideo';\n\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\n let width: number, height: number;\n if(media instanceof HTMLVideoElement) {\n width = media.videoWidth;\n height = media.videoHeight;\n } else {\n width = media.naturalWidth;\n height = media.naturalHeight;\n }\n\n return scaleMediaElement({\n media,\n mediaSize: makeMediaSize(width, height),\n boxSize: makeMediaSize(320, 240),\n quality: .9\n });\n}\n\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\n return new Promise((resolve, reject) => {\n video.onseeked = () => {\n video.onseeked = () => {\n createPosterFromMedia(video).then(resolve);\n\n video.onseeked = undefined;\n };\n\n video.currentTime = 0;\n };\n\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n });\n}\n\nexport async function createPosterForVideo(url: string) {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise,\n createPosterFromVideo(video)\n ]);\n}\n\n\n","/**\n * @returns duration in ms\n */\nexport default function getGifDuration(image: HTMLImageElement) {\n const src = image.src;\n\n return fetch(src)\n .then((response) => response.arrayBuffer())\n .then((arrayBuffer) => {\n const d = new Uint8Array(arrayBuffer);\n // Thanks to http://justinsomnia.org/2006/10/gif-animation-duration-calculation/\n // And http://www.w3.org/Graphics/GIF/spec-gif89a.txt\n let duration = 0;\n for(let i = 0, length = d.length; i < length; ++i) {\n // Find a Graphic Control Extension hex(21F904__ ____ __00)\n if(d[i] == 0x21 &&\n d[i + 1] == 0xF9 &&\n d[i + 2] == 0x04 &&\n d[i + 7] == 0x00) {\n // Swap 5th and 6th bytes to get the delay per frame\n const delay = (d[i + 5] << 8) | (d[i + 4] & 0xFF);\n\n // Should be aware browsers have a minimum frame delay\n // e.g. 6ms for IE, 2ms modern browsers (50fps)\n duration += delay < 2 ? 10 : delay;\n }\n }\n\n return duration / 1000;\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {USING_BOMS} from '../helpers/dom/richInputHandler';\nimport BOM from '../helpers/string/bom';\nimport {_i18n} from '../lib/langPack';\nimport InputField, {InputFieldOptions} from './inputField';\nimport SetTransition from './singleTransition';\n\nconst USELESS_REG_EXP = new RegExp(`(${BOM})|()`, 'g');\n\nexport default class InputFieldAnimated extends InputField {\n public inputFake: HTMLElement;\n public onChangeHeight: (height: number) => void;\n\n // public onLengthChange: (length: number, isOverflow: boolean) => void;\n // protected wasInputFakeClientHeight: number;\n // protected showScrollDebounced: () => void;\n\n constructor(options?: InputFieldOptions) {\n super(options);\n\n this.input.addEventListener('input', () => {\n this.updateInnerHTML();\n this.onFakeInput();\n });\n\n if(options.placeholder) {\n _i18n(this.inputFake, options.placeholder, undefined, 'placeholder');\n }\n\n this.input.classList.add('scrollable', 'scrollable-y', 'no-scrollbar');\n // this.wasInputFakeClientHeight = 0;\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\n this.inputFake = document.createElement('div');\n // this.inputFake.contentEditable = 'true';\n this.inputFake.contentEditable = 'true';\n this.inputFake.tabIndex = -1;\n this.inputFake.className = this.input.className + ' input-field-input-fake';\n }\n\n public onFakeInput(setHeight = true) {\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\n this.showScrollDebounced();\n } */\n\n const currentHeight = +this.input.style.height.replace('px', '');\n if(currentHeight === newHeight) {\n return;\n }\n\n const TRANSITION_DURATION_FACTOR = 50;\n const transitionDuration = Math.round(\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight))\n );\n\n // this.wasInputFakeClientHeight = clientHeight;\n this.input.style.transitionDuration = `${transitionDuration}ms`;\n\n if(setHeight) {\n this.onChangeHeight?.(newHeight);\n this.input.style.height = newHeight ? newHeight + 'px' : '';\n }\n\n const className = 'is-changing-height';\n SetTransition({\n element: this.input,\n className,\n forwards: true,\n duration: transitionDuration,\n onTransitionEnd: () => {\n this.input.classList.remove(className);\n }\n });\n }\n\n protected updateInnerHTML(innerHTML = this.input.innerHTML) {\n innerHTML = innerHTML.replace(//, '')\n .replace(/().+?\\/custom-emoji-element>/g, '$1')\n\n if(USING_BOMS) {\n innerHTML = innerHTML.replace(USELESS_REG_EXP, '');\n }\n\n this.inputFake.innerHTML = innerHTML;\n }\n\n public setValueSilently(value: Parameters[0], fromSet?: boolean) {\n super.setValueSilently(value, fromSet);\n\n this.updateInnerHTML();\n if(!fromSet) {\n this.onFakeInput();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from '../chat/chat';\nimport type {SendFileDetails} from '../../lib/appManagers/appMessagesManager';\nimport InputField from '../inputField';\nimport PopupElement from '.';\nimport Scrollable from '../scrollable';\nimport {toast} from '../toast';\nimport CheckboxField from '../checkboxField';\nimport SendContextMenu from '../chat/sendContextMenu';\nimport {createPosterFromMedia, createPosterFromVideo} from '../../helpers/createPoster';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport I18n, {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\nimport calcImageInBox from '../../helpers/calcImageInBox';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport getGifDuration from '../../helpers/getGifDuration';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport prepareAlbum from '../prepareAlbum';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport {ThumbCache} from '../../lib/storages/thumbs';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport {THUMB_TYPE_FULL} from '../../lib/mtproto/mtproto_config';\nimport wrapDocument from '../wrappers/document';\nimport createContextMenu from '../../helpers/dom/createContextMenu';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport wrapMediaSpoiler, {toggleMediaSpoiler} from '../wrappers/mediaSpoiler';\nimport {MiddlewareHelper} from '../../helpers/middleware';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport scaleMediaElement from '../../helpers/canvas/scaleMediaElement';\nimport {doubleRaf} from '../../helpers/schedulers';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport {Photo, PhotoSize} from '../../layer';\nimport {getPreviewBytesFromURL} from '../../helpers/bytes/getPreviewURLFromBytes';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport partition from '../../helpers/array/partition';\nimport InputFieldAnimated from '../inputFieldAnimated';\n\ntype SendFileParams = SendFileDetails & {\n file?: File,\n scaledBlob?: Blob,\n noSound?: boolean,\n itemDiv: HTMLElement,\n mediaSpoiler?: HTMLElement,\n middlewareHelper: MiddlewareHelper\n // strippedBytes?: PhotoSize.photoStrippedSize['bytes']\n};\n\nlet currentPopup: PopupNewMedia;\n\nconst MAX_WIDTH = 400 - 16;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private mediaContainer: HTMLElement;\n private wasInputValue: string;\n\n private willAttach: Partial<{\n type: 'media' | 'document',\n isMedia: true,\n group: boolean,\n sendFileDetails: SendFileParams[]\n }>;\n private messageInputField: InputFieldAnimated;\n private captionLengthMax: number;\n\n private animationGroup: AnimationItemGroup;\n private _scrollable: Scrollable;\n private inputContainer: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private files: File[],\n willAttachType: PopupNewMedia['willAttach']['type'],\n private ignoreInputValue?: boolean\n ) {\n super('popup-send-photo popup-new-media', {\n closable: true,\n withConfirm: 'Modal.Send',\n confirmShortcutIsSendShortcut: true,\n body: true,\n title: true,\n scrollable: true\n });\n\n this.animationGroup = '';\n this.construct(willAttachType);\n }\n\n private async construct(willAttachType: PopupNewMedia['willAttach']['type']) {\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: true\n };\n\n const captionMaxLength = await this.managers.apiManager.getLimit('caption');\n this.captionLengthMax = captionMaxLength;\n\n attachClickEvent(this.btnConfirm, () => this.send(), {listenerSetter: this.listenerSetter});\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm,\n listenerSetter: this.listenerSetter\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n const btnMenu = await ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'image',\n text: 'Popup.Attach.AsMedia',\n onClick: () => this.changeType('media'),\n verify: () => this.hasAnyMedia() && this.willAttach.type === 'document'\n }, {\n icon: 'document',\n text: 'SendAsFile',\n onClick: () => this.changeType('document'),\n verify: () => this.files.length === 1 && this.willAttach.type !== 'document'\n }, {\n icon: 'document',\n text: 'SendAsFiles',\n onClick: () => this.changeType('document'),\n verify: () => this.files.length > 1 && this.willAttach.type !== 'document'\n }, {\n icon: 'groupmedia',\n text: 'Popup.Attach.GroupMedia',\n onClick: () => this.changeGroup(true),\n verify: () => !this.willAttach.group && this.canGroupSomething()\n }, {\n icon: 'groupmediaoff',\n text: 'Popup.Attach.UngroupMedia',\n onClick: () => this.changeGroup(false),\n verify: () => this.willAttach.group && this.canGroupSomething()\n }, {\n icon: 'mediaspoiler',\n text: 'EnablePhotoSpoiler',\n onClick: () => this.changeSpoilers(true),\n verify: () => this.canToggleSpoilers(true, true)\n }, {\n icon: 'mediaspoiler',\n text: 'Popup.Attach.EnableSpoilers',\n onClick: () => this.changeSpoilers(true),\n verify: () => this.canToggleSpoilers(true, false)\n }, {\n icon: 'mediaspoileroff',\n text: 'DisablePhotoSpoiler',\n onClick: () => this.changeSpoilers(false),\n verify: () => this.canToggleSpoilers(false, true)\n }, {\n icon: 'mediaspoileroff',\n text: 'Popup.Attach.RemoveSpoilers',\n onClick: () => this.changeSpoilers(false),\n verify: () => this.canToggleSpoilers(false, false)\n }]\n });\n\n this.header.append(btnMenu);\n\n this.btnConfirm.remove();\n\n this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n this.scrollable.container.append(this.mediaContainer);\n\n const inputContainer = this.inputContainer = document.createElement('div');\n inputContainer.classList.add('popup-input-container');\n\n const c = document.createElement('div');\n c.classList.add('popup-input-inputs', 'input-message-container');\n\n this.messageInputField = new InputFieldAnimated({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n name: 'message',\n withLinebreaks: true,\n maxLength: this.captionLengthMax\n });\n\n this.listenerSetter.add(this.scrollable.container)('scroll', this.onScroll);\n this.listenerSetter.add(this.messageInputField.input)('scroll', this.onScroll);\n\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\n\n c.append(this.messageInputField.input, this.messageInputField.inputFake);\n inputContainer.append(c, this.btnConfirm);\n\n if(!this.ignoreInputValue) {\n this.messageInputField.value = this.wasInputValue = this.chat.input.messageInputField.input.innerHTML;\n this.chat.input.messageInputField.value = '';\n }\n\n this.container.append(inputContainer);\n\n this.attachFiles();\n\n this.addEventListener('close', () => {\n this.files.length = 0;\n this.willAttach.sendFileDetails.length = 0;\n\n if(currentPopup === this) {\n currentPopup = undefined;\n }\n });\n\n let target: HTMLElement, isMedia: boolean, item: SendFileParams;\n createContextMenu({\n buttons: [{\n icon: 'mediaspoiler',\n text: 'EnablePhotoSpoiler',\n onClick: () => {\n this.applyMediaSpoiler(item);\n },\n verify: () => isMedia && !item.mediaSpoiler\n }, {\n icon: 'mediaspoileroff',\n text: 'DisablePhotoSpoiler',\n onClick: () => {\n this.removeMediaSpoiler(item);\n },\n verify: () => !!(isMedia && item.mediaSpoiler)\n }],\n listenTo: this.mediaContainer,\n listenerSetter: this.listenerSetter,\n findElement: (e) => {\n target = findUpClassName(e.target, 'popup-item');\n isMedia = target.classList.contains('popup-item-media');\n item = this.willAttach.sendFileDetails.find((i) => i.itemDiv === target);\n return target;\n }\n });\n\n currentPopup = this;\n }\n\n private onScroll = () => {\n const {input} = this.messageInputField;\n this.scrollable.onAdditionalScroll();\n if(input.scrollTop > 0 && input.scrollHeight > 130) {\n this.scrollable.container.classList.remove('scrolled-bottom');\n }\n };\n\n private async applyMediaSpoiler(item: SendFileParams, noAnimation?: boolean) {\n const middleware = item.middlewareHelper.get();\n const {width: widthStr, height: heightStr} = item.itemDiv.style;\n\n let width: number, height: number;\n if(item.itemDiv.classList.contains('album-item')) {\n const {width: containerWidthStr, height: containerHeightStr} = item.itemDiv.parentElement.style;\n const containerWidth = parseInt(containerWidthStr);\n const containerHeight = parseInt(containerHeightStr);\n\n width = +widthStr.slice(0, -1) / 100 * containerWidth;\n height = +heightStr.slice(0, -1) / 100 * containerHeight;\n } else {\n width = parseInt(widthStr);\n height = parseInt(heightStr);\n }\n\n const {url} = await scaleMediaElement({\n media: item.itemDiv.firstElementChild as HTMLImageElement,\n boxSize: makeMediaSize(40, 40),\n mediaSize: makeMediaSize(width, height),\n toDataURL: true,\n quality: 0.2\n });\n\n const strippedBytes = getPreviewBytesFromURL(url);\n const photoSize: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: strippedBytes,\n type: 'i'\n };\n\n item.strippedBytes = strippedBytes;\n\n const photo: Photo.photo = {\n _: 'photo',\n sizes: [\n photoSize\n ],\n id: 0,\n access_hash: 0,\n date: 0,\n dc_id: 0,\n file_reference: []\n };\n\n const mediaSpoiler = await wrapMediaSpoiler({\n middleware,\n width,\n height,\n animationGroup: this.animationGroup,\n media: photo\n });\n\n if(!middleware()) {\n return;\n }\n\n if(!noAnimation) {\n mediaSpoiler.classList.add('is-revealing');\n }\n\n item.mediaSpoiler = mediaSpoiler;\n item.itemDiv.append(mediaSpoiler);\n\n await doubleRaf();\n if(!middleware()) {\n return;\n }\n\n toggleMediaSpoiler({\n mediaSpoiler,\n reveal: false\n });\n }\n\n private removeMediaSpoiler(item: SendFileParams) {\n toggleMediaSpoiler({\n mediaSpoiler: item.mediaSpoiler,\n reveal: true,\n destroyAfter: true\n });\n\n item.mediaSpoiler = undefined;\n }\n\n public appendDrops(element: HTMLElement) {\n this.body.append(element);\n }\n\n get type() {\n return this.willAttach.type;\n }\n\n set type(type: PopupNewMedia['willAttach']['type']) {\n this.willAttach.type = type;\n }\n\n private partition() {\n const [media, files] = partition(this.willAttach.sendFileDetails, (d) => MEDIA_MIME_TYPES_SUPPORTED.has(d.file.type));\n return {\n media,\n files\n };\n }\n\n private mediaCount() {\n return this.partition().media.length;\n }\n\n private hasAnyMedia() {\n return this.mediaCount() > 0;\n }\n\n private canGroupSomething() {\n const {media, files} = this.partition();\n return media.length > 1 || files.length > 1;\n }\n\n private canToggleSpoilers(toggle: boolean, single: boolean) {\n let good = this.willAttach.type === 'media' && this.hasAnyMedia();\n if(single && good) {\n good = this.files.length === 1;\n }\n\n if(good) {\n const media = this.willAttach.sendFileDetails\n .filter((d) => MEDIA_MIME_TYPES_SUPPORTED.has(d.file.type))\n const mediaWithSpoilers = media.filter((d) => d.mediaSpoiler);\n\n good = single ? true : media.length > 1;\n\n if(good) {\n good = toggle ? media.length !== mediaWithSpoilers.length : media.length === mediaWithSpoilers.length;\n }\n }\n\n return good;\n }\n\n private changeType(type: PopupNewMedia['willAttach']['type']) {\n this.willAttach.type = type;\n this.attachFiles();\n }\n\n public changeGroup(group: boolean) {\n this.willAttach.group = group;\n this.attachFiles();\n }\n\n public changeSpoilers(toggle: boolean) {\n this.partition().media.forEach((item) => {\n if(toggle && !item.mediaSpoiler) {\n this.applyMediaSpoiler(item);\n } else if(!toggle && item.mediaSpoiler) {\n this.removeMediaSpoiler(item);\n }\n });\n }\n\n public addFiles(files: File[]) {\n const toPush = files.filter((file) => {\n const found = this.files.find((_file) => {\n return _file.lastModified === file.lastModified && _file.name === file.name && _file.size === file.size;\n });\n\n return !found;\n });\n\n if(toPush.length) {\n this.files.push(...toPush);\n this.attachFiles();\n }\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n const {input} = this.messageInputField;\n if(target !== input) {\n if(target.tagName === 'INPUT' || target.isContentEditable) {\n return;\n }\n\n input.focus();\n placeCaretAtEnd(input);\n }\n };\n\n private send(force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n\n return;\n }\n\n let caption = this.messageInputField.value;\n if(caption.length > this.captionLengthMax) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' || undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n const {peerId, input} = this.chat;\n\n const {length} = sendFileDetails;\n const sendingParams = this.chat.getMessageSendingParams();\n this.iterate((sendFileParams) => {\n if(caption && sendFileParams.length !== length) {\n this.managers.appMessagesManager.sendText(peerId, caption, {\n ...sendingParams,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const d: SendFileDetails[] = sendFileParams.map((params) => {\n return {\n ...params,\n file: params.scaledBlob || params.file,\n spoiler: !!params.mediaSpoiler\n };\n });\n\n const w = {\n ...willAttach,\n sendFileDetails: d\n };\n\n this.managers.appMessagesManager.sendAlbum(peerId, Object.assign({\n ...sendingParams,\n caption,\n isMedia,\n clearDraft: true\n }, w));\n\n caption = undefined;\n });\n\n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n this.wasInputValue = undefined;\n\n this.hide();\n }\n\n private modifyMimeTypeForTelegram(mimeType: string) {\n return mimeType === 'image/webp' ? 'image/jpeg' : mimeType;\n }\n\n private async scaleImageForTelegram(image: HTMLImageElement, mimeType: string, convertWebp?: boolean) {\n const PHOTO_SIDE_LIMIT = 2560;\n let url = image.src, scaledBlob: Blob;\n if(\n mimeType !== 'image/gif' &&\n (Math.max(image.naturalWidth, image.naturalHeight) > PHOTO_SIDE_LIMIT || (convertWebp && mimeType === 'image/webp'))\n ) {\n const {blob} = await scaleMediaElement({\n media: image,\n boxSize: makeMediaSize(PHOTO_SIDE_LIMIT, PHOTO_SIDE_LIMIT),\n mediaSize: makeMediaSize(image.naturalWidth, image.naturalHeight),\n mimeType: this.modifyMimeTypeForTelegram(mimeType) as any\n });\n\n scaledBlob = blob;\n URL.revokeObjectURL(url);\n url = await apiManagerProxy.invoke('createObjectURL', blob);\n await renderImageFromUrlPromise(image, url);\n }\n\n return scaledBlob && {url, blob: scaledBlob};\n }\n\n private async attachMedia(params: SendFileParams) {\n const {itemDiv} = params;\n itemDiv.classList.add('popup-item-media');\n\n const file = params.file;\n const isVideo = file.type.startsWith('video/');\n\n if(isVideo) {\n const video = createVideo();\n video.src = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n video.autoplay = true;\n video.controls = false;\n video.muted = true;\n\n video.addEventListener('timeupdate', () => {\n video.pause();\n }, {once: true});\n\n itemDiv.append(video);\n\n let error: Error;\n try {\n await onMediaLoad(video);\n } catch(err) {\n error = err as any;\n }\n\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n\n if(error) {\n throw error;\n }\n\n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n const thumb = await createPosterFromVideo(video);\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n } else {\n const img = new Image();\n itemDiv.append(img);\n const url = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n\n await renderImageFromUrlPromise(img, url);\n const mimeType = params.file.type;\n const scaled = await this.scaleImageForTelegram(img, mimeType, true);\n if(scaled) {\n params.objectURL = scaled.url;\n params.scaledBlob = scaled.blob;\n }\n\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n\n if(file.type === 'image/gif') {\n params.noSound = true;\n\n return Promise.all([\n getGifDuration(img).then((duration) => {\n params.duration = Math.ceil(duration);\n }),\n\n createPosterFromMedia(img).then(async(thumb) => {\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n })\n ]).then(() => {});\n }\n }\n }\n\n private async attachDocument(params: SendFileParams): ReturnType {\n const {itemDiv} = params;\n itemDiv.classList.add('popup-item-document');\n const file = params.file;\n\n const isPhoto = file.type.startsWith('image/');\n const isAudio = file.type.startsWith('audio/');\n if(isPhoto || isAudio || file.size < 20e6) {\n params.objectURL ||= await apiManagerProxy.invoke('createObjectURL', file);\n }\n\n let img: HTMLImageElement;\n if(isPhoto) {\n img = new Image();\n await renderImageFromUrlPromise(img, params.objectURL);\n const scaled = await this.scaleImageForTelegram(img, params.file.type);\n if(scaled) {\n params.objectURL = scaled.url;\n }\n }\n\n const doc = {\n _: 'document',\n file: file,\n file_name: file.name || '',\n size: file.size,\n type: isPhoto ? 'photo' : 'doc'\n } as MyDocument;\n\n let cacheContext: ThumbCache;\n if(params.objectURL) {\n cacheContext = {\n url: params.objectURL,\n downloaded: file.size,\n type: THUMB_TYPE_FULL\n };\n }\n\n const docDiv = await wrapDocument({\n message: {\n _: 'message',\n pFlags: {\n is_outgoing: true\n },\n mid: 0,\n peerId: 0,\n media: {\n _: 'messageMediaDocument',\n document: doc\n }\n } as any,\n cacheContext\n });\n\n if(isPhoto) {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n }\n\n itemDiv.append(docDiv);\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n const params: SendFileParams = {\n file\n } as any;\n\n // do not pass these properties to worker\n defineNotNumerableProperties(params, ['scaledBlob', 'middlewareHelper', 'itemDiv', 'mediaSpoiler']);\n\n params.middlewareHelper = this.middlewareHelper.get().create();\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(params) : this.attachDocument(params);\n willAttach.sendFileDetails.push(params);\n return promise.catch((err) => {\n itemDiv.style.backgroundColor = '#000';\n console.error('error rendering file', err);\n });\n };\n\n private shouldCompress(mimeType: string) {\n return this.willAttach.type === 'media' && MEDIA_MIME_TYPES_SUPPORTED.has(mimeType);\n }\n\n private onRender() {\n // show now\n if(!this.element.classList.contains('active')) {\n this.listenerSetter.add(document.body)('keydown', this.onKeyDown);\n !this.ignoreInputValue && this.addEventListener('close', () => {\n if(this.wasInputValue) {\n this.chat.input.messageInputField.value = this.wasInputValue;\n }\n });\n this.show();\n }\n }\n\n private setTitle() {\n const {willAttach, title, files} = this;\n let key: LangPackKey;\n const args: FormatterArguments = [];\n if(willAttach.type === 'document') {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else {\n let foundPhotos = 0, foundVideos = 0, foundFiles = 0;\n files.forEach((file) => {\n if(file.type.startsWith('image/')) ++foundPhotos;\n else if(file.type.startsWith('video/')) ++foundVideos;\n else ++foundFiles;\n });\n\n if([foundPhotos, foundVideos, foundFiles].filter((n) => n > 0).length > 1) {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else\n\n /* const sum = foundPhotos + foundVideos;\n if(sum > 1 && willAttach.group) {\n key = 'PreviewSender.SendAlbum';\n const albumsLength = Math.ceil(sum / 10);\n args.push(albumsLength);\n } else */if(foundPhotos) {\n key = 'PreviewSender.SendPhoto';\n args.push(foundPhotos);\n } else if(foundVideos) {\n key = 'PreviewSender.SendVideo';\n args.push(foundVideos);\n }\n }\n\n replaceContent(title, i18n(key, args));\n }\n\n private appendMediaToContainer(params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, MAX_WIDTH, 320);\n params.itemDiv.style.width = size.width + 'px';\n params.itemDiv.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(params.itemDiv);\n }\n\n private iterate(cb: (sendFileDetails: SendFileParams[]) => void) {\n const {sendFileDetails} = this.willAttach;\n if(!this.willAttach.group) {\n sendFileDetails.forEach((p) => cb([p]));\n return;\n }\n\n const length = sendFileDetails.length;\n for(let i = 0; i < length;) {\n const firstType = sendFileDetails[i].file.type;\n let k = 0;\n for(; k < 10 && i < length; ++i, ++k) {\n const type = sendFileDetails[i].file.type;\n if(this.shouldCompress(firstType) !== this.shouldCompress(type)) {\n break;\n }\n }\n\n cb(sendFileDetails.slice(i - k, i));\n }\n }\n\n private attachFiles() {\n const {files, willAttach, mediaContainer} = this;\n\n const oldSendFileDetails = willAttach.sendFileDetails.splice(0, willAttach.sendFileDetails.length);\n oldSendFileDetails.forEach((params) => {\n params.middlewareHelper.destroy();\n });\n\n const promises = files.map((file) => this.attachFile(file));\n\n Promise.all(promises).then(() => {\n mediaContainer.replaceChildren();\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n const shouldCompress = this.shouldCompress(sendFileDetails[0].file.type);\n if(shouldCompress && sendFileDetails.length > 1) {\n const albumContainer = document.createElement('div');\n albumContainer.classList.add('popup-item-album', 'popup-item');\n albumContainer.append(...sendFileDetails.map((s) => s.itemDiv));\n\n prepareAlbum({\n container: albumContainer,\n items: sendFileDetails.map((o) => ({w: o.width, h: o.height})),\n maxWidth: MAX_WIDTH,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params);\n });\n }\n\n if(!shouldCompress) {\n return;\n }\n\n sendFileDetails.forEach((params) => {\n const oldParams = oldSendFileDetails.find((o) => o.file === params.file);\n if(!oldParams) {\n return;\n }\n\n if(oldParams.mediaSpoiler) {\n this.applyMediaSpoiler(params, true);\n }\n });\n });\n }).then(() => {\n this.onRender();\n this.onScroll();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport fastSmoothScroll from '../fastSmoothScroll';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent, detachClickEvent} from './clickEvent';\nimport findUpAsChild from './findUpAsChild';\nimport findUpClassName from './findUpClassName';\n\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\nconst HANDLE_EVENT = 'keydown';\nconst ACTIVE_CLASS_NAME = 'active';\n\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\n\nexport type ListNavigationOptions = {\n list: HTMLElement,\n type: 'xy' | 'x' | 'y',\n onSelect: (target: Element) => void | boolean | Promise,\n once: boolean,\n waitForKey?: string[]\n};\n\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: ListNavigationOptions) {\n let waitForKeySet = waitForKey?.length ? new Set(waitForKey) : undefined;\n const keyNames = new Set(type === 'xy' ? AXIS_Y_KEYS.concat(AXIS_X_KEYS) : (type === 'x' ? AXIS_X_KEYS : AXIS_Y_KEYS));\n\n let target: Element;\n const getCurrentTarget = () => {\n return target || list.querySelector('.' + ACTIVE_CLASS_NAME) || list.firstElementChild;\n };\n\n const setCurrentTarget = (_target: Element, scrollTo: boolean) => {\n if(target === _target) {\n return;\n }\n\n let hadTarget = false;\n if(target) {\n hadTarget = true;\n target.classList.remove(ACTIVE_CLASS_NAME);\n }\n\n target = _target;\n if(!target) return;\n target.classList.add(ACTIVE_CLASS_NAME);\n\n if(hadTarget && scrollable && scrollTo) {\n fastSmoothScroll({\n container: scrollable,\n element: target as HTMLElement,\n position: 'center',\n forceDuration: 100,\n axis: type === 'x' ? 'x' : 'y'\n });\n }\n };\n\n const getNextTargetX = (currentTarget: Element, isNext: boolean) => {\n let nextTarget: Element;\n if(isNext) nextTarget = currentTarget.nextElementSibling || list.firstElementChild;\n else nextTarget = currentTarget.previousElementSibling || list.lastElementChild;\n\n return nextTarget;\n };\n\n const getNextTargetY = (currentTarget: Element, isNext: boolean) => {\n const property = isNext ? 'nextElementSibling' : 'previousElementSibling';\n const endProperty = isNext ? 'firstElementChild' : 'lastElementChild';\n const currentRect = currentTarget.getBoundingClientRect();\n\n let nextTarget = currentTarget[property] || list[endProperty];\n while(nextTarget !== currentTarget) {\n const targetRect = nextTarget.getBoundingClientRect();\n if(targetRect.x === currentRect.x && targetRect.y !== currentRect.y) {\n break;\n }\n\n nextTarget = nextTarget[property] || list[endProperty];\n }\n\n return nextTarget;\n };\n\n let handleArrowKey: (currentTarget: Element, key: ArrowKey) => Element;\n if(type === 'xy') { // flex-direction: row; flex-wrap: wrap;\n handleArrowKey = (currentTarget, key) => {\n if(key === 'ArrowUp' || key === 'ArrowDown') return getNextTargetY(currentTarget, key === 'ArrowDown');\n else return getNextTargetX(currentTarget, key === 'ArrowRight');\n };\n } else { // flex-direction: row | column;\n handleArrowKey = (currentTarget, key) => getNextTargetX(currentTarget, key === 'ArrowRight' || key === 'ArrowDown');\n }\n\n let onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n if(!keyNames.has(key as any)) {\n if(key === 'Enter' || (type !== 'xy' && key === 'Tab')) {\n cancelEvent(e);\n fireSelect(getCurrentTarget());\n }\n\n return;\n }\n\n cancelEvent(e);\n\n if(list.childElementCount > 1) {\n let currentTarget = getCurrentTarget();\n currentTarget = handleArrowKey(currentTarget, key as any);\n setCurrentTarget(currentTarget, true);\n }\n };\n\n const scrollable = findUpClassName(list, 'scrollable');\n list.classList.add('navigable-list');\n\n const onMouseMove = (e: MouseEvent) => {\n const target = findUpAsChild(e.target as HTMLElement, list) as HTMLElement;\n if(!target) {\n return;\n }\n\n setCurrentTarget(target, false);\n };\n\n const onClick = (e: Event) => {\n cancelEvent(e); // cancel keyboard closening\n\n const target = findUpAsChild(e.target as HTMLElement, list) as HTMLElement;\n if(!target) {\n return;\n }\n\n setCurrentTarget(target, false);\n fireSelect(getCurrentTarget());\n };\n\n const fireSelect = async(target: Element) => {\n const canContinue = await onSelect(target);\n if(canContinue !== undefined ? !canContinue : once) {\n detach();\n }\n };\n\n let attached = false;\n const attach = () => {\n if(attached) return;\n attached = true;\n // const input = document.activeElement as HTMLElement;\n // input.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n list.addEventListener('mousemove', onMouseMove, {passive: true});\n attachClickEvent(list, onClick);\n };\n\n const detach = () => {\n if(!attached) return;\n attached = false;\n // input.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n list.removeEventListener('mousemove', onMouseMove);\n detachClickEvent(list, onClick);\n };\n\n const resetTarget = () => {\n if(waitForKeySet) return;\n setCurrentTarget(list.firstElementChild, false);\n };\n\n if(waitForKeySet) {\n const _onKeyDown = onKeyDown;\n onKeyDown = (e) => {\n if(waitForKeySet.has(e.key)) {\n cancelEvent(e);\n\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n onKeyDown = _onKeyDown;\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n\n waitForKeySet = undefined;\n resetTarget();\n }\n };\n } else {\n resetTarget();\n }\n\n attach();\n\n return {\n attach,\n detach,\n resetTarget\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport attachListNavigation, {ListNavigationOptions} from '../../helpers/dom/attachListNavigation';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport rootScope from '../../lib/rootScope';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport SetTransition from '../singleTransition';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport safeAssign from '../../helpers/object/safeAssign';\n\nexport default class AutocompleteHelper extends EventListenerBase<{\n hidden: () => void,\n visible: () => void,\n hiding: () => void\n}> {\n protected hidden = true;\n protected container: HTMLElement;\n protected list: HTMLElement;\n protected resetTarget: () => void;\n protected attach: () => void;\n protected detach: () => void;\n protected init?(): void;\n\n protected controller: AutocompleteHelperController;\n protected listType: 'xy' | 'x' | 'y';\n protected onSelect: ListNavigationOptions['onSelect'];\n protected waitForKey?: string[];\n\n protected navigationItem: NavigationItem;\n\n constructor(options: {\n appendTo: HTMLElement,\n controller?: AutocompleteHelper['controller'],\n listType: AutocompleteHelper['listType'],\n onSelect: AutocompleteHelper['onSelect'],\n waitForKey?: AutocompleteHelper['waitForKey']\n }) {\n super(false);\n\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('autocomplete-helper', 'z-depth-1');\n\n options.appendTo.append(this.container);\n\n this.attachNavigation();\n\n this.controller && this.controller.addHelper(this);\n }\n\n public toggleListNavigation(enabled: boolean) {\n if(enabled) {\n this.attach && this.attach();\n } else {\n this.detach && this.detach();\n }\n }\n\n protected onVisible = () => {\n if(this.detach) { // it can be so because 'visible' calls before animation's end\n this.detach();\n }\n\n const list = this.list;\n const {attach, detach, resetTarget} = attachListNavigation({\n list,\n type: this.listType,\n onSelect: this.onSelect,\n once: true,\n waitForKey: this.waitForKey\n });\n\n this.attach = attach;\n this.detach = detach;\n this.resetTarget = resetTarget;\n if(!IS_MOBILE && !this.navigationItem) {\n this.navigationItem = {\n type: 'autocomplete-helper',\n onPop: () => {\n this.navigationItem = undefined;\n this.toggle(true);\n },\n noBlurOnPop: true\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n\n this.addEventListener('hidden', () => {\n this.resetTarget = undefined;\n this.attach = undefined;\n this.detach = undefined;\n\n list.innerHTML = '';\n detach();\n\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n }\n }, {once: true});\n };\n\n protected attachNavigation() {\n this.addEventListener('visible', this.onVisible);\n }\n\n public toggle(hide?: boolean, fromController = false, skipAnimation?: boolean) {\n if(this.init) {\n return;\n }\n\n if(hide === undefined) {\n hide = this.container.classList.contains('is-visible') && !this.container.classList.contains('backwards');\n }\n\n if(this.hidden === hide) {\n if(!hide) {\n this.dispatchEvent('visible'); // reset target and listener\n }\n\n return;\n }\n\n this.hidden = hide;\n\n if(!hide) {\n this.controller && this.controller.hideOtherHelpers(this);\n this.dispatchEvent('visible'); // fire it before so target will be set\n } else {\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n }\n\n if(!fromController && this.controller) {\n this.controller.hideOtherHelpers();\n }\n\n if(this.detach) { // force detach here\n this.detach();\n }\n }\n\n const useRafs = this.controller || hide ? 0 : 2;\n\n if(hide) {\n this.dispatchEvent('hiding');\n }\n\n SetTransition({\n element: this.container,\n className: 'is-visible',\n forwards: !hide,\n duration: rootScope.settings.animationsEnabled && !skipAnimation ? 300 : 0,\n onTransitionEnd: () => {\n this.hidden && this.dispatchEvent('hidden');\n },\n useRafs\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from './chat';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport preloadAnimatedEmojiSticker from '../../helpers/preloadAnimatedEmojiSticker';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable from '../scrollable';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\n\nexport default class StickersHelper extends AutocompleteHelper {\n private scrollable: Scrollable;\n private superStickerRenderer: SuperStickerRenderer;\n private lazyLoadQueue: LazyLoadQueue;\n private onChangeScreen: () => void;\n private listenerSetter: ListenerSetter;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n private chat: Chat,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'xy',\n onSelect: async(target) => {\n return !(await EmoticonsDropdown.onMediaClick({target}, true));\n },\n waitForKey: ['ArrowUp', 'ArrowDown']\n });\n\n this.container.classList.add('stickers-helper');\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n\n rootScope.dispatchEvent('choosing_sticker', true);\n });\n\n this.addEventListener('hidden', () => {\n if(this.onChangeScreen) {\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\n this.onChangeScreen = undefined;\n\n this.listenerSetter.removeAll();\n this.listenerSetter = undefined;\n }\n\n rootScope.dispatchEvent('choosing_sticker', false);\n });\n }\n\n public checkEmoticon(emoticon: string) {\n const middleware = this.controller.getMiddleware();\n\n if(this.lazyLoadQueue) {\n this.lazyLoadQueue.clear();\n }\n\n preloadAnimatedEmojiSticker(emoticon);\n this.managers.appStickersManager.getStickersByEmoticon(emoticon)\n .then((stickers) => {\n if(!middleware()) {\n return;\n }\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n const container = this.list.cloneNode() as HTMLElement;\n\n let ready: Promise;\n\n this.lazyLoadQueue.clear();\n if(stickers.length) {\n ready = new Promise((resolve) => {\n const promises: Promise[] = [];\n stickers.forEach((sticker) => {\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\n });\n\n (Promise.all(promises) as Promise).finally(resolve);\n });\n } else {\n ready = Promise.resolve();\n }\n\n ready.then(() => {\n this.list.replaceWith(container);\n this.list = container;\n\n if(!this.onChangeScreen) {\n this.onChangeScreen = () => {\n const width = (this.list.childElementCount * mediaSizes.active.popupSticker.width) + (this.list.childElementCount - 1 * 1);\n this.list.style.width = width + 'px';\n };\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\n\n this.listenerSetter = new ListenerSetter();\n attachStickerViewerListeners({listenTo: this.container, listenerSetter: this.listenerSetter});\n }\n\n this.onChangeScreen();\n\n this.toggle(!stickers.length);\n this.scrollable.scrollTop = 0;\n });\n });\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('stickers-helper-stickers', 'super-stickers');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n this.lazyLoadQueue = new LazyLoadQueue();\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, this.chat.animationGroup, this.managers);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\nimport Button from '../button';\nimport PopupDatePicker from './datePicker';\n\nconst getMinDate = () => {\n const date = new Date();\n // date.setDate(date.getDate() - 1);\n date.setHours(0, 0, 0, 0);\n return date;\n};\n\nconst getMaxDate = () => {\n const date = new Date();\n date.setFullYear(date.getFullYear() + 1);\n date.setDate(date.getDate() - 1);\n return date;\n};\n\nconst checkDate = (date: Date) => {\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\n};\n\nexport default class PopupSchedule extends PopupDatePicker {\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\n super(checkDate(initDate), onPick, {\n noButtons: true,\n noTitle: true,\n closable: true,\n withConfirm: true,\n minDate: getMinDate(),\n maxDate: getMaxDate(),\n withTime: true,\n showOverflowMonths: true,\n confirmShortcutIsSendShortcut: true,\n title: true\n });\n\n this.element.classList.add('popup-schedule');\n this.header.append(this.controlsDiv);\n this.title.replaceWith(this.monthTitle);\n this.body.append(this.btnConfirm);\n\n if(canSendWhenOnline) {\n const btnSendWhenOnline = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Schedule.SendWhenOnline'});\n this.body.append(btnSendWhenOnline);\n\n attachClickEvent(btnSendWhenOnline, () => {\n onPick(SEND_WHEN_ONLINE_TIMESTAMP);\n this.hide();\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport {appendEmoji, getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';\nimport {ScrollableX} from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport default class EmojiHelper extends AutocompleteHelper {\n private scrollable: ScrollableX;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'x',\n onSelect: (target) => {\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\n }\n });\n\n this.container.classList.add('emoji-helper');\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\n\n this.container.append(this.list);\n\n this.scrollable = new ScrollableX(this.container);\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollLeft = 0;\n }, 0);\n });\n }\n\n public render(emojis: string[], waitForKey: boolean) {\n if(this.init) {\n if(!emojis.length) {\n return;\n }\n\n this.init();\n this.init = null;\n }\n\n emojis = emojis.slice(0, 80);\n\n if(emojis.length) {\n this.list.innerHTML = '';\n emojis.forEach((emoji) => {\n appendEmoji(emoji, this.list, false, true);\n });\n }\n\n this.waitForKey = waitForKey ? ['ArrowUp', 'ArrowDown'] : undefined;\n this.toggle(!emojis.length);\n\n /* window.requestAnimationFrame(() => {\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\n }); */\n }\n\n public checkQuery(query: string, firstChar: string) {\n const middleware = this.controller.getMiddleware();\n this.managers.appEmojiManager.getBothEmojiKeywords().then(async() => {\n if(!middleware()) {\n return;\n }\n\n const q = query.replace(/^:/, '');\n const emojis = await this.managers.appEmojiManager.searchEmojis(q);\n if(!middleware()) {\n return;\n }\n\n this.render(emojis, firstChar !== ':');\n // console.log(emojis);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport AvatarElement from '../avatar';\nimport PeerTitle from '../peerTitle';\nimport Scrollable from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\n\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\n protected static BASE_CLASS = 'autocomplete-peer-helper';\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\n private scrollable: Scrollable;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n protected className: string,\n onSelect: (target: Element) => boolean | void\n ) {\n super({\n appendTo,\n controller,\n listType: 'y',\n onSelect\n });\n\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list', this.className + '-list');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n });\n }\n\n public render(data: {peerId: PeerId, name?: string, description?: string}[], doNotShow?: boolean) {\n if(this.init) {\n if(!data.length) {\n return;\n }\n\n this.init();\n this.init = null;\n }\n\n if(data.length) {\n this.list.innerHTML = '';\n data.forEach((d) => {\n const div = AutocompletePeerHelper.listElement({\n className: this.className,\n peerId: d.peerId,\n name: d.name,\n description: d.description\n });\n\n this.list.append(div);\n });\n }\n\n if(!doNotShow) {\n this.toggle(!data.length);\n }\n }\n\n public static listElement(options: {\n className: string,\n peerId: PeerId,\n name?: string,\n description?: string\n }) {\n const BASE = AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT;\n options.className += '-list-element';\n\n const div = document.createElement('div');\n div.classList.add(BASE, options.className);\n div.dataset.peerId = '' + options.peerId;\n\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-30', BASE + '-avatar', options.className + '-avatar');\n avatar.updateWithOptions({\n isDialog: false,\n peerId: options.peerId\n });\n\n const name = document.createElement('div');\n name.classList.add(BASE + '-name', options.className + '-name');\n if(!options.name) {\n name.append(new PeerTitle({\n peerId: options.peerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element);\n } else {\n setInnerHTML(name, wrapEmojiText(options.name));\n }\n\n div.append(avatar, name);\n\n if(options.description) {\n const description = document.createElement('div');\n description.classList.add(BASE + '-description', options.className + '-description');\n setInnerHTML(description, wrapEmojiText(options.description));\n div.append(description);\n }\n\n return div;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport type {BotInfo, ChatFull, UserFull} from '../../layer';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport SearchIndex from '../../lib/searchIndex';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport function processPeerFullForCommands(peerId: PeerId, full: ChatFull.chatFull | ChatFull.channelFull | UserFull.userFull, query?: string) {\n const botInfos: BotInfo.botInfo[] = [].concat(full.bot_info);\n let index: SearchIndex;\n\n if(query !== undefined) {\n index = new SearchIndex({\n ignoreCase: true\n });\n }\n\n type T = {peerId: PeerId, name: string, description: string, index: number, command: string};\n const commands: Map = new Map();\n botInfos.forEach((botInfo) => {\n if(!botInfo.commands) {\n return;\n }\n\n botInfo.commands.forEach(({command, description}, idx) => {\n const c = '/' + command;\n commands.set(command, {\n peerId: botInfo.user_id ? botInfo.user_id.toPeerId(false) : peerId,\n command: command,\n name: c,\n description: description,\n index: idx\n });\n\n if(index) {\n index.indexObject(command, c);\n }\n });\n });\n\n let out: T[];\n if(!index) {\n out = [...commands.values()];\n } else {\n const found = index.search(query);\n out = Array.from(found).map((command) => commands.get(command));\n }\n\n out = out.sort((a, b) => commands.get(a.command).index - commands.get(b.command).index);\n\n return out;\n}\n\nexport default class CommandsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(appendTo,\n controller,\n 'commands-helper',\n (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n });\n }\n );\n }\n\n public async checkQuery(query: string, peerId: PeerId) {\n if(!(await this.managers.appUsersManager.isBot(peerId))) {\n return false;\n }\n\n const middleware = this.controller.getMiddleware();\n this.managers.appProfileManager.getProfileByPeerId(peerId).then((full) => {\n if(!middleware()) {\n return;\n }\n\n const filtered = processPeerFullForCommands(peerId, full, query);\n this.render(filtered);\n // console.log('found commands', found, filtered);\n });\n\n return true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getMiddleware} from '../../helpers/middleware';\nimport AutocompleteHelper from './autocompleteHelper';\n\nexport default class AutocompleteHelperController {\n private helpers: Set = new Set();\n private middleware = getMiddleware();\n /* private tempId = 0;\n\n public incrementToggleCount() {\n return ++this.tempId;\n }\n\n public getToggleCount() {\n return this.tempId;\n } */\n\n public toggleListNavigation(enabled: boolean) {\n for(const helper of this.helpers) {\n helper.toggleListNavigation(enabled);\n }\n }\n\n public getMiddleware() {\n this.middleware.clean();\n return this.middleware.get();\n }\n\n public addHelper(helper: AutocompleteHelper) {\n this.helpers.add(helper);\n }\n\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\n this.helpers.forEach((helper) => {\n if(helper !== preserveHelper) {\n helper.toggle(true, true);\n }\n });\n\n if(!preserveHelper) {\n this.middleware.clean();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport type {MessageEntity} from '../../layer';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerActiveUsernames from '../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport rootScope from '../../lib/rootScope';\n\nexport default class MentionsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(\n appendTo,\n controller,\n 'mentions-helper',\n (target) => {\n const userId = (target as HTMLElement).dataset.peerId.toUserId();\n const user = Promise.resolve(managers.appUsersManager.getUser(userId)).then((user) => {\n let str = '', entity: MessageEntity;\n const usernames = getPeerActiveUsernames(user);\n if(usernames[0]) {\n str = '@' + usernames[0];\n } else {\n str = user.first_name || user.last_name;\n entity = {\n _: 'messageEntityMentionName',\n length: str.length,\n offset: 0,\n user_id: user.id\n };\n }\n\n str += ' ';\n chatInput.insertAtCaret(str, entity);\n });\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId, topMsgId: number) {\n const trimmed = query.trim(); // check that there is no whitespace\n if(query.length !== trimmed.length) return false;\n\n const middleware = this.controller.getMiddleware();\n this.managers.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(async(peerIds) => {\n if(!middleware()) return;\n\n peerIds = peerIds.filter((peerId) => peerId !== rootScope.myId);\n\n // const username = trimmed.slice(1).toLowerCase();\n\n const p = peerIds.map(async(peerId) => {\n const user = await this.managers.appUsersManager.getUser(peerId);\n const usernames = getPeerActiveUsernames(user);\n // if(usernames.length && usernames.some((_username) => _username.toLowerCase() === username)) { // hide full matched suggestion\n // return;\n // }\n\n return {\n peerId,\n description: usernames[0] ? '@' + usernames[0] : undefined\n };\n });\n\n this.render((await Promise.all(p)).filter(Boolean));\n });\n\n return true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport {KeyboardButton, ReplyMarkup} from '../../layer';\nimport rootScope from '../../lib/rootScope';\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\nimport confirmationPopup from '../confirmationPopup';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport Scrollable from '../scrollable';\n\nexport default class ReplyKeyboard extends DropdownHover {\n private static BASE_CLASS = 'reply-keyboard';\n private appendTo: HTMLElement;\n private listenerSetter: ListenerSetter;\n private managers: AppManagers;\n private btnHover: HTMLElement;\n private peerId: PeerId;\n private touchListener: Listener;\n private chatInput: ChatInput;\n private scrollable: Scrollable;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n managers: AppManagers,\n appendTo: HTMLElement,\n btnHover: HTMLElement,\n chatInput: ChatInput\n }) {\n super({\n element: document.createElement('div')\n });\n\n safeAssign(this, options);\n\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\n this.element.style.display = 'none';\n\n this.scrollable = new Scrollable();\n this.element.append(this.scrollable.container);\n\n this.attachButtonListener(this.btnHover, this.listenerSetter);\n this.listenerSetter.add(rootScope)('history_reply_markup', async({peerId}) => {\n if(this.peerId === peerId) {\n if(this.checkAvailability() && this.isActive()) {\n await this.render();\n }\n\n getHeavyAnimationPromise().then(() => {\n this.checkForceReply();\n });\n }\n });\n }\n\n public init() {\n this.appendTo.append(this.element);\n\n this.listenerSetter.add(this)('open', async() => {\n await this.render();\n\n if(IS_TOUCH_SUPPORTED) {\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\n this.listenerSetter.add(this)('close', () => {\n this.listenerSetter.remove(this.touchListener);\n }, {once: true});\n }\n });\n\n attachClickEvent(this.element, (e) => {\n const target = findUpClassName(e.target, 'btn');\n if(!target) {\n return;\n }\n\n const type = target.dataset.type as KeyboardButton['_'];\n const {peerId} = this;\n switch(type) {\n case 'keyboardButtonRequestPhone': {\n confirmationPopup({\n titleLangKey: 'ShareYouPhoneNumberTitle',\n button: {\n langKey: 'OK'\n },\n descriptionLangKey: 'AreYouSureShareMyContactInfoBot'\n }).then(() => {\n this.managers.appMessagesManager.sendContact(peerId, rootScope.myId);\n });\n break;\n }\n\n default: {\n this.managers.appMessagesManager.sendText(peerId, target.dataset.text);\n break;\n }\n }\n\n this.toggle(false);\n }, {listenerSetter: this.listenerSetter});\n\n return super.init();\n }\n\n private onBodyTouchStart = (e: TouchEvent) => {\n const target = e.touches[0].target as HTMLElement;\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\n cancelEvent(e);\n this.toggle(false);\n }\n };\n\n public async checkForceReply() {\n const replyMarkup = await this.getReplyMarkup();\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\n !replyMarkup.pFlags.hidden &&\n !replyMarkup.pFlags.used) {\n replyMarkup.pFlags.used = true;\n this.chatInput.initMessageReply(replyMarkup.mid);\n }\n }\n\n private async getReplyMarkup() {\n return (await this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup ?? {\n _: 'replyKeyboardHide'\n };\n }\n\n public async render(replyMarkup?: ReplyMarkup.replyKeyboardMarkup) {\n if(replyMarkup === undefined) {\n replyMarkup = await this.getReplyMarkup() as any;\n }\n\n this.scrollable.container.replaceChildren();\n\n for(const row of replyMarkup.rows) {\n const div = document.createElement('div');\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\n\n for(const button of row.buttons) {\n const btn = document.createElement('button');\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\n setInnerHTML(btn, wrapEmojiText(button.text));\n btn.dataset.text = button.text;\n btn.dataset.type = button._;\n div.append(btn);\n }\n\n this.scrollable.container.append(div);\n }\n }\n\n public async checkAvailability(replyMarkup?: ReplyMarkup) {\n if(replyMarkup === undefined) {\n replyMarkup = await this.getReplyMarkup();\n }\n\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\n this.btnHover.classList.toggle('hide', hide);\n\n if(hide) {\n this.toggle(false);\n }\n\n return !hide;\n }\n\n public setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n this.checkAvailability();\n this.checkForceReply();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from './chat';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {WebDocument} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport Button from '../button';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {MyPhoto} from '../../lib/appManagers/appPhotosManager';\nimport assumeType from '../../helpers/assumeType';\nimport GifsMasonry from '../gifsMasonry';\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport renderMediaWithFadeIn from '../../helpers/dom/renderMediaWithFadeIn';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport generateQId from '../../lib/appManagers/utils/inlineBots/generateQId';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport wrapPhoto from '../wrappers/photo';\n\nconst ANIMATION_GROUP: AnimationItemGroup = 'INLINE-HELPER';\n// const GRID_ITEMS = 5;\n\nexport default class InlineHelper extends AutocompleteHelper {\n private scrollable: Scrollable;\n private lazyLoadQueue: LazyLoadQueue;\n private gifsMasonry: GifsMasonry;\n private superStickerRenderer: SuperStickerRenderer;\n private onChangeScreen: () => void;\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n private chat: Chat,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'xy',\n waitForKey: ['ArrowUp', 'ArrowDown'],\n onSelect: (target) => {\n if(!target) return false; // can happen when there is only button\n const {peerId, botId, queryId} = this.list.dataset;\n return this.chat.input.getReadyToSend(() => {\n const queryAndResultIds = generateQId(queryId, (target as HTMLElement).dataset.resultId);\n this.managers.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\n ...this.chat.getMessageSendingParams(),\n clearDraft: true\n });\n\n this.chat.input.onMessageSent(true, true);\n });\n }\n });\n\n this.container.classList.add('inline-helper');\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n });\n\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\n\n this.addEventListener('hidden', () => {\n if(this.onChangeScreen) {\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\n this.onChangeScreen = undefined;\n }\n });\n }\n\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\n const middleware = this.controller.getMiddleware();\n\n const peer = await this.managers.appUsersManager.resolveUsername(username);\n if(!middleware()) {\n throw 'PEER_CHANGED';\n }\n\n if(peer._ !== 'user' || !peer.pFlags.bot) {\n throw 'NOT_A_BOT';\n }\n\n const renderPromise = this.managers.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then((botResults) => {\n if(!middleware()) {\n throw 'PEER_CHANGED';\n }\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n const list = this.list.cloneNode() as HTMLElement;\n list.dataset.peerId = '' + peerId;\n list.dataset.botId = '' + peer.id;\n list.dataset.queryId = '' + botResults.query_id;\n\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\n\n this.lazyLoadQueue.clear();\n this.superStickerRenderer.clear();\n\n const loadPromises: Promise[] = [];\n const isGallery = !!botResults.pFlags.gallery;\n // botResults.results.length = 3;\n for(const item of botResults.results) {\n const container = document.createElement('div');\n container.classList.add('inline-helper-result');\n container.dataset.resultId = item.id;\n\n const preview = isGallery ? undefined : document.createElement('div');\n if(preview) {\n preview.classList.add('inline-helper-result-preview');\n\n container.append(preview);\n }\n\n list.append(container);\n\n if(!isGallery) {\n preview.classList.add('empty');\n setInnerHTML(preview, wrapEmojiText([...item.title.trim()][0]));\n\n const title = document.createElement('div');\n title.classList.add('inline-helper-result-title');\n setInnerHTML(title, wrapEmojiText(item.title));\n\n const description = document.createElement('div');\n description.classList.add('inline-helper-result-description');\n setInnerHTML(description, wrapRichText(item.description, {\n noCommands: true,\n noLinks: true\n }));\n\n container.append(title, description);\n\n const separator = document.createElement('div');\n separator.classList.add('inline-helper-separator');\n\n list.append(separator);\n } else {\n container.classList.add('grid-item');\n }\n\n if(item._ === 'botInlineResult') {\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\n let mediaContainer: HTMLElement;\n if(preview) {\n mediaContainer = document.createElement('div');\n preview.append(mediaContainer);\n } else {\n mediaContainer = container;\n }\n\n mediaContainer.classList.add('media-container');\n isGallery && mediaContainer.classList.add('no-border-radius');\n\n this.lazyLoadQueue.push({\n div: container,\n load: () => {\n return appDownloadManager.download({\n dcId: 4,\n location: {\n _: 'inputWebFileLocation',\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\n url: item.thumb.url\n },\n size: item.thumb.size,\n mimeType: item.thumb.mime_type\n }).then((blob) => {\n const image = new Image();\n image.classList.add('media-photo');\n readBlobAsDataURL(blob).then((dataURL) => {\n renderMediaWithFadeIn(mediaContainer, image, dataURL, true);\n });\n });\n }\n });\n }\n } else {\n const media = item.document as MyDocument || item.photo as MyPhoto;\n if((['sticker', 'gif'] as MyDocument['type'][]).includes((media as MyDocument)?.type) && isGallery) {\n assumeType(media);\n\n if(media.type === 'gif') {\n gifsMasonry.add(media, container);\n } else if(media.type === 'sticker') {\n container.classList.add('super-sticker');\n this.superStickerRenderer.renderSticker(media, container, loadPromises);\n if(media.animated) {\n this.superStickerRenderer.observeAnimated(container);\n }\n }\n } else if(media) {\n const size = isGallery ? 48 : undefined;\n isGallery && container.classList.add('no-border-radius');\n wrapPhoto({\n photo: media,\n container: isGallery ? container : preview,\n boxWidth: size,\n boxHeight: size,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n loadPromises\n });\n }\n }\n }\n\n return Promise.all(loadPromises).then(() => {\n if(!middleware()) {\n gifsMasonry.clear();\n return;\n }\n\n list.classList.toggle('is-gallery', isGallery);\n list.classList.toggle('super-stickers', isGallery);\n this.container.classList.toggle('is-gallery', isGallery);\n\n /* if(isGallery) {\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\n }\n\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\n\n const parent = this.list.parentElement;\n parent.textContent = '';\n if(botResults.switch_pm) {\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\n setInnerHTML(btnSwitchToPM, wrapEmojiText(botResults.switch_pm.text));\n attachClickEvent(btnSwitchToPM, (e) => {\n this.chat.appImManager.setInnerPeer({peerId});\n this.managers.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\n });\n parent.append(btnSwitchToPM);\n }\n parent.append(this.list = list);\n\n if(this.gifsMasonry) {\n this.gifsMasonry.detach();\n }\n this.gifsMasonry = gifsMasonry;\n gifsMasonry.attach();\n\n if(!this.onChangeScreen) {\n this.onChangeScreen = () => {\n if(this.list.classList.contains('is-gallery')) {\n const width = (this.list.childElementCount * mediaSizes.active.popupSticker.width) + (this.list.childElementCount - 1 * 1);\n this.list.style.width = width + 'px';\n } else {\n this.list.style.width = '';\n }\n };\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\n }\n\n this.onChangeScreen();\n\n this.toggle(!botResults.results.length && !botResults.switch_pm);\n this.scrollable.scrollTop = 0;\n });\n });\n\n return {user: peer, renderPromise};\n };\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('inline-helper-results');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n this.lazyLoadQueue = new LazyLoadQueue();\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP, this.managers);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport callbackify from '../../helpers/callbackify';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport {processPeerFullForCommands} from './commandsHelper';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nconst CLASS_NAME = 'bot-commands';\nexport default class ChatBotCommands extends AutocompletePeerHelper {\n private userId: UserId;\n\n constructor(\n appendTo: HTMLElement,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(appendTo, undefined, CLASS_NAME, (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n this.toggle(true);\n });\n });\n }\n\n public setUserId(userId: UserId, middleware: () => boolean) {\n if(this.userId === userId && this.list?.childElementCount) {\n this.toggle(false);\n return;\n }\n\n this.userId = userId;\n return callbackify(this.managers.appProfileManager.getProfile(userId), (full) => {\n if(!middleware()) return;\n const filtered = processPeerFullForCommands(userId.toPeerId(false), full);\n\n const PADDING_TOP = 8;\n // const PADDING_BOTTOM = 8;\n const PADDING_BOTTOM = 24;\n const height = filtered.length * 50 + PADDING_TOP + PADDING_BOTTOM;\n this.container.style.setProperty('--height', height + 'px');\n\n this.render(filtered);\n\n // this.container.style.top =\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AckedResult} from '../lib/mtproto/superMessagePort';\nimport {Modify} from '../types';\n\nexport default async function modifyAckedResult(acked: AckedResult): Promise, {result: T | Promise}>> {\n return {\n cached: acked.cached,\n result: acked.cached ? await acked.result : acked.result\n };\n}\n\nexport function modifyAckedPromise(promise: Promise>) {\n return promise.then(modifyAckedResult);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport callbackify from '../../helpers/callbackify';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {getMiddleware} from '../../helpers/middleware';\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\nimport {ChatFull} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {i18n} from '../../lib/langPack';\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport PeerTitle from '../peerTitle';\nimport SetTransition from '../singleTransition';\nimport getChatMembersString from '../wrappers/getChatMembersString';\n\nconst SEND_AS_ANIMATION_DURATION = 300;\n\nexport default class ChatSendAs {\n private avatar: AvatarElement;\n private container: HTMLElement;\n private closeBtn: HTMLElement;\n private btnMenu: HTMLElement;\n private sendAsPeerIds: PeerId[];\n private sendAsPeerId: PeerId;\n private updatingPromise: ReturnType;\n private middleware: ReturnType;\n private listenerSetter: ListenerSetter;\n private peerId: PeerId;\n private addedListener: boolean;\n private buttons: ButtonMenuItemOptions[];\n\n constructor(\n private managers: AppManagers,\n private onReady: (container: HTMLElement, skipAnimation?: boolean) => void,\n private onChange: (sendAsPeerId: PeerId) => void\n ) {\n this.middleware = getMiddleware();\n this.listenerSetter = new ListenerSetter();\n this.construct();\n }\n\n private construct() {\n this.container = document.createElement('div');\n this.container.classList.add('new-message-send-as-container');\n\n this.closeBtn = document.createElement('div');\n this.closeBtn.classList.add('new-message-send-as-close', 'new-message-send-as-avatar', 'tgico-close');\n\n const sendAsButtons: ButtonMenuItemOptions[] = [{\n text: 'SendMessageAsTitle',\n onClick: undefined\n }];\n\n this.buttons = [];\n\n let previousAvatar: HTMLElement;\n const onSendAsMenuToggle = (visible: boolean) => {\n if(visible) {\n previousAvatar = this.avatar;\n }\n\n const isChanged = this.avatar !== previousAvatar;\n const useRafs = !visible && isChanged ? 2 : 0;\n\n SetTransition({\n element: this.closeBtn,\n className: 'is-visible',\n forwards: visible,\n duration: SEND_AS_ANIMATION_DURATION,\n useRafs\n });\n if(!isChanged) {\n SetTransition({\n element: previousAvatar,\n className: 'is-visible',\n forwards: !visible,\n duration: SEND_AS_ANIMATION_DURATION,\n useRafs\n });\n }\n };\n\n ButtonMenuToggle({\n buttonOptions: {noRipple: true},\n listenerSetter: this.listenerSetter,\n container: this.container,\n direction: 'top-right',\n buttons: sendAsButtons,\n onOpenBefore: () => {\n onSendAsMenuToggle(true);\n },\n onOpen: (e, btnMenu) => {\n sendAsButtons[0].element.classList.add('btn-menu-item-header');\n this.btnMenu = btnMenu as any;\n this.btnMenu.classList.add('scrollable', 'scrollable-y');\n this.btnMenu.append(...this.buttons.map((button) => button.element));\n },\n onClose: () => {\n onSendAsMenuToggle(false);\n },\n onCloseAfter: () => {\n this.btnMenu = undefined;\n }\n });\n\n this.container.append(this.closeBtn);\n }\n\n private async updateButtons(peerIds: PeerId[]) {\n const promises: Promise[] = peerIds.map(async(sendAsPeerId, idx) => {\n const textElement = document.createElement('div');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('btn-menu-item-subtitle');\n if(sendAsPeerId.isUser()) {\n subtitle.append(i18n('Chat.SendAs.PersonalAccount'));\n } else if(sendAsPeerId === this.peerId) {\n subtitle.append(i18n('VoiceChat.DiscussionGroup'));\n } else {\n subtitle.append(await getChatMembersString(sendAsPeerId.toChatId()));\n }\n\n textElement.append(\n new PeerTitle({peerId: sendAsPeerId}).element,\n subtitle\n );\n\n return {\n onClick: idx ? async() => {\n const currentPeerId = this.peerId;\n this.changeSendAsPeerId(sendAsPeerId);\n\n const middleware = this.middleware.get();\n const executeButtonsUpdate = () => {\n if(this.sendAsPeerId !== sendAsPeerId || !middleware()) return;\n const peerIds = this.sendAsPeerIds.slice();\n indexOfAndSplice(peerIds, sendAsPeerId);\n peerIds.unshift(sendAsPeerId);\n this.updateButtons(peerIds);\n };\n\n if(rootScope.settings.animationsEnabled) {\n setTimeout(executeButtonsUpdate, 250);\n } else {\n executeButtonsUpdate();\n }\n\n // return;\n this.managers.appMessagesManager.saveDefaultSendAs(currentPeerId, sendAsPeerId);\n } : undefined,\n textElement\n };\n });\n\n const buttons = await Promise.all(promises);\n const btnMenu = ButtonMenuSync({buttons}/* , this.listenerSetter */);\n buttons.forEach((button, idx) => {\n const peerId = peerIds[idx];\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-26', 'btn-menu-item-icon');\n avatar.updateWithOptions({peerId});\n\n if(!idx) {\n avatar.classList.add('active');\n }\n\n button.element.prepend(avatar);\n });\n\n this.buttons = buttons;\n\n // if already opened\n this.btnMenu?.append(...this.buttons.map((button) => button.element));\n }\n\n private async updateAvatar(sendAsPeerId: PeerId, skipAnimation?: boolean) {\n const previousAvatar = this.avatar;\n if(previousAvatar) {\n if(previousAvatar.peerId === sendAsPeerId) {\n return;\n }\n }\n\n if(!previousAvatar) {\n skipAnimation = true;\n }\n\n const useRafs = skipAnimation ? 0 : 2;\n const duration = skipAnimation ? 0 : SEND_AS_ANIMATION_DURATION;\n const avatar = this.avatar = new AvatarElement();\n avatar.classList.add('new-message-send-as-avatar', 'avatar-30');\n await avatar.updateWithOptions({\n isDialog: false,\n peerId: sendAsPeerId\n });\n\n SetTransition({\n element: avatar,\n className: 'is-visible',\n forwards: true,\n duration,\n useRafs\n });\n if(previousAvatar) {\n SetTransition({\n element: previousAvatar,\n className: 'is-visible',\n forwards: false,\n duration,\n onTransitionEnd: () => {\n previousAvatar.remove();\n },\n useRafs\n });\n }\n\n this.container.append(avatar);\n }\n\n private changeSendAsPeerId(sendAsPeerId: PeerId, skipAnimation?: boolean) {\n this.sendAsPeerId = sendAsPeerId;\n this.onChange(sendAsPeerId);\n return this.updateAvatar(sendAsPeerId, skipAnimation);\n }\n\n private getDefaultSendAs(): Promise> {\n // return rootScope.myId;\n return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((acked) => {\n return {\n cached: acked.cached,\n result: acked.result.then((channelFull) => {\n return channelFull.default_send_as ? getPeerId(channelFull.default_send_as) : undefined\n })\n };\n });\n }\n\n public async updateManual(skipAnimation?: boolean): Promise<() => void> {\n const peerId = this.peerId;\n if(this.updatingPromise || !(await this.managers.appPeersManager.isChannel(peerId))) {\n return;\n }\n\n const middleware = this.middleware.get(() => {\n return !this.updatingPromise || this.updatingPromise === updatingPromise;\n });\n\n const {container} = this;\n const chatId = peerId.toChatId();\n const result = (await modifyAckedPromise(this.getDefaultSendAs())).result;\n // const result = Promise.resolve(this.getDefaultSendAs());\n\n const wasSkippingAnimation = skipAnimation;\n if(result instanceof Promise) {\n skipAnimation = undefined;\n }\n\n const auto = wasSkippingAnimation && !skipAnimation;\n\n const updatingPromise = this.updatingPromise = callbackify(result, async(sendAsPeerId) => {\n if(!middleware() || sendAsPeerId === undefined) return;\n\n await this.changeSendAsPeerId(sendAsPeerId, skipAnimation);\n if(!middleware()) return;\n\n this.managers.appChatsManager.getSendAs(chatId).then((sendAsPeers) => {\n if(!middleware()) return;\n\n const peers = sendAsPeers.filter((sendAsPeer) => !sendAsPeer.pFlags.premium_required).map((sendAsPeer) => sendAsPeer.peer);\n const peerIds = peers.map((peer) => getPeerId(peer));\n this.sendAsPeerIds = peerIds.slice();\n\n indexOfAndSplice(peerIds, sendAsPeerId);\n peerIds.unshift(sendAsPeerId);\n this.updateButtons(peerIds);\n });\n\n const callback = () => {\n this.onReady(container, skipAnimation);\n\n if(!this.addedListener) {\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.update();\n }\n });\n\n this.addedListener = true;\n }\n };\n\n if(auto) {\n callback();\n return;\n }\n\n return callback;\n });\n\n updatingPromise.finally(() => {\n if(this.updatingPromise === updatingPromise) {\n this.updatingPromise = undefined;\n }\n });\n\n if(!auto) {\n return updatingPromise;\n }\n }\n\n public update(skipAnimation?: boolean) {\n return this.updateManual(skipAnimation).then((callback) => callback?.());\n }\n\n public setPeerId(peerId?: PeerId) {\n /* if(this.avatar) {\n this.avatar.remove();\n this.avatar = undefined;\n } */\n\n this.middleware.clean();\n this.updatingPromise = undefined;\n this.peerId = peerId;\n }\n\n public destroy() {\n this.container.remove();\n this.setPeerId();\n this.listenerSetter.removeAll();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {markdownTags, MarkdownType} from './getRichElementValue';\n\nexport default function hasMarkupInSelection(types: T[]) {\n const result: Record = {} as any;\n types.forEach((tag) => result[tag] = false);\n const selection = window.getSelection();\n if(!selection.isCollapsed) {\n const range = selection.getRangeAt(0);\n const commonAncestor = range.commonAncestorContainer;\n const treeWalker = document.createTreeWalker(\n (commonAncestor.nodeType === commonAncestor.ELEMENT_NODE ? commonAncestor as HTMLElement : (commonAncestor as ChildNode).parentElement).closest('[contenteditable=\"true\"]'),\n NodeFilter.SHOW_ELEMENT,\n {acceptNode: (node) => range.intersectsNode(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT}\n );\n\n let element: HTMLElement;\n while(element = treeWalker.nextNode() as HTMLElement) {\n for(const type of types) {\n if(result[type]) {\n continue;\n }\n\n const tag = markdownTags[type];\n if(element.matches(tag.match)) {\n result[type] = true;\n }\n }\n }\n }\n\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppImManager, APP_TABS} from '../../lib/appManagers/appImManager';\nimport type {MyDraftMessage} from '../../lib/appManagers/appDraftsManager';\nimport type Chat from './chat';\nimport Recorder from '../../../public/recorder.min';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n// import Recorder from '../opus-recorder/dist/recorder.min';\nimport opusDecodeController from '../../lib/opusDecodeController';\nimport {ButtonMenuItemOptions, ButtonMenuItemOptionsVerifiable, ButtonMenuSync} from '../buttonMenu';\nimport emoticonsDropdown from '../emoticonsDropdown';\nimport PopupCreatePoll from '../popups/createPoll';\nimport PopupForward from '../popups/forward';\nimport PopupNewMedia from '../popups/newMedia';\nimport {toast, toastNew} from '../toast';\nimport {MessageEntity, DraftMessage, WebPage, Message, UserFull, AttachMenuPeerType} from '../../layer';\nimport StickersHelper from './stickersHelper';\nimport ButtonIcon from '../buttonIcon';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\nimport Button from '../button';\nimport PopupSchedule from '../popups/schedule';\nimport SendMenu from './sendContextMenu';\nimport rootScope from '../../lib/rootScope';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport tsNow from '../../helpers/tsNow';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE, IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport I18n, {i18n, join, LangPackKey} from '../../lib/langPack';\nimport {generateTail} from './bubbles';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport ButtonCorner from '../buttonCorner';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport cancelSelection from '../../helpers/dom/cancelSelection';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {MarkdownType} from '../../helpers/dom/getRichElementValue';\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\nimport EmojiHelper from './emojiHelper';\nimport CommandsHelper from './commandsHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompleteHelper from './autocompleteHelper';\nimport MentionsHelper from './mentionsHelper';\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\nimport ReplyKeyboard from './replyKeyboard';\nimport InlineHelper from './inlineHelper';\nimport debounce from '../../helpers/schedulers/debounce';\nimport noop from '../../helpers/noop';\nimport {putPreloader} from '../putPreloader';\nimport SetTransition from '../singleTransition';\nimport PeerTitle from '../peerTitle';\nimport {fastRaf} from '../../helpers/schedulers';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport fixSafariStickyInputFocusing, {IS_STICKY_INPUT_BUGGED} from '../../helpers/dom/fixSafariStickyInputFocusing';\nimport PopupPeer from '../popups/peer';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport appMediaPlaybackController from '../appMediaPlaybackController';\nimport {BOT_START_PARAM, NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport setCaretAt from '../../helpers/dom/setCaretAt';\nimport CheckboxField from '../checkboxField';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport RadioForm from '../radioForm';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport callbackify from '../../helpers/callbackify';\nimport ChatBotCommands from './botCommands';\nimport copy from '../../helpers/object/copy';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport documentFragmentToHTML from '../../helpers/dom/documentFragmentToHTML';\nimport PopupElement from '../popups';\nimport getEmojiEntityFromEmoji from '../../lib/richTextProcessor/getEmojiEntityFromEmoji';\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\nimport parseMarkdown from '../../lib/richTextProcessor/parseMarkdown';\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\nimport wrapDraft from '../wrappers/draft';\nimport wrapMessageForReply from '../wrappers/messageForReply';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {emojiFromCodePoints} from '../../vendor/emoji';\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\nimport ChatSendAs from './sendAs';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport InputFieldAnimated from '../inputFieldAnimated';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport PopupStickers from '../popups/stickers';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport wrapReply from '../wrappers/reply';\nimport {getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';\nimport hasMarkupInSelection from '../../helpers/dom/hasMarkupInSelection';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport RichInputHandler from '../../helpers/dom/richInputHandler';\nimport {insertRichTextAsHTML} from '../inputField';\nimport getCaretPosNew from '../../helpers/dom/getCaretPosNew';\nimport draftsAreEqual from '../../lib/appManagers/utils/drafts/draftsAreEqual';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport getAttachMenuBotIcon from '../../lib/appManagers/utils/attachMenuBots/getAttachMenuBotIcon';\nimport TelegramWebView from '../telegramWebView';\n\nconst RECORD_MIN_TIME = 500;\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\n\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\n\nexport default class ChatInput {\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\n public messageInput: HTMLElement;\n public messageInputField: InputFieldAnimated;\n private fileInput: HTMLInputElement;\n private inputMessageContainer: HTMLDivElement;\n private btnSend: HTMLButtonElement;\n private btnCancelRecord: HTMLButtonElement;\n private lastUrl = '';\n private lastTimeType = 0;\n\n public chatInput: HTMLElement;\n public inputContainer: HTMLElement;\n public rowsWrapper: HTMLDivElement;\n private newMessageWrapper: HTMLDivElement;\n private btnToggleEmoticons: HTMLButtonElement;\n private btnToggleReplyMarkup: HTMLButtonElement;\n private btnSendContainer: HTMLDivElement;\n\n private replyKeyboard: ReplyKeyboard;\n\n private attachMenu: HTMLElement;\n private attachMenuButtons: ButtonMenuItemOptionsVerifiable[];\n\n private sendMenu: SendMenu;\n\n private replyElements: {\n container: HTMLElement,\n cancelBtn: HTMLButtonElement,\n iconBtn: HTMLButtonElement\n } = {} as any;\n\n private forwardElements: {\n changePeer: ButtonMenuItemOptions,\n showSender: ButtonMenuItemOptions,\n hideSender: ButtonMenuItemOptions,\n showCaption: ButtonMenuItemOptions,\n hideCaption: ButtonMenuItemOptions,\n container: HTMLElement,\n modifyArgs?: ButtonMenuItemOptions[]\n };\n private forwardHover: DropdownHover;\n private forwardWasDroppingAuthor: boolean;\n\n private getWebPagePromise: Promise;\n private willSendWebPage: WebPage = null;\n private forwarding: {[fromPeerId: PeerId]: number[]};\n public replyToMsgId: number;\n public editMsgId: number;\n public editMessage: Message.message;\n private noWebPage: true;\n public scheduleDate: number;\n public sendSilent: true;\n public startParam: string;\n\n private recorder: any;\n public recording = false;\n private recordCanceled = false;\n private recordTimeEl: HTMLElement;\n private recordRippleEl: HTMLElement;\n private recordStartTime = 0;\n private recordingOverlayListener: Listener;\n private recordingNavigationItem: NavigationItem;\n\n // private scrollTop = 0;\n // private scrollOffsetTop = 0;\n // private scrollDiff = 0;\n\n public helperType: Exclude;\n private helperFunc: () => void | Promise;\n private helperWaitingForward: boolean;\n\n public willAttachType: 'document' | 'media';\n\n private lockRedo = false;\n private canRedoFromHTML = '';\n private readonly undoHistory: string[] = [];\n private readonly executedHistory: string[] = [];\n private canUndoFromHTML = '';\n\n private autocompleteHelperController: AutocompleteHelperController;\n private stickersHelper: StickersHelper;\n private emojiHelper: EmojiHelper;\n private commandsHelper: CommandsHelper;\n private mentionsHelper: MentionsHelper;\n private inlineHelper: InlineHelper;\n private listenerSetter: ListenerSetter;\n\n private pinnedControlBtn: HTMLButtonElement;\n\n private goDownBtn: HTMLButtonElement;\n private goDownUnreadBadge: HTMLElement;\n private goMentionBtn: HTMLButtonElement;\n private goMentionUnreadBadge: HTMLSpanElement;\n private btnScheduled: HTMLButtonElement;\n\n private btnPreloader: HTMLButtonElement;\n\n private saveDraftDebounced: () => void;\n\n private fakeRowsWrapper: HTMLDivElement;\n\n private previousQuery: string;\n\n private releaseMediaPlayback: () => void;\n\n private botStartBtn: HTMLButtonElement;\n private rowsWrapperWrapper: HTMLDivElement;\n private controlContainer: HTMLElement;\n private fakeSelectionWrapper: HTMLDivElement;\n\n private fakeWrapperTo: HTMLElement;\n private toggleBotStartBtnDisability: () => void;\n\n private botCommandsToggle: HTMLElement;\n private botCommands: ChatBotCommands;\n private botCommandsIcon: HTMLDivElement;\n private hasBotCommands: boolean;\n\n // private activeContainer: HTMLElement;\n\n private sendAs: ChatSendAs;\n public sendAsPeerId: PeerId;\n\n private replyInTopicOverlay: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private appImManager: AppImManager,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n }\n\n public construct() {\n this.chatInput = document.createElement('div');\n this.chatInput.classList.add('chat-input', 'hide');\n\n this.inputContainer = document.createElement('div');\n this.inputContainer.classList.add('chat-input-container');\n\n this.rowsWrapperWrapper = document.createElement('div');\n this.rowsWrapperWrapper.classList.add('rows-wrapper-wrapper');\n\n this.rowsWrapper = document.createElement('div');\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\n\n this.rowsWrapperWrapper.append(this.rowsWrapper);\n\n const tail = generateTail();\n this.rowsWrapper.append(tail);\n\n const fakeRowsWrapper = this.fakeRowsWrapper = document.createElement('div');\n fakeRowsWrapper.classList.add('fake-wrapper', 'fake-rows-wrapper');\n\n const fakeSelectionWrapper = this.fakeSelectionWrapper = document.createElement('div');\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\n\n this.inputContainer.append(this.rowsWrapperWrapper, fakeRowsWrapper, fakeSelectionWrapper);\n this.chatInput.append(this.inputContainer);\n\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button chat-secondary-button bubbles-go-down hide'});\n this.inputContainer.append(this.goDownBtn);\n\n attachClickEvent(this.goDownBtn, (e) => {\n cancelEvent(e);\n this.chat.bubbles.onGoDownClick();\n }, {listenerSetter: this.listenerSetter});\n\n // * constructor end\n\n /* let setScrollTopTimeout: number;\n // @ts-ignore\n let height = window.visualViewport.height; */\n // @ts-ignore\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\n // const scrollable = this.chat.bubbles.scrollable;\n // const wasScrolledDown = scrollable.isScrolledDown;\n\n // /* if(wasScrolledDown) {\n // this.saveScroll();\n // } */\n\n // // @ts-ignore\n // let newHeight = window.visualViewport.height;\n // const diff = height - newHeight;\n // const scrollTop = scrollable.scrollTop;\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\n\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\n\n // scrollable.scrollTop = needScrollTop;\n\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\n // setScrollTopTimeout = window.setTimeout(() => {\n // const diff = height - newHeight;\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\n // height = newHeight;\n\n // scrollable.scrollTop = needScrollTop;\n\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\n\n // /* if(isScrolledDown) {\n // scrollable.scrollTop = scrollable.scrollHeight;\n // } */\n\n // //scrollable.scrollTop += diff;\n // setScrollTopTimeout = 0;\n // }, 0);\n // });\n\n // ! Can't use it with resizeObserver\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\n const scrollable = this.chat.bubbles.scrollable;\n const wasScrolledDown = scrollable.isScrolledDown;\n\n // @ts-ignore\n let newHeight = window.visualViewport.height;\n const diff = height - newHeight;\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\n\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\n\n scrollable.scrollTop = needScrollTop;\n height = newHeight;\n\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\n scrollable.scrollTop = needScrollTop;\n\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\n setScrollTopTimeout = 0;\n }, 0);\n }); */\n\n const c = this.controlContainer = document.createElement('div');\n c.classList.add('chat-input-control', 'chat-input-wrapper');\n this.inputContainer.append(c);\n }\n\n public constructPeerHelpers() {\n this.replyElements.container = document.createElement('div');\n this.replyElements.container.classList.add('reply-wrapper');\n\n this.replyElements.iconBtn = ButtonIcon('');\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\n\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\n\n //\n\n const onHideAuthorClick = () => {\n isChangingAuthor = true;\n };\n\n const onHideCaptionClick = () => {\n isChangingAuthor = false;\n };\n\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\n let isChangingAuthor = false;\n const forwardButtons: ButtonMenuItemOptions[] = [\n forwardElements.showSender = {\n text: 'Chat.Alert.Forward.Action.Show1',\n onClick: onHideAuthorClick,\n checkForClose: () => this.canToggleHideAuthor(),\n checkboxField: new CheckboxField({checked: true})\n },\n forwardElements.hideSender = {\n text: 'Chat.Alert.Forward.Action.Hide1',\n onClick: onHideAuthorClick,\n checkForClose: () => this.canToggleHideAuthor(),\n checkboxField: new CheckboxField({checked: false})\n },\n forwardElements.showCaption = {\n text: 'Chat.Alert.Forward.Action.ShowCaption',\n onClick: onHideCaptionClick,\n checkboxField: new CheckboxField({checked: true})\n },\n forwardElements.hideCaption = {\n text: 'Chat.Alert.Forward.Action.HideCaption',\n onClick: onHideCaptionClick,\n checkboxField: new CheckboxField({checked: false})\n },\n forwardElements.changePeer = {\n text: 'Chat.Alert.Forward.Action.Another',\n onClick: () => {\n this.changeForwardRecipient();\n },\n icon: 'replace'\n }\n ];\n const forwardBtnMenu = forwardElements.container = ButtonMenuSync({\n buttons: forwardButtons,\n listenerSetter: this.listenerSetter\n });\n // forwardBtnMenu.classList.add('top-center');\n\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\n const groups: {\n elements: HTMLElement[],\n onChange: (value: string, event: Event) => void\n }[] = [{\n elements: children.slice(0, 2),\n onChange: (value, e) => {\n const checked = !!+value;\n if(isChangingAuthor) {\n this.forwardWasDroppingAuthor = !checked;\n }\n\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\n if(replyTitle) {\n const el = replyTitle.firstElementChild as HTMLElement;\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\n i.key = langPackKey;\n i.update();\n }\n }\n }, {\n elements: children.slice(2, 4),\n onChange: (value) => {\n const checked = !!+value;\n let b: ButtonMenuItemOptions;\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\n } else {\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\n }\n\n b.checkboxField.checked = true;\n }\n }];\n groups.forEach((group) => {\n const container = RadioForm(group.elements.map((e) => {\n return {\n container: e,\n input: e.querySelector('input')\n };\n }), group.onChange);\n\n const hr = document.createElement('hr');\n container.append(hr);\n forwardBtnMenu.append(container);\n });\n\n forwardBtnMenu.append(forwardElements.changePeer.element);\n\n if(!IS_TOUCH_SUPPORTED) {\n const forwardHover = this.forwardHover = new DropdownHover({\n element: forwardBtnMenu\n });\n }\n\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\n this.replyElements.container.append(forwardBtnMenu);\n\n forwardElements.modifyArgs.forEach((b, idx) => {\n const {input} = b.checkboxField;\n input.type = 'radio';\n input.name = idx < 2 ? 'author' : 'caption';\n input.value = '' + +!(idx % 2);\n });\n\n //\n\n this.newMessageWrapper = document.createElement('div');\n this.newMessageWrapper.classList.add('new-message-wrapper');\n\n this.replyInTopicOverlay = document.createElement('div');\n this.replyInTopicOverlay.classList.add('reply-in-topic-overlay', 'hide');\n this.replyInTopicOverlay.append(i18n('Chat.Input.ReplyToAnswer'));\n\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\n\n this.inputMessageContainer = document.createElement('div');\n this.inputMessageContainer.classList.add('input-message-container');\n\n this.goDownUnreadBadge = document.createElement('span');\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\n this.goDownBtn.append(this.goDownUnreadBadge);\n\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button chat-secondary-button bubbles-go-mention'});\n this.goMentionUnreadBadge = document.createElement('span');\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\n this.goMentionBtn.append(this.goMentionUnreadBadge);\n this.inputContainer.append(this.goMentionBtn);\n\n attachClickEvent(this.goMentionBtn, (e) => {\n cancelEvent(e);\n const middleware = this.chat.bubbles.getMiddleware();\n this.managers.appMessagesManager.goToNextMention(this.chat.peerId, this.chat.threadId).then((mid) => {\n if(!middleware()) {\n return;\n }\n\n if(mid) {\n this.chat.setMessageId(mid);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\n\n attachClickEvent(this.btnScheduled, (e) => {\n this.appImManager.openScheduled(this.chat.peerId);\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\n if(this.chat.peerId !== peerId) {\n return;\n }\n\n this.btnScheduled.classList.remove('hide');\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\n if(this.chat.peerId !== peerId) {\n return;\n }\n\n this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((value) => {\n this.btnScheduled.classList.toggle('hide', !value.length);\n });\n });\n\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\n this.replyKeyboard = new ReplyKeyboard({\n appendTo: this.rowsWrapper,\n listenerSetter: this.listenerSetter,\n managers: this.managers,\n btnHover: this.btnToggleReplyMarkup,\n chatInput: this\n });\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\n\n this.botCommands = new ChatBotCommands(this.rowsWrapper, this, this.managers);\n this.botCommandsToggle = document.createElement('div');\n this.botCommandsToggle.classList.add('new-message-bot-commands');\n\n const scaler = document.createElement('div');\n scaler.classList.add('new-message-bot-commands-icon-scale');\n\n const icon = this.botCommandsIcon = document.createElement('div');\n icon.classList.add('animated-menu-icon', 'animated-menu-close-icon');\n scaler.append(icon);\n this.botCommandsToggle.append(scaler);\n\n attachClickEvent(this.botCommandsToggle, (e) => {\n cancelEvent(e);\n const isShown = icon.classList.contains('state-back');\n if(isShown) {\n this.botCommands.toggle(true);\n icon.classList.remove('state-back');\n } else {\n this.botCommands.setUserId(this.chat.peerId.toUserId(), this.chat.bubbles.getMiddleware());\n icon.classList.add('state-back');\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.botCommands.addEventListener('visible', () => {\n icon.classList.add('state-back');\n });\n\n this.botCommands.addEventListener('hiding', () => {\n icon.classList.remove('state-back');\n });\n\n this.attachMenuButtons = [{\n icon: 'image',\n text: 'Chat.Input.Attach.PhotoOrVideo',\n onClick: () => {\n this.fileInput.value = '';\n const accept = [...MEDIA_MIME_TYPES_SUPPORTED].join(', ');\n this.fileInput.setAttribute('accept', accept);\n this.willAttachType = 'media';\n this.fileInput.click();\n },\n verify: () => this.chat.canSend('send_media')\n }, {\n icon: 'document',\n text: 'Chat.Input.Attach.Document',\n onClick: () => {\n this.fileInput.value = '';\n this.fileInput.removeAttribute('accept');\n this.willAttachType = 'document';\n this.fileInput.click();\n },\n verify: () => this.chat.canSend('send_media')\n }, {\n icon: 'poll',\n text: 'Poll',\n onClick: () => {\n PopupElement.createPopup(PopupCreatePoll, this.chat).show();\n },\n verify: () => (this.chat.peerId.isAnyChat() || this.chat.isBot) && this.chat.canSend('send_polls')\n }];\n\n const attachMenuButtons = this.attachMenuButtons.slice();\n this.attachMenu = ButtonMenuToggle({\n buttonOptions: {noRipple: true},\n listenerSetter: this.listenerSetter,\n direction: 'top-left',\n buttons: this.attachMenuButtons,\n onOpenBefore: async() => {\n const attachMenuBots = await this.managers.appAttachMenuBotsManager.getAttachMenuBots();\n const buttons = attachMenuButtons.slice();\n const attachMenuBotsButtons = attachMenuBots.filter((attachMenuBot) => {\n return !attachMenuBot.pFlags.inactive;\n }).map((attachMenuBot) => {\n const icon = getAttachMenuBotIcon(attachMenuBot);\n const button: typeof buttons[0] = {\n regularText: wrapEmojiText(attachMenuBot.short_name),\n onClick: () => {\n this.managers.appAttachMenuBotsManager.requestWebView({\n botId: attachMenuBot.bot_id,\n peerId: this.chat.peerId,\n ...this.chat.getMessageSendingParams()\n }).then((webViewResultUrl) => {\n const SANDBOX_ATTRIBUTES = [\n 'allow-scripts',\n 'allow-same-origin',\n 'allow-popups',\n 'allow-forms',\n 'allow-modals',\n 'allow-storage-access-by-user-activation'\n ].join(' ');\n\n class P extends PopupElement<{\n finish: () => void\n }> {\n private telegramWebView: TelegramWebView;\n\n constructor(private url: string) {\n super('popup-payment popup-payment-verification', {\n closable: true,\n overlayClosable: true,\n body: true,\n titleRaw: attachMenuBot.short_name\n });\n\n this.d();\n }\n\n protected destroy() {\n this.telegramWebView.destroy();\n return super.destroy();\n }\n\n private d() {\n const telegramWebView = this.telegramWebView = new TelegramWebView({\n url: this.url,\n sandbox: SANDBOX_ATTRIBUTES\n });\n\n telegramWebView.iframe.classList.add('payment-verification');\n\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n }\n\n new P(webViewResultUrl.url);\n });\n },\n iconDoc: icon?.icon as MyDocument,\n verify: async() => {\n let found = false;\n\n const verifyMap: {\n [type in AttachMenuPeerType['_']]: () => boolean | Promise\n } = {\n attachMenuPeerTypeSameBotPM: () => this.chat.peerId.toUserId() === attachMenuBot.bot_id,\n attachMenuPeerTypeBotPM: () => this.chat.isBot,\n attachMenuPeerTypePM: () => this.chat.peerId.isUser(),\n attachMenuPeerTypeChat: () => this.chat.isAnyGroup,\n attachMenuPeerTypeBroadcast: () => this.chat.isBroadcast\n };\n\n for(const peerType of attachMenuBot.peer_types) {\n const verify = verifyMap[peerType._];\n found = await verify();\n if(found) {\n break;\n }\n }\n\n return found;\n }\n };\n\n return button;\n });\n\n buttons.splice(buttons.length, 0, ...attachMenuBotsButtons);\n this.attachMenuButtons.splice(0, this.attachMenuButtons.length, ...buttons);\n }\n });\n this.attachMenu.classList.add('attach-file', 'tgico-attach');\n this.attachMenu.classList.remove('tgico-more');\n\n // this.inputContainer.append(this.sendMenu);\n\n this.recordTimeEl = document.createElement('div');\n this.recordTimeEl.classList.add('record-time');\n\n this.fileInput = document.createElement('input');\n this.fileInput.type = 'file';\n this.fileInput.multiple = true;\n this.fileInput.style.display = 'none';\n\n this.newMessageWrapper.append(...[this.botCommandsToggle, this.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\n\n this.rowsWrapper.append(this.replyElements.container);\n this.autocompleteHelperController = new AutocompleteHelperController();\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\n this.rowsWrapper.append(this.newMessageWrapper);\n\n this.btnCancelRecord = ButtonIcon('binfilled btn-circle btn-record-cancel chat-secondary-button');\n\n this.btnSendContainer = document.createElement('div');\n this.btnSendContainer.classList.add('btn-send-container');\n\n this.recordRippleEl = document.createElement('div');\n this.recordRippleEl.classList.add('record-ripple');\n\n this.btnSend = ButtonIcon('none btn-circle btn-send animated-button-icon');\n this.btnSend.insertAdjacentHTML('afterbegin', `\n \n \n \n \n `);\n\n this.btnSendContainer.append(this.recordRippleEl, this.btnSend);\n\n this.sendMenu = new SendMenu({\n onSilentClick: () => {\n this.sendSilent = true;\n this.sendMessage();\n },\n onScheduleClick: () => {\n this.scheduleSending(undefined);\n },\n listenerSetter: this.listenerSetter,\n openSide: 'top-left',\n onContextElement: this.btnSend,\n onOpen: () => {\n return this.chat.type !== 'scheduled' && (!this.isInputEmpty() || !!Object.keys(this.forwarding).length);\n }\n });\n\n this.btnSendContainer.append(this.sendMenu.sendMenu);\n\n this.inputContainer.append(this.btnCancelRecord, this.btnSendContainer);\n\n emoticonsDropdown.attachButtonListener(this.btnToggleEmoticons, this.listenerSetter);\n this.listenerSetter.add(emoticonsDropdown)('open', this.onEmoticonsOpen);\n this.listenerSetter.add(emoticonsDropdown)('close', this.onEmoticonsClose);\n\n this.attachMessageInputField();\n\n /* this.attachMenu.addEventListener('mousedown', (e) => {\n const hidden = this.attachMenu.querySelectorAll('.hide');\n if(hidden.length === this.attachMenuButtons.length) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n cancelEvent(e);\n return false;\n }\n }, {passive: false, capture: true}); */\n\n this.listenerSetter.add(rootScope)('settings_updated', () => {\n if(this.stickersHelper || this.emojiHelper) {\n // this.previousQuery = undefined;\n this.previousQuery = '';\n this.checkAutocomplete();\n /* if(!rootScope.settings.stickers.suggest) {\n this.stickersHelper.checkEmoticon('');\n } else {\n this.onMessageInput();\n } */\n }\n\n this.messageInputField?.onFakeInput();\n });\n\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId || this.chat.type === 'scheduled') return;\n this.setDraft(draft, true, force);\n });\n\n this.listenerSetter.add(this.appImManager)('peer_changing', (chat) => {\n if(this.chat === chat && (this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n this.saveDraft();\n }\n });\n\n this.listenerSetter.add(this.appImManager)('chat_changing', ({from, to}) => {\n if(this.chat === from) {\n this.autocompleteHelperController.toggleListNavigation(false);\n } else if(this.chat === to) {\n this.autocompleteHelperController.toggleListNavigation(true);\n }\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\n if(this.chat.type === 'scheduled' && this.chat.peerId === peerId && mids.includes(this.editMsgId)) {\n this.onMessageSent();\n }\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n if(this.chat.peerId === peerId && this.chat.type !== 'scheduled') {\n if(msgs.has(this.editMsgId)) {\n this.onMessageSent();\n }\n\n if(this.replyToMsgId && msgs.has(this.replyToMsgId)) {\n this.clearHelper('reply');\n }\n\n /* if(this.chat.isStartButtonNeeded()) {\n this.setStartParam(BOT_START_PARAM);\n } */\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(dialogs.has(this.chat.peerId) && (this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n if(this.startParam === BOT_START_PARAM) {\n this.setStartParam();\n } else { // updateNewMessage comes earlier than dialog appers\n this.center(true);\n }\n }\n });\n\n try {\n this.recorder = new Recorder({\n // encoderBitRate: 32,\n // encoderPath: \"../dist/encoderWorker.min.js\",\n encoderSampleRate: 48000,\n monitorGain: 0,\n numberOfChannels: 1,\n recordingGain: 1,\n reuseWorker: true\n });\n } catch(err) {\n console.error('Recorder constructor error:', err);\n }\n\n this.updateSendBtn();\n\n this.listenerSetter.add(this.fileInput)('change', (e) => {\n const files = (e.target as HTMLInputElement & EventTarget).files;\n if(!files.length) {\n return;\n }\n\n PopupElement.createPopup(PopupNewMedia, this.chat, Array.from(files).slice(), this.willAttachType);\n this.fileInput.value = '';\n }, false);\n\n /* let time = Date.now();\n this.btnSend.addEventListener('touchstart', (e) => {\n time = Date.now();\n });\n\n let eventName1 = 'touchend';\n this.btnSend.addEventListener(eventName1, (e: Event) => {\n //cancelEvent(e);\n console.log(eventName1 + ', time: ' + (Date.now() - time));\n });\n\n let eventName = 'mousedown';\n this.btnSend.addEventListener(eventName, (e: Event) => {\n cancelEvent(e);\n console.log(eventName + ', time: ' + (Date.now() - time));\n }); */\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\n\n if(this.recorder) {\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\n\n this.recorder.onstop = () => {\n this.setRecording(false);\n this.chatInput.classList.remove('is-locked');\n this.recordRippleEl.style.transform = '';\n };\n\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\n if(this.releaseMediaPlayback) {\n this.releaseMediaPlayback();\n this.releaseMediaPlayback = undefined;\n }\n\n if(this.recordingOverlayListener) {\n this.listenerSetter.remove(this.recordingOverlayListener);\n this.recordingOverlayListener = undefined;\n }\n\n if(this.recordingNavigationItem) {\n appNavigationController.removeItem(this.recordingNavigationItem);\n this.recordingNavigationItem = undefined;\n }\n\n if(this.recordCanceled) {\n return;\n }\n\n const {peerId, threadId} = this.chat;\n const replyToMsgId = this.replyToMsgId;\n\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\n /* const fileName = new Date().toISOString() + \".opus\";\n console.log('Recorder data received', typedArray, dataBlob); */\n\n // let perf = performance.now();\n opusDecodeController.decode(typedArray, true).then((result) => {\n // console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\n\n opusDecodeController.setKeepAlive(false);\n\n // тут objectURL ставится уже с audio/wav\n this.managers.appMessagesManager.sendFile(peerId, {\n file: dataBlob,\n isVoiceMessage: true,\n isMedia: true,\n duration,\n waveform: result.waveform,\n objectURL: result.url,\n replyToMsgId,\n threadId,\n clearDraft: true\n });\n\n this.onMessageSent(false, true);\n });\n };\n }\n\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\n\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\n\n this.botStartBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button');\n this.botStartBtn.append(i18n('BotStart'));\n\n attachClickEvent(this.botStartBtn, () => {\n const {startParam} = this;\n if(startParam === undefined) {\n return;\n }\n\n const toggle = this.toggleBotStartBtnDisability = toggleDisability([this.botStartBtn], true);\n const peerId = this.chat.peerId;\n const middleware = this.chat.bubbles.getMiddleware(() => {\n return this.chat.peerId === peerId && this.startParam === startParam && this.toggleBotStartBtnDisability === toggle;\n });\n\n this.managers.appMessagesManager.startBot(peerId.toUserId(), undefined, startParam).then(() => {\n if(middleware()) {\n toggle();\n this.toggleBotStartBtnDisability = undefined;\n this.setStartParam();\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.controlContainer.append(this.botStartBtn, this.replyInTopicOverlay);\n\n // * pinned part start\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button', {icon: 'unpin'});\n this.controlContainer.append(this.pinnedControlBtn);\n\n this.listenerSetter.add(this.pinnedControlBtn)('click', () => {\n const peerId = this.chat.peerId;\n\n new PopupPinMessage(peerId, 0, true, () => {\n this.chat.appImManager.setPeer(); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n });\n });\n // * pinned part end\n }\n\n public _center(neededFakeContainer: HTMLElement, animate?: boolean) {\n if(!neededFakeContainer && !this.inputContainer.classList.contains('is-centering')) {\n return;\n }\n\n if(neededFakeContainer === this.fakeWrapperTo) {\n return;\n }\n\n /* if(neededFakeContainer === this.botStartContainer && this.fakeWrapperTo === this.fakeSelectionWrapper) {\n this.inputContainer.classList.remove('is-centering');\n void this.rowsWrapper.offsetLeft; // reflow\n // this.inputContainer.classList.add('is-centering');\n // void this.rowsWrapper.offsetLeft; // reflow\n } */\n\n const fakeSelectionWrapper = neededFakeContainer || this.fakeWrapperTo;\n const forwards = !!neededFakeContainer;\n const oldFakeWrapperTo = this.fakeWrapperTo;\n let transform = '', borderRadius = '', needTranslateX: number;\n // if(forwards) {]\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\n const fakeRowsRect = this.fakeRowsWrapper.getBoundingClientRect();\n const widthFrom = fakeRowsRect.width;\n const widthTo = fakeSelectionRect.width;\n\n if(widthFrom !== widthTo) {\n const scale = (widthTo/* - 8 */) / widthFrom;\n const initTranslateX = (widthFrom - widthTo) / 2;\n needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\n\n if(forwards) {\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\n // transform = `translateX(0px) scaleX(${scale})`;\n\n if(scale < 1) {\n const br = 16;\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\n }\n }\n // scale = widthTo / widthFrom;\n }\n // }\n\n this.fakeWrapperTo = neededFakeContainer;\n\n const duration = animate ? 200 : 0;\n SetTransition({\n element: this.inputContainer,\n className: 'is-centering',\n forwards,\n duration\n });\n SetTransition({\n element: this.rowsWrapperWrapper,\n className: 'is-centering-to-control',\n forwards: !!(forwards && neededFakeContainer && neededFakeContainer.classList.contains('chat-input-control')),\n duration\n });\n this.rowsWrapper.style.transform = transform;\n this.rowsWrapper.style.borderRadius = borderRadius;\n\n return {\n transform,\n borderRadius,\n needTranslateX: oldFakeWrapperTo && (\n (\n neededFakeContainer &&\n neededFakeContainer.classList.contains('chat-input-control') &&\n oldFakeWrapperTo === this.fakeSelectionWrapper\n ) || oldFakeWrapperTo.classList.contains('chat-input-control')\n ) ? needTranslateX * -.5 : needTranslateX,\n widthFrom,\n widthTo\n };\n }\n\n public async center(animate = false) {\n return this._center(await this.getNeededFakeContainer(), animate);\n }\n\n public setStartParam(startParam?: string) {\n if(this.startParam === startParam) {\n return;\n }\n\n this.startParam = startParam;\n this.center(true);\n }\n\n public isReplyInTopicOverlayNeeded() {\n return this.chat.isForum &&\n !this.chat.isForumTopic &&\n !this.replyToMsgId &&\n this.chat.type === 'chat';\n }\n\n public async getNeededFakeContainer(startParam = this.startParam) {\n if(this.chat.selection.isSelecting) {\n return this.fakeSelectionWrapper;\n } else if(\n startParam !== undefined ||\n !(await this.chat.canSend()) ||\n this.chat.type === 'pinned' ||\n await this.chat.isStartButtonNeeded() ||\n this.isReplyInTopicOverlayNeeded()\n ) {\n return this.controlContainer;\n }\n }\n\n // public getActiveContainer() {\n // if(this.chat.selection.isSelecting) {\n // return this.chat\n // }\n // return this.startParam !== undefined ? this.botStartContainer : this.rowsWrapper;\n // }\n\n // public setActiveContainer() {\n // const container = this.activeContainer;\n // const newContainer = this.getActiveContainer();\n // if(newContainer === container) {\n // return;\n // }\n\n\n // }\n\n private onCancelRecordClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n this.recordCanceled = true;\n this.recorder.stop();\n opusDecodeController.setKeepAlive(false);\n };\n\n private onEmoticonsOpen = () => {\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\n };\n\n private onEmoticonsClose = () => {\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\n };\n\n public getReadyToSend(callback: () => void) {\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\n }\n\n public scheduleSending = async(callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\n const {peerId} = this.chat;\n const middleware = this.chat.bubbles.getMiddleware();\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && await this.managers.appUsersManager.isUserOnlineVisible(peerId);\n\n new PopupSchedule(initDate, (timestamp) => {\n if(!middleware()) {\n return;\n }\n\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(timestamp <= minTimestamp) {\n timestamp = undefined;\n }\n\n this.scheduleDate = timestamp;\n callback();\n\n if(this.chat.type !== 'scheduled' && timestamp) {\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\n if(!middleware()) {\n return;\n }\n\n const popups = PopupElement.getPopups(PopupStickers);\n popups.forEach((popup) => popup.hide());\n\n this.appImManager.openScheduled(peerId);\n }, 0);\n }\n }, canSendWhenOnline).show();\n };\n\n public async setUnreadCount() {\n if(!this.goDownUnreadBadge) {\n return;\n }\n\n const dialog = await this.managers.dialogsStorage.getDialogOrTopic(this.chat.peerId, this.chat.type === 'discussion' ? undefined : this.chat.threadId);\n const count = dialog?.unread_count;\n this.goDownUnreadBadge.innerText = '' + (count || '');\n this.goDownUnreadBadge.classList.toggle('badge-gray', await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.chat.peerId, respectType: true, threadId: this.chat.threadId}));\n\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\n const hasMentions = !!(dialog?.unread_mentions_count && dialog.unread_count);\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\n }\n }\n\n public getCurrentInputAsDraft() {\n const {value, entities} = getRichValueWithCaret(this.messageInputField.input, true, false);\n\n let draft: DraftMessage.draftMessage;\n if(value.length || this.replyToMsgId) {\n draft = {\n _: 'draftMessage',\n date: tsNow(true),\n message: value,\n entities: entities.length ? entities : undefined,\n pFlags: {\n no_webpage: this.noWebPage\n },\n reply_to_msg_id: this.replyToMsgId\n };\n }\n\n return draft;\n }\n\n public saveDraft() {\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\n const draft = this.getCurrentInputAsDraft();\n this.managers.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\n }\n\n public destroy() {\n // this.chat.log.error('Input destroying');\n\n this.listenerSetter.removeAll();\n }\n\n public cleanup(helperToo = true) {\n if(!this.chat.peerId) {\n this.chatInput.classList.add('hide');\n this.goDownBtn.classList.add('hide');\n }\n\n cancelSelection();\n\n this.lastTimeType = 0;\n this.startParam = undefined;\n\n if(this.toggleBotStartBtnDisability) {\n this.toggleBotStartBtnDisability();\n this.toggleBotStartBtnDisability = undefined;\n }\n\n if(this.messageInput) {\n this.clearInput();\n helperToo && this.clearHelper();\n }\n }\n\n public async setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\n\n if(!draft) {\n draft = await this.managers.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\n\n if(!draft) {\n if(force) { // this situation can only happen when sending message with clearDraft\n /* const height = this.chatInput.getBoundingClientRect().height;\n const willChangeHeight = 78 - height;\n this.willChangeHeight = willChangeHeight; */\n if(this.chat.container.classList.contains('is-helper-active')) {\n this.t();\n }\n\n this.messageInputField.inputFake.textContent = '';\n this.messageInputField.onFakeInput(false);\n\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\n fastRaf(() => {\n this.onMessageSent();\n });\n });\n }\n\n return false;\n }\n }\n\n const wrappedDraft = wrapDraft(draft, this.chat.peerId);\n const currentDraft = this.getCurrentInputAsDraft();\n\n if(draftsAreEqual(draft, currentDraft) &&/* this.messageInputField.value === wrappedDraft && */this.replyToMsgId === draft.reply_to_msg_id) return false;\n\n if(fromUpdate) {\n this.clearHelper();\n }\n\n this.noWebPage = draft.pFlags.no_webpage;\n if(draft.reply_to_msg_id) {\n this.initMessageReply(draft.reply_to_msg_id);\n }\n\n this.setInputValue(wrappedDraft, fromUpdate, fromUpdate);\n return true;\n }\n\n private createSendAs() {\n this.sendAsPeerId = undefined;\n\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n let firstChange = true;\n this.sendAs = new ChatSendAs(\n this.managers,\n (container, skipAnimation) => {\n let useRafs = 0;\n if(!container.parentElement) {\n this.newMessageWrapper.prepend(container);\n useRafs = 2;\n }\n\n this.updateOffset('as', true, skipAnimation, useRafs);\n },\n (sendAsPeerId) => {\n this.sendAsPeerId = sendAsPeerId;\n\n // do not change placeholder earlier than finishPeerChange does\n if(firstChange) {\n firstChange = false;\n return;\n }\n\n this.getPlaceholderKey().then((key) => {\n this.updateMessageInputPlaceholder(key);\n });\n }\n );\n } else {\n this.sendAs = undefined;\n }\n\n return this.sendAs;\n }\n\n public async finishPeerChange(startParam?: string) {\n const peerId = this.chat.peerId;\n\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput, botCommandsToggle} = this;\n\n const previousSendAs = this.sendAs;\n const sendAs = this.createSendAs();\n\n const [\n isBroadcast,\n canPinMessage,\n isBot,\n canSend,\n neededFakeContainer,\n ackedPeerFull,\n ackedScheduledMids,\n setSendAsCallback,\n filteredAttachMenuButtons\n ] = await Promise.all([\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.canPinMessage(peerId),\n this.managers.appPeersManager.isBot(peerId),\n this.chat.canSend(),\n this.getNeededFakeContainer(startParam),\n modifyAckedPromise(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId)),\n btnScheduled ? modifyAckedPromise(this.managers.acknowledged.appMessagesManager.getScheduledMessages(peerId)) : undefined,\n sendAs ? (sendAs.setPeerId(this.chat.peerId), sendAs.updateManual(true)) : undefined,\n this.filterAttachMenuButtons()\n ]);\n\n const placeholderKey = this.messageInput ? await this.getPlaceholderKey() : undefined;\n\n return () => {\n // console.warn('[input] finishpeerchange start');\n\n chatInput.classList.remove('hide');\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\n goDownBtn.classList.remove('hide');\n\n this.messageInputField?.onFakeInput();\n\n if(this.goDownUnreadBadge) {\n this.setUnreadCount();\n }\n\n if(this.chat.type === 'pinned') {\n chatInput.classList.toggle('can-pin', canPinMessage);\n }/* else if(this.chat.type === 'chat') {\n } */\n\n if(forwardElements) {\n this.forwardWasDroppingAuthor = false;\n forwardElements.showCaption.checkboxField.setValueSilently(true);\n forwardElements.showSender.checkboxField.setValueSilently(true);\n }\n\n if(btnScheduled && ackedScheduledMids) {\n btnScheduled.classList.add('hide');\n const middleware = this.chat.bubbles.getMiddleware();\n callbackify(ackedScheduledMids.result, (mids) => {\n if(!middleware() || !mids) return;\n btnScheduled.classList.toggle('hide', !mids.length);\n });\n }\n\n if(this.newMessageWrapper) {\n this.updateOffset(null, false, true);\n }\n\n if(botCommandsToggle) {\n this.hasBotCommands = undefined;\n this.botCommands.toggle(true, undefined, true);\n this.updateBotCommandsToggle(true);\n botCommandsToggle.remove();\n if(isBot) {\n const middleware = this.chat.bubbles.getMiddleware();\n const result = ackedPeerFull.result;\n callbackify(result, (userFull) => {\n if(!middleware()) return;\n this.updateBotCommands(userFull as UserFull.userFull, !(result instanceof Promise));\n });\n }\n }\n\n if(previousSendAs) {\n previousSendAs.destroy();\n }\n\n if(setSendAsCallback) {\n setSendAsCallback();\n }\n\n if(replyKeyboard) {\n replyKeyboard.setPeer(peerId);\n }\n\n if(sendMenu) {\n sendMenu.setPeerId(peerId);\n }\n\n if(this.messageInput) {\n this.updateMessageInput(canSend, placeholderKey, filteredAttachMenuButtons);\n this.messageInput.dataset.peerId = '' + peerId;\n }\n\n let haveSomethingInControl = false;\n if(this.pinnedControlBtn) {\n const good = this.chat.type === 'pinned';\n haveSomethingInControl ||= good;\n this.pinnedControlBtn.classList.toggle('hide', !good);\n this.pinnedControlBtn.replaceChildren(i18n(canPinMessage ? 'Chat.Input.UnpinAll' : 'Chat.Pinned.DontShow'));\n }\n\n {\n const good = this.chat.isForum && !this.chat.isForumTopic && this.chat.type === 'chat';\n haveSomethingInControl ||= good;\n this.replyInTopicOverlay.classList.toggle('hide', !good);\n }\n\n this.botStartBtn.classList.toggle('hide', haveSomethingInControl);\n\n // * testing\n // this.startParam = this.appPeersManager.isBot(peerId) ? '123' : undefined;\n\n this.startParam = startParam;\n\n this._center(neededFakeContainer, false);\n\n // console.warn('[input] finishpeerchange ends');\n };\n }\n\n private updateOffset(type: 'commands' | 'as', forwards: boolean, skipAnimation?: boolean, useRafs?: number) {\n if(type) {\n this.newMessageWrapper.dataset.offset = type;\n } else {\n delete this.newMessageWrapper.dataset.offset;\n }\n\n SetTransition({\n element: this.newMessageWrapper,\n className: 'has-offset',\n forwards,\n duration: skipAnimation ? 0 : 300,\n useRafs\n });\n }\n\n private updateBotCommands(userFull: UserFull.userFull, skipAnimation?: boolean) {\n this.hasBotCommands = !!userFull.bot_info?.commands?.length;\n this.updateBotCommandsToggle(skipAnimation);\n }\n\n private updateBotCommandsToggle(skipAnimation?: boolean) {\n const {botCommandsToggle, hasBotCommands} = this;\n\n const show = !!hasBotCommands && this.isInputEmpty();\n if(!hasBotCommands) {\n if(!botCommandsToggle.parentElement) {\n return;\n }\n\n botCommandsToggle.remove();\n }\n\n const forwards = show;\n const useRafs = botCommandsToggle.parentElement ? 0 : 2;\n\n if(!botCommandsToggle.parentElement) {\n this.newMessageWrapper.prepend(botCommandsToggle);\n }\n\n this.updateOffset('commands', forwards, skipAnimation, useRafs);\n }\n\n private async getPlaceholderKey() {\n const {peerId, threadId, isForum} = this.chat;\n let key: LangPackKey;\n if(threadId && !isForum) {\n key = 'Comment';\n } else if(await this.managers.appPeersManager.isBroadcast(peerId)) {\n key = 'ChannelBroadcast';\n } else if(\n (this.sendAsPeerId !== undefined && this.sendAsPeerId !== rootScope.myId) ||\n await this.managers.appMessagesManager.isAnonymousSending(peerId)\n ) {\n key = 'SendAnonymously';\n } else {\n key = 'Message';\n }\n\n return key;\n }\n\n private updateMessageInputPlaceholder(key: LangPackKey) {\n // console.warn('[input] update placeholder');\n const i = I18n.weakMap.get(this.messageInput) as I18n.IntlElement;\n if(!i) {\n return;\n }\n\n i.compareAndUpdate({key});\n }\n\n private filterAttachMenuButtons() {\n if(!this.attachMenuButtons) return;\n return filterAsync(this.attachMenuButtons, (button) => {\n return button.verify();\n });\n }\n\n public updateMessageInput(canSend: boolean, placeholderKey: LangPackKey, visible: ChatInput['attachMenuButtons']) {\n const {chatInput, attachMenu, messageInput} = this;\n const {peerId, threadId} = this.chat;\n const isHidden = chatInput.classList.contains('is-hidden');\n const willBeHidden = !canSend;\n if(isHidden !== willBeHidden) {\n chatInput.classList.add('no-transition');\n chatInput.classList.toggle('is-hidden', !canSend);\n void chatInput.offsetLeft; // reflow\n chatInput.classList.remove('no-transition');\n }\n\n this.updateMessageInputPlaceholder(placeholderKey);\n\n if(!canSend) {\n messageInput.contentEditable = 'inherit';\n } else {\n messageInput.contentEditable = 'true';\n this.setDraft(undefined, false);\n\n if(!messageInput.innerHTML) {\n this.messageInputField.onFakeInput();\n }\n }\n\n if(attachMenu) {\n attachMenu.toggleAttribute('disabled', !visible.length);\n attachMenu.classList.toggle('btn-disabled', !visible.length);\n }\n\n this.updateSendBtn();\n }\n\n private attachMessageInputField() {\n const oldInputField = this.messageInputField;\n this.messageInputField = new InputFieldAnimated({\n placeholder: 'Message',\n name: 'message',\n withLinebreaks: true\n });\n\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\n this.messageInput = this.messageInputField.input;\n this.attachMessageInputListeners();\n\n if(IS_STICKY_INPUT_BUGGED) {\n fixSafariStickyInputFocusing(this.messageInput);\n }\n\n if(oldInputField) {\n oldInputField.input.replaceWith(this.messageInputField.input);\n oldInputField.inputFake.replaceWith(this.messageInputField.inputFake);\n } else {\n this.inputMessageContainer.append(this.messageInputField.input, this.messageInputField.inputFake);\n }\n }\n\n private attachMessageInputListeners() {\n this.listenerSetter.add(this.messageInput)('keydown', (e) => {\n const key = e.key;\n\n if(isSendShortcutPressed(e)) {\n cancelEvent(e);\n this.sendMessage();\n } else if(e.ctrlKey || e.metaKey) {\n this.handleMarkdownShortcut(e);\n } else if((key === 'PageUp' || key === 'PageDown') && !e.shiftKey) { // * fix pushing page to left (Chrome Windows)\n e.preventDefault();\n\n if(key === 'PageUp') {\n const range = document.createRange();\n const sel = window.getSelection();\n\n range.setStart(this.messageInput.childNodes[0] || this.messageInput, 0);\n range.collapse(true);\n\n sel.removeAllRanges();\n sel.addRange(range);\n } else {\n placeCaretAtEnd(this.messageInput);\n }\n }\n });\n\n if(IS_TOUCH_SUPPORTED) {\n attachClickEvent(this.messageInput, (e) => {\n if(emoticonsDropdown.isActive()) {\n emoticonsDropdown.toggle(false);\n blurActiveElement();\n cancelEvent(e);\n // this.messageInput.focus();\n return;\n }\n\n this.appImManager.selectTab(APP_TABS.CHAT); // * set chat tab for album orientation\n // this.saveScroll();\n }, {listenerSetter: this.listenerSetter});\n\n /* this.listenerSetter.add(window)('resize', () => {\n this.restoreScroll();\n }); */\n\n /* if(isSafari) {\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => {\n emoticonsDropdown.toggle(false);\n });\n });\n });\n } */\n }\n\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\n // * validate due to manual formatting through browser's context menu\n const inputType = (e as InputEvent).inputType;\n //console.log('message beforeinput event', e);\n\n if(inputType.indexOf('format') === 0) {\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\n if(this.applyMarkdown(markdownType)) {\n cancelEvent(e); // * cancel legacy markdown event\n }\n }\n }); */\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\n this.listenerSetter.add(this.messageInput)('keyup', () => {\n this.checkAutocomplete();\n });\n\n this.listenerSetter.add(this.messageInput)('focusin', () => {\n if((this.chat.type === 'chat' || this.chat.type === 'discussion') &&\n this.chat.bubbles.scrollable.loadedAll.bottom) {\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\n }\n });\n }\n\n private prepareDocumentExecute = () => {\n this.executedHistory.push(this.messageInput.innerHTML);\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\n };\n\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\n cancelEvent(e); // cancel legacy event\n\n let html = this.messageInput.innerHTML;\n if(html && html !== needHTML) {\n this.lockRedo = true;\n\n let sameHTMLTimes = 0;\n do {\n document.execCommand(type, false, null);\n const currentHTML = this.messageInput.innerHTML;\n if(html === currentHTML) {\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (а может и нет, случай: заболдить подчёркнутый текст (выделить ровно его), попробовать отменить)\n break;\n }\n } else {\n sameHTMLTimes = 0;\n }\n\n html = currentHTML;\n } while(html !== needHTML);\n\n this.lockRedo = false;\n }\n };\n\n public applyMarkdown(type: MarkdownType, href?: string) {\n // const MONOSPACE_FONT = 'var(--font-monospace)';\n // const SPOILER_FONT = 'spoiler';\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\n // bold: 'Bold',\n // italic: 'Italic',\n // underline: 'Underline',\n // strikethrough: 'Strikethrough',\n // monospace: () => document.execCommand('fontName', false, MONOSPACE_FONT),\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null)\n // spoiler: () => document.execCommand('fontName', false, SPOILER_FONT)\n };\n\n const c = (type: MarkdownType) => {\n commandsMap[type] = () => {\n const k = (canCombine.includes(type) ? canCombine : [type]).filter((type) => hasMarkup[type]);\n if(!indexOfAndSplice(k, type)) {\n k.push(type);\n }\n\n if(!k.length) {\n return this.resetCurrentFontFormatting();\n } else {\n return document.execCommand('fontName', false, 'markup-' + k.join('-'));\n }\n };\n };\n\n const canCombine = ['bold', 'italic', 'underline', 'strikethrough', 'spoiler'] as (typeof type)[];\n canCombine.forEach((type) => {\n c(type);\n });\n\n c('monospace');\n\n if(!commandsMap[type]) {\n return false;\n }\n\n const command = commandsMap[type];\n\n // type = 'monospace';\n\n // const saveExecuted = this.prepareDocumentExecute();\n const executed: any[] = [];\n /**\n * * clear previous formatting, due to Telegram's inability to handle several entities\n */\n /* const checkForSingle = () => {\n const nodes = getSelectedNodes();\n //console.log('Using formatting:', commandsMap[type], nodes, this.executedHistory);\n\n const parents = [...new Set(nodes.map((node) => node.parentNode))];\n //const differentParents = !!nodes.find((node) => node.parentNode !== firstParent);\n const differentParents = parents.length > 1;\n\n let notSingle = false;\n if(differentParents) {\n notSingle = true;\n } else {\n const node = nodes[0];\n if(node && (node.parentNode as HTMLElement) !== this.messageInput && (node.parentNode.parentNode as HTMLElement) !== this.messageInput) {\n notSingle = true;\n }\n }\n\n if(notSingle) {\n //if(type === 'monospace') {\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\n //}\n\n executed.push(document.execCommand('unlink', false, null));\n executed.push(document.execCommand('removeFormat', false, null));\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n\n //if(type === 'monospace') {\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\n //}\n }\n }; */\n\n // fix applying markdown when range starts from contenteditable=\"false\"\n let textNode: Text;\n // do {\n // // const {node, offset, selection} = getCaretPosNew(this.messageInput, true);\n // const selection = document.getSelection();\n // const range = selection.getRangeAt(0);\n // const {node, offset} = getCaretPosF(this.messageInput, range.startContainer, range.startOffset);\n // // const node = range.startContainer as ChildNode;\n // if(node?.textContent === BOM || (node as HTMLElement)?.isContentEditable === false) {\n // // selection.modify('extend', 'backward', 'character');\n // textNode = document.createTextNode(BOM);\n // (node.nodeType === node.ELEMENT_NODE ? node : node.parentElement).before(textNode);\n // range.setStart(textNode, 0);\n // }/* else {\n // break;\n // } */\n\n // break;\n // } while(true);\n\n const richInputHandler = RichInputHandler.getInstance();\n const restore = richInputHandler.prepareApplyingMarkdown();\n\n const listener = this.listenerSetter.add(this.messageInput)('input', cancelEvent, {capture: true, passive: false}) as any as Listener;\n\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\n\n const hasMarkup = hasMarkupInSelection(Object.keys(commandsMap) as (typeof type)[]);\n\n // * monospace can't be combined with different types\n /* if(type === 'monospace' || type === 'spoiler') {\n // executed.push(document.execCommand('styleWithCSS', false, 'true'));\n\n const haveThisType = hasMarkup[type];\n // executed.push(document.execCommand('removeFormat', false, null));\n\n if(haveThisType) {\n executed.push(this.resetCurrentFontFormatting());\n } else {\n // if(type === 'monospace' || hasMarkup['monospace']) {\n // executed.push(this.resetCurrentFormatting());\n // }\n\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n }\n } else */{\n if(hasMarkup['monospace'] && type === 'link') {\n executed.push(this.resetCurrentFormatting());\n }\n\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n }\n\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\n\n restore();\n\n // checkForSingle();\n // saveExecuted();\n if(this.appImManager.markupTooltip) {\n this.appImManager.markupTooltip.setActiveMarkupButton();\n }\n\n if(textNode) {\n (textNode.parentElement === this.messageInput ? textNode : textNode.parentElement).remove();\n textNode.nodeValue = '';\n }\n\n this.listenerSetter.remove(listener);\n this.messageInputField.simulateInputEvent();\n\n return true;\n }\n\n private resetCurrentFormatting() {\n return document.execCommand('removeFormat', false, null);\n }\n\n private resetCurrentFontFormatting() {\n return document.execCommand('fontName', false, 'Roboto');\n }\n\n private handleMarkdownShortcut = (e: KeyboardEvent) => {\n // console.log('handleMarkdownShortcut', e);\n const formatKeys: {[key: string]: MarkdownType} = {\n 'KeyB': 'bold',\n 'KeyI': 'italic',\n 'KeyU': 'underline',\n 'KeyS': 'strikethrough',\n 'KeyM': 'monospace',\n 'KeyP': 'spoiler'\n };\n\n if(this.appImManager.markupTooltip) {\n formatKeys['KeyK'] = 'link';\n }\n\n const code = e.code;\n const applyMarkdown = formatKeys[code];\n\n const selection = document.getSelection();\n if(!isSelectionEmpty(selection) && applyMarkdown) {\n // * костыльчик\n if(code === 'KeyK') {\n this.appImManager.markupTooltip.showLinkEditor();\n } else {\n this.applyMarkdown(applyMarkdown);\n }\n\n cancelEvent(e); // cancel legacy event\n }\n\n // return;\n if(code === 'KeyZ') {\n let html = this.messageInput.innerHTML;\n\n if(e.shiftKey) {\n if(this.undoHistory.length) {\n this.executedHistory.push(html);\n html = this.undoHistory.pop();\n this.undoRedo(e, 'redo', html);\n html = this.messageInput.innerHTML;\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\n this.canUndoFromHTML = html;\n }\n } else {\n // * подождём, когда пользователь сам восстановит поле до нужного состояния, которое стало сразу после saveExecuted\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\n this.undoHistory.push(html);\n html = this.executedHistory.pop();\n this.undoRedo(e, 'undo', html);\n\n // * поставим новое состояние чтобы снова подождать, если пользователь изменит что-то, и потом попробует откатить до предыдущего состояния\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\n }\n }\n }\n };\n\n private onMessageInput = (e?: Event) => {\n // * validate due to manual formatting through browser's context menu\n /* const inputType = (e as InputEvent).inputType;\n console.log('message input event', e);\n if(inputType === 'formatBold') {\n console.log('message input format', this.messageInput.innerHTML);\n cancelEvent(e);\n }\n\n if(!isSelectionSingle()) {\n alert('not single');\n } */\n\n // console.log('messageInput input', this.messageInput.innerText);\n // const value = this.messageInput.innerText;\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\n\n // const entities = parseEntities(value);\n const value = parseMarkdown(richValue, markdownEntities, true);\n const entities = mergeEntities(markdownEntities, parseEntities(value));\n\n // this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\n\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\n this.canRedoFromHTML = '';\n this.undoHistory.length = 0;\n }\n\n const urlEntities: Array = (!this.editMessage?.media || this.editMessage.media._ === 'messageMediaWebPage') && entities.filter((e) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\n if(urlEntities.length) {\n for(const entity of urlEntities) {\n let url: string;\n if(entity._ === 'messageEntityTextUrl') {\n url = entity.url;\n } else {\n url = richValue.slice(entity.offset, entity.offset + entity.length);\n\n if(!(url.includes('http://') || url.includes('https://'))) {\n continue;\n }\n }\n\n // console.log('messageInput url:', url);\n\n if(this.lastUrl !== url) {\n this.lastUrl = url;\n // this.willSendWebPage = null;\n const promise = this.getWebPagePromise = this.managers.appWebPagesManager.getWebPage(url).then((webpage) => {\n if(this.getWebPagePromise === promise) this.getWebPagePromise = undefined;\n if(this.lastUrl !== url) return;\n if(webpage._ === 'webPage') {\n // console.log('got webpage: ', webpage);\n\n this.setTopInfo('webpage', () => {}, webpage.site_name || webpage.title || 'Webpage', webpage.description || webpage.url || '');\n delete this.noWebPage;\n this.willSendWebPage = webpage;\n } else if(this.willSendWebPage) {\n this.onHelperCancel();\n }\n });\n }\n\n break;\n }\n } else if(this.lastUrl) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n\n if(this.helperType) {\n this.helperFunc();\n } else {\n this.clearHelper();\n }\n }\n\n const isEmpty = !richValue.trim();\n if(isEmpty) {\n if(this.lastTimeType) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'}, undefined, this.chat.threadId);\n }\n\n if(this.appImManager.markupTooltip) {\n this.appImManager.markupTooltip.hide();\n }\n\n // * Chrome has a bug - it will preserve the formatting if the input with monospace text is cleared\n // * so have to reset formatting\n if(document.activeElement === this.messageInput) {\n // document.execCommand('styleWithCSS', false, 'true');\n setTimeout(() => {\n if(document.activeElement === this.messageInput) {\n this.resetCurrentFontFormatting();\n }\n }, 0);\n // document.execCommand('styleWithCSS', false, 'false');\n }\n } else {\n const time = Date.now();\n if((time - this.lastTimeType) >= 6000) {\n this.lastTimeType = time;\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'}, undefined, this.chat.threadId);\n }\n\n if(this.botCommands) {\n this.botCommands.toggle(true);\n }\n }\n\n if(this.botCommands) {\n this.updateBotCommandsToggle();\n }\n\n if(!this.editMsgId) {\n this.saveDraftDebounced();\n }\n\n this.checkAutocomplete(richValue, caretPos, entities);\n\n this.updateSendBtn();\n };\n\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\n RichInputHandler.getInstance().makeFocused(this.messageInput);\n\n const {value: fullValue, caretPos, entities} = getRichValueWithCaret(this.messageInput);\n const pos = caretPos >= 0 ? caretPos : fullValue.length;\n const prefix = fullValue.substr(0, pos);\n const suffix = fullValue.substr(pos);\n\n const matches = isHelper ? prefix.match(ChatInput.AUTO_COMPLETE_REG_EXP) : null;\n\n const matchIndex = matches ? matches.index + (matches[0].length - matches[2].length) : prefix.length;\n const newPrefix = prefix.slice(0, matchIndex);\n const newValue = newPrefix + insertText + suffix;\n\n if(isHelper && caretPos !== -1) {\n const match = matches[2];\n // const {node, selection} = getCaretPosNew(this.messageInput);\n\n const selection = document.getSelection();\n // const range = document.createRange();\n let counter = 0;\n while(selection.toString() !== match) {\n if(++counter >= 10000) {\n throw new Error('lolwhat');\n }\n\n // for(let i = 0; i < match.length; ++i) {\n selection.modify('extend', 'backward', 'character');\n }\n }\n\n {\n // const fragment = wrapDraftText(insertText, {entities: insertEntity ? [insertEntity] : undefined, wrappingForPeerId: this.chat.peerId});\n insertRichTextAsHTML(this.messageInput, insertText, insertEntity ? [insertEntity] : undefined, this.chat.peerId);\n // const {node, offset} = getCaretPos(this.messageInput);\n // const fragmentLastChild = fragment.lastChild;\n // if(node?.nodeType === node.TEXT_NODE) {\n // const prefix = node.nodeValue.slice(0, offset);\n // const suffix = node.nodeValue.slice(offset);\n\n // const suffixNode = document.createTextNode(suffix);\n\n // node.nodeValue = prefix;\n // node.parentNode.insertBefore(suffixNode, node.nextSibling);\n // node.parentNode.insertBefore(fragment, suffixNode);\n\n // setCaretAt(fragmentLastChild.nextSibling);\n\n // this.messageInputField.simulateInputEvent();\n // }\n }\n return;\n\n // merge emojis\n const hadEntities = parseEntities(fullValue);\n mergeEntities(entities, hadEntities);\n\n // max for additional whitespace\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\n const addEntities: MessageEntity[] = [];\n if(insertEntity) {\n addEntities.push(insertEntity);\n insertEntity.offset = matchIndex;\n }\n\n // add offset to entities next to emoji\n const diff = matches ? insertLength - matches[2].length : insertLength;\n entities.forEach((entity) => {\n if(entity.offset >= matchIndex) {\n entity.offset += diff;\n }\n });\n\n mergeEntities(entities, addEntities);\n\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\n const caretEntity: MessageEntity.messageEntityCaret = {\n _: 'messageEntityCaret',\n offset: matchIndex + insertLength,\n length: 0\n };\n\n let insertCaretAtIndex = 0;\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\n const entity = entities[insertCaretAtIndex];\n if(entity.offset > caretEntity.offset) {\n break;\n }\n }\n\n entities.splice(insertCaretAtIndex, 0, caretEntity);\n }\n\n // const saveExecuted = this.prepareDocumentExecute();\n // can't exec .value here because it will instantly check for autocomplete\n const value = documentFragmentToHTML(wrapDraftText(newValue, {entities}));\n this.messageInputField.setValueSilently(value);\n\n const caret = this.messageInput.querySelector('.composer-sel');\n if(caret) {\n setCaretAt(caret);\n caret.remove();\n }\n\n // but it's needed to be checked only here\n this.onMessageInput();\n\n // saveExecuted();\n\n // document.execCommand('insertHTML', true, wrapEmojiText(emoji));\n }\n\n public onEmojiSelected = (emoji: ReturnType, autocomplete: boolean) => {\n const entity: MessageEntity = emoji.docId ? {_: 'messageEntityCustomEmoji', document_id: emoji.docId, length: emoji.emoji.length, offset: 0} : getEmojiEntityFromEmoji(emoji.emoji);\n this.insertAtCaret(emoji.emoji, entity, autocomplete);\n };\n\n private async checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\n // return;\n\n if(value === undefined) {\n const r = getRichValueWithCaret(this.messageInputField.input, true, true);\n value = r.value;\n caretPos = r.caretPos;\n entities = r.entities;\n }\n\n if(caretPos === -1) {\n caretPos = value.length;\n }\n\n if(entities === undefined) {\n const _value = parseMarkdown(value, entities, true);\n entities = mergeEntities(entities, parseEntities(_value));\n }\n\n value = value.slice(0, caretPos);\n\n if(this.previousQuery === value) {\n return;\n }\n\n this.previousQuery = value;\n\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\n let foundHelper: AutocompleteHelper;\n if(matches) {\n const entity = entities[0];\n\n let query = matches[2];\n const firstChar = query[0];\n\n if(this.stickersHelper &&\n rootScope.settings.stickers.suggest &&\n await this.chat.canSend('send_stickers') &&\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\n foundHelper = this.stickersHelper;\n this.stickersHelper.checkEmoticon(value);\n } else if(firstChar === '@') { // mentions\n const topMsgId = this.chat.threadId ? getServerMessageId(this.chat.threadId) : undefined;\n if(await this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\n foundHelper = this.mentionsHelper;\n }\n } else if(!matches[1] && firstChar === '/') { // commands\n if(await this.commandsHelper.checkQuery(query, this.chat.peerId)) {\n foundHelper = this.commandsHelper;\n }\n } else if(rootScope.settings.emoji.suggest) { // emoji\n query = query.replace(/^\\s*/, '');\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\n foundHelper = this.emojiHelper;\n this.emojiHelper.checkQuery(query, firstChar);\n }\n }\n }\n\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\n\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\n }\n\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\n let needPlaceholder = false;\n\n const setPreloaderShow = (show: boolean) => {\n if(!this.btnPreloader) {\n return;\n }\n\n SetTransition({\n element: this.btnPreloader,\n className: 'show',\n forwards: show,\n duration: 400\n });\n };\n\n if(!foundHelper) {\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\n if(inlineMatch) {\n const username = inlineMatch[1];\n const query = value.slice(inlineMatch[0].length);\n needPlaceholder = inlineMatch[0].length === value.length;\n\n foundHelper = this.inlineHelper;\n\n if(!this.btnPreloader) {\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\n putPreloader(this.btnPreloader, true);\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\n } else {\n setPreloaderShow(true);\n }\n\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\n if(needPlaceholder && user.bot_inline_placeholder) {\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\n }\n\n renderPromise.then(() => {\n setPreloaderShow(false);\n });\n }).catch((err: ApiError) => {\n setPreloaderShow(false);\n });\n }\n }\n\n if(!needPlaceholder) {\n delete this.messageInput.dataset.inlinePlaceholder;\n }\n\n if(foundHelper !== this.inlineHelper) {\n setPreloaderShow(false);\n }\n\n return foundHelper;\n }\n\n private setRecording(value: boolean) {\n if(this.recording === value) {\n return;\n }\n\n SetTransition({\n element: this.chatInput,\n className: 'is-recording',\n forwards: value,\n duration: 200\n });\n this.recording = value;\n this.updateSendBtn();\n }\n\n private onBtnSendClick = async(e: Event) => {\n cancelEvent(e);\n\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\n if(this.recording) {\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\n this.onCancelRecordClick();\n } else {\n this.recorder.stop();\n }\n } else {\n this.sendMessage();\n }\n } else {\n const isAnyChat = this.chat.peerId.isAnyChat();\n if(isAnyChat && !(await this.chat.canSend('send_media'))) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n return;\n }\n\n this.chatInput.classList.add('is-locked');\n blurActiveElement();\n\n let restricted = false;\n if(!isAnyChat) {\n const userFull = await this.managers.appProfileManager.getProfile(this.chat.peerId.toUserId());\n if(userFull?.pFlags.voice_messages_forbidden) {\n toastNew({\n langPackKey: 'Chat.SendVoice.PrivacyError',\n langPackArguments: [await wrapPeerTitle({peerId: this.chat.peerId})]\n });\n restricted = true;\n }\n }\n\n if(restricted) {\n this.chatInput.classList.remove('is-locked');\n return;\n }\n\n this.recorder.start().then(() => {\n this.releaseMediaPlayback = appMediaPlaybackController.setSingleMedia();\n this.recordCanceled = false;\n\n this.setRecording(true);\n opusDecodeController.setKeepAlive(true);\n\n const showDiscardPopup = () => {\n new PopupPeer('popup-cancel-record', {\n titleLangKey: 'DiscardVoiceMessageTitle',\n descriptionLangKey: 'DiscardVoiceMessageDescription',\n buttons: [{\n langKey: 'DiscardVoiceMessageAction',\n callback: () => {\n simulateClickEvent(this.btnCancelRecord);\n }\n }, {\n langKey: 'Continue',\n isCancel: true\n }]\n }).show();\n };\n\n this.recordingOverlayListener = this.listenerSetter.add(document.body)('mousedown', (e) => {\n if(!findUpClassName(e.target, 'chat-input') && !findUpClassName(e.target, 'popup-cancel-record')) {\n cancelEvent(e);\n showDiscardPopup();\n }\n }, {capture: true, passive: false}) as any;\n\n appNavigationController.pushItem(this.recordingNavigationItem = {\n type: 'voice',\n onPop: () => {\n setTimeout(() => {\n showDiscardPopup();\n }, 0);\n\n return false;\n }\n });\n\n this.recordStartTime = Date.now();\n\n const sourceNode: MediaStreamAudioSourceNode = this.recorder.sourceNode;\n const context = sourceNode.context;\n\n const analyser = context.createAnalyser();\n sourceNode.connect(analyser);\n // analyser.connect(context.destination);\n analyser.fftSize = 32;\n\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\n const max = frequencyData.length * 255;\n const min = 54 / 150;\n const r = () => {\n if(!this.recording) return;\n\n analyser.getByteFrequencyData(frequencyData);\n\n let sum = 0;\n frequencyData.forEach((value) => {\n sum += value;\n });\n\n const percents = Math.min(1, (sum / max) + min);\n // console.log('frequencyData', frequencyData, percents);\n\n this.recordRippleEl.style.transform = `scale(${percents})`;\n\n const diff = Date.now() - this.recordStartTime;\n const ms = diff % 1000;\n\n const formatted = toHHMMSS(diff / 1000) + ',' + ('00' + Math.round(ms / 10)).slice(-2);\n\n this.recordTimeEl.innerText = formatted;\n\n fastRaf(r);\n };\n\n r();\n }).catch((e: Error) => {\n switch(e.name as string) {\n case 'NotAllowedError': {\n toast('Please allow access to your microphone');\n break;\n }\n\n case 'NotReadableError': {\n toast(e.message);\n break;\n }\n\n default:\n console.error('Recorder start error:', e, e.name, e.message);\n toast(e.message);\n break;\n }\n\n this.setRecording(false);\n this.chatInput.classList.remove('is-locked');\n });\n }\n };\n\n private onHelperCancel = async(e?: Event, force?: boolean) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.willSendWebPage) {\n const lastUrl = this.lastUrl;\n let needReturn = false;\n if(this.helperType) {\n // if(this.helperFunc) {\n await this.helperFunc();\n // }\n\n needReturn = true;\n }\n\n // * restore values\n this.lastUrl = lastUrl;\n this.noWebPage = true;\n this.willSendWebPage = null;\n\n if(needReturn) return;\n }\n\n if(this.helperType === 'edit' && !force) {\n const message = this.editMessage;\n const draft = this.getCurrentInputAsDraft();\n if(draft) {\n delete draft.pFlags.no_webpage;\n }\n // const value = parseMarkdown(this.messageInputField.value, []);\n // if(message.message !== value) {\n if(!draftsAreEqual(draft, {...message, _: 'draftMessage'} as any)) {\n new PopupPeer('discard-editing', {\n buttons: [{\n langKey: 'Alert.Confirm.Discard',\n callback: () => {\n this.onHelperCancel(undefined, true);\n }\n }],\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\n }).show();\n\n return;\n }\n }\n\n this.clearHelper();\n this.updateSendBtn();\n };\n\n private onHelperClick = (e: Event) => {\n cancelEvent(e);\n\n if(!findUpClassName(e.target, 'reply')) return;\n if(this.helperType === 'forward') {\n const {forwardElements} = this;\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\n contextMenuController.openBtnMenu(forwardElements.container);\n }\n } else if(this.helperType === 'reply') {\n this.chat.setMessageId(this.replyToMsgId);\n } else if(this.helperType === 'edit') {\n this.chat.setMessageId(this.editMsgId);\n }\n };\n\n private changeForwardRecipient() {\n if(this.helperWaitingForward) return;\n this.helperWaitingForward = true;\n\n const forwarding = copy(this.forwarding);\n const helperFunc = this.helperFunc;\n this.clearHelper();\n this.updateSendBtn();\n let selected = false;\n const popup = new PopupForward(forwarding, () => {\n selected = true;\n });\n\n popup.addEventListener('close', () => {\n this.helperWaitingForward = false;\n\n if(!selected) {\n helperFunc();\n }\n });\n }\n\n public async clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\n const i = document.createElement('input');\n document.body.append(i);\n fixSafariStickyInput(i);\n this.messageInputField.setValueSilently(clearValue);\n fixSafariStickyInput(this.messageInput);\n i.remove();\n } else {\n this.messageInputField.setValueSilently(clearValue);\n }\n\n if(IS_TOUCH_SUPPORTED) {\n // this.messageInput.innerText = '';\n } else {\n // this.attachMessageInputField();\n // this.messageInput.innerText = '';\n\n // clear executions\n this.canRedoFromHTML = '';\n this.undoHistory.length = 0;\n this.executedHistory.length = 0;\n this.canUndoFromHTML = '';\n }\n\n let set = false;\n if(canSetDraft) {\n set = await this.setDraft(undefined, false);\n }\n\n if(!set && fireEvent) {\n this.onMessageInput();\n }\n }\n\n public isInputEmpty() {\n return isInputEmpty(this.messageInput);\n }\n\n public updateSendBtn() {\n let icon: 'send' | 'record' | 'edit' | 'schedule';\n\n const isInputEmpty = this.isInputEmpty();\n\n if(this.editMsgId) icon = 'edit';\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\n else icon = 'record';\n\n ['send', 'record', 'edit', 'schedule'].forEach((i) => {\n this.btnSend.classList.toggle(i, icon === i);\n });\n\n if(this.btnScheduled) {\n this.btnScheduled.classList.toggle('show', isInputEmpty && this.chat.type !== 'scheduled');\n }\n\n if(this.btnToggleReplyMarkup) {\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty && this.chat.type !== 'scheduled');\n }\n }\n\n private getValueAndEntities(input: HTMLElement) {\n const {entities: apiEntities, value} = getRichValueWithCaret(this.messageInput, true, false);\n const myEntities = parseEntities(value);\n const totalEntities = mergeEntities(apiEntities, myEntities);\n\n return {value, totalEntities};\n }\n\n public onMessageSent(clearInput = true, clearReply?: boolean) {\n if(this.chat.type !== 'scheduled') {\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\n }\n\n this.scheduleDate = undefined;\n this.sendSilent = undefined;\n\n const {totalEntities} = this.getValueAndEntities(this.messageInput);\n let nextOffset = 0;\n const emojiEntities: (MessageEntity.messageEntityEmoji | MessageEntity.messageEntityCustomEmoji)[] = totalEntities.filter((entity) => {\n if(entity._ === 'messageEntityEmoji' || entity._ === 'messageEntityCustomEmoji') {\n const endOffset = entity.offset + entity.length;\n return endOffset <= nextOffset ? false : (nextOffset = endOffset, true);\n }\n\n return false;\n }) as any;\n emojiEntities.forEach((entity) => {\n const emoji: AppEmoji = entity._ === 'messageEntityEmoji' ? {emoji: emojiFromCodePoints(entity.unicode)} : {docId: entity.document_id, emoji: ''};\n this.managers.appEmojiManager.pushRecentEmoji(emoji);\n });\n\n if(clearInput) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n this.clearInput();\n }\n\n if(clearReply || clearInput) {\n this.clearHelper();\n }\n\n this.updateSendBtn();\n }\n\n public sendMessage(force = false) {\n const {editMsgId, chat} = this;\n if(chat.type === 'scheduled' && !force && !editMsgId) {\n this.scheduleSending();\n return;\n }\n\n const {peerId} = chat;\n const {noWebPage} = this;\n const sendingParams = this.chat.getMessageSendingParams();\n\n const {value, entities} = getRichValueWithCaret(this.messageInputField.input, true, false);\n\n // return;\n if(editMsgId) {\n const message = this.editMessage;\n if(value.trim() || message.media) {\n this.managers.appMessagesManager.editMessage(message, value, {\n entities,\n noWebPage: noWebPage\n });\n\n this.onMessageSent();\n } else {\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\n\n return;\n }\n } else if(value.trim()) {\n this.managers.appMessagesManager.sendText(peerId, value, {\n entities,\n ...sendingParams,\n noWebPage: noWebPage,\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\n clearDraft: true\n });\n\n if(this.chat.type === 'scheduled') {\n this.onMessageSent(true);\n } else {\n this.onMessageSent(false, false);\n }\n // this.onMessageSent();\n }\n\n // * wait for sendText set messageId for invokeAfterMsg\n if(this.forwarding) {\n const forwarding = copy(this.forwarding);\n // setTimeout(() => {\n for(const fromPeerId in forwarding) {\n this.managers.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\n ...sendingParams,\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\n dropCaptions: this.isDroppingCaptions()\n }).catch(async(err: ApiError) => {\n if(err.type === 'VOICE_MESSAGES_FORBIDDEN') {\n toastNew({\n langPackKey: 'Chat.SendVoice.PrivacyError',\n langPackArguments: [await wrapPeerTitle({peerId})]\n });\n }\n });\n }\n\n if(!value) {\n this.onMessageSent();\n }\n // }, 0);\n }\n\n // this.onMessageSent();\n }\n\n public async sendMessageWithDocument(\n document: MyDocument | DocId,\n force = false,\n clearDraft = false,\n silent = false\n ) {\n document = await this.managers.appDocsManager.getDoc(document);\n\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\n if(this.chat.peerId.isAnyChat() && !(await this.chat.canSend(flag))) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n return false;\n }\n\n if(this.chat.type === 'scheduled' && !force) {\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft, silent));\n return false;\n }\n\n if(!document) {\n return false;\n }\n\n if(document.sticker && getStickerEffectThumb(document) && !rootScope.premium) {\n return false;\n }\n\n this.managers.appMessagesManager.sendFile(this.chat.peerId, {\n ...this.chat.getMessageSendingParams(),\n file: document,\n isMedia: true,\n clearDraft,\n silent\n });\n this.onMessageSent(clearDraft, true);\n\n if(document.type === 'sticker') {\n this.managers.appStickersManager.saveRecentSticker(document.id);\n }\n\n return true;\n }\n\n private canToggleHideAuthor() {\n const {forwardElements} = this;\n if(!forwardElements) return false;\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\n return !hideCaptionCheckboxField.checked ||\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\n }\n\n private isDroppingCaptions() {\n return !this.canToggleHideAuthor();\n }\n\n /* public sendSomething(callback: () => void, force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.scheduleSending(() => this.sendSomething(callback, true));\n return false;\n }\n\n callback();\n this.onMessageSent(false, true);\n\n return true;\n } */\n\n public async initMessageEditing(mid: number) {\n const message = (await this.chat.getMessage(mid)) as Message.message;\n\n let input = wrapDraftText(message.message, {entities: message.totalEntities, wrappingForPeerId: this.chat.peerId});\n const f = async() => {\n const replyFragment = await wrapMessageForReply({message, usingMids: [message.mid]});\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\n\n this.editMsgId = mid;\n this.editMessage = message;\n input = undefined;\n };\n f();\n }\n\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\n const f = async() => {\n // const peerTitles: string[]\n const fromPeerIds = Object.keys(fromPeerIdsMids).map((fromPeerId) => fromPeerId.toPeerId());\n const smth: Set = new Set();\n let length = 0, messagesWithCaptionsLength = 0;\n\n const p = fromPeerIds.map(async(fromPeerId) => {\n const mids = fromPeerIdsMids[fromPeerId];\n const promises = mids.map(async(mid) => {\n const message = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mid)) as Message.message;\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\n smth.add('N' + message.fwd_from.from_name);\n } else {\n smth.add('P' + message.fromId);\n }\n\n if(message.media && message.message) {\n ++messagesWithCaptionsLength;\n }\n });\n\n await Promise.all(promises);\n\n length += mids.length;\n });\n\n await Promise.all(p);\n\n const onlyFirstName = smth.size > 2;\n const peerTitles = [...smth].map((smth) => {\n const type = smth[0];\n smth = smth.slice(1);\n if(type === 'P') {\n const peerId = smth.toPeerId();\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\n } else {\n return onlyFirstName ? smth.split(' ')[0] : smth;\n }\n });\n\n const {forwardElements} = this;\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\n form.classList.toggle('hide', !messagesWithCaptionsLength);\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\n if(messagesWithCaptionsLength && hideCaption) {\n forwardElements.hideSender.checkboxField.setValueSilently(true);\n } else if(this.forwardWasDroppingAuthor !== undefined) {\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\n }\n\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\n const title = i18n(titleKey, [length]);\n\n const senderTitles = document.createDocumentFragment();\n if(peerTitles.length < 3) {\n senderTitles.append(...join(peerTitles, false));\n } else {\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\n }\n\n let firstMessage: Message.message, usingFullAlbum: boolean;\n if(fromPeerIds.length === 1) {\n const fromPeerId = fromPeerIds[0];\n const mids = fromPeerIdsMids[fromPeerId];\n firstMessage = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mids[0])) as Message.message;\n\n usingFullAlbum = !!firstMessage.grouped_id;\n if(usingFullAlbum) {\n const albumMids = await this.managers.appMessagesManager.getMidsByMessage(firstMessage);\n if(albumMids.length !== length || albumMids.find((mid) => !mids.includes(mid))) {\n usingFullAlbum = false;\n }\n }\n }\n\n const subtitleFragment = document.createDocumentFragment();\n const delimiter = ': ';\n if(usingFullAlbum || length === 1) {\n const mids = fromPeerIdsMids[fromPeerIds[0]];\n const replyFragment = await wrapMessageForReply({message: firstMessage, usingMids: mids});\n subtitleFragment.append(\n senderTitles,\n delimiter,\n replyFragment\n );\n } else {\n subtitleFragment.append(\n i18n('Chat.Accessory.Forward.From'),\n delimiter,\n senderTitles\n );\n }\n\n const newReply = this.setTopInfo('forward', f, title, subtitleFragment);\n\n forwardElements.modifyArgs.forEach((b, idx) => {\n const text = b.textElement;\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\n intl.update();\n });\n\n if(this.forwardHover) {\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\n }\n\n this.forwarding = fromPeerIdsMids;\n };\n\n f();\n }\n\n public async initMessageReply(mid: number) {\n if(this.replyToMsgId === mid) {\n return;\n }\n\n let message = await this.chat.getMessage(mid);\n const f = () => {\n let peerTitleEl: HTMLElement;\n if(!message) { // load missing replying message\n peerTitleEl = i18n('Loading');\n\n this.managers.appMessagesManager.reloadMessages(this.chat.peerId, mid).then((_message) => {\n if(this.replyToMsgId !== mid) {\n return;\n }\n\n message = _message;\n if(!message) {\n this.clearHelper('reply');\n } else {\n f();\n }\n });\n } else {\n peerTitleEl = new PeerTitle({\n peerId: message.fromId,\n dialog: false\n }).element;\n }\n\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\n this.setReplyToMsgId(mid)\n };\n f();\n }\n\n public setReplyToMsgId(mid: number) {\n this.replyToMsgId = mid;\n this.center(true);\n }\n\n public clearHelper(type?: ChatInputHelperType) {\n if(this.helperType === 'edit' && type !== 'edit') {\n this.clearInput();\n }\n\n if(type) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n }\n\n if(type !== 'reply') {\n this.setReplyToMsgId(undefined);\n this.forwarding = undefined;\n }\n\n this.editMsgId = this.editMessage = undefined;\n this.helperType = this.helperFunc = undefined;\n\n if(this.chat.container.classList.contains('is-helper-active')) {\n appNavigationController.removeByType('input-helper');\n this.chat.container.classList.remove('is-helper-active');\n this.t();\n }\n }\n\n private t() {\n const className = 'is-toggling-helper';\n SetTransition({\n element: this.chat.container,\n className,\n forwards: true,\n duration: 150,\n onTransitionEnd: () => {\n this.chat.container.classList.remove(className);\n }\n });\n }\n\n public setInputValue(value: Parameters[0], clear = true, focus = true) {\n if(!value) value = '';\n\n if(clear) this.clearInput(false, false, value as string);\n else this.messageInputField.setValueSilently(value);\n\n fastRaf(() => {\n focus && placeCaretAtEnd(this.messageInput);\n this.onMessageInput();\n this.messageInput.scrollTop = this.messageInput.scrollHeight;\n });\n }\n\n public setTopInfo(\n type: ChatInputHelperType,\n callerFunc: () => void,\n title: Parameters[0] = '',\n subtitle: Parameters[1] = '',\n input?: Parameters[0],\n message?: any\n ) {\n if(this.willSendWebPage && type === 'reply') {\n return;\n }\n\n if(type !== 'webpage') {\n this.clearHelper(type);\n this.helperType = type;\n this.helperFunc = callerFunc;\n }\n\n const replyParent = this.replyElements.container;\n const oldReply = replyParent.lastElementChild.previousElementSibling;\n const haveReply = oldReply.classList.contains('reply');\n\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\n const {container} = wrapReply(title, subtitle, this.chat.animationGroup, message);\n if(haveReply) {\n oldReply.replaceWith(container);\n } else {\n replyParent.insertBefore(container, replyParent.lastElementChild);\n }\n\n if(type === 'webpage') {\n container.style.cursor = 'default';\n }\n\n if(!this.chat.container.classList.contains('is-helper-active')) {\n this.chat.container.classList.add('is-helper-active');\n this.t();\n }\n\n /* const scroll = appImManager.scrollable;\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\n } */\n\n if(!IS_MOBILE) {\n appNavigationController.pushItem({\n type: 'input-helper',\n onPop: () => {\n this.onHelperCancel();\n }\n });\n }\n\n if(input !== undefined) {\n this.setInputValue(input);\n }\n\n setTimeout(() => {\n this.updateSendBtn();\n }, 0);\n\n return container;\n }\n\n // public saveScroll() {\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\n // this.scrollOffsetTop = this.chatInput.offsetTop;\n // }\n\n // public restoreScroll() {\n // if(this.chatInput.style.display) return;\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\n // let newOffsetTop = this.chatInput.offsetTop;\n // let container = this.chat.bubbles.scrollable.container;\n // let scrollTop = container.scrollTop;\n // let clientHeight = container.clientHeight;\n // let maxScrollTop = container.scrollHeight;\n\n // if(newOffsetTop < this.scrollOffsetTop) {\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\n // container.scrollTop += this.scrollDiff;\n // } else if(scrollTop !== this.scrollTop) {\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\n // if(endDiff < this.scrollDiff/* && false */) {\n // //container.scrollTop -= endDiff;\n // } else {\n // container.scrollTop -= this.scrollDiff;\n // }\n // }\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {DraftMessage} from '../../layer';\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\n\nexport default function wrapDraft(draft: DraftMessage.draftMessage, wrappingForPeerId: PeerId, loadPromises?: Promise[]) {\n const myEntities = parseEntities(draft.message);\n const apiEntities = draft.entities || [];\n const totalEntities = mergeEntities(apiEntities.slice(), myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n\n return wrapDraftText(draft.message, {entities: totalEntities, wrappingForPeerId, loadPromises});\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from './chat';\nimport type ChatTopbar from './topbar';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport DivAndCaption from '../divAndCaption';\nimport ripple from '../ripple';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {Message} from '../../layer';\nimport safeAssign from '../../helpers/object/safeAssign';\n\nconst classNames: string[] = ['is-pinned-message-shown', 'is-pinned-audio-shown'];\nconst CLASSNAME_BASE = 'pinned-container';\nconst HEIGHT = 52;\n\nexport default class PinnedContainer {\n public wrapperUtils: HTMLElement;\n public btnClose: HTMLElement;\n protected wrapper: HTMLElement;\n\n protected topbar: ChatTopbar;\n protected chat: Chat;\n protected listenerSetter: ListenerSetter;\n public className: string;\n public divAndCaption: DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void>;\n\n protected floating = false;\n\n public onClose?: () => void | Promise;\n\n constructor(options: {\n topbar: PinnedContainer['topbar'],\n chat: PinnedContainer['chat'],\n listenerSetter: PinnedContainer['listenerSetter'],\n className: PinnedContainer['className'],\n divAndCaption: PinnedContainer['divAndCaption'],\n onClose?: PinnedContainer['onClose'],\n floating?: PinnedContainer['floating']\n }) {\n safeAssign(this, options);\n\n const {divAndCaption, className} = this;\n divAndCaption.container.classList.add(CLASSNAME_BASE, 'hide');\n divAndCaption.title.classList.add(CLASSNAME_BASE + '-title');\n divAndCaption.subtitle.classList.add(CLASSNAME_BASE + '-subtitle');\n divAndCaption.content.classList.add(CLASSNAME_BASE + '-content');\n\n this.btnClose = document.createElement('button');\n this.btnClose.classList.add(CLASSNAME_BASE + '-close', `pinned-${className}-close`, 'btn-icon', 'tgico-close');\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add(CLASSNAME_BASE + '-wrapper');\n ripple(this.wrapper);\n\n this.wrapperUtils = document.createElement('div');\n this.wrapperUtils.classList.add(CLASSNAME_BASE + '-wrapper-utils');\n this.wrapperUtils.append(this.btnClose);\n\n this.wrapper.append(...Array.from(divAndCaption.container.children), this.wrapperUtils);\n\n divAndCaption.container.append(this.wrapper/* , this.close */);\n\n this.attachOnCloseEvent(this.btnClose);\n }\n\n public attachOnCloseEvent(elem: HTMLElement) {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n\n ((this.onClose ? this.onClose() : null) || Promise.resolve(true)).then((needClose) => {\n if(needClose) {\n this.toggle(true);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n }\n\n public toggle(hide?: boolean) {\n const isHidden = this.divAndCaption.container.classList.contains('hide');\n if(hide === undefined) {\n hide = !isHidden;\n } else if(hide === isHidden) {\n return;\n }\n\n // const scrollable = this.chat.bubbles.scrollable;\n\n const isFloating = (this.floating || mediaSizes.isMobile) && !hide;\n // const scrollTop = isFloating || this.divAndCaption.container.classList.contains('is-floating') ? scrollable.scrollTop : undefined;\n\n this.divAndCaption.container.classList.toggle('is-floating', isFloating);\n this.divAndCaption.container.classList.toggle('hide', hide);\n\n this.topbar.container.classList.toggle('is-pinned-floating', isFloating);\n this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`, !hide);\n\n // const active = classNames.filter((className) => this.topbar.container.classList.contains(className));\n // const maxActive = hide ? 0 : 1;\n\n // * not sure when it became unneeded\n // if(scrollTop !== undefined && active.length <= maxActive/* && !scrollable.isScrolledDown */) {\n // scrollable.scrollTop = scrollTop + ((hide ? -1 : 1) * HEIGHT);\n // }\n\n this.topbar.setFloating();\n this.topbar.setUtilsWidth();\n }\n\n public isVisible() {\n return !this.divAndCaption.container.classList.contains('hide');\n }\n\n public isFloating() {\n return this.divAndCaption.container.classList.contains('is-floating');\n }\n\n public fill(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message: Message.message) {\n this.divAndCaption.container.dataset.peerId = '' + message.peerId;\n this.divAndCaption.container.dataset.mid = '' + message.mid;\n this.divAndCaption.fill(title, subtitle, message);\n this.topbar.setUtilsWidth();\n }\n}\n","// https://github.com/evgeny-nadymov/telegram-react/blob/master/src/Components/ColumnMiddle/PinnedMessageBorder.js\n\nenum BAR_HEIGHTS {\n ONE = 32,\n TWO = 15,\n THREE = 10,\n FOUR = 8,\n MORE = 8\n};\n\nconst GAP = 1;\nconst WIDTH = 2;\nconst BASE_CLASS = 'pinned-message-border';\n\nexport default class PinnedMessageBorder {\n private border: HTMLElement;\n private wrapper: HTMLElement;\n private svg: SVGSVGElement;\n private defs: SVGDefsElement;\n private clipPath: SVGClipPathElement;\n private path: SVGPathElement;\n private mark: HTMLElement;\n\n private count: number;\n private index: number;\n\n private drawRect = (x: number, y: number, width: number, height: number, radius: number) => {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n };\n\n private getClipPath = (id: string, barHeight: number, count: number) => {\n const radius = 1;\n\n let d = '';\n /* if(count === 3) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius)\n + this.drawRect(0, barHeight + GAP, WIDTH, barHeight + 1, radius)\n + this.drawRect(0, barHeight * 2 + GAP * 2 + 1, WIDTH, barHeight, radius);\n } */if(count === 2) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius) + this.drawRect(0, barHeight + GAP * 2, WIDTH, barHeight, radius);\n } else {\n for(let i = 0; i < count; ++i) {\n d += this.drawRect(0, (barHeight + GAP) * i, WIDTH, barHeight, radius);\n }\n }\n\n if(!this.clipPath) {\n this.clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\n this.clipPath.append(this.path);\n }\n\n this.clipPath.id = id;\n this.path.setAttributeNS(null, 'd', d);\n\n return this.clipPath;\n };\n\n private getBarHeight = (count: number, index: number) => {\n let barHeight: number;\n if(count <= 1) {\n barHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n barHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n barHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n barHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n barHeight = BAR_HEIGHTS.MORE;\n }\n\n return barHeight;\n };\n\n private getMarkHeight = (count: number, index: number) => {\n let markHeight: number;\n if(count <= 1) {\n markHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n markHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n markHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n markHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n markHeight = BAR_HEIGHTS.MORE;\n }\n\n return markHeight;\n };\n\n private getMarkTranslateY = (index: number, barHeight: number, count: number) => {\n if(count === 1) {\n return 0;\n } else if(count === 2) {\n return !index ? 0 : barHeight + GAP;\n }\n\n if(count === 3) {\n if(!index) {\n return 0;\n } else if(index === 1) {\n return barHeight + GAP;\n }\n\n return barHeight * 2 + GAP * 2 + 1;\n } else {\n return (barHeight + GAP) * index;\n }\n };\n\n private 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 - BAR_HEIGHTS.ONE - barHeight;\n }\n\n // return (index + 1) * barHeight + index * GAP;\n return (index - 2) * barHeight + index * GAP;\n // return (barHeight + GAP * 2) / 2 + (index - 2) * (barHeight + GAP);\n };\n\n private getTrackHeight = (count: number, barHeight: number) => {\n return count <= 3 ? BAR_HEIGHTS.ONE : barHeight * count + GAP * (count - 1);\n };\n\n public render(count: number, index: number) {\n if(!this.border) {\n this.border = document.createElement('div');\n this.border.classList.add(BASE_CLASS);\n\n this.wrapper = document.createElement('div');\n this.border.append(this.wrapper);\n }\n\n if(count === 1) {\n if(this.count !== count) {\n this.wrapper.className = BASE_CLASS + '-wrapper-1';\n this.border.classList.remove(BASE_CLASS + '-mask');\n this.wrapper.innerHTML = this.wrapper.style.cssText = '';\n }\n\n return this.border;\n }\n\n const barHeight = this.getBarHeight(count, index);\n const markHeight = this.getMarkHeight(count, index);\n const trackHeight = this.getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath_${count}`;\n const clipPath = this.getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = this.getMarkTranslateY(index, barHeight, count);\n const trackTranslateY = this.getTrackTranslateY(index, count, barHeight, trackHeight);\n\n this.border.classList.toggle(BASE_CLASS + '-mask', count > 4);\n\n if(index <= 1) {\n this.border.classList.add('mask-bottom');\n this.border.classList.remove('mask-top');\n } else if(index >= (count - 2)) {\n this.border.classList.add('mask-top');\n this.border.classList.remove('mask-bottom');\n } else {\n this.border.classList.add('mask-top', 'mask-bottom');\n }\n\n this.wrapper.className = BASE_CLASS + '-wrapper';\n this.wrapper.style.cssText = `clip-path: url(#${clipPathId}); width: 2px; height: ${trackHeight}px; transform: translateY(-${trackTranslateY}px);`;\n\n if(!this.svg) {\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.setAttributeNS(null, 'height', '0');\n this.svg.setAttributeNS(null, 'width', '0');\n\n this.defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n this.defs.append(clipPath);\n\n this.svg.append(this.defs);\n\n this.mark = document.createElement('div');\n this.mark.classList.add(BASE_CLASS + '-mark');\n }\n\n if(!this.svg.parentElement) {\n this.wrapper.append(this.svg, this.mark);\n }\n\n this.mark.style.cssText = `height: ${markHeight}px; transform: translateY(${markTranslateY}px);`;\n\n this.count = count;\n this.index = index;\n\n return this.border;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppMessagesManager} from '../../lib/appManagers/appMessagesManager';\nimport type ChatTopbar from './topbar';\nimport rootScope from '../../lib/rootScope';\nimport appMediaPlaybackController, {AppMediaPlaybackController} from '../appMediaPlaybackController';\nimport DivAndCaption from '../divAndCaption';\nimport PinnedContainer from './pinnedContainer';\nimport Chat from './chat';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport PeerTitle from '../peerTitle';\nimport {i18n} from '../../lib/langPack';\nimport {formatFullSentTime} from '../../helpers/date';\nimport ButtonIcon from '../buttonIcon';\nimport {DocumentAttribute} from '../../layer';\nimport MediaProgressLine from '../mediaProgressLine';\nimport VolumeSelector from '../volumeSelector';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport default class ChatAudio extends PinnedContainer {\n private toggleEl: HTMLElement;\n private progressLine: MediaProgressLine;\n private volumeSelector: VolumeSelector;\n private fasterEl: HTMLElement;\n private repeatEl: HTMLButtonElement;\n\n constructor(protected topbar: ChatTopbar, protected chat: Chat, protected managers: AppManagers) {\n super({\n topbar,\n chat,\n listenerSetter: topbar.listenerSetter,\n className: 'audio',\n divAndCaption: new DivAndCaption(\n 'pinned-audio',\n (title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment) => {\n replaceContent(this.divAndCaption.title, title);\n replaceContent(this.divAndCaption.subtitle, subtitle);\n }\n ),\n onClose: () => {\n appMediaPlaybackController.stop();\n },\n floating: true\n });\n\n this.divAndCaption.border.remove();\n\n const prevEl = ButtonIcon('fast_rewind active', {noRipple: true});\n const nextEl = ButtonIcon('fast_forward active', {noRipple: true});\n\n const attachClick = (elem: HTMLElement, callback: () => void) => {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n callback();\n }, {listenerSetter: this.topbar.listenerSetter});\n };\n\n attachClick(prevEl, () => {\n appMediaPlaybackController.previous();\n });\n\n attachClick(nextEl, () => {\n appMediaPlaybackController.next();\n });\n\n this.toggleEl = ButtonIcon('', {noRipple: true});\n this.toggleEl.classList.add('active', 'pinned-audio-ico', 'tgico');\n attachClick(this.toggleEl, () => {\n appMediaPlaybackController.toggle();\n });\n this.wrapper.prepend(this.wrapper.firstElementChild, prevEl, this.toggleEl, nextEl);\n\n this.volumeSelector = new VolumeSelector(this.listenerSetter, true);\n const volumeProgressLineContainer = document.createElement('div');\n volumeProgressLineContainer.classList.add('progress-line-container');\n volumeProgressLineContainer.append(this.volumeSelector.container);\n const tunnel = document.createElement('div');\n tunnel.classList.add('pinned-audio-volume-tunnel');\n this.volumeSelector.btn.classList.add('pinned-audio-volume', 'active');\n this.volumeSelector.btn.prepend(tunnel);\n this.volumeSelector.btn.append(volumeProgressLineContainer);\n\n this.repeatEl = ButtonIcon('audio_repeat', {noRipple: true});\n attachClick(this.repeatEl, () => {\n const params = appMediaPlaybackController.getPlaybackParams();\n if(!params.round) {\n appMediaPlaybackController.round = true;\n } else if(params.loop) {\n appMediaPlaybackController.round = false;\n appMediaPlaybackController.loop = false;\n } else {\n appMediaPlaybackController.loop = !appMediaPlaybackController.loop;\n }\n });\n\n const fasterEl = this.fasterEl = ButtonIcon('playback_2x', {noRipple: true});\n attachClick(fasterEl, () => {\n appMediaPlaybackController.playbackRate = fasterEl.classList.contains('active') ? 1 : 1.75;\n });\n\n this.wrapperUtils.prepend(this.volumeSelector.btn, fasterEl, this.repeatEl);\n\n const progressWrapper = document.createElement('div');\n progressWrapper.classList.add('pinned-audio-progress-wrapper');\n\n this.progressLine = new MediaProgressLine(undefined, undefined, true, true);\n this.progressLine.container.classList.add('pinned-audio-progress');\n progressWrapper.append(this.progressLine.container);\n this.wrapper.insertBefore(progressWrapper, this.wrapperUtils);\n\n this.topbar.listenerSetter.add(appMediaPlaybackController)('play', this.onMediaPlay);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('pause', this.onPause);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('stop', this.onStop);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('playbackParams', this.onPlaybackParams);\n\n const playingDetails = appMediaPlaybackController.getPlayingDetails();\n if(playingDetails) {\n this.onMediaPlay(playingDetails);\n this.onPlaybackParams(playingDetails.playbackParams);\n }\n }\n\n public destroy() {\n if(this.progressLine) {\n this.progressLine.removeListeners();\n }\n }\n\n private onPlaybackParams = (playbackParams: ReturnType) => {\n this.fasterEl.classList.toggle('active', playbackParams.playbackRate > 1);\n\n this.repeatEl.classList.remove('tgico-audio_repeat', 'tgico-audio_repeat_single');\n this.repeatEl.classList.add(playbackParams.loop ? 'tgico-audio_repeat_single' : 'tgico-audio_repeat');\n this.repeatEl.classList.toggle('active', playbackParams.loop || playbackParams.round);\n };\n\n private onPause = () => {\n this.toggleEl.classList.remove('flip-icon');\n };\n\n private onStop = () => {\n this.toggle(true);\n };\n\n private onMediaPlay = ({doc, message, media, playbackParams}: ReturnType) => {\n let title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment;\n const isMusic = doc.type !== 'voice' && doc.type !== 'round';\n if(!isMusic) {\n title = new PeerTitle({peerId: message.fromId, fromName: message.fwd_from?.from_name}).element;\n\n // subtitle = 'Voice message';\n subtitle = formatFullSentTime(message.date);\n } else {\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n title = wrapEmojiText(audioAttribute?.title ?? doc.file_name);\n subtitle = audioAttribute?.performer ? wrapEmojiText(audioAttribute.performer) : i18n('AudioUnknownArtist');\n }\n\n this.fasterEl.classList.toggle('hide', isMusic);\n this.repeatEl.classList.toggle('hide', !isMusic);\n\n this.onPlaybackParams(playbackParams);\n this.volumeSelector.setVolume();\n\n this.progressLine.setMedia(media);\n\n this.fill(title, subtitle, message);\n // this.toggleEl.classList.add('flip-icon');\n this.toggleEl.classList.toggle('flip-icon', !media.paused);\n this.toggle(false);\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatTopbar from './topbar';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport PinnedContainer from './pinnedContainer';\nimport PinnedMessageBorder from './pinnedMessageBorder';\nimport ReplyContainer, {wrapReplyDivAndCaption} from './replyContainer';\nimport rootScope from '../../lib/rootScope';\nimport Chat from './chat';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport ButtonIcon from '../buttonIcon';\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\nimport {i18n} from '../../lib/langPack';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport handleScrollSideEvent from '../../helpers/dom/handleScrollSideEvent';\nimport debounce from '../../helpers/schedulers/debounce';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {Message} from '../../layer';\nimport {logger} from '../../lib/logger';\n\nclass AnimatedSuper {\n static DURATION = 200;\n static BASE_CLASS = 'animated-super';\n container: HTMLDivElement;\n rows: {[index: string]: {element: HTMLElement, timeout?: number, new?: true}} = {};\n clearTimeout: number;\n\n constructor() {\n this.container = document.createElement('div');\n this.container.className = AnimatedSuper.BASE_CLASS;\n }\n\n public getRow(index: number, animateFirst = false) {\n if(this.rows[index]) return this.rows[index].element;\n const row = document.createElement('div');\n const isFirst = !Object.keys(this.rows).length && !animateFirst;\n row.className = AnimatedSuper.BASE_CLASS + '-row' + (isFirst ? '' : ' is-hiding hide');\n this.rows[index] = {element: row, new: true};\n this.container.append(row);\n return row;\n }\n\n public clearRow(index: number) {\n if(!this.rows[index]) return;\n this.rows[index].element.remove();\n delete this.rows[index];\n }\n\n public clearRows(currentIndex?: number) {\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\n this.clearTimeout = window.setTimeout(() => {\n for(const i in this.rows) {\n if(+i === currentIndex) continue;\n this.clearRow(+i);\n }\n }, AnimatedSuper.DURATION);\n }\n\n public setNewRow(index: number, reflow = false) {\n const row = this.rows[index];\n if(row.new) {\n if(reflow) {\n row.element.classList.remove('hide');\n void row.element.offsetLeft; // reflow\n } else {\n row.element.classList.remove('is-hiding', 'hide');\n }\n\n delete row.new;\n }\n\n this.clearRows(index);\n }\n\n public animate(index: number, previousIndex: number, fromTop = index > previousIndex, ignorePrevious = false) {\n if(index === previousIndex) { // * handle if set index 0 and previousIndex 0\n return this.setNewRow(index);\n }\n\n const row = this.rows[index];\n const previousRow = this.rows[previousIndex];\n if(!previousRow && !ignorePrevious) {\n return this.setNewRow(index);\n }\n\n const sides = ['from-top', 'from-bottom'];\n if(!fromTop) sides.reverse();\n\n row.element.classList.add(sides[0]);\n row.element.classList.remove(sides[1]);\n if(previousRow) {\n previousRow.element.classList.add(sides[1]);\n previousRow.element.classList.remove(sides[0]);\n }\n\n if(row.new) {\n this.setNewRow(index, true);\n }\n\n row.element.classList.toggle('is-hiding', false);\n previousRow && previousRow.element.classList.toggle('is-hiding', true);\n\n /* const height = row.element.getBoundingClientRect().height;\n row.element.style.transform = `translateY(${fromTop ? height * -1 : height}px)`;\n if(previousRow) {\n previousRow.element.style.transform = `translateY(${fromTop ? height : height * -1}px)`;\n } */\n\n /* row.element.style.setProperty('--height', row.element.getBoundingClientRect().height + 'px');\n if(previousRow) {\n previousRow.element.style.setProperty('--height', previousRow.element.getBoundingClientRect().height + 'px');\n } */\n\n this.clearRows(index);\n }\n}\n\nclass AnimatedCounter {\n static EMPTY_INDEX = -1;\n static BASE_CLASS = 'animated-counter';\n container: HTMLElement;\n decimals: {\n container: HTMLElement,\n placeholder: HTMLElement,\n animatedSuper: AnimatedSuper\n }[] = [];\n previousNumber = 0;\n clearTimeout: number;\n\n constructor(private reverse = false) {\n this.container = document.createElement('div');\n this.container.className = AnimatedCounter.BASE_CLASS;\n }\n\n getDecimal(index: number) {\n if(this.decimals[index]) return this.decimals[index];\n const item = document.createElement('div');\n item.className = AnimatedCounter.BASE_CLASS + '-decimal';\n\n const placeholder = document.createElement('div');\n placeholder.className = AnimatedCounter.BASE_CLASS + '-decimal-placeholder';\n\n const animatedSuper = new AnimatedSuper();\n animatedSuper.container.className = AnimatedCounter.BASE_CLASS + '-decimal-wrapper';\n\n item.append(placeholder, animatedSuper.container);\n\n this.container.append(item);\n\n return this.decimals[index] = {container: item, placeholder, animatedSuper};\n }\n\n clear(number: number) {\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\n\n const decimals = ('' + number).length;\n if(decimals >= this.decimals.length) {\n return;\n }\n\n this.clearTimeout = window.setTimeout(() => {\n const byDecimal = this.decimals.splice(decimals, this.decimals.length - decimals);\n byDecimal.forEach((decimal) => {\n decimal.container.remove();\n });\n }, AnimatedSuper.DURATION);\n }\n\n /* prepareNumber(number: number) {\n const decimals = ('' + number).length;\n if(this.decimals.length < decimals) {\n for(let i = this.decimals.length; i < decimals; ++i) {\n this.getDecimal(i);\n }\n }\n } */\n\n hideLeft(number: number) {\n const decimals = ('' + number).length;\n const byDecimal = this.decimals.slice(decimals);// this.decimals.splice(deleteCount, this.decimals.length - deleteCount);\n byDecimal.forEach((decimal) => {\n const previousDecimalNumber = +decimal.placeholder.innerText || 0;\n const row = decimal.animatedSuper.getRow(AnimatedCounter.EMPTY_INDEX, true);\n decimal.animatedSuper.animate(AnimatedCounter.EMPTY_INDEX, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n });\n\n this.clear(number);\n }\n\n setCount(number: number) {\n // this.prepareNumber(number);\n\n const previousByDecimal = Array.from('' + this.previousNumber).map((n) => +n);\n const byDecimal = Array.from('' + number).map((n) => +n);\n byDecimal.forEach((decimalNumber, idx) => {\n const decimal = this.getDecimal(idx);\n // const row = decimal.animatedSuper.getRow(number, true);\n const row = decimal.animatedSuper.getRow(decimalNumber, true);\n const previousDecimalNumber = previousByDecimal[idx] ?? AnimatedCounter.EMPTY_INDEX;\n row.innerText = decimal.placeholder.innerText = '' + decimalNumber;\n // decimal.animatedSuper.animate(number, this.previousNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n decimal.animatedSuper.animate(decimalNumber, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n });\n\n this.hideLeft(number);\n // this.clear(number);\n this.previousNumber = number;\n }\n}\n\nexport default class ChatPinnedMessage {\n private static LOAD_COUNT = 50;\n private static LOAD_OFFSET = 5;\n\n public pinnedMessageContainer: PinnedContainer;\n private pinnedMessageBorder: PinnedMessageBorder;\n\n private pinnedMaxMid = 0;\n public pinnedMid = 0;\n public pinnedIndex = -1;\n private wasPinnedIndex = 0;\n private wasPinnedMediaIndex = 0;\n\n public locked = false;\n private waitForScrollBottom = false;\n\n public count = 0;\n private mids: number[] = [];\n private offsetIndex = 0;\n\n private loading = false;\n private loadedBottom = false;\n private loadedTop = false;\n\n private animatedSubtitle: AnimatedSuper;\n private animatedMedia: AnimatedSuper;\n private animatedCounter: AnimatedCounter;\n\n private listenerSetter: ListenerSetter;\n private scrollDownListenerSetter: ListenerSetter = null;\n\n public hidden = false;\n\n private getCurrentIndexPromise: Promise = null;\n private btnOpen: HTMLButtonElement;\n\n private setPinnedMessage: () => void;\n\n private isStatic: boolean;\n\n private debug: boolean;\n\n public setCorrectIndexThrottled: (lastScrollDirection?: number) => void;\n\n private log: ReturnType;\n\n constructor(private topbar: ChatTopbar, private chat: Chat, private managers: AppManagers) {\n this.listenerSetter = new ListenerSetter();\n this.log = logger('PM');\n this.debug = true;\n this.isStatic = false;\n\n const dAC = new ReplyContainer('pinned-message', chat.animationGroup);\n this.pinnedMessageContainer = new PinnedContainer({\n topbar,\n chat,\n listenerSetter: this.listenerSetter,\n className: 'message',\n divAndCaption: dAC,\n onClose: async() => {\n if(await managers.appPeersManager.canPinMessage(this.chat.peerId)) {\n new PopupPinMessage(this.chat.peerId, this.pinnedMid, true);\n } else {\n new PopupPinMessage(this.chat.peerId, 0, true);\n }\n\n return false;\n }\n });\n\n this.pinnedMessageBorder = new PinnedMessageBorder();\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\n\n this.animatedSubtitle = new AnimatedSuper();\n dAC.subtitle.append(this.animatedSubtitle.container);\n\n this.animatedMedia = new AnimatedSuper();\n this.animatedMedia.container.classList.add('pinned-message-media-container');\n dAC.content.prepend(this.animatedMedia.container);\n\n this.animatedCounter = new AnimatedCounter(true);\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\n\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\n dAC.container.prepend(btnClose);\n\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\n\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\n\n attachClickEvent(this.btnOpen, (e) => {\n cancelEvent(e);\n this.topbar.openPinned(true);\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\n if(peerId === this.chat.peerId) {\n // this.wasPinnedIndex = 0;\n // setTimeout(() => {\n if(this.hidden) {\n this.pinnedMessageContainer.toggle(this.hidden = false);\n }\n\n this.loadedTop = this.loadedBottom = false;\n this.pinnedIndex = -1;\n this.pinnedMid = 0;\n this.count = 0;\n this.mids = [];\n this.offsetIndex = 0;\n this.pinnedMaxMid = 0;\n this.setCorrectIndex(0);\n // }, 300);\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\n if(peerId === this.chat.peerId) {\n this.pinnedMessageContainer.toggle(this.hidden = true);\n }\n });\n\n // * 200 - no lags\n // * 100 - need test\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\n this.setCorrectIndexThrottled = throttle(this.setCorrectIndex.bind(this), 100, false);\n\n this.isStatic = !this.chat.isPinnedMessagesNeeded();\n }\n\n public destroy() {\n this.pinnedMessageContainer.divAndCaption.container.remove();\n this.pinnedMessageContainer.toggle(true);\n this.listenerSetter.removeAll();\n this.unsetScrollDownListener(false);\n }\n\n public setCorrectIndex(lastScrollDirection?: number) {\n if(this.isStatic) return;\n // return;\n\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\n return;\n }\n\n if((this.loadedBottom || this.loadedTop) && !this.count) {\n return;\n }\n\n // const perf = performance.now();\n const el = this.chat.bubbles.getBubbleByPoint('bottom');\n // this.log('setCorrectIndex: get last element perf:', performance.now() - perf, el);\n if(!el) return;\n\n // return;\n\n const mid = el.dataset.mid;\n if(el && mid !== undefined) {\n // this.log('setCorrectIndex will test mid:', mid);\n this.testMid(+mid, lastScrollDirection);\n }\n }\n\n public testMid(mid: number, lastScrollDirection?: number) {\n if(this.isStatic) return;\n\n // if(lastScrollDirection !== undefined) return;\n if(this.hidden) return;\n\n // this.log('testMid', mid);\n\n let currentIndex: number = this.mids.findIndex((_mid) => _mid <= mid);\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\n currentIndex += this.offsetIndex;\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\n // currentIndex = 0;\n currentIndex = this.mids.length - 1 + this.offsetIndex;\n } else {\n if(!this.getCurrentIndexPromise) {\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\n }\n\n return;\n }\n\n // const idx = Math.max(0, this.mids.indexOf(mid));\n\n /* if(currentIndex === this.count) {\n currentIndex = 0;\n } */\n\n // this.log('testMid: pinned currentIndex', currentIndex, mid);\n\n const changed = this.pinnedIndex !== currentIndex;\n if(changed) {\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // если не скроллил вниз и пытается поставить нижний пиннед - выйти\n return;\n }\n }\n\n this.pinnedIndex = currentIndex;\n this.pinnedMid = this.mids.find((_mid) => _mid <= mid) || this.mids[this.mids.length - 1];\n this.setPinnedMessage();\n }\n }\n\n private isNeededMore(currentIndex: number) {\n return (this.count > ChatPinnedMessage.LOAD_COUNT &&\n (\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) ||\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\n )\n );\n }\n\n private async getCurrentIndex(mid: number, correctAfter = true) {\n if(this.loading) return;\n this.loading = true;\n\n try {\n const log = this.debug ? this.log.bindPrefix('getCurrentIndex') : undefined;\n log && log('start', mid, correctAfter);\n\n let gotRest = false;\n const promises = [\n this.managers.appMessagesManager.getSearch({\n peerId: this.chat.peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: mid,\n limit: ChatPinnedMessage.LOAD_COUNT,\n backLimit: ChatPinnedMessage.LOAD_COUNT,\n threadId: this.chat.threadId\n })\n .then((r) => {\n gotRest = true;\n return r;\n })\n ];\n\n if(!this.pinnedMaxMid) {\n const promise = this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId, this.chat.threadId).then((p) => {\n if(!p.maxId) return;\n this.pinnedMaxMid = p.maxId;\n\n if(!gotRest && correctAfter) {\n this.mids = [this.pinnedMaxMid];\n this.count = p.count;\n this.pinnedIndex = 0;\n this.pinnedMid = this.mids[0];\n this.setPinnedMessage();\n // this.pinnedMessageContainer.toggle(false);\n }\n });\n\n promises.push(promise as any);\n }\n\n const result = (await Promise.all(promises))[0];\n\n let backLimited = result.history.findIndex((message) => message.mid <= mid);\n if(backLimited === -1) {\n backLimited = result.history.length;\n }/* else {\n backLimited -= 1;\n } */\n\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\n this.mids = result.history.map((message) => message.mid).slice();\n this.count = result.count;\n\n if(!this.count) {\n this.pinnedMessageContainer.toggle(true);\n }\n\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\n this.loadedBottom = !this.offsetIndex;\n\n log && log('result', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\n } catch(err) {\n this.log.error('getCurrentIndex error', err);\n }\n\n this.loading = false;\n\n if(this.locked) {\n this.testMid(mid);\n } else if(correctAfter) {\n this.setCorrectIndex(0);\n }\n\n this.getCurrentIndexPromise = null;\n // return result.offset_id_offset || 0;\n }\n\n public setScrollDownListener() {\n this.waitForScrollBottom = true;\n\n if(!this.scrollDownListenerSetter) {\n this.scrollDownListenerSetter = new ListenerSetter();\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\n this.unsetScrollDownListener();\n }, this.scrollDownListenerSetter);\n }\n }\n\n public unsetScrollDownListener(refreshPosition = true) {\n this.waitForScrollBottom = false;\n\n if(this.scrollDownListenerSetter) {\n this.scrollDownListenerSetter.removeAll();\n this.scrollDownListenerSetter = null;\n }\n\n if(refreshPosition) {\n this.setCorrectIndex(0);\n }\n }\n\n public async handleFollowingPinnedMessage() {\n this.locked = true;\n\n this.debug && this.log('handleFollowingPinnedMessage');\n try {\n this.setScrollDownListener();\n\n const setPeerPromise = this.chat.setPeerPromise;\n if(setPeerPromise instanceof Promise) {\n await setPeerPromise;\n }\n\n // await this.chat.bubbles.scrollable.scrollLockedPromise;\n await getHeavyAnimationPromise();\n\n if(this.getCurrentIndexPromise) {\n await this.getCurrentIndexPromise;\n }\n\n this.debug && this.log('handleFollowingPinnedMessage: unlock');\n this.locked = false;\n\n /* // подождём, пока скролл остановится\n setTimeout(() => {\n this.log('handleFollowingPinnedMessage: unlock');\n this.locked = false;\n }, 50); */\n } catch(err) {\n this.log.error('handleFollowingPinnedMessage error:', err);\n\n this.locked = false;\n this.waitForScrollBottom = false;\n this.setCorrectIndex(0);\n }\n }\n\n public async followPinnedMessage(mid: number) {\n const message = await this.chat.getMessage(mid);\n if(!message) {\n return;\n }\n\n this.chat.setMessageId(mid);\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\n this.handleFollowingPinnedMessage();\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\n });\n }\n\n public async _setPinnedMessage() {\n // ///this.log('setting pinned message', message);\n // return;\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\n Promise.all([\n promise\n ]).then(() => { */\n // const mids = results[0];\n const count = this.count;\n if(count) {\n const pinnedIndex = this.pinnedIndex;\n const message = await this.chat.getMessage(this.pinnedMid);\n\n // this.animatedCounter.prepareNumber(count);\n\n // setTimeout(() => {\n const isLast = pinnedIndex === 0;\n this.animatedCounter.container.classList.toggle('is-last', isLast);\n // SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\n if(!isLast) {\n this.animatedCounter.setCount(count - pinnedIndex);\n }\n // }, 100);\n\n // this.pinnedMessageContainer.fill(undefined, message.message, message);\n this.pinnedMessageContainer.toggle(false);\n\n const fromTop = pinnedIndex > this.wasPinnedIndex;\n\n this.debug && this.log('setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\n\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\n writeMediaTo.classList.add('pinned-message-media');\n // writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\n const loadPromises: Promise[] = [];\n const isMediaSet = await wrapReplyDivAndCaption({\n title: undefined,\n titleEl: null,\n subtitle: (message as Message.message).message,\n subtitleEl: writeTo,\n message,\n mediaEl: writeMediaTo,\n loadPromises,\n animationGroup: this.chat.animationGroup\n });\n\n await Promise.all(loadPromises);\n\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\n\n // if(this.wasPinnedIndex !== this.pinnedIndex) {\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\n if(isMediaSet) {\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex из-за того, что блок меняется с другим алгоритмом\n this.wasPinnedMediaIndex = pinnedIndex;\n } else {\n this.animatedMedia.clearRows();\n }\n // }\n\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\n this.wasPinnedIndex = pinnedIndex;\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\n } else {\n this.pinnedMessageContainer.toggle(true);\n this.wasPinnedIndex = 0;\n }\n\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 1);\n // });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\n if(IS_TOUCH_SUPPORTED) {\n let lastY: number;\n const options = {passive: true};\n listenerSetter.add(elem)('touchstart', (e) => {\n if(e.touches.length > 1) {\n onTouchEnd();\n return;\n }\n\n lastY = e.touches[0].clientY;\n\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\n }, options);\n\n const onTouchMove = (e: TouchEvent) => {\n const clientY = e.touches[0].clientY;\n\n const isDown = clientY < lastY;\n if(side === 'bottom' && isDown) callback();\n else if(side === 'top' && !isDown) callback();\n lastY = clientY;\n // alert('isDown: ' + !!isDown);\n };\n\n const onTouchEnd = () => {\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\n };\n } else {\n listenerSetter.add(elem)('wheel', (e) => {\n const isDown = e.deltaY > 0;\n // this.log('wheel', e, isDown);\n if(side === 'bottom' && isDown) callback();\n else if(side === 'top' && !isDown) callback();\n }, {passive: true});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Channel} from '../../lib/appManagers/appChatsManager';\nimport type {AppSidebarRight} from '../sidebarRight';\nimport type Chat from './chat';\nimport {RIGHT_COLUMN_ACTIVE_CLASSNAME} from '../sidebarRight';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport Button from '../button';\nimport ButtonIcon from '../buttonIcon';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport ChatAudio from './audio';\nimport ChatPinnedMessage from './pinnedMessage';\nimport {ButtonMenuItemOptions} from '../buttonMenu';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport PopupDeleteDialog from '../popups/deleteDialog';\nimport appNavigationController from '../appNavigationController';\nimport {LEFT_COLUMN_ACTIVE_CLASSNAME} from '../sidebarLeft';\nimport PeerTitle from '../peerTitle';\nimport {i18n} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {toast, toastNew} from '../toast';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {ChatFull, Chat as MTChat, GroupCall} from '../../layer';\nimport PopupPickUser from '../popups/pickUser';\nimport PopupPeer from '../popups/peer';\nimport AppEditContactTab from '../sidebarRight/tabs/editContact';\nimport appMediaPlaybackController from '../appMediaPlaybackController';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport {CallType} from '../../lib/calls/types';\nimport PopupMute from '../popups/mute';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport hasRights from '../../lib/appManagers/utils/chats/hasRights';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport groupCallsController from '../../lib/calls/groupCallsController';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport {makeMediaSize} from '../../helpers/mediaSize';\n\ntype ButtonToVerify = {element?: HTMLElement, verify: () => boolean | Promise};\n\nexport default class ChatTopbar {\n public container: HTMLDivElement;\n private btnBack: HTMLButtonElement;\n private chatInfo: HTMLDivElement;\n private avatarElement: AvatarElement;\n private title: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private chatUtils: HTMLDivElement;\n private btnJoin: HTMLButtonElement;\n private btnPinned: HTMLButtonElement;\n private btnCall: HTMLButtonElement;\n private btnGroupCall: HTMLButtonElement;\n private btnMute: HTMLButtonElement;\n private btnSearch: HTMLButtonElement;\n private btnMore: HTMLElement;\n\n private chatAudio: ChatAudio;\n public pinnedMessage: ChatPinnedMessage;\n\n private setUtilsRAF: number;\n private setPeerStatusInterval: number;\n\n public listenerSetter: ListenerSetter;\n\n private menuButtons: Parameters[0]['buttons'];\n private buttonsToVerify: ButtonToVerify[];\n private chatInfoContainer: HTMLDivElement;\n private person: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private appSidebarRight: AppSidebarRight,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n\n this.menuButtons = [];\n this.buttonsToVerify = [];\n }\n\n public construct() {\n // this.chat.log.error('Topbar construction');\n\n this.container = document.createElement('div');\n this.container.classList.add('sidebar-header', 'topbar', 'hide');\n this.container.dataset.floating = '0';\n\n this.btnBack = ButtonIcon('left sidebar-close-button', {noRipple: true});\n\n // * chat info section\n this.chatInfoContainer = document.createElement('div');\n this.chatInfoContainer.classList.add('chat-info-container');\n\n this.chatInfo = document.createElement('div');\n this.chatInfo.classList.add('chat-info');\n\n const person = this.person = document.createElement('div');\n person.classList.add('person');\n\n const content = document.createElement('div');\n content.classList.add('content');\n\n const top = document.createElement('div');\n top.classList.add('top');\n\n this.title = document.createElement('div');\n this.title.classList.add('user-title');\n\n top.append(this.title);\n\n const bottom = document.createElement('div');\n bottom.classList.add('bottom');\n\n if(this.subtitle) {\n bottom.append(this.subtitle);\n }\n\n content.append(top, bottom);\n if(this.avatarElement) {\n person.append(this.avatarElement);\n }\n\n person.append(content);\n this.chatInfo.append(person);\n\n // * chat utils section\n this.chatUtils = document.createElement('div');\n this.chatUtils.classList.add('chat-utils');\n\n this.chatAudio = new ChatAudio(this, this.chat, this.managers);\n\n if(this.menuButtons.length) {\n this.btnMore = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: this.menuButtons,\n onOpen: async(e, element) => {\n const deleteButton = this.menuButtons[this.menuButtons.length - 1];\n if(deleteButton?.element) {\n const deleteButtonText = await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n deleteButton.element.lastChild.replaceWith(i18n(deleteButtonText));\n }\n }\n });\n }\n\n this.chatUtils.append(...[\n // this.chatAudio ? this.chatAudio.divAndCaption.container : null,\n this.pinnedMessage ? this.pinnedMessage.pinnedMessageContainer.divAndCaption.container : null,\n this.btnJoin,\n this.btnPinned,\n this.btnCall,\n this.btnGroupCall,\n this.btnMute,\n this.btnSearch,\n this.btnMore\n ].filter(Boolean));\n\n this.pushButtonToVerify(this.btnCall, this.verifyCallButton.bind(this, 'voice'));\n this.pushButtonToVerify(this.btnGroupCall, this.verifyVideoChatButton);\n\n this.chatInfoContainer.append(this.btnBack, this.chatInfo, this.chatUtils);\n this.container.append(this.chatInfoContainer);\n\n if(this.chatAudio) {\n // this.container.append(this.chatAudio.divAndCaption.container, this.chatUtils);\n this.container.append(this.chatAudio.divAndCaption.container);\n }\n\n // * construction end\n\n // * fix topbar overflow section\n\n this.listenerSetter.add(window)('resize', this.onResize);\n this.listenerSetter.add(mediaSizes)('changeScreen', this.onChangeScreen);\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'pinned-container');\n blurActiveElement();\n if(container) {\n cancelEvent(e);\n\n if(findUpClassName(e.target, 'progress-line')) {\n return;\n }\n\n const mid = +container.dataset.mid;\n if(container.classList.contains('pinned-message')) {\n // if(!this.pinnedMessage.locked) {\n this.pinnedMessage.followPinnedMessage(mid);\n // }\n } else {\n const peerId = container.dataset.peerId.toPeerId();\n const searchContext = appMediaPlaybackController.getSearchContext();\n this.chat.appImManager.setInnerPeer({\n peerId,\n lastMsgId: mid,\n type: searchContext.isScheduled ? 'scheduled' : (searchContext.threadId ? 'discussion' : undefined),\n threadId: searchContext.threadId\n });\n }\n } else {\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n onBtnBackClick();\n } else if(findUpTag(e.target, 'AVATAR-ELEMENT')) {\n this.appSidebarRight.toggleSidebar(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME));\n } else {\n this.appSidebarRight.toggleSidebar(true);\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onBtnBackClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n // const item = appNavigationController.findItemByType('chat');\n // * return manually to chat by arrow, since can't get back to\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.chat.appImManager.setPeer({peerId: this.peerId});\n } else {\n const isFirstChat = this.chat.appImManager.chats.indexOf(this.chat) === 0;\n appNavigationController.back(isFirstChat ? 'im' : 'chat');\n /* return;\n\n if(mediaSizes.activeScreen === ScreenSize.medium && !appNavigationController.findItemByType('chat')) {\n this.chat.appImManager.setPeer(0);\n blurActiveElement();\n } else {\n appNavigationController.back('chat');\n } */\n }\n };\n\n attachClickEvent(this.btnBack, onBtnBackClick, {listenerSetter: this.listenerSetter});\n }\n\n private pushButtonToVerify(element: HTMLElement, verify: ButtonToVerify['verify']) {\n if(!element) {\n return;\n }\n\n this.buttonsToVerify.push({element, verify});\n }\n\n private verifyButtons = (e?: Event) => {\n const isMenuOpen = !!e || !!(this.btnMore && this.btnMore.classList.contains('menu-open'));\n\n e && cancelEvent(e);\n\n const r = async() => {\n const buttons = this.buttonsToVerify.concat(isMenuOpen ? this.menuButtons as any : []);\n const results = await Promise.all(buttons.map(async(button) => {\n return {\n result: await button.verify(),\n button\n }\n }));\n\n results.forEach(({button, result}) => {\n button.element.classList.toggle('hide', !result);\n });\n };\n\n r();\n };\n\n private verifyVideoChatButton = async(type?: 'group' | 'broadcast') => {\n if(!IS_GROUP_CALL_SUPPORTED || this.peerId.isUser() || this.chat.type !== 'chat' || this.chat.threadId) return false;\n\n const currentGroupCall = groupCallsController.groupCall;\n const chatId = this.peerId.toChatId();\n if(currentGroupCall?.chatId === chatId) {\n return false;\n }\n\n if(type) {\n if(((await this.managers.appPeersManager.isBroadcast(this.peerId)) && type === 'group') ||\n ((await this.managers.appPeersManager.isAnyGroup(this.peerId)) && type === 'broadcast')) {\n return false;\n }\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n return (chat as MTChat.chat).pFlags?.call_active || hasRights(chat, 'manage_call');\n };\n\n private verifyCallButton = async(type?: CallType) => {\n if(!IS_CALL_SUPPORTED || !this.peerId.isUser()) return false;\n const userId = this.peerId.toUserId();\n const userFull = await this.managers.appProfileManager.getCachedFullUser(userId);\n\n return !!userFull && !!(type === 'voice' ? userFull.pFlags.phone_calls_available : userFull.pFlags.video_calls_available);\n };\n\n public constructUtils() {\n this.menuButtons = [{\n icon: 'search',\n text: 'Search',\n onClick: () => {\n this.chat.initSearch();\n },\n verify: () => mediaSizes.isMobile\n }, /* {\n icon: 'pinlist',\n text: 'Pinned Messages',\n onClick: () => this.openPinned(false),\n verify: () => mediaSizes.isMobile\n }, */{\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.chat.threadId}))\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, threadId: this.chat.threadId});\n },\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && (await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.chat.threadId}))\n }, {\n icon: 'comments',\n text: 'ViewDiscussion',\n onClick: () => {\n const middleware = this.chat.bubbles.getMiddleware();\n Promise.resolve(this.managers.appProfileManager.getChannelFull(this.peerId.toChatId())).then((channelFull) => {\n if(middleware() && channelFull.linked_chat_id) {\n this.chat.appImManager.setInnerPeer({\n peerId: channelFull.linked_chat_id.toPeerId(true)\n });\n }\n });\n },\n verify: async() => {\n const chatFull = await this.managers.appProfileManager.getCachedFullChat(this.peerId.toChatId());\n return this.chat.type === 'chat' && !!(chatFull as ChatFull.channelFull)?.linked_chat_id;\n }\n }, {\n icon: 'phone',\n text: 'Call',\n onClick: this.onCallClick.bind(this, 'voice'),\n verify: this.verifyCallButton.bind(this, 'voice')\n }, {\n icon: 'videocamera',\n text: 'VideoCall',\n onClick: this.onCallClick.bind(this, 'video'),\n verify: this.verifyCallButton.bind(this, 'video')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.LiveStream',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'broadcast')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.VoiceChat',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'group')\n }, {\n icon: 'select',\n text: 'Chat.Menu.SelectMessages',\n onClick: () => {\n const selection = this.chat.selection;\n selection.toggleSelection(true, true);\n apiManagerProxy.getState().then((state) => {\n if(state.chatContextMenuHintWasShown) {\n return;\n }\n\n const original = selection.toggleByElement.bind(selection);\n selection.toggleByElement = async(bubble) => {\n this.managers.appStateManager.pushToState('chatContextMenuHintWasShown', true);\n toast(i18n('Chat.Menu.Hint'));\n\n selection.toggleByElement = original;\n selection.toggleByElement(bubble);\n };\n });\n },\n verify: () => !this.chat.selection.isSelecting && !!this.chat.bubbles.getRenderedLength()\n }, {\n icon: 'select',\n text: 'Chat.Menu.ClearSelection',\n onClick: () => {\n this.chat.selection.cancelSelection();\n },\n verify: () => this.chat.selection.isSelecting\n }, {\n icon: 'adduser',\n text: 'AddContact',\n onClick: () => {\n if(!this.appSidebarRight.isTabExists(AppEditContactTab)) {\n const tab = this.appSidebarRight.createTab(AppEditContactTab);\n tab.peerId = this.peerId;\n tab.open();\n\n this.appSidebarRight.toggleSidebar(true);\n }\n },\n verify: async() => this.peerId.isUser() && !(await this.managers.appPeersManager.isContact(this.peerId))\n }, {\n icon: 'forward',\n text: 'ShareContact',\n onClick: () => {\n const contactPeerId = this.peerId;\n new PopupPickUser({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: (peerId) => {\n return new Promise((resolve, reject) => {\n new PopupPeer('', {\n titleLangKey: 'SendMessageTitle',\n descriptionLangKey: 'SendContactToGroupText',\n descriptionLangArgs: [new PeerTitle({peerId, dialog: true}).element],\n buttons: [{\n langKey: 'Send',\n callback: () => {\n resolve();\n\n this.managers.appMessagesManager.sendContact(peerId, contactPeerId);\n this.chat.appImManager.setInnerPeer({peerId});\n }\n }, {\n langKey: 'Cancel',\n callback: () => {\n reject();\n },\n isCancel: true\n }],\n peerId,\n overlayClosable: true\n }).show();\n });\n },\n placeholder: 'ShareModal.Search.Placeholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n },\n verify: async() => rootScope.myId !== this.peerId && this.peerId.isUser() && (await this.managers.appPeersManager.isContact(this.peerId)) && !!(await this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone\n }, {\n icon: 'bots',\n text: 'Settings',\n onClick: () => {\n this.managers.appMessagesManager.sendText(this.peerId, '/settings');\n },\n verify: async() => {\n try {\n const attachMenuBot = await this.managers.appAttachMenuBotsManager.getAttachMenuBot(this.peerId.toUserId());\n return !!attachMenuBot?.pFlags?.has_settings;\n } catch(err) {\n return false;\n }\n }\n }, {\n icon: 'lock',\n text: 'BlockUser',\n onClick: () => {\n new PopupPeer('', {\n peerId: this.peerId,\n titleLangKey: 'BlockUser',\n descriptionLangKey: 'AreYouSureBlockContact2',\n descriptionLangArgs: [new PeerTitle({peerId: this.peerId}).element],\n buttons: [{\n langKey: 'BlockUser',\n isDanger: true,\n callback: () => {\n this.managers.appUsersManager.toggleBlock(this.peerId, true).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserBlocked'});\n }\n });\n }\n }]\n }).show();\n },\n verify: async() => {\n if(!this.peerId.isUser()) return false;\n const userFull = await this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return this.peerId !== rootScope.myId && userFull && !userFull.pFlags?.blocked;\n }\n }, {\n icon: 'lockoff',\n text: 'Unblock',\n onClick: () => {\n this.managers.appUsersManager.toggleBlock(this.peerId, false).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserUnblocked'});\n }\n });\n },\n verify: async() => {\n const userFull = await this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return !!userFull?.pFlags?.blocked;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: () => {\n new PopupDeleteDialog(this.peerId/* , 'leave' */);\n },\n verify: async() => this.chat.type === 'chat' && !!(await this.managers.appMessagesManager.getDialogOnly(this.peerId))\n }];\n\n this.btnSearch = ButtonIcon('search');\n this.attachClickEvent(this.btnSearch, (e) => {\n this.chat.initSearch();\n }, true);\n }\n\n public attachClickEvent(el: HTMLElement, cb: (e: MouseEvent) => void, noBlur?: boolean) {\n attachClickEvent(el, (e) => {\n cancelEvent(e);\n !noBlur && blurActiveElement();\n cb(e);\n }, {listenerSetter: this.listenerSetter});\n }\n\n private onCallClick(type: CallType) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), type);\n }\n\n private onJoinGroupCallClick = () => {\n this.chat.appImManager.joinGroupCall(this.peerId);\n };\n\n private constructAvatar() {\n const avatarElement = new AvatarElement();\n avatarElement.isDialog = true;\n avatarElement.classList.add('avatar-42', 'person-avatar');\n return avatarElement;\n }\n\n private get peerId() {\n return this.chat.peerId;\n }\n\n public constructPeerHelpers() {\n this.avatarElement = this.constructAvatar();\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('info');\n\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n\n this.btnJoin = Button('btn-primary btn-color-primary chat-join hide');\n this.btnCall = ButtonIcon('phone');\n this.btnGroupCall = ButtonIcon('videochat');\n this.btnPinned = ButtonIcon('pinlist');\n this.btnMute = ButtonIcon('mute');\n\n this.attachClickEvent(this.btnCall, this.onCallClick.bind(this, 'voice'));\n this.attachClickEvent(this.btnGroupCall, this.onJoinGroupCallClick);\n\n this.attachClickEvent(this.btnPinned, () => {\n this.openPinned(true);\n });\n\n this.attachClickEvent(this.btnMute, this.onMuteClick);\n\n this.attachClickEvent(this.btnJoin, async() => {\n const middleware = this.chat.bubbles.getMiddleware();\n this.btnJoin.setAttribute('disabled', 'true');\n\n const chatId = this.peerId.toChatId();\n let promise: Promise;\n if(await this.managers.appChatsManager.isChannel(chatId)) {\n promise = this.managers.appChatsManager.joinChannel(chatId);\n } else {\n promise = this.managers.appChatsManager.addChatUser(chatId, rootScope.myId);\n }\n\n promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.btnJoin.removeAttribute('disabled');\n });\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n const chat = await this.managers.appChatsManager.getChat(chatId) as Channel/* | Chat */;\n\n this.btnJoin.classList.toggle('hide', !(chat as Channel)?.pFlags?.left);\n this.setUtilsWidth();\n this.verifyButtons();\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(dialog.peerId === this.peerId) {\n this.setMutedState();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.verifyButtons();\n }\n });\n\n this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n apiManagerProxy.getState().then((state) => {\n if(!middleware() || !this.pinnedMessage) return;\n\n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[this.chat.peerId];\n\n if(isTopMessage) {\n this.pinnedMessage.unsetScrollDownListener();\n this.pinnedMessage.testMid(mid, 0); // * because slider will not let get bubble by document.elementFromPoint\n } else if(!this.pinnedMessage.locked) {\n this.pinnedMessage.handleFollowingPinnedMessage();\n this.pinnedMessage.testMid(mid);\n }\n });\n });\n\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids}) => {\n if(this.chat.type !== 'pinned' || peerId !== this.peerId) {\n return;\n }\n\n if(mids) {\n this.setTitle();\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\n }\n\n public openPinned(byCurrent: boolean) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.peerId,\n lastMsgId: byCurrent ? +this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid : 0,\n type: 'pinned'\n });\n }\n\n private onMuteClick = () => {\n new PopupMute(this.peerId);\n };\n\n private onResize = () => {\n this.setUtilsWidth(true);\n this.setFloating();\n };\n\n private onChangeScreen = (from: ScreenSize, to: ScreenSize) => {\n this.container.classList.toggle('is-pinned-floating', mediaSizes.isMobile);\n // this.chatAudio && this.chatAudio.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.onResize();\n };\n\n public destroy() {\n // this.chat.log.error('Topbar destroying');\n this.listenerSetter.removeAll();\n window.clearInterval(this.setPeerStatusInterval);\n\n this.pinnedMessage?.destroy(); // * возможно это можно не делать\n this.chatAudio?.destroy();\n\n delete this.chatAudio;\n delete this.pinnedMessage;\n }\n\n public cleanup() {\n if(!this.chat.peerId) {\n this.container.classList.add('hide');\n }\n }\n\n public async finishPeerChange(isTarget: boolean) {\n const {peerId, threadId} = this.chat;\n\n let newAvatar: AvatarElement;\n if(this.chat.type === 'chat') {\n if(this.avatarElement?.peerId !== this.peerId || this.avatarElement.threadId !== this.chat.threadId) {\n newAvatar = this.constructAvatar();\n } else {\n newAvatar = this.avatarElement;\n }\n }\n\n const [isBroadcast, isAnyChat, chat, _, setTitleCallback, setStatusCallback, state] = await Promise.all([\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.isAnyChat(peerId),\n peerId.isAnyChat() ? this.managers.appChatsManager.getChat(peerId.toChatId()) : undefined,\n newAvatar ? newAvatar.updateWithOptions({peerId, threadId, wrapOptions: {customEmojiSize: makeMediaSize(32, 32)}}) : undefined,\n this.setTitleManual(),\n this.setPeerStatusManual(true),\n apiManagerProxy.getState()\n ]);\n\n return () => {\n const canHaveSomeButtons = !(this.chat.type === 'pinned' || this.chat.type === 'scheduled');\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast || !canHaveSomeButtons);\n if(this.btnJoin) {\n if(isAnyChat && !this.chat.isRestricted && canHaveSomeButtons) {\n replaceContent(this.btnJoin, i18n(isBroadcast ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !(chat as MTChat.chat)?.pFlags?.left);\n } else {\n this.btnJoin.classList.add('hide');\n }\n }\n\n if(this.btnSearch) {\n this.btnSearch.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n if(this.btnPinned) {\n this.btnPinned.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n if(this.avatarElement !== newAvatar) {\n if(newAvatar) {\n if(this.avatarElement) {\n this.avatarElement.replaceWith(newAvatar);\n } else {\n this.person.prepend(newAvatar);\n }\n }\n\n this.avatarElement?.remove();\n this.avatarElement = newAvatar;\n }\n\n this.setUtilsWidth();\n\n this.verifyButtons();\n\n if(this.btnMore) {\n this.btnMore.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n const isPinnedMessagesNeeded = this.chat.isPinnedMessagesNeeded();\n if(isPinnedMessagesNeeded || this.chat.type === 'discussion') {\n if(this.chat.wasAlreadyUsed || !this.pinnedMessage) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n if(this.pinnedMessage) {\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n // this.pinnedMessage.pinnedMessageContainer.toggle(true);\n } else {\n this.chatUtils.prepend(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container);\n }\n\n this.pinnedMessage = newPinnedMessage;\n }\n\n if(isPinnedMessagesNeeded) {\n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[peerId];\n } else if(this.chat.type === 'discussion') {\n this.pinnedMessage.pinnedMid = this.chat.threadId;\n this.pinnedMessage.count = 1;\n this.pinnedMessage.pinnedIndex = 0;\n this.pinnedMessage._setPinnedMessage();\n }\n } else if(this.pinnedMessage) {\n this.pinnedMessage.destroy();\n this.pinnedMessage = undefined;\n }\n\n setTitleCallback();\n setStatusCallback?.();\n this.subtitle.classList.toggle('hide', !setStatusCallback);\n this.setMutedState();\n\n this.container.classList.remove('hide');\n };\n }\n\n public async setTitleManual(count?: number) {\n const {peerId, threadId} = this.chat;\n const middleware = () => this.chat.bubbles.getMiddleware();\n let titleEl: HTMLElement, icons: Element[];\n if(this.chat.type === 'pinned') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('PinnedMessagesCount', [count]);\n\n if(count === undefined) {\n this.managers.appMessagesManager.getSearchCounters(peerId, [{_: 'inputMessagesFilterPinned'}], false).then((result) => {\n if(!middleware()) return;\n const count = result[0].count;\n this.setTitle(count);\n\n // ! костыль х2, это нужно делать в другом месте\n if(!count) {\n this.chat.appImManager.setPeer(); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n }\n });\n }\n } else if(this.chat.type === 'scheduled') {\n titleEl = i18n(peerId === rootScope.myId ? 'Reminders' : 'ScheduledMessages');\n } else if(this.chat.type === 'discussion') {\n if(count === undefined) {\n const result = await this.managers.acknowledged.appMessagesManager.getHistory(peerId, 0, 1, 0, threadId);\n if(!middleware()) return;\n if(result.cached) {\n const historyResult = await result.result;\n if(!middleware()) return;\n count = historyResult.count;\n } else result.result.then((historyResult) => {\n if(!middleware()) return;\n this.setTitle(historyResult.count);\n });\n }\n\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('Chat.Title.Comments', [count]);\n } else if(this.chat.type === 'chat') {\n [titleEl/* , icons */] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: true,\n withIcons: !threadId,\n threadId: threadId\n })\n // generateTitleIcons(peerId)\n ]);\n\n if(!middleware()) {\n return;\n }\n }\n\n return () => {\n replaceContent(this.title, titleEl);\n // if(icons) {\n // this.title.append(...icons);\n // }\n };\n }\n\n public setTitle(count?: number) {\n this.setTitleManual(count).then((setTitleCallback) => setTitleCallback());\n }\n\n public async setMutedState() {\n if(!this.btnMute) return;\n\n const peerId = this.peerId;\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false, threadId: this.chat.threadId});\n if(await this.managers.appPeersManager.isBroadcast(peerId)) { // not human\n this.btnMute.classList.remove('tgico-mute', 'tgico-unmute');\n this.btnMute.classList.add(muted ? 'tgico-unmute' : 'tgico-mute');\n this.btnMute.style.display = '';\n } else {\n this.btnMute.style.display = 'none';\n }\n }\n\n // ! У МЕНЯ ПРОСТО СГОРЕЛО, САФАРИ КОНЧЕННЫЙ БРАУЗЕР - ЕСЛИ НЕ СКРЫВАТЬ БЛОК, ТО ПРИ ПЕРЕВОРОТЕ ЭКРАНА НА АЙФОНЕ БЛОК БУДЕТ НЕПРАВИЛЬНО ШИРИНЫ, ДАЖЕ БЕЗ ЭТОЙ ФУНКЦИИ!\n public setUtilsWidth = (resize = false) => {\n // return;\n if(this.setUtilsRAF) window.cancelAnimationFrame(this.setUtilsRAF);\n\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.add('hide');\n }\n\n // mutationObserver.disconnect();\n this.setUtilsRAF = window.requestAnimationFrame(() => {\n // mutationRAF = window.requestAnimationFrame(() => {\n\n // setTimeout(() => {\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.remove('hide');\n }\n /* this.chatInfo.style.removeProperty('--utils-width');\n void this.chatInfo.offsetLeft; // reflow */\n const width = /* chatUtils.scrollWidth */this.chatUtils.getBoundingClientRect().width;\n this.chat.log('utils width:', width);\n this.container.style.setProperty('--utils-width', width + 'px');\n // this.chatInfo.classList.toggle('have-utils-width', !!width);\n // }, 0);\n\n this.setUtilsRAF = 0;\n\n // mutationObserver.observe(chatUtils, observeOptions);\n // });\n });\n };\n\n public setFloating = () => {\n const containers = [this.chatAudio, this.pinnedMessage?.pinnedMessageContainer].filter(Boolean);\n const count = containers.reduce((acc, container) => {\n const isFloating = container.isFloating();\n this.container.classList.toggle(`is-pinned-${container.className}-floating`, isFloating);\n\n if(!container.isVisible()) {\n return acc;\n }\n\n return acc + +isFloating;\n }, 0);\n this.container.dataset.floating = '' + count;\n };\n\n public setPeerStatusManual = async(needClear = false) => {\n if(!this.subtitle || this.chat.type !== 'chat') return;\n\n if(this.chat.threadId) {\n const title = await wrapPeerTitle({peerId: this.peerId, dialog: true});\n const span = i18n('TopicProfileStatus', [title]);\n return () => replaceContent(this.subtitle, span);\n }\n\n const peerId = this.peerId;\n return this.chat.appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear,\n useWhitespace: false,\n middleware: () => peerId === this.peerId\n });\n };\n\n public setPeerStatus = (needClear?: boolean) => {\n return this.setPeerStatusManual(needClear).then((callback) => {\n callback?.();\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appSidebarRight from '..';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport AppSearch, {SearchGroup} from '../../appSearch';\nimport ButtonIcon from '../../buttonIcon';\nimport InputSearch from '../../inputSearch';\nimport PopupElement from '../../popups';\nimport PopupDatePicker from '../../popups/datePicker';\nimport {SliderSuperTab} from '../../slider';\n\nexport default class AppPrivateSearchTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private appSearch: AppSearch;\n private btnPickDate: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n private query = '';\n private onDatePick: (timestamp: number) => void;\n\n onOpenAfterTimeout() {\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\n }\n\n public init(\n peerId: PeerId,\n threadId?: number,\n onDatePick?: AppPrivateSearchTab['onDatePick'],\n query?: string\n ) {\n this.container.id = 'search-private-container';\n this.container.classList.add('chatlist-container');\n this.inputSearch = new InputSearch('Search');\n this.title.replaceWith(this.inputSearch.container);\n\n this.btnPickDate = ButtonIcon('calendar sidebar-header-right');\n this.header.append(this.btnPickDate);\n\n const c = document.createElement('div');\n c.classList.add('chatlist-container');\n this.scrollable.container.replaceWith(c);\n this.appSearch = new AppSearch(c, this.inputSearch, {\n messages: new SearchGroup('Chat.Search.PrivateSearch', 'messages')\n });\n\n if(!this.peerId) {\n this.query = query;\n this.peerId = peerId;\n this.threadId = threadId;\n this.onDatePick = onDatePick;\n\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\n if(this.onDatePick) {\n attachClickEvent(this.btnPickDate, () => {\n PopupElement.createPopup(PopupDatePicker, new Date(), this.onDatePick).show();\n });\n }\n\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\n\n appSidebarRight.toggleSidebar(true);\n } else {\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatTopbar from './topbar';\nimport AppSearch, {SearchGroup} from '../appSearch';\nimport PopupDatePicker from '../popups/datePicker';\nimport ripple from '../ripple';\nimport InputSearch from '../inputSearch';\nimport type Chat from './chat';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {i18n} from '../../lib/langPack';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport PopupElement from '../popups';\nimport {DIALOG_LIST_ELEMENT_TAG} from '../../lib/appManagers/appDialogsManager';\n\nexport default class ChatSearch {\n private element: HTMLElement;\n private backBtn: HTMLElement;\n private inputSearch: InputSearch;\n\n private results: HTMLElement;\n\n private footer: HTMLElement;\n private dateBtn: HTMLElement;\n private foundCountEl: HTMLElement;\n private controls: HTMLElement;\n private downBtn: HTMLElement;\n private upBtn: HTMLElement;\n\n private appSearch: AppSearch;\n private searchGroup: SearchGroup;\n\n private foundCount = 0;\n private selectedIndex = 0;\n private setPeerPromise: Promise;\n private listenerSetter: ListenerSetter;\n private navigationItem: NavigationItem;\n\n constructor(private topbar: ChatTopbar, private chat: Chat, query?: string) {\n this.element = document.createElement('div');\n this.element.classList.add('sidebar-header', 'chat-search', 'chatlist-container');\n\n this.backBtn = document.createElement('button');\n this.backBtn.classList.add('btn-icon', 'tgico-left', 'sidebar-close-button');\n ripple(this.backBtn);\n\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n const attachClick = (element: HTMLElement, callback: (e: MouseEvent) => void) => {\n attachClickEvent(element, callback, {listenerSetter});\n };\n\n attachClick(this.backBtn, () => {\n this.destroy();\n });\n\n this.inputSearch = new InputSearch('Search');\n\n // Results\n this.results = document.createElement('div');\n this.results.classList.add('chat-search-results', 'chatlist-container');\n\n this.searchGroup = new SearchGroup(false, 'messages', undefined, '', false);\n attachClick(this.searchGroup.list, this.onResultsClick);\n\n this.appSearch = new AppSearch(this.results, this.inputSearch, {\n messages: this.searchGroup\n }, (count) => {\n this.foundCount = count;\n\n if(!this.foundCount) {\n replaceContent(this.foundCountEl, this.inputSearch.value ? i18n('NoResult') : '');\n this.results.classList.remove('active');\n this.chat.bubbles.container.classList.remove('search-results-active');\n this.upBtn.setAttribute('disabled', 'true');\n this.downBtn.setAttribute('disabled', 'true');\n } else {\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\n }\n });\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\n\n // appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\n this.chat.bubbles.container.append(this.results);\n\n // Footer\n this.footer = document.createElement('div');\n this.footer.classList.add('chat-search-footer');\n\n attachClick(this.footer, this.onFooterClick);\n ripple(this.footer);\n\n this.foundCountEl = document.createElement('span');\n this.foundCountEl.classList.add('chat-search-count');\n\n this.dateBtn = document.createElement('button');\n this.dateBtn.classList.add('btn-icon', 'tgico-calendar');\n\n this.controls = document.createElement('div');\n this.controls.classList.add('chat-search-controls');\n\n this.upBtn = document.createElement('button');\n this.upBtn.classList.add('btn-icon', 'tgico-up');\n this.downBtn = document.createElement('button');\n this.downBtn.classList.add('btn-icon', 'tgico-down');\n\n this.upBtn.setAttribute('disabled', 'true');\n this.downBtn.setAttribute('disabled', 'true');\n\n attachClick(this.dateBtn, this.onDateClick);\n attachClick(this.upBtn, this.onUpClick);\n attachClick(this.downBtn, this.onDownClick);\n this.controls.append(this.upBtn, this.downBtn);\n\n this.footer.append(this.foundCountEl, this.dateBtn, this.controls);\n\n this.topbar.container.parentElement.insertBefore(this.footer, chat.input.chatInput);\n\n // Append container\n this.element.append(this.backBtn, this.inputSearch.container);\n\n this.topbar.container.classList.add('hide-pinned');\n this.topbar.container.parentElement.append(this.element);\n\n this.inputSearch.input.focus();\n\n if(query) {\n this.setQuery(query);\n }\n\n if(!IS_MOBILE_SAFARI) {\n this.navigationItem = {\n type: 'mobile-search',\n onPop: () => {\n this.destroy();\n }\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n }\n\n public destroy() {\n this.topbar.container.classList.remove('hide-pinned');\n this.element.remove();\n this.inputSearch.remove();\n this.results.remove();\n this.footer.remove();\n this.listenerSetter.removeAll();\n this.chat.bubbles.container.classList.remove('search-results-active');\n this.chat.search = undefined;\n appNavigationController.removeItem(this.navigationItem);\n }\n\n public setQuery(query: string) {\n this.inputSearch.inputField.value = query;\n }\n\n private onDateClick = (e: MouseEvent) => {\n cancelEvent(e);\n PopupElement.createPopup(PopupDatePicker, new Date(), this.chat.bubbles.onDatePick).show();\n };\n\n private selectResult(elem: HTMLElement) {\n if(this.setPeerPromise) return this.setPeerPromise;\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n\n const index = whichChild(elem);\n\n if(index === (this.foundCount - 1)) {\n this.upBtn.setAttribute('disabled', 'true');\n } else {\n this.upBtn.removeAttribute('disabled');\n }\n\n if(!index) {\n this.downBtn.setAttribute('disabled', 'true');\n } else {\n this.downBtn.removeAttribute('disabled');\n }\n\n this.results.classList.remove('active');\n this.chat.bubbles.container.classList.remove('search-results-active');\n\n const res = this.chat.setPeer({peerId, lastMsgId});\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\n this.selectedIndex = index;\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\n\n const renderedCount = this.searchGroup.list.childElementCount;\n if(this.selectedIndex >= (renderedCount - 6)) {\n this.appSearch.searchMore();\n }\n }).finally(() => {\n this.setPeerPromise = null;\n });\n }\n\n private onResultsClick = (e: MouseEvent) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(target) {\n this.selectResult(target);\n }\n };\n\n private onFooterClick = (e: MouseEvent) => {\n if(this.foundCount) {\n this.chat.bubbles.container.classList.toggle('search-results-active');\n this.results.classList.toggle('active');\n }\n };\n\n private onUpClick = (e: MouseEvent) => {\n cancelEvent(e);\n this.selectResult(this.searchGroup.list.children[this.selectedIndex + 1] as HTMLElement);\n };\n\n private onDownClick = (e: MouseEvent) => {\n cancelEvent(e);\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport windowSize from '../../helpers/windowSize';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\n\ntype ChatBackgroundPatternRendererInitOptions = {\n url: string,\n width: number,\n height: number,\n mask?: boolean\n};\n\nexport default class ChatBackgroundPatternRenderer {\n private static INSTANCES: ChatBackgroundPatternRenderer[] = [];\n\n // private pattern: CanvasPattern;\n private objectUrl: string;\n private options: ChatBackgroundPatternRendererInitOptions;\n private canvases: Set;\n // private createCanvasPatternPromise: Promise;\n // private exportCanvasPatternToImagePromise: Promise;\n private renderImageFromUrlPromise: Promise;\n private image: HTMLImageElement;\n private imageBitmap: ImageBitmap;\n\n constructor() {\n this.canvases = new Set();\n }\n\n public static getInstance(options: ChatBackgroundPatternRendererInitOptions) {\n let instance = this.INSTANCES.find((instance) => {\n return deepEqual(instance.options, options);\n });\n\n if(!instance) {\n instance = new ChatBackgroundPatternRenderer();\n instance.init(options);\n this.INSTANCES.push(instance);\n }\n\n return instance;\n }\n\n public init(options: ChatBackgroundPatternRendererInitOptions) {\n // if(this.options) {\n // if(this.options.width !== options.width || this.options.height !== options.height) {\n // this.createCanvasPatternPromise =\n // this.pattern =\n // this.exportCanvasPatternToImagePromise =\n // undefined;\n // }\n // }\n\n this.options = options;\n }\n\n public renderToCanvas(canvas: HTMLCanvasElement) {\n // return this.createCanvasPattern(canvas).then(() => {\n // return this.fillCanvas(canvas);\n // });\n\n return this.renderImageFromUrl(this.options.url).then(() => {\n return this.fillCanvas(canvas);\n });\n }\n\n private renderImageFromUrl(url: string) {\n if(this.renderImageFromUrlPromise) return this.renderImageFromUrlPromise;\n const img = this.image = document.createElement('img');\n img.crossOrigin = 'anonymous';\n return this.renderImageFromUrlPromise = renderImageFromUrlPromise(img, url, false).then(() => {\n if(!IS_IMAGE_BITMAP_SUPPORTED) {\n return img;\n }\n\n return createImageBitmap(img, {\n resizeWidth: 1440,\n resizeHeight: 2960\n }).then((imageBitmap) => {\n this.imageBitmap = imageBitmap;\n return img;\n });\n });\n }\n\n /* private createCanvasPattern(canvas: HTMLCanvasElement) {\n if(this.createCanvasPatternPromise) return this.createCanvasPatternPromise;\n return this.createCanvasPatternPromise = this.renderImageFromUrl(this.options.url).then((img) => {\n let createPatternFrom: HTMLImageElement | HTMLCanvasElement;\n if(IS_SAFARI) {\n const canvas = createPatternFrom = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n } else {\n createPatternFrom = img;\n }\n\n const perf = performance.now();\n this.pattern = canvas.getContext('2d').createPattern(createPatternFrom, 'repeat-x');\n console.warn('creating pattern time:', performance.now() - perf);\n\n return this.pattern;\n });\n }\n\n public exportCanvasPatternToImage(canvas: HTMLCanvasElement) {\n if(this.exportCanvasPatternToImagePromise) return this.exportCanvasPatternToImagePromise;\n return this.exportCanvasPatternToImagePromise = new Promise((resolve) => {\n canvas.toBlob((blob) => {\n const newUrl = this.objectUrl = URL.createObjectURL(blob);\n resolve(newUrl);\n }, 'image/png');\n });\n } */\n\n public cleanup(canvas: HTMLCanvasElement) {\n this.canvases.delete(canvas);\n\n if(!this.canvases.size) {\n indexOfAndSplice(ChatBackgroundPatternRenderer.INSTANCES, this);\n\n if(this.objectUrl) {\n this.imageBitmap?.close();\n URL.revokeObjectURL(this.objectUrl);\n }\n }\n }\n\n public fillCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n const {width, height} = canvas;\n // const perf = performance.now();\n // if(context.fillStyle instanceof CanvasPattern) {\n // context.clearRect(0, 0, width, height);\n // }\n\n const source = this.imageBitmap || this.image;\n\n let imageWidth = source.width, imageHeight = source.height;\n // let patternHeight = 1480 * canvas.dpr;\n // if(+canvas.dataset.originalHeight !== height) patternHeight *= .6875;\n const patternHeight = (500 + (windowSize.height / 2.5)) * canvas.dpr;\n const ratio = patternHeight / imageHeight;\n imageWidth *= ratio;\n imageHeight = patternHeight;\n\n if(this.options.mask) {\n context.fillStyle = '#000';\n context.fillRect(0, 0, width, height);\n context.globalCompositeOperation = 'destination-out';\n } else {\n context.globalCompositeOperation = 'source-over';\n }\n\n const d = (y: number) => {\n for(let x = 0; x < width; x += imageWidth) {\n context.drawImage(source, x, y, imageWidth, imageHeight);\n }\n };\n\n const centerY = (height - imageHeight) / 2;\n d(centerY);\n\n if(centerY > 0) {\n let topY = centerY;\n do {\n d(topY -= imageHeight);\n } while(topY >= 0);\n }\n\n const endY = height - 1;\n for(let bottomY = centerY + imageHeight; bottomY < endY; bottomY += imageHeight) {\n d(bottomY);\n }\n\n // for(let x = 0; x < width; x += imageWidth) {\n // for(let y = 0; y < height; y += imageHeight) {\n // context.drawImage(img, x, y, imageWidth, imageHeight);\n // }\n // }\n // context.fillStyle = this.pattern;\n // context.fillRect(0, 0, width, height);\n // console.warn('fill canvas time', performance.now() - perf);\n }\n\n public setCanvasDimensions(canvas: HTMLCanvasElement) {\n const devicePixelRatio = Math.min(2, window.devicePixelRatio);\n const width = this.options.width * devicePixelRatio;\n let height = this.options.height * devicePixelRatio;\n\n canvas.dpr = devicePixelRatio;\n canvas.dataset.originalHeight = '' + height;\n if(mediaSizes.activeScreen === ScreenSize.large) height *= 1.5;\n canvas.width = width;\n canvas.height = height;\n }\n\n public createCanvas() {\n const canvas = document.createElement('canvas');\n this.canvases.add(canvas);\n this.setCanvasDimensions(canvas);\n return canvas;\n }\n\n public resize(width: number, height: number) {\n this.init({\n ...this.options,\n width,\n height\n });\n\n const promises: Promise[] = [];\n for(const canvas of this.canvases) {\n this.setCanvasDimensions(canvas);\n promises.push(this.renderToCanvas(canvas));\n }\n\n return Promise.all(promises);\n }\n\n public static resizeInstances(width: number, height: number) {\n return Promise.all(this.INSTANCES.map((instance) => instance.resize(width, height)));\n }\n\n /* public setResizeMode(resizing: boolean) {\n const canvases = Array.from(this.canvases);\n const canvas = canvases[canvases.length - 1];\n canvas.style.display = resizing ? 'none' : '';\n const img = this.img;\n img.style.display = resizing ? '' : 'none';\n\n return {img, canvas};\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ChatRights} from '../../lib/appManagers/appChatsManager';\nimport {AppImManager, APP_TABS, ChatSetPeerOptions} from '../../lib/appManagers/appImManager';\nimport type {MessageSendingParams, MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {logger, LogTypes} from '../../lib/logger';\nimport rootScope from '../../lib/rootScope';\nimport appSidebarRight from '../sidebarRight';\nimport ChatBubbles from './bubbles';\nimport ChatContextMenu from './contextMenu';\nimport ChatInput from './input';\nimport ChatSelection from './selection';\nimport ChatTopbar from './topbar';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport SetTransition from '../singleTransition';\nimport AppPrivateSearchTab from '../sidebarRight/tabs/search';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport ChatSearch from './search';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport getAutoDownloadSettingsByPeerId, {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport ChatBackgroundGradientRenderer from './gradientRenderer';\nimport ChatBackgroundPatternRenderer from './patternRenderer';\nimport pause from '../../helpers/schedulers/pause';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport SlicedArray from '../../helpers/slicedArray';\nimport themeController from '../../helpers/themeController';\nimport AppSharedMediaTab from '../sidebarRight/tabs/sharedMedia';\nimport noop from '../../helpers/noop';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {Message, WallPaper} from '../../layer';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport {getColorsFromWallPaper} from '../sidebarLeft/tabs/background';\n\nexport type ChatType = 'chat' | 'pinned' | 'discussion' | 'scheduled';\n\nexport default class Chat extends EventListenerBase<{\n setPeer: (mid: number, isTopMessage: boolean) => void\n}> {\n public container: HTMLElement;\n public backgroundEl: HTMLElement;\n\n public topbar: ChatTopbar;\n public bubbles: ChatBubbles;\n public input: ChatInput;\n public selection: ChatSelection;\n public contextMenu: ChatContextMenu;\n public search: ChatSearch;\n\n public wasAlreadyUsed: boolean;\n // public initPeerId = 0;\n public peerId: PeerId;\n public threadId: number;\n public setPeerPromise: Promise;\n public peerChanged: boolean;\n\n public log: ReturnType;\n\n public type: ChatType;\n public messagesStorageKey: MessagesStorageKey;\n\n public noForwards: boolean;\n\n public inited: boolean;\n\n public isRestricted: boolean;\n public autoDownload: ChatAutoDownloadSettings;\n\n public gradientRenderer: ChatBackgroundGradientRenderer;\n public patternRenderer: ChatBackgroundPatternRenderer;\n public gradientCanvas: HTMLCanvasElement;\n public patternCanvas: HTMLCanvasElement;\n public backgroundTempId: number;\n public setBackgroundPromise: Promise;\n public sharedMediaTab: AppSharedMediaTab;\n public sharedMediaTabs: AppSharedMediaTab[];\n // public renderDarkPattern: () => Promise;\n\n public isBot: boolean;\n public isChannel: boolean;\n public isBroadcast: boolean;\n public isAnyGroup: boolean;\n public isMegagroup: boolean;\n public isForum: boolean;\n public isAllMessagesForum: boolean;\n\n public animationGroup: AnimationItemGroup;\n\n constructor(\n public appImManager: AppImManager,\n public managers: AppManagers\n ) {\n super();\n\n this.type = 'chat';\n this.animationGroup = `chat-${Math.round(Math.random() * 65535)}`;\n\n this.container = document.createElement('div');\n this.container.classList.add('chat', 'tabs-tab');\n\n this.backgroundEl = document.createElement('div');\n this.backgroundEl.classList.add('chat-background');\n\n // * constructor end\n\n this.log = logger('CHAT', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n this.log.warn('constructor');\n\n this.peerId = NULL_PEER_ID;\n\n this.container.append(this.backgroundEl);\n this.appImManager.chatsContainer.append(this.container);\n\n this.backgroundTempId = 0;\n this.sharedMediaTabs = [];\n }\n\n public setBackground(url: string, skipAnimation?: boolean): Promise {\n const theme = themeController.getTheme();\n const themeSettings = theme.settings;\n const wallPaper = themeSettings.wallpaper;\n const colors = getColorsFromWallPaper(wallPaper);\n\n let item: HTMLElement;\n const isColorBackground = !!colors && !(wallPaper as WallPaper.wallPaper).slug && !wallPaper.settings.intensity;\n if(\n isColorBackground &&\n document.documentElement.style.cursor === 'grabbing' &&\n this.gradientRenderer &&\n !this.patternRenderer\n ) {\n this.gradientCanvas.dataset.colors = colors;\n this.gradientRenderer.init(this.gradientCanvas);\n return Promise.resolve();\n }\n\n const tempId = ++this.backgroundTempId;\n\n const previousGradientRenderer = this.gradientRenderer;\n const previousPatternRenderer = this.patternRenderer;\n const previousGradientCanvas = this.gradientCanvas;\n const previousPatternCanvas = this.patternCanvas;\n\n this.gradientRenderer =\n this.patternRenderer =\n this.gradientCanvas =\n this.patternCanvas =\n // this.renderDarkPattern =\n undefined;\n\n const intensity = wallPaper.settings?.intensity && wallPaper.settings.intensity / 100;\n const isDarkPattern = !!intensity && intensity < 0;\n\n let patternRenderer: ChatBackgroundPatternRenderer;\n let patternCanvas = item?.firstElementChild as HTMLCanvasElement;\n let gradientCanvas: HTMLCanvasElement;\n if(!item) {\n item = document.createElement('div');\n item.classList.add('chat-background-item');\n\n if(url) {\n if(intensity) {\n item.classList.add('is-pattern');\n\n const rect = this.appImManager.chatsContainer.getBoundingClientRect();\n patternRenderer = this.patternRenderer = ChatBackgroundPatternRenderer.getInstance({\n url,\n width: rect.width,\n height: rect.height,\n mask: isDarkPattern\n });\n\n patternCanvas = this.patternCanvas = patternRenderer.createCanvas();\n patternCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-pattern-canvas');\n\n if(isDarkPattern) {\n item.classList.add('is-dark');\n }\n\n // if(isDarkPattern) {\n // this.renderDarkPattern = () => {\n // return patternRenderer.exportCanvasPatternToImage(patternCanvas).then((url) => {\n // if(this.backgroundTempId !== tempId) {\n // return;\n // }\n\n // gradientCanvas.style.webkitMaskImage = `url(${url})`;\n // });\n // };\n // }\n } else {\n item.classList.add('is-image');\n }\n } else {\n item.classList.add('is-color');\n }\n }\n\n let gradientRenderer: ChatBackgroundGradientRenderer;\n if(colors) {\n // if(color.includes(',')) {\n const {canvas, gradientRenderer: _gradientRenderer} = ChatBackgroundGradientRenderer.create(colors);\n gradientRenderer = this.gradientRenderer = _gradientRenderer;\n gradientCanvas = this.gradientCanvas = canvas;\n gradientCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-color-canvas');\n\n if(rootScope.settings.animationsEnabled) {\n gradientRenderer.scrollAnimate(true);\n }\n // } else {\n // item.style.backgroundColor = color;\n // item.style.backgroundImage = 'none';\n // }\n }\n\n if(patternRenderer) {\n const setOpacityTo = isDarkPattern ? gradientCanvas : patternCanvas;\n setOpacityTo.style.setProperty('--opacity-max', '' + (Math.abs(intensity) * (isDarkPattern ? .5 : 1)));\n }\n\n const promise = new Promise((resolve) => {\n const cb = () => {\n if(this.backgroundTempId !== tempId) {\n if(patternRenderer) {\n patternRenderer.cleanup(patternCanvas);\n }\n\n if(gradientRenderer) {\n gradientRenderer.cleanup();\n }\n\n return;\n }\n\n const prev = this.backgroundEl.lastElementChild as HTMLElement;\n\n if(prev === item) {\n resolve();\n return;\n }\n\n const append = [\n gradientCanvas,\n // isDarkPattern && this.renderDarkPattern ? undefined : patternCanvas\n patternCanvas\n ].filter(Boolean);\n if(append.length) {\n item.append(...append);\n }\n\n this.backgroundEl.append(item);\n\n SetTransition({\n element: item,\n className: 'is-visible',\n forwards: true,\n duration: !skipAnimation ? 200 : 0,\n onTransitionEnd: prev ? () => {\n previousPatternRenderer?.cleanup(previousPatternCanvas);\n previousGradientRenderer?.cleanup();\n\n prev.remove();\n } : null,\n useRafs: 2\n });\n\n resolve();\n };\n\n if(patternRenderer) {\n const renderPatternPromise = patternRenderer.renderToCanvas(patternCanvas);\n renderPatternPromise.then(() => {\n if(this.backgroundTempId !== tempId) {\n return;\n }\n\n // let promise: Promise;\n // if(isDarkPattern && this.renderDarkPattern) {\n // promise = this.renderDarkPattern();\n // } else {\n // const promise = Promise.resolve();\n // }\n\n // promise.then(cb);\n cb();\n });\n } else if(url) {\n renderImageFromUrl(item, url, cb);\n } else {\n cb();\n }\n });\n\n return this.setBackgroundPromise = Promise.race([\n pause(500),\n promise\n ]);\n }\n\n public setType(type: ChatType) {\n this.type = type;\n }\n\n public init(/* peerId: PeerId */) {\n // this.initPeerId = peerId;\n\n this.topbar = new ChatTopbar(this, appSidebarRight, this.managers);\n this.bubbles = new ChatBubbles(this, this.managers);\n this.input = new ChatInput(this, this.appImManager, this.managers);\n this.contextMenu = new ChatContextMenu(this, this.managers);\n this.selection = new ChatSelection(this, this.bubbles, this.input, this.managers);\n\n this.topbar.constructUtils();\n this.topbar.constructPeerHelpers();\n\n this.topbar.construct();\n this.input.construct();\n\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n\n if(!IS_TOUCH_SUPPORTED) {\n this.bubbles.setReactionsHoverListeners();\n }\n\n this.bubbles.attachContainerListeners();\n\n this.container.append(this.topbar.container, this.bubbles.container, this.input.chatInput);\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.peerId === migrateFrom) {\n this.setPeer({peerId: migrateTo});\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(dialog.peerId === this.peerId && (dialog._ === 'dialog' || this.threadId === dialog.id)) {\n this.appImManager.setPeer();\n }\n });\n\n const freezeObservers = (freeze: boolean) => {\n const cb = () => {\n this.bubbles.observer?.toggleObservingNew(freeze);\n animationIntersector.toggleIntersectionGroup(this.animationGroup, freeze);\n if(freeze) {\n animationIntersector.checkAnimations(freeze, this.animationGroup);\n }\n };\n\n if(!freeze) {\n setTimeout(() => {\n cb();\n }, 400);\n } else {\n cb();\n }\n };\n\n this.bubbles.listenerSetter.add(this.appImManager)('chat_changing', ({to}) => {\n freezeObservers(to !== this);\n });\n\n this.bubbles.listenerSetter.add(this.appImManager)('tab_changing', (tabId) => {\n freezeObservers(this.appImManager.chat !== this || (tabId !== APP_TABS.CHAT && mediaSizes.activeScreen === ScreenSize.mobile));\n });\n }\n\n public beforeDestroy() {\n this.bubbles.cleanup();\n }\n\n private cleanupBackground() {\n ++this.backgroundTempId;\n if(this.patternRenderer) {\n this.patternRenderer.cleanup(this.patternCanvas);\n this.patternRenderer = undefined;\n }\n\n if(this.gradientRenderer) {\n this.gradientRenderer.cleanup();\n this.gradientRenderer = undefined;\n }\n }\n\n public destroy() {\n // const perf = performance.now();\n\n this.destroySharedMediaTab();\n this.topbar.destroy();\n this.bubbles.destroy();\n this.input.destroy();\n this.contextMenu && this.contextMenu.destroy();\n this.selection && this.selection.attachListeners(undefined, undefined);\n\n this.cleanupBackground();\n\n delete this.topbar;\n delete this.bubbles;\n delete this.input;\n delete this.selection;\n delete this.contextMenu;\n\n this.container.remove();\n\n // this.log.error('Chat destroy time:', performance.now() - perf);\n }\n\n public cleanup(helperToo = true) {\n this.input.cleanup(helperToo);\n this.topbar.cleanup();\n this.selection.cleanup();\n }\n\n public get isForumTopic() {\n return !!(this.isForum && this.threadId);\n }\n\n public async onChangePeer(options: ChatSetPeerOptions, m: ReturnType) {\n const {peerId, threadId} = this;\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n searchTab?.close();\n\n const [\n noForwards,\n isRestricted,\n isAnyGroup,\n _,\n isMegagroup,\n isBroadcast,\n isChannel,\n isBot,\n isForum\n ] = await m(Promise.all([\n this.managers.appPeersManager.noForwards(peerId),\n this.managers.appPeersManager.isPeerRestricted(peerId),\n this._isAnyGroup(peerId),\n this.setAutoDownloadMedia(),\n this.managers.appPeersManager.isMegagroup(peerId),\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.isChannel(peerId),\n this.managers.appPeersManager.isBot(peerId),\n this.managers.appPeersManager.isForum(peerId)\n ]));\n\n // ! WARNING: TEMPORARY, HAVE TO GET TOPIC\n if(isForum && threadId) {\n await m(this.managers.dialogsStorage.getForumTopicOrReload(peerId, threadId));\n }\n\n this.noForwards = noForwards;\n this.isRestricted = isRestricted;\n this.isAnyGroup = isAnyGroup;\n this.isMegagroup = isMegagroup;\n this.isBroadcast = isBroadcast;\n this.isChannel = isChannel;\n this.isBot = isBot;\n this.isForum = isForum;\n this.isAllMessagesForum = isForum && !threadId;\n\n if(threadId && !this.isForum) {\n options.type = 'discussion';\n }\n\n const type = options.type ?? 'chat';\n this.setType(type);\n\n this.messagesStorageKey = `${this.peerId}_${this.type === 'scheduled' ? 'scheduled' : 'history'}`;\n\n this.container.classList.toggle('no-forwards', this.noForwards);\n\n this.sharedMediaTab = appSidebarRight.createSharedMediaTab();\n this.sharedMediaTabs.push(this.sharedMediaTab);\n\n this.sharedMediaTab.setPeer(peerId, threadId);\n this.input.clearHelper(); // костыль\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n }\n\n public setPeer(options: ChatSetPeerOptions) {\n const {peerId, threadId} = options;\n if(!peerId) {\n this.inited = undefined;\n } else if(!this.inited) {\n if(this.init) {\n this.init(/* peerId */);\n this.init = null;\n }\n\n this.inited = true;\n }\n\n // const appMediaViewer = (window as any).appMediaViewer as AppMediaViewerBase;\n // if(appMediaViewer) {\n // appMediaViewer.close();\n // }\n\n const samePeer = this.appImManager.isSamePeer(this, options);\n if(!samePeer) {\n this.appImManager.dispatchEvent('peer_changing', this);\n this.peerId = peerId || NULL_PEER_ID;\n this.threadId = threadId;\n } else if(this.setPeerPromise) {\n return;\n }\n\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.bubbles.setPeer({samePeer: false, peerId});\n this.peerId = 0;\n this.appImManager.dispatchEvent('peer_changed', this);\n\n appSidebarRight.replaceSharedMediaTab();\n this.destroySharedMediaTab();\n this.sharedMediaTab = undefined;\n\n return;\n }\n\n this.peerChanged = samePeer;\n\n const bubblesSetPeerPromise = this.bubbles.setPeer({...options, samePeer});\n const setPeerPromise = this.setPeerPromise = bubblesSetPeerPromise.then((result) => {\n return result.promise;\n }).catch(noop).finally(() => {\n if(this.setPeerPromise === setPeerPromise) {\n this.setPeerPromise = null;\n }\n });\n\n return bubblesSetPeerPromise;\n }\n\n public destroySharedMediaTab(tab = this.sharedMediaTab) {\n if(!tab) {\n return;\n }\n\n indexOfAndSplice(this.sharedMediaTabs, tab);\n tab.destroy();\n }\n\n public async setAutoDownloadMedia() {\n this.autoDownload = await getAutoDownloadSettingsByPeerId(this.peerId);\n }\n\n public setMessageId(messageId?: number) {\n return this.setPeer({\n peerId: this.peerId,\n threadId: this.threadId,\n lastMsgId: messageId\n });\n }\n\n public async finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number, startParam?: string) {\n if(this.peerChanged) return;\n\n const peerId = this.peerId;\n this.peerChanged = true;\n this.wasAlreadyUsed = true;\n\n const middleware = this.bubbles.getMiddleware();\n\n this.cleanup(false);\n\n const sharedMediaTab = this.sharedMediaTab;\n\n const callbacksPromise = Promise.all([\n this.topbar.finishPeerChange(isTarget),\n this.bubbles.finishPeerChange(),\n this.input.finishPeerChange(startParam),\n sharedMediaTab.fillProfileElements()\n ]);\n\n const callbacks = await callbacksPromise;\n sharedMediaTab.loadSidebarMedia(true);\n\n if(!middleware()) {\n return;\n }\n\n callbacks.forEach((callback) => {\n callback?.();\n });\n\n appSidebarRight.replaceSharedMediaTab(sharedMediaTab);\n\n this.sharedMediaTabs.filter((tab) => tab !== sharedMediaTab).forEach((tab) => this.destroySharedMediaTab(tab));\n\n this.container.dataset.type = this.type;\n this.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n this.appImManager.dispatchEvent('peer_changed', this);\n }\n\n public getMessage(mid: number) {\n return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey, mid);\n }\n\n public async getMidsByMid(mid: number) {\n return this.managers.appMessagesManager.getMidsByMessage(await this.getMessage(mid));\n }\n\n public getHistoryStorage(ignoreThreadId?: boolean) {\n return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId, ignoreThreadId ? undefined : this.threadId)\n .then((historyStorageTransferable) => {\n return {\n ...historyStorageTransferable,\n history: SlicedArray.fromJSON(historyStorageTransferable.historySerialized)\n }\n });\n }\n\n public getDialogOrTopic() {\n return this.isForum && this.threadId ? this.managers.dialogsStorage.getForumTopic(this.peerId, this.threadId) : this.managers.dialogsStorage.getDialogOnly(this.peerId);\n }\n\n public getHistoryMaxId() {\n return this.getHistoryStorage().then((historyStorage) => historyStorage.maxId);\n }\n\n public async _isAnyGroup(peerId: PeerId) {\n return peerId === rootScope.myId || peerId === REPLIES_PEER_ID || (await this.managers.appPeersManager.isAnyGroup(peerId));\n }\n\n public initSearch(query?: string) {\n if(!this.peerId) return;\n\n if(mediaSizes.isMobile) {\n if(!this.search) {\n this.search = new ChatSearch(this.topbar, this, query);\n } else {\n this.search.setQuery(query);\n }\n } else {\n let tab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(!tab) {\n tab = appSidebarRight.createTab(AppPrivateSearchTab);\n }\n\n tab.open(this.peerId, this.threadId, this.bubbles.onDatePick, query);\n }\n }\n\n public canSend(action?: ChatRights) {\n return this.managers.appMessagesManager.canSendToPeer(this.peerId, this.threadId, action);\n }\n\n public isStartButtonNeeded() {\n return Promise.all([\n this.managers.appPeersManager.isBot(this.peerId),\n this.managers.appMessagesManager.getDialogOnly(this.peerId),\n this.getHistoryStorage(true)\n ]).then(([isBot, dialog, historyStorage]) => {\n return isBot && !dialog && !historyStorage.history.length;\n });\n }\n\n public getMessageSendingParams(): MessageSendingParams {\n return {\n threadId: this.threadId,\n replyToMsgId: this.input.replyToMsgId,\n scheduleDate: this.input.scheduleDate,\n silent: this.input.sendSilent,\n sendAsPeerId: this.input.sendAsPeerId\n };\n }\n\n public isOurMessage(message: Message.message | Message.messageService) {\n return message.fromId === rootScope.myId || (!!message.pFlags.out && this.isMegagroup);\n }\n\n public isOutMessage(message: Message.message | Message.messageService) {\n const fwdFrom = (message as Message.message).fwd_from;\n const isOut = this.isOurMessage(message) && (!fwdFrom || this.peerId !== rootScope.myId);\n return !!isOut;\n }\n\n public isAvatarNeeded(message: Message.message | Message.messageService) {\n return this.isAnyGroup && !this.isOutMessage(message);\n }\n\n public isPinnedMessagesNeeded() {\n return this.type === 'chat' || this.isForum;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {State} from '../config/state';\nimport rootScope from '../lib/rootScope';\n\nexport type ChatAutoDownloadSettings = {\n photo: number,\n video: number,\n file: number\n};\n\nexport default async function getAutoDownloadSettingsByPeerId(peerId: PeerId): Promise {\n let type: keyof State['settings']['autoDownload'];\n\n let photoSizeMax = 0, videoSizeMax = 0, fileSizeMax = 0;\n const settings = rootScope.settings;\n const appPeersManager = rootScope.managers.appPeersManager;\n if(!settings.autoDownloadNew.pFlags.disabled && peerId) {\n if(peerId.isUser()) {\n if(await appPeersManager.isContact(peerId)) {\n type = 'contacts';\n } else {\n type = 'private';\n }\n } else if(await appPeersManager.isBroadcast(peerId)) {\n type = 'channels';\n } else {\n type = 'groups';\n }\n\n if(settings.autoDownload.photo[type]) photoSizeMax = settings.autoDownloadNew.photo_size_max;\n if(settings.autoDownload.video[type]) videoSizeMax = settings.autoDownloadNew.video_size_max;\n if(settings.autoDownload.file[type]) fileSizeMax = settings.autoDownloadNew.file_size_max;\n }\n\n return {\n photo: photoSizeMax,\n video: videoSizeMax,\n file: fileSizeMax\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppImManager} from '../../lib/appManagers/appImManager';\nimport ButtonIcon from '../buttonIcon';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_APPLE, IS_MOBILE} from '../../environment/userAgent';\nimport appNavigationController from '../appNavigationController';\nimport {_i18n} from '../../lib/langPack';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport {MarkdownType} from '../../helpers/dom/getRichElementValue';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport clamp from '../../helpers/number/clamp';\nimport matchUrl from '../../lib/richTextProcessor/matchUrl';\nimport matchUrlProtocol from '../../lib/richTextProcessor/matchUrlProtocol';\nimport hasMarkupInSelection from '../../helpers/dom/hasMarkupInSelection';\n\nexport default class MarkupTooltip {\n public container: HTMLElement;\n private wrapper: HTMLElement;\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\n private linkBackButton: HTMLElement;\n private linkApplyButton: HTMLButtonElement;\n private hideTimeout: number;\n private addedListener = false;\n private waitingForMouseUp = false;\n private linkInput: HTMLInputElement;\n private savedRange: Range;\n private mouseUpCounter: number = 0;\n // private log: ReturnType;\n\n constructor(private appImManager: AppImManager) {\n // this.log = logger('MARKUP');\n }\n\n private init() {\n this.container = document.createElement('div');\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('markup-tooltip-wrapper');\n\n const tools1 = document.createElement('div');\n const tools2 = document.createElement('div');\n tools1.classList.add('markup-tooltip-tools');\n tools2.classList.add('markup-tooltip-tools');\n\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'spoiler', 'link'] as (keyof MarkupTooltip['buttons'])[];\n arr.forEach((c) => {\n const button = ButtonIcon(c, {noRipple: true});\n tools1.append(this.buttons[c] = button);\n\n if(c !== 'link') {\n button.addEventListener('mousedown', (e) => {\n cancelEvent(e);\n this.appImManager.chat.input.applyMarkdown(c);\n this.cancelClosening();\n\n /* this.mouseUpCounter = 0;\n this.setMouseUpEvent(); */\n // this.hide();\n });\n } else {\n attachClickEvent(button, (e) => {\n cancelEvent(e);\n this.showLinkEditor();\n this.cancelClosening();\n });\n }\n });\n\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\n this.linkInput = document.createElement('input');\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\n this.linkInput.classList.add('input-clear');\n this.linkInput.addEventListener('keydown', (e) => {\n const valid = !this.linkInput.value.length || !!matchUrl(this.linkInput.value);// /^(http)|(https):\\/\\//i.test(this.linkInput.value);\n\n if(e.key === 'Enter') {\n if(!valid) {\n if(this.linkInput.classList.contains('error')) {\n this.linkInput.classList.remove('error');\n void this.linkInput.offsetLeft; // reflow\n }\n\n this.linkInput.classList.add('error');\n } else {\n this.applyLink(e);\n }\n }\n });\n\n this.linkInput.addEventListener('input', (e) => {\n const valid = this.isLinkValid();\n\n this.linkInput.classList.toggle('is-valid', valid);\n this.linkInput.classList.remove('error');\n });\n\n this.linkBackButton.addEventListener('mousedown', (e) => {\n // this.log('linkBackButton click');\n cancelEvent(e);\n this.container.classList.remove('is-link');\n // input.value = '';\n this.resetSelection();\n this.setTooltipPosition();\n this.cancelClosening();\n });\n\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\n this.linkApplyButton.addEventListener('mousedown', (e) => {\n // this.log('linkApplyButton click');\n this.applyLink(e);\n });\n\n const applyDiv = document.createElement('div');\n applyDiv.classList.add('markup-tooltip-link-apply-container');\n\n const delimiter1 = document.createElement('span');\n const delimiter2 = document.createElement('span');\n const delimiter3 = document.createElement('span');\n delimiter1.classList.add('markup-tooltip-delimiter');\n delimiter2.classList.add('markup-tooltip-delimiter');\n delimiter3.classList.add('markup-tooltip-delimiter');\n tools1.insertBefore(delimiter1, this.buttons.link);\n applyDiv.append(delimiter3, this.linkApplyButton);\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\n // tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\n\n this.wrapper.append(tools1, tools2);\n this.container.append(this.wrapper);\n document.body.append(this.container);\n\n window.addEventListener('resize', () => {\n this.hide();\n });\n }\n\n public showLinkEditor() {\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\n this.show();\n }\n\n const button = this.buttons.link;\n this.container.classList.add('is-link');\n\n const selection = document.getSelection();\n this.savedRange = selection.getRangeAt(0);\n\n if(button.classList.contains('active')) {\n const startContainer = this.savedRange.startContainer;\n const anchor = startContainer.parentElement as HTMLAnchorElement;\n this.linkInput.value = anchor.href;\n } else {\n this.linkInput.value = '';\n }\n\n this.setTooltipPosition(true);\n\n setTimeout(() => {\n this.linkInput.focus(); // !!! instant focus will break animation\n }, 200);\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\n }\n\n private applyLink(e: Event) {\n cancelEvent(e);\n this.resetSelection();\n let url = this.linkInput.value;\n if(url && !matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n this.appImManager.chat.input.applyMarkdown('link', url);\n setTimeout(() => {\n this.hide();\n }, 0);\n }\n\n private isLinkValid() {\n return !this.linkInput.value.length || !!matchUrl(this.linkInput.value);\n }\n\n private resetSelection(range: Range = this.savedRange) {\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n this.appImManager.chat.input.messageInput.focus();\n }\n\n public hide() {\n // return;\n\n if(this.init) return;\n\n this.container.classList.remove('is-visible');\n // document.removeEventListener('mouseup', this.onMouseUp);\n document.removeEventListener('mouseup', this.onMouseUpSingle);\n this.waitingForMouseUp = false;\n\n appNavigationController.removeByType('markup');\n\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\n this.hideTimeout = window.setTimeout(() => {\n this.hideTimeout = undefined;\n this.container.classList.add('hide');\n this.container.classList.remove('is-link');\n }, 200);\n }\n\n public getActiveMarkupButton() {\n const currentMarkups: Set = new Set();\n\n // const nodes = getSelectedNodes();\n // const parents = [...new Set(nodes.map((node) => node.parentNode))];\n // // if(parents.length > 1 && parents) return [];\n\n // (parents as HTMLElement[]).forEach((node) => {\n // for(const type in markdownTags) {\n // const tag = markdownTags[type as MarkdownType];\n // const closest = node.closest(tag.match + ', [contenteditable=\"true\"]');\n // if(closest !== this.appImManager.chat.input.messageInput) {\n // currentMarkups.add(this.buttons[type as MarkdownType]);\n // }\n // }\n // });\n\n const types = Object.keys(this.buttons) as MarkdownType[];\n const markup = hasMarkupInSelection(types);\n types.forEach((type) => {\n if(markup[type]) {\n currentMarkups.add(this.buttons[type as MarkdownType]);\n }\n });\n\n return [...currentMarkups];\n }\n\n public setActiveMarkupButton() {\n const activeButtons = this.getActiveMarkupButton();\n\n for(const i in this.buttons) {\n // @ts-ignore\n const button = this.buttons[i];\n button.classList.toggle('active', activeButtons.includes(button));\n }\n }\n\n private setTooltipPosition(isLinkToggle = false) {\n const selection = document.getSelection();\n const range = selection.getRangeAt(0);\n\n const bodyRect = document.body.getBoundingClientRect();\n const selectionRect = range.getBoundingClientRect();\n const inputRect = this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();\n\n this.container.style.maxWidth = inputRect.width + 'px';\n\n const visibleRect = getVisibleRect(undefined, this.appImManager.chat.input.messageInput, false, selectionRect);\n\n const selectionTop = visibleRect.rect.top/* selectionRect.top */ + (bodyRect.top * -1);\n\n const currentTools = this.container.classList.contains('is-link') ? this.wrapper.lastElementChild : this.wrapper.firstElementChild;\n\n const sizesRect = currentTools.getBoundingClientRect();\n const top = selectionTop - sizesRect.height - 8;\n\n const minX = inputRect.left;\n const maxX = (inputRect.left + inputRect.width) - Math.min(inputRect.width, sizesRect.width);\n let left: number;\n if(isLinkToggle) {\n const containerRect = this.container.getBoundingClientRect();\n left = clamp(containerRect.left, minX, maxX);\n } else {\n const x = selectionRect.left + (selectionRect.width - sizesRect.width) / 2;\n left = clamp(x, minX, maxX);\n }\n\n /* const isClamped = x !== minX && x !== maxX && (left === minX || left === maxX || this.container.getBoundingClientRect().left >= maxX);\n\n if(isLinkToggle && this.container.classList.contains('is-link') && !isClamped) return; */\n\n this.container.style.transform = `translate3d(${left}px, ${top}px, 0)`;\n }\n\n public show() {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n if(isSelectionEmpty()) {\n this.hide();\n return;\n }\n\n if(this.hideTimeout !== undefined) {\n clearTimeout(this.hideTimeout);\n }\n\n if(this.container.classList.contains('is-visible')) {\n return;\n }\n\n this.setActiveMarkupButton();\n\n this.container.classList.remove('is-link');\n const isFirstShow = this.container.classList.contains('hide');\n if(isFirstShow) {\n this.container.classList.remove('hide');\n this.container.classList.add('no-transition');\n }\n\n this.setTooltipPosition();\n\n if(isFirstShow) {\n void this.container.offsetLeft; // reflow\n this.container.classList.remove('no-transition');\n }\n\n this.container.classList.add('is-visible');\n\n if(!IS_MOBILE) {\n appNavigationController.pushItem({\n type: 'markup',\n onPop: () => {\n this.hide();\n }\n });\n }\n\n // this.log('selection', selectionRect, activeButton);\n }\n\n /* private onMouseUp = (e: Event) => {\n this.log('onMouseUp');\n if(findUpClassName(e.target, 'markup-tooltip')) return;\n\n this.hide();\n //document.removeEventListener('mouseup', this.onMouseUp);\n }; */\n\n private onMouseUpSingle = (e?: Event) => {\n // this.log('onMouseUpSingle');\n this.waitingForMouseUp = false;\n\n if(IS_TOUCH_SUPPORTED) {\n e && cancelEvent(e);\n if(this.mouseUpCounter++ === 0) {\n this.resetSelection(this.savedRange);\n } else {\n this.hide();\n return;\n }\n }\n\n this.show();\n\n /* !isTouchSupported && document.addEventListener('mouseup', this.onMouseUp); */\n };\n\n public setMouseUpEvent() {\n if(this.waitingForMouseUp) return;\n this.waitingForMouseUp = true;\n\n // this.log('setMouseUpEvent');\n\n document.addEventListener('mouseup', this.onMouseUpSingle, {once: true});\n }\n\n public cancelClosening() {\n if(IS_TOUCH_SUPPORTED && !IS_APPLE) {\n document.removeEventListener('mouseup', this.onMouseUpSingle);\n document.addEventListener('mouseup', (e) => {\n cancelEvent(e);\n this.mouseUpCounter = 1;\n this.waitingForMouseUp = false;\n this.setMouseUpEvent();\n }, {once: true});\n }\n }\n\n public handleSelection() {\n if(this.addedListener) return;\n this.addedListener = true;\n document.addEventListener('selectionchange', (e) => {\n // this.log('selectionchange');\n\n if(document.activeElement === this.linkInput) {\n return;\n }\n\n const messageInput = this.appImManager.chat.input.messageInput;\n if(document.activeElement !== messageInput) {\n this.hide();\n return;\n }\n\n const selection = document.getSelection();\n if(isSelectionEmpty(selection)) {\n this.hide();\n return;\n }\n\n if(IS_TOUCH_SUPPORTED) {\n if(IS_APPLE) {\n this.show();\n this.setTooltipPosition(); // * because can skip this in .show();\n } else {\n if(this.mouseUpCounter === 2) {\n this.mouseUpCounter = 0;\n return;\n }\n\n this.savedRange = selection.getRangeAt(0);\n this.setMouseUpEvent();\n /* document.addEventListener('touchend', (e) => {\n cancelEvent(e);\n this.resetSelection(range);\n this.show();\n }, {once: true, passive: false}); */\n }\n } else if(this.container && this.container.classList.contains('is-visible')) {\n this.setTooltipPosition();\n } else if(messageInput.matches(':active')) {\n this.setMouseUpEvent();\n } else {\n this.show();\n }\n });\n\n document.addEventListener('beforeinput', (e) => {\n if(e.inputType === 'historyRedo' || e.inputType === 'historyUndo') {\n e.target.addEventListener('input', () => this.setActiveMarkupButton(), {once: true});\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport generatePathData from '../../helpers/generatePathData';\nimport {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\n\nexport default class ChatDragAndDrop {\n container: HTMLDivElement;\n svg: SVGSVGElement;\n outlineWrapper: HTMLDivElement;\n path: SVGPathElement;\n\n constructor(appendTo: HTMLElement, private options: {\n icon?: string,\n header: LangPackKey,\n headerArgs?: FormatterArguments,\n subtitle?: LangPackKey,\n onDrop: (e: DragEvent) => void\n }) {\n this.container = document.createElement('div');\n this.container.classList.add('drop', 'z-depth-1');\n\n this.outlineWrapper = document.createElement('div');\n this.outlineWrapper.classList.add('drop-outline-wrapper');\n\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.classList.add('drop-outline');\n\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n this.path.classList.add('drop-outline-path');\n\n let dropIcon: HTMLElement;\n if(options.icon) {\n dropIcon = document.createElement('div');\n dropIcon.classList.add('drop-icon', 'tgico-' + options.icon);\n }\n\n const dropHeader = document.createElement('div');\n dropHeader.classList.add('drop-header');\n dropHeader.append(i18n(options.header, options.headerArgs));\n\n let dropSubtitle: HTMLElement;\n if(options.subtitle) {\n dropSubtitle = document.createElement('div');\n dropSubtitle.classList.add('drop-subtitle');\n dropSubtitle.append(i18n(options.subtitle));\n }\n\n this.svg.append(this.path);\n this.outlineWrapper.append(this.svg);\n\n this.container.append(...[this.outlineWrapper, dropIcon, dropHeader, dropSubtitle].filter(Boolean));\n appendTo.append(this.container);\n\n this.container.addEventListener('dragover', this.onDragOver);\n this.container.addEventListener('dragleave', this.onDragLeave);\n this.container.addEventListener('drop', this.onDrop);\n }\n\n onDragOver = (e: DragEvent) => {\n this.container.classList.add('is-dragover');\n // SetTransition(this.container, 'is-dragover', true, 500);\n };\n\n onDragLeave = (e: DragEvent) => {\n this.container.classList.remove('is-dragover');\n // SetTransition(this.container, 'is-dragover', false, 500);\n };\n\n onDrop = (e: DragEvent) => {\n this.options.onDrop(e);\n };\n\n destroy() {\n delete this.options;\n this.container.remove();\n this.container.removeEventListener('dragover', this.onDragOver);\n this.container.removeEventListener('dragleave', this.onDragLeave);\n this.container.removeEventListener('drop', this.onDrop);\n }\n\n setPath() {\n const rect = this.outlineWrapper.getBoundingClientRect();\n this.svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\n this.svg.setAttributeNS(null, 'viewBox', `0 0 ${rect.width} ${rect.height}`);\n this.svg.setAttributeNS(null, 'width', `${rect.width}`);\n this.svg.setAttributeNS(null, 'height', `${rect.height}`);\n\n const radius = 10;\n // const strokeWidth = 2;\n const sizeX = rect.width - radius;\n const sizeY = rect.height - radius;\n const pos = radius / 2;\n const d = generatePathData(pos, pos, sizeX, sizeY, radius, radius, radius, radius);\n this.path.setAttributeNS(null, 'd', d);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {doubleRaf} from '../schedulers';\n\nexport default function disableTransition(elements: HTMLElement[]) {\n elements.forEach((el) => el.classList.add('no-transition'));\n\n doubleRaf().then(() => {\n elements.forEach((el) => el.classList.remove('no-transition'));\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport const MAX_SPEED = 8.2;\nexport const MIN_SPEED = 0.8;\n\n// import { MIN_SPEED, MAX_SPEED } from './BlobDrawable';\n\ntype Radius = number[];\n\nexport default class LineBlobDrawable {\n public maxRadius: number;\n public minRadius: number;\n private N: number;\n private radius: Radius;\n private radiusNext: Radius;\n private progress: number[];\n private speed: number[];\n\n constructor(n: number) {\n this.maxRadius = 10;\n this.minRadius = 0;\n\n this.N = n;\n this.radius = new Array(n + 1);\n\n this.radiusNext = new Array(n + 1);\n this.progress = new Array(n + 1);\n this.speed = new Array(n + 1);\n\n for(let i = 0; i <= n; i++) {\n this.generateBlob(this.radius, i);\n this.generateBlob(this.radiusNext, i);\n this.progress[i] = 0;\n }\n }\n\n private generateBlob(radius: Radius, i: number) {\n const {maxRadius, minRadius, speed} = this;\n\n const radDif = maxRadius - minRadius;\n radius[i] = minRadius + Math.random() * radDif;\n speed[i] = 0.017 + 0.003 * Math.random();\n }\n\n private generateNextBlob() {\n const {radius, radiusNext, progress, N} = this;\n for(let i = 0; i < N; i++) {\n this.generateBlob(radius, i);\n this.generateBlob(radiusNext, i);\n progress[i] = 0.0;\n }\n }\n\n public update(amplitude: number, speedScale: number) {\n const {N, progress, speed, radius, radiusNext} = this;\n for(let i = 0; i <= N; i++) {\n progress[i] += (speed[i] * MIN_SPEED) + amplitude * speed[i] * MAX_SPEED * speedScale;\n if(progress[i] >= 1.0) {\n progress[i] = 0.0;\n radius[i] = radiusNext[i];\n this.generateBlob(radiusNext, i);\n }\n }\n }\n\n public draw(left: number, top: number, right: number, bottom: number, canvas: HTMLCanvasElement, paint: (ctx: CanvasRenderingContext2D) => void, pinnedTop: number, progressToPinned: number) {\n if(canvas.getContext) {\n const ctx = canvas.getContext('2d');\n // ctx.globalAlpha = 0.5;\n // ctx.lineWidth = 1;\n\n ctx.beginPath();\n ctx.moveTo(right, bottom);\n ctx.lineTo(left, bottom);\n\n const {radius, radiusNext, N} = this;\n for(let i = 0; i <= N; i++) {\n if(i === 0) {\n const progress = this.progress[i];\n const r1 = radius[i] * (1.0 - progress) + radiusNext[i] * progress;\n const y = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.lineTo(left, y);\n } else {\n const progress = this.progress[i - 1];\n const r1 = radius[i - 1] * (1.0 - progress) + radiusNext[i - 1] * progress;\n const progressNext = this.progress[i];\n const r2 = radius[i] * (1.0 - progressNext) + radiusNext[i] * progressNext;\n const x1 = (right - left) / N * (i - 1);\n const x2 = (right - left) / N * i;\n const cx = x1 + (x2 - x1) / 2;\n\n const y1 = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n const y2 = (top - r2) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.bezierCurveTo(cx, y1, cx, y2, x2, y2);\n if(i === N) {\n ctx.lineTo(right, bottom);\n }\n }\n }\n\n // ctx.scale(1.0, 1.0);\n paint(ctx);\n ctx.fill();\n ctx.closePath();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport GROUP_CALL_STATE from '../lib/calls/groupCallState';\nimport LineBlobDrawable from './lineBlobDrawable';\n\nexport class WeavingState {\n public shader: (ctx: CanvasRenderingContext2D, left: number, top: number, right: number, bottom: number) => void;\n\n constructor(public stateId: GROUP_CALL_STATE) {\n this.createGradient(stateId);\n }\n\n public createGradient(stateId: GROUP_CALL_STATE) {\n this.shader = (ctx, left, top, right, bottom) => {\n ctx.fillStyle = WeavingState.getGradientFromType(ctx, stateId, left, top, right, bottom);\n };\n }\n\n // Android colors\n static getGradientFromType(ctx: CanvasRenderingContext2D, type: GROUP_CALL_STATE, x0: number, y0: number, x1: number, y1: number) {\n const gradient = ctx.createLinearGradient(x0, y0, x1, y1);\n if(type === GROUP_CALL_STATE.MUTED_BY_ADMIN) {\n gradient.addColorStop(0, '#F05459');\n gradient.addColorStop(.4, '#766EE9');\n gradient.addColorStop(1, '#57A4FE');\n } else if(type === GROUP_CALL_STATE.UNMUTED) {\n gradient.addColorStop(0, '#52CE5D');\n gradient.addColorStop(1, '#00B1C0');\n } else if(type === GROUP_CALL_STATE.MUTED) {\n gradient.addColorStop(0, '#0976E3');\n gradient.addColorStop(1, '#2BCEFF');\n } else if(type === GROUP_CALL_STATE.CONNECTING) {\n gradient.addColorStop(0, '#8599aa');\n gradient.addColorStop(1, '#8599aa');\n }\n\n return gradient;\n }\n\n update(height: number, width: number, dt: number, amplitude: number) {\n // TODO: move gradient here\n }\n}\n\nexport default class TopbarWeave {\n private focused: boolean;\n private resizing: boolean;\n private lastUpdateTime: number;\n private amplitude: number;\n private amplitude2: number;\n\n private states: Map;\n private previousState: WeavingState;\n private currentState: WeavingState;\n private progressToState: number;\n\n private scale: number;\n private left: number;\n private top: number;\n private right: number;\n private bottom: number;\n\n private mounted: boolean;\n private media: MediaQueryList;\n\n private container: HTMLDivElement;\n private canvas: HTMLCanvasElement;\n\n private resizeHandler: number;\n private raf: number;\n\n private lbd: LineBlobDrawable;\n private lbd1: LineBlobDrawable;\n private lbd2: LineBlobDrawable;\n\n private animateToAmplitude: number;\n private animateAmplitudeDiff: number;\n private animateAmplitudeDiff2: number;\n\n constructor() {\n this.focused = true;\n this.resizing = false;\n this.lastUpdateTime = Date.now();\n this.amplitude = 0.0;\n this.amplitude2 = 0.0;\n\n this.states = new Map([\n [GROUP_CALL_STATE.UNMUTED, new WeavingState(GROUP_CALL_STATE.UNMUTED)],\n [GROUP_CALL_STATE.MUTED, new WeavingState(GROUP_CALL_STATE.MUTED)],\n [GROUP_CALL_STATE.MUTED_BY_ADMIN, new WeavingState(GROUP_CALL_STATE.MUTED_BY_ADMIN)],\n [GROUP_CALL_STATE.CONNECTING, new WeavingState(GROUP_CALL_STATE.CONNECTING)]\n ]);\n this.previousState = null;\n this.currentState = this.states.get(GROUP_CALL_STATE.CONNECTING);\n this.progressToState = 1.0;\n }\n\n public componentDidMount() {\n if(this.mounted) {\n return;\n }\n\n this.mounted = true;\n // window.addEventListener('blur', this.handleBlur);\n // window.addEventListener('focus', this.handleFocus);\n window.addEventListener('resize', this.handleResize);\n this.media = window.matchMedia('screen and (min-resolution: 2dppx)');\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n\n this.setSize();\n this.forceUpdate();\n\n this.lbd = new LineBlobDrawable(3);\n this.lbd1 = new LineBlobDrawable(7);\n this.lbd2 = new LineBlobDrawable(8);\n this.setAmplitude(this.amplitude);\n\n this.draw();\n }\n\n public componentWillUnmount() {\n this.mounted = false;\n // window.removeEventListener('blur', this.handleBlur);\n // window.removeEventListener('focus', this.handleFocus);\n window.removeEventListener('resize', this.handleResize);\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n\n const {canvas} = this;\n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n private setSize() {\n this.scale = window.devicePixelRatio;\n this.top = 20 * this.scale;\n this.right = (this.mounted ? this.container.offsetWidth : 1261) * this.scale;\n this.bottom = (this.mounted ? this.container.offsetHeight : 68) * this.scale;\n this.left = 0 * this.scale;\n this.setCanvasSize();\n }\n\n private setCanvasSize() {\n this.canvas.width = this.right;\n this.canvas.height = this.bottom;\n }\n\n private handleDevicePixelRatioChanged = (e: Event) => {\n this.setSize();\n this.forceUpdate();\n }\n\n private handleResize = () => {\n if(this.resizeHandler) {\n clearTimeout(this.resizeHandler);\n this.resizeHandler = null;\n }\n\n this.resizing = true;\n this.resizeCanvas();\n this.resizeHandler = window.setTimeout(() => {\n this.resizing = false;\n this.invokeDraw();\n }, 250);\n }\n\n private resizeCanvas() {\n this.scale = window.devicePixelRatio;\n this.right = this.container.offsetWidth * this.scale;\n\n this.forceUpdate();\n this.invokeDraw();\n }\n\n public handleFocus = () => {\n this.focused = true;\n this.invokeDraw();\n }\n\n public handleBlur = () => {\n this.focused = false;\n }\n\n private invokeDraw = () => {\n if(this.raf) return;\n\n this.draw();\n }\n\n private draw = (force = false) => {\n this.raf = null;\n if(!this.mounted) {\n return;\n }\n const {lbd, lbd1, lbd2, scale, left, top, right, bottom, currentState, previousState, focused, resizing, canvas} = this;\n if(!focused && !resizing && this.progressToState >= 1.0) {\n return;\n }\n\n // console.log('[top] draw', [focused, resizing, this.mounted]);\n\n const newTime = Date.now();\n let dt = (newTime - this.lastUpdateTime);\n if(dt > 20) {\n dt = 17;\n }\n\n // console.log('draw start', this.amplitude, this.animateToAmplitude);\n if(this.animateToAmplitude !== this.amplitude) {\n this.amplitude += this.animateAmplitudeDiff * dt;\n if(this.animateAmplitudeDiff > 0) {\n if(this.amplitude > this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude < this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n }\n }\n\n if(this.animateToAmplitude !== this.amplitude2) {\n this.amplitude2 += this.animateAmplitudeDiff2 * dt;\n if(this.animateAmplitudeDiff2 > 0) {\n if(this.amplitude2 > this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude2 < this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n }\n }\n\n if(previousState) {\n this.progressToState += dt / 250;\n if(this.progressToState > 1) {\n this.progressToState = 1;\n this.previousState = null;\n }\n }\n\n const {amplitude, amplitude2, progressToState} = this;\n\n const top1 = 6 * amplitude2 * scale;\n const top2 = 6 * amplitude2 * scale;\n\n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n lbd.minRadius = 0;\n lbd.maxRadius = (2 + 2 * amplitude) * scale;\n lbd1.minRadius = 0;\n lbd1.maxRadius = (3 + 9 * amplitude) * scale;\n lbd2.minRadius = 0;\n lbd2.maxRadius = (3 + 9 * amplitude) * scale;\n\n lbd.update(amplitude, 0.3);\n lbd1.update(amplitude, 0.7);\n lbd2.update(amplitude, 0.7);\n\n for(let i = 0; i < 2; i++) {\n if(i === 0 && !previousState) {\n continue;\n }\n\n let alpha = 1;\n let state: WeavingState = null;\n if(i === 0) {\n alpha = 1 - progressToState;\n state = previousState;\n // previousState.setToPaint(paint);\n } else {\n alpha = previousState ? progressToState : 1;\n currentState.update(bottom - top, right - left, dt, amplitude);\n state = currentState;\n // currentState.setToPaint(paint);\n }\n\n const paint1 = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = 0.3 * alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n const paint = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = i === 0 ? 1 : alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n\n lbd1.draw(left, top - top1, right, bottom, canvas, paint1, top, 1.0);\n lbd2.draw(left, top - top2, right, bottom, canvas, paint1, top, 1.0);\n lbd.draw(left, top, right, bottom, canvas, paint, top, 1.0);\n }\n\n if(!force) {\n this.raf = requestAnimationFrame(() => this.draw());\n }\n };\n\n public setCurrentState = (stateId: GROUP_CALL_STATE, animated: boolean) => {\n const {currentState, states} = this;\n\n if(currentState?.stateId === stateId) {\n return;\n }\n\n this.previousState = animated ? currentState : null;\n this.currentState = states.get(stateId);\n this.progressToState = this.previousState ? 0.0 : 1.0;\n };\n\n public setAmplitude(value: number) {\n const {amplitude} = this;\n this.animateToAmplitude = value;\n this.animateAmplitudeDiff = (value - amplitude) / 250;\n this.animateAmplitudeDiff2 = (value - amplitude) / 120;\n }\n\n private forceUpdate() {\n this.setCanvasSize();\n }\n\n public render(className: string) {\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add(className + '-canvas');\n\n container.append(canvas);\n\n return container;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from '../../helpers/noop';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport rootScope from '../rootScope';\nimport lottieLoader, {LottieAssetName} from './lottieLoader';\nimport type RLottiePlayer from './rlottiePlayer';\nimport {RLottieColor} from './rlottiePlayer';\n\nexport type RLottieIconOptions = {\n width: number,\n height: number,\n container?: HTMLElement,\n skipAnimation?: boolean\n};\n\nexport type RLottieIconItemPartOptions = {\n startFrame: number,\n endFrame: number,\n name?: string\n};\n\nexport type RLottieIconItemOptions = {\n name: LottieAssetName,\n parts: RLottieIconItemPartOptions[],\n initFrame?: number,\n player?: RLottiePlayer,\n autoplay?: boolean,\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n};\n\nexport class RLottieIconItemPart implements RLottieIconItemPartOptions {\n public startFrame: number;\n public endFrame: number;\n public name?: string;\n\n constructor(public item: RLottieIconItem, options: RLottieIconItemPartOptions) {\n safeAssign(this, options);\n }\n\n public play(callback?: () => void) {\n return this.item.playPart(this, callback);\n }\n}\n\n// export type RLottieIconItemPart = RLottieIconItemPartOptions;\n\nexport class RLottieIconItem implements RLottieIconItemOptions {\n public name: LottieAssetName;\n public parts: RLottieIconItemPart[];\n public player: RLottiePlayer;\n public initFrame: number;\n public autoplay: boolean;\n public color: RLottieColor;\n public inverseColor: RLottieColor;\n public loadPromise: Promise;\n public onLoadForPart: () => void;\n public onLoadForColor: () => void;\n\n constructor(public icon: RLottieIcon, options: RLottieIconItemOptions) {\n this.autoplay = false;\n\n safeAssign(this, options);\n\n this.parts = this.parts.map((options) => this.createPart(options));\n }\n\n public load() {\n let loadPromise = this.loadPromise;\n if(loadPromise) {\n return loadPromise;\n }\n\n const {container, canvas, width, height} = this.icon;\n loadPromise = lottieLoader.loadAnimationAsAsset({\n container,\n canvas,\n width,\n height,\n group: 'none',\n loop: false,\n autoplay: this.autoplay ?? false,\n initFrame: this.initFrame,\n skipFirstFrameRendering: this.initFrame === undefined,\n color: this.color,\n inverseColor: this.inverseColor\n }, this.name).then((player) => {\n return lottieLoader.waitForFirstFrame(player);\n }).then((player) => {\n this.player = player;\n\n if(this.onLoadForColor) {\n this.onLoadForColor();\n this.onLoadForColor = undefined;\n }\n\n if(this.onLoadForPart) {\n this.onLoadForPart();\n this.onLoadForPart = undefined;\n }\n });\n\n this.loadPromise = loadPromise;\n this.icon.loadPromises.set(this.name, loadPromise);\n return loadPromise;\n }\n\n public createPart(options: RLottieIconItemPartOptions) {\n return new RLottieIconItemPart(this, options);\n }\n\n public getPart(index: string | number | RLottieIconItemPart) {\n if(index instanceof RLottieIconItemPart) return index;\n else if(typeof(index) === 'string') return this.parts.find((part) => part.name === index);\n else return this.parts[index];\n }\n\n public playPart(part: RLottieIconItemPart, callback?: () => void) {\n return this.icon.playPart(this, part, callback);\n }\n}\n\nexport default class RLottieIcon {\n public container: HTMLElement;\n public canvas: HTMLCanvasElement;\n public width: number;\n public height: number;\n\n protected items: Map;\n public loadPromises: Map>;\n\n protected skipAnimation: boolean;\n\n constructor(options: RLottieIconOptions) {\n safeAssign(this, options);\n\n if(!this.container) this.container = document.createElement('div');\n this.container.classList.add('rlottie-icon');\n\n const {width, height} = this;\n this.container.style.width = width + 'px';\n this.container.style.height = height + 'px';\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = width;\n canvas.height = height;\n\n this.items = new Map();\n this.loadPromises = new Map();\n }\n\n public get loadPromise() {\n return Promise.all([...this.loadPromises.values()]).then(noop);\n }\n\n public getItem(name?: LottieAssetName): RLottieIconItem {\n return !name && this.items.size === 1 ? this.items.values().next().value : this.items.get(name);\n }\n\n public add(options: Omit) {\n const item = new RLottieIconItem(this, options);\n this.items.set(options.name, item);\n\n return item;\n }\n\n public playPart(item: RLottieIconItem, index: Parameters[0], callback?: () => void) {\n if(!item.player) {\n item.onLoadForPart = () => {\n this.playPart(item, index, callback);\n };\n\n return;\n }\n\n const part = item.getPart(index);\n item.player.playPart({\n from: rootScope.settings.animationsEnabled && !this.skipAnimation ? part.startFrame : part.endFrame,\n to: part.endFrame,\n callback\n });\n }\n\n /* public playToPart(item: RLottieIconItem, index: Parameters[0], toEnd: boolean) {\n if(!item.player) return;\n const part = item.getPart(index);\n const toFrame = toEnd ? part.endFrame : part.startFrame;\n item.player.playToFrame({\n frame: toFrame\n });\n } */\n\n public static generateEqualParts(length: number, frameCount: number): RLottieIconItemPartOptions[] {\n return new Array(length).fill(0).map((_, idx) => {\n const startFrame = idx * frameCount;\n return {startFrame, endFrame: startFrame + frameCount - 1};\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from '../helpers/noop';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {LottieAssetName} from '../lib/rlottie/lottieLoader';\nimport RLottieIcon, {RLottieIconItemPartOptions, RLottieIconItemPart} from '../lib/rlottie/rlottieIcon';\nimport {RLottieColor} from '../lib/rlottie/rlottiePlayer';\n\nexport type SuperRLottieIconAddItemOptions = {name: LottieAssetName, parts: RLottieIconItemPartOptions};\nexport type SuperRLottieIconGetInfoResult = RLottieIconItemPart;\nexport class SuperRLottieIcon extends RLottieIcon {\n protected getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult;\n protected getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor;\n\n protected partState: Options['PartState'];\n protected colorState: Options['ColorState'];\n protected loaded: boolean;\n\n constructor(options: {\n width: number,\n height: number,\n skipAnimation?: boolean,\n getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult,\n getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor,\n }) {\n super({\n width: options.width,\n height: options.height\n });\n\n safeAssign(this, options);\n\n // hook the first call\n /* const originalFunction = this.setState.bind(this);\n this.setState = (partState, colorState) => {\n this.setState = originalFunction;\n this.load(partState, colorState);\n return originalFunction(partState, colorState);\n }; */\n }\n\n public load(partState: Options['PartState'], colorState?: Options['ColorState']) {\n if(this.loaded) {\n return this.loadPromise;\n }\n\n this.loaded = true;\n this.partState = partState;\n this.colorState = colorState;\n\n const part = this.getPart(partState);\n const color = colorState !== undefined && this.getColor && this.getColor(colorState);\n\n const item = part.item;\n item.initFrame = part.endFrame;\n item.color = color;\n\n const promises = [...this.items.values()].map((item) => item.load());\n return Promise.all(promises).then(noop);\n }\n\n /**\n * Will redirect setting color state to part callback to synchronize the rendering\n */\n public setState(partState: Options['PartState'], colorState?: Options['ColorState'], partCallback?: () => void) {\n if(!this.loaded) this.load(partState, colorState);\n\n let changedPartState = false, changedColorState = false;\n if(partState !== undefined) changedPartState = this.setPartState(partState, colorState, partCallback);\n else if(colorState !== undefined) changedColorState = this.setColorState(colorState);\n\n return changedPartState || changedColorState;\n }\n\n public setPartState(state: Options['PartState'], colorState?: Options['ColorState'], callback?: () => void) {\n const {partState: prevState} = this;\n if(prevState === state) {\n return colorState !== undefined ? this.setColorState(colorState) : false;\n }\n\n if(colorState !== undefined) {\n this.setColorState(colorState, false);\n }\n\n this.partState = state;\n\n const part = this.getPart(state, prevState);\n part.play(callback);\n\n return true;\n }\n\n public setColorState(state: Options['ColorState'], renderIfPaused = true) {\n const {colorState: prevState} = this;\n if(prevState === state || !this.getColor) {\n return false;\n }\n\n this.colorState = state;\n\n const item = this.getItem();\n const color = this.getColor(state, prevState);\n const invoke = () => {\n item.player.setColor(color, renderIfPaused);\n };\n\n if(item.player) {\n invoke();\n } else {\n item.onLoadForColor = invoke;\n }\n\n return true;\n }\n\n public destroy() {\n this.items.forEach((item) => {\n item.loadPromise.then(() => {\n item.player.remove();\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {RLottieIconItemPartOptions} from '../../lib/rlottie/rlottieIcon';\nimport {GROUP_CALL_MICROPHONE_BUTTON_STATE} from '.';\nimport {SuperRLottieIcon} from '../superIcon';\n\nexport default class GroupCallMicrophoneIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_MICROPHONE_BUTTON_STATE\n}> {\n constructor() {\n super({\n width: 36,\n height: 36,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n let partName: string;\n switch(state) {\n case states.HAND:\n partName = prevState === states.MUTED ? 'muted-to-hand' : 'unmuted-to-hand';\n break;\n case states.MUTED:\n partName = prevState === states.HAND ? 'hand-to-muted' : 'mute';\n break;\n case states.UNMUTED:\n partName = 'unmute';\n break;\n }\n\n return this.getItem().getPart(partName);\n }\n });\n\n const className = 'group-call-microphone-icon';\n this.container.classList.add(className + '-container');\n\n const parts: RLottieIconItemPartOptions[] = [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 172,\n name: 'unmuted-to-hand'\n }, {\n startFrame: 173,\n endFrame: 201,\n name: 'scheduled-crossing'\n }, {\n startFrame: 202,\n endFrame: 236,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 237,\n endFrame: 273,\n name: 'scheduled-to-hand'\n }, {\n startFrame: 274,\n endFrame: 310,\n name: 'scheduled-crossed-to-hand'\n }, {\n startFrame: 311,\n endFrame: 343,\n name: 'scheduled-uncrossing'\n }, {\n startFrame: 344,\n endFrame: 375,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 376,\n endFrame: 403,\n name: 'play-to-muted'\n }];\n\n this.add({\n name: 'voip_filled',\n parts\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport RLottieIcon from '../../lib/rlottie/rlottieIcon';\nimport {GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, GROUP_CALL_PARTICIPANT_MUTED_STATE, getColorByMutedState, clearMutedStateModifier} from '.';\nimport {SuperRLottieIcon} from '../superIcon';\n\nexport default class GroupCallParticipantMutedIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE,\n ColorState: GROUP_CALL_PARTICIPANT_MUTED_STATE\n}> {\n constructor(private colored: boolean) {\n super({\n width: 32,\n height: 32,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n\n let index: number;\n switch(state) {\n case states.HAND:\n index = 3;\n break;\n case states.MUTED:\n index = prevState === states.HAND ? 0 : 2;\n break;\n case states.UNMUTED:\n index = 1;\n break;\n }\n\n return this.getItem().getPart(index);\n },\n getColor: colored ? (state, prevState) => {\n return getColorByMutedState(state);\n } : undefined\n });\n\n const className = 'group-call-participant-muted-icon';\n this.container.classList.add(className + '-container');\n\n const parts = RLottieIcon.generateEqualParts(4, 21);\n this.add({\n name: 'voice_outlined2',\n parts\n });\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n return super.setState(clearMutedStateModifier(state), state);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '../popups';\nimport {hexToRgb} from '../../helpers/color';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport customProperties from '../../helpers/dom/customProperties';\nimport {GroupCall, GroupCallParticipant} from '../../layer';\nimport type {AppChatsManager} from '../../lib/appManagers/appChatsManager';\nimport type {AppGroupCallsManager} from '../../lib/appManagers/appGroupCallsManager';\nimport type {AppPeersManager} from '../../lib/appManagers/appPeersManager';\nimport GROUP_CALL_STATE from '../../lib/calls/groupCallState';\nimport {RLottieColor} from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport ButtonIcon from '../buttonIcon';\nimport GroupCallMicrophoneIcon from './microphoneIcon';\nimport GroupCallParticipantsElement from './participants';\nimport GroupCallParticipantsVideoElement from './participantVideos';\nimport PopupPeer from '../popups/peer';\nimport GroupCallDescriptionElement from './description';\nimport GroupCallTitleElement from './title';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../../helpers/dom/fullScreen';\nimport Scrollable from '../scrollable';\nimport {MovableState} from '../movableElement';\nimport animationIntersector from '../animationIntersector';\nimport {IS_APPLE_MOBILE} from '../../environment/userAgent';\nimport throttle from '../../helpers/schedulers/throttle';\nimport IS_SCREEN_SHARING_SUPPORTED from '../../environment/screenSharingSupport';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport makeButton from '../call/button';\nimport MovablePanel from '../../helpers/movablePanel';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport toggleClassName from '../../helpers/toggleClassName';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport themeController from '../../helpers/themeController';\nimport groupCallsController from '../../lib/calls/groupCallsController';\n\nexport enum GROUP_CALL_PARTICIPANT_MUTED_STATE {\n UNMUTED,\n MUTED,\n MUTED_FOR_ME,\n MUTED_BY_ADMIN,\n HAND\n}\n\nexport type GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE = Exclude;\n\nexport function getGroupCallParticipantMutedState(participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n if(participant.pFlags.muted_by_you) {\n return states.MUTED_FOR_ME;\n } else if(participant.raise_hand_rating !== undefined) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return participant.pFlags.can_self_unmute ? states.MUTED : states.MUTED_BY_ADMIN;\n } else {\n return states.UNMUTED;\n }\n}\n\nexport function clearMutedStateModifier(state: GROUP_CALL_PARTICIPANT_MUTED_STATE): GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n switch(state) {\n case states.MUTED_BY_ADMIN:\n case states.MUTED_FOR_ME:\n return states.MUTED;\n default:\n return state;\n }\n}\n\nexport function getColorByMutedState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n let colorStr: 'blue' | 'green' | 'secondary' | 'red';\n switch(state) {\n case states.HAND:\n colorStr = 'blue';\n break;\n case states.MUTED:\n case states.MUTED_FOR_ME:\n case states.MUTED_BY_ADMIN:\n colorStr = state === states.MUTED ? 'secondary' : 'red';\n break;\n case states.UNMUTED:\n colorStr = 'green';\n break;\n }\n\n const propertyValue = customProperties.getProperty('gc-' + colorStr + '-text-color');\n const color: RLottieColor = hexToRgb(propertyValue);\n\n return color;\n}\n\nexport enum GROUP_CALL_MICROPHONE_BUTTON_STATE {\n HAND,\n MUTED,\n UNMUTED,\n}\n\nexport function getGroupCallMicrophoneButtonState(groupCall: GroupCall.groupCall, participant: GroupCallParticipant) {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n if(!participant.pFlags.can_self_unmute) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return states.MUTED\n } else {\n return states.UNMUTED;\n }\n}\n\nlet previousState: MovableState = {\n width: 420,\n height: 640\n};\n\nconst className = 'group-call';\n\nexport default class PopupGroupCall extends PopupElement {\n private instance: GroupCallInstance;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallBodyHeaderDescription: GroupCallDescriptionElement;\n private groupCallParticipants: GroupCallParticipantsElement;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private groupCallMicrophoneIcon: GroupCallMicrophoneIcon;\n private videosCount: number;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n private btnInvite: HTMLButtonElement;\n private btnShowColumn: HTMLButtonElement;\n private movablePanel: MovablePanel;\n private buttonsContainer: HTMLDivElement;\n private btnFullScreen2: HTMLButtonElement;\n private btnVideo: HTMLDivElement;\n private btnScreen: HTMLDivElement;\n\n constructor() {\n super('popup-group-call', {\n body: true,\n withoutOverlay: true,\n closable: true,\n title: true\n });\n\n this.videosCount = 0;\n this.container.classList.add(className, 'night');\n\n const instance = this.instance = groupCallsController.groupCall;\n const {listenerSetter} = this;\n\n if(!IS_APPLE_MOBILE) {\n const btnFullScreen = this.btnFullScreen = ButtonIcon('fullscreen');\n const btnFullScreen2 = this.btnFullScreen2 = ButtonIcon('fullscreen ' + className + '-cfs');\n const btnExitFullScreen = this.btnExitFullScreen = ButtonIcon('smallscreen');\n\n attachClickEvent(btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(btnFullScreen2, this.onFullScreenClick, {listenerSetter});\n\n attachClickEvent(btnExitFullScreen, () => {\n cancelFullScreen();\n }, {listenerSetter});\n\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n }\n\n const btnInvite = this.btnInvite = ButtonIcon('adduser');\n const btnShowColumn = this.btnShowColumn = ButtonIcon('rightpanel ' + className + '-only-big');\n\n attachClickEvent(btnShowColumn, this.toggleRightColumn, {listenerSetter});\n\n const headerInfo = document.createElement('div');\n headerInfo.classList.add(className + '-header-info');\n\n this.title.classList.add(className + '-header-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-header-subtitle');\n\n headerInfo.append(this.title, subtitle);\n\n this.header.classList.add(className + '-header');\n this.header.append(...[this.btnExitFullScreen, headerInfo/* , btnInvite */, this.btnFullScreen, btnShowColumn].filter(Boolean));\n\n const newHeader = this.header.cloneNode(false) as HTMLElement;\n const newHeaderInfo = headerInfo.cloneNode(false) as HTMLElement;\n const newHeaderTitle = this.title.cloneNode(false) as HTMLElement;\n\n newHeaderInfo.append(newHeaderTitle);\n\n const btnHideColumn = ButtonIcon('rightpanel');\n newHeader.append(...[btnHideColumn, newHeaderInfo, this.btnFullScreen2].filter(Boolean));\n\n attachClickEvent(btnHideColumn, this.toggleRightColumn, {listenerSetter});\n\n this.body.prepend(newHeader);\n\n const videosScrollable = new Scrollable(undefined);\n videosScrollable.container.classList.add('group-call-big-video-container');\n this.container.append(videosScrollable.container);\n\n this.groupCallTitle = new GroupCallTitleElement(this.title);\n this.groupCallDescription = new GroupCallDescriptionElement(subtitle);\n this.groupCallBodyHeaderDescription = new GroupCallDescriptionElement(newHeaderTitle);\n this.constructButtons();\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n appendTo: videosScrollable.container,\n instance,\n listenerSetter,\n displayPinned: true,\n onLengthChange: (length) => {\n this.videosCount = length;\n this.toggleBigLayout();\n },\n managers: this.managers\n });\n this.groupCallParticipants = new GroupCallParticipantsElement({\n appendTo: this.body,\n instance,\n listenerSetter,\n managers: this.managers\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: 400,\n minHeight: 480,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'chatlist') ||\n findUpClassName(target, 'group-call-button') ||\n findUpClassName(target, 'btn-icon') ||\n findUpClassName(target, 'group-call-participants-video-container') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n onResize: () => this.toggleBigLayout(),\n previousState\n });\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n if(this.instance?.id === groupCall.id) {\n this.updateInstance();\n }\n });\n\n listenerSetter.add(instance)('pinned', () => {\n this.setHasPinned();\n });\n\n listenerSetter.add(this.groupCallParticipantsVideo)('toggleControls', this.onToggleControls);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.groupCallParticipantsVideo.destroy();\n this.groupCallParticipants.destroy();\n this.groupCallMicrophoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.toggleRightColumn();\n this.onFullScreenChange();\n\n this.updateInstance();\n }\n\n private constructButtons() {\n const buttons = this.buttonsContainer = document.createElement('div');\n buttons.classList.add(className + '-buttons');\n\n const _makeButton = makeButton.bind(null, className, this.listenerSetter);\n\n const btnVideo = this.btnVideo = _makeButton({\n // text: 'VoiceChat.Video.Stream.Video',\n callback: this.onVideoClick,\n icon: 'videocamera_filled'\n });\n\n const btnScreen = this.btnScreen = _makeButton({\n // text: 'VoiceChat.Video.Stream.Screencast',\n callback: this.onScreenClick,\n icon: 'sharescreen_filled'\n });\n\n btnScreen.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnMute = _makeButton({\n noRipple: true,\n callback: throttle(this.onMuteClick, 600, true)\n });\n btnMute.classList.add(className + '-microphone-button');\n\n const microphoneIcon = this.groupCallMicrophoneIcon = new GroupCallMicrophoneIcon();\n btnMute.append(microphoneIcon.container);\n\n const btnMore = _makeButton({\n // text: 'VoiceChat.Video.Stream.More'\n icon: 'settings_filled'\n });\n\n btnMore.classList.add('btn-disabled');\n btnMore.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnLeave = _makeButton({\n // text: 'VoiceChat.Leave',\n isDanger: true,\n callback: this.onLeaveClick,\n icon: 'close'\n });\n\n buttons.append(btnVideo, btnScreen, btnMute, btnMore, btnLeave);\n\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onToggleControls = (show: boolean) => {\n this.container.classList.toggle('show-controls', show);\n this.buttonsContainer.classList.toggle('show-controls', show);\n };\n\n private toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n private onVideoClick = () => {\n const toggle = this.toggleDisability([this.btnVideo], true);\n this.instance.toggleVideoSharing().finally(() => {\n toggle();\n });\n };\n\n private onScreenClick = () => {\n const toggle = this.toggleDisability([this.btnScreen], true);\n this.instance.toggleScreenSharing().finally(() => {\n toggle();\n });\n };\n\n private onMuteClick = () => {\n const participant = this.instance.participant;\n if(!participant.pFlags.can_self_unmute) {\n if(participant.raise_hand_rating === undefined) {\n this.instance.changeRaiseHand(true);\n }\n } else {\n this.instance.toggleMuted();\n }\n };\n\n private onLeaveClick = async() => {\n const hangUp = (discard: boolean) => {\n this.instance.hangUp(discard);\n };\n\n if(await this.managers.appChatsManager.hasRights(this.instance.chatId, 'manage_call')) {\n new PopupPeer('popup-end-video-chat', {\n titleLangKey: 'VoiceChat.End.Title',\n descriptionLangKey: 'VoiceChat.End.Text',\n checkboxes: [{\n text: 'VoiceChat.End.Third'\n }],\n buttons: [{\n langKey: 'VoiceChat.End.OK',\n callback: (checkboxes) => {\n hangUp(!!checkboxes.size);\n },\n isDanger: true\n }]\n }).show();\n } else {\n hangUp(false);\n }\n };\n\n public getContainer() {\n return this.container;\n }\n\n private onFullScreenChange = () => {\n this.toggleBigLayout();\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations2(isFull);\n\n themeController.setThemeColor(isFull ? '#000000' : undefined);\n }\n };\n\n private toggleBigLayout = () => {\n const isFull = isFullScreen();\n const movable = this.movablePanel?.movable;\n const isBig = (isFull || !!(movable && movable.width >= 680)) && !!this.videosCount;\n\n /* if(!isBig && isFull) {\n cancelFullScreen();\n return;\n } */\n\n const wasBig = this.container.classList.contains('is-big-layout');\n let buttons: HTMLElement[];\n if(isBig && !wasBig) { // fix buttons transition to 0 opacity\n buttons = Array.from(this.buttonsContainer.children) as HTMLElement[];\n buttons.forEach((element) => {\n element.style.opacity = '0';\n });\n\n void this.buttonsContainer.offsetLeft;\n }\n\n this.container.classList.toggle('is-big-layout', isBig);\n this.btnInvite.classList.toggle('hide', isBig);\n this.btnShowColumn.classList.toggle('hide', !isBig);\n\n if(buttons) {\n // window.requestAnimationFrame(() => {\n buttons.forEach((element) => {\n element.style.opacity = '';\n });\n // });\n }\n };\n\n private toggleRightColumn = () => {\n this.container.classList.toggle('is-right-column-shown');\n };\n\n private setHasPinned() {\n this.container.classList.toggle('has-pinned', !!this.instance.pinnedSource);\n }\n\n private updateInstance() {\n if(this.instance.state === GROUP_CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.hide();\n return;\n }\n\n const {participant, groupCall} = this.instance;\n if(!participant) {\n return;\n }\n\n this.setTitle();\n this.setDescription();\n this.setHasPinned();\n\n const microphoneButtonState = getGroupCallMicrophoneButtonState(groupCall as any, participant);\n this.container.dataset.micState = microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.HAND ? 'hand' : (microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.MUTED ? 'muted' : 'unmuted');\n this.groupCallMicrophoneIcon.setState(microphoneButtonState);\n }\n\n private setTitle() {\n this.groupCallTitle.update(this.instance);\n }\n\n private setDescription() {\n this.groupCallDescription.update(this.instance);\n this.groupCallBodyHeaderDescription.update(this.instance);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {GroupCallParticipant} from '../../layer';\nimport {i18n} from '../../lib/langPack';\nimport {GROUP_CALL_PARTICIPANT_MUTED_STATE} from '.';\nimport {GroupCallParticipantVideoType} from './participantVideo';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\n\nconst className = 'group-call-participant-status';\nexport default class GroupCallParticipantStatusElement {\n public container: HTMLElement;\n\n constructor(private withIcons: GroupCallParticipantVideoType[]) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE, participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n const icons = this.withIcons.filter((type) => !!participant[type]).map((type) => {\n const iconClassName = `tgico-${type === 'presentation' ? 'listscreenshare' : 'videocamera_filled'}`;\n const i = document.createElement('i');\n i.classList.add(className + '-icon', className + '-icon-' + type, iconClassName);\n return i;\n });\n\n let element2: HTMLElement, actionClassName: string;\n if(state === states.MUTED_FOR_ME) {\n element2 = i18n('VoiceChat.Status.MutedForYou');\n actionClassName = 'is-muted';\n } else if(state === states.UNMUTED) {\n element2 = i18n('VoiceChat.Status.Speaking');\n actionClassName = 'is-speaking';\n } else if(state === states.HAND) {\n element2 = i18n('VoiceChat.Status.WantsSpeak');\n actionClassName = 'is-waiting';\n } else if(participant.about && !icons.length) {\n setInnerHTML(this.container, wrapEmojiText(participant.about));\n return;\n } else {\n element2 = i18n('VoiceChat.Status.Listening');\n actionClassName = 'is-listening';\n }\n\n const span = document.createElement('span');\n span.classList.add(className, actionClassName);\n span.append(...icons, element2);\n\n replaceContent(this.container, span);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {fastRaf} from '../../helpers/schedulers';\nimport SortedList, {SortedElementBase} from '../../helpers/sortedList';\nimport appDialogsManager, {DialogDom, AppDialogsManager, DialogElementSize} from '../../lib/appManagers/appDialogsManager';\nimport {getGroupCallParticipantMutedState} from '.';\nimport GroupCallParticipantMutedIcon from './participantMutedIcon';\nimport GroupCallParticipantStatusElement from './participantStatus';\nimport type GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport type LazyLoadQueue from '../lazyLoadQueue';\n\ninterface SortedParticipant extends SortedElementBase {\n dom: DialogDom,\n mutedIcon: GroupCallParticipantMutedIcon,\n status: GroupCallParticipantStatusElement\n}\n\nexport default class GroupCallParticipantsList extends SortedList {\n public list: HTMLUListElement;\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected avatarSize: DialogElementSize = 'abitbigger';\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0] = {/* new: true, */dialogSize: 72};\n\n constructor(private instance: GroupCallInstance) {\n super({\n getIndex: async(element) => (await this.instance.getParticipantByPeerId(element.id)).date,\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onElementDestroy(element);\n },\n onUpdate: async(element) => {\n const participant = await this.instance.getParticipantByPeerId(element.id);\n const state = getGroupCallParticipantMutedState(participant);\n\n element.mutedIcon.setState(state);\n element.status.setState(state, participant);\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.dom.listEl, this.list, idx);\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n wrapOptions: {\n lazyLoadQueue: this.lazyLoadQueue\n }\n });\n\n const className = 'group-call-participant';\n dom.listEl.classList.add(className);\n\n const mutedIcon = new GroupCallParticipantMutedIcon(true);\n const status = new GroupCallParticipantStatusElement(['presentation', 'video']);\n replaceContent(dom.lastMessageSpan, status.container);\n dom.listEl.append(mutedIcon.container);\n (base as SortedParticipant).mutedIcon = mutedIcon;\n (base as SortedParticipant).status = status;\n\n /* instance.getParticipantByPeerId(base.id).then((participant) => {\n const mutedState = getGroupCallParticipantMutedState(participant);\n\n mutedIcon.setState(mutedState);\n status.setState(mutedState, participant);\n }); */\n\n (base as SortedParticipant).dom = dom;\n\n return base as SortedParticipant;\n },\n updateElementWith: fastRaf\n });\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n }\n\n public destroy() {\n this.elements.forEach((element) => {\n this.onElementDestroy(element);\n });\n }\n\n protected onElementDestroy(element: SortedParticipant) {\n element.mutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {animate} from '../../helpers/animation';\n\nexport default function callVideoCanvasBlur(video: HTMLVideoElement) {\n const canvas = document.createElement('canvas');\n canvas.classList.add('call-video-blur');\n const size = 16;\n canvas.width = size;\n canvas.height = size;\n\n const ctx = canvas.getContext('2d', {alpha: false});\n ctx.filter = 'blur(2px)';\n const renderFrame = () => {\n ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight, 0, 0, canvas.width, canvas.height);\n };\n\n animate(() => {\n renderFrame();\n return canvas.isConnected;\n });\n\n renderFrame();\n\n return canvas;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GroupCallParticipant} from '../../layer';\nimport type {GroupCallOutputSource} from '../../lib/appManagers/appGroupCallsManager';\nimport {i18n} from '../../lib/langPack';\nimport PeerTitle from '../peerTitle';\nimport {getGroupCallParticipantMutedState} from '.';\nimport GroupCallParticipantMutedIcon from './participantMutedIcon';\nimport GroupCallParticipantStatusElement from './participantStatus';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport callVideoCanvasBlur from '../call/videoCanvasBlur';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nconst className = 'group-call-participant-video';\n\nexport type GroupCallParticipantVideoType = 'video' | 'presentation';\nexport default class GroupCallParticipantVideoElement {\n public container: HTMLElement;\n private peerTitle: PeerTitle;\n private subtitle: HTMLElement;\n private info: HTMLElement;\n private left: HTMLElement;\n private right: HTMLElement;\n private header: HTMLElement;\n private groupCallParticipantMutedIcon: GroupCallParticipantMutedIcon;\n private groupCallParticipantStatus: GroupCallParticipantStatusElement;\n\n constructor(private managers: AppManagers, private instance: GroupCallInstance, public source: GroupCallOutputSource) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n this.info = document.createElement('div');\n this.info.classList.add(className + '-info');\n\n this.left = document.createElement('div');\n this.left.classList.add(className + '-info-left');\n\n this.right = document.createElement('div');\n this.right.classList.add(className + '-info-right');\n\n this.info.append(this.left, this.right);\n\n this.container.append(this.info);\n }\n\n public setPinned(value: boolean) {\n if(!value) {\n if(this.header) {\n this.header.remove();\n this.header = undefined;\n }\n\n return;\n } else if(this.header) {\n return;\n }\n\n // if(!this.header) {\n this.header = document.createElement('div');\n this.header.classList.add(className + '-header');\n\n const icon = document.createElement('i');\n icon.classList.add('group-call-pin-icon', 'tgico-pin');\n this.header.append(icon);\n\n this.container.append(this.header);\n // }\n\n // this.container.classList.toggle('is-pinned', value);\n }\n\n public setParticipant(participant: GroupCallParticipant, type: GroupCallParticipantVideoType, video: HTMLVideoElement) {\n let peerTitleElement: HTMLElement;\n if(participant.pFlags.self) {\n peerTitleElement = i18n('VoiceChat.Status.You');\n peerTitleElement.classList.add('peer-title');\n } else {\n this.peerTitle = new PeerTitle({\n peerId: getPeerId(participant.peer)\n });\n\n peerTitleElement = this.peerTitle.element;\n }\n\n this.groupCallParticipantMutedIcon = new GroupCallParticipantMutedIcon(false);\n this.groupCallParticipantStatus = new GroupCallParticipantStatusElement([type]);\n\n this.left.append(peerTitleElement, this.groupCallParticipantStatus.container);\n\n this.right.append(this.groupCallParticipantMutedIcon.container);\n\n video.classList.add(className, 'call-video');\n\n if(video.paused) {\n video.play();\n }\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(className + '-blur');\n\n this.container.prepend(canvas, video);\n\n this.updateParticipant(participant);\n }\n\n public updateParticipant(participant: GroupCallParticipant) {\n const state = getGroupCallParticipantMutedState(participant);\n\n this.groupCallParticipantMutedIcon.setState(state);\n this.groupCallParticipantStatus.setState(state, participant);\n }\n\n public destroy() {\n this.groupCallParticipantMutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ControlsHover from '../../helpers/dom/controlsHover';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {GroupCallParticipant} from '../../layer';\nimport {GroupCallOutputSource} from '../../lib/appManagers/appGroupCallsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport rootScope from '../../lib/rootScope';\nimport GroupCallParticipantVideoElement, {GroupCallParticipantVideoType} from './participantVideo';\n\nexport default class GroupCallParticipantsVideoElement extends ControlsHover {\n private container: HTMLDivElement;\n private instance: GroupCallInstance;\n private participantsElements: Map>;\n private displayPinned: boolean;\n private containers: Map;\n private onLengthChange: (length: number) => void;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n displayPinned: boolean,\n onLengthChange?: GroupCallParticipantsVideoElement['onLengthChange'],\n managers: AppManagers\n }) {\n super();\n safeAssign(this, options);\n\n const className = 'group-call-participants-video';\n const container = this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n options.appendTo.append(container);\n\n this.participantsElements = new Map();\n this.containers = new Map();\n\n const {listenerSetter} = this;\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n listenerSetter.add(this.instance)('pinned', (source) => {\n this.participantsElements.forEach((map) => {\n map.forEach((element) => {\n this.setElementDisplay(element, source);\n });\n });\n });\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'group-call-participant-video-container');\n if(!container) {\n return;\n }\n\n const element = this.containers.get(container);\n if(this.instance.pinnedSource === element.source) {\n this.instance.unpinAll();\n return;\n }\n\n this.instance.pinSource(element.source);\n }, {listenerSetter});\n\n this.setInstance(this.instance);\n\n this.setup({\n element: container,\n listenerSetter: listenerSetter,\n showOnLeaveToClassName: 'group-call-buttons'\n });\n }\n\n private shouldDisplayElement(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n return this.displayPinned ? !pinnedSource || element.source === pinnedSource : pinnedSource && element.source !== pinnedSource;\n }\n\n private setElementDisplay(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n const shouldDisplay = this.shouldDisplayElement(element, pinnedSource);\n element.container.classList.toggle('video-hidden', !shouldDisplay);\n\n const isPinned = element.source === pinnedSource;\n element.setPinned(isPinned);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = getPeerId(participant.peer);\n const types: GroupCallParticipantVideoType[] = ['video', 'presentation'];\n const hasAnyVideo = types.some((type) => !!participant[type]);\n let participantElements = this.participantsElements.get(peerId);\n if(!hasAnyVideo && !participantElements) {\n return;\n }\n\n if(!participantElements) {\n this.participantsElements.set(peerId, participantElements = new Map());\n }\n\n types.forEach((type) => {\n let element = participantElements.get(type);\n const participantVideo = participant[type];\n if(!!participantVideo === !!element) {\n if(element) {\n element.updateParticipant(participant);\n }\n\n return;\n }\n\n if(participantVideo) {\n const result = this.instance.getVideoElementFromParticipantByType(participant, type);\n if(!result) {\n return;\n }\n\n const {video, source} = result;\n\n element = new GroupCallParticipantVideoElement(this.managers, this.instance, source);\n\n this.containers.set(element.container, element);\n\n this.setElementDisplay(element, this.instance.pinnedSource);\n participantElements.set(type, element);\n element.setParticipant(participant, type, video);\n\n this.container.prepend(element.container);\n } else {\n participantElements.delete(type);\n element.container.remove();\n\n if(!participantElements.size) {\n this.participantsElements.delete(peerId);\n this.containers.delete(element.container);\n element.destroy();\n }\n }\n\n this._onLengthChange();\n });\n }\n\n private _onLengthChange() {\n const length = this.container.childElementCount;\n this.container.dataset.length = '' + length;\n this.container.dataset.layout = length <= 2 ? '1' : (length === 3 ? '3' : '4');\n\n this.onLengthChange && this.onLengthChange(length);\n }\n\n public async setInstance(instance: GroupCallInstance) {\n (await instance.participants).forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.containers.forEach((element) => {\n element.destroy();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupGroupCall from '.';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {addFullScreenListener, isFullScreen} from '../../helpers/dom/fullScreen';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport noop from '../../helpers/noop';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport positionMenu from '../../helpers/positionMenu';\nimport ScrollableLoader from '../../helpers/scrollableLoader';\nimport {GroupCallParticipant} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport rootScope from '../../lib/rootScope';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\nimport confirmationPopup from '../confirmationPopup';\nimport PeerTitle from '../peerTitle';\nimport PopupElement from '../popups';\nimport Scrollable from '../scrollable';\nimport GroupCallParticipantsList from './participantsList';\nimport GroupCallParticipantsVideoElement from './participantVideos';\n\nexport class GroupCallParticipantContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: (peerId: PeerId) => boolean | Promise})[];\n private element: HTMLElement;\n private chatId: ChatId;\n private targetPeerId: PeerId;\n private participant: GroupCallParticipant;\n private instance: GroupCallInstance;\n private canManageCall: boolean;\n private managers: AppManagers;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n onContextElement: HTMLElement,\n managers: AppManagers,\n instance: GroupCallInstance,\n }) {\n this.buttons = [{\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MutePeer',\n verify: () => this.canManageCall && this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmutePeer',\n verify: () => this.canManageCall && !this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MuteForMe',\n verify: () => !this.canManageCall && !this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmuteForMe',\n verify: () => !this.canManageCall && this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'newprivate',\n text: 'VoiceChat.OpenProfile',\n verify: () => true,\n onClick: this.onOpenProfileClick\n }, {\n icon: 'deleteuser danger',\n text: 'VoiceChat.RemovePeer',\n verify: () => this.managers.appChatsManager.hasRights(this.chatId, 'ban_users'),\n onClick: async() => {\n confirmationPopup({\n peerId: this.targetPeerId,\n title: new PeerTitle({peerId: this.targetPeerId}).element,\n descriptionLangKey: await this.managers.appChatsManager.isBroadcast(this.chatId) ? 'VoiceChat.RemovePeer.Confirm.Channel' : 'VoiceChat.RemovePeer.Confirm',\n descriptionLangArgs: [new PeerTitle({peerId: this.targetPeerId}).element],\n button: {\n langKey: 'VoiceChat.RemovePeer.Confirm.OK',\n isDanger: true\n }\n }).then(() => {\n this.managers.appChatsManager.kickFromChat(this.chatId, this.targetPeerId);\n }, noop);\n }\n }];\n\n const {listenerSetter} = options;\n this.managers = options.managers;\n this.instance = options.instance;\n this.chatId = this.instance.chatId;\n\n this.element = ButtonMenuSync({buttons: this.buttons, listenerSetter});\n this.element.classList.add('group-call-participant-menu', 'night');\n\n attachContextMenuListener({\n element: options.onContextElement,\n callback: async(e) => {\n const li = findUpClassName(e.target, 'group-call-participant');\n if(!li) {\n return;\n }\n\n if(this.element.parentElement !== appendTo) {\n appendTo.append(this.element);\n }\n\n cancelEvent(e);\n\n const peerId = this.targetPeerId = li.dataset.peerId.toPeerId();\n this.participant = await this.instance.getParticipantByPeerId(peerId);\n if(this.participant.pFlags.self) {\n return;\n }\n\n this.canManageCall = await this.managers.appChatsManager.hasRights(this.chatId, 'manage_call');\n\n await filterAsync(this.buttons, async(button) => {\n const good = await button.verify(peerId);\n button.element.classList.toggle('hide', !good);\n return good;\n });\n\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, 'right');\n contextMenuController.openBtnMenu(this.element);\n },\n listenerSetter\n });\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n const peerId = getPeerId(participant.peer);\n if(this.targetPeerId === peerId) {\n contextMenuController.close();\n }\n }\n });\n\n let appendTo: HTMLElement = document.body;\n addFullScreenListener(document.body, () => {\n const isFull = isFullScreen();\n appendTo = isFull ? PopupElement.getPopups(PopupGroupCall)[0].getContainer(): document.body;\n\n if(!isFull) {\n contextMenuController.close();\n }\n }, listenerSetter);\n }\n\n private onOpenProfileClick = () => {\n const popup = PopupElement.getPopups(PopupGroupCall)[0];\n if(popup) {\n popup.hide();\n }\n\n appImManager.setInnerPeer({peerId: this.targetPeerId});\n };\n\n private toggleParticipantMuted = (muted: boolean) => {\n this.instance.editParticipant(this.participant, {\n muted\n });\n };\n};\n\nexport default class GroupCallParticipantsElement {\n private container: HTMLDivElement;\n private sortedList: GroupCallParticipantsList;\n private instance: GroupCallInstance;\n private listenerSetter: ListenerSetter;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private contextMenu: GroupCallParticipantContextMenu;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n managers: AppManagers\n }) {\n safeAssign(this, options);\n\n const className = 'group-call-participants';\n\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add(className + '-scrollable');\n\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n // const invite = Button(`btn-primary btn-transparent ${className}-invite`, {icon: 'adduser', text: 'VoiceChat.Invite.InviteMembers'});\n\n const sortedList = this.sortedList = new GroupCallParticipantsList(this.instance);\n\n const {instance, listenerSetter} = this;\n this.contextMenu = new GroupCallParticipantContextMenu({\n ...options,\n onContextElement: sortedList.list,\n listenerSetter,\n instance\n });\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n ...options,\n appendTo: scrollable.container,\n displayPinned: false\n });\n\n scrollable.append(/* invite, */sortedList.list);\n container.append(scrollable.container);\n\n options.appendTo.append(container);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n const scrollableLoader = new ScrollableLoader({\n scrollable,\n getPromise: () => {\n return this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants, isEnd}) => {\n participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n\n return isEnd;\n });\n }\n });\n\n this.setInstance(instance);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = getPeerId(participant.peer);\n const has = this.sortedList.has(peerId);\n if(participant.pFlags.left) {\n if(has) {\n this.sortedList.delete(peerId);\n }\n\n return;\n }\n\n if(!has) {\n this.sortedList.add(peerId);\n return;\n }\n\n this.sortedList.update(peerId);\n }\n\n public async setInstance(instance: GroupCallInstance) {\n // @ts-ignore\n /* const users = appUsersManager.users;\n for(const userId in users) {\n const participant: GroupCallParticipant = {\n _: 'groupCallParticipant',\n date: 0,\n peer: {_: 'peerUser', user_id: userId.toPeerId()},\n pFlags: {\n muted: true\n },\n source: 1\n };\n\n instance.participants.set(userId.toPeerId(), participant);\n this.updateParticipant(participant);\n } */\n const participants = await instance.participants;\n participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.sortedList.destroy();\n this.groupCallParticipantsVideo.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GroupCall} from '../../layer';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport GROUP_CALL_STATE from '../../lib/calls/groupCallState';\nimport I18n, {LangPackKey, FormatterArguments} from '../../lib/langPack';\n\nexport default class GroupCallDescriptionElement {\n private descriptionIntl: I18n.IntlElement;\n\n constructor(private appendTo: HTMLElement) {\n this.descriptionIntl = new I18n.IntlElement({\n key: 'VoiceChat.Status.Connecting'\n });\n\n this.descriptionIntl.element.classList.add('group-call-description');\n }\n\n public detach() {\n this.descriptionIntl.element.remove();\n }\n\n public update(instance: GroupCallInstance) {\n const {state} = instance;\n\n let key: LangPackKey, args: FormatterArguments;\n if(state === GROUP_CALL_STATE.CONNECTING) {\n key = 'VoiceChat.Status.Connecting';\n } else {\n key = 'VoiceChat.Status.Members';\n args = [(instance.groupCall as GroupCall.groupCall).participants_count];\n }\n\n const {descriptionIntl} = this;\n descriptionIntl.compareAndUpdate({\n key,\n args\n });\n\n if(!this.descriptionIntl.element.parentElement) {\n this.appendTo.append(this.descriptionIntl.element);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {GroupCall} from '../../layer';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport PeerTitle from '../peerTitle';\n\nexport default class GroupCallTitleElement {\n private peerTitle: PeerTitle;\n\n constructor(private appendTo: HTMLElement) {\n this.peerTitle = new PeerTitle({peerId: 0});\n }\n\n public update(instance: GroupCallInstance) {\n const {peerTitle, appendTo} = this;\n const groupCall = instance.groupCall as GroupCall.groupCall;\n const peerId = instance.chatId.toPeerId(true);\n if(groupCall.title) {\n setInnerHTML(appendTo, wrapEmojiText(groupCall.title));\n } else {\n if(peerTitle.options.peerId !== peerId) {\n peerTitle.options.peerId = peerId;\n peerTitle.update();\n }\n\n if(peerTitle.element.parentElement !== appendTo) {\n appendTo.append(peerTitle.element);\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport ripple from '../ripple';\n\nexport default function makeButton(className: string, listenerSetter: ListenerSetter, options: {\n text?: LangPackKey | HTMLElement,\n isDanger?: boolean,\n noRipple?: boolean,\n callback?: () => void,\n icon?: string,\n isConfirm?: boolean,\n}) {\n const _className = className + '-button';\n const buttonDiv = document.createElement('div');\n buttonDiv.classList.add(_className, 'call-button', 'rp-overflow');\n\n if(options.icon) {\n buttonDiv.classList.add('tgico-' + options.icon);\n }\n\n if(!options.noRipple) {\n ripple(buttonDiv);\n }\n\n if(options.isDanger) {\n buttonDiv.classList.add(_className + '-red');\n }\n\n if(options.isConfirm) {\n buttonDiv.classList.add(_className + '-green');\n }\n\n if(options.callback) {\n attachClickEvent(buttonDiv, options.callback, {listenerSetter});\n }\n\n let ret = buttonDiv;\n if(options.text) {\n const div = document.createElement('div');\n div.classList.add(_className + '-container', 'call-button-container');\n\n const textEl = typeof(options.text) === 'string' ? i18n(options.text) : options.text;\n textEl.classList.add(_className + '-text', 'call-button-text');\n\n div.append(buttonDiv, textEl);\n\n ret = div;\n }\n\n return ret;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport mediaSizes from '../helpers/mediaSizes';\nimport clamp from '../helpers/number/clamp';\nimport safeAssign from '../helpers/object/safeAssign';\nimport windowSize from '../helpers/windowSize';\nimport SwipeHandler from './swipeHandler';\n\ntype ResizeSide = 'n' | 'e' | 's' | 'w' | 'ne' | 'se' | 'sw' | 'nw';\nexport type MovableState = {\n top?: number;\n left?: number;\n width: number;\n height: number;\n};\n\nconst className = 'movable-element';\nconst resizeHandlerClassName = className + '-resize-handler';\n\nexport type MovableElementOptions = {\n minWidth: MovableElement['minWidth'],\n minHeight: MovableElement['minHeight'],\n element: MovableElement['element'],\n verifyTouchTarget?: MovableElement['verifyTouchTarget']\n};\n\nexport default class MovableElement extends EventListenerBase<{\n resize: () => void\n}> {\n private minWidth: number;\n private minHeight: number;\n private element: HTMLElement;\n private verifyTouchTarget: SwipeHandler['verifyTouchTarget'];\n\n private top: number;\n private left: number;\n private _width: number;\n private _height: number;\n\n private swipeHandler: SwipeHandler;\n private handlers: HTMLElement[];\n\n constructor(options: MovableElementOptions) {\n super(true);\n safeAssign(this, options);\n\n this.top = this.left = this.width = this.height = 0;\n this.element.classList.add(className);\n\n this.addResizeHandlers();\n this.setSwipeHandler();\n\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private onResize = () => {\n this.fixDimensions();\n this.fixPosition();\n this.setPosition();\n };\n\n public destroyElements() {\n this.element.classList.remove(className);\n\n if(this.handlers) {\n this.handlers.forEach((handler) => {\n handler.remove();\n });\n }\n }\n\n public destroy() {\n mediaSizes.removeEventListener('resize', this.onResize);\n this.swipeHandler.removeListeners();\n }\n\n private addResizeHandlers() {\n const sides: ResizeSide[] = ['n', 'e', 's', 'w', 'ne', 'se', 'sw', 'nw'];\n this.handlers = sides.map((side) => {\n const div = document.createElement('div');\n div.dataset.side = side;\n div.classList.add(resizeHandlerClassName, resizeHandlerClassName + '-side-' + side);\n this.element.append(div);\n return div;\n });\n }\n\n private setSwipeHandler() {\n let startTop: number, startLeft: number, startWidth: number, startHeight: number, resizingSide: ResizeSide;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.element,\n onSwipe: (xDiff, yDiff, e) => {\n // console.log(xDiff, yDiff, e);\n\n if(resizingSide) {\n if(resizingSide.includes('e') || resizingSide.includes('w')) {\n const isEnlarging = resizingSide.includes('e') && xDiff > 0 || resizingSide.includes('w') && xDiff < 0;\n const resizeDiff = Math.abs(xDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('e') ? windowSize.width - startLeft : startWidth + startLeft;\n this.width = Math.min(maxPossible, startWidth + resizeDiff);\n }\n\n if(resizingSide.includes('n') || resizingSide.includes('s')) {\n const isEnlarging = resizingSide.includes('s') && yDiff > 0 || resizingSide.includes('n') && yDiff < 0;\n const resizeDiff = Math.abs(yDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('s') ? windowSize.height - startTop : startHeight + startTop;\n this.height = Math.min(maxPossible, startHeight + resizeDiff);\n }\n\n this.fixDimensions();\n\n if(resizingSide.includes('w')) {\n this.left = Math.min(startLeft + startWidth - this.minWidth, startLeft + xDiff);\n }\n\n if(resizingSide.includes('n')) {\n this.top = Math.min(startTop + startHeight - this.minHeight, startTop + yDiff);\n }\n } else {\n this.top = startTop + yDiff;\n this.left = startLeft + xDiff;\n }\n\n this.fixPosition();\n this.setPosition();\n },\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(this.verifyTouchTarget && !this.verifyTouchTarget(e)) {\n return false;\n }\n\n const resizeHandler = findUpClassName(target, resizeHandlerClassName);\n if(resizeHandler) {\n resizingSide = resizeHandler.dataset.side as ResizeSide;\n swipeHandler.setCursor('');\n } else {\n resizingSide = undefined;\n swipeHandler.setCursor('grabbing');\n }\n\n return true;\n },\n onFirstSwipe: () => {\n startTop = this.top;\n startLeft = this.left;\n startWidth = this.width;\n startHeight = this.height;\n }\n });\n }\n\n public setPositionToCenter() {\n this.top = (windowSize.height / 2) - (this.height / 2);\n this.left = (windowSize.width / 2) - (this.width / 2);\n this.setPosition();\n }\n\n private fixDimensions() {\n this.width = clamp(this.width, this.minWidth, windowSize.width);\n this.height = clamp(this.height, this.minHeight, windowSize.height);\n }\n\n private fixPosition() {\n this.top = clamp(this.top, 0, windowSize.height - this.height);\n this.left = clamp(this.left, 0, windowSize.width - this.width);\n }\n\n private setPosition() {\n this.element.style.top = this.top + 'px';\n this.element.style.left = this.left + 'px';\n this.element.style.right = 'auto';\n this.element.style.bottom = 'auto';\n this.element.style.width = this.width + 'px';\n this.element.style.height = this.height + 'px';\n\n this.dispatchEvent('resize');\n }\n\n public get width() {\n return this._width;\n }\n\n public get height() {\n return this._height;\n }\n\n private set width(value: number) {\n this._width = value;\n }\n\n private set height(value: number) {\n this._height = value;\n }\n\n public get state(): MovableState {\n const {top, left, width, height} = this;\n return {\n top,\n left,\n width,\n height\n };\n }\n\n public set state(state: MovableState) {\n const {top, left, width, height} = state;\n this.top = top;\n this.left = left;\n this.width = width;\n this.height = height;\n this.onResize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MovableElement, {MovableElementOptions, MovableState} from '../components/movableElement';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport ListenerSetter from './listenerSetter';\nimport mediaSizes, {ScreenSize} from './mediaSizes';\nimport safeAssign from './object/safeAssign';\n\nexport default class MovablePanel {\n #movable: MovableElement;\n private listenerSetter: ListenerSetter;\n private previousState: MovableState;\n private onResize: () => void;\n private movableOptions: MovableElementOptions;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n previousState: MovableState,\n onResize?: () => void,\n movableOptions: MovableElementOptions\n }) {\n safeAssign(this, options);\n\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n\n this.listenerSetter.add(mediaSizes)('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n }\n });\n }\n\n public destroy() {\n const movable = this.movable;\n if(movable) {\n movable.destroy();\n }\n }\n\n public get movable() {\n return this.#movable;\n }\n\n public get state() {\n return this.movable ? this.movable.state : this.previousState;\n }\n\n public set state(state: MovableState) {\n this.previousState = state;\n }\n\n private toggleMovable(enabled: boolean) {\n let {movable} = this;\n if(enabled) {\n if(movable) {\n return;\n }\n\n movable = this.#movable = new MovableElement(this.movableOptions);\n\n movable.state = this.previousState;\n if(this.previousState.top === undefined) {\n movable.setPositionToCenter();\n }\n\n if(this.onResize) {\n this.listenerSetter.add(movable)('resize', this.onResize);\n }\n } else {\n if(!movable) {\n return;\n }\n\n this.previousState = movable.state;\n movable.destroyElements();\n movable.destroy();\n this.#movable = undefined;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function toggleClassName(className: string, elements: HTMLElement[], disable: boolean) {\n elements.forEach((element) => {\n element.classList.toggle(className, disable);\n });\n\n return () => toggleClassName(className, elements, !disable);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport CALL_STATE from '../../lib/calls/callState';\nimport {i18n, LangPackKey} from '../../lib/langPack';\n\nexport default class CallDescriptionElement {\n private container: HTMLElement;\n private state: CALL_STATE;\n private interval: number;\n\n constructor(private appendTo: HTMLElement) {\n this.container = document.createElement('div');\n this.container.classList.add('call-description');\n }\n\n public detach() {\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n\n this.container.remove();\n this.state = undefined;\n }\n\n public update(instance: any) {\n const {connectionState} = instance;\n\n if(this.state === connectionState) {\n return;\n }\n\n this.state = connectionState;\n\n let element: HTMLElement;\n if(connectionState === CALL_STATE.CONNECTED) {\n element = document.createElement('span');\n element.classList.add('call-description-duration');\n\n const setTime = () => {\n element.innerText = toHHMMSS(instance.duration, true);\n };\n\n this.interval = window.setInterval(setTime, 1000);\n setTime();\n } else {\n let langPackKey: LangPackKey;\n switch(connectionState) {\n case CALL_STATE.PENDING:\n langPackKey = instance.isOutgoing ? 'Call.StatusRinging' : 'Call.StatusCalling';\n break;\n case CALL_STATE.REQUESTING:\n langPackKey = 'Call.StatusRequesting';\n break;\n case CALL_STATE.EXCHANGING_KEYS:\n langPackKey = 'VoipExchangingKeys';\n break;\n case CALL_STATE.CLOSED:\n langPackKey = instance.connectedAt !== undefined ? 'Call.StatusEnded' : 'Call.StatusFailed';\n break;\n default:\n langPackKey = 'Call.StatusConnecting';\n break;\n }\n\n element = i18n(langPackKey);\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n this.container.classList.toggle('has-duration', connectionState === CALL_STATE.CONNECTED);\n replaceContent(this.container, element);\n\n if(!this.container.parentElement) {\n this.appendTo.append(this.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SuperRLottieIcon} from '../superIcon';\n\nexport default class GroupCallMicrophoneIconMini extends SuperRLottieIcon<{\n PartState: boolean,\n ColorState: boolean,\n Items: {\n name: 'voice_mini'\n }[]\n}> {\n constructor(colored?: boolean, skipAnimation?: boolean) {\n super({\n width: 36,\n height: 36,\n getPart: (state) => {\n return this.getItem().getPart(state ? 'unmute' : 'mute');\n },\n getColor: colored ? (state) => {\n return state ? [255, 255, 255] : [158, 158, 158];\n } : undefined,\n skipAnimation\n });\n\n this.add({\n name: 'voice_mini',\n parts: [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 171,\n name: 'unmuted-to-hand'\n }]\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_SCREEN_SHARING_SUPPORTED from '../../environment/screenSharingSupport';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ControlsHover from '../../helpers/dom/controlsHover';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../../helpers/dom/fullScreen';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport MovablePanel from '../../helpers/movablePanel';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport themeController from '../../helpers/themeController';\nimport toggleClassName from '../../helpers/toggleClassName';\nimport CallInstance from '../../lib/calls/callInstance';\nimport CALL_STATE from '../../lib/calls/callState';\nimport I18n, {i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport animationIntersector from '../animationIntersector';\nimport AvatarElement from '../avatar';\nimport ButtonIcon from '../buttonIcon';\nimport GroupCallMicrophoneIconMini from '../groupCall/microphoneIconMini';\nimport {MovableState} from '../movableElement';\nimport PeerTitle from '../peerTitle';\nimport PopupElement from '../popups';\nimport SetTransition from '../singleTransition';\nimport makeButton from './button';\nimport CallDescriptionElement from './description';\nimport callVideoCanvasBlur from './videoCanvasBlur';\n\nconst className = 'call';\n\nconst MIN_WIDTH = 400;\nconst MIN_HEIGHT = 580;\n\nconst INIT_STATE: MovableState = {\n width: MIN_WIDTH,\n height: MIN_HEIGHT\n};\n\nlet previousState: MovableState = {...INIT_STATE};\n\nexport default class PopupCall extends PopupElement {\n private peerId: PeerId;\n\n private description: CallDescriptionElement;\n private emojisSubtitle: HTMLElement;\n\n private partyStates: HTMLElement;\n private partyMutedState: HTMLElement;\n\n private firstButtonsRow: HTMLElement;\n private secondButtonsRow: HTMLElement;\n\n private declineI18nElement: I18n.IntlElement;\n\n private makeButton: (options: Parameters[2]) => HTMLElement;\n private btnAccept: HTMLElement;\n private btnDecline: HTMLElement;\n private btnVideo: HTMLElement;\n private btnScreen: HTMLElement;\n private btnMute: HTMLElement;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n\n private movablePanel: MovablePanel;\n private microphoneIcon: GroupCallMicrophoneIconMini;\n private muteI18nElement: I18n.IntlElement;\n\n private videoContainers: {\n input?: HTMLElement,\n output?: HTMLElement\n };\n\n private controlsHover: ControlsHover;\n\n constructor(private instance: CallInstance) {\n super('popup-call', {\n withoutOverlay: true,\n closable: true\n });\n\n this.videoContainers = {};\n\n const {container, listenerSetter} = this;\n container.classList.add(className, 'night');\n\n const avatarContainer = document.createElement('div');\n avatarContainer.classList.add(className + '-avatar');\n\n const peerId = this.peerId = this.instance.interlocutorUserId.toPeerId();\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-full');\n avatar.updateWithOptions({\n isBig: true,\n peerId: peerId\n });\n avatarContainer.append(avatar);\n\n const title = new PeerTitle({\n peerId\n }).element;\n\n title.classList.add(className + '-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-subtitle');\n\n const description = this.description = new CallDescriptionElement(subtitle);\n\n const emojisSubtitle = this.emojisSubtitle = document.createElement('div');\n emojisSubtitle.classList.add(className + '-emojis');\n\n container.append(avatarContainer, title, subtitle);\n\n if(!IS_MOBILE) {\n this.btnFullScreen = ButtonIcon('fullscreen');\n this.btnExitFullScreen = ButtonIcon('smallscreen hide');\n attachClickEvent(this.btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(this.btnExitFullScreen, () => cancelFullScreen(), {listenerSetter});\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n this.header.prepend(this.btnExitFullScreen);\n this.header.append(this.btnFullScreen);\n\n container.append(emojisSubtitle);\n } else {\n this.header.append(emojisSubtitle);\n }\n\n this.partyStates = document.createElement('div');\n this.partyStates.classList.add(className + '-party-states');\n\n this.partyMutedState = document.createElement('div');\n this.partyMutedState.classList.add(className + '-party-state');\n const stateText = i18n('VoipUserMicrophoneIsOff', [new PeerTitle({peerId, onlyFirstName: true, limitSymbols: 18}).element]);\n stateText.classList.add(className + '-party-state-text');\n const mutedIcon = new GroupCallMicrophoneIconMini(false, true);\n mutedIcon.setState(false, false);\n this.partyMutedState.append(\n mutedIcon.container,\n stateText\n );\n\n this.partyStates.append(this.partyMutedState);\n this.container.append(this.partyStates);\n\n this.makeButton = makeButton.bind(null, className, this.listenerSetter);\n this.constructFirstButtons();\n this.constructSecondButtons();\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(instance)('mediaState', () => {\n this.updateInstance();\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: MIN_WIDTH,\n minHeight: MIN_HEIGHT,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'call-button') ||\n findUpClassName(target, 'btn-icon') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n // onResize: () => this.toggleBigLayout(),\n previousState: !this.instance.wasTryingToJoin && !this.instance.isOutgoing ? {...INIT_STATE} : previousState\n });\n\n const movableElement = this.movablePanel.movable;\n if(movableElement) {\n this.listenerSetter.add(movableElement)('resize', () => {\n this.resizeVideoContainers();\n });\n }\n\n const controlsHover = this.controlsHover = new ControlsHover();\n controlsHover.setup({\n element: this.container,\n listenerSetter: this.listenerSetter,\n showOnLeaveToClassName: 'call-buttons'\n });\n controlsHover.showControls(false);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.microphoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.updateInstance();\n }\n\n public getCallInstance() {\n return this.instance;\n }\n\n private constructFirstButtons() {\n const buttons = this.firstButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-first');\n\n const toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n const btnVideo = this.btnVideo = this.makeButton({\n text: 'Call.Camera',\n icon: 'videocamera_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleVideoSharing().finally(toggle);\n }\n });\n\n const btnScreen = this.btnScreen = this.makeButton({\n text: 'Call.Screen',\n icon: 'sharescreen_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleScreenSharing().finally(toggle);\n }\n });\n\n if(!IS_SCREEN_SHARING_SUPPORTED) {\n btnScreen.classList.add('hide');\n this.container.classList.add('no-screen');\n }\n\n this.muteI18nElement = new I18n.IntlElement({\n key: 'Call.Mute'\n });\n const btnMute = this.btnMute = this.makeButton({\n text: this.muteI18nElement.element,\n callback: () => {\n this.instance.toggleMuted();\n }\n });\n\n const microphoneIcon = this.microphoneIcon = new GroupCallMicrophoneIconMini(true, true);\n btnMute.firstElementChild.append(microphoneIcon.container);\n\n // btnVideo.classList.add('disabled');\n // btnScreen.classList.add('disabled');\n\n buttons.append(btnVideo, btnScreen, btnMute);\n this.container.append(buttons);\n }\n\n private constructSecondButtons() {\n const buttons = this.secondButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-second');\n\n this.declineI18nElement = new I18n.IntlElement({\n key: 'Call.Decline'\n });\n const btnDecline = this.btnDecline = this.makeButton({\n text: this.declineI18nElement.element,\n icon: 'endcall_filled',\n callback: () => {\n this.instance.hangUp('phoneCallDiscardReasonHangup');\n },\n isDanger: true\n });\n\n const btnAccept = this.btnAccept = this.makeButton({\n text: 'Call.Accept',\n icon: 'phone_filled',\n callback: () => {\n this.instance.acceptCall();\n },\n isConfirm: true\n });\n\n buttons.append(btnDecline, btnAccept);\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onFullScreenChange = () => {\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations(isFull);\n\n themeController.setThemeColor(isFull ? '#000000' : undefined);\n\n this.resizeVideoContainers();\n }\n };\n\n private createVideoContainer(video: HTMLVideoElement) {\n const _className = className + '-video';\n const container = document.createElement('div');\n container.classList.add(_className + '-container');\n\n video.classList.add(_className);\n if(video.paused) {\n video.play();\n }\n\n attachClickEvent(container, () => {\n if(!container.classList.contains('small')) {\n return;\n }\n\n const big = Object.values(this.videoContainers).find((container) => !container.classList.contains('small'));\n big.classList.add('small');\n big.style.cssText = container.style.cssText;\n container.classList.remove('small');\n container.style.cssText = '';\n\n this.resizeVideoContainers();\n });\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(_className + '-blur');\n\n container.append(canvas, video);\n\n return container;\n }\n\n private updateInstance() {\n const {instance} = this;\n const {connectionState} = instance;\n if(connectionState === CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.btnVideo.classList.add('disabled');\n\n this.hide();\n return;\n }\n\n const isPendingIncoming = !instance.isOutgoing && connectionState === CALL_STATE.PENDING;\n this.declineI18nElement.compareAndUpdate({\n key: connectionState === CALL_STATE.PENDING ? 'Call.Decline' : 'Call.End'\n });\n this.btnAccept.classList.toggle('disable', !isPendingIncoming);\n this.btnAccept.classList.toggle('hide-me', !isPendingIncoming);\n this.container.classList.toggle('two-button-rows', isPendingIncoming);\n\n const isMuted = instance.isMuted;\n const onFrame = () => {\n this.btnMute.firstElementChild.classList.toggle('active', isMuted);\n };\n\n const player = this.microphoneIcon.getItem().player;\n this.microphoneIcon.setState(!isMuted, !isMuted, onFrame);\n if(!player) {\n onFrame();\n }\n\n this.muteI18nElement.compareAndUpdate({\n key: isMuted ? 'VoipUnmute' : 'Call.Mute'\n });\n\n const isSharingVideo = instance.isSharingVideo;\n this.btnVideo.firstElementChild.classList.toggle('active', isSharingVideo);\n\n const isSharingScreen = instance.isSharingScreen;\n this.btnScreen.firstElementChild.classList.toggle('active', isSharingScreen);\n\n const outputState = instance.getMediaState('output');\n\n SetTransition({\n element: this.partyMutedState,\n className: 'is-visible',\n forwards: !!outputState?.muted,\n duration: 300\n });\n\n const containers = this.videoContainers;\n const oldContainers = {...containers};\n ['input' as const, 'output' as const].forEach((type) => {\n const mediaState = instance.getMediaState(type);\n const video = instance.getVideoElement(type) as HTMLVideoElement;\n\n const hasFrame = !!(video && video.videoWidth && video.videoHeight);\n if(video && !hasFrame && !video.dataset.hasPromise) {\n video.dataset.hasPromise = '1';\n // container.classList.add('hide');\n onMediaLoad(video).then(() => {\n delete video.dataset.hasPromise;\n this.updateInstance();\n // this.resizeVideoContainers();\n // container.classList.remove('hide');\n });\n }\n\n const isActive = !!video && hasFrame && !!(mediaState && (mediaState.videoState === 'active' || mediaState.screencastState === 'active'));\n let videoContainer = containers[type];\n\n if(isActive && video && !videoContainer) {\n videoContainer = containers[type] = this.createVideoContainer(video);\n this.container.append(videoContainer);\n }\n\n if(!isActive && videoContainer) {\n videoContainer.remove();\n delete containers[type];\n }\n });\n\n {\n const input = containers.input;\n const output = containers.output;\n if(Object.keys(oldContainers).length !== Object.keys(containers).length && input) {\n input.classList.toggle('small', !!output);\n }\n\n if(output && !input) {\n output.classList.remove('small');\n }\n }\n\n this.resizeVideoContainers();\n\n this.container.classList.toggle('no-video', !Object.keys(containers).length);\n\n if(!this.emojisSubtitle.textContent && connectionState < CALL_STATE.EXCHANGING_KEYS) {\n Promise.resolve(instance.getEmojisFingerprint()).then((emojis) => {\n replaceContent(this.emojisSubtitle, wrapEmojiText(emojis.join('')));\n });\n }\n\n this.setDescription();\n }\n\n private resizeVideoContainers() {\n Object.values(this.videoContainers).forEach((container) => {\n const isSmall = container.classList.contains('small');\n if(isSmall) {\n const video = container.querySelector('video');\n const popupWidth = this.movablePanel.state;\n const MAX_WIDTH_PX = 240;\n const MAX_HEIGHT_PX = 240;\n\n const isVertical = video.videoHeight > video.videoWidth;\n const MAX_SIZE = isVertical ? MAX_HEIGHT_PX : MAX_WIDTH_PX;\n\n const biggestSideSize = 1 / 3 * (isFullScreen() ? 0xFFFF : (isVertical ? popupWidth.height : popupWidth.width));\n const widthRatio = isVertical ? video.videoWidth / video.videoHeight : 1;\n const heightRatio = isVertical ? 1 : video.videoHeight / video.videoWidth;\n container.style.width = biggestSideSize * widthRatio + 'px';\n container.style.height = biggestSideSize * heightRatio + 'px';\n container.style.maxWidth = MAX_SIZE * widthRatio + 'px';\n container.style.maxHeight = MAX_SIZE * heightRatio + 'px';\n } else {\n container.style.cssText = '';\n }\n });\n }\n\n private setDescription() {\n this.description.update(this.instance);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport GROUP_CALL_STATE from '../lib/calls/groupCallState';\nimport rootScope from '../lib/rootScope';\nimport ButtonIcon from './buttonIcon';\nimport TopbarWeave from './topbarWeave';\nimport SetTransition from './singleTransition';\nimport PopupGroupCall from './groupCall';\nimport GroupCallDescriptionElement from './groupCall/description';\nimport GroupCallTitleElement from './groupCall/title';\nimport PopupElement from './popups';\nimport throttle from '../helpers/schedulers/throttle';\nimport GroupCallInstance from '../lib/calls/groupCallInstance';\nimport CALL_STATE from '../lib/calls/callState';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport PeerTitle from './peerTitle';\nimport CallDescriptionElement from './call/description';\nimport PopupCall from './call';\nimport GroupCallMicrophoneIconMini from './groupCall/microphoneIconMini';\nimport CallInstance from '../lib/calls/callInstance';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport groupCallsController from '../lib/calls/groupCallsController';\nimport StreamManager from '../lib/calls/streamManager';\nimport callsController from '../lib/calls/callsController';\n\nfunction convertCallStateToGroupState(state: CALL_STATE, isMuted: boolean) {\n switch(state) {\n case CALL_STATE.CLOSING:\n case CALL_STATE.CLOSED:\n return GROUP_CALL_STATE.CLOSED;\n case CALL_STATE.CONNECTED:\n return isMuted ? GROUP_CALL_STATE.MUTED : GROUP_CALL_STATE.UNMUTED;\n default:\n return GROUP_CALL_STATE.CONNECTING;\n }\n}\n\nconst CLASS_NAME = 'topbar-call';\n\nexport default class TopbarCall {\n public container: HTMLElement;\n private listenerSetter: ListenerSetter;\n private weave: TopbarWeave;\n private center: HTMLDivElement;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallMicrophoneIconMini: GroupCallMicrophoneIconMini;\n private callDescription: CallDescriptionElement;\n\n private currentDescription: GroupCallDescriptionElement | CallDescriptionElement;\n\n private instance: GroupCallInstance | any/* CallInstance */;\n private instanceListenerSetter: ListenerSetter;\n\n constructor(\n private managers: AppManagers\n ) {\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n listenerSetter.add(callsController)('instance', ({instance}) => {\n if(!this.instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(callsController)('accepting', (instance) => {\n if(this.instance !== instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(groupCallsController)('instance', (instance) => {\n this.updateInstance(instance);\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n const instance = groupCallsController.groupCall;\n if(instance?.id === groupCall.id) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(StreamManager.ANALYSER_LISTENER)('amplitude', ({amplitudes, type}) => {\n const {weave} = this;\n if(!amplitudes.length || !weave/* || type !== 'input' */) return;\n\n let max = 0;\n for(let i = 0; i < amplitudes.length; ++i) {\n const {type, value} = amplitudes[i];\n max = value > max ? value : max;\n }\n\n weave.setAmplitude(max);\n });\n }\n\n private onState = () => {\n this.updateInstance(this.instance);\n };\n\n private clearCurrentInstance() {\n if(!this.instance) return;\n this.center.textContent = '';\n\n if(this.currentDescription) {\n this.currentDescription.detach();\n this.currentDescription = undefined;\n }\n\n this.instance = undefined;\n this.instanceListenerSetter.removeAll();\n }\n\n private updateInstance(instance: TopbarCall['instance']) {\n if(this.construct) {\n this.construct();\n this.construct = undefined;\n }\n\n const isChangingInstance = this.instance !== instance;\n if(isChangingInstance) {\n this.clearCurrentInstance();\n\n this.instance = instance;\n this.instanceListenerSetter = new ListenerSetter();\n\n this.instanceListenerSetter.add(instance as GroupCallInstance)('state', this.onState);\n\n if(instance instanceof GroupCallInstance) {\n this.currentDescription = this.groupCallDescription;\n } else {\n this.currentDescription = this.callDescription;\n this.instanceListenerSetter.add(instance)('muted', this.onState);\n }\n\n this.container.classList.toggle('is-call', !(instance instanceof GroupCallInstance));\n }\n\n const isMuted = this.instance.isMuted;\n const state = instance instanceof GroupCallInstance ? instance.state : convertCallStateToGroupState(instance.connectionState, isMuted);\n\n const {weave} = this;\n\n weave.componentDidMount();\n\n const isClosed = state === GROUP_CALL_STATE.CLOSED;\n if((!document.body.classList.contains('is-calling') || isChangingInstance) || isClosed) {\n if(isClosed) {\n weave.setAmplitude(0);\n }\n\n SetTransition({\n element: document.body,\n className: 'is-calling',\n forwards: !isClosed,\n duration: 250,\n onTransitionEnd: isClosed ? () => {\n weave.componentWillUnmount();\n\n this.clearCurrentInstance();\n } : undefined\n });\n }\n\n if(isClosed) {\n return;\n }\n\n weave.setCurrentState(state, true);\n // if(state === GROUP_CALL_STATE.CONNECTING) {\n // weave.setCurrentState(state, true);\n // } else {\n // /* var a = 0;\n // animate(() => {\n // a += 0.1;\n // if(a > 1) a = 0;\n // weave.setAmplitude(a);\n // return true;\n // });\n // weave.setAmplitude(1); */\n // weave.setCurrentState(state, true);\n // }\n\n this.setTitle(instance);\n this.setDescription(instance);\n this.groupCallMicrophoneIconMini.setState(!isMuted);\n }\n\n private setDescription(instance: TopbarCall['instance']) {\n return this.currentDescription.update(instance as any);\n }\n\n private setTitle(instance: TopbarCall['instance']) {\n if(instance instanceof GroupCallInstance) {\n return this.groupCallTitle.update(instance);\n } else {\n replaceContent(this.center, new PeerTitle({peerId: instance.interlocutorUserId.toPeerId()}).element);\n }\n }\n\n private construct() {\n const {listenerSetter} = this;\n const container = this.container = document.createElement('div');\n container.classList.add('sidebar-header', CLASS_NAME + '-container');\n\n const left = document.createElement('div');\n left.classList.add(CLASS_NAME + '-left');\n\n const groupCallMicrophoneIconMini = this.groupCallMicrophoneIconMini = new GroupCallMicrophoneIconMini();\n\n const mute = ButtonIcon();\n mute.append(groupCallMicrophoneIconMini.container);\n left.append(mute);\n\n const throttledMuteClick = throttle(() => {\n this.instance.toggleMuted();\n }, 600, true);\n\n attachClickEvent(mute, (e) => {\n cancelEvent(e);\n throttledMuteClick();\n }, {listenerSetter});\n\n const center = this.center = document.createElement('div');\n center.classList.add(CLASS_NAME + '-center');\n\n this.groupCallTitle = new GroupCallTitleElement(center);\n this.groupCallDescription = new GroupCallDescriptionElement(left);\n\n this.callDescription = new CallDescriptionElement(left);\n\n const right = document.createElement('div');\n right.classList.add(CLASS_NAME + '-right');\n\n const end = ButtonIcon('endcall_filled');\n right.append(end);\n\n attachClickEvent(end, (e) => {\n cancelEvent(e);\n\n const {instance} = this;\n if(!instance) {\n return;\n }\n\n if(instance instanceof GroupCallInstance) {\n instance.hangUp();\n } else {\n instance.hangUp('phoneCallDiscardReasonHangup');\n }\n }, {listenerSetter});\n\n attachClickEvent(container, () => {\n if(this.instance instanceof GroupCallInstance) {\n if(PopupElement.getPopups(PopupGroupCall).length) {\n return;\n }\n\n new PopupGroupCall().show();\n } else if(this.instance instanceof CallInstance) {\n const popups = PopupElement.getPopups(PopupCall);\n if(popups.find((popup) => popup.getCallInstance() === this.instance)) {\n return;\n }\n\n new PopupCall(this.instance).show();\n }\n }, {listenerSetter});\n\n container.append(left, center, right);\n\n const weave = this.weave = new TopbarWeave();\n const weaveContainer = weave.render(CLASS_NAME + '-weave');\n container.prepend(weaveContainer);\n\n document.getElementById('column-center').prepend(container);\n weave.componentDidMount();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getPeerTitle from '../../components/wrappers/getPeerTitle';\nimport wrapMessageForReply from '../../components/wrappers/messageForReply';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {FontFamily} from '../../config/font';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport IS_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport idleController from '../../helpers/idleController';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport tsNow from '../../helpers/tsNow';\nimport {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport I18n, {FormatterArguments, LangPackKey} from '../langPack';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport singleInstance from '../mtproto/singleInstance';\nimport webPushApiManager, {PushSubscriptionNotify} from '../mtproto/webPushApiManager';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\nimport rootScope from '../rootScope';\nimport appImManager from './appImManager';\nimport appRuntimeManager from './appRuntimeManager';\nimport {AppManagers} from './managers';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport getPeerId from './utils/peers/getPeerId';\n\ntype MyNotification = Notification & {\n hidden?: boolean,\n show?: () => void,\n};\n\nexport type NotifyOptions = Partial<{\n tag: string;\n image: string;\n key: string;\n title: string;\n message: string;\n silent: boolean;\n onclick: () => void;\n noIncrement: boolean;\n}>;\n\nexport type NotificationSettings = {\n nodesktop: boolean,\n volume: number,\n novibrate: boolean,\n nopreview: boolean,\n nopush: boolean,\n nosound: boolean\n};\n\nexport class UiNotificationsManager {\n private notificationsUiSupport: boolean;\n private notificationsShown: {[key: string]: MyNotification | true} = {};\n private notificationIndex = 0;\n private notificationsCount = 0;\n private soundsPlayed: {[tag: string]: number} = {};\n private vibrateSupport = IS_VIBRATE_SUPPORTED;\n private nextSoundAt: number;\n private prevSoundVolume: number;\n\n private faviconElements = Array.from(document.head.querySelectorAll('link[rel=\"icon\"], link[rel=\"alternate icon\"]'));\n\n private titleBackup = document.title;\n private titleChanged = false;\n private titleInterval: number;\n private prevFavicon: string;\n\n private notifySoundEl: HTMLElement;\n\n private stopped = false;\n\n private topMessagesDeferred: CancellablePromise;\n\n private settings: NotificationSettings = {} as any;\n\n private registeredDevice: any;\n private pushInited = false;\n\n private managers: AppManagers;\n private setAppBadge: (contents?: any) => Promise;\n\n construct(managers: AppManagers) {\n this.managers = managers;\n\n navigator.vibrate = navigator.vibrate || (navigator as any).mozVibrate || (navigator as any).webkitVibrate;\n this.setAppBadge = (navigator as any).setAppBadge && (navigator as any).setAppBadge.bind(navigator);\n this.setAppBadge && this.setAppBadge(0);\n\n this.notificationsUiSupport = ('Notification' in window) || ('mozNotification' in navigator);\n\n this.notifySoundEl = document.createElement('div');\n this.notifySoundEl.id = 'notify-sound';\n document.body.append(this.notifySoundEl);\n\n this.topMessagesDeferred = deferredPromise();\n\n singleInstance.addEventListener('deactivated', () => {\n this.stop();\n });\n\n singleInstance.addEventListener('activated', () => {\n if(this.stopped) {\n this.start();\n }\n });\n\n idleController.addEventListener('change', (idle) => {\n if(this.stopped) {\n return;\n }\n\n if(!idle) {\n this.clear();\n }\n\n this.toggleToggler();\n });\n\n rootScope.addEventListener('notification_reset', (peerString) => {\n this.soundReset(peerString);\n });\n\n rootScope.addEventListener('notification_cancel', (str) => {\n this.cancel(str);\n });\n\n if(this.setAppBadge) {\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 0) {\n this.setAppBadge(folder.unreadUnmutedPeerIds.size);\n }\n });\n }\n\n webPushApiManager.addEventListener('push_init', (tokenData) => {\n this.pushInited = true;\n if(!this.settings.nodesktop && !this.settings.nopush) {\n if(tokenData) {\n this.registerDevice(tokenData);\n } else {\n webPushApiManager.subscribe();\n }\n } else {\n this.unregisterDevice(tokenData);\n }\n });\n webPushApiManager.addEventListener('push_subscribe', (tokenData) => {\n this.registerDevice(tokenData);\n });\n webPushApiManager.addEventListener('push_unsubscribe', (tokenData) => {\n this.unregisterDevice(tokenData);\n });\n\n rootScope.addEventListener('dialogs_multiupdate', () => {\n // unregisterTopMsgs()\n this.topMessagesDeferred.resolve();\n }, {once: true});\n\n webPushApiManager.addEventListener('push_notification_click', (notificationData) => {\n if(notificationData.action === 'push_settings') {\n /* this.topMessagesDeferred.then(() => {\n $modal.open({\n templateUrl: templateUrl('settings_modal'),\n controller: 'SettingsModalController',\n windowClass: 'settings_modal_window mobile_modal',\n backdrop: 'single'\n })\n }); */\n return;\n }\n\n if(notificationData.action === 'mute1d') {\n this.managers.apiManager.invokeApi('account.updateDeviceLocked', {\n period: 86400\n }).then(() => {\n // var toastData = toaster.pop({\n // type: 'info',\n // body: _('push_action_mute1d_success'),\n // bodyOutputType: 'trustedHtml',\n // clickHandler: () => {\n // toaster.clear(toastData)\n // },\n // showCloseButton: false\n // })\n });\n\n return;\n }\n\n const peerId = notificationData.custom && notificationData.custom.peerId.toPeerId();\n console.log('click', notificationData, peerId);\n if(peerId) {\n this.topMessagesDeferred.then(async() => {\n if(notificationData.custom.channel_id &&\n !(await this.managers.appChatsManager.hasChat(notificationData.custom.channel_id))) {\n return;\n }\n\n if(peerId.isUser() && !(await this.managers.appUsersManager.hasUser(peerId))) {\n return;\n }\n\n appImManager.setInnerPeer({\n peerId,\n lastMsgId: generateMessageId(+notificationData.custom.msg_id)\n });\n });\n }\n });\n }\n\n public async buildNotification({\n message,\n fwdCount,\n peerReaction,\n peerTypeNotifySettings\n }: {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n }) {\n const peerId = message.peerId;\n const isAnyChat = peerId.isAnyChat();\n const notification: NotifyOptions = {};\n const [peerString, isForum = false] = await Promise.all([\n this.managers.appPeersManager.getPeerString(peerId),\n isAnyChat && this.managers.appPeersManager.isForum(peerId)\n ]);\n let notificationMessage: string;\n let wrappedMessage = false;\n\n if(peerTypeNotifySettings.show_previews) {\n if(message._ === 'message' && message.fwd_from && fwdCount > 1) {\n notificationMessage = I18n.format('Notifications.Forwarded', true, [fwdCount]);\n } else {\n notificationMessage = await wrapMessageForReply({message, plain: true});\n\n const reaction = peerReaction?.reaction;\n if(reaction?._ === 'reactionEmoji') {\n const langPackKey: LangPackKey = /* isAnyChat ? 'Notification.Group.Reacted' : */'Notification.Contact.Reacted';\n const args: FormatterArguments = [\n fixEmoji(reaction.emoticon), // can be plain heart\n notificationMessage\n ];\n\n /* if(isAnyChat) {\n args.unshift(appPeersManager.getPeerTitle(message.fromId, true));\n } */\n\n notificationMessage = I18n.format(langPackKey, true, args);\n } else {\n wrappedMessage = true;\n }\n }\n } else {\n notificationMessage = I18n.format('Notifications.New', true);\n }\n\n if(peerReaction) {\n notification.noIncrement = true;\n notification.silent = true;\n }\n\n const threadId = isForum ? getMessageThreadId(message, isForum) : undefined;\n const notificationFromPeerId = peerReaction ? getPeerId(peerReaction.peer_id) : message.fromId;\n notification.title = await getPeerTitle({peerId, plainText: true, managers: this.managers, threadId: threadId});\n if(isForum) {\n const peerTitle = await getPeerTitle({peerId, plainText: true, managers: this.managers});\n notification.title += ` (${peerTitle})`;\n\n if(wrappedMessage && notificationFromPeerId !== message.peerId) {\n notificationMessage = await getPeerTitle({peerId: notificationFromPeerId, plainText: true, managers: this.managers}) +\n ': ' + notificationMessage;\n }\n } else if(isAnyChat && notificationFromPeerId !== message.peerId) {\n notification.title = await getPeerTitle({peerId: notificationFromPeerId, plainText: true, managers: this.managers}) +\n ' @ ' +\n notification.title;\n }\n\n notification.title = wrapPlainText(notification.title);\n\n notification.onclick = () => {\n appImManager.setInnerPeer({peerId, lastMsgId: message.mid, threadId});\n };\n\n notification.message = notificationMessage;\n notification.key = 'msg' + message.mid;\n notification.tag = peerString;\n notification.silent = true;// message.pFlags.silent || false;\n\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small').then((url) => {\n // ! WARNING, message can be already read\n if(message.pFlags.unread || peerReaction) {\n notification.image = url;\n this.notify(notification);\n }\n });\n } else {\n this.notify(notification);\n }\n }\n\n private toggleToggler(enable = idleController.isIdle) {\n if(IS_MOBILE) return;\n\n const resetTitle = (isBlink?: boolean) => {\n this.titleChanged = false;\n document.title = this.titleBackup;\n this.setFavicon();\n };\n\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n\n if(!enable) {\n resetTitle();\n } else {\n this.titleInterval = window.setInterval(() => {\n const count = this.notificationsCount;\n if(!count) {\n this.toggleToggler(false);\n } else if(this.titleChanged) {\n resetTitle(true);\n } else {\n this.titleChanged = true;\n document.title = I18n.format('Notifications.Count', true, [count]);\n // this.setFavicon('assets/img/favicon_unread.ico');\n\n // fetch('assets/img/favicon.ico')\n // .then((res) => res.blob())\n // .then((blob) => {\n // const img = document.createElement('img');\n // img.src = URL.createObjectURL(blob);\n\n const canvas = document.createElement('canvas');\n canvas.width = 32 * window.devicePixelRatio;\n canvas.height = canvas.width;\n\n const ctx = canvas.getContext('2d');\n ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, 2 * Math.PI, false);\n ctx.fillStyle = '#3390ec';\n ctx.fill();\n\n let fontSize = 24;\n let str = '' + count;\n if(count < 10) {\n fontSize = 22;\n } else if(count < 100) {\n fontSize = 20;\n } else {\n str = '99+';\n fontSize = 16;\n }\n\n fontSize *= window.devicePixelRatio;\n\n ctx.font = `700 ${fontSize}px ${FontFamily}`;\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillStyle = 'white';\n ctx.fillText(str, canvas.width / 2, canvas.height * .5625);\n\n /* const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height); */\n\n this.setFavicon(canvas.toDataURL());\n // });\n }\n }, 1000);\n }\n }\n\n private setFavicon(href?: string) {\n if(this.prevFavicon === href) {\n return;\n }\n\n this.prevFavicon = href;\n this.faviconElements.forEach((element, idx, arr) => {\n const link = element.cloneNode() as HTMLLinkElement;\n\n if(!link.dataset.href) {\n link.dataset.href = link.href;\n }\n\n href ??= link.dataset.href;\n link.href = href;\n element.replaceWith(arr[idx] = link);\n });\n }\n\n public notify(data: NotifyOptions) {\n // console.log('notify', data, rootScope.idle.isIDLE, this.notificationsUiSupport, this.stopped);\n\n if(this.stopped) {\n return;\n }\n\n // FFOS Notification blob src bug workaround\n /* if(Config.Navigator.ffos && !Config.Navigator.ffos2p) {\n data.image = 'https://telegram.org/img/t_logo.png'\n }\n else if (data.image && !angular.isString(data.image)) {\n if (Config.Navigator.ffos2p) {\n FileManager.getDataUrl(data.image, 'image/jpeg').then(function (url) {\n data.image = url\n notify(data)\n })\n return false\n } else {\n data.image = FileManager.getUrl(data.image, 'image/jpeg')\n }\n }\n else */ if(!data.image) {\n data.image = 'assets/img/logo_filled_rounded.png';\n }\n // console.log('notify image', data.image)\n\n if(!data.noIncrement) {\n ++this.notificationsCount;\n }\n\n if(!this.titleInterval) {\n this.toggleToggler();\n }\n\n const idx = ++this.notificationIndex;\n const key = data.key || 'k' + idx;\n this.notificationsShown[key] = true;\n\n const now = tsNow();\n if(this.settings.volume > 0 && !this.settings.nosound/* &&\n (\n !data.tag ||\n !this.soundsPlayed[data.tag] ||\n now > this.soundsPlayed[data.tag] + 60000\n ) */\n ) {\n this.testSound(this.settings.volume);\n this.soundsPlayed[data.tag] = now;\n }\n\n if(!this.notificationsUiSupport ||\n 'Notification' in window && Notification.permission !== 'granted') {\n return false;\n }\n\n if(this.settings.nodesktop) {\n if(this.vibrateSupport && !this.settings.novibrate) {\n navigator.vibrate([200, 100, 200]);\n return;\n }\n\n return;\n }\n\n let notification: MyNotification;\n\n if('Notification' in window) {\n try {\n if(data.tag) {\n for(const i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n if(typeof(notification) !== 'boolean' && notification.tag === data.tag) {\n notification.hidden = true;\n }\n }\n }\n\n notification = new Notification(data.title, {\n icon: data.image || '',\n body: data.message || '',\n tag: data.tag || '',\n silent: data.silent || false\n });\n\n // console.log('notify constructed notification');\n } catch(e) {\n this.notificationsUiSupport = false;\n webPushApiManager.setLocalNotificationsDisabled();\n return;\n }\n } /* else if('mozNotification' in navigator) {\n notification = navigator.mozNotification.createNotification(data.title, data.message || '', data.image || '')\n } else if(notificationsMsSiteMode) {\n window.external.msSiteModeClearIconOverlay()\n window.external.msSiteModeSetIconOverlay('img/icons/icon16.png', data.title)\n window.external.msSiteModeActivate()\n notification = {\n index: idx\n }\n } */ else {\n return;\n }\n\n notification.onclick = () => {\n notification.close();\n appRuntimeManager.focus();\n this.clear();\n if(data.onclick) {\n data.onclick();\n }\n };\n\n notification.onclose = () => {\n if(!notification.hidden) {\n delete this.notificationsShown[key];\n this.clear();\n }\n };\n\n if(notification.show) {\n notification.show();\n }\n this.notificationsShown[key] = notification;\n\n if(!IS_MOBILE) {\n setTimeout(() => {\n this.hide(key);\n }, 8000);\n }\n }\n\n public updateLocalSettings = () => {\n const keys = ['notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush'];\n const promises = keys.map(() => undefined);\n // const promises = keys.map((k) => stateStorage.get(k as any));\n Promise.all(promises)\n .then((updSettings) => {\n this.settings.nodesktop = updSettings[0];\n this.settings.volume = updSettings[1] === undefined ? 0.5 : updSettings[1];\n this.settings.novibrate = updSettings[2];\n this.settings.nopreview = updSettings[3];\n this.settings.nopush = updSettings[4];\n\n if(this.pushInited) {\n const needPush = !this.settings.nopush && !this.settings.nodesktop && webPushApiManager.isAvailable || false;\n const hasPush = this.registeredDevice !== false;\n if(needPush !== hasPush) {\n if(needPush) {\n webPushApiManager.subscribe();\n } else {\n webPushApiManager.unsubscribe();\n }\n }\n }\n\n webPushApiManager.setSettings(this.settings);\n });\n\n apiManagerProxy.getState().then((state) => {\n this.settings.nosound = !state.settings.notifications.sound;\n });\n }\n\n public getLocalSettings() {\n return this.settings;\n }\n\n private hide(key: string) {\n const notification = this.notificationsShown[key];\n if(notification && typeof(notification) !== 'boolean') {\n try {\n if(notification.close) {\n notification.hidden = true;\n notification.close();\n }\n } catch(e) {}\n }\n }\n\n public soundReset(tag: string) {\n delete this.soundsPlayed[tag];\n }\n\n private requestPermission = () => {\n Notification.requestPermission();\n window.removeEventListener('click', this.requestPermission);\n };\n\n public testSound(volume: number) {\n const now = tsNow();\n if(this.nextSoundAt && now < this.nextSoundAt && this.prevSoundVolume === volume) {\n return;\n }\n\n this.nextSoundAt = now + 1000;\n this.prevSoundVolume = volume;\n const filename = 'assets/audio/notification.mp3';\n const audio = document.createElement('audio');\n audio.autoplay = true;\n audio.setAttribute('mozaudiochannel', 'notification');\n audio.volume = volume;\n audio.innerHTML = `\n \n \n `;\n this.notifySoundEl.append(audio);\n\n audio.addEventListener('ended', () => {\n audio.remove();\n }, {once: true});\n }\n\n public cancel(key: string) {\n const notification = this.notificationsShown[key];\n if(notification) {\n if(this.notificationsCount > 0) {\n --this.notificationsCount;\n }\n\n try {\n if(typeof(notification) !== 'boolean' && notification.close) {\n notification.hidden = true;\n notification.close();\n }/* else if(notificationsMsSiteMode &&\n notification.index === notificationIndex) {\n window.external.msSiteModeClearIconOverlay()\n } */\n } catch(e) {}\n\n delete this.notificationsShown[key];\n }\n }\n\n public clear() {\n /* if(notificationsMsSiteMode) {\n window.external.msSiteModeClearIconOverlay()\n } else { */\n for(const i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n try {\n if(typeof(notification) !== 'boolean' && notification.close) {\n notification.close();\n }\n } catch(e) {}\n }\n /* } */\n this.notificationsShown = {};\n this.notificationsCount = 0;\n\n webPushApiManager.hidePushNotifications();\n }\n\n public start() {\n this.updateLocalSettings();\n rootScope.addEventListener('settings_updated', this.updateLocalSettings);\n webPushApiManager.start();\n\n if(!this.notificationsUiSupport) {\n return false;\n }\n\n if('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\n window.addEventListener('click', this.requestPermission);\n }\n\n try {\n if('onbeforeunload' in window) {\n window.addEventListener('beforeunload', this.clear);\n }\n } catch(e) {}\n }\n\n private stop() {\n this.clear();\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n this.setFavicon();\n this.stopped = true;\n }\n\n private registerDevice(tokenData: PushSubscriptionNotify) {\n if(this.registeredDevice && deepEqual(this.registeredDevice, tokenData)) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.registerDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: [],\n app_sandbox: false,\n secret: new Uint8Array()\n }).then(() => {\n this.registeredDevice = tokenData;\n }, (error) => {\n error.handled = true;\n });\n }\n\n private unregisterDevice(tokenData: PushSubscriptionNotify) {\n if(!this.registeredDevice) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.unregisterDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: []\n }).then(() => {\n this.registeredDevice = false;\n }, (error) => {\n error.handled = true;\n });\n }\n}\n\nconst uiNotificationsManager = new UiNotificationsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.uiNotificationsManager = uiNotificationsManager);\nexport default uiNotificationsManager;\n","export default async function getFilesFromEvent(e: ClipboardEvent | DragEvent, onlyTypes = false): Promise {\n const files: any[] = [];\n\n const scanFiles = async(entry: any, item: DataTransferItem) => {\n if(entry.isDirectory) {\n const directoryReader = entry.createReader();\n await new Promise((resolve, reject) => {\n directoryReader.readEntries(async(entries: any) => {\n for(const entry of entries) {\n await scanFiles(entry, item);\n }\n\n resolve();\n });\n });\n } else if(entry) {\n if(onlyTypes) {\n files.push(entry.type);\n } else {\n const itemFile = item.getAsFile(); // * Safari can't handle entry.file with pasting\n const file = entry instanceof File ?\n entry :\n (\n entry instanceof DataTransferItem ?\n entry.getAsFile() :\n await new Promise((resolve, reject) => entry.file(resolve, (err: any) => resolve(itemFile)))\n );\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got file', item, file);\n } */\n\n if(!file) return;\n files.push(file);\n }\n }\n };\n\n if(e instanceof DragEvent && e.dataTransfer.files && !e.dataTransfer.items) {\n for(let i = 0; i < e.dataTransfer.files.length; i++) {\n const file = e.dataTransfer.files[i];\n files.push(onlyTypes ? file.type : file);\n }\n } else {\n // @ts-ignore\n const items = (e.dataTransfer || e.clipboardData || e.originalEvent.clipboardData).items;\n\n const promises: Promise[] = [];\n for(let i = 0; i < items.length; ++i) {\n const item: DataTransferItem = items[i];\n if(item.kind === 'file') {\n const entry = (onlyTypes ? item : item.webkitGetAsEntry()) || item.getAsFile();\n promises.push(scanFiles(entry, item));\n }\n }\n\n await Promise.all(promises);\n }\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got files:', e, files);\n } */\n\n return files;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {T_ME_PREFIXES} from '../lib/mtproto/mtproto_config';\nimport cancelEvent from './dom/cancelEvent';\nimport parseUriParams from './string/parseUriParams';\n\nexport default function addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers' | 'voicechat' | 'joinchat' | 'join' | 'invoice' |\n 'addemoji',\n protocol?: 'tg',\n callback: (params: Params, element?: HTMLAnchorElement) => boolean | any,\n noPathnameParams?: boolean,\n noUriParams?: boolean,\n noCancelEvent?: boolean\n}) {\n (window as any)[(options.protocol ? options.protocol + '_' : '') + options.name] = (element?: HTMLAnchorElement/* , e: Event */) => {\n !options.noCancelEvent && cancelEvent(null);\n\n let href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n const u = new URL(href);\n const match = u.host.match(/(.+?)\\.t(?:elegram)?\\.me/);\n if(match && !T_ME_PREFIXES.has(match[1])) {\n u.pathname = match[1] + (u.pathname === '/' ? '' : u.pathname);\n href = u.toString();\n }\n\n if(!options.noPathnameParams) pathnameParams = new URL(href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {GroupCallId, MyGroupCall} from './appGroupCallsManager';\nimport type GroupCallInstance from '../calls/groupCallInstance';\nimport type CallInstance from '../calls/callInstance';\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport appSidebarLeft, {LEFT_COLUMN_ACTIVE_CLASSNAME} from '../../components/sidebarLeft';\nimport appSidebarRight, {RIGHT_COLUMN_ACTIVE_CLASSNAME} from '../../components/sidebarRight';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {logger, LogTypes} from '../logger';\nimport rootScope from '../rootScope';\nimport Chat, {ChatType} from '../../components/chat/chat';\nimport PopupNewMedia, {getCurrentNewMediaPopup} from '../../components/popups/newMedia';\nimport MarkupTooltip from '../../components/chat/markupTooltip';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport SetTransition from '../../components/singleTransition';\nimport ChatDragAndDrop from '../../components/chat/dragAndDrop';\nimport {doubleRaf} from '../../helpers/schedulers';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport useHeavyAnimationCheck, {dispatchHeavyAnimationEvent} from '../../hooks/useHeavyAnimationCheck';\nimport stateStorage from '../stateStorage';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport appNavigationController from '../../components/appNavigationController';\nimport AppPrivateSearchTab from '../../components/sidebarRight/tabs/search';\nimport I18n, {i18n, join, LangPackKey} from '../langPack';\nimport {ChatFull, ChatInvite, ChatParticipant, ChatParticipants, Message, MessageAction, MessageMedia, SendMessageAction, User, Chat as MTChat, UrlAuthResult, WallPaper} from '../../layer';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer, {PopupPeerCheckboxOptions} from '../../components/popups/peer';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport disableTransition from '../../helpers/dom/disableTransition';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport PopupElement from '../../components/popups';\nimport singleInstance, {InstanceDeactivateReason, SingleInstance} from '../mtproto/singleInstance';\nimport PopupStickers from '../../components/popups/stickers';\nimport PopupJoinChatInvite from '../../components/popups/joinChatInvite';\nimport {toast, toastNew} from '../../components/toast';\nimport debounce from '../../helpers/schedulers/debounce';\nimport pause from '../../helpers/schedulers/pause';\nimport {InternalLink, InternalLinkTypeMap, INTERNAL_LINK_TYPE} from './internalLink';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport {ONE_DAY} from '../../helpers/date';\nimport TopbarCall from '../../components/topbarCall';\nimport confirmationPopup from '../../components/confirmationPopup';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport {CallType} from '../calls/types';\nimport {Modify, SendMessageEmojiInteractionData} from '../../types';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport {simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport PopupCall from '../../components/call';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport ChatBackgroundPatternRenderer from '../../components/chat/patternRenderer';\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport compareVersion from '../../helpers/compareVersion';\nimport {AppManagers} from './managers';\nimport uiNotificationsManager from './uiNotificationsManager';\nimport appMediaPlaybackController from '../../components/appMediaPlaybackController';\nimport {PHONE_NUMBER_REG_EXP} from '../richTextProcessor';\nimport wrapEmojiText from '../richTextProcessor/wrapEmojiText';\nimport wrapRichText, {CustomEmojiRendererElement, renderEmojis} from '../richTextProcessor/wrapRichText';\nimport wrapUrl from '../richTextProcessor/wrapUrl';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getUserStatusString from '../../components/wrappers/getUserStatusString';\nimport getChatMembersString from '../../components/wrappers/getChatMembersString';\nimport {STATE_INIT} from '../../config/state';\nimport CacheStorageController from '../files/cacheStorage';\nimport themeController from '../../helpers/themeController';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport appDialogsManager from './appDialogsManager';\nimport idleController from '../../helpers/idleController';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport groupCallsController from '../calls/groupCallsController';\nimport callsController from '../calls/callsController';\nimport getFilesFromEvent from '../../helpers/files/getFilesFromEvent';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport appRuntimeManager from './appRuntimeManager';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {CLICK_EVENT_NAME} from '../../helpers/dom/clickEvent';\nimport PopupPayment from '../../components/popups/payment';\nimport wrapPeerTitle from '../../components/wrappers/peerTitle';\nimport NBSP from '../../helpers/string/nbsp';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport {MiddleEllipsisElement} from '../../components/middleEllipsis';\nimport addAnchorListener from '../../helpers/addAnchorListener';\nimport parseUriParams from '../../helpers/string/parseUriParams';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {MTAppConfig} from '../mtproto/appConfig';\nimport PopupForward from '../../components/popups/forward';\n\nexport type ChatSavedPosition = {\n mids: number[],\n top: number\n};\n\nexport type ChatSetPeerOptions = {\n peerId: PeerId,\n lastMsgId?: number,\n threadId?: number,\n startParam?: string,\n stack?: number,\n commentId?: number,\n type?: ChatType\n};\n\nexport type ChatSetInnerPeerOptions = Modify;\n\nexport enum APP_TABS {\n CHATLIST,\n CHAT,\n PROFILE\n}\n\nexport class AppImManager extends EventListenerBase<{\n chat_changing: (details: {from: Chat, to: Chat}) => void,\n peer_changed: (chat: Chat) => void,\n peer_changing: (chat: Chat) => void,\n tab_changing: (tabId: number) => void\n}> {\n public columnEl = document.getElementById('column-center') as HTMLDivElement;\n public chatsContainer: HTMLElement;\n\n public offline = false;\n public updateStatusInterval = 0;\n\n public log: ReturnType;\n\n public setPeerPromise: Promise = null;\n\n private tabId: APP_TABS;\n\n public chats: Chat[] = [];\n private prevTab: HTMLElement;\n private chatsSelectTabDebounced: () => void;\n\n public markupTooltip: MarkupTooltip;\n private backgroundPromises: {[slug: string]: Promise};\n\n private topbarCall: TopbarCall;\n public emojiAnimationContainer: HTMLDivElement;\n\n private lastBackgroundUrl: string;\n\n public managers: AppManagers;\n\n public cacheStorage = new CacheStorageController('cachedFiles');\n public customEmojiSize: MediaSize;\n\n get myId() {\n return rootScope.myId;\n }\n\n get chat(): Chat {\n return this.chats[this.chats.length - 1];\n }\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n\n const {\n apiUpdatesManager\n } = managers;\n apiUpdatesManager.attach(I18n.lastRequestedLangCode);\n\n appMediaPlaybackController.construct(managers);\n uiNotificationsManager.construct(managers);\n uiNotificationsManager.start();\n\n this.log = logger('IM', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n\n this.backgroundPromises = {};\n STATE_INIT.settings.themes.forEach((theme) => {\n const themeSettings = theme.settings;\n if(!themeSettings) {\n return;\n }\n\n const {wallpaper} = themeSettings;\n const slug = (wallpaper as WallPaper.wallPaper).slug;\n if(!slug) {\n return;\n }\n\n const url = 'assets/img/' + slug + '.svg' + (IS_FIREFOX ? '?1' : '');\n this.backgroundPromises[slug] = Promise.resolve(url);\n });\n\n this.selectTab(APP_TABS.CHATLIST);\n\n idleController.addEventListener('change', (idle) => {\n this.offline = idle;\n this.updateStatus();\n if(idle) {\n clearInterval(this.updateStatusInterval);\n } else {\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n }\n });\n\n this.chatsContainer = document.createElement('div');\n this.chatsContainer.classList.add('chats-container', 'tabs-container');\n this.chatsContainer.dataset.animation = 'navigation';\n\n this.emojiAnimationContainer = document.createElement('div');\n this.emojiAnimationContainer.classList.add('emoji-animation-container');\n this.appendEmojiAnimationContainer(mediaSizes.activeScreen);\n\n this.columnEl.append(this.chatsContainer);\n\n this.createNewChat();\n this.chatsSelectTab(this.chat.container);\n\n appNavigationController.onHashChange = this.onHashChange;\n // window.addEventListener('hashchange', this.onHashChange);\n\n this.setSettings();\n rootScope.addEventListener('settings_updated', this.setSettings);\n\n const onPremiumToggle = (isPremium: boolean) => {\n document.body.classList.toggle('is-premium', isPremium);\n };\n rootScope.addEventListener('premium_toggle', onPremiumToggle);\n onPremiumToggle(rootScope.premium);\n this.managers.rootScope.getPremium().then(onPremiumToggle);\n\n useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations2(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup();\n animationIntersector.checkAnimations2(false);\n });\n\n if(IS_FIREFOX && apiManagerProxy.oldVersion && compareVersion(apiManagerProxy.oldVersion, '1.4.3') === -1) {\n this.deleteFilesIterative((response) => {\n return response.headers.get('Content-Type') === 'image/svg+xml';\n }).then(() => {\n this.applyCurrentTheme();\n });\n } else {\n this.applyCurrentTheme();\n }\n\n // * fix simultaneous opened both sidebars, can happen when floating sidebar is opened with left sidebar\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME) &&\n document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\n appSidebarRight.toggleSidebar(false);\n }\n\n this.appendEmojiAnimationContainer(to);\n });\n\n mediaSizes.addEventListener('resize', () => {\n // const perf = performance.now();\n const rect = this.chatsContainer.getBoundingClientRect();\n ChatBackgroundPatternRenderer.resizeInstances(rect.width, rect.height).then(() => {\n // this.log.warn('resize bg time:', performance.now() - perf);\n // for(const chat of this.chats) {\n // if(chat.renderDarkPattern) {\n // chat.renderDarkPattern();\n // }\n // }\n });\n });\n\n this.addEventListener('peer_changing', (chat) => {\n this.saveChatPosition(chat);\n });\n\n rootScope.addEventListener('theme_change', () => {\n this.applyCurrentTheme();\n });\n\n rootScope.addEventListener('choosing_sticker', (choosing) => {\n this.setChoosingStickerTyping(!choosing);\n });\n\n rootScope.addEventListener('peer_title_edit', ({peerId, threadId}) => {\n if(this.chat?.peerId === peerId && !threadId && this.tabId !== undefined) {\n this.overrideHash(peerId);\n }\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const chat = this.chat;\n if(\n !chat ||\n chat.peerId !== peerId ||\n overlayCounter.isOverlayActive || (\n mediaSizes.activeScreen === ScreenSize.mobile &&\n this.tabId !== APP_TABS.CHAT\n )\n ) {\n return;\n }\n\n const typing = typings.find((typing) => typing.action._ === 'sendMessageEmojiInteraction');\n if(typing?.action?._ === 'sendMessageEmojiInteraction') {\n const action = typing.action;\n const bubble = chat.bubbles.bubbles[generateMessageId(typing.action.msg_id)];\n if(bubble && bubble.classList.contains('emoji-big') && getVisibleRect(bubble, chat.bubbles.scrollable.container)) {\n const stickerWrapper: HTMLElement = bubble.querySelector('.media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)');\n\n const data: SendMessageEmojiInteractionData = JSON.parse(action.interaction.data);\n data.a.forEach((a) => {\n setTimeout(() => {\n simulateClickEvent(stickerWrapper);\n }, a.t * 1000);\n });\n\n this.managers.appMessagesManager.setTyping(peerId, {\n _: 'sendMessageEmojiInteractionSeen',\n emoticon: action.emoticon\n });\n }\n }\n });\n\n const onInstanceDeactivated = (reason: InstanceDeactivateReason) => {\n const isUpdated = reason === 'version';\n const popup = new PopupElement('popup-instance-deactivated', {overlayClosable: true});\n const c = document.createElement('div');\n c.classList.add('instance-deactivated-container');\n (popup as any).container.replaceWith(c);\n\n const header = document.createElement('div');\n header.classList.add('header');\n header.append(i18n(isUpdated ? 'Deactivated.Version.Title' : 'Deactivated.Title'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle');\n subtitle.append(i18n(isUpdated ? 'Deactivated.Version.Subtitle' : 'Deactivated.Subtitle'));\n\n c.append(header, subtitle);\n\n document.body.classList.add('deactivated');\n\n const onClose = isUpdated ? () => {\n appRuntimeManager.reload();\n } : () => {\n document.body.classList.add('deactivated-backwards');\n\n singleInstance.activateInstance();\n\n setTimeout(() => {\n document.body.classList.remove('deactivated', 'deactivated-backwards');\n }, 333);\n };\n\n popup.addEventListener('close', onClose);\n popup.show();\n };\n\n singleInstance.addEventListener('deactivated', onInstanceDeactivated);\n if(singleInstance.deactivatedReason) {\n onInstanceDeactivated(singleInstance.deactivatedReason);\n }\n\n // remove scroll listener when setting chat to tray\n this.addEventListener('chat_changing', ({to}) => {\n this.toggleChatGradientAnimation(to);\n });\n\n rootScope.addEventListener('service_notification', (update) => {\n confirmationPopup({\n button: {langKey: 'OK', isCancel: true},\n description: wrapRichText(update.message)\n });\n });\n\n rootScope.addEventListener('payment_sent', async({peerId, mid, receiptMessage}) => {\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n if(!message) {\n return;\n }\n\n const action = receiptMessage.action as MessageAction.messageActionPaymentSent;\n toastNew({\n langPackKey: 'PaymentInfoHint',\n langPackArguments: [\n paymentsWrapCurrencyAmount(action.total_amount, action.currency),\n wrapEmojiText(((message as Message.message).media as MessageMedia.messageMediaInvoice).title)\n ]\n });\n });\n\n (window as any).onSpoilerClick = (e: MouseEvent) => {\n const spoiler = findUpClassName(e.target, 'spoiler');\n const parentElement = findUpClassName(spoiler, 'spoilers-container') || spoiler.parentElement;\n\n const className = 'is-spoiler-visible';\n const isVisible = parentElement.classList.contains(className);\n if(!isVisible) {\n cancelEvent(e);\n\n if(CLICK_EVENT_NAME !== 'click') {\n window.addEventListener('click', cancelEvent, {capture: true, once: true});\n }\n }\n\n const duration = 400 / 2;\n const showDuration = 5000;\n const useRafs = !isVisible ? 2 : 0;\n if(useRafs) {\n parentElement.classList.add('will-change');\n }\n\n const spoilerTimeout = parentElement.dataset.spoilerTimeout;\n if(spoilerTimeout !== null) {\n clearTimeout(+spoilerTimeout);\n delete parentElement.dataset.spoilerTimeout;\n }\n\n SetTransition({\n element: parentElement,\n className,\n forwards: true,\n duration,\n onTransitionEnd: () => {\n parentElement.dataset.spoilerTimeout = '' + window.setTimeout(() => {\n SetTransition({\n element: parentElement,\n className,\n forwards: false,\n duration,\n onTransitionEnd: () => {\n parentElement.classList.remove('will-change');\n delete parentElement.dataset.spoilerTimeout;\n }\n });\n }, showDuration);\n },\n useRafs\n });\n };\n\n rootScope.addEventListener('sticker_updated', ({type, faved}) => {\n if(type === 'faved') {\n toastNew({\n langPackKey: faved ? 'AddedToFavorites' : 'RemovedFromFavorites'\n });\n } else if(!faved) {\n toastNew({\n langPackKey: 'RemovedFromRecent'\n });\n }\n });\n\n apiManagerProxy.addEventListener('notificationBuild', async(options) => {\n const isForum = await this.managers.appPeersManager.isForum(options.message.peerId);\n const threadId = getMessageThreadId(options.message, isForum);\n if(this.chat.peerId === options.message.peerId && this.chat.threadId === threadId && !idleController.isIdle) {\n return;\n }\n\n uiNotificationsManager.buildNotification(options);\n });\n\n this.addEventListener('peer_changed', async({peerId}) => {\n document.body.classList.toggle('has-chat', !!peerId);\n\n this.emojiAnimationContainer.textContent = '';\n\n this.overrideHash(peerId);\n\n apiManagerProxy.updateTabState('chatPeerIds', this.chats.map((chat) => chat.peerId).filter(Boolean));\n });\n\n // stateStorage.get('chatPositions').then((c) => {\n stateStorage.setToCache('chatPositions', /* c || */{});\n // });\n\n if(IS_CALL_SUPPORTED || IS_GROUP_CALL_SUPPORTED) {\n this.topbarCall = new TopbarCall(managers);\n }\n\n if(IS_CALL_SUPPORTED) {\n callsController.addEventListener('instance', ({instance/* , hasCurrent */}) => {\n // if(hasCurrent) {\n // return;\n // }\n\n const popup = new PopupCall(instance);\n\n instance.addEventListener('acceptCallOverride', () => {\n return this.discardCurrentCall(instance.interlocutorUserId.toPeerId(), undefined, instance)\n .then(() => {\n callsController.dispatchEvent('accepting', instance);\n return true;\n })\n .catch(() => false);\n });\n\n popup.addEventListener('close', () => {\n const currentCall = callsController.currentCall;\n if(currentCall && currentCall !== instance && !instance.wasTryingToJoin) {\n instance.hangUp('phoneCallDiscardReasonBusy');\n }\n }, {once: true});\n\n popup.show();\n });\n\n callsController.addEventListener('incompatible', async(userId) => {\n toastNew({\n langPackKey: 'VoipPeerIncompatible',\n langPackArguments: [\n await wrapPeerTitle({peerId: userId.toPeerId()})\n ]\n });\n });\n }\n\n // ! do not remove this line\n // ! instance can be deactivated before the UI starts, because it waits in background for RAF that is delayed\n singleInstance.activateInstance();\n\n const setAuthorized = () => {\n telegramMeWebManager.setAuthorized(true);\n };\n\n setInterval(setAuthorized, ONE_DAY);\n setAuthorized();\n\n addAnchorListener<{}>({\n name: 'showMaskedAlert',\n callback: (params, element) => {\n const href = element.href;\n\n const a = element.cloneNode(true) as HTMLAnchorElement;\n a.className = 'anchor-url';\n a.innerText = href;\n a.removeAttribute('onclick');\n\n new PopupPeer('popup-masked-url', {\n titleLangKey: 'OpenUrlTitle',\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [a],\n buttons: [{\n langKey: 'Open',\n callback: () => {\n a.click();\n }\n }]\n }).show();\n }\n });\n\n addAnchorListener<{uriParams: {command: string, bot: string}}>({\n name: 'execBotCommand',\n callback: ({uriParams}) => {\n const {command, bot} = uriParams;\n\n /* const promise = bot ? this.openUsername(bot).then(() => this.chat.peerId) : Promise.resolve(this.chat.peerId);\n promise.then((peerId) => {\n this.managers.appMessagesManager.sendText(peerId, '/' + command);\n }); */\n\n this.managers.appMessagesManager.sendText(this.chat.peerId, '/' + command + (bot ? '@' + bot : ''));\n\n // console.log(command, bot);\n }\n });\n\n addAnchorListener<{uriParams: {hashtag: string}}>({\n name: 'searchByHashtag',\n callback: ({uriParams}) => {\n const {hashtag} = uriParams;\n if(!hashtag) {\n return;\n }\n\n this.chat.initSearch('#' + hashtag + ' ');\n }\n });\n\n ([\n ['addstickers', INTERNAL_LINK_TYPE.STICKER_SET],\n ['addemoji', INTERNAL_LINK_TYPE.EMOJI_SET]\n ] as [\n 'addstickers' | 'addemoji',\n INTERNAL_LINK_TYPE.STICKER_SET | INTERNAL_LINK_TYPE.EMOJI_SET\n ][]).forEach(([name, type]) => {\n addAnchorListener<{pathnameParams: [typeof name, string]}>({\n name,\n callback: ({pathnameParams}) => {\n if(!pathnameParams[1]) {\n return;\n }\n\n const link: InternalLink = {\n _: type,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(type, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n // * t.me/invoice/asdasdad\n // * t.me/$asdasdad\n addAnchorListener<{pathnameParams: ['invoice', string] | string}>({\n name: 'invoice',\n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.INVOICE,\n slug: pathnameParams.length > 1 ? pathnameParams[1] : pathnameParams[0].slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n // Support old t.me/joinchat/asd and new t.me/+asd\n addAnchorListener<{pathnameParams: ['joinchat', string]}>({\n name: 'joinchat',\n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: pathnameParams[1] || decodeURIComponent(pathnameParams[0]).slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n if(IS_GROUP_CALL_SUPPORTED) {\n addAnchorListener<{\n uriParams: Omit\n }>({\n name: 'voicechat',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.VOICE_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n }\n\n addAnchorListener<{\n // pathnameParams: ['c', string, string],\n // uriParams: {thread?: number}\n // } | {\n // pathnameParams: [string, string?],\n // uriParams: {comment?: number}\n pathnameParams: ['c', string, string] | [string, string?],\n uriParams: {thread?: string, comment?: string} | {comment?: string, start?: string}\n }>({\n name: 'im',\n callback: async({pathnameParams, uriParams}, element) => {\n let link: InternalLink;\n if(PHONE_NUMBER_REG_EXP.test(pathnameParams[0])) {\n link = {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: pathnameParams[0].slice(1)\n };\n } else if(pathnameParams[0] === 'c') {\n pathnameParams.shift();\n const thread = 'thread' in uriParams ? uriParams.thread : pathnameParams[2] && pathnameParams[1];\n link = {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: pathnameParams[0],\n post: pathnameParams[2] || pathnameParams[1],\n thread,\n comment: uriParams.comment,\n stack: this.getStackFromElement(element)\n };\n } else {\n const thread = 'thread' in uriParams ? uriParams.thread : pathnameParams[2] && pathnameParams[1];\n link = {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: pathnameParams[0],\n post: pathnameParams[2] || pathnameParams[1],\n thread,\n comment: uriParams.comment,\n start: 'start' in uriParams ? uriParams.start : undefined,\n stack: this.getStackFromElement(element)\n };\n }\n\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n domain: string,\n\n // telegrampassport\n scope?: string,\n nonce?: string,\n payload?: string,\n bot_id?: string,\n public_key?: string,\n callback_url?: string,\n\n // regular\n start?: string,\n startgroup?: string,\n game?: string,\n voicechat?: string,\n post?: string,\n thread?: string,\n comment?: string,\n phone?: string\n }\n }>({\n name: 'resolve',\n protocol: 'tg',\n callback: ({uriParams}, element) => {\n let link: InternalLink;\n if(uriParams.phone) {\n link = this.makeLink(INTERNAL_LINK_TYPE.USER_PHONE_NUMBER, uriParams as Required);\n } else if(uriParams.domain === 'telegrampassport') {\n\n } else {\n link = this.makeLink(INTERNAL_LINK_TYPE.MESSAGE, {\n ...uriParams,\n stack: this.getStackFromElement(element)\n });\n }\n\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'privatepost',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.PRIVATE_POST, uriParams);\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n slug: string\n }\n }>({\n name: 'invoice',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.INVOICE, uriParams);\n this.processInternalLink(link);\n }\n });\n\n ['joinchat' as const, 'join' as const].forEach((name) => {\n addAnchorListener<{\n uriParams: {\n invite: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.JOIN_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n this.onHashChange(true);\n this.attachKeydownListener();\n this.handleAutologinDomains();\n this.checkForShare();\n }\n\n private checkForShare() {\n const share = apiManagerProxy.share;\n if(share) {\n apiManagerProxy.share = undefined;\n new PopupForward(undefined, async(peerId) => {\n await this.setPeer({peerId});\n if(share.files?.length) {\n const foundMedia = share.files.some((file) => MEDIA_MIME_TYPES_SUPPORTED.has(file.type));\n new PopupNewMedia(this.chat, share.files, foundMedia ? 'media' : 'document');\n } else {\n this.managers.appMessagesManager.sendText(peerId, share.text);\n }\n });\n }\n }\n\n public handleUrlAuth(options: {\n peerId?: PeerId,\n mid?: number,\n buttonId?: number,\n url: string\n }) {\n const {peerId, mid, buttonId, url} = options;\n\n const openWindow = (url: string) => {\n window.open(url, '_blank');\n };\n\n const onUrlAuthResultAccepted = (urlAuthResult: UrlAuthResult.urlAuthResultAccepted) => {\n openWindow(urlAuthResult.url);\n };\n\n const onUrlAuthResult = async(urlAuthResult: UrlAuthResult): Promise => {\n if(urlAuthResult._ === 'urlAuthResultRequest') {\n const b = document.createElement('b');\n b.append(urlAuthResult.domain);\n const peerTitle = await wrapPeerTitle({peerId: rootScope.myId});\n const botPeerTitle = await wrapPeerTitle({peerId: urlAuthResult.bot.id.toPeerId()});\n\n const logInCheckbox: PopupPeerCheckboxOptions = {\n text: 'OpenUrlOption1',\n textArgs: [b.cloneNode(true), peerTitle],\n checked: true\n };\n\n const allowMessagesCheckbox: PopupPeerCheckboxOptions = urlAuthResult.pFlags.request_write_access ? {\n text: 'OpenUrlOption2',\n textArgs: [botPeerTitle],\n checked: true\n } : undefined;\n\n const checkboxes: PopupPeerCheckboxOptions[] = [\n logInCheckbox,\n allowMessagesCheckbox\n ];\n\n const confirmationPromise = confirmationPopup({\n titleLangKey: 'OpenUrlTitle',\n button: {\n langKey: 'Open'\n },\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [b],\n checkboxes: checkboxes.filter(Boolean)\n });\n\n if(allowMessagesCheckbox) {\n logInCheckbox.checkboxField.input.addEventListener('change', () => {\n const disabled = !logInCheckbox.checkboxField.checked;\n allowMessagesCheckbox.checkboxField.toggleDisability(disabled);\n\n if(disabled) {\n allowMessagesCheckbox.checkboxField.checked = false;\n }\n });\n }\n\n const [logInChecked, allowMessagesChecked] = await confirmationPromise;\n\n if(!logInChecked) {\n openWindow(url);\n return;\n }\n\n const result = await this.managers.appSeamlessLoginManager.acceptUrlAuth(\n url,\n peerId,\n mid,\n buttonId,\n allowMessagesChecked\n );\n\n return onUrlAuthResult(result);\n } else if(urlAuthResult._ === 'urlAuthResultAccepted') {\n onUrlAuthResultAccepted(urlAuthResult);\n } else {\n openWindow(url);\n }\n };\n\n return this.managers.appSeamlessLoginManager.requestUrlAuth(\n url,\n peerId,\n mid,\n buttonId\n ).then((urlAuthResult) => {\n onUrlAuthResult(urlAuthResult);\n });\n }\n\n private handleAutologinDomains() {\n let appConfig: MTAppConfig;\n rootScope.addEventListener('app_config', (_appConfig) => {\n appConfig = _appConfig;\n });\n\n const onAnchorClick = (element: HTMLAnchorElement) => {\n const url = new URL(element.href);\n if(appConfig.url_auth_domains.includes(url.hostname)) {\n this.handleUrlAuth({url: element.href});\n cancelEvent();\n return;\n }\n\n if(!appConfig.autologin_token || !appConfig.autologin_domains) {\n return;\n }\n\n const originalUrl = element.dataset.originalUrl ??= element.href;\n if(appConfig.autologin_domains.includes(url.hostname)) {\n url.searchParams.set('autologin_token', appConfig.autologin_token);\n element.href = url.toString();\n\n setTimeout(() => {\n element.href = originalUrl;\n delete element.dataset.originalUrl;\n }, 0);\n }\n };\n\n document.addEventListener('click', (e) => {\n const anchor = findUpTag(e.target as HTMLElement, 'A') as HTMLAnchorElement;\n if(anchor?.href) {\n onAnchorClick(anchor);\n }\n });\n\n // addAnchorListener({\n // name: 'handleUrlClick',\n // callback: (_, element) => {\n // onAnchorClick(element);\n // },\n // noCancelEvent: true,\n // noPathnameParams: true,\n // noUriParams: true\n // });\n }\n\n private getStackFromElement(element: HTMLElement) {\n const possibleBubble = findUpClassName(element, 'bubble');\n return possibleBubble ? +possibleBubble.dataset.mid : undefined;\n }\n\n private deleteFilesIterative(callback: (response: Response) => boolean) {\n return this.cacheStorage.timeoutOperation((cache) => {\n const perf = performance.now();\n return cache.keys().then((requests) => {\n const promises = requests.map((request) => {\n return cache.match(request).then((response) => {\n return callback(response);\n });\n });\n\n return Promise.all(promises).then((values) => {\n values.map((isBad, idx) => {\n if(!isBad) {\n return;\n }\n\n const request = requests[idx];\n return cache.delete(request);\n });\n\n return Promise.all(values.filter(Boolean));\n });\n }).then(() => {\n this.log('deleted files', performance.now() - perf);\n });\n });\n }\n\n private toggleChatGradientAnimation(activatingChat: Chat) {\n this.chats.forEach((chat) => {\n if(chat.gradientRenderer) {\n chat.gradientRenderer.scrollAnimate(rootScope.settings.animationsEnabled && chat === activatingChat);\n }\n });\n }\n\n private appendEmojiAnimationContainer(screen: ScreenSize) {\n const appendTo = screen === ScreenSize.mobile ? this.columnEl : document.body;\n if(this.emojiAnimationContainer.parentElement !== appendTo) {\n appendTo.append(this.emojiAnimationContainer)\n }\n }\n\n private attachKeydownListener() {\n const IGNORE_KEYS = new Set(['PageUp', 'PageDown', 'Meta', 'Control']);\n const onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n const isSelectionCollapsed = document.getSelection().isCollapsed;\n if(overlayCounter.isOverlayActive || IGNORE_KEYS.has(key)) return;\n\n const target = e.target as HTMLElement;\n\n // if(target.tagName === 'INPUT') return;\n\n // this.log('onkeydown', e, document.activeElement);\n\n const chat = this.chat;\n\n if((key.startsWith('Arrow') || (e.shiftKey && key === 'Shift')) && !isSelectionCollapsed) {\n return;\n } else if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {\n return;\n } else if(e.altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\n cancelEvent(e);\n this.managers.dialogsStorage.getNextDialog(this.chat.peerId, key === 'ArrowDown', appDialogsManager.filterId).then((dialog) => {\n if(dialog) {\n this.setPeer({peerId: dialog.peerId});\n }\n });\n } else if(key === 'ArrowUp' && this.chat.type !== 'scheduled') {\n if(!chat.input.editMsgId && chat.input.isInputEmpty()) {\n this.managers.appMessagesManager.getFirstMessageToEdit(chat.peerId, chat.threadId).then((message) => {\n if(message) {\n chat.input.initMessageEditing(message.mid);\n cancelEvent(e); // * prevent from scrolling\n }\n });\n } else {\n return;\n }\n } else if(key === 'ArrowDown') {\n return;\n }\n\n if(\n chat?.input?.messageInput &&\n e.target !== chat.input.messageInput &&\n target.tagName !== 'INPUT' &&\n !target.isContentEditable &&\n !IS_TOUCH_SUPPORTED &&\n (!mediaSizes.isMobile || this.tabId === APP_TABS.CHAT) &&\n !chat.selection.isSelecting &&\n !chat.input.recording\n ) {\n chat.input.messageInput.focus();\n placeCaretAtEnd(chat.input.messageInput);\n\n // clone and dispatch same event to new input. it is needed for sending message if input was blurred\n const newEvent = new KeyboardEvent(e.type, e);\n chat.input.messageInput.dispatchEvent(newEvent);\n }\n };\n\n document.body.addEventListener('keydown', onKeyDown);\n }\n\n private makeLink(type: T, uriParams: Omit) {\n return {\n _: type,\n ...uriParams\n } as any as InternalLinkTypeMap[T];\n }\n\n public async processInternalLink(link: InternalLink) {\n switch(link?._) {\n case INTERNAL_LINK_TYPE.MESSAGE: {\n const postId = link.post ? generateMessageId(+link.post) : undefined;\n const commentId = link.comment ? generateMessageId(+link.comment) : undefined;\n const threadId = link.thread ? generateMessageId(+link.thread) : undefined;\n\n this.openUsername({\n userName: link.domain,\n lastMsgId: postId,\n commentId,\n startParam: link.start,\n stack: link.stack,\n threadId\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.PRIVATE_POST: {\n const chatId = link.channel.toChatId();\n const peerId = chatId.toPeerId(true);\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n if(!chat) {\n try {\n await this.managers.appChatsManager.resolveChannel(chatId);\n } catch(err) {\n toastNew({langPackKey: 'LinkNotFound'});\n throw err;\n }\n }\n\n const postId = generateMessageId(+link.post);\n const threadId = link.thread ? generateMessageId(+link.thread) : undefined;\n\n this.op({\n peer: chat,\n lastMsgId: postId,\n threadId,\n stack: link.stack\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.EMOJI_SET:\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.set}, link._ === INTERNAL_LINK_TYPE.EMOJI_SET).show();\n break;\n }\n\n case INTERNAL_LINK_TYPE.JOIN_CHAT: {\n this.managers.appChatsManager.checkChatInvite(link.invite).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.managers.appChatsManager.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n // console.log(chatInvite);\n\n if(chatInvite._ === 'chatInviteAlready' ||\n chatInvite._ === 'chatInvitePeek'/* && chatInvite.expires > tsNow(true) */) {\n this.setInnerPeer({\n peerId: chatInvite.chat.id.toPeerId(true)\n });\n return;\n }\n\n new PopupJoinChatInvite(link.invite, chatInvite);\n }, (err) => {\n if(err.type === 'INVITE_HASH_EXPIRED') {\n toast(i18n('InviteExpired'));\n }\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.VOICE_CHAT: {\n if(IS_GROUP_CALL_SUPPORTED) {\n this.joinGroupCall(link.chat_id.toPeerId(true), link.id);\n }\n\n break;\n }\n\n case INTERNAL_LINK_TYPE.USER_PHONE_NUMBER: {\n this.managers.appUsersManager.resolvePhone(link.phone).then((user) => {\n this.setInnerPeer({\n peerId: user.id.toPeerId(false)\n });\n }).catch((err) => {\n if(err.type === 'PHONE_NOT_OCCUPIED') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n\n break;\n }\n\n case INTERNAL_LINK_TYPE.INVOICE: {\n this.managers.appPaymentsManager.getInputInvoiceBySlug(link.slug).then((inputInvoice) => {\n this.managers.appPaymentsManager.getPaymentForm(inputInvoice).then((paymentForm) => {\n // const message: Message.message = {\n // _: 'message',\n // date: 0,\n // id: 0,\n // peerId: 0,\n // peer_id: undefined,\n // message: '',\n // media: {\n // _: 'messageMediaInvoice',\n // currency: paymentForm.invoice.currency,\n // description: paymentForm.description,\n\n // }\n // };\n new PopupPayment(undefined, inputInvoice, paymentForm);\n });\n });\n break;\n }\n\n default: {\n this.log.warn('Not supported internal link:', link);\n break;\n }\n }\n }\n\n public openUrl(url: string) {\n const {url: wrappedUrl, onclick} = wrapUrl(url);\n if(!onclick) {\n return;\n }\n\n const a = document.createElement('a');\n a.href = wrappedUrl;\n (window as any)[onclick](a);\n }\n\n private onHashChange = (saveState?: boolean) => {\n try {\n this.onHashChangeUnsafe(saveState);\n } catch(err) {\n this.log.error('hash change error', err);\n }\n };\n\n private onHashChangeUnsafe = (saveState?: boolean) => {\n const hash = location.hash;\n if(!saveState) {\n appNavigationController.replaceState();\n }\n\n const splitted = hash.split('?');\n const params = parseUriParams(hash, splitted);\n this.log('hashchange', hash, splitted[0], params);\n if(!hash) {\n return;\n }\n\n if(params.tgaddr) {\n this.openUrl(params.tgaddr);\n return;\n }\n\n switch(splitted[0]) {\n default: {\n params.p = splitted[0].slice(1);\n }\n\n case '#/im': {\n if(!Object.keys(params).length) {\n break;\n }\n\n const p: string = params.p;\n const postId = params.post !== undefined ? generateMessageId(+params.post) : undefined;\n\n switch(p[0]) {\n case '@': {\n this.openUsername({\n userName: p,\n lastMsgId: postId\n });\n break;\n }\n\n default: { // peerId\n this.setInnerPeer({\n peerId: postId ? p.toPeerId(true) : p.toPeerId(),\n lastMsgId: postId\n });\n break;\n }\n }\n }\n }\n\n // appNavigationController.replaceState();\n // location.hash = '';\n };\n\n private async op(options: {\n peer: User.user | MTChat\n } & Omit) {\n let {peer, commentId, threadId, lastMsgId} = options;\n const isUser = peer._ === 'user';\n const peerId = peer.id.toPeerId(!isUser);\n\n const isForum = peer._ === 'channel' && peer.pFlags.forum;\n // open forum tab\n if(!commentId && !threadId && !lastMsgId && isForum) {\n appDialogsManager.toggleForumTabByPeerId(peerId, true);\n return;\n }\n\n // handle t.me/username/thread or t.me/username/messageId\n if(isForum && lastMsgId && !threadId) {\n const message = await this.managers.appMessagesManager.reloadMessages(peerId, lastMsgId);\n if(message) {\n threadId = options.threadId = getMessageThreadId(message, isForum);\n } else {\n threadId = options.threadId = lastMsgId;\n lastMsgId = options.lastMsgId = undefined;\n }\n }\n\n if(threadId) {\n return this.openThread({\n ...(options as any as Parameters[0]),\n peerId\n });\n } else if(commentId) {\n return this.openComment({\n peerId,\n msgId: lastMsgId,\n commentId\n });\n }\n\n return this.setInnerPeer({\n ...options,\n peerId\n });\n }\n\n public openPremiumBot() {\n return this.managers.apiManager.getAppConfig().then((appConfig) => {\n return this.openUsername({userName: appConfig.premium_bot_username});\n });\n }\n\n public openUsername(options: {\n userName: string\n } & Omit) {\n const {userName} = options;\n return this.managers.appUsersManager.resolveUsername(userName).then((peer) => {\n return this.op({\n peer,\n ...options\n });\n }, (err: ApiError) => {\n if(err.type === 'USERNAME_NOT_OCCUPIED') {\n toastNew({langPackKey: 'NoUsernameFound'});\n } else if(err.type === 'USERNAME_INVALID') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n }\n\n /**\n * Opens thread when peerId of discussion group is known\n */\n public async openThread(options: {\n peerId: PeerId,\n lastMsgId: number,\n threadId: number,\n stack?: number\n }) {\n if(await this.managers.appChatsManager.isForum(options.peerId.toChatId())) {\n await this.managers.dialogsStorage.getForumTopicOrReload(options.peerId, options.threadId);\n return this.setInnerPeer(options);\n }\n\n return this.managers.appMessagesManager.reloadMessages(options.peerId, options.threadId).then((message) => {\n if(!message) {\n options.lastMsgId = undefined;\n } else {\n this.managers.appMessagesManager.generateThreadServiceStartMessage(message);\n }\n\n return this.setInnerPeer({\n ...options,\n type: 'discussion'\n });\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(options: {\n peerId: PeerId,\n msgId: number,\n commentId: number\n }) {\n return this.managers.appMessagesManager.getDiscussionMessage(options.peerId, options.msgId).then((message) => {\n return this.openThread({\n peerId: message.peerId,\n lastMsgId: options.commentId,\n threadId: message.mid\n });\n });\n }\n\n public async callUser(userId: UserId, type: CallType) {\n const call = callsController.getCallByUserId(userId);\n if(call) {\n return;\n }\n\n const userFull = await this.managers.appProfileManager.getProfile(userId);\n if(userFull.pFlags.phone_calls_private) {\n wrapPeerTitle({peerId: userId.toPeerId()}).then((element) => {\n return confirmationPopup({\n descriptionLangKey: 'Call.PrivacyErrorMessage',\n descriptionLangArgs: [element],\n button: {\n langKey: 'OK',\n isCancel: true\n }\n });\n });\n\n return;\n }\n\n await this.discardCurrentCall(userId.toPeerId());\n\n callsController.startCallInternal(userId, type === 'video');\n }\n\n private discardCurrentCall(toPeerId: PeerId, ignoreGroupCall?: GroupCallInstance, ignoreCall?: CallInstance) {\n if(groupCallsController.groupCall && groupCallsController.groupCall !== ignoreGroupCall) return this.discardGroupCallConfirmation(toPeerId);\n else if(callsController.currentCall && callsController.currentCall !== ignoreCall) return this.discardCallConfirmation(toPeerId);\n else return Promise.resolve();\n }\n\n private async discardCallConfirmation(toPeerId: PeerId) {\n const currentCall = callsController.currentCall;\n if(currentCall) {\n await Promise.all([\n wrapPeerTitle({peerId: currentCall.interlocutorUserId.toPeerId(false)}),\n wrapPeerTitle({peerId: toPeerId})\n ]).then(([title1, title2]) => {\n return confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Call.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Call.ToCall.Text' : 'Call.Confirm.Discard.Call.ToVoice.Text',\n descriptionLangArgs: [title1, title2],\n button: {\n langKey: 'OK'\n }\n });\n });\n\n if(!currentCall.isClosing) {\n await currentCall.hangUp('phoneCallDiscardReasonDisconnect');\n }\n }\n }\n\n private async discardGroupCallConfirmation(toPeerId: PeerId) {\n const currentGroupCall = groupCallsController.groupCall;\n if(currentGroupCall) {\n await Promise.all([\n wrapPeerTitle({peerId: currentGroupCall.chatId.toPeerId(true)}),\n wrapPeerTitle({peerId: toPeerId})\n ]).then(([title1, title2]) => {\n return confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Voice.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Voice.ToCall.Text' : 'Call.Confirm.Discard.Voice.ToVoice.Text',\n descriptionLangArgs: [title1, title2],\n button: {\n langKey: 'OK'\n }\n });\n });\n\n if(groupCallsController.groupCall === currentGroupCall) {\n await currentGroupCall.hangUp();\n }\n }\n }\n\n public async joinGroupCall(peerId: PeerId, groupCallId?: GroupCallId) {\n const chatId = peerId.toChatId();\n const hasRights = this.managers.appChatsManager.hasRights(chatId, 'manage_call');\n const next = async() => {\n const chatFull = await this.managers.appProfileManager.getChatFull(chatId);\n let call: MyGroupCall;\n if(!chatFull.call) {\n if(!hasRights) {\n return;\n }\n\n call = await this.managers.appGroupCallsManager.createGroupCall(chatId);\n } else {\n call = chatFull.call;\n }\n\n groupCallsController.joinGroupCall(chatId, call.id, true, false);\n };\n\n if(groupCallId) {\n const groupCall = await this.managers.appGroupCallsManager.getGroupCallFull(groupCallId);\n if(groupCall._ === 'groupCallDiscarded') {\n if(!hasRights) {\n toastNew({\n langPackKey: 'VoiceChat.Chat.Ended'\n });\n\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'VoiceChat.Chat.StartNew',\n button: {\n langKey: 'VoiceChat.Chat.StartNew.OK'\n }\n });\n }\n }\n\n // await this.discardCurrentCall(peerId);\n\n next();\n };\n\n public setCurrentBackground(broadcastEvent = false): ReturnType {\n const theme = themeController.getTheme();\n\n const slug = (theme.settings?.wallpaper as WallPaper.wallPaper)?.slug;\n if(slug) {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === theme.name);\n // const isDefaultBackground = theme.background.blur === defaultTheme.background.blur &&\n // slug === defaultslug;\n\n // if(!isDefaultBackground) {\n return this.getBackground(slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.settings = copy(defaultTheme.settings); // * reset background\n return this.setCurrentBackground(true);\n });\n // }\n }\n\n return this.setBackground('', broadcastEvent);\n }\n\n private getBackground(slug: string) {\n if(this.backgroundPromises[slug]) return this.backgroundPromises[slug];\n return this.backgroundPromises[slug] = this.cacheStorage.getFile('backgrounds/' + slug).then((blob) => {\n return URL.createObjectURL(blob);\n });\n }\n\n public setBackground(url: string, broadcastEvent = true): Promise {\n this.lastBackgroundUrl = url;\n const promises = this.chats.map((chat) => chat.setBackground(url));\n return promises[promises.length - 1].then(() => {\n if(broadcastEvent) {\n rootScope.dispatchEvent('background_change');\n }\n });\n }\n\n public saveChatPosition(chat: Chat) {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n // const bubble = chat.bubbles.getBubbleByPoint('top');\n // if(bubble) {\n // const top = bubble.getBoundingClientRect().top;\n const chatBubbles = chat.bubbles;\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const chatPositions = stateStorage.getFromCache('chatPositions');\n if(!(chatBubbles.scrollable.getDistanceToEnd() <= 16 && chatBubbles.scrollable.loadedAll.bottom) && chatBubbles.getRenderedLength()) {\n chatBubbles.sliceViewport(true);\n const top = chatBubbles.scrollable.scrollTop;\n\n const position = {\n mids: getObjectKeysAndSort(chatBubbles.bubbles, 'desc').filter((mid) => mid > 0 && !chatBubbles.skippedMids.has(mid)),\n top\n };\n\n chatPositions[key] = position;\n\n this.log('saved chat position:', position);\n } else {\n delete chatPositions[key];\n\n this.log('deleted chat position');\n }\n\n stateStorage.set({chatPositions}, true);\n // }\n }\n\n public getChatSavedPosition(chat: Chat): ChatSavedPosition {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const cache = stateStorage.getFromCache('chatPositions');\n return cache && cache[key];\n }\n\n public applyCurrentTheme(slug?: string, backgroundUrl?: string, broadcastEvent?: boolean) {\n if(backgroundUrl) {\n this.backgroundPromises[slug] = Promise.resolve(backgroundUrl);\n }\n\n themeController.setTheme();\n\n return this.setCurrentBackground(broadcastEvent === undefined ? !!slug : broadcastEvent);\n }\n\n private setSettings = () => {\n const {messagesTextSize} = rootScope.settings;\n\n this.customEmojiSize = makeMediaSize(messagesTextSize + 4, messagesTextSize + 4);\n document.documentElement.style.setProperty('--messages-text-size', messagesTextSize + 'px');\n\n const firstTime = !this.customEmojiSize;\n if(!firstTime) {\n const ellipsisElements = document.querySelectorAll('middle-ellipsis-element');\n ellipsisElements.forEach((element) => {\n element.disconnectedCallback();\n element.dataset.fontSize = '' + messagesTextSize;\n if(element.title) element.textContent = element.title;\n element.connectedCallback();\n });\n\n const renderers = document.querySelectorAll('.chat custom-emoji-renderer-element');\n renderers.forEach((renderer) => {\n renderer.forceRenderAfterSize = true;\n });\n }\n\n document.body.classList.toggle('animation-level-0', !rootScope.settings.animationsEnabled);\n document.body.classList.toggle('animation-level-1', false);\n document.body.classList.toggle('animation-level-2', rootScope.settings.animationsEnabled);\n\n this.chatsSelectTabDebounced = debounce(() => {\n const topbar = this.chat.topbar;\n topbar.pinnedMessage?.setCorrectIndex(0); // * буду молиться богам, чтобы это ничего не сломало, но это исправляет получение пиннеда после анимации\n\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }, rootScope.settings.animationsEnabled ? 250 : 0, false, true);\n\n lottieLoader.setLoop(rootScope.settings.stickers.loop);\n animationIntersector.checkAnimations2(false);\n\n for(const chat of this.chats) {\n chat.setAutoDownloadMedia();\n }\n\n I18n.setTimeFormat(rootScope.settings.timeFormat);\n\n this.toggleChatGradientAnimation(this.chat);\n };\n\n // * не могу использовать тут TransitionSlider, так как мне нужен отрисованный блок рядом\n // * (или под текущим чатом) чтобы правильно отрендерить чат (напр. scrollTop)\n private chatsSelectTab(tab: HTMLElement, animate?: boolean) {\n if(this.prevTab === tab) {\n return;\n }\n\n if(animate === false && this.prevTab) { // * will be used for Safari iOS history swipe\n disableTransition([tab, this.prevTab].filter(Boolean));\n }\n\n if(this.prevTab) {\n this.prevTab.classList.remove('active');\n this.chatsSelectTabDebounced();\n\n // ! нужно переделать на animation, так как при лаге анимация будет длиться не 250мс\n if(rootScope.settings.animationsEnabled && animate !== false) {\n dispatchHeavyAnimationEvent(pause(250 + 150), 250 + 150);\n }\n\n const prevIdx = whichChild(this.prevTab);\n const idx = whichChild(tab);\n if(idx > prevIdx) {\n appNavigationController.pushItem({\n type: 'chat',\n onPop: (canAnimate) => {\n this.setPeer({}, canAnimate);\n blurActiveElement();\n }\n });\n }\n }\n\n tab.classList.add('active');\n this.prevTab = tab;\n }\n\n private init() {\n document.addEventListener('paste', this.onDocumentPaste, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n this.attachDragAndDropListeners();\n }\n\n // if(!isTouchSupported) {\n this.markupTooltip = new MarkupTooltip(this);\n this.markupTooltip.handleSelection();\n // }\n }\n\n private attachDragAndDropListeners() {\n const drops: ChatDragAndDrop[] = [];\n const mediaDrops: ChatDragAndDrop[] = [];\n let mounted = false;\n const toggle = async(e: DragEvent, mount: boolean) => {\n if(mount === mounted) return;\n\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n\n const newMediaPopup = getCurrentNewMediaPopup();\n const types: string[] = await getFilesFromEvent(e, true);\n if(!isFiles || (!(await this.canDrag()) && !newMediaPopup)) { // * skip dragging text case\n counter = 0;\n return;\n }\n\n const _dropsContainer = newMediaPopup ? mediaDropsContainer : dropsContainer;\n const _drops = newMediaPopup ? mediaDrops : drops;\n\n if(mount && !_drops.length) {\n const force = isFiles && !types.length; // * can't get file items not from 'drop' on Safari\n\n const foundMedia = types.filter((t) => MEDIA_MIME_TYPES_SUPPORTED.has(t)).length;\n // const foundDocuments = types.length - foundMedia;\n\n this.log('drag files', types);\n\n if(newMediaPopup) {\n newMediaPopup.appendDrops(_dropsContainer);\n\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n header: 'Preview.Dragging.AddItems',\n headerArgs: [types.length],\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'document');\n }\n }));\n }\n } else {\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragfiles',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropAsFilesDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'document');\n }\n }));\n }\n\n // if((foundMedia && !foundDocuments) || force) {\n if(foundMedia || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragmedia',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropQuickDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'media');\n }\n }));\n }\n\n this.chat.container.append(_dropsContainer);\n }\n }\n\n // if(!mount) return;\n\n SetTransition({\n element: _dropsContainer,\n className: 'is-visible',\n forwards: mount,\n duration: 200,\n onTransitionEnd: () => {\n if(!mount) {\n _drops.forEach((drop) => {\n drop.destroy();\n });\n\n _drops.length = 0;\n }\n }\n });\n\n if(mount) {\n _drops.forEach((drop) => {\n drop.setPath();\n });\n } else {\n counter = 0;\n }\n\n document.body.classList.toggle('is-dragging', mount);\n mounted = mount;\n };\n\n /* document.body.addEventListener('dragover', (e) => {\n cancelEvent(e);\n }); */\n\n let counter = 0;\n document.body.addEventListener('dragenter', (e) => {\n counter++;\n });\n\n document.body.addEventListener('dragover', (e) => {\n // this.log('dragover', e/* , e.dataTransfer.types[0] */);\n toggle(e, true);\n cancelEvent(e);\n });\n\n document.body.addEventListener('dragleave', (e) => {\n // this.log('dragleave', e, counter);\n // if((e.pageX <= 0 || e.pageX >= this.managers.appPhotosManager.windowW) || (e.pageY <= 0 || e.pageY >= this.managers.appPhotosManager.windowH)) {\n counter--;\n if(counter === 0) {\n // if(!findUpClassName(e.target, 'drops-container')) {\n toggle(e, false);\n }\n });\n\n const dropsContainer = document.createElement('div');\n dropsContainer.classList.add('drops-container');\n\n const mediaDropsContainer = dropsContainer.cloneNode(true) as HTMLElement;\n }\n\n private async canDrag() {\n const chat = this.chat;\n const peerId = chat?.peerId;\n return !(!peerId || overlayCounter.isOverlayActive || !(await chat.canSend('send_media')));\n }\n\n private onDocumentPaste = async(e: ClipboardEvent | DragEvent, attachType?: 'media' | 'document') => {\n const newMediaPopup = getCurrentNewMediaPopup();\n\n // console.log('document paste');\n // console.log('item', event.clipboardData.getData());\n\n if(e instanceof DragEvent) {\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n if(isFiles) {\n cancelEvent(e);\n }\n }\n\n const files = await getFilesFromEvent(e);\n if(!(await this.canDrag()) && !newMediaPopup) return;\n if(files.length) {\n if(newMediaPopup) {\n newMediaPopup.addFiles(files);\n return;\n }\n\n const chatInput = this.chat.input;\n chatInput.willAttachType = attachType || (MEDIA_MIME_TYPES_SUPPORTED.has(files[0].type) ? 'media' : 'document');\n PopupElement.createPopup(PopupNewMedia, this.chat, files, chatInput.willAttachType);\n }\n };\n\n private async overrideHash(peerId?: PeerId) {\n let str: string;\n if(peerId) {\n const username = await this.managers.appPeersManager.getPeerUsername(peerId);\n str = username ? '@' + username : '' + peerId;\n }\n\n appNavigationController.overrideHash(str);\n }\n\n public selectTab(id: APP_TABS, animate?: boolean) {\n if(animate === false) { // * will be used for Safari iOS history swipe\n disableTransition([appSidebarLeft.sidebarEl, this.columnEl, appSidebarRight.sidebarEl]);\n }\n\n document.body.classList.toggle(LEFT_COLUMN_ACTIVE_CLASSNAME, id === APP_TABS.CHATLIST);\n\n const prevTabId = this.tabId;\n if(prevTabId !== undefined) {\n this.overrideHash(id > APP_TABS.CHATLIST ? this.chat?.peerId : undefined);\n this.dispatchEvent('tab_changing', id);\n }\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(\n prevTabId !== undefined &&\n prevTabId !== id &&\n rootScope.settings.animationsEnabled &&\n animate !== false/* &&\n mediaSizes.activeScreen !== ScreenSize.large */\n ) {\n const transitionTime = (mediaSizes.isMobile ? 250 : 200) + 100; // * cause transition time could be > 250ms\n animationPromise = pause(transitionTime);\n dispatchHeavyAnimationEvent(animationPromise, transitionTime);\n\n // ! it's very heavy operation. will blink in firefox\n /* this.columnEl.classList.add('disable-hover');\n animationPromise.finally(() => {\n this.columnEl.classList.remove('disable-hover');\n }); */\n }\n\n this.tabId = id;\n blurActiveElement();\n if(mediaSizes.isMobile && prevTabId === APP_TABS.PROFILE && id < APP_TABS.PROFILE) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== undefined && id > prevTabId) {\n if(id < APP_TABS.PROFILE || !appNavigationController.findItemByType('im')) {\n appNavigationController.pushItem({\n type: 'im',\n onPop: (canAnimate) => {\n // this.selectTab(prevTabId, !isSafari);\n this.setPeer({}, canAnimate);\n }\n });\n }\n }\n\n const onImTabChange = (window as any).onImTabChange;\n onImTabChange && onImTabChange(id);\n\n // this._selectTab(id, mediaSizes.isMobile);\n // document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, id === 2);\n\n return animationPromise;\n }\n\n public updateStatus() {\n return this.managers.appUsersManager.updateMyOnlineStatus(this.offline);\n }\n\n private createNewChat() {\n const chat = new Chat(\n this,\n this.managers\n );\n\n if(this.chats.length) {\n chat.setBackground(this.lastBackgroundUrl, true);\n }\n\n this.chats.push(chat);\n\n return chat;\n }\n\n private spliceChats(fromIndex: number, justReturn = true, animate?: boolean, spliced?: Chat[]) {\n if(fromIndex >= this.chats.length) return;\n\n const chatFrom = this.chat;\n if(this.chats.length > 1 && justReturn) {\n this.dispatchEvent('peer_changing', this.chat);\n }\n\n if(!spliced) {\n spliced = this.chats.splice(fromIndex, this.chats.length - fromIndex);\n }\n\n const chatTo = this.chat;\n this.dispatchEvent('chat_changing', {from: chatFrom, to: chatTo});\n\n // * -1 because one item is being sliced when closing the chat by calling .removeByType\n for(let i = 0; i < spliced.length - 1; ++i) {\n appNavigationController.removeByType('chat', true);\n }\n\n // * fix middle chat z-index on animation\n if(spliced.length > 1) {\n spliced.slice(0, -1).forEach((chat) => {\n chat.container.remove();\n });\n }\n\n this.chatsSelectTab(chatTo.container, animate);\n\n if(justReturn) {\n this.dispatchEvent('peer_changed', chatTo);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n searchTab?.close();\n\n appSidebarRight.replaceSharedMediaTab(chatTo.sharedMediaTab);\n }\n\n spliced.forEach((chat) => {\n chat.beforeDestroy();\n });\n\n setTimeout(() => {\n // chat.setPeer(0);\n spliced.forEach((chat) => {\n chat.destroy();\n });\n }, 250 + 100);\n }\n\n public async setPeer(options: Partial = {}, animate?: boolean): Promise {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n options.peerId ??= NULL_PEER_ID;\n\n const {peerId, lastMsgId, threadId} = options;\n\n const chat = this.chat;\n const chatIndex = this.chats.indexOf(chat);\n const isSamePeer = this.isSamePeer(chat, options as any);\n if(!peerId) {\n if(chatIndex > 0) {\n this.spliceChats(chatIndex, undefined, animate);\n return;\n } else if(mediaSizes.activeScreen === ScreenSize.medium) { // * floating sidebar case\n this.selectTab(+!this.tabId, animate);\n return;\n }\n } else if(chatIndex > 0 && chat.peerId && !isSamePeer) {\n // const firstChat = this.chats[0];\n // if(firstChat.peerId !== chat.peerId) {\n /* // * slice idx > 0, set background and slice first, so new one will be the first\n const spliced = this.chats.splice(1, this.chats.length - 1);\n this.createNewChat();\n this.chats.splice(0, 1); */\n const spliced = this.chats.splice(1, this.chats.length - 1);\n if(this.chat.peerId === peerId) {\n this.spliceChats(0, true, true, spliced);\n return;\n } else {\n const ret = this.setPeer(options);\n this.spliceChats(0, false, false, spliced);\n return ret;\n }\n // } else {\n // this.spliceChats(1, false, animate);\n // }\n\n // return ret;\n }\n\n // * don't reset peer if returning\n if(isSamePeer && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(APP_TABS.CHAT, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = await chat.setPeer(options as any as Parameters[0]);\n\n // * wait for cached render\n const promise = result?.cached ? result.promise : Promise.resolve();\n if(peerId) {\n Promise.all([\n promise,\n chat.setBackgroundPromise\n ]).then(() => {\n // window.requestAnimationFrame(() => {\n setTimeout(() => { // * setTimeout is better here\n setTimeout(() => {\n this.chatsSelectTab(this.chat.container);\n }, 0);\n this.selectTab(APP_TABS.CHAT, animate);\n }, 0);\n });\n }\n }\n\n if(!peerId) {\n this.selectTab(APP_TABS.CHATLIST, animate);\n return false;\n }\n }\n\n public async setInnerPeer(options: ChatSetInnerPeerOptions) {\n const {peerId} = options;\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\n\n if(!options.type) {\n if(options.threadId && !(await this.managers.appPeersManager.isForum(options.peerId))) {\n options.type = 'discussion';\n }\n\n options.type ??= 'chat';\n }\n\n // * reuse current chat\n const existingIndex = this.chats.findIndex((chat) => this.isSamePeer(chat, options) || (mediaSizes.activeScreen === ScreenSize.mobile && this.tabId === 0));\n if(existingIndex !== -1) {\n this.spliceChats(existingIndex + 1);\n return this.setPeer(options);\n }\n\n const oldChat = this.chat;\n let chat = oldChat;\n if(oldChat.inited) { // * use first not inited chat\n chat = this.createNewChat();\n }\n\n this.dispatchEvent('chat_changing', {from: oldChat, to: chat});\n\n // this.chatsSelectTab(chat.container);\n\n return this.setPeer(options);\n }\n\n public openScheduled(peerId: PeerId) {\n this.setInnerPeer({\n peerId,\n type: 'scheduled'\n });\n }\n\n private getTypingElement(action: SendMessageAction) {\n const el = document.createElement('span');\n let c = 'peer-typing';\n el.classList.add(c);\n el.dataset.action = action._;\n switch(action._) {\n case 'sendMessageTypingAction': {\n // default: {\n c += '-text';\n for(let i = 0; i < 3; ++i) {\n const dot = document.createElement('span');\n dot.className = c + '-dot';\n el.append(dot);\n }\n break;\n }\n\n case 'sendMessageUploadAudioAction':\n case 'sendMessageUploadDocumentAction':\n case 'sendMessageUploadRoundAction':\n case 'sendMessageUploadVideoAction':\n case 'sendMessageUploadPhotoAction': {\n c += '-upload';\n /* const trail = document.createElement('span');\n trail.className = c + '-trail';\n el.append(trail); */\n break;\n }\n\n case 'sendMessageRecordAudioAction':\n case 'sendMessageRecordRoundAction':\n case 'sendMessageRecordVideoAction': {\n c += '-record';\n break;\n }\n\n case 'sendMessageEmojiInteractionSeen':\n case 'sendMessageChooseStickerAction': {\n c += '-choosing-sticker';\n for(let i = 0; i < 2; ++i) {\n const eye = document.createElement('div');\n eye.className = c + '-eye';\n el.append(eye);\n }\n break;\n }\n }\n\n el.classList.add(c);\n\n return el;\n }\n\n public async getPeerTyping(peerId: PeerId, container?: HTMLElement, threadId?: number) {\n // const log = this.log.bindPrefix('getPeerTyping-' + peerId);\n // log('getting peer typing');\n\n const isUser = peerId.isUser();\n if(isUser && await this.managers.appUsersManager.isBot(peerId)) {\n // log('a bot');\n return;\n }\n\n const typings = await this.managers.appProfileManager.getPeerTypings(peerId, threadId);\n if(!typings?.length) {\n // log('have no typing');\n return;\n }\n\n const typing = typings[0];\n\n const langPackKeys: {\n [peerType in 'private' | 'chat' | 'multi']?: Partial<{[action in SendMessageAction['_']]: LangPackKey}>\n } = {\n private: {\n 'sendMessageTypingAction': 'Peer.Activity.User.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.User.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.User.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.User.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.User.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.User.EnjoyingAnimations'\n },\n chat: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.Chat.EnjoyingAnimations'\n },\n multi: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.Multi.TypingText1',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.Multi.SendingPhoto1',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.Multi.RecordingAudio1',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.Multi.PlayingGame1',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.Multi.ChoosingSticker1'\n }\n };\n\n const mapa = isUser ? langPackKeys.private : (typings.length > 1 ? langPackKeys.multi : langPackKeys.chat);\n let action = typing.action;\n\n if(typings.length > 1) {\n const s: any = {};\n typings.forEach((typing) => {\n const type = typing.action._;\n if(s[type] === undefined) s[type] = 0;\n ++s[type];\n });\n\n if(Object.keys(s).length > 1) {\n action = {\n _: 'sendMessageTypingAction'\n };\n }\n }\n\n const langPackKey = mapa[action._];\n if(!langPackKey) {\n // log('no langPackKey');\n return;\n }\n\n let peerTitlePromise: Promise;\n let args: any[];\n if(peerId.isAnyChat()) {\n const peerTitle = new PeerTitle();\n peerTitlePromise = peerTitle.update({peerId: typing.userId.toPeerId(false), onlyFirstName: true});\n args = [\n peerTitle.element,\n typings.length - 1\n ];\n\n await peerTitlePromise;\n }\n\n if(!container) {\n container = document.createElement('span');\n container.classList.add('online', 'peer-typing-container');\n }\n\n container.classList.toggle('peer-typing-flex', action._ === 'sendMessageChooseStickerAction' || action._ === 'sendMessageEmojiInteractionSeen');\n\n let typingElement = container.firstElementChild as HTMLElement;\n if(!typingElement) {\n typingElement = this.getTypingElement(action);\n container.prepend(typingElement);\n } else {\n if(typingElement.dataset.action !== action._) {\n typingElement.replaceWith(this.getTypingElement(action));\n }\n }\n\n if(action._ === 'sendMessageEmojiInteractionSeen') {\n if(args) {\n args.pop();\n } else {\n args = [];\n }\n\n const span = htmlToSpan(wrapEmojiText(action.emoticon));\n args.push(span);\n }\n\n const descriptionElement = i18n(langPackKey, args);\n descriptionElement.classList.add('peer-typing-description');\n\n if(container.childElementCount > 1) container.lastElementChild.replaceWith(descriptionElement);\n else container.append(descriptionElement);\n\n // log('returning typing');\n return container;\n }\n\n private async getChatStatus(chatId: ChatId, noTyping?: boolean): Promise> {\n const typingEl = noTyping ? undefined : await this.getPeerTyping(chatId.toPeerId(true));\n if(typingEl) {\n return {cached: true, result: Promise.resolve(typingEl)};\n }\n\n const result = await this.managers.acknowledged.appProfileManager.getChatFull(chatId);\n const dooo = async(chatInfo: ChatFull) => {\n // this.chat.log('chatInfo res:', chatInfo);\n\n const participants_count = (chatInfo as ChatFull.channelFull).participants_count ||\n ((chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants)?.participants?.length ||\n 1;\n // if(participants_count) {\n let subtitle = await getChatMembersString(chatId);\n\n if(participants_count < 2) {\n return subtitle;\n }\n\n const onlines = await this.managers.appProfileManager.getOnlines(chatId);\n if(onlines > 1) {\n const span = document.createElement('span');\n\n span.append(...join([subtitle, i18n('OnlineCount', [numberThousandSplitter(onlines)])], false));\n subtitle = span;\n }\n\n return subtitle;\n // }\n };\n\n const promise = Promise.resolve(result.result).then(dooo);\n return {\n cached: result.cached,\n result: promise\n };\n }\n\n private async getUserStatus(userId: UserId, ignoreSelf?: boolean) {\n const result: AckedResult = {\n cached: true,\n result: Promise.resolve(undefined as HTMLElement)\n };\n\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user || (user.pFlags.self && !ignoreSelf)) {\n return result;\n }\n\n const subtitle = getUserStatusString(user);\n\n if(!user.pFlags.bot && !user.pFlags.support) {\n let typingEl = await this.getPeerTyping(userId.toPeerId());\n if(!typingEl && user.status?._ === 'userStatusOnline') {\n typingEl = document.createElement('span');\n typingEl.classList.add('online');\n typingEl.append(subtitle);\n }\n\n if(typingEl) {\n result.result = Promise.resolve(typingEl);\n return result;\n }\n }\n\n result.result = Promise.resolve(subtitle);\n return result;\n }\n\n private async getPeerStatus(peerId: PeerId, ignoreSelf?: boolean, noTyping?: boolean) {\n if(!peerId) return;\n let promise: Promise>;\n if(peerId.isAnyChat()) {\n promise = this.getChatStatus(peerId.toChatId(), noTyping);\n } else {\n promise = this.getUserStatus(peerId.toUserId(), ignoreSelf);\n }\n\n return promise;\n }\n\n public async setPeerStatus(options: {\n peerId: PeerId,\n element: HTMLElement,\n needClear: boolean,\n useWhitespace: boolean,\n middleware: () => boolean,\n ignoreSelf?: boolean,\n noTyping?: boolean\n }) {\n // const log = this.log.bindPrefix('status-' + peerId);\n // log('setting status', element);\n\n const {peerId, element, needClear, useWhitespace, middleware, ignoreSelf, noTyping} = options;\n\n if(!needClear) {\n // * good good good\n const typingContainer = element.querySelector('.peer-typing-container') as HTMLElement;\n if(typingContainer && await this.getPeerTyping(peerId, typingContainer)) {\n // log('already have a status');\n return;\n }\n }\n\n const result = await this.getPeerStatus(peerId, ignoreSelf, noTyping);\n // log('getPeerStatus result', result);\n if(!middleware()) {\n // log.warn('middleware');\n return;\n }\n\n const set = async() => {\n const subtitle = result && await result.result;\n if(!middleware()) {\n return;\n }\n\n return () => replaceContent(element, subtitle || placeholder);\n };\n\n const placeholder = useWhitespace ? NBSP : ''; // ! HERE U CAN FIND WHITESPACE\n if(!result || result.cached || needClear === undefined) {\n return await set();\n } else if(needClear) {\n return () => {\n element.textContent = placeholder;\n return set().then((callback) => callback?.());\n };\n }\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'}, undefined, this.chat.threadId);\n }\n\n public isSamePeer(options1: {peerId: PeerId, threadId?: number, type?: ChatType}, options2: typeof options1) {\n return options1.peerId === options2.peerId &&\n options1.threadId === options2.threadId &&\n (typeof(options1.type) !== typeof(options2.type) || options1.type === options2.type);\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\n","import {Message, MessageMedia} from '../../../../layer';\n\nexport default function canSaveMessageMedia(message: Message.message | Message.messageService) {\n return message &&\n !message.pFlags.is_outgoing &&\n !(message as Message.message).pFlags.noforwards &&\n !((message as Message.message).media as MessageMedia.messageMediaInvoice)?.extended_media\n}\n","import {Document, Message, MessageAction, MessageExtendedMedia, MessageMedia, Photo, WebPage} from '../../../../layer';\n\nexport default function getMediaFromMessage(message: Message) {\n if(!message) return;\n\n let media: any;\n if((message as Message.messageService).action) {\n media = ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo;\n } else if((message as Message.message).media) {\n let messageMedia = (message as Message.message).media;\n if((messageMedia as MessageMedia.messageMediaWebPage).webpage) {\n messageMedia = (messageMedia as MessageMedia.messageMediaWebPage).webpage as any as MessageMedia;\n } else if((messageMedia as MessageMedia.messageMediaInvoice).extended_media?._ === 'messageExtendedMedia') {\n messageMedia = ((messageMedia as MessageMedia.messageMediaInvoice).extended_media as MessageExtendedMedia.messageExtendedMedia).media;\n }\n\n media = (messageMedia as MessageMedia.messageMediaDocument).document ||\n (messageMedia as MessageMedia.messageMediaPhoto).photo;\n }\n\n return media as Photo.photo | Document.document;\n}\n","import {Message} from '../../../../layer';\nimport type {MyMessage} from '../../appMessagesManager';\n\nexport default function getMessageSenderPeerIdOrName(message: MyMessage) {\n if(message.fromId) {\n return {\n peerId: message.fromId\n };\n } else {\n return {\n fromName: (message as Message.message).fwd_from?.from_name\n };\n }\n}\n","import {isRestricted} from '../../../../helpers/restrictions';\nimport {Message} from '../../../../layer';\n\nexport default function isMessageRestricted(message: Message.message) {\n return !!(message.restriction_reason && isRestricted(message.restriction_reason));\n}\n","// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\n/*\n HTML-color IRC-color Description\n #c03d33 4 red\n #4fad2d 3 green\n #d09306 7 yellow\n #168acd 10 blue\n #8544d6 6 purple\n #cd4073 13 pink\n #2996ad 11 sea\n #ce671b 5 orange\n*/\nconst DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f'];\nconst DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange'];\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\n\nexport default function getPeerColorById(peerId: PeerId, pic = true) {\n if(!peerId) return '';\n\n const idx = DialogColorsMap[Math.abs(+peerId) % 7];\n const color = (pic ? DialogColors : DialogColorsFg)[idx];\n return color;\n}\n","import {Chat, User} from '../../../../layer';\n\nexport default function getPeerEditableUsername(peer: User.user | Chat.channel) {\n if(peer.username) {\n return peer.username;\n }\n\n const usernames = peer.usernames;\n const username = usernames?.find((username) => username.pFlags.editable);\n return username?.username;\n}\n","import isObject from '../../../../helpers/object/isObject';\nimport {InputChannel, InputPeer, Peer} from '../../../../layer';\nimport {NULL_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | InputChannel | PeerId | string): PeerId {\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\n // if(typeof(peerId) === 'number') return peerId;\n else if(isObject(peerId)) {\n const userId = (peerId as Peer.peerUser).user_id;\n if(userId !== undefined) {\n return userId.toPeerId(false);\n }\n\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\n if(chatId !== undefined) {\n return chatId.toPeerId(true);\n }\n\n return NULL_PEER_ID; // maybe it is an inputPeerSelf\n // } else if(!peerId) return 'u0';\n } else if(!peerId) return NULL_PEER_ID;\n\n const isUser = (peerId as string).charAt(0) === 'u';\n const peerParams = (peerId as string).substr(1).split('_');\n\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyPhoto} from '../../appPhotosManager';\nimport type {PhotoSize, VideoSize, WebDocument} from '../../../../layer';\nimport calcImageInBox from '../../../../helpers/calcImageInBox';\nimport {THUMB_TYPE_FULL} from '../../../mtproto/mtproto_config';\n\nexport default function choosePhotoSize(\n photo: MyPhoto | MyDocument | WebDocument,\n boxWidth = 0,\n boxHeight = 0,\n useBytes = false,\n pushDocumentSize = false\n) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n\n /*\n s box 100x100\n m box 320x320\n x box 800x800\n y box 1280x1280\n w box 2560x2560\n a crop 160x160\n b crop 320x320\n c crop 640x640\n d crop 1280x1280 */\n\n let sizes: PhotoSize[] = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n let bestPhotoSize: typeof sizes[0] = {_: 'photoSizeEmpty', type: THUMB_TYPE_FULL};\n if(pushDocumentSize && sizes && photo._ !== 'photo') {\n sizes = sizes.concat({\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: THUMB_TYPE_FULL\n });\n }\n\n if(sizes?.length) {\n for(let i = 0, length = sizes.length; i < length; ++i) {\n const photoSize = sizes[i];\n if(!('w' in photoSize) && !('h' in photoSize)) continue;\n\n bestPhotoSize = photoSize;\n\n const size = calcImageInBox(photoSize.w, photoSize.h, boxWidth, boxHeight);\n if(size.width >= boxWidth || size.height >= boxHeight) {\n break;\n }\n }\n\n if(useBytes && bestPhotoSize._ === 'photoSizeEmpty' && sizes[0]._ === 'photoStrippedSize') {\n bestPhotoSize = sizes[0];\n }\n }\n\n return bestPhotoSize;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\nimport createDataChannel from './helpers/createDataChannel';\nimport createPeerConnection from './helpers/createPeerConnection';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport StreamManager from './streamManager';\nimport {Ssrc} from './types';\n\nexport type CallConnectionInstanceOptions = {\n streamManager: StreamManager,\n connection?: RTCPeerConnection,\n log?: ReturnType\n};\n\nexport default abstract class CallConnectionInstanceBase {\n public connection: RTCPeerConnection;\n public streamManager: StreamManager;\n public dataChannel: RTCDataChannel;\n public description: LocalConferenceDescription;\n public sources: {\n audio: Ssrc,\n video?: Ssrc,\n };\n protected negotiating: Promise;\n protected log: ReturnType;\n\n constructor(options: CallConnectionInstanceOptions) {\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = this.connection?.log || logger('CALL-CONNECTION-BASE');\n }\n\n this.sources = {} as any;\n }\n\n public createPeerConnection(config?: RTCConfiguration) {\n return this.connection || (this.connection = createPeerConnection(config, this.log.bindPrefix('connection')).connection);\n }\n\n public createDataChannel(dict?: RTCDataChannelInit) {\n return this.dataChannel || (this.dataChannel = createDataChannel(this.connection, dict, this.log.bindPrefix('data')));\n }\n\n public createDescription() {\n return this.description || (this.description = new LocalConferenceDescription(this.connection));\n }\n\n public appendStreamToConference() {\n return this.streamManager.appendToConference(this.description);\n }\n\n public closeConnection() {\n const {connection} = this;\n if(!connection) {\n return;\n }\n\n try {\n connection.log('close');\n connection.close();\n } catch(e) {\n this.log.error(e);\n }\n }\n\n public closeConnectionAndStream(stopStream: boolean) {\n this.closeConnection();\n stopStream && this.streamManager.stop();\n }\n\n protected abstract negotiateInternal(): CallConnectionInstanceBase['negotiating'];\n\n public negotiate() {\n const promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n return this.negotiating = this.negotiateInternal().finally(() => {\n this.negotiating = undefined;\n });\n }\n\n public sendDataChannelData(data: any) {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.dataChannel.send(JSON.stringify(data));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Logger, logger} from '../../logger';\n\nexport default function createPeerConnection(config: RTCConfiguration, log?: Logger) {\n if(!log) {\n log = logger('RTCPeerConnection');\n }\n\n log('constructor');\n\n // @ts-ignore\n const connection = new RTCPeerConnection(config);\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n });\n connection.addEventListener('signalingstatechange', () => {\n log('onsignalingstatechange', connection.signalingState);\n });\n connection.addEventListener('connectionstatechange', () => {\n log('onconnectionstatechange', connection.connectionState);\n });\n connection.addEventListener('negotiationneeded', () => { // * will be fired every time input device changes\n log('onnegotiationneeded', connection.signalingState);\n });\n connection.addEventListener('icecandidate', (event) => {\n log('onicecandidate', event);\n });\n connection.addEventListener('iceconnectionstatechange', () => {\n log('oniceconnectionstatechange', connection.iceConnectionState);\n });\n connection.addEventListener('datachannel', () => {\n log('ondatachannel');\n });\n\n connection.log = log;\n\n return {connection};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Logger, logger} from '../../logger';\n\nexport default function createDataChannel(connection: RTCPeerConnection, dict?: RTCDataChannelInit, log?: Logger) {\n // return;\n\n if(!log) {\n log = logger('RTCDataChannel');\n }\n\n const channel = connection.createDataChannel('data', dict);\n\n channel.addEventListener('message', (e) => {\n log('onmessage', e);\n });\n channel.addEventListener('open', () => {\n log('onopen');\n });\n channel.addEventListener('close', () => {\n log('onclose');\n });\n\n channel.log = log;\n\n return channel;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from '../sdp';\nimport {CallSignalingData, P2PVideoCodec} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function parseSignalingData(sdp: SDP) {\n const info = parseMediaSectionInfo(sdp, sdp.media[0]);\n\n const data: CallSignalingData.initialSetup = {\n '@type': 'InitialSetup',\n 'fingerprints': [info.fingerprint],\n 'ufrag': info.ufrag,\n 'pwd': info.pwd,\n 'audio': undefined,\n 'video': undefined,\n 'screencast': undefined\n };\n\n const convertNumber = (number: number) => '' + number;\n\n for(const section of sdp.media) {\n const mediaType = section.mediaType;\n if(mediaType === 'application' || !section.isSending) {\n continue;\n }\n\n const codec: P2PVideoCodec = data[mediaType === 'video' && data['video'] ? 'screencast' : mediaType] = {} as any;\n const info = parseMediaSectionInfo(sdp, section);\n codec.ssrc = convertNumber(info.source);\n\n if(info.sourceGroups) {\n codec.ssrcGroups = info.sourceGroups.map((sourceGroup) => ({semantics: sourceGroup.semantics, ssrcs: sourceGroup.sources.map(convertNumber)}));\n }\n\n const rtpExtensions: P2PVideoCodec['rtpExtensions'] = codec.rtpExtensions = [];\n section.attributes.get('extmap').forEach((attribute) => {\n rtpExtensions.push({\n id: +attribute.key,\n uri: attribute.value\n });\n });\n\n const payloadTypesMap: Map = new Map();\n\n const getPayloadType = (id: number) => {\n let payloadType = payloadTypesMap.get(id);\n if(!payloadType) {\n payloadTypesMap.set(id, payloadType = {\n id\n } as any);\n }\n\n return payloadType;\n };\n\n section.attributes.get('rtpmap').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const splitted = attribute.value.split('/');\n const [name, clockrate, channels] = splitted;\n payloadType.name = name;\n payloadType.clockrate = +clockrate;\n payloadType.channels = channels ? +channels : 0;\n });\n\n section.attributes.get('rtcp-fb').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n payloadType.feedbackTypes = attribute.lines.map((line) => {\n const splitted = line.split(' ');\n const [type, subtype] = splitted;\n return {\n type,\n subtype: subtype || ''\n };\n });\n });\n\n section.attributes.get('fmtp').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const parameters: P2PVideoCodec['payloadTypes'][0]['parameters'] = payloadType.parameters = {};\n const splitted = attribute.value.split(';');\n for(const str of splitted) {\n const [key, value] = str.split('=');\n parameters[key] = value;\n }\n });\n\n codec.payloadTypes = Array.from(payloadTypesMap.values());\n\n /* if(codec.payloadTypes.length > 5) {\n codec.payloadTypes.length = Math.min(codec.payloadTypes.length, 5);\n } */\n }\n\n return data;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CallConnectionInstanceBase, {CallConnectionInstanceOptions} from './callConnectionInstanceBase';\nimport CallInstance from './callInstance';\nimport parseSignalingData from './helpers/parseSignalingData';\nimport {parseSdp} from './sdp/utils';\n\nexport default class CallConnectionInstance extends CallConnectionInstanceBase {\n private call: CallInstance;\n\n constructor(options: CallConnectionInstanceOptions & {\n call: CallConnectionInstance['call']\n }) {\n super(options);\n }\n\n protected async negotiateInternal() {\n const {connection, call} = this;\n\n if(!connection.localDescription && !connection.remoteDescription && !call.isOutgoing) {\n return;\n }\n\n let descriptionInit: RTCSessionDescriptionInit;\n if(call.offerReceived) {\n call.offerReceived = false;\n\n const answer = descriptionInit = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n this.log('[InitialSetup] send 2');\n } else {\n const offer = descriptionInit = await connection.createOffer();\n\n this.log('[sdp] local', offer.sdp);\n await connection.setLocalDescription(offer);\n\n call.offerSent = true;\n\n this.log('[InitialSetup] send 0');\n }\n\n const initialSetup = parseSignalingData(parseSdp(descriptionInit.sdp));\n call.sendCallSignalingData(initialSetup);\n }\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport bufferConcats from '../../../helpers/bytes/bufferConcats';\nimport subtle from '../../crypto/subtle';\nimport sha256 from '../../crypto/utils/sha256';\n\nconst kMaxIncomingPacketSize = 128 * 1024 * 1024;\n\nexport default class P2PEncryptor {\n private type: 'Signaling';\n private counter: number;\n private seqMap: Map;\n\n constructor(private isOutgoing: boolean, private p2pKey: Uint8Array) {\n this.type = 'Signaling';\n this.counter = 0;\n this.seqMap = new Map();\n }\n\n private concatSHA256(parts: Uint8Array[]) {\n return sha256(bufferConcats(...parts));\n }\n\n private async encryptPrepared(buffer: Uint8Array) {\n const result = {\n counter: 0, // this.counterFromSeq(this.readSeq(buffer)),\n bytes: new Uint8Array(16 + buffer.length)\n };\n\n const x = (this.isOutgoing ? 0 : 8) + (this.type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n\n const msgKeyLarge = await this.concatSHA256([key.subarray(x + 88, x + 88 + 32), buffer]);\n const msgKey = result.bytes;\n for(let i = 0; i < 16; ++i) {\n msgKey[i] = msgKeyLarge[i + 8];\n }\n\n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n\n const bytes = await this.aesProcessCtr(buffer, buffer.length, aesKeyIv, true);\n\n result.bytes = new Uint8Array([...result.bytes.subarray(0, 16), ...bytes]);\n\n return result;\n }\n\n public encryptRawPacket(buffer: Uint8Array) {\n const seq = ++this.counter;\n const arr = new ArrayBuffer(4);\n const view = new DataView(arr);\n view.setUint32(0, seq >>> 0, false); // byteOffset = 0; litteEndian = false\n\n const result = new Uint8Array([...new Uint8Array(arr), ...buffer]);\n\n return this.encryptPrepared(result);\n }\n\n private async prepareAesKeyIv(key: Uint8Array, msgKey: Uint8Array, x: number) {\n const [sha256a, sha256b] = await Promise.all([\n this.concatSHA256([\n msgKey.subarray(0, 16),\n key.subarray(x, x + 36)\n ]),\n\n this.concatSHA256([\n key.subarray(40 + x, 40 + x + 36),\n msgKey.subarray(0, 16)\n ])\n ]);\n\n return {\n key: new Uint8Array([\n ...sha256a.subarray(0, 8),\n ...sha256b.subarray(8, 8 + 16),\n ...sha256a.subarray(24, 24 + 8)\n ]),\n iv: new Uint8Array([\n ...sha256b.subarray(0, 4),\n ...sha256a.subarray(8, 8 + 8),\n ...sha256b.subarray(24, 24 + 4)\n ])\n };\n }\n\n private async aesProcessCtr(encryptedData: Uint8Array, dataSize: number, aesKeyIv: {key: Uint8Array, iv: Uint8Array}, encrypt = true) {\n const cryptoKey = await subtle.importKey(\n 'raw',\n aesKeyIv.key,\n {name: 'AES-CTR'},\n false,\n [encrypt ? 'encrypt' : 'decrypt']\n );\n\n const buffer: ArrayBuffer = await subtle[encrypt ? 'encrypt' : 'decrypt']({\n name: 'AES-CTR',\n counter: aesKeyIv.iv,\n length: aesKeyIv.iv.length * 8\n },\n cryptoKey,\n encryptedData\n );\n\n return new Uint8Array(buffer);\n }\n\n private constTimeIsDifferent(a: Uint8Array, b: Uint8Array, count: number) {\n let msgKeyEquals = true;\n for(let i = 0; i < count; ++i) {\n if(a[i] !== b[i]) {\n msgKeyEquals = false;\n }\n }\n\n return !msgKeyEquals;\n }\n\n public async decryptRawPacket(buffer: Uint8Array) {\n if(buffer.length < 21 || buffer.length > kMaxIncomingPacketSize) {\n return;\n }\n\n const {isOutgoing, type} = this;\n\n const x = (isOutgoing ? 8 : 0) + (type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n\n const msgKey = buffer.subarray(0, 16);\n const encryptedData = buffer.subarray(16);\n const encryptedDataSize = buffer.length - 16;\n\n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n\n const decryptionBuffer = await this.aesProcessCtr(encryptedData, encryptedDataSize, aesKeyIv, false);\n\n const msgKeyLarge = await this.concatSHA256([\n key.subarray(88 + x, 88 + x + 32),\n decryptionBuffer\n ]);\n\n if(this.constTimeIsDifferent(msgKeyLarge.subarray(8), msgKey, 16)) {\n return;\n }\n\n const dataView = new DataView(decryptionBuffer.buffer);\n const seq = dataView.getUint32(0);\n if(this.seqMap.has(seq)) {\n return;\n }\n this.seqMap.set(seq, seq);\n\n return decryptionBuffer.slice(4);\n }\n}\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then((b) => {\n // console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n\n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport StringFromLineBuilder from '../stringFromLineBuilder';\nimport {addDataChannel, addExtmap, addPayloadTypes, addSsrc} from './p2PSdpBuilder';\n\nexport default class ChromeP2PSdpBuilder {\n static generateOffer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n\n static generateAnswer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n}\n","/*\n* Copyright (c) 2018-present, Evgeny Nadymov\n*\n* This source code is licensed under the GPL v.3.0 license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\nimport ChromeP2PSdpBuilder from './chromeP2PSdpBuilder';\nimport { FirefoxP2PSdpBuilder } from './firefoxP2PSdpBuilder';\nimport { SafariP2PSdpBuilder } from './safariP2PSdpBuilder';\n// import { TG_CALLS_SDP_STRING } from '../../Stores/CallStore';\n\nexport function p2pParseCandidate(candidate) {\n if(!candidate || !candidate.startsWith('candidate:')) {\n return;\n }\n \n const sdpString = candidate;\n candidate = candidate.substr('candidate:'.length);\n \n const [foundation, component, protocol, priority, ip, port, ...other] = candidate.split(' ');\n const c = {\n sdpString,\n foundation,\n component,\n protocol,\n priority,\n address: { ip, port }\n };\n \n for(let i = 0; i < other.length; i += 2) {\n switch(other[i]) {\n case 'typ': {\n c.type = other[i + 1];\n break;\n }\n case 'raddr': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.ip = other[i + 1];\n break;\n }\n case 'rport': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.port = other[i + 1];\n break;\n }\n case 'generation': {\n c.generation = other[i + 1];\n break;\n }\n case 'tcptype': {\n c.tcpType = other[i + 1];\n break;\n }\n case 'network-id': {\n c.networkId = other[i + 1];\n break;\n }\n case 'network-cost': {\n c.networkCost = other[i + 1];\n break;\n }\n case 'ufrag': {\n c.username = other[i + 1];\n break;\n }\n }\n }\n \n return c;\n}\n\nexport function p2pParseSdp(sdp) {\n const lines = sdp.split('\\r\\n');\n const lookup = (prefix, force = true, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return line.substr(prefix.length);\n }\n }\n \n if (force) {\n console.error(\"Can't find prefix\", prefix);\n }\n \n return null;\n };\n const findIndex = (prefix, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return i;\n }\n }\n \n return -1;\n };\n \n const pwdIndex = findIndex('a=ice-pwd:');\n const ufragIndex = findIndex('a=ice-ufrag:');\n if (pwdIndex === -1 && ufragIndex === -1) {\n return {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n }\n \n const info = {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n \n let mediaIndex = findIndex('m=');\n const fingerprint = lookup('a=fingerprint:', false);\n const setup = lookup('a=setup:', false);\n if (fingerprint && setup) {\n info.fingerprints.push({\n hash: fingerprint.split(' ')[0],\n fingerprint: fingerprint.split(' ')[1],\n setup\n });\n }\n \n const ufrag = lookup('a=ice-ufrag:', false);\n const pwd = lookup('a=ice-pwd:', false);\n if (ufrag && pwd) {\n info.ufrag = ufrag;\n info.pwd = pwd;\n }\n \n while (mediaIndex !== -1) {\n let nextMediaIndex = findIndex('m=', mediaIndex + 1);\n \n const extmap = [];\n const types = [];\n const mediaType = lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0];\n const media = {\n // type: lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0],\n // mid: lookup('a=mid:', true, mediaIndex, nextMediaIndex),\n // dir: findDirection(mediaIndex, nextMediaIndex),\n rtpExtensions: extmap,\n payloadTypes: types\n }\n \n const lineTo = nextMediaIndex === -1 ? lines.length : nextMediaIndex;\n const fmtp = new Map();\n const rtcpFb = new Map();\n for (let i = mediaIndex; i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith('a=extmap:')) {\n const [ id, uri ] = line.substr('a=extmap:'.length).split(' ');\n extmap.push({ id: parseInt(id), uri });\n } else if (line.startsWith('a=fmtp:')) {\n const [ id, str ] = line.substr('a=fmtp:'.length).split(' ');\n const obj = { };\n const arr = str.split(';').map(x => {\n const [ key, value ] = x.split('=');\n obj[key] = value;\n return { [key]: value };\n });\n fmtp.set(parseInt(id), obj);\n } else if (line.startsWith('a=rtcp-fb:')) {\n const [ id, type = '', subtype = '' ] = line.substr('a=rtcp-fb:'.length).split(' ');\n if (rtcpFb.has(parseInt(id))) {\n rtcpFb.get(parseInt(id)).push({ type, subtype });\n } else {\n rtcpFb.set(parseInt(id), [{ type, subtype }])\n }\n } else if (line.startsWith('a=rtpmap')) {\n const [ id, str ] = line.substr('a=rtpmap:'.length).split(' ');\n const [ name, clockrate, channels = '0' ] = str.split('/');\n const obj = { id: parseInt(id), name, clockrate: parseInt(clockrate), channels: parseInt(channels) };\n \n types.push(obj);\n }\n }\n \n for (let i = 0; i < types.length; i++) {\n const { id } = types[i];\n if (rtcpFb.has(id)) {\n types[i].feedbackTypes = rtcpFb.get(id);\n }\n if (fmtp.has(id)) {\n types[i].parameters = fmtp.get(id);\n }\n }\n \n const ssrc = lookup('a=ssrc:', false, mediaIndex, nextMediaIndex);\n if (ssrc) {\n media.ssrc = ssrc.split(' ')[0];\n }\n \n const ssrcGroup = lookup('a=ssrc-group:', false, mediaIndex, nextMediaIndex);\n if (ssrcGroup) {\n const [ semantics, ...ssrcs ] = ssrcGroup.split(' ');\n media.ssrcGroups = [{\n semantics,\n ssrcs\n }]\n }\n \n switch (mediaType) {\n case 'audio': {\n info.audio = media;\n break;\n }\n case 'video': {\n info.video = media;\n break;\n }\n }\n \n mediaIndex = nextMediaIndex;\n }\n\n if(!info.video.ssrcGroups) {\n info.video.ssrcGroups = [];\n }\n\n info['@type'] = 'InitialSetup';\n \n // console.log('[p2pParseSdp]', sdp, info);\n return info;\n}\n\nexport function isFirefox() {\n return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n}\n\nfunction isSafari() {\n return navigator.userAgent.toLowerCase().indexOf('safari') > -1 && navigator.userAgent.toLowerCase().indexOf('chrome') === -1;\n}\n\nexport function addExtmap(extmap) {\n let sdp = [];\n // return sdp;\n for (let j = 0; j < extmap.length; j++) {\n const ext = extmap[j];\n const { id, uri } = ext;\n // if (isFirefox() && uri.indexOf(''))\n console.log('[extmap] add', id, uri);\n sdp.push(`a=extmap:${id} ${uri}`);\n }\n \n return sdp.join('\\n');\n}\n\nexport function addPayloadTypes(types) {\n let sdp = [];\n console.log('[SDP] addPayloadTypes', types);\n for (let i = 0; i < types.length; i++) {\n const type = types[i];\n const { id, name, clockrate, channels, feedbackTypes, parameters } = type;\n sdp.push(`a=rtpmap:${id} ${name}/${clockrate}${channels ? '/' + channels : ''}`);\n if (feedbackTypes) {\n feedbackTypes.forEach(x => {\n const { type, subtype } = x;\n sdp.push(`a=rtcp-fb:${id} ${[type, subtype].join(' ')}`);\n });\n }\n if (parameters) {\n const fmtp = [];\n Object.getOwnPropertyNames(parameters).forEach(pName => {\n fmtp.push(`${pName}=${parameters[pName]}`);\n });\n \n sdp.push(`a=fmtp:${id} ${fmtp.join(';')}`);\n }\n }\n \n return sdp.join('\\n');\n}\n\nexport function addSsrc(type, ssrc, ssrcGroups, streamName) {\n let sdp = [];\n \n if (ssrcGroups && ssrcGroups.length > 0) {\n ssrcGroups.forEach(ssrcGroup => {\n if (ssrcGroup && ssrcGroup.ssrcs.length > 0) {\n sdp.push(`a=ssrc-group:${ssrcGroup.semantics} ${ssrcGroup.ssrcs.join(' ')}`);\n ssrcGroup.ssrcs.forEach(ssrc => {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n });\n }\n });\n } else if (ssrc) {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n }\n \n return sdp.join('\\n');\n}\n\nexport function addDataChannel(mid) {\n return `m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144`;\n}\n\nexport class P2PSdpBuilder {\n static generateCandidate(info) {\n if (!info) return null;\n \n const { sdpString, sdpMLineIndex, sdpMid, foundation, component, protocol, priority, address, type, relAddress, generation, tcpType, networkId, networkCost, username } = info;\n if (/* TG_CALLS_SDP_STRING */true) {\n if (sdpString) {\n return {\n candidate: sdpString,\n sdpMLineIndex,\n sdpMid\n };\n }\n }\n throw 'no sdpString';\n \n let candidate = `candidate:${foundation} ${component} ${protocol} ${priority} ${address.ip} ${address.port}`;\n const attrs = []\n if (type) {\n attrs.push(`typ ${type}`);\n }\n if (relAddress) {\n attrs.push(`raddr ${relAddress.ip}`);\n attrs.push(`rport ${relAddress.port}`);\n }\n if (tcpType) {\n attrs.push(`tcptype ${tcpType}`);\n }\n if (generation) {\n attrs.push(`generation ${generation}`);\n }\n if (username) {\n attrs.push(`ufrag ${username}`);\n }\n if (networkId) {\n attrs.push(`network-id ${networkId}`);\n }\n if (networkCost) {\n attrs.push(`network-cost ${networkCost}`);\n }\n if (attrs.length > 0) {\n candidate += ` ${attrs.join(' ')}`;\n }\n \n return { candidate, sdpMid, sdpMLineIndex };\n }\n \n static generateOffer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateOffer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateOffer(info);\n }\n \n return ChromeP2PSdpBuilder.generateOffer(info);\n }\n \n static generateAnswer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateAnswer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateAnswer(info);\n }\n \n return ChromeP2PSdpBuilder.generateAnswer(info);\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class FirefoxP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, mid, ssrc, ssrcGroups, payloadTypes, dir, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class SafariP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from '../../environment/ctx';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {GroupCallParticipantVideoSourceGroup, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, Update} from '../../layer';\nimport {emojiFromCodePoints} from '../../vendor/emoji';\nimport type {CallId} from '../appManagers/appCallsManager';\nimport type {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport CallConnectionInstance from './callConnectionInstance';\nimport CallInstanceBase from './callInstanceBase';\nimport callsController from './callsController';\nimport CALL_STATE from './callState';\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS} from './constants';\nimport parseSignalingData from './helpers/parseSignalingData';\nimport stopTrack from './helpers/stopTrack';\nimport localConferenceDescription, {ConferenceEntry, generateSsrc} from './localConferenceDescription';\nimport getCallProtocol from './p2P/getCallProtocol';\nimport getRtcConfiguration from './p2P/getRtcConfiguration';\nimport P2PEncryptor from './p2P/p2PEncryptor';\nimport {p2pParseCandidate, P2PSdpBuilder} from './p2P/p2PSdpBuilder';\nimport {parseSdp} from './sdp/utils';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {AudioCodec, CallMediaState, CallSignalingData, DiffieHellmanInfo, P2PAudioCodec, P2PVideoCodec, VideoCodec} from './types';\n\nexport default class CallInstance extends CallInstanceBase<{\n state: (state: CALL_STATE) => void,\n id: (id: CallId, prevId: CallId) => void,\n muted: (muted: boolean) => void,\n mediaState: (mediaState: CallMediaState) => void,\n acceptCallOverride: () => Promise,\n}> {\n public dh: Partial;\n public id: CallId;\n public call: PhoneCall;\n public interlocutorUserId: UserId;\n public protocol: PhoneCallProtocol;\n public isOutgoing: boolean;\n public encryptionKey: Uint8Array;\n public connectionInstance: CallConnectionInstance;\n public encryptor: P2PEncryptor;\n public decryptor: P2PEncryptor;\n public candidates: RTCIceCandidate[];\n\n public offerReceived: boolean;\n public offerSent: boolean;\n\n public createdParticipantEntries: boolean;\n public release: () => Promise;\n public _connectionState: CALL_STATE;\n\n public createdAt: number;\n public connectedAt: number;\n public discardReason: string;\n\n private managers: AppManagers;\n\n private hangUpTimeout: number;\n\n private mediaStates: {\n input: CallMediaState,\n output?: CallMediaState\n };\n\n private sendMediaState: () => Promise;\n\n private decryptQueue: Uint8Array[];\n\n private getEmojisFingerprintPromise: Promise;\n private emojisFingerprint: [string, string, string, string];\n\n private wasStartingScreen: boolean;\n private wasStartingVideo: boolean;\n public wasTryingToJoin: boolean;\n\n public streamManager: StreamManager;\n\n constructor(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n managers: CallInstance['managers'],\n protocol?: PhoneCallProtocol\n }) {\n super();\n\n this.log = logger('CALL');\n\n if(!this.protocol) {\n this.protocol = getCallProtocol();\n }\n\n safeAssign(this, options);\n\n this.createdAt = Date.now();\n this.offerReceived = false;\n this.offerSent = false;\n this.decryptQueue = [];\n this.candidates = [];\n\n this.addEventListener('state', (state) => {\n this.log('state', CALL_STATE[state]);\n\n if(state === CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n\n const streamManager = this.streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n streamManager.direction = 'sendrecv';\n streamManager.types.push('screencast');\n if(!this.isOutgoing) {\n streamManager.locked = true;\n streamManager.canCreateConferenceEntry = false;\n }\n\n let mediaState: CallMediaState = {\n '@type': 'MediaState',\n 'type': 'input',\n 'lowBattery': false,\n 'muted': true,\n 'screencastState': 'inactive',\n 'videoRotation': 0,\n 'videoState': 'inactive'\n };\n\n const self = this;\n mediaState = new Proxy(mediaState, {\n set: function(target, key, value) {\n // @ts-ignore\n target[key] = value;\n self.setMediaState(mediaState);\n self.sendMediaState();\n return true;\n }\n });\n\n this.mediaStates = {\n input: mediaState\n };\n\n this.sendMediaState = debounce(this._sendMediaState.bind(this), 0, false, true);\n }\n\n get connectionState() {\n const {_connectionState, connectionInstance} = this;\n if(_connectionState !== undefined) {\n return _connectionState;\n } else if(!connectionInstance) {\n return CALL_STATE.CONNECTING;\n } else {\n const {iceConnectionState} = connectionInstance.connection;\n if(iceConnectionState === 'closed') {\n return CALL_STATE.CLOSED;\n } else if(iceConnectionState !== 'connected' && (!IS_SAFARI || iceConnectionState !== 'completed')) {\n return CALL_STATE.CONNECTING;\n } else {\n return CALL_STATE.CONNECTED;\n }\n }\n }\n\n get sortIndex() {\n const connectionState = this.connectionState;\n const state = CALL_STATE.CLOSED - connectionState + 1;\n let index = state * 10000000000000;\n index += 2147483647000 - (connectionState === CALL_STATE.PENDING && this.isOutgoing ? 0 : this.createdAt);\n return index;\n }\n\n public getVideoElement(type: CallMediaState['type']) {\n if(type === 'input') return this.elements.get('main');\n else {\n const mediaState = this.getMediaState('output');\n if(!mediaState) {\n return;\n }\n\n const type: WebRTCLineType = mediaState.videoState === 'active' ? 'video' : (mediaState.screencastState === 'active' ? 'screencast' : undefined);\n if(!type) {\n return;\n }\n\n const entry = this.description.findEntry((entry) => entry.type === type);\n if(!entry) {\n return;\n }\n\n return this.elements.get('' + entry.recvEntry.source);\n }\n }\n\n public async startScreenSharingInternal() {\n try {\n this.wasStartingScreen = true;\n this.wasStartingVideo = false;\n this.streamManager.types = ['audio', 'screencast'];\n await this.requestScreen();\n } catch(err) {\n this.log.error('startScreenSharing error', err);\n }\n }\n\n public async toggleScreenSharing() {\n if(this.isSharingVideo) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingScreen) {\n return this.stopVideoSharing();\n } else {\n return this.startScreenSharingInternal();\n }\n }\n\n public async startVideoSharingInternal() {\n try {\n this.wasStartingScreen = false;\n this.wasStartingVideo = true;\n this.streamManager.types = ['audio', 'video'];\n await this.requestInputSource(false, true, false);\n } catch(err) {\n this.log.error('startVideoSharing error', err);\n }\n }\n\n public async stopVideoSharing() {\n const mediaState = this.getMediaState('input');\n mediaState.videoState = mediaState.screencastState = 'inactive';\n\n const {streamManager, description} = this;\n const track = streamManager.inputStream.getVideoTracks()[0];\n if(track) {\n stopTrack(track);\n streamManager.appendToConference(description); // clear sender track\n }\n }\n\n public async toggleVideoSharing() {\n if(this.isSharingScreen) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharingInternal();\n }\n }\n\n public getMediaState(type: CallMediaState['type']) {\n return this.mediaStates[type];\n }\n\n public setMediaState(mediaState: CallMediaState) {\n this.mediaStates[mediaState.type] = mediaState;\n this.dispatchEvent('mediaState', mediaState);\n }\n\n public isSharingVideoType(type: 'video' | 'screencast') {\n try {\n const hasVideoTrack = super.isSharingVideo;\n return hasVideoTrack && !!((this.wasStartingScreen && type === 'screencast') || (this.wasStartingVideo && type === 'video'));\n\n // ! it will be used before the track appears\n // return !!this.description.entries.find((entry) => entry.type === type && entry.transceiver.sender.track.enabled);\n } catch(err) {\n return false;\n }\n }\n\n public get isSharingVideo() {\n return this.isSharingVideoType('video');\n }\n\n public get isSharingScreen() {\n return this.isSharingVideoType('screencast');\n }\n\n public get isMuted() {\n const audioTrack = this.streamManager.inputStream.getAudioTracks()[0];\n return !audioTrack?.enabled;\n }\n\n public get isClosing() {\n const {connectionState} = this;\n return connectionState === CALL_STATE.CLOSING || connectionState === CALL_STATE.CLOSED;\n }\n\n public get description(): localConferenceDescription {\n return this.connectionInstance?.description;\n }\n\n public setHangUpTimeout(timeout: number, reason: PhoneCallDiscardReason['_']) {\n this.clearHangUpTimeout();\n this.hangUpTimeout = ctx.setTimeout(() => {\n this.hangUpTimeout = undefined;\n this.hangUp(reason);\n }, timeout);\n }\n\n public clearHangUpTimeout() {\n if(this.hangUpTimeout !== undefined) {\n clearTimeout(this.hangUpTimeout);\n this.hangUpTimeout = undefined;\n }\n }\n\n public setPhoneCall(phoneCall: PhoneCall) {\n this.call = phoneCall;\n\n const {id} = phoneCall;\n if(this.id !== id) {\n const prevId = this.id;\n this.id = id;\n this.dispatchEvent('id', id, prevId);\n }\n }\n\n public async acceptCall() {\n const canAccept = (await Promise.all(this.dispatchResultableEvent('acceptCallOverride')))[0] ?? true;\n if(this.isClosing || !canAccept) {\n return;\n }\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n\n const call = this.call as PhoneCall.phoneCallRequested;\n this.requestInputSource(true, !!call.pFlags.video, false);\n\n const g_a_hash = call.g_a_hash;\n this.managers.appCallsManager.generateDh().then(async(dh) => {\n this.dh = { // ! it is correct\n g_a_hash,\n b: dh.a,\n g_b: dh.g_a,\n g_b_hash: dh.g_a_hash,\n p: dh.p\n };\n\n return this.managers.apiManager.invokeApi('phone.acceptCall', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n protocol: this.protocol,\n g_b: this.dh.g_b\n });\n }).then(async(phonePhoneCall) => {\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n }).catch((err) => {\n this.log.error('accept call error', err);\n // if(err.type === 'CALL_PROTOCOL_COMPAT_LAYER_INVALID') {\n\n // }\n\n this.hangUp('phoneCallDiscardReasonHangup');\n });\n }\n\n public joinCall() {\n this.log('joinCall');\n\n this.getEmojisFingerprint();\n\n this.overrideConnectionState();\n\n const {isOutgoing, encryptionKey, streamManager} = this;\n\n const configuration = getRtcConfiguration(this.call as PhoneCall.phoneCall);\n this.log('joinCall configuration', configuration);\n if(!configuration) return;\n\n const connectionInstance = this.connectionInstance = new CallConnectionInstance({\n call: this,\n streamManager,\n log: this.log.bindPrefix('connection')\n });\n\n const connection = connectionInstance.createPeerConnection(configuration);\n connection.addEventListener('iceconnectionstatechange', () => {\n const state = this.connectionState;\n if(this.connectedAt === undefined && state === CALL_STATE.CONNECTED) {\n this.connectedAt = Date.now();\n }\n\n this.dispatchEvent('state', state);\n });\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n connection.addEventListener('icecandidate', (event) => {\n const {candidate} = event;\n connection.log('onicecandidate', candidate);\n if(candidate?.candidate) {\n this.sendIceCandidate(candidate);\n }\n });\n connection.addEventListener('track', (event) => {\n const {track} = event;\n connection.log('ontrack', track);\n this.onTrack(event);\n });\n\n const description = connectionInstance.createDescription();\n\n this.encryptor = new P2PEncryptor(isOutgoing, encryptionKey);\n this.decryptor = new P2PEncryptor(!isOutgoing, encryptionKey);\n\n this.log('currentCall', this);\n\n if(isOutgoing) {\n connectionInstance.appendStreamToConference();\n }\n\n this.createDataChannel();\n\n this.processDecryptQueue();\n }\n\n private createDataChannelEntry() {\n const dataChannelEntry = this.description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n dataChannelEntry.sendEntry = dataChannelEntry.recvEntry = dataChannelEntry;\n }\n\n private createDataChannel() {\n if(this.connectionInstance.dataChannel) {\n return;\n }\n\n const channel = this.connectionInstance.createDataChannel({\n id: 0,\n negotiated: true\n });\n channel.addEventListener('message', (e) => {\n this.applyDataChannelData(JSON.parse(e.data));\n });\n channel.addEventListener('open', () => {\n this.sendMediaState();\n });\n }\n\n private applyDataChannelData(data: CallMediaState) {\n switch(data['@type']) {\n case 'MediaState': {\n data.type = 'output';\n this.log('got output media state', data);\n this.setMediaState(data);\n break;\n }\n\n default:\n this.log.error('unknown data channel data:', data);\n break;\n }\n }\n\n private _sendMediaState() {\n const {connectionInstance} = this;\n if(!connectionInstance) return;\n\n const mediaState = {...this.getMediaState('input')};\n // mediaState.videoRotation = 90;\n delete mediaState.type;\n this.log('sendMediaState', mediaState);\n\n connectionInstance.sendDataChannelData(mediaState);\n }\n\n public async sendCallSignalingData(data: CallSignalingData) {\n /* if(data['@type'] === 'InitialSetup') {\n this.filterNotVP8(data);\n } */\n\n const json = JSON.stringify(data);\n const arr = new TextEncoder().encode(json);\n const {bytes} = await this.encryptor.encryptRawPacket(arr);\n\n this.log('sendCallSignalingData', this.id, json);\n await this.managers.apiManager.invokeApi('phone.sendSignalingData', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n data: bytes\n });\n }\n\n public sendIceCandidate(iceCandidate: RTCIceCandidate) {\n this.log('sendIceCandidate', iceCandidate);\n const {candidate, sdpMLineIndex} = iceCandidate;\n if(sdpMLineIndex !== 0) {\n return;\n }\n\n const parsed = p2pParseCandidate(candidate);\n // const parsed = {sdpString: candidate};\n /* if(parsed.address.ip !== '') {\n return;\n } */\n\n this.sendCallSignalingData({\n '@type': 'Candidates',\n 'candidates': [parsed]\n });\n }\n\n public async confirmCall() {\n const {protocol, id, call} = this;\n const dh = this.dh as DiffieHellmanInfo.a;\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey((call as PhoneCall.phoneCallAccepted).g_b, dh.a, dh.p);\n\n const phonePhoneCall = await this.managers.apiManager.invokeApi('phone.confirmCall', {\n peer: await this.managers.appCallsManager.getCallInput(id),\n protocol: protocol,\n g_a: dh.g_a,\n key_fingerprint: key_fingerprint\n });\n\n this.encryptionKey = key;\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n this.joinCall();\n }\n\n public getEmojisFingerprint() {\n if(this.emojisFingerprint) return this.emojisFingerprint;\n if(this.getEmojisFingerprintPromise) return this.getEmojisFingerprintPromise;\n return this.getEmojisFingerprintPromise = apiManagerProxy.invokeCrypto('get-emojis-fingerprint', this.encryptionKey, this.dh.g_a).then((codePoints) => {\n this.getEmojisFingerprintPromise = undefined;\n return this.emojisFingerprint = codePoints.map((codePoints) => emojiFromCodePoints(codePoints)) as [string, string, string, string];\n });\n }\n\n private unlockStreamManager() {\n this.connectionInstance.streamManager.locked = false;\n this.connectionInstance.appendStreamToConference();\n }\n\n private async doTheMagic() {\n this.connectionInstance.appendStreamToConference();\n\n const connection = this.connectionInstance.connection;\n\n let answer = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n connection.getTransceivers().filter((transceiver) => transceiver.direction === 'recvonly').forEach((transceiver) => {\n const entry = this.connectionInstance.description.getEntryByMid(transceiver.mid);\n entry.transceiver = entry.recvEntry.transceiver = transceiver;\n transceiver.direction = 'sendrecv';\n });\n\n const isAnswer = false;\n\n const description = this.description;\n const bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n await connection.setRemoteDescription(sdpDescription);\n\n answer = await connection.createAnswer();\n\n await connection.setLocalDescription(answer);\n\n const initialSetup = parseSignalingData(parseSdp(answer.sdp));\n this.log('[InitialSetup] send 1');\n this.sendCallSignalingData(initialSetup);\n\n this.unlockStreamManager();\n }\n\n public overrideConnectionState(state?: CALL_STATE) {\n this._connectionState = state;\n this.dispatchEvent('state', this.connectionState);\n }\n\n public get duration() {\n return this.connectedAt !== undefined ? (Date.now() - this.connectedAt) / 1000 | 0 : 0;\n }\n\n protected onInputStream(stream: MediaStream): void {\n super.onInputStream(stream);\n\n const videoTrack = stream.getVideoTracks()[0];\n if(videoTrack) {\n const state = this.getMediaState('input');\n\n // handle starting camera\n if(!this.wasStartingScreen && !this.wasStartingVideo) {\n this.wasStartingVideo = true;\n }\n\n if(this.isSharingVideo) {\n state.videoState = 'active';\n } else if(this.isSharingScreen) {\n state.screencastState = 'active';\n }\n\n videoTrack.addEventListener('ended', () => {\n this.stopVideoSharing();\n }, {once: true});\n }\n\n if(stream.getAudioTracks().length) {\n this.onMutedChange();\n }\n }\n\n private onMutedChange() {\n const isMuted = this.isMuted;\n this.dispatchEvent('muted', isMuted);\n\n const state = this.getMediaState('input');\n state.muted = isMuted;\n }\n\n public toggleMuted(): Promise {\n return this.requestAudioSource(true).then(() => {\n this.setMuted();\n this.onMutedChange();\n });\n }\n\n public async hangUp(discardReason?: PhoneCallDiscardReason['_'], discardedByOtherParty?: boolean) {\n if(this.isClosing) {\n return;\n }\n\n this.discardReason = discardReason;\n this.log('hangUp', discardReason);\n this.overrideConnectionState(CALL_STATE.CLOSED);\n\n if(this.connectionInstance) {\n this.connectionInstance.closeConnectionAndStream(true);\n }\n\n if(discardReason && !discardedByOtherParty) {\n let hasVideo = false;\n for(const type in this.mediaStates) {\n const mediaState = this.mediaStates[type as 'input' | 'output'];\n hasVideo = mediaState.videoState === 'active' || mediaState.screencastState === 'active' || hasVideo;\n }\n\n await this.managers.appCallsManager.discardCall(this.id, this.duration, discardReason, hasVideo);\n }\n }\n\n private performCodec(_codec: P2PAudioCodec | P2PVideoCodec) {\n const payloadTypes: AudioCodec['payload-types'] = _codec.payloadTypes.map((payloadType) => {\n return {\n ...payloadType,\n 'rtcp-fbs': payloadType.feedbackTypes\n }\n });\n\n const codec: AudioCodec = {\n 'rtp-hdrexts': _codec.rtpExtensions,\n 'payload-types': payloadTypes\n };\n\n return codec;\n }\n\n private setDataToDescription(data: CallSignalingData.initialSetup) {\n this.description.setData({\n transport: {\n 'pwd': data.pwd,\n 'ufrag': data.ufrag,\n 'fingerprints': data.fingerprints,\n 'rtcp-mux': true\n },\n audio: this.performCodec(data.audio),\n video: data.video ? this.performCodec(data.video) as VideoCodec : undefined,\n screencast: data.screencast ? this.performCodec(data.screencast) as VideoCodec : undefined\n });\n }\n\n private filterNotVP8(initialSetup: CallSignalingData.initialSetup) {\n if(!this.isOutgoing) { // only VP8 works now\n [initialSetup.video, initialSetup.screencast].filter(Boolean).forEach((codec) => {\n const payloadTypes = codec.payloadTypes;\n const idx = payloadTypes.findIndex((payloadType) => payloadType.name === 'VP8');\n const vp8PayloadType = payloadTypes[idx];\n const rtxIdx = payloadTypes.findIndex((payloadType) => +payloadType.parameters?.apt === vp8PayloadType.id);\n codec.payloadTypes = [payloadTypes[idx], payloadTypes[rtxIdx]];\n });\n }\n }\n\n public async applyCallSignalingData(data: CallSignalingData) {\n this.log('applyCallSignalingData', this, data);\n\n const {connection, description} = this.connectionInstance;\n\n switch(data['@type']) {\n case 'InitialSetup': {\n this.log('[sdp] InitialSetup', data);\n\n this.filterNotVP8(data);\n this.setDataToDescription(data);\n\n const performSsrcGroups = (ssrcGroups: P2PVideoCodec['ssrcGroups']): GroupCallParticipantVideoSourceGroup[] => {\n return ssrcGroups.map((ssrcGroup) => {\n return {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics: ssrcGroup.semantics,\n sources: ssrcGroup.ssrcs.map((source) => +source)\n };\n });\n };\n\n const ssrcs = [\n generateSsrc('audio', +data.audio.ssrc),\n data.video ? generateSsrc('video', performSsrcGroups(data.video.ssrcGroups)) : undefined,\n data.screencast ? generateSsrc('screencast', performSsrcGroups(data.screencast.ssrcGroups)) : undefined\n ].filter(Boolean);\n\n ssrcs.forEach((ssrc) => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n return;\n }\n\n const sendRecvEntry = description.findFreeSendRecvEntry(ssrc.type, false);\n entry = new ConferenceEntry(sendRecvEntry.mid, ssrc.type);\n entry.setDirection('sendrecv');\n sendRecvEntry.recvEntry = entry;\n\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n });\n\n this.createDataChannelEntry();\n\n const isAnswer = this.offerSent;\n this.offerSent = false;\n\n const bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n this.log('[sdp] remote', sdpDescription.sdp);\n\n await connection.setRemoteDescription(sdpDescription);\n\n await this.tryToReleaseCandidates();\n\n if(!isAnswer) {\n await this.doTheMagic();\n }\n\n break;\n }\n\n case 'Candidates': {\n for(const candidate of data.candidates) {\n const init: RTCIceCandidateInit = P2PSdpBuilder.generateCandidate(candidate);\n init.sdpMLineIndex = 0;\n const iceCandidate = new RTCIceCandidate(init);\n this.candidates.push(iceCandidate);\n }\n\n await this.tryToReleaseCandidates();\n break;\n }\n\n default: {\n this.log.error('unrecognized signaling data', data);\n }\n }\n }\n\n public async tryToReleaseCandidates() {\n const {connectionInstance} = this;\n if(!connectionInstance) {\n return;\n }\n\n const {connection} = connectionInstance;\n if(connection.remoteDescription) {\n const promises: Promise[] = this.candidates.map((candidate) => this.addIceCandidate(connection, candidate));\n this.candidates.length = 0;\n\n await Promise.all(promises);\n } else {\n this.log('[candidates] postpone');\n }\n }\n\n private async addIceCandidate(connection: RTCPeerConnection, candidate: RTCIceCandidate) {\n this.log('[candidate] start', candidate);\n try {\n // if(!candidate.address) return;\n await connection.addIceCandidate(candidate);\n this.log('[candidate] add', candidate);\n } catch(e) {\n this.log.error('[candidate] error', candidate, e);\n }\n }\n\n private async processDecryptQueue() {\n const {encryptor} = this;\n if(!encryptor) {\n this.log.warn('got encrypted signaling data before the encryption key');\n return;\n }\n\n const length = this.decryptQueue.length;\n if(!length) {\n return;\n }\n\n const queue = this.decryptQueue.slice();\n this.decryptQueue.length = 0;\n\n for(const data of queue) {\n const decryptedData = await encryptor.decryptRawPacket(data);\n if(!decryptedData) {\n continue;\n }\n\n // this.log('[update] updateNewCallSignalingData', update, decryptedData);\n\n const str = new TextDecoder().decode(decryptedData);\n try {\n const signalingData: CallSignalingData = JSON.parse(str);\n this.log('[update] updateNewCallSignalingData', signalingData);\n this.applyCallSignalingData(signalingData);\n } catch(err) {\n this.log.error('wrong signaling data', str);\n this.hangUp('phoneCallDiscardReasonDisconnect');\n callsController.dispatchEvent('incompatible', this.interlocutorUserId);\n }\n }\n }\n\n public onUpdatePhoneCallSignalingData(data: Uint8Array) {\n this.decryptQueue.push(data);\n this.processDecryptQueue();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {PhoneCallProtocol} from '../../../layer';\n\nexport default function getCallProtocol(): PhoneCallProtocol {\n return {\n _: 'phoneCallProtocol',\n pFlags: {\n udp_p2p: true,\n udp_reflector: true\n },\n min_layer: 92,\n max_layer: 92,\n library_versions: ['4.0.0']\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {PhoneCall} from '../../../layer';\n\nexport default function getRtcConfiguration(call: PhoneCall.phoneCall): RTCConfiguration {\n const iceServers: RTCIceServer[] = [];\n call.connections.forEach((connection) => {\n switch(connection._) {\n /* case 'callServerTypeTelegramReflector': {\n break;\n } */\n case 'phoneConnectionWebrtc': {\n const {ip, ipv6, port, username, password} = connection;\n const urls: string[] = [];\n if(connection.pFlags.turn) {\n if(ip) {\n urls.push(`turn:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`turn:[${ipv6}]:${port}`);\n }\n } else if(connection.pFlags.stun) {\n if(ip) {\n urls.push(`stun:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`stun:[${ipv6}]:${port}`);\n }\n }\n\n if(urls.length > 0) {\n iceServers.push({\n urls,\n username,\n credential: password\n });\n }\n break;\n }\n }\n });\n\n return {\n iceServers,\n iceTransportPolicy: call.pFlags.p2p_allowed ? 'all' : 'relay'\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getScreenStream from './getScreenStream';\nimport getStream from './getStream';\n\n/**\n * ! Use multiple constraints together only with first invoke\n */\nexport default function getStreamCached() {\n const _cache: {\n main: Partial<{\n audio: Promise,\n video: Promise\n }>,\n screen: Partial<{\n audio: Promise,\n video: Promise\n }>\n } = {\n main: {},\n screen: {}\n };\n\n return async(options: {\n isScreen: true,\n constraints: DisplayMediaStreamOptions,\n } | {\n isScreen?: false,\n constraints: MediaStreamConstraints,\n muted: boolean\n }) => {\n const {isScreen, constraints} = options;\n const cache = _cache[isScreen ? 'screen' : 'main'];\n let promise: Promise = cache[constraints.audio ? 'audio' : 'video'];\n\n if(!promise) {\n promise = (isScreen ? getScreenStream : getStream)(constraints, (options as any).muted);\n if(constraints.audio && !cache.audio) cache.audio = promise.finally(() => cache.audio = undefined);\n if(constraints.video && !cache.video) cache.video = promise.finally(() => cache.video = undefined);\n }\n\n try {\n return await promise;\n /* let out: Partial<{\n audio: MediaStream,\n video: MediaStream\n }> = {};\n\n await Promise.all([\n constraints.audio && cache.audio.then((stream) => out.audio = stream),\n constraints.video && cache.video.then((stream) => out.video = stream)\n ].filter(Boolean));\n\n return out; */\n } catch(err) {\n throw err;\n }\n };\n}\n\n(window as any).getStreamCached = getStreamCached;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase, {EventListenerListeners} from '../../helpers/eventListenerBase';\nimport noop from '../../helpers/noop';\nimport {logger} from '../logger';\nimport getAudioConstraints from './helpers/getAudioConstraints';\nimport getScreenConstraints from './helpers/getScreenConstraints';\nimport getStreamCached from './helpers/getStreamCached';\nimport getVideoConstraints from './helpers/getVideoConstraints';\nimport stopTrack from './helpers/stopTrack';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport StreamManager, {StreamItem} from './streamManager';\n\nexport type TryAddTrackOptions = {\n stream: MediaStream,\n track: MediaStreamTrack,\n type: StreamItem['type'],\n source?: string\n};\n\nexport default abstract class CallInstanceBase extends EventListenerBase {\n protected log: ReturnType;\n protected outputDeviceId: string;\n\n protected player: HTMLElement;\n protected elements: Map;\n\n protected audio: HTMLAudioElement;\n // protected fixedSafariAudio: boolean;\n\n protected getStream: ReturnType;\n\n constructor() {\n super(false);\n\n const player = this.player = document.createElement('div');\n player.classList.add('call-player');\n player.style.display = 'none';\n document.body.append(player);\n\n this.elements = new Map();\n\n // possible Safari fix\n const audio = this.audio = new Audio();\n audio.autoplay = true;\n audio.volume = 1.0;\n this.player.append(audio);\n this.elements.set('audio', audio);\n\n this.fixSafariAudio();\n\n this.getStream = getStreamCached();\n }\n\n public get isSharingAudio() {\n return !!this.streamManager.hasInputTrackKind('audio');\n }\n\n public get isSharingVideo() {\n return !!this.streamManager.hasInputTrackKind('video');\n }\n\n public abstract get isMuted(): boolean;\n public abstract get isClosing(): boolean;\n\n public fixSafariAudio() {\n // if(this.fixedSafariAudio) return;\n this.audio.play().catch(noop);\n // this.fixedSafariAudio = true;\n }\n\n public requestAudioSource(muted: boolean) {\n return this.requestInputSource(true, false, muted);\n }\n\n public requestInputSource(audio: boolean, video: boolean, muted: boolean) {\n const {streamManager} = this;\n if(streamManager) {\n const isAudioGood = !audio || this.isSharingAudio;\n const isVideoGood = !video || this.isSharingVideo;\n if(isAudioGood && isVideoGood) {\n return Promise.resolve();\n }\n }\n\n const constraints: MediaStreamConstraints = {\n audio: audio && getAudioConstraints(),\n video: video && getVideoConstraints()\n };\n\n return this.getStream({\n constraints,\n muted\n }).then((stream) => {\n this.onInputStream(stream);\n });\n }\n\n public requestScreen() {\n return this.getStream({\n isScreen: true,\n constraints: getScreenConstraints(true)\n }).then((stream) => {\n this.onInputStream(stream);\n });\n }\n\n public getElement(endpoint: number | string) {\n return this.elements.get('' + endpoint);\n }\n\n public abstract get streamManager(): StreamManager;\n public abstract get description(): LocalConferenceDescription;\n public abstract toggleMuted(): Promise;\n\n public cleanup() {\n this.player.textContent = '';\n this.player.remove();\n this.elements.clear();\n\n // can have no connectionInstance but streamManager with input stream\n this.streamManager.stop();\n\n super.cleanup();\n }\n\n public onTrack(event: RTCTrackEvent) {\n this.tryAddTrack({\n stream: event.streams[0],\n track: event.track,\n type: 'output'\n });\n }\n\n public saveInputVideoStream(stream: MediaStream, type?: string) {\n const track = stream.getVideoTracks()[0];\n this.tryAddTrack({\n stream,\n track,\n type: 'input',\n source: type || 'main'\n });\n }\n\n public tryAddTrack({stream, track, type, source}: TryAddTrackOptions) {\n if(!source) {\n source = StreamManager.getSource(stream, type);\n }\n\n this.log('tryAddTrack', stream, track, type, source);\n\n const isOutput = type === 'output';\n\n const {player, elements, streamManager} = this;\n\n const tagName = track.kind as StreamItem['kind'];\n const isVideo = tagName === 'video';\n\n const elementEndpoint = isVideo ? source : tagName;\n let element = elements.get(elementEndpoint);\n\n if(isVideo) {\n track.addEventListener('ended', () => {\n this.log('[track] onended');\n elements.delete(elementEndpoint);\n // element.remove();\n }, {once: true});\n }\n\n if(isOutput) {\n streamManager.addTrack(stream, track, type);\n }\n\n const useStream = isVideo ? stream : streamManager.outputStream;\n if(!element) {\n element = document.createElement(tagName);\n element.autoplay = true;\n element.srcObject = useStream;\n element.volume = 1.0;\n\n if((element as any).sinkId !== 'undefined') {\n const {outputDeviceId} = this;\n if(outputDeviceId) {\n (element as any).setSinkId(outputDeviceId);\n }\n }\n\n if(!isVideo) {\n player.appendChild(element);\n } else {\n element.setAttribute('playsinline', 'true');\n element.muted = true;\n }\n // audio.play();\n\n elements.set(elementEndpoint, element);\n } else {\n if(element.paused) {\n element.play().catch(noop);\n }\n\n // ! EVEN IF MEDIASTREAM IS THE SAME NEW TRACK WON'T PLAY WITHOUT REPLACING IT WHEN NEW PARTICIPANT IS ENTERING !\n // if(element.srcObject !== useStream) {\n element.srcObject = useStream;\n // }\n }\n\n return source;\n }\n\n public setMuted(muted?: boolean) {\n this.streamManager.inputStream.getAudioTracks().forEach((track) => {\n if(track?.kind === 'audio') {\n track.enabled = muted === undefined ? !track.enabled : !muted;\n }\n });\n }\n\n protected onInputStream(stream: MediaStream): void {\n if(!this.isClosing) {\n const videoTracks = stream.getVideoTracks();\n if(videoTracks.length) {\n this.saveInputVideoStream(stream, 'main');\n }\n\n const {streamManager, description} = this;\n streamManager.addStream(stream, 'input');\n\n if(description) {\n streamManager.appendToConference(description);\n }\n } else { // if call is declined earlier than stream appears\n stream.getTracks().forEach((track) => {\n stopTrack(track);\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum CALL_STATE {\n CONNECTED,\n CONNECTING,\n EXCHANGING_KEYS,\n PENDING,\n REQUESTING,\n CLOSING,\n CLOSED\n}\n\nexport default CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\n\nexport type CallAudioAssetName = 'call_busy.mp3' | 'call_connect.mp3' | 'call_end.mp3' | 'call_incoming.mp3' | 'call_outgoing.mp3' | 'voip_failed.mp3' | 'voip_connecting.mp3';\n\nlet audioAsset: AudioAssetPlayer;\nexport default function getCallAudioAsset() {\n return audioAsset ??= new AudioAssetPlayer([\n 'call_busy.mp3',\n 'call_connect.mp3',\n 'call_end.mp3',\n 'call_incoming.mp3',\n 'call_outgoing.mp3',\n 'voip_failed.mp3'\n ]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getCallAudioAsset, {CallAudioAssetName} from '../../components/call/getAudioAsset';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport tsNow from '../../helpers/tsNow';\nimport {PhoneCallProtocol} from '../../layer';\nimport {CallId} from '../appManagers/appCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport rootScope from '../rootScope';\nimport CallInstance from './callInstance';\nimport CALL_STATE from './callState';\n\nconst CALL_REQUEST_TIMEOUT = 45e3;\n\nexport class CallsController extends EventListenerBase<{\n instance: (details: {hasCurrent: boolean, instance: CallInstance}) => void,\n accepting: (instance: CallInstance) => void, // это костыль. используется при параллельном вызове, чтобы заменить звонок в topbarCall\n incompatible: (userId: UserId) => void,\n}> {\n private log: ReturnType;\n private managers: AppManagers;\n private audioAsset: AudioAssetPlayer;\n private instances: Map;\n private sortedInstances: Array;\n private tempId: number;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n this.log = logger('CC');\n\n if(!IS_CALL_SUPPORTED) {\n return;\n }\n\n this.audioAsset = getCallAudioAsset();\n this.tempId = 0;\n this.instances = new Map();\n this.sortedInstances = [];\n\n rootScope.addEventListener('call_update', async(call) => {\n let instance = this.instances.get(call.id);\n\n if(instance) {\n instance.setPhoneCall(call);\n }\n\n switch(call._) {\n case 'phoneCallDiscarded': {\n if(instance) {\n instance.hangUp(call.reason?._, true);\n }\n\n break;\n }\n\n case 'phoneCallAccepted': {\n if(instance) {\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\n instance.hangUp('phoneCallDiscardReasonDisconnect');\n rootScope.dispatchEvent('call_incompatible', instance.interlocutorUserId);\n break;\n } */\n\n instance.confirmCall();\n }\n\n break;\n }\n\n case 'phoneCallRequested': {\n if(!instance) {\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\n rootScope.dispatchEvent('call_incompatible', call.admin_id);\n break;\n } */\n\n instance = this.createCallInstance({\n isOutgoing: false,\n interlocutorUserId: call.admin_id\n });\n\n instance.overrideConnectionState(CALL_STATE.PENDING);\n instance.setPhoneCall(call);\n instance.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonMissed');\n }\n\n break;\n }\n\n case 'phoneCall': {\n if(!instance || instance.encryptionKey) {\n break;\n }\n\n const g_a = instance.dh.g_a = call.g_a_or_b;\n const dh = instance.dh;\n const g_a_hash = await apiManagerProxy.invokeCrypto('sha256', g_a);\n if(!bytesCmp(dh.g_a_hash, g_a_hash)) {\n this.log.error('Incorrect g_a_hash', dh.g_a_hash, g_a_hash);\n break;\n }\n\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey(g_a, dh.b, dh.p);\n if(call.key_fingerprint !== key_fingerprint) {\n this.log.error('Incorrect key fingerprint', call.key_fingerprint, key_fingerprint, g_a, dh);\n instance.hangUp('phoneCallDiscardReasonDisconnect');\n break;\n }\n\n instance.encryptionKey = key;\n instance.joinCall();\n\n break;\n }\n }\n });\n\n rootScope.addEventListener('call_signaling', ({callId, data}) => {\n const instance = this.instances.get(callId);\n if(instance?.id !== callId) {\n return;\n }\n\n instance.onUpdatePhoneCallSignalingData(data);\n });\n }\n\n public get currentCall() {\n return this.sortedInstances[0];\n }\n\n public getCallByUserId(userId: UserId) {\n for(const [callId, instance] of this.instances) {\n if(instance.interlocutorUserId === userId) {\n return instance;\n }\n }\n }\n\n private createCallInstance(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n protocol?: PhoneCallProtocol\n }) {\n const call = new CallInstance({\n managers: this.managers,\n ...options\n });\n\n call.addEventListener('state', (state) => {\n const currentCall = this.currentCall;\n if(state === CALL_STATE.CLOSED) {\n this.instances.delete(call.id);\n indexOfAndSplice(this.sortedInstances, call);\n } else {\n insertInDescendSortedArray(this.sortedInstances, call, 'sortIndex');\n }\n\n if(state === CALL_STATE.EXCHANGING_KEYS) {\n call.wasTryingToJoin = true;\n }\n\n const hasConnected = call.connectedAt !== undefined;\n if(state === CALL_STATE.EXCHANGING_KEYS || (state === CALL_STATE.CONNECTING && hasConnected)) {\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonDisconnect');\n } else {\n call.clearHangUpTimeout();\n }\n\n if(currentCall === call || !currentCall) {\n if(state === CALL_STATE.CLOSED) {\n if(!call.isOutgoing && !call.wasTryingToJoin) { // incoming call has been accepted on other device or ended\n this.audioAsset.stopSound();\n } else if(call.wasTryingToJoin && !hasConnected) { // something has happened during the key exchanging\n this.audioAsset.playSound('voip_failed.mp3');\n } else {\n this.audioAsset.playSound(call.discardReason === 'phoneCallDiscardReasonBusy' ? 'call_busy.mp3' : 'call_end.mp3');\n }\n } else if(state === CALL_STATE.PENDING) {\n this.audioAsset.playSound(call.isOutgoing ? 'call_outgoing.mp3' : 'call_incoming.mp3', true);\n } else if(state === CALL_STATE.EXCHANGING_KEYS) {\n this.audioAsset.playSoundIfDifferent('call_connect.mp3');\n } else if(state === CALL_STATE.CONNECTING) {\n if(call.duration) {\n this.audioAsset.playSound('voip_connecting.mp3', true);\n }\n } else {\n this.audioAsset.stopSound();\n }\n }\n });\n\n call.addEventListener('id', (id, prevId) => {\n if(prevId !== undefined) {\n this.instances.delete(prevId);\n }\n\n const hasCurrent = !!this.currentCall;\n this.instances.set(id, call);\n\n if(prevId === undefined) {\n this.dispatchEvent('instance', {instance: call, hasCurrent: hasCurrent});\n }\n });\n\n return call;\n }\n\n public async startCallInternal(userId: UserId, isVideo: boolean) {\n this.log('p2pStartCallInternal', userId, isVideo);\n\n const fullInfo = await this.managers.appProfileManager.getProfile(userId);\n if(!fullInfo) return;\n\n const {video_calls_available} = fullInfo.pFlags;\n\n const call = this.createCallInstance({\n isOutgoing: true,\n interlocutorUserId: userId\n });\n\n call.requestInputSource(true, !!(isVideo && video_calls_available), false);\n\n call.overrideConnectionState(CALL_STATE.REQUESTING);\n call.setPhoneCall({\n _: 'phoneCallWaiting',\n access_hash: '',\n admin_id: NULL_PEER_ID,\n date: tsNow(true),\n id: --this.tempId,\n participant_id: userId,\n protocol: call.protocol,\n pFlags: {\n video: isVideo || undefined\n }\n });\n\n // return;\n this.managers.appCallsManager.generateDh().then(async(dh) => {\n call.dh = dh;\n\n return this.managers.appCallsManager.requestCall(userId, call.protocol, call.dh.g_a_hash, isVideo && video_calls_available);\n }).then((phoneCall) => {\n call.overrideConnectionState(CALL_STATE.PENDING);\n call.setPhoneCall(phoneCall);\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonHangup');\n });\n }\n}\n\nconst callsController = new CallsController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.callsController = callsController);\nexport default callsController;\n","export const GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX = 50;\nexport const GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS = 100;\nexport const GROUP_CALL_PARTICIPANTS_LOAD_LIMIT = 100;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {GroupCallConnectionType, JoinGroupCallJsonPayload} from '../appManagers/appGroupCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport rootScope from '../rootScope';\nimport CallConnectionInstanceBase, {CallConnectionInstanceOptions} from './callConnectionInstanceBase';\nimport GroupCallInstance from './groupCallInstance';\nimport filterServerCodecs from './helpers/filterServerCodecs';\nimport fixLocalOffer from './helpers/fixLocalOffer';\nimport processMediaSection from './helpers/processMediaSection';\nimport {ConferenceEntry} from './localConferenceDescription';\nimport SDP from './sdp';\nimport SDPMediaSection from './sdp/mediaSection';\nimport {WebRTCLineType} from './sdpBuilder';\nimport {UpdateGroupCallConnectionData} from './types';\n\nexport default class GroupCallConnectionInstance extends CallConnectionInstanceBase {\n private groupCall: GroupCallInstance;\n public updateConstraints?: boolean;\n private type: GroupCallConnectionType;\n private options: {\n type: Extract,\n isMuted?: boolean,\n joinVideo?: boolean,\n rejoin?: boolean\n } | {\n type: Extract,\n };\n\n private updateConstraintsInterval: number;\n public negotiateThrottled: () => void;\n\n private managers: AppManagers;\n\n constructor(options: CallConnectionInstanceOptions & {\n groupCall: GroupCallConnectionInstance['groupCall'],\n type: GroupCallConnectionInstance['type'],\n options: GroupCallConnectionInstance['options'],\n managers: AppManagers\n }) {\n super(options);\n\n this.negotiateThrottled = throttle(this.negotiate.bind(this), 0, false);\n }\n\n public createPeerConnection() {\n return this.connection || super.createPeerConnection({\n iceServers: [],\n iceTransportPolicy: 'all',\n bundlePolicy: 'max-bundle',\n rtcpMuxPolicy: 'require',\n iceCandidatePoolSize: 0\n // sdpSemantics: \"unified-plan\",\n // extmapAllowMixed: true,\n });\n }\n\n public createDataChannel() {\n if(this.dataChannel) {\n return this.dataChannel;\n }\n\n const dataChannel = super.createDataChannel();\n\n dataChannel.addEventListener('open', () => {\n this.maybeUpdateRemoteVideoConstraints();\n });\n\n dataChannel.addEventListener('close', () => {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n });\n\n return dataChannel;\n }\n\n public createDescription() {\n if(this.description) {\n return this.description;\n }\n\n const description = super.createDescription();\n\n /* const perType = 0;\n const types = ['audio' as const, 'video' as const];\n const count = types.length * perType;\n const init: RTCRtpTransceiverInit = {direction: 'recvonly'};\n types.forEach((type) => {\n for(let i = 0; i < perType; ++i) {\n description.createEntry(type).createTransceiver(connection, init);\n }\n }); */\n\n return description;\n }\n\n public appendStreamToConference() {\n super.appendStreamToConference();/* .then(() => {\n currentGroupCall.connections.main.negotiating = false;\n this.startNegotiation({\n type: type,\n isMuted: muted,\n rejoin\n });\n }); */\n }\n\n private async invokeJoinGroupCall(localSdp: SDP, mainChannels: SDPMediaSection[], options: GroupCallConnectionInstance['options']) {\n const {groupCall, description} = this;\n const groupCallId = groupCall.id;\n\n const processedChannels = mainChannels.map((section) => {\n const processed = processMediaSection(localSdp, section);\n\n this.sources[processed.entry.type as 'video' | 'audio'] = processed.entry;\n\n return processed;\n });\n\n const audioChannel = processedChannels.find((channel) => channel.media.mediaType === 'audio');\n const videoChannel = processedChannels.find((channel) => channel.media.mediaType === 'video');\n let {source, params} = audioChannel || {};\n const useChannel = videoChannel || audioChannel;\n\n const channels: {[type in WebRTCLineType]?: typeof audioChannel} = {\n audio: audioChannel,\n video: videoChannel\n };\n\n description.entries.forEach((entry) => {\n if(entry.direction === 'sendonly') {\n const channel = channels[entry.type];\n if(!channel) return;\n\n description.setEntrySource(entry, channel.sourceGroups || channel.source);\n description.setEntryPeerId(entry, rootScope.myId);\n }\n });\n\n // overwrite ssrc with audio in video params\n if(params !== useChannel.params) {\n const data: JoinGroupCallJsonPayload = JSON.parse(useChannel.params.data);\n // data.ssrc = source || data.ssrc - 1; // audio channel can be missed in screensharing\n if(source) data.ssrc = source;\n else delete data.ssrc;\n params = {\n _: 'dataJSON',\n data: JSON.stringify(data)\n };\n }\n\n const update = await this.managers.appGroupCallsManager.joinGroupCall(groupCallId, params, options);\n\n const data: UpdateGroupCallConnectionData = JSON.parse(update.params.data);\n\n data.audio = data.audio || groupCall.connections.main.description.audio;\n description.setData(data);\n filterServerCodecs(mainChannels, data);\n\n return data;\n }\n\n protected async negotiateInternal() {\n const {connection, description} = this;\n const isNewConnection = connection.iceConnectionState === 'new' && !description.getEntryByMid('0').source;\n const log = this.log.bindPrefix('startNegotiation');\n log('start');\n\n const originalOffer = await connection.createOffer({iceRestart: false});\n\n if(isNewConnection && this.dataChannel) {\n const dataChannelEntry = description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n }\n\n const {sdp: localSdp, offer} = fixLocalOffer({\n offer: originalOffer,\n data: description\n });\n\n log('[sdp] setLocalDescription', offer.sdp);\n await connection.setLocalDescription(offer);\n\n const mainChannels = localSdp.media.filter((media) => {\n return media.mediaType !== 'application' && media.isSending;\n });\n\n if(isNewConnection) {\n try {\n await this.invokeJoinGroupCall(localSdp, mainChannels, this.options);\n } catch(e) {\n this.log.error('[tdweb] joinGroupCall error', e);\n }\n }\n\n /* if(!data) {\n log('abort 0');\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n /* if(connection.iceConnectionState !== 'new') {\n log(`abort 1 connectionState=${connection.iceConnectionState}`);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n /* if(this.currentGroupCall !== currentGroupCall || connectionHandler.connection !== connection) {\n log('abort', this.currentGroupCall, currentGroupCall);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n const isAnswer = true;\n // const _bundleMids = bundleMids.slice();\n const entriesToDelete: ConferenceEntry[] = [];\n const bundle = localSdp.bundle;\n forEachReverse(bundle, (mid, idx, arr) => {\n const entry = description.getEntryByMid(mid);\n if(entry.shouldBeSkipped(isAnswer)) {\n arr.splice(idx, 1);\n entriesToDelete.push(entry);\n }\n });\n\n /* forEachReverse(description.entries, (entry, idx, arr) => {\n const mediaSection = _parsedSdp.media.find((section) => section.oa.get('mid').oa === entry.mid);\n const deleted = !mediaSection;\n // const deleted = !_bundleMids.includes(entry.mid); // ! can't use it because certain mid can be missed in bundle\n if(deleted) {\n arr.splice(idx, 1);\n }\n }); */\n\n const entries = localSdp.media.map((section) => {\n const mid = section.mid;\n let entry = description.getEntryByMid(mid);\n if(!entry) {\n entry = new ConferenceEntry(mid, section.mediaType);\n entry.setDirection('inactive');\n }\n\n return entry;\n });\n\n const answerDescription: RTCSessionDescriptionInit = {\n type: 'answer',\n sdp: description.generateSdp({\n bundle,\n entries,\n isAnswer\n })\n };\n\n entriesToDelete.forEach((entry) => {\n description.deleteEntry(entry);\n });\n\n log(`[sdp] setRemoteDescription signaling=${connection.signalingState} ice=${connection.iceConnectionState} gathering=${connection.iceGatheringState} connection=${connection.connectionState}`, answerDescription.sdp);\n await connection.setRemoteDescription(answerDescription);\n\n log('end');\n }\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n promise = super.negotiate();\n\n if(this.updateConstraints) {\n promise.then(() => {\n this.maybeUpdateRemoteVideoConstraints();\n this.updateConstraints = false;\n });\n }\n\n if(this.options.type === 'presentation') {\n promise.then(() => {\n this.connection.getTransceivers().find((transceiver) => {\n if(transceiver.sender?.track?.kind === 'video') {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n }\n });\n });\n }\n\n return promise;\n }\n\n public maybeUpdateRemoteVideoConstraints() {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.log('maybeUpdateRemoteVideoConstraints');\n\n // * https://github.com/TelegramMessenger/tgcalls/blob/6f2746e04c9b040f8c8dfc64d916a1853d09c4ce/tgcalls/group/GroupInstanceCustomImpl.cpp#L2549\n type VideoConstraints = {minHeight?: number, maxHeight: number};\n const obj: {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {[endpoint: string]: VideoConstraints},\n defaultConstraints: VideoConstraints,\n onStageEndpoints: string[]\n } = {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {},\n defaultConstraints: {maxHeight: 0},\n onStageEndpoints: []\n };\n\n for(const entry of this.description.entries) {\n if(entry.direction !== 'recvonly' || entry.type !== 'video') {\n continue;\n }\n\n const {endpoint} = entry;\n obj.onStageEndpoints.push(endpoint);\n obj.constraints[endpoint] = {\n minHeight: 180,\n maxHeight: 720\n };\n }\n\n this.sendDataChannelData(obj);\n\n if(!obj.onStageEndpoints.length) {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n } else if(!this.updateConstraintsInterval) {\n this.updateConstraintsInterval = window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this), 5000);\n }\n }\n\n public addInputVideoStream(stream: MediaStream) {\n // const {sources} = this;\n // if(sources?.video) {\n // const source = this.sources.video.source;\n // stream.source = '' + source;\n this.groupCall.saveInputVideoStream(stream, this.type);\n // }\n\n this.streamManager.addStream(stream, 'input');\n this.appendStreamToConference(); // replace sender track\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {DataJSON} from '../../../layer';\nimport {JoinGroupCallJsonPayload} from '../../appManagers/appGroupCallsManager';\nimport SDP from '../sdp';\nimport {Ssrc} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function processMediaSection(sdp: SDP, media: SDP['media'][0]) {\n const sectionInfo = parseMediaSectionInfo(sdp, media);\n\n const mediaType: Exclude = media.mediaType as any;\n const entry: Ssrc = {\n source: sectionInfo.source,\n sourceGroups: sectionInfo.sourceGroups,\n type: mediaType\n };\n\n // do not change this value, otherwise onconnectionstatechange won't fire\n sectionInfo.fingerprint.setup = 'active';\n const payload: JoinGroupCallJsonPayload = {\n 'fingerprints': [sectionInfo.fingerprint],\n 'pwd': sectionInfo.pwd,\n 'ssrc': sectionInfo.source,\n 'ssrc-groups': sectionInfo.sourceGroups || [],\n 'ufrag': sectionInfo.ufrag\n };\n const paramsDataJson = JSON.stringify(payload);\n\n const params: DataJSON = {\n _: 'dataJSON',\n data: paramsDataJson\n };\n\n return {\n params,\n source: sectionInfo.source,\n media,\n sourceGroups: sectionInfo.sourceGroups,\n entry\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport SDPMediaSection from '../sdp/mediaSection';\nimport {UpdateGroupCallConnectionData, Codec} from '../types';\n\nexport default function filterServerCodecs(mainChannels: SDPMediaSection[], data: UpdateGroupCallConnectionData) {\n // ! Need to filter server's extmap for Firefox\n const performExtmap = (channel: typeof mainChannels[0]) => {\n const out: {[id: string]: string} = {};\n const extmap = channel.attributes.get('extmap');\n extmap.forEach((extmap) => {\n const id = extmap.key.split('/', 1)[0];\n out[id] = extmap.value;\n });\n\n return out;\n };\n\n const codecsToPerform: [Codec, 'audio' | 'video'][] = /* flatten([data, dataPresentation].filter(Boolean).map((data) => {\n return */['audio' as const, 'video' as const].filter((type) => data[type]).map((type) => ([data[type], type]));\n // }));\n\n codecsToPerform.forEach(([codec, type]) => {\n const channel = mainChannels.find((line) => line.mediaType === type);\n if(!channel) {\n return;\n }\n\n const extmap = performExtmap(channel);\n forEachReverse(codec['rtp-hdrexts'], (value, index, arr) => {\n if(extmap[value.id] !== value.uri) {\n arr.splice(index, 1);\n console.log(`[sdp] filtered extmap:`, value, index, type);\n }\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport copy from '../../../helpers/object/copy';\nimport {ConferenceEntry} from '../localConferenceDescription';\nimport {parseSdp, addSimulcast} from '../sdp/utils';\nimport {generateMediaFirstLine, SDPBuilder} from '../sdpBuilder';\nimport {UpdateGroupCallConnectionData} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function fixLocalOffer(options: {\n offer: RTCSessionDescriptionInit,\n data: UpdateGroupCallConnectionData,\n skipAddingMulticast?: boolean\n // mids?: string[]\n}) {\n const {offer, data} = options;\n const sdp = parseSdp(offer.sdp);\n let hasMunged = false;\n\n if(!options.skipAddingMulticast) {\n hasMunged = addSimulcast(sdp) || hasMunged;\n }\n\n // const bundleLine = parsedSdp.session.lines.find((line) => line.Ha?.key === 'group');\n // const bundleMids = bundleLine.value.split(' ').slice(1);\n\n forEachReverse(sdp.media, (section, idx, arr) => {\n // const mid = section.oa.get('mid').oa;\n\n // это может случиться при выключении и включении видео. почему-то появится секция уже удалённая\n // ! нельзя тут модифицировать локальное описание, будет критовать\n /* if(mids && !mids.includes(mid) && !bundleMids.includes(mid)) {\n console.error('wtf');\n hasMunged = true;\n arr.splice(idx, 1);\n return;\n } */\n\n if(/* section.mediaType !== 'video' || */section.isSending) {\n return;\n }\n\n if(section.mediaType === 'application') {\n return;\n }\n\n const mediaLine = section.mediaLine;\n const mediaLineParts = mediaLine.mediaLineParts;\n const mediaCodecIds = mediaLineParts.ids;\n const localMLine = mediaLine.toString();\n\n const codec = data[section.mediaType];\n const payloadTypes = codec['payload-types'];\n\n /* forEachReverse(payloadTypes, (payloadType, idx, arr) => {\n if(!mediaCodecIds.includes('' + payloadType.id) && section.mediaType === 'video') {\n // if(payloadType.name === 'H265') {\n console.warn('[sdp] filtered unsupported codec', payloadType, mediaCodecIds, section.mediaType);\n arr.splice(idx, 1);\n }\n }); */\n\n const codecIds = payloadTypes.map((payload) => '' + payload.id);\n const correctMLine = generateMediaFirstLine(section.mediaType, undefined, codecIds);\n\n if(localMLine !== correctMLine) {\n const sectionInfo = parseMediaSectionInfo(sdp, section);\n\n const newData = {...data};\n newData.transport = copy(newData.transport);\n newData.transport.ufrag = sectionInfo.ufrag;\n newData.transport.pwd = sectionInfo.pwd;\n newData.transport.fingerprints = [sectionInfo.fingerprint];\n newData.transport.candidates = [];\n\n const entry = new ConferenceEntry(sectionInfo.mid, mediaLineParts.type);\n entry.setPort(mediaLineParts.port);\n sectionInfo.source && entry.setSource(sectionInfo.sourceGroups || sectionInfo.source);\n entry.setDirection(section.direction);\n\n const newSdp = new SDPBuilder().addSsrcEntry(entry, newData).finalize();\n\n const newChannel = parseSdp(newSdp).media[0];\n arr[idx] = newChannel;\n\n hasMunged = true;\n }\n });\n\n if(hasMunged) {\n const mungedSdp = sdp.toString();\n offer.sdp = mungedSdp;\n }\n\n return {offer, sdp/* , bundleMids */};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {GroupCallConnectionType, GroupCallId, GroupCallOutputSource} from '../appManagers/appGroupCallsManager';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {GroupCall, GroupCallParticipant} from '../../layer';\nimport {logger} from '../logger';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport rootScope from '../rootScope';\nimport CallInstanceBase, {TryAddTrackOptions} from './callInstanceBase';\nimport GroupCallConnectionInstance from './groupCallConnectionInstance';\nimport GROUP_CALL_STATE from './groupCallState';\nimport getScreenConstraints from './helpers/getScreenConstraints';\nimport getScreenStream from './helpers/getScreenStream';\nimport getStream from './helpers/getStream';\nimport getVideoConstraints from './helpers/getVideoConstraints';\nimport stopTrack from './helpers/stopTrack';\nimport localConferenceDescription from './localConferenceDescription';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {Ssrc} from './types';\nimport getPeerId from '../appManagers/utils/peers/getPeerId';\nimport {AppManagers} from '../appManagers/managers';\nimport {generateSelfVideo, makeSsrcFromParticipant, makeSsrcsFromParticipant} from './groupCallsController';\n\nexport default class GroupCallInstance extends CallInstanceBase<{\n state: (state: GROUP_CALL_STATE) => void,\n pinned: (source?: GroupCallOutputSource) => void,\n}> {\n public id: GroupCallId;\n public chatId: ChatId;\n public handleUpdateGroupCallParticipants: boolean;\n public updatingSdp: boolean;\n public isSpeakingMap: Map;\n public connections: {[k in GroupCallConnectionType]?: GroupCallConnectionInstance};\n public groupCall: GroupCall;\n public participant: GroupCallParticipant;\n\n // will be set with negotiation\n public joined: boolean;\n\n private pinnedSources: Array;\n private participantsSsrcs: Map;\n private hadAutoPinnedSources: Set;\n private dispatchPinnedThrottled: () => void;\n private startVideoSharingPromise: Promise;\n private startScreenSharingPromise: Promise;\n\n private managers: AppManagers;\n\n constructor(options: {\n id: GroupCallInstance['id'],\n chatId: GroupCallInstance['chatId'],\n isSpeakingMap?: GroupCallInstance['isSpeakingMap'],\n connections?: GroupCallInstance['connections'],\n managers: AppManagers\n }) {\n super();\n\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = logger('GROUP-CALL');\n }\n\n if(!this.connections) {\n this.connections = {};\n }\n\n if(!this.isSpeakingMap) {\n this.isSpeakingMap = new Map();\n }\n\n this.pinnedSources = [];\n this.participantsSsrcs = new Map();\n this.hadAutoPinnedSources = new Set();\n this.dispatchPinnedThrottled = throttle(() => {\n this.dispatchEvent('pinned', this.pinnedSource);\n }, 0, false);\n\n this.addEventListener('state', (state) => {\n if(state === GROUP_CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n }\n\n get connectionState() {\n return this.connections.main.connection.iceConnectionState;\n }\n\n get state() {\n const {connectionState} = this;\n if(connectionState === 'closed') {\n return GROUP_CALL_STATE.CLOSED;\n } else if(connectionState !== 'connected' && (!IS_SAFARI || connectionState !== 'completed')) {\n return GROUP_CALL_STATE.CONNECTING;\n } else {\n const {participant} = this;\n if(!participant.pFlags.can_self_unmute) {\n return GROUP_CALL_STATE.MUTED_BY_ADMIN;\n } else if(participant.pFlags.muted) {\n return GROUP_CALL_STATE.MUTED;\n } else {\n return GROUP_CALL_STATE.UNMUTED;\n }\n }\n }\n\n get participants() {\n return this.managers.appGroupCallsManager.getCachedParticipants(this.id);\n }\n\n get isSharingScreen() {\n return !!this.connections.presentation;\n }\n\n get pinnedSource() {\n return this.pinnedSources[this.pinnedSources.length - 1];\n }\n\n public get isMuted() {\n return this.state !== GROUP_CALL_STATE.UNMUTED;\n }\n\n public get isClosing() {\n const {state} = this;\n return state === GROUP_CALL_STATE.CLOSED;\n }\n\n public get streamManager(): StreamManager {\n return this.connections.main.streamManager;\n }\n\n public get description(): localConferenceDescription {\n return this.connections.main.description;\n }\n\n public pinSource(source: GroupCallOutputSource) {\n indexOfAndSplice(this.pinnedSources, source);\n this.pinnedSources.push(source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinSource(source: GroupCallOutputSource) {\n this.hadAutoPinnedSources.delete(source);\n indexOfAndSplice(this.pinnedSources, source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinAll() {\n this.pinnedSources.length = 0;\n this.dispatchPinnedThrottled();\n }\n\n public async getParticipantByPeerId(peerId: PeerId) {\n return NULL_PEER_ID === peerId ? this.participant : (await this.participants).get(peerId);\n }\n\n public toggleMuted() {\n return this.requestAudioSource(true).then(() => this.changeUserMuted(NULL_PEER_ID));\n }\n\n public async changeUserMuted(peerId: PeerId, muted?: boolean) {\n const participant = await this.getParticipantByPeerId(peerId);\n if(NULL_PEER_ID === peerId && participant.pFlags.can_self_unmute) {\n muted = muted === undefined ? !participant.pFlags.muted : muted;\n }\n\n return this.editParticipant(participant, {muted});\n }\n\n public getElement(endpoint: GroupCallOutputSource) {\n return super.getElement(endpoint);\n }\n\n public getVideoElementFromParticipantByType(participant: GroupCallParticipant, type: 'video' | 'presentation') {\n let source: GroupCallOutputSource;\n if(participant.pFlags.self) {\n const connectionType: GroupCallConnectionType = type === 'video' ? 'main' : 'presentation';\n source = connectionType;\n } else {\n const codec = participant[type];\n source = codec.source_groups[0].sources[0];\n }\n\n const element = this.getElement(source) as HTMLVideoElement;\n if(!element) return;\n\n const clone = element.cloneNode() as typeof element;\n clone.srcObject = element.srcObject;\n return {video: clone, source};\n }\n\n public createConnectionInstance(options: {\n streamManager: StreamManager,\n type: GroupCallConnectionType,\n options: GroupCallConnectionInstance['options'],\n }) {\n return this.connections[options.type] = new GroupCallConnectionInstance({\n groupCall: this,\n log: this.log.bindPrefix(options.type),\n managers: this.managers,\n ...options\n });\n }\n\n public changeRaiseHand(raise: boolean) {\n return this.editParticipant(this.participant, {raiseHand: raise});\n }\n\n public async startScreenSharingInternal() {\n try {\n const type: GroupCallConnectionType = 'presentation';\n\n const stream = await getScreenStream(getScreenConstraints());\n const streamManager = new StreamManager();\n\n const connectionInstance = this.createConnectionInstance({\n streamManager,\n type,\n options: {\n type\n }\n });\n\n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n stream.getVideoTracks()[0].addEventListener('ended', () => {\n if(this.connections.presentation) { // maybe user has stopped screensharing through browser's ui\n this.stopScreenSharing();\n }\n }, {once: true});\n\n connectionInstance.createDescription();\n connectionInstance.addInputVideoStream(stream);\n } catch(err) {\n this.log.error('start screen sharing error', err);\n }\n }\n\n public startScreenSharing() {\n return this.startScreenSharingPromise ??= this.startScreenSharingInternal().finally(() => {\n this.startScreenSharingPromise = undefined;\n });\n }\n\n public stopScreenSharing() {\n const connectionInstance = this.connections.presentation;\n if(!connectionInstance) {\n return Promise.resolve();\n }\n\n delete this.connections.presentation;\n this.unpinSource('presentation');\n connectionInstance.closeConnectionAndStream(true);\n\n delete this.participant.presentation;\n this.managers.appGroupCallsManager.saveApiParticipant(this.id, this.participant);\n\n return this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id);\n }\n\n public toggleScreenSharing() {\n if(this.isSharingScreen) {\n return this.stopScreenSharing();\n } else {\n return this.startScreenSharing();\n }\n }\n\n public async startVideoSharingInternal() {\n const constraints: MediaStreamConstraints = {\n video: getVideoConstraints()\n };\n\n try {\n const stream = await getStream(constraints, false);\n const connectionInstance = this.connections.main;\n connectionInstance.addInputVideoStream(stream);\n\n await this.editParticipant(this.participant, {\n videoPaused: false,\n videoStopped: false\n });\n } catch(err) {\n this.log.error('startVideoSharing error', err, constraints);\n }\n }\n\n public startVideoSharing() {\n return this.startVideoSharingPromise ??= this.startVideoSharingInternal().finally(() => {\n this.startVideoSharingPromise = undefined;\n });\n }\n\n public async stopVideoSharing() {\n const connectionInstance = this.connections.main;\n const track = connectionInstance.streamManager.inputStream.getVideoTracks()[0];\n if(!track) {\n return;\n }\n\n stopTrack(track);\n connectionInstance.streamManager.appendToConference(connectionInstance.description); // clear sender track\n\n await this.editParticipant(this.participant, {\n videoStopped: true\n });\n }\n\n public toggleVideoSharing() {\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharing();\n }\n }\n\n public async hangUp(discard = false, rejoin = false, isDiscarded = false) {\n for(const type in this.connections) {\n const connection = this.connections[type as GroupCallConnectionType];\n connection.closeConnectionAndStream(!rejoin);\n }\n\n this.dispatchEvent('state', this.state);\n\n if(isDiscarded) {\n return;\n }\n\n if(!rejoin) {\n const d = discard || (this.joined ? this.connections.main.sources.audio.source : undefined);\n this.managers.appGroupCallsManager.hangUp(this.id, d);\n }\n }\n\n public tryAddTrack(options: Omit) {\n const {description} = this;\n const source = super.tryAddTrack(options);\n\n if(options.type === 'output') {\n const entry = description.getEntryBySource(+source);\n this.getParticipantByPeerId(entry.peerId).then((participant) => {\n if(participant) {\n rootScope.dispatchEvent('group_call_participant', {groupCallId: this.id, participant});\n }\n });\n }\n\n return source;\n }\n\n public async editParticipant(participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n if(!Object.keys(options).length) {\n return;\n }\n\n // let processUpdate = true;\n if(participant) {\n // const {currentGroupCall} = this;\n // const isCurrentCall = currentGroupCall?.id === groupCallId;\n const isCurrentCall = true;\n const isUpdatingMeInCurrentCall = isCurrentCall && participant.pFlags.self;\n\n if(isUpdatingMeInCurrentCall) {\n if(options.muted !== undefined && !this.isSharingAudio) {\n delete options.muted;\n\n if(!Object.keys(options).length) {\n return;\n }\n }\n }\n\n // if(isCurrentCall) {\n const muted = options.muted;\n if(muted !== undefined) {\n /* const isAdmin = appChatsManager.hasRights(currentGroupCall.chatId, 'manage_call');\n if(isAdmin) {\n if(muted) {\n participant.pFlags.muted = true;\n delete participant.pFlags.can_self_unmute;\n } else {\n participant.pFlags.can_self_unmute = true;\n }\n } else */if(participant.pFlags.self) {\n if(muted) {\n participant.pFlags.muted = true;\n } else if(participant.pFlags.can_self_unmute) {\n delete participant.pFlags.muted;\n }\n }/* else {\n if(muted) {\n participant.pFlags.muted_by_you = true;\n } else {\n delete participant.pFlags.muted_by_you;\n }\n } */\n }\n // }\n\n /* const a: [keyof GroupCallParticipant['pFlags'], keyof typeof options][] = [\n ['muted', 'muted']\n ];\n\n a.forEach(([key, optionKey]) => {\n const value = options[optionKey];\n if(value === undefined) {\n return;\n }\n\n if(value) {\n participant.pFlags[key] = true;\n } else {\n delete participant.pFlags[key];\n }\n }); */\n\n if(options.raiseHand !== undefined) {\n if(options.raiseHand) participant.raise_hand_rating = '1';\n else delete participant.raise_hand_rating;\n }\n\n if(isUpdatingMeInCurrentCall) {\n if(options.videoStopped !== undefined) {\n if(options.videoStopped) delete participant.video;\n else participant.video = generateSelfVideo(this.connections.main.sources.video);\n }\n\n if(!participant.pFlags.muted && participant.pFlags.can_self_unmute) {\n this.setMuted(false);\n }\n\n this.dispatchEvent('state', this.state);\n }\n\n // rootScope.dispatchEvent('group_call_participant', {groupCallId, participant});\n\n /* if(participant.pFlags.self) {\n processUpdate = false;\n } */\n }\n\n return this.managers.appGroupCallsManager.editParticipant(this.id, participant, options);\n }\n\n public onParticipantUpdate(participant: GroupCallParticipant, doNotDispatchParticipantUpdate?: PeerId) {\n const connectionInstance = this.connections.main;\n const {connection, description} = connectionInstance;\n\n const peerId = getPeerId(participant.peer);\n const hasLeft = !!participant.pFlags.left;\n const oldSsrcs = this.participantsSsrcs.get(peerId) || [];\n\n if(participant.presentation && !hasLeft) {\n const {source} = makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint);\n if(!this.hadAutoPinnedSources.has(source)) {\n this.hadAutoPinnedSources.add(source);\n this.pinSource(participant.pFlags.self ? 'presentation' : source);\n }\n }\n\n if(participant.pFlags.self) {\n this.participant = participant;\n\n if(connectionInstance.sources.audio.source !== participant.source) {\n this.hangUp();\n }\n\n let mute = false;\n if(!participant.pFlags.can_self_unmute) {\n this.stopScreenSharing();\n this.stopVideoSharing();\n mute = true;\n } else if(participant.pFlags.muted) {\n mute = true;\n }\n\n if(mute) {\n this.setMuted(true);\n }\n\n if(doNotDispatchParticipantUpdate !== peerId) {\n this.dispatchEvent('state', this.state);\n }\n\n return;\n }\n\n const ssrcs = hasLeft ? [] : makeSsrcsFromParticipant(participant);\n\n if(!hasLeft) {\n this.participantsSsrcs.set(peerId, ssrcs);\n } else {\n this.participantsSsrcs.delete(peerId);\n }\n\n // const TEST_OLD = false;\n\n const modifiedTypes: Set = new Set();\n oldSsrcs.forEach((oldSsrc) => {\n const oldSource = oldSsrc.source;\n const newSsrc = ssrcs.find((ssrc) => ssrc.source === oldSource);\n if(!newSsrc) {\n this.unpinSource(oldSource);\n\n const oldEntry = description.getEntryBySource(oldSource);\n if(oldEntry && oldEntry.direction !== 'inactive') {\n oldEntry.setDirection('inactive');\n modifiedTypes.add(oldEntry.type);\n }\n }\n });\n\n ssrcs.forEach((ssrc) => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n if(entry.direction === 'inactive') {\n entry.setDirection(entry.originalDirection);\n modifiedTypes.add(entry.type);\n }\n\n return;\n }\n\n entry = description.createEntry(ssrc.type);\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n description.setEntryPeerId(entry, peerId);\n\n // if(TEST_OLD) {\n // description.bundleMids.push(entry.mid);\n // entry.setDirection('recvonly');\n // } else {\n ssrc.type === 'video' && entry.setEndpoint(ssrc.endpoint);\n entry.createTransceiver(connection, {direction: 'recvonly'});\n // }\n\n modifiedTypes.add(entry.type);\n });\n\n /* if(TEST_OLD) {\n this.setRemoteOffer({\n connection,\n description,\n ssrcs\n });\n } else */if(modifiedTypes.size) {\n if(modifiedTypes.has('video')) {\n connectionInstance.updateConstraints = true;\n }\n\n connectionInstance.negotiateThrottled();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum GROUP_CALL_STATE {\n UNMUTED,\n MUTED,\n MUTED_BY_ADMIN,\n CONNECTING,\n CLOSED\n}\n\nexport default GROUP_CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\n\nexport type GroupCallAudioAssetName = 'group_call_connect.mp3' | 'group_call_end.mp3' | 'group_call_start.mp3' | 'voip_onallowtalk.mp3';\n\nlet audioAsset: AudioAssetPlayer;\nexport default function getGroupCallAudioAsset() {\n return audioAsset ??= new AudioAssetPlayer([\n 'group_call_connect.mp3',\n 'group_call_end.mp3',\n 'group_call_start.mp3',\n 'voip_onallowtalk.mp3'\n ]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getGroupCallAudioAsset from '../../components/groupCall/getAudioAsset';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup} from '../../layer';\nimport {GroupCallId, GroupCallConnectionType} from '../appManagers/appGroupCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport GroupCallInstance from './groupCallInstance';\nimport GROUP_CALL_STATE from './groupCallState';\nimport createMainStreamManager from './helpers/createMainStreamManager';\nimport {generateSsrc} from './localConferenceDescription';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {Ssrc} from './types';\n\nconst IS_MUTED = true;\n\nexport function makeSsrcsFromParticipant(participant: GroupCallParticipant) {\n return [\n makeSsrcFromParticipant(participant, 'audio', participant.source),\n participant.video?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\n participant.video && makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\n participant.presentation?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\n participant.presentation && makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\n ].filter(Boolean);\n};\n\nexport function makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n return generateSsrc(type, source, endpoint);\n}\n\nexport function generateSelfVideo(source: Ssrc, audioSource?: number): GroupCallParticipantVideo {\n return source && {\n _: 'groupCallParticipantVideo',\n pFlags: {},\n endpoint: '',\n source_groups: source.sourceGroups,\n audio_source: audioSource\n };\n}\n\nexport class GroupCallsController extends EventListenerBase<{\n instance: (instance: GroupCallInstance) => void\n}> {\n private audioAsset: ReturnType;\n private log: ReturnType;\n private currentGroupCall: GroupCallInstance;\n private managers: AppManagers;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n this.audioAsset = getGroupCallAudioAsset();\n this.log = logger('GCC');\n\n rootScope.addEventListener('group_call_update', (groupCall) => {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCall.id) {\n currentGroupCall.groupCall = groupCall;\n\n if(groupCall._ === 'groupCallDiscarded') {\n currentGroupCall.hangUp(false, false, true);\n }\n }\n });\n\n rootScope.addEventListener('group_call_participant', ({groupCallId, participant}) => {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCallId) {\n currentGroupCall.onParticipantUpdate(participant/* , this.doNotDispatchParticipantUpdate */);\n }\n });\n }\n\n get groupCall() {\n return this.currentGroupCall;\n }\n\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\n this.currentGroupCall = groupCall;\n\n if(groupCall) {\n this.dispatchEvent('instance', groupCall);\n }\n }\n\n public startConnectingSound() {\n this.stopConnectingSound();\n this.audioAsset.playSoundWithTimeout('group_call_connect.mp3', true, 2500);\n }\n\n public stopConnectingSound() {\n this.audioAsset.stopSound();\n this.audioAsset.cancelDelayedPlay();\n }\n\n public async joinGroupCall(chatId: ChatId, groupCallId: GroupCallId, muted = IS_MUTED, rejoin?: boolean, joinVideo?: boolean) {\n this.audioAsset.createAudio();\n\n this.log(`joinGroupCall chatId=${chatId} id=${groupCallId} muted=${muted} rejoin=${rejoin}`);\n\n let streamManager: StreamManager;\n if(rejoin) {\n streamManager = this.currentGroupCall.connections.main.streamManager;\n } else {\n streamManager = await createMainStreamManager(muted, joinVideo);\n }\n\n return this.joinGroupCallInternal(chatId, groupCallId, streamManager, muted, rejoin, joinVideo)\n .then(() => {\n // have to refresh participants because of the new connection\n const {currentGroupCall} = this;\n currentGroupCall.participants.then((participants) => {\n if(this.currentGroupCall !== currentGroupCall || currentGroupCall.state === GROUP_CALL_STATE.CLOSED) {\n return;\n }\n\n participants.forEach((participant) => {\n if(!participant.pFlags.self) {\n currentGroupCall.onParticipantUpdate(participant);\n }\n });\n });\n });\n }\n\n private async joinGroupCallInternal(chatId: ChatId, groupCallId: GroupCallId, streamManager: StreamManager, muted: boolean, rejoin = false, joinVideo?: boolean) {\n const log = this.log.bindPrefix('joinGroupCallInternal');\n log('start', groupCallId);\n\n const type: GroupCallConnectionType = 'main';\n\n let {currentGroupCall} = this;\n if(currentGroupCall && rejoin) {\n // currentGroupCall.connections.main.connection = connection;\n currentGroupCall.handleUpdateGroupCallParticipants = false;\n currentGroupCall.updatingSdp = false;\n log('update currentGroupCall', groupCallId, currentGroupCall);\n } else {\n currentGroupCall = new GroupCallInstance({\n chatId,\n id: groupCallId,\n managers: this.managers\n });\n\n currentGroupCall.fixSafariAudio();\n\n currentGroupCall.addEventListener('state', (state) => {\n if(this.currentGroupCall === currentGroupCall && state === GROUP_CALL_STATE.CLOSED) {\n this.setCurrentGroupCall(null);\n this.stopConnectingSound();\n this.audioAsset.playSound('group_call_end.mp3');\n rootScope.dispatchEvent('chat_update', currentGroupCall.chatId);\n }\n });\n\n currentGroupCall.groupCall = await this.managers.appGroupCallsManager.getGroupCallFull(groupCallId);\n\n const connectionInstance = currentGroupCall.createConnectionInstance({\n streamManager,\n type,\n options: {\n type,\n isMuted: muted,\n joinVideo,\n rejoin\n }\n });\n\n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n currentGroupCall.onTrack(event);\n });\n\n connection.addEventListener('iceconnectionstatechange', () => {\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\n\n const {iceConnectionState} = connection;\n if(iceConnectionState === 'disconnected' || iceConnectionState === 'checking' || iceConnectionState === 'new') {\n this.startConnectingSound();\n } else {\n this.stopConnectingSound();\n }\n\n switch(iceConnectionState) {\n case 'checking': {\n break;\n }\n\n case 'closed': {\n currentGroupCall.hangUp();\n break;\n }\n\n case 'completed': {\n break;\n }\n\n case 'connected': {\n if(!currentGroupCall.joined) {\n currentGroupCall.joined = true;\n this.audioAsset.playSound('group_call_start.mp3');\n this.managers.appGroupCallsManager.getGroupCallParticipants(groupCallId);\n }\n\n break;\n }\n\n case 'disconnected': {\n break;\n }\n\n case 'failed': {\n // TODO: replace with ICE restart\n currentGroupCall.hangUp();\n // connection.restartIce();\n break;\n }\n\n case 'new': {\n break;\n }\n }\n });\n\n connectionInstance.createDescription();\n connectionInstance.createDataChannel();\n\n connectionInstance.appendStreamToConference();\n\n this.setCurrentGroupCall(currentGroupCall);\n log('set currentGroupCall', groupCallId, currentGroupCall);\n\n this.startConnectingSound();\n\n return connectionInstance.negotiate();\n }\n }\n}\n\nconst groupCallsController = new GroupCallsController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.groupCallController = groupCallsController);\nexport default groupCallsController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS} from '../constants';\nimport StreamManager from '../streamManager';\nimport getAudioConstraints from './getAudioConstraints';\nimport getStream from './getStream';\nimport getVideoConstraints from './getVideoConstraints';\n\nexport default async function createMainStreamManager(muted?: boolean, joinVideo?: boolean) {\n const constraints: MediaStreamConstraints = {\n audio: getAudioConstraints(),\n video: joinVideo && getVideoConstraints()\n };\n\n const streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n\n try {\n const stream = await getStream(constraints, muted);\n streamManager.addStream(stream, 'input');\n } catch(err) {\n console.error('joinGroupCall getStream error', err, constraints);\n streamManager.inputStream = new MediaStream();\n }\n\n return streamManager;\n}\n","import constraintSupported, {MyMediaTrackSupportedConstraints} from '../../../environment/constraintSupport';\n\nexport default function getAudioConstraints(): MediaTrackConstraints {\n const constraints: MediaTrackConstraints = {\n channelCount: 2\n };\n\n const desirable: (keyof MyMediaTrackSupportedConstraints)[] = [\n 'noiseSuppression',\n 'echoCancellation',\n 'autoGainControl'\n ];\n\n desirable.forEach((constraint) => {\n if(constraintSupported(constraint)) {\n // @ts-ignore\n constraints[constraint] = true;\n }\n });\n\n return constraints;\n}\n","export type MyMediaTrackSupportedConstraints = MediaTrackSupportedConstraints & {\n noiseSuppression?: boolean,\n autoGainControl?: boolean\n};\n\nexport default function constraintSupported(constraint: keyof MyMediaTrackSupportedConstraints) {\n return (!!navigator?.mediaDevices?.getSupportedConstraints() as any as MyMediaTrackSupportedConstraints)[constraint];\n}\n","export default function getScreenConstraints(skipAudio?: boolean) {\n const constraints: DisplayMediaStreamOptions = {\n video: {\n // @ts-ignore\n // cursor: 'always',\n width: {max: 1920},\n height: {max: 1080},\n frameRate: {max: 30}\n }\n };\n\n if(!skipAudio) {\n constraints.audio = true;\n }\n\n return constraints;\n}\n","export default async function getScreenStream(constraints: DisplayMediaStreamOptions) {\n const screenStream = await navigator.mediaDevices.getDisplayMedia(constraints);\n const track = screenStream.getVideoTracks()[0];\n track.contentHint = 'text';\n return screenStream;\n}\n","export default async function getStream(constraints: MediaStreamConstraints, muted: boolean) {\n // console.log('getStream', constraints);\n\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n stream.getTracks().forEach((x) => {\n x.enabled = !muted;\n });\n\n // console.log('getStream result', stream);\n return stream;\n}\n\n(window as any).getStream = getStream;\n","export default function getVideoConstraints(): MediaTrackConstraints {\n return {\n width: {min: 1280, max: 1920/* , ideal: 1920 */},\n height: {min: 720, max: 1080/* , ideal: 1080 */},\n frameRate: {min: 24, max: 30}\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from '../sdp';\nimport SDPMediaSection from '../sdp/mediaSection';\nimport {toTelegramSource} from '../utils';\nimport {parseSourceGroups} from './parseSourceGroups';\n\nexport default function parseMediaSectionInfo(sdp: SDP, channel: SDPMediaSection) {\n const clientInfo = channel.lookupAttributeKeys({\n 'ice-ufrag': true,\n 'ice-pwd': true,\n 'fingerprint': true,\n 'setup': true,\n 'ssrc': true,\n 'mid': true,\n 'ssrc-group': false\n });\n\n if(!clientInfo.fingerprint) { // support Firefox\n const line = sdp.session.lines.find((line) => line.parsed?.key === 'fingerprint');\n clientInfo.fingerprint = line.parsed.value;\n }\n\n const telegramSourceGroups = parseSourceGroups(clientInfo['ssrc-group']);\n const [hash, fingerprint] = clientInfo.fingerprint.split(' ', 2);\n const ssrc = clientInfo.ssrc && toTelegramSource(+clientInfo.ssrc.split(' ', 1)[0]);\n // ssrc = telegramSourceGroups ? telegramSourceGroups[0].sources[0] : ssrc;\n\n return {\n raw: clientInfo,\n ufrag: clientInfo['ice-ufrag'],\n pwd: clientInfo['ice-pwd'],\n fingerprint: {\n fingerprint,\n setup: clientInfo.setup,\n hash\n },\n source: ssrc,\n sourceGroups: telegramSourceGroups,\n mid: clientInfo.mid\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GroupCallParticipantVideoSourceGroup} from '../../../layer';\nimport {toTelegramSource} from '../utils';\n\nexport function parseSourceGroups(sdpLines: string[]) {\n const telegramSourceGroups = sdpLines.map((str) => {\n const [semantics, ...rest] = str.split(' ');\n\n const sourceGroup: GroupCallParticipantVideoSourceGroup = {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics,\n // sources: rest.map((ssrc) => +ssrc)\n sources: rest.map((ssrc) => toTelegramSource(+ssrc))\n };\n\n return sourceGroup;\n });\n\n /* const simIndex = telegramSourceGroups.findIndex((g) => g.semantics === 'SIM');\n if(simIndex !== -1) {\n const sourceGroup = telegramSourceGroups.splice(simIndex, 1)[0];\n telegramSourceGroups.unshift(sourceGroup);\n } */\n\n return telegramSourceGroups.length ? telegramSourceGroups : undefined;\n}\n","import simulateEvent from '../../../helpers/dom/dispatchEvent';\n\nexport default function stopTrack(track: MediaStreamTrack) {\n track.stop();\n simulateEvent(track, 'ended');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {GroupCallParticipantVideoSourceGroup} from '../../layer';\nimport {fixMediaLineType, SDPBuilder, WebRTCLineType, WEBRTC_MEDIA_PORT} from './sdpBuilder';\nimport {AudioCodec, GroupCallConnectionTransport, Ssrc, UpdateGroupCallConnectionData, VideoCodec} from './types';\n\nexport class ConferenceEntry {\n public source: number;\n public sourceGroups: GroupCallParticipantVideoSourceGroup[];\n public transceiver: RTCRtpTransceiver;\n public originalDirection: RTCRtpTransceiverDirection;\n public direction: RTCRtpTransceiverDirection;\n public port: string;\n public endpoint: string;\n public peerId: PeerId;\n\n public sendEntry: ConferenceEntry;\n public recvEntry: ConferenceEntry;\n\n constructor(public mid: string, public type: WebRTCLineType) {\n this.port = WEBRTC_MEDIA_PORT;\n }\n\n public setDirection(direction: RTCRtpTransceiverDirection) {\n if(!this.originalDirection) {\n this.originalDirection = direction;\n }\n\n return this.direction = direction;\n }\n\n public setPort(port: string) {\n return this.port = port;\n }\n\n public setEndpoint(endpoint: string) {\n return this.endpoint = endpoint;\n }\n\n public setPeerId(peerId: PeerId) {\n return this.peerId = peerId;\n }\n\n public createTransceiver(connection: RTCPeerConnection, init?: RTCRtpTransceiverInit) {\n if(init?.direction) {\n this.setDirection(init.direction);\n }\n\n return this.transceiver = connection.addTransceiver(fixMediaLineType(this.type), init);\n }\n\n public setSource(source: number | GroupCallParticipantVideoSourceGroup[]) {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n this.sourceGroups = sourceGroups;\n return this.source = source;\n }\n\n public shouldBeSkipped(isAnswer?: boolean) {\n return isAnswer && this.direction === 'inactive';\n }\n}\n\nexport function generateSsrc(type: WebRTCLineType, source: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n return {\n endpoint,\n type,\n source,\n sourceGroups\n };\n}\n\nexport default class LocalConferenceDescription implements UpdateGroupCallConnectionData {\n public readonly sessionId: string;\n // public ssrcs: Ssrc[];\n public readonly transport: GroupCallConnectionTransport;\n public readonly audio?: AudioCodec;\n public readonly video: VideoCodec;\n public readonly screencast?: VideoCodec;\n\n private maxSeenId: number;\n public readonly entries: ConferenceEntry[];\n private entriesByMid: Map;\n private entriesBySource: Map;\n private entriesByPeerId: Map>;\n\n constructor(public connection: RTCPeerConnection) {\n this.sessionId = '' + Date.now();\n // this.ssrcs = [];\n this.maxSeenId = -1;\n this.entries = [];\n this.entriesByMid = new Map();\n this.entriesBySource = new Map();\n this.entriesByPeerId = new Map();\n }\n\n public setData(data: UpdateGroupCallConnectionData) {\n return safeAssign(this, data);\n }\n\n public createEntry(type: WebRTCLineType) {\n const mid = '' + ++this.maxSeenId;\n const entry = new ConferenceEntry(mid, type);\n this.entries.push(entry);\n this.entriesByMid.set(mid, entry);\n return entry;\n }\n\n public deleteEntry(entry: ConferenceEntry) {\n indexOfAndSplice(this.entries, entry);\n this.entriesByMid.delete(entry.mid);\n this.entriesBySource.delete(entry.source);\n\n const set = this.entriesByPeerId.get(entry.peerId);\n if(set) {\n set.delete(entry);\n if(!set.size) {\n this.entriesByPeerId.delete(entry.peerId);\n }\n }\n }\n\n public setEntrySource(entry: ConferenceEntry, source: Parameters[0]) {\n entry.setSource(source);\n this.entriesBySource.set(entry.source, entry);\n }\n\n public setEntryPeerId(entry: ConferenceEntry, peerId: ConferenceEntry['peerId']) {\n entry.setPeerId(peerId);\n let set = this.entriesByPeerId.get(peerId);\n if(!set) {\n this.entriesByPeerId.set(peerId, set = new Set());\n }\n\n set.add(entry);\n }\n\n public findEntry(verify: Parameters[0]) {\n return this.entries.find(verify);\n }\n\n public findFreeSendRecvEntry(type: WebRTCLineType, isSending: boolean) {\n let entry = this.entries.find((entry) => {\n return entry.direction === 'sendrecv' && entry.type === type && !(isSending ? entry.sendEntry : entry.recvEntry);\n });\n\n if(!entry) {\n entry = this.createEntry(type);\n entry.setDirection('sendrecv');\n }\n\n return entry;\n }\n\n public getEntryByMid(mid: ConferenceEntry['mid']) {\n return this.entriesByMid.get(mid);\n }\n\n public getEntryBySource(source: ConferenceEntry['source']) {\n return this.entriesBySource.get(source);\n }\n\n public getEntriesByPeerId(peerId: ConferenceEntry['peerId']) {\n return this.entriesByPeerId.get(peerId);\n }\n\n public generateSdp(options: Omit[0], 'conference'>) {\n return SDPBuilder.fromConference({\n conference: this,\n ...options\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPMediaSection from './mediaSection';\nimport SDPSessionSection from './sessionSection';\n\nexport type AttributeKey = 'group' | 'rtcp' | 'ice-ufrag' |\n 'ice-pwd' | 'ice-options' | 'fingerprint' | 'setup' |\n 'mid' | 'extmap' | 'sendonly' | 'msid' | 'rtcp-mux' |\n 'rtpmap' | 'rtcp-fb' | 'fmtp' | 'ssrc' | 'ssrc-group' |\n 'extmap-allow-mixed' | 'msid-semantic';\n\nexport type AttributeMap = {[k in AttributeKey]?: boolean};\n\nexport default class SDP {\n #session: SDPSessionSection;\n #media: SDPMediaSection[];\n\n constructor(session: SDP['session'], mediaSections: SDP['media']) {\n this.#session = session;\n this.#media = mediaSections;\n }\n\n public get session() {\n return this.#session;\n }\n\n public get media() {\n return this.#media;\n }\n\n public get bundle() {\n const bundleLine = this.session.lines.find((line) => line.parsed?.key === 'group');\n return bundleLine.value.split(' ').slice(1);\n }\n\n toString() {\n return this.session.lines\n .concat(...this.media.map((section) => section.lines))\n .map((line) => line.toString()).join('\\r\\n') + '\\r\\n';\n }\n\n /* get buggedMedia() {\n const bundle = this.bundle;\n type A = {\n mid: SDPMediaSection['mid'],\n mediaType: SDPMediaSection['mediaType'],\n direction: SDPMediaSection['direction']\n };\n const out: A[] = [];\n for(let i = 0, length = this.media.length; i < length; ++i) {\n const section = this.media[i];\n const mid = section.mid;\n if(!bundle.includes(mid)) {\n out.push(section);\n }\n }\n\n return out;\n } */\n\n /* get mediaTypes() {\n return this.media.map((section) => {\n return {mid: section.oa.get('mid').oa, type: section.mediaType, direction: section.direction};\n });\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function splitStringByLimitWithRest(str: string, separator: string, limit: number) {\n const splitted = str.split(separator);\n const out: string[] = [];\n\n while(limit > 0 && splitted.length) {\n out.push(splitted.shift());\n --limit;\n }\n\n if(splitted.length) {\n out.push(splitted.join(separator));\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class UniqueNumberGenerator {\n #set: Set;\n #min: number;\n #max: number;\n\n constructor(min: number, max: number) {\n this.#set = new Set();\n this.#min = min;\n this.#max = max;\n }\n\n public generate() {\n const min = this.#min;\n const max = this.#max;\n const set = this.#set;\n\n const maxTries = max - min + 1;\n let value = Math.floor(min + maxTries * Math.random()), _try = 0;\n while(set.has(value)) {\n if(value < max) {\n ++value;\n } else {\n value = min;\n }\n\n if(++_try >= maxTries) {\n return null;\n }\n }\n\n set.add(value);\n return value;\n }\n\n public add(value: number) {\n this.#set.add(value);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AttributeKey} from '.';\n\nexport default class SDPAttributeSplitted {\n #key: AttributeKey;\n #value: string;\n\n // key = 'ssrc-group', value = 'SIM 1 2 3'\n constructor(key: AttributeKey, value: string) {\n this.#key = key;\n this.#value = value;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class SDPMediaLineParts {\n #type: 'audio' | 'video' | 'application';\n #port: string;\n #protocol: string;\n #ids: string[];\n\n constructor(\n type: SDPMediaLineParts['type'],\n port: SDPMediaLineParts['port'],\n protocol: SDPMediaLineParts['protocol'],\n ids: SDPMediaLineParts['ids']\n ) {\n this.#type = type;\n this.#port = port;\n this.#protocol = protocol;\n this.#ids = ids;\n }\n\n public get type() {\n return this.#type;\n }\n\n public get port() {\n return this.#port;\n }\n\n public get protocol() {\n return this.#protocol;\n }\n\n public get ids() {\n return this.#ids;\n }\n\n toString() {\n return this.type + ' ' + this.port + ' ' + this.protocol + ' ' + this.ids.join(' ');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from '../../../helpers/string/splitStringByLimitWithRest';\nimport SDPAttributeSplitted from './attributeSplitted';\nimport SDPMediaLineParts from './mediaLineParts';\n\nexport default class SDPLine {\n #key: 'm' | 'a' | 'o' | 'v' | 's' | 't' | 'c';\n #value: string;\n #mediaLineParts: SDPMediaLineParts;\n #parsed?: SDPAttributeSplitted;\n\n // key = 'a', value = 'ssrc-group:SIM 1 2 3'\n constructor(key: SDPLine['key'], value: string | SDPMediaLineParts | SDPAttributeSplitted) {\n this.#key = key;\n\n if(typeof(value) === 'string') {\n this.#value = value;\n\n if(key === 'm') {\n const splitted = value.split(' ');\n this.#mediaLineParts = new SDPMediaLineParts(splitted[0] as any, splitted[1], splitted[2], splitted.slice(3));\n } else {\n if(key === 'a') {\n const result = splitStringByLimitWithRest(value, ':', 1);\n value = result[0];\n this.#parsed = result.length === 1 ? new SDPAttributeSplitted(value as any, null) : new SDPAttributeSplitted(value as any, result[1]);\n }\n }\n } else {\n if(value instanceof SDPMediaLineParts) {\n this.#mediaLineParts = value;\n this.#value = value.toString();\n } else if(value instanceof SDPAttributeSplitted) {\n this.#parsed = value;\n this.#value = value.value ? `${value.key}:${value.value}` : value.key;\n }\n }\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n\n public get parsed() {\n return this.#parsed;\n }\n\n public get mediaLineParts() {\n return this.#mediaLineParts;\n }\n\n toString() {\n return `${this.key}=${this.value}`;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from '../../../helpers/string/splitStringByLimitWithRest';\n\nexport default class SDPAttributeInner {\n #key: string;\n #lines: Array;\n #prefix: string;\n #nestedMap: Map;\n #missed: boolean;\n #keys: Array;\n\n constructor(key: SDPAttributeInner['key'], lines: SDPAttributeInner['lines'], prefix: string = ':', missed = false) {\n this.#key = key;\n this.#lines = lines;\n this.#prefix = prefix;\n this.#missed = missed;\n this.#nestedMap = missed ? new Map() : null;\n this.#keys = missed ? [] : null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get value() {\n return this.#missed || !this.lines.length ? null : this.lines[0];\n }\n\n public get exists() {\n return !this.#missed;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get keys() {\n SDPAttributeInner.fill(this);\n return this.#keys;\n }\n\n public forEach(callback: Parameters['forEach']>[0]) {\n SDPAttributeInner.fill(this);\n this.#nestedMap.forEach(callback);\n }\n\n public get(key: string) {\n SDPAttributeInner.fill(this);\n return this.#nestedMap.get(key) || new SDPAttributeInner(key, [], ':', true);\n }\n\n private static fill(attribute: SDPAttributeInner) {\n if(attribute.#nestedMap !== null) {\n return;\n }\n\n const map: Map> = new Map();\n attribute.lines.forEach((str) => {\n const [key, rest] = splitStringByLimitWithRest(str, attribute.#prefix, 1);\n const values = map.get(key) || [];\n map.set(key, [...values, rest || '']);\n });\n\n const nestedMap = attribute.#nestedMap = SDPAttributeInner.makeAttributes(map);\n attribute.#keys = Array.from(nestedMap.keys());\n }\n\n private static makeAttributes(innerParts: Map>) {\n const out: Map = new Map();\n\n innerParts.forEach((lines, key) => {\n out.set(key, new SDPAttributeInner(key, lines));\n });\n\n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPAttributeInner from './attributeInner';\nimport SDPLine from './line';\n\nexport default class SDPAttributes {\n #lines: SDPLine[];\n #attributes: Map;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#attributes = new Map();\n SDPAttributes.fillAttributes(this);\n }\n\n public get(key: string) {\n return this.#attributes.get(key) || new SDPAttributeInner(key, [], ' ', true);\n }\n\n private static fillAttributes(attributes: SDPAttributes) {\n const attributesMap: Map> = new Map();\n attributes.#lines.forEach((line) => {\n if(line.key === 'a') {\n const {key, value} = line.parsed;\n\n let linesArray = attributesMap.get(key);\n if(!linesArray) {\n linesArray = [];\n attributesMap.set(key, linesArray);\n }\n\n linesArray.push(value || '');\n }\n });\n\n attributesMap.forEach((linesArray, key) => {\n attributes.#attributes.set(key, new SDPAttributeInner(key, linesArray, ' ', false));\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AttributeMap} from '.';\nimport {NoExtraProperties} from '../../../types';\nimport SDPAttributes from './attributes';\nimport SDPLine from './line';\n\nexport type SDPMediaDirection = 'sendonly' | 'recvonly' | 'inactive' | 'sendrecv';\nexport default class SDPMediaSection {\n #lines: Array;\n #mediaLine: SDPLine;\n #attributes: SDPAttributes;\n #direction: SDPMediaDirection;\n\n constructor(lines: Array) {\n this.#lines = lines;\n this.#mediaLine = lines[0];\n this.#attributes = this.#direction = null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get mediaLine() {\n return this.#mediaLine;\n }\n\n public get mediaLineParts() {\n return this.#mediaLine.mediaLineParts;\n }\n\n public get mediaType() {\n return this.mediaLineParts.type;\n }\n\n public get direction() {\n if(!this.#direction) {\n const attributes = this.attributes;\n\n let direction: SDPMediaDirection;\n if(attributes.get('sendonly').exists) direction = 'sendonly';\n else if(attributes.get('recvonly').exists) direction = 'recvonly';\n else if(attributes.get('inactive').exists) direction = 'inactive';\n else direction = 'sendrecv';\n\n this.#direction = direction;\n }\n\n return this.#direction;\n }\n\n public get isSending() {\n return this.direction === 'sendrecv' || this.direction === 'sendonly';\n }\n\n public get isReceiving() {\n return this.direction === 'sendrecv' || this.direction === 'recvonly';\n }\n\n public get attributes() {\n this.#attributes || (this.#attributes = new SDPAttributes(this.lines));\n return this.#attributes;\n }\n\n public get mid() {\n return this.attributes.get('mid').value;\n }\n\n public lookupAttributeKeys(keys: NoExtraProperties): {[k in keyof T]: T[k] extends true ? string : string[]} {\n const out: any = {};\n\n for(const key in keys) {\n const result = this.attributes.get(key);\n // @ts-ignore\n const resultShouldBeArray = !keys[key];\n if(!result) {\n out[key] = resultShouldBeArray ? [] : undefined;\n } else {\n out[key] = resultShouldBeArray ? result.lines : result.value;\n }\n }\n\n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPLine from './line';\n\nexport default class SDPSessionSection {\n #lines: SDPLine[];\n #sessionId: string;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#sessionId = lines.filter((line) => line.key === 'o').map((line) => line.value.split(' ')[1])[0];\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get sessionId() {\n return this.#sessionId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from '.';\nimport splitStringByLimitWithRest from '../../../helpers/string/splitStringByLimitWithRest';\nimport UniqueNumberGenerator from '../../../helpers/uniqueNumberGenerator';\nimport SDPLine from './line';\nimport SDPMediaSection from './mediaSection';\nimport SDPSessionSection from './sessionSection';\n\nexport function parseSdp(str: string) {\n function createSection() {\n if(sessionSection) {\n mediaSections.push(new SDPMediaSection(lines));\n } else {\n sessionSection = new SDPSessionSection(lines);\n }\n }\n\n let sessionSection: SDPSessionSection = null, lines: SDPLine[] = [];\n const mediaSections: SDPMediaSection[] = [];\n str.split(/\\r?\\n/).forEach((lineStr) => {\n if(!isIncorrectSdpLine(lineStr)) {\n const line = parseSdpLine(lineStr);\n if(line.key === 'm') {\n createSection();\n lines = [];\n }\n\n lines.push(line);\n }\n });\n\n createSection();\n return new SDP(sessionSection, mediaSections);\n}\n\nexport function isIncorrectSdpLine(str: string) {\n return /^[\\s\\xa0]*$/.test(str);\n}\n\nexport function parseSdpLine(str: string) {\n const splitted = splitStringByLimitWithRest(str, '=', 1);\n return new SDPLine(splitted[0] as any, splitted[1]);\n}\n\nexport function addSimulcast(sdp: SDP) {\n let generator: UniqueNumberGenerator;\n sdp.media.forEach((section, idx) => {\n if(section.mediaType === 'video' && section.isSending && !section.attributes.get('ssrc-group').get('SIM').exists) {\n if(!generator) {\n generator = new UniqueNumberGenerator(2, 4294967295);\n }\n\n const originalSsrcs = section.attributes.get('ssrc-group').get('FID').value.split(' ');\n const lines = section.lines;\n originalSsrcs.forEach((ssrc) => generator.add(+ssrc)); // fix possible duplicates\n const ssrcs = [originalSsrcs[0], generator.generate(), generator.generate()];\n const ssrcs2 = [originalSsrcs[1], generator.generate(), generator.generate()];\n\n lines.push(parseSdpLine('a=ssrc-group:SIM ' + ssrcs.join(' ')));\n\n const ssrcsStrLines = section.attributes.get('ssrc').get(originalSsrcs[0]).lines;\n\n ssrcs.forEach((ssrc, idx) => {\n const ssrc2 = ssrcs2[idx];\n if(idx > 0) {\n lines.push(parseSdpLine('a=ssrc-group:FID ' + ssrc + ' ' + ssrc2));\n\n ssrcsStrLines.forEach((v) => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc + ' ' + v));\n });\n\n ssrcsStrLines.forEach((v) => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc2 + ' ' + v));\n });\n }\n });\n\n sdp.media[idx] = new SDPMediaSection(lines);\n }\n });\n\n return !!generator;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport LocalConferenceDescription, {ConferenceEntry} from './localConferenceDescription';\nimport StringFromLineBuilder from './stringFromLineBuilder';\nimport {GroupCallConnectionTransport, PayloadType, UpdateGroupCallConnectionData} from './types';\nimport {fromTelegramSource} from './utils';\n\n// screencast is for Peer-to-Peer only\nexport type WebRTCLineTypeTrue = 'video' | 'audio' | 'application';\nexport type WebRTCLineType = WebRTCLineTypeTrue | 'screencast';\n\nexport const WEBRTC_MEDIA_PORT = '9';\n\nexport function fixMediaLineType(mediaType: WebRTCLineType) {\n return mediaType === 'screencast' ? 'video' : mediaType;\n}\n\nexport function performCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n const arr: string[] = [];\n arr.push('a=candidate:');\n arr.push(`${c.foundation} ${c.component} ${c.protocol.toUpperCase()} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`);\n if(c['rel-addr'] !== undefined) {\n arr.push(` raddr ${c['rel-addr']} rport ${c['rel-port']}`);\n }\n arr.push(` generation ${c.generation}`);\n return arr.join('');\n}\n\nexport function getConnectionTypeForMediaType(mediaType: WebRTCLineType) {\n // return mediaType === 'application' ? 'DTLS/SCTP' : 'RTP/SAVPF';\n return mediaType === 'application' ? 'DTLS/SCTP' : 'UDP/TLS/RTP/SAVPF';\n}\n\nexport function generateMediaFirstLine(mediaType: WebRTCLineType, port = WEBRTC_MEDIA_PORT, payloadIds: (string | number)[]) {\n const connectionType = getConnectionTypeForMediaType(mediaType);\n return `m=${fixMediaLineType(mediaType)} ${port} ${connectionType} ${payloadIds.join(' ')}`;\n}\n\ntype ConferenceData = UpdateGroupCallConnectionData | LocalConferenceDescription;\n\n// https://tools.ietf.org/id/draft-ietf-rtcweb-sdp-08.html\n// https://datatracker.ietf.org/doc/html/draft-roach-mmusic-unified-plan-00\nexport class SDPBuilder extends StringFromLineBuilder {\n public addCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n return this.add(performCandidate(c));\n }\n\n /* public addDataChannel(mid: string, transport: GroupCallConnectionTransport, isAnswer?: boolean) {\n this.add(\n 'm=application 9 UDP/DTLS/SCTP webrtc-datachannel',\n 'c=IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${mid}`\n );\n\n // if(!isAnswer) {\n this.add('a=sendrecv');\n // }\n\n this.addTransport(transport, isAnswer);\n\n return this.add(\n 'a=sctp-port:5000',\n 'a=max-message-size:262144'\n );\n } */\n\n public addHeader(sId: string, bundleMids: string[]) {\n const bundle = bundleMids.join(' ');\n return this.add(\n 'v=0', // version\n `o=- ${sId} 2 IN IP4 0.0.0.0`, // sessionId, 2=sessionVersion\n 's=-', // name of the session\n 't=0 0', // time when session is valid\n 'a=extmap-allow-mixed',\n `a=group:BUNDLE ${bundle}`,\n 'a=ice-options:trickle',\n // 'a=ice-lite', // ice-lite: is a minimal version of the ICE specification, intended for servers running on a public IP address.\n 'a=msid-semantic:WMS *'\n );\n }\n\n public addTransport(transport: GroupCallConnectionTransport, skipCandidates?: boolean) {\n this.add(\n `a=ice-ufrag:${transport.ufrag}`,\n `a=ice-pwd:${transport.pwd}`,\n 'a=ice-options:trickle' // ! test\n );\n\n for(const fingerprint of transport.fingerprints) {\n this.add(\n `a=fingerprint:${fingerprint.hash} ${fingerprint.fingerprint}`,\n `a=setup:${fingerprint.setup}`\n );\n }\n\n if(!skipCandidates && transport.candidates) {\n for(const candidate of transport.candidates) {\n this.addCandidate(candidate);\n }\n }\n\n return this;\n }\n\n public addSsrc(entry: ConferenceEntry) {\n let streamName = 'stream';\n let {type, sourceGroups} = entry;\n\n // let source = ssrc.source ?? ssrc.sourceGroups[0].sources[0];\n // source = fromTelegramSource(source);\n const source = fromTelegramSource(entry.source);\n\n streamName += source;\n type += source as any;\n\n // streamName += mid;\n // type += mid as any;\n\n // streamName = type = entry.transceiver.receiver.track.id as any;\n\n const addMsid = () => {\n this.add(`a=msid:${streamName} ${type}`);\n };\n\n const addSource = (ssrc: number) => {\n this.add(\n `a=ssrc:${ssrc} cname:${streamName}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}`,\n `a=ssrc:${ssrc} mslabel:${streamName}`,\n `a=ssrc:${ssrc} label:${type}`\n );\n };\n\n addMsid();\n if(sourceGroups?.length) {\n sourceGroups.forEach((ssrcGroup) => {\n if(ssrcGroup.sources.length) {\n const sources = ssrcGroup.sources.map(fromTelegramSource);\n this.add(`a=ssrc-group:${ssrcGroup.semantics} ${sources.join(' ')}`);\n sources.forEach(addSource);\n }\n });\n } else {\n addSource(source);\n }\n\n return this;\n }\n\n public addSsrcEntry(entry: ConferenceEntry, data: ConferenceData, isAnswer?: boolean) {\n const add = (...x: string[]) => this.add(...x);\n\n const {type, mid, direction, port} = entry;\n const transport = data.transport;\n\n /* if(type === 'application') {\n return this.addDataChannel(mid, transport, isAnswer);\n } */\n\n const isApplication = type === 'application';\n const codec = isApplication ? undefined : data[type];\n\n const isInactive = direction === 'inactive';\n if(entry.shouldBeSkipped(isAnswer)) {\n return add(\n `m=${fixMediaLineType(type)} 0 ${getConnectionTypeForMediaType(type)} 0`,\n `c=IN IP4 0.0.0.0`,\n `a=inactive`,\n `a=mid:${mid}`\n );\n }\n\n const payloadTypes = !isApplication ? codec['payload-types'] : [{id: 5000} as PayloadType];\n const ids = payloadTypes.map((type) => type.id);\n add(\n generateMediaFirstLine(type, port, ids),\n 'c=IN IP4 0.0.0.0',\n `a=rtcp:${port} IN IP4 0.0.0.0`\n );\n\n if(transport['rtcp-mux']) {\n add('a=rtcp-mux');\n }\n\n add(`a=mid:${mid}`);\n /* if(type === 'video') {\n add('b=AS:2500');\n } */\n\n let setDirection = direction;\n if(direction !== 'sendrecv' && isAnswer && !(isInactive || isApplication)) {\n setDirection = direction === 'sendonly' ? 'recvonly' : 'sendonly';\n }\n\n // a=bundle-only\n add(`a=${setDirection}`);\n\n // this.addTransport(transport, isAnswer);\n this.addTransport(transport);\n\n if(!isApplication) {\n const hdrexts = codec['rtp-hdrexts'];\n if(hdrexts?.length) {\n hdrexts.forEach((hdrext) => {\n add(`a=extmap:${hdrext.id} ${hdrext.uri}`);\n });\n }\n\n payloadTypes.forEach((type) => {\n add(`a=rtpmap:${type.id} ${type.name}/${type.clockrate}${type.channels && type.channels > 1 ? `/${type.channels}` : ''}`);\n\n const parameters = type.parameters;\n if(Array.isArray(parameters)) {\n if(parameters.length) {\n console.error('parameters is array???', parameters);\n }\n } else if(parameters && Object.keys(parameters).length) {\n const p: string[] = [];\n for(const i in parameters) {\n p.push(`${i}=${parameters[i]}`);\n }\n add(`a=fmtp:${type.id} ${p.join(';')}`);\n }\n\n const fbs = type['rtcp-fbs'];\n if(fbs?.length) {\n fbs.forEach((fb) => {\n add(`a=rtcp-fb:${type.id} ${fb.type}${fb.subtype ? ' ' + fb.subtype : ''}`);\n });\n }\n });\n } else {\n add(`a=sctpmap:${payloadTypes[0].id} webrtc-datachannel 256`);\n }\n\n if(entry.source && (setDirection === 'sendonly' || setDirection === 'sendrecv')) {\n this.addSsrc(entry);\n }\n\n return this;\n }\n\n public addConference(options: {\n conference: LocalConferenceDescription,\n bundle: string[],\n entries: ConferenceEntry[],\n isAnswer?: boolean,\n }) {\n const {conference, entries, bundle, isAnswer} = options;\n this.addHeader(conference.sessionId, bundle);\n\n if(IS_FIREFOX) {\n this.addTransport(conference.transport); // support Firefox\n }\n\n for(const entry of entries) {\n // this.addSsrcEntry(entry, conference, isAnswer);\n this.addSsrcEntry((isAnswer ? entry.recvEntry || entry.sendEntry : entry.sendEntry || entry.recvEntry) || entry, conference, isAnswer);\n }\n\n return this;\n }\n\n public static fromConference(options: Parameters[0]) {\n return new SDPBuilder().addConference(options).finalize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX} from './constants';\nimport stopTrack from './helpers/stopTrack';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport {fixMediaLineType, WebRTCLineType} from './sdpBuilder';\nimport {getAmplitude, toTelegramSource} from './utils';\n\nexport type StreamItemBase = {\n type: 'input' | 'output',\n track: MediaStreamTrack,\n source: string,\n stream: MediaStream\n};\n\nexport type StreamItem = StreamAudioItem | StreamVideoItem;\n\nexport type StreamAudioItem = StreamItemBase & {kind: 'audio', streamAnalyser: AudioStreamAnalyser};\nexport type StreamVideoItem = StreamItemBase & {kind: 'video'};\n\nexport type StreamAmplitude = {\n type: 'input' | 'output';\n source: string;\n stream: MediaStream;\n track: MediaStreamTrack;\n value: number;\n};\n\nclass AudioStreamAnalyser {\n public analyser: AnalyserNode;\n public gain: GainNode;\n public streamSource: MediaStreamAudioSourceNode;\n\n constructor(context: AudioContext, stream: MediaStream) {\n const streamSource = this.streamSource = context.createMediaStreamSource(stream);\n const analyser = this.analyser = context.createAnalyser();\n const gain = this.gain = context.createGain();\n // const streamDestination = context.createMediaStreamDestination();\n\n analyser.minDecibels = -100;\n analyser.maxDecibels = -30;\n analyser.smoothingTimeConstant = 0.05;\n analyser.fftSize = 1024;\n\n // connect Web Audio API\n streamSource.connect(analyser);\n // analyser.connect(context.destination);\n }\n}\n\nexport default class StreamManager {\n public static ANALYSER_LISTENER = new EventListenerBase<{amplitude: (details: {amplitudes: StreamAmplitude[], type: 'all' | 'input'}) => void}>();\n private context: AudioContext;\n public outputStream: MediaStream;\n public inputStream: MediaStream;\n\n private timer: number;\n private counter: number;\n\n private items: StreamItem[];\n\n private log: ReturnType;\n\n public direction: RTCRtpTransceiver['direction'];\n public canCreateConferenceEntry: boolean;\n public locked: boolean;\n public types: WebRTCLineType[];\n\n constructor(private interval?: number) {\n this.context = new (window.AudioContext || (window as any).webkitAudioContext)();\n this.items = [];\n this.outputStream = new MediaStream();\n this.inputStream = new MediaStream();\n this.counter = 0;\n this.log = logger('SM');\n this.direction = 'sendonly';\n this.canCreateConferenceEntry = true;\n // this.lol = true;\n this.types = ['audio', 'video'];\n }\n\n public addStream(stream: MediaStream, type: StreamItem['type']) {\n stream.getTracks().forEach((track) => {\n this.addTrack(stream, track, type);\n });\n }\n\n public addTrack(stream: MediaStream, track: MediaStreamTrack, type: StreamItem['type']) {\n this.log('addTrack', type, track, stream);\n\n const {context, items, inputStream, outputStream} = this;\n const kind: StreamItem['kind'] = track.kind as any;\n const source = StreamManager.getSource(stream, type);\n\n // this.removeTrack(track);\n switch(type) {\n case 'input': {\n if(!inputStream) {\n this.inputStream = stream;\n } else {\n inputStream.addTrack(track);\n }\n\n break;\n }\n\n case 'output': {\n for(let i = 0; i < items.length; ++i) {\n const {track: t, type, source: itemSource} = items[i];\n if(itemSource === source && type === 'input') {\n items.splice(i, 1);\n outputStream.removeTrack(t);\n break;\n }\n }\n\n if(kind !== 'video') {\n outputStream.addTrack(track);\n }\n\n break;\n }\n }\n\n this.finalizeAddingTrack({\n type,\n source,\n stream,\n track,\n kind,\n streamAnalyser: kind === 'audio' ? new AudioStreamAnalyser(context, stream) : undefined\n });\n\n if(kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n private finalizeAddingTrack(item: StreamItem) {\n const {track} = item;\n track.addEventListener('ended', () => {\n this.removeTrack(track);\n }, {once: true});\n\n this.items.push(item);\n }\n\n public hasInputTrackKind(kind: StreamItem['kind']) {\n return this.items.find((item) => item.type === 'input' && item.kind === kind);\n }\n\n public static getSource(stream: MediaStream, type: StreamItem['type']) {\n return type === 'input' ? (stream.source || stream.id) : '' + toTelegramSource(+stream.id.substring(6));\n }\n\n public removeTrack(track: MediaStreamTrack) {\n this.log('removeTrack', track);\n\n const {items} = this;\n\n let handled = false;\n for(let i = 0, length = items.length; !handled && i < length; ++i) {\n const {track: t, type} = items[i];\n switch(type) {\n case 'output': {\n if(t === track) {\n items.splice(i, 1);\n this.outputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n\n case 'input': {\n if(t === track) {\n items.splice(i, 1);\n this.inputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n }\n }\n\n if(track.kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n public replaceInputAudio(stream: MediaStream, oldTrack: MediaStreamTrack) {\n this.removeTrack(oldTrack);\n this.addStream(stream, 'input');\n }\n\n private changeTimer() {\n if(this.timer !== undefined) {\n clearInterval(this.timer);\n }\n\n if(this.items.length) {\n this.timer = window.setInterval(this.analyse, this.interval);\n }\n }\n\n public getAmplitude = (item: StreamAudioItem): StreamAmplitude => {\n const {streamAnalyser, stream, track, source, type} = item;\n const analyser = streamAnalyser.analyser;\n if(!analyser) return;\n\n const array = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(array);\n const value = getAmplitude(array);\n\n return {\n type,\n source,\n stream,\n track,\n value\n };\n };\n\n public analyse = () => {\n const all = this.counter % 3 === 0;\n const filteredItems = all ? this.items : this.items.filter((x) => x.type === 'input');\n const audioItems = filteredItems.filter((x) => x.kind === 'audio') as StreamAudioItem[];\n const amplitudes = audioItems.slice(0, GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX).map(this.getAmplitude);\n if(++this.counter >= 1000) {\n this.counter = 0;\n }\n\n StreamManager.ANALYSER_LISTENER.dispatchEvent('amplitude', {\n amplitudes,\n type: all ? 'all' : 'input'\n });\n };\n\n /* public appendToConnection(connection: RTCPeerConnection) {\n if(this.inputStream) {\n this.inputStream.getTracks().forEach((track) => {\n connection.log('addTrack', track);\n connection.addTrack(track, this.inputStream);\n\n if(track.kind === 'video') {\n track.enabled = true;\n }\n });\n }\n } */\n\n public appendToConference(conference: LocalConferenceDescription) {\n if(this.locked) {\n return;\n }\n\n const {inputStream, direction, canCreateConferenceEntry} = this;\n const transceiverInit: RTCRtpTransceiverInit = {direction, streams: [inputStream]};\n const types = this.types.map((type) => {\n return [\n type,\n /* type === 'video' || type === 'screencast' ?\n {sendEncodings: [{maxBitrate: 2500000}], ...transceiverInit} : */\n transceiverInit\n ] as const;\n });\n\n const tracks = inputStream.getTracks();\n // const transceivers = conference.connection.getTransceivers();\n for(const [type, transceiverInit] of types) {\n let entry = conference.findEntry((entry) => entry.direction === direction && entry.type === type);\n if(!entry) {\n if(!canCreateConferenceEntry) {\n continue;\n }\n\n entry = conference.createEntry(type);\n }\n /* const entry = conference.findFreeSendRecvEntry(type, true);\n if(!entry.transceiver) {\n entry.transceiver = transceivers.find((transceiver) => transceiver.mid === entry.mid);\n } */\n\n let {transceiver} = entry;\n if(!transceiver) {\n transceiver = entry.createTransceiver(conference.connection, transceiverInit);\n\n /* if(this.isScreenSharingManager) {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n } */\n }\n\n if(entry.direction !== transceiver.direction) {\n transceiver.direction = entry.direction;\n }\n\n const mediaTrackType = fixMediaLineType(type);\n const trackIdx = tracks.findIndex((track) => track.kind === mediaTrackType);\n const track = trackIdx !== -1 ? tracks.splice(trackIdx, 1)[0] : undefined;\n const sender = transceiver.sender;\n if(sender.track === track) {\n continue;\n }\n\n // try { // ! don't use await here. it will wait for adding track and fake one won't be visible in startNegotiation.\n /* await */sender.replaceTrack(track).catch((err) => {\n this.log.error(err);\n });\n // } catch(err) {\n\n // }\n }\n }\n\n public stop() {\n try {\n const tracks = this.inputStream.getTracks().concat(this.outputStream.getTracks());\n tracks.forEach((track) => {\n stopTrack(track);\n });\n } catch(e) {\n this.log.error(e);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport default class StringFromLineBuilder {\n private lines: string[];\n private newLine: string[];\n\n constructor(private joiner = '\\r\\n') {\n this.lines = [];\n this.newLine = [];\n }\n\n public add(...strs: string[]) {\n this.lines.push(...strs);\n return this;\n }\n\n public push(word: string) {\n this.newLine.push(word);\n return this;\n }\n\n public addJoined(separator = '') {\n this.add(this.newLine.join(separator));\n this.newLine = [];\n return this;\n }\n\n public join() {\n return this.lines.join(this.joiner);\n }\n\n public finalize() {\n return this.join() + this.joiner;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\n// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n// unsign => sign\nexport function toTelegramSource(source: number) {\n return source << 0;\n}\n\n// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n// sign => unsign\nexport function fromTelegramSource(source: number) {\n return source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n if(!array) return 0;\n\n const {length} = array;\n let total = 0;\n for(let i = 0; i < length; ++i) {\n total += array[i] * array[i];\n }\n const rms = Math.sqrt(total / length) / 255;\n\n return Math.min(1, rms * scale);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport getEmojiEntityFromEmoji from './getEmojiEntityFromEmoji';\nimport emojiRegExp from '../../vendor/emoji/regex';\n\nconst EMOJI_REG_EXP = new RegExp(`(^${emojiRegExp})`);\n\nexport default function getAbbreviation(str: string, onlyFirst = false): {\n text: string,\n entities: MessageEntity[]\n} {\n const splitted = (str || '').trim().split(' ');\n if(!splitted[0]) return {text: '', entities: []};\n\n const entities: MessageEntity.messageEntityEmoji[] = [];\n\n const firstEmojiMatch = splitted[0].match(EMOJI_REG_EXP);\n const first = firstEmojiMatch?.[0] || splitted[0][0];\n if(firstEmojiMatch) {\n entities.push(getEmojiEntityFromEmoji(first));\n }\n\n const length = splitted.length;\n if(onlyFirst || length === 1) return {text: first, entities};\n\n const lastEmojiMatch = splitted[length - 1].match(EMOJI_REG_EXP);\n const last = lastEmojiMatch?.[0] || splitted[length - 1][0];\n if(lastEmojiMatch) {\n entities.push({\n ...getEmojiEntityFromEmoji(last),\n offset: first.length\n });\n }\n\n return {text: first + last, entities};\n}\n","import {MessageEntity} from '../../layer';\nimport {toCodePoints} from '../../vendor/emoji';\n\nexport default function getEmojiEntityFromEmoji(emoji: string): MessageEntity.messageEntityEmoji {\n return {\n _: 'messageEntityEmoji',\n offset: 0,\n length: emoji.length,\n unicode: toCodePoints(emoji).join('-').replace(/-?fe0f/g, '')\n };\n}\n","import {EMAIL_REG_EXP} from '.';\n\nexport default function matchEmail(text: string) {\n return !text ? null : text.match(EMAIL_REG_EXP);\n}\n","export default function setBlankToAnchor(anchor: HTMLAnchorElement) {\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n return anchor;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport wrapEmojiText from './wrapEmojiText';\nimport getAbbreviation from './getAbbreviation';\n\nexport default function wrapAbbreviation(str: string, onlyFirst?: boolean) {\n const {text, entities} = getAbbreviation(str, onlyFirst);\n return wrapEmojiText(text, undefined, entities);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../rootScope';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapDraftText(text: string, options: Partial<{\n wrappingForPeerId: PeerId\n}> & Parameters[1] = {}) {\n if(!text) {\n return wrapRichText('');\n }\n\n let entities = options.entities;\n if(entities && !rootScope.premium && options.wrappingForPeerId !== rootScope.myId) {\n entities = entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\n }\n\n const fragment = wrapRichText(text, {\n ...options,\n entities,\n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n\n return fragment;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport parseEntities from './parseEntities';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapEmojiText(text: string, isDraft = false, entities?: MessageEntity[]) {\n if(!text) return wrapRichText('');\n\n entities ??= parseEntities(text).filter((e) => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n}\n","import IS_EMOJI_SUPPORTED from './emojiSupport';\n\nexport type EMOJI_VERSION = '' | '14';\n\nconst EMOJI_VERSIONS_SUPPORTED: {\n [v in EMOJI_VERSION]: boolean\n} = {} as any;\n\n// Thanks to WebZ for the detect\nfunction isEmojiSupported(emoji: string) {\n const ALLOWABLE_CALCULATION_ERROR_SIZE = 5;\n const inlineEl = document.createElement('span');\n inlineEl.classList.add('emoji');\n document.body.appendChild(inlineEl);\n\n inlineEl.innerText = emoji; // Emoji from 14.0 version\n const newEmojiWidth = inlineEl.offsetWidth;\n inlineEl.innerText = '❤️'; // Emoji from 1.0 version\n const legacyEmojiWidth = inlineEl.offsetWidth;\n\n document.body.removeChild(inlineEl);\n\n return Math.abs(newEmojiWidth - legacyEmojiWidth) < ALLOWABLE_CALCULATION_ERROR_SIZE;\n}\n\nif(IS_EMOJI_SUPPORTED) {\n EMOJI_VERSIONS_SUPPORTED[''] = true;\n\n const a: [keyof typeof EMOJI_VERSIONS_SUPPORTED, string][] = [\n ['14', '🫱🏻']\n ];\n\n a.forEach(([version, emoji]) => {\n EMOJI_VERSIONS_SUPPORTED[version] = isEmojiSupported(emoji);\n });\n}\n\nexport default EMOJI_VERSIONS_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {EMOJI_VERSION} from '../../environment/emojiVersionsSupport';\nimport {SITE_HASHTAGS} from '.';\nimport {EmojiVersions} from '../../config/emoji';\nimport IS_EMOJI_SUPPORTED from '../../environment/emojiSupport';\nimport buildURLHash from '../../helpers/buildURLHash';\nimport copy from '../../helpers/object/copy';\nimport encodeEntities from '../../helpers/string/encodeEntities';\nimport {MessageEntity} from '../../layer';\nimport encodeSpoiler from './encodeSpoiler';\nimport parseEntities from './parseEntities';\nimport setBlankToAnchor from './setBlankToAnchor';\nimport wrapUrl from './wrapUrl';\nimport EMOJI_VERSIONS_SUPPORTED from '../../environment/emojiVersionsSupport';\nimport {CLICK_EVENT_NAME} from '../../helpers/dom/clickEvent';\nimport IS_CUSTOM_EMOJI_SUPPORTED from '../../environment/customEmojiSupport';\nimport rootScope from '../rootScope';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport wrapSticker, {videosCache} from '../../components/wrappers/sticker';\nimport RLottiePlayer, {getLottiePixelRatio} from '../rlottie/rlottiePlayer';\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport type {MyDocument} from '../appManagers/appDocsManager';\nimport LazyLoadQueue from '../../components/lazyLoadQueue';\nimport {Awaited} from '../../types';\nimport {MediaSize} from '../../helpers/mediaSize';\nimport IS_WEBM_SUPPORTED from '../../environment/webmSupport';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\nimport {getMiddleware, Middleware, MiddlewareHelper} from '../../helpers/middleware';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport BOM from '../../helpers/string/bom';\nimport framesCache from '../../helpers/framesCache';\nimport wrapTelegramUrlToAnchor from './wrapTelegramUrlToAnchor';\n\nconst resizeObserver = new ResizeObserver((entries) => {\n for(const entry of entries) {\n const renderer = entry.target.parentElement as CustomEmojiRendererElement;\n renderer.setDimensionsFromRect(entry.contentRect);\n }\n});\n\nconst globalLazyLoadQueue = new LazyLoadQueue();\n\nexport class CustomEmojiElement extends HTMLElement {\n public elements: CustomEmojiElements;\n public renderer: CustomEmojiRendererElement;\n public player: RLottiePlayer | HTMLVideoElement;\n public paused: boolean;\n public syncedPlayer: SyncedPlayer;\n public clean: boolean;\n public lastChildWas: Node;\n // public docId: DocId;\n public placeholder: HTMLImageElement;\n public middlewareHelper: MiddlewareHelper;\n\n constructor() {\n super();\n this.paused = true;\n this.classList.add('custom-emoji');\n }\n\n public get docId() {\n return this.dataset.docId;\n }\n\n public static create(docId: DocId) {\n const element = new CustomEmojiElement();\n // element.docId = docId;\n element.dataset.docId = '' + docId;\n return element;\n }\n\n public get isConnected() {\n return this.placeholder?.isConnected ?? super.isConnected;\n }\n\n public connectedCallback() {\n // if(this.isConnected) {\n // return;\n // }\n\n if(this.player) {\n animationIntersector.addAnimation(this, this.renderer.animationGroup, undefined, true);\n }\n\n // this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected || !this.renderer?.isSelectable) { // prepend on sibling can invoke disconnectedCallback\n return;\n }\n\n this.clear();\n }\n\n public destroy() {\n this.clear();\n }\n\n public clear(replaceChildren = true) {\n if(this.clean) {\n return;\n }\n\n // if(this.docId === '5399836826758290421') {\n // console.log('clear', this, this.isConnected);\n // }\n\n this.clean = true;\n this.pause();\n\n const {syncedPlayer} = this;\n if(syncedPlayer) {\n syncedPlayer.pausedElements.delete(this);\n }\n\n this.middlewareHelper?.clean();\n\n if(this.renderer) {\n const elements = this.renderer.customEmojis.get(this.docId);\n if(elements?.delete(this) && !elements.size) {\n this.renderer.customEmojis.delete(this.docId);\n this.renderer.playersSynced.delete(elements);\n }\n\n if(replaceChildren) {\n if(this.renderer.isSelectable) {\n this.replaceChildren(createCustomFiller(true));\n } else {\n // otherwise https://bugs.chromium.org/p/chromium/issues/detail?id=1144736#c27 will happen\n this.replaceChildren();\n }\n }\n }\n\n if(this.player) {\n animationIntersector.removeAnimationByPlayer(this);\n }\n\n if(globalLazyLoadQueue) {\n globalLazyLoadQueue.delete({div: this});\n }\n\n /* this.disconnectedCallback = */this.elements =\n this.renderer =\n this.player =\n this.syncedPlayer =\n undefined;\n }\n\n public pause() {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n\n if(this.player instanceof HTMLVideoElement && !this.syncedPlayer) {\n this.renderer.lastPausedVideo = this.player;\n this.player.pause();\n }\n\n if(this.syncedPlayer && !this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.add(this);\n\n if(this.syncedPlayer.player && this.syncedPlayer.pausedElements.size === this.syncedPlayer.middlewares.size) {\n this.syncedPlayer.player.pause();\n }\n }\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n\n if(this.player instanceof HTMLVideoElement) {\n this.player.currentTime = this.renderer.lastPausedVideo?.currentTime || this.player.currentTime;\n this.player.play().catch(noop);\n }\n\n if(this.syncedPlayer && this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.delete(this);\n\n if(this.syncedPlayer.pausedElements.size !== this.syncedPlayer.middlewares.size) {\n this.player.play();\n }\n }\n }\n\n public remove() {\n this.clear();\n // this.elements = this.renderer = this.player = undefined;\n }\n\n public get autoplay() {\n return true;\n }\n}\n\ntype CustomEmojiElements = Set;\n\nexport class CustomEmojiRendererElement extends HTMLElement {\n public canvas: HTMLCanvasElement;\n public context: CanvasRenderingContext2D;\n\n public playersSynced: Map;\n public clearedElements: WeakSet;\n public customEmojis: Parameters[1]['customEmojis'];\n public lastPausedVideo: HTMLVideoElement;\n\n public lastRect: DOMRect;\n public isDimensionsSet: boolean;\n\n public animationGroup: AnimationItemGroup;\n public size: MediaSize;\n\n public isSelectable: boolean;\n public isCanvasClean: boolean;\n\n public ignoreSettingDimensions: boolean;\n\n public forceRenderAfterSize: boolean;\n\n public middlewareHelper: MiddlewareHelper;\n\n public auto: boolean;\n\n constructor() {\n super();\n\n this.classList.add('custom-emoji-renderer');\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('custom-emoji-canvas');\n this.context = this.canvas.getContext('2d');\n this.append(this.canvas);\n\n this.playersSynced = new Map();\n this.clearedElements = new WeakSet();\n this.customEmojis = new Map();\n\n this.animationGroup = 'EMOJI';\n this.isCanvasClean = false;\n }\n\n public connectedCallback() {\n if(emojiRenderers.has(this)) {\n return;\n }\n\n // this.setDimensions();\n // animationIntersector.addAnimation(this, this.animationGroup);\n resizeObserver.observe(this.canvas);\n emojiRenderers.add(this);\n\n this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected || !this.auto) {\n return;\n }\n\n this.destroy?.();\n\n this.disconnectedCallback = undefined;\n }\n\n public destroy() {\n // if(this.isConnected) {\n // return;\n // }\n\n resizeObserver.unobserve(this.canvas);\n\n this.customEmojis.forEach((elements) => {\n elements.forEach((element) => {\n element.clear();\n });\n });\n\n emojiRenderers.delete(this);\n this.playersSynced.clear();\n this.middlewareHelper?.clean();\n this.customEmojis.clear();\n\n this.destroy =\n this.lastPausedVideo =\n undefined;\n }\n\n public getOffsets(offsetsMap: Map = new Map()) {\n if(!this.playersSynced.size) {\n return offsetsMap;\n }\n\n const overflowElement = findUpClassName(this, 'scrollable') || this.offsetParent as HTMLElement;\n if(!overflowElement) {\n return offsetsMap;\n }\n\n const overflowRect = overflowElement.getBoundingClientRect();\n const rect = this.getBoundingClientRect();\n\n for(const elements of this.playersSynced.keys()) {\n const elementsArr = Array.from(elements);\n const placeholders = this.isSelectable ? elementsArr.map((element) => element.placeholder) : elementsArr;\n const {visible} = getViewportSlice({\n overflowElement,\n overflowRect,\n elements: placeholders,\n extraSize: this.size.height * 2.5 // let's add some margin\n });\n\n const offsets = visible.map(({rect: elementRect}) => {\n const top = elementRect.top - rect.top;\n const left = elementRect.left - rect.left;\n return {top, left, width: elementRect.width};\n });\n\n if(offsets.length) {\n offsetsMap.set(elements, offsets);\n }\n }\n\n // const rect = this.getBoundingClientRect();\n // const visibleRect = getVisibleRect(this, overflowElement, undefined, rect);\n // const minTop = visibleRect ? visibleRect.rect.top - this.size.height : 0;\n // const maxTop = Infinity;\n // for(const elements of this.playersSynced.keys()) {\n // const offsets = elements.map((element) => {\n // const elementRect = element.getBoundingClientRect();\n // const top = elementRect.top - rect.top;\n // const left = elementRect.left - rect.left;\n // return top >= minTop && (top + elementRect.height) <= maxTop ? {top, left} : undefined;\n // }).filter(Boolean);\n\n // if(offsets.length) {\n // offsetsMap.set(elements, offsets);\n // }\n // }\n\n return offsetsMap;\n }\n\n public clearCanvas() {\n if(this.isCanvasClean) {\n return;\n }\n\n const {context, canvas} = this;\n context.clearRect(0, 0, canvas.width, canvas.height);\n this.isCanvasClean = true;\n }\n\n public render(offsetsMap: ReturnType) {\n const {context, canvas, isDimensionsSet} = this;\n if(!isDimensionsSet) {\n this.setDimensionsFromRect(undefined, false);\n }\n\n this.isCanvasClean = false;\n\n const {width, height, dpr} = canvas;\n for(const [elements, offsets] of offsetsMap) {\n const player = this.playersSynced.get(elements);\n const frame = syncedPlayersFrames.get(player) || (player instanceof HTMLVideoElement ? player : undefined);\n if(!frame) {\n continue;\n }\n\n const isImageData = frame instanceof ImageData;\n let frameWidth: number, frameHeight: number;\n if(player instanceof HTMLVideoElement) {\n frameWidth = this.size.width * dpr;\n frameHeight = this.size.height * dpr;\n } else {\n frameWidth = frame.width;\n frameHeight = frame.height;\n }\n\n // ! check performance of scaling\n const elementWidth = Math.round(offsets[0].width * dpr);\n if(elementWidth !== frameWidth) {\n // if(this.size.width === 36) {\n // console.warn('different width', elementWidth, frameWidth, this);\n // }\n\n frameWidth = elementWidth;\n frameHeight = elementWidth;\n }\n\n const maxTop = height - frameHeight;\n const maxLeft = width - frameWidth;\n\n if(!this.clearedElements.has(elements) && !this.isSelectable) {\n if(this.isSelectable/* && false */) {\n elements.forEach((element) => {\n element.lastChildWas ??= element.lastChild;\n replaceContent(element, element.firstChild);\n });\n } else {\n elements.forEach((element) => {\n element.replaceChildren();\n });\n }\n\n this.clearedElements.add(elements);\n }\n\n offsets.forEach(({top, left}) => {\n top = Math.round(top * dpr), left = Math.round(left * dpr);\n if(left < 0 ||/* top > maxTop || */left > maxLeft) {\n return;\n }\n\n if(isImageData) {\n context.putImageData(frame, left, top);\n } else {\n // context.clearRect(left, top, width, height);\n context.drawImage(frame, left, top, frameWidth, frameHeight);\n }\n });\n }\n }\n\n public checkForAnyFrame() {\n for(const player of this.playersSynced.values()) {\n if(syncedPlayersFrames.has(player) || player instanceof HTMLVideoElement) {\n return true;\n }\n }\n\n return false;\n }\n\n public remove() {\n super.remove();\n // this.canvas.remove();\n }\n\n // public setDimensions() {\n // const {canvas} = this;\n // sequentialDom.mutateElement(canvas, () => {\n // const rect = canvas.getBoundingClientRect();\n // this.setDimensionsFromRect(rect);\n // });\n // }\n\n public setDimensionsFromRect(rect: DOMRect = this.lastRect, forceRenderAfter = true) {\n const {canvas} = this;\n const {dpr} = canvas;\n\n if(this.lastRect !== rect) {\n this.lastRect = rect;\n }\n\n if(!rect || !dpr || this.ignoreSettingDimensions) {\n return;\n }\n\n const {width, height} = rect;\n // if(this.isSelectable) {\n // height = this.parentElement.scrollHeight || height;\n\n // this.style.width = width + 'px';\n // this.style.height = height + 'px';\n // }\n\n const newWidth = Math.floor(Math.round(width * dpr));\n const newHeight = Math.floor(Math.round(height * dpr));\n if(canvas.width === newWidth && canvas.height === newHeight) {\n return;\n }\n\n canvas.width = newWidth;\n canvas.height = newHeight;\n this.isDimensionsSet = true;\n this.isCanvasClean = true;\n\n if(this.forceRenderAfterSize || (this.isSelectable && forceRenderAfter)) {\n this.forceRenderAfterSize = undefined;\n this.forceRender();\n }\n }\n\n public forceRender() {\n if(!this.isDimensionsSet) {\n return;\n }\n\n if(!renderEmojis(new Set([this]))) {\n this.clearCanvas();\n }\n }\n\n public add(\n addCustomEmojis: Parameters[1]['customEmojis'],\n lazyLoadQueue?: LazyLoadQueue | false,\n onlyThumb?: boolean,\n withThumb?: boolean\n ) {\n const renderer = this;\n\n addCustomEmojis.forEach((addElements, docId) => { // prevent adding old elements\n let elements = this.customEmojis.get(docId);\n if(!elements) this.customEmojis.set(docId, elements = new Set());\n else this.clearedElements.delete(elements);\n\n for(const el of addElements) {\n if(elements.has(el)) {\n addElements.delete(el);\n } else {\n el.clean = false;\n el.renderer = renderer;\n el.elements = elements;\n el.middlewareHelper = this.middlewareHelper.get().create();\n elements.add(el);\n\n if(el.lastChildWas && !el.lastChildWas.parentNode) {\n el.append(el.lastChildWas);\n }\n }\n }\n\n if(!addElements.size) {\n addCustomEmojis.delete(docId);\n }\n });\n\n if(!addCustomEmojis.size) {\n return;\n }\n\n const usingOwnQueue = !!(!lazyLoadQueue && lazyLoadQueue !== false && globalLazyLoadQueue);\n\n const docIds = Array.from(addCustomEmojis.keys());\n\n const managers = rootScope.managers;\n const middleware = this.middlewareHelper.get();\n const size = this.size;\n\n const loadPromise = managers.appEmojiManager.getCachedCustomEmojiDocuments(docIds).then((docs) => {\n if(middleware && !middleware()) return;\n\n const loadPromises: Promise[] = [];\n const wrap = (doc: MyDocument, _loadPromises?: Promise[]) => {\n const docId = doc.id;\n const newElements = addCustomEmojis.get(docId);\n const customEmojis = renderer.customEmojis.get(docId);\n const isLottie = doc.sticker === 2;\n const isStatic = doc.mime_type === 'video/webm' && !IS_WEBM_SUPPORTED;\n const willHaveSyncedPlayer = (isLottie || (doc.sticker === 3 && this.isSelectable)) && !onlyThumb && !isStatic;\n\n const loadPromises: Promise[] = [];\n const newElementsArray = Array.from(newElements);\n const promise = wrapSticker({\n div: newElementsArray,\n doc,\n width: size.width,\n height: size.height,\n loop: true,\n play: CUSTOM_EMOJI_INSTANT_PLAY,\n managers,\n isCustomEmoji: true,\n group: 'none',\n loadPromises,\n middleware,\n exportLoad: usingOwnQueue || lazyLoadQueue === false ? 2 : 1, // 2 - export load always, 1 - do not export load if cached static\n needFadeIn: false,\n loadStickerMiddleware: willHaveSyncedPlayer && middleware ? middleware.create().get(() => {\n // if(syncedPlayers.get(key) !== syncedPlayer) {\n // return false;\n // }\n\n // let good = false;\n // for(const middleware of syncedPlayer.middlewares) {\n // if(middleware()) {\n // good = true;\n // break;\n // }\n // }\n\n // return good;\n return !!syncedPlayer.middlewares.size;\n }) : undefined,\n static: isStatic,\n onlyThumb,\n withThumb: withThumb ?? (renderer.clearedElements.has(customEmojis) ? false : undefined),\n syncedVideo: this.isSelectable\n });\n\n if(_loadPromises) {\n promise.then(() => _loadPromises.push(...loadPromises));\n }\n\n const addition: {\n onRender?: (_p: Awaited['render']>) => Promise,\n elements: typeof newElements\n } = {\n elements: newElements\n };\n\n if(doc.sticker === 1 || onlyThumb || isStatic) {\n if(this.isSelectable) {\n addition.onRender = () => Promise.all(loadPromises).then(() => {\n if(middleware && !middleware()) return;\n newElementsArray.forEach((element) => {\n const {placeholder} = element;\n placeholder.src = (element.firstElementChild as HTMLImageElement).src;\n });\n });\n }\n\n return promise.then((res) => ({...res, ...addition}));\n }\n\n // eslint-disable-next-line prefer-const\n addition.onRender = (_p) => Promise.all(loadPromises).then(() => {\n if((middleware && !middleware()) || !doc.animated) {\n return;\n }\n\n const players = Array.isArray(_p) ? _p as HTMLVideoElement[] : [_p as RLottiePlayer];\n const player = Array.isArray(players) ? players[0] : players;\n assumeType(player);\n newElementsArray.forEach((element, idx) => {\n const player = players[idx] || players[0];\n element.player = player;\n\n if(syncedPlayer) {\n element.syncedPlayer = syncedPlayer;\n if(element.paused) {\n element.syncedPlayer.pausedElements.add(element);\n } else if(player.paused) {\n player.play();\n }\n }\n\n if(element.isConnected) {\n animationIntersector.addAnimation(element, element.renderer.animationGroup, undefined, true);\n }\n });\n\n if(player instanceof RLottiePlayer || (player instanceof HTMLVideoElement && this.isSelectable)) {\n syncedPlayer.player = player;\n renderer.playersSynced.set(customEmojis, player);\n }\n\n if(player instanceof RLottiePlayer) {\n player.group = renderer.animationGroup;\n\n player.overrideRender ??= (frame) => {\n syncedPlayersFrames.set(player, frame);\n // frames.set(containers, frame);\n };\n } else if(player instanceof HTMLVideoElement) {\n // player.play();\n\n // const cache = framesCache.getCache(key);\n // let {width, height} = renderer.size;\n // width *= dpr;\n // height *= dpr;\n\n // const onFrame = (frame: ImageBitmap | HTMLCanvasElement) => {\n // topFrames.set(player, frame);\n // player.requestVideoFrameCallback(callback);\n // };\n\n // let frameNo = -1, lastTime = 0;\n // const callback: VideoFrameRequestCallback = (now, metadata) => {\n // const time = player.currentTime;\n // if(lastTime > time) {\n // frameNo = -1;\n // }\n\n // const _frameNo = ++frameNo;\n // lastTime = time;\n // // const frameNo = Math.floor(player.currentTime * 1000 / CUSTOM_EMOJI_FRAME_INTERVAL);\n // // const frameNo = metadata.presentedFrames;\n // const imageBitmap = cache.framesNew.get(_frameNo);\n\n // if(imageBitmap) {\n // onFrame(imageBitmap);\n // } else if(IS_IMAGE_BITMAP_SUPPORTED) {\n // createImageBitmap(player, {resizeWidth: width, resizeHeight: height}).then((imageBitmap) => {\n // cache.framesNew.set(_frameNo, imageBitmap);\n // if(frameNo === _frameNo) onFrame(imageBitmap);\n // });\n // } else {\n // const canvas = document.createElement('canvas');\n // const context = canvas.getContext('2d');\n // canvas.width = width;\n // canvas.height = height;\n // context.drawImage(player, 0, 0);\n // cache.framesNew.set(_frameNo, canvas);\n // onFrame(canvas);\n // }\n // };\n\n // // player.requestVideoFrameCallback(callback);\n // // setInterval(callback, CUSTOM_EMOJI_FRAME_INTERVAL);\n }\n\n if(willHaveSyncedPlayer) {\n const dpr = getLottiePixelRatio(this.size.width, this.size.height);\n renderer.canvas.dpr = dpr;\n setRenderInterval();\n }\n });\n\n let syncedPlayer: SyncedPlayer;\n const key = [docId, size.width, size.height].join('-');\n if(willHaveSyncedPlayer) {\n syncedPlayer = syncedPlayers.get(key);\n if(!syncedPlayer) {\n syncedPlayer = {\n player: undefined,\n middlewares: new Set(),\n pausedElements: new Set(),\n key\n };\n\n syncedPlayers.set(key, syncedPlayer);\n }\n\n for(const element of newElements) {\n const middleware = element.middlewareHelper.get();\n syncedPlayer.middlewares.add(middleware);\n middleware.onClean(() => {\n syncedPlayer.middlewares.delete(middleware);\n\n if(!syncedPlayer.middlewares.size) {\n if(syncedPlayer.player) {\n const frame = syncedPlayersFrames.get(syncedPlayer.player);\n if(frame) {\n (frame as ImageBitmap).close?.();\n syncedPlayersFrames.delete(syncedPlayer.player);\n }\n\n syncedPlayersFrames.delete(syncedPlayer.player);\n if(syncedPlayer.player instanceof RLottiePlayer) {\n syncedPlayer.player.overrideRender = noop;\n syncedPlayer.player.remove();\n } else if(syncedPlayer.player instanceof HTMLVideoElement) {\n const cacheName = framesCache.generateName('' + element.docId, 0, 0, undefined, undefined);\n delete videosCache[cacheName];\n }\n\n syncedPlayer.player = undefined;\n }\n\n if(syncedPlayers.get(syncedPlayer.key) === syncedPlayer && syncedPlayers.delete(syncedPlayer.key) && !syncedPlayers.size) {\n clearRenderInterval();\n }\n }\n });\n }\n }\n\n return promise.then((res) => ({...res, ...addition}));\n };\n\n const missing: DocId[] = [];\n const cachedPromises = docs.map((doc, idx) => {\n if(!doc) {\n missing.push(docIds[idx]);\n return;\n }\n\n return wrap(doc, loadPromises);\n }).filter(Boolean);\n\n const uncachedPromisesPromise = !missing.length ?\n Promise.resolve([] as typeof cachedPromises) :\n managers.appEmojiManager.getCustomEmojiDocuments(missing).then((docs) => {\n if(middleware && !middleware()) return [];\n return docs.filter(Boolean).map((doc) => wrap(doc));\n });\n\n const loadFromPromises = (promises: typeof cachedPromises) => {\n return Promise.all(promises).then((arr) => {\n const promises = arr.map(({load, onRender, elements}) => {\n if(!load) {\n return;\n }\n\n const l = () => load().then(onRender);\n\n if(usingOwnQueue) {\n elements.forEach((element) => {\n globalLazyLoadQueue.push({\n div: element,\n load: () => {\n elements.forEach((element) => {\n globalLazyLoadQueue.delete({div: element});\n });\n\n return l();\n }\n });\n });\n } else {\n return l();\n }\n });\n\n return Promise.all(promises);\n });\n };\n\n const load = () => {\n if(middleware && !middleware()) return;\n const cached = loadFromPromises(cachedPromises);\n const uncached = uncachedPromisesPromise.then((promises) => loadFromPromises(promises));\n return Promise.all([cached, uncached]);\n };\n\n if(lazyLoadQueue) {\n lazyLoadQueue.push({\n div: renderer.canvas,\n load\n });\n } else {\n load();\n }\n\n return Promise.all(cachedPromises).then(() => Promise.all(loadPromises)).then(() => {});\n });\n\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n\n return loadPromise;\n }\n\n public static create(options: CustomEmojiRendererElementOptions) {\n const renderer = new CustomEmojiRendererElement();\n renderer.animationGroup = options.animationGroup;\n renderer.size = options.customEmojiSize || mediaSizes.active.customEmoji;\n renderer.isSelectable = options.isSelectable;\n if(options.wrappingDraft) {\n renderer.contentEditable = 'false';\n renderer.style.height = 'inherit';\n }\n // const middleware = () => !!renderer.disconnectedCallback && (!options.middleware || options.middleware());\n let middleware = options.middleware;\n if(middleware) {\n renderer.middlewareHelper = middleware.create();\n middleware = renderer.middlewareHelper.get();\n middleware.onDestroy(() => {\n renderer.destroy?.();\n });\n } else {\n // console.error('no middleware', this, options);\n renderer.auto = true;\n renderer.middlewareHelper = getMiddleware();\n }\n\n return renderer;\n }\n}\n\ntype CustomEmojiRenderer = CustomEmojiRendererElement;\ntype SyncedPlayer = {\n player: RLottiePlayer | HTMLVideoElement,\n middlewares: Set,\n pausedElements: Set,\n key: string\n};\ntype CustomEmojiFrame = Parameters[0] | HTMLVideoElement;\n\nconst CUSTOM_EMOJI_INSTANT_PLAY = true; // do not wait for animationIntersector\nlet emojiRenderInterval: number;\nconst emojiRenderers: Set = new Set();\nconst syncedPlayers: Map = new Map();\nconst syncedPlayersFrames: Map = new Map();\nexport const renderEmojis = (renderers = emojiRenderers) => {\n const r = Array.from(renderers);\n const t = r.filter((r) => r.isConnected && r.checkForAnyFrame() && !r.ignoreSettingDimensions);\n if(!t.length) {\n return false;\n }\n\n const o = t.map((renderer) => {\n const paused = [...renderer.playersSynced.values()].reduce((acc, v) => acc + +!!v.paused, 0);\n if(renderer.playersSynced.size === paused) {\n return;\n }\n\n const offsets = renderer.getOffsets();\n if(offsets.size) {\n return [renderer, offsets] as const;\n }\n }).filter(Boolean);\n\n for(const [renderer] of o) {\n renderer.clearCanvas();\n }\n\n for(const [renderer, offsets] of o) {\n renderer.render(offsets);\n }\n\n return true;\n};\nconst CUSTOM_EMOJI_FPS = 60;\nconst CUSTOM_EMOJI_FRAME_INTERVAL = 1000 / CUSTOM_EMOJI_FPS;\nconst setRenderInterval = () => {\n if(emojiRenderInterval) {\n return;\n }\n\n emojiRenderInterval = window.setInterval(renderEmojis, CUSTOM_EMOJI_FRAME_INTERVAL);\n renderEmojis();\n};\nconst clearRenderInterval = () => {\n if(!emojiRenderInterval) {\n return;\n }\n\n clearInterval(emojiRenderInterval);\n emojiRenderInterval = undefined;\n};\n\n(window as any).syncedPlayers = syncedPlayers;\n(window as any).emojiRenderers = emojiRenderers;\n\ncustomElements.define('custom-emoji-element', CustomEmojiElement);\ncustomElements.define('custom-emoji-renderer-element', CustomEmojiRendererElement);\n\ntype CustomEmojiRendererElementOptions = Partial<{\n loadPromises: Promise[],\n customEmojiRenderer: CustomEmojiRendererElement,\n\n isSelectable: boolean,\n wrappingDraft: boolean\n}> & WrapSomethingOptions;\n\n/**\n * * Expecting correctly sorted nested entities (RichTextProcessor.sortEntities)\n */\nexport default function wrapRichText(text: string, options: Partial<{\n entities: MessageEntity[],\n contextSite: string,\n highlightUsername: string,\n noLinks: boolean,\n noLinebreaks: boolean,\n noCommands: boolean,\n wrappingDraft: boolean,\n // mustWrapEmoji: boolean,\n fromBot: boolean,\n noTextFormat: boolean,\n passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }>,\n noEncoding: boolean,\n isSelectable: boolean,\n\n contextHashtag?: string,\n\n // ! recursive, do not provide\n nasty?: {\n i: number,\n usedLength: number,\n text: string,\n lastEntity?: MessageEntity\n },\n voodoo?: boolean,\n customEmojis?: Map,\n customWraps?: Set,\n}> & CustomEmojiRendererElementOptions = {}) {\n const fragment = document.createDocumentFragment();\n if(!text) {\n return fragment;\n }\n\n const nasty = options.nasty ??= {\n i: 0,\n usedLength: 0,\n text\n };\n\n const wrapSomething = (wrapElement: HTMLElement, noFiller?: boolean) => {\n const element = document.createElement('span');\n // element.append(BOM, a, BOM);\n if(options.wrappingDraft) {\n element.contentEditable = 'false';\n }\n // element.style.display = 'inline-block';\n element.classList.add('input-something');\n element.append(/* BOM, */wrapElement);\n\n (lastElement || fragment).append(element);\n\n wrapElement.classList.add('input-selectable');\n // if(wrapElement instanceof HTMLImageElement) {\n // element.prepend(f());\n // } else {\n !noFiller && wrapElement.append(createCustomFiller(true));\n // }\n\n customWraps.add(element);\n\n return element;\n };\n\n options.isSelectable ||= options.wrappingDraft;\n\n const customEmojis = options.customEmojis ??= new Map() as Map;\n const customWraps = options.customWraps ??= new Set();\n\n const entities = options.entities ??= parseEntities(nasty.text);\n\n const passEntities = options.passEntities ??= {};\n const contextSite = options.contextSite ??= 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const textLength = nasty.text.length;\n const length = entities.length;\n let lastElement: HTMLElement | DocumentFragment;\n for(; nasty.i < length; ++nasty.i) {\n let entity = entities[nasty.i];\n\n // * check whether text was sliced\n // TODO: consider about moving it to other function\n if(entity.offset >= textLength) {\n if(entity._ !== 'messageEntityCaret') { // * can set caret to the end\n continue;\n }\n } else if((entity.offset + entity.length) > textLength) {\n entity = copy(entity);\n // entity.length = entity.offset + entity.length - textLength;\n entity.length = textLength - entity.offset;\n }\n\n if(entity.length) {\n nasty.lastEntity = entity;\n }\n\n let nextEntity = entities[nasty.i + 1];\n\n const startOffset = entity.offset;\n const endOffset = startOffset + entity.length;\n const endPartOffset = Math.min(endOffset, nextEntity?.offset ?? 0xFFFF);\n const fullEntityText = nasty.text.slice(startOffset, endOffset);\n const sliced = nasty.text.slice(startOffset, endPartOffset);\n let partText = sliced;\n\n if(nasty.usedLength < startOffset) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength, startOffset));\n }\n\n if(lastElement) {\n lastElement = fragment;\n }\n\n nasty.usedLength = endPartOffset;\n\n let element: HTMLElement,\n property: 'textContent' | 'alt' = 'textContent',\n usedText = false;\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontWeight = 'bold';\n element.style.fontFamily = 'markup-bold';\n } else {\n element = document.createElement('strong');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontStyle = 'italic';\n element.style.fontFamily = 'markup-italic';\n } else {\n element = document.createElement('em');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: line-through;`;\n element.style.fontFamily = 'markup-strikethrough';\n } else/* if(!options.noTextFormat) */ {\n element = document.createElement('del');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: underline;`;\n element.style.fontFamily = 'markup-underline';\n } else if(!options.noTextFormat) {\n element = document.createElement('u');\n }\n\n break;\n }\n\n case 'messageEntityPre':\n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n element.style.fontFamily = 'markup-monospace';\n } else if(!options.noTextFormat) {\n element = document.createElement('code');\n }\n\n break;\n }\n\n // case 'messageEntityPre': {\n // if(options.wrappingDraft) {\n // element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n // } else if(!options.noTextFormat) {\n // element = document.createElement('pre');\n // const inner = document.createElement('code');\n // if(entity.language) {\n // inner.className = 'language-' + entity.language;\n // inner.textContent = entityText;\n // usedText = true;\n // }\n // }\n\n // break;\n // }\n\n case 'messageEntityHighlight': {\n element = document.createElement('i');\n element.className = 'text-highlight';\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n let command = fullEntityText.slice(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.slice(atPos + 1);\n command = command.slice(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('tg://bot_command?command=' + encodeURIComponent(command) + (bot ? '&bot=' + encodeURIComponent(bot) : ''));\n if(!contextExternal) {\n element.setAttribute('onclick', 'execBotCommand(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityCustomEmoji': {\n if(!IS_CUSTOM_EMOJI_SUPPORTED) {\n break;\n }\n\n while(nextEntity?._ === 'messageEntityEmoji' && nextEntity.offset < endOffset) {\n ++nasty.i;\n nasty.lastEntity = nextEntity;\n nasty.usedLength += nextEntity.length;\n nextEntity = entities[nasty.i + 1];\n }\n\n const customEmojiElement = element = CustomEmojiElement.create(entity.document_id);\n const {docId} = customEmojiElement;\n let set = customEmojis.get(docId);\n if(!set) customEmojis.set(docId, set = new Set());\n set.add(customEmojiElement);\n customEmojiElement.dataset.stickerEmoji = fullEntityText;\n\n if(options.wrappingDraft) {\n element = document.createElement('img');\n (element as HTMLImageElement).alt = fullEntityText;\n for(const i in customEmojiElement.dataset) {\n element.dataset[i] = customEmojiElement.dataset[i];\n }\n (element as any).customEmojiElement = customEmojiElement;\n customEmojiElement.placeholder = element as HTMLImageElement;\n element.classList.add('custom-emoji-placeholder');\n (element as HTMLImageElement).src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAAtJREFUGFdjYAACAAAFAAGq1chRAAAAAElFTkSuQmCC';\n property = 'alt';\n break;\n }\n\n if(options.isSelectable) {\n // const s = document.createElement('span');\n // s.append(fullEntityText);\n // element.append(s);\n // element.textContent = fullEntityText;\n // element.textContent = 'a';\n // element.contentEditable = 'false';\n\n // const x = f();\n // x.style.display = 'inline-block';\n // x.contentEditable = 'false';\n // (lastElement || fragment).append(BOM);\n // (lastElement || fragment).append(x);\n\n element = wrapSomething(element, !!options.customEmojiRenderer);\n\n // const a = element;\n // element = document.createElement('span');\n // element.append(BOM, a, BOM);\n // element.contentEditable = 'false';\n }\n\n property = 'alt';\n break;\n }\n\n case 'messageEntityEmoji': {\n let isSupported = IS_EMOJI_SUPPORTED;\n if(isSupported) {\n for(const version in EmojiVersions) {\n if(version) {\n const emojiData = EmojiVersions[version as EMOJI_VERSION];\n if(emojiData.hasOwnProperty(entity.unicode) && !EMOJI_VERSIONS_SUPPORTED[version as EMOJI_VERSION]) {\n isSupported = false;\n break;\n }\n }\n }\n }\n\n // if(!(options.wrappingDraft && isSupported)) { // * fix safari emoji\n if(!isSupported) { // no wrapping needed\n // if(isSupported) { // ! contenteditable=\"false\" нужен для поля ввода, иначе там будет меняться шрифт в Safari, или же рендерить смайлик напрямую, без контейнера\n // insertPart(entity, '', '');\n // } else {\n element = document.createElement('img');\n (element as HTMLImageElement).src = `assets/img/emoji/${entity.unicode}.png`;\n property = 'alt';\n element.className = 'emoji';\n\n // if(options.isSelectable) {\n // usedText = true;\n // (element as HTMLImageElement).alt = partText;\n // element = wrapSomething(element);\n // }\n\n // const a = element;\n // a.contentEditable = 'false';\n // element = document.createElement('span');\n // element.append(a);\n // element.contentEditable = 'false';\n // }\n // } else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n element = document.createElement('span');\n element.className = 'emoji';\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '', '');\n } */\n /* if(!isSupported) {\n insertPart(entity, `\"`,`);\n } */\n\n break;\n }\n\n case 'messageEntityCaret': {\n element = document.createElement('span');\n element.className = 'composer-sel';\n break;\n }\n\n // case 'messageEntityLinebreak': {\n // if(options.noLinebreaks) {\n // insertPart(entity, ' ');\n // } else {\n // insertPart(entity, '
');\n // }\n\n // break;\n // }\n\n case 'messageEntityUrl':\n case 'messageEntityTextUrl': {\n if(!(options.noLinks && !passEntities[entity._])) {\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || fullEntityText;\n let masked = false;\n let onclick: string;\n\n const wrapped = wrapUrl(url, true);\n url = wrapped.url;\n onclick = wrapped.onclick;\n\n if(entity._ === 'messageEntityTextUrl') {\n if(nextEntity?._ === 'messageEntityUrl' &&\n nextEntity.length === entity.length &&\n nextEntity.offset === entity.offset) {\n nasty.lastEntity = nextEntity;\n ++nasty.i;\n }\n\n if(url !== fullEntityText) {\n masked = true;\n }\n } else {\n // inner = encodeEntities(replaceUrlEncodings(entityText));\n }\n\n const currentContext = !!onclick;\n if(!onclick && masked && !currentContext) {\n onclick = 'showMaskedAlert';\n }\n\n if(options.wrappingDraft) {\n onclick = undefined;\n }\n\n const href = (currentContext || typeof electronHelpers === 'undefined') ?\n url :\n `javascript:electronHelpers.openExternal('${url}');`;\n\n element = document.createElement('a');\n element.className = 'anchor-url';\n (element as HTMLAnchorElement).href = href;\n\n if(!(currentContext || typeof electronHelpers !== 'undefined')) {\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n if(onclick) {\n element.setAttribute('onclick', onclick + '(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('mailto:' + fullEntityText);\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n break;\n }\n\n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && SITE_HASHTAGS[contextSite];\n if(contextUrl) {\n const hashtag = fullEntityText.slice(1);\n element = document.createElement('a');\n element.className = 'anchor-hashtag';\n (element as HTMLAnchorElement).href = contextUrl.replace('{1}', encodeURIComponent(hashtag));\n if(contextExternal) {\n setBlankToAnchor(element as HTMLAnchorElement);\n } else {\n element.setAttribute('onclick', 'searchByHashtag(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = buildURLHash('' + entity.user_id);\n element.className = 'follow';\n element.dataset.follow = '' + entity.user_id;\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const username = fullEntityText.slice(1);\n\n element = wrapTelegramUrlToAnchor('t.me/' + username);\n element.className = 'mention';\n\n // insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const encoded = encodeSpoiler(nasty.text, entity);\n nasty.text = encoded.text;\n partText = encoded.entityText;\n if(endPartOffset !== endOffset) {\n nasty.usedLength += endOffset - endPartOffset;\n }\n let n: MessageEntity;\n for(; n = entities[nasty.i + 1], n && n.offset < endOffset;) {\n // nasty.usedLength += n.length;\n ++nasty.i;\n nasty.lastEntity = n;\n nextEntity = entities[nasty.i + 1];\n }\n } else if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontFamily = 'spoiler';\n element.style.fontFamily = 'markup-spoiler';\n } else {\n const container = document.createElement('span');\n container.className = 'spoiler';\n element = document.createElement('span');\n element.className = 'spoiler-text';\n element.textContent = partText;\n usedText = true;\n container.append(element);\n fragment.append(container);\n\n container[`on${CLICK_EVENT_NAME}`] = (window as any).onSpoilerClick;\n }\n\n break;\n }\n }\n\n if(!usedText && partText) {\n if(element) {\n // @ts-ignore\n element[property] = partText;\n } else {\n (element || fragment).append(partText);\n }\n }\n\n if(element && !element.parentNode) {\n (lastElement || fragment).append(element);\n }\n\n while(nextEntity && nextEntity.offset < endOffset) {\n ++nasty.i;\n\n (element || fragment).append(wrapRichText(nasty.text, {\n ...options,\n voodoo: true\n }));\n\n nextEntity = entities[nasty.i + 1];\n }\n\n // if(!element?.parentNode) {\n // (lastElement || fragment).append(element ?? partText);\n // }\n\n if(nasty.usedLength <= endOffset) {\n if(nasty.usedLength < endOffset) {\n (element || fragment).append(nasty.text.slice(nasty.usedLength, endOffset));\n nasty.usedLength = endOffset;\n }\n\n lastElement = fragment;\n nasty.lastEntity = undefined;\n } else if(entity.length > partText.length && element) {\n lastElement = element;\n } else {\n lastElement = fragment;\n }\n\n if(options.voodoo) {\n return fragment;\n }\n }\n\n if(nasty.lastEntity) {\n nasty.usedLength = nasty.lastEntity.offset + nasty.lastEntity.length;\n }\n\n if(nasty.usedLength < textLength) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength));\n }\n\n if((!options.wrappingDraft || options.customEmojiRenderer) && customEmojis.size) {\n let renderer = options.customEmojiRenderer;\n if(!renderer) {\n renderer = CustomEmojiRendererElement.create(options);\n fragment.prepend(renderer);\n }\n\n const loadPromise = renderer.add(customEmojis, options.lazyLoadQueue, options.wrappingDraft);\n options.loadPromises?.push(loadPromise);\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n }\n\n if(customWraps.size) {\n insertCustomFillers(customWraps);\n }\n\n return fragment;\n}\n\nexport const createCustomFiller = (notFiller?: boolean) => {\n const x = document.createElement('span');\n x.classList.add(notFiller ? 'input-filler2' : 'input-filler');\n x.textContent = BOM;\n return x;\n};\n\nexport function isCustomFillerNeededBySiblingNode(node: ChildNode) {\n if(\n // !node?.textContent ||\n // node.textContent.endsWith('\\n') ||\n node?.textContent !== BOM ||\n (node as HTMLElement)?.getAttribute?.('contenteditable') === 'false'\n ) {\n // if(!node || (node as HTMLElement).firstElementChild || node.textContent.endsWith('\\n')) {\n if(!node || node.textContent !== BOM || (node as HTMLElement).firstElementChild) {\n return 2;\n } else if(node.nodeType === node.ELEMENT_NODE) {\n return 1;\n }/* else if(node.nodeType === node.TEXT_NODE && !node.nodeValue) {\n (node as CharacterData).insertData(0, BOM);\n } */\n }\n\n return 0;\n}\n\nexport function insertCustomFillers(elements: Iterable) {\n const check = (element: HTMLElement, node: ChildNode, method: 'before' | 'after') => {\n const needed = isCustomFillerNeededBySiblingNode(node);\n if(needed === 2) {\n element[method](createCustomFiller());\n } else if(needed === 1) {\n node.appendChild(document.createTextNode(BOM));\n }\n };\n\n for(const element of elements) {\n const {previousSibling, nextSibling} = element;\n check(element, previousSibling, 'before');\n check(element, nextSibling, 'after');\n }\n}\n\n(window as any).wrapRichText = wrapRichText;\n","// just for the future\nexport default function buildURLHash(str: string) {\n return '#' + encodeURIComponent(str);\n}\n","import wrapUrl from './wrapUrl';\n\nexport default function wrapTelegramUrlToAnchor(url1: string) {\n const {url, onclick} = wrapUrl(url1);\n const element = document.createElement('a');\n (element as HTMLAnchorElement).href = url;\n if(onclick) {\n element.setAttribute('onclick', `${onclick}(this)`);\n }\n\n return element;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport EventListenerBase from '../../helpers/eventListenerBase';\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => void,\n loaded: (reqId: number, frameCount: number, fps: number) => void,\n error: (reqId: number, error: Error) => void,\n workerError: (error: ErrorEvent) => void\n}> {\n constructor(private worker: Worker) {\n super();\n\n this.worker.onerror = (error) => {\n try {\n this.dispatchEvent('workerError', error);\n this.cleanup();\n this.terminate();\n } catch(err) {\n\n }\n };\n\n this.worker.onmessage = (event) => {\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(args: any[], transfer?: Transferable[]) {\n this.worker.postMessage({\n queryMethod: args.shift(),\n queryMethodArguments: args\n }, CAN_USE_TRANSFERABLES ? transfer: undefined);\n }\n}\n","const IS_WEB_ASSEMBLY_SUPPORTED = typeof(WebAssembly) !== 'undefined';\n\nexport default IS_WEB_ASSEMBLY_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport pause from '../../helpers/schedulers/pause';\nimport {logger, LogTypes} from '../logger';\nimport RLottiePlayer, {RLottieOptions} from './rlottiePlayer';\nimport QueryableWorker from './queryableWorker';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport IS_WEB_ASSEMBLY_SUPPORTED from '../../environment/webAssemblySupport';\nimport makeError from '../../helpers/makeError';\nimport App from '../../config/app';\n\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' |\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' |\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' |\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' |\n 'voice_outlined2' | 'voip_filled' | 'voice_mini' | 'jolly_roger';\n\nexport class LottieLoader {\n private loadPromise: Promise = !IS_WEB_ASSEMBLY_SUPPORTED ? Promise.reject() : undefined;\n private loaded = false;\n\n private workersLimit = App.threads;\n private players: {[reqId: number]: RLottiePlayer} = {};\n private playersByCacheName: {[cacheName: string]: Set} = {};\n\n private workers: QueryableWorker[] = [];\n private curWorkerNum = 0;\n\n private log = logger('LOTTIE', LogTypes.Error);\n\n public getAnimation(element: HTMLElement) {\n for(const i in this.players) {\n if(this.players[i].el.includes(element)) {\n return this.players[i];\n }\n }\n\n return null;\n }\n\n public setLoop(loop: boolean) {\n for(const i in this.players) {\n const player = this.players[i];\n player.loop = loop;\n player.autoplay = player._autoplay;\n }\n }\n\n public loadLottieWorkers() {\n if(this.loadPromise) {\n return this.loadPromise;\n }\n\n return this.loadPromise = new Promise((resolve, reject) => {\n let remain = this.workersLimit;\n for(let i = 0; i < this.workersLimit; ++i) {\n const worker = new Worker(new URL('./rlottie.worker.ts', import.meta.url));\n const queryableWorker = this.workers[i] = new QueryableWorker(worker);\n\n queryableWorker.addEventListener('ready', () => {\n this.log('worker #' + i + ' ready');\n\n queryableWorker.addEventListener('frame', this.onFrame);\n queryableWorker.addEventListener('loaded', this.onPlayerLoaded);\n queryableWorker.addEventListener('error', this.onPlayerError);\n\n --remain;\n if(!remain) {\n this.log('workers ready');\n resolve();\n this.loaded = true;\n }\n }, {once: true});\n\n queryableWorker.addEventListener('workerError', (error) => {\n reject('rlottie load error: ' + error.message);\n this.loaded = false;\n }, {once: true});\n }\n });\n }\n\n private makeAssetUrl(name: LottieAssetName) {\n return 'assets/tgs/' + name + '.json';\n }\n\n public loadAnimationAsAsset(params: Omit, name: LottieAssetName) {\n // (params as RLottieOptions).name = name;\n return this.loadAnimationFromURL(params, this.makeAssetUrl(name));\n }\n\n public loadAnimationDataFromURL(url: string): Promise {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return this.loadPromise as any;\n }\n\n this.loadLottieWorkers();\n\n return fetch(url)\n .then((res) => {\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\n return res.arrayBuffer()\n .then((data) => apiManagerProxy.invokeCrypto('gzipUncompress', data))\n .then((arr) => blobConstruct(arr as Uint8Array, ''));\n } else {\n return res.blob();\n }\n });\n /* .then((str) => {\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\n }) */\n }\n\n public loadAnimationFromURLManually(name: LottieAssetName) {\n const url = this.makeAssetUrl(name);\n return this.loadAnimationDataFromURL(url).then((blob) => {\n return (params: Omit) => this.loadAnimationFromURLNext(blob, params, url);\n });\n }\n\n public loadAnimationFromURL(params: Omit, url: string) {\n return this.loadAnimationDataFromURL(url).then((blob) => {\n return this.loadAnimationFromURLNext(blob, params, url);\n });\n }\n\n public loadAnimationFromURLNext(blob: Blob, params: Omit, url: string) {\n const newParams = Object.assign(params, {animationData: blob, needUpscale: true});\n newParams.name ||= url;\n return this.loadAnimationWorker(newParams);\n }\n\n public waitForFirstFrame(player: RLottiePlayer) {\n return Promise.race([\n /* new Promise((resolve) => {\n player.addEventListener('firstFrame', () => {\n setTimeout(() => resolve(), 1500);\n }, true);\n }) */\n new Promise((resolve) => {\n player.addEventListener('firstFrame', resolve, {once: true});\n }),\n pause(2500)\n ]).then(() => player);\n }\n\n public async loadAnimationWorker(params: RLottieOptions): Promise {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return this.loadPromise as any;\n }\n\n if(!this.loaded) {\n await this.loadLottieWorkers();\n }\n\n const {middleware, group = ''} = params;\n if(middleware && !middleware()) {\n throw makeError('MIDDLEWARE');\n }\n\n if(params.sync) {\n const cacheName = RLottiePlayer.CACHE.generateName(params.name, params.width, params.height, params.color, params.toneIndex);\n const players = this.playersByCacheName[cacheName];\n if(players?.size) {\n return Promise.resolve(players.entries().next().value[0]);\n }\n }\n\n const containers = Array.isArray(params.container) ? params.container : [params.container];\n if(!params.width || !params.height) {\n params.width = parseInt(containers[0].style.width);\n params.height = parseInt(containers[0].style.height);\n }\n\n if(!params.width || !params.height) {\n throw new Error('No size for sticker!');\n }\n\n params.group = group;\n\n const player = this.initPlayer(containers, params);\n\n animationIntersector.addAnimation(player, group, undefined, middleware);\n\n return player;\n }\n\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\n const player = this.players[reqId];\n if(!player) {\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\n return;\n }\n\n this.log.debug('onPlayerLoaded');\n player.onLoad(frameCount, fps);\n };\n\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => {\n const player = this.players[reqId];\n if(!player) {\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\n return;\n }\n\n if(player.clamped !== undefined && frame instanceof Uint8ClampedArray) {\n player.clamped = frame;\n }\n\n player.renderFrame(frame, frameNo);\n };\n\n private onPlayerError = (reqId: number, error: Error) => {\n const player = this.players[reqId];\n if(!player) {\n return;\n }\n\n // ! will need refactoring later, this is not the best way to remove the animation\n const animations = animationIntersector.getAnimations(player.el[0]);\n animations.forEach((animation) => {\n animationIntersector.removeAnimation(animation);\n });\n };\n\n public onDestroy(reqId: number) {\n delete this.players[reqId];\n }\n\n public destroyWorkers() {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return;\n }\n\n this.workers.forEach((worker, idx) => {\n worker.terminate();\n this.log('worker #' + idx + ' terminated');\n });\n\n this.log('workers destroyed');\n this.workers.length = 0;\n this.curWorkerNum = 0;\n this.loaded = false;\n this.loadPromise = undefined;\n }\n\n private initPlayer(el: RLottiePlayer['el'], options: RLottieOptions) {\n const player = new RLottiePlayer({\n el,\n worker: this.workers[this.curWorkerNum++],\n options\n });\n\n const {reqId, cacheName} = player;\n this.players[reqId] = player;\n\n const playersByCacheName = cacheName ? this.playersByCacheName[cacheName] ??= new Set() : undefined;\n if(cacheName) {\n playersByCacheName.add(player);\n }\n\n if(this.curWorkerNum >= this.workers.length) {\n this.curWorkerNum = 0;\n }\n\n player.addEventListener('destroy', () => {\n this.onDestroy(reqId);\n if(playersByCacheName.delete(player) && !playersByCacheName.size) {\n delete this.playersByCacheName[cacheName];\n }\n });\n\n player.loadFromData(options.animationData);\n\n return player;\n }\n}\n\nconst lottieLoader = new LottieLoader();\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\nexport default lottieLoader;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AnimationItemGroup, AnimationItemWrapper} from '../../components/animationIntersector';\nimport type {Middleware} from '../../helpers/middleware';\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport IS_APPLE_MX from '../../environment/appleMx';\nimport {IS_ANDROID, IS_APPLE_MOBILE, IS_APPLE, IS_SAFARI} from '../../environment/userAgent';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport clamp from '../../helpers/number/clamp';\nimport QueryableWorker from './queryableWorker';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\nimport framesCache, {FramesCache, FramesCacheItem} from '../../helpers/framesCache';\n\nexport type RLottieOptions = {\n container: HTMLElement | HTMLElement[],\n middleware?: Middleware,\n canvas?: HTMLCanvasElement,\n autoplay?: boolean,\n animationData: Blob,\n loop?: RLottiePlayer['loop'],\n width?: number,\n height?: number,\n group?: AnimationItemGroup,\n noCache?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n initFrame?: number, // index\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n name?: string,\n skipFirstFrameRendering?: boolean,\n toneIndex?: number,\n sync?: boolean\n};\n\nexport type RLottieColor = [number, number, number];\n\nexport function getLottiePixelRatio(width: number, height: number, needUpscale?: boolean) {\n let pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1 && !needUpscale) {\n if(width > 90 && height > 90) {\n if(!IS_APPLE && mediaSizes.isMobile) {\n pixelRatio = 1;\n }\n } else if((width > 60 && height > 60) || IS_ANDROID) {\n pixelRatio = Math.max(1.5, pixelRatio - 1.5);\n }\n }\n\n return pixelRatio;\n}\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void,\n destroy: () => void\n}> implements AnimationItemWrapper {\n public static CACHE = framesCache;\n private static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n private frameCount: number;\n private fps: number;\n private skipDelta: number;\n public name: string;\n public cacheName: string;\n private toneIndex: number;\n\n private worker: QueryableWorker;\n\n private width = 0;\n private height = 0;\n\n public el: HTMLElement[];\n public canvas: HTMLCanvasElement[];\n private contexts: CanvasRenderingContext2D[];\n\n public paused = true;\n // public paused = false;\n public direction = 1;\n private speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop: number | boolean = true;\n private _loop: RLottiePlayer['loop']; // ! will be used to store original value for settings.stickers.loop\n public group: AnimationItemGroup = '';\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n // private caching = false;\n // private removed = false;\n\n private cache: FramesCacheItem;\n private imageData: ImageData;\n public clamped: Uint8ClampedArray;\n private cachingDelta = 0;\n\n private initFrame: number;\n private color: RLottieColor;\n private inverseColor: RLottieColor;\n\n public minFrame: number;\n public maxFrame: number;\n\n private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: (currentFrame: number) => void;\n private skipFirstFrameRendering: boolean;\n private playToFrameOnFrameCallback: (frameNo: number) => void;\n\n public overrideRender: (frame: ImageData | HTMLCanvasElement | ImageBitmap) => void;\n private renderedFirstFrame: boolean;\n\n private raw: boolean;\n\n constructor({el, worker, options}: {\n el: RLottiePlayer['el'],\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(const i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // ! :(\n this.initFrame = options.initFrame;\n this.color = options.color;\n this.inverseColor = options.inverseColor;\n this.name = options.name;\n this.skipFirstFrameRendering = options.skipFirstFrameRendering;\n this.toneIndex = options.toneIndex;\n this.raw = this.color !== undefined;\n\n if(this.name) {\n this.cacheName = RLottiePlayer.CACHE.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n }\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((IS_ANDROID || IS_APPLE_MOBILE || (IS_APPLE && !IS_SAFARI && !IS_APPLE_MX)) && this.width < 100 && this.height < 100 && !options.needUpscale) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n // options.needUpscale = true;\n\n // * Pixel ratio\n const pixelRatio = getLottiePixelRatio(this.width, this.height, options.needUpscale);\n\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n\n // options.noCache = true;\n\n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(IS_APPLE && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; // 2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n\n // this.cachingDelta = Infinity;\n // this.cachingDelta = 0;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n if(!this.canvas) {\n this.canvas = this.el.map(() => {\n const canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = this.width;\n canvas.height = this.height;\n canvas.dpr = pixelRatio;\n return canvas;\n });\n }\n\n this.contexts = this.canvas.map((canvas) => canvas.getContext('2d'));\n\n if(!IS_IMAGE_BITMAP_SUPPORTED || this.raw) {\n this.imageData = new ImageData(this.width, this.height);\n\n if(CAN_USE_TRANSFERABLES) {\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n }\n\n if(this.name) {\n this.cache = RLottiePlayer.CACHE.getCache(this.cacheName);\n } else {\n this.cache = FramesCache.createCache();\n }\n }\n\n public clearCache() {\n if(this.cachingDelta === Infinity) {\n return;\n }\n\n if(this.cacheName && this.cache.counter > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n\n this.cache.clearCache();\n }\n\n public sendQuery(args: any[], transfer?: Transferable[]) {\n this.worker.sendQuery([args.shift(), this.reqId, ...args], transfer);\n }\n\n public loadFromData(data: RLottieOptions['animationData']) {\n this.sendQuery(['loadFromData', data, this.width, this.height, this.toneIndex, this.color !== undefined/* , this.canvas.transferControlToOffscreen() */]);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n this.rafId = undefined;\n }\n // window.cancelAnimationFrame(this.rafId);\n }\n\n private resetCurrentFrame() {\n return this.curFrame = this.initFrame ?? (this.direction === 1 ? this.minFrame : this.maxFrame);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n const curFrame = this.resetCurrentFrame();\n if(renderFirstFrame) {\n this.requestFrame(curFrame);\n // this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public setSpeed(speed: number) {\n if(this.speed === speed) {\n return;\n }\n\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n if(this.direction === direction) {\n return;\n }\n\n this.direction = direction;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n this.pause();\n this.sendQuery(['destroy']);\n if(this.cacheName) RLottiePlayer.CACHE.releaseCache(this.cacheName);\n this.dispatchEvent('destroy');\n this.cleanup();\n }\n\n private applyColor(frame: Uint8ClampedArray) {\n const [r, g, b] = this.color;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] !== 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n }\n }\n }\n\n private applyInversing(frame: Uint8ClampedArray) {\n const [r, g, b] = this.inverseColor;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] === 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n frame[i + 3] = 255;\n } else {\n frame[i + 3] = 0;\n }\n }\n }\n\n public renderFrame2(frame: Uint8ClampedArray | HTMLCanvasElement | ImageBitmap, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(frame instanceof Uint8ClampedArray) {\n if(this.color) {\n this.applyColor(frame);\n }\n\n if(this.inverseColor) {\n this.applyInversing(frame);\n }\n\n this.imageData.data.set(frame);\n }\n\n // this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n this.contexts.forEach((context, idx) => {\n let cachedSource: HTMLCanvasElement | ImageBitmap = this.cache.framesNew.get(frameNo);\n if(!(frame instanceof Uint8ClampedArray)) {\n cachedSource = frame;\n } else if(idx > 0) {\n cachedSource = this.canvas[0];\n }\n\n if(!cachedSource) {\n // console.log('drawing from data');\n const c = document.createElement('canvas');\n c.width = context.canvas.width;\n c.height = context.canvas.height;\n c.getContext('2d').putImageData(this.imageData, 0, 0);\n this.cache.framesNew.set(frameNo, c);\n cachedSource = c;\n }\n\n if(this.overrideRender && this.renderedFirstFrame) {\n this.overrideRender(cachedSource || this.imageData);\n } else if(cachedSource) {\n // console.log('drawing from canvas');\n context.clearRect(0, 0, cachedSource.width, cachedSource.height);\n context.drawImage(cachedSource, 0, 0);\n } else {\n context.putImageData(this.imageData, 0, 0);\n }\n\n if(!this.renderedFirstFrame) {\n this.renderedFirstFrame = true;\n }\n });\n\n this.dispatchEvent('enterFrame', frameNo);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n }\n }\n\n public renderFrame(frame: Parameters[0], frameNo: number) {\n const canCacheFrame = this.cachingDelta && (frameNo % this.cachingDelta || !frameNo);\n if(canCacheFrame) {\n if(frame instanceof Uint8ClampedArray && !this.cache.frames.has(frameNo)) {\n this.cache.frames.set(frameNo, new Uint8ClampedArray(frame));// frame;\n } else if(IS_IMAGE_BITMAP_SUPPORTED && frame instanceof ImageBitmap && !this.cache.framesNew.has(frameNo)) {\n this.cache.framesNew.set(frameNo, frame);\n }\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n\n if(delta < 0) {\n const timeout = this.frInterval > -delta ? -delta % this.frInterval : this.frInterval;\n if(this.rafId) clearTimeout(this.rafId);\n this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, timeout);\n // await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n return;\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.cache.frames.get(frameNo);\n const frameNew = this.cache.framesNew.get(frameNo);\n if(frameNew) {\n this.renderFrame(frameNew, frameNo);\n } else if(frame) {\n this.renderFrame(frame, frameNo);\n } else {\n if(this.clamped && !this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n\n this.sendQuery(['renderFrame', frameNo], this.clamped ? [this.clamped.buffer] : undefined);\n }\n }\n\n private onLap() {\n if(++this.playedTimes === this.loop) {\n this.loop = false;\n }\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n\n return true;\n }\n\n private mainLoopForwards() {\n const {skipDelta, maxFrame} = this;\n const frame = (this.curFrame + skipDelta) > maxFrame ? this.curFrame = (this.loop ? this.minFrame : this.maxFrame) : this.curFrame += skipDelta;\n // console.log('mainLoopForwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + skipDelta) > maxFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n private mainLoopBackwards() {\n const {skipDelta, minFrame} = this;\n const frame = (this.curFrame - skipDelta) < minFrame ? this.curFrame = (this.loop ? this.maxFrame : this.minFrame) : this.curFrame -= skipDelta;\n // console.log('mainLoopBackwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - skipDelta) < minFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n public setMainLoop() {\n // window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n this.rafId = undefined;\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n // console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n // this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n // setTimeout(() => {\n // this.addListener('enterFrame', this.frameListener);\n // }, 0);\n\n if(this.frameListener) {\n const lastResult = this.listenerResults.enterFrame;\n if(lastResult !== undefined) {\n this.frameListener(this.curFrame);\n }\n }\n\n // this.mainLoop(method);\n // this.r(method);\n // method();\n }\n\n public playPart(options: {\n from: number,\n to: number,\n callback?: () => void\n }) {\n this.pause();\n\n const {from, to, callback} = options;\n this.curFrame = from - 1;\n\n return this.playToFrame({\n frame: to,\n direction: to > from ? 1 : -1,\n callback\n });\n }\n\n public playToFrame(options: {\n frame: number,\n speed?: number,\n direction?: number,\n callback?: () => void\n }) {\n this.pause();\n\n const {frame, speed, callback, direction} = options;\n this.setDirection(direction === undefined ? this.curFrame > frame ? -1 : 1 : direction);\n speed !== undefined && this.setSpeed(speed);\n\n const bounds = [this.curFrame, frame];\n if(this.direction === -1) bounds.reverse();\n\n this.loop = false;\n this.setMinMax(bounds[0], bounds[1]);\n\n if(this.playToFrameOnFrameCallback) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n if(callback) {\n this.playToFrameOnFrameCallback = (frameNo: number) => {\n if(frameNo === frame) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n callback();\n }\n };\n\n this.addEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n this.play();\n }\n\n public setColor(color: RLottieColor, renderIfPaused: boolean) {\n this.color = color;\n\n if(renderIfPaused && this.paused) {\n this.renderFrame2(this.imageData.data, this.curFrame);\n }\n }\n\n public setInverseColor(color: RLottieColor) {\n this.inverseColor = color;\n }\n\n private setMinMax(minFrame = 0, maxFrame = this.frameCount - 1) {\n this.minFrame = minFrame;\n this.maxFrame = maxFrame;\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.frameCount = frameCount;\n this.fps = fps;\n this.setMinMax();\n if(this.initFrame !== undefined) {\n this.initFrame = clamp(this.initFrame, this.minFrame, this.maxFrame);\n }\n\n const curFrame = this.resetCurrentFrame();\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n // this.sendQuery('renderFrame', 0);\n\n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс,\n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс.\n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n\n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n });\n }\n }\n\n console.timeEnd('cache' + this.reqId); */\n // console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n !this.skipFirstFrameRendering && this.requestFrame(curFrame);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n if(!this.canvas[0].parentNode && this.el && !this.overrideRender) {\n this.el.forEach((container, idx) => container.append(this.canvas[idx]));\n }\n\n // console.log('enterFrame firstFrame');\n\n // let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused || !this.currentMethod) {\n return;\n }\n\n const time = Date.now();\n // console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n // lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n // setInterval(this.frameListener, this.frInterval);\n\n // ! fix autoplaying since there will be no animationIntersector for it\n if(this.group === 'none' && this.autoplay) {\n this.play();\n }\n }, {once: true});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Page from './page';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport {horizontalMenu} from '../components/horizontalMenu';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\nimport whichChild from '../helpers/dom/whichChild';\n\nclass PagesManager {\n private pageId = -1;\n private page: Page;\n\n private selectTab: ReturnType;\n public pagesDiv: HTMLDivElement;\n public scrollableDiv: HTMLElement;\n\n constructor() {\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\n if(this.page?.onShown) {\n this.page.onShown();\n }\n });\n }\n\n public setPage(page: Page) {\n if(page.isAuthPage) {\n this.pagesDiv.style.display = '';\n\n const id = whichChild(page.pageEl);\n if(this.pageId === id) return;\n\n this.selectTab(id);\n\n if(this.pageId !== -1 && id > 1) {\n lottieLoader.loadLottieWorkers();\n }\n\n\n this.pageId = id;\n\n if(this.scrollableDiv) {\n fastSmoothScroll({\n container: this.scrollableDiv,\n element: this.scrollableDiv.firstElementChild as HTMLElement,\n position: 'start'\n });\n }\n } else {\n this.pagesDiv.style.display = 'none';\n page.pageEl.style.display = '';\n\n this.pageId = -1;\n }\n\n this.page = page;\n }\n}\n\nconst pagesManager = new PagesManager();\nMOUNT_CLASS_TO.pagesManager = pagesManager;\nexport default pagesManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pagesManager from './pagesManager';\n\nexport default class Page {\n public pageEl: HTMLDivElement;\n private installed = false;\n\n constructor(\n className: string,\n public isAuthPage: boolean,\n private onFirstMount?: (...args: any[]) => Promise | void,\n private onMount?: (...args: any[]) => Promise | void,\n public onShown?: () => void\n ) {\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\n }\n\n public async mount(...args: any[]) {\n // this.pageEl.style.display = '';\n\n if(this.onMount) {\n const res = this.onMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n }\n\n if(!this.installed) {\n if(this.onFirstMount) {\n try {\n const res = this.onFirstMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n } catch(err) {\n console.error('PAGE MOUNT ERROR:', err);\n }\n }\n\n this.installed = true;\n }\n\n pagesManager.setPage(this);\n }\n}\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\n\nexport function encodeEmoji(emojiText: string) {\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\n return codepoints;\n}\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\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\n\nexport function toCodePoints(unicodeSurrogates: string): Array {\n const points = [];\n let char = 0;\n let previous = 0;\n let i = 0;\n while(i < unicodeSurrogates.length) {\n char = unicodeSurrogates.charCodeAt(i++);\n if(previous) {\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\n previous = 0;\n } else if(char > 0xd800 && char <= 0xdbff) {\n previous = char;\n } else {\n points.push(char.toString(16));\n }\n }\n\n if(points.length && points[0].length === 2) {\n points[0] = '00' + points[0];\n }\n\n return points;\n}\n\nexport function getEmojiToneIndex(input: string) {\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\n}\n\nconst VIRTUAL_COUNTRIES_EMOJIS: Map = new Map([\n ['FT', '🏴‍☠']\n]);\n\nexport function getCountryEmoji(iso2: string) {\n return VIRTUAL_COUNTRIES_EMOJIS.get(iso2) ??\n String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\n}\n\nexport function emojiFromCodePoints(codePoints: string) {\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n}\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Recorder=t():e.Recorder=t()}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\"a\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\"\",o(o.s=0)}([function(e,t,o){\"use strict\";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error(\"Recording is not supported in this browser\");e||(e={}),this.state=\"inactive\",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:\"encoderWorker.min.js\",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if(\"recording\"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case\"ready\":t();break;case\"page\":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case\"done\":this.encoder.removeEventListener(\"message\",i),this.finish()}};this.encoder.addEventListener(\"message\",i),this.encoder.postMessage(Object.assign({command:\"init\",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if(\"recording\"===this.state){if(this.state=\"paused\",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{\"flushed\"===o.data.message&&(t.removeEventListener(\"message\",i),this.onpause(),e())};t.addEventListener(\"message\",i),t.postMessage({command:\"flush\"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){\"paused\"===this.state&&(this.state=\"recording\",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if(\"inactive\"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state=\"recording\",this.onstart(),this.encoder.postMessage({command:\"getHeaderPages\"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if(\"inactive\"!==this.state){this.state=\"inactive\",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{\"done\"===i.data.message&&(e.removeEventListener(\"message\",o),t())};e.addEventListener(\"message\",o),e.postMessage({command:\"done\"}),this.config.reuseWorker||e.postMessage({command:\"close\"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){\"inactive\"===this.state&&this.encoder&&(this.encoder.postMessage({command:\"close\"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(o=window)}e.exports=o}])}));","/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nvar NEWTON_ITERATIONS = 4;\nvar NEWTON_MIN_SLOPE = 0.001;\nvar SUBDIVISION_PRECISION = 0.0000001;\nvar SUBDIVISION_MAX_ITERATIONS = 10;\n\nvar kSplineTableSize = 11;\nvar kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nvar float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\nfunction B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\nfunction C (aA1) { return 3.0 * aA1; }\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }\n\nfunction binarySubdivide (aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n}\n\nfunction LinearEasing (x) {\n return x;\n}\n\nmodule.exports = function bezier (mX1, mY1, mX2, mY2) {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n\n function getTForX (aX) {\n var intervalStart = 0.0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n\n var initialSlope = getSlope(guessForT, mX1, mX2);\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n }\n\n return function BezierEasing (x) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0 || x === 1) {\n return x;\n }\n return calcBezier(getTForX(x), mY1, mY2);\n };\n};\n"],"names":["animationIntersector","constructor","this","observer","IntersectionObserver","entries","entry","target","group","byGroups","intersectionLockedGroups","animation","find","p","el","isIntersecting","visible","add","checkAnimation","delete","_animation","clearCache","Set","overrideIdleGroups","byPlayer","Map","lockedGroups","onlyOnePlayableGroup","videosLocked","doc","type","checkAnimations2","idle","setOverrideIdleGroup","override","getAnimations","element","found","player","push","removeAnimation","remove","HTMLVideoElement","IS_SAFARI","setTimeout","src","load","length","unobserve","removeAnimationByPlayer","item","get","addAnimation","observeElement","controlled","has","canvas","placeholder","HTMLElement","onClean","loop","observe","set","checkAnimations","blurred","destroy","imitateIntersection","undefined","groups","Object","keys","animations","paused","pause","autoplay","play","getOnlyOnePlayableGroup","setOnlyOnePlayableGroup","lockGroup","unlockGroup","refreshGroup","forEach","lockIntersectionGroup","unlockIntersectionGroup","toggleIntersectionGroup","lock","SHOULD_USE_SAFARI_FIX","navigator","userAgent","match","err","AppMediaPlaybackController","media","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","playbackRates","voice","video","audio","seekBackward","details","playingMedia","currentTime","Math","max","seekOffset","seekForward","min","duration","seekTo","seekTime","onMediaDocumentLoad","managers","appDocsManager","getDoc","docId","supportsStreaming","handleSafariStreamable","cacheContext","thumbsStorage","getCacheContext","url","playbackRate","id","size","onPlay","e","peerId","mid","pip","message","getMessageByMedia","stop","setMedia","verify","listLoader","current","getCurrent","jumpLength","withOtherSide","previous","getPrevious","idx","findIndex","getNext","go","setTargets","dispatchEvent","getPlayingDetails","pauseMediaInOtherTabs","onPause","onEnded","isTrusted","lockedSwitchers","round","next","toggle","clean","s","isScheduled","storage","playingMediaType","playItem","searchContext","getMedia","resolveWaitingForLoadMedia","dispatchJump","goRound","browserPlay","bindBrowserCallback","browserPause","browserStop","browserSeekBackward","browserSeekForward","browserSeekTo","browserNext","browserPrevious","seekToStart","construct","container","document","createElement","style","cssText","body","append","mediaSession","actions","seekbackward","seekforward","seekto","previoustrack","nexttrack","action","setActionHandler","console","warn","skipMediaPlayEvent","properties","key","_key","value","dispatchPlaybackParams","defineProperties","getPlaybackParams","volume","muted","setPlaybackParams","params","_volume","_muted","_playbackRate","_loop","_round","addMedia","autoload","pFlags","is_scheduled","setAttribute","addEventListener","media_unread","fromId","appMessagesManager","readMessages","once","deferred","resolve","w","waitingStorage","then","promise","isSafariBuffering","safariBuffering","setSafariBuffering","setNewMediadata","pictureInPictureElement","artwork","isVoice","title","artist","thumbs","bytes","sizes","h","thumb","appPeersManager","getPeerPhoto","plainText","onlyFirstName","attribute","attributes","_","file_name","performer","IS_APPLE","metadata","MediaMetadata","setCurrentMediadata","playbackParams","cb","willBePlayed","willBePlayedMedia","setSearchContext","context","getSearchContext","prev","reset","loadCount","loadWhenLeft","processItem","onJump","older","onEmptied","reverse","folderId","getPlaybackMediaTypeFromMessage","mediaType","setSingleMedia","wasPlaying","toggleSwitchers","playPaused","removeEventListener","enabled","setPictureInPicture","listenerSetter","removeAll","appMediaPlaybackController","AppMediaViewer","captionTimeout","super","isForDocument","inputFilter","isMediaCompatibleForDocumentViewer","onPrevClick","openMedia","getMessageByPeer","onNextClick","onDeleteClick","content","close","onForwardClick","onAuthorClick","Number","MAX_SAFE_INTEGER","threadId","tab","lastMsgId","onDownloadClick","queueId","caption","classList","setCaptionTimeout","clearTimeout","window","onAdditionalScroll","wholeDiv","buttons","btnMenuForward","icon","text","onClick","btnMenuDownload","btnMenuDelete","setBtnMenuToggle","setListeners","forward","author","onCaptionClick","a","spoiler","HTMLAnchorElement","contains","onclick","getAttribute","includes","capture","click","getScheduledMessageByPeer","setCaption","html","entities","totalEntities","firstElementChild","fromRight","prevTargets","nextTargets","setMoverPromise","fwd_from","from_name","noForwards","isServiceMessage","cantForwardMessage","canForward","cantDownloadMessage","download","canDeleteMessage","hide","button","_openMedia","date","static","mime_type","VideoPlayer","streamable","onPlaybackRackMenuToggle","onPip","onPipClose","wrapper","setup","canHideControls","playbackRateButton","showOnLeaveToClassName","ignoreClickClassName","parentNode","insertBefore","appendChild","skin","stylePlayer","controls","querySelector","progress","prepend","catch","name","finally","initDuration","buildControls","timeDuration","insertAdjacentHTML","pipButton","querySelectorAll","fullScreenButton","timeElapsed","textContent","toHHMMSS","volumeSelector","leftControls","btn","parentElement","Array","from","togglePlay","requestPictureInPicture","visibility","debounceTime","debouncedPip","debounce","listener","timeout","overlayCounter","code","good","toggleFullScreen","altKey","nextIdx","PLAYBACK_RATES","indexOf","cancelEvent","onFullScreen","bind","hideControls","showControls","setPlaybackRateIcon","onMediaLoad","IS_MOBILE","pictureInPictureEnabled","map","rate","regularText","btnMenu","onOpen","onClose","PLAYBACK_RATES_ICONS","className","IS_APPLE_MOBILE","webkitEnterFullscreen","enterFullscreen","isFull","cleanup","removeListeners","MEDIA_VIEWER_CLASSNAME","AppMediaViewerBase","topButtons","tempId","preloader","preloaderStreamable","isFirstOpen","pageEl","getElementById","zoomElements","zoomSwipeStartX","zoomSwipeStartY","zoomSwipeX","zoomSwipeY","setZoomValue","rangeSelector","moversContainer","transform","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","tagName","highlightSwitchersTimeout","isZooming","mover","classNames","findUpClassName","onKeyDown","ctrlKeyDown","changeZoom","ctrlKey","metaKey","onKeyUp","onWheel","scrollingUp","deltaY","rootScope","log","logger","cancelable","lazyLoadQueue","overlaysDiv","mainDiv","topbar","topbarLeft","onlyMobile","authorRight","avatarEl","nameEl","buttonsDiv","concat","noRipple","zoom","step","withTransition","setHandlers","onScrub","onMouseUp","main","innerHTML","onLoadedMore","setNewMover","moveLength","onSwipe","xDiff","yDiff","abs","windowSize","verifyTouchTarget","evt","enable","isVisible","mousedown","zoomValue","setProgress","videoPlayer","lockControls","zoomSwipeHandler","lastDiffX","lastDiffY","multiplier","onFirstSwipe","onReset","cursor","addProgress","btnMenuToggle","buttonOptions","direction","Promise","reject","navigationItem","appNavigationController","clear","setMoverToTarget","onAnimationEnd","appMediaViewer","removeGlobalListeners","toggleOverlay","active","toggleGlobalListeners","setGlobalListeners","passive","closing","removeCenterFromMover","wasActive","delay","realParent","rect","getBoundingClientRect","SVGImageElement","SVGForeignObjectElement","left","needOpacity","overflowElement","visibleRect","getVisibleRect","overflow","vertical","horizontal","containerRect","top","aspecter","width","HTMLImageElement","setFullAspect","offsetLeft","height","scaleX","scaleY","borderRadius","getComputedStyle","getPropertyValue","brSplitted","str","splitted","split","i","fillPropertyValue","r","parseInt","join","willBeLeft","willBeTop","path","opacity","isOut","ret","isFulfilled","isRejected","SVGSVGElement","sizeTailPath","toggleWholeActive","mediaElement","selector","queryFrom","matches","elements","pop","getContext","naturalWidth","naturalHeight","videoWidth","videoHeight","HTMLCanvasElement","drawImage","image","Image","createVideo","clipId","dataset","newClipId","newSvg","createElementNS","setAttributeNS","outerHTML","replace","lastElementChild","defs","use","SVGUseElement","d","getAttributeNS","x","y","sX","sY","br","v","generatePathData","foreignObject","renderImageFromUrl","display","proportion","upscale","start","Date","now","diff","_br","moveTheMover","toLeft","windowW","newTransform","p1","newMover","updateMediaSource","toLowerCase","setAuthorInfo","timestamp","isPeerId","wrapTitlePromise","dialog","wrapEmojiText","oldAvatar","newAvatar","cloneNode","all","updateWithOptions","peerTitle","replaceContent","replaceWith","setAuthorPromise","isDocument","isVideo","useContainerAsTarget","IS_MOBILE_SAFARI","onPop","canAnimate","maxWidth","padding","windowH","mediaSizes","maxHeight","thumbPromise","setAttachmentSize","photoSize","img","downloaded","gotThumb","getStrippedThumbIfNeeded","loadPromise","useController","div","moverVideo","canPlayThrough","createPlayer","ckin","overlay","open","otherMediaViewer","releaseSingleMedia","show","readyState","HAVE_FUTURE_DATA","attach","attachCanPlay","detach","loading","networkState","NETWORK_LOADING","isntEnoughData","unshift","appDownloadManager","toast","langPackKey","error","cancellablePromise","attachPromise","imgs","haveImage","setManual","onPopState","hash","location","state","debug","isPossibleSwipe","currentHash","overriddenHash","overrideHash","onHashChange","pushState","navigations","manual","handleItem","onEscape","back","onTouchStart","touches","options","history","scrollRestoration","replaceState","pushItem","noBlurOnPop","findItemByType","index","backByItem","splice","onItemAdded","noHistory","unshiftItem","spliceItems","items","origin","pathname","search","removeItem","removeByType","single","SearchGroup","clearable","clickable","autonomous","onFound","noIcons","list","setActive","childElementCount","AppSearch","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","scrollable","messages","setVirtualContainer","onChange","searchMore","onScrolledBottom","trim","beginSearch","inputField","input","focus","maxId","limit","res","count","shift","searchGroup","avatarSize","meAsSaved","SearchContextMenu","attachTo","searchSuper","onGotoClick","appImManager","selection","isSelecting","selectionForwardBtn","onSelectClick","toggleByElement","onClearSelectionClick","cancelSelection","selectionDeleteBtn","attachContextMenuListener","callback","init","MouseEvent","preventDefault","cancelBubble","toPeerId","isSelected","isMidSelected","withSelection","positionMenu","contextMenuController","AppSearchSuper","tabs","prevTabId","middleware","historyStorage","usedFromHistory","loadMutex","nextRates","loadPromises","loaded","loadedChats","firstLoad","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","showSender","onTransitionStart","onTransitionEnd","safeAssign","searchContextMenu","navScrollableContainer","navScrollable","nav","tabsMenu","mediaTab","mediaTabs","menuTab","span","ripple","unlockScroll","tabsContainer","swipeHandler","handleTabSwipe","prevId","selectTab","children","onTouchMove","lockers","lockTouchScroll","contentTab","searchGroupMedia","canLoadMediaTab","horizontalMenu","tabContent","animate","skipScroll","scrollIntoViewNew","position","startCallback","scrollStartCallback","newMediaTab","onChangeTab","fromMediaTab","offsetTop","scrollTop","scroll","scrollHeight","rect2","onScroll","onMediaClick","targetClassName","mediaSpoiler","event","targets","containerEl","copySearchContext","slice","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","unlockAndRefresh","filterMessagesByType","filterMessagesByInputFilter","processEmptyFilter","dialogElement","appDialogsManager","setLastMessagePromise","lastMessage","highlightWord","noop","processPhotoVideoFilter","promises","getMediaFromMessage","wrapped","choosePhotoSize","boxWidth","boxHeight","onlyPreview","withoutPreloader","noPlayButton","photo","noBlur","animationGroup","multiply","images","full","filter","Boolean","processDocumentFilter","withTime","fontWeight","voiceAsMusic","autoDownloadSize","processUrlFilter","webPage","webpage","entity","display_url","sliced","offset","matchUrl","same","URL","hostname","description","previewDiv","setInnerHTML","wrapAbbreviation","subtitleFragment","htmlToDocumentFragment","wrapRichText","innerText","decodeURIComponent","href","firstChild","wrapPlainText","row","titleRight","subtitle","havePadding","applyMediaElement","performSearchResult","elemsToAppend","sharedMediaDiv","processCallback","results","awaited","method","monthContainer","getMonthContainerByTimestamp","toggleElementCheckbox","afterPerforming","parent","child","loadChats","renderedPeerIds","inputMessagesFilterEmpty","setResults","showMembersCount","dom","peer","getPeer","participants_count","participants","regExp","RegExp","escapeRegExp","cleanSearchText","titleSpan","lastMessageSpan","getChatMembersString","toChatId","username","getPeerUsername","user","appUsersManager","getUser","phone","formatPhoneNumber","formatted","onLoad","arg","getContactsPeerIds","contacts","searchContacts","my_results","globalContacts","showMore","intlElement","isShort","update","dialogsStorage","getDialogs","offsetIndex","filterId","dialogs","minDate","renderRecentSearch","recent","replaceChildren","recentSearch","isUser","getUserStatusString","toUserId","getTopPeers","peers","people","subtitleEl","loadMembers","renderParticipants","membersList","rippleEnabled","li","findUpTag","DIALOG_LIST_ELEMENT_TAG","participant","getParticipantPeerId","isAnyChat","deleted","appChatsManager","isChannel","LOAD_COUNT","appProfileManager","getChannelParticipants","getChatFull","chatFull","loadType","justLoad","used","slicedLength","ids","notFilteredMessages","m","checkForTriggers","getSearch","nextRate","next_rate","loadFirstTime","filters","counters","canViewMembers","getSearchCounters","firstMediaTab","counter","c","membersTab","loadFirstTimePromise","toLoad","t","findAndSplice","setHours","setDate","dateTimestamp","getTime","containers","month","getFullYear","year","dateElement","haveTimestamps","getObjectKeysAndSort","positionElementByIndex","chatId","isBroadcast","hasRights","isForum","cleanScrollPositions","cleanupHTML","goFirst","putPreloader","empty","newInputFilter","copy","setQuery","maxDate","AppSelectPeers","chatsContainer","selected","freezed","loadedWhat","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","design","onInput","cachedContacts","getMoreResults","f","renderResultsFunc","renderResults","peerIds","splitUp","notRendered","filterPeerTypeBy","section","innerContainer","topContainer","selectedContainer","selectedScrollable","sectionNameLangPackKey","noShadow","checkbox","checked","debouncedInput","appendTo","getResultsPromise","onFirstRender","renderSaved","testSelfSearch","getTempId","getMoreDialogs","archived","pageCount","skipMigrated","newOffsetIndex","chatRightsAction","filterByRights","isEnd","getMoreContacts","isGlobalSearch","searchResult","resultPeerIds","arr","getMoreChannelParticipants","channelParticipants","q","getMoreSomething","call","isNonContactUser","checkboxField","label","isDialog","insertAdjacentElement","offsetWidth","getSelected","addInitial","values","requestAnimationFrame","forceDirection","constructDownloadPreloader","tryAgainOnFail","circle","totalLength","mids","attr","elem","findMediaTargets","anchor","anchorMid","isBubbles","justAudioSelector","selectors","prefix","mediaItems","AudioElement","render","isRealVoice","isOutgoing","is_outgoing","uploadingFileName","durationStr","downloadDiv","onTypeLoad","audioEl","out","waveform","Uint8Array","valueCount","result","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","svg","svgContainer","availW","barHeightMax","minW","maxW","normValue","wfSize","barCount","maxValue","maxDelta","barX","sumI","bar_value","barWidth","createWaveformBars","fakeSvgContainer","waveformContainer","timeDiv","onTimeUpdate","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","scrub","offsetX","targetTouches","pageX","scrubTime","wrapVoiceMessage","descriptionEl","audioAttribute","parts","titleEl","middleEllipsisEl","fontSize","sizeType","subtitleDiv","launched","progressLine","lastChild","wrapAudio","audioTimeDiv","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","hadSearchContext","useSearch","autoDownload","shouldPlay","onDownloadInit","pauseListener","notifyAll","done","total","cancel","Error","playListener","setDownloadFunction","disconnectedCallback","isConnected","customElements","define","AvatarListLoader","loadMore","photoId","appPhotosManager","getUserPhotos","photos","loadedAllUp","AppMediaViewerAvatar","getPhoto","onAvatarUpdate","openAvatarViewer","getTarget","hadMessage","isObject","data","believeMe","seen","getAvatarQueueKey","AvatarElement","addedToQueue","middlewareHelper","attachClickEvent","updateOptions","wasPeerId","wasThreadId","newPeerId","wrapOptions","create","onlyThumb","putPhoto","isBig","AvatarEdit","clearRect","Button","asLink","asDiv","rippleSquare","disabled","ButtonMenuItem","separator","iconDoc","noCheckboxClickListener","textElement","textArgs","iconElement","noFadeIn","processUrl","fetch","response","color","DOMParser","parseFromString","stroke","strokeWidth","keepOpen","menu","checkForClose","multiline","ButtonMenuSync","b","ButtonMenu","ButtonMenuToggleHandler","openedMenu","ButtonMenuToggle","attachListenerSetter","onOpenBefore","onCloseAfter","closeTimeout","filteredButtons","_element","ChatBackgroundGradientRenderer","_width","_height","_tails","_scrollTails","_curve","_positions","_phases","_animatingToNextPosition","_scrollDelta","_onWheelRAF","drawOnWheel","floor","ceil","changeTailAndDraw","drawNextPositionAnimated","getProgress","transitionValue","nextPositionTail","_nextPositionTail","_nextPositionTails","_nextPositionLeft","frames","_frames","drawImageData","_incrementalCurve","hexToRgb","hex","g","getPositions","positions","getNextPositions","phase","curveMax","curve","pos","distances","nextPos","distance","curPosition","tail","changeTail","_tail","_phase","curPos","drawGradient","getGradientImageData","_hctx","createImageData","pixels","centerDistanceY","centerDistanceY2","centerDistanceX","swirlFactor","sqrt","theta","sinTheta","sin","cosTheta","cos","pixelX","pixelY","distanceSum","_colors","distanceX","distanceY","putImageData","_ctx","_hc","cancelAnimationFrame","colors","alpha","_canvas","fillStyle","fillRect","toNextPosition","tails","nextPhaseOnIdx","inc","toFixed","curves","last","scrollAnimate","createCanvas","gradientRenderer","accumulateMapSet","reduce","acc","AppSelection","selectedMids","onMouseDown","targetLookupClassName","verifyTarget","selecting","firstTarget","processElement","checkBetween","isInDOM","seenSet","seenLength","findUpAsChild","elementsBetween","getElementsBetween","toggleByMid","canceledSelection","onMouseMove","getElementFromTarget","verifyMouseMoveTarget","removeManual","listenElement","documentListenerOptions","first","firstRect","lastRect","isHigher","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","lastIndex","doNotAnimate","onCancelSelection","toggleSelection","navigationType","random","attachListeners","selectedText","getSelection","toString","createRange","verifyTouchLongPress","isElementShouldBeSelected","appendCheckbox","hasCheckbox","getCheckboxInputFromElement","forwards","updateContainer","forceSelection","cantForward","cantDelete","cantSend","storageKey","cantForwardDeleteMids","onUpdateContainer","toggleCheckboxes","wasSelecting","blurActiveElement","toggleResult","onToggleSelection","updateElementSelection","toggleMid","unselect","deleteSelectedMids","SearchSelection","selectionCountEl","selectionGotoBtn","selectionContainer","BASE_CLASS","btnCancel","attachClickOptions","obj","fromPeerId","sort","isPrivate","transitionElement","ChatSelection","chat","bubbles","recording","bubble","canSelectBubble","isGroupedBubbleSelected","getMidsFromGroupContainer","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","mounted","getMountedBubble","needTranslateX","widthFrom","widthTo","center","selectionInputWrapper","selectionSendNowBtn","selectionLeft","selectionRight","translateButtonsX","right","inputContainer","toggleAttribute","skippedMids","isGrouped","groupedCheckboxInput","CheckboxField","restriction","toggleDisability","stateKey","stateValues","stateValue","setValueSilently","box","checkSvg","bg","border","withRipple","withHover","Event","disable","CodeInputField","assign","autocomplete","lastLength","setLabel","onFill","confirmationPopup","checkboxes","cancelButton","isCancel","countries","setCountries","country","hidden","default_name","localeCompare","VIRTUAL_COUNTRIES","CountryInputField","hidePicker","hideTimeout","selectWrapper","selectCountryByTarget","defaultName","phoneCodeEl","phoneCode","countryCode","simulateInputEvent","lastCountrySelected","lastCountryCodeSelected","country_codes","_countryCode","country_code","onCountryChange","liMap","arrowDown","selectList","initSelect","noPhoneCodes","iso2","emoji","liArr","Infinity","spanEmoji","select","margin","mouseDownHandlerAttached","onKeyPress","_value","names","abbr","word","test","blur","selectCountryByIso2","countryName","DotRenderer","dpr","devicePixelRatio","prepare","dots","generateDot","adding","radius","Path2D","arc","PI","mOpacity","draw","dot","addOpacity","easedOpacity","globalAlpha","fill","renderFirstFrame","dotRenderer","EditPeer","_disabled","isChanged","uploadAvatar","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","nextBtn","withoutAvatar","avatarElem","doNotEditAvatar","avatarEdit","_upload","popupOptions","lockWithPromise","unlockOnSuccess","GifsTab","gifsContainer","EmoticonsDropdown","masonry","EMOTICONSSTICKERGROUP","getGifs","docs","processInvisibleDiv","ANIMATIONGROUP","AppGifsTab","nextOffset","loadedAll","onGifsClick","fileId","inputSearch","gifsDiv","onCloseAfterTimeout","newSearch","gifBotPeerId","resolveUsername","appInlineBotsManager","getInlineResults","next_offset","AppStickersTab","setsDiv","listenTo","sticker","stickerSet","access_hash","appStickersManager","getStickerSet","toggleStickerSet","changed","installed_date","removeAttribute","renderFeatured","renderSet","header","countDiv","stickersDiv","stickerDiv","documents","withLock","getFeaturedStickers","coveredSets","filterRendered","forEachReverse","covered","searchStickerSets","scrollOptions","forceDuration","transitionFunction","ignoreOutClickClassName","tabId","onSelectTabClick","searchButton","emojiTab","deleteBtn","scrollTo","checkRights","tabsEl","tabsElements","canSendStickers","canSendGifs","canSendToPeer","stickersTab","gifsTab","whichChild","savedRange","getGoodRange","onOpened","unlock","refresh","onClosed","range","getSavedRange","setStartAfter","newRange","cloneRange","collapsed","node","endContainer","endOffset","newStartNode","previousSibling","nodeType","TEXT_NODE","nodeValue","ELEMENT_NODE","isContentEditable","selectNode","newOffset","setStart","deleteContents","HIDE_EMOJI_TAB","INIT_TAB_ID","lastMouseMoveEvent","mouseMoveEventAttached","isActive","onMouseOut","getElement","axis","clearDraft","silent","emoticonsDropdown","forceClose","addLazyLoadQueueRepeat","divs","intersector","getVisible","clearVisible","sel","rangeCount","activeElement","getRangeAt","menuOnClick","emoticons","menuScroll","prevTab","jumpedTo","getElementPosition","elementPosition","scrollToTab","scrollingToContent","stickyIntersector","stuck","getCategoryByContainer","which","getCategoryByMenuTab","additionalOffset","setActiveStatic","local","scrollLeft","clientWidth","sendDocId","loadedURLs","appendEmoji","unify","kek","getEmojiEntityFromEmoji","wrapSingleEmoji","fixEmoji","getEmojiFromElement","superEmoji","stickerEmoji","EMOJI_RECENT_ID","EMOJI_RECENT_CATEGORY","CUSTOM_EMOJI_RECENT_CATEGORY","EMOJI_CATEGORIES","sorted","category","order","EMOJI_ELEMENT_SIZE","EmojiTab","onCategoryVisibility","categoriesMap","renderer","newChildren","customEmojis","customEmojiElement","clearCanvas","onContentClick","isStandalone","langPackArguments","activeElements","menuInnerScroll","intersectionOptions","root","categoriesIntersector","menuOnClickResult","innerScrollWrapper","preparedMap","noRegularEmoji","emojis","titleLangPackKey","createLocalCategory","unified","addEmojiToCategory","batch","appEmojiManager","getRecentEmojis","stickerSetId","getLocalStickerSet","getCustomEmojis","recentCustom","mainSet","sets","recentCategory","categories","recentCustomCategory","CUSTOM_EMOJI_RECENT_ID","createRendererForCategory","paddingTop","toggleLocalCategory","resizeCategories","after","renderStickerSet","toggleCustomCategory","postponedEvent","positionCategory","toggleRenderers","ignore","ignoreSettingDimensions","setDimensionsFromRect","deleteCategory","isCategoryVisible","forceRender","closeScrollTop","createCategory","menuTabPadding","stickerEmojiRaw","setCategoryItemsHeight","getCustomCategory","hasPremium","canSeeCustomCategory","customEmojiSize","activeEmoji","spliceExceed","onLocalCategoryUpdate","LazyLoadQueueRepeat","parallelLimit","onVisibilityChange","elementsMap","queueItem","wasSeen","queue","indexOfAndSplice","setProcessQueueTimeout","SuperStickerRenderer","regularLazyLoadQueue","animated","checkAnimationContainer","processVisible","processInvisible","renderSticker","observeAnimated","unobserveAnimated","StickersTabCategory","noMenuTab","getContainerSize","getElementMediaSize","gapX","gapY","containerWidth","elementSize","itemsPerRow","rows","minHeight","EmoticonsTabC","categoryItemsClassName","args","postponedEvents","categoriesByMenuTabMap","localCategories","menuWrapper","isLocal","observeStickyHeaderChanges","posItems","foundMenuScroll","posMenu","notMountedItems","notMountedMenus","itemsIdx","menuIdx","disconnect","StickersTab","setTyping","setFavedLimit","categoryAppendStickers","superStickerRenderer","clearCategoryItems","onCategoryStickers","stickers","deleteSticker","unshiftSticker","favedCategory","clearButton","titleLangKey","descriptionLangKey","langKey","clearRecentStickers","premiumCategory","apiManager","getLimit","getFavedStickersStickers","getRecentStickersStickers","getAllStickers","getPremiumStickers","isPremium","race","rendererLazyLoadQueue","faved","createStickersContextMenu","verifyRecent","unshiftRecentSticker","saveRecentSticker","deleteRecentSticker","generateDelimiter","delimiter","generateFakeIcon","isScam","LazyLoadQueueRepeat2","spliced","findAndSpliceAll","GifsMasonry","scrollPromise","processVisibleDiv","noInfo","noPreview","transitionTime","scrollableX","proxy","Proxy","apply","that","selectTarget","result1","canChange","mutateCallback","useStripe","indicator","currentIndicator","shiftLeft","scaleFactor","insertRichTextAsHTML","wrappingForPeerId","some","createCustomEmojiRendererForInput","fragment","wrapDraftText","customEmojiRenderer","contentEditable","richInputHandler","customEmojiElements","ces","documentFragmentToHTML","pre","getCaretPosNew","createTextNode","collapse","removeAllRanges","addRange","onBeforeInput","inputType","execCommand","removeExtraBOMs","findUpAttribute","noLinebreaks","originalEvent","clipboardData","getData","usePlainText","filterEntity","curChild","nextSibling","richValue","getRichValueWithCaret","lines","textLength","line","correctedText","entities2","parseEntities","mergeEntities","InputState","wrappingDraft","isSelectable","processCustomEmojisInInput","hasSet","connectedCallback","InputField","validate","maxLength","showLengthOn","canBeEdited","labelText","onInputCallbacks","isCollapsed","centerX","focusOnNext","clientX","isInputEmpty","inputMode","labelEl","showingLength","wasError","inputLength","isError","withLinebreaks","selectNodeContents","selectElementContents","labelOptions","fromSet","originalValue","isValidToChange","setDraftValue","setOriginalValue","setState","Valid","setError","InputSearch","prevValue","onClearClick","onClear","searchIcon","clearBtn","LazyLoadQueue","ignoreHeavyAnimation","getItem","addElement","LazyLoadQueueIntersector","inProcess","loadItem","intersectorTimeout","processQueue","MediaProgressLine","useTransform","progressRAF","onLoadedData","seek","setLoadProgress","onProgress","filledLoad","setSeekMax","buf","buffered","numRanges","nearestStart","end","percents","testQueue","pendingTest","setTestQueue","testElement","getElementWidth","mapped","firstTime","font","textWidth","elementWidth","newElementWidth","widthChanged","smallerText","smallerWidth","smallerTextLength","half","half1","substr","half2","MiddleEllipsisElement","PasswordMonkey","passwordInputField","needFrame","noCache","currentFrame","setSpeed","helpers","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","TrackingMonkey","playAnimation","frame","idleAnimation","PasswordInputHelpers","onVisibilityClick","toggleVisible","stealthy","tabIndex","PasswordInputField","PeerProfileAvatars","avatar","avatars","draggable","loadCallback","intersectionObserver","loadCallbacks","addTab","gradient","info","arrowPrevious","arrowNext","checkScrollTop","SWITCH_ZONE","freeze","_e","clickX","toRight","cancelNextClick","minX","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","loadNearestToTarget","setPeer","backLimit","filterChatPhotosMessages","chat_photo","generateFakeAvatarMessage","activeTab","photo_id","setText","PeerProfile","noDelimiter","bio","contextMenu","subtitleLangKey","isAnonymous","getUserPhone","link","notifications","togglePeerMute","appNotificationsManager","isPeerLocalMuted","respectType","setPeerStatus","setMoreDetails","n","fillUsername","userId","self","fillUserPhone","setAvatar","setPeerStatusInterval","setInterval","needClear","callbacks","useWhitespace","ignoreSelf","clearSetMoreDetailsTimeout","canBeDetailed","createAvatar","_setAvatar","isTopic","oldAvatars","getUsernamesAlso","usernames","also","anchorCopy","getPeerActiveUsernames","formatUserPhone","fillNotifications","notificationsRow","fillName","withIcons","fillRows","fillProfileElements","cleaned","_setMoreDetails","peerFull","getMiddlewarePromise","getServerMessageId","about","getChat","exportedInvite","exported_invite","address","setMoreDetailsTimeout","isPeerRestricted","acknowledged","getProfileByPeerId","setPromise","cached","middlewarePromise","makeError","clearInterval","generateTitleIcons","noVerifiedIcon","noFakeIcon","noPremiumIcon","verified","use2","generateVerifiedIcon","fake","scam","premium","emojiStatus","emoji_status","generatePremiumIcon","weakMap","WeakMap","PeerTitle","setOptions","setHasInner","hasInner","fromName","limitSymbols","topic","forumTopic","getTopicIconPromise","icons","topicIcon","getPeerTitle","withPremiumIcon","inner","createDocumentFragment","PopupAvatar","closable","withConfirm","cropper","crop","removeHandlers","h6","btnClose","cropContainer","file","files","readBlobAsDataURL","contents","onload","originalImage","cropComponent","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","overlayColor","CROPWIDTH","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","startMoving","resizing","keyHandler","imgZoom","bottom","newWidth","newHeight","clientHeight","String","fromCharCode","charCode","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","currentTouch","complete","btnConfirm","toBlob","blob","darkenCanvas","onCrop","postCanvas","ctx","PopupDeleteDialog","onSelect","peerTitleElement","getDialogType","callbackLeave","flush","leave","flushHistory","callbackDelete","titleArgs","descriptionArgs","isDanger","titleLangArgs","descriptionLangArgs","PopupDeleteMessages","onConfirm","revoke","deleteScheduledMessages","deleteMessages","isMegagroup","_hasRights","canRevoke","PopupForward","peerIdMids","peerTypes","forwardMessages","DEFAULT_APPEND_TO","appendPopupTo","onFullScreenChange","PopupElement","reAppend","titleRaw","MANAGERS","confirmShortcutIsSendShortcut","withoutOverlay","overlayClosable","attachScrollableListeners","btnConfirmOnEnter","buttonsEl","buttonsElements","langArgs","POPUPS","setClassOn","attachBorderListeners","onContentUpdate","popup","popupConstructor","ctor","addCancelButton","pin","descriptionPremium","descriptionLocked","folders","P","_a","limitPremium","isLocked","limitContainer","hint","free","setHintActive","showLimitPopup","appConfig","premium_purchase_blocked","times","ONE_HOUR","PopupMute","time","mutePeer","muteUntil","radioForm","PopupPeer","noTitle","o","original","nextElementSibling","PopupPickUser","PopupSendNow","sendScheduledMessages","ANIMATION_GROUP","PopupStickers","stickerSetInput","isEmojis","onStickersClick","updateAdded","stickersFooter","onStickerSetUpdate","_set","updateButton","loadStickerSet","createStickerSetElements","headerRow","buttonRight","added","itemsContainer","setsPromises","isArray","firstSet","isStickerPack","onSend","containersPromises","docIds","toggleStickerSets","isAdd","buttonAppend","installed","ProgressivePreloader","detached","isUpload","attachMethod","loadFunc","constructContainer","bold","constructDownloadIcon","downloadSvg","cancelSvg","previousElementSibling","func","startTime","onEnd","notify","elapsedTime","TRANSITION_TIME","addNotifyListener","useRafs","getTotalLength","strokeDasharray","putAvatar","renderThumbPromise","thumbImage","isFullLoaded","loadThumbPromise","stripped_thumb","getPreviewURLFromBytes","sequentialDom","renderPromise","myId","getForumTopic","setProperty","getPeerColorById","forum","avatarAvailable","avatarRendered","appAvatarsManager","isAvatarCached","first_name","last_name","getPeerInitials","returnDiv","setButtonLoader","RadioField","alignRight","RadioForm","radios","form","RangeSelector","events","setFilled","filled","stepStr","decimals","_removeListeners","rectMax","offsetAxisValue","rippleClickId","attachListenerTo","handler","drawRipple","clickId","_handler","touchStartFired","clickY","isRippleUnneeded","touchEnd","setContent","Row","checkboxFieldOptions","radioField","noWrap","subtitleRight","subtitleRow","createRow","subtitleLangArgs","isToggle","withCheckboxSubtitle","titleRightContent","titleRightSecondary","titleRow","createTitle","navigationTab","buttonRightLangKey","_subtitle","createSubtitle","midtitle","_midtitle","createMidtitle","createMedia","disableWithPromise","makeSortable","sortIcon","toggleSorting","CreateRowFromCheckboxField","RadioFormFromRows","RadioFormFromValues","checkedRadioField","ScrollableBase","logPrefix","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","cancelMeasure","onScrolledTop","scrollPosition","scrollProperty","addScrollListener","addedScrollListener","removeScrollListener","removeHeavyAnimationListener","Scrollable","onScrollOffset","withPaddingContainer","maxScrollTop","isScrolledDown","getDistanceToEnd","setScrollTopSilently","ignoreNextScrollEvent","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","SettingSection","fakeGradientDelimiter","hr","generateContentElement","nameArgs","captionOld","captionArgs","generateSection","AppNewGroupTab","isGeoChat","setTitle","inputWrapper","groupNameInputField","groupLocationInputField","valueCheck","userLocationCoords","userLocationAddress","createChannel","geo_point","megagroup","inputFile","editPhoto","inviteToChannel","createChat","chatsSection","new","startLocating","geolocation","getCurrentPosition","lat","coords","latitude","long","longitude","uri","json","display_name","GeolocationPositionError","PrivacyType","getPrivacyRulesDetails","rules","types","allowPeers","users","chats","disallowPeers","rule","PrivacySection","onRadioChange","captions","captionElement","radioSection","exceptions","radioRows","skipTypes","noExceptions","exceptionTexts","exception","_peerIds","slider","createTab","skippable","takeOut","newPeerIds","generateStr","splitPeersByType","selectedPeerIds","appPrivacyManager","getPrivacy","inputKey","setRadio","k","eventListener","chatKey","usersKey","getUserInput","setPrivacy","AppPrivacyPhoneNumberTab","getSelf","captionEl","mePath","phoneSection","sCaption","AppTwoStepVerificationSetTab","stickerContainer","inputContent","btnReturn","sliceTabsUntilTab","AppSettingsTab","canFocus","isFirstInput","AppTwoStepVerificationEmailConfirmationTab","isFirst","email","codeInputField","passwordManager","confirmPasswordEmail","goNext","btnChange","btnResend","cancelPasswordEmail","AppTwoStepVerificationEmailTab","resendPasswordEmail","onOpenAfterTimeout","onContinueClick","btnContinue","btnSkip","matchEmail","toggleButtons","updateSettings","currentPassword","plainPassword","newPassword","symbols","AppTwoStepVerificationHintTab","onSkipClick","saveHint","AppTwoStepVerificationReEnterPasswordTab","monkey","verifyInput","AppTwoStepVerificationEnterPasswordTab","isNew","has_password","textEl","getStateInterval","getState","_state","check","auth","AppTwoStepVerificationTab","removeTabFromHistory","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","AppPrivacyLastSeenTab","AppPrivacyProfilePhotoTab","AppPrivacyForwardMessagesTab","AppPrivacyAddToGroupsTab","AppPrivacyCallsTab","AppActiveSessionsTab","Session","app_name","app_version","ip","date_active","date_created","device_model","system_version","platform","authorizations","session","btnTerminate","invokeApi","otherSection","onError","onTerminateClick","menuElement","AppBlockedUsersTab","btnAdd","toggleBlock","bot","blocked","getBlocked","convertKeyToInputKey","toUpperCase","AppPrivacyVoicesTab","AppActiveWebSessionsTab","sessions","bot_id","region","domain","browser","appSeamlessLoginManager","resetWebAuthorizations","leftLength","resetWebAuthorization","AppPrivacyAndSecurityTab","fromTab","getAppConfig","globalPrivacy","getGlobalPrivacySettings","contentSettings","webAuthorizations","getWebAuthorizations","SUBTITLE","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRowOptions","email_unconfirmed_pattern","twoFactorRow","activeSessionsRow","updateActiveSessions","websitesRow","updateActiveWebsites","websites","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","voicesRow","updatePrivacyRow","disallowLength","allowLength","destroyed","setGlobalPrivacySettings","archive_and_mute_new_noncontact_peers","settings","onPremiumToggle","autoarchive_setting_available","_enabled","sensitive_enabled","sensitive_can_change","payment","appPaymentsManager","clearSavedInfo","deleteButton","appDraftsManager","clearAllDrafts","auths","AppQuickReactionTab","appReactionsManager","getQuickReaction","getAvailableReactions","quickReaction","availableReactions","reaction","inactive","availableReaction","static_icon","setDefaultReaction","emoticon","RangeSettingSelector","initialValue","minValue","writeValue","nameDiv","valueDiv","valueContainer","AppGeneralSettingsTab","accountThemes","format","allStickers","chatBackgroundButton","initArgs","animationsCheckboxField","enterRow","ctrlEnterRow","kilometersRow","milesRow","formats","runFirst","getNextTimeout","_callback","run","eachTimeout","getSeconds","eachMinute","toLocaleTimeString","hour","minute","suggestCheckboxField","bigCheckboxField","reactionsRow","renderQuickReaction","getCustomEmojiDocument","document_id","loopCheckboxField","stickerSets","stickersContent","assumeType","AppChatFoldersTab","filtersRendered","animationData","lottieLoader","renderFolder","dialogFilter","non_contacts","broadcasts","bots","folder","getFolderDialogs","channels","isAnyGroup","filtersStorage","getFilter","setInitFilter","localId","getInitArgs","createFolderBtn","foldersSection","suggestedSection","canCreateFolder","onFiltersContainerUpdate","renderFiltersPromise","toggleAllChats","getSuggestedFilters","loadAnimationPromise","onSort","prevIdx","newIdx","updateDialogFiltersOrder","getDialogFilters","getSuggestedDialogsFilters","suggestedFilters","includePeerIds","excludePeerIds","pinnedPeerIds","createDialogFilter","AppNotificationsTab","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","getNotifySettings","notifySettings","applySettings","isMuted","show_previews","mute","showPreviews","inputSettings","mute_until","flags","updateNotifySettings","notify_settings","contactsSignUpRow","soundRow","sound","getContactSignUpNotification","setContactSignUpNotification","AppLanguageTab","languages1","lang_pack","languages2","rendered","webLangCodes","language","lang_code","native_name","langPack","autoDownloadPeerTypeSection","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","AppAutoDownloadPhotoTab","AppAutoDownloadFileTab","debouncedSave","sizeMax","appStateManager","setByKey","MIN","MAX_RANGE","MAX","upTo","formatBytes","compareAndUpdate","AppAutoDownloadVideoTab","AUTO_DOWNLOAD_FOR_KEYS","private","AppDataAndStorageTab","autoCheckboxField","autoDownloadNew","autoRow","resetButton","deepEqual","setSubtitles","setAutoDownloadSubtitle","photoRow","videoRow","fileRow","file_size_max","openTab","tabConstructor","onDisabledChange","peerKeys","enabledKeys","isAll","logOut","edit","profile","fillPromise","changeAvatarBtn","upload","uploadProfilePhoto","updateChangeAvatarBtn","languageArgs","devicesRow","languageRow","buttonsSection","getEditProfileArgs","editProfileArgs","getAuthorizations","overwrite","getAuthorizationsPromise","AppNewChannelTab","channelNameInputField","channelDescriptionInputField","onLengthChange","broadcast","channelId","PopupCreateContact","importContact","nameInputField","lastNameInputField","telInputField","editPeer","AppContactsTab","openContacts","isContact","sortedUserList","createList","renderPage","AppArchivedTab","wasFilterId","ul","AppPeopleNearbyTab","isLocationWatched","parseDistance","startWatching","latestLocationSaved","getLocated","accuracy","watchPosition","isLongitudeDifferent","isLatitudeDifferent","distanceCheck","calculateDistance","stopWatching","lat1","long1","lat2","long2","asin","LEFT_COLUMN_ACTIVE_CLASSNAME","AppSidebarLeft","sidebarEl","sidebarHeader","onContactsClick","backBtn","btnArchive","isDialogsLoaded","themeCheckboxField","themeController","sessionStorage","kz_version","installPrompt","toolsBtn","btnMenuFooter","rel","archivedCount","newBtnMenu","updateBtn","reload","initSearch","unreadPeerIds","formatNumber","checkUpdateInterval","cache","status","ok","hasUpdate","onResize","documentElement","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","removeProperty","helper","unselectEntity","renderEntity","dates","dateData","pushRecentSearch","peopleContainer","hideNewBtnMenuTimeout","transition","activeClassName","onFocus","clearRecentSearchBtn","clearRecentSearch","appSidebarLeft","AppAddMembersTab","attachToPromise","isPrivacy","removeLoader","averageColorFromCanvas","pixel","getImageData","pixelsLength","outPixel","Uint8ClampedArray","highlightningColor","rgba","l","ColorPicker","hue","saturation","lightness","onGrabStart","boxDragger","onGrabEnd","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","attachGrabListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","getCurrentColor","rgbaArray","hexa","hsl","hsla","clamp","maxX","maxY","posX","posY","lightnessX","lightnessY","AppBackgroundColorTab","_applyColor","updateColorPicker","colorPicker","theme","wallPaper","background_color","wallpaper","pushToState","onColorChange","applyColor","gridSection","grid","backgroundColor","throttle","isColored","getHexColorFromTelegramColor","repeat","getColorsFromWallPaper","second_background_color","third_background_color","fourth_background_color","AppBackgroundTab","clicked","wallPapersByElement","elementsByKey","onUploadClick","accept","requestFile","endsWith","createObjectURL","mimeType","scaleMediaElement","File","prepareWallPaperUpload","uploadPromise","uploadWallPaper","uploadDeferred","newKey","getWallPaperKey","setBackgroundDocument","addWallPaper","onResetClick","defaultTheme","blurCheckboxField","onGridClick","getWallPaperKeyFromTheme","backgrounds","uploadButton","colorButton","pattern","wallPapers","gridContainer","hasFile","isDark","dark","intensity","webkitMaskImage","_tempId","themeSettings","onReady","getPixelPromise","imageUrl","imageSource","ratio","averageColorFromImageSource","averageColor","slug","saveToCache","toDataURL","AppIncludedChatsTab","getContacts","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","editFolderTab","originalFilter","cmp","pinned_peers","other","otherLegacy","getInputPeerById","setFilter","onAppConfig","dialog_filters_chats_limit_premium","dialog_filters_chats_limit_default","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","selectedPeers","addedInitial","_add","flag","hasOwnProperty","AppEditFolderTab","deleting","deleteFolderButton","updateDialogFilter","bool","menuBtn","inputSection","generateList","h2Text","to","includedFlagsContainer","excludedFlagsContainer","include","include_peers","editCheckForChange","reloadMissingPromises","reloadMissingPeerIds","onEditOpen","onCreateOpen","ignoreClick","hasPeer","getDialogOnly","filtered","filterAsync","renderMore","_length","exclude_peers","purchaseUsernameCaption","purchaseText","setUsername","AppEditProfileTab","bioMaxLength","userFull","firstNameInputField","bioInputField","usernameInputField","isPurchase","availableText","takenText","invalidText","profilePromise","updateProfile","updateUsername","RIGHT_COLUMN_ACTIVE_CLASSNAME","AppSidebarRight","canHideFirst","isColumnProportionSet","toggleSidebar","setColumnProportion","createSharedMediaTab","replaceSharedMediaTab","previousTab","sharedMediaTab","historyTabIds","_selectTab","getFrom","setFrom","onCloseTab","isNavigation","willChange","animationPromise","appSidebarRight","AppEditContactTab","privacy","notificationsCheckboxField","profileNameDiv","profileSubtitleDiv","phoneRow","privacyRule","sharePhoneCheckboxField","btnDelete","deleteContacts","addContact","mediaSize","AppEditTopicTab","colorIndex","isGeneral","originalTopic","iconDiv","icon_emoji_id","setIcon","editForumTopic","topicId","iconEmojiId","createForumTopic","iconColor","onDestroy","emojiElement","icon_color","force","isMainIcon","newTopic","oldTopic","oldEl","applyFadeAnimation","fadeIn","iterations","easing","AppChatTypeTab","privateRow","publicRow","privateSection","publicContainer","chatUpdateListeners","basic","linkRow","btnRevoke","getChatInviteLink","publicSection","linkInputField","applyBtn","getValue","head","usernamesSection","getPeerEditableUsername","wasUsername","migrateChat","makeChannelPrivate","toggleNoForwards","onChatUpdate","noforwards","addChatUpdateListener","AppUserPermissionsTab","destroyListener","ChatPermissions","rights","banned_rights","editBanned","btnDeleteException","clearChannelParticipantBannedRights","kickFromChannel","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","defaultRights","combineParticipantBannedRights","restrictionText","mainFlag","until_date","AppGroupPermissionsTab","chatPermissions","editChatDefaultBannedRights","addExceptionRow","openPermissions","getChannelParticipant","setSubtitle","bannedRights","cantWhat","getPeerId","setLength","exceptionsCount","loader","setLoader","getPromise","migrateFrom","migrateTo","AppChatReactionsTab","getActiveAvailableReactions","_chatReactions","available_reactions","chatReactions","reactions","makeReactionFromEmoticons","getCaptionLangPackKey","toggleSection","reactionsSection","toggleCheckboxFieldsByEmoticons","checkboxFieldsByEmoticon","toggleCheckboxField","toggleRow","save","checkboxFields","every","saveReactionsDebounced","allow_custom","saveReactions","setChatAvailableReactions","isDebounced","AppEditChatTab","_init","canChangeType","canChangePermissions","canManageTopics","getCachedFullChat","chatNameInputField","descriptionInputField","chatTypeRow","setChatTypeSubtitle","availableReactionsLength","setReactionsLength","chatAvailableReactions","permissionsRow","setPermissionsLength","forum_upgrade_participants_min","topicsRow","setTopics","toggleForum","editTitle","editAbout","signMessagesCheckboxField","signatures","toggleSignatures","showChatHistoryCheckboxField","togglePreHistoryHidden","hidden_prehistory","historiesStorage","AppSharedMediaTab","newCloseBtn","closeBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","titleI18n","editBtn","transitionLastItem","secondTitle","setIsSharedMedia","isSharedMedia","isHeavy","onCloseBtnClick","toggleEditBtn","renderNewMessage","msgs","deleteDeletedMessages","btnAddMembers","showConfirmation","addChatUser","_renderNewMessage","getMessageThreadId","_deleteDeletedMessages","setLoadMutex","peerChanged","changeTitleKey","loadSidebarMedia","destroyable","SetTransition","raf","afterTimeout","SidebarSlider","closeTab","closingId","getMiddleware","onOpenTab","preserveTab","getTab","getHistory","isTabExists","deleteTab","doNotAppend","SliderSuperTab","_constructor","SliderSuperTabEventable","dispatchResultableEvent","SortedUserList","getIndex","getUserStatusForSort","onDelete","listEl","onListLengthChange","onUpdate","willChangeLength","onElementCreate","base","updateElementWith","updateListWith","createChatListOptions","doTimeout","updateList","SORT_INTERVAL","hasViewer","attachStickerViewerListeners","findTarget","originalFindTarget","checkForParent","closest","mediaContainer","previousGroup","_middleware","previousTransformer","doThatSticker","lockGroups","isSwitching","effectThumb","mediaRect","boxSize","fitted","aspectFitted","transformer","transformX","transformY","needFadeIn","withThumb","relativeEffect","loopEffect","firstFramePromise","prevPlayer","ready","onMousePreMove","newMediaContainer","_previousTransformer","StickyIntersector","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","elementsObserver","addSentinel","sentinel","headerSentinel","getEvent","attachGlobalListenerTo","RESET_GLOBAL","TOUCH_MOVE_OPTIONS","MOUSE_MOVE_OPTIONS","SwipeHandler","handleMove","setCursorTo","hadMove","resetValues","handleStart","isMouseDown","withDelay","xDown","yDown","eventUp","onStart","xUp","yUp","xAdded","yAdded","onSwipeResult","listenerOptions","setCursor","TelInputField","pasted","lastValue","telEl","HTMLInputElement","pixelRatio","letterSpacing","IS_ANDROID","originalFunc","formattedPhoneNumber","leftPattern","shiftKey","toastEl","hideToast","toastNew","transitions","navigation","prevTabContent","animateFirst","withAnimationListener","animationFunction","_animateFirst","onTransitionEndCallbacks","animationDeferred","listenerName","onEndEvent","overrideFrom","onTransitionEndCallback","transitionTimeout","_from","isUsernameValid","UsernameInputField","checkUsernameDebounced","checkUsername","checkUsernamePromise","checkPromise","available","UsernamesSection","CLASS_NAME","_usernames","sortedList","editable","changeActive","applyUsernames","getAll","_peerId","cancelClick","newActive","toggleUsername","reorderUsernames","VisibilityIntersector","locked","change","refreshVisible","VolumeSelector","onMuteClick","setVolume","iconIndex","ICONS","wrapCustomEmoji","wrapCustomEmojiAwaited","wrapDocument","noAutoDownload","uploadFileName","audioElement","extSplitted","ext","docDiv","icoDiv","icoTextEl","hadContext","hasThumb","performance","fileName","bytesContainer","descriptionParts","bytesMaxEl","sizeDiv","_downloadDiv","addByteProgress","sizeContainer","_bytesContainer","_d","canOpenAfter","downloadFileName","downloadId","apiFileManager","isDownloading","support","was_online","today","getDate","dateEl","timeEl","toggleMediaSpoiler","reveal","destroyAfter","onMediaSpoilerClick","wrapMediaSpoiler","wrapMediaSpoilerWithImage","wrapMessageActionTextNew","plain","hadColors","wrapJoinVoiceChatAnchor","wrapUrl","wrapLinkToMessage","savedFrom","dir","wrapSomeText","htmlToSpan","wrapTopicIcon","ns","contentSpan","gradientId","strokeColor","clone","topicAvatar","wrapMessageActionTopicIcon","wrapMessageActionTopicIconAndName","wrapMessageActionTextNewUnsafe","unsafeMessage","getNameDivHTML","formatCallDuration","post","schedule_date","daysToStart","tomorrowDate","_args","day","pinnedMessage","reply_to_mid","fetchMessageReplyTo","user_id","joined","anchorHTML","isRecurringInit","recurring_init","isRecurringUsed","recurring_used","paymentsWrapCurrencyAmount","total_amount","currency","invoiceMessage","reply_to","reply_to_peer_id","period","titleElement","authorElement","isMe","isIconChanged","isIconRemoved","isTitleChanged","isHiddenChanged","closed","waited","wrapMessageForReply","usingMids","withoutMediaType","hasAlbumKey","addPart","part","isRestricted","usingFullAlbum","grouped_id","getMidsByMessage","albumText","getAlbumText","poll","question","game","extended_media","actionWrapped","restriction_reason","exec","messageWrapped","noLinks","noTextFormat","wrapPeerTitle","wrapPhoto","withTail","noThumb","blurAfter","isImageFromDocument","startsWith","isWebDoc","isFit","renderOnLoad","canAttachPreloader","haveToDownload","onlyCache","getDownloadPromise","wrapSenderToPeer","senderTitle","fromMe","wrapSentTime","STICKER_EFFECT_MULTIPLIER","locksUrls","videosCache","wrapSticker","loadStickerMiddleware","exportLoad","needUpscale","skipRatio","asStatic","fullThumb","noPremium","isCustomEmoji","syncedVideo","stickerType","emojiSticker","animatedSticker","staticSticker","isAnimated","getStickerEffectThumb","willHaveLock","lockUrl","toneIndex","isThumbNeededForType","lottieCachedThumb","getLottieCachedThumb","haveThumbCached","afterRender","num","getPathFromBytes","getPreviewURLFromThumb","stickerThumbConverted","webpWorkerController","saveWebPConvertedStrippedThumb","getImageFromStrippedThumb","middlewareError","sync","setLockColor","skipx","skipy","imageData","sr","sg","sb","sa","outCanvas","outContext","computeLockColor","saveLottiePreview","onFirstFrame","preloadAnimatedEmojiStickerAnimation","isSingleVideo","cacheName","framesCache","cachePromise","previousTime","playedTimes","onTimeupdate","mediaLength","lastPromise","_media","preloadSticker","playing","animationDiv","stickerPromise","side","attachStickerEffectHandler","onEmojiStickerClick","getAnimatedEmojiSoundDocument","restart","getAnimatedEmojiSticker","emojiData","sendInteractionThrottled","msg_id","interaction","JSON","stringify","withRandomOffset","wrapStickerAnimation","unmountAnimation","frameNo","maxFrame","vibrate","generateRandomSigned","randomOffsetX","randomOffsetY","setPosition","factor","stableOffsetX","stableOffsetY","rectX","rectY","addOffsetX","addOffsetY","wrapStickerEmoji","wrapStickerSetThumb","downloadOptions","getStickerSetThumbDownloadOptions","videos","getDocPromise","thumb_document_id","wrapStickerToRow","previousMedia","_size","wrapTopicNameButton","roundVideoCircumference","wrapVideo","videoSize","noAutoplayAttribute","isAlbumItem","canAutoplay","spanTime","spanPlay","needPlayButton","photoRes","divRound","halfSize","strokeDashoffset","globalVideo","onPaused","onFrame","renderDeferred","loadPhotoThumbFunc","wrapWebPageDescription","shortDescriptionText","wrapWebPageTitle","shortTitle","site_name","EmojiVersions","Emoji","version","FontFamily","FontSize","FontWeight","instances","getAnimationInstance","cancelAnimationByKey","instance","isCancelled","animateSingle","tick","createAnimationInstance","array","AudioAssetPlayer","assets","playSound","assetName","createAudio","playSoundIfDifferent","Audio","stopSound","cancelDelayedPlay","playSoundWithTimeout","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","possiblePromise","process","realResult","timedChunk","requireBlurPromise","fastBlurFunc","processBlurNext","default","dataUri","JPEG_HEADER","bytesFromHex","JPEG_TAIL","getPreviewBytesFromURL","needle","jpegBytes","atob","char","charCodeAt","isSticker","convertToUint8Array","dataURL","btoa","bytesToDataURL","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","getTextWidth","measureText","source","createImageBitmap","resizeWidth","resizeHeight","quality","badCharsRe","trimRe","C2L","clearBadCharsAndTrim","latinize","processSearchText","clearBadChars","ignoreCase","hasTag","includeTag","charAt","originalText","ch","latinizeCh","latinizeString","fixCyrillic","fallbackCopyTextToClipboard","textArea","removeChild","copyTextToClipboard","clipboard","writeText","ContextMenuController","diffX","diffY","isOpened","openBtnMenu","months","days","ONE_DAY","getWeekNumber","UTC","getMonth","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","formatDateAccordingToTodayNew","weekday","formatFullSentTimeRaw","formatTime","capitalize","textTransform","formatFullSentTime","getFullDate","joiner","monthAsNumber","getHours","getMinutes","noSeconds","leadingZero","noTime","minYear","yearPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","setFullYear","dayOfWeek","formatWeekLong","getDay","getDayOfWeek","setTime","g1","g2","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","T_ME","copyWhat","copyText","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","onCancel","onMove","isTouch","onTouchEnd","CLICK_EVENT_NAME","touchMouseDown","detachClickEvent","simulateClickEvent","ControlsHover","setHideTimeout","hideControlsTimeout","isShown","controlsLocked","toggleControls","relatedTarget","createContextMenu","findElement","filterButtons","onBeforeOpen","initResult","verifyFavoriteSticker","toAdd","favedStickers","_doc","disablePictureInPicture","computedStyle","getProperty","simulateEvent","childNodes","tag","requestFullScreen","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","addListener","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","getCaretPosF","childNodesLength","alt","markdownTags","entityName","underline","italic","monospace","strikethrough","mentionName","BLOCK_TAGS","BOM_REG_EXP","checkNodeForEntity","follow","getRichElementValue","selNode","selOffset","isBlock","isTableCell","wasEntitiesLength","wasLength","field","withEntities","withCaret","DocumentFragment","startOffset","startContainer","possibleChildrenFocusOffset","getCaretPos","caretPos","getViewportSlice","overflowRect","extraSize","invisibleTop","invisibleBottom","foundVisible","lookForSticky","overflowTop","overflowRight","overflowBottom","overflowLeft","sticky","windowWidth","windowHeight","handleHorizontalSwipe","cancelY","template","isSendShortcutPressed","isComposing","secondaryKey","isSwipingBackSafari","TouchEvent","placeCaretAtEnd","ignoreTouchCheck","selectionStart","selectionEnd","prevPos","backgroundImage","useCache","isImage","renderImageFromUrlPromise","renderMediaWithFadeIn","compareNodes","node1","node1Offset","node2","node2Offset","parents","commonAncestorContainer","NOT_ONLY_BOMS_REG_EXP","USING_BOMS","RichInputHandler","saveSelectionOnChange","saveRangeForElement","onFocusOut","lastNode","lastOffset","onSelectionChange","setSelectionClassName","caret","getCaretPosN","move","superMove","modify","getFiller","addInputCallback","processEmptiedFillers","fixInsertedLineBreaks","moveFirst","setEnd","isBOM","deleteData","processFilledFillers","removeEmptyTextNodes","fixBuggedCaret","savedRanges","IS_FIREFOX","inputCaptureCallbacks","anchorNode","findPreviousSmthIndex","something","fromSelectionChange","smthIndex","moved","idxidx","rangeString","onlyBOMs","restoreSavedRange","makeFocused","newCallback","sibling","needed","treeWalker","createTreeWalker","NodeFilter","SHOW_TEXT","acceptNode","FILTER_REJECT","FILTER_ACCEPT","textNode","nextNode","removePossibleBOMSiblings","removePossibleBOMSiblingsByNode","cleanSiblings","insertData","bomNode","intersectsNode","focusNode","focusNodeBefore","focusOffset","focusOffsetBefore","collapseToStart","collapseToEnd","focusNodeAfter","focusOffsetAfter","prepareApplyingMarkdown","fillers","smths","INSTANCE","Sortable","minY","elementRect","lastSiblings","siblings","property","getSortableTarget","scrollableRect","toEnd","addScrollPos","scrollPos","startScrollPos","isVertical","countNonElements","DropdownHover","onClickOut","ignoreButtons","ignoreMouseOut","toElement","willBeActive","inited","timeouts","attachButtonListener","setIgnoreMouseOut","onmouseout","onmouseover","FocusDirection","fastSmoothScroll","maxDistance","Static","scrollWithJs","getNormalSize","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","elementScrollSizeKey","scrollPositionKey","possibleElementPosition","containerSize","scrollSize","fallbackToElementStartWhenCentering","remainingPath","absPath","startAt","shortTransition","longTransition","currentPath","distanceToEnd","FILENAME_JOINER","getFileNameByLocation","thumb_size","big","stickerset","short_name","thumb_version","volume_id","local_id","strictDecimals","_decimals","dm","fixed","pow","parseFloat","CALL_DURATION_LANG_KEYS","mm","showLast","dd","formatDuration","strings","prefixes","maxPrefixLength","setPrefix","originalStr","prefixCountry","patterns","searchForPattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","symbol","FramesCache","framesNew","framesURLs","getCache","createCache","releaseCache","getCacheCounter","generateName","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","tl","tr","bl","useBlur","ignoreCache","ListLoader","loadedAllDown","setLoaded","unsetCurrent","toPrevious","goUnsafe","down","loadPromiseDown","loadPromiseUp","processedArr","processed","ListenerSetter","listeners","addManual","onceCallback","onceFired","_listener","MediaSize","aspect","aspectCovered","makeMediaSize","ScreenSize","CUSTOM_EMOJI_SIZE","ESG_CUSTOM_EMOJI_SIZE","EMOJI_STATUS_SIZE","MediaSizes","screenSizes","mobile","medium","large","handhelds","regular","album","esgSticker","documentName","invoice","extendedInvoice","customEmoji","esgCustomEmoji","popupSticker","desktop","isMobile","handleResize","innerWidth","activeScreen","wasScreen","rAF","throwWhat","numberThousandSplitter","HAVE_METADATA","useCanplayOnIos","loadEventName","errorEventName","OverlayClickHandler","withOverlay","amount","skipSymbol","isNegative","currencyData","amountExp","exp","number","dec_point","thousands_sep","isFinite","prec","sep","dec","toFixedFix","number_format","decimal_sep","space_between","symbol_left","splitter","additionalPadding","getScrollWidthFromElement","menuWidth","menuHeight","paddingRight","paddingBottom","paddingLeft","verticalSide","maxTop","maxLeft","minLeft","sides","intermediateX","intermediateY","possibleSides","platforms","getRestrictionReason","reasons","reason","savingLottiePreview","isSavingLottiePreview","saving","throttleWithRaf","fn","schedulerFn","waiting","throttleWith","ScrollableLoader","SearchListLoader","messageId","generateMessageId","filterMids","onHistoryDelete","shouldBeDeleted","onHistoryMultiappend","onMessageSent","isInner","otherSideLoader","filterMessagesByInputFilterFromStorage","goToOtherEnd","do","kind","scheduleFlush","measure","mutate","mutateElement","read","write","pushDocumentSize","_isWebDocument","replies","comments","channel_id","BatchProcessor","bindPrefix","queuePromise","addToQueue","setQueue","possibleError","perf","renderedQueue","SortedList","batchProcessor","_updateList","canUpdate","createPromise","noScheduler","encodeEntities","limitFrom","leadZero","sec_num","hours","minutes","seconds","textToSvgURL","Blob","reader","FileReader","readAsDataURL","visualViewport","innerHeight","ANIMATION_START_EVENT","ANIMATION_END_EVENT","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","_heavyAnimationPromise","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","DialogsContextMenu","onArchiveClick","editPeerFolders","folder_id","hideTopic","toggleTopic","onPinClick","toggleDialogPin","onUnmuteClick","onUnreadClick","unread_count","readHistory","top_message","markDialogUnread","onContextMenu","getDialogOrTopic","getDeleteButtonText","isDialogUnread","pinned","ConnectionStatusComponent","hadConnect","connecting","timedOut","updating","setConnectionStatus","overrideStatus","baseDcId","connectionStatus","setFirstConnectionTimeout","online","apiUpdatesManager","forceGetDifference","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","singleInstance","CHANGE_STATE_DELAY","getA","networkerFactory","forceReconnect","timerSpan","interval","forceReconnectTimeout","setStateTimeout","statusContainer","SENDING_STATUS","easeInOutSine","easeInOutSineApply","roundRect","defaultRadius","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","DPR","SIZE","MARGIN","WIDTH","RADIUS","Shimmer","currTime","diffTime","spread","pausedTime","pauseInterval","lightSource","lightSpread","currentAnimationIndex","keepTime","cycleAnimation","currentAnimation","animateGlow","animateSlide","smartInc","lightLeft","lightRight","lightCenter","createLinearGradient","customProperties","shimmerColor","addColorStop","dict","on","fillText","DialogsPlaceholder","onThemeChange","stopAnimation","startAnimation","updateCanvasSize","shimmer","generatedValues","marginVertical","totalHeight","lineHeight","lineBorderRadius","lineMarginVertical","statusWidth","getRectFrom","onRemove","blockScrollable","overflowY","availableLength","detachTime","renderDetachAnimationFrame","globalCompositeOperation","completed","elapsedRowTime","dialogHeight","renderFrame","createPattern","patternCanvas","patternContext","drawChat","firstLineWidth","secondLineWidth","marginLeft","drawCircle","drawCircleFromStart","shake","keyframes","setPromiseMiddleware","oldPromise","SortedDialogList","getDialogIndex","forumPeerId","indexKey","addListDialog","isBatch","isMainList","DialogElement","bigger","abitbigger","small","captionDiv","titleSpanContainer","peerTitlePromise","statusSpan","lastTimeSpan","rightSpan","dialogDom","setDialogActive","forumTab","createUnreadBadge","unreadBadge","badge","createUnreadAvatarBadge","unreadAvatarBadge","createMentionsBadge","mentionsBadge","toggleBadgeByKey","hasBadge","justCreated","ForumTab","init2","isFloating","toggleForumTab","createChatList","setListClickListener","xd","Some3","bindScrollable","getOptionsForMessages","fullReset","subscribeToChannelUpdates","unsubscribeFromChannelUpdates","setStatusPromise","noTyping","onChatsScroll","loadResult","setStatus","NOT_IMPLEMENTED_ERROR","Some","onChatsRegularScroll","sliceTimeout","processContact","scrollTopWas","rectContainer","rectTarget","firstY","lastY","firstElement","elementFromPoint","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialogByKey","getDialogKeyFromElement","setOffsets","offsets","getOffsetIndex","isDialogMustBeInViewport","topOffset","bottomOffset","setIndexKey","deleteDialog","getDialogKey","updateDialog","loadedDialogsAtLeastOnce","getDialogElement","setLastMessageN","setUnread","onChatsScrollTop","loadDialogs","createPlaceholder","placeholderOptions","getRectFromForPlaceholder","loadDialogsPromise","loadDialogsRenderPromise","cachedInfoPromise","chatList","getConversationsResult","loadDialogsInner","needPlaceholderAtFirstTime","isTopEnd","offsetDialog","firstDialog","lastDialog","getDialogFromElement","getDialogDom","oldTypingElement","newTypingElement","unsetTyping","paddingX","typings","topics","setUnreadMessagesN","drop","sidebarRect","currentOffsetIndex","needIndex","Some2","getUserStatus","setOnlineStatus","processDialogForCallStatus","validateDialogForFilter","getCachedDialogs","validateListForFilter","doNotRenderChatList","hasClassName","generateScrollable","getDialogIndexKey","sortedDialogList","testDialogForFilter","migratedTo","setCallStatus","callIcon","START_X","wasMounted","itemProgress","groupCallActiveIcon","call_active","call_not_empty","loadContacts","toggleAvatarUnreadBadges","sortedDialog","reuseClassNames","unreadContent","isUnreadAvatarBadgeMounted","unreadAvatarBadgeClassList","unreadBadgeClassList","AppDialogsManager","Log","menuScrollContainer","lastActiveElements","initedListeners","xds","onTabChange","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","updateContactsLength","dialogSize","verifyPeerIdForContacts","getProxiedManagers","stateMiddlewareHelper","bottomPart","forumsTabs","forumsSlider","allChatsIntlElement","isFilterIdAvailable","clearCurrent","showFiltersPromise","onStateLoaded","setFilterId","addFilter","foldersScrollable","_id","filtersNavigationItem","setFilterIdAndChangeTab","changeFiltersAllChatsKey","groupCallsController","callsController","initListeners","setFiltersUnreadCount","setFilterUnreadCount","elementThreadId","elementPeerId","onFiltersLengthChange","containerToAppend","getDialogIndexKeyByFilterId","renderedFilter","filtersArr","haveFilters","addFilters","addFiltersPromise","getNotifyPeerTypeSettings","fillConversations","unreadSpan","unread","unreadUnmutedCount","unreadCount","getFolderUnreadCount","wasShowing","generateEmptyPlaceholder","classNameType","subtitleArgs","placeholderContainer","needPlaceholder","emptyDialogsPlaceholderSubtitle","usersLength","placeholderType","updatePartClassName","updateContactsLengthPromise","newTab","hideTab","forumNavigationItem","toggleForumTabByPeerId","lastTab","isSameTab","withContext","openInner","lastActiveListElement","setPeerFunc","setLastMessage","draftMessage","draft","topMessage","isMessageRestricted","willPrepend","videoTypes","playIcon","replyTo","forum_topic","setUnreadMessages","isDialogPinned","getForumUnreadCount","hasUnmuted","isPinned","forumUnreadCount","wasMuted","unreadTopicsCount","hasUnmutedTopic","setStatusMessage","read_inbox_max_id","hasUnreadBadge","hasUnreadAvatarBadge","transitionDuration","disableAnimationIfRippleFound","iconClassName","setSendingStatus","isUnreadBadgeMounted","hasMentionsBadge","unread_mentions_count","isMentionsBadgeMounted","isBadgeMounted","unreadBadgeText","isUnread","isMention","notVisited","getDialog","originalDialog","getOutputPeer","addDialogNew","addDialogAndSetLastMessage","getMessageSenderPeerIdOrName","downloads","getNewDeferred","cancelDownload","clearDownload","getNewDeferredForUpload","getUpload","getDownload","getUploadPromise","getDownloadFileNameFromOptions","downloadMedia","promiseBefore","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","getFileNameForUpload","downloadToDisc","justAttach","pingPromise","iframe","hadProgress","getDocumentDownloadOptions","getPhotoDownloadOptions","clickEvent","createEvent","initMouseEvent","createDownloadAnchor","revokeObjectURL","partition","bad","BubbleGroup","avatarLoadPromise","avatarContainer","fwdFrom","fwdFromId","isForwardFromChannel","from_id","currentPeerId","firstTimestamp","firstItem","firstMid","lastTimestamp","lastItem","lastMid","updateClassNames","insertItem","insertInDescendSortedArray","sortGroupItemsKey","insertGroup","mount","onItemUnmount","mountItem","onItemMount","unmountItem","dateContainer","getDateContainerByTimestamp","dateGroups","_group","dateGroupsLength","unmountedLength","STICKY_OFFSET","deleteEmptyDateGroups","BubbleGroups","itemsArr","itemsMap","newGroupDiff","sortItemsKey","sortGroupsKey","removeItemFromCache","removeAndUnmountBubble","getItemByBubble","getSiblingsAtIndex","modifiedGroups","canItemsBeGrouped","groupUngrouped","mountUnmountGroups","toMount","toUnmount","getLastGroup","changeBubbleMid","insertItemToArray","changeItemBubble","changeBubbleByBubble","item1","item2","isAllMessagesForum","itemIndex","findGroupSiblingByItem","findGroupSiblingInItems","previousItem","siblingGroupedItem","nextItem","addItemToGroup","addItemToCache","getMessageFromId","viaBotId","createItem","SERVICE_AS_REGULAR","getDateForDateContainer","groupMid","splitSiblingsOnGrouping","prepareForGrouping","hadGroup","foundItem","splittedGroups","PopupDatePicker","initDate","onPick","noButtons","selectedDate","selectedMonth","minMonth","prevBtn","maxMonth","onDateClick","selectedEl","setTimeTitle","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","setMinutes","popupCenterer","timeOptions","sendDate","dateOptions","renderElement","firstDate","weekStartDate","dayIndex","clonedDate","showOverflowMonths","remainder","DivAndCaption","MEDIA_SIZE","wrapReplyDivAndCaption","mediaEl","messageMedia","isRound","mediaChildren","video_thumbs","ReplyContainer","isMediaSet","wrapReply","setColorPeerId","replyContainer","AVATAR_CLASS_NAME","AVATAR_CONTAINER_CLASS_NAME","StackedAvatars","TAG_NAME","RepliesElement","updated","postKey","leftPart","recent_repliers","stackedAvatars","read_max_id","max_id","textSpan","iconSpan","rippleContainer","subscribeRepliesThread","updateMessage","makeEdited","edited","makeSponsored","MessageRender","chatType","editedSpan","sponsoredSpan","isSponsored","sponsored","isMessage","views","postAuthor","post_author","postViewsSpan","channelViews","edit_date","edit_hide","timeSpan","clonedArgs","renderReplies","bubbleContainer","messageDiv","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","replyToPeerId","originalMessage","originalPeerTitle","titlePeerId","originalMessageFwdFromId","needUpdate","replyMid","getElementByPoint","horizontalSide","reflowScrollableElement","SEND_WHEN_ONLINE_TIMESTAMP","INTERNAL_LINK_TYPE","PopupJoinChatInvite","chatInvite","request_needed","importChatInvite","savePhoto","peopleCount","ReactionElement","reactionCount","_reactionCount","setCanRenderAvatars","canRenderAvatars","doNotRenderSticker","hadStickerContainer","getReaction","callbackify","center_icon","renderDoc","wrapPromise","wrapStickerPromise","renderCounter","displayOn","renderAvatars","recentReactions","peer_id","setIsChosen","isChosen","chosen_order","fireAroundAnimation","REACTION_INLINE_SIZE","REACTION_BLOCK_SIZE","around_animation","iconPlayer","aroundPlayer","removeOnFrame","REACTIONS_ELEMENTS","ReactionsElement","middlewareHelpers","onConnectCallback","getReactionCount","reactionElement","getMessage","isPlaceholder","changeMessage","changedResults","hasReactions","counts","reactionsEqual","totalReactions","can_see_list","recent_reactions","handleChangedResults","ScrollSaver","getSaved","findElements","replaceSaved","findAndSetElements","_save","scrollHeightMinusTop","onRestore","useReflow","setScrollTop","newScrollTop","restore","_restore","previousScrollHeightMinusTop","SuperIntersectionObserver","observing","observingQueue","freezedObservingNew","toggleObservingNew","isMentionUnread","mentioned","accumulate","stringResults","numberResults","replaceNonNumber","CARD_BRAND_REGEXP","visa","mastercard","amex","discover","diners","diners14","jcb","unionpay","elo","mir","CARD_BRANDS","minLength","cvcMaxLength","cvcMinLength","unknown","detectCardBrand","card","sanitizedCard","brand","detectUnifiedCardBrand","createArray","delta","buggedRegExp","getDistanceFromBuggedToNormal","fixBuggedNumbers","makeOptionalCharacter","consumed","makeRequiredCharacter","partial","wrapCharacterRegExpFactory","optional","_regExp","makeCharacter","makeMonthDigitPatternCharacter","digit","capitalCharacter","cleanedResult","formattingCharacter","str1","makeFormattingCharacter","optionalPattern","spaceCharacter","yearOptionalPattern","sixteenPattern","fifteenPattern","requiredPostcodes","generateFourPattern","cardFormattingPatterns","cardNumber","cardExpiry","cardCvc","cardCvcFromBrand","postalCodeFromCountry","optionalDigits","accumulateLengths","strs","nbspRegExp","makeValidationError","validateCardNumber","sanitized","getCardInfoByNumber","ignoreIncomplete","validateCompleteCardNumber","makeCardNumberError","validateCardExpiry","monthStr","yearStr","_year","nextMonth","isNaN","validateExpiry","parse","TelegramWebView","sandbox","onTelegramWebViewEvent","eventType","eventData","onMount","contentWindow","createVerificationIframe","allow","PopupPaymentVerification","openPathAfter","telegramWebView","path_full","InputFieldCorrected","lastKeyDown","lastTransformed","getPattern","pushRest","autocorrectComplete","character","getCharacter","meta","formatInputValueByPattern","formatMethod","transformedValue","validateNew","onBlur","justReturn","validateMethod","validateAnyIncomplete","errorKeys","handleInputFieldsOnChange","_onChange","createCountryZipFields","zip","countryInputField","postcodeInputField","SUPPORTED_NATIVE_PROVIDERS","PopupPaymentCard","paymentForm","savedCard","native_provider","cardOut","token","credentials","can_save_credentials","cardSection","nativeParams","native_params","lastBrand","lastBrandImg","brandIconTempId","cardInputField","invalid","incomplete","transformed","getPaymentBrandIconPath","setBrandIcon","cvcInputField","need_cardholder_name","expireInputField","switchFocusOrder","previousInputField","nextInputField","inputFieldsRow","billingSection","need_country","need_zip","canSave","saveCheckboxField","saveRow","payButton","PaymentButton","expiryFull","expiryMonth","expiryYear","cvc","cardholderName","nativeProvider","URLSearchParams","headers","publishable_key","expiration_month","expiration_year","security_code","public_token","PopupPaymentCardConfirmation","inputCheckPassword","getInputCheckPassword","tmpPassword","password","handled","PopupPaymentShipping","inputInvoice","savedInfo","saved_info","addressSection","address1InputField","address2InputField","cityInputField","stateInputField","receiverSection","emailInputField","shipping_address_requested","name_requested","email_requested","phone_requested","validateEmail","validatePhone","selectedCountry","shipping_address","street_line1","street_line2","city","country_iso2","post_code","requestedInfo","validateRequestedInfo","shippingAddress","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_CITY_INVALID","ADDRESS_STATE_INVALID","ADDRESS_POSTCODE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_EMAIL_INVALID","REQ_INFO_PHONE_INVALID","focusField","PopupPaymentShippingMethods","shippingOption","shipping_options","prices","lastShippingId","option","PopupPayment","isReceipt","tipButtonsMap","confirmed","onConfirmed","popupPaymentVerification","mediaInvoice","receipt_msg_id","isTest","itemEl","detailsClassName","photoEl","linesClassName","linesEl","botName","preloaderContainer","getPaymentReceipt","getPaymentForm","savedCredentials","saved_credentials","lastRequestedInfo","providerPeerTitle","provider_id","wrapAmount","isRecurring","recurring","peerTitle2","makeLabel","pricesClassName","makePricesElements","price","_label","wrappedAmount","pricesElements","getTipsAmount","shippingAmount","setTotal","totalAmount","totalLabel","payI18n","canTip","max_tip_amount","tip_amount","tipsClassName","getInputValue","setInputWidth","setInputValue","unsetActiveTip","tipEl","tipsLabel","haveToIgnoreEvents","ignoreNextSelectionChange","tipsEl","tipClassName","tipButtons","suggested_tip_amounts","tipAmount","prevTipEl","setRowIcon","setRowTitle","setCardSubtitle","methodRow","onMethodClick","previousCardDetails","previousToken","credentials_title","providerRow","providerAvatar","shippingAddressRow","shippingNameRow","shippingEmailRow","shippingPhoneRow","shippingMethodRow","lastShippingOption","onShippingAddressClick","onShippingMethodClick","setShippingTitle","postAddress","setShippingInfo","setShippingOption","scrollSaver","lastShippingPricesElements","shipping","acceptTermsCheckboxField","recurring_terms_url","acceptTermsRow","recurringElements","lastTmpPasword","missingInfo","tmp_password","paymentResult","sendPaymentForm","form_id","_passwordState","valid_until","tsNow","Layouter","minWidth","spacing","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","ComplexLayouter","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","RectPart","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","cropRatios","attempts","multiHeight","sum","pushAttempt","lineCounts","heights","second","third","fourth","optimalAttempt","optimalDiff","attempt","lineCount","minLineHeight","bad1","bad2","optimalCounts","optimalHeights","rowCount","colCount","col","prepareAlbum","widthItem","heightItem","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","wrapAlbum","attachmentDiv","uploading","containerHeight","hasSpoiler","itemWidth","itemHeight","AppPollResultsTab","resultsDiv","appPollsManager","getPoll","quiz","voters","total_voters","roundPercents","answer","answers","answerEl","answerTitle","answerPercents","getVotes","votesList","votes","vote","lineTotalLength","minIndex","minRemainder","maxRemainder","pollElement","isClosed","performResults","chosenIndexes","PollElement","setMaxLength","resizePolls","hideQuizHint","onHide","prevQuizHint","prevQuizHintOnHide","prevQuizHintTimeout","isListenerSet","isQuiz","isRetracted","isPublic","isMultiple","chosingIndexes","sentVote","MAX_LENGTH","MAX_OFFSET","svgLines","setLineProgress","descKey","public_voters","multiple_choice","multipleSelect","descDiv","typeDiv","avatarsDiv","close_period","close_date","timeLeftDiv","quizTimer","circumference","closeTime","quizInterval","timeLeft","getResults","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","initQuizHint","solution","solution_entities","toggleHint","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","sendVote","recent_voters","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","getPercentValue","iterate","fullTime","votersCount","rtlChars","justRtlDirCheck","IGNORE_ACTIONS","TEST_SCROLL_TIMES","TEST_SCROLL","PEER_CHANGED_ERROR","BIG_EMOJI_SIZES","BIG_EMOJI_SIZES_LENGTH","getMainMidForGrouped","ChatBubbles","unreadOut","bubblesNewByGroupedId","bubblesNew","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","messagesQueueOnRenderAdditional","firstUnreadBubble","followStack","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","renderingMessages","bubblesToEject","bubblesToReplace","setPeerTempId","renderNewPromises","extendedMediaMessages","unreadedObserverCallback","onUnreadedInViewport","viewsObserverCallback","sendViewCountersDebounced","sponsoredMessage","randomId","random_id","viewSponsoredMessage","stickerEffectObserverCallback","onBubblesMouseMove","unhoverPrevious","hoverBubble","hoverReaction","setHoverVisible","stickerWrapper","getGroupsFirstMessage","getAvailableReactionsByMessage","select_animation","sendReaction","onBubblesClick","setInnerPeer","chatInner","onDatePick","contactDiv","callDiv","callUser","getInputInvoiceByPeerId","reactionsElement","stickerEmojiEl","bubbleMid","reply_to_top_id","saved_from_msg_id","openThread","message1","getMessageWithReplies","getDiscussionMessage","via","setDraft","peerIdStr","documentDiv","groupedItem","SINGLE_MEDIA_CLASSNAME","isSingleMedia","hasAspecter","albumItem","isReplyClick","replyToMid","reply_to_msg_id","scrollDimensions","forceDown","sliceViewportDebounced","setCorrectIndexThrottled","setStickyDateManually","setPeerPromise","processBatch","loadQueue","filterQueue","avatarPromises","groupBubbles","updatePosition","timePromises","groupCollapsed","groupEnd","setUnreadDelimiter","restoreScroll","prepareToSaveScroll","ejectBubbles","oldBubble","bubbleGroups","updatePlaceholderPosition","requestHistory","setMessageId","constructBubbles","sequential","messagesStorageKey","messagesQueuePromise","newItem","_items","scrollingToBubble","scrollToEnd","deleteMessagesByIds","tempMessage","_bubble","groupedId","getMessagesByAlbum","reactionsElements","repliesElement","newDiv","safeRenderMessage","scrollToBubbleIfLast","deletedMids","wasMainMid","mainMid","createScrollSaver","appendReactionsElementToBubble","dateMessage","dateBubble","previousStickyDate","sliceViewport","setScroll","attachContainerListeners","highlightBubble","replyAfter","swipeAvatar","shouldReply","canSend","_target","_swipeAvatar","initMessageReply","constructPeerHelpers","updateGradient","setUnreadCount","updateUnreadByDialog","finishPeerChange","reloadMessages","toDelete","postViewsElements","different","postViews","incrementMessageViews","getScheduledMessagesStorage","createResizeObserver","resizeObserver","wasHeight","skip","scrolled","onResizeEnd","setEndRAF","ResizeObserver","contentRect","realDiff","_part","needScrollTop","destroyResizeObserver","setReactionsHoverListeners","getRenderedLength","readUnreaded","readPromise","idleController","bubblesMaxId","getHistoryMaxId","readContents","onGoDownClick","getBubbleByPoint","getGroupedBubble","groupId","getMidsByAlbum","findNextMountedBubbleByMsgId","filterCallback","_mid","foundMid","loadMoreHistory","getHistoryTopPromise","getHistoryBottomPromise","getHistory1","destroyScrollable","getHistoryStorage","readMaxId","readOutboxMaxId","msgId","destroyBubble","permanent","ignoreOnScroll","pollExtendedMediaMessages","getExtendedMedia","setExtendedMediaMessagesPollInterval","pollExtendedMediaMessagesPromise","setTopPadding","setPaddingTo","isPaddingNeeded","unsetPadding","newMessage","getLastBubble","performHistoryResult","scrollToBubbleEnd","scrollToBubble","isChangingHeight","messageInput","dimensions","datasetKey","createDateBubble","bubbleContent","serviceMsg","fakeBubble","bubblesToo","cleanupPlaceholders","attachedUnreadBubble","fetchNewPromise","getSponsoredMessagePromise","onAnimateLadder","resolveLadderAnimation","attachPlaceholderOnRender","emptyPlaceholderBubble","samePeer","stack","startParam","onChangePeer","getPinnedMessagesMaxId","isTarget","followingUnread","savedPosition","overrideAdditionMsgId","getChatSavedPosition","getReadMaxIdIfUnread","foundSlice","findSliceOffset","isJump","isStartButtonNeeded","setStartParam","setQueueId","messageEntityBotCommand","isBot","additionMsgId","maxBubbleId","oldChatInner","oldPlaceholderBubble","haveToScrollToBubble","fromUp","scrollFromDown","scrollFromUp","willScrollOnLoad","setPeerOptions","waitPromise","setPeerCached","mountedByLastMsgId","isPinnedMessagesNeeded","setCorrectIndex","lastBubble","onRenderScrollSet","afterSetPromise","setFetchReactionsInterval","setFetchHistoryInterval","onScrolledAllDown","isForumTopic","unread_mark","fetchReactions","getMessagesReactions","needFetchInterval","isFetchIntervalNeeded","historyMaxId","canWrite","renderMessagesQueue","isAvatarNeeded","additionalCallback","processResult","newBubble","originalPromise","renderMessage","albumMids","reactionsMessage","albumMessages","albumMustBeRenderedFull","our","isOurMessage","contentWrapper","isInUnread","ignoreAction","chat_id","is_single","messageMessage","needToSetHTML","bigEmojis","emojiEntities","strLength","curr","richText","canHaveTail","isStandaloneMedia","haveRTLChar","topicNameButtonContainer","replyMarkup","reply_markup","replyMarkupRows","containerDiv","rowDiv","buttonEl","botId","same_peer","checkSwitchReturn","switchInlineQuery","button_id","handleUrlAuth","buttonId","haveButtons","column","callbackButtonClick","callbackAnswer","messageWithReplies","getMessageWithCommentReplies","withReplies","isOutMessage","nameContainer","canHideNameIfMedia","isMessageEmpty","viewButton","processingWebPage","telegram_channel","telegram_megagroup","telegram_bot","makeViewButton","quote","previewResizer","preview","quoteTextDiv","strong","titleDiv","textDiv","isSquare","isEmoji","nopremium","newNameContainer","richTextFragment","getMidsByMid","wrapGroupedDocuments","lastContainer","contact","contactDetails","contactNameDiv","fullName","contactNumberDiv","phone_number","wrapPoll","extendedMedia","isAlreadyPaid","isNotPaid","innerMedia","wrappedPrice","priceEl","video_duration","videoTime","dc_id","file_reference","before","needName","titleVia","mustHaveName","isHidden","isForward","goto","generateTail","documentContainer","documentMessageDiv","viewportSlice","deleteViewportSlice","historyResult","needReflowScroll","setLoadedPromises","firstSlice","lastSlice","both","processLocalMessageRender","ackedResult","getScheduledMessages","animateAsLadder","additionMsgIds","isAdditionRender","targetMid","sortedMids","topIds","middleIds","bottomIds","setBubbles","lastMsDelay","elementsToAnimate","transitionDelay","topRes","middleRes","bottomRes","delays","renderEmptyPlaceholder","listElements","getRestrictionReasonText","getGreetingSticker","channel_post","start_param","chat_invite","chat_invite_hash","JOIN_CHAT","invite","processInternalLink","creator","isWaitingForAnimation","noTransition","setOn","generateLocalMessageId","addOffset","generateLocalFirstMessage","service","saveMessages","ignoreScrollSaving","invisible","checkPlaceholders","toggleSponsoredMessage","renderBotPlaceholder","checkIfEmptyPlaceholderNeeded","getSponsoredMessage","sponsoredMessages","messagePromise","_log","getProfile","processPromise","bot_info","botInfo","description_document","description_photo","isBackLimit","resultPromise","isFirstMessageRender","serviceStartMessageId","getThreadServiceMessageId","sup","_promise","mustBeCount","PopupPinMessage","unpin","canUnpin","canPinMessage","oneSide","unpinAllMessages","hidePinnedMessages","updatePinnedMessage","buttonText","getPinnedMessagesCount","pinButtonText","isSelectionEmpty","selectionRange","START_TO_END","preloadAnimatedEmojiSticker","PopupReportMessagesConfirm","reportMessages","STICKER_EMOJI","PopupReportMessages","preloadStickerPromise","marginTop","PopupSponsored","PopupReactedList","canViewReadParticipants","canViewMessageReadParticipants","loaders","hasAllReactions","createFakeReaction","hasReadParticipants","readUserIds","getMessageReadParticipants","chatlist","skipReadParticipants","skipReactionsList","getMessageReactionsListAndReadParticipants","combined","getReactionCached","allReactionsSticker","REACTIONS_CLASS_NAME","REACTION_CLASS_NAME","CAN_USE_TRANSFORM","ChatReactionsMenu","reactionsMap","players","onScrollProcessItem","reactionDiv","appear","widthContainer","reactionsContainer","reactionsScrollable","renderReaction","setVisible","canUseAnimations","scaleContainer","appearWrapper","appear_animation","selectLoadPromise","selectPlayer","REACTION_SIZE","ChatContextMenu","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","isOverBubble","isTargetAGroupedItem","viewerPeerId","canOpenReactedList","linkToMessage","getUrlToMessage","selectedMessagesText","getSelectedMessagesText","menuPadding","reactionsMenu","reactionsMenuPosition","isReactionsMenuVisible","offsetSize","nextVisiblePart","MIN_NEXT_VISIBLE_PART","minSize","onSendScheduledClick","onReplyClick","onFaveStickerClick","unfave","faveSticker","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","setButtons","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","canEditMessage","getMessageFromStorage","canSaveMessageMedia","isGoodType","hasTarget","localName","emojiInputsPromise","getUniqueCustomEmojisFromMessage","filterUnique","viewsButton","isViewingReactions","participantsCount","reactedLength","i18nElem","fakeText","AVATAR_SIZE","MAX_AVATARS","PADDING_PER_AVATAR","reactionsCount","fakeElem","readParticipants","totalSize","emojisButton","setPadding","inputsPromise","getCachedCustomEmojiDocuments","getCustomEmojiDocuments","threadMessage","SendMenu","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","setPeerId","PopupCreatePoll","onSubmitClick","send","radioLabel","isEmpty","questions","appendMoreField","correctAnswers","optionInputFields","questionInputField","sendSilent","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","getFilledAnswers","quizSolution","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","sendOther","getMessageSendingParams","helperType","clearHelper","questionField","createPosterFromMedia","getGifDuration","arrayBuffer","USELESS_REG_EXP","InputFieldAnimated","updateInnerHTML","onFakeInput","inputFake","setHeight","currentHeight","onChangeHeight","currentPopup","getCurrentNewMediaPopup","PopupNewMedia","willAttachType","ignoreInputValue","messageInputField","attachFile","willAttach","shouldCompress","itemDiv","defineNotNumerableProperties","attachMedia","attachDocument","sendFileDetails","captionMaxLength","captionLengthMax","changeType","hasAnyMedia","changeGroup","canGroupSomething","changeSpoilers","canToggleSpoilers","isMedia","wasInputValue","attachFiles","applyMediaSpoiler","removeMediaSpoiler","noAnimation","widthStr","heightStr","containerWidthStr","containerHeightStr","strippedBytes","appendDrops","mediaCount","mediaWithSpoilers","addFiles","toPush","_file","lastModified","sendingParams","sendFileParams","sendText","scaledBlob","sendAlbum","replyToMsgId","modifyMimeTypeForTelegram","scaleImageForTelegram","convertWebp","PHOTO_SIDE_LIMIT","objectURL","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onseeked","onerror","createPosterFromVideo","scaled","isPhoto","isAudio","onRender","foundPhotos","foundVideos","foundFiles","appendMediaToContainer","firstType","oldSendFileDetails","albumContainer","oldParams","HANDLE_EVENT","ACTIVE_CLASS_NAME","AXIS_Y_KEYS","AXIS_X_KEYS","attachListNavigation","waitForKey","waitForKeySet","keyNames","getCurrentTarget","setCurrentTarget","hadTarget","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","attached","resetTarget","_onKeyDown","AutocompleteHelper","onVisible","listType","attachNavigation","controller","addHelper","toggleListNavigation","fromController","skipAnimation","hideOtherHelpers","StickersHelper","onChangeScreen","checkEmoticon","getStickersByEmoticon","getMinDate","getMaxDate","PopupSchedule","canSendWhenOnline","btnSendWhenOnline","EmojiHelper","chatInput","onEmojiSelected","checkQuery","firstChar","getBothEmojiKeywords","searchEmojis","AutocompletePeerHelper","doNotShow","listElement","BASE","BASE_CLASS_LIST_ELEMENT","processPeerFullForCommands","botInfos","commands","command","indexObject","CommandsHelper","getReadyToSend","sendMessage","AutocompleteHelperController","preserveHelper","MentionsHelper","insertAtCaret","topMsgId","trimmed","getMentions","ReplyKeyboard","onBodyTouchStart","btnHover","checkAvailability","checkForceReply","touchListener","sendContact","getReplyMarkup","getHistoryStorageTransferable","InlineHelper","queryId","queryAndResultIds","generateQId","resultId","sendInlineResult","_checkQuery","botResults","query_id","gifsMasonry","isGallery","gallery","noCommands","dcId","switch_pm","btnSwitchToPM","switchToPM","ChatBotCommands","setUserId","modifyAckedResult","acked","modifyAckedPromise","ChatSendAs","sendAsButtons","previousAvatar","onSendAsMenuToggle","updateButtons","sendAsPeerId","changeSendAsPeerId","executeButtonsUpdate","sendAsPeerIds","saveDefaultSendAs","updateAvatar","getDefaultSendAs","getChannelFull","channelFull","default_send_as","updateManual","updatingPromise","wasSkippingAnimation","auto","getSendAs","sendAsPeers","sendAsPeer","premium_required","addedListener","hasMarkupInSelection","commonAncestor","SHOW_ELEMENT","POSTING_MEDIA_NOT_ALLOWED","ChatInput","lastUrl","lastTimeType","replyElements","willSendWebPage","recordCanceled","recordStartTime","lockRedo","canRedoFromHTML","undoHistory","executedHistory","canUndoFromHTML","onCancelRecordClick","recorder","opusDecodeController","onEmoticonsOpen","toggleClass","btnToggleEmoticons","onEmoticonsClose","isUserOnlineVisible","openScheduled","prepareDocumentExecute","undoRedo","needHTML","sameHTMLTimes","currentHTML","handleMarkdownShortcut","formatKeys","markupTooltip","applyMarkdown","showLinkEditor","onMessageInput","markdownEntities","parseMarkdown","urlEntities","getWebPagePromise","appWebPagesManager","getWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","botCommands","resetCurrentFontFormatting","updateBotCommandsToggle","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","onBtnSendClick","forwarding","restricted","voice_messages_forbidden","releaseMediaPlayback","setRecording","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","ms","recordTimeEl","needReturn","getCurrentInputAsDraft","no_webpage","draftsAreEqual","onHelperClick","forwardElements","rowsWrapperWrapper","rowsWrapper","fakeRowsWrapper","fakeSelectionWrapper","goDownBtn","controlContainer","iconBtn","cancelBtn","onHideAuthorClick","isChangingAuthor","onHideCaptionClick","forwardButtons","canToggleHideAuthor","hideSender","showCaption","hideCaption","changePeer","changeForwardRecipient","forwardBtnMenu","forwardWasDroppingAuthor","replyTitle","forwardHover","modifyArgs","newMessageWrapper","replyInTopicOverlay","inputMessageContainer","goDownUnreadBadge","goMentionBtn","goMentionUnreadBadge","goToNextMention","btnScheduled","btnToggleReplyMarkup","replyKeyboard","botCommandsToggle","scaler","botCommandsIcon","attachMenuButtons","fileInput","attachMenu","attachMenuBots","appAttachMenuBotsManager","getAttachMenuBots","attachMenuBotsButtons","attachMenuBot","getAttachMenuBotIcon","requestWebView","webViewResultUrl","SANDBOX_ATTRIBUTES","verifyMap","attachMenuPeerTypeSameBotPM","attachMenuPeerTypeBotPM","attachMenuPeerTypePM","attachMenuPeerTypeChat","attachMenuPeerTypeBroadcast","peer_types","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","saveDraft","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","onstop","ondataavailable","typedArray","dataBlob","sendFile","isVoiceMessage","botStartBtn","toggleBotStartBtnDisability","startBot","pinnedControlBtn","originalChat","pinnedMessageContainer","_center","neededFakeContainer","fakeWrapperTo","oldFakeWrapperTo","fakeSelectionRect","fakeRowsRect","scale","initTranslateX","getNeededFakeContainer","isReplyInTopicOverlayNeeded","hasMentions","syncDraft","helperToo","clearInput","fromUpdate","getDraft","wrappedDraft","myEntities","apiEntities","wrapDraft","currentDraft","createSendAs","firstChange","sendAs","updateOffset","getPlaceholderKey","updateMessageInputPlaceholder","previousSendAs","ackedPeerFull","ackedScheduledMids","setSendAsCallback","filteredAttachMenuButtons","filterAttachMenuButtons","placeholderKey","hasBotCommands","updateBotCommands","updateMessageInput","haveSomethingInControl","isAnonymousSending","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","APP_TABS","CHAT","readAllHistory","commandsMap","canCombine","hasMarkup","executed","resetCurrentFormatting","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","AUTO_COMPLETE_REG_EXP","matchIndex","foundHelper","checkInlineAutocomplete","setPreloaderShow","btnPreloader","inlineMatch","bot_inline_placeholder","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","getValueAndEntities","clearReply","unicode","pushRecentEmoji","dropAuthor","dropCaptions","isDroppingCaptions","sendMessageWithDocument","hideCaptionCheckboxField","replyFragment","initMessagesForward","fromPeerIdsMids","fromPeerIds","smth","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","newReply","intl","peerTitleEl","_message","setReplyToMsgId","callerFunc","replyParent","oldReply","haveReply","CLASSNAME_BASE","PinnedContainer","floating","divAndCaption","wrapperUtils","attachOnCloseEvent","needClose","setFloating","setUtilsWidth","BAR_HEIGHTS","ChatAudio","onPlaybackParams","fasterEl","repeatEl","toggleEl","onStop","onMediaPlay","isMusic","prevEl","nextEl","attachClick","volumeProgressLineContainer","tunnel","progressWrapper","playingDetails","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","clipPathId","markTranslateY","trackTranslateY","mark","AnimatedSuper","getRow","clearRow","clearRows","currentIndex","DURATION","setNewRow","reflow","previousIndex","fromTop","ignorePrevious","previousRow","AnimatedCounter","previousNumber","getDecimal","animatedSuper","decimal","hideLeft","previousDecimalNumber","EMPTY_INDEX","setCount","previousByDecimal","decimalNumber","ChatPinnedMessage","pinnedMaxMid","pinnedMid","pinnedIndex","wasPinnedIndex","wasPinnedMediaIndex","waitForScrollBottom","loadedBottom","loadedTop","scrollDownListenerSetter","getCurrentIndexPromise","isStatic","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","setScrollDownListener","isDown","handleScrollSideEvent","refreshPosition","handleFollowingPinnedMessage","followPinnedMessage","isLast","writeTo","writeMediaTo","ChatTopbar","verifyButtons","isMenuOpen","btnMore","buttonsToVerify","menuButtons","verifyVideoChatButton","currentGroupCall","groupCall","verifyCallButton","getCachedFullUser","phone_calls_available","video_calls_available","onJoinGroupCallClick","joinGroupCall","resize","setUtilsRAF","chatUtils","chatAudio","setPeerStatusManual","btnBack","chatInfoContainer","chatInfo","person","avatarElement","deleteButtonText","btnJoin","btnPinned","btnCall","btnGroupCall","btnMute","btnSearch","pushButtonToVerify","onBtnBackClick","isFirstChat","constructUtils","linked_chat_id","onCallClick","chatContextMenuHintWasShown","contactPeerId","getAttachMenuBot","has_settings","constructAvatar","joinChannel","setMutedState","isTopMessage","hiddenPinnedMessages","byCurrent","setTitleCallback","setStatusCallback","setTitleManual","canHaveSomeButtons","wasAlreadyUsed","newPinnedMessage","AppPrivateSearchTab","appSearch","btnPickDate","ChatSearch","selectedIndex","onResultsClick","selectResult","onFooterClick","onUpClick","onDownClick","foundCountEl","upBtn","downBtn","footer","dateBtn","renderedCount","ChatBackgroundPatternRenderer","canvases","INSTANCES","renderToCanvas","fillCanvas","crossOrigin","imageBitmap","objectUrl","imageWidth","imageHeight","patternHeight","mask","centerY","topY","endY","bottomY","setCanvasDimensions","originalHeight","Chat","backgroundEl","backgroundTempId","sharedMediaTabs","setBackground","patternRenderer","gradientCanvas","previousGradientRenderer","previousPatternRenderer","previousPatternCanvas","isDarkPattern","getInstance","_gradientRenderer","setBackgroundPromise","setType","freezeObservers","beforeDestroy","cleanupBackground","destroySharedMediaTab","searchTab","_isAnyGroup","setAutoDownloadMedia","getForumTopicOrReload","isSamePeer","bubblesSetPeerPromise","photoSizeMax","videoSizeMax","fileSizeMax","photo_size_max","video_size_max","getAutoDownloadSettingsByPeerId","callbacksPromise","ignoreThreadId","historyStorageTransferable","historySerialized","MarkupTooltip","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","matchUrlProtocol","getActiveMarkupButton","currentMarkups","markup","activeButtons","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","isFirstShow","setMouseUpEvent","handleSelection","ChatDragAndDrop","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","setPath","sizeX","sizeY","disableTransition","LineBlobDrawable","maxRadius","minRadius","N","radiusNext","speed","generateBlob","radDif","generateNextBlob","amplitude","speedScale","paint","pinnedTop","progressToPinned","r1","progressNext","x1","x2","cx","y1","y2","bezierCurveTo","WeavingState","stateId","createGradient","shader","getGradientFromType","x0","y0","dt","TopbarWeave","handleDevicePixelRatioChanged","setSize","forceUpdate","resizeHandler","resizeCanvas","invokeDraw","handleFocus","focused","handleBlur","lbd","lbd1","lbd2","currentState","previousState","progressToState","lastUpdateTime","animateToAmplitude","animateAmplitudeDiff","amplitude2","animateAmplitudeDiff2","top1","top2","paint1","setCurrentState","states","componentDidMount","matchMedia","setAmplitude","componentWillUnmount","setCanvasSize","RLottieIconItemPart","playPart","RLottieIconItem","createPart","initFrame","skipFirstFrameRendering","inverseColor","onLoadForColor","onLoadForPart","getPart","RLottieIcon","startFrame","endFrame","frameCount","SuperRLottieIcon","partState","colorState","getColor","partCallback","changedPartState","changedColorState","setPartState","setColorState","prevState","renderIfPaused","invoke","GroupCallMicrophoneIcon","GROUP_CALL_MICROPHONE_BUTTON_STATE","partName","HAND","MUTED","UNMUTED","GroupCallParticipantMutedIcon","colored","GROUP_CALL_PARTICIPANT_MUTED_STATE","colorStr","MUTED_FOR_ME","MUTED_BY_ADMIN","propertyValue","getColorByMutedState","generateEqualParts","clearMutedStateModifier","GroupCallParticipantStatusElement","element2","actionClassName","GroupCallParticipantsList","getParticipantByPeerId","onElementDestroy","getGroupCallParticipantMutedState","mutedIcon","callVideoCanvasBlur","GroupCallParticipantVideoElement","setPinned","setParticipant","groupCallParticipantMutedIcon","groupCallParticipantStatus","updateParticipant","GroupCallParticipantsVideoElement","participantsElements","groupCallId","setElementDisplay","pinnedSource","pinSource","unpinAll","setInstance","shouldDisplayElement","displayPinned","shouldDisplay","hasAnyVideo","participantElements","participantVideo","getVideoElementFromParticipantByType","_onLengthChange","GroupCallParticipantContextMenu","onOpenProfileClick","PopupGroupCall","targetPeerId","toggleParticipantMuted","editParticipant","canManageCall","can_self_unmute","muted_by_you","kickFromChat","getContainer","GroupCallParticipantsElement","groupCallParticipantsVideo","appGroupCallsManager","getGroupCallParticipants","GroupCallDescriptionElement","descriptionIntl","GroupCallTitleElement","makeButton","_className","buttonDiv","isConfirm","resizeHandlerClassName","MovableElement","fixDimensions","fixPosition","addResizeHandlers","setSwipeHandler","destroyElements","handlers","startTop","startLeft","startWidth","startHeight","resizingSide","isEnlarging","resizeDiff","maxPossible","setPositionToCenter","MovablePanel","toggleMovable","movable","movableOptions","toggleClassName","raise_hand_rating","onFullScreenClick","onToggleControls","buttonsContainer","onVideoClick","btnVideo","toggleVideoSharing","onScreenClick","btnScreen","toggleScreenSharing","toggleMuted","changeRaiseHand","onLeaveClick","hangUp","discard","toggleBigLayout","btnFullScreen","btnExitFullScreen","wasFullScreen","movablePanel","videosCount","wasBig","btnInvite","btnShowColumn","toggleRightColumn","btnFullScreen2","headerInfo","newHeader","newHeaderInfo","newHeaderTitle","btnHideColumn","videosScrollable","groupCallTitle","groupCallDescription","groupCallBodyHeaderDescription","constructButtons","groupCallParticipants","updateInstance","setHasPinned","groupCallMicrophoneIcon","_makeButton","microphoneIcon","btnLeave","setDescription","microphoneButtonState","getGroupCallMicrophoneButtonState","micState","CallDescriptionElement","connectionState","connectedAt","GroupCallMicrophoneIconMini","INIT_STATE","PopupCall","resizeVideoContainers","videoContainers","interlocutorUserId","emojisSubtitle","partyStates","partyMutedState","stateText","constructFirstButtons","constructSecondButtons","wasTryingToJoin","movableElement","controlsHover","getCallInstance","firstButtonsRow","muteI18nElement","secondButtonsRow","declineI18nElement","btnDecline","btnAccept","acceptCall","createVideoContainer","isPendingIncoming","isSharingVideo","isSharingScreen","outputState","getMediaState","oldContainers","mediaState","getVideoElement","hasFrame","hasPromise","videoState","screencastState","videoContainer","output","getEmojisFingerprint","popupWidth","MAX_WIDTH_PX","MAX_HEIGHT_PX","MAX_SIZE","biggestSideSize","widthRatio","heightRatio","TopbarCall","onState","amplitudes","weave","clearCurrentInstance","currentDescription","instanceListenerSetter","isChangingInstance","callDescription","convertCallStateToGroupState","groupCallMicrophoneIconMini","throttledMuteClick","weaveContainer","uiNotificationsManager","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","faviconElements","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","novibrate","nopreview","nopush","needPush","webPushApiManager","registeredDevice","nosound","requestPermission","Notification","mozVibrate","webkitVibrate","setAppBadge","notificationsUiSupport","notifySoundEl","topMessagesDeferred","toggleToggler","peerString","soundReset","unreadUnmutedPeerIds","tokenData","unregisterDevice","registerDevice","notificationData","custom","hasChat","hasUser","buildNotification","fwdCount","peerReaction","peerTypeNotifySettings","notification","getPeerString","notificationMessage","wrappedMessage","noIncrement","notificationFromPeerId","peerPhoto","loadAvatar","resetTitle","isBlink","setFavicon","titleInterval","textBaseline","textAlign","prevFavicon","testSound","permission","appRuntimeManager","onclose","getLocalSettings","nextSoundAt","prevSoundVolume","filename","token_type","tokenType","tokenValue","other_uids","app_sandbox","secret","getFilesFromEvent","onlyTypes","scanFiles","isDirectory","directoryReader","createReader","readEntries","itemFile","getAsFile","DataTransferItem","DragEvent","dataTransfer","webkitGetAsEntry","addAnchorListener","protocol","noCancelEvent","pathnameParams","uriParams","u","host","noPathnameParams","noUriParams","parseUriParams","AppImManager","columnEl","offline","updateStatusInterval","cacheStorage","saveState","onHashChangeUnsafe","tgaddr","openUrl","postId","openUsername","userName","setSettings","messagesTextSize","forceRenderAfterSize","chatsSelectTabDebounced","toggleChatGradientAnimation","onDocumentPaste","attachType","newMediaPopup","_types","canDrag","backgroundPromises","CHATLIST","updateStatus","emojiAnimationContainer","appendEmojiAnimationContainer","createNewChat","chatsSelectTab","getPremium","compareVersion","deleteFilesIterative","applyCurrentTheme","resizeInstances","saveChatPosition","choosing","setChoosingStickerTyping","typing","onInstanceDeactivated","isUpdated","receiptMessage","onSpoilerClick","spoilerTimeout","stateStorage","topbarCall","discardCurrentCall","currentCall","setAuthorized","telegramMeWebManager","hashtag","STICKER_SET","EMOJI_SET","makeLink","INVOICE","VOICE_CHAT","USER_PHONE_NUMBER","thread","PRIVATE_POST","channel","comment","getStackFromElement","MESSAGE","attachKeydownListener","handleAutologinDomains","checkForShare","share","foundMedia","openWindow","onUrlAuthResult","urlAuthResult","botPeerTitle","logInCheckbox","allowMessagesCheckbox","request_write_access","confirmationPromise","logInChecked","allowMessagesChecked","acceptUrlAuth","onUrlAuthResultAccepted","requestUrlAuth","_appConfig","onAnchorClick","url_auth_domains","autologin_token","autologin_domains","originalUrl","searchParams","possibleBubble","timeoutOperation","requests","request","isBad","activatingChat","screen","IGNORE_KEYS","isSelectionCollapsed","getFirstMessageToEdit","getNextDialog","newEvent","KeyboardEvent","commentId","resolveChannel","op","checkChatInvite","saveApiChat","resolvePhone","getInputInvoiceBySlug","wrappedUrl","openComment","openPremiumBot","premium_bot_username","generateThreadServiceStartMessage","phone_calls_private","ignoreGroupCall","ignoreCall","discardGroupCallConfirmation","discardCallConfirmation","title1","title2","isClosing","getGroupCallFull","createGroupCall","setCurrentBackground","broadcastEvent","getBackground","getFile","lastBackgroundUrl","chatBubbles","chatPositions","backgroundUrl","attachDragAndDropListeners","drops","mediaDrops","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","PROFILE","onImTabChange","updateMyOnlineStatus","spliceChats","fromIndex","chatFrom","chatTo","chatIndex","existingIndex","oldChat","getTypingElement","eye","getPeerTyping","getPeerTypings","langPackKeys","multi","mapa","typingElement","descriptionElement","getChatStatus","typingEl","onlines","getOnlines","getPeerStatus","typingContainer","options1","options2","DialogColorsFg","DialogColors","DialogColorsMap","pic","peerParams","useBytes","bestPhotoSize","CallConnectionInstanceBase","connection","sources","createPeerConnection","config","RTCPeerConnection","signalingState","iceConnectionState","createDataChannel","dataChannel","createDescription","appendStreamToConference","streamManager","appendToConference","closeConnection","closeConnectionAndStream","stopStream","negotiate","negotiating","negotiateInternal","sendDataChannelData","parseSignalingData","sdp","parseMediaSectionInfo","fingerprint","ufrag","pwd","convertNumber","isSending","codec","ssrc","sourceGroups","ssrcGroups","sourceGroup","semantics","ssrcs","rtpExtensions","payloadTypesMap","getPayloadType","payloadType","clockrate","feedbackTypes","subtype","parameters","payloadTypes","CallConnectionInstance","localDescription","remoteDescription","descriptionInit","offerReceived","createAnswer","setLocalDescription","offer","createOffer","offerSent","initialSetup","sendCallSignalingData","crypto","subtle","P2PEncryptor","p2pKey","seqMap","concatSHA256","bufferConcats","encryptPrepared","msgKeyLarge","subarray","msgKey","aesKeyIv","prepareAesKeyIv","aesProcessCtr","encryptRawPacket","seq","ArrayBuffer","setUint32","sha256a","sha256b","iv","encryptedData","dataSize","encrypt","cryptoKey","constTimeIsDifferent","msgKeyEquals","decryptRawPacket","encryptedDataSize","decryptionBuffer","getUint32","ChromeP2PSdpBuilder","fingerprints","stringBuilder","streamName","addExtmap","addPayloadTypes","addSsrc","finalize","FirefoxP2PSdpBuilder","SafariP2PSdpBuilder","isFirefox","isSafari","extmap","j","fmtp","getOwnPropertyNames","pName","ssrcGroup","P2PSdpBuilder","sdpString","sdpMLineIndex","sdpMid","foundation","component","priority","relAddress","generation","tcpType","networkId","networkCost","candidate","generateOffer","generateAnswer","CallInstance","udp_p2p","udp_reflector","min_layer","max_layer","library_versions","createdAt","decryptQueue","candidates","canCreateConferenceEntry","setMediaState","sendMediaState","mediaStates","_sendMediaState","_connectionState","connectionInstance","sortIndex","findEntry","recvEntry","startScreenSharingInternal","wasStartingScreen","wasStartingVideo","requestScreen","stopVideoSharing","startVideoSharingInternal","requestInputSource","track","inputStream","getVideoTracks","stopTrack","isSharingVideoType","audioTrack","getAudioTracks","setHangUpTimeout","clearHangUpTimeout","hangUpTimeout","setPhoneCall","phoneCall","canAccept","overrideConnectionState","g_a_hash","appCallsManager","generateDh","dh","g_b","g_a","g_b_hash","getCallInput","phonePhoneCall","savePhonePhoneCall","joinCall","encryptionKey","configuration","iceServers","connections","ipv6","port","urls","turn","stun","credential","iceTransportPolicy","p2p_allowed","getRtcConfiguration","sendIceCandidate","onTrack","encryptor","decryptor","processDecryptQueue","createDataChannelEntry","dataChannelEntry","createEntry","sendEntry","negotiated","applyDataChannelData","TextEncoder","encode","iceCandidate","parsed","p2pParseCandidate","confirmCall","key_fingerprint","computeKey","emojisFingerprint","getEmojisFingerprintPromise","codePoints","unlockStreamManager","doTheMagic","getTransceivers","transceiver","getEntryByMid","bundle","sdpDescription","generateSdp","isAnswer","setRemoteDescription","onInputStream","stream","videoTrack","onMutedChange","requestAudioSource","setMuted","discardReason","discardedByOtherParty","hasVideo","discardCall","performCodec","_codec","setDataToDescription","setData","transport","screencast","filterNotVP8","vp8PayloadType","rtxIdx","apt","applyCallSignalingData","performSsrcGroups","getEntryBySource","sendRecvEntry","findFreeSendRecvEntry","setEntrySource","tryToReleaseCandidates","generateCandidate","RTCIceCandidate","addIceCandidate","decryptedData","TextDecoder","decode","signalingData","onUpdatePhoneCallSignalingData","getStreamCached","_cache","isScreen","constraints","getScreenStream","getStream","CallInstanceBase","fixSafariAudio","isSharingAudio","hasInputTrackKind","isAudioGood","isVideoGood","getAudioConstraints","getVideoConstraints","getScreenConstraints","endpoint","tryAddTrack","streams","saveInputVideoStream","isOutput","elementEndpoint","addTrack","useStream","outputStream","srcObject","sinkId","outputDeviceId","setSinkId","getTracks","addStream","CALL_STATE","audioAsset","CALL_REQUEST_TIMEOUT","CallsController","sortedInstances","createCallInstance","admin_id","g_a_or_b","bytesCmp","callId","getCallByUserId","hasConnected","hasCurrent","startCallInternal","fullInfo","participant_id","requestCall","GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX","GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS","GroupCallConnectionInstance","negotiateThrottled","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","invokeJoinGroupCall","localSdp","mainChannels","processedChannels","sectionInfo","payload","processMediaSection","audioChannel","videoChannel","useChannel","setEntryPeerId","performExtmap","filterServerCodecs","isNewConnection","originalOffer","iceRestart","hasMunged","skipAddingMulticast","mediaLine","mediaLineParts","localMLine","codecIds","newData","setPort","setSource","newSdp","addSsrcEntry","newChannel","mungedSdp","fixLocalOffer","entriesToDelete","shouldBeSkipped","answerDescription","deleteEntry","iceGatheringState","updateConstraints","sender","setParameters","getParameters","degradationPreference","colibriClass","defaultConstraints","onStageEndpoints","addInputVideoStream","GroupCallInstance","isSpeakingMap","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","getCachedParticipants","presentation","unpinSource","changeUserMuted","source_groups","createConnectionInstance","raise","raiseHand","stopScreenSharing","startScreenSharing","startScreenSharingPromise","saveApiParticipant","leaveGroupCallPresentation","videoPaused","videoStopped","startVideoSharing","startVideoSharingPromise","rejoin","isDiscarded","isUpdatingMeInCurrentCall","onParticipantUpdate","doNotDispatchParticipantUpdate","hasLeft","oldSsrcs","modifiedTypes","oldSsrc","oldSource","oldEntry","originalDirection","setEndpoint","createTransceiver","GROUP_CALL_STATE","makeSsrcsFromParticipant","makeSsrcFromParticipant","audio_source","generateSelfVideo","audioSource","GroupCallsController","setCurrentGroupCall","startConnectingSound","stopConnectingSound","joinVideo","MediaStream","createMainStreamManager","joinGroupCallInternal","handleUpdateGroupCallParticipants","updatingSdp","channelCount","constraint","mediaDevices","getSupportedConstraints","constraintSupported","skipAudio","frameRate","screenStream","getDisplayMedia","contentHint","getUserMedia","clientInfo","lookupAttributeKeys","telegramSourceGroups","sdpLines","rest","parseSourceGroups","raw","ConferenceEntry","addTransceiver","generateSsrc","LocalConferenceDescription","sessionId","maxSeenId","entriesByMid","entriesBySource","entriesByPeerId","getEntriesByPeerId","conference","SDP","mediaSections","splitStringByLimitWithRest","UniqueNumberGenerator","generate","maxTries","_try","SDPAttributeSplitted","SDPMediaLineParts","SDPLine","SDPAttributeInner","missed","exists","nestedMap","makeAttributes","innerParts","SDPAttributes","fillAttributes","attributesMap","linesArray","SDPMediaSection","isReceiving","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","isIncorrectSdpLine","parseSdpLine","addSimulcast","generator","originalSsrcs","ssrcs2","ssrcsStrLines","ssrc2","WEBRTC_MEDIA_PORT","fixMediaLineType","getConnectionTypeForMediaType","generateMediaFirstLine","payloadIds","connectionType","SDPBuilder","addCandidate","performCandidate","addHeader","sId","bundleMids","addTransport","skipCandidates","addSource","addMsid","isApplication","isInactive","hdrexts","hdrext","fbs","fb","addConference","AudioStreamAnalyser","streamSource","createMediaStreamSource","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","StreamManager","getAmplitude","streamAnalyser","analyse","ANALYSER_LISTENER","AudioContext","webkitAudioContext","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","substring","replaceInputAudio","oldTrack","timer","transceiverInit","tracks","mediaTrackType","trackIdx","replaceTrack","StringFromLineBuilder","newLine","addJoined","toTelegramSource","fromTelegramSource","rms","EMOJI_REG_EXP","getAbbreviation","onlyFirst","firstEmojiMatch","lastEmojiMatch","E","setBlankToAnchor","messageEntityTextUrl","messageEntityMentionName","isDraft","EMOJI_VERSIONS_SUPPORTED","inlineEl","newEmojiWidth","legacyEmojiWidth","isEmojiSupported","globalLazyLoadQueue","CustomEmojiElement","syncedPlayer","pausedElements","playersSynced","createCustomFiller","lastPausedVideo","middlewares","CustomEmojiRendererElement","clearedElements","WeakSet","isCanvasClean","emojiRenderers","getOffsets","offsetsMap","offsetParent","elementsArr","placeholders","isDimensionsSet","syncedPlayersFrames","isImageData","ImageData","frameWidth","frameHeight","lastChildWas","checkForAnyFrame","forceRenderAfter","renderEmojis","addCustomEmojis","addElements","usingOwnQueue","wrap","_loadPromises","newElements","isLottie","willHaveSyncedPlayer","newElementsArray","CUSTOM_EMOJI_INSTANT_PLAY","addition","_p","overrideRender","setRenderInterval","syncedPlayers","clearRenderInterval","missing","cachedPromises","uncachedPromisesPromise","loadFromPromises","uncached","emojiRenderInterval","renderers","nasty","usedLength","wrapSomething","wrapElement","noFiller","customWraps","contextSite","contextExternal","lastEntity","nextEntity","endPartOffset","fullEntityText","partText","usedText","fontFamily","atPos","fromBot","encodeURIComponent","isSupported","masked","currentContext","electronHelpers","contextUrl","wrapTelegramUrlToAnchor","encoded","encodeSpoiler","entityText","voodoo","insertCustomFillers","notFiller","isCustomFillerNeededBySiblingNode","url1","QueryableWorker","worker","terminate","onmessage","queryMethodListener","queryMethodArguments","postMessage","sendQuery","transfer","queryMethod","workersLimit","playersByCacheName","workers","curWorkerNum","onPlayerLoaded","reqId","fps","clamped","onPlayerError","getAnimation","setLoop","_autoplay","loadLottieWorkers","remain","Worker","queryableWorker","makeAssetUrl","loadAnimationAsAsset","loadAnimationFromURL","loadAnimationDataFromURL","blobConstruct","loadAnimationFromURLManually","loadAnimationFromURLNext","newParams","loadAnimationWorker","waitForFirstFrame","initPlayer","destroyWorkers","loadFromData","getLottiePixelRatio","RLottiePlayer","cachingDelta","CACHE","skipDelta","contexts","setMainLoop","clearPendingRAF","rafId","resetCurrentFrame","minFrame","requestFrame","applyInversing","renderFrame2","cachedSource","renderedFirstFrame","ImageBitmap","frInterval","frThen","frameNew","onLap","mainLoopForwards","mainLoopBackwards","currentMethod","frameListener","listenerResults","enterFrame","playToFrame","bounds","setMinMax","playToFrameOnFrameCallback","setInverseColor","pagesManager","pageId","pagesDiv","scrollableDiv","page","onShown","setPage","isAuthPage","Page","onFirstMount","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","unicodeSurrogates","points","getEmojiToneIndex","VIRTUAL_COUNTRIES_EMOJIS","getCountryEmoji","emojiFromCodePoints","fromCodePoint","module","exports","defineProperty","enumerable","Symbol","toStringTag","__esModule","prototype","isRecordingSupported","bufferLength","encoderApplication","encoderFrameSize","encoderPath","maxFramesPerPage","mediaTrackConstraints","resampleQuality","streamPages","wavBitDepth","encodedSamplePosition","WebAssembly","clearStream","audioContext","closeAudioContext","encodeBuffers","getChannelData","encoder","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","loadWorker","initWorker","streamPage","storePage","recordedPages","samplePosition","finish","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","setTargetAtTime","onstart","destroyWorker","Function","kSampleStepSize","float32ArraySupported","Float32Array","A","aA1","aA2","B","C","calcBezier","aT","getSlope","LinearEasing","mX1","mY1","mX2","mY2","sampleValues","aX","intervalStart","currentSample","kSplineTableSize","guessForT","initialSlope","aGuessT","currentSlope","newtonRaphsonIterate","aA","aB","currentX","currentT","binarySubdivide","getTForX"],"sourceRoot":""} \ No newline at end of file diff --git a/public/508.52f2ca7abd721f25f9ec.chunk.js b/public/508.37ca243cfb33b5edd94a.chunk.js similarity index 98% rename from public/508.52f2ca7abd721f25f9ec.chunk.js rename to public/508.37ca243cfb33b5edd94a.chunk.js index 95426e0f..25c77c0f 100644 --- a/public/508.52f2ca7abd721f25f9ec.chunk.js +++ b/public/508.37ca243cfb33b5edd94a.chunk.js @@ -1,2 +1,2 @@ (()=>{"use strict";(()=>{if("undefined"!=typeof __webpack_require__){var e=__webpack_require__.u,t=__webpack_require__.e,r={},i={};__webpack_require__.u=function(t){return e(t)+(r.hasOwnProperty(t)?"?"+r[t]:"")},__webpack_require__.e=function(n){return t(n).catch((function(t){var a=i.hasOwnProperty(n)?i[n]:999999;if(a<1){var o=e(n);throw t.message="Loading chunk "+n+" failed after 999999 retries.\n("+o+")",t.request=o,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();r[n]=t,i[n]=a-1,e(__webpack_require__.e(n))}),3e3)}))}))}}})();const e="undefined"!=typeof window?window:self,t=navigator?navigator.userAgent:null,r=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&e.MSStream,!!("safari"in e)||!(!t||!(/\b(iPad|iPhone|iPod)\b/.test(t)||t.match("Safari")&&!t.match("Chrome"))));let i;if(navigator.userAgent.toLowerCase().indexOf("firefox"),(void 0===navigator.maxTouchPoints||navigator.maxTouchPoints>0)&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i),r)try{i=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){i=!1}else i=!0;const n=i,a="undefined"!=typeof ImageBitmap;const o=[[[16219713,13335381],[16757049,16168585],[16765248,16764327],[16768889,16768965]],[[16219713,10771e3],[16757049,14653547],[16765248,15577475],[16768889,16040864]],[[16219713,7354903],[16757049,11233085],[16765248,12812110],[16768889,14194279]],[[16219713,4858889],[16757049,8207886],[16765248,9852201],[16768889,11100983]],[[16219713,2101002],[16757049,4270372],[16765248,5848375],[16768889,6505791]]],s=e=>Math.round(255*Math.min(Math.max(e,0),1));importScripts("rlottie-wasm.js");const h=self.Module;class d{constructor(e,t,r,i){this.reqId=e,this.width=t,this.height=r,this.raw=i}init(e,t){if(!this.dead){this.fps=Math.max(1,Math.min(60,t||60));try{this.handle=c.Api.init(),this.stringOnWasmHeap=allocate(intArrayFromString(e),"i8",0),this.frameCount=c.Api.loadFromData(this.handle,this.stringOnWasmHeap),c.Api.resize(this.handle,this.width,this.height),m(["loaded",this.reqId,this.frameCount,this.fps]),!this.raw&&a&&(this.imageData=new ImageData(this.width,this.height))}catch(e){console.error("init RLottieItem error:",e),m(["error",this.reqId,e])}}}render(e,t){if(!this.dead&&void 0!==this.handle&&!(this.frameCount{m(["frame",this.reqId,e,t],[t])}))):(t?t.set(i):t=new Uint8ClampedArray(i),m(["frame",this.reqId,e,t],[t.buffer]))}catch(e){console.error("Render error:",e),this.dead=!0,m(["error",this.reqId,e])}}destroy(){this.dead=!0,void 0!==this.handle&&c.Api.destroy(this.handle)}}const c=new class{constructor(){this.Api={}}initApi(){this.Api={init:h.cwrap("lottie_init","",[]),destroy:h.cwrap("lottie_destroy","",["number"]),resize:h.cwrap("lottie_resize","",["number","number","number"]),buffer:h.cwrap("lottie_buffer","number",["number"]),render:h.cwrap("lottie_render","",["number","number"]),loadFromData:h.cwrap("lottie_load_from_data","number",["number","number"])}}init(){this.initApi(),m(["ready"])}};h.onRuntimeInitialized=function(){c.init()};const u={},f={loadFromData:function(e,t,r,i,n,a){const h=u[e]=new d(e,r,i,a);(function(e){return function(e,t){return new Promise((t=>{const r=new FileReader;r.addEventListener("loadend",(e=>{t(e.target.result)})),r.readAsText(e)}))}(e)})(t).then((t=>{try{if("number"==typeof n&&n>=1&&n<=5){const e=JSON.parse(t);(function(e,t){const r=o[Math.max(t-1,0)],i=e=>{switch(e.ty){case"st":case"fl":(e=>{const t=e.c.k,i=s(t[2])|s(t[1])<<8|s(t[0])<<16,n=r.find((e=>e[0]===i));n&&(t[0]=(n[1]>>16&255)/255,t[1]=(n[1]>>8&255)/255,t[2]=(255&n[1])/255)})(e)}e.hasOwnProperty("it")&&n(e.it)},n=e=>{for(const t of e)i(t)};try{for(const t of e.layers)if(t.shapes)for(const e of t.shapes)e.it?n(e.it):i(e)}catch(r){console.warn("cant apply replacements",r,e,t)}})(e,n),t=JSON.stringify(e)}const e=t.match(/"fr":\s*?(\d+?),/),r=+(null==e?void 0:e[1])||60;h.init(t,r)}catch(r){console.error("Invalid file for sticker:",t),m(["error",e,r])}}))},destroy:function(e){const t=u[e];t&&(t.destroy(),delete u[e])},renderFrame:function(e,t,r){u[e].render(t,r)}};function m(e,t){postMessage({queryMethodListener:e.shift(),queryMethodArguments:e},n?t:void 0)}onmessage=function(e){f[e.data.queryMethod].apply(f,e.data.queryMethodArguments)}})(); -//# sourceMappingURL=508.52f2ca7abd721f25f9ec.chunk.js.map \ No newline at end of file +//# sourceMappingURL=508.37ca243cfb33b5edd94a.chunk.js.map \ No newline at end of file diff --git a/public/508.52f2ca7abd721f25f9ec.chunk.js.map b/public/508.37ca243cfb33b5edd94a.chunk.js.map similarity index 99% rename from public/508.52f2ca7abd721f25f9ec.chunk.js.map rename to public/508.37ca243cfb33b5edd94a.chunk.js.map index 57574ac1..ad3611d6 100644 --- a/public/508.52f2ca7abd721f25f9ec.chunk.js.map +++ b/public/508.37ca243cfb33b5edd94a.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"508.52f2ca7abd721f25f9ec.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/compat","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/imageBitmapSupport.ts","webpack://tweb/./src/lib/rlottie/applyReplacements.ts","webpack://tweb/./src/lib/rlottie/rlottie.worker.ts","webpack://tweb/./src/helpers/blob/readBlobAsText.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts"],"sourcesContent":["(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || navigator.maxTouchPoints > 0) && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_IMAGE_BITMAP_SUPPORTED = typeof(ImageBitmap) !== 'undefined';\n\nexport default IS_IMAGE_BITMAP_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\nconst COLORREPLACEMENTS = [\n [\n [0xf77e41, 0xcb7b55],\n [0xffb139, 0xf6b689],\n [0xffd140, 0xffcda7],\n [0xffdf79, 0xffdfc5]\n ],\n\n [\n [0xf77e41, 0xa45a38],\n [0xffb139, 0xdf986b],\n [0xffd140, 0xedb183],\n [0xffdf79, 0xf4c3a0]\n ],\n\n [\n [0xf77e41, 0x703a17],\n [0xffb139, 0xab673d],\n [0xffd140, 0xc37f4e],\n [0xffdf79, 0xd89667]\n ],\n\n [\n [0xf77e41, 0x4a2409],\n [0xffb139, 0x7d3e0e],\n [0xffd140, 0x965529],\n [0xffdf79, 0xa96337]\n ],\n\n [\n [0xf77e41, 0x200f0a],\n [0xffb139, 0x412924],\n [0xffd140, 0x593d37],\n [0xffdf79, 0x63453f]\n ]\n];\n\nconst convert = (value: number) => {\n return Math.round(Math.min(Math.max(value, 0), 1) * 255);\n};\n\ntype LottieShape = {\n c: {\n k: number[]\n },\n ty: 'st' | 'fl',\n it?: LottieShape[]\n};\n\nexport default function applyReplacements(object: {\n layers: Array<{shapes: LottieShape[]}>\n}, toneIndex: number) {\n const replacements = COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\n\n const applyTo = (smth: LottieShape) => {\n const k = smth.c.k;\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\n\n const foundReplacement = replacements.find((p) => p[0] === color);\n if(foundReplacement) {\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\n k[2] = (foundReplacement[1] & 255) / 255;\n }\n\n // console.log('foundReplacement!', foundReplacement, color.toString(16), k);\n };\n\n const checkSmth = (smth: LottieShape) => {\n switch(smth.ty) {\n case 'st':\n case 'fl':\n applyTo(smth);\n break;\n }\n\n if(smth.hasOwnProperty('it')) {\n iterateIt(smth.it);\n }\n };\n\n const iterateIt = (it: LottieShape['it']) => {\n for(const smth of it) {\n checkSmth(smth);\n }\n };\n\n try {\n for(const layer of object.layers) {\n if(!layer.shapes) continue;\n\n for(const shape of layer.shapes) {\n if(!shape.it) {\n checkSmth(shape);\n continue;\n }\n\n iterateIt(shape.it);\n }\n }\n } catch(err) {\n console.warn('cant apply replacements', err, object, toneIndex);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\nimport readBlobAsText from '../../helpers/blob/readBlobAsText';\nimport applyReplacements from './applyReplacements';\n\nimportScripts('rlottie-wasm.js');\n// import Module, { allocate, intArrayFromString } from './rlottie-wasm';\n\nconst _Module = (self as any).Module as any;\n\nconst DEFAULT_FPS = 60;\n\ntype LottieHandlePointer = number;\n\n// throw new Error('test');\n\nexport class RLottieItem {\n private stringOnWasmHeap: number;\n private handle: LottieHandlePointer;\n private frameCount: number;\n private fps: number;\n\n private dead: boolean;\n // private context: OffscreenCanvasRenderingContext2D;\n\n private imageData: ImageData;\n\n constructor(\n private reqId: number,\n private width: number,\n private height: number,\n private raw?: boolean/* ,\n private canvas: OffscreenCanvas */\n ) {\n }\n\n public init(json: string, fps: number) {\n if(this.dead) {\n return;\n }\n\n this.fps = Math.max(1, Math.min(60, fps || DEFAULT_FPS));\n\n // this.context = canvas.getContext('2d');\n /* let frame = 0;\n setInterval(() => {\n if(frame >= this.frameCount) frame = 0;\n let _frame = frame++;\n this.render(_frame, null);\n }, 1000 / this.fps); */\n\n try {\n this.handle = worker.Api.init();\n\n // @ts-ignore\n this.stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\n\n this.frameCount = worker.Api.loadFromData(this.handle, this.stringOnWasmHeap);\n\n worker.Api.resize(this.handle, this.width, this.height);\n\n reply(['loaded', this.reqId, this.frameCount, this.fps]);\n\n if(!this.raw && IS_IMAGE_BITMAP_SUPPORTED) {\n this.imageData = new ImageData(this.width, this.height);\n }\n } catch(e) {\n console.error('init RLottieItem error:', e);\n reply(['error', this.reqId, e]);\n }\n }\n\n public render(frameNo: number, clamped?: Uint8ClampedArray) {\n if(this.dead || this.handle === undefined) return;\n // return;\n\n if(this.frameCount < frameNo || frameNo < 0) {\n return;\n }\n\n try {\n worker.Api.render(this.handle, frameNo);\n\n const bufferPointer = worker.Api.buffer(this.handle);\n\n const data = _Module.HEAPU8.subarray(bufferPointer, bufferPointer + (this.width * this.height * 4));\n\n if(this.imageData) {\n this.imageData.data.set(data);\n createImageBitmap(this.imageData).then((imageBitmap) => {\n reply(['frame', this.reqId, frameNo, imageBitmap], [imageBitmap]);\n });\n } else {\n if(!clamped) {\n clamped = new Uint8ClampedArray(data);\n } else {\n clamped.set(data);\n }\n\n // this.context.putImageData(new ImageData(clamped, this.width, this.height), 0, 0);\n\n reply(['frame', this.reqId, frameNo, clamped], [clamped.buffer]);\n }\n } catch(e) {\n console.error('Render error:', e);\n this.dead = true;\n reply(['error', this.reqId, e]);\n }\n }\n\n public destroy() {\n this.dead = true;\n\n if(this.handle !== undefined) {\n worker.Api.destroy(this.handle);\n }\n }\n}\n\nclass RLottieWorker {\n public Api: {\n init: () => LottieHandlePointer,\n destroy: (handle: LottieHandlePointer) => void,\n resize: (handle: LottieHandlePointer, width: number, height: number) => void,\n buffer: (handle: LottieHandlePointer) => number,\n render: (handle: LottieHandlePointer, frameNo: number) => void,\n loadFromData: (handle: LottieHandlePointer, bufferPointer: number) => number\n } = {} as any;\n\n public initApi() {\n this.Api = {\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\n public init() {\n this.initApi();\n reply(['ready']);\n }\n}\n\nconst worker = new RLottieWorker();\n\n_Module.onRuntimeInitialized = function() {\n worker.init();\n};\n\nconst items: {[reqId: string]: RLottieItem} = {};\nconst queryableFunctions = {\n loadFromData: function(reqId: number, blob: Blob, width: number, height: number, toneIndex: number, raw: boolean/* , canvas: OffscreenCanvas */) {\n const item = items[reqId] = new RLottieItem(reqId, width, height, raw/* , canvas */);\n readBlobAsText(blob).then((json) => {\n try {\n if(typeof(toneIndex) === 'number' && toneIndex >= 1 && toneIndex <= 5) {\n /* params.animationData = copy(params.animationData);\n this.applyReplacements(params.animationData, toneIndex); */\n\n const newAnimationData = JSON.parse(json);\n applyReplacements(newAnimationData, toneIndex);\n json = JSON.stringify(newAnimationData);\n }\n\n // ! WARNING, с этой проверкой не все стикеры работают, например - ДУРКА\n /* if(!/\"tgs\":\\s*?1./.test(jsString)) {\n throw new Error('Invalid file');\n } */\n\n /* let perf = performance.now();\n let json = JSON.parse(jsString);\n console.log('sticker decode:', performance.now() - perf); */\n\n const match = json.match(/\"fr\":\\s*?(\\d+?),/);\n const frameRate = +match?.[1] || DEFAULT_FPS;\n\n // console.log('Rendering sticker:', reqId, frameRate, 'now rendered:', Object.keys(items).length);\n\n item.init(json, frameRate);\n } catch(err) {\n console.error('Invalid file for sticker:', json);\n reply(['error', reqId, err]);\n }\n });\n },\n destroy: function(reqId: number) {\n const item = items[reqId];\n if(!item) {\n return;\n }\n\n item.destroy();\n delete items[reqId];\n },\n renderFrame: function(reqId: number, frameNo: number, clamped?: Uint8ClampedArray) {\n // console.log('worker renderFrame', reqId, frameNo, clamped);\n items[reqId].render(frameNo, clamped);\n }\n};\n\nfunction reply(args: any[], transfer?: Transferable[]) {\n postMessage({queryMethodListener: args.shift(), queryMethodArguments: args}, CAN_USE_TRANSFERABLES ? transfer : undefined);\n}\n\nonmessage = function(e) {\n // @ts-ignore\n queryableFunctions[e.data.queryMethod].apply(queryableFunctions, e.data.queryMethodArguments);\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsText(blob: Blob) {\n return readBlobAs(blob, 'readAsText');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n"],"names":["__webpack_require__","oldGetScript","u","oldLoadScript","e","queryMap","countMap","chunkId","hasOwnProperty","catch","error","retries","realSrc","message","request","Promise","resolve","setTimeout","cacheBust","Date","now","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","CAN_USE_TRANSFERABLES","undefined","err","COLORREPLACEMENTS","convert","value","Math","round","min","max","importScripts","_Module","Module","RLottieItem","constructor","reqId","width","height","raw","init","json","fps","this","dead","handle","worker","Api","stringOnWasmHeap","allocate","intArrayFromString","frameCount","loadFromData","resize","reply","imageData","ImageData","console","render","frameNo","clamped","bufferPointer","buffer","data","HEAPU8","subarray","set","createImageBitmap","then","imageBitmap","Uint8ClampedArray","destroy","initApi","cwrap","onRuntimeInitialized","items","queryableFunctions","blob","toneIndex","item","method","reader","FileReader","addEventListener","target","result","readBlobAs","readBlobAsText","newAnimationData","JSON","parse","object","replacements","checkSmth","smth","ty","k","c","color","foundReplacement","find","p","applyTo","iterateIt","it","layer","layers","shapes","shape","warn","applyReplacements","stringify","frameRate","renderFrame","args","transfer","postMessage","queryMethodListener","shift","queryMethodArguments","onmessage","queryMethod","apply"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"508.37ca243cfb33b5edd94a.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/compat","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/imageBitmapSupport.ts","webpack://tweb/./src/lib/rlottie/applyReplacements.ts","webpack://tweb/./src/lib/rlottie/rlottie.worker.ts","webpack://tweb/./src/helpers/blob/readBlobAsText.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts"],"sourcesContent":["(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || navigator.maxTouchPoints > 0) && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_IMAGE_BITMAP_SUPPORTED = typeof(ImageBitmap) !== 'undefined';\n\nexport default IS_IMAGE_BITMAP_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\nconst COLORREPLACEMENTS = [\n [\n [0xf77e41, 0xcb7b55],\n [0xffb139, 0xf6b689],\n [0xffd140, 0xffcda7],\n [0xffdf79, 0xffdfc5]\n ],\n\n [\n [0xf77e41, 0xa45a38],\n [0xffb139, 0xdf986b],\n [0xffd140, 0xedb183],\n [0xffdf79, 0xf4c3a0]\n ],\n\n [\n [0xf77e41, 0x703a17],\n [0xffb139, 0xab673d],\n [0xffd140, 0xc37f4e],\n [0xffdf79, 0xd89667]\n ],\n\n [\n [0xf77e41, 0x4a2409],\n [0xffb139, 0x7d3e0e],\n [0xffd140, 0x965529],\n [0xffdf79, 0xa96337]\n ],\n\n [\n [0xf77e41, 0x200f0a],\n [0xffb139, 0x412924],\n [0xffd140, 0x593d37],\n [0xffdf79, 0x63453f]\n ]\n];\n\nconst convert = (value: number) => {\n return Math.round(Math.min(Math.max(value, 0), 1) * 255);\n};\n\ntype LottieShape = {\n c: {\n k: number[]\n },\n ty: 'st' | 'fl',\n it?: LottieShape[]\n};\n\nexport default function applyReplacements(object: {\n layers: Array<{shapes: LottieShape[]}>\n}, toneIndex: number) {\n const replacements = COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\n\n const applyTo = (smth: LottieShape) => {\n const k = smth.c.k;\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\n\n const foundReplacement = replacements.find((p) => p[0] === color);\n if(foundReplacement) {\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\n k[2] = (foundReplacement[1] & 255) / 255;\n }\n\n // console.log('foundReplacement!', foundReplacement, color.toString(16), k);\n };\n\n const checkSmth = (smth: LottieShape) => {\n switch(smth.ty) {\n case 'st':\n case 'fl':\n applyTo(smth);\n break;\n }\n\n if(smth.hasOwnProperty('it')) {\n iterateIt(smth.it);\n }\n };\n\n const iterateIt = (it: LottieShape['it']) => {\n for(const smth of it) {\n checkSmth(smth);\n }\n };\n\n try {\n for(const layer of object.layers) {\n if(!layer.shapes) continue;\n\n for(const shape of layer.shapes) {\n if(!shape.it) {\n checkSmth(shape);\n continue;\n }\n\n iterateIt(shape.it);\n }\n }\n } catch(err) {\n console.warn('cant apply replacements', err, object, toneIndex);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\nimport readBlobAsText from '../../helpers/blob/readBlobAsText';\nimport applyReplacements from './applyReplacements';\n\nimportScripts('rlottie-wasm.js');\n// import Module, { allocate, intArrayFromString } from './rlottie-wasm';\n\nconst _Module = (self as any).Module as any;\n\nconst DEFAULT_FPS = 60;\n\ntype LottieHandlePointer = number;\n\n// throw new Error('test');\n\nexport class RLottieItem {\n private stringOnWasmHeap: number;\n private handle: LottieHandlePointer;\n private frameCount: number;\n private fps: number;\n\n private dead: boolean;\n // private context: OffscreenCanvasRenderingContext2D;\n\n private imageData: ImageData;\n\n constructor(\n private reqId: number,\n private width: number,\n private height: number,\n private raw?: boolean/* ,\n private canvas: OffscreenCanvas */\n ) {\n }\n\n public init(json: string, fps: number) {\n if(this.dead) {\n return;\n }\n\n this.fps = Math.max(1, Math.min(60, fps || DEFAULT_FPS));\n\n // this.context = canvas.getContext('2d');\n /* let frame = 0;\n setInterval(() => {\n if(frame >= this.frameCount) frame = 0;\n let _frame = frame++;\n this.render(_frame, null);\n }, 1000 / this.fps); */\n\n try {\n this.handle = worker.Api.init();\n\n // @ts-ignore\n this.stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\n\n this.frameCount = worker.Api.loadFromData(this.handle, this.stringOnWasmHeap);\n\n worker.Api.resize(this.handle, this.width, this.height);\n\n reply(['loaded', this.reqId, this.frameCount, this.fps]);\n\n if(!this.raw && IS_IMAGE_BITMAP_SUPPORTED) {\n this.imageData = new ImageData(this.width, this.height);\n }\n } catch(e) {\n console.error('init RLottieItem error:', e);\n reply(['error', this.reqId, e]);\n }\n }\n\n public render(frameNo: number, clamped?: Uint8ClampedArray) {\n if(this.dead || this.handle === undefined) return;\n // return;\n\n if(this.frameCount < frameNo || frameNo < 0) {\n return;\n }\n\n try {\n worker.Api.render(this.handle, frameNo);\n\n const bufferPointer = worker.Api.buffer(this.handle);\n\n const data = _Module.HEAPU8.subarray(bufferPointer, bufferPointer + (this.width * this.height * 4));\n\n if(this.imageData) {\n this.imageData.data.set(data);\n createImageBitmap(this.imageData).then((imageBitmap) => {\n reply(['frame', this.reqId, frameNo, imageBitmap], [imageBitmap]);\n });\n } else {\n if(!clamped) {\n clamped = new Uint8ClampedArray(data);\n } else {\n clamped.set(data);\n }\n\n // this.context.putImageData(new ImageData(clamped, this.width, this.height), 0, 0);\n\n reply(['frame', this.reqId, frameNo, clamped], [clamped.buffer]);\n }\n } catch(e) {\n console.error('Render error:', e);\n this.dead = true;\n reply(['error', this.reqId, e]);\n }\n }\n\n public destroy() {\n this.dead = true;\n\n if(this.handle !== undefined) {\n worker.Api.destroy(this.handle);\n }\n }\n}\n\nclass RLottieWorker {\n public Api: {\n init: () => LottieHandlePointer,\n destroy: (handle: LottieHandlePointer) => void,\n resize: (handle: LottieHandlePointer, width: number, height: number) => void,\n buffer: (handle: LottieHandlePointer) => number,\n render: (handle: LottieHandlePointer, frameNo: number) => void,\n loadFromData: (handle: LottieHandlePointer, bufferPointer: number) => number\n } = {} as any;\n\n public initApi() {\n this.Api = {\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\n public init() {\n this.initApi();\n reply(['ready']);\n }\n}\n\nconst worker = new RLottieWorker();\n\n_Module.onRuntimeInitialized = function() {\n worker.init();\n};\n\nconst items: {[reqId: string]: RLottieItem} = {};\nconst queryableFunctions = {\n loadFromData: function(reqId: number, blob: Blob, width: number, height: number, toneIndex: number, raw: boolean/* , canvas: OffscreenCanvas */) {\n const item = items[reqId] = new RLottieItem(reqId, width, height, raw/* , canvas */);\n readBlobAsText(blob).then((json) => {\n try {\n if(typeof(toneIndex) === 'number' && toneIndex >= 1 && toneIndex <= 5) {\n /* params.animationData = copy(params.animationData);\n this.applyReplacements(params.animationData, toneIndex); */\n\n const newAnimationData = JSON.parse(json);\n applyReplacements(newAnimationData, toneIndex);\n json = JSON.stringify(newAnimationData);\n }\n\n // ! WARNING, с этой проверкой не все стикеры работают, например - ДУРКА\n /* if(!/\"tgs\":\\s*?1./.test(jsString)) {\n throw new Error('Invalid file');\n } */\n\n /* let perf = performance.now();\n let json = JSON.parse(jsString);\n console.log('sticker decode:', performance.now() - perf); */\n\n const match = json.match(/\"fr\":\\s*?(\\d+?),/);\n const frameRate = +match?.[1] || DEFAULT_FPS;\n\n // console.log('Rendering sticker:', reqId, frameRate, 'now rendered:', Object.keys(items).length);\n\n item.init(json, frameRate);\n } catch(err) {\n console.error('Invalid file for sticker:', json);\n reply(['error', reqId, err]);\n }\n });\n },\n destroy: function(reqId: number) {\n const item = items[reqId];\n if(!item) {\n return;\n }\n\n item.destroy();\n delete items[reqId];\n },\n renderFrame: function(reqId: number, frameNo: number, clamped?: Uint8ClampedArray) {\n // console.log('worker renderFrame', reqId, frameNo, clamped);\n items[reqId].render(frameNo, clamped);\n }\n};\n\nfunction reply(args: any[], transfer?: Transferable[]) {\n postMessage({queryMethodListener: args.shift(), queryMethodArguments: args}, CAN_USE_TRANSFERABLES ? transfer : undefined);\n}\n\nonmessage = function(e) {\n // @ts-ignore\n queryableFunctions[e.data.queryMethod].apply(queryableFunctions, e.data.queryMethodArguments);\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsText(blob: Blob) {\n return readBlobAs(blob, 'readAsText');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n"],"names":["__webpack_require__","oldGetScript","u","oldLoadScript","e","queryMap","countMap","chunkId","hasOwnProperty","catch","error","retries","realSrc","message","request","Promise","resolve","setTimeout","cacheBust","Date","now","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","CAN_USE_TRANSFERABLES","undefined","err","COLORREPLACEMENTS","convert","value","Math","round","min","max","importScripts","_Module","Module","RLottieItem","constructor","reqId","width","height","raw","init","json","fps","this","dead","handle","worker","Api","stringOnWasmHeap","allocate","intArrayFromString","frameCount","loadFromData","resize","reply","imageData","ImageData","console","render","frameNo","clamped","bufferPointer","buffer","data","HEAPU8","subarray","set","createImageBitmap","then","imageBitmap","Uint8ClampedArray","destroy","initApi","cwrap","onRuntimeInitialized","items","queryableFunctions","blob","toneIndex","item","method","reader","FileReader","addEventListener","target","result","readBlobAs","readBlobAsText","newAnimationData","JSON","parse","object","replacements","checkSmth","smth","ty","k","c","color","foundReplacement","find","p","applyTo","iterateIt","it","layer","layers","shapes","shape","warn","applyReplacements","stringify","frameRate","renderFrame","args","transfer","postMessage","queryMethodListener","shift","queryMethodArguments","onmessage","queryMethod","apply"],"sourceRoot":""} \ No newline at end of file diff --git a/public/61.5322bb4d26ac11c98a86.chunk.js b/public/61.b4b665c9d61c26575ebe.chunk.js similarity index 99% rename from public/61.5322bb4d26ac11c98a86.chunk.js rename to public/61.b4b665c9d61c26575ebe.chunk.js index b2d0c52f..c63c6004 100644 --- a/public/61.5322bb4d26ac11c98a86.chunk.js +++ b/public/61.b4b665c9d61c26575ebe.chunk.js @@ -1,2 +1,2 @@ (()=>{"use strict";var t,e,r={2061:(t,e,r)=>{let n,a;const o=null;function f(t){return JSON.parse(JSON.stringify(t))}function c(t,e,r,a,o){for(n=0;n=0;--r)e=f(d(t[r],e));return e}function g(t){if(!t)throw Error("assert :P")}const P=function(){function t(t){return t==Ee||t==je||t==Ce||t==Fe}function e(t){return A(t,1)}function r(t,e){const r=1+((t.la-1)*e>>8),n=r<<8;let a=0;for(t.Z>=n?(a=1,t.la-=r,t.Z-=n):(a=0,t.la=r);t.la<128;)t.Z<<=1,t.la<<=1,8==++t.gc&&(t.gc=0,t.bc&&(t.Z+=t.qa[t.Ia++],t.bc--));return a}function P(t,e,r,n){(n-=r)>=2?(t.Z=e[r+0]<<8|e[r+1],t.qa=e,t.Ia=r+2,t.bc=n-2):(t.Z=0,t.qa=o,t.bc=0),t.la=255,t.gc=0}function A(t,e){var n=0,a=0;for(a=e-1;a>=0;a--)n|=r(t,128)<=8&&t.Q>>=8,t.T+=t.qa[t.Ia+t.Q]<<24>>>0,++t.Q,t.g-=8}function y(t){t.g>=8&&w(t),t.Q==t.ya&&32==t.g&&(t.L=1)}function S(t,e){let r=0;if(g(e>=0),!t.L&&e=32&&(t.L=1,t.g+e>32))return r;r=t.T>>t.g&fr[e],t.g+=e,t.g>=8&&t.g>=8&&w(t)}else t.fa=1;return r}function T(t){return t.Pa==t.gb}function R(t,e){return g(t!=o),0==e?0:(t.gb=2*e-1,t.Y=v(t.gb,Dr),t.Y==o?0:(t.Y[0].s=-1,t.Pa=1))}function O(t){t!=o&&(t.Y=o,t.Y=o,t.gb=0,t.Pa=0)}function V(t,e,r,n){for(var a=t.Y,o=0,f=+t.gb;n-- >0;){if(o>=f)return 0;if(a[o].s<0){if(T(t))return 0;const e=t,r=e.Y,n=+e.Pa;a[o].s=n-o,e.Pa+=2,r[n+0].s=-1,r[n+1].s=-1}else if(0==a[o].s)return 0;o+=a[o].s+(r>>n&1)}if(a[o].s<0)a[o].s=0;else if(0!=a[o].s)return 0;return a[o].kc=e,1}function I(t,e,r){var n=0;let a=0,f=0;for(g(t!=o),g(e!=o),n=0;n0&&(++a,f=n);if(!R(t,a))return 0;if(1==a)return f<0||f>=r?(O(t),0):V(t,f,0,0);if(a=0,f=d(r,0),f==o)return(a=a&&T(t))||O(t),a;var c=0;c=0,n=d(pr+1,0);let i=0;const u=d(pr+1,0);let b=0;for(g(e!=o),g(r>0),g(f!=o),c=0;cb&&(b=e[c]);if(b>pr)n=0;else{for(c=0;c0?u[e[c]]++:jr;n=1}if(!n)return(a=a&&T(t))||O(t),a;for(n=0;n0&&!V(t,n,f[n],e[n]))return(a=a&&T(t))||O(t),a;return(a=T(t))||O(t),a}function _(t,e,r,n,a,o,f){var c=0;for(c=0;ct.P.v)&&(r=0==e)){t:{let e=t.Ga;var a=t.G,i=t.ub;r=t.P.l;let h=t.P.v;const v=t.Xb;var u=[o];let p=o,P=h*r;var b=o,s=o;s="WEBP_FILTER_TYPE";let A=0;u=0;var l=0;let k=0;if(g(r>0&&h>0&&n>=r),g(e!=o&&v!=o),i<=Sr)r=0;else if(k=e[a+0]>>0&3,s=e[a+0]>>2&3,A=e[a+0]>>4&3,u=e[a+0]>>6&3,kRr||s>=Sn||A>Or||0!=u)r=0;else{if(k==Tr)l=i>=P,u=e,p=a+Sr;else{if(p=0,(u=d(P,0))==o){r=0;break t}l=a+Sr,i-=Sr,a=u,b=f(tr);let t=0;const n=qt();n==o?l=0:(n.l=r,n.v=h,n.N=b,st(Ve),b.put=Pe,b.Mb=ge,b.Pb=Ae,b.ka=o,b.ka=a,b.fd=0,b.width=r,b.height=h,n.a=ze,m(n.o,e,l,i),n.Wa=An,Jt(r,h,1,n,o)&&Yt(n,r)&&(n.Wa=Pn,t=Ht(n,n.V,n.Ha,n.l,n.v,xt)),n!=o&&Kt(n),l=t)}if(l){for(e=Tn[s],e!=o?((b=d(P,0))==o&&(l=0,k!=Tr&&(p=u=o)),e(u,p,r,h,1,r,b,s=0),P=b,k=s):(P=u,k=p),e=0;h-- >0;)c(v,e,P,k,r),k+=r,e+=n;A==Or&&(l=u==o||p<=0||r<=0?0:1)}r=l}}r=!r}return r?o:0==e?t.Xb:+e*n}function U(t,e,r,n){if(n==o||t<=0||e<=0)return Ke;if(r!=o){if(r.Ua){const n=r.wc,a=r.vc,o=-2&r.t,f=-2&r.k;if(o<0||f<0||n<=0||a<=0||o+n>t||f+a>e)return Ke;t=n,e=a}if(r.I){if(r.Ba<=0||r.Aa<=0)return Ke;t=r.Ba,e=r.Aa}}return n.width=t,n.height=e,function(t){let e=t.width;const r=t.height;let n=t.J;if(e<=0||r<=0||!(n>=Ie&&n=Ie&&f=c*Rn[f],n&=t.ma!=o):(u=(t=t.c.Va).nb*parseInt((i+1)/2,10),b=t.rb*parseInt((i+1)/2,10),s=t.Fa*i,n&=t.F*i<=t.Wc,n&=u<=t.Rc,n&=b<=t.Uc,n&=s<=t.Wb,n&=t.F>=c,n&=t.nb>=parseInt((c+1)/2,10),n&=t.rb>=parseInt((c+1)/2,10),n&=t.y!=o,n&=t.c!=o,n&=t.S!=o,f==Ne&&(n&=t.Fa>=c,n&=s<=t.Wb,n&=t.p!=o)):n=0,n?ze:Ke}(n)}function M(t){return-256&t?t<0?0:255:t}function B(t,e,r,n){const a=d(16,0);let o,f;for(o=0,f=0;f<4;++f){var c=t[e+0]+t[e+8],i=t[e+0]-t[e+8],u=(t[e+4]*Bn>>16)-(t[e+12]*Mn>>16),b=(t[e+4]*Mn>>16)+(t[e+12]*Bn>>16);a[o+0]=c+b,a[o+1]=i+u,a[o+2]=i-u,a[o+3]=c-b,o+=4,e++}for(f=o=0;f<4;++f)c=(t=a[o+0]+4)+a[o+8],i=t-a[o+8],u=(a[o+4]*Bn>>16)-(a[o+12]*Mn>>16),b=(a[o+4]*Mn>>16)+(a[o+12]*Bn>>16),r[n+0+0*en]=M(r[n+0+0*en]+(c+b>>3)),r[n+1+0*en]=M(r[n+1+0*en]+(i+u>>3)),r[n+2+0*en]=M(r[n+2+0*en]+(i-u>>3)),r[n+3+0*en]=M(r[n+3+0*en]+(c-b>>3)),o++,n+=en}function D(t,e,r,n,a){B(t,e,r,n),a&&B(t,e+16,r,n+4)}function E(t,e,r,n){Cn(t,e+0,r,n+0,1),Cn(t,e+32,r,n+4*en,1)}function C(t,e,r,n){let a;for(t=t[e+0]+4,a=0;a<4;++a)for(e=0;e<4;++e)r[n+e+a*en]=M(r[n+e+a*en]+(t>>3))}function F(t,e,r,n){t[e+0]&&C(t,e+0,r,n+0),t[e+16]&&C(t,e+16,r,n+4),t[e+32]&&C(t,e+32,r,n+4*en),t[e+48]&&C(t,e+48,r,n+4*en+4)}function G(t,e,r){const n=e-en,a=Wn,o=255-t[n-1];let f;for(f=0;f>2}function H(t,e,r){let n,a;for(n=0;n<8;++n)for(a=0;a<8;++a)e[r+a+n*en]=t}function z(t,e,r){const n=t[e-r],a=t[e+0],o=3*(a-n)+In[1020+t[e-2*r]-t[e+r]],f=_n[112+(o+4>>3)];t[e-r]=Wn[255+n+_n[112+(o+3>>3)]],t[e+0]=Wn[255+a-f]}function q(t,e,r,n){const a=t[e+0],o=t[e+r];return On[255+t[e-2*r]-t[e-r]]>n||On[255+o-a]>n}function K(t,e,r,n,a){const o=t[e-3*r],f=t[e-2*r],c=t[e-r],i=t[e+0],u=t[e+r],b=t[e+2*r],s=t[e+3*r];return 2*On[255+c-i]+Vn[255+f-u]>n?0:On[255+t[e-4*r]-o]<=a&&On[255+o-f]<=a&&On[255+f-c]<=a&&On[255+s-b]<=a&&On[255+b-u]<=a&&On[255+u-i]<=a}function J(t,e,r,n){let a;for(a=0;a<16;++a)2*On[255+t[e+a-r]-t[e+a+0]]+Vn[255+t[e+a-2*r]-t[e+a+r]]<=n&&z(t,e+a,r)}function Y(t,e,r,n){let a;for(a=0;a<16;++a)2*On[255+t[e+a*r-1]-t[e+a*r+0]]+Vn[255+t[e+a*r-2]-t[e+a*r+1]]<=n&&z(t,e+a*r,1)}function x(t,e,r,n){let a;for(a=3;a>0;--a)J(t,(e+=4*r)+0,r,n)}function Q(t,e,r,n){let a;for(a=3;a>0;--a)Y(t,(e+=4)+0,r,n)}function $(t,e,r,n,a,o,f,c){for(;a-- >0;){if(K(t,e+0,r,o,f))if(q(t,e+0,r,c))z(t,e+0,r);else{const n=t,a=e+0,o=r,f=n[a-2*o],c=n[a-o],u=n[a+0],b=n[a+o],s=n[a+2*o],l=27*(i=In[1020+3*(u-c)+In[1020+f-b]])+63>>7,h=18*i+63>>7;var i=9*i+63>>7;n[a-3*o]=Wn[255+n[a-3*o]+i],n[a-2*o]=Wn[255+f+h],n[a-o]=Wn[255+c+l],n[a+0]=Wn[255+u-l],n[a+o]=Wn[255+b-h],n[a+2*o]=Wn[255+s-i]}e+=n}}function X(t,e,r,n,a,o,f,c){for(;a-- >0;){if(K(t,e+0,r,o,f))if(q(t,e+0,r,c))z(t,e+0,r);else{const n=t,a=e+0,o=r,f=n[a-o],c=n[a+0],u=n[a+o],b=_n[112+(4+(i=3*(c-f))>>3)];var i=_n[112+(i+3>>3)];const s=b+1>>1;n[a-2*o]=Wn[255+n[a-2*o]+s],n[a-o]=Wn[255+f+i],n[a+0]=Wn[255+c-b],n[a+o]=Wn[255+u-s]}e+=n}}function Z(t,e,r,n,a,o){$(t,e+0,r,1,16,n,a,o)}function tt(t,e,r,n,a,o){$(t,e+0,1,r,16,n,a,o)}function et(t,e,r,n,a,o){let f;for(f=3;f>0;--f)X(t,(e+=4*r)+0,r,1,16,n,a,o)}function rt(t,e,r,n,a,o){let f;for(f=3;f>0;--f)X(t,(e+=4)+0,1,r,16,n,a,o)}function nt(t,e,r,n,a,o,f,c){$(t,e,a,1,8,o,f,c),$(r,n,a,1,8,o,f,c)}function at(t,e,r,n,a,o,f,c){$(t,e,1,a,8,o,f,c),$(r,n,1,a,8,o,f,c)}function ot(t,e,r,n,a,o,f,c){X(t,e+4*a,a,1,8,o,f,c),X(r,n+4*a,a,1,8,o,f,c)}function ft(t,e,r,n,a,o,f,c){X(t,e+4,1,a,8,o,f,c),X(r,n+4,1,a,8,o,f,c)}function ct(t,e){return e==Fr?0==t.i?0==t.d?Kr:qr:0==t.d?zr:Fr:e}function it(t,e,r,a){for(n=0;n<4;++n)t[e+n]=r[a+n]}function ut(t,e){return t<0?0:t>e?e:t}function bt(t){t.a="VP8_STATUS_OK",t.xc="OK"}function st(t){t>>>8!=Ve>>>8&&alert("mismatch error")}function lt(t,e,r){return t.a==ze&&(t.a=e,t.xc=r,t.za=0),0}function ht(t,a){let c=[0],i=0;var u=[0],b=f(fn),s=f(cn);let l=f(nr);if(u="VP8StatusCode",b=f(rr),t==o)return alert("(dec == null)"),0;if(bt(t),a==o)return lt(t,"VP8_STATUS_INVALID_PARAM","null VP8Io passed to VP8GetHeaders()");if(b.data=a.data,b.b=a.b,b.e=a.e,b.b=[b.b],b.e=[b.e],(u=ye(b=[b]))!=ze)return lt(t,u,"Incorrect/incomplete header.");if((b=b[0]).b=b.b[0],b.e=b.e[0],b.ia)return lt(t,Je,"Unexpected lossless format encountered.");if(t.Ga==o&&(g(0==t.ub),t.Ga=b.$,t.G=b.G,t.ub=b.pa),i=b.data,c=b.b+b.offset,u=b.e-b.offset,g(b.e>=b.offset),u[0]<4)return lt(t,$e,"Truncated header.");if(l=i[c+0]|i[c+1]<<8|i[c+2]<<16,(b=t.Ac).fb=!(1&l)+0,b.Jc=l>>1&7,b.Nc=l>>4&1,b.Ra=l>>5,b.Jc>3)return lt(t,"VP8_STATUS_BITSTREAM_ERROR","Incorrect keyframe parameters.");if(!b.Nc)return lt(t,"VP8_STATUS_UNSUPPORTED_FEATURE","Frame not displayable.");if(c+=3,u-=3,s=t.P,b.fb){if(u<7)return lt(t,"VP8_STATUS_NOT_ENOUGH_DATA","cannot parse picture header");if(!(u>=3&&157==i[c+0]&&1==i[c+1]&&42==i[c+2]))return lt(t,"VP8_STATUS_BITSTREAM_ERROR","Bad code word");for(s.l=16383&(i[c+4]<<8|i[c+3]),s.gd=i[c+4]>>6,s.v=16383&(i[c+6]<<8|i[c+5]),s.hd=i[c+6]>>6,c+=7,u-=7,t.Ma=s.l+15>>4,t.hb=s.v+15>>4,a.width=s.l,a.height=s.v,a.I=0,a.Ua=0,a.k=0,a.t=0,a.Ka=a.width,a.K=a.height,a.m=a.width,a.h=a.height,l=t.R,n=0;nu)return lt(t,"VP8_STATUS_NOT_ENOUGH_DATA","bad partition length");l=t.o,P(l,i,c,c+b.Ra),c+=b.Ra,u-=b.Ra,b.fb&&(s.uc=e(l),s.$c=e(l)),s=l;var h=t.Ca;let d=t.R;if(g(s!=o),g(h!=o),h.pb=e(s),h.pb){if(h.ob=e(s),e(s)){var v;for(h.tb=e(s),v=0;v0)if(t.Ca.pb)for(d=0;du&&(w=s),P(t.ic[+m],d,v,y),d=w,v=y,h+=3}P(t.ic[+p],d,v,u),u=v0){t.yb[w]=t.yb[0];continue}y=u}const e=t.yb[w];e.sc[0]=oa[ut(y+s,127)],e.sc[1]=fa[ut(y+0,127)],e.sb[0]=2*oa[ut(y+h,127)],e.sb[1]=101581*fa[ut(y+d,127)]>>16,e.sb[1]<8&&(e.sb[1]=8),e.qc[0]=oa[ut(y+v,117)],e.qc[1]=fa[ut(y+p,127)]}if(!b.fb)return lt(t,Ye,"Not a key frame.");for(t.Zc=259,e(l),u=t.R,s=0;s<$r;++s)for(h=0;h0)+0],16==o||!r(t,c[0]))return o}else c=e[sa[o]][0];if(16==o)return 16}}function vt(t,e){return((16777216*t[0]+65536*t[1]+256*t[2]+1*t[3])*pa&4278190080)>>e}function pt(t,e){let a,f=0;if(t==o)return 0;if(e==o)return lt(t,"VP8_STATUS_INVALID_PARAM","NULL VP8Io parameter in VP8Decode().");if(!t.za&&!ht(t,e))return 0;if(g(t.za),e.Mb&&!e.Mb(e))lt(t,Qe,"Frame setup failed"),a=t.a;else{e.Za&&(t.A=0);const r=ea[t.A];2==t.A?(t.lb=0,t.mb=0):(t.lb=e.t-r>>4,t.mb=e.k-r>>4,t.lb<0&&(t.lb=0),t.mb<0&&(t.mb=0)),t.Ya=e.K+15+r>>4,t.wb=e.Ka+15+r>>4,t.wb>t.Ma&&(t.wb=t.Ma),t.Ya>t.hb&&(t.Ya=t.hb),a=ze}if(f=a==ze){if(f){let r,n;t:{if(t.Ja=0,t.qb){const e=t.rc;if(!WebPWorkerReset(e)){r=lt(t,qe,"thread initialization failed.");break t}e.Qd=t,e.Rd=t.oa.N,e.Ud=FinishRow,t.jb=t.A>0?ra:ra-1}else t.jb=na;r=1}if(!(n=!r)){let e;t:{const r=t.jb,n=t.Ma,a=4*n,f=32*n,c=n+1,i=t.A>0?n*(t.qb?2:1):0,s=rn,l=f*(16*r+parseInt(3*ea[t.A]/2,10)),h=t.Ga!=o?t.P.l*t.P.v:0,v=a+f+c+i+s+384+l+h+ta;if(v!=v)e=0;else{if(v>t.Gb){if(t.ib=0,t.Gb=0,t.ib==o){e=lt(t,"VP8_STATUS_OUT_OF_MEMORY","no memory during frame initialization.");break t}t.Gb=v}t.dc=205,t.Xc=b(205,16*n),t.Sc=b(205,8*n),t.Vc=b(205,8*n),t.M=i?u(ln,i):o,t.Sd=i?0:o,t.oa.ha=0,t.oa.M=t.M,g(0==(s&ta)),t.Ea=b(205,1*s),t.z=-12851,t.H=16*n,t.r=8*n;const f=ea[t.A],p=f*t.H,P=f/2*t.r;t.ca=d(l,205),t.da=+p,t.aa=t.ca,t.ba=t.da+16*r*t.H+P,t.ra=t.aa,t.sa=t.ba+8*r*t.r+P,t.Xb=h?d(h,0):o,t.La=u(hn,c),t.dc=b(Fr,a),e=1}}n=!e}if(n)f=0;else{if(e.width=t.P.l,e.height=t.P.v,e.w=0,e.y=t.ca,e.D=t.da,e.c=t.aa,e.B=t.ba,e.S=t.ra,e.C=t.sa,e.F=t.H,e.Da=t.r,e.p=o,e.q=o,!Un){let t;for(t=-255;t<=255;++t)On[255+t]=t<0?-t:t,Vn[255+t]=On[255+t]>>1;for(t=-1020;t<=1020;++t)In[1020+t]=t<-128?-128:t>127?127:t;for(t=-112;t<=112;++t)_n[112+t]=t<-16?-16:t>15?15:t;for(t=-255;t<=510;++t)Wn[255+t]=t<0?0:t>255?255:t;Un=1}Cn=D,Fn=E,Gn=C,Nn=F,Ln=Z,Hn=tt,zn=nt,qn=at,Kn=et,Jn=rt,Yn=ot,xn=ft,Qn=J,$n=Y,Xn=x,Zn=Q,f=1}}if(f)t:{for(t.d=0;t.d0&&u.d>=u.mb&&u.d<=u.Ya)+0,t.i=0;t.i0);A=-k,W[W[W.length-1]+P]=A,h[v]=A,v++}D[p]=A}}else{for(A=r(u,156)?r(u,128)?Hr:Lr:r(u,163)?Nr:Gr,e.Eb[0]=A,k=0;k<4;++k)W[k+W[W.length-1]]=A;for(k=0;k<4;++k)D[k]=A}if(e.Tc=r(u,142)?r(u,114)?r(u,183)?Hr:Lr:Nr:Gr,u.Ab)s=0;else{if(g.Nb)l.X=g.X=0,e.wa||(l.ua=g.ua=0),e.ja=0,e.Oa=0;else{let t=0,r=0;var m=0,w=da;const n=e.yb[e.Lb];var y=e.z;const a=e.La[0],f=d(4,0),c=d(4,0);let u=d(4,0),s=d(4,0),l=0,h=0;var S=0;let v=0,p=0;if(y=b(0,384),e.wa)m=0,w=e.R.z[3];else{const t=d(16,0);var T=g.ua+a.ua;g.ua=a.ua=(dt(o,e.R.z[1],T,n.sb,0,t)>0)+0,m=1,w=e.R.z[0];var R=t,O=y,V=d(16,0),I=0;for(I=0;I<4;++I){var _=R[0+I]+R[12+I],U=R[4+I]+R[8+I],M=R[4+I]-R[8+I],B=R[0+I]-R[12+I];V[0+I]=_+U,V[8+I]=_-U,V[4+I]=B+M,V[12+I]=B-M}for(I=0;I<4;++I){const t=O[O.length-1],e=V[0+4*I]+3;_=e+V[3+4*I],U=V[1+4*I]+V[2+4*I],M=V[1+4*I]-V[2+4*I],B=e-V[3+4*I],O[t+0]=_+U>>3,O[t+16]=B+M>>3,O[t+32]=_-U>>3,O[t+48]=B-M>>3,O[O.length-1]+=64}y[y.length-1]=0}for(u=i(va[15&g.X]),s=i(va[15&a.X]),v=0;v<4;++v){var j=s[v];for(S=0;S<4;++S){var G=dt(o,w,T=j+u[S],n.sc,m,y);u[S]=j=(G>0)+0,c[S]=(0!=y[y[y.length-1]+0])+0,f[S]=(G>1)+0,y[y.length-1]+=16}s[v]=j,h|=vt(c,24-4*v),l|=vt(f,24-4*v)}for(t=vt(u,24),r=vt(s,24),u=i(va[g.X>>4]),s=i(va[a.X>>4]),p=0;p<4;p+=2){for(v=0;v<2;++v){for(j=s[p+v],S=0;S<2;++S)T=j+u[p+S],G=dt(o,e.R.z[2],T,n.qc,0,y),u[p+S]=j=(G>0)+0,c[2*v+S]=(0!=y[y[y.length-1]+0])+0,f[2*v+S]=(G>1)+0,y[y.length-1]+=16;s[p+v]=j}h|=vt(c,8-2*p),l|=vt(f,8-2*p)}t|=vt(u,20),r|=vt(s,20),g.X=t,a.X=r,e.z=y,e.Oa=l+0,e.ja=l|h,g.Nb=!e.ja+0}s=!o.Ab}if(!s){f=lt(t,"VP8_STATUS_NOT_ENOUGH_DATA",`Premature end-of-file encountered.${t.i} ${t.d}`);break t}const E=t,C=E.Ea,F=nn,J=E.Ea,Y=an,x=E.Ea,Q=on;if(E.i>0){var N=0;for(N=-1;N<16;++N)it(C,F+N*en-4,C,F+N*en+12);for(N=-1;N<8;++N)it(J,Y+N*en-4,J,Y+N*en+4),it(x,Q+N*en-4,x,Q+N*en+4)}else{for(N=0;N<16;++N)C[F+N*en-1]=129;for(N=0;N<8;++N)J[Y+N*en-1]=129,x[Q+N*en-1]=129;E.d>0&&(C[F-1-en]=J[Y-1-en]=x[Q-1-en]=129)}const Z=E.Xc,tt=16*+E.i,et=E.Sc,rt=8*+E.i,nt=E.Vc,at=8*+E.i,ot=E.z;let ft=0;if(E.d>0)c(C,F-en,Z,tt,16),c(J,Y-en,et,rt,8),c(x,Q-en,nt,at,8);else if(0==E.i){for(n=0;n<21;++n)C[F-en-1+n]=127;for(n=0;n<9;++n)J[Y-en-1+n]=127;for(n=0;n<9;++n)x[Q-en-1+n]=127}if(E.wa){const t=F-en+16;E.d>0&&(E.i>=E.Ma-1?C[t+0]=C[t+1]=C[t+2]=C[t+3]=Z[tt+15]:c(C,t+0,Z,tt+16,4));for(let e=0;e<4;++e)C[e+t+4*en]=C[e+t+4*en]=C[e+t+8*en]=C[e+t+12*en]=C[e+t+0];for(ft=0;ft<16;ft++){var L=C,H=F+aa[ft];Dn[E.Eb[ft]](L,H),E.Oa&1<0){const t=ht.M[1+ht.i],e=ht.La[1+ht.i].Nb;let r=ht.Zb[ht.Lb];ht.ga.oc&&(r+=ht.ga.Lc[0],ht.wa&&(r+=ht.ga.Gc[0])),r=r<0?0:r>63?63:r,t.zc=r,ht.ga.kb>0&&(r=ht.ga.kb>4?r>>2:r>>1,r>9-ht.ga.kb&&(r=9-ht.ga.kb)),t.yc=r<1?1:r,t.ab=(!e||ht.wa)+0}var K=0,$=8*ht.Ja*ht.r,X=ht.ca,ut=ht.da+16*ht.i+16*ht.Ja*ht.H,bt=ht.aa,st=ht.ba+8*ht.i+$,pt=ht.ra,Pt=ht.sa+8*ht.i+$;for(K=0;K<16;++K)c(X,ut+K*ht.H,ht.Ea,+nn+K*en,16);for(K=0;K<8;++K)c(bt,st+K*ht.r,ht.Ea,+an+K*en,8),c(pt,Pt+K*ht.r,ht.Ea,+on+K*en,8)}const E=t,C=e;var At=1;const F=E.oa;if(E.qb){const t=E.rc;if(At&=WebPWorkerSync(t),g(t.a==OK),At){if(F.N=C,F.ha=E.Ja,F.d=E.d,F.W=E.W,F.W){const t=F.M;F.M=E.M,E.M=t}WebPWorkerLaunch(t),++E.Ja==E.jb&&(E.Ja=0)}}else{F.d=E.d,F.W=E.W;e:{let t=1;const e=E.oa,r=ea[E.A],n=r*E.H,a=parseInt(r/2)*E.r,f=16*e.ha*E.H,i=8*e.ha*E.r,u=E.ca,b=E.da-n+f,s=E.aa,l=E.ba-a+i,h=E.ra,d=E.sa-a+i,v=0==e.d,p=(e.d>=E.hb-1)+0;var kt=16*e.d;let P=16*(e.d+1);if(e.W){const t=E;let e=0;const r=t.oa.d;for(g(t.oa.W),e=t.lb;e0&&$n(u,b,c,h+4),i.ab&&Zn(u,b,c,h),o>0&&Qn(u,b,c,h+4),i.ab&&Xn(u,b,c,h);else{const t=n.r,e=n.aa,r=n.ba+8*f.ha*t+8*a,d=n.ra,v=n.sa+8*f.ha*t+8*a,p=n.Ac.fb?s>=40?2:s>=15?1:0:s>=40?3:s>=20?2:s>=15?1:0;a>0&&(Hn(u,b,c,h+4,l,p),qn(e,r,d,v,t,h+4,l,p)),i.ab&&(Jn(u,b,c,h,l,p),xn(e,r,d,v,t,h,l,p)),o>0&&(Ln(u,b,c,h+4,l,p),zn(e,r,d,v,t,h+4,l,p)),i.ab&&(Kn(u,b,c,h,l,p),Yn(e,r,d,v,t,h,l,p))}}}if(C.put){if(v?(C.y=E.ca,C.D=E.da+f,C.c=E.aa,C.B=E.ba+i,C.S=E.ra,C.C=E.sa+i):(kt-=r,C.y=u,C.D=b,C.c=s,C.B=l,C.S=h,C.C=d),p||(P-=r),P>C.K&&(P=C.K),E.Ga!=o&&kt>1),C.C+=E.r*(t>>1),C.p!=o&&(C.q+=C.width*t)}kt>1,C.C+=C.t>>1,C.p!=o&&(C.q+=C.t),C.w=kt-C.k,C.m=C.Ka-C.t,C.h=P-kt,t=C.put(C))}e.ha+1==E.jb&&!p&&(c(E.ca,E.da-n,u,b+16*E.H,n),c(E.aa,E.ba-a,s,l+8*E.r,a),c(E.ra,E.sa-a,h,d+8*E.r,a)),At=t}}if(!At){f=lt(t,"VP8_STATUS_USER_ABORT","Output aborted.");break t}}let a;if(!(a=t.qb&&!WebPWorkerSync(t.rc))){let e;(e=t.fc>0)&&(g(t),g(t.fc>0),e=!1),a=e}f=a?0:1}const a=f;e.Pb&&e.Pb(e),f=1&a}return f?(t.za=0,f):(gt(t),0)}function gt(t){t!=o&&(t.ib&&(t.ib=0),t.ib=o,t.Gb=0,t.za=0)}function Pt(t,e){return t+(1<>e}function At(t,e,r,n,a){const o=Ga[r]+Na[e]>>ga;e=Fa[e],n[a+0]=La[t+Ca[r]-Pa],n[a+1]=La[t+o-Pa],n[a+2]=La[t+e-Pa]}function kt(t,e,r,n,a){const o=Ga[r]+Na[e]>>ga;e=Fa[e],n[a+0]=248&La[t+Ca[r]-Pa]|La[t+o-Pa]>>5,n[a+1]=La[t+o-Pa]<<3&224|La[t+e-Pa]>>3}function mt(t,e,r,n,a){n[a+0]=255,At(t,e,r,n,a+1)}function wt(t,e,r,n,a){const o=Fa[e];n[a+0]=Ha[t+Ca[r]-Pa]<<4|Ha[t+(Ga[r]+Na[e]>>ga)-Pa],n[a+1]=15|Ha[t+o-Pa]<<4}function yt(t,e,r,n,a){const o=Ca[r];r=Ga[r]+Na[e]>>ga,n[a+0]=La[t+Fa[e]-Pa],n[a+1]=La[t+r-Pa],n[a+2]=La[t+o-Pa]}function St(t,e,r,n,a){yt(t,e,r,n,a),n[a+3]=255}function Tt(t,e,r,n,a){At(t,e,r,n,a),n[a+3]=255}function Rt(t,e,r){t[e]=((((4278255360&t[e])>>>0)+((4278255360&r)>>>0)&4278255360)>>>0|(16711935&t[e])+(16711935&r)&16711935)>>>0}function Ot(t,e){return((4278124286&(t^e))>>>1)+((t&e)>>>0)>>>0}function Vt(t){return t<256&&t>0?t:t<=0?0:~t>>24&255}function It(t,e){return Vt(t+parseInt((t-e)/2,10))}function _t(){return dr}function Wt(t,e){return(t&=255)>127&&(t-=256),(e&=255)>127&&(e-=256),t*e>>>5}function Ut(t,e,r,n,a,o,f){var c=0;const i=8>>t.n,u=t.U,b=t.u;if(i<8){t=(1<>8&255),o[f++]=b[e&s],e>>=i}}else for(c=e;c>8&255]}function Mt(t,e,r,n,a){for(r=e+r;e>16&255,n[a++]=r>>8&255,n[a++]=r>>0&255,n[a++]=r>>24&255}}function Bt(t,e,r,n,a){for(r=e+r;e>16&240|r>>12&15,n[a++]=r>>0&240|r>>28&15}}function Dt(t,e,r,n,a){for(r=e+r;e>24&255,n[a++]=r>>16&255,n[a++]=r>>8&255,n[a++]=r>>0&255}}function Et(t,e,r,n){return S(t,8)!=ir?0:(e[0]=S(t,ur)+1,r[0]=S(t,ur)+1,n[0]=S(t,1),S(t,br),1)}function jt(t,e){let r=0;return t<4?t+1:(r=t-2>>1,(2+(1&t)<e.ya){var r=t.Y,n=0;for(g(r!=o);0!=r[n].s;){var a=r,f=e;const t=f.T>>f.g&1;f.L?f.fa=1:(++f.g,f.g>=8&&w(f),f.Q==f.ya&&32==f.g&&(f.L=1)),n=n+a[n].s+t}return r[n].kc}for(n=0,g((r=t.Y)!=o);0!=r[n].s;)a=r,f=e.T>>e.g&1,++e.g,n=n+a[n].s+f;return r[n].kc}function Ft(t,e){if(t!=o){var r=0,n=0;for(r=0;r>t.eb)+(e>>t.eb)])0;){e=t.nc[a];let O=i;var h=b,d=l;switch(l=n,b=r,g(O<(v=u)),g(v<=e.Vb),e.Qc){case wr:for(h=0,e=b+(v-O)*e.U;b>8&255,P=16711935&(P=(P=(16711935&v[d])>>>0)+(p<<16|p));l[b++]=((4278255360&v[d])>>>0|P)>>>0,32==O&&h++}break;case kr:var A=O;if(h=v,d=l,p=b,P=(S=e).U,0==A){var k=0;for(Rt(d,p,dr),k=1;k>S.n)*w;A>8&15],k=1;k>8&15]),e=t(d[p+k-1],d,p+k-P),Rt(d,p+k,e)}p+=P,0==(++A&m)&&(S+=w)}v!=e.Vb&&c(l,b-(e=e.U),l,b+(v-O-1)*e,e);break;case mr:for(h=e.U,d=(1<>e.n)*p;O>0&255,S.Bc=y>>8&255,S.Kc=y>>16&255),S=(y=l[b+w])>>>8,T=y>>>16,R=y,T+=Wt(m.Cc,S),T&=255,R+=Wt(m.Bc,S),R+=Wt(m.Kc,T),R&=255,l[b+w]=(4278255360&y|T<<16|R)>>>0;b+=h,++O,0==(O&d)&&(e+=p)}break;case yr:h==l&&e.n>0?(h=(v-O)*Pt(e.U,e.n),s(l,d=b+(v-O)*e.U-h,l,b,h),Ut(e,O,v,l,d,l,b)):Ut(e,O,v,h,d,l,b)}b=n,l=r}}function Lt(t,e){var r=t.V,n=t.Ha+t.l*t.O;if(!((o=e-t.O)<=0)){Nt(t,o,r,n);var a=t.N;r=t.Xa;let l=[t.vb];n=t.O;var o=e,f=l,c=a.width;if(g(na.K&&(o=a.K),n=o?n=0:(f[0]+=a.t,a.w=n-a.k,a.m=a.Ka-a.t,a.h=o-n,n=1),n){if(l=l[0],n=t.Ib,o=a.width,n.J0;){const t=r;let n=l,a=i;const b=f;let h=e;switch(c){case Ie:for(a=n+a;n>16&255,b[h++]=s>>8&255,b[h++]=s>>0&255}break;case _e:Mt(t,n,a,b,h);break;case Ee:Mt(t,n,a,b,h),WebPApplyAlphaMultiply(b,0,a,1,0);break;case We:for(a=n+a;n>0&255,b[h++]=s>>8&255,b[h++]=s>>16&255;break;case Ue:Dt(t,n,a,b,h);break;case je:Dt(t,n,a,b,h),WebPApplyAlphaMultiply(b,0,a,1,0);break;case Me:Dt(t,n,a,b,h);break;case Ce:Dt(t,n,a,b,h),WebPApplyAlphaMultiply(b,1,a,1,0);break;case Be:Bt(t,n,a,b,h);break;case Fe:Bt(t,n,a,b,h),WebPApplyAlphaMultiply4444(b,a,1,0);break;case De:for(a=n+a;n>16&248|s>>13&7,b[h++]=s>>5&224|s>>3&31;break;default:g(0)}l+=o,e+=u}r=a}t.xa+=r}else t.xa=a.I?EmitRescaledRowsYUVA(t,r,l,o,a.h):EmitRowsYUVA(t,r,l,o,a.m,a.h);g(t.xa<=n.height)}t.O=e,g(t.O<=t.v)}}function Ht(t,e,r,n,a,f){let c=1,i=0,u=0;const b=t.o,s=t.cb;let l=s.Db,h=r,d=r;r+=n*a;const v=(a=gr+Pr)+s.xb,p=s.xb>0?s.Yb:o,P=s.Dc;let A=!1;for(g(l!=o);!b.L&&h>>0)+(A<<16)+(c<<8)+k}if(A=!1,++h,++i,i>=n&&(i=0,++u,f!=o&&u%wa==0&&f(t,u),p!=o))for(;d>>p.bb]=c}else if(wDa?k-=Da:(w=Ea[k-1],w=(w>>4)*n+(8-(15&w)),k=w>=1?w:1),w=0,w=0;w=n;)i-=n,++u,f!=o&&u%wa==0&&f(t,u);if(h>>p.bb]=c}else if(w>>p.bb]=w;w=e,k=h,g(A<=-1>>>(m=p).bb),w[k]=m.ea[A],A=!0;continue}(c=!b.fa)||End}return f!=o&&f(t,u),b.fa||!c||b.L&&h16?0:h>4?1:h>2?2:3,l[0]=Pt(c.U,p),c.n=p,l=p=Jt(h,1,0,_,c.u))if(l=h,p=0,h=1<<(8>>>(_=c).n)>>>0,(P=Array(h))==o)l=0;else{A=_.u[0];var k=_.b;for(P[0]=_.u[0][_.b+0],p=1;p>>0)+((4278255360&P[p-1])>>>0)&4278255360)>>>0|(16711935&A[k+p])+(16711935&P[p-1])&16711935)>>>0;for(;p=1&&s<=lr)){n.a=Je;break}if(c)t:{c=n;var m=t[0],w=e[0],_=(l=s,k=A=0,k=c.o,c.cb);if(p=[o],h=o,P=1,r&&S(k,1)){if(w=(m=Pt(m,A=S(k,3)+2))*(W=Pt(w,A)),!Jt(m,W,0,c,p)){c.a=Je,Ft(h,P),c=0;break t}for(p=p[0],_.eb=A,A=0;A>>8&65535,p[A]=m,m>=P&&(P=m+1)}if(k.fa)Ft(h,P),c=0;else if(g(P<=65536),(h=v(P,mn))==o)c.a=qe,Ft(h,P),c=0;else{for(A=0;A0&&(m+=1<=t){(E=E&&T(e))||O(e),U=E;break r}if(!V(e,M[j],B[j],D[j])){(E=E&&T(e))||O(e),U=E;break r}}(E=(E=1)&&T(e))||O(e),U=E}else U=0}}else{if(U=0,B=[],(M=S(W,4)+4)>Ma){m.a=Je,m=0;break e}if((D=Array(t))==o){m.a=qe,m=0;break e}for(U=0;UB){U.a=Je,O(a),U=E;break r}}else r=B;for(e=0;eB){U.a=Je,O(a),U=E;break r}for(C=C?n:0;F-- >0;)M[e++]=C}}E=1,O(a),U=E}else U.a=Je,U=0}U&&(U=I(e,D,t))}(U=U&&!W.fa)?m=1:(m.a=Je,m=0)}if(!m){Ft(h,P),c=0;break t}}_.ac=p,_.hc=P,_.Db=h,c=1}}if(!c){n.a=Je;break}if(s>0){if(u.xb=1<0),l.ea=d(_,0),l.ea==o?s=0:(l.bb=32-s,s=1),!s){n.a=qe,c=0;break}}else u.xb=0;if(s=n,l=t[0],_=e[0],h=(p=s.cb).eb,s.l=l,s.v=_,p.Ec=Pt(l,h),p.Dc=0==h?-1:(1<>>8&255;t.O=t.xa=e}}function ut(t,e){return t<0?0:t>e?e:t}function Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,g,P){let A;const k=p-1>>1;let m=a[o+0]|f[c+0]<<16,w=i[u+0]|b[s+0]<<16;if(t){var y=3*m+w+131074>>2;g(t[e+0],255&y,y>>16,l,h)}for(r&&(y=3*w+m+131074>>2,g(r[n+0],255&y,y>>16,d,v)),A=1;A<=k;++A){const p=a[o+A]|f[c+A]<<16,k=i[u+A]|b[s+A]<<16,S=(y=m+p+w+k+524296)+2*(p+w)>>3,T=y+2*(m+k)>>3;t&&(y=S+m>>1,m=T+p>>1,g(t[e+2*A-1],255&y,y>>16,l,h+(2*A-1)*P),g(t[e+2*A-0],255&m,m>>16,l,h+(2*A-0)*P)),r&&(y=T+w>>1,m=S+k>>1,g(r[n+2*A-1],255&y,y>>16,d,v+(2*A-1)*P),g(r[n+2*A+0],255&m,m>>16,d,v+(2*A+0)*P)),m=p,w=k}1&p||(t&&(y=3*m+w+131074>>2,g(t[e+p-1],255&y,y>>16,l,h+(p-1)*P)),r&&(y=3*w+m+131074>>2,g(r[n+p-1],255&y,y>>16,d,v+(p-1)*P)))}function $t(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,At,3)}function Xt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,yt,3)}function Zt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,Tt,4)}function te(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,St,4)}function ee(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,mt,4)}function re(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,wt,2)}function ne(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,kt,2)}function ae(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d){let v;for(v=0;v0;){var f=t,c=e+(r?1:0),i=t,u=e+(r?0:3),b=0;for(b=0;b>1)*r.nb,i=r.S,u=r.C+(t.w>>1)*r.rb,b=t.m,s=t.h,l=parseInt((b+1)/2,10),h=parseInt((s+1)/2,10);let d;for(d=0;d>4;b[s+2*h]=240&b[s+2*h]|t,l&=t}a+=e.width,s+=i.f}15!=l&&t(c)&&WebPApplyAlphaMultiply4444(b,f,o,u,i.f)}return 0}function ge(e){let r=e.ka;const n=r.j.J,a=n>1,n=e.m+2*t;let a;const f=[];for(a=0;a>ga,Na[e]=-22014*(e-128)+ja,Ga[e]=-45773*(e-128),Fa[e]=113618*(e-128)+ja>>ga;for(e=Pa;e>ga,La[e-Pa]=ut(r,255),Ha[e-Pa]=ut(r+8>>4,15);za=1}return 1}function Pe(t){const e=t.ka;let r=t.m;const n=t.h;return g(!(1&t.w)),r<=0||n<=0?0:(r=e.$a(t,e),e.ec+=r,e.zb&&e.zb(t,e),1)}function Ae(t){(t=t.ka).memory="",t.memory=o}function ke(t,e){return t[e+0]|t[e+1]<<8|t[e+2]<<16}function me(t,e){return(ke(t,e)|t[e+3]<<24)>>>0}function we(t,e,r,n,a,c,i){var u=0,b=[0],s="VP8StatusCode";const l=f(rr);if(t==o||r[0]<_r)return $e;l.data=t,l.b=[e[0]],l.e=[r[0]],l.na=[l.na];t:{if(u=l.na,g(t!=o),g(r!=o),g(u!=o),u[0]=0,r[0]>=_r&&!h(t,e[0],"RIFF",Vr)){if(h(t,e[0]+8,"WEBP",Vr)){s=Je;break t}if((P=me(t,e[0]+Vr))0,P=[0];t:if(s=Ir+Wr,g(t!=o),g(r!=o),g(b!=o),b[0]=0,r[0]=Mr){s=Je;break t}P!=o&&(P[0]=p),n!=o&&(n[0]=d),a!=o&&(a[0]=v),e[0]+=s,r[0]-=s,b[0]=1}s=ze}if(s!=ze)return s;if(!u&&b[0])return Je;if(c!=o&&(c[0]=!!(P[0]&Ur)),b&&i==o)return ze;if(r0&&n>b){s=Je;break t}if(p=d&&v>b-d){s=Je;break t}u[0]=v,e[0]+=Ir,r[0]-=Ir,P[0]=s}else P[0]=r>=1&&t[e+0]==ir,u[0]=r[0];s=ze}if(l.ta=l.ta[0],l.ia=l.ia[0],s!=ze)return s;if(l.ta>Br)return Je;if(l.ia){if(r[0]=3&&157==t[b+3+0]&&1==t[b+3+1]&&42==t[b+3+2]?(u=t[b+0]|t[b+1]<<8|t[b+2]<<16,P=16383&(t[b+7]<<8|t[b+6]),t=16383&(t[b+9]<<8|t[b+8]),!(!(1&u)+0)||(u>>1&7)>3||!(u>>4&1)||u>>5>=l.ta?t=0:(n&&(n[0]=P),a&&(a[0]=t),t=1)):t=0}return t?(c!=o&&(c[0]|=l.$!=o),i!=o&&(i[0]=l,i[0].offset=e[0]-i[0].b,g(e[0]-i[0].b0,e.Ua&&(i=t.wc,u=t.vc,f=t.t,c=t.k,rn||c+u>a))return 0;if(e.t=f,e.k=c,e.Ka=f+i,e.K=c+u,e.m=i,e.h=u,e.I=t!=o&&t.I>0,e.I){if(t.Ba<=0||t.Aa<=0)return 0;e.Ba=t.Ba,e.Aa=t.Aa}return e.Za=t&&t.Za,e.Bb=t==o||!t.ed,e.I&&(e.Za=e.Ba<3*n/4&&e.Aa<3*a/4,e.Bb=0),1}var Ve=512,Ie=0,_e=1,We=2,Ue=3,Me=4,Be=5,De=6,Ee=7,je=8,Ce=9,Fe=10,Ge=11,Ne=12,Le=13;this.WEBP_CSP_MODE=this.Cd={nd:0,od:1,kd:2,ld:3,jd:4,pd:5,qd:6,rd:7,sd:8,md:9};var He={J:"WEBP_CSP_MODE",width:0,height:0,Fc:0,c:{RGBA:{ma:0,Sa:0,f:0,size:0},Va:{y:0,c:0,S:0,p:0,D:0,B:0,C:0,q:0,F:0,nb:0,rb:0,Fa:0,Wc:0,Rc:0,Uc:0,Wb:0}},Ic:d(4,0),Jb:o,jc:0},ze=0,qe=1,Ke=2,Je=3,Ye=4,xe=5,Qe=6,$e=7;this.VP8StatusCode=this.td={xd:0,yd:1,vd:2,ud:3,Ad:4,zd:5,Bd:6,wd:7};var Xe={width:{value:0},height:{value:0},$b:{value:0},tc:0,Yd:0,rotate:0,be:0,Ic:d(3,0)};this.WebPGetFeatures=this.Md=function(t,e,r){let n="VP8StatusCode";return Ve>>>8!=Ve>>>8||r==o?t=Ke:(n=Re(t,[0],e=[e],r),t=n==$e?Je:n),t};const Ze={Za:0,ed:0,Ua:0,t:0,k:0,wc:0,vc:0,I:0,Ba:0,Aa:0,ae:0,Td:0,Xd:0,Ic:d(6,0)};this.WebPDecoderConfig=this.Kd={input:f(Xe),j:f(He),options:f(Ze)},this.WebPInitDecoderConfig=this.Nd=function(t){return Ve>>>8!=Ve>>>8||t==o?t=0:(g((t=t.input)!=o),t.tc=0,t=1),t};var tr={width:0,height:0,w:0,m:0,h:0,y:0,c:0,S:0,D:0,B:0,C:0,F:0,Da:0,ka:0,put:0,Mb:0,Pb:0,Bb:0,e:0,data:0,b:0,Za:0,Ua:0,t:0,Ka:0,k:0,K:0,I:0,Ba:0,Aa:0,p:0,q:0},er={j:f(He),Sb:0,Qb:0,lc:0,Tb:0,Rb:0,mc:0,ec:0,Qa:f(Ze),memory:0,$a:"(OutputFunc)",zb:"(OutputFunc)",ad:"(OutputRowFunc)"},rr={data:0,b:0,e:0,offset:0,$:o,G:0,pa:0,ta:0,na:0,ia:0},nr={qa:0,Ia:o,Pd:0,Ab:0,la:0,Z:0,gc:0},ar={T:0,qa:0,Ia:0,ya:0,Q:0,g:0,L:0,fa:0},or=25,fr=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215],cr=10,ir=47,ur=14,br=3,sr=5,lr=11,hr=5,dr=4278190080,vr=8,pr=15,gr=256,Pr=24,Ar=4,kr=0,mr=1,wr=2,yr=3,Sr=1,Tr=0,Rr=1,Or=1,Vr=4,Ir=8,_r=12,Wr=10,Ur=16,Mr=1*Math.pow(2,32),Br=-1-Ir-1>>>0,Dr={kc:0,s:0},Er={Y:"HuffmanTreeNode*",gb:0,Pa:0},jr=-1;var Cr=506832829,Fr=0,Gr=Fr,Nr=2,Lr=3,Hr=1,zr=4,qr=5,Kr=6,Jr=3,Yr=4,xr=4,Qr=4,$r=4,Xr=8,Zr=3,tn=11,en=32,rn=17*en+9*en,nn=1*en+8,an=nn+16*en+en,on=an+16,fn={fb:0,Jc:0,Nc:0,Ra:0},cn={l:0,v:0,gd:0,hd:0,uc:0,$c:0};const un={pb:0,ob:0,tb:0,Kb:d(Yr,0),Cb:d(Yr,0)},bn={Ta:d(Jr,0),z:p([$r,Xr,Zr,tn],0)},sn={Oc:0,Fb:0,kb:0,oc:0,Lc:d(xr,0),Gc:d(xr,0)};var ln={zc:0,yc:0,ab:0},hn={X:0,ua:0,Nb:0};const dn=d(2,0),vn={sc:f(dn),sb:f(dn),qc:f(dn)},pn={ha:0,d:0,W:0,M:ln,N:tr};var gn={a:"VP8StatusCode",za:0,xc:0,o:f(nr),Ac:f(fn),P:f(cn),ga:f(sn),Ca:f(un),rc:"WebPWorker",qb:0,Ja:0,jb:0,oa:pn,Ma:0,hb:0,lb:0,mb:0,wb:0,Ya:0,Hb:0,ic:v(8,nr),Zc:0,yb:v(Yr,vn),R:f(bn),pc:0,Pc:0,dc:0,cc:d(4,0),Xc:0,Sc:0,Vc:0,La:f(hn),M:f(ln),Ea:0,z:0,ca:0,aa:0,ra:0,da:0,ba:0,sa:0,H:0,r:0,ib:0,Gb:0,i:0,d:0,wa:0,Eb:d(16,0),Vd:0,Tc:0,Lb:0,ja:0,Oa:0,A:0,W:0,Zb:d(Yr,0),Ga:o,G:0,ub:0,Xb:0,Od:0,cd:0,dd:0,Wd:0,fc:0},Pn=0,An=1,kn=2;var mn={va:v(hr,Er)};const wn={xb:0,Yb:f({ea:0,bb:0}),Dc:0,eb:0,Ec:0,ac:0,bd:0,hc:0,Db:"HTreeGroup"};var yn={a:"VP8StatusCode",Wa:"VP8LDecodeState",Ob:"VP8LDecodeState",N:"VP8Io",Ib:"WebPDecBuffer",Hc:"WebPDecBuffer",V:0,Ha:0,Xa:0,vb:0,o:f(ar),l:0,v:0,O:0,xa:0,cb:f(wn),Na:0,nc:v(Ar,{Qc:"VP8LImageTransformType",n:0,U:0,Vb:0,u:0,b:0}),Ub:0,Mc:0,$d:0,Zd:"*WebPRescaler"},Sn=4,Tn=[o,function(t,e,r,n,a,f,i,u){let b=0,s=u;for(g(t!=o),g(i!=o),g(r>0),g(n>0),g(a>0),g(f>=r*a),b=0;b0),g(n>0),g(a>0),g(f>=r*a),c(i,u,t,e,a),_(t,e+a,i,s,i,u+a,a*(r-1)),b=1;b0),g(n>0),g(a>0),g(f>=r*a),c(i,u,t,e,a),_(t,e+a,i,b,i,u+a,a*(r-1)),s=1;s255?255:r)&255}}}],Rn=[3,4,3,4,4,2,2,4,4,4,2,1,1];this.WebPFreeDecBuffer=this.Yc=function(t){t!=o&&(t.Fc||(t.Jb=""),t.jc=0,t.Jb=t.jc=o)},a=this;var On=d(511,0),Vn=d(511,0),In=d(2041,0),_n=d(225,0),Wn=d(766,0),Un=0,Mn=85627,Bn=35468,Dn=[function(t,e){let r,n=4;for(r=0;r<4;++r)n+=t[e+r-en]+t[e-1+r*en];for(n>>=3,r=0;r<4;++r)l(t,e+r*en,n,4)},function(t,e){G(t,e,4)},function(t,e){let r=e-en;const n=[];for(n.push(L(t[r-1],t[r+0],t[r+1])),n.push(L(t[r+0],t[r+1],t[r+2])),n.push(L(t[r+1],t[r+2],t[r+3])),n.push(L(t[r+2],t[r+3],t[r+4])),r=0;r<4;++r)c(t,e+r*en,n,0,4)},function(t,e){const r=t[e-1],n=t[e-1+en],a=t[e-1+2*en],o=t[e-1+3*en];t[e+0+0*en]=t[e+1+0*en]=t[e+2+0*en]=t[e+3+0*en]=L(t[e-1-en],r,n),t[e+0+1*en]=t[e+1+1*en]=t[e+2+1*en]=t[e+3+1*en]=L(r,n,a),t[e+0+2*en]=t[e+1+2*en]=t[e+2+2*en]=t[e+3+2*en]=L(n,a,o),t[e+0+3*en]=t[e+1+3*en]=t[e+2+3*en]=t[e+3+3*en]=L(a,o,o)},function(t,e){const r=t[e-1+0*en],n=t[e-1+1*en],a=t[e-1+2*en],o=t[e-1-en],f=t[e+0-en],c=t[e+1-en],i=t[e+2-en],u=t[e+3-en];t[e+0+3*en]=L(n,a,t[e-1+3*en]),t[e+0+2*en]=t[e+1+3*en]=L(r,n,a),t[e+0+1*en]=t[e+1+2*en]=t[e+2+3*en]=L(o,r,n),t[e+0+0*en]=t[e+1+1*en]=t[e+2+2*en]=t[e+3+3*en]=L(f,o,r),t[e+1+0*en]=t[e+2+1*en]=t[e+3+2*en]=L(c,f,o),t[e+2+0*en]=t[e+3+1*en]=L(i,c,f),t[e+3+0*en]=L(u,i,c)},function(t,e){const r=t[e-1+0*en],n=t[e-1+1*en],a=t[e-1+2*en],o=t[e-1-en],f=t[e+0-en],c=t[e+1-en],i=t[e+2-en],u=t[e+3-en];t[e+0+0*en]=t[e+1+2*en]=o+f+1>>1,t[e+1+0*en]=t[e+2+2*en]=f+c+1>>1,t[e+2+0*en]=t[e+3+2*en]=c+i+1>>1,t[e+3+0*en]=i+u+1>>1,t[e+0+3*en]=L(a,n,r),t[e+0+2*en]=L(n,r,o),t[e+0+1*en]=t[e+1+3*en]=L(r,o,f),t[e+1+1*en]=t[e+2+3*en]=L(o,f,c),t[e+2+1*en]=t[e+3+3*en]=L(f,c,i),t[e+3+1*en]=L(c,i,u)},function(t,e){const r=t[e+1-en],n=t[e+2-en],a=t[e+3-en],o=t[e+4-en],f=t[e+5-en],c=t[e+6-en],i=t[e+7-en];t[e+0+0*en]=L(t[e+0-en],r,n),t[e+1+0*en]=t[e+0+1*en]=L(r,n,a),t[e+2+0*en]=t[e+1+1*en]=t[e+0+2*en]=L(n,a,o),t[e+3+0*en]=t[e+2+1*en]=t[e+1+2*en]=t[e+0+3*en]=L(a,o,f),t[e+3+1*en]=t[e+2+2*en]=t[e+1+3*en]=L(o,f,c),t[e+3+2*en]=t[e+2+3*en]=L(f,c,i),t[e+3+3*en]=L(c,i,i)},function(t,e){const r=t[e+0-en],n=t[e+1-en],a=t[e+2-en],o=t[e+3-en],f=t[e+4-en],c=t[e+5-en],i=t[e+6-en],u=t[e+7-en];t[e+0+0*en]=r+n+1>>1,t[e+1+0*en]=t[e+0+2*en]=n+a+1>>1,t[e+2+0*en]=t[e+1+2*en]=a+o+1>>1,t[e+3+0*en]=t[e+2+2*en]=o+f+1>>1,t[e+0+1*en]=L(r,n,a),t[e+1+1*en]=t[e+0+3*en]=L(n,a,o),t[e+2+1*en]=t[e+1+3*en]=L(a,o,f),t[e+3+1*en]=t[e+2+3*en]=L(o,f,c),t[e+3+2*en]=L(f,c,i),t[e+3+3*en]=L(c,i,u)},function(t,e){const r=t[e-1+0*en],n=t[e-1+1*en],a=t[e-1+2*en],o=t[e-1+3*en],f=t[e-1-en],c=t[e+0-en],i=t[e+1-en],u=t[e+2-en];t[e+0+0*en]=t[e+2+1*en]=r+f+1>>1,t[e+0+1*en]=t[e+2+2*en]=n+r+1>>1,t[e+0+2*en]=t[e+2+3*en]=a+n+1>>1,t[e+0+3*en]=o+a+1>>1,t[e+3+0*en]=L(c,i,u),t[e+2+0*en]=L(f,c,i),t[e+1+0*en]=t[e+3+1*en]=L(r,f,c),t[e+1+1*en]=t[e+3+2*en]=L(n,r,f),t[e+1+2*en]=t[e+3+3*en]=L(a,n,r),t[e+1+3*en]=L(o,a,n)},function(t,e){const r=t[e-1+0*en],n=t[e-1+1*en],a=t[e-1+2*en],o=t[e-1+3*en];t[e+0+0*en]=r+n+1>>1,t[e+2+0*en]=t[e+0+1*en]=n+a+1>>1,t[e+2+1*en]=t[e+0+2*en]=a+o+1>>1,t[e+1+0*en]=L(r,n,a),t[e+3+0*en]=t[e+1+1*en]=L(n,a,o),t[e+3+1*en]=t[e+1+2*en]=L(a,o,o),t[e+3+2*en]=t[e+2+2*en]=t[e+0+3*en]=t[e+1+3*en]=t[e+2+3*en]=t[e+3+3*en]=o}],En=[function(t,e){let r,n=16;for(r=0;r<16;++r)n+=t[e-1+r*en]+t[e+r-en];N(n>>5,t,e)},function(t,e){G(t,e,16)},function(t,e){let r;for(r=0;r<16;++r)c(t,e+r*en,t,e-en,16)},function(t,e){let r;for(r=16;r>0;--r)l(t,e+0,t[e-1],16),e+=en},function(t,e){let r,n=8;for(r=0;r<16;++r)n+=t[e-1+r*en];N(n>>4,t,e)},function(t,e){let r,n=8;for(r=0;r<16;++r)n+=t[e+r-en];N(n>>4,t,e)},function(t,e){N(128,t,e)}],jn=[function(t,e){let r,n=8;for(r=0;r<8;++r)n+=t[e+r-en]+t[e-1+r*en];H(1*(n>>4),t,e)},function(t,e){G(t,e,8)},function(t,e){let r;for(r=0;r<8;++r)c(t,e+r*en,t,e-en,8)},function(t,e){let r;for(r=0;r<8;++r)l(t,e+0,t[e-1],8),e+=en},function(t,e){let r,n=4;for(r=0;r<8;++r)n+=t[e-1+r*en];H(1*(n>>3),t,e)},function(t,e){let r,n=4;for(r=0;r<8;++r)n+=t[e+r-en];H(1*(n>>3),t,e)},function(t,e){H(128,t,e)}];let Cn,Fn,Gn,Nn,Ln,Hn,zn,qn,Kn,Jn,Yn,xn,Qn,$n,Xn,Zn;var ta=31,ea=[0,2,8],ra=3,na=1,aa=[0+0*en,4+0*en,8+0*en,12+0*en,0+4*en,4+4*en,8+4*en,12+4*en,0+8*en,4+8*en,8+8*en,12+8*en,0+12*en,4+12*en,8+12*en,12+12*en],oa=[4,5,6,7,8,9,10,10,11,12,13,14,15,16,17,17,18,19,20,20,21,21,22,22,23,23,24,25,25,26,27,28,29,30,31,32,33,34,35,36,37,37,38,39,40,41,42,43,44,45,46,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,76,77,78,79,80,81,82,83,84,85,86,87,88,89,91,93,95,96,98,100,101,102,104,106,108,110,112,114,116,118,122,124,126,128,130,132,134,136,138,140,143,145,148,151,154,157],fa=[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,119,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,177,181,185,189,193,197,201,205,209,213,217,221,225,229,234,239,245,249,254,259,264,269,274,279,284],ca=[-Fr,1,-1,2,-2,3,4,6,-3,5,-4,-5,-6,7,-7,8,-8,-9],ia=[[[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]],[[253,136,254,255,228,219,128,128,128,128,128],[189,129,242,255,227,213,255,219,128,128,128],[106,126,227,252,214,209,255,255,128,128,128]],[[1,98,248,255,236,226,255,255,128,128,128],[181,133,238,254,221,234,255,154,128,128,128],[78,134,202,247,198,180,255,219,128,128,128]],[[1,185,249,255,243,255,128,128,128,128,128],[184,150,247,255,236,224,128,128,128,128,128],[77,110,216,255,236,230,128,128,128,128,128]],[[1,101,251,255,241,255,128,128,128,128,128],[170,139,241,252,236,209,255,255,128,128,128],[37,116,196,243,228,255,255,255,128,128,128]],[[1,204,254,255,245,255,128,128,128,128,128],[207,160,250,255,238,128,128,128,128,128,128],[102,103,231,255,211,171,128,128,128,128,128]],[[1,152,252,255,240,255,128,128,128,128,128],[177,135,243,255,234,225,128,128,128,128,128],[80,129,211,255,194,224,128,128,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[246,1,255,128,128,128,128,128,128,128,128],[255,128,128,128,128,128,128,128,128,128,128]]],[[[198,35,237,223,193,187,162,160,145,155,62],[131,45,198,221,172,176,220,157,252,221,1],[68,47,146,208,149,167,221,162,255,223,128]],[[1,149,241,255,221,224,255,255,128,128,128],[184,141,234,253,222,220,255,199,128,128,128],[81,99,181,242,176,190,249,202,255,255,128]],[[1,129,232,253,214,197,242,196,255,255,128],[99,121,210,250,201,198,255,202,128,128,128],[23,91,163,242,170,187,247,210,255,255,128]],[[1,200,246,255,234,255,128,128,128,128,128],[109,178,241,255,231,245,255,255,128,128,128],[44,130,201,253,205,192,255,255,128,128,128]],[[1,132,239,251,219,209,255,165,128,128,128],[94,136,225,251,218,190,255,255,128,128,128],[22,100,174,245,186,161,255,199,128,128,128]],[[1,182,249,255,232,235,128,128,128,128,128],[124,143,241,255,227,234,128,128,128,128,128],[35,77,181,251,193,211,255,205,128,128,128]],[[1,157,247,255,236,231,255,255,128,128,128],[121,141,235,255,225,227,255,255,128,128,128],[45,99,188,251,195,217,255,224,128,128,128]],[[1,1,251,255,213,255,128,128,128,128,128],[203,1,248,255,255,128,128,128,128,128,128],[137,1,177,255,224,255,128,128,128,128,128]]],[[[253,9,248,251,207,208,255,192,128,128,128],[175,13,224,243,193,185,249,198,255,255,128],[73,17,171,221,161,179,236,167,255,234,128]],[[1,95,247,253,212,183,255,255,128,128,128],[239,90,244,250,211,209,255,255,128,128,128],[155,77,195,248,188,195,255,255,128,128,128]],[[1,24,239,251,218,219,255,205,128,128,128],[201,51,219,255,196,186,128,128,128,128,128],[69,46,190,239,201,218,255,228,128,128,128]],[[1,191,251,255,255,128,128,128,128,128,128],[223,165,249,255,213,255,128,128,128,128,128],[141,124,248,255,255,128,128,128,128,128,128]],[[1,16,248,255,255,128,128,128,128,128,128],[190,36,230,255,236,255,128,128,128,128,128],[149,1,255,128,128,128,128,128,128,128,128]],[[1,226,255,128,128,128,128,128,128,128,128],[247,192,255,128,128,128,128,128,128,128,128],[240,128,255,128,128,128,128,128,128,128,128]],[[1,134,252,255,255,128,128,128,128,128,128],[213,62,250,255,255,128,128,128,128,128,128],[55,93,255,128,128,128,128,128,128,128,128]],[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]]],[[[202,24,213,235,186,191,220,160,240,175,255],[126,38,182,232,169,184,228,174,255,187,128],[61,46,138,219,151,178,240,170,255,216,128]],[[1,112,230,250,199,191,247,159,255,255,128],[166,109,228,252,211,215,255,174,128,128,128],[39,77,162,232,172,180,245,178,255,255,128]],[[1,52,220,246,198,199,249,220,255,255,128],[124,74,191,243,183,193,250,221,255,255,128],[24,71,130,219,154,170,243,182,255,255,128]],[[1,182,225,249,219,240,255,224,128,128,128],[149,150,226,252,216,205,255,171,128,128,128],[28,108,170,242,183,194,254,223,255,255,128]],[[1,81,230,252,204,203,255,192,128,128,128],[123,102,209,247,188,196,255,233,128,128,128],[20,95,153,243,164,173,255,203,128,128,128]],[[1,222,248,255,216,213,128,128,128,128,128],[168,175,246,252,235,205,255,255,128,128,128],[47,116,215,255,211,212,255,255,128,128,128]],[[1,121,236,253,212,214,255,255,128,128,128],[141,84,213,252,201,202,255,219,128,128,128],[42,80,160,240,162,185,255,205,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[244,1,255,128,128,128,128,128,128,128,128],[238,1,255,128,128,128,128,128,128,128,128]]]],ua=[[[231,120,48,89,115,113,120,152,112],[152,179,64,126,170,118,46,70,95],[175,69,143,80,85,82,72,155,103],[56,58,10,171,218,189,17,13,152],[114,26,17,163,44,195,21,10,173],[121,24,80,195,26,62,44,64,85],[144,71,10,38,171,213,144,34,26],[170,46,55,19,136,160,33,206,71],[63,20,8,114,114,208,12,9,226],[81,40,11,96,182,84,29,16,36]],[[134,183,89,137,98,101,106,165,148],[72,187,100,130,157,111,32,75,80],[66,102,167,99,74,62,40,234,128],[41,53,9,178,241,141,26,8,107],[74,43,26,146,73,166,49,23,157],[65,38,105,160,51,52,31,115,128],[104,79,12,27,217,255,87,17,7],[87,68,71,44,114,51,15,186,23],[47,41,14,110,182,183,21,17,194],[66,45,25,102,197,189,23,18,22]],[[88,88,147,150,42,46,45,196,205],[43,97,183,117,85,38,35,179,61],[39,53,200,87,26,21,43,232,171],[56,34,51,104,114,102,29,93,77],[39,28,85,171,58,165,90,98,64],[34,22,116,206,23,34,43,166,73],[107,54,32,26,51,1,81,43,31],[68,25,106,22,64,171,36,225,114],[34,19,21,102,132,188,16,76,124],[62,18,78,95,85,57,50,48,51]],[[193,101,35,159,215,111,89,46,111],[60,148,31,172,219,228,21,18,111],[112,113,77,85,179,255,38,120,114],[40,42,1,196,245,209,10,25,109],[88,43,29,140,166,213,37,43,154],[61,63,30,155,67,45,68,1,209],[100,80,8,43,154,1,51,26,71],[142,78,78,16,255,128,34,197,171],[41,40,5,102,211,183,4,1,221],[51,50,17,168,209,192,23,25,82]],[[138,31,36,171,27,166,38,44,229],[67,87,58,169,82,115,26,59,179],[63,59,90,180,59,166,93,73,154],[40,40,21,116,143,209,34,39,175],[47,15,16,183,34,223,49,45,183],[46,17,33,183,6,98,15,32,183],[57,46,22,24,128,1,54,17,37],[65,32,73,115,28,128,23,128,205],[40,3,9,115,51,192,18,6,223],[87,37,9,115,59,77,64,21,47]],[[104,55,44,218,9,54,53,130,226],[64,90,70,205,40,41,23,26,57],[54,57,112,184,5,41,38,166,213],[30,34,26,133,152,116,10,32,134],[39,19,53,221,26,114,32,73,255],[31,9,65,234,2,15,1,118,73],[75,32,12,51,192,255,160,43,51],[88,31,35,67,102,85,55,186,85],[56,21,23,111,59,205,45,37,192],[55,38,70,124,73,102,1,34,98]],[[125,98,42,88,104,85,117,175,82],[95,84,53,89,128,100,113,101,45],[75,79,123,47,51,128,81,171,1],[57,17,5,71,102,57,53,41,49],[38,33,13,121,57,73,26,1,85],[41,10,67,138,77,110,90,47,114],[115,21,2,10,102,255,166,23,6],[101,29,16,10,85,128,101,196,26],[57,18,10,102,102,213,34,20,43],[117,20,15,36,163,128,68,1,26]],[[102,61,71,37,34,53,31,243,192],[69,60,71,38,73,119,28,222,37],[68,45,128,34,1,47,11,245,171],[62,17,19,70,146,85,55,62,70],[37,43,37,154,100,163,85,160,1],[63,9,92,136,28,64,32,201,85],[75,15,9,9,64,255,184,119,16],[86,6,28,5,64,255,25,248,1],[56,8,17,132,137,255,55,116,128],[58,15,20,82,135,57,26,121,40]],[[164,50,31,137,154,133,25,35,218],[51,103,44,131,131,123,31,6,158],[86,40,64,135,148,224,45,183,128],[22,26,17,131,240,154,14,1,209],[45,16,21,91,64,222,7,1,197],[56,21,39,155,60,138,23,102,213],[83,12,13,54,192,255,68,47,28],[85,26,85,85,128,128,32,146,171],[18,11,7,63,144,171,4,4,246],[35,27,10,146,174,171,12,26,128]],[[190,80,35,99,180,80,126,54,45],[85,126,47,87,176,51,41,20,32],[101,75,128,139,118,146,116,128,85],[56,41,15,176,236,85,37,9,62],[71,30,17,119,118,255,17,18,138],[101,38,60,138,55,70,43,26,142],[146,36,19,30,171,255,97,27,20],[138,45,61,62,219,1,81,188,64],[32,41,20,117,151,142,20,21,163],[112,19,12,61,195,128,48,4,24]]],ba=[[[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[176,246,255,255,255,255,255,255,255,255,255],[223,241,252,255,255,255,255,255,255,255,255],[249,253,253,255,255,255,255,255,255,255,255]],[[255,244,252,255,255,255,255,255,255,255,255],[234,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255]],[[255,246,254,255,255,255,255,255,255,255,255],[239,253,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[251,255,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[251,254,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,254,253,255,254,255,255,255,255,255,255],[250,255,254,255,254,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[217,255,255,255,255,255,255,255,255,255,255],[225,252,241,253,255,255,254,255,255,255,255],[234,250,241,250,253,255,253,254,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[223,254,254,255,255,255,255,255,255,255,255],[238,253,254,254,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[249,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,255,255,255,255,255,255,255,255,255],[247,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[252,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[186,251,250,255,255,255,255,255,255,255,255],[234,251,244,254,255,255,255,255,255,255,255],[251,251,243,253,254,255,254,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[236,253,254,255,255,255,255,255,255,255,255],[251,253,253,254,254,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[254,254,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[254,254,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[248,255,255,255,255,255,255,255,255,255,255],[250,254,252,254,255,255,255,255,255,255,255],[248,254,249,253,255,255,255,255,255,255,255]],[[255,253,253,255,255,255,255,255,255,255,255],[246,253,253,255,255,255,255,255,255,255,255],[252,254,251,254,254,255,255,255,255,255,255]],[[255,254,252,255,255,255,255,255,255,255,255],[248,254,253,255,255,255,255,255,255,255,255],[253,255,254,254,255,255,255,255,255,255,255]],[[255,251,254,255,255,255,255,255,255,255,255],[245,251,254,255,255,255,255,255,255,255,255],[253,253,254,255,255,255,255,255,255,255,255]],[[255,251,253,255,255,255,255,255,255,255,255],[252,253,254,255,255,255,255,255,255,255,255],[255,254,255,255,255,255,255,255,255,255,255]],[[255,252,255,255,255,255,255,255,255,255,255],[249,255,254,255,255,255,255,255,255,255,255],[255,255,254,255,255,255,255,255,255,255,255]],[[255,255,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]]];this.WebPGetDecoderVersion=this.Ld=function(){return 512};var sa=[0,1,2,3,6,4,5,6,6,6,6,6,6,6,6,7,0],la=[[173,148,140,0],[176,155,140,135,0],[180,157,141,134,130,0],[254,254,243,230,196,177,153,140,133,130,129,0]],ha=[0,1,4,8,5,2,3,6,9,12,13,10,7,11,14,15],da=p([Zr,tn],"");d(4,0);var va=[[0,0,0,0],[1,0,0,0],[0,1,0,0],[1,1,0,0],[0,0,1,0],[1,0,1,0],[0,1,1,0],[1,1,1,0],[0,0,0,1],[1,0,0,1],[0,1,0,1],[1,1,0,1],[0,0,1,1],[1,0,1,1],[0,1,1,1],[1,1,1,1]],pa=134480385,ga=16,Pa=-227,Aa=482,ka=[_t,function(t){return t},function(t,e,r){return e[r+0]},function(t,e,r){return e[r+1]},function(t,e,r){return e[r-1]},function(t,e,r){return Ot(Ot(t,e[r+1]),e[r+0])},function(t,e,r){return Ot(t,e[r-1])},function(t,e,r){return Ot(t,e[r+0])},function(t,e,r){return Ot(e[r-1],e[r+0])},function(t,e,r){return Ot(e[r+0],e[r+1])},function(t,e,r){return Ot(Ot(t,e[r-1]),Ot(e[r+0],e[r+1]))},function(t,e,r){return Math.abs((t>>24&255)-(e[r-1]>>24&255))-Math.abs((e[r+0]>>24&255)-(e[r-1]>>24&255))+(Math.abs((t>>16&255)-(e[r-1]>>16&255))-Math.abs((e[r+0]>>16&255)-(e[r-1]>>16&255)))+(Math.abs((t>>8&255)-(e[r-1]>>8&255))-Math.abs((e[r+0]>>8&255)-(e[r-1]>>8&255)))+(Math.abs((255&t)-(255&e[r-1]))-Math.abs((255&e[r+0])-(255&e[r-1])))<=0?e[r+0]:t},function(t,e,r){return(Vt((t>>24&255)+(e[r+0]>>24&255)-(e[r-1]>>24&255))<<24|Vt((t>>16&255)+(e[r+0]>>16&255)-(e[r-1]>>16&255))<<16|Vt((t>>8&255)+(e[r+0]>>8&255)-(e[r-1]>>8&255))<<8|Vt((255&t)+(255&e[r+0])-(255&e[r-1])))>>>0},function(t,e,r){const n=e[r-1];return(It((t=Ot(t,e[r+0]))>>24&255,n>>24&255)<<24|It(t>>16&255,n>>16&255)<<16|It(t>>8&255,n>>8&255)<<8|It(t>>0&255,n>>0&255))>>>0},_t,_t],ma={Cc:0,Bc:0,Kc:0},wa=16,ya=16,Sa=16,Ta=[2,3,7],Ra=[3,3,11],Oa=0,Va=1,Ia=2,_a=3,Wa=4,Ua=[gr+Pr,gr,gr,gr,40],Ma=19,Ba=[17,18,0,1,2,3,4,5,16,6,7,8,9,10,11,12,13,14,15],Da=120,Ea=[24,7,23,25,40,6,39,41,22,26,38,42,56,5,55,57,21,27,54,58,37,43,72,4,71,73,20,28,53,59,70,74,36,44,88,69,75,52,60,3,87,89,19,29,86,90,35,45,68,76,85,91,51,61,104,2,103,105,18,30,102,106,34,46,84,92,67,77,101,107,50,62,120,1,119,121,83,93,17,31,100,108,66,78,118,122,33,47,117,123,49,63,99,109,82,94,0,116,124,65,79,16,32,98,110,48,115,125,81,95,64,114,126,97,111,80,113,127,96,112],ja=1<{var e;e=t.data,m.push(e),y()}))}},n={};function a(t){var e=n[t];if(void 0!==e)return e.exports;var o=n[t]={exports:{}};return r[t].call(o.exports,o,o.exports,a),o.exports}a.m=r,a.x=()=>{var t=a.O(void 0,[699,866,158],(()=>a(2061)));return a.O(t)},t=[],a.O=(e,r,n,o)=>{if(!r){var f=1/0;for(b=0;b=o)&&Object.keys(a.O).every((t=>a.O[t](r[i])))?r.splice(i--,1):(c=!1,o0&&t[b-1][2]>o;b--)t[b]=t[b-1];t[b]=[r,n,o]},a.d=(t,e)=>{for(var r in e)a.o(e,r)&&!a.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},a.f={},a.e=t=>Promise.all(Object.keys(a.f).reduce(((e,r)=>(a.f[r](t,e),e)),[])),a.u=t=>({158:"npm.iobuffer",699:"npm.pako",866:"npm.fast-png"}[t]+"."+{158:"061a9f8cc247dc1dbb8d",699:"85f88e27b023cbb2ca51",866:"8cb0a7aa9c4ab1eb9f54"}[t]+".chunk.js"),a.miniCssF=t=>{},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),a.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{var t;a.g.importScripts&&(t=a.g.location+"");var e=a.g.document;if(!t&&e&&(e.currentScript&&(t=e.currentScript.src),!t)){var r=e.getElementsByTagName("script");r.length&&(t=r[r.length-1].src)}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=t})(),(()=>{if(void 0!==a){var t=a.u,e=a.e,r={},n={};a.u=function(e){return t(e)+(r.hasOwnProperty(e)?"?"+r[e]:"")},a.e=function(o){return e(o).catch((function(e){var f=n.hasOwnProperty(o)?n[o]:999999;if(f<1){var c=t(o);throw e.message="Loading chunk "+o+" failed after 999999 retries.\n("+c+")",e.request=c,e}return new Promise((function(t){setTimeout((function(){var e=Date.now();r[o]=e,n[o]=f-1,t(a.e(o))}),3e3)}))}))}}})(),(()=>{var t={61:1};a.f.i=(e,r)=>{t[e]||importScripts(a.p+a.u(e))};var e=this.webpackChunktweb=this.webpackChunktweb||[],r=e.push.bind(e);e.push=e=>{var[n,o,f]=e;for(var c in o)a.o(o,c)&&(a.m[c]=o[c]);for(f&&f(a);n.length;)t[n.pop()]=1;r(e)}})(),e=a.x,a.x=()=>Promise.all([699,866,158].map(a.e,a)).then(e),a.x()})(); -//# sourceMappingURL=61.5322bb4d26ac11c98a86.chunk.js.map \ No newline at end of file +//# sourceMappingURL=61.b4b665c9d61c26575ebe.chunk.js.map \ No newline at end of file diff --git a/public/61.5322bb4d26ac11c98a86.chunk.js.map b/public/61.b4b665c9d61c26575ebe.chunk.js.map similarity index 99% rename from public/61.5322bb4d26ac11c98a86.chunk.js.map rename to public/61.b4b665c9d61c26575ebe.chunk.js.map index 67f62078..6c33f4bf 100644 --- a/public/61.5322bb4d26ac11c98a86.chunk.js.map +++ b/public/61.b4b665c9d61c26575ebe.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"61.5322bb4d26ac11c98a86.chunk.js","mappings":"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,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClC,IAAK,IAAK,KAEZ,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IACnB,IAAK,IAAK,IAAK,IAAK,IAAK,KAE3B,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAIzC,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACvC,IAAK,MAGT,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IACxB,IAAK,IAAK,IAAK,IAAK,KAEtB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAErC,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/vendor/libwebp-0.2.0.js","webpack://tweb/./src/lib/webp/webp.worker.ts","webpack://tweb/./src/lib/webp/webp.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,866,158].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","// Copyright 2011 Google Inc.\n//\n// This code is licensed under the same terms as WebM:\n// Software License Agreement: http://www.webmproject.org/license/software/\n// Additional IP Rights Grant: http://www.webmproject.org/license/additional/\n// -----------------------------------------------------------------------------\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// -----------------------------------------------------------------------------\n//\n// Copyright 2011-2013 Dominik Homberger\n// Libwebp Javascript / libwebpjs - the libwebp implementation in javascript (v0.2.0)\n//\n// Author: Dominik Homberger (dominik.homberger@gmail.com)\n\nlet i;\nlet a;\nlet self;\nconst ca = 0;\nconst p = null;\nconst s = 0;\nconst x = 0;\nconst la = s;\nconst E = s;\nconst bb = 0;\nconst Mb = 0;\n\nfunction M(F) {\n return JSON.parse(JSON.stringify(F));\n}\n\nfunction N(F, G, w, D, S) {\n for (i = 0; i < S; ++i) F[G + i] = w[D + i];\n}\n\nfunction Nb(F) {\n const G = [];\n const w = F.length;\n let D;\n for (D = 0; D < w; ++D) G.push(F[D]);\n return G;\n}\n\nfunction ic(F, G) {\n const w = [];\n w.push(M(F));\n let D;\n for (D = 0; D < G; ++D) w.push(M(F));\n w.push(0);\n return w;\n}\n\nfunction rc(F, G) {\n const w = [];\n let D;\n for (D = 0; D < G; ++D) w.push(F);\n w.push(0);\n return w;\n}\n\nfunction memmove(arr1, index1, arr2, index2, length) {\n let i;\n for (i = 0; i < length; i++) {\n arr1[index1 + i] = arr2[index2 + i];\n }\n}\n\nfunction jd(F, G, w, D) {\n let S;\n for (S = 0; S < D; ++S) F[G + S] = w;\n}\n\nfunction kd(F, G, w, D) {\n let S = '';\n let ga;\n for (ga = 0; ga < D; ++ga) S += String.fromCharCode(F[G + ga]);\n return w == S ? 0 : 1;\n}\n\nfunction U(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(G);\n return D;\n}\n\nfunction ld(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(M(G));\n return D;\n}\n\nfunction md(F, G) {\n let w;\n for (w = F.length - 1; w >= 0; --w) G = M(U(F[w], G));\n return G;\n}\n\nfunction $(F) {\n if (!F) throw Error('assert :P');\n}\nexport const WebPDecoder = function () {\n function F(a) {\n return a == Ob || a == Pb || a == Bb || a == Qb;\n }\n\n function G(a) {\n return S(a, 1);\n }\n\n function w(a, b) {\n const c = 1 + ((a.la - 1) * b >> 8);\n const d = c << 8;\n let e = s;\n a.Z >= d ? (e = 1, a.la -= c, a.Z -= d) : (e = 0, a.la = c);\n for (; a.la < 128;) a.Z <<= 1, a.la <<= 1, ++a.gc == 8 && (a.gc = 0, a.bc && (a.Z += a.qa[a.Ia++], a.bc--));\n return e;\n }\n\n function D(a, b, c, d) {\n d -= c;\n d >= 2 ? (a.Z = b[c + 0] << 8 | b[c + 1], a.qa = b, a.Ia = c + 2, a.bc = d - 2) : (a.Z = 0, a.qa = p, a.bc = 0);\n a.la = 255;\n a.gc = 0;\n }\n\n function S(a, b) {\n for (var c = 0, d = s, d = b - 1; d >= 0; d--) c |= w(a, 128) << d;\n return c;\n }\n\n function ga(a, b) {\n const c = S(a, b);\n return G(a) ? -c : c;\n }\n\n function Rb(a, b, c, d) {\n let e = Mb;\n $(a != p);\n $(b != p);\n $(d < 4294967288);\n a.qa = b;\n a.Ia = c;\n a.ya = d;\n a.T = 0;\n a.Q = 0;\n a.g = 0;\n a.L = 0;\n for (e = a.fa = 0; e < 4 && e < a.ya; ++e) a.T |= a.qa[a.Ia + a.Q] << 8 * e, ++a.Q;\n }\n\n function Sb(a) {\n for (; a.g >= 8 && a.Q < a.ya;) a.T >>>= 8, a.T += a.qa[a.Ia + a.Q] << 24 >>> 0, ++a.Q, a.g -= 8;\n }\n\n function Da(a) {\n a.g >= 8 && Sb(a);\n a.Q == a.ya && a.g == 32 && (a.L = 1);\n }\n\n function T(a, b) {\n let c = 0;\n $(b >= 0);\n if (!a.L && b < gf) {\n if (a.Q == a.ya && a.g + b >= 32 && (a.L = 1, a.g + b > 32)) return c;\n c = a.T >> a.g & hf[b];\n a.g += b;\n a.g >= 8 && a.g >= 8 && Sb(a);\n } else a.fa = 1;\n return c;\n }\n\n function ma(a) {\n return a.Pa == a.gb;\n }\n\n function nd(a, b) {\n $(a != p);\n if (b == 0) return 0;\n a.gb = 2 * b - 1;\n a.Y = ld(a.gb, jf);\n if (a.Y == p) return 0;\n a.Y[0].s = -1;\n return a.Pa = 1;\n }\n\n function ja(a) {\n a != p && (a.Y = p, a.Y = p, a.gb = 0, a.Pa = 0);\n }\n\n function jc(a, b, c, d) {\n for (var e = a.Y, g = 0, k = +a.gb; d-- > 0;) {\n if (g >= k) return 0;\n if (e[g].s < 0) {\n if (ma(a)) return 0;\n const h = a;\n const n = h.Y;\n const l = +h.Pa;\n e[g].s = l - g;\n h.Pa += 2;\n n[l + 0].s = -1;\n n[l + 1].s = -1;\n } else if (e[g].s == 0) return 0;\n g += e[g].s + (c >> d & 1);\n }\n if (e[g].s < 0) e[g].s = 0;\n else if (e[g].s != 0) return 0;\n e[g].kc = b;\n return 1;\n }\n\n function od(a, b, c) {\n var d = s;\n let e = 0;\n let g = 0;\n $(a != p);\n $(b != p);\n for (d = 0; d < c; ++d) b[d] > 0 && (++e, g = d);\n if (!nd(a, e)) return 0;\n if (e == 1) return g < 0 || g >= c ? (ja(a), 0) : jc(a, g, 0, 0);\n e = 0;\n g = U(c, s);\n if (g == p) return (e = e && ma(a)) || ja(a), e;\n var k = s;\n var k = s;\n var d = U(Tb + 1, 0);\n let h = s;\n const n = U(Tb + 1, 0);\n let l = 0;\n $(b != p);\n $(c > 0);\n $(g != p);\n for (k = 0; k < c; ++k) b[k] > l && (l = b[k]);\n if (l > Tb) d = 0;\n else {\n for (k = 0; k < c; ++k) ++d[b[k]];\n h = d[0] = 0;\n n[0] = -1;\n for (k = 1; k <= l; ++k) h = h + d[k - 1] << 1, n[k] = h;\n for (k = 0; k < c; ++k) g[k] = b[k] > 0 ? n[b[k]]++ : pd;\n d = 1;\n }\n if (!d) return (e = e && ma(a)) || ja(a), e;\n for (d = 0; d < c; ++d) {\n if (b[d] > 0 && !jc(a, d, g[d], b[d])) {\n return (e = e && ma(a)) || ja(a), e;\n }\n }\n (e = ma(a)) || ja(a);\n return e;\n }\n\n function Ea(a, b, c, d, e, g, k) {\n for (var h = s, h = 0; h < k; ++h) e[g + h] = a[b + h] + c[d + h] & 255;\n }\n\n function qd(a, b, c) {\n const d = a.P.l;\n if (!(c = b < 0 || c < 0 || b + c > a.P.v)) {\n if (c = b == 0) {\n a: {\n let e = a.Ga;\n var g = a.G;\n var k = a.ub;\n c = a.P.l;\n let h = a.P.v;\n const n = a.Xb;\n var l = [p];\n let m = p;\n let f = h * c;\n var q = p;\n var r = p;\n var r = 'WEBP_FILTER_TYPE';\n let u = s;\n var l = s;\n var v = 0;\n let C = s;\n $(c > 0 && h > 0 && d >= c);\n $(e != p && n != p);\n if (k <= Ub) c = 0;\n else if (C = e[g + 0] >> 0 & 3, r = e[g + 0] >> 2 & 3, u = e[g + 0] >> 4 & 3, l = e[g + 0] >> 6 & 3, C < kc || C > kf || r >= lf || u > rd || l != 0) c = 0;\n else {\n if (C == kc) v = k >= f, l = e, m = g + Ub;\n else {\n l = U(f, 0);\n m = 0;\n if (l\n == p) {\n c = 0;\n break a;\n }\n var v = g + Ub;\n var k = k - Ub;\n var g = l;\n var q = M(Vb);\n let A = 0;\n const z = sd();\n z == p ? v = 0 : (z.l = c, z.v = h, z.N = q, td(na), q.put = ud, q.Mb = vd, q.Pb = wd, q.ka = p, q.ka = g, q.fd = 0, q.width = c, q.height = h, z.a = L, Rb(z.o, e, v, k), z.Wa = Cb, Ka(c, h, 1, z, p) && xd(z, c) && (z.Wa = Db, A = lc(z, z.V, z.Ha, z.l, z.v, mf)), z != p && sa(z), v = A);\n }\n if (v) {\n e = nf[r];\n e != p ? (q = U(f, 0), r = 0, q == p && (v = 0, C != kc && (m = l = p)), e(l, m, c, h, 1, c, q, r), f = q, C = r) : (f = l, C = m);\n for (e = 0; h-- > 0;) N(n, e, f, C, c), C += c, e += d;\n u == rd && (v = l == p || m <= 0 || c <= 0 ? 0 : 1);\n }\n c = v;\n }\n }\n c = !c;\n }\n }\n return c ? p : b == 0 ? a.Xb : +b * d;\n }\n\n function of(a) {\n let b = a.width;\n const c = a.height;\n let d = a.J;\n if (b <= 0 || c <= 0 || !(d >= Qa && d < Cc)) return ta;\n if (!a.Fc && a.Jb == p) {\n var e = p;\n var g = 0;\n var k = 0;\n var h = 0;\n var n = 0;\n var e = bb;\n var l = b * yd[d];\n var m = l * c;\n d < ua || (g = parseInt((b + 1) / 2, 10), h = g * parseInt((c + 1) / 2, 10), d == Ra && (k = b, n = k * c));\n e = m + 2 * h + n;\n if (e != e) return ta;\n e = U(e, 205);\n if (e == p) return cb;\n a.Jb = e;\n a.jc = p;\n d < ua ? (b = a.c.RGBA, b.ma = e, b.Sa = p, b.f = l, b.size = m) : (b = a.c.Va, b.y = e, b.D = p, b.F = l, b.Wc = m, b.c = e, b.B = p + m, b.nb = g, b.Rc = h, b.S = e, b.C = p + m + h, b.rb = g, b.Uc = h, d == Ra && (b.p = e, b.q = p + m + 2 * h), b.Wb = n, b.Fa = k);\n }\n d = 1;\n g = a.J;\n k = a.width;\n h = a.height;\n g >= Qa && g < Cc ? g < ua ? (a = a.c.RGBA, d\n &= a.f * h <= a.size, d &= a.f >= k * yd[g], d &= a.ma != p) : (a = a.c.Va, n = a.nb * parseInt((h + 1) / 2, 10), l = a.rb * parseInt((h + 1) / 2, 10), m = a.Fa * h, d &= a.F * h <= a.Wc, d &= n <= a.Rc, d &= l <= a.Uc, d &= m <= a.Wb, d &= a.F >= k, d &= a.nb >= parseInt((k + 1) / 2, 10), d &= a.rb >= parseInt((k + 1) / 2, 10), d &= a.y != p, d &= a.c != p, d &= a.S != p, g == Ra && (d &= a.Fa >= k, d &= m <= a.Wb, d &= a.p != p)) : d = 0;\n return d ? L : ta;\n }\n\n function zd(a, b, c, d) {\n if (d == p || a <= 0 || b <= 0) return ta;\n if (c != p) {\n if (c.Ua) {\n const e = c.wc;\n const g = c.vc;\n const k = c.t & -2;\n const h = c.k & -2;\n if (k < 0 || h < 0 || e <= 0 || g <= 0 || k + e > a || h + g > b) return ta;\n a = e;\n b = g;\n }\n if (c.I) {\n if (c.Ba <= 0\n || c.Aa <= 0) return ta;\n a = c.Ba;\n b = c.Aa;\n }\n }\n d.width = a;\n d.height = b;\n return of(d);\n }\n\n function mb(a) {\n return !(a & -256) ? a : a < 0 ? 0 : 255;\n }\n\n function Ad(a, b, c, d) {\n const e = U(16, 0);\n let g;\n g = 0;\n let k;\n for (k = 0; k < 4; ++k) {\n var h = a[b + 0] + a[b + 8];\n var n = a[b + 0] - a[b + 8];\n var l = (a[b + 4] * Wb >> 16) - (a[b + 12] * Xb >> 16);\n var m = (a[b + 4] * Xb >> 16) + (a[b + 12] * Wb >> 16);\n e[g + 0] = h + m;\n e[g + 1] = n + l;\n e[g + 2] = n - l;\n e[g + 3] = h - m;\n g += 4;\n b++;\n }\n for (k = g = 0; k < 4; ++k) {\n a = e[g + 0] + 4, h = a + e[g + 8], n = a - e[g + 8], l = (e[g + 4] * Wb >> 16) - (e[g + 12] * Xb >> 16), m = (e[g + 4] * Xb >> 16) + (e[g + 12] * Wb >> 16), c[d + 0 + 0 * f] = mb(c[d + 0 + 0 * f] + (h + m >> 3)), c[d + 1 + 0 * f] = mb(c[d\n + 1 + 0 * f] + (n + l >> 3)), c[d + 2 + 0 * f] = mb(c[d + 2 + 0 * f] + (n - l >> 3)), c[d + 3 + 0 * f] = mb(c[d + 3 + 0 * f] + (h - m >> 3)), g++, d += f;\n }\n }\n\n function pf(a, b, c, d, e) {\n Ad(a, b, c, d);\n e && Ad(a, b + 16, c, d + 4);\n }\n\n function qf(a, b, c, d) {\n mc(a, b + 0, c, d + 0, 1);\n mc(a, b + 32, c, d + 4 * f, 1);\n }\n\n function nc(a, b, c, d) {\n a = a[b + 0] + 4;\n let e;\n for (e = 0; e < 4; ++e) for (b = 0; b < 4; ++b) c[d + b + e * f] = mb(c[d + b + e * f] + (a >> 3));\n }\n\n function rf(a, b, c, d) {\n a[b + 0] && nc(a, b + 0, c, d + 0);\n a[b + 16] && nc(a, b + 16, c, d + 4);\n a[b + 32] && nc(a, b + 32, c, d + 4 * f);\n a[b + 48] && nc(a, b + 48, c, d + 4 * f + 4);\n }\n\n function Dc(a, b, c) {\n const d = b - f;\n const e = oa;\n const g = 255 - a[d - 1];\n let k;\n for (k = 0; k\n < c; ++k) {\n const h = e;\n const n = g + a[b - 1];\n var l;\n for (l = 0; l < c; ++l) a[b + l] = h[n + a[d + l]];\n b += f;\n }\n }\n\n function Yb(a, b, c) {\n let d;\n for (d = 0; d < 16; ++d) for (i = 0; i < 16; ++i) b[c + d * f + i] = a;\n }\n\n function y(a, b, c) {\n return a + 2 * b + c + 2 >> 2;\n }\n\n function Zb(a, b, c) {\n let d; let\n e;\n for (d = 0; d < 8; ++d) for (e = 0; e < 8; ++e) b[c + e + d * f] = a;\n }\n\n function nb(a, b, c) {\n const d = a[b - c];\n const e = a[b + 0];\n const g = 3 * (e - d) + sc[1020 + a[b - 2 * c] - a[b + c]];\n const k = oc[112 + (g + 4 >> 3)];\n a[b - c] = oa[255 + d + oc[112 + (g + 3 >> 3)]];\n a[b + 0] = oa[255 + e - k];\n }\n\n function Bd(a, b, c, d) {\n const e = a[b + 0];\n const g = a[b + c];\n return va[255 + a[b - 2 * c] - a[b - c]] > d || va[255 + g - e] > d;\n }\n\n function Cd(a,\n b, c, d, e) {\n const g = a[b - 3 * c];\n const k = a[b - 2 * c];\n const h = a[b - c];\n const n = a[b + 0];\n const l = a[b + c];\n const m = a[b + 2 * c];\n const f = a[b + 3 * c];\n return 2 * va[255 + h - n] + tc[255 + k - l] > d ? 0 : va[255 + a[b - 4 * c] - g] <= e && va[255 + g - k] <= e && va[255 + k - h] <= e && va[255 + f - m] <= e && va[255 + m - l] <= e && va[255 + l - n] <= e;\n }\n\n function Dd(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e - c] - a[b + e + 0]] + tc[255 + a[b + e - 2 * c] - a[b + e + c]] <= d && nb(a, b + e, c);\n }\n\n function Ed(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e * c - 1] - a[b + e * c + 0]] + tc[255 + a[b + e * c - 2] - a[b + e * c + 1]] <= d && nb(a, b + e * c, 1);\n }\n\n function sf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) {\n b\n += 4 * c, Dd(a, b + 0, c, d);\n }\n }\n\n function tf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) b += 4, Ed(a, b + 0, c, d);\n }\n\n function Fa(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c, g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - 2 * m];\n const q = n[l - m];\n const r = n[l + 0];\n const u = n[l + m];\n const v = n[l + 2 * m];\n var C = sc[1020 + 3 * (r - q) + sc[1020 + f - u]];\n const A = 27 * C + 63 >> 7;\n const z = 18 * C + 63 >> 7;\n var C = 9 * C + 63 >> 7;\n n[l - 3 * m] = oa[255 + n[l - 3 * m] + C];\n n[l - 2 * m] = oa[255 + f + z];\n n[l - m] = oa[255 + q + A];\n n[l + 0] = oa[255 + r - A];\n n[l + m] = oa[255 + u - z];\n n[l + 2 * m] = oa[255 + v - C];\n }\n }\n b += d;\n }\n }\n\n function Ga(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c,\n g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - m];\n const q = n[l + 0];\n const r = n[l + m];\n var u = 3 * (q - f);\n const v = oc[112 + (u + 4 >> 3)];\n var u = oc[112 + (u + 3 >> 3)];\n const C = v + 1 >> 1;\n n[l - 2 * m] = oa[255 + n[l - 2 * m] + C];\n n[l - m] = oa[255 + f + u];\n n[l + 0] = oa[255 + q - v];\n n[l + m] = oa[255 + r - C];\n }\n }\n b += d;\n }\n }\n\n function uf(a, b, c, d, e, g) {\n Fa(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function vf(a, b, c, d, e, g) {\n Fa(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function wf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4 * c, Ga(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function xf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4, Ga(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function yf(a, b, c, d, e,\n g, k, h) {\n Fa(a, b, e, 1, 8, g, k, h);\n Fa(c, d, e, 1, 8, g, k, h);\n }\n\n function zf(a, b, c, d, e, g, k, h) {\n Fa(a, b, 1, e, 8, g, k, h);\n Fa(c, d, 1, e, 8, g, k, h);\n }\n\n function Af(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4 * e, e, 1, 8, g, k, h);\n Ga(c, d + 4 * e, e, 1, 8, g, k, h);\n }\n\n function Bf(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4, 1, e, 8, g, k, h);\n Ga(c, d + 4, 1, e, 8, g, k, h);\n }\n\n function Fd(a, b) {\n return b == $b ? a.i == 0 ? a.d == 0 ? Cf : Df : a.d == 0 ? Ef : $b : b;\n }\n\n function Ec(a, b, c, d) {\n for (i = 0; i < 4; ++i) a[b + i] = c[d + i];\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function Gd(a) {\n a.a = 'VP8_STATUS_OK';\n a.xc = 'OK';\n }\n\n function td(a) {\n a >>> 8 != na >>> 8 && alert('mismatch error');\n }\n\n function Y(a, b, c) {\n a.a == L && (a.a = b, a.xc = c, a.za = 0);\n // alert(b + \": \" + c);\n return 0;\n }\n\n function Hd(a, b) {\n let c = [0];\n let d = x;\n var e = [Mb];\n var g = M(Id);\n var k = M(Jd);\n let h = M(Fc);\n var e = 'VP8StatusCode';\n var g = M(Gc);\n if (a == p) return alert('(dec == null)'), 0;\n Gd(a);\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'null VP8Io passed to VP8GetHeaders()');\n g.data = b.data;\n g.b = b.b;\n g.e = b.e;\n g.b = [g.b];\n g.e = [g.e];\n g = [g];\n e = Kd(g);\n if (e != L) return Y(a, e, 'Incorrect/incomplete header.');\n g = g[0];\n g.b = g.b[0];\n g.e = g.e[0];\n if (g.ia) return Y(a, W, 'Unexpected lossless format encountered.');\n a.Ga == p && ($(a.ub == 0), a.Ga = g.$, a.G = g.G, a.ub = g.pa);\n d = g.data;\n c = g.b + g.offset;\n e = g.e - g.offset;\n $(g.e >= g.offset);\n if (e[0] < 4) return Y(a, Z, 'Truncated header.');\n h = d[c + 0] | d[c + 1] << 8 | d[c + 2] << 16;\n g = a.Ac;\n g.fb = !(h & 1) + 0;\n g.Jc = h >> 1 & 7;\n g.Nc = h >> 4 & 1;\n g.Ra = h >> 5;\n if (g.Jc > 3) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Incorrect keyframe parameters.');\n if (!g.Nc) return Y(a, 'VP8_STATUS_UNSUPPORTED_FEATURE', 'Frame not displayable.');\n c += 3;\n e -= 3;\n k = a.P;\n if (g.fb) {\n if (e < 7) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'cannot parse picture header');\n if (!(e\n >= 3 && d[c + 0] == 157 && d[c + 1] == 1 && d[c + 2] == 42)) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Bad code word');\n k.l = (d[c + 4] << 8 | d[c + 3]) & 16383;\n k.gd = d[c + 4] >> 6;\n k.v = (d[c + 6] << 8 | d[c + 5]) & 16383;\n k.hd = d[c + 6] >> 6;\n c += 7;\n e -= 7;\n a.Ma = k.l + 15 >> 4;\n a.hb = k.v + 15 >> 4;\n b.width = k.l;\n b.height = k.v;\n b.I = 0;\n b.Ua = 0;\n b.k = 0;\n b.t = 0;\n b.Ka = b.width;\n b.K = b.height;\n b.m = b.width;\n b.h = b.height;\n h = a.R;\n for (i = 0; i < h.Ta.length; ++i) h.Ta[i] = 255;\n h.z = M(Ff);\n h = a.Ca;\n $(h != p);\n h.pb = 0;\n h.ob = 0;\n h.tb = 1;\n for (i = 0; i < h.Kb.length; ++i) h.Kb[i] = 0;\n for (i = 0; i < h.Cb.length; ++i) h.Cb[i] = 0;\n a.Lb = 0;\n }\n if (g.Ra\n > e) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'bad partition length');\n h = a.o;\n D(h, d, c, c + g.Ra);\n c += g.Ra;\n e -= g.Ra;\n g.fb && (k.uc = G(h), k.$c = G(h));\n var k = h;\n var n = a.Ca;\n let l = a.R;\n $(k != p);\n $(n != p);\n n.pb = G(k);\n if (n.pb) {\n n.ob = G(k);\n if (G(k)) {\n var m;\n n.tb = G(k);\n for (m = 0; m < xa; ++m) n.Kb[m] = G(k) ? ga(k, 7) : 0;\n for (m = 0; m < xa; ++m) n.Cb[m] = G(k) ? ga(k, 6) : 0;\n }\n if (n.ob) for (m = 0; m < Ld; ++m) l.Ta[m] = G(k) ? S(k, 8) : 255;\n } else n.ob = 0;\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse segment header');\n k = h;\n n = a.ga;\n n.Oc = G(k);\n n.Fb = S(k, 6);\n n.kb = S(k, 3);\n n.oc = G(k);\n if (n.oc\n && G(k)) {\n for (l = 0; l < Hc; ++l) G(k) && (n.Lc[l] = ga(k, 6));\n for (l = 0; l < Gf; ++l) G(k) && (n.Gc[l] = ga(k, 6));\n }\n a.A = n.Fb == 0 ? 0 : n.Oc ? 1 : 2;\n if (a.A > 0) {\n if (a.Ca.pb) for (l = 0; l < xa; ++l) m = a.Ca.Cb[l], a.Ca.tb || (m += n.Fb), a.Zb[l] = m;\n else a.Zb[0] = n.Fb;\n }\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse filter header');\n var k = d;\n var f = c;\n var n = f;\n var e = f + e;\n m = 0;\n let q = s;\n let r = s;\n a.Hb = 1 << S(a.o, 2);\n q = a.Hb - 1;\n l = k;\n m = f + 3 * q;\n if (e < m) e = 'VP8_STATUS_NOT_ENOUGH_DATA';\n else {\n for (r = 0; r < q; ++r) {\n var f = l;\n var u = m + (k[n + 0] | k[n + 1] << 8 | k[n + 2] << 16);\n u > e && (f = k);\n D(a.ic[+r], l, m, u);\n l = f;\n m = u;\n n += 3;\n }\n D(a.ic[+q], l, m, e);\n e = m < e ? 'VP8_STATUS_OK' : 'VP8_STATUS_SUSPENDED';\n }\n if (e != 'VP8_STATUS_OK') return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse partitions');\n q = a.o;\n e = S(q, 7);\n k = G(q) ? ga(q, 4) : 0;\n n = G(q) ? ga(q, 4) : 0;\n l = G(q) ? ga(q, 4) : 0;\n m = G(q) ? ga(q, 4) : 0;\n q = G(q) ? ga(q, 4) : 0;\n r = a.Ca;\n f = s;\n for (f = 0; f < xa; ++f) {\n u = s;\n if (r.pb) u = r.Kb[f], r.tb || (u += e);\n else if (f > 0) {\n a.yb[f] = a.yb[0];\n continue;\n } else u = e;\n const v = a.yb[f];\n v.sc[0] = Ic[wa(u + k, 127)];\n v.sc[1] = Jc[wa(u + 0, 127)];\n v.sb[0] = 2 * Ic[wa(u + n, 127)];\n v.sb[1] = 101581 * Jc[wa(u + l, 127)] >> 16;\n v.sb[1] < 8\n && (v.sb[1] = 8);\n v.qc[0] = Ic[wa(u + m, 117)];\n v.qc[1] = Jc[wa(u + q, 127)];\n }\n if (g.fb) a.Zc = 259;\n else return Y(a, Hf, 'Not a key frame.');\n G(h);\n e = a.R;\n for (k = 0; k < Md; ++k) for (n = 0; n < Nd; ++n) for (l = 0; l < Kc; ++l) for (m = 0; m < Lc; ++m) w(h, If[k][n][l][m]) && (e.z[k][n][l][m] = S(h, 8));\n a.pc = G(h);\n a.pc && (a.Pc = S(h, 8));\n if (a.P.uc) {\n c -= 8;\n h = Mb;\n if (g.Ra < 8 || d[c + 8 - 1] != 1) return Y(a, W, 'RIFF: Inconsistent extra information.');\n h = d[c + 0] << 0 | d[c + 1] << 8 | d[c + 2] << 16;\n a.fc = h;\n a.dd = p;\n a.cd = d[c + 3];\n }\n return a.za = 1;\n }\n\n function Mc(a, b, c, d, e, g) {\n let k = b[e][c];\n if (!w(a, k[0])) return 0;\n for (;;) {\n ++e;\n if (w(a, k[1])) {\n var h;\n if (w(a, k[2])) {\n if (w(a, k[3])) {\n if (w(a, k[6])) {\n h = x;\n c = w(a, k[8]);\n k = w(a, k[9 + c]);\n k = 2 * c + k;\n c = 0;\n h = Jf[k];\n var n;\n for (n = 0; n < h.length - 1; ++n) c += c + w(a, h[n]);\n c += 3 + (8 << k);\n } else w(a, k[7]) ? (c = 7 + 2 * w(a, 165), c += w(a, 145)) : c = 5 + w(a, 159);\n } else c = w(a, k[4]) ? 3 + w(a, k[5]) : 2;\n k = b[Nc[e]][2];\n } else k = b[Nc[e]][1], c = 1;\n h = Kf[e - 1];\n g[g[g.length - 1] + h] = (w(a, 128) ? -c : c) * d[(h > 0) + 0];\n if (e == 16 || !w(a, k[0])) return e;\n } else k = b[Nc[e]][0];\n if (e == 16) return 16;\n }\n }\n\n function ob(a, b) {\n return ((16777216 * a[0] + 65536 * a[1] + 256 * a[2] + 1 * a[3]) * Lf\n & 4278190080) >> b;\n }\n\n function Mf(a, b) {\n let c = 0;\n if (a == p) return 0;\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'NULL VP8Io parameter in VP8Decode().');\n if (!a.za && !Hd(a, b)) return 0;\n $(a.za);\n let d;\n if (b.Mb && !b.Mb(b)) Y(a, Nf, 'Frame setup failed'), d = a.a;\n else {\n b.Za && (a.A = 0);\n const e = uc[a.A];\n a.A == 2 ? (a.lb = 0, a.mb = 0) : (a.lb = b.t - e >> 4, a.mb = b.k - e >> 4, a.lb < 0 && (a.lb = 0), a.mb < 0 && (a.mb = 0));\n a.Ya = b.K + 15 + e >> 4;\n a.wb = b.Ka + 15 + e >> 4;\n a.wb > a.Ma && (a.wb = a.Ma);\n a.Ya > a.hb && (a.Ya = a.hb);\n d = L;\n }\n if (c = d == L) {\n if (c) {\n let g;\n b: {\n a.Ja = 0;\n if (a.qb) {\n const k = a.rc;\n if (!WebPWorkerReset(k)) {\n g = Y(a, cb, 'thread initialization failed.');\n break b;\n }\n k.Qd = a;\n k.Rd = a.oa.N;\n k.Ud = FinishRow;\n a.jb = a.A > 0 ? Od : Od - 1;\n } else a.jb = Of;\n g = 1;\n }\n let h;\n if (!(h = !g)) {\n let n;\n b: {\n const l = a.jb;\n const m = a.Ma;\n const t = 4 * m;\n const q = 32 * m;\n const r = m + 1;\n const u = a.A > 0 ? m * (a.qb ? 2 : 1) : 0;\n const v = Pf;\n const C = q * (16 * l + parseInt(3 * uc[a.A] / 2, 10));\n const A = a.Ga != p ? a.P.l * a.P.v : 0;\n const z = t + q + r + u + v + 384 + C + A + Pd;\n if (z != z) n = 0;\n else {\n if (z > a.Gb) {\n a.ib = 0;\n a.Gb = 0;\n if (a.ib == p) {\n n = Y(a, 'VP8_STATUS_OUT_OF_MEMORY', 'no memory during frame initialization.');\n break b;\n }\n a.Gb = z;\n }\n a.dc = 205;\n a.Xc = rc(205, 16 * m);\n a.Sc = rc(205, 8 * m);\n a.Vc = rc(205, 8 * m);\n a.M = u ? ic(Oc, u) : p;\n a.Sd = u ? 0 : p;\n a.oa.ha = 0;\n a.oa.M = a.M;\n $((v & Pd) == 0);\n a.Ea = rc(205, 1 * v);\n a.z = -12851;\n a.H = 16 * m;\n a.r = 8 * m;\n const Ha = uc[a.A];\n const G = Ha * a.H;\n const y = Ha / 2 * a.r;\n a.ca = U(C, 205);\n a.da = +G;\n a.aa = a.ca;\n a.ba = a.da + 16 * l * a.H + y;\n a.ra = a.aa;\n a.sa = a.ba + 8 * l * a.r + y;\n a.Xb = A ? U(A, x) : p;\n a.La = ic(Qd, r);\n a.dc = rc($b, t);\n n = 1;\n }\n }\n h = !n;\n }\n if (h) c = 0;\n else {\n b.width = a.P.l;\n b.height = a.P.v;\n b.w = 0;\n b.y = a.ca;\n b.D = a.da;\n b.c = a.aa;\n b.B = a.ba;\n b.S = a.ra;\n b.C = a.sa;\n b.F = a.H;\n b.Da = a.r;\n b.p = p;\n b.q = p;\n if (!Rd) {\n let B;\n for (B = -255; B <= 255; ++B) va[255 + B] = B < 0 ? -B : B, tc[255 + B] = va[255 + B] >> 1;\n for (B = -1020; B\n <= 1020; ++B) sc[1020 + B] = B < -128 ? -128 : B > 127 ? 127 : B;\n for (B = -112; B <= 112; ++B) oc[112 + B] = B < -16 ? -16 : B > 15 ? 15 : B;\n for (B = -255; B <= 510; ++B) oa[255 + B] = B < 0 ? 0 : B > 255 ? 255 : B;\n Rd = 1;\n }\n mc = pf;\n Pc = qf;\n Qc = nc;\n Rc = rf;\n Sd = uf;\n Td = vf;\n Ud = yf;\n Vd = zf;\n Wd = wf;\n Xd = xf;\n Yd = Af;\n Zd = Bf;\n $d = Dd;\n ae = Ed;\n be = sf;\n ce = tf;\n c = 1;\n }\n }\n if (c) {\n a: {\n for (a.d = 0; a.d < a.Ya; ++a.d) {\n const Qf = a.ic[a.d & a.Hb - 1];\n const db = a;\n const F = db.La[0];\n F.X = 0;\n F.ua = 0;\n jd(db.cc, 0, $b, db.cc.length);\n db.W = (db.A > 0 && db.d >= db.mb && db.d <= db.Ya) + 0;\n for (a.i = 0; a.i < a.Ma; a.i++) {\n var D;\n const H = a;\n const T = Qf;\n const ya = H.o;\n const S = H.La[0];\n const J = H.La[1 + H.i];\n H.Ca.ob && (H.Lb = !w(ya,\n H.R.Ta[0]) ? 0 + w(ya, H.R.Ta[1]) : 2 + w(ya, H.R.Ta[2]));\n J.Nb = H.pc ? w(ya, H.Pc) : 0;\n const O = H.dc;\n O[O.length - 1] = 0 + 4 * H.i;\n const Sc = H.cc;\n H.wa = !w(ya, 145);\n if (H.wa) {\n for (var ga = H.Eb, ja = 0, Z = ca, Z = 0; Z < 4; ++Z) {\n var V = Sc[Z];\n var R;\n for (R = 0; R < 4; ++R) {\n const ta = Rf[O[O[O.length - 1] + R]][V];\n var za = 0;\n do za = Sf[2 * za + w(ya, ta[za])]; while (za > 0);\n V = -za;\n O[O[O.length - 1] + R] = V;\n ga[ja] = V;\n ja++;\n }\n Sc[Z] = V;\n }\n } else {\n var V = w(ya, 156) ? w(ya, 128) ? de : ee : w(ya, 163) ? fe : ge;\n H.Eb[0] = V;\n for (za = 0; za < 4; ++za) O[za + O[O.length - 1]] = V;\n for (za = 0; za < 4; ++za) Sc[za] = V;\n }\n H.Tc = !w(ya, 142) ? ge : !w(ya, 114) ? fe\n : w(ya, 183) ? de : ee;\n if (ya.Ab) D = 0;\n else {\n if (J.Nb) S.X = J.X = 0, H.wa || (S.ua = J.ua = 0), H.ja = 0, H.Oa = 0;\n else {\n let ia = ca;\n let ka = ca;\n var sa = ca;\n var wa = Tf;\n const Aa = H.yb[H.Lb];\n var aa = H.z;\n const ma = H.La[0];\n const ua = U(4, 0);\n const xa = U(4, 0);\n let ea = U(4, 0);\n let pb = U(4, 0);\n let na = 0;\n let Ba = 0;\n var pa = ca;\n let qa = ca;\n let Sa = ca;\n var aa = rc(0, 384);\n if (H.wa) sa = 0, wa = H.R.z[3];\n else {\n const ab = U(16, 0);\n var Ca = J.ua + ma.ua;\n J.ua = ma.ua = (Mc(T, H.R.z[1], Ca, Aa.sb, 0, ab) > 0) + 0;\n for (var sa = 1, wa = H.R.z[0], qb = ab, Ta = aa, La = U(16, s), X = s, X = 0; X < 4; ++X) {\n var Da = qb[0 + X] + qb[12 + X];\n var Ea = qb[4 + X] + qb[8 + X];\n var Fa = qb[4 + X] - qb[8 + X];\n var Ga = qb[0 + X] - qb[12 + X];\n La[0 + X] = Da + Ea;\n La[8\n + X] = Da - Ea;\n La[4 + X] = Ga + Fa;\n La[12 + X] = Ga - Fa;\n }\n for (X = 0; X < 4; ++X) {\n const Oa = Ta[Ta.length - 1];\n const lb = La[0 + 4 * X] + 3;\n var Da = lb + La[3 + 4 * X];\n var Ea = La[1 + 4 * X] + La[2 + 4 * X];\n var Fa = La[1 + 4 * X] - La[2 + 4 * X];\n var Ga = lb - La[3 + 4 * X];\n Ta[Oa + 0] = Da + Ea >> 3;\n Ta[Oa + 16] = Ga + Fa >> 3;\n Ta[Oa + 32] = Da - Ea >> 3;\n Ta[Oa + 48] = Ga - Fa >> 3;\n Ta[Ta.length - 1] += 64;\n }\n aa[aa.length - 1] = 0;\n }\n ea = Nb(vc[J.X & 15]);\n pb = Nb(vc[ma.X & 15]);\n for (qa = 0; qa < 4; ++qa) {\n for (var Eb = pb[qa], pa = 0; pa < 4; ++pa) {\n var Ca = Eb + ea[pa];\n var Ka = Mc(T, wa, Ca, Aa.sc, sa, aa);\n ea[pa] = Eb = (Ka > 0) + 0;\n xa[pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0;\n ua[pa] = (Ka > 1) + 0;\n aa[aa.length\n - 1] += 16;\n }\n pb[qa] = Eb;\n Ba |= ob(xa, 24 - 4 * qa);\n na |= ob(ua, 24 - 4 * qa);\n }\n ia = ob(ea, 24);\n ka = ob(pb, 24);\n ea = Nb(vc[J.X >> 4]);\n pb = Nb(vc[ma.X >> 4]);\n for (Sa = 0; Sa < 4; Sa += 2) {\n for (qa = 0; qa < 2; ++qa) {\n Eb = pb[Sa + qa];\n for (pa = 0; pa < 2; ++pa) Ca = Eb + ea[Sa + pa], Ka = Mc(T, H.R.z[2], Ca, Aa.qc, 0, aa), ea[Sa + pa] = Eb = (Ka > 0) + 0, xa[2 * qa + pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0, ua[2 * qa + pa] = (Ka > 1) + 0, aa[aa.length - 1] += 16;\n pb[Sa + qa] = Eb;\n }\n Ba |= ob(xa, 8 - 2 * Sa);\n na |= ob(ua, 8 - 2 * Sa);\n }\n ia |= ob(ea, 20);\n ka |= ob(pb, 20);\n J.X = ia;\n ma.X = ka;\n H.z = aa;\n H.Oa = na + 0;\n H.ja = na | Ba;\n J.Nb = !H.ja + 0;\n }\n D = !T.Ab;\n }\n if (!D) {\n c = Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA',\n `Premature end-of-file encountered.${a.i} ${a.d}`);\n break a;\n }\n const P = a;\n const da = P.Ea;\n const Ma = Tc;\n const Ua = P.Ea;\n const Va = Uc;\n const Wa = P.Ea;\n const Xa = he;\n if (P.i > 0) {\n for (var ba = ca, ba = -1; ba < 16; ++ba) Ec(da, Ma + ba * f - 4, da, Ma + ba * f + 12);\n for (ba = -1; ba < 8; ++ba) Ec(Ua, Va + ba * f - 4, Ua, Va + ba * f + 4), Ec(Wa, Xa + ba * f - 4, Wa, Xa + ba * f + 4);\n } else {\n for (ba = 0; ba < 16; ++ba) da[Ma + ba * f - 1] = 129;\n for (ba = 0; ba < 8; ++ba) Ua[Va + ba * f - 1] = 129, Wa[Xa + ba * f - 1] = 129;\n P.d > 0 && (da[Ma - 1 - f] = Ua[Va - 1 - f] = Wa[Xa - 1 - f] = 129);\n }\n const Qa = P.Xc;\n const Ra = 16 * +P.i;\n const mb = P.Sc;\n const vb = 8 * +P.i;\n const wb = P.Vc;\n const xb = 8 * +P.i;\n const Za = P.z;\n let fa = ca;\n if (P.d > 0) {\n N(da, Ma - f, Qa, Ra,\n 16), N(Ua, Va - f, mb, vb, 8), N(Wa, Xa - f, wb, xb, 8);\n } else if (P.i == 0) {\n for (i = 0; i < 21; ++i) da[Ma - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Ua[Va - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Wa[Xa - f - 1 + i] = 127;\n }\n if (P.wa) {\n const Ya = Ma - f + 16;\n P.d > 0 && (P.i >= P.Ma - 1 ? da[Ya + 0] = da[Ya + 1] = da[Ya + 2] = da[Ya + 3] = Qa[Ra + 15] : N(da, Ya + 0, Qa, Ra + 16, 4));\n for (let Fb = 0; Fb < 4; ++Fb) da[Fb + Ya + 4 * f] = da[Fb + Ya + 4 * f] = da[Fb + Ya + 8 * f] = da[Fb + Ya + 12 * f] = da[Fb + Ya + 0];\n for (fa = 0; fa < 16; fa++) {\n var ac = da;\n var bc = Ma + ie[fa];\n Uf[P.Eb[fa]](ac, bc);\n P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n } else {\n var $a = Fd(P, P.Eb[0]);\n Vf[$a](da, Ma);\n if (P.ja) for (fa = 0; fa < 16; fa++) ac = da, bc = Ma + ie[fa], P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n $a = Fd(P, P.Tc);\n je[$a](Ua, Va);\n je[$a](Wa, Xa);\n if (P.ja & 983040) {\n const zb = P.z;\n var Pa = 256;\n P.Oa & 983040 ? Pc(zb, Pa, Ua, Va) : Rc(zb, Pa, Ua, Va);\n }\n if (P.ja & 15728640) {\n const Ab = P.z;\n var Pa = 320;\n P.Oa & 15728640 ? Pc(Ab, Pa, Wa, Xa) : Rc(Ab, Pa, Wa, Xa);\n }\n P.d < P.hb - 1 && (N(Qa, Ra, da, Ma + 15 * f, 16), N(mb, vb, Ua, Va + 7 * f, 8), N(wb, xb, Wa, Xa + 7 * f, 8));\n const Q = a;\n if (Q.A > 0) {\n const kb = Q.M[1 + Q.i];\n const Kb = Q.La[1 + Q.i].Nb;\n let ha = Q.Zb[Q.Lb];\n Q.ga.oc && (ha\n += Q.ga.Lc[0], Q.wa && (ha += Q.ga.Gc[0]));\n ha = ha < 0 ? 0 : ha > 63 ? 63 : ha;\n kb.zc = ha;\n Q.ga.kb > 0 && (ha = Q.ga.kb > 4 ? ha >> 2 : ha >> 1, ha > 9 - Q.ga.kb && (ha = 9 - Q.ga.kb));\n kb.yc = ha < 1 ? 1 : ha;\n kb.ab = (!Kb || Q.wa) + 0;\n }\n for (var Ia = ca, Bb = 8 * Q.Ja * Q.r, Qb = Q.ca, Ub = Q.da + 16 * Q.i + 16 * Q.Ja * Q.H, Wb = Q.aa, Xb = Q.ba + 8 * Q.i + Bb, Yb = Q.ra, Zb = Q.sa + 8 * Q.i + Bb, Ia = 0; Ia < 16; ++Ia) N(Qb, Ub + Ia * Q.H, Q.Ea, +Tc + Ia * f, 16);\n for (Ia = 0; Ia < 8; ++Ia) N(Wb, Xb + Ia * Q.r, Q.Ea, +Uc + Ia * f, 8), N(Yb, Zb + Ia * Q.r, Q.Ea, +he + Ia * f, 8);\n }\n const K = a;\n const I = b;\n var cc = 1;\n const eb = K.oa;\n if (K.qb) {\n const nb = K.rc;\n var cc = cc & WebPWorkerSync(nb);\n $(nb.a == OK);\n if (cc) {\n eb.N = I;\n eb.ha = K.Ja;\n eb.d = K.d;\n eb.W = K.W;\n if (eb.W) {\n const hc = eb.M;\n eb.M = K.M;\n K.M = hc;\n }\n WebPWorkerLaunch(nb);\n ++K.Ja == K.jb && (K.Ja = 0);\n }\n } else {\n eb.d = K.d;\n eb.W = K.W;\n b: {\n let Hb = 1;\n const rb = K.oa;\n const ib = uc[K.A];\n const yb = ib * K.H;\n const dc = parseInt(ib / 2) * K.r;\n const Ib = 16 * rb.ha * K.H;\n const jb = 8 * rb.ha * K.r;\n const Jb = K.ca;\n const Lb = K.da - yb + Ib;\n const Ob = K.aa;\n const Pb = K.ba - dc + jb;\n const Rb = K.ra;\n const Sb = K.sa - dc + jb;\n const jc = rb.d == 0;\n const Tb = (rb.d >= K.hb - 1) + 0;\n var ra = 16 * rb.d;\n let fb = 16 * (rb.d + 1);\n if (rb.W) {\n const pc = K;\n let wc = s;\n const kc = pc.oa.d;\n $(pc.oa.W);\n for (wc = pc.lb; wc < pc.wb; ++wc) {\n const Na = pc;\n const ec = wc;\n const Vb = kc;\n const xc = Na.oa;\n const gb = Na.H;\n const fc = xc.M[1 + ec];\n const sb = Na.ca;\n const tb = Na.da + 16 * xc.ha\n * gb + 16 * ec;\n const Gb = fc.zc;\n const hb = fc.yc;\n const Ja = 2 * Gb + hb;\n if (Gb != 0) {\n if (Na.A == 1) ec > 0 && ae(sb, tb, gb, Ja + 4), fc.ab && ce(sb, tb, gb, Ja), Vb > 0 && $d(sb, tb, gb, Ja + 4), fc.ab && be(sb, tb, gb, Ja);\n else {\n const gc = Na.r;\n const yc = Na.aa;\n const zc = Na.ba + 8 * xc.ha * gc + 8 * ec;\n const Ac = Na.ra;\n const Bc = Na.sa + 8 * xc.ha * gc + 8 * ec;\n const ub = Na.Ac.fb ? Gb >= 40 ? 2 : Gb >= 15 ? 1 : 0 : Gb >= 40 ? 3 : Gb >= 20 ? 2 : Gb >= 15 ? 1 : 0;\n ec > 0 && (Td(sb, tb, gb, Ja + 4, hb, ub), Vd(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Xd(sb, tb, gb, Ja, hb, ub), Zd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n Vb > 0 && (Sd(sb, tb, gb, Ja + 4, hb, ub), Ud(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Wd(sb, tb, gb,\n Ja, hb, ub), Yd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n }\n }\n }\n }\n if (I.put) {\n jc ? (I.y = K.ca, I.D = K.da + Ib, I.c = K.aa, I.B = K.ba + jb, I.S = K.ra, I.C = K.sa + jb) : (ra -= ib, I.y = Jb, I.D = Lb, I.c = Ob, I.B = Pb, I.S = Rb, I.C = Sb);\n Tb || (fb -= ib);\n fb > I.K && (fb = I.K);\n if (K.Ga != p && ra < fb && (ra == 0 ? (I.p = qd(K, ra, fb - ra), I.q = 0) : I.q = qd(K, ra, fb - ra), I.p == p)) {\n cc = Y(K, W, 'Could not decode alpha data.');\n break b;\n }\n if (ra < I.k) {\n const qc = I.k - ra;\n var ra = I.k;\n $(!(qc & 1));\n I.D += K.H * qc;\n I.B += K.r * (qc >> 1);\n I.C += K.r * (qc >> 1);\n I.p != p && (I.q += I.width * qc);\n }\n ra < fb && (I.D += I.t, I.B += I.t >> 1, I.C += I.t >> 1, I.p != p && (I.q += I.t),\n I.w = ra - I.k, I.m = I.Ka - I.t, I.h = fb - ra, Hb = I.put(I));\n }\n rb.ha + 1 == K.jb && !Tb && (N(K.ca, K.da - yb, Jb, Lb + 16 * K.H, yb), N(K.aa, K.ba - dc, Ob, Pb + 8 * K.r, dc), N(K.ra, K.sa - dc, Rb, Sb + 8 * K.r, dc));\n cc = Hb;\n }\n }\n if (!cc) {\n c = Y(a, 'VP8_STATUS_USER_ABORT', 'Output aborted.');\n break a;\n }\n }\n let Cb;\n if (!(Cb = a.qb && !WebPWorkerSync(a.rc))) {\n let Db;\n if (Db = a.fc > 0) $(a), $(a.fc > 0), Db = !1;\n Cb = Db;\n }\n c = Cb ? 0 : 1;\n }\n }\n const lc = c;\n b.Pb && b.Pb(b);\n c = lc & 1;\n }\n if (!c) return ke(a), 0;\n a.za = 0;\n return c;\n }\n\n function ke(a) {\n a != p && (a.ib && (a.ib = 0), a.ib = p, a.Gb = 0, a.za = 0);\n }\n\n function Aa(a, b) {\n return a + (1 << b) - 1 >> b;\n }\n\n function hc(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J];\n d[e + 1] = ia[a + g - J];\n d[e + 2] = ia[a + b - J];\n }\n\n function le(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J] & 248 | ia[a + g - J] >> 5;\n d[e + 1] = ia[a + g - J] << 3 & 224 | ia[a + b - J] >> 3;\n }\n\n function me(a, b, c, d, e) {\n d[e + 0] = 255;\n hc(a, b, c, d, e + 1);\n }\n\n function ne(a, b, c, d, e) {\n const g = xb[b];\n d[e + 0] = Hb[a + Za[c] - J] << 4 | Hb[a + (vb[c] + wb[b] >> ea) - J];\n d[e + 1] = 15 | Hb[a + g - J] << 4;\n }\n\n function Vc(a, b, c, d, e) {\n const g = Za[c];\n c = vb[c] + wb[b] >> ea;\n d[e + 0] = ia[a + xb[b] - J];\n d[e + 1] = ia[a + c - J];\n d[e + 2] = ia[a + g - J];\n }\n\n function oe(a, b, c, d, e) {\n Vc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function pe(a, b, c, d, e) {\n hc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function ib(a, b, c) {\n a[b] = ((((a[b] & 4278255360) >>> 0) + ((c & 4278255360) >>> 0) & 4278255360) >>> 0 | (a[b] & 16711935) + (c & 16711935) & 16711935) >>> 0;\n }\n\n function ka(a, b) {\n return (((a ^ b) & 4278124286) >>> 1) + ((a & b) >>> 0) >>> 0;\n }\n\n function $a(a) {\n return a < 256 && a > 0 ? a : a <= 0 ? 0 : ~a >> 24 & 255;\n }\n\n function yb(a, b) {\n return $a(a + parseInt((a - b) / 2, 10));\n }\n\n function Wc() {\n return qe;\n }\n\n function Xc(a, b) {\n a &= 255;\n b &= 255;\n a > 127 && (a -= 256);\n b > 127 && (b -= 256);\n return a * b >>> 5;\n }\n\n function re(a,\n b, c, d, e, g, k) {\n var h = s;\n const n = 8 >> a.n;\n const l = a.U;\n const f = a.u;\n if (n < 8) {\n a = (1 << a.n) - 1;\n for (var t = (1 << n) - 1, h = b; h < c; ++h) {\n b = 0;\n for (var q = s, q = 0; q < l; ++q) (q & a) == 0 && (b = d[e++] >> 8 & 255), g[k++] = f[b & t], b >>= n;\n }\n } else for (h = b; h < c; ++h) for (q = 0; q < l; ++q) g[k++] = f[d[e++] >> 8 & 255];\n }\n\n function se(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n d[e++] = g >> 24 & 255;\n }\n }\n\n function te(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 240 | g >> 12 & 15;\n d[e++] = g >> 0 & 240 | g >> 28 & 15;\n }\n }\n\n function Ib(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 24 & 255;\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n }\n }\n\n function ue(a, b, c, d) {\n if (T(a, 8) != ve) return 0;\n b[0] = T(a, we) + 1;\n c[0] = T(a, we) + 1;\n d[0] = T(a, 1);\n T(a, Wf);\n return 1;\n }\n\n function xe(a, b) {\n let c = s;\n if (a < 4) return a + 1;\n c = a - 2 >> 1;\n return (2 + (a & 1) << c) + T(b, c) + 1;\n }\n\n function Oa(a, b) {\n if (b.Q + 8 > b.ya) {\n var c = a.Y;\n var d = 0;\n for ($(c != p); c[d].s != 0;) {\n var e = c;\n var g = b;\n const k = g.T >> g.g & 1;\n g.L ? g.fa = 1 : (++g.g, g.g >= 8 && Sb(g), g.Q == g.ya && g.g == 32 && (g.L = 1));\n d = d + e[d].s + k;\n }\n return c[d].kc;\n }\n c = a.Y;\n d = 0;\n for ($(c != p); c[d].s != 0;) {\n e = c, g = b.T >> b.g & 1, ++b.g, d = d\n + e[d].s + g;\n }\n return c[d].kc;\n }\n\n function zb(a, b) {\n if (a != p) for (var c = s, d = s, c = 0; c < b; ++c) for (var e = a[c].va, d = 0; d < Yc; ++d) ja(e[d]);\n }\n\n function ye(a, b, c) {\n b = a.eb == 0 ? 0 : a.ac[a.bd + a.Ec * (c >> a.eb) + (b >> a.eb)];\n $(b < a.hc);\n return a.Db[+b];\n }\n\n function ze(a, b, c, d) {\n let e = a.Na;\n const g = a.O;\n const k = g + b;\n var h = c;\n var f = d;\n d = a.Xa;\n c = a.vb;\n for (N(d, c, h, f, a.l * b); e-- > 0;) {\n b = a.nc[e];\n let l = g;\n var m = k;\n var t = h;\n var q = f;\n var f = d;\n var h = c;\n $(l < m);\n $(m <= b.Vb);\n switch (b.Qc) {\n case Ae:\n t = 0;\n for (b = h + (m - l) * b.U; h < b;) {\n var m = f;\n var q = h;\n var r = m[q] >> 8 & 255;\n var u = (m[q] & 16711935) >>> 0;\n var u = u + (r << 16 | r);\n var u = u & 16711935;\n f[h++] = ((m[q] & 4278255360)\n >>> 0 | u) >>> 0;\n l == 32 && t++;\n }\n break;\n case Be:\n var v = b;\n var C = l;\n var t = m;\n var q = f;\n var r = h;\n var u = v.U;\n if (C == 0) {\n var A = s;\n ib(q, r, qe);\n for (A = 1; A < u; ++A) ib(q, r + A, q[r + A - 1]);\n r += u;\n ++C;\n }\n for (var z = (1 << v.n) - 1, Ha = Aa(u, v.n), w = v.u, v = +(C >> v.n) * Ha; C < t;) {\n var y = w;\n var B = v;\n let G = p;\n ib(q, r, q[r - u + 0]);\n G = Ce[y[B++] >> 8 & 15];\n for (A = 1; A < u; ++A) {\n let F = E;\n (A & z) == 0 && (G = Ce[y[B++] >> 8 & 15]);\n F = G(q[r + A - 1], q, r + A - u);\n ib(q, r + A, F);\n }\n r += u;\n ++C;\n (C & z) == 0 && (v += Ha);\n }\n m != b.Vb && (b = b.U, N(f, h - b, f, h + (m - l - 1) * b, b));\n break;\n case De:\n t = b.U;\n q = (1 << b.n) - 1;\n r = Aa(t, b.n);\n u = b.u;\n for (b = +(l >> b.n) * r; l < m;) {\n A = u;\n C = b;\n z = M(Xf);\n Ha = s;\n for (Ha = 0; Ha < t; ++Ha) (Ha & q) == 0 && (w = A[C++], v = z, v.Cc = w >> 0 & 255, v.Bc = w >> 8 & 255, v.Kc = w >> 16 & 255), w = f[h + Ha], v = w >>> 8, y = w >>> 16, B = w, y += Xc(z.Cc, v), y &= 255, B += Xc(z.Bc, v), B += Xc(z.Kc, y), B &= 255, f[h + Ha] = (w & 4278255360 | y << 16 | B) >>> 0;\n h += t;\n ++l;\n (l & q) == 0 && (b += r);\n }\n break;\n case Ee:\n t == f && b.n > 0 ? (t = (m - l) * Aa(b.U, b.n), q = h + (m - l) * b.U - t, memmove(f, q, f, h, t), re(b, l, m, f, q, f, h)) : re(b, l, m, t, q, f, h);\n }\n h = d;\n f = c;\n }\n }\n\n function Yf(a, b) {\n var c = a.V;\n var d = a.Ha + a.l * a.O;\n var e = b - a.O;\n if (!(e <= 0)) {\n ze(a, e, c, d);\n var g = a.N;\n var c = a.Xa;\n let k = [a.vb];\n var d = a.O;\n var e = b;\n var h = k;\n var f = g.width;\n $(d < e);\n $(g.t < g.Ka);\n e > g.K && (e = g.K);\n if (d < g.k) {\n var l = g.k - d;\n var d = g.k;\n h[0] += f * l;\n }\n d >= e ? d = 0 : (h[0] += g.t, g.w = d - g.k, g.m = g.Ka - g.t, g.h = e - d, d = 1);\n if (d) {\n k = k[0];\n d = a.Ib;\n e = g.width;\n if (d.J < ua) {\n var m = d.c.RGBA;\n var h = m.ma;\n let t = m.Sa + a.xa * m.f;\n if (g.I) c = EmitRescaledRows(a, c, k, e, g.h, h, t, m.f);\n else {\n for (var f = d.J, l = g.m, g = g.h, m = m.f, q = g; q-- > 0;) {\n const r = c;\n let u = k;\n let v = l;\n const C = h;\n let A = t;\n switch (f) {\n case Qa:\n for (v = u + v; u < v;) {\n var z = r[u++];\n C[A++] = z >> 16 & 255;\n C[A++] = z >> 8 & 255;\n C[A++] = z >> 0 & 255;\n }\n break;\n case jb:\n se(r, u, v, C, A);\n break;\n case Ob:\n se(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v,\n 1, 0);\n break;\n case Zc:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 0 & 255, C[A++] = z >> 8 & 255, C[A++] = z >> 16 & 255;\n break;\n case Pa:\n Ib(r, u, v, C, A);\n break;\n case Pb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v, 1, 0);\n break;\n case Ab:\n Ib(r, u, v, C, A);\n break;\n case Bb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 1, v, 1, 0);\n break;\n case kb:\n te(r, u, v, C, A);\n break;\n case Qb:\n te(r, u, v, C, A);\n WebPApplyAlphaMultiply4444(C, v, 1, 0);\n break;\n case Fe:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 16 & 248 | z >> 13 & 7, C[A++] = z >> 5 & 224 | z >> 3 & 31;\n break;\n default:\n $(0);\n }\n k += e;\n t += m;\n }\n c = g;\n }\n a.xa += c;\n } else {\n a.xa = g.I ? EmitRescaledRowsYUVA(a, c, k, e, g.h) : EmitRowsYUVA(a, c, k, e, g.m, g.h);\n }\n $(a.xa <= d.height);\n }\n a.O = b;\n $(a.O <= a.v);\n }\n }\n\n function lc(a, b, c, d, e, g) {\n let k = 1;\n let h = 0;\n let f = 0;\n const l = a.o;\n const m = a.cb;\n let t = m.Db;\n let q = c;\n let r = c;\n c += d * e;\n e = Ba + Ge;\n const u = e + m.xb;\n const v = m.xb > 0 ? m.Yb : p;\n const C = m.Dc;\n let A = !1;\n $(t != p);\n for (; !l.L && q < c;) {\n let z = s;\n A || ((h & C) == 0 && (t = ye(m, h, f)), Da(l), z = Oa(t.va[Zf], l));\n if (z < Ba || A) {\n if (!A) {\n var w = k = A = s;\n var y = s;\n Da(l);\n A = Oa(t.va[$f], l);\n k = z;\n Da(l);\n w = Oa(t.va[ag], l);\n Da(l);\n y = Oa(t.va[bg], l);\n b[q] = (y << 24 >>> 0) + (A << 16) + (k << 8) + w;\n }\n A = !1;\n ++q;\n ++h;\n if (h >= d && (h = 0, ++f, g != p && f\n % $c == 0 && g(a, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < e) {\n w = w = s;\n k = xe(z - Ba, l);\n z = Oa(t.va[cg], l);\n Da(l);\n w = xe(z, l);\n w > He ? w -= He : (z = dg[w - 1], z = (z >> 4) * d + (8 - (z & 15)), w = z >= 1 ? z : 1);\n z = s;\n for (z = 0; z < k; ++z) b[q + z] = b[q + z - w];\n q += k;\n for (h += k; h >= d;) h -= d, ++f, g != p && f % $c == 0 && g(a, f);\n if (q < c && (t = ye(m, h, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < u) {\n A = z - e;\n for ($(v != p); r < q;) z = b[r++], v.ea[ad * z >>> v.bb] = z;\n z = b;\n w = q;\n y = v;\n $(A <= -1 >>> y.bb);\n z[w] = y.ea[A];\n A = !0;\n continue;\n }(k = !l.fa) || End;\n }\n g != p && g(a, f);\n l.fa || !k || l.L && q < c ? (k = 0, a.a = !l.L ? W : Ie) : q == c && (a.Ob = Db);\n return k;\n }\n\n function bd(a) {\n $(a);\n a.ac = p;\n zb(a.Db, a.hc);\n const b = a.Yb;\n b != p && (b.ea = p, b.ea = p);\n $(a);\n }\n\n function sd() {\n const a = M(eg);\n if (a == p) return p;\n a.a = L;\n a.Wa = cd;\n a.Ob = cd;\n return a;\n }\n\n function sa(a) {\n let b = s;\n if (a != p) {\n bd(a.cb);\n a.V = p;\n a.V = p;\n for (b = 0; b < a.Na; ++b) {\n const c = a.nc[b];\n c.u = p;\n c.u = p;\n }\n a.Na = 0;\n a.Ub = 0;\n a.Mc = p;\n a.Mc = p;\n a.Ib = p;\n }\n }\n\n function Ka(a, b, c, d, e) {\n var g = 1;\n a = [a];\n b = [b];\n for (var k = d.o, h = d.cb, f = p, l = p, l = 0; ;) {\n if (c) {\n for (; g && T(k, 1);) {\n var m = a;\n var t = b;\n var q = d;\n var r = 1;\n var u = q.o;\n var g = q.nc[q.Na];\n var v = T(u, 2);\n if (q.Ub & 1 << v) g = 0;\n else {\n q.Ub\n |= 1 << v;\n g.Qc = v;\n g.U = m[0];\n g.Vb = t[0];\n g.u = [p];\n g.b = 0;\n ++q.Na;\n $(q.Na <= Je);\n switch (v) {\n case Be:\n case De:\n g.n = T(u, 3) + 2;\n r = Ka(Aa(g.U, g.n), Aa(g.Vb, g.n), 0, q, g.u);\n break;\n case Ee:\n t = T(u, 8) + 1;\n r = t > 16 ? 0 : t > 4 ? 1 : t > 2 ? 2 : 3;\n m[0] = Aa(g.U, r);\n g.n = r;\n if (m = r = Ka(t, 1, 0, q, g.u)) {\n if (m = t, q = g, r = s, t = 1 << (8 >>> q.n) >>> 0, u = Array(t), u == p) m = 0;\n else {\n var v = q.u[0];\n var C = q.b;\n u[0] = q.u[0][q.b + 0];\n for (r = 1; r < m; ++r) u[r] = ((((v[C + r] & 4278255360) >>> 0) + ((u[r - 1] & 4278255360) >>> 0) & 4278255360) >>> 0 | (v[C + r] & 16711935) + (u[r - 1] & 16711935) & 16711935) >>> 0;\n for (; r < t; ++r) u[r] = 0;\n q.u[0] = p;\n q.b = p;\n q.u[0] = u;\n q.b = 0;\n m = 1;\n }\n }\n r = m;\n break;\n case Ae:\n break;\n default:\n $(0);\n }\n g.u = g.u[0];\n g = r;\n }\n }\n }\n if (g && T(k, 1) && (l = T(k, 4), g = l >= 1 && l <= fg, !g)) {\n d.a = W;\n break;\n }\n if (g) {\n a: {\n var g = d;\n var A = a[0];\n var z = b[0];\n var m = l;\n var C = v = s;\n var C = g.o;\n var q = g.cb;\n var r = [p];\n var t = p;\n var u = 1;\n if (c && T(C, 1)) {\n var v = T(C, 3) + 2;\n var A = Aa(A, v);\n var w = Aa(z, v);\n var z = A * w;\n if (!Ka(A, w, 0, g, r)) {\n g.a = W;\n zb(t, u);\n g = 0;\n break a;\n }\n r = r[0];\n q.eb = v;\n for (v = 0; v < z; ++v) A = r[v] >>> 8 & 65535, r[v] = A, A >= u && (u = A + 1);\n }\n if (C.fa) zb(t, u), g = 0;\n else if ($(u <= 65536), t = ld(u, gg), t == p) g.a = cb, zb(t, u), g = 0;\n else {\n for (v = 0; v < u; ++v) {\n z = t[v].va;\n for (C = 0; C < Yc; ++C) {\n A = hg[C];\n C == 0 && m > 0 && (A += 1 << m);\n b: {\n const y = A;\n var A = g;\n const G = z[+C];\n var B = 0;\n var w = A.o;\n if (T(w, 1)) {\n var F = Array(2);\n var D = Array(2);\n var L = Array(2);\n var B = T(w, 1) + 1;\n var J = T(w, 1);\n F[0] = T(w, J == 0 ? 1 : 8);\n D[0] = 0;\n L[0] = B - 1;\n B == 2 && (F[1] = T(w, 8), D[1] = 1, L[1] = B - 1);\n c: {\n var J = 0;\n var H = s;\n $(G != p);\n $(L != p);\n $(D != p);\n $(F != p);\n if (nd(G, B)) {\n for (H = 0; H < B; ++H) {\n if (D[H] != pd) {\n if (F[H] < 0 || F[H] >= y) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n if (!jc(G, F[H], D[H], L[H])) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n }\n }(J = (J = 1) && ma(G)) || ja(G);\n B = J;\n } else B = 0;\n }\n } else {\n B = s;\n D = [];\n F = T(w, 4) + 4;\n if (F > Ke) {\n A.a = W;\n A = 0;\n break b;\n }\n L = Array(y);\n if (L == p) {\n A.a = cb;\n A = 0;\n break b;\n }\n for (B = 0; B < F; ++B) D[ig[B]] = T(w, 3);\n c: {\n var B = A;\n var O = D;\n var D = y;\n var F = L;\n var J = 0;\n var H = B.o;\n let S = s;\n let V = s;\n let Y = jg;\n const Z = M(Le);\n if (od(Z, O, Ke)) {\n if (T(H, 1)) {\n if (S = 2 + 2 * T(H, 3), V = 2 + T(H, S), V > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n } else V = D;\n for (S = 0; S < D;) {\n var R = s;\n if (V-- == 0) break;\n Da(H);\n R = Oa(Z, H);\n if (R < Me) F[S++] = R, R != 0 && (Y = R);\n else {\n var O = R == kg;\n var R = R - Me;\n const ea = lg[R];\n var R = T(H, mg[R]) + ea;\n if (S + R > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n for (O = O ? Y : 0; R-- > 0;) F[S++] = O;\n }\n }\n J = 1;\n ja(Z);\n B = J;\n } else B.a = W, B = 0;\n }\n B && (B = od(G, L, y));\n }(B = B && !w.fa) ? A = 1 : (A.a = W, A = 0);\n }\n if (!A) {\n zb(t, u);\n g = 0;\n break a;\n }\n }\n }\n q.ac = r;\n q.hc = u;\n q.Db = t;\n g = 1;\n }\n }\n }\n if (!g) {\n d.a = W;\n break;\n }\n if (l > 0) {\n if (h.xb = 1 << l, m = h.Yb, q = 1 << l, $(m != p), $(l > 0), m.ea = U(q, 0), m.ea == p ? l = 0 : (m.bb = 32 - l, l = 1), !l) {\n d.a = cb;\n g = 0;\n break;\n }\n } else h.xb = 0;\n l = d;\n m = a[0];\n q = b[0];\n r = l.cb;\n t = r.eb;\n l.l = m;\n l.v = q;\n r.Ec = Aa(m, t);\n r.Dc = t == 0 ? -1 : (1 << t) - 1;\n if (c) {\n d.Ob = Cb;\n break;\n }\n f = Array(a * b);\n l = 0;\n if (f == p) {\n d.a = cb;\n g = 0;\n break;\n }\n g = (g = lc(d, f, l, a, b, p)) && !k.fa;\n break;\n }\n g ? (e != p ? e[0] = f : ($(f == p), $(c)), c || bd(h)) : (bd(h), d.a == W && d.o.L && (d.a = Ie));\n return g;\n }\n\n function xd(a, b) {\n const c = a.l * a.v;\n const d = c + b + b * $c;\n $(a.l <= b);\n a.V = Array(d);\n a.Ha = 0;\n if (a.V == p) {\n return a.Xa = p, a.a = cb, 0;\n }\n a.Xa = a.V;\n a.vb = a.Ha + c + b;\n return 1;\n }\n\n function mf(a, b) {\n var c = b - a.O;\n var d = a.V;\n var e = a.Ha + a.l * a.O;\n if (!(c <= 0)) {\n ze(a, c, d, e);\n for (var e = a.N.width, c = e * c, d = a.N.ka, e = a.N.fd + e * a.O, g = a.Xa, k = a.vb, h = s, h = 0; h < c; ++h) d[e + h] = g[k + h] >>> 8 & 255;\n a.O = a.xa = b;\n }\n }\n\n function ng(a, b) {\n const c = [s];\n const d = [s];\n const e = [s];\n if (a == p) return 0;\n if (b == p) return a.a = ta, 0;\n a.N = b;\n a.a = L;\n Rb(a.o, b.data, b.b, b.e);\n if (!ue(a.o, c, d, e)) return a.a = W, sa(a), $(a.a != L), 0;\n a.Ob = cd;\n b.width = c[0];\n b.height = d[0];\n a.Wa = Cb;\n return !Ka(c[0], d[0], 1, a, p) ? (sa(a), $(a.a != L), 0) : 1;\n }\n\n function og(a) {\n let b = p;\n let c = p;\n if (a == p) return 0;\n b = a.N;\n $(b != p);\n c = b.ka;\n $(c != p);\n a.Ib = c.j;\n a.Hc = c.Hc;\n $(a.Ib != p);\n if (!Ne(c.Qa, b, Pa)) return a.a = ta, sa(a), $(a.a != L), 0;\n if (!xd(a, b.width) || b.I && !AllocateAndInitRescaler(a, b)) return sa(a), $(a.a != L), 0;\n a.Wa = Db;\n if (!lc(a, a.V, a.Ha, a.l, a.v, Yf)) return sa(a), $(a.a != L), 0;\n c.ec = a.xa;\n sa(a);\n return 1;\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, C, w, z) {\n let y; const G = C - 1 >> 1;\n let F = e[g + 0] | k[h + 0] << 16;\n let B = f[l + 0] | m[t + 0] << 16;\n if (a) {\n var D = 3 * F + B + 131074 >> 2;\n w(a[b + 0], D & 255, D >> 16, q, r);\n }\n c && (D = 3 * B + F + 131074 >> 2, w(c[d + 0], D & 255, D >> 16, u, v));\n for (y = 1; y <= G; ++y) {\n const J = e[g + y] | k[h + y] << 16;\n const L = f[l + y] | m[t + y] << 16;\n var D = F + J + B + L + 524296;\n const O = D + 2 * (J + B) >> 3;\n const H = D + 2 * (F + L) >> 3;\n a && (D = O + F >> 1, F = H + J >> 1, w(a[b + 2 * y - 1], D & 255, D >> 16, q, r + (2 * y - 1) * z), w(a[b + 2 * y - 0], F & 255, F >> 16, q, r + (2 * y - 0) * z));\n c && (D = H + B >> 1, F = O + L >> 1, w(c[d + 2 * y - 1], D & 255, D >> 16, u, v + (2 * y - 1) * z), w(c[d + 2 * y + 0], F & 255, F >> 16, u, v + (2 * y + 0) * z));\n F = J;\n B = L;\n }\n C & 1 || (a && (D = 3 * F + B + 131074 >> 2, w(a[b + C - 1], D & 255, D >> 16, q, r + (C - 1) * z)), c && (D = 3 * B + F + 131074 >> 2, w(c[d + C - 1], D & 255, D >> 16, u, v + (C - 1) * z)));\n }\n\n function pg(a,\n b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, hc, 3);\n }\n\n function qg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, Vc, 3);\n }\n\n function Oe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, pe, 4);\n }\n\n function Pe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, oe, 4);\n }\n\n function Qe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, me, 4);\n }\n\n function Re(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h,\n f, l, m, t, q, r, u, v, w, ne, 2);\n }\n\n function rg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, le, 2);\n }\n\n function Ca(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u) {\n let v;\n for (v = 0; v < q - 1; v += 2) r(a[b + 0], e[g + 0], k[h + 0], f, l), r(a[b + 1], e[g + 0], k[h + 0], f, l + u), r(c[d + 0], e[g + 0], k[h + 0], m, t), r(c[d + 1], e[g + 0], k[h + 0], m, t + u), b += 2, d += 2, g++, h++, l += 2 * u, t += 2 * u;\n v == q - 1 && (r(a[b + 0], e[g + 0], k[h + 0], f, l), r(c[d + 0], e[g + 0], k[h + 0], m, t));\n }\n\n function Se(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, pe, 4);\n }\n\n function Te(a, b, c, d, e, g, k, f, n, l,\n m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, oe, 4);\n }\n\n function Ue(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, me, 4);\n }\n\n function Ve(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, ne, 2);\n }\n\n function sg(a, b, c, d, e, g) {\n for (; e-- > 0;) {\n for (var k = a, f = b + (c ? 1 : 0), n = a, l = b + (c ? 0 : 3), m = s, m = 0; m < d; ++m) {\n var t = n[l + 4 * m];\n if (t != 255) {\n var t = 32897 * t;\n let q = k;\n let r = f + 4 * m + 0;\n k[f + 4 * m + 0] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 1;\n k[f + 4 * m + 1] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 2;\n k[f + 4 * m + 2] * t >>> 23;\n q[r] = ca;\n }\n }\n b += g;\n }\n }\n\n function tg(a, b) {\n const c = b.j.c.Va;\n const d = c.y;\n const e = c.D + a.w * c.F;\n const g = c.c;\n const k = c.B + (a.w >> 1) * c.nb;\n const f = c.S;\n const n = c.C + (a.w >> 1) * c.rb;\n const l = a.m;\n const m = a.h;\n const t = parseInt((l + 1) / 2, 10);\n const q = parseInt((m + 1) / 2, 10);\n let r;\n for (r = 0; r < m; ++r) N(d, e + r * c.F, a.y, a.D + r * a.F, l);\n for (r = 0; r < q; ++r) N(g, k + r * c.nb, a.c, a.B + r * a.Da, t), N(f, n + r * c.rb, a.S, a.C + r * a.Da, t);\n return a.h;\n }\n\n function ug(a, b) {\n var c = b.j;\n const d = c.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = a.y;\n let f = a.D;\n const n = a.c;\n let l = a.B;\n const m = a.S;\n let t = a.C;\n var c = vg[c.J];\n const q = a.m;\n const r = a.h - 1;\n let u;\n for (u = 0; u < r; u += 2) c(k, f, k, f + a.F, n, l, m, t, e, g, e, g + d.f, q), f += 2 * a.F, l += a.Da, t += a.Da, g += 2 * d.f;\n u == r && c(k, f, k, f, n, l, m, t, e, g, e, g, q);\n return a.h;\n }\n\n function wg(a, b) {\n let c = a.h;\n const d = b.j.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = V[b.j.J];\n const f = a.y;\n let n = a.D;\n const l = a.c;\n let m = a.B;\n const t = a.S;\n let q = a.C;\n let r = b.Qb;\n let u = b.Rb;\n let v = b.lc;\n let w = b.mc;\n let A = a.w;\n const z = a.w + a.h;\n const y = a.m;\n const D = parseInt((y + 1) / 2, 10);\n A == 0 ? k(p, p, f, n, l, m, t, q, l, m, t, q, p, p, e, g, y) : (k(b.Sb, b.Tb, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y), ++c);\n for (; A + 2 < z; A += 2) r = l, u = m, v = t, w = q, m += a.Da, q += a.Da, g += 2 * d.f, n += 2 * a.F, k(f, n - a.F, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y);\n n += a.F;\n a.k + z < a.K ? (N(b.Sb, b.Tb, f, n, 1 * y), N(b.Qb, b.Rb, l, m, 1 * D), N(b.lc, b.mc, t, q, 1 * D), c--) : z & 1 || k(f, n, p, p, l, m, t, q, l, m,\n t, q, e, g + d.f, p, p, y);\n return c;\n }\n\n function xg(a, b) {\n var c = a.p;\n var d = a.q;\n const e = b.j.c.Va;\n const g = a.m;\n const f = a.h;\n const h = e.p;\n let n = e.q + a.w * e.Fa;\n var c = a.p;\n var d = a.q;\n let l = s;\n if (c != p) for (l = 0; l < f; ++l) N(h, n, c, d, 1 * g), d += a.width, n += e.Fa;\n else if (e.p != p) for (l = 0; l < f; ++l) jd(h, n, 255, g), n += e.Fa;\n return 0;\n }\n\n function We(a, b, c) {\n let d = a.w;\n c[0] = a.h;\n a.Bb && (d == 0 ? --c[0] : (--d, b[0] -= a.width), a.k + a.w + a.h == a.K && (c[0] = a.K - a.k - d));\n return d;\n }\n\n function yg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n for (var e = a.m, g = b.j.J, f = g == Ab || g == Bb, h = b.j.c.RGBA, n = [s], l = We(a, d, n), d = d[0], m = h.ma, l = h.Sa + l * h.f,\n t = l + (f ? 0 : 3), q = 255, r = s, u = s, u = 0; u < n[0]; ++u) {\n for (r = 0; r < e; ++r) {\n const v = c[d + r];\n m[t + 4 * r] = v;\n q &= v;\n }\n d += a.width;\n t += h.f;\n }\n q != 255 && F(g) && WebPApplyAlphaMultiply(m, l, f, e, n, h.f);\n }\n return 0;\n }\n\n function zg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n const e = a.m;\n const g = b.j.J;\n const f = b.j.c.RGBA;\n const h = [s];\n var n = We(a, d, h);\n var d = d[0];\n const l = f.ma;\n var n = f.Sa + n * f.f;\n let m = n + 1;\n let t = 15;\n let q = s;\n for (j = 0; j < h[0]; ++j) {\n for (q = 0; q < e; ++q) {\n const r = c[d + q] >> 4;\n l[m + 2 * q] = l[m + 2 * q] & 240 | r;\n t &= r;\n }\n d += a.width;\n m += f.f;\n }\n t != 15 && F(g) && WebPApplyAlphaMultiply4444(l, n, e, h, f.f);\n }\n return 0;\n }\n\n function vd(a) {\n let b = a.ka;\n const c = b.j.J;\n const d = c\n < ua;\n const e = c == jb || c == Pa || c == Ab || c == kb || c == Ra || F(c);\n b.memory = p;\n b.$a = p;\n b.zb = p;\n b.ad = p;\n if (!Ne(b.Qa, a, e ? ua : Ra)) return 0;\n if (a.I) {\n if (!(d ? InitRGBRescaler(a, b) : InitYUVRescaler(a, b))) return alert('memory error #1'), 0;\n } else {\n if (d) {\n if (b.$a = ug, a.Bb) {\n const g = a.m + 1 >> 1;\n const f = a.m + 2 * g;\n let h; const\n n = [];\n for (h = 0; h < f; ++h) n.push(205);\n n.push(0);\n b.memory = n;\n if (b.memory == p) return alert('memory error #2'), 0;\n b.Sb = b.memory;\n b.Tb = 0;\n b.Qb = b.Sb;\n b.Rb = b.Tb + a.m;\n b.lc = b.Qb;\n b.mc = b.Rb + g;\n b.$a = wg;\n V[Qa] = pg;\n V[jb] = Oe;\n V[Zc] = qg;\n V[Pa] = Pe;\n V[Ab] = Qe;\n V[kb] = Re;\n V[Fe] = rg;\n }\n } else {\n b.$a = tg;\n }\n e && (F(c) && (WebPApplyAlphaMultiply = sg, V[Ob] = Oe, V[Pb] = Pe, V[Bb] = Qe, V[Qb] = Re), b.zb = c == kb || c == Qb ? zg : d ? yg : xg);\n }\n if (d && !Xe) {\n for (a = 0; a < 256; ++a) Za[a] = 89858 * (a - 128) + Jb >> ea, wb[a] = -22014 * (a - 128) + Jb, vb[a] = -45773 * (a - 128), xb[a] = 113618 * (a - 128) + Jb >> ea;\n for (a = J; a < dd; ++a) b = 76283 * (a - 16) + Jb >> ea, ia[a - J] = wa(b, 255), Hb[a - J] = wa(b + 8 >> 4, 15);\n Xe = 1;\n }\n return 1;\n }\n\n function ud(a) {\n const b = a.ka;\n let c = a.m;\n const d = a.h;\n $(!(a.w & 1));\n if (c <= 0 || d <= 0) return 0;\n c = b.$a(a, b);\n b.ec += c;\n b.zb && b.zb(a, b);\n return 1;\n }\n\n function wd(a) {\n a = a.ka;\n a.memory = '';\n a.memory = p;\n }\n\n function ed(a,\n b) {\n return a[b + 0] | a[b + 1] << 8 | a[b + 2] << 16;\n }\n\n function Kb(a, b) {\n return (ed(a, b) | a[b + 3] << 24) >>> 0;\n }\n\n function Ye(a, b, c, d, e, g, f) {\n var h = 0;\n var n = [0];\n var l = 'VP8StatusCode';\n const m = M(Gc);\n if (a == p || c[0] < Lb) return Z;\n m.data = a;\n m.b = [b[0]];\n m.e = [c[0]];\n m.na = [m.na];\n a: {\n h = m.na;\n $(a != p);\n $(c != p);\n $(h != p);\n h[0] = 0;\n if (c[0] >= Lb && !kd(a, b[0], 'RIFF', O)) {\n if (kd(a, b[0] + 8, 'WEBP', O)) {\n l = W;\n break a;\n }\n var t = Kb(a, b[0] + O);\n if (t < O + R) {\n l = W;\n break a;\n }\n h[0] = t;\n b[0] += Lb;\n c[0] -= Lb;\n } else h[0] = 0;\n l = L;\n }\n m.na = m.na[0];\n if (l != L) return l;\n h = m.na > 0;\n t = [0];\n a: if (l = R + fd, $(a != p), $(c != p), $(n != p), n[0] = 0, c[0] < R) l = Z;\n else {\n if (!kd(a, b[0], 'VP8X', O)) {\n var q = s;\n var r = s;\n var u = E;\n if (Kb(a, b[0] + O) != fd) {\n l = W;\n break a;\n }\n if (c[0] < l) {\n l = Z;\n break a;\n }\n u = Kb(a, b[0] + 8);\n q = 1 + ed(a, b[0] + 12);\n r = 1 + ed(a, b[0] + 15);\n if (q * r >= Ag) {\n l = W;\n break a;\n }\n t != p && (t[0] = u);\n d != p && (d[0] = q);\n e != p && (e[0] = r);\n b[0] += l;\n c[0] -= l;\n n[0] = 1;\n }\n l = L;\n }\n if (l != L) return l;\n if (!h && n[0]) return W;\n g != p && (g[0] = !!(t[0] & Bg));\n if (n && f == p) return L;\n if (c < O) return Z;\n if (h && n[0] || !h && !n[0] && !kd(a, b[0], 'ALPH', O)) {\n m.$ = [m.$];\n m.G = [m.G];\n m.pa = [m.pa];\n a: {\n var n = m.na;\n var h = m.$;\n var t = m.G;\n var l = m.pa;\n var q = x;\n var r = 0;\n var u = Mb;\n let v = O + R + fd;\n $(a != p);\n $(c != p);\n q = a;\n r = b[0];\n u = c[0];\n $(h != p);\n $(l != p);\n h[0] = p;\n t[0] = p;\n for (l[0] = 0; ;) {\n let w = E;\n let y = E;\n b[0] = r;\n c[0] = u;\n if (u < R) {\n l = Z;\n break a;\n }\n w = Kb(q, r + O);\n y = R + w + 1 & -2;\n v += y;\n if (n > 0 && v > n) {\n l = W;\n break a;\n }\n if (u < y) {\n l = Z;\n break a;\n }\n if (kd(q, r, 'ALPH', O)) {\n if (!kd(q, r, 'VP8 ', O) || !kd(q, 'VP8L', O)) {\n l = L;\n break a;\n }\n } else h[0] = q, t[0] = r + R, l[0] = w;\n r += y;\n u -= y;\n }\n l = ca;\n }\n m.$ = m.$[0];\n m.G = m.G[0];\n m.pa = m.pa[0];\n if (l != L) return l;\n }\n m.ta = [m.ta];\n m.ia = [m.ia];\n a: if (n = m.na, h = m.ta, t = m.ia, r = !kd(a, b[0], 'VP8 ', O), l = !kd(a, b[0], 'VP8L', O), q = O + R, $(a != p), $(c != p), $(h != p), $(t != p), c[0] < R) l = Z;\n else {\n if (r || l) {\n r = Kb(a, b[0] + O);\n if (n >= q && r > n - q) {\n l = W;\n break a;\n }\n h[0] = r;\n b[0] += R;\n c[0] -= R;\n t[0] = l;\n } else t[0] = c >= 1 && a[b + 0] == ve, h[0] = c[0];\n l = L;\n }\n m.ta = m.ta[0];\n m.ia = m.ia[0];\n if (l != L) return l;\n if (m.ta > Ze) return W;\n if (m.ia) {\n if (c[0] < $e) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n t = g ? g[0] : p;\n a == p || h < $e ? a = 0 : (l = [s], q = [s], r = [s], u = M(af), Rb(u, a, n, h), ue(u, l, q, r) ? (d != p && (d[0] = l[0]), e != p && (e[0] = q[0]), t != p && (t[0] = r[0]), a = 1) : a = 0);\n } else {\n if (c < bf) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n !(a == p || h < bf) && h - 3 >= 3 && a[n + 3 + 0] == 157 && a[n\n + 3 + 1] == 1 && a[n + 3 + 2] == 42 ? (h = a[n + 0] | a[n + 1] << 8 | a[n + 2] << 16, t = (a[n + 7] << 8 | a[n + 6]) & 16383, a = (a[n + 9] << 8 | a[n + 8]) & 16383, !(!(h & 1) + 0) || (h >> 1 & 7) > 3 || !(h >> 4 & 1) || h >> 5 >= m.ta ? a = 0 : (d && (d[0] = t), e && (e[0] = a), a = 1)) : a = 0;\n }\n if (!a) return W;\n g != p && (g[0] |= m.$ != p);\n f != p && (f[0] = m, f[0].offset = b[0] - f[0].b, $(b[0] - f[0].b < Ze), $(f[0].offset == f[0].e - c[0]));\n return L;\n }\n\n function Kd(a) {\n $(a != p);\n return Ye(a[0].data, a[0].b, a[0].e, p, p, p, a);\n }\n\n function cf(a, b, c, d) {\n let e = 'VP8StatusCode';\n const g = M(Vb);\n let f = M(Gc);\n f.data = a;\n f.b = b;\n f.e = c;\n f.b = [f.b];\n f.e = [f.e];\n f = [f];\n e = Kd(f);\n if (e\n != L) return e;\n f = f[0];\n f.b = f.b[0];\n f.e = f.e[0];\n $(d != p);\n td(na);\n g.data = f.data;\n g.b = b + f.offset;\n g.e = f.e - f.offset;\n g.put = ud;\n g.Mb = vd;\n g.Pb = wd;\n g.ka = d;\n if (f.ia) {\n a = sd();\n if (a == p) return cb;\n ng(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !og(a) && (e = a.a)) : e = a.a;\n a != p && sa(a);\n } else {\n e = M(Cg);\n e != p && (Gd(e), e.za = 0, e.Hb = 1);\n a = e;\n if (a == p) return cb;\n a.qb = 0;\n a.Ga = f.$;\n a.G = f.G;\n a.ub = f.pa;\n Hd(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !Mf(a, g) && (e = a.a)) : e = a.a;\n a != p && ke(a);\n }\n e != L && (self || this).Yc(d.j);\n return e;\n }\n\n function lb(a, b, c, d, e) {\n const g = {\n value: 0,\n };\n c = {\n value: c,\n };\n const f = M(df);\n const h = M(gd);\n f.j = h;\n h.J = a;\n const n = {\n value: h.width,\n };\n const l = {\n value: h.height,\n };\n let m;\n m = c;\n const t = M(ef);\n hd(b, g, m, t) != L ? m = 0 : (n != p && (n.value = t.width), l != p && (l.value = t.height), m = 1);\n if (!m) return p;\n h.width = n.value;\n h.height = l.value;\n d != p && (d.value = h.width.value);\n e != p && (e.value = h.height.value);\n return cf(b, g.value, c.value, f) != L ? p : a < ua ? h.c.RGBA.ma : h.c.Va.y;\n }\n\n function hd(a, b, c, d) {\n if (d == p || a == p) return ta;\n $(d != p);\n d.tc = 0;\n d.width = [d.width];\n d.height = [d.height];\n d.$b = [d.$b];\n return Ye(a, b, c, d.width, d.height, d.$b, p);\n }\n\n function Ne(a,\n b, c) {\n const d = b.width;\n const e = b.height;\n let g = 0;\n let f = 0;\n let h = d;\n let n = e;\n b.Ua = a != p && a.Ua > 0;\n if (b.Ua && (h = a.wc, n = a.vc, g = a.t, f = a.k, c < ua || (g &= -2, f &= -2), g < 0 || f < 0 || h <= 0 || n <= 0 || g + h > d || f + n > e)) return 0;\n b.t = g;\n b.k = f;\n b.Ka = g + h;\n b.K = f + n;\n b.m = h;\n b.h = n;\n b.I = a != p && a.I > 0;\n if (b.I) {\n if (a.Ba <= 0 || a.Aa <= 0) return 0;\n b.Ba = a.Ba;\n b.Aa = a.Aa;\n }\n b.Za = a && a.Za;\n b.Bb = a == p || !a.ed;\n b.I && (b.Za = b.Ba < 3 * d / 4 && b.Aa < 3 * e / 4, b.Bb = 0);\n return 1;\n }\n var na = 512;\n var Qa = 0;\n var jb = 1;\n var Zc = 2;\n var Pa = 3;\n var Ab = 4;\n var kb = 5;\n var Fe = 6;\n var Ob = 7;\n var Pb = 8;\n var Bb = 9;\n var Qb = 10;\n var ua = 11;\n var Ra = 12;\n var Cc = 13;\n this.WEBP_CSP_MODE = this.Cd = {\n nd: 0,\n od: 1,\n kd: 2,\n ld: 3,\n jd: 4,\n pd: 5,\n qd: 6,\n rd: 7,\n sd: 8,\n md: 9,\n };\n var gd = {\n J: 'WEBP_CSP_MODE',\n width: s,\n height: s,\n Fc: s,\n c: {\n RGBA: {\n ma: x,\n Sa: 0,\n f: s,\n size: Mb,\n },\n Va: {\n y: x,\n c: x,\n S: x,\n p: x,\n D: x,\n B: x,\n C: x,\n q: x,\n F: s,\n nb: s,\n rb: s,\n Fa: s,\n Wc: Mb,\n Rc: Mb,\n Uc: Mb,\n Wb: Mb,\n },\n },\n Ic: U(4, E),\n Jb: p,\n jc: x,\n };\n var L = 0;\n var cb = 1;\n var ta = 2;\n var W = 3;\n var Hf = 4;\n var Ie = 5;\n var Nf = 6;\n var Z = 7;\n this.VP8StatusCode = this.td = {\n xd: 0,\n yd: 1,\n vd: 2,\n ud: 3,\n Ad: 4,\n zd: 5,\n Bd: 6,\n wd: 7,\n };\n var ef = {\n width: {\n value: s,\n },\n height: {\n value: s,\n },\n $b: {\n value: s,\n },\n tc: s,\n Yd: s,\n rotate: s,\n be: s,\n Ic: U(3, E),\n };\n this.WebPGetFeatures = this.Md = function (a, b, c) {\n let d = 'VP8StatusCode';\n na >>> 8 != na >>> 8 || c == p ? a = ta : (b = [b], d = hd(a, [0], b, c), a = d == Z ? W : d);\n return a;\n };\n const ff = {\n Za: s,\n ed: s,\n Ua: s,\n t: s,\n k: s,\n wc: s,\n vc: s,\n I: s,\n Ba: s,\n Aa: s,\n ae: s,\n Td: s,\n Xd: s,\n Ic: U(6, E),\n };\n this.WebPDecoderConfig = this.Kd = {\n input: M(ef),\n j: M(gd),\n options: M(ff),\n };\n this.WebPInitDecoderConfig = this.Nd = function (a) {\n na >>> 8 != na >>> 8 || a == p ? a = 0 : (a = a.input, $(a != p), a.tc = 0, a = 1);\n return a;\n };\n var Vb = {\n width: s,\n height: s,\n w: s,\n m: s,\n h: s,\n y: x,\n c: x,\n S: x,\n D: 0,\n B: 0,\n C: 0,\n F: s,\n Da: s,\n ka: 0,\n put: 0,\n Mb: 0,\n Pb: 0,\n Bb: s,\n e: Mb,\n data: x,\n b: 0,\n Za: s,\n Ua: s,\n t: s,\n Ka: s,\n k: s,\n K: s,\n I: s,\n Ba: s,\n Aa: s,\n p: x,\n q: 0,\n };\n var df = {\n j: M(gd),\n Sb: x,\n Qb: x,\n lc: x,\n Tb: 0,\n Rb: 0,\n mc: 0,\n ec: s,\n Qa: M(ff),\n memory: 0,\n $a: '(OutputFunc)',\n zb: '(OutputFunc)',\n ad: '(OutputRowFunc)',\n };\n var Gc = {\n data: x,\n b: x,\n e: Mb,\n offset: Mb,\n $: p,\n G: x,\n pa: Mb,\n ta: Mb,\n na: Mb,\n ia: s,\n };\n var Fc = {\n qa: x,\n Ia: p,\n Pd: x,\n Ab: s,\n la: E,\n Z: E,\n gc: s,\n };\n var af = {\n T: bb,\n qa: x,\n Ia: x,\n ya: Mb,\n Q: Mb,\n g: s,\n L: s,\n fa: s,\n };\n var gf = 25;\n var hf = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215];\n var bf = 10;\n var ve = 47;\n var we = 14;\n var Wf = 3;\n var $e = 5;\n var fg = 11;\n var Yc = 5;\n var qe = 4278190080;\n var jg = 8;\n var Tb = 15;\n var Ba = 256;\n var Ge = 24;\n var Je = 4;\n var Be = 0;\n var De = 1;\n var Ae = 2;\n var Ee = 3;\n var Ub = 1;\n var kc = 0;\n var kf = 1;\n var rd = 1;\n var O = 4;\n var R = 8;\n var Lb = 12;\n var fd = 10;\n var Bg = 16;\n var Ag = 1 * Math.pow(2, 32);\n var Ze = -1 - R - 1 >>> 0;\n var jf = {\n kc: s,\n s,\n };\n var Le = {\n Y: 'HuffmanTreeNode*',\n gb: s,\n Pa: s,\n };\n var pd = -1;\n const Dg = {\n ea: E,\n bb: s,\n };\n var ad = 506832829;\n var $b = 0;\n var ge = $b;\n var fe = 2;\n var ee = 3;\n var de = 1;\n var Ef = 4;\n var Df = 5;\n var Cf = 6;\n var Ld = 3;\n var xa = 4;\n var Hc = 4;\n var Gf = 4;\n var Md = 4;\n var Nd = 8;\n var Kc = 3;\n var Lc = 11;\n var f = 32;\n var Pf = 17 * f + 9 * f;\n var Tc = 1 * f + 8;\n var Uc = Tc + 16 * f + f;\n var he = Uc + 16;\n var Id = {\n fb: x,\n Jc: x,\n Nc: x,\n Ra: E,\n };\n var Jd = {\n l: 0,\n v: 0,\n gd: x,\n hd: x,\n uc: x,\n $c: x,\n };\n const Eg = {\n pb: s,\n ob: s,\n tb: s,\n Kb: U(xa, 0),\n Cb: U(xa, 0),\n };\n const Fg = {\n Ta: U(Ld, x),\n z: md([Md, Nd, Kc, Lc], x),\n };\n const Gg = {\n Oc: s,\n Fb: s,\n kb: s,\n oc: s,\n Lc: U(Hc, s),\n Gc: U(Hc, s),\n };\n var Oc = {\n zc: s,\n yc: s,\n ab: s,\n };\n var Qd = {\n X: s,\n ua: s,\n Nb: s,\n };\n const id = U(2, s);\n const Hg = {\n sc: M(id),\n sb: M(id),\n qc: M(id),\n };\n const Ig = {\n ha: s,\n d: s,\n W: s,\n M: Oc,\n N: Vb,\n };\n var Cg = {\n a: 'VP8StatusCode',\n za: s,\n xc: 0,\n o: M(Fc),\n Ac: M(Id),\n P: M(Jd),\n ga: M(Gg),\n Ca: M(Eg),\n rc: 'WebPWorker',\n qb: s,\n Ja: s,\n jb: s,\n oa: Ig,\n Ma: s,\n hb: s,\n lb: s,\n mb: s,\n wb: s,\n Ya: s,\n Hb: s,\n ic: ld(8, Fc),\n Zc: E,\n yb: ld(xa, Hg),\n R: M(Fg),\n pc: s,\n Pc: x,\n dc: x,\n cc: U(4, x),\n Xc: x,\n Sc: x,\n Vc: x,\n La: M(Qd),\n M: M(Oc),\n Ea: x,\n z: 0,\n ca: x,\n aa: x,\n ra: x,\n da: s,\n ba: s,\n sa: s,\n H: s,\n r: s,\n ib: 0,\n Gb: Mb,\n i: s,\n d: s,\n wa: x,\n Eb: U(16, x),\n Vd: 0,\n Tc: x,\n Lb: x,\n ja: E,\n Oa: E,\n A: s,\n W: s,\n Zb: U(xa, x),\n Ga: p,\n G: 0,\n ub: Mb,\n Xb: x,\n Od: 0,\n cd: s,\n dd: x,\n Wd: 0,\n fc: Mb,\n };\n var Db = 0;\n var Cb = 1;\n var cd = 2;\n const Jg = {\n Qc: 'VP8LImageTransformType',\n n: s,\n U: s,\n Vb: s,\n u: E,\n b: E,\n };\n var gg = {\n va: ld(Yc, Le),\n };\n const Kg = {\n xb: s,\n Yb: M(Dg),\n Dc: s,\n eb: s,\n Ec: s,\n ac: E,\n bd: E,\n hc: s,\n Db: 'HTreeGroup',\n };\n var eg = {\n a: 'VP8StatusCode',\n Wa: 'VP8LDecodeState',\n Ob: 'VP8LDecodeState',\n N: 'VP8Io',\n Ib: 'WebPDecBuffer',\n Hc: 'WebPDecBuffer',\n V: E,\n Ha: E,\n Xa: E,\n vb: E,\n o: M(af),\n l: s,\n v: s,\n O: s,\n xa: s,\n cb: M(Kg),\n Na: s,\n nc: ld(Je, Jg),\n Ub: E,\n Mc: x,\n $d: x,\n Zd: '*WebPRescaler',\n };\n var lf = 4;\n var nf = [p, function (a, b, c, d, e, g, f, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(f != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(g >= c * e);\n for (n = 0; n < d; ++n) {\n n == 0 ? N(f, h, a, b, e) : Ea(a, b, f, l - g, f, h, e), Ea(a, b + e, f, l, f, h + e, e * (c - 1)),\n l += g, b += g, h += g;\n }\n }, function (a, b, c, d, e, f, k, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, l, k, h + e, e * (c - 1));\n for (n = 1; n < d; ++n) b += f, h += f, Ea(a, b, k, l, k, h, e * c), l += f;\n }, function (a, b, c, d, e, f, k, h) {\n var n = h;\n let l = s;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, n, k, h + e, e * (c - 1));\n for (l = 1; l < d; ++l) {\n let m = s;\n var n = n + f;\n b += f;\n h += f;\n Ea(a, b, k, n - f, k, h, e);\n for (m = e; m < c * e; ++m) {\n const t = k[n + m - e] + k[n + m - f] - k[n + m - f - e];\n k[h + m] = a[b + m] + (t < 0 ? 0 : t > 255 ? 255 : t) & 255;\n }\n }\n }];\n var yd = [3, 4, 3, 4, 4, 2, 2, 4, 4, 4,\n 2, 1, 1,\n ];\n this.WebPFreeDecBuffer = this.Yc = function (a) {\n a != p && (a.Fc || (a.Jb = ''), a.jc = 0, a.Jb = a.jc = p);\n };\n self = this;\n var va = U(511, x);\n var tc = U(511, x);\n var sc = U(2041, 0);\n var oc = U(225, 0);\n var oa = U(766, x);\n var Rd = 0;\n var Xb = 85627;\n var Wb = 35468;\n var Uf = [function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 4; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n c >>= 3;\n for (d = 0; d < 4; ++d) jd(a, b + d * f, c, 4);\n }, function (a, b) {\n Dc(a, b, 4);\n }, function (a, b) {\n let c = b - f;\n const d = [];\n d.push(y(a[c - 1], a[c + 0], a[c + 1]));\n d.push(y(a[c + 0], a[c + 1], a[c + 2]));\n d.push(y(a[c + 1], a[c + 2], a[c + 3]));\n d.push(y(a[c + 2], a[c + 3], a[c + 4]));\n for (c = 0; c < 4; ++c) N(a, b + c * f, d, 0, 4);\n },\n function (a, b) {\n const c = a[b - 1];\n const d = a[b - 1 + f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = a[b + 1 + 0 * f] = a[b + 2 + 0 * f] = a[b + 3 + 0 * f] = y(a[b - 1 - f], c, d);\n a[b + 0 + 1 * f] = a[b + 1 + 1 * f] = a[b + 2 + 1 * f] = a[b + 3 + 1 * f] = y(c, d, e);\n a[b + 0 + 2 * f] = a[b + 1 + 2 * f] = a[b + 2 + 2 * f] = a[b + 3 + 2 * f] = y(d, e, g);\n a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = y(e, g, g);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 3 * f] = y(d, e, a[b - 1 + 3 * f]);\n a[b + 0 + 2 * f] = a[b + 1 + 3 * f] = y(c, d, e);\n a[b + 0 + 1 * f] = a[b + 1 + 2 * f] = a[b + 2 + 3 * f] = y(g, c, d);\n a[b\n + 0 + 0 * f] = a[b + 1 + 1 * f] = a[b + 2 + 2 * f] = a[b + 3 + 3 * f] = y(k, g, c);\n a[b + 1 + 0 * f] = a[b + 2 + 1 * f] = a[b + 3 + 2 * f] = y(h, k, g);\n a[b + 2 + 0 * f] = a[b + 3 + 1 * f] = y(n, h, k);\n a[b + 3 + 0 * f] = y(l, n, h);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 0 * f] = a[b + 1 + 2 * f] = g + k + 1 >> 1;\n a[b + 1 + 0 * f] = a[b + 2 + 2 * f] = k + h + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 3 + 2 * f] = h + n + 1 >> 1;\n a[b + 3 + 0 * f] = n + l + 1 >> 1;\n a[b + 0 + 3 * f] = y(e, d, c);\n a[b + 0 + 2 * f] = y(d, c, g);\n a[b + 0 + 1 * f] = a[b + 1 + 3 * f] = y(c, g, k);\n a[b + 1 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 2 + 1 * f] = a[b + 3 + 3 * f] = y(k, h, n);\n a[b + 3 + 1 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b + 1 - f];\n const d = a[b + 2 - f];\n const e = a[b + 3 - f];\n const g = a[b + 4 - f];\n const k = a[b + 5 - f];\n const h = a[b + 6 - f];\n const n = a[b + 7 - f];\n a[b + 0 + 0 * f] = y(a[b + 0 - f], c, d);\n a[b + 1 + 0 * f] = a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 2 + 0 * f] = a[b + 1 + 1 * f] = a[b + 0 + 2 * f] = y(d, e, g);\n a[b + 3 + 0 * f] = a[b + 2 + 1 * f] = a[b + 1 + 2 * f] = a[b + 0 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 2 * f] = a[b + 1 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = a[b + 2 + 3 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, n);\n },\n function (a, b) {\n const c = a[b + 0 - f];\n const d = a[b + 1 - f];\n const e = a[b + 2 - f];\n const g = a[b + 3 - f];\n const k = a[b + 4 - f];\n const h = a[b + 5 - f];\n const n = a[b + 6 - f];\n const l = a[b + 7 - f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 1 + 0 * f] = a[b\n + 0 + 2 * f] = d + e + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 1 + 2 * f] = e + g + 1 >> 1;\n a[b + 3 + 0 * f] = a[b + 2 + 2 * f] = g + k + 1 >> 1;\n a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 1 + 1 * f] = a[b + 0 + 3 * f] = y(d, e, g);\n a[b + 2 + 1 * f] = a[b + 1 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n const k = a[b - 1 - f];\n const h = a[b + 0 - f];\n const n = a[b + 1 - f];\n const l = a[b + 2 - f];\n a[b + 0 + 0 * f] = a[b + 2 + 1 * f] = c + k + 1 >> 1;\n a[b + 0 + 1 * f] = a[b + 2 + 2 * f] = d + c + 1 >> 1;\n a[b + 0 + 2 * f] = a[b + 2 + 3 * f] = e + d + 1 >> 1;\n a[b + 0 + 3 * f] = g + e + 1 >> 1;\n a[b + 3 + 0 * f] = y(h, n, l);\n a[b + 2 + 0 * f] = y(k, h, n);\n a[b\n + 1 + 0 * f] = a[b + 3 + 1 * f] = y(c, k, h);\n a[b + 1 + 1 * f] = a[b + 3 + 2 * f] = y(d, c, k);\n a[b + 1 + 2 * f] = a[b + 3 + 3 * f] = y(e, d, c);\n a[b + 1 + 3 * f] = y(g, e, d);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 0 + 1 * f] = d + e + 1 >> 1;\n a[b + 2 + 1 * f] = a[b + 0 + 2 * f] = e + g + 1 >> 1;\n a[b + 1 + 0 * f] = y(c, d, e);\n a[b + 3 + 0 * f] = a[b + 1 + 1 * f] = y(d, e, g);\n a[b + 3 + 1 * f] = a[b + 1 + 2 * f] = y(e, g, g);\n a[b + 3 + 2 * f] = a[b + 2 + 2 * f] = a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = g;\n },\n ];\n var Vf = [function (a, b) {\n let c = 16;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f] + a[b + d - f];\n Yb(c >> 5, a, b);\n }, function (a,\n b) {\n Dc(a, b, 16);\n }, function (a, b) {\n let c;\n for (c = 0; c < 16; ++c) N(a, b + c * f, a, b - f, 16);\n }, function (a, b) {\n let c;\n for (c = 16; c > 0; --c) jd(a, b + 0, a[b - 1], 16), b += f;\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b + d - f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n Yb(128, a, b);\n }];\n var je = [function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n Zb(1 * (c >> 4), a, b);\n }, function (a, b) {\n Dc(a, b, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) N(a, b + c * f, a, b - f, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) {\n jd(a,\n b + 0, a[b - 1], 8), b += f;\n }\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b - 1 + d * f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n Zb(128, a, b);\n }];\n let mc; let Pc; let Qc; let Rc; let Sd; let Td; let Ud; let Vd; let Wd; let Xd; let Yd; let Zd; let $d; let ae; let be; let ce; var Pd = 31;\n var uc = [0, 2, 8];\n var Od = 3;\n var Of = 1;\n var ie = [0 + 0 * f, 4 + 0 * f, 8 + 0 * f, 12 + 0 * f, 0 + 4 * f, 4 + 4 * f, 8 + 4 * f, 12 + 4 * f, 0 + 8 * f, 4 + 8 * f, 8 + 8 * f, 12 + 8 * f, 0 + 12 * f, 4 + 12 * f, 8 + 12 * f, 12 + 12 * f];\n var Ic = [4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38,\n 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157,\n ];\n var Jc = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96,\n 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,\n ];\n var Sf = [-$b, 1, -1, 2, -2, 3, 4, 6, -3, 5, -4, -5, -6, 7, -7, 8, -8, -9];\n var Ff = [\n [\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128],\n [189, 129, 242, 255, 227, 213, 255, 219, 128, 128,\n 128,\n ],\n [106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128],\n ],\n [\n [1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128],\n [181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128],\n [78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128],\n ],\n [\n [1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128],\n [184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128],\n [77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128],\n ],\n [\n [1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128],\n [170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128],\n [37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128],\n ],\n [\n [1, 204, 254, 255, 245, 255, 128, 128, 128, 128,\n 128,\n ],\n [207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128],\n [102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128],\n ],\n [\n [1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128],\n [177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128],\n [80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62],\n [131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1],\n [68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128],\n ],\n [\n [1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128],\n [184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128],\n [81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128],\n ],\n [\n [1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128],\n [99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128],\n [23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128],\n ],\n [\n [1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128],\n [109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128],\n [44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128],\n ],\n [\n [1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128],\n [94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128],\n [22,\n 100, 174, 245, 186, 161, 255, 199, 128, 128, 128,\n ],\n ],\n [\n [1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128],\n [124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128],\n [35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128],\n ],\n [\n [1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128],\n [121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128],\n [45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128],\n ],\n [\n [1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128],\n [203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n [137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128],\n [175, 13,\n 224, 243, 193, 185, 249, 198, 255, 255, 128,\n ],\n [73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128],\n ],\n [\n [1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128],\n [239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128],\n [155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128],\n ],\n [\n [1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128],\n [201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128],\n [69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128],\n ],\n [\n [1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128],\n [223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128],\n [141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 16, 248, 255,\n 255, 128, 128, 128, 128, 128, 128,\n ],\n [190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128],\n [149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128],\n [213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128],\n [55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128,\n 128, 128, 128, 128, 128, 128, 128,\n ],\n ],\n ],\n [\n [\n [202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255],\n [126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128],\n [61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128],\n ],\n [\n [1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128],\n [166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128],\n [39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128],\n ],\n [\n [1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128],\n [124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128],\n [24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128],\n ],\n [\n [1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128],\n [149, 150, 226, 252, 216,\n 205, 255, 171, 128, 128, 128,\n ],\n [28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128],\n ],\n [\n [1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128],\n [123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128],\n [20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128],\n ],\n [\n [1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128],\n [168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128],\n [47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128],\n ],\n [\n [1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128],\n [141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128],\n [42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128,\n 128, 128, 128, 128,\n ],\n [244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n ];\n var Rf = [\n [\n [231, 120, 48, 89, 115, 113, 120, 152, 112],\n [152, 179, 64, 126, 170, 118, 46, 70, 95],\n [175, 69, 143, 80, 85, 82, 72, 155, 103],\n [56, 58, 10, 171, 218, 189, 17, 13, 152],\n [114, 26, 17, 163, 44, 195, 21, 10, 173],\n [121, 24, 80, 195, 26, 62, 44, 64, 85],\n [144, 71, 10, 38, 171, 213, 144, 34, 26],\n [170, 46, 55, 19, 136, 160, 33, 206, 71],\n [63, 20, 8, 114, 114, 208, 12, 9, 226],\n [81, 40, 11, 96, 182, 84, 29, 16, 36],\n ],\n [\n [134, 183, 89, 137, 98, 101, 106, 165, 148],\n [72, 187, 100, 130, 157, 111,\n 32, 75, 80,\n ],\n [66, 102, 167, 99, 74, 62, 40, 234, 128],\n [41, 53, 9, 178, 241, 141, 26, 8, 107],\n [74, 43, 26, 146, 73, 166, 49, 23, 157],\n [65, 38, 105, 160, 51, 52, 31, 115, 128],\n [104, 79, 12, 27, 217, 255, 87, 17, 7],\n [87, 68, 71, 44, 114, 51, 15, 186, 23],\n [47, 41, 14, 110, 182, 183, 21, 17, 194],\n [66, 45, 25, 102, 197, 189, 23, 18, 22],\n ],\n [\n [88, 88, 147, 150, 42, 46, 45, 196, 205],\n [43, 97, 183, 117, 85, 38, 35, 179, 61],\n [39, 53, 200, 87, 26, 21, 43, 232, 171],\n [56, 34, 51, 104, 114, 102, 29, 93, 77],\n [39, 28, 85, 171, 58, 165, 90, 98, 64],\n [34, 22, 116, 206, 23, 34, 43, 166, 73],\n [107, 54, 32, 26, 51, 1, 81, 43, 31],\n [68, 25, 106, 22,\n 64, 171, 36, 225, 114,\n ],\n [34, 19, 21, 102, 132, 188, 16, 76, 124],\n [62, 18, 78, 95, 85, 57, 50, 48, 51],\n ],\n [\n [193, 101, 35, 159, 215, 111, 89, 46, 111],\n [60, 148, 31, 172, 219, 228, 21, 18, 111],\n [112, 113, 77, 85, 179, 255, 38, 120, 114],\n [40, 42, 1, 196, 245, 209, 10, 25, 109],\n [88, 43, 29, 140, 166, 213, 37, 43, 154],\n [61, 63, 30, 155, 67, 45, 68, 1, 209],\n [100, 80, 8, 43, 154, 1, 51, 26, 71],\n [142, 78, 78, 16, 255, 128, 34, 197, 171],\n [41, 40, 5, 102, 211, 183, 4, 1, 221],\n [51, 50, 17, 168, 209, 192, 23, 25, 82],\n ],\n [\n [138, 31, 36, 171, 27, 166, 38, 44, 229],\n [67, 87, 58, 169, 82, 115, 26, 59, 179],\n [63, 59, 90, 180, 59, 166, 93, 73,\n 154,\n ],\n [40, 40, 21, 116, 143, 209, 34, 39, 175],\n [47, 15, 16, 183, 34, 223, 49, 45, 183],\n [46, 17, 33, 183, 6, 98, 15, 32, 183],\n [57, 46, 22, 24, 128, 1, 54, 17, 37],\n [65, 32, 73, 115, 28, 128, 23, 128, 205],\n [40, 3, 9, 115, 51, 192, 18, 6, 223],\n [87, 37, 9, 115, 59, 77, 64, 21, 47],\n ],\n [\n [104, 55, 44, 218, 9, 54, 53, 130, 226],\n [64, 90, 70, 205, 40, 41, 23, 26, 57],\n [54, 57, 112, 184, 5, 41, 38, 166, 213],\n [30, 34, 26, 133, 152, 116, 10, 32, 134],\n [39, 19, 53, 221, 26, 114, 32, 73, 255],\n [31, 9, 65, 234, 2, 15, 1, 118, 73],\n [75, 32, 12, 51, 192, 255, 160, 43, 51],\n [88, 31, 35, 67, 102, 85, 55, 186, 85],\n [56, 21, 23, 111, 59, 205, 45, 37, 192],\n [55, 38, 70, 124, 73, 102, 1, 34, 98],\n ],\n [\n [125, 98, 42, 88, 104, 85, 117, 175, 82],\n [95, 84, 53, 89, 128, 100, 113, 101, 45],\n [75, 79, 123, 47, 51, 128, 81, 171, 1],\n [57, 17, 5, 71, 102, 57, 53, 41, 49],\n [38, 33, 13, 121, 57, 73, 26, 1, 85],\n [41, 10, 67, 138, 77, 110, 90, 47, 114],\n [115, 21, 2, 10, 102, 255, 166, 23, 6],\n [101, 29, 16, 10, 85, 128, 101, 196, 26],\n [57, 18, 10, 102, 102, 213, 34, 20, 43],\n [117, 20, 15, 36, 163, 128, 68, 1, 26],\n ],\n [\n [102, 61, 71, 37, 34, 53, 31, 243, 192],\n [69, 60, 71, 38, 73, 119, 28, 222, 37],\n [68, 45, 128, 34, 1, 47, 11, 245, 171],\n [62, 17, 19, 70, 146, 85, 55, 62, 70],\n [37, 43, 37, 154, 100, 163, 85, 160,\n 1,\n ],\n [63, 9, 92, 136, 28, 64, 32, 201, 85],\n [75, 15, 9, 9, 64, 255, 184, 119, 16],\n [86, 6, 28, 5, 64, 255, 25, 248, 1],\n [56, 8, 17, 132, 137, 255, 55, 116, 128],\n [58, 15, 20, 82, 135, 57, 26, 121, 40],\n ],\n [\n [164, 50, 31, 137, 154, 133, 25, 35, 218],\n [51, 103, 44, 131, 131, 123, 31, 6, 158],\n [86, 40, 64, 135, 148, 224, 45, 183, 128],\n [22, 26, 17, 131, 240, 154, 14, 1, 209],\n [45, 16, 21, 91, 64, 222, 7, 1, 197],\n [56, 21, 39, 155, 60, 138, 23, 102, 213],\n [83, 12, 13, 54, 192, 255, 68, 47, 28],\n [85, 26, 85, 85, 128, 128, 32, 146, 171],\n [18, 11, 7, 63, 144, 171, 4, 4, 246],\n [35, 27, 10, 146, 174, 171, 12, 26, 128],\n ],\n [\n [190, 80, 35, 99, 180, 80,\n 126, 54, 45,\n ],\n [85, 126, 47, 87, 176, 51, 41, 20, 32],\n [101, 75, 128, 139, 118, 146, 116, 128, 85],\n [56, 41, 15, 176, 236, 85, 37, 9, 62],\n [71, 30, 17, 119, 118, 255, 17, 18, 138],\n [101, 38, 60, 138, 55, 70, 43, 26, 142],\n [146, 36, 19, 30, 171, 255, 97, 27, 20],\n [138, 45, 61, 62, 219, 1, 81, 188, 64],\n [32, 41, 20, 117, 151, 142, 20, 21, 163],\n [112, 19, 12, 61, 195, 128, 48, 4, 24],\n ],\n ];\n var If = [\n [\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 241,\n 252, 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255],\n [250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [225, 252, 241, 253, 255, 255, 254, 255,\n 255, 255, 255,\n ],\n [234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255,\n 255, 255, 255, 255, 255, 255,\n ],\n [252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n ],\n ],\n [\n [\n [186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255],\n [251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255,\n 255, 255,\n ],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 253, 255, 255, 255,\n 255, 255, 255, 255, 255,\n ],\n [253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 253,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n ];\n this.WebPGetDecoderVersion = this.Ld = function () {\n return 512;\n };\n var Nc = [0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0];\n var Jf = [\n [173, 148, 140, 0],\n [176, 155, 140, 135, 0],\n [180, 157, 141, 134, 130, 0],\n [254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0],\n ];\n var Kf = [0, 1, 4, 8, 5, 2, 3, 6,\n 9, 12, 13, 10, 7, 11, 14, 15,\n ];\n var Tf = md([Kc, Lc], '');\n U(4, x);\n var vc = [\n [0, 0, 0, 0],\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [1, 1, 0, 0],\n [0, 0, 1, 0],\n [1, 0, 1, 0],\n [0, 1, 1, 0],\n [1, 1, 1, 0],\n [0, 0, 0, 1],\n [1, 0, 0, 1],\n [0, 1, 0, 1],\n [1, 1, 0, 1],\n [0, 0, 1, 1],\n [1, 0, 1, 1],\n [0, 1, 1, 1],\n [1, 1, 1, 1],\n ];\n var Lf = 134480385;\n var ea = 16;\n var J = -227;\n var dd = 482;\n var Ce = [Wc, function (a) {\n return a;\n }, function (a, b, c) {\n return b[c + 0];\n }, function (a, b, c) {\n return b[c + 1];\n }, function (a, b, c) {\n return b[c - 1];\n }, function (a, b, c) {\n return ka(ka(a, b[c + 1]), b[c + 0]);\n }, function (a, b, c) {\n return ka(a, b[c - 1]);\n }, function (a, b, c) {\n return ka(a, b[c + 0]);\n }, function (a,\n b, c) {\n return ka(b[c - 1], b[c + 0]);\n }, function (a, b, c) {\n return ka(b[c + 0], b[c + 1]);\n }, function (a, b, c) {\n return ka(ka(a, b[c - 1]), ka(b[c + 0], b[c + 1]));\n }, function (a, b, c) {\n return Math.abs((a >> 24 & 255) - (b[c - 1] >> 24 & 255)) - Math.abs((b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) + (Math.abs((a >> 16 & 255) - (b[c - 1] >> 16 & 255)) - Math.abs((b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255))) + (Math.abs((a >> 8 & 255) - (b[c - 1] >> 8 & 255)) - Math.abs((b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255))) + (Math.abs((a & 255) - (b[c - 1] & 255)) - Math.abs((b[c + 0] & 255) - (b[c - 1] & 255))) <= 0 ? b[c + 0] : a;\n }, function (a, b, c) {\n return ($a((a\n >> 24 & 255) + (b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) << 24 | $a((a >> 16 & 255) + (b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255)) << 16 | $a((a >> 8 & 255) + (b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255)) << 8 | $a((a & 255) + (b[c + 0] & 255) - (b[c - 1] & 255))) >>> 0;\n }, function (a, b, c) {\n const d = b[c - 1];\n a = ka(a, b[c + 0]);\n return (yb(a >> 24 & 255, d >> 24 & 255) << 24 | yb(a >> 16 & 255, d >> 16 & 255) << 16 | yb(a >> 8 & 255, d >> 8 & 255) << 8 | yb(a >> 0 & 255, d >> 0 & 255)) >>> 0;\n }, Wc, Wc];\n var Xf = {\n Cc: x,\n Bc: x,\n Kc: x,\n };\n var $c = 16;\n var Me = 16;\n var kg = 16;\n var mg = [2, 3, 7];\n var lg = [3, 3, 11];\n var Zf = 0;\n var $f = 1;\n var ag = 2;\n var bg = 3;\n var cg = 4;\n var hg = [Ba + Ge, Ba, Ba, Ba, 40];\n var Ke = 19;\n var ig = [17, 18, 0, 1, 2, 3, 4, 5, 16,\n 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n ];\n var He = 120;\n var dg = [24, 7, 23, 25, 40, 6, 39, 41, 22, 26, 38, 42, 56, 5, 55, 57, 21, 27, 54, 58, 37, 43, 72, 4, 71, 73, 20, 28, 53, 59, 70, 74, 36, 44, 88, 69, 75, 52, 60, 3, 87, 89, 19, 29, 86, 90, 35, 45, 68, 76, 85, 91, 51, 61, 104, 2, 103, 105, 18, 30, 102, 106, 34, 46, 84, 92, 67, 77, 101, 107, 50, 62, 120, 1, 119, 121, 83, 93, 17, 31, 100, 108, 66, 78, 118, 122, 33, 47, 117, 123, 49, 63, 99, 109, 82, 94, 0, 116, 124, 65, 79, 16, 32, 98, 110, 48, 115, 125, 81, 95, 64, 114, 126, 97, 111, 80, 113, 127, 96, 112];\n var Jb = 1 << ea - 1;\n var Za = U(256, 0);\n var xb = U(256, 0);\n var vb = U(256, la);\n var wb = U(256, la);\n var ia = U(dd - J, x);\n var Hb = U(dd\n - J, x);\n var Xe = 0;\n var V = Array(Cc);\n var vg = [function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, hc, 3);\n }, Se, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, Vc, 3);\n }, Te, Ue, Ve, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, le, 2);\n }, Se, Te, Ue, Ve];\n this.Hd = function (a, b, c, d) {\n return lb(Qa, a, b, c, d);\n };\n this.Id = function (a, b, c, d) {\n return lb(jb, a, b, c, d);\n };\n this.Jd = function (a, b, c, d) {\n return lb(kb, a, b, c, d);\n };\n this.Ed = function (a, b, c, d) {\n return lb(Ab, a, b, c, d);\n };\n this.Fd = function (a, b, c, d) {\n return lb(Zc,\n a, b, c, d);\n };\n this.Gd = function (a, b, c, d) {\n return lb(Pa, a, b, c, d);\n };\n this.WebPDecode = this.Dd = function (a, b, c) {\n const d = M(df);\n let e = 'VP8StatusCode';\n if (c == p) return ta;\n e = hd(a, [0], [b], c.input);\n if (e != L) return e == Z ? W : e;\n d.j = c.j;\n d.Qa = c.Qa;\n return e = cf(a, 0, [b], d);\n };\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {webp2png} from './webp';\nimport type {ConvertWebPTask} from './webpWorkerController';\n\nconst ctx = self as any as DedicatedWorkerGlobalScope;\nconst tasks: ConvertWebPTask[] = [];\n// let isProcessing = false;\n\nfunction finishTask() {\n // isProcessing = false;\n processTasks();\n}\n\nfunction processTasks() {\n // if(isProcessing) return;\n\n const task = tasks.shift();\n if(!task) return;\n\n // isProcessing = true;\n\n switch(task.type) {\n case 'convertWebp': {\n const {fileName, bytes} = task.payload;\n\n let convertedBytes: Uint8Array;\n try {\n convertedBytes = webp2png(bytes).bytes;\n } catch(err) {\n console.error('Convert webp2png error:', err, 'payload:', task.payload);\n }\n\n ctx.postMessage({\n type: 'convertWebp',\n payload: {\n fileName,\n bytes: convertedBytes\n }\n });\n\n finishTask();\n\n break;\n }\n\n default:\n finishTask();\n }\n}\n\nfunction scheduleTask(task: ConvertWebPTask) {\n tasks.push(task);\n /* if(task.payload.fileName.indexOf('main-') === 0) {\n tasks.push(task);\n } else {\n tasks.unshift(task);\n } */\n\n processTasks();\n}\n\nctx.addEventListener('message', (event) => {\n scheduleTask(event.data);\n});\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {WebPDecoder} from '../../vendor/libwebp-0.2.0';\nimport {encode} from 'fast-png';\n\nexport function webp2png(data: Uint8Array) {\n const decoder = new WebPDecoder();\n const config: any = decoder.WebPDecoderConfig;\n const buffer = config.j || config.output;\n const bitstream = config.input;\n\n decoder.WebPInitDecoderConfig(config);\n decoder.WebPGetFeatures(data, data.length, bitstream);\n\n /** MODE_RGBA = 1 MODE_ARGB = 4, */\n buffer.J = 1;\n\n let status;\n try {\n status = decoder.WebPDecode(data, data.length, config);\n } catch(e) {\n status = e;\n }\n\n if(status === 0) {\n const rgbaData = buffer.Jb;\n const pngData = encode({\n data: rgbaData,\n width: buffer.width,\n height: buffer.height,\n channels: 4,\n depth: 8\n });\n\n return {status, bytes: pngData};\n }\n\n return {status, bytes: data};\n}\n\nexport function webp2pngAsBlob(data: Uint8Array) {\n const {status, bytes} = webp2png(data);\n return new Blob([bytes], {type: status === 0 ? 'image/png' : 'image/webp'});\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,866,158], () => (__webpack_require__(2061)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + {\"158\":\"npm.iobuffer\",\"699\":\"npm.pako\",\"866\":\"npm.fast-png\"}[chunkId] + \".\" + {\"158\":\"061a9f8cc247dc1dbb8d\",\"699\":\"85f88e27b023cbb2ca51\",\"866\":\"8cb0a7aa9c4ab1eb9f54\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t61: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","i","p","M","F","JSON","parse","stringify","N","G","w","D","S","Nb","length","push","ic","rc","memmove","arr1","index1","arr2","index2","jd","kd","ga","String","fromCharCode","U","ld","md","$","Error","WebPDecoder","a","Ob","Pb","Bb","Qb","b","c","la","d","e","Z","gc","bc","qa","Ia","Rb","ya","T","Q","g","L","fa","Sb","Da","gf","hf","ma","Pa","gb","nd","Y","jf","s","ja","jc","k","h","n","l","kc","od","Tb","pd","Ea","qd","P","v","Ga","ub","Xb","m","f","q","r","u","C","Ub","kf","lf","rd","Vb","A","z","sd","td","na","put","ud","Mb","vd","wd","ka","fd","width","height","o","Wa","Cb","Ka","xd","Db","lc","V","Ha","mf","sa","nf","zd","ta","Ua","wc","vc","t","I","Ba","Aa","J","Qa","Cc","Fc","Jb","yd","ua","parseInt","Ra","cb","RGBA","Sa","size","Va","y","Wc","B","nb","Rc","rb","Uc","Wb","Fa","of","mb","Ad","pf","qf","mc","nc","rf","Dc","oa","Yb","Zb","sc","oc","Bd","va","Cd","tc","Dd","Ed","sf","tf","uf","vf","wf","xf","yf","zf","Af","Bf","Fd","$b","Cf","Df","Ef","Ec","wa","Gd","xc","alert","za","Hd","Id","Jd","Gc","data","Kd","ia","W","pa","offset","Ac","fb","Jc","Nc","gd","hd","Ma","hb","K","R","Ta","Ff","Ca","pb","ob","tb","Kb","Lb","uc","$c","xa","Ld","Ab","Oc","Fb","kb","Hc","Lc","Gf","Hb","yb","Ic","sb","qc","Hf","Zc","Md","Nd","Kc","If","pc","Pc","fc","dd","cd","Mc","Jf","Kf","Lf","Mf","Nf","Za","lb","Ya","wb","Ja","qb","WebPWorkerReset","Qd","Rd","Ud","FinishRow","jb","Od","Of","Pf","Pd","Gb","ib","dc","Xc","Sc","Vc","Sd","ha","H","ca","da","aa","ba","ra","La","Qc","Td","Vd","Wd","Xd","Yd","Zd","$d","ae","be","ce","Qf","db","X","cc","O","Eb","Rf","Sf","de","ee","fe","ge","Tc","Oa","Tf","ea","ab","Xa","he","vb","xb","ac","ie","Uf","$a","Vf","je","zb","zc","yc","eb","WebPWorkerSync","OK","hc","WebPWorkerLaunch","Ib","Na","ec","Bc","ke","le","me","ne","oe","pe","qe","re","se","te","ue","ve","we","Wf","xe","Yc","ye","bd","ze","Ae","Be","Ce","De","Xf","Ee","Yf","EmitRescaledRows","WebPApplyAlphaMultiply","WebPApplyAlphaMultiply4444","Fe","EmitRescaledRowsYUVA","EmitRowsYUVA","Ge","Zf","$f","ag","bg","ad","bb","cg","He","dg","End","Ie","eg","Je","Array","fg","gg","hg","Ke","ig","jg","Le","Me","kg","lg","mg","pg","qg","Oe","Pe","Qe","Re","rg","Se","Te","Ue","Ve","sg","tg","j","ug","vg","wg","xg","We","yg","zg","memory","Ne","InitRGBRescaler","InitYUVRescaler","Xe","ed","Ye","Ag","Bg","Ze","$e","af","bf","cf","ng","AllocateAndInitRescaler","og","Cg","this","value","df","ef","WEBP_CSP_MODE","VP8StatusCode","rotate","WebPGetFeatures","ff","WebPDecoderConfig","input","options","WebPInitDecoderConfig","Math","pow","Eg","Fg","Gg","id","Hg","Ig","Kg","WebPFreeDecBuffer","WebPGetDecoderVersion","abs","WebPDecode","ctx","self","tasks","finishTask","processTasks","task","shift","type","fileName","bytes","payload","convertedBytes","decoder","config","buffer","output","bitstream","status","rgbaData","channels","depth","webp2png","err","console","error","postMessage","addEventListener","event","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","x","__webpack_exports__","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","key","splice","definition","defineProperty","enumerable","get","chunkId","Promise","all","reduce","promises","miniCssF","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","oldGetScript","oldLoadScript","queryMap","countMap","catch","retries","realSrc","message","request","resolve","setTimeout","cacheBust","Date","now","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","bind","moreModules","runtime","pop","map","then"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"61.b4b665c9d61c26575ebe.chunk.js","mappings":"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,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClC,IAAK,IAAK,KAEZ,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IACnB,IAAK,IAAK,IAAK,IAAK,IAAK,KAE3B,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAIzC,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACvC,IAAK,MAGT,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IACxB,IAAK,IAAK,IAAK,IAAK,KAEtB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAErC,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,QAIzD8L,KAAKuB,sBAAwBvB,KAAKhN,GAAK,WACrC,OAAO,GACT,EACA,IAAIlB,GAAK,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GACtD2C,GAAK,CACP,CAAC,IAAK,IAAK,IAAK,GAChB,CAAC,IAAK,IAAK,IAAK,IAAK,GACrB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,GAC1B,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAEtDC,GAAK,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7B,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,IAExB4D,GAAKzR,EAAG,CAACoN,GAAIX,IAAK,IACtB3M,EAAE,EAx1HM,GAy1HR,IAAIiG,GAAK,CACP,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,IAER+H,GAAK,UACL4D,GAAK,GACLtL,IAAK,IACLqH,GAAK,IACL8G,GAAK,CAACpN,GAAI,SAAU/G,GACtB,OAAOA,CACT,EAAG,SAAUA,EAAGK,EAAGC,GACjB,OAAOD,EAAEC,EAAI,EACf,EAAG,SAAUN,EAAGK,EAAGC,GACjB,OAAOD,EAAEC,EAAI,EACf,EAAG,SAAUN,EAAGK,EAAGC,GACjB,OAAOD,EAAEC,EAAI,EACf,EAAG,SAAUN,EAAGK,EAAGC,GACjB,OAAOiE,GAAGA,GAAGvE,EAAGK,EAAEC,EAAI,IAAKD,EAAEC,EAAI,GACnC,EAAG,SAAUN,EAAGK,EAAGC,GACjB,OAAOiE,GAAGvE,EAAGK,EAAEC,EAAI,GACrB,EAAG,SAAUN,EAAGK,EAAGC,GACjB,OAAOiE,GAAGvE,EAAGK,EAAEC,EAAI,GACrB,EAAG,SAAUN,EACXK,EAAGC,GACH,OAAOiE,GAAGlE,EAAEC,EAAI,GAAID,EAAEC,EAAI,GAC5B,EAAG,SAAUN,EAAGK,EAAGC,GACjB,OAAOiE,GAAGlE,EAAEC,EAAI,GAAID,EAAEC,EAAI,GAC5B,EAAG,SAAUN,EAAGK,EAAGC,GACjB,OAAOiE,GAAGA,GAAGvE,EAAGK,EAAEC,EAAI,IAAKiE,GAAGlE,EAAEC,EAAI,GAAID,EAAEC,EAAI,IAChD,EAAG,SAAUN,EAAGK,EAAGC,GACjB,OAAOsZ,KAAKW,KAAKva,GAAK,GAAK,MAAQK,EAAEC,EAAI,IAAM,GAAK,MAAQsZ,KAAKW,KAAKla,EAAEC,EAAI,IAAM,GAAK,MAAQD,EAAEC,EAAI,IAAM,GAAK,OAASsZ,KAAKW,KAAKva,GAAK,GAAK,MAAQK,EAAEC,EAAI,IAAM,GAAK,MAAQsZ,KAAKW,KAAKla,EAAEC,EAAI,IAAM,GAAK,MAAQD,EAAEC,EAAI,IAAM,GAAK,QAAUsZ,KAAKW,KAAKva,GAAK,EAAI,MAAQK,EAAEC,EAAI,IAAM,EAAI,MAAQsZ,KAAKW,KAAKla,EAAEC,EAAI,IAAM,EAAI,MAAQD,EAAEC,EAAI,IAAM,EAAI,QAAUsZ,KAAKW,KAAS,IAAJva,IAAuB,IAAXK,EAAEC,EAAI,KAAasZ,KAAKW,KAAgB,IAAXla,EAAEC,EAAI,KAAwB,IAAXD,EAAEC,EAAI,OAAe,EAAID,EAAEC,EAAI,GAAKN,CACvc,EAAG,SAAUA,EAAGK,EAAGC,GACjB,OAAQyR,IAAI/R,GACL,GAAK,MAAQK,EAAEC,EAAI,IAAM,GAAK,MAAQD,EAAEC,EAAI,IAAM,GAAK,OAAS,GAAKyR,IAAI/R,GAAK,GAAK,MAAQK,EAAEC,EAAI,IAAM,GAAK,MAAQD,EAAEC,EAAI,IAAM,GAAK,OAAS,GAAKyR,IAAI/R,GAAK,EAAI,MAAQK,EAAEC,EAAI,IAAM,EAAI,MAAQD,EAAEC,EAAI,IAAM,EAAI,OAAS,EAAIyR,IAAQ,IAAJ/R,IAAuB,IAAXK,EAAEC,EAAI,KAAwB,IAAXD,EAAEC,EAAI,QAAgB,CAC/R,EAAG,SAAUN,EAAGK,EAAGC,GACjB,MAAME,EAAIH,EAAEC,EAAI,GAEhB,OAAQkM,IADRxM,EAAIuE,GAAGvE,EAAGK,EAAEC,EAAI,MACA,GAAK,IAAKE,GAAK,GAAK,MAAQ,GAAKgM,GAAGxM,GAAK,GAAK,IAAKQ,GAAK,GAAK,MAAQ,GAAKgM,GAAGxM,GAAK,EAAI,IAAKQ,GAAK,EAAI,MAAQ,EAAIgM,GAAGxM,GAAK,EAAI,IAAKQ,GAAK,EAAI,QAAU,CACtK,EAAGuG,GAAIA,IACHsN,GAAK,CACPnO,GA/4HM,EAg5HN2M,GAh5HM,EAi5HN7F,GAj5HM,GAm5HJnB,GAAK,GACLuK,GAAK,GACLC,GAAK,GACLE,GAAK,CAAC,EAAG,EAAG,GACZD,GAAK,CAAC,EAAG,EAAG,IACZvB,GAAK,EACLC,GAAK,EACLC,GAAK,EACLC,GAAK,EACLG,GAAK,EACLU,GAAK,CAACjQ,GAAKgP,GAAIhP,GAAIA,GAAIA,GAAI,IAC3BkQ,GAAK,GACLC,GAAK,CAAC,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAClC,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,IAE9BX,GAAK,IACLC,GAAK,CAAC,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,EAAG,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,KACrfnP,GAAK,GAAKkL,GAAK,EACfzD,GAAKnO,EAAE,IAAK,GACZiS,GAAKjS,EAAE,IAAK,GACZgS,GAAKhS,EAAE,IAx6HH,GAy6HJsO,GAAKtO,EAAE,IAz6HH,GA06HJ4K,GAAK5K,EAAE2N,GAAKrH,GAz6HR,GA06HJuG,GAAK7M,EAAE2N,GACLrH,GA36HE,GA46HJiS,GAAK,EACL/S,GAAI0Q,MAAM1P,IACVqR,GAAK,CAAC,SAAUvX,EAAGK,EAAGC,EAAGE,EAAGC,EAAG0C,EAAGhB,EAAGC,EAAGC,EAAGC,EAAGY,EAAG0C,EAAGxC,GACtDkI,GAAGtL,EAAGK,EAAGC,EAAGE,EAAGC,EAAG0C,EAAGhB,EAAGC,EAAGC,EAAGC,EAAGY,EAAG0C,EAAGxC,EAAGoP,GAAI,EAChD,EAAGuE,GAAI,SAAU/W,EAAGK,EAAGC,EAAGE,EAAGC,EAAG0C,EAAGhB,EAAGC,EAAGC,EAAGC,EAAGY,EAAG0C,EAAGxC,GACnDkI,GAAGtL,EAAGK,EAAGC,EAAGE,EAAGC,EAAG0C,EAAGhB,EAAGC,EAAGC,EAAGC,EAAGY,EAAG0C,EAAGxC,EAAG8L,GAAI,EAChD,EAAG8H,GAAIC,GAAIC,GAAI,SAAUlX,EAAGK,EAAGC,EAAGE,EAAGC,EAAG0C,EAAGhB,EAAGC,EAAGC,EAAGC,EAAGY,EAAG0C,EAAGxC,GAC3DkI,GAAGtL,EAAGK,EAAGC,EAAGE,EAAGC,EAAG0C,EAAGhB,EAAGC,EAAGC,EAAGC,EAAGY,EAAG0C,EAAGxC,EAAG2P,GAAI,EAChD,EAAGgE,GAAIC,GAAIC,GAAIC,IACf6B,KAAK/O,GAAK,SAAUhK,EAAGK,EAAGC,EAAGE,GAC3B,OAAOsN,GAAG7H,GAAIjG,EAAGK,EAAGC,EAAGE,EACzB,EACAuY,KAAK9O,GAAK,SAAUjK,EAAGK,EAAGC,EAAGE,GAC3B,OAAOsN,GAAGU,GAAIxO,EAAGK,EAAGC,EAAGE,EACzB,EACAuY,KAAK7O,GAAK,SAAUlK,EAAGK,EAAGC,EAAGE,GAC3B,OAAOsN,GAAG3B,GAAInM,EAAGK,EAAGC,EAAGE,EACzB,EACAuY,KAAKrQ,GAAK,SAAU1I,EAAGK,EAAGC,EAAGE,GAC3B,OAAOsN,GAAG9B,GAAIhM,EAAGK,EAAGC,EAAGE,EACzB,EACAuY,KAAK1P,GAAK,SAAUrJ,EAAGK,EAAGC,EAAGE,GAC3B,OAAOsN,GAAGjB,GACR7M,EAAGK,EAAGC,EAAGE,EACb,EACAuY,KAAKnP,GAAK,SAAU5J,EAAGK,EAAGC,EAAGE,GAC3B,OAAOsN,GAAGnM,GAAI3B,EAAGK,EAAGC,EAAGE,EACzB,EACAuY,KAAKyB,WAAazB,KAAKtQ,GAAK,SAAUzI,EAAGK,EAAGC,GAC1C,MAAME,EAAIvC,EAAEgb,IACZ,IAAIxY,EAAI,gBACR,OAAIH,GAAKtC,EAAUwH,IACnB/E,EAAIsK,GAAG/K,EAAG,CAAC,GAAI,CAACK,GAAIC,EAAEmZ,OAClBhZ,GAAKW,GAAUX,GAAKC,GAAI6J,GAAI9J,GAChCD,EAAE6W,EAAI/W,EAAE+W,EACR7W,EAAEyF,GAAK3F,EAAE2F,GACEyS,GAAG1Y,EAAG,EAAG,CAACK,GAAIG,IAC3B,CACF,E,cCx+HA,MAAMia,EAAMC,KACNC,EAA2B,GAGjC,SAASC,IAEPC,GACF,CAEA,SAASA,IAGP,MAAMC,EAAOH,EAAMI,QACnB,GAAID,EAIJ,OAAOA,EAAKE,MACV,IAAK,cAAe,CAClB,MAAM,SAACC,EAAQ,MAAEC,GAASJ,EAAKK,QAE/B,IAAIC,EACJ,IACEA,ECvBD,SAAkBhR,GACvB,MAAMiR,EAAU,IAAItb,EACdub,EAAcD,EAAQ7B,kBACtB+B,EAASD,EAAOjE,GAAKiE,EAAOE,OAC5BC,EAAYH,EAAO7B,MAQzB,IAAIiC,EANJL,EAAQ1B,sBAAsB2B,GAC9BD,EAAQ/B,gBAAgBlP,EAAMA,EAAKxL,OAAQ6c,GAG3CF,EAAOvV,EAAI,EAGX,IACE0V,EAASL,EAAQb,WAAWpQ,EAAMA,EAAKxL,OAAQ0c,E,CAC/C,MAAM7a,GACNib,EAASjb,C,CAGX,GAAc,IAAXib,EAAc,CACf,MAAMC,EAAWJ,EAAOnV,GASxB,MAAO,CAACsV,SAAQR,OARA,QAAO,CACrB9Q,KAAMuR,EACNlX,MAAO8W,EAAO9W,MACdC,OAAQ6W,EAAO7W,OACfkX,SAAU,EACVC,MAAO,I,CAMX,MAAO,CAACH,SAAQR,MAAO9Q,EACzB,CDVyB0R,CAASZ,GAAOA,K,CACjC,MAAMa,GACNC,QAAQC,MAAM,0BAA2BF,EAAK,WAAYjB,EAAKK,Q,CAGjEV,EAAIyB,YAAY,CACdlB,KAAM,cACNG,QAAS,CACPF,WACAC,MAAOE,KAIXR,IAEA,K,CAGF,QACEA,IAEN,CAaAH,EAAI0B,iBAAiB,WAAYC,IAXjC,IAAsBtB,IAYPsB,EAAMhS,KAXnBuQ,EAAM9b,KAAKic,GAOXD,GAIwB,G,GElEtBwB,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaE,QAGrB,IAAIC,EAASN,EAAyBE,GAAY,CAGjDG,QAAS,CAAC,GAOX,OAHAE,EAAoBL,GAAUM,KAAKF,EAAOD,QAASC,EAAQA,EAAOD,QAASJ,GAGpEK,EAAOD,OACf,CAGAJ,EAAoBpZ,EAAI0Z,EAGxBN,EAAoBQ,EAAI,KAGvB,IAAIC,EAAsBT,EAAoB3L,OAAE8L,EAAW,CAAC,IAAI,IAAI,MAAM,IAAOH,EAAoB,QAErG,OADsBA,EAAoB3L,EAAEoM,EAClB,ELjCvBlf,EAAW,GACfye,EAAoB3L,EAAI,CAACqM,EAAQC,EAAUC,EAAIC,KAC9C,IAAGF,EAAH,CAMA,IAAIG,EAAeC,IACnB,IAAStf,EAAI,EAAGA,EAAIF,EAASe,OAAQb,IAAK,CAGzC,IAFA,IAAKkf,EAAUC,EAAIC,GAAYtf,EAASE,GACpCuf,GAAY,EACPjG,EAAI,EAAGA,EAAI4F,EAASre,OAAQyY,MACpB,EAAX8F,GAAsBC,GAAgBD,IAAaI,OAAOC,KAAKlB,EAAoB3L,GAAG8M,OAAOC,GAASpB,EAAoB3L,EAAE+M,GAAKT,EAAS5F,MAC9I4F,EAASU,OAAOtG,IAAK,IAErBiG,GAAY,EACTH,EAAWC,IAAcA,EAAeD,IAG7C,GAAGG,EAAW,CACbzf,EAAS8f,OAAO5f,IAAK,GACrB,IAAIsF,EAAI6Z,SACET,IAANpZ,IAAiB2Z,EAAS3Z,EAC/B,CACD,CACA,OAAO2Z,CAnBP,CAJCG,EAAWA,GAAY,EACvB,IAAI,IAAIpf,EAAIF,EAASe,OAAQb,EAAI,GAAKF,EAASE,EAAI,GAAG,GAAKof,EAAUpf,IAAKF,EAASE,GAAKF,EAASE,EAAI,GACrGF,EAASE,GAAK,CAACkf,EAAUC,EAAIC,EAqBjB,EMzBdb,EAAoB9b,EAAI,CAACkc,EAASkB,KACjC,IAAI,IAAIF,KAAOE,EACXtB,EAAoB3X,EAAEiZ,EAAYF,KAASpB,EAAoB3X,EAAE+X,EAASgB,IAC5EH,OAAOM,eAAenB,EAASgB,EAAK,CAAEI,YAAY,EAAMC,IAAKH,EAAWF,IAE1E,ECNDpB,EAAoBnZ,EAAI,CAAC,EAGzBmZ,EAAoB7b,EAAKud,GACjBC,QAAQC,IAAIX,OAAOC,KAAKlB,EAAoBnZ,GAAGgb,QAAO,CAACC,EAAUV,KACvEpB,EAAoBnZ,EAAEua,GAAKM,EAASI,GAC7BA,IACL,KCNJ9B,EAAoBhZ,EAAK0a,IAEZ,CAAC,IAAM,eAAe,IAAM,WAAW,IAAM,gBAAgBA,GAAW,IAAM,CAAC,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,wBAAwBA,GAAW,aCF/L1B,EAAoB+B,SAAYL,IAEf,ECHjB1B,EAAoBnb,EAAI,WACvB,GAA0B,iBAAfmd,WAAyB,OAAOA,WAC3C,IACC,OAAOvF,MAAQ,IAAIwF,SAAS,cAAb,EAGhB,CAFE,MAAO9d,GACR,GAAsB,iBAAX+d,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBlC,EAAoB3X,EAAI,CAAC8Z,EAAKC,IAAUnB,OAAOoB,UAAUC,eAAe/B,KAAK4B,EAAKC,G,MCAlF,IAAIG,EACAvC,EAAoBnb,EAAE2d,gBAAeD,EAAYvC,EAAoBnb,EAAE4d,SAAW,IACtF,IAAIC,EAAW1C,EAAoBnb,EAAE6d,SACrC,IAAKH,GAAaG,IACbA,EAASC,gBACZJ,EAAYG,EAASC,cAAcC,MAC/BL,GAAW,CACf,IAAIM,EAAUH,EAASI,qBAAqB,UACzCD,EAAQvgB,SAAQigB,EAAYM,EAAQA,EAAQvgB,OAAS,GAAGsgB,IAC5D,CAID,IAAKL,EAAW,MAAM,IAAI/e,MAAM,yDAChC+e,EAAYA,EAAUQ,QAAQ,OAAQ,IAAIA,QAAQ,QAAS,IAAIA,QAAQ,YAAa,KACpF/C,EAAoBte,EAAI6gB,C,KCfxB,MACE,QAAmC,IAAxBvC,EAAqC,CAC9C,IAAIgD,EAAehD,EAAoBhZ,EACnCic,EAAgBjD,EAAoB7b,EACpC+e,EAAW,CAAC,EACZC,EAAW,CAAC,EAIhBnD,EAAoBhZ,EAAI,SAAU0a,GAEhC,OADasB,EAAatB,IAGvBwB,EAASZ,eAAeZ,GAAW,IAAMwB,EAASxB,GAAW,GAElE,EACA1B,EAAoB7b,EAAI,SAAUud,GAEhC,OADauB,EAAcvB,GACb0B,OAAM,SAAUzD,GAC5B,IAAI0D,EAAUF,EAASb,eAAeZ,GAClCyB,EAASzB,GACT,OACJ,GAAI2B,EAAU,EAAG,CACf,IAAIC,EAAUN,EAAatB,GAQ3B,MAPA/B,EAAM4D,QACJ,iBACA7B,EACA,mCACA4B,EACA,IACF3D,EAAM6D,QAAUF,EACV3D,CACR,CACA,OAAO,IAAIgC,SAAQ,SAAU8B,GAE3BC,YAAW,WACT,IACIC,EACKC,KAAKC,MAGdX,EAASxB,GAAWiC,EACpBR,EAASzB,GAAW2B,EAAU,EAC9BI,EAAQzD,EAAoB7b,EAAEud,GAChC,GArCG,IAsCL,GACF,GACF,CACF,CACD,EAjDD,G,MCIA,IAAIoC,EAAkB,CACrB,GAAI,GAgBL9D,EAAoBnZ,EAAEpF,EAAI,CAACigB,EAASI,KAE/BgC,EAAgBpC,IAElBc,cAAcxC,EAAoBte,EAAIse,EAAoBhZ,EAAE0a,GAE9D,EAGD,IAAIqC,EAAqBtH,KAAuB,iBAAIA,KAAuB,kBAAK,GAC5EuH,EAA6BD,EAAmBxhB,KAAK0hB,KAAKF,GAC9DA,EAAmBxhB,KAvBCuL,IACnB,IAAK6S,EAAUuD,EAAaC,GAAWrW,EACvC,IAAI,IAAImS,KAAYiE,EAChBlE,EAAoB3X,EAAE6b,EAAajE,KACrCD,EAAoBpZ,EAAEqZ,GAAYiE,EAAYjE,IAIhD,IADGkE,GAASA,EAAQnE,GACdW,EAASre,QACdwhB,EAAgBnD,EAASyD,OAAS,EACnCJ,EAA2BlW,EAAK,C,KbnB7BtM,EAAOwe,EAAoBQ,EAC/BR,EAAoBQ,EAAI,IAChBmB,QAAQC,IAAI,CAAC,IAAI,IAAI,KAAKyC,IAAIrE,EAAoB7b,EAAG6b,IAAsBsE,KAAK9iB,GcD9Dwe,EAAoBQ,G","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/vendor/libwebp-0.2.0.js","webpack://tweb/./src/lib/webp/webp.worker.ts","webpack://tweb/./src/lib/webp/webp.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,866,158].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","// Copyright 2011 Google Inc.\n//\n// This code is licensed under the same terms as WebM:\n// Software License Agreement: http://www.webmproject.org/license/software/\n// Additional IP Rights Grant: http://www.webmproject.org/license/additional/\n// -----------------------------------------------------------------------------\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// -----------------------------------------------------------------------------\n//\n// Copyright 2011-2013 Dominik Homberger\n// Libwebp Javascript / libwebpjs - the libwebp implementation in javascript (v0.2.0)\n//\n// Author: Dominik Homberger (dominik.homberger@gmail.com)\n\nlet i;\nlet a;\nlet self;\nconst ca = 0;\nconst p = null;\nconst s = 0;\nconst x = 0;\nconst la = s;\nconst E = s;\nconst bb = 0;\nconst Mb = 0;\n\nfunction M(F) {\n return JSON.parse(JSON.stringify(F));\n}\n\nfunction N(F, G, w, D, S) {\n for (i = 0; i < S; ++i) F[G + i] = w[D + i];\n}\n\nfunction Nb(F) {\n const G = [];\n const w = F.length;\n let D;\n for (D = 0; D < w; ++D) G.push(F[D]);\n return G;\n}\n\nfunction ic(F, G) {\n const w = [];\n w.push(M(F));\n let D;\n for (D = 0; D < G; ++D) w.push(M(F));\n w.push(0);\n return w;\n}\n\nfunction rc(F, G) {\n const w = [];\n let D;\n for (D = 0; D < G; ++D) w.push(F);\n w.push(0);\n return w;\n}\n\nfunction memmove(arr1, index1, arr2, index2, length) {\n let i;\n for (i = 0; i < length; i++) {\n arr1[index1 + i] = arr2[index2 + i];\n }\n}\n\nfunction jd(F, G, w, D) {\n let S;\n for (S = 0; S < D; ++S) F[G + S] = w;\n}\n\nfunction kd(F, G, w, D) {\n let S = '';\n let ga;\n for (ga = 0; ga < D; ++ga) S += String.fromCharCode(F[G + ga]);\n return w == S ? 0 : 1;\n}\n\nfunction U(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(G);\n return D;\n}\n\nfunction ld(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(M(G));\n return D;\n}\n\nfunction md(F, G) {\n let w;\n for (w = F.length - 1; w >= 0; --w) G = M(U(F[w], G));\n return G;\n}\n\nfunction $(F) {\n if (!F) throw Error('assert :P');\n}\nexport const WebPDecoder = function () {\n function F(a) {\n return a == Ob || a == Pb || a == Bb || a == Qb;\n }\n\n function G(a) {\n return S(a, 1);\n }\n\n function w(a, b) {\n const c = 1 + ((a.la - 1) * b >> 8);\n const d = c << 8;\n let e = s;\n a.Z >= d ? (e = 1, a.la -= c, a.Z -= d) : (e = 0, a.la = c);\n for (; a.la < 128;) a.Z <<= 1, a.la <<= 1, ++a.gc == 8 && (a.gc = 0, a.bc && (a.Z += a.qa[a.Ia++], a.bc--));\n return e;\n }\n\n function D(a, b, c, d) {\n d -= c;\n d >= 2 ? (a.Z = b[c + 0] << 8 | b[c + 1], a.qa = b, a.Ia = c + 2, a.bc = d - 2) : (a.Z = 0, a.qa = p, a.bc = 0);\n a.la = 255;\n a.gc = 0;\n }\n\n function S(a, b) {\n for (var c = 0, d = s, d = b - 1; d >= 0; d--) c |= w(a, 128) << d;\n return c;\n }\n\n function ga(a, b) {\n const c = S(a, b);\n return G(a) ? -c : c;\n }\n\n function Rb(a, b, c, d) {\n let e = Mb;\n $(a != p);\n $(b != p);\n $(d < 4294967288);\n a.qa = b;\n a.Ia = c;\n a.ya = d;\n a.T = 0;\n a.Q = 0;\n a.g = 0;\n a.L = 0;\n for (e = a.fa = 0; e < 4 && e < a.ya; ++e) a.T |= a.qa[a.Ia + a.Q] << 8 * e, ++a.Q;\n }\n\n function Sb(a) {\n for (; a.g >= 8 && a.Q < a.ya;) a.T >>>= 8, a.T += a.qa[a.Ia + a.Q] << 24 >>> 0, ++a.Q, a.g -= 8;\n }\n\n function Da(a) {\n a.g >= 8 && Sb(a);\n a.Q == a.ya && a.g == 32 && (a.L = 1);\n }\n\n function T(a, b) {\n let c = 0;\n $(b >= 0);\n if (!a.L && b < gf) {\n if (a.Q == a.ya && a.g + b >= 32 && (a.L = 1, a.g + b > 32)) return c;\n c = a.T >> a.g & hf[b];\n a.g += b;\n a.g >= 8 && a.g >= 8 && Sb(a);\n } else a.fa = 1;\n return c;\n }\n\n function ma(a) {\n return a.Pa == a.gb;\n }\n\n function nd(a, b) {\n $(a != p);\n if (b == 0) return 0;\n a.gb = 2 * b - 1;\n a.Y = ld(a.gb, jf);\n if (a.Y == p) return 0;\n a.Y[0].s = -1;\n return a.Pa = 1;\n }\n\n function ja(a) {\n a != p && (a.Y = p, a.Y = p, a.gb = 0, a.Pa = 0);\n }\n\n function jc(a, b, c, d) {\n for (var e = a.Y, g = 0, k = +a.gb; d-- > 0;) {\n if (g >= k) return 0;\n if (e[g].s < 0) {\n if (ma(a)) return 0;\n const h = a;\n const n = h.Y;\n const l = +h.Pa;\n e[g].s = l - g;\n h.Pa += 2;\n n[l + 0].s = -1;\n n[l + 1].s = -1;\n } else if (e[g].s == 0) return 0;\n g += e[g].s + (c >> d & 1);\n }\n if (e[g].s < 0) e[g].s = 0;\n else if (e[g].s != 0) return 0;\n e[g].kc = b;\n return 1;\n }\n\n function od(a, b, c) {\n var d = s;\n let e = 0;\n let g = 0;\n $(a != p);\n $(b != p);\n for (d = 0; d < c; ++d) b[d] > 0 && (++e, g = d);\n if (!nd(a, e)) return 0;\n if (e == 1) return g < 0 || g >= c ? (ja(a), 0) : jc(a, g, 0, 0);\n e = 0;\n g = U(c, s);\n if (g == p) return (e = e && ma(a)) || ja(a), e;\n var k = s;\n var k = s;\n var d = U(Tb + 1, 0);\n let h = s;\n const n = U(Tb + 1, 0);\n let l = 0;\n $(b != p);\n $(c > 0);\n $(g != p);\n for (k = 0; k < c; ++k) b[k] > l && (l = b[k]);\n if (l > Tb) d = 0;\n else {\n for (k = 0; k < c; ++k) ++d[b[k]];\n h = d[0] = 0;\n n[0] = -1;\n for (k = 1; k <= l; ++k) h = h + d[k - 1] << 1, n[k] = h;\n for (k = 0; k < c; ++k) g[k] = b[k] > 0 ? n[b[k]]++ : pd;\n d = 1;\n }\n if (!d) return (e = e && ma(a)) || ja(a), e;\n for (d = 0; d < c; ++d) {\n if (b[d] > 0 && !jc(a, d, g[d], b[d])) {\n return (e = e && ma(a)) || ja(a), e;\n }\n }\n (e = ma(a)) || ja(a);\n return e;\n }\n\n function Ea(a, b, c, d, e, g, k) {\n for (var h = s, h = 0; h < k; ++h) e[g + h] = a[b + h] + c[d + h] & 255;\n }\n\n function qd(a, b, c) {\n const d = a.P.l;\n if (!(c = b < 0 || c < 0 || b + c > a.P.v)) {\n if (c = b == 0) {\n a: {\n let e = a.Ga;\n var g = a.G;\n var k = a.ub;\n c = a.P.l;\n let h = a.P.v;\n const n = a.Xb;\n var l = [p];\n let m = p;\n let f = h * c;\n var q = p;\n var r = p;\n var r = 'WEBP_FILTER_TYPE';\n let u = s;\n var l = s;\n var v = 0;\n let C = s;\n $(c > 0 && h > 0 && d >= c);\n $(e != p && n != p);\n if (k <= Ub) c = 0;\n else if (C = e[g + 0] >> 0 & 3, r = e[g + 0] >> 2 & 3, u = e[g + 0] >> 4 & 3, l = e[g + 0] >> 6 & 3, C < kc || C > kf || r >= lf || u > rd || l != 0) c = 0;\n else {\n if (C == kc) v = k >= f, l = e, m = g + Ub;\n else {\n l = U(f, 0);\n m = 0;\n if (l\n == p) {\n c = 0;\n break a;\n }\n var v = g + Ub;\n var k = k - Ub;\n var g = l;\n var q = M(Vb);\n let A = 0;\n const z = sd();\n z == p ? v = 0 : (z.l = c, z.v = h, z.N = q, td(na), q.put = ud, q.Mb = vd, q.Pb = wd, q.ka = p, q.ka = g, q.fd = 0, q.width = c, q.height = h, z.a = L, Rb(z.o, e, v, k), z.Wa = Cb, Ka(c, h, 1, z, p) && xd(z, c) && (z.Wa = Db, A = lc(z, z.V, z.Ha, z.l, z.v, mf)), z != p && sa(z), v = A);\n }\n if (v) {\n e = nf[r];\n e != p ? (q = U(f, 0), r = 0, q == p && (v = 0, C != kc && (m = l = p)), e(l, m, c, h, 1, c, q, r), f = q, C = r) : (f = l, C = m);\n for (e = 0; h-- > 0;) N(n, e, f, C, c), C += c, e += d;\n u == rd && (v = l == p || m <= 0 || c <= 0 ? 0 : 1);\n }\n c = v;\n }\n }\n c = !c;\n }\n }\n return c ? p : b == 0 ? a.Xb : +b * d;\n }\n\n function of(a) {\n let b = a.width;\n const c = a.height;\n let d = a.J;\n if (b <= 0 || c <= 0 || !(d >= Qa && d < Cc)) return ta;\n if (!a.Fc && a.Jb == p) {\n var e = p;\n var g = 0;\n var k = 0;\n var h = 0;\n var n = 0;\n var e = bb;\n var l = b * yd[d];\n var m = l * c;\n d < ua || (g = parseInt((b + 1) / 2, 10), h = g * parseInt((c + 1) / 2, 10), d == Ra && (k = b, n = k * c));\n e = m + 2 * h + n;\n if (e != e) return ta;\n e = U(e, 205);\n if (e == p) return cb;\n a.Jb = e;\n a.jc = p;\n d < ua ? (b = a.c.RGBA, b.ma = e, b.Sa = p, b.f = l, b.size = m) : (b = a.c.Va, b.y = e, b.D = p, b.F = l, b.Wc = m, b.c = e, b.B = p + m, b.nb = g, b.Rc = h, b.S = e, b.C = p + m + h, b.rb = g, b.Uc = h, d == Ra && (b.p = e, b.q = p + m + 2 * h), b.Wb = n, b.Fa = k);\n }\n d = 1;\n g = a.J;\n k = a.width;\n h = a.height;\n g >= Qa && g < Cc ? g < ua ? (a = a.c.RGBA, d\n &= a.f * h <= a.size, d &= a.f >= k * yd[g], d &= a.ma != p) : (a = a.c.Va, n = a.nb * parseInt((h + 1) / 2, 10), l = a.rb * parseInt((h + 1) / 2, 10), m = a.Fa * h, d &= a.F * h <= a.Wc, d &= n <= a.Rc, d &= l <= a.Uc, d &= m <= a.Wb, d &= a.F >= k, d &= a.nb >= parseInt((k + 1) / 2, 10), d &= a.rb >= parseInt((k + 1) / 2, 10), d &= a.y != p, d &= a.c != p, d &= a.S != p, g == Ra && (d &= a.Fa >= k, d &= m <= a.Wb, d &= a.p != p)) : d = 0;\n return d ? L : ta;\n }\n\n function zd(a, b, c, d) {\n if (d == p || a <= 0 || b <= 0) return ta;\n if (c != p) {\n if (c.Ua) {\n const e = c.wc;\n const g = c.vc;\n const k = c.t & -2;\n const h = c.k & -2;\n if (k < 0 || h < 0 || e <= 0 || g <= 0 || k + e > a || h + g > b) return ta;\n a = e;\n b = g;\n }\n if (c.I) {\n if (c.Ba <= 0\n || c.Aa <= 0) return ta;\n a = c.Ba;\n b = c.Aa;\n }\n }\n d.width = a;\n d.height = b;\n return of(d);\n }\n\n function mb(a) {\n return !(a & -256) ? a : a < 0 ? 0 : 255;\n }\n\n function Ad(a, b, c, d) {\n const e = U(16, 0);\n let g;\n g = 0;\n let k;\n for (k = 0; k < 4; ++k) {\n var h = a[b + 0] + a[b + 8];\n var n = a[b + 0] - a[b + 8];\n var l = (a[b + 4] * Wb >> 16) - (a[b + 12] * Xb >> 16);\n var m = (a[b + 4] * Xb >> 16) + (a[b + 12] * Wb >> 16);\n e[g + 0] = h + m;\n e[g + 1] = n + l;\n e[g + 2] = n - l;\n e[g + 3] = h - m;\n g += 4;\n b++;\n }\n for (k = g = 0; k < 4; ++k) {\n a = e[g + 0] + 4, h = a + e[g + 8], n = a - e[g + 8], l = (e[g + 4] * Wb >> 16) - (e[g + 12] * Xb >> 16), m = (e[g + 4] * Xb >> 16) + (e[g + 12] * Wb >> 16), c[d + 0 + 0 * f] = mb(c[d + 0 + 0 * f] + (h + m >> 3)), c[d + 1 + 0 * f] = mb(c[d\n + 1 + 0 * f] + (n + l >> 3)), c[d + 2 + 0 * f] = mb(c[d + 2 + 0 * f] + (n - l >> 3)), c[d + 3 + 0 * f] = mb(c[d + 3 + 0 * f] + (h - m >> 3)), g++, d += f;\n }\n }\n\n function pf(a, b, c, d, e) {\n Ad(a, b, c, d);\n e && Ad(a, b + 16, c, d + 4);\n }\n\n function qf(a, b, c, d) {\n mc(a, b + 0, c, d + 0, 1);\n mc(a, b + 32, c, d + 4 * f, 1);\n }\n\n function nc(a, b, c, d) {\n a = a[b + 0] + 4;\n let e;\n for (e = 0; e < 4; ++e) for (b = 0; b < 4; ++b) c[d + b + e * f] = mb(c[d + b + e * f] + (a >> 3));\n }\n\n function rf(a, b, c, d) {\n a[b + 0] && nc(a, b + 0, c, d + 0);\n a[b + 16] && nc(a, b + 16, c, d + 4);\n a[b + 32] && nc(a, b + 32, c, d + 4 * f);\n a[b + 48] && nc(a, b + 48, c, d + 4 * f + 4);\n }\n\n function Dc(a, b, c) {\n const d = b - f;\n const e = oa;\n const g = 255 - a[d - 1];\n let k;\n for (k = 0; k\n < c; ++k) {\n const h = e;\n const n = g + a[b - 1];\n var l;\n for (l = 0; l < c; ++l) a[b + l] = h[n + a[d + l]];\n b += f;\n }\n }\n\n function Yb(a, b, c) {\n let d;\n for (d = 0; d < 16; ++d) for (i = 0; i < 16; ++i) b[c + d * f + i] = a;\n }\n\n function y(a, b, c) {\n return a + 2 * b + c + 2 >> 2;\n }\n\n function Zb(a, b, c) {\n let d; let\n e;\n for (d = 0; d < 8; ++d) for (e = 0; e < 8; ++e) b[c + e + d * f] = a;\n }\n\n function nb(a, b, c) {\n const d = a[b - c];\n const e = a[b + 0];\n const g = 3 * (e - d) + sc[1020 + a[b - 2 * c] - a[b + c]];\n const k = oc[112 + (g + 4 >> 3)];\n a[b - c] = oa[255 + d + oc[112 + (g + 3 >> 3)]];\n a[b + 0] = oa[255 + e - k];\n }\n\n function Bd(a, b, c, d) {\n const e = a[b + 0];\n const g = a[b + c];\n return va[255 + a[b - 2 * c] - a[b - c]] > d || va[255 + g - e] > d;\n }\n\n function Cd(a,\n b, c, d, e) {\n const g = a[b - 3 * c];\n const k = a[b - 2 * c];\n const h = a[b - c];\n const n = a[b + 0];\n const l = a[b + c];\n const m = a[b + 2 * c];\n const f = a[b + 3 * c];\n return 2 * va[255 + h - n] + tc[255 + k - l] > d ? 0 : va[255 + a[b - 4 * c] - g] <= e && va[255 + g - k] <= e && va[255 + k - h] <= e && va[255 + f - m] <= e && va[255 + m - l] <= e && va[255 + l - n] <= e;\n }\n\n function Dd(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e - c] - a[b + e + 0]] + tc[255 + a[b + e - 2 * c] - a[b + e + c]] <= d && nb(a, b + e, c);\n }\n\n function Ed(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e * c - 1] - a[b + e * c + 0]] + tc[255 + a[b + e * c - 2] - a[b + e * c + 1]] <= d && nb(a, b + e * c, 1);\n }\n\n function sf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) {\n b\n += 4 * c, Dd(a, b + 0, c, d);\n }\n }\n\n function tf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) b += 4, Ed(a, b + 0, c, d);\n }\n\n function Fa(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c, g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - 2 * m];\n const q = n[l - m];\n const r = n[l + 0];\n const u = n[l + m];\n const v = n[l + 2 * m];\n var C = sc[1020 + 3 * (r - q) + sc[1020 + f - u]];\n const A = 27 * C + 63 >> 7;\n const z = 18 * C + 63 >> 7;\n var C = 9 * C + 63 >> 7;\n n[l - 3 * m] = oa[255 + n[l - 3 * m] + C];\n n[l - 2 * m] = oa[255 + f + z];\n n[l - m] = oa[255 + q + A];\n n[l + 0] = oa[255 + r - A];\n n[l + m] = oa[255 + u - z];\n n[l + 2 * m] = oa[255 + v - C];\n }\n }\n b += d;\n }\n }\n\n function Ga(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c,\n g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - m];\n const q = n[l + 0];\n const r = n[l + m];\n var u = 3 * (q - f);\n const v = oc[112 + (u + 4 >> 3)];\n var u = oc[112 + (u + 3 >> 3)];\n const C = v + 1 >> 1;\n n[l - 2 * m] = oa[255 + n[l - 2 * m] + C];\n n[l - m] = oa[255 + f + u];\n n[l + 0] = oa[255 + q - v];\n n[l + m] = oa[255 + r - C];\n }\n }\n b += d;\n }\n }\n\n function uf(a, b, c, d, e, g) {\n Fa(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function vf(a, b, c, d, e, g) {\n Fa(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function wf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4 * c, Ga(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function xf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4, Ga(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function yf(a, b, c, d, e,\n g, k, h) {\n Fa(a, b, e, 1, 8, g, k, h);\n Fa(c, d, e, 1, 8, g, k, h);\n }\n\n function zf(a, b, c, d, e, g, k, h) {\n Fa(a, b, 1, e, 8, g, k, h);\n Fa(c, d, 1, e, 8, g, k, h);\n }\n\n function Af(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4 * e, e, 1, 8, g, k, h);\n Ga(c, d + 4 * e, e, 1, 8, g, k, h);\n }\n\n function Bf(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4, 1, e, 8, g, k, h);\n Ga(c, d + 4, 1, e, 8, g, k, h);\n }\n\n function Fd(a, b) {\n return b == $b ? a.i == 0 ? a.d == 0 ? Cf : Df : a.d == 0 ? Ef : $b : b;\n }\n\n function Ec(a, b, c, d) {\n for (i = 0; i < 4; ++i) a[b + i] = c[d + i];\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function Gd(a) {\n a.a = 'VP8_STATUS_OK';\n a.xc = 'OK';\n }\n\n function td(a) {\n a >>> 8 != na >>> 8 && alert('mismatch error');\n }\n\n function Y(a, b, c) {\n a.a == L && (a.a = b, a.xc = c, a.za = 0);\n // alert(b + \": \" + c);\n return 0;\n }\n\n function Hd(a, b) {\n let c = [0];\n let d = x;\n var e = [Mb];\n var g = M(Id);\n var k = M(Jd);\n let h = M(Fc);\n var e = 'VP8StatusCode';\n var g = M(Gc);\n if (a == p) return alert('(dec == null)'), 0;\n Gd(a);\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'null VP8Io passed to VP8GetHeaders()');\n g.data = b.data;\n g.b = b.b;\n g.e = b.e;\n g.b = [g.b];\n g.e = [g.e];\n g = [g];\n e = Kd(g);\n if (e != L) return Y(a, e, 'Incorrect/incomplete header.');\n g = g[0];\n g.b = g.b[0];\n g.e = g.e[0];\n if (g.ia) return Y(a, W, 'Unexpected lossless format encountered.');\n a.Ga == p && ($(a.ub == 0), a.Ga = g.$, a.G = g.G, a.ub = g.pa);\n d = g.data;\n c = g.b + g.offset;\n e = g.e - g.offset;\n $(g.e >= g.offset);\n if (e[0] < 4) return Y(a, Z, 'Truncated header.');\n h = d[c + 0] | d[c + 1] << 8 | d[c + 2] << 16;\n g = a.Ac;\n g.fb = !(h & 1) + 0;\n g.Jc = h >> 1 & 7;\n g.Nc = h >> 4 & 1;\n g.Ra = h >> 5;\n if (g.Jc > 3) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Incorrect keyframe parameters.');\n if (!g.Nc) return Y(a, 'VP8_STATUS_UNSUPPORTED_FEATURE', 'Frame not displayable.');\n c += 3;\n e -= 3;\n k = a.P;\n if (g.fb) {\n if (e < 7) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'cannot parse picture header');\n if (!(e\n >= 3 && d[c + 0] == 157 && d[c + 1] == 1 && d[c + 2] == 42)) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Bad code word');\n k.l = (d[c + 4] << 8 | d[c + 3]) & 16383;\n k.gd = d[c + 4] >> 6;\n k.v = (d[c + 6] << 8 | d[c + 5]) & 16383;\n k.hd = d[c + 6] >> 6;\n c += 7;\n e -= 7;\n a.Ma = k.l + 15 >> 4;\n a.hb = k.v + 15 >> 4;\n b.width = k.l;\n b.height = k.v;\n b.I = 0;\n b.Ua = 0;\n b.k = 0;\n b.t = 0;\n b.Ka = b.width;\n b.K = b.height;\n b.m = b.width;\n b.h = b.height;\n h = a.R;\n for (i = 0; i < h.Ta.length; ++i) h.Ta[i] = 255;\n h.z = M(Ff);\n h = a.Ca;\n $(h != p);\n h.pb = 0;\n h.ob = 0;\n h.tb = 1;\n for (i = 0; i < h.Kb.length; ++i) h.Kb[i] = 0;\n for (i = 0; i < h.Cb.length; ++i) h.Cb[i] = 0;\n a.Lb = 0;\n }\n if (g.Ra\n > e) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'bad partition length');\n h = a.o;\n D(h, d, c, c + g.Ra);\n c += g.Ra;\n e -= g.Ra;\n g.fb && (k.uc = G(h), k.$c = G(h));\n var k = h;\n var n = a.Ca;\n let l = a.R;\n $(k != p);\n $(n != p);\n n.pb = G(k);\n if (n.pb) {\n n.ob = G(k);\n if (G(k)) {\n var m;\n n.tb = G(k);\n for (m = 0; m < xa; ++m) n.Kb[m] = G(k) ? ga(k, 7) : 0;\n for (m = 0; m < xa; ++m) n.Cb[m] = G(k) ? ga(k, 6) : 0;\n }\n if (n.ob) for (m = 0; m < Ld; ++m) l.Ta[m] = G(k) ? S(k, 8) : 255;\n } else n.ob = 0;\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse segment header');\n k = h;\n n = a.ga;\n n.Oc = G(k);\n n.Fb = S(k, 6);\n n.kb = S(k, 3);\n n.oc = G(k);\n if (n.oc\n && G(k)) {\n for (l = 0; l < Hc; ++l) G(k) && (n.Lc[l] = ga(k, 6));\n for (l = 0; l < Gf; ++l) G(k) && (n.Gc[l] = ga(k, 6));\n }\n a.A = n.Fb == 0 ? 0 : n.Oc ? 1 : 2;\n if (a.A > 0) {\n if (a.Ca.pb) for (l = 0; l < xa; ++l) m = a.Ca.Cb[l], a.Ca.tb || (m += n.Fb), a.Zb[l] = m;\n else a.Zb[0] = n.Fb;\n }\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse filter header');\n var k = d;\n var f = c;\n var n = f;\n var e = f + e;\n m = 0;\n let q = s;\n let r = s;\n a.Hb = 1 << S(a.o, 2);\n q = a.Hb - 1;\n l = k;\n m = f + 3 * q;\n if (e < m) e = 'VP8_STATUS_NOT_ENOUGH_DATA';\n else {\n for (r = 0; r < q; ++r) {\n var f = l;\n var u = m + (k[n + 0] | k[n + 1] << 8 | k[n + 2] << 16);\n u > e && (f = k);\n D(a.ic[+r], l, m, u);\n l = f;\n m = u;\n n += 3;\n }\n D(a.ic[+q], l, m, e);\n e = m < e ? 'VP8_STATUS_OK' : 'VP8_STATUS_SUSPENDED';\n }\n if (e != 'VP8_STATUS_OK') return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse partitions');\n q = a.o;\n e = S(q, 7);\n k = G(q) ? ga(q, 4) : 0;\n n = G(q) ? ga(q, 4) : 0;\n l = G(q) ? ga(q, 4) : 0;\n m = G(q) ? ga(q, 4) : 0;\n q = G(q) ? ga(q, 4) : 0;\n r = a.Ca;\n f = s;\n for (f = 0; f < xa; ++f) {\n u = s;\n if (r.pb) u = r.Kb[f], r.tb || (u += e);\n else if (f > 0) {\n a.yb[f] = a.yb[0];\n continue;\n } else u = e;\n const v = a.yb[f];\n v.sc[0] = Ic[wa(u + k, 127)];\n v.sc[1] = Jc[wa(u + 0, 127)];\n v.sb[0] = 2 * Ic[wa(u + n, 127)];\n v.sb[1] = 101581 * Jc[wa(u + l, 127)] >> 16;\n v.sb[1] < 8\n && (v.sb[1] = 8);\n v.qc[0] = Ic[wa(u + m, 117)];\n v.qc[1] = Jc[wa(u + q, 127)];\n }\n if (g.fb) a.Zc = 259;\n else return Y(a, Hf, 'Not a key frame.');\n G(h);\n e = a.R;\n for (k = 0; k < Md; ++k) for (n = 0; n < Nd; ++n) for (l = 0; l < Kc; ++l) for (m = 0; m < Lc; ++m) w(h, If[k][n][l][m]) && (e.z[k][n][l][m] = S(h, 8));\n a.pc = G(h);\n a.pc && (a.Pc = S(h, 8));\n if (a.P.uc) {\n c -= 8;\n h = Mb;\n if (g.Ra < 8 || d[c + 8 - 1] != 1) return Y(a, W, 'RIFF: Inconsistent extra information.');\n h = d[c + 0] << 0 | d[c + 1] << 8 | d[c + 2] << 16;\n a.fc = h;\n a.dd = p;\n a.cd = d[c + 3];\n }\n return a.za = 1;\n }\n\n function Mc(a, b, c, d, e, g) {\n let k = b[e][c];\n if (!w(a, k[0])) return 0;\n for (;;) {\n ++e;\n if (w(a, k[1])) {\n var h;\n if (w(a, k[2])) {\n if (w(a, k[3])) {\n if (w(a, k[6])) {\n h = x;\n c = w(a, k[8]);\n k = w(a, k[9 + c]);\n k = 2 * c + k;\n c = 0;\n h = Jf[k];\n var n;\n for (n = 0; n < h.length - 1; ++n) c += c + w(a, h[n]);\n c += 3 + (8 << k);\n } else w(a, k[7]) ? (c = 7 + 2 * w(a, 165), c += w(a, 145)) : c = 5 + w(a, 159);\n } else c = w(a, k[4]) ? 3 + w(a, k[5]) : 2;\n k = b[Nc[e]][2];\n } else k = b[Nc[e]][1], c = 1;\n h = Kf[e - 1];\n g[g[g.length - 1] + h] = (w(a, 128) ? -c : c) * d[(h > 0) + 0];\n if (e == 16 || !w(a, k[0])) return e;\n } else k = b[Nc[e]][0];\n if (e == 16) return 16;\n }\n }\n\n function ob(a, b) {\n return ((16777216 * a[0] + 65536 * a[1] + 256 * a[2] + 1 * a[3]) * Lf\n & 4278190080) >> b;\n }\n\n function Mf(a, b) {\n let c = 0;\n if (a == p) return 0;\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'NULL VP8Io parameter in VP8Decode().');\n if (!a.za && !Hd(a, b)) return 0;\n $(a.za);\n let d;\n if (b.Mb && !b.Mb(b)) Y(a, Nf, 'Frame setup failed'), d = a.a;\n else {\n b.Za && (a.A = 0);\n const e = uc[a.A];\n a.A == 2 ? (a.lb = 0, a.mb = 0) : (a.lb = b.t - e >> 4, a.mb = b.k - e >> 4, a.lb < 0 && (a.lb = 0), a.mb < 0 && (a.mb = 0));\n a.Ya = b.K + 15 + e >> 4;\n a.wb = b.Ka + 15 + e >> 4;\n a.wb > a.Ma && (a.wb = a.Ma);\n a.Ya > a.hb && (a.Ya = a.hb);\n d = L;\n }\n if (c = d == L) {\n if (c) {\n let g;\n b: {\n a.Ja = 0;\n if (a.qb) {\n const k = a.rc;\n if (!WebPWorkerReset(k)) {\n g = Y(a, cb, 'thread initialization failed.');\n break b;\n }\n k.Qd = a;\n k.Rd = a.oa.N;\n k.Ud = FinishRow;\n a.jb = a.A > 0 ? Od : Od - 1;\n } else a.jb = Of;\n g = 1;\n }\n let h;\n if (!(h = !g)) {\n let n;\n b: {\n const l = a.jb;\n const m = a.Ma;\n const t = 4 * m;\n const q = 32 * m;\n const r = m + 1;\n const u = a.A > 0 ? m * (a.qb ? 2 : 1) : 0;\n const v = Pf;\n const C = q * (16 * l + parseInt(3 * uc[a.A] / 2, 10));\n const A = a.Ga != p ? a.P.l * a.P.v : 0;\n const z = t + q + r + u + v + 384 + C + A + Pd;\n if (z != z) n = 0;\n else {\n if (z > a.Gb) {\n a.ib = 0;\n a.Gb = 0;\n if (a.ib == p) {\n n = Y(a, 'VP8_STATUS_OUT_OF_MEMORY', 'no memory during frame initialization.');\n break b;\n }\n a.Gb = z;\n }\n a.dc = 205;\n a.Xc = rc(205, 16 * m);\n a.Sc = rc(205, 8 * m);\n a.Vc = rc(205, 8 * m);\n a.M = u ? ic(Oc, u) : p;\n a.Sd = u ? 0 : p;\n a.oa.ha = 0;\n a.oa.M = a.M;\n $((v & Pd) == 0);\n a.Ea = rc(205, 1 * v);\n a.z = -12851;\n a.H = 16 * m;\n a.r = 8 * m;\n const Ha = uc[a.A];\n const G = Ha * a.H;\n const y = Ha / 2 * a.r;\n a.ca = U(C, 205);\n a.da = +G;\n a.aa = a.ca;\n a.ba = a.da + 16 * l * a.H + y;\n a.ra = a.aa;\n a.sa = a.ba + 8 * l * a.r + y;\n a.Xb = A ? U(A, x) : p;\n a.La = ic(Qd, r);\n a.dc = rc($b, t);\n n = 1;\n }\n }\n h = !n;\n }\n if (h) c = 0;\n else {\n b.width = a.P.l;\n b.height = a.P.v;\n b.w = 0;\n b.y = a.ca;\n b.D = a.da;\n b.c = a.aa;\n b.B = a.ba;\n b.S = a.ra;\n b.C = a.sa;\n b.F = a.H;\n b.Da = a.r;\n b.p = p;\n b.q = p;\n if (!Rd) {\n let B;\n for (B = -255; B <= 255; ++B) va[255 + B] = B < 0 ? -B : B, tc[255 + B] = va[255 + B] >> 1;\n for (B = -1020; B\n <= 1020; ++B) sc[1020 + B] = B < -128 ? -128 : B > 127 ? 127 : B;\n for (B = -112; B <= 112; ++B) oc[112 + B] = B < -16 ? -16 : B > 15 ? 15 : B;\n for (B = -255; B <= 510; ++B) oa[255 + B] = B < 0 ? 0 : B > 255 ? 255 : B;\n Rd = 1;\n }\n mc = pf;\n Pc = qf;\n Qc = nc;\n Rc = rf;\n Sd = uf;\n Td = vf;\n Ud = yf;\n Vd = zf;\n Wd = wf;\n Xd = xf;\n Yd = Af;\n Zd = Bf;\n $d = Dd;\n ae = Ed;\n be = sf;\n ce = tf;\n c = 1;\n }\n }\n if (c) {\n a: {\n for (a.d = 0; a.d < a.Ya; ++a.d) {\n const Qf = a.ic[a.d & a.Hb - 1];\n const db = a;\n const F = db.La[0];\n F.X = 0;\n F.ua = 0;\n jd(db.cc, 0, $b, db.cc.length);\n db.W = (db.A > 0 && db.d >= db.mb && db.d <= db.Ya) + 0;\n for (a.i = 0; a.i < a.Ma; a.i++) {\n var D;\n const H = a;\n const T = Qf;\n const ya = H.o;\n const S = H.La[0];\n const J = H.La[1 + H.i];\n H.Ca.ob && (H.Lb = !w(ya,\n H.R.Ta[0]) ? 0 + w(ya, H.R.Ta[1]) : 2 + w(ya, H.R.Ta[2]));\n J.Nb = H.pc ? w(ya, H.Pc) : 0;\n const O = H.dc;\n O[O.length - 1] = 0 + 4 * H.i;\n const Sc = H.cc;\n H.wa = !w(ya, 145);\n if (H.wa) {\n for (var ga = H.Eb, ja = 0, Z = ca, Z = 0; Z < 4; ++Z) {\n var V = Sc[Z];\n var R;\n for (R = 0; R < 4; ++R) {\n const ta = Rf[O[O[O.length - 1] + R]][V];\n var za = 0;\n do za = Sf[2 * za + w(ya, ta[za])]; while (za > 0);\n V = -za;\n O[O[O.length - 1] + R] = V;\n ga[ja] = V;\n ja++;\n }\n Sc[Z] = V;\n }\n } else {\n var V = w(ya, 156) ? w(ya, 128) ? de : ee : w(ya, 163) ? fe : ge;\n H.Eb[0] = V;\n for (za = 0; za < 4; ++za) O[za + O[O.length - 1]] = V;\n for (za = 0; za < 4; ++za) Sc[za] = V;\n }\n H.Tc = !w(ya, 142) ? ge : !w(ya, 114) ? fe\n : w(ya, 183) ? de : ee;\n if (ya.Ab) D = 0;\n else {\n if (J.Nb) S.X = J.X = 0, H.wa || (S.ua = J.ua = 0), H.ja = 0, H.Oa = 0;\n else {\n let ia = ca;\n let ka = ca;\n var sa = ca;\n var wa = Tf;\n const Aa = H.yb[H.Lb];\n var aa = H.z;\n const ma = H.La[0];\n const ua = U(4, 0);\n const xa = U(4, 0);\n let ea = U(4, 0);\n let pb = U(4, 0);\n let na = 0;\n let Ba = 0;\n var pa = ca;\n let qa = ca;\n let Sa = ca;\n var aa = rc(0, 384);\n if (H.wa) sa = 0, wa = H.R.z[3];\n else {\n const ab = U(16, 0);\n var Ca = J.ua + ma.ua;\n J.ua = ma.ua = (Mc(T, H.R.z[1], Ca, Aa.sb, 0, ab) > 0) + 0;\n for (var sa = 1, wa = H.R.z[0], qb = ab, Ta = aa, La = U(16, s), X = s, X = 0; X < 4; ++X) {\n var Da = qb[0 + X] + qb[12 + X];\n var Ea = qb[4 + X] + qb[8 + X];\n var Fa = qb[4 + X] - qb[8 + X];\n var Ga = qb[0 + X] - qb[12 + X];\n La[0 + X] = Da + Ea;\n La[8\n + X] = Da - Ea;\n La[4 + X] = Ga + Fa;\n La[12 + X] = Ga - Fa;\n }\n for (X = 0; X < 4; ++X) {\n const Oa = Ta[Ta.length - 1];\n const lb = La[0 + 4 * X] + 3;\n var Da = lb + La[3 + 4 * X];\n var Ea = La[1 + 4 * X] + La[2 + 4 * X];\n var Fa = La[1 + 4 * X] - La[2 + 4 * X];\n var Ga = lb - La[3 + 4 * X];\n Ta[Oa + 0] = Da + Ea >> 3;\n Ta[Oa + 16] = Ga + Fa >> 3;\n Ta[Oa + 32] = Da - Ea >> 3;\n Ta[Oa + 48] = Ga - Fa >> 3;\n Ta[Ta.length - 1] += 64;\n }\n aa[aa.length - 1] = 0;\n }\n ea = Nb(vc[J.X & 15]);\n pb = Nb(vc[ma.X & 15]);\n for (qa = 0; qa < 4; ++qa) {\n for (var Eb = pb[qa], pa = 0; pa < 4; ++pa) {\n var Ca = Eb + ea[pa];\n var Ka = Mc(T, wa, Ca, Aa.sc, sa, aa);\n ea[pa] = Eb = (Ka > 0) + 0;\n xa[pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0;\n ua[pa] = (Ka > 1) + 0;\n aa[aa.length\n - 1] += 16;\n }\n pb[qa] = Eb;\n Ba |= ob(xa, 24 - 4 * qa);\n na |= ob(ua, 24 - 4 * qa);\n }\n ia = ob(ea, 24);\n ka = ob(pb, 24);\n ea = Nb(vc[J.X >> 4]);\n pb = Nb(vc[ma.X >> 4]);\n for (Sa = 0; Sa < 4; Sa += 2) {\n for (qa = 0; qa < 2; ++qa) {\n Eb = pb[Sa + qa];\n for (pa = 0; pa < 2; ++pa) Ca = Eb + ea[Sa + pa], Ka = Mc(T, H.R.z[2], Ca, Aa.qc, 0, aa), ea[Sa + pa] = Eb = (Ka > 0) + 0, xa[2 * qa + pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0, ua[2 * qa + pa] = (Ka > 1) + 0, aa[aa.length - 1] += 16;\n pb[Sa + qa] = Eb;\n }\n Ba |= ob(xa, 8 - 2 * Sa);\n na |= ob(ua, 8 - 2 * Sa);\n }\n ia |= ob(ea, 20);\n ka |= ob(pb, 20);\n J.X = ia;\n ma.X = ka;\n H.z = aa;\n H.Oa = na + 0;\n H.ja = na | Ba;\n J.Nb = !H.ja + 0;\n }\n D = !T.Ab;\n }\n if (!D) {\n c = Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA',\n `Premature end-of-file encountered.${a.i} ${a.d}`);\n break a;\n }\n const P = a;\n const da = P.Ea;\n const Ma = Tc;\n const Ua = P.Ea;\n const Va = Uc;\n const Wa = P.Ea;\n const Xa = he;\n if (P.i > 0) {\n for (var ba = ca, ba = -1; ba < 16; ++ba) Ec(da, Ma + ba * f - 4, da, Ma + ba * f + 12);\n for (ba = -1; ba < 8; ++ba) Ec(Ua, Va + ba * f - 4, Ua, Va + ba * f + 4), Ec(Wa, Xa + ba * f - 4, Wa, Xa + ba * f + 4);\n } else {\n for (ba = 0; ba < 16; ++ba) da[Ma + ba * f - 1] = 129;\n for (ba = 0; ba < 8; ++ba) Ua[Va + ba * f - 1] = 129, Wa[Xa + ba * f - 1] = 129;\n P.d > 0 && (da[Ma - 1 - f] = Ua[Va - 1 - f] = Wa[Xa - 1 - f] = 129);\n }\n const Qa = P.Xc;\n const Ra = 16 * +P.i;\n const mb = P.Sc;\n const vb = 8 * +P.i;\n const wb = P.Vc;\n const xb = 8 * +P.i;\n const Za = P.z;\n let fa = ca;\n if (P.d > 0) {\n N(da, Ma - f, Qa, Ra,\n 16), N(Ua, Va - f, mb, vb, 8), N(Wa, Xa - f, wb, xb, 8);\n } else if (P.i == 0) {\n for (i = 0; i < 21; ++i) da[Ma - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Ua[Va - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Wa[Xa - f - 1 + i] = 127;\n }\n if (P.wa) {\n const Ya = Ma - f + 16;\n P.d > 0 && (P.i >= P.Ma - 1 ? da[Ya + 0] = da[Ya + 1] = da[Ya + 2] = da[Ya + 3] = Qa[Ra + 15] : N(da, Ya + 0, Qa, Ra + 16, 4));\n for (let Fb = 0; Fb < 4; ++Fb) da[Fb + Ya + 4 * f] = da[Fb + Ya + 4 * f] = da[Fb + Ya + 8 * f] = da[Fb + Ya + 12 * f] = da[Fb + Ya + 0];\n for (fa = 0; fa < 16; fa++) {\n var ac = da;\n var bc = Ma + ie[fa];\n Uf[P.Eb[fa]](ac, bc);\n P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n } else {\n var $a = Fd(P, P.Eb[0]);\n Vf[$a](da, Ma);\n if (P.ja) for (fa = 0; fa < 16; fa++) ac = da, bc = Ma + ie[fa], P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n $a = Fd(P, P.Tc);\n je[$a](Ua, Va);\n je[$a](Wa, Xa);\n if (P.ja & 983040) {\n const zb = P.z;\n var Pa = 256;\n P.Oa & 983040 ? Pc(zb, Pa, Ua, Va) : Rc(zb, Pa, Ua, Va);\n }\n if (P.ja & 15728640) {\n const Ab = P.z;\n var Pa = 320;\n P.Oa & 15728640 ? Pc(Ab, Pa, Wa, Xa) : Rc(Ab, Pa, Wa, Xa);\n }\n P.d < P.hb - 1 && (N(Qa, Ra, da, Ma + 15 * f, 16), N(mb, vb, Ua, Va + 7 * f, 8), N(wb, xb, Wa, Xa + 7 * f, 8));\n const Q = a;\n if (Q.A > 0) {\n const kb = Q.M[1 + Q.i];\n const Kb = Q.La[1 + Q.i].Nb;\n let ha = Q.Zb[Q.Lb];\n Q.ga.oc && (ha\n += Q.ga.Lc[0], Q.wa && (ha += Q.ga.Gc[0]));\n ha = ha < 0 ? 0 : ha > 63 ? 63 : ha;\n kb.zc = ha;\n Q.ga.kb > 0 && (ha = Q.ga.kb > 4 ? ha >> 2 : ha >> 1, ha > 9 - Q.ga.kb && (ha = 9 - Q.ga.kb));\n kb.yc = ha < 1 ? 1 : ha;\n kb.ab = (!Kb || Q.wa) + 0;\n }\n for (var Ia = ca, Bb = 8 * Q.Ja * Q.r, Qb = Q.ca, Ub = Q.da + 16 * Q.i + 16 * Q.Ja * Q.H, Wb = Q.aa, Xb = Q.ba + 8 * Q.i + Bb, Yb = Q.ra, Zb = Q.sa + 8 * Q.i + Bb, Ia = 0; Ia < 16; ++Ia) N(Qb, Ub + Ia * Q.H, Q.Ea, +Tc + Ia * f, 16);\n for (Ia = 0; Ia < 8; ++Ia) N(Wb, Xb + Ia * Q.r, Q.Ea, +Uc + Ia * f, 8), N(Yb, Zb + Ia * Q.r, Q.Ea, +he + Ia * f, 8);\n }\n const K = a;\n const I = b;\n var cc = 1;\n const eb = K.oa;\n if (K.qb) {\n const nb = K.rc;\n var cc = cc & WebPWorkerSync(nb);\n $(nb.a == OK);\n if (cc) {\n eb.N = I;\n eb.ha = K.Ja;\n eb.d = K.d;\n eb.W = K.W;\n if (eb.W) {\n const hc = eb.M;\n eb.M = K.M;\n K.M = hc;\n }\n WebPWorkerLaunch(nb);\n ++K.Ja == K.jb && (K.Ja = 0);\n }\n } else {\n eb.d = K.d;\n eb.W = K.W;\n b: {\n let Hb = 1;\n const rb = K.oa;\n const ib = uc[K.A];\n const yb = ib * K.H;\n const dc = parseInt(ib / 2) * K.r;\n const Ib = 16 * rb.ha * K.H;\n const jb = 8 * rb.ha * K.r;\n const Jb = K.ca;\n const Lb = K.da - yb + Ib;\n const Ob = K.aa;\n const Pb = K.ba - dc + jb;\n const Rb = K.ra;\n const Sb = K.sa - dc + jb;\n const jc = rb.d == 0;\n const Tb = (rb.d >= K.hb - 1) + 0;\n var ra = 16 * rb.d;\n let fb = 16 * (rb.d + 1);\n if (rb.W) {\n const pc = K;\n let wc = s;\n const kc = pc.oa.d;\n $(pc.oa.W);\n for (wc = pc.lb; wc < pc.wb; ++wc) {\n const Na = pc;\n const ec = wc;\n const Vb = kc;\n const xc = Na.oa;\n const gb = Na.H;\n const fc = xc.M[1 + ec];\n const sb = Na.ca;\n const tb = Na.da + 16 * xc.ha\n * gb + 16 * ec;\n const Gb = fc.zc;\n const hb = fc.yc;\n const Ja = 2 * Gb + hb;\n if (Gb != 0) {\n if (Na.A == 1) ec > 0 && ae(sb, tb, gb, Ja + 4), fc.ab && ce(sb, tb, gb, Ja), Vb > 0 && $d(sb, tb, gb, Ja + 4), fc.ab && be(sb, tb, gb, Ja);\n else {\n const gc = Na.r;\n const yc = Na.aa;\n const zc = Na.ba + 8 * xc.ha * gc + 8 * ec;\n const Ac = Na.ra;\n const Bc = Na.sa + 8 * xc.ha * gc + 8 * ec;\n const ub = Na.Ac.fb ? Gb >= 40 ? 2 : Gb >= 15 ? 1 : 0 : Gb >= 40 ? 3 : Gb >= 20 ? 2 : Gb >= 15 ? 1 : 0;\n ec > 0 && (Td(sb, tb, gb, Ja + 4, hb, ub), Vd(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Xd(sb, tb, gb, Ja, hb, ub), Zd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n Vb > 0 && (Sd(sb, tb, gb, Ja + 4, hb, ub), Ud(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Wd(sb, tb, gb,\n Ja, hb, ub), Yd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n }\n }\n }\n }\n if (I.put) {\n jc ? (I.y = K.ca, I.D = K.da + Ib, I.c = K.aa, I.B = K.ba + jb, I.S = K.ra, I.C = K.sa + jb) : (ra -= ib, I.y = Jb, I.D = Lb, I.c = Ob, I.B = Pb, I.S = Rb, I.C = Sb);\n Tb || (fb -= ib);\n fb > I.K && (fb = I.K);\n if (K.Ga != p && ra < fb && (ra == 0 ? (I.p = qd(K, ra, fb - ra), I.q = 0) : I.q = qd(K, ra, fb - ra), I.p == p)) {\n cc = Y(K, W, 'Could not decode alpha data.');\n break b;\n }\n if (ra < I.k) {\n const qc = I.k - ra;\n var ra = I.k;\n $(!(qc & 1));\n I.D += K.H * qc;\n I.B += K.r * (qc >> 1);\n I.C += K.r * (qc >> 1);\n I.p != p && (I.q += I.width * qc);\n }\n ra < fb && (I.D += I.t, I.B += I.t >> 1, I.C += I.t >> 1, I.p != p && (I.q += I.t),\n I.w = ra - I.k, I.m = I.Ka - I.t, I.h = fb - ra, Hb = I.put(I));\n }\n rb.ha + 1 == K.jb && !Tb && (N(K.ca, K.da - yb, Jb, Lb + 16 * K.H, yb), N(K.aa, K.ba - dc, Ob, Pb + 8 * K.r, dc), N(K.ra, K.sa - dc, Rb, Sb + 8 * K.r, dc));\n cc = Hb;\n }\n }\n if (!cc) {\n c = Y(a, 'VP8_STATUS_USER_ABORT', 'Output aborted.');\n break a;\n }\n }\n let Cb;\n if (!(Cb = a.qb && !WebPWorkerSync(a.rc))) {\n let Db;\n if (Db = a.fc > 0) $(a), $(a.fc > 0), Db = !1;\n Cb = Db;\n }\n c = Cb ? 0 : 1;\n }\n }\n const lc = c;\n b.Pb && b.Pb(b);\n c = lc & 1;\n }\n if (!c) return ke(a), 0;\n a.za = 0;\n return c;\n }\n\n function ke(a) {\n a != p && (a.ib && (a.ib = 0), a.ib = p, a.Gb = 0, a.za = 0);\n }\n\n function Aa(a, b) {\n return a + (1 << b) - 1 >> b;\n }\n\n function hc(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J];\n d[e + 1] = ia[a + g - J];\n d[e + 2] = ia[a + b - J];\n }\n\n function le(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J] & 248 | ia[a + g - J] >> 5;\n d[e + 1] = ia[a + g - J] << 3 & 224 | ia[a + b - J] >> 3;\n }\n\n function me(a, b, c, d, e) {\n d[e + 0] = 255;\n hc(a, b, c, d, e + 1);\n }\n\n function ne(a, b, c, d, e) {\n const g = xb[b];\n d[e + 0] = Hb[a + Za[c] - J] << 4 | Hb[a + (vb[c] + wb[b] >> ea) - J];\n d[e + 1] = 15 | Hb[a + g - J] << 4;\n }\n\n function Vc(a, b, c, d, e) {\n const g = Za[c];\n c = vb[c] + wb[b] >> ea;\n d[e + 0] = ia[a + xb[b] - J];\n d[e + 1] = ia[a + c - J];\n d[e + 2] = ia[a + g - J];\n }\n\n function oe(a, b, c, d, e) {\n Vc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function pe(a, b, c, d, e) {\n hc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function ib(a, b, c) {\n a[b] = ((((a[b] & 4278255360) >>> 0) + ((c & 4278255360) >>> 0) & 4278255360) >>> 0 | (a[b] & 16711935) + (c & 16711935) & 16711935) >>> 0;\n }\n\n function ka(a, b) {\n return (((a ^ b) & 4278124286) >>> 1) + ((a & b) >>> 0) >>> 0;\n }\n\n function $a(a) {\n return a < 256 && a > 0 ? a : a <= 0 ? 0 : ~a >> 24 & 255;\n }\n\n function yb(a, b) {\n return $a(a + parseInt((a - b) / 2, 10));\n }\n\n function Wc() {\n return qe;\n }\n\n function Xc(a, b) {\n a &= 255;\n b &= 255;\n a > 127 && (a -= 256);\n b > 127 && (b -= 256);\n return a * b >>> 5;\n }\n\n function re(a,\n b, c, d, e, g, k) {\n var h = s;\n const n = 8 >> a.n;\n const l = a.U;\n const f = a.u;\n if (n < 8) {\n a = (1 << a.n) - 1;\n for (var t = (1 << n) - 1, h = b; h < c; ++h) {\n b = 0;\n for (var q = s, q = 0; q < l; ++q) (q & a) == 0 && (b = d[e++] >> 8 & 255), g[k++] = f[b & t], b >>= n;\n }\n } else for (h = b; h < c; ++h) for (q = 0; q < l; ++q) g[k++] = f[d[e++] >> 8 & 255];\n }\n\n function se(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n d[e++] = g >> 24 & 255;\n }\n }\n\n function te(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 240 | g >> 12 & 15;\n d[e++] = g >> 0 & 240 | g >> 28 & 15;\n }\n }\n\n function Ib(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 24 & 255;\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n }\n }\n\n function ue(a, b, c, d) {\n if (T(a, 8) != ve) return 0;\n b[0] = T(a, we) + 1;\n c[0] = T(a, we) + 1;\n d[0] = T(a, 1);\n T(a, Wf);\n return 1;\n }\n\n function xe(a, b) {\n let c = s;\n if (a < 4) return a + 1;\n c = a - 2 >> 1;\n return (2 + (a & 1) << c) + T(b, c) + 1;\n }\n\n function Oa(a, b) {\n if (b.Q + 8 > b.ya) {\n var c = a.Y;\n var d = 0;\n for ($(c != p); c[d].s != 0;) {\n var e = c;\n var g = b;\n const k = g.T >> g.g & 1;\n g.L ? g.fa = 1 : (++g.g, g.g >= 8 && Sb(g), g.Q == g.ya && g.g == 32 && (g.L = 1));\n d = d + e[d].s + k;\n }\n return c[d].kc;\n }\n c = a.Y;\n d = 0;\n for ($(c != p); c[d].s != 0;) {\n e = c, g = b.T >> b.g & 1, ++b.g, d = d\n + e[d].s + g;\n }\n return c[d].kc;\n }\n\n function zb(a, b) {\n if (a != p) for (var c = s, d = s, c = 0; c < b; ++c) for (var e = a[c].va, d = 0; d < Yc; ++d) ja(e[d]);\n }\n\n function ye(a, b, c) {\n b = a.eb == 0 ? 0 : a.ac[a.bd + a.Ec * (c >> a.eb) + (b >> a.eb)];\n $(b < a.hc);\n return a.Db[+b];\n }\n\n function ze(a, b, c, d) {\n let e = a.Na;\n const g = a.O;\n const k = g + b;\n var h = c;\n var f = d;\n d = a.Xa;\n c = a.vb;\n for (N(d, c, h, f, a.l * b); e-- > 0;) {\n b = a.nc[e];\n let l = g;\n var m = k;\n var t = h;\n var q = f;\n var f = d;\n var h = c;\n $(l < m);\n $(m <= b.Vb);\n switch (b.Qc) {\n case Ae:\n t = 0;\n for (b = h + (m - l) * b.U; h < b;) {\n var m = f;\n var q = h;\n var r = m[q] >> 8 & 255;\n var u = (m[q] & 16711935) >>> 0;\n var u = u + (r << 16 | r);\n var u = u & 16711935;\n f[h++] = ((m[q] & 4278255360)\n >>> 0 | u) >>> 0;\n l == 32 && t++;\n }\n break;\n case Be:\n var v = b;\n var C = l;\n var t = m;\n var q = f;\n var r = h;\n var u = v.U;\n if (C == 0) {\n var A = s;\n ib(q, r, qe);\n for (A = 1; A < u; ++A) ib(q, r + A, q[r + A - 1]);\n r += u;\n ++C;\n }\n for (var z = (1 << v.n) - 1, Ha = Aa(u, v.n), w = v.u, v = +(C >> v.n) * Ha; C < t;) {\n var y = w;\n var B = v;\n let G = p;\n ib(q, r, q[r - u + 0]);\n G = Ce[y[B++] >> 8 & 15];\n for (A = 1; A < u; ++A) {\n let F = E;\n (A & z) == 0 && (G = Ce[y[B++] >> 8 & 15]);\n F = G(q[r + A - 1], q, r + A - u);\n ib(q, r + A, F);\n }\n r += u;\n ++C;\n (C & z) == 0 && (v += Ha);\n }\n m != b.Vb && (b = b.U, N(f, h - b, f, h + (m - l - 1) * b, b));\n break;\n case De:\n t = b.U;\n q = (1 << b.n) - 1;\n r = Aa(t, b.n);\n u = b.u;\n for (b = +(l >> b.n) * r; l < m;) {\n A = u;\n C = b;\n z = M(Xf);\n Ha = s;\n for (Ha = 0; Ha < t; ++Ha) (Ha & q) == 0 && (w = A[C++], v = z, v.Cc = w >> 0 & 255, v.Bc = w >> 8 & 255, v.Kc = w >> 16 & 255), w = f[h + Ha], v = w >>> 8, y = w >>> 16, B = w, y += Xc(z.Cc, v), y &= 255, B += Xc(z.Bc, v), B += Xc(z.Kc, y), B &= 255, f[h + Ha] = (w & 4278255360 | y << 16 | B) >>> 0;\n h += t;\n ++l;\n (l & q) == 0 && (b += r);\n }\n break;\n case Ee:\n t == f && b.n > 0 ? (t = (m - l) * Aa(b.U, b.n), q = h + (m - l) * b.U - t, memmove(f, q, f, h, t), re(b, l, m, f, q, f, h)) : re(b, l, m, t, q, f, h);\n }\n h = d;\n f = c;\n }\n }\n\n function Yf(a, b) {\n var c = a.V;\n var d = a.Ha + a.l * a.O;\n var e = b - a.O;\n if (!(e <= 0)) {\n ze(a, e, c, d);\n var g = a.N;\n var c = a.Xa;\n let k = [a.vb];\n var d = a.O;\n var e = b;\n var h = k;\n var f = g.width;\n $(d < e);\n $(g.t < g.Ka);\n e > g.K && (e = g.K);\n if (d < g.k) {\n var l = g.k - d;\n var d = g.k;\n h[0] += f * l;\n }\n d >= e ? d = 0 : (h[0] += g.t, g.w = d - g.k, g.m = g.Ka - g.t, g.h = e - d, d = 1);\n if (d) {\n k = k[0];\n d = a.Ib;\n e = g.width;\n if (d.J < ua) {\n var m = d.c.RGBA;\n var h = m.ma;\n let t = m.Sa + a.xa * m.f;\n if (g.I) c = EmitRescaledRows(a, c, k, e, g.h, h, t, m.f);\n else {\n for (var f = d.J, l = g.m, g = g.h, m = m.f, q = g; q-- > 0;) {\n const r = c;\n let u = k;\n let v = l;\n const C = h;\n let A = t;\n switch (f) {\n case Qa:\n for (v = u + v; u < v;) {\n var z = r[u++];\n C[A++] = z >> 16 & 255;\n C[A++] = z >> 8 & 255;\n C[A++] = z >> 0 & 255;\n }\n break;\n case jb:\n se(r, u, v, C, A);\n break;\n case Ob:\n se(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v,\n 1, 0);\n break;\n case Zc:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 0 & 255, C[A++] = z >> 8 & 255, C[A++] = z >> 16 & 255;\n break;\n case Pa:\n Ib(r, u, v, C, A);\n break;\n case Pb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v, 1, 0);\n break;\n case Ab:\n Ib(r, u, v, C, A);\n break;\n case Bb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 1, v, 1, 0);\n break;\n case kb:\n te(r, u, v, C, A);\n break;\n case Qb:\n te(r, u, v, C, A);\n WebPApplyAlphaMultiply4444(C, v, 1, 0);\n break;\n case Fe:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 16 & 248 | z >> 13 & 7, C[A++] = z >> 5 & 224 | z >> 3 & 31;\n break;\n default:\n $(0);\n }\n k += e;\n t += m;\n }\n c = g;\n }\n a.xa += c;\n } else {\n a.xa = g.I ? EmitRescaledRowsYUVA(a, c, k, e, g.h) : EmitRowsYUVA(a, c, k, e, g.m, g.h);\n }\n $(a.xa <= d.height);\n }\n a.O = b;\n $(a.O <= a.v);\n }\n }\n\n function lc(a, b, c, d, e, g) {\n let k = 1;\n let h = 0;\n let f = 0;\n const l = a.o;\n const m = a.cb;\n let t = m.Db;\n let q = c;\n let r = c;\n c += d * e;\n e = Ba + Ge;\n const u = e + m.xb;\n const v = m.xb > 0 ? m.Yb : p;\n const C = m.Dc;\n let A = !1;\n $(t != p);\n for (; !l.L && q < c;) {\n let z = s;\n A || ((h & C) == 0 && (t = ye(m, h, f)), Da(l), z = Oa(t.va[Zf], l));\n if (z < Ba || A) {\n if (!A) {\n var w = k = A = s;\n var y = s;\n Da(l);\n A = Oa(t.va[$f], l);\n k = z;\n Da(l);\n w = Oa(t.va[ag], l);\n Da(l);\n y = Oa(t.va[bg], l);\n b[q] = (y << 24 >>> 0) + (A << 16) + (k << 8) + w;\n }\n A = !1;\n ++q;\n ++h;\n if (h >= d && (h = 0, ++f, g != p && f\n % $c == 0 && g(a, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < e) {\n w = w = s;\n k = xe(z - Ba, l);\n z = Oa(t.va[cg], l);\n Da(l);\n w = xe(z, l);\n w > He ? w -= He : (z = dg[w - 1], z = (z >> 4) * d + (8 - (z & 15)), w = z >= 1 ? z : 1);\n z = s;\n for (z = 0; z < k; ++z) b[q + z] = b[q + z - w];\n q += k;\n for (h += k; h >= d;) h -= d, ++f, g != p && f % $c == 0 && g(a, f);\n if (q < c && (t = ye(m, h, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < u) {\n A = z - e;\n for ($(v != p); r < q;) z = b[r++], v.ea[ad * z >>> v.bb] = z;\n z = b;\n w = q;\n y = v;\n $(A <= -1 >>> y.bb);\n z[w] = y.ea[A];\n A = !0;\n continue;\n }(k = !l.fa) || End;\n }\n g != p && g(a, f);\n l.fa || !k || l.L && q < c ? (k = 0, a.a = !l.L ? W : Ie) : q == c && (a.Ob = Db);\n return k;\n }\n\n function bd(a) {\n $(a);\n a.ac = p;\n zb(a.Db, a.hc);\n const b = a.Yb;\n b != p && (b.ea = p, b.ea = p);\n $(a);\n }\n\n function sd() {\n const a = M(eg);\n if (a == p) return p;\n a.a = L;\n a.Wa = cd;\n a.Ob = cd;\n return a;\n }\n\n function sa(a) {\n let b = s;\n if (a != p) {\n bd(a.cb);\n a.V = p;\n a.V = p;\n for (b = 0; b < a.Na; ++b) {\n const c = a.nc[b];\n c.u = p;\n c.u = p;\n }\n a.Na = 0;\n a.Ub = 0;\n a.Mc = p;\n a.Mc = p;\n a.Ib = p;\n }\n }\n\n function Ka(a, b, c, d, e) {\n var g = 1;\n a = [a];\n b = [b];\n for (var k = d.o, h = d.cb, f = p, l = p, l = 0; ;) {\n if (c) {\n for (; g && T(k, 1);) {\n var m = a;\n var t = b;\n var q = d;\n var r = 1;\n var u = q.o;\n var g = q.nc[q.Na];\n var v = T(u, 2);\n if (q.Ub & 1 << v) g = 0;\n else {\n q.Ub\n |= 1 << v;\n g.Qc = v;\n g.U = m[0];\n g.Vb = t[0];\n g.u = [p];\n g.b = 0;\n ++q.Na;\n $(q.Na <= Je);\n switch (v) {\n case Be:\n case De:\n g.n = T(u, 3) + 2;\n r = Ka(Aa(g.U, g.n), Aa(g.Vb, g.n), 0, q, g.u);\n break;\n case Ee:\n t = T(u, 8) + 1;\n r = t > 16 ? 0 : t > 4 ? 1 : t > 2 ? 2 : 3;\n m[0] = Aa(g.U, r);\n g.n = r;\n if (m = r = Ka(t, 1, 0, q, g.u)) {\n if (m = t, q = g, r = s, t = 1 << (8 >>> q.n) >>> 0, u = Array(t), u == p) m = 0;\n else {\n var v = q.u[0];\n var C = q.b;\n u[0] = q.u[0][q.b + 0];\n for (r = 1; r < m; ++r) u[r] = ((((v[C + r] & 4278255360) >>> 0) + ((u[r - 1] & 4278255360) >>> 0) & 4278255360) >>> 0 | (v[C + r] & 16711935) + (u[r - 1] & 16711935) & 16711935) >>> 0;\n for (; r < t; ++r) u[r] = 0;\n q.u[0] = p;\n q.b = p;\n q.u[0] = u;\n q.b = 0;\n m = 1;\n }\n }\n r = m;\n break;\n case Ae:\n break;\n default:\n $(0);\n }\n g.u = g.u[0];\n g = r;\n }\n }\n }\n if (g && T(k, 1) && (l = T(k, 4), g = l >= 1 && l <= fg, !g)) {\n d.a = W;\n break;\n }\n if (g) {\n a: {\n var g = d;\n var A = a[0];\n var z = b[0];\n var m = l;\n var C = v = s;\n var C = g.o;\n var q = g.cb;\n var r = [p];\n var t = p;\n var u = 1;\n if (c && T(C, 1)) {\n var v = T(C, 3) + 2;\n var A = Aa(A, v);\n var w = Aa(z, v);\n var z = A * w;\n if (!Ka(A, w, 0, g, r)) {\n g.a = W;\n zb(t, u);\n g = 0;\n break a;\n }\n r = r[0];\n q.eb = v;\n for (v = 0; v < z; ++v) A = r[v] >>> 8 & 65535, r[v] = A, A >= u && (u = A + 1);\n }\n if (C.fa) zb(t, u), g = 0;\n else if ($(u <= 65536), t = ld(u, gg), t == p) g.a = cb, zb(t, u), g = 0;\n else {\n for (v = 0; v < u; ++v) {\n z = t[v].va;\n for (C = 0; C < Yc; ++C) {\n A = hg[C];\n C == 0 && m > 0 && (A += 1 << m);\n b: {\n const y = A;\n var A = g;\n const G = z[+C];\n var B = 0;\n var w = A.o;\n if (T(w, 1)) {\n var F = Array(2);\n var D = Array(2);\n var L = Array(2);\n var B = T(w, 1) + 1;\n var J = T(w, 1);\n F[0] = T(w, J == 0 ? 1 : 8);\n D[0] = 0;\n L[0] = B - 1;\n B == 2 && (F[1] = T(w, 8), D[1] = 1, L[1] = B - 1);\n c: {\n var J = 0;\n var H = s;\n $(G != p);\n $(L != p);\n $(D != p);\n $(F != p);\n if (nd(G, B)) {\n for (H = 0; H < B; ++H) {\n if (D[H] != pd) {\n if (F[H] < 0 || F[H] >= y) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n if (!jc(G, F[H], D[H], L[H])) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n }\n }(J = (J = 1) && ma(G)) || ja(G);\n B = J;\n } else B = 0;\n }\n } else {\n B = s;\n D = [];\n F = T(w, 4) + 4;\n if (F > Ke) {\n A.a = W;\n A = 0;\n break b;\n }\n L = Array(y);\n if (L == p) {\n A.a = cb;\n A = 0;\n break b;\n }\n for (B = 0; B < F; ++B) D[ig[B]] = T(w, 3);\n c: {\n var B = A;\n var O = D;\n var D = y;\n var F = L;\n var J = 0;\n var H = B.o;\n let S = s;\n let V = s;\n let Y = jg;\n const Z = M(Le);\n if (od(Z, O, Ke)) {\n if (T(H, 1)) {\n if (S = 2 + 2 * T(H, 3), V = 2 + T(H, S), V > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n } else V = D;\n for (S = 0; S < D;) {\n var R = s;\n if (V-- == 0) break;\n Da(H);\n R = Oa(Z, H);\n if (R < Me) F[S++] = R, R != 0 && (Y = R);\n else {\n var O = R == kg;\n var R = R - Me;\n const ea = lg[R];\n var R = T(H, mg[R]) + ea;\n if (S + R > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n for (O = O ? Y : 0; R-- > 0;) F[S++] = O;\n }\n }\n J = 1;\n ja(Z);\n B = J;\n } else B.a = W, B = 0;\n }\n B && (B = od(G, L, y));\n }(B = B && !w.fa) ? A = 1 : (A.a = W, A = 0);\n }\n if (!A) {\n zb(t, u);\n g = 0;\n break a;\n }\n }\n }\n q.ac = r;\n q.hc = u;\n q.Db = t;\n g = 1;\n }\n }\n }\n if (!g) {\n d.a = W;\n break;\n }\n if (l > 0) {\n if (h.xb = 1 << l, m = h.Yb, q = 1 << l, $(m != p), $(l > 0), m.ea = U(q, 0), m.ea == p ? l = 0 : (m.bb = 32 - l, l = 1), !l) {\n d.a = cb;\n g = 0;\n break;\n }\n } else h.xb = 0;\n l = d;\n m = a[0];\n q = b[0];\n r = l.cb;\n t = r.eb;\n l.l = m;\n l.v = q;\n r.Ec = Aa(m, t);\n r.Dc = t == 0 ? -1 : (1 << t) - 1;\n if (c) {\n d.Ob = Cb;\n break;\n }\n f = Array(a * b);\n l = 0;\n if (f == p) {\n d.a = cb;\n g = 0;\n break;\n }\n g = (g = lc(d, f, l, a, b, p)) && !k.fa;\n break;\n }\n g ? (e != p ? e[0] = f : ($(f == p), $(c)), c || bd(h)) : (bd(h), d.a == W && d.o.L && (d.a = Ie));\n return g;\n }\n\n function xd(a, b) {\n const c = a.l * a.v;\n const d = c + b + b * $c;\n $(a.l <= b);\n a.V = Array(d);\n a.Ha = 0;\n if (a.V == p) {\n return a.Xa = p, a.a = cb, 0;\n }\n a.Xa = a.V;\n a.vb = a.Ha + c + b;\n return 1;\n }\n\n function mf(a, b) {\n var c = b - a.O;\n var d = a.V;\n var e = a.Ha + a.l * a.O;\n if (!(c <= 0)) {\n ze(a, c, d, e);\n for (var e = a.N.width, c = e * c, d = a.N.ka, e = a.N.fd + e * a.O, g = a.Xa, k = a.vb, h = s, h = 0; h < c; ++h) d[e + h] = g[k + h] >>> 8 & 255;\n a.O = a.xa = b;\n }\n }\n\n function ng(a, b) {\n const c = [s];\n const d = [s];\n const e = [s];\n if (a == p) return 0;\n if (b == p) return a.a = ta, 0;\n a.N = b;\n a.a = L;\n Rb(a.o, b.data, b.b, b.e);\n if (!ue(a.o, c, d, e)) return a.a = W, sa(a), $(a.a != L), 0;\n a.Ob = cd;\n b.width = c[0];\n b.height = d[0];\n a.Wa = Cb;\n return !Ka(c[0], d[0], 1, a, p) ? (sa(a), $(a.a != L), 0) : 1;\n }\n\n function og(a) {\n let b = p;\n let c = p;\n if (a == p) return 0;\n b = a.N;\n $(b != p);\n c = b.ka;\n $(c != p);\n a.Ib = c.j;\n a.Hc = c.Hc;\n $(a.Ib != p);\n if (!Ne(c.Qa, b, Pa)) return a.a = ta, sa(a), $(a.a != L), 0;\n if (!xd(a, b.width) || b.I && !AllocateAndInitRescaler(a, b)) return sa(a), $(a.a != L), 0;\n a.Wa = Db;\n if (!lc(a, a.V, a.Ha, a.l, a.v, Yf)) return sa(a), $(a.a != L), 0;\n c.ec = a.xa;\n sa(a);\n return 1;\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, C, w, z) {\n let y; const G = C - 1 >> 1;\n let F = e[g + 0] | k[h + 0] << 16;\n let B = f[l + 0] | m[t + 0] << 16;\n if (a) {\n var D = 3 * F + B + 131074 >> 2;\n w(a[b + 0], D & 255, D >> 16, q, r);\n }\n c && (D = 3 * B + F + 131074 >> 2, w(c[d + 0], D & 255, D >> 16, u, v));\n for (y = 1; y <= G; ++y) {\n const J = e[g + y] | k[h + y] << 16;\n const L = f[l + y] | m[t + y] << 16;\n var D = F + J + B + L + 524296;\n const O = D + 2 * (J + B) >> 3;\n const H = D + 2 * (F + L) >> 3;\n a && (D = O + F >> 1, F = H + J >> 1, w(a[b + 2 * y - 1], D & 255, D >> 16, q, r + (2 * y - 1) * z), w(a[b + 2 * y - 0], F & 255, F >> 16, q, r + (2 * y - 0) * z));\n c && (D = H + B >> 1, F = O + L >> 1, w(c[d + 2 * y - 1], D & 255, D >> 16, u, v + (2 * y - 1) * z), w(c[d + 2 * y + 0], F & 255, F >> 16, u, v + (2 * y + 0) * z));\n F = J;\n B = L;\n }\n C & 1 || (a && (D = 3 * F + B + 131074 >> 2, w(a[b + C - 1], D & 255, D >> 16, q, r + (C - 1) * z)), c && (D = 3 * B + F + 131074 >> 2, w(c[d + C - 1], D & 255, D >> 16, u, v + (C - 1) * z)));\n }\n\n function pg(a,\n b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, hc, 3);\n }\n\n function qg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, Vc, 3);\n }\n\n function Oe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, pe, 4);\n }\n\n function Pe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, oe, 4);\n }\n\n function Qe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, me, 4);\n }\n\n function Re(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h,\n f, l, m, t, q, r, u, v, w, ne, 2);\n }\n\n function rg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, le, 2);\n }\n\n function Ca(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u) {\n let v;\n for (v = 0; v < q - 1; v += 2) r(a[b + 0], e[g + 0], k[h + 0], f, l), r(a[b + 1], e[g + 0], k[h + 0], f, l + u), r(c[d + 0], e[g + 0], k[h + 0], m, t), r(c[d + 1], e[g + 0], k[h + 0], m, t + u), b += 2, d += 2, g++, h++, l += 2 * u, t += 2 * u;\n v == q - 1 && (r(a[b + 0], e[g + 0], k[h + 0], f, l), r(c[d + 0], e[g + 0], k[h + 0], m, t));\n }\n\n function Se(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, pe, 4);\n }\n\n function Te(a, b, c, d, e, g, k, f, n, l,\n m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, oe, 4);\n }\n\n function Ue(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, me, 4);\n }\n\n function Ve(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, ne, 2);\n }\n\n function sg(a, b, c, d, e, g) {\n for (; e-- > 0;) {\n for (var k = a, f = b + (c ? 1 : 0), n = a, l = b + (c ? 0 : 3), m = s, m = 0; m < d; ++m) {\n var t = n[l + 4 * m];\n if (t != 255) {\n var t = 32897 * t;\n let q = k;\n let r = f + 4 * m + 0;\n k[f + 4 * m + 0] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 1;\n k[f + 4 * m + 1] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 2;\n k[f + 4 * m + 2] * t >>> 23;\n q[r] = ca;\n }\n }\n b += g;\n }\n }\n\n function tg(a, b) {\n const c = b.j.c.Va;\n const d = c.y;\n const e = c.D + a.w * c.F;\n const g = c.c;\n const k = c.B + (a.w >> 1) * c.nb;\n const f = c.S;\n const n = c.C + (a.w >> 1) * c.rb;\n const l = a.m;\n const m = a.h;\n const t = parseInt((l + 1) / 2, 10);\n const q = parseInt((m + 1) / 2, 10);\n let r;\n for (r = 0; r < m; ++r) N(d, e + r * c.F, a.y, a.D + r * a.F, l);\n for (r = 0; r < q; ++r) N(g, k + r * c.nb, a.c, a.B + r * a.Da, t), N(f, n + r * c.rb, a.S, a.C + r * a.Da, t);\n return a.h;\n }\n\n function ug(a, b) {\n var c = b.j;\n const d = c.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = a.y;\n let f = a.D;\n const n = a.c;\n let l = a.B;\n const m = a.S;\n let t = a.C;\n var c = vg[c.J];\n const q = a.m;\n const r = a.h - 1;\n let u;\n for (u = 0; u < r; u += 2) c(k, f, k, f + a.F, n, l, m, t, e, g, e, g + d.f, q), f += 2 * a.F, l += a.Da, t += a.Da, g += 2 * d.f;\n u == r && c(k, f, k, f, n, l, m, t, e, g, e, g, q);\n return a.h;\n }\n\n function wg(a, b) {\n let c = a.h;\n const d = b.j.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = V[b.j.J];\n const f = a.y;\n let n = a.D;\n const l = a.c;\n let m = a.B;\n const t = a.S;\n let q = a.C;\n let r = b.Qb;\n let u = b.Rb;\n let v = b.lc;\n let w = b.mc;\n let A = a.w;\n const z = a.w + a.h;\n const y = a.m;\n const D = parseInt((y + 1) / 2, 10);\n A == 0 ? k(p, p, f, n, l, m, t, q, l, m, t, q, p, p, e, g, y) : (k(b.Sb, b.Tb, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y), ++c);\n for (; A + 2 < z; A += 2) r = l, u = m, v = t, w = q, m += a.Da, q += a.Da, g += 2 * d.f, n += 2 * a.F, k(f, n - a.F, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y);\n n += a.F;\n a.k + z < a.K ? (N(b.Sb, b.Tb, f, n, 1 * y), N(b.Qb, b.Rb, l, m, 1 * D), N(b.lc, b.mc, t, q, 1 * D), c--) : z & 1 || k(f, n, p, p, l, m, t, q, l, m,\n t, q, e, g + d.f, p, p, y);\n return c;\n }\n\n function xg(a, b) {\n var c = a.p;\n var d = a.q;\n const e = b.j.c.Va;\n const g = a.m;\n const f = a.h;\n const h = e.p;\n let n = e.q + a.w * e.Fa;\n var c = a.p;\n var d = a.q;\n let l = s;\n if (c != p) for (l = 0; l < f; ++l) N(h, n, c, d, 1 * g), d += a.width, n += e.Fa;\n else if (e.p != p) for (l = 0; l < f; ++l) jd(h, n, 255, g), n += e.Fa;\n return 0;\n }\n\n function We(a, b, c) {\n let d = a.w;\n c[0] = a.h;\n a.Bb && (d == 0 ? --c[0] : (--d, b[0] -= a.width), a.k + a.w + a.h == a.K && (c[0] = a.K - a.k - d));\n return d;\n }\n\n function yg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n for (var e = a.m, g = b.j.J, f = g == Ab || g == Bb, h = b.j.c.RGBA, n = [s], l = We(a, d, n), d = d[0], m = h.ma, l = h.Sa + l * h.f,\n t = l + (f ? 0 : 3), q = 255, r = s, u = s, u = 0; u < n[0]; ++u) {\n for (r = 0; r < e; ++r) {\n const v = c[d + r];\n m[t + 4 * r] = v;\n q &= v;\n }\n d += a.width;\n t += h.f;\n }\n q != 255 && F(g) && WebPApplyAlphaMultiply(m, l, f, e, n, h.f);\n }\n return 0;\n }\n\n function zg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n const e = a.m;\n const g = b.j.J;\n const f = b.j.c.RGBA;\n const h = [s];\n var n = We(a, d, h);\n var d = d[0];\n const l = f.ma;\n var n = f.Sa + n * f.f;\n let m = n + 1;\n let t = 15;\n let q = s;\n for (j = 0; j < h[0]; ++j) {\n for (q = 0; q < e; ++q) {\n const r = c[d + q] >> 4;\n l[m + 2 * q] = l[m + 2 * q] & 240 | r;\n t &= r;\n }\n d += a.width;\n m += f.f;\n }\n t != 15 && F(g) && WebPApplyAlphaMultiply4444(l, n, e, h, f.f);\n }\n return 0;\n }\n\n function vd(a) {\n let b = a.ka;\n const c = b.j.J;\n const d = c\n < ua;\n const e = c == jb || c == Pa || c == Ab || c == kb || c == Ra || F(c);\n b.memory = p;\n b.$a = p;\n b.zb = p;\n b.ad = p;\n if (!Ne(b.Qa, a, e ? ua : Ra)) return 0;\n if (a.I) {\n if (!(d ? InitRGBRescaler(a, b) : InitYUVRescaler(a, b))) return alert('memory error #1'), 0;\n } else {\n if (d) {\n if (b.$a = ug, a.Bb) {\n const g = a.m + 1 >> 1;\n const f = a.m + 2 * g;\n let h; const\n n = [];\n for (h = 0; h < f; ++h) n.push(205);\n n.push(0);\n b.memory = n;\n if (b.memory == p) return alert('memory error #2'), 0;\n b.Sb = b.memory;\n b.Tb = 0;\n b.Qb = b.Sb;\n b.Rb = b.Tb + a.m;\n b.lc = b.Qb;\n b.mc = b.Rb + g;\n b.$a = wg;\n V[Qa] = pg;\n V[jb] = Oe;\n V[Zc] = qg;\n V[Pa] = Pe;\n V[Ab] = Qe;\n V[kb] = Re;\n V[Fe] = rg;\n }\n } else {\n b.$a = tg;\n }\n e && (F(c) && (WebPApplyAlphaMultiply = sg, V[Ob] = Oe, V[Pb] = Pe, V[Bb] = Qe, V[Qb] = Re), b.zb = c == kb || c == Qb ? zg : d ? yg : xg);\n }\n if (d && !Xe) {\n for (a = 0; a < 256; ++a) Za[a] = 89858 * (a - 128) + Jb >> ea, wb[a] = -22014 * (a - 128) + Jb, vb[a] = -45773 * (a - 128), xb[a] = 113618 * (a - 128) + Jb >> ea;\n for (a = J; a < dd; ++a) b = 76283 * (a - 16) + Jb >> ea, ia[a - J] = wa(b, 255), Hb[a - J] = wa(b + 8 >> 4, 15);\n Xe = 1;\n }\n return 1;\n }\n\n function ud(a) {\n const b = a.ka;\n let c = a.m;\n const d = a.h;\n $(!(a.w & 1));\n if (c <= 0 || d <= 0) return 0;\n c = b.$a(a, b);\n b.ec += c;\n b.zb && b.zb(a, b);\n return 1;\n }\n\n function wd(a) {\n a = a.ka;\n a.memory = '';\n a.memory = p;\n }\n\n function ed(a,\n b) {\n return a[b + 0] | a[b + 1] << 8 | a[b + 2] << 16;\n }\n\n function Kb(a, b) {\n return (ed(a, b) | a[b + 3] << 24) >>> 0;\n }\n\n function Ye(a, b, c, d, e, g, f) {\n var h = 0;\n var n = [0];\n var l = 'VP8StatusCode';\n const m = M(Gc);\n if (a == p || c[0] < Lb) return Z;\n m.data = a;\n m.b = [b[0]];\n m.e = [c[0]];\n m.na = [m.na];\n a: {\n h = m.na;\n $(a != p);\n $(c != p);\n $(h != p);\n h[0] = 0;\n if (c[0] >= Lb && !kd(a, b[0], 'RIFF', O)) {\n if (kd(a, b[0] + 8, 'WEBP', O)) {\n l = W;\n break a;\n }\n var t = Kb(a, b[0] + O);\n if (t < O + R) {\n l = W;\n break a;\n }\n h[0] = t;\n b[0] += Lb;\n c[0] -= Lb;\n } else h[0] = 0;\n l = L;\n }\n m.na = m.na[0];\n if (l != L) return l;\n h = m.na > 0;\n t = [0];\n a: if (l = R + fd, $(a != p), $(c != p), $(n != p), n[0] = 0, c[0] < R) l = Z;\n else {\n if (!kd(a, b[0], 'VP8X', O)) {\n var q = s;\n var r = s;\n var u = E;\n if (Kb(a, b[0] + O) != fd) {\n l = W;\n break a;\n }\n if (c[0] < l) {\n l = Z;\n break a;\n }\n u = Kb(a, b[0] + 8);\n q = 1 + ed(a, b[0] + 12);\n r = 1 + ed(a, b[0] + 15);\n if (q * r >= Ag) {\n l = W;\n break a;\n }\n t != p && (t[0] = u);\n d != p && (d[0] = q);\n e != p && (e[0] = r);\n b[0] += l;\n c[0] -= l;\n n[0] = 1;\n }\n l = L;\n }\n if (l != L) return l;\n if (!h && n[0]) return W;\n g != p && (g[0] = !!(t[0] & Bg));\n if (n && f == p) return L;\n if (c < O) return Z;\n if (h && n[0] || !h && !n[0] && !kd(a, b[0], 'ALPH', O)) {\n m.$ = [m.$];\n m.G = [m.G];\n m.pa = [m.pa];\n a: {\n var n = m.na;\n var h = m.$;\n var t = m.G;\n var l = m.pa;\n var q = x;\n var r = 0;\n var u = Mb;\n let v = O + R + fd;\n $(a != p);\n $(c != p);\n q = a;\n r = b[0];\n u = c[0];\n $(h != p);\n $(l != p);\n h[0] = p;\n t[0] = p;\n for (l[0] = 0; ;) {\n let w = E;\n let y = E;\n b[0] = r;\n c[0] = u;\n if (u < R) {\n l = Z;\n break a;\n }\n w = Kb(q, r + O);\n y = R + w + 1 & -2;\n v += y;\n if (n > 0 && v > n) {\n l = W;\n break a;\n }\n if (u < y) {\n l = Z;\n break a;\n }\n if (kd(q, r, 'ALPH', O)) {\n if (!kd(q, r, 'VP8 ', O) || !kd(q, 'VP8L', O)) {\n l = L;\n break a;\n }\n } else h[0] = q, t[0] = r + R, l[0] = w;\n r += y;\n u -= y;\n }\n l = ca;\n }\n m.$ = m.$[0];\n m.G = m.G[0];\n m.pa = m.pa[0];\n if (l != L) return l;\n }\n m.ta = [m.ta];\n m.ia = [m.ia];\n a: if (n = m.na, h = m.ta, t = m.ia, r = !kd(a, b[0], 'VP8 ', O), l = !kd(a, b[0], 'VP8L', O), q = O + R, $(a != p), $(c != p), $(h != p), $(t != p), c[0] < R) l = Z;\n else {\n if (r || l) {\n r = Kb(a, b[0] + O);\n if (n >= q && r > n - q) {\n l = W;\n break a;\n }\n h[0] = r;\n b[0] += R;\n c[0] -= R;\n t[0] = l;\n } else t[0] = c >= 1 && a[b + 0] == ve, h[0] = c[0];\n l = L;\n }\n m.ta = m.ta[0];\n m.ia = m.ia[0];\n if (l != L) return l;\n if (m.ta > Ze) return W;\n if (m.ia) {\n if (c[0] < $e) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n t = g ? g[0] : p;\n a == p || h < $e ? a = 0 : (l = [s], q = [s], r = [s], u = M(af), Rb(u, a, n, h), ue(u, l, q, r) ? (d != p && (d[0] = l[0]), e != p && (e[0] = q[0]), t != p && (t[0] = r[0]), a = 1) : a = 0);\n } else {\n if (c < bf) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n !(a == p || h < bf) && h - 3 >= 3 && a[n + 3 + 0] == 157 && a[n\n + 3 + 1] == 1 && a[n + 3 + 2] == 42 ? (h = a[n + 0] | a[n + 1] << 8 | a[n + 2] << 16, t = (a[n + 7] << 8 | a[n + 6]) & 16383, a = (a[n + 9] << 8 | a[n + 8]) & 16383, !(!(h & 1) + 0) || (h >> 1 & 7) > 3 || !(h >> 4 & 1) || h >> 5 >= m.ta ? a = 0 : (d && (d[0] = t), e && (e[0] = a), a = 1)) : a = 0;\n }\n if (!a) return W;\n g != p && (g[0] |= m.$ != p);\n f != p && (f[0] = m, f[0].offset = b[0] - f[0].b, $(b[0] - f[0].b < Ze), $(f[0].offset == f[0].e - c[0]));\n return L;\n }\n\n function Kd(a) {\n $(a != p);\n return Ye(a[0].data, a[0].b, a[0].e, p, p, p, a);\n }\n\n function cf(a, b, c, d) {\n let e = 'VP8StatusCode';\n const g = M(Vb);\n let f = M(Gc);\n f.data = a;\n f.b = b;\n f.e = c;\n f.b = [f.b];\n f.e = [f.e];\n f = [f];\n e = Kd(f);\n if (e\n != L) return e;\n f = f[0];\n f.b = f.b[0];\n f.e = f.e[0];\n $(d != p);\n td(na);\n g.data = f.data;\n g.b = b + f.offset;\n g.e = f.e - f.offset;\n g.put = ud;\n g.Mb = vd;\n g.Pb = wd;\n g.ka = d;\n if (f.ia) {\n a = sd();\n if (a == p) return cb;\n ng(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !og(a) && (e = a.a)) : e = a.a;\n a != p && sa(a);\n } else {\n e = M(Cg);\n e != p && (Gd(e), e.za = 0, e.Hb = 1);\n a = e;\n if (a == p) return cb;\n a.qb = 0;\n a.Ga = f.$;\n a.G = f.G;\n a.ub = f.pa;\n Hd(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !Mf(a, g) && (e = a.a)) : e = a.a;\n a != p && ke(a);\n }\n e != L && (self || this).Yc(d.j);\n return e;\n }\n\n function lb(a, b, c, d, e) {\n const g = {\n value: 0,\n };\n c = {\n value: c,\n };\n const f = M(df);\n const h = M(gd);\n f.j = h;\n h.J = a;\n const n = {\n value: h.width,\n };\n const l = {\n value: h.height,\n };\n let m;\n m = c;\n const t = M(ef);\n hd(b, g, m, t) != L ? m = 0 : (n != p && (n.value = t.width), l != p && (l.value = t.height), m = 1);\n if (!m) return p;\n h.width = n.value;\n h.height = l.value;\n d != p && (d.value = h.width.value);\n e != p && (e.value = h.height.value);\n return cf(b, g.value, c.value, f) != L ? p : a < ua ? h.c.RGBA.ma : h.c.Va.y;\n }\n\n function hd(a, b, c, d) {\n if (d == p || a == p) return ta;\n $(d != p);\n d.tc = 0;\n d.width = [d.width];\n d.height = [d.height];\n d.$b = [d.$b];\n return Ye(a, b, c, d.width, d.height, d.$b, p);\n }\n\n function Ne(a,\n b, c) {\n const d = b.width;\n const e = b.height;\n let g = 0;\n let f = 0;\n let h = d;\n let n = e;\n b.Ua = a != p && a.Ua > 0;\n if (b.Ua && (h = a.wc, n = a.vc, g = a.t, f = a.k, c < ua || (g &= -2, f &= -2), g < 0 || f < 0 || h <= 0 || n <= 0 || g + h > d || f + n > e)) return 0;\n b.t = g;\n b.k = f;\n b.Ka = g + h;\n b.K = f + n;\n b.m = h;\n b.h = n;\n b.I = a != p && a.I > 0;\n if (b.I) {\n if (a.Ba <= 0 || a.Aa <= 0) return 0;\n b.Ba = a.Ba;\n b.Aa = a.Aa;\n }\n b.Za = a && a.Za;\n b.Bb = a == p || !a.ed;\n b.I && (b.Za = b.Ba < 3 * d / 4 && b.Aa < 3 * e / 4, b.Bb = 0);\n return 1;\n }\n var na = 512;\n var Qa = 0;\n var jb = 1;\n var Zc = 2;\n var Pa = 3;\n var Ab = 4;\n var kb = 5;\n var Fe = 6;\n var Ob = 7;\n var Pb = 8;\n var Bb = 9;\n var Qb = 10;\n var ua = 11;\n var Ra = 12;\n var Cc = 13;\n this.WEBP_CSP_MODE = this.Cd = {\n nd: 0,\n od: 1,\n kd: 2,\n ld: 3,\n jd: 4,\n pd: 5,\n qd: 6,\n rd: 7,\n sd: 8,\n md: 9,\n };\n var gd = {\n J: 'WEBP_CSP_MODE',\n width: s,\n height: s,\n Fc: s,\n c: {\n RGBA: {\n ma: x,\n Sa: 0,\n f: s,\n size: Mb,\n },\n Va: {\n y: x,\n c: x,\n S: x,\n p: x,\n D: x,\n B: x,\n C: x,\n q: x,\n F: s,\n nb: s,\n rb: s,\n Fa: s,\n Wc: Mb,\n Rc: Mb,\n Uc: Mb,\n Wb: Mb,\n },\n },\n Ic: U(4, E),\n Jb: p,\n jc: x,\n };\n var L = 0;\n var cb = 1;\n var ta = 2;\n var W = 3;\n var Hf = 4;\n var Ie = 5;\n var Nf = 6;\n var Z = 7;\n this.VP8StatusCode = this.td = {\n xd: 0,\n yd: 1,\n vd: 2,\n ud: 3,\n Ad: 4,\n zd: 5,\n Bd: 6,\n wd: 7,\n };\n var ef = {\n width: {\n value: s,\n },\n height: {\n value: s,\n },\n $b: {\n value: s,\n },\n tc: s,\n Yd: s,\n rotate: s,\n be: s,\n Ic: U(3, E),\n };\n this.WebPGetFeatures = this.Md = function (a, b, c) {\n let d = 'VP8StatusCode';\n na >>> 8 != na >>> 8 || c == p ? a = ta : (b = [b], d = hd(a, [0], b, c), a = d == Z ? W : d);\n return a;\n };\n const ff = {\n Za: s,\n ed: s,\n Ua: s,\n t: s,\n k: s,\n wc: s,\n vc: s,\n I: s,\n Ba: s,\n Aa: s,\n ae: s,\n Td: s,\n Xd: s,\n Ic: U(6, E),\n };\n this.WebPDecoderConfig = this.Kd = {\n input: M(ef),\n j: M(gd),\n options: M(ff),\n };\n this.WebPInitDecoderConfig = this.Nd = function (a) {\n na >>> 8 != na >>> 8 || a == p ? a = 0 : (a = a.input, $(a != p), a.tc = 0, a = 1);\n return a;\n };\n var Vb = {\n width: s,\n height: s,\n w: s,\n m: s,\n h: s,\n y: x,\n c: x,\n S: x,\n D: 0,\n B: 0,\n C: 0,\n F: s,\n Da: s,\n ka: 0,\n put: 0,\n Mb: 0,\n Pb: 0,\n Bb: s,\n e: Mb,\n data: x,\n b: 0,\n Za: s,\n Ua: s,\n t: s,\n Ka: s,\n k: s,\n K: s,\n I: s,\n Ba: s,\n Aa: s,\n p: x,\n q: 0,\n };\n var df = {\n j: M(gd),\n Sb: x,\n Qb: x,\n lc: x,\n Tb: 0,\n Rb: 0,\n mc: 0,\n ec: s,\n Qa: M(ff),\n memory: 0,\n $a: '(OutputFunc)',\n zb: '(OutputFunc)',\n ad: '(OutputRowFunc)',\n };\n var Gc = {\n data: x,\n b: x,\n e: Mb,\n offset: Mb,\n $: p,\n G: x,\n pa: Mb,\n ta: Mb,\n na: Mb,\n ia: s,\n };\n var Fc = {\n qa: x,\n Ia: p,\n Pd: x,\n Ab: s,\n la: E,\n Z: E,\n gc: s,\n };\n var af = {\n T: bb,\n qa: x,\n Ia: x,\n ya: Mb,\n Q: Mb,\n g: s,\n L: s,\n fa: s,\n };\n var gf = 25;\n var hf = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215];\n var bf = 10;\n var ve = 47;\n var we = 14;\n var Wf = 3;\n var $e = 5;\n var fg = 11;\n var Yc = 5;\n var qe = 4278190080;\n var jg = 8;\n var Tb = 15;\n var Ba = 256;\n var Ge = 24;\n var Je = 4;\n var Be = 0;\n var De = 1;\n var Ae = 2;\n var Ee = 3;\n var Ub = 1;\n var kc = 0;\n var kf = 1;\n var rd = 1;\n var O = 4;\n var R = 8;\n var Lb = 12;\n var fd = 10;\n var Bg = 16;\n var Ag = 1 * Math.pow(2, 32);\n var Ze = -1 - R - 1 >>> 0;\n var jf = {\n kc: s,\n s,\n };\n var Le = {\n Y: 'HuffmanTreeNode*',\n gb: s,\n Pa: s,\n };\n var pd = -1;\n const Dg = {\n ea: E,\n bb: s,\n };\n var ad = 506832829;\n var $b = 0;\n var ge = $b;\n var fe = 2;\n var ee = 3;\n var de = 1;\n var Ef = 4;\n var Df = 5;\n var Cf = 6;\n var Ld = 3;\n var xa = 4;\n var Hc = 4;\n var Gf = 4;\n var Md = 4;\n var Nd = 8;\n var Kc = 3;\n var Lc = 11;\n var f = 32;\n var Pf = 17 * f + 9 * f;\n var Tc = 1 * f + 8;\n var Uc = Tc + 16 * f + f;\n var he = Uc + 16;\n var Id = {\n fb: x,\n Jc: x,\n Nc: x,\n Ra: E,\n };\n var Jd = {\n l: 0,\n v: 0,\n gd: x,\n hd: x,\n uc: x,\n $c: x,\n };\n const Eg = {\n pb: s,\n ob: s,\n tb: s,\n Kb: U(xa, 0),\n Cb: U(xa, 0),\n };\n const Fg = {\n Ta: U(Ld, x),\n z: md([Md, Nd, Kc, Lc], x),\n };\n const Gg = {\n Oc: s,\n Fb: s,\n kb: s,\n oc: s,\n Lc: U(Hc, s),\n Gc: U(Hc, s),\n };\n var Oc = {\n zc: s,\n yc: s,\n ab: s,\n };\n var Qd = {\n X: s,\n ua: s,\n Nb: s,\n };\n const id = U(2, s);\n const Hg = {\n sc: M(id),\n sb: M(id),\n qc: M(id),\n };\n const Ig = {\n ha: s,\n d: s,\n W: s,\n M: Oc,\n N: Vb,\n };\n var Cg = {\n a: 'VP8StatusCode',\n za: s,\n xc: 0,\n o: M(Fc),\n Ac: M(Id),\n P: M(Jd),\n ga: M(Gg),\n Ca: M(Eg),\n rc: 'WebPWorker',\n qb: s,\n Ja: s,\n jb: s,\n oa: Ig,\n Ma: s,\n hb: s,\n lb: s,\n mb: s,\n wb: s,\n Ya: s,\n Hb: s,\n ic: ld(8, Fc),\n Zc: E,\n yb: ld(xa, Hg),\n R: M(Fg),\n pc: s,\n Pc: x,\n dc: x,\n cc: U(4, x),\n Xc: x,\n Sc: x,\n Vc: x,\n La: M(Qd),\n M: M(Oc),\n Ea: x,\n z: 0,\n ca: x,\n aa: x,\n ra: x,\n da: s,\n ba: s,\n sa: s,\n H: s,\n r: s,\n ib: 0,\n Gb: Mb,\n i: s,\n d: s,\n wa: x,\n Eb: U(16, x),\n Vd: 0,\n Tc: x,\n Lb: x,\n ja: E,\n Oa: E,\n A: s,\n W: s,\n Zb: U(xa, x),\n Ga: p,\n G: 0,\n ub: Mb,\n Xb: x,\n Od: 0,\n cd: s,\n dd: x,\n Wd: 0,\n fc: Mb,\n };\n var Db = 0;\n var Cb = 1;\n var cd = 2;\n const Jg = {\n Qc: 'VP8LImageTransformType',\n n: s,\n U: s,\n Vb: s,\n u: E,\n b: E,\n };\n var gg = {\n va: ld(Yc, Le),\n };\n const Kg = {\n xb: s,\n Yb: M(Dg),\n Dc: s,\n eb: s,\n Ec: s,\n ac: E,\n bd: E,\n hc: s,\n Db: 'HTreeGroup',\n };\n var eg = {\n a: 'VP8StatusCode',\n Wa: 'VP8LDecodeState',\n Ob: 'VP8LDecodeState',\n N: 'VP8Io',\n Ib: 'WebPDecBuffer',\n Hc: 'WebPDecBuffer',\n V: E,\n Ha: E,\n Xa: E,\n vb: E,\n o: M(af),\n l: s,\n v: s,\n O: s,\n xa: s,\n cb: M(Kg),\n Na: s,\n nc: ld(Je, Jg),\n Ub: E,\n Mc: x,\n $d: x,\n Zd: '*WebPRescaler',\n };\n var lf = 4;\n var nf = [p, function (a, b, c, d, e, g, f, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(f != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(g >= c * e);\n for (n = 0; n < d; ++n) {\n n == 0 ? N(f, h, a, b, e) : Ea(a, b, f, l - g, f, h, e), Ea(a, b + e, f, l, f, h + e, e * (c - 1)),\n l += g, b += g, h += g;\n }\n }, function (a, b, c, d, e, f, k, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, l, k, h + e, e * (c - 1));\n for (n = 1; n < d; ++n) b += f, h += f, Ea(a, b, k, l, k, h, e * c), l += f;\n }, function (a, b, c, d, e, f, k, h) {\n var n = h;\n let l = s;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, n, k, h + e, e * (c - 1));\n for (l = 1; l < d; ++l) {\n let m = s;\n var n = n + f;\n b += f;\n h += f;\n Ea(a, b, k, n - f, k, h, e);\n for (m = e; m < c * e; ++m) {\n const t = k[n + m - e] + k[n + m - f] - k[n + m - f - e];\n k[h + m] = a[b + m] + (t < 0 ? 0 : t > 255 ? 255 : t) & 255;\n }\n }\n }];\n var yd = [3, 4, 3, 4, 4, 2, 2, 4, 4, 4,\n 2, 1, 1,\n ];\n this.WebPFreeDecBuffer = this.Yc = function (a) {\n a != p && (a.Fc || (a.Jb = ''), a.jc = 0, a.Jb = a.jc = p);\n };\n self = this;\n var va = U(511, x);\n var tc = U(511, x);\n var sc = U(2041, 0);\n var oc = U(225, 0);\n var oa = U(766, x);\n var Rd = 0;\n var Xb = 85627;\n var Wb = 35468;\n var Uf = [function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 4; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n c >>= 3;\n for (d = 0; d < 4; ++d) jd(a, b + d * f, c, 4);\n }, function (a, b) {\n Dc(a, b, 4);\n }, function (a, b) {\n let c = b - f;\n const d = [];\n d.push(y(a[c - 1], a[c + 0], a[c + 1]));\n d.push(y(a[c + 0], a[c + 1], a[c + 2]));\n d.push(y(a[c + 1], a[c + 2], a[c + 3]));\n d.push(y(a[c + 2], a[c + 3], a[c + 4]));\n for (c = 0; c < 4; ++c) N(a, b + c * f, d, 0, 4);\n },\n function (a, b) {\n const c = a[b - 1];\n const d = a[b - 1 + f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = a[b + 1 + 0 * f] = a[b + 2 + 0 * f] = a[b + 3 + 0 * f] = y(a[b - 1 - f], c, d);\n a[b + 0 + 1 * f] = a[b + 1 + 1 * f] = a[b + 2 + 1 * f] = a[b + 3 + 1 * f] = y(c, d, e);\n a[b + 0 + 2 * f] = a[b + 1 + 2 * f] = a[b + 2 + 2 * f] = a[b + 3 + 2 * f] = y(d, e, g);\n a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = y(e, g, g);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 3 * f] = y(d, e, a[b - 1 + 3 * f]);\n a[b + 0 + 2 * f] = a[b + 1 + 3 * f] = y(c, d, e);\n a[b + 0 + 1 * f] = a[b + 1 + 2 * f] = a[b + 2 + 3 * f] = y(g, c, d);\n a[b\n + 0 + 0 * f] = a[b + 1 + 1 * f] = a[b + 2 + 2 * f] = a[b + 3 + 3 * f] = y(k, g, c);\n a[b + 1 + 0 * f] = a[b + 2 + 1 * f] = a[b + 3 + 2 * f] = y(h, k, g);\n a[b + 2 + 0 * f] = a[b + 3 + 1 * f] = y(n, h, k);\n a[b + 3 + 0 * f] = y(l, n, h);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 0 * f] = a[b + 1 + 2 * f] = g + k + 1 >> 1;\n a[b + 1 + 0 * f] = a[b + 2 + 2 * f] = k + h + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 3 + 2 * f] = h + n + 1 >> 1;\n a[b + 3 + 0 * f] = n + l + 1 >> 1;\n a[b + 0 + 3 * f] = y(e, d, c);\n a[b + 0 + 2 * f] = y(d, c, g);\n a[b + 0 + 1 * f] = a[b + 1 + 3 * f] = y(c, g, k);\n a[b + 1 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 2 + 1 * f] = a[b + 3 + 3 * f] = y(k, h, n);\n a[b + 3 + 1 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b + 1 - f];\n const d = a[b + 2 - f];\n const e = a[b + 3 - f];\n const g = a[b + 4 - f];\n const k = a[b + 5 - f];\n const h = a[b + 6 - f];\n const n = a[b + 7 - f];\n a[b + 0 + 0 * f] = y(a[b + 0 - f], c, d);\n a[b + 1 + 0 * f] = a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 2 + 0 * f] = a[b + 1 + 1 * f] = a[b + 0 + 2 * f] = y(d, e, g);\n a[b + 3 + 0 * f] = a[b + 2 + 1 * f] = a[b + 1 + 2 * f] = a[b + 0 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 2 * f] = a[b + 1 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = a[b + 2 + 3 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, n);\n },\n function (a, b) {\n const c = a[b + 0 - f];\n const d = a[b + 1 - f];\n const e = a[b + 2 - f];\n const g = a[b + 3 - f];\n const k = a[b + 4 - f];\n const h = a[b + 5 - f];\n const n = a[b + 6 - f];\n const l = a[b + 7 - f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 1 + 0 * f] = a[b\n + 0 + 2 * f] = d + e + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 1 + 2 * f] = e + g + 1 >> 1;\n a[b + 3 + 0 * f] = a[b + 2 + 2 * f] = g + k + 1 >> 1;\n a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 1 + 1 * f] = a[b + 0 + 3 * f] = y(d, e, g);\n a[b + 2 + 1 * f] = a[b + 1 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n const k = a[b - 1 - f];\n const h = a[b + 0 - f];\n const n = a[b + 1 - f];\n const l = a[b + 2 - f];\n a[b + 0 + 0 * f] = a[b + 2 + 1 * f] = c + k + 1 >> 1;\n a[b + 0 + 1 * f] = a[b + 2 + 2 * f] = d + c + 1 >> 1;\n a[b + 0 + 2 * f] = a[b + 2 + 3 * f] = e + d + 1 >> 1;\n a[b + 0 + 3 * f] = g + e + 1 >> 1;\n a[b + 3 + 0 * f] = y(h, n, l);\n a[b + 2 + 0 * f] = y(k, h, n);\n a[b\n + 1 + 0 * f] = a[b + 3 + 1 * f] = y(c, k, h);\n a[b + 1 + 1 * f] = a[b + 3 + 2 * f] = y(d, c, k);\n a[b + 1 + 2 * f] = a[b + 3 + 3 * f] = y(e, d, c);\n a[b + 1 + 3 * f] = y(g, e, d);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 0 + 1 * f] = d + e + 1 >> 1;\n a[b + 2 + 1 * f] = a[b + 0 + 2 * f] = e + g + 1 >> 1;\n a[b + 1 + 0 * f] = y(c, d, e);\n a[b + 3 + 0 * f] = a[b + 1 + 1 * f] = y(d, e, g);\n a[b + 3 + 1 * f] = a[b + 1 + 2 * f] = y(e, g, g);\n a[b + 3 + 2 * f] = a[b + 2 + 2 * f] = a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = g;\n },\n ];\n var Vf = [function (a, b) {\n let c = 16;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f] + a[b + d - f];\n Yb(c >> 5, a, b);\n }, function (a,\n b) {\n Dc(a, b, 16);\n }, function (a, b) {\n let c;\n for (c = 0; c < 16; ++c) N(a, b + c * f, a, b - f, 16);\n }, function (a, b) {\n let c;\n for (c = 16; c > 0; --c) jd(a, b + 0, a[b - 1], 16), b += f;\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b + d - f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n Yb(128, a, b);\n }];\n var je = [function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n Zb(1 * (c >> 4), a, b);\n }, function (a, b) {\n Dc(a, b, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) N(a, b + c * f, a, b - f, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) {\n jd(a,\n b + 0, a[b - 1], 8), b += f;\n }\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b - 1 + d * f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n Zb(128, a, b);\n }];\n let mc; let Pc; let Qc; let Rc; let Sd; let Td; let Ud; let Vd; let Wd; let Xd; let Yd; let Zd; let $d; let ae; let be; let ce; var Pd = 31;\n var uc = [0, 2, 8];\n var Od = 3;\n var Of = 1;\n var ie = [0 + 0 * f, 4 + 0 * f, 8 + 0 * f, 12 + 0 * f, 0 + 4 * f, 4 + 4 * f, 8 + 4 * f, 12 + 4 * f, 0 + 8 * f, 4 + 8 * f, 8 + 8 * f, 12 + 8 * f, 0 + 12 * f, 4 + 12 * f, 8 + 12 * f, 12 + 12 * f];\n var Ic = [4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38,\n 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157,\n ];\n var Jc = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96,\n 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,\n ];\n var Sf = [-$b, 1, -1, 2, -2, 3, 4, 6, -3, 5, -4, -5, -6, 7, -7, 8, -8, -9];\n var Ff = [\n [\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128],\n [189, 129, 242, 255, 227, 213, 255, 219, 128, 128,\n 128,\n ],\n [106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128],\n ],\n [\n [1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128],\n [181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128],\n [78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128],\n ],\n [\n [1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128],\n [184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128],\n [77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128],\n ],\n [\n [1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128],\n [170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128],\n [37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128],\n ],\n [\n [1, 204, 254, 255, 245, 255, 128, 128, 128, 128,\n 128,\n ],\n [207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128],\n [102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128],\n ],\n [\n [1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128],\n [177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128],\n [80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62],\n [131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1],\n [68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128],\n ],\n [\n [1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128],\n [184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128],\n [81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128],\n ],\n [\n [1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128],\n [99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128],\n [23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128],\n ],\n [\n [1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128],\n [109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128],\n [44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128],\n ],\n [\n [1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128],\n [94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128],\n [22,\n 100, 174, 245, 186, 161, 255, 199, 128, 128, 128,\n ],\n ],\n [\n [1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128],\n [124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128],\n [35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128],\n ],\n [\n [1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128],\n [121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128],\n [45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128],\n ],\n [\n [1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128],\n [203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n [137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128],\n [175, 13,\n 224, 243, 193, 185, 249, 198, 255, 255, 128,\n ],\n [73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128],\n ],\n [\n [1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128],\n [239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128],\n [155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128],\n ],\n [\n [1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128],\n [201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128],\n [69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128],\n ],\n [\n [1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128],\n [223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128],\n [141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 16, 248, 255,\n 255, 128, 128, 128, 128, 128, 128,\n ],\n [190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128],\n [149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128],\n [213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128],\n [55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128,\n 128, 128, 128, 128, 128, 128, 128,\n ],\n ],\n ],\n [\n [\n [202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255],\n [126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128],\n [61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128],\n ],\n [\n [1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128],\n [166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128],\n [39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128],\n ],\n [\n [1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128],\n [124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128],\n [24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128],\n ],\n [\n [1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128],\n [149, 150, 226, 252, 216,\n 205, 255, 171, 128, 128, 128,\n ],\n [28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128],\n ],\n [\n [1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128],\n [123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128],\n [20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128],\n ],\n [\n [1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128],\n [168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128],\n [47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128],\n ],\n [\n [1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128],\n [141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128],\n [42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128,\n 128, 128, 128, 128,\n ],\n [244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n ];\n var Rf = [\n [\n [231, 120, 48, 89, 115, 113, 120, 152, 112],\n [152, 179, 64, 126, 170, 118, 46, 70, 95],\n [175, 69, 143, 80, 85, 82, 72, 155, 103],\n [56, 58, 10, 171, 218, 189, 17, 13, 152],\n [114, 26, 17, 163, 44, 195, 21, 10, 173],\n [121, 24, 80, 195, 26, 62, 44, 64, 85],\n [144, 71, 10, 38, 171, 213, 144, 34, 26],\n [170, 46, 55, 19, 136, 160, 33, 206, 71],\n [63, 20, 8, 114, 114, 208, 12, 9, 226],\n [81, 40, 11, 96, 182, 84, 29, 16, 36],\n ],\n [\n [134, 183, 89, 137, 98, 101, 106, 165, 148],\n [72, 187, 100, 130, 157, 111,\n 32, 75, 80,\n ],\n [66, 102, 167, 99, 74, 62, 40, 234, 128],\n [41, 53, 9, 178, 241, 141, 26, 8, 107],\n [74, 43, 26, 146, 73, 166, 49, 23, 157],\n [65, 38, 105, 160, 51, 52, 31, 115, 128],\n [104, 79, 12, 27, 217, 255, 87, 17, 7],\n [87, 68, 71, 44, 114, 51, 15, 186, 23],\n [47, 41, 14, 110, 182, 183, 21, 17, 194],\n [66, 45, 25, 102, 197, 189, 23, 18, 22],\n ],\n [\n [88, 88, 147, 150, 42, 46, 45, 196, 205],\n [43, 97, 183, 117, 85, 38, 35, 179, 61],\n [39, 53, 200, 87, 26, 21, 43, 232, 171],\n [56, 34, 51, 104, 114, 102, 29, 93, 77],\n [39, 28, 85, 171, 58, 165, 90, 98, 64],\n [34, 22, 116, 206, 23, 34, 43, 166, 73],\n [107, 54, 32, 26, 51, 1, 81, 43, 31],\n [68, 25, 106, 22,\n 64, 171, 36, 225, 114,\n ],\n [34, 19, 21, 102, 132, 188, 16, 76, 124],\n [62, 18, 78, 95, 85, 57, 50, 48, 51],\n ],\n [\n [193, 101, 35, 159, 215, 111, 89, 46, 111],\n [60, 148, 31, 172, 219, 228, 21, 18, 111],\n [112, 113, 77, 85, 179, 255, 38, 120, 114],\n [40, 42, 1, 196, 245, 209, 10, 25, 109],\n [88, 43, 29, 140, 166, 213, 37, 43, 154],\n [61, 63, 30, 155, 67, 45, 68, 1, 209],\n [100, 80, 8, 43, 154, 1, 51, 26, 71],\n [142, 78, 78, 16, 255, 128, 34, 197, 171],\n [41, 40, 5, 102, 211, 183, 4, 1, 221],\n [51, 50, 17, 168, 209, 192, 23, 25, 82],\n ],\n [\n [138, 31, 36, 171, 27, 166, 38, 44, 229],\n [67, 87, 58, 169, 82, 115, 26, 59, 179],\n [63, 59, 90, 180, 59, 166, 93, 73,\n 154,\n ],\n [40, 40, 21, 116, 143, 209, 34, 39, 175],\n [47, 15, 16, 183, 34, 223, 49, 45, 183],\n [46, 17, 33, 183, 6, 98, 15, 32, 183],\n [57, 46, 22, 24, 128, 1, 54, 17, 37],\n [65, 32, 73, 115, 28, 128, 23, 128, 205],\n [40, 3, 9, 115, 51, 192, 18, 6, 223],\n [87, 37, 9, 115, 59, 77, 64, 21, 47],\n ],\n [\n [104, 55, 44, 218, 9, 54, 53, 130, 226],\n [64, 90, 70, 205, 40, 41, 23, 26, 57],\n [54, 57, 112, 184, 5, 41, 38, 166, 213],\n [30, 34, 26, 133, 152, 116, 10, 32, 134],\n [39, 19, 53, 221, 26, 114, 32, 73, 255],\n [31, 9, 65, 234, 2, 15, 1, 118, 73],\n [75, 32, 12, 51, 192, 255, 160, 43, 51],\n [88, 31, 35, 67, 102, 85, 55, 186, 85],\n [56, 21, 23, 111, 59, 205, 45, 37, 192],\n [55, 38, 70, 124, 73, 102, 1, 34, 98],\n ],\n [\n [125, 98, 42, 88, 104, 85, 117, 175, 82],\n [95, 84, 53, 89, 128, 100, 113, 101, 45],\n [75, 79, 123, 47, 51, 128, 81, 171, 1],\n [57, 17, 5, 71, 102, 57, 53, 41, 49],\n [38, 33, 13, 121, 57, 73, 26, 1, 85],\n [41, 10, 67, 138, 77, 110, 90, 47, 114],\n [115, 21, 2, 10, 102, 255, 166, 23, 6],\n [101, 29, 16, 10, 85, 128, 101, 196, 26],\n [57, 18, 10, 102, 102, 213, 34, 20, 43],\n [117, 20, 15, 36, 163, 128, 68, 1, 26],\n ],\n [\n [102, 61, 71, 37, 34, 53, 31, 243, 192],\n [69, 60, 71, 38, 73, 119, 28, 222, 37],\n [68, 45, 128, 34, 1, 47, 11, 245, 171],\n [62, 17, 19, 70, 146, 85, 55, 62, 70],\n [37, 43, 37, 154, 100, 163, 85, 160,\n 1,\n ],\n [63, 9, 92, 136, 28, 64, 32, 201, 85],\n [75, 15, 9, 9, 64, 255, 184, 119, 16],\n [86, 6, 28, 5, 64, 255, 25, 248, 1],\n [56, 8, 17, 132, 137, 255, 55, 116, 128],\n [58, 15, 20, 82, 135, 57, 26, 121, 40],\n ],\n [\n [164, 50, 31, 137, 154, 133, 25, 35, 218],\n [51, 103, 44, 131, 131, 123, 31, 6, 158],\n [86, 40, 64, 135, 148, 224, 45, 183, 128],\n [22, 26, 17, 131, 240, 154, 14, 1, 209],\n [45, 16, 21, 91, 64, 222, 7, 1, 197],\n [56, 21, 39, 155, 60, 138, 23, 102, 213],\n [83, 12, 13, 54, 192, 255, 68, 47, 28],\n [85, 26, 85, 85, 128, 128, 32, 146, 171],\n [18, 11, 7, 63, 144, 171, 4, 4, 246],\n [35, 27, 10, 146, 174, 171, 12, 26, 128],\n ],\n [\n [190, 80, 35, 99, 180, 80,\n 126, 54, 45,\n ],\n [85, 126, 47, 87, 176, 51, 41, 20, 32],\n [101, 75, 128, 139, 118, 146, 116, 128, 85],\n [56, 41, 15, 176, 236, 85, 37, 9, 62],\n [71, 30, 17, 119, 118, 255, 17, 18, 138],\n [101, 38, 60, 138, 55, 70, 43, 26, 142],\n [146, 36, 19, 30, 171, 255, 97, 27, 20],\n [138, 45, 61, 62, 219, 1, 81, 188, 64],\n [32, 41, 20, 117, 151, 142, 20, 21, 163],\n [112, 19, 12, 61, 195, 128, 48, 4, 24],\n ],\n ];\n var If = [\n [\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 241,\n 252, 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255],\n [250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [225, 252, 241, 253, 255, 255, 254, 255,\n 255, 255, 255,\n ],\n [234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255,\n 255, 255, 255, 255, 255, 255,\n ],\n [252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n ],\n ],\n [\n [\n [186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255],\n [251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255,\n 255, 255,\n ],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 253, 255, 255, 255,\n 255, 255, 255, 255, 255,\n ],\n [253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 253,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n ];\n this.WebPGetDecoderVersion = this.Ld = function () {\n return 512;\n };\n var Nc = [0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0];\n var Jf = [\n [173, 148, 140, 0],\n [176, 155, 140, 135, 0],\n [180, 157, 141, 134, 130, 0],\n [254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0],\n ];\n var Kf = [0, 1, 4, 8, 5, 2, 3, 6,\n 9, 12, 13, 10, 7, 11, 14, 15,\n ];\n var Tf = md([Kc, Lc], '');\n U(4, x);\n var vc = [\n [0, 0, 0, 0],\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [1, 1, 0, 0],\n [0, 0, 1, 0],\n [1, 0, 1, 0],\n [0, 1, 1, 0],\n [1, 1, 1, 0],\n [0, 0, 0, 1],\n [1, 0, 0, 1],\n [0, 1, 0, 1],\n [1, 1, 0, 1],\n [0, 0, 1, 1],\n [1, 0, 1, 1],\n [0, 1, 1, 1],\n [1, 1, 1, 1],\n ];\n var Lf = 134480385;\n var ea = 16;\n var J = -227;\n var dd = 482;\n var Ce = [Wc, function (a) {\n return a;\n }, function (a, b, c) {\n return b[c + 0];\n }, function (a, b, c) {\n return b[c + 1];\n }, function (a, b, c) {\n return b[c - 1];\n }, function (a, b, c) {\n return ka(ka(a, b[c + 1]), b[c + 0]);\n }, function (a, b, c) {\n return ka(a, b[c - 1]);\n }, function (a, b, c) {\n return ka(a, b[c + 0]);\n }, function (a,\n b, c) {\n return ka(b[c - 1], b[c + 0]);\n }, function (a, b, c) {\n return ka(b[c + 0], b[c + 1]);\n }, function (a, b, c) {\n return ka(ka(a, b[c - 1]), ka(b[c + 0], b[c + 1]));\n }, function (a, b, c) {\n return Math.abs((a >> 24 & 255) - (b[c - 1] >> 24 & 255)) - Math.abs((b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) + (Math.abs((a >> 16 & 255) - (b[c - 1] >> 16 & 255)) - Math.abs((b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255))) + (Math.abs((a >> 8 & 255) - (b[c - 1] >> 8 & 255)) - Math.abs((b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255))) + (Math.abs((a & 255) - (b[c - 1] & 255)) - Math.abs((b[c + 0] & 255) - (b[c - 1] & 255))) <= 0 ? b[c + 0] : a;\n }, function (a, b, c) {\n return ($a((a\n >> 24 & 255) + (b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) << 24 | $a((a >> 16 & 255) + (b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255)) << 16 | $a((a >> 8 & 255) + (b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255)) << 8 | $a((a & 255) + (b[c + 0] & 255) - (b[c - 1] & 255))) >>> 0;\n }, function (a, b, c) {\n const d = b[c - 1];\n a = ka(a, b[c + 0]);\n return (yb(a >> 24 & 255, d >> 24 & 255) << 24 | yb(a >> 16 & 255, d >> 16 & 255) << 16 | yb(a >> 8 & 255, d >> 8 & 255) << 8 | yb(a >> 0 & 255, d >> 0 & 255)) >>> 0;\n }, Wc, Wc];\n var Xf = {\n Cc: x,\n Bc: x,\n Kc: x,\n };\n var $c = 16;\n var Me = 16;\n var kg = 16;\n var mg = [2, 3, 7];\n var lg = [3, 3, 11];\n var Zf = 0;\n var $f = 1;\n var ag = 2;\n var bg = 3;\n var cg = 4;\n var hg = [Ba + Ge, Ba, Ba, Ba, 40];\n var Ke = 19;\n var ig = [17, 18, 0, 1, 2, 3, 4, 5, 16,\n 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n ];\n var He = 120;\n var dg = [24, 7, 23, 25, 40, 6, 39, 41, 22, 26, 38, 42, 56, 5, 55, 57, 21, 27, 54, 58, 37, 43, 72, 4, 71, 73, 20, 28, 53, 59, 70, 74, 36, 44, 88, 69, 75, 52, 60, 3, 87, 89, 19, 29, 86, 90, 35, 45, 68, 76, 85, 91, 51, 61, 104, 2, 103, 105, 18, 30, 102, 106, 34, 46, 84, 92, 67, 77, 101, 107, 50, 62, 120, 1, 119, 121, 83, 93, 17, 31, 100, 108, 66, 78, 118, 122, 33, 47, 117, 123, 49, 63, 99, 109, 82, 94, 0, 116, 124, 65, 79, 16, 32, 98, 110, 48, 115, 125, 81, 95, 64, 114, 126, 97, 111, 80, 113, 127, 96, 112];\n var Jb = 1 << ea - 1;\n var Za = U(256, 0);\n var xb = U(256, 0);\n var vb = U(256, la);\n var wb = U(256, la);\n var ia = U(dd - J, x);\n var Hb = U(dd\n - J, x);\n var Xe = 0;\n var V = Array(Cc);\n var vg = [function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, hc, 3);\n }, Se, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, Vc, 3);\n }, Te, Ue, Ve, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, le, 2);\n }, Se, Te, Ue, Ve];\n this.Hd = function (a, b, c, d) {\n return lb(Qa, a, b, c, d);\n };\n this.Id = function (a, b, c, d) {\n return lb(jb, a, b, c, d);\n };\n this.Jd = function (a, b, c, d) {\n return lb(kb, a, b, c, d);\n };\n this.Ed = function (a, b, c, d) {\n return lb(Ab, a, b, c, d);\n };\n this.Fd = function (a, b, c, d) {\n return lb(Zc,\n a, b, c, d);\n };\n this.Gd = function (a, b, c, d) {\n return lb(Pa, a, b, c, d);\n };\n this.WebPDecode = this.Dd = function (a, b, c) {\n const d = M(df);\n let e = 'VP8StatusCode';\n if (c == p) return ta;\n e = hd(a, [0], [b], c.input);\n if (e != L) return e == Z ? W : e;\n d.j = c.j;\n d.Qa = c.Qa;\n return e = cf(a, 0, [b], d);\n };\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {webp2png} from './webp';\nimport type {ConvertWebPTask} from './webpWorkerController';\n\nconst ctx = self as any as DedicatedWorkerGlobalScope;\nconst tasks: ConvertWebPTask[] = [];\n// let isProcessing = false;\n\nfunction finishTask() {\n // isProcessing = false;\n processTasks();\n}\n\nfunction processTasks() {\n // if(isProcessing) return;\n\n const task = tasks.shift();\n if(!task) return;\n\n // isProcessing = true;\n\n switch(task.type) {\n case 'convertWebp': {\n const {fileName, bytes} = task.payload;\n\n let convertedBytes: Uint8Array;\n try {\n convertedBytes = webp2png(bytes).bytes;\n } catch(err) {\n console.error('Convert webp2png error:', err, 'payload:', task.payload);\n }\n\n ctx.postMessage({\n type: 'convertWebp',\n payload: {\n fileName,\n bytes: convertedBytes\n }\n });\n\n finishTask();\n\n break;\n }\n\n default:\n finishTask();\n }\n}\n\nfunction scheduleTask(task: ConvertWebPTask) {\n tasks.push(task);\n /* if(task.payload.fileName.indexOf('main-') === 0) {\n tasks.push(task);\n } else {\n tasks.unshift(task);\n } */\n\n processTasks();\n}\n\nctx.addEventListener('message', (event) => {\n scheduleTask(event.data);\n});\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {WebPDecoder} from '../../vendor/libwebp-0.2.0';\nimport {encode} from 'fast-png';\n\nexport function webp2png(data: Uint8Array) {\n const decoder = new WebPDecoder();\n const config: any = decoder.WebPDecoderConfig;\n const buffer = config.j || config.output;\n const bitstream = config.input;\n\n decoder.WebPInitDecoderConfig(config);\n decoder.WebPGetFeatures(data, data.length, bitstream);\n\n /** MODE_RGBA = 1 MODE_ARGB = 4, */\n buffer.J = 1;\n\n let status;\n try {\n status = decoder.WebPDecode(data, data.length, config);\n } catch(e) {\n status = e;\n }\n\n if(status === 0) {\n const rgbaData = buffer.Jb;\n const pngData = encode({\n data: rgbaData,\n width: buffer.width,\n height: buffer.height,\n channels: 4,\n depth: 8\n });\n\n return {status, bytes: pngData};\n }\n\n return {status, bytes: data};\n}\n\nexport function webp2pngAsBlob(data: Uint8Array) {\n const {status, bytes} = webp2png(data);\n return new Blob([bytes], {type: status === 0 ? 'image/png' : 'image/webp'});\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,866,158], () => (__webpack_require__(2061)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + {\"158\":\"npm.iobuffer\",\"699\":\"npm.pako\",\"866\":\"npm.fast-png\"}[chunkId] + \".\" + {\"158\":\"061a9f8cc247dc1dbb8d\",\"699\":\"85f88e27b023cbb2ca51\",\"866\":\"8cb0a7aa9c4ab1eb9f54\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t61: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","i","p","M","F","JSON","parse","stringify","N","G","w","D","S","Nb","length","push","ic","rc","memmove","arr1","index1","arr2","index2","jd","kd","ga","String","fromCharCode","U","ld","md","$","Error","WebPDecoder","a","Ob","Pb","Bb","Qb","b","c","la","d","e","Z","gc","bc","qa","Ia","Rb","ya","T","Q","g","L","fa","Sb","Da","gf","hf","ma","Pa","gb","nd","Y","jf","s","ja","jc","k","h","n","l","kc","od","Tb","pd","Ea","qd","P","v","Ga","ub","Xb","m","f","q","r","u","C","Ub","kf","lf","rd","Vb","A","z","sd","td","na","put","ud","Mb","vd","wd","ka","fd","width","height","o","Wa","Cb","Ka","xd","Db","lc","V","Ha","mf","sa","nf","zd","ta","Ua","wc","vc","t","I","Ba","Aa","J","Qa","Cc","Fc","Jb","yd","ua","parseInt","Ra","cb","RGBA","Sa","size","Va","y","Wc","B","nb","Rc","rb","Uc","Wb","Fa","of","mb","Ad","pf","qf","mc","nc","rf","Dc","oa","Yb","Zb","sc","oc","Bd","va","Cd","tc","Dd","Ed","sf","tf","uf","vf","wf","xf","yf","zf","Af","Bf","Fd","$b","Cf","Df","Ef","Ec","wa","Gd","xc","alert","za","Hd","Id","Jd","Gc","data","Kd","ia","W","pa","offset","Ac","fb","Jc","Nc","gd","hd","Ma","hb","K","R","Ta","Ff","Ca","pb","ob","tb","Kb","Lb","uc","$c","xa","Ld","Ab","Oc","Fb","kb","Hc","Lc","Gf","Hb","yb","Ic","sb","qc","Hf","Zc","Md","Nd","Kc","If","pc","Pc","fc","dd","cd","Mc","Jf","Kf","Lf","Mf","Nf","Za","lb","Ya","wb","Ja","qb","WebPWorkerReset","Qd","Rd","Ud","FinishRow","jb","Od","Of","Pf","Pd","Gb","ib","dc","Xc","Sc","Vc","Sd","ha","H","ca","da","aa","ba","ra","La","Qc","Td","Vd","Wd","Xd","Yd","Zd","$d","ae","be","ce","Qf","db","X","cc","O","Eb","Rf","Sf","de","ee","fe","ge","Tc","Oa","Tf","ea","ab","Xa","he","vb","xb","ac","ie","Uf","$a","Vf","je","zb","zc","yc","eb","WebPWorkerSync","OK","hc","WebPWorkerLaunch","Ib","Na","ec","Bc","ke","le","me","ne","oe","pe","qe","re","se","te","ue","ve","we","Wf","xe","Yc","ye","bd","ze","Ae","Be","Ce","De","Xf","Ee","Yf","EmitRescaledRows","WebPApplyAlphaMultiply","WebPApplyAlphaMultiply4444","Fe","EmitRescaledRowsYUVA","EmitRowsYUVA","Ge","Zf","$f","ag","bg","ad","bb","cg","He","dg","End","Ie","eg","Je","Array","fg","gg","hg","Ke","ig","jg","Le","Me","kg","lg","mg","pg","qg","Oe","Pe","Qe","Re","rg","Se","Te","Ue","Ve","sg","tg","j","ug","vg","wg","xg","We","yg","zg","memory","Ne","InitRGBRescaler","InitYUVRescaler","Xe","ed","Ye","Ag","Bg","Ze","$e","af","bf","cf","ng","AllocateAndInitRescaler","og","Cg","this","value","df","ef","WEBP_CSP_MODE","VP8StatusCode","rotate","WebPGetFeatures","ff","WebPDecoderConfig","input","options","WebPInitDecoderConfig","Math","pow","Eg","Fg","Gg","id","Hg","Ig","Kg","WebPFreeDecBuffer","WebPGetDecoderVersion","abs","WebPDecode","ctx","self","tasks","finishTask","processTasks","task","shift","type","fileName","bytes","payload","convertedBytes","decoder","config","buffer","output","bitstream","status","rgbaData","channels","depth","webp2png","err","console","error","postMessage","addEventListener","event","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","x","__webpack_exports__","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","key","splice","definition","defineProperty","enumerable","get","chunkId","Promise","all","reduce","promises","miniCssF","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","oldGetScript","oldLoadScript","queryMap","countMap","catch","retries","realSrc","message","request","resolve","setTimeout","cacheBust","Date","now","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","bind","moreModules","runtime","pop","map","then"],"sourceRoot":""} \ No newline at end of file diff --git a/public/946.0a86ee06cd8834179a6a.bundle.js b/public/946.e994ab75ad6a5d27ca15.bundle.js similarity index 99% rename from public/946.0a86ee06cd8834179a6a.bundle.js rename to public/946.e994ab75ad6a5d27ca15.bundle.js index 2be327e1..af6cbe66 100644 --- a/public/946.0a86ee06cd8834179a6a.bundle.js +++ b/public/946.e994ab75ad6a5d27ca15.bundle.js @@ -1,2 +1,2 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[946],{4159:(d,e,u)=>{var t;u.d(e,{Z:()=>s});const f=["web.telegram.org","webk.telegram.org"],r=Math.min(4,null!==(t=navigator.hardwareConcurrency)&&void 0!==t?t:4),c={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.7.1",versionFull:"1.7.1 (293)",build:293,langPackVersion:"0.8.3",langPack:"webk",langPackCode:"en",domains:f,baseDcId:2,isMainDomain:f.includes(location.hostname),suffix:"K",threads:r,cryptoWorkers:r};c.isMainDomain&&(c.id=2496,c.hash="8da85b0d5bfe62527e5b244c209159c3");const s=c},3127:(d,e,u)=>{u.d(e,{Z:()=>t});const t={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]}},8975:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(7119);function f(d,e=""){Array.isArray(d)||(d=[d]);const u=(0,t.Z)(e);return new Blob(d,{type:u})}},7119:(d,e,u)=>{function t(d){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","audio/wav","application/json","application/pdf"].indexOf(d)?"application/octet-stream":d}u.d(e,{Z:()=>t})},4903:(d,e,u)=>{function t(...d){const e=d.reduce(((d,e)=>d+(e.byteLength||e.length)),0),u=new Uint8Array(e);let t=0;return d.forEach((d=>{u.set(d instanceof ArrayBuffer?new Uint8Array(d):d,t),t+=d.byteLength||d.length})),u}u.d(e,{Z:()=>t})},3725:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(319);function f(){const d={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...e)=>{d.lastNotify=e,d.listeners.forEach((d=>d(...e)))},listeners:[],addNotifyListener:e=>{d.lastNotify&&e(...d.lastNotify),d.listeners.push(e)}},e=new Promise(((u,t)=>{d.resolve=d=>{e.isFulfilled||e.isRejected||(e.isFulfilled=!0,u(d))},d.reject=(...d)=>{e.isRejected||e.isFulfilled||(e.isRejected=!0,t(...d))}}));return e.catch(t.Z).finally((()=>{e.notify=e.notifyAll=e.lastNotify=null,e.listeners.length=0,e.cancel&&(e.cancel=t.Z)})),Object.assign(e,d),e}},1352:(d,e,u)=>{u.d(e,{N5:()=>f,SU:()=>t,kC:()=>r});const t="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,f="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!t,r=f||t,c=(d,...e)=>{try{d.postMessage(...e)}catch(d){console.error("[worker] postMessage error:",d,e)}},s=(d,...e)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((u=>{u.length&&u.slice(d?0:-1).forEach((d=>{c(d,...e)}))}))};t&&s.bind(null,!1),t&&s.bind(null,!0)},319:(d,e,u)=>{function t(){}u.d(e,{Z:()=>t})},8479:(d,e,u)=>{function t(d){if(null===d||"object"!=typeof d)return d;if(d instanceof Date)return new Date(d.getTime());if(Array.isArray(d))return d.map((d=>t(d)));if(ArrayBuffer.isView(d))return d.slice();const e=new d.constructor;for(var u in d)d.hasOwnProperty(u)&&(e[u]=t(d[u]));return e}u.d(e,{Z:()=>t})},6848:(d,e,u)=>{function t(d,e){const u=Object.keys,f=typeof d;return d&&e&&"object"===f&&f===typeof e?u(d).length===u(e).length&&u(d).every((u=>t(d[u],e[u]))):d===e}u.d(e,{Z:()=>t})},5880:(d,e,u)=>{function t(d){return"object"==typeof d&&null!==d}u.d(e,{Z:()=>t})},5953:(d,e,u)=>{function t(d,e){if(e)for(const u in e)void 0!==e[u]&&(d[u]=e[u]);return d}u.d(e,{Z:()=>t})},946:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(8479),f=u(5880);function r(d,e,u,c,s,n){for(const o in d){const i=n?`${n}.${o}`:o;(null==s?void 0:s.has(i))||(typeof e[o]!=typeof d[o]?(e[o]=(0,t.Z)(d[o]),null==u||u(c||o)):(0,f.Z)(d[o])&&r(d[o],e[o],u,c||o,s,i))}}},4110:(d,e,u)=>{var t=u(7361),f=u(617);String.prototype.toUserId=function(){return(+this).toUserId()},String.prototype.toChatId=function(){return(+this).toChatId()},String.prototype.toPeerId=function(d){return(+this).toPeerId(d)},String.prototype.isPeerId=function(){return/^[\d-]/.test(this.toString())},Number.prototype.toUserId=function(){return this},Number.prototype.toChatId=function(){return Math.abs(this)},Number.prototype.toPeerId=function(d){return void 0===d?this:d?-Math.abs(this):this},Number.prototype.isPeerId=function(){return!0},[["isUser",f.Z],["isAnyChat",t.Z]].forEach((d=>{const e=Array.isArray(d)?d[0]:d,u=Array.isArray(d)?d[1]:d;String.prototype[e]=function(){return u.call(null,this.toString())},Number.prototype[e]=function(){return u.call(null,this)}}))},144:(d,e,u)=>{u.d(e,{a:()=>r,d:()=>f});const t={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function f(d){const e=t[d];return crypto.getRandomValues(e),e[0]}function r(){return""+f(32)+f(32)%16777215}},5466:(d,e,u)=>{u.d(e,{$:()=>f});var t=u(5289);function f(d){return(...e)=>function(d,e,u){const f=performance.now();return(u||console).warn((0,t.Z)(),"start",e),d.then((()=>{(u||console).warn((0,t.Z)(),"end",e,performance.now()-f)})),d}(...e,d)}},5418:(d,e,u)=>{function t(d){return new Promise((e=>{setTimeout(e,d)}))}u.d(e,{Z:()=>t})},6724:(d,e,u)=>{function t(d,e,u=!0){let t,f,r=null;return(...c)=>{t=!0,f=c,r||(u&&(t=!1,d(...f)),r=setInterval((()=>{if(!t)return clearInterval(r),void(r=null);t=!1,d(...f)}),e))}}u.d(e,{Z:()=>t})},9005:(d,e,u)=>{function t(d){return d.charAt(0).toUpperCase()+d.slice(1)}u.d(e,{Z:()=>t})},8453:(d,e,u)=>{u.d(e,{Z:()=>s});var t=u(5936),f=u(3989),r=u(7487),c=u(319);function s(d,e){return Promise.all([f.Z.toggleStorage(d,e),t.Z.toggleStorage(d,e),r.Z.toggleStorage(d,e)]).then(c.Z,c.Z)}},7298:(d,e,u)=>{function t(d){const e=Date.now();return d?e/1e3|0:e}u.d(e,{Z:()=>t})},7361:(d,e,u)=>{function t(d){return+d<0}u.d(e,{Z:()=>t})},617:(d,e,u)=>{function t(d){return+d>=0}u.d(e,{Z:()=>t})},8630:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(153),f=u(410),r=u(1352);class c extends t.Z{constructor(){super("CRYPTO"),this.lastIndex=-1}invokeCryptoNew({method:d,args:e,transfer:u}){const t={method:d,args:e},f=this.listeners.invoke;if(null==f?void 0:f.length){let d=f[0].callback(t);return r.kC||d instanceof Promise||(d=Promise.resolve(d)),d}const c="aes-encrypt"===d||"aes-decrypt"===d?this.lastIndex=(this.lastIndex+1)%this.sendPorts.length:0;return this.invoke("invoke",t,void 0,this.sendPorts[c],u)}invokeCrypto(d,...e){return this.invokeCryptoNew({method:d,args:e})}}const s=new c;f.GO&&(f.GO.cryptoMessagePort=s);const n=s},5936:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(1267),f=u(8975),r=u(5753),c=u(5471),s=u(3725);class n{constructor(d){this.dbName=d,this.useStorage=!0,t.Z.test&&(this.dbName+="_test"),n.STORAGES.length&&(this.useStorage=n.STORAGES[0].useStorage),this.openDatabase(),n.STORAGES.push(this)}openDatabase(){var d;return null!==(d=this.openDbPromise)&&void 0!==d?d:this.openDbPromise=caches.open(this.dbName)}delete(d){return this.timeoutOperation((e=>e.delete("/"+d)))}deleteAll(){return caches.delete(this.dbName)}get(d){return this.timeoutOperation((e=>e.match("/"+d)))}save(d,e){return this.timeoutOperation((u=>u.put("/"+d,e)))}getFile(d,e="blob"){return this.get(d).then((d=>{if(!d)throw(0,c.Z)("NO_ENTRY_FOUND");return d[e]()}))}saveFile(d,e){e instanceof Blob||(e=(0,f.Z)(e));const u=new Response(e,{headers:{"Content-Length":""+e.size}});return this.save(d,u).then((()=>e))}timeoutOperation(d){return this.useStorage?new Promise(((e,u)=>{return t=this,f=void 0,c=function*(){let t=!1;const f=setTimeout((()=>{u(),t=!0}),15e3);try{const u=yield this.openDatabase();if(!u)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const f=yield d(u);if(t)return;e(f)}catch(d){u(d)}clearTimeout(f)},new((r=void 0)||(r=Promise))((function(d,e){function u(d){try{n(c.next(d))}catch(d){e(d)}}function s(d){try{n(c.throw(d))}catch(d){e(d)}}function n(e){var t;e.done?d(e.value):(t=e.value,t instanceof r?t:new r((function(d){d(t)}))).then(u,s)}n((c=c.apply(t,f||[])).next())}));var t,f,r,c})):Promise.reject((0,c.Z)("STORAGE_OFFLINE"))}prepareWriting(d,e,u){return{deferred:(0,s.Z)(),getWriter:()=>new r.Z(u,e,(e=>this.saveFile(d,e).catch((()=>e))))}}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,e)return d?void 0:u.deleteAll()})))}}n.STORAGES=[]},5753:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(8975);class f{constructor(d,e,u){this.mimeType=d,this.size=e,this.saveFileCallback=u,this.bytes=new Uint8Array(e)}write(d,e){return u=this,t=void 0,r=function*(){const u=e+d.byteLength;if(u>this.bytes.byteLength){const d=new Uint8Array(u);d.set(this.bytes,0),this.bytes=d}this.bytes.set(d,e)},new((f=void 0)||(f=Promise))((function(d,e){function c(d){try{n(r.next(d))}catch(d){e(d)}}function s(d){try{n(r.throw(d))}catch(d){e(d)}}function n(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(c,s)}n((r=r.apply(u,t||[])).next())}));var u,t,f,r}truncate(){this.bytes=new Uint8Array}trim(d){this.bytes=this.bytes.slice(0,d)}finalize(d=!0){const e=(0,t.Z)(this.bytes,this.mimeType);return d&&this.saveFileCallback&&this.saveFileCallback(e),e}getParts(){return this.bytes}replaceParts(d){this.bytes=d}}},5003:(d,e,u)=>{u.d(e,{kg:()=>l,v9:()=>t});var t,f=u(410),r=u(4762),c=u(1352),s=u(5289);!function(d){d[d.None=0]="None",d[d.Error=1]="Error",d[d.Warn=2]="Warn",d[d.Log=4]="Log",d[d.Debug=8]="Debug"}(t||(t={}));const n=[t.None,t.Error,t.Warn,t.Log,t.Debug],o=!(r.IS_SAFARI||r.IS_FIREFOX),i="",a="",h=[["debug",t.Debug],["info",t.Log],["warn",t.Warn],["error",t.Error],["assert",t.Error],["trace",t.Log],["group",t.Log],["groupCollapsed",t.Log],["groupEnd",t.Log]];function l(d,e=t.Log|t.Warn|t.Error,u=!1,r=""){let b;f.ZP||u||(e=t.Error),o?r||(c.SU?r=i:c.N5&&(r=a)):r="";const g=r;r=r?`%s ${r}%s`:"%s";const p=function(...u){return e&t.Log&&console.log(r,(0,s.Z)(),d,...u)};return h.forEach((([u,t])=>{p[u]=function(...f){return e&t&&console[u](r,(0,s.Z)(),d,...f)}})),p.setPrefix=function(e){b=e,d="["+e+"]"},p.setPrefix(d),p.setLevel=function(d){e=n.slice(0,d+1).reduce(((d,e)=>d|e),0)},p.bindPrefix=function(d){return l(`${b}] [${d}`,e,u,g)},p}},3206:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(410),f=u(153);class r extends f.Z{constructor(){super("MTPROTO"),r.INSTANCE=this,t.GO&&(t.GO.mtprotoMessagePort=this)}static getInstance(){return this.INSTANCE}}},690:(d,e,u)=>{var t=u(4903);Uint8Array.prototype.concat=function(...d){return(0,t.Z)(this,...d)},Uint8Array.prototype.toJSON=function(){return[...this]},Promise.prototype.finally=Promise.prototype.finally||function(d){const e=e=>Promise.resolve(d()).then(e);return this.then((d=>e((()=>d))),(d=>e((()=>Promise.reject(d)))))}},6637:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(2423);function f(d){return d?d.match(t.bu):null}},3655:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(153),f=u(410);class r extends t.Z{constructor(){super("SERVICE"),f.GO&&(f.GO.serviceMessagePort=this)}}},7487:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(1267),r=u(1352),c=u(3206);class s{constructor(){this.prefix="",this.cache={},this.useStorage=!0,f.Z.test&&(this.prefix="t_")}get(d,e=!0){if(this.cache.hasOwnProperty(d)&&e)return this.cache[d];if(this.useStorage){let e;try{e=localStorage.getItem(this.prefix+d)}catch(d){this.useStorage=!1}if(null!==e)try{e=JSON.parse(e)}catch(d){}else e=void 0;return e}}set(d,e=!1){for(const u in d)if(d.hasOwnProperty(u)){const t=d[u];if(this.cache[u]=t,this.useStorage&&!e)try{const d=JSON.stringify(t);localStorage.setItem(this.prefix+u,d)}catch(d){this.useStorage=!1}}}delete(d,e=!1){d=""+d,e||delete this.cache[d];try{localStorage.removeItem(this.prefix+d)}catch(d){}}clear(){const d=["dc","server_time_offset","xt_instance","user_auth","state_id","k_build"];for(let e=1;e<=5;++e)d.push(`dc${e}_server_salt`),d.push(`dc${e}_auth_key`);for(const e of d)this.delete(e,!0)}toggleStorage(d,e){if(this.useStorage=d,e)return d?this.set(this.cache):void this.clear()}}class n{constructor(){n.STORAGES.push(this),r.kC||(this.storage=new s)}proxy(d,...e){return u=this,t=void 0,s=function*(){return r.kC?c.Z.getInstance().invoke("localStorageProxy",{type:d,args:e}):(e=Array.prototype.slice.call(e),this.storage[d].apply(this.storage,e))},new((f=void 0)||(f=Promise))((function(d,e){function r(d){try{n(s.next(d))}catch(d){e(d)}}function c(d){try{n(s.throw(d))}catch(d){e(d)}}function n(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(r,c)}n((s=s.apply(u,t||[])).next())}));var u,t,f,s}get(d,e){return this.proxy("get",d,e)}set(d,e){return this.proxy("set",d,e)}delete(d,e){return this.proxy("delete",d,e)}clear(){return this.proxy("clear")}toggleStorage(d,e){return this.proxy("toggleStorage",d,e)}}n.STORAGES=[];const o=new n;t.GO.appStorage=o;const i=o},7922:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(410),f=u(3989),r=u(3127);class c extends f.Z{constructor(){super(r.Z,"session")}}const s=new c;t.GO.stateStorage=s;const n=s},3989:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(3725),r=u(1352),c=u(6724),s=u(6666),n=function(d,e,u,t){return new(u||(u=Promise))((function(f,r){function c(d){try{n(t.next(d))}catch(d){r(d)}}function s(d){try{n(t.throw(d))}catch(d){r(d)}}function n(d){var e;d.done?f(d.value):(e=d.value,e instanceof u?e:new u((function(d){d(e)}))).then(c,s)}n((t=t.apply(d,e||[])).next())}))};function o(){}class i{constructor(d,e){this.db=d,this.storeName=e,this.cache={},this.getPromises=new Map,this.keysToSet=new Set,this.saveDeferred=(0,f.Z)(),this.keysToDelete=new Set,this.deleteDeferred=(0,f.Z)(),this.storage=new s.Z(d,e),i.STORAGES.length?this.useStorage=i.STORAGES[0].useStorage:this.useStorage=!0,this.savingFreezed=!1,i.STORAGES.push(this),this.saveThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=this.saveDeferred;this.saveDeferred=(0,f.Z)();const e=this.keysToSet;if(e.size){const d=Array.from(e.values());e.clear();const u=d.map((d=>this.cache[d]));try{yield this.storage.save(d,u)}catch(e){console.error("[AS]: set error:",e,d,u)}}d.resolve(),e.size&&this.saveThrottled()}))),16,!1),this.deleteThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=this.deleteDeferred;this.deleteDeferred=(0,f.Z)();const e=this.keysToDelete;if(e.size){const d=Array.from(e.values());e.clear();try{yield this.storage.delete(d)}catch(e){console.error("[AS]: delete error:",e,d)}}d.resolve(),e.size&&this.deleteThrottled()}))),16,!1),this.getThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=Array.from(this.getPromises.keys());this.storage.get(d).then((e=>{for(let u=0,t=d.length;u{new Set(["NO_ENTRY_FOUND","STORAGE_OFFLINE"]).has(u.type)||(this.useStorage=!1,console.error("[AS]: get error:",u,d,e));for(let e=0,u=d.length;e{this.getPromises.size&&this.getThrottled()}))}))),16,!1)}isAvailable(){return this.useStorage}getCache(){return this.cache}getFromCache(d){return this.cache[d]}setToCache(d,e){return this.cache[d]=e}get(d,e=!0){return n(this,void 0,void 0,(function*(){if(this.cache.hasOwnProperty(d)&&e)return this.getFromCache(d);if(this.useStorage){const e=this.getPromises.get(d);if(e)return e;const u=(0,f.Z)();return this.getPromises.set(d,u),this.getThrottled(),u}}))}getAll(){return this.storage.getAll().catch((()=>[]))}set(d,e=!1){const u=this.useStorage&&!e&&!this.savingFreezed;for(const e in d)if(d.hasOwnProperty(e)){const t=d[e];this.setToCache(e,t),u&&(this.keysToSet.add(e),this.keysToDelete.delete(e),this.saveThrottled())}return u?this.saveDeferred:Promise.resolve()}delete(d,e=!1){return d=""+d,e||delete this.cache[d],this.useStorage&&(this.keysToSet.delete(d),this.keysToDelete.add(d),this.deleteThrottled()),this.useStorage?this.deleteDeferred:Promise.resolve()}clear(d=!1){if(!d)for(const d in this.cache)delete this.cache[d];return this.storage.clear().catch(o)}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,r.kC&&e)return d?u.set(u.cache):(u.keysToSet.clear(),u.keysToDelete.clear(),u.getPromises.forEach((d=>d.resolve(void 0))),u.getPromises.clear(),u.clear(!0))}))).catch(o)}static freezeSaving(d,e){this.STORAGES.forEach((d=>d.savingFreezed=!0));try{d()}catch(d){console.error("freezeSaving callback error:",d)}this.STORAGES.forEach((d=>d.savingFreezed=!1))}}i.STORAGES=[],t.GO&&(t.GO.AppStorage=i)},1229:(d,e,u)=>{u.d(e,{Z:()=>t});const t="((?:👨🏻‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏼‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏽‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏾‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏿‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|🧑🏻‍❤️?‍💋‍🧑\ud83c[\udffc-\udfff]|🧑🏼‍❤️?‍💋‍🧑\ud83c[\udffb\udffd-\udfff]|🧑🏽‍❤️?‍💋‍🧑\ud83c[\udffb\udffc\udffe\udfff]|🧑🏾‍❤️?‍💋‍🧑\ud83c[\udffb-\udffd\udfff]|🧑🏿‍❤️?‍💋‍🧑\ud83c[\udffb-\udffe]|👨🏻‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👨🏼‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👨🏽‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👨🏾‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👨🏿‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏻‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👩🏻‍🤝‍👩\ud83c[\udffc-\udfff]|👩🏼‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👩🏼‍🤝‍👩\ud83c[\udffb\udffd-\udfff]|👩🏽‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👩🏽‍🤝‍👩\ud83c[\udffb\udffc\udffe\udfff]|👩🏾‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👩🏾‍🤝‍👩\ud83c[\udffb-\udffd\udfff]|👩🏿‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏿‍🤝‍👩\ud83c[\udffb-\udffe]|🧑🏻‍❤️?‍🧑\ud83c[\udffc-\udfff]|🧑🏻‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏼‍❤️?‍🧑\ud83c[\udffb\udffd-\udfff]|🧑🏼‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏽‍❤️?‍🧑\ud83c[\udffb\udffc\udffe\udfff]|🧑🏽‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏾‍❤️?‍🧑\ud83c[\udffb-\udffd\udfff]|🧑🏾‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏿‍❤️?‍🧑\ud83c[\udffb-\udffe]|🧑🏿‍🤝‍🧑\ud83c[\udffb-\udfff]|👨‍❤️?‍💋‍👨|👩‍❤️?‍💋‍\ud83d[\udc68\udc69]|🫱🏻‍🫲\ud83c[\udffc-\udfff]|🫱🏼‍🫲\ud83c[\udffb\udffd-\udfff]|🫱🏽‍🫲\ud83c[\udffb\udffc\udffe\udfff]|🫱🏾‍🫲\ud83c[\udffb-\udffd\udfff]|🫱🏿‍🫲\ud83c[\udffb-\udffe]|👨‍❤️?‍👨|👩‍❤️?‍\ud83d[\udc68\udc69]|🧑‍🤝‍🧑|👫\ud83c[\udffb-\udfff]|👬\ud83c[\udffb-\udfff]|👭\ud83c[\udffb-\udfff]|💏\ud83c[\udffb-\udfff]|💑\ud83c[\udffb-\udfff]|🤝\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91]|🤝)|(?:\ud83d[\udc68\udc69]|🧑)(?:\ud83c[\udffb-\udfff])?‍(?:⚕️?|⚖️?|✈️?|\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]|⛹)(?:(?:\ud83c[\udffb-\udfff]|️?)‍[♀♂]️?)|(?:\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])?‍[♀♂]️?|(?:👨‍👨‍👦‍👦|👨‍👨‍👧‍\ud83d[\udc66\udc67]|👨‍👩‍👦‍👦|👨‍👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍👦‍👦|👩‍👩‍👧‍\ud83d[\udc66\udc67]|👨‍👦‍👦|👨‍👧‍\ud83d[\udc66\udc67]|👨‍👨‍\ud83d[\udc66\udc67]|👨‍👩‍\ud83d[\udc66\udc67]|👩‍👦‍👦|👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍\ud83d[\udc66\udc67]|🏳️?‍⚧️?|🏳️?‍🌈|😶‍🌫️?|❤️?‍🔥|❤️?‍🩹|🏴‍☠️?|🐕‍🦺|🐻‍❄️?|👁‍🗨|👨‍\ud83d[\udc66\udc67]|👩‍\ud83d[\udc66\udc67]|👯‍♀️?|👯‍♂️?|😮‍💨|😵‍💫|🤼‍♀️?|🤼‍♂️?|🧞‍♀️?|🧞‍♂️?|🧟‍♀️?|🧟‍♂️?|🐈‍⬛)|[#*0-9]️??⃣|(?:[©®™♟]️?)|(?:\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]|[‼⁉ℹ↔-↙↩↪⌚⌛⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☠☢☣☦☪☮☯☸-☺♀♂♈-♓♠♣♥♦♨♻♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛏⛑⛓⛔⛩⛪⛰-⛵⛸⛺⛽✂✈✉✏✒✔✖✝✡✳✴❄❇❗❣❤➡⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙])(?:️?|(?!︎))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[☝⛷⛹✌✍])(?:️?|(?!︎))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd\udec3-\udec5\udef0-\udef6]|[✊✋]))(?:\ud83c[\udffb-\udfff])?|(?:🏴󠁧󠁢󠁥󠁮󠁧󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁷󠁬󠁳󠁿|🇦\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|🇧\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|🇨\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|🇩\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|🇪\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|🇫\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|🇬\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|🇭\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|🇮\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|🇯\ud83c[\uddea\uddf2\uddf4\uddf5]|🇰\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|🇱\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|🇲\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|🇳\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|🇴🇲|🇵\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|🇶🇦|🇷\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|🇸\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|🇹\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|🇺\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|🇻\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|🇼\ud83c[\uddeb\uddf8]|🇽🇰|🇾\ud83c[\uddea\uddf9]|🇿\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udedd-\udedf\udeeb\udeec\udef4-\udefc\udfe0-\udfeb\udff0]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78-\uddb4\uddb7\uddba\uddbc-\uddcc\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec2\uded0-\uded9\udee0-\udee7]|[⏩-⏬⏰⏳♾⛎✅✨❌❎❓-❕➕-➗➰➿])|️)"}}]); -//# sourceMappingURL=946.0a86ee06cd8834179a6a.bundle.js.map \ No newline at end of file +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[946],{4159:(d,e,u)=>{var t;u.d(e,{Z:()=>s});const f=["web.telegram.org","webk.telegram.org"],r=Math.min(4,null!==(t=navigator.hardwareConcurrency)&&void 0!==t?t:4),c={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.7.1",versionFull:"1.7.1 (294)",build:294,langPackVersion:"0.8.4",langPack:"webk",langPackCode:"en",domains:f,baseDcId:2,isMainDomain:f.includes(location.hostname),suffix:"K",threads:r,cryptoWorkers:r};c.isMainDomain&&(c.id=2496,c.hash="8da85b0d5bfe62527e5b244c209159c3");const s=c},3127:(d,e,u)=>{u.d(e,{Z:()=>t});const t={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]}},8975:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(7119);function f(d,e=""){Array.isArray(d)||(d=[d]);const u=(0,t.Z)(e);return new Blob(d,{type:u})}},7119:(d,e,u)=>{function t(d){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","audio/wav","application/json","application/pdf"].indexOf(d)?"application/octet-stream":d}u.d(e,{Z:()=>t})},4903:(d,e,u)=>{function t(...d){const e=d.reduce(((d,e)=>d+(e.byteLength||e.length)),0),u=new Uint8Array(e);let t=0;return d.forEach((d=>{u.set(d instanceof ArrayBuffer?new Uint8Array(d):d,t),t+=d.byteLength||d.length})),u}u.d(e,{Z:()=>t})},3725:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(319);function f(){const d={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...e)=>{d.lastNotify=e,d.listeners.forEach((d=>d(...e)))},listeners:[],addNotifyListener:e=>{d.lastNotify&&e(...d.lastNotify),d.listeners.push(e)}},e=new Promise(((u,t)=>{d.resolve=d=>{e.isFulfilled||e.isRejected||(e.isFulfilled=!0,u(d))},d.reject=(...d)=>{e.isRejected||e.isFulfilled||(e.isRejected=!0,t(...d))}}));return e.catch(t.Z).finally((()=>{e.notify=e.notifyAll=e.lastNotify=null,e.listeners.length=0,e.cancel&&(e.cancel=t.Z)})),Object.assign(e,d),e}},1352:(d,e,u)=>{u.d(e,{N5:()=>f,SU:()=>t,kC:()=>r});const t="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,f="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!t,r=f||t,c=(d,...e)=>{try{d.postMessage(...e)}catch(d){console.error("[worker] postMessage error:",d,e)}},s=(d,...e)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((u=>{u.length&&u.slice(d?0:-1).forEach((d=>{c(d,...e)}))}))};t&&s.bind(null,!1),t&&s.bind(null,!0)},319:(d,e,u)=>{function t(){}u.d(e,{Z:()=>t})},8479:(d,e,u)=>{function t(d){if(null===d||"object"!=typeof d)return d;if(d instanceof Date)return new Date(d.getTime());if(Array.isArray(d))return d.map((d=>t(d)));if(ArrayBuffer.isView(d))return d.slice();const e=new d.constructor;for(var u in d)d.hasOwnProperty(u)&&(e[u]=t(d[u]));return e}u.d(e,{Z:()=>t})},6848:(d,e,u)=>{function t(d,e){const u=Object.keys,f=typeof d;return d&&e&&"object"===f&&f===typeof e?u(d).length===u(e).length&&u(d).every((u=>t(d[u],e[u]))):d===e}u.d(e,{Z:()=>t})},5880:(d,e,u)=>{function t(d){return"object"==typeof d&&null!==d}u.d(e,{Z:()=>t})},5953:(d,e,u)=>{function t(d,e){if(e)for(const u in e)void 0!==e[u]&&(d[u]=e[u]);return d}u.d(e,{Z:()=>t})},946:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(8479),f=u(5880);function r(d,e,u,c,s,n){for(const o in d){const i=n?`${n}.${o}`:o;(null==s?void 0:s.has(i))||(typeof e[o]!=typeof d[o]?(e[o]=(0,t.Z)(d[o]),null==u||u(c||o)):(0,f.Z)(d[o])&&r(d[o],e[o],u,c||o,s,i))}}},4110:(d,e,u)=>{var t=u(7361),f=u(617);String.prototype.toUserId=function(){return(+this).toUserId()},String.prototype.toChatId=function(){return(+this).toChatId()},String.prototype.toPeerId=function(d){return(+this).toPeerId(d)},String.prototype.isPeerId=function(){return/^[\d-]/.test(this.toString())},Number.prototype.toUserId=function(){return this},Number.prototype.toChatId=function(){return Math.abs(this)},Number.prototype.toPeerId=function(d){return void 0===d?this:d?-Math.abs(this):this},Number.prototype.isPeerId=function(){return!0},[["isUser",f.Z],["isAnyChat",t.Z]].forEach((d=>{const e=Array.isArray(d)?d[0]:d,u=Array.isArray(d)?d[1]:d;String.prototype[e]=function(){return u.call(null,this.toString())},Number.prototype[e]=function(){return u.call(null,this)}}))},144:(d,e,u)=>{u.d(e,{a:()=>r,d:()=>f});const t={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function f(d){const e=t[d];return crypto.getRandomValues(e),e[0]}function r(){return""+f(32)+f(32)%16777215}},5466:(d,e,u)=>{u.d(e,{$:()=>f});var t=u(5289);function f(d){return(...e)=>function(d,e,u){const f=performance.now();return(u||console).warn((0,t.Z)(),"start",e),d.then((()=>{(u||console).warn((0,t.Z)(),"end",e,performance.now()-f)})),d}(...e,d)}},5418:(d,e,u)=>{function t(d){return new Promise((e=>{setTimeout(e,d)}))}u.d(e,{Z:()=>t})},6724:(d,e,u)=>{function t(d,e,u=!0){let t,f,r=null;return(...c)=>{t=!0,f=c,r||(u&&(t=!1,d(...f)),r=setInterval((()=>{if(!t)return clearInterval(r),void(r=null);t=!1,d(...f)}),e))}}u.d(e,{Z:()=>t})},9005:(d,e,u)=>{function t(d){return d.charAt(0).toUpperCase()+d.slice(1)}u.d(e,{Z:()=>t})},8453:(d,e,u)=>{u.d(e,{Z:()=>s});var t=u(5936),f=u(3989),r=u(7487),c=u(319);function s(d,e){return Promise.all([f.Z.toggleStorage(d,e),t.Z.toggleStorage(d,e),r.Z.toggleStorage(d,e)]).then(c.Z,c.Z)}},7298:(d,e,u)=>{function t(d){const e=Date.now();return d?e/1e3|0:e}u.d(e,{Z:()=>t})},7361:(d,e,u)=>{function t(d){return+d<0}u.d(e,{Z:()=>t})},617:(d,e,u)=>{function t(d){return+d>=0}u.d(e,{Z:()=>t})},8630:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(153),f=u(410),r=u(1352);class c extends t.Z{constructor(){super("CRYPTO"),this.lastIndex=-1}invokeCryptoNew({method:d,args:e,transfer:u}){const t={method:d,args:e},f=this.listeners.invoke;if(null==f?void 0:f.length){let d=f[0].callback(t);return r.kC||d instanceof Promise||(d=Promise.resolve(d)),d}const c="aes-encrypt"===d||"aes-decrypt"===d?this.lastIndex=(this.lastIndex+1)%this.sendPorts.length:0;return this.invoke("invoke",t,void 0,this.sendPorts[c],u)}invokeCrypto(d,...e){return this.invokeCryptoNew({method:d,args:e})}}const s=new c;f.GO&&(f.GO.cryptoMessagePort=s);const n=s},5936:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(1267),f=u(8975),r=u(5753),c=u(5471),s=u(3725);class n{constructor(d){this.dbName=d,this.useStorage=!0,t.Z.test&&(this.dbName+="_test"),n.STORAGES.length&&(this.useStorage=n.STORAGES[0].useStorage),this.openDatabase(),n.STORAGES.push(this)}openDatabase(){var d;return null!==(d=this.openDbPromise)&&void 0!==d?d:this.openDbPromise=caches.open(this.dbName)}delete(d){return this.timeoutOperation((e=>e.delete("/"+d)))}deleteAll(){return caches.delete(this.dbName)}get(d){return this.timeoutOperation((e=>e.match("/"+d)))}save(d,e){return this.timeoutOperation((u=>u.put("/"+d,e)))}getFile(d,e="blob"){return this.get(d).then((d=>{if(!d)throw(0,c.Z)("NO_ENTRY_FOUND");return d[e]()}))}saveFile(d,e){e instanceof Blob||(e=(0,f.Z)(e));const u=new Response(e,{headers:{"Content-Length":""+e.size}});return this.save(d,u).then((()=>e))}timeoutOperation(d){return this.useStorage?new Promise(((e,u)=>{return t=this,f=void 0,c=function*(){let t=!1;const f=setTimeout((()=>{u(),t=!0}),15e3);try{const u=yield this.openDatabase();if(!u)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const f=yield d(u);if(t)return;e(f)}catch(d){u(d)}clearTimeout(f)},new((r=void 0)||(r=Promise))((function(d,e){function u(d){try{n(c.next(d))}catch(d){e(d)}}function s(d){try{n(c.throw(d))}catch(d){e(d)}}function n(e){var t;e.done?d(e.value):(t=e.value,t instanceof r?t:new r((function(d){d(t)}))).then(u,s)}n((c=c.apply(t,f||[])).next())}));var t,f,r,c})):Promise.reject((0,c.Z)("STORAGE_OFFLINE"))}prepareWriting(d,e,u){return{deferred:(0,s.Z)(),getWriter:()=>new r.Z(u,e,(e=>this.saveFile(d,e).catch((()=>e))))}}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,e)return d?void 0:u.deleteAll()})))}}n.STORAGES=[]},5753:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(8975);class f{constructor(d,e,u){this.mimeType=d,this.size=e,this.saveFileCallback=u,this.bytes=new Uint8Array(e)}write(d,e){return u=this,t=void 0,r=function*(){const u=e+d.byteLength;if(u>this.bytes.byteLength){const d=new Uint8Array(u);d.set(this.bytes,0),this.bytes=d}this.bytes.set(d,e)},new((f=void 0)||(f=Promise))((function(d,e){function c(d){try{n(r.next(d))}catch(d){e(d)}}function s(d){try{n(r.throw(d))}catch(d){e(d)}}function n(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(c,s)}n((r=r.apply(u,t||[])).next())}));var u,t,f,r}truncate(){this.bytes=new Uint8Array}trim(d){this.bytes=this.bytes.slice(0,d)}finalize(d=!0){const e=(0,t.Z)(this.bytes,this.mimeType);return d&&this.saveFileCallback&&this.saveFileCallback(e),e}getParts(){return this.bytes}replaceParts(d){this.bytes=d}}},5003:(d,e,u)=>{u.d(e,{kg:()=>l,v9:()=>t});var t,f=u(410),r=u(4762),c=u(1352),s=u(5289);!function(d){d[d.None=0]="None",d[d.Error=1]="Error",d[d.Warn=2]="Warn",d[d.Log=4]="Log",d[d.Debug=8]="Debug"}(t||(t={}));const n=[t.None,t.Error,t.Warn,t.Log,t.Debug],o=!(r.IS_SAFARI||r.IS_FIREFOX),i="",a="",h=[["debug",t.Debug],["info",t.Log],["warn",t.Warn],["error",t.Error],["assert",t.Error],["trace",t.Log],["group",t.Log],["groupCollapsed",t.Log],["groupEnd",t.Log]];function l(d,e=t.Log|t.Warn|t.Error,u=!1,r=""){let b;f.ZP||u||(e=t.Error),o?r||(c.SU?r=i:c.N5&&(r=a)):r="";const g=r;r=r?`%s ${r}%s`:"%s";const p=function(...u){return e&t.Log&&console.log(r,(0,s.Z)(),d,...u)};return h.forEach((([u,t])=>{p[u]=function(...f){return e&t&&console[u](r,(0,s.Z)(),d,...f)}})),p.setPrefix=function(e){b=e,d="["+e+"]"},p.setPrefix(d),p.setLevel=function(d){e=n.slice(0,d+1).reduce(((d,e)=>d|e),0)},p.bindPrefix=function(d){return l(`${b}] [${d}`,e,u,g)},p}},3206:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(410),f=u(153);class r extends f.Z{constructor(){super("MTPROTO"),r.INSTANCE=this,t.GO&&(t.GO.mtprotoMessagePort=this)}static getInstance(){return this.INSTANCE}}},690:(d,e,u)=>{var t=u(4903);Uint8Array.prototype.concat=function(...d){return(0,t.Z)(this,...d)},Uint8Array.prototype.toJSON=function(){return[...this]},Promise.prototype.finally=Promise.prototype.finally||function(d){const e=e=>Promise.resolve(d()).then(e);return this.then((d=>e((()=>d))),(d=>e((()=>Promise.reject(d)))))}},6637:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(2423);function f(d){return d?d.match(t.bu):null}},3655:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(153),f=u(410);class r extends t.Z{constructor(){super("SERVICE"),f.GO&&(f.GO.serviceMessagePort=this)}}},7487:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(1267),r=u(1352),c=u(3206);class s{constructor(){this.prefix="",this.cache={},this.useStorage=!0,f.Z.test&&(this.prefix="t_")}get(d,e=!0){if(this.cache.hasOwnProperty(d)&&e)return this.cache[d];if(this.useStorage){let e;try{e=localStorage.getItem(this.prefix+d)}catch(d){this.useStorage=!1}if(null!==e)try{e=JSON.parse(e)}catch(d){}else e=void 0;return e}}set(d,e=!1){for(const u in d)if(d.hasOwnProperty(u)){const t=d[u];if(this.cache[u]=t,this.useStorage&&!e)try{const d=JSON.stringify(t);localStorage.setItem(this.prefix+u,d)}catch(d){this.useStorage=!1}}}delete(d,e=!1){d=""+d,e||delete this.cache[d];try{localStorage.removeItem(this.prefix+d)}catch(d){}}clear(){const d=["dc","server_time_offset","xt_instance","user_auth","state_id","k_build"];for(let e=1;e<=5;++e)d.push(`dc${e}_server_salt`),d.push(`dc${e}_auth_key`);for(const e of d)this.delete(e,!0)}toggleStorage(d,e){if(this.useStorage=d,e)return d?this.set(this.cache):void this.clear()}}class n{constructor(){n.STORAGES.push(this),r.kC||(this.storage=new s)}proxy(d,...e){return u=this,t=void 0,s=function*(){return r.kC?c.Z.getInstance().invoke("localStorageProxy",{type:d,args:e}):(e=Array.prototype.slice.call(e),this.storage[d].apply(this.storage,e))},new((f=void 0)||(f=Promise))((function(d,e){function r(d){try{n(s.next(d))}catch(d){e(d)}}function c(d){try{n(s.throw(d))}catch(d){e(d)}}function n(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(r,c)}n((s=s.apply(u,t||[])).next())}));var u,t,f,s}get(d,e){return this.proxy("get",d,e)}set(d,e){return this.proxy("set",d,e)}delete(d,e){return this.proxy("delete",d,e)}clear(){return this.proxy("clear")}toggleStorage(d,e){return this.proxy("toggleStorage",d,e)}}n.STORAGES=[];const o=new n;t.GO.appStorage=o;const i=o},7922:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(410),f=u(3989),r=u(3127);class c extends f.Z{constructor(){super(r.Z,"session")}}const s=new c;t.GO.stateStorage=s;const n=s},3989:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(3725),r=u(1352),c=u(6724),s=u(6666),n=function(d,e,u,t){return new(u||(u=Promise))((function(f,r){function c(d){try{n(t.next(d))}catch(d){r(d)}}function s(d){try{n(t.throw(d))}catch(d){r(d)}}function n(d){var e;d.done?f(d.value):(e=d.value,e instanceof u?e:new u((function(d){d(e)}))).then(c,s)}n((t=t.apply(d,e||[])).next())}))};function o(){}class i{constructor(d,e){this.db=d,this.storeName=e,this.cache={},this.getPromises=new Map,this.keysToSet=new Set,this.saveDeferred=(0,f.Z)(),this.keysToDelete=new Set,this.deleteDeferred=(0,f.Z)(),this.storage=new s.Z(d,e),i.STORAGES.length?this.useStorage=i.STORAGES[0].useStorage:this.useStorage=!0,this.savingFreezed=!1,i.STORAGES.push(this),this.saveThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=this.saveDeferred;this.saveDeferred=(0,f.Z)();const e=this.keysToSet;if(e.size){const d=Array.from(e.values());e.clear();const u=d.map((d=>this.cache[d]));try{yield this.storage.save(d,u)}catch(e){console.error("[AS]: set error:",e,d,u)}}d.resolve(),e.size&&this.saveThrottled()}))),16,!1),this.deleteThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=this.deleteDeferred;this.deleteDeferred=(0,f.Z)();const e=this.keysToDelete;if(e.size){const d=Array.from(e.values());e.clear();try{yield this.storage.delete(d)}catch(e){console.error("[AS]: delete error:",e,d)}}d.resolve(),e.size&&this.deleteThrottled()}))),16,!1),this.getThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=Array.from(this.getPromises.keys());this.storage.get(d).then((e=>{for(let u=0,t=d.length;u{new Set(["NO_ENTRY_FOUND","STORAGE_OFFLINE"]).has(u.type)||(this.useStorage=!1,console.error("[AS]: get error:",u,d,e));for(let e=0,u=d.length;e{this.getPromises.size&&this.getThrottled()}))}))),16,!1)}isAvailable(){return this.useStorage}getCache(){return this.cache}getFromCache(d){return this.cache[d]}setToCache(d,e){return this.cache[d]=e}get(d,e=!0){return n(this,void 0,void 0,(function*(){if(this.cache.hasOwnProperty(d)&&e)return this.getFromCache(d);if(this.useStorage){const e=this.getPromises.get(d);if(e)return e;const u=(0,f.Z)();return this.getPromises.set(d,u),this.getThrottled(),u}}))}getAll(){return this.storage.getAll().catch((()=>[]))}set(d,e=!1){const u=this.useStorage&&!e&&!this.savingFreezed;for(const e in d)if(d.hasOwnProperty(e)){const t=d[e];this.setToCache(e,t),u&&(this.keysToSet.add(e),this.keysToDelete.delete(e),this.saveThrottled())}return u?this.saveDeferred:Promise.resolve()}delete(d,e=!1){return d=""+d,e||delete this.cache[d],this.useStorage&&(this.keysToSet.delete(d),this.keysToDelete.add(d),this.deleteThrottled()),this.useStorage?this.deleteDeferred:Promise.resolve()}clear(d=!1){if(!d)for(const d in this.cache)delete this.cache[d];return this.storage.clear().catch(o)}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,r.kC&&e)return d?u.set(u.cache):(u.keysToSet.clear(),u.keysToDelete.clear(),u.getPromises.forEach((d=>d.resolve(void 0))),u.getPromises.clear(),u.clear(!0))}))).catch(o)}static freezeSaving(d,e){this.STORAGES.forEach((d=>d.savingFreezed=!0));try{d()}catch(d){console.error("freezeSaving callback error:",d)}this.STORAGES.forEach((d=>d.savingFreezed=!1))}}i.STORAGES=[],t.GO&&(t.GO.AppStorage=i)},1229:(d,e,u)=>{u.d(e,{Z:()=>t});const t="((?:👨🏻‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏼‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏽‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏾‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏿‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|🧑🏻‍❤️?‍💋‍🧑\ud83c[\udffc-\udfff]|🧑🏼‍❤️?‍💋‍🧑\ud83c[\udffb\udffd-\udfff]|🧑🏽‍❤️?‍💋‍🧑\ud83c[\udffb\udffc\udffe\udfff]|🧑🏾‍❤️?‍💋‍🧑\ud83c[\udffb-\udffd\udfff]|🧑🏿‍❤️?‍💋‍🧑\ud83c[\udffb-\udffe]|👨🏻‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👨🏼‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👨🏽‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👨🏾‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👨🏿‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏻‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👩🏻‍🤝‍👩\ud83c[\udffc-\udfff]|👩🏼‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👩🏼‍🤝‍👩\ud83c[\udffb\udffd-\udfff]|👩🏽‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👩🏽‍🤝‍👩\ud83c[\udffb\udffc\udffe\udfff]|👩🏾‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👩🏾‍🤝‍👩\ud83c[\udffb-\udffd\udfff]|👩🏿‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏿‍🤝‍👩\ud83c[\udffb-\udffe]|🧑🏻‍❤️?‍🧑\ud83c[\udffc-\udfff]|🧑🏻‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏼‍❤️?‍🧑\ud83c[\udffb\udffd-\udfff]|🧑🏼‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏽‍❤️?‍🧑\ud83c[\udffb\udffc\udffe\udfff]|🧑🏽‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏾‍❤️?‍🧑\ud83c[\udffb-\udffd\udfff]|🧑🏾‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏿‍❤️?‍🧑\ud83c[\udffb-\udffe]|🧑🏿‍🤝‍🧑\ud83c[\udffb-\udfff]|👨‍❤️?‍💋‍👨|👩‍❤️?‍💋‍\ud83d[\udc68\udc69]|🫱🏻‍🫲\ud83c[\udffc-\udfff]|🫱🏼‍🫲\ud83c[\udffb\udffd-\udfff]|🫱🏽‍🫲\ud83c[\udffb\udffc\udffe\udfff]|🫱🏾‍🫲\ud83c[\udffb-\udffd\udfff]|🫱🏿‍🫲\ud83c[\udffb-\udffe]|👨‍❤️?‍👨|👩‍❤️?‍\ud83d[\udc68\udc69]|🧑‍🤝‍🧑|👫\ud83c[\udffb-\udfff]|👬\ud83c[\udffb-\udfff]|👭\ud83c[\udffb-\udfff]|💏\ud83c[\udffb-\udfff]|💑\ud83c[\udffb-\udfff]|🤝\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91]|🤝)|(?:\ud83d[\udc68\udc69]|🧑)(?:\ud83c[\udffb-\udfff])?‍(?:⚕️?|⚖️?|✈️?|\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]|⛹)(?:(?:\ud83c[\udffb-\udfff]|️?)‍[♀♂]️?)|(?:\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])?‍[♀♂]️?|(?:👨‍👨‍👦‍👦|👨‍👨‍👧‍\ud83d[\udc66\udc67]|👨‍👩‍👦‍👦|👨‍👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍👦‍👦|👩‍👩‍👧‍\ud83d[\udc66\udc67]|👨‍👦‍👦|👨‍👧‍\ud83d[\udc66\udc67]|👨‍👨‍\ud83d[\udc66\udc67]|👨‍👩‍\ud83d[\udc66\udc67]|👩‍👦‍👦|👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍\ud83d[\udc66\udc67]|🏳️?‍⚧️?|🏳️?‍🌈|😶‍🌫️?|❤️?‍🔥|❤️?‍🩹|🏴‍☠️?|🐕‍🦺|🐻‍❄️?|👁‍🗨|👨‍\ud83d[\udc66\udc67]|👩‍\ud83d[\udc66\udc67]|👯‍♀️?|👯‍♂️?|😮‍💨|😵‍💫|🤼‍♀️?|🤼‍♂️?|🧞‍♀️?|🧞‍♂️?|🧟‍♀️?|🧟‍♂️?|🐈‍⬛)|[#*0-9]️??⃣|(?:[©®™♟]️?)|(?:\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]|[‼⁉ℹ↔-↙↩↪⌚⌛⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☠☢☣☦☪☮☯☸-☺♀♂♈-♓♠♣♥♦♨♻♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛏⛑⛓⛔⛩⛪⛰-⛵⛸⛺⛽✂✈✉✏✒✔✖✝✡✳✴❄❇❗❣❤➡⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙])(?:️?|(?!︎))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[☝⛷⛹✌✍])(?:️?|(?!︎))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd\udec3-\udec5\udef0-\udef6]|[✊✋]))(?:\ud83c[\udffb-\udfff])?|(?:🏴󠁧󠁢󠁥󠁮󠁧󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁷󠁬󠁳󠁿|🇦\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|🇧\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|🇨\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|🇩\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|🇪\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|🇫\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|🇬\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|🇭\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|🇮\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|🇯\ud83c[\uddea\uddf2\uddf4\uddf5]|🇰\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|🇱\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|🇲\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|🇳\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|🇴🇲|🇵\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|🇶🇦|🇷\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|🇸\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|🇹\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|🇺\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|🇻\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|🇼\ud83c[\uddeb\uddf8]|🇽🇰|🇾\ud83c[\uddea\uddf9]|🇿\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udedd-\udedf\udeeb\udeec\udef4-\udefc\udfe0-\udfeb\udff0]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78-\uddb4\uddb7\uddba\uddbc-\uddcc\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec2\uded0-\uded9\udee0-\udee7]|[⏩-⏬⏰⏳♾⛎✅✨❌❎❓-❕➕-➗➰➿])|️)"}}]); +//# sourceMappingURL=946.e994ab75ad6a5d27ca15.bundle.js.map \ No newline at end of file diff --git a/public/946.0a86ee06cd8834179a6a.bundle.js.map b/public/946.e994ab75ad6a5d27ca15.bundle.js.map similarity index 99% rename from public/946.0a86ee06cd8834179a6a.bundle.js.map rename to public/946.e994ab75ad6a5d27ca15.bundle.js.map index 06915508..95b4396e 100644 --- a/public/946.0a86ee06cd8834179a6a.bundle.js.map +++ b/public/946.e994ab75ad6a5d27ca15.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"946.0a86ee06cd8834179a6a.bundle.js","mappings":"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","sources":["webpack://tweb/./src/config/app.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/object/copy.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/helpers/object/isObject.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/helpers/object/validateInitObject.ts","webpack://tweb/./src/helpers/peerIdPolyfill.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/recordPromise.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/helpers/schedulers/throttle.ts","webpack://tweb/./src/helpers/string/capitalizeFirstLetter.ts","webpack://tweb/./src/helpers/toggleStorages.ts","webpack://tweb/./src/helpers/tsNow.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isAnyChat.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isUser.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/files/cacheStorage.ts","webpack://tweb/./src/lib/files/memoryWriter.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/lib/mtproto/mtprotoMessagePort.ts","webpack://tweb/./src/lib/polyfill.ts","webpack://tweb/./src/lib/richTextProcessor/matchUrlProtocol.ts","webpack://tweb/./src/lib/serviceWorker/serviceMessagePort.ts","webpack://tweb/./src/lib/localStorage.ts","webpack://tweb/./src/lib/sessionStorage.ts","webpack://tweb/./src/lib/stateStorage.ts","webpack://tweb/./src/lib/storage.ts","webpack://tweb/./src/vendor/emoji/regex.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {DcId} from '../types';\n\nexport const MAIN_DOMAINS = ['web.telegram.org', 'webk.telegram.org'];\n\nconst threads = Math.min(4, navigator.hardwareConcurrency ?? 4);\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.8.3',\n langPack: 'webk',\n langPackCode: 'en',\n domains: MAIN_DOMAINS,\n baseDcId: 2 as DcId,\n isMainDomain: MAIN_DOMAINS.includes(location.hostname),\n suffix: 'K',\n threads,\n cryptoWorkers: threads\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Database} from '.';\nimport type {IDBIndex} from '../../lib/files/idb';\n\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\n name: 'tweb',\n version: 7,\n stores: [{\n name: 'session'\n }, {\n name: 'stickerSets'\n }, {\n name: 'users'\n }, {\n name: 'chats'\n }, {\n name: 'dialogs'\n // indexes: [\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\n // const name = `index_${idx}`;\n // const index: IDBIndex = {\n // indexName: name,\n // keyPath: name,\n // objectParameters: {}\n // };\n\n // return index\n // })\n // ]\n }, {\n name: 'messages'\n }]\n};\n\nexport default DATABASE_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from './blobSafeMimeType';\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n const safeMimeType = blobSafeMimeType(mimeType);\n const blob = new Blob(blobParts, {type: safeMimeType});\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n\n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from './noop';\n\nexport interface CancellablePromise extends Promise {\n resolve?: (value: T) => void,\n reject?: (...args: any[]) => void,\n cancel?: (reason?: any) => void,\n\n notify?: (...args: any[]) => void,\n notifyAll?: (...args: any[]) => void,\n lastNotify?: any,\n listeners?: Array<(...args: any[]) => void>,\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\n\n isFulfilled?: boolean,\n isRejected?: boolean\n}\n\nexport default function deferredPromise() {\n const deferredHelper: any = {\n isFulfilled: false,\n isRejected: false,\n\n notify: () => {},\n notifyAll: (...args: any[]) => {\n deferredHelper.lastNotify = args;\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\n },\n\n listeners: [],\n addNotifyListener: (callback: (...args: any[]) => void) => {\n if(deferredHelper.lastNotify) {\n callback(...deferredHelper.lastNotify);\n }\n\n deferredHelper.listeners.push(callback);\n }\n };\n\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\n deferredHelper.resolve = (value: T) => {\n if(deferred.isFulfilled || deferred.isRejected) return;\n\n deferred.isFulfilled = true;\n resolve(value);\n };\n\n deferredHelper.reject = (...args: any[]) => {\n if(deferred.isRejected || deferred.isFulfilled) return;\n\n deferred.isRejected = true;\n reject(...args);\n };\n });\n\n // @ts-ignore\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\n const n = deferredPromise>();\n\n }; */\n\n deferred.catch(noop).finally(() => {\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\n deferred.listeners.length = 0;\n\n if(deferred.cancel) {\n deferred.cancel = noop;\n }\n });\n\n Object.assign(deferred, deferredHelper);\n\n return deferred;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// в SW может быть сразу две переменных TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","export default function noop() {}\n","export default function copy(obj: T): T {\n // in case of premitives\n if(obj === null || typeof(obj) !== 'object') {\n return obj;\n }\n\n // date objects should be\n if(obj instanceof Date) {\n return new Date(obj.getTime()) as any;\n }\n\n // handle Array\n if(Array.isArray(obj)) {\n // @ts-ignore\n const clonedArr: T = obj.map((el) => copy(el)) as any as T;\n return clonedArr;\n }\n\n if(ArrayBuffer.isView(obj)) {\n // @ts-ignore\n return obj.slice();\n }\n\n // lastly, handle objects\n // @ts-ignore\n const clonedObj = new obj.constructor();\n for(var prop in obj) {\n if(obj.hasOwnProperty(prop)) {\n clonedObj[prop] = copy(obj[prop]);\n }\n }\n return clonedObj;\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","export default function isObject>(object: any): object is T {\n return typeof(object) === 'object' && object !== null;\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(const i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","import copy from './copy';\nimport isObject from './isObject';\n\nexport default function validateInitObject(\n initObject: any,\n currentObject: any,\n onReplace?: (key: string) => void,\n previousKey?: string,\n ignorePaths?: Set,\n path?: string\n) {\n for(const key in initObject) {\n const _path = path ? `${path}.${key}` : key;\n if(ignorePaths?.has(_path)) {\n continue;\n }\n\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace?.(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key, ignorePaths, _path);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport isAnyChat from '../lib/appManagers/utils/peers/isAnyChat';\nimport isUser from '../lib/appManagers/utils/peers/isUser';\n\nString.prototype.toUserId = function() {\n return (+this).toUserId();\n};\n\nString.prototype.toChatId = function() {\n return (+this).toChatId();\n};\n\nString.prototype.toPeerId = function(isChat?: boolean) {\n return (+this).toPeerId(isChat);\n};\n\nString.prototype.isPeerId = function() {\n return /^[\\d-]/.test(this.toString());\n};\n\nNumber.prototype.toUserId = function() {\n return this as any;\n};\n\nNumber.prototype.toChatId = function() {\n return Math.abs(this as any);\n};\n\nNumber.prototype.toPeerId = function(isChat?: boolean) {\n return isChat === undefined ? this as number : (isChat ? -Math.abs(this as number) : this as number);\n};\n\nNumber.prototype.isPeerId = function() {\n return true;\n};\n\n[\n ['isUser' as const, isUser],\n ['isAnyChat' as const, isAnyChat]\n].forEach((value) => {\n const newMethod = Array.isArray(value) ? value[0] : value;\n const originMethod = Array.isArray(value) ? value[1] : value;\n // @ts-ignore\n String.prototype[newMethod] = function() {\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, this.toString());\n };\n\n // @ts-ignore\n Number.prototype[newMethod] = function() {\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, this);\n };\n});\n\ndeclare global {\n interface String {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is string;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n\n interface Number {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is PeerId;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n}\n\nexport {};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1)\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","import {logger} from '../lib/logger';\nimport dT from './dT';\n\nexport function recordPromise>(promise: T, description: string, log?: ReturnType | Console) {\n const perf = performance.now();\n (log || console).warn(dT(), 'start', description);\n promise.then(() => {\n (log || console).warn(dT(), 'end', description, performance.now() - perf);\n });\n return promise;\n}\n\nexport function recordPromiseBound(log: ReturnType | Console) {\n return (...args: [Parameters[0], Parameters[1]]) => {\n return recordPromise(...args, log);\n };\n}\n","export default function pause(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\n\nexport default function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true\n) {\n let interval: number | null = null;\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 interval = setInterval(() => {\n if(!isPending) {\n clearInterval(interval!);\n interval = null;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms) as any;\n }\n };\n}\n","export default function capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CacheStorageController from '../lib/files/cacheStorage';\nimport AppStorage from '../lib/storage';\nimport sessionStorage from '../lib/sessionStorage';\nimport noop from './noop';\n\nexport default function toggleStorages(enabled: boolean, clearWrite: boolean) {\n return Promise.all([\n AppStorage.toggleStorage(enabled, clearWrite),\n CacheStorageController.toggleStorage(enabled, clearWrite),\n sessionStorage.toggleStorage(enabled, clearWrite)\n ]).then(noop, noop);\n}\n","export default function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? t / 1000 | 0 : t;\n}\n","export default function isAnyChat(peerId: PeerId) {\n return +peerId < 0;\n}\n","export default function isUser(peerId: PeerId) {\n return +peerId >= 0;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CryptoMethods} from './crypto_methods';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {Awaited} from '../../types';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IS_WORKER} from '../../helpers/context';\n\ntype CryptoEvent = {\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n terminate: () => void\n};\n\nexport class CryptoMessagePort extends SuperMessagePort {\n private lastIndex: number;\n\n constructor() {\n super('CRYPTO');\n this.lastIndex = -1;\n }\n\n public invokeCryptoNew({method, args, transfer}: {\n method: T,\n args: Parameters,\n transfer?: Transferable[]\n }): Promise>> {\n const payload = {method, args};\n const listeners = this.listeners['invoke'];\n if(listeners?.length) { // already in worker\n // try {\n // @ts-ignore\n let result: any = listeners[0].callback(payload);\n if(!IS_WORKER && !(result instanceof Promise)) {\n result = Promise.resolve(result);\n }\n\n return result;\n // } catch(err) {\n // return Promise.reject(err);\n // }\n }\n\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\n 0;\n // @ts-ignore\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\n }\n\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\n return this.invokeCryptoNew({method, args});\n }\n}\n\nconst cryptoMessagePort = new CryptoMessagePort();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\nexport default cryptoMessagePort;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../../config/modes';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport MemoryWriter from './memoryWriter';\nimport FileManager from './memoryWriter';\nimport FileStorage from './fileStorage';\nimport makeError from '../../helpers/makeError';\nimport deferredPromise from '../../helpers/cancellablePromise';\n\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\n\nexport default class CacheStorageController implements FileStorage {\n private static STORAGES: CacheStorageController[] = [];\n private openDbPromise: Promise;\n\n private useStorage = true;\n\n // private log: ReturnType = logger('CS');\n\n constructor(private dbName: CacheStorageDbName) {\n if(Modes.test) {\n this.dbName += '_test';\n }\n\n if(CacheStorageController.STORAGES.length) {\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\n }\n\n this.openDatabase();\n CacheStorageController.STORAGES.push(this);\n }\n\n private openDatabase(): Promise {\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\n }\n\n public delete(entryName: string) {\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\n }\n\n public deleteAll() {\n return caches.delete(this.dbName);\n }\n\n public get(entryName: string) {\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\n }\n\n public save(entryName: string, response: Response) {\n // return new Promise((resolve) => {}); // DEBUG\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\n }\n\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\n /* if(method === 'blob') {\n return Promise.reject();\n } */\n\n // const str = `get fileName: ${fileName}`;\n // console.time(str);\n return this.get(fileName).then((response) => {\n if(!response) {\n // console.warn('getFile:', response, fileName);\n throw makeError('NO_ENTRY_FOUND');\n }\n\n const promise = response[method]();\n // promise.then(() => {\n // console.timeEnd(str);\n // });\n return promise;\n });\n }\n\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct(blob);\n }\n\n const response = new Response(blob, {\n headers: {\n 'Content-Length': '' + blob.size\n }\n });\n\n return this.save(fileName, response).then(() => blob as Blob);\n }\n\n public timeoutOperation(callback: (cache: Cache) => Promise) {\n if(!this.useStorage) {\n return Promise.reject(makeError('STORAGE_OFFLINE'));\n }\n\n return new Promise(async(resolve, reject) => {\n let rejected = false;\n const timeout = setTimeout(() => {\n reject();\n // console.warn('CACHESTORAGE TIMEOUT');\n rejected = true;\n }, 15e3);\n\n try {\n const cache = await this.openDatabase();\n if(!cache) {\n this.useStorage = false;\n this.openDbPromise = undefined;\n throw 'no cache?';\n }\n\n const res = await callback(cache);\n\n if(rejected) return;\n resolve(res);\n } catch(err) {\n reject(err);\n }\n\n clearTimeout(timeout);\n });\n }\n\n public prepareWriting(fileName: string, fileSize: number, mimeType: string) {\n return {\n deferred: deferredPromise(),\n getWriter: () => {\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\n return this.saveFile(fileName, blob).catch(() => blob);\n });\n\n return writer;\n }\n };\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n return storage.deleteAll();\n }\n }));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport StreamWriter from './streamWriter';\n\nexport default class MemoryWriter implements StreamWriter {\n private bytes: Uint8Array;\n\n constructor(\n private mimeType: string,\n private size: number,\n private saveFileCallback?: (blob: Blob) => Promise\n ) {\n this.bytes = new Uint8Array(size);\n }\n\n public async write(part: Uint8Array, offset: number) {\n // sometimes file size can be bigger than the prov\n const endOffset = offset + part.byteLength;\n if(endOffset > this.bytes.byteLength) {\n const newBytes = new Uint8Array(endOffset);\n newBytes.set(this.bytes, 0);\n this.bytes = newBytes;\n }\n\n this.bytes.set(part, offset);\n };\n\n public truncate() {\n this.bytes = new Uint8Array();\n }\n\n public trim(size: number) {\n this.bytes = this.bytes.slice(0, size);\n }\n\n public finalize(saveToStorage = true) {\n const blob = blobConstruct(this.bytes, this.mimeType);\n\n if(saveToStorage && this.saveFileCallback) {\n this.saveFileCallback(blob);\n }\n\n return blob;\n }\n\n public getParts() {\n return this.bytes;\n }\n\n public replaceParts(parts: Uint8Array) {\n this.bytes = parts;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n // level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport type {getEnvironment} from '../../environment/utils';\nimport type loadState from '../appManagers/utils/state/loadState';\nimport type {StoragesResults} from '../appManagers/utils/storages/loadStorages';\nimport type {LocalStorageProxyTask} from '../localStorage';\nimport type {Awaited} from '../../types';\nimport type {Mirrors, MirrorTaskPayload, NotificationBuildTaskPayload, TabState} from './mtprotoworker';\nimport type toggleStorages from '../../helpers/toggleStorages';\nimport SuperMessagePort from './superMessagePort';\n\nexport type MTProtoManagerTaskPayload = {name: string, method: string, args: any[]};\n\ntype MTProtoBroadcastEvent = {\n event: (payload: {name: string, args: any[]}, source: MessageEventSource) => void\n};\n\nexport default class MTProtoMessagePort extends SuperMessagePort<{\n environment: (environment: ReturnType) => void,\n crypto: (payload: {method: string, args: any[]}) => Promise,\n state: (payload: {userId: UserId} & Awaited> & {storagesResults?: StoragesResults}) => void,\n manager: (payload: MTProtoManagerTaskPayload) => any,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => ReturnType,\n serviceWorkerOnline: (online: boolean) => void,\n serviceWorkerPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n cryptoPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n createObjectURL: (blob: Blob) => string,\n tabState: (payload: TabState, source: MessageEventSource) => void,\n createProxyWorkerURLs: (payload: {originalUrl: string, blob: Blob}) => string[],\n} & MTProtoBroadcastEvent, {\n convertWebp: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n convertOpus: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n localStorageProxy: (payload: LocalStorageProxyTask['payload']) => Promise,\n mirror: (payload: MirrorTaskPayload) => void,\n notificationBuild: (payload: NotificationBuildTaskPayload) => void,\n // hello: () => void\n} & MTProtoBroadcastEvent, Master> {\n private static INSTANCE: MTProtoMessagePort;\n\n constructor() {\n super('MTPROTO');\n\n MTProtoMessagePort.INSTANCE = this;\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.mtprotoMessagePort = this);\n }\n\n public static getInstance() {\n return this.INSTANCE as MTProtoMessagePort;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bufferConcats from '../helpers/bytes/bufferConcats';\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n // return {type: 'bytes', value: [...this]};\n};\n\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n // toString: () => string,\n toJSON: () => number[],\n // toJSON: () => {type: 'bytes', value: number[]},\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n }\n}\n","import {URL_ANY_PROTOCOL_REG_EXP} from '.';\n\nexport default function matchUrlProtocol(text: string) {\n return !text ? null : text.match(URL_ANY_PROTOCOL_REG_EXP);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WebPushApiManager} from '../mtproto/webPushApiManager';\nimport type {PushNotificationObject} from './push';\nimport type {MyUploadFile} from '../mtproto/apiFileManager';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport type ServicePushPingTaskPayload = {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n};\n\nexport type ServiceRequestFilePartTaskPayload = {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n};\n\nexport type ServiceDownloadTaskPayload = {\n headers: any,\n id: string\n};\n\nexport type ServiceEvent = {\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\n};\n\nexport default class ServiceMessagePort extends SuperMessagePort<{\n // from main thread to service worker\n notificationsClear: () => void,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => void,\n pushPing: (payload: ServicePushPingTaskPayload, source: MessageEventSource, event: MessageEvent) => void,\n hello: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n\n // from mtproto worker\n download: (payload: ServiceDownloadTaskPayload) => void,\n downloadChunk: (payload: {id: ServiceDownloadTaskPayload['id'], chunk: Uint8Array}) => void\n downloadFinalize: (payload: ServiceDownloadTaskPayload['id']) => void,\n downloadCancel: (payload: ServiceDownloadTaskPayload['id']) => void\n}, {\n // to main thread\n pushClick: (payload: PushNotificationObject) => void,\n hello: (payload: void, source: MessageEventSource) => void,\n share: (payload: ShareData) => void,\n\n // to mtproto worker\n requestFilePart: (payload: ServiceRequestFilePartTaskPayload) => Promise | MyUploadFile\n} & ServiceEvent, Master> {\n constructor() {\n super('SERVICE');\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.serviceMessagePort = this);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Modes from '../config/modes';\nimport {IS_WORKER} from '../helpers/context';\nimport {WorkerTaskTemplate} from '../types';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\n// import { stringify } from '../helpers/json';\n\nclass LocalStorage> {\n private prefix = '';\n private cache: Partial = {};\n private useStorage = true;\n\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\n if(Modes.test) {\n this.prefix = 't_';\n }\n }\n\n public get(key: T, useCache = true): Storage[T] {\n if(this.cache.hasOwnProperty(key) && useCache) {\n return this.cache[key];\n } else if(this.useStorage) {\n let value: Storage[T];\n try {\n value = localStorage.getItem(this.prefix + (key as string)) as any;\n } catch(err) {\n this.useStorage = false;\n }\n\n if(value !== null) {\n try {\n value = JSON.parse(value);\n } catch(err) {\n // console.error(err);\n }\n } else {\n value = undefined;\n }\n\n return value;\n }/* else {\n throw 'something went wrong';\n } */\n }\n\n public set(obj: Partial, onlyLocal = false) {\n for(const key in obj) {\n if(obj.hasOwnProperty(key)) {\n const value = obj[key];\n this.cache[key] = value;\n\n if(this.useStorage && !onlyLocal) {\n try {\n const stringified = JSON.stringify(value);\n localStorage.setItem(this.prefix + key, stringified);\n } catch(err) {\n this.useStorage = false;\n }\n }\n }\n }\n }\n\n public delete(key: keyof Storage, saveLocal = false) {\n // ! it is needed here\n key = '' + (key as string);\n\n if(!saveLocal) {\n delete this.cache[key];\n }\n\n // if(this.useStorage) {\n try {\n localStorage.removeItem(this.prefix + (key as string));\n } catch(err) {\n\n }\n // }\n }\n\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\n // if(this.useStorage) {\n try {\n let obj: Partial = {};\n if(preserveKeys) {\n preserveKeys.forEach((key) => {\n const value = this.get(key);\n if(value !== undefined) {\n obj[key] = value;\n }\n });\n }\n\n localStorage.clear();\n\n if(preserveKeys) {\n this.set(obj);\n }\n } catch(err) {\n\n }\n // }\n } */\n\n public clear() {\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id', 'k_build'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n for(const key of keys) {\n this.delete(key, true);\n }\n }\n\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\n this.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n this.clear();\n } else {\n return this.set(this.cache);\n }\n }\n}\n\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\n args: any[]\n }\n};\n\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: any\n};\n\nexport default class LocalStorageController> {\n private static STORAGES: LocalStorageController[] = [];\n // private log = (...args: any[]) => console.log('[SW LS]', ...args);\n // private log = (...args: any[]) => {};\n\n private storage: LocalStorage;\n\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\n LocalStorageController.STORAGES.push(this);\n\n if(!IS_WORKER) {\n this.storage = new LocalStorage(/* preserveKeys */);\n }\n }\n\n private async proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']): Promise {\n if(IS_WORKER) {\n const port = MTProtoMessagePort.getInstance();\n return port.invoke('localStorageProxy', {type, args});\n }\n\n args = Array.prototype.slice.call(args);\n\n // @ts-ignore\n return this.storage[type].apply(this.storage, args as any);\n }\n\n public get(key: T, useCache?: boolean) {\n return this.proxy('get', key, useCache);\n }\n\n public set(obj: Partial, onlyLocal?: boolean) {\n return this.proxy('set', obj, onlyLocal);\n }\n\n public delete(key: keyof Storage, saveLocal?: boolean) {\n return this.proxy('delete', key, saveLocal);\n }\n\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\n return this.proxy('clear'/* , preserveKeys */);\n }\n\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\n return this.proxy('toggleStorage', enabled, clearWrite);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppInstance} from './mtproto/singleInstance';\nimport type {UserAuth} from './mtproto/mtproto_config';\nimport type {DcId} from '../types';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport LocalStorageController from './localStorage';\n\nconst sessionStorage = new LocalStorageController<{\n dc: DcId,\n user_auth: UserAuth,\n state_id: number,\n dc1_auth_key: string,\n dc2_auth_key: string,\n dc3_auth_key: string,\n dc4_auth_key: string,\n dc5_auth_key: string,\n dc1_server_salt: string,\n dc2_server_salt: string,\n dc3_server_salt: string,\n dc4_server_salt: string,\n dc5_server_salt: string,\n server_time_offset: number,\n xt_instance: AppInstance,\n kz_version: 'K' | 'Z',\n tgme_sync: {\n canRedirect: boolean,\n ts: number\n },\n k_build: number\n}>(/* ['kz_version'] */);\nMOUNT_CLASS_TO.appStorage = sessionStorage;\nexport default sessionStorage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ChatSavedPosition} from './appManagers/appImManager';\nimport type {AppDraftsManager} from './appManagers/appDraftsManager';\nimport type {State} from '../config/state';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {LangPackDifference} from '../layer';\nimport AppStorage from './storage';\nimport DATABASE_STATE from '../config/databases/state';\n\nclass StateStorage extends AppStorage<{\n chatPositions: {\n [peerId_threadId: string]: ChatSavedPosition\n },\n langPack: LangPackDifference,\n drafts: AppDraftsManager['drafts'],\n user_auth: any, // support old webk format\n} & State, typeof DATABASE_STATE> {\n constructor() {\n super(DATABASE_STATE, 'session');\n }\n}\n\nconst stateStorage = new StateStorage();\nMOUNT_CLASS_TO.stateStorage = stateStorage;\nexport default stateStorage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../config/databases';\nimport {MOUNT_CLASS_TO} from '../config/debug';\n// import DATABASE_SESSION from \"../config/databases/session\";\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {IS_WORKER} from '../helpers/context';\nimport throttle from '../helpers/schedulers/throttle';\n// import { WorkerTaskTemplate } from \"../types\";\nimport IDBStorage from './files/idb';\n\nfunction noop() {}\n\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'set',\n keys: string[],\n values: any[]\n }\n};\n\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'delete',\n keys: string[]\n }\n}; */\n\nconst THROTTLE_TIME = 16;\n\n/* Storage extends {[name: string]: any} *//* Storage extends Record */\nexport default class AppStorage<\n Storage extends Record,\n T extends Database\n> {\n private static STORAGES: AppStorage>[] = [];\n private storage: IDBStorage;// new CacheStorageController('session');\n\n // private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\n private cache: Partial = {};\n private useStorage: boolean;\n private savingFreezed: boolean;\n\n private getPromises: Map> = new Map();\n private getThrottled: () => void;\n\n private keysToSet: Set = new Set();\n private saveThrottled: () => void;\n private saveDeferred = deferredPromise();\n\n private keysToDelete: Set = new Set();\n private deleteThrottled: () => void;\n private deleteDeferred = deferredPromise();\n\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\n this.storage = new IDBStorage(db, storeName);\n\n if(AppStorage.STORAGES.length) {\n this.useStorage = AppStorage.STORAGES[0].useStorage;\n } else {\n this.useStorage = true;\n }\n\n this.savingFreezed = false;\n\n AppStorage.STORAGES.push(this);\n\n this.saveThrottled = throttle(async() => {\n const deferred = this.saveDeferred;\n this.saveDeferred = deferredPromise();\n\n const set = this.keysToSet;\n if(set.size) {\n const keys = Array.from(set.values()) as string[];\n set.clear();\n\n const values = keys.map((key) => this.cache[key]);\n try {\n // console.log('setItem: will set', key/* , value */);\n // await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\n // await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\n\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\n self.postMessage({\n type: 'localStorageProxy',\n payload: {\n type: 'set',\n keys,\n values\n }\n } as LocalStorageProxySetTask);\n } */\n\n await this.storage.save(keys, values);\n // console.log('setItem: have set', key/* , value */);\n } catch(e) {\n // this.useCS = false;\n console.error('[AS]: set error:', e, keys, values);\n }\n }\n\n deferred.resolve();\n\n if(set.size) {\n this.saveThrottled();\n }\n }, THROTTLE_TIME, false);\n\n this.deleteThrottled = throttle(async() => {\n const deferred = this.deleteDeferred;\n this.deleteDeferred = deferredPromise();\n\n const set = this.keysToDelete;\n if(set.size) {\n const keys = Array.from(set.values()) as string[];\n set.clear();\n\n try {\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\n self.postMessage({\n type: 'localStorageProxy',\n payload: {\n type: 'delete',\n keys\n }\n } as LocalStorageProxyDeleteTask);\n } */\n\n await this.storage.delete(keys);\n } catch(e) {\n console.error('[AS]: delete error:', e, keys);\n }\n }\n\n deferred.resolve();\n\n if(set.size) {\n this.deleteThrottled();\n }\n }, THROTTLE_TIME, false);\n\n this.getThrottled = throttle(async() => {\n const keys = Array.from(this.getPromises.keys());\n\n // const perf = performance.now();\n this.storage.get(keys as string[]).then((values) => {\n for(let i = 0, length = keys.length; i < length; ++i) {\n const key = keys[i];\n const deferred = this.getPromises.get(key);\n if(deferred) {\n // @ts-ignore\n deferred.resolve(this.cache[key] = values[i]);\n this.getPromises.delete(key);\n }\n }\n\n // console.log('[AS]: get time', keys, performance.now() - perf);\n }, (error: ApiError) => {\n const ignoreErrors: Set = new Set(['NO_ENTRY_FOUND', 'STORAGE_OFFLINE']);\n if(!ignoreErrors.has(error.type)) {\n this.useStorage = false;\n console.error('[AS]: get error:', error, keys, storeName);\n }\n\n for(let i = 0, length = keys.length; i < length; ++i) {\n const key = keys[i];\n const deferred = this.getPromises.get(key);\n if(deferred) {\n // deferred.reject(error);\n deferred.resolve(undefined);\n this.getPromises.delete(key);\n }\n }\n }).finally(() => {\n if(this.getPromises.size) {\n this.getThrottled();\n }\n });\n }, THROTTLE_TIME, false);\n }\n\n public isAvailable() {\n return this.useStorage;\n }\n\n public getCache() {\n return this.cache;\n }\n\n public getFromCache(key: T) {\n return this.cache[key];\n }\n\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\n return this.cache[key] = value;\n }\n\n public async get(key: T, useCache = true): Promise {\n if(this.cache.hasOwnProperty(key) && useCache) {\n return this.getFromCache(key);\n } else if(this.useStorage) {\n const r = this.getPromises.get(key);\n if(r) return r as any;\n\n const p = deferredPromise();\n this.getPromises.set(key, p as any);\n\n this.getThrottled();\n\n return p;\n }/* else {\n throw 'something went wrong';\n } */\n }\n\n public getAll() {\n return this.storage.getAll().catch(() => []);\n }\n\n public set(obj: Partial, onlyLocal = false) {\n // console.log('storageSetValue', obj, callback, arguments);\n\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\n for(const key in obj) {\n if(obj.hasOwnProperty(key)) {\n const value = obj[key];\n this.setToCache(key, value);\n\n // let perf = /* DEBUG */false ? performance.now() : 0;\n // value = JSON.stringify(value);\n\n // if(perf) {\n // let elapsedTime = performance.now() - perf;\n // if(elapsedTime > 10) {\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\n // }\n // }\n\n /* perf = performance.now();\n value = stringify(value);\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\n\n if(canUseStorage) {\n this.keysToSet.add(key);\n this.keysToDelete.delete(key);\n this.saveThrottled();\n }\n }\n }\n\n return canUseStorage ? this.saveDeferred : Promise.resolve();\n }\n\n public delete(key: keyof Storage, saveLocal = false) {\n /* if(!this.cache.hasOwnProperty(key)) {\n return;\n } */\n\n // ! it is needed here\n key = '' + (key as string);\n\n if(!saveLocal) {\n delete this.cache[key];\n }\n\n if(this.useStorage) {\n this.keysToSet.delete(key);\n this.keysToDelete.add(key);\n this.deleteThrottled();\n }\n\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\n }\n\n public clear(saveLocal = false) {\n if(!saveLocal) {\n for(const i in this.cache) {\n delete this.cache[i];\n }\n }\n\n return this.storage.clear().catch(noop);\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!IS_WORKER || !clearWrite) {\n return;\n }\n\n if(!enabled) {\n storage.keysToSet.clear();\n storage.keysToDelete.clear();\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\n storage.getPromises.clear();\n return storage.clear(true);\n } else {\n return storage.set(storage.cache);\n }\n })).catch(noop);\n }\n\n public static freezeSaving>(callback: () => any, names: T['stores'][number]['name'][]) {\n this.STORAGES.forEach((storage) => storage.savingFreezed = true);\n try {\n callback();\n } catch(err) {\n console.error('freezeSaving callback error:', err);\n }\n this.STORAGES.forEach((storage) => storage.savingFreezed = false);\n }\n\n /* public deleteDatabase() {\n return IDBStorage.deleteDatabase().catch(noop);\n } */\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppStorage = AppStorage);\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n\nconst originalString = '((?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\udef1\\ud83c\\udffb\\u200d\\ud83e\\udef2\\ud83c[\\udffc-\\udfff]|\\ud83e\\udef1\\ud83c\\udffc\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\udef1\\ud83c\\udffd\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\udef1\\ud83c\\udffe\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\udef1\\ud83c\\udfff\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83e\\udd1d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91]|\\ud83e\\udd1d)|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f?|\\u2696\\ufe0f?|\\u2708\\ufe0f?|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)(?:(?:\\ud83c[\\udffb-\\udfff]|\\ufe0f?)\\u200d[\\u2640\\u2642]\\ufe0f?)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f?\\u200d\\u26a7\\ufe0f?|\\ud83c\\udff3\\ufe0f?\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f?|\\u2764\\ufe0f?\\u200d\\ud83d\\udd25|\\u2764\\ufe0f?\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f?|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f?|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f?|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f?|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f?|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f?|\\ud83e\\uddde\\u200d\\u2640\\ufe0f?|\\ud83e\\uddde\\u200d\\u2642\\ufe0f?|\\ud83e\\udddf\\u200d\\u2640\\ufe0f?|\\ud83e\\udddf\\u200d\\u2642\\ufe0f?|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f??\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f?)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f?|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f?|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd\\udec3-\\udec5\\udef0-\\udef6]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udedd-\\udedf\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb\\udff0]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcc\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7c\\ude80-\\ude86\\ude90-\\udeac\\udeb0-\\udeba\\udec0-\\udec2\\uded0-\\uded9\\udee0-\\udee7]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)';\nexport default originalString;\n"],"names":["MAIN_DOMAINS","threads","Math","min","navigator","hardwareConcurrency","App","id","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","includes","location","hostname","suffix","cryptoWorkers","name","stores","blobConstruct","blobParts","mimeType","Array","isArray","safeMimeType","Blob","type","blobSafeMimeType","indexOf","bufferConcats","args","length","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","forEach","b","set","ArrayBuffer","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","listeners","callback","addNotifyListener","push","deferred","Promise","resolve","reject","value","catch","finally","cancel","Object","assign","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","then","slice","bind","noop","copy","obj","Date","getTime","map","el","isView","clonedObj","constructor","prop","hasOwnProperty","deepEqual","x","y","ok","keys","tx","every","key","isObject","object","safeAssign","fromObject","i","undefined","validateInitObject","initObject","currentObject","onReplace","previousKey","ignorePaths","path","_path","has","String","prototype","toUserId","this","toChatId","toPeerId","isChat","isPeerId","test","toString","Number","abs","newMethod","originMethod","call","arrays","Uint16Array","Uint32Array","nextRandomUint","bits","array","crypto","getRandomValues","randomLong","recordPromiseBound","log","promise","description","perf","performance","now","warn","recordPromise","pause","ms","setTimeout","throttle","fn","shouldRunFirst","isPending","interval","_args","setInterval","clearInterval","capitalizeFirstLetter","string","charAt","toUpperCase","toggleStorages","enabled","clearWrite","tsNow","seconds","t","isAnyChat","peerId","isUser","CryptoMessagePort","super","lastIndex","invokeCryptoNew","method","transfer","payload","result","sendPortIndex","sendPorts","invoke","invokeCrypto","cryptoMessagePort","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","match","save","response","put","getFile","fileName","saveFile","blob","Response","headers","size","rejected","timeout","res","clearTimeout","prepareWriting","fileSize","getWriter","static","storage","MemoryWriter","saveFileCallback","bytes","write","part","offset","endOffset","newBytes","truncate","trim","finalize","saveToStorage","getParts","replaceParts","parts","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","IS_SAFARI","IS_FIREFOX","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","MTProtoMessagePort","INSTANCE","concat","toJSON","onFinally","reason","matchUrlProtocol","text","ServiceMessagePort","LocalStorage","useCache","localStorage","getItem","JSON","parse","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","clear","toggleStorage","LocalStorageController","proxy","apply","sessionStorage","StateStorage","stateStorage","AppStorage","db","storeName","getPromises","Map","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","savingFreezed","saveThrottled","from","values","e","deleteThrottled","getThrottled","isAvailable","getCache","getFromCache","setToCache","r","p","getAll","canUseStorage","add","names"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"946.e994ab75ad6a5d27ca15.bundle.js","mappings":"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","sources":["webpack://tweb/./src/config/app.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/object/copy.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/helpers/object/isObject.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/helpers/object/validateInitObject.ts","webpack://tweb/./src/helpers/peerIdPolyfill.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/recordPromise.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/helpers/schedulers/throttle.ts","webpack://tweb/./src/helpers/string/capitalizeFirstLetter.ts","webpack://tweb/./src/helpers/toggleStorages.ts","webpack://tweb/./src/helpers/tsNow.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isAnyChat.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isUser.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/files/cacheStorage.ts","webpack://tweb/./src/lib/files/memoryWriter.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/lib/mtproto/mtprotoMessagePort.ts","webpack://tweb/./src/lib/polyfill.ts","webpack://tweb/./src/lib/richTextProcessor/matchUrlProtocol.ts","webpack://tweb/./src/lib/serviceWorker/serviceMessagePort.ts","webpack://tweb/./src/lib/localStorage.ts","webpack://tweb/./src/lib/sessionStorage.ts","webpack://tweb/./src/lib/stateStorage.ts","webpack://tweb/./src/lib/storage.ts","webpack://tweb/./src/vendor/emoji/regex.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {DcId} from '../types';\n\nexport const MAIN_DOMAINS = ['web.telegram.org', 'webk.telegram.org'];\n\nconst threads = Math.min(4, navigator.hardwareConcurrency ?? 4);\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.8.4',\n langPack: 'webk',\n langPackCode: 'en',\n domains: MAIN_DOMAINS,\n baseDcId: 2 as DcId,\n isMainDomain: MAIN_DOMAINS.includes(location.hostname),\n suffix: 'K',\n threads,\n cryptoWorkers: threads\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Database} from '.';\nimport type {IDBIndex} from '../../lib/files/idb';\n\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\n name: 'tweb',\n version: 7,\n stores: [{\n name: 'session'\n }, {\n name: 'stickerSets'\n }, {\n name: 'users'\n }, {\n name: 'chats'\n }, {\n name: 'dialogs'\n // indexes: [\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\n // const name = `index_${idx}`;\n // const index: IDBIndex = {\n // indexName: name,\n // keyPath: name,\n // objectParameters: {}\n // };\n\n // return index\n // })\n // ]\n }, {\n name: 'messages'\n }]\n};\n\nexport default DATABASE_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from './blobSafeMimeType';\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n const safeMimeType = blobSafeMimeType(mimeType);\n const blob = new Blob(blobParts, {type: safeMimeType});\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n\n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from './noop';\n\nexport interface CancellablePromise extends Promise {\n resolve?: (value: T) => void,\n reject?: (...args: any[]) => void,\n cancel?: (reason?: any) => void,\n\n notify?: (...args: any[]) => void,\n notifyAll?: (...args: any[]) => void,\n lastNotify?: any,\n listeners?: Array<(...args: any[]) => void>,\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\n\n isFulfilled?: boolean,\n isRejected?: boolean\n}\n\nexport default function deferredPromise() {\n const deferredHelper: any = {\n isFulfilled: false,\n isRejected: false,\n\n notify: () => {},\n notifyAll: (...args: any[]) => {\n deferredHelper.lastNotify = args;\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\n },\n\n listeners: [],\n addNotifyListener: (callback: (...args: any[]) => void) => {\n if(deferredHelper.lastNotify) {\n callback(...deferredHelper.lastNotify);\n }\n\n deferredHelper.listeners.push(callback);\n }\n };\n\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\n deferredHelper.resolve = (value: T) => {\n if(deferred.isFulfilled || deferred.isRejected) return;\n\n deferred.isFulfilled = true;\n resolve(value);\n };\n\n deferredHelper.reject = (...args: any[]) => {\n if(deferred.isRejected || deferred.isFulfilled) return;\n\n deferred.isRejected = true;\n reject(...args);\n };\n });\n\n // @ts-ignore\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\n const n = deferredPromise>();\n\n }; */\n\n deferred.catch(noop).finally(() => {\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\n deferred.listeners.length = 0;\n\n if(deferred.cancel) {\n deferred.cancel = noop;\n }\n });\n\n Object.assign(deferred, deferredHelper);\n\n return deferred;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// в SW может быть сразу две переменных TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","export default function noop() {}\n","export default function copy(obj: T): T {\n // in case of premitives\n if(obj === null || typeof(obj) !== 'object') {\n return obj;\n }\n\n // date objects should be\n if(obj instanceof Date) {\n return new Date(obj.getTime()) as any;\n }\n\n // handle Array\n if(Array.isArray(obj)) {\n // @ts-ignore\n const clonedArr: T = obj.map((el) => copy(el)) as any as T;\n return clonedArr;\n }\n\n if(ArrayBuffer.isView(obj)) {\n // @ts-ignore\n return obj.slice();\n }\n\n // lastly, handle objects\n // @ts-ignore\n const clonedObj = new obj.constructor();\n for(var prop in obj) {\n if(obj.hasOwnProperty(prop)) {\n clonedObj[prop] = copy(obj[prop]);\n }\n }\n return clonedObj;\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","export default function isObject>(object: any): object is T {\n return typeof(object) === 'object' && object !== null;\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(const i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","import copy from './copy';\nimport isObject from './isObject';\n\nexport default function validateInitObject(\n initObject: any,\n currentObject: any,\n onReplace?: (key: string) => void,\n previousKey?: string,\n ignorePaths?: Set,\n path?: string\n) {\n for(const key in initObject) {\n const _path = path ? `${path}.${key}` : key;\n if(ignorePaths?.has(_path)) {\n continue;\n }\n\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace?.(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key, ignorePaths, _path);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport isAnyChat from '../lib/appManagers/utils/peers/isAnyChat';\nimport isUser from '../lib/appManagers/utils/peers/isUser';\n\nString.prototype.toUserId = function() {\n return (+this).toUserId();\n};\n\nString.prototype.toChatId = function() {\n return (+this).toChatId();\n};\n\nString.prototype.toPeerId = function(isChat?: boolean) {\n return (+this).toPeerId(isChat);\n};\n\nString.prototype.isPeerId = function() {\n return /^[\\d-]/.test(this.toString());\n};\n\nNumber.prototype.toUserId = function() {\n return this as any;\n};\n\nNumber.prototype.toChatId = function() {\n return Math.abs(this as any);\n};\n\nNumber.prototype.toPeerId = function(isChat?: boolean) {\n return isChat === undefined ? this as number : (isChat ? -Math.abs(this as number) : this as number);\n};\n\nNumber.prototype.isPeerId = function() {\n return true;\n};\n\n[\n ['isUser' as const, isUser],\n ['isAnyChat' as const, isAnyChat]\n].forEach((value) => {\n const newMethod = Array.isArray(value) ? value[0] : value;\n const originMethod = Array.isArray(value) ? value[1] : value;\n // @ts-ignore\n String.prototype[newMethod] = function() {\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, this.toString());\n };\n\n // @ts-ignore\n Number.prototype[newMethod] = function() {\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, this);\n };\n});\n\ndeclare global {\n interface String {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is string;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n\n interface Number {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is PeerId;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n}\n\nexport {};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1)\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","import {logger} from '../lib/logger';\nimport dT from './dT';\n\nexport function recordPromise>(promise: T, description: string, log?: ReturnType | Console) {\n const perf = performance.now();\n (log || console).warn(dT(), 'start', description);\n promise.then(() => {\n (log || console).warn(dT(), 'end', description, performance.now() - perf);\n });\n return promise;\n}\n\nexport function recordPromiseBound(log: ReturnType | Console) {\n return (...args: [Parameters[0], Parameters[1]]) => {\n return recordPromise(...args, log);\n };\n}\n","export default function pause(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\n\nexport default function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true\n) {\n let interval: number | null = null;\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 interval = setInterval(() => {\n if(!isPending) {\n clearInterval(interval!);\n interval = null;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms) as any;\n }\n };\n}\n","export default function capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CacheStorageController from '../lib/files/cacheStorage';\nimport AppStorage from '../lib/storage';\nimport sessionStorage from '../lib/sessionStorage';\nimport noop from './noop';\n\nexport default function toggleStorages(enabled: boolean, clearWrite: boolean) {\n return Promise.all([\n AppStorage.toggleStorage(enabled, clearWrite),\n CacheStorageController.toggleStorage(enabled, clearWrite),\n sessionStorage.toggleStorage(enabled, clearWrite)\n ]).then(noop, noop);\n}\n","export default function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? t / 1000 | 0 : t;\n}\n","export default function isAnyChat(peerId: PeerId) {\n return +peerId < 0;\n}\n","export default function isUser(peerId: PeerId) {\n return +peerId >= 0;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CryptoMethods} from './crypto_methods';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {Awaited} from '../../types';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IS_WORKER} from '../../helpers/context';\n\ntype CryptoEvent = {\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n terminate: () => void\n};\n\nexport class CryptoMessagePort extends SuperMessagePort {\n private lastIndex: number;\n\n constructor() {\n super('CRYPTO');\n this.lastIndex = -1;\n }\n\n public invokeCryptoNew({method, args, transfer}: {\n method: T,\n args: Parameters,\n transfer?: Transferable[]\n }): Promise>> {\n const payload = {method, args};\n const listeners = this.listeners['invoke'];\n if(listeners?.length) { // already in worker\n // try {\n // @ts-ignore\n let result: any = listeners[0].callback(payload);\n if(!IS_WORKER && !(result instanceof Promise)) {\n result = Promise.resolve(result);\n }\n\n return result;\n // } catch(err) {\n // return Promise.reject(err);\n // }\n }\n\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\n 0;\n // @ts-ignore\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\n }\n\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\n return this.invokeCryptoNew({method, args});\n }\n}\n\nconst cryptoMessagePort = new CryptoMessagePort();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\nexport default cryptoMessagePort;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../../config/modes';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport MemoryWriter from './memoryWriter';\nimport FileManager from './memoryWriter';\nimport FileStorage from './fileStorage';\nimport makeError from '../../helpers/makeError';\nimport deferredPromise from '../../helpers/cancellablePromise';\n\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\n\nexport default class CacheStorageController implements FileStorage {\n private static STORAGES: CacheStorageController[] = [];\n private openDbPromise: Promise;\n\n private useStorage = true;\n\n // private log: ReturnType = logger('CS');\n\n constructor(private dbName: CacheStorageDbName) {\n if(Modes.test) {\n this.dbName += '_test';\n }\n\n if(CacheStorageController.STORAGES.length) {\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\n }\n\n this.openDatabase();\n CacheStorageController.STORAGES.push(this);\n }\n\n private openDatabase(): Promise {\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\n }\n\n public delete(entryName: string) {\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\n }\n\n public deleteAll() {\n return caches.delete(this.dbName);\n }\n\n public get(entryName: string) {\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\n }\n\n public save(entryName: string, response: Response) {\n // return new Promise((resolve) => {}); // DEBUG\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\n }\n\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\n /* if(method === 'blob') {\n return Promise.reject();\n } */\n\n // const str = `get fileName: ${fileName}`;\n // console.time(str);\n return this.get(fileName).then((response) => {\n if(!response) {\n // console.warn('getFile:', response, fileName);\n throw makeError('NO_ENTRY_FOUND');\n }\n\n const promise = response[method]();\n // promise.then(() => {\n // console.timeEnd(str);\n // });\n return promise;\n });\n }\n\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct(blob);\n }\n\n const response = new Response(blob, {\n headers: {\n 'Content-Length': '' + blob.size\n }\n });\n\n return this.save(fileName, response).then(() => blob as Blob);\n }\n\n public timeoutOperation(callback: (cache: Cache) => Promise) {\n if(!this.useStorage) {\n return Promise.reject(makeError('STORAGE_OFFLINE'));\n }\n\n return new Promise(async(resolve, reject) => {\n let rejected = false;\n const timeout = setTimeout(() => {\n reject();\n // console.warn('CACHESTORAGE TIMEOUT');\n rejected = true;\n }, 15e3);\n\n try {\n const cache = await this.openDatabase();\n if(!cache) {\n this.useStorage = false;\n this.openDbPromise = undefined;\n throw 'no cache?';\n }\n\n const res = await callback(cache);\n\n if(rejected) return;\n resolve(res);\n } catch(err) {\n reject(err);\n }\n\n clearTimeout(timeout);\n });\n }\n\n public prepareWriting(fileName: string, fileSize: number, mimeType: string) {\n return {\n deferred: deferredPromise(),\n getWriter: () => {\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\n return this.saveFile(fileName, blob).catch(() => blob);\n });\n\n return writer;\n }\n };\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n return storage.deleteAll();\n }\n }));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport StreamWriter from './streamWriter';\n\nexport default class MemoryWriter implements StreamWriter {\n private bytes: Uint8Array;\n\n constructor(\n private mimeType: string,\n private size: number,\n private saveFileCallback?: (blob: Blob) => Promise\n ) {\n this.bytes = new Uint8Array(size);\n }\n\n public async write(part: Uint8Array, offset: number) {\n // sometimes file size can be bigger than the prov\n const endOffset = offset + part.byteLength;\n if(endOffset > this.bytes.byteLength) {\n const newBytes = new Uint8Array(endOffset);\n newBytes.set(this.bytes, 0);\n this.bytes = newBytes;\n }\n\n this.bytes.set(part, offset);\n };\n\n public truncate() {\n this.bytes = new Uint8Array();\n }\n\n public trim(size: number) {\n this.bytes = this.bytes.slice(0, size);\n }\n\n public finalize(saveToStorage = true) {\n const blob = blobConstruct(this.bytes, this.mimeType);\n\n if(saveToStorage && this.saveFileCallback) {\n this.saveFileCallback(blob);\n }\n\n return blob;\n }\n\n public getParts() {\n return this.bytes;\n }\n\n public replaceParts(parts: Uint8Array) {\n this.bytes = parts;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n // level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport type {getEnvironment} from '../../environment/utils';\nimport type loadState from '../appManagers/utils/state/loadState';\nimport type {StoragesResults} from '../appManagers/utils/storages/loadStorages';\nimport type {LocalStorageProxyTask} from '../localStorage';\nimport type {Awaited} from '../../types';\nimport type {Mirrors, MirrorTaskPayload, NotificationBuildTaskPayload, TabState} from './mtprotoworker';\nimport type toggleStorages from '../../helpers/toggleStorages';\nimport SuperMessagePort from './superMessagePort';\n\nexport type MTProtoManagerTaskPayload = {name: string, method: string, args: any[]};\n\ntype MTProtoBroadcastEvent = {\n event: (payload: {name: string, args: any[]}, source: MessageEventSource) => void\n};\n\nexport default class MTProtoMessagePort extends SuperMessagePort<{\n environment: (environment: ReturnType) => void,\n crypto: (payload: {method: string, args: any[]}) => Promise,\n state: (payload: {userId: UserId} & Awaited> & {storagesResults?: StoragesResults}) => void,\n manager: (payload: MTProtoManagerTaskPayload) => any,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => ReturnType,\n serviceWorkerOnline: (online: boolean) => void,\n serviceWorkerPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n cryptoPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n createObjectURL: (blob: Blob) => string,\n tabState: (payload: TabState, source: MessageEventSource) => void,\n createProxyWorkerURLs: (payload: {originalUrl: string, blob: Blob}) => string[],\n} & MTProtoBroadcastEvent, {\n convertWebp: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n convertOpus: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n localStorageProxy: (payload: LocalStorageProxyTask['payload']) => Promise,\n mirror: (payload: MirrorTaskPayload) => void,\n notificationBuild: (payload: NotificationBuildTaskPayload) => void,\n // hello: () => void\n} & MTProtoBroadcastEvent, Master> {\n private static INSTANCE: MTProtoMessagePort;\n\n constructor() {\n super('MTPROTO');\n\n MTProtoMessagePort.INSTANCE = this;\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.mtprotoMessagePort = this);\n }\n\n public static getInstance() {\n return this.INSTANCE as MTProtoMessagePort;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bufferConcats from '../helpers/bytes/bufferConcats';\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n // return {type: 'bytes', value: [...this]};\n};\n\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n // toString: () => string,\n toJSON: () => number[],\n // toJSON: () => {type: 'bytes', value: number[]},\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n }\n}\n","import {URL_ANY_PROTOCOL_REG_EXP} from '.';\n\nexport default function matchUrlProtocol(text: string) {\n return !text ? null : text.match(URL_ANY_PROTOCOL_REG_EXP);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WebPushApiManager} from '../mtproto/webPushApiManager';\nimport type {PushNotificationObject} from './push';\nimport type {MyUploadFile} from '../mtproto/apiFileManager';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport type ServicePushPingTaskPayload = {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n};\n\nexport type ServiceRequestFilePartTaskPayload = {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n};\n\nexport type ServiceDownloadTaskPayload = {\n headers: any,\n id: string\n};\n\nexport type ServiceEvent = {\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\n};\n\nexport default class ServiceMessagePort extends SuperMessagePort<{\n // from main thread to service worker\n notificationsClear: () => void,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => void,\n pushPing: (payload: ServicePushPingTaskPayload, source: MessageEventSource, event: MessageEvent) => void,\n hello: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n\n // from mtproto worker\n download: (payload: ServiceDownloadTaskPayload) => void,\n downloadChunk: (payload: {id: ServiceDownloadTaskPayload['id'], chunk: Uint8Array}) => void\n downloadFinalize: (payload: ServiceDownloadTaskPayload['id']) => void,\n downloadCancel: (payload: ServiceDownloadTaskPayload['id']) => void\n}, {\n // to main thread\n pushClick: (payload: PushNotificationObject) => void,\n hello: (payload: void, source: MessageEventSource) => void,\n share: (payload: ShareData) => void,\n\n // to mtproto worker\n requestFilePart: (payload: ServiceRequestFilePartTaskPayload) => Promise | MyUploadFile\n} & ServiceEvent, Master> {\n constructor() {\n super('SERVICE');\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.serviceMessagePort = this);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Modes from '../config/modes';\nimport {IS_WORKER} from '../helpers/context';\nimport {WorkerTaskTemplate} from '../types';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\n// import { stringify } from '../helpers/json';\n\nclass LocalStorage> {\n private prefix = '';\n private cache: Partial = {};\n private useStorage = true;\n\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\n if(Modes.test) {\n this.prefix = 't_';\n }\n }\n\n public get(key: T, useCache = true): Storage[T] {\n if(this.cache.hasOwnProperty(key) && useCache) {\n return this.cache[key];\n } else if(this.useStorage) {\n let value: Storage[T];\n try {\n value = localStorage.getItem(this.prefix + (key as string)) as any;\n } catch(err) {\n this.useStorage = false;\n }\n\n if(value !== null) {\n try {\n value = JSON.parse(value);\n } catch(err) {\n // console.error(err);\n }\n } else {\n value = undefined;\n }\n\n return value;\n }/* else {\n throw 'something went wrong';\n } */\n }\n\n public set(obj: Partial, onlyLocal = false) {\n for(const key in obj) {\n if(obj.hasOwnProperty(key)) {\n const value = obj[key];\n this.cache[key] = value;\n\n if(this.useStorage && !onlyLocal) {\n try {\n const stringified = JSON.stringify(value);\n localStorage.setItem(this.prefix + key, stringified);\n } catch(err) {\n this.useStorage = false;\n }\n }\n }\n }\n }\n\n public delete(key: keyof Storage, saveLocal = false) {\n // ! it is needed here\n key = '' + (key as string);\n\n if(!saveLocal) {\n delete this.cache[key];\n }\n\n // if(this.useStorage) {\n try {\n localStorage.removeItem(this.prefix + (key as string));\n } catch(err) {\n\n }\n // }\n }\n\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\n // if(this.useStorage) {\n try {\n let obj: Partial = {};\n if(preserveKeys) {\n preserveKeys.forEach((key) => {\n const value = this.get(key);\n if(value !== undefined) {\n obj[key] = value;\n }\n });\n }\n\n localStorage.clear();\n\n if(preserveKeys) {\n this.set(obj);\n }\n } catch(err) {\n\n }\n // }\n } */\n\n public clear() {\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id', 'k_build'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n for(const key of keys) {\n this.delete(key, true);\n }\n }\n\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\n this.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n this.clear();\n } else {\n return this.set(this.cache);\n }\n }\n}\n\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\n args: any[]\n }\n};\n\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: any\n};\n\nexport default class LocalStorageController> {\n private static STORAGES: LocalStorageController[] = [];\n // private log = (...args: any[]) => console.log('[SW LS]', ...args);\n // private log = (...args: any[]) => {};\n\n private storage: LocalStorage;\n\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\n LocalStorageController.STORAGES.push(this);\n\n if(!IS_WORKER) {\n this.storage = new LocalStorage(/* preserveKeys */);\n }\n }\n\n private async proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']): Promise {\n if(IS_WORKER) {\n const port = MTProtoMessagePort.getInstance();\n return port.invoke('localStorageProxy', {type, args});\n }\n\n args = Array.prototype.slice.call(args);\n\n // @ts-ignore\n return this.storage[type].apply(this.storage, args as any);\n }\n\n public get(key: T, useCache?: boolean) {\n return this.proxy('get', key, useCache);\n }\n\n public set(obj: Partial, onlyLocal?: boolean) {\n return this.proxy('set', obj, onlyLocal);\n }\n\n public delete(key: keyof Storage, saveLocal?: boolean) {\n return this.proxy('delete', key, saveLocal);\n }\n\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\n return this.proxy('clear'/* , preserveKeys */);\n }\n\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\n return this.proxy('toggleStorage', enabled, clearWrite);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppInstance} from './mtproto/singleInstance';\nimport type {UserAuth} from './mtproto/mtproto_config';\nimport type {DcId} from '../types';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport LocalStorageController from './localStorage';\n\nconst sessionStorage = new LocalStorageController<{\n dc: DcId,\n user_auth: UserAuth,\n state_id: number,\n dc1_auth_key: string,\n dc2_auth_key: string,\n dc3_auth_key: string,\n dc4_auth_key: string,\n dc5_auth_key: string,\n dc1_server_salt: string,\n dc2_server_salt: string,\n dc3_server_salt: string,\n dc4_server_salt: string,\n dc5_server_salt: string,\n server_time_offset: number,\n xt_instance: AppInstance,\n kz_version: 'K' | 'Z',\n tgme_sync: {\n canRedirect: boolean,\n ts: number\n },\n k_build: number\n}>(/* ['kz_version'] */);\nMOUNT_CLASS_TO.appStorage = sessionStorage;\nexport default sessionStorage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ChatSavedPosition} from './appManagers/appImManager';\nimport type {AppDraftsManager} from './appManagers/appDraftsManager';\nimport type {State} from '../config/state';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {LangPackDifference} from '../layer';\nimport AppStorage from './storage';\nimport DATABASE_STATE from '../config/databases/state';\n\nclass StateStorage extends AppStorage<{\n chatPositions: {\n [peerId_threadId: string]: ChatSavedPosition\n },\n langPack: LangPackDifference,\n drafts: AppDraftsManager['drafts'],\n user_auth: any, // support old webk format\n} & State, typeof DATABASE_STATE> {\n constructor() {\n super(DATABASE_STATE, 'session');\n }\n}\n\nconst stateStorage = new StateStorage();\nMOUNT_CLASS_TO.stateStorage = stateStorage;\nexport default stateStorage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../config/databases';\nimport {MOUNT_CLASS_TO} from '../config/debug';\n// import DATABASE_SESSION from \"../config/databases/session\";\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {IS_WORKER} from '../helpers/context';\nimport throttle from '../helpers/schedulers/throttle';\n// import { WorkerTaskTemplate } from \"../types\";\nimport IDBStorage from './files/idb';\n\nfunction noop() {}\n\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'set',\n keys: string[],\n values: any[]\n }\n};\n\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'delete',\n keys: string[]\n }\n}; */\n\nconst THROTTLE_TIME = 16;\n\n/* Storage extends {[name: string]: any} *//* Storage extends Record */\nexport default class AppStorage<\n Storage extends Record,\n T extends Database\n> {\n private static STORAGES: AppStorage>[] = [];\n private storage: IDBStorage;// new CacheStorageController('session');\n\n // private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\n private cache: Partial = {};\n private useStorage: boolean;\n private savingFreezed: boolean;\n\n private getPromises: Map> = new Map();\n private getThrottled: () => void;\n\n private keysToSet: Set = new Set();\n private saveThrottled: () => void;\n private saveDeferred = deferredPromise();\n\n private keysToDelete: Set = new Set();\n private deleteThrottled: () => void;\n private deleteDeferred = deferredPromise();\n\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\n this.storage = new IDBStorage(db, storeName);\n\n if(AppStorage.STORAGES.length) {\n this.useStorage = AppStorage.STORAGES[0].useStorage;\n } else {\n this.useStorage = true;\n }\n\n this.savingFreezed = false;\n\n AppStorage.STORAGES.push(this);\n\n this.saveThrottled = throttle(async() => {\n const deferred = this.saveDeferred;\n this.saveDeferred = deferredPromise();\n\n const set = this.keysToSet;\n if(set.size) {\n const keys = Array.from(set.values()) as string[];\n set.clear();\n\n const values = keys.map((key) => this.cache[key]);\n try {\n // console.log('setItem: will set', key/* , value */);\n // await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\n // await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\n\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\n self.postMessage({\n type: 'localStorageProxy',\n payload: {\n type: 'set',\n keys,\n values\n }\n } as LocalStorageProxySetTask);\n } */\n\n await this.storage.save(keys, values);\n // console.log('setItem: have set', key/* , value */);\n } catch(e) {\n // this.useCS = false;\n console.error('[AS]: set error:', e, keys, values);\n }\n }\n\n deferred.resolve();\n\n if(set.size) {\n this.saveThrottled();\n }\n }, THROTTLE_TIME, false);\n\n this.deleteThrottled = throttle(async() => {\n const deferred = this.deleteDeferred;\n this.deleteDeferred = deferredPromise();\n\n const set = this.keysToDelete;\n if(set.size) {\n const keys = Array.from(set.values()) as string[];\n set.clear();\n\n try {\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\n self.postMessage({\n type: 'localStorageProxy',\n payload: {\n type: 'delete',\n keys\n }\n } as LocalStorageProxyDeleteTask);\n } */\n\n await this.storage.delete(keys);\n } catch(e) {\n console.error('[AS]: delete error:', e, keys);\n }\n }\n\n deferred.resolve();\n\n if(set.size) {\n this.deleteThrottled();\n }\n }, THROTTLE_TIME, false);\n\n this.getThrottled = throttle(async() => {\n const keys = Array.from(this.getPromises.keys());\n\n // const perf = performance.now();\n this.storage.get(keys as string[]).then((values) => {\n for(let i = 0, length = keys.length; i < length; ++i) {\n const key = keys[i];\n const deferred = this.getPromises.get(key);\n if(deferred) {\n // @ts-ignore\n deferred.resolve(this.cache[key] = values[i]);\n this.getPromises.delete(key);\n }\n }\n\n // console.log('[AS]: get time', keys, performance.now() - perf);\n }, (error: ApiError) => {\n const ignoreErrors: Set = new Set(['NO_ENTRY_FOUND', 'STORAGE_OFFLINE']);\n if(!ignoreErrors.has(error.type)) {\n this.useStorage = false;\n console.error('[AS]: get error:', error, keys, storeName);\n }\n\n for(let i = 0, length = keys.length; i < length; ++i) {\n const key = keys[i];\n const deferred = this.getPromises.get(key);\n if(deferred) {\n // deferred.reject(error);\n deferred.resolve(undefined);\n this.getPromises.delete(key);\n }\n }\n }).finally(() => {\n if(this.getPromises.size) {\n this.getThrottled();\n }\n });\n }, THROTTLE_TIME, false);\n }\n\n public isAvailable() {\n return this.useStorage;\n }\n\n public getCache() {\n return this.cache;\n }\n\n public getFromCache(key: T) {\n return this.cache[key];\n }\n\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\n return this.cache[key] = value;\n }\n\n public async get(key: T, useCache = true): Promise {\n if(this.cache.hasOwnProperty(key) && useCache) {\n return this.getFromCache(key);\n } else if(this.useStorage) {\n const r = this.getPromises.get(key);\n if(r) return r as any;\n\n const p = deferredPromise();\n this.getPromises.set(key, p as any);\n\n this.getThrottled();\n\n return p;\n }/* else {\n throw 'something went wrong';\n } */\n }\n\n public getAll() {\n return this.storage.getAll().catch(() => []);\n }\n\n public set(obj: Partial, onlyLocal = false) {\n // console.log('storageSetValue', obj, callback, arguments);\n\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\n for(const key in obj) {\n if(obj.hasOwnProperty(key)) {\n const value = obj[key];\n this.setToCache(key, value);\n\n // let perf = /* DEBUG */false ? performance.now() : 0;\n // value = JSON.stringify(value);\n\n // if(perf) {\n // let elapsedTime = performance.now() - perf;\n // if(elapsedTime > 10) {\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\n // }\n // }\n\n /* perf = performance.now();\n value = stringify(value);\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\n\n if(canUseStorage) {\n this.keysToSet.add(key);\n this.keysToDelete.delete(key);\n this.saveThrottled();\n }\n }\n }\n\n return canUseStorage ? this.saveDeferred : Promise.resolve();\n }\n\n public delete(key: keyof Storage, saveLocal = false) {\n /* if(!this.cache.hasOwnProperty(key)) {\n return;\n } */\n\n // ! it is needed here\n key = '' + (key as string);\n\n if(!saveLocal) {\n delete this.cache[key];\n }\n\n if(this.useStorage) {\n this.keysToSet.delete(key);\n this.keysToDelete.add(key);\n this.deleteThrottled();\n }\n\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\n }\n\n public clear(saveLocal = false) {\n if(!saveLocal) {\n for(const i in this.cache) {\n delete this.cache[i];\n }\n }\n\n return this.storage.clear().catch(noop);\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!IS_WORKER || !clearWrite) {\n return;\n }\n\n if(!enabled) {\n storage.keysToSet.clear();\n storage.keysToDelete.clear();\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\n storage.getPromises.clear();\n return storage.clear(true);\n } else {\n return storage.set(storage.cache);\n }\n })).catch(noop);\n }\n\n public static freezeSaving>(callback: () => any, names: T['stores'][number]['name'][]) {\n this.STORAGES.forEach((storage) => storage.savingFreezed = true);\n try {\n callback();\n } catch(err) {\n console.error('freezeSaving callback error:', err);\n }\n this.STORAGES.forEach((storage) => storage.savingFreezed = false);\n }\n\n /* public deleteDatabase() {\n return IDBStorage.deleteDatabase().catch(noop);\n } */\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppStorage = AppStorage);\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n\nconst originalString = '((?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\udef1\\ud83c\\udffb\\u200d\\ud83e\\udef2\\ud83c[\\udffc-\\udfff]|\\ud83e\\udef1\\ud83c\\udffc\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\udef1\\ud83c\\udffd\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\udef1\\ud83c\\udffe\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\udef1\\ud83c\\udfff\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83e\\udd1d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91]|\\ud83e\\udd1d)|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f?|\\u2696\\ufe0f?|\\u2708\\ufe0f?|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)(?:(?:\\ud83c[\\udffb-\\udfff]|\\ufe0f?)\\u200d[\\u2640\\u2642]\\ufe0f?)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f?\\u200d\\u26a7\\ufe0f?|\\ud83c\\udff3\\ufe0f?\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f?|\\u2764\\ufe0f?\\u200d\\ud83d\\udd25|\\u2764\\ufe0f?\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f?|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f?|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f?|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f?|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f?|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f?|\\ud83e\\uddde\\u200d\\u2640\\ufe0f?|\\ud83e\\uddde\\u200d\\u2642\\ufe0f?|\\ud83e\\udddf\\u200d\\u2640\\ufe0f?|\\ud83e\\udddf\\u200d\\u2642\\ufe0f?|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f??\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f?)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f?|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f?|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd\\udec3-\\udec5\\udef0-\\udef6]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udedd-\\udedf\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb\\udff0]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcc\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7c\\ude80-\\ude86\\ude90-\\udeac\\udeb0-\\udeba\\udec0-\\udec2\\uded0-\\uded9\\udee0-\\udee7]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)';\nexport default originalString;\n"],"names":["MAIN_DOMAINS","threads","Math","min","navigator","hardwareConcurrency","App","id","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","includes","location","hostname","suffix","cryptoWorkers","name","stores","blobConstruct","blobParts","mimeType","Array","isArray","safeMimeType","Blob","type","blobSafeMimeType","indexOf","bufferConcats","args","length","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","forEach","b","set","ArrayBuffer","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","listeners","callback","addNotifyListener","push","deferred","Promise","resolve","reject","value","catch","finally","cancel","Object","assign","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","then","slice","bind","noop","copy","obj","Date","getTime","map","el","isView","clonedObj","constructor","prop","hasOwnProperty","deepEqual","x","y","ok","keys","tx","every","key","isObject","object","safeAssign","fromObject","i","undefined","validateInitObject","initObject","currentObject","onReplace","previousKey","ignorePaths","path","_path","has","String","prototype","toUserId","this","toChatId","toPeerId","isChat","isPeerId","test","toString","Number","abs","newMethod","originMethod","call","arrays","Uint16Array","Uint32Array","nextRandomUint","bits","array","crypto","getRandomValues","randomLong","recordPromiseBound","log","promise","description","perf","performance","now","warn","recordPromise","pause","ms","setTimeout","throttle","fn","shouldRunFirst","isPending","interval","_args","setInterval","clearInterval","capitalizeFirstLetter","string","charAt","toUpperCase","toggleStorages","enabled","clearWrite","tsNow","seconds","t","isAnyChat","peerId","isUser","CryptoMessagePort","super","lastIndex","invokeCryptoNew","method","transfer","payload","result","sendPortIndex","sendPorts","invoke","invokeCrypto","cryptoMessagePort","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","match","save","response","put","getFile","fileName","saveFile","blob","Response","headers","size","rejected","timeout","res","clearTimeout","prepareWriting","fileSize","getWriter","static","storage","MemoryWriter","saveFileCallback","bytes","write","part","offset","endOffset","newBytes","truncate","trim","finalize","saveToStorage","getParts","replaceParts","parts","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","IS_SAFARI","IS_FIREFOX","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","MTProtoMessagePort","INSTANCE","concat","toJSON","onFinally","reason","matchUrlProtocol","text","ServiceMessagePort","LocalStorage","useCache","localStorage","getItem","JSON","parse","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","clear","toggleStorage","LocalStorageController","proxy","apply","sessionStorage","StateStorage","stateStorage","AppStorage","db","storeName","getPromises","Map","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","savingFreezed","saveThrottled","from","values","e","deleteThrottled","getThrottled","isAvailable","getCache","getFromCache","setToCache","r","p","getAll","canUseStorage","add","names"],"sourceRoot":""} \ No newline at end of file diff --git a/public/crypto.worker.574dd04f2dfaff484dc3.chunk.js b/public/crypto.worker.fe5845cc2133b5405cac.chunk.js similarity index 99% rename from public/crypto.worker.574dd04f2dfaff484dc3.chunk.js rename to public/crypto.worker.fe5845cc2133b5405cac.chunk.js index 757eba47..18ab86e8 100644 --- a/public/crypto.worker.574dd04f2dfaff484dc3.chunk.js +++ b/public/crypto.worker.fe5845cc2133b5405cac.chunk.js @@ -1,2 +1,2 @@ (()=>{"use strict";var e,t,n={410:(e,t,n)=>{n.d(t,{GO:()=>o,ZP:()=>i});const r=n(1267).Z.debug,o="undefined"!=typeof window?window:self,i=r},4762:(e,t,n)=>{n.d(t,{IS_FIREFOX:()=>f,IS_SAFARI:()=>i});var r=n(6761);const o=navigator?navigator.userAgent:null,i=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&r.Z.MSStream,!!("safari"in r.Z)||!(!o||!(/\b(iPad|iPhone|iPod)\b/.test(o)||o.match("Safari")&&!o.match("Chrome")))),f=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;(void 0===navigator.maxTouchPoints||navigator.maxTouchPoints>0)&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},1352:(e,t,n)=>{n.d(t,{N5:()=>o,SU:()=>r,kC:()=>i});const r="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,o="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!r,i=o||r,f=(e,...t)=>{try{e.postMessage(...t)}catch(e){console.error("[worker] postMessage error:",e,t)}},c=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((n=>{n.length&&n.slice(e?0:-1).forEach((e=>{f(e,...t)}))}))};r&&c.bind(null,!1),r&&c.bind(null,!0)},6991:(e,t,n)=>{function r(...e){const t=e.reduce(((e,t)=>e+(t.byteLength||t.length)),0),n=new Uint8Array(t);let r=0;return e.forEach((e=>{n.set(e instanceof ArrayBuffer?new Uint8Array(e):e,r),r+=e.byteLength||e.length})),n}Uint8Array.prototype.concat=function(...e){return r(this,...e)},Uint8Array.prototype.toJSON=function(){return[...this]},Promise.prototype.finally=Promise.prototype.finally||function(e){const t=t=>Promise.resolve(e()).then(t);return this.then((e=>t((()=>e))),(e=>t((()=>Promise.reject(e)))))};var o=n(4736),i=n.n(o);i()(Number.MAX_SAFE_INTEGER);const f=i()(i()[2]).pow(64),c=f.divide(i()[2]);function a(e,t=256){return i().fromArray(e instanceof Uint8Array?[...e]:e,t)}function s(e){return new Uint8Array(e.toArray(256).value)}function u(e,t,n){const r=a(e),o=a(t),i=a(n);return s(r.modPow(o,i))}var h=n(745),l=n.n(h),d=n(6761),y=n(153),p=n(410),v=n(1352);class g extends y.Z{constructor(){super("CRYPTO"),this.lastIndex=-1}invokeCryptoNew({method:e,args:t,transfer:n}){const r={method:e,args:t},o=this.listeners.invoke;if(null==o?void 0:o.length){let e=o[0].callback(r);return v.kC||e instanceof Promise||(e=Promise.resolve(e)),e}const i="aes-encrypt"===e||"aes-decrypt"===e?this.lastIndex=(this.lastIndex+1)%this.sendPorts.length:0;return this.invoke("invoke",r,void 0,this.sendPorts[i],n)}invokeCrypto(e,...t){return this.invokeCryptoNew({method:e,args:t})}}const w=new g;p.GO&&(p.GO.cryptoMessagePort=w);const b=w;function m(e){const t=e.length,n=8*t;let r=i()(e[0]).and(127).shiftLeft(n-8);for(let o=1;o0&&c>7),f[i[s]^s]=s;for(;!x[c];c^=e||1)n=(n=a^a<<1^a<<2^a<<3^a<<4)>>8^255&n^99,x[c]=n,K[n]=c,o=16843009*i[t=i[e=i[c]]]^65537*t^257*e^16843008*c,r=257*i[n]^16843008*n,E[c]=r=r<<24^r>>>8,L[c]=r=r<<24^r>>>8,O[c]=r=r<<24^r>>>8,F[c]=r=r<<24^r>>>8,_[n]=o=o<<24^o>>>8,I[n]=o=o<<24^o>>>8,z[n]=o=o<<24^o>>>8,N[n]=o=o<<24^o>>>8,a=f[a]||1}();var R=function(){function e(e){var t=Z(e);if(4!==t.length&&6!==t.length&&8!==t.length)throw new Error("Invalid key size");this.encKey=new Uint32Array(4*t.length+28),this.decKey=new Uint32Array(4*t.length+28),this.encKey.set(t);for(var n,r=1,o=t.length;o<4*t.length+28;o++)n=this.encKey[o-1],(o%t.length==0||8===t.length&&o%t.length==4)&&(n=x[n>>>24]<<24^x[n>>16&255]<<16^x[n>>8&255]<<8^x[255&n],o%t.length==0&&(n=n<<8^n>>>24^r<<24,r=r<<1^283*(r>>7))),this.encKey[o]=this.encKey[o-t.length]^n;for(var i=0;o;i++,o--)n=this.encKey[3&i?o:o-4],this.decKey[i]=o<=4||i<4?n:_[x[n>>>24]]^I[x[n>>16&255]]^z[x[n>>8&255]]^N[x[255&n]]}return e.prototype.encrypt=function(e){for(var t,n,r,o=Z(e),i=new Uint32Array(4),f=o[0]^this.encKey[0],c=o[1]^this.encKey[1],a=o[2]^this.encKey[2],s=o[3]^this.encKey[3],u=this.encKey.length/4-2,h=4,l=0;l>>24]^L[c>>16&255]^O[a>>8&255]^F[255&s]^this.encKey[h],n=E[c>>>24]^L[a>>16&255]^O[s>>8&255]^F[255&f]^this.encKey[h+1],r=E[a>>>24]^L[s>>16&255]^O[f>>8&255]^F[255&c]^this.encKey[h+2],s=E[s>>>24]^L[f>>16&255]^O[c>>8&255]^F[255&a]^this.encKey[h+3],f=t,c=n,a=r,h+=4;for(l=0;l<4;l++)i[l]=x[f>>>24]<<24^x[c>>16&255]<<16^x[a>>8&255]<<8^x[255&s]^this.encKey[h++],t=f,f=c,c=a,a=s,s=t;return i},e.prototype.decrypt=function(e){for(var t,n,r,o=Z(e),i=new Uint32Array(4),f=o[0]^this.decKey[0],c=o[3]^this.decKey[1],a=o[2]^this.decKey[2],s=o[1]^this.decKey[3],u=this.decKey.length/4-2,h=4,l=0;l>>24]^I[c>>16&255]^z[a>>8&255]^N[255&s]^this.decKey[h],n=_[c>>>24]^I[a>>16&255]^z[s>>8&255]^N[255&f]^this.decKey[h+1],r=_[a>>>24]^I[s>>16&255]^z[f>>8&255]^N[255&c]^this.decKey[h+2],s=_[s>>>24]^I[f>>16&255]^z[c>>8&255]^N[255&a]^this.decKey[h+3],f=t,c=n,a=r,h+=4;for(l=0;l<4;l++)i[3&-l]=K[f>>>24]<<24^K[c>>16&255]<<16^K[a>>8&255]<<8^K[255&s]^this.decKey[h++],t=f,f=c,c=a,a=s,s=t;return i},e}(),T=function(){function e(e,t,n){void 0===n&&(n=16),this.key=Z(e),this.iv=Z(t),this.cipher=new R(e),this.blockSize=n/4}return e.prototype.encrypt=function(e,t){for(var n=Z(e),r=t||new Uint32Array(n.length),o=this.iv.subarray(this.blockSize,this.iv.length),i=this.iv.subarray(0,this.blockSize),f=new Uint32Array(this.blockSize),c=0;c>>2]|=t[e]<<24-e%4*8;return new Uint32Array(n)}function W(e,t,n,r=!0){return function(e){const t=new Uint8Array(e.byteLength);for(let n=0,r=4*e.length;n>>2]>>>24-n%4*8&255;return t}(new T(B(t),B(n))[r?"encrypt":"decrypt"](B(e)))}!function(){function e(e,t,n){if(void 0===n&&(n=16),this.offset=0,this.key=Z(e),this.counter=Z(t),this.cipher=new R(e),this.blockSize=n/4,4!==this.counter.length)throw new Error("AES-CTR mode counter must be 16 bytes length")}e.prototype.encrypt=function(e,t){for(var n=Z(e),r=t||new Uint32Array(n.length),o=this.offset,i=0;i=this.blockSize&&this.incrementCounter(),o&&(i-=o,o=0)}return this.offset=(this.offset+n.length%4)%4,r},e.prototype.decrypt=function(e,t){return this.encrypt(e,t)},e.prototype.incrementCounter=function(){for(var e=this.counter.length-1;e>=0&&!(++this.counter[e]<4294967295);e--);}}();const G={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function j(e,t){return i().randBetween(e,t,(()=>function(e){const t=G[e];return crypto.getRandomValues(t),t[0]}(32)/4294967295))}function q(e){const t=i()[2];if(e.remainder(t).isZero())return t;const n=i()(1e3);let r,o,f,c,a,s,u;do{r=j(i().one,e.minus(1))}while(r.isZero()||r.eq(e.minus(t)));f=j(i().one,e.minus(1)),a=i().one,s=i().one;const h=i()("FFFFFFFFFFFFFFFF",16).minus(e).plus(1),l=n=>((n=(n=n.pow(t).mod(e)).add(r)).lesser(r)&&(n=n.add(h)),n.mod(e));do{o=f;for(let e=0;i()(e).lesser(a);++e)f=l(f);let t=i().zero;do{c=f;const r=i().min(n,a.minus(t));for(let t=0;i()(t).lesser(r);++t)f=l(f),s=s.multiply(o.greater(f)?o.minus(f):f.minus(o)).mod(e);u=i().gcd(s,e),t=t.add(n)}while(t.lesser(a)&&u.eq(i().one));a=a.shiftLeft(i().one)}while(u.eq(i().one));if(u.eq(e))do{c=l(c),u=i().gcd(o.minus(c).abs(),e)}while(u.eq(i().one));return u}const D="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var J=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function f(e){try{a(r.next(e))}catch(e){i(e)}}function c(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(f,c)}a((r=r.apply(e,t||[])).next())}))};class ${constructor(e,t,n){this.mode=e,this.cryptoKey=t,this.queue=[],this.counter=a(n)}update(e){return J(this,void 0,void 0,(function*(){return new Promise((t=>{this.queue.push({data:e,resolve:t}),this.release()}))}))}release(){return J(this,void 0,void 0,(function*(){if(!this.releasing){for(this.releasing=!0;this.queue.length;){const{data:e,resolve:t}=this.queue.shift();t(yield this._update(e))}this.releasing=!1}}))}perform(e){return J(this,void 0,void 0,(function*(){return yield D[this.mode]({name:"AES-CTR",counter:S(s(this.counter),16,!0,!0,!0),length:128},this.cryptoKey,e)}))}_update(e){return J(this,void 0,void 0,(function*(){let t,n=e;if(this.leftLength){const e=this.leftLength,r=16-e,o=new Uint8Array(e).concat(n.slice(0,r)),i=yield this.perform(o);t=new Uint8Array(i.slice(e)),n=n.slice(r),this.counter=this.counter.add(1)}const r=new Uint8Array(yield this.perform(n)),o=t?t.concat(r):r;let i=n.length;const f=i%16;i-=f;const c=i/16;return this.counter=this.counter.add(c),this.leftLength=f||void 0,o}))}}var V=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function f(e){try{a(r.next(e))}catch(e){i(e)}}function c(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(f,c)}a((r=r.apply(e,t||[])).next())}))};const X=new Map;let H=-1;console.log("CryptoWorker start");const Y={sha1:function(e){return D.digest("SHA-1",U(e)).then((e=>new Uint8Array(e)))},sha256:function(e){return D.digest("SHA-256",U(e)).then((e=>new Uint8Array(e)))},pbkdf2:function(e,t,n){return r=this,o=void 0,f=function*(){const r=yield D.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]);return D.deriveBits({name:"PBKDF2",salt:t,iterations:n,hash:{name:"SHA-512"}},r,512).then((e=>new Uint8Array(e)))},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{a(f.next(e))}catch(e){t(e)}}function c(e){try{a(f.throw(e))}catch(e){t(e)}}function a(t){var r;t.done?e(t.value):(r=t.value,r instanceof i?r:new i((function(e){e(r)}))).then(n,c)}a((f=f.apply(r,o||[])).next())}));var r,o,i,f},"aes-encrypt":function(e,t,n){return W(S(e),t,n,!0)},"aes-decrypt":function(e,t,n){return W(e,t,n,!1)},"rsa-encrypt":function(e,t){return u(e,P(t.exponent),P(t.modulus))},factorize:function(e){let t=function(e){const t=a(e),n=[],r=[];let o=q(t);n.push(t.divide(o)),n.push(o);do{const e=n.pop();if(!e.eq(i().one))if(e.isPrime(!0)){r.push(e);for(let t=0;te.compare(t))),t.length>2&&(t=[t.splice(t.length-2,1)[0],t.reduce(((e,t)=>e.multiply(t)),i().one)]);const n=t[0],r=t[t.length-1];return(n.lesser(r)?[n,r]:[r,n]).map((e=>s(e)))},"mod-pow":u,gzipUncompress:function(e,t){return l().inflate(e,t?{to:"string"}:void 0)},computeSRP:function(e,t,n){return C(this,void 0,void 0,(function*(){const o=n?t.new_algo:t.current_algo,f=a(o.p),c=i()(o.g),u=yield function(e,t,n){return C(this,void 0,void 0,(function*(){let o=yield b.invokeCrypto("sha256",r(t,(new TextEncoder).encode(e),t));o=r(n,o,n),o=yield b.invokeCrypto("sha256",o);let i=yield b.invokeCrypto("pbkdf2",new Uint8Array(o),t,1e5);return i=r(n,i,n),o=yield b.invokeCrypto("sha256",i),o}))}(e,o.salt1,o.salt2),h=i()(function(e){const t=e.length,n=new Array(t);for(let r=0;r{const t=new Uint8Array(e.length);for(let n=0;n{const n=t.subtract(e);return!(n.isNegative()||n.bitLength().toJSNumber()<1984||e.bitLength().toJSNumber()<1984||Math.floor((e.bitLength().toJSNumber()+7)/8)>256)},{a:k,a_for_hash:P,u:x}=yield(()=>C(this,void 0,void 0,(function*(){for(;;){const e=a(y(t.secure_random)),n=c.modPow(e,f);if(A(n,f)){const t=s(n),o=a(yield b.invokeCrypto("sha256",r(t,w)));if(!o.isZero()&&!o.isNegative())return{a:e,a_for_hash:t,u:o}}}})))();let K;K=p.greater(m)?p:p.add(f),K=K.subtract(m).mod(f);const E=x.multiply(h),L=k.add(E),O=K.modPow(L,f),F=yield b.invokeCrypto("sha256",l(s(O),256));let _=yield b.invokeCrypto("sha256",v);_=function(e,t){const n=e.length,r=new Uint8Array(n);for(let o=0;o{for(;;){const t=k(new Uint8Array(e.length)),n=a(t);if(!n.greater(i().one))continue;const r=a(e);if(n.lesser(r.subtract(i().one)))return t}})(t),o=P(n.toString(16)),f=S(yield b.invokeCrypto("mod-pow",o,r,t),256,!0,!0,!0);return{a:r,g_a:f,g_a_hash:yield b.invokeCrypto("sha256",f),p:t}},new((r=void 0)||(r=Promise))((function(e,i){function f(e){try{a(o.next(e))}catch(e){i(e)}}function c(e){try{a(o.throw(e))}catch(e){i(e)}}function a(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(f,c)}a((o=o.apply(t,n||[])).next())}));var t,n,r,o},"compute-dh-key":function(e,t,n){return r=this,o=void 0,s=function*(){const r=yield b.invokeCrypto("mod-pow",e,t,n);var o;return{key:r,key_fingerprint:(o=a((yield b.invokeCrypto("sha1",r)).slice(-8).reverse()),o.greater(c)?o.minus(f):o).toString(10)}},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function f(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var r;t.done?e(t.value):(r=t.value,r instanceof i?r:new i((function(e){e(r)}))).then(n,f)}c((s=s.apply(r,o||[])).next())}));var r,o,i,s},"get-emojis-fingerprint":function(e,t){return n=this,r=void 0,i=function*(){const n=e.concat(t),r=yield b.invokeCrypto("sha256",n),o=[],i=A.length;for(let e=0;e!=r.length;e+=8){const t=m(r.slice(e,e+8)).mod(i).toJSNumber(),n=A[t];o.push(n)}return o},new((o=void 0)||(o=Promise))((function(e,t){function f(e){try{a(i.next(e))}catch(e){t(e)}}function c(e){try{a(i.throw(e))}catch(e){t(e)}}function a(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(f,c)}a((i=i.apply(n,r||[])).next())}));var n,r,o,i},"aes-ctr-prepare":function({encKey:e,encIv:t,decKey:n,decIv:r}){return V(this,void 0,void 0,(function*(){const o=++H,i=[["encrypt",e],["decrypt",n]].map((([e,t])=>D.importKey("raw",t,{name:"AES-CTR"},!1,[e]))),[f,c]=yield Promise.all(i),a={enc:new $("encrypt",f,t.slice()),dec:new $("decrypt",c,r.slice())};return X.set(o,a),o}))},"aes-ctr-process":function({id:e,data:t,operation:n}){return V(this,void 0,void 0,(function*(){const r=X.get(e);return yield("encrypt"===n?r.enc:r.dec).update(t)}))},"aes-ctr-destroy":function(e){X.delete(e)}};b.addMultipleEventsListeners({invoke:({method:e,args:t})=>Y[e](...t),terminate:()=>{d.Z.close()}}),"undefined"!=typeof MessageChannel&&function(e,t,n){const r=(n,r)=>{e.attachListenPort(n),r&&e.attachSendPort(r),null==t||t(n)};e.setOnPortDisconnect(void 0),"undefined"!=typeof SharedWorkerGlobalScope?d.Z.addEventListener("connect",(e=>r(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?r(d.Z,null):r(d.Z,d.Z)}(b,(e=>{const t=new MessageChannel;b.attachPort(t.port1),b.invokeVoid("port",void 0,e,[t.port2])}))},5003:(e,t,n)=>{n.d(t,{kg:()=>d});var r,o=n(410),i=n(4762),f=n(1352),c=n(5289);!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(r||(r={}));const a=[r.None,r.Error,r.Warn,r.Log,r.Debug],s=!(i.IS_SAFARI||i.IS_FIREFOX),u="",h="",l=[["debug",r.Debug],["info",r.Log],["warn",r.Warn],["error",r.Error],["assert",r.Error],["trace",r.Log],["group",r.Log],["groupCollapsed",r.Log],["groupEnd",r.Log]];function d(e,t=r.Log|r.Warn|r.Error,n=!1,i=""){let y;o.ZP||n||(t=r.Error),s?i||(f.SU?i=u:f.N5&&(i=h)):i="";const p=i;i=i?`%s ${i}%s`:"%s";const v=function(...n){return t&r.Log&&console.log(i,(0,c.Z)(),e,...n)};return l.forEach((([n,r])=>{v[n]=function(...o){return t&r&&console[n](i,(0,c.Z)(),e,...o)}})),v.setPrefix=function(t){y=t,e="["+t+"]"},v.setPrefix(e),v.setLevel=function(e){t=a.slice(0,e+1).reduce(((e,t)=>e|t),0)},v.bindPrefix=function(e){return d(`${y}] [${e}`,t,n,p)},v}}},r={};function o(e){var t=r[e];if(void 0!==t)return t.exports;var i=r[e]={id:e,loaded:!1,exports:{}};return n[e].call(i.exports,i,i.exports,o),i.loaded=!0,i.exports}o.m=n,o.x=()=>{var e=o.O(void 0,[699,211,85],(()=>o(6991)));return o.O(e)},e=[],o.O=(t,n,r,i)=>{if(!n){var f=1/0;for(u=0;u=i)&&Object.keys(o.O).every((e=>o.O[e](n[a])))?n.splice(a--,1):(c=!1,i0&&e[u-1][2]>i;u--)e[u]=e[u-1];e[u]=[n,r,i]},o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.f={},o.e=e=>Promise.all(Object.keys(o.f).reduce(((t,n)=>(o.f[n](e,t),t)),[])),o.u=e=>85===e?"85.952a9f12a6b3dcdd3f0e.bundle.js":{211:"npm.big-integer",699:"npm.pako"}[e]+"."+{211:"780c206f3e1257ccad6a",699:"85f88e27b023cbb2ca51"}[e]+".chunk.js",o.miniCssF=e=>{},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;o.g.importScripts&&(e=o.g.location+"");var t=o.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=e})(),(()=>{if(void 0!==o){var e=o.u,t=o.e,n={},r={};o.u=function(t){return e(t)+(n.hasOwnProperty(t)?"?"+n[t]:"")},o.e=function(i){return t(i).catch((function(t){var f=r.hasOwnProperty(i)?r[i]:999999;if(f<1){var c=e(i);throw t.message="Loading chunk "+i+" failed after 999999 retries.\n("+c+")",t.request=c,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();n[i]=t,r[i]=f-1,e(o.e(i))}),3e3)}))}))}}})(),(()=>{var e={589:1};o.f.i=(t,n)=>{e[t]||importScripts(o.p+o.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],n=t.push.bind(t);t.push=t=>{var[r,i,f]=t;for(var c in i)o.o(i,c)&&(o.m[c]=i[c]);for(f&&f(o);r.length;)e[r.pop()]=1;n(t)}})(),t=o.x,o.x=()=>Promise.all([699,211,85].map(o.e,o)).then(t),o.x()})(); -//# sourceMappingURL=crypto.worker.574dd04f2dfaff484dc3.chunk.js.map \ No newline at end of file +//# sourceMappingURL=crypto.worker.fe5845cc2133b5405cac.chunk.js.map \ No newline at end of file diff --git a/public/crypto.worker.574dd04f2dfaff484dc3.chunk.js.map b/public/crypto.worker.fe5845cc2133b5405cac.chunk.js.map similarity index 99% rename from public/crypto.worker.574dd04f2dfaff484dc3.chunk.js.map rename to public/crypto.worker.fe5845cc2133b5405cac.chunk.js.map index 828275e3..e07347ab 100644 --- a/public/crypto.worker.574dd04f2dfaff484dc3.chunk.js.map +++ b/public/crypto.worker.fe5845cc2133b5405cac.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"crypto.worker.574dd04f2dfaff484dc3.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/lib/polyfill.ts","webpack://tweb/./src/helpers/bigInt/bigIntConstants.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/helpers/bytes/bytesModPow.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/calls/helpers/getEmojisFingerprint.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./node_modules/@cryptography/aes/dist/es/aes.js","webpack://tweb/./src/helpers/bytes/bytesToWordss.ts","webpack://tweb/./src/lib/crypto/utils/aesIGE.ts","webpack://tweb/./src/helpers/bytes/bytesFromWordss.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/bigInt/bigIntRandom.ts","webpack://tweb/./src/lib/crypto/utils/factorize/BrentPollard.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/crypto/utils/aesCTR.ts","webpack://tweb/./src/lib/crypto/aesCtrUtils.ts","webpack://tweb/./src/lib/crypto/crypto.worker.ts","webpack://tweb/./src/lib/crypto/utils/sha1.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/crypto/utils/pbkdf2.ts","webpack://tweb/./src/lib/crypto/utils/rsa.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/lib/crypto/srp.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/crypto/generateDh.ts","webpack://tweb/./src/lib/crypto/computeDhKey.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,85].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || navigator.maxTouchPoints > 0) && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// в SW может быть сразу две переменных TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n\n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bufferConcats from '../helpers/bytes/bufferConcats';\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n // return {type: 'bytes', value: [...this]};\n};\n\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n // toString: () => string,\n toJSON: () => number[],\n // toJSON: () => {type: 'bytes', value: number[]},\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n }\n}\n","import bigInt from 'big-integer';\n\nexport const safeBigInt = bigInt(Number.MAX_SAFE_INTEGER);\nexport const ulongBigInt = bigInt(bigInt[2]).pow(64);\nexport const longBigInt = ulongBigInt.divide(bigInt[2]);\n","import bigInt from 'big-integer';\nimport { longBigInt, ulongBigInt } from './bigIntConstants';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n\nexport function bigIntToSigned(bigInt: bigInt.BigInteger) {\n return bigInt.greater(longBigInt) ? bigInt.minus(ulongBigInt) : bigInt;\n}\n\nexport function bigIntToUnsigned(bigInt: bigInt.BigInteger) {\n return bigInt.isNegative() ? ulongBigInt.add(bigInt) : bigInt;\n}\n","import {bigIntFromBytes, bigIntToBytes} from '../bigInt/bigIntConversion';\n\nexport default function bytesModPow(bytes: number[] | Uint8Array, exp: number[] | Uint8Array, mod: number[] | Uint8Array) {\n const bytesBigInt = bigIntFromBytes(bytes);\n const expBigInt = bigIntFromBytes(exp);\n const modBigInt = bigIntFromBytes(mod);\n const resBigInt = bytesBigInt.modPow(expBigInt, modBigInt);\n return bigIntToBytes(resBigInt);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CryptoMethods} from './crypto_methods';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {Awaited} from '../../types';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IS_WORKER} from '../../helpers/context';\n\ntype CryptoEvent = {\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n terminate: () => void\n};\n\nexport class CryptoMessagePort extends SuperMessagePort {\n private lastIndex: number;\n\n constructor() {\n super('CRYPTO');\n this.lastIndex = -1;\n }\n\n public invokeCryptoNew({method, args, transfer}: {\n method: T,\n args: Parameters,\n transfer?: Transferable[]\n }): Promise>> {\n const payload = {method, args};\n const listeners = this.listeners['invoke'];\n if(listeners?.length) { // already in worker\n // try {\n // @ts-ignore\n let result: any = listeners[0].callback(payload);\n if(!IS_WORKER && !(result instanceof Promise)) {\n result = Promise.resolve(result);\n }\n\n return result;\n // } catch(err) {\n // return Promise.reject(err);\n // }\n }\n\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\n 0;\n // @ts-ignore\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\n }\n\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\n return this.invokeCryptoNew({method, args});\n }\n}\n\nconst cryptoMessagePort = new CryptoMessagePort();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\nexport default cryptoMessagePort;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cryptoWorker from '../../crypto/cryptoMessagePort';\nimport bigInt from 'big-integer';\n\nfunction readBigIntFromBytesBE(bytes: Uint8Array) {\n const length = bytes.length;\n const bits = length * 8;\n let value = bigInt(bytes[0]).and(0x7F).shiftLeft(bits - 8);\n for(let i = 1; i < length; ++i) {\n const _bits = bits - (i + 1) * 8;\n const b = bigInt(bytes[i]);\n value = value.or(_bits ? b.shiftLeft(_bits) : b);\n }\n\n return value;\n}\n\n// Emojis were taken from tdlib\nconst emojis = [\n '1f609', '1f60d', '1f61b', '1f62d', '1f631', '1f621', '1f60e',\n '1f634', '1f635', '1f608', '1f62c', '1f607', '1f60f', '1f46e',\n '1f477', '1f482', '1f476', '1f468', '1f469', '1f474', '1f475',\n '1f63b', '1f63d', '1f640', '1f47a', '1f648', '1f649', '1f64a',\n '1f480', '1f47d', '1f4a9', '1f525', '1f4a5', '1f4a4', '1f442',\n '1f440', '1f443', '1f445', '1f444', '1f44d', '1f44e', '1f44c',\n '1f44a', '270c', '270b', '1f450', '1f446', '1f447', '1f449',\n '1f448', '1f64f', '1f44f', '1f4aa', '1f6b6', '1f3c3', '1f483',\n '1f46b', '1f46a', '1f46c', '1f46d', '1f485', '1f3a9', '1f451',\n '1f452', '1f45f', '1f45e', '1f460', '1f455', '1f457', '1f456',\n '1f459', '1f45c', '1f453', '1f380', '1f484', '1f49b', '1f499',\n '1f49c', '1f49a', '1f48d', '1f48e', '1f436', '1f43a', '1f431',\n '1f42d', '1f439', '1f430', '1f438', '1f42f', '1f428', '1f43b',\n '1f437', '1f42e', '1f417', '1f434', '1f411', '1f418', '1f43c',\n '1f427', '1f425', '1f414', '1f40d', '1f422', '1f41b', '1f41d',\n '1f41c', '1f41e', '1f40c', '1f419', '1f41a', '1f41f', '1f42c',\n '1f40b', '1f410', '1f40a', '1f42b', '1f340', '1f339', '1f33b',\n '1f341', '1f33e', '1f344', '1f335', '1f334', '1f333', '1f31e',\n '1f31a', '1f319', '1f30e', '1f30b', '26a1', '2614', '2744', '26c4',\n '1f300', '1f308', '1f30a', '1f393', '1f386', '1f383', '1f47b',\n '1f385', '1f384', '1f381', '1f388', '1f52e', '1f3a5', '1f4f7',\n '1f4bf', '1f4bb', '260e', '1f4e1', '1f4fa', '1f4fb', '1f509',\n '1f514', '23f3', '23f0', '231a', '1f512', '1f511', '1f50e',\n '1f4a1', '1f526', '1f50c', '1f50b', '1f6bf', '1f6bd', '1f527',\n '1f528', '1f6aa', '1f6ac', '1f4a3', '1f52b', '1f52a', '1f48a',\n '1f489', '1f4b0', '1f4b5', '1f4b3', '2709', '1f4eb', '1f4e6',\n '1f4c5', '1f4c1', '2702', '1f4cc', '1f4ce', '2712', '270f',\n '1f4d0', '1f4da', '1f52c', '1f52d', '1f3a8', '1f3ac', '1f3a4',\n '1f3a7', '1f3b5', '1f3b9', '1f3bb', '1f3ba', '1f3b8', '1f47e',\n '1f3ae', '1f0cf', '1f3b2', '1f3af', '1f3c8', '1f3c0', '26bd',\n '26be', '1f3be', '1f3b1', '1f3c9', '1f3b3', '1f3c1', '1f3c7',\n '1f3c6', '1f3ca', '1f3c4', '2615', '1f37c', '1f37a', '1f377',\n '1f374', '1f355', '1f354', '1f35f', '1f357', '1f371', '1f35a',\n '1f35c', '1f361', '1f373', '1f35e', '1f369', '1f366', '1f382',\n '1f370', '1f36a', '1f36b', '1f36d', '1f36f', '1f34e', '1f34f',\n '1f34a', '1f34b', '1f352', '1f347', '1f349', '1f353', '1f351',\n '1f34c', '1f350', '1f34d', '1f346', '1f345', '1f33d', '1f3e1',\n '1f3e5', '1f3e6', '26ea', '1f3f0', '26fa', '1f3ed', '1f5fb',\n '1f5fd', '1f3a0', '1f3a1', '26f2', '1f3a2', '1f6a2', '1f6a4',\n '2693', '1f680', '2708', '1f681', '1f682', '1f68b', '1f68e',\n '1f68c', '1f699', '1f697', '1f695', '1f69b', '1f6a8', '1f694',\n '1f692', '1f691', '1f6b2', '1f6a0', '1f69c', '1f6a6', '26a0',\n '1f6a7', '26fd', '1f3b0', '1f5ff', '1f3aa', '1f3ad',\n '1f1ef-1f1f5', '1f1f0-1f1f7', '1f1e9-1f1ea', '1f1e8-1f1f3',\n '1f1fa-1f1f8', '1f1eb-1f1f7', '1f1ea-1f1f8', '1f1ee-1f1f9',\n '1f1f7-1f1fa', '1f1ec-1f1e7', '0031-20e3', '0032-20e3', '0033-20e3',\n '0034-20e3', '0035-20e3', '0036-20e3', '0037-20e3', '0038-20e3', '0039-20e3',\n '0030-20e3', '1f51f', '2757', '2753', '2665', '2666', '1f4af', '1f517',\n '1f531', '1f534', '1f535', '1f536', '1f537'\n];\n\nexport default async function getEmojisFingerprint(key: Uint8Array, g_a: Uint8Array) {\n const arr = key.concat(g_a);\n const hash = await cryptoWorker.invokeCrypto('sha256', arr);\n\n const result: [string, string, string, string] = [] as any;\n const emojisLength = emojis.length;\n\n const kPartSize = 8;\n for(let partOffset = 0; partOffset != hash.length; partOffset += kPartSize) {\n const bytes = hash.slice(partOffset, partOffset + kPartSize);\n const value = readBigIntFromBytesBE(bytes);\n const index = value.mod(emojisLength).toJSNumber();\n\n // const emoji = emojiFromCodePoints(emojis[index]);\n const codePoints = emojis[index];\n result.push(codePoints);\n }\n\n return result;\n}\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n\n return arr;\n}\n","import randomize from '../array/randomize';\nimport bufferConcats from './bufferConcats';\n\nexport default function addPadding(\n bytes: T,\n blockSize: number = 16,\n zeroes?: boolean,\n blockSizeAsTotalLength = false,\n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n // //console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n randomize(padding);\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\n}\n","var S = new Uint8Array(256);\nvar Si = new Uint8Array(256);\nvar T1 = new Uint32Array(256);\nvar T2 = new Uint32Array(256);\nvar T3 = new Uint32Array(256);\nvar T4 = new Uint32Array(256);\nvar T5 = new Uint32Array(256);\nvar T6 = new Uint32Array(256);\nvar T7 = new Uint32Array(256);\nvar T8 = new Uint32Array(256);\nfunction computeTables() {\n var d = new Uint8Array(256);\n var t = new Uint8Array(256);\n var x2;\n var x4;\n var x8;\n var s;\n var tEnc;\n var tDec;\n var x = 0;\n var xInv = 0;\n // Compute double and third tables\n for (var i = 0; i < 256; i++) {\n d[i] = i << 1 ^ (i >> 7) * 283;\n t[d[i] ^ i] = i;\n }\n for (; !S[x]; x ^= x2 || 1) {\n // Compute sbox\n s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;\n s = s >> 8 ^ s & 255 ^ 99;\n S[x] = s;\n Si[s] = x;\n // Compute MixColumns\n x8 = d[x4 = d[x2 = d[x]]];\n tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;\n tEnc = d[s] * 0x101 ^ s * 0x1010100;\n T1[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T2[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T3[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T4[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T5[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T6[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T7[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T8[s] = tDec = tDec << 24 ^ tDec >>> 8;\n xInv = t[xInv] || 1;\n }\n}\n\n/**\n * Gets a uint32 from string in big-endian order order\n */\nfunction s2i(str, pos) {\n return (str.charCodeAt(pos) << 24\n ^ str.charCodeAt(pos + 1) << 16\n ^ str.charCodeAt(pos + 2) << 8\n ^ str.charCodeAt(pos + 3));\n}\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Helper function for transforming string key to Uint32Array\n */\nfunction getWords(key) {\n if (key instanceof Uint32Array) {\n return key;\n }\n if (typeof key === 'string') {\n if (key.length % 4 !== 0)\n for (var i = key.length % 4; i <= 4; i++)\n key += '\\0x00';\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4)\n buf[i / 4] = s2i(key, i);\n return buf;\n }\n if (key instanceof Uint8Array) {\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4) {\n buf[i / 4] = (key[i] << 24\n ^ key[i + 1] << 16\n ^ key[i + 2] << 8\n ^ key[i + 3]);\n }\n return buf;\n }\n throw new Error('Unable to create 32-bit words');\n}\nfunction xor(left, right, to) {\n if (to === void 0) { to = left; }\n for (var i = 0; i < left.length; i++)\n to[i] = left[i] ^ right[i];\n}\n\ncomputeTables();\n/**\n * Low-level AES Cipher\n */\nvar AES = /** @class */ (function () {\n function AES(_key) {\n var key = getWords(_key);\n if (key.length !== 4 && key.length !== 6 && key.length !== 8) {\n throw new Error('Invalid key size');\n }\n this.encKey = new Uint32Array(4 * key.length + 28);\n this.decKey = new Uint32Array(4 * key.length + 28);\n this.encKey.set(key);\n var rcon = 1;\n var i = key.length;\n var tmp;\n // schedule encryption keys\n for (; i < 4 * key.length + 28; i++) {\n tmp = this.encKey[i - 1];\n // apply sbox\n if (i % key.length === 0 || (key.length === 8 && i % key.length === 4)) {\n tmp = S[tmp >>> 24] << 24 ^ S[(tmp >> 16) & 255] << 16 ^ S[(tmp >> 8) & 255] << 8 ^ S[tmp & 255];\n // shift rows and add rcon\n if (i % key.length === 0) {\n tmp = tmp << 8 ^ tmp >>> 24 ^ (rcon << 24);\n rcon = rcon << 1 ^ (rcon >> 7) * 283;\n }\n }\n this.encKey[i] = this.encKey[i - key.length] ^ tmp;\n }\n // schedule decryption keys\n for (var j = 0; i; j++, i--) {\n tmp = this.encKey[j & 3 ? i : i - 4];\n if (i <= 4 || j < 4) {\n this.decKey[j] = tmp;\n }\n else {\n this.decKey[j] = (T5[S[tmp >>> 24]]\n ^ T6[S[(tmp >> 16) & 255]]\n ^ T7[S[(tmp >> 8) & 255]]\n ^ T8[S[tmp & 255]]);\n }\n }\n }\n AES.prototype.encrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.encKey[0];\n var b = message[1] ^ this.encKey[1];\n var c = message[2] ^ this.encKey[2];\n var d = message[3] ^ this.encKey[3];\n var rounds = this.encKey.length / 4 - 2;\n var k = 4;\n var a2;\n var b2;\n var c2;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T1[a >>> 24] ^ T2[(b >> 16) & 255] ^ T3[(c >> 8) & 255] ^ T4[d & 255] ^ this.encKey[k];\n b2 = T1[b >>> 24] ^ T2[(c >> 16) & 255] ^ T3[(d >> 8) & 255] ^ T4[a & 255] ^ this.encKey[k + 1];\n c2 = T1[c >>> 24] ^ T2[(d >> 16) & 255] ^ T3[(a >> 8) & 255] ^ T4[b & 255] ^ this.encKey[k + 2];\n d = T1[d >>> 24] ^ T2[(a >> 16) & 255] ^ T3[(b >> 8) & 255] ^ T4[c & 255] ^ this.encKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n // console.log(a, b, c, d);\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[i] = (S[a >>> 24] << 24\n ^ S[(b >> 16) & 255] << 16\n ^ S[(c >> 8) & 255] << 8\n ^ S[d & 255]\n ^ this.encKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n AES.prototype.decrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.decKey[0];\n var b = message[3] ^ this.decKey[1];\n var c = message[2] ^ this.decKey[2];\n var d = message[1] ^ this.decKey[3];\n var rounds = this.decKey.length / 4 - 2;\n var a2;\n var b2;\n var c2;\n var k = 4;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T5[a >>> 24] ^ T6[(b >> 16) & 255] ^ T7[(c >> 8) & 255] ^ T8[d & 255] ^ this.decKey[k];\n b2 = T5[b >>> 24] ^ T6[(c >> 16) & 255] ^ T7[(d >> 8) & 255] ^ T8[a & 255] ^ this.decKey[k + 1];\n c2 = T5[c >>> 24] ^ T6[(d >> 16) & 255] ^ T7[(a >> 8) & 255] ^ T8[b & 255] ^ this.decKey[k + 2];\n d = T5[d >>> 24] ^ T6[(a >> 16) & 255] ^ T7[(b >> 8) & 255] ^ T8[c & 255] ^ this.decKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[3 & -i] = (Si[a >>> 24] << 24\n ^ Si[(b >> 16) & 255] << 16\n ^ Si[(c >> 8) & 255] << 8\n ^ Si[d & 255]\n ^ this.decKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n return AES;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE = /** @class */ (function () {\n function AES_IGE(key, iv, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.key = getWords(key);\n this.iv = getWords(iv);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var prevX = this.iv.subarray(this.blockSize, this.iv.length);\n var prevY = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = text.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.encrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n cipherText[j] = y[k];\n }\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n var cipherText = getWords(message);\n var text = buf || new Uint32Array(cipherText.length);\n var prevY = this.iv.subarray(this.blockSize, this.iv.length);\n var prevX = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = cipherText.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.decrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n text[j] = y[k];\n }\n return text;\n };\n return AES_IGE;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE$1 = /** @class */ (function () {\n function AES_IGE(key, counter, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.offset = 0;\n this.key = getWords(key);\n this.counter = getWords(counter);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n if (this.counter.length !== 4) {\n throw new Error('AES-CTR mode counter must be 16 bytes length');\n }\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var offset = this.offset;\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = this.cipher.encrypt(this.counter);\n for (var j = i, k = offset; j < text.length && k < this.blockSize; j++, k++)\n cipherText[j] = x[k] ^ text[j];\n if (text.length - i >= this.blockSize)\n this.incrementCounter();\n if (offset) {\n i -= offset;\n offset = 0;\n }\n }\n this.offset = (this.offset + (text.length % 4)) % 4;\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n return this.encrypt(message, buf);\n };\n AES_IGE.prototype.incrementCounter = function () {\n // increment counter\n for (var carry = this.counter.length - 1; carry >= 0; carry--) {\n if (++this.counter[carry] < 0xFFFFFFFF)\n break; // If overflowing, it'll be 0 and we'll have to continue propagating the carry\n }\n };\n return AES_IGE;\n}());\n\nexport default AES;\nexport { AES_IGE$1 as CTR, AES_IGE as IGE };\n","import convertToUint8Array from './convertToUint8Array';\n\nexport default function bytesToWordss(input: Parameters[0]) {\n const bytes = convertToUint8Array(input);\n\n const words: number[] = [];\n for(let i = 0, len = bytes.length; i < len; ++i) {\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\n }\n\n return new Uint32Array(words);\n}\n","import {IGE} from '@cryptography/aes';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport bytesFromWordss from '../../../helpers/bytes/bytesFromWordss';\nimport bytesToWordss from '../../../helpers/bytes/bytesToWordss';\n\nexport default function aesSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array, encrypt = true) {\n // console.log(dT(), 'AES start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const performedBytes = cipher[encrypt ? 'encrypt' : 'decrypt'](bytesToWordss(bytes));\n // console.log(dT(), 'AES finish');\n\n return bytesFromWordss(performedBytes);\n}\n\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(addPadding(bytes), keyBytes, ivBytes, true);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(bytes, keyBytes, ivBytes, false);\n}\n","export default function bytesFromWordss(input: Uint32Array) {\n const o = new Uint8Array(input.byteLength);\n for(let i = 0, length = input.length * 4; i < length; ++i) {\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n\n return o;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1)\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","import bigInt from 'big-integer';\nimport {nextRandomUint} from '../random';\n\nexport default function bigIntRandom(min: bigInt.BigNumber, max: bigInt.BigNumber) {\n return bigInt.randBetween(min, max, () => {\n return nextRandomUint(32) / 0xFFFFFFFF;\n /* const bits = 32;\n const randomBytes = new Uint8Array(bits / 8);\n crypto.getRandomValues(randomBytes);\n const r = bigIntFromBytes(randomBytes).mod(bigInt(2).pow(bits));\n return r.toJSNumber(); */\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// Thanks to https://xn--2-umb.com/09/12/brent-pollard-rho-factorisation/\n\nimport bigInt from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../../../helpers/bigInt/bigIntConversion';\nimport bigIntRandom from '../../../../helpers/bigInt/bigIntRandom';\n\n// let test = 0;\nfunction BrentPollardFactor(n: bigInt.BigInteger) {\n const two = bigInt[2];\n if(n.remainder(two).isZero()) {\n return two;\n }\n\n const m = bigInt(1000);\n let a: bigInt.BigInteger,\n x: bigInt.BigInteger,\n y: bigInt.BigInteger,\n ys: bigInt.BigInteger,\n r: bigInt.BigInteger,\n q: bigInt.BigInteger,\n g: bigInt.BigInteger;\n do\n a = bigIntRandom(bigInt.one, n.minus(1));\n while(a.isZero() || a.eq(n.minus(two)));\n y = bigIntRandom(bigInt.one, n.minus(1));\n r = bigInt.one;\n q = bigInt.one;\n\n // if(!test++) {\n // a = bigInt(3);\n // y = bigInt(3);\n // }\n\n const bigIntUint64 = bigInt('FFFFFFFFFFFFFFFF', 16);\n const bigIntUint64MinusPqPlusOne = bigIntUint64.minus(n).plus(1);\n\n const performY = (y: bigInt.BigInteger) => {\n y = y.pow(two).mod(n);\n y = y.add(a);\n if(y.lesser(a)) { // it slows down the script\n y = y.add(bigIntUint64MinusPqPlusOne);\n }\n y = y.mod(n);\n return y;\n };\n\n do {\n x = y;\n for(let i = 0; bigInt(i).lesser(r); ++i) {\n y = performY(y);\n }\n\n let k = bigInt.zero;\n do {\n ys = y;\n const condition = bigInt.min(m, r.minus(k));\n for(let i = 0; bigInt(i).lesser(condition); ++i) {\n y = performY(y);\n q = q.multiply(x.greater(y) ? x.minus(y) : y.minus(x)).mod(n);\n }\n g = bigInt.gcd(q, n);\n k = k.add(m);\n } while(k.lesser(r) && g.eq(bigInt.one));\n\n r = r.shiftLeft(bigInt.one);\n } while(g.eq(bigInt.one));\n\n if(g.eq(n)) {\n do {\n ys = performY(ys);\n g = bigInt.gcd(x.minus(ys).abs(), n);\n } while(g.eq(bigInt.one));\n }\n\n return g;\n}\n\nfunction primeFactors(pqBytes: Uint8Array | number[]) {\n const n = bigIntFromBytes(pqBytes);\n\n const factors: bigInt.BigInteger[] = [];\n const primes: bigInt.BigInteger[] = [];\n\n let factor = BrentPollardFactor(n);\n factors.push(n.divide(factor));\n factors.push(factor);\n\n // return [factor];\n\n do {\n const m = factors.pop();\n\n if(m.eq(bigInt.one))\n continue;\n\n if(m.isPrime(true)) {\n primes.push(m);\n\n // Remove the prime from the other factors\n for(let i = 0; i < factors.length; ++i) {\n let k = factors[i];\n if(k.mod(m).isZero()) {\n do\n k = k.divide(m);\n while(k.mod(m).isZero());\n factors[i] = k;\n }\n }\n } else {\n // factor = m.lesser(100) ? bigInt(PollardRho(m.toJSNumber())) : this.brentPollardFactor(m);\n factor = BrentPollardFactor(m);\n factors.push(m.divide(factor));\n factors.push(factor);\n }\n } while(factors.length);\n\n return primes;\n}\n\nexport default function factorizeBrentPollardPQ(pqBytes: Uint8Array | number[]): [Uint8Array, Uint8Array] {\n let factors = primeFactors(pqBytes);\n factors.sort((a, b) => a.compare(b));\n if(factors.length > 2) {\n factors = [\n factors.splice(factors.length - 2, 1)[0],\n factors.reduce((acc, v) => acc.multiply(v), bigInt.one)\n ];\n }\n\n const p = factors[0], q = factors[factors.length - 1];\n return (p.lesser(q) ? [p, q] : [q, p]).map((b) => bigIntToBytes(b)) as any;\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {BigInteger} from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../../helpers/bigInt/bigIntConversion';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport subtle from '../subtle';\n\nconst COUNTER_LENGTH = 16;\n\nexport default class CTR {\n private cryptoKey: CryptoKey;\n // private encLeft: Uint8Array;\n private leftLength: number;\n private mode: 'encrypt' | 'decrypt';\n private counter: BigInteger;\n private queue: {data: Uint8Array, resolve: (data: Uint8Array) => void}[];\n private releasing: boolean;\n\n constructor(mode: 'encrypt' | 'decrypt', cryptoKey: CryptoKey, counter: Uint8Array) {\n this.mode = mode;\n this.cryptoKey = cryptoKey;\n this.queue = [];\n this.counter = bigIntFromBytes(counter);\n }\n\n public async update(data: Uint8Array) {\n return new Promise((resolve) => {\n this.queue.push({data, resolve});\n this.release();\n });\n }\n\n private async release() {\n if(this.releasing) {\n return;\n }\n\n this.releasing = true;\n while(this.queue.length) {\n const {data, resolve} = this.queue.shift();\n resolve(await this._update(data));\n }\n this.releasing = false;\n }\n\n private async perform(data: Uint8Array) {\n const arrayBuffer: ArrayBuffer = await subtle[this.mode]({\n name: 'AES-CTR',\n counter: addPadding(bigIntToBytes(this.counter), COUNTER_LENGTH, true, true, true),\n length: 128\n },\n this.cryptoKey,\n data\n );\n\n return arrayBuffer;\n }\n\n private async _update(data: Uint8Array) {\n let toEncrypt = data;\n let head: Uint8Array/* , tail: Uint8Array */;\n if(this.leftLength) {\n // const leftLength = this.encLeft.byteLength;\n const leftLength = this.leftLength;\n const leftLength2 = COUNTER_LENGTH - leftLength;\n // const left = this.encLeft.concat(toEncrypt.slice(0, leftLength2));\n const left = (new Uint8Array(leftLength)).concat(toEncrypt.slice(0, leftLength2));\n\n const performed = await this.perform(left);\n\n head = new Uint8Array(performed.slice(leftLength));\n\n toEncrypt = toEncrypt.slice(leftLength2);\n\n this.counter = this.counter.add(1);\n }\n\n const tail = new Uint8Array(await this.perform(toEncrypt));\n\n const result = head ? head.concat(tail) : tail;\n\n let length = toEncrypt.length;\n const leftAfter = length % COUNTER_LENGTH;\n length -= leftAfter;\n\n const a = length / COUNTER_LENGTH;\n this.counter = this.counter.add(a);\n\n this.leftLength = leftAfter || undefined;\n // this.encLeft = leftAfter ? toEncrypt.slice(-leftAfter) : undefined;\n\n return result;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CTR from './utils/aesCTR';\nimport subtle from './subtle';\n\nconst aesCTRs: Map = new Map();\nlet lastCTRId = -1;\n\ntype K = {\n enc: CTR,\n dec: CTR,\n};\n\nexport async function aesCtrPrepare({encKey, encIv, decKey, decIv}: {[k in 'encKey' | 'encIv' | 'decKey' | 'decIv']: Uint8Array}) {\n const id = ++lastCTRId;\n\n const a = [['encrypt', encKey], ['decrypt', decKey]] as ['encrypt' | 'decrypt', Uint8Array][];\n const promises = a.map(([mode, key]) => {\n return subtle.importKey(\n 'raw',\n key,\n {name: 'AES-CTR'},\n false,\n [mode]\n )\n });\n\n const [encCryptoKey, decCryptoKey] = await Promise.all(promises);\n const enc = new CTR('encrypt', encCryptoKey, encIv.slice());\n const dec = new CTR('decrypt', decCryptoKey, decIv.slice());\n\n const k: K = {\n enc,\n dec\n };\n\n aesCTRs.set(id, k);\n\n return id;\n}\n\nexport async function aesCtrProcess({id, data, operation}: {id: number, data: Uint8Array, operation: 'encrypt' | 'decrypt'}) {\n const ctrs = aesCTRs.get(id);\n const result = await (operation === 'encrypt' ? ctrs.enc : ctrs.dec).update(data);\n return result;\n}\n\nexport function aesCtrDestroy(id: number) {\n aesCTRs.delete(id);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport '../polyfill'; // just to include\n\nimport bytesModPow from '../../helpers/bytes/bytesModPow';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport getEmojisFingerprint from '../calls/helpers/getEmojisFingerprint';\nimport computeDhKey from './computeDhKey';\nimport cryptoMessagePort from './cryptoMessagePort';\nimport {CryptoMethods} from './crypto_methods';\nimport generateDh from './generateDh';\nimport computeSRP from './srp';\nimport {aesEncryptSync, aesDecryptSync} from './utils/aesIGE';\nimport factorizeBrentPollardPQ from './utils/factorize/BrentPollard';\nimport pbkdf2 from './utils/pbkdf2';\nimport rsaEncrypt from './utils/rsa';\nimport sha1 from './utils/sha1';\nimport sha256 from './utils/sha256';\nimport {aesCtrDestroy, aesCtrPrepare, aesCtrProcess} from './aesCtrUtils';\nimport ctx from '../../environment/ctx';\n\nconsole.log('CryptoWorker start');\n\nconst cryptoMethods: CryptoMethods = {\n 'sha1': sha1,\n 'sha256': sha256,\n 'pbkdf2': pbkdf2,\n 'aes-encrypt': aesEncryptSync,\n 'aes-decrypt': aesDecryptSync,\n 'rsa-encrypt': rsaEncrypt,\n 'factorize': factorizeBrentPollardPQ,\n // 'factorize-tdlib': factorizeTdlibPQ,\n // 'factorize-new-new': pqPrimeLeemonNew,\n 'mod-pow': bytesModPow,\n 'gzipUncompress': gzipUncompress,\n 'computeSRP': computeSRP,\n 'generate-dh': generateDh,\n 'compute-dh-key': computeDhKey,\n 'get-emojis-fingerprint': getEmojisFingerprint,\n 'aes-ctr-prepare': aesCtrPrepare,\n 'aes-ctr-process': aesCtrProcess,\n 'aes-ctr-destroy': aesCtrDestroy\n};\n\ncryptoMessagePort.addMultipleEventsListeners({\n invoke: ({method, args}) => {\n // @ts-ignore\n const result: any = cryptoMethods[method](...args);\n return result;\n },\n\n terminate: () => {\n ctx.close();\n }\n});\n\nif(typeof(MessageChannel) !== 'undefined') listenMessagePort(cryptoMessagePort, (source) => {\n const channel = new MessageChannel();\n cryptoMessagePort.attachPort(channel.port1);\n cryptoMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\n});\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha1 from '@cryptography/sha1';\n\nexport default function sha1(bytes: Parameters[0]) {\n return subtle.digest('SHA-1', convertToUint8Array(bytes)).then((b) => {\n return new Uint8Array(b);\n });\n /* //console.trace(dT(), 'SHA-1 hash start', bytes);\n\n const hashBytes: number[] = [];\n\n let hash = sha1(String.fromCharCode.apply(null,\n bytes instanceof Uint8Array ? [...bytes] : [...new Uint8Array(bytes)]));\n for(let i = 0; i < hash.length; ++i) {\n hashBytes.push(hash.charCodeAt(i));\n }\n\n //console.log(dT(), 'SHA-1 hash finish', hashBytes, bytesToHex(hashBytes));\n\n return new Uint8Array(hashBytes); */\n}\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then((b) => {\n // console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n\n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","import subtle from '../subtle';\n\nexport default async function pbkdf2(buffer: Parameters[1], salt: HkdfParams['salt'], iterations: number) {\n const importKey = await subtle.importKey(\n 'raw',\n buffer,\n {name: 'PBKDF2'},\n false,\n [/* 'deriveKey', */'deriveBits']\n );\n\n /* await subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n {\n name: 'AES-CTR',\n length: 256\n },\n false,\n ['encrypt', 'decrypt']\n ); */\n\n const bits = subtle.deriveBits({\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n 512\n );\n\n return bits.then((buffer) => new Uint8Array(buffer));\n}\n","import type {RSAPublicKeyHex} from '../../mtproto/rsaKeysManager';\nimport bytesModPow from '../../../helpers/bytes/bytesModPow';\nimport bytesFromHex from '../../../helpers/bytes/bytesFromHex';\n\nexport default function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n return bytesModPow(bytes, bytesFromHex(publicKey.exponent), bytesFromHex(publicKey.modulus));\n}\n","// export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n// export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n // console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n // console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cryptoWorker from './cryptoMessagePort';\nimport {AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesXor from '../../helpers/bytes/bytesXor';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport bigInt from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../helpers/bigInt/bigIntConversion';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\n\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\n // ! look into crypto_methods.test.ts\n let buffer = await cryptoWorker.invokeCrypto('sha256', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\n buffer = bufferConcats(server_salt, buffer, server_salt);\n buffer = await cryptoWorker.invokeCrypto('sha256', buffer);\n\n let hash = await cryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\n hash = bufferConcats(server_salt, hash, server_salt);\n\n buffer = await cryptoWorker.invokeCrypto('sha256', hash);\n\n return buffer;\n}\n\nexport default async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n\n const p = bigIntFromBytes(algo.p);\n const g = bigInt(algo.g);\n\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\n console.error('srp_B < 0')\n }\n\n if(B.compareTo(p) <= 0) {\n console.error('srp_B <= p');\n } */\n\n /* let check_prime_and_good = (bytes: any, g: number) => {\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\n\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\n return true;\n }\n\n // TO-DO check_prime_and_good_check\n }; */\n\n // check_prime_and_good(algo.p, g);\n\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\n const x = bigInt(bytesToHex(pw_hash), 16);\n\n const padArray = function(arr: number[] | Uint8Array, len: number) {\n if(!(arr instanceof Uint8Array)) {\n arr = convertToUint8Array(arr);\n }\n\n return addPadding(arr, len, true, true, true);\n };\n\n const v = g.modPow(x, p);\n\n const flipper = (arr: Uint8Array | number[]) => {\n const out = new Uint8Array(arr.length);\n for(let i = 0; i < arr.length; i += 4) {\n out[i] = arr[i + 3];\n out[i + 1] = arr[i + 2];\n out[i + 2] = arr[i + 1];\n out[i + 3] = arr[i];\n }\n\n return out;\n };\n\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\n if(isNew) {\n const bytes = bigIntToBytes(v);\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\n }\n\n const B = bigIntFromBytes(state.srp_B);\n\n const pForHash = padArray(bigIntToBytes(p), 256);\n const gForHash = padArray(bigIntToBytes(g), 256);\n const b_for_hash = padArray(bigIntToBytes(B), 256);\n\n const kHash = await cryptoWorker.invokeCrypto('sha256', bufferConcats(pForHash, gForHash));\n const k = bigIntFromBytes(kHash);\n\n const k_v = k.multiply(v).mod(p);\n\n const is_good_mod_exp_first = (modexp: bigInt.BigInteger, prime: bigInt.BigInteger) => {\n const diff = prime.subtract(modexp);\n const min_diff_bits_count = 2048 - 64;\n const max_mod_exp_size = 256;\n if(diff.isNegative() ||\n diff.bitLength().toJSNumber() < min_diff_bits_count ||\n modexp.bitLength().toJSNumber() < min_diff_bits_count ||\n Math.floor((modexp.bitLength().toJSNumber() + 7) / 8) > max_mod_exp_size)\n return false;\n return true;\n };\n\n const generate_and_check_random = async() => {\n while(true) {\n const a = bigIntFromBytes(flipper(state.secure_random));\n // const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\n\n const A = g.modPow(a, p);\n if(is_good_mod_exp_first(A, p)) {\n const a_for_hash = bigIntToBytes(A);\n\n const s = await cryptoWorker.invokeCrypto('sha256', bufferConcats(a_for_hash, b_for_hash));\n // const u = bigInt(s.hex, 16);\n const u = bigIntFromBytes(s);\n if(!u.isZero() && !u.isNegative())\n return {a, a_for_hash, u};\n }\n }\n }\n\n const {a, a_for_hash, u} = await generate_and_check_random();\n\n let g_b: bigInt.BigInteger;\n if(!B.greater(k_v)) {\n g_b = B.add(p);\n } else g_b = B;\n g_b = g_b.subtract(k_v).mod(p);\n\n const ux = u.multiply(x);\n const a_ux = a.add(ux);\n const S = g_b.modPow(a_ux, p);\n\n const K = await cryptoWorker.invokeCrypto('sha256', padArray(bigIntToBytes(S), 256));\n\n let h1 = await cryptoWorker.invokeCrypto('sha256', pForHash);\n const h2 = await cryptoWorker.invokeCrypto('sha256', gForHash);\n h1 = bytesXor(h1, h2);\n\n const buff = bufferConcats(\n h1,\n await cryptoWorker.invokeCrypto('sha256', algo.salt1),\n await cryptoWorker.invokeCrypto('sha256', algo.salt2),\n a_for_hash,\n b_for_hash,\n K\n );\n\n const M1 = await cryptoWorker.invokeCrypto('sha256', buff);\n\n const out: InputCheckPasswordSRP.inputCheckPasswordSRP = {\n _: 'inputCheckPasswordSRP',\n srp_id: state.srp_id,\n A: new Uint8Array(a_for_hash),\n M1\n };\n\n return out;\n}\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bigInt from 'big-integer';\nimport randomize from '../../helpers/array/randomize';\nimport {bigIntFromBytes} from '../../helpers/bigInt/bigIntConversion';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport {MessagesDhConfig} from '../../layer';\nimport CallInstance from '../calls/callInstance';\nimport cryptoWorker from './cryptoMessagePort';\n\nexport default async function generateDh(dhConfig: MessagesDhConfig.messagesDhConfig) {\n const {p, g} = dhConfig;\n\n const generateA = (p: Uint8Array) => {\n for(;;) {\n const a = randomize(new Uint8Array(p.length));\n // const a = new Uint8Array(4).randomize();\n\n const aBigInt = bigIntFromBytes(a); // str2bigInt(bytesToHex(a), 16);\n if(!aBigInt.greater(bigInt.one)) {\n continue;\n }\n\n const pBigInt = bigIntFromBytes(p); // str2bigInt(bytesToHex(p), 16);\n if(!aBigInt.lesser(pBigInt.subtract(bigInt.one))) {\n continue;\n }\n\n return a;\n }\n };\n\n const a = generateA(p);\n // const a = new Uint8Array([0]);\n\n const gBytes = bytesFromHex(g.toString(16));\n const g_a = addPadding(await cryptoWorker.invokeCrypto('mod-pow', gBytes, a, p), 256, true, true, true);\n const g_a_hash = await cryptoWorker.invokeCrypto('sha256', g_a);\n\n const dh: CallInstance['dh'] = {\n a: a,\n g_a: g_a,\n g_a_hash: g_a_hash,\n p\n };\n\n return dh;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {bigIntFromBytes, bigIntToSigned} from '../../helpers/bigInt/bigIntConversion';\nimport cryptoWorker from './cryptoMessagePort';\n\nexport default async function computeDhKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n const key = await cryptoWorker.invokeCrypto('mod-pow', g_b, a, p);\n const keySha1Hashed = await cryptoWorker.invokeCrypto('sha1', key);\n const key_fingerprint = keySha1Hashed.slice(-8).reverse();\n const key_fingerprint_long = bigIntToSigned(bigIntFromBytes(key_fingerprint)).toString(10);\n\n return {key, key_fingerprint: key_fingerprint_long};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n // level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,85], () => (__webpack_require__(6991)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 85) return \"85.952a9f12a6b3dcdd3f0e.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + {\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] + \".\" + {\"211\":\"780c206f3e1257ccad6a\",\"699\":\"85f88e27b023cbb2ca51\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t589: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","undefined","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","args","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","then","listeners","length","slice","forEach","bind","bufferConcats","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","b","set","ArrayBuffer","prototype","concat","this","toJSON","Promise","finally","fn","onFinally","callback","resolve","result","reason","reject","Number","MAX_SAFE_INTEGER","pow","longBigInt","divide","bigIntFromBytes","bytes","base","bigIntToBytes","bigInt","toArray","value","bytesModPow","exp","mod","bytesBigInt","expBigInt","modBigInt","modPow","CryptoMessagePort","constructor","super","lastIndex","invokeCryptoNew","method","transfer","payload","sendPortIndex","sendPorts","invoke","invokeCrypto","cryptoMessagePort","readBigIntFromBytesBE","bits","and","shiftLeft","i","_bits","or","emojis","randomize","arr","crypto","Error","getRandomValues","addPadding","blockSize","zeroes","blockSizeAsTotalLength","prepend","len","needPadding","padding","buffer","bytesFromHex","hexString","Math","ceil","start","parseInt","charAt","substr","convertToUint8Array","TextEncoder","encode","S","Si","T1","Uint32Array","T2","T3","T4","T5","T6","T7","T8","getWords","key","buf","pos","str","charCodeAt","xor","left","right","to","x2","x4","s","tEnc","tDec","d","t","x","xInv","computeTables","AES","_key","encKey","decKey","rcon","j","encrypt","_message","a2","b2","c2","message","out","a","c","rounds","k","decrypt","AES_IGE","iv","cipher","text","cipherText","prevX","subarray","prevY","yXOR","y","bytesToWordss","input","words","aesSync","keyBytes","ivBytes","o","bytesFromWordss","counter","offset","incrementCounter","carry","arrays","Uint16Array","bigIntRandom","min","max","array","nextRandomUint","BrentPollardFactor","n","two","remainder","isZero","m","ys","r","q","g","minus","eq","bigIntUint64MinusPqPlusOne","plus","performY","add","lesser","condition","multiply","greater","abs","subtle","CTR","mode","cryptoKey","queue","update","data","push","release","releasing","shift","_update","perform","name","head","toEncrypt","leftLength","leftLength2","performed","tail","leftAfter","aesCTRs","Map","lastCTRId","log","cryptoMethods","salt","iterations","importKey","hash","publicKey","exponent","modulus","pqBytes","factors","primes","factor","pop","isPrime","primeFactors","sort","compare","splice","p","map","toString","password","state","isNew","algo","new_algo","current_algo","pw_hash","client_salt","server_salt","makePasswordHash","salt1","salt2","Array","join","bytesToHex","padArray","flipper","B","srp_B","pForHash","gForHash","b_for_hash","k_v","is_good_mod_exp_first","modexp","prime","diff","subtract","isNegative","bitLength","toJSNumber","floor","a_for_hash","u","secure_random","A","generate_and_check_random","g_b","ux","a_ux","K","h1","bytes1","bytes2","bytesXor","buff","M1","_","srp_id","dhConfig","aBigInt","pBigInt","generateA","gBytes","g_a","g_a_hash","key_fingerprint","reverse","emojisLength","partOffset","index","codePoints","encIv","decIv","id","promises","encCryptoKey","decCryptoKey","enc","dec","operation","ctrs","get","delete","terminate","ctx","messagePort","onConnect","onDisconnect","attachPort","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","listenMessagePort","e","source","channel","MessageChannel","port1","port2","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","loaded","__webpack_modules__","call","__webpack_exports__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","getter","__esModule","definition","defineProperty","enumerable","f","chunkId","miniCssF","globalThis","Function","obj","prop","hasOwnProperty","nmd","paths","children","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","oldGetScript","oldLoadScript","queryMap","countMap","catch","retries","realSrc","request","setTimeout","cacheBust","Date","now","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"crypto.worker.fe5845cc2133b5405cac.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/lib/polyfill.ts","webpack://tweb/./src/helpers/bigInt/bigIntConstants.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/helpers/bytes/bytesModPow.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/calls/helpers/getEmojisFingerprint.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./node_modules/@cryptography/aes/dist/es/aes.js","webpack://tweb/./src/helpers/bytes/bytesToWordss.ts","webpack://tweb/./src/lib/crypto/utils/aesIGE.ts","webpack://tweb/./src/helpers/bytes/bytesFromWordss.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/bigInt/bigIntRandom.ts","webpack://tweb/./src/lib/crypto/utils/factorize/BrentPollard.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/crypto/utils/aesCTR.ts","webpack://tweb/./src/lib/crypto/aesCtrUtils.ts","webpack://tweb/./src/lib/crypto/crypto.worker.ts","webpack://tweb/./src/lib/crypto/utils/sha1.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/crypto/utils/pbkdf2.ts","webpack://tweb/./src/lib/crypto/utils/rsa.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/lib/crypto/srp.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/crypto/generateDh.ts","webpack://tweb/./src/lib/crypto/computeDhKey.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,85].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || navigator.maxTouchPoints > 0) && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// в SW может быть сразу две переменных TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n\n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bufferConcats from '../helpers/bytes/bufferConcats';\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n // return {type: 'bytes', value: [...this]};\n};\n\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n // toString: () => string,\n toJSON: () => number[],\n // toJSON: () => {type: 'bytes', value: number[]},\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n }\n}\n","import bigInt from 'big-integer';\n\nexport const safeBigInt = bigInt(Number.MAX_SAFE_INTEGER);\nexport const ulongBigInt = bigInt(bigInt[2]).pow(64);\nexport const longBigInt = ulongBigInt.divide(bigInt[2]);\n","import bigInt from 'big-integer';\nimport { longBigInt, ulongBigInt } from './bigIntConstants';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n\nexport function bigIntToSigned(bigInt: bigInt.BigInteger) {\n return bigInt.greater(longBigInt) ? bigInt.minus(ulongBigInt) : bigInt;\n}\n\nexport function bigIntToUnsigned(bigInt: bigInt.BigInteger) {\n return bigInt.isNegative() ? ulongBigInt.add(bigInt) : bigInt;\n}\n","import {bigIntFromBytes, bigIntToBytes} from '../bigInt/bigIntConversion';\n\nexport default function bytesModPow(bytes: number[] | Uint8Array, exp: number[] | Uint8Array, mod: number[] | Uint8Array) {\n const bytesBigInt = bigIntFromBytes(bytes);\n const expBigInt = bigIntFromBytes(exp);\n const modBigInt = bigIntFromBytes(mod);\n const resBigInt = bytesBigInt.modPow(expBigInt, modBigInt);\n return bigIntToBytes(resBigInt);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CryptoMethods} from './crypto_methods';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {Awaited} from '../../types';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IS_WORKER} from '../../helpers/context';\n\ntype CryptoEvent = {\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n terminate: () => void\n};\n\nexport class CryptoMessagePort extends SuperMessagePort {\n private lastIndex: number;\n\n constructor() {\n super('CRYPTO');\n this.lastIndex = -1;\n }\n\n public invokeCryptoNew({method, args, transfer}: {\n method: T,\n args: Parameters,\n transfer?: Transferable[]\n }): Promise>> {\n const payload = {method, args};\n const listeners = this.listeners['invoke'];\n if(listeners?.length) { // already in worker\n // try {\n // @ts-ignore\n let result: any = listeners[0].callback(payload);\n if(!IS_WORKER && !(result instanceof Promise)) {\n result = Promise.resolve(result);\n }\n\n return result;\n // } catch(err) {\n // return Promise.reject(err);\n // }\n }\n\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\n 0;\n // @ts-ignore\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\n }\n\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\n return this.invokeCryptoNew({method, args});\n }\n}\n\nconst cryptoMessagePort = new CryptoMessagePort();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\nexport default cryptoMessagePort;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cryptoWorker from '../../crypto/cryptoMessagePort';\nimport bigInt from 'big-integer';\n\nfunction readBigIntFromBytesBE(bytes: Uint8Array) {\n const length = bytes.length;\n const bits = length * 8;\n let value = bigInt(bytes[0]).and(0x7F).shiftLeft(bits - 8);\n for(let i = 1; i < length; ++i) {\n const _bits = bits - (i + 1) * 8;\n const b = bigInt(bytes[i]);\n value = value.or(_bits ? b.shiftLeft(_bits) : b);\n }\n\n return value;\n}\n\n// Emojis were taken from tdlib\nconst emojis = [\n '1f609', '1f60d', '1f61b', '1f62d', '1f631', '1f621', '1f60e',\n '1f634', '1f635', '1f608', '1f62c', '1f607', '1f60f', '1f46e',\n '1f477', '1f482', '1f476', '1f468', '1f469', '1f474', '1f475',\n '1f63b', '1f63d', '1f640', '1f47a', '1f648', '1f649', '1f64a',\n '1f480', '1f47d', '1f4a9', '1f525', '1f4a5', '1f4a4', '1f442',\n '1f440', '1f443', '1f445', '1f444', '1f44d', '1f44e', '1f44c',\n '1f44a', '270c', '270b', '1f450', '1f446', '1f447', '1f449',\n '1f448', '1f64f', '1f44f', '1f4aa', '1f6b6', '1f3c3', '1f483',\n '1f46b', '1f46a', '1f46c', '1f46d', '1f485', '1f3a9', '1f451',\n '1f452', '1f45f', '1f45e', '1f460', '1f455', '1f457', '1f456',\n '1f459', '1f45c', '1f453', '1f380', '1f484', '1f49b', '1f499',\n '1f49c', '1f49a', '1f48d', '1f48e', '1f436', '1f43a', '1f431',\n '1f42d', '1f439', '1f430', '1f438', '1f42f', '1f428', '1f43b',\n '1f437', '1f42e', '1f417', '1f434', '1f411', '1f418', '1f43c',\n '1f427', '1f425', '1f414', '1f40d', '1f422', '1f41b', '1f41d',\n '1f41c', '1f41e', '1f40c', '1f419', '1f41a', '1f41f', '1f42c',\n '1f40b', '1f410', '1f40a', '1f42b', '1f340', '1f339', '1f33b',\n '1f341', '1f33e', '1f344', '1f335', '1f334', '1f333', '1f31e',\n '1f31a', '1f319', '1f30e', '1f30b', '26a1', '2614', '2744', '26c4',\n '1f300', '1f308', '1f30a', '1f393', '1f386', '1f383', '1f47b',\n '1f385', '1f384', '1f381', '1f388', '1f52e', '1f3a5', '1f4f7',\n '1f4bf', '1f4bb', '260e', '1f4e1', '1f4fa', '1f4fb', '1f509',\n '1f514', '23f3', '23f0', '231a', '1f512', '1f511', '1f50e',\n '1f4a1', '1f526', '1f50c', '1f50b', '1f6bf', '1f6bd', '1f527',\n '1f528', '1f6aa', '1f6ac', '1f4a3', '1f52b', '1f52a', '1f48a',\n '1f489', '1f4b0', '1f4b5', '1f4b3', '2709', '1f4eb', '1f4e6',\n '1f4c5', '1f4c1', '2702', '1f4cc', '1f4ce', '2712', '270f',\n '1f4d0', '1f4da', '1f52c', '1f52d', '1f3a8', '1f3ac', '1f3a4',\n '1f3a7', '1f3b5', '1f3b9', '1f3bb', '1f3ba', '1f3b8', '1f47e',\n '1f3ae', '1f0cf', '1f3b2', '1f3af', '1f3c8', '1f3c0', '26bd',\n '26be', '1f3be', '1f3b1', '1f3c9', '1f3b3', '1f3c1', '1f3c7',\n '1f3c6', '1f3ca', '1f3c4', '2615', '1f37c', '1f37a', '1f377',\n '1f374', '1f355', '1f354', '1f35f', '1f357', '1f371', '1f35a',\n '1f35c', '1f361', '1f373', '1f35e', '1f369', '1f366', '1f382',\n '1f370', '1f36a', '1f36b', '1f36d', '1f36f', '1f34e', '1f34f',\n '1f34a', '1f34b', '1f352', '1f347', '1f349', '1f353', '1f351',\n '1f34c', '1f350', '1f34d', '1f346', '1f345', '1f33d', '1f3e1',\n '1f3e5', '1f3e6', '26ea', '1f3f0', '26fa', '1f3ed', '1f5fb',\n '1f5fd', '1f3a0', '1f3a1', '26f2', '1f3a2', '1f6a2', '1f6a4',\n '2693', '1f680', '2708', '1f681', '1f682', '1f68b', '1f68e',\n '1f68c', '1f699', '1f697', '1f695', '1f69b', '1f6a8', '1f694',\n '1f692', '1f691', '1f6b2', '1f6a0', '1f69c', '1f6a6', '26a0',\n '1f6a7', '26fd', '1f3b0', '1f5ff', '1f3aa', '1f3ad',\n '1f1ef-1f1f5', '1f1f0-1f1f7', '1f1e9-1f1ea', '1f1e8-1f1f3',\n '1f1fa-1f1f8', '1f1eb-1f1f7', '1f1ea-1f1f8', '1f1ee-1f1f9',\n '1f1f7-1f1fa', '1f1ec-1f1e7', '0031-20e3', '0032-20e3', '0033-20e3',\n '0034-20e3', '0035-20e3', '0036-20e3', '0037-20e3', '0038-20e3', '0039-20e3',\n '0030-20e3', '1f51f', '2757', '2753', '2665', '2666', '1f4af', '1f517',\n '1f531', '1f534', '1f535', '1f536', '1f537'\n];\n\nexport default async function getEmojisFingerprint(key: Uint8Array, g_a: Uint8Array) {\n const arr = key.concat(g_a);\n const hash = await cryptoWorker.invokeCrypto('sha256', arr);\n\n const result: [string, string, string, string] = [] as any;\n const emojisLength = emojis.length;\n\n const kPartSize = 8;\n for(let partOffset = 0; partOffset != hash.length; partOffset += kPartSize) {\n const bytes = hash.slice(partOffset, partOffset + kPartSize);\n const value = readBigIntFromBytesBE(bytes);\n const index = value.mod(emojisLength).toJSNumber();\n\n // const emoji = emojiFromCodePoints(emojis[index]);\n const codePoints = emojis[index];\n result.push(codePoints);\n }\n\n return result;\n}\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n\n return arr;\n}\n","import randomize from '../array/randomize';\nimport bufferConcats from './bufferConcats';\n\nexport default function addPadding(\n bytes: T,\n blockSize: number = 16,\n zeroes?: boolean,\n blockSizeAsTotalLength = false,\n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n // //console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n randomize(padding);\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\n}\n","var S = new Uint8Array(256);\nvar Si = new Uint8Array(256);\nvar T1 = new Uint32Array(256);\nvar T2 = new Uint32Array(256);\nvar T3 = new Uint32Array(256);\nvar T4 = new Uint32Array(256);\nvar T5 = new Uint32Array(256);\nvar T6 = new Uint32Array(256);\nvar T7 = new Uint32Array(256);\nvar T8 = new Uint32Array(256);\nfunction computeTables() {\n var d = new Uint8Array(256);\n var t = new Uint8Array(256);\n var x2;\n var x4;\n var x8;\n var s;\n var tEnc;\n var tDec;\n var x = 0;\n var xInv = 0;\n // Compute double and third tables\n for (var i = 0; i < 256; i++) {\n d[i] = i << 1 ^ (i >> 7) * 283;\n t[d[i] ^ i] = i;\n }\n for (; !S[x]; x ^= x2 || 1) {\n // Compute sbox\n s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;\n s = s >> 8 ^ s & 255 ^ 99;\n S[x] = s;\n Si[s] = x;\n // Compute MixColumns\n x8 = d[x4 = d[x2 = d[x]]];\n tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;\n tEnc = d[s] * 0x101 ^ s * 0x1010100;\n T1[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T2[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T3[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T4[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T5[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T6[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T7[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T8[s] = tDec = tDec << 24 ^ tDec >>> 8;\n xInv = t[xInv] || 1;\n }\n}\n\n/**\n * Gets a uint32 from string in big-endian order order\n */\nfunction s2i(str, pos) {\n return (str.charCodeAt(pos) << 24\n ^ str.charCodeAt(pos + 1) << 16\n ^ str.charCodeAt(pos + 2) << 8\n ^ str.charCodeAt(pos + 3));\n}\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Helper function for transforming string key to Uint32Array\n */\nfunction getWords(key) {\n if (key instanceof Uint32Array) {\n return key;\n }\n if (typeof key === 'string') {\n if (key.length % 4 !== 0)\n for (var i = key.length % 4; i <= 4; i++)\n key += '\\0x00';\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4)\n buf[i / 4] = s2i(key, i);\n return buf;\n }\n if (key instanceof Uint8Array) {\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4) {\n buf[i / 4] = (key[i] << 24\n ^ key[i + 1] << 16\n ^ key[i + 2] << 8\n ^ key[i + 3]);\n }\n return buf;\n }\n throw new Error('Unable to create 32-bit words');\n}\nfunction xor(left, right, to) {\n if (to === void 0) { to = left; }\n for (var i = 0; i < left.length; i++)\n to[i] = left[i] ^ right[i];\n}\n\ncomputeTables();\n/**\n * Low-level AES Cipher\n */\nvar AES = /** @class */ (function () {\n function AES(_key) {\n var key = getWords(_key);\n if (key.length !== 4 && key.length !== 6 && key.length !== 8) {\n throw new Error('Invalid key size');\n }\n this.encKey = new Uint32Array(4 * key.length + 28);\n this.decKey = new Uint32Array(4 * key.length + 28);\n this.encKey.set(key);\n var rcon = 1;\n var i = key.length;\n var tmp;\n // schedule encryption keys\n for (; i < 4 * key.length + 28; i++) {\n tmp = this.encKey[i - 1];\n // apply sbox\n if (i % key.length === 0 || (key.length === 8 && i % key.length === 4)) {\n tmp = S[tmp >>> 24] << 24 ^ S[(tmp >> 16) & 255] << 16 ^ S[(tmp >> 8) & 255] << 8 ^ S[tmp & 255];\n // shift rows and add rcon\n if (i % key.length === 0) {\n tmp = tmp << 8 ^ tmp >>> 24 ^ (rcon << 24);\n rcon = rcon << 1 ^ (rcon >> 7) * 283;\n }\n }\n this.encKey[i] = this.encKey[i - key.length] ^ tmp;\n }\n // schedule decryption keys\n for (var j = 0; i; j++, i--) {\n tmp = this.encKey[j & 3 ? i : i - 4];\n if (i <= 4 || j < 4) {\n this.decKey[j] = tmp;\n }\n else {\n this.decKey[j] = (T5[S[tmp >>> 24]]\n ^ T6[S[(tmp >> 16) & 255]]\n ^ T7[S[(tmp >> 8) & 255]]\n ^ T8[S[tmp & 255]]);\n }\n }\n }\n AES.prototype.encrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.encKey[0];\n var b = message[1] ^ this.encKey[1];\n var c = message[2] ^ this.encKey[2];\n var d = message[3] ^ this.encKey[3];\n var rounds = this.encKey.length / 4 - 2;\n var k = 4;\n var a2;\n var b2;\n var c2;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T1[a >>> 24] ^ T2[(b >> 16) & 255] ^ T3[(c >> 8) & 255] ^ T4[d & 255] ^ this.encKey[k];\n b2 = T1[b >>> 24] ^ T2[(c >> 16) & 255] ^ T3[(d >> 8) & 255] ^ T4[a & 255] ^ this.encKey[k + 1];\n c2 = T1[c >>> 24] ^ T2[(d >> 16) & 255] ^ T3[(a >> 8) & 255] ^ T4[b & 255] ^ this.encKey[k + 2];\n d = T1[d >>> 24] ^ T2[(a >> 16) & 255] ^ T3[(b >> 8) & 255] ^ T4[c & 255] ^ this.encKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n // console.log(a, b, c, d);\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[i] = (S[a >>> 24] << 24\n ^ S[(b >> 16) & 255] << 16\n ^ S[(c >> 8) & 255] << 8\n ^ S[d & 255]\n ^ this.encKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n AES.prototype.decrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.decKey[0];\n var b = message[3] ^ this.decKey[1];\n var c = message[2] ^ this.decKey[2];\n var d = message[1] ^ this.decKey[3];\n var rounds = this.decKey.length / 4 - 2;\n var a2;\n var b2;\n var c2;\n var k = 4;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T5[a >>> 24] ^ T6[(b >> 16) & 255] ^ T7[(c >> 8) & 255] ^ T8[d & 255] ^ this.decKey[k];\n b2 = T5[b >>> 24] ^ T6[(c >> 16) & 255] ^ T7[(d >> 8) & 255] ^ T8[a & 255] ^ this.decKey[k + 1];\n c2 = T5[c >>> 24] ^ T6[(d >> 16) & 255] ^ T7[(a >> 8) & 255] ^ T8[b & 255] ^ this.decKey[k + 2];\n d = T5[d >>> 24] ^ T6[(a >> 16) & 255] ^ T7[(b >> 8) & 255] ^ T8[c & 255] ^ this.decKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[3 & -i] = (Si[a >>> 24] << 24\n ^ Si[(b >> 16) & 255] << 16\n ^ Si[(c >> 8) & 255] << 8\n ^ Si[d & 255]\n ^ this.decKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n return AES;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE = /** @class */ (function () {\n function AES_IGE(key, iv, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.key = getWords(key);\n this.iv = getWords(iv);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var prevX = this.iv.subarray(this.blockSize, this.iv.length);\n var prevY = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = text.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.encrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n cipherText[j] = y[k];\n }\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n var cipherText = getWords(message);\n var text = buf || new Uint32Array(cipherText.length);\n var prevY = this.iv.subarray(this.blockSize, this.iv.length);\n var prevX = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = cipherText.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.decrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n text[j] = y[k];\n }\n return text;\n };\n return AES_IGE;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE$1 = /** @class */ (function () {\n function AES_IGE(key, counter, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.offset = 0;\n this.key = getWords(key);\n this.counter = getWords(counter);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n if (this.counter.length !== 4) {\n throw new Error('AES-CTR mode counter must be 16 bytes length');\n }\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var offset = this.offset;\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = this.cipher.encrypt(this.counter);\n for (var j = i, k = offset; j < text.length && k < this.blockSize; j++, k++)\n cipherText[j] = x[k] ^ text[j];\n if (text.length - i >= this.blockSize)\n this.incrementCounter();\n if (offset) {\n i -= offset;\n offset = 0;\n }\n }\n this.offset = (this.offset + (text.length % 4)) % 4;\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n return this.encrypt(message, buf);\n };\n AES_IGE.prototype.incrementCounter = function () {\n // increment counter\n for (var carry = this.counter.length - 1; carry >= 0; carry--) {\n if (++this.counter[carry] < 0xFFFFFFFF)\n break; // If overflowing, it'll be 0 and we'll have to continue propagating the carry\n }\n };\n return AES_IGE;\n}());\n\nexport default AES;\nexport { AES_IGE$1 as CTR, AES_IGE as IGE };\n","import convertToUint8Array from './convertToUint8Array';\n\nexport default function bytesToWordss(input: Parameters[0]) {\n const bytes = convertToUint8Array(input);\n\n const words: number[] = [];\n for(let i = 0, len = bytes.length; i < len; ++i) {\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\n }\n\n return new Uint32Array(words);\n}\n","import {IGE} from '@cryptography/aes';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport bytesFromWordss from '../../../helpers/bytes/bytesFromWordss';\nimport bytesToWordss from '../../../helpers/bytes/bytesToWordss';\n\nexport default function aesSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array, encrypt = true) {\n // console.log(dT(), 'AES start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const performedBytes = cipher[encrypt ? 'encrypt' : 'decrypt'](bytesToWordss(bytes));\n // console.log(dT(), 'AES finish');\n\n return bytesFromWordss(performedBytes);\n}\n\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(addPadding(bytes), keyBytes, ivBytes, true);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(bytes, keyBytes, ivBytes, false);\n}\n","export default function bytesFromWordss(input: Uint32Array) {\n const o = new Uint8Array(input.byteLength);\n for(let i = 0, length = input.length * 4; i < length; ++i) {\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n\n return o;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1)\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","import bigInt from 'big-integer';\nimport {nextRandomUint} from '../random';\n\nexport default function bigIntRandom(min: bigInt.BigNumber, max: bigInt.BigNumber) {\n return bigInt.randBetween(min, max, () => {\n return nextRandomUint(32) / 0xFFFFFFFF;\n /* const bits = 32;\n const randomBytes = new Uint8Array(bits / 8);\n crypto.getRandomValues(randomBytes);\n const r = bigIntFromBytes(randomBytes).mod(bigInt(2).pow(bits));\n return r.toJSNumber(); */\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// Thanks to https://xn--2-umb.com/09/12/brent-pollard-rho-factorisation/\n\nimport bigInt from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../../../helpers/bigInt/bigIntConversion';\nimport bigIntRandom from '../../../../helpers/bigInt/bigIntRandom';\n\n// let test = 0;\nfunction BrentPollardFactor(n: bigInt.BigInteger) {\n const two = bigInt[2];\n if(n.remainder(two).isZero()) {\n return two;\n }\n\n const m = bigInt(1000);\n let a: bigInt.BigInteger,\n x: bigInt.BigInteger,\n y: bigInt.BigInteger,\n ys: bigInt.BigInteger,\n r: bigInt.BigInteger,\n q: bigInt.BigInteger,\n g: bigInt.BigInteger;\n do\n a = bigIntRandom(bigInt.one, n.minus(1));\n while(a.isZero() || a.eq(n.minus(two)));\n y = bigIntRandom(bigInt.one, n.minus(1));\n r = bigInt.one;\n q = bigInt.one;\n\n // if(!test++) {\n // a = bigInt(3);\n // y = bigInt(3);\n // }\n\n const bigIntUint64 = bigInt('FFFFFFFFFFFFFFFF', 16);\n const bigIntUint64MinusPqPlusOne = bigIntUint64.minus(n).plus(1);\n\n const performY = (y: bigInt.BigInteger) => {\n y = y.pow(two).mod(n);\n y = y.add(a);\n if(y.lesser(a)) { // it slows down the script\n y = y.add(bigIntUint64MinusPqPlusOne);\n }\n y = y.mod(n);\n return y;\n };\n\n do {\n x = y;\n for(let i = 0; bigInt(i).lesser(r); ++i) {\n y = performY(y);\n }\n\n let k = bigInt.zero;\n do {\n ys = y;\n const condition = bigInt.min(m, r.minus(k));\n for(let i = 0; bigInt(i).lesser(condition); ++i) {\n y = performY(y);\n q = q.multiply(x.greater(y) ? x.minus(y) : y.minus(x)).mod(n);\n }\n g = bigInt.gcd(q, n);\n k = k.add(m);\n } while(k.lesser(r) && g.eq(bigInt.one));\n\n r = r.shiftLeft(bigInt.one);\n } while(g.eq(bigInt.one));\n\n if(g.eq(n)) {\n do {\n ys = performY(ys);\n g = bigInt.gcd(x.minus(ys).abs(), n);\n } while(g.eq(bigInt.one));\n }\n\n return g;\n}\n\nfunction primeFactors(pqBytes: Uint8Array | number[]) {\n const n = bigIntFromBytes(pqBytes);\n\n const factors: bigInt.BigInteger[] = [];\n const primes: bigInt.BigInteger[] = [];\n\n let factor = BrentPollardFactor(n);\n factors.push(n.divide(factor));\n factors.push(factor);\n\n // return [factor];\n\n do {\n const m = factors.pop();\n\n if(m.eq(bigInt.one))\n continue;\n\n if(m.isPrime(true)) {\n primes.push(m);\n\n // Remove the prime from the other factors\n for(let i = 0; i < factors.length; ++i) {\n let k = factors[i];\n if(k.mod(m).isZero()) {\n do\n k = k.divide(m);\n while(k.mod(m).isZero());\n factors[i] = k;\n }\n }\n } else {\n // factor = m.lesser(100) ? bigInt(PollardRho(m.toJSNumber())) : this.brentPollardFactor(m);\n factor = BrentPollardFactor(m);\n factors.push(m.divide(factor));\n factors.push(factor);\n }\n } while(factors.length);\n\n return primes;\n}\n\nexport default function factorizeBrentPollardPQ(pqBytes: Uint8Array | number[]): [Uint8Array, Uint8Array] {\n let factors = primeFactors(pqBytes);\n factors.sort((a, b) => a.compare(b));\n if(factors.length > 2) {\n factors = [\n factors.splice(factors.length - 2, 1)[0],\n factors.reduce((acc, v) => acc.multiply(v), bigInt.one)\n ];\n }\n\n const p = factors[0], q = factors[factors.length - 1];\n return (p.lesser(q) ? [p, q] : [q, p]).map((b) => bigIntToBytes(b)) as any;\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {BigInteger} from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../../helpers/bigInt/bigIntConversion';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport subtle from '../subtle';\n\nconst COUNTER_LENGTH = 16;\n\nexport default class CTR {\n private cryptoKey: CryptoKey;\n // private encLeft: Uint8Array;\n private leftLength: number;\n private mode: 'encrypt' | 'decrypt';\n private counter: BigInteger;\n private queue: {data: Uint8Array, resolve: (data: Uint8Array) => void}[];\n private releasing: boolean;\n\n constructor(mode: 'encrypt' | 'decrypt', cryptoKey: CryptoKey, counter: Uint8Array) {\n this.mode = mode;\n this.cryptoKey = cryptoKey;\n this.queue = [];\n this.counter = bigIntFromBytes(counter);\n }\n\n public async update(data: Uint8Array) {\n return new Promise((resolve) => {\n this.queue.push({data, resolve});\n this.release();\n });\n }\n\n private async release() {\n if(this.releasing) {\n return;\n }\n\n this.releasing = true;\n while(this.queue.length) {\n const {data, resolve} = this.queue.shift();\n resolve(await this._update(data));\n }\n this.releasing = false;\n }\n\n private async perform(data: Uint8Array) {\n const arrayBuffer: ArrayBuffer = await subtle[this.mode]({\n name: 'AES-CTR',\n counter: addPadding(bigIntToBytes(this.counter), COUNTER_LENGTH, true, true, true),\n length: 128\n },\n this.cryptoKey,\n data\n );\n\n return arrayBuffer;\n }\n\n private async _update(data: Uint8Array) {\n let toEncrypt = data;\n let head: Uint8Array/* , tail: Uint8Array */;\n if(this.leftLength) {\n // const leftLength = this.encLeft.byteLength;\n const leftLength = this.leftLength;\n const leftLength2 = COUNTER_LENGTH - leftLength;\n // const left = this.encLeft.concat(toEncrypt.slice(0, leftLength2));\n const left = (new Uint8Array(leftLength)).concat(toEncrypt.slice(0, leftLength2));\n\n const performed = await this.perform(left);\n\n head = new Uint8Array(performed.slice(leftLength));\n\n toEncrypt = toEncrypt.slice(leftLength2);\n\n this.counter = this.counter.add(1);\n }\n\n const tail = new Uint8Array(await this.perform(toEncrypt));\n\n const result = head ? head.concat(tail) : tail;\n\n let length = toEncrypt.length;\n const leftAfter = length % COUNTER_LENGTH;\n length -= leftAfter;\n\n const a = length / COUNTER_LENGTH;\n this.counter = this.counter.add(a);\n\n this.leftLength = leftAfter || undefined;\n // this.encLeft = leftAfter ? toEncrypt.slice(-leftAfter) : undefined;\n\n return result;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CTR from './utils/aesCTR';\nimport subtle from './subtle';\n\nconst aesCTRs: Map = new Map();\nlet lastCTRId = -1;\n\ntype K = {\n enc: CTR,\n dec: CTR,\n};\n\nexport async function aesCtrPrepare({encKey, encIv, decKey, decIv}: {[k in 'encKey' | 'encIv' | 'decKey' | 'decIv']: Uint8Array}) {\n const id = ++lastCTRId;\n\n const a = [['encrypt', encKey], ['decrypt', decKey]] as ['encrypt' | 'decrypt', Uint8Array][];\n const promises = a.map(([mode, key]) => {\n return subtle.importKey(\n 'raw',\n key,\n {name: 'AES-CTR'},\n false,\n [mode]\n )\n });\n\n const [encCryptoKey, decCryptoKey] = await Promise.all(promises);\n const enc = new CTR('encrypt', encCryptoKey, encIv.slice());\n const dec = new CTR('decrypt', decCryptoKey, decIv.slice());\n\n const k: K = {\n enc,\n dec\n };\n\n aesCTRs.set(id, k);\n\n return id;\n}\n\nexport async function aesCtrProcess({id, data, operation}: {id: number, data: Uint8Array, operation: 'encrypt' | 'decrypt'}) {\n const ctrs = aesCTRs.get(id);\n const result = await (operation === 'encrypt' ? ctrs.enc : ctrs.dec).update(data);\n return result;\n}\n\nexport function aesCtrDestroy(id: number) {\n aesCTRs.delete(id);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport '../polyfill'; // just to include\n\nimport bytesModPow from '../../helpers/bytes/bytesModPow';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport getEmojisFingerprint from '../calls/helpers/getEmojisFingerprint';\nimport computeDhKey from './computeDhKey';\nimport cryptoMessagePort from './cryptoMessagePort';\nimport {CryptoMethods} from './crypto_methods';\nimport generateDh from './generateDh';\nimport computeSRP from './srp';\nimport {aesEncryptSync, aesDecryptSync} from './utils/aesIGE';\nimport factorizeBrentPollardPQ from './utils/factorize/BrentPollard';\nimport pbkdf2 from './utils/pbkdf2';\nimport rsaEncrypt from './utils/rsa';\nimport sha1 from './utils/sha1';\nimport sha256 from './utils/sha256';\nimport {aesCtrDestroy, aesCtrPrepare, aesCtrProcess} from './aesCtrUtils';\nimport ctx from '../../environment/ctx';\n\nconsole.log('CryptoWorker start');\n\nconst cryptoMethods: CryptoMethods = {\n 'sha1': sha1,\n 'sha256': sha256,\n 'pbkdf2': pbkdf2,\n 'aes-encrypt': aesEncryptSync,\n 'aes-decrypt': aesDecryptSync,\n 'rsa-encrypt': rsaEncrypt,\n 'factorize': factorizeBrentPollardPQ,\n // 'factorize-tdlib': factorizeTdlibPQ,\n // 'factorize-new-new': pqPrimeLeemonNew,\n 'mod-pow': bytesModPow,\n 'gzipUncompress': gzipUncompress,\n 'computeSRP': computeSRP,\n 'generate-dh': generateDh,\n 'compute-dh-key': computeDhKey,\n 'get-emojis-fingerprint': getEmojisFingerprint,\n 'aes-ctr-prepare': aesCtrPrepare,\n 'aes-ctr-process': aesCtrProcess,\n 'aes-ctr-destroy': aesCtrDestroy\n};\n\ncryptoMessagePort.addMultipleEventsListeners({\n invoke: ({method, args}) => {\n // @ts-ignore\n const result: any = cryptoMethods[method](...args);\n return result;\n },\n\n terminate: () => {\n ctx.close();\n }\n});\n\nif(typeof(MessageChannel) !== 'undefined') listenMessagePort(cryptoMessagePort, (source) => {\n const channel = new MessageChannel();\n cryptoMessagePort.attachPort(channel.port1);\n cryptoMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\n});\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha1 from '@cryptography/sha1';\n\nexport default function sha1(bytes: Parameters[0]) {\n return subtle.digest('SHA-1', convertToUint8Array(bytes)).then((b) => {\n return new Uint8Array(b);\n });\n /* //console.trace(dT(), 'SHA-1 hash start', bytes);\n\n const hashBytes: number[] = [];\n\n let hash = sha1(String.fromCharCode.apply(null,\n bytes instanceof Uint8Array ? [...bytes] : [...new Uint8Array(bytes)]));\n for(let i = 0; i < hash.length; ++i) {\n hashBytes.push(hash.charCodeAt(i));\n }\n\n //console.log(dT(), 'SHA-1 hash finish', hashBytes, bytesToHex(hashBytes));\n\n return new Uint8Array(hashBytes); */\n}\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then((b) => {\n // console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n\n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","import subtle from '../subtle';\n\nexport default async function pbkdf2(buffer: Parameters[1], salt: HkdfParams['salt'], iterations: number) {\n const importKey = await subtle.importKey(\n 'raw',\n buffer,\n {name: 'PBKDF2'},\n false,\n [/* 'deriveKey', */'deriveBits']\n );\n\n /* await subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n {\n name: 'AES-CTR',\n length: 256\n },\n false,\n ['encrypt', 'decrypt']\n ); */\n\n const bits = subtle.deriveBits({\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n 512\n );\n\n return bits.then((buffer) => new Uint8Array(buffer));\n}\n","import type {RSAPublicKeyHex} from '../../mtproto/rsaKeysManager';\nimport bytesModPow from '../../../helpers/bytes/bytesModPow';\nimport bytesFromHex from '../../../helpers/bytes/bytesFromHex';\n\nexport default function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n return bytesModPow(bytes, bytesFromHex(publicKey.exponent), bytesFromHex(publicKey.modulus));\n}\n","// export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n// export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n // console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n // console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cryptoWorker from './cryptoMessagePort';\nimport {AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesXor from '../../helpers/bytes/bytesXor';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport bigInt from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../helpers/bigInt/bigIntConversion';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\n\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\n // ! look into crypto_methods.test.ts\n let buffer = await cryptoWorker.invokeCrypto('sha256', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\n buffer = bufferConcats(server_salt, buffer, server_salt);\n buffer = await cryptoWorker.invokeCrypto('sha256', buffer);\n\n let hash = await cryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\n hash = bufferConcats(server_salt, hash, server_salt);\n\n buffer = await cryptoWorker.invokeCrypto('sha256', hash);\n\n return buffer;\n}\n\nexport default async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n\n const p = bigIntFromBytes(algo.p);\n const g = bigInt(algo.g);\n\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\n console.error('srp_B < 0')\n }\n\n if(B.compareTo(p) <= 0) {\n console.error('srp_B <= p');\n } */\n\n /* let check_prime_and_good = (bytes: any, g: number) => {\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\n\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\n return true;\n }\n\n // TO-DO check_prime_and_good_check\n }; */\n\n // check_prime_and_good(algo.p, g);\n\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\n const x = bigInt(bytesToHex(pw_hash), 16);\n\n const padArray = function(arr: number[] | Uint8Array, len: number) {\n if(!(arr instanceof Uint8Array)) {\n arr = convertToUint8Array(arr);\n }\n\n return addPadding(arr, len, true, true, true);\n };\n\n const v = g.modPow(x, p);\n\n const flipper = (arr: Uint8Array | number[]) => {\n const out = new Uint8Array(arr.length);\n for(let i = 0; i < arr.length; i += 4) {\n out[i] = arr[i + 3];\n out[i + 1] = arr[i + 2];\n out[i + 2] = arr[i + 1];\n out[i + 3] = arr[i];\n }\n\n return out;\n };\n\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\n if(isNew) {\n const bytes = bigIntToBytes(v);\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\n }\n\n const B = bigIntFromBytes(state.srp_B);\n\n const pForHash = padArray(bigIntToBytes(p), 256);\n const gForHash = padArray(bigIntToBytes(g), 256);\n const b_for_hash = padArray(bigIntToBytes(B), 256);\n\n const kHash = await cryptoWorker.invokeCrypto('sha256', bufferConcats(pForHash, gForHash));\n const k = bigIntFromBytes(kHash);\n\n const k_v = k.multiply(v).mod(p);\n\n const is_good_mod_exp_first = (modexp: bigInt.BigInteger, prime: bigInt.BigInteger) => {\n const diff = prime.subtract(modexp);\n const min_diff_bits_count = 2048 - 64;\n const max_mod_exp_size = 256;\n if(diff.isNegative() ||\n diff.bitLength().toJSNumber() < min_diff_bits_count ||\n modexp.bitLength().toJSNumber() < min_diff_bits_count ||\n Math.floor((modexp.bitLength().toJSNumber() + 7) / 8) > max_mod_exp_size)\n return false;\n return true;\n };\n\n const generate_and_check_random = async() => {\n while(true) {\n const a = bigIntFromBytes(flipper(state.secure_random));\n // const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\n\n const A = g.modPow(a, p);\n if(is_good_mod_exp_first(A, p)) {\n const a_for_hash = bigIntToBytes(A);\n\n const s = await cryptoWorker.invokeCrypto('sha256', bufferConcats(a_for_hash, b_for_hash));\n // const u = bigInt(s.hex, 16);\n const u = bigIntFromBytes(s);\n if(!u.isZero() && !u.isNegative())\n return {a, a_for_hash, u};\n }\n }\n }\n\n const {a, a_for_hash, u} = await generate_and_check_random();\n\n let g_b: bigInt.BigInteger;\n if(!B.greater(k_v)) {\n g_b = B.add(p);\n } else g_b = B;\n g_b = g_b.subtract(k_v).mod(p);\n\n const ux = u.multiply(x);\n const a_ux = a.add(ux);\n const S = g_b.modPow(a_ux, p);\n\n const K = await cryptoWorker.invokeCrypto('sha256', padArray(bigIntToBytes(S), 256));\n\n let h1 = await cryptoWorker.invokeCrypto('sha256', pForHash);\n const h2 = await cryptoWorker.invokeCrypto('sha256', gForHash);\n h1 = bytesXor(h1, h2);\n\n const buff = bufferConcats(\n h1,\n await cryptoWorker.invokeCrypto('sha256', algo.salt1),\n await cryptoWorker.invokeCrypto('sha256', algo.salt2),\n a_for_hash,\n b_for_hash,\n K\n );\n\n const M1 = await cryptoWorker.invokeCrypto('sha256', buff);\n\n const out: InputCheckPasswordSRP.inputCheckPasswordSRP = {\n _: 'inputCheckPasswordSRP',\n srp_id: state.srp_id,\n A: new Uint8Array(a_for_hash),\n M1\n };\n\n return out;\n}\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bigInt from 'big-integer';\nimport randomize from '../../helpers/array/randomize';\nimport {bigIntFromBytes} from '../../helpers/bigInt/bigIntConversion';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport {MessagesDhConfig} from '../../layer';\nimport CallInstance from '../calls/callInstance';\nimport cryptoWorker from './cryptoMessagePort';\n\nexport default async function generateDh(dhConfig: MessagesDhConfig.messagesDhConfig) {\n const {p, g} = dhConfig;\n\n const generateA = (p: Uint8Array) => {\n for(;;) {\n const a = randomize(new Uint8Array(p.length));\n // const a = new Uint8Array(4).randomize();\n\n const aBigInt = bigIntFromBytes(a); // str2bigInt(bytesToHex(a), 16);\n if(!aBigInt.greater(bigInt.one)) {\n continue;\n }\n\n const pBigInt = bigIntFromBytes(p); // str2bigInt(bytesToHex(p), 16);\n if(!aBigInt.lesser(pBigInt.subtract(bigInt.one))) {\n continue;\n }\n\n return a;\n }\n };\n\n const a = generateA(p);\n // const a = new Uint8Array([0]);\n\n const gBytes = bytesFromHex(g.toString(16));\n const g_a = addPadding(await cryptoWorker.invokeCrypto('mod-pow', gBytes, a, p), 256, true, true, true);\n const g_a_hash = await cryptoWorker.invokeCrypto('sha256', g_a);\n\n const dh: CallInstance['dh'] = {\n a: a,\n g_a: g_a,\n g_a_hash: g_a_hash,\n p\n };\n\n return dh;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {bigIntFromBytes, bigIntToSigned} from '../../helpers/bigInt/bigIntConversion';\nimport cryptoWorker from './cryptoMessagePort';\n\nexport default async function computeDhKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n const key = await cryptoWorker.invokeCrypto('mod-pow', g_b, a, p);\n const keySha1Hashed = await cryptoWorker.invokeCrypto('sha1', key);\n const key_fingerprint = keySha1Hashed.slice(-8).reverse();\n const key_fingerprint_long = bigIntToSigned(bigIntFromBytes(key_fingerprint)).toString(10);\n\n return {key, key_fingerprint: key_fingerprint_long};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n // level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,85], () => (__webpack_require__(6991)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 85) return \"85.952a9f12a6b3dcdd3f0e.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + {\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] + \".\" + {\"211\":\"780c206f3e1257ccad6a\",\"699\":\"85f88e27b023cbb2ca51\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t589: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","undefined","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","args","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","then","listeners","length","slice","forEach","bind","bufferConcats","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","b","set","ArrayBuffer","prototype","concat","this","toJSON","Promise","finally","fn","onFinally","callback","resolve","result","reason","reject","Number","MAX_SAFE_INTEGER","pow","longBigInt","divide","bigIntFromBytes","bytes","base","bigIntToBytes","bigInt","toArray","value","bytesModPow","exp","mod","bytesBigInt","expBigInt","modBigInt","modPow","CryptoMessagePort","constructor","super","lastIndex","invokeCryptoNew","method","transfer","payload","sendPortIndex","sendPorts","invoke","invokeCrypto","cryptoMessagePort","readBigIntFromBytesBE","bits","and","shiftLeft","i","_bits","or","emojis","randomize","arr","crypto","Error","getRandomValues","addPadding","blockSize","zeroes","blockSizeAsTotalLength","prepend","len","needPadding","padding","buffer","bytesFromHex","hexString","Math","ceil","start","parseInt","charAt","substr","convertToUint8Array","TextEncoder","encode","S","Si","T1","Uint32Array","T2","T3","T4","T5","T6","T7","T8","getWords","key","buf","pos","str","charCodeAt","xor","left","right","to","x2","x4","s","tEnc","tDec","d","t","x","xInv","computeTables","AES","_key","encKey","decKey","rcon","j","encrypt","_message","a2","b2","c2","message","out","a","c","rounds","k","decrypt","AES_IGE","iv","cipher","text","cipherText","prevX","subarray","prevY","yXOR","y","bytesToWordss","input","words","aesSync","keyBytes","ivBytes","o","bytesFromWordss","counter","offset","incrementCounter","carry","arrays","Uint16Array","bigIntRandom","min","max","array","nextRandomUint","BrentPollardFactor","n","two","remainder","isZero","m","ys","r","q","g","minus","eq","bigIntUint64MinusPqPlusOne","plus","performY","add","lesser","condition","multiply","greater","abs","subtle","CTR","mode","cryptoKey","queue","update","data","push","release","releasing","shift","_update","perform","name","head","toEncrypt","leftLength","leftLength2","performed","tail","leftAfter","aesCTRs","Map","lastCTRId","log","cryptoMethods","salt","iterations","importKey","hash","publicKey","exponent","modulus","pqBytes","factors","primes","factor","pop","isPrime","primeFactors","sort","compare","splice","p","map","toString","password","state","isNew","algo","new_algo","current_algo","pw_hash","client_salt","server_salt","makePasswordHash","salt1","salt2","Array","join","bytesToHex","padArray","flipper","B","srp_B","pForHash","gForHash","b_for_hash","k_v","is_good_mod_exp_first","modexp","prime","diff","subtract","isNegative","bitLength","toJSNumber","floor","a_for_hash","u","secure_random","A","generate_and_check_random","g_b","ux","a_ux","K","h1","bytes1","bytes2","bytesXor","buff","M1","_","srp_id","dhConfig","aBigInt","pBigInt","generateA","gBytes","g_a","g_a_hash","key_fingerprint","reverse","emojisLength","partOffset","index","codePoints","encIv","decIv","id","promises","encCryptoKey","decCryptoKey","enc","dec","operation","ctrs","get","delete","terminate","ctx","messagePort","onConnect","onDisconnect","attachPort","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","listenMessagePort","e","source","channel","MessageChannel","port1","port2","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","loaded","__webpack_modules__","call","__webpack_exports__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","getter","__esModule","definition","defineProperty","enumerable","f","chunkId","miniCssF","globalThis","Function","obj","prop","hasOwnProperty","nmd","paths","children","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","oldGetScript","oldLoadScript","queryMap","countMap","catch","retries","realSrc","request","setTimeout","cacheBust","Date","now","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file diff --git a/public/index.html b/public/index.html index fff0e569..6c785ad5 100644 --- a/public/index.html +++ b/public/index.html @@ -1,3 +1,3 @@ -Telegram Web \ No newline at end of file + \ No newline at end of file diff --git a/public/main.221edcc4de2837115246.bundle.js b/public/main.221edcc4de2837115246.bundle.js new file mode 100644 index 00000000..077bdd90 --- /dev/null +++ b/public/main.221edcc4de2837115246.bundle.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,t,n,s,i,o={410:(e,t,n)=>{n.d(t,{GO:()=>r,Tj:()=>i,ZP:()=>a});var s=n(1267);const i=!1,o=i||s.Z.debug,r="undefined"!=typeof window?window:self,a=o},236:(e,t,n)=>{n.d(t,{t:()=>c,h:()=>d});var s=n(4762),i=n(144),o=n(4159);const r=o.Z.version,a=o.Z.build,c={_:"theme",access_hash:"",id:"",settings:[{_:"themeSettings",pFlags:{},base_theme:{_:"baseThemeClassic"},accent_color:3379436,message_colors:[5221966],wallpaper:{_:"wallPaper",pFlags:{default:!0,pattern:!0},access_hash:"",document:void 0,id:"",slug:"pattern",settings:{_:"wallPaperSettings",pFlags:{},intensity:50,background_color:14409147,second_background_color:7054727,third_background_color:14014605,fourth_background_color:8960132}}},{_:"themeSettings",pFlags:{},base_theme:{_:"baseThemeNight"},accent_color:8877281,message_colors:[8877281],wallpaper:{_:"wallPaper",pFlags:{default:!0,pattern:!0,dark:!0},access_hash:"",document:void 0,id:"",slug:"pattern",settings:{_:"wallPaperSettings",pFlags:{},intensity:-50,background_color:16696470,second_background_color:14511289,third_background_color:9842623,fourth_background_color:5200853}}}],slug:"",title:"",emoticon:"🏠",pFlags:{default:!0}},l=(e,t,n)=>Object.assign(Object.assign({},c),{name:e,settings:Object.assign(Object.assign({},c.settings.find((e=>e.base_theme._===t))),{highlightningColor:n})}),d={allDialogsLoaded:{},pinnedOrders:{},contactsListCachedTime:0,updates:{},filtersArr:[],maxSeenMsgId:0,stateCreatedTime:Date.now(),recentEmoji:[],recentCustomEmoji:[],topPeersCache:{},recentSearch:[],version:r,build:a,authState:{_:s.IS_MOBILE?"authStateSignIn":"authStateSignQr"},hiddenPinnedMessages:{},settings:{messagesTextSize:16,distanceUnit:"kilometers",sendShortcut:"enter",animationsEnabled:!0,autoDownload:{photo:{contacts:!0,private:!0,groups:!0,channels:!0},video:{contacts:!0,private:!0,groups:!0,channels:!0},file:{contacts:!0,private:!0,groups:!0,channels:!0}},autoDownloadNew:{_:"autoDownloadSettings",file_size_max:3145728,pFlags:{video_preload_large:!0,audio_preload_next:!0},photo_size_max:1048576,video_size_max:15728640,video_upload_maxbitrate:100},autoPlay:{gifs:!0,videos:!0},stickers:{suggest:!0,loop:!0},emoji:{suggest:!0,big:!0},themes:[l("day","baseThemeClassic","hsla(86.4, 43.846153%, 45.117647%, .4)"),l("night","baseThemeNight","hsla(299.142857, 44.166666%, 37.470588%, .4)")],theme:"system",notifications:{sound:!1},timeFormat:(new Date).toLocaleString().match(/\s(AM|PM)/)?"h12":"h23"},playbackParams:{volume:1,muted:!1,playbackRate:1,playbackRates:{voice:1,video:1,audio:1},loop:!1,round:!1},keepSigned:!0,chatContextMenuHintWasShown:!1,stateId:(0,i.d)(32),notifySettings:{}}},8189:(e,t,n)=>{n.d(t,{Z:()=>i});let s=!1;try{const e=document.createElement("canvas").getContext("webgl"),t=e.getExtension("WEBGL_debug_renderer_info"),n=t&&e.getParameter(t.UNMASKED_RENDERER_WEBGL)||"";(n.match(/Apple/)&&!n.match(/Apple GPU/)||-1===e.getSupportedExtensions().indexOf("WEBGL_compressed_texture_s3tc_srgb"))&&(s=!0)}catch(e){}const i=s},993:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},7328:(e,t,n)=>{let s;if(n.d(t,{Z:()=>i}),n(4762).IS_SAFARI)try{s=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){s=!1}else s=!0;const i=s},6663:(e,t,n)=>{n.d(t,{Z:()=>s});const s="filter"in(document.createElement("canvas").getContext("2d")||{})},9976:(e,t,n)=>{n.d(t,{Z:()=>s});const s=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i)},3731:(e,t,n)=>{var s;n.d(t,{Z:()=>i});const i=!!(null===(s=null===navigator||void 0===navigator?void 0:navigator.geolocation)||void 0===s?void 0:s.getCurrentPosition)&&!1},6818:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},1174:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(5269);const i=new Set(["image/jpeg","image/png","image/bmp"]);s.Z&&i.add("image/webp");const o=i},2341:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(1174),i=n(554);const o=[...s.Z].concat([...i.Z]),r=new Set(o)},9030:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!!document.createElement("video").canPlayType("video/quicktime")||s.IS_SAFARI||s.IS_APPLE_MOBILE},5783:(e,t,n)=>{n.d(t,{Z:()=>i});const s=document.createElement("audio"),i=!(!s.canPlayType||!s.canPlayType("audio/ogg;").replace(/no/,""))},2365:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!n(4762).IS_FIREFOX&&!1},2820:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!("getDisplayMedia"in((null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||{}))},2045:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(1267);const i="undefined"!=typeof SharedWorker&&!s.Z.noSharedWorker},5432:(e,t,n)=>{n.d(t,{Z:()=>s});const s="ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch},4762:(e,t,n)=>{n.r(t),n.d(t,{IS_ANDROID:()=>r,IS_APPLE:()=>o,IS_APPLE_MOBILE:()=>c,IS_CHROMIUM:()=>a,IS_FIREFOX:()=>d,IS_MOBILE:()=>u,IS_MOBILE_SAFARI:()=>h,IS_SAFARI:()=>l,USER_AGENT:()=>i});var s=n(6761);const i=navigator?navigator.userAgent:null,o=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),r=-1!==navigator.userAgent.toLowerCase().indexOf("android"),a=/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),c=(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!s.Z.MSStream,l=!!("safari"in s.Z)||!(!i||!(/\b(iPad|iPhone|iPod)\b/.test(i)||i.match("Safari")&&!i.match("Chrome"))),d=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,h=l&&c,u=(void 0===navigator.maxTouchPoints||navigator.maxTouchPoints>0)&&-1!=navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},2131:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!(null===navigator||void 0===navigator?void 0:navigator.vibrate)},554:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(9030);const i=new Set(["image/gif","video/mp4","video/webm"]);s.Z&&i.add("video/quicktime");const o=i},393:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!!document.createElement("video").canPlayType("video/webm")&&!s.IS_SAFARI&&!s.IS_APPLE_MOBILE},5269:(e,t,n)=>{n.d(t,{Z:()=>s});const s=document.createElement("canvas").toDataURL("image/webp").startsWith("data:image/webp")},4089:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!("undefined"==typeof RTCPeerConnection||s.IS_FIREFOX)},2064:(e,t,n)=>{function s(e,t,n){e/=255,t/=255,n/=255;const s=Math.max(e,t,n),i=s-Math.min(e,t,n),o=i&&(s===e?(t-n)/i:s==t?2+(n-e)/i:4+(e-t)/i);return[60*(o<0?o+6:o),s&&i/s,s]}function i(e,t,n){const s=(s,i=(s+e/60)%6)=>Math.round(255*(n-n*t*Math.max(Math.min(i,4-i,1),0)));return[s(5),s(3),s(1)]}function o(e,t,n,s=1){e/=255,t/=255,n/=255;const i=Math.max(e,t,n),o=Math.min(e,t,n);let r,a;const c=(i+o)/2;if(i===o)r=a=0;else{const s=i-o;switch(a=c>.5?s/(2-i-o):s/(i+o),i){case e:r=(t-n)/s+(t1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e},a=n<.5?n*(1+t):n+t-n*t,c=2*n-a;i=s(c,a,e+1/3),o=s(c,a,e),r=s(c,a,e-1/3)}return[i,o,r,s].map((e=>Math.round(255*e)))}function a(e){const t=[],n="#"===e[0]?1:0;if(e.length===5+n&&(e=(n?"#":"")+"0"+e.slice(n)),e.length===3+n)for(let s=n;s("0"+e.toString(16)).slice(-2))).join("")}function h(e){return function(e){return d(function(e){const t=e.slice(5,-1).split(", "),n=+t.pop(),s=t.map((e=>e.endsWith("%")?+e.slice(0,-1):+e));return r(s[0],s[1],s[2],n)}(e))}(e).slice(0,-2)}function u(e,t,n){const s=new Array(3);for(let i=0;i<3;++i){const o=e[i],r=t[i];s[i]=Math.floor(r+(o-r)*n)}return s}function g(e,t){return e.map(((e,n)=>Math.round((e+t[n])/2)))}function m(e,t,n){const o=s(...t),r=s(...n),a=Math.min(1.5*o[1]/e[1],1);return o[0]=Math.min(360,r[0]-o[0]+e[0]),o[1]=Math.min(1,r[1]*e[1]/o[1]),o[2]=Math.min(1,(r[2]/o[2]+a-1)*e[2]/a),o[2]<.3?n:i(...o)}function p(e){const t=(e<0?16777215+e:e).toString(16);return"#"+(t.length>=6?t:"0".repeat(6-t.length)+t)}function f(e){return c(p(e))}function v(e){return e.settings?[e.settings.background_color,e.settings.second_background_color,e.settings.third_background_color,e.settings.fourth_background_color].filter(Boolean).map(p).join(","):""}n.d(t,{Dk:()=>u,EM:()=>v,K5:()=>h,Pi:()=>a,WE:()=>i,Y6:()=>r,cw:()=>l,dI:()=>o,e9:()=>m,ix:()=>g,oo:()=>c,py:()=>s,t1:()=>d,tB:()=>f,v1:()=>p})},6009:(e,t,n)=>{function s(e,t){e=e.split(" ",1)[0],t=t.split(" ",1)[0];const n=e.split("."),s=t.split(".");for(let e=0;ei)return 1;if(ts})},8799:(e,t,n)=>{function s(){var e;return!!(null===(e=document.activeElement)||void 0===e?void 0:e.blur)&&(document.activeElement.blur(),!0)}n.d(t,{Z:()=>s})},3910:(e,t,n)=>{function s(e){if(e||(e=window.event),e){if(!e.cancelable)return!1;e=e.originalEvent||e;try{e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault(),e.returnValue=!1,e.cancelBubble=!0}catch(e){}}return!1}n.d(t,{Z:()=>s})},8497:(e,t,n)=>{function s(e,t){return e.closest("."+t)}n.d(t,{Z:()=>s})},5494:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(3035);function i(e){e.style.transform="translateY(-99999px)",e.focus(),(0,s.d1)().then((()=>{e.style.transform=""}))}},8090:(e,t,n)=>{n.d(t,{T:()=>a,Z:()=>c});var s=n(5432),i=n(4762),o=n(8497),r=n(5494);const a=i.IS_SAFARI&&i.IS_MOBILE&&s.Z;if(a){const e="clientY";let t=0;const n={capture:!0,passive:!1},s=n=>{const s=n.touches[0],i=(0,o.Z)(s.target,"scrollable-y");if(i){const o=s[e],r=t-o,a=i.scrollTop,c=i.scrollHeight,l=i.clientHeight,d=a?Math.round(a+i.clientHeight+r):a+r;(c===l||d>=c||d<=0)&&n.preventDefault()}else n.preventDefault()};let i=0;document.addEventListener("focusin",(o=>{!o.target.classList.contains("is-sticky-input-bugged")||o.timeStamp-i<50||((0,r.Z)(o.target),document.addEventListener("touchmove",s,n),document.addEventListener("touchstart",(n=>{if(n.touches.length>1)return;const s=n.touches[0];t=s[e]})))}),{passive:!0}),document.addEventListener("focusout",(e=>{document.removeEventListener("touchmove",s,n),i=e.timeStamp}),{passive:!0}),document.addEventListener("visibilitychange",(()=>{document.activeElement&&document.activeElement.classList.contains("is-sticky-input-bugged")&&document.activeElement.blur&&(0,r.Z)(document.activeElement)}),{passive:!0})}function c(e){a&&e.classList.add("is-sticky-input-bugged")}},6472:(e,t,n)=>{n.d(t,{B:()=>o,Z:()=>i});let s;function i(){window.addEventListener("beforeinstallprompt",(e=>{s=()=>{return t=this,n=void 0,o=function*(){e.prompt();const{outcome:t}=yield e.userChoice;"accepted"===t&&(s=void 0)},new((i=void 0)||(i=Promise))((function(e,s){function r(e){try{c(o.next(e))}catch(e){s(e)}}function a(e){try{c(o.throw(e))}catch(e){s(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(r,a)}c((o=o.apply(t,n||[])).next())}));var t,n,i,o}}))}function o(){return s}},4541:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(319),i=n(5418);const o=["b","б"],r={},a={text:"Roboto",icons:"tgico",monospace:"Roboto Mono"};function c(e={text:o,icons:void 0,monospace:o}){if(!("fonts"in document))return Promise.resolve();const t=[];for(const n in e){let s=e[n];"all"===s&&(s=o);const i=a[n],c="icons"===n?[500]:[400,500];for(const e of c){const n=(s||[void 0]).map((t=>{var n,s,o,a;const c=[e,"1rem",i].join(" ");return null!==(s=(o=null!==(n=r[c])&&void 0!==n?n:r[c]={})[a=t||""])&&void 0!==s?s:o[a]=document.fonts.load(c,t)}));t.push(...n)}}return Promise.race([Promise.all(t).catch(s.Z),(0,i.Z)(1e3)])}},130:(e,t,n)=>{function s(e,t){i(e),"string"==typeof t?t?e.innerHTML=t:e.replaceChildren():e.replaceChildren(t)}function i(e){e.setAttribute("dir","auto")}n.d(t,{Z:()=>s,m:()=>i})},2586:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(5432),i=n(3241);const o=s.Z?"touchstart":"mousemove";class r extends i.Z{constructor(){super(),this._isIdle=!0,this.focusPromise=Promise.resolve(),this.focusResolve=()=>{},window.addEventListener("blur",(()=>{this.isIdle=!0,window.addEventListener("focus",(()=>{this.isIdle=!1}),{once:!0})})),window.addEventListener(o,(()=>{this.isIdle=!1}),{once:!0,passive:!0}),this.addEventListener("change",(e=>{e?this.focusPromise=new Promise((e=>{this.focusResolve=e})):this.focusResolve()}))}getFocusPromise(){return this.focusPromise}get isIdle(){return this._isIdle}set isIdle(e){this._isIdle!==e&&(this._isIdle=e,this.dispatchEvent("change",e))}}const a=new r},3815:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(3241);class i extends s.Z{constructor(){super(...arguments),this.overlaysActive=0}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("change",this.isOverlayActive)}}const o=new i},3035:(e,t,n)=>{let s;function i(e){s?s.push(e):(s=[e],requestAnimationFrame((()=>{const e=s;s=void 0,e.forEach((e=>e()))})))}n.d(t,{AD:()=>l,T2:()=>i,TR:()=>c,d1:()=>d});let o,r,a=!1;function c(e){o?a?e():o.push(e):(o=[e],requestAnimationFrame((()=>{a=!0;for(let e=0;ei((()=>e())))),r.then((()=>{r=void 0})),r)}function d(){return new Promise((e=>{i((()=>{i(e)}))}))}},764:(e,t,n)=>{function s(e,t=e.split("?")){const n={};return t[1]?(t[1].split("&").forEach((e=>{n[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])})),n):n}n.d(t,{Z:()=>s})},6714:(e,t,n)=>{n.d(t,{Z:()=>d});var s=n(5432),i=n(3512),o=n(2064),r=function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function r(e){try{c(s.next(e))}catch(e){o(e)}}function a(e){try{c(s.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,a)}c((s=s.apply(e,t||[])).next())}))};const a={"primary-color":{rgb:!0,light:!0,lightFilled:!0,dark:!0,darkRgb:!0},"message-out-primary-color":{lightFilled:!0},"surface-color":{rgb:!0},"danger-color":{light:!0,dark:!0},"primary-text-color":{rgb:!0},"secondary-text-color":{light:!0,lightFilled:!0},"message-out-background-color":{light:!0,lightFilled:!0,dark:!0,darkFilled:!0}},c={day:{"primary-color":"#3390ec","message-out-primary-color":"#4fae4e","surface-color":"#ffffff","danger-color":"#df3f40","primary-text-color":"#000000","secondary-text-color":"#707579"},night:{"primary-color":"#8774E1","message-out-primary-color":"#8774E1","surface-color":"#212121","danger-color":"#ff595a","primary-text-color":"#ffffff","secondary-text-color":"#aaaaaa"}},l=new class{constructor(){i.Z.addEventListener("theme_change",(()=>{this.setTheme()}))}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(e=this.themeColor){e||(e=this.isNight()?"#212121":"#ffffff");const t=this.themeColorElem;t&&t.setAttribute("content",e)}setThemeListener(){try{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{this.systemTheme=e.matches?"night":"day",i.Z.myId?i.Z.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}applyHighlightningColor(){var e;let t;const n=l.getTheme();(null===(e=n.settings)||void 0===e?void 0:e.highlightningColor)?(t=n.settings.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",t)):document.documentElement.style.removeProperty("--message-highlightning-color"),!s.Z&&t&&(l.themeColor=(0,o.K5)(t))}setTheme(){const e=this.isNight(),t=document.head.querySelector('[name="color-scheme"]');t&&t.setAttribute("content",e?"dark":"light"),document.documentElement.classList.toggle("night",e),this.setThemeColor(),this.applyTheme(this.getTheme()),this.applyHighlightningColor()}switchTheme(e){return r(this,void 0,void 0,(function*(){yield i.Z.managers.appStateManager.setByKey("settings.theme",e),i.Z.dispatchEvent("theme_change")}))}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===i.Z.settings.theme?this.systemTheme:i.Z.settings.theme)){return i.Z.settings.themes.find((t=>t.name===e))}bindColorApplier(e){const t=new Set;return{applyAppColor:n=>(t.add(n.name),this.applyAppColor(Object.assign(Object.assign({},n),e))),finalize:()=>{const e=this.isNight();for(const n in a)t.has(n)||this.applyAppColor({name:n,hex:c[e?"night":"day"][n]})}}}applyAppColor({name:e,hex:t,element:n=document.documentElement,lightenAlpha:s=.08,darkenAlpha:i=s,mixColor:r}){const d=a[e],h=(0,o.oo)(t),u=(0,o.dI)(...h);null!=r||(r=(0,o.oo)(c[l.isNight()?"night":"day"]["surface-color"]));const g=(0,o.Dk)(h,r,s),m=Object.assign(Object.assign({},u),{l:u.l-100*i});n.style.setProperty("--"+e,t),d.rgb&&n.style.setProperty("--"+e+"-rgb",h.join(",")),d.light&&n.style.setProperty("--light-"+e,`rgba(${h[0]}, ${h[1]}, ${h[2]}, ${s})`),d.lightFilled&&n.style.setProperty("--light-filled-"+e,(0,o.t1)(g)),d.dark&&n.style.setProperty("--dark-"+e,`hsl(${m.h}, ${m.s}%, ${m.l}%)`)}applyNewTheme(e){return r(this,void 0,void 0,(function*(){const t=this.isNight(),n=this.getTheme(),s=i.Z.settings.themes,o=e.settings.find((e=>e.base_theme._===(t?"baseThemeNight":"baseThemeClassic"))),r=Object.assign(Object.assign({},e),{name:n.name,settings:Object.assign(Object.assign({},o),{highlightningColor:""})});yield this.AppBackgroundTab.setBackgroundDocument(o.wallpaper,r.settings),s[s.indexOf(n)]=r,yield i.Z.managers.appStateManager.setByKey("settings.themes",i.Z.settings.themes),i.Z.dispatchEvent("theme_change")}))}applyTheme(e,t=document.documentElement){var n;return r(this,void 0,void 0,(function*(){const s=l.isNight(),i=Array.isArray(e.settings)?e.settings.find((e=>e.base_theme._===(s?"baseThemeNight":"baseThemeClassic"))):e.settings,r=c[s?"night":"day"];let a=(0,o.py)(...(0,o.oo)(r["primary-color"])),d=(0,o.py)(...(0,o.tB)(i.accent_color)),h=(0,o.v1)(i.accent_color);if(s){const e=(0,o.oo)(h),t=(0,o.Dk)(e,(0,o.oo)(r["surface-color"]),.84);h=(0,o.t1)(t)}const{applyAppColor:u,finalize:g}=this.bindColorApplier({element:t});if(u({name:"primary-color",hex:h,darkenAlpha:.04}),!(null===(n=i.message_colors)||void 0===n?void 0:n.length))return;const m=s?.92:.12,p=(0,o.oo)(r["message-out-primary-color"]);a=(0,o.py)(...p);const f=(0,o.Dk)(p,(0,o.oo)(r["surface-color"]),m);let v=(0,o.tB)(i.message_colors[0]);i.message_colors.length>1&&(i.message_colors.slice(1).forEach((e=>{v=(0,o.ix)(v,(0,o.tB)(e))})),v=(0,o.e9)(a,f,v));const b=v;d=(0,o.py)(...b);const y=void 0!==i.outbox_accent_color&&(0,o.py)(...(0,o.tB)(i.outbox_accent_color)),w=(0,o.Dk)(v,(0,o.oo)(r["surface-color"]),m);u({name:"message-out-background-color",hex:(0,o.t1)(w),lightenAlpha:m}),u({name:"message-out-primary-color",hex:s?"#ffffff":(0,o.t1)(y?(0,o.WE)(...y):v),mixColor:w}),g()}))}},d=l},2938:(e,t,n)=>{var s=n(4159),i=n(8799),o=n(3910),r=n(8090),a=n(4541),c=n(9976),l=n(4762),d=n(5418);!function(){const e={construct(e,t){let n=t[0]+"";return 0!==n.indexOf("blob:")&&(n+=location.search),new e(n)}};[Worker,"undefined"!=typeof SharedWorker&&SharedWorker].filter(Boolean).forEach((t=>{window[t.name]=new Proxy(t,e)}))}();var h=n(3512),u=n(5432),g=n(2325),m=(n(4110),n(690),n(3855)),p=n(2554),f=n(6714),v=n(3815),b=n(490),y=n(764),w=n(1267),S=n(410);const k="onbeforeinstallprompt"in window;var P=n(6472);document.addEventListener("DOMContentLoaded",(()=>{return e=void 0,t=void 0,E=function*(){Element.prototype.toggleAttribute||(Element.prototype.toggleAttribute=function(e,t){return void 0!==t&&(t=!!t),this.hasAttribute(e)?!!t||(this.removeAttribute(e),!1):!1!==t&&(this.setAttribute(e,""),!0)}),void 0===Node.prototype.replaceChildren&&(Node.prototype.replaceChildren=function(...e){this.textContent="",e&&this.append(...e)}),h.Z.managers=(0,p.Z)(),document.getElementById("manifest").href=`site${l.IS_APPLE&&!l.IS_APPLE_MOBILE?"_apple":""}.webmanifest?v=jw3mK7G9Aq`,b.Z.start();const e=window.visualViewport||window;let t,_=!1;const E=()=>{const n=.01*(_&&!v.Z.isOverlayActive?e.height||e.innerHeight:window.innerHeight);t!==n&&(u.Z&&t1&&(0,i.Z)(),t=n,document.documentElement.style.setProperty("--vh",`${n}px`))};if(window.addEventListener("resize",E),E(),r.T){const t=()=>{_=1===n&&r.T&&!v.Z.isOverlayActive,E(),e!==window&&(_?(window.removeEventListener("resize",E),e.addEventListener("resize",E)):(e.removeEventListener("resize",E),window.addEventListener("resize",E)))};let n;window.onImTabChange=e=>{const s=void 0!==n;n=e,(s||1===n)&&t()},v.Z.addEventListener("change",(()=>{t()}))}l.IS_FIREFOX&&!c.Z&&document.addEventListener("dragstart",(e=>{const t=e.target;if("IMG"===t.tagName&&t.classList.contains("emoji"))return(0,o.Z)(e),!1})),c.Z&&document.documentElement.classList.add("native-emoji"),document.addEventListener("dragstart",(e=>{var t;if("IMG"===(null===(t=e.target)||void 0===t?void 0:t.tagName))return e.preventDefault(),!1})),document.addEventListener("contextmenu",(e=>{"IMG"!==e.target.tagName||window.appMediaViewer||(0,o.Z)(e)})),l.IS_FIREFOX&&document.documentElement.classList.add("is-firefox","no-backdrop"),l.IS_MOBILE&&document.documentElement.classList.add("is-mobile"),l.IS_APPLE?(l.IS_SAFARI&&document.documentElement.classList.add("is-safari"),l.IS_APPLE_MOBILE?document.documentElement.classList.add("is-ios"):document.documentElement.classList.add("is-mac")):l.IS_ANDROID&&document.documentElement.classList.add("is-android"),u.Z?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch"),k&&(0,P.Z)();const A=performance.now(),Z=g.ZP.getCacheLangPack(),[I,C]=yield Promise.all([m.Z.sendState().then((([e])=>e)),Z]);function L(e,t){e.style.opacity="0",t.then((()=>{window.requestAnimationFrame((()=>{e.style.opacity=""}))}))}g.ZP.setTimeFormat(I.state.settings.timeFormat),h.Z.managers.rootScope.getPremium().then((e=>{h.Z.premium=e})),f.Z.setThemeListener(),C.appVersion!==s.Z.langPackVersion&&g.ZP.getLangPack(C.lang_code),console.log("got state, time:",performance.now()-A),"ar"===C.lang_code&&S.Tj,document.documentElement.dir="ltr";let T=I.state.authState;const O=location.hash,M=O.split("?"),x=(0,y.Z)(O,M);if(x.tgWebAuthToken&&"authStateSignedIn"!==T._){const e={token:x.tgWebAuthToken,dcId:+x.tgWebAuthDcId,userId:x.tgWebAuthUserId.toUserId(),isTest:void 0!==x.tgWebAuthTest&&!!+x.tgWebAuthTest,tgAddr:x.tgaddr};if(e.isTest!==w.Z.test){const e=new URLSearchParams(location.search);return+x.tgWebAuthTest?e.set("test","1"):e.delete("test"),void(location.search=e.toString())}h.Z.managers.appStateManager.pushToState("authState",T={_:"authStateSignImport",data:e})}if("authStateSignedIn"!==T._){console.log("Will mount auth page:",T._,Date.now()/1e3);const e=document.getElementById("auth-pages");let t,s;if(e){t=e.querySelector(".scrollable"),u.Z&&!l.IS_MOBILE_SAFARI||t.classList.add("no-scrollbar"),t.style.opacity="0";const n=document.createElement("div");n.classList.add("auth-placeholder"),t.prepend(n),t.append(n.cloneNode())}try{yield Promise.all([Promise.resolve().then(n.bind(n,2831)),Promise.resolve().then(n.bind(n,6702))]).then((([e,t])=>{e.default.setAuthorized(!1),t.default.forceUnsubscribe()}))}catch(e){}switch(T._){case"authStateSignIn":s=(yield Promise.all([n.e(539),n.e(460),n.e(63)]).then(n.bind(n,810))).default.mount();break;case"authStateSignQr":s=(yield Promise.all([n.e(539),n.e(460),n.e(709)]).then(n.bind(n,9709))).default.mount();break;case"authStateAuthCode":s=(yield Promise.all([n.e(539),n.e(460),n.e(53)]).then(n.bind(n,6392))).default.mount(T.sentCode);break;case"authStatePassword":s=(yield Promise.all([n.e(539),n.e(460),n.e(437)]).then(n.bind(n,9437))).default.mount();break;case"authStateSignUp":s=(yield Promise.all([n.e(539),n.e(460),n.e(339)]).then(n.bind(n,8339))).default.mount(T.authCode);break;case"authStateSignImport":s=(yield Promise.all([n.e(539),n.e(460),n.e(231)]).then(n.bind(n,3231))).default.mount(T.data)}t&&(s&&(yield s),L(t,"fonts"in document?Promise.race([(0,d.Z)(1e3),document.fonts.ready]):Promise.resolve()))}else console.log("Will mount IM page:",Date.now()/1e3),L(document.getElementById("main-columns"),(0,a.Z)()),(yield Promise.all([n.e(539),n.e(460),n.e(436)]).then(n.bind(n,5436))).default.mount()},new((_=void 0)||(_=Promise))((function(n,s){function i(e){try{r(E.next(e))}catch(e){s(e)}}function o(e){try{r(E.throw(e))}catch(e){s(e)}}function r(e){var t;e.done?n(e.value):(t=e.value,t instanceof _?t:new _((function(e){e(t)}))).then(i,o)}r((E=E.apply(e,t||[])).next())}));var e,t,_,E}))},1722:(e,t,n)=>{n.d(t,{Z:()=>s});const s=new class{reload(){try{location.reload()}catch(e){}}close(){try{window.close()}catch(e){}}focus(){window.focus()}}},2554:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(3855),i=n(410);const o={};function r(e,t){return new Proxy(e,{get:(e,n,r)=>{var a;return null!==(a=e[n])&&void 0!==a?a:e[n]=function(e,t){return new Proxy({},{get:(n,r,a)=>(...n)=>{var a;const c=s.Z.invoke("manager",{name:e,method:r,args:n},t);return i.ZP&&(null===(a=o[e])||void 0===a?void 0:a.has(r))&&console.warn("manager request",e,r,n),c}})}(n,t)}})}let a;function c(){return a||(a=r({},!1),a.acknowledged=r({},!0),a)}i.ZP&&(window.DEBUG_MANAGER_REQUESTS=o)},6666:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(1267),i=n(5471),o=n(5953),r=n(5003);class a{constructor(e){(0,o.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,r.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),a.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var n;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const n of t.indexes)e.indexNames.contains(n.indexName)||e.createIndex(n.indexName,n.keyPath,n.objectParameters)};try{var n=indexedDB.open(this.name,this.version);if(!n)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||n.onerror((0,i.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,i)=>{n.onsuccess=t=>{s=!0;const o=n.result;let r=!1;this.log("Opened"),o.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},o.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},o.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),o.close()},o.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=o)},n.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},n.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const n=e.target,i=n.result;this.stores.forEach((e=>{if(i.objectStoreNames.contains(e.name)){const s=n.transaction.objectStore(e.name);t(s,e)}else((e,n)=>{const s=e.createObjectStore(n.name);t(s,n)})(i,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new a(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}a.INSTANCES=[];class c{constructor(e,t){this.storeName=t,this.log=(0,r.kg)(["IDB",e.name,t].join("-")),this.idb=a.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,n){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(n=>e.map(((e,s)=>n.put(t[s],e)))),"",n)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,n,s=this.storeName){let i;return n&&(i=performance.now(),this.log(n+": start")),this.idb.openDatabase().then((o=>new Promise(((r,a)=>{const c=o.transaction([s],e),l=()=>{clearTimeout(u),a(c.error)},d=()=>{clearTimeout(u),n&&this.log(n+": end",performance.now()-i);const e=p.map((e=>e.result));r(m?e:e[0])};c.onerror=l;const h="readwrite"===e;h&&(c.oncomplete=()=>d());const u=setTimeout((()=>{this.log.error("transaction not finished",c,n)}),1e4),g=t(c.objectStore(s)),m=Array.isArray(g),p=m?g:[].concat(g);if(h)return;const f=p.length;let v=f;const b=()=>{c.error||--v||d()};for(let e=0;ee.getAll()),"",e)}}},2325:(e,t,n)=>{n.d(t,{$d:()=>w,A1:()=>S,Hz:()=>m,XZ:()=>y,ZP:()=>v,ag:()=>b,nK:()=>p,v_:()=>k});var s=n(410),i=n(7922),o=n(4159),r=n(3512),a=n(4762),c=n(6848),l=n(5953),d=n(9005),h=n(6637),u=n(3591),g=n(130);const m={messageActionChatCreate:"ActionCreateGroup",messageActionChatCreateYou:"ActionYouCreateGroup",messageActionChatEditTitle:"ActionChangedTitle",messageActionChatEditPhoto:"ActionChangedPhoto",messageActionChatEditVideo:"ActionChangedVideo",messageActionChatDeletePhoto:"ActionRemovedPhoto",messageActionChatReturn:"ActionAddUserSelf",messageActionChatReturnYou:"ActionAddUserSelfYou",messageActionChatJoined:"ActionAddUserSelfMega",messageActionChatJoinedYou:"ChannelMegaJoined",messageActionChatAddUser:"ActionAddUser",messageActionChatAddUsers:"ActionAddUser",messageActionChatLeave:"ActionLeftUser",messageActionChatLeaveYou:"YouLeft",messageActionChatDeleteUser:"ActionKickUser",messageActionChatJoinedByLink:"ActionInviteUser",messageActionPinMessage:"Chat.Service.Group.UpdatedPinnedMessage",messageActionContactSignUp:"Chat.Service.PeerJoinedTelegram",messageActionChannelCreate:"ActionCreateChannel",messageActionChannelEditTitle:"Chat.Service.Channel.UpdatedTitle",messageActionChannelEditPhoto:"Chat.Service.Channel.UpdatedPhoto",messageActionChannelEditVideo:"Chat.Service.Channel.UpdatedVideo",messageActionChannelDeletePhoto:"Chat.Service.Channel.RemovedPhoto",messageActionHistoryClear:"HistoryCleared",messageActionDiscussionStarted:"DiscussionStarted",messageActionChannelMigrateFrom:"ActionMigrateFromGroup","messageActionPhoneCall.video_in_ok":"ChatList.Service.VideoCall.incoming","messageActionPhoneCall.video_out_ok":"ChatList.Service.VideoCall.outgoing","messageActionPhoneCall.video_missed":"ChatList.Service.VideoCall.Missed","messageActionPhoneCall.video_cancelled":"ChatList.Service.VideoCall.Cancelled","messageActionPhoneCall.in_ok":"ChatList.Service.Call.incoming","messageActionPhoneCall.out_ok":"ChatList.Service.Call.outgoing","messageActionPhoneCall.missed":"ChatList.Service.Call.Missed","messageActionPhoneCall.cancelled":"ChatList.Service.Call.Cancelled","messageActionGroupCall.started":"Chat.Service.VoiceChatStarted.Channel","messageActionGroupCall.started_by":"Chat.Service.VoiceChatStarted","messageActionGroupCall.started_byYou":"Chat.Service.VoiceChatStartedYou","messageActionGroupCall.ended":"Chat.Service.VoiceChatFinished.Channel","messageActionGroupCall.ended_by":"Chat.Service.VoiceChatFinished","messageActionGroupCall.ended_byYou":"Chat.Service.VoiceChatFinishedYou",messageActionBotAllowed:"Chat.Service.BotPermissionAllowed"},p=a.IS_MOBILE?"Message.Unsupported.Mobile":"Message.Unsupported.Desktop";var f;!function(e){let t,a;function m(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function p(){if("h12"===e.timeFormat)try{const t=A({hour:"numeric",minute:"numeric",hour12:!0}),n=new Date;n.setHours(0);const s=t.format(n);e.amPmCache.am=s.split(" ")[1],n.setHours(12);const i=t.format(n);e.amPmCache.pm=i.split(" ")[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function f(){const e=o.Z.langPackCode;return m(e),Promise.all([n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),n.e(8).then(n.bind(n,9179))]).then((([t,n,s])=>{const i=[];return b(t.default,i),b(n.default,i),y({_:"langPackDifference",from_version:0,lang_code:e,strings:i,version:0,local:!0,countries:s.default})}))}function v(t,s){e.requestedServerLanguage=!0;const i=r.Z.managers;return Promise.all([i.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"web"}),!1,n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),i.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function b(e,t=[]){for(const n in e){const s=e[n];"string"==typeof s?t.push({_:"langPackString",key:n,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:n},s))}return t}function y(e){return e.appVersion=o.Z.langPackVersion,i.Z.set({langPack:e}).then((()=>(w(e),e)))}function w(n){const s=e.lastRequestedLangCode;if(n.lang_code===s){try{t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode)}catch(n){console.error("pluralRules error",n),t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode.split("-",1)[0])}try{t=new Intl.PluralRules(n.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(n.lang_code.split("-",1)[0])}e.strings.clear();for(const t of n.strings)e.strings.set(t.key,t);n.countries&&(e.countriesList.length=0,e.countriesList.push(...n.countries.countries),n.countries.countries.forEach((t=>{if(t.name){const n=t.default_name;e.strings.set(n,{_:"langPackString",key:n,value:t.name})}}))),e.lastAppliedLangCode!==s&&(r.Z.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,E.clear(),p()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n&&n.update()}))}}function S(e,t,n={i:0}){const s=[];let i=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,o,r,a,c,l,d)=>{if(s.push(d.slice(i,l)),o){let e;switch(o){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...S(r,t,n)),s.push(e)}else if(a)s.push(document.createElement("br"));else if(c){const e=c.lastIndexOf("]"),i=c.slice(1,e),o=c.slice(e+2,c.length-1);let r;if(o&&(0,h.Z)(o)){r=document.createElement("a");const e=(0,u.Z)(o);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[n.i++],r instanceof DocumentFragment&&(r=r.firstChild),r.textContent="";r.append(...S(i,t,n)),s.push(r)}else t&&function(e,t,n){const s=t[n.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,n);return i=l+e.length,""})),i!==e.length&&s.push(e.slice(i)),s}function k(n,s=!1,i){const o=e.strings.get(n);let r;if(o)if("langPackStringPluralized"===o._&&(null==i?void 0:i.length)){let e=i[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),r=o[t.select(e)+"_value"]||o.other_value}else r="langPackString"===o._?o.value:n;else r=n;const a=S(r,i);return s?a.map((e=>e instanceof Node?e.textContent:e)).join(""):a}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.isRTL=!1,e.setRTL=function(t){e.isRTL=t},e.getCacheLangPack=function(){return a||(a=Promise.all([i.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(s.ZP,e.lastRequestedLangCode||m(t.lang_code),w(t),t):f())).finally((()=>{a=void 0})))},e.setTimeFormat=function(t,n=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,p(),n&&(E.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n instanceof Z&&n.update()})))},e.loadLocalLangPack=f,e.loadLangPack=v,e.getStrings=function(e,t){return r.Z.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:o.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=b,e.getLangPack=function(e,t){return m(e),v(e).then((([e,t,n,s,i,o])=>{let r=[];return[n,s].forEach((e=>{b(e.default,r)})),r=r.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=r,e.countries=i,y(e)}))},e.saveLangPack=y,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():n.e(642).then(n.bind(n,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=w,e.superFormatter=S,e.format=k,e.weakMap=new WeakMap;class P{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class _ extends P{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,l.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...k(this.key,!1,this.args));else{const e=this.element[this.property],t=k(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,c.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=_;const E=new Map;function A(t={}){const n=JSON.stringify(t);let s=E.get(n);return s||(s=new Intl.DateTimeFormat(e.lastRequestedNormalizedLangCode+"-u-hc-"+e.timeFormat,t),E.set(n,s)),s}e.amPmCache={am:"AM",pm:"PM"};class Z extends P{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"})),(0,g.m)(this.element)}update(t){let n;if((0,l.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){const t=this.date.getHours();n=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(n+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=A(this.options);n=(0,d.Z)(e.format(this.date))}this.element[this.property]=n}}e.IntlDateElement=Z,e.i18n=function(e,t){return new _({key:e,args:t}).element},e.i18n_=function(e){return new _(e).element},e._i18n=function(e,t,n,s){return new _({element:e,key:t,args:n,property:s}).element}}(f||(f={}));const v=f,b=f.i18n,y=f.i18n_,w=f._i18n;function S(e,t){const n=e.slice(0,1);for(let s=1;s{const s=e&&t?"AutoDownloadSettings.LastDelimeter":"AutoDownloadSettings.Delimeter";return n?f.format(s,!0):b(s)}));return n?s.join(""):s}s.GO.I18n=f},1507:(e,t,n)=>{n.d(t,{BP:()=>u,BX:()=>m,DZ:()=>v,IA:()=>o,Iw:()=>l,J$:()=>p,NM:()=>s,OS:()=>h,Ox:()=>g,Pt:()=>d,Zi:()=>f,gZ:()=>c,hj:()=>i,rU:()=>a,yF:()=>r});const s=0,i=1271266957,o=777,r=777e3,a=2147483647,c="",l=20971520,d="",h=[7322096,16766590,13338331,9367192,16749490,16478047],u="default_static",g=4295032831,m=new Set(["web","k","z"]),p=0,f=1,v=new Set([p,f]);Math.max(...Array.from(v))},3855:(e,t,n)=>{n.d(t,{Z:()=>se});var s=n(3512),i=n(7730),o=n(410),r=n(7487),a=n(6702),c=n(1722),l=n(2831),d=n(5418),h=n(993),u=n(7328),g=n(6663),m=n(9976),p=n(3731),f=n(6818),v=n(1174),b=n(2341),y=n(9030),w=n(2365),S=n(2820),k=n(5432),P=n(2131),_=n(554),E=n(393),A=n(5269),Z=n(4089),I=n(4762),C=n(5783),L=n(2045),T=n(8189);const O=Object.assign({CAN_USE_TRANSFERABLES:u.Z,IS_APPLE_MX:T.Z,IS_CALL_SUPPORTED:h.Z,IS_CANVAS_FILTER_SUPPORTED:g.Z,IS_EMOJI_SUPPORTED:m.Z,IS_GEOLOCATION_SUPPORTED:p.Z,IS_GROUP_CALL_SUPPORTED:f.Z,IS_MOV_SUPPORTED:y.Z,IS_PARALLAX_SUPPORTED:w.Z,IS_SCREEN_SHARING_SUPPORTED:S.Z,IS_TOUCH_SUPPORTED:k.Z,IS_VIBRATE_SUPPORTED:P.Z,IS_OPUS_SUPPORTED:C.Z,IS_SHARED_WORKER_SUPPORTED:L.Z,IS_WEBM_SUPPORTED:E.Z,IS_WEBP_SUPPORTED:A.Z,IS_WEBRTC_SUPPORTED:Z.Z,IMAGE_MIME_TYPES_SUPPORTED:v.Z,MEDIA_MIME_TYPES_SUPPORTED:b.Z,VIDEO_MIME_TYPES_SUPPORTED:_.Z},I);var M=n(4159),x=n(236),W=n(6009),D=n(8479),R=n(946),N=n(7922),j=n(5466),F=n(5003);const U=x.h.version,B=x.h.build,V=Object.keys(x.h),G=["contactsListCachedTime","stateCreatedTime","maxSeenMsgId","filtersArr"];function $(){return e=this,t=void 0,i=function*(){const e=(0,F.kg)("STATE-LOADER"),t=performance.now(),n=(0,j.$)(e),i=V.map((e=>n(N.Z.get(e),"state "+e))).concat(n(r.Z.get("user_auth"),"auth"),n(r.Z.get("state_id"),"auth"),n(r.Z.get("k_build"),"auth")).concat(n(N.Z.get("user_auth"),"old auth")),a=yield Promise.all(i);e.warn("promises",performance.now()-t);const c=[],l=(e,t)=>{d[e]=t,c.push(e)};let d={};for(let e=0,t=V.length;eN.Z.get(e))));e.push("user_auth"),t.push("number"==typeof h||"string"==typeof h?{dcID:t[0]||M.Z.baseDcId,date:Date.now()/1e3|0,id:h.toPeerId(!1)}:h);const n={};e.forEach(((e,s)=>{n[e]=t[s]})),yield r.Z.set(n)}h&&(d.authState={_:"authStateSignedIn"},s.Z.dispatchEvent("user_auth","number"==typeof h||"string"==typeof h?{dcID:0,date:Date.now()/1e3|0,id:h.toPeerId(!1)}:h));const p=new Set;if(d.stateId!==u){if(void 0!==u){const e=new Map([["authState",void 0],["stateId",void 0]]);e.forEach(((t,n)=>{e.set(n,(0,D.Z)(d[n]))})),d=(0,D.Z)(x.h),e.forEach(((e,t)=>{d[t]=e}));const t={chats:1,dialogs:1,users:1};for(const e in t)p.add(e);f=d,c.length=0,d=f,c.push(...Object.keys(d))}yield r.Z.set({state_id:d.stateId})}var f;const v=Date.now();d.stateCreatedTime+864e5{l(e,(0,D.Z)(x.h[e]))})));const b=d.settings.autoDownload;if(void 0!==(null==b?void 0:b.private)){const e=["contacts","private","groups","channels"];["photo","video","file"].forEach((t=>{const n=b[t]={};e.forEach((e=>{n[e]=b[e]}))})),e.forEach((e=>{delete b[e]})),l("settings",d.settings)}const y=new Set(["settings.themes"]);let w,S;if((0,R.Z)(x.h,d,(e=>{l(e,d[e])}),void 0,y),d.version!==U||d.build!==B){if(d.build<217&&(d.allDialogsLoaded=(0,D.Z)(x.h.allDialogsLoaded),d.pinnedOrders=(0,D.Z)(x.h.pinnedOrders),d.filtersArr=(0,D.Z)(x.h.filtersArr),p.add("dialogs")),-1===(0,W.Z)(d.version,"1.7.1")){let e=!1;if(-1===(0,W.Z)(d.version,"1.3.0"))e=!0,d.settings.theme=(0,D.Z)(x.h.settings.theme),d.settings.themes=(0,D.Z)(x.h.settings.themes);else if(-1===(0,W.Z)(d.version,"1.7.1")){e=!0;const t=d.settings.themes;d.settings.themes=(0,D.Z)(x.h.settings.themes);try{t.forEach((e=>{const t=e.background;if(!t)return;const n=d.settings.themes.find((t=>t.name===e.name));n.settings.highlightningColor=t.highlightningColor;const s=(t.color||"").split(",").map((e=>e&&parseInt(e.slice(1),16)));if(t.color&&!t.slug)n.settings.wallpaper={_:"wallPaperNoFile",id:0,pFlags:{},settings:{_:"wallPaperSettings",pFlags:{}}};else{const e={_:"wallPaper",id:0,access_hash:0,slug:t.slug,document:{},pFlags:{},settings:{_:"wallPaperSettings",pFlags:{}}},s=e.settings;n.settings.wallpaper=e,t.slug&&!t.color?s.pFlags.blur=t.blur||void 0:t.intensity&&(s.intensity=t.intensity,e.pFlags.pattern=!0,e.pFlags.dark=t.intensity<0||void 0)}if(s.length){const e=n.settings.wallpaper.settings;e.background_color=s[0],e.second_background_color=s[1],e.third_background_color=s[2],e.fourth_background_color=s[3]}}))}catch(e){console.error("migrating themes error",e)}}e&&l("settings",d.settings)}0!==(0,W.Z)(d.version,U)&&(w=U,S=d.version),l("version",U),l("build",B)}return g!==B&&(!g||g{var t,n;const{name:s,key:i,value:o}=e;if(!e.hasOwnProperty("key"))return void(this.mirrors[s]=o);const r=null!==(t=(n=this.mirrors)[s])&&void 0!==t?t:n[s]={};void 0===o?delete r[i]:r[i]=o},this.mirrors={},this.tabState={chatPeerIds:[],idleStartTime:0},this.log("constructor"),this.registerWorker(),this.registerServiceWorker(),this.registerCryptoWorker(),this.addMultipleEventsListeners({convertWebp:({fileName:e,bytes:t})=>i.Z.convert(e,t),convertOpus:({fileName:e,bytes:t})=>q.Z.pushDecodeTask(t,!1).then((e=>e.bytes)),event:({name:e,args:t})=>{s.Z.dispatchEventSingle(e,...t)},localStorageProxy:e=>{const t=e;return r.Z[t.type](...t.args)},mirror:this.onMirrorTask}),s.Z.addEventListener("language_change",(e=>{s.Z.managers.networkerFactory.setLanguage(e)})),window.addEventListener("online",(()=>{s.Z.managers.networkerFactory.forceReconnectTimeout()})),s.Z.addEventListener("logging_out",(()=>{Promise.all([(0,X.Z)(!1,!0),r.Z.clear(),Promise.race([l.default.setAuthorized(!1),(0,d.Z)(3e3)]),a.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map((e=>caches.delete(e))))]).finally((()=>{c.Z.reload()}))})),J.Z.addEventListener("change",(e=>{this.updateTabStateIdle(e)})),this.updateTabStateIdle(J.Z.isIdle),this.log("Passing environment:",O),this.invoke("environment",O)}pingServiceWorkerWithIframe(){if(this.pingServiceWorkerPromise)return this.pingServiceWorkerPromise;const e=this.pingServiceWorkerPromise=(0,Q.Z)(),t=document.createElement("iframe");t.hidden=!0;const n=()=>{setTimeout((()=>{this.pingServiceWorkerPromise=void 0}),1e4),clearTimeout(s),t.remove(),t.removeEventListener("load",n),t.removeEventListener("error",n),e.resolve()};t.addEventListener("load",n),t.addEventListener("error",n),t.src="ping/"+(4294967295*Math.random()|0),document.body.append(t);const s=window.setTimeout(n,1e3);return e}attachServiceWorker(e){this.lastServiceWorker&&this.serviceMessagePort.detachPort(this.lastServiceWorker),this.serviceMessagePort.attachSendPort(this.lastServiceWorker=e),this.serviceMessagePort.invokeVoid("hello",void 0)}_registerServiceWorker(){navigator.serviceWorker.register(new URL(n.p+n.u(670),n.b),{scope:"./"}).then((e=>{if(this.log("SW registered",e),e.active&&!navigator.serviceWorker.controller)return e.unregister().then((()=>{window.location.reload()}));(e.installing||e.waiting||e.active).addEventListener("statechange",(e=>{this.log("SW statechange",e)}));const t=navigator.serviceWorker.controller||e.installing||e.waiting||e.active;this.attachServiceWorker(t)}),(e=>{this.log.error("SW registration failed!",e),this.invokeVoid("serviceWorkerOnline",!1)}))}registerServiceWorker(){if(!("serviceWorker"in navigator))return;this.serviceMessagePort=new K.Z;const e=navigator.serviceWorker;this._registerServiceWorker(),e.addEventListener("controllerchange",(()=>{this.log.warn("controllerchange");const t=e.controller;this.attachServiceWorker(t),t.addEventListener("error",(e=>{this.log.error("controller error:",e)}))})),this.serviceMessagePort.attachListenPort(e),this.serviceMessagePort.addMultipleEventsListeners({port:(e,t,n)=>{this.invokeVoid("serviceWorkerPort",void 0,void 0,[n.ports[0]])},hello:(e,t)=>{this.serviceMessagePort.resendLockTask(t)},share:e=>{this.log("will try to share something"),this.share=e}}),e.addEventListener("messageerror",(e=>{this.log.error("SW messageerror:",e)}))}registerCryptoWorker(){return ee(this,void 0,void 0,(function*(){const e={construct:(e,t)=>({url:t[0]+location.search})},t=[Worker,"undefined"!=typeof SharedWorker&&SharedWorker].filter(Boolean);t.forEach((t=>window[t.name]=new Proxy(t,e)));const s=new Worker(new URL(n.p+n.u(589),n.b),{type:void 0});t.forEach((e=>window[e.name]=e));const i=s.url,o=e=>new a(e,{type:"module"}),r=e=>this.attachWorkerToPort(e,Y.Z,"crypto"),a=L.Z?SharedWorker:Worker;Y.Z.addEventListener("port",((e,t,n)=>{this.invokeVoid("cryptoPort",void 0,void 0,[n.ports[0]])})),r(o(i));const c=yield(l=i,fetch(l).then((e=>e.text())).then((e=>{const t=location.pathname.split("/");return t[t.length-1]="",e=`\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${location.origin+t.join("/")}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${e}`,new Blob([e],{type:"application/javascript"})})));var l;(yield this.invoke("createProxyWorkerURLs",{originalUrl:i,blob:c})).slice(1).map(o).forEach(r)}))}registerWorker(){let e;e=L.Z?new SharedWorker(new URL(n.p+n.u(678),n.b),{type:void 0}):new Worker(new URL(n.p+n.u(678),n.b),{type:void 0}),this.onWorkerFirstMessage(e)}attachWorkerToPort(e,t,n){const s=e.port||e;t.attachPort(s),e.addEventListener("error",(e=>{this.log.error(n,"worker error",e)}))}onWorkerFirstMessage(e){this.log("set webWorker"),this.attachWorkerToPort(e,this,"mtproto")}loadState(){return Promise.all([(null!=z?z:z=$()).then((e=>(this.newVersion=e.newVersion,this.oldVersion=e.oldVersion,this.mirrors.state=e.state,e)))])}sendState(){return this.loadState().then((e=>{const[t]=e;return this.invoke("state",Object.assign(Object.assign({},t),{userId:s.Z.myId.toUserId()})),e}))}invokeCrypto(e,...t){return Y.Z.invokeCrypto(e,...t)}toggleStorages(e,t){return ee(this,void 0,void 0,(function*(){yield(0,X.Z)(e,t),this.invoke("toggleStorages",{enabled:e,clearWrite:t}),this.serviceMessagePort.invokeVoid("toggleStorages",{enabled:e,clearWrite:t})}))}getMirror(e){return ee(this,void 0,void 0,(function*(){return this.mirrors[e]}))}getState(){return this.getMirror("state")}updateTabState(e,t){this.tabState[e]=t,this.invokeVoid("tabState",this.tabState)}updateTabStateIdle(e){this.updateTabState("idleStartTime",e?Date.now():0)}}const ne=new te;o.GO.apiManagerProxy=ne;const se=ne},490:(e,t,n)=>{n.d(t,{Z:()=>f});var s=n(4159),i=n(410),o=n(2219),r=n(2045),a=n(3241),c=n(2586),l=n(5003),d=n(3512),h=n(7487),u=n(3855);const g=r.Z;class m extends a.Z{constructor(){super(!1),this.log=(0,l.kg)("INSTANCE"),this.clearInstance=()=>{this.masterInstance&&!this.deactivated&&(this.log.warn("clear master instance"),h.Z.delete("xt_instance"))},this.checkInstance=(e=c.Z.isIdle)=>{return t=this,n=void 0,o=function*(){if(this.deactivated)return;const t=Date.now(),n={id:this.instanceId,idle:e,time:t},[i,o=s.Z.build]=yield Promise.all([h.Z.get("xt_instance",!1),h.Z.get("k_build",!1)]);if(o>s.Z.build)return this.masterInstance=!1,d.Z.managers.networkerFactory.stopAll(),this.deactivateInstance("version"),void u.Z.toggleStorages(!1,!1);g?h.Z.set({xt_instance:n}):!e||!i||i.id===this.instanceId||i.timethis.deactivateInstance("tabs")),3e4)))},new((i=void 0)||(i=Promise))((function(e,s){function r(e){try{c(o.next(e))}catch(e){s(e)}}function a(e){try{c(o.throw(e))}catch(e){s(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(r,a)}c((o=o.apply(t,n||[])).next())}));var t,n,i,o},this.log=(0,l.kg)("INSTANCE"),this.instanceId=o.Z}get deactivatedReason(){return this.deactivated}start(){if(this.reset(),!this.started){this.started=!0,c.Z.addEventListener("change",this.checkInstance),setInterval(this.checkInstance,5e3),this.checkInstance();try{document.documentElement.addEventListener("beforeunload",this.clearInstance)}catch(e){}}}reset(){this.masterInstance=!1,this.clearDeactivateTimeout(),this.deactivated=void 0}activateInstance(){this.deactivated&&(this.reset(),this.checkInstance(!1),this.dispatchEvent("activated"))}deactivateInstance(e){this.masterInstance||this.deactivated||(this.log.warn("deactivate",e),this.clearDeactivateTimeout(),this.deactivated=e,this.dispatchEvent("deactivated",e))}clearDeactivateTimeout(){this.deactivateTimeout&&(clearTimeout(this.deactivateTimeout),this.deactivateTimeout=0)}}const p=new m;i.GO&&(i.GO.singleInstance=p);const f=p},2831:(e,t,n)=>{n.r(t),n.d(t,{TelegramMeWebManager:()=>c,default:()=>d});var s=n(4159),i=n(410),o=n(1267),r=n(7298),a=n(7487);class c{constructor(){this.disabled=o.Z.test||!s.Z.domains.includes(location.hostname)}setAuthorized(e){if(!this.disabled)return a.Z.get("tgme_sync").then((t=>{const n=(0,r.Z)(!0);if(e&&(null==t?void 0:t.canRedirect)===e&&t.ts+86400>n)return;a.Z.set({tgme_sync:{canRedirect:e,ts:n}});const i=`_websync_?authed=${e?"1":"0"}&version=${encodeURIComponent(s.Z.version+" "+s.Z.suffix)}`,o=["//telegram.me/"+i,"//t.me/"+i].map((e=>function(e){const t=document.createElement("script"),n=new Promise((e=>{t.onload=t.onerror=()=>{e(t)}}));return t.src=e,document.body.appendChild(t),n}(e).then((e=>{e.remove()}))));return Promise.all(o)}))}}const l=new c;i.GO&&(i.GO.telegramMeWebManager=l);const d=l},6702:(e,t,n)=>{n.r(t),n.d(t,{WebPushApiManager:()=>u,default:()=>m});var s=n(410),i=n(5003),o=n(3855),r=n(2325),a=n(4762),c=n(1722),l=n(8479),d=n(490),h=n(3241);class u extends h.Z{constructor(){super(!1),this.isAvailable=!0,this.isPushEnabled=!1,this.localNotificationsAvailable=!0,this.started=!1,this.settings={},this.isFirefox=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,this.userVisibleOnly=!this.isFirefox,this.log=(0,i.kg)("PM"),this.subscribe=()=>{this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.subscribe({userVisibleOnly:this.userVisibleOnly}).then((e=>{this.isPushEnabled=!0,this.pushSubscriptionNotify("subscribe",e)})).catch((e=>{"denied"===Notification.permission?this.log("Permission for Notifications was denied"):(this.log("Unable to subscribe to push.",e),this.userVisibleOnly||(this.userVisibleOnly=!0,setTimeout(this.subscribe,0)))}))}))},this.isAliveNotify=()=>{if(!this.isAvailable||d.Z.deactivatedReason)return;this.settings.baseUrl=(location.href||"").replace(/#.*$/,"");const e={},t={push_action_mute1d:a.IS_MOBILE?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:a.IS_MOBILE?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const n in t)e[n]=r.ZP.format(t[n],!0);o.Z.serviceMessagePort.invokeVoid("pushPing",{localNotifications:this.localNotificationsAvailable,lang:e,settings:this.settings}),this.isAliveTO=setTimeout(this.isAliveNotify,1e4)},"PushManager"in window&&"Notification"in window&&"serviceWorker"in navigator||(this.log.warn("Push messaging is not supported."),this.isAvailable=!1,this.localNotificationsAvailable=!1),this.isAvailable&&"denied"===Notification.permission&&this.log.warn("The user has blocked notifications.")}start(){this.started||(this.started=!0,this.getSubscription(),this.setUpServiceWorkerChannel())}setLocalNotificationsDisabled(){this.localNotificationsAvailable=!1}getSubscription(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!!e,this.pushSubscriptionNotify("init",e)})).catch((e=>{this.log.error("Error during getSubscription()",e)}))}))}unsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!1,e&&(this.pushSubscriptionNotify("unsubscribe",e),setTimeout((()=>{e.unsubscribe().then((e=>{this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))}),3e3))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}forceUnsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.log.warn("force unsubscribe",e),e&&e.unsubscribe().then((e=>{this.log.warn("force unsubscribe successful",e),this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}setSettings(e){this.settings=(0,l.Z)(e),clearTimeout(this.isAliveTO),this.isAliveNotify()}hidePushNotifications(){this.isAvailable&&o.Z.serviceMessagePort.invokeVoid("notificationsClear",void 0)}setUpServiceWorkerChannel(){this.isAvailable&&(o.Z.serviceMessagePort.addEventListener("pushClick",(e=>{d.Z.deactivatedReason?c.Z.reload():this.dispatchEvent("push_notification_click",e)})),navigator.serviceWorker.ready.then(this.isAliveNotify))}pushSubscriptionNotify(e,t){if(t){const n=t.toJSON();if(!(n&&n.endpoint&&n.keys&&n.keys.p256dh&&n.keys.auth))return this.log.warn("Invalid push subscription",n),this.unsubscribe(),this.isAvailable=!1,void this.pushSubscriptionNotify(e);this.log.warn("Push",e,n),this.dispatchEvent("push_"+e,{tokenType:10,tokenValue:JSON.stringify(n)})}else this.log.warn("Push",e,!1),this.dispatchEvent("push_"+e,!1)}}const g=new u;s.GO&&(s.GO.webPushApiManager=g);const m=g},9043:(e,t,n)=>{n.d(t,{Z:()=>d});var s=n(410),i=n(5783),o=n(4762),r=n(5003),a=n(3855),c=function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function r(e){try{c(s.next(e))}catch(e){o(e)}}function a(e){try{c(s.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,a)}c((s=s.apply(e,t||[])).next())}))};const l=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=(0,r.kg)("OPUS",r.v9.Error)}isPlaySupported(){return i.Z}loadWavWorker(){this.wavWorker||(this.wavWorker=new Worker("waveWorker.min.js"),this.wavWorker.addEventListener("message",(e=>{const t=e.data;if(this.log("[WAV] got message:",t),t&&t.page){const e=t.page;this.onTaskEnd(this.tasks.shift(),e)}})))}loadWorker(){this.worker||(this.worker=new Worker("decoderWorker.min.js"),this.worker.addEventListener("message",(e=>{const t=e.data;this.log("[DECODER] got message",t),"done"===t.type?(this.wavWorker.postMessage({command:"done"}),t.waveform&&(this.tasks[0].waveform=t.waveform)):this.wavWorker.postMessage({command:"encode",buffers:e.data},o.IS_SAFARI?void 0:t.map((e=>e.buffer)))})))}setKeepAlive(e){this.keepAlive=e,this.keepAlive?(this.loadWorker(),this.loadWavWorker()):this.tasks.length||this.terminateWorkers()}onTaskEnd(e,t){t?(clearTimeout(e.timeout),e.callback.resolve({bytes:t,waveform:e.waveform})):e.callback.reject("timeout"),this.tasks.length&&this.executeNewTask(this.tasks[0]),this.terminateWorkers()}terminateWorkers(e=!1){(!this.keepAlive&&!this.tasks.length||e)&&(this.worker&&(this.worker.terminate(),this.worker=null),this.wavWorker&&(this.wavWorker.terminate(),this.wavWorker=null))}executeNewTask(e){this.worker.postMessage({command:"init",decoderSampleRate:this.sampleRate,outputBufferSampleRate:this.sampleRate}),this.wavWorker.postMessage({command:"init",wavBitDepth:16,wavSampleRate:this.sampleRate}),this.log("[DECODER] send decode"),this.worker.postMessage({command:"decode",pages:e.pages,waveform:e.withWaveform},o.IS_SAFARI?void 0:[e.pages.buffer]),e.timeout=window.setTimeout((()=>{this.log.error("decode timeout"),this.terminateWorkers(!0),this.tasks.length&&(this.loadWorker(),this.loadWavWorker()),this.onTaskEnd(this.tasks.shift())}),1e4)}pushDecodeTask(e,t){return new Promise(((n,s)=>{const i={pages:e,withWaveform:t,callback:{resolve:n,reject:s},timeout:0};this.loadWorker(),this.loadWavWorker(),1===this.tasks.push(i)&&this.executeNewTask(i)}))}decode(e,t=!1){return c(this,void 0,void 0,(function*(){return this.pushDecodeTask(e,t).then((e=>c(this,void 0,void 0,(function*(){const t=new Blob([e.bytes],{type:"audio/wav"});return{url:yield a.Z.invoke("createObjectURL",t),waveform:e.waveform}}))))}))}};s.GO.opusDecodeController=l;const d=l},2423:(e,t,n)=>{n.d(t,{$2:()=>u,E:()=>g,Hk:()=>p,QB:()=>m,SC:()=>f,bu:()=>l,it:()=>c,kO:()=>b,tY:()=>v});var s=n(1229);const i="a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",o="0-9_"+i,r="["+i+"0-9]",a="((?:https?|ftp)://|mailto:)?",c=a+"(?:"+r+"{1,64}(?::"+r+"{0,64})?@)?(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|"+r+"["+i+"·0-9-]{0,64}(?:\\."+r+"["+i+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+i+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",l=(new RegExp("^"+a.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),d="[a-zA-Z\\d_]{5,32}",h="\\/([a-zA-Z\\d_]{1,32})(?:@("+d+"))?(\\b|$)",u=new RegExp("(^| )(@)("+d+")|("+c+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#["+o+"]{2,64})|(^|\\s)"+h,"i"),g=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,m=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,p={Telegram:"tg://search_hashtag?hashtag={1}",Twitter:"https://twitter.com/hashtag/{1}",Instagram:"https://instagram.com/explore/tags/{1}/","Google Plus":"https://plus.google.com/explore/{1}"},f={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},v=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in f)v.add(f[e]);const b=/^\+\d+$/},3591:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(2423),i=n(410),o=n(6637),r=n(1507);function a(e,t){(0,o.Z)(e)||(e="https://"+e);const n={url:e};let i,a,c,l;if(i=e.match(/^(?:https?:\/\/)?(?:(.+?)\.)?(?:(?:web|k|z)\.)?t(?:elegram)?\.me(?:\/(.+))?/)){const t=new URL(e);let n=i[1];n&&r.BX.has(i[1])&&(n=void 0),n&&(t.pathname=n+("/"===t.pathname?"":t.pathname));const o=t.pathname.slice(1),a=o.split("/");if(a[0]&&"$"===a[0][0]&&a[0].length>1)l="invoice";else if(/^\W/.test(o)&&!s.kO.test(o))l="joinchat";else switch(a[0]){case"joinchat":case"addstickers":case"addemoji":case"voicechat":case"invoice":if(1!==a.length&&!n){l=a[0];break}default:if(a[1]&&a[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===a.length){l="im";break}}}else(a=e.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?l="im":(c=e.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(l="tg_"+c[1]);return window[l]||(l=void 0),n.onclick=l,n}i.GO&&(i.GO.wrapUrl=a)},3512:(e,t,n)=>{n.d(t,{Z:()=>d});var s=n(1507),i=n(3241),o=n(410),r=n(3206),a=n(1352);class c extends i.Z{constructor(){super(),this.myId=s.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("premium_toggle_private",(({isNew:e,isPremium:t})=>{this.premium=t,e||this.dispatchEventSingle("premium_toggle",t)})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),r.Z.getInstance().invokeVoid("event",{name:e,args:t})},a.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}getPremium(){return this.premium}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const l=new c;o.GO.rootScope=l;const d=l},7730:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(410),i=n(3725);const o=new class{constructor(){this.convertPromises={}}init(){this.worker=new Worker(new URL(n.p+n.u(61),n.b)),this.worker.addEventListener("message",(e=>{const t=e.data.payload,n=this.convertPromises[t.fileName];n&&(t.bytes?n.resolve(t.bytes):n.reject(),delete this.convertPromises[t.fileName])}))}postMessage(e){this.init&&(this.init(),this.init=null),this.worker.postMessage(e)}convert(e,t){if(this.convertPromises.hasOwnProperty(e))return this.convertPromises[e];const n=(0,i.Z)();return this.postMessage({type:"convertWebp",payload:{fileName:e,bytes:t}}),this.convertPromises[e]=n}};s.GO.webpWorkerController=o;const r=o}},r={};function a(e){var t=r[e];if(void 0!==t)return t.exports;var n=r[e]={exports:{}};return o[e].call(n.exports,n,n.exports,a),n.exports}a.m=o,e=[],a.O=(t,n,s,i)=>{if(!n){var o=1/0;for(d=0;d=i)&&Object.keys(a.O).every((e=>a.O[e](n[c])))?n.splice(c--,1):(r=!1,i0&&e[d-1][2]>i;d--)e[d]=e[d-1];e[d]=[n,s,i]},a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,a.t=function(e,s){if(1&s&&(e=this(e)),8&s)return e;if("object"==typeof e&&e){if(4&s&&e.__esModule)return e;if(16&s&&"function"==typeof e.then)return e}var i=Object.create(null);a.r(i);var o={};t=t||[null,n({}),n([]),n(n)];for(var r=2&s&&e;"object"==typeof r&&!~t.indexOf(r);r=n(r))Object.getOwnPropertyNames(r).forEach((t=>o[t]=()=>e[t]));return o.default=()=>e,a.d(i,o),i},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((t,n)=>(a.f[n](e,t),t)),[])),a.u=e=>(({589:"crypto.worker",630:"npm.qr-code-styling",670:"sw",678:"mtproto.worker"}[e]||e)+"."+{8:"570e6da51a125009c156",53:"77c5dab45a68d1851187",61:"b4b665c9d61c26575ebe",63:"0d39a81590990db74d39",77:"18305e1bd331a0fdd36c",104:"e24e7fdd92837aca2688",231:"32da54109dc94ecb5e46",301:"42dc636f96a62f6a08c8",339:"79c7f9c2341eeff66b88",392:"198d4679664c1bf4c989",436:"47558d0a092967b3c966",437:"d40e517d52e5dcf3b754",442:"645fe71c30545d9700d2",460:"045a47588277eda9214e",508:"37ca243cfb33b5edd94a",539:"17a0b07b4e6476f19654",589:"fe5845cc2133b5405cac",630:"2c5d57550714b1a9e42e",641:"11406cec52b05304f14f",642:"fd1ade69544ad78671c6",670:"04ffa51e8d749197145b",678:"d525550e01869ae11a4b",709:"73c949c4c6702cdf349b",776:"b547f5293903351f3ec7",781:"af546badf2c525815889",783:"827711558099e62fd694",810:"f272bad8a3948af5c8d0",813:"06763bece6721fb81fde"}[e]+".chunk.js"),a.miniCssF=e=>{},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s={},i="tweb:",a.l=(e,t,n,o)=>{if(s[e])s[e].push(t);else{var r,c;if(void 0!==n)for(var l=document.getElementsByTagName("script"),d=0;d{r.onerror=r.onload=null,clearTimeout(g);var i=s[e];if(delete s[e],r.parentNode&&r.parentNode.removeChild(r),i&&i.forEach((e=>e(n))),t)return t(n)},g=setTimeout(u.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=u.bind(null,r.onerror),r.onload=u.bind(null,r.onload),c&&document.head.appendChild(r)}},a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var t=a.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{if(void 0!==a){var e=a.u,t=a.e,n={},s={};a.u=function(t){return e(t)+(n.hasOwnProperty(t)?"?"+n[t]:"")},a.e=function(i){return t(i).catch((function(t){var o=s.hasOwnProperty(i)?s[i]:999999;if(o<1){var r=e(i);throw t.message="Loading chunk "+i+" failed after 999999 retries.\n("+r+")",t.request=r,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();n[i]=t,s[i]=o-1,e(a.e(i))}),3e3)}))}))}}})(),(()=>{a.b=document.baseURI||self.location.href;var e={179:0};a.f.j=(t,n)=>{var s=a.o(e,t)?e[t]:void 0;if(0!==s)if(s)n.push(s[2]);else{var i=new Promise(((n,i)=>s=e[t]=[n,i]));n.push(s[2]=i);var o=a.p+a.u(t),r=new Error;a.l(o,(n=>{if(a.o(e,t)&&(0!==(s=e[t])&&(e[t]=void 0),s)){var i=n&&("load"===n.type?"missing":n.type),o=n&&n.target&&n.target.src;r.message="Loading chunk "+t+" failed.\n("+i+": "+o+")",r.name="ChunkLoadError",r.type=i,r.request=o,s[1](r)}}),"chunk-"+t,t)}},a.O.j=t=>0===e[t];var t=(t,n)=>{var s,i,[o,r,c]=n,l=0;if(o.some((t=>0!==e[t]))){for(s in r)a.o(r,s)&&(a.m[s]=r[s]);if(c)var d=c(a)}for(t&&t(n);la(2938)));c=a.O(c)})(); +//# sourceMappingURL=main.221edcc4de2837115246.bundle.js.map \ No newline at end of file diff --git a/public/main.221edcc4de2837115246.bundle.js.map b/public/main.221edcc4de2837115246.bundle.js.map new file mode 100644 index 00000000..dc27f886 --- /dev/null +++ b/public/main.221edcc4de2837115246.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.221edcc4de2837115246.bundle.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/create fake namespace object","webpack://tweb/webpack/runtime/load script","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/state.ts","webpack://tweb/./src/helpers/getTimeFormat.ts","webpack://tweb/./src/environment/appleMx.ts","webpack://tweb/./src/environment/callSupport.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/canvasFilterSupport.ts","webpack://tweb/./src/environment/emojiSupport.ts","webpack://tweb/./src/environment/geolocationSupport.ts","webpack://tweb/./src/environment/groupCallSupport.ts","webpack://tweb/./src/environment/imageMimeTypesSupport.ts","webpack://tweb/./src/environment/mediaMimeTypesSupport.ts","webpack://tweb/./src/environment/movSupport.ts","webpack://tweb/./src/environment/opusSupport.ts","webpack://tweb/./src/environment/parallaxSupport.ts","webpack://tweb/./src/environment/screenSharingSupport.ts","webpack://tweb/./src/environment/sharedWorkerSupport.ts","webpack://tweb/./src/environment/touchSupport.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/vibrateSupport.ts","webpack://tweb/./src/environment/videoMimeTypesSupport.ts","webpack://tweb/./src/environment/webmSupport.ts","webpack://tweb/./src/environment/webpSupport.ts","webpack://tweb/./src/environment/webrtcSupport.ts","webpack://tweb/./src/helpers/color.ts","webpack://tweb/./src/helpers/compareVersion.ts","webpack://tweb/./src/helpers/dom/blurActiveElement.ts","webpack://tweb/./src/helpers/dom/cancelEvent.ts","webpack://tweb/./src/helpers/dom/findUpClassName.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInput.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack://tweb/./src/helpers/dom/installPrompt.ts","webpack://tweb/./src/helpers/dom/loadFonts.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/helpers/idleController.ts","webpack://tweb/./src/helpers/overlayCounter.ts","webpack://tweb/./src/helpers/schedulers.ts","webpack://tweb/./src/helpers/string/parseUriParams.ts","webpack://tweb/./src/helpers/themeController.ts","webpack://tweb/./src/helpers/setWorkerProxy.ts","webpack://tweb/./src/environment/installPrompt.ts","webpack://tweb/./src/index.ts","webpack://tweb/./src/helpers/dom/toggleAttributePolyfill.ts","webpack://tweb/./src/lib/appManagers/appRuntimeManager.ts","webpack://tweb/./src/lib/appManagers/getProxiedManagers.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/environment/index.ts","webpack://tweb/./src/lib/appManagers/utils/state/loadState.ts","webpack://tweb/./src/lib/mtproto/mtprotoworker.ts","webpack://tweb/./src/lib/mtproto/singleInstance.ts","webpack://tweb/./src/lib/mtproto/telegramMeWebManager.ts","webpack://tweb/./src/helpers/dom/loadScript.ts","webpack://tweb/./src/lib/mtproto/webPushApiManager.ts","webpack://tweb/./src/lib/opusDecodeController.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/webp/webpWorkerController.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/jsonp chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"tweb:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t};\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppMediaPlaybackController} from '../components/appMediaPlaybackController';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport getTimeFormat from '../helpers/getTimeFormat';\nimport {nextRandomUint} from '../helpers/random';\nimport {AutoDownloadSettings, BaseTheme, NotifyPeer, PeerNotifySettings, Theme, ThemeSettings, WallPaper} from '../layer';\nimport {TopPeerType, MyTopPeer} from '../lib/appManagers/appUsersManager';\nimport DialogsStorage from '../lib/storages/dialogs';\nimport FiltersStorage from '../lib/storages/filters';\nimport {AuthState, Modify} from '../types';\nimport App from './app';\n\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\n// ! DEPRECATED\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type AppTheme = Modify\n}>;\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n // contactsList: UserId[],\n contactsListCachedTime: number,\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n // filters?: FiltersStorage['filters'], // ! DEPRECATED\n filtersArr?: FiltersStorage['filtersArr'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n recentCustomEmoji: DocId[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts?: boolean, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: AppTheme[],\n theme: AppTheme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n playbackParams: ReturnType,\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings}\n};\n\n// const BACKGROUND_DAY_MOBILE: Background = {\n// blur: false,\n// slug: '',\n// color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n// highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n// intensity: 0,\n// id: '1'\n// };\n\n// const BACKGROUND_NIGHT_MOBILE: Background = {\n// blur: false,\n// slug: '',\n// color: '#0f0f0f',\n// highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)',\n// intensity: 0,\n// id: '-1'\n// };\n\nexport const DEFAULT_THEME: Theme = {\n _: 'theme',\n access_hash: '',\n id: '',\n settings: [{\n _: 'themeSettings',\n pFlags: {},\n base_theme: {_: 'baseThemeClassic'},\n accent_color: 0x3390ec,\n message_colors: [0x4fae4e],\n wallpaper: {\n _: 'wallPaper',\n pFlags: {\n default: true,\n pattern: true\n },\n access_hash: '',\n document: undefined,\n id: '',\n slug: 'pattern',\n settings: {\n _: 'wallPaperSettings',\n pFlags: {},\n intensity: 50,\n background_color: 0xdbddbb,\n second_background_color: 0x6ba587,\n third_background_color: 0xd5d88d,\n fourth_background_color: 0x88b884\n }\n }\n }, {\n _: 'themeSettings',\n pFlags: {},\n base_theme: {_: 'baseThemeNight'},\n accent_color: 0x8774E1,\n message_colors: [0x8774E1],\n wallpaper: {\n _: 'wallPaper',\n pFlags: {\n default: true,\n pattern: true,\n dark: true\n },\n access_hash: '',\n document: undefined,\n id: '',\n slug: 'pattern',\n settings: {\n _: 'wallPaperSettings',\n pFlags: {},\n intensity: -50,\n background_color: 0xfec496,\n second_background_color: 0xdd6cb9,\n third_background_color: 0x962fbf,\n fourth_background_color: 0x4f5bd5\n }\n }\n }],\n slug: '',\n title: '',\n emoticon: '🏠',\n pFlags: {default: true}\n};\n\nconst makeDefaultAppTheme = (\n name: AppTheme['name'],\n baseTheme: BaseTheme['_'],\n highlightningColor: string\n): AppTheme => {\n return {\n ...DEFAULT_THEME,\n name,\n settings: {\n ...DEFAULT_THEME.settings.find((s) => s.base_theme._ === baseTheme),\n highlightningColor\n }\n };\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n // contactsList: [],\n contactsListCachedTime: 0,\n updates: {},\n filtersArr: [],\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n recentCustomEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [\n makeDefaultAppTheme('day', 'baseThemeClassic', 'hsla(86.4, 43.846153%, 45.117647%, .4)'),\n makeDefaultAppTheme('night', 'baseThemeNight', 'hsla(299.142857, 44.166666%, 37.470588%, .4)')\n ],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat()\n },\n playbackParams: {\n volume: 1,\n muted: false,\n playbackRate: 1,\n playbackRates: {\n voice: 1,\n video: 1,\n audio: 1\n },\n loop: false,\n round: false\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32),\n notifySettings: {}\n};\n","export default function getTimeFormat(): 'h12' | 'h23' {\n // try {\n // const resolvedOptions = Intl.DateTimeFormat(navigator.language, {hour: 'numeric'}).resolvedOptions();\n // if('hourCycle' in resolvedOptions) {\n // return (resolvedOptions as any).hourCycle === 'h12' ? 'h12' : 'h23';\n // } else {\n // return resolvedOptions.hour12 ? 'h12' : 'h23';\n // }\n // } catch(err) {\n return new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23';\n // }\n}\n","let IS_APPLE_MX = false;\n\ntry {\n // Awesome detect from https://stackoverflow.com/a/65412357\n const ctx = document.createElement('canvas').getContext('webgl');\n const extension = ctx.getExtension('WEBGL_debug_renderer_info');\n const renderer: string = extension && ctx.getParameter(extension.UNMASKED_RENDERER_WEBGL) || '';\n if((renderer.match(/Apple/) && !renderer.match(/Apple GPU/)) ||\n ctx.getSupportedExtensions().indexOf('WEBGL_compressed_texture_s3tc_srgb') === -1) {\n IS_APPLE_MX = true;\n }\n} catch(err) {\n\n}\n\nexport default IS_APPLE_MX;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_CALL_SUPPORTED;\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_CANVAS_FILTER_SUPPORTED = 'filter' in (document.createElement('canvas').getContext('2d') || {});\n\nexport default IS_CANVAS_FILTER_SUPPORTED;\n","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\n\nexport default IS_EMOJI_SUPPORTED;\n","const IS_GEOLOCATION_SUPPORTED = !!navigator?.geolocation?.getCurrentPosition && false;\n\nexport default IS_GEOLOCATION_SUPPORTED;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_GROUP_CALL_SUPPORTED;\n","import IS_WEBP_SUPPORTED from './webpSupport';\n\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/bmp'\n]);\n\nif(IS_WEBP_SUPPORTED) {\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\n}\n\nexport default IMAGE_MIME_TYPES_SUPPORTED;\n","import IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\n\nconst arr = [...IMAGE_MIME_TYPES_SUPPORTED].concat([...VIDEO_MIME_TYPES_SUPPORTED]);\n\nconst MEDIA_MIME_TYPES_SUPPORTED = new Set(arr);\n\nexport default MEDIA_MIME_TYPES_SUPPORTED;\n","import {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\n\n// mov is not supported in Chrome on macOS\nconst IS_MOV_SUPPORTED = !!document.createElement('video').canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\n\nexport default IS_MOV_SUPPORTED;\n","const audio = document.createElement('audio');\nconst IS_OPUS_SUPPORTED = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\n\nexport default IS_OPUS_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default IS_PARALLAX_SUPPORTED;\n","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\n\nexport default IS_SCREEN_SHARING_SUPPORTED;\n","import Modes from '../config/modes';\n\nconst IS_SHARED_WORKER_SUPPORTED = typeof(SharedWorker) !== 'undefined' && !Modes.noSharedWorker/* && false */;\n\nexport default IS_SHARED_WORKER_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// @ts-ignore\nconst IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\nexport default IS_TOUCH_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || navigator.maxTouchPoints > 0) && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","import IS_MOV_SUPPORTED from './movSupport';\n\nexport type VIDEO_MIME_TYPE = 'image/gif' | 'video/mp4' | 'video/webm' | 'video/quicktime';\nconst VIDEO_MIME_TYPES_SUPPORTED: Set = new Set([\n 'image/gif', // have to display it as video\n 'video/mp4',\n 'video/webm'\n]);\n\nif(IS_MOV_SUPPORTED) {\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\n}\n\nexport default VIDEO_MIME_TYPES_SUPPORTED;\n","import {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\n\nconst IS_WEBM_SUPPORTED = !!document.createElement('video').canPlayType('video/webm') && !IS_SAFARI && !IS_APPLE_MOBILE;\n\nexport default IS_WEBM_SUPPORTED;\n","const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_WEBRTC_SUPPORTED = !!(typeof(RTCPeerConnection) !== 'undefined' && !IS_FIREFOX);\n\nexport default IS_WEBRTC_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WallPaper} from '../layer';\nimport clamp from './number/clamp';\n\nexport type ColorHsla = {\n h: number,\n s: number,\n l: number,\n a: number\n};\n\nexport type ColorRgba = [number, number, number, number];\nexport type ColorRgb = [number, number, number];\n\n/**\n * https://stackoverflow.com/a/54070620/6758968\n * r, g, b in [0, 255]\n * @returns h in [0,360) and s, v in [0,1]\n */\nexport function rgbToHsv(r: number, g: number, b: number): [number, number, number] {\n r /= 255, g /= 255, b /= 255;\n const v = Math.max(r, g, b),\n c = v - Math.min(r, g, b);\n const h = c && ((v === r) ? (g - b ) / c : ((v == g) ? 2 + (b - r) / c : 4 + (r - g) / c));\n return [60 * (h < 0 ? h + 6 : h), v && c / v, v];\n}\n\n/**\n * https://stackoverflow.com/a/54024653/6758968\n * @param h [0, 360]\n * @param s [0, 1]\n * @param v [0, 1]\n * @returns r, g, b in [0, 255]\n */\nexport function hsvToRgb(h: number, s: number, v: number): ColorRgb {\n const f = (n: number, k: number = (n + h / 60) % 6) => Math.round((v - v * s * Math.max(Math.min(k, 4 - k, 1), 0)) * 255);\n return [f(5), f(3), f(1)];\n}\n\n/**\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\n */\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\n r /= 255, g /= 255, b /= 255;\n const max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n let h: number, s: number;\n const l = (max + min) / 2;\n\n if(max === min) {\n h = s = 0; // achromatic\n } else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch(max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return {\n h: h * 360,\n s: s * 100,\n l: l * 100,\n a\n };\n}\n\n// * https://stackoverflow.com/a/9493060/6758968\n/**\n * Converts an HSL color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n *\n * @param {number} h The hue [0, 360]\n * @param {number} s The saturation [0, 1]\n * @param {number} l The lightness [0, 1]\n * @return {Array} The RGB representation [0, 255]\n */\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\n h /= 360, s /= 100, l /= 100;\n let r: number, g: number, b: number;\n\n if(s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\n if(t < 0) t += 1;\n if(t > 1) t -= 1;\n if(t < 1/6) return p + (q - p) * 6 * t;\n if(t < 1/2) return q;\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n }\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n\n return [r, g, b, a].map((v) => Math.round(v * 255)) as ColorRgba;\n}\n\nexport function hslaStringToRgba(hsla: string) {\n const splitted = hsla.slice(5, -1).split(', ');\n const alpha = +splitted.pop();\n const arr = splitted.map((val) => {\n if(val.endsWith('%')) {\n return +val.slice(0, -1);\n }\n\n return +val;\n });\n\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\n}\n\nexport function hexaToRgba(hexa: string) {\n const arr: ColorRgba = [] as any;\n const offset = hexa[0] === '#' ? 1 : 0;\n if(hexa.length === (5 + offset)) {\n hexa = (offset ? '#' : '') + '0' + hexa.slice(offset);\n }\n\n if(hexa.length === (3 + offset)) {\n for(let i = offset; i < hexa.length; ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n } else if(hexa.length === (4 + offset)) {\n for(let i = offset; i < (hexa.length - 1); ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n\n arr.push(parseInt(hexa[hexa.length - 1], 16));\n } else {\n for(let i = offset; i < hexa.length; i += 2) {\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\n }\n }\n\n return arr;\n}\n\nexport function hexToRgb(hex: string) {\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\n}\n\nexport function hexaToHsla(hexa: string) {\n const rgba = hexaToRgba(hexa);\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\n}\n\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\n return '#' + rgba.map((v) => ('0' + v.toString(16)).slice(-2)).join('');\n}\n\nexport function hslaStringToHexa(hsla: string) {\n return rgbaToHexa(hslaStringToRgba(hsla));\n}\n\nexport function hslaStringToHex(hsla: string) {\n return hslaStringToHexa(hsla).slice(0, -2);\n}\n\n/**\n * @param weight [0, 1]\n */\nexport function mixColors(color1: ColorRgb, color2: ColorRgb, weight: number) {\n const out = new Array(3) as ColorRgb;\n for(let i = 0; i < 3; ++i) {\n const v1 = color1[i], v2 = color2[i];\n out[i] = Math.floor(v2 + (v1 - v2) * weight);\n }\n\n return out;\n}\n\nexport function computePerceivedBrightness(color: ColorRgb) {\n return (color[0] * 0.2126 + color[1] * 0.7152 + color[2] * 0.0722) / 255;\n}\n\nexport function getAverageColor(color1: ColorRgb, color2: ColorRgb): ColorRgb {\n return color1.map((v, i) => Math.round((v + color2[i]) / 2)) as ColorRgb;\n}\n\nexport function getAccentColor(baseHsv: number[], baseColor: ColorRgb, elementColor: ColorRgb): ColorRgb {\n const hsvTemp3 = rgbToHsv(...baseColor);\n const hsvTemp4 = rgbToHsv(...elementColor);\n\n const dist = Math.min(1.5 * hsvTemp3[1] / baseHsv[1], 1);\n\n hsvTemp3[0] = Math.min(360, hsvTemp4[0] - hsvTemp3[0] + baseHsv[0]);\n hsvTemp3[1] = Math.min(1, hsvTemp4[1] * baseHsv[1] / hsvTemp3[1]);\n hsvTemp3[2] = Math.min(1, (hsvTemp4[2] / hsvTemp3[2] + dist - 1) * baseHsv[2] / dist);\n if(hsvTemp3[2] < 0.3) {\n return elementColor;\n }\n return hsvToRgb(...hsvTemp3);\n}\n\nexport function changeColorAccent(baseHsv: number[], accentHsv: number[], color: ColorRgb, isDarkTheme: boolean) {\n const colorHsv = rgbToHsv(...color);\n\n const diffH = Math.min(Math.abs(colorHsv[0] - baseHsv[0]), Math.abs(colorHsv[0] - baseHsv[0] - 360));\n if(diffH > 30) {\n return color;\n }\n\n const dist = Math.min(1.5 * colorHsv[1] / baseHsv[1], 1);\n\n colorHsv[0] = Math.min(360, colorHsv[0] + accentHsv[0] - baseHsv[0]);\n colorHsv[1] = Math.min(1, colorHsv[1] * accentHsv[1] / baseHsv[1]);\n colorHsv[2] = Math.min(1, colorHsv[2] * (1 - dist + dist * accentHsv[2] / baseHsv[2]));\n\n let newColor = hsvToRgb(...colorHsv);\n\n const origBrightness = computePerceivedBrightness(color);\n const newBrightness = computePerceivedBrightness(newColor);\n\n // We need to keep colors lighter in dark themes and darker in light themes\n const needRevertBrightness = isDarkTheme ? origBrightness > newBrightness : origBrightness < newBrightness;\n\n if(needRevertBrightness) {\n const amountOfNew = 0.6;\n const fallbackAmount = (1 - amountOfNew) * origBrightness / newBrightness + amountOfNew;\n newColor = changeBrightness(newColor, fallbackAmount);\n }\n\n return newColor;\n}\n\nexport function changeBrightness(color: ColorRgb, amount: number) {\n return color.map((v) => clamp(Math.round(v * amount), 0, 255)) as ColorRgb;\n}\n\nexport function getHexColorFromTelegramColor(color: number) {\n const hex = (color < 0 ? 0xFFFFFF + color : color).toString(16);\n return '#' + (hex.length >= 6 ? hex : '0'.repeat(6 - hex.length) + hex);\n}\n\nexport function getRgbColorFromTelegramColor(color: number) {\n return hexToRgb(getHexColorFromTelegramColor(color));\n}\n\nexport function getColorsFromWallPaper(wallPaper: WallPaper) {\n return wallPaper.settings ? [\n wallPaper.settings.background_color,\n wallPaper.settings.second_background_color,\n wallPaper.settings.third_background_color,\n wallPaper.settings.fourth_background_color\n ].filter(Boolean).map(getHexColorFromTelegramColor).join(',') : '';\n}\n","export default function compareVersion(v1: string, v2: string): number {\n v1 = v1.split(' ', 1)[0];\n v2 = v2.split(' ', 1)[0];\n const s1 = v1.split('.');\n const s2 = v2.split('.');\n\n for(let i = 0; i < s1.length; ++i) {\n const v1 = +s1[i];\n const v2 = +s2[i];\n if(v1 > v2) return 1;\n else if(v1 < v2) return -1;\n }\n\n return 0;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function blurActiveElement() {\n if((document.activeElement as HTMLInputElement)?.blur) {\n (document.activeElement as HTMLInputElement).blur();\n return true;\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function cancelEvent(event?: Event) {\n event ||= window.event;\n if(event) {\n if(!event.cancelable) {\n return false;\n }\n\n // @ts-ignore\n event = event.originalEvent || event;\n\n try {\n if(event.stopPropagation) event.stopPropagation();\n if(event.preventDefault) event.preventDefault();\n event.returnValue = false;\n event.cancelBubble = true;\n } catch(err) {}\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// export function findUpClassName(el: any, className: string): T;\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\n return (el as any).closest('.' + className);\n /* if(el.classList.contains(className)) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.classList.contains(className))\n return el;\n }\n return null; */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {doubleRaf} from '../schedulers';\n\nexport default function fixSafariStickyInput(input: HTMLElement) {\n input.style.transform = 'translateY(-99999px)';\n /* input.style.position = 'fixed';\n input.style.top = '-99999px';\n input.style.left = '0'; */\n input.focus();\n\n // setTimeout(() => {\n doubleRaf().then(() => {\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n /* input.style.position = '';\n input.style.top = ''; */\n input.style.transform = '';\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n\n /* setTimeout(() => {\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\n }, 50); */\n });\n // }, 0);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport findUpClassName from './findUpClassName';\nimport fixSafariStickyInput from './fixSafariStickyInput';\n\nexport const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED;\n\nif(IS_STICKY_INPUT_BUGGED) {\n const key: 'clientY' | 'pageY' = 'clientY';\n let startY = 0;\n const o = {capture: true, passive: false};\n const onTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0];\n\n // console.log('touchmove y', touch[key], startY);\n\n const scrollable = findUpClassName(touch.target, 'scrollable-y');\n if(scrollable) {\n const y = touch[key];\n const scrolled = startY - y;\n\n /* if(y < startY) {\n startY = y;\n } */\n\n const scrollTop = scrollable.scrollTop;\n const scrollHeight = scrollable.scrollHeight;\n const clientHeight = scrollable.clientHeight;\n const nextScrollTop = scrollTop ? Math.round(scrollTop + scrollable.clientHeight + scrolled) : scrollTop + scrolled;\n // const needCancel = scrollHeight !== clientHeight ? (scrollTop && diff <= 1) || (scrollTop - diff) < 0 : true;\n const needCancel = scrollHeight === clientHeight || nextScrollTop >= scrollHeight || nextScrollTop <= 0;\n if(needCancel) {\n e.preventDefault();\n }\n\n // console.log('touchmove with scrollable', scrollTop, startY, scrolled, nextScrollTop, needCancel, e.cancelable);\n } else {\n e.preventDefault();\n\n // console.log('touchmove no scrollable', e, touch);\n }\n\n // if(e.target === document.documentElement || e.target === document.body) e.preventDefault();\n };\n\n // let el = document.createElement('div');\n // document.body.prepend(el);\n // let a = 0;\n\n // let hasFocus = false;\n let lastFocusOutTimeStamp = 0;\n document.addEventListener('focusin', (e) => {\n if(!(e.target as HTMLElement).classList.contains('is-sticky-input-bugged') || (e.timeStamp - lastFocusOutTimeStamp) < 50/* && document.activeElement === input */) {\n return;\n }\n\n // console.log('focusin', e, e.timeStamp);\n\n // hasFocus = true;\n // document.body.classList.add('is-keyboard-opened');\n\n // el.innerText = 'focusin ' + ++a;\n\n /* a < 2 && */fixSafariStickyInput(e.target as HTMLElement);\n\n document.addEventListener('touchmove', onTouchMove, o);\n document.addEventListener('touchstart', (e) => {\n if(e.touches.length > 1) return;\n const touchStart = e.touches[0];\n\n startY = touchStart[key];\n });\n }, {passive: true});\n\n document.addEventListener('focusout', (e) => {\n // console.log('focusout', e, e.timeStamp);\n document.removeEventListener('touchmove', onTouchMove, o);\n\n lastFocusOutTimeStamp = e.timeStamp;\n\n // el.innerText = 'focusout ' + ++a;\n\n // if(hasFocus) {\n // hasFocus = false;\n // document.body.classList.remove('is-keyboard-opened');\n // }\n }, {passive: true});\n\n document.addEventListener('visibilitychange', () => {\n // console.log('window visibilitychange');\n if(document.activeElement &&\n document.activeElement.classList.contains('is-sticky-input-bugged') &&\n (document.activeElement as HTMLElement).blur) {\n fixSafariStickyInput(document.activeElement as HTMLElement);\n }\n\n /* blurActiveElement();\n window.scrollTo(0, 0);\n setVH(); */\n }, {passive: true});\n}\n\nexport default function fixSafariStickyInputFocusing(input: HTMLElement) {\n if(!IS_STICKY_INPUT_BUGGED) return;\n input.classList.add('is-sticky-input-bugged');\n}\n","let callback: () => Promise;\nexport default function cacheInstallPrompt() {\n window.addEventListener('beforeinstallprompt', (deferredPrompt: any) => {\n callback = async() => {\n deferredPrompt.prompt();\n const {outcome} = await deferredPrompt.userChoice;\n const installed = outcome === 'accepted';\n if(installed) {\n callback = undefined;\n }\n };\n });\n}\n\nexport function getInstallPrompt() {\n return callback;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from '../noop';\nimport pause from '../schedulers/pause';\n\nconst texts = ['b', 'б'];\ntype FontType = 'text' | 'icons' | 'monospace';\n\nconst cache: {\n [key: string]: {\n [text: string]: Promise\n }\n} = {};\n\nconst fonts: {[type in FontType]: string} = {\n text: 'Roboto',\n icons: 'tgico',\n monospace: 'Roboto Mono'\n};\n\nexport default function loadFonts(types: {[type in FontType]?: string[] | 'all'} = {\n text: texts,\n icons: undefined,\n monospace: texts\n}): Promise {\n if(!('fonts' in document)) {\n return Promise.resolve();\n }\n\n const promises: Promise[] = [];\n for(const type in types) {\n let _texts = types[type as FontType];\n if(_texts === 'all') {\n _texts = texts;\n }\n\n const font = fonts[type as FontType];\n const weights = type === 'icons' ? [500] : [400, 500];\n for(const weight of weights) {\n const _promises = (_texts || [undefined]).map((text) => {\n const key = [weight, '1rem', font].join(' ');\n const promise = (cache[key] ??= {})[text || ''] ??= document.fonts.load(key, text);\n return promise;\n });\n promises.push(..._promises);\n }\n }\n\n return Promise.race([\n Promise.all(promises).catch(noop),\n pause(1000)\n ]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import I18n from '../../lib/langPack';\n\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment | Element) {\n setDirection(elem);\n if(typeof(html) === 'string') {\n if(!html) elem.replaceChildren();\n else elem.innerHTML = html;\n } else {\n elem.replaceChildren(html);\n }\n}\n\nexport function setDirection(elem: Element) {\n // if(!I18n.isRTL) {\n elem.setAttribute('dir', 'auto');\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport EventListenerBase from './eventListenerBase';\n\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\nconst DO_NOT_IDLE = false;\n\nexport class IdleController extends EventListenerBase<{\n change: (idle: boolean) => void\n}> {\n private _isIdle: boolean;\n\n private focusPromise: Promise;\n private focusResolve: () => void;\n\n constructor() {\n super();\n\n this._isIdle = true;\n this.focusPromise = Promise.resolve();\n this.focusResolve = () => {};\n\n window.addEventListener('blur', () => {\n this.isIdle = true;\n\n window.addEventListener('focus', () => {\n this.isIdle = false;\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.isIdle = false;\n }, {once: true, passive: true});\n\n this.addEventListener('change', (idle) => {\n if(idle) {\n this.focusPromise = new Promise((resolve) => {\n this.focusResolve = resolve;\n });\n } else {\n this.focusResolve();\n }\n });\n }\n\n public getFocusPromise() {\n return this.focusPromise;\n }\n\n public get isIdle() {\n return this._isIdle;\n }\n\n public set isIdle(value: boolean) {\n if(this._isIdle === value) {\n return;\n }\n\n if(DO_NOT_IDLE && value) {\n return;\n }\n\n this._isIdle = value;\n this.dispatchEvent('change', value);\n }\n}\n\nconst idleController = new IdleController();\nexport default idleController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from './eventListenerBase';\n\nexport class OverlayCounter extends EventListenerBase<{\n change: (isActive: boolean) => void\n}> {\n public overlaysActive = 0;\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('change', this.isOverlayActive);\n }\n}\n\nconst overlayCounter = new OverlayCounter();\nexport default overlayCounter;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's schedulers\nimport {NoneToVoidFunction} from '../types';\n\n/*\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n} */\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nexport function fastRaf(callback: NoneToVoidFunction) {\n if(!fastRafCallbacks) {\n fastRafCallbacks = [callback];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n fastRafCallbacks = undefined;\n currentCallbacks.forEach((cb) => cb());\n });\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\nexport function fastRafConventional(callback: NoneToVoidFunction) {\n if(!fastRafConventionalCallbacks) {\n fastRafConventionalCallbacks = [callback];\n\n requestAnimationFrame(() => {\n processing = true;\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\n fastRafConventionalCallbacks[i]();\n }\n\n fastRafConventionalCallbacks = undefined;\n processing = false;\n });\n } else if(processing) {\n callback();\n } else {\n fastRafConventionalCallbacks.push(callback);\n }\n}\n\nlet rafPromise: Promise;\nexport function fastRafPromise() {\n if(rafPromise) return rafPromise;\n\n rafPromise = new Promise((resolve) => fastRaf(() => resolve()));\n rafPromise.then(() => {\n rafPromise = undefined;\n });\n\n return rafPromise;\n}\n\nexport function doubleRaf() {\n return new Promise((resolve) => {\n fastRaf(() => {\n fastRaf(resolve);\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function parseUriParams(uri: string, splitted = uri.split('?')) {\n const params: any = {};\n if(!splitted[1]) return params;\n splitted[1].split('&').forEach((item) => {\n params[item.split('=')[0]] = decodeURIComponent(item.split('=')[1]);\n });\n\n return params;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppTheme} from '../config/state';\nimport type {Theme} from '../layer';\nimport type AppBackgroundTab from '../components/sidebarLeft/tabs/background';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport rootScope from '../lib/rootScope';\nimport {ColorRgb, getAccentColor, getAverageColor, getHexColorFromTelegramColor, getRgbColorFromTelegramColor, hexToRgb, hslaStringToHex, hsvToRgb, mixColors, rgbaToHexa, rgbaToHsla, rgbToHsv} from './color';\n\ntype AppColorName = 'primary-color' | 'message-out-primary-color' |\n 'surface-color' | 'danger-color' | 'primary-text-color' |\n 'secondary-text-color' | 'message-out-background-color';\ntype AppColor = {\n rgb?: boolean,\n light?: boolean,\n lightFilled?: boolean,\n dark?: boolean,\n darkRgb?: boolean,\n darkFilled?: boolean\n};\n\nconst appColorMap: {[name in AppColorName]: AppColor} = {\n 'primary-color': {\n rgb: true,\n light: true,\n lightFilled: true,\n dark: true,\n darkRgb: true\n },\n 'message-out-primary-color': {\n lightFilled: true\n },\n 'surface-color': {\n rgb: true\n },\n 'danger-color': {\n light: true,\n dark: true\n },\n 'primary-text-color': {\n rgb: true\n },\n 'secondary-text-color': {\n light: true,\n lightFilled: true\n },\n 'message-out-background-color': {\n light: true,\n lightFilled: true,\n dark: true,\n darkFilled: true\n }\n};\n\nconst colorMap: {\n [name in AppTheme['name']]?: {\n [name in AppColorName]?: string\n }\n} = {\n day: {\n 'primary-color': '#3390ec',\n 'message-out-primary-color': '#4fae4e',\n 'surface-color': '#ffffff',\n 'danger-color': '#df3f40',\n 'primary-text-color': '#000000',\n 'secondary-text-color': '#707579'\n },\n night: {\n 'primary-color': '#8774E1',\n 'message-out-primary-color': '#8774E1',\n 'surface-color': '#212121',\n 'danger-color': '#ff595a',\n 'primary-text-color': '#ffffff',\n 'secondary-text-color': '#aaaaaa'\n }\n};\n\nexport class ThemeController {\n private themeColor: string;\n private _themeColorElem: Element;\n private systemTheme: AppTheme['name'];\n public AppBackgroundTab: typeof AppBackgroundTab;\n\n constructor() {\n rootScope.addEventListener('theme_change', () => {\n this.setTheme();\n });\n\n // rootScope.addEventListener('settings_updated', ())\n }\n\n private get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n // const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n // const newTheme = this.getTheme();\n\n if(rootScope.myId) {\n rootScope.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public applyHighlightningColor() {\n let hsla: string;\n const theme = themeController.getTheme();\n if(theme.settings?.highlightningColor) {\n hsla = theme.settings.highlightningColor;\n document.documentElement.style.setProperty('--message-highlightning-color', hsla);\n } else {\n document.documentElement.style.removeProperty('--message-highlightning-color');\n }\n\n if(!IS_TOUCH_SUPPORTED && hsla) {\n themeController.themeColor = hslaStringToHex(hsla);\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n this.applyTheme(this.getTheme());\n\n this.applyHighlightningColor();\n }\n\n public async switchTheme(name: AppTheme['name']) {\n await rootScope.managers.appStateManager.setByKey('settings.theme', name);\n rootScope.dispatchEvent('theme_change');\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: AppTheme['name'] = rootScope.settings.theme === 'system' ? this.systemTheme : rootScope.settings.theme) {\n return rootScope.settings.themes.find((t) => t.name === name);\n }\n\n // theme applier\n private bindColorApplier(options: Pick[0], 'element'>) {\n const appliedColors: Set = new Set();\n return {\n applyAppColor: (_options: Omit[0], keyof typeof options>) => {\n appliedColors.add(_options.name);\n return this.applyAppColor({..._options, ...options});\n },\n finalize: () => {\n const isNight = this.isNight();\n for(const name in appColorMap) {\n if(!appliedColors.has(name as AppColorName)) {\n this.applyAppColor({\n name: name as AppColorName,\n hex: colorMap[isNight ? 'night' : 'day'][name as AppColorName]\n });\n }\n }\n }\n };\n };\n\n private applyAppColor({\n name,\n hex,\n element = document.documentElement,\n lightenAlpha = 0.08,\n darkenAlpha = lightenAlpha,\n mixColor\n }: {\n name: AppColorName,\n hex: string,\n element?: HTMLElement,\n lightenAlpha?: number\n darkenAlpha?: number,\n mixColor?: ColorRgb\n }) {\n const appColor = appColorMap[name];\n const rgb = hexToRgb(hex);\n const hsla = rgbaToHsla(...rgb);\n\n mixColor ??= hexToRgb(colorMap[themeController.isNight() ? 'night' : 'day']['surface-color']);\n const lightenedRgb = mixColors(rgb, mixColor, lightenAlpha);\n\n const darkenedHsla: typeof hsla = {\n ...hsla,\n l: hsla.l - darkenAlpha * 100\n };\n\n element.style.setProperty('--' + name, hex);\n appColor.rgb && element.style.setProperty('--' + name + '-rgb', rgb.join(','));\n appColor.light && element.style.setProperty('--light-' + name, `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, ${lightenAlpha})`);\n appColor.lightFilled && element.style.setProperty('--light-filled-' + name, rgbaToHexa(lightenedRgb));\n appColor.dark && element.style.setProperty('--dark-' + name, `hsl(${darkenedHsla.h}, ${darkenedHsla.s}%, ${darkenedHsla.l}%)`);\n // appColor.darkFilled && element.style.setProperty('--dark-' + name, `hsl(${darkenedHsla.h}, ${darkenedHsla.s}%, ${darkenedHsla.l}%)`);\n }\n\n public async applyNewTheme(theme: Theme) {\n const isNight = this.isNight();\n const currentTheme = this.getTheme();\n const themes = rootScope.settings.themes;\n const themeSettings = theme.settings.find((themeSettings) => themeSettings.base_theme._ === (isNight ? 'baseThemeNight' : 'baseThemeClassic'));\n const newAppTheme: AppTheme = {\n ...theme,\n name: currentTheme.name,\n settings: {\n ...themeSettings,\n highlightningColor: ''\n }\n };\n\n await this.AppBackgroundTab.setBackgroundDocument(themeSettings.wallpaper, newAppTheme.settings);\n themes[themes.indexOf(currentTheme)] = newAppTheme;\n await rootScope.managers.appStateManager.setByKey('settings.themes', rootScope.settings.themes);\n rootScope.dispatchEvent('theme_change');\n }\n\n public async applyTheme(theme: Theme | AppTheme, element = document.documentElement) {\n const isNight = themeController.isNight();\n const themeSettings = Array.isArray(theme.settings) ?\n theme.settings.find((settings) => settings.base_theme._ === (isNight ? 'baseThemeNight' : 'baseThemeClassic')) :\n theme.settings;\n const baseColors = colorMap[isNight ? 'night' : 'day'];\n\n let hsvTemp1 = rgbToHsv(...hexToRgb(baseColors['primary-color'])); // primary base\n let hsvTemp2 = rgbToHsv(...getRgbColorFromTelegramColor(themeSettings.accent_color)); // new primary\n\n // const newAccentRgb = changeColorAccent(\n // hsvTemp1,\n // hsvTemp2,\n // hexToRgb(baseColors['primary-color']),\n // isNight\n // // hexToRgb('#eeffde')\n // );\n // const newAccentHex = rgbaToHexa(newAccentRgb);\n\n let h = getHexColorFromTelegramColor(themeSettings.accent_color);\n if(isNight) {\n const color = hexToRgb(h);\n const mixed = mixColors(color, hexToRgb(baseColors['surface-color']), 0.84);\n h = rgbaToHexa(mixed);\n }\n // console.log(h, newAccentHex);\n // if(isNight) {\n // h = newAccentHex;\n // }\n\n const {applyAppColor, finalize} = this.bindColorApplier({element});\n\n applyAppColor({\n name: 'primary-color',\n hex: h,\n // hex: newAccentHex,\n darkenAlpha: 0.04\n });\n\n if(!themeSettings.message_colors?.length) {\n return;\n }\n\n const messageLightenAlpha = isNight ? 0.92 : 0.12;\n const baseMessageColor = hexToRgb(baseColors['message-out-primary-color']);\n hsvTemp1 = rgbToHsv(...baseMessageColor);\n const baseMessageOutBackgroundColor = mixColors(baseMessageColor, hexToRgb(baseColors['surface-color']), messageLightenAlpha);\n\n const firstColor = getRgbColorFromTelegramColor(themeSettings.message_colors[0]);\n\n let myMessagesAccent = firstColor;\n if(themeSettings.message_colors.length > 1) {\n // const w = getAccentColor(hsvTemp1, baseMessageOutBackgroundColor, myMessagesAccent);\n\n themeSettings.message_colors.slice(1).forEach((nextColor) => {\n myMessagesAccent = getAverageColor(myMessagesAccent, getRgbColorFromTelegramColor(nextColor));\n });\n\n myMessagesAccent = getAccentColor(hsvTemp1, baseMessageOutBackgroundColor, myMessagesAccent);\n\n // console.log('www', rgbaToHexa(w), rgbaToHexa(myMessagesAccent));\n }\n\n const o = myMessagesAccent;\n hsvTemp2 = rgbToHsv(...o);\n\n // const c = changeColorAccent(\n // hsvTemp1,\n // hsvTemp2,\n // baseMessageOutBackgroundColor\n // );\n\n // console.log(o, c, rgbaToHexa(o), rgbaToHexa(c));\n\n const accentColor2 = themeSettings.outbox_accent_color !== undefined && rgbToHsv(...getRgbColorFromTelegramColor(themeSettings.outbox_accent_color));\n\n const newMessageOutBackgroundColor = mixColors(myMessagesAccent, hexToRgb(baseColors['surface-color']), messageLightenAlpha);\n\n applyAppColor({\n name: 'message-out-background-color',\n hex: rgbaToHexa(newMessageOutBackgroundColor),\n lightenAlpha: messageLightenAlpha\n });\n\n applyAppColor({\n name: 'message-out-primary-color',\n hex: isNight ? '#ffffff' : rgbaToHexa(accentColor2 ? hsvToRgb(...accentColor2) : myMessagesAccent),\n mixColor: newMessageOutBackgroundColor\n });\n\n // if(accentColor2) {\n // console.log(rgbaToHexa(myMessagesAccent), rgbaToHexa(hsvToRgb(...accentColor2)));\n // }\n\n finalize();\n }\n}\n\nconst themeController = new ThemeController();\nexport default themeController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function setWorkerProxy() {\n // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n let url = args[0] + '';\n if(url.indexOf('blob:') !== 0) {\n url += location.search;\n }\n\n return new target(url);\n }\n };\n\n [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean).forEach((w) => {\n window[w.name as any] = new Proxy(w, workerHandler);\n });\n}\n\nsetWorkerProxy();\n","const IS_INSTALL_PROMPT_SUPPORTED = 'onbeforeinstallprompt' in window;\nexport default IS_INSTALL_PROMPT_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from './config/app';\nimport blurActiveElement from './helpers/dom/blurActiveElement';\nimport cancelEvent from './helpers/dom/cancelEvent';\nimport {IS_STICKY_INPUT_BUGGED} from './helpers/dom/fixSafariStickyInputFocusing';\nimport loadFonts from './helpers/dom/loadFonts';\nimport IS_EMOJI_SUPPORTED from './environment/emojiSupport';\nimport {IS_ANDROID, IS_APPLE, IS_APPLE_MOBILE, IS_FIREFOX, IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport pause from './helpers/schedulers/pause';\nimport setWorkerProxy from './helpers/setWorkerProxy';\nimport toggleAttributePolyfill from './helpers/dom/toggleAttributePolyfill';\nimport rootScope from './lib/rootScope';\nimport IS_TOUCH_SUPPORTED from './environment/touchSupport';\nimport I18n from './lib/langPack';\nimport './helpers/peerIdPolyfill';\nimport './lib/polyfill';\nimport apiManagerProxy from './lib/mtproto/mtprotoworker';\nimport getProxiedManagers from './lib/appManagers/getProxiedManagers';\nimport themeController from './helpers/themeController';\nimport overlayCounter from './helpers/overlayCounter';\nimport singleInstance from './lib/mtproto/singleInstance';\nimport parseUriParams from './helpers/string/parseUriParams';\nimport Modes from './config/modes';\nimport {AuthState} from './types';\nimport {IS_BETA} from './config/debug';\nimport IS_INSTALL_PROMPT_SUPPORTED from './environment/installPrompt';\nimport cacheInstallPrompt from './helpers/dom/installPrompt';\n// import appNavigationController from './components/appNavigationController';\n\ndocument.addEventListener('DOMContentLoaded', async() => {\n toggleAttributePolyfill();\n\n // polyfill for replaceChildren\n if((Node as any).prototype.replaceChildren === undefined) {\n (Node as any).prototype.replaceChildren = function(...nodes: any[]) {\n this.textContent = '';\n // while(this.lastChild) {\n // this.removeChild(this.lastChild);\n // }\n if(nodes) {\n this.append(...nodes);\n }\n }\n }\n\n rootScope.managers = getProxiedManagers();\n\n const manifest = document.getElementById('manifest') as HTMLLinkElement;\n manifest.href = `site${IS_APPLE && !IS_APPLE_MOBILE ? '_apple' : ''}.webmanifest?v=jw3mK7G9Aq`;\n\n singleInstance.start();\n\n // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n const vh = (setViewportVH && !overlayCounter.isOverlayActive ? (w as VisualViewport).height || (w as Window).innerHeight : window.innerHeight) * 0.01;\n if(lastVH === vh) {\n return;\n } else if(IS_TOUCH_SUPPORTED && lastVH < vh && (vh - lastVH) > 1) {\n blurActiveElement(); // (Android) fix blurring inputs when keyboard is being closed (e.g. closing keyboard by back arrow and touching a bubble)\n }\n\n lastVH = vh;\n\n // const vh = document.documentElement.scrollHeight * 0.01;\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n // console.log('setVH', vh, setViewportVH ? w : window);\n\n /* if(setViewportVH && userAgent.isSafari && touchSupport.isTouchSupported && document.activeElement && (document.activeElement as HTMLElement).blur) {\n const rect = document.activeElement.getBoundingClientRect();\n if(rect.top < 0 || rect.bottom >= (w as any).height) {\n fastSmoothScroll(findUpClassName(document.activeElement, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'center', 4, undefined, FocusDirection.Static);\n }\n } */\n };\n\n setWorkerProxy;\n\n // const [_, touchSupport, userAgent, _rootScope, _appStateManager, _I18n, __/* , ___ */] = await Promise.all([\n // import('./lib/polyfill'),\n // import('./environment/touchSupport'),\n // import('./environment/userAgent'),\n // import('./lib/rootScope'),\n // import('./lib/appManagers/appStateManager'),\n // import('./lib/langPack'),\n // import('./helpers/peerIdPolyfill'),\n // // import('./helpers/cacheFunctionPolyfill')\n // ]);\n\n /* const {IS_TOUCH_SUPPORTED} = touchSupport;\n const {IS_FIREFOX, IS_MOBILE, IS_APPLE, IS_SAFARI, IS_APPLE_MOBILE, IS_ANDROID} = userAgent;\n const rootScope = _rootScope.default;\n const appStateManager = _appStateManager.default;\n const I18n = _I18n.default; */\n\n window.addEventListener('resize', setVH);\n setVH();\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !overlayCounter.isOverlayActive;\n setVH();\n\n if(w !== window) {\n if(setViewportVH) {\n window.removeEventListener('resize', setVH);\n w.addEventListener('resize', setVH);\n } else {\n w.removeEventListener('resize', setVH);\n window.addEventListener('resize', setVH);\n }\n }\n };\n\n let tabId: number;\n (window as any).onImTabChange = (id: number) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n\n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n };\n\n overlayCounter.addEventListener('change', () => {\n toggleResizeMode();\n });\n }\n\n if(IS_FIREFOX && !IS_EMOJI_SUPPORTED) {\n document.addEventListener('dragstart', (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'IMG' && target.classList.contains('emoji')) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n if(IS_EMOJI_SUPPORTED) {\n document.documentElement.classList.add('native-emoji');\n }\n\n // prevent firefox image dragging\n document.addEventListener('dragstart', (e) => {\n if((e.target as HTMLElement)?.tagName === 'IMG') {\n e.preventDefault();\n return false;\n }\n });\n\n // restrict contextmenu on images (e.g. webp stickers)\n document.addEventListener('contextmenu', (e) => {\n if((e.target as HTMLElement).tagName === 'IMG' && !(window as any).appMediaViewer) {\n cancelEvent(e);\n }\n });\n\n if(IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox', 'no-backdrop');\n }\n\n if(IS_MOBILE) {\n document.documentElement.classList.add('is-mobile');\n }\n\n if(IS_APPLE) {\n if(IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n\n // document.documentElement.classList.add('emoji-supported');\n\n if(IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(IS_ANDROID) {\n document.documentElement.classList.add('is-android');\n\n /* document.addEventListener('focusin', (e) => {\n hasFocus = true;\n focusTime = Date.now();\n }, {passive: true});\n\n document.addEventListener('focusout', () => {\n hasFocus = false;\n }, {passive: true}); */\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n document.documentElement.classList.add('no-touch');\n } else {\n document.documentElement.classList.add('is-touch');\n /* document.addEventListener('touchmove', (event: any) => {\n event = event.originalEvent || event;\n if(event.scale && event.scale !== 1) {\n event.preventDefault();\n }\n }, {capture: true, passive: false}); */\n }\n\n if(IS_INSTALL_PROMPT_SUPPORTED) {\n cacheInstallPrompt();\n }\n\n const perf = performance.now();\n\n // await pause(1000000);\n\n const langPromise = I18n.getCacheLangPack();\n\n const [stateResult, langPack] = await Promise.all([\n // loadState(),\n apiManagerProxy.sendState().then(([stateResult]) => stateResult),\n langPromise\n ]);\n I18n.setTimeFormat(stateResult.state.settings.timeFormat);\n\n rootScope.managers.rootScope.getPremium().then((isPremium) => {\n rootScope.premium = isPremium;\n });\n\n themeController.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.getLangPack(langPack.lang_code);\n }\n\n /**\n * won't fire if font is loaded too fast\n */\n function fadeInWhenFontsReady(elem: HTMLElement, promise: Promise) {\n elem.style.opacity = '0';\n\n promise.then(() => {\n window.requestAnimationFrame(() => {\n elem.style.opacity = '';\n });\n });\n }\n\n console.log('got state, time:', performance.now() - perf);\n\n if(langPack.lang_code === 'ar' && IS_BETA && false) {\n document.body.classList.add('is-rtl');\n document.documentElement.dir = 'rtl';\n document.documentElement.lang = langPack.lang_code;\n I18n.setRTL(true);\n } else {\n document.documentElement.dir = 'ltr';\n }\n\n let authState = stateResult.state.authState;\n\n const hash = location.hash;\n const splitted = hash.split('?');\n const params = parseUriParams(hash, splitted);\n if(params.tgWebAuthToken && authState._ !== 'authStateSignedIn') {\n const data: AuthState.signImport['data'] = {\n token: params.tgWebAuthToken,\n dcId: +params.tgWebAuthDcId,\n userId: params.tgWebAuthUserId.toUserId(),\n isTest: params.tgWebAuthTest !== undefined && !!+params.tgWebAuthTest,\n tgAddr: params.tgaddr\n };\n\n if(data.isTest !== Modes.test) {\n const urlSearchParams = new URLSearchParams(location.search);\n if(+params.tgWebAuthTest) {\n urlSearchParams.set('test', '1');\n } else {\n urlSearchParams.delete('test');\n }\n\n location.search = urlSearchParams.toString();\n return;\n }\n\n rootScope.managers.appStateManager.pushToState('authState', authState = {_: 'authStateSignImport', data});\n\n // appNavigationController.overrideHash('?tgaddr=' + encodeURIComponent(params.tgaddr));\n }\n\n if(authState._ !== 'authStateSignedIn'/* || 1 === 1 */) {\n console.log('Will mount auth page:', authState._, Date.now() / 1000);\n\n const el = document.getElementById('auth-pages');\n let scrollable: HTMLElement;\n if(el) {\n scrollable = el.querySelector('.scrollable') as HTMLElement;\n if((!IS_TOUCH_SUPPORTED || IS_MOBILE_SAFARI)) {\n scrollable.classList.add('no-scrollbar');\n }\n\n // * don't remove this line\n scrollable.style.opacity = '0';\n\n const placeholder = document.createElement('div');\n placeholder.classList.add('auth-placeholder');\n\n scrollable.prepend(placeholder);\n scrollable.append(placeholder.cloneNode());\n }\n\n try {\n await Promise.all([\n import('./lib/mtproto/telegramMeWebManager'),\n import('./lib/mtproto/webPushApiManager')\n ]).then(([meModule, pushModule]) => {\n meModule.default.setAuthorized(false);\n pushModule.default.forceUnsubscribe();\n });\n } catch(err) {\n\n }\n\n let pagePromise: Promise;\n // langPromise.then(async() => {\n switch(authState._) {\n case 'authStateSignIn':\n pagePromise = (await import('./pages/pageSignIn')).default.mount();\n break;\n case 'authStateSignQr':\n pagePromise = (await import('./pages/pageSignQR')).default.mount();\n break;\n case 'authStateAuthCode':\n pagePromise = (await import('./pages/pageAuthCode')).default.mount(authState.sentCode);\n break;\n case 'authStatePassword':\n pagePromise = (await import('./pages/pagePassword')).default.mount();\n break;\n case 'authStateSignUp':\n pagePromise = (await import('./pages/pageSignUp')).default.mount(authState.authCode);\n break;\n case 'authStateSignImport':\n pagePromise = (await import('./pages/pageSignImport')).default.mount(authState.data);\n break;\n }\n // });\n\n if(scrollable) {\n // wait for text appear\n if(pagePromise) {\n await pagePromise;\n }\n\n const promise = 'fonts' in document ?\n Promise.race([\n pause(1000),\n document.fonts.ready\n ]) :\n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\n }\n\n /* setTimeout(async() => {\n (await import('./pages/pageAuthCode')).default.mount({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"\",\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"\"\n });\n\n (await import('./pages/pageSignQR')).default.mount();\n\n (await import('./pages/pagePassword')).default.mount();\n\n (await import('./pages/pageSignUp')).default.mount({\n \"phone_code_hash\": \"\",\n \"phone_number\": \"\"\n });\n }, 500); */\n } else {\n console.log('Will mount IM page:', Date.now() / 1000);\n fadeInWhenFontsReady(document.getElementById('main-columns'), loadFonts());\n (await import('./pages/pageIm')).default.mount();\n }\n});\n","export default function toggleAttributePolyfill() {\n if(!Element.prototype.toggleAttribute) {\n Element.prototype.toggleAttribute = function(name, force) {\n if(force !== void 0) force = !!force;\n\n if(this.hasAttribute(name)) {\n if(force) return true;\n\n this.removeAttribute(name);\n return false;\n }\n if(force === false) return false;\n\n this.setAttribute(name, '');\n return true;\n };\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport class AppRuntimeManager {\n public reload() {\n try {\n location.reload();\n } catch(e) {};\n\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\n // chrome.runtime.reload();\n // }\n }\n\n public close() {\n try {\n window.close();\n } catch(e) {}\n }\n\n /**\n * Better to call from event\n */\n public focus() {\n // // @ts-ignore\n // if(window.navigator.mozApps && document.hidden) {\n // // Get app instance and launch it to bring app to foreground\n // // @ts-ignore\n // window.navigator.mozApps.getSelf().onsuccess = function() {\n // this.result.launch();\n // };\n // } else {\n // // @ts-ignore\n // if(window.chrome && chrome.app && chrome.app.window) {\n // // @ts-ignore\n // chrome.app.window.current().focus();\n // }\n\n window.focus();\n // }\n }\n}\n\nconst appRuntimeManager = new AppRuntimeManager();\nexport default appRuntimeManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type createManagers from './createManagers';\nimport {ModifyFunctionsToAsync} from '../../types';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport noop from '../../helpers/noop';\nimport dT from '../../helpers/dT';\nimport DEBUG from '../../config/debug';\n\n// let stats: {\n// [manager: string]: {\n// [method: string]: {\n// times: number[],\n// byArgs: {\n// [args: string]: number[]\n// }\n// }\n// }\n// } = {};\n\n// let sentCount = 0;\n// let sentMethods: {[key: string]: number} = {};\n// let sentMethods2: {[key: string]: number} = {};\n// function collectStats(manager: string, method: string, args: any[], promise: Promise) {\n// ++sentCount;\n\n// const key = [manager, method].join('-');\n// if(!sentMethods[key]) sentMethods[key] = 0;\n// ++sentMethods[key];\n\n// const key2 = [('00000' + sentCount).slice(-5), key].join('-');\n\n// let byManager = stats[manager] ??= {};\n// let byMethod = byManager[method] ??= {times: [], byArgs: {}};\n\n// const perf = performance.now();\n// promise.catch(noop).finally(() => {\n// const time = performance.now() - perf;\n// byMethod.times.push(time);\n\n// sentMethods2[key2] = time;\n\n// try {\n// const argsString = JSON.stringify(args);\n// byMethod.byArgs[argsString].push(time);\n// } catch(err) {}\n// });\n// }\n\n// setInterval(() => {\n// // console.log(dT(), '[PROXY] stats', stats, sentCount, sentMethods, sentMethods2);\n// sentCount = 0;\n// sentMethods = {};\n// sentMethods2 = {};\n// }, 2000);\n\nconst DEBUG_MANAGER_REQUESTS: {[managerName: string]: Set} = {};\nif(DEBUG) {\n (window as any).DEBUG_MANAGER_REQUESTS = DEBUG_MANAGER_REQUESTS;\n}\n\nfunction createProxy(/* source: T, */name: string, ack?: boolean) {\n const proxy = new Proxy({}, {\n get: (target, p, receiver) => {\n // console.log('get', target, p, receiver);\n // @ts-ignore\n // const value = source[p];\n // if(typeof(value) !== 'function') {\n // return value;\n // }\n\n return (...args: any[]) => {\n const promise = apiManagerProxy.invoke('manager', {\n name,\n method: p as string,\n args\n }, ack as any);\n\n if(DEBUG) {\n if(DEBUG_MANAGER_REQUESTS[name]?.has(p as any)) {\n console.warn('manager request', name, p, args);\n }\n }\n\n // collectStats(name, p as string, args, promise);\n\n return promise;\n\n // @ts-ignore\n // return Promise.resolve(value.call(source, ...args));\n };\n }\n });\n\n return proxy;\n}\n\ntype AA = {\n [key in keyof T]: T[key] extends (...args: infer A) => infer R ? (...args: A) => Promise>> : never\n};\n\ntype T = Awaited>;\ntype ProxiedManagers = {\n [name in keyof T]?: ModifyFunctionsToAsync;\n} & {\n acknowledged?: {\n [name in keyof T]?: AA;\n }\n};\n\nfunction createProxyProxy(proxied: any, ack?: boolean) {\n return new Proxy(proxied, {\n get: (target, p, receiver) => {\n // @ts-ignore\n return target[p] ??= createProxy(p as string, ack);\n }\n });\n}\n\nlet proxied: ProxiedManagers;\nexport default function getProxiedManagers() {\n if(proxied) {\n return proxied;\n }\n\n proxied = createProxyProxy({}, false);\n proxied.acknowledged = createProxyProxy({}, true);\n return proxied;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\nimport {setDirection} from '../helpers/dom/setInnerHTML';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n 'messageActionBotAllowed': 'Chat.Service.BotPermissionAllowed'\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n export let isRTL = false;\n\n export function setRTL(rtl: boolean) {\n isRTL = rtl;\n }\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n rootScope.dispatchEvent('language_change', currentLangCode);\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n out.push(string.slice(lastIndex, offset));\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n out.push(a);\n } else if(args) {\n pushNextArgument(out, args, indexHolder);\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map((item) => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.textContent = '';\n this.element.append(...format(this.key, false, this.args) as any);\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n }\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n setDirection(this.element);\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n const arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n return arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n const joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter} from '../storages/filters';\n\n/**\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\n */\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\nexport type REAL_FOLDER_ID = 0 | 1;\n\nexport const NULL_PEER_ID: PeerId = 0;\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\nexport const SERVICE_PEER_ID: PeerId = 777000;\nexport const MUTE_UNTIL = 0x7FFFFFFF;\nexport const BOT_START_PARAM = '';\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\nexport const THUMB_TYPE_FULL = '';\nexport const TOPIC_COLORS = [0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, 0xFB6F5F];\nexport const ATTACH_MENU_BOT_ICON_NAME = 'default_static';\nexport const GENERAL_TOPIC_ID = 4295032831;\nexport const T_ME_PREFIXES = new Set(['web', 'k', 'z']);\n\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\n","import IS_CALL_SUPPORTED from './callSupport';\nimport CAN_USE_TRANSFERABLES from './canUseTransferables';\nimport IS_CANVAS_FILTER_SUPPORTED from './canvasFilterSupport';\nimport IS_EMOJI_SUPPORTED from './emojiSupport';\nimport IS_GEOLOCATION_SUPPORTED from './geolocationSupport';\nimport IS_GROUP_CALL_SUPPORTED from './groupCallSupport';\nimport IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport MEDIA_MIME_TYPES_SUPPORTED from './mediaMimeTypesSupport';\nimport IS_MOV_SUPPORTED from './movSupport';\nimport IS_PARALLAX_SUPPORTED from './parallaxSupport';\nimport IS_SCREEN_SHARING_SUPPORTED from './screenSharingSupport';\nimport IS_TOUCH_SUPPORTED from './touchSupport';\nimport IS_VIBRATE_SUPPORTED from './vibrateSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\nimport IS_WEBM_SUPPORTED from './webmSupport';\nimport IS_WEBP_SUPPORTED from './webpSupport';\nimport IS_WEBRTC_SUPPORTED from './webrtcSupport';\nimport * as userAgent from './userAgent';\nimport IS_OPUS_SUPPORTED from './opusSupport';\nimport IS_SHARED_WORKER_SUPPORTED from './sharedWorkerSupport';\nimport IS_APPLE_MX from './appleMx';\n\nconst ENVIRONMENT = {\n CAN_USE_TRANSFERABLES,\n IS_APPLE_MX,\n IS_CALL_SUPPORTED,\n IS_CANVAS_FILTER_SUPPORTED,\n IS_EMOJI_SUPPORTED,\n IS_GEOLOCATION_SUPPORTED,\n IS_GROUP_CALL_SUPPORTED,\n IS_MOV_SUPPORTED,\n IS_PARALLAX_SUPPORTED,\n IS_SCREEN_SHARING_SUPPORTED,\n IS_TOUCH_SUPPORTED,\n IS_VIBRATE_SUPPORTED,\n IS_OPUS_SUPPORTED,\n IS_SHARED_WORKER_SUPPORTED,\n IS_WEBM_SUPPORTED,\n IS_WEBP_SUPPORTED,\n IS_WEBRTC_SUPPORTED,\n IMAGE_MIME_TYPES_SUPPORTED,\n MEDIA_MIME_TYPES_SUPPORTED,\n VIDEO_MIME_TYPES_SUPPORTED,\n ...userAgent\n};\n\nexport default ENVIRONMENT;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../../../config/app';\nimport DEBUG from '../../../../config/debug';\nimport {AutoDownloadPeerTypeSettings, State, STATE_INIT, Background, AppTheme} from '../../../../config/state';\nimport compareVersion from '../../../../helpers/compareVersion';\nimport copy from '../../../../helpers/object/copy';\nimport validateInitObject from '../../../../helpers/object/validateInitObject';\nimport {UserAuth} from '../../../mtproto/mtproto_config';\nimport rootScope from '../../../rootScope';\nimport stateStorage from '../../../stateStorage';\nimport sessionStorage from '../../../sessionStorage';\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\n// import RESET_STORAGES_PROMISE from \"../storages/resetStoragesPromise\";\nimport {StoragesResults} from '../storages/loadStorages';\nimport {logger} from '../../../logger';\nimport {WallPaper} from '../../../../layer';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n// const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\n\nconst STATE_VERSION = STATE_INIT.version;\nconst BUILD = STATE_INIT.build;\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS: Array = [\n 'contactsListCachedTime',\n 'stateCreatedTime',\n 'maxSeenMsgId',\n 'filtersArr'\n];\n\n// const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nasync function loadStateInner() {\n const log = logger('STATE-LOADER');\n\n const totalPerf = performance.now();\n const recordPromise = recordPromiseBound(log);\n\n const promises = ALL_KEYS.map((key) => recordPromise(stateStorage.get(key), 'state ' + key))\n .concat(\n recordPromise(sessionStorage.get('user_auth'), 'auth'),\n recordPromise(sessionStorage.get('state_id'), 'auth'),\n recordPromise(sessionStorage.get('k_build'), 'auth')\n )\n .concat(recordPromise(stateStorage.get('user_auth'), 'old auth')); // support old webk format\n\n const arr = await Promise.all(promises);\n log.warn('promises', performance.now() - totalPerf);\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n\n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n\n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n // const pushed: {key: keyof State, value: State[keyof State]}[] = [];\n const pushedKeys: (keyof State)[] = [];\n const pushToState = (key: T, value: State[T]) => {\n // appStateManager.pushToState(key, value);\n state[key] = value;\n // pushed.push({key, value});\n pushedKeys.push(key);\n };\n\n const replaceState = (_state: State) => {\n // pushed.length = 0;\n pushedKeys.length = 0;\n state = _state;\n pushedKeys.push(...Object.keys(state) as any as typeof pushedKeys);\n // state = appStateManager.setState(_state);\n // appStateManager.storage.set(state);\n };\n\n // let state: State = appStateManager.setState({} as any);\n let state: State = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const sessionBuild = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map((key) => stateStorage.get(key as any)));\n keys.push('user_auth');\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\n\n const obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n\n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ?\n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} :\n auth); // * support old version\n }\n\n const resetStorages: Set = new Set();\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n\n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n\n state = copy(STATE_INIT);\n\n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n const r: {[k in keyof StoragesResults]: number} = {\n chats: 1,\n dialogs: 1,\n users: 1\n };\n for(const key in r) {\n resetStorages.add(key as keyof StoragesResults);\n // this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n replaceState(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach((key) => {\n pushToState(key, copy(STATE_INIT[key]));\n\n // const s = appStateManager.storagesResults[key as keyof AppStateManager['storagesResults']];\n // if(s?.length) {\n // appStateManager.resetStorages.add(key as keyof AppStateManager['storagesResults']);\n // s.length = 0;\n // }\n });\n };\n\n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n\n // state = this.state = new Proxy(state, getHandler());\n\n // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const,\n 'private' as const,\n 'groups' as const,\n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach((mediaType) => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach((peerType) => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach((peerType) => {\n delete autoDownloadSettings[peerType];\n });\n\n pushToState('settings', state.settings);\n }\n\n const SKIP_VALIDATING_PATHS: Set = new Set([\n 'settings.themes'\n ]);\n validateInitObject(STATE_INIT, state, (missingKey) => {\n pushToState(missingKey as keyof State, state[missingKey as keyof State]);\n }, undefined, SKIP_VALIDATING_PATHS);\n\n let newVersion: string, oldVersion: string;\n if(state.version !== STATE_VERSION || state.build !== BUILD/* || true */) {\n // reset filters and dialogs if version is older\n if(/* compareVersion(state.version, '0.8.7') === -1 || state.build < 179 || */state.build < 217) {\n state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n state.pinnedOrders = copy(STATE_INIT.pinnedOrders);\n state.filtersArr = copy(STATE_INIT.filtersArr);\n\n resetStorages.add('dialogs');\n }\n\n if(compareVersion(state.version, '1.7.1') === -1) {\n let migrated = false;\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n migrated = true;\n state.settings.theme = copy(STATE_INIT.settings.theme);\n state.settings.themes = copy(STATE_INIT.settings.themes);\n } else if(compareVersion(state.version, '1.7.1') === -1) { // * migrate backgrounds (January 25th, 2023; to version 1.7.1)\n migrated = true;\n const oldThemes = state.settings.themes as any as Array<{\n name: AppTheme['name'],\n background: Background\n }>;\n\n state.settings.themes = copy(STATE_INIT.settings.themes);\n\n try {\n oldThemes.forEach((oldTheme) => {\n const oldBackground = oldTheme.background;\n if(!oldBackground) {\n return;\n }\n\n const newTheme = state.settings.themes.find((t) => t.name === oldTheme.name);\n newTheme.settings.highlightningColor = oldBackground.highlightningColor;\n\n const getColorFromHex = (hex: string) => hex && parseInt(hex.slice(1), 16);\n\n const colors = (oldBackground.color || '').split(',').map(getColorFromHex);\n\n if(oldBackground.color && !oldBackground.slug) {\n newTheme.settings.wallpaper = {\n _: 'wallPaperNoFile',\n id: 0,\n pFlags: {},\n settings: {\n _: 'wallPaperSettings',\n pFlags: {}\n }\n };\n } else {\n const wallPaper: WallPaper.wallPaper = {\n _: 'wallPaper',\n id: 0,\n access_hash: 0,\n slug: oldBackground.slug,\n document: {} as any,\n pFlags: {},\n settings: {\n _: 'wallPaperSettings',\n pFlags: {}\n }\n };\n\n const wallPaperSettings = wallPaper.settings;\n newTheme.settings.wallpaper = wallPaper;\n if(oldBackground.slug && !oldBackground.color) {\n wallPaperSettings.pFlags.blur = oldBackground.blur || undefined;\n } else if(oldBackground.intensity) {\n wallPaperSettings.intensity = oldBackground.intensity;\n wallPaper.pFlags.pattern = true;\n wallPaper.pFlags.dark = oldBackground.intensity < 0 || undefined;\n }\n }\n\n if(colors.length) {\n const wallPaperSettings = newTheme.settings.wallpaper.settings;\n wallPaperSettings.background_color = colors[0];\n wallPaperSettings.second_background_color = colors[1];\n wallPaperSettings.third_background_color = colors[2];\n wallPaperSettings.fourth_background_color = colors[3];\n }\n });\n } catch(err) {\n console.error('migrating themes error', err);\n }\n }\n\n if(migrated) {\n pushToState('settings', state.settings);\n }\n }\n\n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n newVersion = STATE_VERSION;\n oldVersion = state.version;\n }\n\n pushToState('version', STATE_VERSION);\n pushToState('build', BUILD);\n }\n\n if(sessionBuild !== BUILD && (!sessionBuild || sessionBuild < BUILD)) {\n sessionStorage.set({k_build: BUILD});\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n log('state res', state, copy(state));\n }\n\n // return resolve();\n\n log.warn('total', performance.now() - totalPerf);\n\n // RESET_STORAGES_PROMISE.resolve(appStateManager.resetStorages);\n\n return {state, resetStorages, newVersion, oldVersion, pushedKeys};\n}\n\nlet promise: ReturnType;\nexport default function loadState() {\n return promise ??= loadStateInner();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Awaited} from '../../types';\nimport type {CacheStorageDbName} from '../files/cacheStorage';\nimport type {State} from '../../config/state';\nimport type {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport {CryptoMethods} from '../crypto/crypto_methods';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport pause from '../../helpers/schedulers/pause';\nimport ENVIRONMENT from '../../environment';\nimport loadState from '../appManagers/utils/state/loadState';\nimport opusDecodeController from '../opusDecodeController';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport SuperMessagePort from './superMessagePort';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport idleController from '../../helpers/idleController';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport App from '../../config/app';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\n\nexport type Mirrors = {\n state: State\n};\n\nexport type MirrorTaskPayload = {\n name: T,\n key?: K,\n value: any\n};\n\nexport type NotificationBuildTaskPayload = {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n};\n\nexport type TabState = {\n chatPeerIds: PeerId[],\n idleStartTime: number,\n};\n\nclass ApiManagerProxy extends MTProtoMessagePort {\n // private worker: /* Window */Worker;\n // private sockets: Map = new Map();\n private mirrors: Mirrors;\n\n public newVersion: string;\n public oldVersion: string;\n\n private tabState: TabState;\n\n public share: ShareData;\n\n public serviceMessagePort: ServiceMessagePort;\n private lastServiceWorker: ServiceWorker;\n\n private pingServiceWorkerPromise: CancellablePromise;\n\n constructor() {\n super();\n\n this.mirrors = {} as any;\n this.tabState = {\n chatPeerIds: [],\n idleStartTime: 0\n };\n\n this.log('constructor');\n\n \n this.registerWorker();\n \n\n this.registerServiceWorker();\n this.registerCryptoWorker();\n\n // const perf = performance.now();\n this.addMultipleEventsListeners({\n convertWebp: ({fileName, bytes}) => {\n return webpWorkerController.convert(fileName, bytes);\n },\n\n convertOpus: ({fileName, bytes}) => {\n return opusDecodeController.pushDecodeTask(bytes, false).then((result) => result.bytes);\n },\n\n event: ({name, args}) => {\n // @ts-ignore\n rootScope.dispatchEventSingle(name, ...args);\n },\n\n localStorageProxy: (payload) => {\n const storageTask = payload;\n return (sessionStorage[storageTask.type] as any)(...storageTask.args);\n },\n\n mirror: this.onMirrorTask\n\n // hello: () => {\n // this.log.error('time hello', performance.now() - perf);\n // }\n });\n\n // this.addTaskListener('socketProxy', (task) => {\n // const socketTask = task.payload;\n // const id = socketTask.id;\n // //console.log('socketProxy', socketTask, id);\n\n // if(socketTask.type === 'send') {\n // const socket = this.sockets.get(id);\n // socket.send(socketTask.payload);\n // } else if(socketTask.type === 'close') { // will remove from map in onClose\n // const socket = this.sockets.get(id);\n // socket.close();\n // } else if(socketTask.type === 'setup') {\n // const socket = new Socket(socketTask.payload.dcId, socketTask.payload.url, socketTask.payload.logSuffix);\n\n // const onOpen = () => {\n // //console.log('socketProxy onOpen');\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'open',\n // id\n // }\n // });\n // };\n // const onClose = () => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'close',\n // id\n // }\n // });\n\n // socket.removeEventListener('open', onOpen);\n // socket.removeEventListener('close', onClose);\n // socket.removeEventListener('message', onMessage);\n // this.sockets.delete(id);\n // };\n // const onMessage = (buffer: ArrayBuffer) => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'message',\n // id,\n // payload: buffer\n // }\n // });\n // };\n\n // socket.addEventListener('open', onOpen);\n // socket.addEventListener('close', onClose);\n // socket.addEventListener('message', onMessage);\n // this.sockets.set(id, socket);\n // }\n // });\n\n rootScope.addEventListener('language_change', (language) => {\n rootScope.managers.networkerFactory.setLanguage(language);\n });\n\n window.addEventListener('online', () => {\n rootScope.managers.networkerFactory.forceReconnectTimeout();\n });\n\n rootScope.addEventListener('logging_out', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n toggleStorages(false, true),\n sessionStorage.clear(),\n Promise.race([\n telegramMeWebManager.setAuthorized(false),\n pause(3000)\n ]),\n webPushApiManager.forceUnsubscribe(),\n Promise.all(toClear.map((cacheName) => caches.delete(cacheName)))\n ]).finally(() => {\n appRuntimeManager.reload();\n });\n });\n\n idleController.addEventListener('change', (idle) => {\n this.updateTabStateIdle(idle);\n });\n this.updateTabStateIdle(idleController.isIdle);\n\n this.log('Passing environment:', ENVIRONMENT);\n this.invoke('environment', ENVIRONMENT);\n // this.sendState();\n }\n\n public pingServiceWorkerWithIframe() {\n if(this.pingServiceWorkerPromise) {\n return this.pingServiceWorkerPromise;\n }\n\n const promise = this.pingServiceWorkerPromise = deferredPromise();\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n const onLoad = () => {\n setTimeout(() => { // ping once in 10 seconds\n this.pingServiceWorkerPromise = undefined;\n }, 10e3);\n\n clearTimeout(timeout);\n iframe.remove();\n iframe.removeEventListener('load', onLoad);\n iframe.removeEventListener('error', onLoad);\n promise.resolve();\n };\n iframe.addEventListener('load', onLoad);\n iframe.addEventListener('error', onLoad);\n iframe.src = 'ping/' + (Math.random() * 0xFFFFFFFF | 0);\n document.body.append(iframe);\n\n const timeout = window.setTimeout(onLoad, 1e3);\n return promise;\n }\n\n private attachServiceWorker(serviceWorker: ServiceWorker) {\n this.lastServiceWorker && this.serviceMessagePort.detachPort(this.lastServiceWorker);\n this.serviceMessagePort.attachSendPort(this.lastServiceWorker = serviceWorker);\n this.serviceMessagePort.invokeVoid('hello', undefined);\n }\n\n private _registerServiceWorker() {\n navigator.serviceWorker.register(\n /* webpackChunkName: \"sw\" */\n new URL('../serviceWorker/index.service', import.meta.url),\n {scope: './'}\n ).then((registration) => {\n this.log('SW registered', registration);\n\n // ! doubtful fix for hard refresh\n if(registration.active && !navigator.serviceWorker.controller) {\n return registration.unregister().then(() => {\n window.location.reload();\n });\n }\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n const controller = navigator.serviceWorker.controller || registration.installing || registration.waiting || registration.active;\n this.attachServiceWorker(controller);\n\n \n \n \n }, (err) => {\n this.log.error('SW registration failed!', err);\n\n this.invokeVoid('serviceWorkerOnline', false);\n });\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n\n this.serviceMessagePort = new ServiceMessagePort();\n\n // this.addMultipleEventsListeners({\n // hello: () => {\n // // this.serviceMessagePort.invokeVoid('port', undefined);\n // }\n // });\n\n // ! I hate webpack - it won't load it by using worker.register, only navigator.serviceWorker will do it.\n const worker = navigator.serviceWorker;\n this._registerServiceWorker();\n\n // worker.startMessages();\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n\n const controller = worker.controller;\n this.attachServiceWorker(controller);\n\n controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n this.serviceMessagePort.attachListenPort(worker);\n this.serviceMessagePort.addMultipleEventsListeners({\n port: (payload, source, event) => {\n this.invokeVoid('serviceWorkerPort', undefined, undefined, [event.ports[0]]);\n },\n\n hello: (payload, source) => {\n this.serviceMessagePort.resendLockTask(source);\n },\n\n share: (payload) => {\n this.log('will try to share something');\n this.share = payload;\n }\n });\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n private async registerCryptoWorker() {\n const get = (url: string) => {\n return fetch(url).then((response) => response.text()).then((text) => {\n const pathnameSplitted = location.pathname.split('/');\n pathnameSplitted[pathnameSplitted.length - 1] = '';\n const pre = location.origin + pathnameSplitted.join('/');\n text = `\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${pre}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${text}`;\n const blob = new Blob([text], {type: 'application/javascript'});\n return blob;\n });\n };\n\n const workerHandler = {\n construct(target: any, args: any): any {\n const url = args[0] + location.search;\n return {url};\n }\n };\n\n const originals = [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean);\n originals.forEach((w) => window[w.name as any] = new Proxy(w, workerHandler));\n\n const worker: SharedWorker | Worker = new Worker(\n /* webpackChunkName: \"crypto.worker\" */\n new URL('../crypto/crypto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n\n originals.forEach((w) => window[w.name as any] = w as any);\n\n const originalUrl = (worker as any).url;\n\n const createWorker = (url: string) => new constructor(url, {type: 'module'});\n const attachWorkerToPort = (worker: SharedWorker | Worker) => this.attachWorkerToPort(worker, cryptoMessagePort, 'crypto');\n const constructor = IS_SHARED_WORKER_SUPPORTED ? SharedWorker : Worker;\n\n // let cryptoWorkers = workers.length;\n cryptoMessagePort.addEventListener('port', (payload, source, event) => {\n this.invokeVoid('cryptoPort', undefined, undefined, [event.ports[0]]);\n // .then((attached) => {\n // if(!attached && cryptoWorkers-- > 1) {\n // this.log.error('terminating unneeded crypto worker');\n\n // cryptoMessagePort.invokeVoid('terminate', undefined, source);\n // const worker = workers.find((worker) => (worker as SharedWorker).port === source || (worker as any) === source);\n // if((worker as SharedWorker).port) (worker as SharedWorker).port.close();\n // else (worker as Worker).terminate();\n // cryptoMessagePort.detachPort(source);\n // }\n // });\n });\n\n const firstWorker = createWorker(originalUrl);\n attachWorkerToPort(firstWorker);\n\n const blob = await get(originalUrl);\n const urlsPromise = await this.invoke('createProxyWorkerURLs', {originalUrl, blob});\n const workers = urlsPromise.slice(1).map(createWorker);\n workers.forEach(attachWorkerToPort);\n }\n\n \n private registerWorker() {\n // return;\n\n let worker: SharedWorker | Worker;\n if(IS_SHARED_WORKER_SUPPORTED) {\n worker = new SharedWorker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n } else {\n worker = new Worker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n }\n\n this.onWorkerFirstMessage(worker);\n }\n \n\n private attachWorkerToPort(worker: SharedWorker | Worker, messagePort: SuperMessagePort, type: string) {\n const port: MessagePort = (worker as SharedWorker).port || worker as any;\n messagePort.attachPort(port);\n\n worker.addEventListener('error', (err) => {\n this.log.error(type, 'worker error', err);\n });\n }\n\n private onWorkerFirstMessage(worker: any) {\n this.log('set webWorker');\n\n // this.worker = worker;\n \n \n \n this.attachWorkerToPort(worker, this, 'mtproto');\n \n }\n\n private loadState() {\n return Promise.all([\n loadState().then((stateResult) => {\n this.newVersion = stateResult.newVersion;\n this.oldVersion = stateResult.oldVersion;\n this.mirrors['state'] = stateResult.state;\n return stateResult;\n })\n // loadStorages(createStorages()),\n ]);\n }\n\n public sendState() {\n return this.loadState().then((result) => {\n const [stateResult] = result;\n this.invoke('state', {...stateResult, userId: rootScope.myId.toUserId()});\n return result;\n });\n }\n\n \n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\n return cryptoMessagePort.invokeCrypto(method, ...args);\n }\n \n\n public async toggleStorages(enabled: boolean, clearWrite: boolean) {\n await toggleStorages(enabled, clearWrite);\n this.invoke('toggleStorages', {enabled, clearWrite});\n this.serviceMessagePort.invokeVoid('toggleStorages', {enabled, clearWrite});\n }\n\n public async getMirror(name: T) {\n const mirror = this.mirrors[name];\n return mirror;\n }\n\n public getState() {\n return this.getMirror('state');\n }\n\n public updateTabState(key: T, value: TabState[T]) {\n this.tabState[key] = value;\n this.invokeVoid('tabState', this.tabState);\n }\n\n public updateTabStateIdle(idle: boolean) {\n this.updateTabState('idleStartTime', idle ? Date.now() : 0);\n }\n\n private onMirrorTask = (payload: MirrorTaskPayload) => {\n const {name, key, value} = payload;\n if(!payload.hasOwnProperty('key')) {\n this.mirrors[name] = value;\n return;\n }\n\n const mirror = this.mirrors[name] ??= {} as any;\n if(value === undefined) {\n delete mirror[key];\n } else {\n mirror[key] = value;\n }\n };\n}\n\ninterface ApiManagerProxy extends MTProtoMessagePort {}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport tabId from '../../config/tabId';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport idleController from '../../helpers/idleController';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport sessionStorage from '../sessionStorage';\nimport apiManagerProxy from './mtprotoworker';\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nexport type InstanceDeactivateReason = 'version' | 'tabs';\n\nconst CHECK_INSTANCE_INTERVAL = 5000;\nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\nconst IS_MULTIPLE_TABS_SUPPORTED = IS_SHARED_WORKER_SUPPORTED;\n\nexport class SingleInstance extends EventListenerBase<{\n activated: () => void,\n deactivated: (reason: InstanceDeactivateReason) => void\n}> {\n private instanceId: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: InstanceDeactivateReason;\n private log = logger('INSTANCE');\n\n constructor() {\n super(false);\n\n this.log = logger('INSTANCE');\n this.instanceId = tabId;\n }\n\n public get deactivatedReason() {\n return this.deactivated;\n }\n\n public start() {\n this.reset();\n\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n idleController.addEventListener('change', this.checkInstance);\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\n this.checkInstance();\n\n try {\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\n } catch(e) {}\n }\n }\n\n private reset() {\n this.masterInstance = false;\n this.clearDeactivateTimeout();\n this.deactivated = undefined;\n }\n\n private clearInstance = () => {\n if(this.masterInstance && !this.deactivated) {\n this.log.warn('clear master instance');\n sessionStorage.delete('xt_instance');\n }\n };\n\n public activateInstance() {\n if(this.deactivated) {\n this.reset();\n this.checkInstance(false);\n this.dispatchEvent('activated');\n }\n }\n\n private deactivateInstance(reason: InstanceDeactivateReason) {\n if(this.masterInstance || this.deactivated) {\n return;\n }\n\n this.log.warn('deactivate', reason);\n this.clearDeactivateTimeout();\n this.deactivated = reason;\n\n this.dispatchEvent('deactivated', reason);\n }\n\n private clearDeactivateTimeout() {\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n }\n\n private checkInstance = async(idle = idleController.isIdle) => {\n if(this.deactivated) {\n return;\n }\n\n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceId,\n idle,\n time\n };\n\n const [curInstance, build = App.build] = await Promise.all([\n sessionStorage.get('xt_instance', false),\n sessionStorage.get('k_build', false)\n ]);\n\n if(build > App.build) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.deactivateInstance('version');\n apiManagerProxy.toggleStorages(false, false);\n return;\n } else if(IS_MULTIPLE_TABS_SUPPORTED) {\n sessionStorage.set({xt_instance: newInstance});\n return;\n }\n\n // this.log('check instance', newInstance, curInstance)\n if(!idle ||\n !curInstance ||\n curInstance.id === this.instanceId ||\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\n sessionStorage.set({xt_instance: newInstance});\n\n if(!this.masterInstance) {\n this.masterInstance = true;\n rootScope.managers.networkerFactory.startAll();\n this.log.warn('now master instance', newInstance);\n }\n\n this.clearDeactivateTimeout();\n } else if(this.masterInstance) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.log.warn('now idle instance', newInstance);\n this.deactivateTimeout ||= window.setTimeout(() => this.deactivateInstance('tabs'), DEACTIVATE_TIMEOUT);\n }\n };\n}\n\nconst singleInstance = new SingleInstance();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\nexport default singleInstance;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport Modes from '../../config/modes';\nimport loadScript from '../../helpers/dom/loadScript';\nimport tsNow from '../../helpers/tsNow';\nimport sessionStorage from '../sessionStorage';\n\nexport class TelegramMeWebManager {\n private disabled = /* false && */(Modes.test || !App.domains.includes(location.hostname));\n\n public setAuthorized(canRedirect: boolean) {\n if(this.disabled) {\n return;\n }\n\n return sessionStorage.get('tgme_sync').then((curValue) => {\n const ts = tsNow(true);\n if(\n canRedirect &&\n curValue?.canRedirect === canRedirect &&\n (curValue.ts + 86400) > ts\n ) {\n return;\n }\n\n sessionStorage.set({\n tgme_sync: {\n canRedirect,\n ts\n }\n });\n\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\n const urls = [\n '//telegram.me/' + path,\n '//t.me/' + path\n ];\n\n const promises = urls.map((url) => {\n return loadScript(url).then((script) => {\n script.remove();\n });\n });\n\n return Promise.all(promises);\n });\n }\n}\n\nconst telegramMeWebManager = new TelegramMeWebManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\nexport default telegramMeWebManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function loadScript(url: string) {\n const script = document.createElement('script');\n const promise = new Promise((resolve) => {\n script.onload = script.onerror = () => {\n resolve(script);\n };\n });\n script.src = url;\n document.body.appendChild(script);\n return promise;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {PushNotificationObject} from '../serviceWorker/push';\nimport type {ServicePushPingTaskPayload} from '../serviceWorker/serviceMessagePort';\nimport type {NotificationSettings} from '../appManagers/uiNotificationsManager';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {logger} from '../logger';\nimport apiManagerProxy from './mtprotoworker';\nimport I18n, {LangPackKey} from '../langPack';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport copy from '../../helpers/object/copy';\nimport singleInstance from './singleInstance';\nimport EventListenerBase from '../../helpers/eventListenerBase';\n\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\n\nexport type PushSubscriptionNotify = {\n tokenType: number,\n tokenValue: string\n};\n\nconst PING_PUSH_INTERVAL = 10000;\n\nexport class WebPushApiManager extends EventListenerBase<{\n push_notification_click: (n: PushNotificationObject) => void,\n push_init: (n: PushSubscriptionNotify) => void,\n push_subscribe: (n: PushSubscriptionNotify) => void,\n push_unsubscribe: (n: PushSubscriptionNotify) => void\n}> {\n public isAvailable = true;\n private isPushEnabled = false;\n private localNotificationsAvailable = true;\n private started = false;\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\n private isAliveTO: any;\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n private userVisibleOnly = this.isFirefox ? false : true;\n private log = logger('PM');\n\n constructor() {\n super(false);\n\n if(!('PushManager' in window) ||\n !('Notification' in window) ||\n !('serviceWorker' in navigator)) {\n this.log.warn('Push messaging is not supported.');\n this.isAvailable = false;\n this.localNotificationsAvailable = false;\n }\n\n if(this.isAvailable && Notification.permission === 'denied') {\n this.log.warn('The user has blocked notifications.');\n }\n }\n\n public start() {\n if(!this.started) {\n this.started = true;\n this.getSubscription();\n this.setUpServiceWorkerChannel();\n }\n }\n\n public setLocalNotificationsDisabled() {\n this.localNotificationsAvailable = false;\n }\n\n public getSubscription() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = !!subscription;\n this.pushSubscriptionNotify('init', subscription);\n }).catch((err) => {\n this.log.error('Error during getSubscription()', err);\n });\n });\n }\n\n public subscribe = () => {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\n // The subscription was successful\n this.isPushEnabled = true;\n this.pushSubscriptionNotify('subscribe', subscription);\n }).catch((e) => {\n if(Notification.permission === 'denied') {\n this.log('Permission for Notifications was denied');\n } else {\n this.log('Unable to subscribe to push.', e);\n if(!this.userVisibleOnly) {\n this.userVisibleOnly = true;\n setTimeout(this.subscribe, 0);\n }\n }\n });\n });\n }\n\n public unsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = false;\n\n if(subscription) {\n this.pushSubscriptionNotify('unsubscribe', subscription);\n\n setTimeout(() => {\n subscription.unsubscribe().then((successful) => {\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }, 3000);\n }\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public forceUnsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.log.warn('force unsubscribe', subscription);\n if(subscription) {\n subscription.unsubscribe().then((successful) => {\n this.log.warn('force unsubscribe successful', successful);\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public isAliveNotify = () => {\n if(!this.isAvailable || singleInstance.deactivatedReason) {\n return;\n }\n\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '');\n\n const lang: ServicePushPingTaskPayload['lang'] = {} as any;\n const ACTIONS_LANG_MAP: Record = {\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\n push_message_nopreview: 'PushNotification.Message.NoPreview'\n };\n\n for(const action in ACTIONS_LANG_MAP) {\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('pushPing', {\n localNotifications: this.localNotificationsAvailable,\n lang: lang,\n settings: this.settings\n });\n\n this.isAliveTO = setTimeout(this.isAliveNotify, PING_PUSH_INTERVAL);\n }\n\n public setSettings(newSettings: WebPushApiManager['settings']) {\n this.settings = copy(newSettings);\n clearTimeout(this.isAliveTO);\n this.isAliveNotify();\n }\n\n public hidePushNotifications() {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('notificationsClear', undefined);\n }\n\n public setUpServiceWorkerChannel() {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.addEventListener('pushClick', (payload) => {\n if(singleInstance.deactivatedReason) {\n appRuntimeManager.reload();\n return;\n }\n\n this.dispatchEvent('push_notification_click', payload);\n });\n\n navigator.serviceWorker.ready.then(this.isAliveNotify);\n }\n\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\n if(subscription) {\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\n if(!subscriptionObj ||\n !subscriptionObj.endpoint ||\n !subscriptionObj.keys ||\n !subscriptionObj.keys.p256dh ||\n !subscriptionObj.keys.auth) {\n this.log.warn('Invalid push subscription', subscriptionObj);\n this.unsubscribe();\n this.isAvailable = false;\n this.pushSubscriptionNotify(event);\n return;\n }\n\n this.log.warn('Push', event, subscriptionObj);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\n tokenType: 10,\n tokenValue: JSON.stringify(subscriptionObj)\n });\n } else {\n this.log.warn('Push', event, false);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\n }\n }\n}\n\nconst webPushApiManager = new WebPushApiManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\nexport default webPushApiManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport IS_OPUS_SUPPORTED from '../environment/opusSupport';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport {Modify} from '../types';\nimport {logger, LogTypes} from './logger';\nimport apiManagerProxy from './mtproto/mtprotoworker';\nimport type {ConvertWebPTask} from './webp/webpWorkerController';\n\ntype Result = {\n bytes: Uint8Array,\n waveform?: Uint8Array\n};\n\ntype Task = {\n pages: Uint8Array,\n withWaveform: boolean,\n waveform?: Uint8Array,\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\n timeout: number\n};\n\nexport interface ConvertOpusTask extends Modify {\n type: 'convertOpus'\n}\n\nexport class OpusDecodeController {\n private worker: Worker;\n private wavWorker: Worker;\n private sampleRate = 48000;\n private tasks: Array = [];\n private keepAlive = false;\n private log = logger('OPUS', LogTypes.Error);\n\n public isPlaySupported() {\n return IS_OPUS_SUPPORTED;\n }\n\n public loadWavWorker() {\n if(this.wavWorker) return;\n\n this.wavWorker = new Worker('waveWorker.min.js');\n this.wavWorker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[WAV] got message:', data);\n if(data && data.page) {\n const bytes = data.page;\n this.onTaskEnd(this.tasks.shift(), bytes);\n }\n });\n }\n\n public loadWorker() {\n if(this.worker) return;\n\n this.worker = new Worker('decoderWorker.min.js');\n this.worker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[DECODER] got message', data);\n if(data.type === 'done') {\n // this.log('[DECODER] send done to wav');\n this.wavWorker.postMessage({command: 'done'});\n\n if(data.waveform) {\n this.tasks[0].waveform = data.waveform;\n }\n } else { // e.data contains decoded buffers as float32 values\n // this.log('[DECODER] send encode to wav');\n this.wavWorker.postMessage({\n command: 'encode',\n buffers: e.data\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\n }\n });\n }\n\n public setKeepAlive(keepAlive: boolean) {\n this.keepAlive = keepAlive;\n if(this.keepAlive) {\n this.loadWorker();\n this.loadWavWorker();\n } else if(!this.tasks.length) {\n this.terminateWorkers();\n }\n }\n\n public onTaskEnd(task: Task, result?: Uint8Array) {\n if(!result) {\n task.callback.reject('timeout');\n } else {\n clearTimeout(task.timeout);\n task.callback.resolve({bytes: result, waveform: task.waveform});\n }\n\n if(this.tasks.length) {\n this.executeNewTask(this.tasks[0]);\n }\n\n this.terminateWorkers();\n }\n\n public terminateWorkers(kill = false) {\n if((this.keepAlive || this.tasks.length) && !kill) return;\n\n if(this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n\n if(this.wavWorker) {\n this.wavWorker.terminate();\n this.wavWorker = null;\n }\n }\n\n public executeNewTask(task: Task) {\n this.worker.postMessage({\n command: 'init',\n decoderSampleRate: this.sampleRate,\n outputBufferSampleRate: this.sampleRate\n });\n\n this.wavWorker.postMessage({\n command: 'init',\n wavBitDepth: 16,\n wavSampleRate: this.sampleRate\n });\n\n // console.log('sending command to worker:', task);\n // setTimeout(() => {\n this.log('[DECODER] send decode');\n this.worker.postMessage({\n command: 'decode',\n pages: task.pages,\n waveform: task.withWaveform\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\n // }, 1e3);\n\n task.timeout = window.setTimeout(() => {\n this.log.error('decode timeout'/* , task */);\n\n this.terminateWorkers(true);\n if(this.tasks.length) {\n this.loadWorker();\n this.loadWavWorker();\n }\n\n this.onTaskEnd(this.tasks.shift());\n }, 10e3);\n }\n\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\n return new Promise((resolve, reject) => {\n const task = {\n pages,\n withWaveform,\n callback: {resolve, reject},\n timeout: 0\n };\n\n this.loadWorker();\n this.loadWavWorker();\n\n if(this.tasks.push(task) === 1) {\n this.executeNewTask(task);\n }\n });\n }\n\n public async decode(typedArray: Uint8Array, withWaveform = false) {\n return this.pushDecodeTask(typedArray, withWaveform).then(async(result) => {\n const dataBlob = new Blob([result.bytes], {type: 'audio/wav'});\n return {url: await apiManagerProxy.invoke('createObjectURL', dataBlob), waveform: result.waveform};\n });\n }\n}\n\nconst opusDecodeController = new OpusDecodeController();\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\nexport default opusDecodeController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n// const markdownTestRegExp = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\n 'Telegram': 'tg://search_hashtag?hashtag={1}',\n 'Twitter': 'https://twitter.com/hashtag/{1}',\n 'Instagram': 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\n/* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n} */\n\n\n/* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n} */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type addAnchorListener from '../../helpers/addAnchorListener';\nimport {PHONE_NUMBER_REG_EXP} from '.';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport matchUrlProtocol from './matchUrlProtocol';\nimport {T_ME_PREFIXES} from '../mtproto/mtproto_config';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean) {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n const out: {url: string, onclick?: Parameters[0]['name']} = {url};\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: typeof out['onclick'];\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?(?:(.+?)\\.)?(?:(?:web|k|z)\\.)?t(?:elegram)?\\.me(?:\\/(.+))?/))) {\n const u = new URL(url);\n let prefix = tgMeMatch[1];\n if(prefix && T_ME_PREFIXES.has(tgMeMatch[1])) {\n prefix = undefined;\n }\n\n if(prefix) {\n u.pathname = prefix + (u.pathname === '/' ? '' : u.pathname);\n }\n\n const fullPath = u.pathname.slice(1);\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n } else if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) { // second regexp is for phone numbers (t.me/+38050...)\n onclick = 'joinchat';\n } else switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'addemoji':\n case 'voicechat':\n case 'invoice':\n if(path.length !== 1 && !prefix) {\n onclick = path[0];\n break;\n }\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1] as any;\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n\n out.onclick = onclick;\n return out;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.wrapUrl = wrapUrl);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\nimport type {Dialog, ForumTopic, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport type {MTAppConfig} from './mtproto/appConfig';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n 'chat_toggle_forum': {chatId: ChatId, enabled: boolean},\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, threadId?: number, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': {peerId: PeerId, threadId?: number},\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog | ForumTopic, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog | ForumTopic},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': Dialog | ForumTopic,\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog | ForumTopic,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map}>,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n\n 'contacts_update': UserId,\n 'avatar_update': {peerId: PeerId, threadId?: number},\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n // 'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n\n 'background_change': void,\n\n 'privacy_update': Update.updatePrivacy,\n\n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n\n 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': void,\n\n 'media_play': void,\n\n 'emoji_recent': AppEmoji,\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\n\n 'premium_toggle': boolean,\n 'premium_toggle_private': {isNew: boolean, isPremium: boolean},\n\n 'config': Config,\n 'app_config': MTAppConfig\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle_private', ({isNew, isPremium}) => {\n this.premium = isPremium;\n\n if(!isNew) {\n this.dispatchEventSingle('premium_toggle', isPremium);\n }\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {WorkerTaskVoidTemplate} from '../../types';\n\nexport interface ConvertWebPTask extends WorkerTaskVoidTemplate {\n type: 'convertWebp',\n payload: {\n fileName: string,\n bytes: Uint8Array\n }\n};\n\nexport class WebpWorkerController {\n private worker: Worker;\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\n\n private init() {\n this.worker = new Worker(new URL('./webp.worker.ts', import.meta.url));\n this.worker.addEventListener('message', (e) => {\n const task = e.data as ConvertWebPTask;\n const payload = task.payload;\n\n const promise = this.convertPromises[payload.fileName];\n if(promise) {\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\n delete this.convertPromises[payload.fileName];\n }\n });\n }\n\n private postMessage(data: ConvertWebPTask) {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.worker.postMessage(data);\n }\n\n public convert(fileName: string, bytes: Uint8Array) {\n if(this.convertPromises.hasOwnProperty(fileName)) {\n return this.convertPromises[fileName];\n }\n\n const convertPromise = deferredPromise();\n\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\n\n return this.convertPromises[fileName] = convertPromise;\n }\n}\n\nconst webpWorkerController = new WebpWorkerController();\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\nexport default webpWorkerController;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"589\":\"crypto.worker\",\"630\":\"npm.qr-code-styling\",\"670\":\"sw\",\"678\":\"mtproto.worker\"}[chunkId] || chunkId) + \".\" + {\"8\":\"570e6da51a125009c156\",\"53\":\"77c5dab45a68d1851187\",\"61\":\"b4b665c9d61c26575ebe\",\"63\":\"0d39a81590990db74d39\",\"77\":\"18305e1bd331a0fdd36c\",\"104\":\"e24e7fdd92837aca2688\",\"231\":\"32da54109dc94ecb5e46\",\"301\":\"42dc636f96a62f6a08c8\",\"339\":\"79c7f9c2341eeff66b88\",\"392\":\"198d4679664c1bf4c989\",\"436\":\"47558d0a092967b3c966\",\"437\":\"d40e517d52e5dcf3b754\",\"442\":\"645fe71c30545d9700d2\",\"460\":\"045a47588277eda9214e\",\"508\":\"37ca243cfb33b5edd94a\",\"539\":\"17a0b07b4e6476f19654\",\"589\":\"fe5845cc2133b5405cac\",\"630\":\"2c5d57550714b1a9e42e\",\"641\":\"11406cec52b05304f14f\",\"642\":\"fd1ade69544ad78671c6\",\"670\":\"04ffa51e8d749197145b\",\"678\":\"d525550e01869ae11a4b\",\"709\":\"73c949c4c6702cdf349b\",\"776\":\"b547f5293903351f3ec7\",\"781\":\"af546badf2c525815889\",\"783\":\"827711558099e62fd694\",\"810\":\"f272bad8a3948af5c8d0\",\"813\":\"06763bece6721fb81fde\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [85,946], () => (__webpack_require__(2938)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","IS_BETA","DEBUG","MOUNT_CLASS_TO","window","self","STATE_VERSION","BUILD","DEFAULT_THEME","_","access_hash","id","settings","pFlags","base_theme","accent_color","message_colors","wallpaper","default","pattern","document","undefined","slug","intensity","background_color","second_background_color","third_background_color","fourth_background_color","dark","title","emoticon","makeDefaultAppTheme","name","baseTheme","highlightningColor","find","s","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsListCachedTime","updates","filtersArr","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","recentCustomEmoji","topPeersCache","recentSearch","version","build","authState","IS_MOBILE","hiddenPinnedMessages","messagesTextSize","distanceUnit","sendShortcut","animationsEnabled","autoDownload","photo","contacts","private","groups","channels","video","file","autoDownloadNew","file_size_max","video_preload_large","audio_preload_next","photo_size_max","video_size_max","video_upload_maxbitrate","autoPlay","gifs","videos","stickers","suggest","loop","emoji","big","themes","theme","notifications","sound","timeFormat","toLocaleString","match","playbackParams","volume","muted","playbackRate","playbackRates","voice","audio","round","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","IS_APPLE_MX","ctx","createElement","getContext","extension","getExtension","renderer","getParameter","UNMASKED_RENDERER_WEBGL","getSupportedExtensions","indexOf","err","CAN_USE_TRANSFERABLES","IS_SAFARI","navigator","userAgent","search","geolocation","getCurrentPosition","IMAGE_MIME_TYPES_SUPPORTED","Set","add","arr","concat","canPlayType","IS_APPLE_MOBILE","replace","IS_FIREFOX","mediaDevices","DocumentTouch","USER_AGENT","IS_APPLE","IS_ANDROID","toLowerCase","IS_CHROMIUM","test","vendor","platform","maxTouchPoints","IS_MOBILE_SAFARI","vibrate","VIDEO_MIME_TYPES_SUPPORTED","toDataURL","startsWith","rgbToHsv","r","g","b","v","Math","max","c","min","h","hsvToRgb","f","n","k","rgbaToHsla","a","l","d","hslaToRgba","hue2rgb","p","q","t","map","hexaToRgba","hexa","offset","length","slice","i","push","parseInt","hexToRgb","hex","hexaToHsla","rgba","rgbaToHexa","toString","join","hslaStringToHex","hsla","splitted","split","alpha","pop","val","endsWith","hslaStringToRgba","hslaStringToHexa","mixColors","color1","color2","weight","out","Array","v1","v2","floor","getAverageColor","getAccentColor","baseHsv","baseColor","elementColor","hsvTemp3","hsvTemp4","dist","getHexColorFromTelegramColor","color","repeat","getRgbColorFromTelegramColor","getColorsFromWallPaper","wallPaper","filter","Boolean","compareVersion","s1","s2","blurActiveElement","activeElement","blur","cancelEvent","event","cancelable","originalEvent","stopPropagation","preventDefault","returnValue","cancelBubble","findUpClassName","el","className","closest","fixSafariStickyInput","input","style","transform","focus","then","IS_STICKY_INPUT_BUGGED","key","startY","o","capture","passive","onTouchMove","e","touch","touches","scrollable","target","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","fixSafariStickyInputFocusing","callback","cacheInstallPrompt","deferredPrompt","prompt","outcome","userChoice","getInstallPrompt","texts","cache","fonts","text","icons","monospace","loadFonts","types","Promise","resolve","promises","type","_texts","font","weights","_promises","load","race","all","catch","setInnerHTML","elem","html","setDirection","innerHTML","replaceChildren","setAttribute","FOCUS_EVENT_NAME","IdleController","constructor","super","this","_isIdle","focusPromise","focusResolve","isIdle","once","idle","getFocusPromise","value","dispatchEvent","OverlayCounter","overlaysActive","isOverlayActive","fastRafCallbacks","fastRaf","requestAnimationFrame","currentCallbacks","forEach","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","parseUriParams","uri","params","item","decodeURIComponent","appColorMap","rgb","light","lightFilled","darkRgb","darkFilled","colorMap","day","night","themeController","setTheme","themeColorElem","_themeColorElem","head","querySelector","setThemeColor","themeColor","isNight","setThemeListener","darkModeMediaQuery","matchMedia","checkDarkMode","systemTheme","matches","addListener","applyHighlightningColor","getTheme","documentElement","setProperty","removeProperty","colorScheme","toggle","applyTheme","switchTheme","bindColorApplier","options","appliedColors","applyAppColor","_options","finalize","has","element","lightenAlpha","darkenAlpha","mixColor","appColor","lightenedRgb","darkenedHsla","applyNewTheme","currentTheme","themeSettings","newAppTheme","AppBackgroundTab","setBackgroundDocument","isArray","baseColors","hsvTemp1","hsvTemp2","mixed","messageLightenAlpha","baseMessageColor","baseMessageOutBackgroundColor","myMessagesAccent","nextColor","accentColor2","outbox_accent_color","newMessageOutBackgroundColor","workerHandler","construct","args","url","location","Worker","SharedWorker","w","Proxy","setWorkerProxy","Element","prototype","toggleAttribute","force","hasAttribute","removeAttribute","Node","nodes","textContent","append","rootScope","getProxiedManagers","getElementById","href","singleInstance","visualViewport","lastVH","setViewportVH","setVH","vh","overlayCounter","height","innerHeight","toggleResizeMode","tabId","onImTabChange","wasTabId","tagName","appMediaViewer","perf","performance","langPromise","stateResult","langPack","fadeInWhenFontsReady","promise","opacity","state","isPremium","appVersion","lang_code","console","log","dir","hash","tgWebAuthToken","data","token","dcId","tgWebAuthDcId","userId","tgWebAuthUserId","toUserId","isTest","tgWebAuthTest","tgAddr","tgaddr","urlSearchParams","URLSearchParams","set","delete","pagePromise","placeholder","prepend","cloneNode","meModule","pushModule","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","pause","ready","reload","close","DEBUG_MANAGER_REQUESTS","createProxyProxy","proxied","ack","get","receiver","method","warn","createProxy","acknowledged","IDB","db","storageIsAvailable","openDatabase","INSTANCES","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","from","indexName","deleteIndex","indexes","index","createIndex","keyPath","objectParameters","request","indexedDB","open","reject","error","message","finished","setTimeout","onerror","onsuccess","result","calledNew","onclose","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","instance","preserve","storage","IDBStorage","storeName","idb","create","entryName","getObjectStore","clear","save","idx","put","mode","onError","clearTimeout","timeout","onComplete","results","requests","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","UNSUPPORTED_LANG_PACK_KEY","I18n","pluralRules","cacheLangPackPromise","setLangCode","langCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","date","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","lang","langSign","countries","strings","formatLocalStrings","saveLangPack","from_version","local","loadLangPack","web","requestedServerLanguage","managers","apiManager","invokeApiCacheable","lang_pack","polyfillPromise","pushTo","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","querySelectorAll","weakMap","update","superFormatter","indexHolder","lastIndex","p1","p2","p3","p4","lastIndexOf","wrappedUrl","onclick","DocumentFragment","firstChild","arg","pushNextArgument","plain","str","select","Map","isRTL","setRTL","rtl","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","keys","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","_Intl","Object","assign","WeakMap","IntlElementBase","property","IntlElement","formatted","dataset","compareAndUpdate","json","JSON","stringify","DateTimeFormat","hours","getHours","getMinutes","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","isLast","useLast","joined","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","TOPIC_COLORS","ATTACH_MENU_BOT_ICON_NAME","GENERAL_TOPIC_ID","T_ME_PREFIXES","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","IS_CALL_SUPPORTED","IS_CANVAS_FILTER_SUPPORTED","IS_EMOJI_SUPPORTED","IS_GEOLOCATION_SUPPORTED","IS_GROUP_CALL_SUPPORTED","IS_MOV_SUPPORTED","IS_PARALLAX_SUPPORTED","IS_SCREEN_SHARING_SUPPORTED","IS_TOUCH_SUPPORTED","IS_VIBRATE_SUPPORTED","IS_OPUS_SUPPORTED","IS_SHARED_WORKER_SUPPORTED","IS_WEBM_SUPPORTED","IS_WEBP_SUPPORTED","IS_WEBRTC_SUPPORTED","MEDIA_MIME_TYPES_SUPPORTED","ALL_KEYS","REFRESH_KEYS","loadStateInner","logger","totalPerf","recordPromise","stateStorage","sessionStorage","pushedKeys","pushToState","copy","splice","auth","shift","sessionBuild","shiftedWebKAuth","values","dcID","toPeerId","obj","resetStorages","chats","dialogs","users","_state","state_id","time","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","SKIP_VALIDATING_PATHS","validateInitObject","missingKey","migrated","oldThemes","oldTheme","oldBackground","background","newTheme","colors","wallPaperSettings","k_build","ApiManagerProxy","onMirrorTask","payload","hasOwnProperty","mirrors","mirror","tabState","chatPeerIds","idleStartTime","registerWorker","registerServiceWorker","registerCryptoWorker","addMultipleEventsListeners","convertWebp","fileName","bytes","webpWorkerController","convertOpus","opusDecodeController","localStorageProxy","storageTask","language","toggleStorages","telegramMeWebManager","webPushApiManager","cacheName","caches","appRuntimeManager","idleController","updateTabStateIdle","invoke","pingServiceWorkerWithIframe","pingServiceWorkerPromise","iframe","hidden","onLoad","remove","src","random","body","attachServiceWorker","serviceWorker","lastServiceWorker","serviceMessagePort","detachPort","attachSendPort","invokeVoid","_registerServiceWorker","register","URL","scope","registration","active","controller","unregister","installing","waiting","worker","attachListenPort","port","source","ports","hello","resendLockTask","share","originals","originalUrl","createWorker","attachWorkerToPort","cryptoMessagePort","blob","fetch","response","pathnameSplitted","pathname","origin","Blob","onWorkerFirstMessage","messagePort","attachPort","loadState","sendState","invokeCrypto","enabled","clearWrite","getMirror","getState","updateTabState","apiManagerProxy","IS_MULTIPLE_TABS_SUPPORTED","SingleInstance","clearInstance","masterInstance","deactivated","checkInstance","newInstance","instanceId","curInstance","deactivateInstance","xt_instance","clearDeactivateTimeout","deactivateTimeout","deactivatedReason","start","reset","started","setInterval","activateInstance","reason","TelegramMeWebManager","disabled","hostname","canRedirect","curValue","ts","tsNow","tgme_sync","path","encodeURIComponent","script","onload","appendChild","loadScript","WebPushApiManager","isPushEnabled","localNotificationsAvailable","isFirefox","userVisibleOnly","subscribe","reg","pushManager","subscription","pushSubscriptionNotify","Notification","permission","isAliveNotify","baseUrl","ACTIONS_LANG_MAP","push_action_mute1d","push_action_settings","push_message_nopreview","action","localNotifications","isAliveTO","getSubscription","setUpServiceWorkerChannel","setLocalNotificationsDisabled","unsubscribe","successful","setSettings","newSettings","hidePushNotifications","subscriptionObj","toJSON","endpoint","p256dh","tokenType","tokenValue","sampleRate","tasks","keepAlive","isPlaySupported","loadWavWorker","wavWorker","page","onTaskEnd","loadWorker","postMessage","command","waveform","buffers","typedArray","buffer","setKeepAlive","terminateWorkers","task","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","decode","dataBlob","ALPHA_CHARS_REG_EXP","ALPHA_NUMERIC_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","RegExp","USERNAME_REG_EXP","BOT_COMMAND_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","SITE_HASHTAGS","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","wrapUrl","unsafe","tgMeMatch","telescoPeMatch","tgMatch","u","prefix","fullPath","RootScope","myId","connectionStatus","premium","isNew","dispatchEventSingle","status","getConnectionStatus","getPremium","convertPromises","init","convert","convertPromise","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","getter","__esModule","getPrototypeOf","ns","def","current","getOwnPropertyNames","definition","defineProperty","enumerable","chunkId","reduce","miniCssF","globalThis","Function","prop","done","needAttach","scripts","getElementsByTagName","getAttribute","charset","nc","onScriptComplete","prev","doneFns","parentNode","removeChild","bind","Symbol","toStringTag","scriptUrl","importScripts","currentScript","Error","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","baseURI","installedChunks","installedChunkData","errorType","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.8a30f1b9c0bab91e44e9.css b/public/main.8a30f1b9c0bab91e44e9.css deleted file mode 100644 index 73330969..00000000 --- a/public/main.8a30f1b9c0bab91e44e9.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}button{background:none;border:none;cursor:pointer;outline:none;padding:0}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none!important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;user-select:none}.no-transition,.no-transition:after,.no-transition:before{transition:none!important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start!important}.justify-self-start{justify-self:flex-start!important}.justify-self-end{justify-self:flex-end!important}.position-center{position:absolute!important}.position-center{left:50%;top:50%;transform:translate(-50%,-50%)}.text-bold{font-weight:500!important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap!important}.no-wrap{white-space:nowrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}.reflect-x{transform:scaleX(-1)}[dir=auto]{unicode-bidi:plaintext}.is-rtl [dir=auto]{direction:inherit}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap} -:root{--vh:1vh;--z-below:-1;--hover-alpha:0.08;--transition-standard-easing:cubic-bezier(.4,.0,.2,1);--transition-standard-in-time:.3s;--transition-standard-out-time:.25s;--transition-standard-in:var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out:var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition:.2s ease-in-out;--layer-transition:.2s cubic-bezier(.4,.0,.2,1);--slide-header-transition:.4s ease-in-out;--tabs-transition:.2s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--sticker-viewer-open-transition-in:.2s var(--transition-standard-easing);--sticker-viewer-open-transition-out:.2s var(--transition-standard-easing);--sticker-viewer-switch-transition:.2s cubic-bezier(.12,1.1,.56,1.2);--popup-transition-function:cubic-bezier(.4,0,.2,1);--popup-transition-time:.15s;--btn-corner-transition:.2s cubic-bezier(.34,1.56,.64,1);--chatlist-badge-transition-in:.25s cubic-bezier(.35,.35,.47,1.34);--chatlist-badge-transition-out:.25s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin:5.5625rem;--message-beside-button-size:2.375rem;--message-beside-button-margin:calc((var(--message-beside-button-size) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-line-height:1.3125;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--messages-time-text-size:calc(var(--messages-text-size) - 4px);--messages-service-text-size:calc(var(--messages-text-size) - 1px);--messages-custom-emoji-size:calc(var(--messages-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height-20:26px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--line-height:1.3125;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--font-size:var(--font-size-16);--esg-sticker-size:72px;--esg-custom-emoji-size:36px;--popup-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-backdrop-filter:blur(50px);--font-monospace:"Roboto Mono",monospace;--font-weight-bold:500;--font-weight-normal:400;--selection-background-color:rgba(var(--primary-color-rgb),.4);--selection-color:inherit;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--custom-emoji-size:1.25rem;--peer-avatar-red-top:#ff845e;--peer-avatar-red-bottom:#d45246;--peer-avatar-orange-top:#febb5b;--peer-avatar-orange-bottom:#f68136;--peer-avatar-violet-top:#b694f9;--peer-avatar-violet-bottom:#6c61df;--peer-avatar-green-top:#9ad164;--peer-avatar-green-bottom:#46ba43;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#5bcbe3;--peer-avatar-blue-bottom:#359ad4;--peer-avatar-pink-top:#ff8aac;--peer-avatar-pink-bottom:#d95574;--peer-avatar-saved-top:#69bffa;--peer-avatar-saved-bottom:#3d9de0;--peer-avatar-archive-top:#b8c2cc;--peer-avatar-archive-bottom:#9eaab5;--avatar-color-top:var(--peer-avatar-saved-top);--avatar-color-bottom:var(--peer-avatar-saved-bottom);--avatar-border-radius-forum:37%;--premium-gradient:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%)}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--popup-sticker-size:68px;--round-video-size:200px;--chat-input-size:2.875rem;--chat-input-padding:0.5rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:601px){:root{--right-column-width:420px;--chat-input-size:3.375rem;--chat-input-padding:0.8125rem;--chat-input-inner-padding:0.5rem}}@media only screen and (max-height:569px){:root{--chat-input-size:2.875rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:1276px)and (max-width:1680px){:root{--right-column-width:25vw}}:root{--body-background-color:#fff;--background-color-true:#f4f4f5;--background-color:var(--background-color-true);--border-color:#dfe1e5;--surface-color-rgb:255,255,255;--surface-color:#fff;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--primary-color:#3390ec;--light-primary-color:rgba(51,144,236,.08);--light-filled-primary-color:#eff6fd;--dark-primary-color:#157ce1;--primary-color-rgb:51,144,236;--primary-text-color:#000;--primary-text-color-rgb:0,0,0;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--light-filled-secondary-text-color:#f4f4f4;--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--dark-danger-color:#d22324;--avatar-online-color:#0ac630;--chatlist-status-color:var(--avatar-online-color);--chatlist-pinned-color:#a2abb2;--badge-text-color:#fff;--link-color:#00488f;--ripple-color:rgba(0,0,0,.08);--poll-circle-color:var(--border-color);--spoiler-background-color:#e3e5e8;--spoiler-draft-background-color:#d9d9d9;--monospace-text-color:var(--danger-color);--backdrop-opacity:.85;--menu-background-color:rgba(var(--surface-color-rgb),var(--backdrop-opacity));--message-background-color:var(--surface-color);--message-time-color:var(--secondary-text-color);--message-checkbox-color:#61c642;--message-checkbox-border-color:#fff;--message-primary-color:var(--primary-color);--light-filled-message-primary-color:var(--light-filled-primary-color);--message-secondary-color:var(--secondary-color);--message-error-color:var(--danger-color);--message-out-background-color:#eeffde;--light-message-out-background-color:rgba(238,255,222,.08);--dark-message-out-background-color:#d9ffb5;--message-out-link-color:var(--link-color);--message-out-primary-color:#4fae4e;--light-filled-message-out-primary-color:#e1f9d2;--message-out-status-color:var(--message-out-primary-color);--message-out-time-color:var(--message-out-status-color);--message-out-audio-play-button-color:#fff;--message-out-selection-background-color:var(--selection-background-color);--gc-background-color:#212121;--gc-button-leave-color:rgba(255,89,90,.3);--gc-button-unmuted-color:rgba(1,200,80,.2);--gc-button-muted-color:rgba(60,135,247,.2);--gc-button-hand-color:rgba(223,68,184,.2);--gc-button-unmuted-fill-color:#195530;--gc-button-muted-fill-color:#3c87f7;--gc-green-color:#195530;--gc-blue-color:#3c87f7;--gc-red-color:#643333;--gc-primary-text-color:#fff;--gc-secondary-text-color:#aaa;--gc-green-text-color:#5cc85e;--gc-blue-text-color:#3390ec;--gc-red-text-color:#ff595a;--gc-right-column-width:26.25rem}.night{--body-background-color:#181818;--background-color-true:#181818;--background-color:var(--background-color-true);--border-color:#0f0f0f;--surface-color-rgb:33,33,33;--surface-color:#212121;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--primary-color:#8774e1;--light-primary-color:rgba(135,116,225,.08);--light-filled-primary-color:#292830;--dark-primary-color:#6a52da;--primary-color-rgb:135,116,225;--primary-text-color:#fff;--primary-text-color-rgb:255,255,255;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--light-filled-secondary-text-color:#2c2c2c;--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--dark-danger-color:#ff3031;--avatar-online-color:#0ac630;--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-color);--message-time-color:var(--secondary-text-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-error-color:#fff;--message-out-background-color:#8774e1;--light-message-out-background-color:rgba(135,116,225,.08);--dark-message-out-background-color:#6a52da;--message-out-link-color:#fff;--message-out-primary-color:#fff;--light-filled-message-out-primary-color:#917fe3;--message-out-status-color:#fff;--message-out-time-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color);--message-out-selection-background-color:rgba(var(--surface-color-rgb),.4)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?ivbp49) format("truetype"),url(assets/fonts/tgico.woff?ivbp49) format("woff"),url(assets/fonts/tgico.svg?ivbp49#tgico) format("svg")}.tgico:after,.tgico:before,[class*=" tgico-"]:after,[class*=" tgico-"]:before,[class^=tgico-]{font-family:tgico!important}.tgico:after,.tgico:before,[class*=" tgico-"]:after,[class*=" tgico-"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:""}.tgico-checks:before{content:""}.tgico-activesessions:before{content:""}.tgico-add:before{content:""}.tgico-add_reaction:before{content:""}.tgico-addmember_filled:before{content:""}.tgico-adduser:before{content:""}.tgico-admin:before{content:""}.tgico-animals:before{content:""}.tgico-animations:before{content:""}.tgico-archive:before{content:""}.tgico-arrow_down:before{content:""}.tgico-arrow_next:before{content:""}.tgico-attach:before{content:""}.tgico-audio_repeat:before{content:""}.tgico-audio_repeat_single:before{content:""}.tgico-avatarnext:before{content:""}.tgico-avatarprevious:before{content:""}.tgico-binfilled:before{content:""}.tgico-bold:before{content:""}.tgico-botcom:before{content:""}.tgico-bots:before{content:""}.tgico-bug:before{content:""}.tgico-calendar:before{content:""}.tgico-calendarfilter:before{content:""}.tgico-camera:before{content:""}.tgico-cameraadd:before{content:""}.tgico-car:before{content:""}.tgico-card:before{content:""}.tgico-card_outline:before{content:""}.tgico-channel:before{content:""}.tgico-channelviews:before{content:""}.tgico-chatspinned:before{content:""}.tgico-chatsplaceholder:before{content:""}.tgico-check1:before{content:""}.tgico-checkbox:before{content:""}.tgico-checkboxblock:before{content:""}.tgico-checkboxempty:before{content:""}.tgico-checkboxon:before{content:""}.tgico-checkretract:before{content:""}.tgico-checkround:before{content:""}.tgico-close:before{content:""}.tgico-clouddownload:before{content:""}.tgico-colorize:before{content:""}.tgico-comments:before{content:""}.tgico-commentssticker:before{content:""}.tgico-copy:before{content:""}.tgico-darkmode:before{content:""}.tgico-data:before{content:""}.tgico-delete:before{content:""}.tgico-delete_filled:before{content:""}.tgico-deletedaccount:before{content:""}.tgico-deleteleft:before{content:""}.tgico-deleteuser:before{content:""}.tgico-devices:before{content:""}.tgico-document:before{content:""}.tgico-down:before{content:""}.tgico-download:before{content:""}.tgico-dragfiles:before{content:""}.tgico-dragmedia:before{content:""}.tgico-eats:before{content:""}.tgico-edit:before{content:""}.tgico-email:before{content:""}.tgico-endcall_filled:before{content:""}.tgico-enter:before{content:""}.tgico-eye1:before{content:""}.tgico-eye2:before{content:""}.tgico-fast_forward:before{content:""}.tgico-fast_rewind:before{content:""}.tgico-favourites:before{content:""}.tgico-flag:before{content:""}.tgico-flip:before{content:""}.tgico-folder:before{content:""}.tgico-fontsize:before{content:""}.tgico-forward:before{content:""}.tgico-forward_filled:before{content:""}.tgico-fullscreen:before{content:""}.tgico-gc_microphone:before{content:""}.tgico-gc_microphoneoff:before{content:""}.tgico-gifs:before{content:""}.tgico-group:before{content:""}.tgico-groupmedia:before{content:""}.tgico-groupmediaoff:before{content:""}.tgico-help:before{content:""}.tgico-hide:before{content:""}.tgico-image:before{content:""}.tgico-info:before{content:""}.tgico-info2:before{content:""}.tgico-italic:before{content:""}.tgico-keyboard:before{content:""}.tgico-lamp:before{content:""}.tgico-language:before{content:""}.tgico-largepause:before{content:""}.tgico-largeplay:before{content:""}.tgico-left:before{content:""}.tgico-limit_chat:before{content:""}.tgico-limit_chats:before{content:""}.tgico-limit_file:before{content:""}.tgico-limit_folders:before{content:""}.tgico-limit_link:before{content:""}.tgico-limit_pin:before{content:""}.tgico-link:before{content:""}.tgico-listscreenshare:before{content:""}.tgico-livelocation:before{content:""}.tgico-location:before{content:""}.tgico-lock:before{content:""}.tgico-lockoff:before{content:""}.tgico-loginlogodesktop:before{content:""}.tgico-loginlogomobile:before{content:""}.tgico-logout:before{content:""}.tgico-mediaspoiler:before{content:""}.tgico-mediaspoileroff:before{content:""}.tgico-mention:before{content:""}.tgico-menu:before{content:""}.tgico-message:before{content:""}.tgico-messageunread:before{content:""}.tgico-microphone:before{content:""}.tgico-microphone_crossed:before{content:""}.tgico-microphone_crossed_filled:before{content:""}.tgico-microphone_filled:before{content:""}.tgico-minus:before{content:""}.tgico-monospace:before{content:""}.tgico-more:before{content:""}.tgico-mute:before{content:""}.tgico-muted:before{content:""}.tgico-newchannel:before{content:""}.tgico-newchat_filled:before{content:""}.tgico-newgroup:before{content:""}.tgico-newprivate:before{content:""}.tgico-next:before{content:""}.tgico-noncontacts:before{content:""}.tgico-nosound:before{content:""}.tgico-passwordoff:before{content:""}.tgico-pause:before{content:""}.tgico-permissions:before{content:""}.tgico-phone:before{content:""}.tgico-pin:before{content:""}.tgico-pinlist:before{content:""}.tgico-pinned_filled:before{content:""}.tgico-pinnedchat:before{content:""}.tgico-pip:before{content:""}.tgico-play:before{content:""}.tgico-playback_05:before{content:""}.tgico-playback_15:before{content:""}.tgico-playback_1x:before{content:""}.tgico-playback_2x:before{content:""}.tgico-plus:before{content:""}.tgico-poll:before{content:""}.tgico-premium_addone:before{content:""}.tgico-premium_double:before{content:""}.tgico-premium_lock:before{content:""}.tgico-premium_unlock:before{content:""}.tgico-previous:before{content:""}.tgico-radiooff:before{content:""}.tgico-radioon:before{content:""}.tgico-reactions:before{content:""}.tgico-readchats:before{content:""}.tgico-recent:before{content:""}.tgico-replace:before{content:""}.tgico-reply:before{content:""}.tgico-reply_filled:before{content:""}.tgico-rightpanel:before{content:""}.tgico-rotate_left:before{content:""}.tgico-rotate_right:before{content:""}.tgico-saved:before{content:""}.tgico-savedmessages:before{content:""}.tgico-schedule:before{content:""}.tgico-scheduled:before{content:""}.tgico-search:before{content:""}.tgico-select:before{content:""}.tgico-send:before{content:""}.tgico-send2:before{content:""}.tgico-sending:before{content:""}.tgico-sendingerror:before{content:""}.tgico-settings:before{content:""}.tgico-settings_filled:before{content:""}.tgico-sharescreen_filled:before{content:""}.tgico-shipping:before{content:""}.tgico-shuffle:before{content:""}.tgico-smallscreen:before{content:""}.tgico-smile:before{content:""}.tgico-spoiler:before{content:""}.tgico-sport:before{content:""}.tgico-star:before{content:""}.tgico-stickers:before{content:""}.tgico-stickers_face:before{content:""}.tgico-stop:before{content:""}.tgico-strikethrough:before{content:""}.tgico-textedit:before{content:""}.tgico-tip:before{content:""}.tgico-tools:before{content:""}.tgico-topics:before{content:""}.tgico-unarchive:before{content:""}.tgico-underline:before{content:""}.tgico-unmute:before{content:""}.tgico-unpin:before{content:""}.tgico-unread:before{content:""}.tgico-up:before{content:""}.tgico-user:before{content:""}.tgico-username:before{content:""}.tgico-videocamera:before{content:""}.tgico-videocamera_crossed_filled:before{content:""}.tgico-videocamera_filled:before{content:""}.tgico-videochat:before{content:""}.tgico-volume_down:before{content:""}.tgico-volume_mute:before{content:""}.tgico-volume_off:before{content:""}.tgico-volume_up:before{content:""}.tgico-zoomin:before{content:""}.tgico-zoomout:before{content:""}.tgico-phone_filled:before{content:"";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:" ";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}[dir=ltr] .input-field label{left:1rem}[dir=rtl] .input-field label{right:1rem}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;z-index:2}.is-rtl .input-field label{transform-origin:right center}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-icon{border-radius:.375rem;height:1.5rem;pointer-events:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:1.5rem;z-index:1}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:#fff;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:1.3125;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width)) calc(var(--padding-horizontal) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 1000px #fff;-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:#000!important;color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem;--padding-horizontal:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40!important;color:var(--danger-color)!important}.input-field-input.error~.input-field-border{border-color:#df3f40!important;border-color:var(--danger-color)!important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f!important}.input-field-input.valid~.input-field-border{border-color:#26962f!important}.input-field-input:focus~.arrow-down{border-color:#3390ec;border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 .3125rem;transform:translate(-.1875rem,calc(var(--height)/-2 + .0625rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;position:absolute!important;right:auto!important}.input-field-input-fake{left:0;opacity:0;pointer-events:none;top:0;z-index:-3}.input-fields-row{display:flex}.input-fields-row .input-field{flex:1 1 auto;width:1%}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40!important;color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{animation:input-shake .2s ease-in-out forwards}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){[dir=ltr] .input-search{margin-left:1rem}[dir=rtl] .input-search{margin-right:1rem}}.input-search-input{max-height:var(--height)!important;min-height:var(--height)!important}.input-search-input{--height:42px;background-color:#fff;background-color:var(--input-search-background-color);border-color:#dfe1e5;border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:#c4c9cc!important;border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}[dir=ltr] .input-search>.tgico-search{left:.8125rem}[dir=rtl] .input-search>.tgico-search{right:.8125rem}.input-search>.tgico-search{height:1.5rem;pointer-events:none;width:1.5rem}[dir=ltr] .input-search>.tgico-close{right:0}[dir=rtl] .input-search>.tgico-close{left:0}.input-search>.tgico-close{height:42px;width:42px;z-index:1}[dir=ltr] .input-search>.tgico-close:before{margin-right:-1px}[dir=rtl] .input-search>.tgico-close:before{margin-left:-1px}[dir=ltr] .input-field-password .input-field-input{padding-right:2.5rem}[dir=rtl] .input-field-password .input-field-input{padding-left:2.5rem}.input-field-password .input-field-input{max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-family:Arial,Helvetica,sans-serif;font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top:0}@media(-webkit-min-device-pixel-ratio:2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:""}.input-field-password .toggle-visible.eye-hidden:before{content:""}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{pointer-events:none!important}.btn-icon:disabled,.btn:disabled{opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{border-radius:50%!important}.btn-icon{align-items:center;background-color:transparent;border:none;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}[dir=ltr] .btn-corner{right:var(--offset)}[dir=rtl] .btn-corner{left:var(--offset)}.btn-corner{box-shadow:none!important;padding:0!important;position:absolute!important;transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:#3390ec;background-color:var(--primary-color);border:none;bottom:var(--offset);color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;text-align:center;transform:translate3d(0,var(--translateY),0);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}html.no-touch .btn-corner:active,html.no-touch .btn-corner:hover{background-color:#157ce1;background-color:var(--dark-primary-color)}.btn-corner.is-visible{--translateY:0}body.animation-level-0 .btn-corner{transition:none!important}.btn-corner:disabled{opacity:1!important;pointer-events:all!important}.btn-corner .preloader-circular{height:2.5rem;width:2.5rem}.btn-menu{transform:scale(.8)!important}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),visibility .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:4}.btn-menu-old,.is-mobile .btn-menu{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:#fff;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item,.is-mobile .btn-menu .btn-menu-item{transform:none!important}.btn-menu-old .btn-menu-item,.is-mobile .btn-menu .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:16px;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:21px;line-height:var(--line-height-16);margin:0}.btn-menu-old .btn-menu-item:before,.is-mobile .btn-menu .btn-menu-item:before{align-self:auto;color:#707579;color:var(--secondary-text-color);margin-top:0}.btn-menu-old .btn-menu-footer,.is-mobile .btn-menu .btn-menu-footer{background-color:#f4f4f5;background-color:var(--background-color)}.btn-menu{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;visibility:visible}.btn-menu.active,.is-mobile .btn-menu.was-open{transform:scaleX(1)!important}.btn-menu.bottom-left,.is-rtl .btn-menu.bottom-right{left:auto;right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right,.is-rtl .btn-menu.bottom-left{left:0;right:auto;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;left:auto;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right,.is-rtl .btn-menu.top-left{bottom:100%;left:0;right:auto;top:auto;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}[dir=ltr] .btn-menu-item{text-align:left}[dir=rtl] .btn-menu-item{text-align:right}.btn-menu-item{cursor:pointer!important;pointer-events:all!important}.btn-menu-item{--padding-vertical:.25rem;--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:#000;color:var(--primary-text-color);display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:18px;line-height:var(--line-height-14);margin-left:.3125rem;margin-right:.3125rem;padding:var(--padding-vertical) var(--padding-right) var(--padding-vertical) var(--padding-left);position:relative;text-transform:none;transform:scale(1);white-space:nowrap}.btn-menu-item.tgico-char:before{width:var(--icon-size)}body.animation-level-2 .btn-menu-item{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-menu-item:before{align-self:flex-start;color:#000;color:var(--primary-text-color);font-size:var(--icon-size);margin-top:.125rem}[dir=ltr] .btn-menu-item-icon,[dir=ltr] .btn-menu-item:before{margin-right:var(--icon-margin)}[dir=rtl] .btn-menu-item-icon,[dir=rtl] .btn-menu-item:before{margin-left:var(--icon-margin)}.btn-menu-item-icon,.btn-menu-item:before{position:relative}[dir=ltr] .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - var(--add)/2)}[dir=rtl] .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - var(--add)/2)}[dir=ltr] .btn-menu-item-icon{margin-left:calc(var(--add)/-2)}[dir=rtl] .btn-menu-item-icon{margin-right:calc(var(--add)/-2)}.btn-menu-item-icon{--add:.25rem;--total:calc(var(--icon-size) + var(--add));flex:0 0 auto;height:var(--total);width:var(--total)}.btn-menu-item-icon .media-photo{height:inherit;width:inherit}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}[dir=ltr] .btn-menu-item-text-fake{margin-left:var(--margin-left)}[dir=rtl] .btn-menu-item-text-fake{margin-right:var(--margin-left)}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.btn-menu-item-header{pointer-events:none!important}.btn-menu-item-header{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);height:2rem}[dir=ltr] .btn-menu-item .stacked-avatars{right:.5rem}[dir=rtl] .btn-menu-item .stacked-avatars{left:.5rem}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute}.btn-menu-item.is-multiline{font-size:.75rem;height:auto;max-width:16.25rem;min-width:calc(100% - .625rem);width:-moz-fit-content;width:fit-content}.btn-menu-item.is-multiline .btn-menu-item-text{white-space:pre-wrap;width:-moz-fit-content;width:fit-content}.btn-menu-item .checkbox-field-toggle{padding:0}.btn-menu-overlay{max-width:none!important;position:fixed!important;width:auto!important}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:4}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important}.btn-menu hr{margin:.3125rem auto;opacity:.6;padding:0;width:calc(100% - 1.875rem)}html:not(.is-mobile) .btn-menu .badge{background-color:transparent;color:#707579;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}[dir=ltr] .btn-menu-reactions-container{margin-left:var(--other-side-offset)}[dir=rtl] .btn-menu-reactions-container{margin-right:var(--other-side-offset)}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}[dir=ltr] .btn-menu-reactions-container-vertical{margin-left:var(--menu-offset)}[dir=rtl] .btn-menu-reactions-container-vertical{margin-right:var(--menu-offset)}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),#fff 0,hsla(0,0%,100%,0) 1rem,hsla(0,0%,100%,0) calc(100% - 1rem),#fff 100%);background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:" ";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:#157ce1;background:var(--dark-primary-color);transition:opacity .2s}.btn-primary-transparent{background-color:transparent;color:#3390ec;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:rgba(51,144,236,.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}[dir=ltr] .btn-primary use,[dir=ltr] .btn-primary>svg{right:15px}[dir=rtl] .btn-primary use,[dir=rtl] .btn-primary>svg{left:15px}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto}.btn-primary:disabled{pointer-events:none!important}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity)}[dir=ltr] .btn-control{padding-left:.75rem;padding-right:1.5rem}[dir=rtl] .btn-control{padding-left:1.5rem;padding-right:.75rem}.btn-control{align-items:center;border-radius:1.25rem;display:flex;height:2.5rem;line-height:2.5rem;margin:.9375rem auto 1rem;width:auto}[dir=ltr] .btn-control.tgico:before{margin-right:.375rem}[dir=rtl] .btn-control.tgico:before{margin-left:.375rem}.btn-control.tgico:before{font-size:1.5rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3rem;line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}[dir=ltr] .btn-transparent:before{margin-right:2rem}[dir=rtl] .btn-transparent:before{margin-left:2rem}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem}@media only screen and (max-width:600px){[dir=ltr] .btn-transparent:before{margin-right:1.5rem}[dir=rtl] .btn-transparent:before{margin-left:1.5rem}}[dir=ltr] .btn-transparent.btn-short:before{margin-right:1rem}[dir=rtl] .btn-transparent.btn-short:before{margin-left:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important}.btn-menu-toggle{position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size:54px;border-radius:50%;height:var(--size);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:#707579!important;color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:3.375rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:3.375rem;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:var(--call-button-margin)}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:var(--call-button-margin)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:2rem}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:2rem}[dir=ltr] .btn-update{right:auto!important}[dir=rtl] .btn-update{left:auto!important}.btn-update{padding:0 2rem!important}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:#707579;background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:"";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:"";left:0;position:absolute}.animated-menu-icon:before{top:-.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{animation:none!important}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden}.autocomplete-helper{border-radius:var(--border-radius)!important;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper{--border-radius:10px;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width:319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal)*4)}}.autocomplete-peer-helper .scrollable{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:1.3125;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:#707579;color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{line-height:var(--size)!important}.badge{--size:1.375rem;--padding:.4375rem;border-radius:calc(var(--size)/2);color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);min-width:var(--size);padding:0 var(--padding);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{--size:1.25rem;--padding:.375rem}.badge-24{--size:1.5rem;--padding:.5rem}.badge.tgico:before{font-size:var(--size)}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{border-radius:0!important}.ckin__player.ckin__fullscreen{background:#000;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}@media only screen and (max-width:600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0}[dir=ltr] .default__controls{text-align:left}[dir=rtl] .default__controls{text-align:right}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}@media only screen and (max-width:600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:""}.default .default__gradient-bottom{transform:translate3d(0,50px,0)}.default .default__controls{transform:translate3d(0,52px,0)}@media only screen and (max-width:600px){.default .default__controls{transform:translate3d(0,65px,0)}}.default.show-controls .default__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:""}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4,0,.2,1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.progress-line{--color:var(--primary-color);--height:5px;--border-radius:6px;--thumb-size:13px;border-radius:var(--border-radius);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{background-color:var(--color);border-radius:50%;content:" ";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size)/2)) scale(1.125)}.progress-line:before,.progress-line__loaded{background-color:#c4c9cc;background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}[dir=ltr] .checkbox-field{text-align:left}[dir=rtl] .checkbox-field{text-align:right}.checkbox-field{--size:1.25rem;--offset-left:0px;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{pointer-events:none!important}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}[dir=ltr] .checkbox-field .checkbox-box{left:var(--offset-left)}[dir=rtl] .checkbox-field .checkbox-box{right:var(--offset-left)}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;left:0;right:0}.checkbox-field .checkbox-box-background{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:7px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:3.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}[dir=ltr] .checkbox-field .checkbox-caption{padding-left:3.375rem}[dir=rtl] .checkbox-field .checkbox-caption{padding-right:3.375rem}.checkbox-field .checkbox-caption{color:inherit;line-height:1.3125;line-height:var(--line-height);pointer-events:none;position:relative;transition:opacity .2s}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}[dir=ltr] .checkbox-field.hover-effect .checkbox-box{left:auto}[dir=rtl] .checkbox-field.hover-effect .checkbox-box{right:auto}.checkbox-field .anchor-url{pointer-events:all}.checkbox-ripple{border-radius:10px;overflow:hidden}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size:1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}[dir=ltr] .radio-field{text-align:left}[dir=rtl] .radio-field{text-align:right}.radio-field{--size:1.375rem;--offset-left:0px;cursor:pointer;line-height:1.3125;line-height:var(--line-height);margin:1.25rem 0;position:relative}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}[dir=ltr] .radio-field .radio-field-main{padding-left:3.5rem}[dir=rtl] .radio-field .radio-field-main{padding-right:3.5rem}.radio-field .radio-field-main{color:inherit;position:relative}[dir=ltr] .radio-field .radio-field-main:after,[dir=ltr] .radio-field .radio-field-main:before{left:var(--offset-left)}[dir=rtl] .radio-field .radio-field-main:after,[dir=rtl] .radio-field .radio-field-main:before{right:var(--offset-left)}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:"";display:block;height:var(--size);position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main:before{transition:border-color .1s ease,opacity .1s ease}[dir=ltr] .radio-field .radio-field-main:after{left:calc(var(--offset-left) + .3125rem)}[dir=rtl] .radio-field .radio-field-main:after{right:calc(var(--offset-left) + .3125rem)}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}[dir=ltr] .radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}[dir=rtl] .radio-field.radio-field-right .radio-field-main:before{left:0;right:auto}[dir=ltr] .radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[dir=rtl] .radio-field.radio-field-right .radio-field-main:after{left:.3125rem;right:auto}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:-1;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none!important;transition:background-color .2s!important}.checkbox-field-restriction .checkbox-box-check use{stroke-dasharray:24.19,24.19!important;transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.checkbox-field-restriction .checkbox-box-check use{transform:rotate(0) translateY(0)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0 .25rem;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:#fff;background-color:var(--surface-color);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:50%;content:" ";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s cubic-bezier(.22,.75,.7,1.44)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width:600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:0 0 .5rem}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;margin:0;position:relative;-moz-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist-chat{background:var(--background)!important}.chatlist-chat{--background:unset;-webkit-user-drag:none}.chatlist-chat.is-forum-open,.chatlist-chat.menu-open,html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-filled-secondary-text-color)}[dir=ltr] .chatlist-chat.is-muted .user-title:after{margin-left:.125rem}[dir=rtl] .chatlist-chat.is-muted .user-title:after{margin-right:.125rem}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:"";flex:0 0 auto;font-size:1.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat i{font-style:normal}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat .premium-icon{margin-top:-.125rem}.chatlist-chat .topic-icon{flex:0 0 auto}[dir=ltr] .chatlist-chat .row-title .topic-icon{margin-right:.25rem}[dir=rtl] .chatlist-chat .row-title .topic-icon{margin-left:.25rem}.chatlist-chat .row-title .topic-icon{--size:1.375rem}.chatlist-chat .topic-name .topic-icon{line-height:1!important}.chatlist-chat .topic-name .topic-icon{display:inline}.chatlist-chat .topic-name .topic-icon-svg{position:relative}.chatlist-chat .topic-name .topic-icon-content{left:0;margin-top:-6px;position:absolute;right:0;top:0}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .premium-icon,.chatlist-chat.active .row-subtitle,.chatlist-chat.active .row-title,.chatlist-chat.active .sending-status-icon,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff!important}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active .danger,.chatlist-chat.active .primary-text{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-icon-background{fill:#fff!important}.chatlist-chat.active .verified-icon-check{visibility:hidden}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff!important}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .sending-status-icon.tgico-premium_lock{color:#c4c9cc;color:var(--secondary-color);font-size:.8125rem;margin:.1875rem 0 0 .5rem}[dir=ltr] .chatlist .dialog-title-details{margin-left:.5rem}[dir=rtl] .chatlist .dialog-title-details{margin-right:.5rem}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;padding:1px 0 0}[dir=ltr] .chatlist .dialog-subtitle-badge{margin-left:.5rem}[dir=rtl] .chatlist .dialog-subtitle-badge{margin-right:.5rem}.chatlist .dialog-subtitle-badge{display:block!important}.chatlist .dialog-subtitle-badge{flex:0 0 auto}.chatlist .dialog-subtitle-badge.avatar-badge{line-height:23px!important}.chatlist .dialog-subtitle-badge.avatar-badge{--size:1.625rem;border:2px solid #fff;border:2px solid var(--background,var(--surface-color));margin:0;pointer-events:none;position:absolute;right:calc(100% - 4.0625rem);top:2.4375rem}[dir=ltr] .chatlist .dialog-subtitle-media{margin-right:.375rem}[dir=rtl] .chatlist .dialog-subtitle-media{margin-left:.375rem}.chatlist .dialog-subtitle-media{border-radius:.25rem;display:inline-block;flex:0 0 auto;height:1.25rem;line-height:1.25rem;position:relative;width:1.25rem}.chatlist .dialog-subtitle-media:before{content:" ";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;bottom:auto;height:inherit;-o-object-fit:cover;object-fit:cover;top:auto;width:inherit}.chatlist .dialog-group-call-icon{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .dialog-avatar,.chatlist .row-row{pointer-events:none;position:relative}.chatlist .user-title{display:flex!important}.chatlist .user-title{align-items:center}.chatlist .user-title img.emoji{height:18px;margin-top:1px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1;position:relative}[dir=ltr] .chatlist .message-status{margin-right:.125rem}[dir=rtl] .chatlist .message-status{margin-left:.125rem}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:#0ac630!important;background-color:var(--chatlist-status-color)!important;line-height:1.25rem!important}.chatlist .mention{padding:0}[dir=ltr] .chatlist .mention-badge{margin-right:-.125rem}[dir=rtl] .chatlist .mention-badge{margin-left:-.125rem}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread,.chatlist .no-unmuted-topic .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist .not-visited{background-color:#c4c9cc!important;background-color:var(--secondary-color)!important}.chatlist .not-visited{--size:.5rem;--padding:0}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{margin-bottom:0!important}.chatlist-bottom .sidebar-left-section{padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{max-width:728px!important;max-width:var(--messages-container-width)!important}}@media only screen and (min-width:601px){.chat-input{--padding-bottom:1.25rem}}@media only screen and (max-height:569px){.chat-input{--padding-bottom:0.5rem}}@media only screen and (min-width:1276px){.chat-input{width:calc(100% - var(--right-column-width))!important}body.is-right-column-shown .chat-input{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{position:absolute!important;transform:translate3d(0,var(--translateY),0)!important}.chat-input.is-hidden{--translateY:100%;bottom:0;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0!important}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .toggle-emoticons:before{content:""}.chat-input .toggle-emoticons.flip-icon:before{content:""!important}[dir=ltr] .chat-input .btn-record-cancel{right:0}[dir=rtl] .chat-input .btn-record-cancel{left:0}.chat-input .btn-record-cancel{--multiplier:-1;opacity:0;padding:0;position:absolute;top:0;transform:translateX(calc((100% + var(--padding-horizontal) + .5rem)*var(--multiplier)));visibility:hidden;z-index:3}.chat-input .btn-record-cancel .c-ripple__circle,html.no-touch .chat-input .btn-record-cancel:active:after,html.no-touch .chat-input .btn-record-cancel:hover:after{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.chat-input .btn-record-cancel:before{color:#df3f40;color:var(--danger-color)}.is-rtl .chat-input .btn-record-cancel{--multiplier:1}[dir=ltr] .chat-input .btn-scheduled:after{right:5px}[dir=rtl] .chat-input .btn-scheduled:after{left:5px}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:"";height:.5rem;position:absolute;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{animation:hide-icon .4s ease-in-out forwards!important}[dir=ltr] .chat-input .float{margin-right:.75rem!important}[dir=rtl] .chat-input .float{margin-left:.75rem!important}.chat-input .float{display:none!important;margin:0!important}.chat-input .float{align-self:center}body.animation-level-2 .chat-input .float{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){[dir=ltr] .chat-input .float{margin-right:.125rem!important}[dir=rtl] .chat-input .float{margin-left:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}[dir=ltr] .chat-input .btn-send-container{right:var(--padding-horizontal)}[dir=rtl] .chat-input .btn-send-container{left:var(--padding-horizontal)}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-cancel-record,.chat-input .btn-send{box-shadow:0 1px 8px 1px rgba(0,0,0,.12)}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.chat-input .btn-send{z-index:3}html.no-touch .chat-input .btn-send:active,html.no-touch .chat-input .btn-send:hover{background-color:#157ce1!important;background-color:var(--dark-primary-color)!important}.chat-input .btn-send .tgico-check{height:32px!important}.chat-input .btn-send .tgico-check{font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:500;font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;content:" ";display:inline-block;height:10px;margin-left:9px;margin-right:9px;width:10px}body.animation-level-2 .chat-input .record-time:after{animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;height:300px;opacity:.5;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - var(--chat-input-size)*2 - 1rem)}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}[dir=ltr] .chat-input:not(.is-recording) .btn-record-cancel{margin-right:0}[dir=rtl] .chat-input:not(.is-recording) .btn-record-cancel{margin-left:0}.chat-input:not(.is-recording) .btn-record-cancel{width:0}.chat-input .new-message-wrapper{opacity:1}.chat-input .reply-in-topic-overlay{align-items:center;background-color:inherit;border-radius:inherit;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;padding:0 1rem;pointer-events:none;z-index:3}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@media only screen and (max-width:600px){body.is-left-column-shown #column-center{transform:translate3d(100vw,0,0)}body.is-right-column-shown #column-center{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{position:fixed!important}#column-center{bottom:0;left:0;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem,0,0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex!important}.chat{align-items:center;flex-direction:column;transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 420px)),0,0)}}@media only screen and (min-width:1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)),0,0)}}@media only screen and (min-width:1276px)and (max-width:1680px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(75vw,0,0)}}@media only screen and (max-width:925px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(100vw,0,0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{position:absolute!important}.chat-background,.chat-background-item{bottom:0;left:0;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{background-color:#000!important;background-image:none!important;margin:0!important}.chat-background-item.is-pattern{align-items:center;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)!important}body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center}body.animation-level-2.is-right-column-shown .chat-background-item{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(.666666667)}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:soft-light}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.chat .drops-container{--padding:20px;--pinned-floating-height:0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width:1276px){[dir=ltr] body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}[dir=rtl] body.is-right-column-shown .chat .drops-container{left:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat[data-type=chat] .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:1rem;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);content:" ";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:#fff;background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}[dir=ltr] .chat-input-control-button:before{margin-right:10px}[dir=rtl] .chat-input-control-button:before{margin-left:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}[dir=ltr] .selection-wrapper .selection-container .btn-icon{margin-left:6px;margin-right:5px}[dir=rtl] .selection-wrapper .selection-container .btn-icon{margin-left:5px;margin-right:6px}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;width:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width:600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width:380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}[dir=ltr] .selection-wrapper .selection-container-forward:before{margin-right:14px}[dir=rtl] .selection-wrapper .selection-container-forward:before{margin-left:14px}[dir=ltr] .selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}[dir=rtl] .selection-wrapper .selection-container-delete{margin-left:.625rem;margin-right:.375rem}[dir=ltr] .selection-wrapper .selection-container-delete:before{margin-right:10px}[dir=rtl] .selection-wrapper .selection-container-delete:before{margin-left:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}[dir=ltr] .fake-rows-wrapper{left:var(--padding-horizontal)}[dir=rtl] .fake-rows-wrapper{right:var(--padding-horizontal)}.fake-rows-wrapper{top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}[dir=ltr] .rows-wrapper{border-bottom-right-radius:0}[dir=rtl] .rows-wrapper{border-bottom-left-radius:0}.rows-wrapper{transform:translateX(0) scaleX(1)}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width:600px){.rows-wrapper{--padding-vertical:1px}}@media only screen and (max-width:420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height:569px){.rows-wrapper{--padding-vertical:1px}}[dir=ltr] .rows-wrapper .bubble-tail{right:-8.4px}[dir=rtl] .rows-wrapper .bubble-tail{left:-8.4px}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;transform:scaleX(-1);width:11px}.is-rtl .rows-wrapper .bubble-tail{transform:scaleX(1)}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:1rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .reply-wrapper{margin-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin-left:.625rem;margin-right:.625rem;order:1}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579!important;color:var(--secondary-text-color)!important}.rows-wrapper .reply-wrapper .reply-subtitle{height:1.125rem}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:3.125rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:3.125rem}.rows-wrapper .reply-wrapper .btn-menu{transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);top:auto}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item{padding-left:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-right:var(--icon-margin)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-left:var(--icon-margin)}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#000;stroke:var(--primary-text-color)}@media only screen and (max-width:600px){[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .input-message-input{max-height:27.5rem!important}.rows-wrapper .input-message-input{margin-top:-1px}@media only screen and (max-height:30rem){.rows-wrapper .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.rows-wrapper .input-message-input{max-height:10rem}}.rows-wrapper .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-left:var(--commands-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-right:var(--commands-margin-left)}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-left:var(--send-as-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-right:var(--send-as-margin-left)}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container{height:var(--send-as-size);width:var(--send-as-size)}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:auto}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:auto}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:calc(var(--padding-horizontal)*-1 - .25rem)!important}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:calc(var(--padding-horizontal)*-1 - .25rem)!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;max-height:20rem;max-width:20rem;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid #3390ec;border:.0625rem solid var(--primary-color);border-radius:inherit;bottom:var(--offset);content:" ";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{line-height:1!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}[dir=ltr] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-right:var(--translateX)}[dir=rtl] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-left:var(--translateX)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin-bottom:5px;margin-left:var(--button-horizontal-margin);margin-right:var(--button-horizontal-margin);margin-top:0;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.input-message-container .scrollable{position:relative}.input-message-input{--custom-emoji-size:var(--messages-custom-emoji-size);background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.input-message-input pre{display:inline;margin:0}body.animation-level-2 .input-message-input{transition:height .1s}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:opacity var(--layer-transition),visibility 0s 0s!important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY:calc(var(--chat-input-size)*-1 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles-inner{transition:none!important}@media only screen and (min-width:1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width:600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner:after{content:" ";height:.125rem}[dir=ltr] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}[dir=rtl] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-right:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - 2.875rem)!important;max-width:calc(100% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner.is-chat .name,.bubbles-inner:not(.is-channel) .message,.bubbles-inner:not(.is-channel) .name{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999!important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY)*-1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width:1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{transform:none!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-mention{--translateY:0;cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention.is-visible{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible}.chat-secondary-button{background-color:#fff!important;background-color:var(--surface-color)!important;box-shadow:0 1px 8px 1px rgba(0,0,0,.12)!important}.chat-secondary-button{align-items:center;border-radius:50%;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;position:absolute}body.animation-level-0 .chat-secondary-button{transition:none!important}.chat-secondary-button:before{position:relative}.chat-secondary-button:after{border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}html.no-touch .chat-secondary-button:active:after,html.no-touch .chat-secondary-button:hover:after{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}[dir=ltr] .bubbles-corner-button{right:var(--chat-input-padding)}[dir=rtl] .bubbles-corner-button{left:var(--chat-input-padding)}.bubbles-corner-button{bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);overflow:visible;z-index:2}[dir=ltr] .bubbles-corner-button .badge{right:-.25rem}[dir=rtl] .bubbles-corner-button .badge{left:-.25rem}.bubbles-corner-button .badge{position:absolute;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){[dir=ltr] .bubbles-corner-button .badge{right:.1875rem}[dir=rtl] .bubbles-corner-button .badge{left:.1875rem}.bubbles-corner-button .badge{top:-.75rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height:var(--topbar-call-height)}@media only screen and (min-width:1276px){body.is-right-column-shown{--topbar-floating-scaleX:calc(1 - var(--right-column-proportion))}}.topbar{cursor:pointer!important;max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important}.topbar{--topbar-height:3.5rem;--pinned-floating-audio-height:0px;--pinned-floating-message-height:0px;--pinned-floating-height:calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height:52px;--pinned-message-height:52px;margin-bottom:var(--pinned-floating-height);position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:" ";height:calc(var(--topbar-height) + var(--pinned-floating-height));height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height:var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height:var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width:601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width:926px){.chat:first-child .topbar .sidebar-close-button{display:none}[dir=ltr] .chat:first-child .topbar .chat-info{padding-left:.1875rem}[dir=rtl] .chat:first-child .topbar .chat-info{padding-right:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 4.375rem);max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}[dir=ltr] .topbar .chat-info{padding-left:49px}[dir=rtl] .topbar .chat-info{padding-right:49px}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden}@media only screen and (max-width:600px){[dir=ltr] .topbar .chat-info{padding-left:52px}[dir=rtl] .topbar .chat-info{padding-right:52px}}@media only screen and (min-width:1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width:600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}[dir=ltr] .topbar .chat-join{margin-right:.5rem}[dir=rtl] .topbar .chat-join{margin-left:.5rem}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}[dir=ltr] .topbar .content{padding-left:1.125rem}[dir=rtl] .topbar .content{padding-right:1.125rem}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height:0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}[dir=ltr] .chat:not([data-type=chat]) .topbar .content{padding-left:16px}[dir=rtl] .chat:not([data-type=chat]) .topbar .content{padding-right:16px}[dir=ltr] .topbar-call-container{left:1px;right:0}[dir=rtl] .topbar-call-container{left:0;right:1px}.topbar-call-container{cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;min-height:auto!important}.topbar-call-container{color:#fff;position:absolute;top:-3rem;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){[dir=ltr] .topbar-call-container{left:0}[dir=rtl] .topbar-call-container{right:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}[dir=ltr] .topbar-call-left .btn-icon{margin-right:.375rem}[dir=rtl] .topbar-call-left .btn-icon{margin-left:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500;font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width)*-.5),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scaleY(-1);transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}.is-rtl .topbar-call-weave{transform-origin:right center}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubbles-group{position:relative}.bubbles-group-avatar{position:sticky!important}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{--line-height:var(--messages-line-height);display:flex;flex-wrap:wrap;margin:0 auto .125rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:2.375rem;width:var(--message-beside-button-size)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem!important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.0625rem;content:" ";left:-50%;position:absolute;top:-.0625rem;z-index:-1}.bubble.is-highlighted:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:#fff;background-color:var(--surface-color);color:#3390ec;color:var(--primary-color);content:"Unread messages";font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.0625rem + 30px)}.bubble.is-selected:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0!important}.bubble-select-checkbox{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:#fff;background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;user-select:text}.bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(-1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button.goto-original{transform:translateX(-1.125rem) rotate(180deg)}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:var(--size);bottom:0;box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34,1.56,.64,1),transform .2s cubic-bezier(.34,1.56,.64,1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{font-weight:500;font-weight:var(--font-weight-bold);opacity:.99999;padding-bottom:.375rem;pointer-events:none;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat[data-type=chat] .bubble.is-date .bubble-content,.chat[data-type=discussion] .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{opacity:1!important;transition:none!important;visibility:visible!important}.bubble.is-date.is-fake{left:50%;position:absolute;top:0;transform:translateX(-50%)}.bubble-beside-button{align-items:center;background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:#fff;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);transform:translateX(0);width:2.375rem;width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.bubble-view-button{text-decoration:none!important}.bubble-view-button{align-items:center;border:1px solid #3390ec;border:1px solid var(--message-primary-color);border-radius:6px;color:#3390ec;color:var(--message-primary-color);display:flex;height:2rem;justify-content:center;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble-view-button:active,html.no-touch .bubble-view-button:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble-view-button .c-ripple__circle{background-color:#3390ec;background-color:var(--message-primary-color);opacity:.08}.message .bubble-view-button{margin:.375rem 0 -.375rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.bubble-view-button+.reactions-block{margin-top:.375rem}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0!important}.bubble.webpage .preview-with-document{min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble .canvas-thumbnail{border-radius:inherit}.bubble .canvas-dots{z-index:1}.bubble.emoji-big{--emoji-size:1rem;font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big .attachment{border-radius:0!important}.bubble.emoji-big .attachment{--custom-emoji-size:var(--emoji-size)}.bubble.emoji-big .attachment img.emoji{height:var(--emoji-size);max-height:64px;max-width:64px;width:var(--emoji-size)}.bubble.emoji-big .attachment .custom-emoji,.bubble.emoji-big .attachment .emoji{display:inline-block}.bubble.emoji-big:not(.sticker) .attachment{max-height:-moz-fit-content!important;max-height:fit-content!important}.bubble.emoji-big:not(.sticker) .attachment{display:block;font-size:var(--emoji-size);padding-bottom:1.25rem;padding-top:.25rem;white-space:pre-wrap;word-break:break-word}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-big:not(.sticker) .bubble-content{max-width:min(420px,100%)}.bubble.just-media .bubble-content{background:none!important}.bubble.just-media .bubble-content{box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:rgba(109,141,65,.4);background:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{position:relative!important;right:0!important}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:280px!important;height:var(--round-video-size)!important;max-height:280px!important;max-height:var(--round-video-size)!important;max-width:280px!important;max-width:var(--round-video-size)!important;width:280px!important;width:var(--round-video-size)!important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;z-index:1}.bubble .media-container-fitted{background-color:transparent!important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none!important}.bubble .album-item .bubble-select-checkbox{bottom:auto!important}.bubble .album-item .bubble-select-checkbox{left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4,0,.2,1),border-radius .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .attachment{pointer-events:none}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;padding:.75rem 1rem .875rem!important}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-size:1rem!important}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem!important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{cursor:pointer;height:200px;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:1.3125;line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .text,.bubble .web .title,.bubble .web .webpage-name{font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:#3390ec;background-color:var(--primary-color);border-radius:.125rem;content:" ";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{--font-size:var(--messages-secondary-text-size)}.bubble .document-name{font-size:16px;font-size:var(--messages-text-size)}.bubble .document-size{font-size:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}.bubble:not(.just-media) .reply{border-radius:6px}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .floating-part{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin:0;max-width:15rem;padding:.375rem .625rem;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .floating-part{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important}.bubble.just-media .name{line-height:1.3125;line-height:var(--line-height);padding:.375rem .625rem}.bubble.just-media .name .peer-title{font-weight:400!important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width:600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{max-width:none!important}.bubble.just-media .reply-content{margin-top:0;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message,.bubble .service-msg{--custom-emoji-size:var(--messages-custom-emoji-size)}.bubble .message{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message .custom-emoji{display:inline-flex}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{max-width:min(100%,335px)!important}.bubble .message.audio-message{width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important}.bubble .message.audio-message{width:280px}}.bubble .message.voice-message .document-message{max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold)}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px!important}.bubble .message.document-message .document{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:"";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document .time{align-self:flex-start;height:0}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{padding:0!important}.bubble.is-multiple-documents .message{border-radius:inherit}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-2}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:#fff;background-color:var(--message-background-color);border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection{animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection{animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit;content:" ";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.0625rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.0625rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.25rem}.bubble.is-multiple-documents .document{height:54px!important}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document{height:38px!important}}.bubble.is-multiple-documents .document-wrapper{padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .bubble-content-wrapper{width:-moz-min-content;width:min-content}.bubble.is-message-empty .message{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:calc(12px + .375rem);height:calc(var(--messages-time-text-size) + .375rem);margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff!important}.bubble.is-message-empty.with-replies:not(.sticker):not(.with-beside-replies) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):active:after,html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):hover:after{background-color:#fff}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble.with-beside-replies .bubble-content{min-height:5.5rem}.bubble .colored-name .premium-icon{color:inherit;opacity:.6}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;font-size:var(--messages-time-text-size);height:12px;height:var(--messages-time-text-size);line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;color:#707579;color:var(--message-time-color);display:flex;height:12px;height:var(--messages-time-text-size);line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .inner:after{color:var(--message-status-color)}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble .time.is-block{display:block;float:none}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{--height:calc(var(--messages-time-text-size) + 0.375rem);align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:var(--height);color:#fff;display:flex;font-size:12px;font-size:var(--messages-time-text-size);height:var(--height);left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:"";font-size:20px;font-size:calc(var(--messages-time-text-size) + 8px);padding:0 1px 0 3px}[dir=ltr] .bubble .video-time.is-error:after{margin-left:1px}[dir=rtl] .bubble .video-time.is-error:after{margin-right:1px}.bubble .video-time.is-error:after{content:"";font-size:16px;font-size:calc(var(--messages-time-text-size) + 4px);padding:0}.bubble .extended-media-buy{align-items:center;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(0,0,0,.3);border-radius:2rem;color:#fff;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;left:50%;padding:0 1rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap;z-index:2}.bubble .extended-media-buy:before{font-size:1.125rem;margin-right:.25rem}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:14px;font-size:var(--messages-secondary-text-size);line-height:calc(14px + .25rem);line-height:calc(var(--messages-secondary-text-size) + .25rem);max-width:100%;overflow:hidden;padding:.375rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo:not(.is-reply) .bubble-content>.name,.bubble:not(.webpage).video:not(.is-reply) .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage).photo .topic-name-button-container,.bubble:not(.webpage).video .topic-name-button-container{margin-bottom:0}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:#fff;fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);color:#3390ec;color:var(--primary-color);display:flex;height:3.0625rem;min-width:15rem;padding:0 .5rem;position:relative}html.no-touch .bubble .replies-footer:active,html.no-touch .bubble .replies-footer:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .bubble .replies-footer:active~.bubble-tail,html.no-touch .bubble .replies-footer:hover~.bubble-tail{fill:#eff6fd;fill:var(--light-filled-message-primary-color)}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:#3390ec;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;position:static!important;right:auto!important}.bubble .message .reactions-block .time{order:100}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubble.with-reply-markup .bubble-content{border-bottom-left-radius:6px!important;border-bottom-right-radius:6px!important}.bubble .name-with-reply .name{padding:0!important}.bubble .name-with-reply .name:not(:last-child) .hide-ol{display:none}.bubble .name-with-reply .name:not(:last-child) .peer-title{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name-with-reply .reply{height:auto;margin:.25rem 0 0;max-height:none;padding:0}.bubble .topic-name-button{--color:var(--message-primary-color)}.bubble .name .topic-name-button-container{margin:.25rem -.125rem}.bubble .name .topic-name-button-container:first-child{margin-top:0}.bubble.is-message-empty:not(.is-reply) .name .topic-name-button-container{margin-bottom:0}.bubble:not(.is-group-first) .topic-name-button-container{display:none!important}.bubble .topic-name-button-container.floating-part{font-size:14px;font-size:var(--messages-secondary-text-size);padding-bottom:0;padding-top:0}.bubble .topic-name-button-container.floating-part .topic-name-button{--color:#fff;padding:0}.bubble .topic-name-button-container.floating-part .topic-name-button:before{content:none}.bubble .topic-name-button-container.floating-part+.floating-part{margin-top:1.75rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.0625rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type .document-container:last-of-type .document-selection,.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type:after{bottom:-.0625rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@media only screen and (min-width:601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width:600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:15px;font-size:var(--messages-service-text-size);justify-content:center;line-height:20px;line-height:calc(var(--messages-service-text-size) + 5px);padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title,.bubble.service .service-msg [data-saved-from],.bubble.service .service-msg a{cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold)}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{text-decoration:underline}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0!important}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .floating-part{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .floating-part{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .audio-time,.bubble.is-in .contact-number{color:#707579!important;color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:#df3f40;color:var(--monospace-text-color)}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:active,html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--message-background-color:var(--light-filled-message-out-primary-color);--light-message-background-color:var(--light-message-out-primary-color);--dark-message-background-color:var(--dark-message-out-primary-color);--link-color:var(--message-out-link-color);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);--selection-background-color:var(--message-out-selection-background-color);--message-time-color:var(--message-out-time-color);--message-status-color:var(--message-out-status-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width:1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0!important}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .floating-part{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e!important;background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:#4fae4e!important;color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{font-size:19px;font-size:calc(var(--messages-text-size) + 3px);line-height:12px;line-height:var(--messages-time-text-size);margin-left:1px}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:""}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:""}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:""}.bubble.is-out.is-error .time .inner:after,.bubble.is-out.is-error .time:after{color:#df3f40;color:var(--message-error-color);content:""}.bubble.is-out .document-ico:after{border-right-color:#fff;border-right-color:var(--message-background-color);border-top-color:#fff;border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e!important;fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#e1f9d2;color:var(--light-filled-message-out-primary-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color:var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:-2.875rem;left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{margin-top:.0625rem;width:100%}.bubble:not(.is-group-last) .reply-markup{margin-bottom:.125rem}.reply-markup-row{display:flex;margin-top:.125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child .reply-markup-button:first-child{border-bottom-left-radius:12px}.reply-markup-row:last-child .reply-markup-button:last-child{border-bottom-right-radius:12px}.reply-markup-button{color:#fff!important}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:.375rem;cursor:pointer;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button-text{pointer-events:none;position:relative}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button+.reply-markup-button{margin-left:.125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:"";transform:rotate(-45deg)}.reply-markup-button.is-buy:before{content:""}.reply-markup-button.is-switch-inline:before{content:""}.bubble-beside-button:after,.bubble.just-media .reply:after,.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}html.no-touch .bubble-beside-button:active:after,html.no-touch .bubble-beside-button:hover:after,html.no-touch .bubble.just-media .reply:active:after,html.no-touch .bubble.just-media .reply:hover:after,html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.bubble-primary-color{color:#3390ec;color:var(--message-primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.pinned-message{--custom-emoji-size:calc(var(--font-size) + 2px)!important}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:" ";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(#fff,transparent);background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,#fff);background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:#3390ec;background:var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{--font-size:var(--font-size-14);--custom-emoji-size:calc(var(--font-size) + 4px);--line-height:calc(var(--font-size) + 4px);align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pinned-message-content,.reply-content{display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;justify-content:center;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;width:2rem!important}.pinned-message-media,.reply-media{left:0;overflow:hidden;position:absolute;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.pinned-message-media>video,.reply-media>img,.reply-media>video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:#707579;color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:#3390ec;background:var(--primary-color);border-radius:1px;height:calc(32px + .25rem);height:calc(var(--font-size)*2 + .25rem);min-width:2px}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0!important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:#fff!important;background-color:var(--surface-color)!important;position:absolute!important}.pinned-container.is-floating{height:var(--container-height);left:0;margin:0;max-height:var(--container-height);right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@media only screen and (max-width:600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width:1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height:var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:"#"}.pinned-message .animated-counter.is-last:not(.backwards){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat[data-type=discussion] .pinned-message .pinned-container-close{display:none!important}.pinned-audio{--progress-height:.25rem}.pinned-audio.is-floating{--container-height:var(--pinned-audio-height)}.pinned-audio:not(.is-floating){max-width:210px;padding-right:1.75rem;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible!important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0!important}.pinned-audio-ico:before{content:""}.pinned-audio-ico.flip-icon:before{content:""}.pinned-audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width:1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:" ";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:#fff;background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),width .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:#dfe1e5;background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important}.markup-tooltip .btn-icon{height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:72px;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{background:none}.emoji-helper{padding:.25rem 0!important}.emoji-helper{height:50px}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:after,.emoji-helper .super-emojis:before{content:" ";display:inline-block;width:.25rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:#dfe1e5;background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{left:.5rem;overflow:hidden;position:absolute}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{height:auto!important;width:auto!important}.inline-helper .gif{bottom:0;left:0;position:absolute;right:0;top:0}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(72px,1fr));grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:#707579;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{position:absolute!important}.chat-search{left:0;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:#fff;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:#707579;color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:#fff;background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{position:absolute!important;width:auto!important}.drops-container{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:#3390ec;stroke:var(--primary-color);animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.bot-commands{animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;padding:var(--offset) var(--offset) 0!important;position:absolute!important;transition:none!important;visibility:visible!important;width:auto!important}.bot-commands{--border-radius-padding:24px;--offset:.5rem;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;pointer-events:none;right:calc(var(--offset)*-1)}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{max-height:207px!important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);height:auto;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{border-radius:0!important}.bot-commands-list-element{align-items:flex-start;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:18px;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.crop.is-forum .crop-overlay{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.sidebar-header{align-items:center;background-color:#fff;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding-left:1rem;padding-right:1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding-left:.5rem;padding-right:.5rem}}[dir=ltr] .sidebar-header__title{padding-left:1.5rem}[dir=rtl] .sidebar-header__title{padding-right:1.5rem}.sidebar-header__title{color:#000;color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}[dir=ltr] .sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}[dir=rtl] .sidebar-header .btn-icon+.btn-icon{margin-right:.5rem}.sidebar-header-right{flex:0 0 auto}.scrollable-y-bordered .sidebar-header{position:relative}.scrollable-y-bordered .sidebar-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:" ";height:1px;left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .scrollable-y-bordered .sidebar-header:after{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.scrollable-y-bordered:not(.scrolled-top) .sidebar-header:after{opacity:1}.sidebar-close-button{overflow:inherit!important}.sidebar-close-button{flex:0 0 auto;height:2.5rem;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0!important}.profile-avatars-avatars{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:" ";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}[dir=ltr] .profile-avatars-info{left:1.5rem}[dir=rtl] .profile-avatars-info{right:1.5rem}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;pointer-events:none;position:absolute}[dir=ltr] .profile-avatars-info .profile-name,[dir=ltr] .profile-avatars-info .profile-subtitle{text-align:left}[dir=rtl] .profile-avatars-info .profile-name,[dir=rtl] .profile-avatars-info .profile-subtitle{text-align:right}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .premium-icon{color:#fff}.profile-avatars-info .verified-icon-background{fill:#fff}.profile-avatars-info .verified-icon-check{visibility:hidden}.profile-avatars-info .premium-icon,.profile-avatars-info .profile-subtitle,.profile-avatars-info .verified-icon{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}[dir=ltr] .profile-change-avatar{right:1.25rem}[dir=rtl] .profile-change-avatar{left:1.25rem}.profile-change-avatar{position:absolute!important;transition:none!important}.profile-change-avatar{--size:3.375rem;top:calc(var(--size)/-2);transform:none}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:#000;color:var(--primary-text-color);display:flex;font-size:20px;font-size:var(--font-size-20);font-weight:500;font-weight:var(--font-weight-bold);line-height:26px;line-height:var(--line-height-20);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem;justify-content:center;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;content:" ";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3rem);--padding-horizontal:0px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:" ";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px 10px 0 0}.menu-horizontal-div-item{transition:none!important}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:1.3125;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:#3390ec;background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:-.8125rem;box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:#f4f4f5;background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none!important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4,0,.2,1),filter .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;min-width:min(100%,18rem)}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}[dir=ltr] #column-left:after{right:-1px}[dir=rtl] #column-left:after{left:-1px}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:" ";display:block;height:100vh;position:absolute;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:26.5rem}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width:926px){#column-left{display:flex}}@media only screen and (max-width:1275px){#column-left{flex:2}}@media only screen and (min-width:1681px){html.is-safari #column-left{max-width:418.75px}}#column-left .item-main .menu-horizontal-scrollable{background-color:#fff;background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .item-main .menu-horizontal-scrollable .scrollable{position:relative}[dir=ltr] #column-left .item-main .menu-horizontal-scrollable .badge{margin-left:5px}[dir=rtl] #column-left .item-main .menu-horizontal-scrollable .badge{margin-right:5px}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--scrollable-size));position:relative}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .item-main .menu-horizontal-div{position:relative!important}#column-left .item-main .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;z-index:0}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .item-main .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .item-main .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main{--offset-top:0;background-color:#fff;background-color:var(--surface-color)}[dir=ltr] #column-left .item-main .input-search .selector-user{left:6px}[dir=rtl] #column-left .item-main .input-search .selector-user{right:6px}[dir=ltr] #column-left .item-main .input-search .selector-user{margin-left:0}[dir=rtl] #column-left .item-main .input-search .selector-user{margin-right:0}#column-left .item-main .input-search .selector-user{position:absolute!important}#column-left .item-main .input-search .selector-user{height:30px;line-height:1.875rem;top:6px;z-index:1}[dir=ltr] #column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}[dir=rtl] #column-left .item-main .input-search.is-picked .input-search-input{padding-right:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block!important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}[dir=ltr] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}[dir=rtl] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{right:38px}[dir=ltr] #column-left .item-main .search-helper{margin-left:28px}[dir=rtl] #column-left .item-main .search-helper{margin-right:28px}#column-left .item-main .search-helper{display:flex}@media only screen and (max-width:600px){[dir=ltr] #column-left .item-main .search-helper{margin-left:20px}[dir=rtl] #column-left .item-main .search-helper{margin-right:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none!important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{position:relative!important}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto!important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%,-50%)}#column-left #chatlist-container{background-color:#fff;background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:4}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width:600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);min-width:260px}[dir=ltr] #column-left .sidebar-tools-button .btn-menu-item{padding-right:.375rem}[dir=rtl] #column-left .sidebar-tools-button .btn-menu-item{padding-left:.375rem}[dir=ltr] #column-left .archived-count{margin-left:.625rem}[dir=rtl] #column-left .archived-count{margin-right:.625rem}#column-left .archived-count{justify-self:flex-end}html[dir=ltr].is-mobile #column-left .archived-count{margin-right:.375rem}html[dir=rtl].is-mobile #column-left .archived-count{margin-left:.375rem}@media only screen and (max-width:600px){#column-left .archived-count{font-weight:500;font-weight:var(--font-weight-bold)}}#column-left .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding:0 0 1px}#column-left .search-group-people .chatlist:after,#column-left .search-group-people .chatlist:before{content:" ";display:inline-block;flex:0 0 auto;width:.3125rem}#column-left .search-group-people .chatlist-chat{padding:0!important}#column-left .search-group-people .chatlist-chat{align-items:center;display:flex;flex:0 0 auto;flex-direction:column;height:6.125rem;justify-content:flex-end;max-width:4.875rem;width:4.875rem}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .dialog-title{max-width:65px;padding-bottom:.75rem}#column-left .search-group-people .dialog-title .user-title{font-size:.75rem!important}#column-left .search-group-people .dialog-title .peer-title{font-weight:400!important;font-weight:var(--font-weight-normal)!important}[dir=ltr] #column-left .search-group-people .dialog-avatar{left:auto!important}[dir=rtl] #column-left .search-group-people .dialog-avatar{right:auto!important}#column-left .search-group-people .dialog-avatar{top:.75rem!important}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){[dir=ltr] #column-left .search-group-people .search-group-scrollable{margin-left:-7px}[dir=rtl] #column-left .search-group-people .search-group-scrollable{margin-right:-7px}#column-left .search-group-people .search-group-scrollable{margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{position:fixed!important}#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}[dir=ltr] #column-left .connection-status-button{padding-left:4.5rem}[dir=rtl] #column-left .connection-status-button{padding-right:4.5rem}[dir=ltr] #column-left .connection-status-button{text-align:left}[dir=rtl] #column-left .connection-status-button{text-align:right}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}[dir=ltr] #column-left .connection-status-button .preloader-container{left:1rem}[dir=rtl] #column-left .connection-status-button .preloader-container{right:1rem}#column-left .connection-status-button .preloader-container{height:1.5rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:#fff;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{width:100%}}#search-container{top:var(--offset-top)!important}#search-container{display:flex}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{margin-left:23px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{margin-right:23px}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{padding-right:24px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{padding-left:24px}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:14px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{height:15rem;padding-bottom:0}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:0 auto;max-width:20rem;text-align:center}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-categories .checkbox-field{right:1.125rem!important}.folder-categories .checkbox-field{position:absolute}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}[dir=ltr] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}[dir=rtl] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-right:26px}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width:600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width:601px){.search-group-recent.search-group.search-group-contacts{padding:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0!important}.sidebar-left-section.with-fake-delimiter{box-shadow:none}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@media only screen and (max-width:600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width:601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}[dir=ltr] .sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}[dir=rtl] .sidebar-left-section-content>.checkbox-field .checkbox-box{right:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-content>.media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:#707579;color:var(--secondary-text-color);font-size:1rem;line-height:1.3125;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none!important}.sidebar-left-section-disabled{opacity:.25}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:#fff!important;background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff!important;background-color:var(--surface-color)!important}.two-step-verification .sidebar-left-section{box-shadow:none!important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem!important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{right:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width:601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row-title:first-child{font-weight:500;font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:#707579;color:var(--secondary-text-color);font-size:12px;font-size:var(--font-size-12);line-height:16px;line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (min-width:601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height:2px;--color:var(--primary-color);--border-radius:4px;--thumb-size:12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .background-item:after{border:3px solid #3390ec;border:3px solid var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .background-item.active:after{opacity:1}.background-container .background-item.active .grid-item-media{transform:scale(.91)}.background-container .background-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .background .preloader-container{z-index:1}.background-item{cursor:pointer}.background-item-media{border-radius:inherit}.background-item-media.is-pattern{background-color:#000;bottom:0;left:0;position:absolute;right:0;top:0}.background-item-media.is-pattern .media-photo{mix-blend-mode:soft-light}.background-item .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-colors-canvas{border-radius:inherit;height:100%;-webkit-mask-position:center;-webkit-mask-size:cover;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{width:21rem!important}.empty-placeholder{line-height:1.3125;line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;user-select:none}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}[dir=ltr] .empty-placeholder .btn-control:before{margin-right:.625rem}[dir=rtl] .empty-placeholder .btn-control:before{margin-left:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}.is-forum-visible .can-have-forum .input-search,.is-forum-visible .can-have-forum .row-row,.is-forum-visible .can-have-forum .sidebar-header__title{opacity:0}.is-forum-visible .folders-tabs-scrollable{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none}.is-forum-visible.backwards .can-have-forum .input-search,.is-forum-visible.backwards .can-have-forum .row-row,.is-forum-visible.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.backwards .folders-tabs-scrollable{opacity:1}.is-forum-visible.animating .can-have-forum .input-search,.is-forum-visible.animating .can-have-forum .row-row,.is-forum-visible.animating .can-have-forum .sidebar-header__title,.is-forum-visible.animating .folders-tabs-scrollable{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.is-forum-visible.animating.backwards .can-have-forum .input-search,.is-forum-visible.animating.backwards .can-have-forum .row-row,.is-forum-visible.animating.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.animating.backwards .folders-tabs-scrollable{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}#column-right{overflow:visible;overflow:initial;position:relative}@media only screen and (min-width:601px)and (max-width:1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width:600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw,0,0)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}@media only screen and (min-width:601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}}#column-right #search-private-container .chatlist-container{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{margin:.75rem 0;max-width:100%;padding:0 .75rem;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(100vh - 56px);min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .search-super-tabs{--padding-horizontal:0}.shared-media-container .search-super-tabs .menu-horizontal-div-item{border-radius:0!important}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:""}@media only screen and (max-width:600px){.shared-media-container .btn-corner{position:fixed!important}.shared-media-container .btn-corner{bottom:14px;height:54px;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{flex:1 1 auto;width:auto}.search-super-tabs-scrollable{box-shadow:none!important;position:sticky!important}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:" ";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:#fff!important;background-color:var(--surface-color)!important}.search-super-tabs-container>div{min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.search-super-tabs-container .preloader{position:absolute!important}.search-super-tabs-container .preloader{padding:0;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:2}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute!important}.search-super .checkbox-field{margin:0;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width:600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:" ";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{--offset-left:0!important;margin:2rem 0 0 -1.75rem!important;padding:0!important}@media only screen and (min-width:601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width:600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 20px}@media only screen and (max-width:600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;margin-bottom:1.5rem}@media only screen and (min-width:601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-bottom:.5rem;padding-top:.5rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent!important}.search-super-selection-container{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width:600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short .chatlist-chat:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:500;font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:#707579;color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{margin:0 .5rem;width:auto}@media only screen and (max-width:600px){#poll-results-container .poll-results-more{border-radius:0;margin:0}}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{display:block!important}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem!important}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem!important}.edit-contact-container .avatar-placeholder{filter:none!important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem!important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem!important}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@media only screen and (max-width:600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width:600px){.media-viewer-userpic{display:none}}.media-viewer-name{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:1.3125;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9!important}.media-viewer-caption .scrollable{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width:600px){.media-viewer-caption{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0,-69px,0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{opacity:1!important}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{background-color:#000}}.media-viewer-caption.is-focused{opacity:1!important}.media-viewer-caption.is-focused{background-color:#000}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width:600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width:601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{min-height:auto!important;position:fixed!important}.media-viewer-mover{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;overflow:hidden;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover .canvas-thumbnail,.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration)/8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none!important}.media-viewer-mover.center{left:50%!important;top:50%!important;transform:translate3d(-50%,-50%,0)!important}.media-viewer-mover.center{max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-width:100vw!important;width:100%!important}.media-viewer-mover.center{max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center .canvas-thumbnail,.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding .canvas-thumbnail,.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{position:fixed!important}.media-viewer-whole{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width:600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important}.media-viewer-whole.hide-caption .media-viewer-caption{pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards .canvas-thumbnail,.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:""}.tgico-zoom.zoom-in:before{content:""}.zoom-container{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0!important}.zoom-container.is-visible~.media-viewer-caption{pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{position:fixed!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:#fff;background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(100vh - 135px));height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{position:absolute!important;width:23.875rem!important}.emoji-dropdown{-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:1.25rem;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;transform:scale(0);transform-origin:0 100%;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs:after{content:none}.emoji-dropdown .emoji-tabs-search{margin-left:.5rem!important}.emoji-dropdown .emoji-tabs-search{left:0;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 .75rem}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .stickers-padding .category-items{gap:.25rem;padding:0 .1875rem}.emoji-dropdown #content-gifs .scrollable-y{padding:0 .1875rem}.emoji-dropdown .gifs-masonry{border-radius:10px;overflow:hidden}.emoticons-container{background-color:transparent;flex-direction:column;height:100%;min-height:100%}.emoticons-menu{--item-size:1.875rem;align-items:center;min-height:3.0625rem;padding:0 .3125rem;width:100%;z-index:4}.emoticons-menu,.emoticons-menu-wrapper{background-color:transparent;height:3.0625rem}.emoticons-menu-wrapper{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);max-width:100%;padding:0;position:relative}.emoticons-menu:after{content:" ";display:block;flex:0 0 auto;height:1px;width:.1875rem}.emoticons-menu .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:var(--item-size);line-height:var(--item-size);margin:0 .3125rem;padding:0;width:var(--item-size)}.emoticons-menu .menu-horizontal-div-item.not-local{border-radius:.25rem!important}.emoticons-menu .menu-horizontal-div-item.not-local{--item-size:2.375rem;padding:.25rem}.emoticons-menu .menu-horizontal-div-item.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-div-item.active,html.no-touch .emoticons-menu .menu-horizontal-div-item:active,html.no-touch .emoticons-menu .menu-horizontal-div-item:hover{color:rgba(0,0,0,.8)!important;color:rgba(var(--primary-text-color-rgb),.8)!important}.emoticons-menu .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoticons-menu .menu-horizontal-div-item.active:not(.tgico){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.emoticons-menu .menu-horizontal-inner{border-radius:15px;flex:0 0 auto;margin:0 .3125rem;overflow:hidden;width:1.875rem}html.is-safari .emoticons-menu .menu-horizontal-inner{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner{transition:width .2s ease-in-out}.emoticons-menu .menu-horizontal-inner-scroll{align-items:center;display:flex;height:100%;position:relative;width:8.5rem}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{margin:0!important}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transform:scale(1)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transition:transform .2s ease-in-out!important}.emoticons-menu .menu-horizontal-inner.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-inner.active{width:8.5rem}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item{transform:scale(.8)}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item.active{background-color:transparent!important}.emoticons-menu .menu-horizontal-inner:not(.active){cursor:pointer}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-inner-scroll{pointer-events:none}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-div-item:first-child{pointer-events:all}.emoticons-content{flex:1;padding:0;position:relative}.emoticons-content .emoji-category{position:relative}.emoticons-content .sticky_sentinel--top{height:1px;top:0}.emoticons-content .category-title{color:rgba(0,0,0,.42);color:rgba(var(--primary-text-color-rgb),.42);cursor:pointer;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:1.1875rem;padding:.75rem .875rem .375rem;position:relative;text-align:center;width:100%}.emoticons-content .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoticons-content:not(.has-premium) .is-premium-set .category-title:before{content:"";line-height:inherit;margin-right:.125rem;vertical-align:middle}.emoji-padding .super-emojis{padding:0 .5rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:rgba(0,0,0,.2) transparent;scrollbar-color:var(--scrollbar-color) transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:rgba(0,0,0,.2);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable.scrollable-y.scrollable-y-bordered{border-bottom:1px solid transparent;border-top:1px solid transparent}body.animation-level-2 .scrollable.scrollable-y.scrollable-y-bordered{transition:border-top-color .3s cubic-bezier(.4,0,.2,1),border-bottom-color .3s cubic-bezier(.4,0,.2,1);transition:border-top-color var(--transition-standard-in),border-bottom-color var(--transition-standard-in)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-top){border-top-color:#dfe1e5;border-top-color:var(--border-color)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-bottom){border-bottom-color:#dfe1e5;border-bottom-color:var(--border-color)}.scrollable-padding{height:100%;min-width:100%}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important}.selector .selector-search-section{position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding-left:1rem;padding-right:1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}[dir=ltr] .selector-user{padding-right:17px}[dir=rtl] .selector-user{padding-left:17px}[dir=ltr] .selector-user{margin-left:-.25rem;margin-right:.75rem}[dir=rtl] .selector-user{margin-left:.75rem;margin-right:-.25rem}.selector-user{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:#000;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;max-width:11.25rem;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{animation:scaleIn .1s ease forwards;animation-direction:reverse}[dir=ltr] .selector-user-avatar{margin-right:8px}[dir=rtl] .selector-user-avatar{margin-left:8px}.selector-user-avatar{border-radius:50%!important}.selector-user-avatar{float:left;overflow:hidden;position:relative}.is-rtl .selector-user-avatar{float:right}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}[dir=ltr] .selector-user-avatar:after{left:0}[dir=rtl] .selector-user-avatar:after{right:0}.selector-user-avatar:after{line-height:32px!important}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:"";font-size:23px;height:100%;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector>hr{margin:0;padding:0}[dir=ltr] .selector .checkbox{padding-left:11px}[dir=rtl] .selector .checkbox{padding-right:11px}.selector .checkbox{margin-top:11px}.selector .checkbox-field{--offset-left:0!important;margin:0!important;padding:0!important;position:absolute!important}.selector .checkbox-field{pointer-events:none;top:50%;transform:translateY(-50%);z-index:1}[dir=ltr] .selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}[dir=rtl] .selector .checkbox-field:first-child{margin-left:1.6875rem;margin-right:.6875rem}[dir=ltr] .selector .checkbox-field-round{right:1.125rem}[dir=rtl] .selector .checkbox-field-round{left:1.125rem}.selector .checkbox-field-round{--size:1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}[dir=ltr] .selector-square .checkbox-field{left:1.25rem!important}[dir=rtl] .selector-square .checkbox-field{right:1.25rem!important}[dir=ltr] .selector-square .chatlist-chat.row-with-padding{padding-left:7.5rem!important}[dir=rtl] .selector-square .chatlist-chat.row-with-padding{padding-right:7.5rem!important}[dir=ltr] .selector-square .dialog-avatar{margin-left:3rem!important}[dir=rtl] .selector-square .dialog-avatar{margin-right:3rem!important}.gifs-masonry{grid-gap:.125rem;display:grid;gap:.125rem;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr)}.gifs-masonry .gif img,.gifs-masonry .gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry .gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color:#fff}.preloader-container .you-spin-me-round{height:100%;width:100%}.preloader-container .preloader-circular{animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{animation:rotate 1s linear infinite!important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer!important}.preloader-container.preloader-streamable circle{stroke-width:2.5!important}.preloader-container.preloader-streamable:after{background-color:var(--color);border-radius:.125rem;content:"";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@keyframes rotate{to{transform:rotate(1turn)}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{animation:ripple-effect .7s forwards;background-color:rgba(0,0,0,.08);background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.c-ripple{--ripple-duration:.4s}.c-ripple__circle{animation-duration:.4s;animation-name:ripple-effect-handhelds;transition-duration:.3s}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}.avatar-like{line-height:var(--size)!important}.avatar-like{--size:54px;--multiplier:1;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--size)}avatar-element{--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%}avatar-element[data-color=red]{--color-top:var(--peer-avatar-red-top);--color-bottom:var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top:var(--peer-avatar-orange-top);--color-bottom:var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top:var(--peer-avatar-violet-top);--color-bottom:var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top:var(--peer-avatar-green-top);--color-bottom:var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top:var(--peer-avatar-cyan-top);--color-bottom:var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top:var(--peer-avatar-pink-top);--color-bottom:var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top:var(--peer-avatar-blue-top);--color-bottom:var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px/var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px/var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(30px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount{--color-top:var(--peer-avatar-archive-top);--color-bottom:var(--peer-avatar-archive-bottom);overflow:hidden}avatar-element.tgico-deletedaccount:before{font-size:calc(30px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;height:var(--size)!important;width:var(--size)!important}avatar-element img{display:block}avatar-element img.fade-in{animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}avatar-element.is-topic{background:none;border-radius:0;position:relative}avatar-element.is-topic .topic-icon{--size:inherit}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;content:" ";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size:120px;--multiplier:.45}avatar-element.avatar-100{--size:100px;--multiplier:.54}avatar-element.avatar-48{--size:48px;--multiplier:1.125}avatar-element.avatar-46{--size:46px;--multiplier:1.173913}avatar-element.avatar-44{--size:44px;--multiplier:1.227272}avatar-element.avatar-42{--size:42px;--multiplier:1.285714}avatar-element.avatar-40{--size:40px;--multiplier:1.35}avatar-element.avatar-36{--size:36px;--multiplier:1.5}avatar-element.avatar-35{--size:35px;--multiplier:1.542857}avatar-element.avatar-34{--size:34px;--multiplier:1.588235}avatar-element.avatar-32{--size:32px;--multiplier:1.6875}avatar-element.avatar-30{--size:30px;--multiplier:1.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;width:100%!important}.avatar-full .avatar-photo{-o-object-fit:cover;object-fit:cover}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}html.is-safari .document-ico{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.document-ico-text{opacity:0}body.animation-level-2 .document-ico-text{transition:opacity .2s ease-in-out}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:#fff;border-right-color:var(--message-background-color);border-style:solid;border-top-color:#fff;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:"";display:block;position:absolute;right:0;top:0}body.animation-level-2 .document-ico:after{transition:border-width .2s ease-in-out}html.no-touch .document:not(.downloaded):active .document-ico:after,html.no-touch .document:not(.downloaded):hover .document-ico:after{border-width:0}html.no-touch .document:not(.downloaded):active .document-ico-text,html.no-touch .document:not(.downloaded):hover .document-ico-text{opacity:0}html.no-touch .document:not(.downloaded):active .preloader-container,html.no-touch .document:not(.downloaded):hover .preloader-container{opacity:1!important}.document:not(.downloading) .document-ico-text{opacity:1}.document:not(.downloading) .preloader-container{opacity:0!important}.document.downloading .document-ico:after{border-width:0}.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name,.document-size{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document.ext-zip{--background-color:#fb8c00}.document.ext-pdf{--background-color:#df3f40}.document.ext-apk{--background-color:#43a047}.document.document-with-thumb{--background-color:#fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.2);border-radius:.375rem}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3)!important}.document-thumb{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16);white-space:nowrap}.document-size{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);pointer-events:none;position:relative}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}[dir=ltr] .audio,[dir=ltr] .document{padding-left:var(--padding-left)}[dir=rtl] .audio,[dir=rtl] .document{padding-right:var(--padding-left)}.audio,.document{--padding:0px;--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin) + var(--padding));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none}[dir=ltr] .audio-download,[dir=ltr] .audio-ico,[dir=ltr] .document-download,[dir=ltr] .document-ico{margin-left:calc((var(--padding-left) - var(--padding))*-1)}[dir=rtl] .audio-download,[dir=rtl] .audio-ico,[dir=rtl] .document-download,[dir=rtl] .document-ico{margin-right:calc((var(--padding-left) - var(--padding))*-1)}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent!important}.audio .preloader-container:not(.preloader-streamable){height:100%;width:100%}.audio{overflow:visible!important}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size)}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{display:flex!important;margin:0!important}.audio.corner-download .audio-download{background:none;height:1.375rem;left:57.5%;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:#3390ec;background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out,-webkit-clip-path .25s ease-in-out}@media only screen and (min-width:601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width:600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width:601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width:600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:#000;color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:" • "}.audio-subtitle,.audio-time{color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height:2px;--border-radius:4px;--thumb-size:.75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{background-color:transparent;opacity:1;z-index:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff!important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}[dir=ltr] .quiz-hint .container{text-align:left}[dir=rtl] .quiz-hint .container{text-align:right}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:"";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{animation-duration:.6s;animation-iteration-count:infinite;animation-name:dotMiddle;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{animation-name:dotFirst}.peer-typing-text-dot:last-child{animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:#000;color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{cursor:pointer;display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}[dir=ltr] poll-element .poll-answer-percents{text-align:right}[dir=rtl] poll-element .poll-answer-percents{text-align:left}poll-element .poll-answer-percents{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:#3390ec;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:500;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:"";font-weight:500;font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important}poll-element .poll-footer-button{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:500;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:"";font-size:12px}poll-element .circle-hover{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{display:flex!important}poll-element .circle-hover .poll-answer-selected{animation:none;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{animation-fill-mode:forwards!important}.transition>.transition-item{height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.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.slide-fade{--easeOutSine:cubic-bezier(.39,.575,.565,1);--easeInSine:cubic-bezier(.47,0,.745,.715);position:relative}.transition.slide-fade>.from{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@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-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)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.4375rem 1rem;position:relative}.row.no-subtitle,.row.row-small{min-height:3rem;padding-bottom:.1875rem;padding-top:.1875rem}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{pointer-events:none!important}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity)}.row.no-wrap{padding-bottom:0!important;padding-top:0!important}.row a{pointer-events:all;position:relative;z-index:1}.row-title-row,.row>.row-title{order:0}[dir=ltr] .row-big{padding-left:1rem;padding-right:.75rem}[dir=rtl] .row-big{padding-left:.75rem;padding-right:1rem}.row-big{min-height:4.5rem;padding-bottom:.5625rem;padding-top:.5625rem}.row-row{align-items:center;display:flex;justify-content:space-between}.row-row .row-subtitle,.row-row .row-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-subtitle-row,.row>.row-subtitle{order:1}.row-title{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;word-break:break-word}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}[dir=ltr] .row-subtitle-right,[dir=ltr] .row-title-right{margin-left:1rem}[dir=rtl] .row-subtitle-right,[dir=rtl] .row-title-right{margin-right:1rem}.row-subtitle-right,.row-title-right{flex:0 0 auto!important}.row-midtitle,.row-subtitle,.row-title{pointer-events:none;position:relative}.row-midtitle{font-size:14px;font-size:var(--font-size-14);margin-top:.125rem;order:1}[dir=ltr] .row-with-padding{padding-left:4.5rem}[dir=rtl] .row-with-padding{padding-right:4.5rem}@media only screen and (max-width:600px){[dir=ltr] .row-with-padding{padding-left:4rem}[dir=rtl] .row-with-padding{padding-right:4rem}}[dir=ltr] .row-with-padding.tgico:before{left:1rem}[dir=rtl] .row-with-padding.tgico:before{right:1rem}.row-with-padding.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);z-index:1}.row-with-padding:not(.row-with-icon):before{display:none}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}[dir=ltr] .row-sortable .row-subtitle,[dir=ltr] .row-sortable .row-title{padding-right:2.5rem}[dir=rtl] .row-sortable .row-subtitle,[dir=rtl] .row-sortable .row-title{padding-left:2.5rem}[dir=ltr] .row-sortable-icon{right:.75rem}[dir=rtl] .row-sortable-icon{left:.75rem}.row-sortable-icon{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;height:1.5rem;line-height:1;opacity:0;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.row-sortable.cant-sort .row-sortable-icon{display:none}.row-sortable.is-dragging{background-color:#fff!important;background-color:var(--surface-color)!important}.row-sortable.is-dragging{z-index:1}html.no-touch .row-sortable.is-dragging:active,html.no-touch .row-sortable.is-dragging:hover{background-color:#f4f4f4!important;background-color:var(--light-filled-secondary-text-color)!important}html.no-touch .row-sortable:active .row-sortable-icon,html.no-touch .row-sortable:hover .row-sortable-icon{opacity:1}body.animation-level-2 .is-reordering .row-sortable{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{padding-left:3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{padding-right:3.375rem}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{margin-left:-3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{margin-right:-3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field:not(.radio-field-right) .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .radio-field{margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field{margin-right:0}[dir=rtl] .row .checkbox-field{margin-left:0}.row .checkbox-field{height:auto;margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field .checkbox-caption{padding-left:0}[dir=rtl] .row .checkbox-field .checkbox-caption{padding-right:0}.row .checkbox-field .checkbox-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row .checkbox-field-toggle{margin-left:.125rem;margin-right:.125rem;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:14px!important;font-size:var(--font-size-14)!important}.row-subtitle{line-height:18px;line-height:var(--line-height-14);margin-top:.1875rem}.row-subtitle:empty{display:none}[dir=ltr] .row-media{left:.75rem}[dir=rtl] .row-media{right:.75rem}.row-media{height:2.25rem!important;margin:0!important;position:absolute!important;width:2.25rem!important}.row-media{align-items:center;display:flex;justify-content:center;pointer-events:none}[dir=ltr] .row-media-small{left:.75rem!important}[dir=rtl] .row-media-small{right:.75rem!important}.row-media-small{height:2rem!important;width:2rem!important}[dir=ltr] .row-media-abitbigger{left:.75rem!important}[dir=rtl] .row-media-abitbigger{right:.75rem!important}.row-media-abitbigger{height:2.625rem!important;width:2.625rem!important}[dir=ltr] .row-media-big{left:.5rem!important}[dir=rtl] .row-media-big{right:.5rem!important}.row-media-big{height:3rem!important;width:3rem!important}[dir=ltr] .row-media-bigger{left:.5625rem!important}[dir=rtl] .row-media-bigger{right:.5625rem!important}.row-media-bigger{height:3.375rem!important;width:3.375rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}[dir=ltr] .row>.btn-primary{right:1rem}[dir=rtl] .row>.btn-primary{left:1rem}.row>.btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding-left:.75rem;padding-right:.75rem;position:absolute;top:50%;transform:translateY(-50%);width:auto}body.animation-level-2 .row>.btn-primary{transition:width .2s,background-color .2s,color .2s}.row>.btn-primary.active{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important}.row>.btn-primary.active{color:#3390ec;color:var(--primary-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:380px}@media only screen and (max-width:600px){.color-picker{padding:0 .75rem}}.color-picker-box{height:198px;width:100%}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible!important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{display:flex!important;padding:0!important;position:absolute!important;width:26.25rem!important}.reply-keyboard{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);flex-direction:column;max-height:26.25rem;max-width:100%;opacity:0;overflow:hidden;right:0;transform:scale(0);transform-origin:bottom right;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}@media only screen and (max-height:569px),only screen and (max-width:600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{background-color:transparent;border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:.375rem;color:#3390ec;color:var(--primary-color);font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.reply-keyboard .scrollable-y{padding:.625rem!important}.reply-keyboard .scrollable-y{bottom:auto;height:auto;left:auto;max-height:100%;position:relative;right:auto;top:auto}.peoplenearby-container div.text.nearby-description{color:#000;color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:#aaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:#3d9de0;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{animation:waves-animation 3s infinite;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{animation:waves-animation 5s infinite;animation-delay:2s;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:71px;margin-left:51px;margin-top:1px;width:66px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px!important}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{transform:rotateY(180deg)}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}.spoilers-container .custom-emoji-canvas{z-index:-1}.spoilers-container.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.spoilers-container.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim)}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler-text{opacity:1}.spoilers-container:not(.is-spoiler-visible) .spoiler{cursor:pointer}.spoilers-container:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation,.emoji-animation-container{pointer-events:none;position:absolute}.emoji-animation-container{bottom:0;left:0;overflow:hidden;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{--custom-emoji-size:var(--reaction-size);height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{height:var(--size)!important;width:var(--size)!important}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto}.reaction-sticker.is-custom{border-radius:.3125rem}.reaction-sticker.is-custom .custom-emoji,.reaction-sticker.is-custom .media-sticker{border-radius:inherit}.reaction-sticker.is-custom .custom-emoji-canvas{z-index:auto}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important}.reaction-inline .reaction-counter{order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:#f4f4f5;background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}html.no-touch .reaction-block:active:after,html.no-touch .reaction-block:hover:after{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:.08;position:absolute;right:0;top:0}.reaction-block .reaction-counter,.reaction-block .reaction-sticker{z-index:1}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale(0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scale(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4,0,.2,1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4,0,.2,1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important}.reaction-block .reaction-counter{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.sticker-viewer{align-items:center;bottom:0;display:flex;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:4}.sticker-viewer:before{background-color:rgba(0,0,0,.6);bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .sticker-viewer:before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.sticker-viewer.is-visible:not(.backwards):before{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards):before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .emoji-animation,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .emoji-animation,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker:not(.is-overflow){transition:opacity 0s}.sticker-viewer-transformer{--translateX:0;align-items:center;display:flex;height:360px;justify-content:center;position:absolute;width:360px}.sticker-viewer-transformer.has-effect{height:280px;width:280px}.sticker-viewer-transformer.has-effect .sticker-viewer-emoji{top:-5.5rem}body.animation-level-2 .sticker-viewer-transformer{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-out)}.sticker-viewer-transformer.is-switching{opacity:1!important;transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer-transformer.is-switching{transition:transform .2s cubic-bezier(.12,1.1,.56,1.2),opacity .2s cubic-bezier(.12,1.1,.56,1.2)!important;transition:transform var(--sticker-viewer-switch-transition),opacity var(--sticker-viewer-switch-transition)!important}.sticker-viewer-transformer.is-switching:not(.backwards){opacity:0!important;transform:scale(.4) translateX(var(--translateX))!important}.sticker-viewer-emoji{position:absolute;top:-3rem;transform:translateX(var(--translateX)) scale(2)}.sticker-viewer-sticker{position:absolute}.sticker-viewer .emoji-animation,.sticker-viewer-emoji,.sticker-viewer-sticker{opacity:0}body.animation-level-2 .sticker-viewer .emoji-animation,body.animation-level-2 .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.custom-emoji{height:1.25rem!important;height:var(--custom-emoji-size)!important;min-height:1.25rem!important;min-height:var(--custom-emoji-size)!important;min-width:1.25rem!important;min-width:var(--custom-emoji-size)!important;width:1.25rem!important;width:var(--custom-emoji-size)!important}.custom-emoji{display:inline;position:relative}.custom-emoji:before{content:" ";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.custom-emoji .media-sticker,.custom-emoji .rlottie{height:inherit!important;max-height:inherit!important;max-width:inherit!important;width:inherit!important}.custom-emoji .media-sticker,.custom-emoji .rlottie{margin:0;pointer-events:none;text-indent:-9999px}.custom-emoji-canvas{height:100%;width:100%}.custom-emoji-canvas,.custom-emoji-renderer{bottom:0;left:0;position:absolute;right:0;top:0}.custom-emoji-renderer{pointer-events:none}.custom-emoji-placeholder{display:inline;height:20px;height:var(--messages-custom-emoji-size);margin-top:-.125rem;vertical-align:middle;width:20px;width:var(--messages-custom-emoji-size)}.usernames-username-icon{background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:50%;color:#fff;font-size:1.25rem}.usernames-username-icon:before{content:""}.usernames-username.active .usernames-username-status{color:#3390ec!important;color:var(--primary-color)!important}.usernames-username.active .usernames-username-icon{background-color:#3390ec;background-color:var(--primary-color)}.topics-slider{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0}.topics-container{background-color:#fff!important;background-color:var(--surface-color)!important;width:var(--width)!important}.topics-container{--offset:0;--width:100%}.topics-container.is-floating{overflow:visible!important;overflow:initial!important}.topics-container.is-floating{--offset:5.0625rem;--width:calc(var(--left-column-width) - var(--offset));border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);bottom:0;pointer-events:all;position:absolute;right:0;top:0;transform:translateX(var(--width));z-index:3}.topics-container.is-visible:not(.backwards){transform:translateX(0)}.topics-container.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.topics-container.is-visible.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.topics-container .sidebar-header{padding:0 .75rem}.topics-container .sidebar-header__rows{flex:1 1 auto;overflow:hidden;padding-left:.5rem}.topics-container .sidebar-header__rows .sidebar-header__title{padding-left:0!important}.topics-container .sidebar-header__rows .sidebar-header__title{font-size:16px;font-size:var(--font-size-16);line-height:21px;line-height:var(--line-height-16);margin-bottom:.125rem}.topics-container .sidebar-header__subtitle,.topics-container .sidebar-header__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topics-container .sidebar-header__subtitle{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14)}.topics-container .chatlist-chat{min-height:4rem;padding-left:.75rem}.topic-name .topic-icon{margin-right:.25rem}.topic-name-button{text-decoration:none!important}.topic-name-button{--color:var(--primary-color);align-items:center;color:var(--color);cursor:pointer;display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:1.5rem;justify-content:center;max-width:100%;padding:0 .5rem;position:relative}.topic-name-button-container{display:flex!important}.topic-name-button-container{align-items:flex-start;justify-content:flex-start}.topic-name-button .peer-title,.topic-name-button .topic-name{position:relative}.topic-name-button:before{background-color:var(--color);border-radius:1.5rem;bottom:0;content:" ";left:0;opacity:.08;position:absolute;right:0;top:0}html.no-touch .topic-name-button:active:before,html.no-touch .topic-name-button:hover:before{opacity:.16}.topic-icon{line-height:1.875!important}.topic-icon{--size:1.25rem;--custom-emoji-size:var(--size);display:inline-flex;font-size:calc(var(--size)/2);justify-content:center;position:relative;vertical-align:middle}.topic-icon-general{fill:#c4c9cc;fill:var(--secondary-color);height:var(--size);width:var(--size)}.topic-icon-svg{height:inherit;position:absolute;width:inherit}.topic-icon-content{position:relative}.edit-topic-container .scrollable-y{display:flex;flex-direction:column}.edit-topic-icon{position:absolute}.edit-topic-icon .topic-icon{--size:4rem}.edit-topic-icon-container{align-items:center;cursor:pointer;display:flex;height:100px;justify-content:center;margin:0 auto;position:relative;width:100px}.edit-topic-emoticons-container{flex:1 1 auto}.edit-topic-emoticons-container .sidebar-left-section{padding:0!important}.edit-topic-emoticons-container .sidebar-left-section{height:100%}.edit-topic-emoticons-container .emoji-padding{display:flex;flex-direction:column}.edit-topic-emoticons-container .super-emoji-topic-icon .topic-icon{--size:var(--esg-emoji-size);--custom-emoji-size:inherit;margin-left:calc((var(--custom-emoji-size) - var(--esg-emoji-size))/2)}.themes-container{align-items:center;display:flex;height:6.5rem;margin:0 -.5rem;position:relative;width:calc(100% + 1rem)}.themes-container:after,.themes-container:before{content:" ";display:block;flex:0 0 auto;width:.5rem}.theme-container{border-radius:10px;flex:0 0 auto;height:calc(100% - .5rem);margin:0 .25rem;position:relative;transform:scale(1);width:4.5rem}body.animation-level-2 .theme-container{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.theme-container:active{transform:scale(.9)}.theme-container:before{border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:14px;bottom:-4px;content:" ";left:-4px;position:absolute;right:-4px;top:-4px;transform:scale(.86)}body.animation-level-2 .theme-container:before{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.theme-container.active{pointer-events:none}.theme-container.active:before{transform:scale(1)}.theme-emoticon{bottom:.5rem;height:1.75rem;left:50%;pointer-events:none;position:absolute;transform:translateX(-50%);width:1.75rem}.theme-bubble{background-color:#fff;border-radius:1.75rem;height:1.25rem;position:absolute;width:2.5rem}.theme-bubble.is-out{background-color:#e1f9d2;background-color:var(--light-filled-message-out-primary-color);right:.375rem;top:.5rem}.theme-bubble.is-in{background-color:#fff;background-color:var(--message-background-color);left:.375rem;top:2rem}.popup{position:fixed!important}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;right:0;top:0;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}[dir=ltr] .popup-title{padding-left:1.5rem;padding-right:1rem}[dir=rtl] .popup-title{padding-left:1rem;padding-right:1.5rem}.popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1;margin:0}.popup-title:first-child{padding-left:0}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform .15s cubic-bezier(.4,0,.2,1);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem;position:relative}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:center;display:flex;flex-direction:row-reverse;height:3rem;justify-content:flex-start;padding:0 .5rem}.popup-buttons .btn{border-radius:10px;font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;max-width:100%;overflow:hidden;padding:0 1rem;position:relative;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}[dir=ltr] .popup-buttons .btn+.btn{margin-right:.625rem}[dir=rtl] .popup-buttons .btn+.btn{margin-left:.625rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}[dir=ltr] .popup-avatar h6{text-align:left}[dir=rtl] .popup-avatar h6{text-align:right}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:14px;font-size:var(--font-size-14);height:2.25rem;line-height:2.25rem;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-container{max-width:25rem;padding:0;width:25rem}.popup-new-media.popup-send-photo .popup-container.border-top-offset .popup-input-container{overflow:visible;overflow:initial}.popup-new-media.popup-send-photo .popup-container.border-top-offset .popup-input-container:before{top:-8px}.popup-new-media.popup-send-photo .popup-header{height:3.5rem;margin:0;padding:0 1rem}[dir=ltr] .popup-new-media.popup-send-photo .popup-title{padding-left:1.5rem}[dir=rtl] .popup-new-media.popup-send-photo .popup-title{padding-right:1.5rem}.popup-new-media.popup-send-photo .popup-close{margin:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .popup-body .scrollable{padding:0 .5rem}.popup-new-media.popup-send-photo .input-message-container{max-height:inherit;min-height:inherit}.popup-new-media.popup-send-photo .input-message-input{max-height:inherit!important}.popup-new-media.popup-send-photo .btn-primary{flex:0 0 auto;height:2.5rem;line-height:2.5rem;margin-bottom:.5rem;padding:0 1rem;text-transform:uppercase;width:auto}.popup-new-media.popup-send-photo .popup-input-container{--height:3.5rem;--max-height:8.375rem;align-items:flex-end;display:flex;flex:0 0 auto;justify-content:space-between;max-height:var(--max-height);min-height:var(--height);overflow:hidden;padding:0 .5rem;position:relative}.popup-new-media.popup-send-photo .popup-input-container:before{background-color:#dfe1e5;background-color:var(--border-color);content:" ";height:1px;left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .popup-new-media.popup-send-photo .popup-input-container:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.popup-new-media.popup-send-photo .popup-input-container.has-border-top:before{opacity:1}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{border-radius:inherit;overflow:hidden;position:relative}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{--padding:.25rem;--icon-size:4.5rem;--icon-margin:.5rem;border-radius:10px;cursor:default;height:5rem;margin:0 .25rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{line-height:1.5;margin-bottom:.125rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{border-radius:5px;font-size:16px;font-weight:400;letter-spacing:0;line-height:11px}html.no-touch .popup-new-media.popup-send-photo .document:active,html.no-touch .popup-new-media.popup-send-photo .document:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;height:2.5rem;margin:0;padding:0 1rem;width:-moz-max-content;width:max-content}.popup-peer .popup-container{max-width:min(400px,100%);min-width:min(100%,17.5rem);padding:.75rem .5rem;width:-moz-min-content;width:min-content}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.popup-peer .popup-title:not(:first-child){padding-left:1rem}.popup-peer .popup-description{line-height:1.3125;line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-moz-fit-content;max-width:fit-content;min-width:min(100%,15rem);overflow:hidden;padding:.625rem 1rem .5rem;text-overflow:ellipsis;word-break:break-word}.popup-peer .checkbox-field{align-items:center;display:flex;height:3rem;margin:0;padding:0 1.125rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-stickers .sticker-set-footer{color:#3390ec;color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .scrollable.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .super-emojis{padding:0 .5rem}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}[dir=ltr] .popup-stickers .popup-close{margin-left:1rem}[dir=rtl] .popup-stickers .popup-close{margin-right:1rem}.popup-stickers .popup-close{font-size:1.5rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set .row-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-stickers .sticker-set-stickers{--per-row:5;--item-size:var(--popup-sticker-size);display:grid;grid-template-columns:repeat(var(--per-row),1fr);padding:0 5px;position:relative}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{--per-row:4}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper{cursor:pointer;height:var(--item-size);justify-self:center;margin-bottom:2px;position:relative;width:var(--item-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers .media-sticker-wrapper{margin-bottom:8px}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height:470px){.popup-date-picker .popup-container[data-lines="7"]{top:19px}.popup-date-picker .popup-container[data-lines="5"]{top:-19px}}.popup-date-picker .popup-header{margin-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7!important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.popup-date-picker .date-picker-month .btn-icon.active{border-radius:50%;color:#fff;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@media only screen and (max-width:600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines="5"]{top:-16px}.popup-schedule .popup-container[data-lines="7"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@media only screen and (max-width:600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold);margin-left:-5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:#000!important;color:var(--primary-text-color)!important;font-size:14px!important}.popup-schedule .date-picker-month-day{font-weight:500;font-weight:var(--font-weight-bold)}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width:600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px,100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main:before{left:.25rem}.popup-create-poll .radio-field .radio-field-main:after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{opacity:0!important}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-create-poll hr:not(.hide){display:block!important}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:7px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.8125rem}}.popup-forward .popup-title{flex-grow:1;height:100%;padding:0}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:20px;font-size:var(--font-size-20);height:100%;line-height:1;padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.1875rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1rem 0 .375rem;overflow:visible;overflow:initial}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-header{justify-content:space-between;width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale:1}.call-buttons .call-button-container.hide-me{--scale:0!important}.call-buttons .call-button-container.hide-me{transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(-2.6875rem);transform:translateX(calc(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(6.75rem + 2rem*var(--margin-length)));transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:#df3f40!important;background-color:var(--danger-color)!important}.call-button-green{background-color:#5cc85e!important;background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:7.625rem;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{height:1.875rem!important;width:1.875rem!important}.call-party-state .rlottie-icon{flex:0 0 auto;margin-left:-.25rem;margin-right:.25rem}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(-6.5rem);transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0),rgba(33,33,33,.65) 48.54%,#212121);background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:" ";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{font-size:16px;font-size:var(--font-size-16);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:#aaa;color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:rgba(1,200,80,.2);background-color:var(--gc-button-unmuted-color);color:#fff;color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60,135,247,.2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223,68,184,.2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255,89,90,.3)!important;background-color:var(--gc-button-leave-color)!important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg,#00a3b4 12.94%,#00cb47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg,#4eabf8 14.73%,#3478f6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg,#df44b8 14.73%,#3851eb 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant .dialog-subtitle,.group-call-participant .dialog-title{padding-right:2.5rem}.group-call-participant-muted-icon-container{position:absolute!important}.group-call-participant-muted-icon-container{right:.5rem}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;height:2rem;margin-left:.75rem;width:2rem}.group-call-participant .is-speaking{color:#5cc85e;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container:before{content:" ";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaa;color:var(--gc-secondary-text-color)}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25%!important}.group-call-cfs,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width:17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(-13.125rem);transform:translateX(calc(var(--gc-right-column-width)/-2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX:calc(var(--gc-right-column-width)/-2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{background-color:#212121;background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:-26.25rem;right:calc(var(--gc-right-column-width)*-1);top:0;width:26.25rem;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.popup-reacted-list{--size:1.5rem;--custom-emoji-size:var(--size)}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--reaction-size:var(--size);--additional-height:.75rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{font-size:1.25rem!important}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{display:flex;height:var(--size);position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:var(--size)}.popup-reacted-list .chatlist-chat{padding-right:3.25rem!important}.popup-payment .popup-container{border-radius:16px;max-height:min(100%,43.5rem);max-width:26.25rem;padding:0;width:26.25rem}.popup-payment .popup-header{height:3.5rem;margin:0;padding:0 1rem}.popup-payment.is-loading .popup-container{min-height:26.25rem}.popup-payment .scrollable{display:flex;flex:1 1 auto;flex-direction:column}.popup-payment hr{display:block!important;margin:.5rem 0!important;padding:0!important}.popup-payment .input-field{--height:3rem;margin:.75rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.popup-payment .input-fields-row .input-field{margin-top:1.25rem}.popup-payment .sidebar-left-section{padding:0!important}.popup-payment .sidebar-left-section-name+.input-field,.popup-payment .sidebar-left-section-name+.input-fields-row .input-field{margin-top:.75rem}.popup-payment .sidebar-left-section .row{margin-top:.5rem}.popup-payment .sidebar-left-section-content{margin:0 .5rem!important}.popup-payment .select-wrapper{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);max-height:10rem}.popup-payment .select-wrapper li{grid-template-columns:calc(26px + 2rem) 1fr;height:3rem}.popup-payment .payment-verification{border:none;flex:1 1 auto;height:40rem;max-height:100%;width:100%}.popup-payment .row{border-radius:10px}.payment-item{padding:0 1.25rem;width:100%}.payment-item-details{display:flex;flex:0 0 auto;justify-content:space-between;margin-bottom:1rem;overflow:hidden}.payment-item-details:last-child{margin-bottom:0}.payment-item-details-photo{border-radius:10px;flex:0 0 auto;height:6.25rem;margin-right:1rem;width:6.25rem}.payment-item-details-photo .media-photo{border-radius:inherit}.payment-item-details-lines{display:flex;flex:1 1 auto;flex-direction:column}.payment-item-details-lines-title{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16)}.payment-item-details-lines-bot-name,.payment-item-details-lines-description{font-size:14px;font-size:var(--font-size-14);line-height:1.25rem}.payment-item-details-lines-bot-name{color:#707579;color:var(--secondary-text-color)}.payment-item-prices{display:flex;flex-direction:column;margin:1rem .25rem .5rem}.payment-item-prices-price{color:#707579;color:var(--secondary-text-color);display:flex;font-weight:500;justify-content:space-between;line-height:1.1875rem}.payment-item-prices-price+.payment-item-prices-price{margin-top:1.5rem}.payment-item-prices-price.is-total{color:#000;color:var(--primary-text-color)}.payment-item-tips{display:flex;justify-content:space-between;margin:.75rem -.5rem 1.5rem}.payment-item-tips-tip{--background-intensity:.1;background-color:rgba(84,190,97,var(--background-intensity));border-radius:1.25rem;color:#3ba748;flex:1 1 auto;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;line-height:2.5rem;text-align:center}body.animation-level-2 .payment-item-tips-tip{transition:color .1s ease-in-out,background-color .1s ease-in-out}.payment-item-tips-tip+.payment-item-tips-tip{margin-left:.5rem}html.no-touch .payment-item-tips-tip:not(.active):active,html.no-touch .payment-item-tips-tip:not(.active):hover{--background-intensity:.3}.payment-item-tips-tip.active{--background-intensity:1;color:#fff}.payment-item-tips-input{color:inherit!important;font-weight:inherit!important}.payment-item-tips-input{display:inline}.payment-item-row{margin:0 .5rem;padding-bottom:0;padding-top:0}.payment-item-method-row .media-photo{border-radius:10px}.payment-item-pay{flex:0 0 auto;height:3rem;margin:1rem;text-transform:uppercase;width:auto}.payment-item-preloader-container{flex:1 1 auto;position:relative}.popup-payment-shipping-methods .popup-container{min-height:auto}.popup-payment-shipping-methods .row{margin-top:0!important}.popup-payment-verification .popup-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:" ";height:1px;left:0;position:absolute;right:0}.popup-payment-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}.popup-limit .popup-container{min-width:min(100%,22.5rem)}.popup-limit-line{align-items:center;display:flex;flex-direction:column;margin:.75rem 0}.popup-limit-hint{align-items:center;color:#fff;display:flex;font-weight:500;font-weight:var(--font-weight-bold);justify-content:center;transform:scale(.6) translate(-280px,16px) rotate(-30deg)}body.animation-level-2 .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.2)}.popup-limit-hint.active{transform:scale(1) translate(0) rotate(0)}.popup-limit-hint-icon{display:flex;font-size:1.25rem;margin-right:.25rem}.popup-limit-button.primary{color:#fff!important}.popup-limit-button.primary{align-items:center;background:linear-gradient(88.39deg,#6c93ff -2.56%,#976fff 51.27%,#df69d1 107.39%);display:flex}.popup-limit-button-icon{display:flex;font-size:1.5rem;margin-left:.625rem}.popup-limit .limit-line{align-self:stretch;margin:1rem .5rem 0}.popup-limit:not(.is-locked) .popup-limit-hint{background:linear-gradient(73.4deg,#6c93ff -7.21%,#976fff 114.57%,#df69d1 241.52%);background-size:200px 2rem;border-radius:1rem;height:2rem;padding:0 .75rem;position:relative}.popup-limit:not(.is-locked) .popup-limit-hint:after{background:inherit;background-position-x:calc(-50% - 86px);background-repeat:no-repeat;background-size:inherit;bottom:-9px;-webkit-clip-path:path("M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z");clip-path:path("M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z");content:" ";display:block;height:9px;left:50%;margin-left:-13px;position:absolute;width:100%}.popup-limit.is-locked .popup-limit-hint{background-color:#3390ec;background-color:var(--primary-color);border-radius:1.375rem;height:2.75rem;margin-right:-.25rem;padding:0 1.25rem 0 1rem}.popup-limit.is-premium .popup-limit-hint{align-self:flex-end;background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);background-position-x:100%;background-size:200px 2rem;border-bottom-right-radius:0;margin-right:.5rem}body.animation-level-2 .popup-limit.is-premium .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.1)}.popup-limit.is-premium .popup-limit-hint:after{background-position-x:134%;bottom:-11.3px;-webkit-clip-path:path("M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z");clip-path:path("M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z");height:12px;left:100%;margin-left:-20.6px}#auth-pages{background:#fff;background:var(--surface-color);max-width:100%;overflow:hidden}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width:600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width:600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width:600px){#auth-pages .input-wrapper{margin-top:41px;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height:810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;width:100%}@media screen and (max-height:810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width:600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:#3390ec;fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{height:240px!important;width:240px!important}.page-signQR .auth-image{align-items:center;display:flex;justify-content:center}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem!important}.page-signQR h4{flex:0 0 auto}[dir=ltr] .page-signQR .qr-description{text-align:left}[dir=rtl] .page-signQR .qr-description{text-align:right}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@media only screen and (max-width:600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width:600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center;margin:1.375rem 0 .875rem}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40!important;border-color:var(--danger-color)!important}.page-authCode .phone-wrapper .phone{margin:0}.page-authCode .subtitle{margin:0 auto!important}.page-authCode .subtitle{max-width:300px}.page-chats{max-width:1682px!important}.page-chats{display:flex}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important}.page-chats .main-column{width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{display:flex!important}.page-chats #column-center{background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:#dfe1e5;border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;overflow:hidden;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100)}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:Roboto Mono,monospace;font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width:100%}@media only screen and (min-width:601px){.only-handhelds{display:none!important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500;font-weight:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}input:-webkit-autofill:first-line{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial;font-size:16px}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40!important;color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec!important;color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.primary-text{color:#000!important;color:var(--primary-text-color)!important}.color-premium{-webkit-text-fill-color:transparent;background:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%);background:var(--premium-gradient);-webkit-background-clip:text}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@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 fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:min(30rem,calc(100vw - 2rem));opacity:0;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast.is-visible{opacity:1}body.animation-level-2 .toast{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.toast b{color:inherit}.toast a{color:#60a5e9!important}.toast a{cursor:pointer}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}b{font-weight:500;font-weight:var(--font-weight-bold)}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.avatar-edit-canvas{background:linear-gradient(#69bffa,#3d9de0);background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{color:#fff;font-size:3rem;height:3rem;left:50%;line-height:1;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);width:3rem;z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}[dir=ltr] .select-wrapper li{text-align:left}[dir=rtl] .select-wrapper li{text-align:right}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}[dir=ltr] .phone-code{text-align:right}[dir=rtl] .phone-code{text-align:left}.phone-code{color:#9e9e9e}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}[dir=ltr] .phone-edit{margin-left:.4rem}[dir=rtl] .phone-edit{margin-right:.4rem}.phone-edit{cursor:pointer;font-size:1.5rem;height:1.5rem;line-height:1;opacity:.5;transition:opacity .2s;width:1.5rem}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}span.emoji{font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol}@media not screen and (-webkit-min-device-pixel-ratio:2),not screen and (min-device-pixel-ratio:2),not screen and (min-resolution:192dpi),not screen and (min-resolution:2dppx){html[dir=ltr]:not(.is-safari) span.emoji{margin-right:5px!important}html[dir=rtl]:not(.is-safari) span.emoji{margin-left:5px!important}html[dir=ltr]:not(.is-safari) avatar-element span.emoji{margin-right:0!important}html[dir=rtl]:not(.is-safari) avatar-element span.emoji{margin-left:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable=true] .custom-emoji{display:inline-block;margin-bottom:-2px}[contenteditable=true] .custom-emoji:before{content:none}[contenteditable=true] [style*=markup]{font-family:inherit!important}[contenteditable=true] [style*=bold]{font-weight:700}[contenteditable=true] [style*=italic]{font-style:italic}[contenteditable=true] [style*=underline]{text-decoration-line:underline}[contenteditable=true] [style*=strikethrough]{text-decoration-line:line-through}[contenteditable=true] [style*=underline][style*=strikethrough]{text-decoration-line:underline line-through}[contenteditable=true] [style*=monospace]{font-family:Roboto Mono,monospace!important;font-family:var(--font-monospace)!important}[contenteditable=true] [style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color)}[contenteditable][data-placeholder]:before{color:#a2acb4;content:attr(data-placeholder);display:block;opacity:0;pointer-events:none;position:absolute}body.animation-level-2 [contenteditable][data-placeholder]:before{transform:translateX(1.75rem);transition:opacity .2s ease-out .01s,transform .2s ease-out .01s;transition:opacity var(--input-transition) .01s,transform var(--input-transition) .01s}[contenteditable][data-placeholder]:empty:before{opacity:1}body.animation-level-2 [contenteditable][data-placeholder]:empty:before{transform:translateX(0)}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{display:grid;grid-template-columns:repeat(auto-fill,72px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){[dir=ltr] .show-more{padding-left:8px}[dir=rtl] .show-more{padding-right:8px}}[dir=ltr] .show-more .tgico-down{padding-left:1rem;padding-right:2rem}[dir=rtl] .show-more .tgico-down{padding-left:2rem;padding-right:1rem}.show-more .tgico-down{float:left;font-size:24px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}::-moz-selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after,::selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after{bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.input-something{display:inline-block}.input-selectable{position:relative}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0,calc(var(--translateY)*-1),0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0,var(--translateY),0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-container-contain{position:relative}.media-container-contain .media-photo{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.media-container-cover{position:relative}.media-container-cover .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-sticker-wrapper.is-premium-sticker:before{align-items:center;background:rgba(0,0,0,.2);background-image:var(--lock-url);background-repeat:no-repeat;background-size:cover;border-radius:50%;bottom:.125rem;color:#fff;display:flex;height:1.25rem;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:1.25rem;z-index:1}body.is-premium .media-sticker-wrapper.is-premium-sticker:after,body.is-premium .media-sticker-wrapper.is-premium-sticker:before{content:none}.media-round{max-height:280px;max-height:var(--round-video-size);max-width:280px;max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:rgba(109,141,65,.4)!important;background-color:var(--message-highlightning-color)!important}.media-round .video-time{padding:0 .375rem}[dir=ltr] .media-round .video-time:after,[dir=ltr] .media-round .video-time:before{margin-left:.25rem}[dir=rtl] .media-round .video-time:after,[dir=rtl] .media-round .video-time:before{margin-right:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:" ";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:"";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:#f4f4f5;background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.sidebar-left-section{padding:.5rem 0!important}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);box-shadow:0 1px 3px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{padding:0 1rem}}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-left-section-container a{cursor:pointer}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important}.tgico-admin:before,.tgico-fontsize:before{padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.navigable-list .active{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{--esg-emoji-total-size:calc(var(--esg-emoji-size) + 0.5rem);--custom-emoji-size:var(--esg-emoji-size);grid-column-gap:2.44px;--esg-emoji-size:2.125rem;--esg-emoji-total-size:2.625rem;--custom-emoji-size:2.25rem;-moz-column-gap:2.44px;column-gap:2.44px;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;font-size:var(--esg-emoji-size);grid-template-columns:repeat(auto-fill,var(--esg-emoji-total-size));justify-content:space-between;line-height:var(--esg-emoji-size);position:relative}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:var(--esg-emoji-total-size);line-height:inherit;margin-left:.0625rem;margin-right:.0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:var(--esg-emoji-total-size)}.super-emojis .super-emoji .emoji-placeholder{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}.super-emojis .super-emoji.active,html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.super-emojis.not-local .super-emoji{padding:.1875rem}.super-emojis .super-emoji{margin:0}.super-emojis:not(.not-local) .super-emoji{overflow:hidden}html.native-emoji .super-emojis:not(.not-local) .super-emoji{padding-bottom:.3125rem;padding-top:.3125rem}.super-emojis .custom-emoji{display:block}.super-emojis .custom-emoji-renderer{z-index:1}.super-emojis .custom-emoji:before{content:none}.tgico-char:before{font-family:Roboto!important}.tgico-char:before{font-weight:500;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:"Z"}.tgico-char.w:before{content:"W"}.sending-status:empty{display:none}.sending-status .tgico-sendingerror{color:#df3f40;color:var(--danger-color)}.sending-status-icon{line-height:1!important}.sending-status-icon{position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon-svg{height:1rem;width:1rem}.verified-icon-check{fill:#fff}.verified-icon-background{fill:#3390ec;fill:var(--primary-color)}[dir=ltr] .emoji-status,[dir=ltr] .premium-icon,[dir=ltr] .verified-icon{margin-left:.125rem}[dir=rtl] .emoji-status,[dir=rtl] .premium-icon,[dir=rtl] .verified-icon{margin-right:.125rem}.emoji-status,.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;width:1.25rem}[dir=ltr] .emoji-status{margin-left:.25rem}[dir=rtl] .emoji-status{margin-right:.25rem}.emoji-status{height:1.125rem;position:relative;width:1.125rem}.premium-icon{color:#3390ec;color:var(--primary-color);margin-top:-.0625rem}.badge-fake{line-height:1!important}.badge-fake{border:1px solid #df3f40;border:1px solid var(--danger-color);border-radius:.185rem;color:#df3f40;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.25rem;margin-right:.25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex;overflow:hidden}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.limit-line{display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:2rem}.limit-line-free{color:#000}.limit-line-premium{color:#fff}.limit-line-free{background-color:#f1f3f5;border-bottom-left-radius:10px;border-top-left-radius:10px}.limit-line-premium{background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);border-bottom-right-radius:10px;border-top-right-radius:10px}.limit-line-free,.limit-line-premium{align-items:center;display:flex;flex:1 1 0;justify-content:space-between;padding:0 .75rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}[dir=ltr] .chatlist-chat.row-with-padding{padding-left:4.5rem!important}[dir=rtl] .chatlist-chat.row-with-padding{padding-right:4.5rem!important}.chatlist-chat span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist-chat .row-title{font-size:16px!important;font-size:var(--font-size-16)!important}.chatlist-chat .row-title{line-height:1.375rem}.chatlist-chat .row-title-right-secondary{font-size:12px!important;font-size:var(--font-size-12)!important;line-height:16px!important;line-height:var(--line-height-12)!important}.chatlist-chat .row-title-right-secondary{margin-top:-.4375rem}.chatlist-chat .row-subtitle{display:block!important}.chatlist-chat .row-row{height:1.375rem}.chatlist-chat.chatlist-chat-abitbigger .row-subtitle{margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle{font-size:16px!important;font-size:var(--font-size-16)!important}.chatlist-chat.chatlist-chat-bigger .row-subtitle{line-height:1.375rem;margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle-row{margin-top:.125rem}.chatlist-chat.chatlist-chat-bigger .row-title .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.username-purchase-help b{color:#df3f40!important;color:var(--danger-color)!important;font-weight:400!important;font-weight:var(--font-weight-normal)!important}.media-spoiler-container{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.media-spoiler-container.is-revealing{opacity:1}.media-spoiler-container.is-revealing:not(.backwards){opacity:0}.media-spoiler-container.is-revealing.animating{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{-o-object-fit:initial!important;object-fit:fill!important}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{height:100%;position:absolute;width:100%} - -/*# sourceMappingURL=main.8a30f1b9c0bab91e44e9.css.map*/ \ No newline at end of file diff --git a/public/main.8a30f1b9c0bab91e44e9.css.map b/public/main.8a30f1b9c0bab91e44e9.css.map deleted file mode 100644 index 5f5263f7..00000000 --- a/public/main.8a30f1b9c0bab91e44e9.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"main.8a30f1b9c0bab91e44e9.css","mappings":"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","sources":["webpack://tweb/./src/materialize.scss","webpack://tweb/./src/scss/style.scss"],"sourcesContent":["/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}button{background:none;border:none;cursor:pointer;outline:none;padding:0}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none!important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;user-select:none}.no-transition,.no-transition:after,.no-transition:before{transition:none!important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start!important}.justify-self-start{justify-self:flex-start!important}.justify-self-end{justify-self:flex-end!important}.position-center{position:absolute!important}.position-center{left:50%;top:50%;transform:translate(-50%,-50%)}.text-bold{font-weight:500!important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap!important}.no-wrap{white-space:nowrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}.reflect-x{transform:scaleX(-1)}[dir=auto]{unicode-bidi:plaintext}.is-rtl [dir=auto]{direction:inherit}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}",":root{--vh:1vh;--z-below:-1;--hover-alpha:0.08;--transition-standard-easing:cubic-bezier(.4,.0,.2,1);--transition-standard-in-time:.3s;--transition-standard-out-time:.25s;--transition-standard-in:var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out:var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition:.2s ease-in-out;--layer-transition:.2s cubic-bezier(.4,.0,.2,1);--slide-header-transition:.4s ease-in-out;--tabs-transition:.2s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--sticker-viewer-open-transition-in:.2s var(--transition-standard-easing);--sticker-viewer-open-transition-out:.2s var(--transition-standard-easing);--sticker-viewer-switch-transition:.2s cubic-bezier(.12,1.1,.56,1.2);--popup-transition-function:cubic-bezier(.4,0,.2,1);--popup-transition-time:.15s;--btn-corner-transition:.2s cubic-bezier(.34,1.56,.64,1);--chatlist-badge-transition-in:.25s cubic-bezier(.35,.35,.47,1.34);--chatlist-badge-transition-out:.25s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin:5.5625rem;--message-beside-button-size:2.375rem;--message-beside-button-margin:calc((var(--message-beside-button-size) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-line-height:1.3125;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--messages-time-text-size:calc(var(--messages-text-size) - 4px);--messages-service-text-size:calc(var(--messages-text-size) - 1px);--messages-custom-emoji-size:calc(var(--messages-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height-20:26px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--line-height:1.3125;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--font-size:var(--font-size-16);--esg-sticker-size:72px;--esg-custom-emoji-size:36px;--popup-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-backdrop-filter:blur(50px);--font-monospace:\"Roboto Mono\",monospace;--font-weight-bold:500;--font-weight-normal:400;--selection-background-color:rgba(var(--primary-color-rgb),.4);--selection-color:inherit;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--custom-emoji-size:1.25rem;--peer-avatar-red-top:#ff845e;--peer-avatar-red-bottom:#d45246;--peer-avatar-orange-top:#febb5b;--peer-avatar-orange-bottom:#f68136;--peer-avatar-violet-top:#b694f9;--peer-avatar-violet-bottom:#6c61df;--peer-avatar-green-top:#9ad164;--peer-avatar-green-bottom:#46ba43;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#5bcbe3;--peer-avatar-blue-bottom:#359ad4;--peer-avatar-pink-top:#ff8aac;--peer-avatar-pink-bottom:#d95574;--peer-avatar-saved-top:#69bffa;--peer-avatar-saved-bottom:#3d9de0;--peer-avatar-archive-top:#b8c2cc;--peer-avatar-archive-bottom:#9eaab5;--avatar-color-top:var(--peer-avatar-saved-top);--avatar-color-bottom:var(--peer-avatar-saved-bottom);--avatar-border-radius-forum:37%;--premium-gradient:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%)}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--popup-sticker-size:68px;--round-video-size:200px;--chat-input-size:2.875rem;--chat-input-padding:0.5rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:601px){:root{--right-column-width:420px;--chat-input-size:3.375rem;--chat-input-padding:0.8125rem;--chat-input-inner-padding:0.5rem}}@media only screen and (max-height:569px){:root{--chat-input-size:2.875rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:1276px)and (max-width:1680px){:root{--right-column-width:25vw}}:root{--body-background-color:#fff;--background-color-true:#f4f4f5;--background-color:var(--background-color-true);--border-color:#dfe1e5;--surface-color-rgb:255,255,255;--surface-color:#fff;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--primary-color:#3390ec;--light-primary-color:rgba(51,144,236,.08);--light-filled-primary-color:#eff6fd;--dark-primary-color:#157ce1;--primary-color-rgb:51,144,236;--primary-text-color:#000;--primary-text-color-rgb:0,0,0;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--light-filled-secondary-text-color:#f4f4f4;--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--dark-danger-color:#d22324;--avatar-online-color:#0ac630;--chatlist-status-color:var(--avatar-online-color);--chatlist-pinned-color:#a2abb2;--badge-text-color:#fff;--link-color:#00488f;--ripple-color:rgba(0,0,0,.08);--poll-circle-color:var(--border-color);--spoiler-background-color:#e3e5e8;--spoiler-draft-background-color:#d9d9d9;--monospace-text-color:var(--danger-color);--backdrop-opacity:.85;--menu-background-color:rgba(var(--surface-color-rgb),var(--backdrop-opacity));--message-background-color:var(--surface-color);--message-time-color:var(--secondary-text-color);--message-checkbox-color:#61c642;--message-checkbox-border-color:#fff;--message-primary-color:var(--primary-color);--light-filled-message-primary-color:var(--light-filled-primary-color);--message-secondary-color:var(--secondary-color);--message-error-color:var(--danger-color);--message-out-background-color:#eeffde;--light-message-out-background-color:rgba(238,255,222,.08);--dark-message-out-background-color:#d9ffb5;--message-out-link-color:var(--link-color);--message-out-primary-color:#4fae4e;--light-filled-message-out-primary-color:#e1f9d2;--message-out-status-color:var(--message-out-primary-color);--message-out-time-color:var(--message-out-status-color);--message-out-audio-play-button-color:#fff;--message-out-selection-background-color:var(--selection-background-color);--gc-background-color:#212121;--gc-button-leave-color:rgba(255,89,90,.3);--gc-button-unmuted-color:rgba(1,200,80,.2);--gc-button-muted-color:rgba(60,135,247,.2);--gc-button-hand-color:rgba(223,68,184,.2);--gc-button-unmuted-fill-color:#195530;--gc-button-muted-fill-color:#3c87f7;--gc-green-color:#195530;--gc-blue-color:#3c87f7;--gc-red-color:#643333;--gc-primary-text-color:#fff;--gc-secondary-text-color:#aaa;--gc-green-text-color:#5cc85e;--gc-blue-text-color:#3390ec;--gc-red-text-color:#ff595a;--gc-right-column-width:26.25rem}.night{--body-background-color:#181818;--background-color-true:#181818;--background-color:var(--background-color-true);--border-color:#0f0f0f;--surface-color-rgb:33,33,33;--surface-color:#212121;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--primary-color:#8774e1;--light-primary-color:rgba(135,116,225,.08);--light-filled-primary-color:#292830;--dark-primary-color:#6a52da;--primary-color-rgb:135,116,225;--primary-text-color:#fff;--primary-text-color-rgb:255,255,255;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--light-filled-secondary-text-color:#2c2c2c;--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--dark-danger-color:#ff3031;--avatar-online-color:#0ac630;--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-color);--message-time-color:var(--secondary-text-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-error-color:#fff;--message-out-background-color:#8774e1;--light-message-out-background-color:rgba(135,116,225,.08);--dark-message-out-background-color:#6a52da;--message-out-link-color:#fff;--message-out-primary-color:#fff;--light-filled-message-out-primary-color:#917fe3;--message-out-status-color:#fff;--message-out-time-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color);--message-out-selection-background-color:rgba(var(--surface-color-rgb),.4)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?ivbp49) format(\"truetype\"),url(assets/fonts/tgico.woff?ivbp49) format(\"woff\"),url(assets/fonts/tgico.svg?ivbp49#tgico) format(\"svg\")}.tgico:after,.tgico:before,[class*=\" tgico-\"]:after,[class*=\" tgico-\"]:before,[class^=tgico-]{font-family:tgico!important}.tgico:after,.tgico:before,[class*=\" tgico-\"]:after,[class*=\" tgico-\"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:\"\"}.tgico-checks:before{content:\"\"}.tgico-activesessions:before{content:\"\"}.tgico-add:before{content:\"\"}.tgico-add_reaction:before{content:\"\"}.tgico-addmember_filled:before{content:\"\"}.tgico-adduser:before{content:\"\"}.tgico-admin:before{content:\"\"}.tgico-animals:before{content:\"\"}.tgico-animations:before{content:\"\"}.tgico-archive:before{content:\"\"}.tgico-arrow_down:before{content:\"\"}.tgico-arrow_next:before{content:\"\"}.tgico-attach:before{content:\"\"}.tgico-audio_repeat:before{content:\"\"}.tgico-audio_repeat_single:before{content:\"\"}.tgico-avatarnext:before{content:\"\"}.tgico-avatarprevious:before{content:\"\"}.tgico-binfilled:before{content:\"\"}.tgico-bold:before{content:\"\"}.tgico-botcom:before{content:\"\"}.tgico-bots:before{content:\"\"}.tgico-bug:before{content:\"\"}.tgico-calendar:before{content:\"\"}.tgico-calendarfilter:before{content:\"\"}.tgico-camera:before{content:\"\"}.tgico-cameraadd:before{content:\"\"}.tgico-car:before{content:\"\"}.tgico-card:before{content:\"\"}.tgico-card_outline:before{content:\"\"}.tgico-channel:before{content:\"\"}.tgico-channelviews:before{content:\"\"}.tgico-chatspinned:before{content:\"\"}.tgico-chatsplaceholder:before{content:\"\"}.tgico-check1:before{content:\"\"}.tgico-checkbox:before{content:\"\"}.tgico-checkboxblock:before{content:\"\"}.tgico-checkboxempty:before{content:\"\"}.tgico-checkboxon:before{content:\"\"}.tgico-checkretract:before{content:\"\"}.tgico-checkround:before{content:\"\"}.tgico-close:before{content:\"\"}.tgico-clouddownload:before{content:\"\"}.tgico-colorize:before{content:\"\"}.tgico-comments:before{content:\"\"}.tgico-commentssticker:before{content:\"\"}.tgico-copy:before{content:\"\"}.tgico-darkmode:before{content:\"\"}.tgico-data:before{content:\"\"}.tgico-delete:before{content:\"\"}.tgico-delete_filled:before{content:\"\"}.tgico-deletedaccount:before{content:\"\"}.tgico-deleteleft:before{content:\"\"}.tgico-deleteuser:before{content:\"\"}.tgico-devices:before{content:\"\"}.tgico-document:before{content:\"\"}.tgico-down:before{content:\"\"}.tgico-download:before{content:\"\"}.tgico-dragfiles:before{content:\"\"}.tgico-dragmedia:before{content:\"\"}.tgico-eats:before{content:\"\"}.tgico-edit:before{content:\"\"}.tgico-email:before{content:\"\"}.tgico-endcall_filled:before{content:\"\"}.tgico-enter:before{content:\"\"}.tgico-eye1:before{content:\"\"}.tgico-eye2:before{content:\"\"}.tgico-fast_forward:before{content:\"\"}.tgico-fast_rewind:before{content:\"\"}.tgico-favourites:before{content:\"\"}.tgico-flag:before{content:\"\"}.tgico-flip:before{content:\"\"}.tgico-folder:before{content:\"\"}.tgico-fontsize:before{content:\"\"}.tgico-forward:before{content:\"\"}.tgico-forward_filled:before{content:\"\"}.tgico-fullscreen:before{content:\"\"}.tgico-gc_microphone:before{content:\"\"}.tgico-gc_microphoneoff:before{content:\"\"}.tgico-gifs:before{content:\"\"}.tgico-group:before{content:\"\"}.tgico-groupmedia:before{content:\"\"}.tgico-groupmediaoff:before{content:\"\"}.tgico-help:before{content:\"\"}.tgico-hide:before{content:\"\"}.tgico-image:before{content:\"\"}.tgico-info:before{content:\"\"}.tgico-info2:before{content:\"\"}.tgico-italic:before{content:\"\"}.tgico-keyboard:before{content:\"\"}.tgico-lamp:before{content:\"\"}.tgico-language:before{content:\"\"}.tgico-largepause:before{content:\"\"}.tgico-largeplay:before{content:\"\"}.tgico-left:before{content:\"\"}.tgico-limit_chat:before{content:\"\"}.tgico-limit_chats:before{content:\"\"}.tgico-limit_file:before{content:\"\"}.tgico-limit_folders:before{content:\"\"}.tgico-limit_link:before{content:\"\"}.tgico-limit_pin:before{content:\"\"}.tgico-link:before{content:\"\"}.tgico-listscreenshare:before{content:\"\"}.tgico-livelocation:before{content:\"\"}.tgico-location:before{content:\"\"}.tgico-lock:before{content:\"\"}.tgico-lockoff:before{content:\"\"}.tgico-loginlogodesktop:before{content:\"\"}.tgico-loginlogomobile:before{content:\"\"}.tgico-logout:before{content:\"\"}.tgico-mediaspoiler:before{content:\"\"}.tgico-mediaspoileroff:before{content:\"\"}.tgico-mention:before{content:\"\"}.tgico-menu:before{content:\"\"}.tgico-message:before{content:\"\"}.tgico-messageunread:before{content:\"\"}.tgico-microphone:before{content:\"\"}.tgico-microphone_crossed:before{content:\"\"}.tgico-microphone_crossed_filled:before{content:\"\"}.tgico-microphone_filled:before{content:\"\"}.tgico-minus:before{content:\"\"}.tgico-monospace:before{content:\"\"}.tgico-more:before{content:\"\"}.tgico-mute:before{content:\"\"}.tgico-muted:before{content:\"\"}.tgico-newchannel:before{content:\"\"}.tgico-newchat_filled:before{content:\"\"}.tgico-newgroup:before{content:\"\"}.tgico-newprivate:before{content:\"\"}.tgico-next:before{content:\"\"}.tgico-noncontacts:before{content:\"\"}.tgico-nosound:before{content:\"\"}.tgico-passwordoff:before{content:\"\"}.tgico-pause:before{content:\"\"}.tgico-permissions:before{content:\"\"}.tgico-phone:before{content:\"\"}.tgico-pin:before{content:\"\"}.tgico-pinlist:before{content:\"\"}.tgico-pinned_filled:before{content:\"\"}.tgico-pinnedchat:before{content:\"\"}.tgico-pip:before{content:\"\"}.tgico-play:before{content:\"\"}.tgico-playback_05:before{content:\"\"}.tgico-playback_15:before{content:\"\"}.tgico-playback_1x:before{content:\"\"}.tgico-playback_2x:before{content:\"\"}.tgico-plus:before{content:\"\"}.tgico-poll:before{content:\"\"}.tgico-premium_addone:before{content:\"\"}.tgico-premium_double:before{content:\"\"}.tgico-premium_lock:before{content:\"\"}.tgico-premium_unlock:before{content:\"\"}.tgico-previous:before{content:\"\"}.tgico-radiooff:before{content:\"\"}.tgico-radioon:before{content:\"\"}.tgico-reactions:before{content:\"\"}.tgico-readchats:before{content:\"\"}.tgico-recent:before{content:\"\"}.tgico-replace:before{content:\"\"}.tgico-reply:before{content:\"\"}.tgico-reply_filled:before{content:\"\"}.tgico-rightpanel:before{content:\"\"}.tgico-rotate_left:before{content:\"\"}.tgico-rotate_right:before{content:\"\"}.tgico-saved:before{content:\"\"}.tgico-savedmessages:before{content:\"\"}.tgico-schedule:before{content:\"\"}.tgico-scheduled:before{content:\"\"}.tgico-search:before{content:\"\"}.tgico-select:before{content:\"\"}.tgico-send:before{content:\"\"}.tgico-send2:before{content:\"\"}.tgico-sending:before{content:\"\"}.tgico-sendingerror:before{content:\"\"}.tgico-settings:before{content:\"\"}.tgico-settings_filled:before{content:\"\"}.tgico-sharescreen_filled:before{content:\"\"}.tgico-shipping:before{content:\"\"}.tgico-shuffle:before{content:\"\"}.tgico-smallscreen:before{content:\"\"}.tgico-smile:before{content:\"\"}.tgico-spoiler:before{content:\"\"}.tgico-sport:before{content:\"\"}.tgico-star:before{content:\"\"}.tgico-stickers:before{content:\"\"}.tgico-stickers_face:before{content:\"\"}.tgico-stop:before{content:\"\"}.tgico-strikethrough:before{content:\"\"}.tgico-textedit:before{content:\"\"}.tgico-tip:before{content:\"\"}.tgico-tools:before{content:\"\"}.tgico-topics:before{content:\"\"}.tgico-unarchive:before{content:\"\"}.tgico-underline:before{content:\"\"}.tgico-unmute:before{content:\"\"}.tgico-unpin:before{content:\"\"}.tgico-unread:before{content:\"\"}.tgico-up:before{content:\"\"}.tgico-user:before{content:\"\"}.tgico-username:before{content:\"\"}.tgico-videocamera:before{content:\"\"}.tgico-videocamera_crossed_filled:before{content:\"\"}.tgico-videocamera_filled:before{content:\"\"}.tgico-videochat:before{content:\"\"}.tgico-volume_down:before{content:\"\"}.tgico-volume_mute:before{content:\"\"}.tgico-volume_off:before{content:\"\"}.tgico-volume_up:before{content:\"\"}.tgico-zoomin:before{content:\"\"}.tgico-zoomout:before{content:\"\"}.tgico-phone_filled:before{content:\"\";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:\" \";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}[dir=ltr] .input-field label{left:1rem}[dir=rtl] .input-field label{right:1rem}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;z-index:2}.is-rtl .input-field label{transform-origin:right center}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-icon{border-radius:.375rem;height:1.5rem;pointer-events:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:1.5rem;z-index:1}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:#fff;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:1.3125;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width)) calc(var(--padding-horizontal) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 1000px #fff;-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:#000!important;color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem;--padding-horizontal:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40!important;color:var(--danger-color)!important}.input-field-input.error~.input-field-border{border-color:#df3f40!important;border-color:var(--danger-color)!important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f!important}.input-field-input.valid~.input-field-border{border-color:#26962f!important}.input-field-input:focus~.arrow-down{border-color:#3390ec;border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 .3125rem;transform:translate(-.1875rem,calc(var(--height)/-2 + .0625rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;position:absolute!important;right:auto!important}.input-field-input-fake{left:0;opacity:0;pointer-events:none;top:0;z-index:-3}.input-fields-row{display:flex}.input-fields-row .input-field{flex:1 1 auto;width:1%}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40!important;color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{animation:input-shake .2s ease-in-out forwards}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){[dir=ltr] .input-search{margin-left:1rem}[dir=rtl] .input-search{margin-right:1rem}}.input-search-input{max-height:var(--height)!important;min-height:var(--height)!important}.input-search-input{--height:42px;background-color:#fff;background-color:var(--input-search-background-color);border-color:#dfe1e5;border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:#c4c9cc!important;border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}[dir=ltr] .input-search>.tgico-search{left:.8125rem}[dir=rtl] .input-search>.tgico-search{right:.8125rem}.input-search>.tgico-search{height:1.5rem;pointer-events:none;width:1.5rem}[dir=ltr] .input-search>.tgico-close{right:0}[dir=rtl] .input-search>.tgico-close{left:0}.input-search>.tgico-close{height:42px;width:42px;z-index:1}[dir=ltr] .input-search>.tgico-close:before{margin-right:-1px}[dir=rtl] .input-search>.tgico-close:before{margin-left:-1px}[dir=ltr] .input-field-password .input-field-input{padding-right:2.5rem}[dir=rtl] .input-field-password .input-field-input{padding-left:2.5rem}.input-field-password .input-field-input{max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-family:Arial,Helvetica,sans-serif;font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top:0}@media(-webkit-min-device-pixel-ratio:2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:\"\"}.input-field-password .toggle-visible.eye-hidden:before{content:\"\"}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{pointer-events:none!important}.btn-icon:disabled,.btn:disabled{opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{border-radius:50%!important}.btn-icon{align-items:center;background-color:transparent;border:none;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}[dir=ltr] .btn-corner{right:var(--offset)}[dir=rtl] .btn-corner{left:var(--offset)}.btn-corner{box-shadow:none!important;padding:0!important;position:absolute!important;transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:#3390ec;background-color:var(--primary-color);border:none;bottom:var(--offset);color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;text-align:center;transform:translate3d(0,var(--translateY),0);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}html.no-touch .btn-corner:active,html.no-touch .btn-corner:hover{background-color:#157ce1;background-color:var(--dark-primary-color)}.btn-corner.is-visible{--translateY:0}body.animation-level-0 .btn-corner{transition:none!important}.btn-corner:disabled{opacity:1!important;pointer-events:all!important}.btn-corner .preloader-circular{height:2.5rem;width:2.5rem}.btn-menu{transform:scale(.8)!important}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),visibility .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:4}.btn-menu-old,.is-mobile .btn-menu{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:#fff;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item,.is-mobile .btn-menu .btn-menu-item{transform:none!important}.btn-menu-old .btn-menu-item,.is-mobile .btn-menu .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:16px;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:21px;line-height:var(--line-height-16);margin:0}.btn-menu-old .btn-menu-item:before,.is-mobile .btn-menu .btn-menu-item:before{align-self:auto;color:#707579;color:var(--secondary-text-color);margin-top:0}.btn-menu-old .btn-menu-footer,.is-mobile .btn-menu .btn-menu-footer{background-color:#f4f4f5;background-color:var(--background-color)}.btn-menu{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;visibility:visible}.btn-menu.active,.is-mobile .btn-menu.was-open{transform:scaleX(1)!important}.btn-menu.bottom-left,.is-rtl .btn-menu.bottom-right{left:auto;right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right,.is-rtl .btn-menu.bottom-left{left:0;right:auto;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;left:auto;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right,.is-rtl .btn-menu.top-left{bottom:100%;left:0;right:auto;top:auto;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}[dir=ltr] .btn-menu-item{text-align:left}[dir=rtl] .btn-menu-item{text-align:right}.btn-menu-item{cursor:pointer!important;pointer-events:all!important}.btn-menu-item{--padding-vertical:.25rem;--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:#000;color:var(--primary-text-color);display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:18px;line-height:var(--line-height-14);margin-left:.3125rem;margin-right:.3125rem;padding:var(--padding-vertical) var(--padding-right) var(--padding-vertical) var(--padding-left);position:relative;text-transform:none;transform:scale(1);white-space:nowrap}.btn-menu-item.tgico-char:before{width:var(--icon-size)}body.animation-level-2 .btn-menu-item{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-menu-item:before{align-self:flex-start;color:#000;color:var(--primary-text-color);font-size:var(--icon-size);margin-top:.125rem}[dir=ltr] .btn-menu-item-icon,[dir=ltr] .btn-menu-item:before{margin-right:var(--icon-margin)}[dir=rtl] .btn-menu-item-icon,[dir=rtl] .btn-menu-item:before{margin-left:var(--icon-margin)}.btn-menu-item-icon,.btn-menu-item:before{position:relative}[dir=ltr] .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - var(--add)/2)}[dir=rtl] .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - var(--add)/2)}[dir=ltr] .btn-menu-item-icon{margin-left:calc(var(--add)/-2)}[dir=rtl] .btn-menu-item-icon{margin-right:calc(var(--add)/-2)}.btn-menu-item-icon{--add:.25rem;--total:calc(var(--icon-size) + var(--add));flex:0 0 auto;height:var(--total);width:var(--total)}.btn-menu-item-icon .media-photo{height:inherit;width:inherit}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}[dir=ltr] .btn-menu-item-text-fake{margin-left:var(--margin-left)}[dir=rtl] .btn-menu-item-text-fake{margin-right:var(--margin-left)}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.btn-menu-item-header{pointer-events:none!important}.btn-menu-item-header{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);height:2rem}[dir=ltr] .btn-menu-item .stacked-avatars{right:.5rem}[dir=rtl] .btn-menu-item .stacked-avatars{left:.5rem}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute}.btn-menu-item.is-multiline{font-size:.75rem;height:auto;max-width:16.25rem;min-width:calc(100% - .625rem);width:-moz-fit-content;width:fit-content}.btn-menu-item.is-multiline .btn-menu-item-text{white-space:pre-wrap;width:-moz-fit-content;width:fit-content}.btn-menu-item .checkbox-field-toggle{padding:0}.btn-menu-overlay{max-width:none!important;position:fixed!important;width:auto!important}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:4}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important}.btn-menu hr{margin:.3125rem auto;opacity:.6;padding:0;width:calc(100% - 1.875rem)}html:not(.is-mobile) .btn-menu .badge{background-color:transparent;color:#707579;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}[dir=ltr] .btn-menu-reactions-container{margin-left:var(--other-side-offset)}[dir=rtl] .btn-menu-reactions-container{margin-right:var(--other-side-offset)}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}[dir=ltr] .btn-menu-reactions-container-vertical{margin-left:var(--menu-offset)}[dir=rtl] .btn-menu-reactions-container-vertical{margin-right:var(--menu-offset)}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),#fff 0,hsla(0,0%,100%,0) 1rem,hsla(0,0%,100%,0) calc(100% - 1rem),#fff 100%);background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:\" \";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:#157ce1;background:var(--dark-primary-color);transition:opacity .2s}.btn-primary-transparent{background-color:transparent;color:#3390ec;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:rgba(51,144,236,.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}[dir=ltr] .btn-primary use,[dir=ltr] .btn-primary>svg{right:15px}[dir=rtl] .btn-primary use,[dir=rtl] .btn-primary>svg{left:15px}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto}.btn-primary:disabled{pointer-events:none!important}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity)}[dir=ltr] .btn-control{padding-left:.75rem;padding-right:1.5rem}[dir=rtl] .btn-control{padding-left:1.5rem;padding-right:.75rem}.btn-control{align-items:center;border-radius:1.25rem;display:flex;height:2.5rem;line-height:2.5rem;margin:.9375rem auto 1rem;width:auto}[dir=ltr] .btn-control.tgico:before{margin-right:.375rem}[dir=rtl] .btn-control.tgico:before{margin-left:.375rem}.btn-control.tgico:before{font-size:1.5rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3rem;line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}[dir=ltr] .btn-transparent:before{margin-right:2rem}[dir=rtl] .btn-transparent:before{margin-left:2rem}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem}@media only screen and (max-width:600px){[dir=ltr] .btn-transparent:before{margin-right:1.5rem}[dir=rtl] .btn-transparent:before{margin-left:1.5rem}}[dir=ltr] .btn-transparent.btn-short:before{margin-right:1rem}[dir=rtl] .btn-transparent.btn-short:before{margin-left:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important}.btn-menu-toggle{position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size:54px;border-radius:50%;height:var(--size);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:#707579!important;color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:3.375rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:3.375rem;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:var(--call-button-margin)}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:var(--call-button-margin)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:2rem}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:2rem}[dir=ltr] .btn-update{right:auto!important}[dir=rtl] .btn-update{left:auto!important}.btn-update{padding:0 2rem!important}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:#707579;background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:\"\";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:\"\";left:0;position:absolute}.animated-menu-icon:before{top:-.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{animation:none!important}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden}.autocomplete-helper{border-radius:var(--border-radius)!important;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper{--border-radius:10px;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width:319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal)*4)}}.autocomplete-peer-helper .scrollable{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:1.3125;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:#707579;color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{line-height:var(--size)!important}.badge{--size:1.375rem;--padding:.4375rem;border-radius:calc(var(--size)/2);color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);min-width:var(--size);padding:0 var(--padding);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{--size:1.25rem;--padding:.375rem}.badge-24{--size:1.5rem;--padding:.5rem}.badge.tgico:before{font-size:var(--size)}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{border-radius:0!important}.ckin__player.ckin__fullscreen{background:#000;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}@media only screen and (max-width:600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0}[dir=ltr] .default__controls{text-align:left}[dir=rtl] .default__controls{text-align:right}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}@media only screen and (max-width:600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:\"\"}.default .default__gradient-bottom{transform:translate3d(0,50px,0)}.default .default__controls{transform:translate3d(0,52px,0)}@media only screen and (max-width:600px){.default .default__controls{transform:translate3d(0,65px,0)}}.default.show-controls .default__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:\"\"}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4,0,.2,1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.progress-line{--color:var(--primary-color);--height:5px;--border-radius:6px;--thumb-size:13px;border-radius:var(--border-radius);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{background-color:var(--color);border-radius:50%;content:\" \";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size)/2)) scale(1.125)}.progress-line:before,.progress-line__loaded{background-color:#c4c9cc;background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}[dir=ltr] .checkbox-field{text-align:left}[dir=rtl] .checkbox-field{text-align:right}.checkbox-field{--size:1.25rem;--offset-left:0px;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{pointer-events:none!important}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}[dir=ltr] .checkbox-field .checkbox-box{left:var(--offset-left)}[dir=rtl] .checkbox-field .checkbox-box{right:var(--offset-left)}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;left:0;right:0}.checkbox-field .checkbox-box-background{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:7px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:3.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}[dir=ltr] .checkbox-field .checkbox-caption{padding-left:3.375rem}[dir=rtl] .checkbox-field .checkbox-caption{padding-right:3.375rem}.checkbox-field .checkbox-caption{color:inherit;line-height:1.3125;line-height:var(--line-height);pointer-events:none;position:relative;transition:opacity .2s}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}[dir=ltr] .checkbox-field.hover-effect .checkbox-box{left:auto}[dir=rtl] .checkbox-field.hover-effect .checkbox-box{right:auto}.checkbox-field .anchor-url{pointer-events:all}.checkbox-ripple{border-radius:10px;overflow:hidden}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size:1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}[dir=ltr] .radio-field{text-align:left}[dir=rtl] .radio-field{text-align:right}.radio-field{--size:1.375rem;--offset-left:0px;cursor:pointer;line-height:1.3125;line-height:var(--line-height);margin:1.25rem 0;position:relative}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}[dir=ltr] .radio-field .radio-field-main{padding-left:3.5rem}[dir=rtl] .radio-field .radio-field-main{padding-right:3.5rem}.radio-field .radio-field-main{color:inherit;position:relative}[dir=ltr] .radio-field .radio-field-main:after,[dir=ltr] .radio-field .radio-field-main:before{left:var(--offset-left)}[dir=rtl] .radio-field .radio-field-main:after,[dir=rtl] .radio-field .radio-field-main:before{right:var(--offset-left)}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:\"\";display:block;height:var(--size);position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main:before{transition:border-color .1s ease,opacity .1s ease}[dir=ltr] .radio-field .radio-field-main:after{left:calc(var(--offset-left) + .3125rem)}[dir=rtl] .radio-field .radio-field-main:after{right:calc(var(--offset-left) + .3125rem)}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}[dir=ltr] .radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}[dir=rtl] .radio-field.radio-field-right .radio-field-main:before{left:0;right:auto}[dir=ltr] .radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[dir=rtl] .radio-field.radio-field-right .radio-field-main:after{left:.3125rem;right:auto}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:-1;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none!important;transition:background-color .2s!important}.checkbox-field-restriction .checkbox-box-check use{stroke-dasharray:24.19,24.19!important;transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.checkbox-field-restriction .checkbox-box-check use{transform:rotate(0) translateY(0)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0 .25rem;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:#fff;background-color:var(--surface-color);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:50%;content:\" \";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s cubic-bezier(.22,.75,.7,1.44)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width:600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:0 0 .5rem}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;margin:0;position:relative;-moz-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist-chat{background:var(--background)!important}.chatlist-chat{--background:unset;-webkit-user-drag:none}.chatlist-chat.is-forum-open,.chatlist-chat.menu-open,html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-filled-secondary-text-color)}[dir=ltr] .chatlist-chat.is-muted .user-title:after{margin-left:.125rem}[dir=rtl] .chatlist-chat.is-muted .user-title:after{margin-right:.125rem}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:\"\";flex:0 0 auto;font-size:1.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat i{font-style:normal}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat .premium-icon{margin-top:-.125rem}.chatlist-chat .topic-icon{flex:0 0 auto}[dir=ltr] .chatlist-chat .row-title .topic-icon{margin-right:.25rem}[dir=rtl] .chatlist-chat .row-title .topic-icon{margin-left:.25rem}.chatlist-chat .row-title .topic-icon{--size:1.375rem}.chatlist-chat .topic-name .topic-icon{line-height:1!important}.chatlist-chat .topic-name .topic-icon{display:inline}.chatlist-chat .topic-name .topic-icon-svg{position:relative}.chatlist-chat .topic-name .topic-icon-content{left:0;margin-top:-6px;position:absolute;right:0;top:0}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .premium-icon,.chatlist-chat.active .row-subtitle,.chatlist-chat.active .row-title,.chatlist-chat.active .sending-status-icon,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff!important}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active .danger,.chatlist-chat.active .primary-text{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-icon-background{fill:#fff!important}.chatlist-chat.active .verified-icon-check{visibility:hidden}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff!important}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .sending-status-icon.tgico-premium_lock{color:#c4c9cc;color:var(--secondary-color);font-size:.8125rem;margin:.1875rem 0 0 .5rem}[dir=ltr] .chatlist .dialog-title-details{margin-left:.5rem}[dir=rtl] .chatlist .dialog-title-details{margin-right:.5rem}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;padding:1px 0 0}[dir=ltr] .chatlist .dialog-subtitle-badge{margin-left:.5rem}[dir=rtl] .chatlist .dialog-subtitle-badge{margin-right:.5rem}.chatlist .dialog-subtitle-badge{display:block!important}.chatlist .dialog-subtitle-badge{flex:0 0 auto}.chatlist .dialog-subtitle-badge.avatar-badge{line-height:23px!important}.chatlist .dialog-subtitle-badge.avatar-badge{--size:1.625rem;border:2px solid #fff;border:2px solid var(--background,var(--surface-color));margin:0;pointer-events:none;position:absolute;right:calc(100% - 4.0625rem);top:2.4375rem}[dir=ltr] .chatlist .dialog-subtitle-media{margin-right:.375rem}[dir=rtl] .chatlist .dialog-subtitle-media{margin-left:.375rem}.chatlist .dialog-subtitle-media{border-radius:.25rem;display:inline-block;flex:0 0 auto;height:1.25rem;line-height:1.25rem;position:relative;width:1.25rem}.chatlist .dialog-subtitle-media:before{content:\" \";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;bottom:auto;height:inherit;-o-object-fit:cover;object-fit:cover;top:auto;width:inherit}.chatlist .dialog-group-call-icon{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .dialog-avatar,.chatlist .row-row{pointer-events:none;position:relative}.chatlist .user-title{display:flex!important}.chatlist .user-title{align-items:center}.chatlist .user-title img.emoji{height:18px;margin-top:1px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1;position:relative}[dir=ltr] .chatlist .message-status{margin-right:.125rem}[dir=rtl] .chatlist .message-status{margin-left:.125rem}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:#0ac630!important;background-color:var(--chatlist-status-color)!important;line-height:1.25rem!important}.chatlist .mention{padding:0}[dir=ltr] .chatlist .mention-badge{margin-right:-.125rem}[dir=rtl] .chatlist .mention-badge{margin-left:-.125rem}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread,.chatlist .no-unmuted-topic .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist .not-visited{background-color:#c4c9cc!important;background-color:var(--secondary-color)!important}.chatlist .not-visited{--size:.5rem;--padding:0}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{margin-bottom:0!important}.chatlist-bottom .sidebar-left-section{padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{max-width:728px!important;max-width:var(--messages-container-width)!important}}@media only screen and (min-width:601px){.chat-input{--padding-bottom:1.25rem}}@media only screen and (max-height:569px){.chat-input{--padding-bottom:0.5rem}}@media only screen and (min-width:1276px){.chat-input{width:calc(100% - var(--right-column-width))!important}body.is-right-column-shown .chat-input{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{position:absolute!important;transform:translate3d(0,var(--translateY),0)!important}.chat-input.is-hidden{--translateY:100%;bottom:0;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0!important}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .toggle-emoticons:before{content:\"\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"\"!important}[dir=ltr] .chat-input .btn-record-cancel{right:0}[dir=rtl] .chat-input .btn-record-cancel{left:0}.chat-input .btn-record-cancel{--multiplier:-1;opacity:0;padding:0;position:absolute;top:0;transform:translateX(calc((100% + var(--padding-horizontal) + .5rem)*var(--multiplier)));visibility:hidden;z-index:3}.chat-input .btn-record-cancel .c-ripple__circle,html.no-touch .chat-input .btn-record-cancel:active:after,html.no-touch .chat-input .btn-record-cancel:hover:after{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.chat-input .btn-record-cancel:before{color:#df3f40;color:var(--danger-color)}.is-rtl .chat-input .btn-record-cancel{--multiplier:1}[dir=ltr] .chat-input .btn-scheduled:after{right:5px}[dir=rtl] .chat-input .btn-scheduled:after{left:5px}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:\"\";height:.5rem;position:absolute;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{animation:hide-icon .4s ease-in-out forwards!important}[dir=ltr] .chat-input .float{margin-right:.75rem!important}[dir=rtl] .chat-input .float{margin-left:.75rem!important}.chat-input .float{display:none!important;margin:0!important}.chat-input .float{align-self:center}body.animation-level-2 .chat-input .float{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){[dir=ltr] .chat-input .float{margin-right:.125rem!important}[dir=rtl] .chat-input .float{margin-left:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}[dir=ltr] .chat-input .btn-send-container{right:var(--padding-horizontal)}[dir=rtl] .chat-input .btn-send-container{left:var(--padding-horizontal)}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-cancel-record,.chat-input .btn-send{box-shadow:0 1px 8px 1px rgba(0,0,0,.12)}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.chat-input .btn-send{z-index:3}html.no-touch .chat-input .btn-send:active,html.no-touch .chat-input .btn-send:hover{background-color:#157ce1!important;background-color:var(--dark-primary-color)!important}.chat-input .btn-send .tgico-check{height:32px!important}.chat-input .btn-send .tgico-check{font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:500;font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;content:\" \";display:inline-block;height:10px;margin-left:9px;margin-right:9px;width:10px}body.animation-level-2 .chat-input .record-time:after{animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;height:300px;opacity:.5;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - var(--chat-input-size)*2 - 1rem)}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}[dir=ltr] .chat-input:not(.is-recording) .btn-record-cancel{margin-right:0}[dir=rtl] .chat-input:not(.is-recording) .btn-record-cancel{margin-left:0}.chat-input:not(.is-recording) .btn-record-cancel{width:0}.chat-input .new-message-wrapper{opacity:1}.chat-input .reply-in-topic-overlay{align-items:center;background-color:inherit;border-radius:inherit;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;padding:0 1rem;pointer-events:none;z-index:3}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@media only screen and (max-width:600px){body.is-left-column-shown #column-center{transform:translate3d(100vw,0,0)}body.is-right-column-shown #column-center{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{position:fixed!important}#column-center{bottom:0;left:0;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem,0,0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex!important}.chat{align-items:center;flex-direction:column;transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 420px)),0,0)}}@media only screen and (min-width:1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)),0,0)}}@media only screen and (min-width:1276px)and (max-width:1680px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(75vw,0,0)}}@media only screen and (max-width:925px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(100vw,0,0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{position:absolute!important}.chat-background,.chat-background-item{bottom:0;left:0;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{background-color:#000!important;background-image:none!important;margin:0!important}.chat-background-item.is-pattern{align-items:center;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)!important}body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center}body.animation-level-2.is-right-column-shown .chat-background-item{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(.666666667)}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:soft-light}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.chat .drops-container{--padding:20px;--pinned-floating-height:0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width:1276px){[dir=ltr] body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}[dir=rtl] body.is-right-column-shown .chat .drops-container{left:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat[data-type=chat] .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:1rem;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);content:\" \";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:#fff;background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}[dir=ltr] .chat-input-control-button:before{margin-right:10px}[dir=rtl] .chat-input-control-button:before{margin-left:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}[dir=ltr] .selection-wrapper .selection-container .btn-icon{margin-left:6px;margin-right:5px}[dir=rtl] .selection-wrapper .selection-container .btn-icon{margin-left:5px;margin-right:6px}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;width:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width:600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width:380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}[dir=ltr] .selection-wrapper .selection-container-forward:before{margin-right:14px}[dir=rtl] .selection-wrapper .selection-container-forward:before{margin-left:14px}[dir=ltr] .selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}[dir=rtl] .selection-wrapper .selection-container-delete{margin-left:.625rem;margin-right:.375rem}[dir=ltr] .selection-wrapper .selection-container-delete:before{margin-right:10px}[dir=rtl] .selection-wrapper .selection-container-delete:before{margin-left:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}[dir=ltr] .fake-rows-wrapper{left:var(--padding-horizontal)}[dir=rtl] .fake-rows-wrapper{right:var(--padding-horizontal)}.fake-rows-wrapper{top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}[dir=ltr] .rows-wrapper{border-bottom-right-radius:0}[dir=rtl] .rows-wrapper{border-bottom-left-radius:0}.rows-wrapper{transform:translateX(0) scaleX(1)}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width:600px){.rows-wrapper{--padding-vertical:1px}}@media only screen and (max-width:420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height:569px){.rows-wrapper{--padding-vertical:1px}}[dir=ltr] .rows-wrapper .bubble-tail{right:-8.4px}[dir=rtl] .rows-wrapper .bubble-tail{left:-8.4px}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;transform:scaleX(-1);width:11px}.is-rtl .rows-wrapper .bubble-tail{transform:scaleX(1)}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:1rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .reply-wrapper{margin-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin-left:.625rem;margin-right:.625rem;order:1}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579!important;color:var(--secondary-text-color)!important}.rows-wrapper .reply-wrapper .reply-subtitle{height:1.125rem}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:3.125rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:3.125rem}.rows-wrapper .reply-wrapper .btn-menu{transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);top:auto}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item{padding-left:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-right:var(--icon-margin)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-left:var(--icon-margin)}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#000;stroke:var(--primary-text-color)}@media only screen and (max-width:600px){[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .input-message-input{max-height:27.5rem!important}.rows-wrapper .input-message-input{margin-top:-1px}@media only screen and (max-height:30rem){.rows-wrapper .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.rows-wrapper .input-message-input{max-height:10rem}}.rows-wrapper .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-left:var(--commands-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-right:var(--commands-margin-left)}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-left:var(--send-as-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-right:var(--send-as-margin-left)}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container{height:var(--send-as-size);width:var(--send-as-size)}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:auto}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:auto}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:calc(var(--padding-horizontal)*-1 - .25rem)!important}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:calc(var(--padding-horizontal)*-1 - .25rem)!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;max-height:20rem;max-width:20rem;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid #3390ec;border:.0625rem solid var(--primary-color);border-radius:inherit;bottom:var(--offset);content:\" \";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{line-height:1!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}[dir=ltr] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-right:var(--translateX)}[dir=rtl] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-left:var(--translateX)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin-bottom:5px;margin-left:var(--button-horizontal-margin);margin-right:var(--button-horizontal-margin);margin-top:0;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.input-message-container .scrollable{position:relative}.input-message-input{--custom-emoji-size:var(--messages-custom-emoji-size);background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.input-message-input pre{display:inline;margin:0}body.animation-level-2 .input-message-input{transition:height .1s}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:opacity var(--layer-transition),visibility 0s 0s!important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY:calc(var(--chat-input-size)*-1 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles-inner{transition:none!important}@media only screen and (min-width:1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width:600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner:after{content:\" \";height:.125rem}[dir=ltr] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}[dir=rtl] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-right:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - 2.875rem)!important;max-width:calc(100% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner.is-chat .name,.bubbles-inner:not(.is-channel) .message,.bubbles-inner:not(.is-channel) .name{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999!important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY)*-1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width:1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{transform:none!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-mention{--translateY:0;cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention.is-visible{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible}.chat-secondary-button{background-color:#fff!important;background-color:var(--surface-color)!important;box-shadow:0 1px 8px 1px rgba(0,0,0,.12)!important}.chat-secondary-button{align-items:center;border-radius:50%;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;position:absolute}body.animation-level-0 .chat-secondary-button{transition:none!important}.chat-secondary-button:before{position:relative}.chat-secondary-button:after{border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}html.no-touch .chat-secondary-button:active:after,html.no-touch .chat-secondary-button:hover:after{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}[dir=ltr] .bubbles-corner-button{right:var(--chat-input-padding)}[dir=rtl] .bubbles-corner-button{left:var(--chat-input-padding)}.bubbles-corner-button{bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);overflow:visible;z-index:2}[dir=ltr] .bubbles-corner-button .badge{right:-.25rem}[dir=rtl] .bubbles-corner-button .badge{left:-.25rem}.bubbles-corner-button .badge{position:absolute;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){[dir=ltr] .bubbles-corner-button .badge{right:.1875rem}[dir=rtl] .bubbles-corner-button .badge{left:.1875rem}.bubbles-corner-button .badge{top:-.75rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height:var(--topbar-call-height)}@media only screen and (min-width:1276px){body.is-right-column-shown{--topbar-floating-scaleX:calc(1 - var(--right-column-proportion))}}.topbar{cursor:pointer!important;max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important}.topbar{--topbar-height:3.5rem;--pinned-floating-audio-height:0px;--pinned-floating-message-height:0px;--pinned-floating-height:calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height:52px;--pinned-message-height:52px;margin-bottom:var(--pinned-floating-height);position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:\" \";height:calc(var(--topbar-height) + var(--pinned-floating-height));height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height:var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height:var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width:601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width:926px){.chat:first-child .topbar .sidebar-close-button{display:none}[dir=ltr] .chat:first-child .topbar .chat-info{padding-left:.1875rem}[dir=rtl] .chat:first-child .topbar .chat-info{padding-right:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 4.375rem);max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}[dir=ltr] .topbar .chat-info{padding-left:49px}[dir=rtl] .topbar .chat-info{padding-right:49px}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden}@media only screen and (max-width:600px){[dir=ltr] .topbar .chat-info{padding-left:52px}[dir=rtl] .topbar .chat-info{padding-right:52px}}@media only screen and (min-width:1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width:600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}[dir=ltr] .topbar .chat-join{margin-right:.5rem}[dir=rtl] .topbar .chat-join{margin-left:.5rem}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}[dir=ltr] .topbar .content{padding-left:1.125rem}[dir=rtl] .topbar .content{padding-right:1.125rem}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height:0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}[dir=ltr] .chat:not([data-type=chat]) .topbar .content{padding-left:16px}[dir=rtl] .chat:not([data-type=chat]) .topbar .content{padding-right:16px}[dir=ltr] .topbar-call-container{left:1px;right:0}[dir=rtl] .topbar-call-container{left:0;right:1px}.topbar-call-container{cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;min-height:auto!important}.topbar-call-container{color:#fff;position:absolute;top:-3rem;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){[dir=ltr] .topbar-call-container{left:0}[dir=rtl] .topbar-call-container{right:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}[dir=ltr] .topbar-call-left .btn-icon{margin-right:.375rem}[dir=rtl] .topbar-call-left .btn-icon{margin-left:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500;font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width)*-.5),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scaleY(-1);transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}.is-rtl .topbar-call-weave{transform-origin:right center}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubbles-group{position:relative}.bubbles-group-avatar{position:sticky!important}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{--line-height:var(--messages-line-height);display:flex;flex-wrap:wrap;margin:0 auto .125rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:2.375rem;width:var(--message-beside-button-size)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem!important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.0625rem;content:\" \";left:-50%;position:absolute;top:-.0625rem;z-index:-1}.bubble.is-highlighted:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:#fff;background-color:var(--surface-color);color:#3390ec;color:var(--primary-color);content:\"Unread messages\";font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.0625rem + 30px)}.bubble.is-selected:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0!important}.bubble-select-checkbox{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:#fff;background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;user-select:text}.bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(-1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button.goto-original{transform:translateX(-1.125rem) rotate(180deg)}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:var(--size);bottom:0;box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34,1.56,.64,1),transform .2s cubic-bezier(.34,1.56,.64,1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{font-weight:500;font-weight:var(--font-weight-bold);opacity:.99999;padding-bottom:.375rem;pointer-events:none;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat[data-type=chat] .bubble.is-date .bubble-content,.chat[data-type=discussion] .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{opacity:1!important;transition:none!important;visibility:visible!important}.bubble.is-date.is-fake{left:50%;position:absolute;top:0;transform:translateX(-50%)}.bubble-beside-button{align-items:center;background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:#fff;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);transform:translateX(0);width:2.375rem;width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.bubble-view-button{text-decoration:none!important}.bubble-view-button{align-items:center;border:1px solid #3390ec;border:1px solid var(--message-primary-color);border-radius:6px;color:#3390ec;color:var(--message-primary-color);display:flex;height:2rem;justify-content:center;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble-view-button:active,html.no-touch .bubble-view-button:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble-view-button .c-ripple__circle{background-color:#3390ec;background-color:var(--message-primary-color);opacity:.08}.message .bubble-view-button{margin:.375rem 0 -.375rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.bubble-view-button+.reactions-block{margin-top:.375rem}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0!important}.bubble.webpage .preview-with-document{min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble .canvas-thumbnail{border-radius:inherit}.bubble .canvas-dots{z-index:1}.bubble.emoji-big{--emoji-size:1rem;font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big .attachment{border-radius:0!important}.bubble.emoji-big .attachment{--custom-emoji-size:var(--emoji-size)}.bubble.emoji-big .attachment img.emoji{height:var(--emoji-size);max-height:64px;max-width:64px;width:var(--emoji-size)}.bubble.emoji-big .attachment .custom-emoji,.bubble.emoji-big .attachment .emoji{display:inline-block}.bubble.emoji-big:not(.sticker) .attachment{max-height:-moz-fit-content!important;max-height:fit-content!important}.bubble.emoji-big:not(.sticker) .attachment{display:block;font-size:var(--emoji-size);padding-bottom:1.25rem;padding-top:.25rem;white-space:pre-wrap;word-break:break-word}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-big:not(.sticker) .bubble-content{max-width:min(420px,100%)}.bubble.just-media .bubble-content{background:none!important}.bubble.just-media .bubble-content{box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:rgba(109,141,65,.4);background:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{position:relative!important;right:0!important}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:280px!important;height:var(--round-video-size)!important;max-height:280px!important;max-height:var(--round-video-size)!important;max-width:280px!important;max-width:var(--round-video-size)!important;width:280px!important;width:var(--round-video-size)!important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;z-index:1}.bubble .media-container-fitted{background-color:transparent!important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none!important}.bubble .album-item .bubble-select-checkbox{bottom:auto!important}.bubble .album-item .bubble-select-checkbox{left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4,0,.2,1),border-radius .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .attachment{pointer-events:none}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;padding:.75rem 1rem .875rem!important}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-size:1rem!important}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem!important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{cursor:pointer;height:200px;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:1.3125;line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .text,.bubble .web .title,.bubble .web .webpage-name{font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:#3390ec;background-color:var(--primary-color);border-radius:.125rem;content:\" \";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{--font-size:var(--messages-secondary-text-size)}.bubble .document-name{font-size:16px;font-size:var(--messages-text-size)}.bubble .document-size{font-size:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}.bubble:not(.just-media) .reply{border-radius:6px}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .floating-part{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin:0;max-width:15rem;padding:.375rem .625rem;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .floating-part{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important}.bubble.just-media .name{line-height:1.3125;line-height:var(--line-height);padding:.375rem .625rem}.bubble.just-media .name .peer-title{font-weight:400!important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width:600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{max-width:none!important}.bubble.just-media .reply-content{margin-top:0;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message,.bubble .service-msg{--custom-emoji-size:var(--messages-custom-emoji-size)}.bubble .message{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message .custom-emoji{display:inline-flex}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{max-width:min(100%,335px)!important}.bubble .message.audio-message{width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important}.bubble .message.audio-message{width:280px}}.bubble .message.voice-message .document-message{max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold)}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px!important}.bubble .message.document-message .document{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:\"\";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document .time{align-self:flex-start;height:0}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{padding:0!important}.bubble.is-multiple-documents .message{border-radius:inherit}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-2}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:#fff;background-color:var(--message-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection{animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection{animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit;content:\" \";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.0625rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.0625rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.25rem}.bubble.is-multiple-documents .document{height:54px!important}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document{height:38px!important}}.bubble.is-multiple-documents .document-wrapper{padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .bubble-content-wrapper{width:-moz-min-content;width:min-content}.bubble.is-message-empty .message{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:calc(12px + .375rem);height:calc(var(--messages-time-text-size) + .375rem);margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff!important}.bubble.is-message-empty.with-replies:not(.sticker):not(.with-beside-replies) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):active:after,html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):hover:after{background-color:#fff}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble.with-beside-replies .bubble-content{min-height:5.5rem}.bubble .colored-name .premium-icon{color:inherit;opacity:.6}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;font-size:var(--messages-time-text-size);height:12px;height:var(--messages-time-text-size);line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;color:#707579;color:var(--message-time-color);display:flex;height:12px;height:var(--messages-time-text-size);line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .inner:after{color:var(--message-status-color)}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble .time.is-block{display:block;float:none}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{--height:calc(var(--messages-time-text-size) + 0.375rem);align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:var(--height);color:#fff;display:flex;font-size:12px;font-size:var(--messages-time-text-size);height:var(--height);left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:\"\";font-size:20px;font-size:calc(var(--messages-time-text-size) + 8px);padding:0 1px 0 3px}[dir=ltr] .bubble .video-time.is-error:after{margin-left:1px}[dir=rtl] .bubble .video-time.is-error:after{margin-right:1px}.bubble .video-time.is-error:after{content:\"\";font-size:16px;font-size:calc(var(--messages-time-text-size) + 4px);padding:0}.bubble .extended-media-buy{align-items:center;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(0,0,0,.3);border-radius:2rem;color:#fff;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;left:50%;padding:0 1rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap;z-index:2}.bubble .extended-media-buy:before{font-size:1.125rem;margin-right:.25rem}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:14px;font-size:var(--messages-secondary-text-size);line-height:calc(14px + .25rem);line-height:calc(var(--messages-secondary-text-size) + .25rem);max-width:100%;overflow:hidden;padding:.375rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo:not(.is-reply) .bubble-content>.name,.bubble:not(.webpage).video:not(.is-reply) .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage).photo .topic-name-button-container,.bubble:not(.webpage).video .topic-name-button-container{margin-bottom:0}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:#fff;fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);color:#3390ec;color:var(--primary-color);display:flex;height:3.0625rem;min-width:15rem;padding:0 .5rem;position:relative}html.no-touch .bubble .replies-footer:active,html.no-touch .bubble .replies-footer:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .bubble .replies-footer:active~.bubble-tail,html.no-touch .bubble .replies-footer:hover~.bubble-tail{fill:#eff6fd;fill:var(--light-filled-message-primary-color)}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:#3390ec;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;position:static!important;right:auto!important}.bubble .message .reactions-block .time{order:100}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubble.with-reply-markup .bubble-content{border-bottom-left-radius:6px!important;border-bottom-right-radius:6px!important}.bubble .name-with-reply .name{padding:0!important}.bubble .name-with-reply .name:not(:last-child) .hide-ol{display:none}.bubble .name-with-reply .name:not(:last-child) .peer-title{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name-with-reply .reply{height:auto;margin:.25rem 0 0;max-height:none;padding:0}.bubble .topic-name-button{--color:var(--message-primary-color)}.bubble .name .topic-name-button-container{margin:.25rem -.125rem}.bubble .name .topic-name-button-container:first-child{margin-top:0}.bubble.is-message-empty:not(.is-reply) .name .topic-name-button-container{margin-bottom:0}.bubble:not(.is-group-first) .topic-name-button-container{display:none!important}.bubble .topic-name-button-container.floating-part{font-size:14px;font-size:var(--messages-secondary-text-size);padding-bottom:0;padding-top:0}.bubble .topic-name-button-container.floating-part .topic-name-button{--color:#fff;padding:0}.bubble .topic-name-button-container.floating-part .topic-name-button:before{content:none}.bubble .topic-name-button-container.floating-part+.floating-part{margin-top:1.75rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.0625rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type .document-container:last-of-type .document-selection,.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type:after{bottom:-.0625rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@media only screen and (min-width:601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width:600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:15px;font-size:var(--messages-service-text-size);justify-content:center;line-height:20px;line-height:calc(var(--messages-service-text-size) + 5px);padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title,.bubble.service .service-msg [data-saved-from],.bubble.service .service-msg a{cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold)}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{text-decoration:underline}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0!important}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .floating-part{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .floating-part{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .audio-time,.bubble.is-in .contact-number{color:#707579!important;color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:#df3f40;color:var(--monospace-text-color)}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:active,html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--message-background-color:var(--light-filled-message-out-primary-color);--light-message-background-color:var(--light-message-out-primary-color);--dark-message-background-color:var(--dark-message-out-primary-color);--link-color:var(--message-out-link-color);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);--selection-background-color:var(--message-out-selection-background-color);--message-time-color:var(--message-out-time-color);--message-status-color:var(--message-out-status-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width:1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0!important}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .floating-part{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e!important;background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:#4fae4e!important;color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{font-size:19px;font-size:calc(var(--messages-text-size) + 3px);line-height:12px;line-height:var(--messages-time-text-size);margin-left:1px}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:\"\"}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:\"\"}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:\"\"}.bubble.is-out.is-error .time .inner:after,.bubble.is-out.is-error .time:after{color:#df3f40;color:var(--message-error-color);content:\"\"}.bubble.is-out .document-ico:after{border-right-color:#fff;border-right-color:var(--message-background-color);border-top-color:#fff;border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e!important;fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#e1f9d2;color:var(--light-filled-message-out-primary-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color:var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:-2.875rem;left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{margin-top:.0625rem;width:100%}.bubble:not(.is-group-last) .reply-markup{margin-bottom:.125rem}.reply-markup-row{display:flex;margin-top:.125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child .reply-markup-button:first-child{border-bottom-left-radius:12px}.reply-markup-row:last-child .reply-markup-button:last-child{border-bottom-right-radius:12px}.reply-markup-button{color:#fff!important}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:.375rem;cursor:pointer;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button-text{pointer-events:none;position:relative}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button+.reply-markup-button{margin-left:.125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:\"\";transform:rotate(-45deg)}.reply-markup-button.is-buy:before{content:\"\"}.reply-markup-button.is-switch-inline:before{content:\"\"}.bubble-beside-button:after,.bubble.just-media .reply:after,.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}html.no-touch .bubble-beside-button:active:after,html.no-touch .bubble-beside-button:hover:after,html.no-touch .bubble.just-media .reply:active:after,html.no-touch .bubble.just-media .reply:hover:after,html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.bubble-primary-color{color:#3390ec;color:var(--message-primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.pinned-message{--custom-emoji-size:calc(var(--font-size) + 2px)!important}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:\" \";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(#fff,transparent);background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,#fff);background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:#3390ec;background:var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{--font-size:var(--font-size-14);--custom-emoji-size:calc(var(--font-size) + 4px);--line-height:calc(var(--font-size) + 4px);align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pinned-message-content,.reply-content{display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;justify-content:center;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;width:2rem!important}.pinned-message-media,.reply-media{left:0;overflow:hidden;position:absolute;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.pinned-message-media>video,.reply-media>img,.reply-media>video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:#707579;color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:#3390ec;background:var(--primary-color);border-radius:1px;height:calc(32px + .25rem);height:calc(var(--font-size)*2 + .25rem);min-width:2px}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0!important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:#fff!important;background-color:var(--surface-color)!important;position:absolute!important}.pinned-container.is-floating{height:var(--container-height);left:0;margin:0;max-height:var(--container-height);right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@media only screen and (max-width:600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width:1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height:var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:\"#\"}.pinned-message .animated-counter.is-last:not(.backwards){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat[data-type=discussion] .pinned-message .pinned-container-close{display:none!important}.pinned-audio{--progress-height:.25rem}.pinned-audio.is-floating{--container-height:var(--pinned-audio-height)}.pinned-audio:not(.is-floating){max-width:210px;padding-right:1.75rem;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible!important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0!important}.pinned-audio-ico:before{content:\"\"}.pinned-audio-ico.flip-icon:before{content:\"\"}.pinned-audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width:1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:\" \";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:#fff;background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),width .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:#dfe1e5;background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important}.markup-tooltip .btn-icon{height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:72px;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{background:none}.emoji-helper{padding:.25rem 0!important}.emoji-helper{height:50px}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:after,.emoji-helper .super-emojis:before{content:\" \";display:inline-block;width:.25rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:#dfe1e5;background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{left:.5rem;overflow:hidden;position:absolute}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{height:auto!important;width:auto!important}.inline-helper .gif{bottom:0;left:0;position:absolute;right:0;top:0}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(72px,1fr));grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:#707579;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{position:absolute!important}.chat-search{left:0;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:#fff;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:#707579;color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:#fff;background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{position:absolute!important;width:auto!important}.drops-container{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:#3390ec;stroke:var(--primary-color);animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.bot-commands{animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;padding:var(--offset) var(--offset) 0!important;position:absolute!important;transition:none!important;visibility:visible!important;width:auto!important}.bot-commands{--border-radius-padding:24px;--offset:.5rem;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;pointer-events:none;right:calc(var(--offset)*-1)}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{max-height:207px!important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);height:auto;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{border-radius:0!important}.bot-commands-list-element{align-items:flex-start;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:18px;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.crop.is-forum .crop-overlay{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.sidebar-header{align-items:center;background-color:#fff;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding-left:1rem;padding-right:1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding-left:.5rem;padding-right:.5rem}}[dir=ltr] .sidebar-header__title{padding-left:1.5rem}[dir=rtl] .sidebar-header__title{padding-right:1.5rem}.sidebar-header__title{color:#000;color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}[dir=ltr] .sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}[dir=rtl] .sidebar-header .btn-icon+.btn-icon{margin-right:.5rem}.sidebar-header-right{flex:0 0 auto}.scrollable-y-bordered .sidebar-header{position:relative}.scrollable-y-bordered .sidebar-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:\" \";height:1px;left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .scrollable-y-bordered .sidebar-header:after{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.scrollable-y-bordered:not(.scrolled-top) .sidebar-header:after{opacity:1}.sidebar-close-button{overflow:inherit!important}.sidebar-close-button{flex:0 0 auto;height:2.5rem;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0!important}.profile-avatars-avatars{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:\" \";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}[dir=ltr] .profile-avatars-info{left:1.5rem}[dir=rtl] .profile-avatars-info{right:1.5rem}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;pointer-events:none;position:absolute}[dir=ltr] .profile-avatars-info .profile-name,[dir=ltr] .profile-avatars-info .profile-subtitle{text-align:left}[dir=rtl] .profile-avatars-info .profile-name,[dir=rtl] .profile-avatars-info .profile-subtitle{text-align:right}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .premium-icon{color:#fff}.profile-avatars-info .verified-icon-background{fill:#fff}.profile-avatars-info .verified-icon-check{visibility:hidden}.profile-avatars-info .premium-icon,.profile-avatars-info .profile-subtitle,.profile-avatars-info .verified-icon{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}[dir=ltr] .profile-change-avatar{right:1.25rem}[dir=rtl] .profile-change-avatar{left:1.25rem}.profile-change-avatar{position:absolute!important;transition:none!important}.profile-change-avatar{--size:3.375rem;top:calc(var(--size)/-2);transform:none}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:#000;color:var(--primary-text-color);display:flex;font-size:20px;font-size:var(--font-size-20);font-weight:500;font-weight:var(--font-weight-bold);line-height:26px;line-height:var(--line-height-20);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem;justify-content:center;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;content:\" \";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3rem);--padding-horizontal:0px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:\" \";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px 10px 0 0}.menu-horizontal-div-item{transition:none!important}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:1.3125;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:#3390ec;background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:-.8125rem;box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:#f4f4f5;background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none!important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4,0,.2,1),filter .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;min-width:min(100%,18rem)}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}[dir=ltr] #column-left:after{right:-1px}[dir=rtl] #column-left:after{left:-1px}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:\" \";display:block;height:100vh;position:absolute;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:26.5rem}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width:926px){#column-left{display:flex}}@media only screen and (max-width:1275px){#column-left{flex:2}}@media only screen and (min-width:1681px){html.is-safari #column-left{max-width:418.75px}}#column-left .item-main .menu-horizontal-scrollable{background-color:#fff;background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .item-main .menu-horizontal-scrollable .scrollable{position:relative}[dir=ltr] #column-left .item-main .menu-horizontal-scrollable .badge{margin-left:5px}[dir=rtl] #column-left .item-main .menu-horizontal-scrollable .badge{margin-right:5px}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--scrollable-size));position:relative}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .item-main .menu-horizontal-div{position:relative!important}#column-left .item-main .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;z-index:0}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .item-main .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .item-main .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main{--offset-top:0;background-color:#fff;background-color:var(--surface-color)}[dir=ltr] #column-left .item-main .input-search .selector-user{left:6px}[dir=rtl] #column-left .item-main .input-search .selector-user{right:6px}[dir=ltr] #column-left .item-main .input-search .selector-user{margin-left:0}[dir=rtl] #column-left .item-main .input-search .selector-user{margin-right:0}#column-left .item-main .input-search .selector-user{position:absolute!important}#column-left .item-main .input-search .selector-user{height:30px;line-height:1.875rem;top:6px;z-index:1}[dir=ltr] #column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}[dir=rtl] #column-left .item-main .input-search.is-picked .input-search-input{padding-right:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block!important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}[dir=ltr] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}[dir=rtl] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{right:38px}[dir=ltr] #column-left .item-main .search-helper{margin-left:28px}[dir=rtl] #column-left .item-main .search-helper{margin-right:28px}#column-left .item-main .search-helper{display:flex}@media only screen and (max-width:600px){[dir=ltr] #column-left .item-main .search-helper{margin-left:20px}[dir=rtl] #column-left .item-main .search-helper{margin-right:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none!important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{position:relative!important}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto!important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%,-50%)}#column-left #chatlist-container{background-color:#fff;background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:4}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width:600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);min-width:260px}[dir=ltr] #column-left .sidebar-tools-button .btn-menu-item{padding-right:.375rem}[dir=rtl] #column-left .sidebar-tools-button .btn-menu-item{padding-left:.375rem}[dir=ltr] #column-left .archived-count{margin-left:.625rem}[dir=rtl] #column-left .archived-count{margin-right:.625rem}#column-left .archived-count{justify-self:flex-end}html[dir=ltr].is-mobile #column-left .archived-count{margin-right:.375rem}html[dir=rtl].is-mobile #column-left .archived-count{margin-left:.375rem}@media only screen and (max-width:600px){#column-left .archived-count{font-weight:500;font-weight:var(--font-weight-bold)}}#column-left .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding:0 0 1px}#column-left .search-group-people .chatlist:after,#column-left .search-group-people .chatlist:before{content:\" \";display:inline-block;flex:0 0 auto;width:.3125rem}#column-left .search-group-people .chatlist-chat{padding:0!important}#column-left .search-group-people .chatlist-chat{align-items:center;display:flex;flex:0 0 auto;flex-direction:column;height:6.125rem;justify-content:flex-end;max-width:4.875rem;width:4.875rem}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .dialog-title{max-width:65px;padding-bottom:.75rem}#column-left .search-group-people .dialog-title .user-title{font-size:.75rem!important}#column-left .search-group-people .dialog-title .peer-title{font-weight:400!important;font-weight:var(--font-weight-normal)!important}[dir=ltr] #column-left .search-group-people .dialog-avatar{left:auto!important}[dir=rtl] #column-left .search-group-people .dialog-avatar{right:auto!important}#column-left .search-group-people .dialog-avatar{top:.75rem!important}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){[dir=ltr] #column-left .search-group-people .search-group-scrollable{margin-left:-7px}[dir=rtl] #column-left .search-group-people .search-group-scrollable{margin-right:-7px}#column-left .search-group-people .search-group-scrollable{margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{position:fixed!important}#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}[dir=ltr] #column-left .connection-status-button{padding-left:4.5rem}[dir=rtl] #column-left .connection-status-button{padding-right:4.5rem}[dir=ltr] #column-left .connection-status-button{text-align:left}[dir=rtl] #column-left .connection-status-button{text-align:right}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}[dir=ltr] #column-left .connection-status-button .preloader-container{left:1rem}[dir=rtl] #column-left .connection-status-button .preloader-container{right:1rem}#column-left .connection-status-button .preloader-container{height:1.5rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:#fff;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{width:100%}}#search-container{top:var(--offset-top)!important}#search-container{display:flex}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{margin-left:23px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{margin-right:23px}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{padding-right:24px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{padding-left:24px}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:14px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{height:15rem;padding-bottom:0}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:0 auto;max-width:20rem;text-align:center}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-categories .checkbox-field{right:1.125rem!important}.folder-categories .checkbox-field{position:absolute}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}[dir=ltr] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}[dir=rtl] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-right:26px}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width:600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width:601px){.search-group-recent.search-group.search-group-contacts{padding:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0!important}.sidebar-left-section.with-fake-delimiter{box-shadow:none}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@media only screen and (max-width:600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width:601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}[dir=ltr] .sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}[dir=rtl] .sidebar-left-section-content>.checkbox-field .checkbox-box{right:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-content>.media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:#707579;color:var(--secondary-text-color);font-size:1rem;line-height:1.3125;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none!important}.sidebar-left-section-disabled{opacity:.25}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:#fff!important;background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff!important;background-color:var(--surface-color)!important}.two-step-verification .sidebar-left-section{box-shadow:none!important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem!important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{right:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width:601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row-title:first-child{font-weight:500;font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:#707579;color:var(--secondary-text-color);font-size:12px;font-size:var(--font-size-12);line-height:16px;line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (min-width:601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height:2px;--color:var(--primary-color);--border-radius:4px;--thumb-size:12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .background-item:after{border:3px solid #3390ec;border:3px solid var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .background-item.active:after{opacity:1}.background-container .background-item.active .grid-item-media{transform:scale(.91)}.background-container .background-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .background .preloader-container{z-index:1}.background-item{cursor:pointer}.background-item-media{border-radius:inherit}.background-item-media.is-pattern{background-color:#000;bottom:0;left:0;position:absolute;right:0;top:0}.background-item-media.is-pattern .media-photo{mix-blend-mode:soft-light}.background-item .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-colors-canvas{border-radius:inherit;height:100%;-webkit-mask-position:center;-webkit-mask-size:cover;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{width:21rem!important}.empty-placeholder{line-height:1.3125;line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;user-select:none}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}[dir=ltr] .empty-placeholder .btn-control:before{margin-right:.625rem}[dir=rtl] .empty-placeholder .btn-control:before{margin-left:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}.is-forum-visible .can-have-forum .input-search,.is-forum-visible .can-have-forum .row-row,.is-forum-visible .can-have-forum .sidebar-header__title{opacity:0}.is-forum-visible .folders-tabs-scrollable{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none}.is-forum-visible.backwards .can-have-forum .input-search,.is-forum-visible.backwards .can-have-forum .row-row,.is-forum-visible.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.backwards .folders-tabs-scrollable{opacity:1}.is-forum-visible.animating .can-have-forum .input-search,.is-forum-visible.animating .can-have-forum .row-row,.is-forum-visible.animating .can-have-forum .sidebar-header__title,.is-forum-visible.animating .folders-tabs-scrollable{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.is-forum-visible.animating.backwards .can-have-forum .input-search,.is-forum-visible.animating.backwards .can-have-forum .row-row,.is-forum-visible.animating.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.animating.backwards .folders-tabs-scrollable{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}#column-right{overflow:visible;overflow:initial;position:relative}@media only screen and (min-width:601px)and (max-width:1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width:600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw,0,0)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}@media only screen and (min-width:601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}}#column-right #search-private-container .chatlist-container{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{margin:.75rem 0;max-width:100%;padding:0 .75rem;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(100vh - 56px);min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .search-super-tabs{--padding-horizontal:0}.shared-media-container .search-super-tabs .menu-horizontal-div-item{border-radius:0!important}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:\"\"}@media only screen and (max-width:600px){.shared-media-container .btn-corner{position:fixed!important}.shared-media-container .btn-corner{bottom:14px;height:54px;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{flex:1 1 auto;width:auto}.search-super-tabs-scrollable{box-shadow:none!important;position:sticky!important}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:\" \";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:#fff!important;background-color:var(--surface-color)!important}.search-super-tabs-container>div{min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.search-super-tabs-container .preloader{position:absolute!important}.search-super-tabs-container .preloader{padding:0;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:2}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute!important}.search-super .checkbox-field{margin:0;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width:600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:\" \";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{--offset-left:0!important;margin:2rem 0 0 -1.75rem!important;padding:0!important}@media only screen and (min-width:601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width:600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 20px}@media only screen and (max-width:600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;margin-bottom:1.5rem}@media only screen and (min-width:601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-bottom:.5rem;padding-top:.5rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent!important}.search-super-selection-container{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width:600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short .chatlist-chat:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:500;font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:#707579;color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{margin:0 .5rem;width:auto}@media only screen and (max-width:600px){#poll-results-container .poll-results-more{border-radius:0;margin:0}}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{display:block!important}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem!important}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem!important}.edit-contact-container .avatar-placeholder{filter:none!important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem!important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem!important}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@media only screen and (max-width:600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width:600px){.media-viewer-userpic{display:none}}.media-viewer-name{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:1.3125;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9!important}.media-viewer-caption .scrollable{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width:600px){.media-viewer-caption{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0,-69px,0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{opacity:1!important}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{background-color:#000}}.media-viewer-caption.is-focused{opacity:1!important}.media-viewer-caption.is-focused{background-color:#000}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width:600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width:601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{min-height:auto!important;position:fixed!important}.media-viewer-mover{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;overflow:hidden;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover .canvas-thumbnail,.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration)/8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none!important}.media-viewer-mover.center{left:50%!important;top:50%!important;transform:translate3d(-50%,-50%,0)!important}.media-viewer-mover.center{max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-width:100vw!important;width:100%!important}.media-viewer-mover.center{max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center .canvas-thumbnail,.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding .canvas-thumbnail,.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{position:fixed!important}.media-viewer-whole{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width:600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important}.media-viewer-whole.hide-caption .media-viewer-caption{pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards .canvas-thumbnail,.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:\"\"}.tgico-zoom.zoom-in:before{content:\"\"}.zoom-container{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0!important}.zoom-container.is-visible~.media-viewer-caption{pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{position:fixed!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:#fff;background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(100vh - 135px));height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{position:absolute!important;width:23.875rem!important}.emoji-dropdown{-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:1.25rem;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;transform:scale(0);transform-origin:0 100%;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs:after{content:none}.emoji-dropdown .emoji-tabs-search{margin-left:.5rem!important}.emoji-dropdown .emoji-tabs-search{left:0;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 .75rem}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .stickers-padding .category-items{gap:.25rem;padding:0 .1875rem}.emoji-dropdown #content-gifs .scrollable-y{padding:0 .1875rem}.emoji-dropdown .gifs-masonry{border-radius:10px;overflow:hidden}.emoticons-container{background-color:transparent;flex-direction:column;height:100%;min-height:100%}.emoticons-menu{--item-size:1.875rem;align-items:center;min-height:3.0625rem;padding:0 .3125rem;width:100%;z-index:4}.emoticons-menu,.emoticons-menu-wrapper{background-color:transparent;height:3.0625rem}.emoticons-menu-wrapper{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);max-width:100%;padding:0;position:relative}.emoticons-menu:after{content:\" \";display:block;flex:0 0 auto;height:1px;width:.1875rem}.emoticons-menu .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:var(--item-size);line-height:var(--item-size);margin:0 .3125rem;padding:0;width:var(--item-size)}.emoticons-menu .menu-horizontal-div-item.not-local{border-radius:.25rem!important}.emoticons-menu .menu-horizontal-div-item.not-local{--item-size:2.375rem;padding:.25rem}.emoticons-menu .menu-horizontal-div-item.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-div-item.active,html.no-touch .emoticons-menu .menu-horizontal-div-item:active,html.no-touch .emoticons-menu .menu-horizontal-div-item:hover{color:rgba(0,0,0,.8)!important;color:rgba(var(--primary-text-color-rgb),.8)!important}.emoticons-menu .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoticons-menu .menu-horizontal-div-item.active:not(.tgico){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.emoticons-menu .menu-horizontal-inner{border-radius:15px;flex:0 0 auto;margin:0 .3125rem;overflow:hidden;width:1.875rem}html.is-safari .emoticons-menu .menu-horizontal-inner{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner{transition:width .2s ease-in-out}.emoticons-menu .menu-horizontal-inner-scroll{align-items:center;display:flex;height:100%;position:relative;width:8.5rem}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{margin:0!important}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transform:scale(1)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transition:transform .2s ease-in-out!important}.emoticons-menu .menu-horizontal-inner.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-inner.active{width:8.5rem}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item{transform:scale(.8)}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item.active{background-color:transparent!important}.emoticons-menu .menu-horizontal-inner:not(.active){cursor:pointer}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-inner-scroll{pointer-events:none}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-div-item:first-child{pointer-events:all}.emoticons-content{flex:1;padding:0;position:relative}.emoticons-content .emoji-category{position:relative}.emoticons-content .sticky_sentinel--top{height:1px;top:0}.emoticons-content .category-title{color:rgba(0,0,0,.42);color:rgba(var(--primary-text-color-rgb),.42);cursor:pointer;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:1.1875rem;padding:.75rem .875rem .375rem;position:relative;text-align:center;width:100%}.emoticons-content .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoticons-content:not(.has-premium) .is-premium-set .category-title:before{content:\"\";line-height:inherit;margin-right:.125rem;vertical-align:middle}.emoji-padding .super-emojis{padding:0 .5rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:rgba(0,0,0,.2) transparent;scrollbar-color:var(--scrollbar-color) transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:rgba(0,0,0,.2);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable.scrollable-y.scrollable-y-bordered{border-bottom:1px solid transparent;border-top:1px solid transparent}body.animation-level-2 .scrollable.scrollable-y.scrollable-y-bordered{transition:border-top-color .3s cubic-bezier(.4,0,.2,1),border-bottom-color .3s cubic-bezier(.4,0,.2,1);transition:border-top-color var(--transition-standard-in),border-bottom-color var(--transition-standard-in)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-top){border-top-color:#dfe1e5;border-top-color:var(--border-color)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-bottom){border-bottom-color:#dfe1e5;border-bottom-color:var(--border-color)}.scrollable-padding{height:100%;min-width:100%}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important}.selector .selector-search-section{position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding-left:1rem;padding-right:1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}[dir=ltr] .selector-user{padding-right:17px}[dir=rtl] .selector-user{padding-left:17px}[dir=ltr] .selector-user{margin-left:-.25rem;margin-right:.75rem}[dir=rtl] .selector-user{margin-left:.75rem;margin-right:-.25rem}.selector-user{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:#000;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;max-width:11.25rem;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{animation:scaleIn .1s ease forwards;animation-direction:reverse}[dir=ltr] .selector-user-avatar{margin-right:8px}[dir=rtl] .selector-user-avatar{margin-left:8px}.selector-user-avatar{border-radius:50%!important}.selector-user-avatar{float:left;overflow:hidden;position:relative}.is-rtl .selector-user-avatar{float:right}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}[dir=ltr] .selector-user-avatar:after{left:0}[dir=rtl] .selector-user-avatar:after{right:0}.selector-user-avatar:after{line-height:32px!important}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:\"\";font-size:23px;height:100%;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector>hr{margin:0;padding:0}[dir=ltr] .selector .checkbox{padding-left:11px}[dir=rtl] .selector .checkbox{padding-right:11px}.selector .checkbox{margin-top:11px}.selector .checkbox-field{--offset-left:0!important;margin:0!important;padding:0!important;position:absolute!important}.selector .checkbox-field{pointer-events:none;top:50%;transform:translateY(-50%);z-index:1}[dir=ltr] .selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}[dir=rtl] .selector .checkbox-field:first-child{margin-left:1.6875rem;margin-right:.6875rem}[dir=ltr] .selector .checkbox-field-round{right:1.125rem}[dir=rtl] .selector .checkbox-field-round{left:1.125rem}.selector .checkbox-field-round{--size:1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}[dir=ltr] .selector-square .checkbox-field{left:1.25rem!important}[dir=rtl] .selector-square .checkbox-field{right:1.25rem!important}[dir=ltr] .selector-square .chatlist-chat.row-with-padding{padding-left:7.5rem!important}[dir=rtl] .selector-square .chatlist-chat.row-with-padding{padding-right:7.5rem!important}[dir=ltr] .selector-square .dialog-avatar{margin-left:3rem!important}[dir=rtl] .selector-square .dialog-avatar{margin-right:3rem!important}.gifs-masonry{grid-gap:.125rem;display:grid;gap:.125rem;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr)}.gifs-masonry .gif img,.gifs-masonry .gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry .gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color:#fff}.preloader-container .you-spin-me-round{height:100%;width:100%}.preloader-container .preloader-circular{animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{animation:rotate 1s linear infinite!important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer!important}.preloader-container.preloader-streamable circle{stroke-width:2.5!important}.preloader-container.preloader-streamable:after{background-color:var(--color);border-radius:.125rem;content:\"\";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@keyframes rotate{to{transform:rotate(1turn)}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{animation:ripple-effect .7s forwards;background-color:rgba(0,0,0,.08);background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.c-ripple{--ripple-duration:.4s}.c-ripple__circle{animation-duration:.4s;animation-name:ripple-effect-handhelds;transition-duration:.3s}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}.avatar-like{line-height:var(--size)!important}.avatar-like{--size:54px;--multiplier:1;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--size)}avatar-element{--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%}avatar-element[data-color=red]{--color-top:var(--peer-avatar-red-top);--color-bottom:var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top:var(--peer-avatar-orange-top);--color-bottom:var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top:var(--peer-avatar-violet-top);--color-bottom:var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top:var(--peer-avatar-green-top);--color-bottom:var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top:var(--peer-avatar-cyan-top);--color-bottom:var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top:var(--peer-avatar-pink-top);--color-bottom:var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top:var(--peer-avatar-blue-top);--color-bottom:var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px/var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px/var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(30px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount{--color-top:var(--peer-avatar-archive-top);--color-bottom:var(--peer-avatar-archive-bottom);overflow:hidden}avatar-element.tgico-deletedaccount:before{font-size:calc(30px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;height:var(--size)!important;width:var(--size)!important}avatar-element img{display:block}avatar-element img.fade-in{animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}avatar-element.is-topic{background:none;border-radius:0;position:relative}avatar-element.is-topic .topic-icon{--size:inherit}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;content:\" \";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size:120px;--multiplier:.45}avatar-element.avatar-100{--size:100px;--multiplier:.54}avatar-element.avatar-48{--size:48px;--multiplier:1.125}avatar-element.avatar-46{--size:46px;--multiplier:1.173913}avatar-element.avatar-44{--size:44px;--multiplier:1.227272}avatar-element.avatar-42{--size:42px;--multiplier:1.285714}avatar-element.avatar-40{--size:40px;--multiplier:1.35}avatar-element.avatar-36{--size:36px;--multiplier:1.5}avatar-element.avatar-35{--size:35px;--multiplier:1.542857}avatar-element.avatar-34{--size:34px;--multiplier:1.588235}avatar-element.avatar-32{--size:32px;--multiplier:1.6875}avatar-element.avatar-30{--size:30px;--multiplier:1.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;width:100%!important}.avatar-full .avatar-photo{-o-object-fit:cover;object-fit:cover}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}html.is-safari .document-ico{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.document-ico-text{opacity:0}body.animation-level-2 .document-ico-text{transition:opacity .2s ease-in-out}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:#fff;border-right-color:var(--message-background-color);border-style:solid;border-top-color:#fff;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:\"\";display:block;position:absolute;right:0;top:0}body.animation-level-2 .document-ico:after{transition:border-width .2s ease-in-out}html.no-touch .document:not(.downloaded):active .document-ico:after,html.no-touch .document:not(.downloaded):hover .document-ico:after{border-width:0}html.no-touch .document:not(.downloaded):active .document-ico-text,html.no-touch .document:not(.downloaded):hover .document-ico-text{opacity:0}html.no-touch .document:not(.downloaded):active .preloader-container,html.no-touch .document:not(.downloaded):hover .preloader-container{opacity:1!important}.document:not(.downloading) .document-ico-text{opacity:1}.document:not(.downloading) .preloader-container{opacity:0!important}.document.downloading .document-ico:after{border-width:0}.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name,.document-size{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document.ext-zip{--background-color:#fb8c00}.document.ext-pdf{--background-color:#df3f40}.document.ext-apk{--background-color:#43a047}.document.document-with-thumb{--background-color:#fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.2);border-radius:.375rem}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3)!important}.document-thumb{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16);white-space:nowrap}.document-size{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);pointer-events:none;position:relative}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}[dir=ltr] .audio,[dir=ltr] .document{padding-left:var(--padding-left)}[dir=rtl] .audio,[dir=rtl] .document{padding-right:var(--padding-left)}.audio,.document{--padding:0px;--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin) + var(--padding));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none}[dir=ltr] .audio-download,[dir=ltr] .audio-ico,[dir=ltr] .document-download,[dir=ltr] .document-ico{margin-left:calc((var(--padding-left) - var(--padding))*-1)}[dir=rtl] .audio-download,[dir=rtl] .audio-ico,[dir=rtl] .document-download,[dir=rtl] .document-ico{margin-right:calc((var(--padding-left) - var(--padding))*-1)}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent!important}.audio .preloader-container:not(.preloader-streamable){height:100%;width:100%}.audio{overflow:visible!important}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size)}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{display:flex!important;margin:0!important}.audio.corner-download .audio-download{background:none;height:1.375rem;left:57.5%;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:#3390ec;background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out,-webkit-clip-path .25s ease-in-out}@media only screen and (min-width:601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width:600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width:601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width:600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:#000;color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:\" • \"}.audio-subtitle,.audio-time{color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height:2px;--border-radius:4px;--thumb-size:.75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{background-color:transparent;opacity:1;z-index:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff!important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}[dir=ltr] .quiz-hint .container{text-align:left}[dir=rtl] .quiz-hint .container{text-align:right}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:\"\";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{animation-duration:.6s;animation-iteration-count:infinite;animation-name:dotMiddle;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{animation-name:dotFirst}.peer-typing-text-dot:last-child{animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:#000;color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{cursor:pointer;display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}[dir=ltr] poll-element .poll-answer-percents{text-align:right}[dir=rtl] poll-element .poll-answer-percents{text-align:left}poll-element .poll-answer-percents{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:#3390ec;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:500;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:\"\";font-weight:500;font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important}poll-element .poll-footer-button{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:500;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:\"\";font-size:12px}poll-element .circle-hover{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{display:flex!important}poll-element .circle-hover .poll-answer-selected{animation:none;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{animation-fill-mode:forwards!important}.transition>.transition-item{height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.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.slide-fade{--easeOutSine:cubic-bezier(.39,.575,.565,1);--easeInSine:cubic-bezier(.47,0,.745,.715);position:relative}.transition.slide-fade>.from{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@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-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)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.4375rem 1rem;position:relative}.row.no-subtitle,.row.row-small{min-height:3rem;padding-bottom:.1875rem;padding-top:.1875rem}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{pointer-events:none!important}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity)}.row.no-wrap{padding-bottom:0!important;padding-top:0!important}.row a{pointer-events:all;position:relative;z-index:1}.row-title-row,.row>.row-title{order:0}[dir=ltr] .row-big{padding-left:1rem;padding-right:.75rem}[dir=rtl] .row-big{padding-left:.75rem;padding-right:1rem}.row-big{min-height:4.5rem;padding-bottom:.5625rem;padding-top:.5625rem}.row-row{align-items:center;display:flex;justify-content:space-between}.row-row .row-subtitle,.row-row .row-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-subtitle-row,.row>.row-subtitle{order:1}.row-title{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;word-break:break-word}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}[dir=ltr] .row-subtitle-right,[dir=ltr] .row-title-right{margin-left:1rem}[dir=rtl] .row-subtitle-right,[dir=rtl] .row-title-right{margin-right:1rem}.row-subtitle-right,.row-title-right{flex:0 0 auto!important}.row-midtitle,.row-subtitle,.row-title{pointer-events:none;position:relative}.row-midtitle{font-size:14px;font-size:var(--font-size-14);margin-top:.125rem;order:1}[dir=ltr] .row-with-padding{padding-left:4.5rem}[dir=rtl] .row-with-padding{padding-right:4.5rem}@media only screen and (max-width:600px){[dir=ltr] .row-with-padding{padding-left:4rem}[dir=rtl] .row-with-padding{padding-right:4rem}}[dir=ltr] .row-with-padding.tgico:before{left:1rem}[dir=rtl] .row-with-padding.tgico:before{right:1rem}.row-with-padding.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);z-index:1}.row-with-padding:not(.row-with-icon):before{display:none}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}[dir=ltr] .row-sortable .row-subtitle,[dir=ltr] .row-sortable .row-title{padding-right:2.5rem}[dir=rtl] .row-sortable .row-subtitle,[dir=rtl] .row-sortable .row-title{padding-left:2.5rem}[dir=ltr] .row-sortable-icon{right:.75rem}[dir=rtl] .row-sortable-icon{left:.75rem}.row-sortable-icon{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;height:1.5rem;line-height:1;opacity:0;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.row-sortable.cant-sort .row-sortable-icon{display:none}.row-sortable.is-dragging{background-color:#fff!important;background-color:var(--surface-color)!important}.row-sortable.is-dragging{z-index:1}html.no-touch .row-sortable.is-dragging:active,html.no-touch .row-sortable.is-dragging:hover{background-color:#f4f4f4!important;background-color:var(--light-filled-secondary-text-color)!important}html.no-touch .row-sortable:active .row-sortable-icon,html.no-touch .row-sortable:hover .row-sortable-icon{opacity:1}body.animation-level-2 .is-reordering .row-sortable{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{padding-left:3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{padding-right:3.375rem}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{margin-left:-3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{margin-right:-3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field:not(.radio-field-right) .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .radio-field{margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field{margin-right:0}[dir=rtl] .row .checkbox-field{margin-left:0}.row .checkbox-field{height:auto;margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field .checkbox-caption{padding-left:0}[dir=rtl] .row .checkbox-field .checkbox-caption{padding-right:0}.row .checkbox-field .checkbox-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row .checkbox-field-toggle{margin-left:.125rem;margin-right:.125rem;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:14px!important;font-size:var(--font-size-14)!important}.row-subtitle{line-height:18px;line-height:var(--line-height-14);margin-top:.1875rem}.row-subtitle:empty{display:none}[dir=ltr] .row-media{left:.75rem}[dir=rtl] .row-media{right:.75rem}.row-media{height:2.25rem!important;margin:0!important;position:absolute!important;width:2.25rem!important}.row-media{align-items:center;display:flex;justify-content:center;pointer-events:none}[dir=ltr] .row-media-small{left:.75rem!important}[dir=rtl] .row-media-small{right:.75rem!important}.row-media-small{height:2rem!important;width:2rem!important}[dir=ltr] .row-media-abitbigger{left:.75rem!important}[dir=rtl] .row-media-abitbigger{right:.75rem!important}.row-media-abitbigger{height:2.625rem!important;width:2.625rem!important}[dir=ltr] .row-media-big{left:.5rem!important}[dir=rtl] .row-media-big{right:.5rem!important}.row-media-big{height:3rem!important;width:3rem!important}[dir=ltr] .row-media-bigger{left:.5625rem!important}[dir=rtl] .row-media-bigger{right:.5625rem!important}.row-media-bigger{height:3.375rem!important;width:3.375rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}[dir=ltr] .row>.btn-primary{right:1rem}[dir=rtl] .row>.btn-primary{left:1rem}.row>.btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding-left:.75rem;padding-right:.75rem;position:absolute;top:50%;transform:translateY(-50%);width:auto}body.animation-level-2 .row>.btn-primary{transition:width .2s,background-color .2s,color .2s}.row>.btn-primary.active{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important}.row>.btn-primary.active{color:#3390ec;color:var(--primary-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:380px}@media only screen and (max-width:600px){.color-picker{padding:0 .75rem}}.color-picker-box{height:198px;width:100%}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible!important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{display:flex!important;padding:0!important;position:absolute!important;width:26.25rem!important}.reply-keyboard{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);flex-direction:column;max-height:26.25rem;max-width:100%;opacity:0;overflow:hidden;right:0;transform:scale(0);transform-origin:bottom right;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}@media only screen and (max-height:569px),only screen and (max-width:600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{background-color:transparent;border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:.375rem;color:#3390ec;color:var(--primary-color);font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.reply-keyboard .scrollable-y{padding:.625rem!important}.reply-keyboard .scrollable-y{bottom:auto;height:auto;left:auto;max-height:100%;position:relative;right:auto;top:auto}.peoplenearby-container div.text.nearby-description{color:#000;color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:#aaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:#3d9de0;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{animation:waves-animation 3s infinite;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{animation:waves-animation 5s infinite;animation-delay:2s;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:71px;margin-left:51px;margin-top:1px;width:66px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px!important}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{transform:rotateY(180deg)}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}.spoilers-container .custom-emoji-canvas{z-index:-1}.spoilers-container.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.spoilers-container.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim)}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler-text{opacity:1}.spoilers-container:not(.is-spoiler-visible) .spoiler{cursor:pointer}.spoilers-container:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation,.emoji-animation-container{pointer-events:none;position:absolute}.emoji-animation-container{bottom:0;left:0;overflow:hidden;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{--custom-emoji-size:var(--reaction-size);height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{height:var(--size)!important;width:var(--size)!important}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto}.reaction-sticker.is-custom{border-radius:.3125rem}.reaction-sticker.is-custom .custom-emoji,.reaction-sticker.is-custom .media-sticker{border-radius:inherit}.reaction-sticker.is-custom .custom-emoji-canvas{z-index:auto}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important}.reaction-inline .reaction-counter{order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:#f4f4f5;background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}html.no-touch .reaction-block:active:after,html.no-touch .reaction-block:hover:after{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:.08;position:absolute;right:0;top:0}.reaction-block .reaction-counter,.reaction-block .reaction-sticker{z-index:1}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale(0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scale(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4,0,.2,1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4,0,.2,1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important}.reaction-block .reaction-counter{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.sticker-viewer{align-items:center;bottom:0;display:flex;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:4}.sticker-viewer:before{background-color:rgba(0,0,0,.6);bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .sticker-viewer:before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.sticker-viewer.is-visible:not(.backwards):before{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards):before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .emoji-animation,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .emoji-animation,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker:not(.is-overflow){transition:opacity 0s}.sticker-viewer-transformer{--translateX:0;align-items:center;display:flex;height:360px;justify-content:center;position:absolute;width:360px}.sticker-viewer-transformer.has-effect{height:280px;width:280px}.sticker-viewer-transformer.has-effect .sticker-viewer-emoji{top:-5.5rem}body.animation-level-2 .sticker-viewer-transformer{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-out)}.sticker-viewer-transformer.is-switching{opacity:1!important;transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer-transformer.is-switching{transition:transform .2s cubic-bezier(.12,1.1,.56,1.2),opacity .2s cubic-bezier(.12,1.1,.56,1.2)!important;transition:transform var(--sticker-viewer-switch-transition),opacity var(--sticker-viewer-switch-transition)!important}.sticker-viewer-transformer.is-switching:not(.backwards){opacity:0!important;transform:scale(.4) translateX(var(--translateX))!important}.sticker-viewer-emoji{position:absolute;top:-3rem;transform:translateX(var(--translateX)) scale(2)}.sticker-viewer-sticker{position:absolute}.sticker-viewer .emoji-animation,.sticker-viewer-emoji,.sticker-viewer-sticker{opacity:0}body.animation-level-2 .sticker-viewer .emoji-animation,body.animation-level-2 .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.custom-emoji{height:1.25rem!important;height:var(--custom-emoji-size)!important;min-height:1.25rem!important;min-height:var(--custom-emoji-size)!important;min-width:1.25rem!important;min-width:var(--custom-emoji-size)!important;width:1.25rem!important;width:var(--custom-emoji-size)!important}.custom-emoji{display:inline;position:relative}.custom-emoji:before{content:\" \";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.custom-emoji .media-sticker,.custom-emoji .rlottie{height:inherit!important;max-height:inherit!important;max-width:inherit!important;width:inherit!important}.custom-emoji .media-sticker,.custom-emoji .rlottie{margin:0;pointer-events:none;text-indent:-9999px}.custom-emoji-canvas{height:100%;width:100%}.custom-emoji-canvas,.custom-emoji-renderer{bottom:0;left:0;position:absolute;right:0;top:0}.custom-emoji-renderer{pointer-events:none}.custom-emoji-placeholder{display:inline;height:20px;height:var(--messages-custom-emoji-size);margin-top:-.125rem;vertical-align:middle;width:20px;width:var(--messages-custom-emoji-size)}.usernames-username-icon{background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:50%;color:#fff;font-size:1.25rem}.usernames-username-icon:before{content:\"\"}.usernames-username.active .usernames-username-status{color:#3390ec!important;color:var(--primary-color)!important}.usernames-username.active .usernames-username-icon{background-color:#3390ec;background-color:var(--primary-color)}.topics-slider{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0}.topics-container{background-color:#fff!important;background-color:var(--surface-color)!important;width:var(--width)!important}.topics-container{--offset:0;--width:100%}.topics-container.is-floating{overflow:visible!important;overflow:initial!important}.topics-container.is-floating{--offset:5.0625rem;--width:calc(var(--left-column-width) - var(--offset));border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);bottom:0;pointer-events:all;position:absolute;right:0;top:0;transform:translateX(var(--width));z-index:3}.topics-container.is-visible:not(.backwards){transform:translateX(0)}.topics-container.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.topics-container.is-visible.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.topics-container .sidebar-header{padding:0 .75rem}.topics-container .sidebar-header__rows{flex:1 1 auto;overflow:hidden;padding-left:.5rem}.topics-container .sidebar-header__rows .sidebar-header__title{padding-left:0!important}.topics-container .sidebar-header__rows .sidebar-header__title{font-size:16px;font-size:var(--font-size-16);line-height:21px;line-height:var(--line-height-16);margin-bottom:.125rem}.topics-container .sidebar-header__subtitle,.topics-container .sidebar-header__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topics-container .sidebar-header__subtitle{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14)}.topics-container .chatlist-chat{min-height:4rem;padding-left:.75rem}.topic-name .topic-icon{margin-right:.25rem}.topic-name-button{text-decoration:none!important}.topic-name-button{--color:var(--primary-color);align-items:center;color:var(--color);cursor:pointer;display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:1.5rem;justify-content:center;max-width:100%;padding:0 .5rem;position:relative}.topic-name-button-container{display:flex!important}.topic-name-button-container{align-items:flex-start;justify-content:flex-start}.topic-name-button .peer-title,.topic-name-button .topic-name{position:relative}.topic-name-button:before{background-color:var(--color);border-radius:1.5rem;bottom:0;content:\" \";left:0;opacity:.08;position:absolute;right:0;top:0}html.no-touch .topic-name-button:active:before,html.no-touch .topic-name-button:hover:before{opacity:.16}.topic-icon{line-height:1.875!important}.topic-icon{--size:1.25rem;--custom-emoji-size:var(--size);display:inline-flex;font-size:calc(var(--size)/2);justify-content:center;position:relative;vertical-align:middle}.topic-icon-general{fill:#c4c9cc;fill:var(--secondary-color);height:var(--size);width:var(--size)}.topic-icon-svg{height:inherit;position:absolute;width:inherit}.topic-icon-content{position:relative}.edit-topic-container .scrollable-y{display:flex;flex-direction:column}.edit-topic-icon{position:absolute}.edit-topic-icon .topic-icon{--size:4rem}.edit-topic-icon-container{align-items:center;cursor:pointer;display:flex;height:100px;justify-content:center;margin:0 auto;position:relative;width:100px}.edit-topic-emoticons-container{flex:1 1 auto}.edit-topic-emoticons-container .sidebar-left-section{padding:0!important}.edit-topic-emoticons-container .sidebar-left-section{height:100%}.edit-topic-emoticons-container .emoji-padding{display:flex;flex-direction:column}.edit-topic-emoticons-container .super-emoji-topic-icon .topic-icon{--size:var(--esg-emoji-size);--custom-emoji-size:inherit;margin-left:calc((var(--custom-emoji-size) - var(--esg-emoji-size))/2)}.themes-container{align-items:center;display:flex;height:6.5rem;margin:0 -.5rem;position:relative;width:calc(100% + 1rem)}.themes-container:after,.themes-container:before{content:\" \";display:block;flex:0 0 auto;width:.5rem}.theme-container{border-radius:10px;flex:0 0 auto;height:calc(100% - .5rem);margin:0 .25rem;position:relative;transform:scale(1);width:4.5rem}body.animation-level-2 .theme-container{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.theme-container:active{transform:scale(.9)}.theme-container:before{border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:14px;bottom:-4px;content:\" \";left:-4px;position:absolute;right:-4px;top:-4px;transform:scale(.86)}body.animation-level-2 .theme-container:before{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.theme-container.active{pointer-events:none}.theme-container.active:before{transform:scale(1)}.theme-emoticon{bottom:.5rem;height:1.75rem;left:50%;pointer-events:none;position:absolute;transform:translateX(-50%);width:1.75rem}.theme-bubble{background-color:#fff;border-radius:1.75rem;height:1.25rem;position:absolute;width:2.5rem}.theme-bubble.is-out{background-color:#e1f9d2;background-color:var(--light-filled-message-out-primary-color);right:.375rem;top:.5rem}.theme-bubble.is-in{background-color:#fff;background-color:var(--message-background-color);left:.375rem;top:2rem}.popup{position:fixed!important}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;right:0;top:0;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}[dir=ltr] .popup-title{padding-left:1.5rem;padding-right:1rem}[dir=rtl] .popup-title{padding-left:1rem;padding-right:1.5rem}.popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1;margin:0}.popup-title:first-child{padding-left:0}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform .15s cubic-bezier(.4,0,.2,1);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem;position:relative}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:center;display:flex;flex-direction:row-reverse;height:3rem;justify-content:flex-start;padding:0 .5rem}.popup-buttons .btn{border-radius:10px;font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;max-width:100%;overflow:hidden;padding:0 1rem;position:relative;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}[dir=ltr] .popup-buttons .btn+.btn{margin-right:.625rem}[dir=rtl] .popup-buttons .btn+.btn{margin-left:.625rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}[dir=ltr] .popup-avatar h6{text-align:left}[dir=rtl] .popup-avatar h6{text-align:right}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:14px;font-size:var(--font-size-14);height:2.25rem;line-height:2.25rem;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-container{max-width:25rem;padding:0;width:25rem}.popup-new-media.popup-send-photo .popup-container.border-top-offset .popup-input-container{overflow:visible;overflow:initial}.popup-new-media.popup-send-photo .popup-container.border-top-offset .popup-input-container:before{top:-8px}.popup-new-media.popup-send-photo .popup-header{height:3.5rem;margin:0;padding:0 1rem}[dir=ltr] .popup-new-media.popup-send-photo .popup-title{padding-left:1.5rem}[dir=rtl] .popup-new-media.popup-send-photo .popup-title{padding-right:1.5rem}.popup-new-media.popup-send-photo .popup-close{margin:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .popup-body .scrollable{padding:0 .5rem}.popup-new-media.popup-send-photo .input-message-container{max-height:inherit;min-height:inherit}.popup-new-media.popup-send-photo .input-message-input{max-height:inherit!important}.popup-new-media.popup-send-photo .btn-primary{flex:0 0 auto;height:2.5rem;line-height:2.5rem;margin-bottom:.5rem;padding:0 1rem;text-transform:uppercase;width:auto}.popup-new-media.popup-send-photo .popup-input-container{--height:3.5rem;--max-height:8.375rem;align-items:flex-end;display:flex;flex:0 0 auto;justify-content:space-between;max-height:var(--max-height);min-height:var(--height);overflow:hidden;padding:0 .5rem;position:relative}.popup-new-media.popup-send-photo .popup-input-container:before{background-color:#dfe1e5;background-color:var(--border-color);content:\" \";height:1px;left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .popup-new-media.popup-send-photo .popup-input-container:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.popup-new-media.popup-send-photo .popup-input-container.has-border-top:before{opacity:1}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{border-radius:inherit;overflow:hidden;position:relative}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{--padding:.25rem;--icon-size:4.5rem;--icon-margin:.5rem;border-radius:10px;cursor:default;height:5rem;margin:0 .25rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{line-height:1.5;margin-bottom:.125rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{border-radius:5px;font-size:16px;font-weight:400;letter-spacing:0;line-height:11px}html.no-touch .popup-new-media.popup-send-photo .document:active,html.no-touch .popup-new-media.popup-send-photo .document:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;height:2.5rem;margin:0;padding:0 1rem;width:-moz-max-content;width:max-content}.popup-peer .popup-container{max-width:min(400px,100%);min-width:min(100%,17.5rem);padding:.75rem .5rem;width:-moz-min-content;width:min-content}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.popup-peer .popup-title:not(:first-child){padding-left:1rem}.popup-peer .popup-description{line-height:1.3125;line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-moz-fit-content;max-width:fit-content;min-width:min(100%,15rem);overflow:hidden;padding:.625rem 1rem .5rem;text-overflow:ellipsis;word-break:break-word}.popup-peer .checkbox-field{align-items:center;display:flex;height:3rem;margin:0;padding:0 1.125rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-stickers .sticker-set-footer{color:#3390ec;color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .scrollable.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .super-emojis{padding:0 .5rem}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}[dir=ltr] .popup-stickers .popup-close{margin-left:1rem}[dir=rtl] .popup-stickers .popup-close{margin-right:1rem}.popup-stickers .popup-close{font-size:1.5rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set .row-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-stickers .sticker-set-stickers{--per-row:5;--item-size:var(--popup-sticker-size);display:grid;grid-template-columns:repeat(var(--per-row),1fr);padding:0 5px;position:relative}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{--per-row:4}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper{cursor:pointer;height:var(--item-size);justify-self:center;margin-bottom:2px;position:relative;width:var(--item-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers .media-sticker-wrapper{margin-bottom:8px}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height:470px){.popup-date-picker .popup-container[data-lines=\"7\"]{top:19px}.popup-date-picker .popup-container[data-lines=\"5\"]{top:-19px}}.popup-date-picker .popup-header{margin-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7!important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.popup-date-picker .date-picker-month .btn-icon.active{border-radius:50%;color:#fff;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@media only screen and (max-width:600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines=\"5\"]{top:-16px}.popup-schedule .popup-container[data-lines=\"7\"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@media only screen and (max-width:600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold);margin-left:-5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:#000!important;color:var(--primary-text-color)!important;font-size:14px!important}.popup-schedule .date-picker-month-day{font-weight:500;font-weight:var(--font-weight-bold)}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width:600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px,100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main:before{left:.25rem}.popup-create-poll .radio-field .radio-field-main:after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{opacity:0!important}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-create-poll hr:not(.hide){display:block!important}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:7px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.8125rem}}.popup-forward .popup-title{flex-grow:1;height:100%;padding:0}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:20px;font-size:var(--font-size-20);height:100%;line-height:1;padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.1875rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1rem 0 .375rem;overflow:visible;overflow:initial}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-header{justify-content:space-between;width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale:1}.call-buttons .call-button-container.hide-me{--scale:0!important}.call-buttons .call-button-container.hide-me{transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(-2.6875rem);transform:translateX(calc(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(6.75rem + 2rem*var(--margin-length)));transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:#df3f40!important;background-color:var(--danger-color)!important}.call-button-green{background-color:#5cc85e!important;background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:7.625rem;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{height:1.875rem!important;width:1.875rem!important}.call-party-state .rlottie-icon{flex:0 0 auto;margin-left:-.25rem;margin-right:.25rem}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(-6.5rem);transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0),rgba(33,33,33,.65) 48.54%,#212121);background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:\" \";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{font-size:16px;font-size:var(--font-size-16);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:#aaa;color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:rgba(1,200,80,.2);background-color:var(--gc-button-unmuted-color);color:#fff;color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60,135,247,.2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223,68,184,.2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255,89,90,.3)!important;background-color:var(--gc-button-leave-color)!important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg,#00a3b4 12.94%,#00cb47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg,#4eabf8 14.73%,#3478f6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg,#df44b8 14.73%,#3851eb 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant .dialog-subtitle,.group-call-participant .dialog-title{padding-right:2.5rem}.group-call-participant-muted-icon-container{position:absolute!important}.group-call-participant-muted-icon-container{right:.5rem}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;height:2rem;margin-left:.75rem;width:2rem}.group-call-participant .is-speaking{color:#5cc85e;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container:before{content:\" \";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaa;color:var(--gc-secondary-text-color)}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25%!important}.group-call-cfs,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width:17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(-13.125rem);transform:translateX(calc(var(--gc-right-column-width)/-2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX:calc(var(--gc-right-column-width)/-2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{background-color:#212121;background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:-26.25rem;right:calc(var(--gc-right-column-width)*-1);top:0;width:26.25rem;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.popup-reacted-list{--size:1.5rem;--custom-emoji-size:var(--size)}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--reaction-size:var(--size);--additional-height:.75rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{font-size:1.25rem!important}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{display:flex;height:var(--size);position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:var(--size)}.popup-reacted-list .chatlist-chat{padding-right:3.25rem!important}.popup-payment .popup-container{border-radius:16px;max-height:min(100%,43.5rem);max-width:26.25rem;padding:0;width:26.25rem}.popup-payment .popup-header{height:3.5rem;margin:0;padding:0 1rem}.popup-payment.is-loading .popup-container{min-height:26.25rem}.popup-payment .scrollable{display:flex;flex:1 1 auto;flex-direction:column}.popup-payment hr{display:block!important;margin:.5rem 0!important;padding:0!important}.popup-payment .input-field{--height:3rem;margin:.75rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.popup-payment .input-fields-row .input-field{margin-top:1.25rem}.popup-payment .sidebar-left-section{padding:0!important}.popup-payment .sidebar-left-section-name+.input-field,.popup-payment .sidebar-left-section-name+.input-fields-row .input-field{margin-top:.75rem}.popup-payment .sidebar-left-section .row{margin-top:.5rem}.popup-payment .sidebar-left-section-content{margin:0 .5rem!important}.popup-payment .select-wrapper{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);max-height:10rem}.popup-payment .select-wrapper li{grid-template-columns:calc(26px + 2rem) 1fr;height:3rem}.popup-payment .payment-verification{border:none;flex:1 1 auto;height:40rem;max-height:100%;width:100%}.popup-payment .row{border-radius:10px}.payment-item{padding:0 1.25rem;width:100%}.payment-item-details{display:flex;flex:0 0 auto;justify-content:space-between;margin-bottom:1rem;overflow:hidden}.payment-item-details:last-child{margin-bottom:0}.payment-item-details-photo{border-radius:10px;flex:0 0 auto;height:6.25rem;margin-right:1rem;width:6.25rem}.payment-item-details-photo .media-photo{border-radius:inherit}.payment-item-details-lines{display:flex;flex:1 1 auto;flex-direction:column}.payment-item-details-lines-title{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16)}.payment-item-details-lines-bot-name,.payment-item-details-lines-description{font-size:14px;font-size:var(--font-size-14);line-height:1.25rem}.payment-item-details-lines-bot-name{color:#707579;color:var(--secondary-text-color)}.payment-item-prices{display:flex;flex-direction:column;margin:1rem .25rem .5rem}.payment-item-prices-price{color:#707579;color:var(--secondary-text-color);display:flex;font-weight:500;justify-content:space-between;line-height:1.1875rem}.payment-item-prices-price+.payment-item-prices-price{margin-top:1.5rem}.payment-item-prices-price.is-total{color:#000;color:var(--primary-text-color)}.payment-item-tips{display:flex;justify-content:space-between;margin:.75rem -.5rem 1.5rem}.payment-item-tips-tip{--background-intensity:.1;background-color:rgba(84,190,97,var(--background-intensity));border-radius:1.25rem;color:#3ba748;flex:1 1 auto;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;line-height:2.5rem;text-align:center}body.animation-level-2 .payment-item-tips-tip{transition:color .1s ease-in-out,background-color .1s ease-in-out}.payment-item-tips-tip+.payment-item-tips-tip{margin-left:.5rem}html.no-touch .payment-item-tips-tip:not(.active):active,html.no-touch .payment-item-tips-tip:not(.active):hover{--background-intensity:.3}.payment-item-tips-tip.active{--background-intensity:1;color:#fff}.payment-item-tips-input{color:inherit!important;font-weight:inherit!important}.payment-item-tips-input{display:inline}.payment-item-row{margin:0 .5rem;padding-bottom:0;padding-top:0}.payment-item-method-row .media-photo{border-radius:10px}.payment-item-pay{flex:0 0 auto;height:3rem;margin:1rem;text-transform:uppercase;width:auto}.payment-item-preloader-container{flex:1 1 auto;position:relative}.popup-payment-shipping-methods .popup-container{min-height:auto}.popup-payment-shipping-methods .row{margin-top:0!important}.popup-payment-verification .popup-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:\" \";height:1px;left:0;position:absolute;right:0}.popup-payment-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}.popup-limit .popup-container{min-width:min(100%,22.5rem)}.popup-limit-line{align-items:center;display:flex;flex-direction:column;margin:.75rem 0}.popup-limit-hint{align-items:center;color:#fff;display:flex;font-weight:500;font-weight:var(--font-weight-bold);justify-content:center;transform:scale(.6) translate(-280px,16px) rotate(-30deg)}body.animation-level-2 .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.2)}.popup-limit-hint.active{transform:scale(1) translate(0) rotate(0)}.popup-limit-hint-icon{display:flex;font-size:1.25rem;margin-right:.25rem}.popup-limit-button.primary{color:#fff!important}.popup-limit-button.primary{align-items:center;background:linear-gradient(88.39deg,#6c93ff -2.56%,#976fff 51.27%,#df69d1 107.39%);display:flex}.popup-limit-button-icon{display:flex;font-size:1.5rem;margin-left:.625rem}.popup-limit .limit-line{align-self:stretch;margin:1rem .5rem 0}.popup-limit:not(.is-locked) .popup-limit-hint{background:linear-gradient(73.4deg,#6c93ff -7.21%,#976fff 114.57%,#df69d1 241.52%);background-size:200px 2rem;border-radius:1rem;height:2rem;padding:0 .75rem;position:relative}.popup-limit:not(.is-locked) .popup-limit-hint:after{background:inherit;background-position-x:calc(-50% - 86px);background-repeat:no-repeat;background-size:inherit;bottom:-9px;-webkit-clip-path:path(\"M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z\");clip-path:path(\"M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z\");content:\" \";display:block;height:9px;left:50%;margin-left:-13px;position:absolute;width:100%}.popup-limit.is-locked .popup-limit-hint{background-color:#3390ec;background-color:var(--primary-color);border-radius:1.375rem;height:2.75rem;margin-right:-.25rem;padding:0 1.25rem 0 1rem}.popup-limit.is-premium .popup-limit-hint{align-self:flex-end;background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);background-position-x:100%;background-size:200px 2rem;border-bottom-right-radius:0;margin-right:.5rem}body.animation-level-2 .popup-limit.is-premium .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.1)}.popup-limit.is-premium .popup-limit-hint:after{background-position-x:134%;bottom:-11.3px;-webkit-clip-path:path(\"M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z\");clip-path:path(\"M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z\");height:12px;left:100%;margin-left:-20.6px}#auth-pages{background:#fff;background:var(--surface-color);max-width:100%;overflow:hidden}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width:600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width:600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width:600px){#auth-pages .input-wrapper{margin-top:41px;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height:810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;width:100%}@media screen and (max-height:810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width:600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:#3390ec;fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{height:240px!important;width:240px!important}.page-signQR .auth-image{align-items:center;display:flex;justify-content:center}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem!important}.page-signQR h4{flex:0 0 auto}[dir=ltr] .page-signQR .qr-description{text-align:left}[dir=rtl] .page-signQR .qr-description{text-align:right}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@media only screen and (max-width:600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width:600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center;margin:1.375rem 0 .875rem}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40!important;border-color:var(--danger-color)!important}.page-authCode .phone-wrapper .phone{margin:0}.page-authCode .subtitle{margin:0 auto!important}.page-authCode .subtitle{max-width:300px}.page-chats{max-width:1682px!important}.page-chats{display:flex}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important}.page-chats .main-column{width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{display:flex!important}.page-chats #column-center{background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:#dfe1e5;border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;overflow:hidden;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100)}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:Roboto Mono,monospace;font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width:100%}@media only screen and (min-width:601px){.only-handhelds{display:none!important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500;font-weight:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}input:-webkit-autofill:first-line{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial;font-size:16px}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40!important;color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec!important;color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.primary-text{color:#000!important;color:var(--primary-text-color)!important}.color-premium{-webkit-text-fill-color:transparent;background:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%);background:var(--premium-gradient);-webkit-background-clip:text}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@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 fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:min(30rem,calc(100vw - 2rem));opacity:0;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast.is-visible{opacity:1}body.animation-level-2 .toast{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.toast b{color:inherit}.toast a{color:#60a5e9!important}.toast a{cursor:pointer}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}b{font-weight:500;font-weight:var(--font-weight-bold)}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.avatar-edit-canvas{background:linear-gradient(#69bffa,#3d9de0);background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{color:#fff;font-size:3rem;height:3rem;left:50%;line-height:1;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);width:3rem;z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}[dir=ltr] .select-wrapper li{text-align:left}[dir=rtl] .select-wrapper li{text-align:right}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}[dir=ltr] .phone-code{text-align:right}[dir=rtl] .phone-code{text-align:left}.phone-code{color:#9e9e9e}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}[dir=ltr] .phone-edit{margin-left:.4rem}[dir=rtl] .phone-edit{margin-right:.4rem}.phone-edit{cursor:pointer;font-size:1.5rem;height:1.5rem;line-height:1;opacity:.5;transition:opacity .2s;width:1.5rem}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}span.emoji{font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol}@media not screen and (-webkit-min-device-pixel-ratio:2),not screen and (min-device-pixel-ratio:2),not screen and (min-resolution:192dpi),not screen and (min-resolution:2dppx){html[dir=ltr]:not(.is-safari) span.emoji{margin-right:5px!important}html[dir=rtl]:not(.is-safari) span.emoji{margin-left:5px!important}html[dir=ltr]:not(.is-safari) avatar-element span.emoji{margin-right:0!important}html[dir=rtl]:not(.is-safari) avatar-element span.emoji{margin-left:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable=true] .custom-emoji{display:inline-block;margin-bottom:-2px}[contenteditable=true] .custom-emoji:before{content:none}[contenteditable=true] [style*=markup]{font-family:inherit!important}[contenteditable=true] [style*=bold]{font-weight:700}[contenteditable=true] [style*=italic]{font-style:italic}[contenteditable=true] [style*=underline]{text-decoration-line:underline}[contenteditable=true] [style*=strikethrough]{text-decoration-line:line-through}[contenteditable=true] [style*=underline][style*=strikethrough]{text-decoration-line:underline line-through}[contenteditable=true] [style*=monospace]{font-family:Roboto Mono,monospace!important;font-family:var(--font-monospace)!important}[contenteditable=true] [style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color)}[contenteditable][data-placeholder]:before{color:#a2acb4;content:attr(data-placeholder);display:block;opacity:0;pointer-events:none;position:absolute}body.animation-level-2 [contenteditable][data-placeholder]:before{transform:translateX(1.75rem);transition:opacity .2s ease-out .01s,transform .2s ease-out .01s;transition:opacity var(--input-transition) .01s,transform var(--input-transition) .01s}[contenteditable][data-placeholder]:empty:before{opacity:1}body.animation-level-2 [contenteditable][data-placeholder]:empty:before{transform:translateX(0)}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{display:grid;grid-template-columns:repeat(auto-fill,72px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){[dir=ltr] .show-more{padding-left:8px}[dir=rtl] .show-more{padding-right:8px}}[dir=ltr] .show-more .tgico-down{padding-left:1rem;padding-right:2rem}[dir=rtl] .show-more .tgico-down{padding-left:2rem;padding-right:1rem}.show-more .tgico-down{float:left;font-size:24px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}::-moz-selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after,::selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after{bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.input-something{display:inline-block}.input-selectable{position:relative}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0,calc(var(--translateY)*-1),0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0,var(--translateY),0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-container-contain{position:relative}.media-container-contain .media-photo{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.media-container-cover{position:relative}.media-container-cover .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-sticker-wrapper.is-premium-sticker:before{align-items:center;background:rgba(0,0,0,.2);background-image:var(--lock-url);background-repeat:no-repeat;background-size:cover;border-radius:50%;bottom:.125rem;color:#fff;display:flex;height:1.25rem;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:1.25rem;z-index:1}body.is-premium .media-sticker-wrapper.is-premium-sticker:after,body.is-premium .media-sticker-wrapper.is-premium-sticker:before{content:none}.media-round{max-height:280px;max-height:var(--round-video-size);max-width:280px;max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:rgba(109,141,65,.4)!important;background-color:var(--message-highlightning-color)!important}.media-round .video-time{padding:0 .375rem}[dir=ltr] .media-round .video-time:after,[dir=ltr] .media-round .video-time:before{margin-left:.25rem}[dir=rtl] .media-round .video-time:after,[dir=rtl] .media-round .video-time:before{margin-right:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:\" \";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:\"\";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:#f4f4f5;background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.sidebar-left-section{padding:.5rem 0!important}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);box-shadow:0 1px 3px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{padding:0 1rem}}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-left-section-container a{cursor:pointer}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important}.tgico-admin:before,.tgico-fontsize:before{padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.navigable-list .active{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{--esg-emoji-total-size:calc(var(--esg-emoji-size) + 0.5rem);--custom-emoji-size:var(--esg-emoji-size);grid-column-gap:2.44px;--esg-emoji-size:2.125rem;--esg-emoji-total-size:2.625rem;--custom-emoji-size:2.25rem;-moz-column-gap:2.44px;column-gap:2.44px;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;font-size:var(--esg-emoji-size);grid-template-columns:repeat(auto-fill,var(--esg-emoji-total-size));justify-content:space-between;line-height:var(--esg-emoji-size);position:relative}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:var(--esg-emoji-total-size);line-height:inherit;margin-left:.0625rem;margin-right:.0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:var(--esg-emoji-total-size)}.super-emojis .super-emoji .emoji-placeholder{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}.super-emojis .super-emoji.active,html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.super-emojis.not-local .super-emoji{padding:.1875rem}.super-emojis .super-emoji{margin:0}.super-emojis:not(.not-local) .super-emoji{overflow:hidden}html.native-emoji .super-emojis:not(.not-local) .super-emoji{padding-bottom:.3125rem;padding-top:.3125rem}.super-emojis .custom-emoji{display:block}.super-emojis .custom-emoji-renderer{z-index:1}.super-emojis .custom-emoji:before{content:none}.tgico-char:before{font-family:Roboto!important}.tgico-char:before{font-weight:500;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:\"Z\"}.tgico-char.w:before{content:\"W\"}.sending-status:empty{display:none}.sending-status .tgico-sendingerror{color:#df3f40;color:var(--danger-color)}.sending-status-icon{line-height:1!important}.sending-status-icon{position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon-svg{height:1rem;width:1rem}.verified-icon-check{fill:#fff}.verified-icon-background{fill:#3390ec;fill:var(--primary-color)}[dir=ltr] .emoji-status,[dir=ltr] .premium-icon,[dir=ltr] .verified-icon{margin-left:.125rem}[dir=rtl] .emoji-status,[dir=rtl] .premium-icon,[dir=rtl] .verified-icon{margin-right:.125rem}.emoji-status,.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;width:1.25rem}[dir=ltr] .emoji-status{margin-left:.25rem}[dir=rtl] .emoji-status{margin-right:.25rem}.emoji-status{height:1.125rem;position:relative;width:1.125rem}.premium-icon{color:#3390ec;color:var(--primary-color);margin-top:-.0625rem}.badge-fake{line-height:1!important}.badge-fake{border:1px solid #df3f40;border:1px solid var(--danger-color);border-radius:.185rem;color:#df3f40;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.25rem;margin-right:.25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex;overflow:hidden}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.limit-line{display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:2rem}.limit-line-free{color:#000}.limit-line-premium{color:#fff}.limit-line-free{background-color:#f1f3f5;border-bottom-left-radius:10px;border-top-left-radius:10px}.limit-line-premium{background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);border-bottom-right-radius:10px;border-top-right-radius:10px}.limit-line-free,.limit-line-premium{align-items:center;display:flex;flex:1 1 0;justify-content:space-between;padding:0 .75rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}[dir=ltr] .chatlist-chat.row-with-padding{padding-left:4.5rem!important}[dir=rtl] .chatlist-chat.row-with-padding{padding-right:4.5rem!important}.chatlist-chat span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist-chat .row-title{font-size:16px!important;font-size:var(--font-size-16)!important}.chatlist-chat .row-title{line-height:1.375rem}.chatlist-chat .row-title-right-secondary{font-size:12px!important;font-size:var(--font-size-12)!important;line-height:16px!important;line-height:var(--line-height-12)!important}.chatlist-chat .row-title-right-secondary{margin-top:-.4375rem}.chatlist-chat .row-subtitle{display:block!important}.chatlist-chat .row-row{height:1.375rem}.chatlist-chat.chatlist-chat-abitbigger .row-subtitle{margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle{font-size:16px!important;font-size:var(--font-size-16)!important}.chatlist-chat.chatlist-chat-bigger .row-subtitle{line-height:1.375rem;margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle-row{margin-top:.125rem}.chatlist-chat.chatlist-chat-bigger .row-title .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.username-purchase-help b{color:#df3f40!important;color:var(--danger-color)!important;font-weight:400!important;font-weight:var(--font-weight-normal)!important}.media-spoiler-container{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.media-spoiler-container.is-revealing{opacity:1}.media-spoiler-container.is-revealing:not(.backwards){opacity:0}.media-spoiler-container.is-revealing.animating{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{-o-object-fit:initial!important;object-fit:fill!important}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{height:100%;position:absolute;width:100%}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.ae7615ad31a2454bfc82.css b/public/main.ae7615ad31a2454bfc82.css new file mode 100644 index 00000000..97d78bd6 --- /dev/null +++ b/public/main.ae7615ad31a2454bfc82.css @@ -0,0 +1,4 @@ +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}button{background:none;border:none;cursor:pointer;outline:none;padding:0}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none!important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;user-select:none}.no-transition,.no-transition:after,.no-transition:before{transition:none!important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start!important}.justify-self-start{justify-self:flex-start!important}.justify-self-end{justify-self:flex-end!important}.position-center{position:absolute!important}.position-center{left:50%;top:50%;transform:translate(-50%,-50%)}.text-bold{font-weight:500!important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap!important}.no-wrap{white-space:nowrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}.reflect-x{transform:scaleX(-1)}[dir=auto]{unicode-bidi:plaintext}.is-rtl [dir=auto]{direction:inherit}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap} +:root{--vh:1vh;--z-below:-1;--hover-alpha:0.08;--transition-standard-easing:cubic-bezier(.4,.0,.2,1);--transition-standard-in-time:.3s;--transition-standard-out-time:.25s;--transition-standard-in:var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out:var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition:.2s ease-in-out;--layer-transition:.2s cubic-bezier(.4,.0,.2,1);--slide-header-transition:.4s ease-in-out;--tabs-transition:.2s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--sticker-viewer-open-transition-in:.2s var(--transition-standard-easing);--sticker-viewer-open-transition-out:.2s var(--transition-standard-easing);--sticker-viewer-switch-transition:.2s cubic-bezier(.12,1.1,.56,1.2);--popup-transition-function:cubic-bezier(.4,0,.2,1);--popup-transition-time:.15s;--btn-corner-transition:.2s cubic-bezier(.34,1.56,.64,1);--chatlist-badge-transition-in:.25s cubic-bezier(.35,.35,.47,1.34);--chatlist-badge-transition-out:.25s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin:5.5625rem;--message-beside-button-size:2.375rem;--message-beside-button-margin:calc((var(--message-beside-button-size) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-line-height:1.3125;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--messages-time-text-size:calc(var(--messages-text-size) - 4px);--messages-service-text-size:calc(var(--messages-text-size) - 1px);--messages-custom-emoji-size:calc(var(--messages-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height-20:26px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--line-height:1.3125;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--font-size:var(--font-size-16);--esg-sticker-size:72px;--esg-custom-emoji-size:36px;--popup-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-backdrop-filter:blur(50px);--font-monospace:"Roboto Mono",monospace;--font-weight-bold:500;--font-weight-normal:400;--selection-background-color:rgba(var(--primary-color-rgb),.4);--selection-color:inherit;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--custom-emoji-size:1.25rem;--peer-avatar-red-top:#ff845e;--peer-avatar-red-bottom:#d45246;--peer-avatar-orange-top:#febb5b;--peer-avatar-orange-bottom:#f68136;--peer-avatar-violet-top:#b694f9;--peer-avatar-violet-bottom:#6c61df;--peer-avatar-green-top:#9ad164;--peer-avatar-green-bottom:#46ba43;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#5bcbe3;--peer-avatar-blue-bottom:#359ad4;--peer-avatar-pink-top:#ff8aac;--peer-avatar-pink-bottom:#d95574;--peer-avatar-saved-top:#69bffa;--peer-avatar-saved-bottom:#3d9de0;--peer-avatar-archive-top:#b8c2cc;--peer-avatar-archive-bottom:#9eaab5;--avatar-color-top:var(--peer-avatar-saved-top);--avatar-color-bottom:var(--peer-avatar-saved-bottom);--avatar-border-radius-forum:37%;--premium-gradient:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%)}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--popup-sticker-size:68px;--round-video-size:200px;--chat-input-size:2.875rem;--chat-input-padding:0.5rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:601px){:root{--right-column-width:420px;--chat-input-size:3.375rem;--chat-input-padding:0.8125rem;--chat-input-inner-padding:0.5rem}}@media only screen and (max-height:569px){:root{--chat-input-size:2.875rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:1276px)and (max-width:1680px){:root{--right-column-width:25vw}}:root{--body-background-color:#fff;--background-color-true:#f4f4f5;--background-color:var(--background-color-true);--border-color:#dfe1e5;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--secondary-color:#c4c9cc;--avatar-online-color:#0ac630;--chatlist-status-color:var(--avatar-online-color);--chatlist-pinned-color:#a2abb2;--badge-text-color:#fff;--link-color:#00488f;--ripple-color:rgba(0,0,0,.08);--poll-circle-color:var(--border-color);--spoiler-background-color:#e3e5e8;--spoiler-draft-background-color:#d9d9d9;--monospace-text-color:var(--danger-color);--backdrop-opacity:.85;--menu-background-color:rgba(var(--surface-color-rgb),var(--backdrop-opacity));--message-background-color:var(--surface-color);--message-time-color:var(--secondary-text-color);--message-checkbox-color:#61c642;--message-checkbox-border-color:#fff;--message-primary-color:var(--primary-color);--light-filled-message-primary-color:var(--light-filled-primary-color);--message-secondary-color:var(--secondary-color);--message-error-color:var(--danger-color);--message-out-link-color:var(--link-color);--message-out-status-color:var(--message-out-primary-color);--message-out-time-color:var(--message-out-status-color);--message-out-audio-play-button-color:#fff;--message-out-selection-background-color:var(--selection-background-color);--gc-background-color:#212121;--gc-button-leave-color:rgba(255,89,90,.3);--gc-button-unmuted-color:rgba(1,200,80,.2);--gc-button-muted-color:rgba(60,135,247,.2);--gc-button-hand-color:rgba(223,68,184,.2);--gc-button-unmuted-fill-color:#195530;--gc-button-muted-fill-color:#3c87f7;--gc-green-color:#195530;--gc-blue-color:#3c87f7;--gc-red-color:#643333;--gc-primary-text-color:#fff;--gc-secondary-text-color:#aaa;--gc-green-text-color:#5cc85e;--gc-blue-text-color:#3390ec;--gc-red-text-color:#ff595a;--gc-right-column-width:26.25rem}.night{--body-background-color:#181818;--background-color-true:#181818;--background-color:var(--background-color-true);--border-color:#0f0f0f;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--secondary-color:#707579;--avatar-online-color:#0ac630;--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-color);--message-time-color:var(--secondary-text-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-error-color:#fff;--message-out-link-color:#fff;--message-out-status-color:#fff;--message-out-time-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color);--message-out-selection-background-color:rgba(var(--surface-color-rgb),.4)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?ivbp49) format("truetype"),url(assets/fonts/tgico.woff?ivbp49) format("woff"),url(assets/fonts/tgico.svg?ivbp49#tgico) format("svg")}.tgico:after,.tgico:before,[class*=" tgico-"]:after,[class*=" tgico-"]:before,[class^=tgico-]{font-family:tgico!important}.tgico:after,.tgico:before,[class*=" tgico-"]:after,[class*=" tgico-"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:""}.tgico-checks:before{content:""}.tgico-activesessions:before{content:""}.tgico-add:before{content:""}.tgico-add_reaction:before{content:""}.tgico-addmember_filled:before{content:""}.tgico-adduser:before{content:""}.tgico-admin:before{content:""}.tgico-animals:before{content:""}.tgico-animations:before{content:""}.tgico-archive:before{content:""}.tgico-arrow_down:before{content:""}.tgico-arrow_next:before{content:""}.tgico-attach:before{content:""}.tgico-audio_repeat:before{content:""}.tgico-audio_repeat_single:before{content:""}.tgico-avatarnext:before{content:""}.tgico-avatarprevious:before{content:""}.tgico-binfilled:before{content:""}.tgico-bold:before{content:""}.tgico-botcom:before{content:""}.tgico-bots:before{content:""}.tgico-bug:before{content:""}.tgico-calendar:before{content:""}.tgico-calendarfilter:before{content:""}.tgico-camera:before{content:""}.tgico-cameraadd:before{content:""}.tgico-car:before{content:""}.tgico-card:before{content:""}.tgico-card_outline:before{content:""}.tgico-channel:before{content:""}.tgico-channelviews:before{content:""}.tgico-chatspinned:before{content:""}.tgico-chatsplaceholder:before{content:""}.tgico-check1:before{content:""}.tgico-checkbox:before{content:""}.tgico-checkboxblock:before{content:""}.tgico-checkboxempty:before{content:""}.tgico-checkboxon:before{content:""}.tgico-checkretract:before{content:""}.tgico-checkround:before{content:""}.tgico-close:before{content:""}.tgico-clouddownload:before{content:""}.tgico-colorize:before{content:""}.tgico-comments:before{content:""}.tgico-commentssticker:before{content:""}.tgico-copy:before{content:""}.tgico-darkmode:before{content:""}.tgico-data:before{content:""}.tgico-delete:before{content:""}.tgico-delete_filled:before{content:""}.tgico-deletedaccount:before{content:""}.tgico-deleteleft:before{content:""}.tgico-deleteuser:before{content:""}.tgico-devices:before{content:""}.tgico-document:before{content:""}.tgico-down:before{content:""}.tgico-download:before{content:""}.tgico-dragfiles:before{content:""}.tgico-dragmedia:before{content:""}.tgico-eats:before{content:""}.tgico-edit:before{content:""}.tgico-email:before{content:""}.tgico-endcall_filled:before{content:""}.tgico-enter:before{content:""}.tgico-eye1:before{content:""}.tgico-eye2:before{content:""}.tgico-fast_forward:before{content:""}.tgico-fast_rewind:before{content:""}.tgico-favourites:before{content:""}.tgico-flag:before{content:""}.tgico-flip:before{content:""}.tgico-folder:before{content:""}.tgico-fontsize:before{content:""}.tgico-forward:before{content:""}.tgico-forward_filled:before{content:""}.tgico-fullscreen:before{content:""}.tgico-gc_microphone:before{content:""}.tgico-gc_microphoneoff:before{content:""}.tgico-gifs:before{content:""}.tgico-group:before{content:""}.tgico-groupmedia:before{content:""}.tgico-groupmediaoff:before{content:""}.tgico-help:before{content:""}.tgico-hide:before{content:""}.tgico-image:before{content:""}.tgico-info:before{content:""}.tgico-info2:before{content:""}.tgico-italic:before{content:""}.tgico-keyboard:before{content:""}.tgico-lamp:before{content:""}.tgico-language:before{content:""}.tgico-largepause:before{content:""}.tgico-largeplay:before{content:""}.tgico-left:before{content:""}.tgico-limit_chat:before{content:""}.tgico-limit_chats:before{content:""}.tgico-limit_file:before{content:""}.tgico-limit_folders:before{content:""}.tgico-limit_link:before{content:""}.tgico-limit_pin:before{content:""}.tgico-link:before{content:""}.tgico-listscreenshare:before{content:""}.tgico-livelocation:before{content:""}.tgico-location:before{content:""}.tgico-lock:before{content:""}.tgico-lockoff:before{content:""}.tgico-loginlogodesktop:before{content:""}.tgico-loginlogomobile:before{content:""}.tgico-logout:before{content:""}.tgico-mediaspoiler:before{content:""}.tgico-mediaspoileroff:before{content:""}.tgico-mention:before{content:""}.tgico-menu:before{content:""}.tgico-message:before{content:""}.tgico-messageunread:before{content:""}.tgico-microphone:before{content:""}.tgico-microphone_crossed:before{content:""}.tgico-microphone_crossed_filled:before{content:""}.tgico-microphone_filled:before{content:""}.tgico-minus:before{content:""}.tgico-monospace:before{content:""}.tgico-more:before{content:""}.tgico-mute:before{content:""}.tgico-muted:before{content:""}.tgico-newchannel:before{content:""}.tgico-newchat_filled:before{content:""}.tgico-newgroup:before{content:""}.tgico-newprivate:before{content:""}.tgico-next:before{content:""}.tgico-noncontacts:before{content:""}.tgico-nosound:before{content:""}.tgico-passwordoff:before{content:""}.tgico-pause:before{content:""}.tgico-permissions:before{content:""}.tgico-phone:before{content:""}.tgico-pin:before{content:""}.tgico-pinlist:before{content:""}.tgico-pinned_filled:before{content:""}.tgico-pinnedchat:before{content:""}.tgico-pip:before{content:""}.tgico-play:before{content:""}.tgico-playback_05:before{content:""}.tgico-playback_15:before{content:""}.tgico-playback_1x:before{content:""}.tgico-playback_2x:before{content:""}.tgico-plus:before{content:""}.tgico-poll:before{content:""}.tgico-premium_addone:before{content:""}.tgico-premium_double:before{content:""}.tgico-premium_lock:before{content:""}.tgico-premium_unlock:before{content:""}.tgico-previous:before{content:""}.tgico-radiooff:before{content:""}.tgico-radioon:before{content:""}.tgico-reactions:before{content:""}.tgico-readchats:before{content:""}.tgico-recent:before{content:""}.tgico-replace:before{content:""}.tgico-reply:before{content:""}.tgico-reply_filled:before{content:""}.tgico-rightpanel:before{content:""}.tgico-rotate_left:before{content:""}.tgico-rotate_right:before{content:""}.tgico-saved:before{content:""}.tgico-savedmessages:before{content:""}.tgico-schedule:before{content:""}.tgico-scheduled:before{content:""}.tgico-search:before{content:""}.tgico-select:before{content:""}.tgico-send:before{content:""}.tgico-send2:before{content:""}.tgico-sending:before{content:""}.tgico-sendingerror:before{content:""}.tgico-settings:before{content:""}.tgico-settings_filled:before{content:""}.tgico-sharescreen_filled:before{content:""}.tgico-shipping:before{content:""}.tgico-shuffle:before{content:""}.tgico-smallscreen:before{content:""}.tgico-smile:before{content:""}.tgico-spoiler:before{content:""}.tgico-sport:before{content:""}.tgico-star:before{content:""}.tgico-stickers:before{content:""}.tgico-stickers_face:before{content:""}.tgico-stop:before{content:""}.tgico-strikethrough:before{content:""}.tgico-textedit:before{content:""}.tgico-tip:before{content:""}.tgico-tools:before{content:""}.tgico-topics:before{content:""}.tgico-unarchive:before{content:""}.tgico-underline:before{content:""}.tgico-unmute:before{content:""}.tgico-unpin:before{content:""}.tgico-unread:before{content:""}.tgico-up:before{content:""}.tgico-user:before{content:""}.tgico-username:before{content:""}.tgico-videocamera:before{content:""}.tgico-videocamera_crossed_filled:before{content:""}.tgico-videocamera_filled:before{content:""}.tgico-videochat:before{content:""}.tgico-volume_down:before{content:""}.tgico-volume_mute:before{content:""}.tgico-volume_off:before{content:""}.tgico-volume_up:before{content:""}.tgico-zoomin:before{content:""}.tgico-zoomout:before{content:""}.tgico-phone_filled:before{content:"";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:" ";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}[dir=ltr] .input-field label{left:1rem}[dir=rtl] .input-field label{right:1rem}.input-field label{background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;z-index:2}.is-rtl .input-field label{transform-origin:right center}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-icon{border-radius:.375rem;height:1.5rem;pointer-events:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:1.5rem;z-index:1}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:1.3125;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width)) calc(var(--padding-horizontal) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem;--padding-horizontal:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:var(--primary-color)}.input-field-input:focus{border-color:var(--primary-color)}.input-field-input.error{border-color:var(--danger-color)}.input-field-input.error~label{color:var(--danger-color)!important}.input-field-input.error~.input-field-border{border-color:var(--danger-color)!important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f!important}.input-field-input.valid~.input-field-border{border-color:#26962f!important}.input-field-input:focus~.arrow-down{border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 .3125rem;transform:translate(-.1875rem,calc(var(--height)/-2 + .0625rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;position:absolute!important;right:auto!important}.input-field-input-fake{left:0;opacity:0;pointer-events:none;top:0;z-index:-3}.input-fields-row{display:flex}.input-fields-row .input-field{flex:1 1 auto;width:1%}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{animation:input-shake .2s ease-in-out forwards}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){[dir=ltr] .input-search{margin-left:1rem}[dir=rtl] .input-search{margin-right:1rem}}.input-search-input{max-height:var(--height)!important;min-height:var(--height)!important}.input-search-input{--height:42px;background-color:#fff;background-color:var(--input-search-background-color);border-color:#dfe1e5;border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:#c4c9cc!important;border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:var(--secondary-text-color);font-size:1.5rem;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}[dir=ltr] .input-search>.tgico-search{left:.8125rem}[dir=rtl] .input-search>.tgico-search{right:.8125rem}.input-search>.tgico-search{height:1.5rem;pointer-events:none;width:1.5rem}[dir=ltr] .input-search>.tgico-close{right:0}[dir=rtl] .input-search>.tgico-close{left:0}.input-search>.tgico-close{height:42px;width:42px;z-index:1}[dir=ltr] .input-search>.tgico-close:before{margin-right:-1px}[dir=rtl] .input-search>.tgico-close:before{margin-left:-1px}[dir=ltr] .input-field-password .input-field-input{padding-right:2.5rem}[dir=rtl] .input-field-password .input-field-input{padding-left:2.5rem}.input-field-password .input-field-input{max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-family:Arial,Helvetica,sans-serif;font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top:0}@media(-webkit-min-device-pixel-ratio:2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:""}.input-field-password .toggle-visible.eye-hidden:before{content:""}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{pointer-events:none!important}.btn-icon:disabled,.btn:disabled{opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{border-radius:50%!important}.btn-icon{align-items:center;background-color:transparent;border:none;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:var(--primary-color)}[dir=ltr] .btn-corner{right:var(--offset)}[dir=rtl] .btn-corner{left:var(--offset)}.btn-corner{box-shadow:none!important;padding:0!important;position:absolute!important;transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:var(--primary-color);border:none;bottom:var(--offset);color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;text-align:center;transform:translate3d(0,var(--translateY),0);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}html.no-touch .btn-corner:active,html.no-touch .btn-corner:hover{background-color:var(--dark-primary-color)}.btn-corner.is-visible{--translateY:0}body.animation-level-0 .btn-corner{transition:none!important}.btn-corner:disabled{opacity:1!important;pointer-events:all!important}.btn-corner .preloader-circular{height:2.5rem;width:2.5rem}.btn-menu{transform:scale(.8)!important}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(var(--surface-color-rgb),.85);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),visibility .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:4}.btn-menu-old,.is-mobile .btn-menu{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item,.is-mobile .btn-menu .btn-menu-item{transform:none!important}.btn-menu-old .btn-menu-item,.is-mobile .btn-menu .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:16px;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:21px;line-height:var(--line-height-16);margin:0}.btn-menu-old .btn-menu-item:before,.is-mobile .btn-menu .btn-menu-item:before{align-self:auto;color:var(--secondary-text-color);margin-top:0}.btn-menu-old .btn-menu-footer,.is-mobile .btn-menu .btn-menu-footer{background-color:#f4f4f5;background-color:var(--background-color)}.btn-menu{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;visibility:visible}.btn-menu.active,.is-mobile .btn-menu.was-open{transform:scaleX(1)!important}.btn-menu.bottom-left,.is-rtl .btn-menu.bottom-right{left:auto;right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right,.is-rtl .btn-menu.bottom-left{left:0;right:auto;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;left:auto;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right,.is-rtl .btn-menu.top-left{bottom:100%;left:0;right:auto;top:auto;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}[dir=ltr] .btn-menu-item{text-align:left}[dir=rtl] .btn-menu-item{text-align:right}.btn-menu-item{cursor:pointer!important;pointer-events:all!important}.btn-menu-item{--padding-vertical:.25rem;--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:var(--primary-text-color);display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:18px;line-height:var(--line-height-14);margin-left:.3125rem;margin-right:.3125rem;padding:var(--padding-vertical) var(--padding-right) var(--padding-vertical) var(--padding-left);position:relative;text-transform:none;transform:scale(1);white-space:nowrap}.btn-menu-item.tgico-char:before{width:var(--icon-size)}body.animation-level-2 .btn-menu-item{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:var(--light-danger-color)}.btn-menu-item:before{align-self:flex-start;color:var(--primary-text-color);font-size:var(--icon-size);margin-top:.125rem}[dir=ltr] .btn-menu-item-icon,[dir=ltr] .btn-menu-item:before{margin-right:var(--icon-margin)}[dir=rtl] .btn-menu-item-icon,[dir=rtl] .btn-menu-item:before{margin-left:var(--icon-margin)}.btn-menu-item-icon,.btn-menu-item:before{position:relative}[dir=ltr] .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - var(--add)/2)}[dir=rtl] .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - var(--add)/2)}[dir=ltr] .btn-menu-item-icon{margin-left:calc(var(--add)/-2)}[dir=rtl] .btn-menu-item-icon{margin-right:calc(var(--add)/-2)}.btn-menu-item-icon{--add:.25rem;--total:calc(var(--icon-size) + var(--add));flex:0 0 auto;height:var(--total);width:var(--total)}.btn-menu-item-icon .media-photo{height:inherit;width:inherit}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}[dir=ltr] .btn-menu-item-text-fake{margin-left:var(--margin-left)}[dir=rtl] .btn-menu-item-text-fake{margin-right:var(--margin-left)}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{color:var(--secondary-text-color);font-size:.875rem}.btn-menu-item-header{pointer-events:none!important}.btn-menu-item-header{color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);height:2rem}[dir=ltr] .btn-menu-item .stacked-avatars{right:.5rem}[dir=rtl] .btn-menu-item .stacked-avatars{left:.5rem}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute}.btn-menu-item.is-multiline{font-size:.75rem;height:auto;max-width:16.25rem;min-width:calc(100% - .625rem);width:-moz-fit-content;width:fit-content}.btn-menu-item.is-multiline .btn-menu-item-text{white-space:pre-wrap;width:-moz-fit-content;width:fit-content}.btn-menu-item .checkbox-field-toggle{padding:0}.btn-menu-overlay{max-width:none!important;position:fixed!important;width:auto!important}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:4}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important}.btn-menu hr{margin:.3125rem auto;opacity:.6;padding:0;width:calc(100% - 1.875rem)}html:not(.is-mobile) .btn-menu .badge{background-color:transparent;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(var(--surface-color-rgb),.85);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}[dir=ltr] .btn-menu-reactions-container{margin-left:var(--other-side-offset)}[dir=rtl] .btn-menu-reactions-container{margin-right:var(--other-side-offset)}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}[dir=ltr] .btn-menu-reactions-container-vertical{margin-left:var(--menu-offset)}[dir=rtl] .btn-menu-reactions-container-vertical{margin-right:var(--menu-offset)}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:" ";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:var(--dark-primary-color);transition:opacity .2s}.btn-primary-transparent{background-color:transparent;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}[dir=ltr] .btn-primary use,[dir=ltr] .btn-primary>svg{right:15px}[dir=rtl] .btn-primary use,[dir=rtl] .btn-primary>svg{left:15px}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto}.btn-primary:disabled{pointer-events:none!important}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity)}[dir=ltr] .btn-control{padding-left:.75rem;padding-right:1.5rem}[dir=rtl] .btn-control{padding-left:1.5rem;padding-right:.75rem}.btn-control{align-items:center;border-radius:1.25rem;display:flex;height:2.5rem;line-height:2.5rem;margin:.9375rem auto 1rem;width:auto}[dir=ltr] .btn-control.tgico:before{margin-right:.375rem}[dir=rtl] .btn-control.tgico:before{margin-left:.375rem}.btn-control.tgico:before{font-size:1.5rem}.btn-transparent{align-items:center;background-color:transparent;color:var(--primary-text-color);display:flex;font-weight:400;height:3rem;line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:var(--light-primary-color)}[dir=ltr] .btn-transparent:before{margin-right:2rem}[dir=rtl] .btn-transparent:before{margin-left:2rem}.btn-transparent:before{color:var(--secondary-text-color);font-size:1.5rem}@media only screen and (max-width:600px){[dir=ltr] .btn-transparent:before{margin-right:1.5rem}[dir=rtl] .btn-transparent:before{margin-left:1.5rem}}[dir=ltr] .btn-transparent.btn-short:before{margin-right:1rem}[dir=rtl] .btn-transparent.btn-short:before{margin-left:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important}.btn-menu-toggle{position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size:54px;border-radius:50%;height:var(--size);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:3.375rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:3.375rem;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:var(--call-button-margin)}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:var(--call-button-margin)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:2rem}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:2rem}[dir=ltr] .btn-update{right:auto!important}[dir=rtl] .btn-update{left:auto!important}.btn-update{padding:0 2rem!important}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:"";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:"";left:0;position:absolute}.animated-menu-icon:before{top:-.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{animation:none!important}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden}.autocomplete-helper{border-radius:var(--border-radius)!important;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper{--border-radius:10px;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width:319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal)*4)}}.autocomplete-peer-helper .scrollable{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:1.3125;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{line-height:var(--size)!important}.badge{--size:1.375rem;--padding:.4375rem;border-radius:calc(var(--size)/2);color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);min-width:var(--size);padding:0 var(--padding);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{--size:1.25rem;--padding:.375rem}.badge-24{--size:1.5rem;--padding:.5rem}.badge.tgico:before{font-size:var(--size)}.badge-primary{background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{border-radius:0!important}.ckin__player.ckin__fullscreen{background:#000;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}@media only screen and (max-width:600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0}[dir=ltr] .default__controls{text-align:left}[dir=rtl] .default__controls{text-align:right}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}@media only screen and (max-width:600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:""}.default .default__gradient-bottom{transform:translate3d(0,50px,0)}.default .default__controls{transform:translate3d(0,52px,0)}@media only screen and (max-width:600px){.default .default__controls{transform:translate3d(0,65px,0)}}.default.show-controls .default__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:""}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4,0,.2,1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.progress-line{--color:var(--primary-color);--height:5px;--border-radius:6px;--thumb-size:13px;border-radius:var(--border-radius);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{background-color:var(--color);border-radius:50%;content:" ";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size)/2)) scale(1.125)}.progress-line:before,.progress-line__loaded{background-color:#c4c9cc;background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}[dir=ltr] .checkbox-field{text-align:left}[dir=rtl] .checkbox-field{text-align:right}.checkbox-field{--size:1.25rem;--offset-left:0px;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{pointer-events:none!important}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}[dir=ltr] .checkbox-field .checkbox-box{left:var(--offset-left)}[dir=rtl] .checkbox-field .checkbox-box{right:var(--offset-left)}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;left:0;right:0}.checkbox-field .checkbox-box-background{background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:7px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:3.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}[dir=ltr] .checkbox-field .checkbox-caption{padding-left:3.375rem}[dir=rtl] .checkbox-field .checkbox-caption{padding-right:3.375rem}.checkbox-field .checkbox-caption{color:inherit;line-height:1.3125;line-height:var(--line-height);pointer-events:none;position:relative;transition:opacity .2s}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}[dir=ltr] .checkbox-field.hover-effect .checkbox-box{left:auto}[dir=rtl] .checkbox-field.hover-effect .checkbox-box{right:auto}.checkbox-field .anchor-url{pointer-events:all}.checkbox-ripple{border-radius:10px;overflow:hidden}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size:1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}[dir=ltr] .radio-field{text-align:left}[dir=rtl] .radio-field{text-align:right}.radio-field{--size:1.375rem;--offset-left:0px;cursor:pointer;line-height:1.3125;line-height:var(--line-height);margin:1.25rem 0;position:relative}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}[dir=ltr] .radio-field .radio-field-main{padding-left:3.5rem}[dir=rtl] .radio-field .radio-field-main{padding-right:3.5rem}.radio-field .radio-field-main{color:inherit;position:relative}[dir=ltr] .radio-field .radio-field-main:after,[dir=ltr] .radio-field .radio-field-main:before{left:var(--offset-left)}[dir=rtl] .radio-field .radio-field-main:after,[dir=rtl] .radio-field .radio-field-main:before{right:var(--offset-left)}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:"";display:block;height:var(--size);position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main:before{transition:border-color .1s ease,opacity .1s ease}[dir=ltr] .radio-field .radio-field-main:after{left:calc(var(--offset-left) + .3125rem)}[dir=rtl] .radio-field .radio-field-main:after{right:calc(var(--offset-left) + .3125rem)}.radio-field .radio-field-main:after{background:var(--primary-color);border-radius:50%;height:.75rem;transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}[dir=ltr] .radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}[dir=rtl] .radio-field.radio-field-right .radio-field-main:before{left:0;right:auto}[dir=ltr] .radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[dir=rtl] .radio-field.radio-field-right .radio-field-main:after{left:.3125rem;right:auto}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:-1;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none!important;transition:background-color .2s!important}.checkbox-field-restriction .checkbox-box-check use{stroke-dasharray:24.19,24.19!important;transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.checkbox-field-restriction .checkbox-box-check use{transform:rotate(0) translateY(0)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0 .25rem;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:var(--surface-color);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:50%;content:" ";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s cubic-bezier(.22,.75,.7,1.44)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width:600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:0 0 .5rem}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:var(--surface-color);display:flex;flex-direction:column;margin:0;position:relative;-moz-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist-chat{background:var(--background)!important}.chatlist-chat{--background:unset;-webkit-user-drag:none}.chatlist-chat.is-forum-open,.chatlist-chat.menu-open,html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-filled-secondary-text-color)}[dir=ltr] .chatlist-chat.is-muted .user-title:after{margin-left:.125rem}[dir=rtl] .chatlist-chat.is-muted .user-title:after{margin-right:.125rem}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:"";flex:0 0 auto;font-size:1.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat i{font-style:normal}.chatlist-chat .text-highlight{color:var(--primary-text-color)}.chatlist-chat .premium-icon{margin-top:-.125rem}.chatlist-chat .topic-icon{flex:0 0 auto}[dir=ltr] .chatlist-chat .row-title .topic-icon{margin-right:.25rem}[dir=rtl] .chatlist-chat .row-title .topic-icon{margin-left:.25rem}.chatlist-chat .row-title .topic-icon{--size:1.375rem}.chatlist-chat .topic-name .topic-icon{line-height:1!important}.chatlist-chat .topic-name .topic-icon{display:inline}.chatlist-chat .topic-name .topic-icon-svg{position:relative}.chatlist-chat .topic-name .topic-icon-content{left:0;margin-top:-6px;position:absolute;right:0;top:0}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .premium-icon,.chatlist-chat.active .row-subtitle,.chatlist-chat.active .row-title,.chatlist-chat.active .sending-status-icon,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff!important}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active .danger,.chatlist-chat.active .primary-text{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-icon-background{fill:#fff!important}.chatlist-chat.active .verified-icon-check{visibility:hidden}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff!important}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .sending-status-icon.tgico-premium_lock{color:#c4c9cc;color:var(--secondary-color);font-size:.8125rem;margin:.1875rem 0 0 .5rem}[dir=ltr] .chatlist .dialog-title-details{margin-left:.5rem}[dir=rtl] .chatlist .dialog-title-details{margin-right:.5rem}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;padding:1px 0 0}[dir=ltr] .chatlist .dialog-subtitle-badge{margin-left:.5rem}[dir=rtl] .chatlist .dialog-subtitle-badge{margin-right:.5rem}.chatlist .dialog-subtitle-badge{display:block!important}.chatlist .dialog-subtitle-badge{flex:0 0 auto}.chatlist .dialog-subtitle-badge.avatar-badge{line-height:23px!important}.chatlist .dialog-subtitle-badge.avatar-badge{--size:1.625rem;border:2px solid var(--background,var(--surface-color));margin:0;pointer-events:none;position:absolute;right:calc(100% - 4.0625rem);top:2.4375rem}[dir=ltr] .chatlist .dialog-subtitle-media{margin-right:.375rem}[dir=rtl] .chatlist .dialog-subtitle-media{margin-left:.375rem}.chatlist .dialog-subtitle-media{border-radius:.25rem;display:inline-block;flex:0 0 auto;height:1.25rem;line-height:1.25rem;position:relative;width:1.25rem}.chatlist .dialog-subtitle-media:before{content:" ";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;bottom:auto;height:inherit;-o-object-fit:cover;object-fit:cover;top:auto;width:inherit}.chatlist .dialog-group-call-icon{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .dialog-avatar,.chatlist .row-row{pointer-events:none;position:relative}.chatlist .user-title{display:flex!important}.chatlist .user-title{align-items:center}.chatlist .user-title img.emoji{height:18px;margin-top:1px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1;position:relative}[dir=ltr] .chatlist .message-status{margin-right:.125rem}[dir=rtl] .chatlist .message-status{margin-left:.125rem}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:#0ac630!important;background-color:var(--chatlist-status-color)!important;line-height:1.25rem!important}.chatlist .mention{padding:0}[dir=ltr] .chatlist .mention-badge{margin-right:-.125rem}[dir=rtl] .chatlist .mention-badge{margin-left:-.125rem}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread,.chatlist .no-unmuted-topic .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist .not-visited{background-color:#c4c9cc!important;background-color:var(--secondary-color)!important}.chatlist .not-visited{--size:.5rem;--padding:0}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{margin-bottom:0!important}.chatlist-bottom .sidebar-left-section{padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{max-width:728px!important;max-width:var(--messages-container-width)!important}}@media only screen and (min-width:601px){.chat-input{--padding-bottom:1.25rem}}@media only screen and (max-height:569px){.chat-input{--padding-bottom:0.5rem}}@media only screen and (min-width:1276px){.chat-input{width:calc(100% - var(--right-column-width))!important}body.is-right-column-shown .chat-input{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{position:absolute!important;transform:translate3d(0,var(--translateY),0)!important}.chat-input.is-hidden{--translateY:100%;bottom:0;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0!important}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .toggle-emoticons:before{content:""}.chat-input .toggle-emoticons.flip-icon:before{content:""!important}[dir=ltr] .chat-input .btn-record-cancel{right:0}[dir=rtl] .chat-input .btn-record-cancel{left:0}.chat-input .btn-record-cancel{--multiplier:-1;opacity:0;padding:0;position:absolute;top:0;transform:translateX(calc((100% + var(--padding-horizontal) + .5rem)*var(--multiplier)));visibility:hidden;z-index:3}.chat-input .btn-record-cancel .c-ripple__circle,html.no-touch .chat-input .btn-record-cancel:active:after,html.no-touch .chat-input .btn-record-cancel:hover:after{background-color:var(--light-danger-color)}.chat-input .btn-record-cancel:before{color:var(--danger-color)}.is-rtl .chat-input .btn-record-cancel{--multiplier:1}[dir=ltr] .chat-input .btn-scheduled:after{right:5px}[dir=rtl] .chat-input .btn-scheduled:after{left:5px}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:"";height:.5rem;position:absolute;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{animation:hide-icon .4s ease-in-out forwards!important}[dir=ltr] .chat-input .float{margin-right:.75rem!important}[dir=rtl] .chat-input .float{margin-left:.75rem!important}.chat-input .float{display:none!important;margin:0!important}.chat-input .float{align-self:center}body.animation-level-2 .chat-input .float{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){[dir=ltr] .chat-input .float{margin-right:.125rem!important}[dir=rtl] .chat-input .float{margin-left:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}[dir=ltr] .chat-input .btn-send-container{right:var(--padding-horizontal)}[dir=rtl] .chat-input .btn-send-container{left:var(--padding-horizontal)}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-cancel-record,.chat-input .btn-send{box-shadow:0 1px 8px 1px rgba(0,0,0,.12)}.chat-input .btn-send{background-color:var(--primary-color)!important;color:#fff!important}.chat-input .btn-send{z-index:3}html.no-touch .chat-input .btn-send:active,html.no-touch .chat-input .btn-send:hover{background-color:var(--dark-primary-color)!important}.chat-input .btn-send .tgico-check{height:32px!important}.chat-input .btn-send .tgico-check{font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:500;font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:var(--danger-color);border-radius:50%;content:" ";display:inline-block;height:10px;margin-left:9px;margin-right:9px;width:10px}body.animation-level-2 .chat-input .record-time:after{animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;height:300px;opacity:.5;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - var(--chat-input-size)*2 - 1rem)}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}[dir=ltr] .chat-input:not(.is-recording) .btn-record-cancel{margin-right:0}[dir=rtl] .chat-input:not(.is-recording) .btn-record-cancel{margin-left:0}.chat-input:not(.is-recording) .btn-record-cancel{width:0}.chat-input .new-message-wrapper{opacity:1}.chat-input .reply-in-topic-overlay{align-items:center;background-color:inherit;border-radius:inherit;color:var(--secondary-text-color);display:flex;justify-content:center;padding:0 1rem;pointer-events:none;z-index:3}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@media only screen and (max-width:600px){body.is-left-column-shown #column-center{transform:translate3d(100vw,0,0)}body.is-right-column-shown #column-center{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{position:fixed!important}#column-center{bottom:0;left:0;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem,0,0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex!important}.chat{align-items:center;flex-direction:column;transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 420px)),0,0)}}@media only screen and (min-width:1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)),0,0)}}@media only screen and (min-width:1276px)and (max-width:1680px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(75vw,0,0)}}@media only screen and (max-width:925px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(100vw,0,0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{position:absolute!important}.chat-background,.chat-background-item{bottom:0;left:0;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{background-color:#000!important;background-image:none!important;margin:0!important}.chat-background-item.is-pattern{align-items:center;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)!important}body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center}body.animation-level-2.is-right-column-shown .chat-background-item{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(.666666667)}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:soft-light}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.chat .drops-container{--padding:20px;--pinned-floating-height:0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width:1276px){[dir=ltr] body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}[dir=rtl] body.is-right-column-shown .chat .drops-container{left:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat[data-type=chat] .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:1rem;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{background-color:#fff;border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);content:" ";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}[dir=ltr] .chat-input-control-button:before{margin-right:10px}[dir=rtl] .chat-input-control-button:before{margin-left:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}[dir=ltr] .selection-wrapper .selection-container .btn-icon{margin-left:6px;margin-right:5px}[dir=rtl] .selection-wrapper .selection-container .btn-icon{margin-left:5px;margin-right:6px}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;width:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width:600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width:380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}[dir=ltr] .selection-wrapper .selection-container-forward:before{margin-right:14px}[dir=rtl] .selection-wrapper .selection-container-forward:before{margin-left:14px}[dir=ltr] .selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}[dir=rtl] .selection-wrapper .selection-container-delete{margin-left:.625rem;margin-right:.375rem}[dir=ltr] .selection-wrapper .selection-container-delete:before{margin-right:10px}[dir=rtl] .selection-wrapper .selection-container-delete:before{margin-left:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}[dir=ltr] .fake-rows-wrapper{left:var(--padding-horizontal)}[dir=rtl] .fake-rows-wrapper{right:var(--padding-horizontal)}.fake-rows-wrapper{top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}[dir=ltr] .rows-wrapper{border-bottom-right-radius:0}[dir=rtl] .rows-wrapper{border-bottom-left-radius:0}.rows-wrapper{transform:translateX(0) scaleX(1)}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width:600px){.rows-wrapper{--padding-vertical:1px}}@media only screen and (max-width:420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height:569px){.rows-wrapper{--padding-vertical:1px}}[dir=ltr] .rows-wrapper .bubble-tail{right:-8.4px}[dir=rtl] .rows-wrapper .bubble-tail{left:-8.4px}.rows-wrapper .bubble-tail{fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;transform:scaleX(-1);width:11px}.is-rtl .rows-wrapper .bubble-tail{transform:scaleX(1)}.rows-wrapper .attach-file.menu-open{background-color:var(--light-primary-color)!important}.rows-wrapper .attach-file.menu-open{color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:var(--surface-color);border-radius:1rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .reply-wrapper{margin-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin-left:.625rem;margin-right:.625rem;order:1}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:var(--secondary-text-color)!important}.rows-wrapper .reply-wrapper .reply-subtitle{height:1.125rem}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:3.125rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:3.125rem}.rows-wrapper .reply-wrapper .btn-menu{transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);top:auto}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item{padding-left:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-right:var(--icon-margin)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-left:var(--icon-margin)}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:var(--primary-text-color)}@media only screen and (max-width:600px){[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .input-message-input{max-height:27.5rem!important}.rows-wrapper .input-message-input{margin-top:-1px}@media only screen and (max-height:30rem){.rows-wrapper .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.rows-wrapper .input-message-input{max-height:10rem}}.rows-wrapper .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-left:var(--commands-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-right:var(--commands-margin-left)}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-left:var(--send-as-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-right:var(--send-as-margin-left)}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container{height:var(--send-as-size);width:var(--send-as-size)}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:auto}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:auto}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:calc(var(--padding-horizontal)*-1 - .25rem)!important}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:calc(var(--padding-horizontal)*-1 - .25rem)!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;max-height:20rem;max-width:20rem;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid var(--primary-color);border-radius:inherit;bottom:var(--offset);content:" ";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{line-height:1!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}[dir=ltr] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-right:var(--translateX)}[dir=rtl] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-left:var(--translateX)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .btn-icon{color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin-bottom:5px;margin-left:var(--button-horizontal-margin);margin-right:var(--button-horizontal-margin);margin-top:0;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:var(--primary-color)}.input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.input-message-container .scrollable{position:relative}.input-message-input{--custom-emoji-size:var(--messages-custom-emoji-size);background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.input-message-input pre{display:inline;margin:0}body.animation-level-2 .input-message-input{transition:height .1s}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:opacity var(--layer-transition),visibility 0s 0s!important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY:calc(var(--chat-input-size)*-1 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles-inner{transition:none!important}@media only screen and (min-width:1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width:600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner:after{content:" ";height:.125rem}[dir=ltr] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}[dir=rtl] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-right:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - 2.875rem)!important;max-width:calc(100% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner.is-chat .name,.bubbles-inner:not(.is-channel) .message,.bubbles-inner:not(.is-channel) .name{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999!important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY)*-1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width:1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{transform:none!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-mention{--translateY:0;cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention.is-visible{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible}.chat-secondary-button{background-color:var(--surface-color)!important;box-shadow:0 1px 8px 1px rgba(0,0,0,.12)!important}.chat-secondary-button{align-items:center;border-radius:50%;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;position:absolute}body.animation-level-0 .chat-secondary-button{transition:none!important}.chat-secondary-button:before{position:relative}.chat-secondary-button:after{border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}html.no-touch .chat-secondary-button:active:after,html.no-touch .chat-secondary-button:hover:after{background-color:var(--light-secondary-text-color)}[dir=ltr] .bubbles-corner-button{right:var(--chat-input-padding)}[dir=rtl] .bubbles-corner-button{left:var(--chat-input-padding)}.bubbles-corner-button{bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);overflow:visible;z-index:2}[dir=ltr] .bubbles-corner-button .badge{right:-.25rem}[dir=rtl] .bubbles-corner-button .badge{left:-.25rem}.bubbles-corner-button .badge{position:absolute;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){[dir=ltr] .bubbles-corner-button .badge{right:.1875rem}[dir=rtl] .bubbles-corner-button .badge{left:.1875rem}.bubbles-corner-button .badge{top:-.75rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height:var(--topbar-call-height)}@media only screen and (min-width:1276px){body.is-right-column-shown{--topbar-floating-scaleX:calc(1 - var(--right-column-proportion))}}.topbar{cursor:pointer!important;max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important}.topbar{--topbar-height:3.5rem;--pinned-floating-audio-height:0px;--pinned-floating-message-height:0px;--pinned-floating-height:calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height:52px;--pinned-message-height:52px;margin-bottom:var(--pinned-floating-height);position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:" ";height:calc(var(--topbar-height) + var(--pinned-floating-height));height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height:var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height:var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width:601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width:926px){.chat:first-child .topbar .sidebar-close-button{display:none}[dir=ltr] .chat:first-child .topbar .chat-info{padding-left:.1875rem}[dir=rtl] .chat:first-child .topbar .chat-info{padding-right:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 4.375rem);max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}[dir=ltr] .topbar .chat-info{padding-left:49px}[dir=rtl] .topbar .chat-info{padding-right:49px}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden}@media only screen and (max-width:600px){[dir=ltr] .topbar .chat-info{padding-left:52px}[dir=rtl] .topbar .chat-info{padding-right:52px}}@media only screen and (min-width:1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width:600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}[dir=ltr] .topbar .chat-join{margin-right:.5rem}[dir=rtl] .topbar .chat-join{margin-left:.5rem}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}[dir=ltr] .topbar .content{padding-left:1.125rem}[dir=rtl] .topbar .content{padding-right:1.125rem}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height:0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}[dir=ltr] .chat:not([data-type=chat]) .topbar .content{padding-left:16px}[dir=rtl] .chat:not([data-type=chat]) .topbar .content{padding-right:16px}[dir=ltr] .topbar-call-container{left:1px;right:0}[dir=rtl] .topbar-call-container{left:0;right:1px}.topbar-call-container{cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;min-height:auto!important}.topbar-call-container{color:#fff;position:absolute;top:-3rem;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){[dir=ltr] .topbar-call-container{left:0}[dir=rtl] .topbar-call-container{right:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}[dir=ltr] .topbar-call-left .btn-icon{margin-right:.375rem}[dir=rtl] .topbar-call-left .btn-icon{margin-left:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500;font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width)*-.5),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scaleY(-1);transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}.is-rtl .topbar-call-weave{transform-origin:right center}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubbles-group{position:relative}.bubbles-group-avatar{position:sticky!important}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{--line-height:var(--messages-line-height);display:flex;flex-wrap:wrap;margin:0 auto .125rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:2.375rem;width:var(--message-beside-button-size)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem!important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.0625rem;content:" ";left:-50%;position:absolute;top:-.0625rem;z-index:-1}.bubble.is-highlighted:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:var(--surface-color);color:var(--primary-color);content:"Unread messages";font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.0625rem + 30px)}.bubble.is-selected:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0!important}.bubble-select-checkbox{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:var(--surface-color);background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;user-select:text}.bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(-1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button.goto-original{transform:translateX(-1.125rem) rotate(180deg)}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:var(--surface-color);border-radius:var(--size);bottom:0;box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34,1.56,.64,1),transform .2s cubic-bezier(.34,1.56,.64,1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{font-weight:500;font-weight:var(--font-weight-bold);opacity:.99999;padding-bottom:.375rem;pointer-events:none;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat[data-type=chat] .bubble.is-date .bubble-content,.chat[data-type=discussion] .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{opacity:1!important;transition:none!important;visibility:visible!important}.bubble.is-date.is-fake{left:50%;position:absolute;top:0;transform:translateX(-50%)}.bubble-beside-button{align-items:center;background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:#fff;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);transform:translateX(0);width:2.375rem;width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.bubble-view-button{text-decoration:none!important}.bubble-view-button{align-items:center;border:1px solid var(--message-primary-color);border-radius:6px;color:var(--primary-color);color:var(--message-primary-color);display:flex;height:2rem;justify-content:center;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble-view-button:active,html.no-touch .bubble-view-button:hover{background-color:var(--light-filled-primary-color);background-color:var(--light-filled-message-primary-color)}.bubble-view-button .c-ripple__circle{background-color:var(--primary-color);background-color:var(--message-primary-color);opacity:.08}.message .bubble-view-button{margin:.375rem 0 -.375rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.bubble-view-button+.reactions-block{margin-top:.375rem}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0!important}.bubble.webpage .preview-with-document{min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble .canvas-thumbnail{border-radius:inherit}.bubble .canvas-dots{z-index:1}.bubble.emoji-big{--emoji-size:1rem;font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big .attachment{border-radius:0!important}.bubble.emoji-big .attachment{--custom-emoji-size:var(--emoji-size)}.bubble.emoji-big .attachment img.emoji{height:var(--emoji-size);max-height:64px;max-width:64px;width:var(--emoji-size)}.bubble.emoji-big .attachment .custom-emoji,.bubble.emoji-big .attachment .emoji{display:inline-block}.bubble.emoji-big:not(.sticker) .attachment{max-height:-moz-fit-content!important;max-height:fit-content!important}.bubble.emoji-big:not(.sticker) .attachment{display:block;font-size:var(--emoji-size);padding-bottom:1.25rem;padding-top:.25rem;white-space:pre-wrap;word-break:break-word}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-big:not(.sticker) .bubble-content{max-width:min(420px,100%)}.bubble.just-media .bubble-content{background:none!important}.bubble.just-media .bubble-content{box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:rgba(109,141,65,.4);background:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{position:relative!important;right:0!important}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:280px!important;height:var(--round-video-size)!important;max-height:280px!important;max-height:var(--round-video-size)!important;max-width:280px!important;max-width:var(--round-video-size)!important;width:280px!important;width:var(--round-video-size)!important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;z-index:1}.bubble .media-container-fitted{background-color:transparent!important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none!important}.bubble .album-item .bubble-select-checkbox{bottom:auto!important}.bubble .album-item .bubble-select-checkbox{left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4,0,.2,1),border-radius .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .attachment{pointer-events:none}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;padding:.75rem 1rem .875rem!important}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-size:1rem!important}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem!important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{cursor:pointer;height:200px;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:1.3125;line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .text,.bubble .web .title,.bubble .web .webpage-name{font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:var(--primary-color);border-radius:.125rem;content:" ";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{--font-size:var(--messages-secondary-text-size)}.bubble .document-name{font-size:16px;font-size:var(--messages-text-size)}.bubble .document-size{font-size:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}.bubble:not(.just-media) .reply{border-radius:6px}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:var(--light-filled-primary-color);background-color:var(--light-filled-message-primary-color)}.bubble.just-media .floating-part{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin:0;max-width:15rem;padding:.375rem .625rem;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .floating-part{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important}.bubble.just-media .name{line-height:1.3125;line-height:var(--line-height);padding:.375rem .625rem}.bubble.just-media .name .peer-title{font-weight:400!important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width:600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{max-width:none!important}.bubble.just-media .reply-content{margin-top:0;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message,.bubble .service-msg{--custom-emoji-size:var(--messages-custom-emoji-size)}.bubble .message{color:var(--primary-text-color);font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message .custom-emoji{display:inline-flex}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{max-width:min(100%,335px)!important}.bubble .message.audio-message{width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important}.bubble .message.audio-message{width:280px}}.bubble .message.voice-message .document-message{max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold)}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px!important}.bubble .message.document-message .document{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:var(--secondary-text-color);display:flex;font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:"";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document .time{align-self:flex-start;height:0}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{padding:0!important}.bubble.is-multiple-documents .message{border-radius:inherit}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-2}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:var(--surface-color);background-color:var(--message-background-color);border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection{animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection{animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit;content:" ";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.0625rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.0625rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.25rem}.bubble.is-multiple-documents .document{height:54px!important}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document{height:38px!important}}.bubble.is-multiple-documents .document-wrapper{padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .bubble-content-wrapper{width:-moz-min-content;width:min-content}.bubble.is-message-empty .message{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:calc(12px + .375rem);height:calc(var(--messages-time-text-size) + .375rem);margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff!important}.bubble.is-message-empty.with-replies:not(.sticker):not(.with-beside-replies) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):active:after,html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):hover:after{background-color:#fff}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble.with-beside-replies .bubble-content{min-height:5.5rem}.bubble .colored-name .premium-icon{color:inherit;opacity:.6}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;font-size:var(--messages-time-text-size);height:12px;height:var(--messages-time-text-size);line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;color:var(--secondary-text-color);color:var(--message-time-color);display:flex;height:12px;height:var(--messages-time-text-size);line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .inner:after{color:var(--message-status-color)}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble .time.is-block{display:block;float:none}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{--height:calc(var(--messages-time-text-size) + 0.375rem);align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:var(--height);color:#fff;display:flex;font-size:12px;font-size:var(--messages-time-text-size);height:var(--height);left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:"";font-size:20px;font-size:calc(var(--messages-time-text-size) + 8px);padding:0 1px 0 3px}[dir=ltr] .bubble .video-time.is-error:after{margin-left:1px}[dir=rtl] .bubble .video-time.is-error:after{margin-right:1px}.bubble .video-time.is-error:after{content:"";font-size:16px;font-size:calc(var(--messages-time-text-size) + 4px);padding:0}.bubble .extended-media-buy{align-items:center;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(0,0,0,.3);border-radius:2rem;color:#fff;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;left:50%;padding:0 1rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap;z-index:2}.bubble .extended-media-buy:before{font-size:1.125rem;margin-right:.25rem}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name{color:var(--primary-color);font-size:14px;font-size:var(--messages-secondary-text-size);line-height:calc(14px + .25rem);line-height:calc(var(--messages-secondary-text-size) + .25rem);max-width:100%;overflow:hidden;padding:.375rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo:not(.is-reply) .bubble-content>.name,.bubble:not(.webpage).video:not(.is-reply) .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage).photo .topic-name-button-container,.bubble:not(.webpage).video .topic-name-button-container{margin-bottom:0}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:var(--surface-color);fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);color:var(--primary-color);display:flex;height:3.0625rem;min-width:15rem;padding:0 .5rem;position:relative}html.no-touch .bubble .replies-footer:active,html.no-touch .bubble .replies-footer:hover{background-color:var(--light-primary-color)}html.no-touch .bubble .replies-footer:active~.bubble-tail,html.no-touch .bubble .replies-footer:hover~.bubble-tail{fill:var(--light-filled-primary-color);fill:var(--light-filled-message-primary-color)}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;position:static!important;right:auto!important}.bubble .message .reactions-block .time{order:100}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubble.with-reply-markup .bubble-content{border-bottom-left-radius:6px!important;border-bottom-right-radius:6px!important}.bubble .name-with-reply .name{padding:0!important}.bubble .name-with-reply .name:not(:last-child) .hide-ol{display:none}.bubble .name-with-reply .name:not(:last-child) .peer-title{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name-with-reply .reply{height:auto;margin:.25rem 0 0;max-height:none;padding:0}.bubble .topic-name-button{--color:var(--message-primary-color)}.bubble .name .topic-name-button-container{margin:.25rem -.125rem}.bubble .name .topic-name-button-container:first-child{margin-top:0}.bubble.is-message-empty:not(.is-reply) .name .topic-name-button-container{margin-bottom:0}.bubble:not(.is-group-first) .topic-name-button-container{display:none!important}.bubble .topic-name-button-container.floating-part{font-size:14px;font-size:var(--messages-secondary-text-size);padding-bottom:0;padding-top:0}.bubble .topic-name-button-container.floating-part .topic-name-button{--color:#fff;padding:0}.bubble .topic-name-button-container.floating-part .topic-name-button:before{content:none}.bubble .topic-name-button-container.floating-part+.floating-part{margin-top:1.75rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.0625rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type .document-container:last-of-type .document-selection,.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type:after{bottom:-.0625rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@media only screen and (min-width:601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width:600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:15px;font-size:var(--messages-service-text-size);justify-content:center;line-height:20px;line-height:calc(var(--messages-service-text-size) + 5px);padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title,.bubble.service .service-msg [data-saved-from],.bubble.service .service-msg a{cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold)}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{text-decoration:underline}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0!important}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .floating-part{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .floating-part{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .audio-time,.bubble.is-in .contact-number{color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:var(--danger-color);color:var(--monospace-text-color)}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:active,html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--message-background-color:var(--message-out-background-color);--light-message-background-color:var(--light-message-out-background-color);--dark-message-background-color:var(--dark-message-out-background-color);--link-color:var(--message-out-link-color);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);--selection-background-color:var(--message-out-selection-background-color);--message-time-color:var(--message-out-time-color);--message-status-color:var(--message-out-status-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:var(--message-out-primary-color)}@media only screen and (min-width:1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out .anchor-url{color:var(--primary-color);color:var(--message-primary-color)}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0!important}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .floating-part{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{font-size:19px;font-size:calc(var(--messages-text-size) + 3px);line-height:12px;line-height:var(--messages-time-text-size);margin-left:1px}.bubble.is-out.forwarded .name{color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:""}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:""}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:""}.bubble.is-out.is-error .time .inner:after,.bubble.is-out.is-error .time:after{color:var(--danger-color);color:var(--message-error-color);content:""}.bubble.is-out .document-ico:after{border-right-color:var(--message-background-color);border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:var(--message-out-primary-color);color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{color:var(--message-out-primary-color);color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:var(--message-out-primary-color);color:var(--light-filled-message-out-primary-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color:var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:-2.875rem;left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:var(--surface-color);background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{margin-top:.0625rem;width:100%}.bubble:not(.is-group-last) .reply-markup{margin-bottom:.125rem}.reply-markup-row{display:flex;margin-top:.125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child .reply-markup-button:first-child{border-bottom-left-radius:12px}.reply-markup-row:last-child .reply-markup-button:last-child{border-bottom-right-radius:12px}.reply-markup-button{color:#fff!important}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:.375rem;cursor:pointer;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button-text{pointer-events:none;position:relative}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button+.reply-markup-button{margin-left:.125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:"";transform:rotate(-45deg)}.reply-markup-button.is-buy:before{content:""}.reply-markup-button.is-switch-inline:before{content:""}.bubble-beside-button:after,.bubble.just-media .reply:after,.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}html.no-touch .bubble-beside-button:active:after,html.no-touch .bubble-beside-button:hover:after,html.no-touch .bubble.just-media .reply:active:after,html.no-touch .bubble.just-media .reply:hover:after,html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.bubble-primary-color{color:var(--primary-color);color:var(--message-primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.pinned-message{--custom-emoji-size:calc(var(--font-size) + 2px)!important}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:" ";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{--font-size:var(--font-size-14);--custom-emoji-size:calc(var(--font-size) + 4px);--line-height:calc(var(--font-size) + 4px);align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pinned-message-content,.reply-content{display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;justify-content:center;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;width:2rem!important}.pinned-message-media,.reply-media{left:0;overflow:hidden;position:absolute;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.pinned-message-media>video,.reply-media>img,.reply-media>video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:var(--primary-color);border-radius:1px;height:calc(32px + .25rem);height:calc(var(--font-size)*2 + .25rem);min-width:2px}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0!important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:var(--surface-color)!important;position:absolute!important}.pinned-container.is-floating{height:var(--container-height);left:0;margin:0;max-height:var(--container-height);right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@media only screen and (max-width:600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width:1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height:var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:"#"}.pinned-message .animated-counter.is-last:not(.backwards){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat[data-type=discussion] .pinned-message .pinned-container-close{display:none!important}.pinned-audio{--progress-height:.25rem}.pinned-audio.is-floating{--container-height:var(--pinned-audio-height)}.pinned-audio:not(.is-floating){max-width:210px;padding-right:1.75rem;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible!important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0!important}.pinned-audio-ico:before{content:""}.pinned-audio-ico.flip-icon:before{content:""}.pinned-audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-audio-subtitle{color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width:1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:" ";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),width .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:#dfe1e5;background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important}.markup-tooltip .btn-icon{height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:var(--primary-color)!important;color:#fff!important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:72px;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{background:none}.emoji-helper{padding:.25rem 0!important}.emoji-helper{height:50px}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:after,.emoji-helper .super-emojis:before{content:" ";display:inline-block;width:.25rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:#dfe1e5;background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{left:.5rem;overflow:hidden;position:absolute}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{height:auto!important;width:auto!important}.inline-helper .gif{bottom:0;left:0;position:absolute;right:0;top:0}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(72px,1fr));grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{position:absolute!important}.chat-search{left:0;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{position:absolute!important;width:auto!important}.drops-container{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:var(--primary-color);animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:var(--primary-color)}.drop+.drop{margin-top:10px}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.bot-commands{animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;padding:var(--offset) var(--offset) 0!important;position:absolute!important;transition:none!important;visibility:visible!important;width:auto!important}.bot-commands{--border-radius-padding:24px;--offset:.5rem;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;pointer-events:none;right:calc(var(--offset)*-1)}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{max-height:207px!important}.bot-commands .scrollable{background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);height:auto;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{border-radius:0!important}.bot-commands-list-element{align-items:flex-start;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:18px;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.crop.is-forum .crop-overlay{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.sidebar-header{align-items:center;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding-left:1rem;padding-right:1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding-left:.5rem;padding-right:.5rem}}[dir=ltr] .sidebar-header__title{padding-left:1.5rem}[dir=rtl] .sidebar-header__title{padding-right:1.5rem}.sidebar-header__title{color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}[dir=ltr] .sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}[dir=rtl] .sidebar-header .btn-icon+.btn-icon{margin-right:.5rem}.sidebar-header-right{flex:0 0 auto}.scrollable-y-bordered .sidebar-header{position:relative}.scrollable-y-bordered .sidebar-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:" ";height:1px;left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .scrollable-y-bordered .sidebar-header:after{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.scrollable-y-bordered:not(.scrolled-top) .sidebar-header:after{opacity:1}.sidebar-close-button{overflow:inherit!important}.sidebar-close-button{flex:0 0 auto;height:2.5rem;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0!important}.profile-avatars-avatars{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:" ";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}[dir=ltr] .profile-avatars-info{left:1.5rem}[dir=rtl] .profile-avatars-info{right:1.5rem}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;pointer-events:none;position:absolute}[dir=ltr] .profile-avatars-info .profile-name,[dir=ltr] .profile-avatars-info .profile-subtitle{text-align:left}[dir=rtl] .profile-avatars-info .profile-name,[dir=rtl] .profile-avatars-info .profile-subtitle{text-align:right}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .premium-icon{color:#fff}.profile-avatars-info .verified-icon-background{fill:#fff}.profile-avatars-info .verified-icon-check{visibility:hidden}.profile-avatars-info .premium-icon,.profile-avatars-info .profile-subtitle,.profile-avatars-info .verified-icon{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}[dir=ltr] .profile-change-avatar{right:1.25rem}[dir=rtl] .profile-change-avatar{left:1.25rem}.profile-change-avatar{position:absolute!important;transition:none!important}.profile-change-avatar{--size:3.375rem;top:calc(var(--size)/-2);transform:none}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:var(--primary-text-color);display:flex;font-size:20px;font-size:var(--font-size-20);font-weight:500;font-weight:var(--font-weight-bold);line-height:26px;line-height:var(--line-height-20);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{align-items:center;color:var(--secondary-text-color);display:flex;font-size:.875rem;justify-content:center;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;content:" ";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3rem);--padding-horizontal:0px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:" ";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px 10px 0 0}.menu-horizontal-div-item{transition:none!important}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:1.3125;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:-.8125rem;box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:#f4f4f5;background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none!important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4,0,.2,1),filter .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;min-width:min(100%,18rem)}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}[dir=ltr] #column-left:after{right:-1px}[dir=rtl] #column-left:after{left:-1px}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:" ";display:block;height:100vh;position:absolute;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:26.5rem}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width:926px){#column-left{display:flex}}@media only screen and (max-width:1275px){#column-left{flex:2}}@media only screen and (min-width:1681px){html.is-safari #column-left{max-width:418.75px}}#column-left .item-main .menu-horizontal-scrollable{background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .item-main .menu-horizontal-scrollable .scrollable{position:relative}[dir=ltr] #column-left .item-main .menu-horizontal-scrollable .badge{margin-left:5px}[dir=rtl] #column-left .item-main .menu-horizontal-scrollable .badge{margin-right:5px}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--scrollable-size));position:relative}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .item-main .menu-horizontal-div{position:relative!important}#column-left .item-main .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;z-index:0}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .item-main .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .item-main .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main{--offset-top:0;background-color:var(--surface-color)}[dir=ltr] #column-left .item-main .input-search .selector-user{left:6px}[dir=rtl] #column-left .item-main .input-search .selector-user{right:6px}[dir=ltr] #column-left .item-main .input-search .selector-user{margin-left:0}[dir=rtl] #column-left .item-main .input-search .selector-user{margin-right:0}#column-left .item-main .input-search .selector-user{position:absolute!important}#column-left .item-main .input-search .selector-user{height:30px;line-height:1.875rem;top:6px;z-index:1}[dir=ltr] #column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}[dir=rtl] #column-left .item-main .input-search.is-picked .input-search-input{padding-right:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block!important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}[dir=ltr] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}[dir=rtl] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{right:38px}[dir=ltr] #column-left .item-main .search-helper{margin-left:28px}[dir=rtl] #column-left .item-main .search-helper{margin-right:28px}#column-left .item-main .search-helper{display:flex}@media only screen and (max-width:600px){[dir=ltr] #column-left .item-main .search-helper{margin-left:20px}[dir=rtl] #column-left .item-main .search-helper{margin-right:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none!important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{position:relative!important}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto!important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%,-50%)}#column-left #chatlist-container{background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:4}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width:600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);min-width:260px}[dir=ltr] #column-left .sidebar-tools-button .btn-menu-item{padding-right:.375rem}[dir=rtl] #column-left .sidebar-tools-button .btn-menu-item{padding-left:.375rem}[dir=ltr] #column-left .archived-count{margin-left:.625rem}[dir=rtl] #column-left .archived-count{margin-right:.625rem}#column-left .archived-count{justify-self:flex-end}html[dir=ltr].is-mobile #column-left .archived-count{margin-right:.375rem}html[dir=rtl].is-mobile #column-left .archived-count{margin-left:.375rem}@media only screen and (max-width:600px){#column-left .archived-count{font-weight:500;font-weight:var(--font-weight-bold)}}#column-left .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding:0 0 1px}#column-left .search-group-people .chatlist:after,#column-left .search-group-people .chatlist:before{content:" ";display:inline-block;flex:0 0 auto;width:.3125rem}#column-left .search-group-people .chatlist-chat{padding:0!important}#column-left .search-group-people .chatlist-chat{align-items:center;display:flex;flex:0 0 auto;flex-direction:column;height:6.125rem;justify-content:flex-end;max-width:4.875rem;width:4.875rem}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .dialog-title{max-width:65px;padding-bottom:.75rem}#column-left .search-group-people .dialog-title .user-title{font-size:.75rem!important}#column-left .search-group-people .dialog-title .peer-title{font-weight:400!important;font-weight:var(--font-weight-normal)!important}[dir=ltr] #column-left .search-group-people .dialog-avatar{left:auto!important}[dir=rtl] #column-left .search-group-people .dialog-avatar{right:auto!important}#column-left .search-group-people .dialog-avatar{top:.75rem!important}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){[dir=ltr] #column-left .search-group-people .search-group-scrollable{margin-left:-7px}[dir=rtl] #column-left .search-group-people .search-group-scrollable{margin-right:-7px}#column-left .search-group-people .search-group-scrollable{margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{position:fixed!important}#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}[dir=ltr] #column-left .connection-status-button{padding-left:4.5rem}[dir=rtl] #column-left .connection-status-button{padding-right:4.5rem}[dir=ltr] #column-left .connection-status-button{text-align:left}[dir=rtl] #column-left .connection-status-button{text-align:right}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}[dir=ltr] #column-left .connection-status-button .preloader-container{left:1rem}[dir=rtl] #column-left .connection-status-button .preloader-container{right:1rem}#column-left .connection-status-button .preloader-container{height:1.5rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{width:100%}}#search-container{top:var(--offset-top)!important}#search-container{display:flex}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{margin-left:23px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{margin-right:23px}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{padding-right:24px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{padding-left:24px}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:var(--secondary-text-color);font-size:.875rem;margin-top:14px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{height:15rem;padding-bottom:0}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:0 auto;max-width:20rem;text-align:center}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-categories .checkbox-field{right:1.125rem!important}.folder-categories .checkbox-field{position:absolute}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}[dir=ltr] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}[dir=rtl] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-right:26px}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width:600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width:601px){.search-group-recent.search-group.search-group-contacts{padding:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0!important}.sidebar-left-section.with-fake-delimiter{box-shadow:none}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@media only screen and (max-width:600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width:601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}[dir=ltr] .sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}[dir=rtl] .sidebar-left-section-content>.checkbox-field .checkbox-box{right:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-content>.media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:var(--secondary-text-color);font-size:1rem;line-height:1.3125;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none!important}.sidebar-left-section-disabled{opacity:.25}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:var(--primary-color);font-size:16px;font-weight:500;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:var(--surface-color)!important}.two-step-verification .sidebar-left-section{box-shadow:none!important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem!important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{right:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width:601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row-title:first-child{font-weight:500;font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:var(--secondary-text-color);font-size:12px;font-size:var(--font-size-12);line-height:16px;line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (min-width:601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:var(--primary-text-color)}.range-setting-selector-value{color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height:2px;--color:var(--primary-color);--border-radius:4px;--thumb-size:12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:var(--primary-color)}.background-container .background-item:after{border:3px solid var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .background-item.active:after{opacity:1}.background-container .background-item.active .grid-item-media{transform:scale(.91)}.background-container .background-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .background .preloader-container{z-index:1}.background-item{cursor:pointer}.background-item-media{border-radius:inherit}.background-item-media.is-pattern{background-color:#000;bottom:0;left:0;position:absolute;right:0;top:0}.background-item-media.is-pattern .media-photo{mix-blend-mode:soft-light}.background-item .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-colors-canvas{border-radius:inherit;height:100%;-webkit-mask-position:center;-webkit-mask-size:cover;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{width:21rem!important}.empty-placeholder{line-height:1.3125;line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;user-select:none}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}[dir=ltr] .empty-placeholder .btn-control:before{margin-right:.625rem}[dir=rtl] .empty-placeholder .btn-control:before{margin-left:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}.is-forum-visible .can-have-forum .input-search,.is-forum-visible .can-have-forum .row-row,.is-forum-visible .can-have-forum .sidebar-header__title{opacity:0}.is-forum-visible .folders-tabs-scrollable{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none}.is-forum-visible.backwards .can-have-forum .input-search,.is-forum-visible.backwards .can-have-forum .row-row,.is-forum-visible.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.backwards .folders-tabs-scrollable{opacity:1}.is-forum-visible.animating .can-have-forum .input-search,.is-forum-visible.animating .can-have-forum .row-row,.is-forum-visible.animating .can-have-forum .sidebar-header__title,.is-forum-visible.animating .folders-tabs-scrollable{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.is-forum-visible.animating.backwards .can-have-forum .input-search,.is-forum-visible.animating.backwards .can-have-forum .row-row,.is-forum-visible.animating.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.animating.backwards .folders-tabs-scrollable{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}#column-right{overflow:visible;overflow:initial;position:relative}@media only screen and (min-width:601px)and (max-width:1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width:600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw,0,0)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}@media only screen and (min-width:601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}}#column-right #search-private-container .chatlist-container{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{margin:.75rem 0;max-width:100%;padding:0 .75rem;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(100vh - 56px);min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .search-super-tabs{--padding-horizontal:0}.shared-media-container .search-super-tabs .menu-horizontal-div-item{border-radius:0!important}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:""}@media only screen and (max-width:600px){.shared-media-container .btn-corner{position:fixed!important}.shared-media-container .btn-corner{bottom:14px;height:54px;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{flex:1 1 auto;width:auto}.search-super-tabs-scrollable{box-shadow:none!important;position:sticky!important}.search-super-tabs-scrollable{background-color:var(--surface-color);top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:" ";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:var(--surface-color)!important}.search-super-tabs-container>div{min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.search-super-tabs-container .preloader{position:absolute!important}.search-super-tabs-container .preloader{padding:0;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:2}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute!important}.search-super .checkbox-field{margin:0;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width:600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:" ";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{--offset-left:0!important;margin:2rem 0 0 -1.75rem!important;padding:0!important}@media only screen and (min-width:601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width:600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 20px}@media only screen and (max-width:600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;margin-bottom:1.5rem}@media only screen and (min-width:601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-bottom:.5rem;padding-top:.5rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent!important}.search-super-selection-container{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width:600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short .chatlist-chat:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:500;font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{margin:0 .5rem;width:auto}@media only screen and (max-width:600px){#poll-results-container .poll-results-more{border-radius:0;margin:0}}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{display:block!important}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem!important}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem!important}.edit-contact-container .avatar-placeholder{filter:none!important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem!important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem!important}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@media only screen and (max-width:600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width:600px){.media-viewer-userpic{display:none}}.media-viewer-name{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:1.3125;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9!important}.media-viewer-caption .scrollable{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width:600px){.media-viewer-caption{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0,-69px,0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{opacity:1!important}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{background-color:#000}}.media-viewer-caption.is-focused{opacity:1!important}.media-viewer-caption.is-focused{background-color:#000}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width:600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width:601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{min-height:auto!important;position:fixed!important}.media-viewer-mover{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;overflow:hidden;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover .canvas-thumbnail,.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration)/8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none!important}.media-viewer-mover.center{left:50%!important;top:50%!important;transform:translate3d(-50%,-50%,0)!important}.media-viewer-mover.center{max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-width:100vw!important;width:100%!important}.media-viewer-mover.center{max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center .canvas-thumbnail,.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding .canvas-thumbnail,.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{position:fixed!important}.media-viewer-whole{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width:600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important}.media-viewer-whole.hide-caption .media-viewer-caption{pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards .canvas-thumbnail,.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:""}.tgico-zoom.zoom-in:before{content:""}.zoom-container{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0!important}.zoom-container.is-visible~.media-viewer-caption{pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{position:fixed!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(100vh - 135px));height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{position:absolute!important;width:23.875rem!important}.emoji-dropdown{-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(var(--surface-color-rgb),.85);background-color:var(--menu-background-color);border-radius:1.25rem;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;transform:scale(0);transform-origin:0 100%;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs:after{content:none}.emoji-dropdown .emoji-tabs-search{margin-left:.5rem!important}.emoji-dropdown .emoji-tabs-search{left:0;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 .75rem}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .stickers-padding .category-items{gap:.25rem;padding:0 .1875rem}.emoji-dropdown #content-gifs .scrollable-y{padding:0 .1875rem}.emoji-dropdown .gifs-masonry{border-radius:10px;overflow:hidden}.emoticons-container{background-color:transparent;flex-direction:column;height:100%;min-height:100%}.emoticons-menu{--item-size:1.875rem;align-items:center;min-height:3.0625rem;padding:0 .3125rem;width:100%;z-index:4}.emoticons-menu,.emoticons-menu-wrapper{background-color:transparent;height:3.0625rem}.emoticons-menu-wrapper{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);max-width:100%;padding:0;position:relative}.emoticons-menu:after{content:" ";display:block;flex:0 0 auto;height:1px;width:.1875rem}.emoticons-menu .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:var(--item-size);line-height:var(--item-size);margin:0 .3125rem;padding:0;width:var(--item-size)}.emoticons-menu .menu-horizontal-div-item.not-local{border-radius:.25rem!important}.emoticons-menu .menu-horizontal-div-item.not-local{--item-size:2.375rem;padding:.25rem}.emoticons-menu .menu-horizontal-div-item.active{background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-div-item.active,html.no-touch .emoticons-menu .menu-horizontal-div-item:active,html.no-touch .emoticons-menu .menu-horizontal-div-item:hover{color:rgba(var(--primary-text-color-rgb),.8)!important}.emoticons-menu .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoticons-menu .menu-horizontal-div-item.active:not(.tgico){background-color:var(--light-secondary-text-color)}.emoticons-menu .menu-horizontal-inner{border-radius:15px;flex:0 0 auto;margin:0 .3125rem;overflow:hidden;width:1.875rem}html.is-safari .emoticons-menu .menu-horizontal-inner{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner{transition:width .2s ease-in-out}.emoticons-menu .menu-horizontal-inner-scroll{align-items:center;display:flex;height:100%;position:relative;width:8.5rem}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{margin:0!important}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transform:scale(1)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transition:transform .2s ease-in-out!important}.emoticons-menu .menu-horizontal-inner.active{background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-inner.active{width:8.5rem}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item{transform:scale(.8)}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item.active{background-color:transparent!important}.emoticons-menu .menu-horizontal-inner:not(.active){cursor:pointer}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-inner-scroll{pointer-events:none}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-div-item:first-child{pointer-events:all}.emoticons-content{flex:1;padding:0;position:relative}.emoticons-content .emoji-category{position:relative}.emoticons-content .sticky_sentinel--top{height:1px;top:0}.emoticons-content .category-title{color:rgba(var(--primary-text-color-rgb),.42);cursor:pointer;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:1.1875rem;padding:.75rem .875rem .375rem;position:relative;text-align:center;width:100%}.emoticons-content .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoticons-content:not(.has-premium) .is-premium-set .category-title:before{content:"";line-height:inherit;margin-right:.125rem;vertical-align:middle}.emoji-padding .super-emojis{padding:0 .5rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:rgba(0,0,0,.2) transparent;scrollbar-color:var(--scrollbar-color) transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:rgba(0,0,0,.2);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable.scrollable-y.scrollable-y-bordered{border-bottom:1px solid transparent;border-top:1px solid transparent}body.animation-level-2 .scrollable.scrollable-y.scrollable-y-bordered{transition:border-top-color .3s cubic-bezier(.4,0,.2,1),border-bottom-color .3s cubic-bezier(.4,0,.2,1);transition:border-top-color var(--transition-standard-in),border-bottom-color var(--transition-standard-in)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-top){border-top-color:#dfe1e5;border-top-color:var(--border-color)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-bottom){border-bottom-color:#dfe1e5;border-bottom-color:var(--border-color)}.scrollable-padding{height:100%;min-width:100%}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important}.selector .selector-search-section{position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding-left:1rem;padding-right:1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}[dir=ltr] .selector-user{padding-right:17px}[dir=rtl] .selector-user{padding-left:17px}[dir=ltr] .selector-user{margin-left:-.25rem;margin-right:.75rem}[dir=rtl] .selector-user{margin-left:.75rem;margin-right:-.25rem}.selector-user{background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;max-width:11.25rem;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{animation:scaleIn .1s ease forwards;animation-direction:reverse}[dir=ltr] .selector-user-avatar{margin-right:8px}[dir=rtl] .selector-user-avatar{margin-left:8px}.selector-user-avatar{border-radius:50%!important}.selector-user-avatar{float:left;overflow:hidden;position:relative}.is-rtl .selector-user-avatar{float:right}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}[dir=ltr] .selector-user-avatar:after{left:0}[dir=rtl] .selector-user-avatar:after{right:0}.selector-user-avatar:after{line-height:32px!important}.selector-user-avatar:after{background-color:var(--danger-color);content:"";font-size:23px;height:100%;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector>hr{margin:0;padding:0}[dir=ltr] .selector .checkbox{padding-left:11px}[dir=rtl] .selector .checkbox{padding-right:11px}.selector .checkbox{margin-top:11px}.selector .checkbox-field{--offset-left:0!important;margin:0!important;padding:0!important;position:absolute!important}.selector .checkbox-field{pointer-events:none;top:50%;transform:translateY(-50%);z-index:1}[dir=ltr] .selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}[dir=rtl] .selector .checkbox-field:first-child{margin-left:1.6875rem;margin-right:.6875rem}[dir=ltr] .selector .checkbox-field-round{right:1.125rem}[dir=rtl] .selector .checkbox-field-round{left:1.125rem}.selector .checkbox-field-round{--size:1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}[dir=ltr] .selector-square .checkbox-field{left:1.25rem!important}[dir=rtl] .selector-square .checkbox-field{right:1.25rem!important}[dir=ltr] .selector-square .chatlist-chat.row-with-padding{padding-left:7.5rem!important}[dir=rtl] .selector-square .chatlist-chat.row-with-padding{padding-right:7.5rem!important}[dir=ltr] .selector-square .dialog-avatar{margin-left:3rem!important}[dir=rtl] .selector-square .dialog-avatar{margin-right:3rem!important}.gifs-masonry{grid-gap:.125rem;display:grid;gap:.125rem;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr)}.gifs-masonry .gif img,.gifs-masonry .gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry .gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color:#fff}.preloader-container .you-spin-me-round{height:100%;width:100%}.preloader-container .preloader-circular{animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{animation:rotate 1s linear infinite!important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer!important}.preloader-container.preloader-streamable circle{stroke-width:2.5!important}.preloader-container.preloader-streamable:after{background-color:var(--color);border-radius:.125rem;content:"";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@keyframes rotate{to{transform:rotate(1turn)}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{animation:ripple-effect .7s forwards;background-color:rgba(0,0,0,.08);background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.c-ripple{--ripple-duration:.4s}.c-ripple__circle{animation-duration:.4s;animation-name:ripple-effect-handhelds;transition-duration:.3s}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}.avatar-like{line-height:var(--size)!important}.avatar-like{--size:54px;--multiplier:1;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--size)}avatar-element{--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%}avatar-element[data-color=red]{--color-top:var(--peer-avatar-red-top);--color-bottom:var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top:var(--peer-avatar-orange-top);--color-bottom:var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top:var(--peer-avatar-violet-top);--color-bottom:var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top:var(--peer-avatar-green-top);--color-bottom:var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top:var(--peer-avatar-cyan-top);--color-bottom:var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top:var(--peer-avatar-pink-top);--color-bottom:var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top:var(--peer-avatar-blue-top);--color-bottom:var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px/var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px/var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(30px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount{--color-top:var(--peer-avatar-archive-top);--color-bottom:var(--peer-avatar-archive-bottom);overflow:hidden}avatar-element.tgico-deletedaccount:before{font-size:calc(30px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;height:var(--size)!important;width:var(--size)!important}avatar-element img{display:block}avatar-element img.fade-in{animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}avatar-element.is-topic{background:none;border-radius:0;position:relative}avatar-element.is-topic .topic-icon{--size:inherit}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid var(--surface-color);border-radius:50%;content:" ";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size:120px;--multiplier:.45}avatar-element.avatar-100{--size:100px;--multiplier:.54}avatar-element.avatar-48{--size:48px;--multiplier:1.125}avatar-element.avatar-46{--size:46px;--multiplier:1.173913}avatar-element.avatar-44{--size:44px;--multiplier:1.227272}avatar-element.avatar-42{--size:42px;--multiplier:1.285714}avatar-element.avatar-40{--size:40px;--multiplier:1.35}avatar-element.avatar-36{--size:36px;--multiplier:1.5}avatar-element.avatar-35{--size:35px;--multiplier:1.542857}avatar-element.avatar-34{--size:34px;--multiplier:1.588235}avatar-element.avatar-32{--size:32px;--multiplier:1.6875}avatar-element.avatar-30{--size:30px;--multiplier:1.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;width:100%!important}.avatar-full .avatar-photo{-o-object-fit:cover;object-fit:cover}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}html.is-safari .document-ico{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.document-ico-text{opacity:0}body.animation-level-2 .document-ico-text{transition:opacity .2s ease-in-out}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:var(--message-background-color);border-style:solid;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:"";display:block;position:absolute;right:0;top:0}body.animation-level-2 .document-ico:after{transition:border-width .2s ease-in-out}html.no-touch .document:not(.downloaded):active .document-ico:after,html.no-touch .document:not(.downloaded):hover .document-ico:after{border-width:0}html.no-touch .document:not(.downloaded):active .document-ico-text,html.no-touch .document:not(.downloaded):hover .document-ico-text{opacity:0}html.no-touch .document:not(.downloaded):active .preloader-container,html.no-touch .document:not(.downloaded):hover .preloader-container{opacity:1!important}.document:not(.downloading) .document-ico-text{opacity:1}.document:not(.downloading) .preloader-container{opacity:0!important}.document.downloading .document-ico:after{border-width:0}.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name,.document-size{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document.ext-zip{--background-color:#fb8c00}.document.ext-pdf{--background-color:#df3f40}.document.ext-apk{--background-color:#43a047}.document.document-with-thumb{--background-color:#fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.2);border-radius:.375rem}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3)!important}.document-thumb{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16);white-space:nowrap}.document-size{color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);pointer-events:none;position:relative}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}[dir=ltr] .audio,[dir=ltr] .document{padding-left:var(--padding-left)}[dir=rtl] .audio,[dir=rtl] .document{padding-right:var(--padding-left)}.audio,.document{--padding:0px;--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin) + var(--padding));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none}[dir=ltr] .audio-download,[dir=ltr] .audio-ico,[dir=ltr] .document-download,[dir=ltr] .document-ico{margin-left:calc((var(--padding-left) - var(--padding))*-1)}[dir=rtl] .audio-download,[dir=rtl] .audio-ico,[dir=rtl] .document-download,[dir=rtl] .document-ico{margin-right:calc((var(--padding-left) - var(--padding))*-1)}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent!important}.audio .preloader-container:not(.preloader-streamable){height:100%;width:100%}.audio{overflow:visible!important}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size)}.audio-download,.audio-toggle{align-items:center;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{display:flex!important;margin:0!important}.audio.corner-download .audio-download{background:none;height:1.375rem;left:57.5%;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out,-webkit-clip-path .25s ease-in-out}@media only screen and (min-width:601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width:600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width:601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width:600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:" • "}.audio-subtitle,.audio-time{color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height:2px;--border-radius:4px;--thumb-size:.75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{background-color:transparent;opacity:1;z-index:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff!important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}[dir=ltr] .quiz-hint .container{text-align:left}[dir=rtl] .quiz-hint .container{text-align:right}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:"";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{animation-duration:.6s;animation-iteration-count:infinite;animation-name:dotMiddle;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{animation-name:dotFirst}.peer-typing-text-dot:last-child{animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{cursor:pointer;display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}[dir=ltr] poll-element .poll-answer-percents{text-align:right}[dir=rtl] poll-element .poll-answer-percents{text-align:left}poll-element .poll-answer-percents{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:500;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:"";font-weight:500;font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important}poll-element .poll-footer-button{color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:500;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:"";font-size:12px}poll-element .circle-hover{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{display:flex!important}poll-element .circle-hover .poll-answer-selected{animation:none;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:var(--light-primary-color)}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{animation-fill-mode:forwards!important}.transition>.transition-item{height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.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.slide-fade{--easeOutSine:cubic-bezier(.39,.575,.565,1);--easeInSine:cubic-bezier(.47,0,.745,.715);position:relative}.transition.slide-fade>.from{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@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-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)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.4375rem 1rem;position:relative}.row.no-subtitle,.row.row-small{min-height:3rem;padding-bottom:.1875rem;padding-top:.1875rem}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{pointer-events:none!important}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity)}.row.no-wrap{padding-bottom:0!important;padding-top:0!important}.row a{pointer-events:all;position:relative;z-index:1}.row-title-row,.row>.row-title{order:0}[dir=ltr] .row-big{padding-left:1rem;padding-right:.75rem}[dir=rtl] .row-big{padding-left:.75rem;padding-right:1rem}.row-big{min-height:4.5rem;padding-bottom:.5625rem;padding-top:.5625rem}.row-row{align-items:center;display:flex;justify-content:space-between}.row-row .row-subtitle,.row-row .row-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-subtitle-row,.row>.row-subtitle{order:1}.row-title{color:var(--primary-text-color);font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;word-break:break-word}.row-title-right-secondary{color:var(--secondary-text-color)}[dir=ltr] .row-subtitle-right,[dir=ltr] .row-title-right{margin-left:1rem}[dir=rtl] .row-subtitle-right,[dir=rtl] .row-title-right{margin-right:1rem}.row-subtitle-right,.row-title-right{flex:0 0 auto!important}.row-midtitle,.row-subtitle,.row-title{pointer-events:none;position:relative}.row-midtitle{font-size:14px;font-size:var(--font-size-14);margin-top:.125rem;order:1}[dir=ltr] .row-with-padding{padding-left:4.5rem}[dir=rtl] .row-with-padding{padding-right:4.5rem}@media only screen and (max-width:600px){[dir=ltr] .row-with-padding{padding-left:4rem}[dir=rtl] .row-with-padding{padding-right:4rem}}[dir=ltr] .row-with-padding.tgico:before{left:1rem}[dir=rtl] .row-with-padding.tgico:before{right:1rem}.row-with-padding.tgico:before{color:var(--secondary-text-color);font-size:1.5rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);z-index:1}.row-with-padding:not(.row-with-icon):before{display:none}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}[dir=ltr] .row-sortable .row-subtitle,[dir=ltr] .row-sortable .row-title{padding-right:2.5rem}[dir=rtl] .row-sortable .row-subtitle,[dir=rtl] .row-sortable .row-title{padding-left:2.5rem}[dir=ltr] .row-sortable-icon{right:.75rem}[dir=rtl] .row-sortable-icon{left:.75rem}.row-sortable-icon{color:var(--secondary-text-color);font-size:1.5rem;height:1.5rem;line-height:1;opacity:0;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.row-sortable.cant-sort .row-sortable-icon{display:none}.row-sortable.is-dragging{background-color:var(--surface-color)!important}.row-sortable.is-dragging{z-index:1}html.no-touch .row-sortable.is-dragging:active,html.no-touch .row-sortable.is-dragging:hover{background-color:var(--light-filled-secondary-text-color)!important}html.no-touch .row-sortable:active .row-sortable-icon,html.no-touch .row-sortable:hover .row-sortable-icon{opacity:1}body.animation-level-2 .is-reordering .row-sortable{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{padding-left:3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{padding-right:3.375rem}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{margin-left:-3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{margin-right:-3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field:not(.radio-field-right) .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .radio-field{margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field{margin-right:0}[dir=rtl] .row .checkbox-field{margin-left:0}.row .checkbox-field{height:auto;margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field .checkbox-caption{padding-left:0}[dir=rtl] .row .checkbox-field .checkbox-caption{padding-right:0}.row .checkbox-field .checkbox-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row .checkbox-field-toggle{margin-left:.125rem;margin-right:.125rem;padding:0}.row-subtitle{color:var(--secondary-text-color)!important;font-size:14px!important;font-size:var(--font-size-14)!important}.row-subtitle{line-height:18px;line-height:var(--line-height-14);margin-top:.1875rem}.row-subtitle:empty{display:none}[dir=ltr] .row-media{left:.75rem}[dir=rtl] .row-media{right:.75rem}.row-media{height:2.25rem!important;margin:0!important;position:absolute!important;width:2.25rem!important}.row-media{align-items:center;display:flex;justify-content:center;pointer-events:none}[dir=ltr] .row-media-small{left:.75rem!important}[dir=rtl] .row-media-small{right:.75rem!important}.row-media-small{height:2rem!important;width:2rem!important}[dir=ltr] .row-media-abitbigger{left:.75rem!important}[dir=rtl] .row-media-abitbigger{right:.75rem!important}.row-media-abitbigger{height:2.625rem!important;width:2.625rem!important}[dir=ltr] .row-media-big{left:.5rem!important}[dir=rtl] .row-media-big{right:.5rem!important}.row-media-big{height:3rem!important;width:3rem!important}[dir=ltr] .row-media-bigger{left:.5625rem!important}[dir=rtl] .row-media-bigger{right:.5625rem!important}.row-media-bigger{height:3.375rem!important;width:3.375rem!important}.row.menu-open{background-color:var(--light-secondary-text-color)}[dir=ltr] .row>.btn-primary{right:1rem}[dir=rtl] .row>.btn-primary{left:1rem}.row>.btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding-left:.75rem;padding-right:.75rem;position:absolute;top:50%;transform:translateY(-50%);width:auto}body.animation-level-2 .row>.btn-primary{transition:width .2s,background-color .2s,color .2s}.row>.btn-primary.active{background-color:var(--light-primary-color)!important}.row>.btn-primary.active{color:var(--primary-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:380px}@media only screen and (max-width:600px){.color-picker{padding:0 .75rem}}.color-picker-box{height:198px;width:100%}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible!important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{display:flex!important;padding:0!important;position:absolute!important;width:26.25rem!important}.reply-keyboard{background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);flex-direction:column;max-height:26.25rem;max-width:100%;opacity:0;overflow:hidden;right:0;transform:scale(0);transform-origin:bottom right;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}@media only screen and (max-height:569px),only screen and (max-width:600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{background-color:transparent;border:2px solid var(--primary-color);border-radius:.375rem;color:var(--primary-color);font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.reply-keyboard .scrollable-y{padding:.625rem!important}.reply-keyboard .scrollable-y{bottom:auto;height:auto;left:auto;max-height:100%;position:relative;right:auto;top:auto}.peoplenearby-container div.text.nearby-description{color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:#aaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:#3d9de0;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{animation:waves-animation 3s infinite;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{animation:waves-animation 5s infinite;animation-delay:2s;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:71px;margin-left:51px;margin-top:1px;width:66px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px!important}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{transform:rotateY(180deg)}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}.spoilers-container .custom-emoji-canvas{z-index:-1}.spoilers-container.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.spoilers-container.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim)}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler-text{opacity:1}.spoilers-container:not(.is-spoiler-visible) .spoiler{cursor:pointer}.spoilers-container:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation,.emoji-animation-container{pointer-events:none;position:absolute}.emoji-animation-container{bottom:0;left:0;overflow:hidden;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{--custom-emoji-size:var(--reaction-size);height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{height:var(--size)!important;width:var(--size)!important}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto}.reaction-sticker.is-custom{border-radius:.3125rem}.reaction-sticker.is-custom .custom-emoji,.reaction-sticker.is-custom .media-sticker{border-radius:inherit}.reaction-sticker.is-custom .custom-emoji-canvas{z-index:auto}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important}.reaction-inline .reaction-counter{order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:#f4f4f5;background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}html.no-touch .reaction-block:active:after,html.no-touch .reaction-block:hover:after{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:.08;position:absolute;right:0;top:0}.reaction-block .reaction-counter,.reaction-block .reaction-sticker{z-index:1}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale(0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scale(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4,0,.2,1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4,0,.2,1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important}.reaction-block .reaction-counter{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.sticker-viewer{align-items:center;bottom:0;display:flex;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:4}.sticker-viewer:before{background-color:rgba(0,0,0,.6);bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .sticker-viewer:before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.sticker-viewer.is-visible:not(.backwards):before{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards):before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .emoji-animation,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .emoji-animation,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker:not(.is-overflow){transition:opacity 0s}.sticker-viewer-transformer{--translateX:0;align-items:center;display:flex;height:360px;justify-content:center;position:absolute;width:360px}.sticker-viewer-transformer.has-effect{height:280px;width:280px}.sticker-viewer-transformer.has-effect .sticker-viewer-emoji{top:-5.5rem}body.animation-level-2 .sticker-viewer-transformer{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-out)}.sticker-viewer-transformer.is-switching{opacity:1!important;transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer-transformer.is-switching{transition:transform .2s cubic-bezier(.12,1.1,.56,1.2),opacity .2s cubic-bezier(.12,1.1,.56,1.2)!important;transition:transform var(--sticker-viewer-switch-transition),opacity var(--sticker-viewer-switch-transition)!important}.sticker-viewer-transformer.is-switching:not(.backwards){opacity:0!important;transform:scale(.4) translateX(var(--translateX))!important}.sticker-viewer-emoji{position:absolute;top:-3rem;transform:translateX(var(--translateX)) scale(2)}.sticker-viewer-sticker{position:absolute}.sticker-viewer .emoji-animation,.sticker-viewer-emoji,.sticker-viewer-sticker{opacity:0}body.animation-level-2 .sticker-viewer .emoji-animation,body.animation-level-2 .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.custom-emoji{height:1.25rem!important;height:var(--custom-emoji-size)!important;min-height:1.25rem!important;min-height:var(--custom-emoji-size)!important;min-width:1.25rem!important;min-width:var(--custom-emoji-size)!important;width:1.25rem!important;width:var(--custom-emoji-size)!important}.custom-emoji{display:inline;position:relative}.custom-emoji:before{content:" ";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.custom-emoji .media-sticker,.custom-emoji .rlottie{height:inherit!important;max-height:inherit!important;max-width:inherit!important;width:inherit!important}.custom-emoji .media-sticker,.custom-emoji .rlottie{margin:0;pointer-events:none;text-indent:-9999px}.custom-emoji-canvas{height:100%;width:100%}.custom-emoji-canvas,.custom-emoji-renderer{bottom:0;left:0;position:absolute;right:0;top:0}.custom-emoji-renderer{pointer-events:none}.custom-emoji-placeholder{display:inline;height:20px;height:var(--messages-custom-emoji-size);margin-top:-.125rem;vertical-align:middle;width:20px;width:var(--messages-custom-emoji-size)}.usernames-username-icon{background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:50%;color:#fff;font-size:1.25rem}.usernames-username-icon:before{content:""}.usernames-username.active .usernames-username-status{color:var(--primary-color)!important}.usernames-username.active .usernames-username-icon{background-color:var(--primary-color)}.topics-slider{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0}.topics-container{background-color:var(--surface-color)!important;width:var(--width)!important}.topics-container{--offset:0;--width:100%}.topics-container.is-floating{overflow:visible!important;overflow:initial!important}.topics-container.is-floating{--offset:5.0625rem;--width:calc(var(--left-column-width) - var(--offset));border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);bottom:0;pointer-events:all;position:absolute;right:0;top:0;transform:translateX(var(--width));z-index:3}.topics-container.is-visible:not(.backwards){transform:translateX(0)}.topics-container.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.topics-container.is-visible.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.topics-container .sidebar-header{padding:0 .75rem}.topics-container .sidebar-header__rows{flex:1 1 auto;overflow:hidden;padding-left:.5rem}.topics-container .sidebar-header__rows .sidebar-header__title{padding-left:0!important}.topics-container .sidebar-header__rows .sidebar-header__title{font-size:16px;font-size:var(--font-size-16);line-height:21px;line-height:var(--line-height-16);margin-bottom:.125rem}.topics-container .sidebar-header__subtitle,.topics-container .sidebar-header__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topics-container .sidebar-header__subtitle{color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14)}.topics-container .chatlist-chat{min-height:4rem;padding-left:.75rem}.topic-name .topic-icon{margin-right:.25rem}.topic-name-button{text-decoration:none!important}.topic-name-button{--color:var(--primary-color);align-items:center;color:var(--color);cursor:pointer;display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:1.5rem;justify-content:center;max-width:100%;padding:0 .5rem;position:relative}.topic-name-button-container{display:flex!important}.topic-name-button-container{align-items:flex-start;justify-content:flex-start}.topic-name-button .peer-title,.topic-name-button .topic-name{position:relative}.topic-name-button:before{background-color:var(--color);border-radius:1.5rem;bottom:0;content:" ";left:0;opacity:.08;position:absolute;right:0;top:0}html.no-touch .topic-name-button:active:before,html.no-touch .topic-name-button:hover:before{opacity:.16}.topic-icon{line-height:1.875!important}.topic-icon{--size:1.25rem;--custom-emoji-size:var(--size);display:inline-flex;font-size:calc(var(--size)/2);justify-content:center;position:relative;vertical-align:middle}.topic-icon-general{fill:#c4c9cc;fill:var(--secondary-color);height:var(--size);width:var(--size)}.topic-icon-svg{height:inherit;position:absolute;width:inherit}.topic-icon-content{position:relative}.edit-topic-container .scrollable-y{display:flex;flex-direction:column}.edit-topic-icon{position:absolute}.edit-topic-icon .topic-icon{--size:4rem}.edit-topic-icon-container{align-items:center;cursor:pointer;display:flex;height:100px;justify-content:center;margin:0 auto;position:relative;width:100px}.edit-topic-emoticons-container{flex:1 1 auto}.edit-topic-emoticons-container .sidebar-left-section{padding:0!important}.edit-topic-emoticons-container .sidebar-left-section{height:100%}.edit-topic-emoticons-container .emoji-padding{display:flex;flex-direction:column}.edit-topic-emoticons-container .super-emoji-topic-icon .topic-icon{--size:var(--esg-emoji-size);--custom-emoji-size:inherit;margin-left:calc((var(--custom-emoji-size) - var(--esg-emoji-size))/2)}.themes-container{align-items:center;display:flex;height:6.5rem;margin:0 -.5rem;position:relative;width:calc(100% + 1rem)}.themes-container:after,.themes-container:before{content:" ";display:block;flex:0 0 auto;height:.5rem;width:.5rem}.theme-container{border-radius:10px;flex:0 0 auto;height:calc(100% - .5rem);margin:0 .25rem;position:relative;width:4.5rem}.theme-container:before{border:2px solid var(--primary-color);border-radius:14px;bottom:-4px;content:" ";left:-4px;opacity:0;position:absolute;right:-4px;top:-4px;transform:scale(.86)}html.is-safari .theme-container:before{transform:none!important}body.animation-level-2 .theme-container:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.theme-container.active{pointer-events:none}.theme-container.active:before{opacity:1;transform:scale(1)}.theme-emoticon{bottom:.5rem;height:1.75rem;left:50%;pointer-events:none;position:absolute;transform:translateX(-50%) scale(1);transform-origin:center bottom;width:1.75rem;z-index:1}body.animation-level-2 .theme-emoticon{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.theme-bubble{background-color:#fff;border-radius:1.75rem;height:1.25rem;position:absolute;width:2.5rem}.theme-bubble.is-out{background-color:var(--light-filled-message-out-primary-color);right:.375rem;top:.5rem}.theme-bubble.is-in{background-color:var(--surface-color);background-color:var(--message-background-color);left:.375rem;top:2rem}.popup{position:fixed!important}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;right:0;top:0;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}[dir=ltr] .popup-title{padding-left:1.5rem;padding-right:1rem}[dir=rtl] .popup-title{padding-left:1rem;padding-right:1.5rem}.popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1;margin:0}.popup-title:first-child{padding-left:0}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform .15s cubic-bezier(.4,0,.2,1);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem;position:relative}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:center;display:flex;flex-direction:row-reverse;height:3rem;justify-content:flex-start;padding:0 .5rem}.popup-buttons .btn{border-radius:10px;font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;max-width:100%;overflow:hidden;padding:0 1rem;position:relative;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}[dir=ltr] .popup-buttons .btn+.btn{margin-right:.625rem}[dir=rtl] .popup-buttons .btn+.btn{margin-left:.625rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}[dir=ltr] .popup-avatar h6{text-align:left}[dir=rtl] .popup-avatar h6{text-align:right}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:14px;font-size:var(--font-size-14);height:2.25rem;line-height:2.25rem;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-container{max-width:25rem;padding:0;width:25rem}.popup-new-media.popup-send-photo .popup-container.border-top-offset .popup-input-container{overflow:visible;overflow:initial}.popup-new-media.popup-send-photo .popup-container.border-top-offset .popup-input-container:before{top:-8px}.popup-new-media.popup-send-photo .popup-header{height:3.5rem;margin:0;padding:0 1rem}[dir=ltr] .popup-new-media.popup-send-photo .popup-title{padding-left:1.5rem}[dir=rtl] .popup-new-media.popup-send-photo .popup-title{padding-right:1.5rem}.popup-new-media.popup-send-photo .popup-close{margin:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .popup-body .scrollable{padding:0 .5rem}.popup-new-media.popup-send-photo .input-message-container{max-height:inherit;min-height:inherit}.popup-new-media.popup-send-photo .input-message-input{max-height:inherit!important}.popup-new-media.popup-send-photo .btn-primary{flex:0 0 auto;height:2.5rem;line-height:2.5rem;margin-bottom:.5rem;padding:0 1rem;text-transform:uppercase;width:auto}.popup-new-media.popup-send-photo .popup-input-container{--height:3.5rem;--max-height:8.375rem;align-items:flex-end;display:flex;flex:0 0 auto;justify-content:space-between;max-height:var(--max-height);min-height:var(--height);overflow:hidden;padding:0 .5rem;position:relative}.popup-new-media.popup-send-photo .popup-input-container:before{background-color:#dfe1e5;background-color:var(--border-color);content:" ";height:1px;left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .popup-new-media.popup-send-photo .popup-input-container:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.popup-new-media.popup-send-photo .popup-input-container.has-border-top:before{opacity:1}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{border-radius:inherit;overflow:hidden;position:relative}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{--padding:.25rem;--icon-size:4.5rem;--icon-margin:.5rem;border-radius:10px;cursor:default;height:5rem;margin:0 .25rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{line-height:1.5;margin-bottom:.125rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{border-radius:5px;font-size:16px;font-weight:400;letter-spacing:0;line-height:11px}html.no-touch .popup-new-media.popup-send-photo .document:active,html.no-touch .popup-new-media.popup-send-photo .document:hover{background-color:var(--light-secondary-text-color)}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;height:2.5rem;margin:0;padding:0 1rem;width:-moz-max-content;width:max-content}.popup-peer .popup-container{max-width:min(400px,100%);min-width:min(100%,17.5rem);padding:.75rem .5rem;width:-moz-min-content;width:min-content}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.popup-peer .popup-title:not(:first-child){padding-left:1rem}.popup-peer .popup-description{line-height:1.3125;line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-moz-fit-content;max-width:fit-content;min-width:min(100%,15rem);overflow:hidden;padding:.625rem 1rem .5rem;text-overflow:ellipsis;word-break:break-word}.popup-peer .checkbox-field{align-items:center;display:flex;height:3rem;margin:0;padding:0 1.125rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-stickers .sticker-set-footer{color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .scrollable.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .super-emojis{padding:0 .5rem}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}[dir=ltr] .popup-stickers .popup-close{margin-left:1rem}[dir=rtl] .popup-stickers .popup-close{margin-right:1rem}.popup-stickers .popup-close{font-size:1.5rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set .row-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-stickers .sticker-set-stickers{--per-row:5;--item-size:var(--popup-sticker-size);display:grid;grid-template-columns:repeat(var(--per-row),1fr);padding:0 5px;position:relative}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{--per-row:4}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper{cursor:pointer;height:var(--item-size);justify-self:center;margin-bottom:2px;position:relative;width:var(--item-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers .media-sticker-wrapper{margin-bottom:8px}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper:hover{background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height:470px){.popup-date-picker .popup-container[data-lines="7"]{top:19px}.popup-date-picker .popup-container[data-lines="5"]{top:-19px}}.popup-date-picker .popup-header{margin-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7!important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:var(--primary-color)!important}.popup-date-picker .date-picker-month .btn-icon.active{border-radius:50%;color:#fff;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@media only screen and (max-width:600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines="5"]{top:-16px}.popup-schedule .popup-container[data-lines="7"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@media only screen and (max-width:600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold);margin-left:-5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:var(--primary-text-color)!important;font-size:14px!important}.popup-schedule .date-picker-month-day{font-weight:500;font-weight:var(--font-weight-bold)}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width:600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px,100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main:before{left:.25rem}.popup-create-poll .radio-field .radio-field-main:after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{opacity:0!important}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-create-poll hr:not(.hide){display:block!important}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:7px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.8125rem}}.popup-forward .popup-title{flex-grow:1;height:100%;padding:0}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:20px;font-size:var(--font-size-20);height:100%;line-height:1;padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.1875rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1rem 0 .375rem;overflow:visible;overflow:initial}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-header{justify-content:space-between;width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale:1}.call-buttons .call-button-container.hide-me{--scale:0!important}.call-buttons .call-button-container.hide-me{transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(-2.6875rem);transform:translateX(calc(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(6.75rem + 2rem*var(--margin-length)));transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:var(--danger-color)!important}.call-button-green{background-color:#5cc85e!important;background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:7.625rem;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{height:1.875rem!important;width:1.875rem!important}.call-party-state .rlottie-icon{flex:0 0 auto;margin-left:-.25rem;margin-right:.25rem}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(-6.5rem);transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0),rgba(33,33,33,.65) 48.54%,#212121);background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:" ";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{font-size:16px;font-size:var(--font-size-16);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:#aaa;color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:rgba(1,200,80,.2);background-color:var(--gc-button-unmuted-color);color:#fff;color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60,135,247,.2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223,68,184,.2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255,89,90,.3)!important;background-color:var(--gc-button-leave-color)!important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg,#00a3b4 12.94%,#00cb47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg,#4eabf8 14.73%,#3478f6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg,#df44b8 14.73%,#3851eb 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant .dialog-subtitle,.group-call-participant .dialog-title{padding-right:2.5rem}.group-call-participant-muted-icon-container{position:absolute!important}.group-call-participant-muted-icon-container{right:.5rem}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;height:2rem;margin-left:.75rem;width:2rem}.group-call-participant .is-speaking{color:#5cc85e;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container:before{content:" ";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaa;color:var(--gc-secondary-text-color)}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25%!important}.group-call-cfs,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width:17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(-13.125rem);transform:translateX(calc(var(--gc-right-column-width)/-2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX:calc(var(--gc-right-column-width)/-2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{background-color:#212121;background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:-26.25rem;right:calc(var(--gc-right-column-width)*-1);top:0;width:26.25rem;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.popup-reacted-list{--size:1.5rem;--custom-emoji-size:var(--size)}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--reaction-size:var(--size);--additional-height:.75rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{font-size:1.25rem!important}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{display:flex;height:var(--size);position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:var(--size)}.popup-reacted-list .chatlist-chat{padding-right:3.25rem!important}.popup-payment .popup-container{border-radius:16px;max-height:min(100%,43.5rem);max-width:26.25rem;padding:0;width:26.25rem}.popup-payment .popup-header{height:3.5rem;margin:0;padding:0 1rem}.popup-payment.is-loading .popup-container{min-height:26.25rem}.popup-payment .scrollable{display:flex;flex:1 1 auto;flex-direction:column}.popup-payment hr{display:block!important;margin:.5rem 0!important;padding:0!important}.popup-payment .input-field{--height:3rem;margin:.75rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.popup-payment .input-fields-row .input-field{margin-top:1.25rem}.popup-payment .sidebar-left-section{padding:0!important}.popup-payment .sidebar-left-section-name+.input-field,.popup-payment .sidebar-left-section-name+.input-fields-row .input-field{margin-top:.75rem}.popup-payment .sidebar-left-section .row{margin-top:.5rem}.popup-payment .sidebar-left-section-content{margin:0 .5rem!important}.popup-payment .select-wrapper{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);max-height:10rem}.popup-payment .select-wrapper li{grid-template-columns:calc(26px + 2rem) 1fr;height:3rem}.popup-payment .payment-verification{border:none;flex:1 1 auto;height:40rem;max-height:100%;width:100%}.popup-payment .row{border-radius:10px}.payment-item{padding:0 1.25rem;width:100%}.payment-item-details{display:flex;flex:0 0 auto;justify-content:space-between;margin-bottom:1rem;overflow:hidden}.payment-item-details:last-child{margin-bottom:0}.payment-item-details-photo{border-radius:10px;flex:0 0 auto;height:6.25rem;margin-right:1rem;width:6.25rem}.payment-item-details-photo .media-photo{border-radius:inherit}.payment-item-details-lines{display:flex;flex:1 1 auto;flex-direction:column}.payment-item-details-lines-title{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16)}.payment-item-details-lines-bot-name,.payment-item-details-lines-description{font-size:14px;font-size:var(--font-size-14);line-height:1.25rem}.payment-item-details-lines-bot-name{color:var(--secondary-text-color)}.payment-item-prices{display:flex;flex-direction:column;margin:1rem .25rem .5rem}.payment-item-prices-price{color:var(--secondary-text-color);display:flex;font-weight:500;justify-content:space-between;line-height:1.1875rem}.payment-item-prices-price+.payment-item-prices-price{margin-top:1.5rem}.payment-item-prices-price.is-total{color:var(--primary-text-color)}.payment-item-tips{display:flex;justify-content:space-between;margin:.75rem -.5rem 1.5rem}.payment-item-tips-tip{--background-intensity:.1;background-color:rgba(84,190,97,var(--background-intensity));border-radius:1.25rem;color:#3ba748;flex:1 1 auto;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;line-height:2.5rem;text-align:center}body.animation-level-2 .payment-item-tips-tip{transition:color .1s ease-in-out,background-color .1s ease-in-out}.payment-item-tips-tip+.payment-item-tips-tip{margin-left:.5rem}html.no-touch .payment-item-tips-tip:not(.active):active,html.no-touch .payment-item-tips-tip:not(.active):hover{--background-intensity:.3}.payment-item-tips-tip.active{--background-intensity:1;color:#fff}.payment-item-tips-input{color:inherit!important;font-weight:inherit!important}.payment-item-tips-input{display:inline}.payment-item-row{margin:0 .5rem;padding-bottom:0;padding-top:0}.payment-item-method-row .media-photo{border-radius:10px}.payment-item-pay{flex:0 0 auto;height:3rem;margin:1rem;text-transform:uppercase;width:auto}.payment-item-preloader-container{flex:1 1 auto;position:relative}.popup-payment-shipping-methods .popup-container{min-height:auto}.popup-payment-shipping-methods .row{margin-top:0!important}.popup-payment-verification .popup-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:" ";height:1px;left:0;position:absolute;right:0}.popup-payment-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}.popup-limit .popup-container{min-width:min(100%,22.5rem)}.popup-limit-line{align-items:center;display:flex;flex-direction:column;margin:.75rem 0}.popup-limit-hint{align-items:center;color:#fff;display:flex;font-weight:500;font-weight:var(--font-weight-bold);justify-content:center;transform:scale(.6) translate(-280px,16px) rotate(-30deg)}body.animation-level-2 .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.2)}.popup-limit-hint.active{transform:scale(1) translate(0) rotate(0)}.popup-limit-hint-icon{display:flex;font-size:1.25rem;margin-right:.25rem}.popup-limit-button.primary{color:#fff!important}.popup-limit-button.primary{align-items:center;background:linear-gradient(88.39deg,#6c93ff -2.56%,#976fff 51.27%,#df69d1 107.39%);display:flex}.popup-limit-button-icon{display:flex;font-size:1.5rem;margin-left:.625rem}.popup-limit .limit-line{align-self:stretch;margin:1rem .5rem 0}.popup-limit:not(.is-locked) .popup-limit-hint{background:linear-gradient(73.4deg,#6c93ff -7.21%,#976fff 114.57%,#df69d1 241.52%);background-size:200px 2rem;border-radius:1rem;height:2rem;padding:0 .75rem;position:relative}.popup-limit:not(.is-locked) .popup-limit-hint:after{background:inherit;background-position-x:calc(-50% - 86px);background-repeat:no-repeat;background-size:inherit;bottom:-9px;-webkit-clip-path:path("M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z");clip-path:path("M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z");content:" ";display:block;height:9px;left:50%;margin-left:-13px;position:absolute;width:100%}.popup-limit.is-locked .popup-limit-hint{background-color:var(--primary-color);border-radius:1.375rem;height:2.75rem;margin-right:-.25rem;padding:0 1.25rem 0 1rem}.popup-limit.is-premium .popup-limit-hint{align-self:flex-end;background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);background-position-x:100%;background-size:200px 2rem;border-bottom-right-radius:0;margin-right:.5rem}body.animation-level-2 .popup-limit.is-premium .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.1)}.popup-limit.is-premium .popup-limit-hint:after{background-position-x:134%;bottom:-11.3px;-webkit-clip-path:path("M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z");clip-path:path("M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z");height:12px;left:100%;margin-left:-20.6px}#auth-pages{background:var(--surface-color);max-width:100%;overflow:hidden}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width:600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width:600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width:600px){#auth-pages .input-wrapper{margin-top:41px;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height:810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;width:100%}@media screen and (max-height:810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width:600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{height:240px!important;width:240px!important}.page-signQR .auth-image{align-items:center;display:flex;justify-content:center}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem!important}.page-signQR h4{flex:0 0 auto}[dir=ltr] .page-signQR .qr-description{text-align:left}[dir=rtl] .page-signQR .qr-description{text-align:right}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@media only screen and (max-width:600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width:600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center;margin:1.375rem 0 .875rem}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:var(--danger-color)!important}.page-authCode .phone-wrapper .phone{margin:0}.page-authCode .subtitle{margin:0 auto!important}.page-authCode .subtitle{max-width:300px}.page-chats{max-width:1682px!important}.page-chats{display:flex}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important}.page-chats .main-column{width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{display:flex!important}.page-chats #column-center{background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:#dfe1e5;border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;overflow:hidden;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100)}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:#fff;background-color:var(--body-background-color);color:var(--primary-text-color)}body.deactivated{animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:Roboto Mono,monospace;font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width:100%}@media only screen and (min-width:601px){.only-handhelds{display:none!important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500;font-weight:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:var(--primary-color);color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}input:-webkit-autofill:first-line{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial;font-size:16px}.subtitle{color:var(--secondary-text-color);line-height:1.35}.danger{color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:var(--light-danger-color)}.blue,.primary{color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:var(--light-primary-color)}.primary-text{color:var(--primary-text-color)!important}.color-premium{-webkit-text-fill-color:transparent;background:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%);background:var(--premium-gradient);-webkit-background-clip:text}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:var(--primary-color)}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@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 fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:min(30rem,calc(100vw - 2rem));opacity:0;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast.is-visible{opacity:1}body.animation-level-2 .toast{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.toast b{color:inherit}.toast a{color:#60a5e9!important}.toast a{cursor:pointer}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}b{font-weight:500;font-weight:var(--font-weight-bold)}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.avatar-edit-canvas{background:linear-gradient(#69bffa,#3d9de0);background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{color:#fff;font-size:3rem;height:3rem;left:50%;line-height:1;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);width:3rem;z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}[dir=ltr] .select-wrapper li{text-align:left}[dir=rtl] .select-wrapper li{text-align:right}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}[dir=ltr] .phone-code{text-align:right}[dir=rtl] .phone-code{text-align:left}.phone-code{color:#9e9e9e}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}[dir=ltr] .phone-edit{margin-left:.4rem}[dir=rtl] .phone-edit{margin-right:.4rem}.phone-edit{cursor:pointer;font-size:1.5rem;height:1.5rem;line-height:1;opacity:.5;transition:opacity .2s;width:1.5rem}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}span.emoji{font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol}@media not screen and (-webkit-min-device-pixel-ratio:2),not screen and (min-device-pixel-ratio:2),not screen and (min-resolution:192dpi),not screen and (min-resolution:2dppx){html[dir=ltr]:not(.is-safari) span.emoji{margin-right:5px!important}html[dir=rtl]:not(.is-safari) span.emoji{margin-left:5px!important}html[dir=ltr]:not(.is-safari) avatar-element span.emoji{margin-right:0!important}html[dir=rtl]:not(.is-safari) avatar-element span.emoji{margin-left:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable=true] .custom-emoji{display:inline-block;margin-bottom:-2px}[contenteditable=true] .custom-emoji:before{content:none}[contenteditable=true] [style*=markup]{font-family:inherit!important}[contenteditable=true] [style*=bold]{font-weight:700}[contenteditable=true] [style*=italic]{font-style:italic}[contenteditable=true] [style*=underline]{text-decoration-line:underline}[contenteditable=true] [style*=strikethrough]{text-decoration-line:line-through}[contenteditable=true] [style*=underline][style*=strikethrough]{text-decoration-line:underline line-through}[contenteditable=true] [style*=monospace]{font-family:Roboto Mono,monospace!important;font-family:var(--font-monospace)!important}[contenteditable=true] [style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color)}[contenteditable][data-placeholder]:before{color:#a2acb4;content:attr(data-placeholder);display:block;opacity:0;pointer-events:none;position:absolute}body.animation-level-2 [contenteditable][data-placeholder]:before{transform:translateX(1.75rem);transition:opacity .2s ease-out .01s,transform .2s ease-out .01s;transition:opacity var(--input-transition) .01s,transform var(--input-transition) .01s}[contenteditable][data-placeholder]:empty:before{opacity:1}body.animation-level-2 [contenteditable][data-placeholder]:empty:before{transform:translateX(0)}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{display:grid;grid-template-columns:repeat(auto-fill,72px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){[dir=ltr] .show-more{padding-left:8px}[dir=rtl] .show-more{padding-right:8px}}[dir=ltr] .show-more .tgico-down{padding-left:1rem;padding-right:2rem}[dir=rtl] .show-more .tgico-down{padding-left:2rem;padding-right:1rem}.show-more .tgico-down{float:left;font-size:24px}.content-empty,.show-more .tgico-down{color:var(--secondary-text-color)}::-moz-selection{background:rgba(var(--primary-color-rgb),.4);background:var(--selection-background-color)}.selection:after,::selection{background:rgba(var(--primary-color-rgb),.4);background:var(--selection-background-color)}.selection:after{bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.input-something{display:inline-block}.input-selectable{position:relative}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0,calc(var(--translateY)*-1),0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0,var(--translateY),0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-container-contain{position:relative}.media-container-contain .media-photo{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.media-container-cover{position:relative}.media-container-cover .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-sticker-wrapper.is-premium-sticker:before{align-items:center;background:rgba(0,0,0,.2);background-image:var(--lock-url);background-repeat:no-repeat;background-size:cover;border-radius:50%;bottom:.125rem;color:#fff;display:flex;height:1.25rem;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:1.25rem;z-index:1}body.is-premium .media-sticker-wrapper.is-premium-sticker:after,body.is-premium .media-sticker-wrapper.is-premium-sticker:before{content:none}.media-round{max-height:280px;max-height:var(--round-video-size);max-width:280px;max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:rgba(109,141,65,.4)!important;background-color:var(--message-highlightning-color)!important}.media-round .video-time{padding:0 .375rem}[dir=ltr] .media-round .video-time:after,[dir=ltr] .media-round .video-time:before{margin-left:.25rem}[dir=rtl] .media-round .video-time:after,[dir=rtl] .media-round .video-time:before{margin-right:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:" ";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:"";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:#f4f4f5;background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.sidebar-left-section{padding:.5rem 0!important}.sidebar-left-section{background-color:var(--surface-color);box-shadow:0 1px 3px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{padding:0 1rem}}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-left-section-container a{cursor:pointer}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important}.tgico-admin:before,.tgico-fontsize:before{padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.navigable-list .active{background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{--esg-emoji-total-size:calc(var(--esg-emoji-size) + 0.5rem);--custom-emoji-size:var(--esg-emoji-size);grid-column-gap:2.44px;--esg-emoji-size:2.125rem;--esg-emoji-total-size:2.625rem;--custom-emoji-size:2.25rem;-moz-column-gap:2.44px;column-gap:2.44px;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;font-size:var(--esg-emoji-size);grid-template-columns:repeat(auto-fill,var(--esg-emoji-total-size));justify-content:space-between;line-height:var(--esg-emoji-size);position:relative}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:var(--esg-emoji-total-size);line-height:inherit;margin-left:.0625rem;margin-right:.0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:var(--esg-emoji-total-size)}.super-emojis .super-emoji .emoji-placeholder{background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}.super-emojis .super-emoji.active,html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:var(--light-secondary-text-color)}.super-emojis.not-local .super-emoji{padding:.1875rem}.super-emojis .super-emoji{margin:0}.super-emojis:not(.not-local) .super-emoji{overflow:hidden}html.native-emoji .super-emojis:not(.not-local) .super-emoji{padding-bottom:.3125rem;padding-top:.3125rem}.super-emojis .custom-emoji{display:block}.super-emojis .custom-emoji-renderer{z-index:1}.super-emojis .custom-emoji:before{content:none}.tgico-char:before{font-family:Roboto!important}.tgico-char:before{font-weight:500;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:"Z"}.tgico-char.w:before{content:"W"}.sending-status:empty{display:none}.sending-status .tgico-sendingerror{color:var(--danger-color)}.sending-status-icon{line-height:1!important}.sending-status-icon{position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon-svg{height:1rem;width:1rem}.verified-icon-check{fill:#fff}.verified-icon-background{fill:var(--primary-color)}[dir=ltr] .emoji-status,[dir=ltr] .premium-icon,[dir=ltr] .verified-icon{margin-left:.125rem}[dir=rtl] .emoji-status,[dir=rtl] .premium-icon,[dir=rtl] .verified-icon{margin-right:.125rem}.emoji-status,.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;width:1.25rem}[dir=ltr] .emoji-status{margin-left:.25rem}[dir=rtl] .emoji-status{margin-right:.25rem}.emoji-status{height:1.125rem;position:relative;width:1.125rem}.premium-icon{color:var(--primary-color);margin-top:-.0625rem}.badge-fake{line-height:1!important}.badge-fake{border:1px solid var(--danger-color);border-radius:.185rem;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.25rem;margin-right:.25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex;overflow:hidden}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.limit-line{display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:2rem}.limit-line-free{color:#000}.limit-line-premium{color:#fff}.limit-line-free{background-color:#f1f3f5;border-bottom-left-radius:10px;border-top-left-radius:10px}.limit-line-premium{background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);border-bottom-right-radius:10px;border-top-right-radius:10px}.limit-line-free,.limit-line-premium{align-items:center;display:flex;flex:1 1 0;justify-content:space-between;padding:0 .75rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}[dir=ltr] .chatlist-chat.row-with-padding{padding-left:4.5rem!important}[dir=rtl] .chatlist-chat.row-with-padding{padding-right:4.5rem!important}.chatlist-chat span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist-chat .row-title{font-size:16px!important;font-size:var(--font-size-16)!important}.chatlist-chat .row-title{line-height:1.375rem}.chatlist-chat .row-title-right-secondary{font-size:12px!important;font-size:var(--font-size-12)!important;line-height:16px!important;line-height:var(--line-height-12)!important}.chatlist-chat .row-title-right-secondary{margin-top:-.4375rem}.chatlist-chat .row-subtitle{display:block!important}.chatlist-chat .row-row{height:1.375rem}.chatlist-chat.chatlist-chat-abitbigger .row-subtitle{margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle{font-size:16px!important;font-size:var(--font-size-16)!important}.chatlist-chat.chatlist-chat-bigger .row-subtitle{line-height:1.375rem;margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle-row{margin-top:.125rem}.chatlist-chat.chatlist-chat-bigger .row-title .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.username-purchase-help b{color:var(--danger-color)!important;font-weight:400!important;font-weight:var(--font-weight-normal)!important}.media-spoiler-container{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.media-spoiler-container.is-revealing{opacity:1}.media-spoiler-container.is-revealing:not(.backwards){opacity:0}.media-spoiler-container.is-revealing.animating{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{-o-object-fit:initial!important;object-fit:fill!important}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{height:100%;position:absolute;width:100%} + +/*# sourceMappingURL=main.ae7615ad31a2454bfc82.css.map*/ \ No newline at end of file diff --git a/public/main.ae7615ad31a2454bfc82.css.map b/public/main.ae7615ad31a2454bfc82.css.map new file mode 100644 index 00000000..8fc82515 --- /dev/null +++ b/public/main.ae7615ad31a2454bfc82.css.map @@ -0,0 +1 @@ +{"version":3,"file":"main.ae7615ad31a2454bfc82.css","mappings":"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","sources":["webpack://tweb/./src/materialize.scss","webpack://tweb/./src/scss/style.scss"],"sourcesContent":["/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}button{background:none;border:none;cursor:pointer;outline:none;padding:0}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none!important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;user-select:none}.no-transition,.no-transition:after,.no-transition:before{transition:none!important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start!important}.justify-self-start{justify-self:flex-start!important}.justify-self-end{justify-self:flex-end!important}.position-center{position:absolute!important}.position-center{left:50%;top:50%;transform:translate(-50%,-50%)}.text-bold{font-weight:500!important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap!important}.no-wrap{white-space:nowrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}.reflect-x{transform:scaleX(-1)}[dir=auto]{unicode-bidi:plaintext}.is-rtl [dir=auto]{direction:inherit}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}",":root{--vh:1vh;--z-below:-1;--hover-alpha:0.08;--transition-standard-easing:cubic-bezier(.4,.0,.2,1);--transition-standard-in-time:.3s;--transition-standard-out-time:.25s;--transition-standard-in:var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out:var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition:.2s ease-in-out;--layer-transition:.2s cubic-bezier(.4,.0,.2,1);--slide-header-transition:.4s ease-in-out;--tabs-transition:.2s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--sticker-viewer-open-transition-in:.2s var(--transition-standard-easing);--sticker-viewer-open-transition-out:.2s var(--transition-standard-easing);--sticker-viewer-switch-transition:.2s cubic-bezier(.12,1.1,.56,1.2);--popup-transition-function:cubic-bezier(.4,0,.2,1);--popup-transition-time:.15s;--btn-corner-transition:.2s cubic-bezier(.34,1.56,.64,1);--chatlist-badge-transition-in:.25s cubic-bezier(.35,.35,.47,1.34);--chatlist-badge-transition-out:.25s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin:5.5625rem;--message-beside-button-size:2.375rem;--message-beside-button-margin:calc((var(--message-beside-button-size) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-line-height:1.3125;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--messages-time-text-size:calc(var(--messages-text-size) - 4px);--messages-service-text-size:calc(var(--messages-text-size) - 1px);--messages-custom-emoji-size:calc(var(--messages-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height-20:26px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--line-height:1.3125;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--font-size:var(--font-size-16);--esg-sticker-size:72px;--esg-custom-emoji-size:36px;--popup-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-backdrop-filter:blur(50px);--font-monospace:\"Roboto Mono\",monospace;--font-weight-bold:500;--font-weight-normal:400;--selection-background-color:rgba(var(--primary-color-rgb),.4);--selection-color:inherit;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--custom-emoji-size:1.25rem;--peer-avatar-red-top:#ff845e;--peer-avatar-red-bottom:#d45246;--peer-avatar-orange-top:#febb5b;--peer-avatar-orange-bottom:#f68136;--peer-avatar-violet-top:#b694f9;--peer-avatar-violet-bottom:#6c61df;--peer-avatar-green-top:#9ad164;--peer-avatar-green-bottom:#46ba43;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#5bcbe3;--peer-avatar-blue-bottom:#359ad4;--peer-avatar-pink-top:#ff8aac;--peer-avatar-pink-bottom:#d95574;--peer-avatar-saved-top:#69bffa;--peer-avatar-saved-bottom:#3d9de0;--peer-avatar-archive-top:#b8c2cc;--peer-avatar-archive-bottom:#9eaab5;--avatar-color-top:var(--peer-avatar-saved-top);--avatar-color-bottom:var(--peer-avatar-saved-bottom);--avatar-border-radius-forum:37%;--premium-gradient:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%)}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--popup-sticker-size:68px;--round-video-size:200px;--chat-input-size:2.875rem;--chat-input-padding:0.5rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:601px){:root{--right-column-width:420px;--chat-input-size:3.375rem;--chat-input-padding:0.8125rem;--chat-input-inner-padding:0.5rem}}@media only screen and (max-height:569px){:root{--chat-input-size:2.875rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:1276px)and (max-width:1680px){:root{--right-column-width:25vw}}:root{--body-background-color:#fff;--background-color-true:#f4f4f5;--background-color:var(--background-color-true);--border-color:#dfe1e5;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--secondary-color:#c4c9cc;--avatar-online-color:#0ac630;--chatlist-status-color:var(--avatar-online-color);--chatlist-pinned-color:#a2abb2;--badge-text-color:#fff;--link-color:#00488f;--ripple-color:rgba(0,0,0,.08);--poll-circle-color:var(--border-color);--spoiler-background-color:#e3e5e8;--spoiler-draft-background-color:#d9d9d9;--monospace-text-color:var(--danger-color);--backdrop-opacity:.85;--menu-background-color:rgba(var(--surface-color-rgb),var(--backdrop-opacity));--message-background-color:var(--surface-color);--message-time-color:var(--secondary-text-color);--message-checkbox-color:#61c642;--message-checkbox-border-color:#fff;--message-primary-color:var(--primary-color);--light-filled-message-primary-color:var(--light-filled-primary-color);--message-secondary-color:var(--secondary-color);--message-error-color:var(--danger-color);--message-out-link-color:var(--link-color);--message-out-status-color:var(--message-out-primary-color);--message-out-time-color:var(--message-out-status-color);--message-out-audio-play-button-color:#fff;--message-out-selection-background-color:var(--selection-background-color);--gc-background-color:#212121;--gc-button-leave-color:rgba(255,89,90,.3);--gc-button-unmuted-color:rgba(1,200,80,.2);--gc-button-muted-color:rgba(60,135,247,.2);--gc-button-hand-color:rgba(223,68,184,.2);--gc-button-unmuted-fill-color:#195530;--gc-button-muted-fill-color:#3c87f7;--gc-green-color:#195530;--gc-blue-color:#3c87f7;--gc-red-color:#643333;--gc-primary-text-color:#fff;--gc-secondary-text-color:#aaa;--gc-green-text-color:#5cc85e;--gc-blue-text-color:#3390ec;--gc-red-text-color:#ff595a;--gc-right-column-width:26.25rem}.night{--body-background-color:#181818;--background-color-true:#181818;--background-color:var(--background-color-true);--border-color:#0f0f0f;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--secondary-color:#707579;--avatar-online-color:#0ac630;--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-color);--message-time-color:var(--secondary-text-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-error-color:#fff;--message-out-link-color:#fff;--message-out-status-color:#fff;--message-out-time-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color);--message-out-selection-background-color:rgba(var(--surface-color-rgb),.4)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?ivbp49) format(\"truetype\"),url(assets/fonts/tgico.woff?ivbp49) format(\"woff\"),url(assets/fonts/tgico.svg?ivbp49#tgico) format(\"svg\")}.tgico:after,.tgico:before,[class*=\" tgico-\"]:after,[class*=\" tgico-\"]:before,[class^=tgico-]{font-family:tgico!important}.tgico:after,.tgico:before,[class*=\" tgico-\"]:after,[class*=\" tgico-\"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:\"\"}.tgico-checks:before{content:\"\"}.tgico-activesessions:before{content:\"\"}.tgico-add:before{content:\"\"}.tgico-add_reaction:before{content:\"\"}.tgico-addmember_filled:before{content:\"\"}.tgico-adduser:before{content:\"\"}.tgico-admin:before{content:\"\"}.tgico-animals:before{content:\"\"}.tgico-animations:before{content:\"\"}.tgico-archive:before{content:\"\"}.tgico-arrow_down:before{content:\"\"}.tgico-arrow_next:before{content:\"\"}.tgico-attach:before{content:\"\"}.tgico-audio_repeat:before{content:\"\"}.tgico-audio_repeat_single:before{content:\"\"}.tgico-avatarnext:before{content:\"\"}.tgico-avatarprevious:before{content:\"\"}.tgico-binfilled:before{content:\"\"}.tgico-bold:before{content:\"\"}.tgico-botcom:before{content:\"\"}.tgico-bots:before{content:\"\"}.tgico-bug:before{content:\"\"}.tgico-calendar:before{content:\"\"}.tgico-calendarfilter:before{content:\"\"}.tgico-camera:before{content:\"\"}.tgico-cameraadd:before{content:\"\"}.tgico-car:before{content:\"\"}.tgico-card:before{content:\"\"}.tgico-card_outline:before{content:\"\"}.tgico-channel:before{content:\"\"}.tgico-channelviews:before{content:\"\"}.tgico-chatspinned:before{content:\"\"}.tgico-chatsplaceholder:before{content:\"\"}.tgico-check1:before{content:\"\"}.tgico-checkbox:before{content:\"\"}.tgico-checkboxblock:before{content:\"\"}.tgico-checkboxempty:before{content:\"\"}.tgico-checkboxon:before{content:\"\"}.tgico-checkretract:before{content:\"\"}.tgico-checkround:before{content:\"\"}.tgico-close:before{content:\"\"}.tgico-clouddownload:before{content:\"\"}.tgico-colorize:before{content:\"\"}.tgico-comments:before{content:\"\"}.tgico-commentssticker:before{content:\"\"}.tgico-copy:before{content:\"\"}.tgico-darkmode:before{content:\"\"}.tgico-data:before{content:\"\"}.tgico-delete:before{content:\"\"}.tgico-delete_filled:before{content:\"\"}.tgico-deletedaccount:before{content:\"\"}.tgico-deleteleft:before{content:\"\"}.tgico-deleteuser:before{content:\"\"}.tgico-devices:before{content:\"\"}.tgico-document:before{content:\"\"}.tgico-down:before{content:\"\"}.tgico-download:before{content:\"\"}.tgico-dragfiles:before{content:\"\"}.tgico-dragmedia:before{content:\"\"}.tgico-eats:before{content:\"\"}.tgico-edit:before{content:\"\"}.tgico-email:before{content:\"\"}.tgico-endcall_filled:before{content:\"\"}.tgico-enter:before{content:\"\"}.tgico-eye1:before{content:\"\"}.tgico-eye2:before{content:\"\"}.tgico-fast_forward:before{content:\"\"}.tgico-fast_rewind:before{content:\"\"}.tgico-favourites:before{content:\"\"}.tgico-flag:before{content:\"\"}.tgico-flip:before{content:\"\"}.tgico-folder:before{content:\"\"}.tgico-fontsize:before{content:\"\"}.tgico-forward:before{content:\"\"}.tgico-forward_filled:before{content:\"\"}.tgico-fullscreen:before{content:\"\"}.tgico-gc_microphone:before{content:\"\"}.tgico-gc_microphoneoff:before{content:\"\"}.tgico-gifs:before{content:\"\"}.tgico-group:before{content:\"\"}.tgico-groupmedia:before{content:\"\"}.tgico-groupmediaoff:before{content:\"\"}.tgico-help:before{content:\"\"}.tgico-hide:before{content:\"\"}.tgico-image:before{content:\"\"}.tgico-info:before{content:\"\"}.tgico-info2:before{content:\"\"}.tgico-italic:before{content:\"\"}.tgico-keyboard:before{content:\"\"}.tgico-lamp:before{content:\"\"}.tgico-language:before{content:\"\"}.tgico-largepause:before{content:\"\"}.tgico-largeplay:before{content:\"\"}.tgico-left:before{content:\"\"}.tgico-limit_chat:before{content:\"\"}.tgico-limit_chats:before{content:\"\"}.tgico-limit_file:before{content:\"\"}.tgico-limit_folders:before{content:\"\"}.tgico-limit_link:before{content:\"\"}.tgico-limit_pin:before{content:\"\"}.tgico-link:before{content:\"\"}.tgico-listscreenshare:before{content:\"\"}.tgico-livelocation:before{content:\"\"}.tgico-location:before{content:\"\"}.tgico-lock:before{content:\"\"}.tgico-lockoff:before{content:\"\"}.tgico-loginlogodesktop:before{content:\"\"}.tgico-loginlogomobile:before{content:\"\"}.tgico-logout:before{content:\"\"}.tgico-mediaspoiler:before{content:\"\"}.tgico-mediaspoileroff:before{content:\"\"}.tgico-mention:before{content:\"\"}.tgico-menu:before{content:\"\"}.tgico-message:before{content:\"\"}.tgico-messageunread:before{content:\"\"}.tgico-microphone:before{content:\"\"}.tgico-microphone_crossed:before{content:\"\"}.tgico-microphone_crossed_filled:before{content:\"\"}.tgico-microphone_filled:before{content:\"\"}.tgico-minus:before{content:\"\"}.tgico-monospace:before{content:\"\"}.tgico-more:before{content:\"\"}.tgico-mute:before{content:\"\"}.tgico-muted:before{content:\"\"}.tgico-newchannel:before{content:\"\"}.tgico-newchat_filled:before{content:\"\"}.tgico-newgroup:before{content:\"\"}.tgico-newprivate:before{content:\"\"}.tgico-next:before{content:\"\"}.tgico-noncontacts:before{content:\"\"}.tgico-nosound:before{content:\"\"}.tgico-passwordoff:before{content:\"\"}.tgico-pause:before{content:\"\"}.tgico-permissions:before{content:\"\"}.tgico-phone:before{content:\"\"}.tgico-pin:before{content:\"\"}.tgico-pinlist:before{content:\"\"}.tgico-pinned_filled:before{content:\"\"}.tgico-pinnedchat:before{content:\"\"}.tgico-pip:before{content:\"\"}.tgico-play:before{content:\"\"}.tgico-playback_05:before{content:\"\"}.tgico-playback_15:before{content:\"\"}.tgico-playback_1x:before{content:\"\"}.tgico-playback_2x:before{content:\"\"}.tgico-plus:before{content:\"\"}.tgico-poll:before{content:\"\"}.tgico-premium_addone:before{content:\"\"}.tgico-premium_double:before{content:\"\"}.tgico-premium_lock:before{content:\"\"}.tgico-premium_unlock:before{content:\"\"}.tgico-previous:before{content:\"\"}.tgico-radiooff:before{content:\"\"}.tgico-radioon:before{content:\"\"}.tgico-reactions:before{content:\"\"}.tgico-readchats:before{content:\"\"}.tgico-recent:before{content:\"\"}.tgico-replace:before{content:\"\"}.tgico-reply:before{content:\"\"}.tgico-reply_filled:before{content:\"\"}.tgico-rightpanel:before{content:\"\"}.tgico-rotate_left:before{content:\"\"}.tgico-rotate_right:before{content:\"\"}.tgico-saved:before{content:\"\"}.tgico-savedmessages:before{content:\"\"}.tgico-schedule:before{content:\"\"}.tgico-scheduled:before{content:\"\"}.tgico-search:before{content:\"\"}.tgico-select:before{content:\"\"}.tgico-send:before{content:\"\"}.tgico-send2:before{content:\"\"}.tgico-sending:before{content:\"\"}.tgico-sendingerror:before{content:\"\"}.tgico-settings:before{content:\"\"}.tgico-settings_filled:before{content:\"\"}.tgico-sharescreen_filled:before{content:\"\"}.tgico-shipping:before{content:\"\"}.tgico-shuffle:before{content:\"\"}.tgico-smallscreen:before{content:\"\"}.tgico-smile:before{content:\"\"}.tgico-spoiler:before{content:\"\"}.tgico-sport:before{content:\"\"}.tgico-star:before{content:\"\"}.tgico-stickers:before{content:\"\"}.tgico-stickers_face:before{content:\"\"}.tgico-stop:before{content:\"\"}.tgico-strikethrough:before{content:\"\"}.tgico-textedit:before{content:\"\"}.tgico-tip:before{content:\"\"}.tgico-tools:before{content:\"\"}.tgico-topics:before{content:\"\"}.tgico-unarchive:before{content:\"\"}.tgico-underline:before{content:\"\"}.tgico-unmute:before{content:\"\"}.tgico-unpin:before{content:\"\"}.tgico-unread:before{content:\"\"}.tgico-up:before{content:\"\"}.tgico-user:before{content:\"\"}.tgico-username:before{content:\"\"}.tgico-videocamera:before{content:\"\"}.tgico-videocamera_crossed_filled:before{content:\"\"}.tgico-videocamera_filled:before{content:\"\"}.tgico-videochat:before{content:\"\"}.tgico-volume_down:before{content:\"\"}.tgico-volume_mute:before{content:\"\"}.tgico-volume_off:before{content:\"\"}.tgico-volume_up:before{content:\"\"}.tgico-zoomin:before{content:\"\"}.tgico-zoomout:before{content:\"\"}.tgico-phone_filled:before{content:\"\";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:\" \";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}[dir=ltr] .input-field label{left:1rem}[dir=rtl] .input-field label{right:1rem}.input-field label{background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;z-index:2}.is-rtl .input-field label{transform-origin:right center}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-icon{border-radius:.375rem;height:1.5rem;pointer-events:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:1.5rem;z-index:1}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:1.3125;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width)) calc(var(--padding-horizontal) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem;--padding-horizontal:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:var(--primary-color)}.input-field-input:focus{border-color:var(--primary-color)}.input-field-input.error{border-color:var(--danger-color)}.input-field-input.error~label{color:var(--danger-color)!important}.input-field-input.error~.input-field-border{border-color:var(--danger-color)!important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f!important}.input-field-input.valid~.input-field-border{border-color:#26962f!important}.input-field-input:focus~.arrow-down{border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 .3125rem;transform:translate(-.1875rem,calc(var(--height)/-2 + .0625rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;position:absolute!important;right:auto!important}.input-field-input-fake{left:0;opacity:0;pointer-events:none;top:0;z-index:-3}.input-fields-row{display:flex}.input-fields-row .input-field{flex:1 1 auto;width:1%}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{animation:input-shake .2s ease-in-out forwards}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){[dir=ltr] .input-search{margin-left:1rem}[dir=rtl] .input-search{margin-right:1rem}}.input-search-input{max-height:var(--height)!important;min-height:var(--height)!important}.input-search-input{--height:42px;background-color:#fff;background-color:var(--input-search-background-color);border-color:#dfe1e5;border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:#c4c9cc!important;border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:var(--secondary-text-color);font-size:1.5rem;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}[dir=ltr] .input-search>.tgico-search{left:.8125rem}[dir=rtl] .input-search>.tgico-search{right:.8125rem}.input-search>.tgico-search{height:1.5rem;pointer-events:none;width:1.5rem}[dir=ltr] .input-search>.tgico-close{right:0}[dir=rtl] .input-search>.tgico-close{left:0}.input-search>.tgico-close{height:42px;width:42px;z-index:1}[dir=ltr] .input-search>.tgico-close:before{margin-right:-1px}[dir=rtl] .input-search>.tgico-close:before{margin-left:-1px}[dir=ltr] .input-field-password .input-field-input{padding-right:2.5rem}[dir=rtl] .input-field-password .input-field-input{padding-left:2.5rem}.input-field-password .input-field-input{max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-family:Arial,Helvetica,sans-serif;font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top:0}@media(-webkit-min-device-pixel-ratio:2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:\"\"}.input-field-password .toggle-visible.eye-hidden:before{content:\"\"}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{pointer-events:none!important}.btn-icon:disabled,.btn:disabled{opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{border-radius:50%!important}.btn-icon{align-items:center;background-color:transparent;border:none;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:var(--primary-color)}[dir=ltr] .btn-corner{right:var(--offset)}[dir=rtl] .btn-corner{left:var(--offset)}.btn-corner{box-shadow:none!important;padding:0!important;position:absolute!important;transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:var(--primary-color);border:none;bottom:var(--offset);color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;text-align:center;transform:translate3d(0,var(--translateY),0);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}html.no-touch .btn-corner:active,html.no-touch .btn-corner:hover{background-color:var(--dark-primary-color)}.btn-corner.is-visible{--translateY:0}body.animation-level-0 .btn-corner{transition:none!important}.btn-corner:disabled{opacity:1!important;pointer-events:all!important}.btn-corner .preloader-circular{height:2.5rem;width:2.5rem}.btn-menu{transform:scale(.8)!important}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(var(--surface-color-rgb),.85);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),visibility .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:4}.btn-menu-old,.is-mobile .btn-menu{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item,.is-mobile .btn-menu .btn-menu-item{transform:none!important}.btn-menu-old .btn-menu-item,.is-mobile .btn-menu .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:16px;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:21px;line-height:var(--line-height-16);margin:0}.btn-menu-old .btn-menu-item:before,.is-mobile .btn-menu .btn-menu-item:before{align-self:auto;color:var(--secondary-text-color);margin-top:0}.btn-menu-old .btn-menu-footer,.is-mobile .btn-menu .btn-menu-footer{background-color:#f4f4f5;background-color:var(--background-color)}.btn-menu{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;visibility:visible}.btn-menu.active,.is-mobile .btn-menu.was-open{transform:scaleX(1)!important}.btn-menu.bottom-left,.is-rtl .btn-menu.bottom-right{left:auto;right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right,.is-rtl .btn-menu.bottom-left{left:0;right:auto;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;left:auto;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right,.is-rtl .btn-menu.top-left{bottom:100%;left:0;right:auto;top:auto;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}[dir=ltr] .btn-menu-item{text-align:left}[dir=rtl] .btn-menu-item{text-align:right}.btn-menu-item{cursor:pointer!important;pointer-events:all!important}.btn-menu-item{--padding-vertical:.25rem;--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:var(--primary-text-color);display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:18px;line-height:var(--line-height-14);margin-left:.3125rem;margin-right:.3125rem;padding:var(--padding-vertical) var(--padding-right) var(--padding-vertical) var(--padding-left);position:relative;text-transform:none;transform:scale(1);white-space:nowrap}.btn-menu-item.tgico-char:before{width:var(--icon-size)}body.animation-level-2 .btn-menu-item{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:var(--light-danger-color)}.btn-menu-item:before{align-self:flex-start;color:var(--primary-text-color);font-size:var(--icon-size);margin-top:.125rem}[dir=ltr] .btn-menu-item-icon,[dir=ltr] .btn-menu-item:before{margin-right:var(--icon-margin)}[dir=rtl] .btn-menu-item-icon,[dir=rtl] .btn-menu-item:before{margin-left:var(--icon-margin)}.btn-menu-item-icon,.btn-menu-item:before{position:relative}[dir=ltr] .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - var(--add)/2)}[dir=rtl] .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - var(--add)/2)}[dir=ltr] .btn-menu-item-icon{margin-left:calc(var(--add)/-2)}[dir=rtl] .btn-menu-item-icon{margin-right:calc(var(--add)/-2)}.btn-menu-item-icon{--add:.25rem;--total:calc(var(--icon-size) + var(--add));flex:0 0 auto;height:var(--total);width:var(--total)}.btn-menu-item-icon .media-photo{height:inherit;width:inherit}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}[dir=ltr] .btn-menu-item-text-fake{margin-left:var(--margin-left)}[dir=rtl] .btn-menu-item-text-fake{margin-right:var(--margin-left)}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{color:var(--secondary-text-color);font-size:.875rem}.btn-menu-item-header{pointer-events:none!important}.btn-menu-item-header{color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);height:2rem}[dir=ltr] .btn-menu-item .stacked-avatars{right:.5rem}[dir=rtl] .btn-menu-item .stacked-avatars{left:.5rem}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute}.btn-menu-item.is-multiline{font-size:.75rem;height:auto;max-width:16.25rem;min-width:calc(100% - .625rem);width:-moz-fit-content;width:fit-content}.btn-menu-item.is-multiline .btn-menu-item-text{white-space:pre-wrap;width:-moz-fit-content;width:fit-content}.btn-menu-item .checkbox-field-toggle{padding:0}.btn-menu-overlay{max-width:none!important;position:fixed!important;width:auto!important}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:4}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important}.btn-menu hr{margin:.3125rem auto;opacity:.6;padding:0;width:calc(100% - 1.875rem)}html:not(.is-mobile) .btn-menu .badge{background-color:transparent;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(var(--surface-color-rgb),.85);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}[dir=ltr] .btn-menu-reactions-container{margin-left:var(--other-side-offset)}[dir=rtl] .btn-menu-reactions-container{margin-right:var(--other-side-offset)}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}[dir=ltr] .btn-menu-reactions-container-vertical{margin-left:var(--menu-offset)}[dir=rtl] .btn-menu-reactions-container-vertical{margin-right:var(--menu-offset)}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:\" \";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:var(--dark-primary-color);transition:opacity .2s}.btn-primary-transparent{background-color:transparent;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}[dir=ltr] .btn-primary use,[dir=ltr] .btn-primary>svg{right:15px}[dir=rtl] .btn-primary use,[dir=rtl] .btn-primary>svg{left:15px}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto}.btn-primary:disabled{pointer-events:none!important}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity)}[dir=ltr] .btn-control{padding-left:.75rem;padding-right:1.5rem}[dir=rtl] .btn-control{padding-left:1.5rem;padding-right:.75rem}.btn-control{align-items:center;border-radius:1.25rem;display:flex;height:2.5rem;line-height:2.5rem;margin:.9375rem auto 1rem;width:auto}[dir=ltr] .btn-control.tgico:before{margin-right:.375rem}[dir=rtl] .btn-control.tgico:before{margin-left:.375rem}.btn-control.tgico:before{font-size:1.5rem}.btn-transparent{align-items:center;background-color:transparent;color:var(--primary-text-color);display:flex;font-weight:400;height:3rem;line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:var(--light-primary-color)}[dir=ltr] .btn-transparent:before{margin-right:2rem}[dir=rtl] .btn-transparent:before{margin-left:2rem}.btn-transparent:before{color:var(--secondary-text-color);font-size:1.5rem}@media only screen and (max-width:600px){[dir=ltr] .btn-transparent:before{margin-right:1.5rem}[dir=rtl] .btn-transparent:before{margin-left:1.5rem}}[dir=ltr] .btn-transparent.btn-short:before{margin-right:1rem}[dir=rtl] .btn-transparent.btn-short:before{margin-left:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important}.btn-menu-toggle{position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size:54px;border-radius:50%;height:var(--size);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:3.375rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:3.375rem;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:var(--call-button-margin)}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:var(--call-button-margin)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:2rem}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:2rem}[dir=ltr] .btn-update{right:auto!important}[dir=rtl] .btn-update{left:auto!important}.btn-update{padding:0 2rem!important}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:\"\";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:\"\";left:0;position:absolute}.animated-menu-icon:before{top:-.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{animation:none!important}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden}.autocomplete-helper{border-radius:var(--border-radius)!important;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper{--border-radius:10px;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width:319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal)*4)}}.autocomplete-peer-helper .scrollable{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:1.3125;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{line-height:var(--size)!important}.badge{--size:1.375rem;--padding:.4375rem;border-radius:calc(var(--size)/2);color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);min-width:var(--size);padding:0 var(--padding);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{--size:1.25rem;--padding:.375rem}.badge-24{--size:1.5rem;--padding:.5rem}.badge.tgico:before{font-size:var(--size)}.badge-primary{background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{border-radius:0!important}.ckin__player.ckin__fullscreen{background:#000;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}@media only screen and (max-width:600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0}[dir=ltr] .default__controls{text-align:left}[dir=rtl] .default__controls{text-align:right}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}@media only screen and (max-width:600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:\"\"}.default .default__gradient-bottom{transform:translate3d(0,50px,0)}.default .default__controls{transform:translate3d(0,52px,0)}@media only screen and (max-width:600px){.default .default__controls{transform:translate3d(0,65px,0)}}.default.show-controls .default__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:\"\"}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4,0,.2,1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.progress-line{--color:var(--primary-color);--height:5px;--border-radius:6px;--thumb-size:13px;border-radius:var(--border-radius);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{background-color:var(--color);border-radius:50%;content:\" \";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size)/2)) scale(1.125)}.progress-line:before,.progress-line__loaded{background-color:#c4c9cc;background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}[dir=ltr] .checkbox-field{text-align:left}[dir=rtl] .checkbox-field{text-align:right}.checkbox-field{--size:1.25rem;--offset-left:0px;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{pointer-events:none!important}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}[dir=ltr] .checkbox-field .checkbox-box{left:var(--offset-left)}[dir=rtl] .checkbox-field .checkbox-box{right:var(--offset-left)}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;left:0;right:0}.checkbox-field .checkbox-box-background{background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:7px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:3.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}[dir=ltr] .checkbox-field .checkbox-caption{padding-left:3.375rem}[dir=rtl] .checkbox-field .checkbox-caption{padding-right:3.375rem}.checkbox-field .checkbox-caption{color:inherit;line-height:1.3125;line-height:var(--line-height);pointer-events:none;position:relative;transition:opacity .2s}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}[dir=ltr] .checkbox-field.hover-effect .checkbox-box{left:auto}[dir=rtl] .checkbox-field.hover-effect .checkbox-box{right:auto}.checkbox-field .anchor-url{pointer-events:all}.checkbox-ripple{border-radius:10px;overflow:hidden}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size:1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}[dir=ltr] .radio-field{text-align:left}[dir=rtl] .radio-field{text-align:right}.radio-field{--size:1.375rem;--offset-left:0px;cursor:pointer;line-height:1.3125;line-height:var(--line-height);margin:1.25rem 0;position:relative}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}[dir=ltr] .radio-field .radio-field-main{padding-left:3.5rem}[dir=rtl] .radio-field .radio-field-main{padding-right:3.5rem}.radio-field .radio-field-main{color:inherit;position:relative}[dir=ltr] .radio-field .radio-field-main:after,[dir=ltr] .radio-field .radio-field-main:before{left:var(--offset-left)}[dir=rtl] .radio-field .radio-field-main:after,[dir=rtl] .radio-field .radio-field-main:before{right:var(--offset-left)}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:\"\";display:block;height:var(--size);position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main:before{transition:border-color .1s ease,opacity .1s ease}[dir=ltr] .radio-field .radio-field-main:after{left:calc(var(--offset-left) + .3125rem)}[dir=rtl] .radio-field .radio-field-main:after{right:calc(var(--offset-left) + .3125rem)}.radio-field .radio-field-main:after{background:var(--primary-color);border-radius:50%;height:.75rem;transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}[dir=ltr] .radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}[dir=rtl] .radio-field.radio-field-right .radio-field-main:before{left:0;right:auto}[dir=ltr] .radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[dir=rtl] .radio-field.radio-field-right .radio-field-main:after{left:.3125rem;right:auto}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:-1;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none!important;transition:background-color .2s!important}.checkbox-field-restriction .checkbox-box-check use{stroke-dasharray:24.19,24.19!important;transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.checkbox-field-restriction .checkbox-box-check use{transform:rotate(0) translateY(0)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0 .25rem;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:var(--surface-color);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:50%;content:\" \";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s cubic-bezier(.22,.75,.7,1.44)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width:600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:0 0 .5rem}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:var(--surface-color);display:flex;flex-direction:column;margin:0;position:relative;-moz-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist-chat{background:var(--background)!important}.chatlist-chat{--background:unset;-webkit-user-drag:none}.chatlist-chat.is-forum-open,.chatlist-chat.menu-open,html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-filled-secondary-text-color)}[dir=ltr] .chatlist-chat.is-muted .user-title:after{margin-left:.125rem}[dir=rtl] .chatlist-chat.is-muted .user-title:after{margin-right:.125rem}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:\"\";flex:0 0 auto;font-size:1.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat i{font-style:normal}.chatlist-chat .text-highlight{color:var(--primary-text-color)}.chatlist-chat .premium-icon{margin-top:-.125rem}.chatlist-chat .topic-icon{flex:0 0 auto}[dir=ltr] .chatlist-chat .row-title .topic-icon{margin-right:.25rem}[dir=rtl] .chatlist-chat .row-title .topic-icon{margin-left:.25rem}.chatlist-chat .row-title .topic-icon{--size:1.375rem}.chatlist-chat .topic-name .topic-icon{line-height:1!important}.chatlist-chat .topic-name .topic-icon{display:inline}.chatlist-chat .topic-name .topic-icon-svg{position:relative}.chatlist-chat .topic-name .topic-icon-content{left:0;margin-top:-6px;position:absolute;right:0;top:0}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .premium-icon,.chatlist-chat.active .row-subtitle,.chatlist-chat.active .row-title,.chatlist-chat.active .sending-status-icon,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff!important}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active .danger,.chatlist-chat.active .primary-text{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-icon-background{fill:#fff!important}.chatlist-chat.active .verified-icon-check{visibility:hidden}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff!important}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .sending-status-icon.tgico-premium_lock{color:#c4c9cc;color:var(--secondary-color);font-size:.8125rem;margin:.1875rem 0 0 .5rem}[dir=ltr] .chatlist .dialog-title-details{margin-left:.5rem}[dir=rtl] .chatlist .dialog-title-details{margin-right:.5rem}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;padding:1px 0 0}[dir=ltr] .chatlist .dialog-subtitle-badge{margin-left:.5rem}[dir=rtl] .chatlist .dialog-subtitle-badge{margin-right:.5rem}.chatlist .dialog-subtitle-badge{display:block!important}.chatlist .dialog-subtitle-badge{flex:0 0 auto}.chatlist .dialog-subtitle-badge.avatar-badge{line-height:23px!important}.chatlist .dialog-subtitle-badge.avatar-badge{--size:1.625rem;border:2px solid var(--background,var(--surface-color));margin:0;pointer-events:none;position:absolute;right:calc(100% - 4.0625rem);top:2.4375rem}[dir=ltr] .chatlist .dialog-subtitle-media{margin-right:.375rem}[dir=rtl] .chatlist .dialog-subtitle-media{margin-left:.375rem}.chatlist .dialog-subtitle-media{border-radius:.25rem;display:inline-block;flex:0 0 auto;height:1.25rem;line-height:1.25rem;position:relative;width:1.25rem}.chatlist .dialog-subtitle-media:before{content:\" \";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;bottom:auto;height:inherit;-o-object-fit:cover;object-fit:cover;top:auto;width:inherit}.chatlist .dialog-group-call-icon{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .dialog-avatar,.chatlist .row-row{pointer-events:none;position:relative}.chatlist .user-title{display:flex!important}.chatlist .user-title{align-items:center}.chatlist .user-title img.emoji{height:18px;margin-top:1px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1;position:relative}[dir=ltr] .chatlist .message-status{margin-right:.125rem}[dir=rtl] .chatlist .message-status{margin-left:.125rem}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:#0ac630!important;background-color:var(--chatlist-status-color)!important;line-height:1.25rem!important}.chatlist .mention{padding:0}[dir=ltr] .chatlist .mention-badge{margin-right:-.125rem}[dir=rtl] .chatlist .mention-badge{margin-left:-.125rem}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread,.chatlist .no-unmuted-topic .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist .not-visited{background-color:#c4c9cc!important;background-color:var(--secondary-color)!important}.chatlist .not-visited{--size:.5rem;--padding:0}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{margin-bottom:0!important}.chatlist-bottom .sidebar-left-section{padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{max-width:728px!important;max-width:var(--messages-container-width)!important}}@media only screen and (min-width:601px){.chat-input{--padding-bottom:1.25rem}}@media only screen and (max-height:569px){.chat-input{--padding-bottom:0.5rem}}@media only screen and (min-width:1276px){.chat-input{width:calc(100% - var(--right-column-width))!important}body.is-right-column-shown .chat-input{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{position:absolute!important;transform:translate3d(0,var(--translateY),0)!important}.chat-input.is-hidden{--translateY:100%;bottom:0;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0!important}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .toggle-emoticons:before{content:\"\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"\"!important}[dir=ltr] .chat-input .btn-record-cancel{right:0}[dir=rtl] .chat-input .btn-record-cancel{left:0}.chat-input .btn-record-cancel{--multiplier:-1;opacity:0;padding:0;position:absolute;top:0;transform:translateX(calc((100% + var(--padding-horizontal) + .5rem)*var(--multiplier)));visibility:hidden;z-index:3}.chat-input .btn-record-cancel .c-ripple__circle,html.no-touch .chat-input .btn-record-cancel:active:after,html.no-touch .chat-input .btn-record-cancel:hover:after{background-color:var(--light-danger-color)}.chat-input .btn-record-cancel:before{color:var(--danger-color)}.is-rtl .chat-input .btn-record-cancel{--multiplier:1}[dir=ltr] .chat-input .btn-scheduled:after{right:5px}[dir=rtl] .chat-input .btn-scheduled:after{left:5px}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:\"\";height:.5rem;position:absolute;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{animation:hide-icon .4s ease-in-out forwards!important}[dir=ltr] .chat-input .float{margin-right:.75rem!important}[dir=rtl] .chat-input .float{margin-left:.75rem!important}.chat-input .float{display:none!important;margin:0!important}.chat-input .float{align-self:center}body.animation-level-2 .chat-input .float{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){[dir=ltr] .chat-input .float{margin-right:.125rem!important}[dir=rtl] .chat-input .float{margin-left:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}[dir=ltr] .chat-input .btn-send-container{right:var(--padding-horizontal)}[dir=rtl] .chat-input .btn-send-container{left:var(--padding-horizontal)}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-cancel-record,.chat-input .btn-send{box-shadow:0 1px 8px 1px rgba(0,0,0,.12)}.chat-input .btn-send{background-color:var(--primary-color)!important;color:#fff!important}.chat-input .btn-send{z-index:3}html.no-touch .chat-input .btn-send:active,html.no-touch .chat-input .btn-send:hover{background-color:var(--dark-primary-color)!important}.chat-input .btn-send .tgico-check{height:32px!important}.chat-input .btn-send .tgico-check{font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:500;font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:var(--danger-color);border-radius:50%;content:\" \";display:inline-block;height:10px;margin-left:9px;margin-right:9px;width:10px}body.animation-level-2 .chat-input .record-time:after{animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;height:300px;opacity:.5;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - var(--chat-input-size)*2 - 1rem)}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}[dir=ltr] .chat-input:not(.is-recording) .btn-record-cancel{margin-right:0}[dir=rtl] .chat-input:not(.is-recording) .btn-record-cancel{margin-left:0}.chat-input:not(.is-recording) .btn-record-cancel{width:0}.chat-input .new-message-wrapper{opacity:1}.chat-input .reply-in-topic-overlay{align-items:center;background-color:inherit;border-radius:inherit;color:var(--secondary-text-color);display:flex;justify-content:center;padding:0 1rem;pointer-events:none;z-index:3}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@media only screen and (max-width:600px){body.is-left-column-shown #column-center{transform:translate3d(100vw,0,0)}body.is-right-column-shown #column-center{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{position:fixed!important}#column-center{bottom:0;left:0;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem,0,0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex!important}.chat{align-items:center;flex-direction:column;transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 420px)),0,0)}}@media only screen and (min-width:1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)),0,0)}}@media only screen and (min-width:1276px)and (max-width:1680px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(75vw,0,0)}}@media only screen and (max-width:925px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(100vw,0,0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{position:absolute!important}.chat-background,.chat-background-item{bottom:0;left:0;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{background-color:#000!important;background-image:none!important;margin:0!important}.chat-background-item.is-pattern{align-items:center;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)!important}body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center}body.animation-level-2.is-right-column-shown .chat-background-item{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(.666666667)}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:soft-light}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.chat .drops-container{--padding:20px;--pinned-floating-height:0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width:1276px){[dir=ltr] body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}[dir=rtl] body.is-right-column-shown .chat .drops-container{left:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat[data-type=chat] .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:1rem;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{background-color:#fff;border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);content:\" \";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}[dir=ltr] .chat-input-control-button:before{margin-right:10px}[dir=rtl] .chat-input-control-button:before{margin-left:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}[dir=ltr] .selection-wrapper .selection-container .btn-icon{margin-left:6px;margin-right:5px}[dir=rtl] .selection-wrapper .selection-container .btn-icon{margin-left:5px;margin-right:6px}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;width:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width:600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width:380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}[dir=ltr] .selection-wrapper .selection-container-forward:before{margin-right:14px}[dir=rtl] .selection-wrapper .selection-container-forward:before{margin-left:14px}[dir=ltr] .selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}[dir=rtl] .selection-wrapper .selection-container-delete{margin-left:.625rem;margin-right:.375rem}[dir=ltr] .selection-wrapper .selection-container-delete:before{margin-right:10px}[dir=rtl] .selection-wrapper .selection-container-delete:before{margin-left:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}[dir=ltr] .fake-rows-wrapper{left:var(--padding-horizontal)}[dir=rtl] .fake-rows-wrapper{right:var(--padding-horizontal)}.fake-rows-wrapper{top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}[dir=ltr] .rows-wrapper{border-bottom-right-radius:0}[dir=rtl] .rows-wrapper{border-bottom-left-radius:0}.rows-wrapper{transform:translateX(0) scaleX(1)}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width:600px){.rows-wrapper{--padding-vertical:1px}}@media only screen and (max-width:420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height:569px){.rows-wrapper{--padding-vertical:1px}}[dir=ltr] .rows-wrapper .bubble-tail{right:-8.4px}[dir=rtl] .rows-wrapper .bubble-tail{left:-8.4px}.rows-wrapper .bubble-tail{fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;transform:scaleX(-1);width:11px}.is-rtl .rows-wrapper .bubble-tail{transform:scaleX(1)}.rows-wrapper .attach-file.menu-open{background-color:var(--light-primary-color)!important}.rows-wrapper .attach-file.menu-open{color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:var(--surface-color);border-radius:1rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .reply-wrapper{margin-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin-left:.625rem;margin-right:.625rem;order:1}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:var(--secondary-text-color)!important}.rows-wrapper .reply-wrapper .reply-subtitle{height:1.125rem}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:3.125rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:3.125rem}.rows-wrapper .reply-wrapper .btn-menu{transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);top:auto}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item{padding-left:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-right:var(--icon-margin)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-left:var(--icon-margin)}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:var(--primary-text-color)}@media only screen and (max-width:600px){[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .input-message-input{max-height:27.5rem!important}.rows-wrapper .input-message-input{margin-top:-1px}@media only screen and (max-height:30rem){.rows-wrapper .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.rows-wrapper .input-message-input{max-height:10rem}}.rows-wrapper .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-left:var(--commands-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-right:var(--commands-margin-left)}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-left:var(--send-as-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-right:var(--send-as-margin-left)}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container{height:var(--send-as-size);width:var(--send-as-size)}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:auto}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:auto}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:calc(var(--padding-horizontal)*-1 - .25rem)!important}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:calc(var(--padding-horizontal)*-1 - .25rem)!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;max-height:20rem;max-width:20rem;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid var(--primary-color);border-radius:inherit;bottom:var(--offset);content:\" \";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{line-height:1!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}[dir=ltr] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-right:var(--translateX)}[dir=rtl] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-left:var(--translateX)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .btn-icon{color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin-bottom:5px;margin-left:var(--button-horizontal-margin);margin-right:var(--button-horizontal-margin);margin-top:0;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:var(--primary-color)}.input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.input-message-container .scrollable{position:relative}.input-message-input{--custom-emoji-size:var(--messages-custom-emoji-size);background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.input-message-input pre{display:inline;margin:0}body.animation-level-2 .input-message-input{transition:height .1s}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:opacity var(--layer-transition),visibility 0s 0s!important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY:calc(var(--chat-input-size)*-1 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles-inner{transition:none!important}@media only screen and (min-width:1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width:600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner:after{content:\" \";height:.125rem}[dir=ltr] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}[dir=rtl] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-right:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - 2.875rem)!important;max-width:calc(100% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner.is-chat .name,.bubbles-inner:not(.is-channel) .message,.bubbles-inner:not(.is-channel) .name{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999!important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY)*-1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width:1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{transform:none!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-mention{--translateY:0;cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention.is-visible{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible}.chat-secondary-button{background-color:var(--surface-color)!important;box-shadow:0 1px 8px 1px rgba(0,0,0,.12)!important}.chat-secondary-button{align-items:center;border-radius:50%;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;position:absolute}body.animation-level-0 .chat-secondary-button{transition:none!important}.chat-secondary-button:before{position:relative}.chat-secondary-button:after{border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}html.no-touch .chat-secondary-button:active:after,html.no-touch .chat-secondary-button:hover:after{background-color:var(--light-secondary-text-color)}[dir=ltr] .bubbles-corner-button{right:var(--chat-input-padding)}[dir=rtl] .bubbles-corner-button{left:var(--chat-input-padding)}.bubbles-corner-button{bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);overflow:visible;z-index:2}[dir=ltr] .bubbles-corner-button .badge{right:-.25rem}[dir=rtl] .bubbles-corner-button .badge{left:-.25rem}.bubbles-corner-button .badge{position:absolute;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){[dir=ltr] .bubbles-corner-button .badge{right:.1875rem}[dir=rtl] .bubbles-corner-button .badge{left:.1875rem}.bubbles-corner-button .badge{top:-.75rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height:var(--topbar-call-height)}@media only screen and (min-width:1276px){body.is-right-column-shown{--topbar-floating-scaleX:calc(1 - var(--right-column-proportion))}}.topbar{cursor:pointer!important;max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important}.topbar{--topbar-height:3.5rem;--pinned-floating-audio-height:0px;--pinned-floating-message-height:0px;--pinned-floating-height:calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height:52px;--pinned-message-height:52px;margin-bottom:var(--pinned-floating-height);position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:\" \";height:calc(var(--topbar-height) + var(--pinned-floating-height));height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height:var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height:var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width:601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width:926px){.chat:first-child .topbar .sidebar-close-button{display:none}[dir=ltr] .chat:first-child .topbar .chat-info{padding-left:.1875rem}[dir=rtl] .chat:first-child .topbar .chat-info{padding-right:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 4.375rem);max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}[dir=ltr] .topbar .chat-info{padding-left:49px}[dir=rtl] .topbar .chat-info{padding-right:49px}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden}@media only screen and (max-width:600px){[dir=ltr] .topbar .chat-info{padding-left:52px}[dir=rtl] .topbar .chat-info{padding-right:52px}}@media only screen and (min-width:1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width:600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}[dir=ltr] .topbar .chat-join{margin-right:.5rem}[dir=rtl] .topbar .chat-join{margin-left:.5rem}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}[dir=ltr] .topbar .content{padding-left:1.125rem}[dir=rtl] .topbar .content{padding-right:1.125rem}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height:0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}[dir=ltr] .chat:not([data-type=chat]) .topbar .content{padding-left:16px}[dir=rtl] .chat:not([data-type=chat]) .topbar .content{padding-right:16px}[dir=ltr] .topbar-call-container{left:1px;right:0}[dir=rtl] .topbar-call-container{left:0;right:1px}.topbar-call-container{cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;min-height:auto!important}.topbar-call-container{color:#fff;position:absolute;top:-3rem;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){[dir=ltr] .topbar-call-container{left:0}[dir=rtl] .topbar-call-container{right:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}[dir=ltr] .topbar-call-left .btn-icon{margin-right:.375rem}[dir=rtl] .topbar-call-left .btn-icon{margin-left:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500;font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width)*-.5),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scaleY(-1);transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}.is-rtl .topbar-call-weave{transform-origin:right center}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubbles-group{position:relative}.bubbles-group-avatar{position:sticky!important}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{--line-height:var(--messages-line-height);display:flex;flex-wrap:wrap;margin:0 auto .125rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:2.375rem;width:var(--message-beside-button-size)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem!important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.0625rem;content:\" \";left:-50%;position:absolute;top:-.0625rem;z-index:-1}.bubble.is-highlighted:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:var(--surface-color);color:var(--primary-color);content:\"Unread messages\";font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.0625rem + 30px)}.bubble.is-selected:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0!important}.bubble-select-checkbox{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:var(--surface-color);background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;user-select:text}.bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(-1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button.goto-original{transform:translateX(-1.125rem) rotate(180deg)}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:var(--surface-color);border-radius:var(--size);bottom:0;box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34,1.56,.64,1),transform .2s cubic-bezier(.34,1.56,.64,1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{font-weight:500;font-weight:var(--font-weight-bold);opacity:.99999;padding-bottom:.375rem;pointer-events:none;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat[data-type=chat] .bubble.is-date .bubble-content,.chat[data-type=discussion] .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{opacity:1!important;transition:none!important;visibility:visible!important}.bubble.is-date.is-fake{left:50%;position:absolute;top:0;transform:translateX(-50%)}.bubble-beside-button{align-items:center;background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:#fff;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);transform:translateX(0);width:2.375rem;width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.bubble-view-button{text-decoration:none!important}.bubble-view-button{align-items:center;border:1px solid var(--message-primary-color);border-radius:6px;color:var(--primary-color);color:var(--message-primary-color);display:flex;height:2rem;justify-content:center;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble-view-button:active,html.no-touch .bubble-view-button:hover{background-color:var(--light-filled-primary-color);background-color:var(--light-filled-message-primary-color)}.bubble-view-button .c-ripple__circle{background-color:var(--primary-color);background-color:var(--message-primary-color);opacity:.08}.message .bubble-view-button{margin:.375rem 0 -.375rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.bubble-view-button+.reactions-block{margin-top:.375rem}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0!important}.bubble.webpage .preview-with-document{min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble .canvas-thumbnail{border-radius:inherit}.bubble .canvas-dots{z-index:1}.bubble.emoji-big{--emoji-size:1rem;font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big .attachment{border-radius:0!important}.bubble.emoji-big .attachment{--custom-emoji-size:var(--emoji-size)}.bubble.emoji-big .attachment img.emoji{height:var(--emoji-size);max-height:64px;max-width:64px;width:var(--emoji-size)}.bubble.emoji-big .attachment .custom-emoji,.bubble.emoji-big .attachment .emoji{display:inline-block}.bubble.emoji-big:not(.sticker) .attachment{max-height:-moz-fit-content!important;max-height:fit-content!important}.bubble.emoji-big:not(.sticker) .attachment{display:block;font-size:var(--emoji-size);padding-bottom:1.25rem;padding-top:.25rem;white-space:pre-wrap;word-break:break-word}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-big:not(.sticker) .bubble-content{max-width:min(420px,100%)}.bubble.just-media .bubble-content{background:none!important}.bubble.just-media .bubble-content{box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:rgba(109,141,65,.4);background:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{position:relative!important;right:0!important}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:280px!important;height:var(--round-video-size)!important;max-height:280px!important;max-height:var(--round-video-size)!important;max-width:280px!important;max-width:var(--round-video-size)!important;width:280px!important;width:var(--round-video-size)!important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;z-index:1}.bubble .media-container-fitted{background-color:transparent!important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none!important}.bubble .album-item .bubble-select-checkbox{bottom:auto!important}.bubble .album-item .bubble-select-checkbox{left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4,0,.2,1),border-radius .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .attachment{pointer-events:none}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;padding:.75rem 1rem .875rem!important}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-size:1rem!important}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem!important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{cursor:pointer;height:200px;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:1.3125;line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .text,.bubble .web .title,.bubble .web .webpage-name{font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:var(--primary-color);border-radius:.125rem;content:\" \";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{--font-size:var(--messages-secondary-text-size)}.bubble .document-name{font-size:16px;font-size:var(--messages-text-size)}.bubble .document-size{font-size:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}.bubble:not(.just-media) .reply{border-radius:6px}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:var(--light-filled-primary-color);background-color:var(--light-filled-message-primary-color)}.bubble.just-media .floating-part{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin:0;max-width:15rem;padding:.375rem .625rem;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .floating-part{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important}.bubble.just-media .name{line-height:1.3125;line-height:var(--line-height);padding:.375rem .625rem}.bubble.just-media .name .peer-title{font-weight:400!important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width:600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{max-width:none!important}.bubble.just-media .reply-content{margin-top:0;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message,.bubble .service-msg{--custom-emoji-size:var(--messages-custom-emoji-size)}.bubble .message{color:var(--primary-text-color);font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message .custom-emoji{display:inline-flex}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{max-width:min(100%,335px)!important}.bubble .message.audio-message{width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important}.bubble .message.audio-message{width:280px}}.bubble .message.voice-message .document-message{max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold)}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px!important}.bubble .message.document-message .document{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:var(--secondary-text-color);display:flex;font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:\"\";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document .time{align-self:flex-start;height:0}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{padding:0!important}.bubble.is-multiple-documents .message{border-radius:inherit}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-2}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:var(--surface-color);background-color:var(--message-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection{animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection{animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit;content:\" \";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.0625rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.0625rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.25rem}.bubble.is-multiple-documents .document{height:54px!important}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document{height:38px!important}}.bubble.is-multiple-documents .document-wrapper{padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .bubble-content-wrapper{width:-moz-min-content;width:min-content}.bubble.is-message-empty .message{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:calc(12px + .375rem);height:calc(var(--messages-time-text-size) + .375rem);margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff!important}.bubble.is-message-empty.with-replies:not(.sticker):not(.with-beside-replies) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):active:after,html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):hover:after{background-color:#fff}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble.with-beside-replies .bubble-content{min-height:5.5rem}.bubble .colored-name .premium-icon{color:inherit;opacity:.6}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;font-size:var(--messages-time-text-size);height:12px;height:var(--messages-time-text-size);line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;color:var(--secondary-text-color);color:var(--message-time-color);display:flex;height:12px;height:var(--messages-time-text-size);line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .inner:after{color:var(--message-status-color)}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble .time.is-block{display:block;float:none}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{--height:calc(var(--messages-time-text-size) + 0.375rem);align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:var(--height);color:#fff;display:flex;font-size:12px;font-size:var(--messages-time-text-size);height:var(--height);left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:\"\";font-size:20px;font-size:calc(var(--messages-time-text-size) + 8px);padding:0 1px 0 3px}[dir=ltr] .bubble .video-time.is-error:after{margin-left:1px}[dir=rtl] .bubble .video-time.is-error:after{margin-right:1px}.bubble .video-time.is-error:after{content:\"\";font-size:16px;font-size:calc(var(--messages-time-text-size) + 4px);padding:0}.bubble .extended-media-buy{align-items:center;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(0,0,0,.3);border-radius:2rem;color:#fff;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;left:50%;padding:0 1rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap;z-index:2}.bubble .extended-media-buy:before{font-size:1.125rem;margin-right:.25rem}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name{color:var(--primary-color);font-size:14px;font-size:var(--messages-secondary-text-size);line-height:calc(14px + .25rem);line-height:calc(var(--messages-secondary-text-size) + .25rem);max-width:100%;overflow:hidden;padding:.375rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo:not(.is-reply) .bubble-content>.name,.bubble:not(.webpage).video:not(.is-reply) .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage).photo .topic-name-button-container,.bubble:not(.webpage).video .topic-name-button-container{margin-bottom:0}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:var(--surface-color);fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);color:var(--primary-color);display:flex;height:3.0625rem;min-width:15rem;padding:0 .5rem;position:relative}html.no-touch .bubble .replies-footer:active,html.no-touch .bubble .replies-footer:hover{background-color:var(--light-primary-color)}html.no-touch .bubble .replies-footer:active~.bubble-tail,html.no-touch .bubble .replies-footer:hover~.bubble-tail{fill:var(--light-filled-primary-color);fill:var(--light-filled-message-primary-color)}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;position:static!important;right:auto!important}.bubble .message .reactions-block .time{order:100}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubble.with-reply-markup .bubble-content{border-bottom-left-radius:6px!important;border-bottom-right-radius:6px!important}.bubble .name-with-reply .name{padding:0!important}.bubble .name-with-reply .name:not(:last-child) .hide-ol{display:none}.bubble .name-with-reply .name:not(:last-child) .peer-title{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name-with-reply .reply{height:auto;margin:.25rem 0 0;max-height:none;padding:0}.bubble .topic-name-button{--color:var(--message-primary-color)}.bubble .name .topic-name-button-container{margin:.25rem -.125rem}.bubble .name .topic-name-button-container:first-child{margin-top:0}.bubble.is-message-empty:not(.is-reply) .name .topic-name-button-container{margin-bottom:0}.bubble:not(.is-group-first) .topic-name-button-container{display:none!important}.bubble .topic-name-button-container.floating-part{font-size:14px;font-size:var(--messages-secondary-text-size);padding-bottom:0;padding-top:0}.bubble .topic-name-button-container.floating-part .topic-name-button{--color:#fff;padding:0}.bubble .topic-name-button-container.floating-part .topic-name-button:before{content:none}.bubble .topic-name-button-container.floating-part+.floating-part{margin-top:1.75rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.0625rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type .document-container:last-of-type .document-selection,.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type:after{bottom:-.0625rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@media only screen and (min-width:601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width:600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:15px;font-size:var(--messages-service-text-size);justify-content:center;line-height:20px;line-height:calc(var(--messages-service-text-size) + 5px);padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title,.bubble.service .service-msg [data-saved-from],.bubble.service .service-msg a{cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold)}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{text-decoration:underline}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0!important}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .floating-part{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .floating-part{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .audio-time,.bubble.is-in .contact-number{color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:var(--danger-color);color:var(--monospace-text-color)}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:active,html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--message-background-color:var(--message-out-background-color);--light-message-background-color:var(--light-message-out-background-color);--dark-message-background-color:var(--dark-message-out-background-color);--link-color:var(--message-out-link-color);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);--selection-background-color:var(--message-out-selection-background-color);--message-time-color:var(--message-out-time-color);--message-status-color:var(--message-out-status-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:var(--message-out-primary-color)}@media only screen and (min-width:1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out .anchor-url{color:var(--primary-color);color:var(--message-primary-color)}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0!important}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .floating-part{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{font-size:19px;font-size:calc(var(--messages-text-size) + 3px);line-height:12px;line-height:var(--messages-time-text-size);margin-left:1px}.bubble.is-out.forwarded .name{color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:\"\"}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:\"\"}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:\"\"}.bubble.is-out.is-error .time .inner:after,.bubble.is-out.is-error .time:after{color:var(--danger-color);color:var(--message-error-color);content:\"\"}.bubble.is-out .document-ico:after{border-right-color:var(--message-background-color);border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:var(--message-out-primary-color);color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{color:var(--message-out-primary-color);color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:var(--message-out-primary-color);color:var(--light-filled-message-out-primary-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color:var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:-2.875rem;left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:var(--surface-color);background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{margin-top:.0625rem;width:100%}.bubble:not(.is-group-last) .reply-markup{margin-bottom:.125rem}.reply-markup-row{display:flex;margin-top:.125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child .reply-markup-button:first-child{border-bottom-left-radius:12px}.reply-markup-row:last-child .reply-markup-button:last-child{border-bottom-right-radius:12px}.reply-markup-button{color:#fff!important}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:.375rem;cursor:pointer;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button-text{pointer-events:none;position:relative}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button+.reply-markup-button{margin-left:.125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:\"\";transform:rotate(-45deg)}.reply-markup-button.is-buy:before{content:\"\"}.reply-markup-button.is-switch-inline:before{content:\"\"}.bubble-beside-button:after,.bubble.just-media .reply:after,.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}html.no-touch .bubble-beside-button:active:after,html.no-touch .bubble-beside-button:hover:after,html.no-touch .bubble.just-media .reply:active:after,html.no-touch .bubble.just-media .reply:hover:after,html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.bubble-primary-color{color:var(--primary-color);color:var(--message-primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.pinned-message{--custom-emoji-size:calc(var(--font-size) + 2px)!important}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:\" \";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{--font-size:var(--font-size-14);--custom-emoji-size:calc(var(--font-size) + 4px);--line-height:calc(var(--font-size) + 4px);align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pinned-message-content,.reply-content{display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;justify-content:center;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;width:2rem!important}.pinned-message-media,.reply-media{left:0;overflow:hidden;position:absolute;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.pinned-message-media>video,.reply-media>img,.reply-media>video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:var(--primary-color);border-radius:1px;height:calc(32px + .25rem);height:calc(var(--font-size)*2 + .25rem);min-width:2px}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0!important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:var(--surface-color)!important;position:absolute!important}.pinned-container.is-floating{height:var(--container-height);left:0;margin:0;max-height:var(--container-height);right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@media only screen and (max-width:600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width:1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height:var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:\"#\"}.pinned-message .animated-counter.is-last:not(.backwards){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat[data-type=discussion] .pinned-message .pinned-container-close{display:none!important}.pinned-audio{--progress-height:.25rem}.pinned-audio.is-floating{--container-height:var(--pinned-audio-height)}.pinned-audio:not(.is-floating){max-width:210px;padding-right:1.75rem;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible!important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0!important}.pinned-audio-ico:before{content:\"\"}.pinned-audio-ico.flip-icon:before{content:\"\"}.pinned-audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-audio-subtitle{color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width:1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:\" \";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),width .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:#dfe1e5;background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important}.markup-tooltip .btn-icon{height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:var(--primary-color)!important;color:#fff!important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:72px;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{background:none}.emoji-helper{padding:.25rem 0!important}.emoji-helper{height:50px}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:after,.emoji-helper .super-emojis:before{content:\" \";display:inline-block;width:.25rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:#dfe1e5;background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{left:.5rem;overflow:hidden;position:absolute}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{height:auto!important;width:auto!important}.inline-helper .gif{bottom:0;left:0;position:absolute;right:0;top:0}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(72px,1fr));grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{position:absolute!important}.chat-search{left:0;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{position:absolute!important;width:auto!important}.drops-container{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:var(--primary-color);animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:var(--primary-color)}.drop+.drop{margin-top:10px}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.bot-commands{animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;padding:var(--offset) var(--offset) 0!important;position:absolute!important;transition:none!important;visibility:visible!important;width:auto!important}.bot-commands{--border-radius-padding:24px;--offset:.5rem;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;pointer-events:none;right:calc(var(--offset)*-1)}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{max-height:207px!important}.bot-commands .scrollable{background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);height:auto;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{border-radius:0!important}.bot-commands-list-element{align-items:flex-start;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:18px;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.crop.is-forum .crop-overlay{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.sidebar-header{align-items:center;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding-left:1rem;padding-right:1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding-left:.5rem;padding-right:.5rem}}[dir=ltr] .sidebar-header__title{padding-left:1.5rem}[dir=rtl] .sidebar-header__title{padding-right:1.5rem}.sidebar-header__title{color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}[dir=ltr] .sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}[dir=rtl] .sidebar-header .btn-icon+.btn-icon{margin-right:.5rem}.sidebar-header-right{flex:0 0 auto}.scrollable-y-bordered .sidebar-header{position:relative}.scrollable-y-bordered .sidebar-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:\" \";height:1px;left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .scrollable-y-bordered .sidebar-header:after{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.scrollable-y-bordered:not(.scrolled-top) .sidebar-header:after{opacity:1}.sidebar-close-button{overflow:inherit!important}.sidebar-close-button{flex:0 0 auto;height:2.5rem;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0!important}.profile-avatars-avatars{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:\" \";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}[dir=ltr] .profile-avatars-info{left:1.5rem}[dir=rtl] .profile-avatars-info{right:1.5rem}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;pointer-events:none;position:absolute}[dir=ltr] .profile-avatars-info .profile-name,[dir=ltr] .profile-avatars-info .profile-subtitle{text-align:left}[dir=rtl] .profile-avatars-info .profile-name,[dir=rtl] .profile-avatars-info .profile-subtitle{text-align:right}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .premium-icon{color:#fff}.profile-avatars-info .verified-icon-background{fill:#fff}.profile-avatars-info .verified-icon-check{visibility:hidden}.profile-avatars-info .premium-icon,.profile-avatars-info .profile-subtitle,.profile-avatars-info .verified-icon{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}[dir=ltr] .profile-change-avatar{right:1.25rem}[dir=rtl] .profile-change-avatar{left:1.25rem}.profile-change-avatar{position:absolute!important;transition:none!important}.profile-change-avatar{--size:3.375rem;top:calc(var(--size)/-2);transform:none}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:var(--primary-text-color);display:flex;font-size:20px;font-size:var(--font-size-20);font-weight:500;font-weight:var(--font-weight-bold);line-height:26px;line-height:var(--line-height-20);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{align-items:center;color:var(--secondary-text-color);display:flex;font-size:.875rem;justify-content:center;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;content:\" \";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3rem);--padding-horizontal:0px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:\" \";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px 10px 0 0}.menu-horizontal-div-item{transition:none!important}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:1.3125;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:-.8125rem;box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:#f4f4f5;background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none!important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4,0,.2,1),filter .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;min-width:min(100%,18rem)}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}[dir=ltr] #column-left:after{right:-1px}[dir=rtl] #column-left:after{left:-1px}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:\" \";display:block;height:100vh;position:absolute;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:26.5rem}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width:926px){#column-left{display:flex}}@media only screen and (max-width:1275px){#column-left{flex:2}}@media only screen and (min-width:1681px){html.is-safari #column-left{max-width:418.75px}}#column-left .item-main .menu-horizontal-scrollable{background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .item-main .menu-horizontal-scrollable .scrollable{position:relative}[dir=ltr] #column-left .item-main .menu-horizontal-scrollable .badge{margin-left:5px}[dir=rtl] #column-left .item-main .menu-horizontal-scrollable .badge{margin-right:5px}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--scrollable-size));position:relative}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .item-main .menu-horizontal-div{position:relative!important}#column-left .item-main .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;z-index:0}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .item-main .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .item-main .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main{--offset-top:0;background-color:var(--surface-color)}[dir=ltr] #column-left .item-main .input-search .selector-user{left:6px}[dir=rtl] #column-left .item-main .input-search .selector-user{right:6px}[dir=ltr] #column-left .item-main .input-search .selector-user{margin-left:0}[dir=rtl] #column-left .item-main .input-search .selector-user{margin-right:0}#column-left .item-main .input-search .selector-user{position:absolute!important}#column-left .item-main .input-search .selector-user{height:30px;line-height:1.875rem;top:6px;z-index:1}[dir=ltr] #column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}[dir=rtl] #column-left .item-main .input-search.is-picked .input-search-input{padding-right:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block!important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}[dir=ltr] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}[dir=rtl] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{right:38px}[dir=ltr] #column-left .item-main .search-helper{margin-left:28px}[dir=rtl] #column-left .item-main .search-helper{margin-right:28px}#column-left .item-main .search-helper{display:flex}@media only screen and (max-width:600px){[dir=ltr] #column-left .item-main .search-helper{margin-left:20px}[dir=rtl] #column-left .item-main .search-helper{margin-right:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none!important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{position:relative!important}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto!important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%,-50%)}#column-left #chatlist-container{background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:4}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width:600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);min-width:260px}[dir=ltr] #column-left .sidebar-tools-button .btn-menu-item{padding-right:.375rem}[dir=rtl] #column-left .sidebar-tools-button .btn-menu-item{padding-left:.375rem}[dir=ltr] #column-left .archived-count{margin-left:.625rem}[dir=rtl] #column-left .archived-count{margin-right:.625rem}#column-left .archived-count{justify-self:flex-end}html[dir=ltr].is-mobile #column-left .archived-count{margin-right:.375rem}html[dir=rtl].is-mobile #column-left .archived-count{margin-left:.375rem}@media only screen and (max-width:600px){#column-left .archived-count{font-weight:500;font-weight:var(--font-weight-bold)}}#column-left .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding:0 0 1px}#column-left .search-group-people .chatlist:after,#column-left .search-group-people .chatlist:before{content:\" \";display:inline-block;flex:0 0 auto;width:.3125rem}#column-left .search-group-people .chatlist-chat{padding:0!important}#column-left .search-group-people .chatlist-chat{align-items:center;display:flex;flex:0 0 auto;flex-direction:column;height:6.125rem;justify-content:flex-end;max-width:4.875rem;width:4.875rem}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .dialog-title{max-width:65px;padding-bottom:.75rem}#column-left .search-group-people .dialog-title .user-title{font-size:.75rem!important}#column-left .search-group-people .dialog-title .peer-title{font-weight:400!important;font-weight:var(--font-weight-normal)!important}[dir=ltr] #column-left .search-group-people .dialog-avatar{left:auto!important}[dir=rtl] #column-left .search-group-people .dialog-avatar{right:auto!important}#column-left .search-group-people .dialog-avatar{top:.75rem!important}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){[dir=ltr] #column-left .search-group-people .search-group-scrollable{margin-left:-7px}[dir=rtl] #column-left .search-group-people .search-group-scrollable{margin-right:-7px}#column-left .search-group-people .search-group-scrollable{margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{position:fixed!important}#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}[dir=ltr] #column-left .connection-status-button{padding-left:4.5rem}[dir=rtl] #column-left .connection-status-button{padding-right:4.5rem}[dir=ltr] #column-left .connection-status-button{text-align:left}[dir=rtl] #column-left .connection-status-button{text-align:right}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}[dir=ltr] #column-left .connection-status-button .preloader-container{left:1rem}[dir=rtl] #column-left .connection-status-button .preloader-container{right:1rem}#column-left .connection-status-button .preloader-container{height:1.5rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{width:100%}}#search-container{top:var(--offset-top)!important}#search-container{display:flex}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{margin-left:23px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{margin-right:23px}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{padding-right:24px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{padding-left:24px}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:var(--secondary-text-color);font-size:.875rem;margin-top:14px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{height:15rem;padding-bottom:0}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:0 auto;max-width:20rem;text-align:center}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-categories .checkbox-field{right:1.125rem!important}.folder-categories .checkbox-field{position:absolute}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}[dir=ltr] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}[dir=rtl] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-right:26px}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width:600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width:601px){.search-group-recent.search-group.search-group-contacts{padding:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0!important}.sidebar-left-section.with-fake-delimiter{box-shadow:none}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@media only screen and (max-width:600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width:601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}[dir=ltr] .sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}[dir=rtl] .sidebar-left-section-content>.checkbox-field .checkbox-box{right:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-content>.media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:var(--secondary-text-color);font-size:1rem;line-height:1.3125;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none!important}.sidebar-left-section-disabled{opacity:.25}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:var(--primary-color);font-size:16px;font-weight:500;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:var(--surface-color)!important}.two-step-verification .sidebar-left-section{box-shadow:none!important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem!important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{right:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width:601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row-title:first-child{font-weight:500;font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:var(--secondary-text-color);font-size:12px;font-size:var(--font-size-12);line-height:16px;line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (min-width:601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:var(--primary-text-color)}.range-setting-selector-value{color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height:2px;--color:var(--primary-color);--border-radius:4px;--thumb-size:12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:var(--primary-color)}.background-container .background-item:after{border:3px solid var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .background-item.active:after{opacity:1}.background-container .background-item.active .grid-item-media{transform:scale(.91)}.background-container .background-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .background .preloader-container{z-index:1}.background-item{cursor:pointer}.background-item-media{border-radius:inherit}.background-item-media.is-pattern{background-color:#000;bottom:0;left:0;position:absolute;right:0;top:0}.background-item-media.is-pattern .media-photo{mix-blend-mode:soft-light}.background-item .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-colors-canvas{border-radius:inherit;height:100%;-webkit-mask-position:center;-webkit-mask-size:cover;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{width:21rem!important}.empty-placeholder{line-height:1.3125;line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;user-select:none}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}[dir=ltr] .empty-placeholder .btn-control:before{margin-right:.625rem}[dir=rtl] .empty-placeholder .btn-control:before{margin-left:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}.is-forum-visible .can-have-forum .input-search,.is-forum-visible .can-have-forum .row-row,.is-forum-visible .can-have-forum .sidebar-header__title{opacity:0}.is-forum-visible .folders-tabs-scrollable{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none}.is-forum-visible.backwards .can-have-forum .input-search,.is-forum-visible.backwards .can-have-forum .row-row,.is-forum-visible.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.backwards .folders-tabs-scrollable{opacity:1}.is-forum-visible.animating .can-have-forum .input-search,.is-forum-visible.animating .can-have-forum .row-row,.is-forum-visible.animating .can-have-forum .sidebar-header__title,.is-forum-visible.animating .folders-tabs-scrollable{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.is-forum-visible.animating.backwards .can-have-forum .input-search,.is-forum-visible.animating.backwards .can-have-forum .row-row,.is-forum-visible.animating.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.animating.backwards .folders-tabs-scrollable{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}#column-right{overflow:visible;overflow:initial;position:relative}@media only screen and (min-width:601px)and (max-width:1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width:600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw,0,0)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}@media only screen and (min-width:601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}}#column-right #search-private-container .chatlist-container{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{margin:.75rem 0;max-width:100%;padding:0 .75rem;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(100vh - 56px);min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .search-super-tabs{--padding-horizontal:0}.shared-media-container .search-super-tabs .menu-horizontal-div-item{border-radius:0!important}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:\"\"}@media only screen and (max-width:600px){.shared-media-container .btn-corner{position:fixed!important}.shared-media-container .btn-corner{bottom:14px;height:54px;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{flex:1 1 auto;width:auto}.search-super-tabs-scrollable{box-shadow:none!important;position:sticky!important}.search-super-tabs-scrollable{background-color:var(--surface-color);top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:\" \";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:var(--surface-color)!important}.search-super-tabs-container>div{min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.search-super-tabs-container .preloader{position:absolute!important}.search-super-tabs-container .preloader{padding:0;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:2}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute!important}.search-super .checkbox-field{margin:0;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width:600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:\" \";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{--offset-left:0!important;margin:2rem 0 0 -1.75rem!important;padding:0!important}@media only screen and (min-width:601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width:600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 20px}@media only screen and (max-width:600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;margin-bottom:1.5rem}@media only screen and (min-width:601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-bottom:.5rem;padding-top:.5rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent!important}.search-super-selection-container{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width:600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short .chatlist-chat:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:500;font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{margin:0 .5rem;width:auto}@media only screen and (max-width:600px){#poll-results-container .poll-results-more{border-radius:0;margin:0}}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{display:block!important}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem!important}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem!important}.edit-contact-container .avatar-placeholder{filter:none!important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem!important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem!important}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@media only screen and (max-width:600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width:600px){.media-viewer-userpic{display:none}}.media-viewer-name{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:1.3125;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9!important}.media-viewer-caption .scrollable{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width:600px){.media-viewer-caption{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0,-69px,0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{opacity:1!important}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{background-color:#000}}.media-viewer-caption.is-focused{opacity:1!important}.media-viewer-caption.is-focused{background-color:#000}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width:600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width:601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{min-height:auto!important;position:fixed!important}.media-viewer-mover{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;overflow:hidden;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover .canvas-thumbnail,.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration)/8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none!important}.media-viewer-mover.center{left:50%!important;top:50%!important;transform:translate3d(-50%,-50%,0)!important}.media-viewer-mover.center{max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-width:100vw!important;width:100%!important}.media-viewer-mover.center{max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center .canvas-thumbnail,.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding .canvas-thumbnail,.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{position:fixed!important}.media-viewer-whole{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width:600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important}.media-viewer-whole.hide-caption .media-viewer-caption{pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards .canvas-thumbnail,.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:\"\"}.tgico-zoom.zoom-in:before{content:\"\"}.zoom-container{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0!important}.zoom-container.is-visible~.media-viewer-caption{pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{position:fixed!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(100vh - 135px));height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{position:absolute!important;width:23.875rem!important}.emoji-dropdown{-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(var(--surface-color-rgb),.85);background-color:var(--menu-background-color);border-radius:1.25rem;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;transform:scale(0);transform-origin:0 100%;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs:after{content:none}.emoji-dropdown .emoji-tabs-search{margin-left:.5rem!important}.emoji-dropdown .emoji-tabs-search{left:0;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 .75rem}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .stickers-padding .category-items{gap:.25rem;padding:0 .1875rem}.emoji-dropdown #content-gifs .scrollable-y{padding:0 .1875rem}.emoji-dropdown .gifs-masonry{border-radius:10px;overflow:hidden}.emoticons-container{background-color:transparent;flex-direction:column;height:100%;min-height:100%}.emoticons-menu{--item-size:1.875rem;align-items:center;min-height:3.0625rem;padding:0 .3125rem;width:100%;z-index:4}.emoticons-menu,.emoticons-menu-wrapper{background-color:transparent;height:3.0625rem}.emoticons-menu-wrapper{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);max-width:100%;padding:0;position:relative}.emoticons-menu:after{content:\" \";display:block;flex:0 0 auto;height:1px;width:.1875rem}.emoticons-menu .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:var(--item-size);line-height:var(--item-size);margin:0 .3125rem;padding:0;width:var(--item-size)}.emoticons-menu .menu-horizontal-div-item.not-local{border-radius:.25rem!important}.emoticons-menu .menu-horizontal-div-item.not-local{--item-size:2.375rem;padding:.25rem}.emoticons-menu .menu-horizontal-div-item.active{background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-div-item.active,html.no-touch .emoticons-menu .menu-horizontal-div-item:active,html.no-touch .emoticons-menu .menu-horizontal-div-item:hover{color:rgba(var(--primary-text-color-rgb),.8)!important}.emoticons-menu .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoticons-menu .menu-horizontal-div-item.active:not(.tgico){background-color:var(--light-secondary-text-color)}.emoticons-menu .menu-horizontal-inner{border-radius:15px;flex:0 0 auto;margin:0 .3125rem;overflow:hidden;width:1.875rem}html.is-safari .emoticons-menu .menu-horizontal-inner{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner{transition:width .2s ease-in-out}.emoticons-menu .menu-horizontal-inner-scroll{align-items:center;display:flex;height:100%;position:relative;width:8.5rem}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{margin:0!important}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transform:scale(1)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transition:transform .2s ease-in-out!important}.emoticons-menu .menu-horizontal-inner.active{background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-inner.active{width:8.5rem}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item{transform:scale(.8)}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item.active{background-color:transparent!important}.emoticons-menu .menu-horizontal-inner:not(.active){cursor:pointer}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-inner-scroll{pointer-events:none}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-div-item:first-child{pointer-events:all}.emoticons-content{flex:1;padding:0;position:relative}.emoticons-content .emoji-category{position:relative}.emoticons-content .sticky_sentinel--top{height:1px;top:0}.emoticons-content .category-title{color:rgba(var(--primary-text-color-rgb),.42);cursor:pointer;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:1.1875rem;padding:.75rem .875rem .375rem;position:relative;text-align:center;width:100%}.emoticons-content .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoticons-content:not(.has-premium) .is-premium-set .category-title:before{content:\"\";line-height:inherit;margin-right:.125rem;vertical-align:middle}.emoji-padding .super-emojis{padding:0 .5rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:rgba(0,0,0,.2) transparent;scrollbar-color:var(--scrollbar-color) transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:rgba(0,0,0,.2);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable.scrollable-y.scrollable-y-bordered{border-bottom:1px solid transparent;border-top:1px solid transparent}body.animation-level-2 .scrollable.scrollable-y.scrollable-y-bordered{transition:border-top-color .3s cubic-bezier(.4,0,.2,1),border-bottom-color .3s cubic-bezier(.4,0,.2,1);transition:border-top-color var(--transition-standard-in),border-bottom-color var(--transition-standard-in)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-top){border-top-color:#dfe1e5;border-top-color:var(--border-color)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-bottom){border-bottom-color:#dfe1e5;border-bottom-color:var(--border-color)}.scrollable-padding{height:100%;min-width:100%}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important}.selector .selector-search-section{position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding-left:1rem;padding-right:1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}[dir=ltr] .selector-user{padding-right:17px}[dir=rtl] .selector-user{padding-left:17px}[dir=ltr] .selector-user{margin-left:-.25rem;margin-right:.75rem}[dir=rtl] .selector-user{margin-left:.75rem;margin-right:-.25rem}.selector-user{background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;max-width:11.25rem;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{animation:scaleIn .1s ease forwards;animation-direction:reverse}[dir=ltr] .selector-user-avatar{margin-right:8px}[dir=rtl] .selector-user-avatar{margin-left:8px}.selector-user-avatar{border-radius:50%!important}.selector-user-avatar{float:left;overflow:hidden;position:relative}.is-rtl .selector-user-avatar{float:right}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}[dir=ltr] .selector-user-avatar:after{left:0}[dir=rtl] .selector-user-avatar:after{right:0}.selector-user-avatar:after{line-height:32px!important}.selector-user-avatar:after{background-color:var(--danger-color);content:\"\";font-size:23px;height:100%;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector>hr{margin:0;padding:0}[dir=ltr] .selector .checkbox{padding-left:11px}[dir=rtl] .selector .checkbox{padding-right:11px}.selector .checkbox{margin-top:11px}.selector .checkbox-field{--offset-left:0!important;margin:0!important;padding:0!important;position:absolute!important}.selector .checkbox-field{pointer-events:none;top:50%;transform:translateY(-50%);z-index:1}[dir=ltr] .selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}[dir=rtl] .selector .checkbox-field:first-child{margin-left:1.6875rem;margin-right:.6875rem}[dir=ltr] .selector .checkbox-field-round{right:1.125rem}[dir=rtl] .selector .checkbox-field-round{left:1.125rem}.selector .checkbox-field-round{--size:1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}[dir=ltr] .selector-square .checkbox-field{left:1.25rem!important}[dir=rtl] .selector-square .checkbox-field{right:1.25rem!important}[dir=ltr] .selector-square .chatlist-chat.row-with-padding{padding-left:7.5rem!important}[dir=rtl] .selector-square .chatlist-chat.row-with-padding{padding-right:7.5rem!important}[dir=ltr] .selector-square .dialog-avatar{margin-left:3rem!important}[dir=rtl] .selector-square .dialog-avatar{margin-right:3rem!important}.gifs-masonry{grid-gap:.125rem;display:grid;gap:.125rem;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr)}.gifs-masonry .gif img,.gifs-masonry .gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry .gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color:#fff}.preloader-container .you-spin-me-round{height:100%;width:100%}.preloader-container .preloader-circular{animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{animation:rotate 1s linear infinite!important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer!important}.preloader-container.preloader-streamable circle{stroke-width:2.5!important}.preloader-container.preloader-streamable:after{background-color:var(--color);border-radius:.125rem;content:\"\";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@keyframes rotate{to{transform:rotate(1turn)}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{animation:ripple-effect .7s forwards;background-color:rgba(0,0,0,.08);background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.c-ripple{--ripple-duration:.4s}.c-ripple__circle{animation-duration:.4s;animation-name:ripple-effect-handhelds;transition-duration:.3s}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}.avatar-like{line-height:var(--size)!important}.avatar-like{--size:54px;--multiplier:1;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--size)}avatar-element{--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%}avatar-element[data-color=red]{--color-top:var(--peer-avatar-red-top);--color-bottom:var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top:var(--peer-avatar-orange-top);--color-bottom:var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top:var(--peer-avatar-violet-top);--color-bottom:var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top:var(--peer-avatar-green-top);--color-bottom:var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top:var(--peer-avatar-cyan-top);--color-bottom:var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top:var(--peer-avatar-pink-top);--color-bottom:var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top:var(--peer-avatar-blue-top);--color-bottom:var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px/var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px/var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(30px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount{--color-top:var(--peer-avatar-archive-top);--color-bottom:var(--peer-avatar-archive-bottom);overflow:hidden}avatar-element.tgico-deletedaccount:before{font-size:calc(30px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;height:var(--size)!important;width:var(--size)!important}avatar-element img{display:block}avatar-element img.fade-in{animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}avatar-element.is-topic{background:none;border-radius:0;position:relative}avatar-element.is-topic .topic-icon{--size:inherit}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid var(--surface-color);border-radius:50%;content:\" \";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size:120px;--multiplier:.45}avatar-element.avatar-100{--size:100px;--multiplier:.54}avatar-element.avatar-48{--size:48px;--multiplier:1.125}avatar-element.avatar-46{--size:46px;--multiplier:1.173913}avatar-element.avatar-44{--size:44px;--multiplier:1.227272}avatar-element.avatar-42{--size:42px;--multiplier:1.285714}avatar-element.avatar-40{--size:40px;--multiplier:1.35}avatar-element.avatar-36{--size:36px;--multiplier:1.5}avatar-element.avatar-35{--size:35px;--multiplier:1.542857}avatar-element.avatar-34{--size:34px;--multiplier:1.588235}avatar-element.avatar-32{--size:32px;--multiplier:1.6875}avatar-element.avatar-30{--size:30px;--multiplier:1.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;width:100%!important}.avatar-full .avatar-photo{-o-object-fit:cover;object-fit:cover}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}html.is-safari .document-ico{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.document-ico-text{opacity:0}body.animation-level-2 .document-ico-text{transition:opacity .2s ease-in-out}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:var(--message-background-color);border-style:solid;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:\"\";display:block;position:absolute;right:0;top:0}body.animation-level-2 .document-ico:after{transition:border-width .2s ease-in-out}html.no-touch .document:not(.downloaded):active .document-ico:after,html.no-touch .document:not(.downloaded):hover .document-ico:after{border-width:0}html.no-touch .document:not(.downloaded):active .document-ico-text,html.no-touch .document:not(.downloaded):hover .document-ico-text{opacity:0}html.no-touch .document:not(.downloaded):active .preloader-container,html.no-touch .document:not(.downloaded):hover .preloader-container{opacity:1!important}.document:not(.downloading) .document-ico-text{opacity:1}.document:not(.downloading) .preloader-container{opacity:0!important}.document.downloading .document-ico:after{border-width:0}.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name,.document-size{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document.ext-zip{--background-color:#fb8c00}.document.ext-pdf{--background-color:#df3f40}.document.ext-apk{--background-color:#43a047}.document.document-with-thumb{--background-color:#fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.2);border-radius:.375rem}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3)!important}.document-thumb{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16);white-space:nowrap}.document-size{color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);pointer-events:none;position:relative}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}[dir=ltr] .audio,[dir=ltr] .document{padding-left:var(--padding-left)}[dir=rtl] .audio,[dir=rtl] .document{padding-right:var(--padding-left)}.audio,.document{--padding:0px;--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin) + var(--padding));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none}[dir=ltr] .audio-download,[dir=ltr] .audio-ico,[dir=ltr] .document-download,[dir=ltr] .document-ico{margin-left:calc((var(--padding-left) - var(--padding))*-1)}[dir=rtl] .audio-download,[dir=rtl] .audio-ico,[dir=rtl] .document-download,[dir=rtl] .document-ico{margin-right:calc((var(--padding-left) - var(--padding))*-1)}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent!important}.audio .preloader-container:not(.preloader-streamable){height:100%;width:100%}.audio{overflow:visible!important}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size)}.audio-download,.audio-toggle{align-items:center;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{display:flex!important;margin:0!important}.audio.corner-download .audio-download{background:none;height:1.375rem;left:57.5%;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out,-webkit-clip-path .25s ease-in-out}@media only screen and (min-width:601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width:600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width:601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width:600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:\" • \"}.audio-subtitle,.audio-time{color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height:2px;--border-radius:4px;--thumb-size:.75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{background-color:transparent;opacity:1;z-index:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff!important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}[dir=ltr] .quiz-hint .container{text-align:left}[dir=rtl] .quiz-hint .container{text-align:right}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:\"\";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{animation-duration:.6s;animation-iteration-count:infinite;animation-name:dotMiddle;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{animation-name:dotFirst}.peer-typing-text-dot:last-child{animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{cursor:pointer;display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}[dir=ltr] poll-element .poll-answer-percents{text-align:right}[dir=rtl] poll-element .poll-answer-percents{text-align:left}poll-element .poll-answer-percents{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:500;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:\"\";font-weight:500;font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important}poll-element .poll-footer-button{color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:500;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:\"\";font-size:12px}poll-element .circle-hover{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{display:flex!important}poll-element .circle-hover .poll-answer-selected{animation:none;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:var(--light-primary-color)}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{animation-fill-mode:forwards!important}.transition>.transition-item{height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.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.slide-fade{--easeOutSine:cubic-bezier(.39,.575,.565,1);--easeInSine:cubic-bezier(.47,0,.745,.715);position:relative}.transition.slide-fade>.from{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@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-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)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.4375rem 1rem;position:relative}.row.no-subtitle,.row.row-small{min-height:3rem;padding-bottom:.1875rem;padding-top:.1875rem}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{pointer-events:none!important}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity)}.row.no-wrap{padding-bottom:0!important;padding-top:0!important}.row a{pointer-events:all;position:relative;z-index:1}.row-title-row,.row>.row-title{order:0}[dir=ltr] .row-big{padding-left:1rem;padding-right:.75rem}[dir=rtl] .row-big{padding-left:.75rem;padding-right:1rem}.row-big{min-height:4.5rem;padding-bottom:.5625rem;padding-top:.5625rem}.row-row{align-items:center;display:flex;justify-content:space-between}.row-row .row-subtitle,.row-row .row-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-subtitle-row,.row>.row-subtitle{order:1}.row-title{color:var(--primary-text-color);font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;word-break:break-word}.row-title-right-secondary{color:var(--secondary-text-color)}[dir=ltr] .row-subtitle-right,[dir=ltr] .row-title-right{margin-left:1rem}[dir=rtl] .row-subtitle-right,[dir=rtl] .row-title-right{margin-right:1rem}.row-subtitle-right,.row-title-right{flex:0 0 auto!important}.row-midtitle,.row-subtitle,.row-title{pointer-events:none;position:relative}.row-midtitle{font-size:14px;font-size:var(--font-size-14);margin-top:.125rem;order:1}[dir=ltr] .row-with-padding{padding-left:4.5rem}[dir=rtl] .row-with-padding{padding-right:4.5rem}@media only screen and (max-width:600px){[dir=ltr] .row-with-padding{padding-left:4rem}[dir=rtl] .row-with-padding{padding-right:4rem}}[dir=ltr] .row-with-padding.tgico:before{left:1rem}[dir=rtl] .row-with-padding.tgico:before{right:1rem}.row-with-padding.tgico:before{color:var(--secondary-text-color);font-size:1.5rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);z-index:1}.row-with-padding:not(.row-with-icon):before{display:none}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}[dir=ltr] .row-sortable .row-subtitle,[dir=ltr] .row-sortable .row-title{padding-right:2.5rem}[dir=rtl] .row-sortable .row-subtitle,[dir=rtl] .row-sortable .row-title{padding-left:2.5rem}[dir=ltr] .row-sortable-icon{right:.75rem}[dir=rtl] .row-sortable-icon{left:.75rem}.row-sortable-icon{color:var(--secondary-text-color);font-size:1.5rem;height:1.5rem;line-height:1;opacity:0;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.row-sortable.cant-sort .row-sortable-icon{display:none}.row-sortable.is-dragging{background-color:var(--surface-color)!important}.row-sortable.is-dragging{z-index:1}html.no-touch .row-sortable.is-dragging:active,html.no-touch .row-sortable.is-dragging:hover{background-color:var(--light-filled-secondary-text-color)!important}html.no-touch .row-sortable:active .row-sortable-icon,html.no-touch .row-sortable:hover .row-sortable-icon{opacity:1}body.animation-level-2 .is-reordering .row-sortable{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{padding-left:3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{padding-right:3.375rem}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{margin-left:-3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{margin-right:-3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field:not(.radio-field-right) .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .radio-field{margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field{margin-right:0}[dir=rtl] .row .checkbox-field{margin-left:0}.row .checkbox-field{height:auto;margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field .checkbox-caption{padding-left:0}[dir=rtl] .row .checkbox-field .checkbox-caption{padding-right:0}.row .checkbox-field .checkbox-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row .checkbox-field-toggle{margin-left:.125rem;margin-right:.125rem;padding:0}.row-subtitle{color:var(--secondary-text-color)!important;font-size:14px!important;font-size:var(--font-size-14)!important}.row-subtitle{line-height:18px;line-height:var(--line-height-14);margin-top:.1875rem}.row-subtitle:empty{display:none}[dir=ltr] .row-media{left:.75rem}[dir=rtl] .row-media{right:.75rem}.row-media{height:2.25rem!important;margin:0!important;position:absolute!important;width:2.25rem!important}.row-media{align-items:center;display:flex;justify-content:center;pointer-events:none}[dir=ltr] .row-media-small{left:.75rem!important}[dir=rtl] .row-media-small{right:.75rem!important}.row-media-small{height:2rem!important;width:2rem!important}[dir=ltr] .row-media-abitbigger{left:.75rem!important}[dir=rtl] .row-media-abitbigger{right:.75rem!important}.row-media-abitbigger{height:2.625rem!important;width:2.625rem!important}[dir=ltr] .row-media-big{left:.5rem!important}[dir=rtl] .row-media-big{right:.5rem!important}.row-media-big{height:3rem!important;width:3rem!important}[dir=ltr] .row-media-bigger{left:.5625rem!important}[dir=rtl] .row-media-bigger{right:.5625rem!important}.row-media-bigger{height:3.375rem!important;width:3.375rem!important}.row.menu-open{background-color:var(--light-secondary-text-color)}[dir=ltr] .row>.btn-primary{right:1rem}[dir=rtl] .row>.btn-primary{left:1rem}.row>.btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding-left:.75rem;padding-right:.75rem;position:absolute;top:50%;transform:translateY(-50%);width:auto}body.animation-level-2 .row>.btn-primary{transition:width .2s,background-color .2s,color .2s}.row>.btn-primary.active{background-color:var(--light-primary-color)!important}.row>.btn-primary.active{color:var(--primary-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:380px}@media only screen and (max-width:600px){.color-picker{padding:0 .75rem}}.color-picker-box{height:198px;width:100%}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible!important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{display:flex!important;padding:0!important;position:absolute!important;width:26.25rem!important}.reply-keyboard{background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);flex-direction:column;max-height:26.25rem;max-width:100%;opacity:0;overflow:hidden;right:0;transform:scale(0);transform-origin:bottom right;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}@media only screen and (max-height:569px),only screen and (max-width:600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{background-color:transparent;border:2px solid var(--primary-color);border-radius:.375rem;color:var(--primary-color);font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.reply-keyboard .scrollable-y{padding:.625rem!important}.reply-keyboard .scrollable-y{bottom:auto;height:auto;left:auto;max-height:100%;position:relative;right:auto;top:auto}.peoplenearby-container div.text.nearby-description{color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:#aaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:#3d9de0;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{animation:waves-animation 3s infinite;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{animation:waves-animation 5s infinite;animation-delay:2s;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:71px;margin-left:51px;margin-top:1px;width:66px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px!important}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{transform:rotateY(180deg)}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}.spoilers-container .custom-emoji-canvas{z-index:-1}.spoilers-container.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.spoilers-container.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim)}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler-text{opacity:1}.spoilers-container:not(.is-spoiler-visible) .spoiler{cursor:pointer}.spoilers-container:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation,.emoji-animation-container{pointer-events:none;position:absolute}.emoji-animation-container{bottom:0;left:0;overflow:hidden;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{--custom-emoji-size:var(--reaction-size);height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{height:var(--size)!important;width:var(--size)!important}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto}.reaction-sticker.is-custom{border-radius:.3125rem}.reaction-sticker.is-custom .custom-emoji,.reaction-sticker.is-custom .media-sticker{border-radius:inherit}.reaction-sticker.is-custom .custom-emoji-canvas{z-index:auto}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important}.reaction-inline .reaction-counter{order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:#f4f4f5;background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}html.no-touch .reaction-block:active:after,html.no-touch .reaction-block:hover:after{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:.08;position:absolute;right:0;top:0}.reaction-block .reaction-counter,.reaction-block .reaction-sticker{z-index:1}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale(0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scale(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4,0,.2,1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4,0,.2,1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important}.reaction-block .reaction-counter{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.sticker-viewer{align-items:center;bottom:0;display:flex;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:4}.sticker-viewer:before{background-color:rgba(0,0,0,.6);bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .sticker-viewer:before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.sticker-viewer.is-visible:not(.backwards):before{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards):before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .emoji-animation,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .emoji-animation,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker:not(.is-overflow){transition:opacity 0s}.sticker-viewer-transformer{--translateX:0;align-items:center;display:flex;height:360px;justify-content:center;position:absolute;width:360px}.sticker-viewer-transformer.has-effect{height:280px;width:280px}.sticker-viewer-transformer.has-effect .sticker-viewer-emoji{top:-5.5rem}body.animation-level-2 .sticker-viewer-transformer{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-out)}.sticker-viewer-transformer.is-switching{opacity:1!important;transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer-transformer.is-switching{transition:transform .2s cubic-bezier(.12,1.1,.56,1.2),opacity .2s cubic-bezier(.12,1.1,.56,1.2)!important;transition:transform var(--sticker-viewer-switch-transition),opacity var(--sticker-viewer-switch-transition)!important}.sticker-viewer-transformer.is-switching:not(.backwards){opacity:0!important;transform:scale(.4) translateX(var(--translateX))!important}.sticker-viewer-emoji{position:absolute;top:-3rem;transform:translateX(var(--translateX)) scale(2)}.sticker-viewer-sticker{position:absolute}.sticker-viewer .emoji-animation,.sticker-viewer-emoji,.sticker-viewer-sticker{opacity:0}body.animation-level-2 .sticker-viewer .emoji-animation,body.animation-level-2 .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.custom-emoji{height:1.25rem!important;height:var(--custom-emoji-size)!important;min-height:1.25rem!important;min-height:var(--custom-emoji-size)!important;min-width:1.25rem!important;min-width:var(--custom-emoji-size)!important;width:1.25rem!important;width:var(--custom-emoji-size)!important}.custom-emoji{display:inline;position:relative}.custom-emoji:before{content:\" \";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.custom-emoji .media-sticker,.custom-emoji .rlottie{height:inherit!important;max-height:inherit!important;max-width:inherit!important;width:inherit!important}.custom-emoji .media-sticker,.custom-emoji .rlottie{margin:0;pointer-events:none;text-indent:-9999px}.custom-emoji-canvas{height:100%;width:100%}.custom-emoji-canvas,.custom-emoji-renderer{bottom:0;left:0;position:absolute;right:0;top:0}.custom-emoji-renderer{pointer-events:none}.custom-emoji-placeholder{display:inline;height:20px;height:var(--messages-custom-emoji-size);margin-top:-.125rem;vertical-align:middle;width:20px;width:var(--messages-custom-emoji-size)}.usernames-username-icon{background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:50%;color:#fff;font-size:1.25rem}.usernames-username-icon:before{content:\"\"}.usernames-username.active .usernames-username-status{color:var(--primary-color)!important}.usernames-username.active .usernames-username-icon{background-color:var(--primary-color)}.topics-slider{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0}.topics-container{background-color:var(--surface-color)!important;width:var(--width)!important}.topics-container{--offset:0;--width:100%}.topics-container.is-floating{overflow:visible!important;overflow:initial!important}.topics-container.is-floating{--offset:5.0625rem;--width:calc(var(--left-column-width) - var(--offset));border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);bottom:0;pointer-events:all;position:absolute;right:0;top:0;transform:translateX(var(--width));z-index:3}.topics-container.is-visible:not(.backwards){transform:translateX(0)}.topics-container.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.topics-container.is-visible.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.topics-container .sidebar-header{padding:0 .75rem}.topics-container .sidebar-header__rows{flex:1 1 auto;overflow:hidden;padding-left:.5rem}.topics-container .sidebar-header__rows .sidebar-header__title{padding-left:0!important}.topics-container .sidebar-header__rows .sidebar-header__title{font-size:16px;font-size:var(--font-size-16);line-height:21px;line-height:var(--line-height-16);margin-bottom:.125rem}.topics-container .sidebar-header__subtitle,.topics-container .sidebar-header__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topics-container .sidebar-header__subtitle{color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14)}.topics-container .chatlist-chat{min-height:4rem;padding-left:.75rem}.topic-name .topic-icon{margin-right:.25rem}.topic-name-button{text-decoration:none!important}.topic-name-button{--color:var(--primary-color);align-items:center;color:var(--color);cursor:pointer;display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:1.5rem;justify-content:center;max-width:100%;padding:0 .5rem;position:relative}.topic-name-button-container{display:flex!important}.topic-name-button-container{align-items:flex-start;justify-content:flex-start}.topic-name-button .peer-title,.topic-name-button .topic-name{position:relative}.topic-name-button:before{background-color:var(--color);border-radius:1.5rem;bottom:0;content:\" \";left:0;opacity:.08;position:absolute;right:0;top:0}html.no-touch .topic-name-button:active:before,html.no-touch .topic-name-button:hover:before{opacity:.16}.topic-icon{line-height:1.875!important}.topic-icon{--size:1.25rem;--custom-emoji-size:var(--size);display:inline-flex;font-size:calc(var(--size)/2);justify-content:center;position:relative;vertical-align:middle}.topic-icon-general{fill:#c4c9cc;fill:var(--secondary-color);height:var(--size);width:var(--size)}.topic-icon-svg{height:inherit;position:absolute;width:inherit}.topic-icon-content{position:relative}.edit-topic-container .scrollable-y{display:flex;flex-direction:column}.edit-topic-icon{position:absolute}.edit-topic-icon .topic-icon{--size:4rem}.edit-topic-icon-container{align-items:center;cursor:pointer;display:flex;height:100px;justify-content:center;margin:0 auto;position:relative;width:100px}.edit-topic-emoticons-container{flex:1 1 auto}.edit-topic-emoticons-container .sidebar-left-section{padding:0!important}.edit-topic-emoticons-container .sidebar-left-section{height:100%}.edit-topic-emoticons-container .emoji-padding{display:flex;flex-direction:column}.edit-topic-emoticons-container .super-emoji-topic-icon .topic-icon{--size:var(--esg-emoji-size);--custom-emoji-size:inherit;margin-left:calc((var(--custom-emoji-size) - var(--esg-emoji-size))/2)}.themes-container{align-items:center;display:flex;height:6.5rem;margin:0 -.5rem;position:relative;width:calc(100% + 1rem)}.themes-container:after,.themes-container:before{content:\" \";display:block;flex:0 0 auto;height:.5rem;width:.5rem}.theme-container{border-radius:10px;flex:0 0 auto;height:calc(100% - .5rem);margin:0 .25rem;position:relative;width:4.5rem}.theme-container:before{border:2px solid var(--primary-color);border-radius:14px;bottom:-4px;content:\" \";left:-4px;opacity:0;position:absolute;right:-4px;top:-4px;transform:scale(.86)}html.is-safari .theme-container:before{transform:none!important}body.animation-level-2 .theme-container:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.theme-container.active{pointer-events:none}.theme-container.active:before{opacity:1;transform:scale(1)}.theme-emoticon{bottom:.5rem;height:1.75rem;left:50%;pointer-events:none;position:absolute;transform:translateX(-50%) scale(1);transform-origin:center bottom;width:1.75rem;z-index:1}body.animation-level-2 .theme-emoticon{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.theme-bubble{background-color:#fff;border-radius:1.75rem;height:1.25rem;position:absolute;width:2.5rem}.theme-bubble.is-out{background-color:var(--light-filled-message-out-primary-color);right:.375rem;top:.5rem}.theme-bubble.is-in{background-color:var(--surface-color);background-color:var(--message-background-color);left:.375rem;top:2rem}.popup{position:fixed!important}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;right:0;top:0;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}[dir=ltr] .popup-title{padding-left:1.5rem;padding-right:1rem}[dir=rtl] .popup-title{padding-left:1rem;padding-right:1.5rem}.popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1;margin:0}.popup-title:first-child{padding-left:0}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform .15s cubic-bezier(.4,0,.2,1);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem;position:relative}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:center;display:flex;flex-direction:row-reverse;height:3rem;justify-content:flex-start;padding:0 .5rem}.popup-buttons .btn{border-radius:10px;font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;max-width:100%;overflow:hidden;padding:0 1rem;position:relative;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}[dir=ltr] .popup-buttons .btn+.btn{margin-right:.625rem}[dir=rtl] .popup-buttons .btn+.btn{margin-left:.625rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}[dir=ltr] .popup-avatar h6{text-align:left}[dir=rtl] .popup-avatar h6{text-align:right}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:14px;font-size:var(--font-size-14);height:2.25rem;line-height:2.25rem;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-container{max-width:25rem;padding:0;width:25rem}.popup-new-media.popup-send-photo .popup-container.border-top-offset .popup-input-container{overflow:visible;overflow:initial}.popup-new-media.popup-send-photo .popup-container.border-top-offset .popup-input-container:before{top:-8px}.popup-new-media.popup-send-photo .popup-header{height:3.5rem;margin:0;padding:0 1rem}[dir=ltr] .popup-new-media.popup-send-photo .popup-title{padding-left:1.5rem}[dir=rtl] .popup-new-media.popup-send-photo .popup-title{padding-right:1.5rem}.popup-new-media.popup-send-photo .popup-close{margin:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .popup-body .scrollable{padding:0 .5rem}.popup-new-media.popup-send-photo .input-message-container{max-height:inherit;min-height:inherit}.popup-new-media.popup-send-photo .input-message-input{max-height:inherit!important}.popup-new-media.popup-send-photo .btn-primary{flex:0 0 auto;height:2.5rem;line-height:2.5rem;margin-bottom:.5rem;padding:0 1rem;text-transform:uppercase;width:auto}.popup-new-media.popup-send-photo .popup-input-container{--height:3.5rem;--max-height:8.375rem;align-items:flex-end;display:flex;flex:0 0 auto;justify-content:space-between;max-height:var(--max-height);min-height:var(--height);overflow:hidden;padding:0 .5rem;position:relative}.popup-new-media.popup-send-photo .popup-input-container:before{background-color:#dfe1e5;background-color:var(--border-color);content:\" \";height:1px;left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .popup-new-media.popup-send-photo .popup-input-container:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.popup-new-media.popup-send-photo .popup-input-container.has-border-top:before{opacity:1}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{border-radius:inherit;overflow:hidden;position:relative}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{--padding:.25rem;--icon-size:4.5rem;--icon-margin:.5rem;border-radius:10px;cursor:default;height:5rem;margin:0 .25rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{line-height:1.5;margin-bottom:.125rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{border-radius:5px;font-size:16px;font-weight:400;letter-spacing:0;line-height:11px}html.no-touch .popup-new-media.popup-send-photo .document:active,html.no-touch .popup-new-media.popup-send-photo .document:hover{background-color:var(--light-secondary-text-color)}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;height:2.5rem;margin:0;padding:0 1rem;width:-moz-max-content;width:max-content}.popup-peer .popup-container{max-width:min(400px,100%);min-width:min(100%,17.5rem);padding:.75rem .5rem;width:-moz-min-content;width:min-content}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.popup-peer .popup-title:not(:first-child){padding-left:1rem}.popup-peer .popup-description{line-height:1.3125;line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-moz-fit-content;max-width:fit-content;min-width:min(100%,15rem);overflow:hidden;padding:.625rem 1rem .5rem;text-overflow:ellipsis;word-break:break-word}.popup-peer .checkbox-field{align-items:center;display:flex;height:3rem;margin:0;padding:0 1.125rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-stickers .sticker-set-footer{color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .scrollable.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .super-emojis{padding:0 .5rem}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}[dir=ltr] .popup-stickers .popup-close{margin-left:1rem}[dir=rtl] .popup-stickers .popup-close{margin-right:1rem}.popup-stickers .popup-close{font-size:1.5rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set .row-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-stickers .sticker-set-stickers{--per-row:5;--item-size:var(--popup-sticker-size);display:grid;grid-template-columns:repeat(var(--per-row),1fr);padding:0 5px;position:relative}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{--per-row:4}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper{cursor:pointer;height:var(--item-size);justify-self:center;margin-bottom:2px;position:relative;width:var(--item-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers .media-sticker-wrapper{margin-bottom:8px}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper:hover{background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height:470px){.popup-date-picker .popup-container[data-lines=\"7\"]{top:19px}.popup-date-picker .popup-container[data-lines=\"5\"]{top:-19px}}.popup-date-picker .popup-header{margin-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7!important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:var(--primary-color)!important}.popup-date-picker .date-picker-month .btn-icon.active{border-radius:50%;color:#fff;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@media only screen and (max-width:600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines=\"5\"]{top:-16px}.popup-schedule .popup-container[data-lines=\"7\"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@media only screen and (max-width:600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold);margin-left:-5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:var(--primary-text-color)!important;font-size:14px!important}.popup-schedule .date-picker-month-day{font-weight:500;font-weight:var(--font-weight-bold)}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width:600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px,100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main:before{left:.25rem}.popup-create-poll .radio-field .radio-field-main:after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{opacity:0!important}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-create-poll hr:not(.hide){display:block!important}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:7px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.8125rem}}.popup-forward .popup-title{flex-grow:1;height:100%;padding:0}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:20px;font-size:var(--font-size-20);height:100%;line-height:1;padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.1875rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1rem 0 .375rem;overflow:visible;overflow:initial}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-header{justify-content:space-between;width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale:1}.call-buttons .call-button-container.hide-me{--scale:0!important}.call-buttons .call-button-container.hide-me{transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(-2.6875rem);transform:translateX(calc(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(6.75rem + 2rem*var(--margin-length)));transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:var(--danger-color)!important}.call-button-green{background-color:#5cc85e!important;background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:7.625rem;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{height:1.875rem!important;width:1.875rem!important}.call-party-state .rlottie-icon{flex:0 0 auto;margin-left:-.25rem;margin-right:.25rem}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(-6.5rem);transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0),rgba(33,33,33,.65) 48.54%,#212121);background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:\" \";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{font-size:16px;font-size:var(--font-size-16);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:#aaa;color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:rgba(1,200,80,.2);background-color:var(--gc-button-unmuted-color);color:#fff;color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60,135,247,.2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223,68,184,.2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255,89,90,.3)!important;background-color:var(--gc-button-leave-color)!important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg,#00a3b4 12.94%,#00cb47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg,#4eabf8 14.73%,#3478f6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg,#df44b8 14.73%,#3851eb 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant .dialog-subtitle,.group-call-participant .dialog-title{padding-right:2.5rem}.group-call-participant-muted-icon-container{position:absolute!important}.group-call-participant-muted-icon-container{right:.5rem}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;height:2rem;margin-left:.75rem;width:2rem}.group-call-participant .is-speaking{color:#5cc85e;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container:before{content:\" \";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaa;color:var(--gc-secondary-text-color)}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25%!important}.group-call-cfs,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width:17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(-13.125rem);transform:translateX(calc(var(--gc-right-column-width)/-2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX:calc(var(--gc-right-column-width)/-2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{background-color:#212121;background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:-26.25rem;right:calc(var(--gc-right-column-width)*-1);top:0;width:26.25rem;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.popup-reacted-list{--size:1.5rem;--custom-emoji-size:var(--size)}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--reaction-size:var(--size);--additional-height:.75rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{font-size:1.25rem!important}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{display:flex;height:var(--size);position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:var(--size)}.popup-reacted-list .chatlist-chat{padding-right:3.25rem!important}.popup-payment .popup-container{border-radius:16px;max-height:min(100%,43.5rem);max-width:26.25rem;padding:0;width:26.25rem}.popup-payment .popup-header{height:3.5rem;margin:0;padding:0 1rem}.popup-payment.is-loading .popup-container{min-height:26.25rem}.popup-payment .scrollable{display:flex;flex:1 1 auto;flex-direction:column}.popup-payment hr{display:block!important;margin:.5rem 0!important;padding:0!important}.popup-payment .input-field{--height:3rem;margin:.75rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.popup-payment .input-fields-row .input-field{margin-top:1.25rem}.popup-payment .sidebar-left-section{padding:0!important}.popup-payment .sidebar-left-section-name+.input-field,.popup-payment .sidebar-left-section-name+.input-fields-row .input-field{margin-top:.75rem}.popup-payment .sidebar-left-section .row{margin-top:.5rem}.popup-payment .sidebar-left-section-content{margin:0 .5rem!important}.popup-payment .select-wrapper{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);max-height:10rem}.popup-payment .select-wrapper li{grid-template-columns:calc(26px + 2rem) 1fr;height:3rem}.popup-payment .payment-verification{border:none;flex:1 1 auto;height:40rem;max-height:100%;width:100%}.popup-payment .row{border-radius:10px}.payment-item{padding:0 1.25rem;width:100%}.payment-item-details{display:flex;flex:0 0 auto;justify-content:space-between;margin-bottom:1rem;overflow:hidden}.payment-item-details:last-child{margin-bottom:0}.payment-item-details-photo{border-radius:10px;flex:0 0 auto;height:6.25rem;margin-right:1rem;width:6.25rem}.payment-item-details-photo .media-photo{border-radius:inherit}.payment-item-details-lines{display:flex;flex:1 1 auto;flex-direction:column}.payment-item-details-lines-title{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16)}.payment-item-details-lines-bot-name,.payment-item-details-lines-description{font-size:14px;font-size:var(--font-size-14);line-height:1.25rem}.payment-item-details-lines-bot-name{color:var(--secondary-text-color)}.payment-item-prices{display:flex;flex-direction:column;margin:1rem .25rem .5rem}.payment-item-prices-price{color:var(--secondary-text-color);display:flex;font-weight:500;justify-content:space-between;line-height:1.1875rem}.payment-item-prices-price+.payment-item-prices-price{margin-top:1.5rem}.payment-item-prices-price.is-total{color:var(--primary-text-color)}.payment-item-tips{display:flex;justify-content:space-between;margin:.75rem -.5rem 1.5rem}.payment-item-tips-tip{--background-intensity:.1;background-color:rgba(84,190,97,var(--background-intensity));border-radius:1.25rem;color:#3ba748;flex:1 1 auto;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;line-height:2.5rem;text-align:center}body.animation-level-2 .payment-item-tips-tip{transition:color .1s ease-in-out,background-color .1s ease-in-out}.payment-item-tips-tip+.payment-item-tips-tip{margin-left:.5rem}html.no-touch .payment-item-tips-tip:not(.active):active,html.no-touch .payment-item-tips-tip:not(.active):hover{--background-intensity:.3}.payment-item-tips-tip.active{--background-intensity:1;color:#fff}.payment-item-tips-input{color:inherit!important;font-weight:inherit!important}.payment-item-tips-input{display:inline}.payment-item-row{margin:0 .5rem;padding-bottom:0;padding-top:0}.payment-item-method-row .media-photo{border-radius:10px}.payment-item-pay{flex:0 0 auto;height:3rem;margin:1rem;text-transform:uppercase;width:auto}.payment-item-preloader-container{flex:1 1 auto;position:relative}.popup-payment-shipping-methods .popup-container{min-height:auto}.popup-payment-shipping-methods .row{margin-top:0!important}.popup-payment-verification .popup-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:\" \";height:1px;left:0;position:absolute;right:0}.popup-payment-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}.popup-limit .popup-container{min-width:min(100%,22.5rem)}.popup-limit-line{align-items:center;display:flex;flex-direction:column;margin:.75rem 0}.popup-limit-hint{align-items:center;color:#fff;display:flex;font-weight:500;font-weight:var(--font-weight-bold);justify-content:center;transform:scale(.6) translate(-280px,16px) rotate(-30deg)}body.animation-level-2 .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.2)}.popup-limit-hint.active{transform:scale(1) translate(0) rotate(0)}.popup-limit-hint-icon{display:flex;font-size:1.25rem;margin-right:.25rem}.popup-limit-button.primary{color:#fff!important}.popup-limit-button.primary{align-items:center;background:linear-gradient(88.39deg,#6c93ff -2.56%,#976fff 51.27%,#df69d1 107.39%);display:flex}.popup-limit-button-icon{display:flex;font-size:1.5rem;margin-left:.625rem}.popup-limit .limit-line{align-self:stretch;margin:1rem .5rem 0}.popup-limit:not(.is-locked) .popup-limit-hint{background:linear-gradient(73.4deg,#6c93ff -7.21%,#976fff 114.57%,#df69d1 241.52%);background-size:200px 2rem;border-radius:1rem;height:2rem;padding:0 .75rem;position:relative}.popup-limit:not(.is-locked) .popup-limit-hint:after{background:inherit;background-position-x:calc(-50% - 86px);background-repeat:no-repeat;background-size:inherit;bottom:-9px;-webkit-clip-path:path(\"M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z\");clip-path:path(\"M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z\");content:\" \";display:block;height:9px;left:50%;margin-left:-13px;position:absolute;width:100%}.popup-limit.is-locked .popup-limit-hint{background-color:var(--primary-color);border-radius:1.375rem;height:2.75rem;margin-right:-.25rem;padding:0 1.25rem 0 1rem}.popup-limit.is-premium .popup-limit-hint{align-self:flex-end;background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);background-position-x:100%;background-size:200px 2rem;border-bottom-right-radius:0;margin-right:.5rem}body.animation-level-2 .popup-limit.is-premium .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.1)}.popup-limit.is-premium .popup-limit-hint:after{background-position-x:134%;bottom:-11.3px;-webkit-clip-path:path(\"M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z\");clip-path:path(\"M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z\");height:12px;left:100%;margin-left:-20.6px}#auth-pages{background:var(--surface-color);max-width:100%;overflow:hidden}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width:600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width:600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width:600px){#auth-pages .input-wrapper{margin-top:41px;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height:810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;width:100%}@media screen and (max-height:810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width:600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{height:240px!important;width:240px!important}.page-signQR .auth-image{align-items:center;display:flex;justify-content:center}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem!important}.page-signQR h4{flex:0 0 auto}[dir=ltr] .page-signQR .qr-description{text-align:left}[dir=rtl] .page-signQR .qr-description{text-align:right}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@media only screen and (max-width:600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width:600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center;margin:1.375rem 0 .875rem}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:var(--danger-color)!important}.page-authCode .phone-wrapper .phone{margin:0}.page-authCode .subtitle{margin:0 auto!important}.page-authCode .subtitle{max-width:300px}.page-chats{max-width:1682px!important}.page-chats{display:flex}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important}.page-chats .main-column{width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{display:flex!important}.page-chats #column-center{background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:#dfe1e5;border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;overflow:hidden;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100)}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:#fff;background-color:var(--body-background-color);color:var(--primary-text-color)}body.deactivated{animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:Roboto Mono,monospace;font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width:100%}@media only screen and (min-width:601px){.only-handhelds{display:none!important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500;font-weight:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:var(--primary-color);color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}input:-webkit-autofill:first-line{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial;font-size:16px}.subtitle{color:var(--secondary-text-color);line-height:1.35}.danger{color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:var(--light-danger-color)}.blue,.primary{color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:var(--light-primary-color)}.primary-text{color:var(--primary-text-color)!important}.color-premium{-webkit-text-fill-color:transparent;background:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%);background:var(--premium-gradient);-webkit-background-clip:text}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:var(--primary-color)}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@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 fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:min(30rem,calc(100vw - 2rem));opacity:0;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast.is-visible{opacity:1}body.animation-level-2 .toast{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.toast b{color:inherit}.toast a{color:#60a5e9!important}.toast a{cursor:pointer}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}b{font-weight:500;font-weight:var(--font-weight-bold)}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.avatar-edit-canvas{background:linear-gradient(#69bffa,#3d9de0);background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{color:#fff;font-size:3rem;height:3rem;left:50%;line-height:1;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);width:3rem;z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}[dir=ltr] .select-wrapper li{text-align:left}[dir=rtl] .select-wrapper li{text-align:right}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}[dir=ltr] .phone-code{text-align:right}[dir=rtl] .phone-code{text-align:left}.phone-code{color:#9e9e9e}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}[dir=ltr] .phone-edit{margin-left:.4rem}[dir=rtl] .phone-edit{margin-right:.4rem}.phone-edit{cursor:pointer;font-size:1.5rem;height:1.5rem;line-height:1;opacity:.5;transition:opacity .2s;width:1.5rem}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}span.emoji{font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol}@media not screen and (-webkit-min-device-pixel-ratio:2),not screen and (min-device-pixel-ratio:2),not screen and (min-resolution:192dpi),not screen and (min-resolution:2dppx){html[dir=ltr]:not(.is-safari) span.emoji{margin-right:5px!important}html[dir=rtl]:not(.is-safari) span.emoji{margin-left:5px!important}html[dir=ltr]:not(.is-safari) avatar-element span.emoji{margin-right:0!important}html[dir=rtl]:not(.is-safari) avatar-element span.emoji{margin-left:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable=true] .custom-emoji{display:inline-block;margin-bottom:-2px}[contenteditable=true] .custom-emoji:before{content:none}[contenteditable=true] [style*=markup]{font-family:inherit!important}[contenteditable=true] [style*=bold]{font-weight:700}[contenteditable=true] [style*=italic]{font-style:italic}[contenteditable=true] [style*=underline]{text-decoration-line:underline}[contenteditable=true] [style*=strikethrough]{text-decoration-line:line-through}[contenteditable=true] [style*=underline][style*=strikethrough]{text-decoration-line:underline line-through}[contenteditable=true] [style*=monospace]{font-family:Roboto Mono,monospace!important;font-family:var(--font-monospace)!important}[contenteditable=true] [style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color)}[contenteditable][data-placeholder]:before{color:#a2acb4;content:attr(data-placeholder);display:block;opacity:0;pointer-events:none;position:absolute}body.animation-level-2 [contenteditable][data-placeholder]:before{transform:translateX(1.75rem);transition:opacity .2s ease-out .01s,transform .2s ease-out .01s;transition:opacity var(--input-transition) .01s,transform var(--input-transition) .01s}[contenteditable][data-placeholder]:empty:before{opacity:1}body.animation-level-2 [contenteditable][data-placeholder]:empty:before{transform:translateX(0)}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{display:grid;grid-template-columns:repeat(auto-fill,72px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){[dir=ltr] .show-more{padding-left:8px}[dir=rtl] .show-more{padding-right:8px}}[dir=ltr] .show-more .tgico-down{padding-left:1rem;padding-right:2rem}[dir=rtl] .show-more .tgico-down{padding-left:2rem;padding-right:1rem}.show-more .tgico-down{float:left;font-size:24px}.content-empty,.show-more .tgico-down{color:var(--secondary-text-color)}::-moz-selection{background:rgba(var(--primary-color-rgb),.4);background:var(--selection-background-color)}.selection:after,::selection{background:rgba(var(--primary-color-rgb),.4);background:var(--selection-background-color)}.selection:after{bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.input-something{display:inline-block}.input-selectable{position:relative}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0,calc(var(--translateY)*-1),0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0,var(--translateY),0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-container-contain{position:relative}.media-container-contain .media-photo{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.media-container-cover{position:relative}.media-container-cover .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-sticker-wrapper.is-premium-sticker:before{align-items:center;background:rgba(0,0,0,.2);background-image:var(--lock-url);background-repeat:no-repeat;background-size:cover;border-radius:50%;bottom:.125rem;color:#fff;display:flex;height:1.25rem;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:1.25rem;z-index:1}body.is-premium .media-sticker-wrapper.is-premium-sticker:after,body.is-premium .media-sticker-wrapper.is-premium-sticker:before{content:none}.media-round{max-height:280px;max-height:var(--round-video-size);max-width:280px;max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:rgba(109,141,65,.4)!important;background-color:var(--message-highlightning-color)!important}.media-round .video-time{padding:0 .375rem}[dir=ltr] .media-round .video-time:after,[dir=ltr] .media-round .video-time:before{margin-left:.25rem}[dir=rtl] .media-round .video-time:after,[dir=rtl] .media-round .video-time:before{margin-right:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:\" \";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:\"\";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:#f4f4f5;background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.sidebar-left-section{padding:.5rem 0!important}.sidebar-left-section{background-color:var(--surface-color);box-shadow:0 1px 3px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{padding:0 1rem}}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-left-section-container a{cursor:pointer}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important}.tgico-admin:before,.tgico-fontsize:before{padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.navigable-list .active{background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{--esg-emoji-total-size:calc(var(--esg-emoji-size) + 0.5rem);--custom-emoji-size:var(--esg-emoji-size);grid-column-gap:2.44px;--esg-emoji-size:2.125rem;--esg-emoji-total-size:2.625rem;--custom-emoji-size:2.25rem;-moz-column-gap:2.44px;column-gap:2.44px;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;font-size:var(--esg-emoji-size);grid-template-columns:repeat(auto-fill,var(--esg-emoji-total-size));justify-content:space-between;line-height:var(--esg-emoji-size);position:relative}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:var(--esg-emoji-total-size);line-height:inherit;margin-left:.0625rem;margin-right:.0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:var(--esg-emoji-total-size)}.super-emojis .super-emoji .emoji-placeholder{background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}.super-emojis .super-emoji.active,html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:var(--light-secondary-text-color)}.super-emojis.not-local .super-emoji{padding:.1875rem}.super-emojis .super-emoji{margin:0}.super-emojis:not(.not-local) .super-emoji{overflow:hidden}html.native-emoji .super-emojis:not(.not-local) .super-emoji{padding-bottom:.3125rem;padding-top:.3125rem}.super-emojis .custom-emoji{display:block}.super-emojis .custom-emoji-renderer{z-index:1}.super-emojis .custom-emoji:before{content:none}.tgico-char:before{font-family:Roboto!important}.tgico-char:before{font-weight:500;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:\"Z\"}.tgico-char.w:before{content:\"W\"}.sending-status:empty{display:none}.sending-status .tgico-sendingerror{color:var(--danger-color)}.sending-status-icon{line-height:1!important}.sending-status-icon{position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon-svg{height:1rem;width:1rem}.verified-icon-check{fill:#fff}.verified-icon-background{fill:var(--primary-color)}[dir=ltr] .emoji-status,[dir=ltr] .premium-icon,[dir=ltr] .verified-icon{margin-left:.125rem}[dir=rtl] .emoji-status,[dir=rtl] .premium-icon,[dir=rtl] .verified-icon{margin-right:.125rem}.emoji-status,.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;width:1.25rem}[dir=ltr] .emoji-status{margin-left:.25rem}[dir=rtl] .emoji-status{margin-right:.25rem}.emoji-status{height:1.125rem;position:relative;width:1.125rem}.premium-icon{color:var(--primary-color);margin-top:-.0625rem}.badge-fake{line-height:1!important}.badge-fake{border:1px solid var(--danger-color);border-radius:.185rem;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.25rem;margin-right:.25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex;overflow:hidden}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.limit-line{display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:2rem}.limit-line-free{color:#000}.limit-line-premium{color:#fff}.limit-line-free{background-color:#f1f3f5;border-bottom-left-radius:10px;border-top-left-radius:10px}.limit-line-premium{background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);border-bottom-right-radius:10px;border-top-right-radius:10px}.limit-line-free,.limit-line-premium{align-items:center;display:flex;flex:1 1 0;justify-content:space-between;padding:0 .75rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}[dir=ltr] .chatlist-chat.row-with-padding{padding-left:4.5rem!important}[dir=rtl] .chatlist-chat.row-with-padding{padding-right:4.5rem!important}.chatlist-chat span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist-chat .row-title{font-size:16px!important;font-size:var(--font-size-16)!important}.chatlist-chat .row-title{line-height:1.375rem}.chatlist-chat .row-title-right-secondary{font-size:12px!important;font-size:var(--font-size-12)!important;line-height:16px!important;line-height:var(--line-height-12)!important}.chatlist-chat .row-title-right-secondary{margin-top:-.4375rem}.chatlist-chat .row-subtitle{display:block!important}.chatlist-chat .row-row{height:1.375rem}.chatlist-chat.chatlist-chat-abitbigger .row-subtitle{margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle{font-size:16px!important;font-size:var(--font-size-16)!important}.chatlist-chat.chatlist-chat-bigger .row-subtitle{line-height:1.375rem;margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle-row{margin-top:.125rem}.chatlist-chat.chatlist-chat-bigger .row-title .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.username-purchase-help b{color:var(--danger-color)!important;font-weight:400!important;font-weight:var(--font-weight-normal)!important}.media-spoiler-container{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.media-spoiler-container.is-revealing{opacity:1}.media-spoiler-container.is-revealing:not(.backwards){opacity:0}.media-spoiler-container.is-revealing.animating{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{-o-object-fit:initial!important;object-fit:fill!important}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{height:100%;position:absolute;width:100%}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.bbbd3ab7eee67888ee7a.bundle.js b/public/main.bbbd3ab7eee67888ee7a.bundle.js deleted file mode 100644 index 9a629354..00000000 --- a/public/main.bbbd3ab7eee67888ee7a.bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";var e,t,n,s,i,o={410:(e,t,n)=>{n.d(t,{GO:()=>r,Tj:()=>i,ZP:()=>a});var s=n(1267);const i=!1,o=i||s.Z.debug,r="undefined"!=typeof window?window:self,a=o},236:(e,t,n)=>{n.d(t,{h:()=>d});var s=n(4762),i=n(144),o=n(4159);const r=o.Z.version,a=o.Z.build,c={_:"theme",access_hash:"",id:"",settings:[{_:"themeSettings",pFlags:{},base_theme:{_:"baseThemeClassic"},accent_color:3379436,message_colors:[5221966],wallpaper:{_:"wallPaper",pFlags:{default:!0,pattern:!0},access_hash:"",document:void 0,id:"",slug:"pattern",settings:{_:"wallPaperSettings",pFlags:{},intensity:50,background_color:14409147,second_background_color:7054727,third_background_color:14014605,fourth_background_color:8960132}}},{_:"themeSettings",pFlags:{},base_theme:{_:"baseThemeNight"},accent_color:8877281,message_colors:[8877281],wallpaper:{_:"wallPaper",pFlags:{default:!0,pattern:!0,dark:!0},access_hash:"",document:void 0,id:"",slug:"pattern",settings:{_:"wallPaperSettings",pFlags:{},intensity:-50,background_color:16696470,second_background_color:14511289,third_background_color:9842623,fourth_background_color:5200853}}}],slug:"",title:"",emoticon:"🏠",pFlags:{default:!0}},l=(e,t,n)=>Object.assign(Object.assign({},c),{name:e,settings:Object.assign(Object.assign({},c.settings.find((e=>e.base_theme._===t))),{highlightningColor:n})}),d={allDialogsLoaded:{},pinnedOrders:{},contactsListCachedTime:0,updates:{},filtersArr:[],maxSeenMsgId:0,stateCreatedTime:Date.now(),recentEmoji:[],recentCustomEmoji:[],topPeersCache:{},recentSearch:[],version:r,build:a,authState:{_:s.IS_MOBILE?"authStateSignIn":"authStateSignQr"},hiddenPinnedMessages:{},settings:{messagesTextSize:16,distanceUnit:"kilometers",sendShortcut:"enter",animationsEnabled:!0,autoDownload:{photo:{contacts:!0,private:!0,groups:!0,channels:!0},video:{contacts:!0,private:!0,groups:!0,channels:!0},file:{contacts:!0,private:!0,groups:!0,channels:!0}},autoDownloadNew:{_:"autoDownloadSettings",file_size_max:3145728,pFlags:{video_preload_large:!0,audio_preload_next:!0},photo_size_max:1048576,video_size_max:15728640,video_upload_maxbitrate:100},autoPlay:{gifs:!0,videos:!0},stickers:{suggest:!0,loop:!0},emoji:{suggest:!0,big:!0},themes:[l("day","baseThemeClassic","hsla(86.4, 43.846153%, 45.117647%, .4)"),l("night","baseThemeNight","hsla(299.142857, 44.166666%, 37.470588%, .4)")],theme:"system",notifications:{sound:!1},timeFormat:(new Date).toLocaleString().match(/\s(AM|PM)/)?"h12":"h23"},playbackParams:{volume:1,muted:!1,playbackRate:1,playbackRates:{voice:1,video:1,audio:1},loop:!1,round:!1},keepSigned:!0,chatContextMenuHintWasShown:!1,stateId:(0,i.d)(32),notifySettings:{}}},8189:(e,t,n)=>{n.d(t,{Z:()=>i});let s=!1;try{const e=document.createElement("canvas").getContext("webgl"),t=e.getExtension("WEBGL_debug_renderer_info"),n=t&&e.getParameter(t.UNMASKED_RENDERER_WEBGL)||"";(n.match(/Apple/)&&!n.match(/Apple GPU/)||-1===e.getSupportedExtensions().indexOf("WEBGL_compressed_texture_s3tc_srgb"))&&(s=!0)}catch(e){}const i=s},993:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},7328:(e,t,n)=>{let s;if(n.d(t,{Z:()=>i}),n(4762).IS_SAFARI)try{s=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){s=!1}else s=!0;const i=s},6663:(e,t,n)=>{n.d(t,{Z:()=>s});const s="filter"in(document.createElement("canvas").getContext("2d")||{})},9976:(e,t,n)=>{n.d(t,{Z:()=>s});const s=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i)},3731:(e,t,n)=>{var s;n.d(t,{Z:()=>i});const i=!!(null===(s=null===navigator||void 0===navigator?void 0:navigator.geolocation)||void 0===s?void 0:s.getCurrentPosition)&&!1},6818:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},1174:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(5269);const i=new Set(["image/jpeg","image/png","image/bmp"]);s.Z&&i.add("image/webp");const o=i},2341:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(1174),i=n(554);const o=[...s.Z].concat([...i.Z]),r=new Set(o)},9030:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!!document.createElement("video").canPlayType("video/quicktime")||s.IS_SAFARI||s.IS_APPLE_MOBILE},5783:(e,t,n)=>{n.d(t,{Z:()=>i});const s=document.createElement("audio"),i=!(!s.canPlayType||!s.canPlayType("audio/ogg;").replace(/no/,""))},2365:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!n(4762).IS_FIREFOX&&!1},2820:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!("getDisplayMedia"in((null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||{}))},2045:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(1267);const i="undefined"!=typeof SharedWorker&&!s.Z.noSharedWorker},5432:(e,t,n)=>{n.d(t,{Z:()=>s});const s="ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch},4762:(e,t,n)=>{n.r(t),n.d(t,{IS_ANDROID:()=>r,IS_APPLE:()=>o,IS_APPLE_MOBILE:()=>c,IS_CHROMIUM:()=>a,IS_FIREFOX:()=>d,IS_MOBILE:()=>h,IS_MOBILE_SAFARI:()=>u,IS_SAFARI:()=>l,USER_AGENT:()=>i});var s=n(6761);const i=navigator?navigator.userAgent:null,o=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),r=-1!==navigator.userAgent.toLowerCase().indexOf("android"),a=/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),c=(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!s.Z.MSStream,l=!!("safari"in s.Z)||!(!i||!(/\b(iPad|iPhone|iPod)\b/.test(i)||i.match("Safari")&&!i.match("Chrome"))),d=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,u=l&&c,h=(void 0===navigator.maxTouchPoints||navigator.maxTouchPoints>0)&&-1!=navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},2131:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!(null===navigator||void 0===navigator?void 0:navigator.vibrate)},554:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(9030);const i=new Set(["image/gif","video/mp4","video/webm"]);s.Z&&i.add("video/quicktime");const o=i},393:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!!document.createElement("video").canPlayType("video/webm")&&!s.IS_SAFARI&&!s.IS_APPLE_MOBILE},5269:(e,t,n)=>{n.d(t,{Z:()=>s});const s=document.createElement("canvas").toDataURL("image/webp").startsWith("data:image/webp")},4089:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!("undefined"==typeof RTCPeerConnection||s.IS_FIREFOX)},2064:(e,t,n)=>{function s(e,t,n,s=1){e/=255,t/=255,n/=255;const i=Math.max(e,t,n),o=Math.min(e,t,n);let r,a;const c=(i+o)/2;if(i===o)r=a=0;else{const s=i-o;switch(a=c>.5?s/(2-i-o):s/(i+o),i){case e:r=(t-n)/s+(t1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e},a=n<.5?n*(1+t):n+t-n*t,c=2*n-a;i=s(c,a,e+1/3),o=s(c,a,e),r=s(c,a,e-1/3)}return[i,o,r,s].map((e=>Math.round(255*e)))}function o(e){const t=[],n="#"===e[0]?1:0;if(e.length===5+n&&(e=(n?"#":"")+"0"+e.slice(n)),e.length===3+n)for(let s=n;s("0"+e.toString(16)).slice(-2))).join("")}function l(e){return function(e){return c(function(e){const t=e.slice(5,-1).split(", "),n=+t.pop(),s=t.map((e=>e.endsWith("%")?+e.slice(0,-1):+e));return i(s[0],s[1],s[2],n)}(e))}(e).slice(0,-2)}n.d(t,{K5:()=>l,Pi:()=>o,Y6:()=>i,cw:()=>a,dI:()=>s,oo:()=>r,t1:()=>c})},6009:(e,t,n)=>{function s(e,t){e=e.split(" ",1)[0],t=t.split(" ",1)[0];const n=e.split("."),s=t.split(".");for(let e=0;ei)return 1;if(ts})},8799:(e,t,n)=>{function s(){var e;return!!(null===(e=document.activeElement)||void 0===e?void 0:e.blur)&&(document.activeElement.blur(),!0)}n.d(t,{Z:()=>s})},3910:(e,t,n)=>{function s(e){if(e||(e=window.event),e){if(!e.cancelable)return!1;e=e.originalEvent||e;try{e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault(),e.returnValue=!1,e.cancelBubble=!0}catch(e){}}return!1}n.d(t,{Z:()=>s})},8497:(e,t,n)=>{function s(e,t){return e.closest("."+t)}n.d(t,{Z:()=>s})},5494:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(3035);function i(e){e.style.transform="translateY(-99999px)",e.focus(),(0,s.d1)().then((()=>{e.style.transform=""}))}},8090:(e,t,n)=>{n.d(t,{T:()=>a,Z:()=>c});var s=n(5432),i=n(4762),o=n(8497),r=n(5494);const a=i.IS_SAFARI&&i.IS_MOBILE&&s.Z;if(a){const e="clientY";let t=0;const n={capture:!0,passive:!1},s=n=>{const s=n.touches[0],i=(0,o.Z)(s.target,"scrollable-y");if(i){const o=s[e],r=t-o,a=i.scrollTop,c=i.scrollHeight,l=i.clientHeight,d=a?Math.round(a+i.clientHeight+r):a+r;(c===l||d>=c||d<=0)&&n.preventDefault()}else n.preventDefault()};let i=0;document.addEventListener("focusin",(o=>{!o.target.classList.contains("is-sticky-input-bugged")||o.timeStamp-i<50||((0,r.Z)(o.target),document.addEventListener("touchmove",s,n),document.addEventListener("touchstart",(n=>{if(n.touches.length>1)return;const s=n.touches[0];t=s[e]})))}),{passive:!0}),document.addEventListener("focusout",(e=>{document.removeEventListener("touchmove",s,n),i=e.timeStamp}),{passive:!0}),document.addEventListener("visibilitychange",(()=>{document.activeElement&&document.activeElement.classList.contains("is-sticky-input-bugged")&&document.activeElement.blur&&(0,r.Z)(document.activeElement)}),{passive:!0})}function c(e){a&&e.classList.add("is-sticky-input-bugged")}},6472:(e,t,n)=>{n.d(t,{B:()=>o,Z:()=>i});let s;function i(){window.addEventListener("beforeinstallprompt",(e=>{s=()=>{return t=this,n=void 0,o=function*(){e.prompt();const{outcome:t}=yield e.userChoice;"accepted"===t&&(s=void 0)},new((i=void 0)||(i=Promise))((function(e,s){function r(e){try{c(o.next(e))}catch(e){s(e)}}function a(e){try{c(o.throw(e))}catch(e){s(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(r,a)}c((o=o.apply(t,n||[])).next())}));var t,n,i,o}}))}function o(){return s}},4541:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(319),i=n(5418);const o=["b","б"],r={},a={text:"Roboto",icons:"tgico",monospace:"Roboto Mono"};function c(e={text:o,icons:void 0,monospace:o}){if(!("fonts"in document))return Promise.resolve();const t=[];for(const n in e){let s=e[n];"all"===s&&(s=o);const i=a[n],c="icons"===n?[500]:[400,500];for(const e of c){const n=(s||[void 0]).map((t=>{var n,s,o,a;const c=[e,"1rem",i].join(" ");return null!==(s=(o=null!==(n=r[c])&&void 0!==n?n:r[c]={})[a=t||""])&&void 0!==s?s:o[a]=document.fonts.load(c,t)}));t.push(...n)}}return Promise.race([Promise.all(t).catch(s.Z),(0,i.Z)(1e3)])}},130:(e,t,n)=>{function s(e,t){i(e),"string"==typeof t?t?e.innerHTML=t:e.replaceChildren():e.replaceChildren(t)}function i(e){e.setAttribute("dir","auto")}n.d(t,{Z:()=>s,m:()=>i})},2586:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(5432),i=n(3241);const o=s.Z?"touchstart":"mousemove";class r extends i.Z{constructor(){super(),this._isIdle=!0,this.focusPromise=Promise.resolve(),this.focusResolve=()=>{},window.addEventListener("blur",(()=>{this.isIdle=!0,window.addEventListener("focus",(()=>{this.isIdle=!1}),{once:!0})})),window.addEventListener(o,(()=>{this.isIdle=!1}),{once:!0,passive:!0}),this.addEventListener("change",(e=>{e?this.focusPromise=new Promise((e=>{this.focusResolve=e})):this.focusResolve()}))}getFocusPromise(){return this.focusPromise}get isIdle(){return this._isIdle}set isIdle(e){this._isIdle!==e&&(this._isIdle=e,this.dispatchEvent("change",e))}}const a=new r},3815:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(3241);class i extends s.Z{constructor(){super(...arguments),this.overlaysActive=0}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("change",this.isOverlayActive)}}const o=new i},3035:(e,t,n)=>{let s;function i(e){s?s.push(e):(s=[e],requestAnimationFrame((()=>{const e=s;s=void 0,e.forEach((e=>e()))})))}n.d(t,{AD:()=>l,T2:()=>i,TR:()=>c,d1:()=>d});let o,r,a=!1;function c(e){o?a?e():o.push(e):(o=[e],requestAnimationFrame((()=>{a=!0;for(let e=0;ei((()=>e())))),r.then((()=>{r=void 0})),r)}function d(){return new Promise((e=>{i((()=>{i(e)}))}))}},764:(e,t,n)=>{function s(e,t=e.split("?")){const n={};return t[1]?(t[1].split("&").forEach((e=>{n[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])})),n):n}n.d(t,{Z:()=>s})},6714:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(5432),i=n(3512),o=n(2064);const r=new class{constructor(){i.Z.addEventListener("theme_change",(()=>{this.setTheme()}))}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(e=this.themeColor){e||(e=this.isNight()?"#212121":"#ffffff");const t=this.themeColorElem;t&&t.setAttribute("content",e)}setThemeListener(){try{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{this.systemTheme=e.matches?"night":"day",i.Z.myId?i.Z.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}applyHighlightningColor(){var e;let t;const n=r.getTheme();(null===(e=n.settings)||void 0===e?void 0:e.highlightningColor)?(t=n.settings.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",t)):document.documentElement.style.removeProperty("--message-highlightning-color"),!s.Z&&t&&(r.themeColor=(0,o.K5)(t))}setTheme(){const e=this.isNight(),t=document.head.querySelector('[name="color-scheme"]');t&&t.setAttribute("content",e?"dark":"light"),document.documentElement.classList.toggle("night",e),this.setThemeColor(),this.applyHighlightningColor()}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===i.Z.settings.theme?this.systemTheme:i.Z.settings.theme)){return i.Z.settings.themes.find((t=>t.name===e))}},a=r},2938:(e,t,n)=>{var s=n(4159),i=n(8799),o=n(3910),r=n(8090),a=n(4541),c=n(9976),l=n(4762),d=n(5418);!function(){const e={construct(e,t){let n=t[0]+"";return 0!==n.indexOf("blob:")&&(n+=location.search),new e(n)}};[Worker,"undefined"!=typeof SharedWorker&&SharedWorker].filter(Boolean).forEach((t=>{window[t.name]=new Proxy(t,e)}))}();var u=n(3512),h=n(5432),g=n(2325),m=(n(4110),n(690),n(3855)),p=n(2554),f=n(6714),v=n(3815),b=n(490),w=n(764),S=n(1267),P=n(410);const y="onbeforeinstallprompt"in window;var k=n(6472);document.addEventListener("DOMContentLoaded",(()=>{return e=void 0,t=void 0,E=function*(){Element.prototype.toggleAttribute||(Element.prototype.toggleAttribute=function(e,t){return void 0!==t&&(t=!!t),this.hasAttribute(e)?!!t||(this.removeAttribute(e),!1):!1!==t&&(this.setAttribute(e,""),!0)}),void 0===Node.prototype.replaceChildren&&(Node.prototype.replaceChildren=function(...e){this.textContent="",e&&this.append(...e)}),u.Z.managers=(0,p.Z)(),document.getElementById("manifest").href=`site${l.IS_APPLE&&!l.IS_APPLE_MOBILE?"_apple":""}.webmanifest?v=jw3mK7G9Aq`,b.Z.start();const e=window.visualViewport||window;let t,_=!1;const E=()=>{const n=.01*(_&&!v.Z.isOverlayActive?e.height||e.innerHeight:window.innerHeight);t!==n&&(h.Z&&t1&&(0,i.Z)(),t=n,document.documentElement.style.setProperty("--vh",`${n}px`))};if(window.addEventListener("resize",E),E(),r.T){const t=()=>{_=1===n&&r.T&&!v.Z.isOverlayActive,E(),e!==window&&(_?(window.removeEventListener("resize",E),e.addEventListener("resize",E)):(e.removeEventListener("resize",E),window.addEventListener("resize",E)))};let n;window.onImTabChange=e=>{const s=void 0!==n;n=e,(s||1===n)&&t()},v.Z.addEventListener("change",(()=>{t()}))}l.IS_FIREFOX&&!c.Z&&document.addEventListener("dragstart",(e=>{const t=e.target;if("IMG"===t.tagName&&t.classList.contains("emoji"))return(0,o.Z)(e),!1})),c.Z&&document.documentElement.classList.add("native-emoji"),document.addEventListener("dragstart",(e=>{var t;if("IMG"===(null===(t=e.target)||void 0===t?void 0:t.tagName))return e.preventDefault(),!1})),document.addEventListener("contextmenu",(e=>{"IMG"!==e.target.tagName||window.appMediaViewer||(0,o.Z)(e)})),l.IS_FIREFOX&&document.documentElement.classList.add("is-firefox","no-backdrop"),l.IS_MOBILE&&document.documentElement.classList.add("is-mobile"),l.IS_APPLE?(l.IS_SAFARI&&document.documentElement.classList.add("is-safari"),l.IS_APPLE_MOBILE?document.documentElement.classList.add("is-ios"):document.documentElement.classList.add("is-mac")):l.IS_ANDROID&&document.documentElement.classList.add("is-android"),h.Z?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch"),y&&(0,k.Z)();const A=performance.now(),Z=g.ZP.getCacheLangPack(),[I,C]=yield Promise.all([m.Z.sendState().then((([e])=>e)),Z]);function L(e,t){e.style.opacity="0",t.then((()=>{window.requestAnimationFrame((()=>{e.style.opacity=""}))}))}g.ZP.setTimeFormat(I.state.settings.timeFormat),u.Z.managers.rootScope.getPremium().then((e=>{u.Z.premium=e})),f.Z.setThemeListener(),C.appVersion!==s.Z.langPackVersion&&g.ZP.getLangPack(C.lang_code),console.log("got state, time:",performance.now()-A),"ar"===C.lang_code&&P.Tj,document.documentElement.dir="ltr";let T=I.state.authState;const O=location.hash,M=O.split("?"),W=(0,w.Z)(O,M);if(W.tgWebAuthToken&&"authStateSignedIn"!==T._){const e={token:W.tgWebAuthToken,dcId:+W.tgWebAuthDcId,userId:W.tgWebAuthUserId.toUserId(),isTest:void 0!==W.tgWebAuthTest&&!!+W.tgWebAuthTest,tgAddr:W.tgaddr};if(e.isTest!==S.Z.test){const e=new URLSearchParams(location.search);return+W.tgWebAuthTest?e.set("test","1"):e.delete("test"),void(location.search=e.toString())}u.Z.managers.appStateManager.pushToState("authState",T={_:"authStateSignImport",data:e})}if("authStateSignedIn"!==T._){console.log("Will mount auth page:",T._,Date.now()/1e3);const e=document.getElementById("auth-pages");let t,s;if(e){t=e.querySelector(".scrollable"),h.Z&&!l.IS_MOBILE_SAFARI||t.classList.add("no-scrollbar"),t.style.opacity="0";const n=document.createElement("div");n.classList.add("auth-placeholder"),t.prepend(n),t.append(n.cloneNode())}try{yield Promise.all([Promise.resolve().then(n.bind(n,2831)),Promise.resolve().then(n.bind(n,6702))]).then((([e,t])=>{e.default.setAuthorized(!1),t.default.forceUnsubscribe()}))}catch(e){}switch(T._){case"authStateSignIn":s=(yield Promise.all([n.e(539),n.e(460),n.e(63)]).then(n.bind(n,810))).default.mount();break;case"authStateSignQr":s=(yield Promise.all([n.e(539),n.e(460),n.e(709)]).then(n.bind(n,9709))).default.mount();break;case"authStateAuthCode":s=(yield Promise.all([n.e(539),n.e(460),n.e(53)]).then(n.bind(n,6392))).default.mount(T.sentCode);break;case"authStatePassword":s=(yield Promise.all([n.e(539),n.e(460),n.e(437)]).then(n.bind(n,9437))).default.mount();break;case"authStateSignUp":s=(yield Promise.all([n.e(539),n.e(460),n.e(339)]).then(n.bind(n,8339))).default.mount(T.authCode);break;case"authStateSignImport":s=(yield Promise.all([n.e(539),n.e(460),n.e(231)]).then(n.bind(n,3231))).default.mount(T.data)}t&&(s&&(yield s),L(t,"fonts"in document?Promise.race([(0,d.Z)(1e3),document.fonts.ready]):Promise.resolve()))}else console.log("Will mount IM page:",Date.now()/1e3),L(document.getElementById("main-columns"),(0,a.Z)()),(yield Promise.all([n.e(539),n.e(460),n.e(436)]).then(n.bind(n,5436))).default.mount()},new((_=void 0)||(_=Promise))((function(n,s){function i(e){try{r(E.next(e))}catch(e){s(e)}}function o(e){try{r(E.throw(e))}catch(e){s(e)}}function r(e){var t;e.done?n(e.value):(t=e.value,t instanceof _?t:new _((function(e){e(t)}))).then(i,o)}r((E=E.apply(e,t||[])).next())}));var e,t,_,E}))},1722:(e,t,n)=>{n.d(t,{Z:()=>s});const s=new class{reload(){try{location.reload()}catch(e){}}close(){try{window.close()}catch(e){}}focus(){window.focus()}}},2554:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(3855),i=n(410);const o={};function r(e,t){return new Proxy(e,{get:(e,n,r)=>{var a;return null!==(a=e[n])&&void 0!==a?a:e[n]=function(e,t){return new Proxy({},{get:(n,r,a)=>(...n)=>{var a;const c=s.Z.invoke("manager",{name:e,method:r,args:n},t);return i.ZP&&(null===(a=o[e])||void 0===a?void 0:a.has(r))&&console.warn("manager request",e,r,n),c}})}(n,t)}})}let a;function c(){return a||(a=r({},!1),a.acknowledged=r({},!0),a)}i.ZP&&(window.DEBUG_MANAGER_REQUESTS=o)},6666:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(1267),i=n(5471),o=n(5953),r=n(5003);class a{constructor(e){(0,o.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,r.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),a.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var n;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const n of t.indexes)e.indexNames.contains(n.indexName)||e.createIndex(n.indexName,n.keyPath,n.objectParameters)};try{var n=indexedDB.open(this.name,this.version);if(!n)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||n.onerror((0,i.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,i)=>{n.onsuccess=t=>{s=!0;const o=n.result;let r=!1;this.log("Opened"),o.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},o.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},o.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),o.close()},o.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=o)},n.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},n.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const n=e.target,i=n.result;this.stores.forEach((e=>{if(i.objectStoreNames.contains(e.name)){const s=n.transaction.objectStore(e.name);t(s,e)}else((e,n)=>{const s=e.createObjectStore(n.name);t(s,n)})(i,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new a(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}a.INSTANCES=[];class c{constructor(e,t){this.storeName=t,this.log=(0,r.kg)(["IDB",e.name,t].join("-")),this.idb=a.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,n){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(n=>e.map(((e,s)=>n.put(t[s],e)))),"",n)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,n,s=this.storeName){let i;return n&&(i=performance.now(),this.log(n+": start")),this.idb.openDatabase().then((o=>new Promise(((r,a)=>{const c=o.transaction([s],e),l=()=>{clearTimeout(h),a(c.error)},d=()=>{clearTimeout(h),n&&this.log(n+": end",performance.now()-i);const e=p.map((e=>e.result));r(m?e:e[0])};c.onerror=l;const u="readwrite"===e;u&&(c.oncomplete=()=>d());const h=setTimeout((()=>{this.log.error("transaction not finished",c,n)}),1e4),g=t(c.objectStore(s)),m=Array.isArray(g),p=m?g:[].concat(g);if(u)return;const f=p.length;let v=f;const b=()=>{c.error||--v||d()};for(let e=0;ee.getAll()),"",e)}}},2325:(e,t,n)=>{n.d(t,{$d:()=>S,A1:()=>P,Hz:()=>m,XZ:()=>w,ZP:()=>v,ag:()=>b,nK:()=>p,v_:()=>y});var s=n(410),i=n(7922),o=n(4159),r=n(3512),a=n(4762),c=n(6848),l=n(5953),d=n(9005),u=n(6637),h=n(3591),g=n(130);const m={messageActionChatCreate:"ActionCreateGroup",messageActionChatCreateYou:"ActionYouCreateGroup",messageActionChatEditTitle:"ActionChangedTitle",messageActionChatEditPhoto:"ActionChangedPhoto",messageActionChatEditVideo:"ActionChangedVideo",messageActionChatDeletePhoto:"ActionRemovedPhoto",messageActionChatReturn:"ActionAddUserSelf",messageActionChatReturnYou:"ActionAddUserSelfYou",messageActionChatJoined:"ActionAddUserSelfMega",messageActionChatJoinedYou:"ChannelMegaJoined",messageActionChatAddUser:"ActionAddUser",messageActionChatAddUsers:"ActionAddUser",messageActionChatLeave:"ActionLeftUser",messageActionChatLeaveYou:"YouLeft",messageActionChatDeleteUser:"ActionKickUser",messageActionChatJoinedByLink:"ActionInviteUser",messageActionPinMessage:"Chat.Service.Group.UpdatedPinnedMessage",messageActionContactSignUp:"Chat.Service.PeerJoinedTelegram",messageActionChannelCreate:"ActionCreateChannel",messageActionChannelEditTitle:"Chat.Service.Channel.UpdatedTitle",messageActionChannelEditPhoto:"Chat.Service.Channel.UpdatedPhoto",messageActionChannelEditVideo:"Chat.Service.Channel.UpdatedVideo",messageActionChannelDeletePhoto:"Chat.Service.Channel.RemovedPhoto",messageActionHistoryClear:"HistoryCleared",messageActionDiscussionStarted:"DiscussionStarted",messageActionChannelMigrateFrom:"ActionMigrateFromGroup","messageActionPhoneCall.video_in_ok":"ChatList.Service.VideoCall.incoming","messageActionPhoneCall.video_out_ok":"ChatList.Service.VideoCall.outgoing","messageActionPhoneCall.video_missed":"ChatList.Service.VideoCall.Missed","messageActionPhoneCall.video_cancelled":"ChatList.Service.VideoCall.Cancelled","messageActionPhoneCall.in_ok":"ChatList.Service.Call.incoming","messageActionPhoneCall.out_ok":"ChatList.Service.Call.outgoing","messageActionPhoneCall.missed":"ChatList.Service.Call.Missed","messageActionPhoneCall.cancelled":"ChatList.Service.Call.Cancelled","messageActionGroupCall.started":"Chat.Service.VoiceChatStarted.Channel","messageActionGroupCall.started_by":"Chat.Service.VoiceChatStarted","messageActionGroupCall.started_byYou":"Chat.Service.VoiceChatStartedYou","messageActionGroupCall.ended":"Chat.Service.VoiceChatFinished.Channel","messageActionGroupCall.ended_by":"Chat.Service.VoiceChatFinished","messageActionGroupCall.ended_byYou":"Chat.Service.VoiceChatFinishedYou",messageActionBotAllowed:"Chat.Service.BotPermissionAllowed"},p=a.IS_MOBILE?"Message.Unsupported.Mobile":"Message.Unsupported.Desktop";var f;!function(e){let t,a;function m(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function p(){if("h12"===e.timeFormat)try{const t=A({hour:"numeric",minute:"numeric",hour12:!0}),n=new Date;n.setHours(0);const s=t.format(n);e.amPmCache.am=s.split(" ")[1],n.setHours(12);const i=t.format(n);e.amPmCache.pm=i.split(" ")[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function f(){const e=o.Z.langPackCode;return m(e),Promise.all([n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),n.e(8).then(n.bind(n,9179))]).then((([t,n,s])=>{const i=[];return b(t.default,i),b(n.default,i),w({_:"langPackDifference",from_version:0,lang_code:e,strings:i,version:0,local:!0,countries:s.default})}))}function v(t,s){e.requestedServerLanguage=!0;const i=r.Z.managers;return Promise.all([i.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"web"}),!1,n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),i.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function b(e,t=[]){for(const n in e){const s=e[n];"string"==typeof s?t.push({_:"langPackString",key:n,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:n},s))}return t}function w(e){return e.appVersion=o.Z.langPackVersion,i.Z.set({langPack:e}).then((()=>(S(e),e)))}function S(n){const s=e.lastRequestedLangCode;if(n.lang_code===s){try{t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode)}catch(n){console.error("pluralRules error",n),t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode.split("-",1)[0])}try{t=new Intl.PluralRules(n.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(n.lang_code.split("-",1)[0])}e.strings.clear();for(const t of n.strings)e.strings.set(t.key,t);n.countries&&(e.countriesList.length=0,e.countriesList.push(...n.countries.countries),n.countries.countries.forEach((t=>{if(t.name){const n=t.default_name;e.strings.set(n,{_:"langPackString",key:n,value:t.name})}}))),e.lastAppliedLangCode!==s&&(r.Z.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,E.clear(),p()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n&&n.update()}))}}function P(e,t,n={i:0}){const s=[];let i=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,o,r,a,c,l,d)=>{if(s.push(d.slice(i,l)),o){let e;switch(o){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...P(r,t,n)),s.push(e)}else if(a)s.push(document.createElement("br"));else if(c){const e=c.lastIndexOf("]"),i=c.slice(1,e),o=c.slice(e+2,c.length-1);let r;if(o&&(0,u.Z)(o)){r=document.createElement("a");const e=(0,h.Z)(o);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[n.i++],r instanceof DocumentFragment&&(r=r.firstChild),r.textContent="";r.append(...P(i,t,n)),s.push(r)}else t&&function(e,t,n){const s=t[n.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,n);return i=l+e.length,""})),i!==e.length&&s.push(e.slice(i)),s}function y(n,s=!1,i){const o=e.strings.get(n);let r;if(o)if("langPackStringPluralized"===o._&&(null==i?void 0:i.length)){let e=i[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),r=o[t.select(e)+"_value"]||o.other_value}else r="langPackString"===o._?o.value:n;else r=n;const a=P(r,i);return s?a.map((e=>e instanceof Node?e.textContent:e)).join(""):a}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.isRTL=!1,e.setRTL=function(t){e.isRTL=t},e.getCacheLangPack=function(){return a||(a=Promise.all([i.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(s.ZP,e.lastRequestedLangCode||m(t.lang_code),S(t),t):f())).finally((()=>{a=void 0})))},e.setTimeFormat=function(t,n=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,p(),n&&(E.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n instanceof Z&&n.update()})))},e.loadLocalLangPack=f,e.loadLangPack=v,e.getStrings=function(e,t){return r.Z.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:o.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=b,e.getLangPack=function(e,t){return m(e),v(e).then((([e,t,n,s,i,o])=>{let r=[];return[n,s].forEach((e=>{b(e.default,r)})),r=r.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=r,e.countries=i,w(e)}))},e.saveLangPack=w,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():n.e(642).then(n.bind(n,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=S,e.superFormatter=P,e.format=y,e.weakMap=new WeakMap;class k{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class _ extends k{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,l.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...y(this.key,!1,this.args));else{const e=this.element[this.property],t=y(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,c.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=_;const E=new Map;function A(t={}){const n=JSON.stringify(t);let s=E.get(n);return s||(s=new Intl.DateTimeFormat(e.lastRequestedNormalizedLangCode+"-u-hc-"+e.timeFormat,t),E.set(n,s)),s}e.amPmCache={am:"AM",pm:"PM"};class Z extends k{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"})),(0,g.m)(this.element)}update(t){let n;if((0,l.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){const t=this.date.getHours();n=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(n+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=A(this.options);n=(0,d.Z)(e.format(this.date))}this.element[this.property]=n}}e.IntlDateElement=Z,e.i18n=function(e,t){return new _({key:e,args:t}).element},e.i18n_=function(e){return new _(e).element},e._i18n=function(e,t,n,s){return new _({element:e,key:t,args:n,property:s}).element}}(f||(f={}));const v=f,b=f.i18n,w=f.i18n_,S=f._i18n;function P(e,t){const n=e.slice(0,1);for(let s=1;s{const s=e&&t?"AutoDownloadSettings.LastDelimeter":"AutoDownloadSettings.Delimeter";return n?f.format(s,!0):b(s)}));return n?s.join(""):s}s.GO.I18n=f},1507:(e,t,n)=>{n.d(t,{BP:()=>h,BX:()=>m,DZ:()=>v,IA:()=>o,Iw:()=>l,J$:()=>p,NM:()=>s,OS:()=>u,Ox:()=>g,Pt:()=>d,Zi:()=>f,gZ:()=>c,hj:()=>i,rU:()=>a,yF:()=>r});const s=0,i=1271266957,o=777,r=777e3,a=2147483647,c="",l=20971520,d="",u=[7322096,16766590,13338331,9367192,16749490,16478047],h="default_static",g=4295032831,m=new Set(["web","k","z"]),p=0,f=1,v=new Set([p,f]);Math.max(...Array.from(v))},3855:(e,t,n)=>{n.d(t,{Z:()=>se});var s=n(3512),i=n(7730),o=n(410),r=n(7487),a=n(6702),c=n(1722),l=n(2831),d=n(5418),u=n(993),h=n(7328),g=n(6663),m=n(9976),p=n(3731),f=n(6818),v=n(1174),b=n(2341),w=n(9030),S=n(2365),P=n(2820),y=n(5432),k=n(2131),_=n(554),E=n(393),A=n(5269),Z=n(4089),I=n(4762),C=n(5783),L=n(2045),T=n(8189);const O=Object.assign({CAN_USE_TRANSFERABLES:h.Z,IS_APPLE_MX:T.Z,IS_CALL_SUPPORTED:u.Z,IS_CANVAS_FILTER_SUPPORTED:g.Z,IS_EMOJI_SUPPORTED:m.Z,IS_GEOLOCATION_SUPPORTED:p.Z,IS_GROUP_CALL_SUPPORTED:f.Z,IS_MOV_SUPPORTED:w.Z,IS_PARALLAX_SUPPORTED:S.Z,IS_SCREEN_SHARING_SUPPORTED:P.Z,IS_TOUCH_SUPPORTED:y.Z,IS_VIBRATE_SUPPORTED:k.Z,IS_OPUS_SUPPORTED:C.Z,IS_SHARED_WORKER_SUPPORTED:L.Z,IS_WEBM_SUPPORTED:E.Z,IS_WEBP_SUPPORTED:A.Z,IS_WEBRTC_SUPPORTED:Z.Z,IMAGE_MIME_TYPES_SUPPORTED:v.Z,MEDIA_MIME_TYPES_SUPPORTED:b.Z,VIDEO_MIME_TYPES_SUPPORTED:_.Z},I);var M=n(4159),W=n(236),R=n(6009),D=n(8479),x=n(946),N=n(7922),U=n(5466),F=n(5003);const j=W.h.version,B=W.h.build,V=Object.keys(W.h),G=["contactsListCachedTime","stateCreatedTime","maxSeenMsgId","filtersArr"];function z(){return e=this,t=void 0,i=function*(){const e=(0,F.kg)("STATE-LOADER"),t=performance.now(),n=(0,U.$)(e),i=V.map((e=>n(N.Z.get(e),"state "+e))).concat(n(r.Z.get("user_auth"),"auth"),n(r.Z.get("state_id"),"auth"),n(r.Z.get("k_build"),"auth")).concat(n(N.Z.get("user_auth"),"old auth")),a=yield Promise.all(i);e.warn("promises",performance.now()-t);const c=[],l=(e,t)=>{d[e]=t,c.push(e)};let d={};for(let e=0,t=V.length;eN.Z.get(e))));e.push("user_auth"),t.push("number"==typeof u||"string"==typeof u?{dcID:t[0]||M.Z.baseDcId,date:Date.now()/1e3|0,id:u.toPeerId(!1)}:u);const n={};e.forEach(((e,s)=>{n[e]=t[s]})),yield r.Z.set(n)}u&&(d.authState={_:"authStateSignedIn"},s.Z.dispatchEvent("user_auth","number"==typeof u||"string"==typeof u?{dcID:0,date:Date.now()/1e3|0,id:u.toPeerId(!1)}:u));const p=new Set;if(d.stateId!==h){if(void 0!==h){const e=new Map([["authState",void 0],["stateId",void 0]]);e.forEach(((t,n)=>{e.set(n,(0,D.Z)(d[n]))})),d=(0,D.Z)(W.h),e.forEach(((e,t)=>{d[t]=e}));const t={chats:1,dialogs:1,users:1};for(const e in t)p.add(e);f=d,c.length=0,d=f,c.push(...Object.keys(d))}yield r.Z.set({state_id:d.stateId})}var f;const v=Date.now();d.stateCreatedTime+864e5{l(e,(0,D.Z)(W.h[e]))})));const b=d.settings.autoDownload;if(void 0!==(null==b?void 0:b.private)){const e=["contacts","private","groups","channels"];["photo","video","file"].forEach((t=>{const n=b[t]={};e.forEach((e=>{n[e]=b[e]}))})),e.forEach((e=>{delete b[e]})),l("settings",d.settings)}const w=new Set(["settings.themes"]);let S,P;if((0,x.Z)(W.h,d,(e=>{l(e,d[e])}),void 0,w),d.version!==j||d.build!==B){if(d.build<217&&(d.allDialogsLoaded=(0,D.Z)(W.h.allDialogsLoaded),d.pinnedOrders=(0,D.Z)(W.h.pinnedOrders),d.filtersArr=(0,D.Z)(W.h.filtersArr),p.add("dialogs")),-1===(0,R.Z)(d.version,"1.7.1")){let e=!1;if(-1===(0,R.Z)(d.version,"1.3.0"))e=!0,d.settings.theme=(0,D.Z)(W.h.settings.theme),d.settings.themes=(0,D.Z)(W.h.settings.themes);else if(-1===(0,R.Z)(d.version,"1.7.1")){e=!0;const t=d.settings.themes;d.settings.themes=(0,D.Z)(W.h.settings.themes);try{t.forEach((e=>{const t=e.background;if(!t)return;const n=d.settings.themes.find((t=>t.name===e.name));n.settings.highlightningColor=t.highlightningColor;const s=(t.color||"").split(",").map((e=>e&&parseInt(e.slice(1),16)));if(t.color&&!t.slug)n.settings.wallpaper={_:"wallPaperNoFile",id:0,pFlags:{},settings:{_:"wallPaperSettings",pFlags:{}}};else{const e={_:"wallPaper",id:0,access_hash:0,slug:t.slug,document:{},pFlags:{},settings:{_:"wallPaperSettings",pFlags:{}}},s=e.settings;n.settings.wallpaper=e,t.slug&&!t.color?s.pFlags.blur=t.blur||void 0:t.intensity&&(s.intensity=t.intensity,e.pFlags.pattern=!0,e.pFlags.dark=t.intensity<0||void 0)}if(s.length){const e=n.settings.wallpaper.settings;e.background_color=s[0],e.second_background_color=s[1],e.third_background_color=s[2],e.fourth_background_color=s[3]}}))}catch(e){console.error("migrating themes error",e)}}e&&l("settings",d.settings)}0!==(0,R.Z)(d.version,j)&&(S=j,P=d.version),l("version",j),l("build",B)}return g!==B&&(!g||g{var t,n;const{name:s,key:i,value:o}=e;if(!e.hasOwnProperty("key"))return void(this.mirrors[s]=o);const r=null!==(t=(n=this.mirrors)[s])&&void 0!==t?t:n[s]={};void 0===o?delete r[i]:r[i]=o},this.mirrors={},this.tabState={chatPeerIds:[],idleStartTime:0},this.log("constructor"),this.registerWorker(),this.registerServiceWorker(),this.registerCryptoWorker(),this.addMultipleEventsListeners({convertWebp:({fileName:e,bytes:t})=>i.Z.convert(e,t),convertOpus:({fileName:e,bytes:t})=>q.Z.pushDecodeTask(t,!1).then((e=>e.bytes)),event:({name:e,args:t})=>{s.Z.dispatchEventSingle(e,...t)},localStorageProxy:e=>{const t=e;return r.Z[t.type](...t.args)},mirror:this.onMirrorTask}),s.Z.addEventListener("language_change",(e=>{s.Z.managers.networkerFactory.setLanguage(e)})),window.addEventListener("online",(()=>{s.Z.managers.networkerFactory.forceReconnectTimeout()})),s.Z.addEventListener("logging_out",(()=>{Promise.all([(0,X.Z)(!1,!0),r.Z.clear(),Promise.race([l.default.setAuthorized(!1),(0,d.Z)(3e3)]),a.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map((e=>caches.delete(e))))]).finally((()=>{c.Z.reload()}))})),J.Z.addEventListener("change",(e=>{this.updateTabStateIdle(e)})),this.updateTabStateIdle(J.Z.isIdle),this.log("Passing environment:",O),this.invoke("environment",O)}pingServiceWorkerWithIframe(){if(this.pingServiceWorkerPromise)return this.pingServiceWorkerPromise;const e=this.pingServiceWorkerPromise=(0,Q.Z)(),t=document.createElement("iframe");t.hidden=!0;const n=()=>{setTimeout((()=>{this.pingServiceWorkerPromise=void 0}),1e4),clearTimeout(s),t.remove(),t.removeEventListener("load",n),t.removeEventListener("error",n),e.resolve()};t.addEventListener("load",n),t.addEventListener("error",n),t.src="ping/"+(4294967295*Math.random()|0),document.body.append(t);const s=window.setTimeout(n,1e3);return e}attachServiceWorker(e){this.lastServiceWorker&&this.serviceMessagePort.detachPort(this.lastServiceWorker),this.serviceMessagePort.attachSendPort(this.lastServiceWorker=e),this.serviceMessagePort.invokeVoid("hello",void 0)}_registerServiceWorker(){navigator.serviceWorker.register(new URL(n.p+n.u(670),n.b),{scope:"./"}).then((e=>{if(this.log("SW registered",e),e.active&&!navigator.serviceWorker.controller)return e.unregister().then((()=>{window.location.reload()}));(e.installing||e.waiting||e.active).addEventListener("statechange",(e=>{this.log("SW statechange",e)}));const t=navigator.serviceWorker.controller||e.installing||e.waiting||e.active;this.attachServiceWorker(t)}),(e=>{this.log.error("SW registration failed!",e),this.invokeVoid("serviceWorkerOnline",!1)}))}registerServiceWorker(){if(!("serviceWorker"in navigator))return;this.serviceMessagePort=new K.Z;const e=navigator.serviceWorker;this._registerServiceWorker(),e.addEventListener("controllerchange",(()=>{this.log.warn("controllerchange");const t=e.controller;this.attachServiceWorker(t),t.addEventListener("error",(e=>{this.log.error("controller error:",e)}))})),this.serviceMessagePort.attachListenPort(e),this.serviceMessagePort.addMultipleEventsListeners({port:(e,t,n)=>{this.invokeVoid("serviceWorkerPort",void 0,void 0,[n.ports[0]])},hello:(e,t)=>{this.serviceMessagePort.resendLockTask(t)},share:e=>{this.log("will try to share something"),this.share=e}}),e.addEventListener("messageerror",(e=>{this.log.error("SW messageerror:",e)}))}registerCryptoWorker(){return ee(this,void 0,void 0,(function*(){const e={construct:(e,t)=>({url:t[0]+location.search})},t=[Worker,"undefined"!=typeof SharedWorker&&SharedWorker].filter(Boolean);t.forEach((t=>window[t.name]=new Proxy(t,e)));const s=new Worker(new URL(n.p+n.u(589),n.b),{type:void 0});t.forEach((e=>window[e.name]=e));const i=s.url,o=e=>new a(e,{type:"module"}),r=e=>this.attachWorkerToPort(e,Y.Z,"crypto"),a=L.Z?SharedWorker:Worker;Y.Z.addEventListener("port",((e,t,n)=>{this.invokeVoid("cryptoPort",void 0,void 0,[n.ports[0]])})),r(o(i));const c=yield(l=i,fetch(l).then((e=>e.text())).then((e=>{const t=location.pathname.split("/");return t[t.length-1]="",e=`\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${location.origin+t.join("/")}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${e}`,new Blob([e],{type:"application/javascript"})})));var l;(yield this.invoke("createProxyWorkerURLs",{originalUrl:i,blob:c})).slice(1).map(o).forEach(r)}))}registerWorker(){let e;e=L.Z?new SharedWorker(new URL(n.p+n.u(678),n.b),{type:void 0}):new Worker(new URL(n.p+n.u(678),n.b),{type:void 0}),this.onWorkerFirstMessage(e)}attachWorkerToPort(e,t,n){const s=e.port||e;t.attachPort(s),e.addEventListener("error",(e=>{this.log.error(n,"worker error",e)}))}onWorkerFirstMessage(e){this.log("set webWorker"),this.attachWorkerToPort(e,this,"mtproto")}loadState(){return Promise.all([(null!=$?$:$=z()).then((e=>(this.newVersion=e.newVersion,this.oldVersion=e.oldVersion,this.mirrors.state=e.state,e)))])}sendState(){return this.loadState().then((e=>{const[t]=e;return this.invoke("state",Object.assign(Object.assign({},t),{userId:s.Z.myId.toUserId()})),e}))}invokeCrypto(e,...t){return Y.Z.invokeCrypto(e,...t)}toggleStorages(e,t){return ee(this,void 0,void 0,(function*(){yield(0,X.Z)(e,t),this.invoke("toggleStorages",{enabled:e,clearWrite:t}),this.serviceMessagePort.invokeVoid("toggleStorages",{enabled:e,clearWrite:t})}))}getMirror(e){return ee(this,void 0,void 0,(function*(){return this.mirrors[e]}))}getState(){return this.getMirror("state")}updateTabState(e,t){this.tabState[e]=t,this.invokeVoid("tabState",this.tabState)}updateTabStateIdle(e){this.updateTabState("idleStartTime",e?Date.now():0)}}const ne=new te;o.GO.apiManagerProxy=ne;const se=ne},490:(e,t,n)=>{n.d(t,{Z:()=>f});var s=n(4159),i=n(410),o=n(2219),r=n(2045),a=n(3241),c=n(2586),l=n(5003),d=n(3512),u=n(7487),h=n(3855);const g=r.Z;class m extends a.Z{constructor(){super(!1),this.log=(0,l.kg)("INSTANCE"),this.clearInstance=()=>{this.masterInstance&&!this.deactivated&&(this.log.warn("clear master instance"),u.Z.delete("xt_instance"))},this.checkInstance=(e=c.Z.isIdle)=>{return t=this,n=void 0,o=function*(){if(this.deactivated)return;const t=Date.now(),n={id:this.instanceId,idle:e,time:t},[i,o=s.Z.build]=yield Promise.all([u.Z.get("xt_instance",!1),u.Z.get("k_build",!1)]);if(o>s.Z.build)return this.masterInstance=!1,d.Z.managers.networkerFactory.stopAll(),this.deactivateInstance("version"),void h.Z.toggleStorages(!1,!1);g?u.Z.set({xt_instance:n}):!e||!i||i.id===this.instanceId||i.timethis.deactivateInstance("tabs")),3e4)))},new((i=void 0)||(i=Promise))((function(e,s){function r(e){try{c(o.next(e))}catch(e){s(e)}}function a(e){try{c(o.throw(e))}catch(e){s(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(r,a)}c((o=o.apply(t,n||[])).next())}));var t,n,i,o},this.log=(0,l.kg)("INSTANCE"),this.instanceId=o.Z}get deactivatedReason(){return this.deactivated}start(){if(this.reset(),!this.started){this.started=!0,c.Z.addEventListener("change",this.checkInstance),setInterval(this.checkInstance,5e3),this.checkInstance();try{document.documentElement.addEventListener("beforeunload",this.clearInstance)}catch(e){}}}reset(){this.masterInstance=!1,this.clearDeactivateTimeout(),this.deactivated=void 0}activateInstance(){this.deactivated&&(this.reset(),this.checkInstance(!1),this.dispatchEvent("activated"))}deactivateInstance(e){this.masterInstance||this.deactivated||(this.log.warn("deactivate",e),this.clearDeactivateTimeout(),this.deactivated=e,this.dispatchEvent("deactivated",e))}clearDeactivateTimeout(){this.deactivateTimeout&&(clearTimeout(this.deactivateTimeout),this.deactivateTimeout=0)}}const p=new m;i.GO&&(i.GO.singleInstance=p);const f=p},2831:(e,t,n)=>{n.r(t),n.d(t,{TelegramMeWebManager:()=>c,default:()=>d});var s=n(4159),i=n(410),o=n(1267),r=n(7298),a=n(7487);class c{constructor(){this.disabled=o.Z.test||!s.Z.domains.includes(location.hostname)}setAuthorized(e){if(!this.disabled)return a.Z.get("tgme_sync").then((t=>{const n=(0,r.Z)(!0);if(e&&(null==t?void 0:t.canRedirect)===e&&t.ts+86400>n)return;a.Z.set({tgme_sync:{canRedirect:e,ts:n}});const i=`_websync_?authed=${e?"1":"0"}&version=${encodeURIComponent(s.Z.version+" "+s.Z.suffix)}`,o=["//telegram.me/"+i,"//t.me/"+i].map((e=>function(e){const t=document.createElement("script"),n=new Promise((e=>{t.onload=t.onerror=()=>{e(t)}}));return t.src=e,document.body.appendChild(t),n}(e).then((e=>{e.remove()}))));return Promise.all(o)}))}}const l=new c;i.GO&&(i.GO.telegramMeWebManager=l);const d=l},6702:(e,t,n)=>{n.r(t),n.d(t,{WebPushApiManager:()=>h,default:()=>m});var s=n(410),i=n(5003),o=n(3855),r=n(2325),a=n(4762),c=n(1722),l=n(8479),d=n(490),u=n(3241);class h extends u.Z{constructor(){super(!1),this.isAvailable=!0,this.isPushEnabled=!1,this.localNotificationsAvailable=!0,this.started=!1,this.settings={},this.isFirefox=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,this.userVisibleOnly=!this.isFirefox,this.log=(0,i.kg)("PM"),this.subscribe=()=>{this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.subscribe({userVisibleOnly:this.userVisibleOnly}).then((e=>{this.isPushEnabled=!0,this.pushSubscriptionNotify("subscribe",e)})).catch((e=>{"denied"===Notification.permission?this.log("Permission for Notifications was denied"):(this.log("Unable to subscribe to push.",e),this.userVisibleOnly||(this.userVisibleOnly=!0,setTimeout(this.subscribe,0)))}))}))},this.isAliveNotify=()=>{if(!this.isAvailable||d.Z.deactivatedReason)return;this.settings.baseUrl=(location.href||"").replace(/#.*$/,"");const e={},t={push_action_mute1d:a.IS_MOBILE?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:a.IS_MOBILE?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const n in t)e[n]=r.ZP.format(t[n],!0);o.Z.serviceMessagePort.invokeVoid("pushPing",{localNotifications:this.localNotificationsAvailable,lang:e,settings:this.settings}),this.isAliveTO=setTimeout(this.isAliveNotify,1e4)},"PushManager"in window&&"Notification"in window&&"serviceWorker"in navigator||(this.log.warn("Push messaging is not supported."),this.isAvailable=!1,this.localNotificationsAvailable=!1),this.isAvailable&&"denied"===Notification.permission&&this.log.warn("The user has blocked notifications.")}start(){this.started||(this.started=!0,this.getSubscription(),this.setUpServiceWorkerChannel())}setLocalNotificationsDisabled(){this.localNotificationsAvailable=!1}getSubscription(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!!e,this.pushSubscriptionNotify("init",e)})).catch((e=>{this.log.error("Error during getSubscription()",e)}))}))}unsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!1,e&&(this.pushSubscriptionNotify("unsubscribe",e),setTimeout((()=>{e.unsubscribe().then((e=>{this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))}),3e3))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}forceUnsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.log.warn("force unsubscribe",e),e&&e.unsubscribe().then((e=>{this.log.warn("force unsubscribe successful",e),this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}setSettings(e){this.settings=(0,l.Z)(e),clearTimeout(this.isAliveTO),this.isAliveNotify()}hidePushNotifications(){this.isAvailable&&o.Z.serviceMessagePort.invokeVoid("notificationsClear",void 0)}setUpServiceWorkerChannel(){this.isAvailable&&(o.Z.serviceMessagePort.addEventListener("pushClick",(e=>{d.Z.deactivatedReason?c.Z.reload():this.dispatchEvent("push_notification_click",e)})),navigator.serviceWorker.ready.then(this.isAliveNotify))}pushSubscriptionNotify(e,t){if(t){const n=t.toJSON();if(!(n&&n.endpoint&&n.keys&&n.keys.p256dh&&n.keys.auth))return this.log.warn("Invalid push subscription",n),this.unsubscribe(),this.isAvailable=!1,void this.pushSubscriptionNotify(e);this.log.warn("Push",e,n),this.dispatchEvent("push_"+e,{tokenType:10,tokenValue:JSON.stringify(n)})}else this.log.warn("Push",e,!1),this.dispatchEvent("push_"+e,!1)}}const g=new h;s.GO&&(s.GO.webPushApiManager=g);const m=g},9043:(e,t,n)=>{n.d(t,{Z:()=>d});var s=n(410),i=n(5783),o=n(4762),r=n(5003),a=n(3855),c=function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function r(e){try{c(s.next(e))}catch(e){o(e)}}function a(e){try{c(s.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,a)}c((s=s.apply(e,t||[])).next())}))};const l=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=(0,r.kg)("OPUS",r.v9.Error)}isPlaySupported(){return i.Z}loadWavWorker(){this.wavWorker||(this.wavWorker=new Worker("waveWorker.min.js"),this.wavWorker.addEventListener("message",(e=>{const t=e.data;if(this.log("[WAV] got message:",t),t&&t.page){const e=t.page;this.onTaskEnd(this.tasks.shift(),e)}})))}loadWorker(){this.worker||(this.worker=new Worker("decoderWorker.min.js"),this.worker.addEventListener("message",(e=>{const t=e.data;this.log("[DECODER] got message",t),"done"===t.type?(this.wavWorker.postMessage({command:"done"}),t.waveform&&(this.tasks[0].waveform=t.waveform)):this.wavWorker.postMessage({command:"encode",buffers:e.data},o.IS_SAFARI?void 0:t.map((e=>e.buffer)))})))}setKeepAlive(e){this.keepAlive=e,this.keepAlive?(this.loadWorker(),this.loadWavWorker()):this.tasks.length||this.terminateWorkers()}onTaskEnd(e,t){t?(clearTimeout(e.timeout),e.callback.resolve({bytes:t,waveform:e.waveform})):e.callback.reject("timeout"),this.tasks.length&&this.executeNewTask(this.tasks[0]),this.terminateWorkers()}terminateWorkers(e=!1){(!this.keepAlive&&!this.tasks.length||e)&&(this.worker&&(this.worker.terminate(),this.worker=null),this.wavWorker&&(this.wavWorker.terminate(),this.wavWorker=null))}executeNewTask(e){this.worker.postMessage({command:"init",decoderSampleRate:this.sampleRate,outputBufferSampleRate:this.sampleRate}),this.wavWorker.postMessage({command:"init",wavBitDepth:16,wavSampleRate:this.sampleRate}),this.log("[DECODER] send decode"),this.worker.postMessage({command:"decode",pages:e.pages,waveform:e.withWaveform},o.IS_SAFARI?void 0:[e.pages.buffer]),e.timeout=window.setTimeout((()=>{this.log.error("decode timeout"),this.terminateWorkers(!0),this.tasks.length&&(this.loadWorker(),this.loadWavWorker()),this.onTaskEnd(this.tasks.shift())}),1e4)}pushDecodeTask(e,t){return new Promise(((n,s)=>{const i={pages:e,withWaveform:t,callback:{resolve:n,reject:s},timeout:0};this.loadWorker(),this.loadWavWorker(),1===this.tasks.push(i)&&this.executeNewTask(i)}))}decode(e,t=!1){return c(this,void 0,void 0,(function*(){return this.pushDecodeTask(e,t).then((e=>c(this,void 0,void 0,(function*(){const t=new Blob([e.bytes],{type:"audio/wav"});return{url:yield a.Z.invoke("createObjectURL",t),waveform:e.waveform}}))))}))}};s.GO.opusDecodeController=l;const d=l},2423:(e,t,n)=>{n.d(t,{$2:()=>h,E:()=>g,Hk:()=>p,QB:()=>m,SC:()=>f,bu:()=>l,it:()=>c,kO:()=>b,tY:()=>v});var s=n(1229);const i="a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",o="0-9_"+i,r="["+i+"0-9]",a="((?:https?|ftp)://|mailto:)?",c=a+"(?:"+r+"{1,64}(?::"+r+"{0,64})?@)?(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|"+r+"["+i+"·0-9-]{0,64}(?:\\."+r+"["+i+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+i+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",l=(new RegExp("^"+a.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),d="[a-zA-Z\\d_]{5,32}",u="\\/([a-zA-Z\\d_]{1,32})(?:@("+d+"))?(\\b|$)",h=new RegExp("(^| )(@)("+d+")|("+c+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#["+o+"]{2,64})|(^|\\s)"+u,"i"),g=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,m=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,p={Telegram:"tg://search_hashtag?hashtag={1}",Twitter:"https://twitter.com/hashtag/{1}",Instagram:"https://instagram.com/explore/tags/{1}/","Google Plus":"https://plus.google.com/explore/{1}"},f={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},v=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in f)v.add(f[e]);const b=/^\+\d+$/},3591:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(2423),i=n(410),o=n(6637),r=n(1507);function a(e,t){(0,o.Z)(e)||(e="https://"+e);const n={url:e};let i,a,c,l;if(i=e.match(/^(?:https?:\/\/)?(?:(.+?)\.)?(?:(?:web|k|z)\.)?t(?:elegram)?\.me(?:\/(.+))?/)){const t=new URL(e);let n=i[1];n&&r.BX.has(i[1])&&(n=void 0),n&&(t.pathname=n+("/"===t.pathname?"":t.pathname));const o=t.pathname.slice(1),a=o.split("/");if(a[0]&&"$"===a[0][0]&&a[0].length>1)l="invoice";else if(/^\W/.test(o)&&!s.kO.test(o))l="joinchat";else switch(a[0]){case"joinchat":case"addstickers":case"addemoji":case"voicechat":case"invoice":if(1!==a.length&&!n){l=a[0];break}default:if(a[1]&&a[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===a.length){l="im";break}}}else(a=e.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?l="im":(c=e.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(l="tg_"+c[1]);return window[l]||(l=void 0),n.onclick=l,n}i.GO&&(i.GO.wrapUrl=a)},3512:(e,t,n)=>{n.d(t,{Z:()=>d});var s=n(1507),i=n(3241),o=n(410),r=n(3206),a=n(1352);class c extends i.Z{constructor(){super(),this.myId=s.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("premium_toggle_private",(({isNew:e,isPremium:t})=>{this.premium=t,e||this.dispatchEventSingle("premium_toggle",t)})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),r.Z.getInstance().invokeVoid("event",{name:e,args:t})},a.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}getPremium(){return this.premium}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const l=new c;o.GO.rootScope=l;const d=l},7730:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(410),i=n(3725);const o=new class{constructor(){this.convertPromises={}}init(){this.worker=new Worker(new URL(n.p+n.u(61),n.b)),this.worker.addEventListener("message",(e=>{const t=e.data.payload,n=this.convertPromises[t.fileName];n&&(t.bytes?n.resolve(t.bytes):n.reject(),delete this.convertPromises[t.fileName])}))}postMessage(e){this.init&&(this.init(),this.init=null),this.worker.postMessage(e)}convert(e,t){if(this.convertPromises.hasOwnProperty(e))return this.convertPromises[e];const n=(0,i.Z)();return this.postMessage({type:"convertWebp",payload:{fileName:e,bytes:t}}),this.convertPromises[e]=n}};s.GO.webpWorkerController=o;const r=o}},r={};function a(e){var t=r[e];if(void 0!==t)return t.exports;var n=r[e]={exports:{}};return o[e].call(n.exports,n,n.exports,a),n.exports}a.m=o,e=[],a.O=(t,n,s,i)=>{if(!n){var o=1/0;for(d=0;d=i)&&Object.keys(a.O).every((e=>a.O[e](n[c])))?n.splice(c--,1):(r=!1,i0&&e[d-1][2]>i;d--)e[d]=e[d-1];e[d]=[n,s,i]},a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,a.t=function(e,s){if(1&s&&(e=this(e)),8&s)return e;if("object"==typeof e&&e){if(4&s&&e.__esModule)return e;if(16&s&&"function"==typeof e.then)return e}var i=Object.create(null);a.r(i);var o={};t=t||[null,n({}),n([]),n(n)];for(var r=2&s&&e;"object"==typeof r&&!~t.indexOf(r);r=n(r))Object.getOwnPropertyNames(r).forEach((t=>o[t]=()=>e[t]));return o.default=()=>e,a.d(i,o),i},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((t,n)=>(a.f[n](e,t),t)),[])),a.u=e=>(({589:"crypto.worker",630:"npm.qr-code-styling",670:"sw",678:"mtproto.worker"}[e]||e)+"."+{8:"570e6da51a125009c156",53:"77c5dab45a68d1851187",61:"5322bb4d26ac11c98a86",63:"0d39a81590990db74d39",77:"18305e1bd331a0fdd36c",104:"f1e35ff90b4ddd68a9d8",231:"4dbf43eb5012e83665e1",301:"42dc636f96a62f6a08c8",339:"79c7f9c2341eeff66b88",392:"198d4679664c1bf4c989",436:"47558d0a092967b3c966",437:"d40e517d52e5dcf3b754",442:"645fe71c30545d9700d2",460:"ecea63a28e50b5f10803",508:"52f2ca7abd721f25f9ec",539:"17a0b07b4e6476f19654",589:"574dd04f2dfaff484dc3",630:"2c5d57550714b1a9e42e",641:"11406cec52b05304f14f",642:"fd1ade69544ad78671c6",670:"ba14f2a9396f7e4e1890",678:"5f4ea67830e476bd70ac",709:"73c949c4c6702cdf349b",776:"b547f5293903351f3ec7",781:"af546badf2c525815889",783:"827711558099e62fd694",810:"f272bad8a3948af5c8d0",813:"06763bece6721fb81fde"}[e]+".chunk.js"),a.miniCssF=e=>{},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s={},i="tweb:",a.l=(e,t,n,o)=>{if(s[e])s[e].push(t);else{var r,c;if(void 0!==n)for(var l=document.getElementsByTagName("script"),d=0;d{r.onerror=r.onload=null,clearTimeout(g);var i=s[e];if(delete s[e],r.parentNode&&r.parentNode.removeChild(r),i&&i.forEach((e=>e(n))),t)return t(n)},g=setTimeout(h.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=h.bind(null,r.onerror),r.onload=h.bind(null,r.onload),c&&document.head.appendChild(r)}},a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var t=a.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{if(void 0!==a){var e=a.u,t=a.e,n={},s={};a.u=function(t){return e(t)+(n.hasOwnProperty(t)?"?"+n[t]:"")},a.e=function(i){return t(i).catch((function(t){var o=s.hasOwnProperty(i)?s[i]:999999;if(o<1){var r=e(i);throw t.message="Loading chunk "+i+" failed after 999999 retries.\n("+r+")",t.request=r,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();n[i]=t,s[i]=o-1,e(a.e(i))}),3e3)}))}))}}})(),(()=>{a.b=document.baseURI||self.location.href;var e={179:0};a.f.j=(t,n)=>{var s=a.o(e,t)?e[t]:void 0;if(0!==s)if(s)n.push(s[2]);else{var i=new Promise(((n,i)=>s=e[t]=[n,i]));n.push(s[2]=i);var o=a.p+a.u(t),r=new Error;a.l(o,(n=>{if(a.o(e,t)&&(0!==(s=e[t])&&(e[t]=void 0),s)){var i=n&&("load"===n.type?"missing":n.type),o=n&&n.target&&n.target.src;r.message="Loading chunk "+t+" failed.\n("+i+": "+o+")",r.name="ChunkLoadError",r.type=i,r.request=o,s[1](r)}}),"chunk-"+t,t)}},a.O.j=t=>0===e[t];var t=(t,n)=>{var s,i,[o,r,c]=n,l=0;if(o.some((t=>0!==e[t]))){for(s in r)a.o(r,s)&&(a.m[s]=r[s]);if(c)var d=c(a)}for(t&&t(n);la(2938)));c=a.O(c)})(); -//# sourceMappingURL=main.bbbd3ab7eee67888ee7a.bundle.js.map \ No newline at end of file diff --git a/public/main.bbbd3ab7eee67888ee7a.bundle.js.map b/public/main.bbbd3ab7eee67888ee7a.bundle.js.map deleted file mode 100644 index 4407c229..00000000 --- a/public/main.bbbd3ab7eee67888ee7a.bundle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"main.bbbd3ab7eee67888ee7a.bundle.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/create fake namespace object","webpack://tweb/webpack/runtime/load script","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/state.ts","webpack://tweb/./src/helpers/getTimeFormat.ts","webpack://tweb/./src/environment/appleMx.ts","webpack://tweb/./src/environment/callSupport.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/canvasFilterSupport.ts","webpack://tweb/./src/environment/emojiSupport.ts","webpack://tweb/./src/environment/geolocationSupport.ts","webpack://tweb/./src/environment/groupCallSupport.ts","webpack://tweb/./src/environment/imageMimeTypesSupport.ts","webpack://tweb/./src/environment/mediaMimeTypesSupport.ts","webpack://tweb/./src/environment/movSupport.ts","webpack://tweb/./src/environment/opusSupport.ts","webpack://tweb/./src/environment/parallaxSupport.ts","webpack://tweb/./src/environment/screenSharingSupport.ts","webpack://tweb/./src/environment/sharedWorkerSupport.ts","webpack://tweb/./src/environment/touchSupport.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/vibrateSupport.ts","webpack://tweb/./src/environment/videoMimeTypesSupport.ts","webpack://tweb/./src/environment/webmSupport.ts","webpack://tweb/./src/environment/webpSupport.ts","webpack://tweb/./src/environment/webrtcSupport.ts","webpack://tweb/./src/helpers/color.ts","webpack://tweb/./src/helpers/compareVersion.ts","webpack://tweb/./src/helpers/dom/blurActiveElement.ts","webpack://tweb/./src/helpers/dom/cancelEvent.ts","webpack://tweb/./src/helpers/dom/findUpClassName.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInput.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack://tweb/./src/helpers/dom/installPrompt.ts","webpack://tweb/./src/helpers/dom/loadFonts.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/helpers/idleController.ts","webpack://tweb/./src/helpers/overlayCounter.ts","webpack://tweb/./src/helpers/schedulers.ts","webpack://tweb/./src/helpers/string/parseUriParams.ts","webpack://tweb/./src/helpers/themeController.ts","webpack://tweb/./src/helpers/setWorkerProxy.ts","webpack://tweb/./src/environment/installPrompt.ts","webpack://tweb/./src/index.ts","webpack://tweb/./src/helpers/dom/toggleAttributePolyfill.ts","webpack://tweb/./src/lib/appManagers/appRuntimeManager.ts","webpack://tweb/./src/lib/appManagers/getProxiedManagers.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/environment/index.ts","webpack://tweb/./src/lib/appManagers/utils/state/loadState.ts","webpack://tweb/./src/lib/mtproto/mtprotoworker.ts","webpack://tweb/./src/lib/mtproto/singleInstance.ts","webpack://tweb/./src/lib/mtproto/telegramMeWebManager.ts","webpack://tweb/./src/helpers/dom/loadScript.ts","webpack://tweb/./src/lib/mtproto/webPushApiManager.ts","webpack://tweb/./src/lib/opusDecodeController.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/webp/webpWorkerController.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/jsonp chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"tweb:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t};\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppMediaPlaybackController} from '../components/appMediaPlaybackController';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport getTimeFormat from '../helpers/getTimeFormat';\nimport {nextRandomUint} from '../helpers/random';\nimport {AutoDownloadSettings, BaseTheme, NotifyPeer, PeerNotifySettings, Theme, ThemeSettings, WallPaper} from '../layer';\nimport {TopPeerType, MyTopPeer} from '../lib/appManagers/appUsersManager';\nimport DialogsStorage from '../lib/storages/dialogs';\nimport FiltersStorage from '../lib/storages/filters';\nimport {AuthState, Modify} from '../types';\nimport App from './app';\n\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\n// ! DEPRECATED\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type AppTheme = Modify\n}>;\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n // contactsList: UserId[],\n contactsListCachedTime: number,\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n // filters?: FiltersStorage['filters'], // ! DEPRECATED\n filtersArr?: FiltersStorage['filtersArr'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n recentCustomEmoji: DocId[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts?: boolean, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: AppTheme[],\n theme: AppTheme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n playbackParams: ReturnType,\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings}\n};\n\n// const BACKGROUND_DAY_MOBILE: Background = {\n// blur: false,\n// slug: '',\n// color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n// highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n// intensity: 0,\n// id: '1'\n// };\n\n// const BACKGROUND_NIGHT_MOBILE: Background = {\n// blur: false,\n// slug: '',\n// color: '#0f0f0f',\n// highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)',\n// intensity: 0,\n// id: '-1'\n// };\n\nexport const DEFAULT_THEME: Theme = {\n _: 'theme',\n access_hash: '',\n id: '',\n settings: [{\n _: 'themeSettings',\n pFlags: {},\n base_theme: {_: 'baseThemeClassic'},\n accent_color: 0x3390ec,\n message_colors: [0x4fae4e],\n wallpaper: {\n _: 'wallPaper',\n pFlags: {\n default: true,\n pattern: true\n },\n access_hash: '',\n document: undefined,\n id: '',\n slug: 'pattern',\n settings: {\n _: 'wallPaperSettings',\n pFlags: {},\n intensity: 50,\n background_color: 0xdbddbb,\n second_background_color: 0x6ba587,\n third_background_color: 0xd5d88d,\n fourth_background_color: 0x88b884\n }\n }\n }, {\n _: 'themeSettings',\n pFlags: {},\n base_theme: {_: 'baseThemeNight'},\n accent_color: 0x8774E1,\n message_colors: [0x8774E1],\n wallpaper: {\n _: 'wallPaper',\n pFlags: {\n default: true,\n pattern: true,\n dark: true\n },\n access_hash: '',\n document: undefined,\n id: '',\n slug: 'pattern',\n settings: {\n _: 'wallPaperSettings',\n pFlags: {},\n intensity: -50,\n background_color: 0xfec496,\n second_background_color: 0xdd6cb9,\n third_background_color: 0x962fbf,\n fourth_background_color: 0x4f5bd5\n }\n }\n }],\n slug: '',\n title: '',\n emoticon: '🏠',\n pFlags: {default: true}\n};\n\nconst makeDefaultAppTheme = (\n name: AppTheme['name'],\n baseTheme: BaseTheme['_'],\n highlightningColor: string\n): AppTheme => {\n return {\n ...DEFAULT_THEME,\n name,\n settings: {\n ...DEFAULT_THEME.settings.find((s) => s.base_theme._ === baseTheme),\n highlightningColor\n }\n };\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n // contactsList: [],\n contactsListCachedTime: 0,\n updates: {},\n filtersArr: [],\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n recentCustomEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [\n makeDefaultAppTheme('day', 'baseThemeClassic', 'hsla(86.4, 43.846153%, 45.117647%, .4)'),\n makeDefaultAppTheme('night', 'baseThemeNight', 'hsla(299.142857, 44.166666%, 37.470588%, .4)')\n ],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat()\n },\n playbackParams: {\n volume: 1,\n muted: false,\n playbackRate: 1,\n playbackRates: {\n voice: 1,\n video: 1,\n audio: 1\n },\n loop: false,\n round: false\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32),\n notifySettings: {}\n};\n","export default function getTimeFormat(): 'h12' | 'h23' {\n // try {\n // const resolvedOptions = Intl.DateTimeFormat(navigator.language, {hour: 'numeric'}).resolvedOptions();\n // if('hourCycle' in resolvedOptions) {\n // return (resolvedOptions as any).hourCycle === 'h12' ? 'h12' : 'h23';\n // } else {\n // return resolvedOptions.hour12 ? 'h12' : 'h23';\n // }\n // } catch(err) {\n return new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23';\n // }\n}\n","let IS_APPLE_MX = false;\n\ntry {\n // Awesome detect from https://stackoverflow.com/a/65412357\n const ctx = document.createElement('canvas').getContext('webgl');\n const extension = ctx.getExtension('WEBGL_debug_renderer_info');\n const renderer: string = extension && ctx.getParameter(extension.UNMASKED_RENDERER_WEBGL) || '';\n if((renderer.match(/Apple/) && !renderer.match(/Apple GPU/)) ||\n ctx.getSupportedExtensions().indexOf('WEBGL_compressed_texture_s3tc_srgb') === -1) {\n IS_APPLE_MX = true;\n }\n} catch(err) {\n\n}\n\nexport default IS_APPLE_MX;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_CALL_SUPPORTED;\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_CANVAS_FILTER_SUPPORTED = 'filter' in (document.createElement('canvas').getContext('2d') || {});\n\nexport default IS_CANVAS_FILTER_SUPPORTED;\n","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\n\nexport default IS_EMOJI_SUPPORTED;\n","const IS_GEOLOCATION_SUPPORTED = !!navigator?.geolocation?.getCurrentPosition && false;\n\nexport default IS_GEOLOCATION_SUPPORTED;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_GROUP_CALL_SUPPORTED;\n","import IS_WEBP_SUPPORTED from './webpSupport';\n\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/bmp'\n]);\n\nif(IS_WEBP_SUPPORTED) {\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\n}\n\nexport default IMAGE_MIME_TYPES_SUPPORTED;\n","import IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\n\nconst arr = [...IMAGE_MIME_TYPES_SUPPORTED].concat([...VIDEO_MIME_TYPES_SUPPORTED]);\n\nconst MEDIA_MIME_TYPES_SUPPORTED = new Set(arr);\n\nexport default MEDIA_MIME_TYPES_SUPPORTED;\n","import {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\n\n// mov is not supported in Chrome on macOS\nconst IS_MOV_SUPPORTED = !!document.createElement('video').canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\n\nexport default IS_MOV_SUPPORTED;\n","const audio = document.createElement('audio');\nconst IS_OPUS_SUPPORTED = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\n\nexport default IS_OPUS_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default IS_PARALLAX_SUPPORTED;\n","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\n\nexport default IS_SCREEN_SHARING_SUPPORTED;\n","import Modes from '../config/modes';\n\nconst IS_SHARED_WORKER_SUPPORTED = typeof(SharedWorker) !== 'undefined' && !Modes.noSharedWorker/* && false */;\n\nexport default IS_SHARED_WORKER_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// @ts-ignore\nconst IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\nexport default IS_TOUCH_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || navigator.maxTouchPoints > 0) && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","import IS_MOV_SUPPORTED from './movSupport';\n\nexport type VIDEO_MIME_TYPE = 'image/gif' | 'video/mp4' | 'video/webm' | 'video/quicktime';\nconst VIDEO_MIME_TYPES_SUPPORTED: Set = new Set([\n 'image/gif', // have to display it as video\n 'video/mp4',\n 'video/webm'\n]);\n\nif(IS_MOV_SUPPORTED) {\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\n}\n\nexport default VIDEO_MIME_TYPES_SUPPORTED;\n","import {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\n\nconst IS_WEBM_SUPPORTED = !!document.createElement('video').canPlayType('video/webm') && !IS_SAFARI && !IS_APPLE_MOBILE;\n\nexport default IS_WEBM_SUPPORTED;\n","const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_WEBRTC_SUPPORTED = !!(typeof(RTCPeerConnection) !== 'undefined' && !IS_FIREFOX);\n\nexport default IS_WEBRTC_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type ColorHsla = {\n h: number,\n s: number,\n l: number,\n a: number\n};\n\nexport type ColorRgba = [number, number, number, number];\nexport type ColorRgb = [number, number, number];\n\n/**\n * https://stackoverflow.com/a/54070620/6758968\n * r, g, b in [0, 255]\n * @returns h in [0,360) and s, v in [0,1]\n */\nexport function rgbToHsv(r: number, g: number, b: number): [number, number, number] {\n r /= 255, g /= 255, b /= 255;\n const v = Math.max(r, g, b),\n c = v - Math.min(r, g, b);\n const h = c && ((v === r) ? (g - b ) / c : ((v == g) ? 2 + (b - r) / c : 4 + (r - g) / c));\n return [60 * (h < 0 ? h + 6 : h), v && c / v, v];\n}\n\n/**\n * https://stackoverflow.com/a/54024653/6758968\n * @param h [0, 360]\n * @param s [0, 1]\n * @param v [0, 1]\n * @returns r, g, b in [0, 255]\n */\nexport function hsvToRgb(h: number, s: number, v: number): ColorRgb {\n const f = (n: number, k: number = (n + h / 60) % 6) => Math.round((v - v * s * Math.max(Math.min(k, 4 - k, 1), 0)) * 255);\n return [f(5), f(3), f(1)];\n}\n\n/**\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\n */\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\n r /= 255, g /= 255, b /= 255;\n const max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n let h: number, s: number;\n const l = (max + min) / 2;\n\n if(max === min) {\n h = s = 0; // achromatic\n } else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch(max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return {\n h: h * 360,\n s: s * 100,\n l: l * 100,\n a\n };\n}\n\n// * https://stackoverflow.com/a/9493060/6758968\n/**\n * Converts an HSL color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n *\n * @param {number} h The hue [0, 360]\n * @param {number} s The saturation [0, 1]\n * @param {number} l The lightness [0, 1]\n * @return {Array} The RGB representation [0, 255]\n */\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\n h /= 360, s /= 100, l /= 100;\n let r: number, g: number, b: number;\n\n if(s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\n if(t < 0) t += 1;\n if(t > 1) t -= 1;\n if(t < 1/6) return p + (q - p) * 6 * t;\n if(t < 1/2) return q;\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n }\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n\n return [r, g, b, a].map((v) => Math.round(v * 255)) as ColorRgba;\n}\n\nexport function hslaStringToRgba(hsla: string) {\n const splitted = hsla.slice(5, -1).split(', ');\n const alpha = +splitted.pop();\n const arr = splitted.map((val) => {\n if(val.endsWith('%')) {\n return +val.slice(0, -1);\n }\n\n return +val;\n });\n\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\n}\n\nexport function hexaToRgba(hexa: string) {\n const arr: ColorRgba = [] as any;\n const offset = hexa[0] === '#' ? 1 : 0;\n if(hexa.length === (5 + offset)) {\n hexa = (offset ? '#' : '') + '0' + hexa.slice(offset);\n }\n\n if(hexa.length === (3 + offset)) {\n for(let i = offset; i < hexa.length; ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n } else if(hexa.length === (4 + offset)) {\n for(let i = offset; i < (hexa.length - 1); ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n\n arr.push(parseInt(hexa[hexa.length - 1], 16));\n } else {\n for(let i = offset; i < hexa.length; i += 2) {\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\n }\n }\n\n return arr;\n}\n\nexport function hexToRgb(hex: string) {\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\n}\n\nexport function hexaToHsla(hexa: string) {\n const rgba = hexaToRgba(hexa);\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\n}\n\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\n return '#' + rgba.map((v) => ('0' + v.toString(16)).slice(-2)).join('');\n}\n\nexport function hslaStringToHexa(hsla: string) {\n return rgbaToHexa(hslaStringToRgba(hsla));\n}\n\nexport function hslaStringToHex(hsla: string) {\n return hslaStringToHexa(hsla).slice(0, -2);\n}\n","export default function compareVersion(v1: string, v2: string): number {\n v1 = v1.split(' ', 1)[0];\n v2 = v2.split(' ', 1)[0];\n const s1 = v1.split('.');\n const s2 = v2.split('.');\n\n for(let i = 0; i < s1.length; ++i) {\n const v1 = +s1[i];\n const v2 = +s2[i];\n if(v1 > v2) return 1;\n else if(v1 < v2) return -1;\n }\n\n return 0;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function blurActiveElement() {\n if((document.activeElement as HTMLInputElement)?.blur) {\n (document.activeElement as HTMLInputElement).blur();\n return true;\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function cancelEvent(event?: Event) {\n event ||= window.event;\n if(event) {\n if(!event.cancelable) {\n return false;\n }\n\n // @ts-ignore\n event = event.originalEvent || event;\n\n try {\n if(event.stopPropagation) event.stopPropagation();\n if(event.preventDefault) event.preventDefault();\n event.returnValue = false;\n event.cancelBubble = true;\n } catch(err) {}\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// export function findUpClassName(el: any, className: string): T;\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\n return (el as any).closest('.' + className);\n /* if(el.classList.contains(className)) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.classList.contains(className))\n return el;\n }\n return null; */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {doubleRaf} from '../schedulers';\n\nexport default function fixSafariStickyInput(input: HTMLElement) {\n input.style.transform = 'translateY(-99999px)';\n /* input.style.position = 'fixed';\n input.style.top = '-99999px';\n input.style.left = '0'; */\n input.focus();\n\n // setTimeout(() => {\n doubleRaf().then(() => {\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n /* input.style.position = '';\n input.style.top = ''; */\n input.style.transform = '';\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n\n /* setTimeout(() => {\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\n }, 50); */\n });\n // }, 0);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport findUpClassName from './findUpClassName';\nimport fixSafariStickyInput from './fixSafariStickyInput';\n\nexport const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED;\n\nif(IS_STICKY_INPUT_BUGGED) {\n const key: 'clientY' | 'pageY' = 'clientY';\n let startY = 0;\n const o = {capture: true, passive: false};\n const onTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0];\n\n // console.log('touchmove y', touch[key], startY);\n\n const scrollable = findUpClassName(touch.target, 'scrollable-y');\n if(scrollable) {\n const y = touch[key];\n const scrolled = startY - y;\n\n /* if(y < startY) {\n startY = y;\n } */\n\n const scrollTop = scrollable.scrollTop;\n const scrollHeight = scrollable.scrollHeight;\n const clientHeight = scrollable.clientHeight;\n const nextScrollTop = scrollTop ? Math.round(scrollTop + scrollable.clientHeight + scrolled) : scrollTop + scrolled;\n // const needCancel = scrollHeight !== clientHeight ? (scrollTop && diff <= 1) || (scrollTop - diff) < 0 : true;\n const needCancel = scrollHeight === clientHeight || nextScrollTop >= scrollHeight || nextScrollTop <= 0;\n if(needCancel) {\n e.preventDefault();\n }\n\n // console.log('touchmove with scrollable', scrollTop, startY, scrolled, nextScrollTop, needCancel, e.cancelable);\n } else {\n e.preventDefault();\n\n // console.log('touchmove no scrollable', e, touch);\n }\n\n // if(e.target === document.documentElement || e.target === document.body) e.preventDefault();\n };\n\n // let el = document.createElement('div');\n // document.body.prepend(el);\n // let a = 0;\n\n // let hasFocus = false;\n let lastFocusOutTimeStamp = 0;\n document.addEventListener('focusin', (e) => {\n if(!(e.target as HTMLElement).classList.contains('is-sticky-input-bugged') || (e.timeStamp - lastFocusOutTimeStamp) < 50/* && document.activeElement === input */) {\n return;\n }\n\n // console.log('focusin', e, e.timeStamp);\n\n // hasFocus = true;\n // document.body.classList.add('is-keyboard-opened');\n\n // el.innerText = 'focusin ' + ++a;\n\n /* a < 2 && */fixSafariStickyInput(e.target as HTMLElement);\n\n document.addEventListener('touchmove', onTouchMove, o);\n document.addEventListener('touchstart', (e) => {\n if(e.touches.length > 1) return;\n const touchStart = e.touches[0];\n\n startY = touchStart[key];\n });\n }, {passive: true});\n\n document.addEventListener('focusout', (e) => {\n // console.log('focusout', e, e.timeStamp);\n document.removeEventListener('touchmove', onTouchMove, o);\n\n lastFocusOutTimeStamp = e.timeStamp;\n\n // el.innerText = 'focusout ' + ++a;\n\n // if(hasFocus) {\n // hasFocus = false;\n // document.body.classList.remove('is-keyboard-opened');\n // }\n }, {passive: true});\n\n document.addEventListener('visibilitychange', () => {\n // console.log('window visibilitychange');\n if(document.activeElement &&\n document.activeElement.classList.contains('is-sticky-input-bugged') &&\n (document.activeElement as HTMLElement).blur) {\n fixSafariStickyInput(document.activeElement as HTMLElement);\n }\n\n /* blurActiveElement();\n window.scrollTo(0, 0);\n setVH(); */\n }, {passive: true});\n}\n\nexport default function fixSafariStickyInputFocusing(input: HTMLElement) {\n if(!IS_STICKY_INPUT_BUGGED) return;\n input.classList.add('is-sticky-input-bugged');\n}\n","let callback: () => Promise;\nexport default function cacheInstallPrompt() {\n window.addEventListener('beforeinstallprompt', (deferredPrompt: any) => {\n callback = async() => {\n deferredPrompt.prompt();\n const {outcome} = await deferredPrompt.userChoice;\n const installed = outcome === 'accepted';\n if(installed) {\n callback = undefined;\n }\n };\n });\n}\n\nexport function getInstallPrompt() {\n return callback;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from '../noop';\nimport pause from '../schedulers/pause';\n\nconst texts = ['b', 'б'];\ntype FontType = 'text' | 'icons' | 'monospace';\n\nconst cache: {\n [key: string]: {\n [text: string]: Promise\n }\n} = {};\n\nconst fonts: {[type in FontType]: string} = {\n text: 'Roboto',\n icons: 'tgico',\n monospace: 'Roboto Mono'\n};\n\nexport default function loadFonts(types: {[type in FontType]?: string[] | 'all'} = {\n text: texts,\n icons: undefined,\n monospace: texts\n}): Promise {\n if(!('fonts' in document)) {\n return Promise.resolve();\n }\n\n const promises: Promise[] = [];\n for(const type in types) {\n let _texts = types[type as FontType];\n if(_texts === 'all') {\n _texts = texts;\n }\n\n const font = fonts[type as FontType];\n const weights = type === 'icons' ? [500] : [400, 500];\n for(const weight of weights) {\n const _promises = (_texts || [undefined]).map((text) => {\n const key = [weight, '1rem', font].join(' ');\n const promise = (cache[key] ??= {})[text || ''] ??= document.fonts.load(key, text);\n return promise;\n });\n promises.push(..._promises);\n }\n }\n\n return Promise.race([\n Promise.all(promises).catch(noop),\n pause(1000)\n ]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import I18n from '../../lib/langPack';\n\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment | Element) {\n setDirection(elem);\n if(typeof(html) === 'string') {\n if(!html) elem.replaceChildren();\n else elem.innerHTML = html;\n } else {\n elem.replaceChildren(html);\n }\n}\n\nexport function setDirection(elem: Element) {\n // if(!I18n.isRTL) {\n elem.setAttribute('dir', 'auto');\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport EventListenerBase from './eventListenerBase';\n\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\nconst DO_NOT_IDLE = false;\n\nexport class IdleController extends EventListenerBase<{\n change: (idle: boolean) => void\n}> {\n private _isIdle: boolean;\n\n private focusPromise: Promise;\n private focusResolve: () => void;\n\n constructor() {\n super();\n\n this._isIdle = true;\n this.focusPromise = Promise.resolve();\n this.focusResolve = () => {};\n\n window.addEventListener('blur', () => {\n this.isIdle = true;\n\n window.addEventListener('focus', () => {\n this.isIdle = false;\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.isIdle = false;\n }, {once: true, passive: true});\n\n this.addEventListener('change', (idle) => {\n if(idle) {\n this.focusPromise = new Promise((resolve) => {\n this.focusResolve = resolve;\n });\n } else {\n this.focusResolve();\n }\n });\n }\n\n public getFocusPromise() {\n return this.focusPromise;\n }\n\n public get isIdle() {\n return this._isIdle;\n }\n\n public set isIdle(value: boolean) {\n if(this._isIdle === value) {\n return;\n }\n\n if(DO_NOT_IDLE && value) {\n return;\n }\n\n this._isIdle = value;\n this.dispatchEvent('change', value);\n }\n}\n\nconst idleController = new IdleController();\nexport default idleController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from './eventListenerBase';\n\nexport class OverlayCounter extends EventListenerBase<{\n change: (isActive: boolean) => void\n}> {\n public overlaysActive = 0;\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('change', this.isOverlayActive);\n }\n}\n\nconst overlayCounter = new OverlayCounter();\nexport default overlayCounter;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's schedulers\nimport {NoneToVoidFunction} from '../types';\n\n/*\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n} */\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nexport function fastRaf(callback: NoneToVoidFunction) {\n if(!fastRafCallbacks) {\n fastRafCallbacks = [callback];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n fastRafCallbacks = undefined;\n currentCallbacks.forEach((cb) => cb());\n });\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\nexport function fastRafConventional(callback: NoneToVoidFunction) {\n if(!fastRafConventionalCallbacks) {\n fastRafConventionalCallbacks = [callback];\n\n requestAnimationFrame(() => {\n processing = true;\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\n fastRafConventionalCallbacks[i]();\n }\n\n fastRafConventionalCallbacks = undefined;\n processing = false;\n });\n } else if(processing) {\n callback();\n } else {\n fastRafConventionalCallbacks.push(callback);\n }\n}\n\nlet rafPromise: Promise;\nexport function fastRafPromise() {\n if(rafPromise) return rafPromise;\n\n rafPromise = new Promise((resolve) => fastRaf(() => resolve()));\n rafPromise.then(() => {\n rafPromise = undefined;\n });\n\n return rafPromise;\n}\n\nexport function doubleRaf() {\n return new Promise((resolve) => {\n fastRaf(() => {\n fastRaf(resolve);\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function parseUriParams(uri: string, splitted = uri.split('?')) {\n const params: any = {};\n if(!splitted[1]) return params;\n splitted[1].split('&').forEach((item) => {\n params[item.split('=')[0]] = decodeURIComponent(item.split('=')[1]);\n });\n\n return params;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppTheme} from '../config/state';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport rootScope from '../lib/rootScope';\nimport {hslaStringToHex} from './color';\n\nexport class ThemeController {\n private themeColor: string;\n private _themeColorElem: Element;\n private systemTheme: AppTheme['name'];\n\n constructor() {\n rootScope.addEventListener('theme_change', () => {\n this.setTheme();\n });\n\n // rootScope.addEventListener('settings_updated', ())\n }\n\n private get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n // const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n // const newTheme = this.getTheme();\n\n if(rootScope.myId) {\n rootScope.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public applyHighlightningColor() {\n let hsla: string;\n const theme = themeController.getTheme();\n if(theme.settings?.highlightningColor) {\n hsla = theme.settings.highlightningColor;\n document.documentElement.style.setProperty('--message-highlightning-color', hsla);\n } else {\n document.documentElement.style.removeProperty('--message-highlightning-color');\n }\n\n if(!IS_TOUCH_SUPPORTED && hsla) {\n themeController.themeColor = hslaStringToHex(hsla);\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n\n this.applyHighlightningColor();\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: AppTheme['name'] = rootScope.settings.theme === 'system' ? this.systemTheme : rootScope.settings.theme) {\n return rootScope.settings.themes.find((t) => t.name === name);\n }\n}\n\nconst themeController = new ThemeController();\nexport default themeController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function setWorkerProxy() {\n // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n let url = args[0] + '';\n if(url.indexOf('blob:') !== 0) {\n url += location.search;\n }\n\n return new target(url);\n }\n };\n\n [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean).forEach((w) => {\n window[w.name as any] = new Proxy(w, workerHandler);\n });\n}\n\nsetWorkerProxy();\n","const IS_INSTALL_PROMPT_SUPPORTED = 'onbeforeinstallprompt' in window;\nexport default IS_INSTALL_PROMPT_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from './config/app';\nimport blurActiveElement from './helpers/dom/blurActiveElement';\nimport cancelEvent from './helpers/dom/cancelEvent';\nimport {IS_STICKY_INPUT_BUGGED} from './helpers/dom/fixSafariStickyInputFocusing';\nimport loadFonts from './helpers/dom/loadFonts';\nimport IS_EMOJI_SUPPORTED from './environment/emojiSupport';\nimport {IS_ANDROID, IS_APPLE, IS_APPLE_MOBILE, IS_FIREFOX, IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport pause from './helpers/schedulers/pause';\nimport setWorkerProxy from './helpers/setWorkerProxy';\nimport toggleAttributePolyfill from './helpers/dom/toggleAttributePolyfill';\nimport rootScope from './lib/rootScope';\nimport IS_TOUCH_SUPPORTED from './environment/touchSupport';\nimport I18n from './lib/langPack';\nimport './helpers/peerIdPolyfill';\nimport './lib/polyfill';\nimport apiManagerProxy from './lib/mtproto/mtprotoworker';\nimport getProxiedManagers from './lib/appManagers/getProxiedManagers';\nimport themeController from './helpers/themeController';\nimport overlayCounter from './helpers/overlayCounter';\nimport singleInstance from './lib/mtproto/singleInstance';\nimport parseUriParams from './helpers/string/parseUriParams';\nimport Modes from './config/modes';\nimport {AuthState} from './types';\nimport {IS_BETA} from './config/debug';\nimport IS_INSTALL_PROMPT_SUPPORTED from './environment/installPrompt';\nimport cacheInstallPrompt from './helpers/dom/installPrompt';\n// import appNavigationController from './components/appNavigationController';\n\ndocument.addEventListener('DOMContentLoaded', async() => {\n toggleAttributePolyfill();\n\n // polyfill for replaceChildren\n if((Node as any).prototype.replaceChildren === undefined) {\n (Node as any).prototype.replaceChildren = function(...nodes: any[]) {\n this.textContent = '';\n // while(this.lastChild) {\n // this.removeChild(this.lastChild);\n // }\n if(nodes) {\n this.append(...nodes);\n }\n }\n }\n\n rootScope.managers = getProxiedManagers();\n\n const manifest = document.getElementById('manifest') as HTMLLinkElement;\n manifest.href = `site${IS_APPLE && !IS_APPLE_MOBILE ? '_apple' : ''}.webmanifest?v=jw3mK7G9Aq`;\n\n singleInstance.start();\n\n // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n const vh = (setViewportVH && !overlayCounter.isOverlayActive ? (w as VisualViewport).height || (w as Window).innerHeight : window.innerHeight) * 0.01;\n if(lastVH === vh) {\n return;\n } else if(IS_TOUCH_SUPPORTED && lastVH < vh && (vh - lastVH) > 1) {\n blurActiveElement(); // (Android) fix blurring inputs when keyboard is being closed (e.g. closing keyboard by back arrow and touching a bubble)\n }\n\n lastVH = vh;\n\n // const vh = document.documentElement.scrollHeight * 0.01;\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n // console.log('setVH', vh, setViewportVH ? w : window);\n\n /* if(setViewportVH && userAgent.isSafari && touchSupport.isTouchSupported && document.activeElement && (document.activeElement as HTMLElement).blur) {\n const rect = document.activeElement.getBoundingClientRect();\n if(rect.top < 0 || rect.bottom >= (w as any).height) {\n fastSmoothScroll(findUpClassName(document.activeElement, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'center', 4, undefined, FocusDirection.Static);\n }\n } */\n };\n\n setWorkerProxy;\n\n // const [_, touchSupport, userAgent, _rootScope, _appStateManager, _I18n, __/* , ___ */] = await Promise.all([\n // import('./lib/polyfill'),\n // import('./environment/touchSupport'),\n // import('./environment/userAgent'),\n // import('./lib/rootScope'),\n // import('./lib/appManagers/appStateManager'),\n // import('./lib/langPack'),\n // import('./helpers/peerIdPolyfill'),\n // // import('./helpers/cacheFunctionPolyfill')\n // ]);\n\n /* const {IS_TOUCH_SUPPORTED} = touchSupport;\n const {IS_FIREFOX, IS_MOBILE, IS_APPLE, IS_SAFARI, IS_APPLE_MOBILE, IS_ANDROID} = userAgent;\n const rootScope = _rootScope.default;\n const appStateManager = _appStateManager.default;\n const I18n = _I18n.default; */\n\n window.addEventListener('resize', setVH);\n setVH();\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !overlayCounter.isOverlayActive;\n setVH();\n\n if(w !== window) {\n if(setViewportVH) {\n window.removeEventListener('resize', setVH);\n w.addEventListener('resize', setVH);\n } else {\n w.removeEventListener('resize', setVH);\n window.addEventListener('resize', setVH);\n }\n }\n };\n\n let tabId: number;\n (window as any).onImTabChange = (id: number) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n\n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n };\n\n overlayCounter.addEventListener('change', () => {\n toggleResizeMode();\n });\n }\n\n if(IS_FIREFOX && !IS_EMOJI_SUPPORTED) {\n document.addEventListener('dragstart', (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'IMG' && target.classList.contains('emoji')) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n if(IS_EMOJI_SUPPORTED) {\n document.documentElement.classList.add('native-emoji');\n }\n\n // prevent firefox image dragging\n document.addEventListener('dragstart', (e) => {\n if((e.target as HTMLElement)?.tagName === 'IMG') {\n e.preventDefault();\n return false;\n }\n });\n\n // restrict contextmenu on images (e.g. webp stickers)\n document.addEventListener('contextmenu', (e) => {\n if((e.target as HTMLElement).tagName === 'IMG' && !(window as any).appMediaViewer) {\n cancelEvent(e);\n }\n });\n\n if(IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox', 'no-backdrop');\n }\n\n if(IS_MOBILE) {\n document.documentElement.classList.add('is-mobile');\n }\n\n if(IS_APPLE) {\n if(IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n\n // document.documentElement.classList.add('emoji-supported');\n\n if(IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(IS_ANDROID) {\n document.documentElement.classList.add('is-android');\n\n /* document.addEventListener('focusin', (e) => {\n hasFocus = true;\n focusTime = Date.now();\n }, {passive: true});\n\n document.addEventListener('focusout', () => {\n hasFocus = false;\n }, {passive: true}); */\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n document.documentElement.classList.add('no-touch');\n } else {\n document.documentElement.classList.add('is-touch');\n /* document.addEventListener('touchmove', (event: any) => {\n event = event.originalEvent || event;\n if(event.scale && event.scale !== 1) {\n event.preventDefault();\n }\n }, {capture: true, passive: false}); */\n }\n\n if(IS_INSTALL_PROMPT_SUPPORTED) {\n cacheInstallPrompt();\n }\n\n const perf = performance.now();\n\n // await pause(1000000);\n\n const langPromise = I18n.getCacheLangPack();\n\n const [stateResult, langPack] = await Promise.all([\n // loadState(),\n apiManagerProxy.sendState().then(([stateResult]) => stateResult),\n langPromise\n ]);\n I18n.setTimeFormat(stateResult.state.settings.timeFormat);\n\n rootScope.managers.rootScope.getPremium().then((isPremium) => {\n rootScope.premium = isPremium;\n });\n\n themeController.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.getLangPack(langPack.lang_code);\n }\n\n /**\n * won't fire if font is loaded too fast\n */\n function fadeInWhenFontsReady(elem: HTMLElement, promise: Promise) {\n elem.style.opacity = '0';\n\n promise.then(() => {\n window.requestAnimationFrame(() => {\n elem.style.opacity = '';\n });\n });\n }\n\n console.log('got state, time:', performance.now() - perf);\n\n if(langPack.lang_code === 'ar' && IS_BETA && false) {\n document.body.classList.add('is-rtl');\n document.documentElement.dir = 'rtl';\n document.documentElement.lang = langPack.lang_code;\n I18n.setRTL(true);\n } else {\n document.documentElement.dir = 'ltr';\n }\n\n let authState = stateResult.state.authState;\n\n const hash = location.hash;\n const splitted = hash.split('?');\n const params = parseUriParams(hash, splitted);\n if(params.tgWebAuthToken && authState._ !== 'authStateSignedIn') {\n const data: AuthState.signImport['data'] = {\n token: params.tgWebAuthToken,\n dcId: +params.tgWebAuthDcId,\n userId: params.tgWebAuthUserId.toUserId(),\n isTest: params.tgWebAuthTest !== undefined && !!+params.tgWebAuthTest,\n tgAddr: params.tgaddr\n };\n\n if(data.isTest !== Modes.test) {\n const urlSearchParams = new URLSearchParams(location.search);\n if(+params.tgWebAuthTest) {\n urlSearchParams.set('test', '1');\n } else {\n urlSearchParams.delete('test');\n }\n\n location.search = urlSearchParams.toString();\n return;\n }\n\n rootScope.managers.appStateManager.pushToState('authState', authState = {_: 'authStateSignImport', data});\n\n // appNavigationController.overrideHash('?tgaddr=' + encodeURIComponent(params.tgaddr));\n }\n\n if(authState._ !== 'authStateSignedIn'/* || 1 === 1 */) {\n console.log('Will mount auth page:', authState._, Date.now() / 1000);\n\n const el = document.getElementById('auth-pages');\n let scrollable: HTMLElement;\n if(el) {\n scrollable = el.querySelector('.scrollable') as HTMLElement;\n if((!IS_TOUCH_SUPPORTED || IS_MOBILE_SAFARI)) {\n scrollable.classList.add('no-scrollbar');\n }\n\n // * don't remove this line\n scrollable.style.opacity = '0';\n\n const placeholder = document.createElement('div');\n placeholder.classList.add('auth-placeholder');\n\n scrollable.prepend(placeholder);\n scrollable.append(placeholder.cloneNode());\n }\n\n try {\n await Promise.all([\n import('./lib/mtproto/telegramMeWebManager'),\n import('./lib/mtproto/webPushApiManager')\n ]).then(([meModule, pushModule]) => {\n meModule.default.setAuthorized(false);\n pushModule.default.forceUnsubscribe();\n });\n } catch(err) {\n\n }\n\n let pagePromise: Promise;\n // langPromise.then(async() => {\n switch(authState._) {\n case 'authStateSignIn':\n pagePromise = (await import('./pages/pageSignIn')).default.mount();\n break;\n case 'authStateSignQr':\n pagePromise = (await import('./pages/pageSignQR')).default.mount();\n break;\n case 'authStateAuthCode':\n pagePromise = (await import('./pages/pageAuthCode')).default.mount(authState.sentCode);\n break;\n case 'authStatePassword':\n pagePromise = (await import('./pages/pagePassword')).default.mount();\n break;\n case 'authStateSignUp':\n pagePromise = (await import('./pages/pageSignUp')).default.mount(authState.authCode);\n break;\n case 'authStateSignImport':\n pagePromise = (await import('./pages/pageSignImport')).default.mount(authState.data);\n break;\n }\n // });\n\n if(scrollable) {\n // wait for text appear\n if(pagePromise) {\n await pagePromise;\n }\n\n const promise = 'fonts' in document ?\n Promise.race([\n pause(1000),\n document.fonts.ready\n ]) :\n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\n }\n\n /* setTimeout(async() => {\n (await import('./pages/pageAuthCode')).default.mount({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"\",\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"\"\n });\n\n (await import('./pages/pageSignQR')).default.mount();\n\n (await import('./pages/pagePassword')).default.mount();\n\n (await import('./pages/pageSignUp')).default.mount({\n \"phone_code_hash\": \"\",\n \"phone_number\": \"\"\n });\n }, 500); */\n } else {\n console.log('Will mount IM page:', Date.now() / 1000);\n fadeInWhenFontsReady(document.getElementById('main-columns'), loadFonts());\n (await import('./pages/pageIm')).default.mount();\n }\n});\n","export default function toggleAttributePolyfill() {\n if(!Element.prototype.toggleAttribute) {\n Element.prototype.toggleAttribute = function(name, force) {\n if(force !== void 0) force = !!force;\n\n if(this.hasAttribute(name)) {\n if(force) return true;\n\n this.removeAttribute(name);\n return false;\n }\n if(force === false) return false;\n\n this.setAttribute(name, '');\n return true;\n };\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport class AppRuntimeManager {\n public reload() {\n try {\n location.reload();\n } catch(e) {};\n\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\n // chrome.runtime.reload();\n // }\n }\n\n public close() {\n try {\n window.close();\n } catch(e) {}\n }\n\n /**\n * Better to call from event\n */\n public focus() {\n // // @ts-ignore\n // if(window.navigator.mozApps && document.hidden) {\n // // Get app instance and launch it to bring app to foreground\n // // @ts-ignore\n // window.navigator.mozApps.getSelf().onsuccess = function() {\n // this.result.launch();\n // };\n // } else {\n // // @ts-ignore\n // if(window.chrome && chrome.app && chrome.app.window) {\n // // @ts-ignore\n // chrome.app.window.current().focus();\n // }\n\n window.focus();\n // }\n }\n}\n\nconst appRuntimeManager = new AppRuntimeManager();\nexport default appRuntimeManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type createManagers from './createManagers';\nimport {ModifyFunctionsToAsync} from '../../types';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport noop from '../../helpers/noop';\nimport dT from '../../helpers/dT';\nimport DEBUG from '../../config/debug';\n\n// let stats: {\n// [manager: string]: {\n// [method: string]: {\n// times: number[],\n// byArgs: {\n// [args: string]: number[]\n// }\n// }\n// }\n// } = {};\n\n// let sentCount = 0;\n// let sentMethods: {[key: string]: number} = {};\n// let sentMethods2: {[key: string]: number} = {};\n// function collectStats(manager: string, method: string, args: any[], promise: Promise) {\n// ++sentCount;\n\n// const key = [manager, method].join('-');\n// if(!sentMethods[key]) sentMethods[key] = 0;\n// ++sentMethods[key];\n\n// const key2 = [('00000' + sentCount).slice(-5), key].join('-');\n\n// let byManager = stats[manager] ??= {};\n// let byMethod = byManager[method] ??= {times: [], byArgs: {}};\n\n// const perf = performance.now();\n// promise.catch(noop).finally(() => {\n// const time = performance.now() - perf;\n// byMethod.times.push(time);\n\n// sentMethods2[key2] = time;\n\n// try {\n// const argsString = JSON.stringify(args);\n// byMethod.byArgs[argsString].push(time);\n// } catch(err) {}\n// });\n// }\n\n// setInterval(() => {\n// // console.log(dT(), '[PROXY] stats', stats, sentCount, sentMethods, sentMethods2);\n// sentCount = 0;\n// sentMethods = {};\n// sentMethods2 = {};\n// }, 2000);\n\nconst DEBUG_MANAGER_REQUESTS: {[managerName: string]: Set} = {};\nif(DEBUG) {\n (window as any).DEBUG_MANAGER_REQUESTS = DEBUG_MANAGER_REQUESTS;\n}\n\nfunction createProxy(/* source: T, */name: string, ack?: boolean) {\n const proxy = new Proxy({}, {\n get: (target, p, receiver) => {\n // console.log('get', target, p, receiver);\n // @ts-ignore\n // const value = source[p];\n // if(typeof(value) !== 'function') {\n // return value;\n // }\n\n return (...args: any[]) => {\n const promise = apiManagerProxy.invoke('manager', {\n name,\n method: p as string,\n args\n }, ack as any);\n\n if(DEBUG) {\n if(DEBUG_MANAGER_REQUESTS[name]?.has(p as any)) {\n console.warn('manager request', name, p, args);\n }\n }\n\n // collectStats(name, p as string, args, promise);\n\n return promise;\n\n // @ts-ignore\n // return Promise.resolve(value.call(source, ...args));\n };\n }\n });\n\n return proxy;\n}\n\ntype AA = {\n [key in keyof T]: T[key] extends (...args: infer A) => infer R ? (...args: A) => Promise>> : never\n};\n\ntype T = Awaited>;\ntype ProxiedManagers = {\n [name in keyof T]?: ModifyFunctionsToAsync;\n} & {\n acknowledged?: {\n [name in keyof T]?: AA;\n }\n};\n\nfunction createProxyProxy(proxied: any, ack?: boolean) {\n return new Proxy(proxied, {\n get: (target, p, receiver) => {\n // @ts-ignore\n return target[p] ??= createProxy(p as string, ack);\n }\n });\n}\n\nlet proxied: ProxiedManagers;\nexport default function getProxiedManagers() {\n if(proxied) {\n return proxied;\n }\n\n proxied = createProxyProxy({}, false);\n proxied.acknowledged = createProxyProxy({}, true);\n return proxied;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\nimport {setDirection} from '../helpers/dom/setInnerHTML';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n 'messageActionBotAllowed': 'Chat.Service.BotPermissionAllowed'\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n export let isRTL = false;\n\n export function setRTL(rtl: boolean) {\n isRTL = rtl;\n }\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n rootScope.dispatchEvent('language_change', currentLangCode);\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n out.push(string.slice(lastIndex, offset));\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n out.push(a);\n } else if(args) {\n pushNextArgument(out, args, indexHolder);\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map((item) => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.textContent = '';\n this.element.append(...format(this.key, false, this.args) as any);\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n }\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n setDirection(this.element);\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n const arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n return arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n const joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter} from '../storages/filters';\n\n/**\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\n */\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\nexport type REAL_FOLDER_ID = 0 | 1;\n\nexport const NULL_PEER_ID: PeerId = 0;\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\nexport const SERVICE_PEER_ID: PeerId = 777000;\nexport const MUTE_UNTIL = 0x7FFFFFFF;\nexport const BOT_START_PARAM = '';\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\nexport const THUMB_TYPE_FULL = '';\nexport const TOPIC_COLORS = [0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, 0xFB6F5F];\nexport const ATTACH_MENU_BOT_ICON_NAME = 'default_static';\nexport const GENERAL_TOPIC_ID = 4295032831;\nexport const T_ME_PREFIXES = new Set(['web', 'k', 'z']);\n\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\n","import IS_CALL_SUPPORTED from './callSupport';\nimport CAN_USE_TRANSFERABLES from './canUseTransferables';\nimport IS_CANVAS_FILTER_SUPPORTED from './canvasFilterSupport';\nimport IS_EMOJI_SUPPORTED from './emojiSupport';\nimport IS_GEOLOCATION_SUPPORTED from './geolocationSupport';\nimport IS_GROUP_CALL_SUPPORTED from './groupCallSupport';\nimport IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport MEDIA_MIME_TYPES_SUPPORTED from './mediaMimeTypesSupport';\nimport IS_MOV_SUPPORTED from './movSupport';\nimport IS_PARALLAX_SUPPORTED from './parallaxSupport';\nimport IS_SCREEN_SHARING_SUPPORTED from './screenSharingSupport';\nimport IS_TOUCH_SUPPORTED from './touchSupport';\nimport IS_VIBRATE_SUPPORTED from './vibrateSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\nimport IS_WEBM_SUPPORTED from './webmSupport';\nimport IS_WEBP_SUPPORTED from './webpSupport';\nimport IS_WEBRTC_SUPPORTED from './webrtcSupport';\nimport * as userAgent from './userAgent';\nimport IS_OPUS_SUPPORTED from './opusSupport';\nimport IS_SHARED_WORKER_SUPPORTED from './sharedWorkerSupport';\nimport IS_APPLE_MX from './appleMx';\n\nconst ENVIRONMENT = {\n CAN_USE_TRANSFERABLES,\n IS_APPLE_MX,\n IS_CALL_SUPPORTED,\n IS_CANVAS_FILTER_SUPPORTED,\n IS_EMOJI_SUPPORTED,\n IS_GEOLOCATION_SUPPORTED,\n IS_GROUP_CALL_SUPPORTED,\n IS_MOV_SUPPORTED,\n IS_PARALLAX_SUPPORTED,\n IS_SCREEN_SHARING_SUPPORTED,\n IS_TOUCH_SUPPORTED,\n IS_VIBRATE_SUPPORTED,\n IS_OPUS_SUPPORTED,\n IS_SHARED_WORKER_SUPPORTED,\n IS_WEBM_SUPPORTED,\n IS_WEBP_SUPPORTED,\n IS_WEBRTC_SUPPORTED,\n IMAGE_MIME_TYPES_SUPPORTED,\n MEDIA_MIME_TYPES_SUPPORTED,\n VIDEO_MIME_TYPES_SUPPORTED,\n ...userAgent\n};\n\nexport default ENVIRONMENT;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../../../config/app';\nimport DEBUG from '../../../../config/debug';\nimport {AutoDownloadPeerTypeSettings, State, STATE_INIT, Background, AppTheme} from '../../../../config/state';\nimport compareVersion from '../../../../helpers/compareVersion';\nimport copy from '../../../../helpers/object/copy';\nimport validateInitObject from '../../../../helpers/object/validateInitObject';\nimport {UserAuth} from '../../../mtproto/mtproto_config';\nimport rootScope from '../../../rootScope';\nimport stateStorage from '../../../stateStorage';\nimport sessionStorage from '../../../sessionStorage';\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\n// import RESET_STORAGES_PROMISE from \"../storages/resetStoragesPromise\";\nimport {StoragesResults} from '../storages/loadStorages';\nimport {logger} from '../../../logger';\nimport {WallPaper} from '../../../../layer';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n// const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\n\nconst STATE_VERSION = STATE_INIT.version;\nconst BUILD = STATE_INIT.build;\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS: Array = [\n 'contactsListCachedTime',\n 'stateCreatedTime',\n 'maxSeenMsgId',\n 'filtersArr'\n];\n\n// const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nasync function loadStateInner() {\n const log = logger('STATE-LOADER');\n\n const totalPerf = performance.now();\n const recordPromise = recordPromiseBound(log);\n\n const promises = ALL_KEYS.map((key) => recordPromise(stateStorage.get(key), 'state ' + key))\n .concat(\n recordPromise(sessionStorage.get('user_auth'), 'auth'),\n recordPromise(sessionStorage.get('state_id'), 'auth'),\n recordPromise(sessionStorage.get('k_build'), 'auth')\n )\n .concat(recordPromise(stateStorage.get('user_auth'), 'old auth')); // support old webk format\n\n const arr = await Promise.all(promises);\n log.warn('promises', performance.now() - totalPerf);\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n\n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n\n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n // const pushed: {key: keyof State, value: State[keyof State]}[] = [];\n const pushedKeys: (keyof State)[] = [];\n const pushToState = (key: T, value: State[T]) => {\n // appStateManager.pushToState(key, value);\n state[key] = value;\n // pushed.push({key, value});\n pushedKeys.push(key);\n };\n\n const replaceState = (_state: State) => {\n // pushed.length = 0;\n pushedKeys.length = 0;\n state = _state;\n pushedKeys.push(...Object.keys(state) as any as typeof pushedKeys);\n // state = appStateManager.setState(_state);\n // appStateManager.storage.set(state);\n };\n\n // let state: State = appStateManager.setState({} as any);\n let state: State = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const sessionBuild = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map((key) => stateStorage.get(key as any)));\n keys.push('user_auth');\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\n\n const obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n\n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ?\n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} :\n auth); // * support old version\n }\n\n const resetStorages: Set = new Set();\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n\n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n\n state = copy(STATE_INIT);\n\n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n const r: {[k in keyof StoragesResults]: number} = {\n chats: 1,\n dialogs: 1,\n users: 1\n };\n for(const key in r) {\n resetStorages.add(key as keyof StoragesResults);\n // this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n replaceState(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach((key) => {\n pushToState(key, copy(STATE_INIT[key]));\n\n // const s = appStateManager.storagesResults[key as keyof AppStateManager['storagesResults']];\n // if(s?.length) {\n // appStateManager.resetStorages.add(key as keyof AppStateManager['storagesResults']);\n // s.length = 0;\n // }\n });\n };\n\n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n\n // state = this.state = new Proxy(state, getHandler());\n\n // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const,\n 'private' as const,\n 'groups' as const,\n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach((mediaType) => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach((peerType) => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach((peerType) => {\n delete autoDownloadSettings[peerType];\n });\n\n pushToState('settings', state.settings);\n }\n\n const SKIP_VALIDATING_PATHS: Set = new Set([\n 'settings.themes'\n ]);\n validateInitObject(STATE_INIT, state, (missingKey) => {\n pushToState(missingKey as keyof State, state[missingKey as keyof State]);\n }, undefined, SKIP_VALIDATING_PATHS);\n\n let newVersion: string, oldVersion: string;\n if(state.version !== STATE_VERSION || state.build !== BUILD/* || true */) {\n // reset filters and dialogs if version is older\n if(/* compareVersion(state.version, '0.8.7') === -1 || state.build < 179 || */state.build < 217) {\n state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n state.pinnedOrders = copy(STATE_INIT.pinnedOrders);\n state.filtersArr = copy(STATE_INIT.filtersArr);\n\n resetStorages.add('dialogs');\n }\n\n if(compareVersion(state.version, '1.7.1') === -1) {\n let migrated = false;\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n migrated = true;\n state.settings.theme = copy(STATE_INIT.settings.theme);\n state.settings.themes = copy(STATE_INIT.settings.themes);\n } else if(compareVersion(state.version, '1.7.1') === -1) { // * migrate backgrounds (January 25th, 2023; to version 1.7.1)\n migrated = true;\n const oldThemes = state.settings.themes as any as Array<{\n name: AppTheme['name'],\n background: Background\n }>;\n\n state.settings.themes = copy(STATE_INIT.settings.themes);\n\n try {\n oldThemes.forEach((oldTheme) => {\n const oldBackground = oldTheme.background;\n if(!oldBackground) {\n return;\n }\n\n const newTheme = state.settings.themes.find((t) => t.name === oldTheme.name);\n newTheme.settings.highlightningColor = oldBackground.highlightningColor;\n\n const getColorFromHex = (hex: string) => hex && parseInt(hex.slice(1), 16);\n\n const colors = (oldBackground.color || '').split(',').map(getColorFromHex);\n\n if(oldBackground.color && !oldBackground.slug) {\n newTheme.settings.wallpaper = {\n _: 'wallPaperNoFile',\n id: 0,\n pFlags: {},\n settings: {\n _: 'wallPaperSettings',\n pFlags: {}\n }\n };\n } else {\n const wallPaper: WallPaper.wallPaper = {\n _: 'wallPaper',\n id: 0,\n access_hash: 0,\n slug: oldBackground.slug,\n document: {} as any,\n pFlags: {},\n settings: {\n _: 'wallPaperSettings',\n pFlags: {}\n }\n };\n\n const wallPaperSettings = wallPaper.settings;\n newTheme.settings.wallpaper = wallPaper;\n if(oldBackground.slug && !oldBackground.color) {\n wallPaperSettings.pFlags.blur = oldBackground.blur || undefined;\n } else if(oldBackground.intensity) {\n wallPaperSettings.intensity = oldBackground.intensity;\n wallPaper.pFlags.pattern = true;\n wallPaper.pFlags.dark = oldBackground.intensity < 0 || undefined;\n }\n }\n\n if(colors.length) {\n const wallPaperSettings = newTheme.settings.wallpaper.settings;\n wallPaperSettings.background_color = colors[0];\n wallPaperSettings.second_background_color = colors[1];\n wallPaperSettings.third_background_color = colors[2];\n wallPaperSettings.fourth_background_color = colors[3];\n }\n });\n } catch(err) {\n console.error('migrating themes error', err);\n }\n }\n\n if(migrated) {\n pushToState('settings', state.settings);\n }\n }\n\n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n newVersion = STATE_VERSION;\n oldVersion = state.version;\n }\n\n pushToState('version', STATE_VERSION);\n pushToState('build', BUILD);\n }\n\n if(sessionBuild !== BUILD && (!sessionBuild || sessionBuild < BUILD)) {\n sessionStorage.set({k_build: BUILD});\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n log('state res', state, copy(state));\n }\n\n // return resolve();\n\n log.warn('total', performance.now() - totalPerf);\n\n // RESET_STORAGES_PROMISE.resolve(appStateManager.resetStorages);\n\n return {state, resetStorages, newVersion, oldVersion, pushedKeys};\n}\n\nlet promise: ReturnType;\nexport default function loadState() {\n return promise ??= loadStateInner();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Awaited} from '../../types';\nimport type {CacheStorageDbName} from '../files/cacheStorage';\nimport type {State} from '../../config/state';\nimport type {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport {CryptoMethods} from '../crypto/crypto_methods';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport pause from '../../helpers/schedulers/pause';\nimport ENVIRONMENT from '../../environment';\nimport loadState from '../appManagers/utils/state/loadState';\nimport opusDecodeController from '../opusDecodeController';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport SuperMessagePort from './superMessagePort';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport idleController from '../../helpers/idleController';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport App from '../../config/app';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\n\nexport type Mirrors = {\n state: State\n};\n\nexport type MirrorTaskPayload = {\n name: T,\n key?: K,\n value: any\n};\n\nexport type NotificationBuildTaskPayload = {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n};\n\nexport type TabState = {\n chatPeerIds: PeerId[],\n idleStartTime: number,\n};\n\nclass ApiManagerProxy extends MTProtoMessagePort {\n // private worker: /* Window */Worker;\n // private sockets: Map = new Map();\n private mirrors: Mirrors;\n\n public newVersion: string;\n public oldVersion: string;\n\n private tabState: TabState;\n\n public share: ShareData;\n\n public serviceMessagePort: ServiceMessagePort;\n private lastServiceWorker: ServiceWorker;\n\n private pingServiceWorkerPromise: CancellablePromise;\n\n constructor() {\n super();\n\n this.mirrors = {} as any;\n this.tabState = {\n chatPeerIds: [],\n idleStartTime: 0\n };\n\n this.log('constructor');\n\n \n this.registerWorker();\n \n\n this.registerServiceWorker();\n this.registerCryptoWorker();\n\n // const perf = performance.now();\n this.addMultipleEventsListeners({\n convertWebp: ({fileName, bytes}) => {\n return webpWorkerController.convert(fileName, bytes);\n },\n\n convertOpus: ({fileName, bytes}) => {\n return opusDecodeController.pushDecodeTask(bytes, false).then((result) => result.bytes);\n },\n\n event: ({name, args}) => {\n // @ts-ignore\n rootScope.dispatchEventSingle(name, ...args);\n },\n\n localStorageProxy: (payload) => {\n const storageTask = payload;\n return (sessionStorage[storageTask.type] as any)(...storageTask.args);\n },\n\n mirror: this.onMirrorTask\n\n // hello: () => {\n // this.log.error('time hello', performance.now() - perf);\n // }\n });\n\n // this.addTaskListener('socketProxy', (task) => {\n // const socketTask = task.payload;\n // const id = socketTask.id;\n // //console.log('socketProxy', socketTask, id);\n\n // if(socketTask.type === 'send') {\n // const socket = this.sockets.get(id);\n // socket.send(socketTask.payload);\n // } else if(socketTask.type === 'close') { // will remove from map in onClose\n // const socket = this.sockets.get(id);\n // socket.close();\n // } else if(socketTask.type === 'setup') {\n // const socket = new Socket(socketTask.payload.dcId, socketTask.payload.url, socketTask.payload.logSuffix);\n\n // const onOpen = () => {\n // //console.log('socketProxy onOpen');\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'open',\n // id\n // }\n // });\n // };\n // const onClose = () => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'close',\n // id\n // }\n // });\n\n // socket.removeEventListener('open', onOpen);\n // socket.removeEventListener('close', onClose);\n // socket.removeEventListener('message', onMessage);\n // this.sockets.delete(id);\n // };\n // const onMessage = (buffer: ArrayBuffer) => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'message',\n // id,\n // payload: buffer\n // }\n // });\n // };\n\n // socket.addEventListener('open', onOpen);\n // socket.addEventListener('close', onClose);\n // socket.addEventListener('message', onMessage);\n // this.sockets.set(id, socket);\n // }\n // });\n\n rootScope.addEventListener('language_change', (language) => {\n rootScope.managers.networkerFactory.setLanguage(language);\n });\n\n window.addEventListener('online', () => {\n rootScope.managers.networkerFactory.forceReconnectTimeout();\n });\n\n rootScope.addEventListener('logging_out', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n toggleStorages(false, true),\n sessionStorage.clear(),\n Promise.race([\n telegramMeWebManager.setAuthorized(false),\n pause(3000)\n ]),\n webPushApiManager.forceUnsubscribe(),\n Promise.all(toClear.map((cacheName) => caches.delete(cacheName)))\n ]).finally(() => {\n appRuntimeManager.reload();\n });\n });\n\n idleController.addEventListener('change', (idle) => {\n this.updateTabStateIdle(idle);\n });\n this.updateTabStateIdle(idleController.isIdle);\n\n this.log('Passing environment:', ENVIRONMENT);\n this.invoke('environment', ENVIRONMENT);\n // this.sendState();\n }\n\n public pingServiceWorkerWithIframe() {\n if(this.pingServiceWorkerPromise) {\n return this.pingServiceWorkerPromise;\n }\n\n const promise = this.pingServiceWorkerPromise = deferredPromise();\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n const onLoad = () => {\n setTimeout(() => { // ping once in 10 seconds\n this.pingServiceWorkerPromise = undefined;\n }, 10e3);\n\n clearTimeout(timeout);\n iframe.remove();\n iframe.removeEventListener('load', onLoad);\n iframe.removeEventListener('error', onLoad);\n promise.resolve();\n };\n iframe.addEventListener('load', onLoad);\n iframe.addEventListener('error', onLoad);\n iframe.src = 'ping/' + (Math.random() * 0xFFFFFFFF | 0);\n document.body.append(iframe);\n\n const timeout = window.setTimeout(onLoad, 1e3);\n return promise;\n }\n\n private attachServiceWorker(serviceWorker: ServiceWorker) {\n this.lastServiceWorker && this.serviceMessagePort.detachPort(this.lastServiceWorker);\n this.serviceMessagePort.attachSendPort(this.lastServiceWorker = serviceWorker);\n this.serviceMessagePort.invokeVoid('hello', undefined);\n }\n\n private _registerServiceWorker() {\n navigator.serviceWorker.register(\n /* webpackChunkName: \"sw\" */\n new URL('../serviceWorker/index.service', import.meta.url),\n {scope: './'}\n ).then((registration) => {\n this.log('SW registered', registration);\n\n // ! doubtful fix for hard refresh\n if(registration.active && !navigator.serviceWorker.controller) {\n return registration.unregister().then(() => {\n window.location.reload();\n });\n }\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n const controller = navigator.serviceWorker.controller || registration.installing || registration.waiting || registration.active;\n this.attachServiceWorker(controller);\n\n \n \n \n }, (err) => {\n this.log.error('SW registration failed!', err);\n\n this.invokeVoid('serviceWorkerOnline', false);\n });\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n\n this.serviceMessagePort = new ServiceMessagePort();\n\n // this.addMultipleEventsListeners({\n // hello: () => {\n // // this.serviceMessagePort.invokeVoid('port', undefined);\n // }\n // });\n\n // ! I hate webpack - it won't load it by using worker.register, only navigator.serviceWorker will do it.\n const worker = navigator.serviceWorker;\n this._registerServiceWorker();\n\n // worker.startMessages();\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n\n const controller = worker.controller;\n this.attachServiceWorker(controller);\n\n controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n this.serviceMessagePort.attachListenPort(worker);\n this.serviceMessagePort.addMultipleEventsListeners({\n port: (payload, source, event) => {\n this.invokeVoid('serviceWorkerPort', undefined, undefined, [event.ports[0]]);\n },\n\n hello: (payload, source) => {\n this.serviceMessagePort.resendLockTask(source);\n },\n\n share: (payload) => {\n this.log('will try to share something');\n this.share = payload;\n }\n });\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n private async registerCryptoWorker() {\n const get = (url: string) => {\n return fetch(url).then((response) => response.text()).then((text) => {\n const pathnameSplitted = location.pathname.split('/');\n pathnameSplitted[pathnameSplitted.length - 1] = '';\n const pre = location.origin + pathnameSplitted.join('/');\n text = `\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${pre}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${text}`;\n const blob = new Blob([text], {type: 'application/javascript'});\n return blob;\n });\n };\n\n const workerHandler = {\n construct(target: any, args: any): any {\n const url = args[0] + location.search;\n return {url};\n }\n };\n\n const originals = [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean);\n originals.forEach((w) => window[w.name as any] = new Proxy(w, workerHandler));\n\n const worker: SharedWorker | Worker = new Worker(\n /* webpackChunkName: \"crypto.worker\" */\n new URL('../crypto/crypto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n\n originals.forEach((w) => window[w.name as any] = w as any);\n\n const originalUrl = (worker as any).url;\n\n const createWorker = (url: string) => new constructor(url, {type: 'module'});\n const attachWorkerToPort = (worker: SharedWorker | Worker) => this.attachWorkerToPort(worker, cryptoMessagePort, 'crypto');\n const constructor = IS_SHARED_WORKER_SUPPORTED ? SharedWorker : Worker;\n\n // let cryptoWorkers = workers.length;\n cryptoMessagePort.addEventListener('port', (payload, source, event) => {\n this.invokeVoid('cryptoPort', undefined, undefined, [event.ports[0]]);\n // .then((attached) => {\n // if(!attached && cryptoWorkers-- > 1) {\n // this.log.error('terminating unneeded crypto worker');\n\n // cryptoMessagePort.invokeVoid('terminate', undefined, source);\n // const worker = workers.find((worker) => (worker as SharedWorker).port === source || (worker as any) === source);\n // if((worker as SharedWorker).port) (worker as SharedWorker).port.close();\n // else (worker as Worker).terminate();\n // cryptoMessagePort.detachPort(source);\n // }\n // });\n });\n\n const firstWorker = createWorker(originalUrl);\n attachWorkerToPort(firstWorker);\n\n const blob = await get(originalUrl);\n const urlsPromise = await this.invoke('createProxyWorkerURLs', {originalUrl, blob});\n const workers = urlsPromise.slice(1).map(createWorker);\n workers.forEach(attachWorkerToPort);\n }\n\n \n private registerWorker() {\n // return;\n\n let worker: SharedWorker | Worker;\n if(IS_SHARED_WORKER_SUPPORTED) {\n worker = new SharedWorker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n } else {\n worker = new Worker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n }\n\n this.onWorkerFirstMessage(worker);\n }\n \n\n private attachWorkerToPort(worker: SharedWorker | Worker, messagePort: SuperMessagePort, type: string) {\n const port: MessagePort = (worker as SharedWorker).port || worker as any;\n messagePort.attachPort(port);\n\n worker.addEventListener('error', (err) => {\n this.log.error(type, 'worker error', err);\n });\n }\n\n private onWorkerFirstMessage(worker: any) {\n this.log('set webWorker');\n\n // this.worker = worker;\n \n \n \n this.attachWorkerToPort(worker, this, 'mtproto');\n \n }\n\n private loadState() {\n return Promise.all([\n loadState().then((stateResult) => {\n this.newVersion = stateResult.newVersion;\n this.oldVersion = stateResult.oldVersion;\n this.mirrors['state'] = stateResult.state;\n return stateResult;\n })\n // loadStorages(createStorages()),\n ]);\n }\n\n public sendState() {\n return this.loadState().then((result) => {\n const [stateResult] = result;\n this.invoke('state', {...stateResult, userId: rootScope.myId.toUserId()});\n return result;\n });\n }\n\n \n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\n return cryptoMessagePort.invokeCrypto(method, ...args);\n }\n \n\n public async toggleStorages(enabled: boolean, clearWrite: boolean) {\n await toggleStorages(enabled, clearWrite);\n this.invoke('toggleStorages', {enabled, clearWrite});\n this.serviceMessagePort.invokeVoid('toggleStorages', {enabled, clearWrite});\n }\n\n public async getMirror(name: T) {\n const mirror = this.mirrors[name];\n return mirror;\n }\n\n public getState() {\n return this.getMirror('state');\n }\n\n public updateTabState(key: T, value: TabState[T]) {\n this.tabState[key] = value;\n this.invokeVoid('tabState', this.tabState);\n }\n\n public updateTabStateIdle(idle: boolean) {\n this.updateTabState('idleStartTime', idle ? Date.now() : 0);\n }\n\n private onMirrorTask = (payload: MirrorTaskPayload) => {\n const {name, key, value} = payload;\n if(!payload.hasOwnProperty('key')) {\n this.mirrors[name] = value;\n return;\n }\n\n const mirror = this.mirrors[name] ??= {} as any;\n if(value === undefined) {\n delete mirror[key];\n } else {\n mirror[key] = value;\n }\n };\n}\n\ninterface ApiManagerProxy extends MTProtoMessagePort {}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport tabId from '../../config/tabId';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport idleController from '../../helpers/idleController';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport sessionStorage from '../sessionStorage';\nimport apiManagerProxy from './mtprotoworker';\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nexport type InstanceDeactivateReason = 'version' | 'tabs';\n\nconst CHECK_INSTANCE_INTERVAL = 5000;\nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\nconst IS_MULTIPLE_TABS_SUPPORTED = IS_SHARED_WORKER_SUPPORTED;\n\nexport class SingleInstance extends EventListenerBase<{\n activated: () => void,\n deactivated: (reason: InstanceDeactivateReason) => void\n}> {\n private instanceId: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: InstanceDeactivateReason;\n private log = logger('INSTANCE');\n\n constructor() {\n super(false);\n\n this.log = logger('INSTANCE');\n this.instanceId = tabId;\n }\n\n public get deactivatedReason() {\n return this.deactivated;\n }\n\n public start() {\n this.reset();\n\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n idleController.addEventListener('change', this.checkInstance);\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\n this.checkInstance();\n\n try {\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\n } catch(e) {}\n }\n }\n\n private reset() {\n this.masterInstance = false;\n this.clearDeactivateTimeout();\n this.deactivated = undefined;\n }\n\n private clearInstance = () => {\n if(this.masterInstance && !this.deactivated) {\n this.log.warn('clear master instance');\n sessionStorage.delete('xt_instance');\n }\n };\n\n public activateInstance() {\n if(this.deactivated) {\n this.reset();\n this.checkInstance(false);\n this.dispatchEvent('activated');\n }\n }\n\n private deactivateInstance(reason: InstanceDeactivateReason) {\n if(this.masterInstance || this.deactivated) {\n return;\n }\n\n this.log.warn('deactivate', reason);\n this.clearDeactivateTimeout();\n this.deactivated = reason;\n\n this.dispatchEvent('deactivated', reason);\n }\n\n private clearDeactivateTimeout() {\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n }\n\n private checkInstance = async(idle = idleController.isIdle) => {\n if(this.deactivated) {\n return;\n }\n\n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceId,\n idle,\n time\n };\n\n const [curInstance, build = App.build] = await Promise.all([\n sessionStorage.get('xt_instance', false),\n sessionStorage.get('k_build', false)\n ]);\n\n if(build > App.build) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.deactivateInstance('version');\n apiManagerProxy.toggleStorages(false, false);\n return;\n } else if(IS_MULTIPLE_TABS_SUPPORTED) {\n sessionStorage.set({xt_instance: newInstance});\n return;\n }\n\n // this.log('check instance', newInstance, curInstance)\n if(!idle ||\n !curInstance ||\n curInstance.id === this.instanceId ||\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\n sessionStorage.set({xt_instance: newInstance});\n\n if(!this.masterInstance) {\n this.masterInstance = true;\n rootScope.managers.networkerFactory.startAll();\n this.log.warn('now master instance', newInstance);\n }\n\n this.clearDeactivateTimeout();\n } else if(this.masterInstance) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.log.warn('now idle instance', newInstance);\n this.deactivateTimeout ||= window.setTimeout(() => this.deactivateInstance('tabs'), DEACTIVATE_TIMEOUT);\n }\n };\n}\n\nconst singleInstance = new SingleInstance();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\nexport default singleInstance;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport Modes from '../../config/modes';\nimport loadScript from '../../helpers/dom/loadScript';\nimport tsNow from '../../helpers/tsNow';\nimport sessionStorage from '../sessionStorage';\n\nexport class TelegramMeWebManager {\n private disabled = /* false && */(Modes.test || !App.domains.includes(location.hostname));\n\n public setAuthorized(canRedirect: boolean) {\n if(this.disabled) {\n return;\n }\n\n return sessionStorage.get('tgme_sync').then((curValue) => {\n const ts = tsNow(true);\n if(\n canRedirect &&\n curValue?.canRedirect === canRedirect &&\n (curValue.ts + 86400) > ts\n ) {\n return;\n }\n\n sessionStorage.set({\n tgme_sync: {\n canRedirect,\n ts\n }\n });\n\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\n const urls = [\n '//telegram.me/' + path,\n '//t.me/' + path\n ];\n\n const promises = urls.map((url) => {\n return loadScript(url).then((script) => {\n script.remove();\n });\n });\n\n return Promise.all(promises);\n });\n }\n}\n\nconst telegramMeWebManager = new TelegramMeWebManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\nexport default telegramMeWebManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function loadScript(url: string) {\n const script = document.createElement('script');\n const promise = new Promise((resolve) => {\n script.onload = script.onerror = () => {\n resolve(script);\n };\n });\n script.src = url;\n document.body.appendChild(script);\n return promise;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {PushNotificationObject} from '../serviceWorker/push';\nimport type {ServicePushPingTaskPayload} from '../serviceWorker/serviceMessagePort';\nimport type {NotificationSettings} from '../appManagers/uiNotificationsManager';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {logger} from '../logger';\nimport apiManagerProxy from './mtprotoworker';\nimport I18n, {LangPackKey} from '../langPack';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport copy from '../../helpers/object/copy';\nimport singleInstance from './singleInstance';\nimport EventListenerBase from '../../helpers/eventListenerBase';\n\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\n\nexport type PushSubscriptionNotify = {\n tokenType: number,\n tokenValue: string\n};\n\nconst PING_PUSH_INTERVAL = 10000;\n\nexport class WebPushApiManager extends EventListenerBase<{\n push_notification_click: (n: PushNotificationObject) => void,\n push_init: (n: PushSubscriptionNotify) => void,\n push_subscribe: (n: PushSubscriptionNotify) => void,\n push_unsubscribe: (n: PushSubscriptionNotify) => void\n}> {\n public isAvailable = true;\n private isPushEnabled = false;\n private localNotificationsAvailable = true;\n private started = false;\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\n private isAliveTO: any;\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n private userVisibleOnly = this.isFirefox ? false : true;\n private log = logger('PM');\n\n constructor() {\n super(false);\n\n if(!('PushManager' in window) ||\n !('Notification' in window) ||\n !('serviceWorker' in navigator)) {\n this.log.warn('Push messaging is not supported.');\n this.isAvailable = false;\n this.localNotificationsAvailable = false;\n }\n\n if(this.isAvailable && Notification.permission === 'denied') {\n this.log.warn('The user has blocked notifications.');\n }\n }\n\n public start() {\n if(!this.started) {\n this.started = true;\n this.getSubscription();\n this.setUpServiceWorkerChannel();\n }\n }\n\n public setLocalNotificationsDisabled() {\n this.localNotificationsAvailable = false;\n }\n\n public getSubscription() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = !!subscription;\n this.pushSubscriptionNotify('init', subscription);\n }).catch((err) => {\n this.log.error('Error during getSubscription()', err);\n });\n });\n }\n\n public subscribe = () => {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\n // The subscription was successful\n this.isPushEnabled = true;\n this.pushSubscriptionNotify('subscribe', subscription);\n }).catch((e) => {\n if(Notification.permission === 'denied') {\n this.log('Permission for Notifications was denied');\n } else {\n this.log('Unable to subscribe to push.', e);\n if(!this.userVisibleOnly) {\n this.userVisibleOnly = true;\n setTimeout(this.subscribe, 0);\n }\n }\n });\n });\n }\n\n public unsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = false;\n\n if(subscription) {\n this.pushSubscriptionNotify('unsubscribe', subscription);\n\n setTimeout(() => {\n subscription.unsubscribe().then((successful) => {\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }, 3000);\n }\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public forceUnsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.log.warn('force unsubscribe', subscription);\n if(subscription) {\n subscription.unsubscribe().then((successful) => {\n this.log.warn('force unsubscribe successful', successful);\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public isAliveNotify = () => {\n if(!this.isAvailable || singleInstance.deactivatedReason) {\n return;\n }\n\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '');\n\n const lang: ServicePushPingTaskPayload['lang'] = {} as any;\n const ACTIONS_LANG_MAP: Record = {\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\n push_message_nopreview: 'PushNotification.Message.NoPreview'\n };\n\n for(const action in ACTIONS_LANG_MAP) {\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('pushPing', {\n localNotifications: this.localNotificationsAvailable,\n lang: lang,\n settings: this.settings\n });\n\n this.isAliveTO = setTimeout(this.isAliveNotify, PING_PUSH_INTERVAL);\n }\n\n public setSettings(newSettings: WebPushApiManager['settings']) {\n this.settings = copy(newSettings);\n clearTimeout(this.isAliveTO);\n this.isAliveNotify();\n }\n\n public hidePushNotifications() {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('notificationsClear', undefined);\n }\n\n public setUpServiceWorkerChannel() {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.addEventListener('pushClick', (payload) => {\n if(singleInstance.deactivatedReason) {\n appRuntimeManager.reload();\n return;\n }\n\n this.dispatchEvent('push_notification_click', payload);\n });\n\n navigator.serviceWorker.ready.then(this.isAliveNotify);\n }\n\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\n if(subscription) {\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\n if(!subscriptionObj ||\n !subscriptionObj.endpoint ||\n !subscriptionObj.keys ||\n !subscriptionObj.keys.p256dh ||\n !subscriptionObj.keys.auth) {\n this.log.warn('Invalid push subscription', subscriptionObj);\n this.unsubscribe();\n this.isAvailable = false;\n this.pushSubscriptionNotify(event);\n return;\n }\n\n this.log.warn('Push', event, subscriptionObj);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\n tokenType: 10,\n tokenValue: JSON.stringify(subscriptionObj)\n });\n } else {\n this.log.warn('Push', event, false);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\n }\n }\n}\n\nconst webPushApiManager = new WebPushApiManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\nexport default webPushApiManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport IS_OPUS_SUPPORTED from '../environment/opusSupport';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport {Modify} from '../types';\nimport {logger, LogTypes} from './logger';\nimport apiManagerProxy from './mtproto/mtprotoworker';\nimport type {ConvertWebPTask} from './webp/webpWorkerController';\n\ntype Result = {\n bytes: Uint8Array,\n waveform?: Uint8Array\n};\n\ntype Task = {\n pages: Uint8Array,\n withWaveform: boolean,\n waveform?: Uint8Array,\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\n timeout: number\n};\n\nexport interface ConvertOpusTask extends Modify {\n type: 'convertOpus'\n}\n\nexport class OpusDecodeController {\n private worker: Worker;\n private wavWorker: Worker;\n private sampleRate = 48000;\n private tasks: Array = [];\n private keepAlive = false;\n private log = logger('OPUS', LogTypes.Error);\n\n public isPlaySupported() {\n return IS_OPUS_SUPPORTED;\n }\n\n public loadWavWorker() {\n if(this.wavWorker) return;\n\n this.wavWorker = new Worker('waveWorker.min.js');\n this.wavWorker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[WAV] got message:', data);\n if(data && data.page) {\n const bytes = data.page;\n this.onTaskEnd(this.tasks.shift(), bytes);\n }\n });\n }\n\n public loadWorker() {\n if(this.worker) return;\n\n this.worker = new Worker('decoderWorker.min.js');\n this.worker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[DECODER] got message', data);\n if(data.type === 'done') {\n // this.log('[DECODER] send done to wav');\n this.wavWorker.postMessage({command: 'done'});\n\n if(data.waveform) {\n this.tasks[0].waveform = data.waveform;\n }\n } else { // e.data contains decoded buffers as float32 values\n // this.log('[DECODER] send encode to wav');\n this.wavWorker.postMessage({\n command: 'encode',\n buffers: e.data\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\n }\n });\n }\n\n public setKeepAlive(keepAlive: boolean) {\n this.keepAlive = keepAlive;\n if(this.keepAlive) {\n this.loadWorker();\n this.loadWavWorker();\n } else if(!this.tasks.length) {\n this.terminateWorkers();\n }\n }\n\n public onTaskEnd(task: Task, result?: Uint8Array) {\n if(!result) {\n task.callback.reject('timeout');\n } else {\n clearTimeout(task.timeout);\n task.callback.resolve({bytes: result, waveform: task.waveform});\n }\n\n if(this.tasks.length) {\n this.executeNewTask(this.tasks[0]);\n }\n\n this.terminateWorkers();\n }\n\n public terminateWorkers(kill = false) {\n if((this.keepAlive || this.tasks.length) && !kill) return;\n\n if(this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n\n if(this.wavWorker) {\n this.wavWorker.terminate();\n this.wavWorker = null;\n }\n }\n\n public executeNewTask(task: Task) {\n this.worker.postMessage({\n command: 'init',\n decoderSampleRate: this.sampleRate,\n outputBufferSampleRate: this.sampleRate\n });\n\n this.wavWorker.postMessage({\n command: 'init',\n wavBitDepth: 16,\n wavSampleRate: this.sampleRate\n });\n\n // console.log('sending command to worker:', task);\n // setTimeout(() => {\n this.log('[DECODER] send decode');\n this.worker.postMessage({\n command: 'decode',\n pages: task.pages,\n waveform: task.withWaveform\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\n // }, 1e3);\n\n task.timeout = window.setTimeout(() => {\n this.log.error('decode timeout'/* , task */);\n\n this.terminateWorkers(true);\n if(this.tasks.length) {\n this.loadWorker();\n this.loadWavWorker();\n }\n\n this.onTaskEnd(this.tasks.shift());\n }, 10e3);\n }\n\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\n return new Promise((resolve, reject) => {\n const task = {\n pages,\n withWaveform,\n callback: {resolve, reject},\n timeout: 0\n };\n\n this.loadWorker();\n this.loadWavWorker();\n\n if(this.tasks.push(task) === 1) {\n this.executeNewTask(task);\n }\n });\n }\n\n public async decode(typedArray: Uint8Array, withWaveform = false) {\n return this.pushDecodeTask(typedArray, withWaveform).then(async(result) => {\n const dataBlob = new Blob([result.bytes], {type: 'audio/wav'});\n return {url: await apiManagerProxy.invoke('createObjectURL', dataBlob), waveform: result.waveform};\n });\n }\n}\n\nconst opusDecodeController = new OpusDecodeController();\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\nexport default opusDecodeController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n// const markdownTestRegExp = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\n 'Telegram': 'tg://search_hashtag?hashtag={1}',\n 'Twitter': 'https://twitter.com/hashtag/{1}',\n 'Instagram': 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\n/* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n} */\n\n\n/* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n} */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type addAnchorListener from '../../helpers/addAnchorListener';\nimport {PHONE_NUMBER_REG_EXP} from '.';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport matchUrlProtocol from './matchUrlProtocol';\nimport {T_ME_PREFIXES} from '../mtproto/mtproto_config';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean) {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n const out: {url: string, onclick?: Parameters[0]['name']} = {url};\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: typeof out['onclick'];\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?(?:(.+?)\\.)?(?:(?:web|k|z)\\.)?t(?:elegram)?\\.me(?:\\/(.+))?/))) {\n const u = new URL(url);\n let prefix = tgMeMatch[1];\n if(prefix && T_ME_PREFIXES.has(tgMeMatch[1])) {\n prefix = undefined;\n }\n\n if(prefix) {\n u.pathname = prefix + (u.pathname === '/' ? '' : u.pathname);\n }\n\n const fullPath = u.pathname.slice(1);\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n } else if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) { // second regexp is for phone numbers (t.me/+38050...)\n onclick = 'joinchat';\n } else switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'addemoji':\n case 'voicechat':\n case 'invoice':\n if(path.length !== 1 && !prefix) {\n onclick = path[0];\n break;\n }\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1] as any;\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n\n out.onclick = onclick;\n return out;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.wrapUrl = wrapUrl);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\nimport type {Dialog, ForumTopic, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport type {MTAppConfig} from './mtproto/appConfig';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n 'chat_toggle_forum': {chatId: ChatId, enabled: boolean},\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, threadId?: number, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': {peerId: PeerId, threadId?: number},\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog | ForumTopic, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog | ForumTopic},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': Dialog | ForumTopic,\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog | ForumTopic,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map}>,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n\n 'contacts_update': UserId,\n 'avatar_update': {peerId: PeerId, threadId?: number},\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n // 'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n\n 'background_change': void,\n\n 'privacy_update': Update.updatePrivacy,\n\n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n\n 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': void,\n\n 'media_play': void,\n\n 'emoji_recent': AppEmoji,\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\n\n 'premium_toggle': boolean,\n 'premium_toggle_private': {isNew: boolean, isPremium: boolean},\n\n 'config': Config,\n 'app_config': MTAppConfig\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle_private', ({isNew, isPremium}) => {\n this.premium = isPremium;\n\n if(!isNew) {\n this.dispatchEventSingle('premium_toggle', isPremium);\n }\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {WorkerTaskVoidTemplate} from '../../types';\n\nexport interface ConvertWebPTask extends WorkerTaskVoidTemplate {\n type: 'convertWebp',\n payload: {\n fileName: string,\n bytes: Uint8Array\n }\n};\n\nexport class WebpWorkerController {\n private worker: Worker;\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\n\n private init() {\n this.worker = new Worker(new URL('./webp.worker.ts', import.meta.url));\n this.worker.addEventListener('message', (e) => {\n const task = e.data as ConvertWebPTask;\n const payload = task.payload;\n\n const promise = this.convertPromises[payload.fileName];\n if(promise) {\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\n delete this.convertPromises[payload.fileName];\n }\n });\n }\n\n private postMessage(data: ConvertWebPTask) {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.worker.postMessage(data);\n }\n\n public convert(fileName: string, bytes: Uint8Array) {\n if(this.convertPromises.hasOwnProperty(fileName)) {\n return this.convertPromises[fileName];\n }\n\n const convertPromise = deferredPromise();\n\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\n\n return this.convertPromises[fileName] = convertPromise;\n }\n}\n\nconst webpWorkerController = new WebpWorkerController();\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\nexport default webpWorkerController;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"589\":\"crypto.worker\",\"630\":\"npm.qr-code-styling\",\"670\":\"sw\",\"678\":\"mtproto.worker\"}[chunkId] || chunkId) + \".\" + {\"8\":\"570e6da51a125009c156\",\"53\":\"77c5dab45a68d1851187\",\"61\":\"5322bb4d26ac11c98a86\",\"63\":\"0d39a81590990db74d39\",\"77\":\"18305e1bd331a0fdd36c\",\"104\":\"f1e35ff90b4ddd68a9d8\",\"231\":\"4dbf43eb5012e83665e1\",\"301\":\"42dc636f96a62f6a08c8\",\"339\":\"79c7f9c2341eeff66b88\",\"392\":\"198d4679664c1bf4c989\",\"436\":\"47558d0a092967b3c966\",\"437\":\"d40e517d52e5dcf3b754\",\"442\":\"645fe71c30545d9700d2\",\"460\":\"ecea63a28e50b5f10803\",\"508\":\"52f2ca7abd721f25f9ec\",\"539\":\"17a0b07b4e6476f19654\",\"589\":\"574dd04f2dfaff484dc3\",\"630\":\"2c5d57550714b1a9e42e\",\"641\":\"11406cec52b05304f14f\",\"642\":\"fd1ade69544ad78671c6\",\"670\":\"ba14f2a9396f7e4e1890\",\"678\":\"5f4ea67830e476bd70ac\",\"709\":\"73c949c4c6702cdf349b\",\"776\":\"b547f5293903351f3ec7\",\"781\":\"af546badf2c525815889\",\"783\":\"827711558099e62fd694\",\"810\":\"f272bad8a3948af5c8d0\",\"813\":\"06763bece6721fb81fde\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [85,946], () => (__webpack_require__(2938)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","IS_BETA","DEBUG","MOUNT_CLASS_TO","window","self","STATE_VERSION","BUILD","DEFAULT_THEME","_","access_hash","id","settings","pFlags","base_theme","accent_color","message_colors","wallpaper","default","pattern","document","undefined","slug","intensity","background_color","second_background_color","third_background_color","fourth_background_color","dark","title","emoticon","makeDefaultAppTheme","name","baseTheme","highlightningColor","find","s","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsListCachedTime","updates","filtersArr","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","recentCustomEmoji","topPeersCache","recentSearch","version","build","authState","IS_MOBILE","hiddenPinnedMessages","messagesTextSize","distanceUnit","sendShortcut","animationsEnabled","autoDownload","photo","contacts","private","groups","channels","video","file","autoDownloadNew","file_size_max","video_preload_large","audio_preload_next","photo_size_max","video_size_max","video_upload_maxbitrate","autoPlay","gifs","videos","stickers","suggest","loop","emoji","big","themes","theme","notifications","sound","timeFormat","toLocaleString","match","playbackParams","volume","muted","playbackRate","playbackRates","voice","audio","round","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","IS_APPLE_MX","ctx","createElement","getContext","extension","getExtension","renderer","getParameter","UNMASKED_RENDERER_WEBGL","getSupportedExtensions","indexOf","err","CAN_USE_TRANSFERABLES","IS_SAFARI","navigator","userAgent","search","geolocation","getCurrentPosition","IMAGE_MIME_TYPES_SUPPORTED","Set","add","arr","concat","canPlayType","IS_APPLE_MOBILE","replace","IS_FIREFOX","mediaDevices","DocumentTouch","USER_AGENT","IS_APPLE","IS_ANDROID","toLowerCase","IS_CHROMIUM","test","vendor","platform","maxTouchPoints","IS_MOBILE_SAFARI","vibrate","VIDEO_MIME_TYPES_SUPPORTED","toDataURL","startsWith","rgbaToHsla","r","g","b","a","max","Math","min","h","l","d","hslaToRgba","hue2rgb","p","q","t","map","v","hexaToRgba","hexa","offset","length","slice","i","push","parseInt","hexToRgb","hex","hexaToHsla","rgba","rgbaToHexa","toString","join","hslaStringToHex","hsla","splitted","split","alpha","pop","val","endsWith","hslaStringToRgba","hslaStringToHexa","compareVersion","v1","v2","s1","s2","blurActiveElement","activeElement","blur","cancelEvent","event","cancelable","originalEvent","stopPropagation","preventDefault","returnValue","cancelBubble","findUpClassName","el","className","closest","fixSafariStickyInput","input","style","transform","focus","then","IS_STICKY_INPUT_BUGGED","key","startY","o","capture","passive","onTouchMove","e","touch","touches","scrollable","target","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","fixSafariStickyInputFocusing","callback","cacheInstallPrompt","deferredPrompt","prompt","outcome","userChoice","getInstallPrompt","texts","cache","fonts","text","icons","monospace","loadFonts","types","Promise","resolve","promises","type","_texts","font","weights","weight","_promises","load","race","all","catch","setInnerHTML","elem","html","setDirection","innerHTML","replaceChildren","setAttribute","FOCUS_EVENT_NAME","IdleController","constructor","super","this","_isIdle","focusPromise","focusResolve","isIdle","once","idle","getFocusPromise","value","dispatchEvent","OverlayCounter","overlaysActive","isOverlayActive","fastRafCallbacks","fastRaf","requestAnimationFrame","currentCallbacks","forEach","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","parseUriParams","uri","params","item","decodeURIComponent","themeController","setTheme","themeColorElem","_themeColorElem","head","querySelector","setThemeColor","color","themeColor","isNight","setThemeListener","darkModeMediaQuery","matchMedia","checkDarkMode","systemTheme","matches","addListener","applyHighlightningColor","getTheme","documentElement","setProperty","removeProperty","colorScheme","toggle","workerHandler","construct","args","url","location","Worker","SharedWorker","filter","Boolean","w","Proxy","setWorkerProxy","Element","prototype","toggleAttribute","force","hasAttribute","removeAttribute","Node","nodes","textContent","append","rootScope","getProxiedManagers","getElementById","href","singleInstance","visualViewport","lastVH","setViewportVH","setVH","vh","overlayCounter","height","innerHeight","toggleResizeMode","tabId","onImTabChange","wasTabId","tagName","appMediaViewer","perf","performance","langPromise","stateResult","langPack","fadeInWhenFontsReady","promise","opacity","state","isPremium","appVersion","lang_code","console","log","dir","hash","tgWebAuthToken","data","token","dcId","tgWebAuthDcId","userId","tgWebAuthUserId","toUserId","isTest","tgWebAuthTest","tgAddr","tgaddr","urlSearchParams","URLSearchParams","set","delete","pagePromise","placeholder","prepend","cloneNode","meModule","pushModule","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","pause","ready","reload","close","DEBUG_MANAGER_REQUESTS","createProxyProxy","proxied","ack","get","receiver","method","has","warn","createProxy","acknowledged","IDB","db","storageIsAvailable","openDatabase","INSTANCES","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","Array","from","indexName","deleteIndex","indexes","index","createIndex","keyPath","objectParameters","request","indexedDB","open","reject","error","message","finished","setTimeout","onerror","onsuccess","result","calledNew","onclose","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","instance","preserve","storage","IDBStorage","storeName","idb","create","entryName","isArray","getObjectStore","clear","save","idx","put","mode","onError","clearTimeout","timeout","onComplete","results","requests","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","UNSUPPORTED_LANG_PACK_KEY","I18n","pluralRules","cacheLangPackPromise","setLangCode","langCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","date","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","lang","langSign","countries","strings","formatLocalStrings","saveLangPack","from_version","local","loadLangPack","web","requestedServerLanguage","managers","apiManager","invokeApiCacheable","lang_pack","polyfillPromise","pushTo","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","querySelectorAll","element","weakMap","update","superFormatter","indexHolder","out","lastIndex","p1","p2","p3","p4","lastIndexOf","wrappedUrl","onclick","DocumentFragment","firstChild","arg","pushNextArgument","plain","str","select","Map","isRTL","setRTL","rtl","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","keys","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","_Intl","Object","assign","WeakMap","IntlElementBase","options","property","IntlElement","formatted","dataset","compareAndUpdate","json","JSON","stringify","DateTimeFormat","hours","getHours","getMinutes","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","isLast","useLast","joined","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","TOPIC_COLORS","ATTACH_MENU_BOT_ICON_NAME","GENERAL_TOPIC_ID","T_ME_PREFIXES","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","IS_CALL_SUPPORTED","IS_CANVAS_FILTER_SUPPORTED","IS_EMOJI_SUPPORTED","IS_GEOLOCATION_SUPPORTED","IS_GROUP_CALL_SUPPORTED","IS_MOV_SUPPORTED","IS_PARALLAX_SUPPORTED","IS_SCREEN_SHARING_SUPPORTED","IS_TOUCH_SUPPORTED","IS_VIBRATE_SUPPORTED","IS_OPUS_SUPPORTED","IS_SHARED_WORKER_SUPPORTED","IS_WEBM_SUPPORTED","IS_WEBP_SUPPORTED","IS_WEBRTC_SUPPORTED","MEDIA_MIME_TYPES_SUPPORTED","ALL_KEYS","REFRESH_KEYS","loadStateInner","logger","totalPerf","recordPromise","stateStorage","sessionStorage","pushedKeys","pushToState","copy","splice","auth","shift","sessionBuild","shiftedWebKAuth","values","dcID","toPeerId","obj","resetStorages","chats","dialogs","users","_state","state_id","time","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","SKIP_VALIDATING_PATHS","validateInitObject","missingKey","migrated","oldThemes","oldTheme","oldBackground","background","newTheme","colors","wallPaper","wallPaperSettings","k_build","ApiManagerProxy","onMirrorTask","payload","hasOwnProperty","mirrors","mirror","tabState","chatPeerIds","idleStartTime","registerWorker","registerServiceWorker","registerCryptoWorker","addMultipleEventsListeners","convertWebp","fileName","bytes","webpWorkerController","convertOpus","opusDecodeController","localStorageProxy","storageTask","language","toggleStorages","telegramMeWebManager","webPushApiManager","cacheName","caches","appRuntimeManager","idleController","updateTabStateIdle","invoke","pingServiceWorkerWithIframe","pingServiceWorkerPromise","iframe","hidden","onLoad","remove","src","random","body","attachServiceWorker","serviceWorker","lastServiceWorker","serviceMessagePort","detachPort","attachSendPort","invokeVoid","_registerServiceWorker","register","URL","scope","registration","active","controller","unregister","installing","waiting","worker","attachListenPort","port","source","ports","hello","resendLockTask","share","originals","originalUrl","createWorker","attachWorkerToPort","cryptoMessagePort","blob","fetch","response","pathnameSplitted","pathname","origin","Blob","onWorkerFirstMessage","messagePort","attachPort","loadState","sendState","invokeCrypto","enabled","clearWrite","getMirror","getState","updateTabState","apiManagerProxy","IS_MULTIPLE_TABS_SUPPORTED","SingleInstance","clearInstance","masterInstance","deactivated","checkInstance","newInstance","instanceId","curInstance","deactivateInstance","xt_instance","clearDeactivateTimeout","deactivateTimeout","deactivatedReason","start","reset","started","setInterval","activateInstance","reason","TelegramMeWebManager","disabled","hostname","canRedirect","curValue","ts","tsNow","tgme_sync","path","encodeURIComponent","script","onload","appendChild","loadScript","WebPushApiManager","isPushEnabled","localNotificationsAvailable","isFirefox","userVisibleOnly","subscribe","reg","pushManager","subscription","pushSubscriptionNotify","Notification","permission","isAliveNotify","baseUrl","ACTIONS_LANG_MAP","push_action_mute1d","push_action_settings","push_message_nopreview","action","localNotifications","isAliveTO","getSubscription","setUpServiceWorkerChannel","setLocalNotificationsDisabled","unsubscribe","successful","setSettings","newSettings","hidePushNotifications","subscriptionObj","toJSON","endpoint","p256dh","tokenType","tokenValue","sampleRate","tasks","keepAlive","isPlaySupported","loadWavWorker","wavWorker","page","onTaskEnd","loadWorker","postMessage","command","waveform","buffers","typedArray","buffer","setKeepAlive","terminateWorkers","task","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","decode","dataBlob","ALPHA_CHARS_REG_EXP","ALPHA_NUMERIC_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","RegExp","USERNAME_REG_EXP","BOT_COMMAND_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","SITE_HASHTAGS","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","wrapUrl","unsafe","tgMeMatch","telescoPeMatch","tgMatch","u","prefix","fullPath","RootScope","myId","connectionStatus","premium","isNew","dispatchEventSingle","status","getConnectionStatus","getPremium","convertPromises","init","convert","convertPromise","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","n","getter","__esModule","getPrototypeOf","ns","def","current","getOwnPropertyNames","definition","defineProperty","enumerable","f","chunkId","reduce","miniCssF","globalThis","Function","prop","done","needAttach","scripts","getElementsByTagName","getAttribute","charset","nc","onScriptComplete","prev","doneFns","parentNode","removeChild","bind","Symbol","toStringTag","scriptUrl","importScripts","currentScript","Error","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","baseURI","installedChunks","installedChunkData","errorType","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.5f4ea67830e476bd70ac.chunk.js b/public/mtproto.worker.5f4ea67830e476bd70ac.chunk.js deleted file mode 100644 index 0b157dde..00000000 --- a/public/mtproto.worker.5f4ea67830e476bd70ac.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";var e,t,a={410:(e,t,a)=>{a.d(t,{GO:()=>n,ZP:()=>i});const s=a(1267).Z.debug,n="undefined"!=typeof window?window:self,i=s},3447:(e,t,a)=>{a.d(t,{Z:()=>i});const s={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0}},n=s[""];for(const e in s)e&&Object.assign(n,s[e]);const i=n},4762:(e,t,a)=>{a.d(t,{IS_FIREFOX:()=>r,IS_SAFARI:()=>i});var s=a(6761);const n=navigator?navigator.userAgent:null,i=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&s.Z.MSStream,!!("safari"in s.Z)||!(!n||!(/\b(iPad|iPhone|iPod)\b/.test(n)||n.match("Safari")&&!n.match("Chrome")))),r=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;(void 0===navigator.maxTouchPoints||navigator.maxTouchPoints>0)&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},467:(e,t,a)=>{a.d(t,{ZP:()=>o,gV:()=>p});var s=a(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,i=/^\s+|\s$/g,r={й:"q",ц:"w",у:"e",к:"r",е:"t",н:"y",г:"u",ш:"i",щ:"o",з:"p",х:"[",ъ:"]",ф:"a",ы:"s",в:"d",а:"f",п:"g",р:"h",о:"j",л:"k",д:"l",ж:";",э:"'",я:"z",ч:"x",с:"c",м:"v",и:"b",т:"n",ь:"m",б:",",ю:".",".":"/"};function o(e,t=!0){return p(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function p(e,t={}){const a=t.includeTag&&"%"===e.charAt(0),o=e;return t.clearBadChars&&(e=function(e){return e.replace(n,"").replace(i,"")}(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),a&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wа-я]/g,(e=>{const t=r[e];return null!=t?t:e}))}(o)),e}},8801:(e,t,a)=>{a.d(t,{P:()=>n,q:()=>i});const s="_";function n(e,t){const a=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(s);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(s);break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join(s);break;default:console.error("Unrecognized location:",e),n=""}return n+((null==t?void 0:t.downloadId)?"_download":"")+(a?"."+a:a)}function i(e,t){return e+"/"+encodeURIComponent(JSON.stringify(t))}},677:(e,t,a)=>{a.d(t,{Ki:()=>o,RP:()=>i,X:()=>r});const s=new Set(["all","web","webk"]),n=new Set;function i(e){return e.find((e=>s.has(e.platform)&&!n.has(e.reason)))}function r(e){return!!i(e)}function o(e){n.clear(),e.forEach((e=>{n.add(e)}))}},2946:(e,t,a)=>{a.d(t,{Z:()=>i});var s=a(5880),n=a(1507);function i(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,s.Z)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const a=e.channel_id||e.chat_id;return void 0!==a?a.toPeerId(!0):n.NM}if(!e)return n.NM;const t="u"===e.charAt(0),a=e.substr(1).split("_");return t?a[0].toPeerId():(a[0]||"").toPeerId(!0)}},6666:(e,t,a)=>{a.d(t,{C:()=>o,Z:()=>p});var s=a(1267),n=a(5471),i=a(5953),r=a(5003);class o{constructor(e){(0,i.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,r.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),o.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var a;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(a=t.indexes)||void 0===a?void 0:a.length)for(const a of t.indexes)e.indexNames.contains(a.indexName)||e.createIndex(a.indexName,a.keyPath,a.objectParameters)};try{var a=indexedDB.open(this.name,this.version);if(!a)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||a.onerror((0,n.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,n)=>{a.onsuccess=t=>{s=!0;const i=a.result;let r=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},i.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},a.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},a.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const a=e.target,n=a.result;this.stores.forEach((e=>{if(n.objectStoreNames.contains(e.name)){const s=a.transaction.objectStore(e.name);t(s,e)}else((e,a)=>{const s=e.createObjectStore(a.name);t(s,a)})(n,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new o(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const a=t.db;a&&(a.onclose=()=>{},a.close())}))}}o.INSTANCES=[];class p{constructor(e,t){this.storeName=t,this.log=(0,r.kg)(["IDB",e.name,t].join("-")),this.idb=o.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,a){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(a=>e.map(((e,s)=>a.put(t[s],e)))),"",a)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,a,s=this.storeName){let n;return a&&(n=performance.now(),this.log(a+": start")),this.idb.openDatabase().then((i=>new Promise(((r,o)=>{const p=i.transaction([s],e),d=()=>{clearTimeout(l),o(p.error)},f=()=>{clearTimeout(l),a&&this.log(a+": end",performance.now()-n);const e=h.map((e=>e.result));r(g?e:e[0])};p.onerror=d;const c="readwrite"===e;c&&(p.oncomplete=()=>f());const l=setTimeout((()=>{this.log.error("transaction not finished",p,a)}),1e4),m=t(p.objectStore(s)),g=Array.isArray(m),h=g?m:[].concat(m);if(c)return;const u=h.length;let y=u;const _=()=>{p.error||--y||f()};for(let e=0;ee.getAll()),"",e)}}},1082:(e,t,a)=>{a.d(t,{r:()=>Ws,H:()=>Hs}),a(690),a(4110);var s=a(8630);let n;function i(){return n}function r(e){return n=e}var o=a(1507),p=a(3241),d=a(410),f=a(3206),c=a(1352);class l extends p.Z{constructor(){super(),this.myId=o.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("premium_toggle_private",(({isNew:e,isPremium:t})=>{this.premium=t,e||this.dispatchEventSingle("premium_toggle",t)})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),f.Z.getInstance().invokeVoid("event",{name:e,args:t})},c.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}getPremium(){return this.premium}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const m=new l;d.GO.rootScope=m;const g=m;var h=a(7922),u=a(9750);const y=new class{constructor(){this.state={},this.storage=h.Z}getState(){return Promise.resolve(this.state)}setByKey(e,t){!function(e,t,a){const s=t.split(".");(0,u.Z)(e,s.slice(0,-1).join("."))[s.pop()]=a}(this.state,e,t);const a=e.split(".")[0];"settings"===a&&g.dispatchEvent("settings_updated",{key:e,value:t,settings:this.state.settings}),this.pushToState(a,this.state[a])}pushToState(e,t,a=!0,s){a&&(this.state[e]=t),this.setKeyValueToStorage(e,t,s)}setKeyValueToStorage(e,t=this.state[e],a){f.Z.getInstance().invokeVoid("mirror",{name:"state",key:e,value:t}),this.storage.set({[e]:t},a)}};var _=a(4159),v=a(3725),P=a(5418),b=a(1267),M=a(1655),I=a(5003);class S{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=b.Z.debug&&!1;let s=I.v9.Error|I.v9.Log;this.debug&&(s|=I.v9.Debug),this.log=(0,I.kg)(`HTTP-${e}`+a,s),this.log("constructor"),this.connected=!1}_send(e,t){const a=e.length;return this.debug&&this.log.debug("-> body length to send:",a),fetch(this.url,{method:"POST",body:e,mode:t}).then((e=>{if(200!==e.status&&!t)throw e.arrayBuffer().then((e=>{this.log.error("not 200",new TextDecoder("utf-8").decode(new Uint8Array(e)))})),e;return this.setConnected(!0),e.arrayBuffer().then((e=>new Uint8Array(e)))}),(e=>{throw this.setConnected(!1),e}))}setConnected(e){this.connected===e||this.destroyed||(this.connected=e,Z.setTransportValue("https",e))}destroy(){this.setConnected(!1),this.destroyed=!0,this.pending.forEach((e=>e.reject())),this.pending.length=0}send(e){if(this.networker)return this._send(e);{const t=new Promise(((t,a)=>{this.pending.push({resolve:t,reject:a,body:e})}));return this.releasePending(),t}}releasePending(){return e=this,t=void 0,s=function*(){if(!this.releasing){this.releasing=!0;for(let e=0;e{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=e=>{this.log.error("handleError",e),this.close()},this.handleClose=e=>{this.log("closed",e),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=e=>{this.debug&&this.log.debug("<-","handleMessage",e.data.byteLength),this.dispatchEvent("message",e.data)},this.send=e=>{this.debug&&this.log.debug("-> body length to send:",e.length),this.ws.send(e)};let s=I.v9.Error|I.v9.Log;return this.debug&&(s|=I.v9.Debug),this.log=(0,I.kg)(`WS-${e}`+a,s),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(e){}this.handleClose()}}}function w(e){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(e),e}var k=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class A{constructor(){this._process=(e,t)=>s.Z.invokeCryptoNew({method:"aes-ctr-process",args:[{id:this.id,data:e,operation:t}],transfer:[e.buffer]})}init(e){return k(this,void 0,void 0,(function*(){void 0!==this.idPromise&&this.release();const t=new Uint8Array(64);for(w(t);;){const e=t[3]<<24|t[2]<<16|t[1]<<8|t[0],a=t[7]<<24|t[6]<<16|t[5]<<8|t[4];if(239!==t[0]&&1145128264!==e&&1414745936!==e&&542393671!==e&&1230262351!==e&&4008636142!==e&&3722304989!==e&&0!==a)break;w(t)}const a=t.slice().reverse(),n=t.slice(8,40),i=t.slice(40,56),r=a.slice(8,40),o=a.slice(40,56),p=this.idPromise=s.Z.invokeCrypto("aes-ctr-prepare",{encKey:n,encIv:i,decKey:r,decIv:o});this.process=(e,t)=>k(this,void 0,void 0,(function*(){return yield p,this._process(e,t)})),this.id=yield p,this.process=this._process,t.set(e.obfuscateTag,56);const d=yield this.encode(t.slice());return t.set(d.slice(56,64),56),t}))}encode(e){return this.process(e,"encrypt")}decode(e){return this.process(e,"decrypt")}release(){return k(this,void 0,void 0,(function*(){const e=this.idPromise;if(void 0===e)return;this.id=void 0,this.idPromise=void 0;const t=yield e;s.Z.invokeCrypto("aes-ctr-destroy",t)}))}destroy(){this.release()}}const D=new class{constructor(){this.tag=239,this.obfuscateTag=new Uint8Array([this.tag,this.tag,this.tag,this.tag])}encodePacket(e){const t=e.byteLength>>2;let a;return a=t<127?new Uint8Array([t]):new Uint8Array([127,255&t,t>>8&255,t>>16&255]),a.concat(e)}readPacket(e){let t=e[0];return t>=127?(t=e[1]|e[2]<<8|e[3]<<16,e.slice(4,t<<3)):e.slice(1,t<<3)}};var U=a(9174);function T(e){const t=e.length,a=new Array(t);for(let s=0;sF(this,void 0,void 0,(function*(){this.connected=!0,Z.setTransportOpened("websocket");const e=yield this.obfuscation.init(this.codec);this.connected&&(this.connection.send(e),this.networker&&(this.pending.length=0,this.networker.setConnectionStatus(U.Q.Connected),this.networker.cleanupSent(),this.networker.resend()),setTimeout((()=>{this.releasePending()}),0))})),this.onMessage=e=>F(this,void 0,void 0,(function*(){let t=yield this.obfuscation.decode(new Uint8Array(e));if(t=this.codec.readPacket(t),this.networker)return this.debug&&this.log.debug("redirecting to networker",t.length),void this.networker.parseResponse(t).then((e=>{this.debug&&this.log.debug("redirecting to networker response:",e);try{this.networker.processMessage(e.response,e.messageId,e.sessionId)}catch(e){this.log.error("handleMessage networker processMessage error",e)}})).catch((e=>{this.log.error("handleMessage networker parseResponse error",e)}));const a=this.pending.shift();a?a.resolve(t):this.debug&&this.log.debug("no pending for res:",T(t))})),this.onClose=()=>{let e,t;if(this.clear(),this.autoReconnect){const a=Date.now(),s=a-this.lastCloseTime;e=!isNaN(s)&&s{if(void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0),!this.connection){if(this.log("trying to reconnect..."),this.lastCloseTime=Date.now(),this.networker)this.networker.setConnectionStatus(U.Q.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=I.v9.Error|I.v9.Log;this.debug&&(i|=I.v9.Debug),this.log=(0,I.kg)(`TCP-${t}`+s,i),this.log("constructor"),this.connect()}clear(){this.connected&&Z.setTransportClosed("websocket"),this.connected=!1,this.connection&&(this.connection.removeEventListener("open",this.onOpen),this.connection.removeEventListener("close",this.onClose),this.connection.removeEventListener("message",this.onMessage),this.connection=void 0)}forceReconnect(){this.close(),this.reconnect()}destroy(){this.setAutoReconnect(!1),this.close(),this.obfuscation&&this.obfuscation.destroy(),this.pending.forEach((e=>{e.reject&&e.reject()})),this.pending.length=0}close(){const e=this.connection;if(e){const t=this.connected;this.clear(),t&&(e.addEventListener("message",this.onMessage),e.addEventListener("close",(()=>{e.removeEventListener("message",this.onMessage)}),{once:!0}),e.close())}}setAutoReconnect(e){this.autoReconnect=e,e?this.connection||void 0!==this.reconnectTimeout||this.reconnect():void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}connect(){this.connection&&this.close(),this.connection=new this.Connection(this.dcId,this.url,this.logSuffix),this.connection.addEventListener("open",this.onOpen),this.connection.addEventListener("close",this.onClose),this.connection.addEventListener("message",this.onMessage)}changeUrl(e){this.url!==e&&(this.url=e,this.forceReconnect())}encodeBody(e){const t=this.codec.encodePacket(e);return this.obfuscation.encode(t)}send(e){this.debug&&this.log.debug("-> body length to pending:",e.length);const t=void 0;if(!this.networker){const a=new Promise(((a,s)=>{this.pending.push({resolve:a,reject:s,body:e,encoded:t})}));return this.releasePending(),a}this.pending.push({body:e,encoded:t}),this.releasePending()}releasePending(){var e;return F(this,void 0,void 0,(function*(){if(!this.connected||this.releasingPending)return;this.releasingPending=!0;let t=this.pending.length,a=!1;for(let s=0;s body length to send:",i.length);const r=null!==(e=n.encoded)&&void 0!==e?e:n.encoded=yield this.encodeBody(i);if(!this.connected)break;this.connection.send(r),n.resolve?n.bodySent=!0:(this.pending.splice(s--,1),t--),a=!0}}this.releasingPending=void 0,this.pending.length&&a&&this.releasePending()}))}}const x=b.Z.test?"_test":"";function B(e){return"client"===e?"":"-1"}function V(e,t,a){const s=B(t),n="client"!==t?"apiws"+x+(a?"_premium":""):"apiws"+x;return`wss://${_.Z.suffix.toLowerCase()}ws${e}${s}.web.telegram.org/${n}`}class O{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=b.Z.test?[{id:1,host:"149.154.175.10",port:80},{id:2,host:"149.154.167.40",port:80},{id:3,host:"149.154.175.117",port:80}]:[{id:1,host:"149.154.175.50",port:80},{id:2,host:"149.154.167.50",port:80},{id:3,host:"149.154.175.100",port:80},{id:4,host:"149.154.167.91",port:80},{id:5,host:"149.154.171.5",port:80}],this.chosenServers={},this.transportSocket=(e,t,a)=>{const s=V(e,t,a);let n;return n=C,new R(n,e,s,"upload"===t?"-U":"download"===t?"-D":"",1e4)},this.transportHTTP=(e,t,a)=>{let s;if(b.Z.ssl||!b.Z.http){const a=B(t);s="https://"+(this.sslSubdomains[e-1]+a)+".web.telegram.org/"+(b.Z.test?"apiw_test1":"apiw1")}else for(const t of this.dcOptions)if(t.id===e){s="http://"+t.host+(80!==t.port?":"+t.port:"")+"/apiw1";break}return new S(e,s,"upload"===t?"-U":"download"===t?"-D":"")}}chooseServer(e,t="client",a=b.Z.transport,s=!0,n){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const i=this.chosenServers[a][t];e in i||(i[e]=[]);const r=i[e];if(!r.length||!s){let i;return i=("websocket"===a?this.transportSocket:this.transportHTTP)(e,t,n),i?(s&&r.push(i),i):(console.error("No chosenServer!",e),null)}return r[0]}static removeTransport(e,t){for(const a in e)for(const s in e[a])for(const n in e[a][s]){const i=e[a][s][n];(0,M.Z)(i,t)}}}var L=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class N extends p.Z{constructor(){super(!0),this.opened=new Map,this.addEventListener("change",(e=>{e.get("websocket")||this.waitForWebSocket()}))}pingTransports(){var e;return L(this,void 0,void 0,(function*(){const t=null!==(e=this.dcConfigurator)&&void 0!==e?e:this.dcConfigurator=new O,a=this.transports={https:t.chooseServer(_.Z.baseDcId,"client","https",!1),websocket:t.chooseServer(_.Z.baseDcId,"client","websocket",!1)},s=(0,v.Z)();this.transports.https._send(new Uint8Array,"no-cors").then((()=>s.resolve(!0)),(()=>s.resolve(!1))),setTimeout((()=>s.resolve(!1)),2e3);const n=(0,v.Z)(),i=a.websocket;i.setAutoReconnect(!1),i.connection.addEventListener("close",(()=>n.resolve(!1)),{once:!0}),i.connection.addEventListener("open",(()=>n.resolve(!0)),{once:!0}),setTimeout((()=>{n.isFulfilled||n.isRejected||(i.connection&&i.connection.close(),n.resolve(!1))}),2e3);const[r,o]=yield Promise.all([s,n]);for(const e in a)a[e].destroy();return{https:r||this.opened.get("https")>0,websocket:o||this.opened.get("websocket")>0}}))}waitForWebSocket(){return L(this,void 0,void 0,(function*(){if(!this.pinging){for(this.pinging=!0;;){const{https:e,websocket:t}=yield this.pingTransports();if((e||t)&&this.dispatchEvent("transport",t||!e?"websocket":"https"),t)break;yield(0,P.Z)(1e4)}this.pinging=!1}}))}setTransportValue(e,t){let a=this.opened.get(e)||0;a+=t?1:-1,this.opened.set(e,a),this.dispatchEvent("change",this.opened)}setTransportOpened(e){return this.setTransportValue(e,!0)}setTransportClosed(e){return this.setTransportValue(e,!1)}}const Z=new N,j=(0,v.Z)();var q=a(6654);class G{setManagers(e){Object.assign(this,e)}}var H=a(3127),W=a(3989),z=a(5466);let K;function J(e){return null!=K?K:K=function(e){return t=this,a=void 0,n=function*(){const t=(0,z.$)((0,I.kg)("STORAGES-LOADER")),a=Object.keys(e),s=a.map((a=>{const s=e[a].getAll();return t(s,"storage "+a)})),n={},i=yield Promise.all(s);for(let e=0,t=a.length;e({storage:this.storages[e],results:t[e]})))},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}}class Q extends G{getState(){return this.apiManager.invokeApi("account.getPassword").then((e=>e))}updateSettings(e={}){return this.getState().then((t=>{let a,s;const n={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};a=e.currentPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const i=t.new_algo,r=new Uint8Array(i.salt1.length+32);return w(r),r.set(i.salt1,0),i.salt1=r,s=e.newPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([a,s]).then((e=>(n.password=e[0],n.new_settings.new_algo=i,n.new_settings.new_password_hash=e[1],this.apiManager.invokeApi("account.updatePasswordSettings",n))))}))}getInputCheckPassword(e,t){return this.cryptoWorker.invokeCrypto("computeSRP",e,t,!1)}check(e,t,a={}){return this.getInputCheckPassword(e,t).then((e=>this.apiManager.invokeApi("auth.checkPassword",{password:e},a).then((e=>("auth.authorization"===e._&&this.apiManager.setUser(e.user),e)))))}confirmPasswordEmail(e){return this.apiManager.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return this.apiManager.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return this.apiManager.invokeApi("account.cancelPasswordEmail")}}var Y=a(6848),X=a(5471);class ee extends G{constructor(){super(...arguments),this.contexts=new Map,this.links={},this.log=(0,I.kg)("RD",void 0,!0)}saveContext(e,t,a){[a,e]=this.getContexts(e),a||(a=new Set,this.contexts.set(e,a)),this.links[T(e)]=e;for(const e of a)if((0,Y.Z)(e,t))return;a.add(t)}getReferenceByLink(e){return this.links[T(e)]}getContexts(e){return[this.contexts.get(e)||(e=this.getReferenceByLink(e)||e,this.contexts.get(e)),e]}getContext(e){const t=this.getContexts(e);return t[0]?[t[0].values().next().value,t[1]]:void 0}deleteContext(e,t,a){if([a,e]=this.getContexts(e),a)for(const s of a)if((0,Y.Z)(s,t))return a.delete(s),a.size||(this.contexts.delete(e),delete this.links[T(e)]),!0;return!1}refreshReference(e,t){if(this.log("refreshReference: start",e.slice(),t),!t){const a=this.getContext(e);if(!a)return this.log("refreshReference: got no context for reference:",e.slice()),Promise.reject("NO_CONTEXT");[t,e]=a}let a;switch(null==t?void 0:t.type){case"message":a=this.appMessagesManager.reloadMessages(t.peerId,t.messageId,!0);break;case"emojiesSounds":a=this.refreshEmojiesSoundsPromise||this.appStickersManager.getAnimatedEmojiSounds(!0).then((()=>{this.refreshEmojiesSoundsPromise=void 0}));break;case"userFull":a=Promise.resolve(this.appProfileManager.getProfile(t.userId,!0));break;case"customEmoji":a=this.appEmojiManager.getCustomEmojiDocuments([t.docId]);break;case"attachMenuBotIcon":a=this.appAttachMenuBotsManager.getAttachMenuBot(t.botId,!0);break;default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const s=T(e);return this.log("refreshReference: refreshing reference:",s),a.then((()=>{const a=T(e);if(this.log("refreshReference: refreshed, reference before:",s,"after:",a),s!==a)return e;this.deleteContext(e,t);const n=this.getContext(e);if(n)return this.refreshReference(e,n[0]);throw this.log.error("refreshReference: no new context, reference before:",s,"after:",a,t),(0,X.Z)("NO_NEW_CONTEXT")}))}}var te=a(7298),ae=a(7381),se=a(252),ne=a(7625),ie=a(6519);function re(e,t){if(!e)return t;for(var a in e)t.hasOwnProperty(a)||delete e[a];for(var a in t)e[a]=t[a];return e}var oe=a(2790),pe=a(3781),de=a(3385),fe=a(5880),ce=a(8050),le=a(2946);function me(e){var t,a;const s=[e.fromId,e.viaBotId,e.fwdFromId],n=e.media;if(n){const e=n.user_id;void 0!==e&&s.push(e.toPeerId());const t=n.results,a=null==t?void 0:t.recent_voters;(null==a?void 0:a.length)&&s.push(...a.map((e=>e.toPeerId())))}const i=null===(t=e.reactions)||void 0===t?void 0:t.recent_reactions;(null==i?void 0:i.length)&&s.push(...i.map((e=>(0,le.Z)(e.peer_id))));const r=e.action;if(r){const e=[...r.users||[],r.user_id,r.inviter_id];s.push(...e.filter(Boolean).map((e=>e.toPeerId())));const t=[r.channel_id,r.chat_id];s.push(...t.filter(Boolean).map((e=>e.toPeerId(!0))))}const o=null===(a=e.replies)||void 0===a?void 0:a.recent_repliers;return(null==o?void 0:o.length)&&s.push(...o.map((e=>(0,le.Z)(e)))),new Set(s.filter(Boolean))}var ge=a(8027);function he(e,t,a){return e[t]=a}var ue=a(8938);const ye=void 0;class _e extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e){this.allDialogsLoaded={},this.pinnedOrders={};for(const e of o.DZ)this.pinnedOrders[e]=[]}else{this.storage.clear(),this.allDialogsLoaded={},this.saveAllDialogsLoaded(),this.pinnedOrders=Object.assign({},this.pinnedOrders);for(const e of o.DZ)this.resetPinnedOrder(e);this.savePinnedOrders()}this.forumTopics=new Map,this.folders={},this.dialogsOffsetDate={},this.dialogsNum=0,this.dialogsIndex=new ae.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0}),this.cachedResults={query:"",count:0,dialogs:[],folderId:0}},this.onUpdateFolderPeers=e=>{e.folder_peers.forEach((e=>{var t;const{folder_id:a,peer:s}=e,n=this.appPeersManager.getPeerId(s),i=this.dropDialog(n)[0];i&&((null===(t=i.pFlags)||void 0===t?void 0:t.pinned)&&this.handleDialogUnpinning(i,a),i.folder_id=a,this.generateIndexForDialog(i),this.pushDialog({dialog:i})),this.appMessagesManager.scheduleHandleNewDialogs(n,i)}))},this.onUpdateDialogPinned=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:o.J$,s=this.appPeersManager.getPeerId(e.peer.peer),n=this.getDialogOnly(s);this.handleDialogTogglePinned(n,e.pFlags.pinned,a)},this.onUpdateChannelPinnedTopic=e=>{const t=e.channel_id.toPeerId(!0),a=(0,pe.Z)(e.topic_id),s=this.getForumTopic(t,a);s&&this.handleDialogTogglePinned(s,e.pFlags.pinned,this.getFilterIdForForum(s))},this.onUpdatePinnedDialogs=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:o.J$;e.order?this.handleDialogsPinned(a,e.order.map((e=>this.appPeersManager.getPeerId(e.peer)))):this.apiManager.invokeApi("messages.getPinnedDialogs",{folder_id:a}).then((e=>{this.applyDialogs(e),this.handleDialogsPinned(a,e.dialogs.map((e=>e.peerId)))}))},this.onUpdateChannelPinnedTopics=e=>{return t=this,a=void 0,n=function*(){const t=e.channel_id.toPeerId(!0);if(!this.forumTopics.get(t))return;const a=t;if(e.order){const t=e.order.map((e=>(0,pe.Z)(e)));this.handleDialogsPinned(a,t)}else{const e=yield this.apiManager.getLimit("topicPin",!0),s=this.apiManager.invokeApi("channels.getForumTopics",{channel:this.appChatsManager.getChannelInput(t.toChatId()),limit:e,offset_date:0,offset_id:0,offset_topic:0}),n=(yield this.processTopics(t,s)).topics.filter((e=>e.pFlags.pinned));this.handleDialogsPinned(a,n.map((e=>e.id)))}},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}}after(){this.clear(!0),this.rootScope.addEventListener("language_change",(()=>{const e=this.appUsersManager.getSelf().id.toPeerId(!1);if(this.getDialogOnly(e)){const t=this.appPeersManager.getPeerSearchText(e);this.dialogsIndex.indexObject(e,t)}}));const e=e=>{const t=this.getCachedDialogs(!1);for(let a=0;a{const e=this.getCachedDialogs(!1);for(const e in this.folders)+e>1&&delete this.folders[e];for(let t=0;t{const t=this.getCachedDialogs(!1),a=this.getDialogIndexKeyByFilterId(e.id);for(let e=0;e{this.processChangedUnreadOrUnmuted(e.peerId)})),this.rootScope.addEventListener("chat_update",(e=>{const t=this.appChatsManager.getChat(e),a=e.toPeerId(!0);t.pFlags.left&&this.getDialogOnly(a)&&this.dropDialogOnDeletion(a)})),this.rootScope.addEventListener("chat_toggle_forum",(({chatId:e,enabled:t})=>{const a=e.toPeerId(!0);t||this.flushForumTopicsCache(a),this.processChangedUnreadOrUnmuted(a)})),this.apiUpdatesManager.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updateChannelPinnedTopic:this.onUpdateChannelPinnedTopic,updatePinnedDialogs:this.onUpdatePinnedDialogs,updateChannelPinnedTopics:this.onUpdateChannelPinnedTopics}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("dialogs")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.dialogs=this.storage.getCache();for(const t of o.DZ){const a=e.pinnedOrders[t];if(!a)continue;const s=this.getPinnedOrders(t);s.splice(0,s.length,...a)}t.length&&W.Z.freezeSaving(this.setDialogsFromState.bind(this,t),["chats","dialogs","messages","users"]),this.allDialogsLoaded=e.allDialogsLoaded||{},t.length&&this.appDraftsManager.addMissedDialogs()}))}setDialogsFromState(e){for(let t=0,a=e.length;tthis.allDialogsLoaded[e]))&&(this.allDialogsLoaded[void 0]=!0),this.saveAllDialogsLoaded())}saveAllDialogsLoaded(){this.appStateManager.pushToState("allDialogsLoaded",this.allDialogsLoaded)}handleDialogUnpinning(e,t){delete e.pFlags.pinned,(0,M.Z)(this.getPinnedOrders(t),this.isFilterIdForForum(t)?e.id:e.peerId),this.savePinnedOrders()}savePinnedOrders(){this.appStateManager.pushToState("pinnedOrders",this.pinnedOrders)}resetPinnedOrder(e){this.getPinnedOrders(e).length=0}getPinnedOrders(e){let t=this.pinnedOrders[e];return!t&&this.isFilterIdForForum(e)&&((0,ge.Z)(this.pinnedOrders,[e]),t=this.pinnedOrders[e]=[]),t}isDialogPinned(e,t){const a=this.filtersStorage.getFilter(t);let s;return s=a?-1!==a.pinnedPeerIds.indexOf(e):!!this.getDialogOnly(e).pFlags.pinned,s}getOffsetDate(e){const t=this.dialogsOffsetDate[e]||0;return e!==ye||t?t:Math.min(...Array.from(o.DZ).sort(((e,t)=>e-t)))}generateFolder(e){const t={dialogs:[],id:e,unreadMessagesCount:0,unreadPeerIds:new Set,unreadUnmutedPeerIds:new Set};return(0,ge.Z)(t,["dispatchUnreadTimeout"]),t}getFolder(e){var t,a;return null!==(t=(a=this.folders)[e])&&void 0!==t?t:a[e]=this.generateFolder(e)}isFilterIdForForum(e){return e&&e<0}getFilterIdForForum(e){return e.peerId}getDialogKey(e){return this.isTopic(e)?e.id:e.peerId}getFolderDialogs(e,t=!0){if(e===ye)return this.getCachedDialogs(t);const a=this.getFolder(e);return this.isFilterIdForForum(e)?t?a.dialogs.filter((e=>!e.pFlags.hidden)):a.dialogs:t?a.dialogs.filter((e=>void 0===e.migratedTo)):a.dialogs}getNextDialog(e,t,a){const s=this.getFolderDialogs(a,!0);let n;if(e){const a=s.findIndex((t=>t.peerId===e));-1!==a&&(n=s[t?a+1:a-1])}else t&&(n=s[0]);return n}getDialogIndexKeyByFilterId(e){if(this.isFilterIdForForum(e))return(0,de.Z)();if(o.DZ.has(e))return(0,de.Z)(e);const t=this.filtersStorage.getFilter(e);return(0,de.Z)(t.localId)}isDialogUnmuted(e){return!this.appNotificationsManager.isPeerLocalMuted({peerId:e.peerId,respectType:!0,threadId:this.isTopic(e)?e.id:void 0})}getFolderUnreadCount(e){const t=this.getFolder(e);return{unreadUnmutedCount:t.unreadUnmutedPeerIds.size,unreadCount:t.unreadPeerIds.size}}getCachedDialogs(e){const t=Array.from(o.DZ).map((t=>this.getFolderDialogs(t,e)));return[].concat(...t)}setDialogIndexInFilter(e,t,a){var s,n;let i;const r=this.isTopic(e),p=r||o.DZ.has(a.id);if(this.filtersStorage.testDialogForFilter(e,a)){const t=r?this.getPinnedOrders(this.getFilterIdForForum(e)):a.pinnedPeerIds,o=this.getDialogKey(e),d=t.indexOf(o);i=-1!==d?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(t.length-1-d),!0):(null===(s=e.pFlags)||void 0===s?void 0:s.pinned)||p?this.generateIndexForDialog(e,!0,void 0,!p):null!==(n=(0,ce.Z)(e))&&void 0!==n?n:this.generateIndexForDialog(e,!0)}return he(e,t,i)}getDialog(e,t,a,s=!0){const n=[];a&&(t=e),void 0===t?n.push(...Array.from(o.DZ).map((e=>this.getFolder(e).dialogs))):n.push(this.getFolderDialogs(t,!1));const i=a?e=>e.id===a:t=>t.peerId===e;for(const e of n){let t=0,a=0;for(let n=e.length;tt.id===e.id:t=>t.peerId===e.peerId,d=r.findIndex(p),f=r[d],c=this.getDialogIndex(f,i);a&&n>o.Zi&&(a=void 0);const l=a?void 0:this.setDialogIndexInFilter(e,i,t);return c!==l&&(!!c!=!!l&&this.prepareFolderUnreadCountModifyingByDialog(n,e,!!l),-1!==d&&r.splice(d,1),l&&(0,ie.Z)(r,e,(e=>this.getDialogIndex(e,i)),-1),!0)}prepareDialogUnreadCountModifying(e,t){const a=this.isTopic(e),s=[],n=a?this.getFilterIdForForum(e):e.folder_id;if(s.push(this.prepareFolderUnreadCountModifyingByDialog(n,e,t)),!a){const a=this.filtersStorage.getFilters();for(const n in a){const i=a[n];this.filtersStorage.testDialogForFilter(e,i)&&s.push(this.prepareFolderUnreadCountModifyingByDialog(i.id,e,t))}}return()=>!t&&s.forEach((e=>e()))}prepareFolderUnreadCountModifyingByDialog(e,t,a){const s=this.appMessagesManager.getDialogUnreadCount(t),n=this.isDialogUnmuted(t);if(void 0===a)return()=>{const a=this.appMessagesManager.getDialogUnreadCount(t),n=this.isDialogUnmuted(t),i=a-s;this.modifyFolderUnreadCount(e,i,!!a,a&&n,t)};{const i=a?s:-s;this.modifyFolderUnreadCount(e,i,!!s,s&&n,t)}}modifyFolderUnreadCount(e,t,a,s,n){var i;const{peerId:r}=n,o=this.appPeersManager.isForum(r),p=this.isTopic(n);if(o&&!p){const i=this.getForumUnreadCount(r);if(i instanceof Promise)return void i.then((({count:t,hasUnmuted:a})=>{n=this.getDialogOnly(r);const s=this.getFolder(e);n&&this.appPeersManager.isForum(r)&&s&&s.dialogs.some((e=>e.peerId===r))&&this.modifyFolderUnreadCount(e,0,!1,!1,n)}));t=0,a=i.count>0,s=i.hasUnmuted}const d=this.getFolder(e);t&&(d.unreadMessagesCount=Math.max(0,d.unreadMessagesCount+t));const f=this.getDialogKey(n);a?d.unreadPeerIds.add(f):d.unreadPeerIds.delete(f),s?d.unreadUnmutedPeerIds.add(f):d.unreadUnmutedPeerIds.delete(f),null!==(i=d.dispatchUnreadTimeout)&&void 0!==i||(d.dispatchUnreadTimeout=E.Z.setTimeout((()=>{d.dispatchUnreadTimeout=void 0;const e=Object.assign({},d);delete e.dialogs,this.rootScope.dispatchEvent("folder_unread",e),p&&this.processChangedUnreadOrUnmuted(r)}),0))}processChangedUnreadOrUnmuted(e){const t=this.getDialogOnly(e);t&&(this.processDialogForFilters(t),this.prepareDialogUnreadCountModifying(t)(),this.rootScope.dispatchEvent("dialog_unread",{peerId:e,dialog:t}))}generateIndexForDialog(e,t,a,s){var n;if(!t)return;const i=this.isTopic(e);let r,o=0;if(e.pFlags.hidden)o=this.generateDialogPinnedDateByIndex(4095),r=!0;else if(e.pFlags.pinned&&!s)o=this.generateDialogPinnedDate(e),r=!0;else{if(a||(a=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),o=(null==a?void 0:a.date)||o,!i){const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!o||e.date&&e.date>o)&&(o=e.date)}}"draftMessage"===(null===(n=e.draft)||void 0===n?void 0:n._)&&e.draft.date>o&&(o=e.draft.date)}o||(o=(0,te.Z)(!0));const p=this.generateDialogIndex(o,r);if(t)return p;he(e,(0,de.Z)(e.folder_id),p)}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.isTopic(e),a=this.getPinnedOrders(t?this.getFilterIdForForum(e):e.folder_id),s=this.getDialogKey(e);let n=a.indexOf(s);return-1===n&&(a.unshift(s),n=0,t||this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(a.length-1-n)}setDialogToState(e){if(this.isTopic(e))return;const{peerId:t,pts:a}=e,s=this.appMessagesManager.getHistoryStorage(t),n=this.appMessagesManager.getHistoryMessagesStorage(t),i=s.history.slice;let r;for(let e=0,a=i.length;e{"dialogFolder"===t._&&e.dialogs.splice(a,1)})),(0,ue.Z)(s),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const n=new Map;s.forEach((e=>{var t,s;const i=this.appPeersManager.getPeerId(e.peer);let r=e.top_message;const o=this.appMessagesManager.pendingTopMsgs[i];if(o){const t=this.appMessagesManager.getMessageByPeer(i,o),a=this.appMessagesManager.getMessageByPeer(i,r);(!r||t&&(!a||(null==t?void 0:t.date)>(null==a?void 0:a.date)))&&(e.top_message=r=o,this.appMessagesManager.getHistoryStorage(i).maxId=o)}if(r||"draftMessage"===(null===(t=e.draft)||void 0===t?void 0:t._)){if(this.saveDialog({dialog:e})){const t=(e=>{let t=n.get(e);return t||n.set(e,t={}),t})(i);a?(null!==(s=t.topics)&&void 0!==s?s:t.topics=new Map).set(e.id,e):t.dialog=e}}else this.dropDialogWithEvent(i,a?this.getDialogKey(e):void 0);const p=this.appMessagesManager.getUpdateAfterReloadKey(i,a?this.getDialogKey(e):void 0),d=this.appMessagesManager.newUpdatesAfterReloadToHandle[p];if(void 0!==d){for(const e of d)d.delete(e),this.apiUpdatesManager.saveUpdate(e);d.size||delete this.appMessagesManager.newUpdatesAfterReloadToHandle[p]}})),n.size&&this.rootScope.dispatchEvent("dialogs_multiupdate",n)}getDialogOffsetDate(e){const t=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message);return(null==t?void 0:t.date)||0}canSaveDialogByPeerId(e){if(e.isAnyChat()){const t=this.appChatsManager.getChat(e.toChatId());if("channelForbidden"===t._||t.pFlags.left)return!1}return!0}saveDialog({dialog:e,folderId:t,ignoreOffsetDate:a,saveGlobalOffset:s}){var n,i;const r=this.isTopic(e),p=!r,d=r?e.id=(0,pe.Z)(e.id):void 0;r||null!=t||(t=null!==(n=e.folder_id)&&void 0!==n?n:o.J$);const f=this.appPeersManager.getPeerId(e.peer);if(!f)return console.error("saveConversation no peerId???",e,t),!1;if(r||"dialog"===e._||console.error("saveConversation not regular dialog",e,Object.assign({},e)),p&&!this.canSaveDialogByPeerId(f))return!1;const c=this.appPeersManager.isChannel(f)?f.toChatId():o.NM;if(p){const e=this.appPeersManager.getPeerSearchText(f);this.dialogsIndex.indexObject(f,e)}const l=this.getDialogOrTopic(f,d);let m,g;if(e.top_message){m=(0,pe.Z)(e.top_message);const t=(null==l?void 0:l.top_message)&&this.appMessagesManager.getMessageByPeer(f,l.top_message);(null===(i=null==t?void 0:t.pFlags)||void 0===i?void 0:i.is_outgoing)&&l.top_message>=m&&(m=l.top_message),g=this.appMessagesManager.getMessageByPeer(f,m)}else m=this.appMessagesManager.generateTempMessageId(f),g={_:"message",id:m,mid:m,from_id:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(!1)),peer_id:this.appPeersManager.getOutputPeer(f),deleted:!0,pFlags:{out:!0},date:0,message:""},this.appMessagesManager.saveMessages([g],{isOutgoing:!0});if((null==g?void 0:g.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,g),p&&!c&&f.isAnyChat()){const t=this.appChatsManager.getChat(f.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const a=this.appPeersManager.getPeerId(t.migrated_to);this.appMessagesManager.migratedFromTo[f]=a,this.appMessagesManager.migratedToFrom[a]=f,e.migratedTo=a}}if(e.top_message=m,e.read_inbox_max_id=(0,pe.Z)(l&&!e.read_inbox_max_id?l.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=(0,pe.Z)(l&&!e.read_outbox_max_id?l.read_outbox_max_id:e.read_outbox_max_id),p&&void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=l?l.folder_id:t),e.draft=this.appDraftsManager.saveDraft({peerId:f,threadId:d,draft:e.draft}),e.peerId=f,g&&g.pFlags.is_outgoing){const t=g.pFlags.out;m>e[t?"read_outbox_max_id":"read_inbox_max_id"]?(g.pFlags.unread=!0,e.unread_count||t||++e.unread_count):delete g.pFlags.unread}const h=this.appMessagesManager.getHistoryStorage(f,d),u=h.history.slice;if(u.length?u.isEnd(se.D.Bottom)||(h.history.insertSlice([m]).setEnd(se.D.Bottom),h.count||(h.count=1),this.appMessagesManager.mergeReplyKeyboard(h,g)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:f})):(h.history.unshift(m),h.count||(h.count=1),this.appMessagesManager.mergeReplyKeyboard(h,g)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:f})),h.maxId=m,h.readMaxId=e.read_inbox_max_id,h.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:f,threadId:r?e.id:void 0,settings:e.notify_settings}),p&&c&&e.pts&&this.apiUpdatesManager.addChannelState(c,e.pts),this.generateIndexForDialog(e),l){const t=this.dialogsStorage.prepareDialogUnreadCountModifying(l);re(l,e),t()}return this.pushDialog({dialog:e,offsetDate:null==g?void 0:g.date,ignoreOffsetDate:a,saveGlobalOffset:s}),r&&this.processTopicUpdate(e,l),!0}processTopicUpdate(e,t){if(!t)return;const{peerId:a,id:s}=e,n=e.icon_emoji_id!==t.icon_emoji_id,i=e.title!==t.title,r=n||i;n&&this.rootScope.dispatchEvent("avatar_update",{peerId:a,threadId:s}),r&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:a,threadId:s})}getDialogs(e){const{query:t="",offsetIndex:a,limit:s=20,filterId:n=o.J$,skipMigrated:i=!1}=e,r=this.isFilterIdForForum(n);if(!r&&!o.DZ.has(n)){const t=[],a=this.appUsersManager.fillContacts();a.cached||t.push(a.promise);const s=this.filtersStorage.reloadMissingPeerIds(n);if(s&&t.push(s),t.length)return Promise.all(t).then((()=>this.getDialogs(e)))}const p=o.DZ.has(n)&&!this.getOffsetDate(n)||r?n:ye;let d=this.getFolderDialogs(n,i);const f=this.getDialogIndexKeyByFilterId(n);if(t&&!r){if(!s||this.cachedResults.query!==t||this.cachedResults.folderId!==n){this.cachedResults.query=t,this.cachedResults.folderId=n;const e=this.dialogsIndex.search(t),a=[];for(const t in this.dialogs){const s=this.dialogs[t];e.has(s.peerId)&&s.folder_id===n&&a.push(s)}a.sort(((e,t)=>this.getDialogIndex(t,f)-this.getDialogIndex(e,f))),this.cachedResults.dialogs=a,this.cachedResults.count=a.length}d=this.cachedResults.dialogs}else this.cachedResults.query="";let c=0;if(a>0)for(let e=d.length;cthis.getDialogIndex(d[c],f));++c);const l=this.isDialogsLoaded(p),m=d.length>=c+s;if(t||l||m){const e=d.slice(c,c+s);return{dialogs:e,count:l?d.length:null,isTopEnd:d.length&&(e[0]&&e[0]===d[0]||this.getDialogIndex(d[0],f)=d.length}}return this.appMessagesManager.getTopMessages({limit:s,folderId:p}).then((e=>{if(i&&(d=this.getFolderDialogs(n,i)),c=0,a>0)for(let e=d.length;cthis.getDialogIndex(d[c],f));++c);const t=d.slice(c,c+s);return{dialogs:t,count:void 0===e.count?d.length:e.count,isTopEnd:d.length&&(t[0]&&t[0]===d[0]||this.getDialogIndex(d[0],f){const t={},a=[];for(const[e,n]of s.getTopicPromises)t[e]=n,a.push((0,oe.Z)(e));s.getTopicPromises.clear();const n=()=>{for(const e in t)t[e].resolve(void 0),s.deletedTopics.add(+e)};if(this.getForumTopicsCache(e)===s)return this.apiManager.invokeApi("channels.getForumTopicsByID",{channel:this.appChatsManager.getChannelInput(e.toChatId()),topics:a}).then((a=>{if(this.getForumTopicsCache(e)===s)return this.applyDialogs(a,e),a.topics.forEach((a=>{"forumTopic"===a._&&(t[a.id].resolve(a),delete t[e])})),a}),(()=>{})).then((()=>{n(),s.getTopicsPromise=void 0,s.getTopicPromises.size&&this.getForumTopicById(e)}));n()}))),n||s.getTopicsPromise}getForumTopic(e,t){var a;const s=this.forumTopics.get(e);return null===(a=null==s?void 0:s.topics)||void 0===a?void 0:a.get(t)}getForumTopicOrReload(e,t){var a;const s=this.getForumTopic(e,t);if(s)return s;const n=this.getForumTopicsCache(e);return(null===(a=null==n?void 0:n.deletedTopics)||void 0===a?void 0:a.has(t))?void 0:this.getForumTopicById(e,t)}processTopics(e,t){return(0,q.Z)(t,(t=>{"pts"in t&&this.apiUpdatesManager.addChannelState(e.toChatId(),t.pts);const a=this.appPeersManager.getOutputPeer(e);return t.topics=t.topics.map((e=>{if("forumTopicDeleted"!==e._)return e.peer=a,e.id=(0,pe.Z)(e.id),e})).filter(Boolean),t}))}processTopicsPromise(e,t){return t.then((t=>(this.processTopics(e,t),t)))}getForumUnreadCount(e){if(!this.appPeersManager.isForum(e))return;const t=this.getFolder(e),a=t.dialogs.length>=20||this.isDialogsLoaded(e)?t.dialogs.slice(0,20):(0,q.Z)(this.getDialogs({filterId:e,limit:20}),(e=>e.dialogs));return(0,q.Z)(a,(e=>({count:e.reduce(((e,t)=>e+ +!!t.unread_count),0),hasUnmuted:e.some((e=>e.unread_count&&this.isDialogUnmuted(e)))})))}handleDialogTogglePinned(e,t,a){e&&(t?e.pFlags.pinned=!0:this.handleDialogUnpinning(e,a),this.generateIndexForDialog(e)),this.appMessagesManager.scheduleHandleNewDialogs(e.peerId,e)}handleDialogsPinned(e,t){const a=this.isFilterIdForForum(e);this.resetPinnedOrder(e),this.getPinnedOrders(e).push(...t),this.savePinnedOrders(),t.reverse();const s={};t.forEach((t=>{s[t]=!0;const n=a?e:t,i=a?t:void 0,r=this.getDialogOrTopic(n,i);this.appMessagesManager.scheduleHandleNewDialogs(n,r),r&&(r.pFlags.pinned=!0,this.generateIndexForDialog(r))}));const n=this.getFolderDialogs(e,!1);for(const e of n){if(!e.pFlags.pinned)break;s[this.getDialogKey(e)]||(delete e.pFlags.pinned,this.generateIndexForDialog(e),this.appMessagesManager.scheduleHandleNewDialogs(e.peerId,e))}}}var ve=a(8479),Pe=a(4064),be=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Me=[["pinned_peers","pinnedPeerIds"],["exclude_peers","excludePeerIds"],["include_peers","includePeerIds"]],Ie=o.DZ.size,Se={_:"dialogFilter",pFlags:{},flags:0,id:0,title:"",exclude_peers:[],include_peers:[],pinned_peers:[],excludePeerIds:[],includePeerIds:[],pinnedPeerIds:[]};class Ce extends G{constructor(){super(...arguments),this.clear=e=>{if(e){this.filters={},this.filtersArr=[],this.reloadedPeerIds=new Set,this.localFilters={};for(const e of o.DZ)this.localFilters[e]=this.generateLocalFilter(e)}else this.reloadedPeerIds.clear(),this.clearFilters();this.localId=o.Gu},this.onUpdateDialogFilter=e=>{e.filter?this.saveDialogFilter(e.filter):this.filters[e.id]&&(this.rootScope.dispatchEvent("filter_delete",this.filters[e.id]),delete this.filters[e.id],(0,Pe.Z)(this.filtersArr,(t=>t.id===e.id))),this.pushToState()},this.onUpdateDialogFilters=e=>{const t=(0,ve.Z)(this.filters);this.getDialogFilters(!0).then((e=>{for(const a in t){const t=+a;e.find((e=>e.id===t))||this.onUpdateDialogFilter({_:"updateDialogFilter",id:t})}this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e.map((e=>e.id))})}))},this.onUpdateDialogFilterOrder=e=>{const t=e.order.slice();t.includes(o.Zi)||t.splice(t[0]===o.J$?1:0,0,o.Zi),this.localId=o.Gu,t.forEach((e=>{const t=this.filters[e];delete t.localId,this.setLocalId(t)})),this.rootScope.dispatchEvent("filter_order",t),this.pushToState()}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateDialogFilter:this.onUpdateDialogFilter,updateDialogFilters:this.onUpdateDialogFilters,updateDialogFilterOrder:this.onUpdateDialogFilterOrder}),this.rootScope.addEventListener("premium_toggle",(()=>{this.onUpdateDialogFilters({_:"updateDialogFilters"})})),this.appStateManager.getState().then((e=>{this.prependFilters(e.filtersArr).map((e=>{this.saveDialogFilter(e,!1,!0)}))}))}prependFilters(e){e=e.slice();const t=this.localFilters[o.J$],a=this.localFilters[o.Zi],s=e.findIndex((e=>"dialogFilterDefault"===e._||e.id===o.J$));return-1!==s?e[s]=t:e.unshift(t),(0,Pe.Z)(e,(e=>e.id===o.Zi)),e.splice(e[0]===t?1:0,0,a),this.localId=o.Gu,e.forEach((e=>{delete e.localId})),e}generateLocalFilter(e){const t=Object.assign(Object.assign({},(0,ve.Z)(Se)),{id:e});return e===o.J$?t.pFlags.exclude_archived=!0:e===o.Zi&&(t.pFlags.exclude_unarchived=!0),o.DZ.has(e)&&(t.pinnedPeerIds=this.dialogsStorage.getPinnedOrders(e)),t}pushToState(){this.appStateManager.pushToState("filtersArr",this.filtersArr)}testDialogForFilter(e,t){if(!t)return!0;if(o.DZ.has(t.id))return e.folder_id===t.id&&this.dialogsStorage.canSaveDialogByPeerId(e.peerId);const a=e.peerId;if(!this.appMessagesManager.getDialogOnly(a))return!1;if(t.excludePeerIds.includes(a))return!1;if(t.includePeerIds.includes(a))return!0;const s=t.pFlags;if(s.exclude_archived&&e.folder_id===o.Zi)return!1;if(s.exclude_read&&!this.appMessagesManager.isDialogUnread(e))return!1;if(s.exclude_muted&&this.appNotificationsManager.isPeerLocalMuted({peerId:a})&&(!e.unread_mentions_count||!e.unread_count))return!1;if(this.appPeersManager.isAnyChat(a)){if(s.broadcasts&&this.appPeersManager.isBroadcast(a))return!0;if(s.groups&&this.appPeersManager.isAnyGroup(a))return!0}else{const e=a.toUserId();if(this.appUsersManager.isBot(e))return!!s.bots;if(s.non_contacts&&!this.appUsersManager.isContact(e))return!0;if(s.contacts&&this.appUsersManager.isContact(e))return!0}return!1}testDialogForFilterId(e,t){return this.testDialogForFilter(e,this.filters[t])}getFilter(e){return this.filters[e]}getFilters(){return this.filters}clearFilters(){const e=this.getFilters();for(const t in e)o.DZ.has(+t)||this.onUpdateDialogFilter({_:"updateDialogFilter",id:+t})}toggleDialogPin(e,t){return be(this,void 0,void 0,(function*(){const a=this.filters[t],s=a.pinnedPeerIds.indexOf(e),n=-1!==s;if(n&&(a.pinned_peers.splice(s,1),a.pinnedPeerIds.splice(s,1)),!n){if(a.pinned_peers.length>=(yield this.apiManager.getConfig()).pinned_infolder_count_max)return Promise.reject((0,X.Z)("PINNED_DIALOGS_TOO_MUCH"));a.pinned_peers.unshift(this.appPeersManager.getInputPeerById(e)),a.pinnedPeerIds.unshift(e)}return this.updateDialogFilter(a)}))}createDialogFilter(e,t){const a=Math.max(1,...Object.keys(this.filters).map((e=>+e)));return(e=(0,ve.Z)(e)).id=a+1,this.updateDialogFilter(e,void 0,t)}updateDialogFilter(e,t=!1,a=!1){const s=t?0:1;return this.apiManager.invokeApi("messages.updateDialogFilter",{flags:s,id:e.id,filter:t?void 0:this.getOutputDialogFilter(e)}).then((s=>{if(this.onUpdateDialogFilter({_:"updateDialogFilter",id:e.id,filter:t?void 0:e}),a){const t=[];for(const e in this.filters){const a=this.filters[e];++a.localId,t.push(a)}e.localId=o.Gu;const a=t.sort(((e,t)=>e.localId-t.localId)).map((e=>e.id));this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:a})}}))}updateDialogFiltersOrder(e){return this.apiManager.invokeApi("messages.updateDialogFiltersOrder",{order:e}).then((()=>{this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e})}))}getOutputDialogFilter(e){const t=(0,ve.Z)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){(0,ne.Z)(e.includePeerIds,((t,a)=>{e.pinnedPeerIds.includes(t)&&(e.include_peers.splice(a,1),e.includePeerIds.splice(a,1))}))}reloadMissingPeerIds(e,t="pinned_peers"){const a=this.getFilter(e),s=null==a?void 0:a[t];if(!(null==s?void 0:s.length))return;const n=s.filter((e=>{const t=this.appPeersManager.getPeerId(e),a=this.reloadedPeerIds.has(t),s=this.appMessagesManager.getDialogOnly(t);return!a&&!s}));if(!n.length)return;const i=n.map((e=>{const t=this.appPeersManager.getPeerId(e);return this.appMessagesManager.reloadConversation(e).then((e=>(this.reloadedPeerIds.add(t),e?void 0:t)))}));return Promise.all(i).then((e=>{(e=e.filter(Boolean)).length}))}getDialogFilters(e=!1){return be(this,void 0,void 0,(function*(){const t=Object.keys(this.filters);if(t.length>Ie&&!e)return t.map((e=>this.filters[e])).sort(((e,t)=>e.localId-t.localId));const a=yield this.apiManager.invokeApiSingle("messages.getDialogFilters");return this.prependFilters(a).map((t=>this.saveDialogFilter(t,e))).filter(Boolean)}))}getSuggestedDialogsFilters(){return this.apiManager.invokeApi("messages.getSuggestedDialogFilters")}saveDialogFilter(e,t=!0,a){"dialogFilterDefault"===e._&&(e=this.localFilters[o.J$]),(0,ue.Z)(e),o.DZ.has(e.id)||(Me.forEach((([t,a])=>{(0,ue.Z)(e),e[a]=e[t].map((e=>this.appPeersManager.getPeerId(e)))})),this.filterIncludedPinnedPeers(e),e.include_peers=e.pinned_peers.concat(e.include_peers),e.includePeerIds=e.pinnedPeerIds.concat(e.includePeerIds));const s=this.filters[e.id];return s?Object.assign(s,e):this.filters[e.id]=e,this.setLocalId(e),a||(t?this.rootScope.dispatchEvent("filter_update",e):s||this.rootScope.dispatchEvent("filter_new",e)),e}setLocalId(e){void 0!==e.localId?e.localId>=this.localId&&(this.localId=e.localId+1):(e.localId=this.localId++,(0,Pe.Z)(this.filtersArr,(t=>t.id===e.id)),this.filtersArr.push(e),this.pushToState())}isFilterIdAvailable(e){return be(this,void 0,void 0,(function*(){if(o.DZ.has(e))return!0;const t=yield this.apiManager.getLimit("folders");return this.filtersArr.filter((e=>!o.DZ.has(e.id))).slice(0,t).some((t=>t.id===e))}))}}var we=a(6690),ke=a(2821);function Ae(e,t){t.forEach((t=>{Object.getOwnPropertyNames(t.prototype).forEach((a=>{const s=Object.getOwnPropertyDescriptor(t.prototype,a)||Object.create(null);"constructor"!==a&&Object.defineProperty(e.prototype,a,s)}))}))}class De{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=(0,I.kg)("UPDATES",I.v9.Error|I.v9.Warn|I.v9.Log),this.debug=d.ZP,this.subscriptions={},this.processUpdateMessage=(e,t={})=>{const a={date:e.date,seq:e.seq,seqStart:e.seq_start};switch(this.debug&&this.log.debug("processUpdateMessage",e),e._){case"updatesTooLong":case"new_session_created":this.forceGetDifference();break;case"updateShort":this.processUpdate(e.update,a);break;case"updateShortMessage":case"updateShortChatMessage":{(0,ue.Z)(e),this.debug&&this.log.debug("updateShortMessage | updateShortChatMessage",Object.assign({},e));const t=e.pFlags.out,s=e.from_id||(t?this.appPeersManager.peerId:e.user_id),n=e.chat_id?e.chat_id.toPeerId(!0):e.user_id.toPeerId(!1)||this.appPeersManager.peerId;this.processUpdate({_:"updateNewMessage",message:{_:"message",pFlags:e.pFlags,id:e.id,from_id:this.appPeersManager.getOutputPeer(s.toPeerId()),peer_id:this.appPeersManager.getOutputPeer(n),date:e.date,message:e.message,fwd_from:e.fwd_from,reply_to:e.reply_to,entities:e.entities},pts:e.pts,pts_count:e.pts_count},a);break}case"updatesCombined":case"updates":this.appUsersManager.saveApiUsers(e.users,t.override),this.appChatsManager.saveApiChats(e.chats,t.override),e.updates.forEach((e=>{this.processUpdate(e,a)}));break;default:this.log.warn("Unknown update message",e)}},this._constructor(!1)}setProxy(){const e=this;this.updatesState=new Proxy(this.updatesState,{set:function(t,a,s){return t[a]=s,e.saveUpdatesState(),!0}})}saveUpdatesState(){const e=this.updatesState;this.appStateManager.pushToState("updates",{seq:e.seq,pts:e.pts,date:e.date})}popPendingSeqUpdate(){var e;const t=this.updatesState,a=t.seq+1,s=t.pendingSeqUpdates[a];if(!s)return!1;const n=s.updates;for(let e=0,t=n.length;e=t.syncPending.seqAwaiting&&(t.syncPending.ptsAwaiting?delete t.syncPending.seqAwaiting:this.clearStatePendingSync(t)),!0}popPendingPtsUpdate(e){const t=e?this.getChannelState(e):this.updatesState;if(!t.pendingPtsUpdates.length)return!1;t.pendingPtsUpdates.sort(((e,t)=>e.pts-t.pts));let a=t.pts,s=0,n=0;for(let e=0,i=t.pendingPtsUpdates.length;e=i.pts&&(s=i.pts,n=e)}if(!s)return!1;this.debug&&this.log.debug("pop pending pts updates",s,t.pendingPtsUpdates.slice(0,n+1)),t.pts=s;for(let e=0;e<=n;++e){const a=t.pendingPtsUpdates[e];this.saveUpdate(a)}return t.pendingPtsUpdates.splice(0,n+1),!t.pendingPtsUpdates.length&&t.syncPending&&(t.syncPending.seqAwaiting?delete t.syncPending.ptsAwaiting:this.clearStatePendingSync(t)),!0}forceGetDifference(){this.updatesState.syncLoading||this.getDifference()}processLocalUpdate(e){this.processUpdateMessage({_:"updateShort",update:e})}getDifference(e=!1){const t=this.updatesState,a=t.syncLoading;a||(t.pendingSeqUpdates={},t.pendingPtsUpdates=[]),this.clearStatePendingSync(t);const s=this.apiManager.invokeApi("updates.getDifference",{pts:t.pts,pts_total_limit:e?1200:void 0,date:t.date,qts:-1},{timeout:2147483647}).then((a=>{if(this.debug&&this.log.debug("Get diff result",a),"updates.differenceEmpty"===a._)return this.debug&&this.log.debug("apply empty diff",a.seq),t.date=a.date,void(t.seq=a.seq);if(e&&this.rootScope.dispatchEvent("state_synchronizing"),"updates.differenceTooLong"!==a._){this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),a.other_updates.forEach((e=>{switch(e._){case"updateChannelTooLong":case"updateNewChannelMessage":case"updateEditChannelMessage":return void this.processUpdate(e)}this.saveUpdate(e)})),a.new_messages.forEach((e=>{this.saveUpdate({_:"updateNewMessage",message:e,pts:t.pts,pts_count:0})}));const e="updates.difference"===a._?a.state:a.intermediate_state;t.seq=e.seq,t.pts=e.pts,t.date=e.date}else t.pts=a.pts,t.date=(Date.now()/1e3|0)+this.timeManager.getServerTimeOffset(),delete t.seq,this.channelStates={},this.log.warn("getDifference:",a._),this.onDifferenceTooLong();if("updates.differenceSlice"===a._)return this.getDifference();this.debug&&this.log.debug("finished get diff")}));return a||this.justAName(t,s),s}clearStatePendingSync(e){e.syncPending&&(clearTimeout(e.syncPending.timeout),e.syncPending=null)}getChannelDifference(e){const t=this.getChannelState(e),a=t.syncLoading;a||(t.pendingPtsUpdates=[]),this.clearStatePendingSync(t);const s=this.debug?this.log.bindPrefix("getChannelDifference-"+e):void 0,n=this.apiManager.invokeApi("updates.getChannelDifference",{channel:this.appChatsManager.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:1e3},{timeout:2147483647}).then((a=>{if(null==s||s.debug("diff result",a),t.pts="pts"in a?a.pts:void 0,t.lastDifferenceTime=Date.now(),"updates.channelDifferenceEmpty"!==a._){if("updates.channelDifferenceTooLong"===a._)return delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),null==s||s.debug("applying",a.other_updates.length,"channel other updates"),a.other_updates.forEach((e=>{this.saveUpdate(e)})),null==s||s.debug("applying",a.new_messages.length,"channel new messages"),a.new_messages.forEach((e=>{this.saveUpdate({_:"updateNewChannelMessage",message:e,pts:t.pts,pts_count:0})})),null==s||s.debug("apply channel diff",t.pts),"updates.channelDifference"===a._&&!a.pFlags.final)return this.getChannelDifference(e);null==s||s.debug("finished channel get diff")}}));return a||this.justAName(t,n,e),n}onDifferenceTooLong(){this.appUsersManager.clear(),this.appChatsManager.clear(),this.appMessagesManager.clear(),this.rootScope.dispatchEvent("state_cleared")}justAName(e,t,a){e.syncLoading=t,this.rootScope.dispatchEvent("state_synchronizing",a),t.then((()=>{e.syncLoading=null,this.rootScope.dispatchEvent("state_synchronized",a)}),(()=>{e.syncLoading=null}))}addChannelState(e,t){var a,s;if(!t)throw new Error("Add channel state without pts "+e);return null!==(a=(s=this.channelStates)[e])&&void 0!==a?a:s[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null}}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var a,s,n,i;let r;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":r=this.appPeersManager.getPeerId(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(r=e.channel_id,!(r in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(r=e.channel_id)}const{pts:o,pts_count:p}=e,d=r?this.getChannelState(r,o):this.updatesState;if(d.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!d.lastPtsUpdateTime||d.lastPtsUpdateTime{d.syncPending=null,d.syncLoading||(r?this.getChannelDifference(r):this.getDifference())}),6)}),d.syncPending.ptsAwaiting=!0,!1;if(o>d.pts)d.pts=o,f=!0,d.lastPtsUpdateTime=Date.now();else if(p)return!1;r&&t.date&&this.updatesState.date0){const a=t.seq,r=t.seqStart||a;if(r!==d.seq+1&&r>d.seq)return this.debug&&this.log.warn("Seq hole",d,null===(s=d.syncPending)||void 0===s?void 0:s.seqAwaiting),null!==(n=(i=d.pendingSeqUpdates)[r])&&void 0!==n||(i[r]={seq:a,date:t.date,updates:[]}),d.pendingSeqUpdates[r].updates.push(e),d.syncPending||(d.syncPending={timeout:E.Z.setTimeout((()=>{d.syncPending=null,d.syncLoading||this.getDifference()}),6)}),(!d.syncPending.seqAwaiting||d.syncPending.seqAwaiting{const t=this.getChannelState(e);t.syncLoading||t.lastDifferenceTime&&!(Date.now()-t.lastDifferenceTime>2500)||this.getChannelDifference(e)};null!==(a=n.interval)&&void 0!==a||(n.interval=E.Z.setInterval(i,3e3)),i()}unsubscribeFromChannelUpdates(e,t){const a=this.subscriptions[e];!(null==a?void 0:a.interval)||--a.count&&!t||(clearInterval(a.interval),a.interval=void 0,delete this.subscriptions[e])}attach(e){this.attached||(this.log("attach"),this.attached=!0,this.appStateManager.getState().then((({updates:t})=>{const a=this.appStateManager.newVersion;t&&t.pts&&t.date?(Object.assign(this.updatesState,t),this.log("will get difference",Object.assign({},t)),this.getDifference(!0)):(this.log("will get new state"),this.updatesState.syncLoading=new Promise((e=>{this.apiManager.invokeApi("updates.getState",{},{noErrorBox:!0}).then((t=>{this.updatesState.seq=t.seq,this.updatesState.pts=t.pts,this.updatesState.date=t.date,this.saveUpdatesState(),this.updatesState.syncLoading=null,e()}))}))),this.apiManager.setUpdatesProcessor(this.processUpdateMessage),this.setProxy(),a&&this.updatesState.syncLoading.then((()=>{return t=this,s=void 0,i=function*(){const t={en:"was updated to version",ru:"обновлён до версии"},s=e=>{fetch(`changelogs/${e}_${a.split(" ")[0]}.md`).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((s=>{const n=t[e]||t.en;s=`**Telegram Web${_.Z.suffix} ${n} ${a}**\n\n`+s;const i=[],r={_:"updateServiceNotification",entities:i,message:(0,ke.Z)(s,i),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(r)}))},n=(0,we.Z)([e,"en"]);for(const e of n)try{yield s(e);break}catch(e){}},new((n=void 0)||(n=Promise))((function(e,a){function r(e){try{p(i.next(e))}catch(e){a(e)}}function o(e){try{p(i.throw(e))}catch(e){a(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,o)}p((i=i.apply(t,s||[])).next())}));var t,s,n,i}))})))}}Ae(De,[p.Z,G]);class Ue extends G{constructor(){super(...arguments),this.savedAvatarURLs={}}after(){this.rootScope.addEventListener("avatar_update",(({peerId:e,threadId:t})=>{t||this.removeFromAvatarsCache(e)}))}isAvatarCached(e,t){const a=this.savedAvatarURLs[e];return void 0===t?!!a:!(!a||!a[t]||a[t]instanceof Promise)}removeFromAvatarsCache(e){this.savedAvatarURLs[e]&&delete this.savedAvatarURLs[e]}loadAvatar(e,t,a){var s,n;const i=null!==(s=(n=this.savedAvatarURLs)[e])&&void 0!==s?s:n[e]={};if(i[a])return i[a];{const s={_:"inputPeerPhotoFileLocation",pFlags:{},peer:this.appPeersManager.getInputPeerById(e),photo_id:t.photo_id},n={dcId:t.dc_id,location:s};"photo_big"===a&&(s.pFlags.big=!0,n.limitPart=524288);const r=this.apiFileManager.download(n);return i[a]=r.then((e=>i[a]=URL.createObjectURL(e)))}}}var Te=a(144),Ee=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class Fe extends G{after(){this.calls=new Map,i().IS_CALL_SUPPORTED&&this.apiUpdatesManager.addMultipleEventsListeners({updatePhoneCall:e=>{this.saveCall(e.phone_call)},updatePhoneCallSignalingData:e=>{this.rootScope.dispatchEvent("call_signaling",{callId:e.phone_call_id,data:e.data})}})}computeKey(e,t,a){return this.cryptoWorker.invokeCrypto("compute-dh-key",e,t,a)}saveCall(e){const t="phoneCallDiscarded"===e._,a=this.calls.get(e.id);return a?(re(a,e),t&&this.calls.delete(e.id),e=a):t||this.calls.set(e.id,e),this.rootScope.dispatchEvent("call_update",e),e}getCall(e){return this.calls.get(e)}getCallInput(e){const t=this.getCall(e);return{_:"inputPhoneCall",id:t.id,access_hash:t.access_hash}}savePhonePhoneCall(e){return this.appUsersManager.saveApiUsers(e.users),this.saveCall(e.phone_call)}generateDh(){return this.apiManager.invokeApi("messages.getDhConfig",{version:0,random_length:256}).then((e=>this.cryptoWorker.invokeCrypto("generate-dh",e)))}requestCall(e,t,a,s){return Ee(this,void 0,void 0,(function*(){const n=yield this.apiManager.invokeApi("phone.requestCall",{user_id:this.appUsersManager.getUserInput(e),protocol:t,video:s,random_id:(0,Te.d)(32),g_a_hash:a});return this.savePhonePhoneCall(n)}))}discardCall(e,t,a,s){return Ee(this,void 0,void 0,(function*(){if(!this.getCall(e))return;const n=yield this.apiManager.invokeApi("phone.discardCall",{video:s,peer:this.getCallInput(e),duration:t,reason:{_:a},connection_id:"0"});this.apiUpdatesManager.processUpdateMessage(n)}))}}var Re=a(7120),xe=a(2566);class Be extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.chats={};else for(const e in this.chats)if(e&&!this.peersStorage.isPeerNeeded(e.toPeerId(!0))){const t=this.chats[e];this.appUsersManager.modifyUsernamesCache(t,!1),this.storage.delete(e),delete this.chats[e]}},this.onChatUpdated=(e,t)=>{var a;this.apiUpdatesManager.processUpdateMessage(t),(null===(a=null==t?void 0:t.updates)||void 0===a?void 0:a.length)&&this.isChannel(e)&&this.rootScope.dispatchEvent("invalidate_participants",e)}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateChannelParticipant:e=>{this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e.channel_id))},updateChatDefaultBannedRights:e=>{const t=this.appPeersManager.getPeerId(e.peer).toChatId(),a=this.chats[t];a&&(a.default_banned_rights=e.default_banned_rights,this.rootScope.dispatchEvent("chat_update",t))}}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("chats")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.saveApiChats(t),this.peersStorage.addEventListener("peerNeeded",(e=>{e.isUser()||this.storage.getFromCache(e.toChatId())||this.storage.set({[e.toChatId()]:this.getChat(e.toChatId())})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{!e.isUser()&&this.storage.getFromCache(e.toChatId())&&this.storage.delete(e.toChatId())}))}))}saveApiChats(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiChat(e,t))))}saveApiChat(e,t){var a,s,n,i,r;if(!e||"chatEmpty"===e._)return;const o=this.chats[e.id];if(null!==(a=(r=e).pFlags)&&void 0!==a||(r.pFlags={}),e.pFlags.min&&void 0!==o)return;"channel"===e._&&void 0===e.participants_count&&void 0!==o&&o.participants_count&&(e.participants_count=o.participants_count),"chatPhotoEmpty"===(null===(s=e.photo)||void 0===s?void 0:s._)&&delete e.photo;const p=this.appUsersManager.setUsernameToCache(e,o),d=e.id.toPeerId(!0);if(void 0===o)this.chats[e.id]=e;else{const t=null===(n=o.photo)||void 0===n?void 0:n.photo_id,a=null===(i=e.photo)||void 0===i?void 0:i.photo_id,s=o.pFlags.forum!==e.pFlags.forum,r=t!==a||s,f=o.title!==e.title||p,c=o.pFlags.verified!==e.pFlags.verified||o.pFlags.scam!==e.pFlags.scam||o.pFlags.fake!==e.pFlags.fake;re(o,e),this.rootScope.dispatchEvent("chat_update",e.id),r&&this.rootScope.dispatchEvent("avatar_update",{peerId:d}),(f||c)&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:d}),s&&this.rootScope.dispatchEvent("chat_toggle_forum",{chatId:e.id,enabled:!!e.pFlags.forum})}this.peersStorage.isPeerNeeded(d)&&this.storage.set({[e.id]:e})}getChat(e){return this.chats[e]}hasRights(e,t,a,s){return(0,Re.Z)(this.getChat(e),t,a,s)}editChatDefaultBannedRights(e,t){const a=this.getChat(e);return a.default_banned_rights&&a.default_banned_rights.until_date===t.until_date&&(0,Y.Z)(a.default_banned_rights.pFlags,t.pFlags)?Promise.resolve():this.apiManager.invokeApi("messages.editChatDefaultBannedRights",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),banned_rights:t}).then(this.onChatUpdated.bind(this,e))}isChannel(e){const t=this.chats[e];return!(!t||"channel"!==t._&&"channelForbidden"!==t._)}isMegagroup(e){var t;const a=this.chats[e];return!!(null===(t=null==a?void 0:a.pFlags)||void 0===t?void 0:t.megagroup)}isForum(e){var t;const a=this.chats[e];return!!(null===(t=null==a?void 0:a.pFlags)||void 0===t?void 0:t.forum)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const a=this.getChat(e);return(!a||"channelForbidden"===a._||"chatForbidden"===a._||"chatEmpty"===a._||a.pFlags.left||a.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return t&&t.access_hash?{_:"inputChannel",channel_id:e,access_hash:t.access_hash||"0"}:{_:"inputChannelEmpty"}}getInputPeer(e){return this.isChannel(e)?this.getChannelInputPeer(e):this.getChatInputPeer(e)}getChatInputPeer(e){return{_:"inputPeerChat",chat_id:e}}getChannelInputPeer(e){return{_:"inputPeerChannel",channel_id:e,access_hash:this.getChat(e).access_hash||0}}hasChat(e,t){const a=this.chats[e];return(0,fe.Z)(a)&&(t||!a.pFlags.min)}getChatString(e){const t=this.getChat(e);return this.isChannel(e)?(this.isMegagroup(e)?"s":"c")+e+"_"+t.access_hash:"g"+e}createChannel(e){return this.apiManager.invokeApi("channels.createChannel",e).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}inviteToChannel(e,t){const a=this.getChannelInput(e),s=t.map((e=>this.appUsersManager.getUserInput(e)));return this.apiManager.invokeApi("channels.inviteToChannel",{channel:a,users:s}).then(this.onChatUpdated.bind(this,e))}createChat(e,t){return this.apiManager.invokeApi("messages.createChat",{users:t.map((e=>this.appUsersManager.getUserInput(e))),title:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}leaveChannel(e){return this.apiManager.invokeApi("channels.leaveChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}joinChannel(e){return this.apiManager.invokeApi("channels.joinChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}addChatUser(e,t,a=100){return this.apiManager.invokeApi("messages.addChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t),fwd_limit:a}).then(this.onChatUpdated.bind(this,e))}deleteChatUser(e,t){return this.apiManager.invokeApi("messages.deleteChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,this.appUsersManager.getSelf().id)}leave(e){return this.isChannel(e)?this.leaveChannel(e):this.leaveChat(e)}delete(e){return this.isChannel(e)?this.deleteChannel(e):this.deleteChat(e)}deleteChannel(e){return this.apiManager.invokeApi("channels.deleteChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}deleteChat(e){return this.apiManager.invokeApi("messages.deleteChat",{chat_id:e})}migrateChat(e){const t=this.getChat(e);return"channel"===t._?Promise.resolve(t.id):this.apiManager.invokeApi("messages.migrateChat",{chat_id:e}).then((t=>(this.onChatUpdated(e,t),t.updates.find((e=>"updateChannel"===e._)).channel_id)))}updateUsername(e,t,a){const s=this.apiManager.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t});return this.refreshChatAfterRequest(e,s,a)}editPhoto(e,t){const a={_:"inputChatUploadedPhoto",file:t};let s;return s=this.isChannel(e)?this.apiManager.invokeApi("channels.editPhoto",{channel:this.getChannelInput(e),photo:a}):this.apiManager.invokeApi("messages.editChatPhoto",{chat_id:e,photo:a}),s.then(this.onChatUpdated.bind(this,e))}editTitle(e,t){let a;return a=this.isChannel(e)?this.apiManager.invokeApi("channels.editTitle",{channel:this.getChannelInput(e),title:t}):this.apiManager.invokeApi("messages.editChatTitle",{chat_id:e,title:t}),a.then(this.onChatUpdated.bind(this,e))}editAbout(e,t){const a=e.toPeerId(!0);return this.apiManager.invokeApi("messages.editChatAbout",{peer:this.appPeersManager.getInputPeerById(a),about:t}).then((e=>(e&&this.rootScope.dispatchEvent("peer_bio_edit",a),e)))}editBanned(e,t,a){const s="object"!=typeof t?t:(0,xe.Z)(t);return this.apiManager.invokeApi("channels.editBanned",{channel:this.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(s),banned_rights:a}).then((n=>{if(this.onChatUpdated(e,n),"object"==typeof t){const n=Date.now()/1e3|0;this.apiUpdatesManager.processLocalUpdate({_:"updateChannelParticipant",channel_id:e,date:n,actor_id:void 0,qts:void 0,user_id:s,prev_participant:t,new_participant:Object.keys(a.pFlags).length?{_:"channelParticipantBanned",date:n,banned_rights:a,kicked_by:this.appUsersManager.getSelf().id,peer:this.appPeersManager.getOutputPeer(s),pFlags:{}}:void 0})}}))}clearChannelParticipantBannedRights(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{}})}kickFromChannel(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{view_messages:!0}})}kickFromChat(e,t){return this.isChannel(e)?this.kickFromChannel(e,t):this.deleteChatUser(e,t.toUserId())}resolveChannel(e){return this.apiManager.invokeApiSingle("channels.getChannels",{id:[{_:"inputChannel",channel_id:e,access_hash:"0"}]}).then((e=>{this.saveApiChats(e.chats)}))}togglePreHistoryHidden(e,t){return this.migrateChat(e).then((e=>this.apiManager.invokeApi("channels.togglePreHistoryHidden",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))))}toggleSignatures(e,t){return this.apiManager.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))}toggleNoForwards(e,t){return this.apiManager.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then(this.onChatUpdated.bind(this,e))}setChatAvailableReactions(e,t){const a=this.appProfileManager.getCachedFullChat(e);return a&&(a.available_reactions=t,this.rootScope.dispatchEvent("chat_full_update",e)),this.apiManager.invokeApi("messages.setChatAvailableReactions",{peer:this.getInputPeer(e),available_reactions:t}).then(this.onChatUpdated.bind(this,e))}getSendAs(e){return this.apiManager.invokeApiSingleProcess({method:"channels.getSendAs",params:{peer:this.getChannelInputPeer(e)},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),this.saveApiChats(e.chats),e.peers)})}importChatInvite(e){return this.apiManager.invokeApi("messages.importChatInvite",{hash:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}checkUsername(e,t){return this.apiManager.invokeApi("channels.checkUsername",{channel:this.getChannelInput(e),username:t})}getSponsoredMessage(e){return this.apiManager.invokeApiCacheable("channels.getSponsoredMessages",{channel:this.getChannelInput(e)},{cacheSeconds:300}).then((e=>{if("messages.sponsoredMessages"===e._){this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=e.messages.shift();e.messages.push(t)}return e}))}viewSponsoredMessage(e,t){return this.apiManager.invokeApiSingle("channels.viewSponsoredMessage",{channel:this.getChannelInput(e),random_id:t})}checkChatInvite(e){return this.apiManager.invokeApi("messages.checkChatInvite",{hash:e}).then((e=>(e.chat&&this.saveApiChat(e.chat,!0),e)))}toggleUsername(e,t,a){const s=this.apiManager.invokeApi("channels.toggleUsername",{channel:this.getChannelInput(e),username:t,active:a});return this.refreshChatAfterRequest(e,s)}reorderUsernames(e,t){const a=this.apiManager.invokeApi("channels.reorderUsernames",{channel:this.getChannelInput(e),order:t});return this.refreshChatAfterRequest(e,a)}deactivateAllUsernames(e,t){const a=this.apiManager.invokeApi("channels.deactivateAllUsernames",{channel:this.getChannelInput(e)});return this.refreshChatAfterRequest(e,a,t)}makeChannelPrivate(e){const t=[this.updateUsername(e,"",!0),this.deactivateAllUsernames(e,!0)],a=Promise.all(t).then((()=>!0));return this.refreshChatAfterRequest(e,a)}refreshChatAfterRequest(e,t,a){return a?t:t.then((t=>this.getChannels([e]).then((()=>t))))}getChannels(e){return this.apiManager.invokeApi("channels.getChannels",{id:e.map((e=>this.getChannelInput(e)))}).then((e=>{this.saveApiChats(e.chats)}))}toggleForum(e,t){return this.migrateChat(e).then((e=>this.apiManager.invokeApi("channels.toggleForum",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))))}editForumTopic(e){const{chatId:t,topicId:a,title:s,iconEmojiId:n,closed:i,hidden:r}=e;return this.apiManager.invokeApi("channels.editForumTopic",{channel:this.getChannelInput(t),topic_id:(0,oe.Z)(a),title:s,icon_emoji_id:n,closed:i,hidden:r}).then(this.onChatUpdated.bind(this,t))}createForumTopic(e){return t=this,a=void 0,n=function*(){const{chatId:t,title:a,iconColor:s,iconEmojiId:n}=e,i=yield this.appProfileManager.getChannelFull(t),r=i.default_send_as&&this.appPeersManager.getInputPeerById(this.appPeersManager.getPeerId(i.default_send_as));return this.apiManager.invokeApi("channels.createForumTopic",{channel:this.getChannelInput(t),title:a,icon_color:s,icon_emoji_id:n,random_id:(0,Te.a)(),send_as:r}).then((e=>{this.onChatUpdated(t,e);const a=e.updates.find((e=>"updateNewChannelMessage"===e._));return(0,pe.Z)(a.message.id)}))},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}updatePinnedForumTopic(e,t,a){return this.apiManager.invokeApi("channels.updatePinnedForumTopic",{channel:this.getChannelInput(e),topic_id:(0,oe.Z)(t),pinned:a}).then(this.onChatUpdated.bind(this,e))}}a(4762);var Ve,Oe=a(5953),Le=a(9005),Ne=a(6637),Ze=a(2423);function je(e,t){(0,Ne.Z)(e)||(e="https://"+e);const a={url:e};let s,n,i,r;if(s=e.match(/^(?:https?:\/\/)?(?:(.+?)\.)?(?:(?:web|k|z)\.)?t(?:elegram)?\.me(?:\/(.+))?/)){const t=new URL(e);let a=s[1];a&&o.BX.has(s[1])&&(a=void 0),a&&(t.pathname=a+("/"===t.pathname?"":t.pathname));const n=t.pathname.slice(1),i=n.split("/");if(i[0]&&"$"===i[0][0]&&i[0].length>1)r="invoice";else if(/^\W/.test(n)&&!Ze.kO.test(n))r="joinchat";else switch(i[0]){case"joinchat":case"addstickers":case"addemoji":case"voicechat":case"invoice":if(1!==i.length&&!a){r=i[0];break}default:if(i[1]&&i[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===i.length){r="im";break}}}else(n=e.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?r="im":(i=e.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(r="tg_"+i[1]);return window[r]||(r=void 0),a.onclick=r,a}d.GO&&(d.GO.wrapUrl=je),function(e){let t,s;function n(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function i(){if("h12"===e.timeFormat)try{const t=P({hour:"numeric",minute:"numeric",hour12:!0}),a=new Date;a.setHours(0);const s=t.format(a);e.amPmCache.am=s.split(" ")[1],a.setHours(12);const n=t.format(a);e.amPmCache.pm=n.split(" ")[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function r(){const e=_.Z.langPackCode;return n(e),Promise.all([a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),a.e(8).then(a.bind(a,9179))]).then((([t,a,s])=>{const n=[];return p(t.default,n),p(a.default,n),f({_:"langPackDifference",from_version:0,lang_code:e,strings:n,version:0,local:!0,countries:s.default})}))}function o(t,s){e.requestedServerLanguage=!0;const n=g.managers;return Promise.all([n.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"web"}),!1,a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),n.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function p(e,t=[]){for(const a in e){const s=e[a];"string"==typeof s?t.push({_:"langPackString",key:a,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:a},s))}return t}function f(e){return e.appVersion=_.Z.langPackVersion,h.Z.set({langPack:e}).then((()=>(c(e),e)))}function c(a){const s=e.lastRequestedLangCode;if(a.lang_code===s){try{t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode)}catch(a){console.error("pluralRules error",a),t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode.split("-",1)[0])}try{t=new Intl.PluralRules(a.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(a.lang_code.split("-",1)[0])}e.strings.clear();for(const t of a.strings)e.strings.set(t.key,t);a.countries&&(e.countriesList.length=0,e.countriesList.push(...a.countries.countries),a.countries.countries.forEach((t=>{if(t.name){const a=t.default_name;e.strings.set(a,{_:"langPackString",key:a,value:t.name})}}))),e.lastAppliedLangCode!==s&&(g.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,v.clear(),i()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a&&a.update()}))}}function l(e,t,a={i:0}){const s=[];let n=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,i,r,o,p,d,f)=>{if(s.push(f.slice(n,d)),i){let e;switch(i){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...l(r,t,a)),s.push(e)}else if(o)s.push(document.createElement("br"));else if(p){const e=p.lastIndexOf("]"),n=p.slice(1,e),i=p.slice(e+2,p.length-1);let r;if(i&&(0,Ne.Z)(i)){r=document.createElement("a");const e=je(i);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[a.i++],r instanceof DocumentFragment&&(r=r.firstChild),r.textContent="";r.append(...l(n,t,a)),s.push(r)}else t&&function(e,t,a){const s=t[a.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,a);return n=d+e.length,""})),n!==e.length&&s.push(e.slice(n)),s}function m(a,s=!1,n){const i=e.strings.get(a);let r;if(i)if("langPackStringPluralized"===i._&&(null==n?void 0:n.length)){let e=n[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),r=i[t.select(e)+"_value"]||i.other_value}else r="langPackString"===i._?i.value:a;else r=a;const o=l(r,n);return s?o.map((e=>e instanceof Node?e.textContent:e)).join(""):o}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.isRTL=!1,e.setRTL=function(t){e.isRTL=t},e.getCacheLangPack=function(){return s||(s=Promise.all([h.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(d.ZP,e.lastRequestedLangCode||n(t.lang_code),c(t),t):r())).finally((()=>{s=void 0})))},e.setTimeFormat=function(t,a=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,i(),a&&(v.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a instanceof b&&a.update()})))},e.loadLocalLangPack=r,e.loadLangPack=o,e.getStrings=function(e,t){return g.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:_.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=p,e.getLangPack=function(e,t){return n(e),o(e).then((([e,t,a,s,n,i])=>{let r=[];return[a,s].forEach((e=>{p(e.default,r)})),r=r.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=r,e.countries=n,f(e)}))},e.saveLangPack=f,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():a.e(642).then(a.bind(a,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=c,e.superFormatter=l,e.format=m,e.weakMap=new WeakMap;class u{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class y extends u{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,Oe.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...m(this.key,!1,this.args));else{const e=this.element[this.property],t=m(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,Y.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=y;const v=new Map;function P(t={}){const a=JSON.stringify(t);let s=v.get(a);return s||(s=new Intl.DateTimeFormat(e.lastRequestedNormalizedLangCode+"-u-hc-"+e.timeFormat,t),v.set(a,s)),s}e.amPmCache={am:"AM",pm:"PM"};class b extends u{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"})),this.element.setAttribute("dir","auto")}update(t){let a;if((0,Oe.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){const t=this.date.getHours();a=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(a+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=P(this.options);a=(0,Le.Z)(e.format(this.date))}this.element[this.property]=a}}e.IntlDateElement=b,e.i18n=function(e,t){return new y({key:e,args:t}).element},e.i18n_=function(e){return new y(e).element},e._i18n=function(e,t,a,s){return new y({element:e,key:t,args:a,property:s}).element}}(Ve||(Ve={}));const qe=Ve;Ve.i18n,Ve.i18n_,Ve._i18n,d.GO.I18n=Ve;const Ge=["January","February","March","April","May","June","July","August","September","October","November","December"],He=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],We=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),a=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-a);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/86400+1)/7)};d.GO&&(d.GO.formatDateAccordingToTodayNew=function(e){const t=new Date,a=t.getTime()/1e3|0,s=e.getTime()/1e3|0,n={};return a-s<86400&&t.getDate()===e.getDate()?n.hour=n.minute="2-digit":t.getFullYear()!==e.getFullYear()?(n.year=n.day="numeric",n.month="2-digit"):a-s<604800&&We(t)===We(e)?n.weekday="short":(n.month="short",n.day="numeric"),new qe.IntlDateElement({date:e,options:n}).element});const ze=2013,Ke=new RegExp("20[0-9]{1,2}"),Je=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),$e=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),Qe=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),Ye=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),Xe=[31,29,31,30,31,30,31,31,30,31,30,31];function et(e,t,a){const s=(new Date).getFullYear(),n=Date.now();if(a>=ze&&a<=s){const s=new Date;s.setFullYear(a,t,1),s.setHours(0,0,0);const i=s.getTime();if(i>n)return;s.setMonth(s.getMonth()+1);const r=s.getTime()-1;e.push({title:at(i),minDate:i,maxDate:r})}}function tt(e,t,a){if(rt(t,a)){const n=(new Date).getFullYear(),i=Date.now();for(let r=n;r>=ze;r--){if(1===a&&28===t&&((s=r)%4!=0||s%100==0)&&s%400!=0)continue;const o=new Date;o.setFullYear(r,a,t+1),o.setHours(0,0,0);const p=o.getTime();if(p>i)continue;o.setFullYear(r,a,t+2),o.setHours(0,0,0);const d=o.getTime()-1;r===n?e.push({title:st(p),minDate:p,maxDate:d}):e.push({title:nt(p),minDate:p,maxDate:d})}}var s}function at(e){const t=new Date(e);return Ge[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function st(e){const t=new Date(e);return Ge[t.getMonth()].slice(0,3)+" "+t.getDate()}function nt(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function it(e){const t=new Date(e);return He[t.getDay()]}function rt(e,t){return t>=0&&t<12&&e>=0&&e{t[e][s]=a})),a[e]=t[e])}d.GO.fillTipDates=function(e,t){const a=e.trim().toLowerCase();if(a.length<3)return;if(0==="today".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-1;return void t.push({title:"Today",minDate:i,maxDate:r})}if(0==="yesterday".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime()-864e5;e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:i,maxDate:r})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let a=0;a<7;a++)if(t.setDate(t.getDate()+1),0===it(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(a);if(s>=0){const e=new Date,a=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>a&&e.setTime(e.getTime()-6048e5);const i=e.getFullYear(),r=e.getMonth(),o=e.getDate();e.setFullYear(i,r,o),e.setHours(0,0,0);const p=e.getTime();e.setFullYear(i,r,o+1),e.setHours(0,0,0);const d=e.getTime()-1;return void t.push({title:it(p),minDate:p,maxDate:d})}let n;if(null===(n=Qe.exec(a)))if(null===(n=Ye.exec(a)))if(null===(n=Ke.exec(a))){if(null!==(n=Je.exec(a))){const e=n[1],a=n[2],s=ot(e);if(s>=0){const e=+a;if(e>0&&e<=31)return void tt(t,e-1,s);if(e>=ze)return void et(t,s,e)}}if(null!==(n=$e.exec(a))){const e=n[1],a=ot(n[2]);if(a>=0){const s=+e;if(s>0&&s<=31)return void tt(t,s-1,a);s>=ze&&et(t,a,s)}}}else{let e=+a;const s=(new Date).getFullYear();if(e=e;a--){const e=new Date;e.setFullYear(a,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(a+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+a,minDate:s,maxDate:n})}}else if(e<=s){const a=new Date;a.setFullYear(e,0,1),a.setHours(0,0,0);const s=a.getTime();a.setFullYear(e+1,0,1),a.setHours(0,0,0);const n=a.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],a=n[3],s=n[5];if(!n[2]===n[4])return;const i=parseInt(e),r=parseInt(a)-1;let o=parseInt(s);o>=10&&o<=99&&(o+=2e3);const p=(new Date).getFullYear();if(rt(i-1,r)&&o>=ze&&o<=p){const e=new Date;e.setFullYear(o,r,i),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(o,r,i+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:nt(a),minDate:a,maxDate:s})}}else{const e=n[1],a=n[3],s=parseInt(e),i=parseInt(a);if(s>0&&s<=31){if(i>=ze&&s<=12)return void et(t,s-1,i);i<=12&&tt(t,s-1,i-1)}else s>=ze&&i<=12&&et(t,i-1,s)}};var dt=a(2491),ft=a(7072),ct=a(8801),lt=a(6658);const mt={pdf:"application/pdf",tgv:"application/x-tgwallpattern",tgs:"application/x-tgsticker",json:"application/json",wav:"audio/wav",mp3:"audio/mpeg",ogg:"audio/ogg",jpeg:"image/jpeg",jpg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",mp4:"video/mp4",webm:"video/webm",mov:"video/quicktime",svg:"image/svg+xml"},gt={};for(const e in mt)gt[mt[e]]=e;let ht=0;class ut extends G{constructor(){super(...arguments),this.onServiceWorkerFail=()=>{for(const e in this.docs){const t=this.docs[e];t.supportsStreaming&&(delete t.supportsStreaming,this.thumbsStorage.deleteCacheContext(t))}}}after(){this.docs={},this.stickerCachedThumbs={},this.uploadingWallPapers={},f.Z.getInstance().addEventListener("serviceWorkerOnline",(e=>{e||this.onServiceWorkerFail()}))}saveDoc(e,t){if(!e||"documentEmpty"===e._)return;const a=this.docs[e.id];e.file_reference&&(pt("file_reference",a,e),this.referenceDatabase.saveContext(e.file_reference,t)),a||(this.docs[e.id]=e);for(let t=0,a=e.attributes.length;t"documentAttributeFilename"===e._)),a=t&&t.file_name.split(".").pop(),s=((e,t={})=>{const a=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+a+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):Ge[e.getMonth()])+a+e.getFullYear()+(t.noTime?"":", "+s)})(new Date(1e3*e.date),{monthAsNumber:!0,leadingZero:!0}).replace(/[:\.]/g,"-").replace(", ","_");e.file_name=`${e.type}_${s}${a?"."+a:""}`}return Hs()&&("gif"===e.type&&e.size>8e6||"audio"===e.type||"video"===e.type)?(e.supportsStreaming=!0,this.thumbsStorage.getCacheContext(e).url||this.thumbsStorage.setCacheContextURL(e,void 0,function(e,t=!1,a){let s;return s=t?"download":a?"thumb":e.supportsStreaming?"stream":"document",(0,ct.q)(s,(0,lt.Z)(e,a))}(e),0)):e.supportsStreaming=!1,e.file_name||(e.file_name=""),a?Object.assign(a,e):e}getDoc(e){return(0,fe.Z)(e)?e:this.docs[e]}downloadDoc(e,t,a){return this.apiFileManager.downloadMedia({media:e,queueId:t,onlyCache:a})}getLottieCachedThumb(e,t){const a=this.stickerCachedThumbs[e];return a&&a[t]}saveLottiePreview(e,t,a,s,n){var i,r,o;const p=this.getDoc(e);if(!p)return;const d=null!==(i=(r=this.stickerCachedThumbs)[o=p.id])&&void 0!==i?i:r[o]={},f=d[n];f&&f.w>=a&&f.h>=s||(d[n]={url:URL.createObjectURL(t),w:a,h:s})}saveWebPConvertedStrippedThumb(e,t){const a=this.getDoc(e);if(!a)return;const s=a.thumbs&&a.thumbs.find((e=>"photoStrippedSize"===e._));s&&(a.pFlags.stickerThumbConverted=!0,s.bytes=t)}getWallPapers(){return this.apiManager.invokeApiHashable({method:"account.getWallPapers"}).then((e=>{const t=e.wallpapers;return t.forEach((e=>{e.document=this.saveDoc(e.document)})),t}))}prepareWallPaperUpload(e){const t="wallpaper-upload-"+ ++ht,a={_:"photoSize",h:0,w:0,location:{},size:e.size,type:o.Pt};let s={_:"document",access_hash:"",attributes:[],dc_id:0,file_reference:[],id:t,mime_type:e.type,size:e.size,date:Date.now()/1e3,pFlags:{},thumbs:[a],file_name:e.name};s=this.saveDoc(s);const n=this.thumbsStorage.setCacheContextURL(s,void 0,URL.createObjectURL(e),e.size),i={_:"wallPaper",access_hash:"",document:s,id:t,slug:t,pFlags:{}};return this.uploadingWallPapers[t]={cacheContext:n,file:e},i}uploadWallPaper(e){const{cacheContext:t,file:a}=this.uploadingWallPapers[e];return delete this.uploadingWallPapers[e],this.apiFileManager.upload({file:a,fileName:a.name}).then((e=>this.apiManager.invokeApi("account.uploadWallPaper",{file:e,mime_type:a.type,settings:{_:"wallPaperSettings"}}).then((e=>((0,ue.Z)(e),e.document=this.saveDoc(e.document),this.thumbsStorage.setCacheContextURL(e.document,void 0,t.url,t.downloaded),e)))))}getGifs(){return this.apiManager.invokeApiHashable({method:"messages.getSavedGifs",processResult:e=>((0,ue.Z)(e),e.gifs.map((e=>this.saveDoc(e))))})}requestDocPart(e,t,a,s){const n=this.getDoc(e);return n?this.apiFileManager.requestFilePart(t,(0,ft.Z)(n),a,s):Promise.reject((0,X.Z)("NO_DOC"))}}var yt=a(6034);class _t extends G{constructor(){super(...arguments),this.drafts={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateDraftMessage:e=>{const t=this.appPeersManager.getPeerId(e.peer);this.saveDraft({peerId:t,threadId:e.threadId,draft:e.draft,notify:!0})}}),h.Z.get("drafts").then((e=>{this.drafts=e||{}}))}getKey(e,t){return e+(t?"_"+t:"")}getDraft(e,t){return this.drafts[this.getKey(e,t)]}addMissedDialogs(){return this.getAllDrafts().then((()=>{for(const e in this.drafts){if(-1!==e.indexOf("_"))continue;const t=e.toPeerId();this.appMessagesManager.getDialogOnly(t)||this.appMessagesManager.reloadConversation(t)}}))}getAllDrafts(){var e;return null!==(e=this.getAllDraftPromise)&&void 0!==e?e:this.getAllDraftPromise=this.apiManager.invokeApi("messages.getAllDrafts").then((e=>{(this.apiUpdatesManager.updatesState.syncLoading||Promise.resolve()).then((()=>{this.apiUpdatesManager.processUpdateMessage(e)}))}))}saveDraft({peerId:e,threadId:t,draft:a,notify:s,force:n}){const i=this.processApiDraft(a),r=this.getKey(e,t);return i?this.drafts[r]=i:delete this.drafts[r],h.Z.set({drafts:this.drafts}),s&&this.rootScope.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:i,force:n}),i}isEmptyDraft(e){return"draftMessage"!==(null==e?void 0:e._)||!(void 0!==e.reply_to_msg_id&&e.reply_to_msg_id>0)&&!e.message.length}processApiDraft(e){if(e&&"draftMessage"===e._)return e.reply_to_msg_id&&(e.reply_to_msg_id=(0,pe.Z)(e.reply_to_msg_id)),e}syncDraft(e,t,a,s=!0,n=!1){const i=this.getDraft(e,t);if((0,yt.Z)(i,a))return!0;const r={peer:this.appPeersManager.getInputPeerById(e),message:""};let o;if(this.isEmptyDraft(a))o={_:"draftMessageEmpty"};else{(0,ue.Z)(a);const e=a.message,t=a.entities;a.reply_to_msg_id&&(r.reply_to_msg_id=(0,oe.Z)(a.reply_to_msg_id)),(null==t?void 0:t.length)&&(r.entities=this.appMessagesManager.getInputEntities(t)),a.pFlags.no_webpage&&(r.no_webpage=a.pFlags.no_webpage),r.message=e}t&&(r.top_msg_id=(0,oe.Z)(t));const p=o||a;return p.date=(0,te.Z)(!0)+this.timeManager.getServerTimeOffset(),this.saveDraft({peerId:e,threadId:t,draft:p,notify:!0,force:n}),!s||this.apiManager.invokeApi("messages.saveDraft",r)}clearAllDrafts(){return this.apiManager.invokeApi("messages.clearAllDrafts").then((e=>{if(e)for(const e in this.drafts){const[t,a]=e.split("_");this.rootScope.dispatchEvent("draft_updated",{peerId:t.toPeerId(),threadId:a?+a:void 0,draft:void 0})}}))}clearDraft(e,t){const a={_:"draftMessageEmpty"};t?this.syncDraft(e,t,a,!1,!0):this.saveDraft({peerId:e,threadId:t,draft:a,notify:!0,force:!0})}setDraft(e,t,a,s){const n={_:"draftMessage",date:Date.now()/1e3|0,message:a,pFlags:{},entities:s};t?this.syncDraft(e,t,n,!1,!0):this.saveDraft({peerId:e,threadId:t,draft:n,notify:!0,force:!0})}}var vt=a(946),Pt=a(7746);const bt={keywords:{},version:0,langCode:_.Z.langPackCode};class Mt extends G{constructor(){super(...arguments),this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={},this.recent={},this.getRecentEmojisPromises={},this.getCustomEmojiDocumentPromises=new Map}getEmojiKeywords(e=_.Z.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const a="emojiKeywords_"+e;return this.getKeywordsPromises[e]=h.Z.get(a).then((t=>((0,fe.Z)(t)||(t={}),(0,vt.Z)(bt,t),t.langCode=e,this.keywordLangPacks[e]=t,this.apiManager.invokeApi("messages.getEmojiKeywordsDifference",{lang_code:t.langCode,from_version:t.version}).then((e=>{t.version=e.version;const s=t.keywords,n=e.keywords;for(let e=0,t=n.length;et)))))}getBothEmojiKeywords(){const e=[this.getEmojiKeywords()];return this.networkerFactory.language!==_.Z.langPackCode&&e.push(this.getEmojiKeywords(this.networkerFactory.language)),this.recent.native||e.push(this.getRecentEmojis("native")),Promise.all(e)}indexEmojis(){this.index||(this.index=new ae.Z(void 0,2));for(const e in this.keywordLangPacks){if(this.indexedLangPacks[e])continue;const t=this.keywordLangPacks[e].keywords;for(const e in t){const a=t[e];this.index.indexObject(a,e)}this.indexedLangPacks[e]=!0}}searchEmojis(e){let t;if(this.indexEmojis(),(e=e.toLowerCase().replace(/_/g," ")).trim()){const a=this.index.search(e);t=Array.from(a).reduce(((e,t)=>e.concat(t)),[])}else t=this.recent.native.concat(Mt.POPULAR_EMOJI).slice(0,32);return t=Array.from(new Set(t)),t}getRecentEmojis(e){var t;const a=this.getRecentEmojisPromises;return null!==(t=a[e])&&void 0!==t?t:a[e]=this.appStateManager.getState().then((t=>{let a=[];if("native"===e){const{recentEmoji:e}=t;a=Array.isArray(e)&&e.length?e:Mt.POPULAR_EMOJI}else{const{recentCustomEmoji:e}=t;a=Array.isArray(e)&&e.length?e:[]}return this.recent[e]=a}))}pushRecentEmoji(e){const t=e.docId?"custom":"native";e.emoji=(0,Pt.Z)(e.emoji),this.getRecentEmojis(t).then((a=>{const s=e.docId||e.emoji;(0,M.Z)(a,s),a.unshift(s),a.splice(32,a.length-32),this.appStateManager.pushToState("custom"===t?"recentCustomEmoji":"recentEmoji",a),this.rootScope.dispatchEvent("emoji_recent",e)}))}getCustomEmojiDocuments(e){return e.length?this.apiManager.invokeApi("messages.getCustomEmojiDocuments",{document_id:e}).then((e=>e.map((e=>this.appDocsManager.saveDoc(e,{type:"customEmoji",docId:e.id}))))):Promise.resolve([])}getCachedCustomEmojiDocuments(e){return e.map((e=>this.appDocsManager.getDoc(e)))}setDebouncedGetCustomEmojiDocuments(){!this.getCustomEmojiDocumentsPromise&&this.getCustomEmojiDocumentPromises.size&&(this.getCustomEmojiDocumentsPromise=(0,P.Z)(0).then((()=>{const e=[...this.getCustomEmojiDocumentPromises.keys()],t=[];do{const a=e.splice(0,100),s=this.getCustomEmojiDocuments(a).then((e=>{e.forEach(((e,t)=>{const s=a[t],n=this.getCustomEmojiDocumentPromises.get(s);this.getCustomEmojiDocumentPromises.delete(s),n.resolve(e)}))}));t.push(s)}while(e.length);return Promise.all(t)})).finally((()=>{this.getCustomEmojiDocumentsPromise=void 0,this.setDebouncedGetCustomEmojiDocuments()})))}getCustomEmojiDocument(e){let t=this.getCustomEmojiDocumentPromises.get(e);if(t)return t;return this.appDocsManager.getDoc(e)||(t=(0,v.Z)(),this.getCustomEmojiDocumentPromises.set(e,t),this.setDebouncedGetCustomEmojiDocuments(),t)}getCustomEmojis(){return this.appStickersManager.getEmojiStickers()}}Mt.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];var It=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class St extends G{after(){this.log=(0,I.kg)("GROUP-CALLS"),this.groupCalls=new Map,this.participants=new Map,this.nextOffsets=new Map,this.apiUpdatesManager.addMultipleEventsListeners({updateGroupCall:e=>{this.saveGroupCall(e.call,e.chat_id)},updateGroupCallParticipants:e=>{this.saveGroupCall(e.call);const t=e.call.id;this.saveApiParticipants(t,e.participants)}}),this.rootScope.addEventListener("group_call_update",(e=>{"groupCallDiscarded"===e._&&this.participants.delete(e.id)}))}getCachedParticipants(e){let t=this.participants.get(e);return t||this.participants.set(e,t=new Map),t}prepareToSavingNextOffset(e){const t=this.nextOffsets,a=t.get(e);return{nextOffset:a,setNextOffset:s=>{t.get(e)===a&&t.set(e,s)}}}saveApiParticipant(e,t,a){const s=this.getCachedParticipants(e),n=(0,le.Z)(t.peer),i=s.get(n),r=t.pFlags.left;if(!i&&r)return;t.pFlags.muted||t.pFlags.can_self_unmute||(t.pFlags.can_self_unmute=!0),i?(re(i,t),t=i):s.set(n,t);const o=this.getGroupCall(e);if("groupCall"===(null==o?void 0:o._)){let e=!1;r?(--o.participants_count,e=!0):!t.pFlags.just_joined||i||t.pFlags.self||(++o.participants_count,e=!0),e&&this.rootScope.dispatchEvent("group_call_update",o)}r&&s.delete(n),this.rootScope.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}saveApiParticipants(e,t,a){t.saved||(t.saved=!0,t.forEach((t=>this.saveApiParticipant(e,t,a))))}editParticipant(e,t,a){return It(this,void 0,void 0,(function*(){this.saveApiParticipant(e,t);const s=t.pFlags.self?o.NM:(0,le.Z)(t.peer),n=yield this.apiManager.invokeApiSingle("phone.editGroupCallParticipant",{call:this.getGroupCallInput(e),participant:s===o.NM?this.appPeersManager.getInputPeerSelf():this.appPeersManager.getInputPeerById(s),muted:a.muted,volume:a.volume,raise_hand:a.raiseHand,video_paused:a.videoPaused,video_stopped:a.videoStopped,presentation_paused:a.presentationPaused});this.apiUpdatesManager.processUpdateMessage(n)}))}getGroupCall(e){return this.groupCalls.get(e)}getGroupCallFull(e,t){return It(this,void 0,void 0,(function*(){const a=this.getGroupCall(e);if(a&&"inputGroupCall"!==a._&&!t)return a;const s=this.getCachedParticipants(e).size?0:100;return this.apiManager.invokeApiSingleProcess({method:"phone.getGroupCall",params:{call:this.getGroupCallInput(e),limit:s},processResult:t=>{this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.saveApiChats(t.chats),this.saveApiParticipants(e,t.participants,!0);const a=this.saveGroupCall(t.call);return s&&void 0===this.nextOffsets.get(e)&&this.nextOffsets.set(e,t.participants_next_offset),a}})}))}saveGroupCall(e,t){const a=this.groupCalls.get(e.id),s="inputGroupCall"!==e._&&(!a||"groupCallDiscarded"!==a._);return a?(s&&re(a,e),e=a):this.groupCalls.set(e.id,e),s&&this.rootScope.dispatchEvent("group_call_update",e),e}createGroupCall(e,t,a){return It(this,void 0,void 0,(function*(){const s=yield this.apiManager.invokeApi("phone.createGroupCall",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),random_id:(0,Te.d)(32),schedule_date:t,title:a});return this.apiUpdatesManager.processUpdateMessage(s),s.updates.find((e=>"updateGroupCall"===e._)).call}))}getGroupCallInput(e){const t=this.getGroupCall(e);return{_:"inputGroupCall",id:t.id,access_hash:t.access_hash}}getGroupCallParticipants(e){return It(this,void 0,void 0,(function*(){const{nextOffset:t,setNextOffset:a}=this.prepareToSavingNextOffset(e);return""!==t&&(yield this.apiManager.invokeApiSingleProcess({method:"phone.getGroupParticipants",params:{call:this.getGroupCallInput(e),ids:[],sources:[],offset:t||"",limit:100},processResult:t=>{const s=t.count===t.participants.length?"":t.next_offset;this.appChatsManager.saveApiChats(t.chats),this.appUsersManager.saveApiUsers(t.users),this.saveApiParticipants(e,t.participants),a(s)}})),{participants:this.getCachedParticipants(e),isEnd:""===this.nextOffsets.get(e)}}))}hangUp(e,t){const a=this.getGroupCallInput(e);let s;return s="boolean"==typeof t&&t?this.apiManager.invokeApi("phone.discardGroupCall",{call:a}):"number"==typeof t?this.apiManager.invokeApi("phone.leaveGroupCall",{call:a,source:t}):this.apiManager.invokeApi("phone.joinGroupCall",{call:a,join_as:this.appPeersManager.getInputPeerSelf(),muted:!0,video_stopped:!0,params:{_:"dataJSON",data:""}}),s.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}joinGroupCall(e,t,a){return It(this,void 0,void 0,(function*(){const s=this.getGroupCallInput(e);let n;if("main"===a.type){const i={call:s,join_as:this.appPeersManager.getInputPeerSelf(),params:t,muted:a.isMuted,video_stopped:!a.joinVideo};n=this.apiManager.invokeApi("phone.joinGroupCall",i),this.log(`[api] joinGroupCall id=${e}`,i)}else{const a={call:s,params:t};n=this.apiManager.invokeApi("phone.joinGroupCallPresentation",a),this.log(`[api] joinGroupCallPresentation id=${e}`,a)}const i=yield n;return this.apiUpdatesManager.processUpdateMessage(i),i.updates.find((e=>"updateGroupCallConnection"===e._))}))}leaveGroupCallPresentation(e){return this.apiManager.invokeApi("phone.leaveGroupCallPresentation",{call:this.getGroupCallInput(e)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}}function Ct(e){return{_:"inputPhoto",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}function wt(e){return{_:"inputMediaPhoto",id:Ct(e),ttl_seconds:0}}var kt=a(515);function At(e){return{_:"inputMediaDocument",id:{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference},ttl_seconds:0}}class Dt extends G{constructor(){super(...arguments),this.inlineResults={},this.setHash={}}getGeoInput(e){return"geoPoint"===e._?{_:"inputGeoPoint",lat:e.lat,long:e.long,accuracy_radius:e.accuracy_radius}:{_:"inputGeoPointEmpty"}}getInlineResults(e,t,a="",s="",n){return this.apiManager.invokeApi("messages.getInlineBotResults",{bot:this.appUsersManager.getUserInput(t),peer:this.appPeersManager.getInputPeerById(e),query:a,geo_point:n?this.getGeoInput(n):void 0,offset:s},{stopTime:-1,noErrorBox:!0}).then((e=>{const t=e.query_id;return e.results.forEach((e=>{"botInlineMediaResult"===e._&&(e.document&&(e.document=this.appDocsManager.saveDoc(e.document)),e.photo&&(e.photo=this.appPhotosManager.savePhoto(e.photo))),this.inlineResults[(0,kt.Z)(t,e.id)]=e})),e}))}pushPopularBot(e){this.appUsersManager.getTopPeers("bots_inline").then((t=>{const a=e.toPeerId(),s=t.findIndex((e=>e.id===a));let n;n=-1!==s?t[s]:{id:a,rating:0},++n.rating,(0,ie.Z)(t,n,"rating"),this.appStateManager.setKeyValueToStorage("topPeersCache")}))}switchToPM(e,t,a){return this.setHash[t]={peerId:e,time:Date.now()},this.appMessagesManager.startBot(t,void 0,a)}checkSwitchReturn(e){return t=this,a=void 0,n=function*(){const t=this.appUsersManager.getUser(e);if(!t||!t.pFlags.bot||!t.bot_inline_placeholder)return;const a=this.setHash[e];return a&&(delete this.setHash[e],Date.now()-a.time<36e5)?a.peerId:void 0},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}switchInlineQuery(e,t,a,s){this.appDraftsManager.setDraft(e,t,"@"+this.appPeersManager.getPeerUsername(a.toPeerId())+" "+s)}callbackButtonClick(e,t,a){return this.apiManager.invokeApi("messages.getBotCallbackAnswer",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t),data:a.data},{stopTime:-1,noErrorBox:!0})}sendInlineResult(e,t,a,s={}){const n=this.inlineResults[a];if(!n)return;this.pushPopularBot(t);const i=a.split("_"),r=i.shift(),o=i.join("_");if(s.viaBotId=t,s.queryId=r,s.resultId=o,n.send_message.reply_markup&&(s.replyMarkup=n.send_message.reply_markup),"botInlineMessageText"===n.send_message._)s.entities=n.send_message.entities,this.appMessagesManager.sendText(e,n.send_message.message,s);else{let t,a,i="";const r=n.send_message;switch(r._){case"botInlineMessageMediaAuto":if(i=r.message,"botInlineMediaResult"===n._){const{document:e,photo:a}=n;t=e?At(e):wt(a)}break;case"botInlineMessageMediaGeo":t={_:"inputMediaGeoPoint",geo_point:this.getGeoInput(r.geo)},s.geoPoint=r.geo;break;case"botInlineMessageMediaVenue":t={_:"inputMediaVenue",geo_point:this.getGeoInput(r.geo),title:r.title,address:r.address,provider:r.provider,venue_id:r.venue_id,venue_type:r.venue_type},s.geoPoint=r.geo;break;case"botInlineMessageMediaContact":t={_:"inputMediaContact",phone_number:r.phone_number,first_name:r.first_name,last_name:r.last_name,vcard:r.vcard};break;case"botInlineMessageMediaInvoice":a={_:"messageMediaInvoice",title:r.title,description:r.description,photo:r.photo,currency:r.currency,total_amount:r.total_amount,pFlags:{shipping_address_requested:r.pFlags.shipping_address_requested,test:r.pFlags.test},start_param:void 0}}!t&&a&&(t={_:"messageMediaPending",messageMedia:a}),this.appMessagesManager.sendOther(e,t,s)}}}var Ut=a(7082);class Tt{constructor(){this.tempNum=0}generateTempMessageId(e){const t=++this.tempNum;return(0,pe.Z)(e)+(t&Ut.o-1)}}var Et=a(4421),Ft=a(3624),Rt=a(7401);function xt(e,t){if(e.length{let o=e.slice(s,r);const p=n++;o.length>t&&(xt(o.slice(t),t).forEach((e=>{i[n++]=e})),o=o.slice(0,t)),s=r,a=0,i[p]=(i[p]||"")+o};let o=0;for(;;){let s=e.indexOf(" ",o);if(-1===s){o!==e.length-1&&r();break}s+=" ".length;const n=s-o;a+n>t&&r(a),o=s,a+=n}return i}var Bt=a(5701),Vt=a(7667),Ot=a(6241),Lt=a(6535),Nt=a(6566),Zt=a(2202),jt=a(319);const qt=new class{constructor(){this.tabs=new Map}start(){f.Z.getInstance().addEventListener("tabState",((e,t)=>{this.tabs.get(t).state=e}))}getTabs(){return[...this.tabs.values()].filter((e=>!!e.state))}addTab(e){const t={source:e,state:void 0};this.tabs.set(e,t)}deleteTab(e){this.tabs.delete(e)}};d.GO&&(d.GO.appTabsManager=qt);const Gt=qt;var Ht=a(2381),Wt=a(13);function zt(e){return{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}var Kt=a(5285),Jt=a(5102);function $t(e,t,a){a?e[t]=!0:delete e[t]}var Qt=a(4993),Yt=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Xt=e=>{e()},ea=!0;class ta extends G{constructor(){super(...arguments),this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new Et.Z(10),this.needSingleMessages=new Map,this.extendedMedia=new Map,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newDialogsToHandle=new Map,this.newUpdatesAfterReloadToHandle={},this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=(0,I.kg)("MESSAGES",I.v9.Error|I.v9.Debug|I.v9.Log|I.v9.Warn),this.groupedTempId=0,this.typings={},this.unreadMentions={},this.goToNextMentionPromises={},this.batchUpdates={},this.clear=e=>{this.middleware?this.middleware.clean():(this.middleware=(0,Ft.k)(),this.uploadFilePromises={}),this.messagesStorageByPeerId={},this.groupedMessagesStorage={},this.scheduledMessagesStorage={},this.historiesStorage={},this.threadsStorage={},this.searchesStorage={},this.pinnedMessages={},this.threadsServiceMessagesIdsStorage={},this.threadsToReplies={},this.dialogsStorage&&this.dialogsStorage.clear(e),this.filtersStorage&&this.filtersStorage.clear(e)},this.handleNewDialogs=()=>{let e=0;const t=new Map,a=a=>{var s;const{peerId:n}=a;this.dialogsStorage.pushDialog({dialog:a}),this.appPeersManager.isChannel(n)||(e=Math.max(e,a.top_message||0));let i=t.get(n);i||t.set(n,i={}),"forumTopic"===a._?(null!==(s=i.topics)&&void 0!==s?s:i.topics=new Map).set(a.id,a):i.dialog=a};for(const[e,t]of this.newDialogsToHandle){const s="dialog"in t,{dialog:n,topics:i}=t;s&&(n?this.dialogsStorage.getDialogOnly(e)&&a(n):this.reloadConversation(e.toPeerId())),i&&(null==i||i.forEach(((t,s)=>{t?this.dialogsStorage.getForumTopic(e,s)&&a(t):this.dialogsStorage.getForumTopicById(e,s)})))}0!==e&&this.incrementMaxSeenId(e),this.rootScope.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle.clear()},this.handleNotifications=()=>{E.Z.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=void 0;for(const e in this.notificationsToHandle){const[t,a]=e.split("_"),s=this.notificationsToHandle[e];this.getNotifyPeerSettings(t.toPeerId(),a?+a:void 0).then((({muted:e,peerTypeNotifySettings:t})=>{const a=s.topMessage;e&&!a.pFlags.mentioned||!a.pFlags.unread||a.pFlags.unread&&this.notifyAboutMessage(a,{fwdCount:s.fwdCount,peerTypeNotifySettings:t})}))}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id;if(!this.pendingByRandomId[t])return;const a=(0,pe.Z)(e.id);this.pendingByMessageId[a]=t},this.onUpdateNewMessage=e=>{var t,a,s,n;const i=e.message,r=this.getMessagePeer(i),p=this.getHistoryMessagesStorage(r),d="updateNewDiscussionMessage"===e._;this.saveMessages([i],{storage:this.createMessageStorage(r,"history")});const f=this.appPeersManager.isForum(r),c=this.getThreadKey(i),l=c?+c.split("_")[1]:void 0,m=this.dialogsStorage.getDialogOrTopic(r,d?l:void 0);if((!m||this.reloadConversationsPeers.has(r))&&!d){let t=!0;if(r.isAnyChat()&&(t=this.appChatsManager.isInChat(r.toChatId())),t)return void this.handleNewUpdateAfterReload(r,e)}if(l&&!d){const e=null===(t=this.threadsStorage[r])||void 0===t?void 0:t[l],a={_:"updateNewDiscussionMessage",message:i};this.appChatsManager.isForum(r.toChatId())&&!this.dialogsStorage.getForumTopic(r,l)?this.handleNewUpdateAfterReload(r,a,l):e&&this.onUpdateNewMessage(a)}if("messageService"===i._){const{action:e}=i;if("messageActionPaymentSent"===e._&&i.reply_to&&this.rootScope.dispatchEvent("payment_sent",{peerId:i.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(i.reply_to.reply_to_peer_id):i.peerId,mid:i.reply_to_mid,receiptMessage:i}),"messageActionTopicEdit"===e._&&!d){const t=this.dialogsStorage.getForumTopic(r,l);if(t){const a=(0,ve.Z)(t);void 0!==e.title&&(t.title=e.title),void 0!==e.closed&&$t(t.pFlags,"closed",e.closed),void 0!==e.hidden&&$t(t.pFlags,"hidden",e.hidden),void 0!==e.icon_emoji_id&&(t.icon_emoji_id=e.icon_emoji_id),this.scheduleHandleNewDialogs(r,t),this.dialogsStorage.processTopicUpdate(t,a)}else this.dialogsStorage.getForumTopicById(r,l)}}this.saveMessages([i],{storage:p}),this.checkPendingMessage(i);const g=this.getHistoryStorage(r,d?l:void 0);d||this.updateMessageRepliesIfNeeded(i);const h=e.ignoreExisting;if(g.history.findSlice(i.mid)){if(!h)return!1}else{const e=g.history.first;if(e.isEnd(se.D.Bottom)){let t=0;for(const a=e.length;te[t]);++t);e.splice(t,0,i.mid)}else g.history.unshift(i.mid);null!==g.count&&++g.count}(!g.maxId||i.mid>g.maxId)&&(g.maxId=i.mid),this.mergeReplyKeyboard(g,i)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:r});const u=i.fromId;if(u.isUser()&&!i.pFlags.out&&i.from_id){this.appUsersManager.forceUserOnline(u,i.date);const e={_:"sendMessageCancelAction"};let t;t=r.isUser()?{_:"updateUserTyping",action:e,user_id:u}:this.appPeersManager.isChannel(r)?{_:"updateChannelUserTyping",action:e,channel_id:r.toChatId(),from_id:this.appPeersManager.getOutputPeer(u),top_msg_id:l?(0,oe.Z)(l):void 0}:{_:"updateChatUserTyping",action:e,chat_id:r.toChatId(),from_id:this.appPeersManager.getOutputPeer(u)},this.apiUpdatesManager.processLocalUpdate(t)}this.handleNewMessage(i);const y="forumTopic"===(null==m?void 0:m._);if(d&&!y||!m)return;const _=!i.pFlags.out&&i.pFlags.unread;if(_&&i.mid>m.top_message){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(m);++m.unread_count,i.pFlags.mentioned&&(++m.unread_mentions_count,this.modifyCachedMentions(r,i.mid,!0,y?l:void 0)),e()}if(i.mid>=m.top_message&&this.setDialogTopMessage(i,m),(!d&&!f||y)&&_){const e=c||r,t=null!==(a=(n=this.notificationsToHandle)[e])&&void 0!==a?a:n[e]={fwdCount:0,fromId:o.NM};t.fromId!==u&&(t.fromId=u,t.fwdCount=0),i.fwd_from&&++t.fwdCount,t.topMessage=i,null!==(s=this.notificationsHandlePromise)&&void 0!==s||(this.notificationsHandlePromise=E.Z.setTimeout(this.handleNotifications,0))}},this.onUpdateMessageReactions=e=>{const{peer:t,msg_id:a,reactions:s}=e,n=(0,pe.Z)(a),i=this.appPeersManager.getPeerId(t),r=this.getMessageByPeer(i,n);if("message"!==(null==r?void 0:r._))return;const o=null==s?void 0:s.recent_reactions;if((null==o?void 0:o.length)&&r.pFlags.out){const e=o[o.length-1],t=r.reactions,a=null==t?void 0:t.recent_reactions;this.appPeersManager.getPeerId(e.peer_id)===this.appPeersManager.peerId||a&&!(a.length<=o.length)||a&&(0,Y.Z)(e,a[a.length-1])||this.getNotifyPeerSettings(i).then((({muted:t,peerTypeNotifySettings:a})=>{a.show_previews&&this.notifyAboutMessage(r,{peerReaction:e,peerTypeNotifySettings:a})}))}const p=r.peerId+"_"+r.mid;this.pushBatchUpdate("messages_reactions",this.batchUpdateReactions,p,(()=>(0,ve.Z)(r.reactions))),r.reactions=s,e.local||this.setDialogToStateIfMessageIsTop(r)},this.onUpdateDialogUnreadMark=e=>{const t=this.appPeersManager.getPeerId(e.peer.peer),a=this.getDialogOnly(t);if(a){const s=this.dialogsStorage.prepareDialogUnreadCountModifying(a);e.pFlags.unread?a.pFlags.unread_mark=!0:delete a.pFlags.unread_mark,s(),this.dialogsStorage.setDialogToState(a),this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[t,{dialog:a}]]))}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{var t,a;const s=e.message,n=this.getMessagePeer(s),i=(0,pe.Z)(s.id),r=this.getHistoryMessagesStorage(n);if(!r.has(i))return;const o=this.getMessageFromStorage(r,i);this.saveMessages([s],{storage:r});const p=this.getMessageFromStorage(r,i);this.handleEditedMessage(o,p,r);const d=this.getDialogOnly(n),f=(null==d?void 0:d.top_message)===i;if(s.clear_history)f&&this.rootScope.dispatchEvent("dialog_flush",{peerId:n,dialog:d});else{let e=!0;if("message"===(null==o?void 0:o._)&&!(0,Y.Z)(o.reactions,p.reactions)){const t=p.reactions;p.reactions=o.reactions,this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:this.appPeersManager.getOutputPeer(n),msg_id:s.id,reactions:t}),e=!1}e&&this.rootScope.dispatchEvent("message_edit",{storageKey:r.key,peerId:n,mid:i,message:s}),f&&this.dialogsStorage.setDialogToState(d);const c=new Map,l=()=>{let e=c.get(n);return e||c.set(n,e={}),e};(f||s.grouped_id)&&d&&(l().dialog=d);const m=this.getThreadKey(s);if(m){const e=+m.split("_")[1],s=this.dialogsStorage.getForumTopic(n,e);s&&(null!==(t=(a=l()).topics)&&void 0!==t?t:a.topics=new Map).set(e,s)}c.size&&this.rootScope.dispatchEvent("dialogs_multiupdate",c)}},this.onUpdateReadHistory=e=>{const t=e.channel_id,a=(0,pe.Z)(e.max_id||e.read_max_id),s=(0,pe.Z)(e.top_msg_id),n=t?t.toPeerId(!0):this.appPeersManager.getPeerId(e.peer),i="updateReadHistoryOutbox"===e._||"updateReadChannelOutbox"===e._||"updateReadChannelDiscussionOutbox"===e._||void 0,r=!!t&&this.appChatsManager.isForum(t),o=this.getHistoryMessagesStorage(n),p=(0,Rt.Z)(o,"desc"),d=s&&r?this.dialogsStorage.getForumTopic(n,s):this.getDialogOnly(n),f=e.still_unread_count;let c=0,l=0,m=!1;const g=this.getHistoryStorage(n,s);if(n.isUser()&&i&&this.appUsersManager.forceUserOnline(n.toUserId()),s){const e=this.threadsToReplies[n+"_"+s];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}const h=d&&this.dialogsStorage.prepareDialogUnreadCountModifying(d),u=this.getReadMaxIdIfUnread(n,s);for(let e=0,t=p.length;ea)continue;const g=o.get(t);if(g.pFlags.out!==i)continue;const h=(0,Qt.Z)(g,r);if(!s||h===s){if(!(g.pFlags.unread||u&&u=d.top_message||!u?e=0:c&&d.top_message>a&&(e=c),void 0!==e&&(d.unread_count=e),(l<0||!d.unread_count)&&(d.unread_mentions_count=0)}null==h||h(),this.dialogsStorage.processDialogForFilters(d),this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:d}),this.dialogsStorage.setDialogToState(d),m||void 0!==f||i||!d.unread_count||("forumTopic"===d._?this.dialogsStorage.getForumTopicById(n,s):this.reloadConversation(n))}if(m&&this.rootScope.dispatchEvent("messages_read"),!s&&t){const e=n+"_";for(const t in this.threadsToReplies)if(0===t.indexOf(e)){const[e,a]=this.threadsToReplies[t].split("_");this.rootScope.dispatchEvent("replies_updated",this.getMessageByPeer(e.toPeerId(),+a))}}},this.onUpdateReadMessagesContents=e=>{const t=e.channel_id,a=e.top_msg_id,s=a?(0,pe.Z)(a):void 0,n=e.messages.map((e=>(0,pe.Z)(e))),i=t?t.toPeerId(!0):this.findPeerIdByMids(n);for(let e=0,t=n.length;e{const t=e.channel_id.toPeerId(!0),a=this.getHistoryStorage(t).history.slice,s=(0,pe.Z)(e.available_min_id),n=a.filter((e=>e<=s));e.messages=n,this.onUpdateDeleteMessages(e)},this.onUpdateDeleteMessages=e=>{var t;const a=e.channel_id,s=e.messages.map((e=>(0,pe.Z)(e))),n=a?a.toPeerId(!0):this.findPeerIdByMids(s);if(!n)return;this.apiManager.clearCache("messages.getSearchCounters",(e=>this.appPeersManager.getPeerId(e.peer)===n));const i=new Set,r=new Map;for(const e of s){const a=this.getMessageByPeer(n,e),s=this.getThreadKey(a);if(!s)continue;const o=+s.split("_")[1];if((null===(t=this.threadsStorage[n])||void 0===t?void 0:t[o])&&(i.add(s),!r.has(o))){const e=this.dialogsStorage.getForumTopic(n,o);e&&r.set(o,e)}}const o=this.handleDeletedMessages(n,this.getHistoryMessagesStorage(n),s),p=Array.from(i).map((e=>{const[t,a]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+a)}));[this.getHistoryStorage(n),...p].forEach((e=>{for(const t of o.msgs)e.history.delete(t);o.count&&e.count&&(e.count=Math.max(0,e.count-o.count))})),this.rootScope.dispatchEvent("history_delete",{peerId:n,msgs:o.msgs});const d=[...r.values()],f=this.getDialogOnly(n);f&&d.unshift(f),d.forEach((e=>{const t="forumTopic"===e._,a=o.unreadMentions||o.unread,s=a&&this.dialogsStorage.prepareDialogUnreadCountModifying(e);if(o.unread&&(e.unread_count=Math.max(0,e.unread_count-o.unread)),o.unreadMentions&&(e.unread_mentions_count=e.unread_count?Math.max(0,e.unread_mentions_count-o.unreadMentions):0),a&&(s(),t||this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:e})),o.msgs.has(e.top_message)){const a=this.getHistoryStorage(e.peerId,t?e.id:void 0).history.first;if(a.isEnd(se.D.Bottom)&&a.length){const t=a[0],s=this.getMessageByPeer(n,t);this.setDialogTopMessage(s,e)}else t?this.dialogsStorage.getForumTopicById(n,e.id):this.reloadConversation(n)}}))},this.onUpdateChannel=e=>{const t=e.channel_id,a=t.toPeerId(!0),s=this.appChatsManager.getChat(t),n=this.appChatsManager.isInChat(t);(!!(0,Jt.Z)(s)[0]||!s.pFlags.left)!=(void 0!==this.historiesStorage[a])&&(delete this.historiesStorage[a],this.rootScope.dispatchEvent("history_forbidden",a)),!!this.getDialogOnly(a)!==n&&(n?this.reloadConversation(a):this.dialogsStorage.dropDialogOnDeletion(a)),this.rootScope.dispatchEvent("channel_update",t)},this.onUpdateChannelReload=e=>{const t=e.channel_id.toPeerId(!0);this.flushStoragesByPeerId(t),Promise.all([this.reloadConversation(t)]).then((()=>{this.rootScope.dispatchEvent("history_reload",t)}))},this.onUpdateChannelMessageViews=e=>{var t;const a=e.views,s=null!==(t=e.peerId)&&void 0!==t?t:e.channel_id.toPeerId(!0),n=(0,pe.Z)(e.id),i=this.getMessageByPeer(s,n);void 0!==(null==i?void 0:i.views)&&i.views{var t;if(null===(t=e.pFlags)||void 0===t?void 0:t.popup)return void this.rootScope.dispatchEvent("service_notification",e);const a=o.yF,s=a,n=this.generateTempMessageId(s),i={_:"message",id:n,from_id:this.appPeersManager.getOutputPeer(a),peer_id:this.appPeersManager.getOutputPeer(s),pFlags:{unread:!0},date:(e.inbox_date||(0,te.Z)(!0))+this.timeManager.getServerTimeOffset(),message:e.message,media:e.media,entities:e.entities};this.appUsersManager.hasUser(a)||this.appUsersManager.saveApiUsers([{_:"user",id:a,pFlags:{verified:!0},access_hash:"0",first_name:"Telegram",phone:"42777"}]),this.saveMessages([i],{isOutgoing:!0}),e.inbox_date&&(this.pendingTopMsgs[s]=n,this.onUpdateNewMessage({_:"updateNewMessage",message:i,pts:void 0,pts_count:void 0}))},this.onUpdatePinnedMessages=e=>{const t="updatePinnedChannelMessages"===e._?e.channel_id:void 0,a=t?t.toPeerId(!0):this.appPeersManager.getPeerId(e.peer),s=e.messages.map((e=>(0,pe.Z)(e))),n=this.getHistoryMessagesStorage(a),i=s.filter((e=>!n.has(e)));(i.length?Promise.all(i.map((e=>this.reloadMessages(a,e)))):Promise.resolve()).finally((()=>{var t;const i=null===(t=e.pFlags)||void 0===t?void 0:t.pinned;if(i)for(const e of s)n.get(e).pFlags.pinned=!0;else for(const e of s)delete n.get(e).pFlags.pinned;delete this.pinnedMessages[this.getPinnedMessagesKey(a)],this.appStateManager.getState().then((e=>{delete e.hiddenPinnedMessages[a],this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:a,mids:s,pinned:i})}))}))},this.onUpdateNotifySettings=e=>{const{peer:t,notify_settings:a}=e,s="notifyForumTopic"===t._;if("notifyPeer"!==t._&&!s)return;const n=this.appPeersManager.getPeerId(t.peer),i=this.dialogsStorage.getDialogOrTopic(n,s?(0,pe.Z)(t.top_msg_id):void 0);i&&(i.notify_settings=a,this.rootScope.dispatchEvent("dialog_notify_settings",i),this.dialogsStorage.setDialogToState(i))},this.onUpdateNewScheduledMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=this.scheduledMessagesStorage[a];if(!s)return;const n=(0,pe.Z)(t.id),i=this.getMessageFromStorage(s,n);this.saveMessages([t],{storage:s,isScheduled:!0});const r=this.getMessageFromStorage(s,n);i?(this.handleEditedMessage(i,r,s),this.rootScope.dispatchEvent("message_edit",{storageKey:s.key,peerId:a,mid:t.mid,message:t})):this.checkPendingMessage(t)||this.rootScope.dispatchEvent("scheduled_new",t)},this.onUpdateDeleteScheduledMessages=e=>{const t=this.appPeersManager.getPeerId(e.peer),a=this.scheduledMessagesStorage[t];if(a){const s=e.messages.map((e=>(0,pe.Z)(e)));this.handleDeletedMessages(t,a,s),this.rootScope.dispatchEvent("scheduled_delete",{peerId:t,mids:s})}},this.onUpdateMessageExtendedMedia=e=>{var t;const a=this.appPeersManager.getPeerId(e.peer),s=(0,pe.Z)(e.msg_id),n=this.getHistoryMessagesStorage(a);if(!n.has(s))return;const i=this.getMessageFromStorage(n,s),r=i.media;"messageExtendedMedia"!==(null===(t=r.extended_media)||void 0===t?void 0:t._)&&(r.extended_media=e.extended_media,this.onUpdateEditMessage({_:"updateEditMessage",message:i,pts:0,pts_count:0}))},this.batchUpdateViews=e=>{const t=[],a=this.getMessagesFromMap(e);for(const[e]of a)t.push({peerId:e.peerId,mid:e.mid,views:e.views});return t},this.batchUpdateReactions=e=>{var t,a,s;const n=[],i=this.getMessagesFromMap(e);for(const[e,r]of i){const i=null!==(a=null===(t=e.reactions)||void 0===t?void 0:t.results)&&void 0!==a?a:[],o=null!==(s=null==r?void 0:r.results)&&void 0!==s?s:[],p=i.filter((t=>{const a=o.find((e=>(0,Kt.Z)(e.reaction,t.reaction)));return e.pFlags.out&&(!a||t.count>a.count)||void 0!==t.chosen_order&&(!a||void 0===a.chosen_order)}));n.push({message:e,changedResults:p})}return n}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateMessageID:this.onUpdateMessageId,updateNewDiscussionMessage:this.onUpdateNewMessage,updateNewMessage:this.onUpdateNewMessage,updateNewChannelMessage:this.onUpdateNewMessage,updateDialogUnreadMark:this.onUpdateDialogUnreadMark,updateEditMessage:this.onUpdateEditMessage,updateEditChannelMessage:this.onUpdateEditMessage,updateMessageReactions:this.onUpdateMessageReactions,updateReadChannelDiscussionInbox:this.onUpdateReadHistory,updateReadChannelDiscussionOutbox:this.onUpdateReadHistory,updateReadHistoryInbox:this.onUpdateReadHistory,updateReadHistoryOutbox:this.onUpdateReadHistory,updateReadChannelInbox:this.onUpdateReadHistory,updateReadChannelOutbox:this.onUpdateReadHistory,updateChannelReadMessagesContents:this.onUpdateReadMessagesContents,updateReadMessagesContents:this.onUpdateReadMessagesContents,updateChannelAvailableMessages:this.onUpdateChannelAvailableMessages,updateDeleteMessages:this.onUpdateDeleteMessages,updateDeleteChannelMessages:this.onUpdateDeleteMessages,updateChannel:this.onUpdateChannel,updateChannelReload:this.onUpdateChannelReload,updateChannelMessageViews:this.onUpdateChannelMessageViews,updateServiceNotification:this.onUpdateServiceNotification,updatePinnedMessages:this.onUpdatePinnedMessages,updatePinnedChannelMessages:this.onUpdatePinnedMessages,updateNotifySettings:this.onUpdateNotifySettings,updateNewScheduledMessage:this.onUpdateNewScheduledMessage,updateDeleteScheduledMessages:this.onUpdateDeleteScheduledMessages,updateMessageExtendedMedia:this.onUpdateMessageExtendedMedia}),this.rootScope.addEventListener("notify_peer_type_settings",(({key:e,settings:t})=>{let a;a="notifyUsers"===e?e=>e.peerId.isUser():"notifyBroadcasts"===e?e=>this.appPeersManager.isBroadcast(e.peerId):e=>this.appPeersManager.isAnyGroup(e.peerId),this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1)).filter(a).forEach((e=>{this.rootScope.dispatchEvent("dialog_notify_settings",e)}))})),this.rootScope.addEventListener("webpage_updated",(({id:e,msgs:t})=>{t.forEach((({peerId:t,mid:a,isScheduled:s})=>{const n=s?this.getScheduledMessagesStorage(t):this.getHistoryMessagesStorage(t),i=this.getMessageFromStorage(n,a);i&&(i.media={_:"messageMediaWebPage",webpage:this.appWebPagesManager.getCachedWebPage(e)},this.rootScope.dispatchEvent("message_edit",{storageKey:n.key,peerId:t,mid:a,message:i}))}))})),this.rootScope.addEventListener("draft_updated",(({peerId:e,threadId:t,draft:a})=>{const s=this.dialogsStorage.getDialogOrTopic(e,t);if(s){s.draft=a;let t=!1;a||(0,oe.Z)(s.top_message)?(this.dialogsStorage.generateIndexForDialog(s),this.dialogsStorage.pushDialog({dialog:s})):(this.dialogsStorage.dropDialog(e),t=!0),this.rootScope.dispatchEvent("dialog_draft",{peerId:e,dialog:s,drop:t,draft:a})}else if(t){const a=this.appChatsManager.getChat(e.toChatId());a?a.pFlags.forum&&this.dialogsStorage.getForumTopicById(e,t):this.reloadConversation(e)}else this.reloadConversation(e)})),this.rootScope.addEventListener("poll_update",(({poll:e})=>{const t=this.appPollsManager.pollToMessages[e.id];if(t)for(const e of t){const[t,a]=e.split("_"),s=this.getMessageByPeer(t.toPeerId(),+a);s&&this.setDialogToStateIfMessageIsTop(s)}})),this.rootScope.addEventListener("chat_toggle_forum",(({chatId:e,enabled:t})=>{const a=e.toPeerId(!0);if(!t){delete this.threadsStorage[a];for(const e in this.pinnedMessages)+e===a&&e.startsWith(a+"_")&&delete this.pinnedMessages[e]}})),this.batchUpdatesDebounced=(0,Bt.Z)((()=>{for(const e in this.batchUpdates){const t=this.batchUpdates[e];delete this.batchUpdates[e];const a=t.callback(t.batch);!a||a instanceof Array&&!a.length||rootScope.dispatchEvent(e,a)}}),33,!1,!0),this.appStateManager.getState().then((e=>{e.maxSeenMsgId&&(this.maxSeenId=e.maxSeenMsgId)}))}getInputEntities(e){const t=(0,ve.Z)(e);return t.forEach((e=>{"messageEntityMentionName"===e._&&(e._="inputMessageEntityMentionName",e.user_id=this.appUsersManager.getUserInput(e.user_id))})),t}invokeAfterMessageIsSent(e,t,a){var s,n,i;const r=null!==(s=(i=this.tempFinalizeCallbacks)[e])&&void 0!==s?s:i[e]={},o=null!==(n=r[t])&&void 0!==n?n:r[t]={deferred:(0,v.Z)()};return o.callback=a,o.deferred}editMessage(e,t,a={}){const{mid:s,peerId:n}=e;if(e.pFlags.is_outgoing)return this.invokeAfterMessageIsSent(s,"edit",(e=>this.editMessage(e,t,a)));const i=a.entities||[];t&&(t=(0,ke.Z)(t,i));const r=a.scheduleDate||(e.pFlags.is_scheduled?e.date:void 0);return this.apiManager.invokeApi("messages.editMessage",{peer:this.appPeersManager.getInputPeerById(n),id:e.id,message:t,media:a.newMedia,entities:i.length?this.getInputEntities(i):void 0,no_webpage:a.noWebPage,schedule_date:r}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{if(this.log.error("editMessage error:",e),!e||"MESSAGE_NOT_MODIFIED"!==e.type)return e&&"MESSAGE_EMPTY"===e.type&&(e.handled=!0),Promise.reject(e);e.handled=!0}))}sendText(e,t,a={}){var s,n;return Yt(this,void 0,void 0,(function*(){if(!t.trim())return;null!==(s=a.entities)&&void 0!==s||(a.entities=[]),a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId);const i=(yield this.apiManager.getConfig()).message_length_max,r=xt(t,i);t=r[0],r.length>1&&("webPage"!==(null===(n=a.webPage)||void 0===n?void 0:n._)||t.includes(a.webPage.url)||delete a.webPage),e=this.appPeersManager.getPeerMigratedTo(e)||e;const o=a.entities;a.viaBotId||(t=(0,ke.Z)(t,o));let p=this.getInputEntities(o);p.length||(p=void 0);const d=this.generateOutgoingMessage(e,a);d.entities=o,d.message=t;const f=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0,c=this.appPeersManager.isChannel(e);a.webPage&&(d.media={_:"messageMediaWebPage",webpage:a.webPage});const l=e=>{this.onMessagesSendError([d],e),this.rootScope.dispatchEvent("messages_pending")};d.send=()=>{l();const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const n=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let i;return i=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.getInputPeerById(e),random_id:d.random_id,reply_to_msg_id:f||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,send_as:n},s):this.apiManager.invokeApiAfter("messages.sendMessage",{no_webpage:a.noWebPage,peer:this.appPeersManager.getInputPeerById(e),message:t,random_id:d.random_id,reply_to_msg_id:f||void 0,entities:p,clear_draft:a.clearDraft,schedule_date:a.scheduleDate||void 0,silent:a.silent,send_as:n,update_stickersets_order:ea},s),this.pendingAfterMsgs[e]=s,i.then((e=>{if("updateShortSentMessage"===e._){const t=d.promise;delete d.promise;const s=(0,ve.Z)(d);(0,ge.Z)(d,["promise"]),d.promise=t,s.date=e.date,s.id=e.id,s.media=e.media,s.entities=e.entities,this.wrapMessageEntities(s),e.pFlags.out&&(s.pFlags.out=!0),e={_:"updates",users:[],chats:[],seq:0,date:void 0,updates:[{_:"updateMessageID",random_id:d.random_id,id:s.id},{_:a.scheduleDate?"updateNewScheduledMessage":c?"updateNewChannelMessage":"updateNewMessage",message:s,pts:e.pts,pts_count:e.pts_count}]}}else e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)}));this.apiUpdatesManager.processUpdateMessage(e),d.promise.resolve()}),(e=>{throw l(e),d.promise.reject(e),e})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(d,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0});const m=[d.promise];for(let t=1;t=0){r="audio",p="audio."+("ogg"===d.split("/")[1]?"ogg":"mp3"),P="sendMessageUploadAudioAction",t.isVoiceMessage&&(r="voice",s.pFlags.media_unread=!0);const e={_:"documentAttributeAudio",pFlags:{voice:t.isVoiceMessage||void 0},waveform:t.waveform,duration:t.duration||0};g.push(e)}else if(t.isMedia)if(h){r="photo",p="photo."+d.split("/")[1],P="sendMessageUploadPhotoAction";const e={_:"photoSize",w:t.width,h:t.height,type:o.Pt,location:null,size:a.size};y={_:"photo",id:""+s.id,sizes:[e],w:t.width,h:t.height},u&&y.sizes.unshift(u);const n=this.thumbsStorage.getCacheContext(y,e.type);n.downloaded=a.size,n.url=t.objectURL||"",y=this.appPhotosManager.savePhoto(y)}else if(i().VIDEO_MIME_TYPES_SUPPORTED.has(d)){r="video",p="video.mp4",P="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:t.isRoundMessage||void 0,supports_streaming:!0},duration:t.duration,w:t.width,h:t.height};g.push(e),t.noSound&&a.size>10240&&a.size<10485760&&g.push({_:"documentAttributeAnimated"})}else r="document",p="document."+d.split("/")[1],P="sendMessageUploadDocumentAction";else r="document",p="document."+d.split("/")[1],P="sendMessageUploadDocumentAction";if(g.push({_:"documentAttributeFilename",file_name:f||p}),-1!==["document","video","audio","voice"].indexOf(r)&&!c){const e=[];if(_={_:"document",id:""+s.id,duration:t.duration,attributes:g,w:t.width,h:t.height,thumbs:e,mime_type:d,size:a.size},t.objectURL){const e=this.thumbsStorage.getCacheContext(_);e.downloaded=a.size,e.url=t.objectURL}let n;if(h)g.push({_:"documentAttributeImageSize",w:t.width,h:t.height}),n={_:"photoSize",w:t.width,h:t.height,type:o.Pt,size:a.size};else if("video"===r&&t.thumb){n={_:"photoSize",w:t.thumb.size.width,h:t.thumb.size.height,type:"local-thumb",size:t.thumb.blob.size};const e=this.thumbsStorage.getCacheContext(_,n.type);e.downloaded=n.size,e.url=t.thumb.url}n&&e.push(n),u&&e.unshift(u),_=this.appDocsManager.saveDoc(_)}this.log("sendFile",r,p,a.type,t);const b=(0,v.Z)(),M=c?void 0:{_:y?"messageMediaPhoto":"messageMediaDocument",pFlags:{},photo:y,document:_};M&&((0,ge.Z)(M,["promise"]),M.promise=b,t.spoiler&&(M.pFlags.spoiler=!0)),s.entities=m,s.message=l,s.media=c?{_:"messageMediaDocument",pFlags:{},document:a}:M;const I=c?void 0:(0,Zt.Z)(a);s.uploadingFileName=I,I&&(this.uploadFilePromises[I]=b);const S=e=>{this.onMessagesSendError([s],e),this.rootScope.dispatchEvent("messages_pending")};let C=!1,w=null;s.send=()=>{if(c){const e={_:"inputMediaDocument",id:zt(a)};b.resolve(e)}else if(a instanceof File||a instanceof Blob){const n=()=>{var n;let i;return C&&!s.error||(C=!1,w=this.apiFileManager.upload({file:a,fileName:I}),w.catch((a=>{C||(this.log("cancelling upload",M),this.cancelPendingMessage(s.random_id),this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId),b.reject(a))})),w.addNotifyListener((a=>{const s=Math.max(1,Math.floor(100*a.done/a.total));P&&this.setTyping(e,{_:P,progress:0|s},void 0,t.threadId),b.notifyAll(a)})),b.notifyAll({done:0,total:a.size})),"video"===r&&t.objectURL&&(null===(n=t.thumb)||void 0===n?void 0:n.blob)&&(i=this.apiFileManager.upload({file:t.thumb.blob})),w&&w.then((e=>Yt(this,void 0,void 0,(function*(){let a;if(e.name=p,C=!0,a="photo"===r?{_:"inputMediaUploadedPhoto",file:e,pFlags:{spoiler:t.spoiler||void 0}}:{_:"inputMediaUploadedDocument",file:e,mime_type:d,pFlags:{force_file:"sendMessageUploadDocumentAction"===P||void 0,spoiler:t.spoiler||void 0},attributes:g},i)try{const e=yield i;a.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}b.resolve(a)}))),(e=>{throw S(e),e})),b};t.isGroupedItem?n():this.sendSmthLazyLoadQueue.push({load:n})}return b},this.beforeMessageSending(s,{isGroupedItem:t.isGroupedItem,isScheduled:!!t.scheduleDate||void 0,threadId:t.threadId,clearDraft:t.clearDraft,processAfter:t.processAfter}),t.isGroupedItem||(b.then((a=>(this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId),this.apiManager.invokeApi("messages.sendMedia",{background:t.background,peer:this.appPeersManager.getInputPeerById(e),media:a,message:l,random_id:s.random_id,reply_to_msg_id:n,schedule_date:t.scheduleDate,silent:t.silent,entities:m,clear_draft:t.clearDraft,send_as:t.sendAsPeerId?this.appPeersManager.getInputPeerById(t.sendAsPeerId):void 0}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{if("photo"===r&&400===e.code&&("PHOTO_INVALID_DIMENSIONS"===e.type||"PHOTO_SAVE_FILE_INVALID"===e.type))return e.handled=!0,r="document",void s.send();throw S(e),e}))))),b.then(s.promise.resolve,s.promise.reject));const k={message:s};return(0,ge.Z)(k,["promise"]),k.promise=b,k}sendAlbum(e,t){return Yt(this,void 0,void 0,(function*(){if(t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId),1===t.sendFileDetails.length)return this.sendFile(e,Object.assign(Object.assign({},t),t.sendFileDetails[0]));e=this.appPeersManager.getPeerMigratedTo(e)||e;const a=t.replyToMsgId?(0,oe.Z)(t.replyToMsgId):void 0;let s=t.caption||"",n=t.entities||[];s&&(s=(0,ke.Z)(s,n)),this.log("sendAlbum",t);const i=""+ ++this.groupedTempId,r=[],o=e=>{r.push(e)},p=t.sendFileDetails.map(((r,p)=>{const d=Object.assign({isGroupedItem:!0,isMedia:t.isMedia,scheduleDate:t.scheduleDate,silent:t.silent,replyToMsgId:a,threadId:t.threadId,sendAsPeerId:t.sendAsPeerId,groupId:i,processAfter:o},r);return 0===p&&(d.caption=s,d.entities=n),this.sendFile(e,d).message}));t.clearDraft&&r.push((()=>{this.appDraftsManager.clearDraft(e,t.threadId)})),r.forEach((e=>{e()}));const d=(e,t)=>{this.onMessagesSendError([e],t),this.rootScope.dispatchEvent("messages_pending")},f=this.appPeersManager.getInputPeerById(e),c=s=>{this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId);const n=(0,v.Z)();return this.sendSmthLazyLoadQueue.push({load:()=>this.apiManager.invokeApi("messages.sendMultiMedia",{peer:f,multi_media:s,reply_to_msg_id:a,schedule_date:t.scheduleDate,silent:t.silent,clear_draft:t.clearDraft,send_as:t.sendAsPeerId?this.appPeersManager.getInputPeerById(t.sendAsPeerId):void 0,update_stickersets_order:ea}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),n.resolve()}),(e=>{p.forEach((t=>d(t,e))),n.reject(e)}))}),n},l=p.map((e=>e.send().then((e=>Promise.all([e,this.apiManager.invokeApi("messages.uploadMedia",{peer:f,media:e})]))).then((([t,a])=>{let i;if("messageMediaPhoto"===a._){const e=this.appPhotosManager.savePhoto(a.photo);i=wt(e)}else if("messageMediaDocument"===a._){const e=this.appDocsManager.saveDoc(a.document);i=At(e)}["pFlags","ttl_seconds"].forEach((e=>{var a;i[e]=null!==(a=t[e])&&void 0!==a?a:i[e]}));const r={_:"inputSingleMedia",media:i,random_id:e.random_id,message:s,entities:n};return s&&(s="",n=[]),r})).catch((t=>{throw this.log.error("sendAlbum upload item error:",t,e),d(e,t),t}))));return Promise.all(l).then((e=>c(e.filter(Boolean))))}))}sendContact(e,t){return this.sendOther(e,this.appUsersManager.getContactMediaInput(t))}sendOther(e,t,a={}){var s;e=this.appPeersManager.getPeerMigratedTo(e)||e;const n=this.generateOutgoingMessage(e,a),i=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0;let r;switch(t._){case"inputMediaPoll":{const e=""+n.id;t.poll.id=e,this.appPollsManager.savePoll(t.poll,{_:"pollResults",flags:4,total_voters:0,pFlags:{},recent_voters:[]});const{poll:a,results:s}=this.appPollsManager.getPoll(e);r={_:"messageMediaPoll",poll:a,results:s};break}case"inputMediaPhoto":r={_:"messageMediaPhoto",photo:this.appPhotosManager.getPhoto(t.id.id)};break;case"inputMediaDocument":r={_:"messageMediaDocument",document:this.appDocsManager.getDoc(t.id.id)};break;case"inputMediaContact":r={_:"messageMediaContact",phone_number:t.phone_number,first_name:t.first_name,last_name:t.last_name,user_id:null!==(s=t.user_id)&&void 0!==s?s:"0",vcard:t.vcard};break;case"inputMediaGeoPoint":r={_:"messageMediaGeo",geo:a.geoPoint};break;case"inputMediaVenue":r={_:"messageMediaVenue",geo:a.geoPoint,title:t.title,address:t.address,provider:t.provider,venue_id:t.venue_id,venue_type:t.venue_type};break;case"messageMediaPending":r=t.messageMedia}n.media=r;const o=e=>{this.onMessagesSendError([n],e),this.rootScope.dispatchEvent("messages_pending")};return n.send=()=>{const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const r=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let p;return p=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.getInputPeerById(e),random_id:n.random_id,reply_to_msg_id:i||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent,send_as:r},s):this.apiManager.invokeApiAfter("messages.sendMedia",{peer:this.appPeersManager.getInputPeerById(e),media:t,random_id:n.random_id,reply_to_msg_id:i||void 0,message:"",clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent,send_as:r,update_stickersets_order:ea},s),this.pendingAfterMsgs[e]=s,p.then((e=>{e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)})),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{throw o(e),e})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(n,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0}),n.promise}beforeMessageSending(e,t={}){const a=e.id,s=this.getMessagePeer(e),n=t.isScheduled?this.getScheduledMessagesStorage(s):this.getHistoryMessagesStorage(s);e.storageKey=n.key;const i=[];if(t.isScheduled)this.saveMessages([e],{storage:n,isScheduled:!0,isOutgoing:!0}),i.push((()=>{this.rootScope.dispatchEvent("scheduled_new",e)}));else{const r=[this.getHistoryStorage(s),t.threadId?this.getHistoryStorage(s,t.threadId):void 0];for(const e of r)e&&e.history.unshift(a);if(this.saveMessages([e],{storage:n,isOutgoing:!0}),this.setDialogTopMessage(e),t.threadId){const a=this.dialogsStorage.getForumTopic(s,t.threadId);a&&this.setDialogTopMessage(e,a)}i.push((()=>{this.rootScope.dispatchEvent("history_append",{storageKey:n.key,message:e})}))}const r=this.pendingByRandomId[e.random_id]={peerId:s,tempId:a,threadId:t.threadId,storage:n,sequential:t.sequential};return this.pendingTopMsgs[s]=a,!t.isGroupedItem&&e.send&&i.push((()=>{t.clearDraft&&this.appDraftsManager.clearDraft(s,t.threadId),e.send()})),i.length&&(t.processAfter||Xt)((()=>{for(const e of i)e()})),r}generateOutgoingMessage(e,t){let a;t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId);const s=this.appPeersManager.isBroadcast(e);if(s&&this.appPeersManager.getPeer(e).pFlags.signatures){const e=this.appUsersManager.getSelf();a=e.first_name+(e.last_name?" "+e.last_name:"")}const n={_:"message",id:this.generateTempMessageId(e),from_id:t.sendAsPeerId?this.appPeersManager.getOutputPeer(t.sendAsPeerId):this.generateFromId(e),peer_id:this.appPeersManager.getOutputPeer(e),post_author:a,pFlags:this.generateFlags(e),date:t.scheduleDate||(0,te.Z)(!0)+this.timeManager.getServerTimeOffset(),message:"",grouped_id:t.groupId,random_id:(0,Te.a)(),reply_to:this.generateReplyHeader(e,t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:s&&1,pending:!0};return(0,ge.Z)(n,["send","promise"]),void 0===t.groupId&&(n.promise=(0,v.Z)()),n}generateReplyHeader(e,t,a){const s=this.appPeersManager.isForum(e);if(s&&!a){const s=this.getMessageByPeer(e,t);s&&(a=(0,Qt.Z)(s,!0))}const n={_:"messageReplyHeader",reply_to_msg_id:t||a,pFlags:{}};return a&&s&&o.Ox!==a&&(n.pFlags.forum_topic=!0),a&&n.reply_to_msg_id!==a&&(n.reply_to_top_id=a),n}generateReplies(e){let t;if(this.appPeersManager.isBroadcast(e)){const a=this.appProfileManager.getCachedFullChat(e.toChatId());(null==a?void 0:a.linked_chat_id)&&(t={_:"messageReplies",flags:1,pFlags:{comments:!0},channel_id:a.linked_chat_id,replies:0,replies_pts:0})}return t}generateFromId(e){return this.appPeersManager.isAnyChat(e)&&(this.appPeersManager.isBroadcast(e)||this.isAnonymousSending(e))?void 0:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId())}generateFlags(e){const t={};return e!==this.appUsersManager.getSelf().id&&(t.out=!0,this.appPeersManager.isChannel(e)||this.appUsersManager.isBot(e)||(t.unread=!0)),this.appPeersManager.isBroadcast(e)&&(t.post=!0),t}generateForwardHeader(e,t){const a=this.appUsersManager.getSelf().id.toPeerId(),s=t.fromId;if(s===a&&t.peerId===a&&!t.fwd_from)return;const n={_:"messageFwdHeader",flags:0,date:t.date};let i=!1;if(t.fwd_from)n.from_id=t.fwd_from.from_id,n.from_name=t.fwd_from.from_name,n.post_author=t.fwd_from.post_author;else{if(n.post_author=t.post_author,s.isUser()){const e=this.appProfileManager.getCachedFullUser(s.toUserId());(null==e?void 0:e.private_forward_name)&&(n.from_name=e.private_forward_name,i=!0)}i||(n.from_id=this.appPeersManager.getOutputPeer(s))}return this.appPeersManager.isBroadcast(t.peerId)&&(t.post_author&&(n.post_author=t.post_author),n.channel_post=t.id),e!==a||i||(n.saved_from_msg_id=t.id,n.saved_from_peer=this.appPeersManager.getOutputPeer(t.peerId)),n}generateFakeAvatarMessage(e,t){const a=Number.MAX_SAFE_INTEGER,s={_:"messageService",pFlags:{},action:{_:"messageActionChannelEditPhoto",photo:t},id:a,peer_id:this.appPeersManager.getOutputPeer(e),mid:a,peerId:e,date:t.date,fromId:e};return this.getHistoryMessagesStorage(e).set(a,s),s}getUploadPromise(e){return this.uploadFilePromises[e]}isAnonymousSending(e){var t,a;return!!e.isAnyChat()&&(null===(a=null===(t=this.appPeersManager.getPeer(e).admin_rights)||void 0===t?void 0:t.pFlags)||void 0===a?void 0:a.anonymous)}setDialogTopMessage(e,t=this.getDialogOnly(e.peerId)){t&&(t.top_message=e.mid,this.getHistoryStorage(e.peerId,"forumTopic"===t._?t.id:void 0).maxId=e.mid,this.dialogsStorage.generateIndexForDialog(t,!1,e),this.scheduleHandleNewDialogs(e.peerId,t))}cancelPendingMessage(e){const t=this.pendingByRandomId[e];if(t){const{peerId:a,tempId:s,storage:n}=t,i=this.getHistoryStorage(a);return this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteMessages",messages:[s],pts:void 0,pts_count:void 0}),i.history.delete(s),delete this.pendingByRandomId[e],n.delete(s),!0}return!1}fillConversations(e){return Yt(this,void 0,void 0,(function*(){const t=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(e);){const a=yield this.getTopMessages({limit:100,folderId:e});if(!t()||a.isEnd)break}}))}getReadMaxIdIfUnread(e,t){var a,s,n;const i=this.getHistoryStorage(e,t);if(t&&!this.appChatsManager.isForum(e.toChatId())){const t=this.getHistoryStorage(e),n=Math.max(null!==(a=t.readMaxId)&&void 0!==a?a:0,i.readMaxId),r=this.getMessageByPeer(e,i.maxId);return!(null===(s=null==r?void 0:r.pFlags)||void 0===s?void 0:s.out)&&n{if(!n()||"messages.dialogsNotModified"===r._)return null;d.ZP&&this.log("messages.getDialogs result:",r),i||s||t===ye||this.dialogsStorage.resetPinnedOrder(t),i||s||this.appDraftsManager.addMissedDialogs(),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages);let p=!!s,c=!1;const l=new Map,m=t===ye?o.J$:t,g=!!i||t===ye,h=r.dialogs||r.topics;if((0,ne.Z)(h,(e=>{var t,s;if(e)if(i||null!==(t=(s=e).folder_id)&&void 0!==t||(s.folder_id=m),this.dialogsStorage.saveDialog({dialog:e,ignoreOffsetDate:!0,saveGlobalOffset:g}),void 0!==e.peerId)if(p||this.appPeersManager.isChannel(e.peerId||this.appPeersManager.getPeerId(e.peer))||(this.incrementMaxSeenId(e.top_message),p=!0),a&&(0,ce.Z)(e)>a&&(this.scheduleHandleNewDialogs(e.peerId,e),c=!0),i||(0,oe.Z)(e.read_inbox_max_id)||(0,oe.Z)(e.read_outbox_max_id)){if(e.top_message){const t=this.getMessageByPeer(e.peerId,e.top_message);t&&(this.setMessageUnreadByDialog(t,e),this.dialogsStorage.setDialogToState(e))}}else l.set(e.peerId,{dialog:e}),this.log.error("noIdsDialogs",e,f);else this.log.error("bugged dialog?",e)})),l.size){const e=[...l.keys()],t=e.map((e=>this.reloadConversation(e)));Promise.all(t).then((()=>{this.rootScope.dispatchEvent("dialogs_multiupdate",l);for(let t=0;t=u||!h.length;v&&this.dialogsStorage.setDialogsLoaded(t,!0),c?this.scheduleHandleNewDialogs():this.rootScope.dispatchEvent("dialogs_multiupdate",new Map);const P=h,b=100===e?P:P.slice(0,e);return{isEnd:v&&b[b.length-1]===P[P.length-1],count:u,dialogs:b}};let p,f;return p=i?this.apiManager.invokeApiSingleProcess({method:"channels.getForumTopics",params:f={channel:this.appChatsManager.getChannelInput(i.toChatId()),limit:100,offset_date:s,offset_id:0,offset_topic:0},options:{noErrorBox:!0},processResult:e=>(e=this.dialogsStorage.processTopics(i,e),r(e))}):this.apiManager.invokeApiSingleProcess({method:"messages.getDialogs",params:f={folder_id:t,offset_date:s,offset_id:0,offset_peer:this.appPeersManager.getInputPeerById(undefined),limit:100,hash:"0"},options:{noErrorBox:!0},processResult:r}),p}forwardMessages(e,t,a,s={}){return Yt(this,void 0,void 0,(function*(){delete s.replyToMsgId,delete s.threadId,e=this.appPeersManager.getPeerMigratedTo(e)||e;for(let n=0,i=(a=a.slice().sort(((e,t)=>e-t))).length;n{var i,p,d,f,c;const l=this.getMessageByPeer(t,n),m=this.generateOutgoingMessage(e,s);o.push(m.id);const g=["entities","media"];s.dropAuthor||(m.fwd_from=this.generateForwardHeader(e,l),g.push("views","forwards"),(null===(i=m.fwd_from)||void 0===i?void 0:i.from_name)&&e===this.appPeersManager.peerId&&delete m.from_id),s.dropCaptions&&l.media||g.push("message");const h=null===(p=l.reply_to)||void 0===p?void 0:p.reply_to_msg_id,u=a.indexOf(h);if(h&&-1!==u){const e=o[u];m.reply_to={_:"messageReplyHeader",reply_to_msg_id:e}}g.forEach((e=>{m[e]=(0,ve.Z)(l[e])}));const y=null===(d=m.media)||void 0===d?void 0:d.document;return y&&(["round","voice"].includes(y.type)&&(m.pFlags.media_unread=!0),y.sticker&&!this.rootScope.premium&&(0,Wt.Z)(y)&&(m.media.pFlags.nopremium=!0)),l.grouped_id&&(null!==(f=r[c=l.grouped_id])&&void 0!==f?f:r[c]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(m),m}));for(const e in r){const t=r[e];t.messages.length>1&&t.messages.forEach((e=>{e.grouped_id=t.tempId}))}p.forEach((e=>{this.beforeMessageSending(e,{isScheduled:!!s.scheduleDate||void 0,sequential:!0})}));const d={};this.pendingAfterMsgs[e]&&(d.afterMessageId=this.pendingAfterMsgs[e].messageId);const f=this.apiManager.invokeApiAfter("messages.forwardMessages",{from_peer:this.appPeersManager.getInputPeerById(t),id:a.map((e=>(0,oe.Z)(e))),random_id:p.map((e=>e.random_id)),to_peer:this.appPeersManager.getInputPeerById(e),with_my_score:s.withMyScore,silent:s.silent,schedule_date:s.scheduleDate,drop_author:s.dropAuthor,drop_media_captions:s.dropCaptions,send_as:s.sendAsPeerId?this.appPeersManager.getInputPeerById(s.sendAsPeerId):void 0},d).then((e=>{this.log("forwardMessages updates:",e),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{throw this.onMessagesSendError(p,e),e})).finally((()=>{this.pendingAfterMsgs[e]===d&&delete this.pendingAfterMsgs[e]}));this.pendingAfterMsgs[e]=d;const c=[f];return i.length&&c.push(this.forwardMessages(e,t,i,s)),Promise.all(c).then(jt.Z)}))}generateEmptyMessage(e){}onMessagesSendError(e,t){e.forEach((e=>{if(e.error!==t)if(t){e.error=t,this.rootScope.dispatchEvent("message_error",{storageKey:e.storageKey,tempId:e.mid,error:t});const a=this.getDialogOnly(e.peerId);a&&this.rootScope.dispatchEvent("dialog_unread",{peerId:e.peerId,dialog:a})}else delete e.error}))}getMessagesStorageByKey(e){const t=e.split("_"),a=+t[0];return"scheduled"===t[1]?this.getScheduledMessagesStorage(a):this.getHistoryMessagesStorage(a)}getMessageFromStorage(e,t){return"string"==typeof e&&(e=this.getMessagesStorageByKey(e)),e&&e.get(t)}createMessageStorage(e,t){const a=new Map;return a.peerId=e,a.type=t,a.key=`${e}_${t}`,a}getHistoryMessagesStorage(e){var t,a;return null!==(t=(a=this.messagesStorageByPeerId)[e])&&void 0!==t?t:a[e]=this.createMessageStorage(e,"history")}getMessagesStorage(e){return"object"==typeof e?e:this.getMessagesStorageByKey(e)}getMessageById(e){for(const t in this.messagesStorageByPeerId){if(this.appPeersManager.isChannel(t.toPeerId()))continue;const a=this.messagesStorageByPeerId[t].get(e);if(a)return a}return this.getMessageFromStorage(null,e)}getMessageByPeer(e,t){return e?this.getMessageFromStorage(this.getHistoryMessagesStorage(e),t):this.getMessageById(t)}getMessagePeer(e){return e.peer_id&&this.appPeersManager.getPeerId(e.peer_id)||o.NM}getDialogOnly(e){return this.dialogsStorage.getDialogOnly(e)}cantForwardDeleteMids(e,t){const a=this.getMessagesStorage(e);let s=!t.length,n=!t.length;for(const e of t){const t=this.getMessageFromStorage(a,e);if(s||(s=!this.canForward(t)),n||(n=!this.canDeleteMessage(t)),s&&n)break}return{cantForward:s,cantDelete:n}}reloadConversationOrTopic(e,t){t?this.dialogsStorage.getForumTopicById(e,t):this.reloadConversation(e)}reloadConversation(e){let t;if(void 0!==e){const a=this.appPeersManager.getPeerId(e);this.log.warn("reloadConversation",a);let s=this.reloadConversationsPeers.get(a);if(s&&(t=s.promise),t)return t;t=(0,v.Z)(),this.reloadConversationsPeers.set(a,s={inputDialogPeer:this.appPeersManager.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=(0,P.Z)(0).then((()=>{const e=[],t={};for(const[a,{inputDialogPeer:s,promise:n}]of this.reloadConversationsPeers)e.push(s),t[a]=n;const a=()=>{for(const e in t)this.reloadConversationsPeers.delete(+e),t[e].resolve(void 0)};return(()=>Yt(this,void 0,void 0,(function*(){for(;;){const t=yield this.apiManager.invokeApi("messages.getPeerDialogs",{peers:e}),a=this.apiUpdatesManager.updatesState,{state:s}=t;if(!a.pts||a.pts===s.pts)return t;yield(0,P.Z)(500)}})))().then((e=>{for(const e in t)this.reloadConversationsPeers.delete(+e);this.dialogsStorage.applyDialogs(e),e.dialogs.forEach((e=>{const a=e.peerId;a&&(t[a].resolve(e),delete t[a])}))}),jt.Z).then((()=>{a(),this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()}))}))),t||this.reloadConversationsPromise}doFlushHistory(e,t,a,s){let n;const i=n=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:n.pts,pts_count:n.pts_count}}),!n.offset||this.doFlushHistory(e,t,a,s));return n=s?this.apiManager.invokeApiSingleProcess({method:"channels.deleteTopicHistory",params:{channel:this.appChatsManager.getChannelInput(e.toChatId()),top_msg_id:(0,oe.Z)(s)},processResult:i}):this.apiManager.invokeApiSingleProcess({method:"messages.deleteHistory",params:{just_clear:t,revoke:a,peer:this.appPeersManager.getInputPeerById(e),max_id:0},processResult:i}),n}flushHistory(e,t,a,s){return Yt(this,void 0,void 0,(function*(){if(this.appPeersManager.isChannel(e)&&!s){const t=this.getHistory(e,0,1),a=yield t,s=e.toChatId(),n=a.history[0]||0;return this.apiManager.invokeApiSingle("channels.deleteHistory",{channel:this.appChatsManager.getChannelInput(s),max_id:(0,oe.Z)(n)}).then((e=>(e&&this.apiUpdatesManager.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:s,available_min_id:n}),e)))}return this.doFlushHistory(e,t,a,s).then((()=>{if(s||this.flushStoragesByPeerId(e),t)this.rootScope.dispatchEvent("dialog_flush",{peerId:e,dialog:this.getDialogOnly(e)});else{const t=this.getTypingKey(e,s);if(delete this.notificationsToHandle[t],delete this.typings[t],!s){const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0))}this.dialogsStorage.dropDialogOnDeletion(e,s)}}))}))}flushStoragesByPeerId(e){[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pendingAfterMsgs,this.pendingTopMsgs].forEach((t=>{delete t[e]}));for(const t in this.pinnedMessages)(+t===e||t.startsWith(e+"_"))&&delete this.pinnedMessages[t];const t=this.needSingleMessages.get(e);if(t){for(const[e,a]of t)a.resolve(this.generateEmptyMessage(e));t.clear()}[this.messagesStorageByPeerId,this.scheduledMessagesStorage].forEach((t=>{const a=t[e];a&&a.clear()})),this.dialogsStorage.flushForumTopicsCache(e)}hidePinnedMessages(e){return Promise.all([this.appStateManager.getState(),this.getPinnedMessage(e)]).then((([t,a])=>{t.hiddenPinnedMessages[e]=a.maxId,this.rootScope.dispatchEvent("peer_pinned_hidden",{peerId:e,maxId:a.maxId})}))}getPinnedMessagesKey(e,t){return e+(t?"_"+t:"")}getPinnedMessage(e,t){var a,s,n;const i=null!==(a=(s=this.pinnedMessages)[n=this.getPinnedMessagesKey(e,t)])&&void 0!==a?a:s[n]={};return i.promise?i.promise:i.maxId?Promise.resolve(i):i.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1,threadId:t}).then((e=>{var t;return i.count=e.count,i.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,i})).finally((()=>{delete i.promise}))}getPinnedMessagesCount(e,t){var a;return null===(a=this.pinnedMessages[this.getPinnedMessagesKey(e,t)])||void 0===a?void 0:a.count}getPinnedMessagesMaxId(e,t){var a;return null===(a=this.pinnedMessages[this.getPinnedMessagesKey(e,t)])||void 0===a?void 0:a.maxId}updatePinnedMessage(e,t,a,s,n){return this.apiManager.invokeApi("messages.updatePinnedMessage",{peer:this.appPeersManager.getInputPeerById(e),unpin:a,silent:s,pm_oneside:n,id:(0,oe.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}unpinAllMessages(e){return this.apiManager.invokeApiSingle("messages.unpinAllMessages",{peer:this.appPeersManager.getInputPeerById(e)}).then((t=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:t.pts,pts_count:t.pts_count}}),t.offset?this.unpinAllMessages(e):(this.getHistoryMessagesStorage(e).forEach((e=>{e.pFlags.pinned&&delete e.pFlags.pinned})),this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:e,unpinAll:!0}),delete this.pinnedMessages[this.getPinnedMessagesKey(e)],!0))))}getAlbumText(e){const t=this.groupedMessagesStorage[e];return(0,Ht.Z)(Array.from(t.values()))}getGroupsFirstMessage(e){if(!(null==e?void 0:e.grouped_id))return e;const t=this.groupedMessagesStorage[e.grouped_id];let a=Number.MAX_SAFE_INTEGER;for(const[e,s]of t)s.midthis.getMessageFromStorage(a,e)))}getMidsByMessage(e){return e?e.grouped_id?this.getMidsByAlbum(e.grouped_id):[e.mid]:[]}filterMessages(e,t){const a=[];if(e.grouped_id){const s=this.groupedMessagesStorage[e.grouped_id];for(const[e,n]of s)t(n)&&a.push(n)}else t(e)&&a.push(e);return a}generateTempMessageId(e){const t=this.getDialogOnly(e);return this.appMessagesIdsManager.generateTempMessageId((null==t?void 0:t.top_message)||0)}setMessageUnreadByDialog(e,t=this.getDialogOnly(e.peerId)){t&&e.mid&&e.mid>t[e.pFlags.out?"read_outbox_max_id":"read_inbox_max_id"]&&(e.pFlags.unread=!0)}saveMessage(e,t={}){var a,s,n,i,r;if(!e||"messageEmpty"===e._)return;null!==(a=e.pFlags)&&void 0!==a||(e.pFlags={});const p=this.getMessagePeer(e),d=t.storage||this.getHistoryMessagesStorage(p),f="peerChannel"===e.peer_id._,c=f&&this.appChatsManager.isBroadcast(p.toChatId()),l="message"===e._;t.isOutgoing&&(e.pFlags.is_outgoing=!0);const m=(0,pe.Z)(e.id);e.mid=m,l&&(t.isScheduled&&(e.pFlags.is_scheduled=!0),e.grouped_id&&(null!==(s=(i=this.groupedMessagesStorage)[r=e.grouped_id])&&void 0!==s?s:i[r]=this.createMessageStorage(p,"grouped")).set(m,e),e.via_bot_id&&(e.viaBotId=e.via_bot_id));const g=e.reply_to;g&&(g.reply_to_msg_id&&(g.reply_to_msg_id=e.reply_to_mid=(0,pe.Z)(g.reply_to_msg_id)),g.reply_to_top_id&&(g.reply_to_top_id=(0,pe.Z)(g.reply_to_top_id)));const h=l&&e.replies;h&&(h.max_id&&(h.max_id=(0,pe.Z)(h.max_id)),h.read_max_id&&(h.read_max_id=(0,pe.Z)(h.read_max_id)));const u=!!p;u||(e.date-=this.timeManager.getServerTimeOffset());const y=this.appPeersManager.peerId,_=l&&e.fwd_from;if(e.peerId=p,e.fromId=p===y?_?_.from_id?this.appPeersManager.getPeerId(_.from_id):o.NM:y:e.pFlags.post||!e.from_id?p:this.appPeersManager.getPeerId(e.from_id),this.setMessageUnreadByDialog(e),_){_.saved_from_msg_id&&(_.saved_from_msg_id=(0,pe.Z)(_.saved_from_msg_id)),_.channel_post&&(_.channel_post=(0,pe.Z)(_.channel_post));const t=_.saved_from_peer||_.from_id,a=_.saved_from_msg_id||_.channel_post;if(t&&a){const s=this.appPeersManager.getPeerId(t),n=(0,pe.Z)(a);e.savedFrom=s+"_"+n}e.fwdFromId=this.appPeersManager.getPeerId(_.from_id),u||(_.date-=this.timeManager.getServerTimeOffset())}const v={type:"message",peerId:p,messageId:m};let P=!1;const b=l&&e.media;if(b)switch(b._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":b.ttl_seconds?P=!0:b.photo=this.appPhotosManager.savePhoto(b.photo,v),b.photo||delete e.media;break;case"messageMediaPoll":{const t=this.appPollsManager.savePoll(b.poll,b.results,e);b.poll=t.poll,b.results=t.results;break}case"messageMediaDocument":if(b.ttl_seconds)P=!0;else{const e=b.document;b.document=this.appDocsManager.saveDoc(e,v),b.document||"documentEmpty"===e._||(P=!0)}break;case"messageMediaWebPage":{const a=this.appWebPagesManager.getMessageKeyForPendingWebPage(p,m,t.isScheduled);b.webpage=this.appWebPagesManager.saveWebPage(b.webpage,a,v),b.webpage||delete e.media;break}case"messageMediaInvoice":{b.photo=this.appWebDocsManager.saveWebDocument(b.photo);const e=b.extended_media;if("messageExtendedMedia"===(null==e?void 0:e._)){const t=e.media;t.photo=this.appPhotosManager.savePhoto(t.photo,v),t.document=this.appDocsManager.saveDoc(t.document,v)}break}case"messageMediaUnsupported":P=!0}if(l&&P&&(e.media={_:"messageMediaUnsupported"},e.message="",delete e.entities,delete e.totalEntities),!l&&e.action){const t=e.action,a=e.fromId===this.appUsersManager.getSelf().id?"You":"";let s,i;switch(t.photo&&(t.photo=this.appPhotosManager.savePhoto(t.photo,v)),t.document&&(t.document=this.appDocsManager.saveDoc(t.photo,v)),t._){case"messageActionChatEditPhoto":(null===(n=t.photo)||void 0===n?void 0:n.video_sizes)?t._=c?"messageActionChannelEditVideo":"messageActionChatEditVideo":c&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let e;this.appGroupCallsManager.saveGroupCall(t.call),e=void 0===t.duration?"started":"ended",c||(e+="_by"+a),t.type=e;break}case"messageActionChatEditTitle":c&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":c&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=f?"messageActionChatJoined"+a:"messageActionChatReturn"+a)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+a);break;case"messageActionChannelMigrateFrom":s=t.chat_id.toPeerId(!0),i=p;break;case"messageActionChatMigrateTo":s=p,i=t.channel_id.toPeerId(!0);break;case"messageActionHistoryClear":e.clear_history=!0,delete e.pFlags.out,delete e.pFlags.unread;break;case"messageActionPhoneCall":t.type=(t.pFlags.video?"video_":"")+(void 0!==t.duration?e.pFlags.out?"out_":"in_":"")+(void 0!==t.duration?"ok":"phoneCallDiscardReasonMissed"===t.reason._?"missed":"cancelled")}s&&i&&!this.migratedFromTo[s]&&!this.migratedToFrom[i]&&this.migrateChecks(s,i)}return l&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),d.set(m,e),e}saveMessages(e,t={}){return e.saved||(e.saved=!0,e.forEach(((e,a,s)=>{s[a]=this.saveMessage(e,t)}))),e}getFirstMessageToEdit(e,t){return Yt(this,void 0,void 0,(function*(){const a=this.getHistoryStorage(e,t).history.slice;if(a.isEnd(se.D.Bottom)&&a.length){let t;const s=this.appPeersManager.peerId;for(const n of a){const a=this.getMessageByPeer(e,n);if((s===e?a.fromId===s:a.pFlags.out)&&(yield this.canEditMessage(a,"text"))){t=a;break}}return t}}))}wrapMessageEntities(e){const t=e.entities?e.entities.slice():[];e.message=(0,Pt.Z)(e.message,t);const a=(0,Lt.Z)(e.message);e.totalEntities=(0,Ot.Z)(t,a)}reportMessages(e,t,a,s){return this.apiManager.invokeApiSingle("messages.report",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e))),reason:{_:a},message:s})}startBot(e,t,a){const s=t?t.toPeerId(!0):e.toPeerId();if(a){const t=(0,Te.a)();return this.apiManager.invokeApi("messages.startBot",{bot:this.appUsersManager.getUserInput(e),peer:this.appPeersManager.getInputPeerById(s),random_id:t,start_param:a}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}const n="/start";if(t){let a;return a=this.appChatsManager.isChannel(t)?this.appChatsManager.inviteToChannel(t,[e]):this.appChatsManager.addChatUser(t,e,0),a.catch((e=>{if("USER_ALREADY_PARTICIPANT"!=(null==e?void 0:e.type))throw e;e.handled=!0})).then((()=>this.sendText(s,n+"@"+this.appPeersManager.getPeerUsername(e.toPeerId()))))}return this.sendText(s,n)}editPeerFolders(e,t){this.apiManager.invokeApi("folders.editPeerFolders",{folder_peers:e.map((e=>({_:"inputFolderPeer",peer:this.appPeersManager.getInputPeerById(e),folder_id:t})))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getFilter(e){return this.filtersStorage.getFilter(e)}toggleDialogPin(e){var t;return Yt(this,void 0,void 0,(function*(){const{peerId:a,topicId:s,filterId:n=(s?a:void 0)}=e;if(void 0===n)throw new Error("No filterId");if(n>1)return this.filtersStorage.toggleDialogPin(a,n);const i=this.dialogsStorage.getDialogOrTopic(a,s);if(!i)throw void 0;const r=!(null===(t=i.pFlags)||void 0===t?void 0:t.pinned)||void 0;if(r){const e=yield this.apiManager.getLimit(s?"topicPin":1===n?"folderPin":"pin");if(this.dialogsStorage.getPinnedOrders(n).length>=e)throw(0,X.Z)(s?"PINNED_TOO_MUCH":"PINNED_DIALOGS_TOO_MUCH")}return s?this.appChatsManager.updatePinnedForumTopic(a.toChatId(),s,r):this.apiManager.invokeApi("messages.toggleDialogPin",{peer:this.appPeersManager.getInputDialogPeerById(a),pinned:r}).then((e=>{const t=r?{pinned:r}:{};this.apiUpdatesManager.saveUpdate({_:"updateDialogPinned",peer:this.appPeersManager.getDialogPeer(a),folder_id:n,pFlags:t})}))}))}markDialogUnread(e,t){var a;const s=this.getDialogOnly(e);if(!s)return Promise.reject();const n=!t&&!(null===(a=s.pFlags)||void 0===a?void 0:a.unread_mark)||void 0;return this.apiManager.invokeApi("messages.markDialogUnread",{peer:this.appPeersManager.getInputDialogPeerById(e),unread:n}).then((t=>{if(t){const t=n?{unread:n}:{};this.onUpdateDialogUnreadMark({_:"updateDialogUnreadMark",peer:this.appPeersManager.getDialogPeer(e),pFlags:t})}}))}migrateChecks(e,t){if(!this.migratedFromTo[e]&&!this.migratedToFrom[t]&&this.appChatsManager.hasChat(t.toChatId())){const a=this.appChatsManager.getChat(e.toChatId());(null==a?void 0:a.migrated_to)&&a.migrated_to.channel_id===t.toChatId()&&(this.migratedFromTo[e]=t,this.migratedToFrom[t]=e,this.rootScope.dispatchEvent("dialog_migrate",{migrateFrom:e,migrateTo:t}),this.dialogsStorage.dropDialogWithEvent(e))}}canMessageBeEdited(e,t){var a,s;if(null===(a=null==e?void 0:e.pFlags)||void 0===a?void 0:a.is_outgoing)return!1;const n=["messageMediaPhoto","messageMediaDocument","messageMediaWebPage"];return"poll"===t&&n.push("messageMediaPoll"),!(!e||"message"!==e._||e.deleted||e.fwd_from||e.via_bot_id||e.media&&-1===n.indexOf(e.media._)||e.fromId&&this.appUsersManager.isBot(e.fromId)||"messageMediaDocument"===(null===(s=e.media)||void 0===s?void 0:s._)&&(e.media.document.sticker||"round"===e.media.document.type))}canEditMessage(e,t="text"){var a;return Yt(this,void 0,void 0,(function*(){return!(!e||!this.canMessageBeEdited(e,t))&&(this.getMessagePeer(e)===this.appUsersManager.getSelf().id||!(!(this.appPeersManager.isBroadcast(e.peerId)?this.appChatsManager.hasRights(e.peerId.toChatId(),"edit_messages"):e.pFlags.out)||"peerChannel"!==e.peer_id._&&e.date<(0,te.Z)(!0)-(yield this.apiManager.getConfig()).edit_time_limit&&"messageMediaPoll"!==(null===(a=e.media)||void 0===a?void 0:a._)))}))}canDeleteMessage(e){return e&&(e.peerId.isUser()||e.pFlags.out||"chat"===this.appChatsManager.getChat(e.peerId.toChatId())._||this.appChatsManager.hasRights(e.peerId.toChatId(),"delete_messages"))&&(!e.pFlags.is_outgoing||!!e.error)}getReplyKeyboard(e){return this.getHistoryStorage(e).replyMarkup}mergeReplyKeyboard(e,t){var a,s;if(!t)return!1;const n=t.reply_markup;if(!n&&!(null===(a=t.pFlags)||void 0===a?void 0:a.out)&&!t.action)return!1;if("replyInlineMarkup"===(null==n?void 0:n._))return!1;const i=e.replyMarkup;if(n)return!(i&&i.mid>=t.mid||n.pFlags.selective||(e.maxOutId&&t.midi.mid||t.pFlags.is_outgoing)&&t.message)return i.pFlags.hidden=!0,!0}else(!e.maxOutId||t.mid>e.maxOutId)&&(e.maxOutId=t.mid);return(0,ue.Z)(t),!("messageActionChatDeleteUser"!==(null===(s=t.action)||void 0===s?void 0:s._)||!(i?t.action.user_id===i.fromId:this.appUsersManager.isBot(t.action.user_id))||(e.replyMarkup={_:"replyKeyboardHide",mid:t.mid,pFlags:{}},0))}getSearchStorage(e,t){return this.searchesStorage[e]||(this.searchesStorage[e]={}),this.searchesStorage[e][t]||(this.searchesStorage[e][t]={history:[]}),this.searchesStorage[e][t]}getSearchCounters(e,t,a=!0,s){return this.appPeersManager.isPeerRestricted(e)?Promise.resolve(t.map((e=>({_:"messages.searchCounter",pFlags:{},filter:e,count:0})))):(a?this.apiManager.invokeApiCacheable:this.apiManager.invokeApi).bind(this.apiManager)("messages.getSearchCounters",{peer:this.appPeersManager.getInputPeerById(e),filters:t,top_msg_id:s?(0,oe.Z)(s):void 0})}filterMessagesByInputFilterFromStorage(e,t,a,s){const n=this.getMessagesStorage(a);return(0,Nt.Z)(e,t.map((e=>n.get(e))),s)}getSearch({peerId:e,query:t,inputFilter:a,maxId:s,limit:n,nextRate:i,backLimit:r,threadId:o,folderId:p,minDate:f,maxDate:c}){if(this.appPeersManager.isPeerRestricted(e))return Promise.resolve({count:0,offset_id_offset:0,next_rate:void 0,history:[]});t||(t=""),a||(a={_:"inputMessagesFilterEmpty"}),void 0===n&&(n=20),i||(i=0),r||(r=0),f=f?f/1e3|0:0,c=c?c/1e3|0:0;let l=[];r&&(n+=r);let m;if(!e||r||s||t||1===n||o||(m=this.getHistoryStorage(e),l=this.filterMessagesByInputFilterFromStorage(a._,m.history.slice,this.getHistoryMessagesStorage(e),n)),l.length){if(!(l.length{this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.saveMessages(e.messages),d.ZP&&this.log("getSearch result:",a,e);const t=e.count||l.length+e.messages.length;return e.messages.forEach((e=>{const t=this.getMessagePeer(e);if(t.isAnyChat()){const e=this.appChatsManager.getChat(t.toChatId());e.migrated_to&&this.migrateChecks(t,e.migrated_to.channel_id.toPeerId(!0))}l.push(e)})),{count:t,offset_id_offset:e.offset_id_offset||0,next_rate:e.next_rate,history:l}}))}subscribeRepliesThread(e,t){const a=e+"_"+t;for(const e in this.threadsToReplies)if(this.threadsToReplies[e]===a)return;this.getDiscussionMessage(e,t)}generateThreadServiceStartMessage(e){const t=e.peerId+"_"+e.mid;if(this.threadsServiceMessagesIdsStorage[t])return;const a=(0,oe.Z)(Math.max(...this.getMidsByMessage(e))),s={_:"messageService",pFlags:{is_single:!0},id:this.appMessagesIdsManager.generateTempMessageId(a),date:e.date,from_id:{_:"peerUser",user_id:o.NM},peer_id:e.peer_id,action:{_:"messageActionDiscussionStarted"},reply_to:this.generateReplyHeader(e.peerId,e.id)};this.saveMessages([s],{isOutgoing:!0}),this.threadsServiceMessagesIdsStorage[t]=s.mid}getThreadServiceMessageId(e,t){return this.threadsServiceMessagesIdsStorage[e+"_"+t]}getDiscussionMessage(e,t){return this.apiManager.invokeApiSingle("messages.getDiscussionMessage",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((a=>{var s;this.appChatsManager.saveApiChats(a.chats),this.appUsersManager.saveApiUsers(a.users),this.saveMessages(a.messages);const n=this.getMessageWithReplies(a.messages[0]),i=n.peerId+"_"+n.mid;this.generateThreadServiceStartMessage(n);const r=this.getHistoryStorage(n.peerId,n.mid),o=a.max_id=(0,pe.Z)(a.max_id)||0;a.read_inbox_max_id=r.readMaxId=(0,pe.Z)(null!==(s=a.read_inbox_max_id)&&void 0!==s?s:n.mid),a.read_outbox_max_id=r.readOutboxMaxId=(0,pe.Z)(a.read_outbox_max_id)||0;const p=r.history.first;return r.maxId&&r.maxId{this.newDialogsHandlePromise=void 0,this.handleNewDialogs()}))}deleteMessages(e,t,a){var s,n;return Yt(this,void 0,void 0,(function*(){let i;const r=yield this.apiManager.getConfig(),o=t.splice(r.forwarded_count_max,t.length-r.forwarded_count_max),p=t.map((e=>(0,oe.Z)(e)));if(e.isAnyChat()&&this.appPeersManager.isChannel(e)){const a=e.toChatId(),r=this.appChatsManager.getChat(a);if(!r.pFlags.creator&&!(null===(n=null===(s=r.admin_rights)||void 0===s?void 0:s.pFlags)||void 0===n?void 0:n.delete_messages)&&!(t=t.filter((t=>!!this.getMessageByPeer(e,t).pFlags.out))).length)return;i=this.apiManager.invokeApi("channels.deleteMessages",{channel:this.appChatsManager.getChannelInput(a),id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteChannelMessages",channel_id:a,messages:t,pts:e.pts,pts_count:e.pts_count})}))}else i=this.apiManager.invokeApi("messages.deleteMessages",{revoke:a,id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteMessages",messages:t,pts:e.pts,pts_count:e.pts_count})}));const d=[i];return o.length&&d.push(this.deleteMessages(e,o,a)),Promise.all(d).then(jt.Z)}))}readHistory(e,t=0,a,s=!1){if(this.log("readHistory:",e,t,a),!this.getReadMaxIdIfUnread(e,a)){if(a&&!s){const t=this.dialogsStorage.getForumTopic(e,a);(0,oe.Z)(t.read_inbox_max_id)||(s=!0)}if(!s){const t=this.appChatsManager.isForum(e.toChatId())&&a?this.dialogsStorage.getForumTopic(e,a):this.getDialogOnly(e);t&&this.isDialogUnread(t)&&(s=!0)}if(!s)return this.log("readHistory: isn't unread"),Promise.resolve()}const n=this.getHistoryStorage(e,a);if(n.triedToReadMaxId>=t)return Promise.resolve();let i;return a?(n.readPromise||(i=this.apiManager.invokeApi("messages.readDiscussion",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(a),read_max_id:(0,oe.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelDiscussionInbox",channel_id:e.toChatId(),top_msg_id:a,read_max_id:t})):this.appPeersManager.isChannel(e)?(n.readPromise||(i=this.apiManager.invokeApi("channels.readHistory",{channel:this.appChatsManager.getChannelInput(e.toChatId()),max_id:(0,oe.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelInbox",max_id:t,channel_id:e.toChatId(),still_unread_count:void 0,pts:void 0})):(n.readPromise||(i=this.apiManager.invokeApi("messages.readHistory",{peer:this.appPeersManager.getInputPeerById(e),max_id:(0,oe.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})}))),this.apiUpdatesManager.processLocalUpdate({_:"updateReadHistoryInbox",max_id:t,peer:this.appPeersManager.getOutputPeer(e),still_unread_count:void 0,pts:void 0,pts_count:void 0})),this.rootScope.dispatchEvent("notification_reset",this.appPeersManager.getPeerString(e)),n.readPromise?n.readPromise:(n.triedToReadMaxId=t,i.finally((()=>{delete n.readPromise;const{readMaxId:s}=n;this.log("readHistory: promise finally",t,s),s>t&&this.readHistory(e,s,a,!0)})),n.readPromise=i)}readAllHistory(e,t,a=!1){const s=this.getHistoryStorage(e,t);s.maxId&&this.readHistory(e,s.maxId,t,a)}getUnreadMentionsKey(e,t){return e+(t?`_${t}`:"")}fixDialogUnreadMentionsIfNoMessage(e,t){const a=this.dialogsStorage.getDialogOrTopic(e,t);(null==a?void 0:a.unread_mentions_count)&&this.reloadConversationOrTopic(e)}modifyCachedMentions(e,t,a,s){const n=this.unreadMentions[this.getUnreadMentionsKey(e,s)];n&&(a?n.first.isEnd(se.D.Top)&&n.insertSlice([t]):n.delete(t))}fixUnreadMentionsCountIfNeeded(e,t,a){const s=this.dialogsStorage.getDialogOrTopic(e,a);!t.length&&(null==s?void 0:s.unread_mentions_count)&&this.reloadConversationOrTopic(e)}goToNextMention(e,t){var a,s;const n=this.getUnreadMentionsKey(e,t),i=this.goToNextMentionPromises[n];if(i)return i;const r=null!==(a=(s=this.unreadMentions)[e])&&void 0!==a?a:s[e]=new se.Z,o=r.length,p=r.first.isEnd(se.D.Top);if(!o&&p)return this.fixUnreadMentionsCountIfNeeded(e,r,t),Promise.resolve();let d=Promise.resolve();return!p&&o<25&&(d=this.loadNextMentions(e,t)),this.goToNextMentionPromises[n]=d.then((()=>{const a=r.last,s=a&&a[a.length-1];if(s)return r.delete(s),s;this.fixUnreadMentionsCountIfNeeded(e,r,t)})).finally((()=>{delete this.goToNextMentionPromises[n]}))}loadNextMentions(e,t){const a=this.unreadMentions[e],s=a.first[0]||1;return this.getUnreadMentions(e,s,-50,50,void 0,void 0,t).then((e=>{this.mergeHistoryResult(a,e,1===s?0:s,50,-50)}))}getUnreadMentions(e,t,a,s,n=0,i=0,r){return this.apiManager.invokeApiSingleProcess({method:"messages.getUnreadMentions",params:{peer:this.appPeersManager.getInputPeerById(e),offset_id:(0,oe.Z)(t),add_offset:a,limit:s,max_id:(0,oe.Z)(n),min_id:(0,oe.Z)(i),top_msg_id:r?(0,oe.Z)(r):void 0},processResult:e=>((0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.saveMessages(e.messages),e)})}readMessages(e,t){if(!t.length)return Promise.resolve();let a,s;if(t=t.map((e=>(0,oe.Z)(e))),e.isAnyChat()&&this.appPeersManager.isChannel(e)){const n=e.toChatId();s={_:"updateChannelReadMessagesContents",channel_id:n,messages:t},a=this.apiManager.invokeApi("channels.readMessageContents",{channel:this.appChatsManager.getChannelInput(n),id:t})}else s={_:"updateReadMessagesContents",messages:t,pts:void 0,pts_count:void 0},a=this.apiManager.invokeApi("messages.readMessageContents",{id:t}).then((e=>{s.pts=e.pts,s.pts_count=e.pts_count,this.apiUpdatesManager.processLocalUpdate(s)}));return this.apiUpdatesManager.processLocalUpdate(s),a}getHistoryStorage(e,t){var a,s,n,i,r,o;return t?null!==(s=(r=null!==(a=(i=this.threadsStorage)[e])&&void 0!==a?a:i[e]={})[t])&&void 0!==s?s:r[t]={count:null,history:new se.Z}:null!==(n=(o=this.historiesStorage)[e])&&void 0!==n?n:o[e]={count:null,history:new se.Z}}getHistoryStorageTransferable(e,t){const a=this.getHistoryStorage(e,t),{count:s,history:n,maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}=a;return{count:s,history:void 0,historySerialized:n.toJSON(),maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}}getNotifyPeerSettings(e,t){const a=this.appPeersManager.getInputNotifyPeerById({peerId:e,ignorePeerId:!0,threadId:t});return Promise.all([this.appNotificationsManager.getNotifyPeerTypeSettings(),this.appNotificationsManager.getNotifySettings(a)]).then((([a,s])=>({muted:this.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!0,threadId:t}),peerTypeNotifySettings:s})))}getUpdateAfterReloadKey(e,t){return e+(t?"_"+t:"")}handleNewUpdateAfterReload(e,t,a){var s,n,i;const r=null!==(s=(n=this.newUpdatesAfterReloadToHandle)[i=this.getUpdateAfterReloadKey(e,a)])&&void 0!==s?s:n[i]=new Set;r.has(t)?this.log.error("here we go again",e):(t.ignoreExisting=!0,r.add(t),this.scheduleHandleNewDialogs(e,a))}setDialogToStateIfMessageIsTop(e){this.isMessageIsTopMessage(e)&&this.dialogsStorage.setDialogToState(this.getDialogOnly(e.peerId))}isMessageIsTopMessage(e){const t=this.getDialogOnly(e.peerId);return t&&t.top_message===e.mid}updateMessageRepliesIfNeeded(e){try{const t=this.getThreadKey(e);if(t){const e=this.threadsToReplies[t];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}}catch(t){this.log.error("incrementMessageReplies err",t,e)}}getThreadKey(e){var t;let a="";if(null===(t=null==e?void 0:e.peerId)||void 0===t?void 0:t.isAnyChat()){const t=(0,Qt.Z)(e,this.appChatsManager.isForum(e.peerId.toChatId()));t&&(a=e.peerId+"_"+t)}return a}updateMessage(e,t,a){return this.reloadMessages(e,t,!0).then((()=>{const s=this.getMessageByPeer(e,t);if(s)return a&&this.rootScope.dispatchEvent(a,s),s}))}checkPendingMessage(e){const t=this.pendingByMessageId[e.mid];let a;if(t){const s=this.pendingByRandomId[t];(a=this.finalizePendingMessage(t,e))&&this.rootScope.dispatchEvent("history_update",{storageKey:s.storage.key,message:e,sequential:s.sequential}),delete this.pendingByMessageId[e.mid]}return a}mutePeer(e){if(!(e=this.appNotificationsManager.validatePeerSettings(e)))return;const{peerId:t,muteUntil:a,threadId:s}=e,n={_:"inputPeerNotifySettings"};n.mute_until=a;const i=this.appPeersManager.getInputPeerById(t);return this.appNotificationsManager.updateNotifySettings(s?{_:"inputNotifyForumTopic",peer:i,top_msg_id:(0,oe.Z)(s)}:{_:"inputNotifyPeer",peer:i},n)}togglePeerMute({peerId:e,mute:t,threadId:a}){return void 0===t&&(t=!this.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1,threadId:a})),this.mutePeer({peerId:e,muteUntil:t?o.rU:0,threadId:a})}findPeerIdByMids(e){for(let t=e.length-1;t>=0;--t){const a=e[t],s=this.getMessageById(a);if(s)return s.peerId}}canSendToPeer(e,t,a="send_messages"){var s;if(this.appPeersManager.isPeerRestricted(e))return!1;if(e.isAnyChat()){const n=e.toChatId();if(t){const a=this.dialogsStorage.getForumTopic(e,t);if((null===(s=null==a?void 0:a.pFlags)||void 0===s?void 0:s.closed)&&!this.appChatsManager.hasRights(n,"manage_topics"))return!1}const i=this.appChatsManager.getChat(n);return this.appChatsManager.hasRights(n,a,void 0,!!t)&&(!i.pFlags.left||!!t)}return this.appUsersManager.canSendToUser(e)}finalizePendingMessage(e,t){const a=this.pendingByRandomId[e];if(!a)return;const{peerId:s,tempId:n,threadId:i,storage:r}=a;[this.getHistoryStorage(s),i?this.getHistoryStorage(s,i):void 0].filter(Boolean).forEach((e=>{e.history.delete(n)}));const o=this.getMessageFromStorage(r,n);return o&&(delete t.pFlags.is_outgoing,delete t.pending,delete t.error,delete t.random_id,delete t.send),this.rootScope.dispatchEvent("messages_pending"),delete this.pendingByRandomId[e],this.finalizePendingMessageCallbacks(r,n,t),o}finalizePendingMessageCallbacks(e,t,a){const s=this.tempFinalizeCallbacks[t];if(void 0!==s){for(const e in s){const{deferred:t,callback:n}=s[e];n(a).then(t.resolve,t.reject)}delete this.tempFinalizeCallbacks[t]}if(a.media){(0,ue.Z)(a);const{photo:e,document:s}=a.media;if(e){const a=this.appPhotosManager.getPhoto(""+t);if(a){const t=e.sizes[e.sizes.length-1],s=this.thumbsStorage.getCacheContext(e,t.type),n=this.thumbsStorage.getCacheContext(a,o.Pt);Object.assign(s,n);const i=e.sizes[e.sizes.length-1],r=(0,Vt.Z)(e,i);(0,ct.P)(r.location)}}else if(s){const e=this.appDocsManager.getDoc(""+t);if(e){const t=this.thumbsStorage.getCacheContext(e);if(e.type&&"sticker"!==e.type&&"image/gif"!==e.mime_type&&t.url){const e=this.thumbsStorage.getCacheContext(s);Object.assign(e,t),n=s,(0,ct.P)((0,ft.Z)(n,undefined),{fileName:n.file_name})}}}else a.media.poll&&(delete this.appPollsManager.polls[t],delete this.appPollsManager.results[t])}var n;const i=this.getMessageFromStorage(e,t);e.delete(t),!i.reply_markup&&a.reply_markup&&setTimeout((()=>{this.getMessageFromStorage(e,a.mid)&&this.rootScope.dispatchEvent("message_edit",{storageKey:e.key,peerId:a.peerId,mid:a.mid,message:a})}),0),this.handleReleasingMessage(i,e),this.rootScope.dispatchEvent("message_sent",{storageKey:e.key,tempId:t,tempMessage:i,mid:a.mid,message:a})}incrementMaxSeenId(e){if(!e||this.maxSeenId&&!(e>this.maxSeenId))return!1;this.maxSeenId=e,this.appStateManager.pushToState("maxSeenMsgId",e),this.apiManager.invokeApi("messages.receivedMessages",{max_id:(0,oe.Z)(e)})}getMessageReactionsListAndReadParticipants(e,t,a,s,n,i){var r,o;return Yt(this,void 0,void 0,(function*(){const p={reactions:[],count:0,next_offset:void 0},d=yield this.canViewMessageReadParticipants(e);return d&&void 0===t?t=100:void 0===t&&(t=50),Promise.all([!d||a||n?[]:this.getMessageReadParticipants(e.peerId,e.mid).catch((()=>[])),(null===(o=null===(r=e.reactions)||void 0===r?void 0:r.recent_reactions)||void 0===o?void 0:o.length)&&!i?this.appReactionsManager.getMessageReactionsList(e.peerId,e.mid,t,a,s).catch((e=>p)):p]).then((([e,t])=>{const a=e.map((e=>e.toPeerId())),s=a.slice();(0,ne.Z)(s,((e,a,s)=>{t.reactions.some((t=>this.appPeersManager.getPeerId(t.peer_id)===e))&&s.splice(a,1)}));let n=t.reactions.map((e=>({peerId:this.appPeersManager.getPeerId(e.peer_id),reaction:e.reaction})));return n=n.concat(s.map((e=>({peerId:e})))),{reactions:t.reactions,reactionsCount:t.count,readParticipants:a,combined:n,nextOffset:t.next_offset}}))}))}getMessageReadParticipants(e,t){return this.apiManager.invokeApiSingle("messages.getMessageReadParticipants",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((e=>e.map((e=>e.toUserId()))))}canViewMessageReadParticipants(e){return Yt(this,void 0,void 0,(function*(){if("message"!==(null==e?void 0:e._)||e.pFlags.is_outgoing||!e.pFlags.out||!this.appPeersManager.isAnyGroup(e.peerId))return!1;const t=this.appChatsManager.getChat(e.peerId.toChatId()),a=yield this.apiManager.getAppConfig();return t.participants_count<=a.chat_read_mark_size_threshold&&(0,te.Z)(!0)-e.date(0,oe.Z)(e))),increment:!0}).then((a=>{const s=new Array(t.length);for(let n=0,i=t.length;n{const{chatPeerIds:t}=e.state;return t[t.length-1]===a}));!n&&s.length&&(s.sort(((e,t)=>e.state.idleStartTime-t.state.idleStartTime)),n=s[0].state.idleStartTime?s[s.length-1]:s[0]),f.Z.getInstance().invokeVoid("notificationBuild",Object.assign({message:e},t),null==n?void 0:n.source)}getScheduledMessagesStorage(e){var t,a;return null!==(t=(a=this.scheduledMessagesStorage)[e])&&void 0!==t?t:a[e]=this.createMessageStorage(e,"scheduled")}getScheduledMessageByPeer(e,t){return this.getMessageFromStorage(this.getScheduledMessagesStorage(e),t)}getScheduledMessages(e){if(!this.canSendToPeer(e))return;const t=this.getScheduledMessagesStorage(e);return t.size?[...t.keys()]:this.apiManager.invokeApiSingle("messages.getScheduledHistory",{peer:this.appPeersManager.getInputPeerById(e),hash:""}).then((t=>{if("messages.messagesNotModified"!==t._){this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.saveApiChats(t.chats);const a=this.getScheduledMessagesStorage(e);return this.saveMessages(t.messages,{storage:a,isScheduled:!0}),[...a.keys()]}return[]}))}sendScheduledMessages(e,t){return this.apiManager.invokeApi("messages.sendScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}deleteScheduledMessages(e,t){return this.apiManager.invokeApi("messages.deleteScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getMessageWithReplies(e){return this.filterMessages(e,(e=>!!e.replies))[0]}getMessageWithCommentReplies(e){if(e.peerId!==o.hj){const t=null==(e=this.getMessageWithReplies(e))?void 0:e.replies;if(!t||!t.pFlags.comments||t.channel_id.toChatId()===o.IA)return}return e}isFetchIntervalNeeded(e){return e.isAnyChat()&&(!this.appChatsManager.isInChat(e.toChatId())||this.appChatsManager.isForum(e.toChatId()))}getNewHistory(e,t){var a;return Yt(this,void 0,void 0,(function*(){if(!this.isFetchIntervalNeeded(e))return;const s=this.getHistoryStorage(e,t),n=s.history.slice;if(!n.isEnd(se.D.Bottom))return;delete s.maxId,n.unsetEnd(se.D.Bottom);const i=yield this.getHistory(e,null!==(a=n[0])&&void 0!==a?a:1,0,50,t);for(let t=0,a=i.history.length;t{const e=i.history.sliceMe(t,r,a),s=(null==e?void 0:e.slice)||i.history.constructSlice();return{count:i.count,history:Array.from(s),isEnd:s.getEnds(),offsetIdOffset:(null==e?void 0:e.offsetIdOffset)||i.count}})):{count:i.count,history:Array.from(o.slice),isEnd:o.slice.getEnds(),offsetIdOffset:o.offsetIdOffset}}isHistoryResultEnd(e,t,a){const{offset_id_offset:s,messages:n}=e,i=e.count||n.length,r=s||0,o=a<0?t+a:t;return{count:i,offsetIdOffset:r,isTopEnd:r>=i-o||ie.mid));if(a&&(0,oe.Z)(a)&&!c.includes(a)&&pc[e]);++e);c.splice(e,0,a)}const l=e.insertSlice(c)||e.slice;return d&&l.setEnd(se.D.Top),f&&l.setEnd(se.D.Bottom),Object.assign({slice:l,mids:c,messages:i},r)}fillHistoryStorage(e,t,a,s,n,i){const r=n.maxId;return this.requestHistory(e,t,a,s,void 0,i).then((i=>{const{count:o,isBottomEnd:p,slice:d,messages:f}=this.mergeHistoryResult(n.history,i,t,a,s);n.count=o;for(let t=0,a=f.length;t{d.ZP&&this.log("requestHistory result:",e,r,t,a,s),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages),"pts"in r&&this.apiUpdatesManager.addChannelState(e.toChatId(),r.pts);let o=r.messages.length,p=r.count;o&&!r.messages[o-1]&&(r.messages.splice(o-1,1),o--,p--);const f=this.getHistoryStorage(e,i),c=r.messages[o-1];if(o&&c.grouped_id){const t=f.history.findSlice(c.mid);if(t&&t.slice.length+r.messages.lengthr))}return r}),(t=>{if("CHANNEL_PRIVATE"===t.type){let t=this.appChatsManager.getChat(e.toChatId());"channel"===t._&&(t={_:"channelForbidden",id:e.toChatId(),access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}),this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t}))}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=(0,P.Z)(0).then((()=>{const e=[];for(const[t,a]of this.needSingleMessages){const s=[...a.keys()],n=s.map((e=>({_:"inputMessageID",id:(0,oe.Z)(e)})));let i;i=t.isAnyChat()&&this.appPeersManager.isChannel(t)?this.apiManager.invokeApiSingle("channels.getMessages",{channel:this.appChatsManager.getChannelInput(t.toChatId()),id:n}):this.apiManager.invokeApiSingle("messages.getMessages",{id:n});const r=i.then((e=>{(0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=this.saveMessages(e.messages);for(let e=0;e{this.rootScope.dispatchEvent("messages_downloaded",{peerId:t,mids:s})}));e.push(r)}return this.needSingleMessages.clear(),Promise.all(e).then(jt.Z,jt.Z).then((()=>{this.fetchSingleMessagesPromise=void 0,this.needSingleMessages.size&&this.fetchSingleMessages()}))}))}reloadMessages(e,t,a){if(Array.isArray(t))return Promise.all(t.map((t=>this.reloadMessages(e,t,a))));const s=this.getMessageByPeer(e,t);if(s&&!a)return this.rootScope.dispatchEvent("messages_downloaded",{peerId:e,mids:[t]}),Promise.resolve(s);{let a=this.needSingleMessages.get(e);a||this.needSingleMessages.set(e,a=new Map);let s=a.get(t);return s||(s=(0,v.Z)(),a.set(t,s),this.fetchSingleMessages(),s)}}getExtendedMedia(e,t){let a=this.extendedMedia.get(e);a||this.extendedMedia.set(e,a=new Map);const s=(0,v.Z)(),n=[],i=t.map((t=>{let i=a.get(t);return i||(a.set(t,i=s),n.push(t),i.then((()=>{a.delete(t),a.size||this.extendedMedia.get(e)!==a||this.extendedMedia.delete(e)}))),i}));return n.length?this.apiManager.invokeApi("messages.getExtendedMedia",{peer:this.appPeersManager.getInputPeerById(e),id:n.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),s.resolve()})):s.resolve(),Promise.all(i)}fetchMessageReplyTo(e){if(!e.reply_to_mid)return Promise.resolve(this.generateEmptyMessage(0));const t=e.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(e.reply_to.reply_to_peer_id):e.peerId;return this.reloadMessages(t,e.reply_to_mid).then((t=>{if(t||delete(e=this.getMessageByPeer(e.peerId,e.mid)).reply_to_mid,"messageService"===e._){const t=e.peerId;this.rootScope.dispatchEvent("message_edit",{storageKey:`${t}_history`,peerId:t,mid:e.mid,message:e}),this.isMessageIsTopMessage(e)&&this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[t,{dialog:this.getDialogOnly(t)}]]))}return t}))}getTypingKey(e,t){return t?`${e}_${t}`:e}setTyping(e,t,a,s){var n;s&&!this.appPeersManager.isForum(e)&&(s=void 0);const i=this.getTypingKey(e,s);let r=this.typings[i];return e&&this.canSendToPeer(e)&&e!==this.appPeersManager.peerId&&(a||(null===(n=null==r?void 0:r.action)||void 0===n?void 0:n._)!==t._)?((null==r?void 0:r.timeout)&&clearTimeout(r.timeout),r=this.typings[i]={action:t},this.apiManager.invokeApi("messages.setTyping",{peer:this.appPeersManager.getInputPeerById(e),action:t,top_msg_id:s?(0,oe.Z)(s):void 0}).finally((()=>{r===this.typings[i]&&(r.timeout=E.Z.setTimeout((()=>{delete this.typings[i]}),6e3))}))):Promise.resolve(!1)}handleReleasingMessage(e,t){const a=e.media;if(a){const s=a.webpage||a,n=s.photo||s.document;if((null==n?void 0:n.file_reference)&&this.referenceDatabase.deleteContext(n.file_reference,{type:"message",peerId:e.peerId,messageId:e.mid}),"webpage"in a&&a.webpage){const s=this.getScheduledMessagesStorage(e.peerId)===t,n=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,s);this.appWebPagesManager.deleteWebPageFromPending(a.webpage,n)}a.poll&&this.appPollsManager.updatePollToMessage(e,!1)}}handleDeletedMessages(e,t,a){const s={count:0,unread:0,unreadMentions:0,msgs:new Set};for(const n of a){const a=this.getMessageFromStorage(t,n);if(!a){this.fixDialogUnreadMentionsIfNoMessage(e);continue}this.handleReleasingMessage(a,t),this.updateMessageRepliesIfNeeded(a),a.pFlags.out||a.pFlags.is_outgoing||!a.pFlags.unread||(++s.unread,this.rootScope.dispatchEvent("notification_cancel","msg"+n),a.pFlags.mentioned&&(++s.unreadMentions,this.modifyCachedMentions(e,n,!1))),++s.count,s.msgs.add(n),a.deleted=!0;const i=a.grouped_id;if(i){const e=this.groupedMessagesStorage[i];e&&(e.delete(n),s.albums||(s.albums={}),(s.albums[i]||(s.albums[i]=new Set)).add(n),e.size||(delete s.albums,delete this.groupedMessagesStorage[i]))}t.delete(n)}if(s.albums)for(const e in s.albums)this.dispatchAlbumEdit(e,t,[...s.albums[e]]);return s}handleEditedMessage(e,t,a){var s;if("message"===e._){if(null===(s=e.media)||void 0===s?void 0:s.webpage){const t=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,!!e.pFlags.is_scheduled);this.appWebPagesManager.deleteWebPageFromPending(e.media.webpage,t)}const t=e.grouped_id;t&&this.dispatchAlbumEdit(t,a,[])}}dispatchAlbumEdit(e,t,a){const s=this.getMidsByAlbum(e).map((e=>this.getMessageFromStorage(t,e)));this.rootScope.dispatchEvent("album_edit",{peerId:s[0].peerId,groupId:e,deletedMids:a||[],messages:s})}getDialogUnreadCount(e){var t;let a=e.unread_count;if(!this.dialogsStorage.isTopic(e)&&this.appPeersManager.isForum(e.peerId)){const t=this.dialogsStorage.getForumUnreadCount(e.peerId);a=t instanceof Promise?0:t.count}return a||+!!(null===(t=e.pFlags)||void 0===t?void 0:t.unread_mark)}isDialogUnread(e){return!!this.getDialogUnreadCount(e)}canForward(e){return"message"===(null==e?void 0:e._)&&!e.pFlags.noforwards&&!this.appPeersManager.noForwards(e.peerId)}pushBatchUpdate(e,t,a,s){let n=this.batchUpdates[e];n||(n=this.batchUpdates[e]={callback:t,batch:new Map}),n.batch.has(a)||(n.batch.set(a,s?s():void 0),this.batchUpdatesDebounced())}getMessagesFromMap(e){const t=new Map;for(const[a,s]of e){const[e,n]=a.split("_"),i=this.getMessageByPeer(e.toPeerId(),+n);i&&t.set(i,s)}return t}saveDefaultSendAs(e,t){return this.appProfileManager.getCachedFullChat(e.toChatId()).default_send_as=this.appPeersManager.getOutputPeer(t),this.apiManager.invokeApi("messages.saveDefaultSendAs",{peer:this.appPeersManager.getInputPeerById(e),send_as:this.appPeersManager.getInputPeerById(t)})}}var aa=a(6724);function sa(e){const t=e.replace("input","");return t[0].toLowerCase()+t.slice(1)}class na extends G{constructor(){super(...arguments),this.peerSettings={notifyPeer:{},notifyUsers:null,notifyChats:null,notifyBroadcasts:null,notifyForumTopic:{}},this.checkMuteUntil=()=>{void 0!==this.checkMuteUntilTimeout&&(clearTimeout(this.checkMuteUntilTimeout),this.checkMuteUntilTimeout=void 0);const e=(0,te.Z)(!0);let t=o.rU;const a=a=>{if(a instanceof Promise)return!1;const s=a.mute_until;return!!s&&(s<=e?(a.mute_until=0,!0):(s{for(const t in this.peerSettings[e]){const s=this.peerSettings[e][t];if(a(s)){const[e,a]=t.split("_"),n=this.appPeersManager.getOutputPeer(e.toPeerId());this.apiUpdatesManager.saveUpdate({_:"updateNotifySettings",peer:a?{_:"notifyForumTopic",peer:n,top_msg_id:+a}:{_:"notifyPeer",peer:n},notify_settings:s})}}}));const s=Math.min(18e5,1e3*(t-e));this.checkMuteUntilTimeout=E.Z.setTimeout(this.checkMuteUntil,s)}}after(){return this.checkMuteUntilThrottled=(0,aa.Z)(this.checkMuteUntil,1e3,!1),this.apiUpdatesManager.addMultipleEventsListeners({updateNotifySettings:e=>{const{peer:t}=e,a="notifyForumTopic"===t._,s="notifyPeer"===t._||a,n=s&&this.appPeersManager.getPeerId(t.peer),i=s?void 0:t._;this.savePeerSettings({key:i,peerId:n,threadId:a?(0,pe.Z)(t.top_msg_id):void 0,settings:e.notify_settings}),this.rootScope.dispatchEvent("notify_settings",e)}}),this.appStateManager.getState().then((e=>{if(e.notifySettings)for(const t in e.notifySettings)(0,ue.Z)(t),this.savePeerSettings({key:t,settings:e.notifySettings[t]})}))}getNotifySettings(e){let t,a=sa(e._),s=this.peerSettings[a];return"inputNotifyPeer"===e._&&(t=a=this.appPeersManager.getPeerId(e.peer),s=s[a]),s||((s||this.peerSettings)[a]=this.apiManager.invokeApi("account.getNotifySettings",{peer:e}).then((e=>(this.savePeerSettings({key:a,peerId:t,settings:e}),e))))}getNotifyPeerTypeSettings(){if(this.getNotifyPeerTypePromise)return this.getNotifyPeerTypePromise;const e=["inputNotifyBroadcasts","inputNotifyUsers","inputNotifyChats"].map((e=>this.getNotifySettings({_:e})));return this.getNotifyPeerTypePromise=Promise.all(e)}updateNotifySettings(e,t){return this.apiManager.invokeApi("account.updateNotifySettings",{peer:e,settings:t}).then((a=>{a&&this.apiUpdatesManager.processLocalUpdate({_:"updateNotifySettings",peer:Object.assign(Object.assign({},e),{_:sa(e._)}),notify_settings:Object.assign(Object.assign({},t),{_:"peerNotifySettings"})})}))}getContactSignUpNotification(){return this.notifyContactsSignUp?this.notifyContactsSignUp:this.notifyContactsSignUp=this.apiManager.invokeApi("account.getContactSignUpNotification")}setContactSignUpNotification(e){this.apiManager.invokeApi("account.setContactSignUpNotification",{silent:e}).then((t=>{this.notifyContactsSignUp=Promise.resolve(!e)}))}getPeerKey(e,t){return e+(t?"_"+t:"")}savePeerSettings({key:e,peerId:t,threadId:a,settings:s}){let n;t&&(e=this.getPeerKey(t,a),n=this.peerSettings[a?"notifyForumTopic":"notifyPeer"]),(n||this.peerSettings)[e]=s,t?this.checkMuteUntilThrottled():(this.rootScope.dispatchEvent("notify_peer_type_settings",{key:e,settings:s}),this.appStateManager.getState().then((t=>{const a=t.notifySettings;a[e]=s,this.appStateManager.pushToState("notifySettings",a)})))}isMuted(e){return"peerNotifySettings"===e._&&(e.silent||void 0!==e.mute_until&&1e3*e.mute_until>(0,te.Z)())}getPeerMuted(e){const t=this.getNotifySettings({_:"inputNotifyPeer",peer:this.appPeersManager.getInputPeerById(e)});return(t instanceof Promise?t:Promise.resolve(t)).then((e=>this.isMuted(e)))}getPeerLocalSettings({peerId:e,respectType:t=!0,threadId:a}){const s={_:"peerNotifySettings"},n=this.getPeerKey(e,a),i=this.peerSettings[a?"notifyForumTopic":"notifyPeer"][n];if(!i||i instanceof Promise||Object.assign(s,i),t){const t=sa(this.appPeersManager.getInputNotifyPeerById({peerId:e,ignorePeerId:!0,threadId:a})._),n=this.peerSettings[t];if(n&&!(n instanceof Promise))for(const e in n)void 0===s[e]&&(s[e]=n[e])}return s}validatePeerSettings(e){if(e.peerId!==this.appPeersManager.peerId)return e.threadId&&!this.appPeersManager.isForum(e.peerId)&&(e.threadId=void 0),e}isPeerLocalMuted(e){if(!(e=this.validatePeerSettings(e)))return!1;if(e.threadId){const t=this.getPeerLocalSettings(Object.assign(Object.assign({},e),{respectType:!1}));return void 0!==t.silent||void 0!==t.mute_until?this.isMuted(t):this.isPeerLocalMuted(Object.assign(Object.assign({},e),{threadId:void 0}))}const t=this.getPeerLocalSettings(e);return this.isMuted(t)}}var ia=a(677),ra=a(617),oa=a(7361),pa=a(7419),da=a(7256);class fa extends G{get peerId(){return this.appUsersManager.userId.toPeerId()}canPinMessage(e){return e.isUser()||this.appChatsManager.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){const t=this.getPeer(e);return(0,da.Z)(t)}getPeerMigratedTo(e){if(e.isUser())return!1;const t=this.appChatsManager.getChat(e.toChatId()),a=null==t?void 0:t.migrated_to;return!(!a||!t.pFlags.deactivated)&&(0,le.Z)(a)}getOutputPeer(e){if(e.isUser())return{_:"peerUser",user_id:e.toUserId()};const t=e.toChatId();return this.appChatsManager.isChannel(t)?{_:"peerChannel",channel_id:t}:{_:"peerChat",chat_id:t}}getPeerString(e){return e.isUser()?this.appUsersManager.getUserString(e.toUserId()):this.appChatsManager.getChatString(e.toChatId())}getPeerUsername(e){return this.getPeerActiveUsernames(e)[0]||""}getPeerActiveUsernames(e){const t=this.getPeer(e);return(0,Jt.Z)(t)}getPeer(e){return e.isUser()?this.appUsersManager.getUser(e.toUserId()):this.appChatsManager.getChat(e.toChatId())}getPeerId(e){return(0,le.Z)(e)||(0,fe.Z)(e)&&"inputPeerSelf"===e._&&this.peerId||o.NM}getDialogPeer(e){return{_:"dialogPeer",peer:this.getOutputPeer(e)}}isChannel(e){return!e.isUser()&&this.appChatsManager.isChannel(e.toChatId())}isMegagroup(e){return!e.isUser()&&this.appChatsManager.isMegagroup(e.toChatId())}isForum(e){return!e.isUser()&&this.appChatsManager.isForum(e.toChatId())}isAnyGroup(e){return!e.isUser()&&!this.appChatsManager.isBroadcast(e.toChatId())}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isBot(e){return e.isUser()&&this.appUsersManager.isBot(e.toUserId())}isContact(e){return e.isUser()&&this.appUsersManager.isContact(e.toUserId())}isUser(e){return(0,ra.Z)(e)}isAnyChat(e){return(0,oa.Z)(e)}isPeerRestricted(e){return(0,pa.Z)(this.getPeer(e))}getRestrictionReasonText(e){const t=this.getPeer(e),a=t.restriction_reason?(0,ia.RP)(t.restriction_reason):void 0;return a?a.text:e.isUser()?"This user is restricted":"This chat is restricted"}getInputNotifyPeerById({peerId:e,ignorePeerId:t,threadId:a}){return t?e.isUser()?{_:"inputNotifyUsers"}:this.isBroadcast(e)?{_:"inputNotifyBroadcasts"}:{_:"inputNotifyChats"}:a?{_:"inputNotifyForumTopic",peer:this.getInputPeerById(e),top_msg_id:(0,oe.Z)(a)}:{_:"inputNotifyPeer",peer:this.getInputPeerById(e)}}getInputPeerById(e){if(!e)return{_:"inputPeerEmpty"};if(!e.isUser()){const t=e.toChatId();return this.appChatsManager.getInputPeer(t)}const t=e.toUserId();return this.appUsersManager.getUserInputPeer(t)}getInputPeerSelf(){return{_:"inputPeerSelf"}}getInputDialogPeerById(e){return{_:"inputDialogPeer",peer:(0,fe.Z)(e)?e:this.getInputPeerById(e)}}getPeerSearchText(e){let t;return t=this.isUser(e)?"%pu "+this.appUsersManager.getUserSearchText(e.toUserId()):"%pg "+(this.appChatsManager.getChat(e.toChatId()).title||""),t}getDialogType(e){return this.isMegagroup(e)?"megagroup":this.isChannel(e)?"channel":this.isUser(e)?e===this.peerId?"saved":"chat":"group"}getDeleteButtonText(e){switch(this.getDialogType(e)){case"channel":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"ChannelDelete":"ChatList.Context.LeaveChannel";case"megagroup":case"group":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"DeleteMega":"ChatList.Context.LeaveGroup";default:return"ChatList.Context.DeleteChat"}}noForwards(e){var t;return!e.isUser()&&!!(null===(t=this.appChatsManager.getChat(e.toChatId()).pFlags)||void 0===t?void 0:t.noforwards)}}class ca extends G{constructor(){super(...arguments),this.photos={}}savePhoto(e,t){var a;if(!e||"photoEmpty"===e._)return;const s=this.photos[e.id];if(e.file_reference&&(pt("file_reference",s,e),this.referenceDatabase.saveContext(e.file_reference,t)),null===(a=e.sizes)||void 0===a?void 0:a.length){e.sizes.sort(((e,t)=>(e.size||(e.sizes?1/0:0))-(t.size||(t.sizes?1/0:0))));const t=e.sizes[e.sizes.length-1];"photoSizeProgressive"===t._&&(t.size=t.sizes[t.sizes.length-1])}return s?Object.assign(s,e):this.photos[e.id]=e}getUserPhotos(e,t="0",a=20){const s=this.appUsersManager.getUserInput(e);return this.apiManager.invokeApiCacheable("photos.getUserPhotos",{user_id:s,offset:0,limit:a,max_id:t},{cacheSeconds:60}).then((a=>{this.appUsersManager.saveApiUsers(a.users);const s=a.photos.map(((t,s)=>(a.photos[s]=this.savePhoto(t,{type:"profilePhoto",peerId:e.toPeerId()}),t.id)));if("0"!==t&&t){const e=s.indexOf(t);-1!==e&&s.splice(e,1)}return{count:a.count||s.length,photos:s}}))}getPhoto(e){return(0,fe.Z)(e)?e:this.photos[e]}}class la extends G{constructor(){super(...arguments),this.polls={},this.results={},this.pollToMessages={},this.log=(0,I.kg)("POLLS",I.v9.Error)}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateMessagePoll:e=>{this.log("updateMessagePoll:",e);let t=e.poll||this.polls[e.poll_id];if(!t)return;let a=e.results;const s=this.savePoll(t,a);t=s.poll,a=s.results,this.rootScope.dispatchEvent("poll_update",{poll:t,results:a})}})}savePoll(e,t,a){a&&this.updatePollToMessage(a,!0);const s=e.id;return this.polls[s]?(e=Object.assign(this.polls[s],e),t=this.saveResults(e,t)):(this.polls[s]=e,e.chosenIndexes=[],t=this.saveResults(e,t)),{poll:e,results:t}}saveResults(e,t){var a;return this.results[e.id]?t=Object.assign(this.results[e.id],t):this.results[e.id]=t,t.pFlags.min||(e.chosenIndexes.length=0,(null===(a=null==t?void 0:t.results)||void 0===a?void 0:a.length)&&t.results.forEach(((t,a)=>{var s;(null===(s=t.pFlags)||void 0===s?void 0:s.chosen)&&e.chosenIndexes.push(a)}))),t}getPoll(e){return{poll:this.polls[e],results:this.results[e]}}getInputMediaPoll(e,t,a,s){return a?(s||(s=[]),a=(0,ke.Z)(a,s)):a=void 0,{_:"inputMediaPoll",poll:e,correct_answers:t,solution:a,solution_entities:a?s:void 0}}updatePollToMessage(e,t){const{id:a}=e.media.poll;let s=this.pollToMessages[a];if(!t&&!s)return;s||(s=this.pollToMessages[a]=new Set);const n=e.peerId+"_"+e.mid;t?s.add(n):s.delete(n),t||s.size||(delete this.polls[a],delete this.results[a],delete this.pollToMessages[a])}sendVote(e,t){const a=e.media.poll,s=t.map((e=>a.answers[e].option)),n=e.mid,i=e.peerId,r=this.appPeersManager.getInputPeerById(i);return e.pFlags.is_outgoing?this.appMessagesManager.invokeAfterMessageIsSent(n,"sendVote",(e=>(this.log("invoke sendVote callback"),this.sendVote(e,t)))):this.apiManager.invokeApi("messages.sendVote",{peer:r,msg_id:(0,oe.Z)(e.mid),options:s}).then((e=>{this.log("sendVote updates:",e),this.apiUpdatesManager.processUpdateMessage(e)}))}getResults(e){const t=this.appPeersManager.getInputPeerById(e.peerId);return this.apiManager.invokeApi("messages.getPollResults",{peer:t,msg_id:(0,oe.Z)(e.mid)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),this.log("getResults updates:",e)}))}getVotes(e,t,a,s=20){return this.apiManager.invokeApi("messages.getPollVotes",{peer:this.appPeersManager.getInputPeerById(e.peerId),id:(0,oe.Z)(e.mid),option:t,offset:a,limit:s}).then((e=>(this.log("getPollVotes messages:",e),this.appUsersManager.saveApiUsers(e.users),e)))}stopPoll(e){const t=e.media.poll;if(t.pFlags.closed)return Promise.resolve();const a=(0,ve.Z)(t);return a.pFlags.closed=!0,this.appMessagesManager.editMessage(e,void 0,{newMedia:this.getInputMediaPoll(a)}).then((()=>{}),(e=>{this.log.error("stopPoll error:",e)}))}}class ma extends G{constructor(){super(...arguments),this.privacy={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updatePrivacy:e=>{const t=e.key._;this.privacy[t]=e.rules,this.rootScope.dispatchEvent("privacy_update",e)}})}setPrivacy(e,t){return this.apiManager.invokeApi("account.setPrivacy",{key:{_:e},rules:t}).then((a=>(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),this.apiUpdatesManager.processLocalUpdate({_:"updatePrivacy",key:{_:sa(e)},rules:t.map((e=>{const t={};return Object.assign(t,e),t._=sa(t._),t}))}),a.rules)))}getPrivacy(e){const t=sa(e),a=this.privacy[t];return a?Promise.resolve(a):this.privacy[t]=this.apiManager.invokeApi("account.getPrivacy",{key:{_:e}}).then((e=>(this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.privacy[t]=e.rules)))}getGlobalPrivacySettings(){return this.apiManager.invokeApi("account.getGlobalPrivacySettings")}setGlobalPrivacySettings(e){return this.apiManager.invokeApi("account.setGlobalPrivacySettings",{settings:e})}}var ga=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const ha=18e4;class ua extends G{constructor(){super(...arguments),this.usersFull={},this.chatsFull={},this.fullExpiration={},this.onUpdateUserTyping=e=>{var t,a;const s=e.user_id?e.user_id.toPeerId():this.appPeersManager.getPeerId(e.from_id);if(this.appPeersManager.peerId===s||"speakingInGroupCallAction"===e.action._)return;const n=e.top_msg_id,i=n?(0,pe.Z)(n):void 0,r=this.appPeersManager.getPeerId(e),o=this.getTypingsKey(r,i),p=null!==(t=(a=this.typingsInPeer)[o])&&void 0!==t?t:a[o]=[];let d=p.find((e=>e.userId===s));const f=()=>{delete d.timeout;const e=p.indexOf(d);-1!==e&&p.splice(e,1),this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p}),p.length||delete this.typingsInPeer[o]};if(void 0!==(null==d?void 0:d.timeout)&&clearTimeout(d.timeout),"sendMessageCancelAction"===e.action._){if(!d)return;return void f()}d||(d={userId:s},p.push(d)),d.action=e.action;const c=this.appUsersManager.hasUser(s);c?this.appUsersManager.forceUserOnline(s):"updateChatUserTyping"===e._&&e.chat_id&&this.appChatsManager.hasChat(e.chat_id)&&!this.appChatsManager.isChannel(e.chat_id)&&Promise.resolve(this.getChatFull(e.chat_id)).then((()=>{void 0!==d.timeout&&this.appUsersManager.hasUser(s)&&this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p})})),d.timeout=E.Z.setTimeout(f,6e3),c&&this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p})},this.onUpdatePeerBlocked=e=>{const t=this.appPeersManager.getPeerId(e.peer_id);if(this.appPeersManager.isUser(t)){const a=t.toUserId(),s=this.usersFull[a];s&&(e.blocked?s.pFlags.blocked=!0:delete s.pFlags.blocked),this.rootScope.dispatchEvent("user_full_update",a)}this.rootScope.dispatchEvent("peer_block",{peerId:t,blocked:e.blocked})}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateChatParticipants:e=>{const t=e.participants;if("chatParticipants"===t._){const e=t.chat_id,a=this.chatsFull[e];void 0!==a&&(a.participants=t,this.rootScope.dispatchEvent("chat_full_update",e))}},updateChatParticipantAdd:e=>{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,a=s.length;t{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,n=s.length;t{var t,a;const s=this.chatsFull[e],n=this.appChatsManager.getChat(e);if(!s||!n)return;let i=!1;!!s.call!=!!(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)&&(i=!0);const{photo:r}=n;if(r){const e="chatPhotoEmpty"!==r._;(e!==!(!s.chat_photo||"photoEmpty"===s.chat_photo._)||e&&r.photo_id!==(null===(a=s.chat_photo)||void 0===a?void 0:a.id))&&(i=!0)}i&&this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("channel_update",(e=>{this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("chat_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!0))})),this.rootScope.addEventListener("user_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!1))})),this.rootScope.addEventListener("invalidate_participants",(e=>{this.invalidateChannelParticipants(e)})),this.typingsInPeer={}}getProfile(e,t){return this.usersFull[e]&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const a=t.full_user,s=e.toPeerId(!1);a.profile_photo&&(a.profile_photo=this.appPhotosManager.savePhoto(a.profile_photo,{type:"profilePhoto",peerId:s}));const n=a.bot_info;if(n){const t={type:"userFull",userId:e};n.description_document=this.appDocsManager.saveDoc(n.description_document,t),n.description_photo=this.appPhotosManager.savePhoto(n.description_photo,t)}return this.appNotificationsManager.savePeerSettings({peerId:s,settings:a.notify_settings}),this.usersFull[e]=a,this.fullExpiration[s]=Date.now()+ha,this.rootScope.dispatchEvent("user_full_update",e),a}})}getProfileByPeerId(e,t){return this.appPeersManager.isAnyChat(e)?this.getChatFull(e.toChatId(),t):this.getProfile(e.toUserId(),t)}getCachedFullChat(e){return this.chatsFull[e]}getCachedFullUser(e){return this.usersFull[e]}getCachedProfileByPeerId(e){return e.isUser()?this.getCachedFullUser(e.toUserId()):this.getCachedFullChat(e.toChatId())}getFullPhoto(e){return ga(this,void 0,void 0,(function*(){const t=yield this.getProfileByPeerId(e);switch(t._){case"userFull":return t.profile_photo;case"channelFull":case"chatFull":return t.chat_photo}}))}getChatFull(e,t){if(this.appChatsManager.isChannel(e))return this.getChannelFull(e,t);const a=e.toPeerId(!0),s=this.chatsFull[e];if(s&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo&&s.chat_photo.id&&(s.chat_photo=this.appPhotosManager.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),s.call&&this.appGroupCallsManager.saveGroupCall(s.call,e),this.appNotificationsManager.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,this.fullExpiration[a]=Date.now()+ha,this.rootScope.dispatchEvent("chat_full_update",e),s}})}getChatInviteLink(e,t){return ga(this,void 0,void 0,(function*(){const a=yield this.getChatFull(e);return!t&&a.exported_invite&&"chatInviteExported"==a.exported_invite._?a.exported_invite.link:this.apiManager.invokeApi("messages.exportChatInvite",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0))}).then((t=>(void 0!==this.chatsFull[e]&&(this.chatsFull[e].exported_invite=t),t.link)))}))}getChannelParticipants(e,t={_:"channelParticipantsRecent"},a=200,s=0){if("channelParticipantsRecent"===t._){const t=this.appChatsManager.getChat(e);if((null==t?void 0:t.pFlags)&&t.pFlags.broadcast&&!t.pFlags.creator&&!t.admin_rights)return Promise.reject()}return this.apiManager.invokeApiCacheable("channels.getParticipants",{channel:this.appChatsManager.getChannelInput(e),filter:t,offset:s,limit:a,hash:"0"},{cacheSeconds:60}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}getChannelParticipant(e,t){return this.apiManager.invokeApiSingle("channels.getParticipant",{channel:this.appChatsManager.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e.participant)))}getChannelFull(e,t){const a=e.toPeerId(!0);return void 0!==this.chatsFull[e]&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo.id&&(s.chat_photo=this.appPhotosManager.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),s.call&&this.appGroupCallsManager.saveGroupCall(s.call,e),this.appNotificationsManager.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,this.fullExpiration[a]=Date.now()+ha,this.rootScope.dispatchEvent("chat_full_update",e),s},processError:t=>{if("CHANNEL_PRIVATE"===t.type){const t=this.appChatsManager.getChat(e);this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e}],chats:["channelForbidden"===t._?t:{_:"channelForbidden",id:e,access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}],users:[]})}throw t}})}getMentions(e,t,a){const s=e=>{"@"===t.charAt(0)&&(t=t.slice(1));const a=new ae.Z({ignoreCase:!0}),s=new Map;e.forEach((e=>{a.indexObject(e.id,this.appUsersManager.getUserSearchText(e.id)),s.set(e.id,e.rating)}));const n=Array.from(a.search(t));return n.sort(((e,t)=>s.get(t)-s.get(e))),n};let n;return n=this.appChatsManager.isChannel(e)?this.getChannelParticipants(e,{_:"channelParticipantsMentions",q:t,top_msg_id:(0,oe.Z)(a)},50,0).then((e=>e.participants.map((e=>(0,xe.Z)(e))))):e?Promise.resolve(this.getChatFull(e)).then((e=>e.participants.participants.map((e=>e.user_id.toPeerId())))):Promise.resolve([]),Promise.all([this.appUsersManager.getTopPeers("bots_inline").catch((()=>[])),n]).then((e=>{const t=e[0].concat(e[1].map((e=>({id:e,rating:0}))));return s(t)}))}invalidateChannelParticipants(e){this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e)),this.refreshFullPeer(e.toPeerId(!0))}refreshFullPeer(e){if(e.isUser()){const t=e.toUserId();delete this.usersFull[t],this.rootScope.dispatchEvent("user_full_update",t)}else{const t=e.toChatId();delete this.chatsFull[t],this.rootScope.dispatchEvent("chat_full_update",t)}}updateProfile(e,t,a){return this.apiManager.invokeApi("account.updateProfile",{first_name:e,last_name:t,about:a}).then((e=>{if(this.appUsersManager.saveApiUser(e),void 0!==a){const t=e.id.toPeerId(),s=this.usersFull[e.id];s&&(s.about=a),this.rootScope.dispatchEvent("peer_bio_edit",t)}return this.getProfile(e.id,!0)}))}uploadProfilePhoto(e){return this.apiManager.invokeApi("photos.uploadProfilePhoto",{file:e}).then((e=>{const t=e.photo;if(!e.users.length){const a=t.sizes.find((e=>"photoStrippedSize"===e._));e.users.push(Object.assign(Object.assign({},this.appUsersManager.getSelf()),{photo:{_:"userProfilePhoto",dc_id:t.dc_id,photo_id:t.id,stripped_thumb:null==a?void 0:a.bytes,pFlags:{}}}))}this.appUsersManager.saveApiUsers(e.users);const a=this.appPeersManager.peerId;this.appPhotosManager.savePhoto(e.photo,{type:"profilePhoto",peerId:a});const s=a.toUserId();this.apiUpdatesManager.processLocalUpdate({_:"updateUser",user_id:s})}))}deletePhotos(e){return this.apiManager.invokeApiSingle("photos.deletePhotos",{id:e.map((e=>Ct(this.appPhotosManager.getPhoto(e))))}).then((e=>{}))}verifyParticipantForOnlineCount(e){const t=this.appUsersManager.getUser(e.user_id);return!(!t||!t.status||"userStatusOnline"!==t.status._)}reduceParticipantsForOnlineCount(e){return e.reduce(((e,t)=>e+ +this.verifyParticipantForOnlineCount(t)),0)}getOnlines(e){var t;return ga(this,void 0,void 0,(function*(){if(this.appChatsManager.isBroadcast(e))return 1;const a=yield this.getChatFull(e);if(this.appChatsManager.isMegagroup(e)){if(a.participants_count<=100){const t=yield this.getChannelParticipants(e,{_:"channelParticipantsRecent"},100);return this.reduceParticipantsForOnlineCount(t.participants)}const s=yield this.apiManager.invokeApiCacheable("messages.getOnlines",{peer:this.appChatsManager.getChannelInputPeer(e)},{cacheSeconds:60});return null!==(t=s.onlines)&&void 0!==t?t:1}const s=a.participants;return(null==s?void 0:s.participants)?this.reduceParticipantsForOnlineCount(s.participants):1}))}getTypingsKey(e,t){return e+(t?`_${t}`:"")}getPeerTypings(e,t){return this.typingsInPeer[this.getTypingsKey(e,t)]}}function ya(e,t){return e.some((e=>e instanceof Promise))?Promise.all(e).then(t):t(e)}var _a=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const va=["static_icon","appear_animation","select_animation","activate_animation","effect_animation","around_animation","center_icon"],Pa={type:"reactions"};class ba extends G{after(){this.rootScope.addEventListener("language_change",(()=>{this.availableReactions=void 0,this.getAvailableReactions()})),this.sendReactionPromises=new Map,this.lastSendingTimes=new Map,this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{Promise.resolve(this.getAvailableReactions()).then((e=>_a(this,void 0,void 0,(function*(){for(const t of e)yield Promise.all([t.around_animation&&this.apiFileManager.downloadMedia({media:t.around_animation}),t.static_icon&&this.apiFileManager.downloadMedia({media:t.static_icon}),t.appear_animation&&this.apiFileManager.downloadMedia({media:t.appear_animation}),t.center_icon&&this.apiFileManager.downloadMedia({media:t.center_icon})]),yield(0,P.Z)(1e3)}))))}),7500)}))}getAvailableReactions(){return this.availableReactions?this.availableReactions:this.apiManager.invokeApiSingleProcess({method:"messages.getAvailableReactions",processResult:e=>{(0,ue.Z)(e);const t=this.availableReactions=e.reactions;for(const e of t)for(const t of va)e[t]&&(e[t]=this.appDocsManager.saveDoc(e[t],Pa));return t},params:{hash:0}})}getActiveAvailableReactions(){return(0,q.Z)(this.getAvailableReactions(),(e=>e.filter((e=>!e.pFlags.inactive))))}getAvailableReactionsForPeer(e){const t=this.getActiveAvailableReactions();return e.isUser()?this.unshiftQuickReaction(t):ya([t,this.appProfileManager.getChatFull(e.toChatId()),this.getQuickReaction()],(([e,t,a])=>{var s;const n=null!==(s=t.available_reactions)&&void 0!==s?s:{_:"chatReactionsNone"};let i=[];return"chatReactionsAll"===n._?i=e:"chatReactionsSome"===n._&&(i=n.reactions.map((t=>e.find((e=>e.reaction===t.emoticon)))).filter(Boolean)),this.unshiftQuickReactionInner(i,a)}))}unshiftQuickReactionInner(e,t){if(t&&"reactionEmoji"!==t._&&"availableReaction"!==t._)return e;const a=t.emoticon||t.reaction,s=(0,Pe.Z)(e,(e=>e.reaction===a));return s&&e.unshift(s),e}unshiftQuickReaction(e,t=this.getQuickReaction()){return ya([e,t],(([e,t])=>this.unshiftQuickReactionInner(e,t)))}getAvailableReactionsByMessage(e){var t;if(!e)return[];const a=(null===(t=e.fwd_from)||void 0===t?void 0:t.channel_post)&&this.appPeersManager.isMegagroup(e.peerId)&&e.fwdFromId||e.peerId;return this.getAvailableReactionsForPeer(a)}isReactionActive(e){return!!this.availableReactions&&!!this.availableReactions.find((t=>t.reaction===e))}getQuickReaction(){return ya([this.apiManager.getConfig(),this.getAvailableReactions()],(([e,t])=>{const a=e.reactions_default;return"reactionEmoji"===(null==a?void 0:a._)?t.find((e=>e.reaction===a.emoticon)):a}))}getReactionCached(e){return this.availableReactions.find((t=>t.reaction===e))}getReaction(e){return(0,q.Z)(this.getAvailableReactions(),(()=>this.getReactionCached(e)))}getMessagesReactions(e,t){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessagesReactions",params:{id:t.map((e=>(0,oe.Z)(e))),peer:this.appPeersManager.getInputPeerById(e)},processResult:e=>{this.apiUpdatesManager.processUpdateMessage(e)}})}getMessageReactionsList(e,t,a,s,n){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessageReactionsList",params:{peer:this.appPeersManager.getInputPeerById(e),id:(0,oe.Z)(t),limit:a,reaction:s,offset:n},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),e)})}setDefaultReaction(e){return this.apiManager.invokeApi("messages.setDefaultReaction",{reaction:e}).then((t=>_a(this,void 0,void 0,(function*(){if(t){const t=yield this.apiManager.getConfig();t&&(t.reactions_default=e),this.rootScope.dispatchEvent("quick_reaction",e)}return t}))))}sendReaction(e,t,a){var s,n;return _a(this,void 0,void 0,(function*(){"availableReaction"===t._&&(t={_:"reactionEmoji",emoticon:t.reaction});const i=yield this.apiManager.getLimit("reactions"),r=e.peerId+"_"+e.mid;if(this.lastSendingTimes.get(r))return;this.lastSendingTimes.set(r,Date.now()),setTimeout((()=>{this.lastSendingTimes.delete(r)}),333);const{peerId:o,mid:p}=e,d=this.appPeersManager.peerId,f=e=>{--e.count,delete e.chosen_order,(0,Kt.Z)(t,e.reaction)&&(t=void 0),e.count||(0,M.Z)(l.results,e),l.recent_reactions&&(0,Pe.Z)(l.recent_reactions,(t=>(0,Kt.Z)(t.reaction,e.reaction)&&this.appPeersManager.getPeerId(t.peer_id)===d)),l.results.length||(l=void 0)},c=(null===(n=null===(s=e.reactions)||void 0===s?void 0:s.pFlags)||void 0===n?void 0:n.can_see_list)||!this.appPeersManager.isBroadcast(e.peerId)||e.peerId.isUser();e.reactions||(e.reactions={_:"messageReactions",results:[],recent_reactions:c?[]:void 0,pFlags:{can_see_list:c||void 0}});let l=a?e.reactions:(0,ve.Z)(e.reactions);const m=l.results.filter((e=>void 0!==e.chosen_order));m.sort(((e,t)=>t.chosen_order-e.chosen_order));const g=[],h=m.findIndex((e=>(0,Kt.Z)(e.reaction,t)));-1!==h&&g.push(...m.splice(h,1)),g.push(...m.splice(i-+(-1===h))),g.forEach((e=>{m.forEach((t=>{t.chosen_order>e.chosen_order&&--t.chosen_order})),f(e)}));const u=m.length;if(m.forEach(((e,t)=>{e.chosen_order=u-1-t})),t){l||(l={_:"messageReactions",results:[],pFlags:{}},c&&(l.pFlags.can_see_list=!0));let e=l.results.findIndex((e=>(0,Kt.Z)(e.reaction,t))),a=-1!==e&&l.results[e];if(a||(a={_:"reactionCount",count:0,reaction:t},e=l.results.push(a)-1),++a.count,a.chosen_order=m.length?m[0].chosen_order+1:0,m.unshift(a),!l.recent_reactions&&c&&(l.recent_reactions=[]),l.recent_reactions){const e={_:"messagePeerReaction",reaction:t,peer_id:this.appPeersManager.getOutputPeer(d)};this.appPeersManager.isMegagroup(o),l.recent_reactions.unshift(e),l.recent_reactions=l.recent_reactions.slice(0,3)}}const y=this.availableReactions;if(l&&(null==y?void 0:y.length)){const e=new Map;y.forEach(((t,a)=>{e.set(t.reaction,a)})),l.results.sort(((t,a)=>{var s,n;const i=t.reaction.document_id||t.reaction.emoticon,r=a.reaction.document_id||a.reaction.emoticon;return a.count-t.count||(null!==(s=e.get(i))&&void 0!==s?s:0)-(null!==(n=e.get(r))&&void 0!==n?n:0)}))}if(a)return e.reactions=l,this.rootScope.dispatchEvent("messages_reactions",[{message:e,changedResults:[]}]),Promise.resolve();this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:e.peer_id,msg_id:e.id,reactions:l,local:!0});const _=[o,p].join("-"),v=(0,oe.Z)(p),P=this.apiManager.invokeApi("messages.sendReaction",{peer:this.appPeersManager.getInputPeerById(o),msg_id:v,reaction:m.map((e=>e.reaction))}).then((e=>{(0,ue.Z)(e);const t=e.updates.findIndex((e=>"updateEditMessage"===e._||"updateEditChannelMessage"===e._));if(-1!==t){const a=e.updates[t];e.updates[t]={_:"updateMessageReactions",msg_id:v,peer:this.appPeersManager.getOutputPeer(o),reactions:a.message.reactions,pts:a.pts,pts_count:a.pts_count}}this.apiUpdatesManager.processUpdateMessage(e)})).catch((t=>{var a;"REACTION_INVALID"===t.type&&this.sendReactionPromises.get(_)===P&&this.sendReaction(e,null===(a=m[0])||void 0===a?void 0:a.reaction,!0)})).finally((()=>{this.sendReactionPromises.get(_)===P&&this.sendReactionPromises.delete(_)}));return this.sendReactionPromises.set(_,P),P}))}}var Ma=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Ia={EMOJI:"inputStickerSetAnimatedEmoji",EMOJI_ANIMATIONS:"inputStickerSetAnimatedEmojiAnimations",PREMIUM_GIFTS:"inputStickerSetPremiumGifts",GENERIC_ANIMATIONS:"inputStickerSetEmojiGenericAnimations",DEFAULT_STATUSES:"inputStickerSetEmojiDefaultStatuses",DEFAULT_TOPIC_ICONS:"inputStickerSetEmojiDefaultTopicIcons"},Sa=new Set(Object.values(Ia));class Ca extends G{constructor(){super(...arguments),this.storage=new W.Z(H.Z,"stickerSets"),this.processAllStickersResult=e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e)}after(){this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.sounds={},this.names={},this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{this.getAnimatedEmojiStickerSet()}),1e3),this.getGreetingStickersPromise||void 0!==this.getGreetingStickersTimeout||(this.getGreetingStickersTimeout=E.Z.setTimeout((()=>{this.getGreetingStickersTimeout=void 0,this.getGreetingSticker(!0)}),5e3))})),this.rootScope.addEventListener("app_config",(()=>this.onStickersUpdated("faved",!0))),this.apiUpdatesManager.addMultipleEventsListeners({updateNewStickerSet:e=>{const t=e.stickerset;this.saveStickerSet(t,t.set.id),this.rootScope.dispatchEvent("stickers_installed",t.set)},updateRecentStickers:()=>this.onStickersUpdated("recent",!0),updateFavedStickers:()=>this.onStickersUpdated("faved",!0),updateMoveStickerSetToTop:e=>{this.rootScope.dispatchEvent("stickers_top",e.stickerset)}})}onStickersUpdated(e,t){return Ma(this,void 0,void 0,(function*(){const a=yield"faved"===e?this.getFavedStickersStickers(t):this.getRecentStickersStickers(t);this.rootScope.dispatchEvent("stickers_updated",{type:e,stickers:a})}))}getGreetingSticker(e=!1){return this.getGreetingStickersTimeout&&(clearTimeout(this.getGreetingStickersTimeout),this.getGreetingStickersTimeout=void 0),this.getGreetingStickersPromise||(this.getGreetingStickersPromise=this.getStickersByEmoticon("👋⭐️",!1).then((e=>{if(!e.length)throw"NO_STICKERS";this.greetingStickers=e.slice(),this.greetingStickers.sort(((e,t)=>Math.random()-Math.random()))}))),this.getGreetingStickersPromise.then((()=>{let t;return e||(t=this.greetingStickers.shift(),this.greetingStickers.push(t)),this.apiFileManager.downloadMedia({media:this.greetingStickers[0]}),t}))}saveStickers(e){(0,ne.Z)(e,((t,a)=>{(t=this.appDocsManager.saveDoc(t))?e[a]=t:e.splice(a,1)}))}canUseStickerSetCache(e,t){var a;return e&&(null===(a=e.documents)||void 0===a?void 0:a.length)&&(Date.now()-e.refreshTime<36e5||t)}getStickerSet(e,t={}){let{id:a}=e;if(e.access_hash||(e=this.names[a]||e,a=e.id),this.getStickerSetPromises[a])return this.getStickerSetPromises[a];if(!t.overwrite){const e=this.storage.getFromCache(a);if(this.canUseStickerSetCache(e,t.useCache))return e}const s=this.getStickerSetPromises[a]=new Promise((n=>Ma(this,void 0,void 0,(function*(){if(!t.overwrite){const e=yield this.storage.get(a);if(this.canUseStickerSetCache(e,t.useCache))return this.saveStickers(e.documents),n(e),void(this.getStickerSetPromises[a]===s&&delete this.getStickerSetPromises[a])}try{const s=yield this.apiManager.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e),hash:0}),i=t.saveById?a:s.set.id;this.saveStickerSet(s,i),n(s)}catch(e){n(null)}this.getStickerSetPromises[a]===s&&delete this.getStickerSetPromises[a]}))));return s}getLocalStickerSet(e){return this.getStickerSet({id:e},{saveById:!0})}getAnimatedEmojiStickerSet(){return Promise.all([this.getLocalStickerSet(Ia.EMOJI),this.getLocalStickerSet(Ia.EMOJI_ANIMATIONS),this.getAnimatedEmojiSounds()]).then((([e,t])=>({emoji:e,animations:t})))}getAnimatedEmojiSounds(e){if(this.getAnimatedEmojiSoundsPromise&&!e)return this.getAnimatedEmojiSoundsPromise;const t=this.getAnimatedEmojiSoundsPromise=Promise.all([this.apiManager.getAppConfig(e),this.apiManager.getConfig()]).then((([e,a])=>{if(this.getAnimatedEmojiSoundsPromise===t)for(const t in e.emojies_sounds){const s=e.emojies_sounds[t],n=atob(s.file_reference_base64.replace(/-/g,"+").replace(/_/g,"/")),i=new Uint8Array(n.length);for(let e=0,t=i.length;e((0,ue.Z)(e),this.recentStickers=e.stickers,this.saveStickers(e.stickers),e),overwrite:e})}))}getRecentStickersStickers(e){if(e)this.recentStickers=void 0;else if(this.recentStickers)return this.recentStickers;return this.getRecentStickers(e).then((()=>this.recentStickers))}saveRecentSticker(e,t,a){const s=this.appDocsManager.getDoc(e);if((0,Pe.Z)(this.recentStickers,(t=>t.id===e)),!t){this.recentStickers.unshift(s);const e=(0,Pt.Z)(s.stickerEmojiRaw);for(const t in this.getStickersByEmoticonsPromises)this.getStickersByEmoticonsPromises[t].then((a=>{const n=(0,Pe.Z)(a,(e=>e.id===s.id));n?a.unshift(n):t.includes(e)&&a.unshift(s)}))}return this.rootScope.dispatchEvent("sticker_updated",{type:"recent",faved:!t,document:s}),t&&this.onStickersUpdated("recent",!1),this.apiManager.invokeApi("messages.saveRecentSticker",{id:zt(s),unsave:t,attached:a})}cleanEmoji(e){return e.replace(/\ufe0f/g,"").replace(/🏻|🏼|🏽|🏾|🏿/g,"")}getAnimatedEmojiSticker(e,t){const a=t?Ia.EMOJI_ANIMATIONS:Ia.EMOJI,s=this.storage.getFromCache(a);if(!(null==s?void 0:s.documents))return;t&&["🧡","💛","💚","💙","💜","🖤","🤍","🤎"].includes(e)&&(e="❤️"),e=this.cleanEmoji(e);const n=s.packs.find((t=>t.emoticon===e));return n?this.appDocsManager.getDoc(n.documents[0]):void 0}getAnimatedEmojiSoundDocument(e){return this.sounds[this.cleanEmoji(e)]}preloadAnimatedEmojiSticker(e){const t=this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e)));return Promise.all([t,this.preloadAnimatedEmojiStickerAnimation(e)]).then((([e,t])=>({doc:e,animation:null==t?void 0:t.doc,sound:null==t?void 0:t.sound})))}preloadAnimatedEmojiStickerAnimation(e){return this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e,!0))).then((t=>{if(!t)return;const a=this.getAnimatedEmojiSoundDocument(e);return Promise.all([this.preloadSticker(t.id),a?this.preloadSticker(a.id):void 0]).then((()=>({doc:t,sound:a})))}))}preloadSticker(e,t){var a;const s=this.appDocsManager.getDoc(e);return this.apiFileManager.downloadMedia({media:s,thumb:t?null===(a=s.video_thumbs)||void 0===a?void 0:a[0]:void 0})}saveStickerSet(e,t){const a={_:"messages.stickerSet",set:e.set,packs:e.packs,documents:e.documents,keywords:e.keywords};let s=this.storage.getFromCache(t);s?Object.assign(s,a):s=this.storage.setToCache(t,a),s.set.short_name&&(this.names[s.set.short_name]=this.getStickerSetInput(a.set)),this.saveStickers(e.documents);const n=s.set.installed_date||Sa.has(t);s.refreshTime=Date.now(),this.storage.set({[t]:s},!n)}getStickerSetThumbDownloadOptions(e){var t;const a=e.thumbs.find((e=>"photoSize"===e._)),s=e.thumb_dc_id,n=null===(t=e.pFlags)||void 0===t?void 0:t.animated;return{dcId:s,location:{_:"inputStickerSetThumb",stickerset:this.getStickerSetInput(e),thumb_version:e.thumb_version},size:a.size,mimeType:n?"application/x-tgsticker":"image/webp"}}getStickerSetInput(e){return Sa.has(e.id)?{_:e.id}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return Ma(this,void 0,void 0,(function*(){return(yield this.apiManager.invokeApiHashable({method:"messages.getFeaturedStickers",processResult:e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[],keywords:[]},e.set.id)})),e)})).sets}))}getPromoPremiumStickers(){return this.getStickersByEmoticon("⭐️⭐️",!1)}getPremiumStickers(){return this.getStickersByEmoticon("📂⭐️",!1)}getFavedStickers(e){return this.apiManager.invokeApiHashable({method:"messages.getFavedStickers",processResult:e=>((0,ue.Z)(e),this.saveStickers(e.stickers),this.favedStickers=e.stickers,e),overwrite:e})}getFavedStickersStickers(e){if(e)this.favedStickers=void 0;else if(this.favedStickers)return this.favedStickers;return this.getFavedStickers(e).then((()=>this.favedStickers))}getFavedStickersLimit(){return this.apiManager.getLimit("favedStickers")}faveSticker(e,t){return Ma(this,void 0,void 0,(function*(){this.favedStickers||(yield this.getFavedStickersStickers());const a=yield this.getFavedStickersLimit(),s=this.appDocsManager.getDoc(e);return(0,Pe.Z)(this.favedStickers,(e=>e.id===s.id)),t||(this.favedStickers.unshift(s),this.favedStickers.splice(a,this.favedStickers.length-a)),this.rootScope.dispatchEvent("sticker_updated",{type:"faved",faved:!t,document:s}),this.apiManager.invokeApi("messages.faveSticker",{id:zt(s),unfave:t}).then((()=>{t&&this.onStickersUpdated("faved",!0)}))}))}toggleStickerSet(e){return Ma(this,void 0,void 0,(function*(){if((e=this.storage.getFromCache(e.id).set).installed_date){if(yield this.apiManager.invokeApi("messages.uninstallStickerSet",{stickerset:this.getStickerSetInput(e)}))return delete e.installed_date,this.rootScope.dispatchEvent("stickers_deleted",e),this.storage.delete(e.id,!0),!0}else if(yield this.apiManager.invokeApi("messages.installStickerSet",{stickerset:this.getStickerSetInput(e),archived:!1}))return e.installed_date=Date.now()/1e3|0,this.rootScope.dispatchEvent("stickers_installed",e),!0;return!1}))}toggleStickerSets(e){return Promise.all(e.map((e=>this.toggleStickerSet(e))))}searchStickerSets(e,t=!0){return Ma(this,void 0,void 0,(function*(){const a=t?1:0,s=yield this.apiManager.invokeApiHashable({method:"messages.searchStickerSets",params:{flags:a,exclude_featured:t||void 0,q:e},processResult:e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[],keywords:[]},e.set.id)})),e)}),n=[],r=this.storage.getCache();for(const t in r){const{set:a}=r[t];a.title.toLowerCase().includes(e.toLowerCase())&&!s.sets.find((e=>e.set.id===a.id))&&n.push({_:"stickerSetCovered",set:a,cover:null})}return s.sets.concat(n)}))}getAllStickers(){return this.apiManager.invokeApiHashable({method:"messages.getAllStickers",processResult:this.processAllStickersResult})}getEmojiStickers(){return this.apiManager.invokeApiHashable({method:"messages.getEmojiStickers",processResult:this.processAllStickersResult})}preloadStickerSets(){return this.getAllStickers().then((e=>Promise.all(e.sets.map((e=>this.getStickerSet(e,{useCache:!0}))))))}getStickersByEmoticon(e,t=!0){return e=(0,Pt.Z)(e),this.getStickersByEmoticonsPromises[e]?this.getStickersByEmoticonsPromises[e]:this.getStickersByEmoticonsPromises[e]=Promise.all([this.apiManager.invokeApiHashable({method:"messages.getStickers",params:{emoticon:e},processResult:e=>e}),t?this.preloadStickerSets():[],t?this.getRecentStickers():void 0]).then((([t,a,s])=>{const n=t.stickers.map((e=>this.appDocsManager.saveDoc(e))),r=[],o=[],p=t=>{for(const a of t)if((0,Pt.Z)(a.emoticon).includes(e))for(const e of a.documents){const t=this.appDocsManager.getDoc(e);(t.animated?r:o).push(t)}};if(s){p(s.packs);const e=s.stickers;[r,o].forEach((t=>{t.sort(((t,a)=>e.indexOf(t)-e.indexOf(a)))}))}for(const e of a)p(e.packs);const d=[...new Set(r.concat(o,n))];return(0,ne.Z)(d,((e,t,a)=>{(3===e.sticker&&!i().IS_WEBM_SUPPORTED||!this.rootScope.premium&&(0,Wt.Z)(e))&&a.splice(t,1)})),d}))}clearRecentStickers(){return this.recentStickers&&(this.recentStickers.length=0,this.onStickersUpdated("recent",!1)),this.apiManager.invokeApi("messages.clearRecentStickers")}}var wa=a(467),ka=a(8493);class Aa extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.users={},this.usernames={};else for(const e in this.users){if(!e)continue;const t=e.toPeerId();if(!this.peersStorage.isPeerNeeded(t)){const t=this.users[e];this.modifyUsernamesCache(t,!1),this.storage.delete(e),delete this.users[e]}}this.getTopPeersPromises={},this.contactsIndex=this.createSearchIndex(),this.contactsFillPromise=void 0,this.contactsList=new Set,this.updatedContactsList=!1},this.updateUsersStatuses=()=>{const e=(0,te.Z)(!0);for(const t in this.users){const a=this.users[t];this.updateUserStatus(a,e)}}}after(){return this.clear(!0),setInterval(this.updateUsersStatuses,6e4),this.rootScope.addEventListener("state_synchronized",this.updateUsersStatuses),this.apiUpdatesManager.addMultipleEventsListeners({updateUserStatus:e=>{const t=e.user_id,a=this.users[t];a&&(a.status=e.status,a.status&&("expires"in a.status&&(a.status.expires-=this.timeManager.getServerTimeOffset()),"was_online"in a.status&&(a.status.was_online-=this.timeManager.getServerTimeOffset())),this.rootScope.dispatchEvent("user_update",t),this.setUserToStateIfNeeded(a))},updateUserName:e=>{const t=e.user_id,a=this.users[t];a&&(this.forceUserOnline(t),this.saveApiUser(Object.assign(Object.assign({},a),{first_name:e.first_name,last_name:e.last_name,username:void 0,usernames:e.usernames}),!0))}}),this.rootScope.addEventListener("language_change",(e=>{const t=this.getSelf().id;this.contactsIndex.indexObject(t,this.getUserSearchText(t))})),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("users")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.saveApiUsers(t);for(let a=0,s=t.length;a{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)||this.storage.set({[t]:this.getUser(t)})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)&&this.storage.delete(t)}))}))}get userId(){return this.rootScope.myId.toUserId()}onContactsModified(e){e&&this.appStateManager.pushToState("contactsListCachedTime",(0,te.Z)(!0))}pushRecentSearch(e){return this.appStateManager.getState().then((t=>{const a=t.recentSearch||[];if(a[0]!==e){(0,M.Z)(a,e),a.unshift(e),a.length>20&&(a.length=20),this.appStateManager.pushToState("recentSearch",a);for(const e of a)this.peersStorage.requestPeer(e,"recentSearch")}}))}clearRecentSearch(){return this.appStateManager.getState().then((e=>{const t=e.recentSearch||[];for(const e of t)this.peersStorage.releasePeer(e,"recentSearch");t.length=0,this.appStateManager.pushToState("recentSearch",t)}))}fillContacts(){var e;if(this.contactsFillPromise&&this.updatedContactsList)return{cached:this.contactsFillPromise.isFulfilled,promise:this.contactsFillPromise};this.updatedContactsList=!0;const t=(0,v.Z)();return this.apiManager.invokeApi("contacts.getContacts").then((e=>{"contacts.contacts"===e._&&(this.contactsList.clear(),this.saveApiUsers(e.users),e.contacts.forEach((e=>{this.pushContact(e.user_id)})),this.onContactsModified(!0),this.contactsFillPromise=t),t.resolve(this.contactsList)}),(()=>{this.updatedContactsList=!1})),{cached:null===(e=this.contactsFillPromise)||void 0===e?void 0:e.isFulfilled,promise:this.contactsFillPromise||(this.contactsFillPromise=t)}}resolveUsername(e){"@"===e[0]&&(e=e.slice(1)),e=e.toLowerCase();const t=this.usernames[e];return t?this.appPeersManager.getPeer(t):this.apiManager.invokeApiSingleProcess({method:"contacts.resolveUsername",params:{username:e},processResult:e=>this.processResolvedPeer(e)})}processResolvedPeer(e){return this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appPeersManager.getPeer((0,le.Z)(e.peer))}resolvePhone(e){return this.apiManager.invokeApi("contacts.resolvePhone",{phone:e}).then((e=>this.processResolvedPeer(e)))}pushContact(e){this.contactsList.add(e),this.contactsIndex.indexObject(e,this.getUserSearchText(e)),this.peersStorage.requestPeer(e.toPeerId(),"contact")}popContact(e){this.contactsList.delete(e),this.contactsIndex.indexObject(e,""),this.peersStorage.releasePeer(e.toPeerId(),"contact")}getUserSearchText(e){const t=this.users[e];return t?[t.first_name,t.last_name,t.phone,...(0,Jt.Z)(t),t.pFlags.self?"Saved Messages":""].filter(Boolean).join(" "):""}getContacts(e,t=!1,a="name"){return this.fillContacts().promise.then((s=>{let n=[...s];if(e){const t=this.contactsIndex.search(e);n=[...n].filter((e=>t.has(e)))}"name"===a?n.sort(((e,t)=>{const a=(this.users[e]||{}).sortName||"",s=(this.users[t]||{}).sortName||"";return a.localeCompare(s)})):"online"===a&&n.sort(((e,t)=>{const a=this.getUserStatusForSort(this.getUser(e).status);return this.getUserStatusForSort(this.getUser(t).status)-a}));const i=this.userId;return(0,M.Z)(n,i),t&&this.testSelfSearch(e)&&n.unshift(i),n}))}getContactsPeerIds(e,t,a,s){return this.getContacts(e,t,a).then((e=>{const t=e.map((e=>e.toPeerId(!1)));return s?t.slice(0,s):t}))}toggleBlock(e,t){return this.apiManager.invokeApiSingle(t?"contacts.block":"contacts.unblock",{id:this.appPeersManager.getInputPeerById(e)}).then((a=>(a&&this.apiUpdatesManager.processLocalUpdate({_:"updatePeerBlocked",peer_id:this.appPeersManager.getOutputPeer(e),blocked:t}),a)))}testSelfSearch(e){const t=this.getSelf(),a=this.createSearchIndex();return a.indexObject(t.id,this.getUserSearchText(t.id)),a.search(e).has(t.id)}createSearchIndex(){return new ae.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiUser(e,t))))}modifyUsernamesCache(e,t){const a=(0,Jt.Z)(e);if(!a.length)return;const s=a.map((e=>function(e){return e&&e.toLowerCase()||""}(e)));t?s.forEach((t=>{this.usernames[t]=e.id.toPeerId("user"!==e._)})):s.forEach((e=>{delete this.usernames[e]}))}setUsernameToCache(e,t){return!(t&&t.username===e.username&&(0,Y.Z)(t.usernames,e.usernames)||(this.modifyUsernamesCache(t,!1),this.modifyUsernamesCache(e,!0),0))}saveApiUser(e,t){var a,s,n,i;if(!e||"userEmpty"===e._)return;const r=e.id,o=this.users[r];if(null!==(a=e.pFlags)&&void 0!==a||(e.pFlags={}),e.pFlags.min&&void 0!==o)return;const p=this.setUsernameToCache(e,o);if(o&&void 0!==o.sortName&&o.first_name===e.first_name&&o.last_name===e.last_name)e.sortName=o.sortName;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":(0,wa.ZP)(t,!1)}if(e.status&&(e.status.expires&&(e.status.expires-=this.timeManager.getServerTimeOffset()),e.status.was_online&&(e.status.was_online-=this.timeManager.getServerTimeOffset())),"userProfilePhotoEmpty"===(null===(s=e.photo)||void 0===s?void 0:s._)&&delete e.photo,void 0===o)this.users[r]=e;else{const t=e.first_name!==o.first_name||e.last_name!==o.last_name||p,a=(null===(n=o.photo)||void 0===n?void 0:n.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id),s=o.pFlags.premium!==e.pFlags.premium||o.pFlags.verified!==e.pFlags.verified||o.pFlags.scam!==e.pFlags.scam||o.pFlags.fake!==e.pFlags.fake,d=!!o.pFlags.contact,f=!!e.pFlags.contact;re(o,e),this.rootScope.dispatchEvent("user_update",r),d!==f&&this.onContactUpdated(r,f,d),a&&this.rootScope.dispatchEvent("avatar_update",{peerId:e.id.toPeerId()}),(t||s)&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:e.id.toPeerId()})}this.checkPremium(e,o),this.setUserToStateIfNeeded(e)}checkPremium(e,t){if(e.pFlags.self){const a=!!e.pFlags.premium;this.rootScope.premium!==a&&this.rootScope.dispatchEvent("premium_toggle_private",{isNew:!t,isPremium:a})}}setUserToStateIfNeeded(e){this.peersStorage.isPeerNeeded(e.id.toPeerId())&&this.storage.set({[e.id]:e})}isUserOnlineVisible(e){return this.getUserStatusForSort(e)>3}getUserStatusForSort(e){if("object"!=typeof e){const t=this.getUser(e);e=null==t?void 0:t.status}if(e){const t="userStatusOnline"===e._?e.expires:"userStatusOffline"===e._?e.was_online:0;if(t)return t;switch(e._){case"userStatusRecently":return 3;case"userStatusLastWeek":return 2;case"userStatusLastMonth":return 1}}return 0}getUser(e){return(0,fe.Z)(e)?e:this.users[e]}getUserStatus(e){return this.isRegularUser(e)&&!this.users[e].pFlags.self&&this.users[e].status}getUserPhone(e){return t=this,a=void 0,n=function*(){const t=this.getUser(e);if(!(null==t?void 0:t.phone))return;const a=yield this.apiManager.getAppConfig();return{phone:t.phone,isAnonymous:a.fragment_prefixes.some((e=>t.phone.startsWith(e)))}},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}getSelf(){return this.getUser(this.userId)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}isAttachMenuBot(e){return this.isBot(e)&&!!this.users[e].pFlags.bot_attach_menu}isContact(e){return this.contactsList.has(e)||!(!this.users[e]||!this.users[e].pFlags.contact)}isRegularUser(e){const t=this.users[e];return t&&!this.isBot(e)&&!t.pFlags.deleted&&!t.pFlags.support}isNonContactUser(e){return this.isRegularUser(e)&&!this.isContact(e)&&e!==this.userId}hasUser(e,t){const a=this.users[e];return(0,fe.Z)(a)&&(t||!a.pFlags.min)}getUserString(e){const t=this.getUser(e);return"u"+e+(t.access_hash?"_"+t.access_hash:"")}getUserInput(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputUserSelf"}:{_:"inputUser",user_id:e,access_hash:t.access_hash}}getUserInputPeer(e){return{_:"inputPeerUser",user_id:e,access_hash:this.getUser(e).access_hash}}getContactMediaInput(e){const t=this.getUser(e);return{_:"inputMediaContact",first_name:t.first_name,last_name:t.last_name,phone_number:t.phone,vcard:"",user_id:e}}updateUserStatus(e,t=(0,te.Z)(!0)){e.status&&"userStatusOnline"===e.status._&&e.status.expires=60)return}else if(this.apiUpdatesManager.updatesState.syncLoading)return;const s=this.getUser(e);!(null==s?void 0:s.status)||"userStatusOnline"===s.status._||"userStatusEmpty"===s.status._||s.pFlags.support||s.pFlags.deleted||(s.status={_:"userStatusOnline",expires:a+60},this.rootScope.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(s))}importContact(e,t,a){return this.importContacts([{first_name:e,last_name:t,phones:[a]}]).then((e=>{if(!e.length){const e=new Error;throw e.type="NO_USER",e}return e[0]}))}importContacts(e){const t=[];for(let a=0;a(this.saveApiUsers(e.users),e.imported.map((e=>(this.onContactUpdated(e.user_id,!0),e.user_id))))))}getTopPeers(e){return this.getTopPeersPromises[e]?this.getTopPeersPromises[e]:this.getTopPeersPromises[e]=this.appStateManager.getState().then((t=>{const a=t.topPeersCache[e];return a&&a.cachedTime+864e5>Date.now()&&a.peers?a.peers:this.apiManager.invokeApi("contacts.getTopPeers",{[e]:!0,offset:0,limit:15,hash:"0"}).then((a=>{let s=[];return"contacts.topPeers"===a._&&(this.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),a.categories.length&&(s=a.categories[0].peers.map((e=>{const t=(0,le.Z)(e.peer);return this.peersStorage.requestPeer(t,"topPeer"),{id:t,rating:e.rating}})))),t.topPeersCache[e]={peers:s,cachedTime:Date.now()},this.appStateManager.pushToState("topPeersCache",t.topPeersCache),s}))}))}getBlocked(e=0,t=0){return this.apiManager.invokeApiSingle("contacts.getBlocked",{offset:e,limit:t}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{count:"contacts.blocked"===e._?e.users.length+e.chats.length:e.count,peerIds:e.users.map((e=>e.id.toPeerId())).concat(e.chats.map((e=>e.id.toPeerId(!0))))})))}getLocated(e,t,a,s=!1,n=0){const i={_:"inputGeoPoint",lat:e,long:t,accuracy_radius:a};return this.apiManager.invokeApi("contacts.getLocated",{geo_point:i,background:s}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e)))}searchContacts(e,t=20){const a=(0,Lt.Z)(e);if(a.length&&a[0].length===e.trim().length&&"messageEntityUrl"===a[0]._)try{const t=new URL(je(e).url).pathname.slice(1);t&&(e=t)}catch(e){}return this.apiManager.invokeApiCacheable("contacts.search",{q:e,limit:t},{cacheSeconds:60}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{my_results:(0,we.Z)(e.my_results.map((e=>(0,le.Z)(e)))),results:e.results.map((e=>(0,le.Z)(e)))})))}onContactUpdated(e,t,a=this.isContact(e)){t!==a&&(t?this.pushContact(e):this.popContact(e),this.onContactsModified(),this.rootScope.dispatchEvent("contacts_update",e))}updateUsername(e){return this.apiManager.invokeApi("account.updateUsername",{username:e}).then((e=>{this.saveApiUser(e)}))}setUserStatus(e,t){if(this.isBot(e))return;const a=this.users[e];if(a){const s=t?{_:"userStatusOffline",was_online:(0,te.Z)(!0)}:{_:"userStatusOnline",expires:(0,te.Z)(!0)+50};a.status=s,this.rootScope.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(a)}}updateMyOnlineStatus(e){return this.setUserStatus(this.getSelf().id,e),this.apiManager.invokeApiSingle("account.updateStatus",{offline:e})}addContact(e,t,a,s,n){return this.apiManager.invokeApi("contacts.addContact",{id:this.getUserInput(e),first_name:t,last_name:a,phone:s,add_phone_privacy_exception:n}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),this.onContactUpdated(e,!0)}))}deleteContacts(e){return this.apiManager.invokeApi("contacts.deleteContacts",{id:e.map((e=>this.getUserInput(e)))}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),e.forEach((e=>{this.onContactUpdated(e,!1)}))}))}checkUsername(e){return this.apiManager.invokeApi("account.checkUsername",{username:e})}toggleUsername(e,t){return this.apiManager.invokeApi("account.toggleUsername",{username:e,active:t})}reorderUsernames(e){return this.apiManager.invokeApi("account.reorderUsernames",{order:e})}canSendToUser(e){return(0,ka.Z)(this.getUser(e))}}const Da=new Set(["photo","video","gif","document"]);class Ua extends G{constructor(){super(...arguments),this.webpages={},this.pendingWebPages={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateWebPage:e=>{this.saveWebPage(e.webpage)}})}saveWebPage(e,t,a){var s,n;if("webPageNotModified"===e._||"webPageEmpty"===e._)return;const{id:i}=e,r=this.webpages[i],o=r&&r._===e._&&r.hash==r.hash;if("webPage"===e._){"photo"===(null===(s=e.photo)||void 0===s?void 0:s._)?e.photo=this.appPhotosManager.savePhoto(e.photo,a):delete e.photo,"document"===(null===(n=e.document)||void 0===n?void 0:n._)?e.document=this.appDocsManager.saveDoc(e.document,a):("document"===e.type&&delete e.type,delete e.document);const t=e.site_name,i=e.title||e.author||t||"";t&&i===t&&delete e.site_name,Da.has(e.type)||e.description||!e.photo||(e.type="photo")}let p=this.pendingWebPages[i];if(t&&(p||(p=this.pendingWebPages[i]=new Set),p.add(t)),void 0===r?this.webpages[i]=e:re(r,e),!t&&void 0!==p&&o){const e=[];p.forEach((t=>{const[a,s,n]=t.split("_");e.push({peerId:a.toPeerId(),mid:+s,isScheduled:!!n})})),this.rootScope.dispatchEvent("webpage_updated",{id:i,msgs:e})}return e}getMessageKeyForPendingWebPage(e,t,a){return e+"_"+t+(a?"_s":"")}deleteWebPageFromPending(e,t){const a=e.id;if(!a)return;const s=this.pendingWebPages[a];s&&s.has(t)&&(s.delete(t),s.size||delete this.pendingWebPages[a])}getCachedWebPage(e){return this.webpages[e]}getWebPage(e){return this.apiManager.invokeApiHashable({method:"messages.getWebPage",processResult:e=>this.saveWebPage(e),params:{url:e}})}}var Ta=a(5936),Ea=a(3019);function Fa(e){return(0,Ea.Z)(e,"readAsArrayBuffer")}var Ra=a(1243),xa=a(7086);function Ba(e){return encodeURIComponent(e).replace(/['()]/g,escape).replace(/\*/g,"%2A")}class Va{constructor(e,t){this.serviceMessagePort=e,this.downloadId=t,this.serviceMessagePort=Ws()}write(e,t){return a=this,s=void 0,i=function*(){return this.serviceMessagePort.invoke("downloadChunk",{id:this.downloadId,chunk:e})},new((n=void 0)||(n=Promise))((function(e,t){function r(e){try{p(i.next(e))}catch(e){t(e)}}function o(e){try{p(i.throw(e))}catch(e){t(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,o)}p((i=i.apply(a,s||[])).next())}));var a,s,n,i}finalize(e){return this.serviceMessagePort.invoke("downloadFinalize",this.downloadId).then((()=>{}))}}class Oa{getFile(e){return Promise.reject((0,X.Z)("NO_ENTRY_FOUND"))}prepareWriting({fileName:e,downloadId:t,size:a}){const s=Object.assign({"Content-Type":"application/octet-stream; charset=utf-8","Content-Disposition":"attachment; filename*=UTF-8''"+Ba(e)},a?{"Content-Length":a}:{}),n=Ws(),i=n.invoke("download",{headers:s,id:t}),r=(0,v.Z)();return r.cancel=()=>{r.reject((0,X.Z)("DOWNLOAD_CANCELED"))},r.catch((()=>{Ws().invoke("downloadCancel",t)})),i.then(r.resolve,r.reject),{deferred:r,getWriter:()=>new Va(n,t)}}}var La=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Na=131072,Za=new Set(["DOWNLOAD_CANCELED","UPLOAD_CANCELED","UNKNOWN","NO_NEW_CONTEXT"]);class ja extends G{constructor(){super(...arguments),this.cacheStorage=new Ta.Z("cachedFiles"),this.downloadStorage=new Oa,this.downloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.refreshReferencePromises={},this.log=(0,I.kg)("AFM",I.v9.Error|I.v9.Log),this.tempId=0,this.queueId=0,this.debug=b.Z.debug,this.maxUploadParts=4e3,this.maxDownloadParts=8e3,this.uncompressTGS=(e,t)=>this.cryptoWorker.invokeCrypto("gzipUncompress",e.slice().buffer,!1),this.uncompressTGV=(e,t)=>{const a=e.slice().buffer;return i().IS_FIREFOX?this.cryptoWorker.invokeCrypto("gzipUncompress",a,!0).then((e=>function(e){const t=e.indexOf("/,` width="${n}" height="${i}">`).replace(/[^\x00-\x7F]/g,"")}(e))).then((e=>(new TextEncoder).encode(e))):this.cryptoWorker.invokeCrypto("gzipUncompress",a,!1)},this.convertWebp=(e,t)=>f.Z.getInstance().invoke("convertWebp",{fileName:t,bytes:e}),this.convertOpus=(e,t)=>f.Z.getInstance().invoke("convertOpus",{fileName:t,bytes:e})}after(){setInterval((()=>{for(const e in this.refreshReferencePromises){const{deferred:t}=this.refreshReferencePromises[e];(t.isFulfilled||t.isRejected)&&delete this.refreshReferencePromises[e]}}),18e5),this.rootScope.addEventListener("config",(e=>{this.webFileDcId=e.webfile_dc_id})),this.rootScope.addEventListener("app_config",(e=>{this.maxUploadParts=this.rootScope.premium?e.upload_max_fileparts_premium:e.upload_max_fileparts_default,this.maxDownloadParts=e.upload_max_fileparts_premium}))}downloadRequest(e,t,a,s,n=0){void 0===this.downloadPulls[e]&&(this.downloadPulls[e]=[],this.downloadActives[e]=0);const i=this.downloadPulls[e],r=new Promise(((e,r)=>{i.push({id:t,queueId:n,cb:a,deferred:{resolve:e,reject:r},activeDelta:s})}));return setTimeout((()=>{this.downloadCheck(e)}),0),r}downloadCheck(e){const t=this.downloadPulls[e],a=this.rootScope.premium?224:36;if(this.downloadActives[e]>=a||!(null==t?void 0:t.length))return!1;const s=(0,Pe.Z)(t,(e=>0===e.queueId))||(0,Pe.Z)(t,(e=>e.queueId===this.queueId))||t.shift(),n=s.activeDelta||1;this.downloadActives[e]+=n;const i=s.cb();i.then((()=>{this.downloadActives[e]-=n,this.downloadCheck(e)}),(t=>{(null==t?void 0:t.type)&&Za.has(t.type)||this.log.error("downloadCheck error:",t),this.downloadActives[e]-=n,this.downloadCheck(e)})).finally((()=>{i.then(s.deferred.resolve,s.deferred.reject)}))}setQueueId(e){this.queueId=e}getFileStorage(){return this.cacheStorage}cancelDownload(e){const t=[this.downloadPromises[e],this.uploadPromises[e]].filter(Boolean);let a=!1;for(let e=0,s=t.length;eLa(this,void 0,void 0,(function*(){return null==r||r(),this.apiManager.invokeApi("upload.getWebFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0})}))),this.getDelta(s),i)}requestFilePart(e,t,a,s,n=0,i=0,r){return this.downloadRequest(e,n,(()=>La(this,void 0,void 0,(function*(){null==r||r();const n=()=>La(this,void 0,void 0,(function*(){var i;null==r||r();const o=null===(i=t.file_reference)||void 0===i?void 0:i.slice();return this.apiManager.invokeApi("upload.getFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0}).catch((e=>{if(null==r||r(),"FILE_REFERENCE_EXPIRED"===e.type)return this.refreshReference(t,o).then(n);throw e}))}));(0,ue.Z)(t);const i=t.file_reference;if(i&&!t.checkedReference){t.checkedReference=!0;const e=T(i);if(this.refreshReferencePromises[e])return this.refreshReference(t,i).then(n)}return n()}))),this.getDelta(s),i)}getDelta(e){return e/Na}getLimitPart(e,t){if(!e)return 524288;let a=Na;const s=t?this.maxUploadParts:this.maxDownloadParts,n=t?524288:1048576;for(;e/a>s&&a{a===T(t)&&e.reject((0,X.Z)("REFERENCE_IS_NOT_REFRESHED")),e.resolve(t)}),e.reject)}return s.deferred.then((t=>{e.file_reference=t}))}isDownloading(e){return!!this.downloadPromises[e]}getDownload(e){return this.downloadPromises[e]}getUpload(e){return this.uploadPromises[e]}getConvertMethod(e){let t;return"application/x-tgwallpattern"===e?(t=this.uncompressTGV,e="image/svg+xml"):"image/webp"!==e||i().IS_WEBP_SUPPORTED?"application/x-tgsticker"===e?(t=this.uncompressTGS,e="application/json"):"audio/ogg"!==e||i().IS_OPUS_SUPPORTED||(t=this.convertOpus,e="audio/wav"):(t=this.convertWebp,e="image/png"),{mimeType:e,process:t}}allocateDeferredPromises(e,t,a){const s=[];let n,i=e,r=Promise.resolve();do{n=(0,v.Z)(),s.push({offset:i,writePromise:r,writeDeferred:n}),r=n,i+=a}while(i{if(!(null==e?void 0:e.error))for(const a of M)e&&e!==a||(a.error=t,a.deferred.reject(t))},y=this.tempId++,_=e.limitPart||this.getLimitPart(s,!1);let v,P,b=m.getFile.bind(m);const M=[],I=s||_,S=(e,t)=>{const{deferred:a}=e,s=u.bind(null,e);a.cancel=()=>a.reject((0,X.Z)("DOWNLOAD_CANCELED")),a.catch((t=>{var a,n;s(t),null===(n=null===(a=e.writer)||void 0===a?void 0:a.truncate)||void 0===n||n.call(a)})).finally((()=>{this.downloadPromises[t]===a&&delete this.downloadPromises[t],delete e.writer})),this.downloadPromises[t]=a,M.push(e)};if(m&&(!g||I<=o.Iw)&&(v=m.prepareWriting(l,I,e.mimeType),S(v,l)),g){let t=e.fileName;if(!t){t=l;const a=gt[e.mimeType];a&&(t+="."+a)}P=g.prepareWriting({fileName:t,downloadId:r,size:I}),S(P,c),v&&P.deferred.catch((e=>v.deferred.reject(e)))}h=null!==(a=null==P?void 0:P.deferred)&&void 0!==a?a:v.deferred,g&&f&&(b=g.getFile.bind(g)),b(l).then((e=>La(this,void 0,void 0,(function*(){if(C(),P){const t=P.writer=P.getWriter();C();const a=yield function(e){return Fa(e).then((e=>new Uint8Array(e)))}(e);C(),yield t.write(a),C(),P.deferred.resolve(yield t.finalize())}v&&v.deferred.resolve(e)})))).catch((t=>La(this,void 0,void 0,(function*(){if(e.onlyCache)return void u(null,t);M.forEach((e=>{e.writer=e.getWriter()}));const a="inputWebFileLocation"===i._,r=(a?this.requestWebFilePart:this.requestFilePart).bind(this);a&&void 0===this.webFileDcId&&(yield this.apiManager.getConfig(),C());const p=this.allocateDeferredPromises(0,s,_),d={done:0,offset:0,total:s,fileName:c},m=()=>{try{C(),d.done=h,this.rootScope.dispatchEvent("download_progress",d)}catch(e){}},g=(0,aa.Z)(m,50,!0);let h=0;const v=()=>La(this,void 0,void 0,(function*(){const{offset:t,writePromise:a,writeDeferred:d}=p.shift();try{C();performance.now();const u=yield r(n,i,t,_,y,e.queueId,C),P=(performance.now(),u.bytes);p.length&&v();const b=P.byteLength;this.debug&&this.log("downloadFile requestFilePart result:",c,u);const I=t+_>=s||!b;if(b){h+=b,I?m():g();performance.now();yield a,C(),performance.now(),performance.now(),yield Promise.all(M.map((({writer:e})=>null==e?void 0:e.write(P,t)))),C()}if(I&&(!s||h{var t;return null===(t=null==e?void 0:e.trim)||void 0===t?void 0:t.call(e,h)})),I&&f){const e=M.filter((({writer:e})=>(null==e?void 0:e.getParts)&&e.replaceParts)).map((({writer:e})=>La(this,void 0,void 0,(function*(){const t=e.getParts(),a=yield f(t,l);e.replaceParts(a)}))));yield Promise.all(e),C()}if(d.resolve(),I){const e=h<=o.Iw;M.forEach((t=>{const{deferred:a,writer:s}=t;if(a.isFulfilled||a.isRejected||!s)return;const n=s.finalize(e);a.resolve(n)}))}}catch(e){u(null,e)}}));for(let e=0,t=Math.min(1/0,p.length);e{if(M.reduce(((e,t)=>e+ +!!t.error),0)===M.length)throw M[0].error};return h}downloadMedia(e){let{media:t,thumb:a}=e;const s="photo"===t._;if(s&&!a)return Promise.reject("preloadPhoto photoEmpty!");const n="document"===t._;n?t=this.appDocsManager.getDoc(t.id):s&&(t=this.appPhotosManager.getPhoto(t.id));const{fileName:i,downloadOptions:r}=(0,Ra.Z)(e);let o=this.getDownload(i);return o||(o=this.download(r),n&&!a&&(this.rootScope.dispatchEvent("document_downloading",t.id),o.then((()=>{this.rootScope.dispatchEvent("document_downloaded",t.id)})).catch(jt.Z))),o}downloadMediaURL(e){const{media:t,thumb:a}=e;let s=this.thumbsStorage.getCacheContext(t,null==a?void 0:a.type);return(!a||s.downloaded>=("size"in a?a.size:0))&&s.url?Promise.resolve(s.url):this.downloadMedia(e).then((e=>{if(!s.downloaded||s.downloaded=10485760,n=this.getLimitPart(a,!0),i=this.getDelta(n),r=Math.ceil(a/n),o=(0,Te.a)(),p={_:s?"inputFileBig":"inputFile",id:o,parts:r,name:t,md5_checksum:""},d=(0,v.Z)();if(r>this.maxUploadParts)return d.reject((0,X.Z)("FILE_TOO_BIG")),d;let f=!1,c=!1,l=e=>{"UPLOAD_CANCELED"!==(null==e?void 0:e.type)&&this.log.error("Up Error",e),d.reject(e),f=!0,l=jt.Z};const m=s?"upload.saveBigFilePart":"upload.saveFilePart",g=this.tempId++,h=this,u=function*(){let u=0,y=0;for(let v=0;vLa(this,void 0,void 0,(function*(){_();const i=e.slice(v,v+n),g=yield Fa(i);return _(),h.debug&&h.log("Upload file part, isBig:",s,P,g.byteLength,new Uint8Array(g).length,new Uint8Array(g).slice().length),h.apiManager.invokeApi(m,{file_id:o,file_part:P,file_total_parts:r,bytes:g},{fileUpload:!0}).then((()=>{if(f)return;++y;const e={done:y*n,offset:v,total:a,fileName:t};d.notify(e),y>=r&&(d.resolve(p),c=!0)}),l)}))),i).catch(l)}}(),y=()=>{if(f)return;const e=u.next();e.done||f||e.value.then(y)};for(let e=0,t=Math.min(1/0,r);e{if(f)throw(0,X.Z)("UPLOAD_CANCELED")};return d.cancel=()=>{f||c||(f=!0,l((0,X.Z)("UPLOAD_CANCELED")))},d.notify=e=>{this.rootScope.dispatchEvent("download_progress",e)},d.finally((()=>{this.uploadPromises[t]===d&&delete this.uploadPromises[t]})),this.uploadPromises[t]=d}}var qa=a(7487),Ga=a(6666),Ha=a(3306);class Wa extends G{constructor(){super(),this.hashes={},this.apiPromisesSingleProcess={},this.apiPromisesSingle={},this.apiPromisesCacheable={},this.afterMessageIdTemp=0}setUser(e){return this.setUserAuth(e.id)}invokeApiAfter(e,t={},a={}){let s=a;return s.prepareTempMessageId=""+ ++this.afterMessageIdTemp,s=Object.assign({},a),a.messageId=s.prepareTempMessageId,this.invokeApi(e,t,s)}invokeApiHashable(e){var t,a;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{params:s,options:n,method:i,overwrite:r}=e,o=JSON.stringify(s);let p;return this.hashes[i]&&(p=this.hashes[i][o],p&&(r?(delete this.hashes[i][o],p=void 0):s.hash=p.hash)),this.invokeApiSingleProcess({method:i,processResult:t=>{if(t._.includes("NotModified"))return p.result;if(t.hash){const e=t.hash;this.hashes[i]||(this.hashes[i]={}),p=this.hashes[i][o]={hash:e,result:t}}if(e.processResult){const a=e.processResult(t);return p?p.result=a:a}return t},params:s,options:n})}invokeApiSingle(e,t={},a={}){const s=e+"-"+JSON.stringify(t),n=this.apiPromisesSingle;return n[s]?n[s]:n[s]=this.invokeApi(e,t,a).finally((()=>{delete n[s]}))}invokeApiSingleProcess(e){var t,a,s;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{method:n,processResult:i,processError:r,params:o,options:p}=e,d=this.apiPromisesSingleProcess,f=p.cacheKey||JSON.stringify(o),c=null!==(s=d[n])&&void 0!==s?s:d[n]=new Map,l=c.get(f);if(l)return l;const m=()=>{const e=c.get(f);return e===h?void 0:e},g=this.invokeApi(n,o,p).then((e=>m()||i(e)),(e=>{const t=m();if(t)return t;if(!r)throw e;return r(e)})),h=g.finally((()=>{c.get(f)===h&&(c.delete(f),c.size||delete d[n])}));return c.set(f,h),h}invokeApiCacheable(e,t={},a={}){var s;const n=null!==(s=this.apiPromisesCacheable[e])&&void 0!==s?s:this.apiPromisesCacheable[e]={},i=JSON.stringify(t),r=n[i];if(r&&(!a.override||!r.fulfilled))return r.promise;let o;a.override&&(r&&r.timeout&&(clearTimeout(r.timeout),delete r.timeout),delete a.override),a.cacheSeconds&&(o=E.Z.setTimeout((()=>{delete n[i]}),1e3*a.cacheSeconds),delete a.cacheSeconds);const p=this.invokeApi(e,t,a);return n[i]={timestamp:Date.now(),fulfilled:!1,timeout:o,promise:p,params:t},p}clearCache(e,t){const a=this.apiPromisesCacheable[e];if(a)for(const e in a){const s=a[e];try{t(s.params)&&(s.timeout&&clearTimeout(s.timeout),delete a[e])}catch(e){}}}getConfig(e){return this.config&&!e?this.config:this.invokeApiSingleProcess({method:"help.getConfig",params:{},processResult:e=>(this.config=e,this.rootScope.dispatchEvent("config",e),e),options:{overwrite:e}})}getAppConfig(e){return this.appConfig&&!e?this.appConfig:this.invokeApiSingleProcess({method:"help.getAppConfig",params:{},processResult:e=>{var t;return this.appConfig=e,(0,ia.Ki)(null!==(t=e.ignore_restriction_reasons)&&void 0!==t?t:[]),this.rootScope.dispatchEvent("app_config",e),e},options:{overwrite:e}})}getLimit(e,t){return(0,q.Z)(this.getAppConfig(),(a=>{null!=t||(t=this.rootScope.premium);const s={pin:["dialogs_pinned_limit_default","dialogs_pinned_limit_premium"],folderPin:["dialogs_folder_pinned_limit_default","dialogs_folder_pinned_limit_premium"],folders:["dialog_filters_limit_default","dialog_filters_limit_premium"],favedStickers:["stickers_faved_limit_default","stickers_faved_limit_premium"],reactions:["reactions_user_max_default","reactions_user_max_premium"],bio:["about_length_limit_default","about_length_limit_premium"],topicPin:"topics_pinned_limit",caption:["caption_length_limit_default","caption_length_limit_premium"]}[e];return a[Array.isArray(s)?s[t?1:0]:s]}))}}var za=a(8453),Ka=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class Ja extends Wa{constructor(){super(),this.log=(0,I.kg)("API"),this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.afterMessageTempIds={},this.transportType=b.Z.transport,Z.addEventListener("transport",(e=>{this.changeTransportType(e)})),setInterval((()=>{this.getAppConfig(!0)}),997e4)}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateConfig:()=>{this.getConfig(!0),this.getAppConfig(!0)}}),this.rootScope.addEventListener("user_auth",(()=>{this.config&&this.apiUpdatesManager.processLocalUpdate({_:"updateConfig"})})),this.rootScope.addEventListener("premium_toggle",(e=>{this.iterateNetworkers((({networker:t,connectionType:a,dcId:s,transportType:n})=>{if("client"===a||"websocket"!==n)return;const i=t.transport;if(i){if(i.connection){const t=V(s,a,e);i.changeUrl(t)}}else this.log.error("wow what, no transport?",t)}))}))}getTransportType(e){return this.transportType}iterateNetworkers(e){for(const t in this.cachedNetworkers){const a=this.cachedNetworkers[t];for(const s in a){const n=a[s];for(const a in n)n[a].forEach(((n,i,r)=>{e({networker:n,dcId:+a,connectionType:s,transportType:t,index:i,array:r})}))}}}chooseServer(e,t,a){return this.dcConfigurator.chooseServer(e,t,a,"client"===t,this.rootScope.premium)}changeTransportType(e){const t=this.transportType;if(t===e)return;this.log("changing transport from",t,"to",e);const a=this.cachedNetworkers[t],s=this.cachedNetworkers[e];this.cachedNetworkers[e]=a,this.cachedNetworkers[t]=s,this.transportType=e;for(const a in this.gettingNetworkers){const s=this.gettingNetworkers[a];delete this.gettingNetworkers[a];const n=a.replace(t,e);this.gettingNetworkers[n]=s,this.log("changed networker getKey from",a,"to",n)}this.iterateNetworkers((e=>{const t=this.getTransportType(e.connectionType),a=this.chooseServer(e.dcId,e.connectionType,t);this.changeNetworkerTransport(e.networker,a)}))}getBaseDcId(){return Ka(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield qa.Z.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(_.Z.baseDcId)),this.baseDcId}))}setUserAuth(e){return Ka(this,void 0,void 0,(function*(){if("string"!=typeof e&&"number"!=typeof e||(e={dcID:0,date:Date.now()/1e3|0,id:e.toPeerId(!1)}),this.rootScope.dispatchEvent("user_auth",e),!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}qa.Z.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then((e=>{this.setOnDrainIfNeeded(e)})),this.baseDcId=e,qa.Z.set({dc:this.baseDcId})}logOut(){return Ka(this,void 0,void 0,(function*(){if(this.loggingOut)return;this.loggingOut=!0;const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map((e=>qa.Z.get(e)))),a=[];for(let e=0;eKa(this,void 0,void 0,(function*(){this.baseDcId=void 0,yield(0,za.Z)(!1,!0),Ga.C.closeDatabases(),this.rootScope.dispatchEvent("logging_out")}));return setTimeout(s,1e3),Promise.all(a).catch((e=>{e.handled=!0})).finally(s)}))}generateNetworkerGetKey(e,t,a){return[e,t,a].join("-")}getNetworker(e,t={}){const a=t.fileDownload?"download":t.fileUpload?"upload":"client",n=this.getTransportType(a);this.cachedNetworkers[n]||(this.cachedNetworkers[n]={client:{},download:{},upload:{}});const i=this.cachedNetworkers[n][a];e in i||(i[e]=[]);const r=i[e],o="client"===a||"https"===n?1:this.rootScope.premium?6:3;if(r.length>=o){let e=o-1,t=!1;for(;e>=0;--e)if(r[e].isOnline){t=!0;break}const a=r.splice(t?e:o-1,1)[0];return r.unshift(a),Promise.resolve(a)}let p=this.generateNetworkerGetKey(e,n,a);if(this.gettingNetworkers[p])return this.gettingNetworkers[p];const d=`dc${e}_auth_key`,f=`dc${e}_server_salt`;let c=this.chooseServer(e,a,n);return this.gettingNetworkers[p]=Promise.all([d,f].map((e=>qa.Z.get(e)))).then((([i,o])=>Ka(this,void 0,void 0,(function*(){let l,m;if(i&&512===i.length){o&&16===o.length||(o="AAAAAAAAAAAAAAAA");const a=(0,Ha.Z)(i),n=(yield s.Z.invokeCrypto("sha1",a)).slice(-8),r=(0,Ha.Z)(o);l=this.networkerFactory.getNetworker(e,a,n,r,t)}else try{const a=yield this.authorizer.auth(e);qa.Z.set({[d]:T(a.authKey),[f]:T(a.serverSalt)}),l=this.networkerFactory.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){m=e}const g=this.getTransportType(a);if(g!==n&&(p=this.generateNetworkerGetKey(e,g,a),c.destroy(),O.removeTransport(this.dcConfigurator.chosenServers,c),l&&(c=this.chooseServer(e,a,g)),this.log("transport has been changed during authorization from",n,"to",g)),delete this.gettingNetworkers[p],m)throw this.log("get networker error",m,m.stack),m;return this.changeNetworkerTransport(l,c),r.unshift(l),this.setOnDrainIfNeeded(l),l}))))}getNetworkerVoid(e){return this.getNetworker(e).then(jt.Z,jt.Z)}changeNetworkerTransport(e,t){const a=e.transport;a&&O.removeTransport(this.dcConfigurator.chosenServers,a),e.changeTransport(t)}onNetworkerDrain(e){this.log("networker drain",e.dcId),e.onDrain=void 0,this.changeNetworkerTransport(e),e.destroy(),this.networkerFactory.removeNetworker(e),O.removeTransport(this.cachedNetworkers,e)}setOnDrainIfNeeded(e){e.onDrain||(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then((t=>e.dcId!==t))).then((t=>{e.onDrain||t&&(e.onDrain=()=>this.onNetworkerDrain(e),e.setDrainTimeout())}))}setUpdatesProcessor(e){this.updatesProcessor=e,this.networkerFactory.setUpdatesProcessor(e)}invokeApi(e,t={},a={}){const s=(0,v.Z)();let n,i,{afterMessageId:r,prepareTempMessageId:o}=a;if(o&&s.then((()=>{delete this.afterMessageTempIds[o]})),d.GO){const n=Date.now(),r=E.Z.setInterval((()=>{i&&i.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-n)/1e3)}),5e3);s.catch(jt.Z).finally((()=>{clearInterval(r)}))}const p=(new Error).stack||"empty stack",f=()=>{if(r){const e=this.afterMessageTempIds[r];e&&(a.afterMessageId=e.messageId)}const p=i.wrapApiCall(e,t,a);return o&&(this.afterMessageTempIds[o]={messageId:a.messageId,promise:s}),p.catch((s=>{var i;if("FILE_REFERENCE_EXPIRED"!==s.type&&this.log.error("Error",s.code,s.type,this.baseDcId,n,e,t),401===s.code&&this.baseDcId===n)throw"SESSION_PASSWORD_NEEDED"!==s.type&&(qa.Z.delete("dc"),qa.Z.delete("user_auth")),s;if(401===s.code&&this.baseDcId&&n!==this.baseDcId){if(void 0===this.cachedExportPromise[n]){const e=new Promise(((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:n},{noErrorBox:!0}).then((a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:n,noErrorBox:!0}).then(e,t)}),t)}));this.cachedExportPromise[n]=e}return this.cachedExportPromise[n].then((()=>f()))}if(303!==s.code){if(400===s.code&&0===s.type.indexOf("FILE_MIGRATE")){const i=+s.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];if(i!==n)return a.dcId=i,this.invokeApi(e,t,a);throw s}if(400===s.code&&"CONNECTION_NOT_INITED"===s.type)return this.networkerFactory.unsetConnectionInited(),f();if(a.rawError||420!==s.code){if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(s.type)){const e=this.afterMessageTempIds[r];return r=void 0,delete a.afterMessageId,e?e.promise.then((()=>f())):f()}if(a.rawError||500!==s.code){if("UNKNOWN"===s.type||"MTPROTO_CLUSTER_INVALID"===s.type)return(0,P.Z)(1e3).then((()=>f()));throw s}{const e=Date.now();if(a.stopTime&&e>=a.stopTime)throw s;return a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,(0,P.Z)(1e3*a.waitTime).then((()=>f()))}}{const e=+s.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(null!==(i=a.floodMaxTimeout)&&void 0!==i?i:60)&&!a.prepareTempMessageId)throw s;return(0,P.Z)(1e3*e).then((()=>f()))}}{const i=+s.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];if(i!==n)return a.dcId?a.dcId=i:this.setBaseDcId(i),this.invokeApi(e,t,a)}}))};let c;return c=(n=a.dcId||this.baseDcId)?this.getNetworker(n,a):this.getBaseDcId().then((e=>this.getNetworker(n=e,a))),c.then((e=>{i=e;const t=f();return i.attachPromise(s,a),t})).then(s.resolve).catch((t=>Ka(this,void 0,void 0,(function*(){if(t?(0,fe.Z)(t)||(t={message:t}):t={type:"ERROR_EMPTY"},(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors)throw t;throw 406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=p||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout((()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)}),100)),t})))).catch(s.reject),s}}class $a{constructor(){this.neededPeers=new Map,this.singlePeerMap=new Map,this._constructor(!1)}after(){this.rootScope.addEventListener("user_auth",(()=>{this.requestPeer(this.appPeersManager.peerId,"self")}))}requestPeer(e,t){let a=this.neededPeers.get(e);a&&a.has(t)||(a||(a=new Set,this.neededPeers.set(e,a)),a.add(t),this.dispatchEvent("peerNeeded",e))}releasePeer(e,t){const a=this.neededPeers.get(e);a&&(a.delete(t),a.size||(this.neededPeers.delete(e),this.dispatchEvent("peerUnneeded",e)))}requestPeersForKey(e,t){Array.isArray(e)&&(e=new Set(e));let a=this.singlePeerMap.get(t);if(a){for(const s of a)e.has(s)||(this.releasePeer(s,t),a.delete(s));if(!a.size&&!e.size)return void this.singlePeerMap.delete(t)}if(e.size){a||(a=new Set,this.singlePeerMap.set(t,a));for(const s of e)a.has(s)||(this.requestPeer(s,t),a.add(s))}}isPeerNeeded(e){return this.neededPeers.has(e)}}Ae($a,[p.Z,G]);const Qa=$a,Ya=o.Pt;class Xa{constructor(){this.thumbsCache={}}getKey(e){var t;return e._+(null!==(t=e.id)&&void 0!==t?t:e.url)}getCacheContext(e,t=Ya){var a,s,n,i;const r=null!==(a=(n=this.thumbsCache)[i=this.getKey(e)])&&void 0!==a?a:n[i]={};return null!==(s=r[t])&&void 0!==s?s:r[t]={downloaded:0,url:"",type:t}}setCacheContextURL(e,t=Ya,a,s=0){const n=this.getCacheContext(e,t);return n.url=a,n.downloaded=s,n}deleteCacheContext(e,t=Ya){const a=this.thumbsCache[this.getKey(e)];a&&delete a[t]}}const es={MTProto:{constructors:[{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:85337187,predicate:"resPQ",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"pq",type:"bytes"},{name:"server_public_key_fingerprints",type:"Vector"}],type:"ResPQ"},{id:-1443537003,predicate:"p_q_inner_data_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"}],type:"P_Q_inner_data"},{id:1459478408,predicate:"p_q_inner_data_temp_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"},{name:"expires_in",type:"int"}],type:"P_Q_inner_data"},{id:-790100132,predicate:"server_DH_params_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_answer",type:"bytes"}],type:"Server_DH_Params"},{id:-1249309254,predicate:"server_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"g",type:"int"},{name:"dh_prime",type:"bytes"},{name:"g_a",type:"bytes"},{name:"server_time",type:"int"}],type:"Server_DH_inner_data"},{id:1715713620,predicate:"client_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"retry_id",type:"long"},{name:"g_b",type:"bytes"}],type:"Client_DH_Inner_Data"},{id:1003222836,predicate:"dh_gen_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash1",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1188831161,predicate:"dh_gen_retry",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash2",type:"int128"}],type:"Set_client_DH_params_answer"},{id:-1499615742,predicate:"dh_gen_fail",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash3",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1973679973,predicate:"bind_auth_key_inner",params:[{name:"nonce",type:"long"},{name:"temp_auth_key_id",type:"long"},{name:"perm_auth_key_id",type:"long"},{name:"temp_session_id",type:"long"},{name:"expires_at",type:"int"}],type:"BindAuthKeyInner"},{id:-212046591,predicate:"rpc_result",params:[{name:"req_msg_id",type:"long"},{name:"result",type:"Object"}],type:"RpcResult"},{id:558156313,predicate:"rpc_error",params:[{name:"error_code",type:"int"},{name:"error_message",type:"string"}],type:"RpcError"},{id:1579864942,predicate:"rpc_answer_unknown",params:[],type:"RpcDropAnswer"},{id:-847714938,predicate:"rpc_answer_dropped_running",params:[],type:"RpcDropAnswer"},{id:-1539647305,predicate:"rpc_answer_dropped",params:[{name:"msg_id",type:"long"},{name:"seq_no",type:"int"},{name:"bytes",type:"int"}],type:"RpcDropAnswer"},{id:155834844,predicate:"future_salt",params:[{name:"valid_since",type:"int"},{name:"valid_until",type:"int"},{name:"salt",type:"long"}],type:"FutureSalt"},{id:-1370486635,predicate:"future_salts",params:[{name:"req_msg_id",type:"long"},{name:"now",type:"int"},{name:"salts",type:"vector"}],type:"FutureSalts"},{id:880243653,predicate:"pong",params:[{name:"msg_id",type:"long"},{name:"ping_id",type:"long"}],type:"Pong"},{id:-501201412,predicate:"destroy_session_ok",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:1658015945,predicate:"destroy_session_none",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1631450872,predicate:"new_session_created",params:[{name:"first_msg_id",type:"long"},{name:"unique_id",type:"long"},{name:"server_salt",type:"long"}],type:"NewSession"},{id:1945237724,predicate:"msg_container",params:[{name:"messages",type:"vector<%Message>"}],type:"MessageContainer"},{id:1538843921,predicate:"message",params:[{name:"msg_id",type:"long"},{name:"seqno",type:"int"},{name:"bytes",type:"int"},{name:"body",type:"Object"}],type:"Message"},{id:-530561358,predicate:"msg_copy",params:[{name:"orig_message",type:"Message"}],type:"MessageCopy"},{id:812830625,predicate:"gzip_packed",params:[{name:"packed_data",type:"bytes"}],type:"Object"},{id:1658238041,predicate:"msgs_ack",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsAck"},{id:-1477445615,predicate:"bad_msg_notification",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"}],type:"BadMsgNotification"},{id:-307542917,predicate:"bad_server_salt",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"},{name:"new_server_salt",type:"long"}],type:"BadMsgNotification"},{id:2105940488,predicate:"msg_resend_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgResendReq"},{id:-630588590,predicate:"msgs_state_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsStateReq"},{id:81704317,predicate:"msgs_state_info",params:[{name:"req_msg_id",type:"long"},{name:"info",type:"bytes"}],type:"MsgsStateInfo"},{id:-1933520591,predicate:"msgs_all_info",params:[{name:"msg_ids",type:"Vector"},{name:"info",type:"bytes"}],type:"MsgsAllInfo"},{id:661470918,predicate:"msg_detailed_info",params:[{name:"msg_id",type:"long"},{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-2137147681,predicate:"msg_new_detailed_info",params:[{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-161422892,predicate:"destroy_auth_key_ok",params:[],type:"DestroyAuthKeyRes"},{id:178201177,predicate:"destroy_auth_key_none",params:[],type:"DestroyAuthKeyRes"},{id:-368010477,predicate:"destroy_auth_key_fail",params:[],type:"DestroyAuthKeyRes"}],methods:[{id:-1099002127,method:"req_pq_multi",params:[{name:"nonce",type:"int128"}],type:"ResPQ"},{id:-686627650,method:"req_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"public_key_fingerprint",type:"long"},{name:"encrypted_data",type:"bytes"}],type:"Server_DH_Params"},{id:-184262881,method:"set_client_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_data",type:"bytes"}],type:"Set_client_DH_params_answer"},{id:1491380032,method:"rpc_drop_answer",params:[{name:"req_msg_id",type:"long"}],type:"RpcDropAnswer"},{id:-1188971260,method:"get_future_salts",params:[{name:"num",type:"int"}],type:"FutureSalts"},{id:2059302892,method:"ping",params:[{name:"ping_id",type:"long"}],type:"Pong"},{id:-213746804,method:"ping_delay_disconnect",params:[{name:"ping_id",type:"long"},{name:"disconnect_delay",type:"int"}],type:"Pong"},{id:-414113498,method:"destroy_session",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1835453025,method:"http_wait",params:[{name:"max_delay",type:"int"},{name:"wait_after",type:"int"},{name:"max_wait",type:"int"}],type:"HttpWait"},{id:-784117408,method:"destroy_auth_key",params:[],type:"DestroyAuthKeyRes"}]},API:{constructors:[{id:-1132882121,predicate:"boolFalse",params:[],type:"Bool"},{id:-1720552011,predicate:"boolTrue",params:[],type:"Bool"},{id:1072550713,predicate:"true",params:[],type:"True"},{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:-994444869,predicate:"error",params:[{name:"code",type:"int"},{name:"text",type:"string"}],type:"Error"},{id:1450380236,predicate:"null",params:[],type:"Null"},{id:2134579434,predicate:"inputPeerEmpty",params:[],type:"InputPeer"},{id:2107670217,predicate:"inputPeerSelf",params:[],type:"InputPeer"},{id:900291769,predicate:"inputPeerChat",params:[{name:"chat_id",type:"long"}],type:"InputPeer"},{id:-1182234929,predicate:"inputUserEmpty",params:[],type:"InputUser"},{id:-138301121,predicate:"inputUserSelf",params:[],type:"InputUser"},{id:-208488460,predicate:"inputPhoneContact",params:[{name:"client_id",type:"long"},{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"InputContact"},{id:-181407105,predicate:"inputFile",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"},{name:"md5_checksum",type:"string"}],type:"InputFile"},{id:-1771768449,predicate:"inputMediaEmpty",params:[],type:"InputMedia"},{id:505969924,predicate:"inputMediaUploadedPhoto",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.2?true"},{name:"file",type:"InputFile"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:-1279654347,predicate:"inputMediaPhoto",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.1?true"},{name:"id",type:"InputPhoto"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-104578748,predicate:"inputMediaGeoPoint",params:[{name:"geo_point",type:"InputGeoPoint"}],type:"InputMedia"},{id:-122978821,predicate:"inputMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"}],type:"InputMedia"},{id:480546647,predicate:"inputChatPhotoEmpty",params:[],type:"InputChatPhoto"},{id:-968723890,predicate:"inputChatUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"InputChatPhoto"},{id:-1991004873,predicate:"inputChatPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputChatPhoto"},{id:-457104426,predicate:"inputGeoPointEmpty",params:[],type:"InputGeoPoint"},{id:1210199983,predicate:"inputGeoPoint",params:[{name:"flags",type:"#"},{name:"lat",type:"double"},{name:"long",type:"double"},{name:"accuracy_radius",type:"flags.0?int"}],type:"InputGeoPoint"},{id:483901197,predicate:"inputPhotoEmpty",params:[],type:"InputPhoto"},{id:1001634122,predicate:"inputPhoto",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputPhoto"},{id:-539317279,predicate:"inputFileLocation",params:[{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputFileLocation"},{id:1498486562,predicate:"peerUser",params:[{name:"user_id",type:"long"}],type:"Peer"},{id:918946202,predicate:"peerChat",params:[{name:"chat_id",type:"long"}],type:"Peer"},{id:-1432995067,predicate:"storage.fileUnknown",params:[],type:"storage.FileType"},{id:1086091090,predicate:"storage.filePartial",params:[],type:"storage.FileType"},{id:8322574,predicate:"storage.fileJpeg",params:[],type:"storage.FileType"},{id:-891180321,predicate:"storage.fileGif",params:[],type:"storage.FileType"},{id:172975040,predicate:"storage.filePng",params:[],type:"storage.FileType"},{id:-1373745011,predicate:"storage.filePdf",params:[],type:"storage.FileType"},{id:1384777335,predicate:"storage.fileMp3",params:[],type:"storage.FileType"},{id:1258941372,predicate:"storage.fileMov",params:[],type:"storage.FileType"},{id:-1278304028,predicate:"storage.fileMp4",params:[],type:"storage.FileType"},{id:276907596,predicate:"storage.fileWebp",params:[],type:"storage.FileType"},{id:-742634630,predicate:"userEmpty",params:[{name:"id",type:"long"}],type:"User"},{id:1326562017,predicate:"userProfilePhotoEmpty",params:[],type:"UserProfilePhoto"},{id:-2100168954,predicate:"userProfilePhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"personal",type:"flags.2?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"UserProfilePhoto"},{id:164646985,predicate:"userStatusEmpty",params:[],type:"UserStatus"},{id:-306628279,predicate:"userStatusOnline",params:[{name:"expires",type:"int"}],type:"UserStatus"},{id:9203775,predicate:"userStatusOffline",params:[{name:"was_online",type:"int"}],type:"UserStatus"},{id:693512293,predicate:"chatEmpty",params:[{name:"id",type:"long"}],type:"Chat"},{id:1103884886,predicate:"chat",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"deactivated",type:"flags.5?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"noforwards",type:"flags.25?true"},{name:"id",type:"long"},{name:"title",type:"string"},{name:"photo",type:"ChatPhoto"},{name:"participants_count",type:"int"},{name:"date",type:"int"},{name:"version",type:"int"},{name:"migrated_to",type:"flags.6?InputChannel"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"}],type:"Chat"},{id:1704108455,predicate:"chatForbidden",params:[{name:"id",type:"long"},{name:"title",type:"string"}],type:"Chat"},{id:-908914376,predicate:"chatFull",params:[{name:"flags",type:"#"},{name:"can_set_username",type:"flags.7?true"},{name:"has_scheduled",type:"flags.8?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants",type:"ChatParticipants"},{name:"chat_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.13?ExportedChatInvite"},{name:"bot_info",type:"flags.3?Vector"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"folder_id",type:"flags.11?int"},{name:"call",type:"flags.12?InputGroupCall"},{name:"ttl_period",type:"flags.14?int"},{name:"groupcall_default_join_as",type:"flags.15?Peer"},{name:"theme_emoticon",type:"flags.16?string"},{name:"requests_pending",type:"flags.17?int"},{name:"recent_requesters",type:"flags.17?Vector"},{name:"available_reactions",type:"flags.18?ChatReactions"}],type:"ChatFull"},{id:-1070776313,predicate:"chatParticipant",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-2023500831,predicate:"chatParticipantsForbidden",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"self_participant",type:"flags.0?ChatParticipant"}],type:"ChatParticipants"},{id:1018991608,predicate:"chatParticipants",params:[{name:"chat_id",type:"long"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"ChatParticipants"},{id:935395612,predicate:"chatPhotoEmpty",params:[],type:"ChatPhoto"},{id:476978193,predicate:"chatPhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"ChatPhoto"},{id:-1868117372,predicate:"messageEmpty",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"peer_id",type:"flags.0?Peer"}],type:"Message"},{id:940666592,predicate:"message",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"from_scheduled",type:"flags.18?true"},{name:"legacy",type:"flags.19?true"},{name:"edit_hide",type:"flags.21?true"},{name:"pinned",type:"flags.24?true"},{name:"noforwards",type:"flags.26?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"message",type:"string"},{name:"media",type:"flags.9?MessageMedia"},{name:"reply_markup",type:"flags.6?ReplyMarkup"},{name:"entities",type:"flags.7?Vector"},{name:"views",type:"flags.10?int"},{name:"forwards",type:"flags.10?int"},{name:"replies",type:"flags.23?MessageReplies"},{name:"edit_date",type:"flags.15?int"},{name:"post_author",type:"flags.16?string"},{name:"grouped_id",type:"flags.17?long"},{name:"reactions",type:"flags.20?MessageReactions"},{name:"restriction_reason",type:"flags.22?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:721967202,predicate:"messageService",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"legacy",type:"flags.19?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"action",type:"MessageAction"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:1038967584,predicate:"messageMediaEmpty",params:[],type:"MessageMedia"},{id:1766936791,predicate:"messageMediaPhoto",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.3?true"},{name:"photo",type:"flags.0?Photo"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1457575028,predicate:"messageMediaGeo",params:[{name:"geo",type:"GeoPoint"}],type:"MessageMedia"},{id:1882335561,predicate:"messageMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"user_id",type:"long"}],type:"MessageMedia"},{id:-1618676578,predicate:"messageMediaUnsupported",params:[],type:"MessageMedia"},{id:-1230047312,predicate:"messageActionEmpty",params:[],type:"MessageAction"},{id:-1119368275,predicate:"messageActionChatCreate",params:[{name:"title",type:"string"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1247687078,predicate:"messageActionChatEditTitle",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:2144015272,predicate:"messageActionChatEditPhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-1780220945,predicate:"messageActionChatDeletePhoto",params:[],type:"MessageAction"},{id:365886720,predicate:"messageActionChatAddUser",params:[{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1539362612,predicate:"messageActionChatDeleteUser",params:[{name:"user_id",type:"long"}],type:"MessageAction"},{id:-712374074,predicate:"dialog",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"unread_mark",type:"flags.3?true"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"unread_mentions_count",type:"int"},{name:"unread_reactions_count",type:"int"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"pts",type:"flags.0?int"},{name:"draft",type:"flags.1?DraftMessage"},{name:"folder_id",type:"flags.4?int"},{name:"ttl_period",type:"flags.5?int"}],type:"Dialog"},{id:590459437,predicate:"photoEmpty",params:[{name:"id",type:"long"}],type:"Photo"},{id:-82216347,predicate:"photo",params:[{name:"flags",type:"#"},{name:"has_stickers",type:"flags.0?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"sizes",type:"Vector"},{name:"video_sizes",type:"flags.1?Vector"},{name:"dc_id",type:"int"}],type:"Photo"},{id:236446268,predicate:"photoSizeEmpty",params:[{name:"type",type:"string"}],type:"PhotoSize"},{id:1976012384,predicate:"photoSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"}],type:"PhotoSize"},{id:35527382,predicate:"photoCachedSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:286776671,predicate:"geoPointEmpty",params:[],type:"GeoPoint"},{id:-1297942941,predicate:"geoPoint",params:[{name:"flags",type:"#"},{name:"long",type:"double"},{name:"lat",type:"double"},{name:"access_hash",type:"long"},{name:"accuracy_radius",type:"flags.0?int"}],type:"GeoPoint"},{id:1577067778,predicate:"auth.sentCode",params:[{name:"flags",type:"#"},{name:"type",type:"auth.SentCodeType"},{name:"phone_code_hash",type:"string"},{name:"next_type",type:"flags.1?auth.CodeType"},{name:"timeout",type:"flags.2?int"}],type:"auth.SentCode"},{id:872119224,predicate:"auth.authorization",params:[{name:"flags",type:"#"},{name:"setup_password_required",type:"flags.1?true"},{name:"otherwise_relogin_days",type:"flags.1?int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"user",type:"User"}],type:"auth.Authorization"},{id:-1271602504,predicate:"auth.exportedAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.ExportedAuthorization"},{id:-1195615476,predicate:"inputNotifyPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputNotifyPeer"},{id:423314455,predicate:"inputNotifyUsers",params:[],type:"InputNotifyPeer"},{id:1251338318,predicate:"inputNotifyChats",params:[],type:"InputNotifyPeer"},{id:-551616469,predicate:"inputPeerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?NotificationSound"}],type:"InputPeerNotifySettings"},{id:-1472527322,predicate:"peerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"ios_sound",type:"flags.3?NotificationSound"},{name:"android_sound",type:"flags.4?NotificationSound"},{name:"other_sound",type:"flags.5?NotificationSound"}],type:"PeerNotifySettings"},{id:-1525149427,predicate:"peerSettings",params:[{name:"flags",type:"#"},{name:"report_spam",type:"flags.0?true"},{name:"add_contact",type:"flags.1?true"},{name:"block_contact",type:"flags.2?true"},{name:"share_contact",type:"flags.3?true"},{name:"need_contacts_exception",type:"flags.4?true"},{name:"report_geo",type:"flags.5?true"},{name:"autoarchived",type:"flags.7?true"},{name:"invite_members",type:"flags.8?true"},{name:"request_chat_broadcast",type:"flags.10?true"},{name:"geo_distance",type:"flags.6?int"},{name:"request_chat_title",type:"flags.9?string"},{name:"request_chat_date",type:"flags.9?int"}],type:"PeerSettings"},{id:-1539849235,predicate:"wallPaper",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"pattern",type:"flags.3?true"},{name:"dark",type:"flags.4?true"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"document",type:"Document"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:1490799288,predicate:"inputReportReasonSpam",params:[],type:"ReportReason"},{id:505595789,predicate:"inputReportReasonViolence",params:[],type:"ReportReason"},{id:777640226,predicate:"inputReportReasonPornography",params:[],type:"ReportReason"},{id:-1376497949,predicate:"inputReportReasonChildAbuse",params:[],type:"ReportReason"},{id:-1041980751,predicate:"inputReportReasonOther",params:[],type:"ReportReason"},{id:-120378643,predicate:"userFull",params:[{name:"flags",type:"#"},{name:"blocked",type:"flags.0?true"},{name:"phone_calls_available",type:"flags.4?true"},{name:"phone_calls_private",type:"flags.5?true"},{name:"can_pin_message",type:"flags.7?true"},{name:"has_scheduled",type:"flags.12?true"},{name:"video_calls_available",type:"flags.13?true"},{name:"voice_messages_forbidden",type:"flags.20?true"},{name:"id",type:"long"},{name:"about",type:"flags.1?string"},{name:"settings",type:"PeerSettings"},{name:"personal_photo",type:"flags.21?Photo"},{name:"profile_photo",type:"flags.2?Photo"},{name:"fallback_photo",type:"flags.22?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"bot_info",type:"flags.3?BotInfo"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"common_chats_count",type:"int"},{name:"folder_id",type:"flags.11?int"},{name:"ttl_period",type:"flags.14?int"},{name:"theme_emoticon",type:"flags.15?string"},{name:"private_forward_name",type:"flags.16?string"},{name:"bot_group_admin_rights",type:"flags.17?ChatAdminRights"},{name:"bot_broadcast_admin_rights",type:"flags.18?ChatAdminRights"},{name:"premium_gifts",type:"flags.19?Vector"}],type:"UserFull"},{id:341499403,predicate:"contact",params:[{name:"user_id",type:"long"},{name:"mutual",type:"Bool"}],type:"Contact"},{id:-1052885936,predicate:"importedContact",params:[{name:"user_id",type:"long"},{name:"client_id",type:"long"}],type:"ImportedContact"},{id:383348795,predicate:"contactStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"ContactStatus"},{id:-1219778094,predicate:"contacts.contactsNotModified",params:[],type:"contacts.Contacts"},{id:-353862078,predicate:"contacts.contacts",params:[{name:"contacts",type:"Vector"},{name:"saved_count",type:"int"},{name:"users",type:"Vector"}],type:"contacts.Contacts"},{id:2010127419,predicate:"contacts.importedContacts",params:[{name:"imported",type:"Vector"},{name:"popular_invites",type:"Vector"},{name:"retry_contacts",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ImportedContacts"},{id:182326673,predicate:"contacts.blocked",params:[{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:-513392236,predicate:"contacts.blockedSlice",params:[{name:"count",type:"int"},{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:364538944,predicate:"messages.dialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:1910543603,predicate:"messages.dialogsSlice",params:[{name:"count",type:"int"},{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:-1938715001,predicate:"messages.messages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:978610270,predicate:"messages.messagesSlice",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"count",type:"int"},{name:"next_rate",type:"flags.0?int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:1694474197,predicate:"messages.chats",params:[{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-438840932,predicate:"messages.chatFull",params:[{name:"full_chat",type:"ChatFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatFull"},{id:-1269012015,predicate:"messages.affectedHistory",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"}],type:"messages.AffectedHistory"},{id:1474492012,predicate:"inputMessagesFilterEmpty",params:[],type:"MessagesFilter"},{id:-1777752804,predicate:"inputMessagesFilterPhotos",params:[],type:"MessagesFilter"},{id:-1614803355,predicate:"inputMessagesFilterVideo",params:[],type:"MessagesFilter"},{id:1458172132,predicate:"inputMessagesFilterPhotoVideo",params:[],type:"MessagesFilter"},{id:-1629621880,predicate:"inputMessagesFilterDocument",params:[],type:"MessagesFilter"},{id:2129714567,predicate:"inputMessagesFilterUrl",params:[],type:"MessagesFilter"},{id:-3644025,predicate:"inputMessagesFilterGif",params:[],type:"MessagesFilter"},{id:522914557,predicate:"updateNewMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1318109142,predicate:"updateMessageID",params:[{name:"id",type:"int"},{name:"random_id",type:"long"}],type:"Update"},{id:-1576161051,predicate:"updateDeleteMessages",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1071741569,predicate:"updateUserTyping",params:[{name:"user_id",type:"long"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-2092401936,predicate:"updateChatUserTyping",params:[{name:"chat_id",type:"long"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:125178264,predicate:"updateChatParticipants",params:[{name:"participants",type:"ChatParticipants"}],type:"Update"},{id:-440534818,predicate:"updateUserStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"Update"},{id:-1484486364,predicate:"updateUserName",params:[{name:"user_id",type:"long"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"usernames",type:"Vector"}],type:"Update"},{id:-1519637954,predicate:"updates.state",params:[{name:"pts",type:"int"},{name:"qts",type:"int"},{name:"date",type:"int"},{name:"seq",type:"int"},{name:"unread_count",type:"int"}],type:"updates.State"},{id:1567990072,predicate:"updates.differenceEmpty",params:[{name:"date",type:"int"},{name:"seq",type:"int"}],type:"updates.Difference"},{id:16030880,predicate:"updates.difference",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"updates.Difference"},{id:-1459938943,predicate:"updates.differenceSlice",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"intermediate_state",type:"updates.State"}],type:"updates.Difference"},{id:-484987010,predicate:"updatesTooLong",params:[],type:"Updates"},{id:826001400,predicate:"updateShortMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"user_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:1299050149,predicate:"updateShortChatMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"from_id",type:"long"},{name:"chat_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:2027216577,predicate:"updateShort",params:[{name:"update",type:"Update"},{name:"date",type:"int"}],type:"Updates"},{id:1918567619,predicate:"updatesCombined",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq_start",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:1957577280,predicate:"updates",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:-1916114267,predicate:"photos.photos",params:[{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:352657236,predicate:"photos.photosSlice",params:[{name:"count",type:"int"},{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:539045032,predicate:"photos.photo",params:[{name:"photo",type:"Photo"},{name:"users",type:"Vector"}],type:"photos.Photo"},{id:157948117,predicate:"upload.file",params:[{name:"type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.File"},{id:414687501,predicate:"dcOption",params:[{name:"flags",type:"#"},{name:"ipv6",type:"flags.0?true"},{name:"media_only",type:"flags.1?true"},{name:"tcpo_only",type:"flags.2?true"},{name:"cdn",type:"flags.3?true"},{name:"static",type:"flags.4?true"},{name:"this_port_only",type:"flags.5?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:589653676,predicate:"config",params:[{name:"flags",type:"#"},{name:"phonecalls_enabled",type:"flags.1?true"},{name:"default_p2p_contacts",type:"flags.3?true"},{name:"preload_featured_stickers",type:"flags.4?true"},{name:"ignore_phone_entities",type:"flags.5?true"},{name:"revoke_pm_inbox",type:"flags.6?true"},{name:"blocked_mode",type:"flags.8?true"},{name:"pfs_enabled",type:"flags.13?true"},{name:"force_try_ipv6",type:"flags.14?true"},{name:"date",type:"int"},{name:"expires",type:"int"},{name:"test_mode",type:"Bool"},{name:"this_dc",type:"int"},{name:"dc_options",type:"Vector"},{name:"dc_txt_domain_name",type:"string"},{name:"chat_size_max",type:"int"},{name:"megagroup_size_max",type:"int"},{name:"forwarded_count_max",type:"int"},{name:"online_update_period_ms",type:"int"},{name:"offline_blur_timeout_ms",type:"int"},{name:"offline_idle_timeout_ms",type:"int"},{name:"online_cloud_timeout_ms",type:"int"},{name:"notify_cloud_delay_ms",type:"int"},{name:"notify_default_delay_ms",type:"int"},{name:"push_chat_period_ms",type:"int"},{name:"push_chat_limit",type:"int"},{name:"saved_gifs_limit",type:"int"},{name:"edit_time_limit",type:"int"},{name:"revoke_time_limit",type:"int"},{name:"revoke_pm_time_limit",type:"int"},{name:"rating_e_decay",type:"int"},{name:"stickers_recent_limit",type:"int"},{name:"stickers_faved_limit",type:"int"},{name:"channels_read_media_period",type:"int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"pinned_dialogs_count_max",type:"int"},{name:"pinned_infolder_count_max",type:"int"},{name:"call_receive_timeout_ms",type:"int"},{name:"call_ring_timeout_ms",type:"int"},{name:"call_connect_timeout_ms",type:"int"},{name:"call_packet_timeout_ms",type:"int"},{name:"me_url_prefix",type:"string"},{name:"autoupdate_url_prefix",type:"flags.7?string"},{name:"gif_search_username",type:"flags.9?string"},{name:"venue_search_username",type:"flags.10?string"},{name:"img_search_username",type:"flags.11?string"},{name:"static_maps_provider",type:"flags.12?string"},{name:"caption_length_max",type:"int"},{name:"message_length_max",type:"int"},{name:"webfile_dc_id",type:"int"},{name:"suggested_lang_code",type:"flags.2?string"},{name:"lang_pack_version",type:"flags.2?int"},{name:"base_lang_pack_version",type:"flags.2?int"},{name:"reactions_default",type:"flags.15?Reaction"}],type:"Config"},{id:-1910892683,predicate:"nearestDc",params:[{name:"country",type:"string"},{name:"this_dc",type:"int"},{name:"nearest_dc",type:"int"}],type:"NearestDc"},{id:-860107216,predicate:"help.appUpdate",params:[{name:"flags",type:"#"},{name:"can_not_skip",type:"flags.0?true"},{name:"id",type:"int"},{name:"version",type:"string"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"document",type:"flags.1?Document"},{name:"url",type:"flags.2?string"},{name:"sticker",type:"flags.3?Document"}],type:"help.AppUpdate"},{id:-1000708810,predicate:"help.noAppUpdate",params:[],type:"help.AppUpdate"},{id:415997816,predicate:"help.inviteText",params:[{name:"message",type:"string"}],type:"help.InviteText"},{id:314359194,predicate:"updateNewEncryptedMessage",params:[{name:"message",type:"EncryptedMessage"},{name:"qts",type:"int"}],type:"Update"},{id:386986326,predicate:"updateEncryptedChatTyping",params:[{name:"chat_id",type:"int"}],type:"Update"},{id:-1264392051,predicate:"updateEncryption",params:[{name:"chat",type:"EncryptedChat"},{name:"date",type:"int"}],type:"Update"},{id:956179895,predicate:"updateEncryptedMessagesRead",params:[{name:"chat_id",type:"int"},{name:"max_date",type:"int"},{name:"date",type:"int"}],type:"Update"},{id:-1417756512,predicate:"encryptedChatEmpty",params:[{name:"id",type:"int"}],type:"EncryptedChat"},{id:1722964307,predicate:"encryptedChatWaiting",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"}],type:"EncryptedChat"},{id:1223809356,predicate:"encryptedChatRequested",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1643173063,predicate:"encryptedChat",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:505183301,predicate:"encryptedChatDiscarded",params:[{name:"flags",type:"#"},{name:"history_deleted",type:"flags.0?true"},{name:"id",type:"int"}],type:"EncryptedChat"},{id:-247351839,predicate:"inputEncryptedChat",params:[{name:"chat_id",type:"int"},{name:"access_hash",type:"long"}],type:"InputEncryptedChat"},{id:-1038136962,predicate:"encryptedFileEmpty",params:[],type:"EncryptedFile"},{id:-1476358952,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"long"},{name:"dc_id",type:"int"},{name:"key_fingerprint",type:"int"}],type:"EncryptedFile"},{id:406307684,predicate:"inputEncryptedFileEmpty",params:[],type:"InputEncryptedFile"},{id:1690108678,predicate:"inputEncryptedFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1511503333,predicate:"inputEncryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputEncryptedFile"},{id:-182231723,predicate:"inputEncryptedFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:-317144808,predicate:"encryptedMessage",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"},{name:"file",type:"EncryptedFile"}],type:"EncryptedMessage"},{id:594758406,predicate:"encryptedMessageService",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"}],type:"EncryptedMessage"},{id:-1058912715,predicate:"messages.dhConfigNotModified",params:[{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:740433629,predicate:"messages.dhConfig",params:[{name:"g",type:"int"},{name:"p",type:"bytes"},{name:"version",type:"int"},{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:1443858741,predicate:"messages.sentEncryptedMessage",params:[{name:"date",type:"int"}],type:"messages.SentEncryptedMessage"},{id:-1802240206,predicate:"messages.sentEncryptedFile",params:[{name:"date",type:"int"},{name:"file",type:"EncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:-95482955,predicate:"inputFileBig",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"}],type:"InputFile"},{id:767652808,predicate:"inputEncryptedFileBigUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1037718609,predicate:"updateChatParticipantAdd",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"},{name:"version",type:"int"}],type:"Update"},{id:-483443337,predicate:"updateChatParticipantDelete",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"version",type:"int"}],type:"Update"},{id:-1906403213,predicate:"updateDcOptions",params:[{name:"dc_options",type:"Vector"}],type:"Update"},{id:1530447553,predicate:"inputMediaUploadedDocument",params:[{name:"flags",type:"#"},{name:"nosound_video",type:"flags.3?true"},{name:"force_file",type:"flags.4?true"},{name:"spoiler",type:"flags.5?true"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.2?InputFile"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:860303448,predicate:"inputMediaDocument",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.2?true"},{name:"id",type:"InputDocument"},{name:"ttl_seconds",type:"flags.0?int"},{name:"query",type:"flags.1?string"}],type:"InputMedia"},{id:-1666158377,predicate:"messageMediaDocument",params:[{name:"flags",type:"#"},{name:"nopremium",type:"flags.3?true"},{name:"spoiler",type:"flags.4?true"},{name:"document",type:"flags.0?Document"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1928391342,predicate:"inputDocumentEmpty",params:[],type:"InputDocument"},{id:448771445,predicate:"inputDocument",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputDocument"},{id:-1160743548,predicate:"inputDocumentFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:922273905,predicate:"documentEmpty",params:[{name:"id",type:"long"}],type:"Document"},{id:-1881881384,predicate:"document",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"mime_type",type:"string"},{name:"size",type:"long"},{name:"thumbs",type:"flags.0?Vector"},{name:"video_thumbs",type:"flags.1?Vector"},{name:"dc_id",type:"int"},{name:"attributes",type:"Vector"}],type:"Document"},{id:398898678,predicate:"help.support",params:[{name:"phone_number",type:"string"},{name:"user",type:"User"}],type:"help.Support"},{id:-1613493288,predicate:"notifyPeer",params:[{name:"peer",type:"Peer"}],type:"NotifyPeer"},{id:-1261946036,predicate:"notifyUsers",params:[],type:"NotifyPeer"},{id:-1073230141,predicate:"notifyChats",params:[],type:"NotifyPeer"},{id:-1094555409,predicate:"updateNotifySettings",params:[{name:"peer",type:"NotifyPeer"},{name:"notify_settings",type:"PeerNotifySettings"}],type:"Update"},{id:381645902,predicate:"sendMessageTypingAction",params:[],type:"SendMessageAction"},{id:-44119819,predicate:"sendMessageCancelAction",params:[],type:"SendMessageAction"},{id:-1584933265,predicate:"sendMessageRecordVideoAction",params:[],type:"SendMessageAction"},{id:-378127636,predicate:"sendMessageUploadVideoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-718310409,predicate:"sendMessageRecordAudioAction",params:[],type:"SendMessageAction"},{id:-212740181,predicate:"sendMessageUploadAudioAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-774682074,predicate:"sendMessageUploadPhotoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-1441998364,predicate:"sendMessageUploadDocumentAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:393186209,predicate:"sendMessageGeoLocationAction",params:[],type:"SendMessageAction"},{id:1653390447,predicate:"sendMessageChooseContactAction",params:[],type:"SendMessageAction"},{id:-1290580579,predicate:"contacts.found",params:[{name:"my_results",type:"Vector"},{name:"results",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Found"},{id:-337352679,predicate:"updateServiceNotification",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"inbox_date",type:"flags.1?int"},{name:"type",type:"string"},{name:"message",type:"string"},{name:"media",type:"MessageMedia"},{name:"entities",type:"Vector"}],type:"Update"},{id:-496024847,predicate:"userStatusRecently",params:[],type:"UserStatus"},{id:129960444,predicate:"userStatusLastWeek",params:[],type:"UserStatus"},{id:2011940674,predicate:"userStatusLastMonth",params:[],type:"UserStatus"},{id:-298113238,predicate:"updatePrivacy",params:[{name:"key",type:"PrivacyKey"},{name:"rules",type:"Vector"}],type:"Update"},{id:1335282456,predicate:"inputPrivacyKeyStatusTimestamp",params:[],type:"InputPrivacyKey"},{id:-1137792208,predicate:"privacyKeyStatusTimestamp",params:[],type:"PrivacyKey"},{id:218751099,predicate:"inputPrivacyValueAllowContacts",params:[],type:"InputPrivacyRule"},{id:407582158,predicate:"inputPrivacyValueAllowAll",params:[],type:"InputPrivacyRule"},{id:320652927,predicate:"inputPrivacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:195371015,predicate:"inputPrivacyValueDisallowContacts",params:[],type:"InputPrivacyRule"},{id:-697604407,predicate:"inputPrivacyValueDisallowAll",params:[],type:"InputPrivacyRule"},{id:-1877932953,predicate:"inputPrivacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:-123988,predicate:"privacyValueAllowContacts",params:[],type:"PrivacyRule"},{id:1698855810,predicate:"privacyValueAllowAll",params:[],type:"PrivacyRule"},{id:-1198497870,predicate:"privacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:-125240806,predicate:"privacyValueDisallowContacts",params:[],type:"PrivacyRule"},{id:-1955338397,predicate:"privacyValueDisallowAll",params:[],type:"PrivacyRule"},{id:-463335103,predicate:"privacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:1352683077,predicate:"account.privacyRules",params:[{name:"rules",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"account.PrivacyRules"},{id:-1194283041,predicate:"accountDaysTTL",params:[{name:"days",type:"int"}],type:"AccountDaysTTL"},{id:88680979,predicate:"updateUserPhone",params:[{name:"user_id",type:"long"},{name:"phone",type:"string"}],type:"Update"},{id:1815593308,predicate:"documentAttributeImageSize",params:[{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:297109817,predicate:"documentAttributeAnimated",params:[],type:"DocumentAttribute"},{id:1662637586,predicate:"documentAttributeSticker",params:[{name:"flags",type:"#"},{name:"mask",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"DocumentAttribute"},{id:250621158,predicate:"documentAttributeVideo",params:[{name:"flags",type:"#"},{name:"round_message",type:"flags.0?true"},{name:"supports_streaming",type:"flags.1?true"},{name:"duration",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:-1739392570,predicate:"documentAttributeAudio",params:[{name:"flags",type:"#"},{name:"voice",type:"flags.10?true"},{name:"duration",type:"int"},{name:"title",type:"flags.0?string"},{name:"performer",type:"flags.1?string"},{name:"waveform",type:"flags.2?bytes"}],type:"DocumentAttribute"},{id:358154344,predicate:"documentAttributeFilename",params:[{name:"file_name",type:"string"}],type:"DocumentAttribute"},{id:-244016606,predicate:"messages.stickersNotModified",params:[],type:"messages.Stickers"},{id:816245886,predicate:"messages.stickers",params:[{name:"hash",type:"long"},{name:"stickers",type:"Vector"}],type:"messages.Stickers"},{id:313694676,predicate:"stickerPack",params:[{name:"emoticon",type:"string"},{name:"documents",type:"Vector"}],type:"StickerPack"},{id:-395967805,predicate:"messages.allStickersNotModified",params:[],type:"messages.AllStickers"},{id:-843329861,predicate:"messages.allStickers",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.AllStickers"},{id:-1667805217,predicate:"updateReadHistoryInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:791617983,predicate:"updateReadHistoryOutbox",params:[{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-2066640507,predicate:"messages.affectedMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"messages.AffectedMessages"},{id:2139689491,predicate:"updateWebPage",params:[{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-350980120,predicate:"webPageEmpty",params:[{name:"id",type:"long"}],type:"WebPage"},{id:-981018084,predicate:"webPagePending",params:[{name:"id",type:"long"},{name:"date",type:"int"}],type:"WebPage"},{id:-392411726,predicate:"webPage",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"url",type:"string"},{name:"display_url",type:"string"},{name:"hash",type:"int"},{name:"type",type:"flags.0?string"},{name:"site_name",type:"flags.1?string"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"photo",type:"flags.4?Photo"},{name:"embed_url",type:"flags.5?string"},{name:"embed_type",type:"flags.5?string"},{name:"embed_width",type:"flags.6?int"},{name:"embed_height",type:"flags.6?int"},{name:"duration",type:"flags.7?int"},{name:"author",type:"flags.8?string"},{name:"document",type:"flags.9?Document"},{name:"cached_page",type:"flags.10?Page"},{name:"attributes",type:"flags.12?Vector"}],type:"WebPage"},{id:-1557277184,predicate:"messageMediaWebPage",params:[{name:"webpage",type:"WebPage"}],type:"MessageMedia"},{id:-1392388579,predicate:"authorization",params:[{name:"flags",type:"#"},{name:"current",type:"flags.0?true"},{name:"official_app",type:"flags.1?true"},{name:"password_pending",type:"flags.2?true"},{name:"encrypted_requests_disabled",type:"flags.3?true"},{name:"call_requests_disabled",type:"flags.4?true"},{name:"hash",type:"long"},{name:"device_model",type:"string"},{name:"platform",type:"string"},{name:"system_version",type:"string"},{name:"api_id",type:"int"},{name:"app_name",type:"string"},{name:"app_version",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"country",type:"string"},{name:"region",type:"string"}],type:"Authorization"},{id:1275039392,predicate:"account.authorizations",params:[{name:"authorization_ttl_days",type:"int"},{name:"authorizations",type:"Vector"}],type:"account.Authorizations"},{id:-1787080453,predicate:"account.password",params:[{name:"flags",type:"#"},{name:"has_recovery",type:"flags.0?true"},{name:"has_secure_values",type:"flags.1?true"},{name:"has_password",type:"flags.2?true"},{name:"current_algo",type:"flags.2?PasswordKdfAlgo"},{name:"srp_B",type:"flags.2?bytes"},{name:"srp_id",type:"flags.2?long"},{name:"hint",type:"flags.3?string"},{name:"email_unconfirmed_pattern",type:"flags.4?string"},{name:"new_algo",type:"PasswordKdfAlgo"},{name:"new_secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_random",type:"bytes"},{name:"pending_reset_date",type:"flags.5?int"},{name:"login_email_pattern",type:"flags.6?string"}],type:"account.Password"},{id:-1705233435,predicate:"account.passwordSettings",params:[{name:"flags",type:"#"},{name:"email",type:"flags.0?string"},{name:"secure_settings",type:"flags.1?SecureSecretSettings"}],type:"account.PasswordSettings"},{id:-1036572727,predicate:"account.passwordInputSettings",params:[{name:"flags",type:"#"},{name:"new_algo",type:"flags.0?PasswordKdfAlgo"},{name:"new_password_hash",type:"flags.0?bytes"},{name:"hint",type:"flags.0?string"},{name:"email",type:"flags.1?string"},{name:"new_secure_settings",type:"flags.2?SecureSecretSettings"}],type:"account.PasswordInputSettings"},{id:326715557,predicate:"auth.passwordRecovery",params:[{name:"email_pattern",type:"string"}],type:"auth.PasswordRecovery"},{id:-1052959727,predicate:"inputMediaVenue",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"InputMedia"},{id:784356159,predicate:"messageMediaVenue",params:[{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"MessageMedia"},{id:-1551583367,predicate:"receivedNotifyMessage",params:[{name:"id",type:"int"},{name:"flags",type:"int"}],type:"ReceivedNotifyMessage"},{id:179611673,predicate:"chatInviteExported",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.0?true"},{name:"permanent",type:"flags.5?true"},{name:"request_needed",type:"flags.6?true"},{name:"link",type:"string"},{name:"admin_id",type:"long"},{name:"date",type:"int"},{name:"start_date",type:"flags.4?int"},{name:"expire_date",type:"flags.1?int"},{name:"usage_limit",type:"flags.2?int"},{name:"usage",type:"flags.3?int"},{name:"requested",type:"flags.7?int"},{name:"title",type:"flags.8?string"}],type:"ExportedChatInvite"},{id:1516793212,predicate:"chatInviteAlready",params:[{name:"chat",type:"Chat"}],type:"ChatInvite"},{id:806110401,predicate:"chatInvite",params:[{name:"flags",type:"#"},{name:"channel",type:"flags.0?true"},{name:"broadcast",type:"flags.1?true"},{name:"public",type:"flags.2?true"},{name:"megagroup",type:"flags.3?true"},{name:"request_needed",type:"flags.6?true"},{name:"title",type:"string"},{name:"about",type:"flags.5?string"},{name:"photo",type:"Photo"},{name:"participants_count",type:"int"},{name:"participants",type:"flags.4?Vector"}],type:"ChatInvite"},{id:51520707,predicate:"messageActionChatJoinedByLink",params:[{name:"inviter_id",type:"long"}],type:"MessageAction"},{id:1757493555,predicate:"updateReadMessagesContents",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-4838507,predicate:"inputStickerSetEmpty",params:[],type:"InputStickerSet"},{id:-1645763991,predicate:"inputStickerSetID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputStickerSet"},{id:-2044933984,predicate:"inputStickerSetShortName",params:[{name:"short_name",type:"string"}],type:"InputStickerSet"},{id:768691932,predicate:"stickerSet",params:[{name:"flags",type:"#"},{name:"archived",type:"flags.1?true"},{name:"official",type:"flags.2?true"},{name:"masks",type:"flags.3?true"},{name:"animated",type:"flags.5?true"},{name:"videos",type:"flags.6?true"},{name:"emojis",type:"flags.7?true"},{name:"installed_date",type:"flags.0?int"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumbs",type:"flags.4?Vector"},{name:"thumb_dc_id",type:"flags.4?int"},{name:"thumb_version",type:"flags.4?int"},{name:"thumb_document_id",type:"flags.8?long"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:1846886166,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"keywords",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:-1885878744,predicate:"user",params:[{name:"flags",type:"#"},{name:"self",type:"flags.10?true"},{name:"contact",type:"flags.11?true"},{name:"mutual_contact",type:"flags.12?true"},{name:"deleted",type:"flags.13?true"},{name:"bot",type:"flags.14?true"},{name:"bot_chat_history",type:"flags.15?true"},{name:"bot_nochats",type:"flags.16?true"},{name:"verified",type:"flags.17?true"},{name:"restricted",type:"flags.18?true"},{name:"min",type:"flags.20?true"},{name:"bot_inline_geo",type:"flags.21?true"},{name:"support",type:"flags.23?true"},{name:"scam",type:"flags.24?true"},{name:"apply_min_photo",type:"flags.25?true"},{name:"fake",type:"flags.26?true"},{name:"bot_attach_menu",type:"flags.27?true"},{name:"premium",type:"flags.28?true"},{name:"attach_menu_enabled",type:"flags.29?true"},{name:"flags2",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"flags.0?long"},{name:"first_name",type:"flags.1?string"},{name:"last_name",type:"flags.2?string"},{name:"username",type:"flags.3?string"},{name:"phone",type:"flags.4?string"},{name:"photo",type:"flags.5?UserProfilePhoto"},{name:"status",type:"flags.6?UserStatus"},{name:"bot_info_version",type:"flags.14?int"},{name:"restriction_reason",type:"flags.18?Vector"},{name:"bot_inline_placeholder",type:"flags.19?string"},{name:"lang_code",type:"flags.22?string"},{name:"emoji_status",type:"flags.30?EmojiStatus"},{name:"usernames",type:"flags2.0?Vector"}],type:"User"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:-1892676777,predicate:"botInfo",params:[{name:"flags",type:"#"},{name:"user_id",type:"flags.0?long"},{name:"description",type:"flags.1?string"},{name:"description_photo",type:"flags.4?Photo"},{name:"description_document",type:"flags.5?Document"},{name:"commands",type:"flags.2?Vector"},{name:"menu_button",type:"flags.3?BotMenuButton"}],type:"BotInfo"},{id:-1560655744,predicate:"keyboardButton",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:2002815875,predicate:"keyboardButtonRow",params:[{name:"buttons",type:"Vector"}],type:"KeyboardButtonRow"},{id:-1606526075,predicate:"replyKeyboardHide",params:[{name:"flags",type:"#"},{name:"selective",type:"flags.2?true"}],type:"ReplyMarkup"},{id:-2035021048,predicate:"replyKeyboardForceReply",params:[{name:"flags",type:"#"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-2049074735,predicate:"replyKeyboardMarkup",params:[{name:"flags",type:"#"},{name:"resize",type:"flags.0?true"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"persistent",type:"flags.4?true"},{name:"rows",type:"Vector"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-571955892,predicate:"inputPeerUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-233744186,predicate:"inputUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputUser"},{id:-1148011883,predicate:"messageEntityUnknown",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-100378723,predicate:"messageEntityMention",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1868782349,predicate:"messageEntityHashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1827637959,predicate:"messageEntityBotCommand",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1859134776,predicate:"messageEntityUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1692693954,predicate:"messageEntityEmail",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1117713463,predicate:"messageEntityBold",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-2106619040,predicate:"messageEntityItalic",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:681706865,predicate:"messageEntityCode",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1938967520,predicate:"messageEntityPre",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"language",type:"string"}],type:"MessageEntity"},{id:1990644519,predicate:"messageEntityTextUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"url",type:"string"}],type:"MessageEntity"},{id:-1877614335,predicate:"updateShortSentMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"media",type:"flags.9?MessageMedia"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:-292807034,predicate:"inputChannelEmpty",params:[],type:"InputChannel"},{id:-212145112,predicate:"inputChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputChannel"},{id:-1566230754,predicate:"peerChannel",params:[{name:"channel_id",type:"long"}],type:"Peer"},{id:666680316,predicate:"inputPeerChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-2094689180,predicate:"channel",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"broadcast",type:"flags.5?true"},{name:"verified",type:"flags.7?true"},{name:"megagroup",type:"flags.8?true"},{name:"restricted",type:"flags.9?true"},{name:"signatures",type:"flags.11?true"},{name:"min",type:"flags.12?true"},{name:"scam",type:"flags.19?true"},{name:"has_link",type:"flags.20?true"},{name:"has_geo",type:"flags.21?true"},{name:"slowmode_enabled",type:"flags.22?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"fake",type:"flags.25?true"},{name:"gigagroup",type:"flags.26?true"},{name:"noforwards",type:"flags.27?true"},{name:"join_to_send",type:"flags.28?true"},{name:"join_request",type:"flags.29?true"},{name:"forum",type:"flags.30?true"},{name:"flags2",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"flags.13?long"},{name:"title",type:"string"},{name:"username",type:"flags.6?string"},{name:"photo",type:"ChatPhoto"},{name:"date",type:"int"},{name:"restriction_reason",type:"flags.9?Vector"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"banned_rights",type:"flags.15?ChatBannedRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"},{name:"participants_count",type:"flags.17?int"},{name:"usernames",type:"flags2.0?Vector"}],type:"Chat"},{id:399807445,predicate:"channelForbidden",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.5?true"},{name:"megagroup",type:"flags.8?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"until_date",type:"flags.16?int"}],type:"Chat"},{id:2131196633,predicate:"contacts.resolvedPeer",params:[{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ResolvedPeer"},{id:-231385849,predicate:"channelFull",params:[{name:"flags",type:"#"},{name:"can_view_participants",type:"flags.3?true"},{name:"can_set_username",type:"flags.6?true"},{name:"can_set_stickers",type:"flags.7?true"},{name:"hidden_prehistory",type:"flags.10?true"},{name:"can_set_location",type:"flags.16?true"},{name:"has_scheduled",type:"flags.19?true"},{name:"can_view_stats",type:"flags.20?true"},{name:"blocked",type:"flags.22?true"},{name:"flags2",type:"#"},{name:"can_delete_channel",type:"flags2.0?true"},{name:"antispam",type:"flags2.1?true"},{name:"participants_hidden",type:"flags2.2?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants_count",type:"flags.0?int"},{name:"admins_count",type:"flags.1?int"},{name:"kicked_count",type:"flags.2?int"},{name:"banned_count",type:"flags.2?int"},{name:"online_count",type:"flags.13?int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"chat_photo",type:"Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.23?ExportedChatInvite"},{name:"bot_info",type:"Vector"},{name:"migrated_from_chat_id",type:"flags.4?long"},{name:"migrated_from_max_id",type:"flags.4?int"},{name:"pinned_msg_id",type:"flags.5?int"},{name:"stickerset",type:"flags.8?StickerSet"},{name:"available_min_id",type:"flags.9?int"},{name:"folder_id",type:"flags.11?int"},{name:"linked_chat_id",type:"flags.14?long"},{name:"location",type:"flags.15?ChannelLocation"},{name:"slowmode_seconds",type:"flags.17?int"},{name:"slowmode_next_send_date",type:"flags.18?int"},{name:"stats_dc",type:"flags.12?int"},{name:"pts",type:"int"},{name:"call",type:"flags.21?InputGroupCall"},{name:"ttl_period",type:"flags.24?int"},{name:"pending_suggestions",type:"flags.25?Vector"},{name:"groupcall_default_join_as",type:"flags.26?Peer"},{name:"theme_emoticon",type:"flags.27?string"},{name:"requests_pending",type:"flags.28?int"},{name:"recent_requesters",type:"flags.28?Vector"},{name:"default_send_as",type:"flags.29?Peer"},{name:"available_reactions",type:"flags.30?ChatReactions"}],type:"ChatFull"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{id:-948520370,predicate:"messages.channelMessages",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"pts",type:"int"},{name:"count",type:"int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"topics",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:-1781355374,predicate:"messageActionChannelCreate",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:277713951,predicate:"updateChannelTooLong",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"pts",type:"flags.0?int"}],type:"Update"},{id:1666927625,predicate:"updateChannel",params:[{name:"channel_id",type:"long"}],type:"Update"},{id:1656358105,predicate:"updateNewChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1842450928,predicate:"updateReadChannelInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"channel_id",type:"long"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"}],type:"Update"},{id:-1020437742,predicate:"updateDeleteChannelMessages",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-232346616,predicate:"updateChannelMessageViews",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"views",type:"int"}],type:"Update"},{id:1041346555,predicate:"updates.channelDifferenceEmpty",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"}],type:"updates.ChannelDifference"},{id:-1531132162,predicate:"updates.channelDifferenceTooLong",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"timeout",type:"flags.1?int"},{name:"dialog",type:"Dialog"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:543450958,predicate:"updates.channelDifference",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"},{name:"new_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:-1798033689,predicate:"channelMessagesFilterEmpty",params:[],type:"ChannelMessagesFilter"},{id:-847783593,predicate:"channelMessagesFilter",params:[{name:"flags",type:"#"},{name:"exclude_new_messages",type:"flags.1?true"},{name:"ranges",type:"Vector"}],type:"ChannelMessagesFilter"},{id:-1072953408,predicate:"channelParticipant",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:900251559,predicate:"channelParticipantSelf",params:[{name:"flags",type:"#"},{name:"via_request",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:803602899,predicate:"channelParticipantCreator",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.0?string"}],type:"ChannelParticipant"},{id:-566281095,predicate:"channelParticipantsRecent",params:[],type:"ChannelParticipantsFilter"},{id:-1268741783,predicate:"channelParticipantsAdmins",params:[],type:"ChannelParticipantsFilter"},{id:-1548400251,predicate:"channelParticipantsKicked",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1699676497,predicate:"channels.channelParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipants"},{id:-541588713,predicate:"channels.channelParticipant",params:[{name:"participant",type:"ChannelParticipant"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipant"},{id:-462696732,predicate:"chatParticipantCreator",params:[{name:"user_id",type:"long"}],type:"ChatParticipant"},{id:-1600962725,predicate:"chatParticipantAdmin",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-674602590,predicate:"updateChatParticipantAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"is_admin",type:"Bool"},{name:"version",type:"int"}],type:"Update"},{id:-519864430,predicate:"messageActionChatMigrateTo",params:[{name:"channel_id",type:"long"}],type:"MessageAction"},{id:-365344535,predicate:"messageActionChannelMigrateFrom",params:[{name:"title",type:"string"},{name:"chat_id",type:"long"}],type:"MessageAction"},{id:-1328445861,predicate:"channelParticipantsBots",params:[],type:"ChannelParticipantsFilter"},{id:2013922064,predicate:"help.termsOfService",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"id",type:"DataJSON"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"min_age_confirm",type:"flags.1?int"}],type:"help.TermsOfService"},{id:1753886890,predicate:"updateNewStickerSet",params:[{name:"stickerset",type:"messages.StickerSet"}],type:"Update"},{id:196268545,predicate:"updateStickerSetsOrder",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"order",type:"Vector"}],type:"Update"},{id:834816008,predicate:"updateStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"}],type:"Update"},{id:-402498398,predicate:"messages.savedGifsNotModified",params:[],type:"messages.SavedGifs"},{id:-2069878259,predicate:"messages.savedGifs",params:[{name:"hash",type:"long"},{name:"gifs",type:"Vector"}],type:"messages.SavedGifs"},{id:-1821035490,predicate:"updateSavedGifs",params:[],type:"Update"},{id:864077702,predicate:"inputBotInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1036876423,predicate:"inputBotInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-2000710887,predicate:"inputBotInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?InputWebDocument"},{name:"content",type:"flags.5?InputWebDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1984755728,predicate:"botInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1937807902,predicate:"botInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:295067450,predicate:"botInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?WebDocument"},{name:"content",type:"flags.5?WebDocument"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1803769784,predicate:"messages.botResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"query_id",type:"long"},{name:"next_offset",type:"flags.1?string"},{name:"switch_pm",type:"flags.2?InlineBotSwitchPM"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"users",type:"Vector"}],type:"messages.BotResults"},{id:1232025500,predicate:"updateBotInlineQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"peer_type",type:"flags.1?InlineQueryPeerType"},{name:"offset",type:"string"}],type:"Update"},{id:317794823,predicate:"updateBotInlineSend",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"id",type:"string"},{name:"msg_id",type:"flags.1?InputBotInlineMessageID"}],type:"Update"},{id:1358283666,predicate:"inputMessagesFilterVoice",params:[],type:"MessagesFilter"},{id:928101534,predicate:"inputMessagesFilterMusic",params:[],type:"MessagesFilter"},{id:-1107622874,predicate:"inputPrivacyKeyChatInvite",params:[],type:"InputPrivacyKey"},{id:1343122938,predicate:"privacyKeyChatInvite",params:[],type:"PrivacyKey"},{id:1571494644,predicate:"exportedMessageLink",params:[{name:"link",type:"string"},{name:"html",type:"string"}],type:"ExportedMessageLink"},{id:1601666510,predicate:"messageFwdHeader",params:[{name:"flags",type:"#"},{name:"imported",type:"flags.7?true"},{name:"from_id",type:"flags.0?Peer"},{name:"from_name",type:"flags.5?string"},{name:"date",type:"int"},{name:"channel_post",type:"flags.2?int"},{name:"post_author",type:"flags.3?string"},{name:"saved_from_peer",type:"flags.4?Peer"},{name:"saved_from_msg_id",type:"flags.4?int"},{name:"psa_type",type:"flags.6?string"}],type:"MessageFwdHeader"},{id:457133559,predicate:"updateEditChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1799538451,predicate:"messageActionPinMessage",params:[],type:"MessageAction"},{id:1923290508,predicate:"auth.codeTypeSms",params:[],type:"auth.CodeType"},{id:1948046307,predicate:"auth.codeTypeCall",params:[],type:"auth.CodeType"},{id:577556219,predicate:"auth.codeTypeFlashCall",params:[],type:"auth.CodeType"},{id:1035688326,predicate:"auth.sentCodeTypeApp",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1073693790,predicate:"auth.sentCodeTypeSms",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1398007207,predicate:"auth.sentCodeTypeCall",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1425815847,predicate:"auth.sentCodeTypeFlashCall",params:[{name:"pattern",type:"string"}],type:"auth.SentCodeType"},{id:629866245,predicate:"keyboardButtonUrl",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:901503851,predicate:"keyboardButtonCallback",params:[{name:"flags",type:"#"},{name:"requires_password",type:"flags.0?true"},{name:"text",type:"string"},{name:"data",type:"bytes"}],type:"KeyboardButton"},{id:-1318425559,predicate:"keyboardButtonRequestPhone",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-59151553,predicate:"keyboardButtonRequestGeoLocation",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:90744648,predicate:"keyboardButtonSwitchInline",params:[{name:"flags",type:"#"},{name:"same_peer",type:"flags.0?true"},{name:"text",type:"string"},{name:"query",type:"string"}],type:"KeyboardButton"},{id:1218642516,predicate:"replyInlineMarkup",params:[{name:"rows",type:"Vector"}],type:"ReplyMarkup"},{id:911761060,predicate:"messages.botCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"has_url",type:"flags.3?true"},{name:"native_ui",type:"flags.4?true"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"messages.BotCallbackAnswer"},{id:-1177566067,predicate:"updateBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:649453030,predicate:"messages.messageEditData",params:[{name:"flags",type:"#"},{name:"caption",type:"flags.0?true"}],type:"messages.MessageEditData"},{id:-469536605,predicate:"updateEditMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1768777083,predicate:"inputBotInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1098628881,predicate:"inputBotInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-1494368259,predicate:"inputBotInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:85477117,predicate:"botInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1970903652,predicate:"botInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:416402882,predicate:"botInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1462213465,predicate:"inputBotInlineResultPhoto",params:[{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"InputPhoto"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:-459324,predicate:"inputBotInlineResultDocument",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"document",type:"InputDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:400266251,predicate:"botInlineMediaResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"flags.0?Photo"},{name:"document",type:"flags.1?Document"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1995686519,predicate:"inputBotInlineMessageID",params:[{name:"dc_id",type:"int"},{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:1763610706,predicate:"updateInlineBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"msg_id",type:"InputBotInlineMessageID"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:1008755359,predicate:"inlineBotSwitchPM",params:[{name:"text",type:"string"},{name:"start_param",type:"string"}],type:"InlineBotSwitchPM"},{id:863093588,predicate:"messages.peerDialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"messages.PeerDialogs"},{id:-305282981,predicate:"topPeer",params:[{name:"peer",type:"Peer"},{name:"rating",type:"double"}],type:"TopPeer"},{id:-1419371685,predicate:"topPeerCategoryBotsPM",params:[],type:"TopPeerCategory"},{id:344356834,predicate:"topPeerCategoryBotsInline",params:[],type:"TopPeerCategory"},{id:104314861,predicate:"topPeerCategoryCorrespondents",params:[],type:"TopPeerCategory"},{id:-1122524854,predicate:"topPeerCategoryGroups",params:[],type:"TopPeerCategory"},{id:371037736,predicate:"topPeerCategoryChannels",params:[],type:"TopPeerCategory"},{id:-75283823,predicate:"topPeerCategoryPeers",params:[{name:"category",type:"TopPeerCategory"},{name:"count",type:"int"},{name:"peers",type:"Vector"}],type:"TopPeerCategoryPeers"},{id:-567906571,predicate:"contacts.topPeersNotModified",params:[],type:"contacts.TopPeers"},{id:1891070632,predicate:"contacts.topPeers",params:[{name:"categories",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.TopPeers"},{id:-595914432,predicate:"messageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"long"}],type:"MessageEntity"},{id:546203849,predicate:"inputMessageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"InputUser"}],type:"MessageEntity"},{id:975236280,predicate:"inputMessagesFilterChatPhotos",params:[],type:"MessagesFilter"},{id:-1218471511,predicate:"updateReadChannelOutbox",params:[{name:"channel_id",type:"long"},{name:"max_id",type:"int"}],type:"Update"},{id:457829485,predicate:"updateDraftMessage",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"top_msg_id",type:"flags.0?int"},{name:"draft",type:"DraftMessage"}],type:"Update"},{id:453805082,predicate:"draftMessageEmpty",params:[{name:"flags",type:"#"},{name:"date",type:"flags.0?int"}],type:"DraftMessage"},{id:-40996577,predicate:"draftMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"},{name:"date",type:"int"}],type:"DraftMessage"},{id:-1615153660,predicate:"messageActionHistoryClear",params:[],type:"MessageAction"},{id:-958657434,predicate:"messages.featuredStickersNotModified",params:[{name:"count",type:"int"}],type:"messages.FeaturedStickers"},{id:-1103615738,predicate:"messages.featuredStickers",params:[{name:"flags",type:"#"},{name:"premium",type:"flags.0?true"},{name:"hash",type:"long"},{name:"count",type:"int"},{name:"sets",type:"Vector"},{name:"unread",type:"Vector"}],type:"messages.FeaturedStickers"},{id:1461528386,predicate:"updateReadFeaturedStickers",params:[],type:"Update"},{id:186120336,predicate:"messages.recentStickersNotModified",params:[],type:"messages.RecentStickers"},{id:-1999405994,predicate:"messages.recentStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"},{name:"dates",type:"Vector"}],type:"messages.RecentStickers"},{id:-1706939360,predicate:"updateRecentStickers",params:[],type:"Update"},{id:1338747336,predicate:"messages.archivedStickers",params:[{name:"count",type:"int"},{name:"sets",type:"Vector"}],type:"messages.ArchivedStickers"},{id:946083368,predicate:"messages.stickerSetInstallResultSuccess",params:[],type:"messages.StickerSetInstallResult"},{id:904138920,predicate:"messages.stickerSetInstallResultArchive",params:[{name:"sets",type:"Vector"}],type:"messages.StickerSetInstallResult"},{id:1678812626,predicate:"stickerSetCovered",params:[{name:"set",type:"StickerSet"},{name:"cover",type:"Document"}],type:"StickerSetCovered"},{id:-1574314746,predicate:"updateConfig",params:[],type:"Update"},{id:861169551,predicate:"updatePtsChanged",params:[],type:"Update"},{id:-440664550,predicate:"inputMediaPhotoExternal",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.1?true"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-78455655,predicate:"inputMediaDocumentExternal",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.1?true"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:872932635,predicate:"stickerSetMultiCovered",params:[{name:"set",type:"StickerSet"},{name:"covers",type:"Vector"}],type:"StickerSetCovered"},{id:-1361650766,predicate:"maskCoords",params:[{name:"n",type:"int"},{name:"x",type:"double"},{name:"y",type:"double"},{name:"zoom",type:"double"}],type:"MaskCoords"},{id:-1744710921,predicate:"documentAttributeHasStickers",params:[],type:"DocumentAttribute"},{id:1251549527,predicate:"inputStickeredMediaPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputStickeredMedia"},{id:70813275,predicate:"inputStickeredMediaDocument",params:[{name:"id",type:"InputDocument"}],type:"InputStickeredMedia"},{id:-1107729093,predicate:"game",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"short_name",type:"string"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"Photo"},{name:"document",type:"flags.0?Document"}],type:"Game"},{id:1336154098,predicate:"inputBotInlineResultGame",params:[{name:"id",type:"string"},{name:"short_name",type:"string"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1262639204,predicate:"inputBotInlineMessageGame",params:[{name:"flags",type:"#"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-38694904,predicate:"messageMediaGame",params:[{name:"game",type:"Game"}],type:"MessageMedia"},{id:-750828557,predicate:"inputMediaGame",params:[{name:"id",type:"InputGame"}],type:"InputMedia"},{id:53231223,predicate:"inputGameID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGame"},{id:-1020139510,predicate:"inputGameShortName",params:[{name:"bot_id",type:"InputUser"},{name:"short_name",type:"string"}],type:"InputGame"},{id:1358175439,predicate:"keyboardButtonGame",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1834538890,predicate:"messageActionGameScore",params:[{name:"game_id",type:"long"},{name:"score",type:"int"}],type:"MessageAction"},{id:1940093419,predicate:"highScore",params:[{name:"pos",type:"int"},{name:"user_id",type:"long"},{name:"score",type:"int"}],type:"HighScore"},{id:-1707344487,predicate:"messages.highScores",params:[{name:"scores",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.HighScores"},{id:1258196845,predicate:"updates.differenceTooLong",params:[{name:"pts",type:"int"}],type:"updates.Difference"},{id:791390623,predicate:"updateChannelWebPage",params:[{name:"channel_id",type:"long"},{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1663561404,predicate:"messages.chatsSlice",params:[{name:"count",type:"int"},{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-599948721,predicate:"textEmpty",params:[],type:"RichText"},{id:1950782688,predicate:"textPlain",params:[{name:"text",type:"string"}],type:"RichText"},{id:1730456516,predicate:"textBold",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-653089380,predicate:"textItalic",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1054465340,predicate:"textUnderline",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1678197867,predicate:"textStrike",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1816074681,predicate:"textFixed",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1009288385,predicate:"textUrl",params:[{name:"text",type:"RichText"},{name:"url",type:"string"},{name:"webpage_id",type:"long"}],type:"RichText"},{id:-564523562,predicate:"textEmail",params:[{name:"text",type:"RichText"},{name:"email",type:"string"}],type:"RichText"},{id:2120376535,predicate:"textConcat",params:[{name:"texts",type:"Vector"}],type:"RichText"},{id:324435594,predicate:"pageBlockUnsupported",params:[],type:"PageBlock"},{id:1890305021,predicate:"pageBlockTitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1879401953,predicate:"pageBlockSubtitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1162877472,predicate:"pageBlockAuthorDate",params:[{name:"author",type:"RichText"},{name:"published_date",type:"int"}],type:"PageBlock"},{id:-1076861716,predicate:"pageBlockHeader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-248793375,predicate:"pageBlockSubheader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:1182402406,predicate:"pageBlockParagraph",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1066346178,predicate:"pageBlockPreformatted",params:[{name:"text",type:"RichText"},{name:"language",type:"string"}],type:"PageBlock"},{id:1216809369,predicate:"pageBlockFooter",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-618614392,predicate:"pageBlockDivider",params:[],type:"PageBlock"},{id:-837994576,predicate:"pageBlockAnchor",params:[{name:"name",type:"string"}],type:"PageBlock"},{id:-454524911,predicate:"pageBlockList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:641563686,predicate:"pageBlockBlockquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:1329878739,predicate:"pageBlockPullquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:391759200,predicate:"pageBlockPhoto",params:[{name:"flags",type:"#"},{name:"photo_id",type:"long"},{name:"caption",type:"PageCaption"},{name:"url",type:"flags.0?string"},{name:"webpage_id",type:"flags.0?long"}],type:"PageBlock"},{id:2089805750,predicate:"pageBlockVideo",params:[{name:"flags",type:"#"},{name:"autoplay",type:"flags.0?true"},{name:"loop",type:"flags.1?true"},{name:"video_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:972174080,predicate:"pageBlockCover",params:[{name:"cover",type:"PageBlock"}],type:"PageBlock"},{id:-1468953147,predicate:"pageBlockEmbed",params:[{name:"flags",type:"#"},{name:"full_width",type:"flags.0?true"},{name:"allow_scrolling",type:"flags.3?true"},{name:"url",type:"flags.1?string"},{name:"html",type:"flags.2?string"},{name:"poster_photo_id",type:"flags.4?long"},{name:"w",type:"flags.5?int"},{name:"h",type:"flags.5?int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-229005301,predicate:"pageBlockEmbedPost",params:[{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"author_photo_id",type:"long"},{name:"author",type:"string"},{name:"date",type:"int"},{name:"blocks",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1705048653,predicate:"pageBlockCollage",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:52401552,predicate:"pageBlockSlideshow",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1930545681,predicate:"webPageNotModified",params:[{name:"flags",type:"#"},{name:"cached_page_views",type:"flags.0?int"}],type:"WebPage"},{id:-88417185,predicate:"inputPrivacyKeyPhoneCall",params:[],type:"InputPrivacyKey"},{id:1030105979,predicate:"privacyKeyPhoneCall",params:[],type:"PrivacyKey"},{id:-580219064,predicate:"sendMessageGamePlayAction",params:[],type:"SendMessageAction"},{id:-2048646399,predicate:"phoneCallDiscardReasonMissed",params:[],type:"PhoneCallDiscardReason"},{id:-527056480,predicate:"phoneCallDiscardReasonDisconnect",params:[],type:"PhoneCallDiscardReason"},{id:1471006352,predicate:"phoneCallDiscardReasonHangup",params:[],type:"PhoneCallDiscardReason"},{id:-84416311,predicate:"phoneCallDiscardReasonBusy",params:[],type:"PhoneCallDiscardReason"},{id:1852826908,predicate:"updateDialogPinned",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-99664734,predicate:"updatePinnedDialogs",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.1?int"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:2104790276,predicate:"dataJSON",params:[{name:"data",type:"string"}],type:"DataJSON"},{id:-2095595325,predicate:"updateBotWebhookJSON",params:[{name:"data",type:"DataJSON"}],type:"Update"},{id:-1684914010,predicate:"updateBotWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"},{name:"timeout",type:"int"}],type:"Update"},{id:-886477832,predicate:"labeledPrice",params:[{name:"label",type:"string"},{name:"amount",type:"long"}],type:"LabeledPrice"},{id:1048946971,predicate:"invoice",params:[{name:"flags",type:"#"},{name:"test",type:"flags.0?true"},{name:"name_requested",type:"flags.1?true"},{name:"phone_requested",type:"flags.2?true"},{name:"email_requested",type:"flags.3?true"},{name:"shipping_address_requested",type:"flags.4?true"},{name:"flexible",type:"flags.5?true"},{name:"phone_to_provider",type:"flags.6?true"},{name:"email_to_provider",type:"flags.7?true"},{name:"recurring",type:"flags.9?true"},{name:"currency",type:"string"},{name:"prices",type:"Vector"},{name:"max_tip_amount",type:"flags.8?long"},{name:"suggested_tip_amounts",type:"flags.8?Vector"},{name:"recurring_terms_url",type:"flags.9?string"}],type:"Invoice"},{id:-1900697899,predicate:"inputMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"start_param",type:"flags.1?string"},{name:"extended_media",type:"flags.2?InputMedia"}],type:"InputMedia"},{id:-368917890,predicate:"paymentCharge",params:[{name:"id",type:"string"},{name:"provider_charge_id",type:"string"}],type:"PaymentCharge"},{id:-1892568281,predicate:"messageActionPaymentSentMe",params:[{name:"flags",type:"#"},{name:"recurring_init",type:"flags.2?true"},{name:"recurring_used",type:"flags.3?true"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"charge",type:"PaymentCharge"}],type:"MessageAction"},{id:-156940077,predicate:"messageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"receipt_msg_id",type:"flags.2?int"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"start_param",type:"string"},{name:"extended_media",type:"flags.4?MessageExtendedMedia"}],type:"MessageMedia"},{id:512535275,predicate:"postAddress",params:[{name:"street_line1",type:"string"},{name:"street_line2",type:"string"},{name:"city",type:"string"},{name:"state",type:"string"},{name:"country_iso2",type:"string"},{name:"post_code",type:"string"}],type:"PostAddress"},{id:-1868808300,predicate:"paymentRequestedInfo",params:[{name:"flags",type:"#"},{name:"name",type:"flags.0?string"},{name:"phone",type:"flags.1?string"},{name:"email",type:"flags.2?string"},{name:"shipping_address",type:"flags.3?PostAddress"}],type:"PaymentRequestedInfo"},{id:-1344716869,predicate:"keyboardButtonBuy",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1776926890,predicate:"messageActionPaymentSent",params:[{name:"flags",type:"#"},{name:"recurring_init",type:"flags.2?true"},{name:"recurring_used",type:"flags.3?true"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"invoice_slug",type:"flags.0?string"}],type:"MessageAction"},{id:-842892769,predicate:"paymentSavedCredentialsCard",params:[{name:"id",type:"string"},{name:"title",type:"string"}],type:"PaymentSavedCredentials"},{id:475467473,predicate:"webDocument",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:-1678949555,predicate:"inputWebDocument",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"InputWebDocument"},{id:-1036396922,predicate:"inputWebFileLocation",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"}],type:"InputWebFileLocation"},{id:568808380,predicate:"upload.webFile",params:[{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"file_type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.WebFile"},{id:-1610250415,predicate:"payments.paymentForm",params:[{name:"flags",type:"#"},{name:"can_save_credentials",type:"flags.2?true"},{name:"password_missing",type:"flags.3?true"},{name:"form_id",type:"long"},{name:"bot_id",type:"long"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.5?WebDocument"},{name:"invoice",type:"Invoice"},{name:"provider_id",type:"long"},{name:"url",type:"string"},{name:"native_provider",type:"flags.4?string"},{name:"native_params",type:"flags.4?DataJSON"},{name:"additional_methods",type:"flags.6?Vector"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?Vector"},{name:"users",type:"Vector"}],type:"payments.PaymentForm"},{id:-784000893,predicate:"payments.validatedRequestedInfo",params:[{name:"flags",type:"#"},{name:"id",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"payments.ValidatedRequestedInfo"},{id:1314881805,predicate:"payments.paymentResult",params:[{name:"updates",type:"Updates"}],type:"payments.PaymentResult"},{id:1891958275,predicate:"payments.paymentReceipt",params:[{name:"flags",type:"#"},{name:"date",type:"int"},{name:"bot_id",type:"long"},{name:"provider_id",type:"long"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.2?WebDocument"},{name:"invoice",type:"Invoice"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping",type:"flags.1?ShippingOption"},{name:"tip_amount",type:"flags.3?long"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"credentials_title",type:"string"},{name:"users",type:"Vector"}],type:"payments.PaymentReceipt"},{id:-74456004,predicate:"payments.savedInfo",params:[{name:"flags",type:"#"},{name:"has_saved_credentials",type:"flags.1?true"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"}],type:"payments.SavedInfo"},{id:-1056001329,predicate:"inputPaymentCredentialsSaved",params:[{name:"id",type:"string"},{name:"tmp_password",type:"bytes"}],type:"InputPaymentCredentials"},{id:873977640,predicate:"inputPaymentCredentials",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-614138572,predicate:"account.tmpPassword",params:[{name:"tmp_password",type:"bytes"},{name:"valid_until",type:"int"}],type:"account.TmpPassword"},{id:-1239335713,predicate:"shippingOption",params:[{name:"id",type:"string"},{name:"title",type:"string"},{name:"prices",type:"Vector"}],type:"ShippingOption"},{id:-1246823043,predicate:"updateBotShippingQuery",params:[{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"shipping_address",type:"PostAddress"}],type:"Update"},{id:-1934976362,predicate:"updateBotPrecheckoutQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"Update"},{id:-6249322,predicate:"inputStickerSetItem",params:[{name:"flags",type:"#"},{name:"document",type:"InputDocument"},{name:"emoji",type:"string"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"InputStickerSetItem"},{id:-1425052898,predicate:"updatePhoneCall",params:[{name:"phone_call",type:"PhoneCall"}],type:"Update"},{id:506920429,predicate:"inputPhoneCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPhoneCall"},{id:1399245077,predicate:"phoneCallEmpty",params:[{name:"id",type:"long"}],type:"PhoneCall"},{id:-987599081,predicate:"phoneCallWaiting",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"receive_date",type:"flags.0?int"}],type:"PhoneCall"},{id:347139340,predicate:"phoneCallRequested",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:912311057,predicate:"phoneCallAccepted",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:-1770029977,predicate:"phoneCall",params:[{name:"flags",type:"#"},{name:"p2p_allowed",type:"flags.5?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"connections",type:"Vector"},{name:"start_date",type:"int"}],type:"PhoneCall"},{id:1355435489,predicate:"phoneCallDiscarded",params:[{name:"flags",type:"#"},{name:"need_rating",type:"flags.2?true"},{name:"need_debug",type:"flags.3?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"PhoneCall"},{id:-1665063993,predicate:"phoneConnection",params:[{name:"flags",type:"#"},{name:"tcp",type:"flags.0?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"peer_tag",type:"bytes"}],type:"PhoneConnection"},{id:-58224696,predicate:"phoneCallProtocol",params:[{name:"flags",type:"#"},{name:"udp_p2p",type:"flags.0?true"},{name:"udp_reflector",type:"flags.1?true"},{name:"min_layer",type:"int"},{name:"max_layer",type:"int"},{name:"library_versions",type:"Vector"}],type:"PhoneCallProtocol"},{id:-326966976,predicate:"phone.phoneCall",params:[{name:"phone_call",type:"PhoneCall"},{name:"users",type:"Vector"}],type:"phone.PhoneCall"},{id:-2134272152,predicate:"inputMessagesFilterPhoneCalls",params:[{name:"flags",type:"#"},{name:"missed",type:"flags.0?true"}],type:"MessagesFilter"},{id:-2132731265,predicate:"messageActionPhoneCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.2?true"},{name:"call_id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"MessageAction"},{id:2054952868,predicate:"inputMessagesFilterRoundVoice",params:[],type:"MessagesFilter"},{id:-1253451181,predicate:"inputMessagesFilterRoundVideo",params:[],type:"MessagesFilter"},{id:-1997373508,predicate:"sendMessageRecordRoundAction",params:[],type:"SendMessageAction"},{id:608050278,predicate:"sendMessageUploadRoundAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-242427324,predicate:"upload.fileCdnRedirect",params:[{name:"dc_id",type:"int"},{name:"file_token",type:"bytes"},{name:"encryption_key",type:"bytes"},{name:"encryption_iv",type:"bytes"},{name:"file_hashes",type:"Vector"}],type:"upload.File"},{id:-290921362,predicate:"upload.cdnFileReuploadNeeded",params:[{name:"request_token",type:"bytes"}],type:"upload.CdnFile"},{id:-1449145777,predicate:"upload.cdnFile",params:[{name:"bytes",type:"bytes"}],type:"upload.CdnFile"},{id:-914167110,predicate:"cdnPublicKey",params:[{name:"dc_id",type:"int"},{name:"public_key",type:"string"}],type:"CdnPublicKey"},{id:1462101002,predicate:"cdnConfig",params:[{name:"public_keys",type:"Vector"}],type:"CdnConfig"},{id:-283684427,predicate:"pageBlockChannel",params:[{name:"channel",type:"Chat"}],type:"PageBlock"},{id:-892239370,predicate:"langPackString",params:[{name:"key",type:"string"},{name:"value",type:"string"}],type:"LangPackString"},{id:1816636575,predicate:"langPackStringPluralized",params:[{name:"flags",type:"#"},{name:"key",type:"string"},{name:"zero_value",type:"flags.0?string"},{name:"one_value",type:"flags.1?string"},{name:"two_value",type:"flags.2?string"},{name:"few_value",type:"flags.3?string"},{name:"many_value",type:"flags.4?string"},{name:"other_value",type:"string"}],type:"LangPackString"},{id:695856818,predicate:"langPackStringDeleted",params:[{name:"key",type:"string"}],type:"LangPackString"},{id:-209337866,predicate:"langPackDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"strings",type:"Vector"}],type:"LangPackDifference"},{id:-288727837,predicate:"langPackLanguage",params:[{name:"flags",type:"#"},{name:"official",type:"flags.0?true"},{name:"rtl",type:"flags.2?true"},{name:"beta",type:"flags.3?true"},{name:"name",type:"string"},{name:"native_name",type:"string"},{name:"lang_code",type:"string"},{name:"base_lang_code",type:"flags.1?string"},{name:"plural_code",type:"string"},{name:"strings_count",type:"int"},{name:"translated_count",type:"int"},{name:"translations_url",type:"string"}],type:"LangPackLanguage"},{id:1180041828,predicate:"updateLangPackTooLong",params:[{name:"lang_code",type:"string"}],type:"Update"},{id:1442983757,predicate:"updateLangPack",params:[{name:"difference",type:"LangPackDifference"}],type:"Update"},{id:885242707,predicate:"channelParticipantAdmin",params:[{name:"flags",type:"#"},{name:"can_edit",type:"flags.0?true"},{name:"self",type:"flags.1?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"flags.1?long"},{name:"promoted_by",type:"long"},{name:"date",type:"int"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.2?string"}],type:"ChannelParticipant"},{id:1844969806,predicate:"channelParticipantBanned",params:[{name:"flags",type:"#"},{name:"left",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"kicked_by",type:"long"},{name:"date",type:"int"},{name:"banned_rights",type:"ChatBannedRights"}],type:"ChannelParticipant"},{id:338142689,predicate:"channelParticipantsBanned",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:106343499,predicate:"channelParticipantsSearch",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-421545947,predicate:"channelAdminLogEventActionChangeTitle",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1427671598,predicate:"channelAdminLogEventActionChangeAbout",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1783299128,predicate:"channelAdminLogEventActionChangeUsername",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1129042607,predicate:"channelAdminLogEventActionChangePhoto",params:[{name:"prev_photo",type:"Photo"},{name:"new_photo",type:"Photo"}],type:"ChannelAdminLogEventAction"},{id:460916654,predicate:"channelAdminLogEventActionToggleInvites",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:648939889,predicate:"channelAdminLogEventActionToggleSignatures",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-370660328,predicate:"channelAdminLogEventActionUpdatePinned",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1889215493,predicate:"channelAdminLogEventActionEditMessage",params:[{name:"prev_message",type:"Message"},{name:"new_message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1121994683,predicate:"channelAdminLogEventActionDeleteMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:405815507,predicate:"channelAdminLogEventActionParticipantJoin",params:[],type:"ChannelAdminLogEventAction"},{id:-124291086,predicate:"channelAdminLogEventActionParticipantLeave",params:[],type:"ChannelAdminLogEventAction"},{id:-484690728,predicate:"channelAdminLogEventActionParticipantInvite",params:[{name:"participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-422036098,predicate:"channelAdminLogEventActionParticipantToggleBan",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-714643696,predicate:"channelAdminLogEventActionParticipantToggleAdmin",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:531458253,predicate:"channelAdminLogEvent",params:[{name:"id",type:"long"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"action",type:"ChannelAdminLogEventAction"}],type:"ChannelAdminLogEvent"},{id:-309659827,predicate:"channels.adminLogResults",params:[{name:"events",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.AdminLogResults"},{id:-368018716,predicate:"channelAdminLogEventsFilter",params:[{name:"flags",type:"#"},{name:"join",type:"flags.0?true"},{name:"leave",type:"flags.1?true"},{name:"invite",type:"flags.2?true"},{name:"ban",type:"flags.3?true"},{name:"unban",type:"flags.4?true"},{name:"kick",type:"flags.5?true"},{name:"unkick",type:"flags.6?true"},{name:"promote",type:"flags.7?true"},{name:"demote",type:"flags.8?true"},{name:"info",type:"flags.9?true"},{name:"settings",type:"flags.10?true"},{name:"pinned",type:"flags.11?true"},{name:"edit",type:"flags.12?true"},{name:"delete",type:"flags.13?true"},{name:"group_call",type:"flags.14?true"},{name:"invites",type:"flags.15?true"},{name:"send",type:"flags.16?true"},{name:"forums",type:"flags.17?true"}],type:"ChannelAdminLogEventsFilter"},{id:511092620,predicate:"topPeerCategoryPhoneCalls",params:[],type:"TopPeerCategory"},{id:-2143067670,predicate:"pageBlockAudio",params:[{name:"audio_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1558266229,predicate:"popularContact",params:[{name:"client_id",type:"long"},{name:"importers",type:"int"}],type:"PopularContact"},{id:1200788123,predicate:"messageActionScreenshotTaken",params:[],type:"MessageAction"},{id:-1634752813,predicate:"messages.favedStickersNotModified",params:[],type:"messages.FavedStickers"},{id:750063767,predicate:"messages.favedStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"}],type:"messages.FavedStickers"},{id:-451831443,predicate:"updateFavedStickers",params:[],type:"Update"},{id:-366410403,predicate:"updateChannelReadMessagesContents",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"messages",type:"Vector"}],type:"Update"},{id:-1040652646,predicate:"inputMessagesFilterMyMentions",params:[],type:"MessagesFilter"},{id:1887741886,predicate:"updateContactsReset",params:[],type:"Update"},{id:-1312568665,predicate:"channelAdminLogEventActionChangeStickerSet",params:[{name:"prev_stickerset",type:"InputStickerSet"},{name:"new_stickerset",type:"InputStickerSet"}],type:"ChannelAdminLogEventAction"},{id:-85549226,predicate:"messageActionCustomAction",params:[{name:"message",type:"string"}],type:"MessageAction"},{id:178373535,predicate:"inputPaymentCredentialsApplePay",params:[{name:"payment_data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-419271411,predicate:"inputMessagesFilterGeo",params:[],type:"MessagesFilter"},{id:-530392189,predicate:"inputMessagesFilterContacts",params:[],type:"MessagesFilter"},{id:-1304443240,predicate:"updateChannelAvailableMessages",params:[{name:"channel_id",type:"long"},{name:"available_min_id",type:"int"}],type:"Update"},{id:1599903217,predicate:"channelAdminLogEventActionTogglePreHistoryHidden",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-1759532989,predicate:"inputMediaGeoLive",params:[{name:"flags",type:"#"},{name:"stopped",type:"flags.0?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.2?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"}],type:"InputMedia"},{id:-1186937242,predicate:"messageMediaGeoLive",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"int"},{name:"proximity_notification_radius",type:"flags.1?int"}],type:"MessageMedia"},{id:1189204285,predicate:"recentMeUrlUnknown",params:[{name:"url",type:"string"}],type:"RecentMeUrl"},{id:-1188296222,predicate:"recentMeUrlUser",params:[{name:"url",type:"string"},{name:"user_id",type:"long"}],type:"RecentMeUrl"},{id:-1294306862,predicate:"recentMeUrlChat",params:[{name:"url",type:"string"},{name:"chat_id",type:"long"}],type:"RecentMeUrl"},{id:-347535331,predicate:"recentMeUrlChatInvite",params:[{name:"url",type:"string"},{name:"chat_invite",type:"ChatInvite"}],type:"RecentMeUrl"},{id:-1140172836,predicate:"recentMeUrlStickerSet",params:[{name:"url",type:"string"},{name:"set",type:"StickerSetCovered"}],type:"RecentMeUrl"},{id:235081943,predicate:"help.recentMeUrls",params:[{name:"urls",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"help.RecentMeUrls"},{id:-266911767,predicate:"channels.channelParticipantsNotModified",params:[],type:"channels.ChannelParticipants"},{id:1951620897,predicate:"messages.messagesNotModified",params:[{name:"count",type:"int"}],type:"messages.Messages"},{id:482797855,predicate:"inputSingleMedia",params:[{name:"flags",type:"#"},{name:"media",type:"InputMedia"},{name:"random_id",type:"long"},{name:"message",type:"string"},{name:"entities",type:"flags.0?Vector"}],type:"InputSingleMedia"},{id:-1493633966,predicate:"webAuthorization",params:[{name:"hash",type:"long"},{name:"bot_id",type:"long"},{name:"domain",type:"string"},{name:"browser",type:"string"},{name:"platform",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"region",type:"string"}],type:"WebAuthorization"},{id:-313079300,predicate:"account.webAuthorizations",params:[{name:"authorizations",type:"Vector"},{name:"users",type:"Vector"}],type:"account.WebAuthorizations"},{id:-1502174430,predicate:"inputMessageID",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-1160215659,predicate:"inputMessageReplyTo",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-2037963464,predicate:"inputMessagePinned",params:[],type:"InputMessage"},{id:-1687559349,predicate:"messageEntityPhone",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1280209983,predicate:"messageEntityCashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1410748418,predicate:"messageActionBotAllowed",params:[{name:"domain",type:"string"}],type:"MessageAction"},{id:-55902537,predicate:"inputDialogPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputDialogPeer"},{id:-445792507,predicate:"dialogPeer",params:[{name:"peer",type:"Peer"}],type:"DialogPeer"},{id:223655517,predicate:"messages.foundStickerSetsNotModified",params:[],type:"messages.FoundStickerSets"},{id:-1963942446,predicate:"messages.foundStickerSets",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.FoundStickerSets"},{id:-207944868,predicate:"fileHash",params:[{name:"offset",type:"long"},{name:"limit",type:"int"},{name:"hash",type:"bytes"}],type:"FileHash"},{id:-104284986,predicate:"webDocumentNoProxy",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:1968737087,predicate:"inputClientProxy",params:[{name:"address",type:"string"},{name:"port",type:"int"}],type:"InputClientProxy"},{id:-483352705,predicate:"help.termsOfServiceUpdateEmpty",params:[{name:"expires",type:"int"}],type:"help.TermsOfServiceUpdate"},{id:686618977,predicate:"help.termsOfServiceUpdate",params:[{name:"expires",type:"int"},{name:"terms_of_service",type:"help.TermsOfService"}],type:"help.TermsOfServiceUpdate"},{id:859091184,predicate:"inputSecureFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"InputSecureFile"},{id:1399317950,predicate:"inputSecureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputSecureFile"},{id:-876089816,predicate:"inputSecureFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:1679398724,predicate:"secureFileEmpty",params:[],type:"SecureFile"},{id:2097791614,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"long"},{name:"dc_id",type:"int"},{name:"date",type:"int"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureFile"},{id:-1964327229,predicate:"secureData",params:[{name:"data",type:"bytes"},{name:"data_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureData"},{id:2103482845,predicate:"securePlainPhone",params:[{name:"phone",type:"string"}],type:"SecurePlainData"},{id:569137759,predicate:"securePlainEmail",params:[{name:"email",type:"string"}],type:"SecurePlainData"},{id:-1658158621,predicate:"secureValueTypePersonalDetails",params:[],type:"SecureValueType"},{id:1034709504,predicate:"secureValueTypePassport",params:[],type:"SecureValueType"},{id:115615172,predicate:"secureValueTypeDriverLicense",params:[],type:"SecureValueType"},{id:-1596951477,predicate:"secureValueTypeIdentityCard",params:[],type:"SecureValueType"},{id:-1717268701,predicate:"secureValueTypeInternalPassport",params:[],type:"SecureValueType"},{id:-874308058,predicate:"secureValueTypeAddress",params:[],type:"SecureValueType"},{id:-63531698,predicate:"secureValueTypeUtilityBill",params:[],type:"SecureValueType"},{id:-1995211763,predicate:"secureValueTypeBankStatement",params:[],type:"SecureValueType"},{id:-1954007928,predicate:"secureValueTypeRentalAgreement",params:[],type:"SecureValueType"},{id:-1713143702,predicate:"secureValueTypePassportRegistration",params:[],type:"SecureValueType"},{id:-368907213,predicate:"secureValueTypeTemporaryRegistration",params:[],type:"SecureValueType"},{id:-1289704741,predicate:"secureValueTypePhone",params:[],type:"SecureValueType"},{id:-1908627474,predicate:"secureValueTypeEmail",params:[],type:"SecureValueType"},{id:411017418,predicate:"secureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?SecureFile"},{name:"reverse_side",type:"flags.2?SecureFile"},{name:"selfie",type:"flags.3?SecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"},{name:"hash",type:"bytes"}],type:"SecureValue"},{id:-618540889,predicate:"inputSecureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?InputSecureFile"},{name:"reverse_side",type:"flags.2?InputSecureFile"},{name:"selfie",type:"flags.3?InputSecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"}],type:"InputSecureValue"},{id:-316748368,predicate:"secureValueHash",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"}],type:"SecureValueHash"},{id:-391902247,predicate:"secureValueErrorData",params:[{name:"type",type:"SecureValueType"},{name:"data_hash",type:"bytes"},{name:"field",type:"string"},{name:"text",type:"string"}],type:"SecureValueError"},{id:12467706,predicate:"secureValueErrorFrontSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2037765467,predicate:"secureValueErrorReverseSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-449327402,predicate:"secureValueErrorSelfie",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:2054162547,predicate:"secureValueErrorFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:1717706985,predicate:"secureValueErrorFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:871426631,predicate:"secureCredentialsEncrypted",params:[{name:"data",type:"bytes"},{name:"hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureCredentialsEncrypted"},{id:-1389486888,predicate:"account.authorizationForm",params:[{name:"flags",type:"#"},{name:"required_types",type:"Vector"},{name:"values",type:"Vector"},{name:"errors",type:"Vector"},{name:"users",type:"Vector"},{name:"privacy_policy_url",type:"flags.0?string"}],type:"account.AuthorizationForm"},{id:-2128640689,predicate:"account.sentEmailCode",params:[{name:"email_pattern",type:"string"},{name:"length",type:"int"}],type:"account.SentEmailCode"},{id:455635795,predicate:"messageActionSecureValuesSentMe",params:[{name:"values",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"MessageAction"},{id:-648257196,predicate:"messageActionSecureValuesSent",params:[{name:"types",type:"Vector"}],type:"MessageAction"},{id:1722786150,predicate:"help.deepLinkInfoEmpty",params:[],type:"help.DeepLinkInfo"},{id:1783556146,predicate:"help.deepLinkInfo",params:[{name:"flags",type:"#"},{name:"update_app",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"help.DeepLinkInfo"},{id:289586518,predicate:"savedPhoneContact",params:[{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"date",type:"int"}],type:"SavedContact"},{id:1304052993,predicate:"account.takeout",params:[{name:"id",type:"long"}],type:"account.Takeout"},{id:700340377,predicate:"inputTakeoutFileLocation",params:[],type:"InputFileLocation"},{id:-513517117,predicate:"updateDialogUnreadMark",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-253500010,predicate:"messages.dialogsNotModified",params:[{name:"count",type:"int"}],type:"messages.Dialogs"},{id:-1625153079,predicate:"inputWebFileGeoPointLocation",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"access_hash",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"zoom",type:"int"},{name:"scale",type:"int"}],type:"InputWebFileLocation"},{id:-1255369827,predicate:"contacts.topPeersDisabled",params:[],type:"contacts.TopPeers"},{id:-1685456582,predicate:"inputReportReasonCopyright",params:[],type:"ReportReason"},{id:-732254058,predicate:"passwordKdfAlgoUnknown",params:[],type:"PasswordKdfAlgo"},{id:4883767,predicate:"securePasswordKdfAlgoUnknown",params:[],type:"SecurePasswordKdfAlgo"},{id:-1141711456,predicate:"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:-2042159726,predicate:"securePasswordKdfAlgoSHA512",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:354925740,predicate:"secureSecretSettings",params:[{name:"secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_secret",type:"bytes"},{name:"secure_secret_id",type:"long"}],type:"SecureSecretSettings"},{id:982592842,predicate:"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow",params:[{name:"salt1",type:"bytes"},{name:"salt2",type:"bytes"},{name:"g",type:"int"},{name:"p",type:"bytes"}],type:"PasswordKdfAlgo"},{id:-1736378792,predicate:"inputCheckPasswordEmpty",params:[],type:"InputCheckPasswordSRP"},{id:-763367294,predicate:"inputCheckPasswordSRP",params:[{name:"srp_id",type:"long"},{name:"A",type:"bytes"},{name:"M1",type:"bytes"}],type:"InputCheckPasswordSRP"},{id:-2036501105,predicate:"secureValueError",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-1592506512,predicate:"secureValueErrorTranslationFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:878931416,predicate:"secureValueErrorTranslationFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2103600678,predicate:"secureRequiredType",params:[{name:"flags",type:"#"},{name:"native_names",type:"flags.0?true"},{name:"selfie_required",type:"flags.1?true"},{name:"translation_required",type:"flags.2?true"},{name:"type",type:"SecureValueType"}],type:"SecureRequiredType"},{id:41187252,predicate:"secureRequiredTypeOneOf",params:[{name:"types",type:"Vector"}],type:"SecureRequiredType"},{id:-1078332329,predicate:"help.passportConfigNotModified",params:[],type:"help.PassportConfig"},{id:-1600596305,predicate:"help.passportConfig",params:[{name:"hash",type:"int"},{name:"countries_langs",type:"DataJSON"}],type:"help.PassportConfig"},{id:488313413,predicate:"inputAppEvent",params:[{name:"time",type:"double"},{name:"type",type:"string"},{name:"peer",type:"long"},{name:"data",type:"JSONValue"}],type:"InputAppEvent"},{id:-1059185703,predicate:"jsonObjectValue",params:[{name:"key",type:"string"},{name:"value",type:"JSONValue"}],type:"JSONObjectValue"},{id:1064139624,predicate:"jsonNull",params:[],type:"JSONValue"},{id:-952869270,predicate:"jsonBool",params:[{name:"value",type:"Bool"}],type:"JSONValue"},{id:736157604,predicate:"jsonNumber",params:[{name:"value",type:"double"}],type:"JSONValue"},{id:-1222740358,predicate:"jsonString",params:[{name:"value",type:"string"}],type:"JSONValue"},{id:-146520221,predicate:"jsonArray",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1715350371,predicate:"jsonObject",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1311015810,predicate:"inputNotifyBroadcasts",params:[],type:"InputNotifyPeer"},{id:-703403793,predicate:"notifyBroadcasts",params:[],type:"NotifyPeer"},{id:-311786236,predicate:"textSubscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-939827711,predicate:"textSuperscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:55281185,predicate:"textMarked",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:483104362,predicate:"textPhone",params:[{name:"text",type:"RichText"},{name:"phone",type:"string"}],type:"RichText"},{id:136105807,predicate:"textImage",params:[{name:"document_id",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"RichText"},{id:504660880,predicate:"pageBlockKicker",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:878078826,predicate:"pageTableCell",params:[{name:"flags",type:"#"},{name:"header",type:"flags.0?true"},{name:"align_center",type:"flags.3?true"},{name:"align_right",type:"flags.4?true"},{name:"valign_middle",type:"flags.5?true"},{name:"valign_bottom",type:"flags.6?true"},{name:"text",type:"flags.7?RichText"},{name:"colspan",type:"flags.1?int"},{name:"rowspan",type:"flags.2?int"}],type:"PageTableCell"},{id:-524237339,predicate:"pageTableRow",params:[{name:"cells",type:"Vector"}],type:"PageTableRow"},{id:-1085412734,predicate:"pageBlockTable",params:[{name:"flags",type:"#"},{name:"bordered",type:"flags.0?true"},{name:"striped",type:"flags.1?true"},{name:"title",type:"RichText"},{name:"rows",type:"Vector"}],type:"PageBlock"},{id:1869903447,predicate:"pageCaption",params:[{name:"text",type:"RichText"},{name:"credit",type:"RichText"}],type:"PageCaption"},{id:-1188055347,predicate:"pageListItemText",params:[{name:"text",type:"RichText"}],type:"PageListItem"},{id:635466748,predicate:"pageListItemBlocks",params:[{name:"blocks",type:"Vector"}],type:"PageListItem"},{id:1577484359,predicate:"pageListOrderedItemText",params:[{name:"num",type:"string"},{name:"text",type:"RichText"}],type:"PageListOrderedItem"},{id:-1730311882,predicate:"pageListOrderedItemBlocks",params:[{name:"num",type:"string"},{name:"blocks",type:"Vector"}],type:"PageListOrderedItem"},{id:-1702174239,predicate:"pageBlockOrderedList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:1987480557,predicate:"pageBlockDetails",params:[{name:"flags",type:"#"},{name:"open",type:"flags.0?true"},{name:"blocks",type:"Vector"},{name:"title",type:"RichText"}],type:"PageBlock"},{id:-1282352120,predicate:"pageRelatedArticle",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"title",type:"flags.0?string"},{name:"description",type:"flags.1?string"},{name:"photo_id",type:"flags.2?long"},{name:"author",type:"flags.3?string"},{name:"published_date",type:"flags.4?int"}],type:"PageRelatedArticle"},{id:370236054,predicate:"pageBlockRelatedArticles",params:[{name:"title",type:"RichText"},{name:"articles",type:"Vector"}],type:"PageBlock"},{id:-1538310410,predicate:"pageBlockMap",params:[{name:"geo",type:"GeoPoint"},{name:"zoom",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-1738178803,predicate:"page",params:[{name:"flags",type:"#"},{name:"part",type:"flags.0?true"},{name:"rtl",type:"flags.1?true"},{name:"v2",type:"flags.2?true"},{name:"url",type:"string"},{name:"blocks",type:"Vector"},{name:"photos",type:"Vector"},{name:"documents",type:"Vector"},{name:"views",type:"flags.3?int"}],type:"Page"},{id:-610373422,predicate:"inputPrivacyKeyPhoneP2P",params:[],type:"InputPrivacyKey"},{id:961092808,predicate:"privacyKeyPhoneP2P",params:[],type:"PrivacyKey"},{id:894777186,predicate:"textAnchor",params:[{name:"text",type:"RichText"},{name:"name",type:"string"}],type:"RichText"},{id:-1945767479,predicate:"help.supportName",params:[{name:"name",type:"string"}],type:"help.SupportName"},{id:-206688531,predicate:"help.userInfoEmpty",params:[],type:"help.UserInfo"},{id:32192344,predicate:"help.userInfo",params:[{name:"message",type:"string"},{name:"entities",type:"Vector"},{name:"author",type:"string"},{name:"date",type:"int"}],type:"help.UserInfo"},{id:-202219658,predicate:"messageActionContactSignUp",params:[],type:"MessageAction"},{id:-1398708869,predicate:"updateMessagePoll",params:[{name:"flags",type:"#"},{name:"poll_id",type:"long"},{name:"poll",type:"flags.0?Poll"},{name:"results",type:"PollResults"}],type:"Update"},{id:1823064809,predicate:"pollAnswer",params:[{name:"text",type:"string"},{name:"option",type:"bytes"}],type:"PollAnswer"},{id:-2032041631,predicate:"poll",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"closed",type:"flags.0?true"},{name:"public_voters",type:"flags.1?true"},{name:"multiple_choice",type:"flags.2?true"},{name:"quiz",type:"flags.3?true"},{name:"question",type:"string"},{name:"answers",type:"Vector"},{name:"close_period",type:"flags.4?int"},{name:"close_date",type:"flags.5?int"}],type:"Poll"},{id:997055186,predicate:"pollAnswerVoters",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"correct",type:"flags.1?true"},{name:"option",type:"bytes"},{name:"voters",type:"int"}],type:"PollAnswerVoters"},{id:-591909213,predicate:"pollResults",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"results",type:"flags.1?Vector"},{name:"total_voters",type:"flags.2?int"},{name:"recent_voters",type:"flags.3?Vector"},{name:"solution",type:"flags.4?string"},{name:"solution_entities",type:"flags.4?Vector"}],type:"PollResults"},{id:261416433,predicate:"inputMediaPoll",params:[{name:"flags",type:"#"},{name:"poll",type:"Poll"},{name:"correct_answers",type:"flags.0?Vector"},{name:"solution",type:"flags.1?string"},{name:"solution_entities",type:"flags.1?Vector"}],type:"InputMedia"},{id:1272375192,predicate:"messageMediaPoll",params:[{name:"poll",type:"Poll"},{name:"results",type:"PollResults"}],type:"MessageMedia"},{id:-264117680,predicate:"chatOnlines",params:[{name:"onlines",type:"int"}],type:"ChatOnlines"},{id:1202287072,predicate:"statsURL",params:[{name:"url",type:"string"}],type:"StatsURL"},{id:-525288402,predicate:"photoStrippedSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:1605510357,predicate:"chatAdminRights",params:[{name:"flags",type:"#"},{name:"change_info",type:"flags.0?true"},{name:"post_messages",type:"flags.1?true"},{name:"edit_messages",type:"flags.2?true"},{name:"delete_messages",type:"flags.3?true"},{name:"ban_users",type:"flags.4?true"},{name:"invite_users",type:"flags.5?true"},{name:"pin_messages",type:"flags.7?true"},{name:"add_admins",type:"flags.9?true"},{name:"anonymous",type:"flags.10?true"},{name:"manage_call",type:"flags.11?true"},{name:"other",type:"flags.12?true"},{name:"manage_topics",type:"flags.13?true"}],type:"ChatAdminRights"},{id:-1626209256,predicate:"chatBannedRights",params:[{name:"flags",type:"#"},{name:"view_messages",type:"flags.0?true"},{name:"send_messages",type:"flags.1?true"},{name:"send_media",type:"flags.2?true"},{name:"send_stickers",type:"flags.3?true"},{name:"send_gifs",type:"flags.4?true"},{name:"send_games",type:"flags.5?true"},{name:"send_inline",type:"flags.6?true"},{name:"embed_links",type:"flags.7?true"},{name:"send_polls",type:"flags.8?true"},{name:"change_info",type:"flags.10?true"},{name:"invite_users",type:"flags.15?true"},{name:"pin_messages",type:"flags.17?true"},{name:"manage_topics",type:"flags.18?true"},{name:"until_date",type:"int"}],type:"ChatBannedRights"},{id:1421875280,predicate:"updateChatDefaultBannedRights",params:[{name:"peer",type:"Peer"},{name:"default_banned_rights",type:"ChatBannedRights"},{name:"version",type:"int"}],type:"Update"},{id:-433014407,predicate:"inputWallPaper",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputWallPaper"},{id:1913199744,predicate:"inputWallPaperSlug",params:[{name:"slug",type:"string"}],type:"InputWallPaper"},{id:-1150621555,predicate:"channelParticipantsContacts",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:771095562,predicate:"channelAdminLogEventActionDefaultBannedRights",params:[{name:"prev_banned_rights",type:"ChatBannedRights"},{name:"new_banned_rights",type:"ChatBannedRights"}],type:"ChannelAdminLogEventAction"},{id:-1895328189,predicate:"channelAdminLogEventActionStopPoll",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:471437699,predicate:"account.wallPapersNotModified",params:[],type:"account.WallPapers"},{id:-842824308,predicate:"account.wallPapers",params:[{name:"hash",type:"long"},{name:"wallpapers",type:"Vector"}],type:"account.WallPapers"},{id:-1973130814,predicate:"codeSettings",params:[{name:"flags",type:"#"},{name:"allow_flashcall",type:"flags.0?true"},{name:"current_number",type:"flags.1?true"},{name:"allow_app_hash",type:"flags.4?true"},{name:"allow_missed_call",type:"flags.5?true"},{name:"logout_tokens",type:"flags.6?Vector"}],type:"CodeSettings"},{id:499236004,predicate:"wallPaperSettings",params:[{name:"flags",type:"#"},{name:"blur",type:"flags.1?true"},{name:"motion",type:"flags.2?true"},{name:"background_color",type:"flags.0?int"},{name:"second_background_color",type:"flags.4?int"},{name:"third_background_color",type:"flags.5?int"},{name:"fourth_background_color",type:"flags.6?int"},{name:"intensity",type:"flags.3?int"},{name:"rotation",type:"flags.4?int"}],type:"WallPaperSettings"},{id:-1896171181,predicate:"autoDownloadSettings",params:[{name:"flags",type:"#"},{name:"disabled",type:"flags.0?true"},{name:"video_preload_large",type:"flags.1?true"},{name:"audio_preload_next",type:"flags.2?true"},{name:"phonecalls_less_data",type:"flags.3?true"},{name:"photo_size_max",type:"int"},{name:"video_size_max",type:"long"},{name:"file_size_max",type:"long"},{name:"video_upload_maxbitrate",type:"int"}],type:"AutoDownloadSettings"},{id:1674235686,predicate:"account.autoDownloadSettings",params:[{name:"low",type:"AutoDownloadSettings"},{name:"medium",type:"AutoDownloadSettings"},{name:"high",type:"AutoDownloadSettings"}],type:"account.AutoDownloadSettings"},{id:-709641735,predicate:"emojiKeyword",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:594408994,predicate:"emojiKeywordDeleted",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:1556570557,predicate:"emojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"keywords",type:"Vector"}],type:"EmojiKeywordsDifference"},{id:-1519029347,predicate:"emojiURL",params:[{name:"url",type:"string"}],type:"EmojiURL"},{id:-1275374751,predicate:"emojiLanguage",params:[{name:"lang_code",type:"string"}],type:"EmojiLanguage"},{id:-1529000952,predicate:"inputPrivacyKeyForwards",params:[],type:"InputPrivacyKey"},{id:1777096355,predicate:"privacyKeyForwards",params:[],type:"PrivacyKey"},{id:1461304012,predicate:"inputPrivacyKeyProfilePhoto",params:[],type:"InputPrivacyKey"},{id:-1777000467,predicate:"privacyKeyProfilePhoto",params:[],type:"PrivacyKey"},{id:1075322878,predicate:"inputPhotoFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:-667654413,predicate:"inputPhotoLegacyFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"}],type:"InputFileLocation"},{id:925204121,predicate:"inputPeerPhotoFileLocation",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"photo_id",type:"long"}],type:"InputFileLocation"},{id:-1652231205,predicate:"inputStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb_version",type:"int"}],type:"InputFileLocation"},{id:-11252123,predicate:"folder",params:[{name:"flags",type:"#"},{name:"autofill_new_broadcasts",type:"flags.0?true"},{name:"autofill_public_groups",type:"flags.1?true"},{name:"autofill_new_correspondents",type:"flags.2?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"photo",type:"flags.3?ChatPhoto"}],type:"Folder"},{id:1908216652,predicate:"dialogFolder",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"folder",type:"Folder"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"unread_muted_peers_count",type:"int"},{name:"unread_unmuted_peers_count",type:"int"},{name:"unread_muted_messages_count",type:"int"},{name:"unread_unmuted_messages_count",type:"int"}],type:"Dialog"},{id:1684014375,predicate:"inputDialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"InputDialogPeer"},{id:1363483106,predicate:"dialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"DialogPeer"},{id:-70073706,predicate:"inputFolderPeer",params:[{name:"peer",type:"InputPeer"},{name:"folder_id",type:"int"}],type:"InputFolderPeer"},{id:-373643672,predicate:"folderPeer",params:[{name:"peer",type:"Peer"},{name:"folder_id",type:"int"}],type:"FolderPeer"},{id:422972864,predicate:"updateFolderPeers",params:[{name:"folder_peers",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:497305826,predicate:"inputUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputUser"},{id:1536380829,predicate:"inputChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputChannel"},{id:-1468331492,predicate:"inputPeerUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputPeer"},{id:-1121318848,predicate:"inputPeerChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputPeer"},{id:55761658,predicate:"inputPrivacyKeyPhoneNumber",params:[],type:"InputPrivacyKey"},{id:-778378131,predicate:"privacyKeyPhoneNumber",params:[],type:"PrivacyKey"},{id:-1472172887,predicate:"topPeerCategoryForwardUsers",params:[],type:"TopPeerCategory"},{id:-68239120,predicate:"topPeerCategoryForwardChats",params:[],type:"TopPeerCategory"},{id:84703944,predicate:"channelAdminLogEventActionChangeLinkedChat",params:[{name:"prev_value",type:"long"},{name:"new_value",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-398136321,predicate:"messages.searchCounter",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"filter",type:"MessagesFilter"},{name:"count",type:"int"}],type:"messages.SearchCounter"},{id:280464681,predicate:"keyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.0?string"},{name:"url",type:"string"},{name:"button_id",type:"int"}],type:"KeyboardButton"},{id:-802258988,predicate:"inputKeyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.1?string"},{name:"url",type:"string"},{name:"bot",type:"InputUser"}],type:"KeyboardButton"},{id:-1831650802,predicate:"urlAuthResultRequest",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"bot",type:"User"},{name:"domain",type:"string"}],type:"UrlAuthResult"},{id:-1886646706,predicate:"urlAuthResultAccepted",params:[{name:"url",type:"string"}],type:"UrlAuthResult"},{id:-1445536993,predicate:"urlAuthResultDefault",params:[],type:"UrlAuthResult"},{id:-2079962673,predicate:"inputPrivacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-380694650,predicate:"inputPrivacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:1796427406,predicate:"privacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1103656293,predicate:"privacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:-1672577397,predicate:"messageEntityUnderline",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1090087980,predicate:"messageEntityStrike",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:34469328,predicate:"messageEntityBlockquote",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1786671974,predicate:"updatePeerSettings",params:[{name:"peer",type:"Peer"},{name:"settings",type:"PeerSettings"}],type:"Update"},{id:-1078612597,predicate:"channelLocationEmpty",params:[],type:"ChannelLocation"},{id:547062491,predicate:"channelLocation",params:[{name:"geo_point",type:"GeoPoint"},{name:"address",type:"string"}],type:"ChannelLocation"},{id:-901375139,predicate:"peerLocated",params:[{name:"peer",type:"Peer"},{name:"expires",type:"int"},{name:"distance",type:"int"}],type:"PeerLocated"},{id:-1263546448,predicate:"updatePeerLocated",params:[{name:"peers",type:"Vector"}],type:"Update"},{id:241923758,predicate:"channelAdminLogEventActionChangeLocation",params:[{name:"prev_value",type:"ChannelLocation"},{name:"new_value",type:"ChannelLocation"}],type:"ChannelAdminLogEventAction"},{id:-606798099,predicate:"inputReportReasonGeoIrrelevant",params:[],type:"ReportReason"},{id:1401984889,predicate:"channelAdminLogEventActionToggleSlowMode",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:1148485274,predicate:"auth.authorizationSignUpRequired",params:[{name:"flags",type:"#"},{name:"terms_of_service",type:"flags.0?help.TermsOfService"}],type:"auth.Authorization"},{id:-666824391,predicate:"payments.paymentVerificationNeeded",params:[{name:"url",type:"string"}],type:"payments.PaymentResult"},{id:42402760,predicate:"inputStickerSetAnimatedEmoji",params:[],type:"InputStickerSet"},{id:967122427,predicate:"updateNewScheduledMessage",params:[{name:"message",type:"Message"}],type:"Update"},{id:-1870238482,predicate:"updateDeleteScheduledMessages",params:[{name:"peer",type:"Peer"},{name:"messages",type:"Vector"}],type:"Update"},{id:-797791052,predicate:"restrictionReason",params:[{name:"platform",type:"string"},{name:"reason",type:"string"},{name:"text",type:"string"}],type:"RestrictionReason"},{id:1012306921,predicate:"inputTheme",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputTheme"},{id:-175567375,predicate:"inputThemeSlug",params:[{name:"slug",type:"string"}],type:"InputTheme"},{id:-1609668650,predicate:"theme",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"for_chat",type:"flags.5?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?Document"},{name:"settings",type:"flags.3?Vector"},{name:"emoticon",type:"flags.6?string"},{name:"installs_count",type:"flags.4?int"}],type:"Theme"},{id:-199313886,predicate:"account.themesNotModified",params:[],type:"account.Themes"},{id:-1707242387,predicate:"account.themes",params:[{name:"hash",type:"long"},{name:"themes",type:"Vector"}],type:"account.Themes"},{id:-2112423005,predicate:"updateTheme",params:[{name:"theme",type:"Theme"}],type:"Update"},{id:-786326563,predicate:"inputPrivacyKeyAddedByPhone",params:[],type:"InputPrivacyKey"},{id:1124062251,predicate:"privacyKeyAddedByPhone",params:[],type:"PrivacyKey"},{id:-2027964103,predicate:"updateGeoLiveViewed",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"}],type:"Update"},{id:1448076945,predicate:"updateLoginToken",params:[],type:"Update"},{id:1654593920,predicate:"auth.loginToken",params:[{name:"expires",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:110008598,predicate:"auth.loginTokenMigrateTo",params:[{name:"dc_id",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:957176926,predicate:"auth.loginTokenSuccess",params:[{name:"authorization",type:"auth.Authorization"}],type:"auth.LoginToken"},{id:1474462241,predicate:"account.contentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"},{name:"sensitive_can_change",type:"flags.1?true"}],type:"account.ContentSettings"},{id:-1456996667,predicate:"messages.inactiveChats",params:[{name:"dates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.InactiveChats"},{id:-1012849566,predicate:"baseThemeClassic",params:[],type:"BaseTheme"},{id:-69724536,predicate:"baseThemeDay",params:[],type:"BaseTheme"},{id:-1212997976,predicate:"baseThemeNight",params:[],type:"BaseTheme"},{id:1834973166,predicate:"baseThemeTinted",params:[],type:"BaseTheme"},{id:1527845466,predicate:"baseThemeArctic",params:[],type:"BaseTheme"},{id:-1770371538,predicate:"inputWallPaperNoFile",params:[{name:"id",type:"long"}],type:"InputWallPaper"},{id:-528465642,predicate:"wallPaperNoFile",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"default",type:"flags.1?true"},{name:"dark",type:"flags.4?true"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:-1881255857,predicate:"inputThemeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?InputWallPaper"},{name:"wallpaper_settings",type:"flags.1?WallPaperSettings"}],type:"InputThemeSettings"},{id:-94849324,predicate:"themeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?WallPaper"}],type:"ThemeSettings"},{id:1421174295,predicate:"webPageAttributeTheme",params:[{name:"flags",type:"#"},{name:"documents",type:"flags.0?Vector"},{name:"settings",type:"flags.1?ThemeSettings"}],type:"WebPageAttribute"},{id:274961865,predicate:"updateMessagePollVote",params:[{name:"poll_id",type:"long"},{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"qts",type:"int"}],type:"Update"},{id:886196148,predicate:"messageUserVote",params:[{name:"user_id",type:"long"},{name:"option",type:"bytes"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:1017491692,predicate:"messageUserVoteInputOption",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:-1973033641,predicate:"messageUserVoteMultiple",params:[{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:136574537,predicate:"messages.votesList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"votes",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.VotesList"},{id:-1144565411,predicate:"keyboardButtonRequestPoll",params:[{name:"flags",type:"#"},{name:"quiz",type:"flags.0?Bool"},{name:"text",type:"string"}],type:"KeyboardButton"},{id:1981704948,predicate:"messageEntityBankCard",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-177732982,predicate:"bankCardOpenUrl",params:[{name:"url",type:"string"},{name:"name",type:"string"}],type:"BankCardOpenUrl"},{id:1042605427,predicate:"payments.bankCardData",params:[{name:"title",type:"string"},{name:"open_urls",type:"Vector"}],type:"payments.BankCardData"},{id:-118740917,predicate:"peerSelfLocated",params:[{name:"expires",type:"int"}],type:"PeerLocated"},{id:1949890536,predicate:"dialogFilter",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"non_contacts",type:"flags.1?true"},{name:"groups",type:"flags.2?true"},{name:"broadcasts",type:"flags.3?true"},{name:"bots",type:"flags.4?true"},{name:"exclude_muted",type:"flags.11?true"},{name:"exclude_read",type:"flags.12?true"},{name:"exclude_archived",type:"flags.13?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"emoticon",type:"flags.25?string"},{name:"pinned_peers",type:"Vector"},{name:"include_peers",type:"Vector"},{name:"exclude_peers",type:"Vector"}],type:"DialogFilter"},{id:2004110666,predicate:"dialogFilterSuggested",params:[{name:"filter",type:"DialogFilter"},{name:"description",type:"string"}],type:"DialogFilterSuggested"},{id:654302845,predicate:"updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Update"},{id:-1512627963,predicate:"updateDialogFilterOrder",params:[{name:"order",type:"Vector"}],type:"Update"},{id:889491791,predicate:"updateDialogFilters",params:[],type:"Update"},{id:-1237848657,predicate:"statsDateRangeDays",params:[{name:"min_date",type:"int"},{name:"max_date",type:"int"}],type:"StatsDateRangeDays"},{id:-884757282,predicate:"statsAbsValueAndPrev",params:[{name:"current",type:"double"},{name:"previous",type:"double"}],type:"StatsAbsValueAndPrev"},{id:-875679776,predicate:"statsPercentValue",params:[{name:"part",type:"double"},{name:"total",type:"double"}],type:"StatsPercentValue"},{id:1244130093,predicate:"statsGraphAsync",params:[{name:"token",type:"string"}],type:"StatsGraph"},{id:-1092839390,predicate:"statsGraphError",params:[{name:"error",type:"string"}],type:"StatsGraph"},{id:-1901828938,predicate:"statsGraph",params:[{name:"flags",type:"#"},{name:"json",type:"DataJSON"},{name:"zoom_token",type:"flags.0?string"}],type:"StatsGraph"},{id:-1387279939,predicate:"messageInteractionCounters",params:[{name:"msg_id",type:"int"},{name:"views",type:"int"},{name:"forwards",type:"int"}],type:"MessageInteractionCounters"},{id:-1107852396,predicate:"stats.broadcastStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"followers",type:"StatsAbsValueAndPrev"},{name:"views_per_post",type:"StatsAbsValueAndPrev"},{name:"shares_per_post",type:"StatsAbsValueAndPrev"},{name:"enabled_notifications",type:"StatsPercentValue"},{name:"growth_graph",type:"StatsGraph"},{name:"followers_graph",type:"StatsGraph"},{name:"mute_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"interactions_graph",type:"StatsGraph"},{name:"iv_interactions_graph",type:"StatsGraph"},{name:"views_by_source_graph",type:"StatsGraph"},{name:"new_followers_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"recent_message_interactions",type:"Vector"}],type:"stats.BroadcastStats"},{id:-428884101,predicate:"inputMediaDice",params:[{name:"emoticon",type:"string"}],type:"InputMedia"},{id:1065280907,predicate:"messageMediaDice",params:[{name:"value",type:"int"},{name:"emoticon",type:"string"}],type:"MessageMedia"},{id:-427863538,predicate:"inputStickerSetDice",params:[{name:"emoticon",type:"string"}],type:"InputStickerSet"},{id:-1728664459,predicate:"help.promoDataEmpty",params:[{name:"expires",type:"int"}],type:"help.PromoData"},{id:-1942390465,predicate:"help.promoData",params:[{name:"flags",type:"#"},{name:"proxy",type:"flags.0?true"},{name:"expires",type:"int"},{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"psa_type",type:"flags.1?string"},{name:"psa_message",type:"flags.2?string"}],type:"help.PromoData"},{id:-567037804,predicate:"videoSize",params:[{name:"flags",type:"#"},{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"},{name:"video_start_ts",type:"flags.0?double"}],type:"VideoSize"},{id:643940105,predicate:"updatePhoneCallSignalingData",params:[{name:"phone_call_id",type:"long"},{name:"data",type:"bytes"}],type:"Update"},{id:1634294960,predicate:"chatInvitePeek",params:[{name:"chat",type:"Chat"},{name:"expires",type:"int"}],type:"ChatInvite"},{id:-1660637285,predicate:"statsGroupTopPoster",params:[{name:"user_id",type:"long"},{name:"messages",type:"int"},{name:"avg_chars",type:"int"}],type:"StatsGroupTopPoster"},{id:-682079097,predicate:"statsGroupTopAdmin",params:[{name:"user_id",type:"long"},{name:"deleted",type:"int"},{name:"kicked",type:"int"},{name:"banned",type:"int"}],type:"StatsGroupTopAdmin"},{id:1398765469,predicate:"statsGroupTopInviter",params:[{name:"user_id",type:"long"},{name:"invitations",type:"int"}],type:"StatsGroupTopInviter"},{id:-276825834,predicate:"stats.megagroupStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"members",type:"StatsAbsValueAndPrev"},{name:"messages",type:"StatsAbsValueAndPrev"},{name:"viewers",type:"StatsAbsValueAndPrev"},{name:"posters",type:"StatsAbsValueAndPrev"},{name:"growth_graph",type:"StatsGraph"},{name:"members_graph",type:"StatsGraph"},{name:"new_members_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"messages_graph",type:"StatsGraph"},{name:"actions_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"weekdays_graph",type:"StatsGraph"},{name:"top_posters",type:"Vector"},{name:"top_admins",type:"Vector"},{name:"top_inviters",type:"Vector"},{name:"users",type:"Vector"}],type:"stats.MegagroupStats"},{id:-1096616924,predicate:"globalPrivacySettings",params:[{name:"flags",type:"#"},{name:"archive_and_mute_new_noncontact_peers",type:"flags.0?Bool"}],type:"GlobalPrivacySettings"},{id:1667228533,predicate:"phoneConnectionWebrtc",params:[{name:"flags",type:"#"},{name:"turn",type:"flags.0?true"},{name:"stun",type:"flags.1?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"username",type:"string"},{name:"password",type:"string"}],type:"PhoneConnection"},{id:1107543535,predicate:"help.countryCode",params:[{name:"flags",type:"#"},{name:"country_code",type:"string"},{name:"prefixes",type:"flags.0?Vector"},{name:"patterns",type:"flags.1?Vector"}],type:"help.CountryCode"},{id:-1014526429,predicate:"help.country",params:[{name:"flags",type:"#"},{name:"hidden",type:"flags.0?true"},{name:"iso2",type:"string"},{name:"default_name",type:"string"},{name:"name",type:"flags.1?string"},{name:"country_codes",type:"Vector"}],type:"help.Country"},{id:-1815339214,predicate:"help.countriesListNotModified",params:[],type:"help.CountriesList"},{id:-2016381538,predicate:"help.countriesList",params:[{name:"countries",type:"Vector"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:1163625789,predicate:"messageViews",params:[{name:"flags",type:"#"},{name:"views",type:"flags.0?int"},{name:"forwards",type:"flags.1?int"},{name:"replies",type:"flags.2?MessageReplies"}],type:"MessageViews"},{id:-761649164,predicate:"updateChannelMessageForwards",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"forwards",type:"int"}],type:"Update"},{id:-96535659,predicate:"photoSizeProgressive",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"sizes",type:"Vector"}],type:"PhotoSize"},{id:-1228606141,predicate:"messages.messageViews",params:[{name:"views",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.MessageViews"},{id:-693004986,predicate:"updateReadChannelDiscussionInbox",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"},{name:"broadcast_id",type:"flags.0?long"},{name:"broadcast_post",type:"flags.0?int"}],type:"Update"},{id:1767677564,predicate:"updateReadChannelDiscussionOutbox",params:[{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Update"},{id:-1506535550,predicate:"messages.discussionMessage",params:[{name:"flags",type:"#"},{name:"messages",type:"Vector"},{name:"max_id",type:"flags.0?int"},{name:"read_inbox_max_id",type:"flags.1?int"},{name:"read_outbox_max_id",type:"flags.2?int"},{name:"unread_count",type:"int"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.DiscussionMessage"},{id:-1495959709,predicate:"messageReplyHeader",params:[{name:"flags",type:"#"},{name:"reply_to_scheduled",type:"flags.2?true"},{name:"forum_topic",type:"flags.3?true"},{name:"reply_to_msg_id",type:"int"},{name:"reply_to_peer_id",type:"flags.0?Peer"},{name:"reply_to_top_id",type:"flags.1?int"}],type:"MessageReplyHeader"},{id:-2083123262,predicate:"messageReplies",params:[{name:"flags",type:"#"},{name:"comments",type:"flags.0?true"},{name:"replies",type:"int"},{name:"replies_pts",type:"int"},{name:"recent_repliers",type:"flags.1?Vector"},{name:"channel_id",type:"flags.0?long"},{name:"max_id",type:"flags.2?int"},{name:"read_max_id",type:"flags.3?int"}],type:"MessageReplies"},{id:610945826,predicate:"updatePeerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"blocked",type:"Bool"}],type:"Update"},{id:-386039788,predicate:"peerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"date",type:"int"}],type:"PeerBlocked"},{id:-1937192669,predicate:"updateChannelUserTyping",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-1392895362,predicate:"inputMessageCallbackQuery",params:[{name:"id",type:"int"},{name:"query_id",type:"long"}],type:"InputMessage"},{id:453242886,predicate:"channelParticipantLeft",params:[{name:"peer",type:"Peer"}],type:"ChannelParticipant"},{id:-531931925,predicate:"channelParticipantsMentions",params:[{name:"flags",type:"#"},{name:"q",type:"flags.0?string"},{name:"top_msg_id",type:"flags.1?int"}],type:"ChannelParticipantsFilter"},{id:-309990731,predicate:"updatePinnedMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1538885128,predicate:"updatePinnedChannelMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:464520273,predicate:"inputMessagesFilterPinned",params:[],type:"MessagesFilter"},{id:-1986399595,predicate:"stats.messageStats",params:[{name:"views_graph",type:"StatsGraph"}],type:"stats.MessageStats"},{id:-1730095465,predicate:"messageActionGeoProximityReached",params:[{name:"from_id",type:"Peer"},{name:"to_id",type:"Peer"},{name:"distance",type:"int"}],type:"MessageAction"},{id:-668906175,predicate:"photoPathSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-651419003,predicate:"speakingInGroupCallAction",params:[],type:"SendMessageAction"},{id:2004925620,predicate:"groupCallDiscarded",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"duration",type:"int"}],type:"GroupCall"},{id:-711498484,predicate:"groupCall",params:[{name:"flags",type:"#"},{name:"join_muted",type:"flags.1?true"},{name:"can_change_join_muted",type:"flags.2?true"},{name:"join_date_asc",type:"flags.6?true"},{name:"schedule_start_subscribed",type:"flags.8?true"},{name:"can_start_video",type:"flags.9?true"},{name:"record_video_active",type:"flags.11?true"},{name:"rtmp_stream",type:"flags.12?true"},{name:"listeners_hidden",type:"flags.13?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"participants_count",type:"int"},{name:"title",type:"flags.3?string"},{name:"stream_dc_id",type:"flags.4?int"},{name:"record_start_date",type:"flags.5?int"},{name:"schedule_date",type:"flags.7?int"},{name:"unmuted_video_count",type:"flags.10?int"},{name:"unmuted_video_limit",type:"int"},{name:"version",type:"int"}],type:"GroupCall"},{id:-659913713,predicate:"inputGroupCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGroupCall"},{id:2047704898,predicate:"messageActionGroupCall",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"duration",type:"flags.0?int"}],type:"MessageAction"},{id:1345295095,predicate:"messageActionInviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-341428482,predicate:"groupCallParticipant",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"left",type:"flags.1?true"},{name:"can_self_unmute",type:"flags.2?true"},{name:"just_joined",type:"flags.4?true"},{name:"versioned",type:"flags.5?true"},{name:"min",type:"flags.8?true"},{name:"muted_by_you",type:"flags.9?true"},{name:"volume_by_admin",type:"flags.10?true"},{name:"self",type:"flags.12?true"},{name:"video_joined",type:"flags.15?true"},{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"active_date",type:"flags.3?int"},{name:"source",type:"int"},{name:"volume",type:"flags.7?int"},{name:"about",type:"flags.11?string"},{name:"raise_hand_rating",type:"flags.13?long"},{name:"video",type:"flags.6?GroupCallParticipantVideo"},{name:"presentation",type:"flags.14?GroupCallParticipantVideo"}],type:"GroupCallParticipant"},{id:-124097970,predicate:"updateChat",params:[{name:"chat_id",type:"long"}],type:"Update"},{id:-219423922,predicate:"updateGroupCallParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"Update"},{id:347227392,predicate:"updateGroupCall",params:[{name:"chat_id",type:"long"},{name:"call",type:"GroupCall"}],type:"Update"},{id:-1636664659,predicate:"phone.groupCall",params:[{name:"call",type:"GroupCall"},{name:"participants",type:"Vector"},{name:"participants_next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.GroupCall"},{id:-193506890,predicate:"phone.groupParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"version",type:"int"}],type:"phone.GroupParticipants"},{id:813821341,predicate:"inlineQueryPeerTypeSameBotPM",params:[],type:"InlineQueryPeerType"},{id:-2093215828,predicate:"inlineQueryPeerTypePM",params:[],type:"InlineQueryPeerType"},{id:-681130742,predicate:"inlineQueryPeerTypeChat",params:[],type:"InlineQueryPeerType"},{id:1589952067,predicate:"inlineQueryPeerTypeMegagroup",params:[],type:"InlineQueryPeerType"},{id:1664413338,predicate:"inlineQueryPeerTypeBroadcast",params:[],type:"InlineQueryPeerType"},{id:589338437,predicate:"channelAdminLogEventActionStartGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-610299584,predicate:"channelAdminLogEventActionDiscardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-115071790,predicate:"channelAdminLogEventActionParticipantMute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:-431740480,predicate:"channelAdminLogEventActionParticipantUnmute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1456906823,predicate:"channelAdminLogEventActionToggleGroupCallSetting",params:[{name:"join_muted",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-1966921727,predicate:"inputPaymentCredentialsGooglePay",params:[{name:"payment_token",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:375566091,predicate:"messages.historyImport",params:[{name:"id",type:"long"}],type:"messages.HistoryImport"},{id:-606432698,predicate:"sendMessageHistoryImportAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:1578088377,predicate:"messages.historyImportParsed",params:[{name:"flags",type:"#"},{name:"pm",type:"flags.0?true"},{name:"group",type:"flags.1?true"},{name:"title",type:"flags.2?string"}],type:"messages.HistoryImportParsed"},{id:-170010905,predicate:"inputReportReasonFake",params:[],type:"ReportReason"},{id:-275956116,predicate:"messages.affectedFoundMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"},{name:"messages",type:"Vector"}],type:"messages.AffectedFoundMessages"},{id:1007897979,predicate:"messageActionSetMessagesTTL",params:[{name:"flags",type:"#"},{name:"period",type:"int"},{name:"auto_setting_from",type:"flags.0?long"}],type:"MessageAction"},{id:-1147422299,predicate:"updatePeerHistoryTTL",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"ttl_period",type:"flags.0?int"}],type:"Update"},{id:-796432838,predicate:"updateChatParticipant",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChatParticipant"},{name:"new_participant",type:"flags.1?ChatParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1738720581,predicate:"updateChannelParticipant",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChannelParticipant"},{name:"new_participant",type:"flags.1?ChannelParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-997782967,predicate:"updateBotStopped",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"stopped",type:"Bool"},{name:"qts",type:"int"}],type:"Update"},{id:-1940201511,predicate:"chatInviteImporter",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"about",type:"flags.2?string"},{name:"approved_by",type:"flags.1?long"}],type:"ChatInviteImporter"},{id:-1111085620,predicate:"messages.exportedChatInvites",params:[{name:"count",type:"int"},{name:"invites",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvites"},{id:410107472,predicate:"messages.exportedChatInvite",params:[{name:"invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:572915951,predicate:"messages.exportedChatInviteReplaced",params:[{name:"invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:-2118733814,predicate:"messages.chatInviteImporters",params:[{name:"count",type:"int"},{name:"importers",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatInviteImporters"},{id:-219353309,predicate:"chatAdminWithInvites",params:[{name:"admin_id",type:"long"},{name:"invites_count",type:"int"},{name:"revoked_invites_count",type:"int"}],type:"ChatAdminWithInvites"},{id:-1231326505,predicate:"messages.chatAdminsWithInvites",params:[{name:"admins",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatAdminsWithInvites"},{id:1557846647,predicate:"channelAdminLogEventActionParticipantJoinByInvite",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1515256996,predicate:"channelAdminLogEventActionExportedInviteDelete",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1091179342,predicate:"channelAdminLogEventActionExportedInviteRevoke",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:-384910503,predicate:"channelAdminLogEventActionExportedInviteEdit",params:[{name:"prev_invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1048537159,predicate:"channelAdminLogEventActionParticipantVolume",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1855199800,predicate:"channelAdminLogEventActionChangeHistoryTTL",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:-1571952873,predicate:"messages.checkedHistoryImportPeer",params:[{name:"confirm_text",type:"string"}],type:"messages.CheckedHistoryImportPeer"},{id:93890858,predicate:"inputGroupCallStream",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"time_ms",type:"long"},{name:"scale",type:"int"},{name:"video_channel",type:"flags.0?int"},{name:"video_quality",type:"flags.0?int"}],type:"InputFileLocation"},{id:-1343921601,predicate:"phone.joinAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.JoinAsPeers"},{id:541839704,predicate:"phone.exportedGroupCallInvite",params:[{name:"link",type:"string"}],type:"phone.ExportedGroupCallInvite"},{id:-672693723,predicate:"inputBotInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:894081801,predicate:"botInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1281329567,predicate:"messageActionGroupCallScheduled",params:[{name:"call",type:"InputGroupCall"},{name:"schedule_date",type:"int"}],type:"MessageAction"},{id:-592373577,predicate:"groupCallParticipantVideoSourceGroup",params:[{name:"semantics",type:"string"},{name:"sources",type:"Vector"}],type:"GroupCallParticipantVideoSourceGroup"},{id:1735736008,predicate:"groupCallParticipantVideo",params:[{name:"flags",type:"#"},{name:"paused",type:"flags.0?true"},{name:"endpoint",type:"string"},{name:"source_groups",type:"Vector"},{name:"audio_source",type:"flags.1?int"}],type:"GroupCallParticipantVideo"},{id:192428418,predicate:"updateGroupCallConnection",params:[{name:"flags",type:"#"},{name:"presentation",type:"flags.0?true"},{name:"params",type:"DataJSON"}],type:"Update"},{id:-2046910401,predicate:"stickers.suggestedShortName",params:[{name:"short_name",type:"string"}],type:"stickers.SuggestedShortName"},{id:795652779,predicate:"botCommandScopeDefault",params:[],type:"BotCommandScope"},{id:1011811544,predicate:"botCommandScopeUsers",params:[],type:"BotCommandScope"},{id:1877059713,predicate:"botCommandScopeChats",params:[],type:"BotCommandScope"},{id:-1180016534,predicate:"botCommandScopeChatAdmins",params:[],type:"BotCommandScope"},{id:-610432643,predicate:"botCommandScopePeer",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:1071145937,predicate:"botCommandScopePeerAdmins",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:169026035,predicate:"botCommandScopePeerUser",params:[{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"BotCommandScope"},{id:-478701471,predicate:"account.resetPasswordFailedWait",params:[{name:"retry_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-370148227,predicate:"account.resetPasswordRequestedWait",params:[{name:"until_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-383330754,predicate:"account.resetPasswordOk",params:[],type:"account.ResetPasswordResult"},{id:1299263278,predicate:"updateBotCommands",params:[{name:"peer",type:"Peer"},{name:"bot_id",type:"long"},{name:"commands",type:"Vector"}],type:"Update"},{id:-1434950843,predicate:"messageActionSetChatTheme",params:[{name:"emoticon",type:"string"}],type:"MessageAction"},{id:-1336228175,predicate:"sendMessageChooseStickerAction",params:[],type:"SendMessageAction"},{id:981691896,predicate:"sponsoredMessage",params:[{name:"flags",type:"#"},{name:"recommended",type:"flags.5?true"},{name:"show_peer_photo",type:"flags.6?true"},{name:"random_id",type:"bytes"},{name:"from_id",type:"flags.3?Peer"},{name:"chat_invite",type:"flags.4?ChatInvite"},{name:"chat_invite_hash",type:"flags.4?string"},{name:"channel_post",type:"flags.2?int"},{name:"start_param",type:"flags.0?string"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"SponsoredMessage"},{id:-907141753,predicate:"messages.sponsoredMessages",params:[{name:"flags",type:"#"},{name:"posts_between",type:"flags.0?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SponsoredMessages"},{id:215889721,predicate:"inputStickerSetAnimatedEmojiAnimations",params:[],type:"InputStickerSet"},{id:630664139,predicate:"sendMessageEmojiInteraction",params:[{name:"emoticon",type:"string"},{name:"msg_id",type:"int"},{name:"interaction",type:"DataJSON"}],type:"SendMessageAction"},{id:-1234857938,predicate:"sendMessageEmojiInteractionSeen",params:[{name:"emoticon",type:"string"}],type:"SendMessageAction"},{id:-1227287081,predicate:"inputBotInlineMessageID64",params:[{name:"dc_id",type:"int"},{name:"owner_id",type:"long"},{name:"id",type:"int"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:-911191137,predicate:"searchResultsCalendarPeriod",params:[{name:"date",type:"int"},{name:"min_msg_id",type:"int"},{name:"max_msg_id",type:"int"},{name:"count",type:"int"}],type:"SearchResultsCalendarPeriod"},{id:343859772,predicate:"messages.searchResultsCalendar",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.0?true"},{name:"count",type:"int"},{name:"min_date",type:"int"},{name:"min_msg_id",type:"int"},{name:"offset_id_offset",type:"flags.1?int"},{name:"periods",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SearchResultsCalendar"},{id:2137295719,predicate:"searchResultPosition",params:[{name:"msg_id",type:"int"},{name:"date",type:"int"},{name:"offset",type:"int"}],type:"SearchResultsPosition"},{id:1404185519,predicate:"messages.searchResultsPositions",params:[{name:"count",type:"int"},{name:"positions",type:"Vector"}],type:"messages.SearchResultsPositions"},{id:-339958837,predicate:"messageActionChatJoinedByRequest",params:[],type:"MessageAction"},{id:1885586395,predicate:"updatePendingJoinRequests",params:[{name:"peer",type:"Peer"},{name:"requests_pending",type:"int"},{name:"recent_requesters",type:"Vector"}],type:"Update"},{id:299870598,predicate:"updateBotChatInviteRequester",params:[{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"about",type:"string"},{name:"invite",type:"ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1347021750,predicate:"channelAdminLogEventActionParticipantJoinByRequest",params:[{name:"invite",type:"ExportedChatInvite"},{name:"approved_by",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-376962181,predicate:"inputKeyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"InputUser"}],type:"KeyboardButton"},{id:814112961,predicate:"keyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"long"}],type:"KeyboardButton"},{id:-191450938,predicate:"channels.sendAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.SendAsPeers"},{id:-886388890,predicate:"channelAdminLogEventActionToggleNoForwards",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-738646805,predicate:"messages.stickerSetNotModified",params:[],type:"messages.StickerSet"},{id:997004590,predicate:"users.userFull",params:[{name:"full_user",type:"UserFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"users.UserFull"},{id:1753266509,predicate:"messages.peerSettings",params:[{name:"settings",type:"PeerSettings"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.PeerSettings"},{id:663693416,predicate:"channelAdminLogEventActionSendMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:-702884114,predicate:"auth.codeTypeMissedCall",params:[],type:"auth.CodeType"},{id:-2113903484,predicate:"auth.sentCodeTypeMissedCall",params:[{name:"prefix",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1012759713,predicate:"auth.loggedOut",params:[{name:"flags",type:"#"},{name:"future_auth_token",type:"flags.0?bytes"}],type:"auth.LoggedOut"},{id:1578843320,predicate:"updateMessageReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"top_msg_id",type:"flags.0?int"},{name:"reactions",type:"MessageReactions"}],type:"Update"},{id:-1546531968,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen_order",type:"flags.0?int"},{name:"reaction",type:"Reaction"},{name:"count",type:"int"}],type:"ReactionCount"},{id:1328256121,predicate:"messageReactions",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"can_see_list",type:"flags.2?true"},{name:"results",type:"Vector"},{name:"recent_reactions",type:"flags.1?Vector"}],type:"MessageReactions"},{id:834488621,predicate:"messages.messageReactionsList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"reactions",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.MessageReactionsList"},{id:-1065882623,predicate:"availableReaction",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"premium",type:"flags.2?true"},{name:"reaction",type:"string"},{name:"title",type:"string"},{name:"static_icon",type:"Document"},{name:"appear_animation",type:"Document"},{name:"select_animation",type:"Document"},{name:"activate_animation",type:"Document"},{name:"effect_animation",type:"Document"},{name:"around_animation",type:"flags.1?Document"},{name:"center_icon",type:"flags.1?Document"}],type:"AvailableReaction"},{id:-1626924713,predicate:"messages.availableReactionsNotModified",params:[],type:"messages.AvailableReactions"},{id:1989032621,predicate:"messages.availableReactions",params:[{name:"hash",type:"int"},{name:"reactions",type:"Vector"}],type:"messages.AvailableReactions"},{id:852137487,predicate:"messageEntitySpoiler",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1102180616,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"ChatReactions"},{name:"new_value",type:"ChatReactions"}],type:"ChannelAdminLogEventAction"},{id:1741309751,predicate:"messages.translateNoResult",params:[],type:"messages.TranslatedText"},{id:-1575684144,predicate:"messages.translateResultText",params:[{name:"text",type:"string"}],type:"messages.TranslatedText"},{id:-1319698788,predicate:"messagePeerReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"unread",type:"flags.1?true"},{name:"peer_id",type:"Peer"},{name:"reaction",type:"Reaction"}],type:"MessagePeerReaction"},{id:-2132064081,predicate:"groupCallStreamChannel",params:[{name:"channel",type:"int"},{name:"scale",type:"int"},{name:"last_timestamp_ms",type:"long"}],type:"GroupCallStreamChannel"},{id:-790330702,predicate:"phone.groupCallStreamChannels",params:[{name:"channels",type:"Vector"}],type:"phone.GroupCallStreamChannels"},{id:177124030,predicate:"inputReportReasonIllegalDrugs",params:[],type:"ReportReason"},{id:-1631091139,predicate:"inputReportReasonPersonalDetails",params:[],type:"ReportReason"},{id:767505458,predicate:"phone.groupCallStreamRtmpUrl",params:[{name:"url",type:"string"},{name:"key",type:"string"}],type:"phone.GroupCallStreamRtmpUrl"},{id:1165423600,predicate:"attachMenuBotIconColor",params:[{name:"name",type:"string"},{name:"color",type:"int"}],type:"AttachMenuBotIconColor"},{id:-1297663893,predicate:"attachMenuBotIcon",params:[{name:"flags",type:"#"},{name:"name",type:"string"},{name:"icon",type:"Document"},{name:"colors",type:"flags.0?Vector"}],type:"AttachMenuBotIcon"},{id:-928371502,predicate:"attachMenuBot",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"has_settings",type:"flags.1?true"},{name:"request_write_access",type:"flags.2?true"},{name:"bot_id",type:"long"},{name:"short_name",type:"string"},{name:"peer_types",type:"Vector"},{name:"icons",type:"Vector"}],type:"AttachMenuBot"},{id:-237467044,predicate:"attachMenuBotsNotModified",params:[],type:"AttachMenuBots"},{id:1011024320,predicate:"attachMenuBots",params:[{name:"hash",type:"long"},{name:"bots",type:"Vector"},{name:"users",type:"Vector"}],type:"AttachMenuBots"},{id:-1816172929,predicate:"attachMenuBotsBot",params:[{name:"bot",type:"AttachMenuBot"},{name:"users",type:"Vector"}],type:"AttachMenuBotsBot"},{id:397910539,predicate:"updateAttachMenuBots",params:[],type:"Update"},{id:202659196,predicate:"webViewResultUrl",params:[{name:"query_id",type:"long"},{name:"url",type:"string"}],type:"WebViewResult"},{id:-2010155333,predicate:"simpleWebViewResultUrl",params:[{name:"url",type:"string"}],type:"SimpleWebViewResult"},{id:211046684,predicate:"webViewMessageSent",params:[{name:"flags",type:"#"},{name:"msg_id",type:"flags.0?InputBotInlineMessageID"}],type:"WebViewMessageSent"},{id:361936797,predicate:"updateWebViewResultSent",params:[{name:"query_id",type:"long"}],type:"Update"},{id:326529584,predicate:"keyboardButtonWebView",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:-1598009252,predicate:"keyboardButtonSimpleWebView",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:1205698681,predicate:"messageActionWebViewDataSentMe",params:[{name:"text",type:"string"},{name:"data",type:"string"}],type:"MessageAction"},{id:-1262252875,predicate:"messageActionWebViewDataSent",params:[{name:"text",type:"string"}],type:"MessageAction"},{id:347625491,predicate:"updateBotMenuButton",params:[{name:"bot_id",type:"long"},{name:"button",type:"BotMenuButton"}],type:"Update"},{id:1966318984,predicate:"botMenuButtonDefault",params:[],type:"BotMenuButton"},{id:1113113093,predicate:"botMenuButtonCommands",params:[],type:"BotMenuButton"},{id:-944407322,predicate:"botMenuButton",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"BotMenuButton"},{id:-67704655,predicate:"account.savedRingtonesNotModified",params:[],type:"account.SavedRingtones"},{id:-1041683259,predicate:"account.savedRingtones",params:[{name:"hash",type:"long"},{name:"ringtones",type:"Vector"}],type:"account.SavedRingtones"},{id:1960361625,predicate:"updateSavedRingtones",params:[],type:"Update"},{id:-1746354498,predicate:"notificationSoundDefault",params:[],type:"NotificationSound"},{id:1863070943,predicate:"notificationSoundNone",params:[],type:"NotificationSound"},{id:-2096391452,predicate:"notificationSoundLocal",params:[{name:"title",type:"string"},{name:"data",type:"string"}],type:"NotificationSound"},{id:-9666487,predicate:"notificationSoundRingtone",params:[{name:"id",type:"long"}],type:"NotificationSound"},{id:-1222230163,predicate:"account.savedRingtone",params:[],type:"account.SavedRingtone"},{id:523271863,predicate:"account.savedRingtoneConverted",params:[{name:"document",type:"Document"}],type:"account.SavedRingtone"},{id:2104224014,predicate:"attachMenuPeerTypeSameBotPM",params:[],type:"AttachMenuPeerType"},{id:-1020528102,predicate:"attachMenuPeerTypeBotPM",params:[],type:"AttachMenuPeerType"},{id:-247016673,predicate:"attachMenuPeerTypePM",params:[],type:"AttachMenuPeerType"},{id:84480319,predicate:"attachMenuPeerTypeChat",params:[],type:"AttachMenuPeerType"},{id:2080104188,predicate:"attachMenuPeerTypeBroadcast",params:[],type:"AttachMenuPeerType"},{id:-317687113,predicate:"chatInvitePublicJoinRequests",params:[],type:"ExportedChatInvite"},{id:-977967015,predicate:"inputInvoiceMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"InputInvoice"},{id:-1020867857,predicate:"inputInvoiceSlug",params:[{name:"slug",type:"string"}],type:"InputInvoice"},{id:-1362048039,predicate:"payments.exportedInvoice",params:[{name:"url",type:"string"}],type:"payments.ExportedInvoice"},{id:8703322,predicate:"updateTranscribedAudio",params:[{name:"flags",type:"#"},{name:"pending",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"transcription_id",type:"long"},{name:"text",type:"string"}],type:"Update"},{id:-1821037486,predicate:"messages.transcribedAudio",params:[{name:"flags",type:"#"},{name:"pending",type:"flags.0?true"},{name:"transcription_id",type:"long"},{name:"text",type:"string"}],type:"messages.TranscribedAudio"},{id:909284270,predicate:"dialogFilterDefault",params:[],type:"DialogFilter"},{id:1395946908,predicate:"help.premiumPromo",params:[{name:"status_text",type:"string"},{name:"status_entities",type:"Vector"},{name:"video_sections",type:"Vector"},{name:"videos",type:"Vector"},{name:"period_options",type:"Vector"},{name:"users",type:"Vector"}],type:"help.PremiumPromo"},{id:-925956616,predicate:"messageEntityCustomEmoji",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"document_id",type:"long"}],type:"MessageEntity"},{id:-48981863,predicate:"documentAttributeCustomEmoji",params:[{name:"flags",type:"#"},{name:"free",type:"flags.0?true"},{name:"text_color",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"}],type:"DocumentAttribute"},{id:1087454222,predicate:"stickerSetFullCovered",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"keywords",type:"Vector"},{name:"documents",type:"Vector"}],type:"StickerSetCovered"},{id:-1502273946,predicate:"inputStorePaymentPremiumSubscription",params:[{name:"flags",type:"#"},{name:"restore",type:"flags.0?true"}],type:"InputStorePaymentPurpose"},{id:1634697192,predicate:"inputStorePaymentGiftPremium",params:[{name:"user_id",type:"InputUser"},{name:"currency",type:"string"},{name:"amount",type:"long"}],type:"InputStorePaymentPurpose"},{id:-1415514682,predicate:"messageActionGiftPremium",params:[{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"months",type:"int"}],type:"MessageAction"},{id:1958953753,predicate:"premiumGiftOption",params:[{name:"flags",type:"#"},{name:"months",type:"int"},{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"bot_url",type:"string"},{name:"store_product",type:"flags.0?string"}],type:"PremiumGiftOption"},{id:-930399486,predicate:"inputStickerSetPremiumGifts",params:[],type:"InputStickerSet"},{id:-78886548,predicate:"updateReadFeaturedEmojiStickers",params:[],type:"Update"},{id:-1360618136,predicate:"inputPrivacyKeyVoiceMessages",params:[],type:"InputPrivacyKey"},{id:110621716,predicate:"privacyKeyVoiceMessages",params:[],type:"PrivacyKey"},{id:-1996951013,predicate:"paymentFormMethod",params:[{name:"url",type:"string"},{name:"title",type:"string"}],type:"PaymentFormMethod"},{id:-193992412,predicate:"inputWebFileAudioAlbumThumbLocation",params:[{name:"flags",type:"#"},{name:"small",type:"flags.2?true"},{name:"document",type:"flags.0?InputDocument"},{name:"title",type:"flags.1?string"},{name:"performer",type:"flags.1?string"}],type:"InputWebFileLocation"},{id:769727150,predicate:"emojiStatusEmpty",params:[],type:"EmojiStatus"},{id:-1835310691,predicate:"emojiStatus",params:[{name:"document_id",type:"long"}],type:"EmojiStatus"},{id:-97474361,predicate:"emojiStatusUntil",params:[{name:"document_id",type:"long"},{name:"until",type:"int"}],type:"EmojiStatus"},{id:674706841,predicate:"updateUserEmojiStatus",params:[{name:"user_id",type:"long"},{name:"emoji_status",type:"EmojiStatus"}],type:"Update"},{id:821314523,predicate:"updateRecentEmojiStatuses",params:[],type:"Update"},{id:-796072379,predicate:"account.emojiStatusesNotModified",params:[],type:"account.EmojiStatuses"},{id:-1866176559,predicate:"account.emojiStatuses",params:[{name:"hash",type:"long"},{name:"statuses",type:"Vector"}],type:"account.EmojiStatuses"},{id:2046153753,predicate:"reactionEmpty",params:[],type:"Reaction"},{id:455247544,predicate:"reactionEmoji",params:[{name:"emoticon",type:"string"}],type:"Reaction"},{id:-1992950669,predicate:"reactionCustomEmoji",params:[{name:"document_id",type:"long"}],type:"Reaction"},{id:-352570692,predicate:"chatReactionsNone",params:[],type:"ChatReactions"},{id:1385335754,predicate:"chatReactionsAll",params:[{name:"flags",type:"#"},{name:"allow_custom",type:"flags.0?true"}],type:"ChatReactions"},{id:1713193015,predicate:"chatReactionsSome",params:[{name:"reactions",type:"Vector"}],type:"ChatReactions"},{id:-1334846497,predicate:"messages.reactionsNotModified",params:[],type:"messages.Reactions"},{id:-352454890,predicate:"messages.reactions",params:[{name:"hash",type:"long"},{name:"reactions",type:"Vector"}],type:"messages.Reactions"},{id:1870160884,predicate:"updateRecentReactions",params:[],type:"Update"},{id:-2030252155,predicate:"updateMoveStickerSetToTop",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"stickerset",type:"long"}],type:"Update"},{id:1511364673,predicate:"auth.sentCodeTypeEmailCode",params:[{name:"flags",type:"#"},{name:"apple_signin_allowed",type:"flags.0?true"},{name:"google_signin_allowed",type:"flags.1?true"},{name:"email_pattern",type:"string"},{name:"length",type:"int"},{name:"next_phone_login_date",type:"flags.2?int"}],type:"auth.SentCodeType"},{id:-1521934870,predicate:"auth.sentCodeTypeSetUpEmailRequired",params:[{name:"flags",type:"#"},{name:"apple_signin_allowed",type:"flags.0?true"},{name:"google_signin_allowed",type:"flags.1?true"}],type:"auth.SentCodeType"},{id:1128644211,predicate:"emailVerifyPurposeLoginSetup",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"EmailVerifyPurpose"},{id:1383932651,predicate:"emailVerifyPurposeLoginChange",params:[],type:"EmailVerifyPurpose"},{id:-1141565819,predicate:"emailVerifyPurposePassport",params:[],type:"EmailVerifyPurpose"},{id:-1842457175,predicate:"emailVerificationCode",params:[{name:"code",type:"string"}],type:"EmailVerification"},{id:-611279166,predicate:"emailVerificationGoogle",params:[{name:"token",type:"string"}],type:"EmailVerification"},{id:-1764723459,predicate:"emailVerificationApple",params:[{name:"token",type:"string"}],type:"EmailVerification"},{id:731303195,predicate:"account.emailVerified",params:[{name:"email",type:"string"}],type:"account.EmailVerified"},{id:-507835039,predicate:"account.emailVerifiedLogin",params:[{name:"email",type:"string"},{name:"sent_code",type:"auth.SentCode"}],type:"account.EmailVerified"},{id:-1225711938,predicate:"premiumSubscriptionOption",params:[{name:"flags",type:"#"},{name:"current",type:"flags.1?true"},{name:"can_purchase_upgrade",type:"flags.2?true"},{name:"months",type:"int"},{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"bot_url",type:"string"},{name:"store_product",type:"flags.0?string"}],type:"PremiumSubscriptionOption"},{id:80008398,predicate:"inputStickerSetEmojiGenericAnimations",params:[],type:"InputStickerSet"},{id:701560302,predicate:"inputStickerSetEmojiDefaultStatuses",params:[],type:"InputStickerSet"},{id:-1206095820,predicate:"sendAsPeer",params:[{name:"flags",type:"#"},{name:"premium_required",type:"flags.0?true"},{name:"peer",type:"Peer"}],type:"SendAsPeer"},{id:-1386050360,predicate:"messageExtendedMediaPreview",params:[{name:"flags",type:"#"},{name:"w",type:"flags.0?int"},{name:"h",type:"flags.0?int"},{name:"thumb",type:"flags.1?PhotoSize"},{name:"video_duration",type:"flags.2?int"}],type:"MessageExtendedMedia"},{id:-297296796,predicate:"messageExtendedMedia",params:[{name:"media",type:"MessageMedia"}],type:"MessageExtendedMedia"},{id:1517529484,predicate:"updateMessageExtendedMedia",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"extended_media",type:"MessageExtendedMedia"}],type:"Update"},{id:-50416996,predicate:"stickerKeyword",params:[{name:"document_id",type:"long"},{name:"keyword",type:"Vector"}],type:"StickerKeyword"},{id:-1274595769,predicate:"username",params:[{name:"flags",type:"#"},{name:"editable",type:"flags.0?true"},{name:"active",type:"flags.1?true"},{name:"username",type:"string"}],type:"Username"},{id:-263212119,predicate:"channelAdminLogEventActionChangeUsernames",params:[{name:"prev_value",type:"Vector"},{name:"new_value",type:"Vector"}],type:"ChannelAdminLogEventAction"},{id:46949251,predicate:"channelAdminLogEventActionToggleForum",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1483767080,predicate:"channelAdminLogEventActionCreateTopic",params:[{name:"topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:-261103096,predicate:"channelAdminLogEventActionEditTopic",params:[{name:"prev_topic",type:"ForumTopic"},{name:"new_topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:-1374254839,predicate:"channelAdminLogEventActionDeleteTopic",params:[{name:"topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:1569535291,predicate:"channelAdminLogEventActionPinTopic",params:[{name:"flags",type:"#"},{name:"prev_topic",type:"flags.0?ForumTopic"},{name:"new_topic",type:"flags.1?ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:37687451,predicate:"forumTopicDeleted",params:[{name:"id",type:"int"}],type:"ForumTopic"},{id:1903173033,predicate:"forumTopic",params:[{name:"flags",type:"#"},{name:"my",type:"flags.1?true"},{name:"closed",type:"flags.2?true"},{name:"pinned",type:"flags.3?true"},{name:"short",type:"flags.5?true"},{name:"hidden",type:"flags.6?true"},{name:"id",type:"int"},{name:"date",type:"int"},{name:"title",type:"string"},{name:"icon_color",type:"int"},{name:"icon_emoji_id",type:"flags.0?long"},{name:"top_message",type:"int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"unread_mentions_count",type:"int"},{name:"unread_reactions_count",type:"int"},{name:"from_id",type:"Peer"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"draft",type:"flags.4?DraftMessage"}],type:"ForumTopic"},{id:913709011,predicate:"messages.forumTopics",params:[{name:"flags",type:"#"},{name:"order_by_create_date",type:"flags.0?true"},{name:"count",type:"int"},{name:"topics",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"pts",type:"int"}],type:"messages.ForumTopics"},{id:228168278,predicate:"messageActionTopicCreate",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"icon_color",type:"int"},{name:"icon_emoji_id",type:"flags.0?long"}],type:"MessageAction"},{id:-1064024032,predicate:"messageActionTopicEdit",params:[{name:"flags",type:"#"},{name:"title",type:"flags.0?string"},{name:"icon_emoji_id",type:"flags.1?long"},{name:"closed",type:"flags.2?Bool"},{name:"hidden",type:"flags.3?Bool"}],type:"MessageAction"},{id:422509539,predicate:"updateChannelPinnedTopic",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"topic_id",type:"int"}],type:"Update"},{id:1548122514,predicate:"inputNotifyForumTopic",params:[{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"int"}],type:"InputNotifyPeer"},{id:577659656,predicate:"notifyForumTopic",params:[{name:"peer",type:"Peer"},{name:"top_msg_id",type:"int"}],type:"NotifyPeer"},{id:1153562857,predicate:"inputStickerSetEmojiDefaultTopicIcons",params:[],type:"InputStickerSet"},{id:406407439,predicate:"messages.sponsoredMessagesEmpty",params:[],type:"messages.SponsoredMessages"},{id:-31881726,predicate:"updateChannelPinnedTopics",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:1135897376,predicate:"defaultHistoryTTL",params:[{name:"period",type:"int"}],type:"DefaultHistoryTTL"},{id:116234636,predicate:"auth.codeTypeFragmentSms",params:[],type:"auth.CodeType"},{id:-648651719,predicate:"auth.sentCodeTypeFragmentSms",params:[{name:"url",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1103040667,predicate:"exportedContactToken",params:[{name:"url",type:"string"},{name:"expires",type:"int"}],type:"ExportedContactToken"},{id:1693675004,predicate:"channelAdminLogEventActionToggleAntiSpam",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1474192222,predicate:"messageActionSuggestProfilePhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-404267113,predicate:"messageActionAttachMenuBotAllowed",params:[],type:"MessageAction"},{id:2008112412,predicate:"stickerSetNoCovered",params:[{name:"set",type:"StickerSet"}],type:"StickerSetCovered"},{id:542282808,predicate:"updateUser",params:[{name:"user_id",type:"long"}],type:"Update"}],methods:[{id:-878758099,method:"invokeAfterMsg",params:[{name:"msg_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:1036301552,method:"invokeAfterMsgs",params:[{name:"msg_ids",type:"Vector"},{name:"query",type:"!X"}],type:"X"},{id:-1502141361,method:"auth.sendCode",params:[{name:"phone_number",type:"string"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:-2131827673,method:"auth.signUp",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"auth.Authorization"},{id:-1923962543,method:"auth.signIn",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"flags.0?string"},{name:"email_verification",type:"flags.1?EmailVerification"}],type:"auth.Authorization"},{id:1047706137,method:"auth.logOut",params:[],type:"auth.LoggedOut"},{id:-1616179942,method:"auth.resetAuthorizations",params:[],type:"Bool"},{id:-440401971,method:"auth.exportAuthorization",params:[{name:"dc_id",type:"int"}],type:"auth.ExportedAuthorization"},{id:-1518699091,method:"auth.importAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.Authorization"},{id:-841733627,method:"auth.bindTempAuthKey",params:[{name:"perm_auth_key_id",type:"long"},{name:"nonce",type:"long"},{name:"expires_at",type:"int"},{name:"encrypted_message",type:"bytes"}],type:"Bool"},{id:-326762118,method:"account.registerDevice",params:[{name:"flags",type:"#"},{name:"no_muted",type:"flags.0?true"},{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"app_sandbox",type:"Bool"},{name:"secret",type:"bytes"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:1779249670,method:"account.unregisterDevice",params:[{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:-2067899501,method:"account.updateNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"},{name:"settings",type:"InputPeerNotifySettings"}],type:"Bool"},{id:313765169,method:"account.getNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"}],type:"PeerNotifySettings"},{id:-612493497,method:"account.resetNotifySettings",params:[],type:"Bool"},{id:2018596725,method:"account.updateProfile",params:[{name:"flags",type:"#"},{name:"first_name",type:"flags.0?string"},{name:"last_name",type:"flags.1?string"},{name:"about",type:"flags.2?string"}],type:"User"},{id:1713919532,method:"account.updateStatus",params:[{name:"offline",type:"Bool"}],type:"Bool"},{id:127302966,method:"account.getWallPapers",params:[{name:"hash",type:"long"}],type:"account.WallPapers"},{id:-977650298,method:"account.reportPeer",params:[{name:"peer",type:"InputPeer"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:227648840,method:"users.getUsers",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1240508136,method:"users.getFullUser",params:[{name:"id",type:"InputUser"}],type:"users.UserFull"},{id:2061264541,method:"contacts.getContactIDs",params:[{name:"hash",type:"long"}],type:"Vector"},{id:-995929106,method:"contacts.getStatuses",params:[],type:"Vector"},{id:1574346258,method:"contacts.getContacts",params:[{name:"hash",type:"long"}],type:"contacts.Contacts"},{id:746589157,method:"contacts.importContacts",params:[{name:"contacts",type:"Vector"}],type:"contacts.ImportedContacts"},{id:157945344,method:"contacts.deleteContacts",params:[{name:"id",type:"Vector"}],type:"Updates"},{id:269745566,method:"contacts.deleteByPhones",params:[{name:"phones",type:"Vector"}],type:"Bool"},{id:1758204945,method:"contacts.block",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-1096393392,method:"contacts.unblock",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-176409329,method:"contacts.getBlocked",params:[{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"contacts.Blocked"},{id:1673946374,method:"messages.getMessages",params:[{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1594569905,method:"messages.getDialogs",params:[{name:"flags",type:"#"},{name:"exclude_pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Dialogs"},{id:1143203525,method:"messages.getHistory",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1593989278,method:"messages.search",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"q",type:"string"},{name:"from_id",type:"flags.0?InputPeer"},{name:"top_msg_id",type:"flags.1?int"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:238054714,method:"messages.readHistory",params:[{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"}],type:"messages.AffectedMessages"},{id:-1332768214,method:"messages.deleteHistory",params:[{name:"flags",type:"#"},{name:"just_clear",type:"flags.0?true"},{name:"revoke",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"},{name:"min_date",type:"flags.2?int"},{name:"max_date",type:"flags.3?int"}],type:"messages.AffectedHistory"},{id:-443640366,method:"messages.deleteMessages",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:94983360,method:"messages.receivedMessages",params:[{name:"max_id",type:"int"}],type:"Vector"},{id:1486110434,method:"messages.setTyping",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"action",type:"SendMessageAction"}],type:"Bool"},{id:482476935,method:"messages.sendMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:1967638886,method:"messages.sendMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"media",type:"InputMedia"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-966673468,method:"messages.forwardMessages",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"with_my_score",type:"flags.8?true"},{name:"drop_author",type:"flags.11?true"},{name:"drop_media_captions",type:"flags.12?true"},{name:"noforwards",type:"flags.14?true"},{name:"from_peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"random_id",type:"Vector"},{name:"to_peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.9?int"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-820669733,method:"messages.reportSpam",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-270948702,method:"messages.getPeerSettings",params:[{name:"peer",type:"InputPeer"}],type:"messages.PeerSettings"},{id:-1991005362,method:"messages.report",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:1240027791,method:"messages.getChats",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:-1364194508,method:"messages.getFullChat",params:[{name:"chat_id",type:"long"}],type:"messages.ChatFull"},{id:1937260541,method:"messages.editChatTitle",params:[{name:"chat_id",type:"long"},{name:"title",type:"string"}],type:"Updates"},{id:903730804,method:"messages.editChatPhoto",params:[{name:"chat_id",type:"long"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:-230206493,method:"messages.addChatUser",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"fwd_limit",type:"int"}],type:"Updates"},{id:-1575461717,method:"messages.deleteChatUser",params:[{name:"flags",type:"#"},{name:"revoke_history",type:"flags.0?true"},{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:3450904,method:"messages.createChat",params:[{name:"flags",type:"#"},{name:"users",type:"Vector"},{name:"title",type:"string"},{name:"ttl_period",type:"flags.0?int"}],type:"Updates"},{id:-304838614,method:"updates.getState",params:[],type:"updates.State"},{id:630429265,method:"updates.getDifference",params:[{name:"flags",type:"#"},{name:"pts",type:"int"},{name:"pts_total_limit",type:"flags.0?int"},{name:"date",type:"int"},{name:"qts",type:"int"}],type:"updates.Difference"},{id:473782614,method:"photos.updateProfilePhoto",params:[{name:"flags",type:"#"},{name:"fallback",type:"flags.0?true"},{name:"id",type:"InputPhoto"}],type:"photos.Photo"},{id:-1980559511,method:"photos.uploadProfilePhoto",params:[{name:"flags",type:"#"},{name:"fallback",type:"flags.3?true"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:-2016444625,method:"photos.deletePhotos",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1291540959,method:"upload.saveFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1101843010,method:"upload.getFile",params:[{name:"flags",type:"#"},{name:"precise",type:"flags.0?true"},{name:"cdn_supported",type:"flags.1?true"},{name:"location",type:"InputFileLocation"},{name:"offset",type:"long"},{name:"limit",type:"int"}],type:"upload.File"},{id:-990308245,method:"help.getConfig",params:[],type:"Config"},{id:531836966,method:"help.getNearestDc",params:[],type:"NearestDc"},{id:1378703997,method:"help.getAppUpdate",params:[{name:"source",type:"string"}],type:"help.AppUpdate"},{id:1295590211,method:"help.getInviteText",params:[],type:"help.InviteText"},{id:-1848823128,method:"photos.getUserPhotos",params:[{name:"user_id",type:"InputUser"},{name:"offset",type:"int"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"photos.Photos"},{id:651135312,method:"messages.getDhConfig",params:[{name:"version",type:"int"},{name:"random_length",type:"int"}],type:"messages.DhConfig"},{id:-162681021,method:"messages.requestEncryption",params:[{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1035731989,method:"messages.acceptEncryption",params:[{name:"peer",type:"InputEncryptedChat"},{name:"g_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:-208425312,method:"messages.discardEncryption",params:[{name:"flags",type:"#"},{name:"delete_history",type:"flags.0?true"},{name:"chat_id",type:"int"}],type:"Bool"},{id:2031374829,method:"messages.setEncryptedTyping",params:[{name:"peer",type:"InputEncryptedChat"},{name:"typing",type:"Bool"}],type:"Bool"},{id:2135648522,method:"messages.readEncryptedHistory",params:[{name:"peer",type:"InputEncryptedChat"},{name:"max_date",type:"int"}],type:"Bool"},{id:1157265941,method:"messages.sendEncrypted",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1431914525,method:"messages.sendEncryptedFile",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"},{name:"file",type:"InputEncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:852769188,method:"messages.sendEncryptedService",params:[{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1436924774,method:"messages.receivedQueue",params:[{name:"max_qts",type:"int"}],type:"Vector"},{id:1259113487,method:"messages.reportEncryptedSpam",params:[{name:"peer",type:"InputEncryptedChat"}],type:"Bool"},{id:-562337987,method:"upload.saveBigFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"file_total_parts",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1043505495,method:"initConnection",params:[{name:"flags",type:"#"},{name:"api_id",type:"int"},{name:"device_model",type:"string"},{name:"system_version",type:"string"},{name:"app_version",type:"string"},{name:"system_lang_code",type:"string"},{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"proxy",type:"flags.0?InputClientProxy"},{name:"params",type:"flags.1?JSONValue"},{name:"query",type:"!X"}],type:"X"},{id:-1663104819,method:"help.getSupport",params:[],type:"help.Support"},{id:916930423,method:"messages.readMessageContents",params:[{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:655677548,method:"account.checkUsername",params:[{name:"username",type:"string"}],type:"Bool"},{id:1040964988,method:"account.updateUsername",params:[{name:"username",type:"string"}],type:"User"},{id:301470424,method:"contacts.search",params:[{name:"q",type:"string"},{name:"limit",type:"int"}],type:"contacts.Found"},{id:-623130288,method:"account.getPrivacy",params:[{name:"key",type:"InputPrivacyKey"}],type:"account.PrivacyRules"},{id:-906486552,method:"account.setPrivacy",params:[{name:"key",type:"InputPrivacyKey"},{name:"rules",type:"Vector"}],type:"account.PrivacyRules"},{id:-1564422284,method:"account.deleteAccount",params:[{name:"flags",type:"#"},{name:"reason",type:"string"},{name:"password",type:"flags.0?InputCheckPasswordSRP"}],type:"Bool"},{id:150761757,method:"account.getAccountTTL",params:[],type:"AccountDaysTTL"},{id:608323678,method:"account.setAccountTTL",params:[{name:"ttl",type:"AccountDaysTTL"}],type:"Bool"},{id:-627372787,method:"invokeWithLayer",params:[{name:"layer",type:"int"},{name:"query",type:"!X"}],type:"X"},{id:-113456221,method:"contacts.resolveUsername",params:[{name:"username",type:"string"}],type:"contacts.ResolvedPeer"},{id:-2108208411,method:"account.sendChangePhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1891839707,method:"account.changePhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"User"},{id:-710552671,method:"messages.getStickers",params:[{name:"emoticon",type:"string"},{name:"hash",type:"long"}],type:"messages.Stickers"},{id:-1197432408,method:"messages.getAllStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:954152242,method:"account.updateDeviceLocked",params:[{name:"period",type:"int"}],type:"Bool"},{id:1738800940,method:"auth.importBotAuthorization",params:[{name:"flags",type:"int"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"bot_auth_token",type:"string"}],type:"auth.Authorization"},{id:-1956073268,method:"messages.getWebPagePreview",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"MessageMedia"},{id:-484392616,method:"account.getAuthorizations",params:[],type:"account.Authorizations"},{id:-545786948,method:"account.resetAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1418342645,method:"account.getPassword",params:[],type:"account.Password"},{id:-1663767815,method:"account.getPasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"account.PasswordSettings"},{id:-1516564433,method:"account.updatePasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"new_settings",type:"account.PasswordInputSettings"}],type:"Bool"},{id:-779399914,method:"auth.checkPassword",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"auth.Authorization"},{id:-661144474,method:"auth.requestPasswordRecovery",params:[],type:"auth.PasswordRecovery"},{id:923364464,method:"auth.recoverPassword",params:[{name:"flags",type:"#"},{name:"code",type:"string"},{name:"new_settings",type:"flags.0?account.PasswordInputSettings"}],type:"auth.Authorization"},{id:-1080796745,method:"invokeWithoutUpdates",params:[{name:"query",type:"!X"}],type:"X"},{id:-1607670315,method:"messages.exportChatInvite",params:[{name:"flags",type:"#"},{name:"legacy_revoke_permanent",type:"flags.2?true"},{name:"request_needed",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"title",type:"flags.4?string"}],type:"ExportedChatInvite"},{id:1051570619,method:"messages.checkChatInvite",params:[{name:"hash",type:"string"}],type:"ChatInvite"},{id:1817183516,method:"messages.importChatInvite",params:[{name:"hash",type:"string"}],type:"Updates"},{id:-928977804,method:"messages.getStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"hash",type:"int"}],type:"messages.StickerSet"},{id:-946871200,method:"messages.installStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"archived",type:"Bool"}],type:"messages.StickerSetInstallResult"},{id:-110209570,method:"messages.uninstallStickerSet",params:[{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-421563528,method:"messages.startBot",params:[{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"long"},{name:"start_param",type:"string"}],type:"Updates"},{id:-1877938321,method:"help.getAppChangelog",params:[{name:"prev_app_version",type:"string"}],type:"Updates"},{id:1468322785,method:"messages.getMessagesViews",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"increment",type:"Bool"}],type:"messages.MessageViews"},{id:-871347913,method:"channels.readHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-2067661490,method:"channels.deleteMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:-196443371,method:"channels.reportSpam",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1383294429,method:"channels.getMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:2010044880,method:"channels.getParticipants",params:[{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelParticipantsFilter"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"channels.ChannelParticipants"},{id:-1599378234,method:"channels.getParticipant",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"channels.ChannelParticipant"},{id:176122811,method:"channels.getChannels",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:141781513,method:"channels.getFullChannel",params:[{name:"channel",type:"InputChannel"}],type:"messages.ChatFull"},{id:-1862244601,method:"channels.createChannel",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.0?true"},{name:"megagroup",type:"flags.1?true"},{name:"for_import",type:"flags.3?true"},{name:"title",type:"string"},{name:"about",type:"string"},{name:"geo_point",type:"flags.2?InputGeoPoint"},{name:"address",type:"flags.2?string"},{name:"ttl_period",type:"flags.4?int"}],type:"Updates"},{id:-751007486,method:"channels.editAdmin",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"string"}],type:"Updates"},{id:1450044624,method:"channels.editTitle",params:[{name:"channel",type:"InputChannel"},{name:"title",type:"string"}],type:"Updates"},{id:-248621111,method:"channels.editPhoto",params:[{name:"channel",type:"InputChannel"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:283557164,method:"channels.checkUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:890549214,method:"channels.updateUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:615851205,method:"channels.joinChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-130635115,method:"channels.leaveChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:429865580,method:"channels.inviteToChannel",params:[{name:"channel",type:"InputChannel"},{name:"users",type:"Vector"}],type:"Updates"},{id:-1072619549,method:"channels.deleteChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:51854712,method:"updates.getChannelDifference",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelMessagesFilter"},{name:"pts",type:"int"},{name:"limit",type:"int"}],type:"updates.ChannelDifference"},{id:-1470377534,method:"messages.editChatAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"is_admin",type:"Bool"}],type:"Bool"},{id:-1568189671,method:"messages.migrateChat",params:[{name:"chat_id",type:"long"}],type:"Updates"},{id:1271290010,method:"messages.searchGlobal",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:2016638777,method:"messages.reorderStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:-1309538785,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"long"},{name:"mime_type",type:"string"}],type:"Document"},{id:1559270965,method:"messages.getSavedGifs",params:[{name:"hash",type:"long"}],type:"messages.SavedGifs"},{id:846868683,method:"messages.saveGif",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:1364105629,method:"messages.getInlineBotResults",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"geo_point",type:"flags.0?InputGeoPoint"},{name:"query",type:"string"},{name:"offset",type:"string"}],type:"messages.BotResults"},{id:-346119674,method:"messages.setInlineBotResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"private",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"next_offset",type:"flags.2?string"},{name:"switch_pm",type:"flags.3?InlineBotSwitchPM"}],type:"Bool"},{id:-738468661,method:"messages.sendInlineBotResult",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"hide_via",type:"flags.11?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"random_id",type:"long"},{name:"query_id",type:"long"},{name:"id",type:"string"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-432034325,method:"channels.exportMessageLink",params:[{name:"flags",type:"#"},{name:"grouped",type:"flags.0?true"},{name:"thread",type:"flags.1?true"},{name:"channel",type:"InputChannel"},{name:"id",type:"int"}],type:"ExportedMessageLink"},{id:527021574,method:"channels.toggleSignatures",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:1056025023,method:"auth.resendCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"auth.SentCode"},{id:520357240,method:"auth.cancelCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"Bool"},{id:-39416522,method:"messages.getMessageEditData",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"messages.MessageEditData"},{id:1224152952,method:"messages.editMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.15?int"}],type:"Updates"},{id:-2091549254,method:"messages.editInlineBotMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:-1824339449,method:"messages.getBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"game",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"data",type:"flags.0?bytes"},{name:"password",type:"flags.2?InputCheckPasswordSRP"}],type:"messages.BotCallbackAnswer"},{id:-712043766,method:"messages.setBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"Bool"},{id:-1758168906,method:"contacts.getTopPeers",params:[{name:"flags",type:"#"},{name:"correspondents",type:"flags.0?true"},{name:"bots_pm",type:"flags.1?true"},{name:"bots_inline",type:"flags.2?true"},{name:"phone_calls",type:"flags.3?true"},{name:"forward_users",type:"flags.4?true"},{name:"forward_chats",type:"flags.5?true"},{name:"groups",type:"flags.10?true"},{name:"channels",type:"flags.15?true"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"contacts.TopPeers"},{id:451113900,method:"contacts.resetTopPeerRating",params:[{name:"category",type:"TopPeerCategory"},{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-462373635,method:"messages.getPeerDialogs",params:[{name:"peers",type:"Vector"}],type:"messages.PeerDialogs"},{id:-1271718337,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.2?int"},{name:"peer",type:"InputPeer"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:1782549861,method:"messages.getAllDrafts",params:[],type:"Updates"},{id:1685588756,method:"messages.getFeaturedStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:1527873830,method:"messages.readFeaturedStickers",params:[{name:"id",type:"Vector"}],type:"Bool"},{id:-1649852357,method:"messages.getRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"hash",type:"long"}],type:"messages.RecentStickers"},{id:958863608,method:"messages.saveRecentSticker",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-1986437075,method:"messages.clearRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"}],type:"Bool"},{id:1475442322,method:"messages.getArchivedStickers",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"offset_id",type:"long"},{name:"limit",type:"int"}],type:"messages.ArchivedStickers"},{id:457157256,method:"account.sendConfirmPhoneCode",params:[{name:"hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1596029123,method:"account.confirmPhone",params:[{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:-122669393,method:"channels.getAdminedPublicChannels",params:[{name:"flags",type:"#"},{name:"by_location",type:"flags.0?true"},{name:"check_limit",type:"flags.1?true"}],type:"messages.Chats"},{id:1678738104,method:"messages.getMaskStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:-866424884,method:"messages.getAttachedStickers",params:[{name:"media",type:"InputStickeredMedia"}],type:"Vector"},{id:-1907842680,method:"auth.dropTempAuthKeys",params:[{name:"except_auth_keys",type:"Vector"}],type:"Bool"},{id:-1896289088,method:"messages.setGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Updates"},{id:363700068,method:"messages.setInlineGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Bool"},{id:-400399203,method:"messages.getGameHighScores",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:258170395,method:"messages.getInlineGameHighScores",params:[{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:-468934396,method:"messages.getCommonChats",params:[{name:"user_id",type:"InputUser"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"messages.Chats"},{id:-2023787330,method:"messages.getAllChats",params:[{name:"except_ids",type:"Vector"}],type:"messages.Chats"},{id:-333262899,method:"help.setBotUpdatesStatus",params:[{name:"pending_updates_count",type:"int"},{name:"message",type:"string"}],type:"Bool"},{id:852135825,method:"messages.getWebPage",params:[{name:"url",type:"string"},{name:"hash",type:"int"}],type:"WebPage"},{id:-1489903017,method:"messages.toggleDialogPin",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:991616823,method:"messages.reorderPinnedDialogs",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"folder_id",type:"int"},{name:"order",type:"Vector"}],type:"Bool"},{id:-692498958,method:"messages.getPinnedDialogs",params:[{name:"folder_id",type:"int"}],type:"messages.PeerDialogs"},{id:-1440257555,method:"bots.sendCustomRequest",params:[{name:"custom_method",type:"string"},{name:"params",type:"DataJSON"}],type:"DataJSON"},{id:-434028723,method:"bots.answerWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"}],type:"Bool"},{id:619086221,method:"upload.getWebFile",params:[{name:"location",type:"InputWebFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.WebFile"},{id:924093883,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"invoice",type:"InputInvoice"},{name:"theme_params",type:"flags.0?DataJSON"}],type:"payments.PaymentForm"},{id:611897804,method:"payments.getPaymentReceipt",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"payments.PaymentReceipt"},{id:-1228345045,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"invoice",type:"InputInvoice"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:755192367,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"invoice",type:"InputInvoice"},{name:"requested_info_id",type:"flags.0?string"},{name:"shipping_option_id",type:"flags.1?string"},{name:"credentials",type:"InputPaymentCredentials"},{name:"tip_amount",type:"flags.2?long"}],type:"payments.PaymentResult"},{id:1151208273,method:"account.getTmpPassword",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"period",type:"int"}],type:"account.TmpPassword"},{id:578650699,method:"payments.getSavedInfo",params:[],type:"payments.SavedInfo"},{id:-667062079,method:"payments.clearSavedInfo",params:[{name:"flags",type:"#"},{name:"credentials",type:"flags.0?true"},{name:"info",type:"flags.1?true"}],type:"Bool"},{id:-436833542,method:"messages.setBotShippingResults",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"Bool"},{id:163765653,method:"messages.setBotPrecheckoutResults",params:[{name:"flags",type:"#"},{name:"success",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"}],type:"Bool"},{id:-1876841625,method:"stickers.createStickerSet",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"animated",type:"flags.1?true"},{name:"videos",type:"flags.4?true"},{name:"user_id",type:"InputUser"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumb",type:"flags.2?InputDocument"},{name:"stickers",type:"Vector"},{name:"software",type:"flags.3?string"}],type:"messages.StickerSet"},{id:-143257775,method:"stickers.removeStickerFromSet",params:[{name:"sticker",type:"InputDocument"}],type:"messages.StickerSet"},{id:-4795190,method:"stickers.changeStickerPosition",params:[{name:"sticker",type:"InputDocument"},{name:"position",type:"int"}],type:"messages.StickerSet"},{id:-2041315650,method:"stickers.addStickerToSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"sticker",type:"InputStickerSetItem"}],type:"messages.StickerSet"},{id:1369162417,method:"messages.uploadMedia",params:[{name:"peer",type:"InputPeer"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:1430593449,method:"phone.getCallConfig",params:[],type:"DataJSON"},{id:1124046573,method:"phone.requestCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:1003664544,method:"phone.acceptCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:788404002,method:"phone.confirmCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_a",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:399855457,method:"phone.receivedCall",params:[{name:"peer",type:"InputPhoneCall"}],type:"Bool"},{id:-1295269440,method:"phone.discardCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"duration",type:"int"},{name:"reason",type:"PhoneCallDiscardReason"},{name:"connection_id",type:"long"}],type:"Updates"},{id:1508562471,method:"phone.setCallRating",params:[{name:"flags",type:"#"},{name:"user_initiative",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"rating",type:"int"},{name:"comment",type:"string"}],type:"Updates"},{id:662363518,method:"phone.saveCallDebug",params:[{name:"peer",type:"InputPhoneCall"},{name:"debug",type:"DataJSON"}],type:"Bool"},{id:962554330,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"long"},{name:"limit",type:"int"}],type:"upload.CdnFile"},{id:-1691921240,method:"upload.reuploadCdnFile",params:[{name:"file_token",type:"bytes"},{name:"request_token",type:"bytes"}],type:"Vector"},{id:1375900482,method:"help.getCdnConfig",params:[],type:"CdnConfig"},{id:-219008246,method:"langpack.getLangPack",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackDifference"},{id:-269862909,method:"langpack.getStrings",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"keys",type:"Vector"}],type:"Vector"},{id:-845657435,method:"langpack.getDifference",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"LangPackDifference"},{id:1120311183,method:"langpack.getLanguages",params:[{name:"lang_pack",type:"string"}],type:"Vector"},{id:-1763259007,method:"channels.editBanned",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:870184064,method:"channels.getAdminLog",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"string"},{name:"events_filter",type:"flags.0?ChannelAdminLogEventsFilter"},{name:"admins",type:"flags.1?Vector"},{name:"max_id",type:"long"},{name:"min_id",type:"long"},{name:"limit",type:"int"}],type:"channels.AdminLogResults"},{id:-1847836879,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"long"}],type:"Vector"},{id:-914493408,method:"messages.sendScreenshotNotification",params:[{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"int"},{name:"random_id",type:"long"}],type:"Updates"},{id:-359881479,method:"channels.setStickers",params:[{name:"channel",type:"InputChannel"},{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:82946729,method:"messages.getFavedStickers",params:[{name:"hash",type:"long"}],type:"messages.FavedStickers"},{id:-1174420133,method:"messages.faveSticker",params:[{name:"id",type:"InputDocument"},{name:"unfave",type:"Bool"}],type:"Bool"},{id:-357180360,method:"channels.readMessageContents",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"Bool"},{id:-2020263951,method:"contacts.resetSaved",params:[],type:"Bool"},{id:-251140208,method:"messages.getUnreadMentions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:-1683319225,method:"channels.deleteHistory",params:[{name:"flags",type:"#"},{name:"for_everyone",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Updates"},{id:1036054804,method:"help.getRecentMeUrls",params:[{name:"referer",type:"string"}],type:"help.RecentMeUrls"},{id:-356796084,method:"channels.togglePreHistoryHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:921026381,method:"messages.readMentions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],type:"messages.AffectedHistory"},{id:1881817312,method:"messages.getRecentLocations",params:[{name:"peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1225713124,method:"messages.sendMultiMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"multi_media",type:"Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:1347929239,method:"messages.uploadEncryptedFile",params:[{name:"peer",type:"InputEncryptedChat"},{name:"file",type:"InputEncryptedFile"}],type:"EncryptedFile"},{id:405695855,method:"account.getWebAuthorizations",params:[],type:"account.WebAuthorizations"},{id:755087855,method:"account.resetWebAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1747789204,method:"account.resetWebAuthorizations",params:[],type:"Bool"},{id:896555914,method:"messages.searchStickerSets",params:[{name:"flags",type:"#"},{name:"exclude_featured",type:"flags.0?true"},{name:"q",type:"string"},{name:"hash",type:"long"}],type:"messages.FoundStickerSets"},{id:-1856595926,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"long"}],type:"Vector"},{id:749019089,method:"help.getTermsOfServiceUpdate",params:[],type:"help.TermsOfServiceUpdate"},{id:-294455398,method:"help.acceptTermsOfService",params:[{name:"id",type:"DataJSON"}],type:"Bool"},{id:-1299661699,method:"account.getAllSecureValues",params:[],type:"Vector"},{id:1936088002,method:"account.getSecureValue",params:[{name:"types",type:"Vector"}],type:"Vector"},{id:-1986010339,method:"account.saveSecureValue",params:[{name:"value",type:"InputSecureValue"},{name:"secure_secret_id",type:"long"}],type:"SecureValue"},{id:-1199522741,method:"account.deleteSecureValue",params:[{name:"types",type:"Vector"}],type:"Bool"},{id:-1865902923,method:"users.setSecureValueErrors",params:[{name:"id",type:"InputUser"},{name:"errors",type:"Vector"}],type:"Bool"},{id:-1456907910,method:"account.getAuthorizationForm",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"}],type:"account.AuthorizationForm"},{id:-202552205,method:"account.acceptAuthorization",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"},{name:"value_hashes",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"Bool"},{id:-1516022023,method:"account.sendVerifyPhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1305716726,method:"account.verifyPhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:-1730136133,method:"account.sendVerifyEmailCode",params:[{name:"purpose",type:"EmailVerifyPurpose"},{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:53322959,method:"account.verifyEmail",params:[{name:"purpose",type:"EmailVerifyPurpose"},{name:"verification",type:"EmailVerification"}],type:"account.EmailVerified"},{id:1072547679,method:"help.getDeepLinkInfo",params:[{name:"path",type:"string"}],type:"help.DeepLinkInfo"},{id:-2098076769,method:"contacts.getSaved",params:[],type:"Vector"},{id:-2092831552,method:"channels.getLeftChannels",params:[{name:"offset",type:"int"}],type:"messages.Chats"},{id:-1896617296,method:"account.initTakeoutSession",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"message_users",type:"flags.1?true"},{name:"message_chats",type:"flags.2?true"},{name:"message_megagroups",type:"flags.3?true"},{name:"message_channels",type:"flags.4?true"},{name:"files",type:"flags.5?true"},{name:"file_max_size",type:"flags.5?long"}],type:"account.Takeout"},{id:489050862,method:"account.finishTakeoutSession",params:[{name:"flags",type:"#"},{name:"success",type:"flags.0?true"}],type:"Bool"},{id:486505992,method:"messages.getSplitRanges",params:[],type:"Vector"},{id:911373810,method:"invokeWithMessagesRange",params:[{name:"range",type:"MessageRange"},{name:"query",type:"!X"}],type:"X"},{id:-1398145746,method:"invokeWithTakeout",params:[{name:"takeout_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:-1031349873,method:"messages.markDialogUnread",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:585256482,method:"messages.getDialogUnreadMarks",params:[],type:"Vector"},{id:-2062238246,method:"contacts.toggleTopPeers",params:[{name:"enabled",type:"Bool"}],type:"Bool"},{id:2119757468,method:"messages.clearAllDrafts",params:[],type:"Bool"},{id:-1735311088,method:"help.getAppConfig",params:[],type:"JSONValue"},{id:1862465352,method:"help.saveAppLog",params:[{name:"events",type:"Vector"}],type:"Bool"},{id:-966677240,method:"help.getPassportConfig",params:[{name:"hash",type:"int"}],type:"help.PassportConfig"},{id:1784243458,method:"langpack.getLanguage",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackLanguage"},{id:-760547348,method:"messages.updatePinnedMessage",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"unpin",type:"flags.1?true"},{name:"pm_oneside",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"Updates"},{id:-1881204448,method:"account.confirmPasswordEmail",params:[{name:"code",type:"string"}],type:"Bool"},{id:2055154197,method:"account.resendPasswordEmail",params:[],type:"Bool"},{id:-1043606090,method:"account.cancelPasswordEmail",params:[],type:"Bool"},{id:-748624084,method:"help.getSupportName",params:[],type:"help.SupportName"},{id:59377875,method:"help.getUserInfo",params:[{name:"user_id",type:"InputUser"}],type:"help.UserInfo"},{id:1723407216,method:"help.editUserInfo",params:[{name:"user_id",type:"InputUser"},{name:"message",type:"string"},{name:"entities",type:"Vector"}],type:"help.UserInfo"},{id:-1626880216,method:"account.getContactSignUpNotification",params:[],type:"Bool"},{id:-806076575,method:"account.setContactSignUpNotification",params:[{name:"silent",type:"Bool"}],type:"Bool"},{id:1398240377,method:"account.getNotifyExceptions",params:[{name:"flags",type:"#"},{name:"compare_sound",type:"flags.1?true"},{name:"peer",type:"flags.0?InputNotifyPeer"}],type:"Updates"},{id:283795844,method:"messages.sendVote",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"options",type:"Vector"}],type:"Updates"},{id:1941660731,method:"messages.getPollResults",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1848369232,method:"messages.getOnlines",params:[{name:"peer",type:"InputPeer"}],type:"ChatOnlines"},{id:-554301545,method:"messages.editChatAbout",params:[{name:"peer",type:"InputPeer"},{name:"about",type:"string"}],type:"Bool"},{id:-1517917375,method:"messages.editChatDefaultBannedRights",params:[{name:"peer",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:-57811990,method:"account.getWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"}],type:"WallPaper"},{id:-578472351,method:"account.uploadWallPaper",params:[{name:"file",type:"InputFile"},{name:"mime_type",type:"string"},{name:"settings",type:"WallPaperSettings"}],type:"WallPaper"},{id:1817860919,method:"account.saveWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"unsave",type:"Bool"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-18000023,method:"account.installWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-1153722364,method:"account.resetWallPapers",params:[],type:"Bool"},{id:1457130303,method:"account.getAutoDownloadSettings",params:[],type:"account.AutoDownloadSettings"},{id:1995661875,method:"account.saveAutoDownloadSettings",params:[{name:"flags",type:"#"},{name:"low",type:"flags.0?true"},{name:"high",type:"flags.1?true"},{name:"settings",type:"AutoDownloadSettings"}],type:"Bool"},{id:899735650,method:"messages.getEmojiKeywords",params:[{name:"lang_code",type:"string"}],type:"EmojiKeywordsDifference"},{id:352892591,method:"messages.getEmojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"EmojiKeywordsDifference"},{id:1318675378,method:"messages.getEmojiKeywordsLanguages",params:[{name:"lang_codes",type:"Vector"}],type:"Vector"},{id:-709817306,method:"messages.getEmojiURL",params:[{name:"lang_code",type:"string"}],type:"EmojiURL"},{id:1749536939,method:"folders.editPeerFolders",params:[{name:"folder_peers",type:"Vector"}],type:"Updates"},{id:472471681,method:"folders.deleteFolder",params:[{name:"folder_id",type:"int"}],type:"Updates"},{id:11435201,method:"messages.getSearchCounters",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"filters",type:"Vector"}],type:"Vector"},{id:-170208392,method:"channels.getGroupsForDiscussion",params:[],type:"messages.Chats"},{id:1079520178,method:"channels.setDiscussionGroup",params:[{name:"broadcast",type:"InputChannel"},{name:"group",type:"InputChannel"}],type:"Bool"},{id:428848198,method:"messages.requestUrlAuth",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:-1322487515,method:"messages.acceptUrlAuth",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:1336717624,method:"messages.hidePeerSettingsBar",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-386636848,method:"contacts.addContact",params:[{name:"flags",type:"#"},{name:"add_phone_privacy_exception",type:"flags.0?true"},{name:"id",type:"InputUser"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"phone",type:"string"}],type:"Updates"},{id:-130964977,method:"contacts.acceptContact",params:[{name:"id",type:"InputUser"}],type:"Updates"},{id:-1892102881,method:"channels.editCreator",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"password",type:"InputCheckPasswordSRP"}],type:"Updates"},{id:-750207932,method:"contacts.getLocated",params:[{name:"flags",type:"#"},{name:"background",type:"flags.1?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"self_expires",type:"flags.0?int"}],type:"Updates"},{id:1491484525,method:"channels.editLocation",params:[{name:"channel",type:"InputChannel"},{name:"geo_point",type:"InputGeoPoint"},{name:"address",type:"string"}],type:"Bool"},{id:-304832784,method:"channels.toggleSlowMode",params:[{name:"channel",type:"InputChannel"},{name:"seconds",type:"int"}],type:"Updates"},{id:-183077365,method:"messages.getScheduledHistory",params:[{name:"peer",type:"InputPeer"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1111817116,method:"messages.getScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1120369398,method:"messages.sendScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1504586518,method:"messages.deleteScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:473805619,method:"account.uploadTheme",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.0?InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:1697530880,method:"account.createTheme",params:[{name:"flags",type:"#"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:737414348,method:"account.updateTheme",params:[{name:"flags",type:"#"},{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"slug",type:"flags.0?string"},{name:"title",type:"flags.1?string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:-229175188,method:"account.saveTheme",params:[{name:"theme",type:"InputTheme"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-953697477,method:"account.installTheme",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"theme",type:"flags.1?InputTheme"},{name:"format",type:"flags.2?string"},{name:"base_theme",type:"flags.3?BaseTheme"}],type:"Bool"},{id:978872812,method:"account.getTheme",params:[{name:"format",type:"string"},{name:"theme",type:"InputTheme"}],type:"Theme"},{id:1913054296,method:"account.getThemes",params:[{name:"format",type:"string"},{name:"hash",type:"long"}],type:"account.Themes"},{id:-1210022402,method:"auth.exportLoginToken",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"except_ids",type:"Vector"}],type:"auth.LoginToken"},{id:-1783866140,method:"auth.importLoginToken",params:[{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:-392909491,method:"auth.acceptLoginToken",params:[{name:"token",type:"bytes"}],type:"Authorization"},{id:-1250643605,method:"account.setContentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"}],type:"Bool"},{id:-1952756306,method:"account.getContentSettings",params:[],type:"account.ContentSettings"},{id:300429806,method:"channels.getInactiveChannels",params:[],type:"messages.InactiveChats"},{id:1705865692,method:"account.getMultiWallPapers",params:[{name:"wallpapers",type:"Vector"}],type:"Vector"},{id:-1200736242,method:"messages.getPollVotes",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"option",type:"flags.0?bytes"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.VotesList"},{id:-1257951254,method:"messages.toggleStickerSets",params:[{name:"flags",type:"#"},{name:"uninstall",type:"flags.0?true"},{name:"archive",type:"flags.1?true"},{name:"unarchive",type:"flags.2?true"},{name:"stickersets",type:"Vector"}],type:"Bool"},{id:779736953,method:"payments.getBankCardData",params:[{name:"number",type:"string"}],type:"payments.BankCardData"},{id:-241247891,method:"messages.getDialogFilters",params:[],type:"Vector"},{id:-1566780372,method:"messages.getSuggestedDialogFilters",params:[],type:"Vector"},{id:450142282,method:"messages.updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Bool"},{id:-983318044,method:"messages.updateDialogFiltersOrder",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:-1421720550,method:"stats.getBroadcastStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.BroadcastStats"},{id:1646092192,method:"stats.loadAsyncGraph",params:[{name:"flags",type:"#"},{name:"token",type:"string"},{name:"x",type:"flags.0?long"}],type:"StatsGraph"},{id:-1707717072,method:"stickers.setStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb",type:"InputDocument"}],type:"messages.StickerSet"},{id:85399130,method:"bots.setBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"},{name:"commands",type:"Vector"}],type:"Bool"},{id:2127598753,method:"messages.getOldFeaturedStickers",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:-1063816159,method:"help.getPromoData",params:[],type:"help.PromoData"},{id:505748629,method:"help.hidePromoData",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-8744061,method:"phone.sendSignalingData",params:[{name:"peer",type:"InputPhoneCall"},{name:"data",type:"bytes"}],type:"Bool"},{id:-589330937,method:"stats.getMegagroupStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.MegagroupStats"},{id:-349483786,method:"account.getGlobalPrivacySettings",params:[],type:"GlobalPrivacySettings"},{id:517647042,method:"account.setGlobalPrivacySettings",params:[{name:"settings",type:"GlobalPrivacySettings"}],type:"GlobalPrivacySettings"},{id:-183649631,method:"help.dismissSuggestion",params:[{name:"peer",type:"InputPeer"},{name:"suggestion",type:"string"}],type:"Bool"},{id:1935116200,method:"help.getCountriesList",params:[{name:"lang_code",type:"string"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:584962828,method:"messages.getReplies",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:1147761405,method:"messages.getDiscussionMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.DiscussionMessage"},{id:-147740172,method:"messages.readDiscussion",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Bool"},{id:698914348,method:"contacts.blockFromReplies",params:[{name:"flags",type:"#"},{name:"delete_message",type:"flags.0?true"},{name:"delete_history",type:"flags.1?true"},{name:"report_spam",type:"flags.2?true"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1445996571,method:"stats.getMessagePublicForwards",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:-1226791947,method:"stats.getMessageStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"stats.MessageStats"},{id:-299714136,method:"messages.unpinAllMessages",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],type:"messages.AffectedHistory"},{id:1221445336,method:"phone.createGroupCall",params:[{name:"flags",type:"#"},{name:"rtmp_stream",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"schedule_date",type:"flags.1?int"}],type:"Updates"},{id:-1322057861,method:"phone.joinGroupCall",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"video_stopped",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"join_as",type:"InputPeer"},{name:"invite_hash",type:"flags.1?string"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:1342404601,method:"phone.leaveGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"source",type:"int"}],type:"Updates"},{id:2067345760,method:"phone.inviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"Updates"},{id:2054648117,method:"phone.discardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1958458429,method:"phone.toggleGroupCallSettings",params:[{name:"flags",type:"#"},{name:"reset_invite_hash",type:"flags.1?true"},{name:"call",type:"InputGroupCall"},{name:"join_muted",type:"flags.0?Bool"}],type:"Updates"},{id:68699611,method:"phone.getGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"limit",type:"int"}],type:"phone.GroupCall"},{id:-984033109,method:"phone.getGroupParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"ids",type:"Vector"},{name:"sources",type:"Vector"},{name:"offset",type:"string"},{name:"limit",type:"int"}],type:"phone.GroupParticipants"},{id:-1248003721,method:"phone.checkGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"sources",type:"Vector"}],type:"Vector"},{id:1540419152,method:"messages.deleteChat",params:[{name:"chat_id",type:"long"}],type:"Bool"},{id:-104078327,method:"messages.deletePhoneCallHistory",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"}],type:"messages.AffectedFoundMessages"},{id:1140726259,method:"messages.checkHistoryImport",params:[{name:"import_head",type:"string"}],type:"messages.HistoryImportParsed"},{id:873008187,method:"messages.initHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"file",type:"InputFile"},{name:"media_count",type:"int"}],type:"messages.HistoryImport"},{id:713433234,method:"messages.uploadImportedMedia",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"},{name:"file_name",type:"string"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:-1271008444,method:"messages.startHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"}],type:"Bool"},{id:-1565154314,method:"messages.getExportedChatInvites",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"},{name:"offset_date",type:"flags.2?int"},{name:"offset_link",type:"flags.2?string"},{name:"limit",type:"int"}],type:"messages.ExportedChatInvites"},{id:1937010524,method:"messages.getExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"messages.ExportedChatInvite"},{id:-1110823051,method:"messages.editExportedChatInvite",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"string"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"request_needed",type:"flags.3?Bool"},{name:"title",type:"flags.4?string"}],type:"messages.ExportedChatInvite"},{id:1452833749,method:"messages.deleteRevokedExportedChatInvites",params:[{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"}],type:"Bool"},{id:-731601877,method:"messages.deleteExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"Bool"},{id:958457583,method:"messages.getAdminsWithInvites",params:[{name:"peer",type:"InputPeer"}],type:"messages.ChatAdminsWithInvites"},{id:-553329330,method:"messages.getChatInviteImporters",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"},{name:"q",type:"flags.2?string"},{name:"offset_date",type:"int"},{name:"offset_user",type:"InputUser"},{name:"limit",type:"int"}],type:"messages.ChatInviteImporters"},{id:-1207017500,method:"messages.setHistoryTTL",params:[{name:"peer",type:"InputPeer"},{name:"period",type:"int"}],type:"Updates"},{id:-91437323,method:"account.reportProfilePhoto",params:[{name:"peer",type:"InputPeer"},{name:"photo_id",type:"InputPhoto"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:187239529,method:"channels.convertToGigagroup",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:1573261059,method:"messages.checkHistoryImportPeer",params:[{name:"peer",type:"InputPeer"}],type:"messages.CheckedHistoryImportPeer"},{id:-248985848,method:"phone.toggleGroupCallRecord",params:[{name:"flags",type:"#"},{name:"start",type:"flags.0?true"},{name:"video",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"title",type:"flags.1?string"},{name:"video_portrait",type:"flags.2?Bool"}],type:"Updates"},{id:-1524155713,method:"phone.editGroupCallParticipant",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"participant",type:"InputPeer"},{name:"muted",type:"flags.0?Bool"},{name:"volume",type:"flags.1?int"},{name:"raise_hand",type:"flags.2?Bool"},{name:"video_stopped",type:"flags.3?Bool"},{name:"video_paused",type:"flags.4?Bool"},{name:"presentation_paused",type:"flags.5?Bool"}],type:"Updates"},{id:480685066,method:"phone.editGroupCallTitle",params:[{name:"call",type:"InputGroupCall"},{name:"title",type:"string"}],type:"Updates"},{id:-277077702,method:"phone.getGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"}],type:"phone.JoinAsPeers"},{id:-425040769,method:"phone.exportGroupCallInvite",params:[{name:"flags",type:"#"},{name:"can_self_unmute",type:"flags.0?true"},{name:"call",type:"InputGroupCall"}],type:"phone.ExportedGroupCallInvite"},{id:563885286,method:"phone.toggleGroupCallStartSubscription",params:[{name:"call",type:"InputGroupCall"},{name:"subscribed",type:"Bool"}],type:"Updates"},{id:1451287362,method:"phone.startScheduledGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1465786252,method:"phone.saveDefaultGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"},{name:"join_as",type:"InputPeer"}],type:"Bool"},{id:-873829436,method:"phone.joinGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:475058500,method:"phone.leaveGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:676017721,method:"stickers.checkShortName",params:[{name:"short_name",type:"string"}],type:"Bool"},{id:1303364867,method:"stickers.suggestShortName",params:[{name:"title",type:"string"}],type:"stickers.SuggestedShortName"},{id:1032708345,method:"bots.resetBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Bool"},{id:-481554986,method:"bots.getBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Vector"},{id:-1828139493,method:"account.resetPassword",params:[],type:"account.ResetPasswordResult"},{id:1284770294,method:"account.declinePasswordReset",params:[],type:"Bool"},{id:221691769,method:"auth.checkRecoveryPassword",params:[{name:"code",type:"string"}],type:"Bool"},{id:-700916087,method:"account.getChatThemes",params:[{name:"hash",type:"long"}],type:"account.Themes"},{id:-432283329,method:"messages.setChatTheme",params:[{name:"peer",type:"InputPeer"},{name:"emoticon",type:"string"}],type:"Updates"},{id:-1095836780,method:"channels.viewSponsoredMessage",params:[{name:"channel",type:"InputChannel"},{name:"random_id",type:"bytes"}],type:"Bool"},{id:-333377601,method:"channels.getSponsoredMessages",params:[{name:"channel",type:"InputChannel"}],type:"messages.SponsoredMessages"},{id:745510839,method:"messages.getMessageReadParticipants",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Vector"},{id:1240514025,method:"messages.getSearchResultsCalendar",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"}],type:"messages.SearchResultsCalendar"},{id:1855292323,method:"messages.getSearchResultsPositions",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.SearchResultsPositions"},{id:2145904661,method:"messages.hideChatJoinRequest",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:-528091926,method:"messages.hideAllChatJoinRequests",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"}],type:"Updates"},{id:-1323389022,method:"messages.toggleNoForwards",params:[{name:"peer",type:"InputPeer"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-855777386,method:"messages.saveDefaultSendAs",params:[{name:"peer",type:"InputPeer"},{name:"send_as",type:"InputPeer"}],type:"Bool"},{id:231174382,method:"channels.getSendAs",params:[{name:"peer",type:"InputPeer"}],type:"channels.SendAsPeers"},{id:-1081501024,method:"account.setAuthorizationTTL",params:[{name:"authorization_ttl_days",type:"int"}],type:"Bool"},{id:1089766498,method:"account.changeAuthorizationSettings",params:[{name:"flags",type:"#"},{name:"hash",type:"long"},{name:"encrypted_requests_disabled",type:"flags.0?Bool"},{name:"call_requests_disabled",type:"flags.1?Bool"}],type:"Bool"},{id:913655003,method:"channels.deleteParticipantHistory",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:-754091820,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.1?true"},{name:"add_to_recent",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?Vector"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1176190792,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?Reaction"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:-21928079,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"ChatReactions"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:1330094102,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"Reaction"}],type:"Bool"},{id:617508334,method:"messages.translateText",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.0?InputPeer"},{name:"msg_id",type:"flags.0?int"},{name:"text",type:"flags.1?string"},{name:"from_lang",type:"flags.2?string"},{name:"to_lang",type:"string"}],type:"messages.TranslatedText"},{id:841173339,method:"messages.getUnreadReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:1420459918,method:"messages.readReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],type:"messages.AffectedHistory"},{id:-1963375804,method:"contacts.resolvePhone",params:[{name:"phone",type:"string"}],type:"contacts.ResolvedPeer"},{id:447879488,method:"phone.getGroupCallStreamChannels",params:[{name:"call",type:"InputGroupCall"}],type:"phone.GroupCallStreamChannels"},{id:-558650433,method:"phone.getGroupCallStreamRtmpUrl",params:[{name:"peer",type:"InputPeer"},{name:"revoke",type:"Bool"}],type:"phone.GroupCallStreamRtmpUrl"},{id:276705696,method:"messages.searchSentMedia",params:[{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:385663691,method:"messages.getAttachMenuBots",params:[{name:"hash",type:"long"}],type:"AttachMenuBots"},{id:1998676370,method:"messages.getAttachMenuBot",params:[{name:"bot",type:"InputUser"}],type:"AttachMenuBotsBot"},{id:1777704297,method:"messages.toggleBotInAttachMenu",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"bot",type:"InputUser"},{name:"enabled",type:"Bool"}],type:"Bool"},{id:395003915,method:"messages.requestWebView",params:[{name:"flags",type:"#"},{name:"from_bot_menu",type:"flags.4?true"},{name:"silent",type:"flags.5?true"},{name:"peer",type:"InputPeer"},{name:"bot",type:"InputUser"},{name:"url",type:"flags.1?string"},{name:"start_param",type:"flags.3?string"},{name:"theme_params",type:"flags.2?DataJSON"},{name:"platform",type:"string"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"WebViewResult"},{id:2146648841,method:"messages.prolongWebView",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"peer",type:"InputPeer"},{name:"bot",type:"InputUser"},{name:"query_id",type:"long"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Bool"},{id:698084494,method:"messages.requestSimpleWebView",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"url",type:"string"},{name:"theme_params",type:"flags.0?DataJSON"},{name:"platform",type:"string"}],type:"SimpleWebViewResult"},{id:172168437,method:"messages.sendWebViewResultMessage",params:[{name:"bot_query_id",type:"string"},{name:"result",type:"InputBotInlineResult"}],type:"WebViewMessageSent"},{id:-603831608,method:"messages.sendWebViewData",params:[{name:"bot",type:"InputUser"},{name:"random_id",type:"long"},{name:"button_text",type:"string"},{name:"data",type:"string"}],type:"Updates"},{id:1157944655,method:"bots.setBotMenuButton",params:[{name:"user_id",type:"InputUser"},{name:"button",type:"BotMenuButton"}],type:"Bool"},{id:-1671369944,method:"bots.getBotMenuButton",params:[{name:"user_id",type:"InputUser"}],type:"BotMenuButton"},{id:-510647672,method:"account.getSavedRingtones",params:[{name:"hash",type:"long"}],type:"account.SavedRingtones"},{id:1038768899,method:"account.saveRingtone",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"account.SavedRingtone"},{id:-2095414366,method:"account.uploadRingtone",params:[{name:"file",type:"InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:2021942497,method:"bots.setBotBroadcastDefaultAdminRights",params:[{name:"admin_rights",type:"ChatAdminRights"}],type:"Bool"},{id:-1839281686,method:"bots.setBotGroupDefaultAdminRights",params:[{name:"admin_rights",type:"ChatAdminRights"}],type:"Bool"},{id:1092913030,method:"phone.saveCallLog",params:[{name:"peer",type:"InputPhoneCall"},{name:"file",type:"InputFile"}],type:"Bool"},{id:-456419968,method:"channels.toggleJoinToSend",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:1277789622,method:"channels.toggleJoinRequest",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:261206117,method:"payments.exportInvoice",params:[{name:"invoice_media",type:"InputMedia"}],type:"payments.ExportedInvoice"},{id:647928393,method:"messages.transcribeAudio",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.TranscribedAudio"},{id:2132608815,method:"messages.rateTranscribedAudio",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"transcription_id",type:"long"},{name:"good",type:"Bool"}],type:"Bool"},{id:-2131921795,method:"payments.assignAppStoreTransaction",params:[{name:"receipt",type:"bytes"},{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Updates"},{id:-537046829,method:"payments.assignPlayMarketTransaction",params:[{name:"receipt",type:"DataJSON"},{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Updates"},{id:-1614700874,method:"payments.canPurchasePremium",params:[{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Bool"},{id:-1206152236,method:"help.getPremiumPromo",params:[],type:"help.PremiumPromo"},{id:-643100844,method:"messages.getCustomEmojiDocuments",params:[{name:"document_id",type:"Vector"}],type:"Vector"},{id:-67329649,method:"messages.getEmojiStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:248473398,method:"messages.getFeaturedEmojiStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:-70001045,method:"account.updateEmojiStatus",params:[{name:"emoji_status",type:"EmojiStatus"}],type:"Bool"},{id:-696962170,method:"account.getDefaultEmojiStatuses",params:[{name:"hash",type:"long"}],type:"account.EmojiStatuses"},{id:257392901,method:"account.getRecentEmojiStatuses",params:[{name:"hash",type:"long"}],type:"account.EmojiStatuses"},{id:404757166,method:"account.clearRecentEmojiStatuses",params:[],type:"Bool"},{id:1063567478,method:"messages.reportReaction",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction_peer",type:"InputPeer"}],type:"Bool"},{id:-1149164102,method:"messages.getTopReactions",params:[{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Reactions"},{id:960896434,method:"messages.getRecentReactions",params:[{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Reactions"},{id:-1644236876,method:"messages.clearRecentReactions",params:[],type:"Bool"},{id:-2064119788,method:"messages.getExtendedMedia",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:767062953,method:"auth.importWebTokenAuthorization",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"web_auth_token",type:"string"}],type:"auth.Authorization"},{id:-279966037,method:"account.reorderUsernames",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:1490465654,method:"account.toggleUsername",params:[{name:"username",type:"string"},{name:"active",type:"Bool"}],type:"Bool"},{id:-1268978403,method:"channels.reorderUsernames",params:[{name:"channel",type:"InputChannel"},{name:"order",type:"Vector"}],type:"Bool"},{id:1358053637,method:"channels.toggleUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"},{name:"active",type:"Bool"}],type:"Bool"},{id:170155475,method:"channels.deactivateAllUsernames",params:[{name:"channel",type:"InputChannel"}],type:"Bool"},{id:-1540781271,method:"channels.toggleForum",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-200539612,method:"channels.createForumTopic",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"title",type:"string"},{name:"icon_color",type:"flags.0?int"},{name:"icon_emoji_id",type:"flags.3?long"},{name:"random_id",type:"long"},{name:"send_as",type:"flags.2?InputPeer"}],type:"Updates"},{id:233136337,method:"channels.getForumTopics",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"flags.0?string"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_topic",type:"int"},{name:"limit",type:"int"}],type:"messages.ForumTopics"},{id:-1333584199,method:"channels.getForumTopicsByID",params:[{name:"channel",type:"InputChannel"},{name:"topics",type:"Vector"}],type:"messages.ForumTopics"},{id:-186670715,method:"channels.editForumTopic",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"topic_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"icon_emoji_id",type:"flags.1?long"},{name:"closed",type:"flags.2?Bool"},{name:"hidden",type:"flags.3?Bool"}],type:"Updates"},{id:1814925350,method:"channels.updatePinnedForumTopic",params:[{name:"channel",type:"InputChannel"},{name:"topic_id",type:"int"},{name:"pinned",type:"Bool"}],type:"Updates"},{id:876830509,method:"channels.deleteTopicHistory",params:[{name:"channel",type:"InputChannel"},{name:"top_msg_id",type:"int"}],type:"messages.AffectedHistory"},{id:693150095,method:"channels.reorderPinnedForumTopics",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"order",type:"Vector"}],type:"Updates"},{id:1760814315,method:"channels.toggleAntiSpam",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-1471109485,method:"channels.reportAntiSpamFalsePositive",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"Bool"},{id:-1632299963,method:"messages.setDefaultHistoryTTL",params:[{name:"period",type:"int"}],type:"Bool"},{id:1703637384,method:"messages.getDefaultHistoryTTL",params:[],type:"DefaultHistoryTTL"},{id:-127582169,method:"contacts.exportContactToken",params:[],type:"ExportedContactToken"},{id:318789512,method:"contacts.importContactToken",params:[{name:"token",type:"string"}],type:"User"},{id:-1189444673,method:"photos.uploadContactProfilePhoto",params:[{name:"flags",type:"#"},{name:"suggest",type:"flags.3?true"},{name:"save",type:"flags.4?true"},{name:"user_id",type:"InputUser"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:1785624660,method:"channels.toggleParticipantsHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"}]},layer:151};var ts=a(745),as=a.n(ts),ss=a(4736),ns=a.n(ss);function is(e){return e>>>0}function rs(e,t){return e=is(e),t=is(t),ns()(e).shiftLeft(32).add(ns()(t))}const os=ns()(Number.MAX_SAFE_INTEGER),ps=ns()(ns()[2]).pow(64),ds=ps.divide(ns()[2]);function fs(e,t=256){return ns().fromArray(e instanceof Uint8Array?[...e]:e,t)}const cs=+es.API.constructors.find((e=>"boolFalse"===e.predicate)).id,ls=+es.API.constructors.find((e=>"boolTrue"===e.predicate)).id,ms=+es.API.constructors.find((e=>"vector"===e.predicate)).id,gs=+es.MTProto.constructors.find((e=>"gzip_packed"===e.predicate)).id,hs="slice";class us{constructor(e={}){this.maxLength=2048,this.offset=0,this.mtproto=!1,this.debug=!1,this.maxLength=e.startMaxLength||2048,this.mtproto=e.mtproto||!1,this.createBuffer()}createBuffer(){this.buffer=new ArrayBuffer(this.maxLength),this.intView=new Int32Array(this.buffer),this.byteView=new Uint8Array(this.buffer)}getArray(){const e=new ArrayBuffer(this.offset),t=new Int32Array(e);return t.set(this.intView.subarray(0,this.offset/4)),t}getBuffer(){return this.getArray().buffer}getBytes(e=!0){if(e){const e=new ArrayBuffer(this.offset),t=new Uint8Array(e);return t.set(this.byteView.subarray(0,this.offset)),t}const t=new Array(this.offset);for(let e=0;e>>",e.toString(16),e,t);const a=this.offset/4;return this.checkLength(4),this.intView[a]=e,this.offset+=4,a}storeInt(e,t){return this.writeInt(e,(t||"")+":int")}storeBool(e,t){e?this.writeInt(ls,(t||"")+":bool"):this.writeInt(cs,(t||"")+":bool")}storeLongP(e,t,a){this.writeInt(t,(a||"")+":long[low]"),this.writeInt(e,(a||"")+":long[high]")}storeLong(e,t){if(Array.isArray(e))return 2===e.length?this.storeLongP(e[0],e[1],t):this.storeIntBytes(e,64,t);const a=(s=ns()(e)).isNegative()?ps.add(s):s;var s;const{quotient:n,remainder:i}=a.divmod(4294967296),r=n.toJSNumber(),o=i.toJSNumber();this.writeInt(o,(t||"")+":long[low]"),this.writeInt(r,(t||"")+":long[high]")}storeDouble(e,t){const a=new ArrayBuffer(8),s=new Int32Array(a);new Float64Array(a)[0]=e,this.writeInt(s[0],(t||"")+":double[low]"),this.writeInt(s[1],(t||"")+":double[high]")}storeString(e,t){this.debug&&console.log(">>>",e,(t||"")+":string"),void 0===e&&(e="");const a=unescape(encodeURIComponent(e));this.checkLength(a.length+8);const s=a.length;s<=253?this.byteView[this.offset++]=s:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&s,this.byteView[this.offset++]=(65280&s)>>8,this.byteView[this.offset++]=(16711680&s)>>16);for(let e=0;e>>",T(e),(t||"")+":bytes");const a=e.length;for(this.checkLength(a+8),a<=253?this.byteView[this.offset++]=a:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&a,this.byteView[this.offset++]=(65280&a)>>8,this.byteView[this.offset++]=(16711680&a)>>16),this.byteView.set(e,this.offset),this.offset+=a;this.offset%4;)this.byteView[this.offset++]=0}storeIntBytes(e,t,a){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const s=e.length;if(t%32||8*s!==t){const n=new Error("Invalid bits: "+t+", "+s);throw console.error(n,e,a),n}this.debug&&console.log(">>>",T(e),(a||"")+":int"+t),this.checkLength(s),this.byteView.set(e,this.offset),this.offset+=s}storeRawBytes(e,t){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const a=e.length;this.debug&&console.log(">>>",T(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?es.MTProto:es.API).methods.find((t=>t.method===e));if(!a)throw new Error("No method "+e+" found");this.storeInt(a.id,e+"[id]");const s=t.pFlags||t,n={};for(const i of a.params){let a=i.type;if(-1!==a.indexOf("?")){const e=a.split("?"),n=e[0].split(".");if(!(t[n[0]]&1<<+n[1])){if(!("true"===e[1]?s[i.name]:void 0!==t[i.name]))continue;t[n[0]]|=1<<+n[1]}a=e[1]}const r=this.storeObject(t[i.name],a,e+"["+i.name+"]");"#"===a&&(t[i.name]=t[i.name]||0,n[i.name]=r)}for(const e in n)this.intView[n[e]]=t[e];return a.type}storeObject(e,t,a){switch(t){case"#":e=e||0;case"int":return this.storeInt(e,a);case"long":return this.storeLong(e,a);case"int128":return this.storeIntBytes(e,128,a);case"int256":return this.storeIntBytes(e,256,a);case"int512":return this.storeIntBytes(e,512,a);case"string":return this.storeString(e,a);case"bytes":return this.storeBytes(e,a);case"double":return this.storeDouble(e,a);case"Bool":return this.storeBool(e,a);case"true":return}if(Array.isArray(e)){if("Vector"===t.substr(0,6))this.writeInt(ms,a+"[id]");else if("vector"!==t.substr(0,6))throw new Error("Invalid vector type "+t);const s=t.substr(7,t.length-8);this.writeInt(e.length,a+"[count]");for(let t=0;te.predicate===n));if((i="%"===t.charAt(0))&&(t=t.substr(1)),!r)throw new Error("No predicate "+n+" found");n===t&&(i=!0),i||this.writeInt(r.id,a+"["+n+"][id]");const o=e.pFlags,p={};for(const t of r.params){let s=t.type;if(-1!==s.indexOf("?")){const a=s.split("?"),n=a[0].split(".");if(!(e[n[0]]&1<<+n[1])){if(!("true"===a[1]?o&&o[t.name]:void 0!==e[t.name]))continue;e[n[0]]|=1<<+n[1]}s=a[1]}const i=this.storeObject(e[t.name],s,a+"["+n+"]["+t.name+"]");"#"===s&&(e[t.name]=e[t.name]||0,p[t.name]=i)}for(const t in p)this.intView[p[t]]=e[t];return r.type}}class ys{constructor(e,t={}){this.offset=0,this.mtproto=!1,e instanceof ArrayBuffer?(this.buffer=e,this.intView=new Int32Array(e),this.byteView=new Uint8Array(this.buffer)):(this.buffer=e.buffer,this.intView=new Int32Array(e.buffer),this.byteView=e),this.override=t.override||{},this.mtproto=!!t.mtproto,this.debug=void 0!==t.debug&&t.debug}readInt(e){if(this.byteView.length-this.offset<4)throw console.error(this.byteView,this.offset),new Error("Nothing to fetch: "+e);const t=this.intView[this.offset/4];return this.debug&&console.log("<<<",t.toString(16),t,e,this.byteView.slice(this.offset-16,this.offset+16),T(this.byteView.slice(this.offset-16,this.offset+16))),this.offset+=4,t}fetchInt(e){return this.readInt((e||"")+":int")}fetchDouble(e){const t=new ArrayBuffer(8),a=new Int32Array(t),s=new Float64Array(t);return a[0]=this.readInt((e||"")+":double[low]"),a[1]=this.readInt((e||"")+":double[high]"),s[0]}fetchLong(e){const t=this.readInt((e||"")+":long[low]");let a=rs(this.readInt((e||"")+":long[high]"),t);var s;return this.mtproto||(a=(s=a).greater(ds)?s.minus(ps):s),!this.mtproto&&os.greaterOrEquals(a.abs())?a.toJSNumber():a.toString(10)}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===ls||t!==cs&&(this.offset-=4,this.fetchObject("Object",e))}fetchString(e){let t=this.byteView[this.offset++];254===t&&(t=this.byteView[this.offset++]|this.byteView[this.offset++]<<8|this.byteView[this.offset++]<<16);let a,s="";for(let e=0;ethis.byteView.byteLength)throw new Error("Invalid raw bytes length: "+e+", buffer len: "+this.byteView.byteLength);if(t){const t=new Uint8Array(e);return t.set(this.byteView[hs](this.offset,this.offset+e)),this.offset+=e,t}const s=new Array(e);for(let t=0;t0){const n=e.substr(7,e.length-8);for(let e=0;ee.type===t)),!s)throw new Error("Constructor not found for type: "+e)}else{const r=this.readInt(t+"[id]");if(r===gs){const a=(i=this.fetchBytes(t+"[packed_string]"),as().inflate(i,void 0));return new ys(a).fetchObject(e,t)}if(r===ms)return this.fetchVector(e,t);let o=a.constructorsIndex;if(!o){a.constructorsIndex=o={};for(let e=0,t=a.constructors.length;e0&&r{var e;if(this.pingDelayDisconnectDeferred||!this.transport||!this.transport.connected)return;const t=this.pingDelayDisconnectDeferred=(0,v.Z)(),a=this.delays,s=this.delays.pingMaxTime,n=Math.min(null!==(e=this.lastPingTime)&&void 0!==e?e:0,s),i=Math.round(a.disconnectDelayMin+n/s*(a.disconnectDelayMax-a.disconnectDelayMin)),r=1e3*i,o=this.lastPingStartTime=Date.now(),p=this.lastPingDelayDisconnectId=(0,Te.a)(),d={notContentRelated:!0};this.wrapMtpCall("ping_delay_disconnect",{ping_id:p,disconnect_delay:i},d);const f=this.log.bindPrefix("sendPingDelayDisconnect");this.debug&&f.debug(`ping, timeout=${r}, lastPingTime=${this.lastPingTime}, msgId=${d.messageId}, pingId=${p}`);const c=E.Z.setTimeout(t.reject,r);t.then((e=>{clearTimeout(c);const t=Date.now()-o;if(this.lastPingTime=t/1e3,this.debug&&f.debug(`pong, reason='${e}', time=${n}, msgId=${d.messageId}`),t>r)throw void 0;return(0,P.Z)(Math.max(0,this.delays.pingInterval-t))})).catch((()=>{clearTimeout(c);const e=this.transport;this.pingDelayDisconnectDeferred===t&&(null==e?void 0:e.connection)&&(f.error("catch, closing connection",this.lastPingTime,d.messageId),e.connection.close())})).finally((()=>{this.pingDelayDisconnectDeferred===t&&(this.pingDelayDisconnectDeferred=void 0,this.sendPingDelayDisconnect())}))},this.checkLongPoll=()=>{const e=this.cleanupSent();if(this.longPollPending&&Date.now(){e&&(t!==this.dcId||this.sleepAfter&&Date.now()>this.sleepAfter)||this.sendLongPoll()}))},this.checkConnection=e=>{if(this.debug&&this.log("Check connection",e),this.clearCheckConnectionTimeout(),!this.transport)return void this.log.warn("No transport for checkConnection");const t=new us({mtproto:!0}),a=(0,Te.a)();t.storeMethod("ping",{ping_id:a});const s={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),body:t.getBytes(!0)};this.offline&&this.setConnectionStatus(U.Q.Connecting),this.sendEncryptedRequest(s).then((()=>{this.toggleOffline(!1)}),(()=>{this.debug&&this.log("Delay",1e3*this.checkConnectionPeriod),this.checkConnectionTimeout=E.Z.setTimeout((()=>this.checkConnection("from failed checkConnection request")),1e3*this.checkConnectionPeriod|0),this.checkConnectionPeriod=Math.min(60,1.5*this.checkConnectionPeriod)}))},this.authKeyUint8=(0,bs.Z)(this.authKey),this.serverSalt=(0,bs.Z)(i),this.isFileUpload=!!r.fileUpload,this.isFileDownload=!!r.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload,this.delays=this.isFileNetworker?Is.file:Is.client;const o=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+a+o,this.log=(0,I.kg)(this.name+(o?"":"-C")+"-"+ws++,I.v9.Log|I.v9.Error|I.v9.Warn),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=w(new Uint8Array(8))}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&(0,ne.Z)(t.inner,((e,a)=>{const s=this.updateSentMessage(e);s?t.inner[a]=s.msg_id:t.inner.splice(a,1)})),t.msg_id=this.timeManager.generateId(),t.seq_no=this.generateSeqNo(t.notContentRelated||t.container),this.debug&&this.log(`updateSentMessage, old=${e}, new=${t.msg_id}`),this.sentMessages[t.msg_id]=t,delete this.sentMessages[e],t)}generateSeqNo(e){let t=2*this.seqNo;return e||(t++,this.seqNo++),t}wrapMtpCall(e,t,a){const s=new us({mtproto:!0});s.storeMethod(e,t);const n=this.timeManager.generateId(),i=this.generateSeqNo(),r={msg_id:n,seq_no:i,body:s.getBytes(!0)};return b.Z.debug&&this.log("MT call",e,t,n,i),this.pushMessage(r,a)}wrapMtpMessage(e,t){const a=new us({mtproto:!0});a.storeObject(e,"Object");const s=this.timeManager.generateId(),n=this.generateSeqNo(t.notContentRelated),i={msg_id:s,seq_no:n,body:a.getBytes(!0)};return b.Z.debug&&this.log("MT message",e,s,n),this.pushMessage(i,t)}wrapApiCall(e,t={},a={}){const s=new us(a);if(!this.connectionInited){const e=es.API.methods.find((e=>"invokeWithLayer"===e.method));if(!e)throw new Error("no invokeWithLayer!");s.storeInt(+e.id,"invokeWithLayer"),s.storeInt(es.layer,"layer");const t=es.API.methods.find((e=>"initConnection"===e.method));if(!t)throw new Error("no initConnection!");s.storeInt(+t.id,"initConnection"),s.storeInt(0,"flags"),s.storeInt(_.Z.id,"api_id"),s.storeString(i().USER_AGENT||"Unknown UserAgent","device_model"),s.storeString(navigator.platform||"Unknown Platform","system_version"),s.storeString(_.Z.version+(_.Z.isMainDomain?" "+_.Z.suffix:""),"app_version"),s.storeString(navigator.language||"en","system_lang_code"),s.storeString(_.Z.langPack,"lang_pack"),s.storeString(this.networkerFactory.language,"lang_code")}if(a.afterMessageId){if(void 0===Cs){const e=es.API.methods.find((e=>"invokeAfterMsg"===e.method));Cs=e?+e.id:0}Cs?(s.storeInt(Cs,"invokeAfterMsg"),s.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=s.storeMethod(e,t);const n={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:s.getBytes(!0),isAPI:!0};return b.Z.debug?this.log("Api call",e,n,t,a):this.debug&&this.log("Api call",e,t,a),this.pushMessage(n,a)}changeTransport(e){const t=this.transport;t&&(t.destroy(),this.nextReqTimeout&&(clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0),this.connectionInited=!1,void 0!==this.longPollInterval&&(clearInterval(this.longPollInterval),this.longPollInterval=void 0),this.clearCheckConnectionTimeout()),this.log("change transport",e,t),this.clearPingDelayDisconnect(),this.transport=e,e&&(e.networker=this,e instanceof S&&(this.longPollInterval=E.Z.setInterval(this.checkLongPoll,1e4),this.checkLongPoll(),this.checkConnection("changed transport")),e.connection&&e.connected&&this.setConnectionStatus(U.Q.Connected),this.resend())}destroy(){this.log("destroy")}forceReconnectTimeout(){this.transport.reconnect?this.transport.reconnect():this.resend()}forceReconnect(){this.transport.forceReconnect?this.transport.forceReconnect():this.checkConnection("force reconnect")}clearPingDelayDisconnect(){const e=this.pingDelayDisconnectDeferred;this.pingDelayDisconnectDeferred=void 0,this.lastPingDelayDisconnectId=void 0,e&&e.reject()}sendLongPoll(){this.sendingLongPoll||(this.sendingLongPoll=!0,this.longPollPending=Date.now()+25e3,this.debug&&this.log.debug("sendLongPoll",this.longPollPending),this.wrapMtpCall("http_wait",{max_delay:500,wait_after:150,max_wait:25e3},{noResponse:!0,longPoll:!0}).then((()=>{this.longPollPending=void 0,setTimeout(this.checkLongPoll,0)}),(e=>{this.log("Long-poll failed",e)})).finally((()=>{this.sendingLongPoll=void 0})))}clearCheckConnectionTimeout(){void 0!==this.checkConnectionTimeout&&(clearTimeout(this.checkConnectionTimeout),this.checkConnectionTimeout=void 0)}toggleOffline(e){if(this.offline!==e)if(this.offline=e,this.clearCheckConnectionTimeout(),e){clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0,this.checkConnectionPeriod<1.5&&(this.checkConnectionPeriod=0);const e=1e3*this.checkConnectionPeriod|0;this.checkConnectionRetryAt=Date.now()+e,this.setConnectionStatus(U.Q.Closed,this.checkConnectionRetryAt),this.checkConnectionTimeout=E.Z.setTimeout((()=>this.checkConnection("from toggleOfline")),e),this.checkConnectionPeriod=Math.min(30,1.5*(1+this.checkConnectionPeriod))}else this.setConnectionStatus(U.Q.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?U.Q.Closed:U.Q.Connected,e?this.checkConnectionRetryAt:void 0)}handleSentEncryptedRequestHTTP(e,t,a){e.then((e=>(this.toggleOffline(!1),this.parseResponse(e).then((e=>(this.debug&&this.log.debug("Server response",e),this.processMessage(e.response,e.messageId,e.sessionId),this.checkLongPoll(),this.checkConnectionPeriod=Math.max(1.1,Math.sqrt(this.checkConnectionPeriod)),!0))))),(e=>(this.log.error("Encrypted request failed",e,t),this.pushResend(t.msg_id),this.toggleOffline(!0),!1))).then((e=>{const t=this.sentMessages;a.forEach((a=>{const s=t[a];if(s){const n=s.deferred;delete t[a],delete this.pendingMessages[a],e?n.resolve():n.reject()}}))}))}pushMessage(e,t){let a;return t.notContentRelated&&!t.noResponse||(a=(0,v.Z)()),this.sentMessages[e.msg_id]=Object.assign(e,t,a?{deferred:a}:void 0),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),(0,fe.Z)(t)&&(t.messageId=e.msg_id),a}attachPromise(e,t){const a=setTimeout((()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime{clearTimeout(a),this.setConnectionStatus(U.Q.Connected),--this.activeRequests,this.setDrainTimeout()})),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=E.Z.setTimeout((()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()}),1e4))}setConnectionStatus(e,t){var a;const s=e===U.Q.Connected,n=this.status!==e;this.isOnline=s,this.status=e,n&&(this.networkerFactory.onConnectionStatusChange&&this.networkerFactory.onConnectionStatusChange({_:"networkerStatus",status:e,dcId:this.dcId,name:this.name,isFileNetworker:this.isFileNetworker,isFileDownload:this.isFileDownload,isFileUpload:this.isFileUpload,retryAt:t}),this.isOnline&&this.scheduleRequest(),(null===(a=this.transport)||void 0===a?void 0:a.connection)&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect()))}pushResend(e,t=100){const a=t?Date.now()+t:0,s=this.sentMessages[e];if(s.container)for(const e of s.inner)this.pendingMessages[e]=a;else this.pendingMessages[e]=a;s.acked&&this.log.error("pushResend: acked message?",s),this.debug&&this.log.debug("pushResend:",e,s,this.pendingMessages,t),this.scheduleRequest(t)}getMsgKey(e,t){return Ms(this,void 0,void 0,(function*(){const a=t?0:8,n=(0,_s.Z)(this.authKeyUint8.subarray(88+a,88+a+32),e),i=yield s.Z.invokeCrypto("sha256",n);return new Uint8Array(i).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,n=new Uint8Array(52),i=new Uint8Array(52),r=[];return n.set(e,0),n.set(this.authKeyUint8.subarray(a,a+36),16),r.push(s.Z.invokeCrypto("sha256",n)),i.set(this.authKeyUint8.subarray(40+a,40+a+36),0),i.set(e,36),r.push(s.Z.invokeCrypto("sha256",i)),Promise.all(r).then((e=>{const t=new Uint8Array(32),a=new Uint8Array(32),s=new Uint8Array(e[0]),n=new Uint8Array(e[1]);return t.set(s.subarray(0,8)),t.set(n.subarray(8,24),8),t.set(s.subarray(24,32),24),a.set(n.subarray(0,8)),a.set(s.subarray(8,24),8),a.set(n.subarray(24,32),24),[t,a]}))}isStopped(){return this.networkerFactory.akStopped&&!this.isFileNetworker}performScheduledRequest(){if(this.isStopped())return!1;if(this.pendingAcks.length){const e=this.pendingAcks.slice();this.wrapMtpMessage({_:"msgs_ack",msg_ids:e},{notContentRelated:!0,noSchedule:!0})}const e=this.pendingResendReq.length;if(e){const t=Object.assign({},Ss),a=this.pendingResendReq.splice(0,e);this.wrapMtpMessage({_:"msg_resend_req",msg_ids:a},t),this.log("resend: resending requests",t.messageId,a)}let t;const a=[];let s=0,n=!1,i=!1,r=!1;const o=Object.keys(this.pendingMessages).map((e=>ns()(e))).sort(((e,t)=>e.compare(t))).map((e=>e.toString(10)));for(const e of o){const o=this.sentMessages[e];if(o&&o.body){const e=o.body.length+32;if(s+e>655360&&(this.log.warn("lengthOverflow",o,a),r=!0,t))break;a.push(o),s+=e,o.isAPI?n=!0:o.longPoll&&(i=!0),t=o}delete this.pendingMessages[e]}if(this.transport instanceof S&&n&&!i){const e=new us({mtproto:!0});e.storeMethod("http_wait",{max_delay:500,wait_after:150,max_wait:3e3}),a.push({msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:e.getBytes(!0)})}if(!a.length)return;const p=a.filter((e=>e.noResponse)).map((e=>e.msg_id));if(a.length>1){const e=this.generateContainerMessage(s,a);t=e.messageWithBody,this.sentMessages[t.msg_id]=e.message}else this.sentMessages[t.msg_id]=t;this.pendingAcks=[];const d=this.sendEncryptedRequest(t);this.transport instanceof S&&this.handleSentEncryptedRequestHTTP(d,t,p),this.transport instanceof S||this.cleanupSent(),r&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new us({mtproto:!0,startMaxLength:e+64});a.storeInt(1945237724,"CONTAINER[id]"),a.storeInt(t.length,"CONTAINER[count]");const s=[];t.forEach(((e,t)=>{s.push(e.msg_id),a.storeLong(e.msg_id,"CONTAINER["+t+"][msg_id]"),a.storeInt(e.seq_no,"CONTAINER["+t+"][seq_no]"),a.storeInt(e.body.length,"CONTAINER["+t+"][bytes]"),a.storeRawBytes(e.body,"CONTAINER["+t+"][body]")}));const n={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:s};return b.Z.debug&&this.log.warn("Container",s,n.msg_id,n.seq_no),{message:n,messageWithBody:Object.assign({body:a.getBytes(!0)},n)}}getEncryptedMessage(e){return Ms(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield s.Z.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then((e=>s.Z.invokeCrypto("aes-decrypt",t,e[0],e[1])))}getEncryptedOutput(e){const t=new us({startMaxLength:e.body.length+2048});t.storeIntBytes(this.serverSalt,64,"salt"),t.storeIntBytes(this.sessionId,64,"session_id"),t.storeLong(e.msg_id,"message_id"),t.storeInt(e.seq_no,"seq_no"),t.storeInt(e.body.length,"message_data_length"),t.storeRawBytes(e.body,"message_data");const a=t.getBuffer(),s=16-t.getOffset()%16+16*(1+(0,Te.d)(8)%5),n=w(new Uint8Array(s)),i=(0,_s.Z)(a,n);return this.getEncryptedMessage(i).then((e=>{const t=new us({startMaxLength:e.bytes.length+256});return t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data"),t.getBytes(!0)}))}sendEncryptedRequest(e){return Ms(this,void 0,void 0,(function*(){const t=yield this.getEncryptedOutput(e);this.transport||this.log.error("trying to send something when offline",this.transport,this),this.debug&&this.log.debug("sending:",e,[e.msg_id].concat(e.inner||[]),t.length);const a=this.transport?this.transport.send(t):Promise.reject({});if(!(this.transport instanceof S))return a;const s={code:406,type:"NETWORK_BAD_RESPONSE",transport:this.transport};return a.then((e=>{if(!(null==e?void 0:e.byteLength))throw s;return e}),(e=>{throw e.message||e.type||(e=Object.assign(s,{type:"NETWORK_BAD_REQUEST",originalError:e})),e}))}))}parseResponse(e){this.lastResponseTime=Date.now();const t=new ys(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!(0,Ps.Z)(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+T(a));const s=t.fetchIntBytes(128,!0,"msg_key"),n=t.fetchRawBytes(e.byteLength-t.getOffset(),!0,"encrypted_data");return this.getDecryptedMessage(s,n).then((e=>this.getMsgKey(e,!1).then((t=>{if(!(0,Ps.Z)(s,t))throw this.log.warn("[MT] msg_keys",s,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new ys(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const n=a.fetchIntBytes(64,!0,"session_id"),i=a.fetchLong("message_id");if(!((0,Ps.Z)(n,this.sessionId)||this.prevSessionId&&(0,Ps.Z)(n,this.prevSessionId)))throw this.log.warn("Sessions",n,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+T(n));const r=a.fetchInt("seq_no"),o=e.byteLength,p=a.fetchInt("message_data[length]");let d=a.getOffset();if(p%4||p>o-d)throw new Error("[MT] Invalid body length: "+p);const f=a.fetchRawBytes(p,!0,"message_data");d=a.getOffset();const c=o-d;if(c<12||c>1024)throw new Error("[MT] Invalid padding length: "+c);return a=new ys(f,{mtproto:!0,override:{mt_message:(e,t)=>{e.msg_id=a.fetchLong(t+"[msg_id]"),e.seqno=a.fetchInt(t+"[seqno]"),e.bytes=a.fetchInt(t+"[bytes]");const s=a.getOffset();try{e.body=a.fetchObject("Object",t+"[body]")}catch(t){this.log.error("parse error",t.message,t.stack),e.body={_:"parse_error",error:t}}a.getOffset()!==s+e.bytes&&a.setOffset(s+e.bytes)},mt_rpc_result:(e,t)=>{e.req_msg_id=a.fetchLong(t+"[req_msg_id]");const s=this.sentMessages[e.req_msg_id],n=s&&s.resultType||"Object";e.req_msg_id&&!s||(e.result=a.fetchObject(n,t+"[result]"))}}}),{response:a.fetchObject("","INPUT"),messageId:i,sessionId:n,seqNo:r}}))))}applyServerSalt(e){const t=(a=e,vs((s=ns()(a),new Uint8Array(s.toArray(256).value)).reverse(),8,!0,!1,!1));var a,s;qa.Z.set({["dc"+this.dcId+"_server_salt"]:T(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){this.transport instanceof S&&(this.offline&&this.checkConnection("forced schedule"),e||(e=0));const t=Date.now()+(e||0);if(this.nextReq&&(void 0===e||this.nextReq<=t))return;this.nextReqTimeout&&clearTimeout(this.nextReqTimeout);const a=()=>{this.nextReqTimeout=0,this.nextReq=0,this.transport instanceof S&&this.offline||this.performScheduledRequest()};this.nextReq=t,void 0!==e?this.nextReqTimeout=E.Z.setTimeout(a,e):a()}ackMessage(e){let t;this.pendingAcks.push(e),this.transport instanceof S&&(t=3e4),this.scheduleRequest(t)}reqResend(e){this.debug&&this.log.debug("Req resend",e),this.pendingResendReq.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;const t=this.sentMessages;return Object.keys(t).forEach((a=>{const s=t[a];if(s.notContentRelated&&void 0===this.pendingMessages[a])delete t[a];else if(s.container){for(const a of s.inner)if(void 0!==t[a])return void(e=!0);delete t[a]}else e=!0})),!e}processMessageAck(e){const t=this.sentMessages[e];t&&!t.acked&&(t.acked=!0)}processError(e){const t=(e.error_message||"").match(/^([A-Z_0-9]+\b)(: (.+))?/)||[];return e.error_code=e.error_code,{code:!e.error_code||e.error_code<=0?500:e.error_code,type:t[1]||"UNKNOWN",description:t[3]||"CODE#"+e.error_code+" "+e.error_message,originalError:e}}resend(){const e=this.sentMessages;for(const t in e){const a=e[t];(a.body||a.container)&&this.pushResend(t)}this.transport.connection&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect())}applyServerTime(e){const t=ns()(e).shiftRight(32).toJSNumber();return this.log("applying server time",t),this.timeManager.applyServerTime(t)}processMessage(e,t,a){if("messageEmpty"!==e._)if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(this.debug&&this.log.debug("process message",e,t),this.pingDelayDisconnectDeferred&&this.pingDelayDisconnectDeferred.resolve("any message"),e._){case"msg_container":for(const t of e.messages)this.processMessage(t,t.msg_id,a);break;case"bad_server_salt":this.log("Bad server salt",e),this.applyServerSalt(e.new_server_salt),this.sentMessages[e.bad_msg_id]&&this.pushResend(e.bad_msg_id),this.ackMessage(t);break;case"bad_msg_notification":switch(this.log.error("Bad msg notification",e),e.error_code){case 16:case 17:case 32:case 33:case 64:{const a=this.applyServerTime(t);(17===e.error_code||a)&&(this.log("Update session"),this.updateSession());const s=this.updateSentMessage(e.bad_msg_id);s&&this.pushResend(s.msg_id)}}break;case"message":if(-1!==this.lastServerMessages.indexOf(t))return void this.ackMessage(t);this.lastServerMessages.push(t),this.lastServerMessages.length>100&&this.lastServerMessages.shift(),this.processMessage(e.body,e.msg_id,a);break;case"new_session_created":this.ackMessage(t),this.debug&&this.log.debug("new_session_created",e),this.processMessageAck(e.first_msg_id),this.applyServerSalt(e.server_salt),qa.Z.get("dc").then((t=>{t===this.dcId&&!this.isFileNetworker&&this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}));break;case"msgs_ack":this.debug&&this.log("got acks",e.msg_ids);for(const t of e.msg_ids)this.processMessageAck(t);break;case"msg_detailed_info":if(!this.sentMessages[e.msg_id]){this.ackMessage(e.answer_msg_id);break}case"msg_new_detailed_info":if(-1!==this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResend(e.answer_msg_id);break;case"msgs_state_info":{this.ackMessage(e.answer_msg_id);const t=[[this.lastResendReq,this.pendingResendReq]];for(const[a,s]of t)if((null==a?void 0:a.reqMsgId)===e.req_msg_id&&s.length)for(const e of a.msgIds){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}break}case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,s=this.sentMessages[a];if(this.debug&&this.log("Rpc response",e.result,s),this.processMessageAck(a),s){const t=s.deferred;if("rpc_error"===e.result._){const a=this.processError(e.result);this.log("Rpc error",a),t&&t.reject(a)}else t&&t.resolve(e.result),s.isAPI&&!this.connectionInited&&(this.connectionInited=!0);delete this.sentMessages[a]}else this.debug&&this.log("Rpc result for unknown message:",a,e);break}case"pong":{const t=e.ping_id;if(this.lastPingDelayDisconnectId===t){const e=this.pingDelayDisconnectDeferred;e?e.resolve("pong"):this.log("ping deferred deleted",t)}break}default:this.ackMessage(t),null!==this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}else this.log.warn("processMessage: messageEmpty",e,t)}}class As extends G{constructor(){super(...arguments),this.networkers=[],this.language=navigator.language||_.Z.langPackCode,this.updatesProcessor=null,this.akStopped=!1}onConnectionStatusChange(e){this.rootScope.dispatchEvent("connection_status_change",e)}removeNetworker(e){(0,M.Z)(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,s,n){const i=new ks(this,this.timeManager,e,t,a,s,n);return this.networkers.push(i),i}startAll(){if(this.akStopped){const e=this.networkers.filter((e=>e.isStopped()));this.akStopped=!1,this.updatesProcessor&&this.updatesProcessor({_:"new_session_created"});for(const t of e)t.scheduleRequest()}}stopAll(){this.akStopped=!0}setLanguage(e){this.language=e;for(const e of this.networkers)e.isFileNetworker||(e.connectionInited=!1)}unsetConnectionInited(){for(const e of this.networkers)e.connectionInited=!1}forceReconnectTimeout(){for(const e of this.networkers)e.forceReconnectTimeout()}forceReconnect(){for(const e of this.networkers)if(!e.isFileNetworker){e.forceReconnect();break}}}const Ds=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,b.Z.test&&(this.publisKeysHex=this.testPublicKeysHex)}prepare(){return this.preparePromise?this.preparePromise:this.prepared?Promise.resolve():this.preparePromise=Promise.all(this.publisKeysHex.map((e=>{const t=new us;t.storeBytes((0,Ha.Z)(e.modulus),"n"),t.storeBytes((0,Ha.Z)(e.exponent),"e");const a=t.getBuffer();return s.Z.invokeCrypto("sha1",a).then((t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[T(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}}))}))).then((()=>{this.prepared=!0,this.preparePromise=null}))}select(e){return t=this,a=void 0,n=function*(){yield this.prepare();for(let t=0;t{if(d.ZP&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw o;try{const t=new ys(e,{mtproto:!0});if(4===e.length){const e=t.fetchInt();throw this.log.error("mtpSendPlainRequest: wrong response, error code:",e),e}const a=t.fetchLong("auth_key_id");"0"!==a&&this.log.error("auth_key_id !== 0",a);const s=t.fetchLong("msg_id");"0"===s&&this.log.error("msg_id === 0",s);const n=t.fetchInt("msg_len");return n||this.log.error("no msg_len",n),t}catch(e){throw this.log.error("mtpSendPlainRequest: deserialization went bad",e),Object.assign(o,{originalError:e})}}),(e=>{throw e.message||e.type||(e=Object.assign(o,{originalError:e})),e}))}sendReqPQ(e){return Ts(this,void 0,void 0,(function*(){const t=new us({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),d.ZP&&this.log("Send req_pq",T(e.nonce));try{const s=this.sendPlainRequest(e.dcId,t.getBytes(!0));Ds.prepare(),a=yield s}catch(e){throw this.log.error("req_pq error",e.message),e}const n=a.fetchObject("ResPQ");if("resPQ"!==n._)throw new Error("[MT] resPQ response invalid: "+n._);if(!(0,Ps.Z)(e.nonce,n.nonce))throw this.log.error(e.nonce,n.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=n.server_nonce,e.pq=n.pq,e.fingerprints=n.server_public_key_fingerprints,d.ZP&&this.log("Got ResPQ",T(e.serverNonce),T(e.pq),e.fingerprints);const i=yield Ds.select(e.fingerprints);if(!i)throw new Error("[MT] No public key found");e.publicKey=i,d.ZP&&this.log("PQ factorization start",e.pq);try{var r=yield s.Z.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=r[0],e.q=r[1],d.ZP&&this.log("PQ factorization done",r),this.sendReqDhParams(e)}))}sendReqDhParams(e){return Ts(this,void 0,void 0,(function*(){e.newNonce=w(new Uint8Array(32));const t={_:"p_q_inner_data_dc",pq:e.pq,p:e.p,q:e.q,nonce:e.nonce,server_nonce:e.serverNonce,new_nonce:e.newNonce,dc:0},a=new us({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const n=a.getBytes(!0);if(n.length>144)throw"DH_params: data is more than 144 bytes!";const i=vs(n,192,!1,!0,!1),r=i.slice().reverse(),o=yield(()=>Ts(this,void 0,void 0,(function*(){for(;;){const t=w(new Uint8Array(32)),a=r.concat(yield s.Z.invokeCrypto("sha256",t.concat(i)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const n=yield s.Z.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),o=Us(t,yield s.Z.invokeCrypto("sha256",n)).concat(n),p=fs(o),d=ns()(e.publicKey.modulus,16);if(-1===p.compare(d))return o}})))(),p=vs(yield s.Z.invokeCrypto("rsa-encrypt",o,e.publicKey),256,!0,!0,!0),f={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:p},c=new us({mtproto:!0});c.storeMethod("req_DH_params",f);const l=c.getBytes(!0);let m;d.ZP&&this.log("Send req_DH_params",f);try{m=yield this.sendPlainRequest(e.dcId,l)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const g=m.fetchObject("Server_DH_Params","RESPONSE");if(d.ZP&&this.log("Sent req_DH_params, response:",g),"server_DH_params_fail"!==g._&&"server_DH_params_ok"!==g._)throw new Error("[MT] Server_DH_Params response invalid: "+g._);if(!(0,Ps.Z)(e.nonce,g.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,g.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===g._){const t=(yield s.Z.invokeCrypto("sha1",e.newNonce)).slice(-16);if(!(0,Ps.Z)(t,g.new_nonce_hash))throw new Error("[MT] server_DH_params_fail new_nonce_hash mismatch");throw new Error("[MT] server_DH_params_fail")}try{yield this.decryptServerDhDataAnswer(e,g.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return Ts(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.serverNonce))).concat((yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield s.Z.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),n=a.slice(0,20),i=a.slice(20),r=new ys(i,{mtproto:!0}),o=r.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==o._)throw new Error("[MT] server_DH_inner_data response invalid: "+o);if(!(0,Ps.Z)(e.nonce,o.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,o.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");d.ZP&&this.log("Done decrypting answer"),e.g=o.g,e.dhPrime=o.dh_prime,e.gA=o.g_a,e.serverTime=o.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const p=r.getOffset();if(!(0,Ps.Z)(n,yield s.Z.invokeCrypto("sha1",i.slice(0,p))))throw new Error("[MT] server_DH_inner_data SHA1 mismatch");this.timeManager.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){d.ZP&&this.log("Verifying DH params",e,t,a);const s=T(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==s)throw new Error("[MT] DH params are not verified: unknown dhPrime");d.ZP&&this.log("dhPrime cmp OK");const n=fs(a),i=ns()(s,16);if(n.compare(ns().one)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(n.compare(i.subtract(ns().one))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");d.ZP&&this.log("1 < gA < dhPrime-1 OK");const r=ns()(2).pow(1984);if(n.compare(r)<0)throw new Error("[MT] DH params are not verified: gA < 2^{2048-64}");if(n.compare(i.subtract(r))>=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return d.ZP&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return Ts(this,void 0,void 0,(function*(){const t=(0,Ha.Z)(e.g.toString(16));e.b=w(new Uint8Array(256));try{var a=yield s.Z.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const n=new us({mtproto:!0});n.storeObject({_:"client_DH_inner_data",nonce:e.nonce,server_nonce:e.serverNonce,retry_id:[0,e.retry++],g_b:a},"Client_DH_Inner_Data");const i=(yield s.Z.invokeCrypto("sha1",n.getBuffer())).concat(n.getBytes(!0)),r=yield s.Z.invokeCrypto("aes-encrypt",i,e.tmpAesKey,e.tmpAesIv),o=new us({mtproto:!0});let p;o.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:r}),d.ZP&&this.log("Send set_client_DH_params");try{p=yield this.sendPlainRequest(e.dcId,o.getBytes(!0))}catch(e){throw e}const f=p.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==f._&&"dh_gen_retry"!==f._&&"dh_gen_fail"!==f._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+f._);if(!(0,Ps.Z)(e.nonce,f.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,f.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var c=yield s.Z.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw c}const l=yield s.Z.invokeCrypto("sha1",c),m=l.slice(0,8),g=l.slice(-8);switch(d.ZP&&this.log("Got Set_client_DH_params_answer",f._,c),f._){case"dh_gen_ok":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([1],m))).slice(-16);if(!(0,Ps.Z)(t,f.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,f),new Error("new_nonce_hash1 mismatch");const a=Us(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return d.ZP&&this.log("Auth successfull!",g,c,a),e.authKeyId=g,e.authKey=c,e.serverSalt=a,e}case"dh_gen_retry":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([2],m))).slice(-16);if(!(0,Ps.Z)(t,f.new_nonce_hash2))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch");return this.sendSetClientDhParams(e)}case"dh_gen_fail":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([3],m))).slice(-16);if(!(0,Ps.Z)(t,f.new_nonce_hash3))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch");throw new Error("[MT] Set_client_DH_params_answer fail")}}}))}getTransportType(){return this.getTransportTypePromise?this.getTransportTypePromise:this.getTransportTypePromise=Z.pingTransports().then((({websocket:e})=>{this.transportType=e?"websocket":"https",this.log("will use transport:",this.transportType)}))}auth(e){let t=this.cached[e];return t||(t=new Promise(((t,a)=>Ts(this,void 0,void 0,(function*(){let s;yield this.getTransportType();let n=1;for(;n++<=3;)try{const a={dcId:e,nonce:w(new Uint8Array(16))},s=this.sendReqPQ(a);return void t(yield s)}catch(e){s=e}a(s)})))),this.cached[e]=t)}}class Fs extends G{after(){this.lastMessageId=[0,0],this.timeOffset=0,qa.Z.get("server_time_offset").then((e=>{e&&(this.timeOffset=e)}))}getServerTimeOffset(){return this.timeOffset}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|(0,Te.d)(16)<<3|4];return(this.lastMessageId[0]>t[0]||this.lastMessageId[0]===t[0]&&this.lastMessageId[1]>=t[1])&&(t=[this.lastMessageId[0],this.lastMessageId[1]+4]),this.lastMessageId=t,rs(t[0],t[1]).toString(10)}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),s=Math.abs(this.timeOffset-a)>10;return this.lastMessageId=[0,0],this.timeOffset!==a&&(qa.Z.set({server_time_offset:a}),this.timeOffset=a),s}}class Rs{saveWebDocument(e){if(!e)return;const t=e.attributes.find((e=>"documentAttributeImageSize"===e._));return t&&(e.w=t.w,e.h=t.h),e}}class xs extends G{getInputInvoiceBySlug(e){return{_:"inputInvoiceSlug",slug:e}}getInputInvoiceByPeerId(e,t){return{_:"inputInvoiceMessage",peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}}getPaymentForm(e){return this.apiManager.invokeApi("payments.getPaymentForm",{invoice:e}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}getPaymentReceipt(e,t){return this.apiManager.invokeApi("payments.getPaymentReceipt",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}validateRequestedInfo(e,t,a){return this.apiManager.invokeApi("payments.validateRequestedInfo",{save:a,invoice:e,info:t})}sendPaymentForm(e,t,a,s,n,i){return this.apiManager.invokeApi("payments.sendPaymentForm",{form_id:t,invoice:e,requested_info_id:a,shipping_option_id:s,credentials:n,tip_amount:i||void 0}).then((e=>("payments.paymentResult"===e._&&this.apiUpdatesManager.processUpdateMessage(e.updates),e)))}clearSavedInfo(e,t){return this.apiManager.invokeApi("payments.clearSavedInfo",{info:e,credentials:t})}}var Bs=a(8794);class Vs extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{e?this.attachMenuBots=new Map:(this.attachMenuBots.clear(),this.attachMenuBotsArr=void 0)},this.onUpdateAttachMenuBots=e=>{this.clear(),this.getAttachMenuBots()}}after(){this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateAttachMenuBots:this.onUpdateAttachMenuBots})}saveAttachMenuBot(e){this.attachMenuBots.set(e.bot_id,e);const t=(0,Bs.Z)(e);return t.icon=this.appDocsManager.saveDoc(t.icon,{type:"attachMenuBotIcon",botId:e.bot_id}),e}saveAttachMenuBots(e){e.saved||(e.saved=!0,e.forEach((e=>this.saveAttachMenuBot(e))))}getAttachMenuBots(){var e;return null!==(e=this.attachMenuBotsArr)&&void 0!==e?e:this.apiManager.invokeApiSingleProcess({method:"messages.getAttachMenuBots",processResult:e=>((0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.saveAttachMenuBots(e.bots),this.attachMenuBotsArr=e.bots.slice(0,0))})}getAttachMenuBotCached(e){return this.attachMenuBots.get(e)}getAttachMenuBot(e,t){throw this.appUsersManager.isAttachMenuBot(e),(0,X.Z)("BOT_INVALID")}requestWebView(e){const{botId:t,peerId:a,url:s,fromBotMenu:n,themeParams:i,replyToMsgId:r,silent:o,sendAsPeerId:p,startParam:d,threadId:f}=e;return this.apiManager.invokeApiSingleProcess({method:"messages.requestWebView",params:{peer:this.appPeersManager.getInputPeerById(a),bot:this.appUsersManager.getUserInput(t),silent:o,platform:"web",url:s,reply_to_msg_id:r?(0,oe.Z)(r):void 0,from_bot_menu:n,theme_params:i,send_as:p?this.appPeersManager.getInputPeerById(p):void 0,start_param:d,top_msg_id:f?(0,oe.Z)(f):void 0},processResult:e=>(console.log(e),e)})}prolongWebView(e){return this.apiManager.invokeApiSingleProcess({method:"messages.prolongWebView",params:{peer:this.appPeersManager.getInputPeerById(e.peerId),bot:this.appUsersManager.getUserInput(e.botId),query_id:e.queryId,silent:e.silent,reply_to_msg_id:e.replyToMsgId?(0,oe.Z)(e.replyToMsgId):void 0,send_as:e.sendAsPeerId?this.appPeersManager.getInputPeerById(e.sendAsPeerId):void 0,top_msg_id:e.threadId?(0,oe.Z)(e.threadId):void 0},processResult:e=>{console.log(e)}})}}class Os extends G{requestUrlAuth(e,t,a,s){return this.apiManager.invokeApi("messages.requestUrlAuth",{button_id:s,msg_id:a?(0,oe.Z)(a):void 0,peer:t?this.appPeersManager.getInputPeerById(t):void 0,url:e}).then((e=>("urlAuthResultRequest"===e._&&this.appUsersManager.saveApiUser(e.bot),e)))}acceptUrlAuth(e,t,a,s,n){return this.apiManager.invokeApi("messages.acceptUrlAuth",{button_id:s,msg_id:a?(0,oe.Z)(a):void 0,peer:t?this.appPeersManager.getInputPeerById(t):void 0,url:e,write_allowed:n}).then((e=>e))}getWebAuthorizations(){return this.apiManager.invokeApi("account.getWebAuthorizations").then((e=>(this.appUsersManager.saveApiUsers(e.users),e.authorizations)))}resetWebAuthorization(e){return this.apiManager.invokeApi("account.resetWebAuthorization",{hash:e})}resetWebAuthorizations(){return this.apiManager.invokeApi("account.resetWebAuthorizations")}}const Ls=new class{constructor(){this.cryptoWorkersURLs=[],this.cryptoPortsAttached=0,this.cryptoPortPromise=(0,v.Z)(),this.cryptoPortPromise.then((()=>{this.cryptoPortPromise=void 0}))}start(){const e=f.Z.getInstance();e.addEventListener("manager",(({name:e,method:t,args:a})=>(0,q.Z)(this.getManagers(),(s=>{const n=s[e];return n[t].apply(n,a)})))),e.addEventListener("cryptoPort",((e,t,a)=>{var n;const i=a.ports[0];this.cryptoPortsAttached>=this.cryptoWorkersURLs.length?i.close():(++this.cryptoPortsAttached,s.Z.attachPort(i),null===(n=this.cryptoPortPromise)||void 0===n||n.resolve())})),e.addEventListener("createProxyWorkerURLs",(({originalUrl:e,blob:t})=>{let a=this.cryptoWorkersURLs.length;a||(this.cryptoWorkersURLs.push(e),++a);const s=_.Z.cryptoWorkers;if(a===s)return this.cryptoWorkersURLs;const n=new Array(s-a).fill(void 0).map((()=>URL.createObjectURL(t)));return this.cryptoWorkersURLs.push(...n),this.cryptoWorkersURLs}))}createManagers(){return e=this,t=void 0,n=function*(){const e=new $;yield Promise.all([e.loadStorages(),this.cryptoPortPromise]);const t=yield function(e,t){const a={appPeersManager:new fa,appChatsManager:new Be,appDocsManager:new ut,appPhotosManager:new ca,appPollsManager:new la,appUsersManager:new Aa,appWebPagesManager:new Ua,appDraftsManager:new _t,appProfileManager:new ua,appNotificationsManager:new na,apiUpdatesManager:new De,appAvatarsManager:new Ue,appGroupCallsManager:new St,appCallsManager:new Fe,appReactionsManager:new ba,appMessagesManager:new ta,appMessagesIdsManager:new Tt,appPrivacyManager:new ma,appInlineBotsManager:new Dt,appStickersManager:new Ca,referenceDatabase:new ee,appEmojiManager:new Mt,filtersStorage:new Ce,dialogsStorage:new _e,apiManager:new Ja,cryptoWorker:s.Z,passwordManager:new Q,apiFileManager:new ja,peersStorage:new Qa,thumbsStorage:new Xa,networkerFactory:new As,rootScope:new l,authorizer:new Es,dcConfigurator:new O,timeManager:new Fs,appStoragesManager:e,appStateManager:y,appWebDocsManager:new Rs,appPaymentsManager:new xs,appAttachMenuBotsManager:new Vs,appSeamlessLoginManager:new Os};for(const e in a){const t=a[e];t&&(t.setManagers&&(t.setManagers(a),delete t.setManagers),E.Z[e]=t)}const n=[];let i=Object.keys(a);i.unshift("appUsersManager","appChatsManager","appNotificationsManager","appMessagesManager","dialogsStorage"),i=(0,we.Z)(i);for(const e of i){const t=a[e];if(null==t?void 0:t.after){const e=t.after();n.push(e)}}return t&&a.apiManager.setUserAuth(t),Promise.all(n).then((()=>a))}(e,y.userId);return this.managers=t},new((a=void 0)||(a=Promise))((function(s,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((n=n.apply(e,t||[])).next())}));var e,t,a,n}getManagers(){var e;return null!==(e=this.managers)&&void 0!==e?e:this.managers=this.createManagers()}};d.GO&&(d.GO.appManagersManager=Ls);const Ns=Ls;var Zs=a(3655);let js,qs,Gs=!0;function Hs(){return Gs}function Ws(){return Gs?js:void 0}const zs=(0,I.kg)("MTPROTO"),Ks=new f.Z;Ks.addMultipleEventsListeners({environment:e=>{r(e),Z.waitForWebSocket()},crypto:({method:e,args:t})=>s.Z.invokeCrypto(e,...t),state:({state:e,resetStorages:t,pushedKeys:a,newVersion:s,oldVersion:n,userId:i})=>{zs("got state",e,a),y.userId=i,y.newVersion=s,y.oldVersion=n,Object.keys(e).forEach((t=>{y.pushToState(t,e[t],!0,!a.includes(t))})),j.resolve(t)},toggleStorages:({enabled:e,clearWrite:t})=>(0,za.Z)(e,t),event:(e,t)=>{zs("will redirect event",e,t),Ks.invokeExceptSource("event",e,t)},serviceWorkerOnline:e=>{Gs=e},serviceWorkerPort:(e,t,a)=>{js?(js.detachPort(qs),qs=void 0):(js=new Zs.Z,js.addMultipleEventsListeners({requestFilePart:e=>(0,q.Z)(Ns.getManagers(),(t=>{const{docId:a,dcId:s,offset:n,limit:i}=e;return t.appDocsManager.requestDocPart(a,s,n,i)}))})),(qs=a.ports[0])&&js.attachPort(qs)},createObjectURL:e=>URL.createObjectURL(e)}),zs("MTProto start"),Ns.start(),Ns.getManagers(),Gt.start(),function(e,t,a){const s=(a,s)=>{e.attachListenPort(a),s&&e.attachSendPort(s),null==t||t(a)};e.setOnPortDisconnect((e=>{Gt.deleteTab(e)})),"undefined"!=typeof SharedWorkerGlobalScope?E.Z.addEventListener("connect",(e=>s(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?s(E.Z,null):s(E.Z,E.Z)}(Ks,(e=>{Gt.addTab(e)}))},1507:(e,t,a)=>{a.d(t,{BP:()=>f,BX:()=>l,DZ:()=>h,Gu:()=>u,IA:()=>i,Iw:()=>p,J$:()=>m,NM:()=>s,Ox:()=>c,Pt:()=>d,Zi:()=>g,hj:()=>n,rU:()=>o,yF:()=>r});const s=0,n=1271266957,i=777,r=777e3,o=2147483647,p=20971520,d="",f="default_static",c=4295032831,l=new Set(["web","k","z"]),m=0,g=1,h=new Set([m,g]),u=Math.max(...Array.from(h))+1},2423:(e,t,a)=>{a.d(t,{$2:()=>l,E:()=>m,QB:()=>g,SC:()=>h,bu:()=>d,it:()=>p,kO:()=>y,tY:()=>u});var s=a(1229);const n="a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",i="0-9_"+n,r="["+n+"0-9]",o="((?:https?|ftp)://|mailto:)?",p=o+"(?:"+r+"{1,64}(?::"+r+"{0,64})?@)?(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|"+r+"["+n+"·0-9-]{0,64}(?:\\."+r+"["+n+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+n+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",d=(new RegExp("^"+o.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),f="[a-zA-Z\\d_]{5,32}",c="\\/([a-zA-Z\\d_]{1,32})(?:@("+f+"))?(\\b|$)",l=new RegExp("(^| )(@)("+f+")|("+p+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#["+i+"]{2,64})|(^|\\s)"+c,"i"),m=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,g=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,h={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},u=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in h)u.add(h[e]);const y=/^\+\d+$/},671:(e,t,a)=>{function s(e){return function(e){const t=[];let a=0,s=0,n=0;for(;n55296&&a<=56319?s=a:t.push(a.toString(16));return t.length&&2===t[0].length&&(t[0]="00"+t[0]),t}(r(e)).join("-")}a.d(t,{N0:()=>s});const n=/\uFE0F/g,i=String.fromCharCode(8205),r=e=>e.indexOf(i)<0?e.replace(n,""):e;new Map([["FT","🏴‍☠"]])}},s={};function n(e){var t=s[e];if(void 0!==t)return t.exports;var i=s[e]={id:e,loaded:!1,exports:{}};return a[e].call(i.exports,i,i.exports,n),i.loaded=!0,i.exports}n.m=a,n.x=()=>{var e=n.O(void 0,[699,211,539,85,946],(()=>n(1082)));return n.O(e)},e=[],n.O=(t,a,s,i)=>{if(!a){var r=1/0;for(f=0;f=i)&&Object.keys(n.O).every((e=>n.O[e](a[p])))?a.splice(p--,1):(o=!1,i0&&e[f-1][2]>i;f--)e[f]=e[f-1];e[f]=[a,s,i]},n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce(((t,a)=>(n.f[a](e,t),t)),[])),n.u=e=>85===e?"85.952a9f12a6b3dcdd3f0e.bundle.js":946===e?"946.0a86ee06cd8834179a6a.bundle.js":({211:"npm.big-integer",699:"npm.pako"}[e]||e)+"."+{8:"570e6da51a125009c156",104:"f1e35ff90b4ddd68a9d8",211:"780c206f3e1257ccad6a",301:"42dc636f96a62f6a08c8",539:"17a0b07b4e6476f19654",642:"fd1ade69544ad78671c6",699:"85f88e27b023cbb2ca51"}[e]+".chunk.js",n.miniCssF=e=>{},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var t=n.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var a=t.getElementsByTagName("script");a.length&&(e=a[a.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),(()=>{if(void 0!==n){var e=n.u,t=n.e,a={},s={};n.u=function(t){return e(t)+(a.hasOwnProperty(t)?"?"+a[t]:"")},n.e=function(i){return t(i).catch((function(t){var r=s.hasOwnProperty(i)?s[i]:999999;if(r<1){var o=e(i);throw t.message="Loading chunk "+i+" failed after 999999 retries.\n("+o+")",t.request=o,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();a[i]=t,s[i]=r-1,e(n.e(i))}),3e3)}))}))}}})(),(()=>{var e={678:1};n.f.i=(t,a)=>{e[t]||importScripts(n.p+n.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],a=t.push.bind(t);t.push=t=>{var[s,i,r]=t;for(var o in i)n.o(i,o)&&(n.m[o]=i[o]);for(r&&r(n);s.length;)e[s.pop()]=1;a(t)}})(),t=n.x,n.x=()=>Promise.all([699,211,539,85,946].map(n.e,n)).then(t),n.x()})(); -//# sourceMappingURL=mtproto.worker.5f4ea67830e476bd70ac.chunk.js.map \ No newline at end of file diff --git a/public/mtproto.worker.5f4ea67830e476bd70ac.chunk.js.map b/public/mtproto.worker.5f4ea67830e476bd70ac.chunk.js.map deleted file mode 100644 index c769bf0c..00000000 --- a/public/mtproto.worker.5f4ea67830e476bd70ac.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"mtproto.worker.5f4ea67830e476bd70ac.chunk.js","mappings":"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Ac,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,MAAO,kBAAkB,MAAO,QAAQ,MAAO,kBAAkB,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,wCAAwC,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,IAAK,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,iBAAiB,KAAM,iBAAiB,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/environment/utils.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/appManagers/appStateManager.ts","webpack://tweb/./src/helpers/object/setDeepProperty.ts","webpack://tweb/./src/lib/mtproto/transports/http.ts","webpack://tweb/./src/lib/mtproto/transports/websocket.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/lib/mtproto/transports/obfuscation.ts","webpack://tweb/./src/lib/mtproto/transports/abridged.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/lib/mtproto/transports/tcpObfuscated.ts","webpack://tweb/./src/lib/mtproto/dcConfigurator.ts","webpack://tweb/./src/lib/mtproto/transports/controller.ts","webpack://tweb/./src/lib/appManagers/utils/storages/resetStoragesPromise.ts","webpack://tweb/./src/lib/appManagers/manager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/loadStorages.ts","webpack://tweb/./src/lib/appManagers/appStoragesManager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/createStorages.ts","webpack://tweb/./src/lib/mtproto/passwordManager.ts","webpack://tweb/./src/lib/mtproto/referenceDatabase.ts","webpack://tweb/./src/helpers/object/safeReplaceObject.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getPeerIdsFromMessage.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/setDialogIndex.ts","webpack://tweb/./src/lib/storages/dialogs.ts","webpack://tweb/./src/lib/storages/filters.ts","webpack://tweb/./src/helpers/applyMixins.ts","webpack://tweb/./src/lib/appManagers/apiUpdatesManager.ts","webpack://tweb/./src/lib/appManagers/appAvatarsManager.ts","webpack://tweb/./src/lib/appManagers/appCallsManager.ts","webpack://tweb/./src/lib/appManagers/appChatsManager.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/object/safeReplaceArrayInObject.ts","webpack://tweb/./src/environment/mimeTypeMap.ts","webpack://tweb/./src/lib/appManagers/appDocsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentURL.ts","webpack://tweb/./src/lib/appManagers/appDraftsManager.ts","webpack://tweb/./src/lib/appManagers/appEmojiManager.ts","webpack://tweb/./src/lib/appManagers/appGroupCallsManager.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoInput.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoMediaInput.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentMediaInput.ts","webpack://tweb/./src/lib/appManagers/appInlineBotsManager.ts","webpack://tweb/./src/lib/appManagers/appMessagesIdsManager.ts","webpack://tweb/./src/helpers/string/splitStringByLength.ts","webpack://tweb/./src/lib/appManagers/appTabsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInput.ts","webpack://tweb/./src/helpers/object/setBooleanFlag.ts","webpack://tweb/./src/lib/appManagers/appMessagesManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInputFileName.ts","webpack://tweb/./src/helpers/string/convertInputKeyToKey.ts","webpack://tweb/./src/lib/appManagers/appNotificationsManager.ts","webpack://tweb/./src/lib/appManagers/appPeersManager.ts","webpack://tweb/./src/lib/appManagers/appPhotosManager.ts","webpack://tweb/./src/lib/appManagers/appPollsManager.ts","webpack://tweb/./src/lib/appManagers/appPrivacyManager.ts","webpack://tweb/./src/lib/appManagers/appProfileManager.ts","webpack://tweb/./src/helpers/callbackifyAll.ts","webpack://tweb/./src/lib/appManagers/appReactionsManager.ts","webpack://tweb/./src/lib/appManagers/appStickersManager.ts","webpack://tweb/./src/helpers/fixBase64String.ts","webpack://tweb/./src/lib/appManagers/appUsersManager.ts","webpack://tweb/./src/helpers/cleanUsername.ts","webpack://tweb/./src/lib/appManagers/appWebPagesManager.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/string/fileNameRFC.ts","webpack://tweb/./src/lib/files/downloadWriter.ts","webpack://tweb/./src/lib/files/downloadStorage.ts","webpack://tweb/./src/lib/mtproto/apiFileManager.ts","webpack://tweb/./src/helpers/fixFirefoxSvg.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/lib/mtproto/api_methods.ts","webpack://tweb/./src/lib/mtproto/apiManager.ts","webpack://tweb/./src/lib/storages/peers.ts","webpack://tweb/./src/lib/storages/thumbs.ts","webpack://tweb/./src/lib/mtproto/schema.ts","webpack://tweb/./src/helpers/number/intToUint.ts","webpack://tweb/./src/helpers/long/ulongFromInts.ts","webpack://tweb/./src/helpers/bigInt/bigIntConstants.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/lib/mtproto/tl_utils.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/lib/mtproto/networker.ts","webpack://tweb/./src/helpers/long/sortLongsArray.ts","webpack://tweb/./src/helpers/long/longToBytes.ts","webpack://tweb/./src/lib/mtproto/networkerFactory.ts","webpack://tweb/./src/lib/mtproto/rsaKeysManager.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/mtproto/authorizer.ts","webpack://tweb/./src/lib/mtproto/timeManager.ts","webpack://tweb/./src/lib/appManagers/appWebDocsManager.ts","webpack://tweb/./src/lib/appManagers/appPaymentsManager.ts","webpack://tweb/./src/lib/appManagers/appAttachMenuBotsManager.ts","webpack://tweb/./src/lib/appManagers/appSeamlessLoginManager.ts","webpack://tweb/./src/lib/appManagers/appManagersManager.ts","webpack://tweb/./src/lib/appManagers/createManagers.ts","webpack://tweb/./src/lib/mtproto/mtproto.worker.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,539,85,946].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\n\nexport const EmojiVersions: {[version in EMOJI_VERSION]: {[emoji: string]: number}} = {'14':{'1f6dd':4867, '1f6de':4916, '1f6df':4923, '1f7f0':62832, '1f979':183, '1f9cc':1557, '1fa7b':61332, '1fa7c':61330, '1faa9':51093, '1faaa':61364, '1faab':61189, '1faac':51085, '1fab7':2651, '1fab8':2631, '1fab9':2672, '1faba':2673, '1fac3':1520, '1fac4':1521, '1fac5':1505, '1fad7':3793, '1fad8':3707, '1fad9':3804, '1fae0':111, '1fae1':136, '1fae2':132, '1fae3':133, '1fae4':174, '1fae5':142, '1fae6':1385, '1fae7':61353, '1faf0':1341, '1faf1':1332, '1faf2':1333, '1faf3':1334, '1faf4':1335, '1faf5':1351, '1faf6':1360, '1faf1-1f3fb-200d-1faf2-1f3fc':0, '1faf1-1f3fb-200d-1faf2-1f3fd':0, '1faf1-1f3fb-200d-1faf2-1f3fe':0, '1faf1-1f3fb-200d-1faf2-1f3ff':0, '1faf1-1f3fc-200d-1faf2-1f3fb':0, '1faf1-1f3fc-200d-1faf2-1f3fd':0, '1faf1-1f3fc-200d-1faf2-1f3fe':0, '1faf1-1f3fc-200d-1faf2-1f3ff':0, '1faf1-1f3fd-200d-1faf2-1f3fb':0, '1faf1-1f3fd-200d-1faf2-1f3fc':0, '1faf1-1f3fd-200d-1faf2-1f3fe':0, '1faf1-1f3fd-200d-1faf2-1f3ff':0, '1faf1-1f3fe-200d-1faf2-1f3fb':0, '1faf1-1f3fe-200d-1faf2-1f3fc':0, '1faf1-1f3fe-200d-1faf2-1f3fd':0, '1faf1-1f3fe-200d-1faf2-1f3ff':0, '1faf1-1f3ff-200d-1faf2-1f3fb':0, '1faf1-1f3ff-200d-1faf2-1f3fc':0, '1faf1-1f3ff-200d-1faf2-1f3fd':0, '1faf1-1f3ff-200d-1faf2-1f3fe':0, '1fac3-1f3fb':0, '1fac3-1f3fc':0, '1fac3-1f3fd':0, '1fac3-1f3fe':0, '1fac3-1f3ff':0, '1fac4-1f3fb':0, '1fac4-1f3fc':0, '1fac4-1f3fd':0, '1fac4-1f3fe':0, '1fac4-1f3ff':0, '1fac5-1f3fb':0, '1fac5-1f3fc':0, '1fac5-1f3fd':0, '1fac5-1f3fe':0, '1fac5-1f3ff':0, '1faf0-1f3fb':0, '1faf0-1f3fc':0, '1faf0-1f3fd':0, '1faf0-1f3fe':0, '1faf0-1f3ff':0, '1faf1-1f3fb':0, '1faf1-1f3fc':0, '1faf1-1f3fd':0, '1faf1-1f3fe':0, '1faf1-1f3ff':0, '1faf2-1f3fb':0, '1faf2-1f3fc':0, '1faf2-1f3fd':0, '1faf2-1f3fe':0, '1faf2-1f3ff':0, '1faf3-1f3fb':0, '1faf3-1f3fc':0, '1faf3-1f3fd':0, '1faf3-1f3fe':0, '1faf3-1f3ff':0, '1faf4-1f3fb':0, '1faf4-1f3fc':0, '1faf4-1f3fd':0, '1faf4-1f3fe':0, '1faf4-1f3ff':0, '1faf5-1f3fb':0, '1faf5-1f3fc':0, '1faf5-1f3fd':0, '1faf5-1f3fe':0, '1faf5-1f3ff':0, '1faf6-1f3fb':0, '1faf6-1f3fc':0, '1faf6-1f3fd':0, '1faf6-1f3fe':0, '1faf6-1f3ff':0}, '':{'2049':62835, '2122':62863, '2139':62888, '2194':62764, '2195':62763, '2196':62762, '2197':62756, '2198':62758, '2199':62760, '2328':61194, '2600':4990, '2601':4998, '2602':41013, '2603':41018, '2604':41020, '2611':62851, '2614':41014, '2615':3781, '2618':2667, '2620':1106, '2622':62753, '2623':62754, '2626':62783, '2638':62780, '2639':177, '2648':62788, '2649':62789, '2650':62796, '2651':62797, '2652':62798, '2653':62799, '2660':51095, '2663':51098, '2665':51096, '2666':51097, '2668':4865, '2692':61297, '2693':4922, '2694':61300, '2696':61311, '2697':61319, '2699':61309, '2702':61284, '2705':62850, '2708':4931, '2709':61245, '2712':61259, '2714':62852, '2716':62828, '2721':62779, '2728':51029, '2733':62858, '2734':62859, '2744':41017, '2747':62860, '2753':62836, '2754':62837, '2755':62838, '2757':62839, '2763':1137, '2764':1141, '2795':62829, '2796':62830, '2797':62831, '2934':62767, '2935':62768, '3030':62840, '3297':62912, '3299':62913, '0023-20e3':62864, '002a-20e3':62865, '0030-20e3':62866, '0031-20e3':62867, '0032-20e3':62868, '0033-20e3':62869, '0034-20e3':62870, '0035-20e3':62871, '0036-20e3':62872, '0037-20e3':62873, '0038-20e3':62874, '0039-20e3':62875, '00a9':62861, '00ae':62862, '1f004':51101, '1f0cf':51100, '1f170':62882, '1f171':62884, '1f17e':62893, '1f17f':62895, '1f18e':62883, '1f191':62885, '1f192':62886, '1f193':62887, '1f194':62889, '1f195':62891, '1f196':62892, '1f197':62894, '1f198':62896, '1f199':62897, '1f19a':62898, '1f1e6-1f1e8':71594, '1f1e6-1f1e9':71595, '1f1e6-1f1ea':71596, '1f1e6-1f1eb':71597, '1f1e6-1f1ec':71598, '1f1e6-1f1ee':71599, '1f1e6-1f1f1':71600, '1f1e6-1f1f2':71601, '1f1e6-1f1f4':71602, '1f1e6-1f1f6':71603, '1f1e6-1f1f7':71604, '1f1e6-1f1f8':71605, '1f1e6-1f1f9':71606, '1f1e6-1f1fa':71607, '1f1e6-1f1fc':71608, '1f1e6-1f1fd':71609, '1f1e6-1f1ff':71610, '1f1e7-1f1e6':71611, '1f1e7-1f1e7':71612, '1f1e7-1f1e9':71613, '1f1e7-1f1ea':71614, '1f1e7-1f1eb':71615, '1f1e7-1f1ec':71616, '1f1e7-1f1ed':71617, '1f1e7-1f1ee':71618, '1f1e7-1f1ef':71619, '1f1e7-1f1f1':71620, '1f1e7-1f1f2':71621, '1f1e7-1f1f3':71622, '1f1e7-1f1f4':71623, '1f1e7-1f1f6':71624, '1f1e7-1f1f7':71625, '1f1e7-1f1f8':71626, '1f1e7-1f1f9':71627, '1f1e7-1f1fb':71628, '1f1e7-1f1fc':71629, '1f1e7-1f1fe':71630, '1f1e7-1f1ff':71631, '1f1e8-1f1e6':71632, '1f1e8-1f1e8':71633, '1f1e8-1f1e9':71634, '1f1e8-1f1eb':71635, '1f1e8-1f1ec':71636, '1f1e8-1f1ed':71637, '1f1e8-1f1ee':71638, '1f1e8-1f1f0':71639, '1f1e8-1f1f1':71640, '1f1e8-1f1f2':71641, '1f1e8-1f1f3':71642, '1f1e8-1f1f4':71643, '1f1e8-1f1f5':71644, '1f1e8-1f1f7':71645, '1f1e8-1f1fa':71646, '1f1e8-1f1fb':71647, '1f1e8-1f1fc':71648, '1f1e8-1f1fd':71649, '1f1e8-1f1fe':71650, '1f1e8-1f1ff':71651, '1f1e9-1f1ea':71652, '1f1e9-1f1ec':71653, '1f1e9-1f1ef':71654, '1f1e9-1f1f0':71655, '1f1e9-1f1f2':71656, '1f1e9-1f1f4':71657, '1f1e9-1f1ff':71658, '1f1ea-1f1e6':71659, '1f1ea-1f1e8':71660, '1f1ea-1f1ea':71661, '1f1ea-1f1ec':71662, '1f1ea-1f1ed':71663, '1f1ea-1f1f7':71664, '1f1ea-1f1f8':71665, '1f1ea-1f1f9':71666, '1f1ea-1f1fa':71667, '1f1eb-1f1ee':71668, '1f1eb-1f1ef':71669, '1f1eb-1f1f0':71670, '1f1eb-1f1f2':71671, '1f1eb-1f1f4':71672, '1f1eb-1f1f7':71673, '1f1ec-1f1e6':71674, '1f1ec-1f1e7':71675, '1f1ec-1f1e9':71676, '1f1ec-1f1ea':71677, '1f1ec-1f1eb':71678, '1f1ec-1f1ec':71679, '1f1ec-1f1ed':71680, '1f1ec-1f1ee':71681, '1f1ec-1f1f1':71682, '1f1ec-1f1f2':71683, '1f1ec-1f1f3':71684, '1f1ec-1f1f5':71685, '1f1ec-1f1f6':71686, '1f1ec-1f1f7':71687, '1f1ec-1f1f8':71688, '1f1ec-1f1f9':71689, '1f1ec-1f1fa':71690, '1f1ec-1f1fc':71691, '1f1ec-1f1fe':71692, '1f1ed-1f1f0':71693, '1f1ed-1f1f2':71694, '1f1ed-1f1f3':71695, '1f1ed-1f1f7':71696, '1f1ed-1f1f9':71697, '1f1ed-1f1fa':71698, '1f1ee-1f1e8':71699, '1f1ee-1f1e9':71700, '1f1ee-1f1ea':71701, '1f1ee-1f1f1':71702, '1f1ee-1f1f2':71703, '1f1ee-1f1f3':71704, '1f1ee-1f1f4':71705, '1f1ee-1f1f6':71706, '1f1ee-1f1f7':71707, '1f1ee-1f1f8':71708, '1f1ee-1f1f9':71709, '1f1ef-1f1ea':71710, '1f1ef-1f1f2':71711, '1f1ef-1f1f4':71712, '1f1ef-1f1f5':71713, '1f1f0-1f1ea':71714, '1f1f0-1f1ec':71715, '1f1f0-1f1ed':71716, '1f1f0-1f1ee':71717, '1f1f0-1f1f2':71718, '1f1f0-1f1f3':71719, '1f1f0-1f1f5':71720, '1f1f0-1f1f7':71721, '1f1f0-1f1fc':71722, '1f1f0-1f1fe':71723, '1f1f0-1f1ff':71724, '1f1f1-1f1e6':71725, '1f1f1-1f1e7':71726, '1f1f1-1f1e8':71727, '1f1f1-1f1ee':71728, '1f1f1-1f1f0':71729, '1f1f1-1f1f7':71730, '1f1f1-1f1f8':71731, '1f1f1-1f1f9':71732, '1f1f1-1f1fa':71733, '1f1f1-1f1fb':71734, '1f1f1-1f1fe':71735, '1f1f2-1f1e6':71736, '1f1f2-1f1e8':71737, '1f1f2-1f1e9':71738, '1f1f2-1f1ea':71739, '1f1f2-1f1eb':71740, '1f1f2-1f1ec':71741, '1f1f2-1f1ed':71742, '1f1f2-1f1f0':71743, '1f1f2-1f1f1':71744, '1f1f2-1f1f2':71745, '1f1f2-1f1f3':71746, '1f1f2-1f1f4':71747, '1f1f2-1f1f5':71748, '1f1f2-1f1f6':71749, '1f1f2-1f1f7':71750, '1f1f2-1f1f8':71751, '1f1f2-1f1f9':71752, '1f1f2-1f1fa':71753, '1f1f2-1f1fb':71754, '1f1f2-1f1fc':71755, '1f1f2-1f1fd':71756, '1f1f2-1f1fe':71757, '1f1f2-1f1ff':71758, '1f1f3-1f1e6':71759, '1f1f3-1f1e8':71760, '1f1f3-1f1ea':71761, '1f1f3-1f1eb':71762, '1f1f3-1f1ec':71763, '1f1f3-1f1ee':71764, '1f1f3-1f1f1':71765, '1f1f3-1f1f4':71766, '1f1f3-1f1f5':71767, '1f1f3-1f1f7':71768, '1f1f3-1f1fa':71769, '1f1f3-1f1ff':71770, '1f1f4-1f1f2':71771, '1f1f5-1f1e6':71772, '1f1f5-1f1ea':71773, '1f1f5-1f1eb':71774, '1f1f5-1f1ec':71775, '1f1f5-1f1ed':71776, '1f1f5-1f1f0':71777, '1f1f5-1f1f1':71778, '1f1f5-1f1f2':71779, '1f1f5-1f1f3':71780, '1f1f5-1f1f7':71781, '1f1f5-1f1f8':71782, '1f1f5-1f1f9':71783, '1f1f5-1f1fc':71784, '1f1f5-1f1fe':71785, '1f1f6-1f1e6':71786, '1f1f7-1f1ea':71787, '1f1f7-1f1f4':71788, '1f1f7-1f1f8':71789, '1f1f7-1f1fa':71790, '1f1f7-1f1fc':71791, '1f1f8-1f1e6':71792, '1f1f8-1f1e7':71793, '1f1f8-1f1e8':71794, '1f1f8-1f1e9':71795, '1f1f8-1f1ea':71796, '1f1f8-1f1ec':71797, '1f1f8-1f1ed':71798, '1f1f8-1f1ee':71799, '1f1f8-1f1ef':71800, '1f1f8-1f1f0':71801, '1f1f8-1f1f1':71802, '1f1f8-1f1f2':71803, '1f1f8-1f1f3':71804, '1f1f8-1f1f4':71805, '1f1f8-1f1f7':71806, '1f1f8-1f1f8':71807, '1f1f8-1f1f9':71808, '1f1f8-1f1fb':71809, '1f1f8-1f1fd':71810, '1f1f8-1f1fe':71811, '1f1f8-1f1ff':71812, '1f1f9-1f1e6':71813, '1f1f9-1f1e8':71814, '1f1f9-1f1e9':71815, '1f1f9-1f1eb':71816, '1f1f9-1f1ec':71817, '1f1f9-1f1ed':71818, '1f1f9-1f1ef':71819, '1f1f9-1f1f0':71820, '1f1f9-1f1f1':71821, '1f1f9-1f1f2':71822, '1f1f9-1f1f3':71823, '1f1f9-1f1f4':71824, '1f1f9-1f1f7':71825, '1f1f9-1f1f9':71826, '1f1f9-1f1fb':71827, '1f1f9-1f1fc':71828, '1f1f9-1f1ff':71829, '1f1fa-1f1e6':71830, '1f1fa-1f1ec':71831, '1f1fa-1f1f2':71832, '1f1fa-1f1f3':71833, '1f1fa-1f1f8':71834, '1f1fa-1f1fe':71835, '1f1fa-1f1ff':71836, '1f1fb-1f1e6':71837, '1f1fb-1f1e8':71838, '1f1fb-1f1ea':71839, '1f1fb-1f1ec':71840, '1f1fb-1f1ee':71841, '1f1fb-1f1f3':71842, '1f1fb-1f1fa':71843, '1f1fc-1f1eb':71844, '1f1fc-1f1f8':71845, '1f1fd-1f1f0':71846, '1f1fe-1f1ea':71847, '1f1fe-1f1f9':71848, '1f1ff-1f1e6':71849, '1f1ff-1f1f2':71850, '1f1ff-1f1fc':71851, '1f201':62899, '1f202':62900, '1f21a':62906, '1f22f':62903, '1f232':62907, '1f233':62911, '1f234':62910, '1f235':62915, '1f236':62902, '1f237':62901, '1f238':62909, '1f239':62905, '1f23a':62914, '1f250':62904, '1f251':62908, '1f300':41010, '1f301':4857, '1f302':41012, '1f303':4858, '1f304':4860, '1f305':4861, '1f306':4862, '1f307':4863, '1f308':41011, '1f309':4864, '1f30a':41023, '1f30b':4815, '1f30c':4997, '1f30d':4806, '1f30e':4807, '1f30f':4808, '1f310':4809, '1f311':4977, '1f312':4978, '1f313':4979, '1f314':4980, '1f315':4981, '1f316':4982, '1f317':4983, '1f318':4984, '1f319':4985, '1f31a':4986, '1f31b':4987, '1f31c':4988, '1f31d':4991, '1f31e':4992, '1f31f':4995, '1f320':4996, '1f321':4989, '1f324':41001, '1f325':41002, '1f326':41003, '1f327':41004, '1f328':41005, '1f329':41006, '1f32a':41007, '1f32b':41008, '1f32c':41009, '1f32d':3725, '1f32e':3727, '1f32f':3728, '1f330':3708, '1f331':2659, '1f332':2661, '1f333':2662, '1f334':2663, '1f335':2664, '1f336':3698, '1f337':2658, '1f338':2649, '1f339':2653, '1f33a':2655, '1f33b':2656, '1f33c':2657, '1f33d':3697, '1f33e':2665, '1f33f':2666, '1f340':2668, '1f341':2669, '1f342':2670, '1f343':2671, '1f344':3705, '1f345':3690, '1f346':3694, '1f347':3674, '1f348':3675, '1f349':3676, '1f34a':3677, '1f34b':3678, '1f34c':3679, '1f34d':3680, '1f34e':3682, '1f34f':3683, '1f350':3684, '1f351':3685, '1f352':3686, '1f353':3687, '1f354':3722, '1f355':3724, '1f356':3718, '1f357':3719, '1f358':3744, '1f359':3745, '1f35a':3746, '1f35b':3747, '1f35c':3748, '1f35d':3749, '1f35e':3709, '1f35f':3723, '1f360':3750, '1f361':3756, '1f362':3751, '1f363':3752, '1f364':3753, '1f365':3754, '1f366':3765, '1f367':3766, '1f368':3767, '1f369':3768, '1f36a':3769, '1f36b':3774, '1f36c':3775, '1f36d':3776, '1f36e':3777, '1f36f':3778, '1f370':3771, '1f371':3743, '1f372':3735, '1f373':3733, '1f374':3801, '1f375':3783, '1f376':3784, '1f377':3786, '1f378':3787, '1f379':3788, '1f37a':3789, '1f37b':3790, '1f37c':3779, '1f37d':3800, '1f37e':3785, '1f37f':3739, '1f380':51040, '1f381':51041, '1f382':3770, '1f383':51024, '1f384':51025, '1f385':1527, '1f386':51026, '1f387':51027, '1f388':51030, '1f389':51031, '1f38a':51032, '1f38b':51033, '1f38c':71588, '1f38d':51034, '1f38e':51035, '1f38f':51036, '1f390':51037, '1f391':51038, '1f392':61134, '1f393':61147, '1f396':51045, '1f397':51042, '1f399':61167, '1f39a':61168, '1f39b':61169, '1f39e':61203, '1f39f':51043, '1f3a0':4866, '1f3a1':4868, '1f3a2':4869, '1f3a3':51072, '1f3a4':61170, '1f3a5':61202, '1f3a6':62819, '1f3a7':61171, '1f3a8':51105, '1f3a9':61146, '1f3aa':4871, '1f3ab':51044, '1f3ac':61205, '1f3ad':51103, '1f3ae':51086, '1f3af':51078, '1f3b0':51088, '1f3b1':51081, '1f3b2':51089, '1f3b3':51060, '1f3b4':51102, '1f3b5':61165, '1f3b6':61166, '1f3b7':61173, '1f3b8':61175, '1f3b9':61176, '1f3ba':61177, '1f3bb':61178, '1f3bc':61164, '1f3bd':51074, '1f3be':51058, '1f3bf':51075, '1f3c0':51054, '1f3c1':71586, '1f3c2':1600, '1f3c3-200d-2640':1584, '1f3c3-200d-2642':1583, '1f3c3':1582, '1f3c4-200d-2640':1606, '1f3c4-200d-2642':1605, '1f3c4':1604, '1f3c5':51047, '1f3c6':51046, '1f3c7':1598, '1f3c8':51056, '1f3c9':51057, '1f3ca-200d-2640':1612, '1f3ca-200d-2642':1611, '1f3ca':1610, '1f3cb-200d-2640':1618, '1f3cb-200d-2642':1617, '1f3cb':1616, '1f3cc-200d-2640':1603, '1f3cc-200d-2642':1602, '1f3cc':1601, '1f3cd':4902, '1f3ce':4901, '1f3cf':51061, '1f3d0':51055, '1f3d1':51062, '1f3d2':51063, '1f3d3':51065, '1f3d4':4813, '1f3d5':4817, '1f3d6':4818, '1f3d7':4824, '1f3d8':4829, '1f3d9':4859, '1f3da':4830, '1f3db':4823, '1f3dc':4819, '1f3dd':4820, '1f3de':4821, '1f3df':4822, '1f3e0':4831, '1f3e1':4832, '1f3e2':4833, '1f3e3':4834, '1f3e4':4835, '1f3e5':4836, '1f3e6':4837, '1f3e7':62729, '1f3e8':4838, '1f3e9':4839, '1f3ea':4840, '1f3eb':4841, '1f3ec':4842, '1f3ed':4843, '1f3ee':61216, '1f3ef':4844, '1f3f0':4845, '1f3f3-200d-1f308':71591, '1f3f3-200d-26a7':71592, '1f3f3':71590, '1f3f4-200d-2620':71593, '1f3f4-e0067-e0062-e0065-e006e-e0067-e007f':71852, '1f3f4-e0067-e0062-e0073-e0063-e0074-e007f':71853, '1f3f4-e0067-e0062-e0077-e006c-e0073-e007f':71854, '1f3f4':71589, '1f3f5':2652, '1f3f7':61234, '1f3f8':51066, '1f3f9':61303, '1f3fa':3805, '1f3fb':9525, '1f3fc':9526, '1f3fd':9527, '1f3fe':9528, '1f3ff':9529, '1f400':2576, '1f401':2575, '1f402':2556, '1f403':2557, '1f404':2558, '1f405':2547, '1f406':2548, '1f407':2579, '1f408-200d-2b1b':2544, '1f408':2543, '1f409':2618, '1f40a':2613, '1f40b':2622, '1f40c':2632, '1f40d':2616, '1f40e':2550, '1f40f':2563, '1f410':2565, '1f411':2564, '1f412':2531, '1f413':2596, '1f414':2595, '1f415-200d-1f9ba':2537, '1f415':2535, '1f416':2560, '1f417':2561, '1f418':2570, '1f419':2629, '1f41a':2630, '1f41b':2634, '1f41c':2635, '1f41d':2636, '1f41e':2638, '1f41f':2625, '1f420':2626, '1f421':2627, '1f422':2614, '1f423':2597, '1f424':2598, '1f425':2599, '1f426':2600, '1f427':2601, '1f428':2586, '1f429':2538, '1f42a':2566, '1f42b':2567, '1f42c':2623, '1f42d':2574, '1f42e':2555, '1f42f':2546, '1f430':2578, '1f431':2542, '1f432':2617, '1f433':2621, '1f434':2549, '1f435':2530, '1f436':2534, '1f437':2559, '1f438':2612, '1f439':2577, '1f43a':2539, '1f43b-200d-2744':2585, '1f43b':2584, '1f43c':2587, '1f43d':2562, '1f43e':2593, '1f43f':2580, '1f440':1381, '1f441-200d-1f5e8':1159, '1f441':1382, '1f442':1373, '1f443':1375, '1f444':1384, '1f445':1383, '1f446':1347, '1f447':1349, '1f448':1345, '1f449':1346, '1f44a':1355, '1f44b':1327, '1f44c':1336, '1f44d':1352, '1f44e':1353, '1f44f':1358, '1f450':1361, '1f451':61144, '1f452':61145, '1f453':61110, '1f454':61115, '1f455':61116, '1f456':61117, '1f457':61122, '1f458':61123, '1f459':61128, '1f45a':61129, '1f45b':61130, '1f45c':61131, '1f45d':61132, '1f45e':61136, '1f45f':61137, '1f460':61140, '1f461':61141, '1f462':61143, '1f463':1687, '1f464':1684, '1f465':1685, '1f466':1388, '1f467':1389, '1f468-200d-1f33e':1457, '1f468-200d-1f373':1460, '1f468-200d-1f37c':1524, '1f468-200d-1f393':1448, '1f468-200d-1f3a4':1478, '1f468-200d-1f3a8':1481, '1f468-200d-1f3eb':1451, '1f468-200d-1f3ed':1466, '1f468-200d-1f466-200d-1f466':1674, '1f468-200d-1f466':1673, '1f468-200d-1f467-200d-1f466':1676, '1f468-200d-1f467-200d-1f467':1677, '1f468-200d-1f467':1675, '1f468-200d-1f468-200d-1f466':1663, '1f468-200d-1f468-200d-1f466-200d-1f466':1666, '1f468-200d-1f468-200d-1f467':1664, '1f468-200d-1f468-200d-1f467-200d-1f466':1665, '1f468-200d-1f468-200d-1f467-200d-1f467':1667, '1f468-200d-1f469-200d-1f466':1658, '1f468-200d-1f469-200d-1f466-200d-1f466':1661, '1f468-200d-1f469-200d-1f467':1659, '1f468-200d-1f469-200d-1f467-200d-1f466':1660, '1f468-200d-1f469-200d-1f467-200d-1f467':1662, '1f468-200d-1f4bb':1475, '1f468-200d-1f4bc':1469, '1f468-200d-1f527':1463, '1f468-200d-1f52c':1472, '1f468-200d-1f680':1487, '1f468-200d-1f692':1490, '1f468-200d-1f9af':1574, '1f468-200d-1f9b0':1396, '1f468-200d-1f9b1':1397, '1f468-200d-1f9b2':1399, '1f468-200d-1f9b3':1398, '1f468-200d-1f9bc':1577, '1f468-200d-1f9bd':1580, '1f468-200d-2695':1445, '1f468-200d-2696':1454, '1f468-200d-2708':1484, '1f468-200d-2764-200d-1f468':1655, '1f468-200d-2764-200d-1f48b-200d-1f468':1651, '1f468':1392, '1f469-200d-1f33e':1458, '1f469-200d-1f373':1461, '1f469-200d-1f37c':1523, '1f469-200d-1f393':1449, '1f469-200d-1f3a4':1479, '1f469-200d-1f3a8':1482, '1f469-200d-1f3eb':1452, '1f469-200d-1f3ed':1467, '1f469-200d-1f466-200d-1f466':1679, '1f469-200d-1f466':1678, '1f469-200d-1f467-200d-1f466':1681, '1f469-200d-1f467-200d-1f467':1682, '1f469-200d-1f467':1680, '1f469-200d-1f469-200d-1f466':1668, '1f469-200d-1f469-200d-1f466-200d-1f466':1671, '1f469-200d-1f469-200d-1f467':1669, '1f469-200d-1f469-200d-1f467-200d-1f466':1670, '1f469-200d-1f469-200d-1f467-200d-1f467':1672, '1f469-200d-1f4bb':1476, '1f469-200d-1f4bc':1470, '1f469-200d-1f527':1464, '1f469-200d-1f52c':1473, '1f469-200d-1f680':1488, '1f469-200d-1f692':1491, '1f469-200d-1f9af':1575, '1f469-200d-1f9b0':1401, '1f469-200d-1f9b1':1403, '1f469-200d-1f9b2':1407, '1f469-200d-1f9b3':1405, '1f469-200d-1f9bc':1578, '1f469-200d-1f9bd':1581, '1f469-200d-2695':1446, '1f469-200d-2696':1455, '1f469-200d-2708':1485, '1f469-200d-2764-200d-1f468':1654, '1f469-200d-2764-200d-1f469':1656, '1f469-200d-2764-200d-1f48b-200d-1f468':1650, '1f469-200d-2764-200d-1f48b-200d-1f469':1652, '1f469':1400, '1f46a':1657, '1f46b':1647, '1f46c':1648, '1f46d':1646, '1f46e-200d-2640':1494, '1f46e-200d-2642':1493, '1f46e':1492, '1f46f-200d-2640':1590, '1f46f-200d-2642':1589, '1f46f':1588, '1f470-200d-2640':1518, '1f470-200d-2642':1517, '1f470':1516, '1f471-200d-2640':1409, '1f471-200d-2642':1410, '1f471':1391, '1f472':1511, '1f473-200d-2640':1510, '1f473-200d-2642':1509, '1f473':1508, '1f474':1412, '1f475':1413, '1f476':1386, '1f477-200d-2640':1504, '1f477-200d-2642':1503, '1f477':1502, '1f478':1507, '1f479':1109, '1f47a':1110, '1f47b':1111, '1f47c':1526, '1f47d':1112, '1f47e':1113, '1f47f':1104, '1f480':1105, '1f481-200d-2640':1428, '1f481-200d-2642':1427, '1f481':1426, '1f482-200d-2640':1500, '1f482-200d-2642':1499, '1f482':1498, '1f483':1585, '1f484':61152, '1f485':1366, '1f486-200d-2640':1560, '1f486-200d-2642':1559, '1f486':1558, '1f487-200d-2640':1563, '1f487-200d-2642':1562, '1f487':1561, '1f488':4870, '1f489':61326, '1f48a':61328, '1f48b':1127, '1f48c':1128, '1f48d':61153, '1f48e':61154, '1f48f':1649, '1f490':2648, '1f491':1653, '1f492':4846, '1f493':1133, '1f494':1138, '1f495':1135, '1f496':1131, '1f497':1132, '1f498':1129, '1f499':1145, '1f49a':1144, '1f49b':1143, '1f49c':1146, '1f49d':1130, '1f49e':1134, '1f49f':1136, '1f4a0':62946, '1f4a1':61214, '1f4a2':1151, '1f4a3':1157, '1f4a4':1163, '1f4a5':1152, '1f4a6':1154, '1f4a7':41022, '1f4a8':1155, '1f4a9':1107, '1f4aa':1368, '1f4ab':1153, '1f4ac':1158, '1f4ad':1162, '1f4ae':2650, '1f4af':1150, '1f4b0':61235, '1f4b1':62841, '1f4b2':62842, '1f4b3':61242, '1f4b4':61237, '1f4b5':61238, '1f4b6':61239, '1f4b7':61240, '1f4b8':61241, '1f4b9':61244, '1f4ba':4936, '1f4bb':61191, '1f4bc':61265, '1f4bd':61197, '1f4be':61198, '1f4bf':61199, '1f4c0':61200, '1f4c1':61266, '1f4c2':61267, '1f4c3':61227, '1f4c4':61229, '1f4c5':61269, '1f4c6':61270, '1f4c7':61273, '1f4c8':61274, '1f4c9':61275, '1f4ca':61276, '1f4cb':61277, '1f4cc':61278, '1f4cd':61279, '1f4ce':61280, '1f4cf':61282, '1f4d0':61283, '1f4d1':61232, '1f4d2':61226, '1f4d3':61225, '1f4d4':61218, '1f4d5':61219, '1f4d6':61220, '1f4d7':61221, '1f4d8':61222, '1f4d9':61223, '1f4da':61224, '1f4db':62847, '1f4dc':61228, '1f4dd':61264, '1f4de':61185, '1f4df':61186, '1f4e0':61187, '1f4e1':61325, '1f4e2':61159, '1f4e3':61160, '1f4e4':61249, '1f4e5':61250, '1f4e6':61251, '1f4e7':61246, '1f4e8':61247, '1f4e9':61248, '1f4ea':61253, '1f4eb':61252, '1f4ec':61254, '1f4ed':61255, '1f4ee':61256, '1f4ef':61161, '1f4f0':61230, '1f4f1':61182, '1f4f2':61183, '1f4f3':62823, '1f4f4':62824, '1f4f5':62751, '1f4f6':62822, '1f4f7':61207, '1f4f8':61208, '1f4f9':61209, '1f4fa':61206, '1f4fb':61172, '1f4fc':61210, '1f4fd':61204, '1f4ff':61151, '1f500':62801, '1f501':62802, '1f502':62803, '1f503':62769, '1f504':62770, '1f505':62820, '1f506':62821, '1f507':61155, '1f508':61156, '1f509':61157, '1f50a':61158, '1f50b':61188, '1f50c':61190, '1f50d':61211, '1f50e':61212, '1f50f':61290, '1f510':61291, '1f511':61292, '1f512':61288, '1f513':61289, '1f514':61162, '1f515':61163, '1f516':61233, '1f517':61313, '1f518':62947, '1f519':62771, '1f51a':62772, '1f51b':62773, '1f51c':62774, '1f51d':62775, '1f51e':62752, '1f51f':62876, '1f520':62877, '1f521':62878, '1f522':62879, '1f523':62880, '1f524':62881, '1f525':41021, '1f526':61215, '1f527':61306, '1f528':61294, '1f529':61308, '1f52a':3803, '1f52b':61301, '1f52c':61323, '1f52d':61324, '1f52e':51082, '1f52f':62787, '1f530':62848, '1f531':62846, '1f532':62949, '1f533':62948, '1f534':62916, '1f535':62920, '1f536':62940, '1f537':62941, '1f538':62942, '1f539':62943, '1f53a':62944, '1f53b':62945, '1f53c':62811, '1f53d':62813, '1f549':62778, '1f54a':2602, '1f54b':4854, '1f54c':4850, '1f54d':4852, '1f54e':62786, '1f550':4955, '1f551':4957, '1f552':4959, '1f553':4961, '1f554':4963, '1f555':4965, '1f556':4967, '1f557':4969, '1f558':4971, '1f559':4973, '1f55a':4975, '1f55b':4953, '1f55c':4956, '1f55d':4958, '1f55e':4960, '1f55f':4962, '1f560':4964, '1f561':4966, '1f562':4968, '1f563':4970, '1f564':4972, '1f565':4974, '1f566':4976, '1f567':4954, '1f56f':61213, '1f570':4952, '1f573':1156, '1f574':1587, '1f575-200d-2640':1497, '1f575-200d-2642':1496, '1f575':1495, '1f576':61111, '1f577':2641, '1f578':2642, '1f579':51087, '1f57a':1586, '1f587':61281, '1f58a':61261, '1f58b':61260, '1f58c':61262, '1f58d':61263, '1f590':1329, '1f595':1348, '1f596':1331, '1f5a4':1148, '1f5a5':61192, '1f5a8':61193, '1f5b1':61195, '1f5b2':61196, '1f5bc':51104, '1f5c2':61268, '1f5c3':61285, '1f5c4':61286, '1f5d1':61287, '1f5d2':61271, '1f5d3':61272, '1f5dc':61310, '1f5dd':61293, '1f5de':61231, '1f5e1':61299, '1f5e3':1683, '1f5e8':1160, '1f5ef':1161, '1f5f3':61257, '1f5fa':4810, '1f5fb':4816, '1f5fc':4847, '1f5fd':4848, '1f5fe':4811, '1f5ff':61362, '1f600':11, '1f601':14, '1f602':18, '1f603':12, '1f604':13, '1f605':16, '1f606':15, '1f607':114, '1f608':1103, '1f609':112, '1f60a':113, '1f60b':124, '1f60c':150, '1f60d':116, '1f60e':170, '1f60f':144, '1f610':139, '1f611':140, '1f612':145, '1f613':195, '1f614':151, '1f615':173, '1f616':192, '1f617':119, '1f618':118, '1f619':122, '1f61a':121, '1f61b':125, '1f61c':126, '1f61d':128, '1f61e':194, '1f61f':175, '1f620':1101, '1f621':1100, '1f622':189, '1f623':193, '1f624':199, '1f625':188, '1f626':184, '1f627':185, '1f628':186, '1f629':196, '1f62a':152, '1f62b':197, '1f62c':147, '1f62d':190, '1f62e-200d-1f4a8':148, '1f62e':178, '1f62f':179, '1f630':187, '1f631':191, '1f632':180, '1f633':181, '1f634':154, '1f635-200d-1f4ab':165, '1f635':164, '1f636-200d-1f32b':143, '1f636':141, '1f637':155, '1f638':1116, '1f639':1117, '1f63a':1115, '1f63b':1118, '1f63c':1119, '1f63d':1120, '1f63e':1123, '1f63f':1122, '1f640':1121, '1f641':176, '1f642':19, '1f643':110, '1f644':146, '1f645-200d-2640':1422, '1f645-200d-2642':1421, '1f645':1420, '1f646-200d-2640':1425, '1f646-200d-2642':1424, '1f646':1423, '1f647-200d-2640':1437, '1f647-200d-2642':1436, '1f647':1435, '1f648':1124, '1f649':1125, '1f64a':1126, '1f64b-200d-2640':1431, '1f64b-200d-2642':1430, '1f64b':1429, '1f64c':1359, '1f64d-200d-2640':1416, '1f64d-200d-2642':1415, '1f64d':1414, '1f64e-200d-2640':1419, '1f64e-200d-2642':1418, '1f64e':1417, '1f64f':1364, '1f680':4942, '1f681':4937, '1f682':4872, '1f683':4873, '1f684':4874, '1f685':4875, '1f686':4876, '1f687':4877, '1f688':4878, '1f689':4879, '1f68a':4880, '1f68b':4883, '1f68c':4884, '1f68d':4885, '1f68e':4886, '1f68f':4911, '1f690':4887, '1f691':4888, '1f692':4889, '1f693':4890, '1f694':4891, '1f695':4892, '1f696':4893, '1f697':4894, '1f698':4895, '1f699':4896, '1f69a':4898, '1f69b':4899, '1f69c':4900, '1f69d':4881, '1f69e':4882, '1f69f':4938, '1f6a0':4939, '1f6a1':4940, '1f6a2':4930, '1f6a3-200d-2640':1609, '1f6a3-200d-2642':1608, '1f6a3':1607, '1f6a4':4926, '1f6a5':4918, '1f6a6':4919, '1f6a7':4921, '1f6a8':4917, '1f6a9':71587, '1f6aa':61333, '1f6ab':62745, '1f6ac':61358, '1f6ad':62747, '1f6ae':62730, '1f6af':62748, '1f6b0':62731, '1f6b1':62749, '1f6b2':4907, '1f6b3':62746, '1f6b4-200d-2640':1621, '1f6b4-200d-2642':1620, '1f6b4':1619, '1f6b5-200d-2640':1624, '1f6b5-200d-2642':1623, '1f6b5':1622, '1f6b6-200d-2640':1566, '1f6b6-200d-2642':1565, '1f6b6':1564, '1f6b7':62750, '1f6b8':62743, '1f6b9':62733, '1f6ba':62734, '1f6bb':62735, '1f6bc':62736, '1f6bd':61340, '1f6be':62737, '1f6bf':61342, '1f6c0':1643, '1f6c1':61343, '1f6c2':62738, '1f6c3':62739, '1f6c4':62740, '1f6c5':62741, '1f6cb':61338, '1f6cc':1644, '1f6cd':61133, '1f6ce':4944, '1f6cf':61337, '1f6d0':62776, '1f6d1':4920, '1f6d2':61357, '1f6d5':4851, '1f6d6':4828, '1f6d7':61334, '1f6e0':61298, '1f6e1':61304, '1f6e2':4914, '1f6e3':4912, '1f6e4':4913, '1f6e5':4929, '1f6e9':4932, '1f6eb':4933, '1f6ec':4934, '1f6f0':4941, '1f6f3':4927, '1f6f4':4908, '1f6f5':4903, '1f6f6':4925, '1f6f7':51076, '1f6f8':4943, '1f6f9':4909, '1f6fa':4906, '1f6fb':4897, '1f6fc':4910, '1f7e0':62917, '1f7e1':62918, '1f7e2':62919, '1f7e3':62921, '1f7e4':62922, '1f7e5':62925, '1f7e6':62929, '1f7e7':62926, '1f7e8':62927, '1f7e9':62928, '1f7ea':62930, '1f7eb':62931, '1f90c':1337, '1f90d':1149, '1f90e':1147, '1f90f':1338, '1f910':137, '1f911':129, '1f912':156, '1f913':171, '1f914':135, '1f915':157, '1f916':1114, '1f917':130, '1f918':1343, '1f919':1344, '1f91a':1328, '1f91b':1356, '1f91c':1357, '1f91d':1363, '1f91e':1340, '1f91f':1342, '1f920':167, '1f921':1108, '1f922':158, '1f923':17, '1f924':153, '1f925':149, '1f926-200d-2640':1440, '1f926-200d-2642':1439, '1f926':1438, '1f927':160, '1f928':138, '1f929':117, '1f92a':127, '1f92b':134, '1f92c':1102, '1f92d':131, '1f92e':159, '1f92f':166, '1f930':1519, '1f931':1522, '1f932':1362, '1f933':1367, '1f934':1506, '1f935-200d-2640':1515, '1f935-200d-2642':1514, '1f935':1513, '1f936':1528, '1f937-200d-2640':1443, '1f937-200d-2642':1442, '1f937':1441, '1f938-200d-2640':1627, '1f938-200d-2642':1626, '1f938':1625, '1f939-200d-2640':1639, '1f939-200d-2642':1638, '1f939':1637, '1f93a':1597, '1f93c-200d-2640':1630, '1f93c-200d-2642':1629, '1f93c':1628, '1f93d-200d-2640':1633, '1f93d-200d-2642':1632, '1f93d':1631, '1f93e-200d-2640':1636, '1f93e-200d-2642':1635, '1f93e':1634, '1f93f':51073, '1f940':2654, '1f941':61180, '1f942':3791, '1f943':3792, '1f944':3802, '1f945':51069, '1f947':51048, '1f948':51049, '1f949':51050, '1f94a':51067, '1f94b':51068, '1f94c':51077, '1f94d':51064, '1f94e':51053, '1f94f':51059, '1f950':3710, '1f951':3693, '1f952':3700, '1f953':3721, '1f954':3695, '1f955':3696, '1f956':3711, '1f957':3738, '1f958':3734, '1f959':3730, '1f95a':3732, '1f95b':3780, '1f95c':3706, '1f95d':3689, '1f95e':3715, '1f95f':3757, '1f960':3758, '1f961':3759, '1f962':3799, '1f963':3737, '1f964':3794, '1f965':3692, '1f966':3702, '1f967':3773, '1f968':3713, '1f969':3720, '1f96a':3726, '1f96b':3742, '1f96c':3701, '1f96d':3681, '1f96e':3755, '1f96f':3714, '1f970':115, '1f971':198, '1f972':123, '1f973':168, '1f974':163, '1f975':161, '1f976':162, '1f977':1501, '1f978':169, '1f97a':182, '1f97b':61124, '1f97c':61113, '1f97d':61112, '1f97e':61138, '1f97f':61139, '1f980':3760, '1f981':2545, '1f982':2643, '1f983':2594, '1f984':2551, '1f985':2603, '1f986':2604, '1f987':2583, '1f988':2628, '1f989':2606, '1f98a':2540, '1f98b':2633, '1f98c':2553, '1f98d':2532, '1f98e':2615, '1f98f':2572, '1f990':3762, '1f991':3763, '1f992':2569, '1f993':2552, '1f994':2582, '1f995':2619, '1f996':2620, '1f997':2639, '1f998':2591, '1f999':2568, '1f99a':2610, '1f99b':2573, '1f99c':2611, '1f99d':2541, '1f99e':3761, '1f99f':2644, '1f9a0':2647, '1f9a1':2592, '1f9a2':2605, '1f9a3':2571, '1f9a4':2607, '1f9a5':2588, '1f9a6':2589, '1f9a7':2533, '1f9a8':2590, '1f9a9':2609, '1f9aa':3764, '1f9ab':2581, '1f9ac':2554, '1f9ad':2624, '1f9ae':2536, '1f9af':61312, '1f9b4':1380, '1f9b5':1371, '1f9b6':1372, '1f9b7':1379, '1f9b8-200d-2640':1532, '1f9b8-200d-2642':1531, '1f9b8':1530, '1f9b9-200d-2640':1535, '1f9b9-200d-2642':1534, '1f9b9':1533, '1f9ba':61114, '1f9bb':1374, '1f9bc':4905, '1f9bd':4904, '1f9be':1369, '1f9bf':1370, '1f9c0':3717, '1f9c1':3772, '1f9c2':3741, '1f9c3':3796, '1f9c4':3703, '1f9c5':3704, '1f9c6':3731, '1f9c7':3716, '1f9c8':3740, '1f9c9':3797, '1f9ca':3798, '1f9cb':3795, '1f9cd-200d-2640':1569, '1f9cd-200d-2642':1568, '1f9cd':1567, '1f9ce-200d-2640':1572, '1f9ce-200d-2642':1571, '1f9ce':1570, '1f9cf-200d-2640':1434, '1f9cf-200d-2642':1433, '1f9cf':1432, '1f9d0':172, '1f9d1-200d-1f33e':1456, '1f9d1-200d-1f373':1459, '1f9d1-200d-1f37c':1525, '1f9d1-200d-1f384':1529, '1f9d1-200d-1f393':1447, '1f9d1-200d-1f3a4':1477, '1f9d1-200d-1f3a8':1480, '1f9d1-200d-1f3eb':1450, '1f9d1-200d-1f3ed':1465, '1f9d1-200d-1f4bb':1474, '1f9d1-200d-1f4bc':1468, '1f9d1-200d-1f527':1462, '1f9d1-200d-1f52c':1471, '1f9d1-200d-1f680':1486, '1f9d1-200d-1f692':1489, '1f9d1-200d-1f91d-200d-1f9d1':1645, '1f9d1-200d-1f9af':1573, '1f9d1-200d-1f9b0':1402, '1f9d1-200d-1f9b1':1404, '1f9d1-200d-1f9b2':1408, '1f9d1-200d-1f9b3':1406, '1f9d1-200d-1f9bc':1576, '1f9d1-200d-1f9bd':1579, '1f9d1-200d-2695':1444, '1f9d1-200d-2696':1453, '1f9d1-200d-2708':1483, '1f9d1':1390, '1f9d2':1387, '1f9d3':1411, '1f9d4-200d-2640':1395, '1f9d4-200d-2642':1394, '1f9d4':1393, '1f9d5':1512, '1f9d6-200d-2640':1593, '1f9d6-200d-2642':1592, '1f9d6':1591, '1f9d7-200d-2640':1596, '1f9d7-200d-2642':1595, '1f9d7':1594, '1f9d8-200d-2640':1642, '1f9d8-200d-2642':1641, '1f9d8':1640, '1f9d9-200d-2640':1538, '1f9d9-200d-2642':1537, '1f9d9':1536, '1f9da-200d-2640':1541, '1f9da-200d-2642':1540, '1f9da':1539, '1f9db-200d-2640':1544, '1f9db-200d-2642':1543, '1f9db':1542, '1f9dc-200d-2640':1547, '1f9dc-200d-2642':1546, '1f9dc':1545, '1f9dd-200d-2640':1550, '1f9dd-200d-2642':1549, '1f9dd':1548, '1f9de-200d-2640':1553, '1f9de-200d-2642':1552, '1f9de':1551, '1f9df-200d-2640':1556, '1f9df-200d-2642':1555, '1f9df':1554, '1f9e0':1376, '1f9e1':1142, '1f9e2':61148, '1f9e3':61118, '1f9e4':61119, '1f9e5':61120, '1f9e6':61121, '1f9e7':51039, '1f9e8':51028, '1f9e9':51090, '1f9ea':61320, '1f9eb':61321, '1f9ec':61322, '1f9ed':4812, '1f9ee':61201, '1f9ef':61356, '1f9f0':61316, '1f9f1':4825, '1f9f2':61317, '1f9f3':4945, '1f9f4':61346, '1f9f5':51106, '1f9f6':51108, '1f9f7':61347, '1f9f8':51091, '1f9f9':61348, '1f9fa':61349, '1f9fb':61350, '1f9fc':61352, '1f9fd':61355, '1f9fe':61243, '1f9ff':51084, '1fa70':61142, '1fa71':61125, '1fa72':61126, '1fa73':61127, '1fa74':61135, '1fa78':61327, '1fa79':61329, '1fa7a':61331, '1fa80':51079, '1fa81':51080, '1fa82':4935, '1fa83':61302, '1fa84':51083, '1fa85':51092, '1fa86':51094, '1fa90':4993, '1fa91':61339, '1fa92':61345, '1fa93':61295, '1fa94':61217, '1fa95':61179, '1fa96':61149, '1fa97':61174, '1fa98':61181, '1fa99':61236, '1fa9a':61305, '1fa9b':61307, '1fa9c':61318, '1fa9d':61315, '1fa9e':61335, '1fa9f':61336, '1faa0':61341, '1faa1':51107, '1faa2':51109, '1faa3':61351, '1faa4':61344, '1faa5':61354, '1faa6':61360, '1faa7':61363, '1faa8':4826, '1fab0':2645, '1fab1':2646, '1fab2':2637, '1fab3':2640, '1fab4':2660, '1fab5':4827, '1fab6':2608, '1fac0':1377, '1fac1':1378, '1fac2':1686, '1fad0':3688, '1fad1':3699, '1fad2':3691, '1fad3':3712, '1fad4':3729, '1fad5':3736, '1fad6':3782, '203c':62834, '21a9':62765, '21aa':62766, '231a':4948, '231b':4946, '23cf':62818, '23e9':62805, '23ea':62809, '23eb':62812, '23ec':62814, '23ed':62806, '23ee':62810, '23ef':62807, '23f0':4949, '23f1':4950, '23f2':4951, '23f3':4947, '23f8':62815, '23f9':62816, '23fa':62817, '24c2':62890, '25aa':62938, '25ab':62939, '25b6':62804, '25c0':62808, '25fb':62935, '25fc':62934, '25fd':62937, '25fe':62936, '260e':61184, '261d':1350, '262a':62784, '262e':62785, '262f':62781, '263a':120, '264a':62790, '264b':62791, '264c':62792, '264d':62793, '264e':62794, '264f':62795, '265f':51099, '267b':62844, '267e':62833, '267f':62732, '269b':62777, '269c':62845, '26a0':62742, '26a1':41016, '26a7':62827, '26aa':62924, '26ab':62923, '26b0':61359, '26b1':61361, '26bd':51051, '26be':51052, '26c4':41019, '26c5':4999, '26c8':41000, '26ce':62800, '26cf':61296, '26d1':61150, '26d3':61314, '26d4':62744, '26e9':4853, '26ea':4849, '26f0':4814, '26f1':41015, '26f2':4855, '26f3':51070, '26f4':4928, '26f5':4924, '26f7':1599, '26f8':51071, '26f9-200d-2640':1615, '26f9-200d-2642':1614, '26f9':1613, '26fa':4856, '26fd':4915, '270a':1354, '270b':1330, '270c':1339, '270d':1365, '270f':61258, '271d':62782, '274c':62853, '274e':62854, '2764-200d-1f525':1139, '2764-200d-1fa79':1140, '27a1':62757, '27b0':62855, '27bf':62856, '2b05':62761, '2b06':62755, '2b07':62759, '2b1b':62932, '2b1c':62933, '2b50':4994, '2b55':62849, '303d':62857, '1f385-1f3fb':0, '1f385-1f3fc':0, '1f385-1f3fd':0, '1f385-1f3fe':0, '1f385-1f3ff':0, '1f3c2-1f3fb':0, '1f3c2-1f3fc':0, '1f3c2-1f3fd':0, '1f3c2-1f3fe':0, '1f3c2-1f3ff':0, '1f3c3-1f3fb-200d-2640':0, '1f3c3-1f3fc-200d-2640':0, '1f3c3-1f3fd-200d-2640':0, '1f3c3-1f3fe-200d-2640':0, '1f3c3-1f3ff-200d-2640':0, '1f3c3-1f3fb-200d-2642':0, '1f3c3-1f3fc-200d-2642':0, '1f3c3-1f3fd-200d-2642':0, '1f3c3-1f3fe-200d-2642':0, '1f3c3-1f3ff-200d-2642':0, '1f3c3-1f3fb':0, '1f3c3-1f3fc':0, '1f3c3-1f3fd':0, '1f3c3-1f3fe':0, '1f3c3-1f3ff':0, '1f3c4-1f3fb-200d-2640':0, '1f3c4-1f3fc-200d-2640':0, '1f3c4-1f3fd-200d-2640':0, '1f3c4-1f3fe-200d-2640':0, '1f3c4-1f3ff-200d-2640':0, '1f3c4-1f3fb-200d-2642':0, '1f3c4-1f3fc-200d-2642':0, '1f3c4-1f3fd-200d-2642':0, '1f3c4-1f3fe-200d-2642':0, '1f3c4-1f3ff-200d-2642':0, '1f3c4-1f3fb':0, '1f3c4-1f3fc':0, '1f3c4-1f3fd':0, '1f3c4-1f3fe':0, '1f3c4-1f3ff':0, '1f3c7-1f3fb':0, '1f3c7-1f3fc':0, '1f3c7-1f3fd':0, '1f3c7-1f3fe':0, '1f3c7-1f3ff':0, '1f3ca-1f3fb-200d-2640':0, '1f3ca-1f3fc-200d-2640':0, '1f3ca-1f3fd-200d-2640':0, '1f3ca-1f3fe-200d-2640':0, '1f3ca-1f3ff-200d-2640':0, '1f3ca-1f3fb-200d-2642':0, '1f3ca-1f3fc-200d-2642':0, '1f3ca-1f3fd-200d-2642':0, '1f3ca-1f3fe-200d-2642':0, '1f3ca-1f3ff-200d-2642':0, '1f3ca-1f3fb':0, '1f3ca-1f3fc':0, '1f3ca-1f3fd':0, '1f3ca-1f3fe':0, '1f3ca-1f3ff':0, '1f3cb-1f3fb-200d-2640':0, '1f3cb-1f3fc-200d-2640':0, '1f3cb-1f3fd-200d-2640':0, '1f3cb-1f3fe-200d-2640':0, '1f3cb-1f3ff-200d-2640':0, '1f3cb-1f3fb-200d-2642':0, '1f3cb-1f3fc-200d-2642':0, '1f3cb-1f3fd-200d-2642':0, '1f3cb-1f3fe-200d-2642':0, '1f3cb-1f3ff-200d-2642':0, '1f3cb-1f3fb':0, '1f3cb-1f3fc':0, '1f3cb-1f3fd':0, '1f3cb-1f3fe':0, '1f3cb-1f3ff':0, '1f3cc-1f3fb-200d-2640':0, '1f3cc-1f3fc-200d-2640':0, '1f3cc-1f3fd-200d-2640':0, '1f3cc-1f3fe-200d-2640':0, '1f3cc-1f3ff-200d-2640':0, '1f3cc-1f3fb-200d-2642':0, '1f3cc-1f3fc-200d-2642':0, '1f3cc-1f3fd-200d-2642':0, '1f3cc-1f3fe-200d-2642':0, '1f3cc-1f3ff-200d-2642':0, '1f3cc-1f3fb':0, '1f3cc-1f3fc':0, '1f3cc-1f3fd':0, '1f3cc-1f3fe':0, '1f3cc-1f3ff':0, '1f442-1f3fb':0, '1f442-1f3fc':0, '1f442-1f3fd':0, '1f442-1f3fe':0, '1f442-1f3ff':0, '1f443-1f3fb':0, '1f443-1f3fc':0, '1f443-1f3fd':0, '1f443-1f3fe':0, '1f443-1f3ff':0, '1f446-1f3fb':0, '1f446-1f3fc':0, '1f446-1f3fd':0, '1f446-1f3fe':0, '1f446-1f3ff':0, '1f447-1f3fb':0, '1f447-1f3fc':0, '1f447-1f3fd':0, '1f447-1f3fe':0, '1f447-1f3ff':0, '1f448-1f3fb':0, '1f448-1f3fc':0, '1f448-1f3fd':0, '1f448-1f3fe':0, '1f448-1f3ff':0, '1f449-1f3fb':0, '1f449-1f3fc':0, '1f449-1f3fd':0, '1f449-1f3fe':0, '1f449-1f3ff':0, '1f44a-1f3fb':0, '1f44a-1f3fc':0, '1f44a-1f3fd':0, '1f44a-1f3fe':0, '1f44a-1f3ff':0, '1f44b-1f3fb':0, '1f44b-1f3fc':0, '1f44b-1f3fd':0, '1f44b-1f3fe':0, '1f44b-1f3ff':0, '1f44c-1f3fb':0, '1f44c-1f3fc':0, '1f44c-1f3fd':0, '1f44c-1f3fe':0, '1f44c-1f3ff':0, '1f44d-1f3fb':0, '1f44d-1f3fc':0, '1f44d-1f3fd':0, '1f44d-1f3fe':0, '1f44d-1f3ff':0, '1f44e-1f3fb':0, '1f44e-1f3fc':0, '1f44e-1f3fd':0, '1f44e-1f3fe':0, '1f44e-1f3ff':0, '1f44f-1f3fb':0, '1f44f-1f3fc':0, '1f44f-1f3fd':0, '1f44f-1f3fe':0, '1f44f-1f3ff':0, '1f450-1f3fb':0, '1f450-1f3fc':0, '1f450-1f3fd':0, '1f450-1f3fe':0, '1f450-1f3ff':0, '1f466-1f3fb':0, '1f466-1f3fc':0, '1f466-1f3fd':0, '1f466-1f3fe':0, '1f466-1f3ff':0, '1f467-1f3fb':0, '1f467-1f3fc':0, '1f467-1f3fd':0, '1f467-1f3fe':0, '1f467-1f3ff':0, '1f468-1f3fb-200d-1f33e':0, '1f468-1f3fc-200d-1f33e':0, '1f468-1f3fd-200d-1f33e':0, '1f468-1f3fe-200d-1f33e':0, '1f468-1f3ff-200d-1f33e':0, '1f468-1f3fb-200d-1f373':0, '1f468-1f3fc-200d-1f373':0, '1f468-1f3fd-200d-1f373':0, '1f468-1f3fe-200d-1f373':0, '1f468-1f3ff-200d-1f373':0, '1f468-1f3fb-200d-1f37c':0, '1f468-1f3fc-200d-1f37c':0, '1f468-1f3fd-200d-1f37c':0, '1f468-1f3fe-200d-1f37c':0, '1f468-1f3ff-200d-1f37c':0, '1f468-1f3fb-200d-1f393':0, '1f468-1f3fc-200d-1f393':0, '1f468-1f3fd-200d-1f393':0, '1f468-1f3fe-200d-1f393':0, '1f468-1f3ff-200d-1f393':0, '1f468-1f3fb-200d-1f3a4':0, '1f468-1f3fc-200d-1f3a4':0, '1f468-1f3fd-200d-1f3a4':0, '1f468-1f3fe-200d-1f3a4':0, '1f468-1f3ff-200d-1f3a4':0, '1f468-1f3fb-200d-1f3a8':0, '1f468-1f3fc-200d-1f3a8':0, '1f468-1f3fd-200d-1f3a8':0, '1f468-1f3fe-200d-1f3a8':0, '1f468-1f3ff-200d-1f3a8':0, '1f468-1f3fb-200d-1f3eb':0, '1f468-1f3fc-200d-1f3eb':0, '1f468-1f3fd-200d-1f3eb':0, '1f468-1f3fe-200d-1f3eb':0, '1f468-1f3ff-200d-1f3eb':0, '1f468-1f3fb-200d-1f3ed':0, '1f468-1f3fc-200d-1f3ed':0, '1f468-1f3fd-200d-1f3ed':0, '1f468-1f3fe-200d-1f3ed':0, '1f468-1f3ff-200d-1f3ed':0, '1f468-1f3fb-200d-1f4bb':0, '1f468-1f3fc-200d-1f4bb':0, '1f468-1f3fd-200d-1f4bb':0, '1f468-1f3fe-200d-1f4bb':0, '1f468-1f3ff-200d-1f4bb':0, '1f468-1f3fb-200d-1f4bc':0, '1f468-1f3fc-200d-1f4bc':0, '1f468-1f3fd-200d-1f4bc':0, '1f468-1f3fe-200d-1f4bc':0, '1f468-1f3ff-200d-1f4bc':0, '1f468-1f3fb-200d-1f527':0, '1f468-1f3fc-200d-1f527':0, '1f468-1f3fd-200d-1f527':0, '1f468-1f3fe-200d-1f527':0, '1f468-1f3ff-200d-1f527':0, '1f468-1f3fb-200d-1f52c':0, '1f468-1f3fc-200d-1f52c':0, '1f468-1f3fd-200d-1f52c':0, '1f468-1f3fe-200d-1f52c':0, '1f468-1f3ff-200d-1f52c':0, '1f468-1f3fb-200d-1f680':0, '1f468-1f3fc-200d-1f680':0, '1f468-1f3fd-200d-1f680':0, '1f468-1f3fe-200d-1f680':0, '1f468-1f3ff-200d-1f680':0, '1f468-1f3fb-200d-1f692':0, '1f468-1f3fc-200d-1f692':0, '1f468-1f3fd-200d-1f692':0, '1f468-1f3fe-200d-1f692':0, '1f468-1f3ff-200d-1f692':0, '1f468-1f3fb-200d-1f9af':0, '1f468-1f3fc-200d-1f9af':0, '1f468-1f3fd-200d-1f9af':0, '1f468-1f3fe-200d-1f9af':0, '1f468-1f3ff-200d-1f9af':0, '1f468-1f3fb-200d-1f9b0':0, '1f468-1f3fc-200d-1f9b0':0, '1f468-1f3fd-200d-1f9b0':0, '1f468-1f3fe-200d-1f9b0':0, '1f468-1f3ff-200d-1f9b0':0, '1f468-1f3fb-200d-1f9b1':0, '1f468-1f3fc-200d-1f9b1':0, '1f468-1f3fd-200d-1f9b1':0, '1f468-1f3fe-200d-1f9b1':0, '1f468-1f3ff-200d-1f9b1':0, '1f468-1f3fb-200d-1f9b2':0, '1f468-1f3fc-200d-1f9b2':0, '1f468-1f3fd-200d-1f9b2':0, '1f468-1f3fe-200d-1f9b2':0, '1f468-1f3ff-200d-1f9b2':0, '1f468-1f3fb-200d-1f9b3':0, '1f468-1f3fc-200d-1f9b3':0, '1f468-1f3fd-200d-1f9b3':0, '1f468-1f3fe-200d-1f9b3':0, '1f468-1f3ff-200d-1f9b3':0, '1f468-1f3fb-200d-1f9bc':0, '1f468-1f3fc-200d-1f9bc':0, '1f468-1f3fd-200d-1f9bc':0, '1f468-1f3fe-200d-1f9bc':0, '1f468-1f3ff-200d-1f9bc':0, '1f468-1f3fb-200d-1f9bd':0, '1f468-1f3fc-200d-1f9bd':0, '1f468-1f3fd-200d-1f9bd':0, '1f468-1f3fe-200d-1f9bd':0, '1f468-1f3ff-200d-1f9bd':0, '1f468-1f3fb-200d-2695':0, '1f468-1f3fc-200d-2695':0, '1f468-1f3fd-200d-2695':0, '1f468-1f3fe-200d-2695':0, '1f468-1f3ff-200d-2695':0, '1f468-1f3fb-200d-2696':0, '1f468-1f3fc-200d-2696':0, '1f468-1f3fd-200d-2696':0, '1f468-1f3fe-200d-2696':0, '1f468-1f3ff-200d-2696':0, '1f468-1f3fb-200d-2708':0, '1f468-1f3fc-200d-2708':0, '1f468-1f3fd-200d-2708':0, '1f468-1f3fe-200d-2708':0, '1f468-1f3ff-200d-2708':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fb':0, '1f468-1f3fc':0, '1f468-1f3fd':0, '1f468-1f3fe':0, '1f468-1f3ff':0, '1f469-1f3fb-200d-1f33e':0, '1f469-1f3fc-200d-1f33e':0, '1f469-1f3fd-200d-1f33e':0, '1f469-1f3fe-200d-1f33e':0, '1f469-1f3ff-200d-1f33e':0, '1f469-1f3fb-200d-1f373':0, '1f469-1f3fc-200d-1f373':0, '1f469-1f3fd-200d-1f373':0, '1f469-1f3fe-200d-1f373':0, '1f469-1f3ff-200d-1f373':0, '1f469-1f3fb-200d-1f37c':0, '1f469-1f3fc-200d-1f37c':0, '1f469-1f3fd-200d-1f37c':0, '1f469-1f3fe-200d-1f37c':0, '1f469-1f3ff-200d-1f37c':0, '1f469-1f3fb-200d-1f393':0, '1f469-1f3fc-200d-1f393':0, '1f469-1f3fd-200d-1f393':0, '1f469-1f3fe-200d-1f393':0, '1f469-1f3ff-200d-1f393':0, '1f469-1f3fb-200d-1f3a4':0, '1f469-1f3fc-200d-1f3a4':0, '1f469-1f3fd-200d-1f3a4':0, '1f469-1f3fe-200d-1f3a4':0, '1f469-1f3ff-200d-1f3a4':0, '1f469-1f3fb-200d-1f3a8':0, '1f469-1f3fc-200d-1f3a8':0, '1f469-1f3fd-200d-1f3a8':0, '1f469-1f3fe-200d-1f3a8':0, '1f469-1f3ff-200d-1f3a8':0, '1f469-1f3fb-200d-1f3eb':0, '1f469-1f3fc-200d-1f3eb':0, '1f469-1f3fd-200d-1f3eb':0, '1f469-1f3fe-200d-1f3eb':0, '1f469-1f3ff-200d-1f3eb':0, '1f469-1f3fb-200d-1f3ed':0, '1f469-1f3fc-200d-1f3ed':0, '1f469-1f3fd-200d-1f3ed':0, '1f469-1f3fe-200d-1f3ed':0, '1f469-1f3ff-200d-1f3ed':0, '1f469-1f3fb-200d-1f4bb':0, '1f469-1f3fc-200d-1f4bb':0, '1f469-1f3fd-200d-1f4bb':0, '1f469-1f3fe-200d-1f4bb':0, '1f469-1f3ff-200d-1f4bb':0, '1f469-1f3fb-200d-1f4bc':0, '1f469-1f3fc-200d-1f4bc':0, '1f469-1f3fd-200d-1f4bc':0, '1f469-1f3fe-200d-1f4bc':0, '1f469-1f3ff-200d-1f4bc':0, '1f469-1f3fb-200d-1f527':0, '1f469-1f3fc-200d-1f527':0, '1f469-1f3fd-200d-1f527':0, '1f469-1f3fe-200d-1f527':0, '1f469-1f3ff-200d-1f527':0, '1f469-1f3fb-200d-1f52c':0, '1f469-1f3fc-200d-1f52c':0, '1f469-1f3fd-200d-1f52c':0, '1f469-1f3fe-200d-1f52c':0, '1f469-1f3ff-200d-1f52c':0, '1f469-1f3fb-200d-1f680':0, '1f469-1f3fc-200d-1f680':0, '1f469-1f3fd-200d-1f680':0, '1f469-1f3fe-200d-1f680':0, '1f469-1f3ff-200d-1f680':0, '1f469-1f3fb-200d-1f692':0, '1f469-1f3fc-200d-1f692':0, '1f469-1f3fd-200d-1f692':0, '1f469-1f3fe-200d-1f692':0, '1f469-1f3ff-200d-1f692':0, '1f469-1f3fb-200d-1f9af':0, '1f469-1f3fc-200d-1f9af':0, '1f469-1f3fd-200d-1f9af':0, '1f469-1f3fe-200d-1f9af':0, '1f469-1f3ff-200d-1f9af':0, '1f469-1f3fb-200d-1f9b0':0, '1f469-1f3fc-200d-1f9b0':0, '1f469-1f3fd-200d-1f9b0':0, '1f469-1f3fe-200d-1f9b0':0, '1f469-1f3ff-200d-1f9b0':0, '1f469-1f3fb-200d-1f9b1':0, '1f469-1f3fc-200d-1f9b1':0, '1f469-1f3fd-200d-1f9b1':0, '1f469-1f3fe-200d-1f9b1':0, '1f469-1f3ff-200d-1f9b1':0, '1f469-1f3fb-200d-1f9b2':0, '1f469-1f3fc-200d-1f9b2':0, '1f469-1f3fd-200d-1f9b2':0, '1f469-1f3fe-200d-1f9b2':0, '1f469-1f3ff-200d-1f9b2':0, '1f469-1f3fb-200d-1f9b3':0, '1f469-1f3fc-200d-1f9b3':0, '1f469-1f3fd-200d-1f9b3':0, '1f469-1f3fe-200d-1f9b3':0, '1f469-1f3ff-200d-1f9b3':0, '1f469-1f3fb-200d-1f9bc':0, '1f469-1f3fc-200d-1f9bc':0, '1f469-1f3fd-200d-1f9bc':0, '1f469-1f3fe-200d-1f9bc':0, '1f469-1f3ff-200d-1f9bc':0, '1f469-1f3fb-200d-1f9bd':0, '1f469-1f3fc-200d-1f9bd':0, '1f469-1f3fd-200d-1f9bd':0, '1f469-1f3fe-200d-1f9bd':0, '1f469-1f3ff-200d-1f9bd':0, '1f469-1f3fb-200d-2695':0, '1f469-1f3fc-200d-2695':0, '1f469-1f3fd-200d-2695':0, '1f469-1f3fe-200d-2695':0, '1f469-1f3ff-200d-2695':0, '1f469-1f3fb-200d-2696':0, '1f469-1f3fc-200d-2696':0, '1f469-1f3fd-200d-2696':0, '1f469-1f3fe-200d-2696':0, '1f469-1f3ff-200d-2696':0, '1f469-1f3fb-200d-2708':0, '1f469-1f3fc-200d-2708':0, '1f469-1f3fd-200d-2708':0, '1f469-1f3fe-200d-2708':0, '1f469-1f3ff-200d-2708':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fb':0, '1f469-1f3fc':0, '1f469-1f3fd':0, '1f469-1f3fe':0, '1f469-1f3ff':0, '1f46b-1f3fb':0, '1f46b-1f3fc':0, '1f46b-1f3fd':0, '1f46b-1f3fe':0, '1f46b-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46c-1f3fb':0, '1f46c-1f3fc':0, '1f46c-1f3fd':0, '1f46c-1f3fe':0, '1f46c-1f3ff':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46d-1f3fb':0, '1f46d-1f3fc':0, '1f46d-1f3fd':0, '1f46d-1f3fe':0, '1f46d-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe':0, '1f46e-1f3fb-200d-2640':0, '1f46e-1f3fc-200d-2640':0, '1f46e-1f3fd-200d-2640':0, '1f46e-1f3fe-200d-2640':0, '1f46e-1f3ff-200d-2640':0, '1f46e-1f3fb-200d-2642':0, '1f46e-1f3fc-200d-2642':0, '1f46e-1f3fd-200d-2642':0, '1f46e-1f3fe-200d-2642':0, '1f46e-1f3ff-200d-2642':0, '1f46e-1f3fb':0, '1f46e-1f3fc':0, '1f46e-1f3fd':0, '1f46e-1f3fe':0, '1f46e-1f3ff':0, '1f470-1f3fb-200d-2640':0, '1f470-1f3fc-200d-2640':0, '1f470-1f3fd-200d-2640':0, '1f470-1f3fe-200d-2640':0, '1f470-1f3ff-200d-2640':0, '1f470-1f3fb-200d-2642':0, '1f470-1f3fc-200d-2642':0, '1f470-1f3fd-200d-2642':0, '1f470-1f3fe-200d-2642':0, '1f470-1f3ff-200d-2642':0, '1f470-1f3fb':0, '1f470-1f3fc':0, '1f470-1f3fd':0, '1f470-1f3fe':0, '1f470-1f3ff':0, '1f471-1f3fb-200d-2640':0, '1f471-1f3fc-200d-2640':0, '1f471-1f3fd-200d-2640':0, '1f471-1f3fe-200d-2640':0, '1f471-1f3ff-200d-2640':0, '1f471-1f3fb-200d-2642':0, '1f471-1f3fc-200d-2642':0, '1f471-1f3fd-200d-2642':0, '1f471-1f3fe-200d-2642':0, '1f471-1f3ff-200d-2642':0, '1f471-1f3fb':0, '1f471-1f3fc':0, '1f471-1f3fd':0, '1f471-1f3fe':0, '1f471-1f3ff':0, '1f472-1f3fb':0, '1f472-1f3fc':0, '1f472-1f3fd':0, '1f472-1f3fe':0, '1f472-1f3ff':0, '1f473-1f3fb-200d-2640':0, '1f473-1f3fc-200d-2640':0, '1f473-1f3fd-200d-2640':0, '1f473-1f3fe-200d-2640':0, '1f473-1f3ff-200d-2640':0, '1f473-1f3fb-200d-2642':0, '1f473-1f3fc-200d-2642':0, '1f473-1f3fd-200d-2642':0, '1f473-1f3fe-200d-2642':0, '1f473-1f3ff-200d-2642':0, '1f473-1f3fb':0, '1f473-1f3fc':0, '1f473-1f3fd':0, '1f473-1f3fe':0, '1f473-1f3ff':0, '1f474-1f3fb':0, '1f474-1f3fc':0, '1f474-1f3fd':0, '1f474-1f3fe':0, '1f474-1f3ff':0, '1f475-1f3fb':0, '1f475-1f3fc':0, '1f475-1f3fd':0, '1f475-1f3fe':0, '1f475-1f3ff':0, '1f476-1f3fb':0, '1f476-1f3fc':0, '1f476-1f3fd':0, '1f476-1f3fe':0, '1f476-1f3ff':0, '1f477-1f3fb-200d-2640':0, '1f477-1f3fc-200d-2640':0, '1f477-1f3fd-200d-2640':0, '1f477-1f3fe-200d-2640':0, '1f477-1f3ff-200d-2640':0, '1f477-1f3fb-200d-2642':0, '1f477-1f3fc-200d-2642':0, '1f477-1f3fd-200d-2642':0, '1f477-1f3fe-200d-2642':0, '1f477-1f3ff-200d-2642':0, '1f477-1f3fb':0, '1f477-1f3fc':0, '1f477-1f3fd':0, '1f477-1f3fe':0, '1f477-1f3ff':0, '1f478-1f3fb':0, '1f478-1f3fc':0, '1f478-1f3fd':0, '1f478-1f3fe':0, '1f478-1f3ff':0, '1f47c-1f3fb':0, '1f47c-1f3fc':0, '1f47c-1f3fd':0, '1f47c-1f3fe':0, '1f47c-1f3ff':0, '1f481-1f3fb-200d-2640':0, '1f481-1f3fc-200d-2640':0, '1f481-1f3fd-200d-2640':0, '1f481-1f3fe-200d-2640':0, '1f481-1f3ff-200d-2640':0, '1f481-1f3fb-200d-2642':0, '1f481-1f3fc-200d-2642':0, '1f481-1f3fd-200d-2642':0, '1f481-1f3fe-200d-2642':0, '1f481-1f3ff-200d-2642':0, '1f481-1f3fb':0, '1f481-1f3fc':0, '1f481-1f3fd':0, '1f481-1f3fe':0, '1f481-1f3ff':0, '1f482-1f3fb-200d-2640':0, '1f482-1f3fc-200d-2640':0, '1f482-1f3fd-200d-2640':0, '1f482-1f3fe-200d-2640':0, '1f482-1f3ff-200d-2640':0, '1f482-1f3fb-200d-2642':0, '1f482-1f3fc-200d-2642':0, '1f482-1f3fd-200d-2642':0, '1f482-1f3fe-200d-2642':0, '1f482-1f3ff-200d-2642':0, '1f482-1f3fb':0, '1f482-1f3fc':0, '1f482-1f3fd':0, '1f482-1f3fe':0, '1f482-1f3ff':0, '1f483-1f3fb':0, '1f483-1f3fc':0, '1f483-1f3fd':0, '1f483-1f3fe':0, '1f483-1f3ff':0, '1f485-1f3fb':0, '1f485-1f3fc':0, '1f485-1f3fd':0, '1f485-1f3fe':0, '1f485-1f3ff':0, '1f486-1f3fb-200d-2640':0, '1f486-1f3fc-200d-2640':0, '1f486-1f3fd-200d-2640':0, '1f486-1f3fe-200d-2640':0, '1f486-1f3ff-200d-2640':0, '1f486-1f3fb-200d-2642':0, '1f486-1f3fc-200d-2642':0, '1f486-1f3fd-200d-2642':0, '1f486-1f3fe-200d-2642':0, '1f486-1f3ff-200d-2642':0, '1f486-1f3fb':0, '1f486-1f3fc':0, '1f486-1f3fd':0, '1f486-1f3fe':0, '1f486-1f3ff':0, '1f487-1f3fb-200d-2640':0, '1f487-1f3fc-200d-2640':0, '1f487-1f3fd-200d-2640':0, '1f487-1f3fe-200d-2640':0, '1f487-1f3ff-200d-2640':0, '1f487-1f3fb-200d-2642':0, '1f487-1f3fc-200d-2642':0, '1f487-1f3fd-200d-2642':0, '1f487-1f3fe-200d-2642':0, '1f487-1f3ff-200d-2642':0, '1f487-1f3fb':0, '1f487-1f3fc':0, '1f487-1f3fd':0, '1f487-1f3fe':0, '1f487-1f3ff':0, '1f48f-1f3fb':0, '1f48f-1f3fc':0, '1f48f-1f3fd':0, '1f48f-1f3fe':0, '1f48f-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f491-1f3fb':0, '1f491-1f3fc':0, '1f491-1f3fd':0, '1f491-1f3fe':0, '1f491-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe':0, '1f4aa-1f3fb':0, '1f4aa-1f3fc':0, '1f4aa-1f3fd':0, '1f4aa-1f3fe':0, '1f4aa-1f3ff':0, '1f574-1f3fb':0, '1f574-1f3fc':0, '1f574-1f3fd':0, '1f574-1f3fe':0, '1f574-1f3ff':0, '1f575-1f3fb-200d-2640':0, '1f575-1f3fc-200d-2640':0, '1f575-1f3fd-200d-2640':0, '1f575-1f3fe-200d-2640':0, '1f575-1f3ff-200d-2640':0, '1f575-1f3fb-200d-2642':0, '1f575-1f3fc-200d-2642':0, '1f575-1f3fd-200d-2642':0, '1f575-1f3fe-200d-2642':0, '1f575-1f3ff-200d-2642':0, '1f575-1f3fb':0, '1f575-1f3fc':0, '1f575-1f3fd':0, '1f575-1f3fe':0, '1f575-1f3ff':0, '1f57a-1f3fb':0, '1f57a-1f3fc':0, '1f57a-1f3fd':0, '1f57a-1f3fe':0, '1f57a-1f3ff':0, '1f590-1f3fb':0, '1f590-1f3fc':0, '1f590-1f3fd':0, '1f590-1f3fe':0, '1f590-1f3ff':0, '1f595-1f3fb':0, '1f595-1f3fc':0, '1f595-1f3fd':0, '1f595-1f3fe':0, '1f595-1f3ff':0, '1f596-1f3fb':0, '1f596-1f3fc':0, '1f596-1f3fd':0, '1f596-1f3fe':0, '1f596-1f3ff':0, '1f645-1f3fb-200d-2640':0, '1f645-1f3fc-200d-2640':0, '1f645-1f3fd-200d-2640':0, '1f645-1f3fe-200d-2640':0, '1f645-1f3ff-200d-2640':0, '1f645-1f3fb-200d-2642':0, '1f645-1f3fc-200d-2642':0, '1f645-1f3fd-200d-2642':0, '1f645-1f3fe-200d-2642':0, '1f645-1f3ff-200d-2642':0, '1f645-1f3fb':0, '1f645-1f3fc':0, '1f645-1f3fd':0, '1f645-1f3fe':0, '1f645-1f3ff':0, '1f646-1f3fb-200d-2640':0, '1f646-1f3fc-200d-2640':0, '1f646-1f3fd-200d-2640':0, '1f646-1f3fe-200d-2640':0, '1f646-1f3ff-200d-2640':0, '1f646-1f3fb-200d-2642':0, '1f646-1f3fc-200d-2642':0, '1f646-1f3fd-200d-2642':0, '1f646-1f3fe-200d-2642':0, '1f646-1f3ff-200d-2642':0, '1f646-1f3fb':0, '1f646-1f3fc':0, '1f646-1f3fd':0, '1f646-1f3fe':0, '1f646-1f3ff':0, '1f647-1f3fb-200d-2640':0, '1f647-1f3fc-200d-2640':0, '1f647-1f3fd-200d-2640':0, '1f647-1f3fe-200d-2640':0, '1f647-1f3ff-200d-2640':0, '1f647-1f3fb-200d-2642':0, '1f647-1f3fc-200d-2642':0, '1f647-1f3fd-200d-2642':0, '1f647-1f3fe-200d-2642':0, '1f647-1f3ff-200d-2642':0, '1f647-1f3fb':0, '1f647-1f3fc':0, '1f647-1f3fd':0, '1f647-1f3fe':0, '1f647-1f3ff':0, '1f64b-1f3fb-200d-2640':0, '1f64b-1f3fc-200d-2640':0, '1f64b-1f3fd-200d-2640':0, '1f64b-1f3fe-200d-2640':0, '1f64b-1f3ff-200d-2640':0, '1f64b-1f3fb-200d-2642':0, '1f64b-1f3fc-200d-2642':0, '1f64b-1f3fd-200d-2642':0, '1f64b-1f3fe-200d-2642':0, '1f64b-1f3ff-200d-2642':0, '1f64b-1f3fb':0, '1f64b-1f3fc':0, '1f64b-1f3fd':0, '1f64b-1f3fe':0, '1f64b-1f3ff':0, '1f64c-1f3fb':0, '1f64c-1f3fc':0, '1f64c-1f3fd':0, '1f64c-1f3fe':0, '1f64c-1f3ff':0, '1f64d-1f3fb-200d-2640':0, '1f64d-1f3fc-200d-2640':0, '1f64d-1f3fd-200d-2640':0, '1f64d-1f3fe-200d-2640':0, '1f64d-1f3ff-200d-2640':0, '1f64d-1f3fb-200d-2642':0, '1f64d-1f3fc-200d-2642':0, '1f64d-1f3fd-200d-2642':0, '1f64d-1f3fe-200d-2642':0, '1f64d-1f3ff-200d-2642':0, '1f64d-1f3fb':0, '1f64d-1f3fc':0, '1f64d-1f3fd':0, '1f64d-1f3fe':0, '1f64d-1f3ff':0, '1f64e-1f3fb-200d-2640':0, '1f64e-1f3fc-200d-2640':0, '1f64e-1f3fd-200d-2640':0, '1f64e-1f3fe-200d-2640':0, '1f64e-1f3ff-200d-2640':0, '1f64e-1f3fb-200d-2642':0, '1f64e-1f3fc-200d-2642':0, '1f64e-1f3fd-200d-2642':0, '1f64e-1f3fe-200d-2642':0, '1f64e-1f3ff-200d-2642':0, '1f64e-1f3fb':0, '1f64e-1f3fc':0, '1f64e-1f3fd':0, '1f64e-1f3fe':0, '1f64e-1f3ff':0, '1f64f-1f3fb':0, '1f64f-1f3fc':0, '1f64f-1f3fd':0, '1f64f-1f3fe':0, '1f64f-1f3ff':0, '1f6a3-1f3fb-200d-2640':0, '1f6a3-1f3fc-200d-2640':0, '1f6a3-1f3fd-200d-2640':0, '1f6a3-1f3fe-200d-2640':0, '1f6a3-1f3ff-200d-2640':0, '1f6a3-1f3fb-200d-2642':0, '1f6a3-1f3fc-200d-2642':0, '1f6a3-1f3fd-200d-2642':0, '1f6a3-1f3fe-200d-2642':0, '1f6a3-1f3ff-200d-2642':0, '1f6a3-1f3fb':0, '1f6a3-1f3fc':0, '1f6a3-1f3fd':0, '1f6a3-1f3fe':0, '1f6a3-1f3ff':0, '1f6b4-1f3fb-200d-2640':0, '1f6b4-1f3fc-200d-2640':0, '1f6b4-1f3fd-200d-2640':0, '1f6b4-1f3fe-200d-2640':0, '1f6b4-1f3ff-200d-2640':0, '1f6b4-1f3fb-200d-2642':0, '1f6b4-1f3fc-200d-2642':0, '1f6b4-1f3fd-200d-2642':0, '1f6b4-1f3fe-200d-2642':0, '1f6b4-1f3ff-200d-2642':0, '1f6b4-1f3fb':0, '1f6b4-1f3fc':0, '1f6b4-1f3fd':0, '1f6b4-1f3fe':0, '1f6b4-1f3ff':0, '1f6b5-1f3fb-200d-2640':0, '1f6b5-1f3fc-200d-2640':0, '1f6b5-1f3fd-200d-2640':0, '1f6b5-1f3fe-200d-2640':0, '1f6b5-1f3ff-200d-2640':0, '1f6b5-1f3fb-200d-2642':0, '1f6b5-1f3fc-200d-2642':0, '1f6b5-1f3fd-200d-2642':0, '1f6b5-1f3fe-200d-2642':0, '1f6b5-1f3ff-200d-2642':0, '1f6b5-1f3fb':0, '1f6b5-1f3fc':0, '1f6b5-1f3fd':0, '1f6b5-1f3fe':0, '1f6b5-1f3ff':0, '1f6b6-1f3fb-200d-2640':0, '1f6b6-1f3fc-200d-2640':0, '1f6b6-1f3fd-200d-2640':0, '1f6b6-1f3fe-200d-2640':0, '1f6b6-1f3ff-200d-2640':0, '1f6b6-1f3fb-200d-2642':0, '1f6b6-1f3fc-200d-2642':0, '1f6b6-1f3fd-200d-2642':0, '1f6b6-1f3fe-200d-2642':0, '1f6b6-1f3ff-200d-2642':0, '1f6b6-1f3fb':0, '1f6b6-1f3fc':0, '1f6b6-1f3fd':0, '1f6b6-1f3fe':0, '1f6b6-1f3ff':0, '1f6c0-1f3fb':0, '1f6c0-1f3fc':0, '1f6c0-1f3fd':0, '1f6c0-1f3fe':0, '1f6c0-1f3ff':0, '1f6cc-1f3fb':0, '1f6cc-1f3fc':0, '1f6cc-1f3fd':0, '1f6cc-1f3fe':0, '1f6cc-1f3ff':0, '1f90c-1f3fb':0, '1f90c-1f3fc':0, '1f90c-1f3fd':0, '1f90c-1f3fe':0, '1f90c-1f3ff':0, '1f90f-1f3fb':0, '1f90f-1f3fc':0, '1f90f-1f3fd':0, '1f90f-1f3fe':0, '1f90f-1f3ff':0, '1f918-1f3fb':0, '1f918-1f3fc':0, '1f918-1f3fd':0, '1f918-1f3fe':0, '1f918-1f3ff':0, '1f919-1f3fb':0, '1f919-1f3fc':0, '1f919-1f3fd':0, '1f919-1f3fe':0, '1f919-1f3ff':0, '1f91a-1f3fb':0, '1f91a-1f3fc':0, '1f91a-1f3fd':0, '1f91a-1f3fe':0, '1f91a-1f3ff':0, '1f91b-1f3fb':0, '1f91b-1f3fc':0, '1f91b-1f3fd':0, '1f91b-1f3fe':0, '1f91b-1f3ff':0, '1f91c-1f3fb':0, '1f91c-1f3fc':0, '1f91c-1f3fd':0, '1f91c-1f3fe':0, '1f91c-1f3ff':0, '1f91d-1f3fb':0, '1f91d-1f3fc':0, '1f91d-1f3fd':0, '1f91d-1f3fe':0, '1f91d-1f3ff':0, '1f91e-1f3fb':0, '1f91e-1f3fc':0, '1f91e-1f3fd':0, '1f91e-1f3fe':0, '1f91e-1f3ff':0, '1f91f-1f3fb':0, '1f91f-1f3fc':0, '1f91f-1f3fd':0, '1f91f-1f3fe':0, '1f91f-1f3ff':0, '1f926-1f3fb-200d-2640':0, '1f926-1f3fc-200d-2640':0, '1f926-1f3fd-200d-2640':0, '1f926-1f3fe-200d-2640':0, '1f926-1f3ff-200d-2640':0, '1f926-1f3fb-200d-2642':0, '1f926-1f3fc-200d-2642':0, '1f926-1f3fd-200d-2642':0, '1f926-1f3fe-200d-2642':0, '1f926-1f3ff-200d-2642':0, '1f926-1f3fb':0, '1f926-1f3fc':0, '1f926-1f3fd':0, '1f926-1f3fe':0, '1f926-1f3ff':0, '1f930-1f3fb':0, '1f930-1f3fc':0, '1f930-1f3fd':0, '1f930-1f3fe':0, '1f930-1f3ff':0, '1f931-1f3fb':0, '1f931-1f3fc':0, '1f931-1f3fd':0, '1f931-1f3fe':0, '1f931-1f3ff':0, '1f932-1f3fb':0, '1f932-1f3fc':0, '1f932-1f3fd':0, '1f932-1f3fe':0, '1f932-1f3ff':0, '1f933-1f3fb':0, '1f933-1f3fc':0, '1f933-1f3fd':0, '1f933-1f3fe':0, '1f933-1f3ff':0, '1f934-1f3fb':0, '1f934-1f3fc':0, '1f934-1f3fd':0, '1f934-1f3fe':0, '1f934-1f3ff':0, '1f935-1f3fb-200d-2640':0, '1f935-1f3fc-200d-2640':0, '1f935-1f3fd-200d-2640':0, '1f935-1f3fe-200d-2640':0, '1f935-1f3ff-200d-2640':0, '1f935-1f3fb-200d-2642':0, '1f935-1f3fc-200d-2642':0, '1f935-1f3fd-200d-2642':0, '1f935-1f3fe-200d-2642':0, '1f935-1f3ff-200d-2642':0, '1f935-1f3fb':0, '1f935-1f3fc':0, '1f935-1f3fd':0, '1f935-1f3fe':0, '1f935-1f3ff':0, '1f936-1f3fb':0, '1f936-1f3fc':0, '1f936-1f3fd':0, '1f936-1f3fe':0, '1f936-1f3ff':0, '1f937-1f3fb-200d-2640':0, '1f937-1f3fc-200d-2640':0, '1f937-1f3fd-200d-2640':0, '1f937-1f3fe-200d-2640':0, '1f937-1f3ff-200d-2640':0, '1f937-1f3fb-200d-2642':0, '1f937-1f3fc-200d-2642':0, '1f937-1f3fd-200d-2642':0, '1f937-1f3fe-200d-2642':0, '1f937-1f3ff-200d-2642':0, '1f937-1f3fb':0, '1f937-1f3fc':0, '1f937-1f3fd':0, '1f937-1f3fe':0, '1f937-1f3ff':0, '1f938-1f3fb-200d-2640':0, '1f938-1f3fc-200d-2640':0, '1f938-1f3fd-200d-2640':0, '1f938-1f3fe-200d-2640':0, '1f938-1f3ff-200d-2640':0, '1f938-1f3fb-200d-2642':0, '1f938-1f3fc-200d-2642':0, '1f938-1f3fd-200d-2642':0, '1f938-1f3fe-200d-2642':0, '1f938-1f3ff-200d-2642':0, '1f938-1f3fb':0, '1f938-1f3fc':0, '1f938-1f3fd':0, '1f938-1f3fe':0, '1f938-1f3ff':0, '1f939-1f3fb-200d-2640':0, '1f939-1f3fc-200d-2640':0, '1f939-1f3fd-200d-2640':0, '1f939-1f3fe-200d-2640':0, '1f939-1f3ff-200d-2640':0, '1f939-1f3fb-200d-2642':0, '1f939-1f3fc-200d-2642':0, '1f939-1f3fd-200d-2642':0, '1f939-1f3fe-200d-2642':0, '1f939-1f3ff-200d-2642':0, '1f939-1f3fb':0, '1f939-1f3fc':0, '1f939-1f3fd':0, '1f939-1f3fe':0, '1f939-1f3ff':0, '1f93d-1f3fb-200d-2640':0, '1f93d-1f3fc-200d-2640':0, '1f93d-1f3fd-200d-2640':0, '1f93d-1f3fe-200d-2640':0, '1f93d-1f3ff-200d-2640':0, '1f93d-1f3fb-200d-2642':0, '1f93d-1f3fc-200d-2642':0, '1f93d-1f3fd-200d-2642':0, '1f93d-1f3fe-200d-2642':0, '1f93d-1f3ff-200d-2642':0, '1f93d-1f3fb':0, '1f93d-1f3fc':0, '1f93d-1f3fd':0, '1f93d-1f3fe':0, '1f93d-1f3ff':0, '1f93e-1f3fb-200d-2640':0, '1f93e-1f3fc-200d-2640':0, '1f93e-1f3fd-200d-2640':0, '1f93e-1f3fe-200d-2640':0, '1f93e-1f3ff-200d-2640':0, '1f93e-1f3fb-200d-2642':0, '1f93e-1f3fc-200d-2642':0, '1f93e-1f3fd-200d-2642':0, '1f93e-1f3fe-200d-2642':0, '1f93e-1f3ff-200d-2642':0, '1f93e-1f3fb':0, '1f93e-1f3fc':0, '1f93e-1f3fd':0, '1f93e-1f3fe':0, '1f93e-1f3ff':0, '1f977-1f3fb':0, '1f977-1f3fc':0, '1f977-1f3fd':0, '1f977-1f3fe':0, '1f977-1f3ff':0, '1f9b5-1f3fb':0, '1f9b5-1f3fc':0, '1f9b5-1f3fd':0, '1f9b5-1f3fe':0, '1f9b5-1f3ff':0, '1f9b6-1f3fb':0, '1f9b6-1f3fc':0, '1f9b6-1f3fd':0, '1f9b6-1f3fe':0, '1f9b6-1f3ff':0, '1f9b8-1f3fb-200d-2640':0, '1f9b8-1f3fc-200d-2640':0, '1f9b8-1f3fd-200d-2640':0, '1f9b8-1f3fe-200d-2640':0, '1f9b8-1f3ff-200d-2640':0, '1f9b8-1f3fb-200d-2642':0, '1f9b8-1f3fc-200d-2642':0, '1f9b8-1f3fd-200d-2642':0, '1f9b8-1f3fe-200d-2642':0, '1f9b8-1f3ff-200d-2642':0, '1f9b8-1f3fb':0, '1f9b8-1f3fc':0, '1f9b8-1f3fd':0, '1f9b8-1f3fe':0, '1f9b8-1f3ff':0, '1f9b9-1f3fb-200d-2640':0, '1f9b9-1f3fc-200d-2640':0, '1f9b9-1f3fd-200d-2640':0, '1f9b9-1f3fe-200d-2640':0, '1f9b9-1f3ff-200d-2640':0, '1f9b9-1f3fb-200d-2642':0, '1f9b9-1f3fc-200d-2642':0, '1f9b9-1f3fd-200d-2642':0, '1f9b9-1f3fe-200d-2642':0, '1f9b9-1f3ff-200d-2642':0, '1f9b9-1f3fb':0, '1f9b9-1f3fc':0, '1f9b9-1f3fd':0, '1f9b9-1f3fe':0, '1f9b9-1f3ff':0, '1f9bb-1f3fb':0, '1f9bb-1f3fc':0, '1f9bb-1f3fd':0, '1f9bb-1f3fe':0, '1f9bb-1f3ff':0, '1f9cd-1f3fb-200d-2640':0, '1f9cd-1f3fc-200d-2640':0, '1f9cd-1f3fd-200d-2640':0, '1f9cd-1f3fe-200d-2640':0, '1f9cd-1f3ff-200d-2640':0, '1f9cd-1f3fb-200d-2642':0, '1f9cd-1f3fc-200d-2642':0, '1f9cd-1f3fd-200d-2642':0, '1f9cd-1f3fe-200d-2642':0, '1f9cd-1f3ff-200d-2642':0, '1f9cd-1f3fb':0, '1f9cd-1f3fc':0, '1f9cd-1f3fd':0, '1f9cd-1f3fe':0, '1f9cd-1f3ff':0, '1f9ce-1f3fb-200d-2640':0, '1f9ce-1f3fc-200d-2640':0, '1f9ce-1f3fd-200d-2640':0, '1f9ce-1f3fe-200d-2640':0, '1f9ce-1f3ff-200d-2640':0, '1f9ce-1f3fb-200d-2642':0, '1f9ce-1f3fc-200d-2642':0, '1f9ce-1f3fd-200d-2642':0, '1f9ce-1f3fe-200d-2642':0, '1f9ce-1f3ff-200d-2642':0, '1f9ce-1f3fb':0, '1f9ce-1f3fc':0, '1f9ce-1f3fd':0, '1f9ce-1f3fe':0, '1f9ce-1f3ff':0, '1f9cf-1f3fb-200d-2640':0, '1f9cf-1f3fc-200d-2640':0, '1f9cf-1f3fd-200d-2640':0, '1f9cf-1f3fe-200d-2640':0, '1f9cf-1f3ff-200d-2640':0, '1f9cf-1f3fb-200d-2642':0, '1f9cf-1f3fc-200d-2642':0, '1f9cf-1f3fd-200d-2642':0, '1f9cf-1f3fe-200d-2642':0, '1f9cf-1f3ff-200d-2642':0, '1f9cf-1f3fb':0, '1f9cf-1f3fc':0, '1f9cf-1f3fd':0, '1f9cf-1f3fe':0, '1f9cf-1f3ff':0, '1f9d1-1f3fb-200d-1f33e':0, '1f9d1-1f3fc-200d-1f33e':0, '1f9d1-1f3fd-200d-1f33e':0, '1f9d1-1f3fe-200d-1f33e':0, '1f9d1-1f3ff-200d-1f33e':0, '1f9d1-1f3fb-200d-1f373':0, '1f9d1-1f3fc-200d-1f373':0, '1f9d1-1f3fd-200d-1f373':0, '1f9d1-1f3fe-200d-1f373':0, '1f9d1-1f3ff-200d-1f373':0, '1f9d1-1f3fb-200d-1f37c':0, '1f9d1-1f3fc-200d-1f37c':0, '1f9d1-1f3fd-200d-1f37c':0, '1f9d1-1f3fe-200d-1f37c':0, '1f9d1-1f3ff-200d-1f37c':0, '1f9d1-1f3fb-200d-1f384':0, '1f9d1-1f3fc-200d-1f384':0, '1f9d1-1f3fd-200d-1f384':0, '1f9d1-1f3fe-200d-1f384':0, '1f9d1-1f3ff-200d-1f384':0, '1f9d1-1f3fb-200d-1f393':0, '1f9d1-1f3fc-200d-1f393':0, '1f9d1-1f3fd-200d-1f393':0, '1f9d1-1f3fe-200d-1f393':0, '1f9d1-1f3ff-200d-1f393':0, '1f9d1-1f3fb-200d-1f3a4':0, '1f9d1-1f3fc-200d-1f3a4':0, '1f9d1-1f3fd-200d-1f3a4':0, '1f9d1-1f3fe-200d-1f3a4':0, '1f9d1-1f3ff-200d-1f3a4':0, '1f9d1-1f3fb-200d-1f3a8':0, '1f9d1-1f3fc-200d-1f3a8':0, '1f9d1-1f3fd-200d-1f3a8':0, '1f9d1-1f3fe-200d-1f3a8':0, '1f9d1-1f3ff-200d-1f3a8':0, '1f9d1-1f3fb-200d-1f3eb':0, '1f9d1-1f3fc-200d-1f3eb':0, '1f9d1-1f3fd-200d-1f3eb':0, '1f9d1-1f3fe-200d-1f3eb':0, '1f9d1-1f3ff-200d-1f3eb':0, '1f9d1-1f3fb-200d-1f3ed':0, '1f9d1-1f3fc-200d-1f3ed':0, '1f9d1-1f3fd-200d-1f3ed':0, '1f9d1-1f3fe-200d-1f3ed':0, '1f9d1-1f3ff-200d-1f3ed':0, '1f9d1-1f3fb-200d-1f4bb':0, '1f9d1-1f3fc-200d-1f4bb':0, '1f9d1-1f3fd-200d-1f4bb':0, '1f9d1-1f3fe-200d-1f4bb':0, '1f9d1-1f3ff-200d-1f4bb':0, '1f9d1-1f3fb-200d-1f4bc':0, '1f9d1-1f3fc-200d-1f4bc':0, '1f9d1-1f3fd-200d-1f4bc':0, '1f9d1-1f3fe-200d-1f4bc':0, '1f9d1-1f3ff-200d-1f4bc':0, '1f9d1-1f3fb-200d-1f527':0, '1f9d1-1f3fc-200d-1f527':0, '1f9d1-1f3fd-200d-1f527':0, '1f9d1-1f3fe-200d-1f527':0, '1f9d1-1f3ff-200d-1f527':0, '1f9d1-1f3fb-200d-1f52c':0, '1f9d1-1f3fc-200d-1f52c':0, '1f9d1-1f3fd-200d-1f52c':0, '1f9d1-1f3fe-200d-1f52c':0, '1f9d1-1f3ff-200d-1f52c':0, '1f9d1-1f3fb-200d-1f680':0, '1f9d1-1f3fc-200d-1f680':0, '1f9d1-1f3fd-200d-1f680':0, '1f9d1-1f3fe-200d-1f680':0, '1f9d1-1f3ff-200d-1f680':0, '1f9d1-1f3fb-200d-1f692':0, '1f9d1-1f3fc-200d-1f692':0, '1f9d1-1f3fd-200d-1f692':0, '1f9d1-1f3fe-200d-1f692':0, '1f9d1-1f3ff-200d-1f692':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fb-200d-1f9af':0, '1f9d1-1f3fc-200d-1f9af':0, '1f9d1-1f3fd-200d-1f9af':0, '1f9d1-1f3fe-200d-1f9af':0, '1f9d1-1f3ff-200d-1f9af':0, '1f9d1-1f3fb-200d-1f9b0':0, '1f9d1-1f3fc-200d-1f9b0':0, '1f9d1-1f3fd-200d-1f9b0':0, '1f9d1-1f3fe-200d-1f9b0':0, '1f9d1-1f3ff-200d-1f9b0':0, '1f9d1-1f3fb-200d-1f9b1':0, '1f9d1-1f3fc-200d-1f9b1':0, '1f9d1-1f3fd-200d-1f9b1':0, '1f9d1-1f3fe-200d-1f9b1':0, '1f9d1-1f3ff-200d-1f9b1':0, '1f9d1-1f3fb-200d-1f9b2':0, '1f9d1-1f3fc-200d-1f9b2':0, '1f9d1-1f3fd-200d-1f9b2':0, '1f9d1-1f3fe-200d-1f9b2':0, '1f9d1-1f3ff-200d-1f9b2':0, '1f9d1-1f3fb-200d-1f9b3':0, '1f9d1-1f3fc-200d-1f9b3':0, '1f9d1-1f3fd-200d-1f9b3':0, '1f9d1-1f3fe-200d-1f9b3':0, '1f9d1-1f3ff-200d-1f9b3':0, '1f9d1-1f3fb-200d-1f9bc':0, '1f9d1-1f3fc-200d-1f9bc':0, '1f9d1-1f3fd-200d-1f9bc':0, '1f9d1-1f3fe-200d-1f9bc':0, '1f9d1-1f3ff-200d-1f9bc':0, '1f9d1-1f3fb-200d-1f9bd':0, '1f9d1-1f3fc-200d-1f9bd':0, '1f9d1-1f3fd-200d-1f9bd':0, '1f9d1-1f3fe-200d-1f9bd':0, '1f9d1-1f3ff-200d-1f9bd':0, '1f9d1-1f3fb-200d-2695':0, '1f9d1-1f3fc-200d-2695':0, '1f9d1-1f3fd-200d-2695':0, '1f9d1-1f3fe-200d-2695':0, '1f9d1-1f3ff-200d-2695':0, '1f9d1-1f3fb-200d-2696':0, '1f9d1-1f3fc-200d-2696':0, '1f9d1-1f3fd-200d-2696':0, '1f9d1-1f3fe-200d-2696':0, '1f9d1-1f3ff-200d-2696':0, '1f9d1-1f3fb-200d-2708':0, '1f9d1-1f3fc-200d-2708':0, '1f9d1-1f3fd-200d-2708':0, '1f9d1-1f3fe-200d-2708':0, '1f9d1-1f3ff-200d-2708':0, '1f9d1-1f3fb':0, '1f9d1-1f3fc':0, '1f9d1-1f3fd':0, '1f9d1-1f3fe':0, '1f9d1-1f3ff':0, '1f9d2-1f3fb':0, '1f9d2-1f3fc':0, '1f9d2-1f3fd':0, '1f9d2-1f3fe':0, '1f9d2-1f3ff':0, '1f9d3-1f3fb':0, '1f9d3-1f3fc':0, '1f9d3-1f3fd':0, '1f9d3-1f3fe':0, '1f9d3-1f3ff':0, '1f9d4-1f3fb-200d-2640':0, '1f9d4-1f3fc-200d-2640':0, '1f9d4-1f3fd-200d-2640':0, '1f9d4-1f3fe-200d-2640':0, '1f9d4-1f3ff-200d-2640':0, '1f9d4-1f3fb-200d-2642':0, '1f9d4-1f3fc-200d-2642':0, '1f9d4-1f3fd-200d-2642':0, '1f9d4-1f3fe-200d-2642':0, '1f9d4-1f3ff-200d-2642':0, '1f9d4-1f3fb':0, '1f9d4-1f3fc':0, '1f9d4-1f3fd':0, '1f9d4-1f3fe':0, '1f9d4-1f3ff':0, '1f9d5-1f3fb':0, '1f9d5-1f3fc':0, '1f9d5-1f3fd':0, '1f9d5-1f3fe':0, '1f9d5-1f3ff':0, '1f9d6-1f3fb-200d-2640':0, '1f9d6-1f3fc-200d-2640':0, '1f9d6-1f3fd-200d-2640':0, '1f9d6-1f3fe-200d-2640':0, '1f9d6-1f3ff-200d-2640':0, '1f9d6-1f3fb-200d-2642':0, '1f9d6-1f3fc-200d-2642':0, '1f9d6-1f3fd-200d-2642':0, '1f9d6-1f3fe-200d-2642':0, '1f9d6-1f3ff-200d-2642':0, '1f9d6-1f3fb':0, '1f9d6-1f3fc':0, '1f9d6-1f3fd':0, '1f9d6-1f3fe':0, '1f9d6-1f3ff':0, '1f9d7-1f3fb-200d-2640':0, '1f9d7-1f3fc-200d-2640':0, '1f9d7-1f3fd-200d-2640':0, '1f9d7-1f3fe-200d-2640':0, '1f9d7-1f3ff-200d-2640':0, '1f9d7-1f3fb-200d-2642':0, '1f9d7-1f3fc-200d-2642':0, '1f9d7-1f3fd-200d-2642':0, '1f9d7-1f3fe-200d-2642':0, '1f9d7-1f3ff-200d-2642':0, '1f9d7-1f3fb':0, '1f9d7-1f3fc':0, '1f9d7-1f3fd':0, '1f9d7-1f3fe':0, '1f9d7-1f3ff':0, '1f9d8-1f3fb-200d-2640':0, '1f9d8-1f3fc-200d-2640':0, '1f9d8-1f3fd-200d-2640':0, '1f9d8-1f3fe-200d-2640':0, '1f9d8-1f3ff-200d-2640':0, '1f9d8-1f3fb-200d-2642':0, '1f9d8-1f3fc-200d-2642':0, '1f9d8-1f3fd-200d-2642':0, '1f9d8-1f3fe-200d-2642':0, '1f9d8-1f3ff-200d-2642':0, '1f9d8-1f3fb':0, '1f9d8-1f3fc':0, '1f9d8-1f3fd':0, '1f9d8-1f3fe':0, '1f9d8-1f3ff':0, '1f9d9-1f3fb-200d-2640':0, '1f9d9-1f3fc-200d-2640':0, '1f9d9-1f3fd-200d-2640':0, '1f9d9-1f3fe-200d-2640':0, '1f9d9-1f3ff-200d-2640':0, '1f9d9-1f3fb-200d-2642':0, '1f9d9-1f3fc-200d-2642':0, '1f9d9-1f3fd-200d-2642':0, '1f9d9-1f3fe-200d-2642':0, '1f9d9-1f3ff-200d-2642':0, '1f9d9-1f3fb':0, '1f9d9-1f3fc':0, '1f9d9-1f3fd':0, '1f9d9-1f3fe':0, '1f9d9-1f3ff':0, '1f9da-1f3fb-200d-2640':0, '1f9da-1f3fc-200d-2640':0, '1f9da-1f3fd-200d-2640':0, '1f9da-1f3fe-200d-2640':0, '1f9da-1f3ff-200d-2640':0, '1f9da-1f3fb-200d-2642':0, '1f9da-1f3fc-200d-2642':0, '1f9da-1f3fd-200d-2642':0, '1f9da-1f3fe-200d-2642':0, '1f9da-1f3ff-200d-2642':0, '1f9da-1f3fb':0, '1f9da-1f3fc':0, '1f9da-1f3fd':0, '1f9da-1f3fe':0, '1f9da-1f3ff':0, '1f9db-1f3fb-200d-2640':0, '1f9db-1f3fc-200d-2640':0, '1f9db-1f3fd-200d-2640':0, '1f9db-1f3fe-200d-2640':0, '1f9db-1f3ff-200d-2640':0, '1f9db-1f3fb-200d-2642':0, '1f9db-1f3fc-200d-2642':0, '1f9db-1f3fd-200d-2642':0, '1f9db-1f3fe-200d-2642':0, '1f9db-1f3ff-200d-2642':0, '1f9db-1f3fb':0, '1f9db-1f3fc':0, '1f9db-1f3fd':0, '1f9db-1f3fe':0, '1f9db-1f3ff':0, '1f9dc-1f3fb-200d-2640':0, '1f9dc-1f3fc-200d-2640':0, '1f9dc-1f3fd-200d-2640':0, '1f9dc-1f3fe-200d-2640':0, '1f9dc-1f3ff-200d-2640':0, '1f9dc-1f3fb-200d-2642':0, '1f9dc-1f3fc-200d-2642':0, '1f9dc-1f3fd-200d-2642':0, '1f9dc-1f3fe-200d-2642':0, '1f9dc-1f3ff-200d-2642':0, '1f9dc-1f3fb':0, '1f9dc-1f3fc':0, '1f9dc-1f3fd':0, '1f9dc-1f3fe':0, '1f9dc-1f3ff':0, '1f9dd-1f3fb-200d-2640':0, '1f9dd-1f3fc-200d-2640':0, '1f9dd-1f3fd-200d-2640':0, '1f9dd-1f3fe-200d-2640':0, '1f9dd-1f3ff-200d-2640':0, '1f9dd-1f3fb-200d-2642':0, '1f9dd-1f3fc-200d-2642':0, '1f9dd-1f3fd-200d-2642':0, '1f9dd-1f3fe-200d-2642':0, '1f9dd-1f3ff-200d-2642':0, '1f9dd-1f3fb':0, '1f9dd-1f3fc':0, '1f9dd-1f3fd':0, '1f9dd-1f3fe':0, '1f9dd-1f3ff':0, '261d-1f3fb':0, '261d-1f3fc':0, '261d-1f3fd':0, '261d-1f3fe':0, '261d-1f3ff':0, '26f9-1f3fb-200d-2640':0, '26f9-1f3fc-200d-2640':0, '26f9-1f3fd-200d-2640':0, '26f9-1f3fe-200d-2640':0, '26f9-1f3ff-200d-2640':0, '26f9-1f3fb-200d-2642':0, '26f9-1f3fc-200d-2642':0, '26f9-1f3fd-200d-2642':0, '26f9-1f3fe-200d-2642':0, '26f9-1f3ff-200d-2642':0, '26f9-1f3fb':0, '26f9-1f3fc':0, '26f9-1f3fd':0, '26f9-1f3fe':0, '26f9-1f3ff':0, '270a-1f3fb':0, '270a-1f3fc':0, '270a-1f3fd':0, '270a-1f3fe':0, '270a-1f3ff':0, '270b-1f3fb':0, '270b-1f3fc':0, '270b-1f3fd':0, '270b-1f3fe':0, '270b-1f3ff':0, '270c-1f3fb':0, '270c-1f3fc':0, '270c-1f3fd':0, '270c-1f3fe':0, '270c-1f3ff':0, '270d-1f3fb':0, '270d-1f3fc':0, '270d-1f3fd':0, '270d-1f3fe':0, '270d-1f3ff':0}};\n\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\nfor(const version in EmojiVersions) {\n if(version) {\n Object.assign(Emoji, EmojiVersions[version as EMOJI_VERSION]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || navigator.maxTouchPoints > 0) && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LatinizeMap from '../config/latinizeMap';\n\nexport const badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nconst C2L: {[k: string]: string} = {\n 'й': 'q',\n 'ц': 'w',\n 'у': 'e',\n 'к': 'r',\n 'е': 't',\n 'н': 'y',\n 'г': 'u',\n 'ш': 'i',\n 'щ': 'o',\n 'з': 'p',\n 'х': '[',\n 'ъ': ']',\n 'ф': 'a',\n 'ы': 's',\n 'в': 'd',\n 'а': 'f',\n 'п': 'g',\n 'р': 'h',\n 'о': 'j',\n 'л': 'k',\n 'д': 'l',\n 'ж': ';',\n 'э': '\\'',\n 'я': 'z',\n 'ч': 'x',\n 'с': 'c',\n 'м': 'v',\n 'и': 'b',\n 'т': 'n',\n 'ь': 'm',\n 'б': ',',\n 'ю': '.',\n '.': '/'\n};\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function fixCyrillic(text: string) {\n return text.toLowerCase().replace(/[\\wа-я]/g, (ch) => {\n const latinizeCh = C2L[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = LatinizeMap[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n return processSearchText(text, {\n clearBadChars: true,\n latinize,\n ignoreCase: true\n });\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n const originalText = text;\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n if(options.latinize) text += '\\x01' + fixCyrillic(originalText);\n return text;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\n\nconst FILENAME_JOINER = '_';\n\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\n fileName: string,\n downloadId: string\n}>) {\n const fileName = '';// (options?.fileName || '').split('.');\n const ext = fileName[fileName.length - 1] || '';\n\n let str: string;\n switch(location._) {\n case 'inputPhotoFileLocation': {\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputDocumentFileLocation': {\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputPeerPhotoFileLocation':\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\n break;\n\n case 'inputStickerSetThumb': {\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\n location.stickerset._;\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputFileLocation': {\n str = location.volume_id + '_' + location.local_id;\n break;\n }\n\n case 'inputWebFileLocation': {\n str = ['webFile', location.url].join(FILENAME_JOINER);\n break;\n }\n\n default: {\n console.error('Unrecognized location:', location);\n str = '';\n break;\n }\n }\n\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\n}\n\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\n // console.log('getFileURL', location);\n // const perf = performance.now();\n const encoded = encodeURIComponent(JSON.stringify(options));\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\n\n return /* '/' + */type + '/' + encoded;\n}\n","import {RestrictionReason} from '../layer';\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach((reason) => {\n ignore.add(reason);\n });\n}\n","import isObject from '../../../../helpers/object/isObject';\nimport {InputChannel, InputPeer, Peer} from '../../../../layer';\nimport {NULL_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | InputChannel | PeerId | string): PeerId {\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\n // if(typeof(peerId) === 'number') return peerId;\n else if(isObject(peerId)) {\n const userId = (peerId as Peer.peerUser).user_id;\n if(userId !== undefined) {\n return userId.toPeerId(false);\n }\n\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\n if(chatId !== undefined) {\n return chatId.toPeerId(true);\n }\n\n return NULL_PEER_ID; // maybe it is an inputPeerSelf\n // } else if(!peerId) return 'u0';\n } else if(!peerId) return NULL_PEER_ID;\n\n const isUser = (peerId as string).charAt(0) === 'u';\n const peerParams = (peerId as string).substr(1).split('_');\n\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","import type ENVIRONMENT from '.';\n\nlet environment: typeof ENVIRONMENT;\nexport function getEnvironment() {\n return environment;\n}\n\nexport function setEnvironment(env: typeof environment) {\n return environment = env;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\nimport type {Dialog, ForumTopic, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport type {MTAppConfig} from './mtproto/appConfig';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n 'chat_toggle_forum': {chatId: ChatId, enabled: boolean},\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, threadId?: number, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': {peerId: PeerId, threadId?: number},\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog | ForumTopic, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog | ForumTopic},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': Dialog | ForumTopic,\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog | ForumTopic,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map}>,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n\n 'contacts_update': UserId,\n 'avatar_update': {peerId: PeerId, threadId?: number},\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n // 'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n\n 'background_change': void,\n\n 'privacy_update': Update.updatePrivacy,\n\n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n\n 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': void,\n\n 'media_play': void,\n\n 'emoji_recent': AppEmoji,\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\n\n 'premium_toggle': boolean,\n 'premium_toggle_private': {isNew: boolean, isPremium: boolean},\n\n 'config': Config,\n 'app_config': MTAppConfig\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle_private', ({isNew, isPremium}) => {\n this.premium = isPremium;\n\n if(!isNew) {\n this.dispatchEventSingle('premium_toggle', isPremium);\n }\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {State} from '../../config/state';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport setDeepProperty from '../../helpers/object/setDeepProperty';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\n\nexport class AppStateManager {\n private state: State = {} as any;\n private storage = stateStorage;\n\n // ! for mtproto worker use only\n public newVersion: string;\n public oldVersion: string;\n public userId: UserId;\n\n public getState() {\n return Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n\n const first = key.split('.')[0] as keyof State;\n if(first === 'settings') {\n rootScope.dispatchEvent('settings_updated', {key, value, settings: this.state.settings});\n }\n\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true, onlyLocal?: boolean) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value, onlyLocal);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key], onlyLocal?: boolean) {\n MTProtoMessagePort.getInstance().invokeVoid('mirror', {name: 'state', key, value});\n\n this.storage.set({\n [key]: value\n }, onlyLocal);\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\nconst appStateManager = new AppStateManager();\nexport default appStateManager;\n","import getDeepProperty from './getDeepProperty';\n\nexport default function setDeepProperty(object: any, key: string, value: any) {\n const splitted = key.split('.');\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from '../../../helpers/schedulers/pause';\nimport {DcId} from '../../../types';\nimport {logger, LogTypes} from '../../logger';\nimport type MTPNetworker from '../networker';\nimport MTTransport from './transport';\nimport Modes from '../../../config/modes';\n\n \nimport transportController from './controller';\n// import networkStats from '../networkStats';\n \n\nexport default class HTTP implements MTTransport {\n public networker: MTPNetworker;\n private log: ReturnType;\n\n private pending: Array<{\n resolve: (body: Uint8Array) => void,\n reject: any,\n body: Uint8Array\n }> = [];\n private releasing: boolean;\n\n public connected: boolean;\n private destroyed: boolean;\n private debug: boolean;\n\n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\n this.debug = Modes.debug && false;\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n\n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connected = false;\n }\n\n public _send(body: Uint8Array, mode?: RequestMode) {\n const length = body.length;\n this.debug && this.log.debug('-> body length to send:', length);\n\n // networkStats.addSent(this.dcId, length);\n return fetch(this.url, {method: 'POST', body, mode}).then((response) => {\n if(response.status !== 200 && !mode) {\n response.arrayBuffer().then((buffer) => {\n this.log.error('not 200',\n new TextDecoder('utf-8').decode(new Uint8Array(buffer)));\n });\n\n throw response;\n }\n\n this.setConnected(true);\n\n // * test resending by dropping random request\n // if(Math.random() > .5) {\n // throw 'asd';\n // }\n\n return response.arrayBuffer().then((buffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n return new Uint8Array(buffer);\n });\n }, (err) => {\n this.setConnected(false);\n throw err;\n });\n }\n\n private setConnected(connected: boolean) {\n if(this.connected === connected || this.destroyed) {\n return;\n }\n\n this.connected = connected;\n\n \n transportController.setTransportValue('https', connected);\n \n }\n\n public destroy() {\n this.setConnected(false);\n this.destroyed = true;\n this.pending.forEach((pending) => pending.reject());\n this.pending.length = 0;\n }\n\n public send(body: Uint8Array) {\n if(this.networker) {\n return this._send(body);\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending() {\n if(this.releasing) return;\n\n this.releasing = true;\n // this.log('-> messages to send:', this.pending.length);\n for(let i = 0; i < this.pending.length; ++i) {\n const pending = this.pending[i];\n const {body, resolve} = pending;\n\n try {\n const result = await this._send(body);\n resolve(result);\n this.pending.splice(i, 1);\n } catch(err) {\n this.log.error('Send plain request error:', err);\n await pause(5000);\n }\n\n --i;\n }\n\n this.releasing = false;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {logger, LogTypes} from '../../logger';\nimport Modes from '../../../config/modes';\nimport EventListenerBase from '../../../helpers/eventListenerBase';\nimport {MTConnection} from './transport';\n\n// let closeSocketBefore = Date.now() + 30e3;\n// let closeSocketAfter = Date.now() + 10e3;\n\nexport default class Socket extends EventListenerBase<{\n open: () => void,\n message: (buffer: ArrayBuffer) => any,\n close: () => void,\n}> implements MTConnection {\n private ws: WebSocket;\n private log: ReturnType;\n private debug = Modes.debug && false;\n\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\n super();\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n this.connect();\n\n return this;\n }\n\n private removeListeners() {\n if(!this.ws) {\n return;\n }\n\n this.ws.removeEventListener('open', this.handleOpen);\n this.ws.removeEventListener('close', this.handleClose);\n this.ws.removeEventListener('error', this.handleError);\n this.ws.removeEventListener('message', this.handleMessage);\n this.ws = undefined;\n }\n\n private connect() {\n this.ws = new WebSocket(this.url, 'binary');\n this.ws.binaryType = 'arraybuffer';\n this.ws.addEventListener('open', this.handleOpen);\n this.ws.addEventListener('close', this.handleClose);\n this.ws.addEventListener('error', this.handleError);\n this.ws.addEventListener('message', this.handleMessage);\n\n // if(Date.now() < closeSocketBefore) {\n // if(Date.now() >= closeSocketAfter) {\n // this.ws.close();\n // }\n }\n\n public close() {\n if(!this.ws) {\n return;\n }\n\n this.log('close execution');\n\n try {\n this.ws.close();\n } catch(err) {\n\n }\n this.handleClose();\n }\n\n private handleOpen = () => {\n this.log('opened');\n\n this.debug && this.log.debug('sending init packet');\n this.dispatchEvent('open');\n };\n\n private handleError = (e: Event) => {\n this.log.error('handleError', e);\n this.close();\n };\n\n private handleClose = (e?: CloseEvent) => {\n this.log('closed', e/* , this.pending, this.ws.bufferedAmount */);\n\n this.removeListeners();\n this.dispatchEvent('close');\n };\n\n private handleMessage = (event: MessageEvent) => {\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\n\n this.dispatchEvent('message', event.data as ArrayBuffer);\n };\n\n public send = (body: Uint8Array) => {\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n this.ws.send(body);\n };\n}\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n\n return arr;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import aesjs from 'aes-js';\nimport randomize from '../../../helpers/array/randomize';\nimport cryptoMessagePort from '../../crypto/cryptoMessagePort';\nimport {Codec} from './codec';\n\n/*\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\n*/\nexport default class Obfuscation {\n /* private enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\n private dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\n\n private id: number;\n private idPromise: Promise;\n private process: (data: Uint8Array, operation: 'encrypt' | 'decrypt') => ReturnType;\n\n // private cryptoEncKey: CryptoKey;\n // private cryptoDecKey: CryptoKey;\n // private cryptoKey: CryptoKey;\n\n // private encIv: Uint8Array;\n // private decIv: Uint8Array;\n\n // private decIvCounter: Counter;\n\n public async init(codec: Codec) {\n if(this.idPromise !== undefined) {\n this.release();\n }\n\n const initPayload = new Uint8Array(64);\n randomize(initPayload);\n\n while(true) {\n const val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | initPayload[0];\n const val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | initPayload[4];\n if(initPayload[0] !== 0xef &&\n val !== 0x44414548 &&\n val !== 0x54534f50 &&\n val !== 0x20544547 &&\n val !== 0x4954504f &&\n val !== 0xeeeeeeee &&\n val !== 0xdddddddd &&\n val2 !== 0x00000000) {\n // initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\n break;\n }\n randomize(initPayload);\n }\n\n // //////////////////////initPayload.subarray(60, 62).hex = dcId;\n /* initPayload.set(new Uint8Array([161, 208, 67, 71, 118, 109, 20, 111, 113, 255, 134, 10, 159, 241, 7, 44, 217, 82, 187, 76, 108, 131, 200, 186, 33, 57, 177, 251, 52, 34, 18, 54, 65, 105, 37, 89, 38, 20, 47, 168, 126, 181, 24, 138, 212, 68, 60, 150, 225, 37, 181, 4, 201, 50, 72, 151, 168, 143, 204, 169, 81, 187, 241, 23]));\n console.log('initPayload', initPayload); */\n\n const reversedPayload = initPayload.slice().reverse();\n\n const encKey = initPayload.slice(8, 40);\n const encIv = /* this.encIv = */initPayload.slice(40, 56);\n const decKey = reversedPayload.slice(8, 40);\n const decIv = /* this.decIv = */reversedPayload.slice(40, 56);\n\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\n\n // console.log('encKey', encKey.hex, encIv.hex);\n // console.log('decKey', decKey.hex, decIv.hex);\n\n const idPromise = this.idPromise = cryptoMessagePort.invokeCrypto('aes-ctr-prepare', {\n encKey,\n encIv,\n decKey,\n decIv\n });\n\n this.process = async(data, operation) => {\n await idPromise;\n return this._process(data, operation);\n };\n\n this.id = await idPromise;\n\n this.process = this._process;\n\n // this.decIvCounter = new Counter(this.decIv);\n /* const key = this.cryptoEncKey = await subtle.importKey(\n 'raw',\n encKey,\n {name: 'AES-CTR'},\n false,\n ['encrypt']\n ); */\n\n // this.cryptoDecKey = await subtle.importKey(\n // 'raw',\n // decKey,\n // {name: 'AES-CTR'},\n // false,\n // ['encrypt']\n // );\n\n // this.cryptoKey = await subtle.importKey(\n // 'raw',\n // encKey,\n // {name: 'AES-CTR'},\n // false,\n // ['encrypt', 'decrypt']\n // );\n\n initPayload.set(codec.obfuscateTag, 56);\n const encrypted = await this.encode(initPayload.slice());\n\n // console.log('encrypted', encrypted);\n\n initPayload.set(encrypted.slice(56, 64), 56);\n\n return initPayload;\n }\n\n /* public encode(payload: Uint8Array) {\n let startTime = performance.now();\n let res = this.enc.encrypt(payload);\n let time = performance.now() - startTime;\n\n try {\n startTime = performance.now();\n let arr = this.encNew.encrypt(payload);\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\n let resNew = new Uint8Array(bytesFromWordss(arr));\n let time2 = performance.now() - startTime;\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\n } catch(err) {\n console.error('Obfuscation: error:', err);\n }\n\n return res;\n }\n\n public decode(payload: Uint8Array) {\n let res = this.dec.encrypt(payload);\n\n try {\n let arr = this.decNew.decrypt(payload);\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\n let resNew = new Uint8Array(bytesFromWordss(arr));\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\n } catch(err) {\n console.error('Obfuscation: error:', err);\n }\n\n return res;\n } */\n\n private _process = (data: Uint8Array, operation: 'encrypt' | 'decrypt') => {\n return cryptoMessagePort.invokeCryptoNew({\n method: 'aes-ctr-process',\n args: [{id: this.id, data, operation}],\n transfer: [data.buffer]\n }) as Promise;\n };\n\n public encode(payload: Uint8Array) {\n /* return subtle.encrypt({\n name: 'AES-CTR',\n counter: this.encIv,\n length: 64\n },\n this.cryptoEncKey,\n payload\n ); */\n return this.process(payload, 'encrypt');\n }\n\n public decode(payload: Uint8Array) {\n return this.process(payload, 'decrypt');\n }\n\n public async release() {\n const idPromise = this.idPromise;\n if(idPromise === undefined) {\n return;\n }\n\n this.id = undefined;\n this.idPromise = undefined;\n\n const id = await idPromise;\n cryptoMessagePort.invokeCrypto('aes-ctr-destroy', id);\n }\n\n public destroy() {\n this.release();\n }\n\n // public encode(payload: Uint8Array) {\n // let res = this.encNew.encrypt(payload);\n // let bytes = new Uint8Array(bytesFromWordss(res));\n\n // return bytes;\n // }\n\n // public async decode(payload: Uint8Array) {\n // const counter = this.decIvCounter.counter.slice();\n // this.decIvCounter.increment();\n\n // const n: ArrayBuffer = await subtle.encrypt({\n // name: 'AES-CTR',\n // counter: counter,\n // length: 64\n // },\n // this.cryptoDecKey,\n // payload\n // );\n\n // const decoded = this.decNew.update(payload);\n\n // console.log('decode', bytesToHex(decoded), 'new', n, bytesToHex(new Uint8Array(n)));\n\n // return decoded;\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { bytesFromHex, addPadding } from \"../../bin_utils\";\nimport {Codec} from './codec';\n\nclass AbridgedPacketCodec implements Codec {\n public tag = 0xef;\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\n\n public encodePacket(data: Uint8Array) {\n const len = data.byteLength >> 2;\n let header: Uint8Array;\n if(len < 127) {\n header = new Uint8Array([len]);\n } else { // Length: payload length, divided by four, and encoded as 3 length bytes (little endian)\n // header = new Uint8Array([0x7f, ...addPadding(bytesFromHex(len.toString(16)).reverse(), 3, true)/* .reverse() */]);\n header = new Uint8Array([0x7f, len & 0xFF, (len >> 8) & 0xFF, (len >> 16) & 0xFF]);\n // console.log('got nobody cause im braindead', header, len);\n }\n\n return header.concat(data);\n // return new Uint8Array([...header, ...data]);\n }\n\n public readPacket(data: Uint8Array) {\n let length = data[0];\n if(length >= 127) { // 0x7f\n length = data[1] | (data[2] << 8) | (data[3] << 16);\n\n return data.slice(4, length << 2 + 1); // need +1\n }\n\n return data.slice(1, length << 2 + 1); // need +1\n }\n}\n\nexport default new AbridgedPacketCodec();\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../../../config/modes';\nimport {logger, LogTypes} from '../../logger';\nimport MTPNetworker from '../networker';\nimport Obfuscation from './obfuscation';\nimport MTTransport, {MTConnection, MTConnectionConstructable} from './transport';\n// import intermediatePacketCodec from './intermediate';\nimport abridgedPacketCodec from './abridged';\n// import paddedIntermediatePacketCodec from './padded';\nimport {ConnectionStatus} from '../connectionStatus';\n\n \nimport transportController from './controller';\nimport bytesToHex from '../../../helpers/bytes/bytesToHex';\n// import networkStats from '../networkStats';\nimport ctx from '../../../environment/ctx';\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = abridgedPacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType;\n public connected = false;\n private lastCloseTime: number;\n public connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n private releasingPending: boolean;\n\n // private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(\n private Connection: MTConnectionConstructable,\n private dcId: number,\n private url: string,\n private logSuffix: string,\n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connect();\n }\n\n private onOpen = async() => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = await this.obfuscation.init(this.codec);\n if(!this.connected) {\n return;\n }\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n }/* else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n } */\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = async(buffer: ArrayBuffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n\n let data = await this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n // this.pending = this.pending.filter((p) => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then((response) => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n // this.releasePending();\n }).catch((err) => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n // this.dd();\n return;\n }\n\n // console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', bytesToHex(data));\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n\n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n\n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = ctx.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n \n if(this.connected) {\n transportController.setTransportClosed('websocket');\n }\n \n\n this.connected = false;\n\n if(this.connection) {\n this.connection.removeEventListener('open', this.onOpen);\n this.connection.removeEventListener('close', this.onClose);\n this.connection.removeEventListener('message', this.onMessage);\n this.connection = undefined;\n }\n }\n\n /**\n * invoke only when closed\n */\n public reconnect = () => {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n if(this.connection) {\n return;\n }\n\n this.log('trying to reconnect...');\n this.lastCloseTime = Date.now();\n\n if(!this.networker) {\n for(const pending of this.pending) {\n if(pending.bodySent) {\n pending.bodySent = false;\n }\n }\n } else {\n this.networker.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.connect();\n }\n\n public forceReconnect() {\n this.close();\n this.reconnect();\n }\n\n public destroy() {\n this.setAutoReconnect(false);\n this.close();\n\n if(this.obfuscation) {\n this.obfuscation.destroy();\n }\n\n this.pending.forEach((pending) => {\n if(pending.reject) {\n pending.reject();\n }\n });\n this.pending.length = 0;\n }\n\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n public changeUrl(url: string) {\n if(this.url === url) {\n return;\n }\n\n this.url = url;\n this.forceReconnect();\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n // this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n // this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = /* this.connected ? this.encodeBody(body) : */undefined;\n\n // return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending(/* tt = false */) {\n if(!this.connected || this.releasingPending) {\n // this.connect();\n return;\n }\n\n this.releasingPending = true;\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n // this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n let sent = false;\n // for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n if(!pending) {\n break;\n }\n\n const {body, bodySent} = pending;\n if(body && !bodySent) {\n // this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n // if(!encoded) {\n // encoded = pending.encoded = this.encodeBody(body);\n // }\n\n const encoded = pending.encoded ??= await this.encodeBody(body);\n if(!this.connected) {\n break;\n }\n\n // networkStats.addSent(this.dcId, encoded.byteLength);\n this.connection.send(encoded);\n\n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n sent = true;\n // delete pending.body;\n }\n }\n\n this.releasingPending = undefined;\n\n if(this.pending.length && sent) {\n this.releasePending();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport MTTransport, {MTConnectionConstructable} from './transports/transport';\nimport Modes from '../../config/modes';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\n\n \nimport HTTP from './transports/http';\n \n\n \nimport Socket from './transports/websocket';\nimport TcpObfuscated from './transports/tcpObfuscated';\nimport {IS_WEB_WORKER} from '../../helpers/context';\nimport {DcId} from '../../types';\nimport {getEnvironment} from '../../environment/utils';\n\n \n \n \n\n \n\nexport type TransportType = 'websocket' | 'https' | 'http';\nexport type ConnectionType = 'client' | 'download' | 'upload';\ntype Servers = {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTTransport[]\n }\n }\n};\n\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\nconst PREMIUM_SUFFIX = '_premium';\n\nexport function getTelegramConnectionSuffix(connectionType: ConnectionType) {\n return connectionType === 'client' ? '' : '-1';\n}\n\n \nexport function constructTelegramWebSocketUrl(dcId: DcId, connectionType: ConnectionType, premium?: boolean) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const path = connectionType !== 'client' ? 'apiws' + TEST_SUFFIX + (premium ? PREMIUM_SUFFIX : '') : ('apiws' + TEST_SUFFIX);\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\n\n return chosenServer;\n}\n \n\nexport class DcConfigurator {\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\n\n private dcOptions = Modes.test ?\n [\n {id: 1, host: '149.154.175.10', port: 80},\n {id: 2, host: '149.154.167.40', port: 80},\n {id: 3, host: '149.154.175.117', port: 80}\n ] :\n [\n {id: 1, host: '149.154.175.50', port: 80},\n {id: 2, host: '149.154.167.50', port: 80},\n {id: 3, host: '149.154.175.100', port: 80},\n {id: 4, host: '149.154.167.91', port: 80},\n {id: 5, host: '149.154.171.5', port: 80}\n ];\n\n public chosenServers: Servers = {} as any;\n\n \n private transportSocket = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n const chosenServer = constructTelegramWebSocketUrl(dcId, connectionType, premium);\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\n\n let oooohLetMeLive: MTConnectionConstructable;\n \n oooohLetMeLive = Socket;\n \n \n \n\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\n };\n \n\n \n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n let chosenServer: string;\n if(Modes.ssl || !Modes.http) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const subdomain = this.sslSubdomains[dcId - 1] + suffix;\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\n } else {\n for(const dcOption of this.dcOptions) {\n if(dcOption.id === dcId) {\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\n break;\n }\n }\n }\n\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n return new HTTP(dcId, chosenServer, logSuffix);\n };\n \n\n public chooseServer(\n dcId: DcId,\n connectionType: ConnectionType = 'client',\n transportType: TransportType = Modes.transport,\n reuse = true,\n premium?: boolean\n ) {\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\n connectionType = 'client';\n } */\n\n if(!this.chosenServers.hasOwnProperty(transportType)) {\n this.chosenServers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const servers = this.chosenServers[transportType][connectionType];\n\n if(!(dcId in servers)) {\n servers[dcId] = [];\n }\n\n const transports = servers[dcId];\n\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\n let transport: MTTransport;\n\n \n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, premium);\n \n \n \n \n \n\n if(!transport) {\n console.error('No chosenServer!', dcId);\n return null;\n }\n\n if(reuse) {\n transports.push(transport);\n }\n\n return transport;\n }\n\n return transports[0];\n }\n\n public static removeTransport(obj: any, transport: T) {\n for(const transportType in obj) {\n // @ts-ignore\n for(const connectionType in obj[transportType]) {\n // @ts-ignore\n for(const dcId in obj[transportType][connectionType]) {\n // @ts-ignore\n const transports: T[] = obj[transportType][connectionType][dcId];\n indexOfAndSplice(transports, transport);\n }\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../../config/app';\nimport deferredPromise from '../../../helpers/cancellablePromise';\nimport EventListenerBase from '../../../helpers/eventListenerBase';\nimport pause from '../../../helpers/schedulers/pause';\nimport {TransportType, DcConfigurator} from '../dcConfigurator';\nimport type HTTP from './http';\nimport type TcpObfuscated from './tcpObfuscated';\nimport MTTransport from './transport';\n\nexport class MTTransportController extends EventListenerBase<{\n change: (opened: MTTransportController['opened']) => void,\n transport: (type: TransportType) => void\n}> {\n private opened: Map;\n private transports: {[k in TransportType]?: MTTransport};\n private pinging: boolean;\n private dcConfigurator: DcConfigurator;\n\n constructor() {\n super(true);\n\n this.opened = new Map();\n /* this.addEventListener('change', (opened) => {\n this.dispatchEvent('transport', opened.get('websocket') || !opened.get('https') ? 'websocket' : 'https');\n }); */\n\n this.addEventListener('change', (opened) => {\n if(!opened.get('websocket')) {\n this.waitForWebSocket();\n }\n });\n\n // setTimeout(() => {\n // this.waitForWebSocket();\n // }, 200); // wait for first transport so won't have delay for first WS\n }\n\n public async pingTransports() {\n const dcConfigurator = this.dcConfigurator ??= new DcConfigurator();\n const timeout = 2000;\n const transports: {[k in TransportType]?: MTTransport} = this.transports = {\n https: dcConfigurator.chooseServer(App.baseDcId, 'client', 'https', false),\n websocket: dcConfigurator.chooseServer(App.baseDcId, 'client', 'websocket', false)\n };\n\n const httpPromise = deferredPromise();\n ((this.transports.https as HTTP)._send(new Uint8Array(), 'no-cors') as any as Promise)\n .then(() => httpPromise.resolve(true), () => httpPromise.resolve(false));\n setTimeout(() => httpPromise.resolve(false), timeout);\n\n const websocketPromise = deferredPromise();\n const socket = transports.websocket as TcpObfuscated;\n socket.setAutoReconnect(false);\n socket.connection.addEventListener('close', () => websocketPromise.resolve(false), {once: true});\n socket.connection.addEventListener('open', () => websocketPromise.resolve(true), {once: true});\n setTimeout(() => {\n if(websocketPromise.isFulfilled || websocketPromise.isRejected) {\n return;\n }\n\n if(socket.connection) {\n socket.connection.close();\n }\n\n websocketPromise.resolve(false);\n }, timeout);\n\n const [isHttpAvailable, isWebSocketAvailable] = await Promise.all([httpPromise, websocketPromise]);\n\n for(const transportType in transports) {\n const transport = transports[transportType as TransportType];\n transport.destroy();\n }\n\n const result = {\n https: isHttpAvailable || this.opened.get('https') > 0,\n websocket: isWebSocketAvailable || this.opened.get('websocket') > 0\n };\n\n // result.websocket = false;\n return result;\n }\n\n public async waitForWebSocket() {\n if(this.pinging) return;\n this.pinging = true;\n\n while(true) {\n const {https, websocket} = await this.pingTransports();\n if(https || websocket) {\n this.dispatchEvent('transport', websocket || !https ? 'websocket' : 'https');\n }\n\n if(websocket) {\n break;\n }\n\n await pause(10000);\n }\n\n this.pinging = false;\n }\n\n public setTransportValue(type: TransportType, value: boolean) {\n let length = this.opened.get(type) || 0;\n length += value ? 1 : -1;\n\n this.opened.set(type, length);\n this.dispatchEvent('change', this.opened);\n }\n\n public setTransportOpened(type: TransportType) {\n return this.setTransportValue(type, true);\n }\n\n public setTransportClosed(type: TransportType) {\n return this.setTransportValue(type, false);\n }\n}\n\nconst transportController = new MTTransportController();\nexport default transportController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise, {CancellablePromise} from '../../../../helpers/cancellablePromise';\nimport type {StoragesResults} from './loadStorages';\n\nconst RESET_STORAGES_PROMISE: CancellablePromise> = deferredPromise();\nexport default RESET_STORAGES_PROMISE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {CryptoMessagePort} from '../crypto/cryptoMessagePort';\nimport type {ApiFileManager} from '../mtproto/apiFileManager';\nimport type {ApiManager} from '../mtproto/apiManager';\nimport type {Authorizer} from '../mtproto/authorizer';\nimport type {DcConfigurator} from '../mtproto/dcConfigurator';\nimport type {NetworkerFactory} from '../mtproto/networkerFactory';\nimport type {PasswordManager} from '../mtproto/passwordManager';\nimport type {ReferenceDatabase} from '../mtproto/referenceDatabase';\nimport type {TimeManager} from '../mtproto/timeManager';\nimport type {RootScope} from '../rootScope';\nimport type DialogsStorage from '../storages/dialogs';\nimport type FiltersStorage from '../storages/filters';\nimport type PeersStorage from '../storages/peers';\nimport type ThumbsStorage from '../storages/thumbs';\nimport type {ApiUpdatesManager} from './apiUpdatesManager';\nimport type {AppAvatarsManager} from './appAvatarsManager';\nimport type {AppCallsManager} from './appCallsManager';\nimport type {AppChatsManager} from './appChatsManager';\nimport type {AppDocsManager} from './appDocsManager';\nimport type {AppDraftsManager} from './appDraftsManager';\nimport type {AppEmojiManager} from './appEmojiManager';\nimport type {AppGroupCallsManager} from './appGroupCallsManager';\nimport type {AppInlineBotsManager} from './appInlineBotsManager';\nimport type {AppMessagesIdsManager} from './appMessagesIdsManager';\nimport type {AppMessagesManager} from './appMessagesManager';\nimport type {AppNotificationsManager} from './appNotificationsManager';\nimport type AppPaymentsManager from './appPaymentsManager';\nimport type {AppPeersManager} from './appPeersManager';\nimport type {AppPhotosManager} from './appPhotosManager';\nimport type {AppPollsManager} from './appPollsManager';\nimport type {AppPrivacyManager} from './appPrivacyManager';\nimport type {AppProfileManager} from './appProfileManager';\nimport type {AppReactionsManager} from './appReactionsManager';\nimport type {AppStateManager} from './appStateManager';\nimport type {AppStickersManager} from './appStickersManager';\nimport type {AppStoragesManager} from './appStoragesManager';\nimport type {AppUsersManager} from './appUsersManager';\nimport type AppWebDocsManager from './appWebDocsManager';\nimport type {AppWebPagesManager} from './appWebPagesManager';\nimport type AppAttachMenuBotsManager from './appAttachMenuBotsManager';\nimport type AppSeamlessLoginManager from './appSeamlessLoginManager';\nimport type {AppManagers} from './managers';\n\nexport class AppManager {\n protected appPeersManager: AppPeersManager;\n protected appChatsManager: AppChatsManager;\n protected appDocsManager: AppDocsManager;\n protected appPhotosManager: AppPhotosManager;\n protected appPollsManager: AppPollsManager;\n protected appUsersManager: AppUsersManager;\n protected appWebPagesManager: AppWebPagesManager;\n protected appDraftsManager: AppDraftsManager;\n protected appProfileManager: AppProfileManager;\n protected appNotificationsManager: AppNotificationsManager;\n protected apiUpdatesManager: ApiUpdatesManager;\n protected appAvatarsManager: AppAvatarsManager;\n protected appGroupCallsManager: AppGroupCallsManager;\n protected appCallsManager: AppCallsManager;\n protected appReactionsManager: AppReactionsManager;\n protected appMessagesManager: AppMessagesManager;\n protected appMessagesIdsManager: AppMessagesIdsManager;\n protected appPrivacyManager: AppPrivacyManager;\n protected appInlineBotsManager: AppInlineBotsManager;\n protected appStickersManager: AppStickersManager;\n protected referenceDatabase: ReferenceDatabase;\n protected appEmojiManager: AppEmojiManager;\n protected dialogsStorage: DialogsStorage;\n protected filtersStorage: FiltersStorage;\n protected apiManager: ApiManager;\n // protected apiManager: ApiManagerProxy;\n protected passwordManager: PasswordManager;\n protected cryptoWorker: CryptoMessagePort;\n protected apiFileManager: ApiFileManager;\n protected peersStorage: PeersStorage;\n protected thumbsStorage: ThumbsStorage;\n protected networkerFactory: NetworkerFactory;\n protected rootScope: RootScope;\n protected authorizer: Authorizer;\n protected dcConfigurator: DcConfigurator;\n protected timeManager: TimeManager;\n protected appStoragesManager: AppStoragesManager;\n protected appStateManager: AppStateManager;\n protected appWebDocsManager: AppWebDocsManager;\n protected appPaymentsManager: AppPaymentsManager;\n protected appAttachMenuBotsManager: AppAttachMenuBotsManager;\n protected appSeamlessLoginManager: AppSeamlessLoginManager;\n\n public clear: (init?: boolean) => void;\n\n public setManagers(managers: AppManagers) {\n Object.assign(this, managers);\n // this.after();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type{Chat} from '../../../../layer';\nimport type{Dialog} from '../../appMessagesManager';\nimport type{User} from '../../appUsersManager';\nimport type {StoragesStorages} from './createStorages';\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\nimport {Awaited} from '../../../../types';\nimport {logger} from '../../../logger';\nimport RESET_STORAGES_PROMISE from './resetStoragesPromise';\n\nexport type StoragesResults = Awaited>;\n\nasync function loadStoragesInner(storages: StoragesStorages) {\n const recordPromise = recordPromiseBound(logger('STORAGES-LOADER'));\n const storagesKeys = Object.keys(storages) as Array;\n const storagesPromises: Promise[] = storagesKeys.map((key) => {\n const promise = storages[key].getAll();\n return recordPromise(promise, 'storage ' + (key as any as string));\n });\n\n const storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n const arr = await Promise.all(storagesPromises);\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n const resetStorages = await RESET_STORAGES_PROMISE;\n if(resetStorages.size) {\n for(const key of resetStorages) {\n storagesResults[key].length = 0;\n }\n\n resetStorages.clear();\n }\n\n return storagesResults;\n}\n\nlet promise: ReturnType;\nexport default function loadStorages(storages: StoragesStorages) {\n return promise ??= loadStoragesInner(storages);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {logger} from '../logger';\nimport {AppManager} from './manager';\nimport createStorages from './utils/storages/createStorages';\nimport loadStorages from './utils/storages/loadStorages';\n\nexport class AppStoragesManager extends AppManager {\n private storages: ReturnType;\n\n // private loadPromise: CancellablePromise;\n\n private log: ReturnType;\n\n constructor() {\n super();\n\n this.log = logger('STORAGES');\n this.storages = createStorages();\n // this.loadPromise = deferredPromise();\n }\n\n public loadStorages() {\n return loadStorages(this.storages);\n // loadStorages(this.storages).then((storagesResults) => {\n // this.loadPromise.resolve(storagesResults);\n // });\n\n // return this.loadPromise;\n }\n\n // public setStoragesResults(storagesResults: StoragesResults) {\n // this.loadPromise.resolve(storagesResults);\n // }\n\n public async loadStorage(name: T) {\n return this.loadStorages().then((storagesResults) => {\n return {\n storage: this.storages[name],\n results: storagesResults[name]\n };\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Chat} from '../../../../layer';\nimport type {Dialog} from '../../appMessagesManager';\nimport type {User} from '../../appUsersManager';\nimport DATABASE_STATE from '../../../../config/databases/state';\nimport AppStorage from '../../../storage';\n\nexport type StoragesStorages = {\n users: AppStorage, typeof DATABASE_STATE>,\n chats: AppStorage, typeof DATABASE_STATE>,\n dialogs: AppStorage, typeof DATABASE_STATE>\n};\n\nexport default function createStorages() {\n const names: (keyof StoragesStorages)[] = ['users', 'chats', 'dialogs'];\n const storages: StoragesStorages = {} as any;\n for(const name of names) {\n // @ts-ignore\n storages[name] = new AppStorage(DATABASE_STATE, name);\n }\n\n return storages;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\nimport randomize from '../../helpers/array/randomize';\nimport {AppManager} from '../appManagers/manager';\n\nexport class PasswordManager extends AppManager {\n public getState(): Promise {\n return this.apiManager.invokeApi('account.getPassword').then((result) => {\n return result;\n });\n }\n\n public updateSettings(settings: {\n hint?: string,\n email?: string,\n newPassword?: string,\n currentPassword?: string\n } = {}) {\n // state = Object.assign({}, state);\n // state.new_algo = Object.assign({}, state.new_algo);\n\n return this.getState().then((state) => {\n let currentHashPromise: Promise;\n let newHashPromise: Promise;\n const params: AccountUpdatePasswordSettings = {\n password: null,\n new_settings: {\n _: 'account.passwordInputSettings',\n hint: settings.hint,\n email: settings.email\n }\n };\n\n if(settings.currentPassword) {\n currentHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\n } else {\n currentHashPromise = Promise.resolve({\n _: 'inputCheckPasswordEmpty'\n });\n }\n\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\n randomize(salt1);\n salt1.set(newAlgo.salt1, 0);\n newAlgo.salt1 = salt1;\n\n if(settings.newPassword) {\n newHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\n } else {\n newHashPromise = Promise.resolve(new Uint8Array());\n }\n\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\n params.password = hashes[0];\n params.new_settings.new_algo = newAlgo;\n params.new_settings.new_password_hash = hashes[1];\n\n return this.apiManager.invokeApi('account.updatePasswordSettings', params);\n });\n });\n }\n\n public getInputCheckPassword(password: string, state: AccountPassword) {\n return this.cryptoWorker.invokeCrypto('computeSRP', password, state, false) as Promise;\n }\n\n public check(password: string, state: AccountPassword, options: any = {}) {\n return this.getInputCheckPassword(password, state).then((inputCheckPassword) => {\n // console.log('SRP', inputCheckPassword);\n return this.apiManager.invokeApi('auth.checkPassword', {\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\n }, options).then((auth) => {\n if(auth._ === 'auth.authorization') {\n this.apiManager.setUser(auth.user);\n }\n\n return auth;\n });\n });\n }\n\n public confirmPasswordEmail(code: string) {\n return this.apiManager.invokeApi('account.confirmPasswordEmail', {code});\n }\n\n public resendPasswordEmail() {\n return this.apiManager.invokeApi('account.resendPasswordEmail');\n }\n\n public cancelPasswordEmail() {\n return this.apiManager.invokeApi('account.cancelPasswordEmail');\n }\n\n /* public requestRecovery(options: any = {}) {\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\n }\n\n public recover(code: any, options: any = {}) {\n return apiManager.invokeApi('auth.recoverPassword', {\n code\n }, options);\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Photo} from '../../layer';\nimport {logger} from '../logger';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport {AppManager} from '../appManagers/manager';\nimport makeError from '../../helpers/makeError';\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage | ReferenceContext.referenceContextEmojiesSounds | ReferenceContext.referenceContextReactions | ReferenceContext.referenceContextUserFull | ReferenceContext.referenceContextCustomEmoji | ReferenceContext.referenceContextAttachMenuBotIcon;\nexport namespace ReferenceContext {\n export type referenceContextProfilePhoto = {\n type: 'profilePhoto',\n peerId: PeerId\n };\n\n export type referenceContextMessage = {\n type: 'message',\n peerId: PeerId,\n messageId: number\n };\n\n export type referenceContextEmojiesSounds = {\n type: 'emojiesSounds'\n };\n\n export type referenceContextReactions = {\n type: 'reactions'\n };\n\n export type referenceContextUserFull = {\n type: 'userFull',\n userId: UserId\n };\n\n export type referenceContextCustomEmoji = {\n type: 'customEmoji',\n docId: DocId\n };\n\n export type referenceContextAttachMenuBotIcon = {\n type: 'attachMenuBotIcon',\n botId: BotId\n };\n}\n\nexport type ReferenceBytes = Photo.photo['file_reference'];\nexport type ReferenceContexts = Set;\n\n// type ReferenceBytes = Uint8Array;\n\nexport class ReferenceDatabase extends AppManager {\n private contexts: Map = new Map();\n // private references: Map = new Map();\n private links: {[hex: string]: ReferenceBytes} = {};\n private log = logger('RD', undefined, true);\n private refreshEmojiesSoundsPromise: Promise;\n\n // constructor() {\n // super();\n\n // apiManager.addTaskListener('refreshReference', (task: RefreshReferenceTask) => {\n // const originalPayload = task.payload;\n\n // assumeType(task);\n // task.originalPayload = originalPayload;\n\n // this.refreshReference(originalPayload).then((bytes) => {\n // task.payload = bytes;\n // }, (err) => {\n // task.error = err;\n // }).then(() => apiManager.postMessage(task));\n // });\n // }\n\n public saveContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(!contexts) {\n contexts = new Set();\n this.contexts.set(reference, contexts);\n }\n\n this.links[bytesToHex(reference)] = reference;\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n return;\n }\n }\n\n contexts.add(context);\n }\n\n public getReferenceByLink(reference: ReferenceBytes) {\n return this.links[bytesToHex(reference)];\n }\n\n public getContexts(reference: ReferenceBytes): [ReferenceContexts, ReferenceBytes] {\n const contexts = this.contexts.get(reference) || (reference = this.getReferenceByLink(reference) || reference, this.contexts.get(reference));\n return [contexts, reference];\n }\n\n public getContext(reference: ReferenceBytes): [ReferenceContext, ReferenceBytes] {\n const contexts = this.getContexts(reference);\n return contexts[0] ? [contexts[0].values().next().value, contexts[1]] : undefined;\n }\n\n public deleteContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(contexts) {\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n contexts.delete(_context);\n if(!contexts.size) {\n this.contexts.delete(reference);\n delete this.links[bytesToHex(reference)];\n }\n return true;\n }\n }\n }\n\n return false;\n }\n\n public refreshReference(reference: ReferenceBytes, context?: ReferenceContext): Promise {\n this.log('refreshReference: start', reference.slice(), context);\n if(!context) {\n const c = this.getContext(reference);\n if(!c) {\n this.log('refreshReference: got no context for reference:', reference.slice());\n return Promise.reject('NO_CONTEXT');\n }\n\n [context, reference] = c;\n }\n\n let promise: Promise;\n switch(context?.type) {\n case 'message': {\n promise = this.appMessagesManager.reloadMessages(context.peerId, context.messageId, true);\n break;\n // .then(() => {\n // console.log('FILE_REFERENCE_EXPIRED: got message', context, appMessagesManager.getMessage((context as ReferenceContext.referenceContextMessage).messageId).media, reference);\n // });\n }\n\n case 'emojiesSounds': {\n promise = this.refreshEmojiesSoundsPromise || this.appStickersManager.getAnimatedEmojiSounds(true).then(() => {\n this.refreshEmojiesSoundsPromise = undefined;\n });\n break;\n }\n\n case 'userFull': {\n promise = Promise.resolve(this.appProfileManager.getProfile(context.userId, true));\n break;\n }\n\n case 'customEmoji': {\n promise = this.appEmojiManager.getCustomEmojiDocuments([context.docId]);\n break;\n }\n\n case 'attachMenuBotIcon': {\n promise = this.appAttachMenuBotsManager.getAttachMenuBot(context.botId, true) as any;\n break;\n }\n\n default: {\n this.log.warn('refreshReference: not implemented context', context);\n return Promise.reject();\n }\n }\n\n const hex = bytesToHex(reference);\n this.log('refreshReference: refreshing reference:', hex);\n return promise.then(() => {\n const newHex = bytesToHex(reference);\n this.log('refreshReference: refreshed, reference before:', hex, 'after:', newHex);\n if(hex !== newHex) {\n return reference;\n }\n\n this.deleteContext(reference, context);\n\n const newContext = this.getContext(reference);\n if(newContext) {\n return this.refreshReference(reference, newContext[0]);\n }\n\n this.log.error('refreshReference: no new context, reference before:', hex, 'after:', newHex, context);\n\n throw makeError('NO_NEW_CONTEXT');\n });\n }\n\n /* public replaceReference(oldReference: ReferenceBytes, newReference: ReferenceBytes) {\n const contexts = this.contexts.get(oldReference);\n if(contexts) {\n this.contexts.delete(oldReference);\n this.contexts.set(newReference, contexts);\n }\n } */\n}\n","export default function safeReplaceObject(wasObject: any, newObject: any) {\n if(!wasObject) {\n return newObject;\n }\n\n for(var key in wasObject) {\n if(!newObject.hasOwnProperty(key)) {\n delete wasObject[key];\n }\n }\n\n for(var key in newObject) {\n // if (newObject.hasOwnProperty(key)) { // useless\n wasObject[key] = newObject[key];\n // }\n }\n\n return wasObject;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message, MessageAction, MessageMedia} from '../../../../layer';\nimport getPeerId from '../peers/getPeerId';\n\nexport default function getPeerIdsFromMessage(message: Message.message | Message.messageService) {\n const peerIds: number[] = [\n message.fromId,\n message.viaBotId,\n (message as Message.message).fwdFromId\n ];\n\n const media = (message as Message.message).media;\n if(media) {\n const contactUserId = (media as MessageMedia.messageMediaContact).user_id;\n if(contactUserId !== undefined) {\n peerIds.push(contactUserId.toPeerId());\n }\n\n const results = (media as MessageMedia.messageMediaPoll).results;\n const recentVoters = results?.recent_voters;\n if(recentVoters?.length) {\n peerIds.push(...recentVoters.map((userId) => userId.toPeerId()));\n }\n }\n\n const recentReactions = ((message as Message.message).reactions)?.recent_reactions;\n if(recentReactions?.length) {\n peerIds.push(...recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n const action = (message as Message.messageService).action;\n if(action) {\n const userIds: UserId[] = [\n ...((action as MessageAction.messageActionChatAddUser).users || []),\n (action as MessageAction.messageActionChatDeleteUser).user_id,\n (action as MessageAction.messageActionChatJoinedByLink).inviter_id\n ];\n peerIds.push(...userIds.filter(Boolean).map((userId) => userId.toPeerId()));\n\n const chatIds: ChatId[] = [\n (action as MessageAction.messageActionChatMigrateTo).channel_id,\n (action as MessageAction.messageActionChannelMigrateFrom).chat_id\n ];\n peerIds.push(...chatIds.filter(Boolean).map((chatId) => chatId.toPeerId(true)));\n }\n\n const recentRepliers = ((message as Message.message).replies)?.recent_repliers;\n if(recentRepliers?.length) {\n peerIds.push(...recentRepliers.map((reply) => getPeerId(reply)));\n }\n\n return new Set(peerIds.filter(Boolean));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ForumTopic} from '../../../../layer';\nimport type {Dialog} from '../../appMessagesManager';\nimport type getDialogIndexKey from './getDialogIndexKey';\n\nexport default function setDialogIndex(\n dialog: Dialog | ForumTopic.forumTopic,\n indexKey: ReturnType,\n index: number\n) {\n return (dialog as Dialog)[indexKey] = index;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {Chat, ForumTopic as MTForumTopic, DialogPeer, Message, MessageAction, MessageMedia, MessagesForumTopics, MessagesPeerDialogs, Update} from '../../layer';\nimport type {Dialog, ForumTopic, MyMessage} from '../appManagers/appMessagesManager';\nimport tsNow from '../../helpers/tsNow';\nimport SearchIndex from '../searchIndex';\nimport {SliceEnd} from '../../helpers/slicedArray';\nimport {MyDialogFilter} from './filters';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, NULL_PEER_ID, REAL_FOLDERS, REAL_FOLDER_ID} from '../mtproto/mtproto_config';\nimport {MaybePromise, NoneToVoidFunction} from '../../types';\nimport ctx from '../../environment/ctx';\nimport AppStorage from '../storage';\nimport type DATABASE_STATE from '../../config/databases/state';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport getServerMessageId from '../appManagers/utils/messageId/getServerMessageId';\nimport generateMessageId from '../appManagers/utils/messageId/generateMessageId';\nimport {AppManager} from '../appManagers/manager';\nimport getDialogIndexKey from '../appManagers/utils/dialogs/getDialogIndexKey';\nimport isObject from '../../helpers/object/isObject';\nimport getDialogIndex from '../appManagers/utils/dialogs/getDialogIndex';\nimport getPeerIdsFromMessage from '../appManagers/utils/messages/getPeerIdsFromMessage';\nimport {AppStoragesManager} from '../appManagers/appStoragesManager';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport setDialogIndex from '../appManagers/utils/dialogs/setDialogIndex';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\nimport {BroadcastEvents} from '../rootScope';\nimport assumeType from '../../helpers/assumeType';\nimport makeError from '../../helpers/makeError';\nimport callbackify from '../../helpers/callbackify';\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: (Dialog | ForumTopic)[],\n id: number,\n unreadMessagesCount: number,\n unreadPeerIds: Set,\n unreadUnmutedPeerIds: Set,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: REAL_FOLDER_ID = undefined;\n\n// let spentTime = 0;\nexport default class DialogsStorage extends AppManager {\n private storage: AppStoragesManager['storages']['dialogs'];\n\n private dialogs: {[peerId: PeerId]: Dialog};\n\n private folders: {[folderId: number]: Folder};\n\n private allDialogsLoaded: {[folder_id: number]: boolean};\n private dialogsOffsetDate: {[folder_id: number]: number};\n private pinnedOrders: {[folder_id: number]: PeerId[]};\n private dialogsNum: number;\n\n private dialogsIndex: SearchIndex;\n\n private cachedResults: {\n query: string,\n count: number,\n dialogs: Dialog[],\n folderId: number\n };\n\n private forumTopics: Map,\n deletedTopics: Set,\n getTopicPromises: Map>,\n getTopicsPromise?: Promise\n }>;\n\n protected after() {\n this.clear(true);\n\n this.rootScope.addEventListener('language_change', () => {\n const peerId = this.appUsersManager.getSelf().id.toPeerId(false);\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n });\n\n const onFilterUpdate = (filter: MyDialogFilter) => {\n const dialogs = this.getCachedDialogs(false);\n for(let i = 0; i < dialogs.length; ++i) {\n this.processDialogForFilter(dialogs[i], filter);\n }\n };\n\n this.rootScope.addEventListener('filter_order', () => {\n const dialogs = this.getCachedDialogs(false);\n // const indexKeys: ReturnType[] = [];\n for(const filterId in this.folders) {\n if(+filterId > 1) {\n delete this.folders[filterId];\n }\n\n // indexKeys.push(this.getDialogIndexKey(+filterId));\n }\n\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n // for(const indexKey of indexKeys) {\n // delete dialog[indexKey];\n // }\n\n this.processDialogForFilters(dialog);\n }\n });\n\n this.rootScope.addEventListener('filter_update', onFilterUpdate);\n this.rootScope.addEventListener('filter_new', onFilterUpdate);\n\n this.rootScope.addEventListener('filter_delete', (filter) => {\n const dialogs = this.getCachedDialogs(false);\n\n const indexKey = this.getDialogIndexKeyByFilterId(filter.id);\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n delete dialog[indexKey];\n }\n\n delete this.folders[filter.id];\n });\n\n this.rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.processChangedUnreadOrUnmuted(dialog.peerId);\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if((chat as Chat.chat).pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n this.rootScope.addEventListener('chat_toggle_forum', ({chatId, enabled}) => {\n const peerId = chatId.toPeerId(true);\n if(!enabled) {\n this.flushForumTopicsCache(peerId);\n }\n\n this.processChangedUnreadOrUnmuted(peerId);\n });\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updateChannelPinnedTopic: this.onUpdateChannelPinnedTopic,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs,\n\n updateChannelPinnedTopics: this.onUpdateChannelPinnedTopics\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('dialogs')\n ]).then(([state, {results: dialogs, storage}]) => {\n this.storage = storage;\n this.dialogs = this.storage.getCache();\n\n for(const folderId of REAL_FOLDERS) {\n const order = state.pinnedOrders[folderId];\n if(!order) {\n continue;\n }\n\n const _order = this.getPinnedOrders(folderId);\n _order.splice(0, _order.length, ...order);\n }\n\n if(dialogs.length) {\n AppStorage.freezeSaving(this.setDialogsFromState.bind(this, dialogs), ['chats', 'dialogs', 'messages', 'users']);\n }\n\n this.allDialogsLoaded = state.allDialogsLoaded || {};\n\n if(dialogs.length) {\n this.appDraftsManager.addMissedDialogs();\n }\n });\n }\n\n private setDialogsFromState(dialogs: Dialog[]) {\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n if(!dialog) {\n continue;\n }\n\n // if(dialog.peerId !== SERVICE_PEER_ID) {\n dialog.top_message = getServerMessageId(dialog.top_message); // * fix outgoing message to avoid copying dialog\n // }\n\n if(dialog.topMessage) {\n this.appMessagesManager.saveMessages([dialog.topMessage]);\n }\n\n for(let i = 0; i <= 21; ++i) {\n const indexKey: ReturnType = `index_${i}` as any;\n delete dialog[indexKey];\n }\n // delete dialog.indexes;\n\n this.saveDialog({\n dialog,\n ignoreOffsetDate: true\n });\n\n // ! WARNING, убрать это когда нужно будет делать чтобы pending сообщения сохранялись\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(!message) {\n this.appMessagesManager.reloadConversation(dialog.peerId);\n }\n }\n }\n\n public isDialogsLoaded(folderId: number) {\n return !!this.allDialogsLoaded[folderId];\n }\n\n public setDialogsLoaded(folderId: number, loaded: boolean) {\n const isForum = this.isFilterIdForForum(folderId);\n\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[FOLDER_ID_ALL] = loaded;\n this.allDialogsLoaded[FOLDER_ID_ARCHIVE] = loaded;\n } else {\n if(isForum) {\n defineNotNumerableProperties(this.allDialogsLoaded, [folderId]);\n }\n\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(isForum) {\n return;\n }\n\n if(Array.from(REAL_FOLDERS).every((folderId) => this.allDialogsLoaded[folderId])) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.saveAllDialogsLoaded();\n }\n\n private saveAllDialogsLoaded() {\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear = (init = false) => {\n if(!init) {\n this.storage.clear();\n\n this.allDialogsLoaded = {};\n this.saveAllDialogsLoaded();\n\n // * clear not numerable properties\n this.pinnedOrders = Object.assign({}, this.pinnedOrders);\n for(const folderId of REAL_FOLDERS) {\n this.resetPinnedOrder(folderId);\n }\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n this.pinnedOrders = {};\n for(const folderId of REAL_FOLDERS) {\n this.pinnedOrders[folderId] = [];\n }\n }\n\n this.forumTopics = new Map();\n this.folders = {};\n this.dialogsOffsetDate = {};\n this.dialogsNum = 0;\n this.dialogsIndex = new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n this.cachedResults = {\n query: '',\n count: 0,\n dialogs: [],\n folderId: 0\n };\n };\n\n public handleDialogUnpinning(dialog: Dialog | ForumTopic, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.getPinnedOrders(folderId), this.isFilterIdForForum(folderId) ? (dialog as ForumTopic).id : dialog.peerId);\n this.savePinnedOrders();\n }\n\n public savePinnedOrders() {\n this.appStateManager.pushToState('pinnedOrders', this.pinnedOrders);\n }\n\n public resetPinnedOrder(folderId: number) {\n this.getPinnedOrders(folderId).length = 0;\n }\n\n public getPinnedOrders(folderId: number) {\n let orders = this.pinnedOrders[folderId];\n if(!orders && this.isFilterIdForForum(folderId)) {\n defineNotNumerableProperties(this.pinnedOrders, [folderId]);\n orders = this.pinnedOrders[folderId] = [];\n }\n\n return orders;\n }\n\n public isDialogPinned(peerId: PeerId, folderId: number) {\n const filter = this.filtersStorage.getFilter(folderId);\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(peerId) !== -1;\n } else {\n isPinned = !!this.getDialogOnly(peerId).pFlags.pinned;\n }\n\n return isPinned;\n }\n\n public getOffsetDate(folderId: number): number {\n const offsetDate = this.dialogsOffsetDate[folderId] || 0;\n if(folderId === GLOBAL_FOLDER_ID && !offsetDate) { // make request not from beginning if we have loaded some dialogs\n return Math.min(...Array.from(REAL_FOLDERS).sort((a, b) => a - b));\n }\n\n return offsetDate;\n }\n\n private generateFolder(id: number) {\n const folder: Folder = {\n dialogs: [],\n id,\n unreadMessagesCount: 0,\n unreadPeerIds: new Set(),\n unreadUnmutedPeerIds: new Set()\n };\n\n defineNotNumerableProperties(folder, ['dispatchUnreadTimeout']);\n\n return folder;\n }\n\n public getFolder(id: number) {\n return this.folders[id] ??= this.generateFolder(id);\n }\n\n public isFilterIdForForum(filterId: number) {\n return filterId && filterId < 0;\n }\n\n public getFilterIdForForum(forumTopic: ForumTopic) {\n return forumTopic.peerId;\n }\n\n public getDialogKey(dialog: Dialog | ForumTopic) {\n return this.isTopic(dialog) ? dialog.id : dialog.peerId;\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Folder['dialogs'] {\n if(id === GLOBAL_FOLDER_ID) { // * it won't be sorted\n return this.getCachedDialogs(skipMigrated);\n }\n\n const folder = this.getFolder(id);\n if(this.isFilterIdForForum(id)) {\n return skipMigrated ? folder.dialogs.filter((forumTopic) => !(forumTopic as ForumTopic).pFlags.hidden) : folder.dialogs;\n }\n\n return skipMigrated ? folder.dialogs.filter((dialog) => (dialog as Dialog).migratedTo === undefined) : folder.dialogs;\n }\n\n public getNextDialog(currentPeerId: PeerId, next: boolean, filterId: number) {\n const folder = this.getFolderDialogs(filterId, true);\n let dialog: Folder['dialogs'][0];\n if(!currentPeerId) {\n if(next) {\n dialog = folder[0];\n }\n } else {\n const idx = folder.findIndex((dialog) => dialog.peerId === currentPeerId);\n if(idx !== -1) {\n const nextIndex = next ? idx + 1 : idx - 1;\n dialog = folder[nextIndex];\n }\n }\n\n return dialog;\n }\n\n public getDialogIndexKeyByFilterId(filterId: number) {\n if(this.isFilterIdForForum(filterId)) return getDialogIndexKey();\n if(REAL_FOLDERS.has(filterId)) return getDialogIndexKey(filterId as REAL_FOLDER_ID);\n const filter = this.filtersStorage.getFilter(filterId);\n return getDialogIndexKey(filter.localId);\n }\n\n private isDialogUnmuted(dialog: Dialog | ForumTopic) {\n return !this.appNotificationsManager.isPeerLocalMuted({\n peerId: dialog.peerId,\n respectType: true,\n threadId: this.isTopic(dialog) ? (dialog as ForumTopic).id : undefined\n });\n }\n\n public getFolderUnreadCount(filterId: number) {\n const folder = this.getFolder(filterId);\n return {unreadUnmutedCount: folder.unreadUnmutedPeerIds.size, unreadCount: folder.unreadPeerIds.size};\n }\n\n public getCachedDialogs(skipMigrated?: boolean) {\n const arrays = Array.from(REAL_FOLDERS).map((folderId) => this.getFolderDialogs(folderId, skipMigrated));\n return [].concat(...arrays) as Dialog[];\n }\n\n private setDialogIndexInFilter(\n dialog: Dialog | ForumTopic,\n indexKey: ReturnType,\n filter?: MyDialogFilter\n ) {\n // if(this.isTopic(dialog)) {\n // return dialog['index_0'];\n // }\n\n let index: number;\n\n const isTopic = this.isTopic(dialog);\n const isRealFolder = isTopic || REAL_FOLDERS.has(filter.id);\n /* if(isRealFolder) {\n // index = getDialogIndex(dialog, indexKey);\n index = this.generateIndexForDialog(dialog, true);\n } else */if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIds = isTopic ?\n this.getPinnedOrders(this.getFilterIdForForum(dialog)) :\n filter.pinnedPeerIds;\n\n const pinnedKey = this.getDialogKey(dialog);\n const pinnedIndex = pinnedIds.indexOf(pinnedKey);\n\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(pinnedIds.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned || isRealFolder) {\n index = this.generateIndexForDialog(dialog, true, undefined, !isRealFolder);\n } else {\n index = getDialogIndex(dialog) ?? this.generateIndexForDialog(dialog, true);\n }\n }\n\n // if(!dialog.hasOwnProperty(indexKey)) {\n // defineNotNumerableProperties(dialog, [indexKey]);\n // }\n\n return setDialogIndex(dialog, indexKey, index);\n }\n\n public getDialog(peerId: PeerId, folderId?: number, topicId?: number, skipMigrated = true): [Folder['dialogs'][0], number] | [] {\n const folders: Folder['dialogs'][] = [];\n\n if(topicId) {\n folderId = peerId;\n // skipMigrated = false;\n }\n\n if(folderId === undefined) {\n folders.push(...Array.from(REAL_FOLDERS).map((folderId) => this.getFolder(folderId).dialogs as Dialog[]));\n } else {\n folders.push(this.getFolderDialogs(folderId, false) as Dialog[]);\n }\n\n const verify: (d: Folder['dialogs'][0]) => boolean = topicId ?\n (d) => (d as ForumTopic).id === topicId :\n (d) => (d as Dialog).peerId === peerId;\n for(const folder of folders) {\n let i = 0, skipped = 0;\n for(let length = folder.length; i < length; ++i) {\n const dialog = folder[i];\n if(verify(dialog)) {\n return [dialog, i - skipped];\n } else if(skipMigrated && ((dialog as ForumTopic).pFlags.hidden || (dialog as Dialog).migratedTo !== undefined)) {\n ++skipped;\n }\n }\n }\n\n return [];\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogs[peerId];\n }\n\n public getDialogOrTopic(peerId: PeerId, topicId?: number) {\n return topicId ? this.getForumTopic(peerId, topicId) : this.dialogs[peerId];\n }\n\n public getDialogIndex(\n peerId: PeerId | Parameters[0],\n indexKey: ReturnType,\n topicId?: number\n ) {\n const dialog = isObject(peerId) ? peerId : this.getDialogOrTopic(peerId, topicId);\n return getDialogIndex(dialog, indexKey);\n }\n\n /*\n var date = Date.now() / 1000 | 0;\n var m = date * 0x10000;\n\n var k = (date + 1) * 0x10000;\n k - m;\n 65536\n */\n public generateDialogIndex(date?: number, isPinned?: boolean) {\n date ??= tsNow(true) + this.timeManager.getServerTimeOffset();\n return (date * 0x10000) + (isPinned ? 0 : (++this.dialogsNum & 0xFFFF));\n }\n\n // public makeFilterForTopics(id: number): MyDialogFilter {\n // return {\n // _: 'dialogFilter',\n // id,\n\n // };\n // }\n\n public isTopic(dialog: Dialog | ForumTopic): dialog is ForumTopic {\n return 'id' in dialog;\n }\n\n public processDialogForFilters(dialog: Dialog | ForumTopic, noIndex?: boolean) {\n // let perf = performance.now();\n if(this.isTopic(dialog)) {\n this.processDialogForFilter(dialog, undefined, noIndex);\n return;\n }\n\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter, noIndex);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(\n dialog: Dialog | ForumTopic,\n filter?: MyDialogFilter,\n noIndex?: boolean\n ) {\n const isTopic = this.isTopic(dialog);\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : filter.id;\n\n const indexKey = isTopic ? 'index_0' : this.getDialogIndexKeyByFilterId(folderId);\n const folder = this.getFolder(folderId);\n const dialogs = folder.dialogs;\n\n const cmp: (d: typeof dialog) => boolean = isTopic ?\n ((d: ForumTopic) => d.id === dialog.id) as any :\n ((d: Dialog) => d.peerId === dialog.peerId) as any;\n const wasIndex = dialogs.findIndex(cmp);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = this.getDialogIndex(wasDialog, indexKey);\n\n if(noIndex && folderId > FOLDER_ID_ARCHIVE) {\n noIndex = undefined;\n }\n\n const newDialogIndex = noIndex ? undefined : this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return false;\n }\n\n if(!!wasDialogIndex !== !!newDialogIndex) {\n this.prepareFolderUnreadCountModifyingByDialog(folderId, dialog, !!newDialogIndex);\n }\n\n if(wasIndex !== -1) {\n dialogs.splice(wasIndex, 1);\n }\n\n if(newDialogIndex) {\n insertInDescendSortedArray(dialogs, dialog, (dialog) => this.getDialogIndex(dialog, indexKey), -1);\n }\n\n return true;\n }\n\n public prepareDialogUnreadCountModifying(dialog: Dialog | ForumTopic, toggle?: boolean) {\n const isTopic = this.isTopic(dialog);\n const callbacks: NoneToVoidFunction[] = [];\n\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : dialog.folder_id;\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(folderId, dialog, toggle));\n\n if(!isTopic) {\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog, toggle));\n }\n }\n }\n\n return () => !toggle && callbacks.forEach((callback) => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog | ForumTopic, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const wasUnmuted = this.isDialogUnmuted(dialog);\n\n if(toggle !== undefined) {\n const addMessagesCount = toggle ? wasUnreadCount : -wasUnreadCount;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!wasUnreadCount, wasUnreadCount && wasUnmuted, dialog);\n return;\n }\n\n return () => {\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const newUnmuted = this.isDialogUnmuted(dialog);\n\n const addMessagesCount = newUnreadCount - wasUnreadCount;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!newUnreadCount, newUnreadCount && newUnmuted, dialog);\n };\n }\n\n public modifyFolderUnreadCount(\n folderId: number,\n addMessagesCount: number,\n toggleDialog: boolean,\n toggleUnmuted: boolean,\n dialog: Dialog | ForumTopic\n ) {\n const {peerId} = dialog;\n const isForum = this.appPeersManager.isForum(peerId);\n const isTopic = this.isTopic(dialog);\n if(isForum && !isTopic) {\n const forumUnreadCount = this.getForumUnreadCount(peerId);\n if(forumUnreadCount instanceof Promise) {\n forumUnreadCount.then(({count, hasUnmuted}) => {\n dialog = this.getDialogOnly(peerId);\n const folder = this.getFolder(folderId);\n if(\n !dialog ||\n !this.appPeersManager.isForum(peerId) ||\n !folder ||\n !folder.dialogs.some((dialog) => dialog.peerId === peerId)\n ) {\n return;\n }\n\n this.modifyFolderUnreadCount(folderId, 0, false, false, dialog);\n });\n\n return;\n } else {\n addMessagesCount = 0;\n toggleDialog = forumUnreadCount.count > 0;\n toggleUnmuted = forumUnreadCount.hasUnmuted;\n }\n }\n\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n\n const key = this.getDialogKey(dialog);\n if(toggleDialog) {\n folder.unreadPeerIds.add(key);\n } else {\n folder.unreadPeerIds.delete(key);\n }\n\n if(toggleUnmuted) {\n folder.unreadUnmutedPeerIds.add(key);\n } else {\n folder.unreadUnmutedPeerIds.delete(key);\n }\n\n folder.dispatchUnreadTimeout ??= ctx.setTimeout(() => {\n folder.dispatchUnreadTimeout = undefined;\n const _folder = {...folder};\n delete _folder.dialogs;\n this.rootScope.dispatchEvent('folder_unread', _folder);\n\n if(isTopic) { // * refresh forum dialog unread count\n this.processChangedUnreadOrUnmuted(peerId);\n }\n }, 0);\n }\n\n public processChangedUnreadOrUnmuted(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n this.processDialogForFilters(dialog);\n this.prepareDialogUnreadCountModifying(dialog)();\n this.rootScope.dispatchEvent('dialog_unread', {\n peerId,\n dialog\n });\n }\n }\n\n public generateIndexForDialog(\n dialog: Dialog | ForumTopic,\n justReturn?: boolean,\n message?: MyMessage,\n noPinnedOrderUpdate?: boolean\n ) {\n if(!justReturn/* && !isTopic */) {\n return;\n }\n\n const isTopic = this.isTopic(dialog);\n let topDate = 0, isPinned: boolean;\n if((dialog as ForumTopic).pFlags.hidden) { // general topic must be first\n topDate = this.generateDialogPinnedDateByIndex(0xFFF);\n isPinned = true;\n } else if(dialog.pFlags.pinned && !noPinnedOrderUpdate) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n message ||= this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n\n topDate = (message as Message.message)?.date || topDate;\n\n if(!isTopic) {\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n }\n\n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n topDate ||= tsNow(true);\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n const indexKey = getDialogIndexKey((dialog as Dialog).folder_id);\n setDialogIndex(dialog, indexKey, index);\n }\n\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - потому что в папках может быть бесконечное число пиннедов\n }\n\n public generateDialogPinnedDate(dialog: Dialog | ForumTopic) {\n const isTopic = this.isTopic(dialog);\n const order = this.getPinnedOrders(isTopic ? this.getFilterIdForForum(dialog) : dialog.folder_id);\n\n const dialogKey = this.getDialogKey(dialog);\n let pinnedIndex = order.indexOf(dialogKey);\n if(pinnedIndex === -1) {\n order.unshift(dialogKey);\n pinnedIndex = 0;\n\n if(!isTopic) {\n this.savePinnedOrders();\n }\n }\n\n return this.generateDialogPinnedDateByIndex(order.length - 1 - pinnedIndex);\n }\n\n /* public generateDialog(peerId: PeerId) {\n const dialog: Dialog = {\n _: 'dialog',\n pFlags: {},\n peer: this.appPeersManager.getOutputPeer(peerId),\n top_message: 0,\n read_inbox_max_id: 0,\n read_outbox_max_id: 0,\n unread_count: 0,\n unread_mentions_count: 0,\n notify_settings: {\n _: 'peerNotifySettings',\n },\n };\n\n return dialog;\n } */\n\n public setDialogToState(dialog: Dialog | ForumTopic) {\n if(this.isTopic(dialog)) {\n return;\n }\n\n const {peerId, pts} = dialog;\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const messagesStorage = this.appMessagesManager.getHistoryMessagesStorage(peerId);\n const history = historyStorage.history.slice;\n let incomingMessage: MyMessage;\n for(let i = 0, length = history.length; i < length; ++i) {\n const mid = history[i];\n const message: MyMessage = this.appMessagesManager.getMessageFromStorage(messagesStorage, mid);\n if(message && !message.pFlags.is_outgoing/* || peerId === SERVICE_PEER_ID */) {\n incomingMessage = message;\n\n const peerIds = getPeerIdsFromMessage(message);\n this.peersStorage.requestPeersForKey(peerIds, `topMessage_${peerId}`);\n\n break;\n }\n }\n\n dialog.topMessage = incomingMessage;\n\n // DO NOT TOUCH THESE LINES, SOME REAL MAGIC HERE.\n // * Read service chat when refreshing page with outgoing & getting new service outgoing message\n /* if(incomingMessage && dialog.read_inbox_max_id >= dialog.top_message) {\n dialog.unread_count = 0;\n }\n\n dialog.read_inbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_outbox_max_id); */\n // CAN TOUCH NOW\n\n if(peerId.isAnyChat() && pts) {\n const newPts = this.apiUpdatesManager.getChannelState(peerId.toChatId(), pts).pts;\n dialog.pts = newPts;\n }\n\n this.storage.set({\n [peerId]: dialog\n });\n\n this.peersStorage.requestPeer(peerId, 'dialog');\n\n /* for(let id in this.filtersStorage.filters) {\n const filter = this.filtersStorage.filters[id];\n\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n\n }\n } */\n }\n\n public pushDialog({dialog, offsetDate, ignoreOffsetDate, saveGlobalOffset}: {\n dialog: Dialog | ForumTopic,\n offsetDate?: number,\n ignoreOffsetDate?: boolean,\n saveGlobalOffset?: boolean\n }) {\n const isTopic = this.isTopic(dialog);\n const {folder_id, peerId} = dialog as Dialog;\n\n if(isTopic) {\n const forumTopics = this.getForumTopicsCache(peerId);\n forumTopics.topics.set(dialog.id, dialog);\n } else {\n this.dialogs[peerId] = dialog;\n }\n\n offsetDate ??= this.getDialogOffsetDate(dialog);\n\n // if(!isTopic) {\n this.processDialogForFilters(dialog);\n // }\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(!isTopic && saveGlobalOffset) {\n const savedGlobalOffsetDate = this.dialogsOffsetDate[GLOBAL_FOLDER_ID];\n if(!savedGlobalOffsetDate || offsetDate < savedGlobalOffsetDate) {\n this.dialogsOffsetDate[GLOBAL_FOLDER_ID] = offsetDate;\n }\n }\n\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : folder_id;\n const savedOffsetDate = this.dialogsOffsetDate[folderId];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folderId)) {\n this.dropDialog(peerId, isTopic ? this.getDialogKey(dialog) : undefined, true);\n return;\n }\n\n this.dialogsOffsetDate[folderId] = offsetDate;\n }\n }\n\n this.setDialogToState(dialog);\n\n // if(pos === -1) {\n // this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\n // }\n\n // const indexKey = getDialogIndexKey(folder_id);\n // /* const newPos = */insertInDescendSortedArray(dialogs, dialog, (dialog) => getDialogIndex(dialog, indexKey), -1);\n /* if(pos !== -1 && pos !== newPos) {\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\n } */\n }\n\n public dropDialogFromFolders(peerId: PeerId, topicId?: number) {\n const foundDialog = this.getDialog(peerId, undefined, topicId, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n const filterId = topicId ?\n this.getFilterIdForForum(dialog as ForumTopic) :\n (dialog as Dialog).folder_id;\n\n // const folder = this.getFolder(filterId);\n // folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.getPinnedOrders(filterId), this.getDialogKey(dialog)) !== undefined;\n\n this.processDialogForFilters(dialog, true);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n }\n\n return foundDialog;\n }\n\n public dropDialog(peerId: PeerId, topicId?: number, keepLocal?: boolean) {\n const dialog = this.getDialogOrTopic(peerId, topicId);\n const foundDialog = this.dropDialogFromFolders(peerId, topicId);\n if(dialog) {\n if(!keepLocal) {\n if(topicId) {\n this.getForumTopicsCache(peerId).topics.delete(topicId);\n } else {\n delete this.dialogs[peerId];\n }\n }\n\n this.clearDialogFromState(dialog, keepLocal);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog | ForumTopic, keepLocal: boolean) {\n if(dialog._ === 'forumTopic') {\n return;\n }\n\n const {peerId} = dialog;\n this.peersStorage.requestPeersForKey([], `topMessage_${peerId}`);\n this.peersStorage.releasePeer(peerId, 'dialog');\n this.storage.delete(peerId, keepLocal);\n }\n\n public dropDialogWithEvent(peerId: PeerId, topicId?: number) {\n const dropped = this.dropDialog(peerId, topicId);\n if(dropped.length) {\n this.rootScope.dispatchEvent('dialog_drop', dropped[0]);\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId, topicId?: number) {\n this.dropDialogWithEvent(peerId, topicId);\n this.rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(result: MessagesPeerDialogs | MessagesForumTopics, peerId?: PeerId) {\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\n\n const isForum = result._ === 'messages.forumTopics';\n const items = (result as MessagesPeerDialogs).dialogs || (result as MessagesForumTopics).topics;\n if(!isForum) {\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(result.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n result.dialogs.splice(idx, 1);\n }\n });\n } else {\n this.processTopics(peerId, result);\n }\n\n assumeType(items);\n\n this.appUsersManager.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n this.appMessagesManager.saveMessages(result.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const getUpdateCache = (peerId: PeerId) => {\n let cache = updatedDialogs.get(peerId);\n if(!cache) {\n updatedDialogs.set(peerId, cache = {});\n }\n\n return cache;\n };\n\n items.forEach((dialog) => {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n let topMid = dialog.top_message;\n\n const topPendingMid = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMid) {\n const topPendingMessage = this.appMessagesManager.getMessageByPeer(peerId, topPendingMid) as MyMessage;\n const topMessage = this.appMessagesManager.getMessageByPeer(peerId, topMid) as MyMessage;\n if(!topMid || (topPendingMessage && (!topMessage || topPendingMessage?.date > topMessage?.date))) {\n dialog.top_message = topMid = topPendingMid;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMid;\n }\n }\n\n /* const d = Object.assign({}, dialog);\n if(peerId === 239602833) {\n this.log.error('applyConversation lun', dialog, d);\n } */\n\n if(topMid || dialog.draft?._ === 'draftMessage') {\n if(this.saveDialog({dialog})) {\n const cache = getUpdateCache(peerId);\n\n if(isForum) {\n (cache.topics ??= new Map()).set(\n (dialog as ForumTopic).id,\n dialog as ForumTopic\n );\n } else {\n cache.dialog = dialog as Dialog;\n }\n }\n } else {\n this.dropDialogWithEvent(peerId, isForum ? this.getDialogKey(dialog) : undefined);\n }\n\n const key = this.appMessagesManager.getUpdateAfterReloadKey(peerId, isForum ? this.getDialogKey(dialog) : undefined);\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[key];\n if(updates !== undefined) {\n for(const update of updates) {\n updates.delete(update);\n this.apiUpdatesManager.saveUpdate(update);\n }\n\n if(!updates.size) {\n delete this.appMessagesManager.newUpdatesAfterReloadToHandle[key];\n }\n }\n });\n\n if(updatedDialogs.size) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n private getDialogOffsetDate(dialog: Dialog | ForumTopic) {\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n return message?.date || 0;\n }\n\n public canSaveDialogByPeerId(peerId: PeerId) {\n if(peerId.isAnyChat()) {\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\n // ! chatForbidden stays for chat where you're kicked\n if(\n chat._ === 'channelForbidden' ||\n // || chat._ === 'chatForbidden'\n (chat as Chat.chat).pFlags.left\n // || (chat as any).pFlags.kicked\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog({\n dialog,\n folderId,\n ignoreOffsetDate,\n saveGlobalOffset\n }: {\n dialog: Dialog | ForumTopic,\n folderId?: REAL_FOLDER_ID,\n ignoreOffsetDate?: boolean,\n saveGlobalOffset?: boolean\n }) {\n const isTopic = this.isTopic(dialog);\n const isDialog = !isTopic;\n\n const topicId = isTopic ? dialog.id = generateMessageId(dialog.id) : undefined;\n if(!isTopic) {\n folderId ??= dialog.folder_id ?? FOLDER_ID_ALL;\n }\n\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return false;\n }\n\n if(!isTopic && dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n\n if(isDialog && !this.canSaveDialogByPeerId(peerId)) {\n return false;\n }\n\n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\n if(isDialog) {\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n\n const wasDialogBefore = this.getDialogOrTopic(peerId, topicId);\n\n let mid: number, message: MyMessage;\n if(dialog.top_message) {\n mid = generateMessageId(dialog.top_message);// dialog.top_message;\n\n // preserve outgoing message\n const wasTopMessage = wasDialogBefore?.top_message && this.appMessagesManager.getMessageByPeer(peerId, wasDialogBefore.top_message) as MyMessage;\n if(wasTopMessage?.pFlags?.is_outgoing && wasDialogBefore.top_message >= mid) {\n mid = wasDialogBefore.top_message;\n }\n\n message = this.appMessagesManager.getMessageByPeer(peerId, mid);\n } else {\n mid = this.appMessagesManager.generateTempMessageId(peerId);\n message = {\n _: 'message',\n id: mid,\n mid,\n from_id: this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(false)),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n deleted: true,\n pFlags: {out: true},\n date: 0,\n message: ''\n };\n this.appMessagesManager.saveMessages([message], {isOutgoing: true});\n }\n\n if(!message?.pFlags) {\n this.appMessagesManager.log.error('saveConversation no message:', dialog, message);\n }\n\n if(isDialog && !channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\n const migratedToPeer = this.appPeersManager.getPeerId(chat.migrated_to);\n this.appMessagesManager.migratedFromTo[peerId] = migratedToPeer;\n this.appMessagesManager.migratedToFrom[migratedToPeer] = peerId;\n dialog.migratedTo = migratedToPeer;\n // return;\n }\n }\n\n dialog.top_message = mid;\n // dialog.unread_count = wasDialogBefore && dialog.read_inbox_max_id === getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\n dialog.read_inbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\n\n if(isDialog && dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\n dialog.folder_id = wasDialogBefore ? (wasDialogBefore as typeof dialog).folder_id : folderId;\n }/* else if(dialog._ === 'dialogFolder') {\n dialog.folder_id = dialog.folder.id;\n } */\n }\n\n dialog.draft = this.appDraftsManager.saveDraft({peerId, threadId: topicId, draft: dialog.draft});\n dialog.peerId = peerId;\n // dialog.indexes ??= {} as any;\n\n // Because we saved message without dialog present\n if(message && message.pFlags.is_outgoing) {\n const isOut = message.pFlags.out;\n if(mid > dialog[isOut ? 'read_outbox_max_id' : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n\n if(!dialog.unread_count && !isOut) {\n ++dialog.unread_count;\n }\n } else {\n delete message.pFlags.unread;\n }\n }\n\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId, topicId);\n const slice = historyStorage.history.slice;\n /* if(historyStorage === undefined) { // warning\n historyStorage.history.push(mid);\n } else */if(!slice.length) {\n historyStorage.history.unshift(mid);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n } else if(!slice.isEnd(SliceEnd.Bottom)) { // * this will probably never happen, however, if it does, then it will fix slice with top_message\n const slice = historyStorage.history.insertSlice([mid]);\n slice.setEnd(SliceEnd.Bottom);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n historyStorage.maxId = mid;\n historyStorage.readMaxId = dialog.read_inbox_max_id;\n historyStorage.readOutboxMaxId = dialog.read_outbox_max_id;\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n threadId: isTopic ? dialog.id : undefined,\n settings: dialog.notify_settings\n });\n\n if(isDialog && channelId && dialog.pts) {\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\n }\n\n this.generateIndexForDialog(dialog);\n\n if(wasDialogBefore) {\n // fix unread count\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(wasDialogBefore);\n safeReplaceObject(wasDialogBefore, dialog);\n releaseUnreadCount();\n }\n\n this.pushDialog({\n dialog,\n offsetDate: message?.date,\n ignoreOffsetDate,\n saveGlobalOffset\n });\n\n if(isTopic) {\n this.processTopicUpdate(dialog, wasDialogBefore as ForumTopic);\n }\n\n return true;\n }\n\n public processTopicUpdate(topic: ForumTopic, oldTopic?: ForumTopic) {\n if(!oldTopic) {\n return;\n }\n\n const {peerId, id: threadId} = topic;\n const isIconChanged = topic.icon_emoji_id !== (oldTopic as ForumTopic).icon_emoji_id;\n const isTitleChanged = topic.title !== (oldTopic as ForumTopic).title;\n const isChanged = isIconChanged || isTitleChanged;\n\n if(isIconChanged) {\n this.rootScope.dispatchEvent('avatar_update', {peerId, threadId});\n }\n\n if(isChanged) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId, threadId});\n }\n }\n\n public getDialogs(options: {\n query?: string,\n offsetIndex?: number,\n limit?: number,\n filterId?: number,\n skipMigrated?: boolean\n }): MaybePromise<{\n dialogs: Folder['dialogs'],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }> {\n const {\n query = '',\n offsetIndex,\n limit = 20,\n filterId = FOLDER_ID_ALL,\n skipMigrated = false\n } = options;\n\n const isForum = this.isFilterIdForForum(filterId);\n if(!isForum && !REAL_FOLDERS.has(filterId)) {\n const promises: Promise[] = [];\n\n const fillContactsResult = this.appUsersManager.fillContacts();\n if(!fillContactsResult.cached) {\n promises.push(fillContactsResult.promise);\n }\n\n const reloadMissingDialogsPromise = this.filtersStorage.reloadMissingPeerIds(filterId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n return Promise.all(promises).then(() => {\n return this.getDialogs(options);\n });\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId/* : REAL_FOLDER_ID */ =\n (!REAL_FOLDERS.has(filterId) || this.getOffsetDate(filterId)) && !isForum ?\n GLOBAL_FOLDER_ID :\n filterId/* as REAL_FOLDER_ID */;\n let curDialogStorage = this.getFolderDialogs(filterId, skipMigrated);\n\n const indexKey = this.getDialogIndexKeyByFilterId(filterId);\n\n if(query && !isForum) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== filterId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = filterId;\n\n const results = this.dialogsIndex.search(query);\n\n const dialogs: Dialog[] = [];\n for(const peerId in this.dialogs) {\n const dialog = this.dialogs[peerId];\n if(results.has(dialog.peerId) && dialog.folder_id === filterId) {\n dialogs.push(dialog);\n }\n }\n\n dialogs.sort((d1, d2) => this.getDialogIndex(d2, indexKey) - this.getDialogIndex(d1, indexKey));\n this.cachedResults.dialogs = dialogs;\n this.cachedResults.count = dialogs.length;\n }\n\n curDialogStorage = this.cachedResults.dialogs;\n } else {\n this.cachedResults.query = '';\n }\n\n let offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\n break;\n }\n }\n }\n\n const loadedAll = this.isDialogsLoaded(realFolderId);\n const isEnoughDialogs = curDialogStorage.length >= (offset + limit);\n if(query || loadedAll || isEnoughDialogs) {\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: loadedAll ? curDialogStorage.length : null,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\n };\n }\n\n return this.appMessagesManager.getTopMessages({limit, folderId: realFolderId}).then((result) => {\n // const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(filterId, skipMigrated);\n }\n\n offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\n break;\n }\n }\n }\n\n // this.log.warn(offset, offset + limit, curDialogStorage.dialogs.length, this.dialogs.length);\n\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: result.count === undefined ? curDialogStorage.length : result.count,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\n isEnd: result.isEnd\n };\n });\n }\n\n // * FORUMS SECTION\n\n public flushForumTopicsCache(peerId: PeerId) {\n const cache = this.forumTopics.get(peerId);\n if(!cache) {\n return;\n }\n\n const folder = this.folders[peerId];\n if(folder) {\n if(folder.dispatchUnreadTimeout) {\n clearTimeout(folder.dispatchUnreadTimeout);\n }\n\n delete this.allDialogsLoaded[peerId];\n delete this.pinnedOrders[peerId];\n delete this.dialogsOffsetDate[peerId];\n delete this.folders[peerId];\n }\n\n cache.topics.clear();\n\n // for permanent delete\n // this.forumTopics.delete(peerId);\n }\n\n public getForumTopicsCache(peerId: PeerId) {\n let forumTopics = this.forumTopics.get(peerId);\n if(!forumTopics) {\n forumTopics = {\n topics: new Map(),\n deletedTopics: new Set(),\n getTopicPromises: new Map()\n };\n\n this.forumTopics.set(peerId, forumTopics);\n }\n\n return forumTopics;\n }\n\n public getForumTopicById(peerId: PeerId, topicId?: number): Promise {\n if(!this.appPeersManager.isForum(peerId)) {\n return Promise.reject(makeError('CHANNEL_FORUM_MISSING'));\n }\n\n const cache = this.getForumTopicsCache(peerId);\n let promise: CancellablePromise;\n if(topicId) {\n promise = cache.getTopicPromises.get(topicId);\n if(promise) {\n return promise;\n }\n\n if(cache.deletedTopics.has(topicId)) {\n return Promise.resolve(undefined);\n }\n\n cache.getTopicPromises.set(topicId, promise = deferredPromise());\n }\n\n cache.getTopicsPromise ??= pause(0).then(() => {\n const promises: {[topicId: number]: typeof promise} = {};\n const ids: number[] = [];\n for(const [topicId, promise] of cache.getTopicPromises) {\n promises[topicId] = promise;\n ids.push(getServerMessageId(topicId));\n }\n\n cache.getTopicPromises.clear();\n\n const fullfillLeft = () => {\n for(const topicId in promises) {\n promises[topicId].resolve(undefined);\n cache.deletedTopics.add(+topicId);\n }\n };\n\n if(this.getForumTopicsCache(peerId) !== cache) {\n fullfillLeft();\n return;\n }\n\n return this.apiManager.invokeApi('channels.getForumTopicsByID', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n topics: ids\n }).then((messagesForumTopics) => {\n if(this.getForumTopicsCache(peerId) !== cache) {\n return;\n }\n\n this.applyDialogs(messagesForumTopics, peerId);\n\n messagesForumTopics.topics.forEach((forumTopic) => {\n if(forumTopic._ === 'forumTopic') {\n promises[forumTopic.id].resolve(forumTopic);\n delete promises[peerId];\n }\n });\n\n return messagesForumTopics;\n }, () => {}).then(() => {\n fullfillLeft();\n\n cache.getTopicsPromise = undefined;\n if(cache.getTopicPromises.size) {\n this.getForumTopicById(peerId);\n }\n });\n });\n\n return promise || cache.getTopicsPromise;\n }\n\n // public getForumTopicById(peerId: PeerId, topicId: number) {\n // return this.getForumTopicsByID(peerId, topicId).then((result) => result.topics[0]);\n // }\n\n public getForumTopic(peerId: PeerId, topicId: number) {\n const forumTopics = this.forumTopics.get(peerId);\n return forumTopics?.topics?.get(topicId);\n }\n\n public getForumTopicOrReload(peerId: PeerId, topicId: number) {\n const forumTopic = this.getForumTopic(peerId, topicId);\n if(forumTopic) {\n return forumTopic;\n }\n\n const cache = this.getForumTopicsCache(peerId);\n return cache?.deletedTopics?.has(topicId) ? undefined : this.getForumTopicById(peerId, topicId);\n }\n\n public processTopics>(peerId: PeerId, result: T) {\n return callbackify(result, (result) => {\n if('pts' in result) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), result.pts);\n }\n\n const peer = this.appPeersManager.getOutputPeer(peerId);\n result.topics = result.topics.map((topic) => {\n if(topic._ === 'forumTopicDeleted') {\n return;\n }\n\n (topic as ForumTopic).peer = peer;\n topic.id = generateMessageId(topic.id);\n return topic;\n }).filter(Boolean);\n\n return result;\n });\n }\n\n public processTopicsPromise[1]>>(peerId: PeerId, promise: T): T {\n return promise.then((result) => {\n this.processTopics(peerId, result);\n return result;\n }) as any;\n }\n\n public getForumUnreadCount(peerId: PeerId) {\n if(!this.appPeersManager.isForum(peerId)) {\n return;\n }\n\n const folder = this.getFolder(peerId);\n\n const f = folder.dialogs.length >= 20 || this.isDialogsLoaded(peerId) ?\n folder.dialogs.slice(0, 20) :\n callbackify(this.getDialogs({filterId: peerId, limit: 20}), (result) => {\n return result.dialogs;\n });\n\n return callbackify(f, (dialogs) => {\n return {\n count: dialogs.reduce((acc, v) => acc + +!!v.unread_count, 0),\n hasUnmuted: dialogs.some((dialog) => dialog.unread_count && this.isDialogUnmuted(dialog))\n };\n });\n }\n\n // * FORUMS SECTION END\n\n private handleDialogTogglePinned(dialog: Dialog | ForumTopic, pinned: boolean, folderId: number) {\n if(dialog) {\n if(!pinned) {\n this.handleDialogUnpinning(dialog, folderId);\n } else { // means set\n dialog.pFlags.pinned = true;\n }\n\n this.generateIndexForDialog(dialog);\n }\n\n this.appMessagesManager.scheduleHandleNewDialogs(dialog.peerId, dialog);\n }\n\n private handleDialogsPinned(folderId: number, order: (Dialog['peerId'] | ForumTopic['id'])[]) {\n const isForum = this.isFilterIdForForum(folderId);\n this.resetPinnedOrder(folderId);\n this.getPinnedOrders(folderId).push(...order);\n this.savePinnedOrders();\n order.reverse(); // index must be higher\n const newPinned: {[id: typeof order[0]]: true} = {};\n order.forEach((id) => {\n newPinned[id] = true;\n\n const peerId = isForum ? folderId : id;\n const topicId = isForum ? id : undefined;\n\n const dialog = this.getDialogOrTopic(peerId, topicId);\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n if(!dialog) {\n return;\n }\n\n dialog.pFlags.pinned = true;\n this.generateIndexForDialog(dialog);\n });\n\n const dialogs = this.getFolderDialogs(folderId, false);\n for(const dialog of dialogs) {\n if(!dialog.pFlags.pinned) {\n break;\n }\n\n if(!newPinned[this.getDialogKey(dialog)]) {\n delete dialog.pFlags.pinned;\n this.generateIndexForDialog(dialog);\n this.appMessagesManager.scheduleHandleNewDialogs(dialog.peerId, dialog);\n }\n }\n }\n\n // only 0 and 1 folders\n private onUpdateFolderPeers = (update: Update.updateFolderPeers) => {\n // this.log('updateFolderPeers', update);\n const peers = update.folder_peers;\n\n peers.forEach((folderPeer) => {\n const {folder_id, peer} = folderPeer;\n\n const peerId = this.appPeersManager.getPeerId(peer);\n const dialog = this.dropDialog(peerId)[0];\n if(dialog) {\n if(dialog.pFlags?.pinned) {\n this.handleDialogUnpinning(dialog, folder_id);\n }\n\n (dialog as Dialog).folder_id = folder_id as REAL_FOLDER_ID;\n this.generateIndexForDialog(dialog);\n this.pushDialog({dialog}); // need for simultaneously updatePinnedDialogs\n }\n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n });\n };\n\n private onUpdateDialogPinned = (update: Update.updateDialogPinned) => {\n const folderId = update.folder_id ?? FOLDER_ID_ALL;\n // this.log('updateDialogPinned', update);\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n // этот код внизу никогда не сработает, в папках за пиннед отвечает updateDialogFilter\n /* if(update.folder_id > 1) {\n const filter = this.filtersStorage.filters[update.folder_id];\n if(update.pFlags.pinned) {\n filter.pinned_peers.unshift(peerId);\n } else {\n filter.pinned_peers.findAndSplice((p) => p === peerId);\n }\n } */\n\n this.handleDialogTogglePinned(dialog, update.pFlags.pinned, folderId);\n };\n\n private onUpdateChannelPinnedTopic = (update: Update.updateChannelPinnedTopic) => {\n const peerId = update.channel_id.toPeerId(true);\n const topicId = generateMessageId(update.topic_id);\n const topic = this.getForumTopic(peerId, topicId);\n if(!topic) {\n return;\n }\n\n this.handleDialogTogglePinned(topic, update.pFlags.pinned, this.getFilterIdForForum(topic));\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? FOLDER_ID_ALL;\n\n if(update.order) {\n this.handleDialogsPinned(folderId, update.order.map((peer) => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer)));\n } else {\n this.apiManager.invokeApi('messages.getPinnedDialogs', {\n folder_id: folderId\n }).then((dialogsResult) => {\n // * for test reordering and rendering\n // dialogsResult.dialogs.reverse();\n\n this.applyDialogs(dialogsResult);\n\n this.handleDialogsPinned(folderId, dialogsResult.dialogs.map((d) => d.peerId));\n });\n }\n };\n\n private onUpdateChannelPinnedTopics = async(update: Update.updateChannelPinnedTopics) => {\n const peerId = update.channel_id.toPeerId(true);\n const forumTopics = this.forumTopics.get(peerId);\n if(!forumTopics) {\n return;\n }\n\n const filterId = peerId;\n if(update.order) {\n const order = update.order.map((topicId) => generateMessageId(topicId));\n this.handleDialogsPinned(filterId, order);\n } else {\n const limit = await this.apiManager.getLimit('topicPin', true);\n\n const promise = this.apiManager.invokeApi('channels.getForumTopics', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n limit,\n offset_date: 0,\n offset_id: 0,\n offset_topic: 0\n });\n\n const result = await this.processTopics(peerId, promise);\n\n const topics = result.topics as ForumTopic[];\n const pinned = topics.filter((topic) => topic.pFlags.pinned);\n this.handleDialogsPinned(filterId, pinned.map((topic) => topic.id));\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {DialogFilter, ForumTopic, Update} from '../../layer';\nimport type {Dialog} from '../appManagers/appMessagesManager';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport copy from '../../helpers/object/copy';\nimport {AppManager} from '../appManagers/manager';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport assumeType from '../../helpers/assumeType';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS, REAL_FOLDER_ID, START_LOCAL_ID} from '../mtproto/mtproto_config';\nimport makeError from '../../helpers/makeError';\n\nexport type MyDialogFilter = DialogFilter.dialogFilter;\n\nconst convertment = [\n ['pinned_peers', 'pinnedPeerIds'],\n ['exclude_peers', 'excludePeerIds'],\n ['include_peers', 'includePeerIds']\n] as ['pinned_peers' | 'exclude_peers' | 'include_peers', 'pinnedPeerIds' | 'excludePeerIds' | 'includePeerIds'][];\n\nconst PREPENDED_FILTERS = REAL_FOLDERS.size;\n\nconst LOCAL_FILTER: MyDialogFilter = {\n _: 'dialogFilter',\n pFlags: {},\n flags: 0,\n id: 0,\n title: '',\n exclude_peers: [],\n include_peers: [],\n pinned_peers: [],\n excludePeerIds: [],\n includePeerIds: [],\n pinnedPeerIds: []\n};\n\nexport default class FiltersStorage extends AppManager {\n private filters: {[filterId: string]: MyDialogFilter};\n private filtersArr: Array;\n private localFilters: {[filterId: string]: MyDialogFilter};\n private localId: number;\n private reloadedPeerIds: Set;\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: this.onUpdateDialogFilters,\n\n updateDialogFilterOrder: this.onUpdateDialogFilterOrder\n });\n\n // delete peers when dialog is being dropped\n /* rootScope.addEventListener('peer_deleted', (peerId) => {\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n let modified = false;\n [filter.pinned_peers, filter.include_peers, filter.exclude_peers].forEach((arr) => {\n forEachReverse(arr, (inputPeer, idx) => {\n if(getPeerId(inputPeer) === peerId) {\n arr.splice(idx, 1);\n modified = true;\n }\n });\n });\n\n if(modified) {\n this.saveDialogFilter(filter, true);\n }\n }\n }); */\n\n this.rootScope.addEventListener('premium_toggle', () => {\n this.onUpdateDialogFilters({_: 'updateDialogFilters'});\n });\n\n return this.appStateManager.getState().then((state) => {\n const filtersArr = this.prependFilters(state.filtersArr);\n filtersArr.map((filter) => {\n this.saveDialogFilter(filter, false, true);\n });\n });\n }\n\n /**\n * ! use it only with saving\n */\n private prependFilters(filters: DialogFilter[]) {\n filters = filters.slice();\n\n const allChatsFilter = this.localFilters[FOLDER_ID_ALL];\n const archiveFilter = this.localFilters[FOLDER_ID_ARCHIVE];\n\n const allChatsFilterIndex = filters.findIndex((filter) => filter._ === 'dialogFilterDefault' || filter.id === FOLDER_ID_ALL);\n if(allChatsFilterIndex !== -1) filters[allChatsFilterIndex] = allChatsFilter;\n else filters.unshift(allChatsFilter);\n\n findAndSplice(filters, (filter) => (filter as MyDialogFilter).id === FOLDER_ID_ARCHIVE);\n filters.splice(/* 1 */filters[0] === allChatsFilter ? 1 : 0, 0, archiveFilter);\n\n this.localId = START_LOCAL_ID;\n filters.forEach((filter) => {\n delete filter.localId;\n });\n\n return filters;\n }\n\n private generateLocalFilter(id: REAL_FOLDER_ID) {\n const filter: MyDialogFilter = {...copy(LOCAL_FILTER), id};\n if(id === FOLDER_ID_ALL) {\n filter.pFlags.exclude_archived = true;\n } else if(id === FOLDER_ID_ARCHIVE) {\n filter.pFlags.exclude_unarchived = true;\n }\n\n if(REAL_FOLDERS.has(id)) {\n filter.pinnedPeerIds = this.dialogsStorage.getPinnedOrders(id);\n }\n\n return filter;\n }\n\n // private getLocalFilter(id: number) {\n // return this.filters[id] ??= this.generateLocalFilter(id);\n // }\n\n public clear = (init?: boolean) => {\n if(!init) {\n // safeReplaceObject(this.filters, {});\n this.reloadedPeerIds.clear();\n this.clearFilters();\n } else {\n this.filters = {};\n this.filtersArr = [];\n this.reloadedPeerIds = new Set();\n\n this.localFilters = {};\n for(const filterId of REAL_FOLDERS) {\n this.localFilters[filterId] = this.generateLocalFilter(filterId as REAL_FOLDER_ID);\n }\n }\n\n this.localId = START_LOCAL_ID;\n };\n\n private onUpdateDialogFilter = (update: Update.updateDialogFilter) => {\n if(update.filter) {\n this.saveDialogFilter(update.filter as any);\n } else if(this.filters[update.id]) { // Папка удалена\n // this.getDialogFilters(true);\n this.rootScope.dispatchEvent('filter_delete', this.filters[update.id]);\n delete this.filters[update.id];\n findAndSplice(this.filtersArr, (filter) => (filter as DialogFilter.dialogFilter).id === update.id);\n }\n\n this.pushToState();\n };\n\n private onUpdateDialogFilters = (update: Update.updateDialogFilters) => {\n // console.warn('updateDialogFilters', update);\n\n const oldFilters = copy(this.filters);\n\n this.getDialogFilters(true).then((filters) => {\n for(const _filterId in oldFilters) {\n const filterId = +_filterId;\n if(!filters.find((filter) => filter.id === filterId)) { // * deleted\n this.onUpdateDialogFilter({_: 'updateDialogFilter', id: filterId});\n }\n }\n\n this.onUpdateDialogFilterOrder({_: 'updateDialogFilterOrder', order: filters.map((filter) => filter.id)});\n });\n };\n\n private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n // console.log('updateDialogFilterOrder', update);\n\n const order = update.order.slice();\n if(!order.includes(FOLDER_ID_ARCHIVE)) {\n order.splice(order[0] === FOLDER_ID_ALL ? 1 : 0, 0, FOLDER_ID_ARCHIVE);\n }\n\n this.localId = START_LOCAL_ID;\n order.forEach((filterId) => {\n const filter = this.filters[filterId];\n delete filter.localId;\n this.setLocalId(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', order);\n\n this.pushToState();\n };\n\n private pushToState() {\n this.appStateManager.pushToState('filtersArr', this.filtersArr);\n }\n\n public testDialogForFilter(dialog: Dialog | ForumTopic.forumTopic, filter?: MyDialogFilter) {\n if(!filter) {\n return true;\n }\n\n if(REAL_FOLDERS.has(filter.id)) {\n return (dialog as Dialog).folder_id === filter.id && this.dialogsStorage.canSaveDialogByPeerId(dialog.peerId);\n }\n\n const peerId = dialog.peerId;\n\n // * check whether dialog exists\n if(!this.appMessagesManager.getDialogOnly(peerId)) {\n return false;\n }\n\n // exclude_peers\n if(filter.excludePeerIds.includes(peerId)) {\n return false;\n }\n\n // include_peers\n if(filter.includePeerIds.includes(peerId)) {\n return true;\n }\n\n const pFlags = filter.pFlags;\n\n // exclude_archived\n if(pFlags.exclude_archived && (dialog as Dialog).folder_id === FOLDER_ID_ARCHIVE) {\n return false;\n }\n\n // exclude_read\n if(pFlags.exclude_read && !this.appMessagesManager.isDialogUnread(dialog)) {\n return false;\n }\n\n // exclude_muted\n if(pFlags.exclude_muted && this.appNotificationsManager.isPeerLocalMuted({peerId}) && !(dialog.unread_mentions_count && dialog.unread_count)) {\n return false;\n }\n\n if(this.appPeersManager.isAnyChat(peerId)) {\n // broadcasts\n if(pFlags.broadcasts && this.appPeersManager.isBroadcast(peerId)) {\n return true;\n }\n\n // groups\n if(pFlags.groups && this.appPeersManager.isAnyGroup(peerId)) {\n return true;\n }\n } else {\n const userId = peerId.toUserId();\n\n // bots\n if(this.appUsersManager.isBot(userId)) {\n return !!pFlags.bots;\n }\n\n // non_contacts\n if(pFlags.non_contacts && !this.appUsersManager.isContact(userId)) {\n return true;\n }\n\n // contacts\n if(pFlags.contacts && this.appUsersManager.isContact(userId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public testDialogForFilterId(dialog: Dialog, filterId: number) {\n return this.testDialogForFilter(dialog, this.filters[filterId]);\n }\n\n public getFilter(filterId: number) {\n return this.filters[filterId];\n }\n\n public getFilters() {\n return this.filters;\n }\n\n public clearFilters() {\n const filters = this.getFilters();\n for(const filterId in filters) { // delete filters\n if(REAL_FOLDERS.has(+filterId)) {\n continue;\n }\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: +filterId\n });\n }\n }\n\n public async toggleDialogPin(peerId: PeerId, filterId: number) {\n const filter = this.filters[filterId];\n\n const index = filter.pinnedPeerIds.indexOf(peerId);\n const wasPinned = index !== -1;\n\n if(wasPinned) {\n filter.pinned_peers.splice(index, 1);\n filter.pinnedPeerIds.splice(index, 1);\n }\n\n if(!wasPinned) {\n if(filter.pinned_peers.length >= (await this.apiManager.getConfig()).pinned_infolder_count_max) {\n return Promise.reject(makeError('PINNED_DIALOGS_TOO_MUCH'));\n }\n\n filter.pinned_peers.unshift(this.appPeersManager.getInputPeerById(peerId));\n filter.pinnedPeerIds.unshift(peerId);\n }\n\n return this.updateDialogFilter(filter);\n }\n\n public createDialogFilter(filter: MyDialogFilter, prepend?: boolean) {\n const maxId = Math.max(1, ...Object.keys(this.filters).map((i) => +i));\n filter = copy(filter);\n filter.id = maxId + 1;\n return this.updateDialogFilter(filter, undefined, prepend);\n }\n\n public updateDialogFilter(filter: MyDialogFilter, remove = false, prepend = false) {\n const flags = remove ? 0 : 1;\n\n return this.apiManager.invokeApi('messages.updateDialogFilter', {\n flags,\n id: filter.id,\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\n }).then((bool) => { // возможно нужна проверка и откат, если результат не ТРУ\n // console.log('updateDialogFilter bool:', bool);\n\n /* if(!this.filters[filter.id]) {\n this.saveDialogFilter(filter);\n }\n\n rootScope.$broadcast('filter_update', filter); */\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: filter.id,\n filter: remove ? undefined : filter as any\n });\n\n if(prepend) {\n const f: MyDialogFilter[] = [];\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n ++filter.localId;\n f.push(filter);\n }\n\n filter.localId = START_LOCAL_ID;\n\n const order = f.sort((a, b) => a.localId - b.localId).map((filter) => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n });\n }\n\n public updateDialogFiltersOrder(order: number[]) {\n return this.apiManager.invokeApi('messages.updateDialogFiltersOrder', {\n order\n }).then(() => {\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n });\n }\n\n public getOutputDialogFilter(filter: MyDialogFilter) {\n const c = copy(filter);\n /* convertment.forEach(([from, to]) => {\n c[from] = c[to].map((peerId) => this.appPeersManager.getInputPeerById(peerId));\n }); */\n\n this.filterIncludedPinnedPeers(filter);\n\n return c;\n }\n\n private filterIncludedPinnedPeers(filter: MyDialogFilter) {\n forEachReverse(filter.includePeerIds, (peerId, idx) => {\n if(filter.pinnedPeerIds.includes(peerId)) {\n filter.include_peers.splice(idx, 1);\n filter.includePeerIds.splice(idx, 1);\n }\n });\n }\n\n // private spliceMissingPeerIds(filterId: number, type: ArgumentTypes[1], missingPeerIds: PeerId[]) {\n // const filter = this.getFilter(filterId);\n // const peers = filter && filter[type];\n // if(!peers?.length) {\n // return;\n // }\n\n // let spliced = false;\n // missingPeerIds.forEach((peerId) => {\n // const inputPeer = findAndSplice(peers, (inputPeer) => getPeerId(inputPeer) === peerId);\n // if(inputPeer) {\n // spliced = true;\n // }\n // });\n\n // if(spliced) {\n // this.onUpdateDialogFilter({\n // _: 'updateDialogFilter',\n // id: filterId,\n // filter\n // });\n // }\n // }\n\n public reloadMissingPeerIds(\n filterId: number,\n type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers'\n ) {\n const filter = this.getFilter(filterId);\n const peers = filter?.[type];\n if(!peers?.length) {\n return;\n }\n\n // const missingPeerIds: PeerId[] = [];\n const reloadDialogs = peers.filter((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const isAlreadyReloaded = this.reloadedPeerIds.has(peerId);\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\n // if(isAlreadyReloaded && !dialog) {\n // missingPeerIds.push(peerId);\n // }\n\n const reload = !isAlreadyReloaded && !dialog;\n return reload;\n });\n\n if(!reloadDialogs.length) {\n // if(missingPeerIds.length) {\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n // }\n\n return;\n }\n\n const reloadPromises = reloadDialogs.map((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer)\n .then((dialog) => {\n this.reloadedPeerIds.add(peerId);\n\n return dialog ? undefined : peerId;\n });\n\n return promise;\n });\n\n const reloadPromise = Promise.all(reloadPromises).then((missingPeerIds) => {\n missingPeerIds = missingPeerIds.filter(Boolean);\n if(!missingPeerIds.length) {\n return;\n }\n\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n });\n\n return reloadPromise;\n }\n\n public async getDialogFilters(overwrite = false): Promise {\n const keys = Object.keys(this.filters);\n if(keys.length > PREPENDED_FILTERS && !overwrite) {\n return keys.map((filterId) => this.filters[filterId]).sort((a, b) => a.localId - b.localId);\n }\n\n const filters = await this.apiManager.invokeApiSingle('messages.getDialogFilters');\n const prepended = this.prependFilters(filters);\n return prepended.map((filter) => this.saveDialogFilter(filter, overwrite)).filter(Boolean);\n }\n\n public getSuggestedDialogsFilters() {\n return this.apiManager.invokeApi('messages.getSuggestedDialogFilters');\n }\n\n public saveDialogFilter(filter: DialogFilter, update = true, silent?: boolean) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n if(filter._ === 'dialogFilterDefault') {\n filter = this.localFilters[FOLDER_ID_ALL];\n }\n\n assumeType(filter);\n if(!REAL_FOLDERS.has(filter.id)) {\n convertment.forEach(([from, to]) => {\n assumeType(filter);\n filter[to] = filter[from].map((peer) => this.appPeersManager.getPeerId(peer));\n });\n\n this.filterIncludedPinnedPeers(filter);\n\n filter.include_peers = filter.pinned_peers.concat(filter.include_peers);\n filter.includePeerIds = filter.pinnedPeerIds.concat(filter.includePeerIds);\n }\n\n const oldFilter = this.filters[filter.id];\n if(oldFilter) {\n Object.assign(oldFilter, filter);\n } else {\n this.filters[filter.id] = filter;\n }\n\n this.setLocalId(filter);\n\n if(!silent) {\n if(update) {\n this.rootScope.dispatchEvent('filter_update', filter);\n } else if(!oldFilter) {\n this.rootScope.dispatchEvent('filter_new', filter);\n }\n }\n\n return filter;\n }\n\n private setLocalId(filter: MyDialogFilter) {\n if(filter.localId !== undefined) {\n if(filter.localId >= this.localId) {\n this.localId = filter.localId + 1;\n }\n } else {\n filter.localId = this.localId++ as MyDialogFilter['localId'];\n findAndSplice(this.filtersArr, (_filter) => _filter.id === filter.id);\n this.filtersArr.push(filter);\n this.pushToState();\n }\n }\n\n public async isFilterIdAvailable(filterId: number) {\n if(REAL_FOLDERS.has(filterId)) {\n return true;\n }\n\n const limit = await this.apiManager.getLimit('folders');\n const isFolderAvailable = this.filtersArr.filter((filter) => !REAL_FOLDERS.has(filter.id)).slice(0, limit).some((filter) => filter.id === filterId);\n\n return isFolderAvailable;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function applyMixins(derivedCtor: any, constructors: any[]) {\n // const callbacks: Array<(...args: any[]) => any> = [];\n\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n const value: PropertyDescriptor = Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null);\n /* if(name === '_constructor') {\n callbacks.push(value.value);\n return;\n } else */if(name === 'constructor') {\n return;\n }\n\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n value\n );\n });\n });\n\n // if(callbacks.length) {\n // function c(...args: any[]): any {\n // callbacks.forEach((cb, idx) => {\n // // @ts-ignore\n // cb.apply(this, args[idx] || []);\n // });\n // };\n\n // Object.defineProperty(derivedCtor.prototype, 'superConstructor', {\n // configurable: true,\n // enumerable: true,\n // value: c,\n // writable: true\n // });\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport DEBUG from '../../config/debug';\nimport {ConstructorDeclMap, Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates} from '../../layer';\nimport {logger, LogTypes} from '../logger';\nimport assumeType from '../../helpers/assumeType';\nimport App from '../../config/app';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport {AppManager} from './manager';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport ctx from '../../environment/ctx';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport applyMixins from '../../helpers/applyMixins';\n\ntype UpdatesState = {\n pendingPtsUpdates: (Update & {pts: number, pts_count: number})[],\n pendingSeqUpdates?: {[seq: number]: {seq: number, date: number, updates: any[]}},\n syncPending: {\n seqAwaiting?: number,\n ptsAwaiting?: boolean,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: number,\n lastDifferenceTime?: number\n};\n\nconst SYNC_DELAY = 6;\n\nclass ApiUpdatesManager {\n public updatesState: UpdatesState = {\n pendingPtsUpdates: [],\n pendingSeqUpdates: {},\n syncPending: null,\n syncLoading: null\n };\n\n private channelStates: {[channelId: ChatId]: UpdatesState} = {};\n private attached = false;\n\n private log = logger('UPDATES', LogTypes.Error | LogTypes.Warn | LogTypes.Log/* | LogTypes.Debug */);\n private debug = DEBUG;\n\n private subscriptions: {[channelId: ChatId]: {count: number, interval?: number}} = {};\n\n constructor() {\n this._constructor(false);\n }\n\n private setProxy() {\n const self = this;\n this.updatesState = new Proxy(this.updatesState, {\n set: function(target: ApiUpdatesManager['updatesState'], key: keyof ApiUpdatesManager['updatesState'], value: ApiUpdatesManager['updatesState'][typeof key]) {\n // @ts-ignore\n target[key] = value;\n self.saveUpdatesState();\n return true;\n }\n });\n }\n\n public saveUpdatesState() {\n const us = this.updatesState;\n this.appStateManager.pushToState('updates', {\n seq: us.seq,\n pts: us.pts,\n date: us.date\n });\n }\n\n private popPendingSeqUpdate() {\n const state = this.updatesState;\n const nextSeq = state.seq + 1;\n const pendingUpdatesData = state.pendingSeqUpdates[nextSeq];\n if(!pendingUpdatesData) {\n return false;\n }\n\n const updates = pendingUpdatesData.updates;\n for(let i = 0, length = updates.length; i < length; ++i) {\n this.saveUpdate(updates[i]);\n }\n\n state.seq = pendingUpdatesData.seq;\n if(pendingUpdatesData.date && state.date < pendingUpdatesData.date) {\n state.date = pendingUpdatesData.date;\n }\n delete state.pendingSeqUpdates[nextSeq];\n\n if(!this.popPendingSeqUpdate() &&\n state.syncPending?.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n this.clearStatePendingSync(state);\n } else {\n delete state.syncPending.seqAwaiting;\n }\n }\n\n return true;\n }\n\n private popPendingPtsUpdate(channelId: ChatId) {\n const curState = channelId ? this.getChannelState(channelId) : this.updatesState;\n if(!curState.pendingPtsUpdates.length) {\n return false;\n }\n\n curState.pendingPtsUpdates.sort((a, b) => {\n return a.pts - b.pts;\n });\n // this.log('pop update', channelId, curState.pendingPtsUpdates)\n\n let curPts = curState.pts;\n let goodPts = 0;\n let goodIndex = 0;\n for(let i = 0, length = curState.pendingPtsUpdates.length; i < length; ++i) {\n const update = curState.pendingPtsUpdates[i];\n curPts += update.pts_count;\n if(curPts >= update.pts) {\n goodPts = update.pts;\n goodIndex = i;\n }\n }\n\n if(!goodPts) {\n return false;\n }\n\n this.debug && this.log.debug('pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1));\n\n curState.pts = goodPts;\n for(let i = 0; i <= goodIndex; ++i) {\n const update = curState.pendingPtsUpdates[i];\n\n // @ts-ignore\n this.saveUpdate(update);\n }\n curState.pendingPtsUpdates.splice(0, goodIndex + 1);\n\n if(!curState.pendingPtsUpdates.length && curState.syncPending) {\n if(!curState.syncPending.seqAwaiting) {\n this.clearStatePendingSync(curState);\n } else {\n delete curState.syncPending.ptsAwaiting;\n }\n }\n\n return true;\n }\n\n public forceGetDifference() {\n if(!this.updatesState.syncLoading) {\n this.getDifference();\n }\n }\n\n public processLocalUpdate(update: Update) {\n this.processUpdateMessage({\n _: 'updateShort',\n update\n } as Updates);\n }\n\n public processUpdateMessage = (updateMessage: any, options: Partial<{\n override: boolean\n }> = {}) => {\n // return forceGetDifference()\n const processOpts = {\n date: updateMessage.date,\n seq: updateMessage.seq,\n seqStart: updateMessage.seq_start\n // ignoreSyncLoading: options.ignoreSyncLoading\n };\n\n this.debug && this.log.debug('processUpdateMessage', updateMessage);\n\n switch(updateMessage._) {\n case 'updatesTooLong':\n case 'new_session_created':\n this.forceGetDifference();\n break;\n\n case 'updateShort':\n this.processUpdate(updateMessage.update, processOpts);\n break;\n\n case 'updateShortMessage':\n case 'updateShortChatMessage': {\n assumeType(updateMessage);\n this.debug && this.log.debug('updateShortMessage | updateShortChatMessage', {...updateMessage});\n const isOut = updateMessage.pFlags.out;\n const fromId = (updateMessage as Updates.updateShortChatMessage).from_id || (isOut ? this.appPeersManager.peerId : (updateMessage as Updates.updateShortMessage).user_id);\n const toId = (updateMessage as Updates.updateShortChatMessage).chat_id ?\n (updateMessage as Updates.updateShortChatMessage).chat_id.toPeerId(true) :\n ((updateMessage as Updates.updateShortMessage).user_id.toPeerId(false) || this.appPeersManager.peerId);\n\n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: this.appPeersManager.getOutputPeer(fromId.toPeerId()),\n peer_id: this.appPeersManager.getOutputPeer(toId),\n date: updateMessage.date,\n message: updateMessage.message,\n fwd_from: updateMessage.fwd_from,\n reply_to: updateMessage.reply_to,\n entities: updateMessage.entities\n },\n pts: updateMessage.pts,\n pts_count: updateMessage.pts_count\n }, processOpts);\n break;\n }\n\n case 'updatesCombined':\n case 'updates':\n this.appUsersManager.saveApiUsers(updateMessage.users, options.override);\n this.appChatsManager.saveApiChats(updateMessage.chats, options.override);\n\n updateMessage.updates.forEach((update: Update) => {\n this.processUpdate(update, processOpts);\n });\n break;\n\n default:\n this.log.warn('Unknown update message', updateMessage);\n }\n };\n\n private getDifference(first = false): Promise {\n // this.trace('Get full diff')\n const updatesState = this.updatesState;\n const wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n\n this.clearStatePendingSync(updatesState);\n\n const promise = this.apiManager.invokeApi('updates.getDifference', {\n pts: updatesState.pts,\n pts_total_limit: first /* && false */? /* 50 */1200 : undefined,\n date: updatesState.date,\n qts: -1\n }, {\n timeout: 0x7fffffff\n }).then((differenceResult) => {\n this.debug && this.log.debug('Get diff result', differenceResult);\n\n if(differenceResult._ === 'updates.differenceEmpty') {\n this.debug && this.log.debug('apply empty diff', differenceResult.seq);\n updatesState.date = differenceResult.date;\n updatesState.seq = differenceResult.seq;\n return;\n }\n\n // ! SORRY I'M SORRY I'M SORRY\n if(first) {\n this.rootScope.dispatchEvent('state_synchronizing');\n }\n\n if(differenceResult._ !== 'updates.differenceTooLong') {\n this.appUsersManager.saveApiUsers(differenceResult.users);\n this.appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n // this.log('applying', differenceResult.other_updates.length, 'other updates')\n\n differenceResult.other_updates.forEach((update) => {\n switch(update._) {\n case 'updateChannelTooLong':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n this.processUpdate(update);\n return;\n }\n\n this.saveUpdate(update);\n });\n\n // this.log('applying', differenceResult.new_messages.length, 'new messages')\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewMessage',\n message: apiMessage,\n pts: updatesState.pts,\n pts_count: 0\n });\n });\n\n const nextState = differenceResult._ === 'updates.difference' ? differenceResult.state : differenceResult.intermediate_state;\n updatesState.seq = nextState.seq;\n updatesState.pts = nextState.pts;\n updatesState.date = nextState.date;\n } else {\n updatesState.pts = differenceResult.pts;\n updatesState.date = (Date.now() / 1000 | 0) + this.timeManager.getServerTimeOffset();\n delete updatesState.seq;\n\n this.channelStates = {};\n\n this.log.warn('getDifference:', differenceResult._);\n this.onDifferenceTooLong();\n }\n\n // this.log('apply diff', updatesState.seq, updatesState.pts)\n\n if(differenceResult._ === 'updates.differenceSlice') {\n return this.getDifference();\n } else {\n this.debug && this.log.debug('finished get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(updatesState, promise);\n }\n\n return promise;\n }\n\n private clearStatePendingSync(state: UpdatesState) {\n if(state.syncPending) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\n }\n }\n\n private getChannelDifference(channelId: ChatId): Promise {\n const channelState = this.getChannelState(channelId);\n const wasSyncing = channelState.syncLoading;\n if(!wasSyncing) {\n channelState.pendingPtsUpdates = [];\n }\n\n this.clearStatePendingSync(channelState);\n\n const log = this.debug ? this.log.bindPrefix('getChannelDifference-' + channelId) : undefined;\n // this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\n const promise = this.apiManager.invokeApi('updates.getChannelDifference', {\n channel: this.appChatsManager.getChannelInput(channelId),\n filter: {_: 'channelMessagesFilterEmpty'},\n pts: channelState.pts,\n limit: 1000\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n log?.debug('diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n channelState.lastDifferenceTime = Date.now();\n\n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n // log?.debug('apply channel empty diff', differenceResult);\n return;\n }\n\n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n // log?.debug('channel diff too long', differenceResult);\n delete this.channelStates[channelId];\n\n this.saveUpdate({_: 'updateChannelReload', channel_id: channelId});\n return;\n }\n\n this.appUsersManager.saveApiUsers(differenceResult.users);\n this.appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n log?.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n\n log?.debug('applying', differenceResult.new_messages.length, 'channel new messages');\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewChannelMessage',\n message: apiMessage,\n pts: channelState.pts,\n pts_count: 0\n });\n });\n\n log?.debug('apply channel diff', channelState.pts);\n\n if(differenceResult._ === 'updates.channelDifference' &&\n !differenceResult.pFlags.final) {\n return this.getChannelDifference(channelId);\n } else {\n log?.debug('finished channel get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(channelState, promise, channelId);\n }\n\n return promise;\n }\n\n private onDifferenceTooLong() {\n this.appUsersManager.clear();\n this.appChatsManager.clear();\n this.appMessagesManager.clear();\n\n this.rootScope.dispatchEvent('state_cleared');\n }\n\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\n state.syncLoading = promise;\n this.rootScope.dispatchEvent('state_synchronizing', channelId);\n\n promise.then(() => {\n state.syncLoading = null;\n this.rootScope.dispatchEvent('state_synchronized', channelId);\n }, () => {\n state.syncLoading = null;\n });\n }\n\n public addChannelState(channelId: ChatId, pts: number) {\n if(!pts) {\n throw new Error('Add channel state without pts ' + channelId);\n }\n\n return this.channelStates[channelId] ??= {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\n }\n\n public getChannelState(channelId: ChatId, pts?: number) {\n if(this.channelStates[channelId] === undefined) {\n this.addChannelState(channelId, pts);\n }\n\n return this.channelStates[channelId];\n }\n\n private processUpdate(update: Update, options: Partial<{\n date: number,\n seq: number,\n seqStart: number/* ,\n ignoreSyncLoading: boolean */\n }> = {}) {\n let channelId: ChatId;\n switch(update._) {\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n channelId = this.appPeersManager.getPeerId(update.message.peer_id).toChatId();\n break;\n /* case 'updateDeleteChannelMessages':\n channelId = update.channel_id;\n break; */\n case 'updateChannelTooLong':\n channelId = update.channel_id;\n if(!(channelId in this.channelStates)) {\n return false;\n }\n break;\n default:\n if('channel_id' in update && 'pts' in update) {\n channelId = update.channel_id;\n }\n break;\n }\n\n const {pts, pts_count} = update as Update.updateNewMessage;\n const curState = channelId ? this.getChannelState(channelId, pts) : this.updatesState;\n\n // this.log.log('process', channelId, curState.pts, update)\n\n if(curState.syncLoading/* && !options.ignoreSyncLoading */) {\n return false;\n }\n\n if(update._ === 'updateChannelTooLong') {\n if(!curState.lastPtsUpdateTime ||\n curState.lastPtsUpdateTime < (Date.now() - SYNC_DELAY)) {\n // this.log.trace('channel too long, get diff', channelId, update)\n this.getChannelDifference(channelId);\n }\n return false;\n }\n\n if(update._ === 'updateNewMessage' ||\n update._ === 'updateEditMessage' ||\n update._ === 'updateNewChannelMessage' ||\n update._ === 'updateEditChannelMessage') {\n const message = update.message as Message.message;\n const toPeerId = this.appPeersManager.getPeerId(message.peer_id);\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\n let reason: string;\n if(message.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !this.appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\n toPeerId.isUser() && !this.appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\n toPeerId.isAnyChat() && !this.appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\n if(channelId && this.appChatsManager.hasChat(channelId)) {\n this.getChannelDifference(channelId);\n } else {\n this.forceGetDifference();\n }\n return false;\n }\n } else if(channelId && !this.appChatsManager.hasChat(channelId)) {\n // this.log.log('skip update, missing channel', channelId, update)\n return false;\n }\n\n let popPts: boolean;\n let popSeq: boolean;\n\n if(pts) {\n const newPts = curState.pts + (pts_count || 0);\n if(newPts < pts) {\n this.debug && this.log.warn('Pts hole', curState, update, channelId && this.appChatsManager.getChat(channelId));\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\n if(!curState.syncPending && !curState.syncLoading) {\n curState.syncPending = {\n timeout: ctx.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n if(channelId) {\n this.getChannelDifference(channelId);\n } else {\n this.getDifference();\n }\n }, SYNC_DELAY)\n };\n }\n\n curState.syncPending.ptsAwaiting = true;\n return false;\n }\n\n if(pts > curState.pts) {\n curState.pts = pts;\n popPts = true;\n\n curState.lastPtsUpdateTime = Date.now();\n } else if(pts_count) {\n // this.log.warn('Duplicate update', update)\n return false;\n }\n\n if(channelId && options.date && this.updatesState.date < options.date) {\n this.updatesState.date = options.date;\n }\n } else if(!channelId && options.seq > 0) {\n const seq = options.seq;\n const seqStart = options.seqStart || seq;\n\n if(seqStart !== curState.seq + 1) {\n if(seqStart > curState.seq) {\n this.debug && this.log.warn('Seq hole', curState, curState.syncPending?.seqAwaiting);\n\n curState.pendingSeqUpdates[seqStart] ??= {seq, date: options.date, updates: []};\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n\n if(!curState.syncPending) {\n curState.syncPending = {\n timeout: ctx.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n this.getDifference();\n }, SYNC_DELAY)\n };\n }\n\n if(!curState.syncPending.seqAwaiting ||\n curState.syncPending.seqAwaiting < seqStart) {\n curState.syncPending.seqAwaiting = seqStart;\n }\n return false;\n }\n }\n\n if(curState.seq !== seq) {\n curState.seq = seq;\n if(options.date && curState.date < options.date) {\n curState.date = options.date;\n }\n\n popSeq = true;\n }\n }\n\n this.saveUpdate(update);\n\n if(popPts) {\n this.popPendingPtsUpdate(channelId);\n } else if(popSeq) {\n this.popPendingSeqUpdate();\n }\n }\n\n public saveUpdate(update: Update) {\n // this.debug && this.log('saveUpdate', update);\n this.dispatchEvent(update._, update as any);\n }\n\n public subscribeToChannelUpdates(channelId: ChatId) {\n const subscription = this.subscriptions[channelId] ??= {count: 0};\n ++subscription.count;\n\n const cb = () => {\n const state = this.getChannelState(channelId);\n if(!state.syncLoading && (!state.lastDifferenceTime || (Date.now() - state.lastDifferenceTime) > 2500)) {\n this.getChannelDifference(channelId);\n }\n };\n\n subscription.interval ??= ctx.setInterval(cb, 3000);\n cb();\n }\n\n public unsubscribeFromChannelUpdates(channelId: ChatId, force?: boolean) {\n const subscription = this.subscriptions[channelId];\n if(!subscription?.interval || (--subscription.count && !force)) {\n return;\n }\n\n clearInterval(subscription.interval);\n subscription.interval = undefined;\n delete this.subscriptions[channelId];\n }\n\n public attach(langCode?: string) {\n if(this.attached) return;\n\n // return;\n\n this.log('attach');\n\n this.attached = true;\n\n this.appStateManager.getState().then(({updates: state}) => {\n const newVersion = this.appStateManager.newVersion/* || '1.6.0' */;\n\n // rootScope.broadcast('state_synchronizing');\n if(!state || !state.pts || !state.date/* || !state.seq */) { // seq can be undefined because of updates.differenceTooLong\n this.log('will get new state');\n\n this.updatesState.syncLoading = new Promise((resolve) => {\n this.apiManager.invokeApi('updates.getState', {}, {noErrorBox: true}).then((stateResult) => {\n this.updatesState.seq = stateResult.seq;\n this.updatesState.pts = stateResult.pts;\n this.updatesState.date = stateResult.date;\n this.saveUpdatesState();\n // setTimeout(() => {\n this.updatesState.syncLoading = null;\n resolve();\n // rootScope.broadcast('state_synchronized');\n // }, 1000);\n\n // ! for testing\n // updatesState.seq = 1\n // updatesState.pts = stateResult.pts - 5000\n // updatesState.date = 1\n // getDifference()\n });\n });\n } else {\n // ! for testing\n /* state.seq = 1;\n state.pts = state.pts - 15;\n state.date = 1; */\n // state.pts -= 100;\n\n // state.date = 1628623682;\n // state.pts = 2007500;\n // state.seq = 503;\n\n Object.assign(this.updatesState, state);\n\n this.log('will get difference', Object.assign({}, state));\n\n this.getDifference(true)/* .finally(() => {\n if(this.updatesState.syncLoading) {\n rootScope.broadcast('state_synchronizing');\n }\n }) */;\n }\n\n this.apiManager.setUpdatesProcessor(this.processUpdateMessage);\n\n // this.updatesState.syncLoading.then(() => {\n this.setProxy();\n // });\n\n if(newVersion) {\n this.updatesState.syncLoading.then(async() => {\n const strs: Record = {\n en: 'was updated to version',\n ru: 'обновлён до версии'\n };\n\n const getChangelog = (lang: string) => {\n fetch(`changelogs/${lang}_${newVersion.split(' ')[0]}.md`)\n .then((res) => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then((text) => {\n const langStr = strs[lang] || strs.en;\n const pre = `**Telegram Web${App.suffix} ${langStr} ${newVersion}**\\n\\n`;\n\n text = pre + text;\n\n const entities: MessageEntity[] = [];\n const message = parseMarkdown(text, entities);\n\n const update: Update.updateServiceNotification = {\n _: 'updateServiceNotification',\n entities,\n message,\n type: 'local',\n pFlags: {},\n inbox_date: Date.now() / 1000 | 0,\n media: undefined\n };\n\n this.processLocalUpdate(update);\n });\n };\n\n const languages = filterUnique([langCode, 'en']);\n for(const language of languages) {\n try {\n await getChangelog(language);\n break;\n } catch(err) {\n\n }\n }\n });\n }\n });\n }\n}\n\ninterface ApiUpdatesManager extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n}>, AppManager {}\napplyMixins(ApiUpdatesManager, [EventListenerBase, AppManager]);\n\nexport {ApiUpdatesManager};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {UserProfilePhoto, ChatPhoto, InputFileLocation} from '../../layer';\nimport {DownloadOptions} from '../mtproto/apiFileManager';\nimport {AppManager} from './manager';\n\nexport type PeerPhotoSize = 'photo_small' | 'photo_big';\n\nexport class AppAvatarsManager extends AppManager {\n private savedAvatarURLs: {\n [peerId: PeerId]: {\n [size in PeerPhotoSize]?: string | Promise\n }\n } = {};\n\n protected after() {\n this.rootScope.addEventListener('avatar_update', ({peerId, threadId}) => {\n if(threadId) {\n return;\n }\n\n this.removeFromAvatarsCache(peerId);\n });\n }\n\n public isAvatarCached(peerId: PeerId, size?: PeerPhotoSize) {\n const saved = this.savedAvatarURLs[peerId];\n if(size === undefined) {\n return !!saved;\n }\n\n return !!(saved && saved[size] && !(saved[size] instanceof Promise));\n }\n\n public removeFromAvatarsCache(peerId: PeerId) {\n if(this.savedAvatarURLs[peerId]) {\n delete this.savedAvatarURLs[peerId];\n }\n }\n\n public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) {\n const saved = this.savedAvatarURLs[peerId] ??= {};\n if(!saved[size]) {\n // console.warn('will invoke downloadSmallFile:', peerId);\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\n _: 'inputPeerPhotoFileLocation',\n pFlags: {},\n peer: this.appPeersManager.getInputPeerById(peerId),\n photo_id: photo.photo_id\n };\n\n const downloadOptions: DownloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\n if(size === 'photo_big') {\n peerPhotoFileLocation.pFlags.big = true;\n downloadOptions.limitPart = 512 * 1024;\n }\n\n /* let str: string;\n const time = Date.now();\n if(peerId === 0) {\n str = `download avatar ${peerId}`;\n } */\n\n const promise = this.apiFileManager.download(downloadOptions);\n return saved[size] = promise.then((blob) => {\n return saved[size] = URL.createObjectURL(blob);\n\n /* if(str) {\n console.log(str, Date.now() / 1000, Date.now() - time);\n } */\n });\n } else {\n return saved[size];\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getEnvironment} from '../../environment/utils';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {nextRandomUint} from '../../helpers/random';\nimport {InputPhoneCall, MessagesDhConfig, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, PhonePhoneCall} from '../../layer';\nimport {AppManager} from './manager';\n\nexport type CallId = PhoneCall['id'];\n\nexport type MyPhoneCall = Exclude;\n\nexport class AppCallsManager extends AppManager {\n private calls: Map;\n\n protected after() {\n this.calls = new Map();\n\n if(!getEnvironment().IS_CALL_SUPPORTED) {\n return;\n }\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updatePhoneCall: (update) => {\n this.saveCall(update.phone_call);\n },\n\n updatePhoneCallSignalingData: (update) => {\n this.rootScope.dispatchEvent('call_signaling', {callId: update.phone_call_id, data: update.data});\n }\n });\n }\n\n public computeKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n return this.cryptoWorker.invokeCrypto('compute-dh-key', g_b, a, p);\n }\n\n public saveCall(call: PhoneCall) {\n const isDiscarded = call._ === 'phoneCallDiscarded';\n const oldCall = this.calls.get(call.id);\n if(oldCall) {\n // if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n // }\n\n if(isDiscarded) {\n this.calls.delete(call.id);\n }\n\n call = oldCall;\n } else if(!isDiscarded) {\n this.calls.set(call.id, call as any);\n }\n\n this.rootScope.dispatchEvent('call_update', call);\n\n return call;\n }\n\n public getCall(callId: CallId) {\n return this.calls.get(callId);\n }\n\n public getCallInput(id: CallId): InputPhoneCall {\n const call = this.getCall(id);\n return {\n _: 'inputPhoneCall',\n id: call.id,\n access_hash: call.access_hash\n };\n }\n\n public savePhonePhoneCall(phonePhoneCall: PhonePhoneCall) {\n this.appUsersManager.saveApiUsers(phonePhoneCall.users);\n return this.saveCall(phonePhoneCall.phone_call);\n }\n\n public generateDh() {\n return this.apiManager.invokeApi('messages.getDhConfig', {\n version: 0,\n random_length: 256\n }).then((dhConfig) => {\n return this.cryptoWorker.invokeCrypto('generate-dh', dhConfig as MessagesDhConfig.messagesDhConfig);\n });\n }\n\n // private verifyProtocolCompatibility(protocol: PhoneCallProtocol) {\n // const my = getCallProtocol();\n // const myVersion = my.library_versions[0];\n // return !protocol.library_versions.find((version) => {\n // return compareVersion(myVersion, version) > 0;\n // });\n // }\n\n public async requestCall(userId: UserId, protocol: PhoneCallProtocol, g_a_hash: Uint8Array, video?: boolean) {\n const phonePhoneCall = await this.apiManager.invokeApi('phone.requestCall', {\n user_id: this.appUsersManager.getUserInput(userId),\n protocol: protocol,\n video: video,\n random_id: nextRandomUint(32),\n g_a_hash: g_a_hash\n });\n\n return this.savePhonePhoneCall(phonePhoneCall);\n }\n\n public async discardCall(callId: CallId, duration: number, reason: PhoneCallDiscardReason['_'], video?: boolean) {\n if(!this.getCall(callId)) {\n return;\n }\n\n const updates = await this.apiManager.invokeApi('phone.discardCall', {\n video,\n peer: this.getCallInput(callId),\n duration,\n reason: {\n _: reason\n },\n connection_id: '0'\n });\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport deepEqual from '../../helpers/object/deepEqual';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {ChannelParticipant, ChannelsCreateChannel, Chat, ChatAdminRights, ChatBannedRights, ChatInvite, ChatPhoto, ChatReactions, InputChannel, InputChatPhoto, InputFile, InputPeer, MessagesSponsoredMessages, SponsoredMessage, Update, Updates} from '../../layer';\nimport {isRestricted} from '../../helpers/restrictions';\nimport {AppManager} from './manager';\nimport hasRights from './utils/chats/hasRights';\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\nimport {AppStoragesManager} from './appStoragesManager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport {randomLong} from '../../helpers/random';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport type Channel = Chat.channel;\nexport type ChatRights = keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags'] | 'change_type' | 'change_permissions' | 'delete_chat' | 'view_participants';\n\nexport class AppChatsManager extends AppManager {\n private storage: AppStoragesManager['storages']['chats'];\n\n private chats: {[id: ChatId]: Exclude};\n // private usernames: any;\n // private channelAccess: any;\n // private megagroups: {[id: number]: true};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n /* updateChannel: (update) => {\n const channelId = update.channel_id;\n //console.log('updateChannel:', update);\n rootScope.broadcast('channel_settings', {channelId});\n }, */\n\n updateChannelParticipant: (update) => {\n this.apiManager.clearCache('channels.getParticipants', (params) => {\n return (params.channel as InputChannel.inputChannel).channel_id === update.channel_id;\n });\n },\n\n updateChatDefaultBannedRights: (update) => {\n const chatId = this.appPeersManager.getPeerId(update.peer).toChatId();\n const chat = this.chats[chatId] as Chat.chat;\n if(chat) {\n chat.default_banned_rights = update.default_banned_rights;\n this.rootScope.dispatchEvent('chat_update', chatId);\n }\n }\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('chats')\n ]).then(([state, {results: chats, storage}]) => {\n this.storage = storage;\n\n this.saveApiChats(chats);\n\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\n if(peerId.isUser() || this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.set({\n [peerId.toChatId()]: this.getChat(peerId.toChatId())\n });\n });\n\n this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\n if(peerId.isUser() || !this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.delete(peerId.toChatId());\n });\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n for(const chatId in this.chats) {\n if(!chatId) continue;\n if(!this.peersStorage.isPeerNeeded(chatId.toPeerId(true))) {\n const chat = this.chats[chatId];\n this.appUsersManager.modifyUsernamesCache(chat, false);\n\n this.storage.delete(chatId);\n delete this.chats[chatId];\n }\n }\n } else {\n this.chats = {};\n }\n };\n\n public saveApiChats(apiChats: any[], override?: boolean) {\n if((apiChats as any).saved) return;\n (apiChats as any).saved = true;\n apiChats.forEach((chat) => this.saveApiChat(chat, override));\n }\n\n public saveApiChat(chat: Chat, override?: boolean) {\n if(!chat || chat._ === 'chatEmpty') return;\n /* if(chat._ !== 'chat' && chat._ !== 'channel') {\n return;\n } */\n\n // * exclude from state\n // defineNotNumerableProperties(chat, ['rTitle', 'initials']);\n\n const oldChat = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n (chat as Chat.chat).pFlags ??= {};\n\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\n return;\n }\n\n if(chat._ === 'channel' &&\n chat.participants_count === undefined &&\n oldChat !== undefined &&\n (oldChat as Chat.channel).participants_count) {\n chat.participants_count = (oldChat as Chat.channel).participants_count;\n }\n\n if((chat as Chat.channel).photo?._ === 'chatPhotoEmpty') {\n delete (chat as Chat.channel).photo;\n }\n\n const changedUsername = this.appUsersManager.setUsernameToCache(chat, oldChat);\n\n /* if(chat.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n const peerId = chat.id.toPeerId(true);\n if(oldChat === undefined) {\n this.chats[chat.id] = chat;\n } else {\n const oldPhotoId = ((oldChat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n const newPhotoId = ((chat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n const toggledForum = (oldChat as Chat.channel).pFlags.forum !== (chat as Chat.channel).pFlags.forum;\n const changedPhoto = oldPhotoId !== newPhotoId || toggledForum;\n\n const changedTitle = oldChat.title !== chat.title || changedUsername;\n\n const changedAnyBadge = (oldChat as Chat.channel).pFlags.verified !== (chat as Chat.channel).pFlags.verified ||\n (oldChat as Chat.channel).pFlags.scam !== (chat as Chat.channel).pFlags.scam ||\n (oldChat as Chat.channel).pFlags.fake !== (chat as Chat.channel).pFlags.fake;\n\n safeReplaceObject(oldChat, chat);\n this.rootScope.dispatchEvent('chat_update', chat.id);\n\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', {peerId});\n }\n\n if(changedTitle || changedAnyBadge) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId});\n }\n\n if(toggledForum) {\n this.rootScope.dispatchEvent('chat_toggle_forum', {chatId: chat.id, enabled: !!(chat as Chat.channel).pFlags.forum});\n }\n }\n\n if(this.peersStorage.isPeerNeeded(peerId)) {\n this.storage.set({\n [chat.id]: chat\n });\n }\n }\n\n public getChat(id: ChatId) {\n return this.chats[id];\n }\n\n /**\n * Check the user's ability to do an action in chat\n * @param id\n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread\n * @returns\n */\n public hasRights(id: ChatId, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n return hasRights(this.getChat(id), action, rights, isThread);\n }\n\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\n const chat = this.getChat(id) as Chat.chat;\n if(chat.default_banned_rights) {\n if(chat.default_banned_rights.until_date === banned_rights.until_date && deepEqual(chat.default_banned_rights.pFlags, banned_rights.pFlags)) {\n return Promise.resolve();\n }\n }\n\n return this.apiManager.invokeApi('messages.editChatDefaultBannedRights', {\n peer: this.appPeersManager.getInputPeerById(id.toPeerId(true)),\n banned_rights\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n /* public resolveUsername(username: string) {\n return this.usernames[username] || 0;\n } */\n\n /* public saveChannelAccess(id: ChatId, accessHash: string) {\n this.channelAccess[id] = accessHash;\n } */\n\n /* public saveIsMegagroup(id: ChatId) {\n this.megagroups[id] = true;\n } */\n\n public isChannel(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */);\n }\n\n public isMegagroup(id: ChatId) {\n /* if(this.megagroups[id]) {\n return true;\n } */\n\n const chat: Chat = this.chats[id];\n return !!(chat as Chat.channel)?.pFlags?.megagroup;\n }\n\n public isForum(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat as Chat.channel)?.pFlags?.forum;\n }\n\n public isBroadcast(id: ChatId) {\n return this.isChannel(id) && !this.isMegagroup(id);\n }\n\n public isInChat(id: ChatId) {\n let good = true;\n const chat: Chat = this.getChat(id);\n if(!chat ||\n chat._ === 'channelForbidden' ||\n chat._ === 'chatForbidden' ||\n (chat as any as Chat.chatEmpty)._ === 'chatEmpty' ||\n (chat as Chat.chat).pFlags.left ||\n // || (chat as any).pFlags.kicked\n (chat as Chat.chat).pFlags.deactivated) {\n good = false;\n }\n\n return good;\n }\n\n public getChannelInput(id: ChatId): InputChannel {\n const chat: Chat = this.getChat(id);\n if(!chat || !(chat as Chat.channel).access_hash) {\n return {\n _: 'inputChannelEmpty'\n };\n } else {\n return {\n _: 'inputChannel',\n channel_id: id,\n access_hash: (chat as Chat.channel).access_hash/* || this.channelAccess[id] */ || '0'\n };\n }\n }\n\n public getInputPeer(id: ChatId) {\n return this.isChannel(id) ? this.getChannelInputPeer(id) : this.getChatInputPeer(id);\n }\n\n public getChatInputPeer(id: ChatId): InputPeer.inputPeerChat {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n\n public getChannelInputPeer(id: ChatId): InputPeer.inputPeerChannel {\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: (this.getChat(id) as Chat.channel).access_hash/* || this.channelAccess[id] */ || 0\n };\n }\n\n public hasChat(id: ChatId, allowMin?: true) {\n const chat = this.chats[id];\n return isObject(chat) && (allowMin || !(chat as Chat.channel).pFlags.min);\n }\n\n public getChatString(id: ChatId) {\n const chat = this.getChat(id);\n if(this.isChannel(id)) {\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + (chat as Chat.channel).access_hash;\n }\n return 'g' + id;\n }\n\n /* public wrapForFull(id: number, fullChat: any) {\n const chatFull = copy(fullChat);\n const chat = this.getChat(id);\n\n if(!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n\n if(chatFull.participants &&\n chatFull.participants._ === 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n\n if(chatFull.about) {\n chatFull.rAbout = wrapRichText(chatFull.about, {noLinebreaks: true});\n }\n\n //chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n\n return chatFull;\n }\n\n public wrapParticipants(id: number, participants: any[]) {\n const chat = this.getChat(id);\n const myId = appUsersManager.getSelf().id;\n if(this.isChannel(id)) {\n const isAdmin = chat.pFlags.creator;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = isAdmin && participant._ === 'channelParticipant';\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n } else {\n const isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = !participant.canLeave && (\n chat.pFlags.creator ||\n participant._ === 'chatParticipant' && (isAdmin || myId === participant.inviter_id)\n );\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n }\n\n return participants;\n } */\n\n public createChannel(options: ChannelsCreateChannel): Promise {\n return this.apiManager.invokeApi('channels.createChannel', options).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const channelId = (updates as any).chats[0].id;\n return channelId;\n });\n }\n\n public inviteToChannel(id: ChatId, userIds: UserId[]) {\n const input = this.getChannelInput(id);\n const usersInputs = userIds.map((u) => this.appUsersManager.getUserInput(u));\n\n return this.apiManager.invokeApi('channels.inviteToChannel', {\n channel: input,\n users: usersInputs\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public createChat(title: string, userIds: UserId[]): Promise {\n return this.apiManager.invokeApi('messages.createChat', {\n users: userIds.map((u) => this.appUsersManager.getUserInput(u)),\n title\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const chatId = (updates as any as Updates.updates).chats[0].id;\n return chatId;\n });\n }\n\n private onChatUpdated = (chatId: ChatId, updates?: Updates) => {\n // console.log('onChatUpdated', chatId, updates);\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n if((updates as Updates.updates)?.updates?.length && this.isChannel(chatId)) {\n this.rootScope.dispatchEvent('invalidate_participants', chatId);\n }\n };\n\n public leaveChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.leaveChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public joinChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.joinChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public addChatUser(id: ChatId, userId: UserId, fwdLimit = 100) {\n return this.apiManager.invokeApi('messages.addChatUser', {\n chat_id: id,\n user_id: this.appUsersManager.getUserInput(userId),\n fwd_limit: fwdLimit\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChatUser(id: ChatId, userId: UserId) {\n return this.apiManager.invokeApi('messages.deleteChatUser', {\n chat_id: id,\n user_id: this.appUsersManager.getUserInput(userId)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public leaveChat(id: ChatId) {\n return this.deleteChatUser(id, this.appUsersManager.getSelf().id);\n }\n\n public leave(id: ChatId) {\n return this.isChannel(id) ? this.leaveChannel(id) : this.leaveChat(id);\n }\n\n public delete(id: ChatId) {\n return this.isChannel(id) ? this.deleteChannel(id) : this.deleteChat(id);\n }\n\n public deleteChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.deleteChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChat(id: ChatId) {\n // return this.leaveChat(id).then(() => {\n return this.apiManager.invokeApi('messages.deleteChat', {\n chat_id: id\n });\n // });\n }\n\n public migrateChat(id: ChatId): Promise {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channel') return Promise.resolve(chat.id);\n return this.apiManager.invokeApi('messages.migrateChat', {\n chat_id: id\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n const update: Update.updateChannel = (updates as Updates.updates).updates.find((u) => u._ === 'updateChannel') as any;\n return update.channel_id;\n });\n }\n\n public updateUsername(id: ChatId, username: string, doNotRefresh?: boolean) {\n const promise = this.apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n });\n\n return this.refreshChatAfterRequest(id, promise, doNotRefresh);\n }\n\n public editPhoto(id: ChatId, inputFile: InputFile) {\n const inputChatPhoto: InputChatPhoto = {\n _: 'inputChatUploadedPhoto',\n file: inputFile\n };\n\n let promise: any;\n if(this.isChannel(id)) {\n promise = this.apiManager.invokeApi('channels.editPhoto', {\n channel: this.getChannelInput(id),\n photo: inputChatPhoto\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatPhoto', {\n chat_id: id,\n photo: inputChatPhoto\n });\n }\n\n return promise.then(this.onChatUpdated.bind(this, id));\n }\n\n public editTitle(id: ChatId, title: string) {\n let promise: any;\n\n if(this.isChannel(id)) {\n promise = this.apiManager.invokeApi('channels.editTitle', {\n channel: this.getChannelInput(id),\n title\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatTitle', {\n chat_id: id,\n title\n });\n }\n\n return promise.then(this.onChatUpdated.bind(this, id));\n }\n\n public editAbout(id: ChatId, about: string) {\n const peerId = id.toPeerId(true);\n return this.apiManager.invokeApi('messages.editChatAbout', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n about\n }).then((bool) => {\n if(bool) {\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return bool;\n });\n }\n\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\n const peerId = typeof(participant) !== 'object' ? participant : getParticipantPeerId(participant);\n return this.apiManager.invokeApi('channels.editBanned', {\n channel: this.getChannelInput(id),\n participant: this.appPeersManager.getInputPeerById(peerId),\n banned_rights\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n\n if(typeof(participant) === 'object') {\n const timestamp = Date.now() / 1000 | 0;\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelParticipant',\n channel_id: id,\n date: timestamp,\n actor_id: undefined,\n qts: undefined,\n user_id: peerId,\n prev_participant: participant,\n new_participant: Object.keys(banned_rights.pFlags).length ? {\n _: 'channelParticipantBanned',\n date: timestamp,\n banned_rights,\n kicked_by: this.appUsersManager.getSelf().id,\n peer: this.appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } : undefined\n });\n }\n });\n }\n\n public clearChannelParticipantBannedRights(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {}\n });\n }\n\n public kickFromChannel(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {\n view_messages: true\n }\n });\n }\n\n public kickFromChat(id: ChatId, participant: PeerId | ChannelParticipant) {\n if(this.isChannel(id)) return this.kickFromChannel(id, participant);\n else return this.deleteChatUser(id, (participant as PeerId).toUserId());\n }\n\n public resolveChannel(id: ChatId) {\n return this.apiManager.invokeApiSingle('channels.getChannels', {\n id: [{\n _: 'inputChannel',\n channel_id: id,\n access_hash: '0'\n }]\n }).then((messagesChats) => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public togglePreHistoryHidden(id: ChatId, enabled: boolean) {\n return this.migrateChat(id).then((channelId) => {\n return this.apiManager.invokeApi('channels.togglePreHistoryHidden', {\n channel: this.getChannelInput(channelId),\n enabled\n }).then(this.onChatUpdated.bind(this, channelId));\n });\n }\n\n public toggleSignatures(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('channels.toggleSignatures', {\n channel: this.getChannelInput(id),\n enabled\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public toggleNoForwards(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('messages.toggleNoForwards', {\n peer: this.getInputPeer(id),\n enabled\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public setChatAvailableReactions(id: ChatId, reactions: ChatReactions) {\n const chatFull = this.appProfileManager.getCachedFullChat(id);\n if(chatFull) {\n chatFull.available_reactions = reactions;\n this.rootScope.dispatchEvent('chat_full_update', id);\n }\n\n return this.apiManager.invokeApi('messages.setChatAvailableReactions', {\n peer: this.getInputPeer(id),\n available_reactions: reactions\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public getSendAs(channelId: ChatId) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getSendAs',\n params: {\n peer: this.getChannelInputPeer(channelId)\n },\n processResult: (sendAsPeers) => {\n this.appUsersManager.saveApiUsers(sendAsPeers.users);\n this.saveApiChats(sendAsPeers.chats);\n\n return sendAsPeers.peers;\n }\n });\n }\n\n public importChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.importChatInvite', {hash})\n .then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n const chat = (updates as Updates.updates).chats[0];\n return chat.id;\n });\n }\n\n public checkUsername(chatId: ChatId, username: string) {\n return this.apiManager.invokeApi('channels.checkUsername', {\n channel: this.getChannelInput(chatId),\n username\n });\n }\n\n public getSponsoredMessage(chatId: ChatId) {\n // const s: MessagesSponsoredMessages.messagesSponsoredMessages = {\n // '_': 'messages.sponsoredMessages',\n // 'messages': [\n // {\n // '_': 'sponsoredMessage',\n // 'pFlags': {},\n // 'flags': 9,\n // 'random_id': new Uint8Array([\n // 80,\n // 5,\n // 249,\n // 174,\n // 44,\n // 73,\n // 173,\n // 14,\n // 246,\n // 81,\n // 187,\n // 182,\n // 223,\n // 5,\n // 4,\n // 128\n // ]),\n // 'from_id': {\n // '_': 'peerUser',\n // 'user_id': 983000232\n // },\n // 'start_param': 'GreatMinds',\n // 'message': 'This is a long sponsored message. In fact, it has the maximum length allowed on the platform – 160 characters 😬😬. It\\'s promoting a bot with a start parameter.' + chatId\n // }\n // ],\n // 'chats': [],\n // 'users': [\n // {\n // '_': 'user',\n // 'pFlags': {\n // 'bot': true,\n // 'verified': true,\n // 'apply_min_photo': true\n // },\n // 'flags': 34226219,\n // 'id': 983000232,\n // 'access_hash': '-294959558742535650',\n // 'first_name': 'Quiz Bot',\n // 'username': 'QuizBot',\n // 'photo': {\n // '_': 'userProfilePhoto',\n // 'pFlags': {},\n // 'flags': 2,\n // 'photo_id': '4221953848856651689',\n // 'stripped_thumb': new Uint8Array([\n // 1,\n // 8,\n // 8,\n // 155,\n // 247,\n // 95,\n // 103,\n // 255,\n // 0,\n // 110,\n // 138,\n // 40,\n // 174,\n // 132,\n // 142,\n // 6,\n // 238,\n // 127\n // ]),\n // 'dc_id': 2\n // },\n // 'bot_info_version': 11,\n // 'bot_inline_placeholder': 'Search a quiz...',\n // 'sortName': 'quiz bot'\n // }\n // ]\n // };\n\n // const promise = Promise.resolve(s);\n const promise = this.apiManager.invokeApiCacheable('channels.getSponsoredMessages', {\n channel: this.getChannelInput(chatId)\n }, {cacheSeconds: 300});\n\n return promise.then((sponsoredMessages) => {\n if(sponsoredMessages._ === 'messages.sponsoredMessages') {\n this.appUsersManager.saveApiUsers(sponsoredMessages.users);\n this.appChatsManager.saveApiChats(sponsoredMessages.chats);\n\n const sponsoredMessage = sponsoredMessages.messages.shift();\n sponsoredMessages.messages.push(sponsoredMessage);\n }\n\n return sponsoredMessages;\n });\n }\n\n public viewSponsoredMessage(chatId: ChatId, randomId: SponsoredMessage['random_id']) {\n return this.apiManager.invokeApiSingle('channels.viewSponsoredMessage', {\n channel: this.getChannelInput(chatId),\n random_id: randomId\n });\n }\n\n public checkChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.checkChatInvite', {\n hash: hash\n }).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n return chatInvite;\n });\n }\n\n public toggleUsername(chatId: ChatId, username: string, active: boolean) {\n const promise = this.apiManager.invokeApi('channels.toggleUsername', {\n channel: this.getChannelInput(chatId),\n username,\n active\n });\n\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public reorderUsernames(chatId: ChatId, order: string[]) {\n const promise = this.apiManager.invokeApi('channels.reorderUsernames', {\n channel: this.getChannelInput(chatId),\n order\n });\n\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public deactivateAllUsernames(chatId: ChatId, doNotRefresh?: boolean) {\n const promise = this.apiManager.invokeApi('channels.deactivateAllUsernames', {\n channel: this.getChannelInput(chatId)\n });\n\n return this.refreshChatAfterRequest(chatId, promise, doNotRefresh);\n }\n\n public makeChannelPrivate(chatId: ChatId) {\n const promises: Promise[] = [\n this.updateUsername(chatId, '', true),\n this.deactivateAllUsernames(chatId, true)\n ];\n\n const promise = Promise.all(promises).then(() => true);\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public refreshChatAfterRequest>(chatId: ChatId, promise: T, doNotRefresh?: boolean): T {\n if(doNotRefresh) {\n return promise;\n }\n\n return promise.then((value) => {\n return this.getChannels([chatId]).then(() => value);\n }) as T;\n }\n\n public getChannels(chatIds: ChatId[]) {\n return this.apiManager.invokeApi('channels.getChannels', {\n id: chatIds.map((chatId) => this.getChannelInput(chatId))\n }).then((messagesChats) => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public toggleForum(chatId: ChatId, enabled: boolean) {\n return this.migrateChat(chatId).then((channelId) => {\n return this.apiManager.invokeApi('channels.toggleForum', {\n channel: this.getChannelInput(channelId),\n enabled\n }).then(this.onChatUpdated.bind(this, channelId));\n });\n }\n\n public editForumTopic(options: {\n chatId: ChatId,\n topicId: number,\n title?: string,\n iconEmojiId?: DocId,\n closed?: boolean,\n hidden?: boolean\n }) {\n const {chatId, topicId, title, iconEmojiId, closed, hidden} = options;\n return this.apiManager.invokeApi('channels.editForumTopic', {\n channel: this.getChannelInput(chatId),\n topic_id: getServerMessageId(topicId),\n title,\n icon_emoji_id: iconEmojiId,\n closed,\n hidden\n }).then(this.onChatUpdated.bind(this, chatId));\n }\n\n public async createForumTopic(options: {\n chatId: ChatId,\n title: string,\n iconColor: number,\n iconEmojiId: DocId\n }) {\n const {chatId, title, iconColor, iconEmojiId} = options;\n\n const channelFull = await this.appProfileManager.getChannelFull(chatId);\n const sendAsInputPeer = channelFull.default_send_as && this.appPeersManager.getInputPeerById(this.appPeersManager.getPeerId(channelFull.default_send_as));\n\n return this.apiManager.invokeApi('channels.createForumTopic', {\n channel: this.getChannelInput(chatId),\n title,\n icon_color: iconColor,\n icon_emoji_id: iconEmojiId,\n random_id: randomLong(),\n send_as: sendAsInputPeer\n }).then((updates) => {\n this.onChatUpdated(chatId, updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateNewChannelMessage') as Update.updateNewChannelMessage;\n return generateMessageId(update.message.id);\n });\n }\n\n public updatePinnedForumTopic(chatId: ChatId, topicId: number, pinned: boolean) {\n return this.apiManager.invokeApi('channels.updatePinnedForumTopic', {\n channel: this.getChannelInput(chatId),\n topic_id: getServerMessageId(topicId),\n pinned\n }).then(this.onChatUpdated.bind(this, chatId));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\nimport {setDirection} from '../helpers/dom/setInnerHTML';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n 'messageActionBotAllowed': 'Chat.Service.BotPermissionAllowed'\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n export let isRTL = false;\n\n export function setRTL(rtl: boolean) {\n isRTL = rtl;\n }\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n rootScope.dispatchEvent('language_change', currentLangCode);\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n out.push(string.slice(lastIndex, offset));\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n out.push(a);\n } else if(args) {\n pushNextArgument(out, args, indexHolder);\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map((item) => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.textContent = '';\n this.element.append(...format(this.key, false, this.args) as any);\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n }\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n setDirection(this.element);\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n const arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n return arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n const joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type addAnchorListener from '../../helpers/addAnchorListener';\nimport {PHONE_NUMBER_REG_EXP} from '.';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport matchUrlProtocol from './matchUrlProtocol';\nimport {T_ME_PREFIXES} from '../mtproto/mtproto_config';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean) {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n const out: {url: string, onclick?: Parameters[0]['name']} = {url};\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: typeof out['onclick'];\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?(?:(.+?)\\.)?(?:(?:web|k|z)\\.)?t(?:elegram)?\\.me(?:\\/(.+))?/))) {\n const u = new URL(url);\n let prefix = tgMeMatch[1];\n if(prefix && T_ME_PREFIXES.has(tgMeMatch[1])) {\n prefix = undefined;\n }\n\n if(prefix) {\n u.pathname = prefix + (u.pathname === '/' ? '' : u.pathname);\n }\n\n const fullPath = u.pathname.slice(1);\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n } else if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) { // second regexp is for phone numbers (t.me/+38050...)\n onclick = 'joinchat';\n } else switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'addemoji':\n case 'voicechat':\n case 'invoice':\n if(path.length !== 1 && !prefix) {\n onclick = path[0];\n break;\n }\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1] as any;\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n\n out.onclick = onclick;\n return out;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.wrapUrl = wrapUrl);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import I18n from '../../lib/langPack';\n\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment | Element) {\n setDirection(elem);\n if(typeof(html) === 'string') {\n if(!html) elem.replaceChildren();\n else elem.innerHTML = html;\n } else {\n elem.replaceChildren(html);\n }\n}\n\nexport function setDirection(elem: Element) {\n // if(!I18n.isRTL) {\n elem.setAttribute('dir', 'auto');\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport I18n, {i18n} from '../lib/langPack';\n\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const ONE_DAY = 86400;\n\n// https://stackoverflow.com/a/6117889\nexport const getWeekNumber = (date: Date) => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\n};\n\nexport function formatDateAccordingToTodayNew(time: Date) {\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n const options: Intl.DateTimeFormatOptions = {};\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\n options.hour = options.minute = '2-digit';\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\n options.year = options.day = 'numeric';\n options.month = '2-digit';\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\n options.weekday = 'short';\n } else { // same year\n options.month = 'short';\n options.day = 'numeric';\n }\n\n return new I18n.IntlDateElement({\n date: time,\n options\n }).element;\n}\n\nexport function formatFullSentTimeRaw(timestamp: number, options: {\n capitalize?: boolean\n} = {}) {\n const date = new Date();\n const time = new Date(timestamp * 1000);\n const now = date.getTime() / 1000;\n\n const timeEl = formatTime(time);\n\n let dateEl: Node | string;\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\n\n if(options.capitalize) {\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\n }\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\n } else {\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\n }\n\n return {dateEl, timeEl};\n}\n\nexport function formatFullSentTime(timestamp: number) {\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\n capitalize: true\n });\n\n const fragment = document.createDocumentFragment();\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\n return fragment;\n}\n\nexport function formatTime(date: Date) {\n return new I18n.IntlDateElement({\n date,\n options: {\n hour: '2-digit',\n minute: '2-digit'\n }\n }).element;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\n\nexport const getFullDate = (date: Date, options: Partial<{\n noTime: true,\n noSeconds: true,\n monthAsNumber: true,\n leadingZero: true\n}> = {}) => {\n const joiner = options.monthAsNumber ? '.' : ' ';\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\n\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\n joiner + date.getFullYear() +\n (options.noTime ? '' : ', ' + time);\n};\n\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\nconst minYear = 2013;\nconst yearPattern = new RegExp('20[0-9]{1,2}');\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nexport type DateData = {\n title: string,\n minDate: number,\n maxDate: number,\n};\nexport function fillTipDates(query: string, dates: DateData[]) {\n const q = query.trim().toLowerCase();\n\n if(q.length < 3) {\n return;\n }\n\n if('today'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: 'Today',\n minDate,\n maxDate\n });\n return;\n }\n\n if('yesterday'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime() - 86400000;\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 86400001;\n dates.push({\n title: 'Yesterday',\n minDate,\n maxDate\n });\n return;\n }\n\n const dayOfWeek = getDayOfWeek(q);\n if(dayOfWeek >= 0) {\n const date = new Date();\n const now = date.getTime();\n const currentDay = date.getDay();\n const distance = dayOfWeek - currentDay;\n date.setDate(date.getDate() + distance);\n if(date.getTime() > now) {\n date.setTime(date.getTime() - 604800000);\n }\n const year = date.getFullYear()\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatWeekLong(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n let matches: any[];\n if((matches = shortDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const k = parseInt(g1);\n const k1 = parseInt(g2);\n if(k > 0 && k <= 31) {\n if(k1 >= minYear && k <= 12) {\n const selectedYear = k1;\n const month = k - 1;\n createForMonthYear(dates, month, selectedYear);\n return;\n } else if(k1 <= 12) {\n const day = k - 1;\n const month = k1 - 1;\n createForDayMonth(dates, day, month);\n }\n } else if(k >= minYear && k1 <= 12) {\n const selectedYear = k;\n const month = k1 - 1;\n createForMonthYear(dates, month, selectedYear);\n }\n\n return;\n }\n\n if((matches = longDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const g3 = matches[5];\n if(!matches[2] === matches[4]) {\n return;\n }\n\n const day = parseInt(g1);\n const month = parseInt(g2) - 1;\n let year = parseInt(g3);\n if(year >= 10 && year <= 99) {\n year += 2000;\n }\n\n const currentYear = new Date().getFullYear();\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\n const date = new Date();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n return;\n }\n\n if((matches = yearPattern.exec(q)) !== null) {\n let selectedYear = +q;\n const currentYear = new Date().getFullYear();\n if(selectedYear < minYear) {\n selectedYear = minYear;\n for(let i = currentYear; i >= selectedYear; i--) {\n const date = new Date();\n date.setFullYear(i, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(i + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + i,\n minDate,\n maxDate\n });\n }\n } else if(selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(selectedYear + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + selectedYear,\n minDate,\n maxDate\n });\n }\n\n return;\n }\n\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g1);\n if(month >= 0) {\n const k = +g2;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n return;\n }\n }\n }\n\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g2);\n if(month >= 0) {\n const k = +g1;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n }\n }\n }\n}\n\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n if(selectedYear >= minYear && selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, month, 1);\n date.setHours(0, 0, 0);\n const minDate = date.getTime();\n if(minDate > today) {\n return;\n }\n date.setMonth(date.getMonth() + 1);\n const maxDate = date.getTime() - 1;\n\n dates.push({\n title: formatterMonthYear(minDate),\n minDate,\n maxDate\n });\n }\n}\n\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\n if(validDateForMonth(day, month)) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n\n for(let i = currentYear; i >= minYear; i--) {\n if(month === 1 && day === 28 && !isLeapYear(i)) {\n continue;\n }\n\n const date = new Date();\n date.setFullYear(i, month, day + 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n if(minDate > today) {\n continue;\n }\n\n date.setFullYear(i, month, day + 2);\n date.setHours(0, 0, 0);\n const maxDate = date.getTime() - 1;\n if(i === currentYear) {\n dates.push({\n title: formatterDayMonth(minDate),\n minDate,\n maxDate\n });\n } else {\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n }\n }\n }\n}\n\nfunction formatterMonthYear(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\n}\n\nfunction formatterDayMonth(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\n}\n\nfunction formatterYearMax(timestamp: number) {\n const date = new Date(timestamp);\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\n}\n\nfunction formatWeekLong(timestamp: number) {\n const date = new Date(timestamp);\n return days[date.getDay()];\n}\n\nfunction validDateForMonth(day: number, month: number) {\n if(month >= 0 && month < 12) {\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLeapYear(year: number) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n}\n\nfunction getMonth(q: string) {\n /* String[] months = new String[]{\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\n }; */\n\n /* String[] monthsEng = new String[12];\n Calendar c = Calendar.getInstance();\n for (int i = 1; i <= 12; i++) {\n c.set(0, 0, 0, 0, 0, 0);\n c.set(Calendar.MONTH, i);\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\n } */\n\n q = q.toLowerCase();\n for(let i = 0; i < 12; i++) {\n const month = months[i].toLowerCase();\n if(month.indexOf(q) === 0) {\n return i;\n }\n }\n return -1;\n}\n\nfunction getDayOfWeek(q: string) {\n const c = new Date();\n if(q.length <= 3) {\n return -1;\n }\n\n for(let i = 0; i < 7; i++) {\n c.setDate(c.getDate() + 1);\n\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\n return c.getDay();\n }\n }\n return -1;\n}\n\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\n","/**\n * Will be used for FILE_REFERENCE_EXPIRED\n * @param key\n * @param wasObject\n * @param newObject\n */\nexport default function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\n if('byteLength' in newObject[key]) { // Uint8Array\n newObject[key] = [...newObject[key]];\n }\n\n if(wasObject && wasObject[key] !== newObject[key]) {\n wasObject[key].length = newObject[key].length;\n (newObject[key] as any[]).forEach((v, i) => {\n wasObject[key][i] = v;\n });\n\n /* wasObject[key].set(newObject[key]); */\n newObject[key] = wasObject[key];\n }\n}\n","export const EXTENSION_MIME_TYPE_MAP: {[ext in MTFileExtension]: MTMimeType} = {\n pdf: 'application/pdf',\n tgv: 'application/x-tgwallpattern',\n tgs: 'application/x-tgsticker',\n json: 'application/json',\n wav: 'audio/wav',\n mp3: 'audio/mpeg',\n ogg: 'audio/ogg',\n jpeg: 'image/jpeg',\n jpg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n mp4: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n svg: 'image/svg+xml'\n};\n\nexport const MIME_TYPE_EXTENSION_MAP: {[mimeType in MTMimeType]?: MTFileExtension} = {};\n\nfor(const ext in EXTENSION_MIME_TYPE_MAP) {\n MIME_TYPE_EXTENSION_MAP[EXTENSION_MIME_TYPE_MAP[ext as MTFileExtension]] = ext as MTFileExtension;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {ThumbCache} from '../storages/thumbs';\nimport {AccountWallPapers, Document, DocumentAttribute, MessagesSavedGifs, PhotoSize, WallPaper} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {getFullDate} from '../../helpers/date';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\nimport {AppManager} from './manager';\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\nimport assumeType from '../../helpers/assumeType';\nimport {getEnvironment} from '../../environment/utils';\nimport {isServiceWorkerOnline} from '../mtproto/mtproto.worker';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport getDocumentInputFileLocation from './utils/docs/getDocumentInputFileLocation';\nimport getDocumentURL from './utils/docs/getDocumentURL';\nimport makeError from '../../helpers/makeError';\nimport {EXTENSION_MIME_TYPE_MAP} from '../../environment/mimeTypeMap';\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n\nexport type MyDocument = Document.document;\n\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\n\ntype WallPaperId = WallPaper.wallPaper['id'];\n\nlet uploadWallPaperTempId = 0;\n\nexport class AppDocsManager extends AppManager {\n private docs: {[docId: DocId]: MyDocument};\n\n private stickerCachedThumbs: {[docId: DocId]: {[toneIndex: number]: {url: string, w: number, h: number}}};\n\n private uploadingWallPapers: {[id: WallPaperId]: {cacheContext: ThumbCache, file: File}};\n\n protected after() {\n this.docs = {};\n this.stickerCachedThumbs = {};\n this.uploadingWallPapers = {};\n\n MTProtoMessagePort.getInstance().addEventListener('serviceWorkerOnline', (online) => {\n if(!online) {\n this.onServiceWorkerFail();\n }\n });\n }\n\n private onServiceWorkerFail = () => {\n for(const id in this.docs) {\n const doc = this.docs[id];\n\n if(doc.supportsStreaming) {\n delete doc.supportsStreaming;\n this.thumbsStorage.deleteCacheContext(doc);\n }\n }\n };\n\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\n if(!doc || doc._ === 'documentEmpty') {\n return;\n }\n\n const oldDoc = this.docs[doc.id];\n\n if(doc.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldDoc, doc);\n this.referenceDatabase.saveContext(doc.file_reference, context);\n }\n\n // console.log('saveDoc', apiDoc, this.docs[apiDoc.id]);\n // if(oldDoc) {\n // //if(doc._ !== 'documentEmpty' && doc._ === d._) {\n // if(doc.thumbs) {\n // if(!oldDoc.thumbs) oldDoc.thumbs = doc.thumbs;\n // /* else if(apiDoc.thumbs[0].bytes && !d.thumbs[0].bytes) {\n // d.thumbs.unshift(apiDoc.thumbs[0]);\n // } else if(d.thumbs[0].url) { // fix for converted thumb in safari\n // apiDoc.thumbs[0] = d.thumbs[0];\n // } */\n // }\n\n // //}\n\n // return oldDoc;\n\n // //return Object.assign(d, apiDoc, context);\n // //return context ? Object.assign(d, context) : d;\n // }\n\n if(!oldDoc) {\n this.docs[doc.id] = doc;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(doc, [/* 'thumbs', */'type', 'h', 'w', 'file_name',\n // 'file', 'duration', 'downloaded', 'url', 'audioTitle',\n // 'audioPerformer', 'sticker', 'stickerEmoji', 'stickerEmojiRaw',\n // 'stickerSetInput', 'stickerThumbConverted', 'animated', 'supportsStreaming']);\n\n for(let i = 0, length = doc.attributes.length; i < length; ++i) {\n const attribute = doc.attributes[i];\n switch(attribute._) {\n case 'documentAttributeFilename': {\n doc.file_name = wrapPlainText(attribute.file_name);\n break;\n }\n\n case 'documentAttributeAudio': {\n if(doc.type === 'round') {\n break;\n }\n\n doc.duration = attribute.duration;\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n break;\n }\n\n case 'documentAttributeVideo': {\n doc.duration = attribute.duration;\n doc.w = attribute.w;\n doc.h = attribute.h;\n // apiDoc.supportsStreaming = attribute.pFlags?.supports_streaming/* && apiDoc.size > 524288 */;\n if(/* apiDoc.thumbs && */attribute.pFlags.round_message) {\n doc.type = 'round';\n } else /* if(apiDoc.thumbs) */ {\n doc.type = 'video';\n }\n break;\n }\n\n case 'documentAttributeCustomEmoji':\n case 'documentAttributeSticker': {\n if(attribute.alt !== undefined) {\n doc.stickerEmojiRaw = attribute.alt;\n }\n\n if(attribute.stickerset) {\n if(attribute.stickerset._ === 'inputStickerSetEmpty') {\n delete attribute.stickerset;\n } else if(attribute.stickerset._ === 'inputStickerSetID') {\n doc.stickerSetInput = attribute.stickerset;\n }\n }\n\n // * there can be no thumbs, then it is a document\n if(/* apiDoc.thumbs && */doc.mime_type === 'image/webp' && (doc.thumbs || getEnvironment().IS_WEBP_SUPPORTED)) {\n doc.type = 'sticker';\n doc.sticker = 1;\n } else if(doc.mime_type === 'video/webm') {\n if(!getEnvironment().IS_WEBM_SUPPORTED) {\n break;\n }\n\n doc.type = 'sticker';\n doc.sticker = 3;\n doc.animated = true;\n }\n break;\n }\n\n case 'documentAttributeImageSize': {\n doc.type = 'photo';\n doc.w = attribute.w;\n doc.h = attribute.h;\n break;\n }\n\n case 'documentAttributeAnimated': {\n if((doc.mime_type === 'image/gif' || doc.mime_type === 'video/mp4')/* && apiDoc.thumbs */) {\n doc.type = 'gif';\n }\n\n doc.animated = true;\n break;\n }\n }\n }\n\n if(!doc.mime_type) {\n const ext = (doc.file_name || '').split('.').pop();\n // @ts-ignore\n const mappedMimeType = ext && EXTENSION_MIME_TYPE_MAP[ext.toLowerCase()];\n if(mappedMimeType) {\n doc.mime_type = mappedMimeType;\n } else {\n switch(doc.type) {\n case 'gif':\n case 'video':\n case 'round':\n doc.mime_type = 'video/mp4';\n break;\n case 'sticker':\n doc.mime_type = 'image/webp';\n break;\n case 'audio':\n doc.mime_type = 'audio/mpeg';\n break;\n case 'voice':\n doc.mime_type = 'audio/ogg';\n break;\n default:\n doc.mime_type = 'application/octet-stream';\n break;\n }\n }\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.pdf) {\n doc.type = 'pdf';\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.gif) {\n doc.type = 'gif';\n } else if(doc.mime_type === 'application/x-tgsticker' && doc.file_name === 'AnimatedSticker.tgs') {\n doc.type = 'sticker';\n doc.animated = true;\n doc.sticker = 2;\n }\n\n if(doc.type === 'voice' || doc.type === 'round') {\n // browser will identify extension\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeFilename') as DocumentAttribute.documentAttributeFilename;\n const ext = attribute && attribute.file_name.split('.').pop();\n const date = getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n doc.file_name = `${doc.type}_${date}${ext ? '.' + ext : ''}`;\n }\n\n if(isServiceWorkerOnline() && ((doc.type === 'gif' && doc.size > 8e6) || doc.type === 'audio' || doc.type === 'video')/* || doc.mime_type.indexOf('video/') === 0 */) {\n doc.supportsStreaming = true;\n\n const cacheContext = this.thumbsStorage.getCacheContext(doc);\n if(!cacheContext.url) {\n this.thumbsStorage.setCacheContextURL(doc, undefined, getDocumentURL(doc), 0);\n }\n } else {\n doc.supportsStreaming = false;\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n\n doc.file_name ||= '';\n\n /* if(!doc.url) {\n doc.url = this.getFileURL(doc);\n } */\n\n if(oldDoc) {\n return Object.assign(oldDoc, doc);\n }\n\n return doc;\n }\n\n public getDoc(docId: DocId | MyDocument): MyDocument {\n return isObject(docId) ? docId : this.docs[docId];\n }\n\n public downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean) {\n return this.apiFileManager.downloadMedia({\n media: doc,\n queueId,\n onlyCache\n });\n }\n\n public getLottieCachedThumb(docId: DocId, toneIndex: number) {\n const cached = this.stickerCachedThumbs[docId];\n return cached && cached[toneIndex];\n }\n\n public saveLottiePreview(docId: DocId, blob: Blob, width: number, height: number, toneIndex: number) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const cached = this.stickerCachedThumbs[doc.id] ??= {};\n\n const thumb = cached[toneIndex];\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n cached[toneIndex] = {\n url: URL.createObjectURL(blob),\n w: width,\n h: height\n };\n }\n\n public saveWebPConvertedStrippedThumb(docId: DocId, bytes: Uint8Array) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const thumb = doc.thumbs && doc.thumbs.find((thumb) => thumb._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n if(!thumb) {\n return;\n }\n\n doc.pFlags.stickerThumbConverted = true;\n thumb.bytes = bytes;\n }\n\n public getWallPapers() {\n return this.apiManager.invokeApiHashable({method: 'account.getWallPapers'}).then((accountWallpapers) => {\n const wallPapers = (accountWallpapers as AccountWallPapers.accountWallPapers).wallpapers as WallPaper.wallPaper[];\n wallPapers.forEach((wallPaper) => {\n wallPaper.document = this.saveDoc(wallPaper.document);\n });\n\n return wallPapers;\n });\n }\n\n public prepareWallPaperUpload(file: File) {\n const id = 'wallpaper-upload-' + ++uploadWallPaperTempId;\n\n const thumb = {\n _: 'photoSize',\n h: 0,\n w: 0,\n location: {} as any,\n size: file.size,\n type: THUMB_TYPE_FULL\n } as PhotoSize.photoSize;\n let document: MyDocument = {\n _: 'document',\n access_hash: '',\n attributes: [],\n dc_id: 0,\n file_reference: [],\n id,\n mime_type: file.type as MTMimeType,\n size: file.size,\n date: Date.now() / 1000,\n pFlags: {},\n thumbs: [thumb],\n file_name: file.name\n };\n\n document = this.saveDoc(document);\n\n const cacheContext = this.thumbsStorage.setCacheContextURL(document, undefined, URL.createObjectURL(file), file.size);\n\n const wallpaper: WallPaper.wallPaper = {\n _: 'wallPaper',\n access_hash: '',\n document: document,\n id,\n slug: id,\n pFlags: {}\n };\n\n this.uploadingWallPapers[id] = {\n cacheContext,\n file\n };\n\n return wallpaper;\n }\n\n public uploadWallPaper(id: WallPaperId) {\n const {cacheContext, file} = this.uploadingWallPapers[id];\n delete this.uploadingWallPapers[id];\n\n const upload = this.apiFileManager.upload({file, fileName: file.name});\n return upload.then((inputFile) => {\n return this.apiManager.invokeApi('account.uploadWallPaper', {\n file: inputFile,\n mime_type: file.type,\n settings: {\n _: 'wallPaperSettings'\n\n }\n }).then((wallPaper) => {\n assumeType(wallPaper);\n wallPaper.document = this.saveDoc(wallPaper.document);\n this.thumbsStorage.setCacheContextURL(wallPaper.document, undefined, cacheContext.url, cacheContext.downloaded);\n\n return wallPaper;\n });\n });\n }\n\n public getGifs() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getSavedGifs',\n processResult: (res) => {\n assumeType(res);\n return res.gifs.map((doc) => this.saveDoc(doc));\n }\n });\n }\n\n public requestDocPart(docId: DocId, dcId: number, offset: number, limit: number) {\n const doc = this.getDoc(docId);\n if(!doc) return Promise.reject(makeError('NO_DOC'));\n return this.apiFileManager.requestFilePart(dcId, getDocumentInputFileLocation(doc), offset, limit);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {FileURLType, getFileURL} from '../../../../helpers/fileName';\nimport {Document, PhotoSize} from '../../../../layer';\nimport getDocumentDownloadOptions from './getDocumentDownloadOptions';\n\nexport default function getDocumentURL(doc: Document.document, download = false, thumb?: PhotoSize.photoSize) {\n let type: FileURLType;\n if(download) {\n type = 'download';\n } else if(thumb) {\n type = 'thumb';\n } else if(doc.supportsStreaming) {\n type = 'stream';\n } else {\n type = 'document';\n }\n\n return getFileURL(type, getDocumentDownloadOptions(doc, thumb));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MessageEntity, DraftMessage, MessagesSaveDraft} from '../../layer';\nimport tsNow from '../../helpers/tsNow';\nimport stateStorage from '../stateStorage';\nimport assumeType from '../../helpers/assumeType';\nimport {AppManager} from './manager';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport draftsAreEqual from './utils/drafts/draftsAreEqual';\n\nexport type MyDraftMessage = DraftMessage.draftMessage;\n\nexport class AppDraftsManager extends AppManager {\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\n private getAllDraftPromise: Promise;\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateDraftMessage: (update) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n this.saveDraft({\n peerId,\n threadId: update.threadId,\n draft: update.draft,\n notify: true\n });\n }\n });\n\n /* return */stateStorage.get('drafts').then((drafts) => {\n this.drafts = drafts || {};\n });\n }\n\n private getKey(peerId: PeerId, threadId?: number) {\n return '' + peerId + (threadId ? '_' + threadId : '');\n }\n\n public getDraft(peerId: PeerId, threadId?: number) {\n return this.drafts[this.getKey(peerId, threadId)];\n }\n\n public addMissedDialogs() {\n return this.getAllDrafts().then(() => {\n for(const key in this.drafts) {\n if(key.indexOf('_') !== -1) { // exclude threads\n continue;\n }\n\n const peerId = key.toPeerId();\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\n if(!dialog) {\n this.appMessagesManager.reloadConversation(peerId);\n /* const dialog = appMessagesManager.generateDialog(peerId);\n dialog.draft = this.drafts[key];\n appMessagesManager.saveConversation(dialog);\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\n appMessagesManager.scheduleHandleNewDialogs(); */\n }\n }\n });\n }\n\n private getAllDrafts() {\n return this.getAllDraftPromise ??= this.apiManager.invokeApi('messages.getAllDrafts')\n .then((updates) => {\n const p = this.apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\n p.then(() => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n });\n }\n\n public saveDraft({peerId, threadId, draft: apiDraft, notify, force}: {\n peerId: PeerId,\n threadId?: number,\n draft: DraftMessage,\n notify?: boolean,\n force?: boolean\n }) {\n const draft = this.processApiDraft(apiDraft);\n\n const key = this.getKey(peerId, threadId);\n if(draft) {\n this.drafts[key] = draft;\n } else {\n delete this.drafts[key];\n }\n\n stateStorage.set({\n drafts: this.drafts\n });\n\n if(notify) {\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\n this.rootScope.dispatchEvent('draft_updated', {\n peerId,\n threadId,\n draft,\n force\n });\n }\n\n return draft;\n }\n\n private isEmptyDraft(draft: DraftMessage) {\n if(draft?._ !== 'draftMessage') {\n return true;\n }\n\n if(draft.reply_to_msg_id !== undefined && draft.reply_to_msg_id > 0) {\n return false;\n }\n\n if(!draft.message.length) {\n return true;\n }\n\n return false;\n }\n\n private processApiDraft(draft: DraftMessage): MyDraftMessage {\n if(!draft || draft._ !== 'draftMessage') {\n return undefined;\n }\n\n if(draft.reply_to_msg_id) {\n draft.reply_to_msg_id = generateMessageId(draft.reply_to_msg_id);\n }\n\n return draft;\n }\n\n public syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\n // console.warn(dT(), 'sync draft', peerID)\n const serverDraft = this.getDraft(peerId, threadId);\n if(draftsAreEqual(serverDraft, localDraft)) {\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\n return true;\n }\n\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\n const params: MessagesSaveDraft = {\n peer: this.appPeersManager.getInputPeerById(peerId),\n message: ''\n };\n\n let draftObj: DraftMessage;\n if(this.isEmptyDraft(localDraft)) {\n draftObj = {_: 'draftMessageEmpty'};\n } else {\n assumeType(localDraft);\n const message = localDraft.message;\n const entities: MessageEntity[] = localDraft.entities;\n\n if(localDraft.reply_to_msg_id) {\n params.reply_to_msg_id = getServerMessageId(localDraft.reply_to_msg_id);\n }\n\n if(entities?.length) {\n params.entities = this.appMessagesManager.getInputEntities(entities);\n }\n\n if(localDraft.pFlags.no_webpage) {\n params.no_webpage = localDraft.pFlags.no_webpage;\n }\n\n params.message = message;\n }\n\n if(threadId) {\n params.top_msg_id = getServerMessageId(threadId);\n }\n\n const saveLocalDraft = draftObj || localDraft;\n saveLocalDraft.date = tsNow(true) + this.timeManager.getServerTimeOffset();\n\n this.saveDraft({\n peerId,\n threadId,\n draft: saveLocalDraft,\n notify: true,\n force\n });\n\n if(saveOnServer) {\n return this.apiManager.invokeApi('messages.saveDraft', params);\n }\n\n return true;\n }\n\n public clearAllDrafts() {\n return this.apiManager.invokeApi('messages.clearAllDrafts').then((bool) => {\n if(!bool) {\n return;\n }\n\n for(const combined in this.drafts) {\n const [peerId, threadId] = combined.split('_');\n this.rootScope.dispatchEvent('draft_updated', {\n peerId: peerId.toPeerId(),\n threadId: threadId ? +threadId : undefined,\n draft: undefined\n });\n }\n });\n }\n\n public clearDraft(peerId: PeerId, threadId: number) {\n const emptyDraft: DraftMessage.draftMessageEmpty = {\n _: 'draftMessageEmpty'\n };\n\n if(threadId) {\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\n } else {\n this.saveDraft({\n peerId,\n threadId,\n draft: emptyDraft,\n notify: true,\n force: true\n });\n }\n }\n\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\n const draft: DraftMessage.draftMessage = {\n _: 'draftMessage',\n date: Date.now() / 1000 | 0,\n message,\n pFlags: {},\n entities\n };\n\n if(threadId) {\n this.syncDraft(peerId, threadId, draft, false, true);\n } else {\n this.saveDraft({\n peerId,\n threadId,\n draft,\n notify: true,\n force: true\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from './appDocsManager';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport isObject from '../../helpers/object/isObject';\nimport validateInitObject from '../../helpers/object/validateInitObject';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport SearchIndex from '../searchIndex';\nimport stateStorage from '../stateStorage';\nimport {AppManager} from './manager';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\n\ntype EmojiLangPack = {\n keywords: {\n [keyword: string]: string[],\n },\n version: number,\n langCode: string\n};\n\nconst EMOJI_LANG_PACK: EmojiLangPack = {\n keywords: {},\n version: 0,\n langCode: App.langPackCode\n};\n\nconst RECENT_MAX_LENGTH = 32;\n\ntype EmojiType = 'native' | 'custom';\n\nexport class AppEmojiManager extends AppManager {\n private static POPULAR_EMOJI = ['😂', '😘', '❤️', '😍', '😊', '😁', '👍', '☺️', '😔', '😄', '😭', '💋', '😒', '😳', '😜', '🙈', '😉', '😃', '😢', '😝', '😱', '😡', '😏', '😞', '😅', '😚', '🙊', '😌', '😀', '😋', '😆', '👌', '😐', '😕'];\n private keywordLangPacks: {\n [langCode: string]: EmojiLangPack\n } = {};\n\n private index: SearchIndex;\n private indexedLangPacks: {[langCode: string]: boolean} = {};\n\n private getKeywordsPromises: {[langCode: string]: Promise} = {};\n\n private recent: {native?: string[], custom?: DocId[]} = {};\n private getRecentEmojisPromises: {native?: Promise, custom?: Promise} = {};\n\n private getCustomEmojiDocumentsPromise: Promise;\n private getCustomEmojiDocumentPromises: Map> = new Map();\n\n /* public getPopularEmoji() {\n return stateStorage.get('emojis_popular').then((popEmojis) => {\n var result = []\n if (popEmojis && popEmojis.length) {\n for (var i = 0, len = popEmojis.length; i < len; i++) {\n result.push({code: popEmojis[i][0], rate: popEmojis[i][1]})\n }\n callback(result)\n return\n }\n\n return stateStorage.get('emojis_recent').then((recentEmojis) => {\n recentEmojis = recentEmojis || popular || []\n var shortcut\n var code\n for (var i = 0, len = recentEmojis.length; i < len; i++) {\n shortcut = recentEmojis[i]\n if (Array.isArray(shortcut)) {\n shortcut = shortcut[0]\n }\n if (shortcut && typeof shortcut === 'string') {\n if (shortcut.charAt(0) == ':') {\n shortcut = shortcut.substr(1, shortcut.length - 2)\n }\n if (code = shortcuts[shortcut]) {\n result.push({code: code, rate: 1})\n }\n }\n }\n callback(result)\n });\n });\n }\n\n function pushPopularEmoji (code) {\n getPopularEmoji(function (popularEmoji) {\n var exists = false\n var count = popularEmoji.length\n var result = []\n for (var i = 0; i < count; i++) {\n if (popularEmoji[i].code == code) {\n exists = true\n popularEmoji[i].rate++\n }\n result.push([popularEmoji[i].code, popularEmoji[i].rate])\n }\n if (exists) {\n result.sort(function (a, b) {\n return b[1] - a[1]\n })\n } else {\n if (result.length > 41) {\n result = result.slice(0, 41)\n }\n result.push([code, 1])\n }\n ConfigStorage.set({emojis_popular: result})\n })\n } */\n\n public getEmojiKeywords(langCode: string = App.langPackCode) {\n const promise = this.getKeywordsPromises[langCode];\n if(promise) {\n return promise;\n }\n\n const storageKey: any = 'emojiKeywords_' + langCode;\n return this.getKeywordsPromises[langCode] = stateStorage.get(storageKey).then((pack: EmojiLangPack) => {\n if(!isObject(pack)) {\n pack = {} as any;\n }\n\n validateInitObject(EMOJI_LANG_PACK, pack);\n\n // important\n pack.langCode = langCode;\n this.keywordLangPacks[langCode] = pack;\n\n return this.apiManager.invokeApi('messages.getEmojiKeywordsDifference', {\n lang_code: pack.langCode,\n from_version: pack.version\n }).then((keywordsDifference) => {\n pack.version = keywordsDifference.version;\n\n const packKeywords = pack.keywords;\n const keywords = keywordsDifference.keywords;\n for(let i = 0, length = keywords.length; i < length; ++i) {\n const {keyword, emoticons} = keywords[i];\n packKeywords[keyword] = emoticons;\n }\n\n stateStorage.set({\n [storageKey]: pack\n });\n\n return pack;\n }, () => {\n return pack;\n });\n });\n }\n\n public getBothEmojiKeywords() {\n const promises: Promise[] = [\n this.getEmojiKeywords()\n ];\n\n if(this.networkerFactory.language !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(this.networkerFactory.language));\n }\n\n if(!this.recent.native) {\n promises.push(this.getRecentEmojis('native'));\n }\n\n return Promise.all(promises);\n }\n\n private indexEmojis() {\n if(!this.index) {\n this.index = new SearchIndex(undefined, 2);\n }\n\n for(const langCode in this.keywordLangPacks) {\n if(this.indexedLangPacks[langCode]) {\n continue;\n }\n\n const pack = this.keywordLangPacks[langCode];\n const keywords = pack.keywords;\n\n for(const keyword in keywords) {\n const emoticons = keywords[keyword];\n this.index.indexObject(emoticons, keyword);\n }\n\n this.indexedLangPacks[langCode] = true;\n }\n }\n\n public searchEmojis(q: string) {\n this.indexEmojis();\n\n q = q.toLowerCase().replace(/_/g, ' ');\n\n // const perf = performance.now();\n let emojis: Array;\n if(q.trim()) {\n const set = this.index.search(q);\n emojis = Array.from(set).reduce((acc, v) => acc.concat(v), []);\n } else {\n emojis = this.recent.native.concat(AppEmojiManager.POPULAR_EMOJI).slice(0, RECENT_MAX_LENGTH);\n }\n\n emojis = Array.from(new Set(emojis));\n // console.log('searchEmojis', q, 'time', performance.now() - perf);\n\n /* for(let i = 0, length = emojis.length; i < length; ++i) {\n if(emojis[i].includes(zeroWidthJoiner) && !emojis[i].includes('\\ufe0f')) {\n emojis[i] += '\\ufe0f';\n }\n } */\n\n return emojis;\n }\n\n public getRecentEmojis(type: 'custom'): Promise;\n public getRecentEmojis(type: 'native'): Promise;\n public getRecentEmojis(type: T): Promise {\n const promises = this.getRecentEmojisPromises;\n return promises[type] ??= this.appStateManager.getState().then((state) => {\n let recent: string[] | DocId[] = [];\n if(type === 'native') {\n const {recentEmoji} = state;\n recent = Array.isArray(recentEmoji) && recentEmoji.length ? recentEmoji : AppEmojiManager.POPULAR_EMOJI;\n } else {\n const {recentCustomEmoji} = state;\n recent = Array.isArray(recentCustomEmoji) && recentCustomEmoji.length ? recentCustomEmoji : [];\n }\n\n return this.recent[type] = recent as any;\n }) as any;\n }\n\n public pushRecentEmoji(emoji: AppEmoji) {\n const type: EmojiType = emoji.docId ? 'custom' : 'native';\n emoji.emoji = fixEmoji(emoji.emoji);\n // @ts-ignore\n this.getRecentEmojis(type).then((recent) => {\n const i = emoji.docId || emoji.emoji;\n indexOfAndSplice(recent, i);\n recent.unshift(i);\n recent.splice(RECENT_MAX_LENGTH, recent.length - RECENT_MAX_LENGTH);\n\n this.appStateManager.pushToState(type === 'custom' ? 'recentCustomEmoji' : 'recentEmoji', recent);\n this.rootScope.dispatchEvent('emoji_recent', emoji);\n });\n }\n\n public getCustomEmojiDocuments(docIds: DocId[]) {\n if(!docIds.length) return Promise.resolve([] as MyDocument[]);\n return this.apiManager.invokeApi('messages.getCustomEmojiDocuments', {document_id: docIds}).then((documents) => {\n return documents.map((doc) => {\n return this.appDocsManager.saveDoc(doc, {\n type: 'customEmoji',\n docId: doc.id\n });\n });\n });\n }\n\n public getCachedCustomEmojiDocuments(docIds: DocId[]) {\n return docIds.map((docId) => this.appDocsManager.getDoc(docId));\n }\n\n private setDebouncedGetCustomEmojiDocuments() {\n if(this.getCustomEmojiDocumentsPromise || !this.getCustomEmojiDocumentPromises.size) {\n return;\n }\n\n this.getCustomEmojiDocumentsPromise = pause(0).then(() => {\n const allIds = [...this.getCustomEmojiDocumentPromises.keys()];\n const promises: Promise[] = [];\n do {\n const ids = allIds.splice(0, 100);\n const promise = this.getCustomEmojiDocuments(ids).then((docs) => {\n docs.forEach((doc, idx) => {\n const docId = ids[idx];\n const deferred = this.getCustomEmojiDocumentPromises.get(docId);\n this.getCustomEmojiDocumentPromises.delete(docId);\n deferred.resolve(doc);\n });\n });\n\n promises.push(promise);\n } while(allIds.length);\n\n return Promise.all(promises);\n }).finally(() => {\n this.getCustomEmojiDocumentsPromise = undefined;\n this.setDebouncedGetCustomEmojiDocuments();\n });\n }\n\n public getCustomEmojiDocument(id: DocId) {\n let promise = this.getCustomEmojiDocumentPromises.get(id);\n if(promise) {\n return promise;\n }\n\n const doc = this.appDocsManager.getDoc(id);\n if(doc) {\n return doc;\n }\n\n promise = deferredPromise();\n this.getCustomEmojiDocumentPromises.set(id, promise);\n\n this.setDebouncedGetCustomEmojiDocuments();\n\n return promise;\n }\n\n public getCustomEmojis() {\n return this.appStickersManager.getEmojiStickers();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport type GroupCallConnectionInstance from '../calls/groupCallConnectionInstance';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {nextRandomUint} from '../../helpers/random';\nimport {DataJSON, GroupCall, GroupCallParticipant, GroupCallParticipantVideoSourceGroup, InputGroupCall, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update, Updates} from '../../layer';\nimport {logger} from '../logger';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\n\nexport type GroupCallId = GroupCall['id'];\nexport type MyGroupCall = GroupCall | InputGroupCall;\n\nexport type GroupCallConnectionType = 'main' | 'presentation';\n\nexport type JoinGroupCallJsonPayload = {\n fingerprints: {\n fingerprint: string;\n setup: string;\n hash: string;\n }[];\n pwd: string;\n ssrc: number;\n 'ssrc-groups': GroupCallParticipantVideoSourceGroup.groupCallParticipantVideoSourceGroup[];\n ufrag: string;\n};\n\nconst GET_PARTICIPANTS_LIMIT = 100;\n\nexport type GroupCallOutputSource = 'main' | 'presentation' | number;\n\nexport class AppGroupCallsManager extends AppManager {\n private log: ReturnType;\n\n private groupCalls: Map;\n private participants: Map>;\n private nextOffsets: Map;\n\n // private doNotDispatchParticipantUpdate: PeerId;\n\n protected after() {\n this.log = logger('GROUP-CALLS');\n\n this.groupCalls = new Map();\n this.participants = new Map();\n this.nextOffsets = new Map();\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateGroupCall: (update) => {\n this.saveGroupCall(update.call, update.chat_id);\n },\n\n updateGroupCallParticipants: (update) => {\n this.saveGroupCall(update.call);\n\n // this.getGroupCallFull(update.call.id, true); // ! WARNING TEMP\n\n const groupCallId = update.call.id;\n this.saveApiParticipants(groupCallId, update.participants);\n }\n });\n\n this.rootScope.addEventListener('group_call_update', (groupCall) => {\n if(groupCall._ === 'groupCallDiscarded') {\n this.participants.delete(groupCall.id);\n }\n });\n }\n\n public getCachedParticipants(groupCallId: GroupCallId) {\n let participants = this.participants.get(groupCallId);\n if(!participants) {\n this.participants.set(groupCallId, participants = new Map());\n }\n\n return participants;\n }\n\n private prepareToSavingNextOffset(groupCallId: GroupCallId) {\n const nextOffsetsMap = this.nextOffsets;\n\n const setNextOffset = (newNextOffset: string) => {\n if(nextOffsetsMap.get(groupCallId) === nextOffset) {\n nextOffsetsMap.set(groupCallId, newNextOffset);\n }\n };\n\n const nextOffset = nextOffsetsMap.get(groupCallId);\n return {\n nextOffset,\n setNextOffset\n };\n }\n\n public saveApiParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, skipCounterUpdating?: boolean) {\n const participants = this.getCachedParticipants(groupCallId);\n\n const peerId = getPeerId(participant.peer);\n\n const oldParticipant = participants.get(peerId);\n const hasLeft = participant.pFlags.left;\n if(!oldParticipant && hasLeft) {\n return;\n }\n\n // * fix missing flag\n if(!participant.pFlags.muted && !participant.pFlags.can_self_unmute) {\n participant.pFlags.can_self_unmute = true;\n }\n\n if(oldParticipant) {\n safeReplaceObject(oldParticipant, participant);\n participant = oldParticipant;\n } else {\n participants.set(peerId, participant);\n }\n\n // if(!skipCounterUpdating) {\n const groupCall = this.getGroupCall(groupCallId);\n if(groupCall?._ === 'groupCall') {\n let modified = false;\n if(hasLeft) {\n --groupCall.participants_count;\n modified = true;\n } else if(participant.pFlags.just_joined && !oldParticipant && !participant.pFlags.self) {\n ++groupCall.participants_count;\n modified = true;\n }\n\n if(modified) {\n this.rootScope.dispatchEvent('group_call_update', groupCall);\n }\n }\n // }\n\n if(hasLeft) {\n participants.delete(peerId);\n }\n\n if(oldParticipant || true/* && this.doNotDispatchParticipantUpdate !== peerId */) {\n this.rootScope.dispatchEvent('group_call_participant', {\n groupCallId,\n participant\n });\n }\n }\n\n public saveApiParticipants(groupCallId: GroupCallId, apiParticipants: GroupCallParticipant[], skipCounterUpdating?: boolean) {\n if((apiParticipants as any).saved) return;\n (apiParticipants as any).saved = true;\n apiParticipants.forEach((p) => this.saveApiParticipant(groupCallId, p, skipCounterUpdating));\n }\n\n public async editParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n this.saveApiParticipant(groupCallId, participant);\n\n const peerId = participant.pFlags.self ? NULL_PEER_ID : getPeerId(participant.peer);\n const updates = await this.apiManager.invokeApiSingle('phone.editGroupCallParticipant', {\n call: this.getGroupCallInput(groupCallId),\n participant: peerId === NULL_PEER_ID ? this.appPeersManager.getInputPeerSelf() : this.appPeersManager.getInputPeerById(peerId),\n muted: options.muted,\n volume: options.volume,\n raise_hand: options.raiseHand,\n video_paused: options.videoPaused,\n video_stopped: options.videoStopped,\n presentation_paused: options.presentationPaused\n });\n\n // do not replace with peerId because it can be null\n // if(!processUpdate) this.doNotDispatchParticipantUpdate = getPeerId(participant.peer);\n this.apiUpdatesManager.processUpdateMessage(updates);\n // if(!processUpdate) this.doNotDispatchParticipantUpdate = undefined;\n }\n\n public getGroupCall(id: GroupCallId) {\n return this.groupCalls.get(id);\n }\n\n public async getGroupCallFull(id: GroupCallId, override?: boolean): Promise {\n const call = this.getGroupCall(id);\n if(call && call._ !== 'inputGroupCall' && !override) {\n return call;\n }\n\n const limit = this.getCachedParticipants(id).size ? 0 : GET_PARTICIPANTS_LIMIT;\n return this.apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupCall',\n params: {\n call: this.getGroupCallInput(id),\n limit\n },\n processResult: (groupCall) => {\n // ? maybe I should save group call after participants so I can avoid passing the 'skipCounterUpdating' flag ?\n this.appUsersManager.saveApiUsers(groupCall.users);\n this.appChatsManager.saveApiChats(groupCall.chats);\n this.saveApiParticipants(id, groupCall.participants, true);\n const call = this.saveGroupCall(groupCall.call) as GroupCall;\n\n if(limit && this.nextOffsets.get(id) === undefined) {\n this.nextOffsets.set(id, groupCall.participants_next_offset);\n }\n\n return call;\n }\n });\n }\n\n public saveGroupCall(call: MyGroupCall, chatId?: ChatId) {\n const oldCall = this.groupCalls.get(call.id);\n const shouldUpdate = call._ !== 'inputGroupCall' && (!oldCall || oldCall._ !== 'groupCallDiscarded');\n if(oldCall) {\n if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n }\n\n call = oldCall;\n } else {\n this.groupCalls.set(call.id, call);\n }\n\n if(shouldUpdate) {\n this.rootScope.dispatchEvent('group_call_update', call as any);\n }\n\n return call;\n }\n\n public async createGroupCall(chatId: ChatId, scheduleDate?: number, title?: string) {\n const updates = await this.apiManager.invokeApi('phone.createGroupCall', {\n peer: this.appPeersManager.getInputPeerById(chatId.toPeerId(true)),\n random_id: nextRandomUint(32),\n schedule_date: scheduleDate,\n title\n });\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCall') as Update.updateGroupCall;\n return update.call;\n }\n\n public getGroupCallInput(id: GroupCallId): InputGroupCall {\n const groupCall = this.getGroupCall(id);\n return {\n _: 'inputGroupCall',\n id: groupCall.id,\n access_hash: groupCall.access_hash\n };\n }\n\n // public generateSelfParticipant(): GroupCallParticipant {\n // const mainSources = this.currentGroupCall.connections.main.sources;\n // const presentationSources = this.currentGroupCall.connections.presentation?.sources;\n // return {\n // _: 'groupCallParticipant',\n // pFlags: {\n // can_self_unmute: true,\n // self: true\n // },\n // source: mainSources.audio.source,\n // video: this.generateSelfVideo(mainSources.video),\n // presentation: presentationSources && this.generateSelfVideo(presentationSources.video, presentationSources.audio?.source),\n // date: tsNow(true),\n // peer: this.appPeersManager.getOutputPeer(rootScope.myId)\n // };\n // }\n\n public async getGroupCallParticipants(id: GroupCallId) {\n const {nextOffset, setNextOffset} = this.prepareToSavingNextOffset(id);\n\n if(nextOffset !== '') {\n await this.apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupParticipants',\n params: {\n call: this.getGroupCallInput(id),\n ids: [],\n sources: [],\n offset: nextOffset || '',\n limit: GET_PARTICIPANTS_LIMIT\n },\n processResult: (groupCallParticipants) => {\n const newNextOffset = groupCallParticipants.count === groupCallParticipants.participants.length ? '' : groupCallParticipants.next_offset;\n\n this.appChatsManager.saveApiChats(groupCallParticipants.chats);\n this.appUsersManager.saveApiUsers(groupCallParticipants.users);\n this.saveApiParticipants(id, groupCallParticipants.participants);\n\n setNextOffset(newNextOffset);\n }\n });\n }\n\n return {\n participants: this.getCachedParticipants(id),\n isEnd: this.nextOffsets.get(id) === ''\n };\n }\n\n public hangUp(id: GroupCallId, discard?: boolean | number) {\n const groupCallInput = this.getGroupCallInput(id);\n let promise: Promise;\n if(typeof(discard) === 'boolean' && discard) {\n promise = this.apiManager.invokeApi('phone.discardGroupCall', {\n call: groupCallInput\n });\n } else if(typeof(discard) === 'number') {\n promise = this.apiManager.invokeApi('phone.leaveGroupCall', {\n call: groupCallInput,\n source: discard\n });\n } else {\n promise = this.apiManager.invokeApi('phone.joinGroupCall', {\n call: groupCallInput,\n join_as: this.appPeersManager.getInputPeerSelf(),\n muted: true,\n video_stopped: true,\n params: {\n _: 'dataJSON',\n data: ''\n }\n });\n }\n\n return promise.then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public async joinGroupCall(groupCallId: GroupCallId, params: DataJSON, options: GroupCallConnectionInstance['options']) {\n const groupCallInput = this.getGroupCallInput(groupCallId);\n let promise: Promise;\n if(options.type === 'main') {\n const request: PhoneJoinGroupCall = {\n call: groupCallInput,\n join_as: this.appPeersManager.getInputPeerSelf(),\n params,\n muted: options.isMuted,\n video_stopped: !options.joinVideo\n };\n\n promise = this.apiManager.invokeApi('phone.joinGroupCall', request);\n this.log(`[api] joinGroupCall id=${groupCallId}`, request);\n } else {\n const request: PhoneJoinGroupCallPresentation = {\n call: groupCallInput,\n params\n };\n\n promise = this.apiManager.invokeApi('phone.joinGroupCallPresentation', request);\n this.log(`[api] joinGroupCallPresentation id=${groupCallId}`, request);\n }\n\n const updates = await promise;\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCallConnection') as Update.updateGroupCallConnection;\n return update;\n }\n\n public leaveGroupCallPresentation(groupCallId: GroupCallId) {\n return this.apiManager.invokeApi('phone.leaveGroupCallPresentation', {\n call: this.getGroupCallInput(groupCallId)\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputPhoto} from '../../../../layer';\nimport {MyPhoto} from '../../appPhotosManager';\n\nexport default function getPhotoInput(photo: MyPhoto): InputPhoto.inputPhoto {\n return {\n _: 'inputPhoto',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputMedia} from '../../../../layer';\nimport {MyPhoto} from '../../appPhotosManager';\nimport getPhotoInput from './getPhotoInput';\n\nexport default function getPhotoMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\n return {\n _: 'inputMediaPhoto',\n id: getPhotoInput(photo),\n ttl_seconds: 0\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Document, InputMedia} from '../../../../layer';\n\nexport default function getMediaInput(doc: Document.document): InputMedia.inputMediaDocument {\n return {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n },\n ttl_seconds: 0\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {MyDocument} from './appDocsManager';\nimport type {MyPhoto} from './appPhotosManager';\nimport type {MyTopPeer} from './appUsersManager';\nimport type {AppMessagesManager, MessageSendingParams} from './appMessagesManager';\nimport {BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessageMedia, MessagesBotResults, ReplyMarkup} from '../../layer';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport {AppManager} from './manager';\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport generateQId from './utils/inlineBots/generateQId';\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\n\nexport class AppInlineBotsManager extends AppManager {\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\n private setHash: {\n [botId: UserId]: {\n peerId: PeerId,\n time: number\n }\n } = {};\n\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\n return geo._ === 'geoPoint' ? {\n _: 'inputGeoPoint',\n lat: geo.lat,\n long: geo.long,\n accuracy_radius: geo.accuracy_radius\n } : {\n _: 'inputGeoPointEmpty'\n };\n }\n\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\n return this.apiManager.invokeApi('messages.getInlineBotResults', {\n bot: this.appUsersManager.getUserInput(botId),\n peer: this.appPeersManager.getInputPeerById(peerId),\n query,\n geo_point: geo ? this.getGeoInput(geo) : undefined,\n offset\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((botResults) => {\n const queryId = botResults.query_id;\n\n /* if(botResults.switch_pm) {\n botResults.switch_pm.rText = wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\n } */\n\n botResults.results.forEach((result) => {\n if(result._ === 'botInlineMediaResult') {\n if(result.document) {\n result.document = this.appDocsManager.saveDoc(result.document);\n }\n\n if(result.photo) {\n result.photo = this.appPhotosManager.savePhoto(result.photo);\n }\n }\n\n this.inlineResults[generateQId(queryId, result.id)] = result;\n });\n\n return botResults;\n });\n }\n\n private pushPopularBot(botId: BotId) {\n this.appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\n const botPeerId = botId.toPeerId();\n const index = topPeers.findIndex((topPeer) => topPeer.id === botPeerId);\n let topPeer: MyTopPeer;\n if(index !== -1) {\n topPeer = topPeers[index];\n } else {\n topPeer = {\n id: botPeerId,\n rating: 0\n };\n }\n\n ++topPeer.rating;\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\n\n this.appStateManager.setKeyValueToStorage('topPeersCache');\n\n // rootScope.$broadcast('inline_bots_popular')\n });\n }\n\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\n return this.appMessagesManager.startBot(botId, undefined, startParam);\n }\n\n /*\n function resolveInlineMention (username) {\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\n if (peerId.isUser()) {\n var bot = AppUsersManager.getUser(peerId)\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\n var resolvedBot = {\n username: username,\n id: peerId,\n placeholder: bot.bot_inline_placeholder\n }\n if (bot.pFlags.bot_inline_geo &&\n GeoLocationManager.isAvailable()) {\n return checkGeoLocationAccess(peerId).then(function () {\n return GeoLocationManager.getPosition().then(function (coords) {\n resolvedBot.geo = coords\n return qSync.when(resolvedBot)\n })\n })['catch'](function () {\n return qSync.when(resolvedBot)\n })\n }\n return qSync.when(resolvedBot)\n }\n }\n return $q.reject()\n }, function (error) {\n error.handled = true\n return $q.reject(error)\n })\n }\n\n function regroupWrappedResults (results, rowW, rowH) {\n if (!results ||\n !results[0] ||\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\n return\n }\n var ratios = []\n angular.forEach(results, function (result) {\n var w\n var h, doc\n var photo\n if (result._ === 'botInlineMediaResult') {\n if (doc = result.document) {\n w = result.document.w\n h = result.document.h\n }\n else if (photo = result.photo) {\n var photoSize = (photo.sizes || [])[0]\n w = photoSize && photoSize.w\n h = photoSize && photoSize.h\n }\n }else {\n w = result.w\n h = result.h\n }\n if (!w || !h) {\n w = h = 1\n }\n ratios.push(w / h)\n })\n\n var rows = []\n var curCnt = 0\n var curW = 0\n angular.forEach(ratios, function (ratio) {\n var w = ratio * rowH\n curW += w\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\n curCnt++\n } else {\n rows.push(curCnt)\n curCnt = 1\n curW = w\n }\n })\n if (curCnt) {\n rows.push(curCnt)\n }\n\n var i = 0\n var thumbs = []\n var lastRowI = rows.length - 1\n angular.forEach(rows, function (rowCnt, rowI) {\n var lastRow = rowI === lastRowI\n var curRatios = ratios.slice(i, i + rowCnt)\n var sumRatios = 0\n angular.forEach(curRatios, function (ratio) {\n sumRatios += ratio\n })\n angular.forEach(curRatios, function (ratio, j) {\n var thumbH = rowH\n var thumbW = rowW * ratio / sumRatios\n var realW = thumbH * ratio\n if (lastRow && thumbW > realW) {\n thumbW = realW\n }\n var result = results[i + j]\n result.thumbW = Math.floor(thumbW) - 2\n result.thumbH = Math.floor(thumbH) - 2\n })\n\n i += rowCnt\n })\n } */\n\n public async checkSwitchReturn(botId: BotId) {\n const bot = this.appUsersManager.getUser(botId);\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\n return;\n }\n\n const peerData = this.setHash[botId];\n if(peerData) {\n delete this.setHash[botId];\n if((Date.now() - peerData.time) < 3600e3) {\n return peerData.peerId;\n }\n }\n }\n\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\n this.appDraftsManager.setDraft(peerId, threadId, '@' + this.appPeersManager.getPeerUsername(botId.toPeerId()) + ' ' + query);\n }\n\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\n return this.apiManager.invokeApi('messages.getBotCallbackAnswer', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid),\n data: button.data\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true});\n }\n\n /* function gameButtonClick (id) {\n var message = AppMessagesManager.getMessage(id)\n var peerId = AppMessagesManager.getMessagePeer(message)\n\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\n peer: AppPeersManager.getInputPeerByID(peerId),\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\n if (typeof callbackAnswer.message === 'string' &&\n callbackAnswer.message.length) {\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\n }\n else if (typeof callbackAnswer.url === 'string') {\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\n }\n })\n } */\n\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n replyMarkup: ReplyMarkup,\n entities: MessageEntity[],\n clearDraft: true,\n geoPoint: GeoPoint\n }> = {}) {\n const inlineResult = this.inlineResults[queryAndResultIds];\n if(!inlineResult) {\n return;\n }\n\n this.pushPopularBot(botId);\n const splitted = queryAndResultIds.split('_');\n const queryID = splitted.shift();\n const resultID = splitted.join('_');\n options.viaBotId = botId;\n options.queryId = queryID;\n options.resultId = resultID;\n if(inlineResult.send_message.reply_markup) {\n options.replyMarkup = inlineResult.send_message.reply_markup;\n }\n\n if(inlineResult.send_message._ === 'botInlineMessageText') {\n options.entities = inlineResult.send_message.entities;\n this.appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\n } else {\n let caption = '';\n let inputMedia: Parameters[1], messageMedia: MessageMedia;\n const sendMessage = inlineResult.send_message;\n switch(sendMessage._) {\n case 'botInlineMessageMediaAuto': {\n caption = sendMessage.message;\n\n if(inlineResult._ === 'botInlineMediaResult') {\n const {document, photo} = inlineResult;\n if(document) {\n inputMedia = getDocumentMediaInput(document as MyDocument);\n } else {\n inputMedia = getPhotoMediaInput(photo as MyPhoto);\n }\n }\n\n break;\n }\n\n case 'botInlineMessageMediaGeo': {\n inputMedia = {\n _: 'inputMediaGeoPoint',\n geo_point: this.getGeoInput(sendMessage.geo)\n };\n\n options.geoPoint = sendMessage.geo;\n\n break;\n }\n\n case 'botInlineMessageMediaVenue': {\n inputMedia = {\n _: 'inputMediaVenue',\n geo_point: this.getGeoInput(sendMessage.geo),\n title: sendMessage.title,\n address: sendMessage.address,\n provider: sendMessage.provider,\n venue_id: sendMessage.venue_id,\n venue_type: sendMessage.venue_type\n };\n\n options.geoPoint = sendMessage.geo;\n\n break;\n }\n\n case 'botInlineMessageMediaContact': {\n inputMedia = {\n _: 'inputMediaContact',\n phone_number: sendMessage.phone_number,\n first_name: sendMessage.first_name,\n last_name: sendMessage.last_name,\n vcard: sendMessage.vcard\n };\n\n break;\n }\n\n case 'botInlineMessageMediaInvoice': {\n // const photo = sendMessage.photo;\n // inputMedia = {\n // _: 'inputMediaInvoice',\n // description: sendMessage.description,\n // title: sendMessage.title,\n // photo: photo && {\n // _: 'inputWebDocument',\n // attributes: photo.attributes,\n // mime_type: photo.mime_type,\n // size: photo.size,\n // url: photo.url\n // },\n // invoice: undefined,\n // payload: undefined,\n // provider: undefined,\n // provider_data: undefined,\n // start_param: undefined\n // };\n\n messageMedia = {\n _: 'messageMediaInvoice',\n title: sendMessage.title,\n description: sendMessage.description,\n photo: sendMessage.photo,\n currency: sendMessage.currency,\n total_amount: sendMessage.total_amount,\n pFlags: {\n shipping_address_requested: sendMessage.pFlags.shipping_address_requested,\n test: sendMessage.pFlags.test\n },\n start_param: undefined\n };\n\n break;\n }\n }\n\n if(!inputMedia && messageMedia) {\n inputMedia = {\n _: 'messageMediaPending',\n messageMedia\n };\n }\n\n this.appMessagesManager.sendOther(peerId, inputMedia, options);\n }\n }\n\n /* function checkGeoLocationAccess (botID) {\n var key = 'bot_access_geo' + botID\n return Storage.get(key).then(function (geoAccess) {\n if (geoAccess && geoAccess.granted) {\n return true\n }\n return ErrorService.confirm({\n type: 'BOT_ACCESS_GEO_INLINE'\n }).then(function () {\n var setHash = {}\n setHash[key] = {granted: true, time: tsNow()}\n Storage.set(setHash)\n return true\n }, function () {\n var setHash = {}\n setHash[key] = {denied: true, time: tsNow()}\n Storage.set(setHash)\n return $q.reject()\n })\n })\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MESSAGE_ID_INCREMENT} from './utils/messageId';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport class AppMessagesIdsManager {\n private tempNum = 0;\n\n public generateTempMessageId(messageId: number) {\n const num = ++this.tempNum;\n return generateMessageId(messageId) + (num & (MESSAGE_ID_INCREMENT - 1));\n }\n}\n","export default function splitStringByLength(str: string, maxLength: number) {\n if(str.length < maxLength) return [str];\n let length = 0, lastSliceStartIndex = 0, arrayIndex = 0;\n const delimiter = ' ';// '\\n';\n const out: string[] = [];\n\n const cut = (end?: number) => {\n let part = str.slice(lastSliceStartIndex, end);\n const _arrayIndex = arrayIndex++;\n if(part.length > maxLength) {\n const overflowPart = part.slice(maxLength);\n const splitted = splitStringByLength(overflowPart, maxLength);\n splitted.forEach((part) => {\n out[arrayIndex++] = part;\n });\n\n part = part.slice(0, maxLength);\n }\n\n lastSliceStartIndex = end;\n length = 0;\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\n };\n\n let lastIndex = 0;\n do {\n let index = str.indexOf(delimiter, lastIndex);\n if(index === -1) {\n if(lastIndex !== (str.length - 1)) {\n cut();\n }\n\n break;\n }\n\n index += delimiter.length;\n\n const partLength = index - lastIndex;\n if((length + partLength) > maxLength) {\n cut(length);\n }\n\n lastIndex = index;\n length += partLength;\n } while(true);\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {TabState} from '../mtproto/mtprotoworker';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\n\ntype Tab = {\n source: MessageEventSource,\n state: TabState\n};\n\nexport class AppTabsManager {\n private tabs: Map;\n\n constructor() {\n this.tabs = new Map();\n }\n\n public start() {\n const port = MTProtoMessagePort.getInstance();\n\n port.addEventListener('tabState', (state, source) => {\n const tab = this.tabs.get(source);\n tab.state = state;\n });\n }\n\n public getTabs() {\n return [...this.tabs.values()].filter((tab) => !!tab.state);\n }\n\n public addTab(source: MessageEventSource) {\n const tab: Tab = {\n source,\n state: undefined\n };\n\n this.tabs.set(source, tab);\n }\n\n public deleteTab(source: MessageEventSource) {\n this.tabs.delete(source);\n }\n}\n\nconst appTabsManager = new AppTabsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appTabsManager = appTabsManager);\nexport default appTabsManager;\n","import {InputDocument} from '../../../../layer';\nimport type {MyDocument} from '../../appDocsManager';\n\nexport default function getDocumentInput(doc: MyDocument): InputDocument {\n return {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n };\n}\n","export default function setBooleanFlag(obj: T, key: keyof T, value: boolean) {\n // @ts-ignore\n if(value) obj[key] = true;\n else delete obj[key];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {ApiFileManager} from '../mtproto/apiFileManager';\nimport type {MediaSize} from '../../helpers/mediaSize';\nimport type {Progress} from './appDownloadManager';\nimport type {VIDEO_MIME_TYPE} from '../../environment/videoMimeTypesSupport';\nimport LazyLoadQueueBase from '../../components/lazyLoadQueueBase';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport tsNow from '../../helpers/tsNow';\nimport {randomLong} from '../../helpers/random';\nimport {Chat, ChatFull, Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageFwdHeader, MessageMedia, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MethodDeclMap, NotifyPeer, PeerNotifySettings, PhotoSize, SendMessageAction, Update, Photo, Updates, ReplyMarkup, InputPeer, InputPhoto, InputDocument, InputGeoPoint, WebPage, GeoPoint, ReportReason, MessagesGetDialogs, InputChannel, InputDialogPeer, ReactionCount, MessagePeerReaction, MessagesSearchCounter, Peer, MessageReactions, Document, InputFile, Reaction, ForumTopic as MTForumTopic, MessagesForumTopics, MessagesGetReplies, MessagesGetHistory, MessagesAffectedHistory, UrlAuthResult} from '../../layer';\nimport {ArgumentTypes, InvokeApiOptions} from '../../types';\nimport {logger, LogTypes} from '../logger';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport DialogsStorage, {GLOBAL_FOLDER_ID} from '../storages/dialogs';\nimport {ChatRights} from './appChatsManager';\nimport {MyDocument} from './appDocsManager';\nimport {MyPhoto} from './appPhotosManager';\nimport {getFileNameByLocation} from '../../helpers/fileName';\nimport DEBUG from '../../config/debug';\nimport SlicedArray, {Slice, SliceEnd} from '../../helpers/slicedArray';\nimport {FOLDER_ID_ALL, GENERAL_TOPIC_ID, MUTE_UNTIL, NULL_PEER_ID, REAL_FOLDER_ID, REPLIES_HIDDEN_CHANNEL_ID, REPLIES_PEER_ID, SERVICE_PEER_ID, THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n// import telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport {getMiddleware} from '../../helpers/middleware';\nimport assumeType from '../../helpers/assumeType';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport splitStringByLength from '../../helpers/string/splitStringByLength';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {AppManager} from './manager';\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport mergeEntities from '../richTextProcessor/mergeEntities';\nimport parseEntities from '../richTextProcessor/parseEntities';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport filterMessagesByInputFilter from './utils/messages/filterMessagesByInputFilter';\nimport ctx from '../../environment/ctx';\nimport {getEnvironment} from '../../environment/utils';\nimport getDialogIndex from './utils/dialogs/getDialogIndex';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\nimport getDocumentInputFileName from './utils/docs/getDocumentInputFileName';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport noop from '../../helpers/noop';\nimport appTabsManager from './appTabsManager';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport getAlbumText from './utils/messages/getAlbumText';\nimport pause from '../../helpers/schedulers/pause';\nimport makeError from '../../helpers/makeError';\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\nimport getDocumentInput from './utils/docs/getDocumentInput';\nimport reactionsEqual from './utils/reactions/reactionsEqual';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\nimport {BroadcastEvents} from '../rootScope';\nimport setBooleanFlag from '../../helpers/object/setBooleanFlag';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\n\n// console.trace('include');\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\n\nexport type SendFileDetails = {\n file: File | Blob | MyDocument,\n} & Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n strippedBytes: PhotoSize.photoStrippedSize['bytes'],\n spoiler: boolean\n}>;\n\nexport type HistoryStorage = {\n count: number | null,\n history: SlicedArray,\n\n maxId?: number,\n readPromise?: Promise,\n readMaxId?: number,\n readOutboxMaxId?: number,\n triedToReadMaxId?: number,\n\n maxOutId?: number,\n replyMarkup?: Exclude\n};\n\nexport type HistoryResult = {\n count: number,\n history: number[],\n isEnd: ReturnType['getEnds']>,\n offsetIdOffset?: number,\n};\n\nexport type Dialog = MTDialog.dialog;\nexport type ForumTopic = MTForumTopic.forumTopic;\n\nexport type MyMessage = Message.message | Message.messageService;\nexport type MyInputMessagesFilter = 'inputMessagesFilterEmpty'\n | 'inputMessagesFilterPhotos'\n | 'inputMessagesFilterPhotoVideo'\n | 'inputMessagesFilterVideo'\n | 'inputMessagesFilterDocument'\n | 'inputMessagesFilterVoice'\n | 'inputMessagesFilterRoundVoice'\n | 'inputMessagesFilterRoundVideo'\n | 'inputMessagesFilterMusic'\n | 'inputMessagesFilterUrl'\n | 'inputMessagesFilterMyMentions'\n | 'inputMessagesFilterChatPhotos'\n | 'inputMessagesFilterPinned';\n\nexport type PinnedStorage = Partial<{\n promise: Promise,\n count: number,\n maxId: number\n}>;\nexport type MessagesStorage = Map & {peerId: PeerId, type: MessagesStorageType, key: MessagesStorageKey};\nexport type MessagesStorageType = 'scheduled' | 'history' | 'grouped';\nexport type MessagesStorageKey = `${PeerId}_${MessagesStorageType}`;\n\nexport type MyMessageActionType = Message.messageService['action']['_'];\n\ntype PendingAfterMsg = Partial;\n\ntype MapValueType = A extends Map ? V : never;\n\nexport type BatchUpdates = {\n 'messages_reactions': AppMessagesManager['batchUpdateReactions'],\n 'messages_views': AppMessagesManager['batchUpdateViews']\n};\n\ntype PendingMessageDetails = {\n peerId: PeerId,\n tempId: number,\n threadId: number,\n storage: MessagesStorage,\n sequential?: boolean\n};\n\nconst processAfter = (cb: () => void) => {\n // setTimeout(cb, 0);\n cb();\n};\n\nconst UPDATE_STICKERSET_ORDER = true;\n\nexport type MessageSendingParams = Partial<{\n threadId: number,\n replyToMsgId: number,\n scheduleDate: number,\n silent: boolean,\n sendAsPeerId: number,\n}>;\n\nexport class AppMessagesManager extends AppManager {\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\n private groupedMessagesStorage: {[groupId: string]: MessagesStorage}; // will be used for albums\n private scheduledMessagesStorage: {[peerId: PeerId]: MessagesStorage};\n private historiesStorage: {\n [peerId: PeerId]: HistoryStorage\n };\n private threadsStorage: {\n [peerId: PeerId]: {\n [threadId: string]: HistoryStorage\n }\n };\n private searchesStorage: {\n [peerId: PeerId]: Partial<{\n [inputFilter in MyInputMessagesFilter]: {\n count?: number,\n history: number[]\n }\n }>\n };\n private pinnedMessages: {[key: string]: PinnedStorage};\n\n private threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\n private threadsToReplies: {\n [peerId_threadId: string]: string;\n };\n\n private pendingByRandomId: {\n [randomId: string]: PendingMessageDetails\n } = {};\n private pendingByMessageId: {[mid: string]: Long} = {};\n private pendingAfterMsgs: {[peerId: PeerId]: PendingAfterMsg} = {};\n public pendingTopMsgs: {[peerId: PeerId]: number} = {};\n private tempFinalizeCallbacks: {\n [tempId: string]: {\n [callbackName: string]: Partial<{\n deferred: CancellablePromise,\n callback: (message: MyMessage) => Promise\n }>\n }\n } = {};\n\n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\n\n private needSingleMessages: Map>> = new Map();\n private fetchSingleMessagesPromise: Promise;\n private extendedMedia: Map>> = new Map();\n\n private maxSeenId = 0;\n\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\n\n private newDialogsHandlePromise: Promise;\n private newDialogsToHandle: Map}> = new Map();\n public newUpdatesAfterReloadToHandle: {[key: string]: Set} = {};\n\n private notificationsHandlePromise: number;\n private notificationsToHandle: {[key: string]: {\n fwdCount: number,\n fromId: PeerId,\n topMessage?: MyMessage\n }} = {};\n\n private reloadConversationsPromise: Promise;\n private reloadConversationsPeers: Map}> = new Map();\n\n public log = logger('MESSAGES', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\n\n private groupedTempId = 0;\n\n private typings: {[key: string]: {action: SendMessageAction, timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[key: string]: SlicedArray} = {};\n private goToNextMentionPromises: {[key: string]: Promise} = {};\n\n private batchUpdates: {\n [k in keyof BatchUpdates]?: {\n callback: BatchUpdates[k],\n batch: ArgumentTypes[0]\n }\n } = {};\n private batchUpdatesDebounced: () => Promise;\n\n private uploadFilePromises: {[fileName: string]: CancellablePromise};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateMessageID: this.onUpdateMessageId,\n\n updateNewDiscussionMessage: this.onUpdateNewMessage,\n updateNewMessage: this.onUpdateNewMessage,\n updateNewChannelMessage: this.onUpdateNewMessage,\n\n updateDialogUnreadMark: this.onUpdateDialogUnreadMark,\n\n updateEditMessage: this.onUpdateEditMessage,\n updateEditChannelMessage: this.onUpdateEditMessage,\n\n updateMessageReactions: this.onUpdateMessageReactions,\n\n updateReadChannelDiscussionInbox: this.onUpdateReadHistory,\n updateReadChannelDiscussionOutbox: this.onUpdateReadHistory,\n updateReadHistoryInbox: this.onUpdateReadHistory,\n updateReadHistoryOutbox: this.onUpdateReadHistory,\n updateReadChannelInbox: this.onUpdateReadHistory,\n updateReadChannelOutbox: this.onUpdateReadHistory,\n\n updateChannelReadMessagesContents: this.onUpdateReadMessagesContents,\n updateReadMessagesContents: this.onUpdateReadMessagesContents,\n\n updateChannelAvailableMessages: this.onUpdateChannelAvailableMessages,\n\n updateDeleteMessages: this.onUpdateDeleteMessages,\n updateDeleteChannelMessages: this.onUpdateDeleteMessages,\n\n updateChannel: this.onUpdateChannel,\n\n updateChannelReload: this.onUpdateChannelReload,\n\n updateChannelMessageViews: this.onUpdateChannelMessageViews,\n\n updateServiceNotification: this.onUpdateServiceNotification,\n\n updatePinnedMessages: this.onUpdatePinnedMessages,\n updatePinnedChannelMessages: this.onUpdatePinnedMessages,\n\n updateNotifySettings: this.onUpdateNotifySettings,\n\n updateNewScheduledMessage: this.onUpdateNewScheduledMessage,\n\n updateDeleteScheduledMessages: this.onUpdateDeleteScheduledMessages,\n\n updateMessageExtendedMedia: this.onUpdateMessageExtendedMedia\n });\n\n // ! Invalidate notify settings, can optimize though\n this.rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\n let filterFunc: (dialog: typeof dialogs[0]) => boolean;\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => this.appPeersManager.isBroadcast(dialog.peerId);\n else filterFunc = (dialog) => this.appPeersManager.isAnyGroup(dialog.peerId);\n\n dialogs\n .filter(filterFunc)\n .forEach((dialog) => {\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n });\n });\n\n this.rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\n msgs.forEach(({peerId, mid, isScheduled}) => {\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n if(!message) return;\n message.media = {\n _: 'messageMediaWebPage',\n webpage: this.appWebPagesManager.getCachedWebPage(id)\n };\n\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n });\n });\n\n this.rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(dialog) {\n dialog.draft = draft;\n\n let drop = false;\n if(!draft && !getServerMessageId(dialog.top_message)) {\n this.dialogsStorage.dropDialog(peerId);\n drop = true;\n } else {\n this.dialogsStorage.generateIndexForDialog(dialog);\n this.dialogsStorage.pushDialog({dialog});\n }\n\n this.rootScope.dispatchEvent('dialog_draft', {\n peerId,\n dialog,\n drop,\n draft\n });\n } else if(threadId) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(!chat) {\n this.reloadConversation(peerId);\n } else if((chat as Chat.channel).pFlags.forum) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n }\n } else {\n this.reloadConversation(peerId);\n }\n });\n\n this.rootScope.addEventListener('poll_update', ({poll}) => {\n const set = this.appPollsManager.pollToMessages[poll.id];\n if(set) {\n for(const key of set) {\n const [peerId, mid] = key.split('_');\n\n const message = this.getMessageByPeer(peerId.toPeerId(), +mid);\n if(message) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n }\n }\n });\n\n // * clear forum cache\n this.rootScope.addEventListener('chat_toggle_forum', ({chatId, enabled}) => {\n const peerId = chatId.toPeerId(true);\n if(!enabled) {\n delete this.threadsStorage[peerId];\n\n for(const key in this.pinnedMessages) {\n if(+key === peerId && key.startsWith(peerId + '_')) {\n delete this.pinnedMessages[key];\n }\n }\n }\n });\n\n this.batchUpdatesDebounced = debounce(() => {\n for(const event in this.batchUpdates) {\n const details = this.batchUpdates[event as keyof BatchUpdates];\n delete this.batchUpdates[event as keyof BatchUpdates];\n\n // @ts-ignore\n const result = details.callback(details.batch);\n if(result && (!(result instanceof Array) || result.length)) {\n // @ts-ignore\n rootScope.dispatchEvent(event as keyof BatchUpdates, result);\n }\n }\n }, 33, false, true);\n\n return this.appStateManager.getState().then((state) => {\n if(state.maxSeenMsgId) {\n this.maxSeenId = state.maxSeenMsgId;\n }\n });\n }\n\n public clear = (init?: boolean) => {\n if(this.middleware) {\n this.middleware.clean();\n } else {\n this.middleware = getMiddleware();\n this.uploadFilePromises = {};\n }\n\n this.messagesStorageByPeerId = {};\n this.groupedMessagesStorage = {};\n this.scheduledMessagesStorage = {};\n this.historiesStorage = {};\n this.threadsStorage = {};\n this.searchesStorage = {};\n this.pinnedMessages = {};\n this.threadsServiceMessagesIdsStorage = {};\n this.threadsToReplies = {};\n\n this.dialogsStorage && this.dialogsStorage.clear(init);\n this.filtersStorage && this.filtersStorage.clear(init);\n };\n\n public getInputEntities(entities: MessageEntity[]) {\n const sendEntites = copy(entities);\n sendEntites.forEach((entity) => {\n if(entity._ === 'messageEntityMentionName') {\n (entity as any as MessageEntity.inputMessageEntityMentionName)._ = 'inputMessageEntityMentionName';\n (entity as any as MessageEntity.inputMessageEntityMentionName).user_id = this.appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n }\n\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: MyMessage) => Promise) {\n const finalize = this.tempFinalizeCallbacks[tempId] ??= {};\n const obj = finalize[callbackName] ??= {deferred: deferredPromise()};\n\n obj.callback = callback;\n\n return obj.deferred;\n }\n\n public editMessage(message: any, text: string, options: Partial<{\n noWebPage: true,\n newMedia: any,\n scheduleDate: number,\n entities: MessageEntity[]\n }> = {}): Promise {\n /* if(!this.canEditMessage(messageId)) {\n return Promise.reject({type: 'MESSAGE_EDIT_FORBIDDEN'});\n } */\n\n const {mid, peerId} = message;\n\n if(message.pFlags.is_outgoing) {\n return this.invokeAfterMessageIsSent(mid, 'edit', (message) => {\n // this.log('invoke editMessage callback', message);\n return this.editMessage(message, text, options);\n });\n }\n\n const entities = options.entities || [];\n if(text) {\n text = parseMarkdown(text, entities);\n }\n\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\n return this.apiManager.invokeApi('messages.editMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: message.id,\n message: text,\n media: options.newMedia,\n entities: entities.length ? this.getInputEntities(entities) : undefined,\n no_webpage: options.noWebPage,\n schedule_date\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n this.log.error('editMessage error:', error);\n\n if(error && error.type === 'MESSAGE_NOT_MODIFIED') {\n error.handled = true;\n return;\n }\n if(error && error.type === 'MESSAGE_EMPTY') {\n error.handled = true;\n }\n return Promise.reject(error);\n });\n }\n\n public async sendText(peerId: PeerId, text: string, options: MessageSendingParams & Partial<{\n entities: MessageEntity[],\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n }> = {}): Promise {\n if(!text.trim()) {\n return;\n }\n\n options.entities ??= [];\n\n // this.checkSendOptions(options);\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n const config = await this.apiManager.getConfig();\n const MAX_LENGTH = config.message_length_max;\n const splitted = splitStringByLength(text, MAX_LENGTH);\n text = splitted[0];\n if(splitted.length > 1) {\n if(options.webPage?._ === 'webPage' && !text.includes(options.webPage.url)) {\n delete options.webPage;\n }\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n const entities = options.entities;\n if(!options.viaBotId) {\n text = parseMarkdown(text, entities);\n // entities = mergeEntities(entities, parseEntities(text));\n }\n\n let sendEntites = this.getInputEntities(entities);\n if(!sendEntites.length) {\n sendEntites = undefined;\n }\n\n const message = this.generateOutgoingMessage(peerId, options);\n message.entities = entities;\n message.message = text;\n\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n const isChannel = this.appPeersManager.isChannel(peerId);\n\n if(options.webPage) {\n message.media = {\n _: 'messageMediaWebPage',\n webpage: options.webPage\n };\n }\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError();\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n let apiPromise: any;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMessage', {\n no_webpage: options.noWebPage,\n peer: this.appPeersManager.getInputPeerById(peerId),\n message: text,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n entities: sendEntites,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate || undefined,\n silent: options.silent,\n send_as: sendAs,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }, sentRequestOptions);\n }\n\n /* function is(value: any, condition: boolean): value is T {\n return condition;\n } */\n\n // this.log('sendText', message.mid);\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates: Updates) => {\n // this.log('sendText sent', message.mid);\n // if(is(updates, updates._ === 'updateShortSentMessage')) {\n if(updates._ === 'updateShortSentMessage') {\n // assumeType(updates);\n\n // * fix copying object with promise\n const promise = message.promise;\n delete message.promise;\n const newMessage = copy(message);\n defineNotNumerableProperties(message, ['promise']);\n message.promise = promise;\n\n newMessage.date = updates.date;\n newMessage.id = updates.id;\n newMessage.media = updates.media;\n newMessage.entities = updates.entities;\n this.wrapMessageEntities(newMessage);\n if(updates.pFlags.out) {\n newMessage.pFlags.out = true;\n }\n\n // * override with new updates\n updates = {\n _: 'updates',\n users: [],\n chats: [],\n seq: 0,\n date: undefined,\n updates: [{\n _: 'updateMessageID',\n random_id: message.random_id,\n id: newMessage.id\n }, {\n _: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),\n message: newMessage,\n pts: updates.pts,\n pts_count: updates.pts_count\n }]\n };\n } else if((updates as Updates.updates).updates) {\n (updates as Updates.updates).updates.forEach((update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n // this.reloadConversation(peerId);\n\n // setTimeout(() => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n // }, 5000);\n message.promise.resolve();\n }, (error: ApiError) => {\n toggleError(error);\n message.promise.reject(error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n threadId: options.threadId,\n clearDraft: options.clearDraft,\n sequential: true\n });\n\n const promises: ReturnType[] = [message.promise];\n for(let i = 1; i < splitted.length; ++i) {\n promises.push(this.sendText(peerId, splitted[i], options));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public sendFile(peerId: PeerId, options: MessageSendingParams & SendFileDetails & Partial<{\n isRoundMessage: boolean,\n isVoiceMessage: boolean,\n isGroupedItem: boolean,\n isMedia: boolean,\n\n groupId: string,\n caption: string,\n entities: MessageEntity[],\n background: boolean,\n clearDraft: boolean,\n noSound: boolean,\n\n waveform: Uint8Array,\n\n // ! only for internal use\n processAfter?: typeof processAfter\n }>) {\n const file = options.file;\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n // this.checkSendOptions(options);\n\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let attachType: 'document' | 'audio' | 'video' | 'voice' | 'photo', apiFileName: string;\n\n const fileType = 'mime_type' in file ? file.mime_type : file.type;\n const fileName = file instanceof File ? file.name : '';\n const isDocument = !(file instanceof File) && !(file instanceof Blob);\n let caption = options.caption || '';\n\n this.log('sendFile', file, fileType);\n\n const entities = options.entities || [];\n if(caption) {\n caption = parseMarkdown(caption, entities);\n }\n\n const attributes: DocumentAttribute[] = [];\n\n const isPhoto = getEnvironment().IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\n\n const strippedPhotoSize: PhotoSize.photoStrippedSize = options.strippedBytes && {\n _: 'photoStrippedSize',\n bytes: options.strippedBytes,\n type: 'i'\n };\n\n let photo: MyPhoto, document: MyDocument;\n\n let actionName: Extract;\n if(isDocument) { // maybe it's a sticker or gif\n attachType = 'document';\n apiFileName = '';\n } else if(fileType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(fileType) >= 0) {\n attachType = 'audio';\n apiFileName = 'audio.' + (fileType.split('/')[1] === 'ogg' ? 'ogg' : 'mp3');\n actionName = 'sendMessageUploadAudioAction';\n\n if(options.isVoiceMessage) {\n attachType = 'voice';\n message.pFlags.media_unread = true;\n }\n\n const attribute: DocumentAttribute.documentAttributeAudio = {\n _: 'documentAttributeAudio',\n pFlags: {\n voice: options.isVoiceMessage || undefined\n },\n waveform: options.waveform,\n duration: options.duration || 0\n };\n\n attributes.push(attribute);\n } else if(!options.isMedia) {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n } else if(isPhoto) {\n attachType = 'photo';\n apiFileName = 'photo.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadPhotoAction';\n\n const photoSize = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: THUMB_TYPE_FULL,\n location: null,\n size: file.size\n } as PhotoSize.photoSize;\n\n photo = {\n _: 'photo',\n id: '' + message.id,\n sizes: [photoSize],\n w: options.width,\n h: options.height\n } as any;\n\n if(strippedPhotoSize) {\n photo.sizes.unshift(strippedPhotoSize);\n }\n\n const cacheContext = this.thumbsStorage.getCacheContext(photo, photoSize.type);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n\n photo = this.appPhotosManager.savePhoto(photo);\n } else if(getEnvironment().VIDEO_MIME_TYPES_SUPPORTED.has(fileType as VIDEO_MIME_TYPE)) {\n attachType = 'video';\n apiFileName = 'video.mp4';\n actionName = 'sendMessageUploadVideoAction';\n\n const videoAttribute: DocumentAttribute.documentAttributeVideo = {\n _: 'documentAttributeVideo',\n pFlags: {\n round_message: options.isRoundMessage || undefined,\n supports_streaming: true\n },\n duration: options.duration,\n w: options.width,\n h: options.height\n };\n\n attributes.push(videoAttribute);\n\n // * must follow after video attribute\n if(options.noSound &&\n file.size > (10 * 1024) &&\n file.size < (10 * 1024 * 1024)) {\n attributes.push({\n _: 'documentAttributeAnimated'\n });\n }\n } else {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n }\n\n attributes.push({_: 'documentAttributeFilename', file_name: fileName || apiFileName});\n\n if((['document', 'video', 'audio', 'voice'] as (typeof attachType)[]).indexOf(attachType) !== -1 && !isDocument) {\n const thumbs: PhotoSize[] = [];\n document = {\n _: 'document',\n id: '' + message.id,\n duration: options.duration,\n attributes,\n w: options.width,\n h: options.height,\n thumbs,\n mime_type: fileType,\n size: file.size\n } as any;\n\n if(options.objectURL) {\n const cacheContext = this.thumbsStorage.getCacheContext(document);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL;\n }\n\n let thumb: PhotoSize.photoSize;\n if(isPhoto) {\n attributes.push({\n _: 'documentAttributeImageSize',\n w: options.width,\n h: options.height\n });\n\n thumb = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: THUMB_TYPE_FULL,\n size: file.size\n };\n } else if(attachType === 'video') {\n if(options.thumb) {\n thumb = {\n _: 'photoSize',\n w: options.thumb.size.width,\n h: options.thumb.size.height,\n type: 'local-thumb',\n size: options.thumb.blob.size\n };\n\n const thumbCacheContext = this.thumbsStorage.getCacheContext(document, thumb.type);\n thumbCacheContext.downloaded = thumb.size;\n thumbCacheContext.url = options.thumb.url;\n }\n }\n\n if(thumb) {\n thumbs.push(thumb);\n }\n\n if(strippedPhotoSize) {\n thumbs.unshift(strippedPhotoSize);\n }\n\n /* if(thumbs.length) {\n const thumb = thumbs[0] as PhotoSize.photoSize;\n const docThumb = appPhotosManager.getDocumentCachedThumb(document.id);\n docThumb.downloaded = thumb.size;\n docThumb.url = thumb.url;\n } */\n\n document = this.appDocsManager.saveDoc(document);\n }\n\n this.log('sendFile', attachType, apiFileName, file.type, options);\n\n const sentDeferred = deferredPromise();\n // sentDeferred.cancel = () => {\n // const error = new Error('Download canceled');\n // error.name = 'AbortError';\n // sentDeferred.reject(error);\n\n // if(uploadPromise?.cancel) {\n // uploadPromise.cancel();\n // }\n // };\n\n const media: MessageMedia = isDocument ? undefined : {\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\n pFlags: {},\n // preloader,\n photo,\n document\n };\n\n if(media) {\n defineNotNumerableProperties(media as any, ['promise']);\n (media as any).promise = sentDeferred;\n\n if(options.spoiler) {\n (media as MessageMedia.messageMediaPhoto).pFlags.spoiler = true;\n }\n }\n\n message.entities = entities;\n message.message = caption;\n message.media = isDocument ? {\n _: 'messageMediaDocument',\n pFlags: {},\n document: file\n } as MessageMedia.messageMediaDocument : media;\n\n const uploadingFileName = !isDocument ? getFileNameForUpload(file) : undefined;\n message.uploadingFileName = uploadingFileName;\n\n if(uploadingFileName) {\n this.uploadFilePromises[uploadingFileName] = sentDeferred;\n }\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n let uploaded = false,\n uploadPromise: ReturnType = null;\n\n message.send = () => {\n if(isDocument) {\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: getDocumentInput(file)\n };\n\n sentDeferred.resolve(inputMedia);\n } else if(file instanceof File || file instanceof Blob) {\n const load = () => {\n if(!uploaded || message.error) {\n uploaded = false;\n\n uploadPromise = this.apiFileManager.upload({file, fileName: uploadingFileName});\n uploadPromise.catch((err) => {\n if(!uploaded) {\n this.log('cancelling upload', media);\n\n this.cancelPendingMessage(message.random_id);\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n sentDeferred.reject(err);\n }\n });\n\n uploadPromise.addNotifyListener((progress: Progress) => {\n /* if(DEBUG) {\n this.log('upload progress', progress);\n } */\n\n const percents = Math.max(1, Math.floor(100 * progress.done / progress.total));\n if(actionName) {\n this.setTyping(peerId, {_: actionName, progress: percents | 0}, undefined, options.threadId);\n }\n sentDeferred.notifyAll(progress);\n });\n\n sentDeferred.notifyAll({done: 0, total: file.size});\n }\n\n let thumbUploadPromise: typeof uploadPromise;\n if(attachType === 'video' && options.objectURL && options.thumb?.blob) {\n thumbUploadPromise = this.apiFileManager.upload({file: options.thumb.blob});\n }\n\n uploadPromise && uploadPromise.then(async(inputFile) => {\n /* if(DEBUG) {\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\n } */\n\n inputFile.name = apiFileName;\n uploaded = true;\n let inputMedia: InputMedia;\n switch(attachType) {\n case 'photo':\n inputMedia = {\n _: 'inputMediaUploadedPhoto',\n file: inputFile,\n pFlags: {\n spoiler: options.spoiler || undefined\n }\n };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument',\n file: inputFile,\n mime_type: fileType,\n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' || undefined,\n spoiler: options.spoiler || undefined\n // nosound_video: options.noSound ? true : undefined\n },\n attributes\n };\n }\n\n if(thumbUploadPromise) {\n try {\n const inputFile = await thumbUploadPromise;\n (inputMedia as InputMedia.inputMediaUploadedDocument).thumb = inputFile;\n } catch(err) {\n this.log.error('sendFile thumb upload error:', err);\n }\n }\n\n sentDeferred.resolve(inputMedia);\n }, (error: ApiError) => {\n toggleError(error);\n throw error;\n });\n\n return sentDeferred;\n };\n\n if(options.isGroupedItem) {\n load();\n } else {\n this.sendSmthLazyLoadQueue.push({\n load\n });\n }\n }\n\n return sentDeferred;\n };\n\n this.beforeMessageSending(message, {\n isGroupedItem: options.isGroupedItem,\n isScheduled: !!options.scheduleDate || undefined,\n threadId: options.threadId,\n clearDraft: options.clearDraft,\n processAfter: options.processAfter\n });\n\n if(!options.isGroupedItem) {\n sentDeferred.then((inputMedia) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n\n return this.apiManager.invokeApi('messages.sendMedia', {\n background: options.background,\n peer: this.appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n message: caption,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n entities,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n if(attachType === 'photo' &&\n error.code === 400 &&\n (error.type === 'PHOTO_INVALID_DIMENSIONS' ||\n error.type === 'PHOTO_SAVE_FILE_INVALID')) {\n error.handled = true;\n attachType = 'document';\n message.send();\n return;\n }\n\n toggleError(error);\n throw error;\n });\n });\n\n sentDeferred.then(message.promise.resolve, message.promise.reject);\n }\n\n const ret: {\n message: typeof message,\n promise: typeof sentDeferred\n } = {\n message\n } as any;\n\n defineNotNumerableProperties(ret, ['promise']);\n ret.promise = sentDeferred;\n\n return ret;\n }\n\n public async sendAlbum(peerId: PeerId, options: MessageSendingParams & {\n isMedia?: boolean,\n entities?: MessageEntity[],\n caption?: string,\n sendFileDetails: SendFileDetails[],\n clearDraft?: boolean\n }) {\n // this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(options.sendFileDetails.length === 1) {\n return this.sendFile(peerId, {...options, ...options.sendFileDetails[0]});\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let caption = options.caption || '';\n let entities = options.entities || [];\n if(caption) {\n caption = parseMarkdown(caption, entities);\n }\n\n this.log('sendAlbum', options);\n\n const groupId = '' + ++this.groupedTempId;\n\n const callbacks: Array<() => void> = [];\n const processAfter = (cb: () => void) => {\n callbacks.push(cb);\n };\n\n const messages = options.sendFileDetails.map((details, idx) => {\n const o: Parameters[1] = {\n isGroupedItem: true,\n isMedia: options.isMedia,\n scheduleDate: options.scheduleDate,\n silent: options.silent,\n replyToMsgId,\n threadId: options.threadId,\n sendAsPeerId: options.sendAsPeerId,\n groupId,\n processAfter,\n ...details\n };\n\n if(idx === 0) {\n o.caption = caption;\n o.entities = entities;\n // o.replyToMsgId = replyToMsgId;\n }\n\n return this.sendFile(peerId, o).message;\n });\n\n if(options.clearDraft) {\n callbacks.push(() => {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n });\n }\n\n callbacks.forEach((callback) => {\n callback();\n });\n\n // * test pending\n // return;\n\n const toggleError = (message: Message.message, error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\n const invoke = (multiMedia: InputSingleMedia[]) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n\n const deferred = deferredPromise();\n this.sendSmthLazyLoadQueue.push({\n load: () => {\n return this.apiManager.invokeApi('messages.sendMultiMedia', {\n peer: inputPeer,\n multi_media: multiMedia,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n }, (error: ApiError) => {\n messages.forEach((message) => toggleError(message, error));\n deferred.reject(error);\n });\n }\n });\n\n return deferred;\n };\n\n const promises: Promise[] = messages.map((message) => {\n return (message.send() as Promise).then((inputMedia) => {\n return Promise.all([\n inputMedia,\n this.apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n })\n ]);\n })\n .then(([originalInputMedia, messageMedia]) => {\n let inputMedia: InputMedia;\n if(messageMedia._ === 'messageMediaPhoto') {\n const photo = this.appPhotosManager.savePhoto(messageMedia.photo);\n inputMedia = getPhotoMediaInput(photo);\n } else if(messageMedia._ === 'messageMediaDocument') {\n const doc = this.appDocsManager.saveDoc(messageMedia.document);\n inputMedia = getDocumentMediaInput(doc);\n }\n\n // copy original flags\n const copyProperties: (keyof InputMedia.inputMediaPhoto)[] = [\n 'pFlags',\n 'ttl_seconds'\n ];\n\n copyProperties.forEach((property) => {\n // @ts-ignore\n inputMedia[property] = originalInputMedia[property] ?? inputMedia[property];\n });\n\n const inputSingleMedia: InputSingleMedia = {\n _: 'inputSingleMedia',\n media: inputMedia,\n random_id: message.random_id,\n message: caption,\n entities\n };\n\n // * only 1 caption for all inputs\n if(caption) {\n caption = '';\n entities = [];\n }\n\n return inputSingleMedia;\n }).catch((err: ApiError) => {\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, err);\n throw err;\n });\n });\n\n return Promise.all(promises).then((inputs) => {\n return invoke(inputs.filter(Boolean));\n });\n }\n\n public sendContact(peerId: PeerId, contactPeerId: PeerId) {\n return this.sendOther(peerId, this.appUsersManager.getContactMediaInput(contactPeerId));\n }\n\n public sendOther(\n peerId: PeerId,\n inputMedia: InputMedia | {_: 'messageMediaPending', messageMedia: MessageMedia},\n options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n geoPoint: GeoPoint\n }> = {}\n ) {\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n // this.checkSendOptions(options);\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let media: MessageMedia;\n switch(inputMedia._) {\n case 'inputMediaPoll': {\n const pollId = '' + message.id;\n inputMedia.poll.id = pollId;\n this.appPollsManager.savePoll(inputMedia.poll, {\n _: 'pollResults',\n flags: 4,\n total_voters: 0,\n pFlags: {},\n recent_voters: []\n });\n\n const {poll, results} = this.appPollsManager.getPoll(pollId);\n media = {\n _: 'messageMediaPoll',\n poll,\n results\n };\n\n break;\n }\n\n case 'inputMediaPhoto': {\n media = {\n _: 'messageMediaPhoto',\n photo: this.appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id)\n };\n break;\n }\n\n case 'inputMediaDocument': {\n const doc = this.appDocsManager.getDoc((inputMedia.id as InputDocument.inputDocument).id);\n /* if(doc.sticker && doc.stickerSetInput) {\n appStickersManager.pushPopularSticker(doc.id);\n } */\n media = {\n _: 'messageMediaDocument',\n document: doc\n };\n break;\n }\n\n case 'inputMediaContact': {\n media = {\n _: 'messageMediaContact',\n phone_number: inputMedia.phone_number,\n first_name: inputMedia.first_name,\n last_name: inputMedia.last_name,\n user_id: inputMedia.user_id ?? '0',\n vcard: inputMedia.vcard\n };\n break;\n }\n\n case 'inputMediaGeoPoint': {\n media = {\n _: 'messageMediaGeo',\n geo: options.geoPoint\n };\n break;\n }\n\n case 'inputMediaVenue': {\n media = {\n _: 'messageMediaVenue',\n geo: options.geoPoint,\n title: inputMedia.title,\n address: inputMedia.address,\n provider: inputMedia.provider,\n venue_id: inputMedia.venue_id,\n venue_type: inputMedia.venue_type\n };\n break;\n }\n\n case 'messageMediaPending': {\n media = (inputMedia as any).messageMedia;\n break;\n }\n }\n\n message.media = media;\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined;\n let apiPromise: Promise;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMedia', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n media: inputMedia as InputMedia,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n message: '',\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }, sentRequestOptions);\n }\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates) => {\n if(updates.updates) {\n updates.updates.forEach((update: Update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n toggleError(error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n threadId: options.threadId,\n clearDraft: options.clearDraft,\n sequential: true\n });\n\n return message.promise;\n }\n\n /* private checkSendOptions(options: Partial<{\n scheduleDate: number\n }>) {\n if(options.scheduleDate) {\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(options.scheduleDate <= minTimestamp) {\n delete options.scheduleDate;\n }\n }\n } */\n\n private beforeMessageSending(message: Message.message, options: Pick & Partial<{\n isGroupedItem: boolean,\n isScheduled: boolean,\n clearDraft: boolean,\n sequential: boolean,\n processAfter?: (cb: () => void) => void\n }> = {}) {\n const messageId = message.id;\n const peerId = this.getMessagePeer(message);\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n message.storageKey = storage.key;\n const callbacks: Array<() => void> = [];\n if(options.isScheduled) {\n // if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\n callbacks.push(() => {\n this.rootScope.dispatchEvent('scheduled_new', message);\n });\n } else {\n /* if(options.threadId && this.threadsStorage[peerId]) {\n delete this.threadsStorage[peerId][options.threadId];\n } */\n const storages: HistoryStorage[] = [\n this.getHistoryStorage(peerId),\n options.threadId ? this.getHistoryStorage(peerId, options.threadId) : undefined\n ];\n\n for(const storage of storages) {\n if(storage) {\n storage.history.unshift(messageId);\n }\n }\n\n this.saveMessages([message], {storage, isOutgoing: true});\n this.setDialogTopMessage(message);\n\n if(options.threadId) {\n const forumTopic = this.dialogsStorage.getForumTopic(peerId, options.threadId);\n if(forumTopic) {\n this.setDialogTopMessage(message, forumTopic);\n }\n }\n\n callbacks.push(() => {\n this.rootScope.dispatchEvent('history_append', {storageKey: storage.key, message});\n });\n }\n\n const pending: PendingMessageDetails = this.pendingByRandomId[message.random_id] = {\n peerId,\n tempId: messageId,\n threadId: options.threadId,\n storage,\n sequential: options.sequential\n };\n\n this.pendingTopMsgs[peerId] = messageId;\n\n if(!options.isGroupedItem && message.send) {\n callbacks.push(() => {\n if(options.clearDraft) {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n }\n\n message.send();\n });\n }\n\n if(callbacks.length) {\n (options.processAfter || processAfter)(() => {\n for(const callback of callbacks) {\n callback();\n }\n });\n }\n\n return pending;\n }\n\n private generateOutgoingMessage(peerId: PeerId, options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n groupId: string,\n replyMarkup: ReplyMarkup,\n }>) {\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n let postAuthor: string;\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\n if(isBroadcast) {\n const chat = this.appPeersManager.getPeer(peerId) as Chat.channel;\n if(chat.pFlags.signatures) {\n const user = this.appUsersManager.getSelf();\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n postAuthor = fullName;\n }\n }\n\n const message: Message.message = {\n _: 'message',\n id: this.generateTempMessageId(peerId),\n from_id: options.sendAsPeerId ? this.appPeersManager.getOutputPeer(options.sendAsPeerId) : this.generateFromId(peerId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n post_author: postAuthor,\n pFlags: this.generateFlags(peerId),\n date: options.scheduleDate || (tsNow(true) + this.timeManager.getServerTimeOffset()),\n message: '',\n grouped_id: options.groupId,\n random_id: randomLong(),\n reply_to: this.generateReplyHeader(peerId, options.replyToMsgId, options.threadId),\n via_bot_id: options.viaBotId,\n reply_markup: options.replyMarkup,\n replies: this.generateReplies(peerId),\n views: isBroadcast && 1,\n pending: true\n };\n\n defineNotNumerableProperties(message, ['send', 'promise']);\n if(options.groupId === undefined) {\n message.promise = deferredPromise();\n }\n\n return message;\n }\n\n private generateReplyHeader(peerId: PeerId, replyToMsgId: number, replyToTopId?: number) {\n const isForum = this.appPeersManager.isForum(peerId);\n if(isForum && !replyToTopId) {\n const originalMessage = this.getMessageByPeer(peerId, replyToMsgId);\n if(originalMessage) {\n replyToTopId = getMessageThreadId(originalMessage, true);\n }\n }\n\n const header: MessageReplyHeader = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId,\n pFlags: {}\n };\n\n if(replyToTopId && isForum && GENERAL_TOPIC_ID !== replyToTopId) {\n header.pFlags.forum_topic = true;\n }\n\n if(replyToTopId && header.reply_to_msg_id !== replyToTopId) {\n header.reply_to_top_id = replyToTopId;\n }\n\n return header;\n }\n\n private generateReplies(peerId: PeerId) {\n let replies: MessageReplies.messageReplies;\n if(this.appPeersManager.isBroadcast(peerId)) {\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n if(channelFull?.linked_chat_id) {\n replies = {\n _: 'messageReplies',\n flags: 1,\n pFlags: {\n comments: true\n },\n channel_id: channelFull.linked_chat_id,\n replies: 0,\n replies_pts: 0\n };\n }\n }\n\n return replies;\n }\n\n /**\n * Generate correct from_id according to anonymous or broadcast\n */\n private generateFromId(peerId: PeerId) {\n if(this.appPeersManager.isAnyChat(peerId) && (this.appPeersManager.isBroadcast(peerId) || this.isAnonymousSending(peerId))) {\n return undefined;\n } else {\n return this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId());\n }\n }\n\n private generateFlags(peerId: PeerId) {\n const pFlags: Message.message['pFlags'] = {};\n const fromId = this.appUsersManager.getSelf().id;\n if(peerId !== fromId) {\n pFlags.out = true;\n\n if(!this.appPeersManager.isChannel(peerId) && !this.appUsersManager.isBot(peerId)) {\n pFlags.unread = true;\n }\n }\n\n if(this.appPeersManager.isBroadcast(peerId)) {\n pFlags.post = true;\n }\n\n return pFlags;\n }\n\n private generateForwardHeader(peerId: PeerId, originalMessage: Message.message) {\n const myId = this.appUsersManager.getSelf().id.toPeerId();\n const fromId = originalMessage.fromId;\n if(fromId === myId && originalMessage.peerId === myId && !originalMessage.fwd_from) {\n return;\n }\n\n const fwdHeader: MessageFwdHeader.messageFwdHeader = {\n _: 'messageFwdHeader',\n flags: 0,\n date: originalMessage.date\n };\n\n let isUserHidden = false;\n if(originalMessage.fwd_from) {\n fwdHeader.from_id = originalMessage.fwd_from.from_id;\n fwdHeader.from_name = originalMessage.fwd_from.from_name;\n fwdHeader.post_author = originalMessage.fwd_from.post_author;\n } else {\n fwdHeader.post_author = originalMessage.post_author;\n\n if(fromId.isUser()) {\n const userFull = this.appProfileManager.getCachedFullUser(fromId.toUserId());\n if(userFull?.private_forward_name) {\n fwdHeader.from_name = userFull.private_forward_name;\n isUserHidden = true;\n }\n }\n\n if(!isUserHidden) {\n fwdHeader.from_id = this.appPeersManager.getOutputPeer(fromId);\n }\n }\n\n if(this.appPeersManager.isBroadcast(originalMessage.peerId)) {\n if(originalMessage.post_author) {\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n fwdHeader.channel_post = originalMessage.id;\n }\n\n if(peerId === myId && !isUserHidden) {\n fwdHeader.saved_from_msg_id = originalMessage.id;\n fwdHeader.saved_from_peer = this.appPeersManager.getOutputPeer(originalMessage.peerId);\n }\n\n return fwdHeader;\n }\n\n public generateFakeAvatarMessage(peerId: PeerId, photo: Photo) {\n const maxId = Number.MAX_SAFE_INTEGER;\n const message: Message.messageService = {\n _: 'messageService',\n pFlags: {},\n action: {\n _: 'messageActionChannelEditPhoto',\n photo\n },\n id: maxId,\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n mid: maxId,\n peerId,\n date: (photo as Photo.photo).date,\n fromId: peerId\n };\n\n this.getHistoryMessagesStorage(peerId).set(maxId, message);\n return message;\n }\n\n public getUploadPromise(uploadFileName: string) {\n return this.uploadFilePromises[uploadFileName];\n }\n\n public isAnonymousSending(peerId: PeerId): boolean {\n if(!peerId.isAnyChat()) {\n return false;\n }\n\n const chat = this.appPeersManager.getPeer(peerId);\n return (chat as Chat.channel).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(\n message: MyMessage,\n dialog: MTDialog.dialog | ForumTopic = this.getDialogOnly(message.peerId)\n ) {\n if(!dialog) {\n return;\n }\n\n dialog.top_message = message.mid;\n\n const historyStorage = this.getHistoryStorage(message.peerId, dialog._ === 'forumTopic' ? dialog.id : undefined);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\n }\n\n public cancelPendingMessage(randomId: string) {\n const pendingData = this.pendingByRandomId[randomId];\n\n /* if(DEBUG) {\n this.log('cancelPendingMessage', randomId, pendingData);\n } */\n\n if(pendingData) {\n const {peerId, tempId, storage} = pendingData;\n const historyStorage = this.getHistoryStorage(peerId);\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: [tempId],\n pts: undefined,\n pts_count: undefined\n });\n\n historyStorage.history.delete(tempId);\n\n delete this.pendingByRandomId[randomId];\n storage.delete(tempId);\n\n return true;\n }\n\n return false;\n }\n\n /* public async refreshConversations() {\n const limit = 200, outDialogs: Dialog[] = [];\n for(let folderId = 0; folderId < 2; ++folderId) {\n let offsetDate = 0;\n for(;;) {\n const {dialogs, isEnd} = await this.getTopMessages(limit, folderId, offsetDate);\n\n if(dialogs.length) {\n outDialogs.push(...dialogs as Dialog[]);\n const dialog = dialogs[dialogs.length - 1];\n\n // * get peerId and mid manually, because dialog can be migrated peer and it won't be saved\n const peerId = getPeerId(dialog.peer);\n const mid = generateMessageId(dialog.top_message);\n offsetDate = this.getMessageByPeer(peerId, mid).date;\n\n if(!offsetDate) {\n console.error('refreshConversations: got no offsetDate', dialog);\n break;\n }\n }\n\n if(isEnd) {\n break;\n }\n }\n }\n\n let obj: {[peerId: string]: Dialog} = {};\n outDialogs.forEach((dialog) => {\n obj[dialog.peerId] = dialog;\n });\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n\n return outDialogs;\n } */\n\n public async fillConversations(folderId = GLOBAL_FOLDER_ID): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(folderId)) {\n const result = await this.getTopMessages({limit: 100, folderId});\n if(!middleware() || result.isEnd) {\n break;\n }\n }\n }\n\n /* public async getConversationsAll(query = '', folderId = 0) {\n const limit = 200, outDialogs: Dialog[] = [];\n for(; folderId < 2; ++folderId) {\n let offsetIndex = 0;\n for(;;) {\n const {dialogs} = await appMessagesManager.getConversations(query, offsetIndex, limit, folderId).promise;\n\n if(dialogs.length) {\n outDialogs.push(...dialogs);\n offsetIndex = dialogs[dialogs.length - 1].index || 0;\n } else {\n break;\n }\n }\n }\n\n return outDialogs;\n } */\n\n public getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId && !this.appChatsManager.isForum(peerId.toChatId())) {\n const chatHistoryStorage = this.getHistoryStorage(peerId);\n const readMaxId = Math.max(chatHistoryStorage.readMaxId ?? 0, historyStorage.readMaxId);\n const message = this.getMessageByPeer(peerId, historyStorage.maxId); // usually message is missing, so pFlags.out won't be there anyway\n return !message?.pFlags?.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n } else {\n const message = this.getMessageByPeer(peerId, historyStorage.maxId);\n const readMaxId = peerId.isUser() ? Math.max(historyStorage.readMaxId, historyStorage.readOutboxMaxId) : historyStorage.readMaxId;\n // readMaxId can be 4294967295 (0)\n return !message?.pFlags?.out && readMaxId < historyStorage.maxId && getServerMessageId(readMaxId) ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages({limit, folderId}: {\n limit: number,\n folderId: number\n }) {\n // const dialogs = this.dialogsStorage.getFolder(folderId);\n const offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n let offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n if(offsetDate) {\n offsetIndex = offsetDate * 0x10000;\n offsetDate += this.timeManager.getServerTimeOffset();\n }\n\n const useLimit = 100;\n const middleware = this.middleware.get();\n const peerId = this.dialogsStorage.isFilterIdForForum(folderId) ? folderId : undefined;\n\n const processResult = (result: MessagesDialogs | MessagesForumTopics) => {\n if(!middleware() || result._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', result);\n }\n\n // can reset pinned order here\n if(!peerId && !offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!peerId && !offsetDate) {\n // telegramMeWebManager.setAuthorized(true);\n this.appDraftsManager.addMissedDialogs();\n }\n\n this.appUsersManager.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n this.saveMessages(result.messages);\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const setFolderId: REAL_FOLDER_ID = folderId === GLOBAL_FOLDER_ID ? FOLDER_ID_ALL : folderId as REAL_FOLDER_ID;\n const saveGlobalOffset = !!peerId || folderId === GLOBAL_FOLDER_ID;\n const items: Array =\n (result as MessagesDialogs.messagesDialogsSlice).dialogs as Dialog[] ||\n (result as MessagesForumTopics).topics as ForumTopic[];\n forEachReverse(items, (dialog) => {\n if(!dialog) {\n return;\n }\n\n // const d = Object.assign({}, dialog);\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\n if(!peerId) {\n (dialog as Dialog).folder_id ??= setFolderId;\n }\n\n this.dialogsStorage.saveDialog({\n dialog,\n ignoreOffsetDate: true,\n saveGlobalOffset\n });\n\n if(dialog.peerId === undefined) {\n this.log.error('bugged dialog?', dialog);\n debugger;\n return;\n }\n\n if(!maxSeenIdIncremented &&\n !this.appPeersManager.isChannel(dialog.peerId || this.appPeersManager.getPeerId(dialog.peer))) {\n this.incrementMaxSeenId(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n\n // if(!folderId && !dialog.folder_id) {\n // this.lolSet.add(dialog.peerId);\n // }\n\n if(offsetIndex && getDialogIndex(dialog) > offsetIndex) {\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\n hasPrepend = true;\n }\n\n // ! это может случиться, если запрос идёт не по папке 0, а по 1. почему-то read'ов нет\n // ! в итоге, чтобы получить 1 диалог, делается первый запрос по папке 0, потом запрос для архивных по папке 1, и потом ещё перезагрузка архивного диалога\n if(!peerId && !getServerMessageId(dialog.read_inbox_max_id) && !getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs.set(dialog.peerId, {dialog: dialog as Dialog});\n\n this.log.error('noIdsDialogs', dialog, params);\n } else if(dialog.top_message) { // * fix sending status\n const topMessage = this.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(topMessage) {\n this.setMessageUnreadByDialog(topMessage, dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n });\n\n if(noIdsDialogs.size) {\n // setTimeout(() => { // test bad situation\n const peerIds = [...noIdsDialogs.keys()];\n const promises = peerIds.map((peerId) => this.reloadConversation(peerId));\n Promise.all(promises).then(() => {\n this.rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\n\n for(let i = 0; i < peerIds.length; ++i) {\n const peerId = peerIds[i];\n this.rootScope.dispatchEvent('dialog_unread', {\n peerId,\n dialog: this.getDialogOnly(peerId)\n });\n }\n });\n // }, 10e3);\n }\n\n const count = (result as MessagesDialogs.messagesDialogsSlice).count;\n\n // exclude empty draft dialogs\n const folderDialogs = this.dialogsStorage.getFolderDialogs(folderId, false);\n let dialogsLength = 0;\n for(let i = 0, length = folderDialogs.length; i < length; ++i) {\n const dialog = folderDialogs[i];\n if(getServerMessageId(dialog.top_message)) {\n ++dialogsLength;\n } else {\n this.log.error('something strange with dialog', dialog);\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */\n !count ||\n dialogsLength >= count ||\n !items.length;\n if(isEnd) {\n this.dialogsStorage.setDialogsLoaded(folderId, true);\n }\n\n if(hasPrepend) {\n this.scheduleHandleNewDialogs();\n } else {\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map());\n }\n\n const dialogs = items;\n const slicedDialogs = limit === useLimit ? dialogs : dialogs.slice(0, limit);\n return {\n isEnd: isEnd && slicedDialogs[slicedDialogs.length - 1] === dialogs[dialogs.length - 1],\n count,\n dialogs: slicedDialogs\n };\n };\n\n let promise: Promise>, params: any;\n if(peerId) {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'channels.getForumTopics',\n params: params = {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n limit: useLimit,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_topic: 0\n },\n options: {\n // timeout: APITIMEOUT,\n noErrorBox: true\n },\n processResult: (result) => {\n result = this.dialogsStorage.processTopics(peerId, result);\n return processResult(result);\n }\n });\n } else {\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'messages.getDialogs',\n params: params = {\n folder_id: folderId,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\n limit: useLimit,\n hash: '0'\n },\n options: {\n // timeout: APITIMEOUT,\n noErrorBox: true\n },\n processResult\n });\n }\n\n return promise;\n }\n\n public async forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: MessageSendingParams & Partial<{\n withMyScore: true,\n dropAuthor: boolean,\n dropCaptions: boolean\n }> = {}) {\n delete options.replyToMsgId;\n delete options.threadId;\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n mids = mids.slice().sort((a, b) => a - b);\n\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\n if(originalMessage.pFlags.is_outgoing) { // this can happen when forwarding a changelog\n this.sendText(peerId, originalMessage.message, {\n entities: originalMessage.entities,\n scheduleDate: options.scheduleDate,\n silent: options.silent\n });\n\n mids.splice(i--, 1);\n --length;\n }\n }\n\n if(!mids.length) {\n return Promise.resolve();\n }\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\n\n if(options.dropCaptions) {\n options.dropAuthor = true;\n }\n\n const groups: {\n [groupId: string]: {\n tempId: string,\n messages: Message.message[]\n }\n } = {};\n\n const newMids: number[] = [];\n const newMessages = mids.map((mid) => {\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\n newMids.push(message.id);\n\n const keys: Array = [\n 'entities',\n 'media'\n // 'reply_markup'\n ];\n\n if(!options.dropAuthor) {\n message.fwd_from = this.generateForwardHeader(peerId, originalMessage);\n keys.push('views', 'forwards');\n\n if(message.fwd_from?.from_name && peerId === this.appPeersManager.peerId) {\n delete message.from_id;\n }\n }\n\n if(!options.dropCaptions || !originalMessage.media) {\n keys.push('message');\n }\n\n const replyToMid = originalMessage.reply_to?.reply_to_msg_id;\n const replyToMessageIdx = mids.indexOf(replyToMid);\n if(replyToMid && replyToMessageIdx !== -1) {\n const newReplyToMid = newMids[replyToMessageIdx];\n message.reply_to = {\n _: 'messageReplyHeader',\n reply_to_msg_id: newReplyToMid\n };\n\n /* this.invokeAfterMessageIsSent(newReplyToMid, 'reply', async(originalMessage) => {\n message.reply_to.reply_to_msg_id = originalMessage.mid;\n }); */\n }\n\n keys.forEach((key) => {\n // @ts-ignore\n message[key] = copy(originalMessage[key]);\n });\n\n const document = (message.media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n const types: MyDocument['type'][] = ['round', 'voice'];\n if(types.includes(document.type)) {\n (message as MyMessage).pFlags.media_unread = true;\n }\n\n if(document.sticker && !this.rootScope.premium) {\n const effectThumb = getStickerEffectThumb(document);\n if(effectThumb) {\n (message.media as MessageMedia.messageMediaDocument).pFlags.nopremium = true;\n }\n }\n }\n\n if(originalMessage.grouped_id) {\n const group = groups[originalMessage.grouped_id] ??= {tempId: '' + ++this.groupedTempId, messages: []};\n group.messages.push(message);\n }\n\n return message;\n });\n\n for(const groupId in groups) {\n const group = groups[groupId];\n if(group.messages.length > 1) {\n group.messages.forEach((message) => {\n message.grouped_id = group.tempId;\n });\n }\n }\n\n newMessages.forEach((message) => {\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n sequential: true\n });\n });\n\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const promise = /* true ? Promise.resolve() : */this.apiManager.invokeApiAfter('messages.forwardMessages', {\n from_peer: this.appPeersManager.getInputPeerById(fromPeerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n random_id: newMessages.map((message) => message.random_id),\n to_peer: this.appPeersManager.getInputPeerById(peerId),\n with_my_score: options.withMyScore,\n silent: options.silent,\n schedule_date: options.scheduleDate,\n drop_author: options.dropAuthor,\n drop_media_captions: options.dropCaptions,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }, sentRequestOptions).then((updates) => {\n this.log('forwardMessages updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n this.onMessagesSendError(newMessages, error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.forwardMessages(peerId, fromPeerId, overflowMids, options));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public generateEmptyMessage(mid: number): Message.message | Message.messageService {\n return undefined;\n // return {\n // _: 'messageEmpty',\n // id: getServerMessageId(mid),\n // mid,\n // deleted: true,\n // pFlags: {}\n // };\n }\n\n private onMessagesSendError(messages: Message.message[], error?: ApiError) {\n messages.forEach((message) => {\n if(message.error === error) {\n return;\n }\n\n if(error) {\n message.error = error;\n this.rootScope.dispatchEvent('message_error', {storageKey: message.storageKey, tempId: message.mid, error});\n\n const dialog = this.getDialogOnly(message.peerId);\n if(dialog) {\n this.rootScope.dispatchEvent('dialog_unread', {peerId: message.peerId, dialog});\n }\n } else {\n delete message.error;\n }\n });\n }\n\n public getMessagesStorageByKey(key: MessagesStorageKey) {\n const s = key.split('_');\n const peerId: PeerId = +s[0];\n const type: MessagesStorageType = s[1] as any;\n return type === 'scheduled' ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n }\n\n public getMessageFromStorage(storage: MessagesStorage | MessagesStorageKey, mid: number) {\n if(typeof(storage) === 'string') {\n storage = this.getMessagesStorageByKey(storage);\n }\n\n return storage && storage.get(mid)/* || this.generateEmptyMessage(mid) */;\n }\n\n private createMessageStorage(peerId: PeerId, type: MessagesStorageType) {\n const storage: MessagesStorage = new Map() as any;\n storage.peerId = peerId;\n storage.type = type;\n storage.key = `${peerId}_${type}`;\n\n /* let num = 0;\n Object.defineProperty(storage, 'num', {\n get: () => ++num,\n set: (_num: number) => num = _num,\n enumerable: false\n });\n\n Object.defineProperty(storage, 'generateIndex', {\n value: (message: any) => {\n if(message.index === undefined) {\n message.index = (message.date * 0x10000) + (storage.num & 0xFFFF);\n }\n },\n enumerable: false\n }); */\n\n return storage;\n }\n\n public getHistoryMessagesStorage(peerId: PeerId) {\n return this.messagesStorageByPeerId[peerId] ??= this.createMessageStorage(peerId, 'history');\n }\n\n public getMessagesStorage(key: MessagesStorageKey | MessagesStorage): MessagesStorage {\n if(typeof(key) === 'object') {\n return key;\n } else {\n return this.getMessagesStorageByKey(key);\n }\n }\n\n public getMessageById(messageId: number) {\n for(const peerId in this.messagesStorageByPeerId) {\n if(this.appPeersManager.isChannel(peerId.toPeerId())) {\n continue;\n }\n\n const message = this.messagesStorageByPeerId[peerId].get(messageId);\n if(message) {\n return message;\n }\n }\n\n return this.getMessageFromStorage(null, messageId);\n }\n\n public getMessageByPeer(peerId: PeerId, messageId: number) {\n if(!peerId) {\n return this.getMessageById(messageId);\n }\n\n return this.getMessageFromStorage(this.getHistoryMessagesStorage(peerId), messageId);\n }\n\n public getMessagePeer(message: any): PeerId {\n const toId = message.peer_id && this.appPeersManager.getPeerId(message.peer_id) || NULL_PEER_ID;\n\n return toId;\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogsStorage.getDialogOnly(peerId);\n }\n\n public cantForwardDeleteMids(storageKey: MessagesStorageKey, mids: number[]) {\n const storage = this.getMessagesStorage(storageKey);\n let cantForward = !mids.length, cantDelete = !mids.length;\n for(const mid of mids) {\n const message = this.getMessageFromStorage(storage, mid);\n if(!cantForward) {\n cantForward = !this.canForward(message);\n }\n\n if(!cantDelete) {\n cantDelete = !this.canDeleteMessage(message);\n }\n\n if(cantForward && cantDelete) break;\n }\n\n return {cantForward, cantDelete};\n }\n\n public reloadConversationOrTopic(peerId: PeerId, threadId?: number) {\n if(threadId) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n this.reloadConversation(peerId);\n }\n }\n\n public reloadConversation(inputPeer?: PeerId | InputPeer): CancellablePromise;\n public reloadConversation(inputPeer: PeerId | InputPeer) {\n let promise: CancellablePromise;\n if(inputPeer !== undefined) {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n this.log.warn('reloadConversation', peerId);\n\n let obj = this.reloadConversationsPeers.get(peerId);\n if(obj) {\n promise = obj.promise;\n }\n\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n this.reloadConversationsPeers.set(peerId, obj = {\n inputDialogPeer: this.appPeersManager.getInputDialogPeerById(inputPeer),\n promise\n });\n }\n\n if(this.reloadConversationsPromise) {\n return promise || this.reloadConversationsPromise;\n }\n\n this.reloadConversationsPromise = pause(0).then(() => {\n const inputDialogPeers: InputDialogPeer[] = [];\n const promises: {[peerId: string]: typeof promise} = {};\n for(const [peerId, {inputDialogPeer, promise}] of this.reloadConversationsPeers) {\n inputDialogPeers.push(inputDialogPeer);\n promises[peerId] = promise;\n }\n\n const fullfillLeft = () => {\n for(const peerId in promises) {\n this.reloadConversationsPeers.delete(+peerId);\n promises[peerId].resolve(undefined);\n }\n };\n\n const invoke = async() => {\n for(;;) {\n const result = await this.apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers});\n const currentState = this.apiUpdatesManager.updatesState;\n const {state} = result;\n if(currentState.pts && currentState.pts !== state.pts) {\n await pause(500);\n continue;\n }\n\n return result;\n }\n };\n\n return invoke().then((result) => {\n for(const peerId in promises) {\n this.reloadConversationsPeers.delete(+peerId);\n }\n\n this.dialogsStorage.applyDialogs(result);\n\n result.dialogs.forEach((dialog) => {\n const peerId = dialog.peerId;\n if(peerId) {\n promises[peerId].resolve(dialog as Dialog);\n delete promises[peerId];\n }\n });\n }, noop).then(() => {\n fullfillLeft();\n\n this.reloadConversationsPromise = null;\n if(this.reloadConversationsPeers.size) {\n this.reloadConversation();\n }\n });\n });\n\n return promise || this.reloadConversationsPromise;\n }\n\n private doFlushHistory(peerId: PeerId, just_clear?: boolean, revoke?: boolean, threadId?: number): Promise {\n let promise: Promise;\n const processResult = (affectedHistory: MessagesAffectedHistory) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n return true;\n }\n\n return this.doFlushHistory(peerId, just_clear, revoke, threadId);\n };\n\n if(!threadId) {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'messages.deleteHistory',\n params: {\n just_clear,\n revoke,\n peer: this.appPeersManager.getInputPeerById(peerId),\n max_id: 0\n },\n processResult\n });\n } else {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'channels.deleteTopicHistory',\n params: {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n top_msg_id: getServerMessageId(threadId)\n },\n processResult\n });\n }\n\n return promise;\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean, threadId?: number) {\n if(this.appPeersManager.isChannel(peerId) && !threadId) {\n const promise = this.getHistory(peerId, 0, 1);\n\n const historyResult = await promise;\n\n const channelId = peerId.toChatId();\n const maxId = historyResult.history[0] || 0;\n return this.apiManager.invokeApiSingle('channels.deleteHistory', {\n channel: this.appChatsManager.getChannelInput(channelId),\n max_id: getServerMessageId(maxId)\n }).then((bool) => {\n if(bool) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelAvailableMessages',\n channel_id: channelId,\n available_min_id: maxId\n });\n }\n\n return bool;\n });\n }\n\n return this.doFlushHistory(peerId, justClear, revoke, threadId).then(() => {\n if(!threadId) {\n this.flushStoragesByPeerId(peerId);\n }\n\n if(justClear) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog: this.getDialogOnly(peerId)});\n } else {\n const key = this.getTypingKey(peerId, threadId);\n delete this.notificationsToHandle[key];\n delete this.typings[key];\n\n if(!threadId) {\n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId, threadId);\n }\n });\n }\n\n private flushStoragesByPeerId(peerId: PeerId) {\n [\n this.historiesStorage,\n this.threadsStorage,\n this.searchesStorage,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach((s) => {\n delete s[peerId];\n });\n\n for(const key in this.pinnedMessages) {\n if(+key === peerId || key.startsWith(peerId + '_')) {\n delete this.pinnedMessages[key];\n }\n }\n\n const needSingleMessages = this.needSingleMessages.get(peerId);\n if(needSingleMessages) {\n for(const [mid, promise] of needSingleMessages) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n\n needSingleMessages.clear();\n }\n\n [\n this.messagesStorageByPeerId,\n this.scheduledMessagesStorage\n ].forEach((s) => {\n const ss = s[peerId];\n if(ss) {\n ss.clear();\n }\n });\n\n this.dialogsStorage.flushForumTopicsCache(peerId);\n }\n\n public hidePinnedMessages(peerId: PeerId) {\n return Promise.all([\n this.appStateManager.getState(),\n this.getPinnedMessage(peerId)\n ])\n .then(([state, pinned]) => {\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\n this.rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\n });\n }\n\n public getPinnedMessagesKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n public getPinnedMessage(peerId: PeerId, threadId?: number) {\n const p = this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)] ??= {};\n if(p.promise) return p.promise;\n else if(p.maxId) return Promise.resolve(p);\n\n return p.promise = this.getSearch({\n peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: 0,\n limit: 1,\n threadId\n }).then((result) => {\n p.count = result.count;\n p.maxId = result.history[0]?.mid;\n return p;\n }).finally(() => {\n delete p.promise;\n });\n }\n\n public getPinnedMessagesCount(peerId: PeerId, threadId?: number) {\n return this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)]?.count;\n }\n\n public getPinnedMessagesMaxId(peerId: PeerId, threadId?: number) {\n return this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)]?.maxId;\n }\n\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\n return this.apiManager.invokeApi('messages.updatePinnedMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n unpin,\n silent,\n pm_oneside,\n id: getServerMessageId(mid)\n }).then((updates) => {\n // this.log('pinned updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public unpinAllMessages(peerId: PeerId): Promise {\n return this.apiManager.invokeApiSingle('messages.unpinAllMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId)\n }).then((affectedHistory) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n const storage = this.getHistoryMessagesStorage(peerId);\n storage.forEach((message) => {\n if((message as Message.message).pFlags.pinned) {\n delete (message as Message.message).pFlags.pinned;\n }\n });\n\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\n delete this.pinnedMessages[this.getPinnedMessagesKey(peerId)];\n\n return true;\n }\n\n return this.unpinAllMessages(peerId);\n });\n }\n\n public getAlbumText(grouped_id: string) {\n const group = this.groupedMessagesStorage[grouped_id];\n return getAlbumText(Array.from(group.values()) as Message.message[]);\n }\n\n public getGroupsFirstMessage(message: Message.message) {\n if(!message?.grouped_id) return message;\n\n const storage = this.groupedMessagesStorage[message.grouped_id];\n let minMid = Number.MAX_SAFE_INTEGER;\n for(const [mid, message] of storage) {\n if(message.mid < minMid) {\n minMid = message.mid;\n }\n }\n\n return this.getMessageFromStorage(storage, minMid) as Message.message;\n }\n\n public getMidsByAlbum(groupedId: string, sort: 'asc' | 'desc' = 'asc') {\n return getObjectKeysAndSort(this.groupedMessagesStorage[groupedId], sort);\n }\n\n public getMessagesByAlbum(groupedId: string) {\n const mids = this.getMidsByAlbum(groupedId, 'asc');\n const storage = this.groupedMessagesStorage[groupedId];\n return mids.map((mid) => this.getMessageFromStorage(storage, mid) as Message.message);\n }\n\n public getMidsByMessage(message: Message) {\n if(!message) return [];\n else if((message as Message.message).grouped_id) return this.getMidsByAlbum((message as Message.message).grouped_id);\n else return [message.mid];\n }\n\n public filterMessages(message: MyMessage, verify: (message: MyMessage) => boolean) {\n const out: MyMessage[] = [];\n if((message as Message.message).grouped_id) {\n const storage = this.groupedMessagesStorage[(message as Message.message).grouped_id];\n for(const [mid, message] of storage) {\n if(verify(message)) {\n out.push(message);\n }\n }\n } else {\n if(verify(message)) {\n out.push(message);\n }\n }\n\n return out;\n }\n\n public generateTempMessageId(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n return this.appMessagesIdsManager.generateTempMessageId(dialog?.top_message || 0);\n }\n\n public setMessageUnreadByDialog(message: MyMessage, dialog: Dialog | ForumTopic = this.getDialogOnly(message.peerId)) {\n if(dialog && message.mid) {\n if(message.mid > dialog[message.pFlags.out ?\n 'read_outbox_max_id' :\n 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n }\n }\n }\n\n public saveMessage(message: Message, options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n // isNew: boolean, // * new - from update\n }> = {}) {\n if(!message || message._ === 'messageEmpty') {\n return;\n }\n\n message.pFlags ??= {};\n\n // * exclude from state\n // defineNotNumerableProperties(message, ['rReply', 'mid', 'savedFrom', 'fwdFromId', 'fromId', 'peerId', 'reply_to_mid', 'viaBotId']);\n\n const peerId = this.getMessagePeer(message);\n const storage = options.storage || this.getHistoryMessagesStorage(peerId);\n const isChannel = message.peer_id._ === 'peerChannel';\n const isBroadcast = isChannel && this.appChatsManager.isBroadcast(peerId.toChatId());\n const isMessage = message._ === 'message';\n\n if(options.isOutgoing) {\n message.pFlags.is_outgoing = true;\n }\n\n const mid = generateMessageId(message.id);\n message.mid = mid;\n\n if(isMessage) {\n if(options.isScheduled) {\n message.pFlags.is_scheduled = true;\n }\n\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id] ??= this.createMessageStorage(peerId, 'grouped');\n storage.set(mid, message);\n }\n\n if(message.via_bot_id) {\n // ! WARNING\n message.viaBotId = message.via_bot_id as any;\n }\n }\n\n // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n const replyTo = message.reply_to;\n if(replyTo) {\n if(replyTo.reply_to_msg_id) {\n replyTo.reply_to_msg_id = message.reply_to_mid = generateMessageId(replyTo.reply_to_msg_id);\n }\n\n if(replyTo.reply_to_top_id) {\n replyTo.reply_to_top_id = generateMessageId(replyTo.reply_to_top_id);\n }\n }\n\n const replies = isMessage && message.replies;\n if(replies) {\n if(replies.max_id) replies.max_id = generateMessageId(replies.max_id);\n if(replies.read_max_id) replies.read_max_id = generateMessageId(replies.read_max_id);\n }\n\n const overwriting = !!peerId;\n if(!overwriting) {\n message.date -= this.timeManager.getServerTimeOffset();\n }\n\n // storage.generateIndex(message);\n const myId = this.appPeersManager.peerId;\n\n const fwdHeader = isMessage && (message as Message.message).fwd_from;\n\n message.peerId = peerId;\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\n message.fromId = fwdHeader ? (fwdHeader.from_id ? this.appPeersManager.getPeerId(fwdHeader.from_id) : NULL_PEER_ID) : myId;\n } else {\n // message.fromId = message.pFlags.post || (!message.pFlags.out && !message.from_id) ? peerId : appPeersManager.getPeerId(message.from_id);\n message.fromId = message.pFlags.post || !message.from_id ? peerId : this.appPeersManager.getPeerId(message.from_id);\n }\n\n this.setMessageUnreadByDialog(message);\n\n if(fwdHeader) {\n // if(peerId === myID) {\n if(fwdHeader.saved_from_msg_id) fwdHeader.saved_from_msg_id = generateMessageId(fwdHeader.saved_from_msg_id);\n if(fwdHeader.channel_post) fwdHeader.channel_post = generateMessageId(fwdHeader.channel_post);\n\n const peer = fwdHeader.saved_from_peer || fwdHeader.from_id;\n const msgId = fwdHeader.saved_from_msg_id || fwdHeader.channel_post;\n if(peer && msgId) {\n const savedFromPeerId = this.appPeersManager.getPeerId(peer);\n const savedFromMid = generateMessageId(msgId);\n message.savedFrom = savedFromPeerId + '_' + savedFromMid;\n }\n\n /* if(peerId.isAnyChat() || peerId === myID) {\n message.fromId = appPeersManager.getPeerID(!message.from_id || deepEqual(message.from_id, fwdHeader.from_id) ? fwdHeader.from_id : message.from_id);\n } */\n /* } else {\n apiMessage.fwdPostID = fwdHeader.channel_post;\n } */\n\n message.fwdFromId = this.appPeersManager.getPeerId(fwdHeader.from_id);\n\n if(!overwriting) {\n fwdHeader.date -= this.timeManager.getServerTimeOffset();\n }\n }\n\n const mediaContext: ReferenceContext = {\n type: 'message',\n peerId,\n messageId: mid\n };\n\n /* if(isMessage) {\n const entities = message.entities;\n if(entities && entities.find((entity) => entity._ === 'messageEntitySpoiler')) {\n message.media = {_: 'messageMediaUnsupported'};\n }\n } */\n\n let unsupported = false;\n const media = isMessage && message.media;\n if(media) {\n switch(media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(media.ttl_seconds) {\n unsupported = true;\n } else {\n media.photo = this.appPhotosManager.savePhoto(media.photo, mediaContext);\n }\n\n if(!(media as MessageMedia.messageMediaPhoto).photo) { // * found this bug on test DC\n delete message.media;\n }\n\n break;\n }\n\n case 'messageMediaPoll': {\n const result = this.appPollsManager.savePoll(media.poll, media.results, message);\n media.poll = result.poll;\n media.results = result.results;\n break;\n }\n\n case 'messageMediaDocument': {\n if(media.ttl_seconds) {\n unsupported = true;\n } else {\n const originalDoc = media.document;\n media.document = this.appDocsManager.saveDoc(originalDoc, mediaContext); // 11.04.2020 warning\n\n if(!media.document && originalDoc._ !== 'documentEmpty') {\n unsupported = true;\n }\n }\n\n break;\n }\n\n case 'messageMediaWebPage': {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\n media.webpage = this.appWebPagesManager.saveWebPage(media.webpage, messageKey, mediaContext);\n\n if(!media.webpage) {\n delete message.media;\n }\n\n break;\n }\n\n /* case 'messageMediaGame':\n AppGamesManager.saveGame(apiMessage.media.game, apiMessage.mid, mediaContext);\n apiMessage.media.handleMessage = true;\n break; */\n\n case 'messageMediaInvoice': {\n media.photo = this.appWebDocsManager.saveWebDocument(media.photo);\n const extendedMedia = media.extended_media;\n if(extendedMedia?._ === 'messageExtendedMedia') {\n const extendedMediaMedia = extendedMedia.media;\n (extendedMediaMedia as MessageMedia.messageMediaPhoto).photo = this.appPhotosManager.savePhoto((extendedMediaMedia as MessageMedia.messageMediaPhoto).photo, mediaContext);\n (extendedMediaMedia as MessageMedia.messageMediaDocument).document = this.appDocsManager.saveDoc((extendedMediaMedia as MessageMedia.messageMediaDocument).document, mediaContext);\n }\n break;\n }\n\n case 'messageMediaUnsupported': {\n unsupported = true;\n break;\n }\n }\n }\n\n // if(isMessage && !unsupported && message.entities) {\n // unsupported = message.entities.some((entity) => entity._ === 'messageEntityCustomEmoji');\n // }\n\n if(isMessage && unsupported) {\n message.media = {_: 'messageMediaUnsupported'};\n message.message = '';\n delete message.entities;\n delete message.totalEntities;\n }\n\n if(!isMessage && message.action) {\n const action = message.action as MessageAction;\n const suffix = message.fromId === this.appUsersManager.getSelf().id ? 'You' : '';\n let migrateFrom: PeerId, migrateTo: PeerId;\n\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\n (action as MessageAction.messageActionChatEditPhoto).photo = this.appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\n }\n\n if((action as any).document) {\n (action as any).document = this.appDocsManager.saveDoc((action as any).photo, mediaContext);\n }\n\n switch(action._) {\n // case 'messageActionChannelEditPhoto':\n case 'messageActionChatEditPhoto':\n // action.photo = appPhotosManager.savePhoto(action.photo, mediaContext);\n if((action.photo as Photo.photo)?.video_sizes) {\n // @ts-ignore\n action._ = isBroadcast ? 'messageActionChannelEditVideo' : 'messageActionChatEditVideo';\n } else {\n if(isBroadcast) { // ! messageActionChannelEditPhoto не существует в принципе, это используется для перевода.\n // @ts-ignore\n action._ = 'messageActionChannelEditPhoto';\n }\n }\n break;\n\n case 'messageActionGroupCall': {\n // assumeType(action);\n\n this.appGroupCallsManager.saveGroupCall(action.call);\n\n let type: string;\n if(action.duration === undefined) {\n type = 'started';\n } else {\n type = 'ended'\n }\n\n if(!isBroadcast) {\n type += '_by' + suffix;\n }\n\n // @ts-ignore\n action.type = type;\n\n break;\n }\n\n case 'messageActionChatEditTitle':\n /* if(options.isNew) {\n const chat = appChatsManager.getChat(peerId.toChatId());\n chat.title = action.title;\n appChatsManager.saveApiChat(chat, true);\n } */\n\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelEditTitle';\n }\n break;\n\n case 'messageActionChatDeletePhoto':\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelDeletePhoto';\n }\n break;\n\n case 'messageActionChatAddUser':\n if(action.users.length === 1) {\n // @ts-ignore\n action.user_id = action.users[0];\n // @ts-ignore\n if(message.fromId === action.user_id) {\n if(isChannel) {\n // @ts-ignore\n action._ = 'messageActionChatJoined' + suffix;\n } else {\n // @ts-ignore\n action._ = 'messageActionChatReturn' + suffix;\n }\n }\n } else if(action.users.length > 1) {\n // @ts-ignore\n action._ = 'messageActionChatAddUsers';\n }\n break;\n\n case 'messageActionChatDeleteUser':\n if(message.fromId === action.user_id) {\n // @ts-ignore\n action._ = 'messageActionChatLeave' + suffix;\n }\n break;\n\n case 'messageActionChannelMigrateFrom':\n migrateFrom = action.chat_id.toPeerId(true);\n migrateTo = peerId;\n break\n\n case 'messageActionChatMigrateTo':\n migrateFrom = peerId;\n migrateTo = action.channel_id.toPeerId(true);\n break;\n\n case 'messageActionHistoryClear':\n // apiMessage.deleted = true;\n message.clear_history = true;\n delete message.pFlags.out;\n delete message.pFlags.unread;\n break;\n\n case 'messageActionPhoneCall':\n // @ts-ignore\n action.type =\n (action.pFlags.video ? 'video_' : '') +\n (action.duration !== undefined ? (message.pFlags.out ? 'out_' : 'in_') : '') +\n (\n action.duration !== undefined ? 'ok' : (\n action.reason._ === 'phoneCallDiscardReasonMissed' ?\n 'missed' :\n 'cancelled'\n )\n );\n break;\n }\n\n if(migrateFrom &&\n migrateTo &&\n !this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo]) {\n this.migrateChecks(migrateFrom, migrateTo);\n }\n }\n\n /* if(message.grouped_id) {\n if(!groups) {\n groups = new Set();\n }\n\n groups.add(message.grouped_id);\n } else {\n message.rReply = this.getRichReplyText(message);\n } */\n\n if(isMessage && message.message.length && !message.totalEntities) {\n this.wrapMessageEntities(message);\n }\n\n storage.set(mid, message);\n\n return message;\n }\n\n public saveMessages(messages: any[], options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n // isNew: boolean, // * new - from update\n }> = {}): (Message.message | Message.messageService)[] {\n if((messages as any).saved) return messages;\n (messages as any).saved = true;\n messages.forEach((message, idx, arr) => {\n arr[idx] = this.saveMessage(message, options);\n });\n\n return messages;\n }\n\n public async getFirstMessageToEdit(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n let goodMessage: Message.message | Message.messageService;\n const myPeerId = this.appPeersManager.peerId;\n for(const mid of slice) {\n const message = this.getMessageByPeer(peerId, mid);\n const good = myPeerId === peerId ? message.fromId === myPeerId : message.pFlags.out;\n\n if(good) {\n if(await this.canEditMessage(message, 'text')) {\n goodMessage = message;\n break;\n }\n\n // * this check will allow editing only last message\n // break;\n }\n }\n\n return goodMessage;\n }\n }\n\n private wrapMessageEntities(message: Message.message) {\n const apiEntities = message.entities ? message.entities.slice() : [];\n message.message = fixEmoji(message.message, apiEntities);\n\n const myEntities = parseEntities(message.message);\n message.totalEntities = mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n }\n\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\n return this.apiManager.invokeApiSingle('messages.report', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n reason: {\n _: reason\n },\n message\n });\n }\n\n public startBot(botId: BotId, chatId?: ChatId, startParam?: string) {\n const peerId = chatId ? chatId.toPeerId(true) : botId.toPeerId();\n if(startParam) {\n const randomId = randomLong();\n\n return this.apiManager.invokeApi('messages.startBot', {\n bot: this.appUsersManager.getUserInput(botId),\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: randomId,\n start_param: startParam\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n const str = '/start';\n if(chatId) {\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.appChatsManager.inviteToChannel(chatId, [botId]);\n } else {\n promise = this.appChatsManager.addChatUser(chatId, botId, 0);\n }\n\n return promise.catch((error: ApiError) => {\n if(error?.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n return this.sendText(peerId, str + '@' + this.appPeersManager.getPeerUsername(botId.toPeerId()));\n });\n }\n\n return this.sendText(peerId, str);\n }\n\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\n this.apiManager.invokeApi('folders.editPeerFolders', {\n folder_peers: peerIds.map((peerId) => {\n return {\n _: 'inputFolderPeer',\n peer: this.appPeersManager.getInputPeerById(peerId),\n folder_id: folderId\n };\n })\n }).then((updates) => {\n // this.log('editPeerFolders updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates); // WARNING! возможно тут нужно добавлять channelId, и вызывать апдейт для каждого канала отдельно\n });\n }\n\n public getFilter(filterId: number) {\n return this.filtersStorage.getFilter(filterId);\n }\n\n public async toggleDialogPin(options: {\n peerId: PeerId,\n filterId?: number,\n topicId?: number\n }) {\n const {peerId, topicId, filterId = topicId ? peerId : undefined} = options;\n if(filterId === undefined) {\n throw new Error('No filterId');\n }\n\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, topicId);\n if(!dialog) throw undefined;\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const max = await this.apiManager.getLimit(topicId ? 'topicPin' : (filterId === 1 ? 'folderPin' : 'pin'));\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n throw makeError(topicId ? 'PINNED_TOO_MUCH' : 'PINNED_DIALOGS_TOO_MUCH');\n }\n }\n\n if(topicId) {\n return this.appChatsManager.updatePinnedForumTopic(peerId.toChatId(), topicId, pinned);\n }\n\n return this.apiManager.invokeApi('messages.toggleDialogPin', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then((bool) => {\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\n this.apiUpdatesManager.saveUpdate({\n _: 'updateDialogPinned',\n peer: this.appPeersManager.getDialogPeer(peerId),\n folder_id: filterId,\n pFlags\n });\n });\n }\n\n public markDialogUnread(peerId: PeerId, read?: true) {\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const unread = read || dialog.pFlags?.unread_mark ? undefined : true;\n return this.apiManager.invokeApi('messages.markDialogUnread', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n unread\n }).then((bool) => {\n if(bool) {\n const pFlags: Update.updateDialogUnreadMark['pFlags'] = unread ? {unread} : {};\n this.onUpdateDialogUnreadMark({\n _: 'updateDialogUnreadMark',\n peer: this.appPeersManager.getDialogPeer(peerId),\n pFlags\n });\n }\n });\n }\n\n public migrateChecks(migrateFrom: PeerId, migrateTo: PeerId) {\n if(!this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo] &&\n this.appChatsManager.hasChat(migrateTo.toChatId())) {\n const fromChat = this.appChatsManager.getChat(migrateFrom.toChatId()) as Chat.chat;\n if(fromChat?.migrated_to && (fromChat.migrated_to as InputChannel.inputChannel).channel_id === migrateTo.toChatId()) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n\n this.rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\n\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\n }\n }\n }\n\n private canMessageBeEdited(message: Message, kind: 'text' | 'poll') {\n if((message as Message.message)?.pFlags?.is_outgoing) {\n return false;\n }\n\n const goodMedias = [\n 'messageMediaPhoto',\n 'messageMediaDocument',\n 'messageMediaWebPage'\n ];\n\n if(kind === 'poll') {\n goodMedias.push('messageMediaPoll');\n }\n\n if(!message ||\n message._ !== 'message' ||\n message.deleted ||\n message.fwd_from ||\n message.via_bot_id ||\n message.media && goodMedias.indexOf(message.media._) === -1 ||\n message.fromId && this.appUsersManager.isBot(message.fromId)) {\n return false;\n }\n\n if(message.media?._ === 'messageMediaDocument' &&\n ((message.media.document as Document.document).sticker || (message.media.document as Document.document).type === 'round')) {\n return false;\n }\n\n return true;\n }\n\n public async canEditMessage(message: Message.message | Message.messageService, kind: 'text' | 'poll' = 'text') {\n if(!message || !this.canMessageBeEdited(message, kind)) {\n return false;\n }\n\n // * second rule for saved messages, because there is no 'out' flag\n if(/* message.pFlags.out || */this.getMessagePeer(message) === this.appUsersManager.getSelf().id) {\n return true;\n }\n\n const canEditMessageInPeer = this.appPeersManager.isBroadcast(message.peerId) ?\n this.appChatsManager.hasRights(message.peerId.toChatId(), 'edit_messages') :\n message.pFlags.out;\n\n if(\n !canEditMessageInPeer || (\n message.peer_id._ !== 'peerChannel' &&\n message.date < (tsNow(true) - (await this.apiManager.getConfig()).edit_time_limit) &&\n (message as Message.message).media?._ !== 'messageMediaPoll'\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n public canDeleteMessage(message: MyMessage) {\n return message && (\n message.peerId.isUser() ||\n message.pFlags.out ||\n this.appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' ||\n this.appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\n ) && (!message.pFlags.is_outgoing || !!message.error);\n }\n\n public getReplyKeyboard(peerId: PeerId) {\n return this.getHistoryStorage(peerId).replyMarkup;\n }\n\n public mergeReplyKeyboard(historyStorage: HistoryStorage, message: Message.messageService | Message.message) {\n // this.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n if(!message) {\n return false;\n }\n\n const messageReplyMarkup = (message as Message.message).reply_markup;\n if(!messageReplyMarkup &&\n !message.pFlags?.out &&\n !(message as Message.messageService).action) {\n return false;\n }\n\n if(messageReplyMarkup?._ === 'replyInlineMarkup') {\n return false;\n }\n\n const lastReplyMarkup = historyStorage.replyMarkup;\n if(messageReplyMarkup) {\n if(lastReplyMarkup && lastReplyMarkup.mid >= message.mid) {\n return false;\n }\n\n if(messageReplyMarkup.pFlags.selective) {\n return false;\n }\n\n if(historyStorage.maxOutId &&\n message.mid < historyStorage.maxOutId &&\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.single_use) {\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.hidden = true;\n }\n\n messageReplyMarkup.mid = message.mid;\n /* messageReplyMarkup = Object.assign({\n mid: message.mid\n }, messageReplyMarkup); */\n\n if(messageReplyMarkup._ !== 'replyKeyboardHide') {\n messageReplyMarkup.fromId = this.appPeersManager.getPeerId(message.from_id);\n }\n\n historyStorage.replyMarkup = messageReplyMarkup;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n if(message.pFlags.out) {\n if(lastReplyMarkup) {\n assumeType(lastReplyMarkup);\n if(lastReplyMarkup.pFlags.single_use &&\n !lastReplyMarkup.pFlags.hidden &&\n (message.mid > lastReplyMarkup.mid || message.pFlags.is_outgoing) &&\n (message as Message.message).message) {\n lastReplyMarkup.pFlags.hidden = true;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n } else if(!historyStorage.maxOutId ||\n message.mid > historyStorage.maxOutId) {\n historyStorage.maxOutId = message.mid;\n }\n }\n\n assumeType(message);\n if(message.action?._ === 'messageActionChatDeleteUser' &&\n (lastReplyMarkup ?\n message.action.user_id === (lastReplyMarkup as ReplyMarkup.replyKeyboardMarkup).fromId :\n this.appUsersManager.isBot(message.action.user_id)\n )\n ) {\n historyStorage.replyMarkup = {\n _: 'replyKeyboardHide',\n mid: message.mid,\n pFlags: {}\n };\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n return false;\n }\n\n public getSearchStorage(peerId: PeerId, inputFilter: MyInputMessagesFilter) {\n if(!this.searchesStorage[peerId]) this.searchesStorage[peerId] = {};\n if(!this.searchesStorage[peerId][inputFilter]) this.searchesStorage[peerId][inputFilter] = {history: []};\n return this.searchesStorage[peerId][inputFilter];\n }\n\n public getSearchCounters(\n peerId: PeerId,\n filters: MessagesFilter[],\n canCache = true,\n threadId?: number\n ): Promise {\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return Promise.resolve(filters.map((filter) => {\n return {\n _: 'messages.searchCounter',\n pFlags: {},\n filter: filter,\n count: 0\n };\n }));\n }\n\n const func = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n return func('messages.getSearchCounters', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n filters,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n });\n }\n\n public filterMessagesByInputFilterFromStorage(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage | MessagesStorageKey, limit: number) {\n const _storage = this.getMessagesStorage(storage);\n return filterMessagesByInputFilter(inputFilter, history.map((mid) => _storage.get(mid)), limit);\n }\n\n public getSearch({peerId, query, inputFilter, maxId, limit, nextRate, backLimit, threadId, folderId, minDate, maxDate}: {\n peerId?: PeerId,\n maxId?: number,\n limit?: number,\n nextRate?: number,\n backLimit?: number,\n threadId?: number,\n folderId?: number,\n query?: string,\n inputFilter?: {\n _: MyInputMessagesFilter\n },\n minDate?: number,\n maxDate?: number\n }): Promise<{\n count: number,\n next_rate: number,\n offset_id_offset: number,\n history: MyMessage[]\n }> {\n if(this.appPeersManager.isPeerRestricted(peerId)/* || true */) {\n return Promise.resolve({\n count: 0,\n offset_id_offset: 0,\n next_rate: undefined,\n history: []\n });\n }\n\n if(!query) query = '';\n if(!inputFilter) inputFilter = {_: 'inputMessagesFilterEmpty'};\n if(limit === undefined) limit = 20;\n if(!nextRate) nextRate = 0;\n if(!backLimit) backLimit = 0;\n\n minDate = minDate ? minDate / 1000 | 0 : 0;\n maxDate = maxDate ? maxDate / 1000 | 0 : 0;\n\n let foundMsgs: MyMessage[] = [];\n\n // this.log('search', maxId);\n\n if(backLimit) {\n limit += backLimit;\n }\n\n // const beta = inputFilter._ === 'inputMessagesFilterPinned' && !backLimit;\n const beta = false;\n\n let storage: {\n count?: number;\n history: SlicedArray;\n };\n\n // * костыль для limit 1, если нужно и получить сообщение, и узнать количество сообщений\n if(peerId && !backLimit && !maxId && !query && limit !== 1 && !threadId/* && inputFilter._ !== 'inputMessagesFilterPinned' */) {\n storage = beta ?\n this.getSearchStorage(peerId, inputFilter._) as any :\n this.getHistoryStorage(peerId);\n foundMsgs = this.filterMessagesByInputFilterFromStorage(inputFilter._, storage.history.slice, this.getHistoryMessagesStorage(peerId), limit);\n }\n\n if(foundMsgs.length) {\n if(foundMsgs.length < limit && (beta ? storage.count !== storage.history.length : true)) {\n maxId = foundMsgs[foundMsgs.length - 1].mid;\n limit = limit - foundMsgs.length;\n } else {\n return Promise.resolve({\n count: beta ? storage.count : 0,\n next_rate: 0,\n offset_id_offset: 0,\n history: foundMsgs\n });\n }\n } else if(beta && storage?.count) {\n return Promise.resolve({\n count: storage.count,\n next_rate: 0,\n offset_id_offset: 0,\n history: []\n });\n }\n\n const canCache = false && (['inputMessagesFilterChatPhotos', 'inputMessagesFilterPinned'] as MyInputMessagesFilter[]).includes(inputFilter._);\n const method = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n\n let apiPromise: Promise;\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\n apiPromise = method('messages.search', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n q: query || '',\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n limit,\n offset_id: getServerMessageId(maxId) || 0,\n add_offset: backLimit ? -backLimit : 0,\n max_id: 0,\n min_id: 0,\n hash: '',\n top_msg_id: getServerMessageId(threadId) || 0\n }, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n });\n } else {\n // var offsetDate = 0;\n let offsetPeerId: PeerId;\n let offsetId = 0;\n const offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\n\n if(offsetMessage && offsetMessage.date) {\n // offsetDate = offsetMessage.date + timeManager.getServerTimeOffset();\n offsetId = offsetMessage.id;\n offsetPeerId = this.getMessagePeer(offsetMessage);\n }\n\n apiPromise = method('messages.searchGlobal', {\n q: query,\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n offset_rate: nextRate,\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\n offset_id: offsetId,\n limit,\n folder_id: folderId\n }, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n });\n }\n\n return apiPromise.then((searchResult: any) => {\n this.appUsersManager.saveApiUsers(searchResult.users);\n this.appChatsManager.saveApiChats(searchResult.chats);\n this.saveMessages(searchResult.messages);\n\n /* if(beta && storage && (!maxId || storage.history[storage.history.length - 1] === maxId)) {\n const storage = this.getSearchStorage(peerId, inputFilter._);\n const add = (searchResult.messages.map((m: any) => m.mid) as number[]).filter((mid) => storage.history.indexOf(mid) === -1);\n storage.history.push(...add);\n storage.history.sort((a, b) => b - a);\n storage.count = searchResult.count;\n } */\n\n if(DEBUG) {\n this.log('getSearch result:', inputFilter, searchResult);\n }\n\n const foundCount: number = searchResult.count || (foundMsgs.length + searchResult.messages.length);\n\n searchResult.messages.forEach((message: MyMessage) => {\n const peerId = this.getMessagePeer(message);\n if(peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n if(chat.migrated_to) {\n this.migrateChecks(peerId, (chat.migrated_to as InputChannel.inputChannel).channel_id.toPeerId(true));\n }\n }\n\n foundMsgs.push(message);\n });\n\n return {\n count: foundCount,\n offset_id_offset: searchResult.offset_id_offset || 0,\n next_rate: searchResult.next_rate,\n history: foundMsgs\n };\n });\n }\n\n public subscribeRepliesThread(peerId: PeerId, mid: number) {\n const repliesKey = peerId + '_' + mid;\n for(const threadKey in this.threadsToReplies) {\n if(this.threadsToReplies[threadKey] === repliesKey) return;\n }\n\n this.getDiscussionMessage(peerId, mid);\n }\n\n public generateThreadServiceStartMessage(message: Message.message | Message.messageService) {\n const threadKey = message.peerId + '_' + message.mid;\n if(this.threadsServiceMessagesIdsStorage[threadKey]) return;\n\n const maxMessageId = getServerMessageId(Math.max(...this.getMidsByMessage(message)));\n const serviceStartMessage: Message.messageService = {\n _: 'messageService',\n pFlags: {\n is_single: true\n },\n id: this.appMessagesIdsManager.generateTempMessageId(maxMessageId),\n date: message.date,\n from_id: {_: 'peerUser', user_id: NULL_PEER_ID}/* message.from_id */,\n peer_id: message.peer_id,\n action: {\n _: 'messageActionDiscussionStarted'\n },\n reply_to: this.generateReplyHeader(message.peerId, message.id)\n };\n\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\n }\n\n public getThreadServiceMessageId(peerId: PeerId, threadId: number) {\n return this.threadsServiceMessagesIdsStorage[peerId + '_' + threadId];\n }\n\n public getDiscussionMessage(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApiSingle('messages.getDiscussionMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((result) => {\n this.appChatsManager.saveApiChats(result.chats);\n this.appUsersManager.saveApiUsers(result.users);\n this.saveMessages(result.messages);\n\n const message = this.getMessageWithReplies(result.messages[0] as Message.message);\n const threadKey = message.peerId + '_' + message.mid;\n\n this.generateThreadServiceStartMessage(message);\n\n const historyStorage = this.getHistoryStorage(message.peerId, message.mid);\n const newMaxId = result.max_id = generateMessageId(result.max_id) || 0;\n result.read_inbox_max_id = historyStorage.readMaxId = generateMessageId(result.read_inbox_max_id ?? message.mid);\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = generateMessageId(result.read_outbox_max_id) || 0;\n\n const first = historyStorage.history.first;\n if(historyStorage.maxId && historyStorage.maxId < newMaxId && first.isEnd(SliceEnd.Bottom)) {\n first.unsetEnd(SliceEnd.Bottom);\n }\n historyStorage.maxId = newMaxId;\n\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\n\n return message;\n });\n }\n\n private handleNewMessage(message: MyMessage) {\n this.rootScope.dispatchEvent('history_multiappend', message);\n }\n\n private handleNewDialogs = () => {\n let newMaxSeenId = 0;\n const updateMap: BroadcastEvents['dialogs_multiupdate']= new Map();\n\n const processDialog = (dialog: MTDialog.dialog | ForumTopic) => {\n const {peerId} = dialog;\n this.dialogsStorage.pushDialog({dialog});\n if(!this.appPeersManager.isChannel(peerId)) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\n }\n\n let cache = updateMap.get(peerId);\n if(!cache) {\n updateMap.set(peerId, cache = {});\n }\n\n if(dialog._ === 'forumTopic') {\n (cache.topics ??= new Map()).set(dialog.id, dialog);\n } else {\n cache.dialog = dialog;\n }\n };\n\n for(const [peerId, obj] of this.newDialogsToHandle) {\n const isDialogDefined = 'dialog' in obj;\n const {dialog, topics} = obj;\n\n if(isDialogDefined) {\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n } else if(this.dialogsStorage.getDialogOnly(peerId)) { // * can be already dropped\n processDialog(dialog);\n }\n }\n\n if(topics) {\n topics?.forEach((topic, id) => {\n if(!topic) {\n this.dialogsStorage.getForumTopicById(peerId, id);\n } else if(this.dialogsStorage.getForumTopic(peerId, id)) { // * can be already dropped\n processDialog(topic);\n }\n });\n }\n }\n\n // this.log('after order:', this.dialogsStorage[0].map((d) => d.peerId));\n\n if(newMaxSeenId !== 0) {\n this.incrementMaxSeenId(newMaxSeenId);\n }\n\n this.rootScope.dispatchEvent('dialogs_multiupdate', updateMap);\n this.newDialogsToHandle.clear();\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog | ForumTopic | ForumTopic['id']) {\n if(peerId !== undefined) {\n let obj = this.newDialogsToHandle.get(peerId);\n if(!obj) {\n this.newDialogsToHandle.set(peerId, obj = {});\n }\n\n const isObject = typeof(dialog) === 'object';\n if(!dialog || (isObject && dialog._ === 'dialog')) {\n obj.dialog = dialog as Dialog;\n } else {\n obj.topics ??= new Map();\n if(isObject) {\n obj.topics.set((dialog as ForumTopic).id, dialog as ForumTopic);\n } else {\n obj.topics.set(dialog as number, undefined);\n }\n }\n }\n\n return this.newDialogsHandlePromise ??= pause(0).then(() => {\n this.newDialogsHandlePromise = undefined;\n this.handleNewDialogs();\n });\n }\n\n public async deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\n let promise: Promise;\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\n\n const localMessageIds = mids.map((mid) => getServerMessageId(mid));\n\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\n if(!channel.pFlags.creator && !channel.admin_rights?.pFlags?.delete_messages) {\n mids = mids.filter((mid) => {\n const message = this.getMessageByPeer(peerId, mid);\n return !!message.pFlags.out;\n });\n\n if(!mids.length) {\n return;\n }\n }\n\n promise = this.apiManager.invokeApi('channels.deleteMessages', {\n channel: this.appChatsManager.getChannelInput(channelId),\n id: localMessageIds\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteChannelMessages',\n channel_id: channelId,\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n } else {\n promise = this.apiManager.invokeApi('messages.deleteMessages', {\n revoke,\n id: localMessageIds\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n }\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.deleteMessages(peerId, overflowMids, revoke));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public readHistory(peerId: PeerId, maxId = 0, threadId?: number, force = false) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n // console.trace('start read')\n this.log('readHistory:', peerId, maxId, threadId);\n const readMaxId = this.getReadMaxIdIfUnread(peerId, threadId);\n if(!readMaxId) {\n if(threadId && !force) {\n const forumTopic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(!getServerMessageId(forumTopic.read_inbox_max_id)) {\n force = true;\n }\n }\n\n if(!force) {\n const dialog = this.appChatsManager.isForum(peerId.toChatId()) && threadId ?\n this.dialogsStorage.getForumTopic(peerId, threadId) :\n this.getDialogOnly(peerId);\n if(dialog && this.isDialogUnread(dialog)) {\n force = true;\n }\n }\n\n if(!force) {\n this.log('readHistory: isn\\'t unread');\n return Promise.resolve();\n }\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(historyStorage.triedToReadMaxId >= maxId) {\n return Promise.resolve();\n }\n\n let apiPromise: Promise;\n if(threadId) {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('messages.readDiscussion', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(threadId),\n read_max_id: getServerMessageId(maxId)\n });\n // apiPromise = new Promise((resolve) => resolve());\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelDiscussionInbox',\n channel_id: peerId.toChatId(),\n top_msg_id: threadId,\n read_max_id: maxId\n });\n } else if(this.appPeersManager.isChannel(peerId)) {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('channels.readHistory', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n max_id: getServerMessageId(maxId)\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelInbox',\n max_id: maxId,\n channel_id: peerId.toChatId(),\n still_unread_count: undefined,\n pts: undefined\n });\n } else {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('messages.readHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n max_id: getServerMessageId(maxId)\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadHistoryInbox',\n max_id: maxId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n still_unread_count: undefined,\n pts: undefined,\n pts_count: undefined\n });\n }\n\n this.rootScope.dispatchEvent('notification_reset', this.appPeersManager.getPeerString(peerId));\n\n if(historyStorage.readPromise) {\n return historyStorage.readPromise;\n }\n\n historyStorage.triedToReadMaxId = maxId;\n\n apiPromise.finally(() => {\n delete historyStorage.readPromise;\n\n const {readMaxId} = historyStorage;\n this.log('readHistory: promise finally', maxId, readMaxId);\n\n if(readMaxId > maxId) {\n this.readHistory(peerId, readMaxId, threadId, true);\n }\n });\n\n return historyStorage.readPromise = apiPromise;\n }\n\n public readAllHistory(peerId: PeerId, threadId?: number, force = false) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(historyStorage.maxId) {\n this.readHistory(peerId, historyStorage.maxId, threadId, force); // lol\n }\n }\n\n private getUnreadMentionsKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? `_${threadId}` : '');\n }\n\n private fixDialogUnreadMentionsIfNoMessage(peerId: PeerId, threadId?: number) {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversationOrTopic(peerId);\n }\n }\n\n private modifyCachedMentions(peerId: PeerId, mid: number, add: boolean, threadId?: number) {\n const slicedArray = this.unreadMentions[this.getUnreadMentionsKey(peerId, threadId)];\n if(!slicedArray) return;\n\n if(add) {\n if(slicedArray.first.isEnd(SliceEnd.Top)) {\n slicedArray.insertSlice([mid]);\n }\n } else {\n slicedArray.delete(mid);\n }\n }\n\n private fixUnreadMentionsCountIfNeeded(peerId: PeerId, slicedArray: SlicedArray, threadId?: number) {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(!slicedArray.length && dialog?.unread_mentions_count) {\n this.reloadConversationOrTopic(peerId);\n }\n }\n\n public goToNextMention(peerId: PeerId, threadId?: number) {\n /* this.getUnreadMentions(peerId, 1, 2, 0).then((messages) => {\n console.log(messages);\n }); */\n\n const key = this.getUnreadMentionsKey(peerId, threadId);\n const promise = this.goToNextMentionPromises[key];\n if(promise) {\n return promise;\n }\n\n const slicedArray = this.unreadMentions[peerId] ??= new SlicedArray();\n const length = slicedArray.length;\n const isTopEnd = slicedArray.first.isEnd(SliceEnd.Top);\n if(!length && isTopEnd) {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray, threadId);\n return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId, threadId);\n }\n\n return this.goToNextMentionPromises[key] = loadNextPromise.then(() => {\n const last = slicedArray.last;\n const mid = last && last[last.length - 1];\n if(mid) {\n slicedArray.delete(mid);\n return mid;\n } else {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray, threadId);\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[key];\n });\n }\n\n private loadNextMentions(peerId: PeerId, threadId?: number) {\n const slicedArray = this.unreadMentions[peerId];\n const maxId = slicedArray.first[0] || 1;\n\n const backLimit = 50;\n const add_offset = -backLimit;\n const limit = backLimit;\n return this.getUnreadMentions(peerId, maxId, add_offset, limit, undefined, undefined, threadId)\n .then((messages) => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n private getUnreadMentions(\n peerId: PeerId,\n offsetId: number,\n add_offset: number,\n limit: number,\n maxId = 0,\n minId = 0,\n threadId?: number\n ) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getUnreadMentions',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: getServerMessageId(offsetId),\n add_offset,\n limit,\n max_id: getServerMessageId(maxId),\n min_id: getServerMessageId(minId),\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n },\n processResult: (messagesMessages) => {\n assumeType>(messagesMessages);\n this.appUsersManager.saveApiUsers(messagesMessages.users);\n this.appChatsManager.saveApiChats(messagesMessages.chats);\n this.saveMessages(messagesMessages.messages);\n\n return messagesMessages;\n }\n });\n }\n\n public readMessages(peerId: PeerId, msgIds: number[]) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n if(!msgIds.length) {\n return Promise.resolve();\n }\n\n msgIds = msgIds.map((mid) => getServerMessageId(mid));\n let promise: Promise, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n\n update = {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelId,\n messages: msgIds\n };\n\n promise = this.apiManager.invokeApi('channels.readMessageContents', {\n channel: this.appChatsManager.getChannelInput(channelId),\n id: msgIds\n });\n } else {\n update = {\n _: 'updateReadMessagesContents',\n messages: msgIds,\n pts: undefined,\n pts_count: undefined\n };\n\n promise = this.apiManager.invokeApi('messages.readMessageContents', {\n id: msgIds\n }).then((affectedMessages) => {\n (update as Update.updateReadMessagesContents).pts = affectedMessages.pts;\n (update as Update.updateReadMessagesContents).pts_count = affectedMessages.pts_count;\n this.apiUpdatesManager.processLocalUpdate(update);\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate(update);\n\n return promise;\n }\n\n public getHistoryStorage(peerId: PeerId, threadId?: number) {\n if(threadId) {\n // threadId = this.getLocalMessageId(threadId);\n return (this.threadsStorage[peerId] ??= {})[threadId] ??= {count: null, history: new SlicedArray()};\n }\n\n return this.historiesStorage[peerId] ??= {count: null, history: new SlicedArray()};\n }\n\n public getHistoryStorageTransferable(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const {\n count,\n history,\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n } = historyStorage;\n\n return {\n count,\n history: undefined as HistoryStorage,\n historySerialized: history.toJSON(),\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n };\n }\n\n private getNotifyPeerSettings(peerId: PeerId, threadId?: number) {\n const inputNotifyPeer = this.appPeersManager.getInputNotifyPeerById({peerId, ignorePeerId: true, threadId});\n return Promise.all([\n this.appNotificationsManager.getNotifyPeerTypeSettings(),\n this.appNotificationsManager.getNotifySettings(inputNotifyPeer)\n ]).then(([_, peerTypeNotifySettings]) => {\n return {\n muted: this.appNotificationsManager.isPeerLocalMuted({peerId, respectType: true, threadId}),\n peerTypeNotifySettings\n };\n });\n }\n\n private handleNotifications = () => {\n ctx.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = undefined;\n\n // var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n // const timeout = 1000;\n\n for(const key in this.notificationsToHandle) {\n const [peerId, threadId] = key.split('_');\n // if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n // continue;\n // }\n\n const notifyPeerToHandle = this.notificationsToHandle[key];\n this.getNotifyPeerSettings(peerId.toPeerId(), threadId ? +threadId : undefined)\n .then(({muted, peerTypeNotifySettings}) => {\n const topMessage = notifyPeerToHandle.topMessage;\n if((muted && !topMessage.pFlags.mentioned) || !topMessage.pFlags.unread) {\n return;\n }\n\n // setTimeout(() => {\n if(topMessage.pFlags.unread) {\n this.notifyAboutMessage(topMessage, {\n fwdCount: notifyPeerToHandle.fwdCount,\n peerTypeNotifySettings\n });\n }\n // }, timeout);\n });\n }\n\n this.notificationsToHandle = {};\n };\n\n public getUpdateAfterReloadKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n private handleNewUpdateAfterReload(peerId: PeerId, update: Update, threadId?: number) {\n const set = this.newUpdatesAfterReloadToHandle[this.getUpdateAfterReloadKey(peerId, threadId)] ??= new Set();\n if(set.has(update)) {\n this.log.error('here we go again', peerId);\n return;\n }\n\n (update as any).ignoreExisting = true;\n set.add(update);\n this.scheduleHandleNewDialogs(peerId, threadId);\n }\n\n private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n if(!pendingData) {\n return;\n }\n\n const mid = generateMessageId(update.id);\n this.pendingByMessageId[mid] = randomId;\n // const {storage} = pendingData;\n // const message = this.getMessageFromStorage(storage, mid);\n // if(message) { // if message somehow already exists\n // this.checkPendingMessage(message);\n // }\n };\n\n private onUpdateNewMessage = (update: Update.updateNewDiscussionMessage | Update.updateNewMessage | Update.updateNewChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const storage = this.getHistoryMessagesStorage(peerId);\n\n // * local update\n const isLocalThreadUpdate = update._ === 'updateNewDiscussionMessage';\n\n // * temporary save the message for info (peerId, reply mids...)\n this.saveMessages([message], {storage: this.createMessageStorage(peerId, 'history')});\n\n // * check if sent message is already in storage\n // const oldMessage = this.getMessageFromStorage(storage, message.mid);\n // if(\n // (message as Message.message).pFlags.is_outgoing &&\n // oldMessage &&\n // !(oldMessage as Message.message).pFlags.is_outgoing\n // ) {\n // this.checkPendingMessage(message);\n // return;\n // }\n\n const isForum = this.appPeersManager.isForum(peerId);\n const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if((!dialog || this.reloadConversationsPeers.has(peerId)) && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = this.appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n this.handleNewUpdateAfterReload(peerId, update);\n return;\n }\n\n // return;\n }\n\n if(threadId && !isLocalThreadUpdate) {\n const threadStorage = this.threadsStorage[peerId]?.[threadId];\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n if(this.appChatsManager.isForum(peerId.toChatId()) && !this.dialogsStorage.getForumTopic(peerId, threadId)) {\n // this.dialogsStorage.getForumTopicById(peerId, threadId);\n this.handleNewUpdateAfterReload(peerId, update, threadId);\n } else if(threadStorage) {\n this.onUpdateNewMessage(update);\n }\n }\n\n if(message._ === 'messageService') {\n const {action} = message;\n if(action._ === 'messageActionPaymentSent' && message.reply_to) {\n this.rootScope.dispatchEvent('payment_sent', {\n peerId: message.reply_to.reply_to_peer_id ?\n this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) :\n message.peerId,\n mid: message.reply_to_mid,\n receiptMessage: message\n });\n }\n\n if(action._ === 'messageActionTopicEdit' && !isLocalThreadUpdate) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(!topic) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n const oldTopic = copy(topic);\n\n if(action.title !== undefined) {\n topic.title = action.title;\n }\n\n if(action.closed !== undefined) {\n setBooleanFlag(topic.pFlags, 'closed', action.closed);\n }\n\n if(action.hidden !== undefined) {\n setBooleanFlag(topic.pFlags, 'hidden', action.hidden);\n }\n\n if(action.icon_emoji_id !== undefined) {\n topic.icon_emoji_id = action.icon_emoji_id;\n }\n\n this.scheduleHandleNewDialogs(peerId, topic);\n\n this.dialogsStorage.processTopicUpdate(topic, oldTopic);\n }\n }\n }\n\n /* if(update._ === 'updateNewChannelMessage') {\n const chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.pFlags && (chat.pFlags.left || chat.pFlags.kicked)) {\n return;\n }\n } */\n\n this.saveMessages([message], {storage});\n // this.log.warn(dT(), 'message unread', message.mid, message.pFlags.unread)\n\n /* if((message as Message.message).grouped_id) {\n this.log('updateNewMessage', message);\n } */\n\n this.checkPendingMessage(message);\n const historyStorage = this.getHistoryStorage(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if(!isLocalThreadUpdate) {\n this.updateMessageRepliesIfNeeded(message);\n }\n\n // * so message can exist if reloadConversation came back earlier with mid\n const ignoreExisting: boolean = (update as any).ignoreExisting;\n const isExisting = !!historyStorage.history.findSlice(message.mid);\n if(isExisting) {\n if(!ignoreExisting) {\n return false;\n }\n } else {\n // * catch situation with disconnect. if message's id is lower than we already have (in bottom end slice), will sort it\n const firstSlice = historyStorage.history.first;\n if(firstSlice.isEnd(SliceEnd.Bottom)) {\n let i = 0;\n for(const length = firstSlice.length; i < length; ++i) {\n if(message.mid > firstSlice[i]) {\n break;\n }\n }\n\n firstSlice.splice(i, 0, message.mid);\n } else {\n historyStorage.history.unshift(message.mid);\n }\n\n if(historyStorage.count !== null) {\n ++historyStorage.count;\n }\n }\n\n if(!historyStorage.maxId || message.mid > historyStorage.maxId) {\n historyStorage.maxId = message.mid;\n }\n\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n\n const fromId = message.fromId;\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\n this.appUsersManager.forceUserOnline(fromId, message.date);\n\n const action: SendMessageAction = {\n _: 'sendMessageCancelAction'\n };\n\n let update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping;\n if(peerId.isUser()) {\n update = {\n _: 'updateUserTyping',\n action,\n user_id: fromId\n };\n } else if(this.appPeersManager.isChannel(peerId)) {\n update = {\n _: 'updateChannelUserTyping',\n action,\n channel_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId),\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n };\n } else {\n update = {\n _: 'updateChatUserTyping',\n action,\n chat_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId)\n };\n }\n\n this.apiUpdatesManager.processLocalUpdate(update);\n }\n\n // commented to render the message if it's been sent faster than history_append came to main thread\n // if(!pendingMessage) {\n this.handleNewMessage(message);\n // }\n\n const isTopic = dialog?._ === 'forumTopic';\n if((isLocalThreadUpdate && !isTopic) || !dialog) {\n return;\n }\n\n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n\n {\n if(inboxUnread && message.mid > dialog.top_message) {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n ++dialog.unread_count;\n if(message.pFlags.mentioned) {\n ++dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, true, isTopic ? threadId : undefined);\n }\n\n releaseUnreadCount();\n }\n\n if(message.mid >= dialog.top_message) {\n this.setDialogTopMessage(message, dialog);\n }\n }\n\n if(((!isLocalThreadUpdate && !isForum) || isTopic) && inboxUnread) {\n const notifyPeer = threadKey || peerId;\n const notifyPeerToHandle = this.notificationsToHandle[notifyPeer] ??= {\n fwdCount: 0,\n fromId: NULL_PEER_ID\n };\n\n if(notifyPeerToHandle.fromId !== fromId) {\n notifyPeerToHandle.fromId = fromId;\n notifyPeerToHandle.fwdCount = 0;\n }\n\n if((message as Message.message).fwd_from) {\n ++notifyPeerToHandle.fwdCount;\n }\n\n notifyPeerToHandle.topMessage = message;\n\n this.notificationsHandlePromise ??= ctx.setTimeout(this.handleNotifications, 0);\n }\n };\n\n private onUpdateMessageReactions = (update: Update.updateMessageReactions) => {\n const {peer, msg_id, reactions} = update;\n const mid = generateMessageId(msg_id);\n const peerId = this.appPeersManager.getPeerId(peer);\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n\n if(message?._ !== 'message') {\n return;\n }\n\n const recentReactions = reactions?.recent_reactions;\n if(recentReactions?.length && message.pFlags.out) {\n const recentReaction = recentReactions[recentReactions.length - 1];\n const previousReactions = message.reactions;\n const previousRecentReactions = previousReactions?.recent_reactions;\n if(\n this.appPeersManager.getPeerId(recentReaction.peer_id) !== this.appPeersManager.peerId && (\n !previousRecentReactions ||\n previousRecentReactions.length <= recentReactions.length\n ) && (\n !previousRecentReactions ||\n !deepEqual(recentReaction, previousRecentReactions[previousRecentReactions.length - 1])\n )\n ) {\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\n if(/* muted || */!peerTypeNotifySettings.show_previews) return;\n this.notifyAboutMessage(message, {\n peerReaction: recentReaction,\n peerTypeNotifySettings\n });\n });\n }\n }\n\n const key = message.peerId + '_' + message.mid;\n this.pushBatchUpdate('messages_reactions', this.batchUpdateReactions, key, () => copy(message.reactions));\n\n message.reactions = reactions;\n\n if(!update.local) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\n // this.log('updateDialogUnreadMark', update);\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n if(!dialog) {\n this.scheduleHandleNewDialogs(peerId);\n } else {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(!update.pFlags.unread) {\n delete dialog.pFlags.unread_mark;\n } else {\n dialog.pFlags.unread_mark = true;\n }\n\n releaseUnreadCount();\n this.dialogsStorage.setDialogToState(dialog);\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, {dialog}]]));\n }\n };\n\n private onUpdateEditMessage = (update: Update.updateEditMessage | Update.updateEditChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const mid = generateMessageId(message.id);\n const storage = this.getHistoryMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n // console.trace(dT(), 'edit message', message)\n\n const oldMessage: Message = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage});\n const newMessage: Message = this.getMessageFromStorage(storage, mid);\n\n this.handleEditedMessage(oldMessage, newMessage, storage);\n\n const dialog = this.getDialogOnly(peerId);\n\n // if sender erased mention\n /* if(dialog.unread_mentions_count && (oldMessage as Message.message)?.pFlags?.mentioned && !message.pFlags.mentioned) {\n --dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, mid, false);\n } */\n\n const isTopMessage = dialog?.top_message === mid;\n if((message as Message.messageService).clear_history) {\n if(isTopMessage) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog});\n }\n } else {\n let dispatchEditEvent = true;\n // no sense in dispatching message_edit since only reactions have changed\n if(oldMessage?._ === 'message' && !deepEqual(oldMessage.reactions, (newMessage as Message.message).reactions)) {\n const newReactions = (newMessage as Message.message).reactions;\n (newMessage as Message.message).reactions = oldMessage.reactions;\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: this.appPeersManager.getOutputPeer(peerId),\n msg_id: message.id,\n reactions: newReactions\n });\n\n dispatchEditEvent = false;\n }\n\n dispatchEditEvent && this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n\n if(isTopMessage) {\n this.dialogsStorage.setDialogToState(dialog);\n }\n\n const map: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const getUpdateCache = () => {\n let cache = map.get(peerId);\n if(!cache) {\n map.set(peerId, cache = {});\n }\n\n return cache;\n };\n\n if((isTopMessage || (message as Message.message).grouped_id) && dialog) {\n getUpdateCache().dialog = dialog;\n }\n\n const threadKey = this.getThreadKey(message);\n if(threadKey) {\n const topicId = +threadKey.split('_')[1];\n const topic = this.dialogsStorage.getForumTopic(peerId, topicId);\n if(topic) {\n (getUpdateCache().topics ??= new Map()).set(topicId, topic);\n }\n }\n\n if(map.size) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', map);\n }\n }\n };\n\n private onUpdateReadHistory = (update: Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox\n | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox\n | Update.updateReadChannelInbox | Update.updateReadChannelOutbox) => {\n const channelId = (update as Update.updateReadChannelInbox).channel_id;\n const maxId = generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\n const threadId = generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\n const peerId = channelId ? channelId.toPeerId(true) : this.appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' ||\n update._ === 'updateReadChannelOutbox' ||\n update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const isForum = channelId ? this.appChatsManager.isForum(channelId) : false;\n const storage = this.getHistoryMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = threadId && isForum ?\n this.dialogsStorage.getForumTopic(peerId, threadId) :\n this.getDialogOnly(peerId);\n const stillUnreadCount = (update as Update.updateReadChannelInbox).still_unread_count;\n let newUnreadCount = 0;\n let newUnreadMentionsCount = 0;\n let foundAffected = false;\n\n // this.log.warn(dT(), 'read', peerId, isOut ? 'out' : 'in', maxId)\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(peerId.isUser() && isOut) {\n this.appUsersManager.forceUserOnline(peerId.toUserId());\n }\n\n if(threadId) {\n const repliesKey = this.threadsToReplies[peerId + '_' + threadId];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n\n const releaseUnreadCount = foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n const readMaxId = this.getReadMaxIdIfUnread(peerId, threadId);\n\n for(let i = 0, length = history.length; i < length; i++) {\n const mid = history[i];\n if(mid > maxId) {\n continue;\n }\n\n const message: MyMessage = storage.get(mid);\n\n if(message.pFlags.out !== isOut) {\n continue;\n }\n\n const messageThreadId = getMessageThreadId(message, isForum);\n if(threadId && messageThreadId !== threadId) {\n continue;\n }\n\n const isUnread = message.pFlags.unread || (readMaxId && readMaxId < mid);\n\n if(!isUnread) {\n break;\n }\n\n // this.log.warn('read', messageId, isUnread, message)\n delete message.pFlags.unread;\n foundAffected ||= true;\n\n if(!message.pFlags.out && foundDialog) {\n if(stillUnreadCount === undefined) {\n newUnreadCount = --foundDialog.unread_count;\n }\n\n if(message.pFlags.mentioned) {\n newUnreadMentionsCount = --foundDialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, false);\n }\n }\n\n this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\n }\n\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(foundDialog) {\n if(isOut) foundDialog.read_outbox_max_id = maxId;\n else foundDialog.read_inbox_max_id = maxId;\n\n if(!isOut) {\n let setCount: number;\n if(stillUnreadCount !== undefined) {\n setCount = stillUnreadCount;\n } else if(\n newUnreadCount < 0 ||\n maxId >= foundDialog.top_message ||\n !readMaxId\n ) {\n setCount = 0;\n } else if(newUnreadCount && foundDialog.top_message > maxId) {\n setCount = newUnreadCount;\n }\n\n if(setCount !== undefined) {\n foundDialog.unread_count = setCount;\n }\n\n if(newUnreadMentionsCount < 0 || !foundDialog.unread_count) {\n foundDialog.unread_mentions_count = 0;\n }\n }\n\n releaseUnreadCount?.();\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog: foundDialog});\n this.dialogsStorage.setDialogToState(foundDialog);\n\n if(!foundAffected && stillUnreadCount === undefined && !isOut && foundDialog.unread_count) {\n if(foundDialog._ === 'forumTopic') {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n this.reloadConversation(peerId);\n }\n }\n }\n\n if(foundAffected) {\n this.rootScope.dispatchEvent('messages_read');\n }\n\n if(!threadId && channelId) {\n const threadKeyPart = peerId + '_';\n for(const threadKey in this.threadsToReplies) {\n if(threadKey.indexOf(threadKeyPart) === 0) {\n const [peerId, mid] = this.threadsToReplies[threadKey].split('_');\n this.rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid) as Message.message);\n }\n }\n }\n };\n\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\n const topMsgId = (update as Update.updateChannelReadMessagesContents).top_msg_id;\n const threadId = topMsgId ? generateMessageId(topMsgId) : undefined;\n const mids = (update as Update.updateReadMessagesContents).messages.map((id) => generateMessageId(id));\n const peerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(mids);\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n if(message) {\n if(message.pFlags.media_unread) {\n delete message.pFlags.media_unread;\n this.setDialogToStateIfMessageIsTop(message);\n\n if(!message.pFlags.out && message.pFlags.mentioned) {\n this.modifyCachedMentions(peerId, mid, false, threadId);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId, threadId);\n }\n }\n\n this.rootScope.dispatchEvent('messages_media_read', {peerId, mids});\n };\n\n private onUpdateChannelAvailableMessages = (update: Update.updateChannelAvailableMessages) => {\n const peerId = update.channel_id.toPeerId(true);\n const history = this.getHistoryStorage(peerId).history.slice;\n const availableMinId = generateMessageId(update.available_min_id);\n const messages = history.filter((mid) => mid <= availableMinId);\n\n (update as any as Update.updateDeleteChannelMessages).messages = messages;\n this.onUpdateDeleteMessages(update as any as Update.updateDeleteChannelMessages);\n };\n\n private onUpdateDeleteMessages = (update: Update.updateDeleteMessages | Update.updateDeleteChannelMessages) => {\n const channelId = (update as Update.updateDeleteChannelMessages).channel_id;\n // const messages = (update as any as Update.updateDeleteChannelMessages).messages;\n const messages = (update as any as Update.updateDeleteChannelMessages).messages.map((id) => generateMessageId(id));\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(messages);\n\n if(!peerId) {\n return;\n }\n\n this.apiManager.clearCache('messages.getSearchCounters', (params) => {\n return this.appPeersManager.getPeerId(params.peer) === peerId;\n });\n\n const threadKeys: Set = new Set(), topics: Map = new Map();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(!threadKey) {\n continue;\n }\n\n const threadId = +threadKey.split('_')[1];\n if(this.threadsStorage[peerId]?.[threadId]) {\n threadKeys.add(threadKey);\n\n if(!topics.has(threadId)) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(topic) {\n topics.set(threadId, topic);\n }\n }\n }\n }\n\n const historyUpdated = this.handleDeletedMessages(\n peerId,\n this.getHistoryMessagesStorage(peerId),\n messages\n );\n\n const threadsStorages = Array.from(threadKeys).map((threadKey) => {\n const [peerId, mid] = threadKey.split('_');\n return this.getHistoryStorage(peerId.toPeerId(), +mid);\n });\n\n const historyStorages = [\n this.getHistoryStorage(peerId),\n ...threadsStorages\n ];\n historyStorages.forEach((historyStorage) => {\n for(const mid of historyUpdated.msgs) {\n historyStorage.history.delete(mid);\n }\n\n if(historyUpdated.count && historyStorage.count) {\n historyStorage.count = Math.max(0, historyStorage.count - historyUpdated.count);\n }\n });\n\n this.rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\n\n const dialogs: (MTDialog.dialog | ForumTopic)[] = [\n ...topics.values()\n ];\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialogs.unshift(dialog);\n }\n\n dialogs.forEach((dialog) => {\n const isTopic = dialog._ === 'forumTopic';\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(historyUpdated.unread) {\n dialog.unread_count = Math.max(0, dialog.unread_count - historyUpdated.unread);\n }\n\n if(historyUpdated.unreadMentions) {\n dialog.unread_mentions_count = !dialog.unread_count ? 0 : Math.max(0, dialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(affected) {\n releaseUnreadCount();\n\n if(!isTopic) {\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog});\n }\n }\n\n if(historyUpdated.msgs.has(dialog.top_message)) {\n const historyStorage = this.getHistoryStorage(dialog.peerId, isTopic ? dialog.id : undefined);\n const slice = historyStorage.history.first;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n const mid = slice[0];\n const message = this.getMessageByPeer(peerId, mid);\n this.setDialogTopMessage(message, dialog);\n } else if(isTopic) {\n this.dialogsStorage.getForumTopicById(peerId, dialog.id);\n } else {\n this.reloadConversation(peerId);\n }\n }\n });\n };\n\n private onUpdateChannel = (update: Update.updateChannel) => {\n const channelId = update.channel_id;\n const peerId = channelId.toPeerId(true);\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\n\n const needDialog = this.appChatsManager.isInChat(channelId);\n\n const canViewHistory = !!getPeerActiveUsernames(channel)[0] || !channel.pFlags.left;\n const hasHistory = this.historiesStorage[peerId] !== undefined;\n\n if(canViewHistory !== hasHistory) {\n delete this.historiesStorage[peerId];\n this.rootScope.dispatchEvent('history_forbidden', peerId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!!dialog !== needDialog) {\n if(needDialog) {\n this.reloadConversation(peerId);\n } else {\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n }\n\n this.rootScope.dispatchEvent('channel_update', channelId);\n };\n\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\n const peerId = update.channel_id.toPeerId(true);\n\n // if(this.appPeersManager.isForum(peerId)) {\n // const cache = this.dialogsStorage.getForumTopicsCache(peerId);\n // if(cache.topics.size) {\n\n // }\n // }\n\n this.flushStoragesByPeerId(peerId);\n Promise.all([\n this.reloadConversation(peerId)\n ]).then(() => {\n this.rootScope.dispatchEvent('history_reload', peerId);\n });\n };\n\n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\n const views = update.views;\n const peerId = update.peerId ?? update.channel_id.toPeerId(true);\n const mid = generateMessageId(update.id);\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(message?.views !== undefined && message.views < views) {\n message.views = views;\n this.pushBatchUpdate('messages_views', this.batchUpdateViews, message.peerId + '_' + message.mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\n // this.log('updateServiceNotification', update);\n if(update.pFlags?.popup) {\n this.rootScope.dispatchEvent('service_notification', update);\n return;\n }\n\n const fromId = SERVICE_PEER_ID;\n const peerId = fromId;\n const messageId = this.generateTempMessageId(peerId);\n const message: Message.message = {\n _: 'message',\n id: messageId,\n from_id: this.appPeersManager.getOutputPeer(fromId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n pFlags: {unread: true},\n date: (update.inbox_date || tsNow(true)) + this.timeManager.getServerTimeOffset(),\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if(!this.appUsersManager.hasUser(fromId)) {\n this.appUsersManager.saveApiUsers([{\n _: 'user',\n id: fromId,\n pFlags: {verified: true},\n access_hash: '0',\n first_name: 'Telegram',\n phone: '42777'\n }]);\n }\n this.saveMessages([message], {isOutgoing: true});\n\n if(update.inbox_date) {\n this.pendingTopMsgs[peerId] = messageId;\n this.onUpdateNewMessage({\n _: 'updateNewMessage',\n message,\n pts: undefined,\n pts_count: undefined\n });\n }\n };\n\n private onUpdatePinnedMessages = (update: Update.updatePinnedMessages | Update.updatePinnedChannelMessages) => {\n const channelId = update._ === 'updatePinnedChannelMessages' ? update.channel_id : undefined;\n const peerId = channelId ? channelId.toPeerId(true) : this.appPeersManager.getPeerId((update as Update.updatePinnedMessages).peer);\n\n /* const storage = this.getSearchStorage(peerId, 'inputMessagesFilterPinned');\n if(storage.count !== storage.history.length) {\n if(storage.count !== undefined) {\n delete this.searchesStorage[peerId]['inputMessagesFilterPinned'];\n }\n\n rootScope.broadcast('peer_pinned_messages', peerId);\n break;\n } */\n\n const messages = update.messages.map((id) => generateMessageId(id));\n\n const storage = this.getHistoryMessagesStorage(peerId);\n const missingMessages = messages.filter((mid) => !storage.has(mid));\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map((mid) => this.reloadMessages(peerId, mid))) : Promise.resolve();\n getMissingPromise.finally(() => {\n const werePinned = update.pFlags?.pinned;\n if(werePinned) {\n for(const mid of messages) {\n // storage.history.push(mid);\n const message = storage.get(mid) as Message.message;\n message.pFlags.pinned = true;\n }\n\n /* if(this.pinnedMessages[peerId]?.maxId) {\n const maxMid = Math.max(...messages);\n this.pinnedMessages\n } */\n\n // storage.history.sort((a, b) => b - a);\n } else {\n for(const mid of messages) {\n // storage.history.findAndSplice((_mid) => _mid === mid);\n const message = storage.get(mid) as Message.message;\n delete message.pFlags.pinned;\n }\n }\n\n /* const info = this.pinnedMessages[peerId];\n if(info) {\n info.count += messages.length * (werePinned ? 1 : -1);\n } */\n\n delete this.pinnedMessages[this.getPinnedMessagesKey(peerId)];\n this.appStateManager.getState().then((state) => {\n delete state.hiddenPinnedMessages[peerId];\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, mids: messages, pinned: werePinned});\n });\n });\n };\n\n private onUpdateNotifySettings = (update: Update.updateNotifySettings) => {\n const {peer, notify_settings} = update;\n const isTopic = peer._ === 'notifyForumTopic';\n const isPeerType = peer._ === 'notifyPeer' || isTopic;\n if(!isPeerType) {\n return;\n }\n\n const peerId = this.appPeersManager.getPeerId(peer.peer);\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, isTopic ? generateMessageId(peer.top_msg_id) : undefined);\n if(!dialog) {\n return;\n }\n\n dialog.notify_settings = notify_settings;\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\n };\n\n private onUpdateNewScheduledMessage = (update: Update.updateNewScheduledMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(!storage) {\n return;\n }\n\n const mid = generateMessageId(message.id);\n\n const oldMessage = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage, isScheduled: true});\n const newMessage = this.getMessageFromStorage(storage, mid);\n\n if(oldMessage) {\n this.handleEditedMessage(oldMessage, newMessage, storage);\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId, mid: message.mid, message});\n } else {\n const pendingMessage = this.checkPendingMessage(message);\n if(!pendingMessage) {\n this.rootScope.dispatchEvent('scheduled_new', message as Message.message);\n }\n }\n };\n\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mids = update.messages.map((id) => generateMessageId(id));\n this.handleDeletedMessages(peerId, storage, mids);\n\n this.rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\n }\n };\n\n private onUpdateMessageExtendedMedia = (update: Update.updateMessageExtendedMedia) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n const mid = generateMessageId(update.msg_id);\n const storage = this.getHistoryMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n const messageMedia = message.media as MessageMedia.messageMediaInvoice;\n if(messageMedia.extended_media?._ === 'messageExtendedMedia') {\n return;\n }\n\n messageMedia.extended_media = update.extended_media;\n this.onUpdateEditMessage({\n _: 'updateEditMessage',\n message,\n pts: 0,\n pts_count: 0\n });\n };\n\n public setDialogToStateIfMessageIsTop(message: MyMessage) {\n if(this.isMessageIsTopMessage(message)) {\n this.dialogsStorage.setDialogToState(this.getDialogOnly(message.peerId));\n }\n }\n\n public isMessageIsTopMessage(message: MyMessage) {\n const dialog = this.getDialogOnly(message.peerId);\n return dialog && dialog.top_message === message.mid;\n }\n\n private updateMessageRepliesIfNeeded(threadMessage: MyMessage) {\n try { // * на всякий случай, скорее всего это не понадобится\n const threadKey = this.getThreadKey(threadMessage);\n if(threadKey) {\n const repliesKey = this.threadsToReplies[threadKey];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n } catch(err) {\n this.log.error('incrementMessageReplies err', err, threadMessage);\n }\n }\n\n private getThreadKey(threadMessage: MyMessage) {\n let threadKey = '';\n if(threadMessage?.peerId?.isAnyChat()) {\n const threadId = getMessageThreadId(threadMessage, this.appChatsManager.isForum(threadMessage.peerId.toChatId()));\n if(threadId) {\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.reloadMessages(peerId, mid, true).then(() => {\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(!message) {\n return;\n }\n\n if(broadcastEventName) {\n this.rootScope.dispatchEvent(broadcastEventName, message);\n }\n\n return message;\n });\n\n return promise;\n }\n\n private checkPendingMessage(message: MyMessage) {\n const randomId = this.pendingByMessageId[message.mid];\n let pendingMessage: ReturnType;\n if(randomId) {\n const pendingData = this.pendingByRandomId[randomId];\n if(pendingMessage = this.finalizePendingMessage(randomId, message)) {\n this.rootScope.dispatchEvent('history_update', {\n storageKey: pendingData.storage.key,\n message,\n sequential: pendingData.sequential\n });\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(options: {peerId: PeerId, muteUntil: number, threadId?: number}) {\n if(!(options = this.appNotificationsManager.validatePeerSettings(options))) {\n return;\n }\n\n const {peerId, muteUntil, threadId} = options;\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n settings.mute_until = muteUntil;\n\n const peer = this.appPeersManager.getInputPeerById(peerId);\n return this.appNotificationsManager.updateNotifySettings(threadId ? {\n _: 'inputNotifyForumTopic',\n peer,\n top_msg_id: getServerMessageId(threadId)\n } : {\n _: 'inputNotifyPeer',\n peer\n }, settings);\n }\n\n public togglePeerMute({peerId, mute, threadId}: {peerId: PeerId, mute?: boolean, threadId?: number}) {\n if(mute === undefined) {\n mute = !this.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false, threadId});\n }\n\n return this.mutePeer({peerId, muteUntil: mute ? MUTE_UNTIL : 0, threadId});\n }\n\n private findPeerIdByMids(mids: number[]) {\n for(let length = mids.length, i = length - 1; i >= 0; --i) {\n const mid = mids[i];\n const message = this.getMessageById(mid);\n if(message) {\n return message.peerId;\n }\n }\n }\n\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return false;\n }\n\n if(peerId.isAnyChat()) {\n const chatId = peerId.toChatId();\n if(threadId) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(topic?.pFlags?.closed && !this.appChatsManager.hasRights(chatId, 'manage_topics')) {\n return false;\n }\n }\n\n // const isChannel = appPeersManager.isChannel(peerId);\n const chat = this.appChatsManager.getChat(chatId) as Chat.chat;\n const hasRights = /* isChannel && */this.appChatsManager.hasRights(chatId, action, undefined, !!threadId);\n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\n } else {\n return this.appUsersManager.canSendToUser(peerId);\n }\n }\n\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\n const pendingData = this.pendingByRandomId[randomId];\n if(!pendingData) {\n return;\n }\n\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [\n this.getHistoryStorage(peerId),\n threadId ? this.getHistoryStorage(peerId, threadId) : undefined\n ]\n .filter(Boolean)\n .forEach((storage) => {\n storage.history.delete(tempId);\n });\n\n // this.log('pending', randomID, historyStorage.pending)\n\n const tempMessage: MyMessage = this.getMessageFromStorage(storage, tempId);\n if(tempMessage) {\n delete finalMessage.pFlags.is_outgoing;\n delete finalMessage.pending;\n delete finalMessage.error;\n delete finalMessage.random_id;\n delete finalMessage.send;\n }\n\n this.rootScope.dispatchEvent('messages_pending');\n\n delete this.pendingByRandomId[randomId];\n\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\n\n return tempMessage;\n }\n\n public finalizePendingMessageCallbacks(storage: MessagesStorage, tempId: number, message: MyMessage) {\n const callbacks = this.tempFinalizeCallbacks[tempId];\n // this.log.warn(callbacks, tempId);\n if(callbacks !== undefined) {\n for(const name in callbacks) {\n const {deferred, callback} = callbacks[name];\n // this.log(`finalizePendingMessageCallbacks: will invoke ${name} callback`);\n callback(message).then(deferred.resolve, deferred.reject);\n }\n\n delete this.tempFinalizeCallbacks[tempId];\n }\n\n // set cached url to media\n if((message as Message.message).media) {\n assumeType(message);\n const {photo: newPhoto, document: newDoc} = message.media as any;\n if(newPhoto) {\n const photo = this.appPhotosManager.getPhoto('' + tempId);\n if(/* photo._ !== 'photoEmpty' */photo) {\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\n const cacheContext = this.thumbsStorage.getCacheContext(newPhoto, newPhotoSize.type);\n const oldCacheContext = this.thumbsStorage.getCacheContext(photo, THUMB_TYPE_FULL);\n Object.assign(cacheContext, oldCacheContext);\n\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\n\n const downloadOptions = getPhotoDownloadOptions(newPhoto, photoSize);\n const fileName = getFileNameByLocation(downloadOptions.location);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n } else if(newDoc) {\n const oldDoc = this.appDocsManager.getDoc('' + tempId);\n if(oldDoc) {\n const oldCacheContext = this.thumbsStorage.getCacheContext(oldDoc);\n if(\n /* doc._ !== 'documentEmpty' && */\n oldDoc.type &&\n oldDoc.type !== 'sticker' &&\n oldDoc.mime_type !== 'image/gif' &&\n oldCacheContext.url\n ) {\n const cacheContext = this.thumbsStorage.getCacheContext(newDoc);\n Object.assign(cacheContext, oldCacheContext);\n\n const fileName = getDocumentInputFileName(newDoc);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n }\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\n delete this.appPollsManager.polls[tempId];\n delete this.appPollsManager.results[tempId];\n }\n }\n\n const tempMessage = this.getMessageFromStorage(storage, tempId);\n storage.delete(tempId);\n\n if(!(tempMessage as Message.message).reply_markup && (message as Message.message).reply_markup) {\n setTimeout(() => { // TODO: refactor it to normal buttons adding\n if(!this.getMessageFromStorage(storage, message.mid)) {\n return;\n }\n\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId: message.peerId, mid: message.mid, message});\n }, 0);\n }\n\n this.handleReleasingMessage(tempMessage, storage);\n\n this.rootScope.dispatchEvent('message_sent', {storageKey: storage.key, tempId, tempMessage, mid: message.mid, message});\n }\n\n public incrementMaxSeenId(maxId: number) {\n if(!maxId || !(!this.maxSeenId || maxId > this.maxSeenId)) {\n return false;\n }\n\n this.maxSeenId = maxId;\n this.appStateManager.pushToState('maxSeenMsgId', maxId);\n\n this.apiManager.invokeApi('messages.receivedMessages', {\n max_id: getServerMessageId(maxId)\n });\n }\n\n public async getMessageReactionsListAndReadParticipants(\n message: Message.message,\n limit?: number,\n reaction?: Reaction,\n offset?: string,\n skipReadParticipants?: boolean,\n skipReactionsList?: boolean\n ) {\n const emptyMessageReactionsList = {\n reactions: [] as MessagePeerReaction[],\n count: 0,\n next_offset: undefined as string\n };\n\n const canViewMessageReadParticipants = await this.canViewMessageReadParticipants(message);\n if(canViewMessageReadParticipants && limit === undefined) {\n limit = 100;\n } else if(limit === undefined) {\n limit = 50;\n }\n\n return Promise.all([\n canViewMessageReadParticipants && !reaction && !skipReadParticipants ? this.getMessageReadParticipants(message.peerId, message.mid).catch(() => [] as UserId[]) : [] as UserId[],\n\n message.reactions?.recent_reactions?.length && !skipReactionsList ? this.appReactionsManager.getMessageReactionsList(message.peerId, message.mid, limit, reaction, offset).catch((err) => emptyMessageReactionsList) : emptyMessageReactionsList\n ]).then(([userIds, messageReactionsList]) => {\n const readParticipantsPeerIds = userIds.map((userId) => userId.toPeerId());\n\n const filteredReadParticipants = readParticipantsPeerIds.slice();\n forEachReverse(filteredReadParticipants, (peerId, idx, arr) => {\n if(messageReactionsList.reactions.some((reaction) => this.appPeersManager.getPeerId(reaction.peer_id) === peerId)) {\n arr.splice(idx, 1);\n }\n });\n\n let combined: {peerId: PeerId, reaction?: Reaction}[] = messageReactionsList.reactions.map((reaction) => ({peerId: this.appPeersManager.getPeerId(reaction.peer_id), reaction: reaction.reaction}));\n combined = combined.concat(filteredReadParticipants.map((readPeerId) => ({peerId: readPeerId})));\n\n return {\n reactions: messageReactionsList.reactions,\n reactionsCount: messageReactionsList.count,\n readParticipants: readParticipantsPeerIds,\n combined: combined,\n nextOffset: messageReactionsList.next_offset\n };\n });\n }\n\n public getMessageReadParticipants(peerId: PeerId, mid: number): Promise {\n return this.apiManager.invokeApiSingle('messages.getMessageReadParticipants', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((userIds) => { // ! convert long to number\n return userIds.map((userId) => userId.toUserId());\n });\n }\n\n public async canViewMessageReadParticipants(message: Message) {\n if(\n message?._ !== 'message' ||\n message.pFlags.is_outgoing ||\n !message.pFlags.out ||\n !this.appPeersManager.isAnyGroup(message.peerId)\n ) {\n return false;\n }\n\n const chat = this.appChatsManager.getChat(message.peerId.toChatId()) as Chat.chat | Chat.channel;\n const appConfig = await this.apiManager.getAppConfig();\n return chat.participants_count <= appConfig.chat_read_mark_size_threshold &&\n (tsNow(true) - message.date) < appConfig.chat_read_mark_expire_period;\n }\n\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\n if(!mids.length) {\n return;\n }\n\n return this.apiManager.invokeApiSingle('messages.getMessagesViews', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n increment: true\n }).then((views) => {\n const updates: Update[] = new Array(mids.length);\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: NULL_PEER_ID,\n peerId,\n id: mids[i],\n views: views.views[i].views\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates,\n chats: views.chats,\n users: views.users\n });\n });\n }\n\n private notifyAboutMessage(message: MyMessage, options: Partial<{\n fwdCount: number,\n peerReaction: MessagePeerReaction,\n peerTypeNotifySettings: PeerNotifySettings\n }> = {}) {\n const peerId = this.getMessagePeer(message);\n\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return;\n }\n\n const tabs = appTabsManager.getTabs();\n let tab = tabs.find((tab) => {\n const {chatPeerIds} = tab.state;\n return chatPeerIds[chatPeerIds.length - 1] === peerId;\n });\n\n if(!tab && tabs.length) {\n tabs.sort((a, b) => a.state.idleStartTime - b.state.idleStartTime);\n tab = !tabs[0].state.idleStartTime ? tabs[0] : tabs[tabs.length - 1];\n }\n\n const port = MTProtoMessagePort.getInstance();\n port.invokeVoid('notificationBuild', {\n message,\n ...options\n }, tab?.source);\n }\n\n public getScheduledMessagesStorage(peerId: PeerId) {\n return this.scheduledMessagesStorage[peerId] ??= this.createMessageStorage(peerId, 'scheduled');\n }\n\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\n }\n\n public getScheduledMessages(peerId: PeerId) {\n if(!this.canSendToPeer(peerId)) return;\n\n const storage = this.getScheduledMessagesStorage(peerId);\n if(storage.size) {\n return [...storage.keys()];\n }\n\n return this.apiManager.invokeApiSingle('messages.getScheduledHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n hash: ''\n }).then((historyResult) => {\n if(historyResult._ !== 'messages.messagesNotModified') {\n this.appUsersManager.saveApiUsers(historyResult.users);\n this.appChatsManager.saveApiChats(historyResult.chats);\n\n const storage = this.getScheduledMessagesStorage(peerId);\n this.saveMessages(historyResult.messages, {storage, isScheduled: true});\n return [...storage.keys()];\n }\n\n return [];\n });\n }\n\n public sendScheduledMessages(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApi('messages.sendScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApi('messages.deleteScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getMessageWithReplies(message: Message.message) {\n return this.filterMessages(message, (message) => !!(message as Message.message).replies)[0] as any;\n }\n\n public getMessageWithCommentReplies(message: Message.message) {\n if(message.peerId !== REPLIES_PEER_ID) {\n message = this.getMessageWithReplies(message);\n const replies = message?.replies;\n if(!(replies && replies.pFlags.comments && replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)) {\n return;\n }\n }\n\n return message;\n }\n\n public isFetchIntervalNeeded(peerId: PeerId) {\n return peerId.isAnyChat() && (\n !this.appChatsManager.isInChat(peerId.toChatId()) ||\n this.appChatsManager.isForum(peerId.toChatId())\n );\n }\n\n public async getNewHistory(peerId: PeerId, threadId?: number) {\n if(!this.isFetchIntervalNeeded(peerId)) {\n return;\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(!slice.isEnd(SliceEnd.Bottom)) {\n return;\n }\n\n delete historyStorage.maxId;\n slice.unsetEnd(SliceEnd.Bottom);\n\n // if there is no id - then request by first id because cannot request by id 0 with backLimit\n const historyResult = await this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\n this.handleNewMessage(this.getMessageByPeer(peerId, historyResult.history[i]));\n }\n\n return {isBottomEnd: historyStorage.history.slice.isEnd(SliceEnd.Bottom)};\n }\n\n /**\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\n */\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: false): Promise | HistoryResult;\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: true): HistoryResult;\n public getHistory(peerId: PeerId, maxId: number = 0, limit?: number, backLimit?: number, threadId?: number/* , onlyCache?: boolean */): Promise | HistoryResult {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n const first = historyStorage.history.first;\n first.setEnd(SliceEnd.Both);\n\n const slice = first.slice(0, 0);\n slice.setEnd(SliceEnd.Both);\n\n return {\n count: 0,\n history: Array.from(slice),\n isEnd: slice.getEnds(),\n offsetIdOffset: 0\n };\n }\n\n let offset = 0;\n /*\n let offsetFound = true;\n\n if(maxId) {\n offsetFound = false;\n for(; offset < historyStorage.history.length; offset++) {\n if(maxId > historyStorage.history.slice[offset]) {\n offsetFound = true;\n break;\n }\n }\n }\n\n if(offsetFound && (\n historyStorage.count !== null && historyStorage.history.length === historyStorage.count ||\n historyStorage.history.length >= offset + limit\n )) {\n if(backLimit) {\n backLimit = Math.min(offset, backLimit);\n offset = Math.max(0, offset - backLimit);\n limit += backLimit;\n } else {\n limit = limit;\n }\n\n const history = historyStorage.history.slice.slice(offset, offset + limit);\n return {\n count: historyStorage.count,\n history: history,\n offsetIdOffset: offset\n };\n }\n\n if(offsetFound) {\n offset = 0;\n } */\n\n if(backLimit) {\n offset = -backLimit;\n limit += backLimit;\n\n /* return this.requestHistory(reqPeerId, maxId, limit, offset, undefined, threadId).then((historyResult) => {\n historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;\n\n const history = (historyResult.messages as MyMessage[]).map((message) => message.mid);\n return {\n count: historyStorage.count,\n history,\n offsetIdOffset: (historyResult as MessagesMessages.messagesMessagesSlice).offset_id_offset || 0\n };\n }); */\n }\n\n const haveSlice = historyStorage.history.sliceMe(maxId, offset, limit);\n if(haveSlice && (haveSlice.slice.length === limit || (haveSlice.fulfilled & SliceEnd.Both) === SliceEnd.Both)) {\n return {\n count: historyStorage.count,\n history: Array.from(haveSlice.slice),\n isEnd: haveSlice.slice.getEnds(),\n offsetIdOffset: haveSlice.offsetIdOffset\n };\n }\n\n // if(onlyCache) {\n // return;\n // }\n\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\n const f = slice?.slice || historyStorage.history.constructSlice();\n return {\n count: historyStorage.count,\n history: Array.from(f),\n isEnd: f.getEnds(),\n offsetIdOffset: slice?.offsetIdOffset || historyStorage.count\n };\n });\n }\n\n public isHistoryResultEnd(historyResult: Exclude, limit: number, add_offset: number) {\n const {offset_id_offset, messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n\n const count = (historyResult as MessagesMessages.messagesMessagesSlice).count || messages.length;\n const offsetIdOffset = offset_id_offset || 0;\n\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\n\n const isTopEnd = offsetIdOffset >= (count - topWasMeantToLoad) || count < topWasMeantToLoad;\n const isBottomEnd = !offsetIdOffset || (add_offset < 0 && (offsetIdOffset + add_offset) <= 0);\n\n return {count, offsetIdOffset, isTopEnd, isBottomEnd};\n }\n\n public mergeHistoryResult(\n slicedArray: SlicedArray,\n historyResult: Parameters[0],\n offset_id: number,\n limit: number,\n add_offset: number\n ) {\n const {messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n const isEnd = this.isHistoryResultEnd(historyResult, limit, add_offset);\n const {count, offsetIdOffset, isTopEnd, isBottomEnd} = isEnd;\n const mids = messages.map((message) => {\n return (message as MyMessage).mid;\n });\n\n // * add bound manually.\n // * offset_id will be inclusive only if there is 'add_offset' <= -1 (-1 - will only include the 'offset_id')\n // * check that offset_id is not 0\n if(offset_id && getServerMessageId(offset_id) && !mids.includes(offset_id) && offsetIdOffset < count) {\n let i = 0;\n for(const length = mids.length; i < length; ++i) {\n if(offset_id > mids[i]) {\n break;\n }\n }\n\n mids.splice(i, 0, offset_id);\n }\n\n const slice = slicedArray.insertSlice(mids) || slicedArray.slice;\n if(isTopEnd) {\n slice.setEnd(SliceEnd.Top);\n }\n\n if(isBottomEnd) {\n slice.setEnd(SliceEnd.Bottom);\n }\n\n return {slice, mids, messages, ...isEnd};\n }\n\n public fillHistoryStorage(peerId: PeerId, offset_id: number, limit: number, add_offset: number, historyStorage: HistoryStorage, threadId?: number): Promise {\n const wasMaxId = historyStorage.maxId;\n return this.requestHistory(peerId, offset_id, limit, add_offset, undefined, threadId).then((historyResult) => {\n const {count, isBottomEnd, slice, messages} = this.mergeHistoryResult(historyStorage.history, historyResult, offset_id, limit, add_offset);\n\n historyStorage.count = count;\n\n /* if(!maxId && historyResult.messages.length) {\n maxId = this.incrementMessageId((historyResult.messages[0] as MyMessage).mid, 1);\n }\n\n const wasTotalCount = historyStorage.history.length; */\n\n for(let i = 0, length = messages.length; i < length; ++i) {\n const message = messages[i] as MyMessage;\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n if(isBottomEnd) {\n const newMaxId = slice[0];\n\n if(historyStorage.maxId === wasMaxId) {\n const first = historyStorage.history.first;\n if(first !== slice) {\n historyStorage.history.deleteSlice(first);\n }\n\n if(historyStorage.maxId !== newMaxId) {\n historyStorage.maxId = slice[0]; // ! WARNING\n\n this.reloadConversation(peerId); // when top_message is deleted but cached\n }\n }\n }\n\n /* const isBackLimit = offset < 0 && -offset !== fullLimit;\n if(isBackLimit) {\n return;\n }\n\n const totalCount = historyStorage.history.length;\n fullLimit -= (totalCount - wasTotalCount);\n\n const migratedNextPeer = this.migratedFromTo[peerId];\n const migratedPrevPeer = this.migratedToFrom[peerId]\n const isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\n\n if(isMigrated) {\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\n }\n\n if(fullLimit > 0) {\n maxId = historyStorage.history.slice[totalCount - 1];\n if(isMigrated) {\n if(!historyResult.messages.length) {\n if(migratedPrevPeer) {\n maxId = 0;\n peerId = migratedPrevPeer;\n } else {\n historyStorage.count = totalCount;\n return true;\n }\n }\n\n return this.fillHistoryStorage(peerId, maxId, fullLimit, historyStorage, threadId);\n } else if(totalCount < historyStorage.count) {\n return this.fillHistoryStorage(peerId, maxId, fullLimit, offset, historyStorage, threadId);\n }\n } */\n });\n }\n\n public requestHistory(peerId: PeerId, maxId: number, limit = 0, offset = 0, offsetDate = 0, threadId = 0): Promise> {\n // console.trace('requestHistory', peerId, maxId, limit, offset);\n\n // rootScope.broadcast('history_request');\n\n const options: MessagesGetReplies | MessagesGetHistory = {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: getServerMessageId(maxId) || 0,\n offset_date: offsetDate,\n add_offset: offset,\n limit,\n max_id: 0,\n min_id: 0,\n hash: 0\n };\n\n if(threadId) {\n (options as MessagesGetReplies).msg_id = getServerMessageId(threadId) || 0;\n }\n\n const promise: ReturnType = this.apiManager.invokeApiSingle(threadId ? 'messages.getReplies' : 'messages.getHistory', options, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n }) as any;\n\n return promise.then((historyResult) => {\n if(DEBUG) {\n this.log('requestHistory result:', peerId, historyResult, maxId, limit, offset);\n }\n\n this.appUsersManager.saveApiUsers(historyResult.users);\n this.appChatsManager.saveApiChats(historyResult.chats);\n this.saveMessages(historyResult.messages);\n\n if('pts' in historyResult) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), historyResult.pts);\n }\n\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\n if(length && !historyResult.messages[length - 1]) {\n historyResult.messages.splice(length - 1, 1);\n length--;\n count--;\n }\n\n // will load more history if last message is album grouped (because it can be not last item)\n // historyResult.messages: desc sorted\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const oldestMessage: Message.message = historyResult.messages[length - 1] as any;\n if(length && oldestMessage.grouped_id) {\n const foundSlice = historyStorage.history.findSlice(oldestMessage.mid);\n if(foundSlice && (foundSlice.slice.length + historyResult.messages.length) < count) {\n return this.requestHistory(peerId, oldestMessage.mid, 10, 0, offsetDate, threadId).then((_historyResult) => {\n return historyResult;\n });\n }\n }\n\n return historyResult;\n }, (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = this.appChatsManager.getChat(peerId.toChatId());\n if(channel._ === 'channel') {\n channel = {\n _: 'channelForbidden',\n id: peerId.toChatId(),\n access_hash: channel.access_hash,\n title: channel.title,\n pFlags: channel.pFlags\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: peerId.toChatId()\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n });\n }\n\n public fetchSingleMessages() {\n if(this.fetchSingleMessagesPromise) {\n return this.fetchSingleMessagesPromise;\n }\n\n return this.fetchSingleMessagesPromise = pause(0).then(() => {\n const requestPromises: Promise[] = [];\n\n for(const [peerId, map] of this.needSingleMessages) {\n const mids = [...map.keys()];\n const msgIds: InputMessage[] = mids.map((mid) => {\n return {\n _: 'inputMessageID',\n id: getServerMessageId(mid)\n };\n });\n\n let promise: Promise;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n promise = this.apiManager.invokeApiSingle('channels.getMessages', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n id: msgIds\n });\n } else {\n promise = this.apiManager.invokeApiSingle('messages.getMessages', {\n id: msgIds\n });\n }\n\n const after = promise.then((getMessagesResult) => {\n assumeType>(getMessagesResult);\n\n this.appUsersManager.saveApiUsers(getMessagesResult.users);\n this.appChatsManager.saveApiChats(getMessagesResult.chats);\n const messages = this.saveMessages(getMessagesResult.messages);\n\n for(let i = 0; i < messages.length; ++i) {\n const message = messages[i];\n if(!message) {\n continue;\n }\n\n const mid = generateMessageId(message.id);\n const promise = map.get(mid);\n promise.resolve(message);\n map.delete(mid);\n }\n\n if(map.size) {\n for(const [mid, promise] of map) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n }\n }).finally(() => {\n this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\n });\n\n requestPromises.push(after);\n }\n\n this.needSingleMessages.clear();\n\n return Promise.all(requestPromises).then(noop, noop).then(() => {\n this.fetchSingleMessagesPromise = undefined;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n });\n });\n }\n\n public reloadMessages(peerId: PeerId, mid: number, overwrite?: boolean): Promise;\n public reloadMessages(peerId: PeerId, mid: number[], overwrite?: boolean): Promise;\n public reloadMessages(peerId: PeerId, mid: number | number[], overwrite?: boolean): Promise {\n if(Array.isArray(mid)) {\n return Promise.all(mid.map((mid) => {\n return this.reloadMessages(peerId, mid, overwrite);\n }));\n }\n\n const message = this.getMessageByPeer(peerId, mid);\n if(message && !overwrite) {\n this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids: [mid]});\n return Promise.resolve(message);\n } else {\n let map = this.needSingleMessages.get(peerId);\n if(!map) {\n this.needSingleMessages.set(peerId, map = new Map());\n }\n\n let promise = map.get(mid);\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n map.set(mid, promise);\n this.fetchSingleMessages();\n return promise;\n }\n }\n\n public getExtendedMedia(peerId: PeerId, mids: number[]) {\n let map = this.extendedMedia.get(peerId);\n if(!map) {\n this.extendedMedia.set(peerId, map = new Map());\n }\n\n const deferred = deferredPromise();\n const toRequest: number[] = [];\n const promises = mids.map((mid) => {\n let promise = map.get(mid);\n if(!promise) {\n map.set(mid, promise = deferred);\n toRequest.push(mid);\n\n promise.then(() => {\n map.delete(mid);\n if(!map.size && this.extendedMedia.get(peerId) === map) {\n this.extendedMedia.delete(peerId);\n }\n });\n }\n\n return promise;\n });\n\n if(!toRequest.length) {\n deferred.resolve();\n } else {\n this.apiManager.invokeApi('messages.getExtendedMedia', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: toRequest.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n });\n }\n\n return Promise.all(promises);\n }\n\n public fetchMessageReplyTo(message: MyMessage) {\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\n const replyToPeerId = message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.reloadMessages(replyToPeerId, message.reply_to_mid).then((originalMessage) => {\n if(!originalMessage) { // ! break the infinite loop\n message = this.getMessageByPeer(message.peerId, message.mid); // message can come from other thread\n delete message.reply_to_mid; // ! WARNING!\n }\n\n if(message._ === 'messageService') {\n const peerId = message.peerId;\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: `${peerId}_history`,\n peerId: peerId,\n mid: message.mid,\n message\n });\n\n if(this.isMessageIsTopMessage(message)) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, {dialog: this.getDialogOnly(peerId)}]]));\n }\n }\n\n return originalMessage;\n });\n }\n\n private getTypingKey(peerId: PeerId, threadId?: number) {\n return threadId ? `${peerId}_${threadId}` : peerId;\n }\n\n public setTyping(\n peerId: PeerId,\n action: SendMessageAction,\n force?: boolean,\n threadId?: number\n ): Promise {\n if(threadId && !this.appPeersManager.isForum(peerId)) {\n threadId = undefined;\n }\n\n const key = this.getTypingKey(peerId, threadId);\n let typing = this.typings[key];\n if(\n !peerId ||\n !this.canSendToPeer(peerId) ||\n peerId === this.appPeersManager.peerId ||\n // (!force && deepEqual(typing?.action, action))\n (!force && typing?.action?._ === action._)\n ) {\n return Promise.resolve(false);\n }\n\n if(typing?.timeout) {\n clearTimeout(typing.timeout);\n }\n\n typing = this.typings[key] = {\n action\n };\n\n return this.apiManager.invokeApi('messages.setTyping', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n action,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n }).finally(() => {\n if(typing === this.typings[key]) {\n typing.timeout = ctx.setTimeout(() => {\n delete this.typings[key];\n }, 6000);\n }\n });\n }\n\n private handleReleasingMessage(message: MyMessage, storage: MessagesStorage) {\n const media = (message as Message.message).media;\n if(media) {\n const c = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || media as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument;\n const smth: Photo.photo | MyDocument = (c as MessageMedia.messageMediaPhoto).photo as any || (c as MessageMedia.messageMediaDocument).document as any;\n\n if(smth?.file_reference) {\n this.referenceDatabase.deleteContext(smth.file_reference, {type: 'message', peerId: message.peerId, messageId: message.mid});\n }\n\n if('webpage' in media && media.webpage) {\n const isScheduled = this.getScheduledMessagesStorage(message.peerId) === storage;\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\n this.appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\n }\n\n if((media as MessageMedia.messageMediaPoll).poll) {\n this.appPollsManager.updatePollToMessage(message as Message.message, false);\n }\n }\n }\n\n private handleDeletedMessages(peerId: PeerId, storage: MessagesStorage, messages: number[]) {\n const history: {\n count: number,\n unread: number,\n unreadMentions: number,\n msgs: Set,\n albums?: {[groupId: string]: Set},\n } = {\n count: 0,\n unread: 0,\n unreadMentions: 0,\n msgs: new Set()\n };\n\n for(const mid of messages) {\n const message: MyMessage = this.getMessageFromStorage(storage, mid);\n if(!message) {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n continue;\n }\n\n this.handleReleasingMessage(message, storage);\n\n this.updateMessageRepliesIfNeeded(message);\n\n if(!message.pFlags.out && !message.pFlags.is_outgoing && message.pFlags.unread) {\n ++history.unread;\n this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\n\n if(message.pFlags.mentioned) {\n ++history.unreadMentions;\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n\n ++history.count;\n history.msgs.add(mid);\n\n message.deleted = true;\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const groupedStorage = this.groupedMessagesStorage[groupedId];\n if(groupedStorage) {\n groupedStorage.delete(mid);\n\n if(!history.albums) history.albums = {};\n (history.albums[groupedId] || (history.albums[groupedId] = new Set())).add(mid);\n\n if(!groupedStorage.size) {\n delete history.albums;\n delete this.groupedMessagesStorage[groupedId];\n }\n }\n }\n\n storage.delete(mid);\n }\n\n if(history.albums) {\n for(const groupedId in history.albums) {\n this.dispatchAlbumEdit(groupedId, storage, [...history.albums[groupedId]]);\n /* const mids = this.getMidsByAlbum(groupId);\n if(mids.length) {\n const mid = Math.max(...mids);\n rootScope.$broadcast('message_edit', {peerId, mid, justMedia: false});\n } */\n }\n }\n\n return history;\n }\n\n private handleEditedMessage(oldMessage: Message, newMessage: Message, storage: MessagesStorage) {\n if(oldMessage._ === 'message') {\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\n this.appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\n }\n\n const groupedId = oldMessage.grouped_id;\n if(groupedId) {\n this.dispatchAlbumEdit(groupedId, storage, []);\n }\n }\n }\n\n private dispatchAlbumEdit(groupedId: string, storage: MessagesStorage, deletedMids?: number[]) {\n const mids = this.getMidsByAlbum(groupedId);\n const messages = mids.map((mid) => this.getMessageFromStorage(storage, mid)) as Message.message[];\n this.rootScope.dispatchEvent('album_edit', {peerId: messages[0].peerId, groupId: groupedId, deletedMids: deletedMids || [], messages});\n }\n\n public getDialogUnreadCount(dialog: Dialog | ForumTopic) {\n let unreadCount = dialog.unread_count;\n if(!this.dialogsStorage.isTopic(dialog) && this.appPeersManager.isForum(dialog.peerId)) {\n const forumUnreadCount = this.dialogsStorage.getForumUnreadCount(dialog.peerId);\n if(forumUnreadCount instanceof Promise) {\n unreadCount = 0;\n } else {\n unreadCount = forumUnreadCount.count;\n }\n }\n\n return unreadCount || +!!(dialog as Dialog).pFlags?.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog | ForumTopic) {\n return !!this.getDialogUnreadCount(dialog);\n }\n\n public canForward(message: Message.message | Message.messageService) {\n return message?._ === 'message' && !(message as Message.message).pFlags.noforwards && !this.appPeersManager.noForwards(message.peerId);\n }\n\n private pushBatchUpdate(\n event: E,\n callback: C,\n key: string,\n getElementCallback?: () => MapValueType[0]>\n ) {\n let details = this.batchUpdates[event];\n if(!details) {\n // @ts-ignore\n details = this.batchUpdates[event] = {\n callback,\n batch: new Map()\n };\n }\n\n if(!details.batch.has(key)) {\n // @ts-ignore\n details.batch.set(key, getElementCallback ? getElementCallback() : undefined);\n this.batchUpdatesDebounced();\n }\n }\n\n private getMessagesFromMap>(map: T) {\n const newMap: Map> = new Map();\n for(const [key, value] of map) {\n const [peerIdStr, mid] = key.split('_');\n const message = this.getMessageByPeer(peerIdStr.toPeerId(), +mid) as Message.message;\n if(!message) {\n continue;\n }\n\n newMap.set(message, value);\n }\n\n return newMap;\n }\n\n private batchUpdateViews = (batch: Map) => {\n const toDispatch: {peerId: PeerId, mid: number, views: number}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message] of map) {\n toDispatch.push({\n peerId: message.peerId,\n mid: message.mid,\n views: message.views\n })\n }\n\n return toDispatch;\n };\n\n private batchUpdateReactions = (batch: Map) => {\n const toDispatch: {message: Message.message, changedResults: ReactionCount.reactionCount[]}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message, previousReactions] of map) {\n const results = message.reactions?.results ?? [];\n const previousResults = previousReactions?.results ?? [];\n const changedResults = results.filter((reactionCount) => {\n const previousReactionCount = previousResults.find((_reactionCount) => reactionsEqual(_reactionCount.reaction, reactionCount.reaction));\n return (\n message.pFlags.out && (\n !previousReactionCount ||\n reactionCount.count > previousReactionCount.count\n )\n ) || (\n reactionCount.chosen_order !== undefined && (\n !previousReactionCount ||\n previousReactionCount.chosen_order === undefined\n )\n );\n });\n\n toDispatch.push({message, changedResults});\n }\n\n return toDispatch;\n };\n\n public saveDefaultSendAs(peerId: PeerId, sendAsPeerId: PeerId) {\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n channelFull.default_send_as = this.appPeersManager.getOutputPeer(sendAsPeerId);\n return this.apiManager.invokeApi('messages.saveDefaultSendAs', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n send_as: this.appPeersManager.getInputPeerById(sendAsPeerId)\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getFileNameByLocation} from '../../../../helpers/fileName';\nimport {Document} from '../../../../layer';\nimport getDocumentInputFileLocation from './getDocumentInputFileLocation';\n\nexport default function getDocumentInputFileName(doc: Document.document, thumbSize?: string) {\n return getFileNameByLocation(getDocumentInputFileLocation(doc, thumbSize), {fileName: doc.file_name});\n}\n","export default function convertInputKeyToKey(inputKey: string) {\n const str = inputKey.replace('input', '');\n return (str[0].toLowerCase() + str.slice(1)) as T;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport tsNow from '../../helpers/tsNow';\nimport {InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update} from '../../layer';\nimport {MUTE_UNTIL} from '../mtproto/mtproto_config';\nimport throttle from '../../helpers/schedulers/throttle';\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\nimport {AppManager} from './manager';\nimport ctx from '../../environment/ctx';\nimport assumeType from '../../helpers/assumeType';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\ntype ImSadAboutIt = Promise | PeerNotifySettings;\ntype MyNotifyPeer = Exclude;\ntype MyInputNotifyPeer = Exclude;\nexport class AppNotificationsManager extends AppManager {\n private peerSettings = {\n notifyPeer: {} as {[peerId: string]: ImSadAboutIt},\n notifyUsers: null as ImSadAboutIt,\n notifyChats: null as ImSadAboutIt,\n notifyBroadcasts: null as ImSadAboutIt,\n notifyForumTopic: {} as {[peerId_threadId: string]: ImSadAboutIt}\n };\n // private exceptions: {[peerId: string]: PeerNotifySettings} = {};\n\n private getNotifyPeerTypePromise: Promise;\n\n private checkMuteUntilTimeout: number;\n private checkMuteUntilThrottled: () => void;\n\n private notifyContactsSignUp: Promise;\n\n protected after() {\n this.checkMuteUntilThrottled = throttle(this.checkMuteUntil, 1000, false);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateNotifySettings: (update) => {\n const {peer} = update;\n const isTopic = peer._ === 'notifyForumTopic';\n const isPeerType = peer._ === 'notifyPeer' || isTopic;\n const peerId = isPeerType && this.appPeersManager.getPeerId(peer.peer);\n const key = !isPeerType ? peer._ : undefined;\n this.savePeerSettings({\n key,\n peerId,\n threadId: isTopic ? generateMessageId(peer.top_msg_id) : undefined,\n settings: update.notify_settings\n });\n this.rootScope.dispatchEvent('notify_settings', update);\n }\n });\n\n return this.appStateManager.getState().then((state) => {\n if(state.notifySettings) {\n for(const key in state.notifySettings) {\n assumeType(key);\n this.savePeerSettings({\n key,\n settings: state.notifySettings[key]\n });\n }\n }\n });\n }\n\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\n let key: any = convertInputKeyToKey(peer._);\n let obj: any = this.peerSettings[key as MyNotifyPeer];\n\n let peerId: PeerId;\n if(peer._ === 'inputNotifyPeer') {\n peerId = key = this.appPeersManager.getPeerId(peer.peer);\n obj = obj[key];\n }\n\n if(obj) {\n return obj;\n }\n\n return (obj || this.peerSettings)[key] = this.apiManager.invokeApi('account.getNotifySettings', {peer})\n .then((settings) => {\n this.savePeerSettings({\n key,\n peerId,\n settings\n });\n\n return settings;\n });\n }\n\n public getNotifyPeerTypeSettings() {\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\n\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as MyInputNotifyPeer[])\n .map((inputKey) => {\n return this.getNotifySettings({_: inputKey});\n });\n\n return this.getNotifyPeerTypePromise = Promise.all(promises);\n }\n\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\n // this.savePeerSettings(peerId, settings);\n\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\n inputSettings._ = 'inputPeerNotifySettings'; */\n\n return this.apiManager.invokeApi('account.updateNotifySettings', {\n peer,\n settings\n }).then((value) => {\n if(value) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateNotifySettings',\n peer: {\n ...peer as any,\n _: convertInputKeyToKey(peer._)\n },\n notify_settings: { // ! WOW, IT WORKS !\n ...settings,\n _: 'peerNotifySettings'\n }\n });\n }\n });\n }\n\n // public getNotifyExceptions() {\n // apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\n // .then((updates) => {\n // apiUpdatesManager.processUpdateMessage(updates);\n // });\n // }\n\n public getContactSignUpNotification() {\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\n return this.notifyContactsSignUp = this.apiManager.invokeApi('account.getContactSignUpNotification');\n }\n\n public setContactSignUpNotification(silent: boolean) {\n this.apiManager.invokeApi('account.setContactSignUpNotification', {silent})\n .then((value) => {\n this.notifyContactsSignUp = Promise.resolve(!silent);\n });\n }\n\n private checkMuteUntil = () => {\n if(this.checkMuteUntilTimeout !== undefined) {\n clearTimeout(this.checkMuteUntilTimeout);\n this.checkMuteUntilTimeout = undefined;\n }\n\n const timestamp = tsNow(true);\n let closestMuteUntil = MUTE_UNTIL;\n\n const p = (peerNotifySettings: ImSadAboutIt): peerNotifySettings is PeerNotifySettings => {\n if(peerNotifySettings instanceof Promise) {\n return false;\n }\n\n const muteUntil = peerNotifySettings.mute_until;\n if(!muteUntil) {\n return false;\n }\n\n if(muteUntil <= timestamp) {\n // ! do not delete it because peer's unique settings will be overwritten in getPeerLocalSettings with type's settings\n peerNotifySettings.mute_until = 0;\n return true;\n } else if(muteUntil < closestMuteUntil) {\n closestMuteUntil = muteUntil;\n }\n\n return false;\n };\n\n [\n 'notifyPeer' as const,\n 'notifyForumTopic' as const\n ].forEach((typeKey) => {\n for(const key in this.peerSettings[typeKey]) {\n const peerNotifySettings = this.peerSettings[typeKey][key];\n if(p(peerNotifySettings)) {\n const [peerId, topicId] = key.split('_');\n const peer = this.appPeersManager.getOutputPeer(peerId.toPeerId());\n this.apiUpdatesManager.saveUpdate({\n _: 'updateNotifySettings',\n peer: topicId ? {\n _: 'notifyForumTopic',\n peer,\n top_msg_id: +topicId\n } : {\n _: 'notifyPeer',\n peer\n },\n notify_settings: peerNotifySettings\n });\n }\n }\n });\n\n const timeout = Math.min(1800e3, (closestMuteUntil - timestamp) * 1000);\n this.checkMuteUntilTimeout = ctx.setTimeout(this.checkMuteUntil, timeout);\n };\n\n public getPeerKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n public savePeerSettings({key, peerId, threadId, settings}: {\n key?: Exclude,\n peerId?: PeerId,\n threadId?: number,\n settings: PeerNotifySettings\n }) {\n let obj: any;\n if(peerId) {\n key = this.getPeerKey(peerId, threadId) as any;\n obj = this.peerSettings[threadId ? 'notifyForumTopic' : 'notifyPeer'];\n }\n\n (obj || this.peerSettings)[key] = settings;\n\n if(!peerId) {\n this.rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\n this.appStateManager.getState().then((state) => {\n const notifySettings = state.notifySettings;\n notifySettings[key] = settings;\n this.appStateManager.pushToState('notifySettings', notifySettings);\n });\n } else {\n this.checkMuteUntilThrottled();\n }\n\n // rootScope.broadcast('notify_settings', {peerId: peerId});\n }\n\n public isMuted(peerNotifySettings: PeerNotifySettings) {\n return peerNotifySettings._ === 'peerNotifySettings' &&\n (peerNotifySettings.silent || (peerNotifySettings.mute_until !== undefined && (peerNotifySettings.mute_until * 1000) > tsNow()));\n }\n\n private getPeerMuted(peerId: PeerId) {\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: this.appPeersManager.getInputPeerById(peerId)});\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\n }\n\n private getPeerLocalSettings({\n peerId,\n respectType = true,\n threadId\n }: {\n peerId: PeerId,\n respectType?: boolean,\n threadId?: number\n }): PeerNotifySettings {\n const n: PeerNotifySettings = {\n _: 'peerNotifySettings'\n };\n\n const peerKey = this.getPeerKey(peerId, threadId);\n const notifySettings = this.peerSettings[threadId ? 'notifyForumTopic' : 'notifyPeer'][peerKey];\n // if(!notifySettings || (notifySettings instanceof Promise)) return false;\n if(notifySettings && !(notifySettings instanceof Promise)) {\n Object.assign(n, notifySettings);\n }\n\n if(respectType) {\n const inputNotify = this.appPeersManager.getInputNotifyPeerById({peerId, ignorePeerId: true, threadId});\n const key = convertInputKeyToKey(inputNotify._);\n const typeNotifySettings = this.peerSettings[key as MyNotifyPeer];\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\n for(const i in typeNotifySettings) {\n // @ts-ignore\n if(n[i] === undefined) {\n // @ts-ignore\n n[i] = typeNotifySettings[i];\n }\n }\n }\n }\n\n return n;\n }\n\n public validatePeerSettings[0]>(options: T): T {\n if(options.peerId === this.appPeersManager.peerId) return;\n if(options.threadId && !this.appPeersManager.isForum(options.peerId)) options.threadId = undefined;\n return options;\n }\n\n public isPeerLocalMuted(options: Parameters[0]): boolean {\n if(!(options = this.validatePeerSettings(options))) return false;\n\n if(options.threadId) {\n const notifySettings = this.getPeerLocalSettings({...options, respectType: false});\n if(notifySettings.silent !== undefined || notifySettings.mute_until !== undefined) {\n return this.isMuted(notifySettings);\n } else {\n return this.isPeerLocalMuted({...options, threadId: undefined});\n }\n }\n\n const notifySettings = this.getPeerLocalSettings(options);\n const isMuted = this.isMuted(notifySettings);\n return isMuted;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto} from '../../layer';\nimport type {LangPackKey} from '../langPack';\nimport {getRestrictionReason} from '../../helpers/restrictions';\nimport isObject from '../../helpers/object/isObject';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\nimport isUser from './utils/peers/isUser';\nimport isAnyChat from './utils/peers/isAnyChat';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\nimport isPeerRestricted from './utils/peers/isPeerRestricted';\nimport getPeerPhoto from './utils/peers/getPeerPhoto';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\nexport class AppPeersManager extends AppManager {\n public get peerId() {\n return this.appUsersManager.userId.toPeerId();\n }\n /* public savePeerInstance(peerId: PeerId, instance: any) {\n if(peerId < 0) appChatsManager.saveApiChat(instance);\n else appUsersManager.saveApiUser(instance);\n } */\n\n public canPinMessage(peerId: PeerId) {\n return peerId.isUser() || this.appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\n }\n\n public getPeerPhoto(peerId: PeerId) {\n const peer = this.getPeer(peerId) as User.user | Chat.channel;\n return getPeerPhoto(peer);\n }\n\n public getPeerMigratedTo(peerId: PeerId) {\n if(peerId.isUser()) {\n return false;\n }\n\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n const migratedTo = chat?.migrated_to;\n if(migratedTo && chat.pFlags.deactivated) {\n return getPeerId(migratedTo);\n }\n\n return false;\n }\n\n public getOutputPeer(peerId: PeerId): Peer {\n if(peerId.isUser()) {\n return {_: 'peerUser', user_id: peerId.toUserId()};\n }\n\n const chatId = peerId.toChatId();\n if(this.appChatsManager.isChannel(chatId)) {\n return {_: 'peerChannel', channel_id: chatId};\n }\n\n return {_: 'peerChat', chat_id: chatId};\n }\n\n public getPeerString(peerId: PeerId) {\n if(peerId.isUser()) {\n return this.appUsersManager.getUserString(peerId.toUserId());\n }\n return this.appChatsManager.getChatString(peerId.toChatId());\n }\n\n public getPeerUsername(peerId: PeerId) {\n return this.getPeerActiveUsernames(peerId)[0] || '';\n }\n\n public getPeerActiveUsernames(peerId: PeerId) {\n const peer = this.getPeer(peerId);\n return getPeerActiveUsernames(peer);\n }\n\n public getPeer(peerId: PeerId) {\n return peerId.isUser() ?\n this.appUsersManager.getUser(peerId.toUserId()) :\n this.appChatsManager.getChat(peerId.toChatId());\n }\n\n public getPeerId(peerId: Parameters[0]) {\n return getPeerId(peerId) || (isObject(peerId) && peerId._ === 'inputPeerSelf' && this.peerId) || NULL_PEER_ID;\n }\n\n public getDialogPeer(peerId: PeerId): DialogPeer {\n return {\n _: 'dialogPeer',\n peer: this.getOutputPeer(peerId)\n };\n }\n\n public isChannel(peerId: PeerId): boolean {\n return !peerId.isUser() && this.appChatsManager.isChannel(peerId.toChatId());\n }\n\n public isMegagroup(peerId: PeerId) {\n return !peerId.isUser() && this.appChatsManager.isMegagroup(peerId.toChatId());\n }\n\n public isForum(peerId: PeerId) {\n return !peerId.isUser() && this.appChatsManager.isForum(peerId.toChatId());\n }\n\n public isAnyGroup(peerId: PeerId): boolean {\n return !peerId.isUser() && !this.appChatsManager.isBroadcast(peerId.toChatId());\n }\n\n public isBroadcast(peerId: PeerId): boolean {\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\n }\n\n public isBot(peerId: PeerId): boolean {\n return peerId.isUser() && this.appUsersManager.isBot(peerId.toUserId());\n }\n\n public isContact(peerId: PeerId): boolean {\n return peerId.isUser() && this.appUsersManager.isContact(peerId.toUserId());\n }\n\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\n return isUser(peerId);\n }\n\n public isAnyChat(peerId: PeerId) {\n return isAnyChat(peerId);\n }\n\n public isPeerRestricted(peerId: PeerId) {\n return isPeerRestricted(this.getPeer(peerId));\n }\n\n public getRestrictionReasonText(peerId: PeerId) {\n const peer = this.getPeer(peerId) as Chat.channel | User.user;\n const reason = peer.restriction_reason ? getRestrictionReason(peer.restriction_reason) : undefined;\n if(reason) {\n return reason.text;\n } else {\n return peerId.isUser() ? 'This user is restricted' : 'This chat is restricted';\n }\n }\n\n /* public getInputPeer(peerString: string): InputPeer {\n var firstChar = peerString.charAt(0);\n var peerParams = peerString.substr(1).split('_');\n let id = +peerParams[0];\n\n if(firstChar === 'u') {\n //appUsersManager.saveUserAccess(id, peerParams[1]);\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: peerParams[1]\n };\n } else if(firstChar === 'c' || firstChar === 's') {\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\n if(firstChar === 's') {\n appChatsManager.saveIsMegagroup(id);\n }\n\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: peerParams[1] || '0'\n };\n } else {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n } */\n\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude;\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\n public getInputNotifyPeerById({\n peerId,\n ignorePeerId,\n threadId\n }: T): T['ignorePeerId'] extends true ? Exclude : (T['threadId'] extends number ? InputNotifyPeer.inputNotifyForumTopic : InputNotifyPeer.inputNotifyPeer) {\n if(ignorePeerId) {\n if(peerId.isUser()) {\n return {_: 'inputNotifyUsers'} as any;\n } else {\n if(this.isBroadcast(peerId)) {\n return {_: 'inputNotifyBroadcasts'} as any;\n } else {\n return {_: 'inputNotifyChats'} as any;\n }\n }\n } else if(threadId) {\n return {\n _: 'inputNotifyForumTopic',\n peer: this.getInputPeerById(peerId),\n top_msg_id: getServerMessageId(threadId)\n } as any;\n } else {\n return {\n _: 'inputNotifyPeer',\n peer: this.getInputPeerById(peerId)\n } as any;\n }\n }\n\n public getInputPeerById(peerId: PeerId): InputPeer {\n if(!peerId) {\n return {_: 'inputPeerEmpty'};\n }\n\n if(!peerId.isUser()) {\n const chatId = peerId.toChatId();\n return this.appChatsManager.getInputPeer(chatId);\n }\n\n const userId = peerId.toUserId();\n return this.appUsersManager.getUserInputPeer(userId);\n }\n\n /**\n * ! use it only in safe places like requests\n */\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\n return {_: 'inputPeerSelf'};\n }\n\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\n return {\n _: 'inputDialogPeer',\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\n };\n }\n\n public getPeerSearchText(peerId: PeerId) {\n let text: string;\n if(this.isUser(peerId)) {\n text = '%pu ' + this.appUsersManager.getUserSearchText(peerId.toUserId());\n } else {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n text = '%pg ' + (chat.title || '');\n }\n\n return text;\n }\n\n public getDialogType(peerId: PeerId): PeerType {\n if(this.isMegagroup(peerId)) {\n return 'megagroup';\n } else if(this.isChannel(peerId)) {\n return 'channel';\n } else if(!this.isUser(peerId)) {\n return 'group';\n } else {\n return peerId === this.peerId ? 'saved' : 'chat';\n }\n }\n\n public getDeleteButtonText(peerId: PeerId): Extract {\n switch(this.getDialogType(peerId)) {\n case 'channel':\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\n\n case 'megagroup':\n case 'group':\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\n\n default:\n return 'ChatList.Context.DeleteChat';\n }\n }\n\n public noForwards(peerId: PeerId) {\n if(peerId.isUser()) return false;\n else {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n return !!(chat as Chat.chat).pFlags?.noforwards;\n }\n }\n}\n\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Photo, PhotoSize, PhotosPhotos} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\nimport {AppManager} from './manager';\n\nexport type MyPhoto = Photo.photo;\n\n// TIMES = 2 DUE TO SIDEBAR AND CHAT\n// let TEST_FILE_REFERENCE = \"5440692274120994569\", TEST_FILE_REFERENCE_TIMES = 2;\n\nexport class AppPhotosManager extends AppManager {\n private photos: {\n [id: string]: MyPhoto\n } = {};\n\n public savePhoto(photo: Photo, context?: ReferenceContext) {\n if(!photo || photo._ === 'photoEmpty') return;\n\n /* if(photo.id === TEST_FILE_REFERENCE) {\n console.warn('Testing FILE_REFERENCE_EXPIRED');\n const bytes = [2, 67, 175, 43, 190, 0, 0, 20, 62, 95, 111, 33, 45, 99, 220, 116, 218, 11, 167, 127, 213, 18, 127, 32, 243, 202, 117, 80, 30];\n //photo.file_reference = new Uint8Array(bytes);\n photo.file_reference = bytes;\n if(!--TEST_FILE_REFERENCE_TIMES) {\n TEST_FILE_REFERENCE = '';\n }\n } */\n\n const oldPhoto = this.photos[photo.id];\n if(photo.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldPhoto, photo);\n this.referenceDatabase.saveContext(photo.file_reference, context);\n }\n\n if(photo.sizes?.length) {\n // * sometimes photoStrippedSize can be the last item\n photo.sizes.sort((a, b) => {\n return ((a as PhotoSize.photoSize).size || ((a as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0)) - ((b as PhotoSize.photoSize).size || ((b as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0));\n });\n\n const size = photo.sizes[photo.sizes.length - 1];\n if(size._ === 'photoSizeProgressive') {\n size.size = size.sizes[size.sizes.length - 1];\n }\n }\n\n if(oldPhoto) {\n return Object.assign(oldPhoto, photo);\n }\n\n return this.photos[photo.id] = photo;\n }\n\n public getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\n const inputUser = this.appUsersManager.getUserInput(userId);\n return this.apiManager.invokeApiCacheable('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit,\n max_id: maxId\n }, {cacheSeconds: 60}).then((photosResult) => {\n this.appUsersManager.saveApiUsers(photosResult.users);\n const photoIds = photosResult.photos.map((photo, idx) => {\n photosResult.photos[idx] = this.savePhoto(photo, {type: 'profilePhoto', peerId: userId.toPeerId()});\n return photo.id;\n });\n\n // ! WARNING !\n if(maxId !== '0' && maxId) {\n const idx = photoIds.indexOf(maxId);\n if(idx !== -1) {\n photoIds.splice(idx, 1);\n }\n }\n\n return {\n count: (photosResult as PhotosPhotos.photosPhotosSlice).count || photoIds.length,\n photos: photoIds\n };\n });\n }\n\n /* public getPhotoURL(photo: MTPhoto | MTMyDocument, photoSize: MTPhotoSize) {\n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize);\n\n return {url: getFileURL('photo', downloadOptions), location: downloadOptions.location};\n } */\n\n /* public isDownloaded(media: any) {\n const isPhoto = media._ === 'photo';\n const photo = isPhoto ? this.getPhoto(media.id) : null;\n let isDownloaded: boolean;\n if(photo) {\n isDownloaded = photo.downloaded > 0;\n } else {\n const cachedThumb = this.getDocumentCachedThumb(media.id);\n isDownloaded = cachedThumb?.downloaded > 0;\n }\n\n return isDownloaded;\n } */\n\n public getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport copy from '../../helpers/object/copy';\nimport {InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults} from '../../layer';\nimport {logger, LogTypes} from '../logger';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\ntype PollId = Poll['id'];\n\nexport class AppPollsManager extends AppManager {\n public polls: {[id: PollId]: Poll} = {};\n public results: {[id: PollId]: PollResults} = {};\n public pollToMessages: {[id: PollId]: Set} = {};\n\n private log = logger('POLLS', LogTypes.Error);\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateMessagePoll: (update) => {\n this.log('updateMessagePoll:', update);\n\n let poll: Poll = update.poll || this.polls[update.poll_id];\n if(!poll) {\n return;\n }\n\n let results = update.results;\n const ret = this.savePoll(poll, results as any);\n poll = ret.poll;\n results = ret.results;\n\n this.rootScope.dispatchEvent('poll_update', {poll, results: results as any});\n }\n });\n }\n\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\n if(message) {\n this.updatePollToMessage(message, true);\n }\n\n const id = poll.id;\n if(this.polls[id]) {\n poll = Object.assign(this.polls[id], poll);\n results = this.saveResults(poll, results);\n } else {\n this.polls[id] = poll;\n\n poll.chosenIndexes = [];\n results = this.saveResults(poll, results);\n }\n\n return {poll, results};\n }\n\n public saveResults(poll: Poll, results: PollResults) {\n if(this.results[poll.id]) {\n results = Object.assign(this.results[poll.id], results);\n } else {\n this.results[poll.id] = results;\n }\n\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\n poll.chosenIndexes.length = 0;\n if(results?.results?.length) {\n results.results.forEach((answer, idx) => {\n if(answer.pFlags?.chosen) {\n poll.chosenIndexes.push(idx);\n }\n });\n }\n }\n\n return results;\n }\n\n public getPoll(pollId: PollId): {poll: Poll, results: PollResults} {\n return {\n poll: this.polls[pollId],\n results: this.results[pollId]\n };\n }\n\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\n if(solution) {\n if(!solutionEntities) {\n solutionEntities = [];\n }\n\n solution = parseMarkdown(solution, solutionEntities);\n } else {\n solution = undefined; // can be string here\n }\n\n return {\n _: 'inputMediaPoll',\n poll,\n correct_answers: correctAnswers,\n solution,\n solution_entities: solution ? solutionEntities : undefined\n };\n }\n\n public updatePollToMessage(message: Message.message, add: boolean) {\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\n let set = this.pollToMessages[id];\n\n if(!add && !set) {\n return;\n }\n\n if(!set) {\n set = this.pollToMessages[id] = new Set();\n }\n\n const key = message.peerId + '_' + message.mid;\n if(add) set.add(key);\n else set.delete(key);\n\n if(!add && !set.size) {\n delete this.polls[id];\n delete this.results[id];\n delete this.pollToMessages[id];\n }\n }\n\n public sendVote(message: Message.message, optionIds: number[]): Promise {\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\n\n const options: Uint8Array[] = optionIds.map((index) => {\n return poll.answers[index].option;\n });\n\n const messageId = message.mid;\n const peerId = message.peerId;\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\n\n if(message.pFlags.is_outgoing) {\n return this.appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\n this.log('invoke sendVote callback');\n return this.sendVote(message as Message.message, optionIds);\n });\n }\n\n return this.apiManager.invokeApi('messages.sendVote', {\n peer: inputPeer,\n msg_id: getServerMessageId(message.mid),\n options\n }).then((updates) => {\n this.log('sendVote updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getResults(message: Message.message) {\n const inputPeer = this.appPeersManager.getInputPeerById(message.peerId);\n\n return this.apiManager.invokeApi('messages.getPollResults', {\n peer: inputPeer,\n msg_id: getServerMessageId(message.mid)\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n this.log('getResults updates:', updates);\n });\n }\n\n public getVotes(message: Message.message, option?: Uint8Array, offset?: string, limit = 20) {\n return this.apiManager.invokeApi('messages.getPollVotes', {\n peer: this.appPeersManager.getInputPeerById(message.peerId),\n id: getServerMessageId(message.mid),\n option,\n offset,\n limit\n }).then((votesList) => {\n this.log('getPollVotes messages:', votesList);\n\n this.appUsersManager.saveApiUsers(votesList.users);\n\n return votesList;\n });\n }\n\n public stopPoll(message: Message.message) {\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\n\n if(poll.pFlags.closed) return Promise.resolve();\n\n const newPoll = copy(poll);\n newPoll.pFlags.closed = true;\n return this.appMessagesManager.editMessage(message, undefined, {\n newMedia: this.getInputMediaPoll(newPoll)\n }).then(() => {\n // console.log('stopped poll');\n }, err => {\n this.log.error('stopPoll error:', err);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputPrivacyKey, InputPrivacyRule, PrivacyRule, PrivacyKey, GlobalPrivacySettings} from '../../layer';\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\nimport {AppManager} from './manager';\n\nexport class AppPrivacyManager extends AppManager {\n private privacy: Partial<{\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\n }> = {};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updatePrivacy: (update) => {\n const key = update.key._;\n this.privacy[key] = update.rules;\n this.rootScope.dispatchEvent('privacy_update', update);\n }\n });\n }\n\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\n return this.apiManager.invokeApi('account.setPrivacy', {\n key: {\n _: inputKey\n },\n rules\n }).then((privacyRules) => {\n this.appUsersManager.saveApiUsers(privacyRules.users);\n this.appChatsManager.saveApiChats(privacyRules.chats);\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updatePrivacy',\n key: {\n _: convertInputKeyToKey(inputKey)\n },\n rules: rules.map((inputRule) => {\n const rule: PrivacyRule = {} as any;\n Object.assign(rule, inputRule);\n rule._ = convertInputKeyToKey(rule._) as any;\n return rule;\n })\n });\n\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\n\n return privacyRules.rules;\n });\n }\n\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\n const rules = this.privacy[privacyKey];\n if(rules) {\n return Promise.resolve(rules);\n }\n\n return this.privacy[privacyKey] = this.apiManager.invokeApi('account.getPrivacy', {\n key: {\n _: inputKey\n }\n }).then((privacyRules) => {\n this.appUsersManager.saveApiUsers(privacyRules.users);\n this.appChatsManager.saveApiChats(privacyRules.chats);\n\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\n\n return this.privacy[privacyKey] = privacyRules.rules;\n });\n }\n\n public getGlobalPrivacySettings() {\n return this.apiManager.invokeApi('account.getGlobalPrivacySettings');\n }\n\n public setGlobalPrivacySettings(settings: GlobalPrivacySettings) {\n return this.apiManager.invokeApi('account.setGlobalPrivacySettings', {settings});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {MyTopPeer} from './appUsersManager';\nimport tsNow from '../../helpers/tsNow';\nimport {ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, SendMessageAction, Update, UserFull, Photo, PhotoSize, Updates} from '../../layer';\nimport SearchIndex from '../searchIndex';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport getPhotoInput from './utils/photos/getPhotoInput';\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\nimport ctx from '../../environment/ctx';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\n\nconst PEER_FULL_TTL = 3 * 60e3;\n\nexport class AppProfileManager extends AppManager {\n // private botInfos: any = {};\n private usersFull: {[id: UserId]: UserFull.userFull} = {};\n private chatsFull: {[id: ChatId]: ChatFull} = {};\n private fullExpiration: {[peerId: PeerId]: number} = {};\n private typingsInPeer: {[key: string]: UserTyping[]};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateChatParticipants: (update) => {\n const participants = update.participants;\n if(participants._ === 'chatParticipants') {\n const chatId = participants.chat_id;\n const chatFull = this.chatsFull[chatId] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n chatFull.participants = participants;\n this.rootScope.dispatchEvent('chat_full_update', chatId);\n }\n }\n },\n\n updateChatParticipantAdd: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n return;\n }\n }\n\n participants.push({\n _: 'chatParticipant',\n user_id: update.user_id,\n inviter_id: update.inviter_id,\n date: tsNow(true)\n });\n\n _participants.version = update.version;\n this.rootScope.dispatchEvent('chat_full_update', update.chat_id);\n }\n },\n\n updateChatParticipantDelete: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n participants.splice(i, 1);\n _participants.version = update.version;\n this.rootScope.dispatchEvent('chat_full_update', update.chat_id);\n return;\n }\n }\n }\n },\n\n updateUserTyping: this.onUpdateUserTyping,\n updateChatUserTyping: this.onUpdateUserTyping,\n updateChannelUserTyping: this.onUpdateUserTyping,\n\n updatePeerBlocked: this.onUpdatePeerBlocked\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const fullChat = this.chatsFull[chatId];\n const chat: Chat.chat | Chat.channel | Chat.chatForbidden | Chat.channelForbidden = this.appChatsManager.getChat(chatId);\n if(!fullChat || !chat) {\n return;\n }\n\n let updated = false;\n if(!!fullChat.call !== !!(chat as Chat.chat).pFlags?.call_active) {\n updated = true;\n }\n\n const {photo} = chat as Chat.chat;\n if(photo) {\n const hasChatPhoto = photo._ !== 'chatPhotoEmpty';\n const hasFullChatPhoto = !!(fullChat.chat_photo && fullChat.chat_photo._ !== 'photoEmpty'); // chat_photo can be missing\n if(\n hasChatPhoto !== hasFullChatPhoto || (\n hasChatPhoto &&\n photo.photo_id !== fullChat.chat_photo?.id\n )\n ) {\n updated = true;\n }\n }\n\n if(updated) {\n this.refreshFullPeer(chatId.toPeerId(true));\n }\n });\n\n this.rootScope.addEventListener('channel_update', (chatId) => {\n this.refreshFullPeer(chatId.toPeerId(true));\n });\n\n // * genius\n this.rootScope.addEventListener('chat_full_update', (chatId) => {\n this.rootScope.dispatchEvent('peer_full_update', chatId.toPeerId(true));\n });\n\n // * genius\n this.rootScope.addEventListener('user_full_update', (userId) => {\n this.rootScope.dispatchEvent('peer_full_update', userId.toPeerId(false));\n });\n\n this.rootScope.addEventListener('invalidate_participants', (chatId) => {\n this.invalidateChannelParticipants(chatId);\n });\n\n this.typingsInPeer = {};\n }\n\n /* public saveBotInfo(botInfo: any) {\n const botId = botInfo && botInfo.user_id;\n if(!botId) {\n return null;\n }\n\n const commands: any = {};\n botInfo.commands.forEach((botCommand: any) => {\n commands[botCommand.command] = botCommand.description;\n });\n\n return this.botInfos[botId] = {\n id: botId,\n version: botInfo.version,\n shareText: botInfo.share_text,\n description: botInfo.description,\n commands: commands\n };\n } */\n\n public getProfile(id: UserId, override?: true) {\n if(this.usersFull[id] && !override && Date.now() < this.fullExpiration[id.toPeerId()]) {\n return this.usersFull[id];\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'users.getFullUser',\n params: {\n id: this.appUsersManager.getUserInput(id)\n },\n processResult: (usersUserFull) => {\n this.appChatsManager.saveApiChats(usersUserFull.chats, true);\n this.appUsersManager.saveApiUsers(usersUserFull.users);\n\n const userFull = usersUserFull.full_user;\n const peerId = id.toPeerId(false);\n if(userFull.profile_photo) {\n userFull.profile_photo = this.appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\n }\n\n const botInfo = userFull.bot_info;\n if(botInfo) {\n const referenceContext: ReferenceContext = {type: 'userFull', userId: id};\n botInfo.description_document = this.appDocsManager.saveDoc(botInfo.description_document, referenceContext);\n botInfo.description_photo = this.appPhotosManager.savePhoto(botInfo.description_photo, referenceContext);\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: userFull.notify_settings\n });\n\n this.usersFull[id] = userFull;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n\n /* if(userFull.bot_info) {\n userFull.bot_info = this.saveBotInfo(userFull.bot_info) as any;\n } */\n\n // appMessagesManager.savePinnedMessage(id, userFull.pinned_msg_id);\n\n this.rootScope.dispatchEvent('user_full_update', id);\n return userFull;\n }\n });\n }\n\n public getProfileByPeerId(peerId: PeerId, override?: true) {\n if(this.appPeersManager.isAnyChat(peerId)) return this.getChatFull(peerId.toChatId(), override);\n else return this.getProfile(peerId.toUserId(), override);\n }\n\n public getCachedFullChat(chatId: ChatId) {\n return this.chatsFull[chatId];\n }\n\n public getCachedFullUser(userId: UserId) {\n return this.usersFull[userId];\n }\n\n public getCachedProfileByPeerId(peerId: PeerId) {\n return peerId.isUser() ? this.getCachedFullUser(peerId.toUserId()) : this.getCachedFullChat(peerId.toChatId());\n }\n\n public async getFullPhoto(peerId: PeerId) {\n const profile = await this.getProfileByPeerId(peerId);\n switch(profile._) {\n case 'userFull':\n return profile.profile_photo;\n case 'channelFull':\n case 'chatFull':\n return profile.chat_photo;\n }\n }\n\n /* public getPeerBots(peerId: PeerId) {\n var peerBots: any[] = [];\n if(peerId >= 0 && !appUsersManager.isBot(peerId) ||\n (appPeersManager.isChannel(peerId) && !appPeersManager.isMegagroup(peerId))) {\n return Promise.resolve(peerBots);\n }\n if(peerId >= 0) {\n return this.getProfile(peerId).then((userFull: any) => {\n var botInfo = userFull.bot_info;\n if(botInfo && botInfo._ !== 'botInfoEmpty') {\n peerBots.push(botInfo);\n }\n return peerBots;\n });\n }\n\n return this.getChatFull(peerId.toChatId()).then((chatFull: any) => {\n chatFull.bot_info.forEach((botInfo: any) => {\n peerBots.push(this.saveBotInfo(botInfo))\n });\n return peerBots;\n });\n } */\n\n public getChatFull(id: ChatId, override?: true) {\n if(this.appChatsManager.isChannel(id)) {\n return this.getChannelFull(id, override);\n }\n\n const peerId = id.toPeerId(true);\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override && Date.now() < this.fullExpiration[peerId]) {\n const chat = this.appChatsManager.getChat(id) as Chat.chat;\n if(\n chat.pFlags.left ||\n chat.pFlags.deactivated ||\n chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version\n ) {\n return fullChat as ChatFull;\n }\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getFullChat',\n params: {\n chat_id: id\n },\n processResult: (result) => {\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const chatFull = result.full_chat as ChatFull.chatFull;\n if(chatFull && chatFull.chat_photo && chatFull.chat_photo.id) {\n chatFull.chat_photo = this.appPhotosManager.savePhoto(chatFull.chat_photo, {type: 'profilePhoto', peerId});\n }\n\n if(chatFull.call) {\n this.appGroupCallsManager.saveGroupCall(chatFull.call, id);\n }\n\n // appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: chatFull.notify_settings\n });\n\n this.chatsFull[id] = chatFull;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return chatFull;\n }\n });\n }\n\n public async getChatInviteLink(id: ChatId, force?: boolean) {\n const chatFull = await this.getChatFull(id);\n if(!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n\n return this.apiManager.invokeApi('messages.exportChatInvite', {\n peer: this.appPeersManager.getInputPeerById(id.toPeerId(true))\n }).then((exportedInvite) => {\n if(this.chatsFull[id] !== undefined) {\n this.chatsFull[id].exported_invite = exportedInvite;\n }\n\n return (exportedInvite as ExportedChatInvite.chatInviteExported).link;\n });\n }\n\n public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\n if(filter._ === 'channelParticipantsRecent') {\n const chat = this.appChatsManager.getChat(id);\n if(chat?.pFlags && (\n // chat.pFlags.kicked ||\n (chat as Chat.channel).pFlags.broadcast &&\n !(chat as Chat.channel).pFlags.creator &&\n !(chat as Chat.channel).admin_rights\n )) {\n return Promise.reject();\n }\n }\n\n return this.apiManager.invokeApiCacheable('channels.getParticipants', {\n channel: this.appChatsManager.getChannelInput(id),\n filter,\n offset,\n limit,\n hash: '0'\n }, {cacheSeconds: 60}).then((result) => {\n this.appUsersManager.saveApiUsers((result as ChannelsChannelParticipants.channelsChannelParticipants).users);\n return result as ChannelsChannelParticipants.channelsChannelParticipants;\n });\n /* let maybeAddSelf = (participants: any[]) => {\n let chat = appChatsManager.getChat(id);\n let selfMustBeFirst = filter._ === 'channelParticipantsRecent' &&\n !offset &&\n !chat.pFlags.kicked &&\n !chat.pFlags.left;\n\n if(selfMustBeFirst) {\n participants = copy(participants);\n let myID = appUsersManager.getSelf().id;\n let myIndex = participants.findIndex((p) => p.user_id === myID);\n let myParticipant;\n\n if(myIndex !== -1) {\n myParticipant = participants[myIndex];\n participants.splice(myIndex, 1);\n } else {\n myParticipant = {_: 'channelParticipantSelf', user_id: myID};\n }\n\n participants.unshift(myParticipant);\n }\n\n return participants;\n } */\n }\n\n public getChannelParticipant(id: ChatId, peerId: PeerId) {\n return this.apiManager.invokeApiSingle('channels.getParticipant', {\n channel: this.appChatsManager.getChannelInput(id),\n participant: this.appPeersManager.getInputPeerById(peerId)\n }).then((channelParticipant) => {\n this.appUsersManager.saveApiUsers(channelParticipant.users);\n return channelParticipant.participant;\n });\n }\n\n public getChannelFull(id: ChatId, override?: true) {\n const peerId = id.toPeerId(true);\n if(this.chatsFull[id] !== undefined && !override && Date.now() < this.fullExpiration[peerId]) {\n return this.chatsFull[id] as ChatFull.channelFull;\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getFullChannel',\n params: {\n channel: this.appChatsManager.getChannelInput(id)\n },\n processResult: (result) => {\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const fullChannel = result.full_chat as ChatFull.channelFull;\n if(fullChannel && fullChannel.chat_photo.id) {\n fullChannel.chat_photo = this.appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\n // appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n\n if(fullChannel.call) {\n this.appGroupCallsManager.saveGroupCall(fullChannel.call, id);\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: fullChannel.notify_settings\n });\n\n this.chatsFull[id] = fullChannel;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChannel;\n },\n processError: (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n const channel = this.appChatsManager.getChat(id) as Chat.channel | Chat.channelForbidden;\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n }],\n chats: [channel._ === 'channelForbidden' ? channel : {\n _: 'channelForbidden',\n id,\n access_hash: channel.access_hash,\n title: channel.title,\n pFlags: channel.pFlags\n }],\n users: []\n } as Updates.updates);\n break;\n }\n\n throw error;\n }\n });\n }\n\n public getMentions(chatId: ChatId, query: string, threadId?: number): Promise {\n const processUserIds = (topPeers: MyTopPeer[]) => {\n const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n /* const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n\n const index = new SearchIndex(!startsWithAt, !startsWithAt); */\n const index = new SearchIndex({\n ignoreCase: true\n });\n\n const ratingMap: Map = new Map();\n topPeers.forEach((peer) => {\n index.indexObject(peer.id, this.appUsersManager.getUserSearchText(peer.id));\n ratingMap.set(peer.id, peer.rating);\n });\n\n const peerIds = Array.from(index.search(query));\n peerIds.sort((a, b) => ratingMap.get(b) - ratingMap.get(a));\n return peerIds;\n };\n\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.getChannelParticipants(chatId, {\n _: 'channelParticipantsMentions',\n q: query,\n top_msg_id: getServerMessageId(threadId)\n }, 50, 0).then((cP) => {\n return cP.participants.map((p) => getParticipantPeerId(p));\n });\n } else if(chatId) {\n promise = Promise.resolve(this.getChatFull(chatId)).then((chatFull) => {\n return ((chatFull as ChatFull.chatFull).participants as ChatParticipants.chatParticipants).participants.map((p) => p.user_id.toPeerId());\n });\n } else {\n promise = Promise.resolve([]);\n }\n\n return Promise.all([\n // [],\n this.appUsersManager.getTopPeers('bots_inline').catch(() => [] as MyTopPeer[]),\n promise\n ]).then((results) => {\n const peers = results[0].concat(results[1].map((peerId) => ({id: peerId, rating: 0})));\n\n return processUserIds(peers);\n });\n }\n\n private invalidateChannelParticipants(id: ChatId) {\n this.apiManager.clearCache('channels.getParticipants', (params) => (params.channel as InputChannel.inputChannel).channel_id === id);\n this.refreshFullPeer(id.toPeerId(true));\n }\n\n private refreshFullPeer(peerId: PeerId) {\n if(peerId.isUser()) {\n const userId = peerId.toUserId();\n delete this.usersFull[userId];\n this.rootScope.dispatchEvent('user_full_update', userId);\n } else {\n const chatId = peerId.toChatId();\n delete this.chatsFull[chatId];\n this.rootScope.dispatchEvent('chat_full_update', chatId);\n }\n\n // ! эта строчка будет создавать race condition:\n // ! запрос вернёт chat с установленным флагом call_not_empty, хотя сам апдейт уже будет применён\n // this.getProfileByPeerId(peerId, true);\n }\n\n public updateProfile(first_name?: string, last_name?: string, about?: string) {\n return this.apiManager.invokeApi('account.updateProfile', {\n first_name,\n last_name,\n about\n }).then((user) => {\n this.appUsersManager.saveApiUser(user);\n\n if(about !== undefined) {\n const peerId = user.id.toPeerId();\n const userFull = this.usersFull[user.id];\n if(userFull) {\n userFull.about = about;\n }\n\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return this.getProfile(user.id, true);\n });\n }\n\n public uploadProfilePhoto(inputFile: InputFile) {\n return this.apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then((updateResult) => {\n // ! sometimes can have no user in users\n const photo = updateResult.photo as Photo.photo;\n if(!updateResult.users.length) {\n const strippedThumb = photo.sizes.find((size) => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n updateResult.users.push({\n ...this.appUsersManager.getSelf(),\n photo: {\n _: 'userProfilePhoto',\n dc_id: photo.dc_id,\n photo_id: photo.id,\n stripped_thumb: strippedThumb?.bytes,\n pFlags: {\n\n }\n }\n });\n }\n this.appUsersManager.saveApiUsers(updateResult.users);\n\n const myId = this.appPeersManager.peerId;\n this.appPhotosManager.savePhoto(updateResult.photo, {\n type: 'profilePhoto',\n peerId: myId\n });\n\n const userId = myId.toUserId();\n // this.apiUpdatesManager.processLocalUpdate({\n // _: 'updateUserPhoto',\n // user_id: userId,\n // date: tsNow(true),\n // photo: this.appUsersManager.getUser(userId).photo,\n // previous: true\n // });\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateUser',\n user_id: userId\n });\n });\n }\n\n public deletePhotos(photoIds: string[]) {\n return this.apiManager.invokeApiSingle('photos.deletePhotos', {\n id: photoIds.map((photoId) => {\n const photo = this.appPhotosManager.getPhoto(photoId);\n return getPhotoInput(photo);\n })\n }).then((deletedList) => {\n\n });\n }\n\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\n const user = this.appUsersManager.getUser(participant.user_id);\n return !!(user && user.status && user.status._ === 'userStatusOnline');\n }\n\n private reduceParticipantsForOnlineCount(participants: {user_id: UserId}[]) {\n return participants.reduce((acc, participant) => {\n return acc + +this.verifyParticipantForOnlineCount(participant);\n }, 0);\n }\n\n public async getOnlines(id: ChatId): Promise {\n const minOnline = 1;\n if(this.appChatsManager.isBroadcast(id)) {\n return minOnline;\n }\n\n const chatInfo = await this.getChatFull(id);\n if(this.appChatsManager.isMegagroup(id)) {\n if((chatInfo as ChatFull.channelFull).participants_count <= 100) {\n const channelParticipants = await this.getChannelParticipants(id, {_: 'channelParticipantsRecent'}, 100);\n return this.reduceParticipantsForOnlineCount(channelParticipants.participants as ChannelParticipant.channelParticipant[]);\n }\n\n const res = await this.apiManager.invokeApiCacheable('messages.getOnlines', {\n peer: this.appChatsManager.getChannelInputPeer(id)\n }, {cacheSeconds: 60});\n\n const onlines = res.onlines ?? minOnline;\n return onlines;\n }\n\n const _participants = (chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants;\n if(_participants?.participants) {\n return this.reduceParticipantsForOnlineCount(_participants.participants);\n } else {\n return minOnline;\n }\n }\n\n private getTypingsKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? `_${threadId}` : '');\n }\n\n private onUpdateUserTyping = (update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping) => {\n const fromId = (update as Update.updateUserTyping).user_id ?\n (update as Update.updateUserTyping).user_id.toPeerId() :\n this.appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id);\n if(this.appPeersManager.peerId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n\n const topMsgId = (update as Update.updateChannelUserTyping).top_msg_id;\n const threadId = topMsgId ? generateMessageId(topMsgId) : undefined;\n const peerId = this.appPeersManager.getPeerId(update);\n const key = this.getTypingsKey(peerId, threadId);\n const typings = this.typingsInPeer[key] ??= [];\n let typing = typings.find((t) => t.userId === fromId);\n\n const cancelAction = () => {\n delete typing.timeout;\n // typings.findAndSplice((t) => t === typing);\n const idx = typings.indexOf(typing);\n if(idx !== -1) {\n typings.splice(idx, 1);\n }\n\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[key];\n }\n };\n\n if(typing?.timeout !== undefined) {\n clearTimeout(typing.timeout);\n }\n\n if(update.action._ === 'sendMessageCancelAction') {\n if(!typing) {\n return;\n }\n\n cancelAction();\n return;\n }\n\n if(!typing) {\n typing = {\n userId: fromId\n };\n\n typings.push(typing);\n }\n\n // console.log('updateChatUserTyping', update, typings);\n\n typing.action = update.action;\n\n const hasUser = this.appUsersManager.hasUser(fromId);\n if(!hasUser) {\n // let's load user here\n if(update._ === 'updateChatUserTyping') {\n if(update.chat_id && this.appChatsManager.hasChat(update.chat_id) && !this.appChatsManager.isChannel(update.chat_id)) {\n Promise.resolve(this.getChatFull(update.chat_id)).then(() => {\n if(typing.timeout !== undefined && this.appUsersManager.hasUser(fromId)) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n }\n });\n }\n }\n\n // return;\n } else {\n this.appUsersManager.forceUserOnline(fromId);\n }\n\n typing.timeout = ctx.setTimeout(cancelAction, 6000);\n if(hasUser) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = this.appPeersManager.getPeerId(update.peer_id);\n if(this.appPeersManager.isUser(peerId)) {\n const userId = peerId.toUserId();\n const userFull = this.usersFull[userId];\n if(userFull) {\n if(update.blocked) userFull.pFlags.blocked = true;\n else delete userFull.pFlags.blocked;\n }\n\n this.rootScope.dispatchEvent('user_full_update', userId);\n }\n\n this.rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\n };\n\n public getPeerTypings(peerId: PeerId, threadId?: number) {\n return this.typingsInPeer[this.getTypingsKey(peerId, threadId)];\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Awaited} from '../types';\n\nexport default function callbackifyAll(\n values: T,\n callback: (result: { -readonly [P in keyof T]: Awaited }) => R\n): Promise> | R {\n if(values.some((value) => value instanceof Promise)) {\n return Promise.all(values).then(callback as any);\n } else {\n return callback(values as any);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport assumeType from '../../helpers/assumeType';\nimport callbackify from '../../helpers/callbackify';\nimport callbackifyAll from '../../helpers/callbackifyAll';\nimport copy from '../../helpers/object/copy';\nimport pause from '../../helpers/schedulers/pause';\nimport {AvailableReaction, Message, MessagePeerReaction, MessagesAvailableReactions, Reaction, ReactionCount, Update, Updates} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport reactionsEqual from './utils/reactions/reactionsEqual';\n\nconst SAVE_DOC_KEYS = [\n 'static_icon' as const,\n 'appear_animation' as const,\n 'select_animation' as const,\n 'activate_animation' as const,\n 'effect_animation' as const,\n 'around_animation' as const,\n 'center_icon' as const\n];\n\nconst REFERENCE_CONTEXT: ReferenceContext = {\n type: 'reactions'\n};\n\nexport class AppReactionsManager extends AppManager {\n private availableReactions: AvailableReaction[];\n private sendReactionPromises: Map>;\n private lastSendingTimes: Map;\n\n protected after() {\n this.rootScope.addEventListener('language_change', () => {\n this.availableReactions = undefined;\n this.getAvailableReactions();\n });\n\n this.sendReactionPromises = new Map();\n this.lastSendingTimes = new Map();\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n Promise.resolve(this.getAvailableReactions()).then(async(availableReactions) => {\n for(const availableReaction of availableReactions) {\n await Promise.all([\n availableReaction.around_animation && this.apiFileManager.downloadMedia({media: availableReaction.around_animation}),\n availableReaction.static_icon && this.apiFileManager.downloadMedia({media: availableReaction.static_icon}),\n availableReaction.appear_animation && this.apiFileManager.downloadMedia({media: availableReaction.appear_animation}),\n availableReaction.center_icon && this.apiFileManager.downloadMedia({media: availableReaction.center_icon})\n ]);\n\n await pause(1000);\n }\n });\n }, 7.5e3);\n });\n }\n\n public getAvailableReactions() {\n if(this.availableReactions) return this.availableReactions;\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAvailableReactions',\n processResult: (messagesAvailableReactions) => {\n assumeType(messagesAvailableReactions);\n\n const availableReactions = this.availableReactions = messagesAvailableReactions.reactions;\n for(const reaction of availableReactions) {\n for(const key of SAVE_DOC_KEYS) {\n if(!reaction[key]) {\n continue;\n }\n\n reaction[key] = this.appDocsManager.saveDoc(reaction[key], REFERENCE_CONTEXT);\n }\n }\n\n return availableReactions;\n },\n params: {\n hash: 0\n }\n });\n }\n\n public getActiveAvailableReactions() {\n return callbackify(this.getAvailableReactions(), (availableReactions) => {\n return availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive);\n });\n }\n\n public getAvailableReactionsForPeer(peerId: PeerId) {\n const activeAvailableReactions = this.getActiveAvailableReactions();\n if(peerId.isUser()) {\n return this.unshiftQuickReaction(activeAvailableReactions);\n }\n\n const chatFull = this.appProfileManager.getChatFull(peerId.toChatId());\n return callbackifyAll([activeAvailableReactions, chatFull, this.getQuickReaction()], ([activeAvailableReactions, chatFull, quickReaction]) => {\n const chatAvailableReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n\n let filteredChatAvailableReactions: AvailableReaction[] = [];\n if(chatAvailableReactions._ === 'chatReactionsAll') {\n filteredChatAvailableReactions = activeAvailableReactions;\n } else if(chatAvailableReactions._ === 'chatReactionsSome') {\n filteredChatAvailableReactions = chatAvailableReactions.reactions.map((reaction) => {\n return activeAvailableReactions.find((availableReaction) => availableReaction.reaction === (reaction as Reaction.reactionEmoji).emoticon);\n }).filter(Boolean);\n }\n\n return this.unshiftQuickReactionInner(filteredChatAvailableReactions, quickReaction);\n });\n }\n\n private unshiftQuickReactionInner(availableReactions: AvailableReaction[], quickReaction: Reaction | AvailableReaction) {\n if(quickReaction && quickReaction._ !== 'reactionEmoji' && quickReaction._ !== 'availableReaction') return availableReactions;\n const emoticon = (quickReaction as Reaction.reactionEmoji).emoticon || (quickReaction as AvailableReaction).reaction;\n const availableReaction = findAndSplice(availableReactions, (availableReaction) => availableReaction.reaction === emoticon);\n if(availableReaction) {\n availableReactions.unshift(availableReaction);\n }\n\n return availableReactions;\n }\n\n private unshiftQuickReaction(\n availableReactions: AvailableReaction[] | PromiseLike,\n quickReaction: ReturnType = this.getQuickReaction()\n ) {\n return callbackifyAll([\n availableReactions,\n quickReaction\n ], ([availableReactions, quickReaction]) => {\n return this.unshiftQuickReactionInner(availableReactions, quickReaction);\n });\n }\n\n public getAvailableReactionsByMessage(message: Message.message) {\n if(!message) return [];\n const peerId = (message.fwd_from?.channel_post && this.appPeersManager.isMegagroup(message.peerId) && message.fwdFromId) || message.peerId;\n return this.getAvailableReactionsForPeer(peerId);\n }\n\n public isReactionActive(reaction: string) {\n if(!this.availableReactions) return false;\n return !!this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getQuickReaction() {\n return callbackifyAll([\n this.apiManager.getConfig(),\n this.getAvailableReactions()\n ], ([config, availableReactions]) => {\n const reaction = config.reactions_default;\n if(reaction?._ === 'reactionEmoji') {\n return availableReactions.find((availableReaction) => availableReaction.reaction === reaction.emoticon);\n }\n\n return reaction as Reaction.reactionCustomEmoji;\n });\n }\n\n public getReactionCached(reaction: string) {\n return this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getReaction(reaction: string) {\n return callbackify(this.getAvailableReactions(), () => {\n return this.getReactionCached(reaction);\n });\n }\n\n public getMessagesReactions(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessagesReactions',\n params: {\n id: mids.map((mid) => getServerMessageId(mid)),\n peer: this.appPeersManager.getInputPeerById(peerId)\n },\n processResult: (updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n // const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateMessageReactions') as Update.updateMessageReactions;\n // return update.reactions;\n }\n });\n }\n\n public getMessageReactionsList(peerId: PeerId, mid: number, limit: number, reaction?: Reaction, offset?: string) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessageReactionsList',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: getServerMessageId(mid),\n limit,\n reaction,\n offset\n },\n processResult: (messageReactionsList) => {\n this.appUsersManager.saveApiUsers(messageReactionsList.users);\n return messageReactionsList;\n }\n });\n }\n\n public setDefaultReaction(reaction: Reaction) {\n return this.apiManager.invokeApi('messages.setDefaultReaction', {reaction}).then(async(value) => {\n if(value) {\n const appConfig = await this.apiManager.getConfig();\n if(appConfig) {\n appConfig.reactions_default = reaction;\n }/* else { // if no config or loading it - overwrite\n this.apiManager.getAppConfig(true);\n } */\n\n this.rootScope.dispatchEvent('quick_reaction', reaction);\n }\n\n return value;\n });\n }\n\n public async sendReaction(message: Message.message, reaction?: Reaction | AvailableReaction, onlyLocal?: boolean) {\n if(reaction._ === 'availableReaction') {\n reaction = {\n _: 'reactionEmoji',\n emoticon: reaction.reaction\n };\n }\n\n const limit = await this.apiManager.getLimit('reactions');\n\n const lastSendingTimeKey = message.peerId + '_' + message.mid;\n const lastSendingTime = this.lastSendingTimes.get(lastSendingTimeKey);\n if(lastSendingTime) {\n return;\n } else {\n this.lastSendingTimes.set(lastSendingTimeKey, Date.now());\n setTimeout(() => {\n this.lastSendingTimes.delete(lastSendingTimeKey);\n }, 333);\n }\n\n const {peerId, mid} = message;\n const myPeerId = this.appPeersManager.peerId;\n\n const unsetReactionCount = (reactionCount: ReactionCount) => {\n --reactionCount.count;\n delete reactionCount.chosen_order;\n\n if(reactionsEqual(reaction as Reaction, reactionCount.reaction)) {\n reaction = undefined as Reaction;\n }\n\n if(!reactionCount.count) {\n indexOfAndSplice(reactions.results, reactionCount);\n }/* else {\n insertInDescendSortedArray(reactions.results, chosenReaction, 'count', chosenReactionIdx);\n } */\n\n if(reactions.recent_reactions) {\n findAndSplice(reactions.recent_reactions, (recentReaction) => reactionsEqual(recentReaction.reaction, reactionCount.reaction) && this.appPeersManager.getPeerId(recentReaction.peer_id) === myPeerId);\n }\n\n if(!reactions.results.length) {\n reactions = undefined;\n }\n };\n\n const canSeeList = message.reactions?.pFlags?.can_see_list || !this.appPeersManager.isBroadcast(message.peerId) || message.peerId.isUser();\n if(!message.reactions) {\n message.reactions = {\n _: 'messageReactions',\n results: [],\n recent_reactions: canSeeList ? [] : undefined,\n pFlags: {\n can_see_list: canSeeList || undefined\n }\n };\n }\n\n let reactions = onlyLocal ? message.reactions : copy(message.reactions);\n const chosenReactions = reactions.results.filter((reactionCount) => reactionCount.chosen_order !== undefined);\n chosenReactions.sort((a, b) => b.chosen_order - a.chosen_order);\n const unsetReactions: ReactionCount[] = [];\n const chosenReactionIdx = chosenReactions.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\n if(chosenReactionIdx !== -1) unsetReactions.push(...chosenReactions.splice(chosenReactionIdx, 1));\n unsetReactions.push(...chosenReactions.splice(limit - +(chosenReactionIdx === -1)));\n unsetReactions.forEach((reactionCount) => {\n chosenReactions.forEach((chosenReactionCount) => {\n if(chosenReactionCount.chosen_order > reactionCount.chosen_order) {\n --chosenReactionCount.chosen_order;\n }\n });\n\n unsetReactionCount(reactionCount);\n });\n\n const chosenReactionsLength = chosenReactions.length;\n chosenReactions.forEach((reactionCount, idx) => {\n reactionCount.chosen_order = chosenReactionsLength - 1 - idx;\n });\n\n if(reaction) {\n if(!reactions) {\n reactions/* = message.reactions */ = {\n _: 'messageReactions',\n results: [],\n pFlags: {}\n };\n\n if(canSeeList) {\n reactions.pFlags.can_see_list = true;\n }\n }\n\n let reactionCountIdx = reactions.results.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\n let reactionCount = reactionCountIdx !== -1 && reactions.results[reactionCountIdx];\n if(!reactionCount) {\n reactionCount = {\n _: 'reactionCount',\n count: 0,\n reaction\n };\n\n reactionCountIdx = reactions.results.push(reactionCount) - 1;\n }\n\n ++reactionCount.count;\n reactionCount.chosen_order = chosenReactions.length ? chosenReactions[0].chosen_order + 1 : 0;\n chosenReactions.unshift(reactionCount);\n\n if(!reactions.recent_reactions && canSeeList) {\n reactions.recent_reactions = [];\n }\n\n if(reactions.recent_reactions) {\n const peerReaction: MessagePeerReaction = {\n _: 'messagePeerReaction',\n reaction,\n peer_id: this.appPeersManager.getOutputPeer(myPeerId)\n };\n\n if(!this.appPeersManager.isMegagroup(peerId) && false) {\n reactions.recent_reactions.push(peerReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(-3);\n } else {\n reactions.recent_reactions.unshift(peerReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(0, 3);\n }\n }\n\n // insertInDescendSortedArray(reactions.results, reactionCount, 'count', reactionCountIdx);\n }\n\n const availableReactions = this.availableReactions;\n if(reactions && availableReactions?.length) {\n const indexes: Map = new Map();\n availableReactions.forEach((availableReaction, idx) => {\n indexes.set(availableReaction.reaction, idx);\n });\n\n reactions.results.sort((a, b) => {\n const id1 = (a.reaction as Reaction.reactionCustomEmoji).document_id || (a.reaction as Reaction.reactionEmoji).emoticon;\n const id2 = (b.reaction as Reaction.reactionCustomEmoji).document_id || (b.reaction as Reaction.reactionEmoji).emoticon;\n return (b.count - a.count) || ((indexes.get(id1) ?? 0) - (indexes.get(id2) ?? 0));\n });\n }\n\n if(onlyLocal) {\n message.reactions = reactions;\n this.rootScope.dispatchEvent('messages_reactions', [{message, changedResults: []}]);\n return Promise.resolve();\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: message.peer_id,\n msg_id: message.id,\n reactions: reactions,\n local: true\n });\n\n const promiseKey = [peerId, mid].join('-');\n const msgId = getServerMessageId(mid);\n const promise = this.apiManager.invokeApi('messages.sendReaction', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: msgId,\n reaction: chosenReactions.map((reactionCount) => reactionCount.reaction)\n }).then((updates) => {\n assumeType(updates);\n\n const editMessageUpdateIdx = updates.updates.findIndex((update) => update._ === 'updateEditMessage' || update._ === 'updateEditChannelMessage');\n if(editMessageUpdateIdx !== -1) {\n const editMessageUpdate = updates.updates[editMessageUpdateIdx] as Update.updateEditMessage | Update.updateEditChannelMessage;\n updates.updates[editMessageUpdateIdx] = {\n _: 'updateMessageReactions',\n msg_id: msgId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n reactions: (editMessageUpdate.message as Message.message).reactions,\n pts: editMessageUpdate.pts,\n pts_count: editMessageUpdate.pts_count\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }).catch((err) => {\n if(err.type === 'REACTION_INVALID' && this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReaction(message, chosenReactions[0]?.reaction, true);\n }\n }).finally(() => {\n if(this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReactionPromises.delete(promiseKey);\n }\n });\n\n this.sendReactionPromises.set(promiseKey, promise);\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from './appDocsManager';\nimport type {DownloadOptions} from '../mtproto/apiFileManager';\nimport {Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFavedStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered, Update} from '../../layer';\nimport {Modify} from '../../types';\nimport AppStorage from '../storage';\nimport DATABASE_STATE from '../../config/databases/state';\nimport assumeType from '../../helpers/assumeType';\nimport fixBase64String from '../../helpers/fixBase64String';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport {AppManager} from './manager';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport ctx from '../../environment/ctx';\nimport {getEnvironment} from '../../environment/utils';\nimport getDocumentInput from './utils/docs/getDocumentInput';\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\n\nconst CACHE_TIME = 3600e3;\n\ntype LOCAL_STICKER_SET_ID = Extract<\n InputStickerSet['_'],\n 'inputStickerSetAnimatedEmoji' | 'inputStickerSetAnimatedEmojiAnimations' |\n 'inputStickerSetPremiumGifts' | 'inputStickerSetEmojiGenericAnimations' |\n 'inputStickerSetEmojiDefaultStatuses' | 'inputStickerSetEmojiDefaultTopicIcons'\n>;\n\ntype LOCAL_ID = 'EMOJI' | 'EMOJI_ANIMATIONS' | 'PREMIUM_GIFTS' | 'GENERIC_ANIMATIONS' | 'DEFAULT_STATUSES' | 'DEFAULT_TOPIC_ICONS';\n\nconst LOCAL_IDS: {[key in LOCAL_ID]: LOCAL_STICKER_SET_ID} = {\n EMOJI: 'inputStickerSetAnimatedEmoji',\n EMOJI_ANIMATIONS: 'inputStickerSetAnimatedEmojiAnimations',\n PREMIUM_GIFTS: 'inputStickerSetPremiumGifts',\n GENERIC_ANIMATIONS: 'inputStickerSetEmojiGenericAnimations',\n DEFAULT_STATUSES: 'inputStickerSetEmojiDefaultStatuses',\n DEFAULT_TOPIC_ICONS: 'inputStickerSetEmojiDefaultTopicIcons'\n}\n\nconst LOCAL_IDS_SET: Set = new Set(Object.values(LOCAL_IDS) as any);\n\n// let TEST_FILE_REFERENCE_REFRESH = true;\n\nexport type MyStickerSetInput = {\n id: StickerSet.stickerSet['id'],\n access_hash?: StickerSet.stickerSet['access_hash']\n};\n\nexport type MyMessagesStickerSet = MessagesStickerSet.messagesStickerSet;\n\nexport class AppStickersManager extends AppManager {\n private storage = new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'stickerSets');\n\n private getStickerSetPromises: {[setId: Long]: Promise};\n private getStickersByEmoticonsPromises: {[emoticon: string]: Promise};\n\n private greetingStickers: MyDocument[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise;\n\n private sounds: Record;\n private getAnimatedEmojiSoundsPromise: Promise;\n\n private favedStickers: MyDocument[];\n private recentStickers: MyDocument[];\n\n private names: Record;\n\n protected after() {\n this.getStickerSetPromises = {};\n this.getStickersByEmoticonsPromises = {};\n this.sounds = {};\n this.names = {};\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n this.getAnimatedEmojiStickerSet();\n // this.getFavedStickersStickers();\n }, 1000);\n\n if(!this.getGreetingStickersPromise && this.getGreetingStickersTimeout === undefined) {\n this.getGreetingStickersTimeout = ctx.setTimeout(() => {\n this.getGreetingStickersTimeout = undefined;\n this.getGreetingSticker(true);\n }, 5000);\n }\n });\n\n this.rootScope.addEventListener('app_config', () => this.onStickersUpdated('faved', true));\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateNewStickerSet: (update) => {\n const stickerSet = update.stickerset as MyMessagesStickerSet;\n this.saveStickerSet(stickerSet, stickerSet.set.id);\n this.rootScope.dispatchEvent('stickers_installed', stickerSet.set);\n },\n\n updateRecentStickers: () => this.onStickersUpdated('recent', true),\n\n updateFavedStickers: () => this.onStickersUpdated('faved', true),\n\n updateMoveStickerSetToTop: (update) => {\n this.rootScope.dispatchEvent('stickers_top', update.stickerset);\n }\n });\n }\n\n private async onStickersUpdated(type: 'faved' | 'recent', overwrite: boolean) {\n const stickers = await (type === 'faved' ? this.getFavedStickersStickers(overwrite) : this.getRecentStickersStickers(overwrite));\n this.rootScope.dispatchEvent('stickers_updated', {\n type,\n stickers\n });\n }\n\n public getGreetingSticker(justPreload = false) {\n if(this.getGreetingStickersTimeout) {\n clearTimeout(this.getGreetingStickersTimeout);\n this.getGreetingStickersTimeout = undefined;\n }\n\n if(!this.getGreetingStickersPromise) {\n this.getGreetingStickersPromise = this.getStickersByEmoticon('👋⭐️', false).then((docs) => {\n if(!docs.length) throw 'NO_STICKERS';\n this.greetingStickers = docs.slice() as Document.document[];\n this.greetingStickers.sort((a, b) => Math.random() - Math.random());\n });\n }\n\n return this.getGreetingStickersPromise.then(() => {\n let doc: Document.document;\n if(!justPreload) {\n doc = this.greetingStickers.shift();\n this.greetingStickers.push(doc);\n }\n\n this.apiFileManager.downloadMedia({media: this.greetingStickers[0]}); // preload next sticker\n\n return doc;\n });\n }\n\n private saveStickers(docs: Document[]) {\n forEachReverse(docs, (doc, idx) => {\n doc = this.appDocsManager.saveDoc(doc);\n\n if(!doc) docs.splice(idx, 1);\n else docs[idx] = doc;\n });\n }\n\n private canUseStickerSetCache(set: MyMessagesStickerSet, useCache?: boolean) {\n return set && set.documents?.length && ((Date.now() - set.refreshTime) < CACHE_TIME || useCache);\n }\n\n public getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise | MyMessagesStickerSet {\n let {id} = set;\n if(!set.access_hash) {\n set = this.names[id] || set;\n id = set.id;\n }\n\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n if(!params.overwrite) {\n const cachedSet = this.storage.getFromCache(id);\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\n return cachedSet;\n }\n }\n\n const promise = this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n const cachedSet = await this.storage.get(id);\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n\n if(this.getStickerSetPromises[id] === promise) {\n delete this.getStickerSetPromises[id];\n }\n\n return;\n }\n }\n\n try {\n const stickerSet = await this.apiManager.invokeApi('messages.getStickerSet', {\n stickerset: this.getStickerSetInput(set),\n hash: 0\n }) as MyMessagesStickerSet;\n\n const saveById = params.saveById ? id : stickerSet.set.id;\n this.saveStickerSet(stickerSet, saveById);\n\n resolve(stickerSet);\n } catch(err) {\n resolve(null);\n }\n\n if(this.getStickerSetPromises[id] === promise) {\n delete this.getStickerSetPromises[id];\n }\n });\n\n return promise;\n }\n\n public getLocalStickerSet(id: LOCAL_STICKER_SET_ID) {\n return this.getStickerSet({id}, {saveById: true});\n }\n\n public getAnimatedEmojiStickerSet() {\n return Promise.all([\n this.getLocalStickerSet(LOCAL_IDS.EMOJI),\n this.getLocalStickerSet(LOCAL_IDS.EMOJI_ANIMATIONS),\n this.getAnimatedEmojiSounds()\n ]).then(([emoji, animations]) => {\n return {emoji, animations};\n });\n }\n\n public getAnimatedEmojiSounds(overwrite?: boolean) {\n if(this.getAnimatedEmojiSoundsPromise && !overwrite) return this.getAnimatedEmojiSoundsPromise;\n const promise = this.getAnimatedEmojiSoundsPromise = Promise.all([\n this.apiManager.getAppConfig(overwrite),\n this.apiManager.getConfig()\n ]).then(([appConfig, config]) => {\n if(this.getAnimatedEmojiSoundsPromise !== promise) {\n return;\n }\n\n for(const emoji in appConfig.emojies_sounds) {\n const sound = appConfig.emojies_sounds[emoji];\n const bytesStr = atob(fixBase64String(sound.file_reference_base64, false));\n const bytes = new Uint8Array(bytesStr.length);\n for(let i = 0, length = bytes.length; i < length; ++i) {\n bytes[i] = bytesStr[i].charCodeAt(0);\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // bytes[0] = bytes[1] = bytes[2] = bytes[3] = bytes[4] = 0;\n // sound.access_hash += '999';\n // }\n\n const doc = this.appDocsManager.saveDoc({\n _: 'document',\n pFlags: {},\n flags: 0,\n id: sound.id,\n access_hash: sound.access_hash,\n attributes: [{\n _: 'documentAttributeAudio',\n duration: 1,\n pFlags: {\n voice: true\n }\n }],\n date: 0,\n dc_id: config.this_dc,\n file_reference: bytes,\n mime_type: 'audio/ogg'\n // size: 101010 // test loading everytime\n }, {\n type: 'emojiesSounds'\n });\n\n this.sounds[emoji] = doc;\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // TEST_FILE_REFERENCE_REFRESH = false;\n // }\n });\n\n return promise;\n }\n\n public async getRecentStickers(overwrite?: boolean): Promise> {\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.getRecentStickers',\n processResult: (res) => {\n assumeType(res);\n\n this.recentStickers = res.stickers as MyDocument[];\n this.saveStickers(res.stickers);\n return res;\n },\n overwrite\n });\n\n return res;\n }\n\n public getRecentStickersStickers(overwrite?: boolean) {\n if(overwrite) this.recentStickers = undefined;\n else if(this.recentStickers) return this.recentStickers;\n return this.getRecentStickers(overwrite).then(() => this.recentStickers);\n }\n\n public saveRecentSticker(docId: DocId, unsave?: boolean, attached?: boolean) {\n const doc = this.appDocsManager.getDoc(docId);\n\n findAndSplice(this.recentStickers, (_doc) => _doc.id === docId);\n if(!unsave) {\n this.recentStickers.unshift(doc);\n\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\n for(const emoticon in this.getStickersByEmoticonsPromises) {\n const promise = this.getStickersByEmoticonsPromises[emoticon];\n promise.then((stickers) => {\n const _doc = findAndSplice(stickers, (_doc) => _doc.id === doc.id);\n if(_doc) {\n stickers.unshift(_doc);\n } else if(emoticon.includes(docEmoticon)) {\n stickers.unshift(doc);\n }\n });\n }\n }\n\n this.rootScope.dispatchEvent('sticker_updated', {type: 'recent', faved: !unsave, document: doc});\n\n if(unsave) {\n this.onStickersUpdated('recent', false);\n }\n\n return this.apiManager.invokeApi('messages.saveRecentSticker', {\n id: getDocumentInput(doc),\n unsave,\n attached\n });\n }\n\n private cleanEmoji(emoji: string) {\n return emoji.replace(/\\ufe0f/g, '').replace(/🏻|🏼|🏽|🏾|🏿/g, '');\n }\n\n public getAnimatedEmojiSticker(emoji: string, isAnimation?: boolean) {\n const id = isAnimation ? LOCAL_IDS.EMOJI_ANIMATIONS : LOCAL_IDS.EMOJI;\n const stickerSet = this.storage.getFromCache(id);\n // const stickerSet = await this.getStickerSet({id});\n if(!stickerSet?.documents) return;\n\n if(isAnimation) {\n if(['🧡', '💛', '💚', '💙', '💜', '🖤', '🤍', '🤎'].includes(emoji)) {\n emoji = '❤️';\n }\n }\n\n emoji = this.cleanEmoji(emoji);\n const pack = stickerSet.packs.find((p) => p.emoticon === emoji);\n return pack ? this.appDocsManager.getDoc(pack.documents[0]) : undefined;\n }\n\n public getAnimatedEmojiSoundDocument(emoji: string) {\n return this.sounds[this.cleanEmoji(emoji)];\n }\n\n public preloadAnimatedEmojiSticker(emoji: string) {\n const preloadEmojiPromise = this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji);\n });\n\n return Promise.all([\n preloadEmojiPromise,\n this.preloadAnimatedEmojiStickerAnimation(emoji)\n ]).then(([doc, a]) => {\n return {\n doc: doc,\n animation: a?.doc,\n sound: a?.sound\n };\n });\n }\n\n public preloadAnimatedEmojiStickerAnimation(emoji: string) {\n return this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji, true);\n }).then((doc) => {\n if(!doc) {\n return;\n }\n\n const sound = this.getAnimatedEmojiSoundDocument(emoji);\n return Promise.all([\n this.preloadSticker(doc.id),\n sound ? this.preloadSticker(sound.id) : undefined\n ]).then(() => {\n return {doc, sound};\n });\n });\n }\n\n public preloadSticker(docId: DocId, isPremiumEffect?: boolean) {\n const doc = this.appDocsManager.getDoc(docId);\n return this.apiFileManager.downloadMedia({media: doc, thumb: isPremiumEffect ? doc.video_thumbs?.[0] : undefined});\n }\n\n private saveStickerSet(res: Omit, id: DocId) {\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[],\n keywords: res.keywords\n };\n\n let stickerSet = this.storage.getFromCache(id);\n if(stickerSet) {\n Object.assign(stickerSet, newSet);\n } else {\n stickerSet = this.storage.setToCache(id, newSet);\n }\n\n if(stickerSet.set.short_name) {\n this.names[stickerSet.set.short_name] = this.getStickerSetInput(newSet.set) as any;\n }\n\n this.saveStickers(res.documents);\n\n // console.log('stickers wrote', this.stickerSets);\n const needSave = stickerSet.set.installed_date || LOCAL_IDS_SET.has(id as any);\n stickerSet.refreshTime = Date.now();\n this.storage.set({[id]: stickerSet}, !needSave);\n }\n\n public getStickerSetThumbDownloadOptions(stickerSet: StickerSet.stickerSet): DownloadOptions {\n const thumb = stickerSet.thumbs.find((thumb) => thumb._ === 'photoSize') as PhotoSize.photoSize;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: InputFileLocation.inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n thumb_version: stickerSet.thumb_version\n };\n\n return {dcId, location: input, size: thumb.size, mimeType: isAnimated ? 'application/x-tgsticker' : 'image/webp'};\n }\n\n /* public getStickerSetThumbURL(stickerSet: MTStickerSet) {\n const thumb = stickerSet.thumb;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n volume_id: thumb.location.volume_id,\n local_id: thumb.location.local_id\n };\n\n const url = getFileURL('document', this.getStickerSetThumbDownloadOptions(stickerSet));\n return url;\n\n //return promise;\n } */\n\n public getStickerSetInput(set: MyStickerSetInput): InputStickerSet {\n if(LOCAL_IDS_SET.has(set.id as any)) {\n return {\n _: set.id as any\n };\n } else if(!set.access_hash) {\n return {\n _: 'inputStickerSetShortName',\n short_name: '' + set.id\n };\n } else {\n return {\n _: 'inputStickerSetID',\n id: set.id,\n access_hash: set.access_hash\n };\n }\n }\n\n public async getFeaturedStickers() {\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.getFeaturedStickers',\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n return res.sets;\n }\n\n public getPromoPremiumStickers() {\n return this.getStickersByEmoticon('⭐️⭐️', false);\n }\n\n public getPremiumStickers() {\n return this.getStickersByEmoticon('📂⭐️', false);\n }\n\n public getFavedStickers(overwrite?: boolean) {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getFavedStickers',\n processResult: (favedStickers) => {\n assumeType(favedStickers);\n this.saveStickers(favedStickers.stickers);\n this.favedStickers = favedStickers.stickers as MyDocument[];\n return favedStickers;\n },\n overwrite\n });\n }\n\n public getFavedStickersStickers(overwrite?: boolean) {\n if(overwrite) this.favedStickers = undefined;\n else if(this.favedStickers) return this.favedStickers;\n return this.getFavedStickers(overwrite).then(() => this.favedStickers);\n }\n\n public getFavedStickersLimit() {\n return this.apiManager.getLimit('favedStickers');\n }\n\n public async faveSticker(docId: DocId, unfave?: boolean) {\n if(!this.favedStickers) {\n await this.getFavedStickersStickers();\n }\n\n const limit = await this.getFavedStickersLimit();\n\n const doc = this.appDocsManager.getDoc(docId);\n findAndSplice(this.favedStickers, (_doc) => _doc.id === doc.id);\n\n if(!unfave) {\n this.favedStickers.unshift(doc);\n const spliced = this.favedStickers.splice(limit, this.favedStickers.length - limit);\n }\n\n this.rootScope.dispatchEvent('sticker_updated', {type: 'faved', faved: !unfave, document: doc});\n\n return this.apiManager.invokeApi('messages.faveSticker', {\n id: getDocumentInput(doc),\n unfave\n }).then(() => {\n if(unfave) {\n this.onStickersUpdated('faved', true);\n }\n });\n }\n\n public async toggleStickerSet(set: StickerSet.stickerSet) {\n set = this.storage.getFromCache(set.id).set;\n\n if(set.installed_date) {\n const res = await this.apiManager.invokeApi('messages.uninstallStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n\n if(res) {\n delete set.installed_date;\n this.rootScope.dispatchEvent('stickers_deleted', set);\n this.storage.delete(set.id, true);\n return true;\n }\n } else {\n const res = await this.apiManager.invokeApi('messages.installStickerSet', {\n stickerset: this.getStickerSetInput(set),\n archived: false\n });\n\n if(res) {\n set.installed_date = Date.now() / 1000 | 0;\n this.rootScope.dispatchEvent('stickers_installed', set);\n return true;\n }\n }\n\n return false;\n }\n\n public toggleStickerSets(sets: StickerSet.stickerSet[]) {\n return Promise.all(sets.map((set) => this.toggleStickerSet(set)));\n }\n\n public async searchStickerSets(query: string, excludeFeatured = true) {\n const flags = excludeFeatured ? 1 : 0;\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.searchStickerSets',\n params: {\n flags,\n exclude_featured: excludeFeatured || undefined,\n q: query\n },\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(const id in cache) {\n const {set} = cache[id];\n\n if(set.title.toLowerCase().includes(query.toLowerCase()) && !res.sets.find((c) => c.set.id === set.id)) {\n foundSaved.push({_: 'stickerSetCovered', set, cover: null});\n }\n }\n\n return res.sets.concat(foundSaved);\n }\n\n private processAllStickersResult = (allStickers: MessagesAllStickers) => {\n assumeType(allStickers);\n\n forEachReverse(allStickers.sets, (stickerSet, idx, arr) => {\n if(stickerSet.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n return allStickers;\n };\n\n public getAllStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getAllStickers',\n processResult: this.processAllStickersResult\n });\n }\n\n public getEmojiStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getEmojiStickers',\n processResult: this.processAllStickersResult\n });\n }\n\n public preloadStickerSets() {\n return this.getAllStickers().then((allStickers) => {\n return Promise.all((allStickers as MessagesAllStickers.messagesAllStickers).sets.map((set) => this.getStickerSet(set, {useCache: true})));\n });\n }\n\n // TODO: detect \"🤷\" by \"🤷‍♂️\"\n public getStickersByEmoticon(emoticon: string, includeOurStickers = true) {\n emoticon = fixEmoji(emoticon);\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\n\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\n this.apiManager.invokeApiHashable({\n method: 'messages.getStickers',\n params: {\n emoticon\n },\n processResult: (stickers) => stickers\n }),\n includeOurStickers ? this.preloadStickerSets() : [],\n includeOurStickers ? this.getRecentStickers() : undefined\n ]).then(([messagesStickers, installedSets, recentStickers]) => {\n const foundStickers = (messagesStickers as MessagesStickers.messagesStickers).stickers.map((sticker) => this.appDocsManager.saveDoc(sticker));\n const cachedStickersAnimated: Document.document[] = [], cachedStickersStatic: Document.document[] = [];\n\n // console.log('getStickersByEmoticon', messagesStickers, installedSets, recentStickers);\n\n const iteratePacks = (packs: StickerPack.stickerPack[]) => {\n for(const pack of packs) {\n const packEmoticon = fixEmoji(pack.emoticon);\n if(packEmoticon.includes(emoticon)) {\n for(const docId of pack.documents) {\n const doc = this.appDocsManager.getDoc(docId);\n (doc.animated ? cachedStickersAnimated : cachedStickersStatic).push(doc);\n }\n }\n }\n };\n\n if(recentStickers) {\n iteratePacks(recentStickers.packs);\n const stickers = recentStickers.stickers;\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\n s.sort((a, b) => stickers.indexOf(a) - stickers.indexOf(b));\n });\n }\n\n for(const set of installedSets) {\n iteratePacks(set.packs);\n }\n\n /* const entities = parseEntities(emoticon);\n if(entities.length === 1) {\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\n forEachReverse(s, (doc, idx) => {\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\n if(docEmoticon !== emoticon) {\n s.splice(idx, 1);\n }\n });\n });\n } */\n\n const stickers = [...new Set(cachedStickersAnimated.concat(cachedStickersStatic, foundStickers))]/* .filter((doc) => !doc.animated) */;\n\n forEachReverse(stickers, (sticker, idx, arr) => {\n if((sticker.sticker === 3 && !getEnvironment().IS_WEBM_SUPPORTED) ||\n (!this.rootScope.premium && getStickerEffectThumb(sticker))) {\n arr.splice(idx, 1);\n }\n });\n\n return stickers;\n });\n }\n\n public clearRecentStickers() {\n if(this.recentStickers) {\n this.recentStickers.length = 0;\n this.onStickersUpdated('recent', false);\n }\n\n return this.apiManager.invokeApi('messages.clearRecentStickers');\n }\n}\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport filterUnique from '../../helpers/array/filterUnique';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport cleanSearchText from '../../helpers/cleanSearchText';\nimport cleanUsername from '../../helpers/cleanUsername';\nimport tsNow from '../../helpers/tsNow';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {isRestricted} from '../../helpers/restrictions';\nimport {Chat, ContactsResolvedPeer, InputContact, InputGeoPoint, InputMedia, InputPeer, InputUser, User as MTUser, UserProfilePhoto, UserStatus} from '../../layer';\nimport parseEntities from '../richTextProcessor/parseEntities';\nimport wrapUrl from '../richTextProcessor/wrapUrl';\nimport SearchIndex from '../searchIndex';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\nimport canSendToUser from './utils/users/canSendToUser';\nimport {AppStoragesManager} from './appStoragesManager';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\n\nexport type User = MTUser.user;\nexport type TopPeerType = 'correspondents' | 'bots_inline';\nexport type MyTopPeer = {id: PeerId, rating: number};\n\nexport class AppUsersManager extends AppManager {\n private storage: AppStoragesManager['storages']['users'];\n\n private users: {[userId: UserId]: User};\n private usernames: {[username: string]: PeerId};\n private contactsIndex: SearchIndex;\n private contactsFillPromise: CancellablePromise;\n private contactsList: Set;\n private updatedContactsList: boolean;\n\n private getTopPeersPromises: {[type in TopPeerType]?: Promise};\n\n protected after() {\n this.clear(true);\n\n setInterval(this.updateUsersStatuses, 60000);\n\n this.rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateUserStatus: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n user.status = update.status;\n if(user.status) {\n if('expires' in user.status) {\n user.status.expires -= this.timeManager.getServerTimeOffset();\n }\n\n if('was_online' in user.status) {\n user.status.was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', userId);\n this.setUserToStateIfNeeded(user);\n } // ////else console.warn('No user by id:', userId);\n },\n\n // updateUserPhoto: (update) => {\n // const userId = update.user_id;\n // const user = this.users[userId];\n // if(user) {\n // if((user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id === (update.photo as UserProfilePhoto.userProfilePhoto)?.photo_id) {\n // return;\n // }\n\n // this.forceUserOnline(userId, update.date);\n\n // if(update.photo._ === 'userProfilePhotoEmpty') {\n // delete user.photo;\n // } else {\n // user.photo = safeReplaceObject(user.photo, update.photo);\n // }\n\n // this.setUserToStateIfNeeded(user);\n\n // this.rootScope.dispatchEvent('user_update', userId);\n // this.rootScope.dispatchEvent('avatar_update', userId.toPeerId());\n // } else console.warn('No user by id:', userId);\n // },\n\n updateUserName: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n this.forceUserOnline(userId);\n\n this.saveApiUser({\n ...user,\n first_name: update.first_name,\n last_name: update.last_name,\n username: undefined,\n usernames: update.usernames\n }, true);\n }\n }\n });\n\n /* case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\n break; */\n\n this.rootScope.addEventListener('language_change', (e) => {\n const userId = this.getSelf().id;\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('users')\n ]).then(([state, {results: users, storage}]) => {\n this.storage = storage;\n\n this.saveApiUsers(users);\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(!user) {\n continue;\n }\n\n if(state.contactsListCachedTime && (user.pFlags.contact || user.pFlags.mutual_contact)) {\n this.pushContact(user.id);\n\n if(!this.contactsFillPromise) {\n this.contactsFillPromise = deferredPromise();\n this.contactsFillPromise.resolve(this.contactsList);\n }\n }\n }\n\n // const contactsList = state.contactsList;\n // if(Array.isArray(contactsList)) {\n // contactsList.forEach((userId) => {\n // this.pushContact(userId);\n // });\n\n // if(contactsList.length) {\n // this.contactsFillPromise = deferredPromise();\n // this.contactsFillPromise.resolve(this.contactsList);\n // }\n // }\n\n const recentSearch = state.recentSearch || [];\n for(let i = 0, length = recentSearch.length; i < length; ++i) {\n this.peersStorage.requestPeer(recentSearch[i], 'recentSearch');\n }\n\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\n if(!this.appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(!this.storage.getFromCache(userId)) {\n this.storage.set({\n [userId]: this.getUser(userId)\n });\n }\n });\n\n this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\n if(!this.appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(this.storage.getFromCache(userId)) {\n this.storage.delete(userId);\n }\n });\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n for(const userId in this.users) {\n // const userId = +userId;\n if(!userId) continue;\n const peerId = userId.toPeerId();\n if(!this.peersStorage.isPeerNeeded(peerId)) {\n const user = this.users[userId];\n this.modifyUsernamesCache(user, false);\n\n this.storage.delete(userId);\n delete this.users[userId];\n }\n }\n } else {\n this.users = {};\n this.usernames = {};\n }\n\n this.getTopPeersPromises = {};\n this.contactsIndex = this.createSearchIndex();\n this.contactsFillPromise = undefined;\n this.contactsList = new Set();\n this.updatedContactsList = false;\n };\n\n public get userId() {\n return this.rootScope.myId.toUserId();\n }\n\n private onContactsModified(fromServer?: boolean) {\n // const contactsList = [...this.contactsList];\n // this.appStateManager.pushToState('contactsList', contactsList);\n\n if(fromServer) {\n this.appStateManager.pushToState('contactsListCachedTime', tsNow(true));\n }\n }\n\n public pushRecentSearch(peerId: PeerId) {\n return this.appStateManager.getState().then((state) => {\n const recentSearch = state.recentSearch || [];\n if(recentSearch[0] !== peerId) {\n indexOfAndSplice(recentSearch, peerId);\n recentSearch.unshift(peerId);\n if(recentSearch.length > 20) {\n recentSearch.length = 20;\n }\n\n this.appStateManager.pushToState('recentSearch', recentSearch);\n for(const peerId of recentSearch) {\n this.peersStorage.requestPeer(peerId, 'recentSearch');\n }\n }\n });\n }\n\n public clearRecentSearch() {\n return this.appStateManager.getState().then((state) => {\n const recentSearch = state.recentSearch || [];\n for(const peerId of recentSearch) {\n this.peersStorage.releasePeer(peerId, 'recentSearch');\n }\n\n recentSearch.length = 0;\n this.appStateManager.pushToState('recentSearch', recentSearch);\n });\n }\n\n public fillContacts() {\n if(this.contactsFillPromise && this.updatedContactsList) {\n return {\n cached: this.contactsFillPromise.isFulfilled,\n promise: this.contactsFillPromise\n };\n }\n\n this.updatedContactsList = true;\n\n const promise = deferredPromise>();\n this.apiManager.invokeApi('contacts.getContacts').then((result) => {\n if(result._ === 'contacts.contacts') {\n this.contactsList.clear();\n\n this.saveApiUsers(result.users);\n\n result.contacts.forEach((contact) => {\n this.pushContact(contact.user_id);\n });\n\n this.onContactsModified(true);\n\n this.contactsFillPromise = promise;\n }\n\n promise.resolve(this.contactsList);\n }, () => {\n this.updatedContactsList = false;\n });\n\n return {\n cached: this.contactsFillPromise?.isFulfilled,\n promise: this.contactsFillPromise ||= promise\n };\n }\n\n public resolveUsername(username: string): Promise | Chat | User {\n if(username[0] === '@') {\n username = username.slice(1);\n }\n\n username = username.toLowerCase();\n const peerId = this.usernames[username];\n if(peerId) {\n return this.appPeersManager.getPeer(peerId);\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'contacts.resolveUsername',\n params: {username},\n processResult: (resolvedPeer) => this.processResolvedPeer(resolvedPeer)\n });\n }\n\n private processResolvedPeer(resolvedPeer: ContactsResolvedPeer.contactsResolvedPeer) {\n this.saveApiUsers(resolvedPeer.users);\n this.appChatsManager.saveApiChats(resolvedPeer.chats);\n\n return this.appPeersManager.getPeer(getPeerId(resolvedPeer.peer)) as Chat | User;\n }\n\n public resolvePhone(phone: string) {\n return this.apiManager.invokeApi('contacts.resolvePhone', {phone}).then((resolvedPeer) => {\n return this.processResolvedPeer(resolvedPeer) as User;\n });\n }\n\n private pushContact(id: UserId) {\n this.contactsList.add(id);\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\n this.peersStorage.requestPeer(id.toPeerId(), 'contact');\n }\n\n private popContact(id: UserId) {\n this.contactsList.delete(id);\n this.contactsIndex.indexObject(id, ''); // delete search index\n this.peersStorage.releasePeer(id.toPeerId(), 'contact');\n }\n\n public getUserSearchText(id: UserId) {\n const user = this.users[id];\n if(!user) {\n return '';\n }\n\n const arr: string[] = [\n user.first_name,\n user.last_name,\n user.phone,\n ...getPeerActiveUsernames(user),\n // user.pFlags.self ? I18n.format('SavedMessages', true) : '',\n user.pFlags.self ? 'Saved Messages' : ''\n ];\n\n return arr.filter(Boolean).join(' ');\n }\n\n public getContacts(query?: string, includeSaved = false, sortBy: 'name' | 'online' | 'none' = 'name') {\n return this.fillContacts().promise.then((_contactsList) => {\n let contactsList = [..._contactsList];\n if(query) {\n const results = this.contactsIndex.search(query);\n const filteredContactsList = [...contactsList].filter((id) => results.has(id));\n\n contactsList = filteredContactsList;\n }\n\n if(sortBy === 'name') {\n contactsList.sort((userId1, userId2) => {\n const sortName1 = (this.users[userId1] || {}).sortName || '';\n const sortName2 = (this.users[userId2] || {}).sortName || '';\n return sortName1.localeCompare(sortName2);\n });\n } else if(sortBy === 'online') {\n contactsList.sort((userId1, userId2) => {\n const status1 = this.getUserStatusForSort(this.getUser(userId1).status);\n const status2 = this.getUserStatusForSort(this.getUser(userId2).status);\n return status2 - status1;\n });\n }\n\n const myUserId = this.userId;\n indexOfAndSplice(contactsList, myUserId);\n if(includeSaved) {\n if(this.testSelfSearch(query)) {\n contactsList.unshift(myUserId);\n }\n }\n\n return contactsList;\n });\n }\n\n public getContactsPeerIds(\n query?: Parameters[0],\n includeSaved?: Parameters[1],\n sortBy?: Parameters[2],\n limit?: number\n ) {\n return this.getContacts(query, includeSaved, sortBy).then((userIds) => {\n const peerIds = userIds.map((userId) => userId.toPeerId(false));\n if(limit) {\n return peerIds.slice(0, limit);\n }\n\n return peerIds;\n });\n }\n\n public toggleBlock(peerId: PeerId, block: boolean) {\n return this.apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\n id: this.appPeersManager.getInputPeerById(peerId)\n }).then((value) => {\n if(value) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updatePeerBlocked',\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n blocked: block\n });\n }\n\n return value;\n });\n }\n\n public testSelfSearch(query: string) {\n const user = this.getSelf();\n const index = this.createSearchIndex();\n index.indexObject(user.id, this.getUserSearchText(user.id));\n return index.search(query).has(user.id);\n }\n\n private createSearchIndex() {\n return new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n }\n\n public saveApiUsers(apiUsers: MTUser[], override?: boolean) {\n if((apiUsers as any).saved) return;\n (apiUsers as any).saved = true;\n apiUsers.forEach((user) => this.saveApiUser(user, override));\n }\n\n public modifyUsernamesCache(peer: Parameters[0], save: boolean) {\n const usernames = getPeerActiveUsernames(peer);\n if(!usernames.length) {\n return;\n }\n\n const cleanedUsernames = usernames.map((username) => cleanUsername(username));\n if(save) {\n cleanedUsernames.forEach((searchUsername) => {\n this.usernames[searchUsername] = peer.id.toPeerId(peer._ !== 'user');\n });\n } else {\n cleanedUsernames.forEach((searchUsername) => {\n delete this.usernames[searchUsername];\n });\n }\n }\n\n public setUsernameToCache(peer: Parameters[0], oldPeer?: typeof peer) {\n if(\n !oldPeer ||\n (oldPeer as MTUser.user).username !== (peer as MTUser.user).username ||\n !deepEqual((oldPeer as MTUser.user).usernames, (peer as MTUser.user).usernames)\n ) {\n this.modifyUsernamesCache(oldPeer, false);\n this.modifyUsernamesCache(peer, true);\n\n return true;\n }\n\n return false;\n }\n\n public saveApiUser(user: MTUser, override?: boolean) {\n if(!user || user._ === 'userEmpty') return;\n\n const userId = user.id;\n const oldUser = this.users[userId];\n\n // ! commented block can affect performance !\n // if(oldUser && !override) {\n // console.log('saveApiUser same');\n // return;\n // }\n\n user.pFlags ??= {};\n\n if(user.pFlags.min && oldUser !== undefined) {\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(user, ['initials', 'num', 'rFirstName', 'rFullName', 'rPhone', 'sortName', 'sortStatus']);\n\n const changedUsername = this.setUsernameToCache(user, oldUser);\n\n if(!oldUser ||\n oldUser.sortName === undefined ||\n oldUser.first_name !== user.first_name ||\n oldUser.last_name !== user.last_name) {\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n\n user.sortName = user.pFlags.deleted ? '' : cleanSearchText(fullName, false);\n } else {\n user.sortName = oldUser.sortName;\n }\n\n if(user.status) {\n if((user.status as UserStatus.userStatusOnline).expires) {\n (user.status as UserStatus.userStatusOnline).expires -= this.timeManager.getServerTimeOffset();\n }\n\n if((user.status as UserStatus.userStatusOffline).was_online) {\n (user.status as UserStatus.userStatusOffline).was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n if((user as User).photo?._ === 'userProfilePhotoEmpty') {\n delete (user as User).photo;\n }\n\n // user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n // if(!user.username && user.usernames) {\n // user.username = user.usernames.find((username) => username.pFlags.active).username;\n // }\n\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n const changedTitle = user.first_name !== oldUser.first_name ||\n user.last_name !== oldUser.last_name ||\n changedUsername;\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const changedPhoto = oldPhotoId !== newPhotoId;\n\n const changedAnyBadge = oldUser.pFlags.premium !== user.pFlags.premium ||\n oldUser.pFlags.verified !== user.pFlags.verified ||\n oldUser.pFlags.scam !== user.pFlags.scam ||\n oldUser.pFlags.fake !== user.pFlags.fake;\n\n /* if(user.pFlags.bot && user.bot_info_version !== oldUser.bot_info_version) {\n\n } */\n\n const wasContact = !!oldUser.pFlags.contact;\n const newContact = !!user.pFlags.contact;\n\n safeReplaceObject(oldUser, user);\n this.rootScope.dispatchEvent('user_update', userId);\n\n if(wasContact !== newContact) {\n this.onContactUpdated(userId, newContact, wasContact);\n }\n\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', {peerId: user.id.toPeerId()});\n }\n\n if(changedTitle || changedAnyBadge) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId: user.id.toPeerId()});\n }\n }\n\n this.checkPremium(user, oldUser);\n this.setUserToStateIfNeeded(user);\n }\n\n private checkPremium(user: User, oldUser: User) {\n if(user.pFlags.self) {\n const isPremium = !!user.pFlags.premium;\n if(this.rootScope.premium !== isPremium) {\n this.rootScope.dispatchEvent('premium_toggle_private', {isNew: !oldUser, isPremium});\n }\n }\n }\n\n private setUserToStateIfNeeded(user: User) {\n if(this.peersStorage.isPeerNeeded(user.id.toPeerId())) {\n this.storage.set({\n [user.id]: user\n });\n }\n }\n\n public isUserOnlineVisible(id: UserId) {\n return this.getUserStatusForSort(id) > 3;\n }\n\n public getUserStatusForSort(status: User['status'] | UserId) {\n if(typeof(status) !== 'object') {\n const user = this.getUser(status);\n status = user?.status;\n }\n\n if(status) {\n const expires = status._ === 'userStatusOnline' ? status.expires : (status._ === 'userStatusOffline' ? status.was_online : 0);\n if(expires) {\n return expires;\n }\n\n /* const timeNow = tsNow(true);\n switch(status._) {\n case 'userStatusRecently':\n return timeNow - 86400 * 3;\n case 'userStatusLastWeek':\n return timeNow - 86400 * 7;\n case 'userStatusLastMonth':\n return timeNow - 86400 * 30;\n } */\n switch(status._) {\n case 'userStatusRecently':\n return 3;\n case 'userStatusLastWeek':\n return 2;\n case 'userStatusLastMonth':\n return 1;\n }\n }\n\n return 0;\n }\n\n public getUser(id: User | UserId) {\n if(isObject(id)) {\n return id;\n }\n\n return this.users[id];\n }\n\n public getUserStatus(id: UserId) {\n return this.isRegularUser(id) && !this.users[id].pFlags.self && this.users[id].status;\n }\n\n public async getUserPhone(id: UserId) {\n const user = this.getUser(id);\n if(!user?.phone) {\n return;\n }\n\n const appConfig = await this.apiManager.getAppConfig();\n return {\n phone: user.phone,\n isAnonymous: appConfig.fragment_prefixes.some((prefix) => user.phone.startsWith(prefix))\n };\n }\n\n public getSelf() {\n return this.getUser(this.userId);\n }\n\n public isBot(id: UserId) {\n return this.users[id] && !!this.users[id].pFlags.bot;\n }\n\n public isAttachMenuBot(id: UserId) {\n return this.isBot(id) && !!this.users[id].pFlags.bot_attach_menu;\n }\n\n public isContact(id: UserId) {\n return this.contactsList.has(id) || !!(this.users[id] && this.users[id].pFlags.contact);\n }\n\n public isRegularUser(id: UserId) {\n const user = this.users[id];\n return user && !this.isBot(id) && !user.pFlags.deleted && !user.pFlags.support;\n }\n\n public isNonContactUser(id: UserId) {\n return this.isRegularUser(id) && !this.isContact(id) && id !== this.userId;\n }\n\n public hasUser(id: UserId, allowMin?: boolean) {\n const user = this.users[id];\n return isObject(user) && (allowMin || !user.pFlags.min);\n }\n\n public getUserString(id: UserId) {\n const user = this.getUser(id);\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\n }\n\n public getUserInput(id: UserId): InputUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputUserSelf'};\n }\n\n return {\n _: 'inputUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getUserInputPeer(id: UserId): InputPeer.inputPeerSelf | InputPeer.inputPeerUser {\n const user = this.getUser(id);\n // ! do not use it, there are places that don't support it. need explicit peer id\n // if(user.pFlags?.self) {\n // return {_: 'inputPeerSelf'};\n // }\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getContactMediaInput(id: UserId): InputMedia.inputMediaContact {\n const user = this.getUser(id);\n\n return {\n _: 'inputMediaContact',\n first_name: user.first_name,\n last_name: user.last_name,\n phone_number: user.phone,\n vcard: '',\n user_id: id\n };\n }\n\n private updateUsersStatuses = () => {\n const timestampNow = tsNow(true);\n for(const i in this.users) {\n const user = this.users[i];\n this.updateUserStatus(user, timestampNow);\n }\n };\n\n private updateUserStatus(user: MTUser.user, timestampNow = tsNow(true)) {\n if(user.status &&\n user.status._ === 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = {_: 'userStatusOffline', was_online: user.status.expires};\n this.rootScope.dispatchEvent('user_update', user.id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public forceUserOnline(id: UserId, eventTimestamp?: number) {\n if(this.isBot(id)) {\n return;\n }\n\n const timestamp = tsNow(true);\n const onlineTimeFor = 60;\n if(eventTimestamp) {\n if((timestamp - eventTimestamp) >= onlineTimeFor) {\n return;\n }\n } else if(this.apiUpdatesManager.updatesState.syncLoading) {\n return;\n }\n\n const user = this.getUser(id);\n if(user?.status &&\n user.status._ !== 'userStatusOnline' &&\n user.status._ !== 'userStatusEmpty' &&\n !user.pFlags.support &&\n !user.pFlags.deleted) {\n user.status = {\n _: 'userStatusOnline',\n expires: timestamp + onlineTimeFor\n };\n\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public importContact(first_name: string, last_name: string, phone: string) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]).then((userIds) => {\n if(!userIds.length) {\n const error = new Error();\n (error as any).type = 'NO_USER';\n throw error;\n }\n\n return userIds[0];\n });\n }\n\n public importContacts(contacts: {phones: string[], first_name: string, last_name: string}[]) {\n const inputContacts: InputContact[] = [];\n\n for(let i = 0; i < contacts.length; ++i) {\n for(let j = 0; j < contacts[i].phones.length; ++j) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n });\n }\n }\n\n return this.apiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts\n }).then((importedContactsResult) => {\n this.saveApiUsers(importedContactsResult.users);\n\n const userIds = importedContactsResult.imported.map((importedContact) => {\n this.onContactUpdated(importedContact.user_id, true);\n return importedContact.user_id;\n });\n\n return userIds;\n });\n }\n\n public getTopPeers(type: TopPeerType) {\n if(this.getTopPeersPromises[type]) return this.getTopPeersPromises[type];\n\n return this.getTopPeersPromises[type] = this.appStateManager.getState().then((state) => {\n const cached = state.topPeersCache[type];\n if(cached && (cached.cachedTime + 86400e3) > Date.now() && cached.peers) {\n return cached.peers;\n }\n\n return this.apiManager.invokeApi('contacts.getTopPeers', {\n [type]: true,\n offset: 0,\n limit: 15,\n hash: '0'\n }).then((result) => {\n let topPeers: MyTopPeer[] = [];\n if(result._ === 'contacts.topPeers') {\n // console.log(result);\n this.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n\n if(result.categories.length) {\n topPeers = result.categories[0].peers.map((topPeer) => {\n const peerId = getPeerId(topPeer.peer);\n this.peersStorage.requestPeer(peerId, 'topPeer');\n return {id: peerId, rating: topPeer.rating};\n });\n }\n }\n\n state.topPeersCache[type] = {\n peers: topPeers,\n cachedTime: Date.now()\n };\n this.appStateManager.pushToState('topPeersCache', state.topPeersCache);\n\n return topPeers;\n });\n });\n }\n\n public getBlocked(offset = 0, limit = 0) {\n return this.apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then((contactsBlocked) => {\n this.saveApiUsers(contactsBlocked.users);\n this.appChatsManager.saveApiChats(contactsBlocked.chats);\n const count = contactsBlocked._ === 'contacts.blocked' ? contactsBlocked.users.length + contactsBlocked.chats.length : contactsBlocked.count;\n\n const peerIds: PeerId[] = contactsBlocked.users.map((u) => u.id.toPeerId()).concat(contactsBlocked.chats.map((c) => c.id.toPeerId(true)));\n\n return {count, peerIds};\n });\n }\n\n public getLocated(\n lat: number,\n long: number,\n accuracy_radius: number,\n background: boolean = false,\n self_expires: number = 0\n ) {\n const geo_point: InputGeoPoint = {\n _: 'inputGeoPoint',\n lat,\n long,\n accuracy_radius\n };\n\n return this.apiManager.invokeApi('contacts.getLocated', {\n geo_point,\n background\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n return updates;\n });\n }\n\n /* public searchContacts(query: string, limit = 20) {\n return Promise.all([\n this.getContacts(query),\n apiManager.invokeApi('contacts.search', {\n q: query,\n limit\n })\n ]).then((results) => {\n const [myContacts, peers] = results;\n\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n // * contacts.search returns duplicates in my_results\n const myResults = new Set(myContacts.concat(peers.my_results.map((p) => appPeersManager.getPeerID(p))));\n\n const out = {\n my_results: [...myResults].slice(0, limit),\n results: peers.results.map((p) => appPeersManager.getPeerID(p))\n };\n\n return out;\n });\n } */\n public searchContacts(query: string, limit = 20) {\n // handle 't.me/username' as 'username'\n const entities = parseEntities(query);\n if(entities.length && entities[0].length === query.trim().length && entities[0]._ === 'messageEntityUrl') {\n try {\n const url = new URL(wrapUrl(query).url);\n const path = url.pathname.slice(1);\n if(path) {\n query = path;\n }\n } catch(err) {}\n }\n\n return this.apiManager.invokeApiCacheable('contacts.search', {\n q: query,\n limit\n }, {cacheSeconds: 60}).then((peers) => {\n this.saveApiUsers(peers.users);\n this.appChatsManager.saveApiChats(peers.chats);\n\n const out = {\n my_results: filterUnique(peers.my_results.map((p) => getPeerId(p))), // ! contacts.search returns duplicates in my_results\n results: peers.results.map((p) => getPeerId(p))\n };\n\n return out;\n });\n }\n\n private onContactUpdated(userId: UserId, isContact: boolean, curIsContact = this.isContact(userId)) {\n if(isContact !== curIsContact) {\n if(isContact) {\n this.pushContact(userId);\n } else {\n this.popContact(userId);\n }\n\n this.onContactsModified();\n\n this.rootScope.dispatchEvent('contacts_update', userId);\n }\n }\n\n public updateUsername(username: string) {\n return this.apiManager.invokeApi('account.updateUsername', {\n username\n }).then((user) => {\n this.saveApiUser(user);\n });\n }\n\n public setUserStatus(userId: UserId, offline: boolean) {\n if(this.isBot(userId)) {\n return;\n }\n\n const user = this.users[userId];\n if(user) {\n const status: UserStatus = offline ? {\n _: 'userStatusOffline',\n was_online: tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: tsNow(true) + 50\n };\n\n user.status = status;\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', userId);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public updateMyOnlineStatus(offline: boolean) {\n this.setUserStatus(this.getSelf().id, offline);\n return this.apiManager.invokeApiSingle('account.updateStatus', {offline});\n }\n\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, addPhonePrivacyException?: boolean) {\n /* if(!userId) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]);\n } */\n\n return this.apiManager.invokeApi('contacts.addContact', {\n id: this.getUserInput(userId),\n first_name,\n last_name,\n phone,\n add_phone_privacy_exception: addPhonePrivacyException\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n this.onContactUpdated(userId, true);\n });\n }\n\n public deleteContacts(userIds: UserId[]) {\n return this.apiManager.invokeApi('contacts.deleteContacts', {\n id: userIds.map((userId) => this.getUserInput(userId))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n userIds.forEach((userId) => {\n this.onContactUpdated(userId, false);\n });\n });\n }\n\n public checkUsername(username: string) {\n return this.apiManager.invokeApi('account.checkUsername', {username});\n }\n\n public toggleUsername(username: string, active: boolean) {\n return this.apiManager.invokeApi('account.toggleUsername', {username, active});\n }\n\n public reorderUsernames(usernames: string[]) {\n return this.apiManager.invokeApi('account.reorderUsernames', {order: usernames});\n }\n\n public canSendToUser(userId: UserId) {\n return canSendToUser(this.getUser(userId));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function cleanUsername(username: string) {\n return username && username.toLowerCase() || '';\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {WebPage} from '../../layer';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {AppManager} from './manager';\n\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\n\ntype WebPageMessageKey = `${PeerId}_${number}`;\n\nexport class AppWebPagesManager extends AppManager {\n private webpages: {\n [webPageId: string]: WebPage\n } = {};\n private pendingWebPages: {\n [webPageId: string]: Set\n } = {};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateWebPage: (update) => {\n this.saveWebPage(update.webpage);\n }\n });\n }\n\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\n if(apiWebPage._ === 'webPageNotModified' || apiWebPage._ === 'webPageEmpty') return;\n const {id} = apiWebPage;\n\n const oldWebPage = this.webpages[id];\n const isUpdated = oldWebPage &&\n oldWebPage._ === apiWebPage._ &&\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\n\n if(apiWebPage._ === 'webPage') {\n if(apiWebPage.photo?._ === 'photo') {\n apiWebPage.photo = this.appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\n } else {\n delete apiWebPage.photo;\n }\n\n if(apiWebPage.document?._ === 'document') {\n apiWebPage.document = this.appDocsManager.saveDoc(apiWebPage.document, mediaContext);\n } else {\n if(apiWebPage.type === 'document') {\n delete apiWebPage.type;\n }\n\n delete apiWebPage.document;\n }\n\n const siteName = apiWebPage.site_name;\n const shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\n if(siteName && shortTitle === siteName) {\n delete apiWebPage.site_name;\n }\n\n // delete apiWebPage.description\n\n if(!photoTypeSet.has(apiWebPage.type) &&\n !apiWebPage.description &&\n apiWebPage.photo) {\n apiWebPage.type = 'photo';\n }\n }\n\n let pendingSet = this.pendingWebPages[id];\n if(messageKey) {\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\n pendingSet.add(messageKey);\n }\n\n if(oldWebPage === undefined) {\n this.webpages[id] = apiWebPage;\n } else {\n safeReplaceObject(oldWebPage, apiWebPage);\n }\n\n if(!messageKey && pendingSet !== undefined && isUpdated) {\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\n pendingSet.forEach((value) => {\n const [peerId, mid, isScheduled] = value.split('_');\n msgs.push({\n peerId: peerId.toPeerId(),\n mid: +mid,\n isScheduled: !!isScheduled\n });\n });\n\n this.rootScope.dispatchEvent('webpage_updated', {\n id,\n msgs\n });\n }\n\n return apiWebPage;\n }\n\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\n }\n\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\n const id = (webPage as WebPage.webPage).id;\n if(!id) return;\n\n const set = this.pendingWebPages[id];\n if(set && set.has(messageKey)) {\n set.delete(messageKey);\n\n if(!set.size) {\n delete this.pendingWebPages[id];\n }\n }\n }\n\n public getCachedWebPage(id: WebPage.webPage['id']) {\n return this.webpages[id];\n }\n\n public getWebPage(url: string) {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getWebPage',\n processResult: (webPage) => {\n return this.saveWebPage(webPage);\n },\n params: {\n url\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","export default function fileNameRFC(fileName: string) {\n // Make filename RFC5987 compatible\n return encodeURIComponent(fileName).replace(/['()]/g, escape).replace(/\\*/g, '%2A');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getServiceMessagePort} from '../mtproto/mtproto.worker';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport StreamWriter from './streamWriter';\n\nexport default class DownloadWriter implements StreamWriter {\n constructor(\n private serviceMessagePort: ServiceMessagePort,\n private downloadId: string\n ) {\n this.serviceMessagePort = getServiceMessagePort();\n }\n\n public async write(part: Uint8Array, offset?: number) {\n return this.serviceMessagePort.invoke('downloadChunk', {\n id: this.downloadId,\n chunk: part\n });\n }\n\n public finalize(saveToStorage?: boolean): Promise {\n return this.serviceMessagePort.invoke('downloadFinalize', this.downloadId).then(() => undefined);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport makeError from '../../helpers/makeError';\nimport fileNameRFC from '../../helpers/string/fileNameRFC';\nimport {getServiceMessagePort} from '../mtproto/mtproto.worker';\nimport DownloadWriter from './downloadWriter';\nimport FileStorage from './fileStorage';\n\nexport default class DownloadStorage implements FileStorage {\n public getFile(fileName: string): Promise {\n return Promise.reject(makeError('NO_ENTRY_FOUND'));\n }\n\n public prepareWriting({fileName, downloadId, size}: {\n fileName: string,\n downloadId: string,\n size: number\n }) {\n const headers = {\n 'Content-Type': 'application/octet-stream; charset=utf-8',\n 'Content-Disposition': 'attachment; filename*=UTF-8\\'\\'' + fileNameRFC(fileName),\n ...(size ? {'Content-Length': size} : {})\n };\n\n const serviceMessagePort = getServiceMessagePort();\n const promise = serviceMessagePort.invoke('download', {\n headers,\n id: downloadId\n });\n\n const deferred = deferredPromise();\n deferred.cancel = () => {\n deferred.reject(makeError('DOWNLOAD_CANCELED'));\n };\n\n deferred.catch(() => {\n getServiceMessagePort().invoke('downloadCancel', downloadId);\n });\n\n promise.then(deferred.resolve, deferred.reject);\n\n return {\n deferred,\n getWriter: () => {\n return new DownloadWriter(serviceMessagePort, downloadId);\n }\n };\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {ReferenceBytes} from './referenceDatabase';\nimport Modes from '../../config/modes';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {randomLong} from '../../helpers/random';\nimport {Document, InputFile, InputFileLocation, InputWebFileLocation, Photo, PhotoSize, UploadFile, UploadWebFile, VideoSize, WebDocument} from '../../layer';\nimport {DcId} from '../../types';\nimport CacheStorageController from '../files/cacheStorage';\nimport {logger, LogTypes} from '../logger';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport readBlobAsArrayBuffer from '../../helpers/blob/readBlobAsArrayBuffer';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport fixFirefoxSvg from '../../helpers/fixFirefoxSvg';\nimport {AppManager} from '../appManagers/manager';\nimport {getEnvironment} from '../../environment/utils';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport type {Progress} from '../appManagers/appDownloadManager';\nimport getDownloadMediaDetails from '../appManagers/utils/download/getDownloadMediaDetails';\n// import networkStats from './networkStats';\nimport getDownloadFileNameFromOptions from '../appManagers/utils/download/getDownloadFileNameFromOptions';\nimport StreamWriter from '../files/streamWriter';\nimport FileStorage from '../files/fileStorage';\nimport {MAX_FILE_SAVE_SIZE} from './mtproto_config';\nimport throttle from '../../helpers/schedulers/throttle';\nimport makeError from '../../helpers/makeError';\nimport readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\nimport DownloadStorage from '../files/downloadStorage';\nimport copy from '../../helpers/object/copy';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {MIME_TYPE_EXTENSION_MAP} from '../../environment/mimeTypeMap';\nimport {getServiceMessagePort} from './mtproto.worker';\n\ntype Delayed = {\n offset: number,\n writePromise: CancellablePromise,\n writeDeferred: CancellablePromise\n};\n\nexport type DownloadOptions = {\n dcId: DcId,\n location: InputFileLocation | InputWebFileLocation,\n size?: number,\n fileName?: string,\n mimeType?: MTMimeType,\n limitPart?: number,\n queueId?: number,\n onlyCache?: boolean,\n downloadId?: string\n // getFileMethod: Parameters[1]\n};\n\nexport type DownloadMediaOptions = {\n media: Photo.photo | Document.document | WebDocument,\n thumb?: PhotoSize | VideoSize,\n queueId?: number,\n onlyCache?: boolean,\n downloadId?: string\n};\n\ntype DownloadPromise = CancellablePromise;\n\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\n\n// export interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\n// type: 'refreshReference',\n// payload: ReferenceBytes,\n// };\n\n// export interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\n// type: 'refreshReference',\n// payload: ReferenceBytes,\n// originalPayload: ReferenceBytes\n// };\n\nconst MAX_DOWNLOAD_FILE_PART_SIZE = 1 * 1024 * 1024;\nconst MAX_UPLOAD_FILE_PART_SIZE = 512 * 1024;\nconst MIN_PART_SIZE = 128 * 1024;\nconst AVG_PART_SIZE = 512 * 1024;\n\nconst REGULAR_DOWNLOAD_DELTA = (9 * 512 * 1024) / MIN_PART_SIZE;\n// const PREMIUM_DOWNLOAD_DELTA = REGULAR_DOWNLOAD_DELTA * 2;\nconst PREMIUM_DOWNLOAD_DELTA = (56 * 512 * 1024) / MIN_PART_SIZE;\n\nconst IGNORE_ERRORS: Set = new Set([\n 'DOWNLOAD_CANCELED',\n 'UPLOAD_CANCELED',\n 'UNKNOWN',\n 'NO_NEW_CONTEXT'\n]);\n\nexport class ApiFileManager extends AppManager {\n private cacheStorage = new CacheStorageController('cachedFiles');\n private downloadStorage = new DownloadStorage();\n\n private downloadPromises: {\n [fileName: string]: DownloadPromise\n } = {};\n\n // private downloadToDiscPromises: {\n // [fileName: string]: DownloadPromise\n // } = {};\n\n private uploadPromises: {\n [fileName: string]: CancellablePromise\n } = {};\n\n private downloadPulls: {\n [dcId: string]: Array<{\n id: number,\n queueId: number,\n cb: () => Promise,\n deferred: {\n resolve: (...args: any[]) => void,\n reject: (...args: any[]) => void\n },\n activeDelta: number\n }>\n } = {};\n private downloadActives: {[dcId: string]: number} = {};\n\n public refreshReferencePromises: {\n [referenceHex: string]: {\n deferred: CancellablePromise,\n timeout?: number\n }\n } = {};\n\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\n private tempId = 0;\n private queueId = 0;\n private debug = Modes.debug;\n\n private maxUploadParts = 4000;\n private maxDownloadParts = 8000;\n private webFileDcId: DcId;\n\n protected after() {\n setInterval(() => { // clear old promises\n for(const hex in this.refreshReferencePromises) {\n const {deferred} = this.refreshReferencePromises[hex];\n if(deferred.isFulfilled || deferred.isRejected) {\n delete this.refreshReferencePromises[hex];\n }\n }\n }, 1800e3);\n\n this.rootScope.addEventListener('config', (config) => {\n this.webFileDcId = config.webfile_dc_id;\n });\n\n this.rootScope.addEventListener('app_config', (appConfig) => {\n this.maxUploadParts = this.rootScope.premium ? appConfig.upload_max_fileparts_premium : appConfig.upload_max_fileparts_default;\n this.maxDownloadParts = appConfig.upload_max_fileparts_premium;\n });\n }\n\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\n if(this.downloadPulls[dcId] === undefined) {\n this.downloadPulls[dcId] = [];\n this.downloadActives[dcId] = 0;\n }\n\n const downloadPull = this.downloadPulls[dcId];\n\n const promise = new Promise((resolve, reject) => {\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\n });\n\n setTimeout(() => {\n this.downloadCheck(dcId);\n }, 0);\n\n return promise;\n }\n\n private downloadCheck(dcId: string | number) {\n const downloadPull = this.downloadPulls[dcId];\n const downloadLimit = /* dcId === 'upload' ? 24 : */(this.rootScope.premium ? PREMIUM_DOWNLOAD_DELTA : REGULAR_DOWNLOAD_DELTA);\n // const downloadLimit = Infinity;\n\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull?.length) {\n return false;\n }\n\n // const data = downloadPull.shift();\n const data = findAndSplice(downloadPull, (d) => d.queueId === 0) || findAndSplice(downloadPull, (d) => d.queueId === this.queueId) || downloadPull.shift();\n const activeDelta = data.activeDelta || 1;\n\n this.downloadActives[dcId] += activeDelta;\n\n const promise = data.cb();\n // const networkPromise = networkStats.waitForChunk(dcId as DcId, activeDelta * MIN_PART_SIZE);\n /* Promise.race([\n promise\n // networkPromise\n ]) */promise.then(() => {\n this.downloadActives[dcId] -= activeDelta;\n this.downloadCheck(dcId);\n\n // networkPromise.resolve();\n }, (error: ApiError) => {\n if(!error?.type || !IGNORE_ERRORS.has(error.type)) {\n this.log.error('downloadCheck error:', error);\n }\n\n this.downloadActives[dcId] -= activeDelta;\n this.downloadCheck(dcId);\n\n // networkPromise.reject(error);\n }).finally(() => {\n promise.then(data.deferred.resolve, data.deferred.reject);\n });\n }\n\n public setQueueId(queueId: number) {\n // this.log.error('setQueueId', queueId);\n this.queueId = queueId;\n }\n\n private getFileStorage() {\n return this.cacheStorage;\n }\n\n public cancelDownload(fileName: string) {\n const promises = [this.downloadPromises[fileName], this.uploadPromises[fileName]].filter(Boolean);\n let canceled = false;\n for(let i = 0, length = promises.length; i < length; ++i) {\n const promise = promises[i];\n if(promise && !promise.isRejected && !promise.isFulfilled) {\n promise.cancel();\n canceled = true;\n }\n }\n\n return canceled;\n }\n\n public requestWebFilePart(dcId: DcId, location: InputWebFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\n checkCancel?.();\n\n return this.apiManager.invokeApi('upload.getWebFile', {\n location,\n offset,\n limit\n }, {\n dcId,\n fileDownload: true\n });\n }, this.getDelta(limit), queueId);\n }\n\n public requestFilePart(\n dcId: DcId,\n location: InputFileLocation,\n offset: number,\n limit: number,\n id = 0,\n queueId = 0,\n checkCancel?: () => void\n ) {\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\n checkCancel?.();\n\n const invoke = async(): Promise => {\n checkCancel?.(); // do not remove async, because checkCancel will throw an error\n\n // * IMPORTANT: reference can be changed in previous request\n const reference = (location as InputFileLocation.inputDocumentFileLocation).file_reference?.slice();\n\n const promise = // pause(offset > (100 * 1024 * 1024) ? 10000000 : 0).then(() =>\n this.apiManager.invokeApi('upload.getFile', {\n location,\n offset,\n limit\n }, {\n dcId,\n fileDownload: true\n }) as Promise/* ) */;\n\n return promise.catch((err: ApiError) => {\n checkCancel?.();\n\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\n return this.refreshReference(location as InputFileLocation.inputDocumentFileLocation, reference).then(invoke);\n }\n\n throw err;\n });\n };\n\n assumeType(location);\n const reference = location.file_reference;\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\n location.checkedReference = true;\n const hex = bytesToHex(reference);\n if(this.refreshReferencePromises[hex]) {\n return this.refreshReference(location, reference).then(invoke);\n }\n }\n\n return invoke();\n }, this.getDelta(limit), queueId);\n }\n\n /* private convertBlobToBytes(blob: Blob) {\n return blob.arrayBuffer().then((buffer) => new Uint8Array(buffer));\n } */\n\n private getDelta(bytes: number) {\n return bytes / MIN_PART_SIZE;\n }\n\n private getLimitPart(size: number, isUpload: boolean): number {\n if(!size) { // * sometimes size can be 0 (e.g. avatars, webDocuments)\n return AVG_PART_SIZE;\n }\n\n // return 1 * 1024 * 1024;\n\n let bytes = MIN_PART_SIZE;\n\n const maxParts = isUpload ? this.maxUploadParts : this.maxDownloadParts;\n const maxPartSize = isUpload ? MAX_UPLOAD_FILE_PART_SIZE : MAX_DOWNLOAD_FILE_PART_SIZE;\n // usually it will stick to 512Kb size if the file is too big\n while((size / bytes) > maxParts && bytes < maxPartSize) {\n bytes *= 2;\n }\n /* if(size < 1e6 || !size) bytes = 512;\n else if(size < 3e6) bytes = 256;\n else bytes = 128; */\n\n return bytes;\n }\n\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\n return this.cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, false) as Promise;\n };\n\n private uncompressTGV = (bytes: Uint8Array, fileName: string) => {\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\n const buffer = bytes.slice().buffer;\n if(getEnvironment().IS_FIREFOX) {\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, true).then((text) => {\n return fixFirefoxSvg(text as string);\n }).then((text) => {\n const textEncoder = new TextEncoder();\n return textEncoder.encode(text);\n });\n }\n\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, false) as Promise;\n };\n\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\n const instance = MTProtoMessagePort.getInstance();\n return instance.invoke('convertWebp', {fileName, bytes});\n };\n\n private convertOpus = (bytes: Uint8Array, fileName: string) => {\n const instance = MTProtoMessagePort.getInstance();\n return instance.invoke('convertOpus', {fileName, bytes});\n };\n\n private refreshReference(\n inputFileLocation: InputFileLocation.inputDocumentFileLocation,\n reference: typeof inputFileLocation['file_reference'],\n hex = bytesToHex(reference)\n ) {\n let r = this.refreshReferencePromises[hex];\n if(!r) {\n const deferred = deferredPromise();\n\n r = this.refreshReferencePromises[hex] = {\n deferred\n\n // ! I don't remember what it was for...\n // timeout: ctx.setTimeout(() => {\n // this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\n // deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\n // }, 60000)\n };\n\n // deferred.catch(noop).finally(() => {\n // clearTimeout(r.timeout);\n // });\n\n this.referenceDatabase.refreshReference(reference).then((reference) => {\n if(hex === bytesToHex(reference)) {\n deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\n }\n\n deferred.resolve(reference);\n }, deferred.reject);\n }\n\n // have to replace file_reference in any way, because location can be different everytime if it's stream\n return r.deferred.then((reference) => {\n inputFileLocation.file_reference = reference;\n });\n }\n\n public isDownloading(fileName: string) {\n return !!this.downloadPromises[fileName];\n }\n\n public getDownload(fileName: string) {\n return this.downloadPromises[fileName];\n }\n\n public getUpload(fileName: string) {\n return this.uploadPromises[fileName];\n }\n\n private getConvertMethod(mimeType: MTMimeType) {\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\n if(mimeType === 'application/x-tgwallpattern') {\n process = this.uncompressTGV;\n mimeType = 'image/svg+xml';\n } else if(mimeType === 'image/webp' && !getEnvironment().IS_WEBP_SUPPORTED) {\n process = this.convertWebp;\n mimeType = 'image/png';\n } else if(mimeType === 'application/x-tgsticker') {\n process = this.uncompressTGS;\n mimeType = 'application/json';\n } else if(mimeType === 'audio/ogg' && !getEnvironment().IS_OPUS_SUPPORTED) {\n process = this.convertOpus;\n mimeType = 'audio/wav';\n }\n\n return {mimeType, process};\n }\n\n private allocateDeferredPromises(startOffset: number, size: number, limitPart: number) {\n const delayed: Delayed[] = [];\n let offset = startOffset;\n let writePromise: CancellablePromise = Promise.resolve(),\n writeDeferred: CancellablePromise;\n do {\n writeDeferred = deferredPromise();\n delayed.push({offset, writePromise, writeDeferred});\n writePromise = writeDeferred;\n offset += limitPart;\n } while(offset < size);\n\n return delayed;\n }\n\n public download(options: DownloadOptions): DownloadPromise {\n const size = options.size ?? 0;\n const {dcId, location} = options;\n let {downloadId} = options;\n if(downloadId && !getServiceMessagePort()) {\n this.log.error('download fallback to blob', options);\n downloadId = undefined;\n }\n\n const originalMimeType = options.mimeType;\n const convertMethod = this.getConvertMethod(originalMimeType);\n const {process} = convertMethod;\n options.mimeType = convertMethod.mimeType || 'image/jpeg';\n\n const fileName = getDownloadFileNameFromOptions(options);\n const cacheFileName = downloadId ? getDownloadFileNameFromOptions({...copy(options), downloadId: undefined}) : fileName;\n const cacheStorage: FileStorage = this.getFileStorage();\n const downloadStorage: FileStorage = downloadId ? this.downloadStorage : undefined;\n let deferred: DownloadPromise = downloadId ? undefined : this.downloadPromises[fileName];\n\n this.debug && this.log('downloadFile', fileName, options);\n\n if(deferred) {\n return deferred;\n }\n\n // if(deferred) {\n // if(size) {\n // return deferred.then(async(blob) => {\n // if(blob instanceof Blob && blob.size < size) {\n // this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\n\n // try {\n // await this.delete(fileName);\n // } finally {\n // return this.download(options);\n // }\n // } else {\n // return blob;\n // }\n // });\n // } else {\n // return deferred;\n // }\n // }\n\n const errorHandler = (item: typeof cachePrepared, error: ApiError) => {\n if(item?.error) {\n return;\n }\n\n for(const p of prepared) {\n if(item && item !== p) {\n continue;\n }\n\n p.error = error;\n p.deferred.reject(error);\n }\n };\n\n const id = this.tempId++;\n const limitPart = options.limitPart || this.getLimitPart(size, false);\n\n let getFile: FileStorage['getFile'] = cacheStorage.getFile.bind(cacheStorage);\n\n let cachePrepared: ReturnType & {writer?: StreamWriter, error?: ApiError},\n downloadPrepared: typeof cachePrepared;\n const prepared: (typeof cachePrepared)[] = [];\n const possibleSize = size || limitPart;\n\n const getErrorsCount = () => prepared.reduce((acc, item) => acc + +!!item.error, 0);\n\n const attach = (item: typeof cachePrepared, fileName: string) => {\n const {deferred} = item;\n const _errorHandler = errorHandler.bind(null, item);\n\n deferred.cancel = () => deferred.reject(makeError('DOWNLOAD_CANCELED'));\n deferred.catch((error) => {\n _errorHandler(error);\n item.writer?.truncate?.();\n }).finally(() => {\n if(this.downloadPromises[fileName] === deferred) {\n delete this.downloadPromises[fileName];\n }\n\n delete item.writer;\n // indexOfAndSplice(prepared, item);\n });\n\n this.downloadPromises[fileName] = deferred;\n\n prepared.push(item);\n };\n\n if(cacheStorage && (!downloadStorage || possibleSize <= MAX_FILE_SAVE_SIZE)) {\n cachePrepared = cacheStorage.prepareWriting(cacheFileName, possibleSize, options.mimeType)\n attach(cachePrepared, cacheFileName);\n }\n\n if(downloadStorage) {\n let downloadFileName = options.fileName; // it's doc file_name\n if(!downloadFileName) {\n downloadFileName = cacheFileName;\n const ext = MIME_TYPE_EXTENSION_MAP[options.mimeType];\n if(ext) {\n downloadFileName += '.' + ext;\n }\n }\n\n downloadPrepared = downloadStorage.prepareWriting({\n fileName: downloadFileName,\n downloadId,\n size: possibleSize\n });\n attach(downloadPrepared, fileName);\n\n if(cachePrepared) { // cancel cache too\n downloadPrepared.deferred.catch((err) => cachePrepared.deferred.reject(err));\n }\n\n // this.downloadToDiscPromises[cacheFileName] = deferred;\n // deferred.catch(noop).finally(() => {\n // if(this.downloadToDiscPromises[cacheFileName] === deferred) {\n // delete this.downloadToDiscPromises[cacheFileName];\n // }\n // });\n }\n\n deferred = downloadPrepared?.deferred ?? cachePrepared.deferred;\n\n if(downloadStorage && process) { // then have to load file again\n getFile = downloadStorage.getFile.bind(downloadStorage);\n }\n\n getFile(cacheFileName).then(async(blob: Blob) => {\n checkCancel();\n\n // if(blob.size < size) {\n // if(!options.onlyCache) {\n // await this.delete(cacheFileName);\n // checkCancel();\n // }\n\n // throw makeError('NO_ENTRY_FOUND');\n // }\n\n if(downloadPrepared) {\n const writer = downloadPrepared.writer = downloadPrepared.getWriter();\n checkCancel();\n\n const arr = await readBlobAsUint8Array(blob);\n checkCancel();\n await writer.write(arr);\n checkCancel();\n\n downloadPrepared.deferred.resolve(await writer.finalize());\n }\n\n if(cachePrepared) {\n cachePrepared.deferred.resolve(blob);\n }\n }).catch(async(err: ApiError) => {\n if(options.onlyCache) {\n errorHandler(null, err);\n return;\n }\n\n prepared.forEach((p) => {\n p.writer = p.getWriter();\n });\n\n const maxRequests = Infinity;\n\n const isWebFile = location._ === 'inputWebFileLocation';\n const requestPart = (isWebFile ? this.requestWebFilePart : this.requestFilePart).bind(this);\n\n if(isWebFile && this.webFileDcId === undefined) {\n await this.apiManager.getConfig();\n checkCancel();\n }\n\n const delayed = this.allocateDeferredPromises(0, size, limitPart);\n\n const progress: Progress = {done: 0, offset: 0, total: size, fileName};\n const dispatchProgress = () => {\n try {\n checkCancel();\n progress.done = done;\n this.rootScope.dispatchEvent('download_progress', progress);\n } catch(err) {}\n };\n\n const throttledDispatchProgress = throttle(dispatchProgress, 50, true);\n\n let done = 0;\n const superpuper = async() => {\n const {offset, writePromise, writeDeferred} = delayed.shift();\n try {\n checkCancel();\n\n const requestPerf = performance.now();\n const result = await requestPart(dcId, location as any, offset, limitPart, id, options.queueId, checkCancel);\n const requestTime = performance.now() - requestPerf;\n\n const bytes = result.bytes;\n\n if(delayed.length) {\n superpuper();\n }\n\n const byteLength = bytes.byteLength;\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\n const isFinal = (offset + limitPart) >= size || !byteLength;\n if(byteLength) {\n done += byteLength;\n\n if(isFinal) {\n dispatchProgress();\n } else {\n throttledDispatchProgress();\n }\n\n const writeQueuePerf = performance.now();\n await writePromise;\n checkCancel();\n const writeQueueTime = performance.now() - writeQueuePerf;\n\n const perf = performance.now();\n await Promise.all(prepared.map(({writer}) => writer?.write(bytes, offset)));\n checkCancel();\n // downloadId && this.log('write time', performance.now() - perf, 'request time', requestTime, 'queue time', writeQueueTime);\n }\n\n if(isFinal) {\n if(!size || done < size) {\n prepared.forEach(({writer}) => writer?.trim?.(done));\n }\n }\n\n if(isFinal && process) {\n const promises = prepared\n .filter(({writer}) => writer?.getParts && writer.replaceParts)\n .map(async({writer}) => {\n const bytes = writer.getParts();\n const processedResult = await process(bytes, cacheFileName);\n writer.replaceParts(processedResult);\n });\n\n await Promise.all(promises);\n checkCancel();\n }\n\n writeDeferred.resolve();\n\n if(isFinal) {\n const saveToStorage = done <= MAX_FILE_SAVE_SIZE;\n prepared.forEach((item) => {\n const {deferred, writer} = item;\n if(deferred.isFulfilled || deferred.isRejected || !writer) {\n return;\n }\n\n const result = writer.finalize(saveToStorage);\n deferred.resolve(result);\n });\n }\n } catch(err) {\n errorHandler(null, err as ApiError);\n }\n };\n\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\n superpuper();\n }\n }).catch(noop);\n\n const checkCancel = () => {\n if(getErrorsCount() === prepared.length) {\n throw prepared[0].error;\n }\n };\n\n return deferred;\n }\n\n public downloadMedia(options: DownloadMediaOptions): DownloadPromise {\n let {media, thumb} = options;\n const isPhoto = media._ === 'photo';\n if(isPhoto && !thumb) {\n return Promise.reject('preloadPhoto photoEmpty!');\n }\n\n // get original instance with correct file_reference instead of using copies\n const isDocument = media._ === 'document';\n // const isWebDocument = media._ === 'webDocument';\n if(isDocument) media = this.appDocsManager.getDoc((media as Document.document).id);\n else if(isPhoto) media = this.appPhotosManager.getPhoto((media as Photo.photo).id);\n\n const {fileName, downloadOptions} = getDownloadMediaDetails(options);\n\n let promise = this.getDownload(fileName);\n if(!promise) {\n promise = this.download(downloadOptions);\n\n if(isDocument && !thumb) {\n this.rootScope.dispatchEvent('document_downloading', (media as Document.document).id);\n promise.then(() => {\n this.rootScope.dispatchEvent('document_downloaded', (media as Document.document).id);\n }).catch(noop);\n }\n }\n\n return promise;\n }\n\n public downloadMediaURL(options: DownloadMediaOptions): Promise {\n const {media, thumb} = options;\n\n let cacheContext = this.thumbsStorage.getCacheContext(media as any, thumb?.type);\n if((thumb ? (cacheContext.downloaded >= ('size' in thumb ? thumb.size : 0)) : true) && cacheContext.url) {\n return Promise.resolve(cacheContext.url);\n }\n\n return this.downloadMedia(options).then((blob) => {\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\n const url = URL.createObjectURL(blob);\n cacheContext = this.thumbsStorage.setCacheContextURL(media as any, cacheContext.type, url, blob.size);\n }\n\n return cacheContext.url;\n });\n }\n\n public downloadMediaVoid(options: DownloadMediaOptions) {\n return this.downloadMedia(options).then(noop);\n }\n\n private delete(fileName: string) {\n delete this.downloadPromises[fileName];\n return this.getFileStorage().delete(fileName);\n }\n\n public upload({file, fileName}: {file: Blob | File, fileName?: string}) {\n fileName ||= getFileNameForUpload(file);\n\n const fileSize = file.size;\n const isBigFile = fileSize >= 10485760;\n const partSize = this.getLimitPart(fileSize, true);\n const activeDelta = this.getDelta(partSize);\n const totalParts = Math.ceil(fileSize / partSize);\n const fileId = randomLong();\n const resultInputFile: InputFile = {\n _: isBigFile ? 'inputFileBig' : 'inputFile',\n id: fileId as any,\n parts: totalParts,\n name: fileName,\n md5_checksum: ''\n };\n\n const deferred = deferredPromise();\n if(totalParts > this.maxUploadParts) {\n deferred.reject(makeError('FILE_TOO_BIG'));\n return deferred;\n }\n\n let canceled = false, resolved = false;\n let errorHandler = (error: ApiError) => {\n if(error?.type !== 'UPLOAD_CANCELED') {\n this.log.error('Up Error', error);\n }\n\n deferred.reject(error);\n canceled = true;\n errorHandler = noop;\n };\n\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\n const id = this.tempId++;\n\n const self = this;\n function* generator() {\n let _part = 0, doneParts = 0;\n for(let offset = 0; offset < fileSize; offset += partSize) {\n const part = _part++; // 0, 1\n yield self.downloadRequest('upload', id, async() => {\n checkCancel();\n\n const blob = file.slice(offset, offset + partSize);\n const buffer = await readBlobAsArrayBuffer(blob);\n checkCancel();\n\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\n\n return self.apiManager.invokeApi(method, {\n file_id: fileId,\n file_part: part,\n file_total_parts: totalParts,\n bytes: buffer\n } as any, {\n fileUpload: true\n }).then(() => {\n if(canceled) {\n return;\n }\n\n ++doneParts;\n const progress: Progress = {done: doneParts * partSize, offset, total: fileSize, fileName};\n deferred.notify(progress);\n\n if(doneParts >= totalParts) {\n deferred.resolve(resultInputFile);\n resolved = true;\n }\n }, errorHandler);\n }, activeDelta).catch(errorHandler);\n }\n }\n\n const it = generator();\n const process = () => {\n if(canceled) return;\n const r = it.next();\n if(r.done || canceled) return;\n (r.value as Promise).then(process);\n };\n\n const maxRequests = Infinity;\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\n process();\n }\n\n const checkCancel = () => {\n if(canceled) {\n throw makeError('UPLOAD_CANCELED');\n }\n };\n\n deferred.cancel = () => {\n if(!canceled && !resolved) {\n canceled = true;\n errorHandler(makeError('UPLOAD_CANCELED'));\n }\n };\n\n deferred.notify = (progress: Progress) => {\n this.rootScope.dispatchEvent('download_progress', progress);\n };\n\n deferred.finally(() => {\n if(this.uploadPromises[fileName] === deferred) {\n delete this.uploadPromises[fileName];\n }\n });\n\n return this.uploadPromises[fileName] = deferred;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function fixFirefoxSvg(text: string) {\n const svgIndex = text.indexOf('/, ` width=\"${width}\" height=\"${height}\">`).replace(/[^\\x00-\\x7F]/g, '');\n return text;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsArrayBuffer from './readBlobAsArrayBuffer';\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from '../../environment/ctx';\nimport callbackify from '../../helpers/callbackify';\nimport {ignoreRestrictionReasons} from '../../helpers/restrictions';\nimport {Config, MethodDeclMap, User} from '../../layer';\nimport {InvokeApiOptions} from '../../types';\nimport {AppManager} from '../appManagers/manager';\nimport {MTAppConfig} from './appConfig';\nimport {UserAuth} from './mtproto_config';\nimport {MTMessage} from './networker';\n\ntype HashResult = {\n hash: number,\n result: any\n};\n\ntype HashOptions = {\n [queryJSON: string]: HashResult\n};\n\nexport type ApiLimitType = 'pin' | 'folderPin' | 'folders' |\n 'favedStickers' | 'reactions' | 'bio' | 'topicPin' | 'caption';\n\nexport default abstract class ApiManagerMethods extends AppManager {\n private afterMessageIdTemp: number;\n private hashes: {[method: string]: HashOptions} = {};\n private apiPromisesSingleProcess: {\n [q: string]: Map>\n } = {};\n private apiPromisesSingle: {\n [q: string]: Promise\n } = {};\n private apiPromisesCacheable: {\n [method: string]: {\n [queryJSON: string]: {\n timestamp: number,\n promise: Promise,\n fulfilled: boolean,\n timeout?: number,\n params: any\n }\n }\n } = {};\n\n protected config: Config;\n protected appConfig: MTAppConfig;\n\n constructor() {\n super();\n this.afterMessageIdTemp = 0;\n }\n\n abstract setUserAuth(userAuth: UserAuth | UserId): Promise;\n\n public setUser(user: User) {\n // appUsersManager.saveApiUser(user);\n return this.setUserAuth(user.id);\n }\n\n abstract invokeApi(method: T, params?: MethodDeclMap[T]['req'], options?: InvokeApiOptions): Promise;\n\n public invokeApiAfter(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n let o = options;\n o.prepareTempMessageId = '' + ++this.afterMessageIdTemp;\n\n o = {...options};\n (options as MTMessage).messageId = o.prepareTempMessageId;\n\n // console.log('will invokeApi:', method, params, options);\n return this.invokeApi(method, params, o);\n }\n\n public invokeApiHashable(o: {\n method: T,\n processResult?: (response: MethodDeclMap[T]['res']) => R,\n processError?: (error: ApiError) => any,\n params?: Omit,\n options?: InvokeApiOptions & {cacheKey?: string},\n overwrite?: boolean\n }) {\n // @ts-ignore\n o.params ??= {};\n o.options ??= {};\n // console.log('will invokeApi:', method, params, options);\n\n const {params, options, method, overwrite} = o;\n\n const queryJSON = JSON.stringify(params);\n let cached: HashResult;\n if(this.hashes[method]) {\n cached = this.hashes[method][queryJSON];\n if(cached) {\n if(overwrite) {\n delete this.hashes[method][queryJSON];\n cached = undefined;\n } else {\n (params as any).hash = cached.hash;\n }\n }\n }\n\n return this.invokeApiSingleProcess({\n method,\n processResult: (result) => {\n if(result._.includes('NotModified')) {\n // this.debug && this.log.warn('NotModified saved!', method, queryJSON);\n return cached.result;\n }\n\n if(result.hash/* || result.messages */) {\n const hash = result.hash/* || this.computeHash(result.messages) */;\n\n if(!this.hashes[method]) this.hashes[method] = {};\n cached = this.hashes[method][queryJSON] = {\n hash,\n result\n };\n }\n\n if(o.processResult) {\n const newResult = o.processResult(result);\n return cached ? cached.result = newResult : newResult;\n }\n\n return result;\n },\n params,\n options\n });\n }\n\n public invokeApiSingle(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions = {}): Promise {\n const q = method + '-' + JSON.stringify(params);\n const cache = this.apiPromisesSingle;\n if(cache[q]) {\n return cache[q];\n }\n\n return cache[q] = this.invokeApi(method, params, options).finally(() => {\n delete cache[q];\n });\n }\n\n public invokeApiSingleProcess(o: {\n method: T,\n processResult: (response: MethodDeclMap[T]['res']) => R,\n processError?: (error: ApiError) => any,\n params?: MethodDeclMap[T]['req'],\n options?: InvokeApiOptions & {cacheKey?: string, overwrite?: boolean}\n }): Promise> {\n o.params ??= {};\n o.options ??= {};\n\n const {method, processResult, processError, params, options} = o;\n const cache = this.apiPromisesSingleProcess;\n const cacheKey = options.cacheKey || JSON.stringify(params);\n const map = cache[method] ?? (cache[method] = new Map());\n const oldPromise = map.get(cacheKey);\n if(oldPromise) {\n return oldPromise;\n }\n\n const getNewPromise = () => {\n const promise = map.get(cacheKey);\n return promise === p ? undefined : promise;\n }\n\n const originalPromise = this.invokeApi(method, params, options);\n const newPromise: Promise> = originalPromise.then((result) => {\n return getNewPromise() || processResult(result);\n }, (error) => {\n const promise = getNewPromise();\n if(promise) {\n return promise;\n }\n\n if(!processError) {\n throw error;\n }\n\n return processError(error);\n });\n\n const p = newPromise.finally(() => {\n if(map.get(cacheKey) !== p) {\n return;\n }\n\n map.delete(cacheKey);\n if(!map.size) {\n delete cache[method];\n }\n });\n\n map.set(cacheKey, p);\n return p;\n }\n\n public invokeApiCacheable(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions & Partial<{cacheSeconds: number, override: boolean}> = {}): Promise {\n const cache = this.apiPromisesCacheable[method] ?? (this.apiPromisesCacheable[method] = {});\n const queryJSON = JSON.stringify(params);\n const item = cache[queryJSON];\n if(item && (!options.override || !item.fulfilled)) {\n return item.promise;\n }\n\n if(options.override) {\n if(item && item.timeout) {\n clearTimeout(item.timeout);\n delete item.timeout;\n }\n\n delete options.override;\n }\n\n let timeout: number;\n if(options.cacheSeconds) {\n timeout = ctx.setTimeout(() => {\n delete cache[queryJSON];\n }, options.cacheSeconds * 1000);\n delete options.cacheSeconds;\n }\n\n const promise = this.invokeApi(method, params, options);\n\n cache[queryJSON] = {\n timestamp: Date.now(),\n fulfilled: false,\n timeout,\n promise,\n params\n };\n\n return promise;\n }\n\n public clearCache(method: T, verify: (params: MethodDeclMap[T]['req']) => boolean) {\n const cache = this.apiPromisesCacheable[method];\n if(cache) {\n for(const queryJSON in cache) {\n const item = cache[queryJSON];\n try {\n if(verify(item.params)) {\n if(item.timeout) {\n clearTimeout(item.timeout);\n }\n\n delete cache[queryJSON];\n }\n } catch(err) {\n // this.log.error('clearCache error:', err, queryJSON, item);\n }\n }\n }\n }\n\n public getConfig(overwrite?: boolean) {\n if(this.config && !overwrite) {\n return this.config;\n }\n\n return this.invokeApiSingleProcess({\n method: 'help.getConfig',\n params: {},\n processResult: (config) => {\n this.config = config;\n this.rootScope.dispatchEvent('config', config);\n return config;\n },\n options: {overwrite}\n });\n }\n\n public getAppConfig(overwrite?: boolean) {\n if(this.appConfig && !overwrite) {\n return this.appConfig;\n }\n\n return this.invokeApiSingleProcess({\n method: 'help.getAppConfig',\n params: {},\n processResult: (config: MTAppConfig) => {\n this.appConfig = config;\n ignoreRestrictionReasons(config.ignore_restriction_reasons ?? []);\n this.rootScope.dispatchEvent('app_config', config);\n return config;\n },\n options: {overwrite}\n });\n }\n\n public getLimit(type: ApiLimitType, isPremium?: boolean) {\n return callbackify(this.getAppConfig(), (appConfig) => {\n const map: {[type in ApiLimitType]: [keyof MTAppConfig, keyof MTAppConfig] | keyof MTAppConfig} = {\n pin: ['dialogs_pinned_limit_default', 'dialogs_pinned_limit_premium'],\n folderPin: ['dialogs_folder_pinned_limit_default', 'dialogs_folder_pinned_limit_premium'],\n folders: ['dialog_filters_limit_default', 'dialog_filters_limit_premium'],\n favedStickers: ['stickers_faved_limit_default', 'stickers_faved_limit_premium'],\n reactions: ['reactions_user_max_default', 'reactions_user_max_premium'],\n bio: ['about_length_limit_default', 'about_length_limit_premium'],\n topicPin: 'topics_pinned_limit',\n caption: ['caption_length_limit_default', 'caption_length_limit_premium']\n };\n\n isPremium ??= this.rootScope.premium;\n\n const a = map[type];\n const key = Array.isArray(a) ? a[isPremium ? 1 : 0] : a;\n return appConfig[key] as number;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from './transports/controller';\nimport MTTransport from './transports/transport';\n \n\nimport type {UserAuth} from './mtproto_config';\nimport type {DcAuthKey, DcId, DcServerSalt, InvokeApiOptions} from '../../types';\nimport type {MethodDeclMap} from '../../layer';\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport sessionStorage from '../sessionStorage';\nimport MTPNetworker, {MTMessage} from './networker';\nimport {ConnectionType, constructTelegramWebSocketUrl, DcConfigurator, TransportType} from './dcConfigurator';\nimport {logger} from '../logger';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IDB} from '../files/idb';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport ctx from '../../environment/ctx';\nimport noop from '../../helpers/noop';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport pause from '../../helpers/schedulers/pause';\nimport ApiManagerMethods from './api_methods';\nimport {getEnvironment} from '../../environment/utils';\nimport toggleStorages from '../../helpers/toggleStorages';\n\n/* class RotatableArray {\n public array: Array = [];\n private lastIndex = -1;\n\n public get() {\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\n return this.array[this.lastIndex];\n }\n} */\n\nconst PREMIUM_FILE_NETWORKERS_COUNT = 6;\nconst REGULAR_FILE_NETWORKERS_COUNT = 3;\n\nexport class ApiManager extends ApiManagerMethods {\n private cachedNetworkers: {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTPNetworker[]\n }\n }\n };\n\n private cachedExportPromise: {[x: number]: Promise};\n private gettingNetworkers: {[dcIdAndType: string]: Promise};\n private baseDcId: DcId;\n\n // public telegramMeNotified = false;\n\n private log: ReturnType;\n\n private afterMessageTempIds: {\n [tempId: string]: {\n messageId: string,\n promise: Promise\n }\n };\n\n private transportType: TransportType;\n\n private updatesProcessor: (obj: any) => void;\n\n private loggingOut: boolean;\n\n constructor() {\n super();\n this.log = logger('API');\n\n this.cachedNetworkers = {} as any;\n this.cachedExportPromise = {};\n this.gettingNetworkers = {};\n this.baseDcId = 0;\n this.afterMessageTempIds = {};\n\n this.transportType = Modes.transport;\n\n \n transportController.addEventListener('transport', (transportType) => {\n this.changeTransportType(transportType);\n });\n \n\n // * Make sure that the used autologin_token is no more than 10000 seconds old\n // * https://core.telegram.org/api/url-authorization\n const REFRESH_APP_CONFIG_INTERVAL = (10000 - 30) * 1000;\n setInterval(() => {\n this.getAppConfig(true);\n }, REFRESH_APP_CONFIG_INTERVAL);\n }\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateConfig: () => {\n this.getConfig(true);\n this.getAppConfig(true);\n }\n });\n\n this.rootScope.addEventListener('user_auth', () => {\n if(this.config) { // refresh configs if had a config during authorization\n this.apiUpdatesManager.processLocalUpdate({_: 'updateConfig'});\n }\n });\n\n this.rootScope.addEventListener('premium_toggle', (isPremium) => {\n this.iterateNetworkers(({networker, connectionType, dcId, transportType}) => {\n if(connectionType === 'client' || transportType !== 'websocket') {\n return;\n }\n\n const transport = networker.transport;\n if(!transport) {\n this.log.error('wow what, no transport?', networker);\n return;\n }\n\n if((transport as TcpObfuscated).connection) {\n const url = constructTelegramWebSocketUrl(dcId, connectionType, isPremium);\n (transport as TcpObfuscated).changeUrl(url);\n }\n });\n });\n }\n\n // private lol = false;\n\n // constructor() {\n // MtpSingleInstanceService.start();\n\n /* AppStorage.get('dc').then((dcId) => {\n if(dcId) {\n this.baseDcId = dcId;\n }\n }); */\n // }\n\n /* public telegramMeNotify(newValue: boolean) {\n if(this.telegramMeNotified !== newValue) {\n this.telegramMeNotified = newValue;\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\n }\n } */\n\n private getTransportType(connectionType: ConnectionType) {\n \n \n \n \n \n // @ts-ignore\n const transportType: TransportType = this.transportType;\n \n\n return transportType;\n }\n\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\n for(const transportType in this.cachedNetworkers) {\n const connections = this.cachedNetworkers[transportType as TransportType];\n for(const connectionType in connections) {\n const dcs = connections[connectionType as ConnectionType];\n for(const dcId in dcs) {\n const networkers = dcs[dcId as any as DcId];\n networkers.forEach((networker, idx, arr) => {\n callback({\n networker,\n dcId: +dcId as DcId,\n connectionType: connectionType as ConnectionType,\n transportType: transportType as TransportType,\n index: idx,\n array: arr\n });\n });\n }\n }\n }\n }\n\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\n return this.dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client', this.rootScope.premium);\n }\n\n public changeTransportType(transportType: TransportType) {\n const oldTransportType = this.transportType;\n if(oldTransportType === transportType) {\n return;\n }\n\n this.log('changing transport from', oldTransportType, 'to', transportType);\n\n const oldObject = this.cachedNetworkers[oldTransportType];\n const newObject = this.cachedNetworkers[transportType];\n this.cachedNetworkers[transportType] = oldObject;\n this.cachedNetworkers[oldTransportType] = newObject;\n\n this.transportType = transportType;\n\n for(const oldGetKey in this.gettingNetworkers) {\n const promise = this.gettingNetworkers[oldGetKey];\n delete this.gettingNetworkers[oldGetKey];\n\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\n this.gettingNetworkers[newGetKey] = promise;\n\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\n }\n\n this.iterateNetworkers((info) => {\n const transportType = this.getTransportType(info.connectionType);\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\n this.changeNetworkerTransport(info.networker, transport);\n });\n }\n\n public async getBaseDcId() {\n if(this.baseDcId) {\n return this.baseDcId;\n }\n\n const baseDcId = await sessionStorage.get('dc');\n if(!this.baseDcId) {\n if(!baseDcId) {\n this.setBaseDcId(App.baseDcId);\n } else {\n this.baseDcId = baseDcId;\n }\n }\n\n return this.baseDcId;\n }\n\n public async setUserAuth(userAuth: UserAuth | UserId) {\n if(typeof(userAuth) === 'string' || typeof(userAuth) === 'number') {\n userAuth = {dcID: 0, date: Date.now() / 1000 | 0, id: userAuth.toPeerId(false)};\n }\n\n this.rootScope.dispatchEvent('user_auth', userAuth);\n\n if(!userAuth.dcID) {\n const baseDcId = await this.getBaseDcId();\n userAuth.dcID = baseDcId;\n }\n\n sessionStorage.set({\n user_auth: userAuth\n });\n\n // this.telegramMeNotify(true);\n }\n\n public setBaseDcId(dcId: DcId) {\n const wasDcId = this.baseDcId;\n if(wasDcId) { // if migrated set ondrain\n this.getNetworker(wasDcId).then((networker) => {\n this.setOnDrainIfNeeded(networker);\n });\n }\n\n this.baseDcId = dcId;\n\n sessionStorage.set({\n dc: this.baseDcId\n });\n }\n\n public async logOut() {\n if(this.loggingOut) {\n return;\n }\n\n this.loggingOut = true;\n const storageKeys: Array = [];\n\n const prefix = 'dc';\n for(let dcId = 1; dcId <= 5; dcId++) {\n storageKeys.push(prefix + dcId + '_auth_key' as any);\n }\n\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\n const storageResult = await Promise.all(storageKeys.map((key) => sessionStorage.get(key)));\n\n const logoutPromises: Promise[] = [];\n for(let i = 0; i < storageResult.length; i++) {\n if(storageResult[i]) {\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\n }\n }\n\n const clear = async() => {\n this.baseDcId = undefined;\n // this.telegramMeNotify(false);\n await toggleStorages(false, true);\n IDB.closeDatabases();\n this.rootScope.dispatchEvent('logging_out');\n };\n\n setTimeout(clear, 1e3);\n\n // return;\n\n return Promise.all(logoutPromises).catch((error) => {\n error.handled = true;\n }).finally(clear)/* .then(() => {\n location.pathname = '/';\n }) */;\n }\n\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\n return [dcId, transportType, connectionType].join('-');\n }\n\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\n // const connectionType: ConnectionType = 'client';\n\n const transportType = this.getTransportType(connectionType);\n if(!this.cachedNetworkers[transportType]) {\n this.cachedNetworkers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const cache = this.cachedNetworkers[transportType][connectionType];\n if(!(dcId in cache)) {\n cache[dcId] = [];\n }\n\n const networkers = cache[dcId];\n // @ts-ignore\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (this.rootScope.premium ? PREMIUM_FILE_NETWORKERS_COUNT : REGULAR_FILE_NETWORKERS_COUNT);\n if(networkers.length >= maxNetworkers) {\n let i = maxNetworkers - 1, found = false;\n for(; i >= 0; --i) {\n if(networkers[i].isOnline) {\n found = true;\n break;\n }\n }\n\n const networker = networkers.splice(found ? i : maxNetworkers - 1, 1)[0];\n networkers.unshift(networker);\n return Promise.resolve(networker);\n }\n\n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\n if(this.gettingNetworkers[getKey]) {\n return this.gettingNetworkers[getKey];\n }\n\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\n\n let transport = this.chooseServer(dcId, connectionType, transportType);\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map((key) => sessionStorage.get(key)))\n .then(async([authKeyHex, serverSaltHex]) => {\n let networker: MTPNetworker, error: any;\n if(authKeyHex && authKeyHex.length === 512) {\n if(!serverSaltHex || serverSaltHex.length !== 16) {\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\n }\n\n const authKey = bytesFromHex(authKeyHex);\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1', authKey)).slice(-8);\n const serverSalt = bytesFromHex(serverSaltHex);\n\n networker = this.networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\n } else {\n try { // if no saved state\n const auth = await this.authorizer.auth(dcId);\n\n sessionStorage.set({\n [ak]: bytesToHex(auth.authKey),\n [ss]: bytesToHex(auth.serverSalt)\n });\n\n networker = this.networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\n } catch(_error) {\n error = _error;\n }\n }\n\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\n const newTransportType = this.getTransportType(connectionType);\n if(newTransportType !== transportType) {\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\n transport.destroy();\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, transport);\n\n if(networker) {\n transport = this.chooseServer(dcId, connectionType, newTransportType);\n }\n\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\n }\n\n /* networker.onConnectionStatusChange = (online) => {\n console.log('status:', online);\n }; */\n\n delete this.gettingNetworkers[getKey];\n\n if(error) {\n this.log('get networker error', error, (error as Error).stack);\n throw error;\n }\n\n this.changeNetworkerTransport(networker, transport);\n networkers.unshift(networker);\n this.setOnDrainIfNeeded(networker);\n return networker;\n });\n }\n\n public getNetworkerVoid(dcId: DcId) {\n return this.getNetworker(dcId).then(noop, noop);\n }\n\n private changeNetworkerTransport(networker: MTPNetworker, transport?: MTTransport) {\n const oldTransport = networker.transport;\n if(oldTransport) {\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, oldTransport);\n }\n\n networker.changeTransport(transport);\n }\n\n private onNetworkerDrain(networker: MTPNetworker) {\n this.log('networker drain', networker.dcId);\n networker.onDrain = undefined;\n this.changeNetworkerTransport(networker);\n networker.destroy();\n this.networkerFactory.removeNetworker(networker);\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\n }\n\n public setOnDrainIfNeeded(networker: MTPNetworker) {\n if(networker.onDrain) {\n return;\n }\n\n const checkPromise: Promise = networker.isFileNetworker ?\n Promise.resolve(true) :\n this.getBaseDcId().then((baseDcId) => networker.dcId !== baseDcId);\n checkPromise.then((canRelease) => {\n if(networker.onDrain) {\n return;\n }\n\n if(canRelease) {\n networker.onDrain = () => this.onNetworkerDrain(networker);\n networker.setDrainTimeout();\n }\n });\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n this.networkerFactory.setUpdatesProcessor(callback);\n }\n\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\n // /////this.log('Invoke api', method, params, options);\n\n /* if(!this.lol) {\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\n this.lol = true;\n } */\n\n const deferred = deferredPromise();\n\n let {afterMessageId, prepareTempMessageId} = options;\n if(prepareTempMessageId) {\n deferred.then(() => {\n delete this.afterMessageTempIds[prepareTempMessageId];\n });\n }\n\n if(MOUNT_CLASS_TO) {\n const startTime = Date.now();\n const interval = ctx.setInterval(() => {\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\n }\n // this.cachedUploadNetworkers[2].requestMessageStatus();\n }, 5e3);\n\n deferred.catch(noop).finally(() => {\n clearInterval(interval);\n });\n }\n\n const rejectPromise = async(error: ApiError) => {\n if(!error) {\n error = {type: 'ERROR_EMPTY'};\n } else if(!isObject(error)) {\n error = {message: error};\n }\n\n if((error.code === 401 && error.type === 'SESSION_REVOKED') ||\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\n this.logOut();\n }\n\n if(options.ignoreErrors) {\n throw error;\n }\n\n if(error.code === 406) {\n error.handled = true;\n }\n\n if(!options.noErrorBox) {\n error.input = method;\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\n setTimeout(() => {\n if(!error.handled) {\n if(error.code === 401) {\n this.logOut();\n } else {\n // ErrorService.show({error: error}); // WARNING\n }\n\n error.handled = true;\n }\n }, 100);\n }\n\n throw error;\n };\n\n let dcId: DcId;\n\n let cachedNetworker: MTPNetworker;\n const stack = (new Error()).stack || 'empty stack';\n const performRequest = (): Promise => {\n if(afterMessageId) {\n const after = this.afterMessageTempIds[afterMessageId];\n if(after) {\n options.afterMessageId = after.messageId;\n }\n }\n\n const promise = cachedNetworker.wrapApiCall(method, params, options);\n\n if(prepareTempMessageId) {\n this.afterMessageTempIds[prepareTempMessageId] = {\n messageId: (options as MTMessage).messageId,\n promise: deferred\n };\n }\n\n return promise.catch((error: ApiError) => {\n // if(!options.ignoreErrors) {\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\n }\n\n if(error.code === 401 && this.baseDcId === dcId) {\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\n sessionStorage.delete('dc')\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\n // this.telegramMeNotify(false);\n }\n\n throw error;\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\n if(this.cachedExportPromise[dcId] === undefined) {\n const promise = new Promise((exportResolve, exportReject) => {\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\n this.invokeApi('auth.importAuthorization', {\n id: exportedAuth.id,\n bytes: exportedAuth.bytes\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\n }, exportReject);\n });\n\n this.cachedExportPromise[dcId] = promise;\n }\n\n return this.cachedExportPromise[dcId].then(() => performRequest());\n } else if(error.code === 303) {\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n if(options.dcId) {\n options.dcId = newDcId;\n } else {\n this.setBaseDcId(newDcId);\n }\n\n return this.invokeApi(method, params, options);\n }\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n options.dcId = newDcId;\n return this.invokeApi(method, params, options);\n } else {\n throw error;\n }\n } else if(error.code === 400 && error.type === 'CONNECTION_NOT_INITED') {\n this.networkerFactory.unsetConnectionInited();\n return performRequest();\n } else if(!options.rawError && error.code === 420) {\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\n\n if(waitTime > (options.floodMaxTimeout ?? 60) && !options.prepareTempMessageId) {\n throw error;\n }\n\n return pause(waitTime/* (waitTime + 5) */ * 1000).then(() => performRequest());\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\n const after = this.afterMessageTempIds[afterMessageId];\n\n afterMessageId = undefined;\n delete options.afterMessageId;\n\n if(after) return after.promise.then(() => performRequest());\n else return performRequest();\n } else if(!options.rawError && error.code === 500) {\n const now = Date.now();\n if(options.stopTime) {\n if(now >= options.stopTime) {\n throw error;\n }\n }\n\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\n return pause(options.waitTime * 1000).then(() => performRequest());\n } else if(error.type === 'UNKNOWN' || error.type === 'MTPROTO_CLUSTER_INVALID') { // cluster invalid - request from regular user to premium endpoint\n return pause(1000).then(() => performRequest());\n } else {\n throw error;\n }\n });\n }\n\n let p: Promise;\n if(dcId = (options.dcId || this.baseDcId)) {\n p = this.getNetworker(dcId, options);\n } else {\n p = this.getBaseDcId().then((baseDcId) => this.getNetworker(dcId = baseDcId, options));\n }\n\n p.then((networker) => {\n cachedNetworker = networker;\n const promise = performRequest();\n cachedNetworker.attachPromise(deferred, options as MTMessage);\n return promise;\n })\n .then(deferred.resolve)\n .catch(rejectPromise)\n .catch(deferred.reject);\n\n return deferred;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport applyMixins from '../../helpers/applyMixins';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {AppManager} from '../appManagers/manager';\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\n\ntype PeersStorageKey = `${StatePeerType}_${string | PeerId}` | StatePeerType;\n\nclass PeersStorage {\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map> = new Map();\n\n constructor() {\n this._constructor(false);\n }\n\n protected after() {\n this.rootScope.addEventListener('user_auth', () => {\n this.requestPeer(this.appPeersManager.peerId, 'self');\n });\n }\n\n public requestPeer(peerId: PeerId, key: PeersStorageKey) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(key)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(key);\n\n this.dispatchEvent('peerNeeded', peerId);\n }\n\n public releasePeer(peerId: PeerId, key: PeersStorageKey) {\n const set = this.neededPeers.get(peerId);\n if(!set) {\n return;\n }\n\n set.delete(key);\n\n if(!set.size) {\n this.neededPeers.delete(peerId);\n this.dispatchEvent('peerUnneeded', peerId);\n }\n }\n\n public requestPeersForKey(peerIds: Set | number[], key: PeersStorageKey) {\n if(Array.isArray(peerIds)) {\n peerIds = new Set(peerIds);\n }\n\n let set = this.singlePeerMap.get(key);\n if(set) {\n for(const peerId of set) {\n if(peerIds.has(peerId)) {\n continue;\n }\n\n this.releasePeer(peerId, key);\n set.delete(peerId);\n }\n\n if(!set.size && !peerIds.size) {\n this.singlePeerMap.delete(key);\n return;\n }\n }\n\n if(peerIds.size) {\n if(!set) {\n set = new Set();\n this.singlePeerMap.set(key, set);\n }\n\n for(const peerId of peerIds) {\n if(set.has(peerId)) {\n continue;\n }\n\n this.requestPeer(peerId, key);\n set.add(peerId);\n }\n }\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n}\n\ninterface PeersStorage extends EventListenerBase<{\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void,\n}>, AppManager {}\napplyMixins(PeersStorage, [EventListenerBase, AppManager]);\n\nexport default PeersStorage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WebDocument} from '../../layer';\nimport type {MyDocument} from '../appManagers/appDocsManager';\nimport type {MyPhoto} from '../appManagers/appPhotosManager';\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n\nexport type ThumbCache = {\n downloaded: number,\n url: string,\n type: string\n};\n\nexport type ThumbsCache = {\n [key: string]: {\n [size: string]: ThumbCache\n }\n};\n\nconst thumbFullSize = THUMB_TYPE_FULL;\n\nexport type ThumbStorageMedia = MyPhoto | MyDocument | WebDocument;\n\nexport default class ThumbsStorage {\n private thumbsCache: ThumbsCache = {};\n\n private getKey(media: ThumbStorageMedia) {\n return media._ + ((media as MyPhoto).id ?? (media as WebDocument).url);\n }\n\n public getCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize): ThumbCache {\n /* if(media._ === 'photo' && thumbSize !== 'i') {\n thumbSize = thumbFullSize;\n } */\n\n const cache = this.thumbsCache[this.getKey(media)] ??= {};\n return cache[thumbSize] ??= {downloaded: 0, url: '', type: thumbSize};\n }\n\n public setCacheContextURL(media: ThumbStorageMedia, thumbSize: string = thumbFullSize, url: string, downloaded: number = 0) {\n const cacheContext = this.getCacheContext(media, thumbSize);\n cacheContext.url = url;\n cacheContext.downloaded = downloaded;\n return cacheContext;\n }\n\n public deleteCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize) {\n const cache = this.thumbsCache[this.getKey(media)];\n if(cache) {\n delete cache[thumbSize];\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type MTProtoConstructor = {\n id: number,\n predicate: string,\n params: Array<{\n name: string,\n type: string\n }>,\n type: string\n};\n\nexport type MTProtoMethod = {\n id: number,\n method: string,\n params: Array<{\n name: string,\n type: string\n }>,\n type: string\n};\n\n// eslint-disable-next-line quotes, comma-spacing\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":-994444869,\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":1450380236,\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":2134579434,\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":2107670217,\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-208488460,\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":-181407105,\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-1771768449,\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.2?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":-1279654347,\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-104578748,\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":-122978821,\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":480546647,\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":-968723890,\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"InputChatPhoto\"},{\"id\":-1991004873,\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":-457104426,\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":1210199983,\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"InputGeoPoint\"},{\"id\":483901197,\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":1001634122,\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":-539317279,\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1432995067,\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1086091090,\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":8322574,\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-891180321,\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":172975040,\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1373745011,\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1384777335,\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1258941372,\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1278304028,\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":276907596,\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-742634630,\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"User\"},{\"id\":1326562017,\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":-2100168954,\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"personal\",\"type\":\"flags.2?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":164646985,\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-306628279,\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":9203775,\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":693512293,\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Chat\"},{\"id\":1103884886,\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.25?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":1704108455,\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":-908914376,\"predicate\":\"chatFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_set_username\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.13?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"flags.3?Vector\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"call\",\"type\":\"flags.12?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.15?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.16?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.17?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.17?Vector\"},{\"name\":\"available_reactions\",\"type\":\"flags.18?ChatReactions\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-2023500831,\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":1018991608,\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":935395612,\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":476978193,\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"ChatPhoto\"},{\"id\":-1868117372,\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"peer_id\",\"type\":\"flags.0?Peer\"}],\"type\":\"Message\"},{\"id\":940666592,\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"edit_hide\",\"type\":\"flags.21?true\"},{\"name\":\"pinned\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"forwards\",\"type\":\"flags.10?int\"},{\"name\":\"replies\",\"type\":\"flags.23?MessageReplies\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"},{\"name\":\"reactions\",\"type\":\"flags.20?MessageReactions\"},{\"name\":\"restriction_reason\",\"type\":\"flags.22?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":721967202,\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":1038967584,\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":1766936791,\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.3?true\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1457575028,\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":1882335561,\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageMedia\"},{\"id\":-1618676578,\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":-1230047312,\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1119368275,\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1247687078,\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":2144015272,\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-1780220945,\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":365886720,\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1539362612,\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-712374074,\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"unread_mark\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"unread_reactions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"},{\"name\":\"folder_id\",\"type\":\"flags.4?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.5?int\"}],\"type\":\"Dialog\"},{\"id\":590459437,\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":-82216347,\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"},{\"name\":\"video_sizes\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"Photo\"},{\"id\":236446268,\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":1976012384,\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":35527382,\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":286776671,\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":-1297942941,\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"GeoPoint\"},{\"id\":1577067778,\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":872119224,\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"setup_password_required\",\"type\":\"flags.1?true\"},{\"name\":\"otherwise_relogin_days\",\"type\":\"flags.1?int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":-1271602504,\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1195615476,\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":423314455,\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":1251338318,\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-551616469,\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?NotificationSound\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1472527322,\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"ios_sound\",\"type\":\"flags.3?NotificationSound\"},{\"name\":\"android_sound\",\"type\":\"flags.4?NotificationSound\"},{\"name\":\"other_sound\",\"type\":\"flags.5?NotificationSound\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-1525149427,\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"},{\"name\":\"add_contact\",\"type\":\"flags.1?true\"},{\"name\":\"block_contact\",\"type\":\"flags.2?true\"},{\"name\":\"share_contact\",\"type\":\"flags.3?true\"},{\"name\":\"need_contacts_exception\",\"type\":\"flags.4?true\"},{\"name\":\"report_geo\",\"type\":\"flags.5?true\"},{\"name\":\"autoarchived\",\"type\":\"flags.7?true\"},{\"name\":\"invite_members\",\"type\":\"flags.8?true\"},{\"name\":\"request_chat_broadcast\",\"type\":\"flags.10?true\"},{\"name\":\"geo_distance\",\"type\":\"flags.6?int\"},{\"name\":\"request_chat_title\",\"type\":\"flags.9?string\"},{\"name\":\"request_chat_date\",\"type\":\"flags.9?int\"}],\"type\":\"PeerSettings\"},{\"id\":-1539849235,\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"pattern\",\"type\":\"flags.3?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"Document\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1490799288,\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":505595789,\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":777640226,\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1376497949,\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1041980751,\"predicate\":\"inputReportReasonOther\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-120378643,\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"can_pin_message\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.12?true\"},{\"name\":\"video_calls_available\",\"type\":\"flags.13?true\"},{\"name\":\"voice_messages_forbidden\",\"type\":\"flags.20?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"personal_photo\",\"type\":\"flags.21?Photo\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"fallback_photo\",\"type\":\"flags.22?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"common_chats_count\",\"type\":\"int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.15?string\"},{\"name\":\"private_forward_name\",\"type\":\"flags.16?string\"},{\"name\":\"bot_group_admin_rights\",\"type\":\"flags.17?ChatAdminRights\"},{\"name\":\"bot_broadcast_admin_rights\",\"type\":\"flags.18?ChatAdminRights\"},{\"name\":\"premium_gifts\",\"type\":\"flags.19?Vector\"}],\"type\":\"UserFull\"},{\"id\":341499403,\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":-1052885936,\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":383348795,\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":-1219778094,\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":-353862078,\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Contacts\"},{\"id\":2010127419,\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector\"},{\"name\":\"popular_invites\",\"type\":\"Vector\"},{\"name\":\"retry_contacts\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":182326673,\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":-513392236,\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":364538944,\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":1910543603,\"predicate\":\"messages.dialogsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1938715001,\"predicate\":\"messages.messages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":978610270,\"predicate\":\"messages.messagesSlice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"next_rate\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-438840932,\"predicate\":\"messages.chatFull\",\"params\":[{\"name\":\"full_chat\",\"type\":\"ChatFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1269012015,\"predicate\":\"messages.affectedHistory\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1474492012,\"predicate\":\"inputMessagesFilterEmpty\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1777752804,\"predicate\":\"inputMessagesFilterPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1614803355,\"predicate\":\"inputMessagesFilterVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1458172132,\"predicate\":\"inputMessagesFilterPhotoVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1629621880,\"predicate\":\"inputMessagesFilterDocument\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":2129714567,\"predicate\":\"inputMessagesFilterUrl\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-3644025,\"predicate\":\"inputMessagesFilterGif\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":522914557,\"predicate\":\"updateNewMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1318109142,\"predicate\":\"updateMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1576161051,\"predicate\":\"updateDeleteMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1071741569,\"predicate\":\"updateUserTyping\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-2092401936,\"predicate\":\"updateChatUserTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":125178264,\"predicate\":\"updateChatParticipants\",\"params\":[{\"name\":\"participants\",\"type\":\"ChatParticipants\"}],\"type\":\"Update\"},{\"id\":-440534818,\"predicate\":\"updateUserStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"Update\"},{\"id\":-1484486364,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"usernames\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1519637954,\"predicate\":\"updates.state\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"}],\"type\":\"updates.State\"},{\"id\":1567990072,\"predicate\":\"updates.differenceEmpty\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":16030880,\"predicate\":\"updates.difference\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-1459938943,\"predicate\":\"updates.differenceSlice\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"intermediate_state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-484987010,\"predicate\":\"updatesTooLong\",\"params\":[],\"type\":\"Updates\"},{\"id\":826001400,\"predicate\":\"updateShortMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":1299050149,\"predicate\":\"updateShortChatMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":2027216577,\"predicate\":\"updateShort\",\"params\":[{\"name\":\"update\",\"type\":\"Update\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1918567619,\"predicate\":\"updatesCombined\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq_start\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1957577280,\"predicate\":\"updates\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1916114267,\"predicate\":\"photos.photos\",\"params\":[{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":352657236,\"predicate\":\"photos.photosSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":539045032,\"predicate\":\"photos.photo\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photo\"},{\"id\":157948117,\"predicate\":\"upload.file\",\"params\":[{\"name\":\"type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.File\"},{\"id\":414687501,\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"this_port_only\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":589653676,\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"force_try_ipv6\",\"type\":\"flags.14?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"reactions_default\",\"type\":\"flags.15?Reaction\"}],\"type\":\"Config\"},{\"id\":-1910892683,\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":-860107216,\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"sticker\",\"type\":\"flags.3?Document\"}],\"type\":\"help.AppUpdate\"},{\"id\":-1000708810,\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":415997816,\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":314359194,\"predicate\":\"updateNewEncryptedMessage\",\"params\":[{\"name\":\"message\",\"type\":\"EncryptedMessage\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":386986326,\"predicate\":\"updateEncryptedChatTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1264392051,\"predicate\":\"updateEncryption\",\"params\":[{\"name\":\"chat\",\"type\":\"EncryptedChat\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":956179895,\"predicate\":\"updateEncryptedMessagesRead\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1417756512,\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":1722964307,\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":1223809356,\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1643173063,\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":505183301,\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"history_deleted\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":-247351839,\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":-1038136962,\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":-1476358952,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":406307684,\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":1690108678,\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1511503333,\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-317144808,\"predicate\":\"encryptedMessage\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"EncryptedMessage\"},{\"id\":594758406,\"predicate\":\"encryptedMessageService\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"EncryptedMessage\"},{\"id\":-1058912715,\"predicate\":\"messages.dhConfigNotModified\",\"params\":[{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":740433629,\"predicate\":\"messages.dhConfig\",\"params\":[{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":1443858741,\"predicate\":\"messages.sentEncryptedMessage\",\"params\":[{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-1802240206,\"predicate\":\"messages.sentEncryptedFile\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1037718609,\"predicate\":\"updateChatParticipantAdd\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-483443337,\"predicate\":\"updateChatParticipantDelete\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1906403213,\"predicate\":\"updateDcOptions\",\"params\":[{\"name\":\"dc_options\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1530447553,\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"force_file\",\"type\":\"flags.4?true\"},{\"name\":\"spoiler\",\"type\":\"flags.5?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":860303448,\"predicate\":\"inputMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"},{\"name\":\"query\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nopremium\",\"type\":\"flags.3?true\"},{\"name\":\"spoiler\",\"type\":\"flags.4?true\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1928391342,\"predicate\":\"inputDocumentEmpty\",\"params\":[],\"type\":\"InputDocument\"},{\"id\":448771445,\"predicate\":\"inputDocument\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputDocument\"},{\"id\":-1160743548,\"predicate\":\"inputDocumentFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":-1881881384,\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector\"},{\"name\":\"video_thumbs\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"Document\"},{\"id\":398898678,\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":-1613493288,\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":-1261946036,\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1073230141,\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"id\":381645902,\"predicate\":\"sendMessageTypingAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-44119819,\"predicate\":\"sendMessageCancelAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1584933265,\"predicate\":\"sendMessageRecordVideoAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-378127636,\"predicate\":\"sendMessageUploadVideoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-718310409,\"predicate\":\"sendMessageRecordAudioAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-212740181,\"predicate\":\"sendMessageUploadAudioAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-774682074,\"predicate\":\"sendMessageUploadPhotoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1441998364,\"predicate\":\"sendMessageUploadDocumentAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":393186209,\"predicate\":\"sendMessageGeoLocationAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":1653390447,\"predicate\":\"sendMessageChooseContactAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1290580579,\"predicate\":\"contacts.found\",\"params\":[{\"name\":\"my_results\",\"type\":\"Vector\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Found\"},{\"id\":-337352679,\"predicate\":\"updateServiceNotification\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"inbox_date\",\"type\":\"flags.1?int\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"MessageMedia\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-496024847,\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":129960444,\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":2011940674,\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-298113238,\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1335282456,\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1137792208,\"predicate\":\"privacyKeyStatusTimestamp\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":218751099,\"predicate\":\"inputPrivacyValueAllowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":407582158,\"predicate\":\"inputPrivacyValueAllowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":320652927,\"predicate\":\"inputPrivacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":195371015,\"predicate\":\"inputPrivacyValueDisallowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-697604407,\"predicate\":\"inputPrivacyValueDisallowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-1877932953,\"predicate\":\"inputPrivacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-123988,\"predicate\":\"privacyValueAllowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":1698855810,\"predicate\":\"privacyValueAllowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1198497870,\"predicate\":\"privacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-125240806,\"predicate\":\"privacyValueDisallowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1955338397,\"predicate\":\"privacyValueDisallowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-463335103,\"predicate\":\"privacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1352683077,\"predicate\":\"account.privacyRules\",\"params\":[{\"name\":\"rules\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1194283041,\"predicate\":\"accountDaysTTL\",\"params\":[{\"name\":\"days\",\"type\":\"int\"}],\"type\":\"AccountDaysTTL\"},{\"id\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1815593308,\"predicate\":\"documentAttributeImageSize\",\"params\":[{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":297109817,\"predicate\":\"documentAttributeAnimated\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1662637586,\"predicate\":\"documentAttributeSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"mask\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"DocumentAttribute\"},{\"id\":250621158,\"predicate\":\"documentAttributeVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"round_message\",\"type\":\"flags.0?true\"},{\"name\":\"supports_streaming\",\"type\":\"flags.1?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1739392570,\"predicate\":\"documentAttributeAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"voice\",\"type\":\"flags.10?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"},{\"name\":\"waveform\",\"type\":\"flags.2?bytes\"}],\"type\":\"DocumentAttribute\"},{\"id\":358154344,\"predicate\":\"documentAttributeFilename\",\"params\":[{\"name\":\"file_name\",\"type\":\"string\"}],\"type\":\"DocumentAttribute\"},{\"id\":-244016606,\"predicate\":\"messages.stickersNotModified\",\"params\":[],\"type\":\"messages.Stickers\"},{\"id\":816245886,\"predicate\":\"messages.stickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.Stickers\"},{\"id\":313694676,\"predicate\":\"stickerPack\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerPack\"},{\"id\":-395967805,\"predicate\":\"messages.allStickersNotModified\",\"params\":[],\"type\":\"messages.AllStickers\"},{\"id\":-843329861,\"predicate\":\"messages.allStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.AllStickers\"},{\"id\":-1667805217,\"predicate\":\"updateReadHistoryInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":791617983,\"predicate\":\"updateReadHistoryOutbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-350980120,\"predicate\":\"webPageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"WebPage\"},{\"id\":-981018084,\"predicate\":\"webPagePending\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-392411726,\"predicate\":\"webPage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"display_url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"type\",\"type\":\"flags.0?string\"},{\"name\":\"site_name\",\"type\":\"flags.1?string\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"embed_url\",\"type\":\"flags.5?string\"},{\"name\":\"embed_type\",\"type\":\"flags.5?string\"},{\"name\":\"embed_width\",\"type\":\"flags.6?int\"},{\"name\":\"embed_height\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"author\",\"type\":\"flags.8?string\"},{\"name\":\"document\",\"type\":\"flags.9?Document\"},{\"name\":\"cached_page\",\"type\":\"flags.10?Page\"},{\"name\":\"attributes\",\"type\":\"flags.12?Vector\"}],\"type\":\"WebPage\"},{\"id\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"id\":-1392388579,\"predicate\":\"authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.0?true\"},{\"name\":\"official_app\",\"type\":\"flags.1?true\"},{\"name\":\"password_pending\",\"type\":\"flags.2?true\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.3?true\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.4?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"app_name\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"Authorization\"},{\"id\":1275039392,\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"},{\"name\":\"authorizations\",\"type\":\"Vector\"}],\"type\":\"account.Authorizations\"},{\"id\":-1787080453,\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"},{\"name\":\"pending_reset_date\",\"type\":\"flags.5?int\"},{\"name\":\"login_email_pattern\",\"type\":\"flags.6?string\"}],\"type\":\"account.Password\"},{\"id\":-1705233435,\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1036572727,\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":326715557,\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":-1052959727,\"predicate\":\"inputMediaVenue\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":784356159,\"predicate\":\"messageMediaVenue\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1551583367,\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":179611673,\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.0?true\"},{\"name\":\"permanent\",\"type\":\"flags.5?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"start_date\",\"type\":\"flags.4?int\"},{\"name\":\"expire_date\",\"type\":\"flags.1?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.2?int\"},{\"name\":\"usage\",\"type\":\"flags.3?int\"},{\"name\":\"requested\",\"type\":\"flags.7?int\"},{\"name\":\"title\",\"type\":\"flags.8?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1516793212,\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":806110401,\"predicate\":\"chatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"flags.0?true\"},{\"name\":\"broadcast\",\"type\":\"flags.1?true\"},{\"name\":\"public\",\"type\":\"flags.2?true\"},{\"name\":\"megagroup\",\"type\":\"flags.3?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"flags.5?string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector\"}],\"type\":\"ChatInvite\"},{\"id\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-4838507,\"predicate\":\"inputStickerSetEmpty\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1645763991,\"predicate\":\"inputStickerSetID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputStickerSet\"},{\"id\":-2044933984,\"predicate\":\"inputStickerSetShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":768691932,\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"videos\",\"type\":\"flags.6?true\"},{\"name\":\"emojis\",\"type\":\"flags.7?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumbs\",\"type\":\"flags.4?Vector\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_version\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_document_id\",\"type\":\"flags.8?long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":1846886166,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"keywords\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":-1885878744,\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"apply_min_photo\",\"type\":\"flags.25?true\"},{\"name\":\"fake\",\"type\":\"flags.26?true\"},{\"name\":\"bot_attach_menu\",\"type\":\"flags.27?true\"},{\"name\":\"premium\",\"type\":\"flags.28?true\"},{\"name\":\"attach_menu_enabled\",\"type\":\"flags.29?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"},{\"name\":\"emoji_status\",\"type\":\"flags.30?EmojiStatus\"},{\"name\":\"usernames\",\"type\":\"flags2.0?Vector\"}],\"type\":\"User\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":-1892676777,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"flags.0?long\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"description_photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"description_document\",\"type\":\"flags.5?Document\"},{\"name\":\"commands\",\"type\":\"flags.2?Vector\"},{\"name\":\"menu_button\",\"type\":\"flags.3?BotMenuButton\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":2002815875,\"predicate\":\"keyboardButtonRow\",\"params\":[{\"name\":\"buttons\",\"type\":\"Vector\"}],\"type\":\"KeyboardButtonRow\"},{\"id\":-1606526075,\"predicate\":\"replyKeyboardHide\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2035021048,\"predicate\":\"replyKeyboardForceReply\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2049074735,\"predicate\":\"replyKeyboardMarkup\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"resize\",\"type\":\"flags.0?true\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"persistent\",\"type\":\"flags.4?true\"},{\"name\":\"rows\",\"type\":\"Vector\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":-1148011883,\"predicate\":\"messageEntityUnknown\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-100378723,\"predicate\":\"messageEntityMention\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1868782349,\"predicate\":\"messageEntityHashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1827637959,\"predicate\":\"messageEntityBotCommand\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1859134776,\"predicate\":\"messageEntityUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1692693954,\"predicate\":\"messageEntityEmail\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1117713463,\"predicate\":\"messageEntityBold\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-2106619040,\"predicate\":\"messageEntityItalic\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":681706865,\"predicate\":\"messageEntityCode\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1938967520,\"predicate\":\"messageEntityPre\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":1990644519,\"predicate\":\"messageEntityTextUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":-1877614335,\"predicate\":\"updateShortSentMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":-292807034,\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":-212145112,\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-2094689180,\"predicate\":\"channel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"verified\",\"type\":\"flags.7?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"restricted\",\"type\":\"flags.9?true\"},{\"name\":\"signatures\",\"type\":\"flags.11?true\"},{\"name\":\"min\",\"type\":\"flags.12?true\"},{\"name\":\"scam\",\"type\":\"flags.19?true\"},{\"name\":\"has_link\",\"type\":\"flags.20?true\"},{\"name\":\"has_geo\",\"type\":\"flags.21?true\"},{\"name\":\"slowmode_enabled\",\"type\":\"flags.22?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"fake\",\"type\":\"flags.25?true\"},{\"name\":\"gigagroup\",\"type\":\"flags.26?true\"},{\"name\":\"noforwards\",\"type\":\"flags.27?true\"},{\"name\":\"join_to_send\",\"type\":\"flags.28?true\"},{\"name\":\"join_request\",\"type\":\"flags.29?true\"},{\"name\":\"forum\",\"type\":\"flags.30?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.13?long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"flags.6?string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.9?Vector\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"banned_rights\",\"type\":\"flags.15?ChatBannedRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"},{\"name\":\"participants_count\",\"type\":\"flags.17?int\"},{\"name\":\"usernames\",\"type\":\"flags2.0?Vector\"}],\"type\":\"Chat\"},{\"id\":399807445,\"predicate\":\"channelForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"until_date\",\"type\":\"flags.16?int\"}],\"type\":\"Chat\"},{\"id\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-231385849,\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.20?true\"},{\"name\":\"blocked\",\"type\":\"flags.22?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"name\":\"can_delete_channel\",\"type\":\"flags2.0?true\"},{\"name\":\"antispam\",\"type\":\"flags2.1?true\"},{\"name\":\"participants_hidden\",\"type\":\"flags2.2?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.23?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?long\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?long\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"stats_dc\",\"type\":\"flags.12?int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"call\",\"type\":\"flags.21?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.24?int\"},{\"name\":\"pending_suggestions\",\"type\":\"flags.25?Vector\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.26?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.27?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.28?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.28?Vector\"},{\"name\":\"default_send_as\",\"type\":\"flags.29?Peer\"},{\"name\":\"available_reactions\",\"type\":\"flags.30?ChatReactions\"}],\"type\":\"ChatFull\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":-948520370,\"predicate\":\"messages.channelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"topics\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":277713951,\"predicate\":\"updateChannelTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1666927625,\"predicate\":\"updateChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1656358105,\"predicate\":\"updateNewChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1842450928,\"predicate\":\"updateReadChannelInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1020437742,\"predicate\":\"updateDeleteChannelMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-232346616,\"predicate\":\"updateChannelMessageViews\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1041346555,\"predicate\":\"updates.channelDifferenceEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1531132162,\"predicate\":\"updates.channelDifferenceTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"dialog\",\"type\":\"Dialog\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":543450958,\"predicate\":\"updates.channelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1798033689,\"predicate\":\"channelMessagesFilterEmpty\",\"params\":[],\"type\":\"ChannelMessagesFilter\"},{\"id\":-847783593,\"predicate\":\"channelMessagesFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_new_messages\",\"type\":\"flags.1?true\"},{\"name\":\"ranges\",\"type\":\"Vector\"}],\"type\":\"ChannelMessagesFilter\"},{\"id\":-1072953408,\"predicate\":\"channelParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":900251559,\"predicate\":\"channelParticipantSelf\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"via_request\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":803602899,\"predicate\":\"channelParticipantCreator\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.0?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":-566281095,\"predicate\":\"channelParticipantsRecent\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1268741783,\"predicate\":\"channelParticipantsAdmins\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1548400251,\"predicate\":\"channelParticipantsKicked\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1699676497,\"predicate\":\"channels.channelParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-541588713,\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":-462696732,\"predicate\":\"chatParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"ChatParticipant\"},{\"id\":-1600962725,\"predicate\":\"chatParticipantAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-674602590,\"predicate\":\"updateChatParticipantAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"is_admin\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-519864430,\"predicate\":\"messageActionChatMigrateTo\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-365344535,\"predicate\":\"messageActionChannelMigrateFrom\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":2013922064,\"predicate\":\"help.termsOfService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"DataJSON\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"min_age_confirm\",\"type\":\"flags.1?int\"}],\"type\":\"help.TermsOfService\"},{\"id\":1753886890,\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":196268545,\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":834816008,\"predicate\":\"updateStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"}],\"type\":\"Update\"},{\"id\":-402498398,\"predicate\":\"messages.savedGifsNotModified\",\"params\":[],\"type\":\"messages.SavedGifs\"},{\"id\":-2069878259,\"predicate\":\"messages.savedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"gifs\",\"type\":\"Vector\"}],\"type\":\"messages.SavedGifs\"},{\"id\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"id\":864077702,\"predicate\":\"inputBotInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1036876423,\"predicate\":\"inputBotInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-2000710887,\"predicate\":\"inputBotInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?InputWebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?InputWebDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1984755728,\"predicate\":\"botInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1937807902,\"predicate\":\"botInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":295067450,\"predicate\":\"botInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?WebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1803769784,\"predicate\":\"messages.botResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"next_offset\",\"type\":\"flags.1?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.2?InlineBotSwitchPM\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.BotResults\"},{\"id\":1232025500,\"predicate\":\"updateBotInlineQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"peer_type\",\"type\":\"flags.1?InlineQueryPeerType\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":317794823,\"predicate\":\"updateBotInlineSend\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"flags.1?InputBotInlineMessageID\"}],\"type\":\"Update\"},{\"id\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1571494644,\"predicate\":\"exportedMessageLink\",\"params\":[{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"html\",\"type\":\"string\"}],\"type\":\"ExportedMessageLink\"},{\"id\":1601666510,\"predicate\":\"messageFwdHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"imported\",\"type\":\"flags.7?true\"},{\"name\":\"from_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"from_name\",\"type\":\"flags.5?string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"post_author\",\"type\":\"flags.3?string\"},{\"name\":\"saved_from_peer\",\"type\":\"flags.4?Peer\"},{\"name\":\"saved_from_msg_id\",\"type\":\"flags.4?int\"},{\"name\":\"psa_type\",\"type\":\"flags.6?string\"}],\"type\":\"MessageFwdHeader\"},{\"id\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1923290508,\"predicate\":\"auth.codeTypeSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1948046307,\"predicate\":\"auth.codeTypeCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":577556219,\"predicate\":\"auth.codeTypeFlashCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1035688326,\"predicate\":\"auth.sentCodeTypeApp\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1073693790,\"predicate\":\"auth.sentCodeTypeSms\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1398007207,\"predicate\":\"auth.sentCodeTypeCall\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1425815847,\"predicate\":\"auth.sentCodeTypeFlashCall\",\"params\":[{\"name\":\"pattern\",\"type\":\"string\"}],\"type\":\"auth.SentCodeType\"},{\"id\":629866245,\"predicate\":\"keyboardButtonUrl\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":901503851,\"predicate\":\"keyboardButtonCallback\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requires_password\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"KeyboardButton\"},{\"id\":-1318425559,\"predicate\":\"keyboardButtonRequestPhone\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-59151553,\"predicate\":\"keyboardButtonRequestGeoLocation\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":90744648,\"predicate\":\"keyboardButtonSwitchInline\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"same_peer\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"ReplyMarkup\"},{\"id\":911761060,\"predicate\":\"messages.botCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"has_url\",\"type\":\"flags.3?true\"},{\"name\":\"native_ui\",\"type\":\"flags.4?true\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-1177566067,\"predicate\":\"updateBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1768777083,\"predicate\":\"inputBotInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1098628881,\"predicate\":\"inputBotInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1494368259,\"predicate\":\"inputBotInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":85477117,\"predicate\":\"botInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1970903652,\"predicate\":\"botInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":416402882,\"predicate\":\"botInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1462213465,\"predicate\":\"inputBotInlineResultPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"InputPhoto\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-459324,\"predicate\":\"inputBotInlineResultDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":400266251,\"predicate\":\"botInlineMediaResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":1763610706,\"predicate\":\"updateInlineBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"msg_id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":1008755359,\"predicate\":\"inlineBotSwitchPM\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InlineBotSwitchPM\"},{\"id\":863093588,\"predicate\":\"messages.peerDialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-305282981,\"predicate\":\"topPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"rating\",\"type\":\"double\"}],\"type\":\"TopPeer\"},{\"id\":-1419371685,\"predicate\":\"topPeerCategoryBotsPM\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":344356834,\"predicate\":\"topPeerCategoryBotsInline\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":104314861,\"predicate\":\"topPeerCategoryCorrespondents\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1122524854,\"predicate\":\"topPeerCategoryGroups\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":371037736,\"predicate\":\"topPeerCategoryChannels\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-75283823,\"predicate\":\"topPeerCategoryPeers\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"TopPeerCategoryPeers\"},{\"id\":-567906571,\"predicate\":\"contacts.topPeersNotModified\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":1891070632,\"predicate\":\"contacts.topPeers\",\"params\":[{\"name\":\"categories\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.TopPeers\"},{\"id\":-595914432,\"predicate\":\"messageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":546203849,\"predicate\":\"inputMessageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"MessageEntity\"},{\"id\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1218471511,\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":457829485,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"id\":453805082,\"predicate\":\"draftMessageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"flags.0?int\"}],\"type\":\"DraftMessage\"},{\"id\":-40996577,\"predicate\":\"draftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"DraftMessage\"},{\"id\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-1103615738,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"},{\"name\":\"unread\",\"type\":\"Vector\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":186120336,\"predicate\":\"messages.recentStickersNotModified\",\"params\":[],\"type\":\"messages.RecentStickers\"},{\"id\":-1999405994,\"predicate\":\"messages.recentStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"dates\",\"type\":\"Vector\"}],\"type\":\"messages.RecentStickers\"},{\"id\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1338747336,\"predicate\":\"messages.archivedStickers\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":946083368,\"predicate\":\"messages.stickerSetInstallResultSuccess\",\"params\":[],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":904138920,\"predicate\":\"messages.stickerSetInstallResultArchive\",\"params\":[{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":1678812626,\"predicate\":\"stickerSetCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"cover\",\"type\":\"Document\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":-440664550,\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.1?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.1?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":872932635,\"predicate\":\"stickerSetMultiCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"covers\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1361650766,\"predicate\":\"maskCoords\",\"params\":[{\"name\":\"n\",\"type\":\"int\"},{\"name\":\"x\",\"type\":\"double\"},{\"name\":\"y\",\"type\":\"double\"},{\"name\":\"zoom\",\"type\":\"double\"}],\"type\":\"MaskCoords\"},{\"id\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1251549527,\"predicate\":\"inputStickeredMediaPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputStickeredMedia\"},{\"id\":70813275,\"predicate\":\"inputStickeredMediaDocument\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"}],\"type\":\"InputStickeredMedia\"},{\"id\":-1107729093,\"predicate\":\"game\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"}],\"type\":\"Game\"},{\"id\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":53231223,\"predicate\":\"inputGameID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGame\"},{\"id\":-1020139510,\"predicate\":\"inputGameShortName\",\"params\":[{\"name\":\"bot_id\",\"type\":\"InputUser\"},{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputGame\"},{\"id\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1940093419,\"predicate\":\"highScore\",\"params\":[{\"name\":\"pos\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"HighScore\"},{\"id\":-1707344487,\"predicate\":\"messages.highScores\",\"params\":[{\"name\":\"scores\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.HighScores\"},{\"id\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":791390623,\"predicate\":\"updateChannelWebPage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-599948721,\"predicate\":\"textEmpty\",\"params\":[],\"type\":\"RichText\"},{\"id\":1950782688,\"predicate\":\"textPlain\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":1730456516,\"predicate\":\"textBold\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-653089380,\"predicate\":\"textItalic\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1054465340,\"predicate\":\"textUnderline\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1678197867,\"predicate\":\"textStrike\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1816074681,\"predicate\":\"textFixed\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1009288385,\"predicate\":\"textUrl\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"}],\"type\":\"RichText\"},{\"id\":-564523562,\"predicate\":\"textEmail\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":2120376535,\"predicate\":\"textConcat\",\"params\":[{\"name\":\"texts\",\"type\":\"Vector\"}],\"type\":\"RichText\"},{\"id\":324435594,\"predicate\":\"pageBlockUnsupported\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":1890305021,\"predicate\":\"pageBlockTitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1879401953,\"predicate\":\"pageBlockSubtitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1162877472,\"predicate\":\"pageBlockAuthorDate\",\"params\":[{\"name\":\"author\",\"type\":\"RichText\"},{\"name\":\"published_date\",\"type\":\"int\"}],\"type\":\"PageBlock\"},{\"id\":-1076861716,\"predicate\":\"pageBlockHeader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-248793375,\"predicate\":\"pageBlockSubheader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1182402406,\"predicate\":\"pageBlockParagraph\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1066346178,\"predicate\":\"pageBlockPreformatted\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":1216809369,\"predicate\":\"pageBlockFooter\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-618614392,\"predicate\":\"pageBlockDivider\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":-837994576,\"predicate\":\"pageBlockAnchor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":-454524911,\"predicate\":\"pageBlockList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":641563686,\"predicate\":\"pageBlockBlockquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1329878739,\"predicate\":\"pageBlockPullquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":391759200,\"predicate\":\"pageBlockPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"},{\"name\":\"url\",\"type\":\"flags.0?string\"},{\"name\":\"webpage_id\",\"type\":\"flags.0?long\"}],\"type\":\"PageBlock\"},{\"id\":2089805750,\"predicate\":\"pageBlockVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autoplay\",\"type\":\"flags.0?true\"},{\"name\":\"loop\",\"type\":\"flags.1?true\"},{\"name\":\"video_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":972174080,\"predicate\":\"pageBlockCover\",\"params\":[{\"name\":\"cover\",\"type\":\"PageBlock\"}],\"type\":\"PageBlock\"},{\"id\":-1468953147,\"predicate\":\"pageBlockEmbed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"full_width\",\"type\":\"flags.0?true\"},{\"name\":\"allow_scrolling\",\"type\":\"flags.3?true\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"html\",\"type\":\"flags.2?string\"},{\"name\":\"poster_photo_id\",\"type\":\"flags.4?long\"},{\"name\":\"w\",\"type\":\"flags.5?int\"},{\"name\":\"h\",\"type\":\"flags.5?int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-229005301,\"predicate\":\"pageBlockEmbedPost\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"author_photo_id\",\"type\":\"long\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1705048653,\"predicate\":\"pageBlockCollage\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":52401552,\"predicate\":\"pageBlockSlideshow\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-2048646399,\"predicate\":\"phoneCallDiscardReasonMissed\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-527056480,\"predicate\":\"phoneCallDiscardReasonDisconnect\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1471006352,\"predicate\":\"phoneCallDiscardReasonHangup\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-84416311,\"predicate\":\"phoneCallDiscardReasonBusy\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1852826908,\"predicate\":\"updateDialogPinned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-99664734,\"predicate\":\"updatePinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":-2095595325,\"predicate\":\"updateBotWebhookJSON\",\"params\":[{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-1684914010,\"predicate\":\"updateBotWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"},{\"name\":\"timeout\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":1048946971,\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"recurring\",\"type\":\"flags.9?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"},{\"name\":\"max_tip_amount\",\"type\":\"flags.8?long\"},{\"name\":\"suggested_tip_amounts\",\"type\":\"flags.8?Vector\"},{\"name\":\"recurring_terms_url\",\"type\":\"flags.9?string\"}],\"type\":\"Invoice\"},{\"id\":-1900697899,\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"flags.1?string\"},{\"name\":\"extended_media\",\"type\":\"flags.2?InputMedia\"}],\"type\":\"InputMedia\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":-156940077,\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"},{\"name\":\"extended_media\",\"type\":\"flags.4?MessageExtendedMedia\"}],\"type\":\"MessageMedia\"},{\"id\":512535275,\"predicate\":\"postAddress\",\"params\":[{\"name\":\"street_line1\",\"type\":\"string\"},{\"name\":\"street_line2\",\"type\":\"string\"},{\"name\":\"city\",\"type\":\"string\"},{\"name\":\"state\",\"type\":\"string\"},{\"name\":\"country_iso2\",\"type\":\"string\"},{\"name\":\"post_code\",\"type\":\"string\"}],\"type\":\"PostAddress\"},{\"id\":-1868808300,\"predicate\":\"paymentRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"flags.0?string\"},{\"name\":\"phone\",\"type\":\"flags.1?string\"},{\"name\":\"email\",\"type\":\"flags.2?string\"},{\"name\":\"shipping_address\",\"type\":\"flags.3?PostAddress\"}],\"type\":\"PaymentRequestedInfo\"},{\"id\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1776926890,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"invoice_slug\",\"type\":\"flags.0?string\"}],\"type\":\"MessageAction\"},{\"id\":-842892769,\"predicate\":\"paymentSavedCredentialsCard\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentSavedCredentials\"},{\"id\":475467473,\"predicate\":\"webDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":-1678949555,\"predicate\":\"inputWebDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"InputWebDocument\"},{\"id\":-1036396922,\"predicate\":\"inputWebFileLocation\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWebFileLocation\"},{\"id\":568808380,\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":-1610250415,\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"additional_methods\",\"type\":\"flags.6?Vector\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentForm\"},{\"id\":-784000893,\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":1314881805,\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1891958275,\"predicate\":\"payments.paymentReceipt\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.2?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping\",\"type\":\"flags.1?ShippingOption\"},{\"name\":\"tip_amount\",\"type\":\"flags.3?long\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"credentials_title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-74456004,\"predicate\":\"payments.savedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_saved_credentials\",\"type\":\"flags.1?true\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"}],\"type\":\"payments.SavedInfo\"},{\"id\":-1056001329,\"predicate\":\"inputPaymentCredentialsSaved\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"tmp_password\",\"type\":\"bytes\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":873977640,\"predicate\":\"inputPaymentCredentials\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-614138572,\"predicate\":\"account.tmpPassword\",\"params\":[{\"name\":\"tmp_password\",\"type\":\"bytes\"},{\"name\":\"valid_until\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":-1239335713,\"predicate\":\"shippingOption\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"}],\"type\":\"ShippingOption\"},{\"id\":-1246823043,\"predicate\":\"updateBotShippingQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"shipping_address\",\"type\":\"PostAddress\"}],\"type\":\"Update\"},{\"id\":-1934976362,\"predicate\":\"updateBotPrecheckoutQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-6249322,\"predicate\":\"inputStickerSetItem\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"emoji\",\"type\":\"string\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"InputStickerSetItem\"},{\"id\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":506920429,\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":1399245077,\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":-987599081,\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":347139340,\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":912311057,\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":-1770029977,\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":1355435489,\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":-1665063993,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"tcp\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":-58224696,\"predicate\":\"phoneCallProtocol\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"udp_p2p\",\"type\":\"flags.0?true\"},{\"name\":\"udp_reflector\",\"type\":\"flags.1?true\"},{\"name\":\"min_layer\",\"type\":\"int\"},{\"name\":\"max_layer\",\"type\":\"int\"},{\"name\":\"library_versions\",\"type\":\"Vector\"}],\"type\":\"PhoneCallProtocol\"},{\"id\":-326966976,\"predicate\":\"phone.phoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.PhoneCall\"},{\"id\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":-2132731265,\"predicate\":\"messageActionPhoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call_id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"MessageAction\"},{\"id\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-242427324,\"predicate\":\"upload.fileCdnRedirect\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"encryption_key\",\"type\":\"bytes\"},{\"name\":\"encryption_iv\",\"type\":\"bytes\"},{\"name\":\"file_hashes\",\"type\":\"Vector\"}],\"type\":\"upload.File\"},{\"id\":-290921362,\"predicate\":\"upload.cdnFileReuploadNeeded\",\"params\":[{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1449145777,\"predicate\":\"upload.cdnFile\",\"params\":[{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-914167110,\"predicate\":\"cdnPublicKey\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"CdnPublicKey\"},{\"id\":1462101002,\"predicate\":\"cdnConfig\",\"params\":[{\"name\":\"public_keys\",\"type\":\"Vector\"}],\"type\":\"CdnConfig\"},{\"id\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":-892239370,\"predicate\":\"langPackString\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":1816636575,\"predicate\":\"langPackStringPluralized\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"zero_value\",\"type\":\"flags.0?string\"},{\"name\":\"one_value\",\"type\":\"flags.1?string\"},{\"name\":\"two_value\",\"type\":\"flags.2?string\"},{\"name\":\"few_value\",\"type\":\"flags.3?string\"},{\"name\":\"many_value\",\"type\":\"flags.4?string\"},{\"name\":\"other_value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":695856818,\"predicate\":\"langPackStringDeleted\",\"params\":[{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":-209337866,\"predicate\":\"langPackDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"strings\",\"type\":\"Vector\"}],\"type\":\"LangPackDifference\"},{\"id\":-288727837,\"predicate\":\"langPackLanguage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"official\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.2?true\"},{\"name\":\"beta\",\"type\":\"flags.3?true\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"native_name\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"base_lang_code\",\"type\":\"flags.1?string\"},{\"name\":\"plural_code\",\"type\":\"string\"},{\"name\":\"strings_count\",\"type\":\"int\"},{\"name\":\"translated_count\",\"type\":\"int\"},{\"name\":\"translations_url\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":885242707,\"predicate\":\"channelParticipantAdmin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_edit\",\"type\":\"flags.0?true\"},{\"name\":\"self\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"flags.1?long\"},{\"name\":\"promoted_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.2?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":1844969806,\"predicate\":\"channelParticipantBanned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"left\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"kicked_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-421545947,\"predicate\":\"channelAdminLogEventActionChangeTitle\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1427671598,\"predicate\":\"channelAdminLogEventActionChangeAbout\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1783299128,\"predicate\":\"channelAdminLogEventActionChangeUsername\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1129042607,\"predicate\":\"channelAdminLogEventActionChangePhoto\",\"params\":[{\"name\":\"prev_photo\",\"type\":\"Photo\"},{\"name\":\"new_photo\",\"type\":\"Photo\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":460916654,\"predicate\":\"channelAdminLogEventActionToggleInvites\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":648939889,\"predicate\":\"channelAdminLogEventActionToggleSignatures\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-370660328,\"predicate\":\"channelAdminLogEventActionUpdatePinned\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1889215493,\"predicate\":\"channelAdminLogEventActionEditMessage\",\"params\":[{\"name\":\"prev_message\",\"type\":\"Message\"},{\"name\":\"new_message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1121994683,\"predicate\":\"channelAdminLogEventActionDeleteMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":405815507,\"predicate\":\"channelAdminLogEventActionParticipantJoin\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-124291086,\"predicate\":\"channelAdminLogEventActionParticipantLeave\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-484690728,\"predicate\":\"channelAdminLogEventActionParticipantInvite\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-422036098,\"predicate\":\"channelAdminLogEventActionParticipantToggleBan\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-714643696,\"predicate\":\"channelAdminLogEventActionParticipantToggleAdmin\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":531458253,\"predicate\":\"channelAdminLogEvent\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"ChannelAdminLogEventAction\"}],\"type\":\"ChannelAdminLogEvent\"},{\"id\":-309659827,\"predicate\":\"channels.adminLogResults\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-368018716,\"predicate\":\"channelAdminLogEventsFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join\",\"type\":\"flags.0?true\"},{\"name\":\"leave\",\"type\":\"flags.1?true\"},{\"name\":\"invite\",\"type\":\"flags.2?true\"},{\"name\":\"ban\",\"type\":\"flags.3?true\"},{\"name\":\"unban\",\"type\":\"flags.4?true\"},{\"name\":\"kick\",\"type\":\"flags.5?true\"},{\"name\":\"unkick\",\"type\":\"flags.6?true\"},{\"name\":\"promote\",\"type\":\"flags.7?true\"},{\"name\":\"demote\",\"type\":\"flags.8?true\"},{\"name\":\"info\",\"type\":\"flags.9?true\"},{\"name\":\"settings\",\"type\":\"flags.10?true\"},{\"name\":\"pinned\",\"type\":\"flags.11?true\"},{\"name\":\"edit\",\"type\":\"flags.12?true\"},{\"name\":\"delete\",\"type\":\"flags.13?true\"},{\"name\":\"group_call\",\"type\":\"flags.14?true\"},{\"name\":\"invites\",\"type\":\"flags.15?true\"},{\"name\":\"send\",\"type\":\"flags.16?true\"},{\"name\":\"forums\",\"type\":\"flags.17?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1634752813,\"predicate\":\"messages.favedStickersNotModified\",\"params\":[],\"type\":\"messages.FavedStickers\"},{\"id\":750063767,\"predicate\":\"messages.favedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-366410403,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1759532989,\"predicate\":\"inputMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"stopped\",\"type\":\"flags.0?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.2?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"}],\"type\":\"InputMedia\"},{\"id\":-1186937242,\"predicate\":\"messageMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.1?int\"}],\"type\":\"MessageMedia\"},{\"id\":1189204285,\"predicate\":\"recentMeUrlUnknown\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1188296222,\"predicate\":\"recentMeUrlUser\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1294306862,\"predicate\":\"recentMeUrlChat\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-347535331,\"predicate\":\"recentMeUrlChatInvite\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_invite\",\"type\":\"ChatInvite\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1140172836,\"predicate\":\"recentMeUrlStickerSet\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"set\",\"type\":\"StickerSetCovered\"}],\"type\":\"RecentMeUrl\"},{\"id\":235081943,\"predicate\":\"help.recentMeUrls\",\"params\":[{\"name\":\"urls\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":482797855,\"predicate\":\"inputSingleMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.0?Vector\"}],\"type\":\"InputSingleMedia\"},{\"id\":-1493633966,\"predicate\":\"webAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"domain\",\"type\":\"string\"},{\"name\":\"browser\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"WebAuthorization\"},{\"id\":-313079300,\"predicate\":\"account.webAuthorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.WebAuthorizations\"},{\"id\":-1502174430,\"predicate\":\"inputMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-1160215659,\"predicate\":\"inputMessageReplyTo\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-2037963464,\"predicate\":\"inputMessagePinned\",\"params\":[],\"type\":\"InputMessage\"},{\"id\":-1687559349,\"predicate\":\"messageEntityPhone\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1280209983,\"predicate\":\"messageEntityCashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":223655517,\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1963942446,\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":-207944868,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":-104284986,\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":1968737087,\"predicate\":\"inputClientProxy\",\"params\":[{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"}],\"type\":\"InputClientProxy\"},{\"id\":-483352705,\"predicate\":\"help.termsOfServiceUpdateEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":686618977,\"predicate\":\"help.termsOfServiceUpdate\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"terms_of_service\",\"type\":\"help.TermsOfService\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":859091184,\"predicate\":\"inputSecureFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"InputSecureFile\"},{\"id\":1399317950,\"predicate\":\"inputSecureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputSecureFile\"},{\"id\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":2097791614,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":-1964327229,\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":2103482845,\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":569137759,\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":-1658158621,\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":1034709504,\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":115615172,\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1596951477,\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1717268701,\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-874308058,\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-63531698,\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1995211763,\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1954007928,\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1713143702,\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-368907213,\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1289704741,\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1908627474,\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":411017418,\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":-618540889,\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":-316748368,\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":-391902247,\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":12467706,\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2037765467,\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-449327402,\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":2054162547,\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":1717706985,\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":871426631,\"predicate\":\"secureCredentialsEncrypted\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureCredentialsEncrypted\"},{\"id\":-1389486888,\"predicate\":\"account.authorizationForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"required_types\",\"type\":\"Vector\"},{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"errors\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"privacy_policy_url\",\"type\":\"flags.0?string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-2128640689,\"predicate\":\"account.sentEmailCode\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"account.SentEmailCode\"},{\"id\":455635795,\"predicate\":\"messageActionSecureValuesSentMe\",\"params\":[{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"MessageAction\"},{\"id\":-648257196,\"predicate\":\"messageActionSecureValuesSent\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":1722786150,\"predicate\":\"help.deepLinkInfoEmpty\",\"params\":[],\"type\":\"help.DeepLinkInfo\"},{\"id\":1783556146,\"predicate\":\"help.deepLinkInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"update_app\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":289586518,\"predicate\":\"savedPhoneContact\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"SavedContact\"},{\"id\":1304052993,\"predicate\":\"account.takeout\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"account.Takeout\"},{\"id\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1625153079,\"predicate\":\"inputWebFileGeoPointLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"}],\"type\":\"InputWebFileLocation\"},{\"id\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":4883767,\"predicate\":\"securePasswordKdfAlgoUnknown\",\"params\":[],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-1141711456,\"predicate\":\"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-2042159726,\"predicate\":\"securePasswordKdfAlgoSHA512\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":354925740,\"predicate\":\"secureSecretSettings\",\"params\":[{\"name\":\"secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_secret\",\"type\":\"bytes\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureSecretSettings\"},{\"id\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"id\":-1736378792,\"predicate\":\"inputCheckPasswordEmpty\",\"params\":[],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-763367294,\"predicate\":\"inputCheckPasswordSRP\",\"params\":[{\"name\":\"srp_id\",\"type\":\"long\"},{\"name\":\"A\",\"type\":\"bytes\"},{\"name\":\"M1\",\"type\":\"bytes\"}],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-2036501105,\"predicate\":\"secureValueError\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-1592506512,\"predicate\":\"secureValueErrorTranslationFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":878931416,\"predicate\":\"secureValueErrorTranslationFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2103600678,\"predicate\":\"secureRequiredType\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"native_names\",\"type\":\"flags.0?true\"},{\"name\":\"selfie_required\",\"type\":\"flags.1?true\"},{\"name\":\"translation_required\",\"type\":\"flags.2?true\"},{\"name\":\"type\",\"type\":\"SecureValueType\"}],\"type\":\"SecureRequiredType\"},{\"id\":41187252,\"predicate\":\"secureRequiredTypeOneOf\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"SecureRequiredType\"},{\"id\":-1078332329,\"predicate\":\"help.passportConfigNotModified\",\"params\":[],\"type\":\"help.PassportConfig\"},{\"id\":-1600596305,\"predicate\":\"help.passportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"countries_langs\",\"type\":\"DataJSON\"}],\"type\":\"help.PassportConfig\"},{\"id\":488313413,\"predicate\":\"inputAppEvent\",\"params\":[{\"name\":\"time\",\"type\":\"double\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"peer\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"JSONValue\"}],\"type\":\"InputAppEvent\"},{\"id\":-1059185703,\"predicate\":\"jsonObjectValue\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"JSONValue\"}],\"type\":\"JSONObjectValue\"},{\"id\":1064139624,\"predicate\":\"jsonNull\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":-952869270,\"predicate\":\"jsonBool\",\"params\":[{\"name\":\"value\",\"type\":\"Bool\"}],\"type\":\"JSONValue\"},{\"id\":736157604,\"predicate\":\"jsonNumber\",\"params\":[{\"name\":\"value\",\"type\":\"double\"}],\"type\":\"JSONValue\"},{\"id\":-1222740358,\"predicate\":\"jsonString\",\"params\":[{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"JSONValue\"},{\"id\":-146520221,\"predicate\":\"jsonArray\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1715350371,\"predicate\":\"jsonObject\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-311786236,\"predicate\":\"textSubscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-939827711,\"predicate\":\"textSuperscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":55281185,\"predicate\":\"textMarked\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":483104362,\"predicate\":\"textPhone\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":136105807,\"predicate\":\"textImage\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"RichText\"},{\"id\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":878078826,\"predicate\":\"pageTableCell\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"header\",\"type\":\"flags.0?true\"},{\"name\":\"align_center\",\"type\":\"flags.3?true\"},{\"name\":\"align_right\",\"type\":\"flags.4?true\"},{\"name\":\"valign_middle\",\"type\":\"flags.5?true\"},{\"name\":\"valign_bottom\",\"type\":\"flags.6?true\"},{\"name\":\"text\",\"type\":\"flags.7?RichText\"},{\"name\":\"colspan\",\"type\":\"flags.1?int\"},{\"name\":\"rowspan\",\"type\":\"flags.2?int\"}],\"type\":\"PageTableCell\"},{\"id\":-524237339,\"predicate\":\"pageTableRow\",\"params\":[{\"name\":\"cells\",\"type\":\"Vector\"}],\"type\":\"PageTableRow\"},{\"id\":-1085412734,\"predicate\":\"pageBlockTable\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bordered\",\"type\":\"flags.0?true\"},{\"name\":\"striped\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1869903447,\"predicate\":\"pageCaption\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"credit\",\"type\":\"RichText\"}],\"type\":\"PageCaption\"},{\"id\":-1188055347,\"predicate\":\"pageListItemText\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListItem\"},{\"id\":635466748,\"predicate\":\"pageListItemBlocks\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListItem\"},{\"id\":1577484359,\"predicate\":\"pageListOrderedItemText\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1730311882,\"predicate\":\"pageListOrderedItemBlocks\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1702174239,\"predicate\":\"pageBlockOrderedList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1987480557,\"predicate\":\"pageBlockDetails\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"open\",\"type\":\"flags.0?true\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1282352120,\"predicate\":\"pageRelatedArticle\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"photo_id\",\"type\":\"flags.2?long\"},{\"name\":\"author\",\"type\":\"flags.3?string\"},{\"name\":\"published_date\",\"type\":\"flags.4?int\"}],\"type\":\"PageRelatedArticle\"},{\"id\":370236054,\"predicate\":\"pageBlockRelatedArticles\",\"params\":[{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"articles\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":-1538310410,\"predicate\":\"pageBlockMap\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-1738178803,\"predicate\":\"page\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"part\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.1?true\"},{\"name\":\"v2\",\"type\":\"flags.2?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"},{\"name\":\"views\",\"type\":\"flags.3?int\"}],\"type\":\"Page\"},{\"id\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":-1945767479,\"predicate\":\"help.supportName\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"help.SupportName\"},{\"id\":-206688531,\"predicate\":\"help.userInfoEmpty\",\"params\":[],\"type\":\"help.UserInfo\"},{\"id\":32192344,\"predicate\":\"help.userInfo\",\"params\":[{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"help.UserInfo\"},{\"id\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1398708869,\"predicate\":\"updateMessagePoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"poll\",\"type\":\"flags.0?Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"Update\"},{\"id\":1823064809,\"predicate\":\"pollAnswer\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"option\",\"type\":\"bytes\"}],\"type\":\"PollAnswer\"},{\"id\":-2032041631,\"predicate\":\"poll\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"closed\",\"type\":\"flags.0?true\"},{\"name\":\"public_voters\",\"type\":\"flags.1?true\"},{\"name\":\"multiple_choice\",\"type\":\"flags.2?true\"},{\"name\":\"quiz\",\"type\":\"flags.3?true\"},{\"name\":\"question\",\"type\":\"string\"},{\"name\":\"answers\",\"type\":\"Vector\"},{\"name\":\"close_period\",\"type\":\"flags.4?int\"},{\"name\":\"close_date\",\"type\":\"flags.5?int\"}],\"type\":\"Poll\"},{\"id\":997055186,\"predicate\":\"pollAnswerVoters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"correct\",\"type\":\"flags.1?true\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"voters\",\"type\":\"int\"}],\"type\":\"PollAnswerVoters\"},{\"id\":-591909213,\"predicate\":\"pollResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"results\",\"type\":\"flags.1?Vector\"},{\"name\":\"total_voters\",\"type\":\"flags.2?int\"},{\"name\":\"recent_voters\",\"type\":\"flags.3?Vector\"},{\"name\":\"solution\",\"type\":\"flags.4?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.4?Vector\"}],\"type\":\"PollResults\"},{\"id\":261416433,\"predicate\":\"inputMediaPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"correct_answers\",\"type\":\"flags.0?Vector\"},{\"name\":\"solution\",\"type\":\"flags.1?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"InputMedia\"},{\"id\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":1605510357,\"predicate\":\"chatAdminRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"change_info\",\"type\":\"flags.0?true\"},{\"name\":\"post_messages\",\"type\":\"flags.1?true\"},{\"name\":\"edit_messages\",\"type\":\"flags.2?true\"},{\"name\":\"delete_messages\",\"type\":\"flags.3?true\"},{\"name\":\"ban_users\",\"type\":\"flags.4?true\"},{\"name\":\"invite_users\",\"type\":\"flags.5?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.7?true\"},{\"name\":\"add_admins\",\"type\":\"flags.9?true\"},{\"name\":\"anonymous\",\"type\":\"flags.10?true\"},{\"name\":\"manage_call\",\"type\":\"flags.11?true\"},{\"name\":\"other\",\"type\":\"flags.12?true\"},{\"name\":\"manage_topics\",\"type\":\"flags.13?true\"}],\"type\":\"ChatAdminRights\"},{\"id\":-1626209256,\"predicate\":\"chatBannedRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"view_messages\",\"type\":\"flags.0?true\"},{\"name\":\"send_messages\",\"type\":\"flags.1?true\"},{\"name\":\"send_media\",\"type\":\"flags.2?true\"},{\"name\":\"send_stickers\",\"type\":\"flags.3?true\"},{\"name\":\"send_gifs\",\"type\":\"flags.4?true\"},{\"name\":\"send_games\",\"type\":\"flags.5?true\"},{\"name\":\"send_inline\",\"type\":\"flags.6?true\"},{\"name\":\"embed_links\",\"type\":\"flags.7?true\"},{\"name\":\"send_polls\",\"type\":\"flags.8?true\"},{\"name\":\"change_info\",\"type\":\"flags.10?true\"},{\"name\":\"invite_users\",\"type\":\"flags.15?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.17?true\"},{\"name\":\"manage_topics\",\"type\":\"flags.18?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-433014407,\"predicate\":\"inputWallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":1913199744,\"predicate\":\"inputWallPaperSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputWallPaper\"},{\"id\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":771095562,\"predicate\":\"channelAdminLogEventActionDefaultBannedRights\",\"params\":[{\"name\":\"prev_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"new_banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1895328189,\"predicate\":\"channelAdminLogEventActionStopPoll\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":471437699,\"predicate\":\"account.wallPapersNotModified\",\"params\":[],\"type\":\"account.WallPapers\"},{\"id\":-842824308,\"predicate\":\"account.wallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"account.WallPapers\"},{\"id\":-1973130814,\"predicate\":\"codeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"current_number\",\"type\":\"flags.1?true\"},{\"name\":\"allow_app_hash\",\"type\":\"flags.4?true\"},{\"name\":\"allow_missed_call\",\"type\":\"flags.5?true\"},{\"name\":\"logout_tokens\",\"type\":\"flags.6?Vector\"}],\"type\":\"CodeSettings\"},{\"id\":499236004,\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"second_background_color\",\"type\":\"flags.4?int\"},{\"name\":\"third_background_color\",\"type\":\"flags.5?int\"},{\"name\":\"fourth_background_color\",\"type\":\"flags.6?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"},{\"name\":\"rotation\",\"type\":\"flags.4?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":-1896171181,\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"long\"},{\"name\":\"file_size_max\",\"type\":\"long\"},{\"name\":\"video_upload_maxbitrate\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":1674235686,\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":-709641735,\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":594408994,\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":1556570557,\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":-1519029347,\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":-1275374751,\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1075322878,\"predicate\":\"inputPhotoFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-667654413,\"predicate\":\"inputPhotoLegacyFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":925204121,\"predicate\":\"inputPeerPhotoFileLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1652231205,\"predicate\":\"inputStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb_version\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":-11252123,\"predicate\":\"folder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autofill_new_broadcasts\",\"type\":\"flags.0?true\"},{\"name\":\"autofill_public_groups\",\"type\":\"flags.1?true\"},{\"name\":\"autofill_new_correspondents\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.3?ChatPhoto\"}],\"type\":\"Folder\"},{\"id\":1908216652,\"predicate\":\"dialogFolder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"folder\",\"type\":\"Folder\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"unread_muted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_muted_messages_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_messages_count\",\"type\":\"int\"}],\"type\":\"Dialog\"},{\"id\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":-70073706,\"predicate\":\"inputFolderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputFolderPeer\"},{\"id\":-373643672,\"predicate\":\"folderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"FolderPeer\"},{\"id\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1468331492,\"predicate\":\"inputPeerUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1121318848,\"predicate\":\"inputPeerChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-398136321,\"predicate\":\"messages.searchCounter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.SearchCounter\"},{\"id\":280464681,\"predicate\":\"keyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"KeyboardButton\"},{\"id\":-802258988,\"predicate\":\"inputKeyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.1?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":-1831650802,\"predicate\":\"urlAuthResultRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"User\"},{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1886646706,\"predicate\":\"urlAuthResultAccepted\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1445536993,\"predicate\":\"urlAuthResultDefault\",\"params\":[],\"type\":\"UrlAuthResult\"},{\"id\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-1672577397,\"predicate\":\"messageEntityUnderline\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1090087980,\"predicate\":\"messageEntityStrike\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":34469328,\"predicate\":\"messageEntityBlockquote\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":-1078612597,\"predicate\":\"channelLocationEmpty\",\"params\":[],\"type\":\"ChannelLocation\"},{\"id\":547062491,\"predicate\":\"channelLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"GeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"ChannelLocation\"},{\"id\":-901375139,\"predicate\":\"peerLocated\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":967122427,\"predicate\":\"updateNewScheduledMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"Update\"},{\"id\":-1870238482,\"predicate\":\"updateDeleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-797791052,\"predicate\":\"restrictionReason\",\"params\":[{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RestrictionReason\"},{\"id\":1012306921,\"predicate\":\"inputTheme\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputTheme\"},{\"id\":-175567375,\"predicate\":\"inputThemeSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputTheme\"},{\"id\":-1609668650,\"predicate\":\"theme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"for_chat\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?Document\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"},{\"name\":\"emoticon\",\"type\":\"flags.6?string\"},{\"name\":\"installs_count\",\"type\":\"flags.4?int\"}],\"type\":\"Theme\"},{\"id\":-199313886,\"predicate\":\"account.themesNotModified\",\"params\":[],\"type\":\"account.Themes\"},{\"id\":-1707242387,\"predicate\":\"account.themes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"themes\",\"type\":\"Vector\"}],\"type\":\"account.Themes\"},{\"id\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"id\":1654593920,\"predicate\":\"auth.loginToken\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":110008598,\"predicate\":\"auth.loginTokenMigrateTo\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":957176926,\"predicate\":\"auth.loginTokenSuccess\",\"params\":[{\"name\":\"authorization\",\"type\":\"auth.Authorization\"}],\"type\":\"auth.LoginToken\"},{\"id\":1474462241,\"predicate\":\"account.contentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"},{\"name\":\"sensitive_can_change\",\"type\":\"flags.1?true\"}],\"type\":\"account.ContentSettings\"},{\"id\":-1456996667,\"predicate\":\"messages.inactiveChats\",\"params\":[{\"name\":\"dates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.InactiveChats\"},{\"id\":-1012849566,\"predicate\":\"baseThemeClassic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-69724536,\"predicate\":\"baseThemeDay\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1212997976,\"predicate\":\"baseThemeNight\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1834973166,\"predicate\":\"baseThemeTinted\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1527845466,\"predicate\":\"baseThemeArctic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":-528465642,\"predicate\":\"wallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":-1881255857,\"predicate\":\"inputThemeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?InputWallPaper\"},{\"name\":\"wallpaper_settings\",\"type\":\"flags.1?WallPaperSettings\"}],\"type\":\"InputThemeSettings\"},{\"id\":-94849324,\"predicate\":\"themeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?WallPaper\"}],\"type\":\"ThemeSettings\"},{\"id\":1421174295,\"predicate\":\"webPageAttributeTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"documents\",\"type\":\"flags.0?Vector\"},{\"name\":\"settings\",\"type\":\"flags.1?ThemeSettings\"}],\"type\":\"WebPageAttribute\"},{\"id\":274961865,\"predicate\":\"updateMessagePollVote\",\"params\":[{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":886196148,\"predicate\":\"messageUserVote\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":1017491692,\"predicate\":\"messageUserVoteInputOption\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":-1973033641,\"predicate\":\"messageUserVoteMultiple\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":136574537,\"predicate\":\"messages.votesList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"votes\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.VotesList\"},{\"id\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-177732982,\"predicate\":\"bankCardOpenUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"BankCardOpenUrl\"},{\"id\":1042605427,\"predicate\":\"payments.bankCardData\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"open_urls\",\"type\":\"Vector\"}],\"type\":\"payments.BankCardData\"},{\"id\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":1949890536,\"predicate\":\"dialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"non_contacts\",\"type\":\"flags.1?true\"},{\"name\":\"groups\",\"type\":\"flags.2?true\"},{\"name\":\"broadcasts\",\"type\":\"flags.3?true\"},{\"name\":\"bots\",\"type\":\"flags.4?true\"},{\"name\":\"exclude_muted\",\"type\":\"flags.11?true\"},{\"name\":\"exclude_read\",\"type\":\"flags.12?true\"},{\"name\":\"exclude_archived\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"emoticon\",\"type\":\"flags.25?string\"},{\"name\":\"pinned_peers\",\"type\":\"Vector\"},{\"name\":\"include_peers\",\"type\":\"Vector\"},{\"name\":\"exclude_peers\",\"type\":\"Vector\"}],\"type\":\"DialogFilter\"},{\"id\":2004110666,\"predicate\":\"dialogFilterSuggested\",\"params\":[{\"name\":\"filter\",\"type\":\"DialogFilter\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"DialogFilterSuggested\"},{\"id\":654302845,\"predicate\":\"updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Update\"},{\"id\":-1512627963,\"predicate\":\"updateDialogFilterOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":889491791,\"predicate\":\"updateDialogFilters\",\"params\":[],\"type\":\"Update\"},{\"id\":-1237848657,\"predicate\":\"statsDateRangeDays\",\"params\":[{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"StatsDateRangeDays\"},{\"id\":-884757282,\"predicate\":\"statsAbsValueAndPrev\",\"params\":[{\"name\":\"current\",\"type\":\"double\"},{\"name\":\"previous\",\"type\":\"double\"}],\"type\":\"StatsAbsValueAndPrev\"},{\"id\":-875679776,\"predicate\":\"statsPercentValue\",\"params\":[{\"name\":\"part\",\"type\":\"double\"},{\"name\":\"total\",\"type\":\"double\"}],\"type\":\"StatsPercentValue\"},{\"id\":1244130093,\"predicate\":\"statsGraphAsync\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1092839390,\"predicate\":\"statsGraphError\",\"params\":[{\"name\":\"error\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1901828938,\"predicate\":\"statsGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"json\",\"type\":\"DataJSON\"},{\"name\":\"zoom_token\",\"type\":\"flags.0?string\"}],\"type\":\"StatsGraph\"},{\"id\":-1387279939,\"predicate\":\"messageInteractionCounters\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"MessageInteractionCounters\"},{\"id\":-1107852396,\"predicate\":\"stats.broadcastStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"followers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"views_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"shares_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"enabled_notifications\",\"type\":\"StatsPercentValue\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"followers_graph\",\"type\":\"StatsGraph\"},{\"name\":\"mute_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"iv_interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"views_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_followers_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"recent_message_interactions\",\"type\":\"Vector\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":-1728664459,\"predicate\":\"help.promoDataEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.PromoData\"},{\"id\":-1942390465,\"predicate\":\"help.promoData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"proxy\",\"type\":\"flags.0?true\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"psa_type\",\"type\":\"flags.1?string\"},{\"name\":\"psa_message\",\"type\":\"flags.2?string\"}],\"type\":\"help.PromoData\"},{\"id\":-567037804,\"predicate\":\"videoSize\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"video_start_ts\",\"type\":\"flags.0?double\"}],\"type\":\"VideoSize\"},{\"id\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"id\":-1660637285,\"predicate\":\"statsGroupTopPoster\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"int\"},{\"name\":\"avg_chars\",\"type\":\"int\"}],\"type\":\"StatsGroupTopPoster\"},{\"id\":-682079097,\"predicate\":\"statsGroupTopAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"deleted\",\"type\":\"int\"},{\"name\":\"kicked\",\"type\":\"int\"},{\"name\":\"banned\",\"type\":\"int\"}],\"type\":\"StatsGroupTopAdmin\"},{\"id\":1398765469,\"predicate\":\"statsGroupTopInviter\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"invitations\",\"type\":\"int\"}],\"type\":\"StatsGroupTopInviter\"},{\"id\":-276825834,\"predicate\":\"stats.megagroupStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"members\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"messages\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"viewers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"posters\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"members_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_members_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"messages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"actions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"weekdays_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_posters\",\"type\":\"Vector\"},{\"name\":\"top_admins\",\"type\":\"Vector\"},{\"name\":\"top_inviters\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-1096616924,\"predicate\":\"globalPrivacySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archive_and_mute_new_noncontact_peers\",\"type\":\"flags.0?Bool\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":1667228533,\"predicate\":\"phoneConnectionWebrtc\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"turn\",\"type\":\"flags.0?true\"},{\"name\":\"stun\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"string\"}],\"type\":\"PhoneConnection\"},{\"id\":1107543535,\"predicate\":\"help.countryCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"country_code\",\"type\":\"string\"},{\"name\":\"prefixes\",\"type\":\"flags.0?Vector\"},{\"name\":\"patterns\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.CountryCode\"},{\"id\":-1014526429,\"predicate\":\"help.country\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hidden\",\"type\":\"flags.0?true\"},{\"name\":\"iso2\",\"type\":\"string\"},{\"name\":\"default_name\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"flags.1?string\"},{\"name\":\"country_codes\",\"type\":\"Vector\"}],\"type\":\"help.Country\"},{\"id\":-1815339214,\"predicate\":\"help.countriesListNotModified\",\"params\":[],\"type\":\"help.CountriesList\"},{\"id\":-2016381538,\"predicate\":\"help.countriesList\",\"params\":[{\"name\":\"countries\",\"type\":\"Vector\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":1163625789,\"predicate\":\"messageViews\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"views\",\"type\":\"flags.0?int\"},{\"name\":\"forwards\",\"type\":\"flags.1?int\"},{\"name\":\"replies\",\"type\":\"flags.2?MessageReplies\"}],\"type\":\"MessageViews\"},{\"id\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"}],\"type\":\"PhotoSize\"},{\"id\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.MessageViews\"},{\"id\":-693004986,\"predicate\":\"updateReadChannelDiscussionInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"},{\"name\":\"broadcast_id\",\"type\":\"flags.0?long\"},{\"name\":\"broadcast_post\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1767677564,\"predicate\":\"updateReadChannelDiscussionOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1506535550,\"predicate\":\"messages.discussionMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"max_id\",\"type\":\"flags.0?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"flags.1?int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"flags.2?int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-1495959709,\"predicate\":\"messageReplyHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_to_scheduled\",\"type\":\"flags.2?true\"},{\"name\":\"forum_topic\",\"type\":\"flags.3?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"reply_to_peer_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"reply_to_top_id\",\"type\":\"flags.1?int\"}],\"type\":\"MessageReplyHeader\"},{\"id\":-2083123262,\"predicate\":\"messageReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"comments\",\"type\":\"flags.0?true\"},{\"name\":\"replies\",\"type\":\"int\"},{\"name\":\"replies_pts\",\"type\":\"int\"},{\"name\":\"recent_repliers\",\"type\":\"flags.1?Vector\"},{\"name\":\"channel_id\",\"type\":\"flags.0?long\"},{\"name\":\"max_id\",\"type\":\"flags.2?int\"},{\"name\":\"read_max_id\",\"type\":\"flags.3?int\"}],\"type\":\"MessageReplies\"},{\"id\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"id\":-1937192669,\"predicate\":\"updateChannelUserTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"ChannelParticipant\"},{\"id\":-531931925,\"predicate\":\"channelParticipantsMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-309990731,\"predicate\":\"updatePinnedMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1538885128,\"predicate\":\"updatePinnedChannelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":2004925620,\"predicate\":\"groupCallDiscarded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"duration\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-711498484,\"predicate\":\"groupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join_muted\",\"type\":\"flags.1?true\"},{\"name\":\"can_change_join_muted\",\"type\":\"flags.2?true\"},{\"name\":\"join_date_asc\",\"type\":\"flags.6?true\"},{\"name\":\"schedule_start_subscribed\",\"type\":\"flags.8?true\"},{\"name\":\"can_start_video\",\"type\":\"flags.9?true\"},{\"name\":\"record_video_active\",\"type\":\"flags.11?true\"},{\"name\":\"rtmp_stream\",\"type\":\"flags.12?true\"},{\"name\":\"listeners_hidden\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.3?string\"},{\"name\":\"stream_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"record_start_date\",\"type\":\"flags.5?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.7?int\"},{\"name\":\"unmuted_video_count\",\"type\":\"flags.10?int\"},{\"name\":\"unmuted_video_limit\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-659913713,\"predicate\":\"inputGroupCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGroupCall\"},{\"id\":2047704898,\"predicate\":\"messageActionGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"duration\",\"type\":\"flags.0?int\"}],\"type\":\"MessageAction\"},{\"id\":1345295095,\"predicate\":\"messageActionInviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-341428482,\"predicate\":\"groupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.1?true\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.2?true\"},{\"name\":\"just_joined\",\"type\":\"flags.4?true\"},{\"name\":\"versioned\",\"type\":\"flags.5?true\"},{\"name\":\"min\",\"type\":\"flags.8?true\"},{\"name\":\"muted_by_you\",\"type\":\"flags.9?true\"},{\"name\":\"volume_by_admin\",\"type\":\"flags.10?true\"},{\"name\":\"self\",\"type\":\"flags.12?true\"},{\"name\":\"video_joined\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"active_date\",\"type\":\"flags.3?int\"},{\"name\":\"source\",\"type\":\"int\"},{\"name\":\"volume\",\"type\":\"flags.7?int\"},{\"name\":\"about\",\"type\":\"flags.11?string\"},{\"name\":\"raise_hand_rating\",\"type\":\"flags.13?long\"},{\"name\":\"video\",\"type\":\"flags.6?GroupCallParticipantVideo\"},{\"name\":\"presentation\",\"type\":\"flags.14?GroupCallParticipantVideo\"}],\"type\":\"GroupCallParticipant\"},{\"id\":-124097970,\"predicate\":\"updateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-219423922,\"predicate\":\"updateGroupCallParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":347227392,\"predicate\":\"updateGroupCall\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"call\",\"type\":\"GroupCall\"}],\"type\":\"Update\"},{\"id\":-1636664659,\"predicate\":\"phone.groupCall\",\"params\":[{\"name\":\"call\",\"type\":\"GroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"participants_next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCall\"},{\"id\":-193506890,\"predicate\":\"phone.groupParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":813821341,\"predicate\":\"inlineQueryPeerTypeSameBotPM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-2093215828,\"predicate\":\"inlineQueryPeerTypePM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-681130742,\"predicate\":\"inlineQueryPeerTypeChat\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1589952067,\"predicate\":\"inlineQueryPeerTypeMegagroup\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1664413338,\"predicate\":\"inlineQueryPeerTypeBroadcast\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":589338437,\"predicate\":\"channelAdminLogEventActionStartGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-610299584,\"predicate\":\"channelAdminLogEventActionDiscardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-115071790,\"predicate\":\"channelAdminLogEventActionParticipantMute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-431740480,\"predicate\":\"channelAdminLogEventActionParticipantUnmute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1456906823,\"predicate\":\"channelAdminLogEventActionToggleGroupCallSetting\",\"params\":[{\"name\":\"join_muted\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":1578088377,\"predicate\":\"messages.historyImportParsed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pm\",\"type\":\"flags.0?true\"},{\"name\":\"group\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"flags.2?string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-275956116,\"predicate\":\"messages.affectedFoundMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1007897979,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"auto_setting_from\",\"type\":\"flags.0?long\"}],\"type\":\"MessageAction\"},{\"id\":-1147422299,\"predicate\":\"updatePeerHistoryTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":-796432838,\"predicate\":\"updateChatParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChatParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChatParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1738720581,\"predicate\":\"updateChannelParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChannelParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-997782967,\"predicate\":\"updateBotStopped\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"stopped\",\"type\":\"Bool\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1940201511,\"predicate\":\"chatInviteImporter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"flags.2?string\"},{\"name\":\"approved_by\",\"type\":\"flags.1?long\"}],\"type\":\"ChatInviteImporter\"},{\"id\":-1111085620,\"predicate\":\"messages.exportedChatInvites\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"invites\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":410107472,\"predicate\":\"messages.exportedChatInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":572915951,\"predicate\":\"messages.exportedChatInviteReplaced\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-2118733814,\"predicate\":\"messages.chatInviteImporters\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"importers\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-219353309,\"predicate\":\"chatAdminWithInvites\",\"params\":[{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"invites_count\",\"type\":\"int\"},{\"name\":\"revoked_invites_count\",\"type\":\"int\"}],\"type\":\"ChatAdminWithInvites\"},{\"id\":-1231326505,\"predicate\":\"messages.chatAdminsWithInvites\",\"params\":[{\"name\":\"admins\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":1557846647,\"predicate\":\"channelAdminLogEventActionParticipantJoinByInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1515256996,\"predicate\":\"channelAdminLogEventActionExportedInviteDelete\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1091179342,\"predicate\":\"channelAdminLogEventActionExportedInviteRevoke\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-384910503,\"predicate\":\"channelAdminLogEventActionExportedInviteEdit\",\"params\":[{\"name\":\"prev_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1048537159,\"predicate\":\"channelAdminLogEventActionParticipantVolume\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1855199800,\"predicate\":\"channelAdminLogEventActionChangeHistoryTTL\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":93890858,\"predicate\":\"inputGroupCallStream\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"time_ms\",\"type\":\"long\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"video_channel\",\"type\":\"flags.0?int\"},{\"name\":\"video_quality\",\"type\":\"flags.0?int\"}],\"type\":\"InputFileLocation\"},{\"id\":-1343921601,\"predicate\":\"phone.joinAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":541839704,\"predicate\":\"phone.exportedGroupCallInvite\",\"params\":[{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":-672693723,\"predicate\":\"inputBotInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":894081801,\"predicate\":\"botInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-592373577,\"predicate\":\"groupCallParticipantVideoSourceGroup\",\"params\":[{\"name\":\"semantics\",\"type\":\"string\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"GroupCallParticipantVideoSourceGroup\"},{\"id\":1735736008,\"predicate\":\"groupCallParticipantVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"paused\",\"type\":\"flags.0?true\"},{\"name\":\"endpoint\",\"type\":\"string\"},{\"name\":\"source_groups\",\"type\":\"Vector\"},{\"name\":\"audio_source\",\"type\":\"flags.1?int\"}],\"type\":\"GroupCallParticipantVideo\"},{\"id\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-2046910401,\"predicate\":\"stickers.suggestedShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":795652779,\"predicate\":\"botCommandScopeDefault\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1011811544,\"predicate\":\"botCommandScopeUsers\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1877059713,\"predicate\":\"botCommandScopeChats\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-1180016534,\"predicate\":\"botCommandScopeChatAdmins\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-610432643,\"predicate\":\"botCommandScopePeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":1071145937,\"predicate\":\"botCommandScopePeerAdmins\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":169026035,\"predicate\":\"botCommandScopePeerUser\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotCommandScope\"},{\"id\":-478701471,\"predicate\":\"account.resetPasswordFailedWait\",\"params\":[{\"name\":\"retry_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-370148227,\"predicate\":\"account.resetPasswordRequestedWait\",\"params\":[{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-383330754,\"predicate\":\"account.resetPasswordOk\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":981691896,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recommended\",\"type\":\"flags.5?true\"},{\"name\":\"show_peer_photo\",\"type\":\"flags.6?true\"},{\"name\":\"random_id\",\"type\":\"bytes\"},{\"name\":\"from_id\",\"type\":\"flags.3?Peer\"},{\"name\":\"chat_invite\",\"type\":\"flags.4?ChatInvite\"},{\"name\":\"chat_invite_hash\",\"type\":\"flags.4?string\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"start_param\",\"type\":\"flags.0?string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"SponsoredMessage\"},{\"id\":-907141753,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"posts_between\",\"type\":\"flags.0?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":215889721,\"predicate\":\"inputStickerSetAnimatedEmojiAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":630664139,\"predicate\":\"sendMessageEmojiInteraction\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"interaction\",\"type\":\"DataJSON\"}],\"type\":\"SendMessageAction\"},{\"id\":-1234857938,\"predicate\":\"sendMessageEmojiInteractionSeen\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"SendMessageAction\"},{\"id\":-1227287081,\"predicate\":\"inputBotInlineMessageID64\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"owner_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":-911191137,\"predicate\":\"searchResultsCalendarPeriod\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"max_msg_id\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"SearchResultsCalendarPeriod\"},{\"id\":343859772,\"predicate\":\"messages.searchResultsCalendar\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.1?int\"},{\"name\":\"periods\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":2137295719,\"predicate\":\"searchResultPosition\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"SearchResultsPosition\"},{\"id\":1404185519,\"predicate\":\"messages.searchResultsPositions\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"positions\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":-339958837,\"predicate\":\"messageActionChatJoinedByRequest\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1885586395,\"predicate\":\"updatePendingJoinRequests\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"requests_pending\",\"type\":\"int\"},{\"name\":\"recent_requesters\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":299870598,\"predicate\":\"updateBotChatInviteRequester\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1347021750,\"predicate\":\"channelAdminLogEventActionParticipantJoinByRequest\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"approved_by\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-376962181,\"predicate\":\"inputKeyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":814112961,\"predicate\":\"keyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"KeyboardButton\"},{\"id\":-191450938,\"predicate\":\"channels.sendAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-886388890,\"predicate\":\"channelAdminLogEventActionToggleNoForwards\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-738646805,\"predicate\":\"messages.stickerSetNotModified\",\"params\":[],\"type\":\"messages.StickerSet\"},{\"id\":997004590,\"predicate\":\"users.userFull\",\"params\":[{\"name\":\"full_user\",\"type\":\"UserFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"users.UserFull\"},{\"id\":1753266509,\"predicate\":\"messages.peerSettings\",\"params\":[{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.PeerSettings\"},{\"id\":663693416,\"predicate\":\"channelAdminLogEventActionSendMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-702884114,\"predicate\":\"auth.codeTypeMissedCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-2113903484,\"predicate\":\"auth.sentCodeTypeMissedCall\",\"params\":[{\"name\":\"prefix\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1012759713,\"predicate\":\"auth.loggedOut\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"future_auth_token\",\"type\":\"flags.0?bytes\"}],\"type\":\"auth.LoggedOut\"},{\"id\":1578843320,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":-1546531968,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen_order\",\"type\":\"flags.0?int\"},{\"name\":\"reaction\",\"type\":\"Reaction\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"ReactionCount\"},{\"id\":1328256121,\"predicate\":\"messageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"can_see_list\",\"type\":\"flags.2?true\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"recent_reactions\",\"type\":\"flags.1?Vector\"}],\"type\":\"MessageReactions\"},{\"id\":834488621,\"predicate\":\"messages.messageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-1065882623,\"predicate\":\"availableReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"premium\",\"type\":\"flags.2?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"static_icon\",\"type\":\"Document\"},{\"name\":\"appear_animation\",\"type\":\"Document\"},{\"name\":\"select_animation\",\"type\":\"Document\"},{\"name\":\"activate_animation\",\"type\":\"Document\"},{\"name\":\"effect_animation\",\"type\":\"Document\"},{\"name\":\"around_animation\",\"type\":\"flags.1?Document\"},{\"name\":\"center_icon\",\"type\":\"flags.1?Document\"}],\"type\":\"AvailableReaction\"},{\"id\":-1626924713,\"predicate\":\"messages.availableReactionsNotModified\",\"params\":[],\"type\":\"messages.AvailableReactions\"},{\"id\":1989032621,\"predicate\":\"messages.availableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":852137487,\"predicate\":\"messageEntitySpoiler\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1102180616,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChatReactions\"},{\"name\":\"new_value\",\"type\":\"ChatReactions\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1741309751,\"predicate\":\"messages.translateNoResult\",\"params\":[],\"type\":\"messages.TranslatedText\"},{\"id\":-1575684144,\"predicate\":\"messages.translateResultText\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":-1319698788,\"predicate\":\"messagePeerReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"unread\",\"type\":\"flags.1?true\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reaction\",\"type\":\"Reaction\"}],\"type\":\"MessagePeerReaction\"},{\"id\":-2132064081,\"predicate\":\"groupCallStreamChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"last_timestamp_ms\",\"type\":\"long\"}],\"type\":\"GroupCallStreamChannel\"},{\"id\":-790330702,\"predicate\":\"phone.groupCallStreamChannels\",\"params\":[{\"name\":\"channels\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":177124030,\"predicate\":\"inputReportReasonIllegalDrugs\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1631091139,\"predicate\":\"inputReportReasonPersonalDetails\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":767505458,\"predicate\":\"phone.groupCallStreamRtmpUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":1165423600,\"predicate\":\"attachMenuBotIconColor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"color\",\"type\":\"int\"}],\"type\":\"AttachMenuBotIconColor\"},{\"id\":-1297663893,\"predicate\":\"attachMenuBotIcon\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"icon\",\"type\":\"Document\"},{\"name\":\"colors\",\"type\":\"flags.0?Vector\"}],\"type\":\"AttachMenuBotIcon\"},{\"id\":-928371502,\"predicate\":\"attachMenuBot\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"has_settings\",\"type\":\"flags.1?true\"},{\"name\":\"request_write_access\",\"type\":\"flags.2?true\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"peer_types\",\"type\":\"Vector\"},{\"name\":\"icons\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBot\"},{\"id\":-237467044,\"predicate\":\"attachMenuBotsNotModified\",\"params\":[],\"type\":\"AttachMenuBots\"},{\"id\":1011024320,\"predicate\":\"attachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bots\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBots\"},{\"id\":-1816172929,\"predicate\":\"attachMenuBotsBot\",\"params\":[{\"name\":\"bot\",\"type\":\"AttachMenuBot\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":397910539,\"predicate\":\"updateAttachMenuBots\",\"params\":[],\"type\":\"Update\"},{\"id\":202659196,\"predicate\":\"webViewResultUrl\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"WebViewResult\"},{\"id\":-2010155333,\"predicate\":\"simpleWebViewResultUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":211046684,\"predicate\":\"webViewMessageSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"msg_id\",\"type\":\"flags.0?InputBotInlineMessageID\"}],\"type\":\"WebViewMessageSent\"},{\"id\":361936797,\"predicate\":\"updateWebViewResultSent\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":326529584,\"predicate\":\"keyboardButtonWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1598009252,\"predicate\":\"keyboardButtonSimpleWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1205698681,\"predicate\":\"messageActionWebViewDataSentMe\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1262252875,\"predicate\":\"messageActionWebViewDataSent\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":347625491,\"predicate\":\"updateBotMenuButton\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Update\"},{\"id\":1966318984,\"predicate\":\"botMenuButtonDefault\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":1113113093,\"predicate\":\"botMenuButtonCommands\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":-944407322,\"predicate\":\"botMenuButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"BotMenuButton\"},{\"id\":-67704655,\"predicate\":\"account.savedRingtonesNotModified\",\"params\":[],\"type\":\"account.SavedRingtones\"},{\"id\":-1041683259,\"predicate\":\"account.savedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"ringtones\",\"type\":\"Vector\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1960361625,\"predicate\":\"updateSavedRingtones\",\"params\":[],\"type\":\"Update\"},{\"id\":-1746354498,\"predicate\":\"notificationSoundDefault\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":1863070943,\"predicate\":\"notificationSoundNone\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":-2096391452,\"predicate\":\"notificationSoundLocal\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"NotificationSound\"},{\"id\":-9666487,\"predicate\":\"notificationSoundRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"NotificationSound\"},{\"id\":-1222230163,\"predicate\":\"account.savedRingtone\",\"params\":[],\"type\":\"account.SavedRingtone\"},{\"id\":523271863,\"predicate\":\"account.savedRingtoneConverted\",\"params\":[{\"name\":\"document\",\"type\":\"Document\"}],\"type\":\"account.SavedRingtone\"},{\"id\":2104224014,\"predicate\":\"attachMenuPeerTypeSameBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-1020528102,\"predicate\":\"attachMenuPeerTypeBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-247016673,\"predicate\":\"attachMenuPeerTypePM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":84480319,\"predicate\":\"attachMenuPeerTypeChat\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":2080104188,\"predicate\":\"attachMenuPeerTypeBroadcast\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-317687113,\"predicate\":\"chatInvitePublicJoinRequests\",\"params\":[],\"type\":\"ExportedChatInvite\"},{\"id\":-977967015,\"predicate\":\"inputInvoiceMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"InputInvoice\"},{\"id\":-1020867857,\"predicate\":\"inputInvoiceSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputInvoice\"},{\"id\":-1362048039,\"predicate\":\"payments.exportedInvoice\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":8703322,\"predicate\":\"updateTranscribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-1821037486,\"predicate\":\"messages.transcribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":909284270,\"predicate\":\"dialogFilterDefault\",\"params\":[],\"type\":\"DialogFilter\"},{\"id\":1395946908,\"predicate\":\"help.premiumPromo\",\"params\":[{\"name\":\"status_text\",\"type\":\"string\"},{\"name\":\"status_entities\",\"type\":\"Vector\"},{\"name\":\"video_sections\",\"type\":\"Vector\"},{\"name\":\"videos\",\"type\":\"Vector\"},{\"name\":\"period_options\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.PremiumPromo\"},{\"id\":-925956616,\"predicate\":\"messageEntityCustomEmoji\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":-48981863,\"predicate\":\"documentAttributeCustomEmoji\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"free\",\"type\":\"flags.0?true\"},{\"name\":\"text_color\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"DocumentAttribute\"},{\"id\":1087454222,\"predicate\":\"stickerSetFullCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"keywords\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1502273946,\"predicate\":\"inputStorePaymentPremiumSubscription\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"restore\",\"type\":\"flags.0?true\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":1634697192,\"predicate\":\"inputStorePaymentGiftPremium\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":-1415514682,\"predicate\":\"messageActionGiftPremium\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"months\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1958953753,\"predicate\":\"premiumGiftOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumGiftOption\"},{\"id\":-930399486,\"predicate\":\"inputStickerSetPremiumGifts\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-78886548,\"predicate\":\"updateReadFeaturedEmojiStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1360618136,\"predicate\":\"inputPrivacyKeyVoiceMessages\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":110621716,\"predicate\":\"privacyKeyVoiceMessages\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1996951013,\"predicate\":\"paymentFormMethod\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentFormMethod\"},{\"id\":-193992412,\"predicate\":\"inputWebFileAudioAlbumThumbLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"small\",\"type\":\"flags.2?true\"},{\"name\":\"document\",\"type\":\"flags.0?InputDocument\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"}],\"type\":\"InputWebFileLocation\"},{\"id\":769727150,\"predicate\":\"emojiStatusEmpty\",\"params\":[],\"type\":\"EmojiStatus\"},{\"id\":-1835310691,\"predicate\":\"emojiStatus\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"EmojiStatus\"},{\"id\":-97474361,\"predicate\":\"emojiStatusUntil\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"until\",\"type\":\"int\"}],\"type\":\"EmojiStatus\"},{\"id\":674706841,\"predicate\":\"updateUserEmojiStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Update\"},{\"id\":821314523,\"predicate\":\"updateRecentEmojiStatuses\",\"params\":[],\"type\":\"Update\"},{\"id\":-796072379,\"predicate\":\"account.emojiStatusesNotModified\",\"params\":[],\"type\":\"account.EmojiStatuses\"},{\"id\":-1866176559,\"predicate\":\"account.emojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"statuses\",\"type\":\"Vector\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":2046153753,\"predicate\":\"reactionEmpty\",\"params\":[],\"type\":\"Reaction\"},{\"id\":455247544,\"predicate\":\"reactionEmoji\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Reaction\"},{\"id\":-1992950669,\"predicate\":\"reactionCustomEmoji\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Reaction\"},{\"id\":-352570692,\"predicate\":\"chatReactionsNone\",\"params\":[],\"type\":\"ChatReactions\"},{\"id\":1385335754,\"predicate\":\"chatReactionsAll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_custom\",\"type\":\"flags.0?true\"}],\"type\":\"ChatReactions\"},{\"id\":1713193015,\"predicate\":\"chatReactionsSome\",\"params\":[{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"ChatReactions\"},{\"id\":-1334846497,\"predicate\":\"messages.reactionsNotModified\",\"params\":[],\"type\":\"messages.Reactions\"},{\"id\":-352454890,\"predicate\":\"messages.reactions\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.Reactions\"},{\"id\":1870160884,\"predicate\":\"updateRecentReactions\",\"params\":[],\"type\":\"Update\"},{\"id\":-2030252155,\"predicate\":\"updateMoveStickerSetToTop\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"stickerset\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1511364673,\"predicate\":\"auth.sentCodeTypeEmailCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"},{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"next_phone_login_date\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1521934870,\"predicate\":\"auth.sentCodeTypeSetUpEmailRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1128644211,\"predicate\":\"emailVerifyPurposeLoginSetup\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"EmailVerifyPurpose\"},{\"id\":1383932651,\"predicate\":\"emailVerifyPurposeLoginChange\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1141565819,\"predicate\":\"emailVerifyPurposePassport\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1842457175,\"predicate\":\"emailVerificationCode\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-611279166,\"predicate\":\"emailVerificationGoogle\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-1764723459,\"predicate\":\"emailVerificationApple\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":731303195,\"predicate\":\"account.emailVerified\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.EmailVerified\"},{\"id\":-507835039,\"predicate\":\"account.emailVerifiedLogin\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"sent_code\",\"type\":\"auth.SentCode\"}],\"type\":\"account.EmailVerified\"},{\"id\":-1225711938,\"predicate\":\"premiumSubscriptionOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.1?true\"},{\"name\":\"can_purchase_upgrade\",\"type\":\"flags.2?true\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumSubscriptionOption\"},{\"id\":80008398,\"predicate\":\"inputStickerSetEmojiGenericAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":701560302,\"predicate\":\"inputStickerSetEmojiDefaultStatuses\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1206095820,\"predicate\":\"sendAsPeer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium_required\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"SendAsPeer\"},{\"id\":-1386050360,\"predicate\":\"messageExtendedMediaPreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"w\",\"type\":\"flags.0?int\"},{\"name\":\"h\",\"type\":\"flags.0?int\"},{\"name\":\"thumb\",\"type\":\"flags.1?PhotoSize\"},{\"name\":\"video_duration\",\"type\":\"flags.2?int\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":-297296796,\"predicate\":\"messageExtendedMedia\",\"params\":[{\"name\":\"media\",\"type\":\"MessageMedia\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":1517529484,\"predicate\":\"updateMessageExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"extended_media\",\"type\":\"MessageExtendedMedia\"}],\"type\":\"Update\"},{\"id\":-50416996,\"predicate\":\"stickerKeyword\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"keyword\",\"type\":\"Vector\"}],\"type\":\"StickerKeyword\"},{\"id\":-1274595769,\"predicate\":\"username\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"editable\",\"type\":\"flags.0?true\"},{\"name\":\"active\",\"type\":\"flags.1?true\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Username\"},{\"id\":-263212119,\"predicate\":\"channelAdminLogEventActionChangeUsernames\",\"params\":[{\"name\":\"prev_value\",\"type\":\"Vector\"},{\"name\":\"new_value\",\"type\":\"Vector\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":46949251,\"predicate\":\"channelAdminLogEventActionToggleForum\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1483767080,\"predicate\":\"channelAdminLogEventActionCreateTopic\",\"params\":[{\"name\":\"topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-261103096,\"predicate\":\"channelAdminLogEventActionEditTopic\",\"params\":[{\"name\":\"prev_topic\",\"type\":\"ForumTopic\"},{\"name\":\"new_topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1374254839,\"predicate\":\"channelAdminLogEventActionDeleteTopic\",\"params\":[{\"name\":\"topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1569535291,\"predicate\":\"channelAdminLogEventActionPinTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"prev_topic\",\"type\":\"flags.0?ForumTopic\"},{\"name\":\"new_topic\",\"type\":\"flags.1?ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":37687451,\"predicate\":\"forumTopicDeleted\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ForumTopic\"},{\"id\":1903173033,\"predicate\":\"forumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"my\",\"type\":\"flags.1?true\"},{\"name\":\"closed\",\"type\":\"flags.2?true\"},{\"name\":\"pinned\",\"type\":\"flags.3?true\"},{\"name\":\"short\",\"type\":\"flags.5?true\"},{\"name\":\"hidden\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.0?long\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"unread_reactions_count\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"draft\",\"type\":\"flags.4?DraftMessage\"}],\"type\":\"ForumTopic\"},{\"id\":913709011,\"predicate\":\"messages.forumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"order_by_create_date\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"topics\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"messages.ForumTopics\"},{\"id\":228168278,\"predicate\":\"messageActionTopicCreate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.0?long\"}],\"type\":\"MessageAction\"},{\"id\":-1064024032,\"predicate\":\"messageActionTopicEdit\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.1?long\"},{\"name\":\"closed\",\"type\":\"flags.2?Bool\"},{\"name\":\"hidden\",\"type\":\"flags.3?Bool\"}],\"type\":\"MessageAction\"},{\"id\":422509539,\"predicate\":\"updateChannelPinnedTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"topic_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1548122514,\"predicate\":\"inputNotifyForumTopic\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"InputNotifyPeer\"},{\"id\":577659656,\"predicate\":\"notifyForumTopic\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"NotifyPeer\"},{\"id\":1153562857,\"predicate\":\"inputStickerSetEmojiDefaultTopicIcons\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":406407439,\"predicate\":\"messages.sponsoredMessagesEmpty\",\"params\":[],\"type\":\"messages.SponsoredMessages\"},{\"id\":-31881726,\"predicate\":\"updateChannelPinnedTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":1135897376,\"predicate\":\"defaultHistoryTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"DefaultHistoryTTL\"},{\"id\":116234636,\"predicate\":\"auth.codeTypeFragmentSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-648651719,\"predicate\":\"auth.sentCodeTypeFragmentSms\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1103040667,\"predicate\":\"exportedContactToken\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ExportedContactToken\"},{\"id\":1693675004,\"predicate\":\"channelAdminLogEventActionToggleAntiSpam\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1474192222,\"predicate\":\"messageActionSuggestProfilePhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-404267113,\"predicate\":\"messageActionAttachMenuBotAllowed\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":2008112412,\"predicate\":\"stickerSetNoCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"}],\"type\":\"StickerSetCovered\"},{\"id\":542282808,\"predicate\":\"updateUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Update\"}],\"methods\":[{\"id\":-878758099,\"method\":\"invokeAfterMsg\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":1036301552,\"method\":\"invokeAfterMsgs\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1502141361,\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":-2131827673,\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1923962543,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"flags.0?string\"},{\"name\":\"email_verification\",\"type\":\"flags.1?EmailVerification\"}],\"type\":\"auth.Authorization\"},{\"id\":1047706137,\"method\":\"auth.logOut\",\"params\":[],\"type\":\"auth.LoggedOut\"},{\"id\":-1616179942,\"method\":\"auth.resetAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-440401971,\"method\":\"auth.exportAuthorization\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1518699091,\"method\":\"auth.importAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":-841733627,\"method\":\"auth.bindTempAuthKey\",\"params\":[{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"},{\"name\":\"encrypted_message\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-326762118,\"method\":\"account.registerDevice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_muted\",\"type\":\"flags.0?true\"},{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"app_sandbox\",\"type\":\"Bool\"},{\"name\":\"secret\",\"type\":\"bytes\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1779249670,\"method\":\"account.unregisterDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2067899501,\"method\":\"account.updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"},{\"name\":\"settings\",\"type\":\"InputPeerNotifySettings\"}],\"type\":\"Bool\"},{\"id\":313765169,\"method\":\"account.getNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-612493497,\"method\":\"account.resetNotifySettings\",\"params\":[],\"type\":\"Bool\"},{\"id\":2018596725,\"method\":\"account.updateProfile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"first_name\",\"type\":\"flags.0?string\"},{\"name\":\"last_name\",\"type\":\"flags.1?string\"},{\"name\":\"about\",\"type\":\"flags.2?string\"}],\"type\":\"User\"},{\"id\":1713919532,\"method\":\"account.updateStatus\",\"params\":[{\"name\":\"offline\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":127302966,\"method\":\"account.getWallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.WallPapers\"},{\"id\":-977650298,\"method\":\"account.reportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":227648840,\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1240508136,\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"users.UserFull\"},{\"id\":2061264541,\"method\":\"contacts.getContactIDs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":-995929106,\"method\":\"contacts.getStatuses\",\"params\":[],\"type\":\"Vector\"},{\"id\":1574346258,\"method\":\"contacts.getContacts\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.Contacts\"},{\"id\":746589157,\"method\":\"contacts.importContacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":157945344,\"method\":\"contacts.deleteContacts\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":269745566,\"method\":\"contacts.deleteByPhones\",\"params\":[{\"name\":\"phones\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1758204945,\"method\":\"contacts.block\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1096393392,\"method\":\"contacts.unblock\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-176409329,\"method\":\"contacts.getBlocked\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Blocked\"},{\"id\":1673946374,\"method\":\"messages.getMessages\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1594569905,\"method\":\"messages.getDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Dialogs\"},{\"id\":1143203525,\"method\":\"messages.getHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1593989278,\"method\":\"messages.search\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"from_id\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":238054714,\"method\":\"messages.readHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-1332768214,\"method\":\"messages.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"just_clear\",\"type\":\"flags.0?true\"},{\"name\":\"revoke\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"flags.2?int\"},{\"name\":\"max_date\",\"type\":\"flags.3?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-443640366,\"method\":\"messages.deleteMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":94983360,\"method\":\"messages.receivedMessages\",\"params\":[{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1486110434,\"method\":\"messages.setTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Bool\"},{\"id\":482476935,\"method\":\"messages.sendMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1967638886,\"method\":\"messages.sendMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-966673468,\"method\":\"messages.forwardMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"with_my_score\",\"type\":\"flags.8?true\"},{\"name\":\"drop_author\",\"type\":\"flags.11?true\"},{\"name\":\"drop_media_captions\",\"type\":\"flags.12?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"from_peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"random_id\",\"type\":\"Vector\"},{\"name\":\"to_peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-820669733,\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-270948702,\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1991005362,\"method\":\"messages.report\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1240027791,\"method\":\"messages.getChats\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1364194508,\"method\":\"messages.getFullChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"messages.ChatFull\"},{\"id\":1937260541,\"method\":\"messages.editChatTitle\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":903730804,\"method\":\"messages.editChatPhoto\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":-230206493,\"method\":\"messages.addChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"fwd_limit\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1575461717,\"method\":\"messages.deleteChatUser\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":3450904,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":-304838614,\"method\":\"updates.getState\",\"params\":[],\"type\":\"updates.State\"},{\"id\":630429265,\"method\":\"updates.getDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_total_limit\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":473782614,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"fallback\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"fallback\",\"type\":\"flags.3?true\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":-2016444625,\"method\":\"photos.deletePhotos\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1101843010,\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"cdn_supported\",\"type\":\"flags.1?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":-990308245,\"method\":\"help.getConfig\",\"params\":[],\"type\":\"Config\"},{\"id\":531836966,\"method\":\"help.getNearestDc\",\"params\":[],\"type\":\"NearestDc\"},{\"id\":1378703997,\"method\":\"help.getAppUpdate\",\"params\":[{\"name\":\"source\",\"type\":\"string\"}],\"type\":\"help.AppUpdate\"},{\"id\":1295590211,\"method\":\"help.getInviteText\",\"params\":[],\"type\":\"help.InviteText\"},{\"id\":-1848823128,\"method\":\"photos.getUserPhotos\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"photos.Photos\"},{\"id\":651135312,\"method\":\"messages.getDhConfig\",\"params\":[{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random_length\",\"type\":\"int\"}],\"type\":\"messages.DhConfig\"},{\"id\":-162681021,\"method\":\"messages.requestEncryption\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1035731989,\"method\":\"messages.acceptEncryption\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":-208425312,\"method\":\"messages.discardEncryption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":2031374829,\"method\":\"messages.setEncryptedTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"typing\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2135648522,\"method\":\"messages.readEncryptedHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1157265941,\"method\":\"messages.sendEncrypted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1431914525,\"method\":\"messages.sendEncryptedFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":852769188,\"method\":\"messages.sendEncryptedService\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1436924774,\"method\":\"messages.receivedQueue\",\"params\":[{\"name\":\"max_qts\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1259113487,\"method\":\"messages.reportEncryptedSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"}],\"type\":\"Bool\"},{\"id\":-562337987,\"method\":\"upload.saveBigFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"file_total_parts\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1043505495,\"method\":\"initConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"system_lang_code\",\"type\":\"string\"},{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"proxy\",\"type\":\"flags.0?InputClientProxy\"},{\"name\":\"params\",\"type\":\"flags.1?JSONValue\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":655677548,\"method\":\"account.checkUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1040964988,\"method\":\"account.updateUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":301470424,\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"id\":-623130288,\"method\":\"account.getPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-906486552,\"method\":\"account.setPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1564422284,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"flags.0?InputCheckPasswordSRP\"}],\"type\":\"Bool\"},{\"id\":150761757,\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":608323678,\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":-627372787,\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-113456221,\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-2108208411,\"method\":\"account.sendChangePhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1891839707,\"method\":\"account.changePhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-710552671,\"method\":\"messages.getStickers\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Stickers\"},{\"id\":-1197432408,\"method\":\"messages.getAllStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1738800940,\"method\":\"auth.importBotAuthorization\",\"params\":[{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"bot_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"MessageMedia\"},{\"id\":-484392616,\"method\":\"account.getAuthorizations\",\"params\":[],\"type\":\"account.Authorizations\"},{\"id\":-545786948,\"method\":\"account.resetAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1418342645,\"method\":\"account.getPassword\",\"params\":[],\"type\":\"account.Password\"},{\"id\":-1663767815,\"method\":\"account.getPasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1516564433,\"method\":\"account.updatePasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"new_settings\",\"type\":\"account.PasswordInputSettings\"}],\"type\":\"Bool\"},{\"id\":-779399914,\"method\":\"auth.checkPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"auth.Authorization\"},{\"id\":-661144474,\"method\":\"auth.requestPasswordRecovery\",\"params\":[],\"type\":\"auth.PasswordRecovery\"},{\"id\":923364464,\"method\":\"auth.recoverPassword\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"code\",\"type\":\"string\"},{\"name\":\"new_settings\",\"type\":\"flags.0?account.PasswordInputSettings\"}],\"type\":\"auth.Authorization\"},{\"id\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1607670315,\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"legacy_revoke_permanent\",\"type\":\"flags.2?true\"},{\"name\":\"request_needed\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1051570619,\"method\":\"messages.checkChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"ChatInvite\"},{\"id\":1817183516,\"method\":\"messages.importChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-928977804,\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-946871200,\"method\":\"messages.installStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"archived\",\"type\":\"Bool\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":-110209570,\"method\":\"messages.uninstallStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-421563528,\"method\":\"messages.startBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1468322785,\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"messages.MessageViews\"},{\"id\":-871347913,\"method\":\"channels.readHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-2067661490,\"method\":\"channels.deleteMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-196443371,\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1383294429,\"method\":\"channels.getMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":2010044880,\"method\":\"channels.getParticipants\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelParticipantsFilter\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-1599378234,\"method\":\"channels.getParticipant\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":176122811,\"method\":\"channels.getChannels\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":141781513,\"method\":\"channels.getFullChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1862244601,\"method\":\"channels.createChannel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.0?true\"},{\"name\":\"megagroup\",\"type\":\"flags.1?true\"},{\"name\":\"for_import\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"geo_point\",\"type\":\"flags.2?InputGeoPoint\"},{\"name\":\"address\",\"type\":\"flags.2?string\"},{\"name\":\"ttl_period\",\"type\":\"flags.4?int\"}],\"type\":\"Updates\"},{\"id\":-751007486,\"method\":\"channels.editAdmin\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1450044624,\"method\":\"channels.editTitle\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-248621111,\"method\":\"channels.editPhoto\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":283557164,\"method\":\"channels.checkUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":890549214,\"method\":\"channels.updateUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":615851205,\"method\":\"channels.joinChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-130635115,\"method\":\"channels.leaveChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":429865580,\"method\":\"channels.inviteToChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-1072619549,\"method\":\"channels.deleteChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":51854712,\"method\":\"updates.getChannelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelMessagesFilter\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1470377534,\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1568189671,\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1271290010,\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":2016638777,\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1309538785,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1559270965,\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.SavedGifs\"},{\"id\":846868683,\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1364105629,\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":-346119674,\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":-738468661,\"method\":\"messages.sendInlineBotResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"hide_via\",\"type\":\"flags.11?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-432034325,\"method\":\"channels.exportMessageLink\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"grouped\",\"type\":\"flags.0?true\"},{\"name\":\"thread\",\"type\":\"flags.1?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ExportedMessageLink\"},{\"id\":527021574,\"method\":\"channels.toggleSignatures\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1056025023,\"method\":\"auth.resendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":520357240,\"method\":\"auth.cancelCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-39416522,\"method\":\"messages.getMessageEditData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"messages.MessageEditData\"},{\"id\":1224152952,\"method\":\"messages.editMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.15?int\"}],\"type\":\"Updates\"},{\"id\":-2091549254,\"method\":\"messages.editInlineBotMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":-1824339449,\"method\":\"messages.getBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"game\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"password\",\"type\":\"flags.2?InputCheckPasswordSRP\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-712043766,\"method\":\"messages.setBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-1758168906,\"method\":\"contacts.getTopPeers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"correspondents\",\"type\":\"flags.0?true\"},{\"name\":\"bots_pm\",\"type\":\"flags.1?true\"},{\"name\":\"bots_inline\",\"type\":\"flags.2?true\"},{\"name\":\"phone_calls\",\"type\":\"flags.3?true\"},{\"name\":\"forward_users\",\"type\":\"flags.4?true\"},{\"name\":\"forward_chats\",\"type\":\"flags.5?true\"},{\"name\":\"groups\",\"type\":\"flags.10?true\"},{\"name\":\"channels\",\"type\":\"flags.15?true\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.TopPeers\"},{\"id\":451113900,\"method\":\"contacts.resetTopPeerRating\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1271718337,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":1782549861,\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":1685588756,\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1527873830,\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1649852357,\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.RecentStickers\"},{\"id\":958863608,\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1986437075,\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":1475442322,\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":457157256,\"method\":\"account.sendConfirmPhoneCode\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1596029123,\"method\":\"account.confirmPhone\",\"params\":[{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-122669393,\"method\":\"channels.getAdminedPublicChannels\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"by_location\",\"type\":\"flags.0?true\"},{\"name\":\"check_limit\",\"type\":\"flags.1?true\"}],\"type\":\"messages.Chats\"},{\"id\":1678738104,\"method\":\"messages.getMaskStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-866424884,\"method\":\"messages.getAttachedStickers\",\"params\":[{\"name\":\"media\",\"type\":\"InputStickeredMedia\"}],\"type\":\"Vector\"},{\"id\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1896289088,\"method\":\"messages.setGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":363700068,\"method\":\"messages.setInlineGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-400399203,\"method\":\"messages.getGameHighScores\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":258170395,\"method\":\"messages.getInlineGameHighScores\",\"params\":[{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":-468934396,\"method\":\"messages.getCommonChats\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-2023787330,\"method\":\"messages.getAllChats\",\"params\":[{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":852135825,\"method\":\"messages.getWebPage\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-1489903017,\"method\":\"messages.toggleDialogPin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":991616823,\"method\":\"messages.reorderPinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"int\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-692498958,\"method\":\"messages.getPinnedDialogs\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1440257555,\"method\":\"bots.sendCustomRequest\",\"params\":[{\"name\":\"custom_method\",\"type\":\"string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"DataJSON\"},{\"id\":-434028723,\"method\":\"bots.answerWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":924093883,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"payments.PaymentForm\"},{\"id\":611897804,\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-1228345045,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":755192367,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"},{\"name\":\"tip_amount\",\"type\":\"flags.2?long\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":578650699,\"method\":\"payments.getSavedInfo\",\"params\":[],\"type\":\"payments.SavedInfo\"},{\"id\":-667062079,\"method\":\"payments.clearSavedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"credentials\",\"type\":\"flags.0?true\"},{\"name\":\"info\",\"type\":\"flags.1?true\"}],\"type\":\"Bool\"},{\"id\":-436833542,\"method\":\"messages.setBotShippingResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"Bool\"},{\"id\":163765653,\"method\":\"messages.setBotPrecheckoutResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"}],\"type\":\"Bool\"},{\"id\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?true\"},{\"name\":\"videos\",\"type\":\"flags.4?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"software\",\"type\":\"flags.3?string\"}],\"type\":\"messages.StickerSet\"},{\"id\":-143257775,\"method\":\"stickers.removeStickerFromSet\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":-4795190,\"method\":\"stickers.changeStickerPosition\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"},{\"name\":\"position\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-2041315650,\"method\":\"stickers.addStickerToSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"sticker\",\"type\":\"InputStickerSetItem\"}],\"type\":\"messages.StickerSet\"},{\"id\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":1430593449,\"method\":\"phone.getCallConfig\",\"params\":[],\"type\":\"DataJSON\"},{\"id\":1124046573,\"method\":\"phone.requestCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":1003664544,\"method\":\"phone.acceptCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":788404002,\"method\":\"phone.confirmCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":399855457,\"method\":\"phone.receivedCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"}],\"type\":\"Bool\"},{\"id\":-1295269440,\"method\":\"phone.discardCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"reason\",\"type\":\"PhoneCallDiscardReason\"},{\"name\":\"connection_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1508562471,\"method\":\"phone.setCallRating\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_initiative\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"rating\",\"type\":\"int\"},{\"name\":\"comment\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":662363518,\"method\":\"phone.saveCallDebug\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"debug\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":962554330,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1691921240,\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector\"},{\"id\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":-219008246,\"method\":\"langpack.getLangPack\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackDifference\"},{\"id\":-269862909,\"method\":\"langpack.getStrings\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"keys\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-845657435,\"method\":\"langpack.getDifference\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"LangPackDifference\"},{\"id\":1120311183,\"method\":\"langpack.getLanguages\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1763259007,\"method\":\"channels.editBanned\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":870184064,\"method\":\"channels.getAdminLog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"events_filter\",\"type\":\"flags.0?ChannelAdminLogEventsFilter\"},{\"name\":\"admins\",\"type\":\"flags.1?Vector\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"min_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-1847836879,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":-914493408,\"method\":\"messages.sendScreenshotNotification\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":82946729,\"method\":\"messages.getFavedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-1174420133,\"method\":\"messages.faveSticker\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unfave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":-251140208,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1683319225,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"for_everyone\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":921026381,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1881817312,\"method\":\"messages.getRecentLocations\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1225713124,\"method\":\"messages.sendMultiMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"multi_media\",\"type\":\"Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1347929239,\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"id\":405695855,\"method\":\"account.getWebAuthorizations\",\"params\":[],\"type\":\"account.WebAuthorizations\"},{\"id\":755087855,\"method\":\"account.resetWebAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1747789204,\"method\":\"account.resetWebAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":896555914,\"method\":\"messages.searchStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_featured\",\"type\":\"flags.0?true\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1856595926,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":-1299661699,\"method\":\"account.getAllSecureValues\",\"params\":[],\"type\":\"Vector\"},{\"id\":1936088002,\"method\":\"account.getSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1986010339,\"method\":\"account.saveSecureValue\",\"params\":[{\"name\":\"value\",\"type\":\"InputSecureValue\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureValue\"},{\"id\":-1199522741,\"method\":\"account.deleteSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1456907910,\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-202552205,\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":-1516022023,\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1305716726,\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1730136133,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":53322959,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"verification\",\"type\":\"EmailVerification\"}],\"type\":\"account.EmailVerified\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-1896617296,\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?long\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector\"},{\"id\":911373810,\"method\":\"invokeWithMessagesRange\",\"params\":[{\"name\":\"range\",\"type\":\"MessageRange\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1398145746,\"method\":\"invokeWithTakeout\",\"params\":[{\"name\":\"takeout_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1031349873,\"method\":\"messages.markDialogUnread\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":585256482,\"method\":\"messages.getDialogUnreadMarks\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1735311088,\"method\":\"help.getAppConfig\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":1862465352,\"method\":\"help.saveAppLog\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-966677240,\"method\":\"help.getPassportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.PassportConfig\"},{\"id\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":-760547348,\"method\":\"messages.updatePinnedMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"unpin\",\"type\":\"flags.1?true\"},{\"name\":\"pm_oneside\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1881204448,\"method\":\"account.confirmPasswordEmail\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":2055154197,\"method\":\"account.resendPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1043606090,\"method\":\"account.cancelPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-748624084,\"method\":\"help.getSupportName\",\"params\":[],\"type\":\"help.SupportName\"},{\"id\":59377875,\"method\":\"help.getUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"help.UserInfo\"},{\"id\":1723407216,\"method\":\"help.editUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"help.UserInfo\"},{\"id\":-1626880216,\"method\":\"account.getContactSignUpNotification\",\"params\":[],\"type\":\"Bool\"},{\"id\":-806076575,\"method\":\"account.setContactSignUpNotification\",\"params\":[{\"name\":\"silent\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1398240377,\"method\":\"account.getNotifyExceptions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"compare_sound\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"flags.0?InputNotifyPeer\"}],\"type\":\"Updates\"},{\"id\":283795844,\"method\":\"messages.sendVote\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"options\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1941660731,\"method\":\"messages.getPollResults\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1848369232,\"method\":\"messages.getOnlines\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ChatOnlines\"},{\"id\":-554301545,\"method\":\"messages.editChatAbout\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1517917375,\"method\":\"messages.editChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":-57811990,\"method\":\"account.getWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"}],\"type\":\"WallPaper\"},{\"id\":-578472351,\"method\":\"account.uploadWallPaper\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1817860919,\"method\":\"account.saveWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"unsave\",\"type\":\"Bool\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-18000023,\"method\":\"account.installWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-1153722364,\"method\":\"account.resetWallPapers\",\"params\":[],\"type\":\"Bool\"},{\"id\":1457130303,\"method\":\"account.getAutoDownloadSettings\",\"params\":[],\"type\":\"account.AutoDownloadSettings\"},{\"id\":1995661875,\"method\":\"account.saveAutoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"low\",\"type\":\"flags.0?true\"},{\"name\":\"high\",\"type\":\"flags.1?true\"},{\"name\":\"settings\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"Bool\"},{\"id\":899735650,\"method\":\"messages.getEmojiKeywords\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":352892591,\"method\":\"messages.getEmojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":1318675378,\"method\":\"messages.getEmojiKeywordsLanguages\",\"params\":[{\"name\":\"lang_codes\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-709817306,\"method\":\"messages.getEmojiURL\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":1749536939,\"method\":\"folders.editPeerFolders\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":472471681,\"method\":\"folders.deleteFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":11435201,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"filters\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-170208392,\"method\":\"channels.getGroupsForDiscussion\",\"params\":[],\"type\":\"messages.Chats\"},{\"id\":1079520178,\"method\":\"channels.setDiscussionGroup\",\"params\":[{\"name\":\"broadcast\",\"type\":\"InputChannel\"},{\"name\":\"group\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":428848198,\"method\":\"messages.requestUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1322487515,\"method\":\"messages.acceptUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":1336717624,\"method\":\"messages.hidePeerSettingsBar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-386636848,\"method\":\"contacts.addContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"add_phone_privacy_exception\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-130964977,\"method\":\"contacts.acceptContact\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"Updates\"},{\"id\":-750207932,\"method\":\"contacts.getLocated\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"background\",\"type\":\"flags.1?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"self_expires\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":1491484525,\"method\":\"channels.editLocation\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304832784,\"method\":\"channels.toggleSlowMode\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"seconds\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-183077365,\"method\":\"messages.getScheduledHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1111817116,\"method\":\"messages.getScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1120369398,\"method\":\"messages.sendScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1504586518,\"method\":\"messages.deleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":473805619,\"method\":\"account.uploadTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.0?InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1697530880,\"method\":\"account.createTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":737414348,\"method\":\"account.updateTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"slug\",\"type\":\"flags.0?string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":-229175188,\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-953697477,\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"},{\"name\":\"format\",\"type\":\"flags.2?string\"},{\"name\":\"base_theme\",\"type\":\"flags.3?BaseTheme\"}],\"type\":\"Bool\"},{\"id\":978872812,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"}],\"type\":\"Theme\"},{\"id\":1913054296,\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1210022402,\"method\":\"auth.exportLoginToken\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"auth.LoginToken\"},{\"id\":-1783866140,\"method\":\"auth.importLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":-392909491,\"method\":\"auth.acceptLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"Authorization\"},{\"id\":-1250643605,\"method\":\"account.setContentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1952756306,\"method\":\"account.getContentSettings\",\"params\":[],\"type\":\"account.ContentSettings\"},{\"id\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1200736242,\"method\":\"messages.getPollVotes\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"option\",\"type\":\"flags.0?bytes\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.VotesList\"},{\"id\":-1257951254,\"method\":\"messages.toggleStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"uninstall\",\"type\":\"flags.0?true\"},{\"name\":\"archive\",\"type\":\"flags.1?true\"},{\"name\":\"unarchive\",\"type\":\"flags.2?true\"},{\"name\":\"stickersets\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"id\":-241247891,\"method\":\"messages.getDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":-1566780372,\"method\":\"messages.getSuggestedDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":450142282,\"method\":\"messages.updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Bool\"},{\"id\":-983318044,\"method\":\"messages.updateDialogFiltersOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1421720550,\"method\":\"stats.getBroadcastStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":1646092192,\"method\":\"stats.loadAsyncGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"x\",\"type\":\"flags.0?long\"}],\"type\":\"StatsGraph\"},{\"id\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":2127598753,\"method\":\"messages.getOldFeaturedStickers\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":-183649631,\"method\":\"help.dismissSuggestion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"suggestion\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1935116200,\"method\":\"help.getCountriesList\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":584962828,\"method\":\"messages.getReplies\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":1147761405,\"method\":\"messages.getDiscussionMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-147740172,\"method\":\"messages.readDiscussion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":698914348,\"method\":\"contacts.blockFromReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_message\",\"type\":\"flags.0?true\"},{\"name\":\"delete_history\",\"type\":\"flags.1?true\"},{\"name\":\"report_spam\",\"type\":\"flags.2?true\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1445996571,\"method\":\"stats.getMessagePublicForwards\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1226791947,\"method\":\"stats.getMessageStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"stats.MessageStats\"},{\"id\":-299714136,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"rtmp_stream\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"schedule_date\",\"type\":\"flags.1?int\"}],\"type\":\"Updates\"},{\"id\":-1322057861,\"method\":\"phone.joinGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"video_stopped\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"},{\"name\":\"invite_hash\",\"type\":\"flags.1?string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":1342404601,\"method\":\"phone.leaveGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"source\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":2067345760,\"method\":\"phone.inviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":2054648117,\"method\":\"phone.discardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1958458429,\"method\":\"phone.toggleGroupCallSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reset_invite_hash\",\"type\":\"flags.1?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_muted\",\"type\":\"flags.0?Bool\"}],\"type\":\"Updates\"},{\"id\":68699611,\"method\":\"phone.getGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupCall\"},{\"id\":-984033109,\"method\":\"phone.getGroupParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"ids\",\"type\":\"Vector\"},{\"name\":\"sources\",\"type\":\"Vector\"},{\"name\":\"offset\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":-1248003721,\"method\":\"phone.checkGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":1540419152,\"method\":\"messages.deleteChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-104078327,\"method\":\"messages.deletePhoneCallHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1140726259,\"method\":\"messages.checkHistoryImport\",\"params\":[{\"name\":\"import_head\",\"type\":\"string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":873008187,\"method\":\"messages.initHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"media_count\",\"type\":\"int\"}],\"type\":\"messages.HistoryImport\"},{\"id\":713433234,\"method\":\"messages.uploadImportedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-1271008444,\"method\":\"messages.startHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-1565154314,\"method\":\"messages.getExportedChatInvites\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"},{\"name\":\"offset_date\",\"type\":\"flags.2?int\"},{\"name\":\"offset_link\",\"type\":\"flags.2?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":1937010524,\"method\":\"messages.getExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-1110823051,\"method\":\"messages.editExportedChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"request_needed\",\"type\":\"flags.3?Bool\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":1452833749,\"method\":\"messages.deleteRevokedExportedChatInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":-731601877,\"method\":\"messages.deleteExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":958457583,\"method\":\"messages.getAdminsWithInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-553329330,\"method\":\"messages.getChatInviteImporters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"},{\"name\":\"q\",\"type\":\"flags.2?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_user\",\"type\":\"InputUser\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-1207017500,\"method\":\"messages.setHistoryTTL\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-91437323,\"method\":\"account.reportProfilePhoto\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"InputPhoto\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-248985848,\"method\":\"phone.toggleGroupCallRecord\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"start\",\"type\":\"flags.0?true\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"video_portrait\",\"type\":\"flags.2?Bool\"}],\"type\":\"Updates\"},{\"id\":-1524155713,\"method\":\"phone.editGroupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"muted\",\"type\":\"flags.0?Bool\"},{\"name\":\"volume\",\"type\":\"flags.1?int\"},{\"name\":\"raise_hand\",\"type\":\"flags.2?Bool\"},{\"name\":\"video_stopped\",\"type\":\"flags.3?Bool\"},{\"name\":\"video_paused\",\"type\":\"flags.4?Bool\"},{\"name\":\"presentation_paused\",\"type\":\"flags.5?Bool\"}],\"type\":\"Updates\"},{\"id\":480685066,\"method\":\"phone.editGroupCallTitle\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-277077702,\"method\":\"phone.getGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":-425040769,\"method\":\"phone.exportGroupCallInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.0?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":563885286,\"method\":\"phone.toggleGroupCallStartSubscription\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"subscribed\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1451287362,\"method\":\"phone.startScheduledGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1465786252,\"method\":\"phone.saveDefaultGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-873829436,\"method\":\"phone.joinGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":475058500,\"method\":\"phone.leaveGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":676017721,\"method\":\"stickers.checkShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1303364867,\"method\":\"stickers.suggestShortName\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":1032708345,\"method\":\"bots.resetBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-481554986,\"method\":\"bots.getBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-700916087,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1095836780,\"method\":\"channels.viewSponsoredMessage\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"random_id\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-333377601,\"method\":\"channels.getSponsoredMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":745510839,\"method\":\"messages.getMessageReadParticipants\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1240514025,\"method\":\"messages.getSearchResultsCalendar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":1855292323,\"method\":\"messages.getSearchResultsPositions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":2145904661,\"method\":\"messages.hideChatJoinRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-528091926,\"method\":\"messages.hideAllChatJoinRequests\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"}],\"type\":\"Updates\"},{\"id\":-1323389022,\"method\":\"messages.toggleNoForwards\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-855777386,\"method\":\"messages.saveDefaultSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"send_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":231174382,\"method\":\"channels.getSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-1081501024,\"method\":\"account.setAuthorizationTTL\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1089766498,\"method\":\"account.changeAuthorizationSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.0?Bool\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.1?Bool\"}],\"type\":\"Bool\"},{\"id\":913655003,\"method\":\"channels.deleteParticipantHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-754091820,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.1?true\"},{\"name\":\"add_to_recent\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Vector\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1176190792,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Reaction\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-21928079,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"ChatReactions\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":1330094102,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"Reaction\"}],\"type\":\"Bool\"},{\"id\":617508334,\"method\":\"messages.translateText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"text\",\"type\":\"flags.1?string\"},{\"name\":\"from_lang\",\"type\":\"flags.2?string\"},{\"name\":\"to_lang\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":841173339,\"method\":\"messages.getUnreadReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":1420459918,\"method\":\"messages.readReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-1963375804,\"method\":\"contacts.resolvePhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":447879488,\"method\":\"phone.getGroupCallStreamChannels\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":-558650433,\"method\":\"phone.getGroupCallStreamRtmpUrl\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"revoke\",\"type\":\"Bool\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":276705696,\"method\":\"messages.searchSentMedia\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":385663691,\"method\":\"messages.getAttachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"AttachMenuBots\"},{\"id\":1998676370,\"method\":\"messages.getAttachMenuBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":1777704297,\"method\":\"messages.toggleBotInAttachMenu\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":395003915,\"method\":\"messages.requestWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"from_bot_menu\",\"type\":\"flags.4?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"start_param\",\"type\":\"flags.3?string\"},{\"name\":\"theme_params\",\"type\":\"flags.2?DataJSON\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"WebViewResult\"},{\"id\":2146648841,\"method\":\"messages.prolongWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Bool\"},{\"id\":698084494,\"method\":\"messages.requestSimpleWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"},{\"name\":\"platform\",\"type\":\"string\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":172168437,\"method\":\"messages.sendWebViewResultMessage\",\"params\":[{\"name\":\"bot_query_id\",\"type\":\"string\"},{\"name\":\"result\",\"type\":\"InputBotInlineResult\"}],\"type\":\"WebViewMessageSent\"},{\"id\":-603831608,\"method\":\"messages.sendWebViewData\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"button_text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1157944655,\"method\":\"bots.setBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Bool\"},{\"id\":-1671369944,\"method\":\"bots.getBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotMenuButton\"},{\"id\":-510647672,\"method\":\"account.getSavedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1038768899,\"method\":\"account.saveRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"account.SavedRingtone\"},{\"id\":-2095414366,\"method\":\"account.uploadRingtone\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":2021942497,\"method\":\"bots.setBotBroadcastDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"},{\"id\":-1839281686,\"method\":\"bots.setBotGroupDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"},{\"id\":1092913030,\"method\":\"phone.saveCallLog\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"file\",\"type\":\"InputFile\"}],\"type\":\"Bool\"},{\"id\":-456419968,\"method\":\"channels.toggleJoinToSend\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1277789622,\"method\":\"channels.toggleJoinRequest\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":261206117,\"method\":\"payments.exportInvoice\",\"params\":[{\"name\":\"invoice_media\",\"type\":\"InputMedia\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":647928393,\"method\":\"messages.transcribeAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":2132608815,\"method\":\"messages.rateTranscribedAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"good\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-2131921795,\"method\":\"payments.assignAppStoreTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"bytes\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-537046829,\"method\":\"payments.assignPlayMarketTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"DataJSON\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-1614700874,\"method\":\"payments.canPurchasePremium\",\"params\":[{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Bool\"},{\"id\":-1206152236,\"method\":\"help.getPremiumPromo\",\"params\":[],\"type\":\"help.PremiumPromo\"},{\"id\":-643100844,\"method\":\"messages.getCustomEmojiDocuments\",\"params\":[{\"name\":\"document_id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-67329649,\"method\":\"messages.getEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":248473398,\"method\":\"messages.getFeaturedEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-70001045,\"method\":\"account.updateEmojiStatus\",\"params\":[{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Bool\"},{\"id\":-696962170,\"method\":\"account.getDefaultEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":257392901,\"method\":\"account.getRecentEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":404757166,\"method\":\"account.clearRecentEmojiStatuses\",\"params\":[],\"type\":\"Bool\"},{\"id\":1063567478,\"method\":\"messages.reportReaction\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction_peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1149164102,\"method\":\"messages.getTopReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":960896434,\"method\":\"messages.getRecentReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":-1644236876,\"method\":\"messages.clearRecentReactions\",\"params\":[],\"type\":\"Bool\"},{\"id\":-2064119788,\"method\":\"messages.getExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":767062953,\"method\":\"auth.importWebTokenAuthorization\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"web_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-279966037,\"method\":\"account.reorderUsernames\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1490465654,\"method\":\"account.toggleUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"active\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1268978403,\"method\":\"channels.reorderUsernames\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1358053637,\"method\":\"channels.toggleUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"active\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":170155475,\"method\":\"channels.deactivateAllUsernames\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":-1540781271,\"method\":\"channels.toggleForum\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-200539612,\"method\":\"channels.createForumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"flags.0?int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.3?long\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"send_as\",\"type\":\"flags.2?InputPeer\"}],\"type\":\"Updates\"},{\"id\":233136337,\"method\":\"channels.getForumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_topic\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ForumTopics\"},{\"id\":-1333584199,\"method\":\"channels.getForumTopicsByID\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topics\",\"type\":\"Vector\"}],\"type\":\"messages.ForumTopics\"},{\"id\":-186670715,\"method\":\"channels.editForumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topic_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.1?long\"},{\"name\":\"closed\",\"type\":\"flags.2?Bool\"},{\"name\":\"hidden\",\"type\":\"flags.3?Bool\"}],\"type\":\"Updates\"},{\"id\":1814925350,\"method\":\"channels.updatePinnedForumTopic\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topic_id\",\"type\":\"int\"},{\"name\":\"pinned\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":876830509,\"method\":\"channels.deleteTopicHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":693150095,\"method\":\"channels.reorderPinnedForumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1760814315,\"method\":\"channels.toggleAntiSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-1471109485,\"method\":\"channels.reportAntiSpamFalsePositive\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-1632299963,\"method\":\"messages.setDefaultHistoryTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1703637384,\"method\":\"messages.getDefaultHistoryTTL\",\"params\":[],\"type\":\"DefaultHistoryTTL\"},{\"id\":-127582169,\"method\":\"contacts.exportContactToken\",\"params\":[],\"type\":\"ExportedContactToken\"},{\"id\":318789512,\"method\":\"contacts.importContactToken\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-1189444673,\"method\":\"photos.uploadContactProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"suggest\",\"type\":\"flags.3?true\"},{\"name\":\"save\",\"type\":\"flags.4?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":1785624660,\"method\":\"channels.toggleParticipantsHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"}]},\"layer\":151} as {\n MTProto: {\n constructors: MTProtoConstructor[],\n methods: MTProtoMethod[],\n constructorsIndex?: {[id: number]: number}\n },\n API: {\n constructors: MTProtoConstructor[],\n methods: MTProtoMethod[],\n constructorsIndex?: {[id: number]: number}\n },\n layer: number,\n};\n","export default function intToUint(val: number) {\n // return val < 0 ? val + 4294967296 : val; // 0 <= val <= Infinity\n return val >>> 0; // (4294967296 >>> 0) === 0; 0 <= val <= 4294967295\n}\n","import bigInt from 'big-integer';\nimport intToUint from '../number/intToUint';\n\nexport default function ulongFromInts(high: number, low: number) {\n high = intToUint(high), low = intToUint(low);\n return bigInt(high).shiftLeft(32).add(bigInt(low));\n}\n","import bigInt from 'big-integer';\n\nexport const safeBigInt = bigInt(Number.MAX_SAFE_INTEGER);\nexport const ulongBigInt = bigInt(bigInt[2]).pow(64);\nexport const longBigInt = ulongBigInt.divide(bigInt[2]);\n","import bigInt from 'big-integer';\nimport { longBigInt, ulongBigInt } from './bigIntConstants';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n\nexport function bigIntToSigned(bigInt: bigInt.BigInteger) {\n return bigInt.greater(longBigInt) ? bigInt.minus(ulongBigInt) : bigInt;\n}\n\nexport function bigIntToUnsigned(bigInt: bigInt.BigInteger) {\n return bigInt.isNegative() ? ulongBigInt.add(bigInt) : bigInt;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Schema, {MTProtoConstructor} from './schema';\nimport {JSONValue} from '../../layer';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport bigInt from 'big-integer';\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\nimport {safeBigInt} from '../../helpers/bigInt/bigIntConstants';\nimport {bigIntToSigned, bigIntToUnsigned} from '../../helpers/bigInt/bigIntConversion';\n\nconst boolFalse = +Schema.API.constructors.find((c) => c.predicate === 'boolFalse').id;\nconst boolTrue = +Schema.API.constructors.find((c) => c.predicate === 'boolTrue').id;\nconst vector = +Schema.API.constructors.find((c) => c.predicate === 'vector').id;\nconst gzipPacked = +Schema.MTProto.constructors.find((c) => c.predicate === 'gzip_packed').id;\n\n// * using slice to have a new buffer, otherwise the buffer will be copied to main thread\nconst sliceMethod: 'slice' | 'subarray' = 'slice'; // subarray\n\nclass TLSerialization {\n private maxLength = 2048; // 2Kb\n private offset = 0; // in bytes\n private mtproto = false;\n private debug = false;// Modes.debug;\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n\n public createBuffer() {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n }\n\n public getArray() {\n const resultBuffer = new ArrayBuffer(this.offset);\n\n // let perf = performance.now();\n /* const resultUint8: any = new Uint8Array(resultBuffer);\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\n // console.log('perf uint8', performance.now() - perf);\n\n // perf = performance.now();\n const resultInt32 = new Int32Array(resultBuffer);\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\n // console.log('perf int32', performance.now() - perf);\n\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\n console.error(resultUint8, resultInt32);\n } */\n\n return resultInt32;\n }\n\n public getBuffer() {\n return this.getArray().buffer;\n }\n\n public getBytes(typed: true): Uint8Array;\n public getBytes(typed?: false): number[];\n public getBytes(typed: boolean = true): number[] | Uint8Array {\n if(typed) {\n const resultBuffer = new ArrayBuffer(this.offset);\n const resultArray = new Uint8Array(resultBuffer);\n\n resultArray.set(this.byteView.subarray(0, this.offset));\n\n return resultArray;\n }\n\n const bytes: number[] = new Array(this.offset);\n for(let i = 0; i < this.offset; ++i) {\n bytes[i] = this.byteView[i];\n }\n return bytes;\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public checkLength(needBytes: number) {\n if(this.offset + needBytes < this.maxLength) {\n return;\n }\n\n // console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n const previousBuffer = this.buffer;\n // const previousByteView = this.byteView;\n const previousArray = new Int32Array(previousBuffer);\n\n this.createBuffer();\n\n new Int32Array(this.buffer).set(previousArray);\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32),\n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\n }\n\n public writeInt(i: number, field: string) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n\n const offset = this.offset / 4;\n this.checkLength(4);\n this.intView[offset] = i;\n this.offset += 4;\n\n return offset;\n }\n\n public storeInt(i: number, field?: string) {\n return this.writeInt(i, (field || '') + ':int');\n }\n\n public storeBool(i: boolean, field?: string) {\n if(i) {\n this.writeInt(boolTrue, (field || '') + ':bool');\n } else {\n this.writeInt(boolFalse, (field || '') + ':bool');\n }\n }\n\n public storeLongP(iHigh: number, iLow: number, field?: string) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n }\n\n public storeLong(sLong: Array | string | number, field?: string) {\n if(Array.isArray(sLong)) {\n if(sLong.length === 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n } else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n\n const _bigInt = bigIntToUnsigned(bigInt(sLong as string));\n const {quotient, remainder} = _bigInt.divmod(0x100000000);\n const high = quotient.toJSNumber();\n const low = remainder.toJSNumber();\n\n this.writeInt(low, (field || '') + ':long[low]');\n this.writeInt(high, (field || '') + ':long[high]');\n }\n\n public storeDouble(f: any, field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n\n doubleView[0] = f;\n\n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n }\n\n public storeString(s: string, field?: string) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n\n if(s === undefined) {\n s = '';\n }\n const sUTF8 = unescape(encodeURIComponent(s));\n\n this.checkLength(sUTF8.length + 8);\n\n const len = sUTF8.length;\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for(let i = 0; i < len; ++i) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n\n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n\n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n } else if(bytes === undefined) {\n bytes = [];\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\n\n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\n const len = (bytes as Uint8Array).length;\n this.checkLength(len + 8);\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n\n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n\n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n\n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = (bytes as Uint8Array).length;\n if((bits % 32) || (len * 8) !== bits) {\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\n console.error(error, bytes, field);\n throw error;\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\n this.checkLength(len);\n\n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n }\n\n public storeRawBytes(bytes: ArrayLike, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = bytes.length;\n\n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n\n this.byteView.set(bytes, this.offset);\n this.offset += len;\n }\n\n public storeMethod(methodName: string, params: any) {\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const methodData = schema.methods.find((m) => m.method === methodName);\n\n if(!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n\n this.storeInt(methodData.id, methodName + '[id]');\n\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\n const flagsOffsets: {[paramName: string]: number} = {};\n // console.log('storeMethod', len, methodData);\n for(const param of methodData.params) {\n let type = param.type;\n\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\n // console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\n params[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n // console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\n type = condType[1];\n }\n\n // console.log('storeMethod', methodName, param.name, params[param.name], type);\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n\n if(type === '#') {\n params[param.name] = params[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(const paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = params[paramName];\n }\n\n return methodData.type;\n }\n\n public storeObject(obj: any, type: string, field?: string) {\n // console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\n switch(type) {\n case '#':\n obj = obj || 0;\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return\n }\n\n if(Array.isArray(obj)) {\n if(type.substr(0, 6) === 'Vector') {\n this.writeInt(vector, field + '[id]');\n } else if(type.substr(0, 6) !== 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n this.writeInt(obj.length, field + '[count]');\n for(let i = 0; i < obj.length; ++i) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n\n return true;\n } else if(type.substr(0, 6).toLowerCase() === 'vector') {\n throw new Error('Invalid vector object');\n }\n\n if(!isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const predicate = obj['_'];\n let isBare = false;\n const constructorData: MTProtoConstructor = schema.constructors.find((c) => c.predicate === predicate);\n\n if(isBare = (type.charAt(0) === '%')) {\n type = type.substr(1);\n }\n\n if(!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n\n if(predicate === type) {\n isBare = true;\n }\n\n if(!isBare) {\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\n }\n\n const pFlags = obj.pFlags;\n const flagsOffsets: {[paramName: string]: number} = {};\n // console.log('storeObject', len, constructorData);\n for(const param of constructorData.params) {\n let type = param.type;\n\n // console.log('storeObject', param, type);\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n // console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\n\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\n // console.log('storeObject autocompleting', param.name, obj[param.name], type);\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n type = condType[1];\n }\n // console.log('storeObject', param, type);\n\n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n\n if(type === '#') {\n obj[param.name] = obj[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(const paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = obj[paramName];\n }\n\n return constructorData.type;\n }\n}\n\nclass TLDeserialization {\n private offset = 0; // in bytes\n private override: {[key: string]: (result: any, field: string) => void};\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n // this.debug =\n private mtproto: boolean = false;\n private debug: boolean;\n\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\n // buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\n if(buffer instanceof ArrayBuffer) {\n this.buffer = buffer;\n this.intView = new Int32Array(buffer);\n this.byteView = new Uint8Array(this.buffer);\n } else {\n this.buffer = buffer.buffer;\n this.intView = new Int32Array(buffer.buffer);\n this.byteView = buffer;\n }\n\n // console.log(this.intView);\n\n this.override = options.override || {};\n this.mtproto = !!options.mtproto;\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\n }\n\n /* public setMtproto(mtproto: boolean) {\n this.mtproto = mtproto;\n } */\n\n private readInt(field: string) {\n // if(this.offset >= this.intView.length * 4) {\n if((this.byteView.length - this.offset) < 4) {\n console.error(this.byteView, this.offset);\n throw new Error('Nothing to fetch: ' + field);\n }\n\n const i = this.intView[this.offset / 4];\n // const i = new Uint32Array(this.byteView.buffer.slice(this.offset, this.offset + 4))[0];\n\n this.debug &&/* || field.includes('[dialog][read_outbox_max_id]') */\n console.log('<<<', i.toString(16), i, field,\n this.byteView.slice(this.offset - 16, this.offset + 16),\n bytesToHex(this.byteView.slice(this.offset - 16, this.offset + 16)));\n\n this.offset += 4;\n\n return i;\n }\n\n public fetchInt(field?: string) {\n return this.readInt((field || '') + ':int');\n }\n\n public fetchDouble(field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n\n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n\n return doubleView[0];\n }\n\n // ! it should've been signed\n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n\n let ulong = ulongFromInts(iHigh, iLow);\n if(/* !unsigned && */!this.mtproto) { // make it signed\n ulong = bigIntToSigned(ulong);\n }\n\n if(!this.mtproto) {\n if(safeBigInt.greaterOrEquals(ulong.abs())) {\n // @ts-ignore\n return ulong.toJSNumber();\n }\n }\n\n // @ts-ignore\n return ulong.toString(10);\n }\n\n public fetchBool(field?: string): boolean {\n const i = this.readInt((field || '') + ':bool');\n if(i === boolTrue) {\n return true;\n } else if(i === boolFalse) {\n return false;\n }\n\n this.offset -= 4;\n return this.fetchObject('Object', field);\n }\n\n public fetchString(field?: string): string {\n let len = this.byteView[this.offset++];\n\n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n\n let sUTF8 = '';\n for(let i = 0; i < len; ++i) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n\n // Padding\n while(this.offset % 4) {\n ++this.offset;\n }\n\n let s: string;\n try {\n s = decodeURIComponent(escape(sUTF8));\n } catch(e) {\n s = sUTF8;\n }\n\n this.debug && console.log('<<<', s, (field || '') + ':string');\n\n return s;\n }\n\n public fetchBytes(field?: string) {\n let len = this.byteView[this.offset++];\n\n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n\n const bytes = this.byteView[sliceMethod](this.offset, this.offset + len);\n this.offset += len;\n\n // Padding\n while(this.offset % 4) {\n ++this.offset;\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\n\n return bytes;\n }\n\n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\n if(bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n\n const len = bits / 8;\n if(typed) {\n const result = this.byteView[sliceMethod](this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n\n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; ++i) {\n bytes[i] = this.byteView[this.offset++];\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\n\n return bytes;\n }\n\n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\n if(len === false) {\n len = this.readInt((field || '') + '_length');\n if(len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n\n if(typed) {\n const bytes = new Uint8Array(len);\n bytes.set(this.byteView[sliceMethod](this.offset, this.offset + len));\n this.offset += len;\n return bytes;\n }\n\n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; ++i) {\n bytes[i] = this.byteView[this.offset++];\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\n\n return bytes;\n }\n\n private fetchVector(type: string, field?: string) {\n const len = this.readInt(field + '[count]');\n const result: any[] = new Array(len);\n if(len > 0) {\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n for(let i = 0; i < len; ++i) {\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\n }\n }\n\n return result;\n }\n\n public fetchObject(type: string, field?: string): any {\n switch(type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, true, field);\n case 'int256':\n return this.fetchIntBytes(256, true, field);\n case 'int512':\n return this.fetchIntBytes(512, true, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n\n field = field || type || 'Object';\n\n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\n return this.fetchVector(type, field);\n }\n\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n let constructorData: MTProtoConstructor = null;\n let fallback = false;\n\n if(type.charAt(0) === '%') {\n const checkType = type.substr(1);\n constructorData = schema.constructors.find((c) => c.type === checkType);\n if(!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n constructorData = schema.constructors.find((c) => c.predicate === type);\n if(!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n } */ else {\n const constructorCmp = this.readInt(field + '[id]');\n\n if(constructorCmp === gzipPacked) { // Gzip packed\n const compressed = this.fetchBytes(field + '[packed_string]');\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\n\n return newDeserializer.fetchObject(type, field);\n }\n\n if(constructorCmp === vector) {\n return this.fetchVector(type, field);\n }\n\n let index = schema.constructorsIndex;\n if(!index) {\n schema.constructorsIndex = index = {};\n for(let i = 0, len = schema.constructors.length; i < len; ++i) {\n index[schema.constructors[i].id] = i;\n }\n }\n\n const i = index[constructorCmp];\n if(i !== undefined) {\n constructorData = schema.constructors[i];\n }\n\n if(!constructorData && this.mtproto) {\n const schemaFallback = Schema.API;\n for(let i = 0, len = schemaFallback.constructors.length; i < len; ++i) {\n if(+schemaFallback.constructors[i].id === constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n\n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n\n if(!constructorData) {\n console.error('Constructor not found:', constructorCmp);\n\n let int1: number, int2: number;\n try {\n int1 = this.fetchInt(field);\n int2 = this.fetchInt(field);\n } catch(err) {\n\n }\n\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\n }\n }\n\n const predicate = constructorData.predicate;\n\n const result: any = {'_': predicate};\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n if(this.override[overrideKey]) {\n this.override[overrideKey](result, field + '[' + predicate + ']');\n } else {\n for(let i = 0, len = constructorData.params.length; i < len; ++i) {\n const param = constructorData.params[i];\n let type = param.type;\n\n if(type === '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n\n const isCond = type.indexOf('?') !== -1;\n if(isCond) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\n continue;\n }\n\n type = condType[1];\n }\n\n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n\n if(isCond && type === 'true') {\n result.pFlags[param.name] = value;\n } else {\n result[param.name] = value;\n }\n }\n }\n\n if(fallback) {\n this.mtproto = true;\n }\n\n if(type === 'JSONValue') {\n return this.formatJSONValue(result);\n }\n\n return result;\n }\n\n private formatJSONValue(jsonValue: JSONValue): any {\n if(!jsonValue._) return jsonValue;\n switch(jsonValue._) {\n case 'jsonNull':\n return null;\n case 'jsonObject': {\n const out: any = {};\n const objectValues = jsonValue.value;\n for(let i = 0, length = objectValues.length; i < length; ++i) {\n const objectValue = objectValues[i];\n out[objectValue.key] = this.formatJSONValue(objectValue.value);\n }\n return out;\n }\n default:\n return jsonValue.value;\n }\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public setOffset(offset: number) {\n this.offset = offset;\n }\n\n /* public fetchEnd() {\n if(this.offset !== this.byteView.length) {\n throw new Error('Fetch end with non-empty buffer');\n }\n\n return true;\n } */\n}\n\nMOUNT_CLASS_TO.TLDeserialization = TLDeserialization;\nMOUNT_CLASS_TO.TLSerialization = TLSerialization;\nexport {TLDeserialization, TLSerialization};\n","// export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n// export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n // console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n // console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","import randomize from '../array/randomize';\nimport bufferConcats from './bufferConcats';\n\nexport default function addPadding(\n bytes: T,\n blockSize: number = 16,\n zeroes?: boolean,\n blockSizeAsTotalLength = false,\n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n // //console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n randomize(padding);\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport {NetworkerFactory} from './networkerFactory';\nimport {logger, LogTypes} from '../logger';\nimport {InvokeApiOptions} from '../../types';\nimport longToBytes from '../../helpers/long/longToBytes';\nimport MTTransport from './transports/transport';\nimport {nextRandomUint, randomLong} from '../../helpers/random';\nimport App from '../../config/app';\nimport DEBUG from '../../config/debug';\nimport Modes from '../../config/modes';\nimport noop from '../../helpers/noop';\n\n \nimport HTTP from './transports/http';\n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport bigInt from 'big-integer';\nimport {ConnectionStatus} from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport isObject from '../../helpers/object/isObject';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport sortLongsArray from '../../helpers/long/sortLongsArray';\nimport randomize from '../../helpers/array/randomize';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\nimport {getEnvironment} from '../../environment/utils';\nimport {TimeManager} from './timeManager';\n\n// console.error('networker included!', new Error().stack);\n\nexport type MTMessageOptions = InvokeApiOptions & Partial<{\n noResponse: true, // http_wait\n longPoll: true,\n\n notContentRelated: true, // ACK\n noSchedule: true,\n // withResult: true,\n messageId: MTLong,\n}>;\n\nexport type MTMessage = InvokeApiOptions & MTMessageOptions & {\n msg_id: MTLong,\n seq_no: number,\n body?: Uint8Array | number[],\n isAPI?: boolean,\n // only these four are important\n\n acked?: boolean,\n\n deferred?: CancellablePromise,\n\n container?: boolean,\n inner?: MTLong[],\n\n // below - options\n\n notContentRelated?: true,\n noSchedule?: true,\n\n resultType?: string,\n\n longPoll?: true,\n noResponse?: true, // only with http (http_wait for longPoll)\n};\n\nconst DRAIN_TIMEOUT = 10000;\nconst delays: {\n [k in 'client' | 'file']: {\n disconnectDelayMin: number,\n disconnectDelayMax: number,\n pingInterval: number,\n pingMaxTime: number,\n connectionTimeout: number\n }\n} = {\n client: {\n disconnectDelayMin: 7,\n disconnectDelayMax: 20,\n pingInterval: 2000,\n pingMaxTime: 5,\n connectionTimeout: 5000\n },\n file: {\n disconnectDelayMin: 10,\n disconnectDelayMax: 24,\n pingInterval: 3000,\n pingMaxTime: 7,\n connectionTimeout: 7500\n }\n};\nconst RESEND_OPTIONS: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true\n};\nlet invokeAfterMsgConstructor: number;\nlet networkerTempId = 0;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array = [];\n private pendingResendReq: MTLong[] = [];\n // private pendingResendAnsReq: MTLong[] = [];\n public connectionInited: boolean;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n\n \n private longPollInterval: number;\n private longPollPending: number;\n private checkConnectionRetryAt: number;\n private checkConnectionTimeout: number;\n private checkConnectionPeriod = 0;\n private sleepAfter: number;\n private offline = false;\n private sendingLongPoll: boolean;\n \n\n private seqNo: number;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n reqMsgId: MTLong,\n msgIds: MTPNetworker['pendingResendReq']\n };\n // private lastResendAnsReq: MTPNetworker['lastResendReq'];\n\n private name: string;\n private log: ReturnType;\n\n public isOnline = false;\n private status: ConnectionStatus = ConnectionStatus.Closed;\n private lastResponseTime = 0;\n\n private debug = DEBUG /* && false */ || Modes.debug;\n\n public activeRequests = 0;\n\n public onDrain: () => void;\n private onDrainTimeout: number;\n\n public transport: MTTransport;\n\n \n private pingDelayDisconnectDeferred: CancellablePromise;\n private pingPromise: Promise;\n // private pingInterval: number;\n private lastPingTime: number;\n private lastPingStartTime: number;\n private lastPingDelayDisconnectId: string;\n \n // public onConnectionStatusChange: (online: boolean) => void;\n\n // private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n private delays: typeof delays[keyof typeof delays];\n // private getNewTimeOffset: boolean;\n\n constructor(\n private networkerFactory: NetworkerFactory,\n private timeManager: TimeManager,\n public dcId: number,\n private authKey: Uint8Array,\n private authKeyId: Uint8Array,\n serverSalt: Uint8Array,\n options: InvokeApiOptions = {}\n ) {\n this.authKeyUint8 = convertToUint8Array(this.authKey);\n this.serverSalt = convertToUint8Array(serverSalt);\n\n this.isFileUpload = !!options.fileUpload;\n this.isFileDownload = !!options.fileDownload;\n this.isFileNetworker = this.isFileUpload || this.isFileDownload;\n this.delays = this.isFileNetworker ? delays.file : delays.client;\n\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n // this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name + (suffix ? '' : '-C') + '-' + networkerTempId++, LogTypes.Log/* | LogTypes.Debug */ | LogTypes.Error | LogTypes.Warn);\n this.log('constructor'/* , this.authKey, this.authKeyID, this.serverSalt */);\n\n // Test resend after bad_server_salt\n /* if(this.dcId === 2 && this.upload) {\n //timeManager.applyServerTime((Date.now() / 1000 - 86400) | 0);\n this.serverSalt[0] = 0;\n } */\n\n this.updateSession();\n\n // if(!NetworkerFactory.offlineInited) {\n // NetworkerFactory.offlineInited = true;\n // /* rootScope.offline = true\n // rootScope.offlineConnecting = true */\n // }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = randomize(new Uint8Array(8));\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n\n sentMessage.msg_id = this.timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n if(this.debug) {\n this.log(`updateSentMessage, old=${sentMessageId}, new=${sentMessage.msg_id}`);\n }\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n\n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n\n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n\n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n\n serializer.storeMethod(method, params);\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n\n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n\n return this.pushMessage(message, options);\n }\n\n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n\n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n\n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n\n if(!this.connectionInited) { // this will call once for each new session\n // /////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find((m) => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n\n const initConnection = Schema.API.methods.find((m) => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n\n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(getEnvironment().USER_AGENT || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(this.networkerFactory.language, 'lang_code');\n // serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n\n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find((m) => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n\n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n\n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n\n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n\n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n\n return this.pushMessage(message, options);\n }\n\n public changeTransport(transport?: MTTransport) {\n const oldTransport = this.transport;\n if(oldTransport) {\n oldTransport.destroy();\n\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n this.connectionInited = false;\n\n \n if(this.longPollInterval !== undefined) {\n clearInterval(this.longPollInterval);\n this.longPollInterval = undefined;\n }\n\n this.clearCheckConnectionTimeout();\n \n }\n\n this.log('change transport', transport, oldTransport);\n\n \n this.clearPingDelayDisconnect();\n\n // if(this.pingInterval !== undefined) {\n // clearInterval(this.pingInterval);\n // this.pingInterval = undefined;\n // }\n\n // this.clearPing();\n \n\n this.transport = transport;\n if(!transport) {\n return;\n }\n\n transport.networker = this;\n\n \n \n if(transport instanceof HTTP) {\n \n this.longPollInterval = ctx.setInterval(this.checkLongPoll, 10000);\n this.checkLongPoll();\n this.checkConnection('changed transport');\n \n }\n \n \n\n \n // * handle outcoming dead socket, server will close the connection\n if((transport as TcpObfuscated).connection) {\n // this.sendPingDelayDisconnect();\n\n if(transport.connected) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n // this.pingInterval = ctx.setInterval(this.sendPing, PING_INTERVAL);\n // this.sendPing();\n }\n \n\n this.resend();\n }\n\n public destroy() {\n this.log('destroy');\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n } else {\n this.resend();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n } else {\n this.checkConnection('force reconnect');\n }\n }\n\n /* private clearPing() {\n if(this.pingPromise) {\n this.pingPromise = undefined;\n }\n\n this.lastPingTime = undefined;\n }\n\n private sendPing = () => {\n // return;\n\n // if(!(this.transport as TcpObfuscated).connected) {\n // this.clearPing();\n // return;\n // }\n\n if(this.pingPromise) {\n return;\n }\n\n const startTime = Date.now();\n this.log('sendPing: ping', startTime);\n const promise = this.pingPromise = this.wrapMtpCall('ping', {\n ping_id: randomLong()\n }, {\n notContentRelated: true\n }).then(() => {\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.log('sendPing: pong', elapsedTime);\n\n setTimeout(() => {\n if(this.pingPromise !== promise) {\n return;\n }\n\n this.pingPromise = undefined;\n this.sendPing();\n }, Math.max(0, PING_INTERVAL - elapsedTime));\n });\n }; */\n\n private clearPingDelayDisconnect() {\n const deferred = this.pingDelayDisconnectDeferred;\n this.pingDelayDisconnectDeferred = undefined;\n this.lastPingDelayDisconnectId = undefined;\n\n if(deferred) {\n deferred.reject();\n }\n }\n\n private sendPingDelayDisconnect = () => {\n // return;\n\n if(this.pingDelayDisconnectDeferred || !this.transport || !this.transport.connected) return;\n\n /* if(!this.isOnline) {\n if((this.transport as TcpObfuscated).connected) {\n (this.transport as TcpObfuscated).connection.close();\n }\n\n return;\n } */\n\n const deferred = this.pingDelayDisconnectDeferred = deferredPromise();\n const delays = this.delays;\n const pingMaxTime = this.delays.pingMaxTime;\n const lastPingTime = Math.min(this.lastPingTime ?? 0, pingMaxTime);\n const disconnectDelay = Math.round(delays.disconnectDelayMin + lastPingTime / pingMaxTime * (delays.disconnectDelayMax - delays.disconnectDelayMin));\n const timeoutTime = disconnectDelay * 1000;\n const startTime = this.lastPingStartTime = Date.now();\n const pingId = this.lastPingDelayDisconnectId = randomLong();\n const options: MTMessageOptions = {notContentRelated: true};\n this.wrapMtpCall('ping_delay_disconnect', {\n ping_id: pingId,\n disconnect_delay: disconnectDelay\n }, options);\n\n const log = this.log.bindPrefix('sendPingDelayDisconnect');\n this.debug && log.debug(`ping, timeout=${timeoutTime}, lastPingTime=${this.lastPingTime}, msgId=${options.messageId}, pingId=${pingId}`);\n const rejectTimeout = ctx.setTimeout(deferred.reject, timeoutTime);\n\n const onResolved = (reason: string) => {\n clearTimeout(rejectTimeout);\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.debug && log.debug(`pong, reason='${reason}', time=${lastPingTime}, msgId=${options.messageId}`);\n if(elapsedTime > timeoutTime) {\n throw undefined;\n } else {\n return pause(Math.max(0, this.delays.pingInterval - elapsedTime/* timeoutTime - elapsedTime - PING_INTERVAL */));\n }\n };\n\n const onTimeout = () => {\n clearTimeout(rejectTimeout);\n const transport = this.transport as TcpObfuscated;\n if(this.pingDelayDisconnectDeferred !== deferred || !transport?.connection) {\n return;\n }\n\n log.error('catch, closing connection', this.lastPingTime, options.messageId);\n transport.connection.close();\n };\n\n const onFinally = () => {\n if(this.pingDelayDisconnectDeferred !== deferred) {\n return;\n }\n\n this.pingDelayDisconnectDeferred = undefined;\n this.sendPingDelayDisconnect();\n };\n\n deferred\n .then(onResolved)\n .catch(onTimeout)\n .finally(onFinally);\n };\n\n \n private checkLongPoll = () => {\n const isClean = this.cleanupSent();\n // this.log.error('Check lp', this.longPollPending, this.dcId, isClean, this);\n if((this.longPollPending && Date.now() < this.longPollPending) ||\n this.offline ||\n this.isStopped() ||\n this.isFileNetworker) {\n // this.log('No lp this time');\n return false;\n }\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(isClean && (\n baseDcId !== this.dcId ||\n (this.sleepAfter && Date.now() > this.sleepAfter)\n )) {\n // console.warn(dT(), 'Send long-poll for DC is delayed', this.dcId, this.sleepAfter);\n return;\n }\n\n this.sendLongPoll();\n });\n };\n\n private sendLongPoll() {\n if(this.sendingLongPoll) return;\n this.sendingLongPoll = true;\n const maxWait = 25000;\n\n this.longPollPending = Date.now() + maxWait;\n this.debug && this.log.debug('sendLongPoll', this.longPollPending);\n\n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n // notContentRelated: true,\n longPoll: true\n }).then(() => {\n this.longPollPending = undefined;\n setTimeout(this.checkLongPoll, 0);\n }, (error: ErrorEvent) => {\n this.log('Long-poll failed', error);\n }).finally(() => {\n this.sendingLongPoll = undefined;\n });\n }\n\n private checkConnection = (event: Event | string) => {\n this.debug && this.log('Check connection', event);\n this.clearCheckConnectionTimeout();\n\n if(!this.transport) {\n this.log.warn('No transport for checkConnection');\n return;\n }\n\n const serializer = new TLSerialization({mtproto: true});\n const pingId = randomLong();\n\n serializer.storeMethod('ping', {\n ping_id: pingId\n });\n\n const pingMessage = {\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes(true)\n };\n\n if(this.offline) {\n this.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.sendEncryptedRequest(pingMessage).then(() => {\n this.toggleOffline(false);\n }, () => {\n this.debug && this.log('Delay', this.checkConnectionPeriod * 1000);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from failed checkConnection request'), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(60, this.checkConnectionPeriod * 1.5);\n });\n };\n\n private clearCheckConnectionTimeout() {\n if(this.checkConnectionTimeout !== undefined) {\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = undefined;\n }\n }\n\n private toggleOffline(offline: boolean) {\n if(this.offline !== offline) {\n this.offline = offline;\n\n this.clearCheckConnectionTimeout();\n if(offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n if(this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n\n const delay = this.checkConnectionPeriod * 1000 | 0;\n this.checkConnectionRetryAt = Date.now() + delay;\n this.setConnectionStatus(ConnectionStatus.Closed, this.checkConnectionRetryAt);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from toggleOfline'), delay);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n\n \n \n \n \n } else {\n this.setConnectionStatus(ConnectionStatus.Connected);\n this.checkLongPoll();\n\n this.scheduleRequest();\n\n \n \n \n \n }\n }\n\n this.setConnectionStatus(offline ? ConnectionStatus.Closed : ConnectionStatus.Connected, offline ? this.checkConnectionRetryAt : undefined);\n }\n\n private handleSentEncryptedRequestHTTP(promise: ReturnType, message: MTMessage, noResponseMsgs: string[]) {\n // let timeout = setTimeout(() => {\n // this.log.error('handleSentEncryptedRequestHTTP timeout', promise, message, noResponseMsgs);\n // }, 5e3);\n\n promise.then((result) => {\n this.toggleOffline(false);\n // this.log('parse for', message);\n return this.parseResponse(result).then((response) => {\n this.debug && this.log.debug('Server response', response);\n\n this.processMessage(response.response, response.messageId, response.sessionId);\n\n this.checkLongPoll();\n this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod));\n\n return true;\n });\n }, (error) => {\n this.log.error('Encrypted request failed', error, message);\n\n this.pushResend(message.msg_id);\n this.toggleOffline(true);\n\n return false;\n }).then((shouldResolve) => {\n // clearTimeout(timeout);\n const sentMessages = this.sentMessages;\n noResponseMsgs.forEach((msgId) => {\n const sentMessage = sentMessages[msgId];\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n delete sentMessages[msgId];\n delete this.pendingMessages[msgId];\n shouldResolve ? deferred.resolve() : deferred.reject();\n }\n });\n });\n }\n \n\n // тут можно сделать таймаут и выводить дисконнект\n private pushMessage(message: {\n msg_id: string,\n seq_no: number,\n body: Uint8Array | number[],\n isAPI?: boolean\n }, options: MTMessageOptions) {\n let promise: CancellablePromise;\n if(!options.notContentRelated || options.noResponse) {\n promise = deferredPromise();\n }\n\n this.sentMessages[message.msg_id] = Object.assign(\n message,\n options,\n promise ? {deferred: promise} : undefined\n );\n\n // this.log.error('Networker pushMessage:', this.sentMessages[message.msg_id]);\n\n this.pendingMessages[message.msg_id] = 0;\n\n if(!options.noSchedule) {\n this.scheduleRequest();\n }\n\n if(isObject(options)) {\n options.messageId = message.msg_id;\n }\n\n return promise;\n }\n\n public attachPromise(promise: Promise, message: MTMessage) {\n const canIncrement = true;\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < this.delays.connectionTimeout) {\n return;\n }\n\n this.log.error('timeout', message);\n if(this.isOnline) {\n this.setConnectionStatus(ConnectionStatus.TimedOut);\n }\n\n /* this.getEncryptedOutput(message).then((bytes) => {\n this.log.error('timeout encrypted', bytes);\n }); */\n }, this.delays.connectionTimeout);\n\n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n if(canIncrement) {\n --this.activeRequests;\n this.setDrainTimeout();\n }\n });\n\n if(canIncrement) {\n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = ctx.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(this.networkerFactory.onConnectionStatusChange) {\n this.networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n if((this.transport as TcpObfuscated)?.connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n\n // this.getNewTimeOffset = true;\n }\n /* if(this.onConnectionStatusChange) {\n this.onConnectionStatusChange(this.isOnline);\n } */\n }\n\n private pushResend(messageId: string, delay = 100) {\n const value = delay ? Date.now() + delay : 0;\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage.container) {\n for(const innerMsgId of sentMessage.inner) {\n this.pendingMessages[innerMsgId] = value;\n }\n } else {\n this.pendingMessages[messageId] = value;\n }\n\n if(sentMessage.acked) {\n this.log.error('pushResend: acked message?', sentMessage);\n }\n\n if(this.debug) {\n this.log.debug('pushResend:', messageId, sentMessage, this.pendingMessages, delay);\n }\n\n this.scheduleRequest(delay);\n }\n\n // * correct, fully checked\n private async getMsgKey(dataWithPadding: Uint8Array, isOut: boolean) {\n const x = isOut ? 0 : 8;\n const msgKeyLargePlain = bufferConcats(this.authKeyUint8.subarray(88 + x, 88 + x + 32), dataWithPadding);\n\n const msgKeyLarge = await CryptoWorker.invokeCrypto('sha256', msgKeyLargePlain);\n const msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n };\n\n // * correct, fully checked\n private getAesKeyIv(msgKey: Uint8Array, isOut: boolean): Promise<[Uint8Array, Uint8Array]> {\n const x = isOut ? 0 : 8;\n const sha2aText = new Uint8Array(52);\n const sha2bText = new Uint8Array(52);\n const promises: Array> = [];\n\n sha2aText.set(msgKey, 0);\n sha2aText.set(this.authKeyUint8.subarray(x, x + 36), 16);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2aText));\n\n sha2bText.set(this.authKeyUint8.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n\n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n\n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n\n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return this.networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n if(this.isStopped()) {\n return false;\n }\n\n if(this.pendingAcks.length) {\n const ackMsgIds = this.pendingAcks.slice();\n\n // this.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIds\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n\n const pendingResendReqLength = this.pendingResendReq.length;\n if(pendingResendReqLength) {\n const options: MTMessageOptions = {...RESEND_OPTIONS};\n const msgIds = this.pendingResendReq.splice(0, pendingResendReqLength);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: msgIds\n }, options);\n\n this.log('resend: resending requests', options.messageId, msgIds);\n /* this.lastResendReq = {\n reqMsgId: options.messageId,\n msgIds: msgIds\n }; */\n\n // this.pendingResendReq.length = 0;\n }\n\n // if(this.pendingResendAnsReq.length) {\n // const options: MTMessageOptions = {...RESEND_OPTIONS};\n // const msgIds = this.pendingResendAnsReq.slice();\n // this.wrapMtpMessage({\n // _: 'msg_resend_ans_req',\n // msg_ids: msgIds\n // }, options);\n\n // this.log('resend: requesting answers', options.messageId, msgIds);\n // this.lastResendAnsReq = {\n // reqMsgId: options.messageId,\n // msgIds: msgIds\n // };\n\n // // this.pendingResendAnsReq.length = 0;\n // }\n\n let outMessage: MTMessage;\n const messages: typeof outMessage[] = [];\n\n // const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n let hasApiCall = false;\n let hasHttpWait = false;\n \n\n let lengthOverflow = false;\n\n // * Сюда никогда не попадут контейнеры, так как их не будет в pendingMessages\n const keys = sortLongsArray(Object.keys(this.pendingMessages));\n for(const messageId of keys) {\n // const value = this.pendingMessages[messageId];\n\n // if(!value || value <= currentTime) {\n const message = this.sentMessages[messageId];\n if(message && message.body) {\n /* if(message.fileUpload) {\n this.log('performScheduledRequest message:', message, message.body.length, (message.body as Uint8Array).byteLength, (message.body as Uint8Array).buffer.byteLength);\n } */\n\n const messageByteLength = message.body.length + 32;\n\n if((messagesByteLen + messageByteLength) > 655360) { // 640 Kb\n this.log.warn('lengthOverflow', message, messages);\n lengthOverflow = true;\n\n if(outMessage) { // if it's not a first message\n break;\n }\n }\n\n messages.push(message);\n messagesByteLen += messageByteLength;\n\n \n if(message.isAPI) {\n hasApiCall = true;\n } else if(message.longPoll) {\n hasHttpWait = true;\n }\n \n\n outMessage = message;\n } else {\n // this.log(message, messageId)\n }\n\n delete this.pendingMessages[messageId];\n // }\n }\n\n \n \n if(this.transport instanceof HTTP)\n \n if(hasApiCall && !hasHttpWait) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n\n messages.push({\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes(true)\n });\n }\n \n\n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n\n \n const noResponseMsgs: Array = messages.filter((message) => message.noResponse).map((message) => message.msg_id);\n \n\n if(messages.length > 1) {\n const container = this.generateContainerMessage(messagesByteLen, messages);\n outMessage = container.messageWithBody;\n\n this.sentMessages[outMessage.msg_id] = container.message;\n } else {\n this.sentMessages[outMessage.msg_id] = outMessage;\n }\n\n this.pendingAcks = [];\n\n const promise = this.sendEncryptedRequest(outMessage);\n\n \n \n if(this.transport instanceof HTTP)\n \n this.handleSentEncryptedRequestHTTP(promise, outMessage, noResponseMsgs);\n \n\n \n \n if(!(this.transport instanceof HTTP))\n \n this.cleanupSent(); // ! WARNING\n \n\n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message)\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n\n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n\n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */randomize(new Uint8Array(paddingLength))/* .fill(0) */;\n /* const padding = [167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157,\n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150,\n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28, 167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157,\n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150,\n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28].slice(0, paddingLength); */\n\n // (message as any).padding = padding;\n\n const dataWithPadding = bufferConcats(dataBuffer, padding);\n // this.log('Adding padding', dataBuffer, padding, dataWithPadding)\n // this.log('auth_key_id', bytesToHex(self.authKeyID))\n\n /* if(dataWithPadding.byteLength % 16) {\n this.log.error('aaa', dataWithPadding, paddingLength);\n }\n\n if(message.fileUpload) {\n this.log('Send encrypted: body length:', (message.body as ArrayBuffer).byteLength, paddingLength, dataWithPadding);\n } */\n\n // * full next block is correct\n return this.getEncryptedMessage(dataWithPadding).then((encryptedResult) => {\n /* if(DEBUG) {\n this.log('Got encrypted out message', encryptedResult);\n } */\n\n const request = new TLSerialization({\n startMaxLength: encryptedResult.bytes.length + 256\n });\n request.storeIntBytes(this.authKeyId, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n\n const requestData = request.getBytes(true);\n\n // if(this.isFileNetworker) {\n // //this.log('Send encrypted: requestData length:', requestData.length, requestData.length % 16, paddingLength % 16, paddingLength, data.offset, encryptedResult.msgKey.length % 16, encryptedResult.bytes.length % 16);\n // //this.log('Send encrypted: messageId:', message.msg_id, requestData.length);\n // //this.log('Send encrypted:', message, new Uint8Array(bufferConcat(des.buffer, padding)), requestData, this.serverSalt.hex, this.sessionId.hex/* new Uint8Array(des.buffer) */);\n // this.debugRequests.push({before: new Uint8Array(bufferConcat(des.buffer, padding)), after: requestData});\n // }\n\n return requestData;\n });\n }\n\n private async sendEncryptedRequest(message: MTMessage) {\n const requestData = await this.getEncryptedOutput(message);\n\n if(!this.transport) {\n this.log.error('trying to send something when offline', this.transport, this);\n }\n\n this.debug && this.log.debug('sending:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise = this.transport ? this.transport.send(requestData) as any : Promise.reject({});\n // this.debug && this.log.debug('sendEncryptedRequest: launched message into space:', message, promise);\n\n \n \n \n\n \n if(!(this.transport instanceof HTTP)) return promise;\n \n\n const baseError: ApiError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n // @ts-ignore\n transport: this.transport\n };\n\n return promise.then((result) => {\n if(!result?.byteLength) {\n throw baseError;\n }\n\n // this.debug && this.log.debug('sendEncryptedRequest: got response for:', message, [message.msg_id].concat(message.inner || []));\n return result;\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n\n throw error;\n });\n \n }\n\n public parseResponse(responseBuffer: Uint8Array) {\n // const perf = performance.now();\n /* if(this.debug) {\n this.log.debug('Start parsing response', responseBuffer);\n } */\n\n this.lastResponseTime = Date.now();\n\n const deserializer = new TLDeserialization(responseBuffer);\n\n const authKeyId = deserializer.fetchIntBytes(64, true, 'auth_key_id');\n if(!bytesCmp(authKeyId, this.authKeyId)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + bytesToHex(authKeyId));\n }\n\n const msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n const encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n\n return this.getDecryptedMessage(msgKey, encryptedData).then((dataWithPadding) => {\n // this.log('after decrypt')\n return this.getMsgKey(dataWithPadding, false).then((calcMsgKey) => {\n if(!bytesCmp(msgKey, calcMsgKey)) {\n this.log.warn('[MT] msg_keys', msgKey, calcMsgKey);\n this.updateSession(); // fix 28.01.2020\n throw new Error('[MT] server msgKey mismatch, updating session');\n }\n // this.log('after msgKey check')\n\n let deserializer = new TLDeserialization(dataWithPadding, {mtproto: true});\n\n /* const salt = */deserializer.fetchIntBytes(64, true, 'salt'); // need\n const sessionId = deserializer.fetchIntBytes(64, true, 'session_id');\n const messageId = deserializer.fetchLong('message_id');\n\n if(!bytesCmp(sessionId, this.sessionId) &&\n (!this.prevSessionId || !bytesCmp(sessionId, this.prevSessionId))) {\n this.log.warn('Sessions', sessionId, this.sessionId, this.prevSessionId, dataWithPadding);\n // this.updateSession();\n // this.sessionID = sessionID;\n throw new Error('[MT] Invalid server session_id: ' + bytesToHex(sessionId));\n }\n\n const seqNo = deserializer.fetchInt('seq_no');\n\n const totalLength = dataWithPadding.byteLength;\n\n const messageBodyLength = deserializer.fetchInt('message_data[length]');\n let offset = deserializer.getOffset();\n\n if((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n const messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n\n offset = deserializer.getOffset();\n const paddingLength = totalLength - offset;\n if(paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n\n // let buffer = bytesToArrayBuffer(messageBody);\n deserializer = new TLDeserialization(/* buffer */messageBody, {\n mtproto: true,\n override: {\n mt_message: (result: any, field: string) => {\n result.msg_id = deserializer.fetchLong(field + '[msg_id]');\n result.seqno = deserializer.fetchInt(field + '[seqno]');\n result.bytes = deserializer.fetchInt(field + '[bytes]');\n\n const offset = deserializer.getOffset();\n\n // self.log('mt_message!!!!!', result, field);\n\n try {\n result.body = deserializer.fetchObject('Object', field + '[body]');\n } catch(e) {\n this.log.error('parse error', (e as Error).message, (e as Error).stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n\n if(deserializer.getOffset() !== offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // this.log(result)\n deserializer.setOffset(offset + result.bytes);\n }\n // this.log('override message', result)\n },\n mt_rpc_result: (result: any, field: any) => {\n result.req_msg_id = deserializer.fetchLong(field + '[req_msg_id]');\n\n const sentMessage = this.sentMessages[result.req_msg_id];\n const type = sentMessage && sentMessage.resultType || 'Object';\n\n if(result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n\n // deserializer.setMtproto(false);\n result.result = deserializer.fetchObject(type, field + '[result]');\n // deserializer.setMtproto(true);\n // self.log(dT(), 'override rpc_result', sentMessage, type, result);\n }\n }\n });\n\n const response = deserializer.fetchObject('', 'INPUT');\n // this.log.error('Parse response time:', performance.now() - perf);\n return {\n response,\n messageId,\n sessionId,\n seqNo\n };\n });\n });\n }\n\n private applyServerSalt(newServerSalt: string) {\n const serverSalt = longToBytes(newServerSalt);\n\n sessionStorage.set({\n ['dc' + this.dcId + '_server_salt']: bytesToHex(serverSalt)\n });\n\n this.serverSalt = new Uint8Array(serverSalt);\n }\n\n // ! таймаут очень сильно тормозит скорость работы сокета (даже нулевой)\n public scheduleRequest(delay?: number) {\n /* if(!this.isOnline) {\n return;\n } */\n\n \n \n if(this.transport instanceof HTTP) {\n \n if(this.offline) {\n this.checkConnection('forced schedule');\n }\n\n delay ||= 0; // set zero timeout to pack other messages too\n \n }\n \n \n\n const nextReq = Date.now() + (delay || 0);\n if(this.nextReq && (delay === undefined || this.nextReq <= nextReq)) {\n // this.debug && this.log('scheduleRequest: nextReq', this.nextReq, nextReq);\n return;\n }\n\n // this.debug && this.log('scheduleRequest: delay', delay);\n\n /* if(this.nextReqTimeout) {\n return;\n } */\n\n // const perf = performance.now();\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n }\n\n const cb = () => {\n // this.debug && this.log('scheduleRequest: timeout delay was:', performance.now() - perf);\n\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n \n \n if(this.transport instanceof HTTP)\n \n if(this.offline) {\n // this.log('Cancel scheduled');\n return;\n }\n \n\n this.performScheduledRequest();\n };\n\n this.nextReq = nextReq;\n\n if(delay !== undefined) {\n this.nextReqTimeout = ctx.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n let delay: number;\n\n \n \n if(this.transport instanceof HTTP)\n \n delay = 30000;\n \n\n this.scheduleRequest(delay);\n }\n\n private reqResend(msgId: MTLong/* , isAnswer?: boolean */) {\n if(this.debug) {\n this.log.debug('Req resend', msgId/* , isAnswer */);\n }\n\n // (isAnswer ? this.pendingResendAnsReq : this.pendingResendReq).push(msgId);\n this.pendingResendReq.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n const sentMessages = this.sentMessages;\n // this.log('clean start', this.dcId/*, sentMessages*/)\n Object.keys(sentMessages).forEach((msgId) => {\n const message = sentMessages[msgId];\n\n // this.log('clean iter', msgID, message)\n if(message.notContentRelated && this.pendingMessages[msgId] === undefined) {\n // this.log('clean notContentRelated', msgID)\n delete sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n\n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n // delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}): ApiError {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n\n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] as any || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n const sentMessages = this.sentMessages;\n for(const id in sentMessages) {\n const msg = sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n\n if((this.transport as TcpObfuscated).connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n }\n\n /* public requestMessageStatus() {\n const ids: string[] = [];\n for(const id in this.sentMessages) {\n const message = this.sentMessages[id];\n if(message.isAPI && message.fileUpload) {\n ids.push(message.msg_id);\n }\n }\n\n this.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: ids\n }, {\n notContentRelated: true\n }).then((res) => {\n this.log('status', res);\n });\n } */\n\n private applyServerTime(messageId: string) {\n const serverTime = bigInt(messageId).shiftRight(32).toJSNumber();\n this.log('applying server time', serverTime);\n return this.timeManager.applyServerTime(serverTime);\n }\n\n // * https://core.telegram.org/mtproto/service_messages_about_messages#notice-of-ignored-error-message\n public processMessage(message: any, messageId: MTLong, sessionId: Uint8Array | number[]) {\n if(message._ === 'messageEmpty') {\n this.log.warn('processMessage: messageEmpty', message, messageId);\n return;\n }\n\n // messageId = messageId.toString();\n\n const msgidInt = parseInt(messageId.substr(0, -10), 10);\n if(msgidInt % 2) {\n this.log.warn('Server even message id: ', messageId, message);\n return;\n }\n\n if(this.debug) {\n this.log.debug('process message', message, messageId);\n }\n\n if(this.pingDelayDisconnectDeferred) {\n this.pingDelayDisconnectDeferred.resolve('any message');\n }\n\n // let changedTimeOffset: boolean;\n // if(this.getNewTimeOffset) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // this.getNewTimeOffset = undefined;\n // }\n\n switch(message._) {\n case 'msg_container': {\n for(const innerMessage of message.messages) {\n this.processMessage(innerMessage, innerMessage.msg_id, sessionId);\n }\n\n break;\n }\n\n case 'bad_server_salt': {\n this.log('Bad server salt', message);\n\n this.applyServerSalt(message.new_server_salt);\n\n if(this.sentMessages[message.bad_msg_id]) {\n this.pushResend(message.bad_msg_id);\n }\n\n this.ackMessage(messageId);\n\n // simulate disconnect\n /* try {\n this.log('networker state:', this);\n // @ts-ignore\n this.transport.ws.close(1000);\n } catch(err) {\n this.log.error('transport', this.transport, err);\n } */\n\n break;\n }\n\n case 'bad_msg_notification': {\n this.log.error('Bad msg notification', message);\n\n switch(message.error_code) {\n case 16: // * msg_id too low\n case 17: // * msg_id too high\n case 32: // * msg_seqno too low\n case 33: // * msg_seqno too high\n case 64: { // * invalid container\n // if(changedTimeOffset === undefined) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // }\n\n const changedTimeOffset = this.applyServerTime(messageId);\n if(message.error_code === 17 || changedTimeOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n // this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n\n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n\n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n // this.updateSession();\n\n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && this.networkerFactory.updatesProcessor) {\n this.networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n\n case 'msgs_ack': {\n this.debug && this.log('got acks', message.msg_ids);\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n\n case 'msg_detailed_info': {\n const sentMessage = this.sentMessages[message.msg_id];\n if(!sentMessage) {\n this.ackMessage(message.answer_msg_id);\n break;\n }/* else if(sentMessage.acked) {\n this.reqResend(message.answer_msg_id, true);\n }\n\n break; */\n }\n\n case 'msg_new_detailed_info': {\n if(this.pendingAcks.indexOf(message.answer_msg_id) !== -1) {\n break;\n }\n\n this.reqResend(message.answer_msg_id);\n break;\n }\n\n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n const arr = [\n [this.lastResendReq, this.pendingResendReq] as const\n // [this.lastResendAnsReq, this.pendingResendAnsReq] as const\n ];\n\n for(const [lastResend, pendingResend] of arr) {\n if(lastResend?.reqMsgId === message.req_msg_id && pendingResend.length) {\n for(const badMsgId of lastResend.msgIds) {\n const pos = pendingResend.indexOf(badMsgId);\n if(pos !== -1) {\n pendingResend.splice(pos, 1);\n }\n }\n }\n }\n\n break;\n }\n\n case 'rpc_result': {\n this.ackMessage(messageId);\n\n const sentMessageId = message.req_msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n if(this.debug) {\n this.log('Rpc response', message.result, sentMessage);\n }\n\n this.processMessageAck(sentMessageId);\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n if(message.result._ === 'rpc_error') {\n const error = this.processError(message.result);\n this.log('Rpc error', error);\n if(deferred) {\n deferred.reject(error);\n }\n } else {\n if(deferred) {\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n }\n }\n\n delete this.sentMessages[sentMessageId];\n } else {\n if(this.debug) {\n this.log('Rpc result for unknown message:', sentMessageId, message);\n }\n }\n\n break;\n }\n\n case 'pong': { // * https://core.telegram.org/mtproto/service_messages#ping-messages-pingpong - These messages don't require acknowledgments\n /* const sentMessageId = message.msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n if(sentMessage) {\n sentMessage.deferred.resolve(message);\n delete this.sentMessages[sentMessageId];\n } */\n const pingId = message.ping_id;\n if(this.lastPingDelayDisconnectId === pingId) {\n const deferred = this.pingDelayDisconnectDeferred;\n if(deferred) {\n deferred.resolve('pong');\n } else {\n this.log('ping deferred deleted', pingId);\n }\n }\n\n break;\n }\n\n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n\n if(this.networkerFactory.updatesProcessor !== null) {\n this.networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","import bigInt from 'big-integer';\n\nexport default function sortLongsArray(arr: string[]) {\n return arr.map((long) => {\n return bigInt(long);\n }).sort((a, b) => {\n return a.compare(b);\n }).map((bigInt) => {\n return bigInt.toString(10);\n });\n}\n","import addPadding from '../bytes/addPadding';\nimport bigInt from 'big-integer';\nimport {bigIntToBytes} from '../bigInt/bigIntConversion';\n\nexport default function longToBytes(sLong: string) {\n const bigIntBytes = bigIntToBytes(bigInt(sLong)).reverse();\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n // console.log('longToBytes', bytes, bigIntBytes);\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {ConnectionStatusChange} from './connectionStatus';\nimport MTPNetworker from './networker';\nimport {InvokeApiOptions} from '../../types';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {AppManager} from '../appManagers/manager';\n\nexport class NetworkerFactory extends AppManager {\n private networkers: MTPNetworker[] = [];\n public language = navigator.language || App.langPackCode;\n public updatesProcessor: (obj: any) => void = null;\n // public onConnectionStatusChange: (status: ConnectionStatusChange) => void = null;\n public akStopped = false;\n\n public onConnectionStatusChange(status: ConnectionStatusChange) {\n this.rootScope.dispatchEvent('connection_status_change', status);\n // ({type: 'connectionStatusChange', payload: status});\n }\n\n public removeNetworker(networker: MTPNetworker) {\n indexOfAndSplice(this.networkers, networker);\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n }\n\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\n // console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\n const networker = new MTPNetworker(this, this.timeManager, dcId, authKey, authKeyId, serverSalt, options);\n this.networkers.push(networker);\n return networker;\n }\n\n public startAll() {\n if(this.akStopped) {\n const stoppedNetworkers = this.networkers.filter((networker) => networker.isStopped());\n\n this.akStopped = false;\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\n\n for(const networker of stoppedNetworkers) {\n networker.scheduleRequest();\n }\n }\n }\n\n public stopAll() {\n this.akStopped = true;\n }\n\n public setLanguage(langCode: string) {\n this.language = langCode;\n for(const networker of this.networkers) {\n if(!networker.isFileNetworker) {\n networker.connectionInited = false;\n }\n }\n }\n\n public unsetConnectionInited() {\n for(const networker of this.networkers) {\n networker.connectionInited = false;\n }\n }\n\n public forceReconnectTimeout() {\n for(const networker of this.networkers) {\n networker.forceReconnectTimeout();\n }\n }\n\n public forceReconnect() {\n for(const networker of this.networkers) {\n if(!networker.isFileNetworker) {\n networker.forceReconnect();\n break;\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {TLSerialization} from './tl_utils';\nimport cryptoWorker from '../crypto/cryptoMessagePort';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport bigInt from 'big-integer';\n\nexport type RSAPublicKeyHex = {\n modulus: string,\n exponent: string\n};\n\nexport class RSAKeysManager {\n /**\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\n *\n *\n * -----BEGIN RSA PUBLIC KEY-----\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\n * -----END RSA PUBLIC KEY-----\n *\n * -----BEGIN RSA PUBLIC KEY-----\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\n * -----END RSA PUBLIC KEY-----\n *\n * Bytes can be got via\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\n * $ openssl rsa -pubin -in pub.pem -text -noout\n */\n\n /* private publisKeysHex = [{\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\n exponent: '010001'\n }, {\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\n exponent: '010001'\n }, {\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\n exponent: '010001'\n }, {\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\n exponent: '010001'\n }, {\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\n exponent: '010001'\n }]; */\n\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\n exponent: '010001'\n }];\n\n private publisKeysHex: RSAPublicKeyHex[] = [{\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\n exponent: '010001'\n }];\n\n private publicKeysParsed: {\n [hex: string]: RSAPublicKeyHex\n } = {};\n private prepared = false;\n private preparePromise: Promise = null;\n\n constructor() {\n if(Modes.test) {\n this.publisKeysHex = this.testPublicKeysHex;\n }\n }\n\n public prepare(): Promise {\n if(this.preparePromise) return this.preparePromise;\n else if(this.prepared) {\n return Promise.resolve();\n }\n\n return this.preparePromise = Promise.all(this.publisKeysHex.map((keyParsed) => {\n const RSAPublicKey = new TLSerialization();\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\n\n const buffer = RSAPublicKey.getBuffer();\n\n return cryptoWorker.invokeCrypto('sha1', buffer).then((bytes) => {\n const fingerprintBytes = bytes.slice(-8);\n fingerprintBytes.reverse();\n\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\n modulus: keyParsed.modulus,\n exponent: keyParsed.exponent\n };\n });\n })).then(() => {\n this.prepared = true;\n\n // console.log('[MT] Prepared keys');\n this.preparePromise = null;\n });\n }\n\n public async select(fingerprints: Array) {\n await this.prepare();\n\n for(let i = 0; i < fingerprints.length; ++i) {\n let fingerprintHex = bigInt(fingerprints[i]).toString(16).toLowerCase();\n\n if(fingerprintHex.length < 16) {\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\n }\n\n // console.log(fingerprintHex, this.publicKeysParsed);\n const foundKey = this.publicKeysParsed[fingerprintHex];\n if(foundKey) {\n return Object.assign({\n fingerprint: fingerprints[i]\n }, foundKey);\n }\n }\n }\n}\n\nexport default new RSAKeysManager();\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from './transports/controller';\n \n\nimport {TLSerialization, TLDeserialization} from './tl_utils';\nimport {TransportType} from './dcConfigurator';\nimport rsaKeysManager from './rsaKeysManager';\n\nimport CryptoWorker from '../crypto/cryptoMessagePort';\n\nimport {logger, LogTypes} from '../logger';\nimport DEBUG from '../../config/debug';\nimport {Awaited, DcId} from '../../types';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport bytesXor from '../../helpers/bytes/bytesXor';\nimport {bigIntFromBytes} from '../../helpers/bigInt/bigIntConversion';\nimport bigInt from 'big-integer';\nimport randomize from '../../helpers/array/randomize';\nimport {AppManager} from '../appManagers/manager';\n\n/* let fNewNonce: any = bytesFromHex('8761970c24cb2329b5b2459752c502f3057cb7e8dbab200e526e8767fdc73b3c').reverse();\nlet fNonce: any = bytesFromHex('b597720d11faa5914ef485c529cde414').reverse();\nlet fResult: any = new Uint8Array(bytesFromHex('000000000000000001b473a0661b285e480000006324160514e4cd29c585f44e91a5fa110d7297b5c0c4134c84893db5715ecd56af5ed618082182053cc5de91cd00000015c4b51c02000000a5b7f709355fc30b216be86c022bb4c3'));\n\nfNewNonce = false;\nfNonce = false;\nfResult = false; */\n\ntype AuthOptions = {\n dcId: number,\n nonce: Uint8Array,\n\n serverNonce?: Uint8Array,\n pq?: Uint8Array,\n fingerprints?: string[],\n publicKey?: {\n modulus: string,\n exponent: string,\n fingerprint: string\n },\n\n // good\n p?: Uint8Array,\n q?: Uint8Array,\n\n newNonce?: Uint8Array,\n\n retry?: number,\n\n b?: Uint8Array,\n g?: number,\n gA?: Uint8Array,\n dhPrime?: Uint8Array,\n\n tmpAesKey?: Uint8Array,\n tmpAesIv?: Uint8Array,\n\n authKeyId?: Uint8Array,\n authKey?: Uint8Array,\n serverSalt?: Uint8Array,\n\n localTime?: number,\n serverTime?: any,\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer extends AppManager {\n private cached: {\n [dcId: DcId]: Promise\n };\n\n private log: ReturnType;\n\n private transportType: TransportType;\n\n \n private getTransportTypePromise: Promise;\n \n\n protected after() {\n this.cached = {};\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n\n private sendPlainRequest(dcId: DcId, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n\n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(this.timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n\n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = this.dcConfigurator.chooseServer(dcId, 'client', this.transportType);\n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE'\n };\n\n if(DEBUG) {\n this.log('mtpSendPlainRequest: creating requestPromise');\n }\n\n const promise = transport.send(resultArray) as any as Promise;\n return promise.then((result) => {\n if(DEBUG) {\n this.log('mtpSendPlainRequest: in good sector', result);\n }\n\n if(!result || !result.byteLength) {\n throw baseError;\n }\n\n try {\n /* result = fResult ? fResult : result;\n fResult = new Uint8Array(0); */\n\n const deserializer = new TLDeserialization(result, {mtproto: true});\n\n if(result.length === 4) {\n const errorCode = deserializer.fetchInt();\n this.log.error('mtpSendPlainRequest: wrong response, error code:', errorCode);\n throw errorCode;\n }\n\n const auth_key_id = deserializer.fetchLong('auth_key_id');\n if(auth_key_id !== '0') this.log.error('auth_key_id !== 0', auth_key_id);\n\n const msg_id = deserializer.fetchLong('msg_id');\n if(msg_id === '0') this.log.error('msg_id === 0', msg_id);\n\n const msg_len = deserializer.fetchInt('msg_len');\n if(!msg_len) this.log.error('no msg_len', msg_len);\n\n return deserializer;\n } catch(e) {\n this.log.error('mtpSendPlainRequest: deserialization went bad', e);\n const error = Object.assign(baseError, {originalError: e});\n throw error;\n }\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n\n throw error;\n });\n }\n\n private async sendReqPQ(auth: AuthOptions) {\n const request = new TLSerialization({mtproto: true});\n\n request.storeMethod('req_pq_multi', {nonce: auth.nonce});\n\n if(DEBUG) {\n this.log('Send req_pq', bytesToHex(auth.nonce));\n }\n\n let deserializer: Awaited>;\n try {\n const promise = this.sendPlainRequest(auth.dcId, request.getBytes(true));\n rsaKeysManager.prepare();\n deserializer = await promise;\n } catch(error) {\n this.log.error('req_pq error', (error as Error).message);\n throw error;\n }\n\n const response: ResPQ = deserializer.fetchObject('ResPQ');\n\n if(response._ !== 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n this.log.error(auth.nonce, response.nonce);\n throw new Error('[MT] resPQ nonce mismatch');\n }\n\n auth.serverNonce = response.server_nonce; // need\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n\n if(DEBUG) {\n this.log('Got ResPQ', bytesToHex(auth.serverNonce), bytesToHex(auth.pq), auth.fingerprints);\n }\n\n const publicKey = await rsaKeysManager.select(auth.fingerprints);\n if(!publicKey) {\n throw new Error('[MT] No public key found');\n }\n\n auth.publicKey = publicKey;\n\n if(DEBUG) {\n this.log('PQ factorization start', auth.pq);\n }\n\n // let pAndQ: Awaited>;\n try {\n var pAndQ = await CryptoWorker.invokeCrypto('factorize', auth.pq);\n } catch(error) {\n this.log.error('worker error factorize', error);\n throw error;\n }\n\n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n\n if(DEBUG) {\n this.log('PQ factorization done', pAndQ);\n }\n\n return this.sendReqDhParams(auth);\n }\n\n private async sendReqDhParams(auth: AuthOptions): Promise {\n auth.newNonce = randomize(new Uint8Array(32));\n\n const p_q_inner_data_dc: P_Q_inner_data = {\n _: 'p_q_inner_data_dc',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce,\n dc: 0\n };\n\n const pQInnerDataSerialization = new TLSerialization({mtproto: true});\n pQInnerDataSerialization.storeObject(p_q_inner_data_dc, 'P_Q_inner_data', 'DECRYPTED_DATA');\n\n const data = pQInnerDataSerialization.getBytes(true);\n if(data.length > 144) {\n throw 'DH_params: data is more than 144 bytes!';\n }\n\n const dataWithPadding = addPadding(data, 192, false, true, false);\n const dataPadReversed = dataWithPadding.slice().reverse();\n\n const getKeyAesEncrypted = async() => {\n for(;;) {\n const tempKey = randomize(new Uint8Array(32));\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256', tempKey.concat(dataWithPadding)));\n if(dataWithHash.length !== 224) {\n throw 'DH_params: dataWithHash !== 224 bytes!';\n }\n\n const aesEncrypted = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, tempKey, new Uint8Array([0]));\n const tempKeyXor = bytesXor(tempKey, await CryptoWorker.invokeCrypto('sha256', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = bigIntFromBytes(keyAesEncrypted);\n const publicKeyModulusBigInt = bigInt(auth.publicKey.modulus, 16);\n\n if(keyAesEncryptedBigInt.compare(publicKeyModulusBigInt) === -1) {\n return keyAesEncrypted;\n }\n }\n };\n\n const keyAesEncrypted = await getKeyAesEncrypted();\n const encryptedData = addPadding(await CryptoWorker.invokeCrypto('rsa-encrypt', keyAesEncrypted, auth.publicKey), 256, true, true, true);\n\n const req_DH_params: req_DH_params = {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: encryptedData\n };\n\n const request = new TLSerialization({mtproto: true});\n request.storeMethod('req_DH_params', req_DH_params);\n\n const requestBytes = request.getBytes(true);\n\n if(DEBUG) {\n this.log('Send req_DH_params', req_DH_params/* , requestBytes.hex */);\n }\n\n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, requestBytes);\n } catch(error) {\n this.log.error('Send req_DH_params FAIL!', error);\n throw error;\n }\n\n const response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n\n if(DEBUG) {\n this.log('Sent req_DH_params, response:', response);\n }\n\n if(response._ !== 'server_DH_params_fail' && response._ !== 'server_DH_params_ok') {\n throw new Error('[MT] Server_DH_Params response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Server_DH_Params nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Server_DH_Params server_nonce mismatch');\n }\n\n if(response._ === 'server_DH_params_fail') {\n const newNonceHash = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce)).slice(-16);\n if(!bytesCmp(newNonceHash, response.new_nonce_hash)) {\n throw new Error('[MT] server_DH_params_fail new_nonce_hash mismatch');\n }\n\n throw new Error('[MT] server_DH_params_fail');\n }\n\n // fill auth object\n try {\n await this.decryptServerDhDataAnswer(auth, response.encrypted_answer);\n } catch(e) {\n this.log.error('mtpDecryptServerDhDataAnswer FAILED!', e);\n throw e;\n }\n\n // console.log(dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n\n return this.sendSetClientDhParams(auth);\n }\n\n private async decryptServerDhDataAnswer(auth: AuthOptions, encryptedAnswer: any) {\n auth.localTime = Date.now();\n\n // ! can't concat Array with Uint8Array!\n auth.tmpAesKey = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n\n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.newNonce)), auth.newNonce.slice(0, 4));\n\n const answerWithHash = new Uint8Array(await CryptoWorker.invokeCrypto('aes-decrypt', encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv));\n\n const hash = answerWithHash.slice(0, 20);\n const answerWithPadding = answerWithHash.slice(20);\n\n const deserializer = new TLDeserialization(answerWithPadding, {mtproto: true});\n const response = deserializer.fetchObject('Server_DH_inner_data');\n\n if(response._ !== 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n\n if(DEBUG) {\n this.log('Done decrypting answer');\n }\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n\n this.verifyDhParams(auth.g, auth.dhPrime, auth.gA);\n\n const offset = deserializer.getOffset();\n\n if(!bytesCmp(hash, await CryptoWorker.invokeCrypto('sha1', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1 mismatch');\n }\n\n this.timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n\n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n\n const gABigInt = bigIntFromBytes(gA);\n const dhPrimeBigInt = bigInt(dhPrimeHex, 16);\n\n if(gABigInt.compare(bigInt.one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(gABigInt.compare(dhPrimeBigInt.subtract(bigInt.one)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n\n if(DEBUG) {\n this.log('1 < gA < dhPrime-1 OK');\n }\n\n const twoPow = bigInt(2).pow(2048 - 64);\n\n if(gABigInt.compare(twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(gABigInt.compare(dhPrimeBigInt.subtract(twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n\n if(DEBUG) {\n this.log('2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n }\n\n return true;\n }\n\n private async sendSetClientDhParams(auth: AuthOptions): Promise {\n const gBytes = bytesFromHex(auth.g.toString(16));\n\n auth.b = randomize(new Uint8Array(256));\n // MTProto.secureRandom.nextBytes(auth.b);\n\n // let gB: Awaited>;\n try {\n var gB = await CryptoWorker.invokeCrypto('mod-pow', gBytes, auth.b, auth.dhPrime);\n } catch(error) {\n throw error;\n }\n\n const data = new TLSerialization({mtproto: true});\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n\n const dataWithHash = (await CryptoWorker.invokeCrypto('sha1', data.getBuffer())).concat(data.getBytes(true));\n const encryptedData = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n\n const request = new TLSerialization({mtproto: true});\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n\n if(DEBUG) {\n this.log('Send set_client_DH_params');\n }\n\n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, request.getBytes(true));\n } catch(err) {\n throw err;\n }\n\n const response = deserializer.fetchObject('Set_client_DH_params_answer');\n\n if(response._ !== 'dh_gen_ok' && response._ !== 'dh_gen_retry' && response._ !== 'dh_gen_fail') {\n throw new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer server_nonce mismatch');\n }\n\n // let authKey: Uint8Array;\n try {\n var authKey = await CryptoWorker.invokeCrypto('mod-pow', auth.gA, auth.b, auth.dhPrime);\n } catch(err) {\n throw authKey;\n }\n\n const authKeyHash = await CryptoWorker.invokeCrypto('sha1', authKey),\n authKeyAux = authKeyHash.slice(0, 8),\n authKeyId = authKeyHash.slice(-8);\n\n if(DEBUG) {\n this.log('Got Set_client_DH_params_answer', response._, authKey);\n }\n switch(response._) {\n case 'dh_gen_ok': {\n const newNonceHash1 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([1], authKeyAux))).slice(-16);\n\n if(!bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n this.log.error('Set_client_DH_params_answer new_nonce_hash1 mismatch', newNonceHash1, response);\n throw new Error('new_nonce_hash1 mismatch');\n }\n\n const serverSalt = bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n if(DEBUG) {\n this.log('Auth successfull!', authKeyId, authKey, serverSalt);\n }\n\n auth.authKeyId = authKeyId;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n\n return auth;\n }\n\n case 'dh_gen_retry': {\n const newNonceHash2 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([2], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch');\n }\n\n return this.sendSetClientDhParams(auth);\n }\n\n case 'dh_gen_fail': {\n const newNonceHash3 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([3], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch');\n }\n\n throw new Error('[MT] Set_client_DH_params_answer fail');\n }\n }\n }\n\n \n private getTransportType() {\n if(this.getTransportTypePromise) return this.getTransportTypePromise;\n return this.getTransportTypePromise = transportController.pingTransports().then(({websocket}) => {\n this.transportType = websocket ? 'websocket' : 'https';\n this.log('will use transport:', this.transportType);\n });\n }\n \n\n public auth(dcId: DcId) {\n let promise = this.cached[dcId];\n if(promise) {\n return promise;\n }\n\n promise = new Promise(async(resolve, reject) => {\n \n await this.getTransportType();\n \n\n let error: ApiError;\n let _try = 1;\n while(_try++ <= 3) {\n try {\n const auth: AuthOptions = {\n dcId,\n nonce: randomize(new Uint8Array(16))\n };\n\n const promise = this.sendReqPQ(auth);\n resolve(await promise);\n return;\n } catch(err) {\n error = err;\n }\n }\n\n reject(error);\n });\n\n return this.cached[dcId] = promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport sessionStorage from '../sessionStorage';\nimport {nextRandomUint} from '../../helpers/random';\nimport {WorkerTaskVoidTemplate} from '../../types';\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\nimport {AppManager} from '../appManagers/manager';\n\n/*\nlet lol: any = {};\nfor(var i = 0; i < 100; i++) {\n timeManager.generateId();\n}\n*/\n\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\n type: 'applyServerTimeOffset',\n payload: TimeManager['timeOffset']\n};\n\nexport class TimeManager extends AppManager {\n private lastMessageId: [number, number];\n private timeOffset: number;\n\n /* private midnightNoOffset: number;\n private midnightOffseted: Date;\n\n private midnightOffset: number; */\n\n /* private timeParams: {\n midnightOffset: number,\n serverTimeOffset: number\n }; */\n\n protected after() {\n this.lastMessageId = [0, 0];\n this.timeOffset = 0;\n\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n\n\n // * migrated from ServerTimeManager\n /* const timestampNow = tsNow(true);\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\n this.midnightOffseted = new Date();\n this.midnightOffseted.setHours(0, 0, 0, 0);\n\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\n\n /* this.timeParams = {\n midnightOffset: this.midnightOffset,\n serverTimeOffset: this.serverTimeOffset\n }; */\n }\n\n public getServerTimeOffset() {\n return this.timeOffset;\n }\n\n public generateId(): string {\n const timeTicks = Date.now(),\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\n timeMSec = timeTicks % 1000,\n random = nextRandomUint(16);\n\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if(this.lastMessageId[0] > messageId[0] ||\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\n }\n\n this.lastMessageId = messageId;\n\n const ret = ulongFromInts(messageId[0], messageId[1]).toString(10);\n\n // if(lol[ret]) {\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\n // }\n // lol[ret] = true;\n\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\n\n return ret\n }\n\n public applyServerTime(serverTime: number, localTime?: number) {\n localTime = (localTime || Date.now()) / 1000 | 0;\n const newTimeOffset = serverTime - localTime;\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n this.lastMessageId = [0, 0];\n\n if(this.timeOffset !== newTimeOffset) {\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.timeOffset = newTimeOffset;\n }\n\n // console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n return changed;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {DocumentAttribute, WebDocument} from '../../layer';\n\nexport default class AppWebDocsManager {\n public saveWebDocument(webDocument: WebDocument) {\n if(!webDocument) {\n return;\n }\n\n const attribute: DocumentAttribute.documentAttributeImageSize = webDocument.attributes.find((attribute) => attribute._ === 'documentAttributeImageSize') as any;\n if(attribute) {\n webDocument.w = attribute.w;\n webDocument.h = attribute.h;\n }\n\n return webDocument;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputInvoice, InputPaymentCredentials, PaymentRequestedInfo, PaymentsPaymentForm} from '../../layer';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppPaymentsManager extends AppManager {\n public getInputInvoiceBySlug(slug: string): InputInvoice.inputInvoiceSlug {\n return {\n _: 'inputInvoiceSlug',\n slug\n };\n }\n\n public getInputInvoiceByPeerId(peerId: PeerId, mid: number): InputInvoice.inputInvoiceMessage {\n return {\n _: 'inputInvoiceMessage',\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n };\n }\n\n public getPaymentForm(invoice: InputInvoice) {\n return this.apiManager.invokeApi('payments.getPaymentForm', {\n invoice\n }).then((paymentForm) => {\n this.appUsersManager.saveApiUsers(paymentForm.users);\n\n return paymentForm;\n });\n }\n\n public getPaymentReceipt(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApi('payments.getPaymentReceipt', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((paymentForm) => {\n this.appUsersManager.saveApiUsers(paymentForm.users);\n\n return paymentForm;\n });\n }\n\n public validateRequestedInfo(invoice: InputInvoice, info: PaymentRequestedInfo, save?: boolean) {\n return this.apiManager.invokeApi('payments.validateRequestedInfo', {\n save,\n invoice,\n info\n });\n }\n\n public sendPaymentForm(\n invoice: InputInvoice,\n formId: PaymentsPaymentForm['form_id'],\n requestedInfoId: string,\n shippingOptionId: string,\n credentials: InputPaymentCredentials,\n tipAmount?: number\n ) {\n return this.apiManager.invokeApi('payments.sendPaymentForm', {\n form_id: formId,\n invoice,\n requested_info_id: requestedInfoId,\n shipping_option_id: shippingOptionId,\n credentials,\n tip_amount: tipAmount || undefined\n }).then((result) => {\n if(result._ === 'payments.paymentResult') {\n this.apiUpdatesManager.processUpdateMessage(result.updates);\n }\n\n return result;\n });\n }\n\n public clearSavedInfo(info?: boolean, credentials?: boolean) {\n return this.apiManager.invokeApi('payments.clearSavedInfo', {\n info,\n credentials\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MessageSendingParams} from './appMessagesManager';\nimport {AppManager} from './manager';\nimport {AttachMenuBots, AttachMenuBot, Update, DataJSON} from '../../layer';\nimport assumeType from '../../helpers/assumeType';\nimport makeError from '../../helpers/makeError';\nimport getAttachMenuBotIcon from './utils/attachMenuBots/getAttachMenuBotIcon';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppAttachMenuBotsManager extends AppManager {\n private attachMenuBots: Map;\n private attachMenuBotsArr: AttachMenuBot[];\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateAttachMenuBots: this.onUpdateAttachMenuBots\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n this.attachMenuBots.clear();\n this.attachMenuBotsArr = undefined;\n } else {\n this.attachMenuBots = new Map();\n }\n };\n\n private onUpdateAttachMenuBots = (update: Update.updateAttachMenuBots) => {\n this.clear();\n this.getAttachMenuBots();\n };\n\n public saveAttachMenuBot(attachMenuBot: AttachMenuBot) {\n this.attachMenuBots.set(attachMenuBot.bot_id, attachMenuBot);\n const icon = getAttachMenuBotIcon(attachMenuBot);\n icon.icon = this.appDocsManager.saveDoc(icon.icon, {type: 'attachMenuBotIcon', botId: attachMenuBot.bot_id});\n return attachMenuBot;\n }\n\n public saveAttachMenuBots(attachMenuBots: AttachMenuBot[]) {\n if((attachMenuBots as any).saved) return;\n (attachMenuBots as any).saved = true;\n attachMenuBots.forEach((user) => this.saveAttachMenuBot(user));\n }\n\n public getAttachMenuBots() {\n return this.attachMenuBotsArr ?? this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAttachMenuBots',\n processResult: (attachMenuBots) => {\n assumeType(attachMenuBots);\n this.appUsersManager.saveApiUsers(attachMenuBots.users);\n this.saveAttachMenuBots(attachMenuBots.bots);\n // ! temporary\n return this.attachMenuBotsArr = attachMenuBots.bots.slice(0, 0);\n }\n });\n }\n\n public getAttachMenuBotCached(botId: BotId) {\n return this.attachMenuBots.get(botId);\n }\n\n public getAttachMenuBot(botId: BotId, overwrite?: boolean) {\n if(!this.appUsersManager.isAttachMenuBot(botId) || true) {\n throw makeError('BOT_INVALID');\n }\n\n return (!overwrite && this.getAttachMenuBotCached(botId)) ?? this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAttachMenuBot',\n params: {\n bot: this.appUsersManager.getUserInput(botId)\n },\n processResult: (attachMenuBotsBot) => {\n this.appUsersManager.saveApiUsers(attachMenuBotsBot.users);\n const attachMenuBot = this.saveAttachMenuBot(attachMenuBotsBot.bot);\n return attachMenuBot;\n }\n });\n }\n\n public requestWebView(options: MessageSendingParams & {\n botId: BotId,\n peerId: PeerId,\n // platform: string,\n startParam?: string,\n fromBotMenu?: boolean,\n url?: string,\n themeParams?: DataJSON\n }) {\n const {\n botId,\n peerId,\n url,\n fromBotMenu,\n themeParams,\n // platform,\n replyToMsgId,\n silent,\n sendAsPeerId,\n startParam,\n threadId\n } = options;\n\n const platform = 'web';\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.requestWebView',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n bot: this.appUsersManager.getUserInput(botId),\n silent,\n platform,\n url,\n reply_to_msg_id: replyToMsgId ? getServerMessageId(replyToMsgId) : undefined,\n from_bot_menu: fromBotMenu,\n theme_params: themeParams,\n send_as: sendAsPeerId ? this.appPeersManager.getInputPeerById(sendAsPeerId) : undefined,\n start_param: startParam,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n },\n processResult: (result) => {\n console.log(result);\n return result;\n }\n });\n }\n\n public prolongWebView(options: MessageSendingParams & {\n peerId: PeerId,\n botId: BotId,\n queryId: string | number\n }) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.prolongWebView',\n params: {\n peer: this.appPeersManager.getInputPeerById(options.peerId),\n bot: this.appUsersManager.getUserInput(options.botId),\n query_id: options.queryId,\n silent: options.silent,\n reply_to_msg_id: options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined,\n top_msg_id: options.threadId ? getServerMessageId(options.threadId) : undefined\n },\n processResult: (result) => {\n console.log(result);\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {UrlAuthResult} from '../../layer';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppSeamlessLoginManager extends AppManager {\n public requestUrlAuth(url: string, peerId?: PeerId, mid?: number, buttonId?: number) {\n return this.apiManager.invokeApi('messages.requestUrlAuth', {\n button_id: buttonId,\n msg_id: mid ? getServerMessageId(mid) : undefined,\n peer: peerId ? this.appPeersManager.getInputPeerById(peerId) : undefined,\n url\n }).then((urlAuthResult) => {\n if(urlAuthResult._ === 'urlAuthResultRequest') {\n this.appUsersManager.saveApiUser(urlAuthResult.bot);\n }\n\n return urlAuthResult;\n });\n }\n\n public acceptUrlAuth(url: string, peerId?: PeerId, mid?: number, buttonId?: number, writeAllowed?: boolean) {\n return this.apiManager.invokeApi('messages.acceptUrlAuth', {\n button_id: buttonId,\n msg_id: mid ? getServerMessageId(mid) : undefined,\n peer: peerId ? this.appPeersManager.getInputPeerById(peerId) : undefined,\n url,\n write_allowed: writeAllowed\n }).then((urlAuthResult) => {\n return urlAuthResult as Exclude;\n });\n }\n\n public getWebAuthorizations() {\n return this.apiManager.invokeApi('account.getWebAuthorizations').then((webAuthorizations) => {\n this.appUsersManager.saveApiUsers(webAuthorizations.users);\n return webAuthorizations.authorizations;\n });\n }\n\n public resetWebAuthorization(hash: Long) {\n return this.apiManager.invokeApi('account.resetWebAuthorization', {\n hash\n });\n }\n\n public resetWebAuthorizations() {\n return this.apiManager.invokeApi('account.resetWebAuthorizations');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport callbackify from '../../helpers/callbackify';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport appStateManager from './appStateManager';\nimport {AppStoragesManager} from './appStoragesManager';\nimport createManagers from './createManagers';\n\ntype Managers = Awaited>;\n\nexport class AppManagersManager {\n private managers: Managers | Promise;\n private cryptoWorkersURLs: string[];\n private cryptoPortsAttached: number;\n private cryptoPortPromise: CancellablePromise;\n\n constructor() {\n this.cryptoWorkersURLs = [];\n this.cryptoPortsAttached = 0;\n this.cryptoPortPromise = deferredPromise();\n this.cryptoPortPromise.then(() => {\n this.cryptoPortPromise = undefined;\n });\n }\n\n public start() {\n const port = MTProtoMessagePort.getInstance();\n\n port.addEventListener('manager', ({name, method, args}) => {\n return callbackify(this.getManagers(), (managers) => {\n // @ts-ignore\n const manager = managers[name];\n return manager[method].apply(manager, args);\n });\n });\n\n port.addEventListener('cryptoPort', (payload, source, event) => {\n const port = event.ports[0];\n if(this.cryptoPortsAttached >= this.cryptoWorkersURLs.length) {\n port.close();\n return;\n }\n\n ++this.cryptoPortsAttached;\n cryptoMessagePort.attachPort(port);\n this.cryptoPortPromise?.resolve();\n });\n\n port.addEventListener('createProxyWorkerURLs', ({originalUrl, blob}) => {\n let length = this.cryptoWorkersURLs.length;\n if(!length) {\n this.cryptoWorkersURLs.push(originalUrl);\n ++length;\n }\n\n const maxLength = App.cryptoWorkers;\n if(length === maxLength) {\n return this.cryptoWorkersURLs;\n }\n\n const newURLs = new Array(maxLength - length).fill(undefined).map(() => URL.createObjectURL(blob));\n this.cryptoWorkersURLs.push(...newURLs);\n return this.cryptoWorkersURLs;\n });\n }\n\n public async createManagers() {\n const appStoragesManager = new AppStoragesManager();\n\n await Promise.all([\n // new Promise(() => {}),\n appStoragesManager.loadStorages(),\n this.cryptoPortPromise\n ]);\n\n const managers = await createManagers(appStoragesManager, appStateManager.userId);\n return this.managers = managers;\n }\n\n public getManagers() {\n return this.managers ??= this.createManagers();\n }\n}\n\nconst appManagersManager = new AppManagersManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appManagersManager = appManagersManager);\nexport default appManagersManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PasswordManager} from '../mtproto/passwordManager';\nimport {ReferenceDatabase} from '../mtproto/referenceDatabase';\nimport DialogsStorage from '../storages/dialogs';\nimport FiltersStorage from '../storages/filters';\nimport {ApiUpdatesManager} from './apiUpdatesManager';\nimport {AppAvatarsManager} from './appAvatarsManager';\nimport {AppCallsManager} from './appCallsManager';\nimport {AppChatsManager} from './appChatsManager';\nimport {AppDocsManager} from './appDocsManager';\nimport {AppDraftsManager} from './appDraftsManager';\nimport {AppEmojiManager} from './appEmojiManager';\nimport {AppGroupCallsManager} from './appGroupCallsManager';\nimport {AppInlineBotsManager} from './appInlineBotsManager';\nimport {AppMessagesIdsManager} from './appMessagesIdsManager';\nimport {AppMessagesManager} from './appMessagesManager';\nimport {AppNotificationsManager} from './appNotificationsManager';\nimport {AppPeersManager} from './appPeersManager';\nimport {AppPhotosManager} from './appPhotosManager';\nimport {AppPollsManager} from './appPollsManager';\nimport {AppPrivacyManager} from './appPrivacyManager';\nimport {AppProfileManager} from './appProfileManager';\nimport {AppReactionsManager} from './appReactionsManager';\nimport {AppStickersManager} from './appStickersManager';\nimport {AppUsersManager} from './appUsersManager';\nimport {AppWebPagesManager} from './appWebPagesManager';\nimport {ApiFileManager} from '../mtproto/apiFileManager';\nimport {ApiManager} from '../mtproto/apiManager';\nimport ctx from '../../environment/ctx';\nimport PeersStorage from '../storages/peers';\nimport ThumbsStorage from '../storages/thumbs';\nimport {NetworkerFactory} from '../mtproto/networkerFactory';\nimport {RootScope} from '../rootScope';\nimport {Authorizer} from '../mtproto/authorizer';\nimport {DcConfigurator} from '../mtproto/dcConfigurator';\nimport {TimeManager} from '../mtproto/timeManager';\nimport {AppStoragesManager} from './appStoragesManager';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport appStateManager from './appStateManager';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport AppWebDocsManager from './appWebDocsManager';\nimport AppPaymentsManager from './appPaymentsManager';\nimport AppAttachMenuBotsManager from './appAttachMenuBotsManager';\nimport AppSeamlessLoginManager from './appSeamlessLoginManager';\n\nexport default function createManagers(appStoragesManager: AppStoragesManager, userId: UserId) {\n const managers = {\n appPeersManager: new AppPeersManager,\n appChatsManager: new AppChatsManager,\n appDocsManager: new AppDocsManager,\n appPhotosManager: new AppPhotosManager,\n appPollsManager: new AppPollsManager,\n appUsersManager: new AppUsersManager,\n appWebPagesManager: new AppWebPagesManager,\n appDraftsManager: new AppDraftsManager,\n appProfileManager: new AppProfileManager,\n appNotificationsManager: new AppNotificationsManager,\n apiUpdatesManager: new ApiUpdatesManager,\n appAvatarsManager: new AppAvatarsManager,\n appGroupCallsManager: new AppGroupCallsManager,\n appCallsManager: new AppCallsManager,\n appReactionsManager: new AppReactionsManager,\n appMessagesManager: new AppMessagesManager,\n appMessagesIdsManager: new AppMessagesIdsManager,\n appPrivacyManager: new AppPrivacyManager,\n appInlineBotsManager: new AppInlineBotsManager,\n appStickersManager: new AppStickersManager,\n referenceDatabase: new ReferenceDatabase,\n appEmojiManager: new AppEmojiManager,\n filtersStorage: new FiltersStorage,\n dialogsStorage: new DialogsStorage,\n apiManager: new ApiManager,\n cryptoWorker: cryptoMessagePort,\n passwordManager: new PasswordManager,\n apiFileManager: new ApiFileManager,\n peersStorage: new PeersStorage,\n thumbsStorage: new ThumbsStorage,\n networkerFactory: new NetworkerFactory,\n rootScope: new RootScope,\n authorizer: new Authorizer,\n dcConfigurator: new DcConfigurator,\n timeManager: new TimeManager,\n appStoragesManager: appStoragesManager,\n appStateManager: appStateManager,\n appWebDocsManager: new AppWebDocsManager,\n appPaymentsManager: new AppPaymentsManager,\n appAttachMenuBotsManager: new AppAttachMenuBotsManager,\n appSeamlessLoginManager: new AppSeamlessLoginManager\n };\n\n type T = typeof managers;\n\n for(const name in managers) {\n const manager = managers[name as keyof T];\n if(!manager) {\n continue;\n }\n\n if((manager as AppMessagesManager).setManagers) {\n (manager as AppMessagesManager).setManagers(managers as any);\n delete (manager as AppMessagesManager).setManagers;\n }\n\n // @ts-ignore\n ctx[name] = manager;\n }\n\n const promises: Array void) | void> | void>[] = [];\n let names = Object.keys(managers) as (keyof T)[];\n names.unshift('appUsersManager', 'appChatsManager', 'appNotificationsManager', 'appMessagesManager', 'dialogsStorage');\n names = filterUnique(names);\n for(const name of names) {\n const manager = managers[name];\n if((manager as any)?.after) {\n // console.log('injecting after', name);\n const result = (manager as any).after();\n promises.push(result);\n\n // if(result instanceof Promise) {\n // result.then(() => {\n // console.log('injected after', name);\n // });\n // }\n }\n }\n\n if(userId) {\n managers.apiManager.setUserAuth(userId);\n }\n\n return Promise.all(promises).then(() => managers);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// just to include\nimport '../polyfill';\nimport '../../helpers/peerIdPolyfill';\n\nimport cryptoWorker from '../crypto/cryptoMessagePort';\nimport {setEnvironment} from '../../environment/utils';\nimport appStateManager from '../appManagers/appStateManager';\nimport transportController from './transports/controller';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport RESET_STORAGES_PROMISE from '../appManagers/utils/storages/resetStoragesPromise';\nimport appManagersManager from '../appManagers/appManagersManager';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport {logger} from '../logger';\nimport {State} from '../../config/state';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport appTabsManager from '../appManagers/appTabsManager';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport callbackify from '../../helpers/callbackify';\n\nlet _isServiceWorkerOnline = true;\nexport function isServiceWorkerOnline() {\n return _isServiceWorkerOnline;\n}\n\nlet serviceMessagePort: ServiceMessagePort, _serviceMessagePort: MessagePort;\nexport function getServiceMessagePort() {\n return _isServiceWorkerOnline ? serviceMessagePort : undefined;\n}\n\nconst log = logger('MTPROTO');\n// let haveState = false;\n\nconst port = new MTProtoMessagePort();\nport.addMultipleEventsListeners({\n environment: (environment) => {\n setEnvironment(environment);\n\n transportController.waitForWebSocket();\n },\n\n crypto: ({method, args}) => {\n return cryptoWorker.invokeCrypto(method as any, ...args as any);\n },\n\n state: ({state, resetStorages, pushedKeys, newVersion, oldVersion, userId}) => {\n // if(haveState) {\n // return;\n // }\n\n log('got state', state, pushedKeys);\n\n appStateManager.userId = userId;\n appStateManager.newVersion = newVersion;\n appStateManager.oldVersion = oldVersion;\n\n (Object.keys(state) as any as (keyof State)[]).forEach((key) => {\n appStateManager.pushToState(key, state[key], true, !pushedKeys.includes(key));\n });\n\n RESET_STORAGES_PROMISE.resolve(resetStorages);\n // haveState = true;\n },\n\n toggleStorages: ({enabled, clearWrite}) => {\n return toggleStorages(enabled, clearWrite);\n },\n\n event: (payload, source) => {\n log('will redirect event', payload, source);\n port.invokeExceptSource('event', payload, source);\n },\n\n serviceWorkerOnline: (online) => {\n _isServiceWorkerOnline = online;\n },\n\n serviceWorkerPort: (payload, source, event) => {\n if(serviceMessagePort) {\n serviceMessagePort.detachPort(_serviceMessagePort);\n _serviceMessagePort = undefined;\n } else {\n serviceMessagePort = new ServiceMessagePort();\n serviceMessagePort.addMultipleEventsListeners({\n requestFilePart: (payload) => {\n return callbackify(appManagersManager.getManagers(), (managers) => {\n const {docId, dcId, offset, limit} = payload;\n return managers.appDocsManager.requestDocPart(docId, dcId, offset, limit);\n });\n }\n });\n }\n\n // * port can be undefined in the future\n if(_serviceMessagePort = event.ports[0]) {\n serviceMessagePort.attachPort(_serviceMessagePort);\n }\n },\n\n createObjectURL: (blob) => {\n return URL.createObjectURL(blob);\n }\n\n // socketProxy: (task) => {\n // const socketTask = task.payload;\n // const id = socketTask.id;\n\n // const socketProxied = socketsProxied.get(id);\n // if(socketTask.type === 'message') {\n // socketProxied.dispatchEvent('message', socketTask.payload);\n // } else if(socketTask.type === 'open') {\n // socketProxied.dispatchEvent('open');\n // } else if(socketTask.type === 'close') {\n // socketProxied.dispatchEvent('close');\n // socketsProxied.delete(id);\n // }\n // },\n});\n\nlog('MTProto start');\n\nappManagersManager.start();\nappManagersManager.getManagers();\nappTabsManager.start();\n\n// let sentHello = false;\nlistenMessagePort(port, (source) => {\n appTabsManager.addTab(source);\n\n // port.invokeVoid('hello', undefined, source);\n // if(!sentHello) {\n // port.invokeVoid('hello', undefined, source);\n // sentHello = true;\n // }\n}, (source) => {\n appTabsManager.deleteTab(source);\n});\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter} from '../storages/filters';\n\n/**\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\n */\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\nexport type REAL_FOLDER_ID = 0 | 1;\n\nexport const NULL_PEER_ID: PeerId = 0;\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\nexport const SERVICE_PEER_ID: PeerId = 777000;\nexport const MUTE_UNTIL = 0x7FFFFFFF;\nexport const BOT_START_PARAM = '';\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\nexport const THUMB_TYPE_FULL = '';\nexport const TOPIC_COLORS = [0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, 0xFB6F5F];\nexport const ATTACH_MENU_BOT_ICON_NAME = 'default_static';\nexport const GENERAL_TOPIC_ID = 4295032831;\nexport const T_ME_PREFIXES = new Set(['web', 'k', 'z']);\n\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n// const markdownTestRegExp = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\n 'Telegram': 'tg://search_hashtag?hashtag={1}',\n 'Twitter': 'https://twitter.com/hashtag/{1}',\n 'Instagram': 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\n/* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n} */\n\n\n/* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n} */\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\n\nexport function encodeEmoji(emojiText: string) {\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\n return codepoints;\n}\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\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\n\nexport function toCodePoints(unicodeSurrogates: string): Array {\n const points = [];\n let char = 0;\n let previous = 0;\n let i = 0;\n while(i < unicodeSurrogates.length) {\n char = unicodeSurrogates.charCodeAt(i++);\n if(previous) {\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\n previous = 0;\n } else if(char > 0xd800 && char <= 0xdbff) {\n previous = char;\n } else {\n points.push(char.toString(16));\n }\n }\n\n if(points.length && points[0].length === 2) {\n points[0] = '00' + points[0];\n }\n\n return points;\n}\n\nexport function getEmojiToneIndex(input: string) {\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\n}\n\nconst VIRTUAL_COUNTRIES_EMOJIS: Map = new Map([\n ['FT', '🏴‍☠']\n]);\n\nexport function getCountryEmoji(iso2: string) {\n return VIRTUAL_COUNTRIES_EMOJIS.get(iso2) ??\n String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\n}\n\nexport function emojiFromCodePoints(codePoints: string) {\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,539,85,946], () => (__webpack_require__(1082)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 85) return \"85.952a9f12a6b3dcdd3f0e.bundle.js\";\n\tif (chunkId === 946) return \"946.0a86ee06cd8834179a6a.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + ({\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] || chunkId) + \".\" + {\"8\":\"570e6da51a125009c156\",\"104\":\"f1e35ff90b4ddd68a9d8\",\"211\":\"780c206f3e1257ccad6a\",\"301\":\"42dc636f96a62f6a08c8\",\"539\":\"17a0b07b4e6476f19654\",\"642\":\"fd1ade69544ad78671c6\",\"699\":\"85f88e27b023cbb2ca51\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t678: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","EmojiVersions","Emoji","version","Object","assign","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","undefined","badCharsRe","trimRe","C2L","cleanSearchText","text","latinize","processSearchText","clearBadChars","ignoreCase","options","hasTag","includeTag","charAt","originalText","replace","clearBadCharsAndTrim","ch","latinizeCh","latinizeString","fixCyrillic","FILENAME_JOINER","getFileNameByLocation","location","ext","length","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","downloadId","getFileURL","type","encodeURIComponent","JSON","stringify","platforms","Set","ignore","getRestrictionReason","reasons","find","reason","has","isRestricted","ignoreRestrictionReasons","clear","forEach","add","getPeerId","peerId","isPeerId","userId","user_id","toPeerId","chatId","channel_id","chat_id","isUser","peerParams","substr","split","IDB","constructor","db","this","name","storageIsAvailable","log","openDatabase","INSTANCES","push","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","Array","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","request","indexedDB","open","Promise","reject","message","finished","setTimeout","onerror","resolve","onsuccess","event","result","calledNew","onclose","e","onabort","transaction","target","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","instance","preserve","storage","IDBStorage","storeName","idb","create","delete","entryName","isArray","concat","getObjectStore","map","save","value","idx","put","get","mode","callback","perf","performance","now","then","onError","clearTimeout","timeout","onComplete","results","requests","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","i","getAll","environment","getEnvironment","setEnvironment","env","RootScope","super","myId","connectionStatus","premium","addEventListener","isNew","isPremium","dispatchEventSingle","status","dispatchEvent","args","invokeVoid","settings","getConnectionStatus","getPremium","state","stateStorage","getState","setByKey","key","object","splitted","getDeepProperty","slice","pop","setDeepProperty","first","pushToState","direct","onlyLocal","setKeyValueToStorage","set","HTTP","dcId","logSuffix","pending","debug","logTypes","Log","logger","connected","_send","body","fetch","method","response","arrayBuffer","buffer","TextDecoder","decode","Uint8Array","setConnected","err","destroyed","destroy","send","networker","promise","releasePending","releasing","splice","pause","Socket","handleOpen","handleError","handleClose","removeListeners","handleMessage","data","byteLength","ws","connect","removeEventListener","WebSocket","binaryType","randomize","arr","crypto","Error","getRandomValues","Obfuscation","_process","operation","cryptoMessagePort","transfer","init","codec","idPromise","release","initPayload","val","val2","reversedPayload","reverse","encKey","encIv","decKey","decIv","process","obfuscateTag","encrypted","encode","payload","tag","encodePacket","len","header","readPacket","bytesToHex","bytes","toString","TcpObfuscated","Connection","retryTimeout","abridged","obfuscation","autoReconnect","onOpen","connection","setConnectionStatus","cleanupSent","resend","onMessage","parseResponse","processMessage","messageId","sessionId","catch","shift","onClose","needTimeout","retryAt","time","Date","diff","lastCloseTime","isNaN","reconnectTimeout","ctx","reconnect","bodySent","forceReconnect","setAutoReconnect","once","enable","changeUrl","encodeBody","toEncode","encoded","releasingPending","sent","TEST_SUFFIX","getTelegramConnectionSuffix","connectionType","constructTelegramWebSocketUrl","suffix","path","DcConfigurator","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","chosenServer","oooohLetMeLive","transportHTTP","dcOption","chooseServer","transportType","reuse","hasOwnProperty","client","download","upload","servers","transports","transport","obj","indexOfAndSplice","MTTransportController","opened","Map","waitForWebSocket","pingTransports","dcConfigurator","https","websocket","httpPromise","websocketPromise","socket","isFulfilled","isRejected","isHttpAvailable","isWebSocketAvailable","all","pinging","setTransportValue","setTransportOpened","setTransportClosed","AppManager","setManagers","managers","loadStorages","storages","recordPromise","storagesKeys","keys","storagesPromises","storagesResults","resetStorages","size","loadStoragesInner","AppStoragesManager","names","createStorages","loadStorage","PasswordManager","apiManager","invokeApi","updateSettings","currentHashPromise","newHashPromise","params","password","new_settings","hint","email","currentPassword","cryptoWorker","invokeCrypto","newAlgo","new_algo","salt1","newPassword","hashes","new_password_hash","getInputCheckPassword","check","inputCheckPassword","auth","setUser","user","confirmPasswordEmail","code","resendPasswordEmail","cancelPasswordEmail","ReferenceDatabase","contexts","links","saveContext","reference","context","getContexts","_context","deepEqual","getReferenceByLink","getContext","values","deleteContext","refreshReference","c","appMessagesManager","reloadMessages","refreshEmojiesSoundsPromise","appStickersManager","getAnimatedEmojiSounds","appProfileManager","getProfile","appEmojiManager","getCustomEmojiDocuments","docId","appAttachMenuBotsManager","getAttachMenuBot","botId","hex","newHex","newContext","makeError","safeReplaceObject","wasObject","newObject","getPeerIdsFromMessage","peerIds","fromId","viaBotId","fwdFromId","media","contactUserId","recentVoters","recent_voters","recentReactions","recent_reactions","reaction","peer_id","action","userIds","users","inviter_id","chatIds","recentRepliers","recent_repliers","reply","setDialogIndex","dialog","indexKey","GLOBAL_FOLDER_ID","DialogsStorage","allDialogsLoaded","pinnedOrders","folderId","saveAllDialogsLoaded","resetPinnedOrder","savePinnedOrders","forumTopics","folders","dialogsOffsetDate","dialogsNum","dialogsIndex","cachedResults","query","count","dialogs","onUpdateFolderPeers","update","folder_peers","folderPeer","folder_id","peer","appPeersManager","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","getDialogOnly","handleDialogTogglePinned","onUpdateChannelPinnedTopic","topicId","generateMessageId","topic_id","topic","getForumTopic","getFilterIdForForum","onUpdatePinnedDialogs","order","handleDialogsPinned","dialogsResult","applyDialogs","d","onUpdateChannelPinnedTopics","filterId","limit","getLimit","channel","appChatsManager","getChannelInput","toChatId","offset_date","offset_id","offset_topic","processTopics","topics","after","rootScope","appUsersManager","getSelf","peerText","getPeerSearchText","indexObject","onFilterUpdate","getCachedDialogs","processDialogForFilter","processDialogForFilters","getDialogIndexKeyByFilterId","processChangedUnreadOrUnmuted","chat","getChat","dropDialogOnDeletion","enabled","flushForumTopicsCache","apiUpdatesManager","addMultipleEventsListeners","updateFolderPeers","updateDialogPinned","updateChannelPinnedTopic","updatePinnedDialogs","updateChannelPinnedTopics","appStateManager","appStoragesManager","getCache","_order","getPinnedOrders","setDialogsFromState","bind","appDraftsManager","addMissedDialogs","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","ignoreOffsetDate","getMessageByPeer","reloadConversation","isDialogsLoaded","setDialogsLoaded","loaded","isForum","isFilterIdForForum","defineNotNumerableProperties","every","orders","isDialogPinned","filtersStorage","getFilter","isPinned","pinnedPeerIds","getOffsetDate","offsetDate","Math","min","sort","a","b","generateFolder","folder","unreadMessagesCount","unreadPeerIds","unreadUnmutedPeerIds","getFolder","forumTopic","getDialogKey","isTopic","getFolderDialogs","skipMigrated","hidden","migratedTo","getNextDialog","currentPeerId","findIndex","getDialogIndexKey","localId","isDialogUnmuted","appNotificationsManager","isPeerLocalMuted","respectType","threadId","getFolderUnreadCount","unreadUnmutedCount","unreadCount","arrays","setDialogIndexInFilter","isRealFolder","testDialogForFilter","pinnedIds","pinnedKey","pinnedIndex","generateDialogIndex","generateDialogPinnedDateByIndex","getDialogIndex","getDialog","verify","skipped","getDialogOrTopic","isObject","date","tsNow","timeManager","getServerTimeOffset","noIndex","filters","getFilters","cmp","wasIndex","wasDialog","wasDialogIndex","newDialogIndex","prepareFolderUnreadCountModifyingByDialog","insertInDescendSortedArray","prepareDialogUnreadCountModifying","toggle","callbacks","wasUnreadCount","getDialogUnreadCount","wasUnmuted","newUnreadCount","newUnmuted","addMessagesCount","modifyFolderUnreadCount","toggleDialog","toggleUnmuted","forumUnreadCount","getForumUnreadCount","hasUnmuted","some","max","dispatchUnreadTimeout","_folder","justReturn","noPinnedOrderUpdate","topDate","generateDialogPinnedDate","channelId","isChannel","draft","dialogKey","unshift","setDialogToState","pts","historyStorage","getHistoryStorage","messagesStorage","getHistoryMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","peersStorage","requestPeersForKey","isAnyChat","newPts","getChannelState","requestPeer","saveGlobalOffset","getForumTopicsCache","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","dropDialogFromFolders","foundDialog","wasPinned","keepLocal","clearDialogFromState","releasePeer","dropDialogWithEvent","dropped","items","forEachReverse","assumeType","saveApiUsers","saveApiChats","chats","messages","updatedDialogs","topMid","topPendingMid","pendingTopMsgs","topPendingMessage","maxId","cache","getUpdateCache","getUpdateAfterReloadKey","updates","newUpdatesAfterReloadToHandle","saveUpdate","canSaveDialogByPeerId","isDialog","wasDialogBefore","wasTopMessage","generateTempMessageId","from_id","getOutputPeer","deleted","out","isOutgoing","migrated_to","deactivated","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","saveDraft","isOut","unread","unread_count","isEnd","insertSlice","setEnd","mergeReplyKeyboard","readMaxId","readOutboxMaxId","savePeerSettings","notify_settings","addChannelState","releaseUnreadCount","dialogsStorage","processTopicUpdate","oldTopic","isIconChanged","icon_emoji_id","isTitleChanged","title","isChanged","getDialogs","offsetIndex","promises","fillContactsResult","fillContacts","cached","reloadMissingDialogsPromise","reloadMissingPeerIds","realFolderId","curDialogStorage","d1","d2","offset","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","deletedTopics","getTopicPromises","getForumTopicById","getTopicsPromise","ids","fullfillLeft","messagesForumTopics","getForumTopicOrReload","callbackify","processTopicsPromise","f","reduce","acc","v","newPinned","convertment","PREPENDED_FILTERS","LOCAL_FILTER","flags","exclude_peers","include_peers","pinned_peers","excludePeerIds","includePeerIds","FiltersStorage","filtersArr","reloadedPeerIds","localFilters","generateLocalFilter","clearFilters","onUpdateDialogFilter","saveDialogFilter","findAndSplice","onUpdateDialogFilters","oldFilters","copy","getDialogFilters","_filterId","onUpdateDialogFilterOrder","includes","setLocalId","updateDialogFilter","updateDialogFilters","updateDialogFilterOrder","prependFilters","allChatsFilter","archiveFilter","allChatsFilterIndex","exclude_archived","exclude_unarchived","exclude_read","isDialogUnread","exclude_muted","unread_mentions_count","broadcasts","isBroadcast","groups","isAnyGroup","toUserId","isBot","bots","non_contacts","isContact","contacts","testDialogForFilterId","toggleDialogPin","getConfig","pinned_infolder_count_max","getInputPeerById","createDialogFilter","prepend","remove","getOutputDialogFilter","bool","updateDialogFiltersOrder","filterIncludedPinnedPeers","peers","reloadDialogs","inputPeer","isAlreadyReloaded","reloadPromises","missingPeerIds","overwrite","invokeApiSingle","getSuggestedDialogsFilters","silent","to","oldFilter","_filter","isFilterIdAvailable","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","getOwnPropertyDescriptor","defineProperty","ApiUpdatesManager","updatesState","pendingPtsUpdates","pendingSeqUpdates","syncPending","syncLoading","channelStates","attached","subscriptions","processUpdateMessage","updateMessage","processOpts","seq","seqStart","seq_start","forceGetDifference","processUpdate","toId","fwd_from","reply_to","entities","pts_count","override","_constructor","setProxy","Proxy","saveUpdatesState","us","popPendingSeqUpdate","nextSeq","pendingUpdatesData","seqAwaiting","ptsAwaiting","clearStatePendingSync","popPendingPtsUpdate","curState","curPts","goodPts","goodIndex","getDifference","processLocalUpdate","wasSyncing","pts_total_limit","qts","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","onDifferenceTooLong","justAName","getChannelDifference","channelState","bindPrefix","lastDifferenceTime","final","lastPtsUpdateTime","fwdHeader","hasUser","post","hasChat","popPts","popSeq","subscribeToChannelUpdates","subscription","cb","interval","unsubscribeFromChannelUpdates","force","clearInterval","attach","langCode","noErrorBox","stateResult","setUpdatesProcessor","strs","en","ru","getChangelog","lang","res","ok","langStr","parseMarkdown","inbox_date","languages","filterUnique","language","AppAvatarsManager","savedAvatarURLs","removeFromAvatarsCache","isAvatarCached","saved","loadAvatar","photo","peerPhotoFileLocation","downloadOptions","dc_id","limitPart","apiFileManager","blob","URL","createObjectURL","AppCallsManager","calls","IS_CALL_SUPPORTED","updatePhoneCall","saveCall","phone_call","updatePhoneCallSignalingData","callId","phone_call_id","computeKey","g_b","p","call","isDiscarded","oldCall","getCall","getCallInput","access_hash","savePhonePhoneCall","phonePhoneCall","generateDh","random_length","dhConfig","requestCall","protocol","g_a_hash","video","getUserInput","random_id","discardCall","duration","connection_id","AppChatsManager","isPeerNeeded","modifyUsernamesCache","onChatUpdated","updateChannelParticipant","clearCache","updateChatDefaultBannedRights","default_banned_rights","getFromCache","apiChats","saveApiChat","oldChat","participants_count","changedUsername","setUsernameToCache","oldPhotoId","newPhotoId","toggledForum","forum","changedPhoto","changedTitle","changedAnyBadge","verified","scam","fake","hasRights","rights","isThread","editChatDefaultBannedRights","banned_rights","until_date","isMegagroup","megagroup","isInChat","good","getInputPeer","getChannelInputPeer","getChatInputPeer","allowMin","getChatString","createChannel","inviteToChannel","input","usersInputs","u","createChat","leaveChannel","joinChannel","addChatUser","fwdLimit","fwd_limit","deleteChatUser","leaveChat","leave","deleteChannel","deleteChat","migrateChat","updateUsername","username","doNotRefresh","refreshChatAfterRequest","editPhoto","inputFile","inputChatPhoto","file","editTitle","editAbout","about","editBanned","participant","getParticipantPeerId","timestamp","actor_id","prev_participant","new_participant","kicked_by","clearChannelParticipantBannedRights","kickFromChannel","view_messages","kickFromChat","resolveChannel","messagesChats","togglePreHistoryHidden","toggleSignatures","toggleNoForwards","setChatAvailableReactions","reactions","chatFull","getCachedFullChat","available_reactions","getSendAs","invokeApiSingleProcess","processResult","sendAsPeers","importChatInvite","hash","checkUsername","getSponsoredMessage","invokeApiCacheable","cacheSeconds","sponsoredMessages","sponsoredMessage","viewSponsoredMessage","randomId","checkChatInvite","chatInvite","toggleUsername","active","reorderUsernames","deactivateAllUsernames","makeChannelPrivate","getChannels","toggleForum","editForumTopic","iconEmojiId","closed","createForumTopic","iconColor","channelFull","getChannelFull","sendAsInputPeer","default_send_as","icon_color","send_as","updatePinnedForumTopic","wrapUrl","unsafe","matchUrlProtocol","tgMeMatch","telescoPeMatch","tgMatch","onclick","prefix","pathname","fullPath","I18n","pluralRules","cacheLangPackPromise","setLangCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","timeFormat","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","langSign","countries","strings","formatLocalStrings","default","saveLangPack","from_version","lang_code","local","loadLangPack","web","requestedServerLanguage","lang_pack","polyfillPromise","pushTo","langPack","appVersion","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","document","querySelectorAll","element","weakMap","superFormatter","indexHolder","lastIndex","p1","p2","p3","p4","createElement","append","lastIndexOf","wrappedUrl","href","setAttribute","DocumentFragment","firstChild","textContent","arg","pushNextArgument","plain","select","item","Node","isRTL","setRTL","rtl","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","l","_Intl","WeakMap","IntlElementBase","classList","property","IntlElement","safeAssign","formatted","dataset","compareAndUpdate","json","DateTimeFormat","hours","getHours","getMinutes","capitalizeFirstLetter","i18n","i18n_","_i18n","months","days","getWeekNumber","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","today","year","day","month","weekday","minYear","yearPattern","RegExp","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","createForMonthYear","dates","selectedYear","currentYear","setFullYear","minDate","setMonth","maxDate","formatterMonthYear","createForDayMonth","validDateForMonth","formatterDayMonth","formatterYearMax","formatWeekLong","getDay","q","safeReplaceArrayInObject","trim","dayOfWeek","setDate","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","g3","parseInt","k1","EXTENSION_MIME_TYPE_MAP","pdf","tgv","tgs","wav","mp3","ogg","jpeg","jpg","png","gif","webp","mp4","webm","mov","svg","MIME_TYPE_EXTENSION_MAP","uploadWallPaperTempId","AppDocsManager","onServiceWorkerFail","docs","doc","supportsStreaming","thumbsStorage","deleteCacheContext","stickerCachedThumbs","uploadingWallPapers","online","saveDoc","oldDoc","file_reference","referenceDatabase","attributes","attribute","file_name","wrapPlainText","voice","mime_type","w","h","round_message","alt","stickerEmojiRaw","stickerSetInput","thumbs","IS_WEBP_SUPPORTED","sticker","IS_WEBM_SUPPORTED","animated","mappedMimeType","joiner","monthAsNumber","noSeconds","getSeconds","leadingZero","noTime","getFullDate","isServiceWorkerOnline","getCacheContext","setCacheContextURL","thumb","getDocumentDownloadOptions","getDocumentURL","getDoc","downloadDoc","queueId","onlyCache","downloadMedia","getLottieCachedThumb","toneIndex","saveLottiePreview","width","height","saveWebPConvertedStrippedThumb","stickerThumbConverted","getWallPapers","invokeApiHashable","accountWallpapers","wallPapers","wallpapers","wallPaper","prepareWallPaperUpload","cacheContext","wallpaper","slug","uploadWallPaper","fileName","downloaded","getGifs","gifs","requestDocPart","requestFilePart","getDocumentInputFileLocation","AppDraftsManager","drafts","updateDraftMessage","notify","getKey","getDraft","getAllDrafts","getAllDraftPromise","apiDraft","processApiDraft","isEmptyDraft","reply_to_msg_id","syncDraft","localDraft","saveOnServer","serverDraft","draftsAreEqual","draftObj","getInputEntities","no_webpage","top_msg_id","saveLocalDraft","clearAllDrafts","combined","clearDraft","emptyDraft","setDraft","EMOJI_LANG_PACK","keywords","AppEmojiManager","keywordLangPacks","indexedLangPacks","getKeywordsPromises","recent","getRecentEmojisPromises","getCustomEmojiDocumentPromises","getEmojiKeywords","storageKey","pack","validateInitObject","keywordsDifference","packKeywords","keyword","emoticons","getBothEmojiKeywords","networkerFactory","native","getRecentEmojis","indexEmojis","searchEmojis","emojis","POPULAR_EMOJI","recentEmoji","recentCustomEmoji","pushRecentEmoji","emoji","fixEmoji","docIds","document_id","documents","appDocsManager","getCachedCustomEmojiDocuments","setDebouncedGetCustomEmojiDocuments","getCustomEmojiDocumentsPromise","allIds","getCustomEmojiDocument","getCustomEmojis","getEmojiStickers","AppGroupCallsManager","groupCalls","participants","nextOffsets","updateGroupCall","saveGroupCall","updateGroupCallParticipants","groupCallId","saveApiParticipants","groupCall","getCachedParticipants","prepareToSavingNextOffset","nextOffsetsMap","nextOffset","setNextOffset","newNextOffset","saveApiParticipant","skipCounterUpdating","oldParticipant","hasLeft","muted","can_self_unmute","getGroupCall","modified","just_joined","apiParticipants","editParticipant","getGroupCallInput","getInputPeerSelf","volume","raise_hand","raiseHand","video_paused","videoPaused","video_stopped","videoStopped","presentation_paused","presentationPaused","getGroupCallFull","participants_next_offset","shouldUpdate","createGroupCall","scheduleDate","schedule_date","getGroupCallParticipants","sources","groupCallParticipants","next_offset","hangUp","discard","groupCallInput","source","join_as","joinGroupCall","isMuted","joinVideo","leaveGroupCallPresentation","getPhotoInput","getPhotoMediaInput","ttl_seconds","getMediaInput","AppInlineBotsManager","inlineResults","setHash","getGeoInput","geo","lat","long","accuracy_radius","getInlineResults","bot","geo_point","stopTime","botResults","queryId","query_id","appPhotosManager","savePhoto","generateQId","pushPopularBot","getTopPeers","topPeers","botPeerId","topPeer","rating","switchToPM","fromPeerId","startParam","startBot","checkSwitchReturn","getUser","bot_inline_placeholder","peerData","switchInlineQuery","getPeerUsername","callbackButtonClick","button","msg_id","sendInlineResult","queryAndResultIds","inlineResult","queryID","resultID","resultId","send_message","reply_markup","replyMarkup","sendText","inputMedia","messageMedia","caption","sendMessage","geoPoint","address","provider","venue_id","venue_type","phone_number","first_name","last_name","vcard","description","currency","total_amount","shipping_address_requested","start_param","sendOther","AppMessagesIdsManager","tempNum","num","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","cut","end","part","_arrayIndex","partLength","appTabsManager","tabs","start","getTabs","tab","addTab","deleteTab","getDocumentInput","setBooleanFlag","processAfter","UPDATE_STICKERSET_ORDER","AppMessagesManager","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","extendedMedia","maxSeenId","newDialogsToHandle","notificationsToHandle","reloadConversationsPeers","groupedTempId","typings","unreadMentions","goToNextMentionPromises","batchUpdates","middleware","clean","uploadFilePromises","messagesStorageByPeerId","groupedMessagesStorage","scheduledMessagesStorage","historiesStorage","threadsStorage","searchesStorage","pinnedMessages","threadsServiceMessagesIdsStorage","threadsToReplies","handleNewDialogs","newMaxSeenId","updateMap","processDialog","isDialogDefined","incrementMaxSeenId","handleNotifications","notificationsHandlePromise","notifyPeerToHandle","getNotifyPeerSettings","peerTypeNotifySettings","mentioned","notifyAboutMessage","fwdCount","onUpdateMessageId","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","createMessageStorage","threadKey","getThreadKey","handleNewUpdateAfterReload","threadStorage","reply_to_peer_id","reply_to_mid","receiptMessage","checkPendingMessage","updateMessageRepliesIfNeeded","ignoreExisting","findSlice","firstSlice","forceUserOnline","handleNewMessage","inboxUnread","modifyCachedMentions","setDialogTopMessage","notifyPeer","onUpdateMessageReactions","recentReaction","previousReactions","previousRecentReactions","show_previews","peerReaction","pushBatchUpdate","batchUpdateReactions","setDialogToStateIfMessageIsTop","onUpdateDialogUnreadMark","unread_mark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","dispatchEditEvent","newReactions","grouped_id","onUpdateReadHistory","max_id","read_max_id","getObjectKeysAndSort","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","getReadMaxIdIfUnread","messageThreadId","getMessageThreadId","setCount","threadKeyPart","onUpdateReadMessagesContents","topMsgId","mids","findPeerIdByMids","media_unread","fixDialogUnreadMentionsIfNoMessage","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","getPeerActiveUsernames","onUpdateChannelReload","flushStoragesByPeerId","onUpdateChannelMessageViews","views","batchUpdateViews","onUpdateServiceNotification","popup","phone","onUpdatePinnedMessages","missingMessages","werePinned","getPinnedMessagesKey","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","isScheduled","onUpdateDeleteScheduledMessages","onUpdateMessageExtendedMedia","extended_media","batch","toDispatch","getMessagesFromMap","previousResults","changedResults","reactionCount","previousReactionCount","_reactionCount","reactionsEqual","chosen_order","updateMessageID","updateNewDiscussionMessage","updateNewMessage","updateNewChannelMessage","updateDialogUnreadMark","updateEditMessage","updateEditChannelMessage","updateMessageReactions","updateReadChannelDiscussionInbox","updateReadChannelDiscussionOutbox","updateReadHistoryInbox","updateReadHistoryOutbox","updateReadChannelInbox","updateReadChannelOutbox","updateChannelReadMessagesContents","updateReadMessagesContents","updateChannelAvailableMessages","updateDeleteMessages","updateDeleteChannelMessages","updateChannel","updateChannelReload","updateChannelMessageViews","updateServiceNotification","updatePinnedMessages","updatePinnedChannelMessages","updateNotifySettings","updateNewScheduledMessage","updateDeleteScheduledMessages","updateMessageExtendedMedia","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getCachedWebPage","drop","poll","appPollsManager","pollToMessages","startsWith","batchUpdatesDebounced","debounce","details","maxSeenMsgId","sendEntites","entity","invokeAfterMessageIsSent","tempId","callbackName","finalize","editMessage","is_scheduled","newMedia","noWebPage","handled","replyToMsgId","MAX_LENGTH","message_length_max","webPage","getPeerMigratedTo","generateOutgoingMessage","toggleError","onMessagesSendError","sentRequestOptions","afterMessageId","sendAs","sendAsPeerId","apiPromise","invokeApiAfter","clear_draft","update_stickersets_order","wrapMessageEntities","beforeMessageSending","sequential","noop","sendFile","attachType","apiFileName","fileType","File","isDocument","Blob","isPhoto","IMAGE_MIME_TYPES_SUPPORTED","strippedPhotoSize","strippedBytes","actionName","isVoiceMessage","waveform","isMedia","photoSize","sizes","objectURL","VIDEO_MIME_TYPES_SUPPORTED","videoAttribute","isRoundMessage","supports_streaming","noSound","thumbCacheContext","sentDeferred","spoiler","uploadingFileName","getFileNameForUpload","uploaded","uploadPromise","load","thumbUploadPromise","cancelPendingMessage","setTyping","addNotifyListener","progress","percents","floor","done","total","notifyAll","force_file","isGroupedItem","background","ret","sendAlbum","sendFileDetails","groupId","o","invoke","multiMedia","multi_media","originalInputMedia","inputSingleMedia","inputs","sendContact","contactPeerId","getContactMediaInput","pollId","savePoll","total_voters","getPoll","getPhoto","postAuthor","getPeer","signatures","generateFromId","post_author","generateFlags","generateReplyHeader","via_bot_id","replies","generateReplies","replyToTopId","originalMessage","forum_topic","reply_to_top_id","linked_chat_id","comments","replies_pts","isAnonymousSending","generateForwardHeader","isUserHidden","from_name","userFull","getCachedFullUser","private_forward_name","channel_post","saved_from_msg_id","saved_from_peer","generateFakeAvatarMessage","Number","MAX_SAFE_INTEGER","getUploadPromise","uploadFileName","admin_rights","anonymous","pendingData","fillConversations","chatHistoryStorage","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","setMessageUnreadByDialog","folderDialogs","dialogsLength","slicedDialogs","offset_peer","offsetPeerId","forwardMessages","config","overflowMids","forwarded_count_max","dropCaptions","dropAuthor","newMids","newMessages","replyToMid","replyToMessageIdx","newReplyToMid","getStickerEffectThumb","nopremium","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","getMessagesStorageByKey","s","getMessagesStorage","getMessageById","cantForwardDeleteMids","cantForward","cantDelete","canForward","canDeleteMessage","reloadConversationOrTopic","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","currentState","doFlushHistory","just_clear","revoke","affectedHistory","flushHistory","justClear","getHistory","historyResult","getTypingKey","ss","hidePinnedMessages","getPinnedMessage","getSearch","inputFilter","getPinnedMessagesCount","getPinnedMessagesMaxId","updatePinnedMessage","unpin","pm_oneside","unpinAllMessages","unpinAll","getAlbumText","getGroupsFirstMessage","minMid","getMidsByAlbum","groupedId","getMessagesByAlbum","getMidsByMessage","filterMessages","appMessagesIdsManager","saveMessage","isMessage","replyTo","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","mediaContext","unsupported","originalDoc","messageKey","getMessageKeyForPendingWebPage","saveWebPage","appWebDocsManager","saveWebDocument","extendedMediaMedia","totalEntities","migrateFrom","migrateTo","video_sizes","appGroupCallsManager","migrateChecks","getFirstMessageToEdit","goodMessage","myPeerId","canEditMessage","apiEntities","myEntities","parseEntities","mergeEntities","reportMessages","editPeerFolders","getDialogPeer","markDialogUnread","read","fromChat","canMessageBeEdited","kind","goodMedias","edit_time_limit","getReplyKeyboard","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","getSearchStorage","getSearchCounters","canCache","isPeerRestricted","func","filterMessagesByInputFilterFromStorage","_storage","filterMessagesByInputFilter","nextRate","backLimit","offset_id_offset","next_rate","foundMsgs","min_date","max_date","add_offset","min_id","offsetId","offsetMessage","offset_rate","searchResult","foundCount","subscribeRepliesThread","getDiscussionMessage","generateThreadServiceStartMessage","maxMessageId","serviceStartMessage","is_single","getThreadServiceMessageId","getMessageWithReplies","newMaxId","unsetEnd","newDialogsHandlePromise","deleteMessages","localMessageIds","creator","delete_messages","affectedMessages","readHistory","triedToReadMaxId","readPromise","getPeerString","readAllHistory","getUnreadMentionsKey","slicedArray","fixUnreadMentionsCountIfNeeded","goToNextMention","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","readMessages","msgIds","getHistoryStorageTransferable","historySerialized","toJSON","inputNotifyPeer","getInputNotifyPeerById","ignorePeerId","getNotifyPeerTypeSettings","getNotifySettings","isMessageIsTopMessage","threadMessage","broadcastEventName","pendingMessage","finalizePendingMessage","mutePeer","validatePeerSettings","muteUntil","mute_until","togglePeerMute","mute","canSendToPeer","canSendToUser","finalMessage","tempMessage","finalizePendingMessageCallbacks","newPhoto","newDoc","newPhotoSize","oldCacheContext","getPhotoDownloadOptions","thumbSize","polls","handleReleasingMessage","getMessageReactionsListAndReadParticipants","skipReadParticipants","skipReactionsList","emptyMessageReactionsList","canViewMessageReadParticipants","getMessageReadParticipants","appReactionsManager","getMessageReactionsList","messageReactionsList","readParticipantsPeerIds","filteredReadParticipants","readPeerId","reactionsCount","readParticipants","appConfig","getAppConfig","chat_read_mark_size_threshold","chat_read_mark_expire_period","incrementMessageViews","increment","chatPeerIds","idleStartTime","getScheduledMessageByPeer","getScheduledMessages","sendScheduledMessages","deleteScheduledMessages","getMessageWithCommentReplies","isFetchIntervalNeeded","getNewHistory","isBottomEnd","getEnds","offsetIdOffset","haveSlice","sliceMe","fulfilled","fillHistoryStorage","constructSlice","isHistoryResultEnd","topWasMeantToLoad","wasMaxId","requestHistory","deleteSlice","oldestMessage","foundSlice","_historyResult","fetchSingleMessages","fetchSingleMessagesPromise","requestPromises","getMessagesResult","getExtendedMedia","toRequest","fetchMessageReplyTo","replyToPeerId","typing","smth","deleteWebPageFromPending","updatePollToMessage","groupedStorage","albums","dispatchAlbumEdit","deletedMids","noforwards","noForwards","getElementCallback","newMap","peerIdStr","saveDefaultSendAs","convertInputKeyToKey","inputKey","AppNotificationsManager","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","notifyForumTopic","checkMuteUntil","checkMuteUntilTimeout","closestMuteUntil","peerNotifySettings","typeKey","checkMuteUntilThrottled","throttle","isPeerType","notifySettings","getNotifyPeerTypePromise","getContactSignUpNotification","notifyContactsSignUp","setContactSignUpNotification","getPeerKey","getPeerMuted","getPeerLocalSettings","n","peerKey","typeNotifySettings","AppPeersManager","canPinMessage","getPeerPhoto","getUserString","getRestrictionReasonText","restriction_reason","getUserInputPeer","getUserSearchText","getDialogType","getDeleteButtonText","AppPhotosManager","photos","oldPhoto","Infinity","getUserPhotos","inputUser","photosResult","photoIds","photoId","AppPollsManager","updateMessagePoll","poll_id","saveResults","chosenIndexes","answer","chosen","getInputMediaPoll","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","sendVote","optionIds","answers","option","getResults","getVotes","votesList","stopPoll","newPoll","AppPrivacyManager","privacy","updatePrivacy","rules","setPrivacy","privacyRules","inputRule","rule","getPrivacy","privacyKey","getGlobalPrivacySettings","setGlobalPrivacySettings","PEER_FULL_TTL","AppProfileManager","usersFull","chatsFull","fullExpiration","onUpdateUserTyping","getTypingsKey","typingsInPeer","t","cancelAction","getChatFull","onUpdatePeerBlocked","blocked","updateChatParticipants","updateChatParticipantAdd","_participants","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","hasChatPhoto","chat_photo","refreshFullPeer","invalidateChannelParticipants","usersUserFull","full_user","profile_photo","botInfo","bot_info","referenceContext","description_document","description_photo","getProfileByPeerId","getCachedProfileByPeerId","getFullPhoto","profile","full_chat","getChatInviteLink","exported_invite","link","exportedInvite","getChannelParticipants","broadcast","getChannelParticipant","channelParticipant","fullChannel","processError","getMentions","processUserIds","ratingMap","cP","updateProfile","saveApiUser","uploadProfilePhoto","updateResult","strippedThumb","stripped_thumb","deletePhotos","deletedList","verifyParticipantForOnlineCount","reduceParticipantsForOnlineCount","getOnlines","chatInfo","channelParticipants","onlines","getPeerTypings","callbackifyAll","SAVE_DOC_KEYS","REFERENCE_CONTEXT","AppReactionsManager","availableReactions","getAvailableReactions","sendReactionPromises","lastSendingTimes","availableReaction","around_animation","static_icon","appear_animation","center_icon","messagesAvailableReactions","getActiveAvailableReactions","inactive","getAvailableReactionsForPeer","activeAvailableReactions","unshiftQuickReaction","getQuickReaction","quickReaction","chatAvailableReactions","filteredChatAvailableReactions","unshiftQuickReactionInner","getAvailableReactionsByMessage","isReactionActive","reactions_default","getReactionCached","getReaction","getMessagesReactions","setDefaultReaction","sendReaction","lastSendingTimeKey","unsetReactionCount","canSeeList","can_see_list","chosenReactions","unsetReactions","chosenReactionIdx","chosenReactionCount","chosenReactionsLength","reactionCountIdx","id1","id2","promiseKey","editMessageUpdateIdx","editMessageUpdate","LOCAL_IDS","EMOJI","EMOJI_ANIMATIONS","PREMIUM_GIFTS","GENERIC_ANIMATIONS","DEFAULT_STATUSES","DEFAULT_TOPIC_ICONS","LOCAL_IDS_SET","AppStickersManager","processAllStickersResult","allStickers","sets","stickerSet","videos","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","getGreetingStickersPromise","getGreetingStickersTimeout","getGreetingSticker","onStickersUpdated","updateNewStickerSet","saveStickerSet","updateRecentStickers","updateFavedStickers","updateMoveStickerSetToTop","stickers","getFavedStickersStickers","getRecentStickersStickers","justPreload","getStickersByEmoticon","greetingStickers","random","saveStickers","canUseStickerSetCache","useCache","refreshTime","getStickerSet","cachedSet","getStickerSetInput","saveById","getLocalStickerSet","animations","getAnimatedEmojiSoundsPromise","emojies_sounds","sound","bytesStr","atob","file_reference_base64","charCodeAt","this_dc","getRecentStickers","recentStickers","saveRecentSticker","unsave","_doc","docEmoticon","faved","cleanEmoji","getAnimatedEmojiSticker","isAnimation","packs","getAnimatedEmojiSoundDocument","preloadAnimatedEmojiSticker","preloadEmojiPromise","preloadAnimatedEmojiStickerAnimation","animation","preloadSticker","isPremiumEffect","video_thumbs","newSet","setToCache","needSave","installed_date","getStickerSetThumbDownloadOptions","thumb_dc_id","isAnimated","mimeType","getFeaturedStickers","covered","getPromoPremiumStickers","getPremiumStickers","getFavedStickers","favedStickers","getFavedStickersLimit","faveSticker","unfave","toggleStickerSet","archived","toggleStickerSets","searchStickerSets","excludeFeatured","exclude_featured","foundSaved","cover","getAllStickers","preloadStickerSets","includeOurStickers","messagesStickers","installedSets","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","clearRecentStickers","AppUsersManager","usernames","getTopPeersPromises","contactsIndex","createSearchIndex","contactsFillPromise","contactsList","updatedContactsList","updateUsersStatuses","timestampNow","updateUserStatus","setInterval","expires","was_online","setUserToStateIfNeeded","updateUserName","contactsListCachedTime","contact","mutual_contact","pushContact","recentSearch","onContactsModified","fromServer","pushRecentSearch","clearRecentSearch","resolveUsername","resolvedPeer","processResolvedPeer","resolvePhone","popContact","getContacts","includeSaved","sortBy","_contactsList","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","testSelfSearch","getContactsPeerIds","toggleBlock","block","apiUsers","cleanedUsernames","cleanUsername","searchUsername","oldPeer","oldUser","fullName","wasContact","newContact","onContactUpdated","checkPremium","isUserOnlineVisible","getUserStatus","isRegularUser","getUserPhone","isAnonymous","fragment_prefixes","isAttachMenuBot","bot_attach_menu","support","isNonContactUser","eventTimestamp","importContact","importContacts","phones","inputContacts","j","client_id","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","categories","getBlocked","contactsBlocked","getLocated","self_expires","searchContacts","my_results","curIsContact","setUserStatus","offline","updateMyOnlineStatus","addContact","addPhonePrivacyException","add_phone_privacy_exception","deleteContacts","photoTypeSet","AppWebPagesManager","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","pendingSet","getWebPage","readBlobAsArrayBuffer","readBlobAs","fileNameRFC","escape","DownloadWriter","serviceMessagePort","getServiceMessagePort","write","chunk","saveToStorage","DownloadStorage","getFile","prepareWriting","headers","cancel","getWriter","MIN_PART_SIZE","IGNORE_ERRORS","ApiFileManager","cacheStorage","downloadStorage","downloadPromises","uploadPromises","downloadPulls","downloadActives","refreshReferencePromises","maxUploadParts","maxDownloadParts","uncompressTGS","uncompressTGV","svgIndex","__","fixFirefoxSvg","TextEncoder","convertWebp","convertOpus","webFileDcId","webfile_dc_id","upload_max_fileparts_premium","upload_max_fileparts_default","downloadRequest","activeDelta","downloadPull","downloadCheck","downloadLimit","setQueueId","getFileStorage","cancelDownload","canceled","requestWebFilePart","checkCancel","fileDownload","getDelta","checkedReference","getLimitPart","isUpload","maxParts","maxPartSize","inputFileLocation","isDownloading","getDownload","getUpload","getConvertMethod","IS_OPUS_SUPPORTED","allocateDeferredPromises","startOffset","delayed","writeDeferred","writePromise","originalMimeType","convertMethod","getDownloadFileNameFromOptions","cacheFileName","errorHandler","prepared","cachePrepared","downloadPrepared","possibleSize","_errorHandler","writer","truncate","downloadFileName","readBlobAsUint8Array","isWebFile","requestPart","dispatchProgress","throttledDispatchProgress","superpuper","isFinal","getParts","replaceParts","processedResult","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","fileSize","isBigFile","partSize","totalParts","fileId","resultInputFile","parts","md5_checksum","resolved","it","_part","doneParts","file_id","file_part","file_total_parts","fileUpload","generator","ApiManagerMethods","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","afterMessageIdTemp","setUserAuth","prepareTempMessageId","queryJSON","newResult","cacheKey","oldPromise","getNewPromise","newPromise","ignore_restriction_reasons","pin","folderPin","bio","topicPin","ApiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","baseDcId","afterMessageTempIds","changeTransportType","updateConfig","iterateNetworkers","getTransportType","connections","dcs","array","oldTransportType","oldObject","oldGetKey","newGetKey","info","changeNetworkerTransport","getBaseDcId","sessionStorage","setBaseDcId","userAuth","dcID","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","dc","logOut","loggingOut","storageKeys","storageResult","logoutPromises","ignoreErrors","toggleStorages","generateNetworkerGetKey","networkers","maxNetworkers","found","isOnline","ak","authKeyHex","serverSaltHex","authKey","bytesFromHex","authKeyId","serverSalt","authorizer","_error","newTransportType","removeTransport","stack","getNetworkerVoid","oldTransport","changeTransport","onNetworkerDrain","onDrain","removeNetworker","isFileNetworker","canRelease","setDrainTimeout","updatesProcessor","cachedNetworker","startTime","isStopped","performRequest","wrapApiCall","exportResolve","exportReject","exportedAuth","newDcId","unsetConnectionInited","rawError","waitTime","floodMaxTimeout","attachPromise","originalError","PeersStorage","neededPeers","singlePeerMap","thumbFullSize","ThumbsStorage","thumbsCache","intToUint","ulongFromInts","high","low","shiftLeft","safeBigInt","ulongBigInt","pow","longBigInt","divide","bigIntFromBytes","base","boolFalse","predicate","boolTrue","vector","gzipPacked","sliceMethod","TLSerialization","mtproto","startMaxLength","createBuffer","ArrayBuffer","intView","Int32Array","byteView","getArray","resultBuffer","resultInt32","subarray","getBuffer","getBytes","typed","resultArray","getOffset","checkLength","needBytes","previousBuffer","previousArray","writeInt","field","storeInt","storeBool","storeLongP","iHigh","iLow","storeLong","sLong","storeIntBytes","_bigInt","bigInt","isNegative","quotient","remainder","divmod","toJSNumber","storeDouble","Float64Array","storeString","sUTF8","unescape","storeBytes","bits","storeRawBytes","storeMethod","methodName","methodData","methods","m","flagsOffsets","param","condType","fieldBit","storeObject","paramName","itemType","schema","isBare","constructorData","TLDeserialization","readInt","fetchInt","fetchDouble","doubleView","fetchLong","ulong","greater","minus","greaterOrEquals","abs","fetchBool","fetchObject","fetchString","String","fromCharCode","decodeURIComponent","fetchBytes","fetchIntBytes","fetchRawBytes","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","setOffset","addPadding","blockSize","zeroes","blockSizeAsTotalLength","needPadding","padding","bufferConcats","delays","disconnectDelayMin","disconnectDelayMax","pingInterval","pingMaxTime","connectionTimeout","RESEND_OPTIONS","noSchedule","notContentRelated","invokeAfterMsgConstructor","networkerTempId","MTPNetworker","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResendReq","nextReq","checkConnectionPeriod","lastResponseTime","activeRequests","sendPingDelayDisconnect","pingDelayDisconnectDeferred","lastPingTime","disconnectDelay","round","timeoutTime","lastPingStartTime","pingId","lastPingDelayDisconnectId","wrapMtpCall","ping_id","disconnect_delay","rejectTimeout","elapsedTime","checkLongPoll","isClean","longPollPending","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","serializer","pingMessage","generateId","seq_no","generateSeqNo","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","authKeyUint8","convertToUint8Array","isFileUpload","isFileDownload","updateSession","seqNo","prevSessionId","updateSentMessage","sentMessageId","sentMessage","container","inner","innerSentMessageId","innerSentMessage","pushMessage","wrapMtpMessage","connectionInited","invokeWithLayer","initConnection","resultType","isAPI","nextReqTimeout","longPollInterval","clearPingDelayDisconnect","forceReconnectTimeout","sendingLongPoll","max_delay","wait_after","max_wait","noResponse","longPoll","delay","checkConnectionRetryAt","scheduleRequest","handleSentEncryptedRequestHTTP","noResponseMsgs","sqrt","pushResend","shouldResolve","onDrainTimeout","willChange","onConnectionStatusChange","innerMsgId","acked","getMsgKey","dataWithPadding","x","msgKeyLargePlain","msgKeyLarge","getAesKeyIv","msgKey","sha2aText","sha2bText","aesKey","aesIv","sha2a","sha2b","akStopped","performScheduledRequest","ackMsgIds","msg_ids","pendingResendReqLength","outMessage","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","compare","messageByteLength","generateContainerMessage","messageWithBody","innerMessages","getEncryptedMessage","keyIv","getDecryptedMessage","encryptedData","getEncryptedOutput","dataBuffer","paddingLength","encryptedResult","requestData","baseError","responseBuffer","deserializer","bytesCmp","calcMsgKey","totalLength","messageBodyLength","messageBody","mt_message","seqno","mt_rpc_result","req_msg_id","applyServerSalt","newServerSalt","toArray","ackMessage","reqResend","notEmpty","processMessageAck","error_message","error_code","msg","applyServerTime","serverTime","shiftRight","innerMessage","new_server_salt","bad_msg_id","changedTimeOffset","badMessage","first_msg_id","server_salt","answer_msg_id","lastResendReq","lastResend","pendingResend","reqMsgId","badMsgId","pos","NetworkerFactory","startAll","stoppedNetworkers","stopAll","setLanguage","testPublicKeysHex","modulus","exponent","publisKeysHex","publicKeysParsed","preparePromise","prepare","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","fingerprintHex","fill","foundKey","fingerprint","bytesXor","bytes1","bytes2","Authorizer","sendPlainRequest","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","sendReqPQ","nonce","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","publicKey","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","keyAesEncryptedBigInt","publicKeyModulusBigInt","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","newNonceHash","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","localTime","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","g","dhPrime","dh_prime","gA","g_a","server_time","retry","verifyDhParams","dhPrimeHex","gABigInt","dhPrimeBigInt","subtract","twoPow","gBytes","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","newNonceHash2","new_nonce_hash2","newNonceHash3","new_nonce_hash3","getTransportTypePromise","_try","TimeManager","lastMessageId","timeOffset","timeTicks","newTimeOffset","changed","server_time_offset","AppWebDocsManager","webDocument","AppPaymentsManager","getInputInvoiceBySlug","getInputInvoiceByPeerId","getPaymentForm","invoice","paymentForm","getPaymentReceipt","validateRequestedInfo","sendPaymentForm","formId","requestedInfoId","shippingOptionId","credentials","tipAmount","form_id","requested_info_id","shipping_option_id","tip_amount","clearSavedInfo","AppAttachMenuBotsManager","attachMenuBots","attachMenuBotsArr","onUpdateAttachMenuBots","getAttachMenuBots","updateAttachMenuBots","saveAttachMenuBot","attachMenuBot","bot_id","icon","getAttachMenuBotIcon","saveAttachMenuBots","getAttachMenuBotCached","requestWebView","fromBotMenu","themeParams","from_bot_menu","theme_params","prolongWebView","AppSeamlessLoginManager","requestUrlAuth","buttonId","button_id","urlAuthResult","acceptUrlAuth","writeAllowed","write_allowed","getWebAuthorizations","webAuthorizations","authorizations","resetWebAuthorization","resetWebAuthorizations","appManagersManager","cryptoWorkersURLs","cryptoPortsAttached","cryptoPortPromise","getManagers","manager","apply","ports","originalUrl","newURLs","createManagers","appAvatarsManager","appCallsManager","appPrivacyManager","appInlineBotsManager","passwordManager","appPaymentsManager","appSeamlessLoginManager","_serviceMessagePort","_isServiceWorkerOnline","pushedKeys","clearWrite","invokeExceptSource","serviceWorkerOnline","serviceWorkerPort","detachPort","attachPort","messagePort","onConnect","onDisconnect","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","listenMessagePort","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","ATTACH_MENU_BOT_ICON_NAME","GENERAL_TOPIC_ID","T_ME_PREFIXES","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","START_LOCAL_ID","ALPHA_CHARS_REG_EXP","ALPHA_NUMERIC_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","USERNAME_REG_EXP","BOT_COMMAND_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","encodeEmoji","emojiText","unicodeSurrogates","points","char","previous","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","__webpack_exports__","O","chunkIds","fn","priority","notFulfilled","getter","__esModule","definition","enumerable","chunkId","miniCssF","globalThis","Function","prop","Symbol","toStringTag","nmd","paths","children","scriptUrl","importScripts","currentScript","src","scripts","getElementsByTagName","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.d525550e01869ae11a4b.chunk.js b/public/mtproto.worker.d525550e01869ae11a4b.chunk.js new file mode 100644 index 00000000..0f32d6c3 --- /dev/null +++ b/public/mtproto.worker.d525550e01869ae11a4b.chunk.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,t,a={410:(e,t,a)=>{a.d(t,{GO:()=>n,ZP:()=>i});const s=a(1267).Z.debug,n="undefined"!=typeof window?window:self,i=s},3447:(e,t,a)=>{a.d(t,{Z:()=>i});const s={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0}},n=s[""];for(const e in s)e&&Object.assign(n,s[e]);const i=n},4762:(e,t,a)=>{a.d(t,{IS_FIREFOX:()=>r,IS_SAFARI:()=>i});var s=a(6761);const n=navigator?navigator.userAgent:null,i=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&s.Z.MSStream,!!("safari"in s.Z)||!(!n||!(/\b(iPad|iPhone|iPod)\b/.test(n)||n.match("Safari")&&!n.match("Chrome")))),r=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;(void 0===navigator.maxTouchPoints||navigator.maxTouchPoints>0)&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},467:(e,t,a)=>{a.d(t,{ZP:()=>o,gV:()=>p});var s=a(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,i=/^\s+|\s$/g,r={й:"q",ц:"w",у:"e",к:"r",е:"t",н:"y",г:"u",ш:"i",щ:"o",з:"p",х:"[",ъ:"]",ф:"a",ы:"s",в:"d",а:"f",п:"g",р:"h",о:"j",л:"k",д:"l",ж:";",э:"'",я:"z",ч:"x",с:"c",м:"v",и:"b",т:"n",ь:"m",б:",",ю:".",".":"/"};function o(e,t=!0){return p(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function p(e,t={}){const a=t.includeTag&&"%"===e.charAt(0),o=e;return t.clearBadChars&&(e=function(e){return e.replace(n,"").replace(i,"")}(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),a&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wа-я]/g,(e=>{const t=r[e];return null!=t?t:e}))}(o)),e}},8801:(e,t,a)=>{a.d(t,{P:()=>n,q:()=>i});const s="_";function n(e,t){const a=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(s);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(s);break;case"inputFileLocation":n=[e.volume_id,e.local_id].join(s);break;case"inputWebFileLocation":n=["webFile",e.url].join(s);break;default:console.error("Unrecognized location:",e),n=""}return n+((null==t?void 0:t.downloadId)?"_download":"")+(a?"."+a:a)}function i(e,t){return e+"/"+encodeURIComponent(JSON.stringify(t))}},677:(e,t,a)=>{a.d(t,{Ki:()=>o,RP:()=>i,X:()=>r});const s=new Set(["all","web","webk"]),n=new Set;function i(e){return e.find((e=>s.has(e.platform)&&!n.has(e.reason)))}function r(e){return!!i(e)}function o(e){n.clear(),e.forEach((e=>{n.add(e)}))}},2946:(e,t,a)=>{a.d(t,{Z:()=>i});var s=a(5880),n=a(1507);function i(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,s.Z)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const a=e.channel_id||e.chat_id;return void 0!==a?a.toPeerId(!0):n.NM}if(!e)return n.NM;const t="u"===e.charAt(0),a=e.substr(1).split("_");return t?a[0].toPeerId():(a[0]||"").toPeerId(!0)}},6666:(e,t,a)=>{a.d(t,{C:()=>o,Z:()=>p});var s=a(1267),n=a(5471),i=a(5953),r=a(5003);class o{constructor(e){(0,i.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,r.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),o.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var a;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(a=t.indexes)||void 0===a?void 0:a.length)for(const a of t.indexes)e.indexNames.contains(a.indexName)||e.createIndex(a.indexName,a.keyPath,a.objectParameters)};try{var a=indexedDB.open(this.name,this.version);if(!a)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||a.onerror((0,n.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,n)=>{a.onsuccess=t=>{s=!0;const i=a.result;let r=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},i.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},a.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},a.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const a=e.target,n=a.result;this.stores.forEach((e=>{if(n.objectStoreNames.contains(e.name)){const s=a.transaction.objectStore(e.name);t(s,e)}else((e,a)=>{const s=e.createObjectStore(a.name);t(s,a)})(n,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new o(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const a=t.db;a&&(a.onclose=()=>{},a.close())}))}}o.INSTANCES=[];class p{constructor(e,t){this.storeName=t,this.log=(0,r.kg)(["IDB",e.name,t].join("-")),this.idb=o.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,a){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(a=>e.map(((e,s)=>a.put(t[s],e)))),"",a)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,a,s=this.storeName){let n;return a&&(n=performance.now(),this.log(a+": start")),this.idb.openDatabase().then((i=>new Promise(((r,o)=>{const p=i.transaction([s],e),d=()=>{clearTimeout(l),o(p.error)},f=()=>{clearTimeout(l),a&&this.log(a+": end",performance.now()-n);const e=h.map((e=>e.result));r(g?e:e[0])};p.onerror=d;const c="readwrite"===e;c&&(p.oncomplete=()=>f());const l=setTimeout((()=>{this.log.error("transaction not finished",p,a)}),1e4),m=t(p.objectStore(s)),g=Array.isArray(m),h=g?m:[].concat(m);if(c)return;const u=h.length;let y=u;const _=()=>{p.error||--y||f()};for(let e=0;ee.getAll()),"",e)}}},9092:(e,t,a)=>{a.d(t,{r:()=>zs,H:()=>Ws}),a(690),a(4110);var s=a(8630);let n;function i(){return n}function r(e){return n=e}var o=a(1507),p=a(3241),d=a(410),f=a(3206),c=a(1352);class l extends p.Z{constructor(){super(),this.myId=o.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("premium_toggle_private",(({isNew:e,isPremium:t})=>{this.premium=t,e||this.dispatchEventSingle("premium_toggle",t)})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),f.Z.getInstance().invokeVoid("event",{name:e,args:t})},c.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}getPremium(){return this.premium}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const m=new l;d.GO.rootScope=m;const g=m;var h=a(7922),u=a(9750);const y=new class{constructor(){this.state={},this.storage=h.Z}getState(){return Promise.resolve(this.state)}setByKey(e,t){!function(e,t,a){const s=t.split(".");(0,u.Z)(e,s.slice(0,-1).join("."))[s.pop()]=a}(this.state,e,t);const a=e.split(".")[0];"settings"===a&&g.dispatchEvent("settings_updated",{key:e,value:t,settings:this.state.settings}),this.pushToState(a,this.state[a])}pushToState(e,t,a=!0,s){a&&(this.state[e]=t),this.setKeyValueToStorage(e,t,s)}setKeyValueToStorage(e,t=this.state[e],a){f.Z.getInstance().invokeVoid("mirror",{name:"state",key:e,value:t}),this.storage.set({[e]:t},a)}};var _=a(4159),v=a(3725),P=a(5418),b=a(1267),M=a(1655),I=a(5003);class S{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=b.Z.debug&&!1;let s=I.v9.Error|I.v9.Log;this.debug&&(s|=I.v9.Debug),this.log=(0,I.kg)(`HTTP-${e}`+a,s),this.log("constructor"),this.connected=!1}_send(e,t){const a=e.length;return this.debug&&this.log.debug("-> body length to send:",a),fetch(this.url,{method:"POST",body:e,mode:t}).then((e=>{if(200!==e.status&&!t)throw e.arrayBuffer().then((e=>{this.log.error("not 200",new TextDecoder("utf-8").decode(new Uint8Array(e)))})),e;return this.setConnected(!0),e.arrayBuffer().then((e=>new Uint8Array(e)))}),(e=>{throw this.setConnected(!1),e}))}setConnected(e){this.connected===e||this.destroyed||(this.connected=e,Z.setTransportValue("https",e))}destroy(){this.setConnected(!1),this.destroyed=!0,this.pending.forEach((e=>e.reject())),this.pending.length=0}send(e){if(this.networker)return this._send(e);{const t=new Promise(((t,a)=>{this.pending.push({resolve:t,reject:a,body:e})}));return this.releasePending(),t}}releasePending(){return e=this,t=void 0,s=function*(){if(!this.releasing){this.releasing=!0;for(let e=0;e{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=e=>{this.log.error("handleError",e),this.close()},this.handleClose=e=>{this.log("closed",e),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=e=>{this.debug&&this.log.debug("<-","handleMessage",e.data.byteLength),this.dispatchEvent("message",e.data)},this.send=e=>{this.debug&&this.log.debug("-> body length to send:",e.length),this.ws.send(e)};let s=I.v9.Error|I.v9.Log;return this.debug&&(s|=I.v9.Debug),this.log=(0,I.kg)(`WS-${e}`+a,s),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(e){}this.handleClose()}}}function w(e){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(e),e}var k=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class A{constructor(){this._process=(e,t)=>s.Z.invokeCryptoNew({method:"aes-ctr-process",args:[{id:this.id,data:e,operation:t}],transfer:[e.buffer]})}init(e){return k(this,void 0,void 0,(function*(){void 0!==this.idPromise&&this.release();const t=new Uint8Array(64);for(w(t);;){const e=t[3]<<24|t[2]<<16|t[1]<<8|t[0],a=t[7]<<24|t[6]<<16|t[5]<<8|t[4];if(239!==t[0]&&1145128264!==e&&1414745936!==e&&542393671!==e&&1230262351!==e&&4008636142!==e&&3722304989!==e&&0!==a)break;w(t)}const a=t.slice().reverse(),n=t.slice(8,40),i=t.slice(40,56),r=a.slice(8,40),o=a.slice(40,56),p=this.idPromise=s.Z.invokeCrypto("aes-ctr-prepare",{encKey:n,encIv:i,decKey:r,decIv:o});this.process=(e,t)=>k(this,void 0,void 0,(function*(){return yield p,this._process(e,t)})),this.id=yield p,this.process=this._process,t.set(e.obfuscateTag,56);const d=yield this.encode(t.slice());return t.set(d.slice(56,64),56),t}))}encode(e){return this.process(e,"encrypt")}decode(e){return this.process(e,"decrypt")}release(){return k(this,void 0,void 0,(function*(){const e=this.idPromise;if(void 0===e)return;this.id=void 0,this.idPromise=void 0;const t=yield e;s.Z.invokeCrypto("aes-ctr-destroy",t)}))}destroy(){this.release()}}const D=new class{constructor(){this.tag=239,this.obfuscateTag=new Uint8Array([this.tag,this.tag,this.tag,this.tag])}encodePacket(e){const t=e.byteLength>>2;let a;return a=t<127?new Uint8Array([t]):new Uint8Array([127,255&t,t>>8&255,t>>16&255]),a.concat(e)}readPacket(e){let t=e[0];return t>=127?(t=e[1]|e[2]<<8|e[3]<<16,e.slice(4,t<<3)):e.slice(1,t<<3)}};var U=a(9174);function T(e){const t=e.length,a=new Array(t);for(let s=0;sF(this,void 0,void 0,(function*(){this.connected=!0,Z.setTransportOpened("websocket");const e=yield this.obfuscation.init(this.codec);this.connected&&(this.connection.send(e),this.networker&&(this.pending.length=0,this.networker.setConnectionStatus(U.Q.Connected),this.networker.cleanupSent(),this.networker.resend()),setTimeout((()=>{this.releasePending()}),0))})),this.onMessage=e=>F(this,void 0,void 0,(function*(){let t=yield this.obfuscation.decode(new Uint8Array(e));if(t=this.codec.readPacket(t),this.networker)return this.debug&&this.log.debug("redirecting to networker",t.length),void this.networker.parseResponse(t).then((e=>{this.debug&&this.log.debug("redirecting to networker response:",e);try{this.networker.processMessage(e.response,e.messageId,e.sessionId)}catch(e){this.log.error("handleMessage networker processMessage error",e)}})).catch((e=>{this.log.error("handleMessage networker parseResponse error",e)}));const a=this.pending.shift();a?a.resolve(t):this.debug&&this.log.debug("no pending for res:",T(t))})),this.onClose=()=>{let e,t;if(this.clear(),this.autoReconnect){const a=Date.now(),s=a-this.lastCloseTime;e=!isNaN(s)&&s{if(void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0),!this.connection){if(this.log("trying to reconnect..."),this.lastCloseTime=Date.now(),this.networker)this.networker.setConnectionStatus(U.Q.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=I.v9.Error|I.v9.Log;this.debug&&(i|=I.v9.Debug),this.log=(0,I.kg)(`TCP-${t}`+s,i),this.log("constructor"),this.connect()}clear(){this.connected&&Z.setTransportClosed("websocket"),this.connected=!1,this.connection&&(this.connection.removeEventListener("open",this.onOpen),this.connection.removeEventListener("close",this.onClose),this.connection.removeEventListener("message",this.onMessage),this.connection=void 0)}forceReconnect(){this.close(),this.reconnect()}destroy(){this.setAutoReconnect(!1),this.close(),this.obfuscation&&this.obfuscation.destroy(),this.pending.forEach((e=>{e.reject&&e.reject()})),this.pending.length=0}close(){const e=this.connection;if(e){const t=this.connected;this.clear(),t&&(e.addEventListener("message",this.onMessage),e.addEventListener("close",(()=>{e.removeEventListener("message",this.onMessage)}),{once:!0}),e.close())}}setAutoReconnect(e){this.autoReconnect=e,e?this.connection||void 0!==this.reconnectTimeout||this.reconnect():void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}connect(){this.connection&&this.close(),this.connection=new this.Connection(this.dcId,this.url,this.logSuffix),this.connection.addEventListener("open",this.onOpen),this.connection.addEventListener("close",this.onClose),this.connection.addEventListener("message",this.onMessage)}changeUrl(e){this.url!==e&&(this.url=e,this.forceReconnect())}encodeBody(e){const t=this.codec.encodePacket(e);return this.obfuscation.encode(t)}send(e){this.debug&&this.log.debug("-> body length to pending:",e.length);const t=void 0;if(!this.networker){const a=new Promise(((a,s)=>{this.pending.push({resolve:a,reject:s,body:e,encoded:t})}));return this.releasePending(),a}this.pending.push({body:e,encoded:t}),this.releasePending()}releasePending(){var e;return F(this,void 0,void 0,(function*(){if(!this.connected||this.releasingPending)return;this.releasingPending=!0;let t=this.pending.length,a=!1;for(let s=0;s body length to send:",i.length);const r=null!==(e=n.encoded)&&void 0!==e?e:n.encoded=yield this.encodeBody(i);if(!this.connected)break;this.connection.send(r),n.resolve?n.bodySent=!0:(this.pending.splice(s--,1),t--),a=!0}}this.releasingPending=void 0,this.pending.length&&a&&this.releasePending()}))}}const x=b.Z.test?"_test":"";function B(e){return"client"===e?"":"-1"}function V(e,t,a){const s=B(t),n="client"!==t?"apiws"+x+(a?"_premium":""):"apiws"+x;return`wss://${_.Z.suffix.toLowerCase()}ws${e}${s}.web.telegram.org/${n}`}class O{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=b.Z.test?[{id:1,host:"149.154.175.10",port:80},{id:2,host:"149.154.167.40",port:80},{id:3,host:"149.154.175.117",port:80}]:[{id:1,host:"149.154.175.50",port:80},{id:2,host:"149.154.167.50",port:80},{id:3,host:"149.154.175.100",port:80},{id:4,host:"149.154.167.91",port:80},{id:5,host:"149.154.171.5",port:80}],this.chosenServers={},this.transportSocket=(e,t,a)=>{const s=V(e,t,a);let n;return n=C,new R(n,e,s,"upload"===t?"-U":"download"===t?"-D":"",1e4)},this.transportHTTP=(e,t,a)=>{let s;if(b.Z.ssl||!b.Z.http){const a=B(t);s="https://"+(this.sslSubdomains[e-1]+a)+".web.telegram.org/"+(b.Z.test?"apiw_test1":"apiw1")}else for(const t of this.dcOptions)if(t.id===e){s="http://"+t.host+(80!==t.port?":"+t.port:"")+"/apiw1";break}return new S(e,s,"upload"===t?"-U":"download"===t?"-D":"")}}chooseServer(e,t="client",a=b.Z.transport,s=!0,n){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const i=this.chosenServers[a][t];e in i||(i[e]=[]);const r=i[e];if(!r.length||!s){let i;return i=("websocket"===a?this.transportSocket:this.transportHTTP)(e,t,n),i?(s&&r.push(i),i):(console.error("No chosenServer!",e),null)}return r[0]}static removeTransport(e,t){for(const a in e)for(const s in e[a])for(const n in e[a][s]){const i=e[a][s][n];(0,M.Z)(i,t)}}}var L=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class N extends p.Z{constructor(){super(!0),this.opened=new Map,this.addEventListener("change",(e=>{e.get("websocket")||this.waitForWebSocket()}))}pingTransports(){var e;return L(this,void 0,void 0,(function*(){const t=null!==(e=this.dcConfigurator)&&void 0!==e?e:this.dcConfigurator=new O,a=this.transports={https:t.chooseServer(_.Z.baseDcId,"client","https",!1),websocket:t.chooseServer(_.Z.baseDcId,"client","websocket",!1)},s=(0,v.Z)();this.transports.https._send(new Uint8Array,"no-cors").then((()=>s.resolve(!0)),(()=>s.resolve(!1))),setTimeout((()=>s.resolve(!1)),2e3);const n=(0,v.Z)(),i=a.websocket;i.setAutoReconnect(!1),i.connection.addEventListener("close",(()=>n.resolve(!1)),{once:!0}),i.connection.addEventListener("open",(()=>n.resolve(!0)),{once:!0}),setTimeout((()=>{n.isFulfilled||n.isRejected||(i.connection&&i.connection.close(),n.resolve(!1))}),2e3);const[r,o]=yield Promise.all([s,n]);for(const e in a)a[e].destroy();return{https:r||this.opened.get("https")>0,websocket:o||this.opened.get("websocket")>0}}))}waitForWebSocket(){return L(this,void 0,void 0,(function*(){if(!this.pinging){for(this.pinging=!0;;){const{https:e,websocket:t}=yield this.pingTransports();if((e||t)&&this.dispatchEvent("transport",t||!e?"websocket":"https"),t)break;yield(0,P.Z)(1e4)}this.pinging=!1}}))}setTransportValue(e,t){let a=this.opened.get(e)||0;a+=t?1:-1,this.opened.set(e,a),this.dispatchEvent("change",this.opened)}setTransportOpened(e){return this.setTransportValue(e,!0)}setTransportClosed(e){return this.setTransportValue(e,!1)}}const Z=new N,j=(0,v.Z)();var q=a(6654);class G{setManagers(e){Object.assign(this,e)}}var H=a(3127),W=a(3989),z=a(5466);let K;function J(e){return null!=K?K:K=function(e){return t=this,a=void 0,n=function*(){const t=(0,z.$)((0,I.kg)("STORAGES-LOADER")),a=Object.keys(e),s=a.map((a=>{const s=e[a].getAll();return t(s,"storage "+a)})),n={},i=yield Promise.all(s);for(let e=0,t=a.length;e({storage:this.storages[e],results:t[e]})))},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}}class Q extends G{getState(){return this.apiManager.invokeApi("account.getPassword").then((e=>e))}updateSettings(e={}){return this.getState().then((t=>{let a,s;const n={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};a=e.currentPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const i=t.new_algo,r=new Uint8Array(i.salt1.length+32);return w(r),r.set(i.salt1,0),i.salt1=r,s=e.newPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([a,s]).then((e=>(n.password=e[0],n.new_settings.new_algo=i,n.new_settings.new_password_hash=e[1],this.apiManager.invokeApi("account.updatePasswordSettings",n))))}))}getInputCheckPassword(e,t){return this.cryptoWorker.invokeCrypto("computeSRP",e,t,!1)}check(e,t,a={}){return this.getInputCheckPassword(e,t).then((e=>this.apiManager.invokeApi("auth.checkPassword",{password:e},a).then((e=>("auth.authorization"===e._&&this.apiManager.setUser(e.user),e)))))}confirmPasswordEmail(e){return this.apiManager.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return this.apiManager.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return this.apiManager.invokeApi("account.cancelPasswordEmail")}}var Y=a(6848),X=a(5471);class ee extends G{constructor(){super(...arguments),this.contexts=new Map,this.links={},this.log=(0,I.kg)("RD",void 0,!0)}saveContext(e,t,a){[a,e]=this.getContexts(e),a||(a=new Set,this.contexts.set(e,a)),this.links[T(e)]=e;for(const e of a)if((0,Y.Z)(e,t))return;a.add(t)}getReferenceByLink(e){return this.links[T(e)]}getContexts(e){return[this.contexts.get(e)||(e=this.getReferenceByLink(e)||e,this.contexts.get(e)),e]}getContext(e){const t=this.getContexts(e);return t[0]?[t[0].values().next().value,t[1]]:void 0}deleteContext(e,t,a){if([a,e]=this.getContexts(e),a)for(const s of a)if((0,Y.Z)(s,t))return a.delete(s),a.size||(this.contexts.delete(e),delete this.links[T(e)]),!0;return!1}refreshReference(e,t){if(this.log("refreshReference: start",e.slice(),t),!t){const a=this.getContext(e);if(!a)return this.log("refreshReference: got no context for reference:",e.slice()),Promise.reject("NO_CONTEXT");[t,e]=a}let a;switch(null==t?void 0:t.type){case"message":a=this.appMessagesManager.reloadMessages(t.peerId,t.messageId,!0);break;case"emojiesSounds":a=this.refreshEmojiesSoundsPromise||this.appStickersManager.getAnimatedEmojiSounds(!0).then((()=>{this.refreshEmojiesSoundsPromise=void 0}));break;case"userFull":a=Promise.resolve(this.appProfileManager.getProfile(t.userId,!0));break;case"customEmoji":a=this.appEmojiManager.getCustomEmojiDocuments([t.docId]);break;case"attachMenuBotIcon":a=this.appAttachMenuBotsManager.getAttachMenuBot(t.botId,!0);break;case"wallPaper":a=this.appThemesManager.getWallPaperById(t.wallPaperId);break;default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const s=T(e);return this.log("refreshReference: refreshing reference:",s),a.then((()=>{const a=T(e);if(this.log("refreshReference: refreshed, reference before:",s,"after:",a),s!==a)return e;this.deleteContext(e,t);const n=this.getContext(e);if(n)return this.refreshReference(e,n[0]);throw this.log.error("refreshReference: no new context, reference before:",s,"after:",a,t),(0,X.Z)("NO_NEW_CONTEXT")}))}}var te=a(7298),ae=a(7381),se=a(252),ne=a(7625),ie=a(6519);function re(e,t){if(!e)return t;for(var a in e)t.hasOwnProperty(a)||delete e[a];for(var a in t)e[a]=t[a];return e}var oe=a(2790),pe=a(3781),de=a(3385),fe=a(5880),ce=a(8050),le=a(2946);function me(e){var t,a;const s=[e.fromId,e.viaBotId,e.fwdFromId],n=e.media;if(n){const e=n.user_id;void 0!==e&&s.push(e.toPeerId());const t=n.results,a=null==t?void 0:t.recent_voters;(null==a?void 0:a.length)&&s.push(...a.map((e=>e.toPeerId())))}const i=null===(t=e.reactions)||void 0===t?void 0:t.recent_reactions;(null==i?void 0:i.length)&&s.push(...i.map((e=>(0,le.Z)(e.peer_id))));const r=e.action;if(r){const e=[...r.users||[],r.user_id,r.inviter_id];s.push(...e.filter(Boolean).map((e=>e.toPeerId())));const t=[r.channel_id,r.chat_id];s.push(...t.filter(Boolean).map((e=>e.toPeerId(!0))))}const o=null===(a=e.replies)||void 0===a?void 0:a.recent_repliers;return(null==o?void 0:o.length)&&s.push(...o.map((e=>(0,le.Z)(e)))),new Set(s.filter(Boolean))}var ge=a(8027);function he(e,t,a){return e[t]=a}var ue=a(8938);const ye=void 0;class _e extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e){this.allDialogsLoaded={},this.pinnedOrders={};for(const e of o.DZ)this.pinnedOrders[e]=[]}else{this.storage.clear(),this.allDialogsLoaded={},this.saveAllDialogsLoaded(),this.pinnedOrders=Object.assign({},this.pinnedOrders);for(const e of o.DZ)this.resetPinnedOrder(e);this.savePinnedOrders()}this.forumTopics=new Map,this.folders={},this.dialogsOffsetDate={},this.dialogsNum=0,this.dialogsIndex=new ae.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0}),this.cachedResults={query:"",count:0,dialogs:[],folderId:0}},this.onUpdateFolderPeers=e=>{e.folder_peers.forEach((e=>{var t;const{folder_id:a,peer:s}=e,n=this.appPeersManager.getPeerId(s),i=this.dropDialog(n)[0];i&&((null===(t=i.pFlags)||void 0===t?void 0:t.pinned)&&this.handleDialogUnpinning(i,a),i.folder_id=a,this.generateIndexForDialog(i),this.pushDialog({dialog:i})),this.appMessagesManager.scheduleHandleNewDialogs(n,i)}))},this.onUpdateDialogPinned=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:o.J$,s=this.appPeersManager.getPeerId(e.peer.peer),n=this.getDialogOnly(s);this.handleDialogTogglePinned(n,e.pFlags.pinned,a)},this.onUpdateChannelPinnedTopic=e=>{const t=e.channel_id.toPeerId(!0),a=(0,pe.Z)(e.topic_id),s=this.getForumTopic(t,a);s&&this.handleDialogTogglePinned(s,e.pFlags.pinned,this.getFilterIdForForum(s))},this.onUpdatePinnedDialogs=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:o.J$;e.order?this.handleDialogsPinned(a,e.order.map((e=>this.appPeersManager.getPeerId(e.peer)))):this.apiManager.invokeApi("messages.getPinnedDialogs",{folder_id:a}).then((e=>{this.applyDialogs(e),this.handleDialogsPinned(a,e.dialogs.map((e=>e.peerId)))}))},this.onUpdateChannelPinnedTopics=e=>{return t=this,a=void 0,n=function*(){const t=e.channel_id.toPeerId(!0);if(!this.forumTopics.get(t))return;const a=t;if(e.order){const t=e.order.map((e=>(0,pe.Z)(e)));this.handleDialogsPinned(a,t)}else{const e=yield this.apiManager.getLimit("topicPin",!0),s=this.apiManager.invokeApi("channels.getForumTopics",{channel:this.appChatsManager.getChannelInput(t.toChatId()),limit:e,offset_date:0,offset_id:0,offset_topic:0}),n=(yield this.processTopics(t,s)).topics.filter((e=>e.pFlags.pinned));this.handleDialogsPinned(a,n.map((e=>e.id)))}},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}}after(){this.clear(!0),this.rootScope.addEventListener("language_change",(()=>{const e=this.appUsersManager.getSelf().id.toPeerId(!1);if(this.getDialogOnly(e)){const t=this.appPeersManager.getPeerSearchText(e);this.dialogsIndex.indexObject(e,t)}}));const e=e=>{const t=this.getCachedDialogs(!1);for(let a=0;a{const e=this.getCachedDialogs(!1);for(const e in this.folders)+e>1&&delete this.folders[e];for(let t=0;t{const t=this.getCachedDialogs(!1),a=this.getDialogIndexKeyByFilterId(e.id);for(let e=0;e{this.processChangedUnreadOrUnmuted(e.peerId)})),this.rootScope.addEventListener("chat_update",(e=>{const t=this.appChatsManager.getChat(e),a=e.toPeerId(!0);t.pFlags.left&&this.getDialogOnly(a)&&this.dropDialogOnDeletion(a)})),this.rootScope.addEventListener("chat_toggle_forum",(({chatId:e,enabled:t})=>{const a=e.toPeerId(!0);t||this.flushForumTopicsCache(a),this.processChangedUnreadOrUnmuted(a)})),this.apiUpdatesManager.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updateChannelPinnedTopic:this.onUpdateChannelPinnedTopic,updatePinnedDialogs:this.onUpdatePinnedDialogs,updateChannelPinnedTopics:this.onUpdateChannelPinnedTopics}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("dialogs")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.dialogs=this.storage.getCache();for(const t of o.DZ){const a=e.pinnedOrders[t];if(!a)continue;const s=this.getPinnedOrders(t);s.splice(0,s.length,...a)}t.length&&W.Z.freezeSaving(this.setDialogsFromState.bind(this,t),["chats","dialogs","messages","users"]),this.allDialogsLoaded=e.allDialogsLoaded||{},t.length&&this.appDraftsManager.addMissedDialogs()}))}setDialogsFromState(e){for(let t=0,a=e.length;tthis.allDialogsLoaded[e]))&&(this.allDialogsLoaded[void 0]=!0),this.saveAllDialogsLoaded())}saveAllDialogsLoaded(){this.appStateManager.pushToState("allDialogsLoaded",this.allDialogsLoaded)}handleDialogUnpinning(e,t){delete e.pFlags.pinned,(0,M.Z)(this.getPinnedOrders(t),this.isFilterIdForForum(t)?e.id:e.peerId),this.savePinnedOrders()}savePinnedOrders(){this.appStateManager.pushToState("pinnedOrders",this.pinnedOrders)}resetPinnedOrder(e){this.getPinnedOrders(e).length=0}getPinnedOrders(e){let t=this.pinnedOrders[e];return!t&&this.isFilterIdForForum(e)&&((0,ge.Z)(this.pinnedOrders,[e]),t=this.pinnedOrders[e]=[]),t}isDialogPinned(e,t){const a=this.filtersStorage.getFilter(t);let s;return s=a?-1!==a.pinnedPeerIds.indexOf(e):!!this.getDialogOnly(e).pFlags.pinned,s}getOffsetDate(e){const t=this.dialogsOffsetDate[e]||0;return e!==ye||t?t:Math.min(...Array.from(o.DZ).sort(((e,t)=>e-t)))}generateFolder(e){const t={dialogs:[],id:e,unreadMessagesCount:0,unreadPeerIds:new Set,unreadUnmutedPeerIds:new Set};return(0,ge.Z)(t,["dispatchUnreadTimeout"]),t}getFolder(e){var t,a;return null!==(t=(a=this.folders)[e])&&void 0!==t?t:a[e]=this.generateFolder(e)}isFilterIdForForum(e){return e&&e<0}getFilterIdForForum(e){return e.peerId}getDialogKey(e){return this.isTopic(e)?e.id:e.peerId}getFolderDialogs(e,t=!0){if(e===ye)return this.getCachedDialogs(t);const a=this.getFolder(e);return this.isFilterIdForForum(e)?t?a.dialogs.filter((e=>!e.pFlags.hidden)):a.dialogs:t?a.dialogs.filter((e=>void 0===e.migratedTo)):a.dialogs}getNextDialog(e,t,a){const s=this.getFolderDialogs(a,!0);let n;if(e){const a=s.findIndex((t=>t.peerId===e));-1!==a&&(n=s[t?a+1:a-1])}else t&&(n=s[0]);return n}getDialogIndexKeyByFilterId(e){if(this.isFilterIdForForum(e))return(0,de.Z)();if(o.DZ.has(e))return(0,de.Z)(e);const t=this.filtersStorage.getFilter(e);return(0,de.Z)(t.localId)}isDialogUnmuted(e){return!this.appNotificationsManager.isPeerLocalMuted({peerId:e.peerId,respectType:!0,threadId:this.isTopic(e)?e.id:void 0})}getFolderUnreadCount(e){const t=this.getFolder(e);return{unreadUnmutedCount:t.unreadUnmutedPeerIds.size,unreadCount:t.unreadPeerIds.size}}getCachedDialogs(e){const t=Array.from(o.DZ).map((t=>this.getFolderDialogs(t,e)));return[].concat(...t)}setDialogIndexInFilter(e,t,a){var s,n;let i;const r=this.isTopic(e),p=r||o.DZ.has(a.id);if(this.filtersStorage.testDialogForFilter(e,a)){const t=r?this.getPinnedOrders(this.getFilterIdForForum(e)):a.pinnedPeerIds,o=this.getDialogKey(e),d=t.indexOf(o);i=-1!==d?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(t.length-1-d),!0):(null===(s=e.pFlags)||void 0===s?void 0:s.pinned)||p?this.generateIndexForDialog(e,!0,void 0,!p):null!==(n=(0,ce.Z)(e))&&void 0!==n?n:this.generateIndexForDialog(e,!0)}return he(e,t,i)}getDialog(e,t,a,s=!0){const n=[];a&&(t=e),void 0===t?n.push(...Array.from(o.DZ).map((e=>this.getFolder(e).dialogs))):n.push(this.getFolderDialogs(t,!1));const i=a?e=>e.id===a:t=>t.peerId===e;for(const e of n){let t=0,a=0;for(let n=e.length;tt.id===e.id:t=>t.peerId===e.peerId,d=r.findIndex(p),f=r[d],c=this.getDialogIndex(f,i);a&&n>o.Zi&&(a=void 0);const l=a?void 0:this.setDialogIndexInFilter(e,i,t);return c!==l&&(!!c!=!!l&&this.prepareFolderUnreadCountModifyingByDialog(n,e,!!l),-1!==d&&r.splice(d,1),l&&(0,ie.Z)(r,e,(e=>this.getDialogIndex(e,i)),-1),!0)}prepareDialogUnreadCountModifying(e,t){const a=this.isTopic(e),s=[],n=a?this.getFilterIdForForum(e):e.folder_id;if(s.push(this.prepareFolderUnreadCountModifyingByDialog(n,e,t)),!a){const a=this.filtersStorage.getFilters();for(const n in a){const i=a[n];this.filtersStorage.testDialogForFilter(e,i)&&s.push(this.prepareFolderUnreadCountModifyingByDialog(i.id,e,t))}}return()=>!t&&s.forEach((e=>e()))}prepareFolderUnreadCountModifyingByDialog(e,t,a){const s=this.appMessagesManager.getDialogUnreadCount(t),n=this.isDialogUnmuted(t);if(void 0===a)return()=>{const a=this.appMessagesManager.getDialogUnreadCount(t),n=this.isDialogUnmuted(t),i=a-s;this.modifyFolderUnreadCount(e,i,!!a,a&&n,t)};{const i=a?s:-s;this.modifyFolderUnreadCount(e,i,!!s,s&&n,t)}}modifyFolderUnreadCount(e,t,a,s,n){var i;const{peerId:r}=n,o=this.appPeersManager.isForum(r),p=this.isTopic(n);if(o&&!p){const i=this.getForumUnreadCount(r);if(i instanceof Promise)return void i.then((({count:t,hasUnmuted:a})=>{n=this.getDialogOnly(r);const s=this.getFolder(e);n&&this.appPeersManager.isForum(r)&&s&&s.dialogs.some((e=>e.peerId===r))&&this.modifyFolderUnreadCount(e,0,!1,!1,n)}));t=0,a=i.count>0,s=i.hasUnmuted}const d=this.getFolder(e);t&&(d.unreadMessagesCount=Math.max(0,d.unreadMessagesCount+t));const f=this.getDialogKey(n);a?d.unreadPeerIds.add(f):d.unreadPeerIds.delete(f),s?d.unreadUnmutedPeerIds.add(f):d.unreadUnmutedPeerIds.delete(f),null!==(i=d.dispatchUnreadTimeout)&&void 0!==i||(d.dispatchUnreadTimeout=E.Z.setTimeout((()=>{d.dispatchUnreadTimeout=void 0;const e=Object.assign({},d);delete e.dialogs,this.rootScope.dispatchEvent("folder_unread",e),p&&this.processChangedUnreadOrUnmuted(r)}),0))}processChangedUnreadOrUnmuted(e){const t=this.getDialogOnly(e);t&&(this.processDialogForFilters(t),this.prepareDialogUnreadCountModifying(t)(),this.rootScope.dispatchEvent("dialog_unread",{peerId:e,dialog:t}))}generateIndexForDialog(e,t,a,s){var n;if(!t)return;const i=this.isTopic(e);let r,o=0;if(e.pFlags.hidden)o=this.generateDialogPinnedDateByIndex(4095),r=!0;else if(e.pFlags.pinned&&!s)o=this.generateDialogPinnedDate(e),r=!0;else{if(a||(a=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),o=(null==a?void 0:a.date)||o,!i){const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!o||e.date&&e.date>o)&&(o=e.date)}}"draftMessage"===(null===(n=e.draft)||void 0===n?void 0:n._)&&e.draft.date>o&&(o=e.draft.date)}o||(o=(0,te.Z)(!0));const p=this.generateDialogIndex(o,r);if(t)return p;he(e,(0,de.Z)(e.folder_id),p)}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.isTopic(e),a=this.getPinnedOrders(t?this.getFilterIdForForum(e):e.folder_id),s=this.getDialogKey(e);let n=a.indexOf(s);return-1===n&&(a.unshift(s),n=0,t||this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(a.length-1-n)}setDialogToState(e){if(this.isTopic(e))return;const{peerId:t,pts:a}=e,s=this.appMessagesManager.getHistoryStorage(t),n=this.appMessagesManager.getHistoryMessagesStorage(t),i=s.history.slice;let r;for(let e=0,a=i.length;e{"dialogFolder"===t._&&e.dialogs.splice(a,1)})),(0,ue.Z)(s),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const n=new Map;s.forEach((e=>{var t,s;const i=this.appPeersManager.getPeerId(e.peer);let r=e.top_message;const o=this.appMessagesManager.pendingTopMsgs[i];if(o){const t=this.appMessagesManager.getMessageByPeer(i,o),a=this.appMessagesManager.getMessageByPeer(i,r);(!r||t&&(!a||(null==t?void 0:t.date)>(null==a?void 0:a.date)))&&(e.top_message=r=o,this.appMessagesManager.getHistoryStorage(i).maxId=o)}if(r||"draftMessage"===(null===(t=e.draft)||void 0===t?void 0:t._)){if(this.saveDialog({dialog:e})){const t=(e=>{let t=n.get(e);return t||n.set(e,t={}),t})(i);a?(null!==(s=t.topics)&&void 0!==s?s:t.topics=new Map).set(e.id,e):t.dialog=e}}else this.dropDialogWithEvent(i,a?this.getDialogKey(e):void 0);const p=this.appMessagesManager.getUpdateAfterReloadKey(i,a?this.getDialogKey(e):void 0),d=this.appMessagesManager.newUpdatesAfterReloadToHandle[p];if(void 0!==d){for(const e of d)d.delete(e),this.apiUpdatesManager.saveUpdate(e);d.size||delete this.appMessagesManager.newUpdatesAfterReloadToHandle[p]}})),n.size&&this.rootScope.dispatchEvent("dialogs_multiupdate",n)}getDialogOffsetDate(e){const t=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message);return(null==t?void 0:t.date)||0}canSaveDialogByPeerId(e){if(e.isAnyChat()){const t=this.appChatsManager.getChat(e.toChatId());if("channelForbidden"===t._||t.pFlags.left)return!1}return!0}saveDialog({dialog:e,folderId:t,ignoreOffsetDate:a,saveGlobalOffset:s}){var n,i;const r=this.isTopic(e),p=!r,d=r?e.id=(0,pe.Z)(e.id):void 0;r||null!=t||(t=null!==(n=e.folder_id)&&void 0!==n?n:o.J$);const f=this.appPeersManager.getPeerId(e.peer);if(!f)return console.error("saveConversation no peerId???",e,t),!1;if(r||"dialog"===e._||console.error("saveConversation not regular dialog",e,Object.assign({},e)),p&&!this.canSaveDialogByPeerId(f))return!1;const c=this.appPeersManager.isChannel(f)?f.toChatId():o.NM;if(p){const e=this.appPeersManager.getPeerSearchText(f);this.dialogsIndex.indexObject(f,e)}const l=this.getDialogOrTopic(f,d);let m,g;if(e.top_message){m=(0,pe.Z)(e.top_message);const t=(null==l?void 0:l.top_message)&&this.appMessagesManager.getMessageByPeer(f,l.top_message);(null===(i=null==t?void 0:t.pFlags)||void 0===i?void 0:i.is_outgoing)&&l.top_message>=m&&(m=l.top_message),g=this.appMessagesManager.getMessageByPeer(f,m)}else m=this.appMessagesManager.generateTempMessageId(f),g={_:"message",id:m,mid:m,from_id:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(!1)),peer_id:this.appPeersManager.getOutputPeer(f),deleted:!0,pFlags:{out:!0},date:0,message:""},this.appMessagesManager.saveMessages([g],{isOutgoing:!0});if((null==g?void 0:g.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,g),p&&!c&&f.isAnyChat()){const t=this.appChatsManager.getChat(f.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const a=this.appPeersManager.getPeerId(t.migrated_to);this.appMessagesManager.migratedFromTo[f]=a,this.appMessagesManager.migratedToFrom[a]=f,e.migratedTo=a}}if(e.top_message=m,e.read_inbox_max_id=(0,pe.Z)(l&&!e.read_inbox_max_id?l.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=(0,pe.Z)(l&&!e.read_outbox_max_id?l.read_outbox_max_id:e.read_outbox_max_id),p&&void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=l?l.folder_id:t),e.draft=this.appDraftsManager.saveDraft({peerId:f,threadId:d,draft:e.draft}),e.peerId=f,g&&g.pFlags.is_outgoing){const t=g.pFlags.out;m>e[t?"read_outbox_max_id":"read_inbox_max_id"]?(g.pFlags.unread=!0,e.unread_count||t||++e.unread_count):delete g.pFlags.unread}const h=this.appMessagesManager.getHistoryStorage(f,d),u=h.history.slice;if(u.length?u.isEnd(se.D.Bottom)||(h.history.insertSlice([m]).setEnd(se.D.Bottom),h.count||(h.count=1),this.appMessagesManager.mergeReplyKeyboard(h,g)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:f})):(h.history.unshift(m),h.count||(h.count=1),this.appMessagesManager.mergeReplyKeyboard(h,g)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:f})),h.maxId=m,h.readMaxId=e.read_inbox_max_id,h.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:f,threadId:r?e.id:void 0,settings:e.notify_settings}),p&&c&&e.pts&&this.apiUpdatesManager.addChannelState(c,e.pts),this.generateIndexForDialog(e),l){const t=this.dialogsStorage.prepareDialogUnreadCountModifying(l);re(l,e),t()}return this.pushDialog({dialog:e,offsetDate:null==g?void 0:g.date,ignoreOffsetDate:a,saveGlobalOffset:s}),r&&this.processTopicUpdate(e,l),!0}processTopicUpdate(e,t){if(!t)return;const{peerId:a,id:s}=e,n=e.icon_emoji_id!==t.icon_emoji_id,i=e.title!==t.title,r=n||i;n&&this.rootScope.dispatchEvent("avatar_update",{peerId:a,threadId:s}),r&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:a,threadId:s})}getDialogs(e){const{query:t="",offsetIndex:a,limit:s=20,filterId:n=o.J$,skipMigrated:i=!1}=e,r=this.isFilterIdForForum(n);if(!r&&!o.DZ.has(n)){const t=[],a=this.appUsersManager.fillContacts();a.cached||t.push(a.promise);const s=this.filtersStorage.reloadMissingPeerIds(n);if(s&&t.push(s),t.length)return Promise.all(t).then((()=>this.getDialogs(e)))}const p=o.DZ.has(n)&&!this.getOffsetDate(n)||r?n:ye;let d=this.getFolderDialogs(n,i);const f=this.getDialogIndexKeyByFilterId(n);if(t&&!r){if(!s||this.cachedResults.query!==t||this.cachedResults.folderId!==n){this.cachedResults.query=t,this.cachedResults.folderId=n;const e=this.dialogsIndex.search(t),a=[];for(const t in this.dialogs){const s=this.dialogs[t];e.has(s.peerId)&&s.folder_id===n&&a.push(s)}a.sort(((e,t)=>this.getDialogIndex(t,f)-this.getDialogIndex(e,f))),this.cachedResults.dialogs=a,this.cachedResults.count=a.length}d=this.cachedResults.dialogs}else this.cachedResults.query="";let c=0;if(a>0)for(let e=d.length;cthis.getDialogIndex(d[c],f));++c);const l=this.isDialogsLoaded(p),m=d.length>=c+s;if(t||l||m){const e=d.slice(c,c+s);return{dialogs:e,count:l?d.length:null,isTopEnd:d.length&&(e[0]&&e[0]===d[0]||this.getDialogIndex(d[0],f)=d.length}}return this.appMessagesManager.getTopMessages({limit:s,folderId:p}).then((e=>{if(i&&(d=this.getFolderDialogs(n,i)),c=0,a>0)for(let e=d.length;cthis.getDialogIndex(d[c],f));++c);const t=d.slice(c,c+s);return{dialogs:t,count:void 0===e.count?d.length:e.count,isTopEnd:d.length&&(t[0]&&t[0]===d[0]||this.getDialogIndex(d[0],f){const t={},a=[];for(const[e,n]of s.getTopicPromises)t[e]=n,a.push((0,oe.Z)(e));s.getTopicPromises.clear();const n=()=>{for(const e in t)t[e].resolve(void 0),s.deletedTopics.add(+e)};if(this.getForumTopicsCache(e)===s)return this.apiManager.invokeApi("channels.getForumTopicsByID",{channel:this.appChatsManager.getChannelInput(e.toChatId()),topics:a}).then((a=>{if(this.getForumTopicsCache(e)===s)return this.applyDialogs(a,e),a.topics.forEach((a=>{"forumTopic"===a._&&(t[a.id].resolve(a),delete t[e])})),a}),(()=>{})).then((()=>{n(),s.getTopicsPromise=void 0,s.getTopicPromises.size&&this.getForumTopicById(e)}));n()}))),n||s.getTopicsPromise}getForumTopic(e,t){var a;const s=this.forumTopics.get(e);return null===(a=null==s?void 0:s.topics)||void 0===a?void 0:a.get(t)}getForumTopicOrReload(e,t){var a;const s=this.getForumTopic(e,t);if(s)return s;const n=this.getForumTopicsCache(e);return(null===(a=null==n?void 0:n.deletedTopics)||void 0===a?void 0:a.has(t))?void 0:this.getForumTopicById(e,t)}processTopics(e,t){return(0,q.Z)(t,(t=>{"pts"in t&&this.apiUpdatesManager.addChannelState(e.toChatId(),t.pts);const a=this.appPeersManager.getOutputPeer(e);return t.topics=t.topics.map((e=>{if("forumTopicDeleted"!==e._)return e.peer=a,e.id=(0,pe.Z)(e.id),e})).filter(Boolean),t}))}processTopicsPromise(e,t){return t.then((t=>(this.processTopics(e,t),t)))}getForumUnreadCount(e){if(!this.appPeersManager.isForum(e))return;const t=this.getFolder(e),a=t.dialogs.length>=20||this.isDialogsLoaded(e)?t.dialogs.slice(0,20):(0,q.Z)(this.getDialogs({filterId:e,limit:20}),(e=>e.dialogs));return(0,q.Z)(a,(e=>({count:e.reduce(((e,t)=>e+ +!!t.unread_count),0),hasUnmuted:e.some((e=>e.unread_count&&this.isDialogUnmuted(e)))})))}handleDialogTogglePinned(e,t,a){e&&(t?e.pFlags.pinned=!0:this.handleDialogUnpinning(e,a),this.generateIndexForDialog(e)),this.appMessagesManager.scheduleHandleNewDialogs(e.peerId,e)}handleDialogsPinned(e,t){const a=this.isFilterIdForForum(e);this.resetPinnedOrder(e),this.getPinnedOrders(e).push(...t),this.savePinnedOrders(),t.reverse();const s={};t.forEach((t=>{s[t]=!0;const n=a?e:t,i=a?t:void 0,r=this.getDialogOrTopic(n,i);this.appMessagesManager.scheduleHandleNewDialogs(n,r),r&&(r.pFlags.pinned=!0,this.generateIndexForDialog(r))}));const n=this.getFolderDialogs(e,!1);for(const e of n){if(!e.pFlags.pinned)break;s[this.getDialogKey(e)]||(delete e.pFlags.pinned,this.generateIndexForDialog(e),this.appMessagesManager.scheduleHandleNewDialogs(e.peerId,e))}}}var ve=a(8479),Pe=a(4064),be=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Me=[["pinned_peers","pinnedPeerIds"],["exclude_peers","excludePeerIds"],["include_peers","includePeerIds"]],Ie=o.DZ.size,Se={_:"dialogFilter",pFlags:{},flags:0,id:0,title:"",exclude_peers:[],include_peers:[],pinned_peers:[],excludePeerIds:[],includePeerIds:[],pinnedPeerIds:[]};class Ce extends G{constructor(){super(...arguments),this.clear=e=>{if(e){this.filters={},this.filtersArr=[],this.reloadedPeerIds=new Set,this.localFilters={};for(const e of o.DZ)this.localFilters[e]=this.generateLocalFilter(e)}else this.reloadedPeerIds.clear(),this.clearFilters();this.localId=o.Gu},this.onUpdateDialogFilter=e=>{e.filter?this.saveDialogFilter(e.filter):this.filters[e.id]&&(this.rootScope.dispatchEvent("filter_delete",this.filters[e.id]),delete this.filters[e.id],(0,Pe.Z)(this.filtersArr,(t=>t.id===e.id))),this.pushToState()},this.onUpdateDialogFilters=e=>{const t=(0,ve.Z)(this.filters);this.getDialogFilters(!0).then((e=>{for(const a in t){const t=+a;e.find((e=>e.id===t))||this.onUpdateDialogFilter({_:"updateDialogFilter",id:t})}this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e.map((e=>e.id))})}))},this.onUpdateDialogFilterOrder=e=>{const t=e.order.slice();t.includes(o.Zi)||t.splice(t[0]===o.J$?1:0,0,o.Zi),this.localId=o.Gu,t.forEach((e=>{const t=this.filters[e];delete t.localId,this.setLocalId(t)})),this.rootScope.dispatchEvent("filter_order",t),this.pushToState()}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateDialogFilter:this.onUpdateDialogFilter,updateDialogFilters:this.onUpdateDialogFilters,updateDialogFilterOrder:this.onUpdateDialogFilterOrder}),this.rootScope.addEventListener("premium_toggle",(()=>{this.onUpdateDialogFilters({_:"updateDialogFilters"})})),this.appStateManager.getState().then((e=>{this.prependFilters(e.filtersArr).map((e=>{this.saveDialogFilter(e,!1,!0)}))}))}prependFilters(e){e=e.slice();const t=this.localFilters[o.J$],a=this.localFilters[o.Zi],s=e.findIndex((e=>"dialogFilterDefault"===e._||e.id===o.J$));return-1!==s?e[s]=t:e.unshift(t),(0,Pe.Z)(e,(e=>e.id===o.Zi)),e.splice(e[0]===t?1:0,0,a),this.localId=o.Gu,e.forEach((e=>{delete e.localId})),e}generateLocalFilter(e){const t=Object.assign(Object.assign({},(0,ve.Z)(Se)),{id:e});return e===o.J$?t.pFlags.exclude_archived=!0:e===o.Zi&&(t.pFlags.exclude_unarchived=!0),o.DZ.has(e)&&(t.pinnedPeerIds=this.dialogsStorage.getPinnedOrders(e)),t}pushToState(){this.appStateManager.pushToState("filtersArr",this.filtersArr)}testDialogForFilter(e,t){if(!t)return!0;if(o.DZ.has(t.id))return e.folder_id===t.id&&this.dialogsStorage.canSaveDialogByPeerId(e.peerId);const a=e.peerId;if(!this.appMessagesManager.getDialogOnly(a))return!1;if(t.excludePeerIds.includes(a))return!1;if(t.includePeerIds.includes(a))return!0;const s=t.pFlags;if(s.exclude_archived&&e.folder_id===o.Zi)return!1;if(s.exclude_read&&!this.appMessagesManager.isDialogUnread(e))return!1;if(s.exclude_muted&&this.appNotificationsManager.isPeerLocalMuted({peerId:a})&&(!e.unread_mentions_count||!e.unread_count))return!1;if(this.appPeersManager.isAnyChat(a)){if(s.broadcasts&&this.appPeersManager.isBroadcast(a))return!0;if(s.groups&&this.appPeersManager.isAnyGroup(a))return!0}else{const e=a.toUserId();if(this.appUsersManager.isBot(e))return!!s.bots;if(s.non_contacts&&!this.appUsersManager.isContact(e))return!0;if(s.contacts&&this.appUsersManager.isContact(e))return!0}return!1}testDialogForFilterId(e,t){return this.testDialogForFilter(e,this.filters[t])}getFilter(e){return this.filters[e]}getFilters(){return this.filters}clearFilters(){const e=this.getFilters();for(const t in e)o.DZ.has(+t)||this.onUpdateDialogFilter({_:"updateDialogFilter",id:+t})}toggleDialogPin(e,t){return be(this,void 0,void 0,(function*(){const a=this.filters[t],s=a.pinnedPeerIds.indexOf(e),n=-1!==s;if(n&&(a.pinned_peers.splice(s,1),a.pinnedPeerIds.splice(s,1)),!n){if(a.pinned_peers.length>=(yield this.apiManager.getConfig()).pinned_infolder_count_max)return Promise.reject((0,X.Z)("PINNED_DIALOGS_TOO_MUCH"));a.pinned_peers.unshift(this.appPeersManager.getInputPeerById(e)),a.pinnedPeerIds.unshift(e)}return this.updateDialogFilter(a)}))}createDialogFilter(e,t){const a=Math.max(1,...Object.keys(this.filters).map((e=>+e)));return(e=(0,ve.Z)(e)).id=a+1,this.updateDialogFilter(e,void 0,t)}updateDialogFilter(e,t=!1,a=!1){const s=t?0:1;return this.apiManager.invokeApi("messages.updateDialogFilter",{flags:s,id:e.id,filter:t?void 0:this.getOutputDialogFilter(e)}).then((s=>{if(this.onUpdateDialogFilter({_:"updateDialogFilter",id:e.id,filter:t?void 0:e}),a){const t=[];for(const e in this.filters){const a=this.filters[e];++a.localId,t.push(a)}e.localId=o.Gu;const a=t.sort(((e,t)=>e.localId-t.localId)).map((e=>e.id));this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:a})}}))}updateDialogFiltersOrder(e){return this.apiManager.invokeApi("messages.updateDialogFiltersOrder",{order:e}).then((()=>{this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e})}))}getOutputDialogFilter(e){const t=(0,ve.Z)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){(0,ne.Z)(e.includePeerIds,((t,a)=>{e.pinnedPeerIds.includes(t)&&(e.include_peers.splice(a,1),e.includePeerIds.splice(a,1))}))}reloadMissingPeerIds(e,t="pinned_peers"){const a=this.getFilter(e),s=null==a?void 0:a[t];if(!(null==s?void 0:s.length))return;const n=s.filter((e=>{const t=this.appPeersManager.getPeerId(e),a=this.reloadedPeerIds.has(t),s=this.appMessagesManager.getDialogOnly(t);return!a&&!s}));if(!n.length)return;const i=n.map((e=>{const t=this.appPeersManager.getPeerId(e);return this.appMessagesManager.reloadConversation(e).then((e=>(this.reloadedPeerIds.add(t),e?void 0:t)))}));return Promise.all(i).then((e=>{(e=e.filter(Boolean)).length}))}getDialogFilters(e=!1){return be(this,void 0,void 0,(function*(){const t=Object.keys(this.filters);if(t.length>Ie&&!e)return t.map((e=>this.filters[e])).sort(((e,t)=>e.localId-t.localId));const a=yield this.apiManager.invokeApiSingle("messages.getDialogFilters");return this.prependFilters(a).map((t=>this.saveDialogFilter(t,e))).filter(Boolean)}))}getSuggestedDialogsFilters(){return this.apiManager.invokeApi("messages.getSuggestedDialogFilters")}saveDialogFilter(e,t=!0,a){"dialogFilterDefault"===e._&&(e=this.localFilters[o.J$]),(0,ue.Z)(e),o.DZ.has(e.id)||(Me.forEach((([t,a])=>{(0,ue.Z)(e),e[a]=e[t].map((e=>this.appPeersManager.getPeerId(e)))})),this.filterIncludedPinnedPeers(e),e.include_peers=e.pinned_peers.concat(e.include_peers),e.includePeerIds=e.pinnedPeerIds.concat(e.includePeerIds));const s=this.filters[e.id];return s?Object.assign(s,e):this.filters[e.id]=e,this.setLocalId(e),a||(t?this.rootScope.dispatchEvent("filter_update",e):s||this.rootScope.dispatchEvent("filter_new",e)),e}setLocalId(e){void 0!==e.localId?e.localId>=this.localId&&(this.localId=e.localId+1):(e.localId=this.localId++,(0,Pe.Z)(this.filtersArr,(t=>t.id===e.id)),this.filtersArr.push(e),this.pushToState())}isFilterIdAvailable(e){return be(this,void 0,void 0,(function*(){if(o.DZ.has(e))return!0;const t=yield this.apiManager.getLimit("folders");return this.filtersArr.filter((e=>!o.DZ.has(e.id))).slice(0,t).some((t=>t.id===e))}))}}var we=a(6690),ke=a(2821);function Ae(e,t){t.forEach((t=>{Object.getOwnPropertyNames(t.prototype).forEach((a=>{const s=Object.getOwnPropertyDescriptor(t.prototype,a)||Object.create(null);"constructor"!==a&&Object.defineProperty(e.prototype,a,s)}))}))}class De{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=(0,I.kg)("UPDATES",I.v9.Error|I.v9.Warn|I.v9.Log),this.debug=d.ZP,this.subscriptions={},this.processUpdateMessage=(e,t={})=>{const a={date:e.date,seq:e.seq,seqStart:e.seq_start};switch(this.debug&&this.log.debug("processUpdateMessage",e),e._){case"updatesTooLong":case"new_session_created":this.forceGetDifference();break;case"updateShort":this.processUpdate(e.update,a);break;case"updateShortMessage":case"updateShortChatMessage":{(0,ue.Z)(e),this.debug&&this.log.debug("updateShortMessage | updateShortChatMessage",Object.assign({},e));const t=e.pFlags.out,s=e.from_id||(t?this.appPeersManager.peerId:e.user_id),n=e.chat_id?e.chat_id.toPeerId(!0):e.user_id.toPeerId(!1)||this.appPeersManager.peerId;this.processUpdate({_:"updateNewMessage",message:{_:"message",pFlags:e.pFlags,id:e.id,from_id:this.appPeersManager.getOutputPeer(s.toPeerId()),peer_id:this.appPeersManager.getOutputPeer(n),date:e.date,message:e.message,fwd_from:e.fwd_from,reply_to:e.reply_to,entities:e.entities},pts:e.pts,pts_count:e.pts_count},a);break}case"updatesCombined":case"updates":this.appUsersManager.saveApiUsers(e.users,t.override),this.appChatsManager.saveApiChats(e.chats,t.override),e.updates.forEach((e=>{this.processUpdate(e,a)}));break;default:this.log.warn("Unknown update message",e)}},this._constructor(!1)}setProxy(){const e=this;this.updatesState=new Proxy(this.updatesState,{set:function(t,a,s){return t[a]=s,e.saveUpdatesState(),!0}})}saveUpdatesState(){const e=this.updatesState;this.appStateManager.pushToState("updates",{seq:e.seq,pts:e.pts,date:e.date})}popPendingSeqUpdate(){var e;const t=this.updatesState,a=t.seq+1,s=t.pendingSeqUpdates[a];if(!s)return!1;const n=s.updates;for(let e=0,t=n.length;e=t.syncPending.seqAwaiting&&(t.syncPending.ptsAwaiting?delete t.syncPending.seqAwaiting:this.clearStatePendingSync(t)),!0}popPendingPtsUpdate(e){const t=e?this.getChannelState(e):this.updatesState;if(!t.pendingPtsUpdates.length)return!1;t.pendingPtsUpdates.sort(((e,t)=>e.pts-t.pts));let a=t.pts,s=0,n=0;for(let e=0,i=t.pendingPtsUpdates.length;e=i.pts&&(s=i.pts,n=e)}if(!s)return!1;this.debug&&this.log.debug("pop pending pts updates",s,t.pendingPtsUpdates.slice(0,n+1)),t.pts=s;for(let e=0;e<=n;++e){const a=t.pendingPtsUpdates[e];this.saveUpdate(a)}return t.pendingPtsUpdates.splice(0,n+1),!t.pendingPtsUpdates.length&&t.syncPending&&(t.syncPending.seqAwaiting?delete t.syncPending.ptsAwaiting:this.clearStatePendingSync(t)),!0}forceGetDifference(){this.updatesState.syncLoading||this.getDifference()}processLocalUpdate(e){this.processUpdateMessage({_:"updateShort",update:e})}getDifference(e=!1){const t=this.updatesState,a=t.syncLoading;a||(t.pendingSeqUpdates={},t.pendingPtsUpdates=[]),this.clearStatePendingSync(t);const s=this.apiManager.invokeApi("updates.getDifference",{pts:t.pts,pts_total_limit:e?1200:void 0,date:t.date,qts:-1},{timeout:2147483647}).then((a=>{if(this.debug&&this.log.debug("Get diff result",a),"updates.differenceEmpty"===a._)return this.debug&&this.log.debug("apply empty diff",a.seq),t.date=a.date,void(t.seq=a.seq);if(e&&this.rootScope.dispatchEvent("state_synchronizing"),"updates.differenceTooLong"!==a._){this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),a.other_updates.forEach((e=>{switch(e._){case"updateChannelTooLong":case"updateNewChannelMessage":case"updateEditChannelMessage":return void this.processUpdate(e)}this.saveUpdate(e)})),a.new_messages.forEach((e=>{this.saveUpdate({_:"updateNewMessage",message:e,pts:t.pts,pts_count:0})}));const e="updates.difference"===a._?a.state:a.intermediate_state;t.seq=e.seq,t.pts=e.pts,t.date=e.date}else t.pts=a.pts,t.date=(Date.now()/1e3|0)+this.timeManager.getServerTimeOffset(),delete t.seq,this.channelStates={},this.log.warn("getDifference:",a._),this.onDifferenceTooLong();if("updates.differenceSlice"===a._)return this.getDifference();this.debug&&this.log.debug("finished get diff")}));return a||this.justAName(t,s),s}clearStatePendingSync(e){e.syncPending&&(clearTimeout(e.syncPending.timeout),e.syncPending=null)}getChannelDifference(e){const t=this.getChannelState(e),a=t.syncLoading;a||(t.pendingPtsUpdates=[]),this.clearStatePendingSync(t);const s=this.debug?this.log.bindPrefix("getChannelDifference-"+e):void 0,n=this.apiManager.invokeApi("updates.getChannelDifference",{channel:this.appChatsManager.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:1e3},{timeout:2147483647}).then((a=>{if(null==s||s.debug("diff result",a),t.pts="pts"in a?a.pts:void 0,t.lastDifferenceTime=Date.now(),"updates.channelDifferenceEmpty"!==a._){if("updates.channelDifferenceTooLong"===a._)return delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),null==s||s.debug("applying",a.other_updates.length,"channel other updates"),a.other_updates.forEach((e=>{this.saveUpdate(e)})),null==s||s.debug("applying",a.new_messages.length,"channel new messages"),a.new_messages.forEach((e=>{this.saveUpdate({_:"updateNewChannelMessage",message:e,pts:t.pts,pts_count:0})})),null==s||s.debug("apply channel diff",t.pts),"updates.channelDifference"===a._&&!a.pFlags.final)return this.getChannelDifference(e);null==s||s.debug("finished channel get diff")}}));return a||this.justAName(t,n,e),n}onDifferenceTooLong(){this.appUsersManager.clear(),this.appChatsManager.clear(),this.appMessagesManager.clear(),this.rootScope.dispatchEvent("state_cleared")}justAName(e,t,a){e.syncLoading=t,this.rootScope.dispatchEvent("state_synchronizing",a),t.then((()=>{e.syncLoading=null,this.rootScope.dispatchEvent("state_synchronized",a)}),(()=>{e.syncLoading=null}))}addChannelState(e,t){var a,s;if(!t)throw new Error("Add channel state without pts "+e);return null!==(a=(s=this.channelStates)[e])&&void 0!==a?a:s[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null}}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var a,s,n,i;let r;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":r=this.appPeersManager.getPeerId(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(r=e.channel_id,!(r in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(r=e.channel_id)}const{pts:o,pts_count:p}=e,d=r?this.getChannelState(r,o):this.updatesState;if(d.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!d.lastPtsUpdateTime||d.lastPtsUpdateTime{d.syncPending=null,d.syncLoading||(r?this.getChannelDifference(r):this.getDifference())}),6)}),d.syncPending.ptsAwaiting=!0,!1;if(o>d.pts)d.pts=o,f=!0,d.lastPtsUpdateTime=Date.now();else if(p)return!1;r&&t.date&&this.updatesState.date0){const a=t.seq,r=t.seqStart||a;if(r!==d.seq+1&&r>d.seq)return this.debug&&this.log.warn("Seq hole",d,null===(s=d.syncPending)||void 0===s?void 0:s.seqAwaiting),null!==(n=(i=d.pendingSeqUpdates)[r])&&void 0!==n||(i[r]={seq:a,date:t.date,updates:[]}),d.pendingSeqUpdates[r].updates.push(e),d.syncPending||(d.syncPending={timeout:E.Z.setTimeout((()=>{d.syncPending=null,d.syncLoading||this.getDifference()}),6)}),(!d.syncPending.seqAwaiting||d.syncPending.seqAwaiting{const t=this.getChannelState(e);t.syncLoading||t.lastDifferenceTime&&!(Date.now()-t.lastDifferenceTime>2500)||this.getChannelDifference(e)};null!==(a=n.interval)&&void 0!==a||(n.interval=E.Z.setInterval(i,3e3)),i()}unsubscribeFromChannelUpdates(e,t){const a=this.subscriptions[e];!(null==a?void 0:a.interval)||--a.count&&!t||(clearInterval(a.interval),a.interval=void 0,delete this.subscriptions[e])}attach(e){this.attached||(this.log("attach"),this.attached=!0,this.appStateManager.getState().then((({updates:t})=>{const a=this.appStateManager.newVersion;t&&t.pts&&t.date?(Object.assign(this.updatesState,t),this.log("will get difference",Object.assign({},t)),this.getDifference(!0)):(this.log("will get new state"),this.updatesState.syncLoading=new Promise((e=>{this.apiManager.invokeApi("updates.getState",{},{noErrorBox:!0}).then((t=>{this.updatesState.seq=t.seq,this.updatesState.pts=t.pts,this.updatesState.date=t.date,this.saveUpdatesState(),this.updatesState.syncLoading=null,e()}))}))),this.apiManager.setUpdatesProcessor(this.processUpdateMessage),this.setProxy(),a&&this.updatesState.syncLoading.then((()=>{return t=this,s=void 0,i=function*(){const t={en:"was updated to version",ru:"обновлён до версии"},s=e=>{fetch(`changelogs/${e}_${a.split(" ")[0]}.md`).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((s=>{const n=t[e]||t.en;s=`**Telegram Web${_.Z.suffix} ${n} ${a}**\n\n`+s;const i=[],r={_:"updateServiceNotification",entities:i,message:(0,ke.Z)(s,i),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(r)}))},n=(0,we.Z)([e,"en"]);for(const e of n)try{yield s(e);break}catch(e){}},new((n=void 0)||(n=Promise))((function(e,a){function r(e){try{p(i.next(e))}catch(e){a(e)}}function o(e){try{p(i.throw(e))}catch(e){a(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,o)}p((i=i.apply(t,s||[])).next())}));var t,s,n,i}))})))}}Ae(De,[p.Z,G]);class Ue extends G{constructor(){super(...arguments),this.savedAvatarURLs={}}after(){this.rootScope.addEventListener("avatar_update",(({peerId:e,threadId:t})=>{t||this.removeFromAvatarsCache(e)}))}isAvatarCached(e,t){const a=this.savedAvatarURLs[e];return void 0===t?!!a:!(!a||!a[t]||a[t]instanceof Promise)}removeFromAvatarsCache(e){this.savedAvatarURLs[e]&&delete this.savedAvatarURLs[e]}loadAvatar(e,t,a){var s,n;const i=null!==(s=(n=this.savedAvatarURLs)[e])&&void 0!==s?s:n[e]={};if(i[a])return i[a];{const s={_:"inputPeerPhotoFileLocation",pFlags:{},peer:this.appPeersManager.getInputPeerById(e),photo_id:t.photo_id},n={dcId:t.dc_id,location:s};"photo_big"===a&&(s.pFlags.big=!0,n.limitPart=524288);const r=this.apiFileManager.download(n);return i[a]=r.then((e=>i[a]=URL.createObjectURL(e)))}}}var Te=a(144),Ee=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class Fe extends G{after(){this.calls=new Map,i().IS_CALL_SUPPORTED&&this.apiUpdatesManager.addMultipleEventsListeners({updatePhoneCall:e=>{this.saveCall(e.phone_call)},updatePhoneCallSignalingData:e=>{this.rootScope.dispatchEvent("call_signaling",{callId:e.phone_call_id,data:e.data})}})}computeKey(e,t,a){return this.cryptoWorker.invokeCrypto("compute-dh-key",e,t,a)}saveCall(e){const t="phoneCallDiscarded"===e._,a=this.calls.get(e.id);return a?(re(a,e),t&&this.calls.delete(e.id),e=a):t||this.calls.set(e.id,e),this.rootScope.dispatchEvent("call_update",e),e}getCall(e){return this.calls.get(e)}getCallInput(e){const t=this.getCall(e);return{_:"inputPhoneCall",id:t.id,access_hash:t.access_hash}}savePhonePhoneCall(e){return this.appUsersManager.saveApiUsers(e.users),this.saveCall(e.phone_call)}generateDh(){return this.apiManager.invokeApi("messages.getDhConfig",{version:0,random_length:256}).then((e=>this.cryptoWorker.invokeCrypto("generate-dh",e)))}requestCall(e,t,a,s){return Ee(this,void 0,void 0,(function*(){const n=yield this.apiManager.invokeApi("phone.requestCall",{user_id:this.appUsersManager.getUserInput(e),protocol:t,video:s,random_id:(0,Te.d)(32),g_a_hash:a});return this.savePhonePhoneCall(n)}))}discardCall(e,t,a,s){return Ee(this,void 0,void 0,(function*(){if(!this.getCall(e))return;const n=yield this.apiManager.invokeApi("phone.discardCall",{video:s,peer:this.getCallInput(e),duration:t,reason:{_:a},connection_id:"0"});this.apiUpdatesManager.processUpdateMessage(n)}))}}var Re=a(7120),xe=a(2566);class Be extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.chats={};else for(const e in this.chats)if(e&&!this.peersStorage.isPeerNeeded(e.toPeerId(!0))){const t=this.chats[e];this.appUsersManager.modifyUsernamesCache(t,!1),this.storage.delete(e),delete this.chats[e]}},this.onChatUpdated=(e,t)=>{var a;this.apiUpdatesManager.processUpdateMessage(t),(null===(a=null==t?void 0:t.updates)||void 0===a?void 0:a.length)&&this.isChannel(e)&&this.rootScope.dispatchEvent("invalidate_participants",e)}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateChannelParticipant:e=>{this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e.channel_id))},updateChatDefaultBannedRights:e=>{const t=this.appPeersManager.getPeerId(e.peer).toChatId(),a=this.chats[t];a&&(a.default_banned_rights=e.default_banned_rights,this.rootScope.dispatchEvent("chat_update",t))}}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("chats")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.saveApiChats(t),this.peersStorage.addEventListener("peerNeeded",(e=>{e.isUser()||this.storage.getFromCache(e.toChatId())||this.storage.set({[e.toChatId()]:this.getChat(e.toChatId())})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{!e.isUser()&&this.storage.getFromCache(e.toChatId())&&this.storage.delete(e.toChatId())}))}))}saveApiChats(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiChat(e,t))))}saveApiChat(e,t){var a,s,n,i,r;if(!e||"chatEmpty"===e._)return;const o=this.chats[e.id];if(null!==(a=(r=e).pFlags)&&void 0!==a||(r.pFlags={}),e.pFlags.min&&void 0!==o)return;"channel"===e._&&void 0===e.participants_count&&void 0!==o&&o.participants_count&&(e.participants_count=o.participants_count),"chatPhotoEmpty"===(null===(s=e.photo)||void 0===s?void 0:s._)&&delete e.photo;const p=this.appUsersManager.setUsernameToCache(e,o),d=e.id.toPeerId(!0);if(void 0===o)this.chats[e.id]=e;else{const t=null===(n=o.photo)||void 0===n?void 0:n.photo_id,a=null===(i=e.photo)||void 0===i?void 0:i.photo_id,s=o.pFlags.forum!==e.pFlags.forum,r=t!==a||s,f=o.title!==e.title||p,c=o.pFlags.verified!==e.pFlags.verified||o.pFlags.scam!==e.pFlags.scam||o.pFlags.fake!==e.pFlags.fake;re(o,e),this.rootScope.dispatchEvent("chat_update",e.id),r&&this.rootScope.dispatchEvent("avatar_update",{peerId:d}),(f||c)&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:d}),s&&this.rootScope.dispatchEvent("chat_toggle_forum",{chatId:e.id,enabled:!!e.pFlags.forum})}this.peersStorage.isPeerNeeded(d)&&this.storage.set({[e.id]:e})}getChat(e){return this.chats[e]}hasRights(e,t,a,s){return(0,Re.Z)(this.getChat(e),t,a,s)}editChatDefaultBannedRights(e,t){const a=this.getChat(e);return a.default_banned_rights&&a.default_banned_rights.until_date===t.until_date&&(0,Y.Z)(a.default_banned_rights.pFlags,t.pFlags)?Promise.resolve():this.apiManager.invokeApi("messages.editChatDefaultBannedRights",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),banned_rights:t}).then(this.onChatUpdated.bind(this,e))}isChannel(e){const t=this.chats[e];return!(!t||"channel"!==t._&&"channelForbidden"!==t._)}isMegagroup(e){var t;const a=this.chats[e];return!!(null===(t=null==a?void 0:a.pFlags)||void 0===t?void 0:t.megagroup)}isForum(e){var t;const a=this.chats[e];return!!(null===(t=null==a?void 0:a.pFlags)||void 0===t?void 0:t.forum)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const a=this.getChat(e);return(!a||"channelForbidden"===a._||"chatForbidden"===a._||"chatEmpty"===a._||a.pFlags.left||a.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return t&&t.access_hash?{_:"inputChannel",channel_id:e,access_hash:t.access_hash||"0"}:{_:"inputChannelEmpty"}}getInputPeer(e){return this.isChannel(e)?this.getChannelInputPeer(e):this.getChatInputPeer(e)}getChatInputPeer(e){return{_:"inputPeerChat",chat_id:e}}getChannelInputPeer(e){return{_:"inputPeerChannel",channel_id:e,access_hash:this.getChat(e).access_hash||0}}hasChat(e,t){const a=this.chats[e];return(0,fe.Z)(a)&&(t||!a.pFlags.min)}getChatString(e){const t=this.getChat(e);return this.isChannel(e)?(this.isMegagroup(e)?"s":"c")+e+"_"+t.access_hash:"g"+e}createChannel(e){return this.apiManager.invokeApi("channels.createChannel",e).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}inviteToChannel(e,t){const a=this.getChannelInput(e),s=t.map((e=>this.appUsersManager.getUserInput(e)));return this.apiManager.invokeApi("channels.inviteToChannel",{channel:a,users:s}).then(this.onChatUpdated.bind(this,e))}createChat(e,t){return this.apiManager.invokeApi("messages.createChat",{users:t.map((e=>this.appUsersManager.getUserInput(e))),title:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}leaveChannel(e){return this.apiManager.invokeApi("channels.leaveChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}joinChannel(e){return this.apiManager.invokeApi("channels.joinChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}addChatUser(e,t,a=100){return this.apiManager.invokeApi("messages.addChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t),fwd_limit:a}).then(this.onChatUpdated.bind(this,e))}deleteChatUser(e,t){return this.apiManager.invokeApi("messages.deleteChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,this.appUsersManager.getSelf().id)}leave(e){return this.isChannel(e)?this.leaveChannel(e):this.leaveChat(e)}delete(e){return this.isChannel(e)?this.deleteChannel(e):this.deleteChat(e)}deleteChannel(e){return this.apiManager.invokeApi("channels.deleteChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}deleteChat(e){return this.apiManager.invokeApi("messages.deleteChat",{chat_id:e})}migrateChat(e){const t=this.getChat(e);return"channel"===t._?Promise.resolve(t.id):this.apiManager.invokeApi("messages.migrateChat",{chat_id:e}).then((t=>(this.onChatUpdated(e,t),t.updates.find((e=>"updateChannel"===e._)).channel_id)))}updateUsername(e,t,a){const s=this.apiManager.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t});return this.refreshChatAfterRequest(e,s,a)}editPhoto(e,t){const a={_:"inputChatUploadedPhoto",file:t};let s;return s=this.isChannel(e)?this.apiManager.invokeApi("channels.editPhoto",{channel:this.getChannelInput(e),photo:a}):this.apiManager.invokeApi("messages.editChatPhoto",{chat_id:e,photo:a}),s.then(this.onChatUpdated.bind(this,e))}editTitle(e,t){let a;return a=this.isChannel(e)?this.apiManager.invokeApi("channels.editTitle",{channel:this.getChannelInput(e),title:t}):this.apiManager.invokeApi("messages.editChatTitle",{chat_id:e,title:t}),a.then(this.onChatUpdated.bind(this,e))}editAbout(e,t){const a=e.toPeerId(!0);return this.apiManager.invokeApi("messages.editChatAbout",{peer:this.appPeersManager.getInputPeerById(a),about:t}).then((e=>(e&&this.rootScope.dispatchEvent("peer_bio_edit",a),e)))}editBanned(e,t,a){const s="object"!=typeof t?t:(0,xe.Z)(t);return this.apiManager.invokeApi("channels.editBanned",{channel:this.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(s),banned_rights:a}).then((n=>{if(this.onChatUpdated(e,n),"object"==typeof t){const n=Date.now()/1e3|0;this.apiUpdatesManager.processLocalUpdate({_:"updateChannelParticipant",channel_id:e,date:n,actor_id:void 0,qts:void 0,user_id:s,prev_participant:t,new_participant:Object.keys(a.pFlags).length?{_:"channelParticipantBanned",date:n,banned_rights:a,kicked_by:this.appUsersManager.getSelf().id,peer:this.appPeersManager.getOutputPeer(s),pFlags:{}}:void 0})}}))}clearChannelParticipantBannedRights(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{}})}kickFromChannel(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{view_messages:!0}})}kickFromChat(e,t){return this.isChannel(e)?this.kickFromChannel(e,t):this.deleteChatUser(e,t.toUserId())}resolveChannel(e){return this.apiManager.invokeApiSingle("channels.getChannels",{id:[{_:"inputChannel",channel_id:e,access_hash:"0"}]}).then((e=>{this.saveApiChats(e.chats)}))}togglePreHistoryHidden(e,t){return this.migrateChat(e).then((e=>this.apiManager.invokeApi("channels.togglePreHistoryHidden",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))))}toggleSignatures(e,t){return this.apiManager.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))}toggleNoForwards(e,t){return this.apiManager.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then(this.onChatUpdated.bind(this,e))}setChatAvailableReactions(e,t){const a=this.appProfileManager.getCachedFullChat(e);return a&&(a.available_reactions=t,this.rootScope.dispatchEvent("chat_full_update",e)),this.apiManager.invokeApi("messages.setChatAvailableReactions",{peer:this.getInputPeer(e),available_reactions:t}).then(this.onChatUpdated.bind(this,e))}getSendAs(e){return this.apiManager.invokeApiSingleProcess({method:"channels.getSendAs",params:{peer:this.getChannelInputPeer(e)},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),this.saveApiChats(e.chats),e.peers)})}importChatInvite(e){return this.apiManager.invokeApi("messages.importChatInvite",{hash:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}checkUsername(e,t){return this.apiManager.invokeApi("channels.checkUsername",{channel:this.getChannelInput(e),username:t})}getSponsoredMessage(e){return this.apiManager.invokeApiCacheable("channels.getSponsoredMessages",{channel:this.getChannelInput(e)},{cacheSeconds:300}).then((e=>{if("messages.sponsoredMessages"===e._){this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=e.messages.shift();e.messages.push(t)}return e}))}viewSponsoredMessage(e,t){return this.apiManager.invokeApiSingle("channels.viewSponsoredMessage",{channel:this.getChannelInput(e),random_id:t})}checkChatInvite(e){return this.apiManager.invokeApi("messages.checkChatInvite",{hash:e}).then((e=>(e.chat&&this.saveApiChat(e.chat,!0),e)))}toggleUsername(e,t,a){const s=this.apiManager.invokeApi("channels.toggleUsername",{channel:this.getChannelInput(e),username:t,active:a});return this.refreshChatAfterRequest(e,s)}reorderUsernames(e,t){const a=this.apiManager.invokeApi("channels.reorderUsernames",{channel:this.getChannelInput(e),order:t});return this.refreshChatAfterRequest(e,a)}deactivateAllUsernames(e,t){const a=this.apiManager.invokeApi("channels.deactivateAllUsernames",{channel:this.getChannelInput(e)});return this.refreshChatAfterRequest(e,a,t)}makeChannelPrivate(e){const t=[this.updateUsername(e,"",!0),this.deactivateAllUsernames(e,!0)],a=Promise.all(t).then((()=>!0));return this.refreshChatAfterRequest(e,a)}refreshChatAfterRequest(e,t,a){return a?t:t.then((t=>this.getChannels([e]).then((()=>t))))}getChannels(e){return this.apiManager.invokeApi("channels.getChannels",{id:e.map((e=>this.getChannelInput(e)))}).then((e=>{this.saveApiChats(e.chats)}))}toggleForum(e,t){return this.migrateChat(e).then((e=>this.apiManager.invokeApi("channels.toggleForum",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))))}editForumTopic(e){const{chatId:t,topicId:a,title:s,iconEmojiId:n,closed:i,hidden:r}=e;return this.apiManager.invokeApi("channels.editForumTopic",{channel:this.getChannelInput(t),topic_id:(0,oe.Z)(a),title:s,icon_emoji_id:n,closed:i,hidden:r}).then(this.onChatUpdated.bind(this,t))}createForumTopic(e){return t=this,a=void 0,n=function*(){const{chatId:t,title:a,iconColor:s,iconEmojiId:n}=e,i=yield this.appProfileManager.getChannelFull(t),r=i.default_send_as&&this.appPeersManager.getInputPeerById(this.appPeersManager.getPeerId(i.default_send_as));return this.apiManager.invokeApi("channels.createForumTopic",{channel:this.getChannelInput(t),title:a,icon_color:s,icon_emoji_id:n,random_id:(0,Te.a)(),send_as:r}).then((e=>{this.onChatUpdated(t,e);const a=e.updates.find((e=>"updateNewChannelMessage"===e._));return(0,pe.Z)(a.message.id)}))},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}updatePinnedForumTopic(e,t,a){return this.apiManager.invokeApi("channels.updatePinnedForumTopic",{channel:this.getChannelInput(e),topic_id:(0,oe.Z)(t),pinned:a}).then(this.onChatUpdated.bind(this,e))}}a(4762);var Ve,Oe=a(5953),Le=a(9005),Ne=a(6637),Ze=a(2423);function je(e,t){(0,Ne.Z)(e)||(e="https://"+e);const a={url:e};let s,n,i,r;if(s=e.match(/^(?:https?:\/\/)?(?:(.+?)\.)?(?:(?:web|k|z)\.)?t(?:elegram)?\.me(?:\/(.+))?/)){const t=new URL(e);let a=s[1];a&&o.BX.has(s[1])&&(a=void 0),a&&(t.pathname=a+("/"===t.pathname?"":t.pathname));const n=t.pathname.slice(1),i=n.split("/");if(i[0]&&"$"===i[0][0]&&i[0].length>1)r="invoice";else if(/^\W/.test(n)&&!Ze.kO.test(n))r="joinchat";else switch(i[0]){case"joinchat":case"addstickers":case"addemoji":case"voicechat":case"invoice":if(1!==i.length&&!a){r=i[0];break}default:if(i[1]&&i[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===i.length){r="im";break}}}else(n=e.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?r="im":(i=e.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(r="tg_"+i[1]);return window[r]||(r=void 0),a.onclick=r,a}d.GO&&(d.GO.wrapUrl=je),function(e){let t,s;function n(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function i(){if("h12"===e.timeFormat)try{const t=P({hour:"numeric",minute:"numeric",hour12:!0}),a=new Date;a.setHours(0);const s=t.format(a);e.amPmCache.am=s.split(" ")[1],a.setHours(12);const n=t.format(a);e.amPmCache.pm=n.split(" ")[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function r(){const e=_.Z.langPackCode;return n(e),Promise.all([a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),a.e(8).then(a.bind(a,9179))]).then((([t,a,s])=>{const n=[];return p(t.default,n),p(a.default,n),f({_:"langPackDifference",from_version:0,lang_code:e,strings:n,version:0,local:!0,countries:s.default})}))}function o(t,s){e.requestedServerLanguage=!0;const n=g.managers;return Promise.all([n.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"web"}),!1,a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),n.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function p(e,t=[]){for(const a in e){const s=e[a];"string"==typeof s?t.push({_:"langPackString",key:a,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:a},s))}return t}function f(e){return e.appVersion=_.Z.langPackVersion,h.Z.set({langPack:e}).then((()=>(c(e),e)))}function c(a){const s=e.lastRequestedLangCode;if(a.lang_code===s){try{t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode)}catch(a){console.error("pluralRules error",a),t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode.split("-",1)[0])}try{t=new Intl.PluralRules(a.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(a.lang_code.split("-",1)[0])}e.strings.clear();for(const t of a.strings)e.strings.set(t.key,t);a.countries&&(e.countriesList.length=0,e.countriesList.push(...a.countries.countries),a.countries.countries.forEach((t=>{if(t.name){const a=t.default_name;e.strings.set(a,{_:"langPackString",key:a,value:t.name})}}))),e.lastAppliedLangCode!==s&&(g.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,v.clear(),i()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a&&a.update()}))}}function l(e,t,a={i:0}){const s=[];let n=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,i,r,o,p,d,f)=>{if(s.push(f.slice(n,d)),i){let e;switch(i){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...l(r,t,a)),s.push(e)}else if(o)s.push(document.createElement("br"));else if(p){const e=p.lastIndexOf("]"),n=p.slice(1,e),i=p.slice(e+2,p.length-1);let r;if(i&&(0,Ne.Z)(i)){r=document.createElement("a");const e=je(i);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[a.i++],r instanceof DocumentFragment&&(r=r.firstChild),r.textContent="";r.append(...l(n,t,a)),s.push(r)}else t&&function(e,t,a){const s=t[a.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,a);return n=d+e.length,""})),n!==e.length&&s.push(e.slice(n)),s}function m(a,s=!1,n){const i=e.strings.get(a);let r;if(i)if("langPackStringPluralized"===i._&&(null==n?void 0:n.length)){let e=n[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),r=i[t.select(e)+"_value"]||i.other_value}else r="langPackString"===i._?i.value:a;else r=a;const o=l(r,n);return s?o.map((e=>e instanceof Node?e.textContent:e)).join(""):o}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.isRTL=!1,e.setRTL=function(t){e.isRTL=t},e.getCacheLangPack=function(){return s||(s=Promise.all([h.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(d.ZP,e.lastRequestedLangCode||n(t.lang_code),c(t),t):r())).finally((()=>{s=void 0})))},e.setTimeFormat=function(t,a=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,i(),a&&(v.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a instanceof b&&a.update()})))},e.loadLocalLangPack=r,e.loadLangPack=o,e.getStrings=function(e,t){return g.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:_.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=p,e.getLangPack=function(e,t){return n(e),o(e).then((([e,t,a,s,n,i])=>{let r=[];return[a,s].forEach((e=>{p(e.default,r)})),r=r.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=r,e.countries=n,f(e)}))},e.saveLangPack=f,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():a.e(642).then(a.bind(a,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=c,e.superFormatter=l,e.format=m,e.weakMap=new WeakMap;class u{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class y extends u{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,Oe.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...m(this.key,!1,this.args));else{const e=this.element[this.property],t=m(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,Y.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=y;const v=new Map;function P(t={}){const a=JSON.stringify(t);let s=v.get(a);return s||(s=new Intl.DateTimeFormat(e.lastRequestedNormalizedLangCode+"-u-hc-"+e.timeFormat,t),v.set(a,s)),s}e.amPmCache={am:"AM",pm:"PM"};class b extends u{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"})),this.element.setAttribute("dir","auto")}update(t){let a;if((0,Oe.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){const t=this.date.getHours();a=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(a+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=P(this.options);a=(0,Le.Z)(e.format(this.date))}this.element[this.property]=a}}e.IntlDateElement=b,e.i18n=function(e,t){return new y({key:e,args:t}).element},e.i18n_=function(e){return new y(e).element},e._i18n=function(e,t,a,s){return new y({element:e,key:t,args:a,property:s}).element}}(Ve||(Ve={}));const qe=Ve;Ve.i18n,Ve.i18n_,Ve._i18n,d.GO.I18n=Ve;const Ge=["January","February","March","April","May","June","July","August","September","October","November","December"],He=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],We=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),a=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-a);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/86400+1)/7)};d.GO&&(d.GO.formatDateAccordingToTodayNew=function(e){const t=new Date,a=t.getTime()/1e3|0,s=e.getTime()/1e3|0,n={};return a-s<86400&&t.getDate()===e.getDate()?n.hour=n.minute="2-digit":t.getFullYear()!==e.getFullYear()?(n.year=n.day="numeric",n.month="2-digit"):a-s<604800&&We(t)===We(e)?n.weekday="short":(n.month="short",n.day="numeric"),new qe.IntlDateElement({date:e,options:n}).element});const ze=2013,Ke=new RegExp("20[0-9]{1,2}"),Je=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),$e=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),Qe=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),Ye=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),Xe=[31,29,31,30,31,30,31,31,30,31,30,31];function et(e,t,a){const s=(new Date).getFullYear(),n=Date.now();if(a>=ze&&a<=s){const s=new Date;s.setFullYear(a,t,1),s.setHours(0,0,0);const i=s.getTime();if(i>n)return;s.setMonth(s.getMonth()+1);const r=s.getTime()-1;e.push({title:at(i),minDate:i,maxDate:r})}}function tt(e,t,a){if(rt(t,a)){const n=(new Date).getFullYear(),i=Date.now();for(let r=n;r>=ze;r--){if(1===a&&28===t&&((s=r)%4!=0||s%100==0)&&s%400!=0)continue;const o=new Date;o.setFullYear(r,a,t+1),o.setHours(0,0,0);const p=o.getTime();if(p>i)continue;o.setFullYear(r,a,t+2),o.setHours(0,0,0);const d=o.getTime()-1;r===n?e.push({title:st(p),minDate:p,maxDate:d}):e.push({title:nt(p),minDate:p,maxDate:d})}}var s}function at(e){const t=new Date(e);return Ge[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function st(e){const t=new Date(e);return Ge[t.getMonth()].slice(0,3)+" "+t.getDate()}function nt(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function it(e){const t=new Date(e);return He[t.getDay()]}function rt(e,t){return t>=0&&t<12&&e>=0&&e{t[e][s]=a})),a[e]=t[e])}d.GO.fillTipDates=function(e,t){const a=e.trim().toLowerCase();if(a.length<3)return;if(0==="today".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-1;return void t.push({title:"Today",minDate:i,maxDate:r})}if(0==="yesterday".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime()-864e5;e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:i,maxDate:r})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let a=0;a<7;a++)if(t.setDate(t.getDate()+1),0===it(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(a);if(s>=0){const e=new Date,a=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>a&&e.setTime(e.getTime()-6048e5);const i=e.getFullYear(),r=e.getMonth(),o=e.getDate();e.setFullYear(i,r,o),e.setHours(0,0,0);const p=e.getTime();e.setFullYear(i,r,o+1),e.setHours(0,0,0);const d=e.getTime()-1;return void t.push({title:it(p),minDate:p,maxDate:d})}let n;if(null===(n=Qe.exec(a)))if(null===(n=Ye.exec(a)))if(null===(n=Ke.exec(a))){if(null!==(n=Je.exec(a))){const e=n[1],a=n[2],s=ot(e);if(s>=0){const e=+a;if(e>0&&e<=31)return void tt(t,e-1,s);if(e>=ze)return void et(t,s,e)}}if(null!==(n=$e.exec(a))){const e=n[1],a=ot(n[2]);if(a>=0){const s=+e;if(s>0&&s<=31)return void tt(t,s-1,a);s>=ze&&et(t,a,s)}}}else{let e=+a;const s=(new Date).getFullYear();if(e=e;a--){const e=new Date;e.setFullYear(a,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(a+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+a,minDate:s,maxDate:n})}}else if(e<=s){const a=new Date;a.setFullYear(e,0,1),a.setHours(0,0,0);const s=a.getTime();a.setFullYear(e+1,0,1),a.setHours(0,0,0);const n=a.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],a=n[3],s=n[5];if(!n[2]===n[4])return;const i=parseInt(e),r=parseInt(a)-1;let o=parseInt(s);o>=10&&o<=99&&(o+=2e3);const p=(new Date).getFullYear();if(rt(i-1,r)&&o>=ze&&o<=p){const e=new Date;e.setFullYear(o,r,i),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(o,r,i+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:nt(a),minDate:a,maxDate:s})}}else{const e=n[1],a=n[3],s=parseInt(e),i=parseInt(a);if(s>0&&s<=31){if(i>=ze&&s<=12)return void et(t,s-1,i);i<=12&&tt(t,s-1,i-1)}else s>=ze&&i<=12&&et(t,i-1,s)}};var dt=a(2491),ft=a(7072),ct=a(8801),lt=a(6658);const mt={pdf:"application/pdf",tgv:"application/x-tgwallpattern",tgs:"application/x-tgsticker",json:"application/json",wav:"audio/wav",mp3:"audio/mpeg",ogg:"audio/ogg",jpeg:"image/jpeg",jpg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",mp4:"video/mp4",webm:"video/webm",mov:"video/quicktime",svg:"image/svg+xml"},gt={};for(const e in mt)gt[mt[e]]=e;let ht=0;class ut extends G{constructor(){super(...arguments),this.onServiceWorkerFail=()=>{for(const e in this.docs){const t=this.docs[e];t.supportsStreaming&&(delete t.supportsStreaming,this.thumbsStorage.deleteCacheContext(t))}}}after(){this.docs={},this.stickerCachedThumbs={},this.uploadingWallPapers={},f.Z.getInstance().addEventListener("serviceWorkerOnline",(e=>{e||this.onServiceWorkerFail()}))}saveDoc(e,t){if(!e||"documentEmpty"===e._)return;const a=this.docs[e.id];e.file_reference&&(pt("file_reference",a,e),this.referenceDatabase.saveContext(e.file_reference,t)),a||(this.docs[e.id]=e);for(let t=0,a=e.attributes.length;t"documentAttributeFilename"===e._)),a=t&&t.file_name.split(".").pop(),s=((e,t={})=>{const a=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+a+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):Ge[e.getMonth()])+a+e.getFullYear()+(t.noTime?"":", "+s)})(new Date(1e3*e.date),{monthAsNumber:!0,leadingZero:!0}).replace(/[:\.]/g,"-").replace(", ","_");e.file_name=`${e.type}_${s}${a?"."+a:""}`}return Ws()&&("gif"===e.type&&e.size>8e6||"audio"===e.type||"video"===e.type)?(e.supportsStreaming=!0,this.thumbsStorage.getCacheContext(e).url||this.thumbsStorage.setCacheContextURL(e,void 0,function(e,t=!1,a){let s;return s=t?"download":a?"thumb":e.supportsStreaming?"stream":"document",(0,ct.q)(s,(0,lt.Z)(e,a))}(e),0)):e.supportsStreaming=!1,e.file_name||(e.file_name=""),a?Object.assign(a,e):e}getDoc(e){return(0,fe.Z)(e)?e:this.docs[e]}downloadDoc(e,t,a){return this.apiFileManager.downloadMedia({media:e,queueId:t,onlyCache:a})}getLottieCachedThumb(e,t){const a=this.stickerCachedThumbs[e];return a&&a[t]}saveLottiePreview(e,t,a,s,n){var i,r,o;const p=this.getDoc(e);if(!p)return;const d=null!==(i=(r=this.stickerCachedThumbs)[o=p.id])&&void 0!==i?i:r[o]={},f=d[n];f&&f.w>=a&&f.h>=s||(d[n]={url:URL.createObjectURL(t),w:a,h:s})}saveWebPConvertedStrippedThumb(e,t){const a=this.getDoc(e);if(!a)return;const s=a.thumbs&&a.thumbs.find((e=>"photoStrippedSize"===e._));s&&(a.pFlags.stickerThumbConverted=!0,s.bytes=t)}prepareWallPaperUpload(e){const t="wallpaper-upload-"+ ++ht,a={_:"photoSize",h:0,w:0,location:{},size:e.size,type:o.Pt};let s={_:"document",access_hash:"",attributes:[],dc_id:0,file_reference:[],id:t,mime_type:e.type,size:e.size,date:Date.now()/1e3,pFlags:{},thumbs:[a],file_name:e.name};s=this.saveDoc(s);const n=this.thumbsStorage.setCacheContextURL(s,void 0,URL.createObjectURL(e),e.size),i={_:"wallPaper",access_hash:"",document:s,id:t,slug:t,pFlags:{}};return this.uploadingWallPapers[t]={cacheContext:n,file:e},i}uploadWallPaper(e){const{cacheContext:t,file:a}=this.uploadingWallPapers[e];return delete this.uploadingWallPapers[e],this.apiFileManager.upload({file:a,fileName:a.name}).then((e=>this.apiManager.invokeApi("account.uploadWallPaper",{file:e,mime_type:a.type,settings:{_:"wallPaperSettings"}}).then((e=>((0,ue.Z)(e),e.document=this.saveDoc(e.document),this.thumbsStorage.setCacheContextURL(e.document,void 0,t.url,t.downloaded),e)))))}getGifs(){return this.apiManager.invokeApiHashable({method:"messages.getSavedGifs",processResult:e=>((0,ue.Z)(e),e.gifs.map((e=>this.saveDoc(e))))})}requestDocPart(e,t,a,s){const n=this.getDoc(e);return n?this.apiFileManager.requestFilePart(t,(0,ft.Z)(n),a,s):Promise.reject((0,X.Z)("NO_DOC"))}}var yt=a(6034);class _t extends G{constructor(){super(...arguments),this.drafts={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateDraftMessage:e=>{const t=this.appPeersManager.getPeerId(e.peer);this.saveDraft({peerId:t,threadId:e.threadId,draft:e.draft,notify:!0})}}),h.Z.get("drafts").then((e=>{this.drafts=e||{}}))}getKey(e,t){return e+(t?"_"+t:"")}getDraft(e,t){return this.drafts[this.getKey(e,t)]}addMissedDialogs(){return this.getAllDrafts().then((()=>{for(const e in this.drafts){if(-1!==e.indexOf("_"))continue;const t=e.toPeerId();this.appMessagesManager.getDialogOnly(t)||this.appMessagesManager.reloadConversation(t)}}))}getAllDrafts(){var e;return null!==(e=this.getAllDraftPromise)&&void 0!==e?e:this.getAllDraftPromise=this.apiManager.invokeApi("messages.getAllDrafts").then((e=>{(this.apiUpdatesManager.updatesState.syncLoading||Promise.resolve()).then((()=>{this.apiUpdatesManager.processUpdateMessage(e)}))}))}saveDraft({peerId:e,threadId:t,draft:a,notify:s,force:n}){const i=this.processApiDraft(a),r=this.getKey(e,t);return i?this.drafts[r]=i:delete this.drafts[r],h.Z.set({drafts:this.drafts}),s&&this.rootScope.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:i,force:n}),i}isEmptyDraft(e){return"draftMessage"!==(null==e?void 0:e._)||!(void 0!==e.reply_to_msg_id&&e.reply_to_msg_id>0)&&!e.message.length}processApiDraft(e){if(e&&"draftMessage"===e._)return e.reply_to_msg_id&&(e.reply_to_msg_id=(0,pe.Z)(e.reply_to_msg_id)),e}syncDraft(e,t,a,s=!0,n=!1){const i=this.getDraft(e,t);if((0,yt.Z)(i,a))return!0;const r={peer:this.appPeersManager.getInputPeerById(e),message:""};let o;if(this.isEmptyDraft(a))o={_:"draftMessageEmpty"};else{(0,ue.Z)(a);const e=a.message,t=a.entities;a.reply_to_msg_id&&(r.reply_to_msg_id=(0,oe.Z)(a.reply_to_msg_id)),(null==t?void 0:t.length)&&(r.entities=this.appMessagesManager.getInputEntities(t)),a.pFlags.no_webpage&&(r.no_webpage=a.pFlags.no_webpage),r.message=e}t&&(r.top_msg_id=(0,oe.Z)(t));const p=o||a;return p.date=(0,te.Z)(!0)+this.timeManager.getServerTimeOffset(),this.saveDraft({peerId:e,threadId:t,draft:p,notify:!0,force:n}),!s||this.apiManager.invokeApi("messages.saveDraft",r)}clearAllDrafts(){return this.apiManager.invokeApi("messages.clearAllDrafts").then((e=>{if(e)for(const e in this.drafts){const[t,a]=e.split("_");this.rootScope.dispatchEvent("draft_updated",{peerId:t.toPeerId(),threadId:a?+a:void 0,draft:void 0})}}))}clearDraft(e,t){const a={_:"draftMessageEmpty"};t?this.syncDraft(e,t,a,!1,!0):this.saveDraft({peerId:e,threadId:t,draft:a,notify:!0,force:!0})}setDraft(e,t,a,s){const n={_:"draftMessage",date:Date.now()/1e3|0,message:a,pFlags:{},entities:s};t?this.syncDraft(e,t,n,!1,!0):this.saveDraft({peerId:e,threadId:t,draft:n,notify:!0,force:!0})}}var vt=a(946),Pt=a(7746);const bt={keywords:{},version:0,langCode:_.Z.langPackCode};class Mt extends G{constructor(){super(...arguments),this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={},this.recent={},this.getRecentEmojisPromises={},this.getCustomEmojiDocumentPromises=new Map}getEmojiKeywords(e=_.Z.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const a="emojiKeywords_"+e;return this.getKeywordsPromises[e]=h.Z.get(a).then((t=>((0,fe.Z)(t)||(t={}),(0,vt.Z)(bt,t),t.langCode=e,this.keywordLangPacks[e]=t,this.apiManager.invokeApi("messages.getEmojiKeywordsDifference",{lang_code:t.langCode,from_version:t.version}).then((e=>{t.version=e.version;const s=t.keywords,n=e.keywords;for(let e=0,t=n.length;et)))))}getBothEmojiKeywords(){const e=[this.getEmojiKeywords()];return this.networkerFactory.language!==_.Z.langPackCode&&e.push(this.getEmojiKeywords(this.networkerFactory.language)),this.recent.native||e.push(this.getRecentEmojis("native")),Promise.all(e)}indexEmojis(){this.index||(this.index=new ae.Z(void 0,2));for(const e in this.keywordLangPacks){if(this.indexedLangPacks[e])continue;const t=this.keywordLangPacks[e].keywords;for(const e in t){const a=t[e];this.index.indexObject(a,e)}this.indexedLangPacks[e]=!0}}searchEmojis(e){let t;if(this.indexEmojis(),(e=e.toLowerCase().replace(/_/g," ")).trim()){const a=this.index.search(e);t=Array.from(a).reduce(((e,t)=>e.concat(t)),[])}else t=this.recent.native.concat(Mt.POPULAR_EMOJI).slice(0,32);return t=Array.from(new Set(t)),t}getRecentEmojis(e){var t;const a=this.getRecentEmojisPromises;return null!==(t=a[e])&&void 0!==t?t:a[e]=this.appStateManager.getState().then((t=>{let a=[];if("native"===e){const{recentEmoji:e}=t;a=Array.isArray(e)&&e.length?e:Mt.POPULAR_EMOJI}else{const{recentCustomEmoji:e}=t;a=Array.isArray(e)&&e.length?e:[]}return this.recent[e]=a}))}pushRecentEmoji(e){const t=e.docId?"custom":"native";e.emoji=(0,Pt.Z)(e.emoji),this.getRecentEmojis(t).then((a=>{const s=e.docId||e.emoji;(0,M.Z)(a,s),a.unshift(s),a.splice(32,a.length-32),this.appStateManager.pushToState("custom"===t?"recentCustomEmoji":"recentEmoji",a),this.rootScope.dispatchEvent("emoji_recent",e)}))}getCustomEmojiDocuments(e){return e.length?this.apiManager.invokeApi("messages.getCustomEmojiDocuments",{document_id:e}).then((e=>e.map((e=>this.appDocsManager.saveDoc(e,{type:"customEmoji",docId:e.id}))))):Promise.resolve([])}getCachedCustomEmojiDocuments(e){return e.map((e=>this.appDocsManager.getDoc(e)))}setDebouncedGetCustomEmojiDocuments(){!this.getCustomEmojiDocumentsPromise&&this.getCustomEmojiDocumentPromises.size&&(this.getCustomEmojiDocumentsPromise=(0,P.Z)(0).then((()=>{const e=[...this.getCustomEmojiDocumentPromises.keys()],t=[];do{const a=e.splice(0,100),s=this.getCustomEmojiDocuments(a).then((e=>{e.forEach(((e,t)=>{const s=a[t],n=this.getCustomEmojiDocumentPromises.get(s);this.getCustomEmojiDocumentPromises.delete(s),n.resolve(e)}))}));t.push(s)}while(e.length);return Promise.all(t)})).finally((()=>{this.getCustomEmojiDocumentsPromise=void 0,this.setDebouncedGetCustomEmojiDocuments()})))}getCustomEmojiDocument(e){let t=this.getCustomEmojiDocumentPromises.get(e);if(t)return t;return this.appDocsManager.getDoc(e)||(t=(0,v.Z)(),this.getCustomEmojiDocumentPromises.set(e,t),this.setDebouncedGetCustomEmojiDocuments(),t)}getCustomEmojis(){return this.appStickersManager.getEmojiStickers()}}Mt.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];var It=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class St extends G{after(){this.log=(0,I.kg)("GROUP-CALLS"),this.groupCalls=new Map,this.participants=new Map,this.nextOffsets=new Map,this.apiUpdatesManager.addMultipleEventsListeners({updateGroupCall:e=>{this.saveGroupCall(e.call,e.chat_id)},updateGroupCallParticipants:e=>{this.saveGroupCall(e.call);const t=e.call.id;this.saveApiParticipants(t,e.participants)}}),this.rootScope.addEventListener("group_call_update",(e=>{"groupCallDiscarded"===e._&&this.participants.delete(e.id)}))}getCachedParticipants(e){let t=this.participants.get(e);return t||this.participants.set(e,t=new Map),t}prepareToSavingNextOffset(e){const t=this.nextOffsets,a=t.get(e);return{nextOffset:a,setNextOffset:s=>{t.get(e)===a&&t.set(e,s)}}}saveApiParticipant(e,t,a){const s=this.getCachedParticipants(e),n=(0,le.Z)(t.peer),i=s.get(n),r=t.pFlags.left;if(!i&&r)return;t.pFlags.muted||t.pFlags.can_self_unmute||(t.pFlags.can_self_unmute=!0),i?(re(i,t),t=i):s.set(n,t);const o=this.getGroupCall(e);if("groupCall"===(null==o?void 0:o._)){let e=!1;r?(--o.participants_count,e=!0):!t.pFlags.just_joined||i||t.pFlags.self||(++o.participants_count,e=!0),e&&this.rootScope.dispatchEvent("group_call_update",o)}r&&s.delete(n),this.rootScope.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}saveApiParticipants(e,t,a){t.saved||(t.saved=!0,t.forEach((t=>this.saveApiParticipant(e,t,a))))}editParticipant(e,t,a){return It(this,void 0,void 0,(function*(){this.saveApiParticipant(e,t);const s=t.pFlags.self?o.NM:(0,le.Z)(t.peer),n=yield this.apiManager.invokeApiSingle("phone.editGroupCallParticipant",{call:this.getGroupCallInput(e),participant:s===o.NM?this.appPeersManager.getInputPeerSelf():this.appPeersManager.getInputPeerById(s),muted:a.muted,volume:a.volume,raise_hand:a.raiseHand,video_paused:a.videoPaused,video_stopped:a.videoStopped,presentation_paused:a.presentationPaused});this.apiUpdatesManager.processUpdateMessage(n)}))}getGroupCall(e){return this.groupCalls.get(e)}getGroupCallFull(e,t){return It(this,void 0,void 0,(function*(){const a=this.getGroupCall(e);if(a&&"inputGroupCall"!==a._&&!t)return a;const s=this.getCachedParticipants(e).size?0:100;return this.apiManager.invokeApiSingleProcess({method:"phone.getGroupCall",params:{call:this.getGroupCallInput(e),limit:s},processResult:t=>{this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.saveApiChats(t.chats),this.saveApiParticipants(e,t.participants,!0);const a=this.saveGroupCall(t.call);return s&&void 0===this.nextOffsets.get(e)&&this.nextOffsets.set(e,t.participants_next_offset),a}})}))}saveGroupCall(e,t){const a=this.groupCalls.get(e.id),s="inputGroupCall"!==e._&&(!a||"groupCallDiscarded"!==a._);return a?(s&&re(a,e),e=a):this.groupCalls.set(e.id,e),s&&this.rootScope.dispatchEvent("group_call_update",e),e}createGroupCall(e,t,a){return It(this,void 0,void 0,(function*(){const s=yield this.apiManager.invokeApi("phone.createGroupCall",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),random_id:(0,Te.d)(32),schedule_date:t,title:a});return this.apiUpdatesManager.processUpdateMessage(s),s.updates.find((e=>"updateGroupCall"===e._)).call}))}getGroupCallInput(e){const t=this.getGroupCall(e);return{_:"inputGroupCall",id:t.id,access_hash:t.access_hash}}getGroupCallParticipants(e){return It(this,void 0,void 0,(function*(){const{nextOffset:t,setNextOffset:a}=this.prepareToSavingNextOffset(e);return""!==t&&(yield this.apiManager.invokeApiSingleProcess({method:"phone.getGroupParticipants",params:{call:this.getGroupCallInput(e),ids:[],sources:[],offset:t||"",limit:100},processResult:t=>{const s=t.count===t.participants.length?"":t.next_offset;this.appChatsManager.saveApiChats(t.chats),this.appUsersManager.saveApiUsers(t.users),this.saveApiParticipants(e,t.participants),a(s)}})),{participants:this.getCachedParticipants(e),isEnd:""===this.nextOffsets.get(e)}}))}hangUp(e,t){const a=this.getGroupCallInput(e);let s;return s="boolean"==typeof t&&t?this.apiManager.invokeApi("phone.discardGroupCall",{call:a}):"number"==typeof t?this.apiManager.invokeApi("phone.leaveGroupCall",{call:a,source:t}):this.apiManager.invokeApi("phone.joinGroupCall",{call:a,join_as:this.appPeersManager.getInputPeerSelf(),muted:!0,video_stopped:!0,params:{_:"dataJSON",data:""}}),s.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}joinGroupCall(e,t,a){return It(this,void 0,void 0,(function*(){const s=this.getGroupCallInput(e);let n;if("main"===a.type){const i={call:s,join_as:this.appPeersManager.getInputPeerSelf(),params:t,muted:a.isMuted,video_stopped:!a.joinVideo};n=this.apiManager.invokeApi("phone.joinGroupCall",i),this.log(`[api] joinGroupCall id=${e}`,i)}else{const a={call:s,params:t};n=this.apiManager.invokeApi("phone.joinGroupCallPresentation",a),this.log(`[api] joinGroupCallPresentation id=${e}`,a)}const i=yield n;return this.apiUpdatesManager.processUpdateMessage(i),i.updates.find((e=>"updateGroupCallConnection"===e._))}))}leaveGroupCallPresentation(e){return this.apiManager.invokeApi("phone.leaveGroupCallPresentation",{call:this.getGroupCallInput(e)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}}function Ct(e){return{_:"inputPhoto",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}function wt(e){return{_:"inputMediaPhoto",id:Ct(e),ttl_seconds:0}}var kt=a(515);function At(e){return{_:"inputMediaDocument",id:{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference},ttl_seconds:0}}class Dt extends G{constructor(){super(...arguments),this.inlineResults={},this.setHash={}}getGeoInput(e){return"geoPoint"===e._?{_:"inputGeoPoint",lat:e.lat,long:e.long,accuracy_radius:e.accuracy_radius}:{_:"inputGeoPointEmpty"}}getInlineResults(e,t,a="",s="",n){return this.apiManager.invokeApi("messages.getInlineBotResults",{bot:this.appUsersManager.getUserInput(t),peer:this.appPeersManager.getInputPeerById(e),query:a,geo_point:n?this.getGeoInput(n):void 0,offset:s},{stopTime:-1,noErrorBox:!0}).then((e=>{const t=e.query_id;return e.results.forEach((e=>{"botInlineMediaResult"===e._&&(e.document&&(e.document=this.appDocsManager.saveDoc(e.document)),e.photo&&(e.photo=this.appPhotosManager.savePhoto(e.photo))),this.inlineResults[(0,kt.Z)(t,e.id)]=e})),e}))}pushPopularBot(e){this.appUsersManager.getTopPeers("bots_inline").then((t=>{const a=e.toPeerId(),s=t.findIndex((e=>e.id===a));let n;n=-1!==s?t[s]:{id:a,rating:0},++n.rating,(0,ie.Z)(t,n,"rating"),this.appStateManager.setKeyValueToStorage("topPeersCache")}))}switchToPM(e,t,a){return this.setHash[t]={peerId:e,time:Date.now()},this.appMessagesManager.startBot(t,void 0,a)}checkSwitchReturn(e){return t=this,a=void 0,n=function*(){const t=this.appUsersManager.getUser(e);if(!t||!t.pFlags.bot||!t.bot_inline_placeholder)return;const a=this.setHash[e];return a&&(delete this.setHash[e],Date.now()-a.time<36e5)?a.peerId:void 0},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}switchInlineQuery(e,t,a,s){this.appDraftsManager.setDraft(e,t,"@"+this.appPeersManager.getPeerUsername(a.toPeerId())+" "+s)}callbackButtonClick(e,t,a){return this.apiManager.invokeApi("messages.getBotCallbackAnswer",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t),data:a.data},{stopTime:-1,noErrorBox:!0})}sendInlineResult(e,t,a,s={}){const n=this.inlineResults[a];if(!n)return;this.pushPopularBot(t);const i=a.split("_"),r=i.shift(),o=i.join("_");if(s.viaBotId=t,s.queryId=r,s.resultId=o,n.send_message.reply_markup&&(s.replyMarkup=n.send_message.reply_markup),"botInlineMessageText"===n.send_message._)s.entities=n.send_message.entities,this.appMessagesManager.sendText(e,n.send_message.message,s);else{let t,a,i="";const r=n.send_message;switch(r._){case"botInlineMessageMediaAuto":if(i=r.message,"botInlineMediaResult"===n._){const{document:e,photo:a}=n;t=e?At(e):wt(a)}break;case"botInlineMessageMediaGeo":t={_:"inputMediaGeoPoint",geo_point:this.getGeoInput(r.geo)},s.geoPoint=r.geo;break;case"botInlineMessageMediaVenue":t={_:"inputMediaVenue",geo_point:this.getGeoInput(r.geo),title:r.title,address:r.address,provider:r.provider,venue_id:r.venue_id,venue_type:r.venue_type},s.geoPoint=r.geo;break;case"botInlineMessageMediaContact":t={_:"inputMediaContact",phone_number:r.phone_number,first_name:r.first_name,last_name:r.last_name,vcard:r.vcard};break;case"botInlineMessageMediaInvoice":a={_:"messageMediaInvoice",title:r.title,description:r.description,photo:r.photo,currency:r.currency,total_amount:r.total_amount,pFlags:{shipping_address_requested:r.pFlags.shipping_address_requested,test:r.pFlags.test},start_param:void 0}}!t&&a&&(t={_:"messageMediaPending",messageMedia:a}),this.appMessagesManager.sendOther(e,t,s)}}}var Ut=a(7082);class Tt{constructor(){this.tempNum=0}generateTempMessageId(e){const t=++this.tempNum;return(0,pe.Z)(e)+(t&Ut.o-1)}}var Et=a(4421),Ft=a(3624),Rt=a(7401);function xt(e,t){if(e.length{let o=e.slice(s,r);const p=n++;o.length>t&&(xt(o.slice(t),t).forEach((e=>{i[n++]=e})),o=o.slice(0,t)),s=r,a=0,i[p]=(i[p]||"")+o};let o=0;for(;;){let s=e.indexOf(" ",o);if(-1===s){o!==e.length-1&&r();break}s+=" ".length;const n=s-o;a+n>t&&r(a),o=s,a+=n}return i}var Bt=a(5701),Vt=a(7667),Ot=a(6241),Lt=a(6535),Nt=a(6566),Zt=a(2202),jt=a(319);const qt=new class{constructor(){this.tabs=new Map}start(){f.Z.getInstance().addEventListener("tabState",((e,t)=>{this.tabs.get(t).state=e}))}getTabs(){return[...this.tabs.values()].filter((e=>!!e.state))}addTab(e){const t={source:e,state:void 0};this.tabs.set(e,t)}deleteTab(e){this.tabs.delete(e)}};d.GO&&(d.GO.appTabsManager=qt);const Gt=qt;var Ht=a(2381),Wt=a(13);function zt(e){return{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}var Kt=a(5285),Jt=a(5102);function $t(e,t,a){a?e[t]=!0:delete e[t]}var Qt=a(4993),Yt=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Xt=e=>{e()},ea=!0;class ta extends G{constructor(){super(...arguments),this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new Et.Z(10),this.needSingleMessages=new Map,this.extendedMedia=new Map,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newDialogsToHandle=new Map,this.newUpdatesAfterReloadToHandle={},this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=(0,I.kg)("MESSAGES",I.v9.Error|I.v9.Debug|I.v9.Log|I.v9.Warn),this.groupedTempId=0,this.typings={},this.unreadMentions={},this.goToNextMentionPromises={},this.batchUpdates={},this.clear=e=>{this.middleware?this.middleware.clean():(this.middleware=(0,Ft.k)(),this.uploadFilePromises={}),this.messagesStorageByPeerId={},this.groupedMessagesStorage={},this.scheduledMessagesStorage={},this.historiesStorage={},this.threadsStorage={},this.searchesStorage={},this.pinnedMessages={},this.threadsServiceMessagesIdsStorage={},this.threadsToReplies={},this.dialogsStorage&&this.dialogsStorage.clear(e),this.filtersStorage&&this.filtersStorage.clear(e)},this.handleNewDialogs=()=>{let e=0;const t=new Map,a=a=>{var s;const{peerId:n}=a;this.dialogsStorage.pushDialog({dialog:a}),this.appPeersManager.isChannel(n)||(e=Math.max(e,a.top_message||0));let i=t.get(n);i||t.set(n,i={}),"forumTopic"===a._?(null!==(s=i.topics)&&void 0!==s?s:i.topics=new Map).set(a.id,a):i.dialog=a};for(const[e,t]of this.newDialogsToHandle){const s="dialog"in t,{dialog:n,topics:i}=t;s&&(n?this.dialogsStorage.getDialogOnly(e)&&a(n):this.reloadConversation(e.toPeerId())),i&&(null==i||i.forEach(((t,s)=>{t?this.dialogsStorage.getForumTopic(e,s)&&a(t):this.dialogsStorage.getForumTopicById(e,s)})))}0!==e&&this.incrementMaxSeenId(e),this.rootScope.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle.clear()},this.handleNotifications=()=>{E.Z.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=void 0;for(const e in this.notificationsToHandle){const[t,a]=e.split("_"),s=this.notificationsToHandle[e];this.getNotifyPeerSettings(t.toPeerId(),a?+a:void 0).then((({muted:e,peerTypeNotifySettings:t})=>{const a=s.topMessage;e&&!a.pFlags.mentioned||!a.pFlags.unread||a.pFlags.unread&&this.notifyAboutMessage(a,{fwdCount:s.fwdCount,peerTypeNotifySettings:t})}))}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id;if(!this.pendingByRandomId[t])return;const a=(0,pe.Z)(e.id);this.pendingByMessageId[a]=t},this.onUpdateNewMessage=e=>{var t,a,s,n;const i=e.message,r=this.getMessagePeer(i),p=this.getHistoryMessagesStorage(r),d="updateNewDiscussionMessage"===e._;this.saveMessages([i],{storage:this.createMessageStorage(r,"history")});const f=this.appPeersManager.isForum(r),c=this.getThreadKey(i),l=c?+c.split("_")[1]:void 0,m=this.dialogsStorage.getDialogOrTopic(r,d?l:void 0);if((!m||this.reloadConversationsPeers.has(r))&&!d){let t=!0;if(r.isAnyChat()&&(t=this.appChatsManager.isInChat(r.toChatId())),t)return void this.handleNewUpdateAfterReload(r,e)}if(l&&!d){const e=null===(t=this.threadsStorage[r])||void 0===t?void 0:t[l],a={_:"updateNewDiscussionMessage",message:i};this.appChatsManager.isForum(r.toChatId())&&!this.dialogsStorage.getForumTopic(r,l)?this.handleNewUpdateAfterReload(r,a,l):e&&this.onUpdateNewMessage(a)}if("messageService"===i._){const{action:e}=i;if("messageActionPaymentSent"===e._&&i.reply_to&&this.rootScope.dispatchEvent("payment_sent",{peerId:i.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(i.reply_to.reply_to_peer_id):i.peerId,mid:i.reply_to_mid,receiptMessage:i}),"messageActionTopicEdit"===e._&&!d){const t=this.dialogsStorage.getForumTopic(r,l);if(t){const a=(0,ve.Z)(t);void 0!==e.title&&(t.title=e.title),void 0!==e.closed&&$t(t.pFlags,"closed",e.closed),void 0!==e.hidden&&$t(t.pFlags,"hidden",e.hidden),void 0!==e.icon_emoji_id&&(t.icon_emoji_id=e.icon_emoji_id),this.scheduleHandleNewDialogs(r,t),this.dialogsStorage.processTopicUpdate(t,a)}else this.dialogsStorage.getForumTopicById(r,l)}}this.saveMessages([i],{storage:p}),this.checkPendingMessage(i);const g=this.getHistoryStorage(r,d?l:void 0);d||this.updateMessageRepliesIfNeeded(i);const h=e.ignoreExisting;if(g.history.findSlice(i.mid)){if(!h)return!1}else{const e=g.history.first;if(e.isEnd(se.D.Bottom)){let t=0;for(const a=e.length;te[t]);++t);e.splice(t,0,i.mid)}else g.history.unshift(i.mid);null!==g.count&&++g.count}(!g.maxId||i.mid>g.maxId)&&(g.maxId=i.mid),this.mergeReplyKeyboard(g,i)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:r});const u=i.fromId;if(u.isUser()&&!i.pFlags.out&&i.from_id){this.appUsersManager.forceUserOnline(u,i.date);const e={_:"sendMessageCancelAction"};let t;t=r.isUser()?{_:"updateUserTyping",action:e,user_id:u}:this.appPeersManager.isChannel(r)?{_:"updateChannelUserTyping",action:e,channel_id:r.toChatId(),from_id:this.appPeersManager.getOutputPeer(u),top_msg_id:l?(0,oe.Z)(l):void 0}:{_:"updateChatUserTyping",action:e,chat_id:r.toChatId(),from_id:this.appPeersManager.getOutputPeer(u)},this.apiUpdatesManager.processLocalUpdate(t)}this.handleNewMessage(i);const y="forumTopic"===(null==m?void 0:m._);if(d&&!y||!m)return;const _=!i.pFlags.out&&i.pFlags.unread;if(_&&i.mid>m.top_message){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(m);++m.unread_count,i.pFlags.mentioned&&(++m.unread_mentions_count,this.modifyCachedMentions(r,i.mid,!0,y?l:void 0)),e()}if(i.mid>=m.top_message&&this.setDialogTopMessage(i,m),(!d&&!f||y)&&_){const e=c||r,t=null!==(a=(n=this.notificationsToHandle)[e])&&void 0!==a?a:n[e]={fwdCount:0,fromId:o.NM};t.fromId!==u&&(t.fromId=u,t.fwdCount=0),i.fwd_from&&++t.fwdCount,t.topMessage=i,null!==(s=this.notificationsHandlePromise)&&void 0!==s||(this.notificationsHandlePromise=E.Z.setTimeout(this.handleNotifications,0))}},this.onUpdateMessageReactions=e=>{const{peer:t,msg_id:a,reactions:s}=e,n=(0,pe.Z)(a),i=this.appPeersManager.getPeerId(t),r=this.getMessageByPeer(i,n);if("message"!==(null==r?void 0:r._))return;const o=null==s?void 0:s.recent_reactions;if((null==o?void 0:o.length)&&r.pFlags.out){const e=o[o.length-1],t=r.reactions,a=null==t?void 0:t.recent_reactions;this.appPeersManager.getPeerId(e.peer_id)===this.appPeersManager.peerId||a&&!(a.length<=o.length)||a&&(0,Y.Z)(e,a[a.length-1])||this.getNotifyPeerSettings(i).then((({muted:t,peerTypeNotifySettings:a})=>{a.show_previews&&this.notifyAboutMessage(r,{peerReaction:e,peerTypeNotifySettings:a})}))}const p=r.peerId+"_"+r.mid;this.pushBatchUpdate("messages_reactions",this.batchUpdateReactions,p,(()=>(0,ve.Z)(r.reactions))),r.reactions=s,e.local||this.setDialogToStateIfMessageIsTop(r)},this.onUpdateDialogUnreadMark=e=>{const t=this.appPeersManager.getPeerId(e.peer.peer),a=this.getDialogOnly(t);if(a){const s=this.dialogsStorage.prepareDialogUnreadCountModifying(a);e.pFlags.unread?a.pFlags.unread_mark=!0:delete a.pFlags.unread_mark,s(),this.dialogsStorage.setDialogToState(a),this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[t,{dialog:a}]]))}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{var t,a;const s=e.message,n=this.getMessagePeer(s),i=(0,pe.Z)(s.id),r=this.getHistoryMessagesStorage(n);if(!r.has(i))return;const o=this.getMessageFromStorage(r,i);this.saveMessages([s],{storage:r});const p=this.getMessageFromStorage(r,i);this.handleEditedMessage(o,p,r);const d=this.getDialogOnly(n),f=(null==d?void 0:d.top_message)===i;if(s.clear_history)f&&this.rootScope.dispatchEvent("dialog_flush",{peerId:n,dialog:d});else{let e=!0;if("message"===(null==o?void 0:o._)&&!(0,Y.Z)(o.reactions,p.reactions)){const t=p.reactions;p.reactions=o.reactions,this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:this.appPeersManager.getOutputPeer(n),msg_id:s.id,reactions:t}),e=!1}e&&this.rootScope.dispatchEvent("message_edit",{storageKey:r.key,peerId:n,mid:i,message:s}),f&&this.dialogsStorage.setDialogToState(d);const c=new Map,l=()=>{let e=c.get(n);return e||c.set(n,e={}),e};(f||s.grouped_id)&&d&&(l().dialog=d);const m=this.getThreadKey(s);if(m){const e=+m.split("_")[1],s=this.dialogsStorage.getForumTopic(n,e);s&&(null!==(t=(a=l()).topics)&&void 0!==t?t:a.topics=new Map).set(e,s)}c.size&&this.rootScope.dispatchEvent("dialogs_multiupdate",c)}},this.onUpdateReadHistory=e=>{const t=e.channel_id,a=(0,pe.Z)(e.max_id||e.read_max_id),s=(0,pe.Z)(e.top_msg_id),n=t?t.toPeerId(!0):this.appPeersManager.getPeerId(e.peer),i="updateReadHistoryOutbox"===e._||"updateReadChannelOutbox"===e._||"updateReadChannelDiscussionOutbox"===e._||void 0,r=!!t&&this.appChatsManager.isForum(t),o=this.getHistoryMessagesStorage(n),p=(0,Rt.Z)(o,"desc"),d=s&&r?this.dialogsStorage.getForumTopic(n,s):this.getDialogOnly(n),f=e.still_unread_count;let c=0,l=0,m=!1;const g=this.getHistoryStorage(n,s);if(n.isUser()&&i&&this.appUsersManager.forceUserOnline(n.toUserId()),s){const e=this.threadsToReplies[n+"_"+s];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}const h=d&&this.dialogsStorage.prepareDialogUnreadCountModifying(d),u=this.getReadMaxIdIfUnread(n,s);for(let e=0,t=p.length;ea)continue;const g=o.get(t);if(g.pFlags.out!==i)continue;const h=(0,Qt.Z)(g,r);if(!s||h===s){if(!(g.pFlags.unread||u&&u=d.top_message||!u?e=0:c&&d.top_message>a&&(e=c),void 0!==e&&(d.unread_count=e),(l<0||!d.unread_count)&&(d.unread_mentions_count=0)}null==h||h(),this.dialogsStorage.processDialogForFilters(d),this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:d}),this.dialogsStorage.setDialogToState(d),m||void 0!==f||i||!d.unread_count||("forumTopic"===d._?this.dialogsStorage.getForumTopicById(n,s):this.reloadConversation(n))}if(m&&this.rootScope.dispatchEvent("messages_read"),!s&&t){const e=n+"_";for(const t in this.threadsToReplies)if(0===t.indexOf(e)){const[e,a]=this.threadsToReplies[t].split("_");this.rootScope.dispatchEvent("replies_updated",this.getMessageByPeer(e.toPeerId(),+a))}}},this.onUpdateReadMessagesContents=e=>{const t=e.channel_id,a=e.top_msg_id,s=a?(0,pe.Z)(a):void 0,n=e.messages.map((e=>(0,pe.Z)(e))),i=t?t.toPeerId(!0):this.findPeerIdByMids(n);for(let e=0,t=n.length;e{const t=e.channel_id.toPeerId(!0),a=this.getHistoryStorage(t).history.slice,s=(0,pe.Z)(e.available_min_id),n=a.filter((e=>e<=s));e.messages=n,this.onUpdateDeleteMessages(e)},this.onUpdateDeleteMessages=e=>{var t;const a=e.channel_id,s=e.messages.map((e=>(0,pe.Z)(e))),n=a?a.toPeerId(!0):this.findPeerIdByMids(s);if(!n)return;this.apiManager.clearCache("messages.getSearchCounters",(e=>this.appPeersManager.getPeerId(e.peer)===n));const i=new Set,r=new Map;for(const e of s){const a=this.getMessageByPeer(n,e),s=this.getThreadKey(a);if(!s)continue;const o=+s.split("_")[1];if((null===(t=this.threadsStorage[n])||void 0===t?void 0:t[o])&&(i.add(s),!r.has(o))){const e=this.dialogsStorage.getForumTopic(n,o);e&&r.set(o,e)}}const o=this.handleDeletedMessages(n,this.getHistoryMessagesStorage(n),s),p=Array.from(i).map((e=>{const[t,a]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+a)}));[this.getHistoryStorage(n),...p].forEach((e=>{for(const t of o.msgs)e.history.delete(t);o.count&&e.count&&(e.count=Math.max(0,e.count-o.count))})),this.rootScope.dispatchEvent("history_delete",{peerId:n,msgs:o.msgs});const d=[...r.values()],f=this.getDialogOnly(n);f&&d.unshift(f),d.forEach((e=>{const t="forumTopic"===e._,a=o.unreadMentions||o.unread,s=a&&this.dialogsStorage.prepareDialogUnreadCountModifying(e);if(o.unread&&(e.unread_count=Math.max(0,e.unread_count-o.unread)),o.unreadMentions&&(e.unread_mentions_count=e.unread_count?Math.max(0,e.unread_mentions_count-o.unreadMentions):0),a&&(s(),t||this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:e})),o.msgs.has(e.top_message)){const a=this.getHistoryStorage(e.peerId,t?e.id:void 0).history.first;if(a.isEnd(se.D.Bottom)&&a.length){const t=a[0],s=this.getMessageByPeer(n,t);this.setDialogTopMessage(s,e)}else t?this.dialogsStorage.getForumTopicById(n,e.id):this.reloadConversation(n)}}))},this.onUpdateChannel=e=>{const t=e.channel_id,a=t.toPeerId(!0),s=this.appChatsManager.getChat(t),n=this.appChatsManager.isInChat(t);(!!(0,Jt.Z)(s)[0]||!s.pFlags.left)!=(void 0!==this.historiesStorage[a])&&(delete this.historiesStorage[a],this.rootScope.dispatchEvent("history_forbidden",a)),!!this.getDialogOnly(a)!==n&&(n?this.reloadConversation(a):this.dialogsStorage.dropDialogOnDeletion(a)),this.rootScope.dispatchEvent("channel_update",t)},this.onUpdateChannelReload=e=>{const t=e.channel_id.toPeerId(!0);this.flushStoragesByPeerId(t),Promise.all([this.reloadConversation(t)]).then((()=>{this.rootScope.dispatchEvent("history_reload",t)}))},this.onUpdateChannelMessageViews=e=>{var t;const a=e.views,s=null!==(t=e.peerId)&&void 0!==t?t:e.channel_id.toPeerId(!0),n=(0,pe.Z)(e.id),i=this.getMessageByPeer(s,n);void 0!==(null==i?void 0:i.views)&&i.views{var t;if(null===(t=e.pFlags)||void 0===t?void 0:t.popup)return void this.rootScope.dispatchEvent("service_notification",e);const a=o.yF,s=a,n=this.generateTempMessageId(s),i={_:"message",id:n,from_id:this.appPeersManager.getOutputPeer(a),peer_id:this.appPeersManager.getOutputPeer(s),pFlags:{unread:!0},date:(e.inbox_date||(0,te.Z)(!0))+this.timeManager.getServerTimeOffset(),message:e.message,media:e.media,entities:e.entities};this.appUsersManager.hasUser(a)||this.appUsersManager.saveApiUsers([{_:"user",id:a,pFlags:{verified:!0},access_hash:"0",first_name:"Telegram",phone:"42777"}]),this.saveMessages([i],{isOutgoing:!0}),e.inbox_date&&(this.pendingTopMsgs[s]=n,this.onUpdateNewMessage({_:"updateNewMessage",message:i,pts:void 0,pts_count:void 0}))},this.onUpdatePinnedMessages=e=>{const t="updatePinnedChannelMessages"===e._?e.channel_id:void 0,a=t?t.toPeerId(!0):this.appPeersManager.getPeerId(e.peer),s=e.messages.map((e=>(0,pe.Z)(e))),n=this.getHistoryMessagesStorage(a),i=s.filter((e=>!n.has(e)));(i.length?Promise.all(i.map((e=>this.reloadMessages(a,e)))):Promise.resolve()).finally((()=>{var t;const i=null===(t=e.pFlags)||void 0===t?void 0:t.pinned;if(i)for(const e of s)n.get(e).pFlags.pinned=!0;else for(const e of s)delete n.get(e).pFlags.pinned;delete this.pinnedMessages[this.getPinnedMessagesKey(a)],this.appStateManager.getState().then((e=>{delete e.hiddenPinnedMessages[a],this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:a,mids:s,pinned:i})}))}))},this.onUpdateNotifySettings=e=>{const{peer:t,notify_settings:a}=e,s="notifyForumTopic"===t._;if("notifyPeer"!==t._&&!s)return;const n=this.appPeersManager.getPeerId(t.peer),i=this.dialogsStorage.getDialogOrTopic(n,s?(0,pe.Z)(t.top_msg_id):void 0);i&&(i.notify_settings=a,this.rootScope.dispatchEvent("dialog_notify_settings",i),this.dialogsStorage.setDialogToState(i))},this.onUpdateNewScheduledMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=this.scheduledMessagesStorage[a];if(!s)return;const n=(0,pe.Z)(t.id),i=this.getMessageFromStorage(s,n);this.saveMessages([t],{storage:s,isScheduled:!0});const r=this.getMessageFromStorage(s,n);i?(this.handleEditedMessage(i,r,s),this.rootScope.dispatchEvent("message_edit",{storageKey:s.key,peerId:a,mid:t.mid,message:t})):this.checkPendingMessage(t)||this.rootScope.dispatchEvent("scheduled_new",t)},this.onUpdateDeleteScheduledMessages=e=>{const t=this.appPeersManager.getPeerId(e.peer),a=this.scheduledMessagesStorage[t];if(a){const s=e.messages.map((e=>(0,pe.Z)(e)));this.handleDeletedMessages(t,a,s),this.rootScope.dispatchEvent("scheduled_delete",{peerId:t,mids:s})}},this.onUpdateMessageExtendedMedia=e=>{var t;const a=this.appPeersManager.getPeerId(e.peer),s=(0,pe.Z)(e.msg_id),n=this.getHistoryMessagesStorage(a);if(!n.has(s))return;const i=this.getMessageFromStorage(n,s),r=i.media;"messageExtendedMedia"!==(null===(t=r.extended_media)||void 0===t?void 0:t._)&&(r.extended_media=e.extended_media,this.onUpdateEditMessage({_:"updateEditMessage",message:i,pts:0,pts_count:0}))},this.batchUpdateViews=e=>{const t=[],a=this.getMessagesFromMap(e);for(const[e]of a)t.push({peerId:e.peerId,mid:e.mid,views:e.views});return t},this.batchUpdateReactions=e=>{var t,a,s;const n=[],i=this.getMessagesFromMap(e);for(const[e,r]of i){const i=null!==(a=null===(t=e.reactions)||void 0===t?void 0:t.results)&&void 0!==a?a:[],o=null!==(s=null==r?void 0:r.results)&&void 0!==s?s:[],p=i.filter((t=>{const a=o.find((e=>(0,Kt.Z)(e.reaction,t.reaction)));return e.pFlags.out&&(!a||t.count>a.count)||void 0!==t.chosen_order&&(!a||void 0===a.chosen_order)}));n.push({message:e,changedResults:p})}return n}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateMessageID:this.onUpdateMessageId,updateNewDiscussionMessage:this.onUpdateNewMessage,updateNewMessage:this.onUpdateNewMessage,updateNewChannelMessage:this.onUpdateNewMessage,updateDialogUnreadMark:this.onUpdateDialogUnreadMark,updateEditMessage:this.onUpdateEditMessage,updateEditChannelMessage:this.onUpdateEditMessage,updateMessageReactions:this.onUpdateMessageReactions,updateReadChannelDiscussionInbox:this.onUpdateReadHistory,updateReadChannelDiscussionOutbox:this.onUpdateReadHistory,updateReadHistoryInbox:this.onUpdateReadHistory,updateReadHistoryOutbox:this.onUpdateReadHistory,updateReadChannelInbox:this.onUpdateReadHistory,updateReadChannelOutbox:this.onUpdateReadHistory,updateChannelReadMessagesContents:this.onUpdateReadMessagesContents,updateReadMessagesContents:this.onUpdateReadMessagesContents,updateChannelAvailableMessages:this.onUpdateChannelAvailableMessages,updateDeleteMessages:this.onUpdateDeleteMessages,updateDeleteChannelMessages:this.onUpdateDeleteMessages,updateChannel:this.onUpdateChannel,updateChannelReload:this.onUpdateChannelReload,updateChannelMessageViews:this.onUpdateChannelMessageViews,updateServiceNotification:this.onUpdateServiceNotification,updatePinnedMessages:this.onUpdatePinnedMessages,updatePinnedChannelMessages:this.onUpdatePinnedMessages,updateNotifySettings:this.onUpdateNotifySettings,updateNewScheduledMessage:this.onUpdateNewScheduledMessage,updateDeleteScheduledMessages:this.onUpdateDeleteScheduledMessages,updateMessageExtendedMedia:this.onUpdateMessageExtendedMedia}),this.rootScope.addEventListener("notify_peer_type_settings",(({key:e,settings:t})=>{let a;a="notifyUsers"===e?e=>e.peerId.isUser():"notifyBroadcasts"===e?e=>this.appPeersManager.isBroadcast(e.peerId):e=>this.appPeersManager.isAnyGroup(e.peerId),this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1)).filter(a).forEach((e=>{this.rootScope.dispatchEvent("dialog_notify_settings",e)}))})),this.rootScope.addEventListener("webpage_updated",(({id:e,msgs:t})=>{t.forEach((({peerId:t,mid:a,isScheduled:s})=>{const n=s?this.getScheduledMessagesStorage(t):this.getHistoryMessagesStorage(t),i=this.getMessageFromStorage(n,a);i&&(i.media={_:"messageMediaWebPage",webpage:this.appWebPagesManager.getCachedWebPage(e)},this.rootScope.dispatchEvent("message_edit",{storageKey:n.key,peerId:t,mid:a,message:i}))}))})),this.rootScope.addEventListener("draft_updated",(({peerId:e,threadId:t,draft:a})=>{const s=this.dialogsStorage.getDialogOrTopic(e,t);if(s){s.draft=a;let t=!1;a||(0,oe.Z)(s.top_message)?(this.dialogsStorage.generateIndexForDialog(s),this.dialogsStorage.pushDialog({dialog:s})):(this.dialogsStorage.dropDialog(e),t=!0),this.rootScope.dispatchEvent("dialog_draft",{peerId:e,dialog:s,drop:t,draft:a})}else if(t){const a=this.appChatsManager.getChat(e.toChatId());a?a.pFlags.forum&&this.dialogsStorage.getForumTopicById(e,t):this.reloadConversation(e)}else this.reloadConversation(e)})),this.rootScope.addEventListener("poll_update",(({poll:e})=>{const t=this.appPollsManager.pollToMessages[e.id];if(t)for(const e of t){const[t,a]=e.split("_"),s=this.getMessageByPeer(t.toPeerId(),+a);s&&this.setDialogToStateIfMessageIsTop(s)}})),this.rootScope.addEventListener("chat_toggle_forum",(({chatId:e,enabled:t})=>{const a=e.toPeerId(!0);if(!t){delete this.threadsStorage[a];for(const e in this.pinnedMessages)+e===a&&e.startsWith(a+"_")&&delete this.pinnedMessages[e]}})),this.batchUpdatesDebounced=(0,Bt.Z)((()=>{for(const e in this.batchUpdates){const t=this.batchUpdates[e];delete this.batchUpdates[e];const a=t.callback(t.batch);!a||a instanceof Array&&!a.length||rootScope.dispatchEvent(e,a)}}),33,!1,!0),this.appStateManager.getState().then((e=>{e.maxSeenMsgId&&(this.maxSeenId=e.maxSeenMsgId)}))}getInputEntities(e){const t=(0,ve.Z)(e);return t.forEach((e=>{"messageEntityMentionName"===e._&&(e._="inputMessageEntityMentionName",e.user_id=this.appUsersManager.getUserInput(e.user_id))})),t}invokeAfterMessageIsSent(e,t,a){var s,n,i;const r=null!==(s=(i=this.tempFinalizeCallbacks)[e])&&void 0!==s?s:i[e]={},o=null!==(n=r[t])&&void 0!==n?n:r[t]={deferred:(0,v.Z)()};return o.callback=a,o.deferred}editMessage(e,t,a={}){const{mid:s,peerId:n}=e;if(e.pFlags.is_outgoing)return this.invokeAfterMessageIsSent(s,"edit",(e=>this.editMessage(e,t,a)));const i=a.entities||[];t&&(t=(0,ke.Z)(t,i));const r=a.scheduleDate||(e.pFlags.is_scheduled?e.date:void 0);return this.apiManager.invokeApi("messages.editMessage",{peer:this.appPeersManager.getInputPeerById(n),id:e.id,message:t,media:a.newMedia,entities:i.length?this.getInputEntities(i):void 0,no_webpage:a.noWebPage,schedule_date:r}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{if(this.log.error("editMessage error:",e),!e||"MESSAGE_NOT_MODIFIED"!==e.type)return e&&"MESSAGE_EMPTY"===e.type&&(e.handled=!0),Promise.reject(e);e.handled=!0}))}sendText(e,t,a={}){var s,n;return Yt(this,void 0,void 0,(function*(){if(!t.trim())return;null!==(s=a.entities)&&void 0!==s||(a.entities=[]),a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId);const i=(yield this.apiManager.getConfig()).message_length_max,r=xt(t,i);t=r[0],r.length>1&&("webPage"!==(null===(n=a.webPage)||void 0===n?void 0:n._)||t.includes(a.webPage.url)||delete a.webPage),e=this.appPeersManager.getPeerMigratedTo(e)||e;const o=a.entities;a.viaBotId||(t=(0,ke.Z)(t,o));let p=this.getInputEntities(o);p.length||(p=void 0);const d=this.generateOutgoingMessage(e,a);d.entities=o,d.message=t;const f=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0,c=this.appPeersManager.isChannel(e);a.webPage&&(d.media={_:"messageMediaWebPage",webpage:a.webPage});const l=e=>{this.onMessagesSendError([d],e),this.rootScope.dispatchEvent("messages_pending")};d.send=()=>{l();const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const n=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let i;return i=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.getInputPeerById(e),random_id:d.random_id,reply_to_msg_id:f||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,send_as:n},s):this.apiManager.invokeApiAfter("messages.sendMessage",{no_webpage:a.noWebPage,peer:this.appPeersManager.getInputPeerById(e),message:t,random_id:d.random_id,reply_to_msg_id:f||void 0,entities:p,clear_draft:a.clearDraft,schedule_date:a.scheduleDate||void 0,silent:a.silent,send_as:n,update_stickersets_order:ea},s),this.pendingAfterMsgs[e]=s,i.then((e=>{if("updateShortSentMessage"===e._){const t=d.promise;delete d.promise;const s=(0,ve.Z)(d);(0,ge.Z)(d,["promise"]),d.promise=t,s.date=e.date,s.id=e.id,s.media=e.media,s.entities=e.entities,this.wrapMessageEntities(s),e.pFlags.out&&(s.pFlags.out=!0),e={_:"updates",users:[],chats:[],seq:0,date:void 0,updates:[{_:"updateMessageID",random_id:d.random_id,id:s.id},{_:a.scheduleDate?"updateNewScheduledMessage":c?"updateNewChannelMessage":"updateNewMessage",message:s,pts:e.pts,pts_count:e.pts_count}]}}else e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)}));this.apiUpdatesManager.processUpdateMessage(e),d.promise.resolve()}),(e=>{throw l(e),d.promise.reject(e),e})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(d,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0});const m=[d.promise];for(let t=1;t=0){r="audio",p="audio."+("ogg"===d.split("/")[1]?"ogg":"mp3"),P="sendMessageUploadAudioAction",t.isVoiceMessage&&(r="voice",s.pFlags.media_unread=!0);const e={_:"documentAttributeAudio",pFlags:{voice:t.isVoiceMessage||void 0},waveform:t.waveform,duration:t.duration||0};g.push(e)}else if(t.isMedia)if(h){r="photo",p="photo."+d.split("/")[1],P="sendMessageUploadPhotoAction";const e={_:"photoSize",w:t.width,h:t.height,type:o.Pt,location:null,size:a.size};y={_:"photo",id:""+s.id,sizes:[e],w:t.width,h:t.height},u&&y.sizes.unshift(u);const n=this.thumbsStorage.getCacheContext(y,e.type);n.downloaded=a.size,n.url=t.objectURL||"",y=this.appPhotosManager.savePhoto(y)}else if(i().VIDEO_MIME_TYPES_SUPPORTED.has(d)){r="video",p="video.mp4",P="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:t.isRoundMessage||void 0,supports_streaming:!0},duration:t.duration,w:t.width,h:t.height};g.push(e),t.noSound&&a.size>10240&&a.size<10485760&&g.push({_:"documentAttributeAnimated"})}else r="document",p="document."+d.split("/")[1],P="sendMessageUploadDocumentAction";else r="document",p="document."+d.split("/")[1],P="sendMessageUploadDocumentAction";if(g.push({_:"documentAttributeFilename",file_name:f||p}),-1!==["document","video","audio","voice"].indexOf(r)&&!c){const e=[];if(_={_:"document",id:""+s.id,duration:t.duration,attributes:g,w:t.width,h:t.height,thumbs:e,mime_type:d,size:a.size},t.objectURL){const e=this.thumbsStorage.getCacheContext(_);e.downloaded=a.size,e.url=t.objectURL}let n;if(h)g.push({_:"documentAttributeImageSize",w:t.width,h:t.height}),n={_:"photoSize",w:t.width,h:t.height,type:o.Pt,size:a.size};else if("video"===r&&t.thumb){n={_:"photoSize",w:t.thumb.size.width,h:t.thumb.size.height,type:"local-thumb",size:t.thumb.blob.size};const e=this.thumbsStorage.getCacheContext(_,n.type);e.downloaded=n.size,e.url=t.thumb.url}n&&e.push(n),u&&e.unshift(u),_=this.appDocsManager.saveDoc(_)}this.log("sendFile",r,p,a.type,t);const b=(0,v.Z)(),M=c?void 0:{_:y?"messageMediaPhoto":"messageMediaDocument",pFlags:{},photo:y,document:_};M&&((0,ge.Z)(M,["promise"]),M.promise=b,t.spoiler&&(M.pFlags.spoiler=!0)),s.entities=m,s.message=l,s.media=c?{_:"messageMediaDocument",pFlags:{},document:a}:M;const I=c?void 0:(0,Zt.Z)(a);s.uploadingFileName=I,I&&(this.uploadFilePromises[I]=b);const S=e=>{this.onMessagesSendError([s],e),this.rootScope.dispatchEvent("messages_pending")};let C=!1,w=null;s.send=()=>{if(c){const e={_:"inputMediaDocument",id:zt(a)};b.resolve(e)}else if(a instanceof File||a instanceof Blob){const n=()=>{var n;let i;return C&&!s.error||(C=!1,w=this.apiFileManager.upload({file:a,fileName:I}),w.catch((a=>{C||(this.log("cancelling upload",M),this.cancelPendingMessage(s.random_id),this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId),b.reject(a))})),w.addNotifyListener((a=>{const s=Math.max(1,Math.floor(100*a.done/a.total));P&&this.setTyping(e,{_:P,progress:0|s},void 0,t.threadId),b.notifyAll(a)})),b.notifyAll({done:0,total:a.size})),"video"===r&&t.objectURL&&(null===(n=t.thumb)||void 0===n?void 0:n.blob)&&(i=this.apiFileManager.upload({file:t.thumb.blob})),w&&w.then((e=>Yt(this,void 0,void 0,(function*(){let a;if(e.name=p,C=!0,a="photo"===r?{_:"inputMediaUploadedPhoto",file:e,pFlags:{spoiler:t.spoiler||void 0}}:{_:"inputMediaUploadedDocument",file:e,mime_type:d,pFlags:{force_file:"sendMessageUploadDocumentAction"===P||void 0,spoiler:t.spoiler||void 0},attributes:g},i)try{const e=yield i;a.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}b.resolve(a)}))),(e=>{throw S(e),e})),b};t.isGroupedItem?n():this.sendSmthLazyLoadQueue.push({load:n})}return b},this.beforeMessageSending(s,{isGroupedItem:t.isGroupedItem,isScheduled:!!t.scheduleDate||void 0,threadId:t.threadId,clearDraft:t.clearDraft,processAfter:t.processAfter}),t.isGroupedItem||(b.then((a=>(this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId),this.apiManager.invokeApi("messages.sendMedia",{background:t.background,peer:this.appPeersManager.getInputPeerById(e),media:a,message:l,random_id:s.random_id,reply_to_msg_id:n,schedule_date:t.scheduleDate,silent:t.silent,entities:m,clear_draft:t.clearDraft,send_as:t.sendAsPeerId?this.appPeersManager.getInputPeerById(t.sendAsPeerId):void 0}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{if("photo"===r&&400===e.code&&("PHOTO_INVALID_DIMENSIONS"===e.type||"PHOTO_SAVE_FILE_INVALID"===e.type))return e.handled=!0,r="document",void s.send();throw S(e),e}))))),b.then(s.promise.resolve,s.promise.reject));const k={message:s};return(0,ge.Z)(k,["promise"]),k.promise=b,k}sendAlbum(e,t){return Yt(this,void 0,void 0,(function*(){if(t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId),1===t.sendFileDetails.length)return this.sendFile(e,Object.assign(Object.assign({},t),t.sendFileDetails[0]));e=this.appPeersManager.getPeerMigratedTo(e)||e;const a=t.replyToMsgId?(0,oe.Z)(t.replyToMsgId):void 0;let s=t.caption||"",n=t.entities||[];s&&(s=(0,ke.Z)(s,n)),this.log("sendAlbum",t);const i=""+ ++this.groupedTempId,r=[],o=e=>{r.push(e)},p=t.sendFileDetails.map(((r,p)=>{const d=Object.assign({isGroupedItem:!0,isMedia:t.isMedia,scheduleDate:t.scheduleDate,silent:t.silent,replyToMsgId:a,threadId:t.threadId,sendAsPeerId:t.sendAsPeerId,groupId:i,processAfter:o},r);return 0===p&&(d.caption=s,d.entities=n),this.sendFile(e,d).message}));t.clearDraft&&r.push((()=>{this.appDraftsManager.clearDraft(e,t.threadId)})),r.forEach((e=>{e()}));const d=(e,t)=>{this.onMessagesSendError([e],t),this.rootScope.dispatchEvent("messages_pending")},f=this.appPeersManager.getInputPeerById(e),c=s=>{this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId);const n=(0,v.Z)();return this.sendSmthLazyLoadQueue.push({load:()=>this.apiManager.invokeApi("messages.sendMultiMedia",{peer:f,multi_media:s,reply_to_msg_id:a,schedule_date:t.scheduleDate,silent:t.silent,clear_draft:t.clearDraft,send_as:t.sendAsPeerId?this.appPeersManager.getInputPeerById(t.sendAsPeerId):void 0,update_stickersets_order:ea}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),n.resolve()}),(e=>{p.forEach((t=>d(t,e))),n.reject(e)}))}),n},l=p.map((e=>e.send().then((e=>Promise.all([e,this.apiManager.invokeApi("messages.uploadMedia",{peer:f,media:e})]))).then((([t,a])=>{let i;if("messageMediaPhoto"===a._){const e=this.appPhotosManager.savePhoto(a.photo);i=wt(e)}else if("messageMediaDocument"===a._){const e=this.appDocsManager.saveDoc(a.document);i=At(e)}["pFlags","ttl_seconds"].forEach((e=>{var a;i[e]=null!==(a=t[e])&&void 0!==a?a:i[e]}));const r={_:"inputSingleMedia",media:i,random_id:e.random_id,message:s,entities:n};return s&&(s="",n=[]),r})).catch((t=>{throw this.log.error("sendAlbum upload item error:",t,e),d(e,t),t}))));return Promise.all(l).then((e=>c(e.filter(Boolean))))}))}sendContact(e,t){return this.sendOther(e,this.appUsersManager.getContactMediaInput(t))}sendOther(e,t,a={}){var s;e=this.appPeersManager.getPeerMigratedTo(e)||e;const n=this.generateOutgoingMessage(e,a),i=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0;let r;switch(t._){case"inputMediaPoll":{const e=""+n.id;t.poll.id=e,this.appPollsManager.savePoll(t.poll,{_:"pollResults",flags:4,total_voters:0,pFlags:{},recent_voters:[]});const{poll:a,results:s}=this.appPollsManager.getPoll(e);r={_:"messageMediaPoll",poll:a,results:s};break}case"inputMediaPhoto":r={_:"messageMediaPhoto",photo:this.appPhotosManager.getPhoto(t.id.id)};break;case"inputMediaDocument":r={_:"messageMediaDocument",document:this.appDocsManager.getDoc(t.id.id)};break;case"inputMediaContact":r={_:"messageMediaContact",phone_number:t.phone_number,first_name:t.first_name,last_name:t.last_name,user_id:null!==(s=t.user_id)&&void 0!==s?s:"0",vcard:t.vcard};break;case"inputMediaGeoPoint":r={_:"messageMediaGeo",geo:a.geoPoint};break;case"inputMediaVenue":r={_:"messageMediaVenue",geo:a.geoPoint,title:t.title,address:t.address,provider:t.provider,venue_id:t.venue_id,venue_type:t.venue_type};break;case"messageMediaPending":r=t.messageMedia}n.media=r;const o=e=>{this.onMessagesSendError([n],e),this.rootScope.dispatchEvent("messages_pending")};return n.send=()=>{const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const r=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let p;return p=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.getInputPeerById(e),random_id:n.random_id,reply_to_msg_id:i||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent,send_as:r},s):this.apiManager.invokeApiAfter("messages.sendMedia",{peer:this.appPeersManager.getInputPeerById(e),media:t,random_id:n.random_id,reply_to_msg_id:i||void 0,message:"",clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent,send_as:r,update_stickersets_order:ea},s),this.pendingAfterMsgs[e]=s,p.then((e=>{e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)})),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{throw o(e),e})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(n,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0}),n.promise}beforeMessageSending(e,t={}){const a=e.id,s=this.getMessagePeer(e),n=t.isScheduled?this.getScheduledMessagesStorage(s):this.getHistoryMessagesStorage(s);e.storageKey=n.key;const i=[];if(t.isScheduled)this.saveMessages([e],{storage:n,isScheduled:!0,isOutgoing:!0}),i.push((()=>{this.rootScope.dispatchEvent("scheduled_new",e)}));else{const r=[this.getHistoryStorage(s),t.threadId?this.getHistoryStorage(s,t.threadId):void 0];for(const e of r)e&&e.history.unshift(a);if(this.saveMessages([e],{storage:n,isOutgoing:!0}),this.setDialogTopMessage(e),t.threadId){const a=this.dialogsStorage.getForumTopic(s,t.threadId);a&&this.setDialogTopMessage(e,a)}i.push((()=>{this.rootScope.dispatchEvent("history_append",{storageKey:n.key,message:e})}))}const r=this.pendingByRandomId[e.random_id]={peerId:s,tempId:a,threadId:t.threadId,storage:n,sequential:t.sequential};return this.pendingTopMsgs[s]=a,!t.isGroupedItem&&e.send&&i.push((()=>{t.clearDraft&&this.appDraftsManager.clearDraft(s,t.threadId),e.send()})),i.length&&(t.processAfter||Xt)((()=>{for(const e of i)e()})),r}generateOutgoingMessage(e,t){let a;t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId);const s=this.appPeersManager.isBroadcast(e);if(s&&this.appPeersManager.getPeer(e).pFlags.signatures){const e=this.appUsersManager.getSelf();a=e.first_name+(e.last_name?" "+e.last_name:"")}const n={_:"message",id:this.generateTempMessageId(e),from_id:t.sendAsPeerId?this.appPeersManager.getOutputPeer(t.sendAsPeerId):this.generateFromId(e),peer_id:this.appPeersManager.getOutputPeer(e),post_author:a,pFlags:this.generateFlags(e),date:t.scheduleDate||(0,te.Z)(!0)+this.timeManager.getServerTimeOffset(),message:"",grouped_id:t.groupId,random_id:(0,Te.a)(),reply_to:this.generateReplyHeader(e,t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:s&&1,pending:!0};return(0,ge.Z)(n,["send","promise"]),void 0===t.groupId&&(n.promise=(0,v.Z)()),n}generateReplyHeader(e,t,a){const s=this.appPeersManager.isForum(e);if(s&&!a){const s=this.getMessageByPeer(e,t);s&&(a=(0,Qt.Z)(s,!0))}const n={_:"messageReplyHeader",reply_to_msg_id:t||a,pFlags:{}};return a&&s&&o.Ox!==a&&(n.pFlags.forum_topic=!0),a&&n.reply_to_msg_id!==a&&(n.reply_to_top_id=a),n}generateReplies(e){let t;if(this.appPeersManager.isBroadcast(e)){const a=this.appProfileManager.getCachedFullChat(e.toChatId());(null==a?void 0:a.linked_chat_id)&&(t={_:"messageReplies",flags:1,pFlags:{comments:!0},channel_id:a.linked_chat_id,replies:0,replies_pts:0})}return t}generateFromId(e){return this.appPeersManager.isAnyChat(e)&&(this.appPeersManager.isBroadcast(e)||this.isAnonymousSending(e))?void 0:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId())}generateFlags(e){const t={};return e!==this.appUsersManager.getSelf().id&&(t.out=!0,this.appPeersManager.isChannel(e)||this.appUsersManager.isBot(e)||(t.unread=!0)),this.appPeersManager.isBroadcast(e)&&(t.post=!0),t}generateForwardHeader(e,t){const a=this.appUsersManager.getSelf().id.toPeerId(),s=t.fromId;if(s===a&&t.peerId===a&&!t.fwd_from)return;const n={_:"messageFwdHeader",flags:0,date:t.date};let i=!1;if(t.fwd_from)n.from_id=t.fwd_from.from_id,n.from_name=t.fwd_from.from_name,n.post_author=t.fwd_from.post_author;else{if(n.post_author=t.post_author,s.isUser()){const e=this.appProfileManager.getCachedFullUser(s.toUserId());(null==e?void 0:e.private_forward_name)&&(n.from_name=e.private_forward_name,i=!0)}i||(n.from_id=this.appPeersManager.getOutputPeer(s))}return this.appPeersManager.isBroadcast(t.peerId)&&(t.post_author&&(n.post_author=t.post_author),n.channel_post=t.id),e!==a||i||(n.saved_from_msg_id=t.id,n.saved_from_peer=this.appPeersManager.getOutputPeer(t.peerId)),n}generateFakeAvatarMessage(e,t){const a=Number.MAX_SAFE_INTEGER,s={_:"messageService",pFlags:{},action:{_:"messageActionChannelEditPhoto",photo:t},id:a,peer_id:this.appPeersManager.getOutputPeer(e),mid:a,peerId:e,date:t.date,fromId:e};return this.getHistoryMessagesStorage(e).set(a,s),s}getUploadPromise(e){return this.uploadFilePromises[e]}isAnonymousSending(e){var t,a;return!!e.isAnyChat()&&(null===(a=null===(t=this.appPeersManager.getPeer(e).admin_rights)||void 0===t?void 0:t.pFlags)||void 0===a?void 0:a.anonymous)}setDialogTopMessage(e,t=this.getDialogOnly(e.peerId)){t&&(t.top_message=e.mid,this.getHistoryStorage(e.peerId,"forumTopic"===t._?t.id:void 0).maxId=e.mid,this.dialogsStorage.generateIndexForDialog(t,!1,e),this.scheduleHandleNewDialogs(e.peerId,t))}cancelPendingMessage(e){const t=this.pendingByRandomId[e];if(t){const{peerId:a,tempId:s,storage:n}=t,i=this.getHistoryStorage(a);return this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteMessages",messages:[s],pts:void 0,pts_count:void 0}),i.history.delete(s),delete this.pendingByRandomId[e],n.delete(s),!0}return!1}fillConversations(e){return Yt(this,void 0,void 0,(function*(){const t=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(e);){const a=yield this.getTopMessages({limit:100,folderId:e});if(!t()||a.isEnd)break}}))}getReadMaxIdIfUnread(e,t){var a,s,n;const i=this.getHistoryStorage(e,t);if(t&&!this.appChatsManager.isForum(e.toChatId())){const t=this.getHistoryStorage(e),n=Math.max(null!==(a=t.readMaxId)&&void 0!==a?a:0,i.readMaxId),r=this.getMessageByPeer(e,i.maxId);return!(null===(s=null==r?void 0:r.pFlags)||void 0===s?void 0:s.out)&&n{if(!n()||"messages.dialogsNotModified"===r._)return null;d.ZP&&this.log("messages.getDialogs result:",r),i||s||t===ye||this.dialogsStorage.resetPinnedOrder(t),i||s||this.appDraftsManager.addMissedDialogs(),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages);let p=!!s,c=!1;const l=new Map,m=t===ye?o.J$:t,g=!!i||t===ye,h=r.dialogs||r.topics;if((0,ne.Z)(h,(e=>{var t,s;if(e)if(i||null!==(t=(s=e).folder_id)&&void 0!==t||(s.folder_id=m),this.dialogsStorage.saveDialog({dialog:e,ignoreOffsetDate:!0,saveGlobalOffset:g}),void 0!==e.peerId)if(p||this.appPeersManager.isChannel(e.peerId||this.appPeersManager.getPeerId(e.peer))||(this.incrementMaxSeenId(e.top_message),p=!0),a&&(0,ce.Z)(e)>a&&(this.scheduleHandleNewDialogs(e.peerId,e),c=!0),i||(0,oe.Z)(e.read_inbox_max_id)||(0,oe.Z)(e.read_outbox_max_id)){if(e.top_message){const t=this.getMessageByPeer(e.peerId,e.top_message);t&&(this.setMessageUnreadByDialog(t,e),this.dialogsStorage.setDialogToState(e))}}else l.set(e.peerId,{dialog:e}),this.log.error("noIdsDialogs",e,f);else this.log.error("bugged dialog?",e)})),l.size){const e=[...l.keys()],t=e.map((e=>this.reloadConversation(e)));Promise.all(t).then((()=>{this.rootScope.dispatchEvent("dialogs_multiupdate",l);for(let t=0;t=u||!h.length;v&&this.dialogsStorage.setDialogsLoaded(t,!0),c?this.scheduleHandleNewDialogs():this.rootScope.dispatchEvent("dialogs_multiupdate",new Map);const P=h,b=100===e?P:P.slice(0,e);return{isEnd:v&&b[b.length-1]===P[P.length-1],count:u,dialogs:b}};let p,f;return p=i?this.apiManager.invokeApiSingleProcess({method:"channels.getForumTopics",params:f={channel:this.appChatsManager.getChannelInput(i.toChatId()),limit:100,offset_date:s,offset_id:0,offset_topic:0},options:{noErrorBox:!0},processResult:e=>(e=this.dialogsStorage.processTopics(i,e),r(e))}):this.apiManager.invokeApiSingleProcess({method:"messages.getDialogs",params:f={folder_id:t,offset_date:s,offset_id:0,offset_peer:this.appPeersManager.getInputPeerById(undefined),limit:100,hash:"0"},options:{noErrorBox:!0},processResult:r}),p}forwardMessages(e,t,a,s={}){return Yt(this,void 0,void 0,(function*(){delete s.replyToMsgId,delete s.threadId,e=this.appPeersManager.getPeerMigratedTo(e)||e;for(let n=0,i=(a=a.slice().sort(((e,t)=>e-t))).length;n{var i,p,d,f,c;const l=this.getMessageByPeer(t,n),m=this.generateOutgoingMessage(e,s);o.push(m.id);const g=["entities","media"];s.dropAuthor||(m.fwd_from=this.generateForwardHeader(e,l),g.push("views","forwards"),(null===(i=m.fwd_from)||void 0===i?void 0:i.from_name)&&e===this.appPeersManager.peerId&&delete m.from_id),s.dropCaptions&&l.media||g.push("message");const h=null===(p=l.reply_to)||void 0===p?void 0:p.reply_to_msg_id,u=a.indexOf(h);if(h&&-1!==u){const e=o[u];m.reply_to={_:"messageReplyHeader",reply_to_msg_id:e}}g.forEach((e=>{m[e]=(0,ve.Z)(l[e])}));const y=null===(d=m.media)||void 0===d?void 0:d.document;return y&&(["round","voice"].includes(y.type)&&(m.pFlags.media_unread=!0),y.sticker&&!this.rootScope.premium&&(0,Wt.Z)(y)&&(m.media.pFlags.nopremium=!0)),l.grouped_id&&(null!==(f=r[c=l.grouped_id])&&void 0!==f?f:r[c]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(m),m}));for(const e in r){const t=r[e];t.messages.length>1&&t.messages.forEach((e=>{e.grouped_id=t.tempId}))}p.forEach((e=>{this.beforeMessageSending(e,{isScheduled:!!s.scheduleDate||void 0,sequential:!0})}));const d={};this.pendingAfterMsgs[e]&&(d.afterMessageId=this.pendingAfterMsgs[e].messageId);const f=this.apiManager.invokeApiAfter("messages.forwardMessages",{from_peer:this.appPeersManager.getInputPeerById(t),id:a.map((e=>(0,oe.Z)(e))),random_id:p.map((e=>e.random_id)),to_peer:this.appPeersManager.getInputPeerById(e),with_my_score:s.withMyScore,silent:s.silent,schedule_date:s.scheduleDate,drop_author:s.dropAuthor,drop_media_captions:s.dropCaptions,send_as:s.sendAsPeerId?this.appPeersManager.getInputPeerById(s.sendAsPeerId):void 0},d).then((e=>{this.log("forwardMessages updates:",e),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{throw this.onMessagesSendError(p,e),e})).finally((()=>{this.pendingAfterMsgs[e]===d&&delete this.pendingAfterMsgs[e]}));this.pendingAfterMsgs[e]=d;const c=[f];return i.length&&c.push(this.forwardMessages(e,t,i,s)),Promise.all(c).then(jt.Z)}))}generateEmptyMessage(e){}onMessagesSendError(e,t){e.forEach((e=>{if(e.error!==t)if(t){e.error=t,this.rootScope.dispatchEvent("message_error",{storageKey:e.storageKey,tempId:e.mid,error:t});const a=this.getDialogOnly(e.peerId);a&&this.rootScope.dispatchEvent("dialog_unread",{peerId:e.peerId,dialog:a})}else delete e.error}))}getMessagesStorageByKey(e){const t=e.split("_"),a=+t[0];return"scheduled"===t[1]?this.getScheduledMessagesStorage(a):this.getHistoryMessagesStorage(a)}getMessageFromStorage(e,t){return"string"==typeof e&&(e=this.getMessagesStorageByKey(e)),e&&e.get(t)}createMessageStorage(e,t){const a=new Map;return a.peerId=e,a.type=t,a.key=`${e}_${t}`,a}getHistoryMessagesStorage(e){var t,a;return null!==(t=(a=this.messagesStorageByPeerId)[e])&&void 0!==t?t:a[e]=this.createMessageStorage(e,"history")}getMessagesStorage(e){return"object"==typeof e?e:this.getMessagesStorageByKey(e)}getMessageById(e){for(const t in this.messagesStorageByPeerId){if(this.appPeersManager.isChannel(t.toPeerId()))continue;const a=this.messagesStorageByPeerId[t].get(e);if(a)return a}return this.getMessageFromStorage(null,e)}getMessageByPeer(e,t){return e?this.getMessageFromStorage(this.getHistoryMessagesStorage(e),t):this.getMessageById(t)}getMessagePeer(e){return e.peer_id&&this.appPeersManager.getPeerId(e.peer_id)||o.NM}getDialogOnly(e){return this.dialogsStorage.getDialogOnly(e)}cantForwardDeleteMids(e,t){const a=this.getMessagesStorage(e);let s=!t.length,n=!t.length;for(const e of t){const t=this.getMessageFromStorage(a,e);if(s||(s=!this.canForward(t)),n||(n=!this.canDeleteMessage(t)),s&&n)break}return{cantForward:s,cantDelete:n}}reloadConversationOrTopic(e,t){t?this.dialogsStorage.getForumTopicById(e,t):this.reloadConversation(e)}reloadConversation(e){let t;if(void 0!==e){const a=this.appPeersManager.getPeerId(e);this.log.warn("reloadConversation",a);let s=this.reloadConversationsPeers.get(a);if(s&&(t=s.promise),t)return t;t=(0,v.Z)(),this.reloadConversationsPeers.set(a,s={inputDialogPeer:this.appPeersManager.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=(0,P.Z)(0).then((()=>{const e=[],t={};for(const[a,{inputDialogPeer:s,promise:n}]of this.reloadConversationsPeers)e.push(s),t[a]=n;const a=()=>{for(const e in t)this.reloadConversationsPeers.delete(+e),t[e].resolve(void 0)};return(()=>Yt(this,void 0,void 0,(function*(){for(;;){const t=yield this.apiManager.invokeApi("messages.getPeerDialogs",{peers:e}),a=this.apiUpdatesManager.updatesState,{state:s}=t;if(!a.pts||a.pts===s.pts)return t;yield(0,P.Z)(500)}})))().then((e=>{for(const e in t)this.reloadConversationsPeers.delete(+e);this.dialogsStorage.applyDialogs(e),e.dialogs.forEach((e=>{const a=e.peerId;a&&(t[a].resolve(e),delete t[a])}))}),jt.Z).then((()=>{a(),this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()}))}))),t||this.reloadConversationsPromise}doFlushHistory(e,t,a,s){let n;const i=n=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:n.pts,pts_count:n.pts_count}}),!n.offset||this.doFlushHistory(e,t,a,s));return n=s?this.apiManager.invokeApiSingleProcess({method:"channels.deleteTopicHistory",params:{channel:this.appChatsManager.getChannelInput(e.toChatId()),top_msg_id:(0,oe.Z)(s)},processResult:i}):this.apiManager.invokeApiSingleProcess({method:"messages.deleteHistory",params:{just_clear:t,revoke:a,peer:this.appPeersManager.getInputPeerById(e),max_id:0},processResult:i}),n}flushHistory(e,t,a,s){return Yt(this,void 0,void 0,(function*(){if(this.appPeersManager.isChannel(e)&&!s){const t=this.getHistory(e,0,1),a=yield t,s=e.toChatId(),n=a.history[0]||0;return this.apiManager.invokeApiSingle("channels.deleteHistory",{channel:this.appChatsManager.getChannelInput(s),max_id:(0,oe.Z)(n)}).then((e=>(e&&this.apiUpdatesManager.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:s,available_min_id:n}),e)))}return this.doFlushHistory(e,t,a,s).then((()=>{if(s||this.flushStoragesByPeerId(e),t)this.rootScope.dispatchEvent("dialog_flush",{peerId:e,dialog:this.getDialogOnly(e)});else{const t=this.getTypingKey(e,s);if(delete this.notificationsToHandle[t],delete this.typings[t],!s){const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0))}this.dialogsStorage.dropDialogOnDeletion(e,s)}}))}))}flushStoragesByPeerId(e){[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pendingAfterMsgs,this.pendingTopMsgs].forEach((t=>{delete t[e]}));for(const t in this.pinnedMessages)(+t===e||t.startsWith(e+"_"))&&delete this.pinnedMessages[t];const t=this.needSingleMessages.get(e);if(t){for(const[e,a]of t)a.resolve(this.generateEmptyMessage(e));t.clear()}[this.messagesStorageByPeerId,this.scheduledMessagesStorage].forEach((t=>{const a=t[e];a&&a.clear()})),this.dialogsStorage.flushForumTopicsCache(e)}hidePinnedMessages(e){return Promise.all([this.appStateManager.getState(),this.getPinnedMessage(e)]).then((([t,a])=>{t.hiddenPinnedMessages[e]=a.maxId,this.rootScope.dispatchEvent("peer_pinned_hidden",{peerId:e,maxId:a.maxId})}))}getPinnedMessagesKey(e,t){return e+(t?"_"+t:"")}getPinnedMessage(e,t){var a,s,n;const i=null!==(a=(s=this.pinnedMessages)[n=this.getPinnedMessagesKey(e,t)])&&void 0!==a?a:s[n]={};return i.promise?i.promise:i.maxId?Promise.resolve(i):i.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1,threadId:t}).then((e=>{var t;return i.count=e.count,i.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,i})).finally((()=>{delete i.promise}))}getPinnedMessagesCount(e,t){var a;return null===(a=this.pinnedMessages[this.getPinnedMessagesKey(e,t)])||void 0===a?void 0:a.count}getPinnedMessagesMaxId(e,t){var a;return null===(a=this.pinnedMessages[this.getPinnedMessagesKey(e,t)])||void 0===a?void 0:a.maxId}updatePinnedMessage(e,t,a,s,n){return this.apiManager.invokeApi("messages.updatePinnedMessage",{peer:this.appPeersManager.getInputPeerById(e),unpin:a,silent:s,pm_oneside:n,id:(0,oe.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}unpinAllMessages(e){return this.apiManager.invokeApiSingle("messages.unpinAllMessages",{peer:this.appPeersManager.getInputPeerById(e)}).then((t=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:t.pts,pts_count:t.pts_count}}),t.offset?this.unpinAllMessages(e):(this.getHistoryMessagesStorage(e).forEach((e=>{e.pFlags.pinned&&delete e.pFlags.pinned})),this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:e,unpinAll:!0}),delete this.pinnedMessages[this.getPinnedMessagesKey(e)],!0))))}getAlbumText(e){const t=this.groupedMessagesStorage[e];return(0,Ht.Z)(Array.from(t.values()))}getGroupsFirstMessage(e){if(!(null==e?void 0:e.grouped_id))return e;const t=this.groupedMessagesStorage[e.grouped_id];let a=Number.MAX_SAFE_INTEGER;for(const[e,s]of t)s.midthis.getMessageFromStorage(a,e)))}getMidsByMessage(e){return e?e.grouped_id?this.getMidsByAlbum(e.grouped_id):[e.mid]:[]}filterMessages(e,t){const a=[];if(e.grouped_id){const s=this.groupedMessagesStorage[e.grouped_id];for(const[e,n]of s)t(n)&&a.push(n)}else t(e)&&a.push(e);return a}generateTempMessageId(e){const t=this.getDialogOnly(e);return this.appMessagesIdsManager.generateTempMessageId((null==t?void 0:t.top_message)||0)}setMessageUnreadByDialog(e,t=this.getDialogOnly(e.peerId)){t&&e.mid&&e.mid>t[e.pFlags.out?"read_outbox_max_id":"read_inbox_max_id"]&&(e.pFlags.unread=!0)}saveMessage(e,t={}){var a,s,n,i,r;if(!e||"messageEmpty"===e._)return;null!==(a=e.pFlags)&&void 0!==a||(e.pFlags={});const p=this.getMessagePeer(e),d=t.storage||this.getHistoryMessagesStorage(p),f="peerChannel"===e.peer_id._,c=f&&this.appChatsManager.isBroadcast(p.toChatId()),l="message"===e._;t.isOutgoing&&(e.pFlags.is_outgoing=!0);const m=(0,pe.Z)(e.id);e.mid=m,l&&(t.isScheduled&&(e.pFlags.is_scheduled=!0),e.grouped_id&&(null!==(s=(i=this.groupedMessagesStorage)[r=e.grouped_id])&&void 0!==s?s:i[r]=this.createMessageStorage(p,"grouped")).set(m,e),e.via_bot_id&&(e.viaBotId=e.via_bot_id));const g=e.reply_to;g&&(g.reply_to_msg_id&&(g.reply_to_msg_id=e.reply_to_mid=(0,pe.Z)(g.reply_to_msg_id)),g.reply_to_top_id&&(g.reply_to_top_id=(0,pe.Z)(g.reply_to_top_id)));const h=l&&e.replies;h&&(h.max_id&&(h.max_id=(0,pe.Z)(h.max_id)),h.read_max_id&&(h.read_max_id=(0,pe.Z)(h.read_max_id)));const u=!!p;u||(e.date-=this.timeManager.getServerTimeOffset());const y=this.appPeersManager.peerId,_=l&&e.fwd_from;if(e.peerId=p,e.fromId=p===y?_?_.from_id?this.appPeersManager.getPeerId(_.from_id):o.NM:y:e.pFlags.post||!e.from_id?p:this.appPeersManager.getPeerId(e.from_id),this.setMessageUnreadByDialog(e),_){_.saved_from_msg_id&&(_.saved_from_msg_id=(0,pe.Z)(_.saved_from_msg_id)),_.channel_post&&(_.channel_post=(0,pe.Z)(_.channel_post));const t=_.saved_from_peer||_.from_id,a=_.saved_from_msg_id||_.channel_post;if(t&&a){const s=this.appPeersManager.getPeerId(t),n=(0,pe.Z)(a);e.savedFrom=s+"_"+n}e.fwdFromId=this.appPeersManager.getPeerId(_.from_id),u||(_.date-=this.timeManager.getServerTimeOffset())}const v={type:"message",peerId:p,messageId:m};let P=!1;const b=l&&e.media;if(b)switch(b._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":b.ttl_seconds?P=!0:b.photo=this.appPhotosManager.savePhoto(b.photo,v),b.photo||delete e.media;break;case"messageMediaPoll":{const t=this.appPollsManager.savePoll(b.poll,b.results,e);b.poll=t.poll,b.results=t.results;break}case"messageMediaDocument":if(b.ttl_seconds)P=!0;else{const e=b.document;b.document=this.appDocsManager.saveDoc(e,v),b.document||"documentEmpty"===e._||(P=!0)}break;case"messageMediaWebPage":{const a=this.appWebPagesManager.getMessageKeyForPendingWebPage(p,m,t.isScheduled);b.webpage=this.appWebPagesManager.saveWebPage(b.webpage,a,v),b.webpage||delete e.media;break}case"messageMediaInvoice":{b.photo=this.appWebDocsManager.saveWebDocument(b.photo);const e=b.extended_media;if("messageExtendedMedia"===(null==e?void 0:e._)){const t=e.media;t.photo=this.appPhotosManager.savePhoto(t.photo,v),t.document=this.appDocsManager.saveDoc(t.document,v)}break}case"messageMediaUnsupported":P=!0}if(l&&P&&(e.media={_:"messageMediaUnsupported"},e.message="",delete e.entities,delete e.totalEntities),!l&&e.action){const t=e.action,a=e.fromId===this.appUsersManager.getSelf().id?"You":"";let s,i;switch(t.photo&&(t.photo=this.appPhotosManager.savePhoto(t.photo,v)),t.document&&(t.document=this.appDocsManager.saveDoc(t.photo,v)),t._){case"messageActionChatEditPhoto":(null===(n=t.photo)||void 0===n?void 0:n.video_sizes)?t._=c?"messageActionChannelEditVideo":"messageActionChatEditVideo":c&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let e;this.appGroupCallsManager.saveGroupCall(t.call),e=void 0===t.duration?"started":"ended",c||(e+="_by"+a),t.type=e;break}case"messageActionChatEditTitle":c&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":c&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=f?"messageActionChatJoined"+a:"messageActionChatReturn"+a)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+a);break;case"messageActionChannelMigrateFrom":s=t.chat_id.toPeerId(!0),i=p;break;case"messageActionChatMigrateTo":s=p,i=t.channel_id.toPeerId(!0);break;case"messageActionHistoryClear":e.clear_history=!0,delete e.pFlags.out,delete e.pFlags.unread;break;case"messageActionPhoneCall":t.type=(t.pFlags.video?"video_":"")+(void 0!==t.duration?e.pFlags.out?"out_":"in_":"")+(void 0!==t.duration?"ok":"phoneCallDiscardReasonMissed"===t.reason._?"missed":"cancelled")}s&&i&&!this.migratedFromTo[s]&&!this.migratedToFrom[i]&&this.migrateChecks(s,i)}return l&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),d.set(m,e),e}saveMessages(e,t={}){return e.saved||(e.saved=!0,e.forEach(((e,a,s)=>{s[a]=this.saveMessage(e,t)}))),e}getFirstMessageToEdit(e,t){return Yt(this,void 0,void 0,(function*(){const a=this.getHistoryStorage(e,t).history.slice;if(a.isEnd(se.D.Bottom)&&a.length){let t;const s=this.appPeersManager.peerId;for(const n of a){const a=this.getMessageByPeer(e,n);if((s===e?a.fromId===s:a.pFlags.out)&&(yield this.canEditMessage(a,"text"))){t=a;break}}return t}}))}wrapMessageEntities(e){const t=e.entities?e.entities.slice():[];e.message=(0,Pt.Z)(e.message,t);const a=(0,Lt.Z)(e.message);e.totalEntities=(0,Ot.Z)(t,a)}reportMessages(e,t,a,s){return this.apiManager.invokeApiSingle("messages.report",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e))),reason:{_:a},message:s})}startBot(e,t,a){const s=t?t.toPeerId(!0):e.toPeerId();if(a){const t=(0,Te.a)();return this.apiManager.invokeApi("messages.startBot",{bot:this.appUsersManager.getUserInput(e),peer:this.appPeersManager.getInputPeerById(s),random_id:t,start_param:a}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}const n="/start";if(t){let a;return a=this.appChatsManager.isChannel(t)?this.appChatsManager.inviteToChannel(t,[e]):this.appChatsManager.addChatUser(t,e,0),a.catch((e=>{if("USER_ALREADY_PARTICIPANT"!=(null==e?void 0:e.type))throw e;e.handled=!0})).then((()=>this.sendText(s,n+"@"+this.appPeersManager.getPeerUsername(e.toPeerId()))))}return this.sendText(s,n)}editPeerFolders(e,t){this.apiManager.invokeApi("folders.editPeerFolders",{folder_peers:e.map((e=>({_:"inputFolderPeer",peer:this.appPeersManager.getInputPeerById(e),folder_id:t})))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getFilter(e){return this.filtersStorage.getFilter(e)}toggleDialogPin(e){var t;return Yt(this,void 0,void 0,(function*(){const{peerId:a,topicId:s,filterId:n=(s?a:void 0)}=e;if(void 0===n)throw new Error("No filterId");if(n>1)return this.filtersStorage.toggleDialogPin(a,n);const i=this.dialogsStorage.getDialogOrTopic(a,s);if(!i)throw void 0;const r=!(null===(t=i.pFlags)||void 0===t?void 0:t.pinned)||void 0;if(r){const e=yield this.apiManager.getLimit(s?"topicPin":1===n?"folderPin":"pin");if(this.dialogsStorage.getPinnedOrders(n).length>=e)throw(0,X.Z)(s?"PINNED_TOO_MUCH":"PINNED_DIALOGS_TOO_MUCH")}return s?this.appChatsManager.updatePinnedForumTopic(a.toChatId(),s,r):this.apiManager.invokeApi("messages.toggleDialogPin",{peer:this.appPeersManager.getInputDialogPeerById(a),pinned:r}).then((e=>{const t=r?{pinned:r}:{};this.apiUpdatesManager.saveUpdate({_:"updateDialogPinned",peer:this.appPeersManager.getDialogPeer(a),folder_id:n,pFlags:t})}))}))}markDialogUnread(e,t){var a;const s=this.getDialogOnly(e);if(!s)return Promise.reject();const n=!t&&!(null===(a=s.pFlags)||void 0===a?void 0:a.unread_mark)||void 0;return this.apiManager.invokeApi("messages.markDialogUnread",{peer:this.appPeersManager.getInputDialogPeerById(e),unread:n}).then((t=>{if(t){const t=n?{unread:n}:{};this.onUpdateDialogUnreadMark({_:"updateDialogUnreadMark",peer:this.appPeersManager.getDialogPeer(e),pFlags:t})}}))}migrateChecks(e,t){if(!this.migratedFromTo[e]&&!this.migratedToFrom[t]&&this.appChatsManager.hasChat(t.toChatId())){const a=this.appChatsManager.getChat(e.toChatId());(null==a?void 0:a.migrated_to)&&a.migrated_to.channel_id===t.toChatId()&&(this.migratedFromTo[e]=t,this.migratedToFrom[t]=e,this.rootScope.dispatchEvent("dialog_migrate",{migrateFrom:e,migrateTo:t}),this.dialogsStorage.dropDialogWithEvent(e))}}canMessageBeEdited(e,t){var a,s;if(null===(a=null==e?void 0:e.pFlags)||void 0===a?void 0:a.is_outgoing)return!1;const n=["messageMediaPhoto","messageMediaDocument","messageMediaWebPage"];return"poll"===t&&n.push("messageMediaPoll"),!(!e||"message"!==e._||e.deleted||e.fwd_from||e.via_bot_id||e.media&&-1===n.indexOf(e.media._)||e.fromId&&this.appUsersManager.isBot(e.fromId)||"messageMediaDocument"===(null===(s=e.media)||void 0===s?void 0:s._)&&(e.media.document.sticker||"round"===e.media.document.type))}canEditMessage(e,t="text"){var a;return Yt(this,void 0,void 0,(function*(){return!(!e||!this.canMessageBeEdited(e,t))&&(this.getMessagePeer(e)===this.appUsersManager.getSelf().id||!(!(this.appPeersManager.isBroadcast(e.peerId)?this.appChatsManager.hasRights(e.peerId.toChatId(),"edit_messages"):e.pFlags.out)||"peerChannel"!==e.peer_id._&&e.date<(0,te.Z)(!0)-(yield this.apiManager.getConfig()).edit_time_limit&&"messageMediaPoll"!==(null===(a=e.media)||void 0===a?void 0:a._)))}))}canDeleteMessage(e){return e&&(e.peerId.isUser()||e.pFlags.out||"chat"===this.appChatsManager.getChat(e.peerId.toChatId())._||this.appChatsManager.hasRights(e.peerId.toChatId(),"delete_messages"))&&(!e.pFlags.is_outgoing||!!e.error)}getReplyKeyboard(e){return this.getHistoryStorage(e).replyMarkup}mergeReplyKeyboard(e,t){var a,s;if(!t)return!1;const n=t.reply_markup;if(!n&&!(null===(a=t.pFlags)||void 0===a?void 0:a.out)&&!t.action)return!1;if("replyInlineMarkup"===(null==n?void 0:n._))return!1;const i=e.replyMarkup;if(n)return!(i&&i.mid>=t.mid||n.pFlags.selective||(e.maxOutId&&t.midi.mid||t.pFlags.is_outgoing)&&t.message)return i.pFlags.hidden=!0,!0}else(!e.maxOutId||t.mid>e.maxOutId)&&(e.maxOutId=t.mid);return(0,ue.Z)(t),!("messageActionChatDeleteUser"!==(null===(s=t.action)||void 0===s?void 0:s._)||!(i?t.action.user_id===i.fromId:this.appUsersManager.isBot(t.action.user_id))||(e.replyMarkup={_:"replyKeyboardHide",mid:t.mid,pFlags:{}},0))}getSearchStorage(e,t){return this.searchesStorage[e]||(this.searchesStorage[e]={}),this.searchesStorage[e][t]||(this.searchesStorage[e][t]={history:[]}),this.searchesStorage[e][t]}getSearchCounters(e,t,a=!0,s){return this.appPeersManager.isPeerRestricted(e)?Promise.resolve(t.map((e=>({_:"messages.searchCounter",pFlags:{},filter:e,count:0})))):(a?this.apiManager.invokeApiCacheable:this.apiManager.invokeApi).bind(this.apiManager)("messages.getSearchCounters",{peer:this.appPeersManager.getInputPeerById(e),filters:t,top_msg_id:s?(0,oe.Z)(s):void 0})}filterMessagesByInputFilterFromStorage(e,t,a,s){const n=this.getMessagesStorage(a);return(0,Nt.Z)(e,t.map((e=>n.get(e))),s)}getSearch({peerId:e,query:t,inputFilter:a,maxId:s,limit:n,nextRate:i,backLimit:r,threadId:o,folderId:p,minDate:f,maxDate:c}){if(this.appPeersManager.isPeerRestricted(e))return Promise.resolve({count:0,offset_id_offset:0,next_rate:void 0,history:[]});t||(t=""),a||(a={_:"inputMessagesFilterEmpty"}),void 0===n&&(n=20),i||(i=0),r||(r=0),f=f?f/1e3|0:0,c=c?c/1e3|0:0;let l=[];r&&(n+=r);let m;if(!e||r||s||t||1===n||o||(m=this.getHistoryStorage(e),l=this.filterMessagesByInputFilterFromStorage(a._,m.history.slice,this.getHistoryMessagesStorage(e),n)),l.length){if(!(l.length{this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.saveMessages(e.messages),d.ZP&&this.log("getSearch result:",a,e);const t=e.count||l.length+e.messages.length;return e.messages.forEach((e=>{const t=this.getMessagePeer(e);if(t.isAnyChat()){const e=this.appChatsManager.getChat(t.toChatId());e.migrated_to&&this.migrateChecks(t,e.migrated_to.channel_id.toPeerId(!0))}l.push(e)})),{count:t,offset_id_offset:e.offset_id_offset||0,next_rate:e.next_rate,history:l}}))}subscribeRepliesThread(e,t){const a=e+"_"+t;for(const e in this.threadsToReplies)if(this.threadsToReplies[e]===a)return;this.getDiscussionMessage(e,t)}generateThreadServiceStartMessage(e){const t=e.peerId+"_"+e.mid;if(this.threadsServiceMessagesIdsStorage[t])return;const a=(0,oe.Z)(Math.max(...this.getMidsByMessage(e))),s={_:"messageService",pFlags:{is_single:!0},id:this.appMessagesIdsManager.generateTempMessageId(a),date:e.date,from_id:{_:"peerUser",user_id:o.NM},peer_id:e.peer_id,action:{_:"messageActionDiscussionStarted"},reply_to:this.generateReplyHeader(e.peerId,e.id)};this.saveMessages([s],{isOutgoing:!0}),this.threadsServiceMessagesIdsStorage[t]=s.mid}getThreadServiceMessageId(e,t){return this.threadsServiceMessagesIdsStorage[e+"_"+t]}getDiscussionMessage(e,t){return this.apiManager.invokeApiSingle("messages.getDiscussionMessage",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((a=>{var s;this.appChatsManager.saveApiChats(a.chats),this.appUsersManager.saveApiUsers(a.users),this.saveMessages(a.messages);const n=this.getMessageWithReplies(a.messages[0]),i=n.peerId+"_"+n.mid;this.generateThreadServiceStartMessage(n);const r=this.getHistoryStorage(n.peerId,n.mid),o=a.max_id=(0,pe.Z)(a.max_id)||0;a.read_inbox_max_id=r.readMaxId=(0,pe.Z)(null!==(s=a.read_inbox_max_id)&&void 0!==s?s:n.mid),a.read_outbox_max_id=r.readOutboxMaxId=(0,pe.Z)(a.read_outbox_max_id)||0;const p=r.history.first;return r.maxId&&r.maxId{this.newDialogsHandlePromise=void 0,this.handleNewDialogs()}))}deleteMessages(e,t,a){var s,n;return Yt(this,void 0,void 0,(function*(){let i;const r=yield this.apiManager.getConfig(),o=t.splice(r.forwarded_count_max,t.length-r.forwarded_count_max),p=t.map((e=>(0,oe.Z)(e)));if(e.isAnyChat()&&this.appPeersManager.isChannel(e)){const a=e.toChatId(),r=this.appChatsManager.getChat(a);if(!r.pFlags.creator&&!(null===(n=null===(s=r.admin_rights)||void 0===s?void 0:s.pFlags)||void 0===n?void 0:n.delete_messages)&&!(t=t.filter((t=>!!this.getMessageByPeer(e,t).pFlags.out))).length)return;i=this.apiManager.invokeApi("channels.deleteMessages",{channel:this.appChatsManager.getChannelInput(a),id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteChannelMessages",channel_id:a,messages:t,pts:e.pts,pts_count:e.pts_count})}))}else i=this.apiManager.invokeApi("messages.deleteMessages",{revoke:a,id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteMessages",messages:t,pts:e.pts,pts_count:e.pts_count})}));const d=[i];return o.length&&d.push(this.deleteMessages(e,o,a)),Promise.all(d).then(jt.Z)}))}readHistory(e,t=0,a,s=!1){if(this.log("readHistory:",e,t,a),!this.getReadMaxIdIfUnread(e,a)){if(a&&!s){const t=this.dialogsStorage.getForumTopic(e,a);(0,oe.Z)(t.read_inbox_max_id)||(s=!0)}if(!s){const t=this.appChatsManager.isForum(e.toChatId())&&a?this.dialogsStorage.getForumTopic(e,a):this.getDialogOnly(e);t&&this.isDialogUnread(t)&&(s=!0)}if(!s)return this.log("readHistory: isn't unread"),Promise.resolve()}const n=this.getHistoryStorage(e,a);if(n.triedToReadMaxId>=t)return Promise.resolve();let i;return a?(n.readPromise||(i=this.apiManager.invokeApi("messages.readDiscussion",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(a),read_max_id:(0,oe.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelDiscussionInbox",channel_id:e.toChatId(),top_msg_id:a,read_max_id:t})):this.appPeersManager.isChannel(e)?(n.readPromise||(i=this.apiManager.invokeApi("channels.readHistory",{channel:this.appChatsManager.getChannelInput(e.toChatId()),max_id:(0,oe.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelInbox",max_id:t,channel_id:e.toChatId(),still_unread_count:void 0,pts:void 0})):(n.readPromise||(i=this.apiManager.invokeApi("messages.readHistory",{peer:this.appPeersManager.getInputPeerById(e),max_id:(0,oe.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})}))),this.apiUpdatesManager.processLocalUpdate({_:"updateReadHistoryInbox",max_id:t,peer:this.appPeersManager.getOutputPeer(e),still_unread_count:void 0,pts:void 0,pts_count:void 0})),this.rootScope.dispatchEvent("notification_reset",this.appPeersManager.getPeerString(e)),n.readPromise?n.readPromise:(n.triedToReadMaxId=t,i.finally((()=>{delete n.readPromise;const{readMaxId:s}=n;this.log("readHistory: promise finally",t,s),s>t&&this.readHistory(e,s,a,!0)})),n.readPromise=i)}readAllHistory(e,t,a=!1){const s=this.getHistoryStorage(e,t);s.maxId&&this.readHistory(e,s.maxId,t,a)}getUnreadMentionsKey(e,t){return e+(t?`_${t}`:"")}fixDialogUnreadMentionsIfNoMessage(e,t){const a=this.dialogsStorage.getDialogOrTopic(e,t);(null==a?void 0:a.unread_mentions_count)&&this.reloadConversationOrTopic(e)}modifyCachedMentions(e,t,a,s){const n=this.unreadMentions[this.getUnreadMentionsKey(e,s)];n&&(a?n.first.isEnd(se.D.Top)&&n.insertSlice([t]):n.delete(t))}fixUnreadMentionsCountIfNeeded(e,t,a){const s=this.dialogsStorage.getDialogOrTopic(e,a);!t.length&&(null==s?void 0:s.unread_mentions_count)&&this.reloadConversationOrTopic(e)}goToNextMention(e,t){var a,s;const n=this.getUnreadMentionsKey(e,t),i=this.goToNextMentionPromises[n];if(i)return i;const r=null!==(a=(s=this.unreadMentions)[e])&&void 0!==a?a:s[e]=new se.Z,o=r.length,p=r.first.isEnd(se.D.Top);if(!o&&p)return this.fixUnreadMentionsCountIfNeeded(e,r,t),Promise.resolve();let d=Promise.resolve();return!p&&o<25&&(d=this.loadNextMentions(e,t)),this.goToNextMentionPromises[n]=d.then((()=>{const a=r.last,s=a&&a[a.length-1];if(s)return r.delete(s),s;this.fixUnreadMentionsCountIfNeeded(e,r,t)})).finally((()=>{delete this.goToNextMentionPromises[n]}))}loadNextMentions(e,t){const a=this.unreadMentions[e],s=a.first[0]||1;return this.getUnreadMentions(e,s,-50,50,void 0,void 0,t).then((e=>{this.mergeHistoryResult(a,e,1===s?0:s,50,-50)}))}getUnreadMentions(e,t,a,s,n=0,i=0,r){return this.apiManager.invokeApiSingleProcess({method:"messages.getUnreadMentions",params:{peer:this.appPeersManager.getInputPeerById(e),offset_id:(0,oe.Z)(t),add_offset:a,limit:s,max_id:(0,oe.Z)(n),min_id:(0,oe.Z)(i),top_msg_id:r?(0,oe.Z)(r):void 0},processResult:e=>((0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.saveMessages(e.messages),e)})}readMessages(e,t){if(!t.length)return Promise.resolve();let a,s;if(t=t.map((e=>(0,oe.Z)(e))),e.isAnyChat()&&this.appPeersManager.isChannel(e)){const n=e.toChatId();s={_:"updateChannelReadMessagesContents",channel_id:n,messages:t},a=this.apiManager.invokeApi("channels.readMessageContents",{channel:this.appChatsManager.getChannelInput(n),id:t})}else s={_:"updateReadMessagesContents",messages:t,pts:void 0,pts_count:void 0},a=this.apiManager.invokeApi("messages.readMessageContents",{id:t}).then((e=>{s.pts=e.pts,s.pts_count=e.pts_count,this.apiUpdatesManager.processLocalUpdate(s)}));return this.apiUpdatesManager.processLocalUpdate(s),a}getHistoryStorage(e,t){var a,s,n,i,r,o;return t?null!==(s=(r=null!==(a=(i=this.threadsStorage)[e])&&void 0!==a?a:i[e]={})[t])&&void 0!==s?s:r[t]={count:null,history:new se.Z}:null!==(n=(o=this.historiesStorage)[e])&&void 0!==n?n:o[e]={count:null,history:new se.Z}}getHistoryStorageTransferable(e,t){const a=this.getHistoryStorage(e,t),{count:s,history:n,maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}=a;return{count:s,history:void 0,historySerialized:n.toJSON(),maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}}getNotifyPeerSettings(e,t){const a=this.appPeersManager.getInputNotifyPeerById({peerId:e,ignorePeerId:!0,threadId:t});return Promise.all([this.appNotificationsManager.getNotifyPeerTypeSettings(),this.appNotificationsManager.getNotifySettings(a)]).then((([a,s])=>({muted:this.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!0,threadId:t}),peerTypeNotifySettings:s})))}getUpdateAfterReloadKey(e,t){return e+(t?"_"+t:"")}handleNewUpdateAfterReload(e,t,a){var s,n,i;const r=null!==(s=(n=this.newUpdatesAfterReloadToHandle)[i=this.getUpdateAfterReloadKey(e,a)])&&void 0!==s?s:n[i]=new Set;r.has(t)?this.log.error("here we go again",e):(t.ignoreExisting=!0,r.add(t),this.scheduleHandleNewDialogs(e,a))}setDialogToStateIfMessageIsTop(e){this.isMessageIsTopMessage(e)&&this.dialogsStorage.setDialogToState(this.getDialogOnly(e.peerId))}isMessageIsTopMessage(e){const t=this.getDialogOnly(e.peerId);return t&&t.top_message===e.mid}updateMessageRepliesIfNeeded(e){try{const t=this.getThreadKey(e);if(t){const e=this.threadsToReplies[t];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}}catch(t){this.log.error("incrementMessageReplies err",t,e)}}getThreadKey(e){var t;let a="";if(null===(t=null==e?void 0:e.peerId)||void 0===t?void 0:t.isAnyChat()){const t=(0,Qt.Z)(e,this.appChatsManager.isForum(e.peerId.toChatId()));t&&(a=e.peerId+"_"+t)}return a}updateMessage(e,t,a){return this.reloadMessages(e,t,!0).then((()=>{const s=this.getMessageByPeer(e,t);if(s)return a&&this.rootScope.dispatchEvent(a,s),s}))}checkPendingMessage(e){const t=this.pendingByMessageId[e.mid];let a;if(t){const s=this.pendingByRandomId[t];(a=this.finalizePendingMessage(t,e))&&this.rootScope.dispatchEvent("history_update",{storageKey:s.storage.key,message:e,sequential:s.sequential}),delete this.pendingByMessageId[e.mid]}return a}mutePeer(e){if(!(e=this.appNotificationsManager.validatePeerSettings(e)))return;const{peerId:t,muteUntil:a,threadId:s}=e,n={_:"inputPeerNotifySettings"};n.mute_until=a;const i=this.appPeersManager.getInputPeerById(t);return this.appNotificationsManager.updateNotifySettings(s?{_:"inputNotifyForumTopic",peer:i,top_msg_id:(0,oe.Z)(s)}:{_:"inputNotifyPeer",peer:i},n)}togglePeerMute({peerId:e,mute:t,threadId:a}){return void 0===t&&(t=!this.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1,threadId:a})),this.mutePeer({peerId:e,muteUntil:t?o.rU:0,threadId:a})}findPeerIdByMids(e){for(let t=e.length-1;t>=0;--t){const a=e[t],s=this.getMessageById(a);if(s)return s.peerId}}canSendToPeer(e,t,a="send_messages"){var s;if(this.appPeersManager.isPeerRestricted(e))return!1;if(e.isAnyChat()){const n=e.toChatId();if(t){const a=this.dialogsStorage.getForumTopic(e,t);if((null===(s=null==a?void 0:a.pFlags)||void 0===s?void 0:s.closed)&&!this.appChatsManager.hasRights(n,"manage_topics"))return!1}const i=this.appChatsManager.getChat(n);return this.appChatsManager.hasRights(n,a,void 0,!!t)&&(!i.pFlags.left||!!t)}return this.appUsersManager.canSendToUser(e)}finalizePendingMessage(e,t){const a=this.pendingByRandomId[e];if(!a)return;const{peerId:s,tempId:n,threadId:i,storage:r}=a;[this.getHistoryStorage(s),i?this.getHistoryStorage(s,i):void 0].filter(Boolean).forEach((e=>{e.history.delete(n)}));const o=this.getMessageFromStorage(r,n);return o&&(delete t.pFlags.is_outgoing,delete t.pending,delete t.error,delete t.random_id,delete t.send),this.rootScope.dispatchEvent("messages_pending"),delete this.pendingByRandomId[e],this.finalizePendingMessageCallbacks(r,n,t),o}finalizePendingMessageCallbacks(e,t,a){const s=this.tempFinalizeCallbacks[t];if(void 0!==s){for(const e in s){const{deferred:t,callback:n}=s[e];n(a).then(t.resolve,t.reject)}delete this.tempFinalizeCallbacks[t]}if(a.media){(0,ue.Z)(a);const{photo:e,document:s}=a.media;if(e){const a=this.appPhotosManager.getPhoto(""+t);if(a){const t=e.sizes[e.sizes.length-1],s=this.thumbsStorage.getCacheContext(e,t.type),n=this.thumbsStorage.getCacheContext(a,o.Pt);Object.assign(s,n);const i=e.sizes[e.sizes.length-1],r=(0,Vt.Z)(e,i);(0,ct.P)(r.location)}}else if(s){const e=this.appDocsManager.getDoc(""+t);if(e){const t=this.thumbsStorage.getCacheContext(e);if(e.type&&"sticker"!==e.type&&"image/gif"!==e.mime_type&&t.url){const e=this.thumbsStorage.getCacheContext(s);Object.assign(e,t),n=s,(0,ct.P)((0,ft.Z)(n,undefined),{fileName:n.file_name})}}}else a.media.poll&&(delete this.appPollsManager.polls[t],delete this.appPollsManager.results[t])}var n;const i=this.getMessageFromStorage(e,t);e.delete(t),!i.reply_markup&&a.reply_markup&&setTimeout((()=>{this.getMessageFromStorage(e,a.mid)&&this.rootScope.dispatchEvent("message_edit",{storageKey:e.key,peerId:a.peerId,mid:a.mid,message:a})}),0),this.handleReleasingMessage(i,e),this.rootScope.dispatchEvent("message_sent",{storageKey:e.key,tempId:t,tempMessage:i,mid:a.mid,message:a})}incrementMaxSeenId(e){if(!e||this.maxSeenId&&!(e>this.maxSeenId))return!1;this.maxSeenId=e,this.appStateManager.pushToState("maxSeenMsgId",e),this.apiManager.invokeApi("messages.receivedMessages",{max_id:(0,oe.Z)(e)})}getMessageReactionsListAndReadParticipants(e,t,a,s,n,i){var r,o;return Yt(this,void 0,void 0,(function*(){const p={reactions:[],count:0,next_offset:void 0},d=yield this.canViewMessageReadParticipants(e);return d&&void 0===t?t=100:void 0===t&&(t=50),Promise.all([!d||a||n?[]:this.getMessageReadParticipants(e.peerId,e.mid).catch((()=>[])),(null===(o=null===(r=e.reactions)||void 0===r?void 0:r.recent_reactions)||void 0===o?void 0:o.length)&&!i?this.appReactionsManager.getMessageReactionsList(e.peerId,e.mid,t,a,s).catch((e=>p)):p]).then((([e,t])=>{const a=e.map((e=>e.toPeerId())),s=a.slice();(0,ne.Z)(s,((e,a,s)=>{t.reactions.some((t=>this.appPeersManager.getPeerId(t.peer_id)===e))&&s.splice(a,1)}));let n=t.reactions.map((e=>({peerId:this.appPeersManager.getPeerId(e.peer_id),reaction:e.reaction})));return n=n.concat(s.map((e=>({peerId:e})))),{reactions:t.reactions,reactionsCount:t.count,readParticipants:a,combined:n,nextOffset:t.next_offset}}))}))}getMessageReadParticipants(e,t){return this.apiManager.invokeApiSingle("messages.getMessageReadParticipants",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((e=>e.map((e=>e.toUserId()))))}canViewMessageReadParticipants(e){return Yt(this,void 0,void 0,(function*(){if("message"!==(null==e?void 0:e._)||e.pFlags.is_outgoing||!e.pFlags.out||!this.appPeersManager.isAnyGroup(e.peerId))return!1;const t=this.appChatsManager.getChat(e.peerId.toChatId()),a=yield this.apiManager.getAppConfig();return t.participants_count<=a.chat_read_mark_size_threshold&&(0,te.Z)(!0)-e.date(0,oe.Z)(e))),increment:!0}).then((a=>{const s=new Array(t.length);for(let n=0,i=t.length;n{const{chatPeerIds:t}=e.state;return t[t.length-1]===a}));!n&&s.length&&(s.sort(((e,t)=>e.state.idleStartTime-t.state.idleStartTime)),n=s[0].state.idleStartTime?s[s.length-1]:s[0]),f.Z.getInstance().invokeVoid("notificationBuild",Object.assign({message:e},t),null==n?void 0:n.source)}getScheduledMessagesStorage(e){var t,a;return null!==(t=(a=this.scheduledMessagesStorage)[e])&&void 0!==t?t:a[e]=this.createMessageStorage(e,"scheduled")}getScheduledMessageByPeer(e,t){return this.getMessageFromStorage(this.getScheduledMessagesStorage(e),t)}getScheduledMessages(e){if(!this.canSendToPeer(e))return;const t=this.getScheduledMessagesStorage(e);return t.size?[...t.keys()]:this.apiManager.invokeApiSingle("messages.getScheduledHistory",{peer:this.appPeersManager.getInputPeerById(e),hash:""}).then((t=>{if("messages.messagesNotModified"!==t._){this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.saveApiChats(t.chats);const a=this.getScheduledMessagesStorage(e);return this.saveMessages(t.messages,{storage:a,isScheduled:!0}),[...a.keys()]}return[]}))}sendScheduledMessages(e,t){return this.apiManager.invokeApi("messages.sendScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}deleteScheduledMessages(e,t){return this.apiManager.invokeApi("messages.deleteScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getMessageWithReplies(e){return this.filterMessages(e,(e=>!!e.replies))[0]}getMessageWithCommentReplies(e){if(e.peerId!==o.hj){const t=null==(e=this.getMessageWithReplies(e))?void 0:e.replies;if(!t||!t.pFlags.comments||t.channel_id.toChatId()===o.IA)return}return e}isFetchIntervalNeeded(e){return e.isAnyChat()&&(!this.appChatsManager.isInChat(e.toChatId())||this.appChatsManager.isForum(e.toChatId()))}getNewHistory(e,t){var a;return Yt(this,void 0,void 0,(function*(){if(!this.isFetchIntervalNeeded(e))return;const s=this.getHistoryStorage(e,t),n=s.history.slice;if(!n.isEnd(se.D.Bottom))return;delete s.maxId,n.unsetEnd(se.D.Bottom);const i=yield this.getHistory(e,null!==(a=n[0])&&void 0!==a?a:1,0,50,t);for(let t=0,a=i.history.length;t{const e=i.history.sliceMe(t,r,a),s=(null==e?void 0:e.slice)||i.history.constructSlice();return{count:i.count,history:Array.from(s),isEnd:s.getEnds(),offsetIdOffset:(null==e?void 0:e.offsetIdOffset)||i.count}})):{count:i.count,history:Array.from(o.slice),isEnd:o.slice.getEnds(),offsetIdOffset:o.offsetIdOffset}}isHistoryResultEnd(e,t,a){const{offset_id_offset:s,messages:n}=e,i=e.count||n.length,r=s||0,o=a<0?t+a:t;return{count:i,offsetIdOffset:r,isTopEnd:r>=i-o||ie.mid));if(a&&(0,oe.Z)(a)&&!c.includes(a)&&pc[e]);++e);c.splice(e,0,a)}const l=e.insertSlice(c)||e.slice;return d&&l.setEnd(se.D.Top),f&&l.setEnd(se.D.Bottom),Object.assign({slice:l,mids:c,messages:i},r)}fillHistoryStorage(e,t,a,s,n,i){const r=n.maxId;return this.requestHistory(e,t,a,s,void 0,i).then((i=>{const{count:o,isBottomEnd:p,slice:d,messages:f}=this.mergeHistoryResult(n.history,i,t,a,s);n.count=o;for(let t=0,a=f.length;t{d.ZP&&this.log("requestHistory result:",e,r,t,a,s),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages),"pts"in r&&this.apiUpdatesManager.addChannelState(e.toChatId(),r.pts);let o=r.messages.length,p=r.count;o&&!r.messages[o-1]&&(r.messages.splice(o-1,1),o--,p--);const f=this.getHistoryStorage(e,i),c=r.messages[o-1];if(o&&c.grouped_id){const t=f.history.findSlice(c.mid);if(t&&t.slice.length+r.messages.lengthr))}return r}),(t=>{if("CHANNEL_PRIVATE"===t.type){let t=this.appChatsManager.getChat(e.toChatId());"channel"===t._&&(t={_:"channelForbidden",id:e.toChatId(),access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}),this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t}))}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=(0,P.Z)(0).then((()=>{const e=[];for(const[t,a]of this.needSingleMessages){const s=[...a.keys()],n=s.map((e=>({_:"inputMessageID",id:(0,oe.Z)(e)})));let i;i=t.isAnyChat()&&this.appPeersManager.isChannel(t)?this.apiManager.invokeApiSingle("channels.getMessages",{channel:this.appChatsManager.getChannelInput(t.toChatId()),id:n}):this.apiManager.invokeApiSingle("messages.getMessages",{id:n});const r=i.then((e=>{(0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=this.saveMessages(e.messages);for(let e=0;e{this.rootScope.dispatchEvent("messages_downloaded",{peerId:t,mids:s})}));e.push(r)}return this.needSingleMessages.clear(),Promise.all(e).then(jt.Z,jt.Z).then((()=>{this.fetchSingleMessagesPromise=void 0,this.needSingleMessages.size&&this.fetchSingleMessages()}))}))}reloadMessages(e,t,a){if(Array.isArray(t))return Promise.all(t.map((t=>this.reloadMessages(e,t,a))));const s=this.getMessageByPeer(e,t);if(s&&!a)return this.rootScope.dispatchEvent("messages_downloaded",{peerId:e,mids:[t]}),Promise.resolve(s);{let a=this.needSingleMessages.get(e);a||this.needSingleMessages.set(e,a=new Map);let s=a.get(t);return s||(s=(0,v.Z)(),a.set(t,s),this.fetchSingleMessages(),s)}}getExtendedMedia(e,t){let a=this.extendedMedia.get(e);a||this.extendedMedia.set(e,a=new Map);const s=(0,v.Z)(),n=[],i=t.map((t=>{let i=a.get(t);return i||(a.set(t,i=s),n.push(t),i.then((()=>{a.delete(t),a.size||this.extendedMedia.get(e)!==a||this.extendedMedia.delete(e)}))),i}));return n.length?this.apiManager.invokeApi("messages.getExtendedMedia",{peer:this.appPeersManager.getInputPeerById(e),id:n.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),s.resolve()})):s.resolve(),Promise.all(i)}fetchMessageReplyTo(e){if(!e.reply_to_mid)return Promise.resolve(this.generateEmptyMessage(0));const t=e.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(e.reply_to.reply_to_peer_id):e.peerId;return this.reloadMessages(t,e.reply_to_mid).then((t=>{if(t||delete(e=this.getMessageByPeer(e.peerId,e.mid)).reply_to_mid,"messageService"===e._){const t=e.peerId;this.rootScope.dispatchEvent("message_edit",{storageKey:`${t}_history`,peerId:t,mid:e.mid,message:e}),this.isMessageIsTopMessage(e)&&this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[t,{dialog:this.getDialogOnly(t)}]]))}return t}))}getTypingKey(e,t){return t?`${e}_${t}`:e}setTyping(e,t,a,s){var n;s&&!this.appPeersManager.isForum(e)&&(s=void 0);const i=this.getTypingKey(e,s);let r=this.typings[i];return e&&this.canSendToPeer(e)&&e!==this.appPeersManager.peerId&&(a||(null===(n=null==r?void 0:r.action)||void 0===n?void 0:n._)!==t._)?((null==r?void 0:r.timeout)&&clearTimeout(r.timeout),r=this.typings[i]={action:t},this.apiManager.invokeApi("messages.setTyping",{peer:this.appPeersManager.getInputPeerById(e),action:t,top_msg_id:s?(0,oe.Z)(s):void 0}).finally((()=>{r===this.typings[i]&&(r.timeout=E.Z.setTimeout((()=>{delete this.typings[i]}),6e3))}))):Promise.resolve(!1)}handleReleasingMessage(e,t){const a=e.media;if(a){const s=a.webpage||a,n=s.photo||s.document;if((null==n?void 0:n.file_reference)&&this.referenceDatabase.deleteContext(n.file_reference,{type:"message",peerId:e.peerId,messageId:e.mid}),"webpage"in a&&a.webpage){const s=this.getScheduledMessagesStorage(e.peerId)===t,n=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,s);this.appWebPagesManager.deleteWebPageFromPending(a.webpage,n)}a.poll&&this.appPollsManager.updatePollToMessage(e,!1)}}handleDeletedMessages(e,t,a){const s={count:0,unread:0,unreadMentions:0,msgs:new Set};for(const n of a){const a=this.getMessageFromStorage(t,n);if(!a){this.fixDialogUnreadMentionsIfNoMessage(e);continue}this.handleReleasingMessage(a,t),this.updateMessageRepliesIfNeeded(a),a.pFlags.out||a.pFlags.is_outgoing||!a.pFlags.unread||(++s.unread,this.rootScope.dispatchEvent("notification_cancel","msg"+n),a.pFlags.mentioned&&(++s.unreadMentions,this.modifyCachedMentions(e,n,!1))),++s.count,s.msgs.add(n),a.deleted=!0;const i=a.grouped_id;if(i){const e=this.groupedMessagesStorage[i];e&&(e.delete(n),s.albums||(s.albums={}),(s.albums[i]||(s.albums[i]=new Set)).add(n),e.size||(delete s.albums,delete this.groupedMessagesStorage[i]))}t.delete(n)}if(s.albums)for(const e in s.albums)this.dispatchAlbumEdit(e,t,[...s.albums[e]]);return s}handleEditedMessage(e,t,a){var s;if("message"===e._){if(null===(s=e.media)||void 0===s?void 0:s.webpage){const t=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,!!e.pFlags.is_scheduled);this.appWebPagesManager.deleteWebPageFromPending(e.media.webpage,t)}const t=e.grouped_id;t&&this.dispatchAlbumEdit(t,a,[])}}dispatchAlbumEdit(e,t,a){const s=this.getMidsByAlbum(e).map((e=>this.getMessageFromStorage(t,e)));this.rootScope.dispatchEvent("album_edit",{peerId:s[0].peerId,groupId:e,deletedMids:a||[],messages:s})}getDialogUnreadCount(e){var t;let a=e.unread_count;if(!this.dialogsStorage.isTopic(e)&&this.appPeersManager.isForum(e.peerId)){const t=this.dialogsStorage.getForumUnreadCount(e.peerId);a=t instanceof Promise?0:t.count}return a||+!!(null===(t=e.pFlags)||void 0===t?void 0:t.unread_mark)}isDialogUnread(e){return!!this.getDialogUnreadCount(e)}canForward(e){return"message"===(null==e?void 0:e._)&&!e.pFlags.noforwards&&!this.appPeersManager.noForwards(e.peerId)}pushBatchUpdate(e,t,a,s){let n=this.batchUpdates[e];n||(n=this.batchUpdates[e]={callback:t,batch:new Map}),n.batch.has(a)||(n.batch.set(a,s?s():void 0),this.batchUpdatesDebounced())}getMessagesFromMap(e){const t=new Map;for(const[a,s]of e){const[e,n]=a.split("_"),i=this.getMessageByPeer(e.toPeerId(),+n);i&&t.set(i,s)}return t}saveDefaultSendAs(e,t){return this.appProfileManager.getCachedFullChat(e.toChatId()).default_send_as=this.appPeersManager.getOutputPeer(t),this.apiManager.invokeApi("messages.saveDefaultSendAs",{peer:this.appPeersManager.getInputPeerById(e),send_as:this.appPeersManager.getInputPeerById(t)})}}var aa=a(6724);function sa(e){const t=e.replace("input","");return t[0].toLowerCase()+t.slice(1)}class na extends G{constructor(){super(...arguments),this.peerSettings={notifyPeer:{},notifyUsers:null,notifyChats:null,notifyBroadcasts:null,notifyForumTopic:{}},this.checkMuteUntil=()=>{void 0!==this.checkMuteUntilTimeout&&(clearTimeout(this.checkMuteUntilTimeout),this.checkMuteUntilTimeout=void 0);const e=(0,te.Z)(!0);let t=o.rU;const a=a=>{if(a instanceof Promise)return!1;const s=a.mute_until;return!!s&&(s<=e?(a.mute_until=0,!0):(s{for(const t in this.peerSettings[e]){const s=this.peerSettings[e][t];if(a(s)){const[e,a]=t.split("_"),n=this.appPeersManager.getOutputPeer(e.toPeerId());this.apiUpdatesManager.saveUpdate({_:"updateNotifySettings",peer:a?{_:"notifyForumTopic",peer:n,top_msg_id:+a}:{_:"notifyPeer",peer:n},notify_settings:s})}}}));const s=Math.min(18e5,1e3*(t-e));this.checkMuteUntilTimeout=E.Z.setTimeout(this.checkMuteUntil,s)}}after(){return this.checkMuteUntilThrottled=(0,aa.Z)(this.checkMuteUntil,1e3,!1),this.apiUpdatesManager.addMultipleEventsListeners({updateNotifySettings:e=>{const{peer:t}=e,a="notifyForumTopic"===t._,s="notifyPeer"===t._||a,n=s&&this.appPeersManager.getPeerId(t.peer),i=s?void 0:t._;this.savePeerSettings({key:i,peerId:n,threadId:a?(0,pe.Z)(t.top_msg_id):void 0,settings:e.notify_settings}),this.rootScope.dispatchEvent("notify_settings",e)}}),this.appStateManager.getState().then((e=>{if(e.notifySettings)for(const t in e.notifySettings)(0,ue.Z)(t),this.savePeerSettings({key:t,settings:e.notifySettings[t]})}))}getNotifySettings(e){let t,a=sa(e._),s=this.peerSettings[a];return"inputNotifyPeer"===e._&&(t=a=this.appPeersManager.getPeerId(e.peer),s=s[a]),s||((s||this.peerSettings)[a]=this.apiManager.invokeApi("account.getNotifySettings",{peer:e}).then((e=>(this.savePeerSettings({key:a,peerId:t,settings:e}),e))))}getNotifyPeerTypeSettings(){if(this.getNotifyPeerTypePromise)return this.getNotifyPeerTypePromise;const e=["inputNotifyBroadcasts","inputNotifyUsers","inputNotifyChats"].map((e=>this.getNotifySettings({_:e})));return this.getNotifyPeerTypePromise=Promise.all(e)}updateNotifySettings(e,t){return this.apiManager.invokeApi("account.updateNotifySettings",{peer:e,settings:t}).then((a=>{a&&this.apiUpdatesManager.processLocalUpdate({_:"updateNotifySettings",peer:Object.assign(Object.assign({},e),{_:sa(e._)}),notify_settings:Object.assign(Object.assign({},t),{_:"peerNotifySettings"})})}))}getContactSignUpNotification(){return this.notifyContactsSignUp?this.notifyContactsSignUp:this.notifyContactsSignUp=this.apiManager.invokeApi("account.getContactSignUpNotification")}setContactSignUpNotification(e){this.apiManager.invokeApi("account.setContactSignUpNotification",{silent:e}).then((t=>{this.notifyContactsSignUp=Promise.resolve(!e)}))}getPeerKey(e,t){return e+(t?"_"+t:"")}savePeerSettings({key:e,peerId:t,threadId:a,settings:s}){let n;t&&(e=this.getPeerKey(t,a),n=this.peerSettings[a?"notifyForumTopic":"notifyPeer"]),(n||this.peerSettings)[e]=s,t?this.checkMuteUntilThrottled():(this.rootScope.dispatchEvent("notify_peer_type_settings",{key:e,settings:s}),this.appStateManager.getState().then((t=>{const a=t.notifySettings;a[e]=s,this.appStateManager.pushToState("notifySettings",a)})))}isMuted(e){return"peerNotifySettings"===e._&&(e.silent||void 0!==e.mute_until&&1e3*e.mute_until>(0,te.Z)())}getPeerMuted(e){const t=this.getNotifySettings({_:"inputNotifyPeer",peer:this.appPeersManager.getInputPeerById(e)});return(t instanceof Promise?t:Promise.resolve(t)).then((e=>this.isMuted(e)))}getPeerLocalSettings({peerId:e,respectType:t=!0,threadId:a}){const s={_:"peerNotifySettings"},n=this.getPeerKey(e,a),i=this.peerSettings[a?"notifyForumTopic":"notifyPeer"][n];if(!i||i instanceof Promise||Object.assign(s,i),t){const t=sa(this.appPeersManager.getInputNotifyPeerById({peerId:e,ignorePeerId:!0,threadId:a})._),n=this.peerSettings[t];if(n&&!(n instanceof Promise))for(const e in n)void 0===s[e]&&(s[e]=n[e])}return s}validatePeerSettings(e){if(e.peerId!==this.appPeersManager.peerId)return e.threadId&&!this.appPeersManager.isForum(e.peerId)&&(e.threadId=void 0),e}isPeerLocalMuted(e){if(!(e=this.validatePeerSettings(e)))return!1;if(e.threadId){const t=this.getPeerLocalSettings(Object.assign(Object.assign({},e),{respectType:!1}));return void 0!==t.silent||void 0!==t.mute_until?this.isMuted(t):this.isPeerLocalMuted(Object.assign(Object.assign({},e),{threadId:void 0}))}const t=this.getPeerLocalSettings(e);return this.isMuted(t)}}var ia=a(677),ra=a(617),oa=a(7361),pa=a(7419),da=a(7256);class fa extends G{get peerId(){return this.appUsersManager.userId.toPeerId()}canPinMessage(e){return e.isUser()||this.appChatsManager.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){const t=this.getPeer(e);return(0,da.Z)(t)}getPeerMigratedTo(e){if(e.isUser())return!1;const t=this.appChatsManager.getChat(e.toChatId()),a=null==t?void 0:t.migrated_to;return!(!a||!t.pFlags.deactivated)&&(0,le.Z)(a)}getOutputPeer(e){if(e.isUser())return{_:"peerUser",user_id:e.toUserId()};const t=e.toChatId();return this.appChatsManager.isChannel(t)?{_:"peerChannel",channel_id:t}:{_:"peerChat",chat_id:t}}getPeerString(e){return e.isUser()?this.appUsersManager.getUserString(e.toUserId()):this.appChatsManager.getChatString(e.toChatId())}getPeerUsername(e){return this.getPeerActiveUsernames(e)[0]||""}getPeerActiveUsernames(e){const t=this.getPeer(e);return(0,Jt.Z)(t)}getPeer(e){return e.isUser()?this.appUsersManager.getUser(e.toUserId()):this.appChatsManager.getChat(e.toChatId())}getPeerId(e){return(0,le.Z)(e)||(0,fe.Z)(e)&&"inputPeerSelf"===e._&&this.peerId||o.NM}getDialogPeer(e){return{_:"dialogPeer",peer:this.getOutputPeer(e)}}isChannel(e){return!e.isUser()&&this.appChatsManager.isChannel(e.toChatId())}isMegagroup(e){return!e.isUser()&&this.appChatsManager.isMegagroup(e.toChatId())}isForum(e){return!e.isUser()&&this.appChatsManager.isForum(e.toChatId())}isAnyGroup(e){return!e.isUser()&&!this.appChatsManager.isBroadcast(e.toChatId())}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isBot(e){return e.isUser()&&this.appUsersManager.isBot(e.toUserId())}isContact(e){return e.isUser()&&this.appUsersManager.isContact(e.toUserId())}isUser(e){return(0,ra.Z)(e)}isAnyChat(e){return(0,oa.Z)(e)}isPeerRestricted(e){return(0,pa.Z)(this.getPeer(e))}getRestrictionReasonText(e){const t=this.getPeer(e),a=t.restriction_reason?(0,ia.RP)(t.restriction_reason):void 0;return a?a.text:e.isUser()?"This user is restricted":"This chat is restricted"}getInputNotifyPeerById({peerId:e,ignorePeerId:t,threadId:a}){return t?e.isUser()?{_:"inputNotifyUsers"}:this.isBroadcast(e)?{_:"inputNotifyBroadcasts"}:{_:"inputNotifyChats"}:a?{_:"inputNotifyForumTopic",peer:this.getInputPeerById(e),top_msg_id:(0,oe.Z)(a)}:{_:"inputNotifyPeer",peer:this.getInputPeerById(e)}}getInputPeerById(e){if(!e)return{_:"inputPeerEmpty"};if(!e.isUser()){const t=e.toChatId();return this.appChatsManager.getInputPeer(t)}const t=e.toUserId();return this.appUsersManager.getUserInputPeer(t)}getInputPeerSelf(){return{_:"inputPeerSelf"}}getInputDialogPeerById(e){return{_:"inputDialogPeer",peer:(0,fe.Z)(e)?e:this.getInputPeerById(e)}}getPeerSearchText(e){let t;return t=this.isUser(e)?"%pu "+this.appUsersManager.getUserSearchText(e.toUserId()):"%pg "+(this.appChatsManager.getChat(e.toChatId()).title||""),t}getDialogType(e){return this.isMegagroup(e)?"megagroup":this.isChannel(e)?"channel":this.isUser(e)?e===this.peerId?"saved":"chat":"group"}getDeleteButtonText(e){switch(this.getDialogType(e)){case"channel":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"ChannelDelete":"ChatList.Context.LeaveChannel";case"megagroup":case"group":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"DeleteMega":"ChatList.Context.LeaveGroup";default:return"ChatList.Context.DeleteChat"}}noForwards(e){var t;return!e.isUser()&&!!(null===(t=this.appChatsManager.getChat(e.toChatId()).pFlags)||void 0===t?void 0:t.noforwards)}}class ca extends G{constructor(){super(...arguments),this.photos={}}savePhoto(e,t){var a;if(!e||"photoEmpty"===e._)return;const s=this.photos[e.id];if(e.file_reference&&(pt("file_reference",s,e),this.referenceDatabase.saveContext(e.file_reference,t)),null===(a=e.sizes)||void 0===a?void 0:a.length){e.sizes.sort(((e,t)=>(e.size||(e.sizes?1/0:0))-(t.size||(t.sizes?1/0:0))));const t=e.sizes[e.sizes.length-1];"photoSizeProgressive"===t._&&(t.size=t.sizes[t.sizes.length-1])}return s?Object.assign(s,e):this.photos[e.id]=e}getUserPhotos(e,t="0",a=20){const s=this.appUsersManager.getUserInput(e);return this.apiManager.invokeApiCacheable("photos.getUserPhotos",{user_id:s,offset:0,limit:a,max_id:t},{cacheSeconds:60}).then((a=>{this.appUsersManager.saveApiUsers(a.users);const s=a.photos.map(((t,s)=>(a.photos[s]=this.savePhoto(t,{type:"profilePhoto",peerId:e.toPeerId()}),t.id)));if("0"!==t&&t){const e=s.indexOf(t);-1!==e&&s.splice(e,1)}return{count:a.count||s.length,photos:s}}))}getPhoto(e){return(0,fe.Z)(e)?e:this.photos[e]}}class la extends G{constructor(){super(...arguments),this.polls={},this.results={},this.pollToMessages={},this.log=(0,I.kg)("POLLS",I.v9.Error)}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateMessagePoll:e=>{this.log("updateMessagePoll:",e);let t=e.poll||this.polls[e.poll_id];if(!t)return;let a=e.results;const s=this.savePoll(t,a);t=s.poll,a=s.results,this.rootScope.dispatchEvent("poll_update",{poll:t,results:a})}})}savePoll(e,t,a){a&&this.updatePollToMessage(a,!0);const s=e.id;return this.polls[s]?(e=Object.assign(this.polls[s],e),t=this.saveResults(e,t)):(this.polls[s]=e,e.chosenIndexes=[],t=this.saveResults(e,t)),{poll:e,results:t}}saveResults(e,t){var a;return this.results[e.id]?t=Object.assign(this.results[e.id],t):this.results[e.id]=t,t.pFlags.min||(e.chosenIndexes.length=0,(null===(a=null==t?void 0:t.results)||void 0===a?void 0:a.length)&&t.results.forEach(((t,a)=>{var s;(null===(s=t.pFlags)||void 0===s?void 0:s.chosen)&&e.chosenIndexes.push(a)}))),t}getPoll(e){return{poll:this.polls[e],results:this.results[e]}}getInputMediaPoll(e,t,a,s){return a?(s||(s=[]),a=(0,ke.Z)(a,s)):a=void 0,{_:"inputMediaPoll",poll:e,correct_answers:t,solution:a,solution_entities:a?s:void 0}}updatePollToMessage(e,t){const{id:a}=e.media.poll;let s=this.pollToMessages[a];if(!t&&!s)return;s||(s=this.pollToMessages[a]=new Set);const n=e.peerId+"_"+e.mid;t?s.add(n):s.delete(n),t||s.size||(delete this.polls[a],delete this.results[a],delete this.pollToMessages[a])}sendVote(e,t){const a=e.media.poll,s=t.map((e=>a.answers[e].option)),n=e.mid,i=e.peerId,r=this.appPeersManager.getInputPeerById(i);return e.pFlags.is_outgoing?this.appMessagesManager.invokeAfterMessageIsSent(n,"sendVote",(e=>(this.log("invoke sendVote callback"),this.sendVote(e,t)))):this.apiManager.invokeApi("messages.sendVote",{peer:r,msg_id:(0,oe.Z)(e.mid),options:s}).then((e=>{this.log("sendVote updates:",e),this.apiUpdatesManager.processUpdateMessage(e)}))}getResults(e){const t=this.appPeersManager.getInputPeerById(e.peerId);return this.apiManager.invokeApi("messages.getPollResults",{peer:t,msg_id:(0,oe.Z)(e.mid)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),this.log("getResults updates:",e)}))}getVotes(e,t,a,s=20){return this.apiManager.invokeApi("messages.getPollVotes",{peer:this.appPeersManager.getInputPeerById(e.peerId),id:(0,oe.Z)(e.mid),option:t,offset:a,limit:s}).then((e=>(this.log("getPollVotes messages:",e),this.appUsersManager.saveApiUsers(e.users),e)))}stopPoll(e){const t=e.media.poll;if(t.pFlags.closed)return Promise.resolve();const a=(0,ve.Z)(t);return a.pFlags.closed=!0,this.appMessagesManager.editMessage(e,void 0,{newMedia:this.getInputMediaPoll(a)}).then((()=>{}),(e=>{this.log.error("stopPoll error:",e)}))}}class ma extends G{constructor(){super(...arguments),this.privacy={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updatePrivacy:e=>{const t=e.key._;this.privacy[t]=e.rules,this.rootScope.dispatchEvent("privacy_update",e)}})}setPrivacy(e,t){return this.apiManager.invokeApi("account.setPrivacy",{key:{_:e},rules:t}).then((a=>(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),this.apiUpdatesManager.processLocalUpdate({_:"updatePrivacy",key:{_:sa(e)},rules:t.map((e=>{const t={};return Object.assign(t,e),t._=sa(t._),t}))}),a.rules)))}getPrivacy(e){const t=sa(e),a=this.privacy[t];return a?Promise.resolve(a):this.privacy[t]=this.apiManager.invokeApi("account.getPrivacy",{key:{_:e}}).then((e=>(this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.privacy[t]=e.rules)))}getGlobalPrivacySettings(){return this.apiManager.invokeApi("account.getGlobalPrivacySettings")}setGlobalPrivacySettings(e){return this.apiManager.invokeApi("account.setGlobalPrivacySettings",{settings:e})}}var ga=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const ha=18e4;class ua extends G{constructor(){super(...arguments),this.usersFull={},this.chatsFull={},this.fullExpiration={},this.onUpdateUserTyping=e=>{var t,a;const s=e.user_id?e.user_id.toPeerId():this.appPeersManager.getPeerId(e.from_id);if(this.appPeersManager.peerId===s||"speakingInGroupCallAction"===e.action._)return;const n=e.top_msg_id,i=n?(0,pe.Z)(n):void 0,r=this.appPeersManager.getPeerId(e),o=this.getTypingsKey(r,i),p=null!==(t=(a=this.typingsInPeer)[o])&&void 0!==t?t:a[o]=[];let d=p.find((e=>e.userId===s));const f=()=>{delete d.timeout;const e=p.indexOf(d);-1!==e&&p.splice(e,1),this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p}),p.length||delete this.typingsInPeer[o]};if(void 0!==(null==d?void 0:d.timeout)&&clearTimeout(d.timeout),"sendMessageCancelAction"===e.action._){if(!d)return;return void f()}d||(d={userId:s},p.push(d)),d.action=e.action;const c=this.appUsersManager.hasUser(s);c?this.appUsersManager.forceUserOnline(s):"updateChatUserTyping"===e._&&e.chat_id&&this.appChatsManager.hasChat(e.chat_id)&&!this.appChatsManager.isChannel(e.chat_id)&&Promise.resolve(this.getChatFull(e.chat_id)).then((()=>{void 0!==d.timeout&&this.appUsersManager.hasUser(s)&&this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p})})),d.timeout=E.Z.setTimeout(f,6e3),c&&this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p})},this.onUpdatePeerBlocked=e=>{const t=this.appPeersManager.getPeerId(e.peer_id);if(this.appPeersManager.isUser(t)){const a=t.toUserId(),s=this.usersFull[a];s&&(e.blocked?s.pFlags.blocked=!0:delete s.pFlags.blocked),this.rootScope.dispatchEvent("user_full_update",a)}this.rootScope.dispatchEvent("peer_block",{peerId:t,blocked:e.blocked})}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateChatParticipants:e=>{const t=e.participants;if("chatParticipants"===t._){const e=t.chat_id,a=this.chatsFull[e];void 0!==a&&(a.participants=t,this.rootScope.dispatchEvent("chat_full_update",e))}},updateChatParticipantAdd:e=>{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,a=s.length;t{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,n=s.length;t{var t,a;const s=this.chatsFull[e],n=this.appChatsManager.getChat(e);if(!s||!n)return;let i=!1;!!s.call!=!!(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)&&(i=!0);const{photo:r}=n;if(r){const e="chatPhotoEmpty"!==r._;(e!==!(!s.chat_photo||"photoEmpty"===s.chat_photo._)||e&&r.photo_id!==(null===(a=s.chat_photo)||void 0===a?void 0:a.id))&&(i=!0)}i&&this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("channel_update",(e=>{this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("chat_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!0))})),this.rootScope.addEventListener("user_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!1))})),this.rootScope.addEventListener("invalidate_participants",(e=>{this.invalidateChannelParticipants(e)})),this.typingsInPeer={}}getProfile(e,t){return this.usersFull[e]&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const a=t.full_user,s=e.toPeerId(!1);a.profile_photo&&(a.profile_photo=this.appPhotosManager.savePhoto(a.profile_photo,{type:"profilePhoto",peerId:s}));const n=a.bot_info;if(n){const t={type:"userFull",userId:e};n.description_document=this.appDocsManager.saveDoc(n.description_document,t),n.description_photo=this.appPhotosManager.savePhoto(n.description_photo,t)}return this.appNotificationsManager.savePeerSettings({peerId:s,settings:a.notify_settings}),this.usersFull[e]=a,this.fullExpiration[s]=Date.now()+ha,this.rootScope.dispatchEvent("user_full_update",e),a}})}getProfileByPeerId(e,t){return this.appPeersManager.isAnyChat(e)?this.getChatFull(e.toChatId(),t):this.getProfile(e.toUserId(),t)}getCachedFullChat(e){return this.chatsFull[e]}getCachedFullUser(e){return this.usersFull[e]}getCachedProfileByPeerId(e){return e.isUser()?this.getCachedFullUser(e.toUserId()):this.getCachedFullChat(e.toChatId())}getFullPhoto(e){return ga(this,void 0,void 0,(function*(){const t=yield this.getProfileByPeerId(e);switch(t._){case"userFull":return t.profile_photo;case"channelFull":case"chatFull":return t.chat_photo}}))}getChatFull(e,t){if(this.appChatsManager.isChannel(e))return this.getChannelFull(e,t);const a=e.toPeerId(!0),s=this.chatsFull[e];if(s&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo&&s.chat_photo.id&&(s.chat_photo=this.appPhotosManager.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),s.call&&this.appGroupCallsManager.saveGroupCall(s.call,e),this.appNotificationsManager.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,this.fullExpiration[a]=Date.now()+ha,this.rootScope.dispatchEvent("chat_full_update",e),s}})}getChatInviteLink(e,t){return ga(this,void 0,void 0,(function*(){const a=yield this.getChatFull(e);return!t&&a.exported_invite&&"chatInviteExported"==a.exported_invite._?a.exported_invite.link:this.apiManager.invokeApi("messages.exportChatInvite",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0))}).then((t=>(void 0!==this.chatsFull[e]&&(this.chatsFull[e].exported_invite=t),t.link)))}))}getChannelParticipants(e,t={_:"channelParticipantsRecent"},a=200,s=0){if("channelParticipantsRecent"===t._){const t=this.appChatsManager.getChat(e);if((null==t?void 0:t.pFlags)&&t.pFlags.broadcast&&!t.pFlags.creator&&!t.admin_rights)return Promise.reject()}return this.apiManager.invokeApiCacheable("channels.getParticipants",{channel:this.appChatsManager.getChannelInput(e),filter:t,offset:s,limit:a,hash:"0"},{cacheSeconds:60}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}getChannelParticipant(e,t){return this.apiManager.invokeApiSingle("channels.getParticipant",{channel:this.appChatsManager.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e.participant)))}getChannelFull(e,t){const a=e.toPeerId(!0);return void 0!==this.chatsFull[e]&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo.id&&(s.chat_photo=this.appPhotosManager.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),s.call&&this.appGroupCallsManager.saveGroupCall(s.call,e),this.appNotificationsManager.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,this.fullExpiration[a]=Date.now()+ha,this.rootScope.dispatchEvent("chat_full_update",e),s},processError:t=>{if("CHANNEL_PRIVATE"===t.type){const t=this.appChatsManager.getChat(e);this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e}],chats:["channelForbidden"===t._?t:{_:"channelForbidden",id:e,access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}],users:[]})}throw t}})}getMentions(e,t,a){const s=e=>{"@"===t.charAt(0)&&(t=t.slice(1));const a=new ae.Z({ignoreCase:!0}),s=new Map;e.forEach((e=>{a.indexObject(e.id,this.appUsersManager.getUserSearchText(e.id)),s.set(e.id,e.rating)}));const n=Array.from(a.search(t));return n.sort(((e,t)=>s.get(t)-s.get(e))),n};let n;return n=this.appChatsManager.isChannel(e)?this.getChannelParticipants(e,{_:"channelParticipantsMentions",q:t,top_msg_id:(0,oe.Z)(a)},50,0).then((e=>e.participants.map((e=>(0,xe.Z)(e))))):e?Promise.resolve(this.getChatFull(e)).then((e=>e.participants.participants.map((e=>e.user_id.toPeerId())))):Promise.resolve([]),Promise.all([this.appUsersManager.getTopPeers("bots_inline").catch((()=>[])),n]).then((e=>{const t=e[0].concat(e[1].map((e=>({id:e,rating:0}))));return s(t)}))}invalidateChannelParticipants(e){this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e)),this.refreshFullPeer(e.toPeerId(!0))}refreshFullPeer(e){if(e.isUser()){const t=e.toUserId();delete this.usersFull[t],this.rootScope.dispatchEvent("user_full_update",t)}else{const t=e.toChatId();delete this.chatsFull[t],this.rootScope.dispatchEvent("chat_full_update",t)}}updateProfile(e,t,a){return this.apiManager.invokeApi("account.updateProfile",{first_name:e,last_name:t,about:a}).then((e=>{if(this.appUsersManager.saveApiUser(e),void 0!==a){const t=e.id.toPeerId(),s=this.usersFull[e.id];s&&(s.about=a),this.rootScope.dispatchEvent("peer_bio_edit",t)}return this.getProfile(e.id,!0)}))}uploadProfilePhoto(e){return this.apiManager.invokeApi("photos.uploadProfilePhoto",{file:e}).then((e=>{const t=e.photo;if(!e.users.length){const a=t.sizes.find((e=>"photoStrippedSize"===e._));e.users.push(Object.assign(Object.assign({},this.appUsersManager.getSelf()),{photo:{_:"userProfilePhoto",dc_id:t.dc_id,photo_id:t.id,stripped_thumb:null==a?void 0:a.bytes,pFlags:{}}}))}this.appUsersManager.saveApiUsers(e.users);const a=this.appPeersManager.peerId;this.appPhotosManager.savePhoto(e.photo,{type:"profilePhoto",peerId:a});const s=a.toUserId();this.apiUpdatesManager.processLocalUpdate({_:"updateUser",user_id:s})}))}deletePhotos(e){return this.apiManager.invokeApiSingle("photos.deletePhotos",{id:e.map((e=>Ct(this.appPhotosManager.getPhoto(e))))}).then((e=>{}))}verifyParticipantForOnlineCount(e){const t=this.appUsersManager.getUser(e.user_id);return!(!t||!t.status||"userStatusOnline"!==t.status._)}reduceParticipantsForOnlineCount(e){return e.reduce(((e,t)=>e+ +this.verifyParticipantForOnlineCount(t)),0)}getOnlines(e){var t;return ga(this,void 0,void 0,(function*(){if(this.appChatsManager.isBroadcast(e))return 1;const a=yield this.getChatFull(e);if(this.appChatsManager.isMegagroup(e)){if(a.participants_count<=100){const t=yield this.getChannelParticipants(e,{_:"channelParticipantsRecent"},100);return this.reduceParticipantsForOnlineCount(t.participants)}const s=yield this.apiManager.invokeApiCacheable("messages.getOnlines",{peer:this.appChatsManager.getChannelInputPeer(e)},{cacheSeconds:60});return null!==(t=s.onlines)&&void 0!==t?t:1}const s=a.participants;return(null==s?void 0:s.participants)?this.reduceParticipantsForOnlineCount(s.participants):1}))}getTypingsKey(e,t){return e+(t?`_${t}`:"")}getPeerTypings(e,t){return this.typingsInPeer[this.getTypingsKey(e,t)]}}function ya(e,t){return e.some((e=>e instanceof Promise))?Promise.all(e).then(t):t(e)}var _a=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const va=["static_icon","appear_animation","select_animation","activate_animation","effect_animation","around_animation","center_icon"],Pa={type:"reactions"};class ba extends G{after(){this.rootScope.addEventListener("language_change",(()=>{this.availableReactions=void 0,this.getAvailableReactions()})),this.sendReactionPromises=new Map,this.lastSendingTimes=new Map,this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{Promise.resolve(this.getAvailableReactions()).then((e=>_a(this,void 0,void 0,(function*(){for(const t of e)yield Promise.all([t.around_animation&&this.apiFileManager.downloadMedia({media:t.around_animation}),t.static_icon&&this.apiFileManager.downloadMedia({media:t.static_icon}),t.appear_animation&&this.apiFileManager.downloadMedia({media:t.appear_animation}),t.center_icon&&this.apiFileManager.downloadMedia({media:t.center_icon})]),yield(0,P.Z)(1e3)}))))}),7500)}))}getAvailableReactions(){return this.availableReactions?this.availableReactions:this.apiManager.invokeApiSingleProcess({method:"messages.getAvailableReactions",processResult:e=>{(0,ue.Z)(e);const t=this.availableReactions=e.reactions;for(const e of t)for(const t of va)e[t]&&(e[t]=this.appDocsManager.saveDoc(e[t],Pa));return t},params:{hash:0}})}getActiveAvailableReactions(){return(0,q.Z)(this.getAvailableReactions(),(e=>e.filter((e=>!e.pFlags.inactive))))}getAvailableReactionsForPeer(e){const t=this.getActiveAvailableReactions();return e.isUser()?this.unshiftQuickReaction(t):ya([t,this.appProfileManager.getChatFull(e.toChatId()),this.getQuickReaction()],(([e,t,a])=>{var s;const n=null!==(s=t.available_reactions)&&void 0!==s?s:{_:"chatReactionsNone"};let i=[];return"chatReactionsAll"===n._?i=e:"chatReactionsSome"===n._&&(i=n.reactions.map((t=>e.find((e=>e.reaction===t.emoticon)))).filter(Boolean)),this.unshiftQuickReactionInner(i,a)}))}unshiftQuickReactionInner(e,t){if(t&&"reactionEmoji"!==t._&&"availableReaction"!==t._)return e;const a=t.emoticon||t.reaction,s=(0,Pe.Z)(e,(e=>e.reaction===a));return s&&e.unshift(s),e}unshiftQuickReaction(e,t=this.getQuickReaction()){return ya([e,t],(([e,t])=>this.unshiftQuickReactionInner(e,t)))}getAvailableReactionsByMessage(e){var t;if(!e)return[];const a=(null===(t=e.fwd_from)||void 0===t?void 0:t.channel_post)&&this.appPeersManager.isMegagroup(e.peerId)&&e.fwdFromId||e.peerId;return this.getAvailableReactionsForPeer(a)}isReactionActive(e){return!!this.availableReactions&&!!this.availableReactions.find((t=>t.reaction===e))}getQuickReaction(){return ya([this.apiManager.getConfig(),this.getAvailableReactions()],(([e,t])=>{const a=e.reactions_default;return"reactionEmoji"===(null==a?void 0:a._)?t.find((e=>e.reaction===a.emoticon)):a}))}getReactionCached(e){return this.availableReactions.find((t=>t.reaction===e))}getReaction(e){return(0,q.Z)(this.getAvailableReactions(),(()=>this.getReactionCached(e)))}getMessagesReactions(e,t){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessagesReactions",params:{id:t.map((e=>(0,oe.Z)(e))),peer:this.appPeersManager.getInputPeerById(e)},processResult:e=>{this.apiUpdatesManager.processUpdateMessage(e)}})}getMessageReactionsList(e,t,a,s,n){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessageReactionsList",params:{peer:this.appPeersManager.getInputPeerById(e),id:(0,oe.Z)(t),limit:a,reaction:s,offset:n},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),e)})}setDefaultReaction(e){return this.apiManager.invokeApi("messages.setDefaultReaction",{reaction:e}).then((t=>_a(this,void 0,void 0,(function*(){if(t){const t=yield this.apiManager.getConfig();t&&(t.reactions_default=e),this.rootScope.dispatchEvent("quick_reaction",e)}return t}))))}sendReaction(e,t,a){var s,n;return _a(this,void 0,void 0,(function*(){"availableReaction"===t._&&(t={_:"reactionEmoji",emoticon:t.reaction});const i=yield this.apiManager.getLimit("reactions"),r=e.peerId+"_"+e.mid;if(this.lastSendingTimes.get(r))return;this.lastSendingTimes.set(r,Date.now()),setTimeout((()=>{this.lastSendingTimes.delete(r)}),333);const{peerId:o,mid:p}=e,d=this.appPeersManager.peerId,f=e=>{--e.count,delete e.chosen_order,(0,Kt.Z)(t,e.reaction)&&(t=void 0),e.count||(0,M.Z)(l.results,e),l.recent_reactions&&(0,Pe.Z)(l.recent_reactions,(t=>(0,Kt.Z)(t.reaction,e.reaction)&&this.appPeersManager.getPeerId(t.peer_id)===d)),l.results.length||(l=void 0)},c=(null===(n=null===(s=e.reactions)||void 0===s?void 0:s.pFlags)||void 0===n?void 0:n.can_see_list)||!this.appPeersManager.isBroadcast(e.peerId)||e.peerId.isUser();e.reactions||(e.reactions={_:"messageReactions",results:[],recent_reactions:c?[]:void 0,pFlags:{can_see_list:c||void 0}});let l=a?e.reactions:(0,ve.Z)(e.reactions);const m=l.results.filter((e=>void 0!==e.chosen_order));m.sort(((e,t)=>t.chosen_order-e.chosen_order));const g=[],h=m.findIndex((e=>(0,Kt.Z)(e.reaction,t)));-1!==h&&g.push(...m.splice(h,1)),g.push(...m.splice(i-+(-1===h))),g.forEach((e=>{m.forEach((t=>{t.chosen_order>e.chosen_order&&--t.chosen_order})),f(e)}));const u=m.length;if(m.forEach(((e,t)=>{e.chosen_order=u-1-t})),t){l||(l={_:"messageReactions",results:[],pFlags:{}},c&&(l.pFlags.can_see_list=!0));let e=l.results.findIndex((e=>(0,Kt.Z)(e.reaction,t))),a=-1!==e&&l.results[e];if(a||(a={_:"reactionCount",count:0,reaction:t},e=l.results.push(a)-1),++a.count,a.chosen_order=m.length?m[0].chosen_order+1:0,m.unshift(a),!l.recent_reactions&&c&&(l.recent_reactions=[]),l.recent_reactions){const e={_:"messagePeerReaction",reaction:t,peer_id:this.appPeersManager.getOutputPeer(d)};this.appPeersManager.isMegagroup(o),l.recent_reactions.unshift(e),l.recent_reactions=l.recent_reactions.slice(0,3)}}const y=this.availableReactions;if(l&&(null==y?void 0:y.length)){const e=new Map;y.forEach(((t,a)=>{e.set(t.reaction,a)})),l.results.sort(((t,a)=>{var s,n;const i=t.reaction.document_id||t.reaction.emoticon,r=a.reaction.document_id||a.reaction.emoticon;return a.count-t.count||(null!==(s=e.get(i))&&void 0!==s?s:0)-(null!==(n=e.get(r))&&void 0!==n?n:0)}))}if(a)return e.reactions=l,this.rootScope.dispatchEvent("messages_reactions",[{message:e,changedResults:[]}]),Promise.resolve();this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:e.peer_id,msg_id:e.id,reactions:l,local:!0});const _=[o,p].join("-"),v=(0,oe.Z)(p),P=this.apiManager.invokeApi("messages.sendReaction",{peer:this.appPeersManager.getInputPeerById(o),msg_id:v,reaction:m.map((e=>e.reaction))}).then((e=>{(0,ue.Z)(e);const t=e.updates.findIndex((e=>"updateEditMessage"===e._||"updateEditChannelMessage"===e._));if(-1!==t){const a=e.updates[t];e.updates[t]={_:"updateMessageReactions",msg_id:v,peer:this.appPeersManager.getOutputPeer(o),reactions:a.message.reactions,pts:a.pts,pts_count:a.pts_count}}this.apiUpdatesManager.processUpdateMessage(e)})).catch((t=>{var a;"REACTION_INVALID"===t.type&&this.sendReactionPromises.get(_)===P&&this.sendReaction(e,null===(a=m[0])||void 0===a?void 0:a.reaction,!0)})).finally((()=>{this.sendReactionPromises.get(_)===P&&this.sendReactionPromises.delete(_)}));return this.sendReactionPromises.set(_,P),P}))}}var Ma=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Ia={EMOJI:"inputStickerSetAnimatedEmoji",EMOJI_ANIMATIONS:"inputStickerSetAnimatedEmojiAnimations",PREMIUM_GIFTS:"inputStickerSetPremiumGifts",GENERIC_ANIMATIONS:"inputStickerSetEmojiGenericAnimations",DEFAULT_STATUSES:"inputStickerSetEmojiDefaultStatuses",DEFAULT_TOPIC_ICONS:"inputStickerSetEmojiDefaultTopicIcons"},Sa=new Set(Object.values(Ia));class Ca extends G{constructor(){super(...arguments),this.storage=new W.Z(H.Z,"stickerSets"),this.processAllStickersResult=e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e)}after(){this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.sounds={},this.names={},this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{this.getAnimatedEmojiStickerSet()}),1e3),this.getGreetingStickersPromise||void 0!==this.getGreetingStickersTimeout||(this.getGreetingStickersTimeout=E.Z.setTimeout((()=>{this.getGreetingStickersTimeout=void 0,this.getGreetingSticker(!0)}),5e3))})),this.rootScope.addEventListener("app_config",(()=>this.onStickersUpdated("faved",!0))),this.apiUpdatesManager.addMultipleEventsListeners({updateNewStickerSet:e=>{const t=e.stickerset;this.saveStickerSet(t,t.set.id),this.rootScope.dispatchEvent("stickers_installed",t.set)},updateRecentStickers:()=>this.onStickersUpdated("recent",!0),updateFavedStickers:()=>this.onStickersUpdated("faved",!0),updateMoveStickerSetToTop:e=>{this.rootScope.dispatchEvent("stickers_top",e.stickerset)}})}onStickersUpdated(e,t){return Ma(this,void 0,void 0,(function*(){const a=yield"faved"===e?this.getFavedStickersStickers(t):this.getRecentStickersStickers(t);this.rootScope.dispatchEvent("stickers_updated",{type:e,stickers:a})}))}getGreetingSticker(e=!1){return this.getGreetingStickersTimeout&&(clearTimeout(this.getGreetingStickersTimeout),this.getGreetingStickersTimeout=void 0),this.getGreetingStickersPromise||(this.getGreetingStickersPromise=this.getStickersByEmoticon("👋⭐️",!1).then((e=>{if(!e.length)throw"NO_STICKERS";this.greetingStickers=e.slice(),this.greetingStickers.sort(((e,t)=>Math.random()-Math.random()))}))),this.getGreetingStickersPromise.then((()=>{let t;return e||(t=this.greetingStickers.shift(),this.greetingStickers.push(t)),this.apiFileManager.downloadMedia({media:this.greetingStickers[0]}),t}))}saveStickers(e){(0,ne.Z)(e,((t,a)=>{(t=this.appDocsManager.saveDoc(t))?e[a]=t:e.splice(a,1)}))}canUseStickerSetCache(e,t){var a;return e&&(null===(a=e.documents)||void 0===a?void 0:a.length)&&(Date.now()-e.refreshTime<36e5||t)}getStickerSet(e,t={}){let{id:a}=e;if(e.access_hash||(e=this.names[a]||e,a=e.id),this.getStickerSetPromises[a])return this.getStickerSetPromises[a];if(!t.overwrite){const e=this.storage.getFromCache(a);if(this.canUseStickerSetCache(e,t.useCache))return e}const s=this.getStickerSetPromises[a]=new Promise((n=>Ma(this,void 0,void 0,(function*(){if(!t.overwrite){const e=yield this.storage.get(a);if(this.canUseStickerSetCache(e,t.useCache))return this.saveStickers(e.documents),n(e),void(this.getStickerSetPromises[a]===s&&delete this.getStickerSetPromises[a])}try{const s=yield this.apiManager.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e),hash:0}),i=t.saveById?a:s.set.id;this.saveStickerSet(s,i),n(s)}catch(e){n(null)}this.getStickerSetPromises[a]===s&&delete this.getStickerSetPromises[a]}))));return s}getLocalStickerSet(e){return this.getStickerSet({id:e},{saveById:!0})}getAnimatedEmojiStickerSet(){return Promise.all([this.getLocalStickerSet(Ia.EMOJI),this.getLocalStickerSet(Ia.EMOJI_ANIMATIONS),this.getAnimatedEmojiSounds()]).then((([e,t])=>({emoji:e,animations:t})))}getAnimatedEmojiSounds(e){if(this.getAnimatedEmojiSoundsPromise&&!e)return this.getAnimatedEmojiSoundsPromise;const t=this.getAnimatedEmojiSoundsPromise=Promise.all([this.apiManager.getAppConfig(e),this.apiManager.getConfig()]).then((([e,a])=>{if(this.getAnimatedEmojiSoundsPromise===t)for(const t in e.emojies_sounds){const s=e.emojies_sounds[t],n=atob(s.file_reference_base64.replace(/-/g,"+").replace(/_/g,"/")),i=new Uint8Array(n.length);for(let e=0,t=i.length;e((0,ue.Z)(e),this.recentStickers=e.stickers,this.saveStickers(e.stickers),e),overwrite:e})}))}getRecentStickersStickers(e){if(e)this.recentStickers=void 0;else if(this.recentStickers)return this.recentStickers;return this.getRecentStickers(e).then((()=>this.recentStickers))}saveRecentSticker(e,t,a){const s=this.appDocsManager.getDoc(e);if((0,Pe.Z)(this.recentStickers,(t=>t.id===e)),!t){this.recentStickers.unshift(s);const e=(0,Pt.Z)(s.stickerEmojiRaw);for(const t in this.getStickersByEmoticonsPromises)this.getStickersByEmoticonsPromises[t].then((a=>{const n=(0,Pe.Z)(a,(e=>e.id===s.id));n?a.unshift(n):t.includes(e)&&a.unshift(s)}))}return this.rootScope.dispatchEvent("sticker_updated",{type:"recent",faved:!t,document:s}),t&&this.onStickersUpdated("recent",!1),this.apiManager.invokeApi("messages.saveRecentSticker",{id:zt(s),unsave:t,attached:a})}cleanEmoji(e){return e.replace(/\ufe0f/g,"").replace(/🏻|🏼|🏽|🏾|🏿/g,"")}getAnimatedEmojiSticker(e,t){const a=t?Ia.EMOJI_ANIMATIONS:Ia.EMOJI,s=this.storage.getFromCache(a);if(!(null==s?void 0:s.documents))return;t&&["🧡","💛","💚","💙","💜","🖤","🤍","🤎"].includes(e)&&(e="❤️"),e=this.cleanEmoji(e);const n=s.packs.find((t=>t.emoticon===e));return n?this.appDocsManager.getDoc(n.documents[0]):void 0}getAnimatedEmojiSoundDocument(e){return this.sounds[this.cleanEmoji(e)]}preloadAnimatedEmojiSticker(e){const t=this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e)));return Promise.all([t,this.preloadAnimatedEmojiStickerAnimation(e)]).then((([e,t])=>({doc:e,animation:null==t?void 0:t.doc,sound:null==t?void 0:t.sound})))}preloadAnimatedEmojiStickerAnimation(e){return this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e,!0))).then((t=>{if(!t)return;const a=this.getAnimatedEmojiSoundDocument(e);return Promise.all([this.preloadSticker(t.id),a?this.preloadSticker(a.id):void 0]).then((()=>({doc:t,sound:a})))}))}preloadSticker(e,t){var a;const s=this.appDocsManager.getDoc(e);return this.apiFileManager.downloadMedia({media:s,thumb:t?null===(a=s.video_thumbs)||void 0===a?void 0:a[0]:void 0})}saveStickerSet(e,t){const a={_:"messages.stickerSet",set:e.set,packs:e.packs,documents:e.documents,keywords:e.keywords};let s=this.storage.getFromCache(t);s?Object.assign(s,a):s=this.storage.setToCache(t,a),s.set.short_name&&(this.names[s.set.short_name]=this.getStickerSetInput(a.set)),this.saveStickers(e.documents);const n=s.set.installed_date||Sa.has(t);s.refreshTime=Date.now(),this.storage.set({[t]:s},!n)}getStickerSetThumbDownloadOptions(e){var t;const a=e.thumbs.find((e=>"photoSize"===e._)),s=e.thumb_dc_id,n=null===(t=e.pFlags)||void 0===t?void 0:t.animated;return{dcId:s,location:{_:"inputStickerSetThumb",stickerset:this.getStickerSetInput(e),thumb_version:e.thumb_version},size:a.size,mimeType:n?"application/x-tgsticker":"image/webp"}}getStickerSetInput(e){return Sa.has(e.id)?{_:e.id}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return Ma(this,void 0,void 0,(function*(){return(yield this.apiManager.invokeApiHashable({method:"messages.getFeaturedStickers",processResult:e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[],keywords:[]},e.set.id)})),e)})).sets}))}getPromoPremiumStickers(){return this.getStickersByEmoticon("⭐️⭐️",!1)}getPremiumStickers(){return this.getStickersByEmoticon("📂⭐️",!1)}getFavedStickers(e){return this.apiManager.invokeApiHashable({method:"messages.getFavedStickers",processResult:e=>((0,ue.Z)(e),this.saveStickers(e.stickers),this.favedStickers=e.stickers,e),overwrite:e})}getFavedStickersStickers(e){if(e)this.favedStickers=void 0;else if(this.favedStickers)return this.favedStickers;return this.getFavedStickers(e).then((()=>this.favedStickers))}getFavedStickersLimit(){return this.apiManager.getLimit("favedStickers")}faveSticker(e,t){return Ma(this,void 0,void 0,(function*(){this.favedStickers||(yield this.getFavedStickersStickers());const a=yield this.getFavedStickersLimit(),s=this.appDocsManager.getDoc(e);return(0,Pe.Z)(this.favedStickers,(e=>e.id===s.id)),t||(this.favedStickers.unshift(s),this.favedStickers.splice(a,this.favedStickers.length-a)),this.rootScope.dispatchEvent("sticker_updated",{type:"faved",faved:!t,document:s}),this.apiManager.invokeApi("messages.faveSticker",{id:zt(s),unfave:t}).then((()=>{t&&this.onStickersUpdated("faved",!0)}))}))}toggleStickerSet(e){return Ma(this,void 0,void 0,(function*(){if((e=this.storage.getFromCache(e.id).set).installed_date){if(yield this.apiManager.invokeApi("messages.uninstallStickerSet",{stickerset:this.getStickerSetInput(e)}))return delete e.installed_date,this.rootScope.dispatchEvent("stickers_deleted",e),this.storage.delete(e.id,!0),!0}else if(yield this.apiManager.invokeApi("messages.installStickerSet",{stickerset:this.getStickerSetInput(e),archived:!1}))return e.installed_date=Date.now()/1e3|0,this.rootScope.dispatchEvent("stickers_installed",e),!0;return!1}))}toggleStickerSets(e){return Promise.all(e.map((e=>this.toggleStickerSet(e))))}searchStickerSets(e,t=!0){return Ma(this,void 0,void 0,(function*(){const a=t?1:0,s=yield this.apiManager.invokeApiHashable({method:"messages.searchStickerSets",params:{flags:a,exclude_featured:t||void 0,q:e},processResult:e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[],keywords:[]},e.set.id)})),e)}),n=[],r=this.storage.getCache();for(const t in r){const{set:a}=r[t];a.title.toLowerCase().includes(e.toLowerCase())&&!s.sets.find((e=>e.set.id===a.id))&&n.push({_:"stickerSetCovered",set:a,cover:null})}return s.sets.concat(n)}))}getAllStickers(){return this.apiManager.invokeApiHashable({method:"messages.getAllStickers",processResult:this.processAllStickersResult})}getEmojiStickers(){return this.apiManager.invokeApiHashable({method:"messages.getEmojiStickers",processResult:this.processAllStickersResult})}preloadStickerSets(){return this.getAllStickers().then((e=>Promise.all(e.sets.map((e=>this.getStickerSet(e,{useCache:!0}))))))}getStickersByEmoticon(e,t=!0){return e=(0,Pt.Z)(e),this.getStickersByEmoticonsPromises[e]?this.getStickersByEmoticonsPromises[e]:this.getStickersByEmoticonsPromises[e]=Promise.all([this.apiManager.invokeApiHashable({method:"messages.getStickers",params:{emoticon:e},processResult:e=>e}),t?this.preloadStickerSets():[],t?this.getRecentStickers():void 0]).then((([t,a,s])=>{const n=t.stickers.map((e=>this.appDocsManager.saveDoc(e))),r=[],o=[],p=t=>{for(const a of t)if((0,Pt.Z)(a.emoticon).includes(e))for(const e of a.documents){const t=this.appDocsManager.getDoc(e);(t.animated?r:o).push(t)}};if(s){p(s.packs);const e=s.stickers;[r,o].forEach((t=>{t.sort(((t,a)=>e.indexOf(t)-e.indexOf(a)))}))}for(const e of a)p(e.packs);const d=[...new Set(r.concat(o,n))];return(0,ne.Z)(d,((e,t,a)=>{(3===e.sticker&&!i().IS_WEBM_SUPPORTED||!this.rootScope.premium&&(0,Wt.Z)(e))&&a.splice(t,1)})),d}))}clearRecentStickers(){return this.recentStickers&&(this.recentStickers.length=0,this.onStickersUpdated("recent",!1)),this.apiManager.invokeApi("messages.clearRecentStickers")}}var wa=a(467),ka=a(8493);class Aa extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.users={},this.usernames={};else for(const e in this.users){if(!e)continue;const t=e.toPeerId();if(!this.peersStorage.isPeerNeeded(t)){const t=this.users[e];this.modifyUsernamesCache(t,!1),this.storage.delete(e),delete this.users[e]}}this.getTopPeersPromises={},this.contactsIndex=this.createSearchIndex(),this.contactsFillPromise=void 0,this.contactsList=new Set,this.updatedContactsList=!1},this.updateUsersStatuses=()=>{const e=(0,te.Z)(!0);for(const t in this.users){const a=this.users[t];this.updateUserStatus(a,e)}}}after(){return this.clear(!0),setInterval(this.updateUsersStatuses,6e4),this.rootScope.addEventListener("state_synchronized",this.updateUsersStatuses),this.apiUpdatesManager.addMultipleEventsListeners({updateUserStatus:e=>{const t=e.user_id,a=this.users[t];a&&(a.status=e.status,a.status&&("expires"in a.status&&(a.status.expires-=this.timeManager.getServerTimeOffset()),"was_online"in a.status&&(a.status.was_online-=this.timeManager.getServerTimeOffset())),this.rootScope.dispatchEvent("user_update",t),this.setUserToStateIfNeeded(a))},updateUserName:e=>{const t=e.user_id,a=this.users[t];a&&(this.forceUserOnline(t),this.saveApiUser(Object.assign(Object.assign({},a),{first_name:e.first_name,last_name:e.last_name,username:void 0,usernames:e.usernames}),!0))}}),this.rootScope.addEventListener("language_change",(e=>{const t=this.getSelf().id;this.contactsIndex.indexObject(t,this.getUserSearchText(t))})),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("users")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.saveApiUsers(t);for(let a=0,s=t.length;a{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)||this.storage.set({[t]:this.getUser(t)})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)&&this.storage.delete(t)}))}))}get userId(){return this.rootScope.myId.toUserId()}onContactsModified(e){e&&this.appStateManager.pushToState("contactsListCachedTime",(0,te.Z)(!0))}pushRecentSearch(e){return this.appStateManager.getState().then((t=>{const a=t.recentSearch||[];if(a[0]!==e){(0,M.Z)(a,e),a.unshift(e),a.length>20&&(a.length=20),this.appStateManager.pushToState("recentSearch",a);for(const e of a)this.peersStorage.requestPeer(e,"recentSearch")}}))}clearRecentSearch(){return this.appStateManager.getState().then((e=>{const t=e.recentSearch||[];for(const e of t)this.peersStorage.releasePeer(e,"recentSearch");t.length=0,this.appStateManager.pushToState("recentSearch",t)}))}fillContacts(){var e;if(this.contactsFillPromise&&this.updatedContactsList)return{cached:this.contactsFillPromise.isFulfilled,promise:this.contactsFillPromise};this.updatedContactsList=!0;const t=(0,v.Z)();return this.apiManager.invokeApi("contacts.getContacts").then((e=>{"contacts.contacts"===e._&&(this.contactsList.clear(),this.saveApiUsers(e.users),e.contacts.forEach((e=>{this.pushContact(e.user_id)})),this.onContactsModified(!0),this.contactsFillPromise=t),t.resolve(this.contactsList)}),(()=>{this.updatedContactsList=!1})),{cached:null===(e=this.contactsFillPromise)||void 0===e?void 0:e.isFulfilled,promise:this.contactsFillPromise||(this.contactsFillPromise=t)}}resolveUsername(e){"@"===e[0]&&(e=e.slice(1)),e=e.toLowerCase();const t=this.usernames[e];return t?this.appPeersManager.getPeer(t):this.apiManager.invokeApiSingleProcess({method:"contacts.resolveUsername",params:{username:e},processResult:e=>this.processResolvedPeer(e)})}processResolvedPeer(e){return this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appPeersManager.getPeer((0,le.Z)(e.peer))}resolvePhone(e){return this.apiManager.invokeApi("contacts.resolvePhone",{phone:e}).then((e=>this.processResolvedPeer(e)))}pushContact(e){this.contactsList.add(e),this.contactsIndex.indexObject(e,this.getUserSearchText(e)),this.peersStorage.requestPeer(e.toPeerId(),"contact")}popContact(e){this.contactsList.delete(e),this.contactsIndex.indexObject(e,""),this.peersStorage.releasePeer(e.toPeerId(),"contact")}getUserSearchText(e){const t=this.users[e];return t?[t.first_name,t.last_name,t.phone,...(0,Jt.Z)(t),t.pFlags.self?"Saved Messages":""].filter(Boolean).join(" "):""}getContacts(e,t=!1,a="name"){return this.fillContacts().promise.then((s=>{let n=[...s];if(e){const t=this.contactsIndex.search(e);n=[...n].filter((e=>t.has(e)))}"name"===a?n.sort(((e,t)=>{const a=(this.users[e]||{}).sortName||"",s=(this.users[t]||{}).sortName||"";return a.localeCompare(s)})):"online"===a&&n.sort(((e,t)=>{const a=this.getUserStatusForSort(this.getUser(e).status);return this.getUserStatusForSort(this.getUser(t).status)-a}));const i=this.userId;return(0,M.Z)(n,i),t&&this.testSelfSearch(e)&&n.unshift(i),n}))}getContactsPeerIds(e,t,a,s){return this.getContacts(e,t,a).then((e=>{const t=e.map((e=>e.toPeerId(!1)));return s?t.slice(0,s):t}))}toggleBlock(e,t){return this.apiManager.invokeApiSingle(t?"contacts.block":"contacts.unblock",{id:this.appPeersManager.getInputPeerById(e)}).then((a=>(a&&this.apiUpdatesManager.processLocalUpdate({_:"updatePeerBlocked",peer_id:this.appPeersManager.getOutputPeer(e),blocked:t}),a)))}testSelfSearch(e){const t=this.getSelf(),a=this.createSearchIndex();return a.indexObject(t.id,this.getUserSearchText(t.id)),a.search(e).has(t.id)}createSearchIndex(){return new ae.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiUser(e,t))))}modifyUsernamesCache(e,t){const a=(0,Jt.Z)(e);if(!a.length)return;const s=a.map((e=>function(e){return e&&e.toLowerCase()||""}(e)));t?s.forEach((t=>{this.usernames[t]=e.id.toPeerId("user"!==e._)})):s.forEach((e=>{delete this.usernames[e]}))}setUsernameToCache(e,t){return!(t&&t.username===e.username&&(0,Y.Z)(t.usernames,e.usernames)||(this.modifyUsernamesCache(t,!1),this.modifyUsernamesCache(e,!0),0))}saveApiUser(e,t){var a,s,n,i;if(!e||"userEmpty"===e._)return;const r=e.id,o=this.users[r];if(null!==(a=e.pFlags)&&void 0!==a||(e.pFlags={}),e.pFlags.min&&void 0!==o)return;const p=this.setUsernameToCache(e,o);if(o&&void 0!==o.sortName&&o.first_name===e.first_name&&o.last_name===e.last_name)e.sortName=o.sortName;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":(0,wa.ZP)(t,!1)}if(e.status&&(e.status.expires&&(e.status.expires-=this.timeManager.getServerTimeOffset()),e.status.was_online&&(e.status.was_online-=this.timeManager.getServerTimeOffset())),"userProfilePhotoEmpty"===(null===(s=e.photo)||void 0===s?void 0:s._)&&delete e.photo,void 0===o)this.users[r]=e;else{const t=e.first_name!==o.first_name||e.last_name!==o.last_name||p,a=(null===(n=o.photo)||void 0===n?void 0:n.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id),s=o.pFlags.premium!==e.pFlags.premium||o.pFlags.verified!==e.pFlags.verified||o.pFlags.scam!==e.pFlags.scam||o.pFlags.fake!==e.pFlags.fake,d=!!o.pFlags.contact,f=!!e.pFlags.contact;re(o,e),this.rootScope.dispatchEvent("user_update",r),d!==f&&this.onContactUpdated(r,f,d),a&&this.rootScope.dispatchEvent("avatar_update",{peerId:e.id.toPeerId()}),(t||s)&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:e.id.toPeerId()})}this.checkPremium(e,o),this.setUserToStateIfNeeded(e)}checkPremium(e,t){if(e.pFlags.self){const a=!!e.pFlags.premium;this.rootScope.premium!==a&&this.rootScope.dispatchEvent("premium_toggle_private",{isNew:!t,isPremium:a})}}setUserToStateIfNeeded(e){this.peersStorage.isPeerNeeded(e.id.toPeerId())&&this.storage.set({[e.id]:e})}isUserOnlineVisible(e){return this.getUserStatusForSort(e)>3}getUserStatusForSort(e){if("object"!=typeof e){const t=this.getUser(e);e=null==t?void 0:t.status}if(e){const t="userStatusOnline"===e._?e.expires:"userStatusOffline"===e._?e.was_online:0;if(t)return t;switch(e._){case"userStatusRecently":return 3;case"userStatusLastWeek":return 2;case"userStatusLastMonth":return 1}}return 0}getUser(e){return(0,fe.Z)(e)?e:this.users[e]}getUserStatus(e){return this.isRegularUser(e)&&!this.users[e].pFlags.self&&this.users[e].status}getUserPhone(e){return t=this,a=void 0,n=function*(){const t=this.getUser(e);if(!(null==t?void 0:t.phone))return;const a=yield this.apiManager.getAppConfig();return{phone:t.phone,isAnonymous:a.fragment_prefixes.some((e=>t.phone.startsWith(e)))}},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}getSelf(){return this.getUser(this.userId)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}isAttachMenuBot(e){return this.isBot(e)&&!!this.users[e].pFlags.bot_attach_menu}isContact(e){return this.contactsList.has(e)||!(!this.users[e]||!this.users[e].pFlags.contact)}isRegularUser(e){const t=this.users[e];return t&&!this.isBot(e)&&!t.pFlags.deleted&&!t.pFlags.support}isNonContactUser(e){return this.isRegularUser(e)&&!this.isContact(e)&&e!==this.userId}hasUser(e,t){const a=this.users[e];return(0,fe.Z)(a)&&(t||!a.pFlags.min)}getUserString(e){const t=this.getUser(e);return"u"+e+(t.access_hash?"_"+t.access_hash:"")}getUserInput(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputUserSelf"}:{_:"inputUser",user_id:e,access_hash:t.access_hash}}getUserInputPeer(e){return{_:"inputPeerUser",user_id:e,access_hash:this.getUser(e).access_hash}}getContactMediaInput(e){const t=this.getUser(e);return{_:"inputMediaContact",first_name:t.first_name,last_name:t.last_name,phone_number:t.phone,vcard:"",user_id:e}}updateUserStatus(e,t=(0,te.Z)(!0)){e.status&&"userStatusOnline"===e.status._&&e.status.expires=60)return}else if(this.apiUpdatesManager.updatesState.syncLoading)return;const s=this.getUser(e);!(null==s?void 0:s.status)||"userStatusOnline"===s.status._||"userStatusEmpty"===s.status._||s.pFlags.support||s.pFlags.deleted||(s.status={_:"userStatusOnline",expires:a+60},this.rootScope.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(s))}importContact(e,t,a){return this.importContacts([{first_name:e,last_name:t,phones:[a]}]).then((e=>{if(!e.length){const e=new Error;throw e.type="NO_USER",e}return e[0]}))}importContacts(e){const t=[];for(let a=0;a(this.saveApiUsers(e.users),e.imported.map((e=>(this.onContactUpdated(e.user_id,!0),e.user_id))))))}getTopPeers(e){return this.getTopPeersPromises[e]?this.getTopPeersPromises[e]:this.getTopPeersPromises[e]=this.appStateManager.getState().then((t=>{const a=t.topPeersCache[e];return a&&a.cachedTime+864e5>Date.now()&&a.peers?a.peers:this.apiManager.invokeApi("contacts.getTopPeers",{[e]:!0,offset:0,limit:15,hash:"0"}).then((a=>{let s=[];return"contacts.topPeers"===a._&&(this.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),a.categories.length&&(s=a.categories[0].peers.map((e=>{const t=(0,le.Z)(e.peer);return this.peersStorage.requestPeer(t,"topPeer"),{id:t,rating:e.rating}})))),t.topPeersCache[e]={peers:s,cachedTime:Date.now()},this.appStateManager.pushToState("topPeersCache",t.topPeersCache),s}))}))}getBlocked(e=0,t=0){return this.apiManager.invokeApiSingle("contacts.getBlocked",{offset:e,limit:t}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{count:"contacts.blocked"===e._?e.users.length+e.chats.length:e.count,peerIds:e.users.map((e=>e.id.toPeerId())).concat(e.chats.map((e=>e.id.toPeerId(!0))))})))}getLocated(e,t,a,s=!1,n=0){const i={_:"inputGeoPoint",lat:e,long:t,accuracy_radius:a};return this.apiManager.invokeApi("contacts.getLocated",{geo_point:i,background:s}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e)))}searchContacts(e,t=20){const a=(0,Lt.Z)(e);if(a.length&&a[0].length===e.trim().length&&"messageEntityUrl"===a[0]._)try{const t=new URL(je(e).url).pathname.slice(1);t&&(e=t)}catch(e){}return this.apiManager.invokeApiCacheable("contacts.search",{q:e,limit:t},{cacheSeconds:60}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{my_results:(0,we.Z)(e.my_results.map((e=>(0,le.Z)(e)))),results:e.results.map((e=>(0,le.Z)(e)))})))}onContactUpdated(e,t,a=this.isContact(e)){t!==a&&(t?this.pushContact(e):this.popContact(e),this.onContactsModified(),this.rootScope.dispatchEvent("contacts_update",e))}updateUsername(e){return this.apiManager.invokeApi("account.updateUsername",{username:e}).then((e=>{this.saveApiUser(e)}))}setUserStatus(e,t){if(this.isBot(e))return;const a=this.users[e];if(a){const s=t?{_:"userStatusOffline",was_online:(0,te.Z)(!0)}:{_:"userStatusOnline",expires:(0,te.Z)(!0)+50};a.status=s,this.rootScope.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(a)}}updateMyOnlineStatus(e){return this.setUserStatus(this.getSelf().id,e),this.apiManager.invokeApiSingle("account.updateStatus",{offline:e})}addContact(e,t,a,s,n){return this.apiManager.invokeApi("contacts.addContact",{id:this.getUserInput(e),first_name:t,last_name:a,phone:s,add_phone_privacy_exception:n}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),this.onContactUpdated(e,!0)}))}deleteContacts(e){return this.apiManager.invokeApi("contacts.deleteContacts",{id:e.map((e=>this.getUserInput(e)))}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),e.forEach((e=>{this.onContactUpdated(e,!1)}))}))}checkUsername(e){return this.apiManager.invokeApi("account.checkUsername",{username:e})}toggleUsername(e,t){return this.apiManager.invokeApi("account.toggleUsername",{username:e,active:t})}reorderUsernames(e){return this.apiManager.invokeApi("account.reorderUsernames",{order:e})}canSendToUser(e){return(0,ka.Z)(this.getUser(e))}}const Da=new Set(["photo","video","gif","document"]);class Ua extends G{constructor(){super(...arguments),this.webpages={},this.pendingWebPages={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateWebPage:e=>{this.saveWebPage(e.webpage)}})}saveWebPage(e,t,a){var s,n;if("webPageNotModified"===e._||"webPageEmpty"===e._)return;const{id:i}=e,r=this.webpages[i],o=r&&r._===e._&&r.hash==r.hash;if("webPage"===e._){"photo"===(null===(s=e.photo)||void 0===s?void 0:s._)?e.photo=this.appPhotosManager.savePhoto(e.photo,a):delete e.photo,"document"===(null===(n=e.document)||void 0===n?void 0:n._)?e.document=this.appDocsManager.saveDoc(e.document,a):("document"===e.type&&delete e.type,delete e.document);const t=e.site_name,i=e.title||e.author||t||"";t&&i===t&&delete e.site_name,Da.has(e.type)||e.description||!e.photo||(e.type="photo")}let p=this.pendingWebPages[i];if(t&&(p||(p=this.pendingWebPages[i]=new Set),p.add(t)),void 0===r?this.webpages[i]=e:re(r,e),!t&&void 0!==p&&o){const e=[];p.forEach((t=>{const[a,s,n]=t.split("_");e.push({peerId:a.toPeerId(),mid:+s,isScheduled:!!n})})),this.rootScope.dispatchEvent("webpage_updated",{id:i,msgs:e})}return e}getMessageKeyForPendingWebPage(e,t,a){return e+"_"+t+(a?"_s":"")}deleteWebPageFromPending(e,t){const a=e.id;if(!a)return;const s=this.pendingWebPages[a];s&&s.has(t)&&(s.delete(t),s.size||delete this.pendingWebPages[a])}getCachedWebPage(e){return this.webpages[e]}getWebPage(e){return this.apiManager.invokeApiHashable({method:"messages.getWebPage",processResult:e=>this.saveWebPage(e),params:{url:e}})}}var Ta=a(5936),Ea=a(3019);function Fa(e){return(0,Ea.Z)(e,"readAsArrayBuffer")}var Ra=a(1243),xa=a(7086);function Ba(e){return encodeURIComponent(e).replace(/['()]/g,escape).replace(/\*/g,"%2A")}class Va{constructor(e,t){this.serviceMessagePort=e,this.downloadId=t,this.serviceMessagePort=zs()}write(e,t){return a=this,s=void 0,i=function*(){return this.serviceMessagePort.invoke("downloadChunk",{id:this.downloadId,chunk:e})},new((n=void 0)||(n=Promise))((function(e,t){function r(e){try{p(i.next(e))}catch(e){t(e)}}function o(e){try{p(i.throw(e))}catch(e){t(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,o)}p((i=i.apply(a,s||[])).next())}));var a,s,n,i}finalize(e){return this.serviceMessagePort.invoke("downloadFinalize",this.downloadId).then((()=>{}))}}class Oa{getFile(e){return Promise.reject((0,X.Z)("NO_ENTRY_FOUND"))}prepareWriting({fileName:e,downloadId:t,size:a}){const s=Object.assign({"Content-Type":"application/octet-stream; charset=utf-8","Content-Disposition":"attachment; filename*=UTF-8''"+Ba(e)},a?{"Content-Length":a}:{}),n=zs(),i=n.invoke("download",{headers:s,id:t}),r=(0,v.Z)();return r.cancel=()=>{r.reject((0,X.Z)("DOWNLOAD_CANCELED"))},r.catch((()=>{zs().invoke("downloadCancel",t)})),i.then(r.resolve,r.reject),{deferred:r,getWriter:()=>new Va(n,t)}}}var La=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Na=131072,Za=new Set(["DOWNLOAD_CANCELED","UPLOAD_CANCELED","UNKNOWN","NO_NEW_CONTEXT"]);class ja extends G{constructor(){super(...arguments),this.cacheStorage=new Ta.Z("cachedFiles"),this.downloadStorage=new Oa,this.downloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.refreshReferencePromises={},this.log=(0,I.kg)("AFM",I.v9.Error|I.v9.Log),this.tempId=0,this.queueId=0,this.debug=b.Z.debug,this.maxUploadParts=4e3,this.maxDownloadParts=8e3,this.uncompressTGS=(e,t)=>this.cryptoWorker.invokeCrypto("gzipUncompress",e.slice().buffer,!1),this.uncompressTGV=(e,t)=>{const a=e.slice().buffer;return i().IS_FIREFOX?this.cryptoWorker.invokeCrypto("gzipUncompress",a,!0).then((e=>function(e){const t=e.indexOf("/,` width="${n}" height="${i}">`).replace(/[^\x00-\x7F]/g,"")}(e))).then((e=>(new TextEncoder).encode(e))):this.cryptoWorker.invokeCrypto("gzipUncompress",a,!1)},this.convertWebp=(e,t)=>f.Z.getInstance().invoke("convertWebp",{fileName:t,bytes:e}),this.convertOpus=(e,t)=>f.Z.getInstance().invoke("convertOpus",{fileName:t,bytes:e})}after(){setInterval((()=>{for(const e in this.refreshReferencePromises){const{deferred:t}=this.refreshReferencePromises[e];(t.isFulfilled||t.isRejected)&&delete this.refreshReferencePromises[e]}}),18e5),this.rootScope.addEventListener("config",(e=>{this.webFileDcId=e.webfile_dc_id})),this.rootScope.addEventListener("app_config",(e=>{this.maxUploadParts=this.rootScope.premium?e.upload_max_fileparts_premium:e.upload_max_fileparts_default,this.maxDownloadParts=e.upload_max_fileparts_premium}))}downloadRequest(e,t,a,s,n=0){void 0===this.downloadPulls[e]&&(this.downloadPulls[e]=[],this.downloadActives[e]=0);const i=this.downloadPulls[e],r=new Promise(((e,r)=>{i.push({id:t,queueId:n,cb:a,deferred:{resolve:e,reject:r},activeDelta:s})}));return setTimeout((()=>{this.downloadCheck(e)}),0),r}downloadCheck(e){const t=this.downloadPulls[e],a=this.rootScope.premium?224:36;if(this.downloadActives[e]>=a||!(null==t?void 0:t.length))return!1;const s=(0,Pe.Z)(t,(e=>0===e.queueId))||(0,Pe.Z)(t,(e=>e.queueId===this.queueId))||t.shift(),n=s.activeDelta||1;this.downloadActives[e]+=n;const i=s.cb();i.then((()=>{this.downloadActives[e]-=n,this.downloadCheck(e)}),(t=>{(null==t?void 0:t.type)&&Za.has(t.type)||this.log.error("downloadCheck error:",t),this.downloadActives[e]-=n,this.downloadCheck(e)})).finally((()=>{i.then(s.deferred.resolve,s.deferred.reject)}))}setQueueId(e){this.queueId=e}getFileStorage(){return this.cacheStorage}cancelDownload(e){const t=[this.downloadPromises[e],this.uploadPromises[e]].filter(Boolean);let a=!1;for(let e=0,s=t.length;eLa(this,void 0,void 0,(function*(){if(null==r||r(),"url"in t){const e=t.url;if(this.isLocalWebFile(e))return fetch(e).then((e=>e.arrayBuffer())).then((t=>{const a=e.split(".").pop(),s=mt[a]||"application/octet-stream";return{_:"upload.webFile",size:t.byteLength,mime_type:s,file_type:{_:"storage.fileUnknown"},mtime:0,bytes:new Uint8Array(t)}}))}return this.apiManager.invokeApi("upload.getWebFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0})}))),this.getDelta(s),i)}requestFilePart(e,t,a,s,n=0,i=0,r){return this.downloadRequest(e,n,(()=>La(this,void 0,void 0,(function*(){null==r||r();const n=()=>La(this,void 0,void 0,(function*(){var i;null==r||r();const o=null===(i=t.file_reference)||void 0===i?void 0:i.slice();return this.apiManager.invokeApi("upload.getFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0}).catch((e=>{if(null==r||r(),"FILE_REFERENCE_EXPIRED"===e.type)return this.refreshReference(t,o).then(n);throw e}))}));(0,ue.Z)(t);const i=t.file_reference;if(i&&!t.checkedReference){t.checkedReference=!0;const e=T(i);if(this.refreshReferencePromises[e])return this.refreshReference(t,i).then(n)}return n()}))),this.getDelta(s),i)}getDelta(e){return e/Na}getLimitPart(e,t){if(!e)return 524288;let a=Na;const s=t?this.maxUploadParts:this.maxDownloadParts,n=t?524288:1048576;for(;e/a>s&&a{a===T(t)&&e.reject((0,X.Z)("REFERENCE_IS_NOT_REFRESHED")),e.resolve(t)}),e.reject)}return s.deferred.then((t=>{e.file_reference=t}))}isDownloading(e){return!!this.downloadPromises[e]}getDownload(e){return this.downloadPromises[e]}getUpload(e){return this.uploadPromises[e]}getConvertMethod(e){let t;return"application/x-tgwallpattern"===e?(t=this.uncompressTGV,e="image/svg+xml"):"image/webp"!==e||i().IS_WEBP_SUPPORTED?"application/x-tgsticker"===e?(t=this.uncompressTGS,e="application/json"):"audio/ogg"!==e||i().IS_OPUS_SUPPORTED||(t=this.convertOpus,e="audio/wav"):(t=this.convertWebp,e="image/png"),{mimeType:e,process:t}}allocateDeferredPromises(e,t,a){const s=[];let n,i=e,r=Promise.resolve();do{n=(0,v.Z)(),s.push({offset:i,writePromise:r,writeDeferred:n}),r=n,i+=a}while(i{if(!(null==e?void 0:e.error))for(const a of S)e&&e!==a||(a.error=t,a.deferred.reject(t))},y="inputWebFileLocation"===i._,_=y&&this.isLocalWebFile(i.url),v=this.tempId++,P=_?s:e.limitPart||this.getLimitPart(s,!1);let b,M,I=m.getFile.bind(m);const S=[],C=s||P,w=(e,t)=>{const{deferred:a}=e,s=u.bind(null,e);a.cancel=()=>a.reject((0,X.Z)("DOWNLOAD_CANCELED")),a.catch((t=>{var a,n;s(t),null===(n=null===(a=e.writer)||void 0===a?void 0:a.truncate)||void 0===n||n.call(a)})).finally((()=>{this.downloadPromises[t]===a&&delete this.downloadPromises[t],delete e.writer})),this.downloadPromises[t]=a,S.push(e)};if(m&&(!g||C<=o.Iw)&&(b=m.prepareWriting(l,C,e.mimeType),w(b,l)),g){let t=e.fileName;if(!t){t=l;const a=gt[e.mimeType];a&&(t+="."+a)}M=g.prepareWriting({fileName:t,downloadId:r,size:C}),w(M,c),b&&M.deferred.catch((e=>b.deferred.reject(e)))}h=null!==(a=null==M?void 0:M.deferred)&&void 0!==a?a:b.deferred,g&&f&&(I=g.getFile.bind(g)),I(l).then((e=>La(this,void 0,void 0,(function*(){if(k(),M){const t=M.writer=M.getWriter();k();const a=yield function(e){return Fa(e).then((e=>new Uint8Array(e)))}(e);k(),yield t.write(a),k(),M.deferred.resolve(yield t.finalize())}b&&b.deferred.resolve(e)})))).catch((t=>La(this,void 0,void 0,(function*(){if(e.onlyCache)return void u(null,t);S.forEach((e=>{e.writer=e.getWriter()}));const a=(y?this.requestWebFilePart:this.requestFilePart).bind(this);y&&void 0===this.webFileDcId&&!_&&(yield this.apiManager.getConfig(),k());const r=this.allocateDeferredPromises(0,s,P),p={done:0,offset:0,total:s,fileName:c},d=()=>{try{k(),p.done=g,this.rootScope.dispatchEvent("download_progress",p)}catch(e){}},m=(0,aa.Z)(d,50,!0);let g=0;const h=()=>La(this,void 0,void 0,(function*(){const{offset:t,writePromise:p,writeDeferred:y}=r.shift();try{k();performance.now();const u=yield a(n,i,t,P,v,e.queueId,k),_=(performance.now(),u.bytes);r.length&&h();const b=_.byteLength;this.debug&&this.log("downloadFile requestFilePart result:",c,u);const M=t+P>=s||!b;if(b){g+=b,M?d():m();performance.now();yield p,k(),performance.now(),performance.now(),yield Promise.all(S.map((({writer:e})=>null==e?void 0:e.write(_,t)))),k()}if(M&&(!s||g{var t;return null===(t=null==e?void 0:e.trim)||void 0===t?void 0:t.call(e,g)})),M&&f){const e=S.filter((({writer:e})=>(null==e?void 0:e.getParts)&&e.replaceParts)).map((({writer:e})=>La(this,void 0,void 0,(function*(){const t=e.getParts(),a=yield f(t,l);e.replaceParts(a)}))));yield Promise.all(e),k()}if(y.resolve(),M){const e=g<=o.Iw;S.forEach((t=>{const{deferred:a,writer:s}=t;if(a.isFulfilled||a.isRejected||!s)return;const n=s.finalize(e);a.resolve(n)}))}}catch(e){u(null,e)}}));for(let e=0,t=Math.min(1/0,r.length);e{if(S.reduce(((e,t)=>e+ +!!t.error),0)===S.length)throw S[0].error};return h}downloadMedia(e){let{media:t,thumb:a}=e;const s="photo"===t._;if(s&&!a)return Promise.reject("preloadPhoto photoEmpty!");const n="document"===t._;n?t=this.appDocsManager.getDoc(t.id):s&&(t=this.appPhotosManager.getPhoto(t.id));const{fileName:i,downloadOptions:r}=(0,Ra.Z)(e);let o=this.getDownload(i);return o||(o=this.download(r),n&&!a&&(this.rootScope.dispatchEvent("document_downloading",t.id),o.then((()=>{this.rootScope.dispatchEvent("document_downloaded",t.id)})).catch(jt.Z))),o}downloadMediaURL(e){const{media:t,thumb:a}=e;let s=this.thumbsStorage.getCacheContext(t,null==a?void 0:a.type);return(!a||s.downloaded>=("size"in a?a.size:0))&&s.url?Promise.resolve(s.url):this.downloadMedia(e).then((e=>{if(!s.downloaded||s.downloaded=10485760,n=this.getLimitPart(a,!0),i=this.getDelta(n),r=Math.ceil(a/n),o=(0,Te.a)(),p={_:s?"inputFileBig":"inputFile",id:o,parts:r,name:t,md5_checksum:""},d=(0,v.Z)();if(r>this.maxUploadParts)return d.reject((0,X.Z)("FILE_TOO_BIG")),d;let f=!1,c=!1,l=e=>{"UPLOAD_CANCELED"!==(null==e?void 0:e.type)&&this.log.error("Up Error",e),d.reject(e),f=!0,l=jt.Z};const m=s?"upload.saveBigFilePart":"upload.saveFilePart",g=this.tempId++,h=this,u=function*(){let u=0,y=0;for(let v=0;vLa(this,void 0,void 0,(function*(){_();const i=e.slice(v,v+n),g=yield Fa(i);return _(),h.debug&&h.log("Upload file part, isBig:",s,P,g.byteLength,new Uint8Array(g).length,new Uint8Array(g).slice().length),h.apiManager.invokeApi(m,{file_id:o,file_part:P,file_total_parts:r,bytes:g},{fileUpload:!0}).then((()=>{if(f)return;++y;const e={done:y*n,offset:v,total:a,fileName:t};d.notify(e),y>=r&&(d.resolve(p),c=!0)}),l)}))),i).catch(l)}}(),y=()=>{if(f)return;const e=u.next();e.done||f||e.value.then(y)};for(let e=0,t=Math.min(1/0,r);e{if(f)throw(0,X.Z)("UPLOAD_CANCELED")};return d.cancel=()=>{f||c||(f=!0,l((0,X.Z)("UPLOAD_CANCELED")))},d.notify=e=>{this.rootScope.dispatchEvent("download_progress",e)},d.finally((()=>{this.uploadPromises[t]===d&&delete this.uploadPromises[t]})),this.uploadPromises[t]=d}}var qa=a(7487),Ga=a(6666),Ha=a(3306);class Wa extends G{constructor(){super(),this.hashes={},this.apiPromisesSingleProcess={},this.apiPromisesSingle={},this.apiPromisesCacheable={},this.afterMessageIdTemp=0}setUser(e){return this.setUserAuth(e.id)}invokeApiAfter(e,t={},a={}){let s=a;return s.prepareTempMessageId=""+ ++this.afterMessageIdTemp,s=Object.assign({},a),a.messageId=s.prepareTempMessageId,this.invokeApi(e,t,s)}invokeApiHashable(e){var t,a;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{params:s,options:n,method:i,overwrite:r}=e,o=JSON.stringify(s);let p;return this.hashes[i]&&(p=this.hashes[i][o],p&&(r?(delete this.hashes[i][o],p=void 0):s.hash=p.hash)),this.invokeApiSingleProcess({method:i,processResult:t=>{if(t._.includes("NotModified"))return p.result;if(t.hash){const e=t.hash;this.hashes[i]||(this.hashes[i]={}),p=this.hashes[i][o]={hash:e,result:t}}if(e.processResult){const a=e.processResult(t);return p?p.result=a:a}return t},params:s,options:n})}invokeApiSingle(e,t={},a={}){const s=e+"-"+JSON.stringify(t),n=this.apiPromisesSingle;return n[s]?n[s]:n[s]=this.invokeApi(e,t,a).finally((()=>{delete n[s]}))}invokeApiSingleProcess(e){var t,a,s;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{method:n,processResult:i,processError:r,params:o,options:p}=e,d=this.apiPromisesSingleProcess,f=p.cacheKey||JSON.stringify(o),c=null!==(s=d[n])&&void 0!==s?s:d[n]=new Map,l=c.get(f);if(l)return l;const m=()=>{const e=c.get(f);return e===h?void 0:e},g=this.invokeApi(n,o,p).then((e=>m()||i(e)),(e=>{const t=m();if(t)return t;if(!r)throw e;return r(e)})),h=g.finally((()=>{c.get(f)===h&&(c.delete(f),c.size||delete d[n])}));return c.set(f,h),h}invokeApiCacheable(e,t={},a={}){var s;const n=null!==(s=this.apiPromisesCacheable[e])&&void 0!==s?s:this.apiPromisesCacheable[e]={},i=JSON.stringify(t),r=n[i];if(r&&(!a.override||!r.fulfilled))return r.promise;let o;a.override&&(r&&r.timeout&&(clearTimeout(r.timeout),delete r.timeout),delete a.override),a.cacheSeconds&&(o=E.Z.setTimeout((()=>{delete n[i]}),1e3*a.cacheSeconds),delete a.cacheSeconds);const p=this.invokeApi(e,t,a);return n[i]={timestamp:Date.now(),fulfilled:!1,timeout:o,promise:p,params:t},p}clearCache(e,t){const a=this.apiPromisesCacheable[e];if(a)for(const e in a){const s=a[e];try{t(s.params)&&(s.timeout&&clearTimeout(s.timeout),delete a[e])}catch(e){}}}getConfig(e){return this.config&&!e?this.config:this.invokeApiSingleProcess({method:"help.getConfig",params:{},processResult:e=>(this.config=e,this.rootScope.dispatchEvent("config",e),e),options:{overwrite:e}})}getAppConfig(e){return this.appConfig&&!e?this.appConfig:this.invokeApiSingleProcess({method:"help.getAppConfig",params:{},processResult:e=>{var t;return this.appConfig=e,(0,ia.Ki)(null!==(t=e.ignore_restriction_reasons)&&void 0!==t?t:[]),this.rootScope.dispatchEvent("app_config",e),e},options:{overwrite:e}})}getLimit(e,t){return(0,q.Z)(this.getAppConfig(),(a=>{null!=t||(t=this.rootScope.premium);const s={pin:["dialogs_pinned_limit_default","dialogs_pinned_limit_premium"],folderPin:["dialogs_folder_pinned_limit_default","dialogs_folder_pinned_limit_premium"],folders:["dialog_filters_limit_default","dialog_filters_limit_premium"],favedStickers:["stickers_faved_limit_default","stickers_faved_limit_premium"],reactions:["reactions_user_max_default","reactions_user_max_premium"],bio:["about_length_limit_default","about_length_limit_premium"],topicPin:"topics_pinned_limit",caption:["caption_length_limit_default","caption_length_limit_premium"]}[e];return a[Array.isArray(s)?s[t?1:0]:s]}))}}var za=a(8453),Ka=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class Ja extends Wa{constructor(){super(),this.log=(0,I.kg)("API"),this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.afterMessageTempIds={},this.transportType=b.Z.transport,Z.addEventListener("transport",(e=>{this.changeTransportType(e)})),setInterval((()=>{this.getAppConfig(!0)}),997e4)}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateConfig:()=>{this.getConfig(!0),this.getAppConfig(!0)}}),this.rootScope.addEventListener("user_auth",(()=>{this.config&&this.apiUpdatesManager.processLocalUpdate({_:"updateConfig"})})),this.rootScope.addEventListener("premium_toggle",(e=>{this.iterateNetworkers((({networker:t,connectionType:a,dcId:s,transportType:n})=>{if("client"===a||"websocket"!==n)return;const i=t.transport;if(i){if(i.connection){const t=V(s,a,e);i.changeUrl(t)}}else this.log.error("wow what, no transport?",t)}))}))}getTransportType(e){return this.transportType}iterateNetworkers(e){for(const t in this.cachedNetworkers){const a=this.cachedNetworkers[t];for(const s in a){const n=a[s];for(const a in n)n[a].forEach(((n,i,r)=>{e({networker:n,dcId:+a,connectionType:s,transportType:t,index:i,array:r})}))}}}chooseServer(e,t,a){return this.dcConfigurator.chooseServer(e,t,a,"client"===t,this.rootScope.premium)}changeTransportType(e){const t=this.transportType;if(t===e)return;this.log("changing transport from",t,"to",e);const a=this.cachedNetworkers[t],s=this.cachedNetworkers[e];this.cachedNetworkers[e]=a,this.cachedNetworkers[t]=s,this.transportType=e;for(const a in this.gettingNetworkers){const s=this.gettingNetworkers[a];delete this.gettingNetworkers[a];const n=a.replace(t,e);this.gettingNetworkers[n]=s,this.log("changed networker getKey from",a,"to",n)}this.iterateNetworkers((e=>{const t=this.getTransportType(e.connectionType),a=this.chooseServer(e.dcId,e.connectionType,t);this.changeNetworkerTransport(e.networker,a)}))}getBaseDcId(){return Ka(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield qa.Z.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(_.Z.baseDcId)),this.baseDcId}))}setUserAuth(e){return Ka(this,void 0,void 0,(function*(){if("string"!=typeof e&&"number"!=typeof e||(e={dcID:0,date:Date.now()/1e3|0,id:e.toPeerId(!1)}),this.rootScope.dispatchEvent("user_auth",e),!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}qa.Z.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then((e=>{this.setOnDrainIfNeeded(e)})),this.baseDcId=e,qa.Z.set({dc:this.baseDcId})}logOut(){return Ka(this,void 0,void 0,(function*(){if(this.loggingOut)return;this.loggingOut=!0;const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map((e=>qa.Z.get(e)))),a=[];for(let e=0;eKa(this,void 0,void 0,(function*(){this.baseDcId=void 0,yield(0,za.Z)(!1,!0),Ga.C.closeDatabases(),this.rootScope.dispatchEvent("logging_out")}));return setTimeout(s,1e3),Promise.all(a).catch((e=>{e.handled=!0})).finally(s)}))}generateNetworkerGetKey(e,t,a){return[e,t,a].join("-")}getNetworker(e,t={}){const a=t.fileDownload?"download":t.fileUpload?"upload":"client",n=this.getTransportType(a);this.cachedNetworkers[n]||(this.cachedNetworkers[n]={client:{},download:{},upload:{}});const i=this.cachedNetworkers[n][a];e in i||(i[e]=[]);const r=i[e],o="client"===a||"https"===n?1:this.rootScope.premium?6:3;if(r.length>=o){let e=o-1,t=!1;for(;e>=0;--e)if(r[e].isOnline){t=!0;break}const a=r.splice(t?e:o-1,1)[0];return r.unshift(a),Promise.resolve(a)}let p=this.generateNetworkerGetKey(e,n,a);if(this.gettingNetworkers[p])return this.gettingNetworkers[p];const d=`dc${e}_auth_key`,f=`dc${e}_server_salt`;let c=this.chooseServer(e,a,n);return this.gettingNetworkers[p]=Promise.all([d,f].map((e=>qa.Z.get(e)))).then((([i,o])=>Ka(this,void 0,void 0,(function*(){let l,m;if(i&&512===i.length){o&&16===o.length||(o="AAAAAAAAAAAAAAAA");const a=(0,Ha.Z)(i),n=(yield s.Z.invokeCrypto("sha1",a)).slice(-8),r=(0,Ha.Z)(o);l=this.networkerFactory.getNetworker(e,a,n,r,t)}else try{const a=yield this.authorizer.auth(e);qa.Z.set({[d]:T(a.authKey),[f]:T(a.serverSalt)}),l=this.networkerFactory.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){m=e}const g=this.getTransportType(a);if(g!==n&&(p=this.generateNetworkerGetKey(e,g,a),c.destroy(),O.removeTransport(this.dcConfigurator.chosenServers,c),l&&(c=this.chooseServer(e,a,g)),this.log("transport has been changed during authorization from",n,"to",g)),delete this.gettingNetworkers[p],m)throw this.log("get networker error",m,m.stack),m;return this.changeNetworkerTransport(l,c),r.unshift(l),this.setOnDrainIfNeeded(l),l}))))}getNetworkerVoid(e){return this.getNetworker(e).then(jt.Z,jt.Z)}changeNetworkerTransport(e,t){const a=e.transport;a&&O.removeTransport(this.dcConfigurator.chosenServers,a),e.changeTransport(t)}onNetworkerDrain(e){this.log("networker drain",e.dcId),e.onDrain=void 0,this.changeNetworkerTransport(e),e.destroy(),this.networkerFactory.removeNetworker(e),O.removeTransport(this.cachedNetworkers,e)}setOnDrainIfNeeded(e){e.onDrain||(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then((t=>e.dcId!==t))).then((t=>{e.onDrain||t&&(e.onDrain=()=>this.onNetworkerDrain(e),e.setDrainTimeout())}))}setUpdatesProcessor(e){this.updatesProcessor=e,this.networkerFactory.setUpdatesProcessor(e)}invokeApi(e,t={},a={}){const s=(0,v.Z)();let n,i,{afterMessageId:r,prepareTempMessageId:o}=a;if(o&&s.then((()=>{delete this.afterMessageTempIds[o]})),d.GO){const n=Date.now(),r=E.Z.setInterval((()=>{i&&i.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-n)/1e3)}),5e3);s.catch(jt.Z).finally((()=>{clearInterval(r)}))}const p=(new Error).stack||"empty stack",f=()=>{if(r){const e=this.afterMessageTempIds[r];e&&(a.afterMessageId=e.messageId)}const p=i.wrapApiCall(e,t,a);return o&&(this.afterMessageTempIds[o]={messageId:a.messageId,promise:s}),p.catch((s=>{var i;if("FILE_REFERENCE_EXPIRED"!==s.type&&this.log.error("Error",s.code,s.type,this.baseDcId,n,e,t),401===s.code&&this.baseDcId===n)throw"SESSION_PASSWORD_NEEDED"!==s.type&&(qa.Z.delete("dc"),qa.Z.delete("user_auth")),s;if(401===s.code&&this.baseDcId&&n!==this.baseDcId){if(void 0===this.cachedExportPromise[n]){const e=new Promise(((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:n},{noErrorBox:!0}).then((a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:n,noErrorBox:!0}).then(e,t)}),t)}));this.cachedExportPromise[n]=e}return this.cachedExportPromise[n].then((()=>f()))}if(303!==s.code){if(400===s.code&&0===s.type.indexOf("FILE_MIGRATE")){const i=+s.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];if(i!==n)return a.dcId=i,this.invokeApi(e,t,a);throw s}if(400===s.code&&"CONNECTION_NOT_INITED"===s.type)return this.networkerFactory.unsetConnectionInited(),f();if(a.rawError||420!==s.code){if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(s.type)){const e=this.afterMessageTempIds[r];return r=void 0,delete a.afterMessageId,e?e.promise.then((()=>f())):f()}if(a.rawError||500!==s.code){if("UNKNOWN"===s.type||"MTPROTO_CLUSTER_INVALID"===s.type)return(0,P.Z)(1e3).then((()=>f()));throw s}{const e=Date.now();if(a.stopTime&&e>=a.stopTime)throw s;return a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,(0,P.Z)(1e3*a.waitTime).then((()=>f()))}}{const e=+s.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(null!==(i=a.floodMaxTimeout)&&void 0!==i?i:60)&&!a.prepareTempMessageId)throw s;return(0,P.Z)(1e3*e).then((()=>f()))}}{const i=+s.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];if(i!==n)return a.dcId?a.dcId=i:this.setBaseDcId(i),this.invokeApi(e,t,a)}}))};let c;return c=(n=a.dcId||this.baseDcId)?this.getNetworker(n,a):this.getBaseDcId().then((e=>this.getNetworker(n=e,a))),c.then((e=>{i=e;const t=f();return i.attachPromise(s,a),t})).then(s.resolve).catch((t=>Ka(this,void 0,void 0,(function*(){if(t?(0,fe.Z)(t)||(t={message:t}):t={type:"ERROR_EMPTY"},(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors)throw t;throw 406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=p||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout((()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)}),100)),t})))).catch(s.reject),s}}class $a{constructor(){this.neededPeers=new Map,this.singlePeerMap=new Map,this._constructor(!1)}after(){this.rootScope.addEventListener("user_auth",(()=>{this.requestPeer(this.appPeersManager.peerId,"self")}))}requestPeer(e,t){let a=this.neededPeers.get(e);a&&a.has(t)||(a||(a=new Set,this.neededPeers.set(e,a)),a.add(t),this.dispatchEvent("peerNeeded",e))}releasePeer(e,t){const a=this.neededPeers.get(e);a&&(a.delete(t),a.size||(this.neededPeers.delete(e),this.dispatchEvent("peerUnneeded",e)))}requestPeersForKey(e,t){Array.isArray(e)&&(e=new Set(e));let a=this.singlePeerMap.get(t);if(a){for(const s of a)e.has(s)||(this.releasePeer(s,t),a.delete(s));if(!a.size&&!e.size)return void this.singlePeerMap.delete(t)}if(e.size){a||(a=new Set,this.singlePeerMap.set(t,a));for(const s of e)a.has(s)||(this.requestPeer(s,t),a.add(s))}}isPeerNeeded(e){return this.neededPeers.has(e)}}Ae($a,[p.Z,G]);const Qa=$a,Ya=o.Pt;class Xa{constructor(){this.thumbsCache={}}getKey(e){var t;return e._+(null!==(t=e.id)&&void 0!==t?t:e.url)}getCacheContext(e,t=Ya){var a,s,n,i;const r=null!==(a=(n=this.thumbsCache)[i=this.getKey(e)])&&void 0!==a?a:n[i]={};return null!==(s=r[t])&&void 0!==s?s:r[t]={downloaded:0,url:"",type:t}}setCacheContextURL(e,t=Ya,a,s=0){const n=this.getCacheContext(e,t);return n.url=a,n.downloaded=s,n}deleteCacheContext(e,t=Ya){const a=this.thumbsCache[this.getKey(e)];a&&delete a[t]}}const es={MTProto:{constructors:[{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:85337187,predicate:"resPQ",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"pq",type:"bytes"},{name:"server_public_key_fingerprints",type:"Vector"}],type:"ResPQ"},{id:-1443537003,predicate:"p_q_inner_data_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"}],type:"P_Q_inner_data"},{id:1459478408,predicate:"p_q_inner_data_temp_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"},{name:"expires_in",type:"int"}],type:"P_Q_inner_data"},{id:-790100132,predicate:"server_DH_params_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_answer",type:"bytes"}],type:"Server_DH_Params"},{id:-1249309254,predicate:"server_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"g",type:"int"},{name:"dh_prime",type:"bytes"},{name:"g_a",type:"bytes"},{name:"server_time",type:"int"}],type:"Server_DH_inner_data"},{id:1715713620,predicate:"client_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"retry_id",type:"long"},{name:"g_b",type:"bytes"}],type:"Client_DH_Inner_Data"},{id:1003222836,predicate:"dh_gen_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash1",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1188831161,predicate:"dh_gen_retry",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash2",type:"int128"}],type:"Set_client_DH_params_answer"},{id:-1499615742,predicate:"dh_gen_fail",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash3",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1973679973,predicate:"bind_auth_key_inner",params:[{name:"nonce",type:"long"},{name:"temp_auth_key_id",type:"long"},{name:"perm_auth_key_id",type:"long"},{name:"temp_session_id",type:"long"},{name:"expires_at",type:"int"}],type:"BindAuthKeyInner"},{id:-212046591,predicate:"rpc_result",params:[{name:"req_msg_id",type:"long"},{name:"result",type:"Object"}],type:"RpcResult"},{id:558156313,predicate:"rpc_error",params:[{name:"error_code",type:"int"},{name:"error_message",type:"string"}],type:"RpcError"},{id:1579864942,predicate:"rpc_answer_unknown",params:[],type:"RpcDropAnswer"},{id:-847714938,predicate:"rpc_answer_dropped_running",params:[],type:"RpcDropAnswer"},{id:-1539647305,predicate:"rpc_answer_dropped",params:[{name:"msg_id",type:"long"},{name:"seq_no",type:"int"},{name:"bytes",type:"int"}],type:"RpcDropAnswer"},{id:155834844,predicate:"future_salt",params:[{name:"valid_since",type:"int"},{name:"valid_until",type:"int"},{name:"salt",type:"long"}],type:"FutureSalt"},{id:-1370486635,predicate:"future_salts",params:[{name:"req_msg_id",type:"long"},{name:"now",type:"int"},{name:"salts",type:"vector"}],type:"FutureSalts"},{id:880243653,predicate:"pong",params:[{name:"msg_id",type:"long"},{name:"ping_id",type:"long"}],type:"Pong"},{id:-501201412,predicate:"destroy_session_ok",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:1658015945,predicate:"destroy_session_none",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1631450872,predicate:"new_session_created",params:[{name:"first_msg_id",type:"long"},{name:"unique_id",type:"long"},{name:"server_salt",type:"long"}],type:"NewSession"},{id:1945237724,predicate:"msg_container",params:[{name:"messages",type:"vector<%Message>"}],type:"MessageContainer"},{id:1538843921,predicate:"message",params:[{name:"msg_id",type:"long"},{name:"seqno",type:"int"},{name:"bytes",type:"int"},{name:"body",type:"Object"}],type:"Message"},{id:-530561358,predicate:"msg_copy",params:[{name:"orig_message",type:"Message"}],type:"MessageCopy"},{id:812830625,predicate:"gzip_packed",params:[{name:"packed_data",type:"bytes"}],type:"Object"},{id:1658238041,predicate:"msgs_ack",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsAck"},{id:-1477445615,predicate:"bad_msg_notification",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"}],type:"BadMsgNotification"},{id:-307542917,predicate:"bad_server_salt",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"},{name:"new_server_salt",type:"long"}],type:"BadMsgNotification"},{id:2105940488,predicate:"msg_resend_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgResendReq"},{id:-630588590,predicate:"msgs_state_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsStateReq"},{id:81704317,predicate:"msgs_state_info",params:[{name:"req_msg_id",type:"long"},{name:"info",type:"bytes"}],type:"MsgsStateInfo"},{id:-1933520591,predicate:"msgs_all_info",params:[{name:"msg_ids",type:"Vector"},{name:"info",type:"bytes"}],type:"MsgsAllInfo"},{id:661470918,predicate:"msg_detailed_info",params:[{name:"msg_id",type:"long"},{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-2137147681,predicate:"msg_new_detailed_info",params:[{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-161422892,predicate:"destroy_auth_key_ok",params:[],type:"DestroyAuthKeyRes"},{id:178201177,predicate:"destroy_auth_key_none",params:[],type:"DestroyAuthKeyRes"},{id:-368010477,predicate:"destroy_auth_key_fail",params:[],type:"DestroyAuthKeyRes"}],methods:[{id:-1099002127,method:"req_pq_multi",params:[{name:"nonce",type:"int128"}],type:"ResPQ"},{id:-686627650,method:"req_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"public_key_fingerprint",type:"long"},{name:"encrypted_data",type:"bytes"}],type:"Server_DH_Params"},{id:-184262881,method:"set_client_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_data",type:"bytes"}],type:"Set_client_DH_params_answer"},{id:1491380032,method:"rpc_drop_answer",params:[{name:"req_msg_id",type:"long"}],type:"RpcDropAnswer"},{id:-1188971260,method:"get_future_salts",params:[{name:"num",type:"int"}],type:"FutureSalts"},{id:2059302892,method:"ping",params:[{name:"ping_id",type:"long"}],type:"Pong"},{id:-213746804,method:"ping_delay_disconnect",params:[{name:"ping_id",type:"long"},{name:"disconnect_delay",type:"int"}],type:"Pong"},{id:-414113498,method:"destroy_session",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1835453025,method:"http_wait",params:[{name:"max_delay",type:"int"},{name:"wait_after",type:"int"},{name:"max_wait",type:"int"}],type:"HttpWait"},{id:-784117408,method:"destroy_auth_key",params:[],type:"DestroyAuthKeyRes"}]},API:{constructors:[{id:-1132882121,predicate:"boolFalse",params:[],type:"Bool"},{id:-1720552011,predicate:"boolTrue",params:[],type:"Bool"},{id:1072550713,predicate:"true",params:[],type:"True"},{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:-994444869,predicate:"error",params:[{name:"code",type:"int"},{name:"text",type:"string"}],type:"Error"},{id:1450380236,predicate:"null",params:[],type:"Null"},{id:2134579434,predicate:"inputPeerEmpty",params:[],type:"InputPeer"},{id:2107670217,predicate:"inputPeerSelf",params:[],type:"InputPeer"},{id:900291769,predicate:"inputPeerChat",params:[{name:"chat_id",type:"long"}],type:"InputPeer"},{id:-1182234929,predicate:"inputUserEmpty",params:[],type:"InputUser"},{id:-138301121,predicate:"inputUserSelf",params:[],type:"InputUser"},{id:-208488460,predicate:"inputPhoneContact",params:[{name:"client_id",type:"long"},{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"InputContact"},{id:-181407105,predicate:"inputFile",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"},{name:"md5_checksum",type:"string"}],type:"InputFile"},{id:-1771768449,predicate:"inputMediaEmpty",params:[],type:"InputMedia"},{id:505969924,predicate:"inputMediaUploadedPhoto",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.2?true"},{name:"file",type:"InputFile"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:-1279654347,predicate:"inputMediaPhoto",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.1?true"},{name:"id",type:"InputPhoto"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-104578748,predicate:"inputMediaGeoPoint",params:[{name:"geo_point",type:"InputGeoPoint"}],type:"InputMedia"},{id:-122978821,predicate:"inputMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"}],type:"InputMedia"},{id:480546647,predicate:"inputChatPhotoEmpty",params:[],type:"InputChatPhoto"},{id:-968723890,predicate:"inputChatUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"InputChatPhoto"},{id:-1991004873,predicate:"inputChatPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputChatPhoto"},{id:-457104426,predicate:"inputGeoPointEmpty",params:[],type:"InputGeoPoint"},{id:1210199983,predicate:"inputGeoPoint",params:[{name:"flags",type:"#"},{name:"lat",type:"double"},{name:"long",type:"double"},{name:"accuracy_radius",type:"flags.0?int"}],type:"InputGeoPoint"},{id:483901197,predicate:"inputPhotoEmpty",params:[],type:"InputPhoto"},{id:1001634122,predicate:"inputPhoto",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputPhoto"},{id:-539317279,predicate:"inputFileLocation",params:[{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputFileLocation"},{id:1498486562,predicate:"peerUser",params:[{name:"user_id",type:"long"}],type:"Peer"},{id:918946202,predicate:"peerChat",params:[{name:"chat_id",type:"long"}],type:"Peer"},{id:-1432995067,predicate:"storage.fileUnknown",params:[],type:"storage.FileType"},{id:1086091090,predicate:"storage.filePartial",params:[],type:"storage.FileType"},{id:8322574,predicate:"storage.fileJpeg",params:[],type:"storage.FileType"},{id:-891180321,predicate:"storage.fileGif",params:[],type:"storage.FileType"},{id:172975040,predicate:"storage.filePng",params:[],type:"storage.FileType"},{id:-1373745011,predicate:"storage.filePdf",params:[],type:"storage.FileType"},{id:1384777335,predicate:"storage.fileMp3",params:[],type:"storage.FileType"},{id:1258941372,predicate:"storage.fileMov",params:[],type:"storage.FileType"},{id:-1278304028,predicate:"storage.fileMp4",params:[],type:"storage.FileType"},{id:276907596,predicate:"storage.fileWebp",params:[],type:"storage.FileType"},{id:-742634630,predicate:"userEmpty",params:[{name:"id",type:"long"}],type:"User"},{id:1326562017,predicate:"userProfilePhotoEmpty",params:[],type:"UserProfilePhoto"},{id:-2100168954,predicate:"userProfilePhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"personal",type:"flags.2?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"UserProfilePhoto"},{id:164646985,predicate:"userStatusEmpty",params:[],type:"UserStatus"},{id:-306628279,predicate:"userStatusOnline",params:[{name:"expires",type:"int"}],type:"UserStatus"},{id:9203775,predicate:"userStatusOffline",params:[{name:"was_online",type:"int"}],type:"UserStatus"},{id:693512293,predicate:"chatEmpty",params:[{name:"id",type:"long"}],type:"Chat"},{id:1103884886,predicate:"chat",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"deactivated",type:"flags.5?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"noforwards",type:"flags.25?true"},{name:"id",type:"long"},{name:"title",type:"string"},{name:"photo",type:"ChatPhoto"},{name:"participants_count",type:"int"},{name:"date",type:"int"},{name:"version",type:"int"},{name:"migrated_to",type:"flags.6?InputChannel"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"}],type:"Chat"},{id:1704108455,predicate:"chatForbidden",params:[{name:"id",type:"long"},{name:"title",type:"string"}],type:"Chat"},{id:-908914376,predicate:"chatFull",params:[{name:"flags",type:"#"},{name:"can_set_username",type:"flags.7?true"},{name:"has_scheduled",type:"flags.8?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants",type:"ChatParticipants"},{name:"chat_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.13?ExportedChatInvite"},{name:"bot_info",type:"flags.3?Vector"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"folder_id",type:"flags.11?int"},{name:"call",type:"flags.12?InputGroupCall"},{name:"ttl_period",type:"flags.14?int"},{name:"groupcall_default_join_as",type:"flags.15?Peer"},{name:"theme_emoticon",type:"flags.16?string"},{name:"requests_pending",type:"flags.17?int"},{name:"recent_requesters",type:"flags.17?Vector"},{name:"available_reactions",type:"flags.18?ChatReactions"}],type:"ChatFull"},{id:-1070776313,predicate:"chatParticipant",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-2023500831,predicate:"chatParticipantsForbidden",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"self_participant",type:"flags.0?ChatParticipant"}],type:"ChatParticipants"},{id:1018991608,predicate:"chatParticipants",params:[{name:"chat_id",type:"long"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"ChatParticipants"},{id:935395612,predicate:"chatPhotoEmpty",params:[],type:"ChatPhoto"},{id:476978193,predicate:"chatPhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"ChatPhoto"},{id:-1868117372,predicate:"messageEmpty",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"peer_id",type:"flags.0?Peer"}],type:"Message"},{id:940666592,predicate:"message",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"from_scheduled",type:"flags.18?true"},{name:"legacy",type:"flags.19?true"},{name:"edit_hide",type:"flags.21?true"},{name:"pinned",type:"flags.24?true"},{name:"noforwards",type:"flags.26?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"message",type:"string"},{name:"media",type:"flags.9?MessageMedia"},{name:"reply_markup",type:"flags.6?ReplyMarkup"},{name:"entities",type:"flags.7?Vector"},{name:"views",type:"flags.10?int"},{name:"forwards",type:"flags.10?int"},{name:"replies",type:"flags.23?MessageReplies"},{name:"edit_date",type:"flags.15?int"},{name:"post_author",type:"flags.16?string"},{name:"grouped_id",type:"flags.17?long"},{name:"reactions",type:"flags.20?MessageReactions"},{name:"restriction_reason",type:"flags.22?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:721967202,predicate:"messageService",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"legacy",type:"flags.19?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"action",type:"MessageAction"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:1038967584,predicate:"messageMediaEmpty",params:[],type:"MessageMedia"},{id:1766936791,predicate:"messageMediaPhoto",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.3?true"},{name:"photo",type:"flags.0?Photo"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1457575028,predicate:"messageMediaGeo",params:[{name:"geo",type:"GeoPoint"}],type:"MessageMedia"},{id:1882335561,predicate:"messageMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"user_id",type:"long"}],type:"MessageMedia"},{id:-1618676578,predicate:"messageMediaUnsupported",params:[],type:"MessageMedia"},{id:-1230047312,predicate:"messageActionEmpty",params:[],type:"MessageAction"},{id:-1119368275,predicate:"messageActionChatCreate",params:[{name:"title",type:"string"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1247687078,predicate:"messageActionChatEditTitle",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:2144015272,predicate:"messageActionChatEditPhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-1780220945,predicate:"messageActionChatDeletePhoto",params:[],type:"MessageAction"},{id:365886720,predicate:"messageActionChatAddUser",params:[{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1539362612,predicate:"messageActionChatDeleteUser",params:[{name:"user_id",type:"long"}],type:"MessageAction"},{id:-712374074,predicate:"dialog",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"unread_mark",type:"flags.3?true"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"unread_mentions_count",type:"int"},{name:"unread_reactions_count",type:"int"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"pts",type:"flags.0?int"},{name:"draft",type:"flags.1?DraftMessage"},{name:"folder_id",type:"flags.4?int"},{name:"ttl_period",type:"flags.5?int"}],type:"Dialog"},{id:590459437,predicate:"photoEmpty",params:[{name:"id",type:"long"}],type:"Photo"},{id:-82216347,predicate:"photo",params:[{name:"flags",type:"#"},{name:"has_stickers",type:"flags.0?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"sizes",type:"Vector"},{name:"video_sizes",type:"flags.1?Vector"},{name:"dc_id",type:"int"}],type:"Photo"},{id:236446268,predicate:"photoSizeEmpty",params:[{name:"type",type:"string"}],type:"PhotoSize"},{id:1976012384,predicate:"photoSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"}],type:"PhotoSize"},{id:35527382,predicate:"photoCachedSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:286776671,predicate:"geoPointEmpty",params:[],type:"GeoPoint"},{id:-1297942941,predicate:"geoPoint",params:[{name:"flags",type:"#"},{name:"long",type:"double"},{name:"lat",type:"double"},{name:"access_hash",type:"long"},{name:"accuracy_radius",type:"flags.0?int"}],type:"GeoPoint"},{id:1577067778,predicate:"auth.sentCode",params:[{name:"flags",type:"#"},{name:"type",type:"auth.SentCodeType"},{name:"phone_code_hash",type:"string"},{name:"next_type",type:"flags.1?auth.CodeType"},{name:"timeout",type:"flags.2?int"}],type:"auth.SentCode"},{id:872119224,predicate:"auth.authorization",params:[{name:"flags",type:"#"},{name:"setup_password_required",type:"flags.1?true"},{name:"otherwise_relogin_days",type:"flags.1?int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"user",type:"User"}],type:"auth.Authorization"},{id:-1271602504,predicate:"auth.exportedAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.ExportedAuthorization"},{id:-1195615476,predicate:"inputNotifyPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputNotifyPeer"},{id:423314455,predicate:"inputNotifyUsers",params:[],type:"InputNotifyPeer"},{id:1251338318,predicate:"inputNotifyChats",params:[],type:"InputNotifyPeer"},{id:-551616469,predicate:"inputPeerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?NotificationSound"}],type:"InputPeerNotifySettings"},{id:-1472527322,predicate:"peerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"ios_sound",type:"flags.3?NotificationSound"},{name:"android_sound",type:"flags.4?NotificationSound"},{name:"other_sound",type:"flags.5?NotificationSound"}],type:"PeerNotifySettings"},{id:-1525149427,predicate:"peerSettings",params:[{name:"flags",type:"#"},{name:"report_spam",type:"flags.0?true"},{name:"add_contact",type:"flags.1?true"},{name:"block_contact",type:"flags.2?true"},{name:"share_contact",type:"flags.3?true"},{name:"need_contacts_exception",type:"flags.4?true"},{name:"report_geo",type:"flags.5?true"},{name:"autoarchived",type:"flags.7?true"},{name:"invite_members",type:"flags.8?true"},{name:"request_chat_broadcast",type:"flags.10?true"},{name:"geo_distance",type:"flags.6?int"},{name:"request_chat_title",type:"flags.9?string"},{name:"request_chat_date",type:"flags.9?int"}],type:"PeerSettings"},{id:-1539849235,predicate:"wallPaper",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"pattern",type:"flags.3?true"},{name:"dark",type:"flags.4?true"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"document",type:"Document"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:1490799288,predicate:"inputReportReasonSpam",params:[],type:"ReportReason"},{id:505595789,predicate:"inputReportReasonViolence",params:[],type:"ReportReason"},{id:777640226,predicate:"inputReportReasonPornography",params:[],type:"ReportReason"},{id:-1376497949,predicate:"inputReportReasonChildAbuse",params:[],type:"ReportReason"},{id:-1041980751,predicate:"inputReportReasonOther",params:[],type:"ReportReason"},{id:-120378643,predicate:"userFull",params:[{name:"flags",type:"#"},{name:"blocked",type:"flags.0?true"},{name:"phone_calls_available",type:"flags.4?true"},{name:"phone_calls_private",type:"flags.5?true"},{name:"can_pin_message",type:"flags.7?true"},{name:"has_scheduled",type:"flags.12?true"},{name:"video_calls_available",type:"flags.13?true"},{name:"voice_messages_forbidden",type:"flags.20?true"},{name:"id",type:"long"},{name:"about",type:"flags.1?string"},{name:"settings",type:"PeerSettings"},{name:"personal_photo",type:"flags.21?Photo"},{name:"profile_photo",type:"flags.2?Photo"},{name:"fallback_photo",type:"flags.22?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"bot_info",type:"flags.3?BotInfo"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"common_chats_count",type:"int"},{name:"folder_id",type:"flags.11?int"},{name:"ttl_period",type:"flags.14?int"},{name:"theme_emoticon",type:"flags.15?string"},{name:"private_forward_name",type:"flags.16?string"},{name:"bot_group_admin_rights",type:"flags.17?ChatAdminRights"},{name:"bot_broadcast_admin_rights",type:"flags.18?ChatAdminRights"},{name:"premium_gifts",type:"flags.19?Vector"}],type:"UserFull"},{id:341499403,predicate:"contact",params:[{name:"user_id",type:"long"},{name:"mutual",type:"Bool"}],type:"Contact"},{id:-1052885936,predicate:"importedContact",params:[{name:"user_id",type:"long"},{name:"client_id",type:"long"}],type:"ImportedContact"},{id:383348795,predicate:"contactStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"ContactStatus"},{id:-1219778094,predicate:"contacts.contactsNotModified",params:[],type:"contacts.Contacts"},{id:-353862078,predicate:"contacts.contacts",params:[{name:"contacts",type:"Vector"},{name:"saved_count",type:"int"},{name:"users",type:"Vector"}],type:"contacts.Contacts"},{id:2010127419,predicate:"contacts.importedContacts",params:[{name:"imported",type:"Vector"},{name:"popular_invites",type:"Vector"},{name:"retry_contacts",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ImportedContacts"},{id:182326673,predicate:"contacts.blocked",params:[{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:-513392236,predicate:"contacts.blockedSlice",params:[{name:"count",type:"int"},{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:364538944,predicate:"messages.dialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:1910543603,predicate:"messages.dialogsSlice",params:[{name:"count",type:"int"},{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:-1938715001,predicate:"messages.messages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:978610270,predicate:"messages.messagesSlice",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"count",type:"int"},{name:"next_rate",type:"flags.0?int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:1694474197,predicate:"messages.chats",params:[{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-438840932,predicate:"messages.chatFull",params:[{name:"full_chat",type:"ChatFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatFull"},{id:-1269012015,predicate:"messages.affectedHistory",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"}],type:"messages.AffectedHistory"},{id:1474492012,predicate:"inputMessagesFilterEmpty",params:[],type:"MessagesFilter"},{id:-1777752804,predicate:"inputMessagesFilterPhotos",params:[],type:"MessagesFilter"},{id:-1614803355,predicate:"inputMessagesFilterVideo",params:[],type:"MessagesFilter"},{id:1458172132,predicate:"inputMessagesFilterPhotoVideo",params:[],type:"MessagesFilter"},{id:-1629621880,predicate:"inputMessagesFilterDocument",params:[],type:"MessagesFilter"},{id:2129714567,predicate:"inputMessagesFilterUrl",params:[],type:"MessagesFilter"},{id:-3644025,predicate:"inputMessagesFilterGif",params:[],type:"MessagesFilter"},{id:522914557,predicate:"updateNewMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1318109142,predicate:"updateMessageID",params:[{name:"id",type:"int"},{name:"random_id",type:"long"}],type:"Update"},{id:-1576161051,predicate:"updateDeleteMessages",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1071741569,predicate:"updateUserTyping",params:[{name:"user_id",type:"long"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-2092401936,predicate:"updateChatUserTyping",params:[{name:"chat_id",type:"long"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:125178264,predicate:"updateChatParticipants",params:[{name:"participants",type:"ChatParticipants"}],type:"Update"},{id:-440534818,predicate:"updateUserStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"Update"},{id:-1484486364,predicate:"updateUserName",params:[{name:"user_id",type:"long"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"usernames",type:"Vector"}],type:"Update"},{id:-1519637954,predicate:"updates.state",params:[{name:"pts",type:"int"},{name:"qts",type:"int"},{name:"date",type:"int"},{name:"seq",type:"int"},{name:"unread_count",type:"int"}],type:"updates.State"},{id:1567990072,predicate:"updates.differenceEmpty",params:[{name:"date",type:"int"},{name:"seq",type:"int"}],type:"updates.Difference"},{id:16030880,predicate:"updates.difference",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"updates.Difference"},{id:-1459938943,predicate:"updates.differenceSlice",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"intermediate_state",type:"updates.State"}],type:"updates.Difference"},{id:-484987010,predicate:"updatesTooLong",params:[],type:"Updates"},{id:826001400,predicate:"updateShortMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"user_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:1299050149,predicate:"updateShortChatMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"from_id",type:"long"},{name:"chat_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:2027216577,predicate:"updateShort",params:[{name:"update",type:"Update"},{name:"date",type:"int"}],type:"Updates"},{id:1918567619,predicate:"updatesCombined",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq_start",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:1957577280,predicate:"updates",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:-1916114267,predicate:"photos.photos",params:[{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:352657236,predicate:"photos.photosSlice",params:[{name:"count",type:"int"},{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:539045032,predicate:"photos.photo",params:[{name:"photo",type:"Photo"},{name:"users",type:"Vector"}],type:"photos.Photo"},{id:157948117,predicate:"upload.file",params:[{name:"type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.File"},{id:414687501,predicate:"dcOption",params:[{name:"flags",type:"#"},{name:"ipv6",type:"flags.0?true"},{name:"media_only",type:"flags.1?true"},{name:"tcpo_only",type:"flags.2?true"},{name:"cdn",type:"flags.3?true"},{name:"static",type:"flags.4?true"},{name:"this_port_only",type:"flags.5?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:589653676,predicate:"config",params:[{name:"flags",type:"#"},{name:"phonecalls_enabled",type:"flags.1?true"},{name:"default_p2p_contacts",type:"flags.3?true"},{name:"preload_featured_stickers",type:"flags.4?true"},{name:"ignore_phone_entities",type:"flags.5?true"},{name:"revoke_pm_inbox",type:"flags.6?true"},{name:"blocked_mode",type:"flags.8?true"},{name:"pfs_enabled",type:"flags.13?true"},{name:"force_try_ipv6",type:"flags.14?true"},{name:"date",type:"int"},{name:"expires",type:"int"},{name:"test_mode",type:"Bool"},{name:"this_dc",type:"int"},{name:"dc_options",type:"Vector"},{name:"dc_txt_domain_name",type:"string"},{name:"chat_size_max",type:"int"},{name:"megagroup_size_max",type:"int"},{name:"forwarded_count_max",type:"int"},{name:"online_update_period_ms",type:"int"},{name:"offline_blur_timeout_ms",type:"int"},{name:"offline_idle_timeout_ms",type:"int"},{name:"online_cloud_timeout_ms",type:"int"},{name:"notify_cloud_delay_ms",type:"int"},{name:"notify_default_delay_ms",type:"int"},{name:"push_chat_period_ms",type:"int"},{name:"push_chat_limit",type:"int"},{name:"saved_gifs_limit",type:"int"},{name:"edit_time_limit",type:"int"},{name:"revoke_time_limit",type:"int"},{name:"revoke_pm_time_limit",type:"int"},{name:"rating_e_decay",type:"int"},{name:"stickers_recent_limit",type:"int"},{name:"stickers_faved_limit",type:"int"},{name:"channels_read_media_period",type:"int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"pinned_dialogs_count_max",type:"int"},{name:"pinned_infolder_count_max",type:"int"},{name:"call_receive_timeout_ms",type:"int"},{name:"call_ring_timeout_ms",type:"int"},{name:"call_connect_timeout_ms",type:"int"},{name:"call_packet_timeout_ms",type:"int"},{name:"me_url_prefix",type:"string"},{name:"autoupdate_url_prefix",type:"flags.7?string"},{name:"gif_search_username",type:"flags.9?string"},{name:"venue_search_username",type:"flags.10?string"},{name:"img_search_username",type:"flags.11?string"},{name:"static_maps_provider",type:"flags.12?string"},{name:"caption_length_max",type:"int"},{name:"message_length_max",type:"int"},{name:"webfile_dc_id",type:"int"},{name:"suggested_lang_code",type:"flags.2?string"},{name:"lang_pack_version",type:"flags.2?int"},{name:"base_lang_pack_version",type:"flags.2?int"},{name:"reactions_default",type:"flags.15?Reaction"}],type:"Config"},{id:-1910892683,predicate:"nearestDc",params:[{name:"country",type:"string"},{name:"this_dc",type:"int"},{name:"nearest_dc",type:"int"}],type:"NearestDc"},{id:-860107216,predicate:"help.appUpdate",params:[{name:"flags",type:"#"},{name:"can_not_skip",type:"flags.0?true"},{name:"id",type:"int"},{name:"version",type:"string"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"document",type:"flags.1?Document"},{name:"url",type:"flags.2?string"},{name:"sticker",type:"flags.3?Document"}],type:"help.AppUpdate"},{id:-1000708810,predicate:"help.noAppUpdate",params:[],type:"help.AppUpdate"},{id:415997816,predicate:"help.inviteText",params:[{name:"message",type:"string"}],type:"help.InviteText"},{id:314359194,predicate:"updateNewEncryptedMessage",params:[{name:"message",type:"EncryptedMessage"},{name:"qts",type:"int"}],type:"Update"},{id:386986326,predicate:"updateEncryptedChatTyping",params:[{name:"chat_id",type:"int"}],type:"Update"},{id:-1264392051,predicate:"updateEncryption",params:[{name:"chat",type:"EncryptedChat"},{name:"date",type:"int"}],type:"Update"},{id:956179895,predicate:"updateEncryptedMessagesRead",params:[{name:"chat_id",type:"int"},{name:"max_date",type:"int"},{name:"date",type:"int"}],type:"Update"},{id:-1417756512,predicate:"encryptedChatEmpty",params:[{name:"id",type:"int"}],type:"EncryptedChat"},{id:1722964307,predicate:"encryptedChatWaiting",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"}],type:"EncryptedChat"},{id:1223809356,predicate:"encryptedChatRequested",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1643173063,predicate:"encryptedChat",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:505183301,predicate:"encryptedChatDiscarded",params:[{name:"flags",type:"#"},{name:"history_deleted",type:"flags.0?true"},{name:"id",type:"int"}],type:"EncryptedChat"},{id:-247351839,predicate:"inputEncryptedChat",params:[{name:"chat_id",type:"int"},{name:"access_hash",type:"long"}],type:"InputEncryptedChat"},{id:-1038136962,predicate:"encryptedFileEmpty",params:[],type:"EncryptedFile"},{id:-1476358952,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"long"},{name:"dc_id",type:"int"},{name:"key_fingerprint",type:"int"}],type:"EncryptedFile"},{id:406307684,predicate:"inputEncryptedFileEmpty",params:[],type:"InputEncryptedFile"},{id:1690108678,predicate:"inputEncryptedFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1511503333,predicate:"inputEncryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputEncryptedFile"},{id:-182231723,predicate:"inputEncryptedFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:-317144808,predicate:"encryptedMessage",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"},{name:"file",type:"EncryptedFile"}],type:"EncryptedMessage"},{id:594758406,predicate:"encryptedMessageService",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"}],type:"EncryptedMessage"},{id:-1058912715,predicate:"messages.dhConfigNotModified",params:[{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:740433629,predicate:"messages.dhConfig",params:[{name:"g",type:"int"},{name:"p",type:"bytes"},{name:"version",type:"int"},{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:1443858741,predicate:"messages.sentEncryptedMessage",params:[{name:"date",type:"int"}],type:"messages.SentEncryptedMessage"},{id:-1802240206,predicate:"messages.sentEncryptedFile",params:[{name:"date",type:"int"},{name:"file",type:"EncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:-95482955,predicate:"inputFileBig",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"}],type:"InputFile"},{id:767652808,predicate:"inputEncryptedFileBigUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1037718609,predicate:"updateChatParticipantAdd",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"},{name:"version",type:"int"}],type:"Update"},{id:-483443337,predicate:"updateChatParticipantDelete",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"version",type:"int"}],type:"Update"},{id:-1906403213,predicate:"updateDcOptions",params:[{name:"dc_options",type:"Vector"}],type:"Update"},{id:1530447553,predicate:"inputMediaUploadedDocument",params:[{name:"flags",type:"#"},{name:"nosound_video",type:"flags.3?true"},{name:"force_file",type:"flags.4?true"},{name:"spoiler",type:"flags.5?true"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.2?InputFile"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:860303448,predicate:"inputMediaDocument",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.2?true"},{name:"id",type:"InputDocument"},{name:"ttl_seconds",type:"flags.0?int"},{name:"query",type:"flags.1?string"}],type:"InputMedia"},{id:-1666158377,predicate:"messageMediaDocument",params:[{name:"flags",type:"#"},{name:"nopremium",type:"flags.3?true"},{name:"spoiler",type:"flags.4?true"},{name:"document",type:"flags.0?Document"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1928391342,predicate:"inputDocumentEmpty",params:[],type:"InputDocument"},{id:448771445,predicate:"inputDocument",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputDocument"},{id:-1160743548,predicate:"inputDocumentFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:922273905,predicate:"documentEmpty",params:[{name:"id",type:"long"}],type:"Document"},{id:-1881881384,predicate:"document",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"mime_type",type:"string"},{name:"size",type:"long"},{name:"thumbs",type:"flags.0?Vector"},{name:"video_thumbs",type:"flags.1?Vector"},{name:"dc_id",type:"int"},{name:"attributes",type:"Vector"}],type:"Document"},{id:398898678,predicate:"help.support",params:[{name:"phone_number",type:"string"},{name:"user",type:"User"}],type:"help.Support"},{id:-1613493288,predicate:"notifyPeer",params:[{name:"peer",type:"Peer"}],type:"NotifyPeer"},{id:-1261946036,predicate:"notifyUsers",params:[],type:"NotifyPeer"},{id:-1073230141,predicate:"notifyChats",params:[],type:"NotifyPeer"},{id:-1094555409,predicate:"updateNotifySettings",params:[{name:"peer",type:"NotifyPeer"},{name:"notify_settings",type:"PeerNotifySettings"}],type:"Update"},{id:381645902,predicate:"sendMessageTypingAction",params:[],type:"SendMessageAction"},{id:-44119819,predicate:"sendMessageCancelAction",params:[],type:"SendMessageAction"},{id:-1584933265,predicate:"sendMessageRecordVideoAction",params:[],type:"SendMessageAction"},{id:-378127636,predicate:"sendMessageUploadVideoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-718310409,predicate:"sendMessageRecordAudioAction",params:[],type:"SendMessageAction"},{id:-212740181,predicate:"sendMessageUploadAudioAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-774682074,predicate:"sendMessageUploadPhotoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-1441998364,predicate:"sendMessageUploadDocumentAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:393186209,predicate:"sendMessageGeoLocationAction",params:[],type:"SendMessageAction"},{id:1653390447,predicate:"sendMessageChooseContactAction",params:[],type:"SendMessageAction"},{id:-1290580579,predicate:"contacts.found",params:[{name:"my_results",type:"Vector"},{name:"results",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Found"},{id:-337352679,predicate:"updateServiceNotification",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"inbox_date",type:"flags.1?int"},{name:"type",type:"string"},{name:"message",type:"string"},{name:"media",type:"MessageMedia"},{name:"entities",type:"Vector"}],type:"Update"},{id:-496024847,predicate:"userStatusRecently",params:[],type:"UserStatus"},{id:129960444,predicate:"userStatusLastWeek",params:[],type:"UserStatus"},{id:2011940674,predicate:"userStatusLastMonth",params:[],type:"UserStatus"},{id:-298113238,predicate:"updatePrivacy",params:[{name:"key",type:"PrivacyKey"},{name:"rules",type:"Vector"}],type:"Update"},{id:1335282456,predicate:"inputPrivacyKeyStatusTimestamp",params:[],type:"InputPrivacyKey"},{id:-1137792208,predicate:"privacyKeyStatusTimestamp",params:[],type:"PrivacyKey"},{id:218751099,predicate:"inputPrivacyValueAllowContacts",params:[],type:"InputPrivacyRule"},{id:407582158,predicate:"inputPrivacyValueAllowAll",params:[],type:"InputPrivacyRule"},{id:320652927,predicate:"inputPrivacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:195371015,predicate:"inputPrivacyValueDisallowContacts",params:[],type:"InputPrivacyRule"},{id:-697604407,predicate:"inputPrivacyValueDisallowAll",params:[],type:"InputPrivacyRule"},{id:-1877932953,predicate:"inputPrivacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:-123988,predicate:"privacyValueAllowContacts",params:[],type:"PrivacyRule"},{id:1698855810,predicate:"privacyValueAllowAll",params:[],type:"PrivacyRule"},{id:-1198497870,predicate:"privacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:-125240806,predicate:"privacyValueDisallowContacts",params:[],type:"PrivacyRule"},{id:-1955338397,predicate:"privacyValueDisallowAll",params:[],type:"PrivacyRule"},{id:-463335103,predicate:"privacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:1352683077,predicate:"account.privacyRules",params:[{name:"rules",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"account.PrivacyRules"},{id:-1194283041,predicate:"accountDaysTTL",params:[{name:"days",type:"int"}],type:"AccountDaysTTL"},{id:88680979,predicate:"updateUserPhone",params:[{name:"user_id",type:"long"},{name:"phone",type:"string"}],type:"Update"},{id:1815593308,predicate:"documentAttributeImageSize",params:[{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:297109817,predicate:"documentAttributeAnimated",params:[],type:"DocumentAttribute"},{id:1662637586,predicate:"documentAttributeSticker",params:[{name:"flags",type:"#"},{name:"mask",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"DocumentAttribute"},{id:250621158,predicate:"documentAttributeVideo",params:[{name:"flags",type:"#"},{name:"round_message",type:"flags.0?true"},{name:"supports_streaming",type:"flags.1?true"},{name:"duration",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:-1739392570,predicate:"documentAttributeAudio",params:[{name:"flags",type:"#"},{name:"voice",type:"flags.10?true"},{name:"duration",type:"int"},{name:"title",type:"flags.0?string"},{name:"performer",type:"flags.1?string"},{name:"waveform",type:"flags.2?bytes"}],type:"DocumentAttribute"},{id:358154344,predicate:"documentAttributeFilename",params:[{name:"file_name",type:"string"}],type:"DocumentAttribute"},{id:-244016606,predicate:"messages.stickersNotModified",params:[],type:"messages.Stickers"},{id:816245886,predicate:"messages.stickers",params:[{name:"hash",type:"long"},{name:"stickers",type:"Vector"}],type:"messages.Stickers"},{id:313694676,predicate:"stickerPack",params:[{name:"emoticon",type:"string"},{name:"documents",type:"Vector"}],type:"StickerPack"},{id:-395967805,predicate:"messages.allStickersNotModified",params:[],type:"messages.AllStickers"},{id:-843329861,predicate:"messages.allStickers",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.AllStickers"},{id:-1667805217,predicate:"updateReadHistoryInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:791617983,predicate:"updateReadHistoryOutbox",params:[{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-2066640507,predicate:"messages.affectedMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"messages.AffectedMessages"},{id:2139689491,predicate:"updateWebPage",params:[{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-350980120,predicate:"webPageEmpty",params:[{name:"id",type:"long"}],type:"WebPage"},{id:-981018084,predicate:"webPagePending",params:[{name:"id",type:"long"},{name:"date",type:"int"}],type:"WebPage"},{id:-392411726,predicate:"webPage",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"url",type:"string"},{name:"display_url",type:"string"},{name:"hash",type:"int"},{name:"type",type:"flags.0?string"},{name:"site_name",type:"flags.1?string"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"photo",type:"flags.4?Photo"},{name:"embed_url",type:"flags.5?string"},{name:"embed_type",type:"flags.5?string"},{name:"embed_width",type:"flags.6?int"},{name:"embed_height",type:"flags.6?int"},{name:"duration",type:"flags.7?int"},{name:"author",type:"flags.8?string"},{name:"document",type:"flags.9?Document"},{name:"cached_page",type:"flags.10?Page"},{name:"attributes",type:"flags.12?Vector"}],type:"WebPage"},{id:-1557277184,predicate:"messageMediaWebPage",params:[{name:"webpage",type:"WebPage"}],type:"MessageMedia"},{id:-1392388579,predicate:"authorization",params:[{name:"flags",type:"#"},{name:"current",type:"flags.0?true"},{name:"official_app",type:"flags.1?true"},{name:"password_pending",type:"flags.2?true"},{name:"encrypted_requests_disabled",type:"flags.3?true"},{name:"call_requests_disabled",type:"flags.4?true"},{name:"hash",type:"long"},{name:"device_model",type:"string"},{name:"platform",type:"string"},{name:"system_version",type:"string"},{name:"api_id",type:"int"},{name:"app_name",type:"string"},{name:"app_version",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"country",type:"string"},{name:"region",type:"string"}],type:"Authorization"},{id:1275039392,predicate:"account.authorizations",params:[{name:"authorization_ttl_days",type:"int"},{name:"authorizations",type:"Vector"}],type:"account.Authorizations"},{id:-1787080453,predicate:"account.password",params:[{name:"flags",type:"#"},{name:"has_recovery",type:"flags.0?true"},{name:"has_secure_values",type:"flags.1?true"},{name:"has_password",type:"flags.2?true"},{name:"current_algo",type:"flags.2?PasswordKdfAlgo"},{name:"srp_B",type:"flags.2?bytes"},{name:"srp_id",type:"flags.2?long"},{name:"hint",type:"flags.3?string"},{name:"email_unconfirmed_pattern",type:"flags.4?string"},{name:"new_algo",type:"PasswordKdfAlgo"},{name:"new_secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_random",type:"bytes"},{name:"pending_reset_date",type:"flags.5?int"},{name:"login_email_pattern",type:"flags.6?string"}],type:"account.Password"},{id:-1705233435,predicate:"account.passwordSettings",params:[{name:"flags",type:"#"},{name:"email",type:"flags.0?string"},{name:"secure_settings",type:"flags.1?SecureSecretSettings"}],type:"account.PasswordSettings"},{id:-1036572727,predicate:"account.passwordInputSettings",params:[{name:"flags",type:"#"},{name:"new_algo",type:"flags.0?PasswordKdfAlgo"},{name:"new_password_hash",type:"flags.0?bytes"},{name:"hint",type:"flags.0?string"},{name:"email",type:"flags.1?string"},{name:"new_secure_settings",type:"flags.2?SecureSecretSettings"}],type:"account.PasswordInputSettings"},{id:326715557,predicate:"auth.passwordRecovery",params:[{name:"email_pattern",type:"string"}],type:"auth.PasswordRecovery"},{id:-1052959727,predicate:"inputMediaVenue",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"InputMedia"},{id:784356159,predicate:"messageMediaVenue",params:[{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"MessageMedia"},{id:-1551583367,predicate:"receivedNotifyMessage",params:[{name:"id",type:"int"},{name:"flags",type:"int"}],type:"ReceivedNotifyMessage"},{id:179611673,predicate:"chatInviteExported",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.0?true"},{name:"permanent",type:"flags.5?true"},{name:"request_needed",type:"flags.6?true"},{name:"link",type:"string"},{name:"admin_id",type:"long"},{name:"date",type:"int"},{name:"start_date",type:"flags.4?int"},{name:"expire_date",type:"flags.1?int"},{name:"usage_limit",type:"flags.2?int"},{name:"usage",type:"flags.3?int"},{name:"requested",type:"flags.7?int"},{name:"title",type:"flags.8?string"}],type:"ExportedChatInvite"},{id:1516793212,predicate:"chatInviteAlready",params:[{name:"chat",type:"Chat"}],type:"ChatInvite"},{id:806110401,predicate:"chatInvite",params:[{name:"flags",type:"#"},{name:"channel",type:"flags.0?true"},{name:"broadcast",type:"flags.1?true"},{name:"public",type:"flags.2?true"},{name:"megagroup",type:"flags.3?true"},{name:"request_needed",type:"flags.6?true"},{name:"title",type:"string"},{name:"about",type:"flags.5?string"},{name:"photo",type:"Photo"},{name:"participants_count",type:"int"},{name:"participants",type:"flags.4?Vector"}],type:"ChatInvite"},{id:51520707,predicate:"messageActionChatJoinedByLink",params:[{name:"inviter_id",type:"long"}],type:"MessageAction"},{id:1757493555,predicate:"updateReadMessagesContents",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-4838507,predicate:"inputStickerSetEmpty",params:[],type:"InputStickerSet"},{id:-1645763991,predicate:"inputStickerSetID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputStickerSet"},{id:-2044933984,predicate:"inputStickerSetShortName",params:[{name:"short_name",type:"string"}],type:"InputStickerSet"},{id:768691932,predicate:"stickerSet",params:[{name:"flags",type:"#"},{name:"archived",type:"flags.1?true"},{name:"official",type:"flags.2?true"},{name:"masks",type:"flags.3?true"},{name:"animated",type:"flags.5?true"},{name:"videos",type:"flags.6?true"},{name:"emojis",type:"flags.7?true"},{name:"installed_date",type:"flags.0?int"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumbs",type:"flags.4?Vector"},{name:"thumb_dc_id",type:"flags.4?int"},{name:"thumb_version",type:"flags.4?int"},{name:"thumb_document_id",type:"flags.8?long"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:1846886166,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"keywords",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:-1885878744,predicate:"user",params:[{name:"flags",type:"#"},{name:"self",type:"flags.10?true"},{name:"contact",type:"flags.11?true"},{name:"mutual_contact",type:"flags.12?true"},{name:"deleted",type:"flags.13?true"},{name:"bot",type:"flags.14?true"},{name:"bot_chat_history",type:"flags.15?true"},{name:"bot_nochats",type:"flags.16?true"},{name:"verified",type:"flags.17?true"},{name:"restricted",type:"flags.18?true"},{name:"min",type:"flags.20?true"},{name:"bot_inline_geo",type:"flags.21?true"},{name:"support",type:"flags.23?true"},{name:"scam",type:"flags.24?true"},{name:"apply_min_photo",type:"flags.25?true"},{name:"fake",type:"flags.26?true"},{name:"bot_attach_menu",type:"flags.27?true"},{name:"premium",type:"flags.28?true"},{name:"attach_menu_enabled",type:"flags.29?true"},{name:"flags2",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"flags.0?long"},{name:"first_name",type:"flags.1?string"},{name:"last_name",type:"flags.2?string"},{name:"username",type:"flags.3?string"},{name:"phone",type:"flags.4?string"},{name:"photo",type:"flags.5?UserProfilePhoto"},{name:"status",type:"flags.6?UserStatus"},{name:"bot_info_version",type:"flags.14?int"},{name:"restriction_reason",type:"flags.18?Vector"},{name:"bot_inline_placeholder",type:"flags.19?string"},{name:"lang_code",type:"flags.22?string"},{name:"emoji_status",type:"flags.30?EmojiStatus"},{name:"usernames",type:"flags2.0?Vector"}],type:"User"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:-1892676777,predicate:"botInfo",params:[{name:"flags",type:"#"},{name:"user_id",type:"flags.0?long"},{name:"description",type:"flags.1?string"},{name:"description_photo",type:"flags.4?Photo"},{name:"description_document",type:"flags.5?Document"},{name:"commands",type:"flags.2?Vector"},{name:"menu_button",type:"flags.3?BotMenuButton"}],type:"BotInfo"},{id:-1560655744,predicate:"keyboardButton",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:2002815875,predicate:"keyboardButtonRow",params:[{name:"buttons",type:"Vector"}],type:"KeyboardButtonRow"},{id:-1606526075,predicate:"replyKeyboardHide",params:[{name:"flags",type:"#"},{name:"selective",type:"flags.2?true"}],type:"ReplyMarkup"},{id:-2035021048,predicate:"replyKeyboardForceReply",params:[{name:"flags",type:"#"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-2049074735,predicate:"replyKeyboardMarkup",params:[{name:"flags",type:"#"},{name:"resize",type:"flags.0?true"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"persistent",type:"flags.4?true"},{name:"rows",type:"Vector"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-571955892,predicate:"inputPeerUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-233744186,predicate:"inputUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputUser"},{id:-1148011883,predicate:"messageEntityUnknown",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-100378723,predicate:"messageEntityMention",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1868782349,predicate:"messageEntityHashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1827637959,predicate:"messageEntityBotCommand",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1859134776,predicate:"messageEntityUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1692693954,predicate:"messageEntityEmail",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1117713463,predicate:"messageEntityBold",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-2106619040,predicate:"messageEntityItalic",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:681706865,predicate:"messageEntityCode",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1938967520,predicate:"messageEntityPre",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"language",type:"string"}],type:"MessageEntity"},{id:1990644519,predicate:"messageEntityTextUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"url",type:"string"}],type:"MessageEntity"},{id:-1877614335,predicate:"updateShortSentMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"media",type:"flags.9?MessageMedia"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:-292807034,predicate:"inputChannelEmpty",params:[],type:"InputChannel"},{id:-212145112,predicate:"inputChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputChannel"},{id:-1566230754,predicate:"peerChannel",params:[{name:"channel_id",type:"long"}],type:"Peer"},{id:666680316,predicate:"inputPeerChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-2094689180,predicate:"channel",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"broadcast",type:"flags.5?true"},{name:"verified",type:"flags.7?true"},{name:"megagroup",type:"flags.8?true"},{name:"restricted",type:"flags.9?true"},{name:"signatures",type:"flags.11?true"},{name:"min",type:"flags.12?true"},{name:"scam",type:"flags.19?true"},{name:"has_link",type:"flags.20?true"},{name:"has_geo",type:"flags.21?true"},{name:"slowmode_enabled",type:"flags.22?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"fake",type:"flags.25?true"},{name:"gigagroup",type:"flags.26?true"},{name:"noforwards",type:"flags.27?true"},{name:"join_to_send",type:"flags.28?true"},{name:"join_request",type:"flags.29?true"},{name:"forum",type:"flags.30?true"},{name:"flags2",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"flags.13?long"},{name:"title",type:"string"},{name:"username",type:"flags.6?string"},{name:"photo",type:"ChatPhoto"},{name:"date",type:"int"},{name:"restriction_reason",type:"flags.9?Vector"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"banned_rights",type:"flags.15?ChatBannedRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"},{name:"participants_count",type:"flags.17?int"},{name:"usernames",type:"flags2.0?Vector"}],type:"Chat"},{id:399807445,predicate:"channelForbidden",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.5?true"},{name:"megagroup",type:"flags.8?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"until_date",type:"flags.16?int"}],type:"Chat"},{id:2131196633,predicate:"contacts.resolvedPeer",params:[{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ResolvedPeer"},{id:-231385849,predicate:"channelFull",params:[{name:"flags",type:"#"},{name:"can_view_participants",type:"flags.3?true"},{name:"can_set_username",type:"flags.6?true"},{name:"can_set_stickers",type:"flags.7?true"},{name:"hidden_prehistory",type:"flags.10?true"},{name:"can_set_location",type:"flags.16?true"},{name:"has_scheduled",type:"flags.19?true"},{name:"can_view_stats",type:"flags.20?true"},{name:"blocked",type:"flags.22?true"},{name:"flags2",type:"#"},{name:"can_delete_channel",type:"flags2.0?true"},{name:"antispam",type:"flags2.1?true"},{name:"participants_hidden",type:"flags2.2?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants_count",type:"flags.0?int"},{name:"admins_count",type:"flags.1?int"},{name:"kicked_count",type:"flags.2?int"},{name:"banned_count",type:"flags.2?int"},{name:"online_count",type:"flags.13?int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"chat_photo",type:"Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.23?ExportedChatInvite"},{name:"bot_info",type:"Vector"},{name:"migrated_from_chat_id",type:"flags.4?long"},{name:"migrated_from_max_id",type:"flags.4?int"},{name:"pinned_msg_id",type:"flags.5?int"},{name:"stickerset",type:"flags.8?StickerSet"},{name:"available_min_id",type:"flags.9?int"},{name:"folder_id",type:"flags.11?int"},{name:"linked_chat_id",type:"flags.14?long"},{name:"location",type:"flags.15?ChannelLocation"},{name:"slowmode_seconds",type:"flags.17?int"},{name:"slowmode_next_send_date",type:"flags.18?int"},{name:"stats_dc",type:"flags.12?int"},{name:"pts",type:"int"},{name:"call",type:"flags.21?InputGroupCall"},{name:"ttl_period",type:"flags.24?int"},{name:"pending_suggestions",type:"flags.25?Vector"},{name:"groupcall_default_join_as",type:"flags.26?Peer"},{name:"theme_emoticon",type:"flags.27?string"},{name:"requests_pending",type:"flags.28?int"},{name:"recent_requesters",type:"flags.28?Vector"},{name:"default_send_as",type:"flags.29?Peer"},{name:"available_reactions",type:"flags.30?ChatReactions"}],type:"ChatFull"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{id:-948520370,predicate:"messages.channelMessages",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"pts",type:"int"},{name:"count",type:"int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"topics",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:-1781355374,predicate:"messageActionChannelCreate",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:277713951,predicate:"updateChannelTooLong",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"pts",type:"flags.0?int"}],type:"Update"},{id:1666927625,predicate:"updateChannel",params:[{name:"channel_id",type:"long"}],type:"Update"},{id:1656358105,predicate:"updateNewChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1842450928,predicate:"updateReadChannelInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"channel_id",type:"long"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"}],type:"Update"},{id:-1020437742,predicate:"updateDeleteChannelMessages",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-232346616,predicate:"updateChannelMessageViews",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"views",type:"int"}],type:"Update"},{id:1041346555,predicate:"updates.channelDifferenceEmpty",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"}],type:"updates.ChannelDifference"},{id:-1531132162,predicate:"updates.channelDifferenceTooLong",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"timeout",type:"flags.1?int"},{name:"dialog",type:"Dialog"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:543450958,predicate:"updates.channelDifference",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"},{name:"new_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:-1798033689,predicate:"channelMessagesFilterEmpty",params:[],type:"ChannelMessagesFilter"},{id:-847783593,predicate:"channelMessagesFilter",params:[{name:"flags",type:"#"},{name:"exclude_new_messages",type:"flags.1?true"},{name:"ranges",type:"Vector"}],type:"ChannelMessagesFilter"},{id:-1072953408,predicate:"channelParticipant",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:900251559,predicate:"channelParticipantSelf",params:[{name:"flags",type:"#"},{name:"via_request",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:803602899,predicate:"channelParticipantCreator",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.0?string"}],type:"ChannelParticipant"},{id:-566281095,predicate:"channelParticipantsRecent",params:[],type:"ChannelParticipantsFilter"},{id:-1268741783,predicate:"channelParticipantsAdmins",params:[],type:"ChannelParticipantsFilter"},{id:-1548400251,predicate:"channelParticipantsKicked",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1699676497,predicate:"channels.channelParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipants"},{id:-541588713,predicate:"channels.channelParticipant",params:[{name:"participant",type:"ChannelParticipant"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipant"},{id:-462696732,predicate:"chatParticipantCreator",params:[{name:"user_id",type:"long"}],type:"ChatParticipant"},{id:-1600962725,predicate:"chatParticipantAdmin",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-674602590,predicate:"updateChatParticipantAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"is_admin",type:"Bool"},{name:"version",type:"int"}],type:"Update"},{id:-519864430,predicate:"messageActionChatMigrateTo",params:[{name:"channel_id",type:"long"}],type:"MessageAction"},{id:-365344535,predicate:"messageActionChannelMigrateFrom",params:[{name:"title",type:"string"},{name:"chat_id",type:"long"}],type:"MessageAction"},{id:-1328445861,predicate:"channelParticipantsBots",params:[],type:"ChannelParticipantsFilter"},{id:2013922064,predicate:"help.termsOfService",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"id",type:"DataJSON"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"min_age_confirm",type:"flags.1?int"}],type:"help.TermsOfService"},{id:1753886890,predicate:"updateNewStickerSet",params:[{name:"stickerset",type:"messages.StickerSet"}],type:"Update"},{id:196268545,predicate:"updateStickerSetsOrder",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"order",type:"Vector"}],type:"Update"},{id:834816008,predicate:"updateStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"}],type:"Update"},{id:-402498398,predicate:"messages.savedGifsNotModified",params:[],type:"messages.SavedGifs"},{id:-2069878259,predicate:"messages.savedGifs",params:[{name:"hash",type:"long"},{name:"gifs",type:"Vector"}],type:"messages.SavedGifs"},{id:-1821035490,predicate:"updateSavedGifs",params:[],type:"Update"},{id:864077702,predicate:"inputBotInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1036876423,predicate:"inputBotInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-2000710887,predicate:"inputBotInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?InputWebDocument"},{name:"content",type:"flags.5?InputWebDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1984755728,predicate:"botInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1937807902,predicate:"botInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:295067450,predicate:"botInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?WebDocument"},{name:"content",type:"flags.5?WebDocument"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1803769784,predicate:"messages.botResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"query_id",type:"long"},{name:"next_offset",type:"flags.1?string"},{name:"switch_pm",type:"flags.2?InlineBotSwitchPM"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"users",type:"Vector"}],type:"messages.BotResults"},{id:1232025500,predicate:"updateBotInlineQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"peer_type",type:"flags.1?InlineQueryPeerType"},{name:"offset",type:"string"}],type:"Update"},{id:317794823,predicate:"updateBotInlineSend",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"id",type:"string"},{name:"msg_id",type:"flags.1?InputBotInlineMessageID"}],type:"Update"},{id:1358283666,predicate:"inputMessagesFilterVoice",params:[],type:"MessagesFilter"},{id:928101534,predicate:"inputMessagesFilterMusic",params:[],type:"MessagesFilter"},{id:-1107622874,predicate:"inputPrivacyKeyChatInvite",params:[],type:"InputPrivacyKey"},{id:1343122938,predicate:"privacyKeyChatInvite",params:[],type:"PrivacyKey"},{id:1571494644,predicate:"exportedMessageLink",params:[{name:"link",type:"string"},{name:"html",type:"string"}],type:"ExportedMessageLink"},{id:1601666510,predicate:"messageFwdHeader",params:[{name:"flags",type:"#"},{name:"imported",type:"flags.7?true"},{name:"from_id",type:"flags.0?Peer"},{name:"from_name",type:"flags.5?string"},{name:"date",type:"int"},{name:"channel_post",type:"flags.2?int"},{name:"post_author",type:"flags.3?string"},{name:"saved_from_peer",type:"flags.4?Peer"},{name:"saved_from_msg_id",type:"flags.4?int"},{name:"psa_type",type:"flags.6?string"}],type:"MessageFwdHeader"},{id:457133559,predicate:"updateEditChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1799538451,predicate:"messageActionPinMessage",params:[],type:"MessageAction"},{id:1923290508,predicate:"auth.codeTypeSms",params:[],type:"auth.CodeType"},{id:1948046307,predicate:"auth.codeTypeCall",params:[],type:"auth.CodeType"},{id:577556219,predicate:"auth.codeTypeFlashCall",params:[],type:"auth.CodeType"},{id:1035688326,predicate:"auth.sentCodeTypeApp",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1073693790,predicate:"auth.sentCodeTypeSms",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1398007207,predicate:"auth.sentCodeTypeCall",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1425815847,predicate:"auth.sentCodeTypeFlashCall",params:[{name:"pattern",type:"string"}],type:"auth.SentCodeType"},{id:629866245,predicate:"keyboardButtonUrl",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:901503851,predicate:"keyboardButtonCallback",params:[{name:"flags",type:"#"},{name:"requires_password",type:"flags.0?true"},{name:"text",type:"string"},{name:"data",type:"bytes"}],type:"KeyboardButton"},{id:-1318425559,predicate:"keyboardButtonRequestPhone",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-59151553,predicate:"keyboardButtonRequestGeoLocation",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:90744648,predicate:"keyboardButtonSwitchInline",params:[{name:"flags",type:"#"},{name:"same_peer",type:"flags.0?true"},{name:"text",type:"string"},{name:"query",type:"string"}],type:"KeyboardButton"},{id:1218642516,predicate:"replyInlineMarkup",params:[{name:"rows",type:"Vector"}],type:"ReplyMarkup"},{id:911761060,predicate:"messages.botCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"has_url",type:"flags.3?true"},{name:"native_ui",type:"flags.4?true"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"messages.BotCallbackAnswer"},{id:-1177566067,predicate:"updateBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:649453030,predicate:"messages.messageEditData",params:[{name:"flags",type:"#"},{name:"caption",type:"flags.0?true"}],type:"messages.MessageEditData"},{id:-469536605,predicate:"updateEditMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1768777083,predicate:"inputBotInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1098628881,predicate:"inputBotInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-1494368259,predicate:"inputBotInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:85477117,predicate:"botInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1970903652,predicate:"botInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:416402882,predicate:"botInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1462213465,predicate:"inputBotInlineResultPhoto",params:[{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"InputPhoto"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:-459324,predicate:"inputBotInlineResultDocument",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"document",type:"InputDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:400266251,predicate:"botInlineMediaResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"flags.0?Photo"},{name:"document",type:"flags.1?Document"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1995686519,predicate:"inputBotInlineMessageID",params:[{name:"dc_id",type:"int"},{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:1763610706,predicate:"updateInlineBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"msg_id",type:"InputBotInlineMessageID"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:1008755359,predicate:"inlineBotSwitchPM",params:[{name:"text",type:"string"},{name:"start_param",type:"string"}],type:"InlineBotSwitchPM"},{id:863093588,predicate:"messages.peerDialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"messages.PeerDialogs"},{id:-305282981,predicate:"topPeer",params:[{name:"peer",type:"Peer"},{name:"rating",type:"double"}],type:"TopPeer"},{id:-1419371685,predicate:"topPeerCategoryBotsPM",params:[],type:"TopPeerCategory"},{id:344356834,predicate:"topPeerCategoryBotsInline",params:[],type:"TopPeerCategory"},{id:104314861,predicate:"topPeerCategoryCorrespondents",params:[],type:"TopPeerCategory"},{id:-1122524854,predicate:"topPeerCategoryGroups",params:[],type:"TopPeerCategory"},{id:371037736,predicate:"topPeerCategoryChannels",params:[],type:"TopPeerCategory"},{id:-75283823,predicate:"topPeerCategoryPeers",params:[{name:"category",type:"TopPeerCategory"},{name:"count",type:"int"},{name:"peers",type:"Vector"}],type:"TopPeerCategoryPeers"},{id:-567906571,predicate:"contacts.topPeersNotModified",params:[],type:"contacts.TopPeers"},{id:1891070632,predicate:"contacts.topPeers",params:[{name:"categories",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.TopPeers"},{id:-595914432,predicate:"messageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"long"}],type:"MessageEntity"},{id:546203849,predicate:"inputMessageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"InputUser"}],type:"MessageEntity"},{id:975236280,predicate:"inputMessagesFilterChatPhotos",params:[],type:"MessagesFilter"},{id:-1218471511,predicate:"updateReadChannelOutbox",params:[{name:"channel_id",type:"long"},{name:"max_id",type:"int"}],type:"Update"},{id:457829485,predicate:"updateDraftMessage",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"top_msg_id",type:"flags.0?int"},{name:"draft",type:"DraftMessage"}],type:"Update"},{id:453805082,predicate:"draftMessageEmpty",params:[{name:"flags",type:"#"},{name:"date",type:"flags.0?int"}],type:"DraftMessage"},{id:-40996577,predicate:"draftMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"},{name:"date",type:"int"}],type:"DraftMessage"},{id:-1615153660,predicate:"messageActionHistoryClear",params:[],type:"MessageAction"},{id:-958657434,predicate:"messages.featuredStickersNotModified",params:[{name:"count",type:"int"}],type:"messages.FeaturedStickers"},{id:-1103615738,predicate:"messages.featuredStickers",params:[{name:"flags",type:"#"},{name:"premium",type:"flags.0?true"},{name:"hash",type:"long"},{name:"count",type:"int"},{name:"sets",type:"Vector"},{name:"unread",type:"Vector"}],type:"messages.FeaturedStickers"},{id:1461528386,predicate:"updateReadFeaturedStickers",params:[],type:"Update"},{id:186120336,predicate:"messages.recentStickersNotModified",params:[],type:"messages.RecentStickers"},{id:-1999405994,predicate:"messages.recentStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"},{name:"dates",type:"Vector"}],type:"messages.RecentStickers"},{id:-1706939360,predicate:"updateRecentStickers",params:[],type:"Update"},{id:1338747336,predicate:"messages.archivedStickers",params:[{name:"count",type:"int"},{name:"sets",type:"Vector"}],type:"messages.ArchivedStickers"},{id:946083368,predicate:"messages.stickerSetInstallResultSuccess",params:[],type:"messages.StickerSetInstallResult"},{id:904138920,predicate:"messages.stickerSetInstallResultArchive",params:[{name:"sets",type:"Vector"}],type:"messages.StickerSetInstallResult"},{id:1678812626,predicate:"stickerSetCovered",params:[{name:"set",type:"StickerSet"},{name:"cover",type:"Document"}],type:"StickerSetCovered"},{id:-1574314746,predicate:"updateConfig",params:[],type:"Update"},{id:861169551,predicate:"updatePtsChanged",params:[],type:"Update"},{id:-440664550,predicate:"inputMediaPhotoExternal",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.1?true"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-78455655,predicate:"inputMediaDocumentExternal",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.1?true"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:872932635,predicate:"stickerSetMultiCovered",params:[{name:"set",type:"StickerSet"},{name:"covers",type:"Vector"}],type:"StickerSetCovered"},{id:-1361650766,predicate:"maskCoords",params:[{name:"n",type:"int"},{name:"x",type:"double"},{name:"y",type:"double"},{name:"zoom",type:"double"}],type:"MaskCoords"},{id:-1744710921,predicate:"documentAttributeHasStickers",params:[],type:"DocumentAttribute"},{id:1251549527,predicate:"inputStickeredMediaPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputStickeredMedia"},{id:70813275,predicate:"inputStickeredMediaDocument",params:[{name:"id",type:"InputDocument"}],type:"InputStickeredMedia"},{id:-1107729093,predicate:"game",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"short_name",type:"string"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"Photo"},{name:"document",type:"flags.0?Document"}],type:"Game"},{id:1336154098,predicate:"inputBotInlineResultGame",params:[{name:"id",type:"string"},{name:"short_name",type:"string"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1262639204,predicate:"inputBotInlineMessageGame",params:[{name:"flags",type:"#"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-38694904,predicate:"messageMediaGame",params:[{name:"game",type:"Game"}],type:"MessageMedia"},{id:-750828557,predicate:"inputMediaGame",params:[{name:"id",type:"InputGame"}],type:"InputMedia"},{id:53231223,predicate:"inputGameID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGame"},{id:-1020139510,predicate:"inputGameShortName",params:[{name:"bot_id",type:"InputUser"},{name:"short_name",type:"string"}],type:"InputGame"},{id:1358175439,predicate:"keyboardButtonGame",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1834538890,predicate:"messageActionGameScore",params:[{name:"game_id",type:"long"},{name:"score",type:"int"}],type:"MessageAction"},{id:1940093419,predicate:"highScore",params:[{name:"pos",type:"int"},{name:"user_id",type:"long"},{name:"score",type:"int"}],type:"HighScore"},{id:-1707344487,predicate:"messages.highScores",params:[{name:"scores",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.HighScores"},{id:1258196845,predicate:"updates.differenceTooLong",params:[{name:"pts",type:"int"}],type:"updates.Difference"},{id:791390623,predicate:"updateChannelWebPage",params:[{name:"channel_id",type:"long"},{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1663561404,predicate:"messages.chatsSlice",params:[{name:"count",type:"int"},{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-599948721,predicate:"textEmpty",params:[],type:"RichText"},{id:1950782688,predicate:"textPlain",params:[{name:"text",type:"string"}],type:"RichText"},{id:1730456516,predicate:"textBold",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-653089380,predicate:"textItalic",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1054465340,predicate:"textUnderline",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1678197867,predicate:"textStrike",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1816074681,predicate:"textFixed",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1009288385,predicate:"textUrl",params:[{name:"text",type:"RichText"},{name:"url",type:"string"},{name:"webpage_id",type:"long"}],type:"RichText"},{id:-564523562,predicate:"textEmail",params:[{name:"text",type:"RichText"},{name:"email",type:"string"}],type:"RichText"},{id:2120376535,predicate:"textConcat",params:[{name:"texts",type:"Vector"}],type:"RichText"},{id:324435594,predicate:"pageBlockUnsupported",params:[],type:"PageBlock"},{id:1890305021,predicate:"pageBlockTitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1879401953,predicate:"pageBlockSubtitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1162877472,predicate:"pageBlockAuthorDate",params:[{name:"author",type:"RichText"},{name:"published_date",type:"int"}],type:"PageBlock"},{id:-1076861716,predicate:"pageBlockHeader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-248793375,predicate:"pageBlockSubheader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:1182402406,predicate:"pageBlockParagraph",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1066346178,predicate:"pageBlockPreformatted",params:[{name:"text",type:"RichText"},{name:"language",type:"string"}],type:"PageBlock"},{id:1216809369,predicate:"pageBlockFooter",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-618614392,predicate:"pageBlockDivider",params:[],type:"PageBlock"},{id:-837994576,predicate:"pageBlockAnchor",params:[{name:"name",type:"string"}],type:"PageBlock"},{id:-454524911,predicate:"pageBlockList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:641563686,predicate:"pageBlockBlockquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:1329878739,predicate:"pageBlockPullquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:391759200,predicate:"pageBlockPhoto",params:[{name:"flags",type:"#"},{name:"photo_id",type:"long"},{name:"caption",type:"PageCaption"},{name:"url",type:"flags.0?string"},{name:"webpage_id",type:"flags.0?long"}],type:"PageBlock"},{id:2089805750,predicate:"pageBlockVideo",params:[{name:"flags",type:"#"},{name:"autoplay",type:"flags.0?true"},{name:"loop",type:"flags.1?true"},{name:"video_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:972174080,predicate:"pageBlockCover",params:[{name:"cover",type:"PageBlock"}],type:"PageBlock"},{id:-1468953147,predicate:"pageBlockEmbed",params:[{name:"flags",type:"#"},{name:"full_width",type:"flags.0?true"},{name:"allow_scrolling",type:"flags.3?true"},{name:"url",type:"flags.1?string"},{name:"html",type:"flags.2?string"},{name:"poster_photo_id",type:"flags.4?long"},{name:"w",type:"flags.5?int"},{name:"h",type:"flags.5?int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-229005301,predicate:"pageBlockEmbedPost",params:[{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"author_photo_id",type:"long"},{name:"author",type:"string"},{name:"date",type:"int"},{name:"blocks",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1705048653,predicate:"pageBlockCollage",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:52401552,predicate:"pageBlockSlideshow",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1930545681,predicate:"webPageNotModified",params:[{name:"flags",type:"#"},{name:"cached_page_views",type:"flags.0?int"}],type:"WebPage"},{id:-88417185,predicate:"inputPrivacyKeyPhoneCall",params:[],type:"InputPrivacyKey"},{id:1030105979,predicate:"privacyKeyPhoneCall",params:[],type:"PrivacyKey"},{id:-580219064,predicate:"sendMessageGamePlayAction",params:[],type:"SendMessageAction"},{id:-2048646399,predicate:"phoneCallDiscardReasonMissed",params:[],type:"PhoneCallDiscardReason"},{id:-527056480,predicate:"phoneCallDiscardReasonDisconnect",params:[],type:"PhoneCallDiscardReason"},{id:1471006352,predicate:"phoneCallDiscardReasonHangup",params:[],type:"PhoneCallDiscardReason"},{id:-84416311,predicate:"phoneCallDiscardReasonBusy",params:[],type:"PhoneCallDiscardReason"},{id:1852826908,predicate:"updateDialogPinned",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-99664734,predicate:"updatePinnedDialogs",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.1?int"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:2104790276,predicate:"dataJSON",params:[{name:"data",type:"string"}],type:"DataJSON"},{id:-2095595325,predicate:"updateBotWebhookJSON",params:[{name:"data",type:"DataJSON"}],type:"Update"},{id:-1684914010,predicate:"updateBotWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"},{name:"timeout",type:"int"}],type:"Update"},{id:-886477832,predicate:"labeledPrice",params:[{name:"label",type:"string"},{name:"amount",type:"long"}],type:"LabeledPrice"},{id:1048946971,predicate:"invoice",params:[{name:"flags",type:"#"},{name:"test",type:"flags.0?true"},{name:"name_requested",type:"flags.1?true"},{name:"phone_requested",type:"flags.2?true"},{name:"email_requested",type:"flags.3?true"},{name:"shipping_address_requested",type:"flags.4?true"},{name:"flexible",type:"flags.5?true"},{name:"phone_to_provider",type:"flags.6?true"},{name:"email_to_provider",type:"flags.7?true"},{name:"recurring",type:"flags.9?true"},{name:"currency",type:"string"},{name:"prices",type:"Vector"},{name:"max_tip_amount",type:"flags.8?long"},{name:"suggested_tip_amounts",type:"flags.8?Vector"},{name:"recurring_terms_url",type:"flags.9?string"}],type:"Invoice"},{id:-1900697899,predicate:"inputMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"start_param",type:"flags.1?string"},{name:"extended_media",type:"flags.2?InputMedia"}],type:"InputMedia"},{id:-368917890,predicate:"paymentCharge",params:[{name:"id",type:"string"},{name:"provider_charge_id",type:"string"}],type:"PaymentCharge"},{id:-1892568281,predicate:"messageActionPaymentSentMe",params:[{name:"flags",type:"#"},{name:"recurring_init",type:"flags.2?true"},{name:"recurring_used",type:"flags.3?true"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"charge",type:"PaymentCharge"}],type:"MessageAction"},{id:-156940077,predicate:"messageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"receipt_msg_id",type:"flags.2?int"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"start_param",type:"string"},{name:"extended_media",type:"flags.4?MessageExtendedMedia"}],type:"MessageMedia"},{id:512535275,predicate:"postAddress",params:[{name:"street_line1",type:"string"},{name:"street_line2",type:"string"},{name:"city",type:"string"},{name:"state",type:"string"},{name:"country_iso2",type:"string"},{name:"post_code",type:"string"}],type:"PostAddress"},{id:-1868808300,predicate:"paymentRequestedInfo",params:[{name:"flags",type:"#"},{name:"name",type:"flags.0?string"},{name:"phone",type:"flags.1?string"},{name:"email",type:"flags.2?string"},{name:"shipping_address",type:"flags.3?PostAddress"}],type:"PaymentRequestedInfo"},{id:-1344716869,predicate:"keyboardButtonBuy",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1776926890,predicate:"messageActionPaymentSent",params:[{name:"flags",type:"#"},{name:"recurring_init",type:"flags.2?true"},{name:"recurring_used",type:"flags.3?true"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"invoice_slug",type:"flags.0?string"}],type:"MessageAction"},{id:-842892769,predicate:"paymentSavedCredentialsCard",params:[{name:"id",type:"string"},{name:"title",type:"string"}],type:"PaymentSavedCredentials"},{id:475467473,predicate:"webDocument",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:-1678949555,predicate:"inputWebDocument",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"InputWebDocument"},{id:-1036396922,predicate:"inputWebFileLocation",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"}],type:"InputWebFileLocation"},{id:568808380,predicate:"upload.webFile",params:[{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"file_type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.WebFile"},{id:-1610250415,predicate:"payments.paymentForm",params:[{name:"flags",type:"#"},{name:"can_save_credentials",type:"flags.2?true"},{name:"password_missing",type:"flags.3?true"},{name:"form_id",type:"long"},{name:"bot_id",type:"long"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.5?WebDocument"},{name:"invoice",type:"Invoice"},{name:"provider_id",type:"long"},{name:"url",type:"string"},{name:"native_provider",type:"flags.4?string"},{name:"native_params",type:"flags.4?DataJSON"},{name:"additional_methods",type:"flags.6?Vector"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?Vector"},{name:"users",type:"Vector"}],type:"payments.PaymentForm"},{id:-784000893,predicate:"payments.validatedRequestedInfo",params:[{name:"flags",type:"#"},{name:"id",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"payments.ValidatedRequestedInfo"},{id:1314881805,predicate:"payments.paymentResult",params:[{name:"updates",type:"Updates"}],type:"payments.PaymentResult"},{id:1891958275,predicate:"payments.paymentReceipt",params:[{name:"flags",type:"#"},{name:"date",type:"int"},{name:"bot_id",type:"long"},{name:"provider_id",type:"long"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.2?WebDocument"},{name:"invoice",type:"Invoice"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping",type:"flags.1?ShippingOption"},{name:"tip_amount",type:"flags.3?long"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"credentials_title",type:"string"},{name:"users",type:"Vector"}],type:"payments.PaymentReceipt"},{id:-74456004,predicate:"payments.savedInfo",params:[{name:"flags",type:"#"},{name:"has_saved_credentials",type:"flags.1?true"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"}],type:"payments.SavedInfo"},{id:-1056001329,predicate:"inputPaymentCredentialsSaved",params:[{name:"id",type:"string"},{name:"tmp_password",type:"bytes"}],type:"InputPaymentCredentials"},{id:873977640,predicate:"inputPaymentCredentials",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-614138572,predicate:"account.tmpPassword",params:[{name:"tmp_password",type:"bytes"},{name:"valid_until",type:"int"}],type:"account.TmpPassword"},{id:-1239335713,predicate:"shippingOption",params:[{name:"id",type:"string"},{name:"title",type:"string"},{name:"prices",type:"Vector"}],type:"ShippingOption"},{id:-1246823043,predicate:"updateBotShippingQuery",params:[{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"shipping_address",type:"PostAddress"}],type:"Update"},{id:-1934976362,predicate:"updateBotPrecheckoutQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"Update"},{id:-6249322,predicate:"inputStickerSetItem",params:[{name:"flags",type:"#"},{name:"document",type:"InputDocument"},{name:"emoji",type:"string"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"InputStickerSetItem"},{id:-1425052898,predicate:"updatePhoneCall",params:[{name:"phone_call",type:"PhoneCall"}],type:"Update"},{id:506920429,predicate:"inputPhoneCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPhoneCall"},{id:1399245077,predicate:"phoneCallEmpty",params:[{name:"id",type:"long"}],type:"PhoneCall"},{id:-987599081,predicate:"phoneCallWaiting",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"receive_date",type:"flags.0?int"}],type:"PhoneCall"},{id:347139340,predicate:"phoneCallRequested",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:912311057,predicate:"phoneCallAccepted",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:-1770029977,predicate:"phoneCall",params:[{name:"flags",type:"#"},{name:"p2p_allowed",type:"flags.5?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"connections",type:"Vector"},{name:"start_date",type:"int"}],type:"PhoneCall"},{id:1355435489,predicate:"phoneCallDiscarded",params:[{name:"flags",type:"#"},{name:"need_rating",type:"flags.2?true"},{name:"need_debug",type:"flags.3?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"PhoneCall"},{id:-1665063993,predicate:"phoneConnection",params:[{name:"flags",type:"#"},{name:"tcp",type:"flags.0?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"peer_tag",type:"bytes"}],type:"PhoneConnection"},{id:-58224696,predicate:"phoneCallProtocol",params:[{name:"flags",type:"#"},{name:"udp_p2p",type:"flags.0?true"},{name:"udp_reflector",type:"flags.1?true"},{name:"min_layer",type:"int"},{name:"max_layer",type:"int"},{name:"library_versions",type:"Vector"}],type:"PhoneCallProtocol"},{id:-326966976,predicate:"phone.phoneCall",params:[{name:"phone_call",type:"PhoneCall"},{name:"users",type:"Vector"}],type:"phone.PhoneCall"},{id:-2134272152,predicate:"inputMessagesFilterPhoneCalls",params:[{name:"flags",type:"#"},{name:"missed",type:"flags.0?true"}],type:"MessagesFilter"},{id:-2132731265,predicate:"messageActionPhoneCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.2?true"},{name:"call_id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"MessageAction"},{id:2054952868,predicate:"inputMessagesFilterRoundVoice",params:[],type:"MessagesFilter"},{id:-1253451181,predicate:"inputMessagesFilterRoundVideo",params:[],type:"MessagesFilter"},{id:-1997373508,predicate:"sendMessageRecordRoundAction",params:[],type:"SendMessageAction"},{id:608050278,predicate:"sendMessageUploadRoundAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-242427324,predicate:"upload.fileCdnRedirect",params:[{name:"dc_id",type:"int"},{name:"file_token",type:"bytes"},{name:"encryption_key",type:"bytes"},{name:"encryption_iv",type:"bytes"},{name:"file_hashes",type:"Vector"}],type:"upload.File"},{id:-290921362,predicate:"upload.cdnFileReuploadNeeded",params:[{name:"request_token",type:"bytes"}],type:"upload.CdnFile"},{id:-1449145777,predicate:"upload.cdnFile",params:[{name:"bytes",type:"bytes"}],type:"upload.CdnFile"},{id:-914167110,predicate:"cdnPublicKey",params:[{name:"dc_id",type:"int"},{name:"public_key",type:"string"}],type:"CdnPublicKey"},{id:1462101002,predicate:"cdnConfig",params:[{name:"public_keys",type:"Vector"}],type:"CdnConfig"},{id:-283684427,predicate:"pageBlockChannel",params:[{name:"channel",type:"Chat"}],type:"PageBlock"},{id:-892239370,predicate:"langPackString",params:[{name:"key",type:"string"},{name:"value",type:"string"}],type:"LangPackString"},{id:1816636575,predicate:"langPackStringPluralized",params:[{name:"flags",type:"#"},{name:"key",type:"string"},{name:"zero_value",type:"flags.0?string"},{name:"one_value",type:"flags.1?string"},{name:"two_value",type:"flags.2?string"},{name:"few_value",type:"flags.3?string"},{name:"many_value",type:"flags.4?string"},{name:"other_value",type:"string"}],type:"LangPackString"},{id:695856818,predicate:"langPackStringDeleted",params:[{name:"key",type:"string"}],type:"LangPackString"},{id:-209337866,predicate:"langPackDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"strings",type:"Vector"}],type:"LangPackDifference"},{id:-288727837,predicate:"langPackLanguage",params:[{name:"flags",type:"#"},{name:"official",type:"flags.0?true"},{name:"rtl",type:"flags.2?true"},{name:"beta",type:"flags.3?true"},{name:"name",type:"string"},{name:"native_name",type:"string"},{name:"lang_code",type:"string"},{name:"base_lang_code",type:"flags.1?string"},{name:"plural_code",type:"string"},{name:"strings_count",type:"int"},{name:"translated_count",type:"int"},{name:"translations_url",type:"string"}],type:"LangPackLanguage"},{id:1180041828,predicate:"updateLangPackTooLong",params:[{name:"lang_code",type:"string"}],type:"Update"},{id:1442983757,predicate:"updateLangPack",params:[{name:"difference",type:"LangPackDifference"}],type:"Update"},{id:885242707,predicate:"channelParticipantAdmin",params:[{name:"flags",type:"#"},{name:"can_edit",type:"flags.0?true"},{name:"self",type:"flags.1?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"flags.1?long"},{name:"promoted_by",type:"long"},{name:"date",type:"int"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.2?string"}],type:"ChannelParticipant"},{id:1844969806,predicate:"channelParticipantBanned",params:[{name:"flags",type:"#"},{name:"left",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"kicked_by",type:"long"},{name:"date",type:"int"},{name:"banned_rights",type:"ChatBannedRights"}],type:"ChannelParticipant"},{id:338142689,predicate:"channelParticipantsBanned",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:106343499,predicate:"channelParticipantsSearch",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-421545947,predicate:"channelAdminLogEventActionChangeTitle",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1427671598,predicate:"channelAdminLogEventActionChangeAbout",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1783299128,predicate:"channelAdminLogEventActionChangeUsername",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1129042607,predicate:"channelAdminLogEventActionChangePhoto",params:[{name:"prev_photo",type:"Photo"},{name:"new_photo",type:"Photo"}],type:"ChannelAdminLogEventAction"},{id:460916654,predicate:"channelAdminLogEventActionToggleInvites",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:648939889,predicate:"channelAdminLogEventActionToggleSignatures",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-370660328,predicate:"channelAdminLogEventActionUpdatePinned",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1889215493,predicate:"channelAdminLogEventActionEditMessage",params:[{name:"prev_message",type:"Message"},{name:"new_message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1121994683,predicate:"channelAdminLogEventActionDeleteMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:405815507,predicate:"channelAdminLogEventActionParticipantJoin",params:[],type:"ChannelAdminLogEventAction"},{id:-124291086,predicate:"channelAdminLogEventActionParticipantLeave",params:[],type:"ChannelAdminLogEventAction"},{id:-484690728,predicate:"channelAdminLogEventActionParticipantInvite",params:[{name:"participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-422036098,predicate:"channelAdminLogEventActionParticipantToggleBan",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-714643696,predicate:"channelAdminLogEventActionParticipantToggleAdmin",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:531458253,predicate:"channelAdminLogEvent",params:[{name:"id",type:"long"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"action",type:"ChannelAdminLogEventAction"}],type:"ChannelAdminLogEvent"},{id:-309659827,predicate:"channels.adminLogResults",params:[{name:"events",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.AdminLogResults"},{id:-368018716,predicate:"channelAdminLogEventsFilter",params:[{name:"flags",type:"#"},{name:"join",type:"flags.0?true"},{name:"leave",type:"flags.1?true"},{name:"invite",type:"flags.2?true"},{name:"ban",type:"flags.3?true"},{name:"unban",type:"flags.4?true"},{name:"kick",type:"flags.5?true"},{name:"unkick",type:"flags.6?true"},{name:"promote",type:"flags.7?true"},{name:"demote",type:"flags.8?true"},{name:"info",type:"flags.9?true"},{name:"settings",type:"flags.10?true"},{name:"pinned",type:"flags.11?true"},{name:"edit",type:"flags.12?true"},{name:"delete",type:"flags.13?true"},{name:"group_call",type:"flags.14?true"},{name:"invites",type:"flags.15?true"},{name:"send",type:"flags.16?true"},{name:"forums",type:"flags.17?true"}],type:"ChannelAdminLogEventsFilter"},{id:511092620,predicate:"topPeerCategoryPhoneCalls",params:[],type:"TopPeerCategory"},{id:-2143067670,predicate:"pageBlockAudio",params:[{name:"audio_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1558266229,predicate:"popularContact",params:[{name:"client_id",type:"long"},{name:"importers",type:"int"}],type:"PopularContact"},{id:1200788123,predicate:"messageActionScreenshotTaken",params:[],type:"MessageAction"},{id:-1634752813,predicate:"messages.favedStickersNotModified",params:[],type:"messages.FavedStickers"},{id:750063767,predicate:"messages.favedStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"}],type:"messages.FavedStickers"},{id:-451831443,predicate:"updateFavedStickers",params:[],type:"Update"},{id:-366410403,predicate:"updateChannelReadMessagesContents",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"messages",type:"Vector"}],type:"Update"},{id:-1040652646,predicate:"inputMessagesFilterMyMentions",params:[],type:"MessagesFilter"},{id:1887741886,predicate:"updateContactsReset",params:[],type:"Update"},{id:-1312568665,predicate:"channelAdminLogEventActionChangeStickerSet",params:[{name:"prev_stickerset",type:"InputStickerSet"},{name:"new_stickerset",type:"InputStickerSet"}],type:"ChannelAdminLogEventAction"},{id:-85549226,predicate:"messageActionCustomAction",params:[{name:"message",type:"string"}],type:"MessageAction"},{id:178373535,predicate:"inputPaymentCredentialsApplePay",params:[{name:"payment_data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-419271411,predicate:"inputMessagesFilterGeo",params:[],type:"MessagesFilter"},{id:-530392189,predicate:"inputMessagesFilterContacts",params:[],type:"MessagesFilter"},{id:-1304443240,predicate:"updateChannelAvailableMessages",params:[{name:"channel_id",type:"long"},{name:"available_min_id",type:"int"}],type:"Update"},{id:1599903217,predicate:"channelAdminLogEventActionTogglePreHistoryHidden",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-1759532989,predicate:"inputMediaGeoLive",params:[{name:"flags",type:"#"},{name:"stopped",type:"flags.0?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.2?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"}],type:"InputMedia"},{id:-1186937242,predicate:"messageMediaGeoLive",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"int"},{name:"proximity_notification_radius",type:"flags.1?int"}],type:"MessageMedia"},{id:1189204285,predicate:"recentMeUrlUnknown",params:[{name:"url",type:"string"}],type:"RecentMeUrl"},{id:-1188296222,predicate:"recentMeUrlUser",params:[{name:"url",type:"string"},{name:"user_id",type:"long"}],type:"RecentMeUrl"},{id:-1294306862,predicate:"recentMeUrlChat",params:[{name:"url",type:"string"},{name:"chat_id",type:"long"}],type:"RecentMeUrl"},{id:-347535331,predicate:"recentMeUrlChatInvite",params:[{name:"url",type:"string"},{name:"chat_invite",type:"ChatInvite"}],type:"RecentMeUrl"},{id:-1140172836,predicate:"recentMeUrlStickerSet",params:[{name:"url",type:"string"},{name:"set",type:"StickerSetCovered"}],type:"RecentMeUrl"},{id:235081943,predicate:"help.recentMeUrls",params:[{name:"urls",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"help.RecentMeUrls"},{id:-266911767,predicate:"channels.channelParticipantsNotModified",params:[],type:"channels.ChannelParticipants"},{id:1951620897,predicate:"messages.messagesNotModified",params:[{name:"count",type:"int"}],type:"messages.Messages"},{id:482797855,predicate:"inputSingleMedia",params:[{name:"flags",type:"#"},{name:"media",type:"InputMedia"},{name:"random_id",type:"long"},{name:"message",type:"string"},{name:"entities",type:"flags.0?Vector"}],type:"InputSingleMedia"},{id:-1493633966,predicate:"webAuthorization",params:[{name:"hash",type:"long"},{name:"bot_id",type:"long"},{name:"domain",type:"string"},{name:"browser",type:"string"},{name:"platform",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"region",type:"string"}],type:"WebAuthorization"},{id:-313079300,predicate:"account.webAuthorizations",params:[{name:"authorizations",type:"Vector"},{name:"users",type:"Vector"}],type:"account.WebAuthorizations"},{id:-1502174430,predicate:"inputMessageID",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-1160215659,predicate:"inputMessageReplyTo",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-2037963464,predicate:"inputMessagePinned",params:[],type:"InputMessage"},{id:-1687559349,predicate:"messageEntityPhone",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1280209983,predicate:"messageEntityCashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1410748418,predicate:"messageActionBotAllowed",params:[{name:"domain",type:"string"}],type:"MessageAction"},{id:-55902537,predicate:"inputDialogPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputDialogPeer"},{id:-445792507,predicate:"dialogPeer",params:[{name:"peer",type:"Peer"}],type:"DialogPeer"},{id:223655517,predicate:"messages.foundStickerSetsNotModified",params:[],type:"messages.FoundStickerSets"},{id:-1963942446,predicate:"messages.foundStickerSets",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.FoundStickerSets"},{id:-207944868,predicate:"fileHash",params:[{name:"offset",type:"long"},{name:"limit",type:"int"},{name:"hash",type:"bytes"}],type:"FileHash"},{id:-104284986,predicate:"webDocumentNoProxy",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:1968737087,predicate:"inputClientProxy",params:[{name:"address",type:"string"},{name:"port",type:"int"}],type:"InputClientProxy"},{id:-483352705,predicate:"help.termsOfServiceUpdateEmpty",params:[{name:"expires",type:"int"}],type:"help.TermsOfServiceUpdate"},{id:686618977,predicate:"help.termsOfServiceUpdate",params:[{name:"expires",type:"int"},{name:"terms_of_service",type:"help.TermsOfService"}],type:"help.TermsOfServiceUpdate"},{id:859091184,predicate:"inputSecureFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"InputSecureFile"},{id:1399317950,predicate:"inputSecureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputSecureFile"},{id:-876089816,predicate:"inputSecureFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:1679398724,predicate:"secureFileEmpty",params:[],type:"SecureFile"},{id:2097791614,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"long"},{name:"dc_id",type:"int"},{name:"date",type:"int"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureFile"},{id:-1964327229,predicate:"secureData",params:[{name:"data",type:"bytes"},{name:"data_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureData"},{id:2103482845,predicate:"securePlainPhone",params:[{name:"phone",type:"string"}],type:"SecurePlainData"},{id:569137759,predicate:"securePlainEmail",params:[{name:"email",type:"string"}],type:"SecurePlainData"},{id:-1658158621,predicate:"secureValueTypePersonalDetails",params:[],type:"SecureValueType"},{id:1034709504,predicate:"secureValueTypePassport",params:[],type:"SecureValueType"},{id:115615172,predicate:"secureValueTypeDriverLicense",params:[],type:"SecureValueType"},{id:-1596951477,predicate:"secureValueTypeIdentityCard",params:[],type:"SecureValueType"},{id:-1717268701,predicate:"secureValueTypeInternalPassport",params:[],type:"SecureValueType"},{id:-874308058,predicate:"secureValueTypeAddress",params:[],type:"SecureValueType"},{id:-63531698,predicate:"secureValueTypeUtilityBill",params:[],type:"SecureValueType"},{id:-1995211763,predicate:"secureValueTypeBankStatement",params:[],type:"SecureValueType"},{id:-1954007928,predicate:"secureValueTypeRentalAgreement",params:[],type:"SecureValueType"},{id:-1713143702,predicate:"secureValueTypePassportRegistration",params:[],type:"SecureValueType"},{id:-368907213,predicate:"secureValueTypeTemporaryRegistration",params:[],type:"SecureValueType"},{id:-1289704741,predicate:"secureValueTypePhone",params:[],type:"SecureValueType"},{id:-1908627474,predicate:"secureValueTypeEmail",params:[],type:"SecureValueType"},{id:411017418,predicate:"secureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?SecureFile"},{name:"reverse_side",type:"flags.2?SecureFile"},{name:"selfie",type:"flags.3?SecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"},{name:"hash",type:"bytes"}],type:"SecureValue"},{id:-618540889,predicate:"inputSecureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?InputSecureFile"},{name:"reverse_side",type:"flags.2?InputSecureFile"},{name:"selfie",type:"flags.3?InputSecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"}],type:"InputSecureValue"},{id:-316748368,predicate:"secureValueHash",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"}],type:"SecureValueHash"},{id:-391902247,predicate:"secureValueErrorData",params:[{name:"type",type:"SecureValueType"},{name:"data_hash",type:"bytes"},{name:"field",type:"string"},{name:"text",type:"string"}],type:"SecureValueError"},{id:12467706,predicate:"secureValueErrorFrontSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2037765467,predicate:"secureValueErrorReverseSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-449327402,predicate:"secureValueErrorSelfie",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:2054162547,predicate:"secureValueErrorFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:1717706985,predicate:"secureValueErrorFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:871426631,predicate:"secureCredentialsEncrypted",params:[{name:"data",type:"bytes"},{name:"hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureCredentialsEncrypted"},{id:-1389486888,predicate:"account.authorizationForm",params:[{name:"flags",type:"#"},{name:"required_types",type:"Vector"},{name:"values",type:"Vector"},{name:"errors",type:"Vector"},{name:"users",type:"Vector"},{name:"privacy_policy_url",type:"flags.0?string"}],type:"account.AuthorizationForm"},{id:-2128640689,predicate:"account.sentEmailCode",params:[{name:"email_pattern",type:"string"},{name:"length",type:"int"}],type:"account.SentEmailCode"},{id:455635795,predicate:"messageActionSecureValuesSentMe",params:[{name:"values",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"MessageAction"},{id:-648257196,predicate:"messageActionSecureValuesSent",params:[{name:"types",type:"Vector"}],type:"MessageAction"},{id:1722786150,predicate:"help.deepLinkInfoEmpty",params:[],type:"help.DeepLinkInfo"},{id:1783556146,predicate:"help.deepLinkInfo",params:[{name:"flags",type:"#"},{name:"update_app",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"help.DeepLinkInfo"},{id:289586518,predicate:"savedPhoneContact",params:[{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"date",type:"int"}],type:"SavedContact"},{id:1304052993,predicate:"account.takeout",params:[{name:"id",type:"long"}],type:"account.Takeout"},{id:700340377,predicate:"inputTakeoutFileLocation",params:[],type:"InputFileLocation"},{id:-513517117,predicate:"updateDialogUnreadMark",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-253500010,predicate:"messages.dialogsNotModified",params:[{name:"count",type:"int"}],type:"messages.Dialogs"},{id:-1625153079,predicate:"inputWebFileGeoPointLocation",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"access_hash",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"zoom",type:"int"},{name:"scale",type:"int"}],type:"InputWebFileLocation"},{id:-1255369827,predicate:"contacts.topPeersDisabled",params:[],type:"contacts.TopPeers"},{id:-1685456582,predicate:"inputReportReasonCopyright",params:[],type:"ReportReason"},{id:-732254058,predicate:"passwordKdfAlgoUnknown",params:[],type:"PasswordKdfAlgo"},{id:4883767,predicate:"securePasswordKdfAlgoUnknown",params:[],type:"SecurePasswordKdfAlgo"},{id:-1141711456,predicate:"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:-2042159726,predicate:"securePasswordKdfAlgoSHA512",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:354925740,predicate:"secureSecretSettings",params:[{name:"secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_secret",type:"bytes"},{name:"secure_secret_id",type:"long"}],type:"SecureSecretSettings"},{id:982592842,predicate:"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow",params:[{name:"salt1",type:"bytes"},{name:"salt2",type:"bytes"},{name:"g",type:"int"},{name:"p",type:"bytes"}],type:"PasswordKdfAlgo"},{id:-1736378792,predicate:"inputCheckPasswordEmpty",params:[],type:"InputCheckPasswordSRP"},{id:-763367294,predicate:"inputCheckPasswordSRP",params:[{name:"srp_id",type:"long"},{name:"A",type:"bytes"},{name:"M1",type:"bytes"}],type:"InputCheckPasswordSRP"},{id:-2036501105,predicate:"secureValueError",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-1592506512,predicate:"secureValueErrorTranslationFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:878931416,predicate:"secureValueErrorTranslationFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2103600678,predicate:"secureRequiredType",params:[{name:"flags",type:"#"},{name:"native_names",type:"flags.0?true"},{name:"selfie_required",type:"flags.1?true"},{name:"translation_required",type:"flags.2?true"},{name:"type",type:"SecureValueType"}],type:"SecureRequiredType"},{id:41187252,predicate:"secureRequiredTypeOneOf",params:[{name:"types",type:"Vector"}],type:"SecureRequiredType"},{id:-1078332329,predicate:"help.passportConfigNotModified",params:[],type:"help.PassportConfig"},{id:-1600596305,predicate:"help.passportConfig",params:[{name:"hash",type:"int"},{name:"countries_langs",type:"DataJSON"}],type:"help.PassportConfig"},{id:488313413,predicate:"inputAppEvent",params:[{name:"time",type:"double"},{name:"type",type:"string"},{name:"peer",type:"long"},{name:"data",type:"JSONValue"}],type:"InputAppEvent"},{id:-1059185703,predicate:"jsonObjectValue",params:[{name:"key",type:"string"},{name:"value",type:"JSONValue"}],type:"JSONObjectValue"},{id:1064139624,predicate:"jsonNull",params:[],type:"JSONValue"},{id:-952869270,predicate:"jsonBool",params:[{name:"value",type:"Bool"}],type:"JSONValue"},{id:736157604,predicate:"jsonNumber",params:[{name:"value",type:"double"}],type:"JSONValue"},{id:-1222740358,predicate:"jsonString",params:[{name:"value",type:"string"}],type:"JSONValue"},{id:-146520221,predicate:"jsonArray",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1715350371,predicate:"jsonObject",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1311015810,predicate:"inputNotifyBroadcasts",params:[],type:"InputNotifyPeer"},{id:-703403793,predicate:"notifyBroadcasts",params:[],type:"NotifyPeer"},{id:-311786236,predicate:"textSubscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-939827711,predicate:"textSuperscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:55281185,predicate:"textMarked",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:483104362,predicate:"textPhone",params:[{name:"text",type:"RichText"},{name:"phone",type:"string"}],type:"RichText"},{id:136105807,predicate:"textImage",params:[{name:"document_id",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"RichText"},{id:504660880,predicate:"pageBlockKicker",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:878078826,predicate:"pageTableCell",params:[{name:"flags",type:"#"},{name:"header",type:"flags.0?true"},{name:"align_center",type:"flags.3?true"},{name:"align_right",type:"flags.4?true"},{name:"valign_middle",type:"flags.5?true"},{name:"valign_bottom",type:"flags.6?true"},{name:"text",type:"flags.7?RichText"},{name:"colspan",type:"flags.1?int"},{name:"rowspan",type:"flags.2?int"}],type:"PageTableCell"},{id:-524237339,predicate:"pageTableRow",params:[{name:"cells",type:"Vector"}],type:"PageTableRow"},{id:-1085412734,predicate:"pageBlockTable",params:[{name:"flags",type:"#"},{name:"bordered",type:"flags.0?true"},{name:"striped",type:"flags.1?true"},{name:"title",type:"RichText"},{name:"rows",type:"Vector"}],type:"PageBlock"},{id:1869903447,predicate:"pageCaption",params:[{name:"text",type:"RichText"},{name:"credit",type:"RichText"}],type:"PageCaption"},{id:-1188055347,predicate:"pageListItemText",params:[{name:"text",type:"RichText"}],type:"PageListItem"},{id:635466748,predicate:"pageListItemBlocks",params:[{name:"blocks",type:"Vector"}],type:"PageListItem"},{id:1577484359,predicate:"pageListOrderedItemText",params:[{name:"num",type:"string"},{name:"text",type:"RichText"}],type:"PageListOrderedItem"},{id:-1730311882,predicate:"pageListOrderedItemBlocks",params:[{name:"num",type:"string"},{name:"blocks",type:"Vector"}],type:"PageListOrderedItem"},{id:-1702174239,predicate:"pageBlockOrderedList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:1987480557,predicate:"pageBlockDetails",params:[{name:"flags",type:"#"},{name:"open",type:"flags.0?true"},{name:"blocks",type:"Vector"},{name:"title",type:"RichText"}],type:"PageBlock"},{id:-1282352120,predicate:"pageRelatedArticle",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"title",type:"flags.0?string"},{name:"description",type:"flags.1?string"},{name:"photo_id",type:"flags.2?long"},{name:"author",type:"flags.3?string"},{name:"published_date",type:"flags.4?int"}],type:"PageRelatedArticle"},{id:370236054,predicate:"pageBlockRelatedArticles",params:[{name:"title",type:"RichText"},{name:"articles",type:"Vector"}],type:"PageBlock"},{id:-1538310410,predicate:"pageBlockMap",params:[{name:"geo",type:"GeoPoint"},{name:"zoom",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-1738178803,predicate:"page",params:[{name:"flags",type:"#"},{name:"part",type:"flags.0?true"},{name:"rtl",type:"flags.1?true"},{name:"v2",type:"flags.2?true"},{name:"url",type:"string"},{name:"blocks",type:"Vector"},{name:"photos",type:"Vector"},{name:"documents",type:"Vector"},{name:"views",type:"flags.3?int"}],type:"Page"},{id:-610373422,predicate:"inputPrivacyKeyPhoneP2P",params:[],type:"InputPrivacyKey"},{id:961092808,predicate:"privacyKeyPhoneP2P",params:[],type:"PrivacyKey"},{id:894777186,predicate:"textAnchor",params:[{name:"text",type:"RichText"},{name:"name",type:"string"}],type:"RichText"},{id:-1945767479,predicate:"help.supportName",params:[{name:"name",type:"string"}],type:"help.SupportName"},{id:-206688531,predicate:"help.userInfoEmpty",params:[],type:"help.UserInfo"},{id:32192344,predicate:"help.userInfo",params:[{name:"message",type:"string"},{name:"entities",type:"Vector"},{name:"author",type:"string"},{name:"date",type:"int"}],type:"help.UserInfo"},{id:-202219658,predicate:"messageActionContactSignUp",params:[],type:"MessageAction"},{id:-1398708869,predicate:"updateMessagePoll",params:[{name:"flags",type:"#"},{name:"poll_id",type:"long"},{name:"poll",type:"flags.0?Poll"},{name:"results",type:"PollResults"}],type:"Update"},{id:1823064809,predicate:"pollAnswer",params:[{name:"text",type:"string"},{name:"option",type:"bytes"}],type:"PollAnswer"},{id:-2032041631,predicate:"poll",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"closed",type:"flags.0?true"},{name:"public_voters",type:"flags.1?true"},{name:"multiple_choice",type:"flags.2?true"},{name:"quiz",type:"flags.3?true"},{name:"question",type:"string"},{name:"answers",type:"Vector"},{name:"close_period",type:"flags.4?int"},{name:"close_date",type:"flags.5?int"}],type:"Poll"},{id:997055186,predicate:"pollAnswerVoters",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"correct",type:"flags.1?true"},{name:"option",type:"bytes"},{name:"voters",type:"int"}],type:"PollAnswerVoters"},{id:-591909213,predicate:"pollResults",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"results",type:"flags.1?Vector"},{name:"total_voters",type:"flags.2?int"},{name:"recent_voters",type:"flags.3?Vector"},{name:"solution",type:"flags.4?string"},{name:"solution_entities",type:"flags.4?Vector"}],type:"PollResults"},{id:261416433,predicate:"inputMediaPoll",params:[{name:"flags",type:"#"},{name:"poll",type:"Poll"},{name:"correct_answers",type:"flags.0?Vector"},{name:"solution",type:"flags.1?string"},{name:"solution_entities",type:"flags.1?Vector"}],type:"InputMedia"},{id:1272375192,predicate:"messageMediaPoll",params:[{name:"poll",type:"Poll"},{name:"results",type:"PollResults"}],type:"MessageMedia"},{id:-264117680,predicate:"chatOnlines",params:[{name:"onlines",type:"int"}],type:"ChatOnlines"},{id:1202287072,predicate:"statsURL",params:[{name:"url",type:"string"}],type:"StatsURL"},{id:-525288402,predicate:"photoStrippedSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:1605510357,predicate:"chatAdminRights",params:[{name:"flags",type:"#"},{name:"change_info",type:"flags.0?true"},{name:"post_messages",type:"flags.1?true"},{name:"edit_messages",type:"flags.2?true"},{name:"delete_messages",type:"flags.3?true"},{name:"ban_users",type:"flags.4?true"},{name:"invite_users",type:"flags.5?true"},{name:"pin_messages",type:"flags.7?true"},{name:"add_admins",type:"flags.9?true"},{name:"anonymous",type:"flags.10?true"},{name:"manage_call",type:"flags.11?true"},{name:"other",type:"flags.12?true"},{name:"manage_topics",type:"flags.13?true"}],type:"ChatAdminRights"},{id:-1626209256,predicate:"chatBannedRights",params:[{name:"flags",type:"#"},{name:"view_messages",type:"flags.0?true"},{name:"send_messages",type:"flags.1?true"},{name:"send_media",type:"flags.2?true"},{name:"send_stickers",type:"flags.3?true"},{name:"send_gifs",type:"flags.4?true"},{name:"send_games",type:"flags.5?true"},{name:"send_inline",type:"flags.6?true"},{name:"embed_links",type:"flags.7?true"},{name:"send_polls",type:"flags.8?true"},{name:"change_info",type:"flags.10?true"},{name:"invite_users",type:"flags.15?true"},{name:"pin_messages",type:"flags.17?true"},{name:"manage_topics",type:"flags.18?true"},{name:"until_date",type:"int"}],type:"ChatBannedRights"},{id:1421875280,predicate:"updateChatDefaultBannedRights",params:[{name:"peer",type:"Peer"},{name:"default_banned_rights",type:"ChatBannedRights"},{name:"version",type:"int"}],type:"Update"},{id:-433014407,predicate:"inputWallPaper",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputWallPaper"},{id:1913199744,predicate:"inputWallPaperSlug",params:[{name:"slug",type:"string"}],type:"InputWallPaper"},{id:-1150621555,predicate:"channelParticipantsContacts",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:771095562,predicate:"channelAdminLogEventActionDefaultBannedRights",params:[{name:"prev_banned_rights",type:"ChatBannedRights"},{name:"new_banned_rights",type:"ChatBannedRights"}],type:"ChannelAdminLogEventAction"},{id:-1895328189,predicate:"channelAdminLogEventActionStopPoll",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:471437699,predicate:"account.wallPapersNotModified",params:[],type:"account.WallPapers"},{id:-842824308,predicate:"account.wallPapers",params:[{name:"hash",type:"long"},{name:"wallpapers",type:"Vector"}],type:"account.WallPapers"},{id:-1973130814,predicate:"codeSettings",params:[{name:"flags",type:"#"},{name:"allow_flashcall",type:"flags.0?true"},{name:"current_number",type:"flags.1?true"},{name:"allow_app_hash",type:"flags.4?true"},{name:"allow_missed_call",type:"flags.5?true"},{name:"logout_tokens",type:"flags.6?Vector"}],type:"CodeSettings"},{id:499236004,predicate:"wallPaperSettings",params:[{name:"flags",type:"#"},{name:"blur",type:"flags.1?true"},{name:"motion",type:"flags.2?true"},{name:"background_color",type:"flags.0?int"},{name:"second_background_color",type:"flags.4?int"},{name:"third_background_color",type:"flags.5?int"},{name:"fourth_background_color",type:"flags.6?int"},{name:"intensity",type:"flags.3?int"},{name:"rotation",type:"flags.4?int"}],type:"WallPaperSettings"},{id:-1896171181,predicate:"autoDownloadSettings",params:[{name:"flags",type:"#"},{name:"disabled",type:"flags.0?true"},{name:"video_preload_large",type:"flags.1?true"},{name:"audio_preload_next",type:"flags.2?true"},{name:"phonecalls_less_data",type:"flags.3?true"},{name:"photo_size_max",type:"int"},{name:"video_size_max",type:"long"},{name:"file_size_max",type:"long"},{name:"video_upload_maxbitrate",type:"int"}],type:"AutoDownloadSettings"},{id:1674235686,predicate:"account.autoDownloadSettings",params:[{name:"low",type:"AutoDownloadSettings"},{name:"medium",type:"AutoDownloadSettings"},{name:"high",type:"AutoDownloadSettings"}],type:"account.AutoDownloadSettings"},{id:-709641735,predicate:"emojiKeyword",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:594408994,predicate:"emojiKeywordDeleted",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:1556570557,predicate:"emojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"keywords",type:"Vector"}],type:"EmojiKeywordsDifference"},{id:-1519029347,predicate:"emojiURL",params:[{name:"url",type:"string"}],type:"EmojiURL"},{id:-1275374751,predicate:"emojiLanguage",params:[{name:"lang_code",type:"string"}],type:"EmojiLanguage"},{id:-1529000952,predicate:"inputPrivacyKeyForwards",params:[],type:"InputPrivacyKey"},{id:1777096355,predicate:"privacyKeyForwards",params:[],type:"PrivacyKey"},{id:1461304012,predicate:"inputPrivacyKeyProfilePhoto",params:[],type:"InputPrivacyKey"},{id:-1777000467,predicate:"privacyKeyProfilePhoto",params:[],type:"PrivacyKey"},{id:1075322878,predicate:"inputPhotoFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:-667654413,predicate:"inputPhotoLegacyFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"}],type:"InputFileLocation"},{id:925204121,predicate:"inputPeerPhotoFileLocation",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"photo_id",type:"long"}],type:"InputFileLocation"},{id:-1652231205,predicate:"inputStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb_version",type:"int"}],type:"InputFileLocation"},{id:-11252123,predicate:"folder",params:[{name:"flags",type:"#"},{name:"autofill_new_broadcasts",type:"flags.0?true"},{name:"autofill_public_groups",type:"flags.1?true"},{name:"autofill_new_correspondents",type:"flags.2?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"photo",type:"flags.3?ChatPhoto"}],type:"Folder"},{id:1908216652,predicate:"dialogFolder",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"folder",type:"Folder"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"unread_muted_peers_count",type:"int"},{name:"unread_unmuted_peers_count",type:"int"},{name:"unread_muted_messages_count",type:"int"},{name:"unread_unmuted_messages_count",type:"int"}],type:"Dialog"},{id:1684014375,predicate:"inputDialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"InputDialogPeer"},{id:1363483106,predicate:"dialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"DialogPeer"},{id:-70073706,predicate:"inputFolderPeer",params:[{name:"peer",type:"InputPeer"},{name:"folder_id",type:"int"}],type:"InputFolderPeer"},{id:-373643672,predicate:"folderPeer",params:[{name:"peer",type:"Peer"},{name:"folder_id",type:"int"}],type:"FolderPeer"},{id:422972864,predicate:"updateFolderPeers",params:[{name:"folder_peers",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:497305826,predicate:"inputUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputUser"},{id:1536380829,predicate:"inputChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputChannel"},{id:-1468331492,predicate:"inputPeerUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputPeer"},{id:-1121318848,predicate:"inputPeerChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputPeer"},{id:55761658,predicate:"inputPrivacyKeyPhoneNumber",params:[],type:"InputPrivacyKey"},{id:-778378131,predicate:"privacyKeyPhoneNumber",params:[],type:"PrivacyKey"},{id:-1472172887,predicate:"topPeerCategoryForwardUsers",params:[],type:"TopPeerCategory"},{id:-68239120,predicate:"topPeerCategoryForwardChats",params:[],type:"TopPeerCategory"},{id:84703944,predicate:"channelAdminLogEventActionChangeLinkedChat",params:[{name:"prev_value",type:"long"},{name:"new_value",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-398136321,predicate:"messages.searchCounter",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"filter",type:"MessagesFilter"},{name:"count",type:"int"}],type:"messages.SearchCounter"},{id:280464681,predicate:"keyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.0?string"},{name:"url",type:"string"},{name:"button_id",type:"int"}],type:"KeyboardButton"},{id:-802258988,predicate:"inputKeyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.1?string"},{name:"url",type:"string"},{name:"bot",type:"InputUser"}],type:"KeyboardButton"},{id:-1831650802,predicate:"urlAuthResultRequest",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"bot",type:"User"},{name:"domain",type:"string"}],type:"UrlAuthResult"},{id:-1886646706,predicate:"urlAuthResultAccepted",params:[{name:"url",type:"string"}],type:"UrlAuthResult"},{id:-1445536993,predicate:"urlAuthResultDefault",params:[],type:"UrlAuthResult"},{id:-2079962673,predicate:"inputPrivacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-380694650,predicate:"inputPrivacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:1796427406,predicate:"privacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1103656293,predicate:"privacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:-1672577397,predicate:"messageEntityUnderline",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1090087980,predicate:"messageEntityStrike",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:34469328,predicate:"messageEntityBlockquote",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1786671974,predicate:"updatePeerSettings",params:[{name:"peer",type:"Peer"},{name:"settings",type:"PeerSettings"}],type:"Update"},{id:-1078612597,predicate:"channelLocationEmpty",params:[],type:"ChannelLocation"},{id:547062491,predicate:"channelLocation",params:[{name:"geo_point",type:"GeoPoint"},{name:"address",type:"string"}],type:"ChannelLocation"},{id:-901375139,predicate:"peerLocated",params:[{name:"peer",type:"Peer"},{name:"expires",type:"int"},{name:"distance",type:"int"}],type:"PeerLocated"},{id:-1263546448,predicate:"updatePeerLocated",params:[{name:"peers",type:"Vector"}],type:"Update"},{id:241923758,predicate:"channelAdminLogEventActionChangeLocation",params:[{name:"prev_value",type:"ChannelLocation"},{name:"new_value",type:"ChannelLocation"}],type:"ChannelAdminLogEventAction"},{id:-606798099,predicate:"inputReportReasonGeoIrrelevant",params:[],type:"ReportReason"},{id:1401984889,predicate:"channelAdminLogEventActionToggleSlowMode",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:1148485274,predicate:"auth.authorizationSignUpRequired",params:[{name:"flags",type:"#"},{name:"terms_of_service",type:"flags.0?help.TermsOfService"}],type:"auth.Authorization"},{id:-666824391,predicate:"payments.paymentVerificationNeeded",params:[{name:"url",type:"string"}],type:"payments.PaymentResult"},{id:42402760,predicate:"inputStickerSetAnimatedEmoji",params:[],type:"InputStickerSet"},{id:967122427,predicate:"updateNewScheduledMessage",params:[{name:"message",type:"Message"}],type:"Update"},{id:-1870238482,predicate:"updateDeleteScheduledMessages",params:[{name:"peer",type:"Peer"},{name:"messages",type:"Vector"}],type:"Update"},{id:-797791052,predicate:"restrictionReason",params:[{name:"platform",type:"string"},{name:"reason",type:"string"},{name:"text",type:"string"}],type:"RestrictionReason"},{id:1012306921,predicate:"inputTheme",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputTheme"},{id:-175567375,predicate:"inputThemeSlug",params:[{name:"slug",type:"string"}],type:"InputTheme"},{id:-1609668650,predicate:"theme",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"for_chat",type:"flags.5?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?Document"},{name:"settings",type:"flags.3?Vector"},{name:"emoticon",type:"flags.6?string"},{name:"installs_count",type:"flags.4?int"}],type:"Theme"},{id:-199313886,predicate:"account.themesNotModified",params:[],type:"account.Themes"},{id:-1707242387,predicate:"account.themes",params:[{name:"hash",type:"long"},{name:"themes",type:"Vector"}],type:"account.Themes"},{id:-2112423005,predicate:"updateTheme",params:[{name:"theme",type:"Theme"}],type:"Update"},{id:-786326563,predicate:"inputPrivacyKeyAddedByPhone",params:[],type:"InputPrivacyKey"},{id:1124062251,predicate:"privacyKeyAddedByPhone",params:[],type:"PrivacyKey"},{id:-2027964103,predicate:"updateGeoLiveViewed",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"}],type:"Update"},{id:1448076945,predicate:"updateLoginToken",params:[],type:"Update"},{id:1654593920,predicate:"auth.loginToken",params:[{name:"expires",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:110008598,predicate:"auth.loginTokenMigrateTo",params:[{name:"dc_id",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:957176926,predicate:"auth.loginTokenSuccess",params:[{name:"authorization",type:"auth.Authorization"}],type:"auth.LoginToken"},{id:1474462241,predicate:"account.contentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"},{name:"sensitive_can_change",type:"flags.1?true"}],type:"account.ContentSettings"},{id:-1456996667,predicate:"messages.inactiveChats",params:[{name:"dates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.InactiveChats"},{id:-1012849566,predicate:"baseThemeClassic",params:[],type:"BaseTheme"},{id:-69724536,predicate:"baseThemeDay",params:[],type:"BaseTheme"},{id:-1212997976,predicate:"baseThemeNight",params:[],type:"BaseTheme"},{id:1834973166,predicate:"baseThemeTinted",params:[],type:"BaseTheme"},{id:1527845466,predicate:"baseThemeArctic",params:[],type:"BaseTheme"},{id:-1770371538,predicate:"inputWallPaperNoFile",params:[{name:"id",type:"long"}],type:"InputWallPaper"},{id:-528465642,predicate:"wallPaperNoFile",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"default",type:"flags.1?true"},{name:"dark",type:"flags.4?true"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:-1881255857,predicate:"inputThemeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?InputWallPaper"},{name:"wallpaper_settings",type:"flags.1?WallPaperSettings"}],type:"InputThemeSettings"},{id:-94849324,predicate:"themeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?WallPaper"}],type:"ThemeSettings"},{id:1421174295,predicate:"webPageAttributeTheme",params:[{name:"flags",type:"#"},{name:"documents",type:"flags.0?Vector"},{name:"settings",type:"flags.1?ThemeSettings"}],type:"WebPageAttribute"},{id:274961865,predicate:"updateMessagePollVote",params:[{name:"poll_id",type:"long"},{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"qts",type:"int"}],type:"Update"},{id:886196148,predicate:"messageUserVote",params:[{name:"user_id",type:"long"},{name:"option",type:"bytes"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:1017491692,predicate:"messageUserVoteInputOption",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:-1973033641,predicate:"messageUserVoteMultiple",params:[{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:136574537,predicate:"messages.votesList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"votes",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.VotesList"},{id:-1144565411,predicate:"keyboardButtonRequestPoll",params:[{name:"flags",type:"#"},{name:"quiz",type:"flags.0?Bool"},{name:"text",type:"string"}],type:"KeyboardButton"},{id:1981704948,predicate:"messageEntityBankCard",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-177732982,predicate:"bankCardOpenUrl",params:[{name:"url",type:"string"},{name:"name",type:"string"}],type:"BankCardOpenUrl"},{id:1042605427,predicate:"payments.bankCardData",params:[{name:"title",type:"string"},{name:"open_urls",type:"Vector"}],type:"payments.BankCardData"},{id:-118740917,predicate:"peerSelfLocated",params:[{name:"expires",type:"int"}],type:"PeerLocated"},{id:1949890536,predicate:"dialogFilter",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"non_contacts",type:"flags.1?true"},{name:"groups",type:"flags.2?true"},{name:"broadcasts",type:"flags.3?true"},{name:"bots",type:"flags.4?true"},{name:"exclude_muted",type:"flags.11?true"},{name:"exclude_read",type:"flags.12?true"},{name:"exclude_archived",type:"flags.13?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"emoticon",type:"flags.25?string"},{name:"pinned_peers",type:"Vector"},{name:"include_peers",type:"Vector"},{name:"exclude_peers",type:"Vector"}],type:"DialogFilter"},{id:2004110666,predicate:"dialogFilterSuggested",params:[{name:"filter",type:"DialogFilter"},{name:"description",type:"string"}],type:"DialogFilterSuggested"},{id:654302845,predicate:"updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Update"},{id:-1512627963,predicate:"updateDialogFilterOrder",params:[{name:"order",type:"Vector"}],type:"Update"},{id:889491791,predicate:"updateDialogFilters",params:[],type:"Update"},{id:-1237848657,predicate:"statsDateRangeDays",params:[{name:"min_date",type:"int"},{name:"max_date",type:"int"}],type:"StatsDateRangeDays"},{id:-884757282,predicate:"statsAbsValueAndPrev",params:[{name:"current",type:"double"},{name:"previous",type:"double"}],type:"StatsAbsValueAndPrev"},{id:-875679776,predicate:"statsPercentValue",params:[{name:"part",type:"double"},{name:"total",type:"double"}],type:"StatsPercentValue"},{id:1244130093,predicate:"statsGraphAsync",params:[{name:"token",type:"string"}],type:"StatsGraph"},{id:-1092839390,predicate:"statsGraphError",params:[{name:"error",type:"string"}],type:"StatsGraph"},{id:-1901828938,predicate:"statsGraph",params:[{name:"flags",type:"#"},{name:"json",type:"DataJSON"},{name:"zoom_token",type:"flags.0?string"}],type:"StatsGraph"},{id:-1387279939,predicate:"messageInteractionCounters",params:[{name:"msg_id",type:"int"},{name:"views",type:"int"},{name:"forwards",type:"int"}],type:"MessageInteractionCounters"},{id:-1107852396,predicate:"stats.broadcastStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"followers",type:"StatsAbsValueAndPrev"},{name:"views_per_post",type:"StatsAbsValueAndPrev"},{name:"shares_per_post",type:"StatsAbsValueAndPrev"},{name:"enabled_notifications",type:"StatsPercentValue"},{name:"growth_graph",type:"StatsGraph"},{name:"followers_graph",type:"StatsGraph"},{name:"mute_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"interactions_graph",type:"StatsGraph"},{name:"iv_interactions_graph",type:"StatsGraph"},{name:"views_by_source_graph",type:"StatsGraph"},{name:"new_followers_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"recent_message_interactions",type:"Vector"}],type:"stats.BroadcastStats"},{id:-428884101,predicate:"inputMediaDice",params:[{name:"emoticon",type:"string"}],type:"InputMedia"},{id:1065280907,predicate:"messageMediaDice",params:[{name:"value",type:"int"},{name:"emoticon",type:"string"}],type:"MessageMedia"},{id:-427863538,predicate:"inputStickerSetDice",params:[{name:"emoticon",type:"string"}],type:"InputStickerSet"},{id:-1728664459,predicate:"help.promoDataEmpty",params:[{name:"expires",type:"int"}],type:"help.PromoData"},{id:-1942390465,predicate:"help.promoData",params:[{name:"flags",type:"#"},{name:"proxy",type:"flags.0?true"},{name:"expires",type:"int"},{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"psa_type",type:"flags.1?string"},{name:"psa_message",type:"flags.2?string"}],type:"help.PromoData"},{id:-567037804,predicate:"videoSize",params:[{name:"flags",type:"#"},{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"},{name:"video_start_ts",type:"flags.0?double"}],type:"VideoSize"},{id:643940105,predicate:"updatePhoneCallSignalingData",params:[{name:"phone_call_id",type:"long"},{name:"data",type:"bytes"}],type:"Update"},{id:1634294960,predicate:"chatInvitePeek",params:[{name:"chat",type:"Chat"},{name:"expires",type:"int"}],type:"ChatInvite"},{id:-1660637285,predicate:"statsGroupTopPoster",params:[{name:"user_id",type:"long"},{name:"messages",type:"int"},{name:"avg_chars",type:"int"}],type:"StatsGroupTopPoster"},{id:-682079097,predicate:"statsGroupTopAdmin",params:[{name:"user_id",type:"long"},{name:"deleted",type:"int"},{name:"kicked",type:"int"},{name:"banned",type:"int"}],type:"StatsGroupTopAdmin"},{id:1398765469,predicate:"statsGroupTopInviter",params:[{name:"user_id",type:"long"},{name:"invitations",type:"int"}],type:"StatsGroupTopInviter"},{id:-276825834,predicate:"stats.megagroupStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"members",type:"StatsAbsValueAndPrev"},{name:"messages",type:"StatsAbsValueAndPrev"},{name:"viewers",type:"StatsAbsValueAndPrev"},{name:"posters",type:"StatsAbsValueAndPrev"},{name:"growth_graph",type:"StatsGraph"},{name:"members_graph",type:"StatsGraph"},{name:"new_members_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"messages_graph",type:"StatsGraph"},{name:"actions_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"weekdays_graph",type:"StatsGraph"},{name:"top_posters",type:"Vector"},{name:"top_admins",type:"Vector"},{name:"top_inviters",type:"Vector"},{name:"users",type:"Vector"}],type:"stats.MegagroupStats"},{id:-1096616924,predicate:"globalPrivacySettings",params:[{name:"flags",type:"#"},{name:"archive_and_mute_new_noncontact_peers",type:"flags.0?Bool"}],type:"GlobalPrivacySettings"},{id:1667228533,predicate:"phoneConnectionWebrtc",params:[{name:"flags",type:"#"},{name:"turn",type:"flags.0?true"},{name:"stun",type:"flags.1?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"username",type:"string"},{name:"password",type:"string"}],type:"PhoneConnection"},{id:1107543535,predicate:"help.countryCode",params:[{name:"flags",type:"#"},{name:"country_code",type:"string"},{name:"prefixes",type:"flags.0?Vector"},{name:"patterns",type:"flags.1?Vector"}],type:"help.CountryCode"},{id:-1014526429,predicate:"help.country",params:[{name:"flags",type:"#"},{name:"hidden",type:"flags.0?true"},{name:"iso2",type:"string"},{name:"default_name",type:"string"},{name:"name",type:"flags.1?string"},{name:"country_codes",type:"Vector"}],type:"help.Country"},{id:-1815339214,predicate:"help.countriesListNotModified",params:[],type:"help.CountriesList"},{id:-2016381538,predicate:"help.countriesList",params:[{name:"countries",type:"Vector"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:1163625789,predicate:"messageViews",params:[{name:"flags",type:"#"},{name:"views",type:"flags.0?int"},{name:"forwards",type:"flags.1?int"},{name:"replies",type:"flags.2?MessageReplies"}],type:"MessageViews"},{id:-761649164,predicate:"updateChannelMessageForwards",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"forwards",type:"int"}],type:"Update"},{id:-96535659,predicate:"photoSizeProgressive",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"sizes",type:"Vector"}],type:"PhotoSize"},{id:-1228606141,predicate:"messages.messageViews",params:[{name:"views",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.MessageViews"},{id:-693004986,predicate:"updateReadChannelDiscussionInbox",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"},{name:"broadcast_id",type:"flags.0?long"},{name:"broadcast_post",type:"flags.0?int"}],type:"Update"},{id:1767677564,predicate:"updateReadChannelDiscussionOutbox",params:[{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Update"},{id:-1506535550,predicate:"messages.discussionMessage",params:[{name:"flags",type:"#"},{name:"messages",type:"Vector"},{name:"max_id",type:"flags.0?int"},{name:"read_inbox_max_id",type:"flags.1?int"},{name:"read_outbox_max_id",type:"flags.2?int"},{name:"unread_count",type:"int"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.DiscussionMessage"},{id:-1495959709,predicate:"messageReplyHeader",params:[{name:"flags",type:"#"},{name:"reply_to_scheduled",type:"flags.2?true"},{name:"forum_topic",type:"flags.3?true"},{name:"reply_to_msg_id",type:"int"},{name:"reply_to_peer_id",type:"flags.0?Peer"},{name:"reply_to_top_id",type:"flags.1?int"}],type:"MessageReplyHeader"},{id:-2083123262,predicate:"messageReplies",params:[{name:"flags",type:"#"},{name:"comments",type:"flags.0?true"},{name:"replies",type:"int"},{name:"replies_pts",type:"int"},{name:"recent_repliers",type:"flags.1?Vector"},{name:"channel_id",type:"flags.0?long"},{name:"max_id",type:"flags.2?int"},{name:"read_max_id",type:"flags.3?int"}],type:"MessageReplies"},{id:610945826,predicate:"updatePeerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"blocked",type:"Bool"}],type:"Update"},{id:-386039788,predicate:"peerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"date",type:"int"}],type:"PeerBlocked"},{id:-1937192669,predicate:"updateChannelUserTyping",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-1392895362,predicate:"inputMessageCallbackQuery",params:[{name:"id",type:"int"},{name:"query_id",type:"long"}],type:"InputMessage"},{id:453242886,predicate:"channelParticipantLeft",params:[{name:"peer",type:"Peer"}],type:"ChannelParticipant"},{id:-531931925,predicate:"channelParticipantsMentions",params:[{name:"flags",type:"#"},{name:"q",type:"flags.0?string"},{name:"top_msg_id",type:"flags.1?int"}],type:"ChannelParticipantsFilter"},{id:-309990731,predicate:"updatePinnedMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1538885128,predicate:"updatePinnedChannelMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:464520273,predicate:"inputMessagesFilterPinned",params:[],type:"MessagesFilter"},{id:-1986399595,predicate:"stats.messageStats",params:[{name:"views_graph",type:"StatsGraph"}],type:"stats.MessageStats"},{id:-1730095465,predicate:"messageActionGeoProximityReached",params:[{name:"from_id",type:"Peer"},{name:"to_id",type:"Peer"},{name:"distance",type:"int"}],type:"MessageAction"},{id:-668906175,predicate:"photoPathSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-651419003,predicate:"speakingInGroupCallAction",params:[],type:"SendMessageAction"},{id:2004925620,predicate:"groupCallDiscarded",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"duration",type:"int"}],type:"GroupCall"},{id:-711498484,predicate:"groupCall",params:[{name:"flags",type:"#"},{name:"join_muted",type:"flags.1?true"},{name:"can_change_join_muted",type:"flags.2?true"},{name:"join_date_asc",type:"flags.6?true"},{name:"schedule_start_subscribed",type:"flags.8?true"},{name:"can_start_video",type:"flags.9?true"},{name:"record_video_active",type:"flags.11?true"},{name:"rtmp_stream",type:"flags.12?true"},{name:"listeners_hidden",type:"flags.13?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"participants_count",type:"int"},{name:"title",type:"flags.3?string"},{name:"stream_dc_id",type:"flags.4?int"},{name:"record_start_date",type:"flags.5?int"},{name:"schedule_date",type:"flags.7?int"},{name:"unmuted_video_count",type:"flags.10?int"},{name:"unmuted_video_limit",type:"int"},{name:"version",type:"int"}],type:"GroupCall"},{id:-659913713,predicate:"inputGroupCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGroupCall"},{id:2047704898,predicate:"messageActionGroupCall",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"duration",type:"flags.0?int"}],type:"MessageAction"},{id:1345295095,predicate:"messageActionInviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-341428482,predicate:"groupCallParticipant",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"left",type:"flags.1?true"},{name:"can_self_unmute",type:"flags.2?true"},{name:"just_joined",type:"flags.4?true"},{name:"versioned",type:"flags.5?true"},{name:"min",type:"flags.8?true"},{name:"muted_by_you",type:"flags.9?true"},{name:"volume_by_admin",type:"flags.10?true"},{name:"self",type:"flags.12?true"},{name:"video_joined",type:"flags.15?true"},{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"active_date",type:"flags.3?int"},{name:"source",type:"int"},{name:"volume",type:"flags.7?int"},{name:"about",type:"flags.11?string"},{name:"raise_hand_rating",type:"flags.13?long"},{name:"video",type:"flags.6?GroupCallParticipantVideo"},{name:"presentation",type:"flags.14?GroupCallParticipantVideo"}],type:"GroupCallParticipant"},{id:-124097970,predicate:"updateChat",params:[{name:"chat_id",type:"long"}],type:"Update"},{id:-219423922,predicate:"updateGroupCallParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"Update"},{id:347227392,predicate:"updateGroupCall",params:[{name:"chat_id",type:"long"},{name:"call",type:"GroupCall"}],type:"Update"},{id:-1636664659,predicate:"phone.groupCall",params:[{name:"call",type:"GroupCall"},{name:"participants",type:"Vector"},{name:"participants_next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.GroupCall"},{id:-193506890,predicate:"phone.groupParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"version",type:"int"}],type:"phone.GroupParticipants"},{id:813821341,predicate:"inlineQueryPeerTypeSameBotPM",params:[],type:"InlineQueryPeerType"},{id:-2093215828,predicate:"inlineQueryPeerTypePM",params:[],type:"InlineQueryPeerType"},{id:-681130742,predicate:"inlineQueryPeerTypeChat",params:[],type:"InlineQueryPeerType"},{id:1589952067,predicate:"inlineQueryPeerTypeMegagroup",params:[],type:"InlineQueryPeerType"},{id:1664413338,predicate:"inlineQueryPeerTypeBroadcast",params:[],type:"InlineQueryPeerType"},{id:589338437,predicate:"channelAdminLogEventActionStartGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-610299584,predicate:"channelAdminLogEventActionDiscardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-115071790,predicate:"channelAdminLogEventActionParticipantMute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:-431740480,predicate:"channelAdminLogEventActionParticipantUnmute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1456906823,predicate:"channelAdminLogEventActionToggleGroupCallSetting",params:[{name:"join_muted",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-1966921727,predicate:"inputPaymentCredentialsGooglePay",params:[{name:"payment_token",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:375566091,predicate:"messages.historyImport",params:[{name:"id",type:"long"}],type:"messages.HistoryImport"},{id:-606432698,predicate:"sendMessageHistoryImportAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:1578088377,predicate:"messages.historyImportParsed",params:[{name:"flags",type:"#"},{name:"pm",type:"flags.0?true"},{name:"group",type:"flags.1?true"},{name:"title",type:"flags.2?string"}],type:"messages.HistoryImportParsed"},{id:-170010905,predicate:"inputReportReasonFake",params:[],type:"ReportReason"},{id:-275956116,predicate:"messages.affectedFoundMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"},{name:"messages",type:"Vector"}],type:"messages.AffectedFoundMessages"},{id:1007897979,predicate:"messageActionSetMessagesTTL",params:[{name:"flags",type:"#"},{name:"period",type:"int"},{name:"auto_setting_from",type:"flags.0?long"}],type:"MessageAction"},{id:-1147422299,predicate:"updatePeerHistoryTTL",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"ttl_period",type:"flags.0?int"}],type:"Update"},{id:-796432838,predicate:"updateChatParticipant",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChatParticipant"},{name:"new_participant",type:"flags.1?ChatParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1738720581,predicate:"updateChannelParticipant",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChannelParticipant"},{name:"new_participant",type:"flags.1?ChannelParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-997782967,predicate:"updateBotStopped",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"stopped",type:"Bool"},{name:"qts",type:"int"}],type:"Update"},{id:-1940201511,predicate:"chatInviteImporter",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"about",type:"flags.2?string"},{name:"approved_by",type:"flags.1?long"}],type:"ChatInviteImporter"},{id:-1111085620,predicate:"messages.exportedChatInvites",params:[{name:"count",type:"int"},{name:"invites",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvites"},{id:410107472,predicate:"messages.exportedChatInvite",params:[{name:"invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:572915951,predicate:"messages.exportedChatInviteReplaced",params:[{name:"invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:-2118733814,predicate:"messages.chatInviteImporters",params:[{name:"count",type:"int"},{name:"importers",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatInviteImporters"},{id:-219353309,predicate:"chatAdminWithInvites",params:[{name:"admin_id",type:"long"},{name:"invites_count",type:"int"},{name:"revoked_invites_count",type:"int"}],type:"ChatAdminWithInvites"},{id:-1231326505,predicate:"messages.chatAdminsWithInvites",params:[{name:"admins",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatAdminsWithInvites"},{id:1557846647,predicate:"channelAdminLogEventActionParticipantJoinByInvite",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1515256996,predicate:"channelAdminLogEventActionExportedInviteDelete",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1091179342,predicate:"channelAdminLogEventActionExportedInviteRevoke",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:-384910503,predicate:"channelAdminLogEventActionExportedInviteEdit",params:[{name:"prev_invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1048537159,predicate:"channelAdminLogEventActionParticipantVolume",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1855199800,predicate:"channelAdminLogEventActionChangeHistoryTTL",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:-1571952873,predicate:"messages.checkedHistoryImportPeer",params:[{name:"confirm_text",type:"string"}],type:"messages.CheckedHistoryImportPeer"},{id:93890858,predicate:"inputGroupCallStream",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"time_ms",type:"long"},{name:"scale",type:"int"},{name:"video_channel",type:"flags.0?int"},{name:"video_quality",type:"flags.0?int"}],type:"InputFileLocation"},{id:-1343921601,predicate:"phone.joinAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.JoinAsPeers"},{id:541839704,predicate:"phone.exportedGroupCallInvite",params:[{name:"link",type:"string"}],type:"phone.ExportedGroupCallInvite"},{id:-672693723,predicate:"inputBotInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:894081801,predicate:"botInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1281329567,predicate:"messageActionGroupCallScheduled",params:[{name:"call",type:"InputGroupCall"},{name:"schedule_date",type:"int"}],type:"MessageAction"},{id:-592373577,predicate:"groupCallParticipantVideoSourceGroup",params:[{name:"semantics",type:"string"},{name:"sources",type:"Vector"}],type:"GroupCallParticipantVideoSourceGroup"},{id:1735736008,predicate:"groupCallParticipantVideo",params:[{name:"flags",type:"#"},{name:"paused",type:"flags.0?true"},{name:"endpoint",type:"string"},{name:"source_groups",type:"Vector"},{name:"audio_source",type:"flags.1?int"}],type:"GroupCallParticipantVideo"},{id:192428418,predicate:"updateGroupCallConnection",params:[{name:"flags",type:"#"},{name:"presentation",type:"flags.0?true"},{name:"params",type:"DataJSON"}],type:"Update"},{id:-2046910401,predicate:"stickers.suggestedShortName",params:[{name:"short_name",type:"string"}],type:"stickers.SuggestedShortName"},{id:795652779,predicate:"botCommandScopeDefault",params:[],type:"BotCommandScope"},{id:1011811544,predicate:"botCommandScopeUsers",params:[],type:"BotCommandScope"},{id:1877059713,predicate:"botCommandScopeChats",params:[],type:"BotCommandScope"},{id:-1180016534,predicate:"botCommandScopeChatAdmins",params:[],type:"BotCommandScope"},{id:-610432643,predicate:"botCommandScopePeer",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:1071145937,predicate:"botCommandScopePeerAdmins",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:169026035,predicate:"botCommandScopePeerUser",params:[{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"BotCommandScope"},{id:-478701471,predicate:"account.resetPasswordFailedWait",params:[{name:"retry_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-370148227,predicate:"account.resetPasswordRequestedWait",params:[{name:"until_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-383330754,predicate:"account.resetPasswordOk",params:[],type:"account.ResetPasswordResult"},{id:1299263278,predicate:"updateBotCommands",params:[{name:"peer",type:"Peer"},{name:"bot_id",type:"long"},{name:"commands",type:"Vector"}],type:"Update"},{id:-1434950843,predicate:"messageActionSetChatTheme",params:[{name:"emoticon",type:"string"}],type:"MessageAction"},{id:-1336228175,predicate:"sendMessageChooseStickerAction",params:[],type:"SendMessageAction"},{id:981691896,predicate:"sponsoredMessage",params:[{name:"flags",type:"#"},{name:"recommended",type:"flags.5?true"},{name:"show_peer_photo",type:"flags.6?true"},{name:"random_id",type:"bytes"},{name:"from_id",type:"flags.3?Peer"},{name:"chat_invite",type:"flags.4?ChatInvite"},{name:"chat_invite_hash",type:"flags.4?string"},{name:"channel_post",type:"flags.2?int"},{name:"start_param",type:"flags.0?string"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"SponsoredMessage"},{id:-907141753,predicate:"messages.sponsoredMessages",params:[{name:"flags",type:"#"},{name:"posts_between",type:"flags.0?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SponsoredMessages"},{id:215889721,predicate:"inputStickerSetAnimatedEmojiAnimations",params:[],type:"InputStickerSet"},{id:630664139,predicate:"sendMessageEmojiInteraction",params:[{name:"emoticon",type:"string"},{name:"msg_id",type:"int"},{name:"interaction",type:"DataJSON"}],type:"SendMessageAction"},{id:-1234857938,predicate:"sendMessageEmojiInteractionSeen",params:[{name:"emoticon",type:"string"}],type:"SendMessageAction"},{id:-1227287081,predicate:"inputBotInlineMessageID64",params:[{name:"dc_id",type:"int"},{name:"owner_id",type:"long"},{name:"id",type:"int"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:-911191137,predicate:"searchResultsCalendarPeriod",params:[{name:"date",type:"int"},{name:"min_msg_id",type:"int"},{name:"max_msg_id",type:"int"},{name:"count",type:"int"}],type:"SearchResultsCalendarPeriod"},{id:343859772,predicate:"messages.searchResultsCalendar",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.0?true"},{name:"count",type:"int"},{name:"min_date",type:"int"},{name:"min_msg_id",type:"int"},{name:"offset_id_offset",type:"flags.1?int"},{name:"periods",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SearchResultsCalendar"},{id:2137295719,predicate:"searchResultPosition",params:[{name:"msg_id",type:"int"},{name:"date",type:"int"},{name:"offset",type:"int"}],type:"SearchResultsPosition"},{id:1404185519,predicate:"messages.searchResultsPositions",params:[{name:"count",type:"int"},{name:"positions",type:"Vector"}],type:"messages.SearchResultsPositions"},{id:-339958837,predicate:"messageActionChatJoinedByRequest",params:[],type:"MessageAction"},{id:1885586395,predicate:"updatePendingJoinRequests",params:[{name:"peer",type:"Peer"},{name:"requests_pending",type:"int"},{name:"recent_requesters",type:"Vector"}],type:"Update"},{id:299870598,predicate:"updateBotChatInviteRequester",params:[{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"about",type:"string"},{name:"invite",type:"ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1347021750,predicate:"channelAdminLogEventActionParticipantJoinByRequest",params:[{name:"invite",type:"ExportedChatInvite"},{name:"approved_by",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-376962181,predicate:"inputKeyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"InputUser"}],type:"KeyboardButton"},{id:814112961,predicate:"keyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"long"}],type:"KeyboardButton"},{id:-191450938,predicate:"channels.sendAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.SendAsPeers"},{id:-886388890,predicate:"channelAdminLogEventActionToggleNoForwards",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-738646805,predicate:"messages.stickerSetNotModified",params:[],type:"messages.StickerSet"},{id:997004590,predicate:"users.userFull",params:[{name:"full_user",type:"UserFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"users.UserFull"},{id:1753266509,predicate:"messages.peerSettings",params:[{name:"settings",type:"PeerSettings"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.PeerSettings"},{id:663693416,predicate:"channelAdminLogEventActionSendMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:-702884114,predicate:"auth.codeTypeMissedCall",params:[],type:"auth.CodeType"},{id:-2113903484,predicate:"auth.sentCodeTypeMissedCall",params:[{name:"prefix",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1012759713,predicate:"auth.loggedOut",params:[{name:"flags",type:"#"},{name:"future_auth_token",type:"flags.0?bytes"}],type:"auth.LoggedOut"},{id:1578843320,predicate:"updateMessageReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"top_msg_id",type:"flags.0?int"},{name:"reactions",type:"MessageReactions"}],type:"Update"},{id:-1546531968,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen_order",type:"flags.0?int"},{name:"reaction",type:"Reaction"},{name:"count",type:"int"}],type:"ReactionCount"},{id:1328256121,predicate:"messageReactions",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"can_see_list",type:"flags.2?true"},{name:"results",type:"Vector"},{name:"recent_reactions",type:"flags.1?Vector"}],type:"MessageReactions"},{id:834488621,predicate:"messages.messageReactionsList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"reactions",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.MessageReactionsList"},{id:-1065882623,predicate:"availableReaction",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"premium",type:"flags.2?true"},{name:"reaction",type:"string"},{name:"title",type:"string"},{name:"static_icon",type:"Document"},{name:"appear_animation",type:"Document"},{name:"select_animation",type:"Document"},{name:"activate_animation",type:"Document"},{name:"effect_animation",type:"Document"},{name:"around_animation",type:"flags.1?Document"},{name:"center_icon",type:"flags.1?Document"}],type:"AvailableReaction"},{id:-1626924713,predicate:"messages.availableReactionsNotModified",params:[],type:"messages.AvailableReactions"},{id:1989032621,predicate:"messages.availableReactions",params:[{name:"hash",type:"int"},{name:"reactions",type:"Vector"}],type:"messages.AvailableReactions"},{id:852137487,predicate:"messageEntitySpoiler",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1102180616,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"ChatReactions"},{name:"new_value",type:"ChatReactions"}],type:"ChannelAdminLogEventAction"},{id:1741309751,predicate:"messages.translateNoResult",params:[],type:"messages.TranslatedText"},{id:-1575684144,predicate:"messages.translateResultText",params:[{name:"text",type:"string"}],type:"messages.TranslatedText"},{id:-1319698788,predicate:"messagePeerReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"unread",type:"flags.1?true"},{name:"peer_id",type:"Peer"},{name:"reaction",type:"Reaction"}],type:"MessagePeerReaction"},{id:-2132064081,predicate:"groupCallStreamChannel",params:[{name:"channel",type:"int"},{name:"scale",type:"int"},{name:"last_timestamp_ms",type:"long"}],type:"GroupCallStreamChannel"},{id:-790330702,predicate:"phone.groupCallStreamChannels",params:[{name:"channels",type:"Vector"}],type:"phone.GroupCallStreamChannels"},{id:177124030,predicate:"inputReportReasonIllegalDrugs",params:[],type:"ReportReason"},{id:-1631091139,predicate:"inputReportReasonPersonalDetails",params:[],type:"ReportReason"},{id:767505458,predicate:"phone.groupCallStreamRtmpUrl",params:[{name:"url",type:"string"},{name:"key",type:"string"}],type:"phone.GroupCallStreamRtmpUrl"},{id:1165423600,predicate:"attachMenuBotIconColor",params:[{name:"name",type:"string"},{name:"color",type:"int"}],type:"AttachMenuBotIconColor"},{id:-1297663893,predicate:"attachMenuBotIcon",params:[{name:"flags",type:"#"},{name:"name",type:"string"},{name:"icon",type:"Document"},{name:"colors",type:"flags.0?Vector"}],type:"AttachMenuBotIcon"},{id:-928371502,predicate:"attachMenuBot",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"has_settings",type:"flags.1?true"},{name:"request_write_access",type:"flags.2?true"},{name:"bot_id",type:"long"},{name:"short_name",type:"string"},{name:"peer_types",type:"Vector"},{name:"icons",type:"Vector"}],type:"AttachMenuBot"},{id:-237467044,predicate:"attachMenuBotsNotModified",params:[],type:"AttachMenuBots"},{id:1011024320,predicate:"attachMenuBots",params:[{name:"hash",type:"long"},{name:"bots",type:"Vector"},{name:"users",type:"Vector"}],type:"AttachMenuBots"},{id:-1816172929,predicate:"attachMenuBotsBot",params:[{name:"bot",type:"AttachMenuBot"},{name:"users",type:"Vector"}],type:"AttachMenuBotsBot"},{id:397910539,predicate:"updateAttachMenuBots",params:[],type:"Update"},{id:202659196,predicate:"webViewResultUrl",params:[{name:"query_id",type:"long"},{name:"url",type:"string"}],type:"WebViewResult"},{id:-2010155333,predicate:"simpleWebViewResultUrl",params:[{name:"url",type:"string"}],type:"SimpleWebViewResult"},{id:211046684,predicate:"webViewMessageSent",params:[{name:"flags",type:"#"},{name:"msg_id",type:"flags.0?InputBotInlineMessageID"}],type:"WebViewMessageSent"},{id:361936797,predicate:"updateWebViewResultSent",params:[{name:"query_id",type:"long"}],type:"Update"},{id:326529584,predicate:"keyboardButtonWebView",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:-1598009252,predicate:"keyboardButtonSimpleWebView",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:1205698681,predicate:"messageActionWebViewDataSentMe",params:[{name:"text",type:"string"},{name:"data",type:"string"}],type:"MessageAction"},{id:-1262252875,predicate:"messageActionWebViewDataSent",params:[{name:"text",type:"string"}],type:"MessageAction"},{id:347625491,predicate:"updateBotMenuButton",params:[{name:"bot_id",type:"long"},{name:"button",type:"BotMenuButton"}],type:"Update"},{id:1966318984,predicate:"botMenuButtonDefault",params:[],type:"BotMenuButton"},{id:1113113093,predicate:"botMenuButtonCommands",params:[],type:"BotMenuButton"},{id:-944407322,predicate:"botMenuButton",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"BotMenuButton"},{id:-67704655,predicate:"account.savedRingtonesNotModified",params:[],type:"account.SavedRingtones"},{id:-1041683259,predicate:"account.savedRingtones",params:[{name:"hash",type:"long"},{name:"ringtones",type:"Vector"}],type:"account.SavedRingtones"},{id:1960361625,predicate:"updateSavedRingtones",params:[],type:"Update"},{id:-1746354498,predicate:"notificationSoundDefault",params:[],type:"NotificationSound"},{id:1863070943,predicate:"notificationSoundNone",params:[],type:"NotificationSound"},{id:-2096391452,predicate:"notificationSoundLocal",params:[{name:"title",type:"string"},{name:"data",type:"string"}],type:"NotificationSound"},{id:-9666487,predicate:"notificationSoundRingtone",params:[{name:"id",type:"long"}],type:"NotificationSound"},{id:-1222230163,predicate:"account.savedRingtone",params:[],type:"account.SavedRingtone"},{id:523271863,predicate:"account.savedRingtoneConverted",params:[{name:"document",type:"Document"}],type:"account.SavedRingtone"},{id:2104224014,predicate:"attachMenuPeerTypeSameBotPM",params:[],type:"AttachMenuPeerType"},{id:-1020528102,predicate:"attachMenuPeerTypeBotPM",params:[],type:"AttachMenuPeerType"},{id:-247016673,predicate:"attachMenuPeerTypePM",params:[],type:"AttachMenuPeerType"},{id:84480319,predicate:"attachMenuPeerTypeChat",params:[],type:"AttachMenuPeerType"},{id:2080104188,predicate:"attachMenuPeerTypeBroadcast",params:[],type:"AttachMenuPeerType"},{id:-317687113,predicate:"chatInvitePublicJoinRequests",params:[],type:"ExportedChatInvite"},{id:-977967015,predicate:"inputInvoiceMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"InputInvoice"},{id:-1020867857,predicate:"inputInvoiceSlug",params:[{name:"slug",type:"string"}],type:"InputInvoice"},{id:-1362048039,predicate:"payments.exportedInvoice",params:[{name:"url",type:"string"}],type:"payments.ExportedInvoice"},{id:8703322,predicate:"updateTranscribedAudio",params:[{name:"flags",type:"#"},{name:"pending",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"transcription_id",type:"long"},{name:"text",type:"string"}],type:"Update"},{id:-1821037486,predicate:"messages.transcribedAudio",params:[{name:"flags",type:"#"},{name:"pending",type:"flags.0?true"},{name:"transcription_id",type:"long"},{name:"text",type:"string"}],type:"messages.TranscribedAudio"},{id:909284270,predicate:"dialogFilterDefault",params:[],type:"DialogFilter"},{id:1395946908,predicate:"help.premiumPromo",params:[{name:"status_text",type:"string"},{name:"status_entities",type:"Vector"},{name:"video_sections",type:"Vector"},{name:"videos",type:"Vector"},{name:"period_options",type:"Vector"},{name:"users",type:"Vector"}],type:"help.PremiumPromo"},{id:-925956616,predicate:"messageEntityCustomEmoji",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"document_id",type:"long"}],type:"MessageEntity"},{id:-48981863,predicate:"documentAttributeCustomEmoji",params:[{name:"flags",type:"#"},{name:"free",type:"flags.0?true"},{name:"text_color",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"}],type:"DocumentAttribute"},{id:1087454222,predicate:"stickerSetFullCovered",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"keywords",type:"Vector"},{name:"documents",type:"Vector"}],type:"StickerSetCovered"},{id:-1502273946,predicate:"inputStorePaymentPremiumSubscription",params:[{name:"flags",type:"#"},{name:"restore",type:"flags.0?true"}],type:"InputStorePaymentPurpose"},{id:1634697192,predicate:"inputStorePaymentGiftPremium",params:[{name:"user_id",type:"InputUser"},{name:"currency",type:"string"},{name:"amount",type:"long"}],type:"InputStorePaymentPurpose"},{id:-1415514682,predicate:"messageActionGiftPremium",params:[{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"months",type:"int"}],type:"MessageAction"},{id:1958953753,predicate:"premiumGiftOption",params:[{name:"flags",type:"#"},{name:"months",type:"int"},{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"bot_url",type:"string"},{name:"store_product",type:"flags.0?string"}],type:"PremiumGiftOption"},{id:-930399486,predicate:"inputStickerSetPremiumGifts",params:[],type:"InputStickerSet"},{id:-78886548,predicate:"updateReadFeaturedEmojiStickers",params:[],type:"Update"},{id:-1360618136,predicate:"inputPrivacyKeyVoiceMessages",params:[],type:"InputPrivacyKey"},{id:110621716,predicate:"privacyKeyVoiceMessages",params:[],type:"PrivacyKey"},{id:-1996951013,predicate:"paymentFormMethod",params:[{name:"url",type:"string"},{name:"title",type:"string"}],type:"PaymentFormMethod"},{id:-193992412,predicate:"inputWebFileAudioAlbumThumbLocation",params:[{name:"flags",type:"#"},{name:"small",type:"flags.2?true"},{name:"document",type:"flags.0?InputDocument"},{name:"title",type:"flags.1?string"},{name:"performer",type:"flags.1?string"}],type:"InputWebFileLocation"},{id:769727150,predicate:"emojiStatusEmpty",params:[],type:"EmojiStatus"},{id:-1835310691,predicate:"emojiStatus",params:[{name:"document_id",type:"long"}],type:"EmojiStatus"},{id:-97474361,predicate:"emojiStatusUntil",params:[{name:"document_id",type:"long"},{name:"until",type:"int"}],type:"EmojiStatus"},{id:674706841,predicate:"updateUserEmojiStatus",params:[{name:"user_id",type:"long"},{name:"emoji_status",type:"EmojiStatus"}],type:"Update"},{id:821314523,predicate:"updateRecentEmojiStatuses",params:[],type:"Update"},{id:-796072379,predicate:"account.emojiStatusesNotModified",params:[],type:"account.EmojiStatuses"},{id:-1866176559,predicate:"account.emojiStatuses",params:[{name:"hash",type:"long"},{name:"statuses",type:"Vector"}],type:"account.EmojiStatuses"},{id:2046153753,predicate:"reactionEmpty",params:[],type:"Reaction"},{id:455247544,predicate:"reactionEmoji",params:[{name:"emoticon",type:"string"}],type:"Reaction"},{id:-1992950669,predicate:"reactionCustomEmoji",params:[{name:"document_id",type:"long"}],type:"Reaction"},{id:-352570692,predicate:"chatReactionsNone",params:[],type:"ChatReactions"},{id:1385335754,predicate:"chatReactionsAll",params:[{name:"flags",type:"#"},{name:"allow_custom",type:"flags.0?true"}],type:"ChatReactions"},{id:1713193015,predicate:"chatReactionsSome",params:[{name:"reactions",type:"Vector"}],type:"ChatReactions"},{id:-1334846497,predicate:"messages.reactionsNotModified",params:[],type:"messages.Reactions"},{id:-352454890,predicate:"messages.reactions",params:[{name:"hash",type:"long"},{name:"reactions",type:"Vector"}],type:"messages.Reactions"},{id:1870160884,predicate:"updateRecentReactions",params:[],type:"Update"},{id:-2030252155,predicate:"updateMoveStickerSetToTop",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"stickerset",type:"long"}],type:"Update"},{id:1511364673,predicate:"auth.sentCodeTypeEmailCode",params:[{name:"flags",type:"#"},{name:"apple_signin_allowed",type:"flags.0?true"},{name:"google_signin_allowed",type:"flags.1?true"},{name:"email_pattern",type:"string"},{name:"length",type:"int"},{name:"next_phone_login_date",type:"flags.2?int"}],type:"auth.SentCodeType"},{id:-1521934870,predicate:"auth.sentCodeTypeSetUpEmailRequired",params:[{name:"flags",type:"#"},{name:"apple_signin_allowed",type:"flags.0?true"},{name:"google_signin_allowed",type:"flags.1?true"}],type:"auth.SentCodeType"},{id:1128644211,predicate:"emailVerifyPurposeLoginSetup",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"EmailVerifyPurpose"},{id:1383932651,predicate:"emailVerifyPurposeLoginChange",params:[],type:"EmailVerifyPurpose"},{id:-1141565819,predicate:"emailVerifyPurposePassport",params:[],type:"EmailVerifyPurpose"},{id:-1842457175,predicate:"emailVerificationCode",params:[{name:"code",type:"string"}],type:"EmailVerification"},{id:-611279166,predicate:"emailVerificationGoogle",params:[{name:"token",type:"string"}],type:"EmailVerification"},{id:-1764723459,predicate:"emailVerificationApple",params:[{name:"token",type:"string"}],type:"EmailVerification"},{id:731303195,predicate:"account.emailVerified",params:[{name:"email",type:"string"}],type:"account.EmailVerified"},{id:-507835039,predicate:"account.emailVerifiedLogin",params:[{name:"email",type:"string"},{name:"sent_code",type:"auth.SentCode"}],type:"account.EmailVerified"},{id:-1225711938,predicate:"premiumSubscriptionOption",params:[{name:"flags",type:"#"},{name:"current",type:"flags.1?true"},{name:"can_purchase_upgrade",type:"flags.2?true"},{name:"months",type:"int"},{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"bot_url",type:"string"},{name:"store_product",type:"flags.0?string"}],type:"PremiumSubscriptionOption"},{id:80008398,predicate:"inputStickerSetEmojiGenericAnimations",params:[],type:"InputStickerSet"},{id:701560302,predicate:"inputStickerSetEmojiDefaultStatuses",params:[],type:"InputStickerSet"},{id:-1206095820,predicate:"sendAsPeer",params:[{name:"flags",type:"#"},{name:"premium_required",type:"flags.0?true"},{name:"peer",type:"Peer"}],type:"SendAsPeer"},{id:-1386050360,predicate:"messageExtendedMediaPreview",params:[{name:"flags",type:"#"},{name:"w",type:"flags.0?int"},{name:"h",type:"flags.0?int"},{name:"thumb",type:"flags.1?PhotoSize"},{name:"video_duration",type:"flags.2?int"}],type:"MessageExtendedMedia"},{id:-297296796,predicate:"messageExtendedMedia",params:[{name:"media",type:"MessageMedia"}],type:"MessageExtendedMedia"},{id:1517529484,predicate:"updateMessageExtendedMedia",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"extended_media",type:"MessageExtendedMedia"}],type:"Update"},{id:-50416996,predicate:"stickerKeyword",params:[{name:"document_id",type:"long"},{name:"keyword",type:"Vector"}],type:"StickerKeyword"},{id:-1274595769,predicate:"username",params:[{name:"flags",type:"#"},{name:"editable",type:"flags.0?true"},{name:"active",type:"flags.1?true"},{name:"username",type:"string"}],type:"Username"},{id:-263212119,predicate:"channelAdminLogEventActionChangeUsernames",params:[{name:"prev_value",type:"Vector"},{name:"new_value",type:"Vector"}],type:"ChannelAdminLogEventAction"},{id:46949251,predicate:"channelAdminLogEventActionToggleForum",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1483767080,predicate:"channelAdminLogEventActionCreateTopic",params:[{name:"topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:-261103096,predicate:"channelAdminLogEventActionEditTopic",params:[{name:"prev_topic",type:"ForumTopic"},{name:"new_topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:-1374254839,predicate:"channelAdminLogEventActionDeleteTopic",params:[{name:"topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:1569535291,predicate:"channelAdminLogEventActionPinTopic",params:[{name:"flags",type:"#"},{name:"prev_topic",type:"flags.0?ForumTopic"},{name:"new_topic",type:"flags.1?ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:37687451,predicate:"forumTopicDeleted",params:[{name:"id",type:"int"}],type:"ForumTopic"},{id:1903173033,predicate:"forumTopic",params:[{name:"flags",type:"#"},{name:"my",type:"flags.1?true"},{name:"closed",type:"flags.2?true"},{name:"pinned",type:"flags.3?true"},{name:"short",type:"flags.5?true"},{name:"hidden",type:"flags.6?true"},{name:"id",type:"int"},{name:"date",type:"int"},{name:"title",type:"string"},{name:"icon_color",type:"int"},{name:"icon_emoji_id",type:"flags.0?long"},{name:"top_message",type:"int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"unread_mentions_count",type:"int"},{name:"unread_reactions_count",type:"int"},{name:"from_id",type:"Peer"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"draft",type:"flags.4?DraftMessage"}],type:"ForumTopic"},{id:913709011,predicate:"messages.forumTopics",params:[{name:"flags",type:"#"},{name:"order_by_create_date",type:"flags.0?true"},{name:"count",type:"int"},{name:"topics",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"pts",type:"int"}],type:"messages.ForumTopics"},{id:228168278,predicate:"messageActionTopicCreate",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"icon_color",type:"int"},{name:"icon_emoji_id",type:"flags.0?long"}],type:"MessageAction"},{id:-1064024032,predicate:"messageActionTopicEdit",params:[{name:"flags",type:"#"},{name:"title",type:"flags.0?string"},{name:"icon_emoji_id",type:"flags.1?long"},{name:"closed",type:"flags.2?Bool"},{name:"hidden",type:"flags.3?Bool"}],type:"MessageAction"},{id:422509539,predicate:"updateChannelPinnedTopic",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"topic_id",type:"int"}],type:"Update"},{id:1548122514,predicate:"inputNotifyForumTopic",params:[{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"int"}],type:"InputNotifyPeer"},{id:577659656,predicate:"notifyForumTopic",params:[{name:"peer",type:"Peer"},{name:"top_msg_id",type:"int"}],type:"NotifyPeer"},{id:1153562857,predicate:"inputStickerSetEmojiDefaultTopicIcons",params:[],type:"InputStickerSet"},{id:406407439,predicate:"messages.sponsoredMessagesEmpty",params:[],type:"messages.SponsoredMessages"},{id:-31881726,predicate:"updateChannelPinnedTopics",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:1135897376,predicate:"defaultHistoryTTL",params:[{name:"period",type:"int"}],type:"DefaultHistoryTTL"},{id:116234636,predicate:"auth.codeTypeFragmentSms",params:[],type:"auth.CodeType"},{id:-648651719,predicate:"auth.sentCodeTypeFragmentSms",params:[{name:"url",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1103040667,predicate:"exportedContactToken",params:[{name:"url",type:"string"},{name:"expires",type:"int"}],type:"ExportedContactToken"},{id:1693675004,predicate:"channelAdminLogEventActionToggleAntiSpam",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1474192222,predicate:"messageActionSuggestProfilePhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-404267113,predicate:"messageActionAttachMenuBotAllowed",params:[],type:"MessageAction"},{id:2008112412,predicate:"stickerSetNoCovered",params:[{name:"set",type:"StickerSet"}],type:"StickerSetCovered"},{id:542282808,predicate:"updateUser",params:[{name:"user_id",type:"long"}],type:"Update"}],methods:[{id:-878758099,method:"invokeAfterMsg",params:[{name:"msg_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:1036301552,method:"invokeAfterMsgs",params:[{name:"msg_ids",type:"Vector"},{name:"query",type:"!X"}],type:"X"},{id:-1502141361,method:"auth.sendCode",params:[{name:"phone_number",type:"string"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:-2131827673,method:"auth.signUp",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"auth.Authorization"},{id:-1923962543,method:"auth.signIn",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"flags.0?string"},{name:"email_verification",type:"flags.1?EmailVerification"}],type:"auth.Authorization"},{id:1047706137,method:"auth.logOut",params:[],type:"auth.LoggedOut"},{id:-1616179942,method:"auth.resetAuthorizations",params:[],type:"Bool"},{id:-440401971,method:"auth.exportAuthorization",params:[{name:"dc_id",type:"int"}],type:"auth.ExportedAuthorization"},{id:-1518699091,method:"auth.importAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.Authorization"},{id:-841733627,method:"auth.bindTempAuthKey",params:[{name:"perm_auth_key_id",type:"long"},{name:"nonce",type:"long"},{name:"expires_at",type:"int"},{name:"encrypted_message",type:"bytes"}],type:"Bool"},{id:-326762118,method:"account.registerDevice",params:[{name:"flags",type:"#"},{name:"no_muted",type:"flags.0?true"},{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"app_sandbox",type:"Bool"},{name:"secret",type:"bytes"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:1779249670,method:"account.unregisterDevice",params:[{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:-2067899501,method:"account.updateNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"},{name:"settings",type:"InputPeerNotifySettings"}],type:"Bool"},{id:313765169,method:"account.getNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"}],type:"PeerNotifySettings"},{id:-612493497,method:"account.resetNotifySettings",params:[],type:"Bool"},{id:2018596725,method:"account.updateProfile",params:[{name:"flags",type:"#"},{name:"first_name",type:"flags.0?string"},{name:"last_name",type:"flags.1?string"},{name:"about",type:"flags.2?string"}],type:"User"},{id:1713919532,method:"account.updateStatus",params:[{name:"offline",type:"Bool"}],type:"Bool"},{id:127302966,method:"account.getWallPapers",params:[{name:"hash",type:"long"}],type:"account.WallPapers"},{id:-977650298,method:"account.reportPeer",params:[{name:"peer",type:"InputPeer"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:227648840,method:"users.getUsers",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1240508136,method:"users.getFullUser",params:[{name:"id",type:"InputUser"}],type:"users.UserFull"},{id:2061264541,method:"contacts.getContactIDs",params:[{name:"hash",type:"long"}],type:"Vector"},{id:-995929106,method:"contacts.getStatuses",params:[],type:"Vector"},{id:1574346258,method:"contacts.getContacts",params:[{name:"hash",type:"long"}],type:"contacts.Contacts"},{id:746589157,method:"contacts.importContacts",params:[{name:"contacts",type:"Vector"}],type:"contacts.ImportedContacts"},{id:157945344,method:"contacts.deleteContacts",params:[{name:"id",type:"Vector"}],type:"Updates"},{id:269745566,method:"contacts.deleteByPhones",params:[{name:"phones",type:"Vector"}],type:"Bool"},{id:1758204945,method:"contacts.block",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-1096393392,method:"contacts.unblock",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-176409329,method:"contacts.getBlocked",params:[{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"contacts.Blocked"},{id:1673946374,method:"messages.getMessages",params:[{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1594569905,method:"messages.getDialogs",params:[{name:"flags",type:"#"},{name:"exclude_pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Dialogs"},{id:1143203525,method:"messages.getHistory",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1593989278,method:"messages.search",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"q",type:"string"},{name:"from_id",type:"flags.0?InputPeer"},{name:"top_msg_id",type:"flags.1?int"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:238054714,method:"messages.readHistory",params:[{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"}],type:"messages.AffectedMessages"},{id:-1332768214,method:"messages.deleteHistory",params:[{name:"flags",type:"#"},{name:"just_clear",type:"flags.0?true"},{name:"revoke",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"},{name:"min_date",type:"flags.2?int"},{name:"max_date",type:"flags.3?int"}],type:"messages.AffectedHistory"},{id:-443640366,method:"messages.deleteMessages",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:94983360,method:"messages.receivedMessages",params:[{name:"max_id",type:"int"}],type:"Vector"},{id:1486110434,method:"messages.setTyping",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"action",type:"SendMessageAction"}],type:"Bool"},{id:482476935,method:"messages.sendMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:1967638886,method:"messages.sendMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"media",type:"InputMedia"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-966673468,method:"messages.forwardMessages",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"with_my_score",type:"flags.8?true"},{name:"drop_author",type:"flags.11?true"},{name:"drop_media_captions",type:"flags.12?true"},{name:"noforwards",type:"flags.14?true"},{name:"from_peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"random_id",type:"Vector"},{name:"to_peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.9?int"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-820669733,method:"messages.reportSpam",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-270948702,method:"messages.getPeerSettings",params:[{name:"peer",type:"InputPeer"}],type:"messages.PeerSettings"},{id:-1991005362,method:"messages.report",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:1240027791,method:"messages.getChats",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:-1364194508,method:"messages.getFullChat",params:[{name:"chat_id",type:"long"}],type:"messages.ChatFull"},{id:1937260541,method:"messages.editChatTitle",params:[{name:"chat_id",type:"long"},{name:"title",type:"string"}],type:"Updates"},{id:903730804,method:"messages.editChatPhoto",params:[{name:"chat_id",type:"long"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:-230206493,method:"messages.addChatUser",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"fwd_limit",type:"int"}],type:"Updates"},{id:-1575461717,method:"messages.deleteChatUser",params:[{name:"flags",type:"#"},{name:"revoke_history",type:"flags.0?true"},{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:3450904,method:"messages.createChat",params:[{name:"flags",type:"#"},{name:"users",type:"Vector"},{name:"title",type:"string"},{name:"ttl_period",type:"flags.0?int"}],type:"Updates"},{id:-304838614,method:"updates.getState",params:[],type:"updates.State"},{id:630429265,method:"updates.getDifference",params:[{name:"flags",type:"#"},{name:"pts",type:"int"},{name:"pts_total_limit",type:"flags.0?int"},{name:"date",type:"int"},{name:"qts",type:"int"}],type:"updates.Difference"},{id:473782614,method:"photos.updateProfilePhoto",params:[{name:"flags",type:"#"},{name:"fallback",type:"flags.0?true"},{name:"id",type:"InputPhoto"}],type:"photos.Photo"},{id:-1980559511,method:"photos.uploadProfilePhoto",params:[{name:"flags",type:"#"},{name:"fallback",type:"flags.3?true"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:-2016444625,method:"photos.deletePhotos",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1291540959,method:"upload.saveFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1101843010,method:"upload.getFile",params:[{name:"flags",type:"#"},{name:"precise",type:"flags.0?true"},{name:"cdn_supported",type:"flags.1?true"},{name:"location",type:"InputFileLocation"},{name:"offset",type:"long"},{name:"limit",type:"int"}],type:"upload.File"},{id:-990308245,method:"help.getConfig",params:[],type:"Config"},{id:531836966,method:"help.getNearestDc",params:[],type:"NearestDc"},{id:1378703997,method:"help.getAppUpdate",params:[{name:"source",type:"string"}],type:"help.AppUpdate"},{id:1295590211,method:"help.getInviteText",params:[],type:"help.InviteText"},{id:-1848823128,method:"photos.getUserPhotos",params:[{name:"user_id",type:"InputUser"},{name:"offset",type:"int"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"photos.Photos"},{id:651135312,method:"messages.getDhConfig",params:[{name:"version",type:"int"},{name:"random_length",type:"int"}],type:"messages.DhConfig"},{id:-162681021,method:"messages.requestEncryption",params:[{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1035731989,method:"messages.acceptEncryption",params:[{name:"peer",type:"InputEncryptedChat"},{name:"g_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:-208425312,method:"messages.discardEncryption",params:[{name:"flags",type:"#"},{name:"delete_history",type:"flags.0?true"},{name:"chat_id",type:"int"}],type:"Bool"},{id:2031374829,method:"messages.setEncryptedTyping",params:[{name:"peer",type:"InputEncryptedChat"},{name:"typing",type:"Bool"}],type:"Bool"},{id:2135648522,method:"messages.readEncryptedHistory",params:[{name:"peer",type:"InputEncryptedChat"},{name:"max_date",type:"int"}],type:"Bool"},{id:1157265941,method:"messages.sendEncrypted",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1431914525,method:"messages.sendEncryptedFile",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"},{name:"file",type:"InputEncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:852769188,method:"messages.sendEncryptedService",params:[{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1436924774,method:"messages.receivedQueue",params:[{name:"max_qts",type:"int"}],type:"Vector"},{id:1259113487,method:"messages.reportEncryptedSpam",params:[{name:"peer",type:"InputEncryptedChat"}],type:"Bool"},{id:-562337987,method:"upload.saveBigFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"file_total_parts",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1043505495,method:"initConnection",params:[{name:"flags",type:"#"},{name:"api_id",type:"int"},{name:"device_model",type:"string"},{name:"system_version",type:"string"},{name:"app_version",type:"string"},{name:"system_lang_code",type:"string"},{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"proxy",type:"flags.0?InputClientProxy"},{name:"params",type:"flags.1?JSONValue"},{name:"query",type:"!X"}],type:"X"},{id:-1663104819,method:"help.getSupport",params:[],type:"help.Support"},{id:916930423,method:"messages.readMessageContents",params:[{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:655677548,method:"account.checkUsername",params:[{name:"username",type:"string"}],type:"Bool"},{id:1040964988,method:"account.updateUsername",params:[{name:"username",type:"string"}],type:"User"},{id:301470424,method:"contacts.search",params:[{name:"q",type:"string"},{name:"limit",type:"int"}],type:"contacts.Found"},{id:-623130288,method:"account.getPrivacy",params:[{name:"key",type:"InputPrivacyKey"}],type:"account.PrivacyRules"},{id:-906486552,method:"account.setPrivacy",params:[{name:"key",type:"InputPrivacyKey"},{name:"rules",type:"Vector"}],type:"account.PrivacyRules"},{id:-1564422284,method:"account.deleteAccount",params:[{name:"flags",type:"#"},{name:"reason",type:"string"},{name:"password",type:"flags.0?InputCheckPasswordSRP"}],type:"Bool"},{id:150761757,method:"account.getAccountTTL",params:[],type:"AccountDaysTTL"},{id:608323678,method:"account.setAccountTTL",params:[{name:"ttl",type:"AccountDaysTTL"}],type:"Bool"},{id:-627372787,method:"invokeWithLayer",params:[{name:"layer",type:"int"},{name:"query",type:"!X"}],type:"X"},{id:-113456221,method:"contacts.resolveUsername",params:[{name:"username",type:"string"}],type:"contacts.ResolvedPeer"},{id:-2108208411,method:"account.sendChangePhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1891839707,method:"account.changePhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"User"},{id:-710552671,method:"messages.getStickers",params:[{name:"emoticon",type:"string"},{name:"hash",type:"long"}],type:"messages.Stickers"},{id:-1197432408,method:"messages.getAllStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:954152242,method:"account.updateDeviceLocked",params:[{name:"period",type:"int"}],type:"Bool"},{id:1738800940,method:"auth.importBotAuthorization",params:[{name:"flags",type:"int"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"bot_auth_token",type:"string"}],type:"auth.Authorization"},{id:-1956073268,method:"messages.getWebPagePreview",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"MessageMedia"},{id:-484392616,method:"account.getAuthorizations",params:[],type:"account.Authorizations"},{id:-545786948,method:"account.resetAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1418342645,method:"account.getPassword",params:[],type:"account.Password"},{id:-1663767815,method:"account.getPasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"account.PasswordSettings"},{id:-1516564433,method:"account.updatePasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"new_settings",type:"account.PasswordInputSettings"}],type:"Bool"},{id:-779399914,method:"auth.checkPassword",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"auth.Authorization"},{id:-661144474,method:"auth.requestPasswordRecovery",params:[],type:"auth.PasswordRecovery"},{id:923364464,method:"auth.recoverPassword",params:[{name:"flags",type:"#"},{name:"code",type:"string"},{name:"new_settings",type:"flags.0?account.PasswordInputSettings"}],type:"auth.Authorization"},{id:-1080796745,method:"invokeWithoutUpdates",params:[{name:"query",type:"!X"}],type:"X"},{id:-1607670315,method:"messages.exportChatInvite",params:[{name:"flags",type:"#"},{name:"legacy_revoke_permanent",type:"flags.2?true"},{name:"request_needed",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"title",type:"flags.4?string"}],type:"ExportedChatInvite"},{id:1051570619,method:"messages.checkChatInvite",params:[{name:"hash",type:"string"}],type:"ChatInvite"},{id:1817183516,method:"messages.importChatInvite",params:[{name:"hash",type:"string"}],type:"Updates"},{id:-928977804,method:"messages.getStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"hash",type:"int"}],type:"messages.StickerSet"},{id:-946871200,method:"messages.installStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"archived",type:"Bool"}],type:"messages.StickerSetInstallResult"},{id:-110209570,method:"messages.uninstallStickerSet",params:[{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-421563528,method:"messages.startBot",params:[{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"long"},{name:"start_param",type:"string"}],type:"Updates"},{id:-1877938321,method:"help.getAppChangelog",params:[{name:"prev_app_version",type:"string"}],type:"Updates"},{id:1468322785,method:"messages.getMessagesViews",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"increment",type:"Bool"}],type:"messages.MessageViews"},{id:-871347913,method:"channels.readHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-2067661490,method:"channels.deleteMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:-196443371,method:"channels.reportSpam",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1383294429,method:"channels.getMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:2010044880,method:"channels.getParticipants",params:[{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelParticipantsFilter"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"channels.ChannelParticipants"},{id:-1599378234,method:"channels.getParticipant",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"channels.ChannelParticipant"},{id:176122811,method:"channels.getChannels",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:141781513,method:"channels.getFullChannel",params:[{name:"channel",type:"InputChannel"}],type:"messages.ChatFull"},{id:-1862244601,method:"channels.createChannel",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.0?true"},{name:"megagroup",type:"flags.1?true"},{name:"for_import",type:"flags.3?true"},{name:"title",type:"string"},{name:"about",type:"string"},{name:"geo_point",type:"flags.2?InputGeoPoint"},{name:"address",type:"flags.2?string"},{name:"ttl_period",type:"flags.4?int"}],type:"Updates"},{id:-751007486,method:"channels.editAdmin",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"string"}],type:"Updates"},{id:1450044624,method:"channels.editTitle",params:[{name:"channel",type:"InputChannel"},{name:"title",type:"string"}],type:"Updates"},{id:-248621111,method:"channels.editPhoto",params:[{name:"channel",type:"InputChannel"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:283557164,method:"channels.checkUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:890549214,method:"channels.updateUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:615851205,method:"channels.joinChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-130635115,method:"channels.leaveChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:429865580,method:"channels.inviteToChannel",params:[{name:"channel",type:"InputChannel"},{name:"users",type:"Vector"}],type:"Updates"},{id:-1072619549,method:"channels.deleteChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:51854712,method:"updates.getChannelDifference",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelMessagesFilter"},{name:"pts",type:"int"},{name:"limit",type:"int"}],type:"updates.ChannelDifference"},{id:-1470377534,method:"messages.editChatAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"is_admin",type:"Bool"}],type:"Bool"},{id:-1568189671,method:"messages.migrateChat",params:[{name:"chat_id",type:"long"}],type:"Updates"},{id:1271290010,method:"messages.searchGlobal",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:2016638777,method:"messages.reorderStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:-1309538785,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"long"},{name:"mime_type",type:"string"}],type:"Document"},{id:1559270965,method:"messages.getSavedGifs",params:[{name:"hash",type:"long"}],type:"messages.SavedGifs"},{id:846868683,method:"messages.saveGif",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:1364105629,method:"messages.getInlineBotResults",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"geo_point",type:"flags.0?InputGeoPoint"},{name:"query",type:"string"},{name:"offset",type:"string"}],type:"messages.BotResults"},{id:-346119674,method:"messages.setInlineBotResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"private",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"next_offset",type:"flags.2?string"},{name:"switch_pm",type:"flags.3?InlineBotSwitchPM"}],type:"Bool"},{id:-738468661,method:"messages.sendInlineBotResult",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"hide_via",type:"flags.11?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"random_id",type:"long"},{name:"query_id",type:"long"},{name:"id",type:"string"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-432034325,method:"channels.exportMessageLink",params:[{name:"flags",type:"#"},{name:"grouped",type:"flags.0?true"},{name:"thread",type:"flags.1?true"},{name:"channel",type:"InputChannel"},{name:"id",type:"int"}],type:"ExportedMessageLink"},{id:527021574,method:"channels.toggleSignatures",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:1056025023,method:"auth.resendCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"auth.SentCode"},{id:520357240,method:"auth.cancelCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"Bool"},{id:-39416522,method:"messages.getMessageEditData",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"messages.MessageEditData"},{id:1224152952,method:"messages.editMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.15?int"}],type:"Updates"},{id:-2091549254,method:"messages.editInlineBotMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:-1824339449,method:"messages.getBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"game",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"data",type:"flags.0?bytes"},{name:"password",type:"flags.2?InputCheckPasswordSRP"}],type:"messages.BotCallbackAnswer"},{id:-712043766,method:"messages.setBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"Bool"},{id:-1758168906,method:"contacts.getTopPeers",params:[{name:"flags",type:"#"},{name:"correspondents",type:"flags.0?true"},{name:"bots_pm",type:"flags.1?true"},{name:"bots_inline",type:"flags.2?true"},{name:"phone_calls",type:"flags.3?true"},{name:"forward_users",type:"flags.4?true"},{name:"forward_chats",type:"flags.5?true"},{name:"groups",type:"flags.10?true"},{name:"channels",type:"flags.15?true"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"contacts.TopPeers"},{id:451113900,method:"contacts.resetTopPeerRating",params:[{name:"category",type:"TopPeerCategory"},{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-462373635,method:"messages.getPeerDialogs",params:[{name:"peers",type:"Vector"}],type:"messages.PeerDialogs"},{id:-1271718337,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.2?int"},{name:"peer",type:"InputPeer"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:1782549861,method:"messages.getAllDrafts",params:[],type:"Updates"},{id:1685588756,method:"messages.getFeaturedStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:1527873830,method:"messages.readFeaturedStickers",params:[{name:"id",type:"Vector"}],type:"Bool"},{id:-1649852357,method:"messages.getRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"hash",type:"long"}],type:"messages.RecentStickers"},{id:958863608,method:"messages.saveRecentSticker",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-1986437075,method:"messages.clearRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"}],type:"Bool"},{id:1475442322,method:"messages.getArchivedStickers",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"offset_id",type:"long"},{name:"limit",type:"int"}],type:"messages.ArchivedStickers"},{id:457157256,method:"account.sendConfirmPhoneCode",params:[{name:"hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1596029123,method:"account.confirmPhone",params:[{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:-122669393,method:"channels.getAdminedPublicChannels",params:[{name:"flags",type:"#"},{name:"by_location",type:"flags.0?true"},{name:"check_limit",type:"flags.1?true"}],type:"messages.Chats"},{id:1678738104,method:"messages.getMaskStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:-866424884,method:"messages.getAttachedStickers",params:[{name:"media",type:"InputStickeredMedia"}],type:"Vector"},{id:-1907842680,method:"auth.dropTempAuthKeys",params:[{name:"except_auth_keys",type:"Vector"}],type:"Bool"},{id:-1896289088,method:"messages.setGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Updates"},{id:363700068,method:"messages.setInlineGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Bool"},{id:-400399203,method:"messages.getGameHighScores",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:258170395,method:"messages.getInlineGameHighScores",params:[{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:-468934396,method:"messages.getCommonChats",params:[{name:"user_id",type:"InputUser"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"messages.Chats"},{id:-2023787330,method:"messages.getAllChats",params:[{name:"except_ids",type:"Vector"}],type:"messages.Chats"},{id:-333262899,method:"help.setBotUpdatesStatus",params:[{name:"pending_updates_count",type:"int"},{name:"message",type:"string"}],type:"Bool"},{id:852135825,method:"messages.getWebPage",params:[{name:"url",type:"string"},{name:"hash",type:"int"}],type:"WebPage"},{id:-1489903017,method:"messages.toggleDialogPin",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:991616823,method:"messages.reorderPinnedDialogs",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"folder_id",type:"int"},{name:"order",type:"Vector"}],type:"Bool"},{id:-692498958,method:"messages.getPinnedDialogs",params:[{name:"folder_id",type:"int"}],type:"messages.PeerDialogs"},{id:-1440257555,method:"bots.sendCustomRequest",params:[{name:"custom_method",type:"string"},{name:"params",type:"DataJSON"}],type:"DataJSON"},{id:-434028723,method:"bots.answerWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"}],type:"Bool"},{id:619086221,method:"upload.getWebFile",params:[{name:"location",type:"InputWebFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.WebFile"},{id:924093883,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"invoice",type:"InputInvoice"},{name:"theme_params",type:"flags.0?DataJSON"}],type:"payments.PaymentForm"},{id:611897804,method:"payments.getPaymentReceipt",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"payments.PaymentReceipt"},{id:-1228345045,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"invoice",type:"InputInvoice"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:755192367,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"invoice",type:"InputInvoice"},{name:"requested_info_id",type:"flags.0?string"},{name:"shipping_option_id",type:"flags.1?string"},{name:"credentials",type:"InputPaymentCredentials"},{name:"tip_amount",type:"flags.2?long"}],type:"payments.PaymentResult"},{id:1151208273,method:"account.getTmpPassword",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"period",type:"int"}],type:"account.TmpPassword"},{id:578650699,method:"payments.getSavedInfo",params:[],type:"payments.SavedInfo"},{id:-667062079,method:"payments.clearSavedInfo",params:[{name:"flags",type:"#"},{name:"credentials",type:"flags.0?true"},{name:"info",type:"flags.1?true"}],type:"Bool"},{id:-436833542,method:"messages.setBotShippingResults",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"Bool"},{id:163765653,method:"messages.setBotPrecheckoutResults",params:[{name:"flags",type:"#"},{name:"success",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"}],type:"Bool"},{id:-1876841625,method:"stickers.createStickerSet",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"animated",type:"flags.1?true"},{name:"videos",type:"flags.4?true"},{name:"user_id",type:"InputUser"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumb",type:"flags.2?InputDocument"},{name:"stickers",type:"Vector"},{name:"software",type:"flags.3?string"}],type:"messages.StickerSet"},{id:-143257775,method:"stickers.removeStickerFromSet",params:[{name:"sticker",type:"InputDocument"}],type:"messages.StickerSet"},{id:-4795190,method:"stickers.changeStickerPosition",params:[{name:"sticker",type:"InputDocument"},{name:"position",type:"int"}],type:"messages.StickerSet"},{id:-2041315650,method:"stickers.addStickerToSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"sticker",type:"InputStickerSetItem"}],type:"messages.StickerSet"},{id:1369162417,method:"messages.uploadMedia",params:[{name:"peer",type:"InputPeer"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:1430593449,method:"phone.getCallConfig",params:[],type:"DataJSON"},{id:1124046573,method:"phone.requestCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:1003664544,method:"phone.acceptCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:788404002,method:"phone.confirmCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_a",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:399855457,method:"phone.receivedCall",params:[{name:"peer",type:"InputPhoneCall"}],type:"Bool"},{id:-1295269440,method:"phone.discardCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"duration",type:"int"},{name:"reason",type:"PhoneCallDiscardReason"},{name:"connection_id",type:"long"}],type:"Updates"},{id:1508562471,method:"phone.setCallRating",params:[{name:"flags",type:"#"},{name:"user_initiative",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"rating",type:"int"},{name:"comment",type:"string"}],type:"Updates"},{id:662363518,method:"phone.saveCallDebug",params:[{name:"peer",type:"InputPhoneCall"},{name:"debug",type:"DataJSON"}],type:"Bool"},{id:962554330,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"long"},{name:"limit",type:"int"}],type:"upload.CdnFile"},{id:-1691921240,method:"upload.reuploadCdnFile",params:[{name:"file_token",type:"bytes"},{name:"request_token",type:"bytes"}],type:"Vector"},{id:1375900482,method:"help.getCdnConfig",params:[],type:"CdnConfig"},{id:-219008246,method:"langpack.getLangPack",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackDifference"},{id:-269862909,method:"langpack.getStrings",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"keys",type:"Vector"}],type:"Vector"},{id:-845657435,method:"langpack.getDifference",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"LangPackDifference"},{id:1120311183,method:"langpack.getLanguages",params:[{name:"lang_pack",type:"string"}],type:"Vector"},{id:-1763259007,method:"channels.editBanned",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:870184064,method:"channels.getAdminLog",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"string"},{name:"events_filter",type:"flags.0?ChannelAdminLogEventsFilter"},{name:"admins",type:"flags.1?Vector"},{name:"max_id",type:"long"},{name:"min_id",type:"long"},{name:"limit",type:"int"}],type:"channels.AdminLogResults"},{id:-1847836879,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"long"}],type:"Vector"},{id:-914493408,method:"messages.sendScreenshotNotification",params:[{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"int"},{name:"random_id",type:"long"}],type:"Updates"},{id:-359881479,method:"channels.setStickers",params:[{name:"channel",type:"InputChannel"},{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:82946729,method:"messages.getFavedStickers",params:[{name:"hash",type:"long"}],type:"messages.FavedStickers"},{id:-1174420133,method:"messages.faveSticker",params:[{name:"id",type:"InputDocument"},{name:"unfave",type:"Bool"}],type:"Bool"},{id:-357180360,method:"channels.readMessageContents",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"Bool"},{id:-2020263951,method:"contacts.resetSaved",params:[],type:"Bool"},{id:-251140208,method:"messages.getUnreadMentions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:-1683319225,method:"channels.deleteHistory",params:[{name:"flags",type:"#"},{name:"for_everyone",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Updates"},{id:1036054804,method:"help.getRecentMeUrls",params:[{name:"referer",type:"string"}],type:"help.RecentMeUrls"},{id:-356796084,method:"channels.togglePreHistoryHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:921026381,method:"messages.readMentions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],type:"messages.AffectedHistory"},{id:1881817312,method:"messages.getRecentLocations",params:[{name:"peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1225713124,method:"messages.sendMultiMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"multi_media",type:"Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:1347929239,method:"messages.uploadEncryptedFile",params:[{name:"peer",type:"InputEncryptedChat"},{name:"file",type:"InputEncryptedFile"}],type:"EncryptedFile"},{id:405695855,method:"account.getWebAuthorizations",params:[],type:"account.WebAuthorizations"},{id:755087855,method:"account.resetWebAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1747789204,method:"account.resetWebAuthorizations",params:[],type:"Bool"},{id:896555914,method:"messages.searchStickerSets",params:[{name:"flags",type:"#"},{name:"exclude_featured",type:"flags.0?true"},{name:"q",type:"string"},{name:"hash",type:"long"}],type:"messages.FoundStickerSets"},{id:-1856595926,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"long"}],type:"Vector"},{id:749019089,method:"help.getTermsOfServiceUpdate",params:[],type:"help.TermsOfServiceUpdate"},{id:-294455398,method:"help.acceptTermsOfService",params:[{name:"id",type:"DataJSON"}],type:"Bool"},{id:-1299661699,method:"account.getAllSecureValues",params:[],type:"Vector"},{id:1936088002,method:"account.getSecureValue",params:[{name:"types",type:"Vector"}],type:"Vector"},{id:-1986010339,method:"account.saveSecureValue",params:[{name:"value",type:"InputSecureValue"},{name:"secure_secret_id",type:"long"}],type:"SecureValue"},{id:-1199522741,method:"account.deleteSecureValue",params:[{name:"types",type:"Vector"}],type:"Bool"},{id:-1865902923,method:"users.setSecureValueErrors",params:[{name:"id",type:"InputUser"},{name:"errors",type:"Vector"}],type:"Bool"},{id:-1456907910,method:"account.getAuthorizationForm",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"}],type:"account.AuthorizationForm"},{id:-202552205,method:"account.acceptAuthorization",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"},{name:"value_hashes",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"Bool"},{id:-1516022023,method:"account.sendVerifyPhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1305716726,method:"account.verifyPhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:-1730136133,method:"account.sendVerifyEmailCode",params:[{name:"purpose",type:"EmailVerifyPurpose"},{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:53322959,method:"account.verifyEmail",params:[{name:"purpose",type:"EmailVerifyPurpose"},{name:"verification",type:"EmailVerification"}],type:"account.EmailVerified"},{id:1072547679,method:"help.getDeepLinkInfo",params:[{name:"path",type:"string"}],type:"help.DeepLinkInfo"},{id:-2098076769,method:"contacts.getSaved",params:[],type:"Vector"},{id:-2092831552,method:"channels.getLeftChannels",params:[{name:"offset",type:"int"}],type:"messages.Chats"},{id:-1896617296,method:"account.initTakeoutSession",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"message_users",type:"flags.1?true"},{name:"message_chats",type:"flags.2?true"},{name:"message_megagroups",type:"flags.3?true"},{name:"message_channels",type:"flags.4?true"},{name:"files",type:"flags.5?true"},{name:"file_max_size",type:"flags.5?long"}],type:"account.Takeout"},{id:489050862,method:"account.finishTakeoutSession",params:[{name:"flags",type:"#"},{name:"success",type:"flags.0?true"}],type:"Bool"},{id:486505992,method:"messages.getSplitRanges",params:[],type:"Vector"},{id:911373810,method:"invokeWithMessagesRange",params:[{name:"range",type:"MessageRange"},{name:"query",type:"!X"}],type:"X"},{id:-1398145746,method:"invokeWithTakeout",params:[{name:"takeout_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:-1031349873,method:"messages.markDialogUnread",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:585256482,method:"messages.getDialogUnreadMarks",params:[],type:"Vector"},{id:-2062238246,method:"contacts.toggleTopPeers",params:[{name:"enabled",type:"Bool"}],type:"Bool"},{id:2119757468,method:"messages.clearAllDrafts",params:[],type:"Bool"},{id:-1735311088,method:"help.getAppConfig",params:[],type:"JSONValue"},{id:1862465352,method:"help.saveAppLog",params:[{name:"events",type:"Vector"}],type:"Bool"},{id:-966677240,method:"help.getPassportConfig",params:[{name:"hash",type:"int"}],type:"help.PassportConfig"},{id:1784243458,method:"langpack.getLanguage",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackLanguage"},{id:-760547348,method:"messages.updatePinnedMessage",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"unpin",type:"flags.1?true"},{name:"pm_oneside",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"Updates"},{id:-1881204448,method:"account.confirmPasswordEmail",params:[{name:"code",type:"string"}],type:"Bool"},{id:2055154197,method:"account.resendPasswordEmail",params:[],type:"Bool"},{id:-1043606090,method:"account.cancelPasswordEmail",params:[],type:"Bool"},{id:-748624084,method:"help.getSupportName",params:[],type:"help.SupportName"},{id:59377875,method:"help.getUserInfo",params:[{name:"user_id",type:"InputUser"}],type:"help.UserInfo"},{id:1723407216,method:"help.editUserInfo",params:[{name:"user_id",type:"InputUser"},{name:"message",type:"string"},{name:"entities",type:"Vector"}],type:"help.UserInfo"},{id:-1626880216,method:"account.getContactSignUpNotification",params:[],type:"Bool"},{id:-806076575,method:"account.setContactSignUpNotification",params:[{name:"silent",type:"Bool"}],type:"Bool"},{id:1398240377,method:"account.getNotifyExceptions",params:[{name:"flags",type:"#"},{name:"compare_sound",type:"flags.1?true"},{name:"peer",type:"flags.0?InputNotifyPeer"}],type:"Updates"},{id:283795844,method:"messages.sendVote",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"options",type:"Vector"}],type:"Updates"},{id:1941660731,method:"messages.getPollResults",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1848369232,method:"messages.getOnlines",params:[{name:"peer",type:"InputPeer"}],type:"ChatOnlines"},{id:-554301545,method:"messages.editChatAbout",params:[{name:"peer",type:"InputPeer"},{name:"about",type:"string"}],type:"Bool"},{id:-1517917375,method:"messages.editChatDefaultBannedRights",params:[{name:"peer",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:-57811990,method:"account.getWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"}],type:"WallPaper"},{id:-578472351,method:"account.uploadWallPaper",params:[{name:"file",type:"InputFile"},{name:"mime_type",type:"string"},{name:"settings",type:"WallPaperSettings"}],type:"WallPaper"},{id:1817860919,method:"account.saveWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"unsave",type:"Bool"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-18000023,method:"account.installWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-1153722364,method:"account.resetWallPapers",params:[],type:"Bool"},{id:1457130303,method:"account.getAutoDownloadSettings",params:[],type:"account.AutoDownloadSettings"},{id:1995661875,method:"account.saveAutoDownloadSettings",params:[{name:"flags",type:"#"},{name:"low",type:"flags.0?true"},{name:"high",type:"flags.1?true"},{name:"settings",type:"AutoDownloadSettings"}],type:"Bool"},{id:899735650,method:"messages.getEmojiKeywords",params:[{name:"lang_code",type:"string"}],type:"EmojiKeywordsDifference"},{id:352892591,method:"messages.getEmojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"EmojiKeywordsDifference"},{id:1318675378,method:"messages.getEmojiKeywordsLanguages",params:[{name:"lang_codes",type:"Vector"}],type:"Vector"},{id:-709817306,method:"messages.getEmojiURL",params:[{name:"lang_code",type:"string"}],type:"EmojiURL"},{id:1749536939,method:"folders.editPeerFolders",params:[{name:"folder_peers",type:"Vector"}],type:"Updates"},{id:472471681,method:"folders.deleteFolder",params:[{name:"folder_id",type:"int"}],type:"Updates"},{id:11435201,method:"messages.getSearchCounters",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"filters",type:"Vector"}],type:"Vector"},{id:-170208392,method:"channels.getGroupsForDiscussion",params:[],type:"messages.Chats"},{id:1079520178,method:"channels.setDiscussionGroup",params:[{name:"broadcast",type:"InputChannel"},{name:"group",type:"InputChannel"}],type:"Bool"},{id:428848198,method:"messages.requestUrlAuth",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:-1322487515,method:"messages.acceptUrlAuth",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:1336717624,method:"messages.hidePeerSettingsBar",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-386636848,method:"contacts.addContact",params:[{name:"flags",type:"#"},{name:"add_phone_privacy_exception",type:"flags.0?true"},{name:"id",type:"InputUser"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"phone",type:"string"}],type:"Updates"},{id:-130964977,method:"contacts.acceptContact",params:[{name:"id",type:"InputUser"}],type:"Updates"},{id:-1892102881,method:"channels.editCreator",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"password",type:"InputCheckPasswordSRP"}],type:"Updates"},{id:-750207932,method:"contacts.getLocated",params:[{name:"flags",type:"#"},{name:"background",type:"flags.1?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"self_expires",type:"flags.0?int"}],type:"Updates"},{id:1491484525,method:"channels.editLocation",params:[{name:"channel",type:"InputChannel"},{name:"geo_point",type:"InputGeoPoint"},{name:"address",type:"string"}],type:"Bool"},{id:-304832784,method:"channels.toggleSlowMode",params:[{name:"channel",type:"InputChannel"},{name:"seconds",type:"int"}],type:"Updates"},{id:-183077365,method:"messages.getScheduledHistory",params:[{name:"peer",type:"InputPeer"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1111817116,method:"messages.getScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1120369398,method:"messages.sendScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1504586518,method:"messages.deleteScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:473805619,method:"account.uploadTheme",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.0?InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:1697530880,method:"account.createTheme",params:[{name:"flags",type:"#"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:737414348,method:"account.updateTheme",params:[{name:"flags",type:"#"},{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"slug",type:"flags.0?string"},{name:"title",type:"flags.1?string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:-229175188,method:"account.saveTheme",params:[{name:"theme",type:"InputTheme"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-953697477,method:"account.installTheme",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"theme",type:"flags.1?InputTheme"},{name:"format",type:"flags.2?string"},{name:"base_theme",type:"flags.3?BaseTheme"}],type:"Bool"},{id:978872812,method:"account.getTheme",params:[{name:"format",type:"string"},{name:"theme",type:"InputTheme"}],type:"Theme"},{id:1913054296,method:"account.getThemes",params:[{name:"format",type:"string"},{name:"hash",type:"long"}],type:"account.Themes"},{id:-1210022402,method:"auth.exportLoginToken",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"except_ids",type:"Vector"}],type:"auth.LoginToken"},{id:-1783866140,method:"auth.importLoginToken",params:[{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:-392909491,method:"auth.acceptLoginToken",params:[{name:"token",type:"bytes"}],type:"Authorization"},{id:-1250643605,method:"account.setContentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"}],type:"Bool"},{id:-1952756306,method:"account.getContentSettings",params:[],type:"account.ContentSettings"},{id:300429806,method:"channels.getInactiveChannels",params:[],type:"messages.InactiveChats"},{id:1705865692,method:"account.getMultiWallPapers",params:[{name:"wallpapers",type:"Vector"}],type:"Vector"},{id:-1200736242,method:"messages.getPollVotes",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"option",type:"flags.0?bytes"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.VotesList"},{id:-1257951254,method:"messages.toggleStickerSets",params:[{name:"flags",type:"#"},{name:"uninstall",type:"flags.0?true"},{name:"archive",type:"flags.1?true"},{name:"unarchive",type:"flags.2?true"},{name:"stickersets",type:"Vector"}],type:"Bool"},{id:779736953,method:"payments.getBankCardData",params:[{name:"number",type:"string"}],type:"payments.BankCardData"},{id:-241247891,method:"messages.getDialogFilters",params:[],type:"Vector"},{id:-1566780372,method:"messages.getSuggestedDialogFilters",params:[],type:"Vector"},{id:450142282,method:"messages.updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Bool"},{id:-983318044,method:"messages.updateDialogFiltersOrder",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:-1421720550,method:"stats.getBroadcastStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.BroadcastStats"},{id:1646092192,method:"stats.loadAsyncGraph",params:[{name:"flags",type:"#"},{name:"token",type:"string"},{name:"x",type:"flags.0?long"}],type:"StatsGraph"},{id:-1707717072,method:"stickers.setStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb",type:"InputDocument"}],type:"messages.StickerSet"},{id:85399130,method:"bots.setBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"},{name:"commands",type:"Vector"}],type:"Bool"},{id:2127598753,method:"messages.getOldFeaturedStickers",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:-1063816159,method:"help.getPromoData",params:[],type:"help.PromoData"},{id:505748629,method:"help.hidePromoData",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-8744061,method:"phone.sendSignalingData",params:[{name:"peer",type:"InputPhoneCall"},{name:"data",type:"bytes"}],type:"Bool"},{id:-589330937,method:"stats.getMegagroupStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.MegagroupStats"},{id:-349483786,method:"account.getGlobalPrivacySettings",params:[],type:"GlobalPrivacySettings"},{id:517647042,method:"account.setGlobalPrivacySettings",params:[{name:"settings",type:"GlobalPrivacySettings"}],type:"GlobalPrivacySettings"},{id:-183649631,method:"help.dismissSuggestion",params:[{name:"peer",type:"InputPeer"},{name:"suggestion",type:"string"}],type:"Bool"},{id:1935116200,method:"help.getCountriesList",params:[{name:"lang_code",type:"string"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:584962828,method:"messages.getReplies",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:1147761405,method:"messages.getDiscussionMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.DiscussionMessage"},{id:-147740172,method:"messages.readDiscussion",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Bool"},{id:698914348,method:"contacts.blockFromReplies",params:[{name:"flags",type:"#"},{name:"delete_message",type:"flags.0?true"},{name:"delete_history",type:"flags.1?true"},{name:"report_spam",type:"flags.2?true"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1445996571,method:"stats.getMessagePublicForwards",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:-1226791947,method:"stats.getMessageStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"stats.MessageStats"},{id:-299714136,method:"messages.unpinAllMessages",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],type:"messages.AffectedHistory"},{id:1221445336,method:"phone.createGroupCall",params:[{name:"flags",type:"#"},{name:"rtmp_stream",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"schedule_date",type:"flags.1?int"}],type:"Updates"},{id:-1322057861,method:"phone.joinGroupCall",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"video_stopped",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"join_as",type:"InputPeer"},{name:"invite_hash",type:"flags.1?string"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:1342404601,method:"phone.leaveGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"source",type:"int"}],type:"Updates"},{id:2067345760,method:"phone.inviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"Updates"},{id:2054648117,method:"phone.discardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1958458429,method:"phone.toggleGroupCallSettings",params:[{name:"flags",type:"#"},{name:"reset_invite_hash",type:"flags.1?true"},{name:"call",type:"InputGroupCall"},{name:"join_muted",type:"flags.0?Bool"}],type:"Updates"},{id:68699611,method:"phone.getGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"limit",type:"int"}],type:"phone.GroupCall"},{id:-984033109,method:"phone.getGroupParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"ids",type:"Vector"},{name:"sources",type:"Vector"},{name:"offset",type:"string"},{name:"limit",type:"int"}],type:"phone.GroupParticipants"},{id:-1248003721,method:"phone.checkGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"sources",type:"Vector"}],type:"Vector"},{id:1540419152,method:"messages.deleteChat",params:[{name:"chat_id",type:"long"}],type:"Bool"},{id:-104078327,method:"messages.deletePhoneCallHistory",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"}],type:"messages.AffectedFoundMessages"},{id:1140726259,method:"messages.checkHistoryImport",params:[{name:"import_head",type:"string"}],type:"messages.HistoryImportParsed"},{id:873008187,method:"messages.initHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"file",type:"InputFile"},{name:"media_count",type:"int"}],type:"messages.HistoryImport"},{id:713433234,method:"messages.uploadImportedMedia",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"},{name:"file_name",type:"string"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:-1271008444,method:"messages.startHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"}],type:"Bool"},{id:-1565154314,method:"messages.getExportedChatInvites",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"},{name:"offset_date",type:"flags.2?int"},{name:"offset_link",type:"flags.2?string"},{name:"limit",type:"int"}],type:"messages.ExportedChatInvites"},{id:1937010524,method:"messages.getExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"messages.ExportedChatInvite"},{id:-1110823051,method:"messages.editExportedChatInvite",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"string"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"request_needed",type:"flags.3?Bool"},{name:"title",type:"flags.4?string"}],type:"messages.ExportedChatInvite"},{id:1452833749,method:"messages.deleteRevokedExportedChatInvites",params:[{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"}],type:"Bool"},{id:-731601877,method:"messages.deleteExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"Bool"},{id:958457583,method:"messages.getAdminsWithInvites",params:[{name:"peer",type:"InputPeer"}],type:"messages.ChatAdminsWithInvites"},{id:-553329330,method:"messages.getChatInviteImporters",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"},{name:"q",type:"flags.2?string"},{name:"offset_date",type:"int"},{name:"offset_user",type:"InputUser"},{name:"limit",type:"int"}],type:"messages.ChatInviteImporters"},{id:-1207017500,method:"messages.setHistoryTTL",params:[{name:"peer",type:"InputPeer"},{name:"period",type:"int"}],type:"Updates"},{id:-91437323,method:"account.reportProfilePhoto",params:[{name:"peer",type:"InputPeer"},{name:"photo_id",type:"InputPhoto"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:187239529,method:"channels.convertToGigagroup",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:1573261059,method:"messages.checkHistoryImportPeer",params:[{name:"peer",type:"InputPeer"}],type:"messages.CheckedHistoryImportPeer"},{id:-248985848,method:"phone.toggleGroupCallRecord",params:[{name:"flags",type:"#"},{name:"start",type:"flags.0?true"},{name:"video",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"title",type:"flags.1?string"},{name:"video_portrait",type:"flags.2?Bool"}],type:"Updates"},{id:-1524155713,method:"phone.editGroupCallParticipant",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"participant",type:"InputPeer"},{name:"muted",type:"flags.0?Bool"},{name:"volume",type:"flags.1?int"},{name:"raise_hand",type:"flags.2?Bool"},{name:"video_stopped",type:"flags.3?Bool"},{name:"video_paused",type:"flags.4?Bool"},{name:"presentation_paused",type:"flags.5?Bool"}],type:"Updates"},{id:480685066,method:"phone.editGroupCallTitle",params:[{name:"call",type:"InputGroupCall"},{name:"title",type:"string"}],type:"Updates"},{id:-277077702,method:"phone.getGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"}],type:"phone.JoinAsPeers"},{id:-425040769,method:"phone.exportGroupCallInvite",params:[{name:"flags",type:"#"},{name:"can_self_unmute",type:"flags.0?true"},{name:"call",type:"InputGroupCall"}],type:"phone.ExportedGroupCallInvite"},{id:563885286,method:"phone.toggleGroupCallStartSubscription",params:[{name:"call",type:"InputGroupCall"},{name:"subscribed",type:"Bool"}],type:"Updates"},{id:1451287362,method:"phone.startScheduledGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1465786252,method:"phone.saveDefaultGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"},{name:"join_as",type:"InputPeer"}],type:"Bool"},{id:-873829436,method:"phone.joinGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:475058500,method:"phone.leaveGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:676017721,method:"stickers.checkShortName",params:[{name:"short_name",type:"string"}],type:"Bool"},{id:1303364867,method:"stickers.suggestShortName",params:[{name:"title",type:"string"}],type:"stickers.SuggestedShortName"},{id:1032708345,method:"bots.resetBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Bool"},{id:-481554986,method:"bots.getBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Vector"},{id:-1828139493,method:"account.resetPassword",params:[],type:"account.ResetPasswordResult"},{id:1284770294,method:"account.declinePasswordReset",params:[],type:"Bool"},{id:221691769,method:"auth.checkRecoveryPassword",params:[{name:"code",type:"string"}],type:"Bool"},{id:-700916087,method:"account.getChatThemes",params:[{name:"hash",type:"long"}],type:"account.Themes"},{id:-432283329,method:"messages.setChatTheme",params:[{name:"peer",type:"InputPeer"},{name:"emoticon",type:"string"}],type:"Updates"},{id:-1095836780,method:"channels.viewSponsoredMessage",params:[{name:"channel",type:"InputChannel"},{name:"random_id",type:"bytes"}],type:"Bool"},{id:-333377601,method:"channels.getSponsoredMessages",params:[{name:"channel",type:"InputChannel"}],type:"messages.SponsoredMessages"},{id:745510839,method:"messages.getMessageReadParticipants",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Vector"},{id:1240514025,method:"messages.getSearchResultsCalendar",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"}],type:"messages.SearchResultsCalendar"},{id:1855292323,method:"messages.getSearchResultsPositions",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.SearchResultsPositions"},{id:2145904661,method:"messages.hideChatJoinRequest",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:-528091926,method:"messages.hideAllChatJoinRequests",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"}],type:"Updates"},{id:-1323389022,method:"messages.toggleNoForwards",params:[{name:"peer",type:"InputPeer"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-855777386,method:"messages.saveDefaultSendAs",params:[{name:"peer",type:"InputPeer"},{name:"send_as",type:"InputPeer"}],type:"Bool"},{id:231174382,method:"channels.getSendAs",params:[{name:"peer",type:"InputPeer"}],type:"channels.SendAsPeers"},{id:-1081501024,method:"account.setAuthorizationTTL",params:[{name:"authorization_ttl_days",type:"int"}],type:"Bool"},{id:1089766498,method:"account.changeAuthorizationSettings",params:[{name:"flags",type:"#"},{name:"hash",type:"long"},{name:"encrypted_requests_disabled",type:"flags.0?Bool"},{name:"call_requests_disabled",type:"flags.1?Bool"}],type:"Bool"},{id:913655003,method:"channels.deleteParticipantHistory",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:-754091820,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.1?true"},{name:"add_to_recent",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?Vector"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1176190792,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?Reaction"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:-21928079,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"ChatReactions"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:1330094102,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"Reaction"}],type:"Bool"},{id:617508334,method:"messages.translateText",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.0?InputPeer"},{name:"msg_id",type:"flags.0?int"},{name:"text",type:"flags.1?string"},{name:"from_lang",type:"flags.2?string"},{name:"to_lang",type:"string"}],type:"messages.TranslatedText"},{id:841173339,method:"messages.getUnreadReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:1420459918,method:"messages.readReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],type:"messages.AffectedHistory"},{id:-1963375804,method:"contacts.resolvePhone",params:[{name:"phone",type:"string"}],type:"contacts.ResolvedPeer"},{id:447879488,method:"phone.getGroupCallStreamChannels",params:[{name:"call",type:"InputGroupCall"}],type:"phone.GroupCallStreamChannels"},{id:-558650433,method:"phone.getGroupCallStreamRtmpUrl",params:[{name:"peer",type:"InputPeer"},{name:"revoke",type:"Bool"}],type:"phone.GroupCallStreamRtmpUrl"},{id:276705696,method:"messages.searchSentMedia",params:[{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:385663691,method:"messages.getAttachMenuBots",params:[{name:"hash",type:"long"}],type:"AttachMenuBots"},{id:1998676370,method:"messages.getAttachMenuBot",params:[{name:"bot",type:"InputUser"}],type:"AttachMenuBotsBot"},{id:1777704297,method:"messages.toggleBotInAttachMenu",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"bot",type:"InputUser"},{name:"enabled",type:"Bool"}],type:"Bool"},{id:395003915,method:"messages.requestWebView",params:[{name:"flags",type:"#"},{name:"from_bot_menu",type:"flags.4?true"},{name:"silent",type:"flags.5?true"},{name:"peer",type:"InputPeer"},{name:"bot",type:"InputUser"},{name:"url",type:"flags.1?string"},{name:"start_param",type:"flags.3?string"},{name:"theme_params",type:"flags.2?DataJSON"},{name:"platform",type:"string"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"WebViewResult"},{id:2146648841,method:"messages.prolongWebView",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"peer",type:"InputPeer"},{name:"bot",type:"InputUser"},{name:"query_id",type:"long"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Bool"},{id:698084494,method:"messages.requestSimpleWebView",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"url",type:"string"},{name:"theme_params",type:"flags.0?DataJSON"},{name:"platform",type:"string"}],type:"SimpleWebViewResult"},{id:172168437,method:"messages.sendWebViewResultMessage",params:[{name:"bot_query_id",type:"string"},{name:"result",type:"InputBotInlineResult"}],type:"WebViewMessageSent"},{id:-603831608,method:"messages.sendWebViewData",params:[{name:"bot",type:"InputUser"},{name:"random_id",type:"long"},{name:"button_text",type:"string"},{name:"data",type:"string"}],type:"Updates"},{id:1157944655,method:"bots.setBotMenuButton",params:[{name:"user_id",type:"InputUser"},{name:"button",type:"BotMenuButton"}],type:"Bool"},{id:-1671369944,method:"bots.getBotMenuButton",params:[{name:"user_id",type:"InputUser"}],type:"BotMenuButton"},{id:-510647672,method:"account.getSavedRingtones",params:[{name:"hash",type:"long"}],type:"account.SavedRingtones"},{id:1038768899,method:"account.saveRingtone",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"account.SavedRingtone"},{id:-2095414366,method:"account.uploadRingtone",params:[{name:"file",type:"InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:2021942497,method:"bots.setBotBroadcastDefaultAdminRights",params:[{name:"admin_rights",type:"ChatAdminRights"}],type:"Bool"},{id:-1839281686,method:"bots.setBotGroupDefaultAdminRights",params:[{name:"admin_rights",type:"ChatAdminRights"}],type:"Bool"},{id:1092913030,method:"phone.saveCallLog",params:[{name:"peer",type:"InputPhoneCall"},{name:"file",type:"InputFile"}],type:"Bool"},{id:-456419968,method:"channels.toggleJoinToSend",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:1277789622,method:"channels.toggleJoinRequest",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:261206117,method:"payments.exportInvoice",params:[{name:"invoice_media",type:"InputMedia"}],type:"payments.ExportedInvoice"},{id:647928393,method:"messages.transcribeAudio",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.TranscribedAudio"},{id:2132608815,method:"messages.rateTranscribedAudio",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"transcription_id",type:"long"},{name:"good",type:"Bool"}],type:"Bool"},{id:-2131921795,method:"payments.assignAppStoreTransaction",params:[{name:"receipt",type:"bytes"},{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Updates"},{id:-537046829,method:"payments.assignPlayMarketTransaction",params:[{name:"receipt",type:"DataJSON"},{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Updates"},{id:-1614700874,method:"payments.canPurchasePremium",params:[{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Bool"},{id:-1206152236,method:"help.getPremiumPromo",params:[],type:"help.PremiumPromo"},{id:-643100844,method:"messages.getCustomEmojiDocuments",params:[{name:"document_id",type:"Vector"}],type:"Vector"},{id:-67329649,method:"messages.getEmojiStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:248473398,method:"messages.getFeaturedEmojiStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:-70001045,method:"account.updateEmojiStatus",params:[{name:"emoji_status",type:"EmojiStatus"}],type:"Bool"},{id:-696962170,method:"account.getDefaultEmojiStatuses",params:[{name:"hash",type:"long"}],type:"account.EmojiStatuses"},{id:257392901,method:"account.getRecentEmojiStatuses",params:[{name:"hash",type:"long"}],type:"account.EmojiStatuses"},{id:404757166,method:"account.clearRecentEmojiStatuses",params:[],type:"Bool"},{id:1063567478,method:"messages.reportReaction",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction_peer",type:"InputPeer"}],type:"Bool"},{id:-1149164102,method:"messages.getTopReactions",params:[{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Reactions"},{id:960896434,method:"messages.getRecentReactions",params:[{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Reactions"},{id:-1644236876,method:"messages.clearRecentReactions",params:[],type:"Bool"},{id:-2064119788,method:"messages.getExtendedMedia",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:767062953,method:"auth.importWebTokenAuthorization",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"web_auth_token",type:"string"}],type:"auth.Authorization"},{id:-279966037,method:"account.reorderUsernames",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:1490465654,method:"account.toggleUsername",params:[{name:"username",type:"string"},{name:"active",type:"Bool"}],type:"Bool"},{id:-1268978403,method:"channels.reorderUsernames",params:[{name:"channel",type:"InputChannel"},{name:"order",type:"Vector"}],type:"Bool"},{id:1358053637,method:"channels.toggleUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"},{name:"active",type:"Bool"}],type:"Bool"},{id:170155475,method:"channels.deactivateAllUsernames",params:[{name:"channel",type:"InputChannel"}],type:"Bool"},{id:-1540781271,method:"channels.toggleForum",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-200539612,method:"channels.createForumTopic",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"title",type:"string"},{name:"icon_color",type:"flags.0?int"},{name:"icon_emoji_id",type:"flags.3?long"},{name:"random_id",type:"long"},{name:"send_as",type:"flags.2?InputPeer"}],type:"Updates"},{id:233136337,method:"channels.getForumTopics",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"flags.0?string"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_topic",type:"int"},{name:"limit",type:"int"}],type:"messages.ForumTopics"},{id:-1333584199,method:"channels.getForumTopicsByID",params:[{name:"channel",type:"InputChannel"},{name:"topics",type:"Vector"}],type:"messages.ForumTopics"},{id:-186670715,method:"channels.editForumTopic",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"topic_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"icon_emoji_id",type:"flags.1?long"},{name:"closed",type:"flags.2?Bool"},{name:"hidden",type:"flags.3?Bool"}],type:"Updates"},{id:1814925350,method:"channels.updatePinnedForumTopic",params:[{name:"channel",type:"InputChannel"},{name:"topic_id",type:"int"},{name:"pinned",type:"Bool"}],type:"Updates"},{id:876830509,method:"channels.deleteTopicHistory",params:[{name:"channel",type:"InputChannel"},{name:"top_msg_id",type:"int"}],type:"messages.AffectedHistory"},{id:693150095,method:"channels.reorderPinnedForumTopics",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"order",type:"Vector"}],type:"Updates"},{id:1760814315,method:"channels.toggleAntiSpam",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-1471109485,method:"channels.reportAntiSpamFalsePositive",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"Bool"},{id:-1632299963,method:"messages.setDefaultHistoryTTL",params:[{name:"period",type:"int"}],type:"Bool"},{id:1703637384,method:"messages.getDefaultHistoryTTL",params:[],type:"DefaultHistoryTTL"},{id:-127582169,method:"contacts.exportContactToken",params:[],type:"ExportedContactToken"},{id:318789512,method:"contacts.importContactToken",params:[{name:"token",type:"string"}],type:"User"},{id:-1189444673,method:"photos.uploadContactProfilePhoto",params:[{name:"flags",type:"#"},{name:"suggest",type:"flags.3?true"},{name:"save",type:"flags.4?true"},{name:"user_id",type:"InputUser"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:1785624660,method:"channels.toggleParticipantsHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"}]},layer:151};var ts=a(745),as=a.n(ts),ss=a(4736),ns=a.n(ss);function is(e){return e>>>0}function rs(e,t){return e=is(e),t=is(t),ns()(e).shiftLeft(32).add(ns()(t))}const os=ns()(Number.MAX_SAFE_INTEGER),ps=ns()(ns()[2]).pow(64),ds=ps.divide(ns()[2]);function fs(e,t=256){return ns().fromArray(e instanceof Uint8Array?[...e]:e,t)}const cs=+es.API.constructors.find((e=>"boolFalse"===e.predicate)).id,ls=+es.API.constructors.find((e=>"boolTrue"===e.predicate)).id,ms=+es.API.constructors.find((e=>"vector"===e.predicate)).id,gs=+es.MTProto.constructors.find((e=>"gzip_packed"===e.predicate)).id,hs="slice";class us{constructor(e={}){this.maxLength=2048,this.offset=0,this.mtproto=!1,this.debug=!1,this.maxLength=e.startMaxLength||2048,this.mtproto=e.mtproto||!1,this.createBuffer()}createBuffer(){this.buffer=new ArrayBuffer(this.maxLength),this.intView=new Int32Array(this.buffer),this.byteView=new Uint8Array(this.buffer)}getArray(){const e=new ArrayBuffer(this.offset),t=new Int32Array(e);return t.set(this.intView.subarray(0,this.offset/4)),t}getBuffer(){return this.getArray().buffer}getBytes(e=!0){if(e){const e=new ArrayBuffer(this.offset),t=new Uint8Array(e);return t.set(this.byteView.subarray(0,this.offset)),t}const t=new Array(this.offset);for(let e=0;e>>",e.toString(16),e,t);const a=this.offset/4;return this.checkLength(4),this.intView[a]=e,this.offset+=4,a}storeInt(e,t){return this.writeInt(e,(t||"")+":int")}storeBool(e,t){e?this.writeInt(ls,(t||"")+":bool"):this.writeInt(cs,(t||"")+":bool")}storeLongP(e,t,a){this.writeInt(t,(a||"")+":long[low]"),this.writeInt(e,(a||"")+":long[high]")}storeLong(e,t){if(Array.isArray(e))return 2===e.length?this.storeLongP(e[0],e[1],t):this.storeIntBytes(e,64,t);const a=(s=ns()(e)).isNegative()?ps.add(s):s;var s;const{quotient:n,remainder:i}=a.divmod(4294967296),r=n.toJSNumber(),o=i.toJSNumber();this.writeInt(o,(t||"")+":long[low]"),this.writeInt(r,(t||"")+":long[high]")}storeDouble(e,t){const a=new ArrayBuffer(8),s=new Int32Array(a);new Float64Array(a)[0]=e,this.writeInt(s[0],(t||"")+":double[low]"),this.writeInt(s[1],(t||"")+":double[high]")}storeString(e,t){this.debug&&console.log(">>>",e,(t||"")+":string"),void 0===e&&(e="");const a=unescape(encodeURIComponent(e));this.checkLength(a.length+8);const s=a.length;s<=253?this.byteView[this.offset++]=s:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&s,this.byteView[this.offset++]=(65280&s)>>8,this.byteView[this.offset++]=(16711680&s)>>16);for(let e=0;e>>",T(e),(t||"")+":bytes");const a=e.length;for(this.checkLength(a+8),a<=253?this.byteView[this.offset++]=a:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&a,this.byteView[this.offset++]=(65280&a)>>8,this.byteView[this.offset++]=(16711680&a)>>16),this.byteView.set(e,this.offset),this.offset+=a;this.offset%4;)this.byteView[this.offset++]=0}storeIntBytes(e,t,a){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const s=e.length;if(t%32||8*s!==t){const n=new Error("Invalid bits: "+t+", "+s);throw console.error(n,e,a),n}this.debug&&console.log(">>>",T(e),(a||"")+":int"+t),this.checkLength(s),this.byteView.set(e,this.offset),this.offset+=s}storeRawBytes(e,t){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const a=e.length;this.debug&&console.log(">>>",T(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?es.MTProto:es.API).methods.find((t=>t.method===e));if(!a)throw new Error("No method "+e+" found");this.storeInt(a.id,e+"[id]");const s=t.pFlags||t,n={};for(const i of a.params){let a=i.type;if(-1!==a.indexOf("?")){const e=a.split("?"),n=e[0].split(".");if(!(t[n[0]]&1<<+n[1])){if(!("true"===e[1]?s[i.name]:void 0!==t[i.name]))continue;t[n[0]]|=1<<+n[1]}a=e[1]}const r=this.storeObject(t[i.name],a,e+"["+i.name+"]");"#"===a&&(t[i.name]=t[i.name]||0,n[i.name]=r)}for(const e in n)this.intView[n[e]]=t[e];return a.type}storeObject(e,t,a){switch(t){case"#":e=e||0;case"int":return this.storeInt(e,a);case"long":return this.storeLong(e,a);case"int128":return this.storeIntBytes(e,128,a);case"int256":return this.storeIntBytes(e,256,a);case"int512":return this.storeIntBytes(e,512,a);case"string":return this.storeString(e,a);case"bytes":return this.storeBytes(e,a);case"double":return this.storeDouble(e,a);case"Bool":return this.storeBool(e,a);case"true":return}if(Array.isArray(e)){if("Vector"===t.substr(0,6))this.writeInt(ms,a+"[id]");else if("vector"!==t.substr(0,6))throw new Error("Invalid vector type "+t);const s=t.substr(7,t.length-8);this.writeInt(e.length,a+"[count]");for(let t=0;te.predicate===n));if((i="%"===t.charAt(0))&&(t=t.substr(1)),!r)throw new Error("No predicate "+n+" found");n===t&&(i=!0),i||this.writeInt(r.id,a+"["+n+"][id]");const o=e.pFlags,p={};for(const t of r.params){let s=t.type;if(-1!==s.indexOf("?")){const a=s.split("?"),n=a[0].split(".");if(!(e[n[0]]&1<<+n[1])){if(!("true"===a[1]?o&&o[t.name]:void 0!==e[t.name]))continue;e[n[0]]|=1<<+n[1]}s=a[1]}const i=this.storeObject(e[t.name],s,a+"["+n+"]["+t.name+"]");"#"===s&&(e[t.name]=e[t.name]||0,p[t.name]=i)}for(const t in p)this.intView[p[t]]=e[t];return r.type}}class ys{constructor(e,t={}){this.offset=0,this.mtproto=!1,e instanceof ArrayBuffer?(this.buffer=e,this.intView=new Int32Array(e),this.byteView=new Uint8Array(this.buffer)):(this.buffer=e.buffer,this.intView=new Int32Array(e.buffer),this.byteView=e),this.override=t.override||{},this.mtproto=!!t.mtproto,this.debug=void 0!==t.debug&&t.debug}readInt(e){if(this.byteView.length-this.offset<4)throw console.error(this.byteView,this.offset),new Error("Nothing to fetch: "+e);const t=this.intView[this.offset/4];return this.debug&&console.log("<<<",t.toString(16),t,e,this.byteView.slice(this.offset-16,this.offset+16),T(this.byteView.slice(this.offset-16,this.offset+16))),this.offset+=4,t}fetchInt(e){return this.readInt((e||"")+":int")}fetchDouble(e){const t=new ArrayBuffer(8),a=new Int32Array(t),s=new Float64Array(t);return a[0]=this.readInt((e||"")+":double[low]"),a[1]=this.readInt((e||"")+":double[high]"),s[0]}fetchLong(e){const t=this.readInt((e||"")+":long[low]");let a=rs(this.readInt((e||"")+":long[high]"),t);var s;return this.mtproto||(a=(s=a).greater(ds)?s.minus(ps):s),!this.mtproto&&os.greaterOrEquals(a.abs())?a.toJSNumber():a.toString(10)}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===ls||t!==cs&&(this.offset-=4,this.fetchObject("Object",e))}fetchString(e){let t=this.byteView[this.offset++];254===t&&(t=this.byteView[this.offset++]|this.byteView[this.offset++]<<8|this.byteView[this.offset++]<<16);let a,s="";for(let e=0;ethis.byteView.byteLength)throw new Error("Invalid raw bytes length: "+e+", buffer len: "+this.byteView.byteLength);if(t){const t=new Uint8Array(e);return t.set(this.byteView[hs](this.offset,this.offset+e)),this.offset+=e,t}const s=new Array(e);for(let t=0;t0){const n=e.substr(7,e.length-8);for(let e=0;ee.type===t)),!s)throw new Error("Constructor not found for type: "+e)}else{const r=this.readInt(t+"[id]");if(r===gs){const a=(i=this.fetchBytes(t+"[packed_string]"),as().inflate(i,void 0));return new ys(a).fetchObject(e,t)}if(r===ms)return this.fetchVector(e,t);let o=a.constructorsIndex;if(!o){a.constructorsIndex=o={};for(let e=0,t=a.constructors.length;e0&&r{var e;if(this.pingDelayDisconnectDeferred||!this.transport||!this.transport.connected)return;const t=this.pingDelayDisconnectDeferred=(0,v.Z)(),a=this.delays,s=this.delays.pingMaxTime,n=Math.min(null!==(e=this.lastPingTime)&&void 0!==e?e:0,s),i=Math.round(a.disconnectDelayMin+n/s*(a.disconnectDelayMax-a.disconnectDelayMin)),r=1e3*i,o=this.lastPingStartTime=Date.now(),p=this.lastPingDelayDisconnectId=(0,Te.a)(),d={notContentRelated:!0};this.wrapMtpCall("ping_delay_disconnect",{ping_id:p,disconnect_delay:i},d);const f=this.log.bindPrefix("sendPingDelayDisconnect");this.debug&&f.debug(`ping, timeout=${r}, lastPingTime=${this.lastPingTime}, msgId=${d.messageId}, pingId=${p}`);const c=E.Z.setTimeout(t.reject,r);t.then((e=>{clearTimeout(c);const t=Date.now()-o;if(this.lastPingTime=t/1e3,this.debug&&f.debug(`pong, reason='${e}', time=${n}, msgId=${d.messageId}`),t>r)throw void 0;return(0,P.Z)(Math.max(0,this.delays.pingInterval-t))})).catch((()=>{clearTimeout(c);const e=this.transport;this.pingDelayDisconnectDeferred===t&&(null==e?void 0:e.connection)&&(f.error("catch, closing connection",this.lastPingTime,d.messageId),e.connection.close())})).finally((()=>{this.pingDelayDisconnectDeferred===t&&(this.pingDelayDisconnectDeferred=void 0,this.sendPingDelayDisconnect())}))},this.checkLongPoll=()=>{const e=this.cleanupSent();if(this.longPollPending&&Date.now(){e&&(t!==this.dcId||this.sleepAfter&&Date.now()>this.sleepAfter)||this.sendLongPoll()}))},this.checkConnection=e=>{if(this.debug&&this.log("Check connection",e),this.clearCheckConnectionTimeout(),!this.transport)return void this.log.warn("No transport for checkConnection");const t=new us({mtproto:!0}),a=(0,Te.a)();t.storeMethod("ping",{ping_id:a});const s={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),body:t.getBytes(!0)};this.offline&&this.setConnectionStatus(U.Q.Connecting),this.sendEncryptedRequest(s).then((()=>{this.toggleOffline(!1)}),(()=>{this.debug&&this.log("Delay",1e3*this.checkConnectionPeriod),this.checkConnectionTimeout=E.Z.setTimeout((()=>this.checkConnection("from failed checkConnection request")),1e3*this.checkConnectionPeriod|0),this.checkConnectionPeriod=Math.min(60,1.5*this.checkConnectionPeriod)}))},this.authKeyUint8=(0,bs.Z)(this.authKey),this.serverSalt=(0,bs.Z)(i),this.isFileUpload=!!r.fileUpload,this.isFileDownload=!!r.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload,this.delays=this.isFileNetworker?Is.file:Is.client;const o=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+a+o,this.log=(0,I.kg)(this.name+(o?"":"-C")+"-"+ws++,I.v9.Log|I.v9.Error|I.v9.Warn),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=w(new Uint8Array(8))}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&(0,ne.Z)(t.inner,((e,a)=>{const s=this.updateSentMessage(e);s?t.inner[a]=s.msg_id:t.inner.splice(a,1)})),t.msg_id=this.timeManager.generateId(),t.seq_no=this.generateSeqNo(t.notContentRelated||t.container),this.debug&&this.log(`updateSentMessage, old=${e}, new=${t.msg_id}`),this.sentMessages[t.msg_id]=t,delete this.sentMessages[e],t)}generateSeqNo(e){let t=2*this.seqNo;return e||(t++,this.seqNo++),t}wrapMtpCall(e,t,a){const s=new us({mtproto:!0});s.storeMethod(e,t);const n=this.timeManager.generateId(),i=this.generateSeqNo(),r={msg_id:n,seq_no:i,body:s.getBytes(!0)};return b.Z.debug&&this.log("MT call",e,t,n,i),this.pushMessage(r,a)}wrapMtpMessage(e,t){const a=new us({mtproto:!0});a.storeObject(e,"Object");const s=this.timeManager.generateId(),n=this.generateSeqNo(t.notContentRelated),i={msg_id:s,seq_no:n,body:a.getBytes(!0)};return b.Z.debug&&this.log("MT message",e,s,n),this.pushMessage(i,t)}wrapApiCall(e,t={},a={}){const s=new us(a);if(!this.connectionInited){const e=es.API.methods.find((e=>"invokeWithLayer"===e.method));if(!e)throw new Error("no invokeWithLayer!");s.storeInt(+e.id,"invokeWithLayer"),s.storeInt(es.layer,"layer");const t=es.API.methods.find((e=>"initConnection"===e.method));if(!t)throw new Error("no initConnection!");s.storeInt(+t.id,"initConnection"),s.storeInt(0,"flags"),s.storeInt(_.Z.id,"api_id"),s.storeString(i().USER_AGENT||"Unknown UserAgent","device_model"),s.storeString(navigator.platform||"Unknown Platform","system_version"),s.storeString(_.Z.version+(_.Z.isMainDomain?" "+_.Z.suffix:""),"app_version"),s.storeString(navigator.language||"en","system_lang_code"),s.storeString(_.Z.langPack,"lang_pack"),s.storeString(this.networkerFactory.language,"lang_code")}if(a.afterMessageId){if(void 0===Cs){const e=es.API.methods.find((e=>"invokeAfterMsg"===e.method));Cs=e?+e.id:0}Cs?(s.storeInt(Cs,"invokeAfterMsg"),s.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=s.storeMethod(e,t);const n={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:s.getBytes(!0),isAPI:!0};return b.Z.debug?this.log("Api call",e,n,t,a):this.debug&&this.log("Api call",e,t,a),this.pushMessage(n,a)}changeTransport(e){const t=this.transport;t&&(t.destroy(),this.nextReqTimeout&&(clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0),this.connectionInited=!1,void 0!==this.longPollInterval&&(clearInterval(this.longPollInterval),this.longPollInterval=void 0),this.clearCheckConnectionTimeout()),this.log("change transport",e,t),this.clearPingDelayDisconnect(),this.transport=e,e&&(e.networker=this,e instanceof S&&(this.longPollInterval=E.Z.setInterval(this.checkLongPoll,1e4),this.checkLongPoll(),this.checkConnection("changed transport")),e.connection&&e.connected&&this.setConnectionStatus(U.Q.Connected),this.resend())}destroy(){this.log("destroy")}forceReconnectTimeout(){this.transport.reconnect?this.transport.reconnect():this.resend()}forceReconnect(){this.transport.forceReconnect?this.transport.forceReconnect():this.checkConnection("force reconnect")}clearPingDelayDisconnect(){const e=this.pingDelayDisconnectDeferred;this.pingDelayDisconnectDeferred=void 0,this.lastPingDelayDisconnectId=void 0,e&&e.reject()}sendLongPoll(){this.sendingLongPoll||(this.sendingLongPoll=!0,this.longPollPending=Date.now()+25e3,this.debug&&this.log.debug("sendLongPoll",this.longPollPending),this.wrapMtpCall("http_wait",{max_delay:500,wait_after:150,max_wait:25e3},{noResponse:!0,longPoll:!0}).then((()=>{this.longPollPending=void 0,setTimeout(this.checkLongPoll,0)}),(e=>{this.log("Long-poll failed",e)})).finally((()=>{this.sendingLongPoll=void 0})))}clearCheckConnectionTimeout(){void 0!==this.checkConnectionTimeout&&(clearTimeout(this.checkConnectionTimeout),this.checkConnectionTimeout=void 0)}toggleOffline(e){if(this.offline!==e)if(this.offline=e,this.clearCheckConnectionTimeout(),e){clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0,this.checkConnectionPeriod<1.5&&(this.checkConnectionPeriod=0);const e=1e3*this.checkConnectionPeriod|0;this.checkConnectionRetryAt=Date.now()+e,this.setConnectionStatus(U.Q.Closed,this.checkConnectionRetryAt),this.checkConnectionTimeout=E.Z.setTimeout((()=>this.checkConnection("from toggleOfline")),e),this.checkConnectionPeriod=Math.min(30,1.5*(1+this.checkConnectionPeriod))}else this.setConnectionStatus(U.Q.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?U.Q.Closed:U.Q.Connected,e?this.checkConnectionRetryAt:void 0)}handleSentEncryptedRequestHTTP(e,t,a){e.then((e=>(this.toggleOffline(!1),this.parseResponse(e).then((e=>(this.debug&&this.log.debug("Server response",e),this.processMessage(e.response,e.messageId,e.sessionId),this.checkLongPoll(),this.checkConnectionPeriod=Math.max(1.1,Math.sqrt(this.checkConnectionPeriod)),!0))))),(e=>(this.log.error("Encrypted request failed",e,t),this.pushResend(t.msg_id),this.toggleOffline(!0),!1))).then((e=>{const t=this.sentMessages;a.forEach((a=>{const s=t[a];if(s){const n=s.deferred;delete t[a],delete this.pendingMessages[a],e?n.resolve():n.reject()}}))}))}pushMessage(e,t){let a;return t.notContentRelated&&!t.noResponse||(a=(0,v.Z)()),this.sentMessages[e.msg_id]=Object.assign(e,t,a?{deferred:a}:void 0),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),(0,fe.Z)(t)&&(t.messageId=e.msg_id),a}attachPromise(e,t){const a=setTimeout((()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime{clearTimeout(a),this.setConnectionStatus(U.Q.Connected),--this.activeRequests,this.setDrainTimeout()})),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=E.Z.setTimeout((()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()}),1e4))}setConnectionStatus(e,t){var a;const s=e===U.Q.Connected,n=this.status!==e;this.isOnline=s,this.status=e,n&&(this.networkerFactory.onConnectionStatusChange&&this.networkerFactory.onConnectionStatusChange({_:"networkerStatus",status:e,dcId:this.dcId,name:this.name,isFileNetworker:this.isFileNetworker,isFileDownload:this.isFileDownload,isFileUpload:this.isFileUpload,retryAt:t}),this.isOnline&&this.scheduleRequest(),(null===(a=this.transport)||void 0===a?void 0:a.connection)&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect()))}pushResend(e,t=100){const a=t?Date.now()+t:0,s=this.sentMessages[e];if(s.container)for(const e of s.inner)this.pendingMessages[e]=a;else this.pendingMessages[e]=a;s.acked&&this.log.error("pushResend: acked message?",s),this.debug&&this.log.debug("pushResend:",e,s,this.pendingMessages,t),this.scheduleRequest(t)}getMsgKey(e,t){return Ms(this,void 0,void 0,(function*(){const a=t?0:8,n=(0,_s.Z)(this.authKeyUint8.subarray(88+a,88+a+32),e),i=yield s.Z.invokeCrypto("sha256",n);return new Uint8Array(i).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,n=new Uint8Array(52),i=new Uint8Array(52),r=[];return n.set(e,0),n.set(this.authKeyUint8.subarray(a,a+36),16),r.push(s.Z.invokeCrypto("sha256",n)),i.set(this.authKeyUint8.subarray(40+a,40+a+36),0),i.set(e,36),r.push(s.Z.invokeCrypto("sha256",i)),Promise.all(r).then((e=>{const t=new Uint8Array(32),a=new Uint8Array(32),s=new Uint8Array(e[0]),n=new Uint8Array(e[1]);return t.set(s.subarray(0,8)),t.set(n.subarray(8,24),8),t.set(s.subarray(24,32),24),a.set(n.subarray(0,8)),a.set(s.subarray(8,24),8),a.set(n.subarray(24,32),24),[t,a]}))}isStopped(){return this.networkerFactory.akStopped&&!this.isFileNetworker}performScheduledRequest(){if(this.isStopped())return!1;if(this.pendingAcks.length){const e=this.pendingAcks.slice();this.wrapMtpMessage({_:"msgs_ack",msg_ids:e},{notContentRelated:!0,noSchedule:!0})}const e=this.pendingResendReq.length;if(e){const t=Object.assign({},Ss),a=this.pendingResendReq.splice(0,e);this.wrapMtpMessage({_:"msg_resend_req",msg_ids:a},t),this.log("resend: resending requests",t.messageId,a)}let t;const a=[];let s=0,n=!1,i=!1,r=!1;const o=Object.keys(this.pendingMessages).map((e=>ns()(e))).sort(((e,t)=>e.compare(t))).map((e=>e.toString(10)));for(const e of o){const o=this.sentMessages[e];if(o&&o.body){const e=o.body.length+32;if(s+e>655360&&(this.log.warn("lengthOverflow",o,a),r=!0,t))break;a.push(o),s+=e,o.isAPI?n=!0:o.longPoll&&(i=!0),t=o}delete this.pendingMessages[e]}if(this.transport instanceof S&&n&&!i){const e=new us({mtproto:!0});e.storeMethod("http_wait",{max_delay:500,wait_after:150,max_wait:3e3}),a.push({msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:e.getBytes(!0)})}if(!a.length)return;const p=a.filter((e=>e.noResponse)).map((e=>e.msg_id));if(a.length>1){const e=this.generateContainerMessage(s,a);t=e.messageWithBody,this.sentMessages[t.msg_id]=e.message}else this.sentMessages[t.msg_id]=t;this.pendingAcks=[];const d=this.sendEncryptedRequest(t);this.transport instanceof S&&this.handleSentEncryptedRequestHTTP(d,t,p),this.transport instanceof S||this.cleanupSent(),r&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new us({mtproto:!0,startMaxLength:e+64});a.storeInt(1945237724,"CONTAINER[id]"),a.storeInt(t.length,"CONTAINER[count]");const s=[];t.forEach(((e,t)=>{s.push(e.msg_id),a.storeLong(e.msg_id,"CONTAINER["+t+"][msg_id]"),a.storeInt(e.seq_no,"CONTAINER["+t+"][seq_no]"),a.storeInt(e.body.length,"CONTAINER["+t+"][bytes]"),a.storeRawBytes(e.body,"CONTAINER["+t+"][body]")}));const n={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:s};return b.Z.debug&&this.log.warn("Container",s,n.msg_id,n.seq_no),{message:n,messageWithBody:Object.assign({body:a.getBytes(!0)},n)}}getEncryptedMessage(e){return Ms(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield s.Z.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then((e=>s.Z.invokeCrypto("aes-decrypt",t,e[0],e[1])))}getEncryptedOutput(e){const t=new us({startMaxLength:e.body.length+2048});t.storeIntBytes(this.serverSalt,64,"salt"),t.storeIntBytes(this.sessionId,64,"session_id"),t.storeLong(e.msg_id,"message_id"),t.storeInt(e.seq_no,"seq_no"),t.storeInt(e.body.length,"message_data_length"),t.storeRawBytes(e.body,"message_data");const a=t.getBuffer(),s=16-t.getOffset()%16+16*(1+(0,Te.d)(8)%5),n=w(new Uint8Array(s)),i=(0,_s.Z)(a,n);return this.getEncryptedMessage(i).then((e=>{const t=new us({startMaxLength:e.bytes.length+256});return t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data"),t.getBytes(!0)}))}sendEncryptedRequest(e){return Ms(this,void 0,void 0,(function*(){const t=yield this.getEncryptedOutput(e);this.transport||this.log.error("trying to send something when offline",this.transport,this),this.debug&&this.log.debug("sending:",e,[e.msg_id].concat(e.inner||[]),t.length);const a=this.transport?this.transport.send(t):Promise.reject({});if(!(this.transport instanceof S))return a;const s={code:406,type:"NETWORK_BAD_RESPONSE",transport:this.transport};return a.then((e=>{if(!(null==e?void 0:e.byteLength))throw s;return e}),(e=>{throw e.message||e.type||(e=Object.assign(s,{type:"NETWORK_BAD_REQUEST",originalError:e})),e}))}))}parseResponse(e){this.lastResponseTime=Date.now();const t=new ys(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!(0,Ps.Z)(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+T(a));const s=t.fetchIntBytes(128,!0,"msg_key"),n=t.fetchRawBytes(e.byteLength-t.getOffset(),!0,"encrypted_data");return this.getDecryptedMessage(s,n).then((e=>this.getMsgKey(e,!1).then((t=>{if(!(0,Ps.Z)(s,t))throw this.log.warn("[MT] msg_keys",s,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new ys(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const n=a.fetchIntBytes(64,!0,"session_id"),i=a.fetchLong("message_id");if(!((0,Ps.Z)(n,this.sessionId)||this.prevSessionId&&(0,Ps.Z)(n,this.prevSessionId)))throw this.log.warn("Sessions",n,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+T(n));const r=a.fetchInt("seq_no"),o=e.byteLength,p=a.fetchInt("message_data[length]");let d=a.getOffset();if(p%4||p>o-d)throw new Error("[MT] Invalid body length: "+p);const f=a.fetchRawBytes(p,!0,"message_data");d=a.getOffset();const c=o-d;if(c<12||c>1024)throw new Error("[MT] Invalid padding length: "+c);return a=new ys(f,{mtproto:!0,override:{mt_message:(e,t)=>{e.msg_id=a.fetchLong(t+"[msg_id]"),e.seqno=a.fetchInt(t+"[seqno]"),e.bytes=a.fetchInt(t+"[bytes]");const s=a.getOffset();try{e.body=a.fetchObject("Object",t+"[body]")}catch(t){this.log.error("parse error",t.message,t.stack),e.body={_:"parse_error",error:t}}a.getOffset()!==s+e.bytes&&a.setOffset(s+e.bytes)},mt_rpc_result:(e,t)=>{e.req_msg_id=a.fetchLong(t+"[req_msg_id]");const s=this.sentMessages[e.req_msg_id],n=s&&s.resultType||"Object";e.req_msg_id&&!s||(e.result=a.fetchObject(n,t+"[result]"))}}}),{response:a.fetchObject("","INPUT"),messageId:i,sessionId:n,seqNo:r}}))))}applyServerSalt(e){const t=(a=e,vs((s=ns()(a),new Uint8Array(s.toArray(256).value)).reverse(),8,!0,!1,!1));var a,s;qa.Z.set({["dc"+this.dcId+"_server_salt"]:T(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){this.transport instanceof S&&(this.offline&&this.checkConnection("forced schedule"),e||(e=0));const t=Date.now()+(e||0);if(this.nextReq&&(void 0===e||this.nextReq<=t))return;this.nextReqTimeout&&clearTimeout(this.nextReqTimeout);const a=()=>{this.nextReqTimeout=0,this.nextReq=0,this.transport instanceof S&&this.offline||this.performScheduledRequest()};this.nextReq=t,void 0!==e?this.nextReqTimeout=E.Z.setTimeout(a,e):a()}ackMessage(e){let t;this.pendingAcks.push(e),this.transport instanceof S&&(t=3e4),this.scheduleRequest(t)}reqResend(e){this.debug&&this.log.debug("Req resend",e),this.pendingResendReq.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;const t=this.sentMessages;return Object.keys(t).forEach((a=>{const s=t[a];if(s.notContentRelated&&void 0===this.pendingMessages[a])delete t[a];else if(s.container){for(const a of s.inner)if(void 0!==t[a])return void(e=!0);delete t[a]}else e=!0})),!e}processMessageAck(e){const t=this.sentMessages[e];t&&!t.acked&&(t.acked=!0)}processError(e){const t=(e.error_message||"").match(/^([A-Z_0-9]+\b)(: (.+))?/)||[];return e.error_code=e.error_code,{code:!e.error_code||e.error_code<=0?500:e.error_code,type:t[1]||"UNKNOWN",description:t[3]||"CODE#"+e.error_code+" "+e.error_message,originalError:e}}resend(){const e=this.sentMessages;for(const t in e){const a=e[t];(a.body||a.container)&&this.pushResend(t)}this.transport.connection&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect())}applyServerTime(e){const t=ns()(e).shiftRight(32).toJSNumber();return this.log("applying server time",t),this.timeManager.applyServerTime(t)}processMessage(e,t,a){if("messageEmpty"!==e._)if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(this.debug&&this.log.debug("process message",e,t),this.pingDelayDisconnectDeferred&&this.pingDelayDisconnectDeferred.resolve("any message"),e._){case"msg_container":for(const t of e.messages)this.processMessage(t,t.msg_id,a);break;case"bad_server_salt":this.log("Bad server salt",e),this.applyServerSalt(e.new_server_salt),this.sentMessages[e.bad_msg_id]&&this.pushResend(e.bad_msg_id),this.ackMessage(t);break;case"bad_msg_notification":switch(this.log.error("Bad msg notification",e),e.error_code){case 16:case 17:case 32:case 33:case 64:{const a=this.applyServerTime(t);(17===e.error_code||a)&&(this.log("Update session"),this.updateSession());const s=this.updateSentMessage(e.bad_msg_id);s&&this.pushResend(s.msg_id)}}break;case"message":if(-1!==this.lastServerMessages.indexOf(t))return void this.ackMessage(t);this.lastServerMessages.push(t),this.lastServerMessages.length>100&&this.lastServerMessages.shift(),this.processMessage(e.body,e.msg_id,a);break;case"new_session_created":this.ackMessage(t),this.debug&&this.log.debug("new_session_created",e),this.processMessageAck(e.first_msg_id),this.applyServerSalt(e.server_salt),qa.Z.get("dc").then((t=>{t===this.dcId&&!this.isFileNetworker&&this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}));break;case"msgs_ack":this.debug&&this.log("got acks",e.msg_ids);for(const t of e.msg_ids)this.processMessageAck(t);break;case"msg_detailed_info":if(!this.sentMessages[e.msg_id]){this.ackMessage(e.answer_msg_id);break}case"msg_new_detailed_info":if(-1!==this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResend(e.answer_msg_id);break;case"msgs_state_info":{this.ackMessage(e.answer_msg_id);const t=[[this.lastResendReq,this.pendingResendReq]];for(const[a,s]of t)if((null==a?void 0:a.reqMsgId)===e.req_msg_id&&s.length)for(const e of a.msgIds){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}break}case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,s=this.sentMessages[a];if(this.debug&&this.log("Rpc response",e.result,s),this.processMessageAck(a),s){const t=s.deferred;if("rpc_error"===e.result._){const a=this.processError(e.result);this.log("Rpc error",a),t&&t.reject(a)}else t&&t.resolve(e.result),s.isAPI&&!this.connectionInited&&(this.connectionInited=!0);delete this.sentMessages[a]}else this.debug&&this.log("Rpc result for unknown message:",a,e);break}case"pong":{const t=e.ping_id;if(this.lastPingDelayDisconnectId===t){const e=this.pingDelayDisconnectDeferred;e?e.resolve("pong"):this.log("ping deferred deleted",t)}break}default:this.ackMessage(t),null!==this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}else this.log.warn("processMessage: messageEmpty",e,t)}}class As extends G{constructor(){super(...arguments),this.networkers=[],this.language=navigator.language||_.Z.langPackCode,this.updatesProcessor=null,this.akStopped=!1}onConnectionStatusChange(e){this.rootScope.dispatchEvent("connection_status_change",e)}removeNetworker(e){(0,M.Z)(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,s,n){const i=new ks(this,this.timeManager,e,t,a,s,n);return this.networkers.push(i),i}startAll(){if(this.akStopped){const e=this.networkers.filter((e=>e.isStopped()));this.akStopped=!1,this.updatesProcessor&&this.updatesProcessor({_:"new_session_created"});for(const t of e)t.scheduleRequest()}}stopAll(){this.akStopped=!0}setLanguage(e){this.language=e;for(const e of this.networkers)e.isFileNetworker||(e.connectionInited=!1)}unsetConnectionInited(){for(const e of this.networkers)e.connectionInited=!1}forceReconnectTimeout(){for(const e of this.networkers)e.forceReconnectTimeout()}forceReconnect(){for(const e of this.networkers)if(!e.isFileNetworker){e.forceReconnect();break}}}const Ds=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,b.Z.test&&(this.publisKeysHex=this.testPublicKeysHex)}prepare(){return this.preparePromise?this.preparePromise:this.prepared?Promise.resolve():this.preparePromise=Promise.all(this.publisKeysHex.map((e=>{const t=new us;t.storeBytes((0,Ha.Z)(e.modulus),"n"),t.storeBytes((0,Ha.Z)(e.exponent),"e");const a=t.getBuffer();return s.Z.invokeCrypto("sha1",a).then((t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[T(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}}))}))).then((()=>{this.prepared=!0,this.preparePromise=null}))}select(e){return t=this,a=void 0,n=function*(){yield this.prepare();for(let t=0;t{if(d.ZP&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw o;try{const t=new ys(e,{mtproto:!0});if(4===e.length){const e=t.fetchInt();throw this.log.error("mtpSendPlainRequest: wrong response, error code:",e),e}const a=t.fetchLong("auth_key_id");"0"!==a&&this.log.error("auth_key_id !== 0",a);const s=t.fetchLong("msg_id");"0"===s&&this.log.error("msg_id === 0",s);const n=t.fetchInt("msg_len");return n||this.log.error("no msg_len",n),t}catch(e){throw this.log.error("mtpSendPlainRequest: deserialization went bad",e),Object.assign(o,{originalError:e})}}),(e=>{throw e.message||e.type||(e=Object.assign(o,{originalError:e})),e}))}sendReqPQ(e){return Ts(this,void 0,void 0,(function*(){const t=new us({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),d.ZP&&this.log("Send req_pq",T(e.nonce));try{const s=this.sendPlainRequest(e.dcId,t.getBytes(!0));Ds.prepare(),a=yield s}catch(e){throw this.log.error("req_pq error",e.message),e}const n=a.fetchObject("ResPQ");if("resPQ"!==n._)throw new Error("[MT] resPQ response invalid: "+n._);if(!(0,Ps.Z)(e.nonce,n.nonce))throw this.log.error(e.nonce,n.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=n.server_nonce,e.pq=n.pq,e.fingerprints=n.server_public_key_fingerprints,d.ZP&&this.log("Got ResPQ",T(e.serverNonce),T(e.pq),e.fingerprints);const i=yield Ds.select(e.fingerprints);if(!i)throw new Error("[MT] No public key found");e.publicKey=i,d.ZP&&this.log("PQ factorization start",e.pq);try{var r=yield s.Z.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=r[0],e.q=r[1],d.ZP&&this.log("PQ factorization done",r),this.sendReqDhParams(e)}))}sendReqDhParams(e){return Ts(this,void 0,void 0,(function*(){e.newNonce=w(new Uint8Array(32));const t={_:"p_q_inner_data_dc",pq:e.pq,p:e.p,q:e.q,nonce:e.nonce,server_nonce:e.serverNonce,new_nonce:e.newNonce,dc:0},a=new us({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const n=a.getBytes(!0);if(n.length>144)throw"DH_params: data is more than 144 bytes!";const i=vs(n,192,!1,!0,!1),r=i.slice().reverse(),o=yield(()=>Ts(this,void 0,void 0,(function*(){for(;;){const t=w(new Uint8Array(32)),a=r.concat(yield s.Z.invokeCrypto("sha256",t.concat(i)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const n=yield s.Z.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),o=Us(t,yield s.Z.invokeCrypto("sha256",n)).concat(n),p=fs(o),d=ns()(e.publicKey.modulus,16);if(-1===p.compare(d))return o}})))(),p=vs(yield s.Z.invokeCrypto("rsa-encrypt",o,e.publicKey),256,!0,!0,!0),f={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:p},c=new us({mtproto:!0});c.storeMethod("req_DH_params",f);const l=c.getBytes(!0);let m;d.ZP&&this.log("Send req_DH_params",f);try{m=yield this.sendPlainRequest(e.dcId,l)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const g=m.fetchObject("Server_DH_Params","RESPONSE");if(d.ZP&&this.log("Sent req_DH_params, response:",g),"server_DH_params_fail"!==g._&&"server_DH_params_ok"!==g._)throw new Error("[MT] Server_DH_Params response invalid: "+g._);if(!(0,Ps.Z)(e.nonce,g.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,g.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===g._){const t=(yield s.Z.invokeCrypto("sha1",e.newNonce)).slice(-16);if(!(0,Ps.Z)(t,g.new_nonce_hash))throw new Error("[MT] server_DH_params_fail new_nonce_hash mismatch");throw new Error("[MT] server_DH_params_fail")}try{yield this.decryptServerDhDataAnswer(e,g.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return Ts(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.serverNonce))).concat((yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield s.Z.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),n=a.slice(0,20),i=a.slice(20),r=new ys(i,{mtproto:!0}),o=r.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==o._)throw new Error("[MT] server_DH_inner_data response invalid: "+o);if(!(0,Ps.Z)(e.nonce,o.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,o.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");d.ZP&&this.log("Done decrypting answer"),e.g=o.g,e.dhPrime=o.dh_prime,e.gA=o.g_a,e.serverTime=o.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const p=r.getOffset();if(!(0,Ps.Z)(n,yield s.Z.invokeCrypto("sha1",i.slice(0,p))))throw new Error("[MT] server_DH_inner_data SHA1 mismatch");this.timeManager.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){d.ZP&&this.log("Verifying DH params",e,t,a);const s=T(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==s)throw new Error("[MT] DH params are not verified: unknown dhPrime");d.ZP&&this.log("dhPrime cmp OK");const n=fs(a),i=ns()(s,16);if(n.compare(ns().one)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(n.compare(i.subtract(ns().one))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");d.ZP&&this.log("1 < gA < dhPrime-1 OK");const r=ns()(2).pow(1984);if(n.compare(r)<0)throw new Error("[MT] DH params are not verified: gA < 2^{2048-64}");if(n.compare(i.subtract(r))>=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return d.ZP&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return Ts(this,void 0,void 0,(function*(){const t=(0,Ha.Z)(e.g.toString(16));e.b=w(new Uint8Array(256));try{var a=yield s.Z.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const n=new us({mtproto:!0});n.storeObject({_:"client_DH_inner_data",nonce:e.nonce,server_nonce:e.serverNonce,retry_id:[0,e.retry++],g_b:a},"Client_DH_Inner_Data");const i=(yield s.Z.invokeCrypto("sha1",n.getBuffer())).concat(n.getBytes(!0)),r=yield s.Z.invokeCrypto("aes-encrypt",i,e.tmpAesKey,e.tmpAesIv),o=new us({mtproto:!0});let p;o.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:r}),d.ZP&&this.log("Send set_client_DH_params");try{p=yield this.sendPlainRequest(e.dcId,o.getBytes(!0))}catch(e){throw e}const f=p.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==f._&&"dh_gen_retry"!==f._&&"dh_gen_fail"!==f._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+f._);if(!(0,Ps.Z)(e.nonce,f.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,f.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var c=yield s.Z.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw c}const l=yield s.Z.invokeCrypto("sha1",c),m=l.slice(0,8),g=l.slice(-8);switch(d.ZP&&this.log("Got Set_client_DH_params_answer",f._,c),f._){case"dh_gen_ok":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([1],m))).slice(-16);if(!(0,Ps.Z)(t,f.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,f),new Error("new_nonce_hash1 mismatch");const a=Us(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return d.ZP&&this.log("Auth successfull!",g,c,a),e.authKeyId=g,e.authKey=c,e.serverSalt=a,e}case"dh_gen_retry":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([2],m))).slice(-16);if(!(0,Ps.Z)(t,f.new_nonce_hash2))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch");return this.sendSetClientDhParams(e)}case"dh_gen_fail":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([3],m))).slice(-16);if(!(0,Ps.Z)(t,f.new_nonce_hash3))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch");throw new Error("[MT] Set_client_DH_params_answer fail")}}}))}getTransportType(){return this.getTransportTypePromise?this.getTransportTypePromise:this.getTransportTypePromise=Z.pingTransports().then((({websocket:e})=>{this.transportType=e?"websocket":"https",this.log("will use transport:",this.transportType)}))}auth(e){let t=this.cached[e];return t||(t=new Promise(((t,a)=>Ts(this,void 0,void 0,(function*(){let s;yield this.getTransportType();let n=1;for(;n++<=3;)try{const a={dcId:e,nonce:w(new Uint8Array(16))},s=this.sendReqPQ(a);return void t(yield s)}catch(e){s=e}a(s)})))),this.cached[e]=t)}}class Fs extends G{after(){this.lastMessageId=[0,0],this.timeOffset=0,qa.Z.get("server_time_offset").then((e=>{e&&(this.timeOffset=e)}))}getServerTimeOffset(){return this.timeOffset}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|(0,Te.d)(16)<<3|4];return(this.lastMessageId[0]>t[0]||this.lastMessageId[0]===t[0]&&this.lastMessageId[1]>=t[1])&&(t=[this.lastMessageId[0],this.lastMessageId[1]+4]),this.lastMessageId=t,rs(t[0],t[1]).toString(10)}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),s=Math.abs(this.timeOffset-a)>10;return this.lastMessageId=[0,0],this.timeOffset!==a&&(qa.Z.set({server_time_offset:a}),this.timeOffset=a),s}}class Rs{saveWebDocument(e){if(!e)return;const t=e.attributes.find((e=>"documentAttributeImageSize"===e._));return t&&(e.w=t.w,e.h=t.h),e}}class xs extends G{getInputInvoiceBySlug(e){return{_:"inputInvoiceSlug",slug:e}}getInputInvoiceByPeerId(e,t){return{_:"inputInvoiceMessage",peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}}getPaymentForm(e){return this.apiManager.invokeApi("payments.getPaymentForm",{invoice:e}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}getPaymentReceipt(e,t){return this.apiManager.invokeApi("payments.getPaymentReceipt",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}validateRequestedInfo(e,t,a){return this.apiManager.invokeApi("payments.validateRequestedInfo",{save:a,invoice:e,info:t})}sendPaymentForm(e,t,a,s,n,i){return this.apiManager.invokeApi("payments.sendPaymentForm",{form_id:t,invoice:e,requested_info_id:a,shipping_option_id:s,credentials:n,tip_amount:i||void 0}).then((e=>("payments.paymentResult"===e._&&this.apiUpdatesManager.processUpdateMessage(e.updates),e)))}clearSavedInfo(e,t){return this.apiManager.invokeApi("payments.clearSavedInfo",{info:e,credentials:t})}}var Bs=a(8794);class Vs extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{e?this.attachMenuBots=new Map:(this.attachMenuBots.clear(),this.attachMenuBotsArr=void 0)},this.onUpdateAttachMenuBots=e=>{this.clear(),this.getAttachMenuBots()}}after(){this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateAttachMenuBots:this.onUpdateAttachMenuBots})}saveAttachMenuBot(e){this.attachMenuBots.set(e.bot_id,e);const t=(0,Bs.Z)(e);return t.icon=this.appDocsManager.saveDoc(t.icon,{type:"attachMenuBotIcon",botId:e.bot_id}),e}saveAttachMenuBots(e){e.saved||(e.saved=!0,e.forEach((e=>this.saveAttachMenuBot(e))))}getAttachMenuBots(){var e;return null!==(e=this.attachMenuBotsArr)&&void 0!==e?e:this.apiManager.invokeApiSingleProcess({method:"messages.getAttachMenuBots",processResult:e=>((0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.saveAttachMenuBots(e.bots),this.attachMenuBotsArr=e.bots.slice(0,0))})}getAttachMenuBotCached(e){return this.attachMenuBots.get(e)}getAttachMenuBot(e,t){throw this.appUsersManager.isAttachMenuBot(e),(0,X.Z)("BOT_INVALID")}requestWebView(e){const{botId:t,peerId:a,url:s,fromBotMenu:n,themeParams:i,replyToMsgId:r,silent:o,sendAsPeerId:p,startParam:d,threadId:f}=e;return this.apiManager.invokeApiSingleProcess({method:"messages.requestWebView",params:{peer:this.appPeersManager.getInputPeerById(a),bot:this.appUsersManager.getUserInput(t),silent:o,platform:"web",url:s,reply_to_msg_id:r?(0,oe.Z)(r):void 0,from_bot_menu:n,theme_params:i,send_as:p?this.appPeersManager.getInputPeerById(p):void 0,start_param:d,top_msg_id:f?(0,oe.Z)(f):void 0},processResult:e=>(console.log(e),e)})}prolongWebView(e){return this.apiManager.invokeApiSingleProcess({method:"messages.prolongWebView",params:{peer:this.appPeersManager.getInputPeerById(e.peerId),bot:this.appUsersManager.getUserInput(e.botId),query_id:e.queryId,silent:e.silent,reply_to_msg_id:e.replyToMsgId?(0,oe.Z)(e.replyToMsgId):void 0,send_as:e.sendAsPeerId?this.appPeersManager.getInputPeerById(e.sendAsPeerId):void 0,top_msg_id:e.threadId?(0,oe.Z)(e.threadId):void 0},processResult:e=>{console.log(e)}})}}class Os extends G{requestUrlAuth(e,t,a,s){return this.apiManager.invokeApi("messages.requestUrlAuth",{button_id:s,msg_id:a?(0,oe.Z)(a):void 0,peer:t?this.appPeersManager.getInputPeerById(t):void 0,url:e}).then((e=>("urlAuthResultRequest"===e._&&this.appUsersManager.saveApiUser(e.bot),e)))}acceptUrlAuth(e,t,a,s,n){return this.apiManager.invokeApi("messages.acceptUrlAuth",{button_id:s,msg_id:a?(0,oe.Z)(a):void 0,peer:t?this.appPeersManager.getInputPeerById(t):void 0,url:e,write_allowed:n}).then((e=>e))}getWebAuthorizations(){return this.apiManager.invokeApi("account.getWebAuthorizations").then((e=>(this.appUsersManager.saveApiUsers(e.users),e.authorizations)))}resetWebAuthorization(e){return this.apiManager.invokeApi("account.resetWebAuthorization",{hash:e})}resetWebAuthorizations(){return this.apiManager.invokeApi("account.resetWebAuthorizations")}}class Ls extends G{after(){this.wallPapers={}}saveWallPaper(e){return"wallPaperNoFile"!==e._&&(e.document=this.appDocsManager.saveDoc(e.document,{type:"wallPaper",wallPaperId:e.id})),this.wallPapers[e.id]=e,e}getWallPaper(e){return this.apiManager.invokeApiSingleProcess({method:"account.getWallPaper",params:{wallpaper:e},processResult:e=>this.saveWallPaper(e)})}getInputWallPaper(e){return"string"==typeof e?{_:"inputWallPaperSlug",slug:e}:"wallPaperNoFile"===e._?{_:"inputWallPaperNoFile",id:e.id}:{_:"inputWallPaper",id:e.id,access_hash:e.access_hash}}getWallPaperById(e){const t=this.wallPapers[e];return this.getWallPaper(this.getInputWallPaper(t))}getThemes(){return this.apiManager.invokeApiSingleProcess({method:"account.getThemes",params:{format:"macos",hash:0},processResult:e=>((0,ue.Z)(e),e.themes.forEach((e=>{e.settings&&e.settings.forEach((e=>{e.wallpaper=this.saveWallPaper(e.wallpaper)}))})),e.themes)})}getWallPapers(){return this.apiManager.invokeApiHashable({method:"account.getWallPapers"}).then((e=>{const t=e.wallpapers;return t.forEach(((e,t,a)=>{a[t]=this.saveWallPaper(e)})),t}))}}const Ns=new class{constructor(){this.cryptoWorkersURLs=[],this.cryptoPortsAttached=0,this.cryptoPortPromise=(0,v.Z)(),this.cryptoPortPromise.then((()=>{this.cryptoPortPromise=void 0}))}start(){const e=f.Z.getInstance();e.addEventListener("manager",(({name:e,method:t,args:a})=>(0,q.Z)(this.getManagers(),(s=>{const n=s[e];return n[t].apply(n,a)})))),e.addEventListener("cryptoPort",((e,t,a)=>{var n;const i=a.ports[0];this.cryptoPortsAttached>=this.cryptoWorkersURLs.length?i.close():(++this.cryptoPortsAttached,s.Z.attachPort(i),null===(n=this.cryptoPortPromise)||void 0===n||n.resolve())})),e.addEventListener("createProxyWorkerURLs",(({originalUrl:e,blob:t})=>{let a=this.cryptoWorkersURLs.length;a||(this.cryptoWorkersURLs.push(e),++a);const s=_.Z.cryptoWorkers;if(a===s)return this.cryptoWorkersURLs;const n=new Array(s-a).fill(void 0).map((()=>URL.createObjectURL(t)));return this.cryptoWorkersURLs.push(...n),this.cryptoWorkersURLs}))}createManagers(){return e=this,t=void 0,n=function*(){const e=new $;yield Promise.all([e.loadStorages(),this.cryptoPortPromise]);const t=yield function(e,t){const a={appPeersManager:new fa,appChatsManager:new Be,appDocsManager:new ut,appPhotosManager:new ca,appPollsManager:new la,appUsersManager:new Aa,appWebPagesManager:new Ua,appDraftsManager:new _t,appProfileManager:new ua,appNotificationsManager:new na,apiUpdatesManager:new De,appAvatarsManager:new Ue,appGroupCallsManager:new St,appCallsManager:new Fe,appReactionsManager:new ba,appMessagesManager:new ta,appMessagesIdsManager:new Tt,appPrivacyManager:new ma,appInlineBotsManager:new Dt,appStickersManager:new Ca,referenceDatabase:new ee,appEmojiManager:new Mt,filtersStorage:new Ce,dialogsStorage:new _e,apiManager:new Ja,cryptoWorker:s.Z,passwordManager:new Q,apiFileManager:new ja,peersStorage:new Qa,thumbsStorage:new Xa,networkerFactory:new As,rootScope:new l,authorizer:new Es,dcConfigurator:new O,timeManager:new Fs,appStoragesManager:e,appStateManager:y,appWebDocsManager:new Rs,appPaymentsManager:new xs,appAttachMenuBotsManager:new Vs,appSeamlessLoginManager:new Os,appThemesManager:new Ls};for(const e in a){const t=a[e];t&&(t.setManagers&&(t.setManagers(a),delete t.setManagers),E.Z[e]=t)}const n=[];let i=Object.keys(a);i.unshift("appUsersManager","appChatsManager","appNotificationsManager","appMessagesManager","dialogsStorage"),i=(0,we.Z)(i);for(const e of i){const t=a[e];if(null==t?void 0:t.after){const e=t.after();n.push(e)}}return t&&a.apiManager.setUserAuth(t),Promise.all(n).then((()=>a))}(e,y.userId);return this.managers=t},new((a=void 0)||(a=Promise))((function(s,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((n=n.apply(e,t||[])).next())}));var e,t,a,n}getManagers(){var e;return null!==(e=this.managers)&&void 0!==e?e:this.managers=this.createManagers()}};d.GO&&(d.GO.appManagersManager=Ns);const Zs=Ns;var js=a(3655);let qs,Gs,Hs=!0;function Ws(){return Hs}function zs(){return Hs?qs:void 0}const Ks=(0,I.kg)("MTPROTO"),Js=new f.Z;Js.addMultipleEventsListeners({environment:e=>{r(e),Z.waitForWebSocket()},crypto:({method:e,args:t})=>s.Z.invokeCrypto(e,...t),state:({state:e,resetStorages:t,pushedKeys:a,newVersion:s,oldVersion:n,userId:i})=>{Ks("got state",e,a),y.userId=i,y.newVersion=s,y.oldVersion=n,Object.keys(e).forEach((t=>{y.pushToState(t,e[t],!0,!a.includes(t))})),j.resolve(t)},toggleStorages:({enabled:e,clearWrite:t})=>(0,za.Z)(e,t),event:(e,t)=>{Ks("will redirect event",e,t),Js.invokeExceptSource("event",e,t)},serviceWorkerOnline:e=>{Hs=e},serviceWorkerPort:(e,t,a)=>{qs?(qs.detachPort(Gs),Gs=void 0):(qs=new js.Z,qs.addMultipleEventsListeners({requestFilePart:e=>(0,q.Z)(Zs.getManagers(),(t=>{const{docId:a,dcId:s,offset:n,limit:i}=e;return t.appDocsManager.requestDocPart(a,s,n,i)}))})),(Gs=a.ports[0])&&qs.attachPort(Gs)},createObjectURL:e=>URL.createObjectURL(e)}),Ks("MTProto start"),Zs.start(),Zs.getManagers(),Gt.start(),function(e,t,a){const s=(a,s)=>{e.attachListenPort(a),s&&e.attachSendPort(s),null==t||t(a)};e.setOnPortDisconnect((e=>{Gt.deleteTab(e)})),"undefined"!=typeof SharedWorkerGlobalScope?E.Z.addEventListener("connect",(e=>s(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?s(E.Z,null):s(E.Z,E.Z)}(Js,(e=>{Gt.addTab(e)}))},1507:(e,t,a)=>{a.d(t,{BP:()=>f,BX:()=>l,DZ:()=>h,Gu:()=>u,IA:()=>i,Iw:()=>p,J$:()=>m,NM:()=>s,Ox:()=>c,Pt:()=>d,Zi:()=>g,hj:()=>n,rU:()=>o,yF:()=>r});const s=0,n=1271266957,i=777,r=777e3,o=2147483647,p=20971520,d="",f="default_static",c=4295032831,l=new Set(["web","k","z"]),m=0,g=1,h=new Set([m,g]),u=Math.max(...Array.from(h))+1},2423:(e,t,a)=>{a.d(t,{$2:()=>l,E:()=>m,QB:()=>g,SC:()=>h,bu:()=>d,it:()=>p,kO:()=>y,tY:()=>u});var s=a(1229);const n="a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",i="0-9_"+n,r="["+n+"0-9]",o="((?:https?|ftp)://|mailto:)?",p=o+"(?:"+r+"{1,64}(?::"+r+"{0,64})?@)?(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|"+r+"["+n+"·0-9-]{0,64}(?:\\."+r+"["+n+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+n+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",d=(new RegExp("^"+o.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),f="[a-zA-Z\\d_]{5,32}",c="\\/([a-zA-Z\\d_]{1,32})(?:@("+f+"))?(\\b|$)",l=new RegExp("(^| )(@)("+f+")|("+p+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#["+i+"]{2,64})|(^|\\s)"+c,"i"),m=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,g=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,h={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},u=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in h)u.add(h[e]);const y=/^\+\d+$/},671:(e,t,a)=>{function s(e){return function(e){const t=[];let a=0,s=0,n=0;for(;n55296&&a<=56319?s=a:t.push(a.toString(16));return t.length&&2===t[0].length&&(t[0]="00"+t[0]),t}(r(e)).join("-")}a.d(t,{N0:()=>s});const n=/\uFE0F/g,i=String.fromCharCode(8205),r=e=>e.indexOf(i)<0?e.replace(n,""):e;new Map([["FT","🏴‍☠"]])}},s={};function n(e){var t=s[e];if(void 0!==t)return t.exports;var i=s[e]={id:e,loaded:!1,exports:{}};return a[e].call(i.exports,i,i.exports,n),i.loaded=!0,i.exports}n.m=a,n.x=()=>{var e=n.O(void 0,[699,211,539,85,946],(()=>n(9092)));return n.O(e)},e=[],n.O=(t,a,s,i)=>{if(!a){var r=1/0;for(f=0;f=i)&&Object.keys(n.O).every((e=>n.O[e](a[p])))?a.splice(p--,1):(o=!1,i0&&e[f-1][2]>i;f--)e[f]=e[f-1];e[f]=[a,s,i]},n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce(((t,a)=>(n.f[a](e,t),t)),[])),n.u=e=>85===e?"85.952a9f12a6b3dcdd3f0e.bundle.js":946===e?"946.e994ab75ad6a5d27ca15.bundle.js":({211:"npm.big-integer",699:"npm.pako"}[e]||e)+"."+{8:"570e6da51a125009c156",104:"e24e7fdd92837aca2688",211:"780c206f3e1257ccad6a",301:"42dc636f96a62f6a08c8",539:"17a0b07b4e6476f19654",642:"fd1ade69544ad78671c6",699:"85f88e27b023cbb2ca51"}[e]+".chunk.js",n.miniCssF=e=>{},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var t=n.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var a=t.getElementsByTagName("script");a.length&&(e=a[a.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),(()=>{if(void 0!==n){var e=n.u,t=n.e,a={},s={};n.u=function(t){return e(t)+(a.hasOwnProperty(t)?"?"+a[t]:"")},n.e=function(i){return t(i).catch((function(t){var r=s.hasOwnProperty(i)?s[i]:999999;if(r<1){var o=e(i);throw t.message="Loading chunk "+i+" failed after 999999 retries.\n("+o+")",t.request=o,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();a[i]=t,s[i]=r-1,e(n.e(i))}),3e3)}))}))}}})(),(()=>{var e={678:1};n.f.i=(t,a)=>{e[t]||importScripts(n.p+n.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],a=t.push.bind(t);t.push=t=>{var[s,i,r]=t;for(var o in i)n.o(i,o)&&(n.m[o]=i[o]);for(r&&r(n);s.length;)e[s.pop()]=1;a(t)}})(),t=n.x,n.x=()=>Promise.all([699,211,539,85,946].map(n.e,n)).then(t),n.x()})(); +//# sourceMappingURL=mtproto.worker.d525550e01869ae11a4b.chunk.js.map \ No newline at end of file diff --git a/public/mtproto.worker.d525550e01869ae11a4b.chunk.js.map b/public/mtproto.worker.d525550e01869ae11a4b.chunk.js.map new file mode 100644 index 00000000..36aa6a35 --- /dev/null +++ b/public/mtproto.worker.d525550e01869ae11a4b.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mtproto.worker.d525550e01869ae11a4b.chunk.js","mappings":"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Ac,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,MAAO,kBAAkB,MAAO,QAAQ,MAAO,kBAAkB,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,wCAAwC,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,IAAK,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,iBAAiB,KAAM,iBAAiB,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/environment/utils.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/appManagers/appStateManager.ts","webpack://tweb/./src/helpers/object/setDeepProperty.ts","webpack://tweb/./src/lib/mtproto/transports/http.ts","webpack://tweb/./src/lib/mtproto/transports/websocket.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/lib/mtproto/transports/obfuscation.ts","webpack://tweb/./src/lib/mtproto/transports/abridged.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/lib/mtproto/transports/tcpObfuscated.ts","webpack://tweb/./src/lib/mtproto/dcConfigurator.ts","webpack://tweb/./src/lib/mtproto/transports/controller.ts","webpack://tweb/./src/lib/appManagers/utils/storages/resetStoragesPromise.ts","webpack://tweb/./src/lib/appManagers/manager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/loadStorages.ts","webpack://tweb/./src/lib/appManagers/appStoragesManager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/createStorages.ts","webpack://tweb/./src/lib/mtproto/passwordManager.ts","webpack://tweb/./src/lib/mtproto/referenceDatabase.ts","webpack://tweb/./src/helpers/object/safeReplaceObject.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getPeerIdsFromMessage.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/setDialogIndex.ts","webpack://tweb/./src/lib/storages/dialogs.ts","webpack://tweb/./src/lib/storages/filters.ts","webpack://tweb/./src/helpers/applyMixins.ts","webpack://tweb/./src/lib/appManagers/apiUpdatesManager.ts","webpack://tweb/./src/lib/appManagers/appAvatarsManager.ts","webpack://tweb/./src/lib/appManagers/appCallsManager.ts","webpack://tweb/./src/lib/appManagers/appChatsManager.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/object/safeReplaceArrayInObject.ts","webpack://tweb/./src/environment/mimeTypeMap.ts","webpack://tweb/./src/lib/appManagers/appDocsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentURL.ts","webpack://tweb/./src/lib/appManagers/appDraftsManager.ts","webpack://tweb/./src/lib/appManagers/appEmojiManager.ts","webpack://tweb/./src/lib/appManagers/appGroupCallsManager.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoInput.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoMediaInput.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentMediaInput.ts","webpack://tweb/./src/lib/appManagers/appInlineBotsManager.ts","webpack://tweb/./src/lib/appManagers/appMessagesIdsManager.ts","webpack://tweb/./src/helpers/string/splitStringByLength.ts","webpack://tweb/./src/lib/appManagers/appTabsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInput.ts","webpack://tweb/./src/helpers/object/setBooleanFlag.ts","webpack://tweb/./src/lib/appManagers/appMessagesManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInputFileName.ts","webpack://tweb/./src/helpers/string/convertInputKeyToKey.ts","webpack://tweb/./src/lib/appManagers/appNotificationsManager.ts","webpack://tweb/./src/lib/appManagers/appPeersManager.ts","webpack://tweb/./src/lib/appManagers/appPhotosManager.ts","webpack://tweb/./src/lib/appManagers/appPollsManager.ts","webpack://tweb/./src/lib/appManagers/appPrivacyManager.ts","webpack://tweb/./src/lib/appManagers/appProfileManager.ts","webpack://tweb/./src/helpers/callbackifyAll.ts","webpack://tweb/./src/lib/appManagers/appReactionsManager.ts","webpack://tweb/./src/lib/appManagers/appStickersManager.ts","webpack://tweb/./src/helpers/fixBase64String.ts","webpack://tweb/./src/lib/appManagers/appUsersManager.ts","webpack://tweb/./src/helpers/cleanUsername.ts","webpack://tweb/./src/lib/appManagers/appWebPagesManager.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/string/fileNameRFC.ts","webpack://tweb/./src/lib/files/downloadWriter.ts","webpack://tweb/./src/lib/files/downloadStorage.ts","webpack://tweb/./src/lib/mtproto/apiFileManager.ts","webpack://tweb/./src/helpers/fixFirefoxSvg.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/lib/mtproto/api_methods.ts","webpack://tweb/./src/lib/mtproto/apiManager.ts","webpack://tweb/./src/lib/storages/peers.ts","webpack://tweb/./src/lib/storages/thumbs.ts","webpack://tweb/./src/lib/mtproto/schema.ts","webpack://tweb/./src/helpers/number/intToUint.ts","webpack://tweb/./src/helpers/long/ulongFromInts.ts","webpack://tweb/./src/helpers/bigInt/bigIntConstants.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/lib/mtproto/tl_utils.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/lib/mtproto/networker.ts","webpack://tweb/./src/helpers/long/sortLongsArray.ts","webpack://tweb/./src/helpers/long/longToBytes.ts","webpack://tweb/./src/lib/mtproto/networkerFactory.ts","webpack://tweb/./src/lib/mtproto/rsaKeysManager.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/mtproto/authorizer.ts","webpack://tweb/./src/lib/mtproto/timeManager.ts","webpack://tweb/./src/lib/appManagers/appWebDocsManager.ts","webpack://tweb/./src/lib/appManagers/appPaymentsManager.ts","webpack://tweb/./src/lib/appManagers/appAttachMenuBotsManager.ts","webpack://tweb/./src/lib/appManagers/appSeamlessLoginManager.ts","webpack://tweb/./src/lib/appManagers/appThemesManager.ts","webpack://tweb/./src/lib/appManagers/appManagersManager.ts","webpack://tweb/./src/lib/appManagers/createManagers.ts","webpack://tweb/./src/lib/mtproto/mtproto.worker.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,539,85,946].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\n\nexport const EmojiVersions: {[version in EMOJI_VERSION]: {[emoji: string]: number}} = {'14':{'1f6dd':4867, '1f6de':4916, '1f6df':4923, '1f7f0':62832, '1f979':183, '1f9cc':1557, '1fa7b':61332, '1fa7c':61330, '1faa9':51093, '1faaa':61364, '1faab':61189, '1faac':51085, '1fab7':2651, '1fab8':2631, '1fab9':2672, '1faba':2673, '1fac3':1520, '1fac4':1521, '1fac5':1505, '1fad7':3793, '1fad8':3707, '1fad9':3804, '1fae0':111, '1fae1':136, '1fae2':132, '1fae3':133, '1fae4':174, '1fae5':142, '1fae6':1385, '1fae7':61353, '1faf0':1341, '1faf1':1332, '1faf2':1333, '1faf3':1334, '1faf4':1335, '1faf5':1351, '1faf6':1360, '1faf1-1f3fb-200d-1faf2-1f3fc':0, '1faf1-1f3fb-200d-1faf2-1f3fd':0, '1faf1-1f3fb-200d-1faf2-1f3fe':0, '1faf1-1f3fb-200d-1faf2-1f3ff':0, '1faf1-1f3fc-200d-1faf2-1f3fb':0, '1faf1-1f3fc-200d-1faf2-1f3fd':0, '1faf1-1f3fc-200d-1faf2-1f3fe':0, '1faf1-1f3fc-200d-1faf2-1f3ff':0, '1faf1-1f3fd-200d-1faf2-1f3fb':0, '1faf1-1f3fd-200d-1faf2-1f3fc':0, '1faf1-1f3fd-200d-1faf2-1f3fe':0, '1faf1-1f3fd-200d-1faf2-1f3ff':0, '1faf1-1f3fe-200d-1faf2-1f3fb':0, '1faf1-1f3fe-200d-1faf2-1f3fc':0, '1faf1-1f3fe-200d-1faf2-1f3fd':0, '1faf1-1f3fe-200d-1faf2-1f3ff':0, '1faf1-1f3ff-200d-1faf2-1f3fb':0, '1faf1-1f3ff-200d-1faf2-1f3fc':0, '1faf1-1f3ff-200d-1faf2-1f3fd':0, '1faf1-1f3ff-200d-1faf2-1f3fe':0, '1fac3-1f3fb':0, '1fac3-1f3fc':0, '1fac3-1f3fd':0, '1fac3-1f3fe':0, '1fac3-1f3ff':0, '1fac4-1f3fb':0, '1fac4-1f3fc':0, '1fac4-1f3fd':0, '1fac4-1f3fe':0, '1fac4-1f3ff':0, '1fac5-1f3fb':0, '1fac5-1f3fc':0, '1fac5-1f3fd':0, '1fac5-1f3fe':0, '1fac5-1f3ff':0, '1faf0-1f3fb':0, '1faf0-1f3fc':0, '1faf0-1f3fd':0, '1faf0-1f3fe':0, '1faf0-1f3ff':0, '1faf1-1f3fb':0, '1faf1-1f3fc':0, '1faf1-1f3fd':0, '1faf1-1f3fe':0, '1faf1-1f3ff':0, '1faf2-1f3fb':0, '1faf2-1f3fc':0, '1faf2-1f3fd':0, '1faf2-1f3fe':0, '1faf2-1f3ff':0, '1faf3-1f3fb':0, '1faf3-1f3fc':0, '1faf3-1f3fd':0, '1faf3-1f3fe':0, '1faf3-1f3ff':0, '1faf4-1f3fb':0, '1faf4-1f3fc':0, '1faf4-1f3fd':0, '1faf4-1f3fe':0, '1faf4-1f3ff':0, '1faf5-1f3fb':0, '1faf5-1f3fc':0, '1faf5-1f3fd':0, '1faf5-1f3fe':0, '1faf5-1f3ff':0, '1faf6-1f3fb':0, '1faf6-1f3fc':0, '1faf6-1f3fd':0, '1faf6-1f3fe':0, '1faf6-1f3ff':0}, '':{'2049':62835, '2122':62863, '2139':62888, '2194':62764, '2195':62763, '2196':62762, '2197':62756, '2198':62758, '2199':62760, '2328':61194, '2600':4990, '2601':4998, '2602':41013, '2603':41018, '2604':41020, '2611':62851, '2614':41014, '2615':3781, '2618':2667, '2620':1106, '2622':62753, '2623':62754, '2626':62783, '2638':62780, '2639':177, '2648':62788, '2649':62789, '2650':62796, '2651':62797, '2652':62798, '2653':62799, '2660':51095, '2663':51098, '2665':51096, '2666':51097, '2668':4865, '2692':61297, '2693':4922, '2694':61300, '2696':61311, '2697':61319, '2699':61309, '2702':61284, '2705':62850, '2708':4931, '2709':61245, '2712':61259, '2714':62852, '2716':62828, '2721':62779, '2728':51029, '2733':62858, '2734':62859, '2744':41017, '2747':62860, '2753':62836, '2754':62837, '2755':62838, '2757':62839, '2763':1137, '2764':1141, '2795':62829, '2796':62830, '2797':62831, '2934':62767, '2935':62768, '3030':62840, '3297':62912, '3299':62913, '0023-20e3':62864, '002a-20e3':62865, '0030-20e3':62866, '0031-20e3':62867, '0032-20e3':62868, '0033-20e3':62869, '0034-20e3':62870, '0035-20e3':62871, '0036-20e3':62872, '0037-20e3':62873, '0038-20e3':62874, '0039-20e3':62875, '00a9':62861, '00ae':62862, '1f004':51101, '1f0cf':51100, '1f170':62882, '1f171':62884, '1f17e':62893, '1f17f':62895, '1f18e':62883, '1f191':62885, '1f192':62886, '1f193':62887, '1f194':62889, '1f195':62891, '1f196':62892, '1f197':62894, '1f198':62896, '1f199':62897, '1f19a':62898, '1f1e6-1f1e8':71594, '1f1e6-1f1e9':71595, '1f1e6-1f1ea':71596, '1f1e6-1f1eb':71597, '1f1e6-1f1ec':71598, '1f1e6-1f1ee':71599, '1f1e6-1f1f1':71600, '1f1e6-1f1f2':71601, '1f1e6-1f1f4':71602, '1f1e6-1f1f6':71603, '1f1e6-1f1f7':71604, '1f1e6-1f1f8':71605, '1f1e6-1f1f9':71606, '1f1e6-1f1fa':71607, '1f1e6-1f1fc':71608, '1f1e6-1f1fd':71609, '1f1e6-1f1ff':71610, '1f1e7-1f1e6':71611, '1f1e7-1f1e7':71612, '1f1e7-1f1e9':71613, '1f1e7-1f1ea':71614, '1f1e7-1f1eb':71615, '1f1e7-1f1ec':71616, '1f1e7-1f1ed':71617, '1f1e7-1f1ee':71618, '1f1e7-1f1ef':71619, '1f1e7-1f1f1':71620, '1f1e7-1f1f2':71621, '1f1e7-1f1f3':71622, '1f1e7-1f1f4':71623, '1f1e7-1f1f6':71624, '1f1e7-1f1f7':71625, '1f1e7-1f1f8':71626, '1f1e7-1f1f9':71627, '1f1e7-1f1fb':71628, '1f1e7-1f1fc':71629, '1f1e7-1f1fe':71630, '1f1e7-1f1ff':71631, '1f1e8-1f1e6':71632, '1f1e8-1f1e8':71633, '1f1e8-1f1e9':71634, '1f1e8-1f1eb':71635, '1f1e8-1f1ec':71636, '1f1e8-1f1ed':71637, '1f1e8-1f1ee':71638, '1f1e8-1f1f0':71639, '1f1e8-1f1f1':71640, '1f1e8-1f1f2':71641, '1f1e8-1f1f3':71642, '1f1e8-1f1f4':71643, '1f1e8-1f1f5':71644, '1f1e8-1f1f7':71645, '1f1e8-1f1fa':71646, '1f1e8-1f1fb':71647, '1f1e8-1f1fc':71648, '1f1e8-1f1fd':71649, '1f1e8-1f1fe':71650, '1f1e8-1f1ff':71651, '1f1e9-1f1ea':71652, '1f1e9-1f1ec':71653, '1f1e9-1f1ef':71654, '1f1e9-1f1f0':71655, '1f1e9-1f1f2':71656, '1f1e9-1f1f4':71657, '1f1e9-1f1ff':71658, '1f1ea-1f1e6':71659, '1f1ea-1f1e8':71660, '1f1ea-1f1ea':71661, '1f1ea-1f1ec':71662, '1f1ea-1f1ed':71663, '1f1ea-1f1f7':71664, '1f1ea-1f1f8':71665, '1f1ea-1f1f9':71666, '1f1ea-1f1fa':71667, '1f1eb-1f1ee':71668, '1f1eb-1f1ef':71669, '1f1eb-1f1f0':71670, '1f1eb-1f1f2':71671, '1f1eb-1f1f4':71672, '1f1eb-1f1f7':71673, '1f1ec-1f1e6':71674, '1f1ec-1f1e7':71675, '1f1ec-1f1e9':71676, '1f1ec-1f1ea':71677, '1f1ec-1f1eb':71678, '1f1ec-1f1ec':71679, '1f1ec-1f1ed':71680, '1f1ec-1f1ee':71681, '1f1ec-1f1f1':71682, '1f1ec-1f1f2':71683, '1f1ec-1f1f3':71684, '1f1ec-1f1f5':71685, '1f1ec-1f1f6':71686, '1f1ec-1f1f7':71687, '1f1ec-1f1f8':71688, '1f1ec-1f1f9':71689, '1f1ec-1f1fa':71690, '1f1ec-1f1fc':71691, '1f1ec-1f1fe':71692, '1f1ed-1f1f0':71693, '1f1ed-1f1f2':71694, '1f1ed-1f1f3':71695, '1f1ed-1f1f7':71696, '1f1ed-1f1f9':71697, '1f1ed-1f1fa':71698, '1f1ee-1f1e8':71699, '1f1ee-1f1e9':71700, '1f1ee-1f1ea':71701, '1f1ee-1f1f1':71702, '1f1ee-1f1f2':71703, '1f1ee-1f1f3':71704, '1f1ee-1f1f4':71705, '1f1ee-1f1f6':71706, '1f1ee-1f1f7':71707, '1f1ee-1f1f8':71708, '1f1ee-1f1f9':71709, '1f1ef-1f1ea':71710, '1f1ef-1f1f2':71711, '1f1ef-1f1f4':71712, '1f1ef-1f1f5':71713, '1f1f0-1f1ea':71714, '1f1f0-1f1ec':71715, '1f1f0-1f1ed':71716, '1f1f0-1f1ee':71717, '1f1f0-1f1f2':71718, '1f1f0-1f1f3':71719, '1f1f0-1f1f5':71720, '1f1f0-1f1f7':71721, '1f1f0-1f1fc':71722, '1f1f0-1f1fe':71723, '1f1f0-1f1ff':71724, '1f1f1-1f1e6':71725, '1f1f1-1f1e7':71726, '1f1f1-1f1e8':71727, '1f1f1-1f1ee':71728, '1f1f1-1f1f0':71729, '1f1f1-1f1f7':71730, '1f1f1-1f1f8':71731, '1f1f1-1f1f9':71732, '1f1f1-1f1fa':71733, '1f1f1-1f1fb':71734, '1f1f1-1f1fe':71735, '1f1f2-1f1e6':71736, '1f1f2-1f1e8':71737, '1f1f2-1f1e9':71738, '1f1f2-1f1ea':71739, '1f1f2-1f1eb':71740, '1f1f2-1f1ec':71741, '1f1f2-1f1ed':71742, '1f1f2-1f1f0':71743, '1f1f2-1f1f1':71744, '1f1f2-1f1f2':71745, '1f1f2-1f1f3':71746, '1f1f2-1f1f4':71747, '1f1f2-1f1f5':71748, '1f1f2-1f1f6':71749, '1f1f2-1f1f7':71750, '1f1f2-1f1f8':71751, '1f1f2-1f1f9':71752, '1f1f2-1f1fa':71753, '1f1f2-1f1fb':71754, '1f1f2-1f1fc':71755, '1f1f2-1f1fd':71756, '1f1f2-1f1fe':71757, '1f1f2-1f1ff':71758, '1f1f3-1f1e6':71759, '1f1f3-1f1e8':71760, '1f1f3-1f1ea':71761, '1f1f3-1f1eb':71762, '1f1f3-1f1ec':71763, '1f1f3-1f1ee':71764, '1f1f3-1f1f1':71765, '1f1f3-1f1f4':71766, '1f1f3-1f1f5':71767, '1f1f3-1f1f7':71768, '1f1f3-1f1fa':71769, '1f1f3-1f1ff':71770, '1f1f4-1f1f2':71771, '1f1f5-1f1e6':71772, '1f1f5-1f1ea':71773, '1f1f5-1f1eb':71774, '1f1f5-1f1ec':71775, '1f1f5-1f1ed':71776, '1f1f5-1f1f0':71777, '1f1f5-1f1f1':71778, '1f1f5-1f1f2':71779, '1f1f5-1f1f3':71780, '1f1f5-1f1f7':71781, '1f1f5-1f1f8':71782, '1f1f5-1f1f9':71783, '1f1f5-1f1fc':71784, '1f1f5-1f1fe':71785, '1f1f6-1f1e6':71786, '1f1f7-1f1ea':71787, '1f1f7-1f1f4':71788, '1f1f7-1f1f8':71789, '1f1f7-1f1fa':71790, '1f1f7-1f1fc':71791, '1f1f8-1f1e6':71792, '1f1f8-1f1e7':71793, '1f1f8-1f1e8':71794, '1f1f8-1f1e9':71795, '1f1f8-1f1ea':71796, '1f1f8-1f1ec':71797, '1f1f8-1f1ed':71798, '1f1f8-1f1ee':71799, '1f1f8-1f1ef':71800, '1f1f8-1f1f0':71801, '1f1f8-1f1f1':71802, '1f1f8-1f1f2':71803, '1f1f8-1f1f3':71804, '1f1f8-1f1f4':71805, '1f1f8-1f1f7':71806, '1f1f8-1f1f8':71807, '1f1f8-1f1f9':71808, '1f1f8-1f1fb':71809, '1f1f8-1f1fd':71810, '1f1f8-1f1fe':71811, '1f1f8-1f1ff':71812, '1f1f9-1f1e6':71813, '1f1f9-1f1e8':71814, '1f1f9-1f1e9':71815, '1f1f9-1f1eb':71816, '1f1f9-1f1ec':71817, '1f1f9-1f1ed':71818, '1f1f9-1f1ef':71819, '1f1f9-1f1f0':71820, '1f1f9-1f1f1':71821, '1f1f9-1f1f2':71822, '1f1f9-1f1f3':71823, '1f1f9-1f1f4':71824, '1f1f9-1f1f7':71825, '1f1f9-1f1f9':71826, '1f1f9-1f1fb':71827, '1f1f9-1f1fc':71828, '1f1f9-1f1ff':71829, '1f1fa-1f1e6':71830, '1f1fa-1f1ec':71831, '1f1fa-1f1f2':71832, '1f1fa-1f1f3':71833, '1f1fa-1f1f8':71834, '1f1fa-1f1fe':71835, '1f1fa-1f1ff':71836, '1f1fb-1f1e6':71837, '1f1fb-1f1e8':71838, '1f1fb-1f1ea':71839, '1f1fb-1f1ec':71840, '1f1fb-1f1ee':71841, '1f1fb-1f1f3':71842, '1f1fb-1f1fa':71843, '1f1fc-1f1eb':71844, '1f1fc-1f1f8':71845, '1f1fd-1f1f0':71846, '1f1fe-1f1ea':71847, '1f1fe-1f1f9':71848, '1f1ff-1f1e6':71849, '1f1ff-1f1f2':71850, '1f1ff-1f1fc':71851, '1f201':62899, '1f202':62900, '1f21a':62906, '1f22f':62903, '1f232':62907, '1f233':62911, '1f234':62910, '1f235':62915, '1f236':62902, '1f237':62901, '1f238':62909, '1f239':62905, '1f23a':62914, '1f250':62904, '1f251':62908, '1f300':41010, '1f301':4857, '1f302':41012, '1f303':4858, '1f304':4860, '1f305':4861, '1f306':4862, '1f307':4863, '1f308':41011, '1f309':4864, '1f30a':41023, '1f30b':4815, '1f30c':4997, '1f30d':4806, '1f30e':4807, '1f30f':4808, '1f310':4809, '1f311':4977, '1f312':4978, '1f313':4979, '1f314':4980, '1f315':4981, '1f316':4982, '1f317':4983, '1f318':4984, '1f319':4985, '1f31a':4986, '1f31b':4987, '1f31c':4988, '1f31d':4991, '1f31e':4992, '1f31f':4995, '1f320':4996, '1f321':4989, '1f324':41001, '1f325':41002, '1f326':41003, '1f327':41004, '1f328':41005, '1f329':41006, '1f32a':41007, '1f32b':41008, '1f32c':41009, '1f32d':3725, '1f32e':3727, '1f32f':3728, '1f330':3708, '1f331':2659, '1f332':2661, '1f333':2662, '1f334':2663, '1f335':2664, '1f336':3698, '1f337':2658, '1f338':2649, '1f339':2653, '1f33a':2655, '1f33b':2656, '1f33c':2657, '1f33d':3697, '1f33e':2665, '1f33f':2666, '1f340':2668, '1f341':2669, '1f342':2670, '1f343':2671, '1f344':3705, '1f345':3690, '1f346':3694, '1f347':3674, '1f348':3675, '1f349':3676, '1f34a':3677, '1f34b':3678, '1f34c':3679, '1f34d':3680, '1f34e':3682, '1f34f':3683, '1f350':3684, '1f351':3685, '1f352':3686, '1f353':3687, '1f354':3722, '1f355':3724, '1f356':3718, '1f357':3719, '1f358':3744, '1f359':3745, '1f35a':3746, '1f35b':3747, '1f35c':3748, '1f35d':3749, '1f35e':3709, '1f35f':3723, '1f360':3750, '1f361':3756, '1f362':3751, '1f363':3752, '1f364':3753, '1f365':3754, '1f366':3765, '1f367':3766, '1f368':3767, '1f369':3768, '1f36a':3769, '1f36b':3774, '1f36c':3775, '1f36d':3776, '1f36e':3777, '1f36f':3778, '1f370':3771, '1f371':3743, '1f372':3735, '1f373':3733, '1f374':3801, '1f375':3783, '1f376':3784, '1f377':3786, '1f378':3787, '1f379':3788, '1f37a':3789, '1f37b':3790, '1f37c':3779, '1f37d':3800, '1f37e':3785, '1f37f':3739, '1f380':51040, '1f381':51041, '1f382':3770, '1f383':51024, '1f384':51025, '1f385':1527, '1f386':51026, '1f387':51027, '1f388':51030, '1f389':51031, '1f38a':51032, '1f38b':51033, '1f38c':71588, '1f38d':51034, '1f38e':51035, '1f38f':51036, '1f390':51037, '1f391':51038, '1f392':61134, '1f393':61147, '1f396':51045, '1f397':51042, '1f399':61167, '1f39a':61168, '1f39b':61169, '1f39e':61203, '1f39f':51043, '1f3a0':4866, '1f3a1':4868, '1f3a2':4869, '1f3a3':51072, '1f3a4':61170, '1f3a5':61202, '1f3a6':62819, '1f3a7':61171, '1f3a8':51105, '1f3a9':61146, '1f3aa':4871, '1f3ab':51044, '1f3ac':61205, '1f3ad':51103, '1f3ae':51086, '1f3af':51078, '1f3b0':51088, '1f3b1':51081, '1f3b2':51089, '1f3b3':51060, '1f3b4':51102, '1f3b5':61165, '1f3b6':61166, '1f3b7':61173, '1f3b8':61175, '1f3b9':61176, '1f3ba':61177, '1f3bb':61178, '1f3bc':61164, '1f3bd':51074, '1f3be':51058, '1f3bf':51075, '1f3c0':51054, '1f3c1':71586, '1f3c2':1600, '1f3c3-200d-2640':1584, '1f3c3-200d-2642':1583, '1f3c3':1582, '1f3c4-200d-2640':1606, '1f3c4-200d-2642':1605, '1f3c4':1604, '1f3c5':51047, '1f3c6':51046, '1f3c7':1598, '1f3c8':51056, '1f3c9':51057, '1f3ca-200d-2640':1612, '1f3ca-200d-2642':1611, '1f3ca':1610, '1f3cb-200d-2640':1618, '1f3cb-200d-2642':1617, '1f3cb':1616, '1f3cc-200d-2640':1603, '1f3cc-200d-2642':1602, '1f3cc':1601, '1f3cd':4902, '1f3ce':4901, '1f3cf':51061, '1f3d0':51055, '1f3d1':51062, '1f3d2':51063, '1f3d3':51065, '1f3d4':4813, '1f3d5':4817, '1f3d6':4818, '1f3d7':4824, '1f3d8':4829, '1f3d9':4859, '1f3da':4830, '1f3db':4823, '1f3dc':4819, '1f3dd':4820, '1f3de':4821, '1f3df':4822, '1f3e0':4831, '1f3e1':4832, '1f3e2':4833, '1f3e3':4834, '1f3e4':4835, '1f3e5':4836, '1f3e6':4837, '1f3e7':62729, '1f3e8':4838, '1f3e9':4839, '1f3ea':4840, '1f3eb':4841, '1f3ec':4842, '1f3ed':4843, '1f3ee':61216, '1f3ef':4844, '1f3f0':4845, '1f3f3-200d-1f308':71591, '1f3f3-200d-26a7':71592, '1f3f3':71590, '1f3f4-200d-2620':71593, '1f3f4-e0067-e0062-e0065-e006e-e0067-e007f':71852, '1f3f4-e0067-e0062-e0073-e0063-e0074-e007f':71853, '1f3f4-e0067-e0062-e0077-e006c-e0073-e007f':71854, '1f3f4':71589, '1f3f5':2652, '1f3f7':61234, '1f3f8':51066, '1f3f9':61303, '1f3fa':3805, '1f3fb':9525, '1f3fc':9526, '1f3fd':9527, '1f3fe':9528, '1f3ff':9529, '1f400':2576, '1f401':2575, '1f402':2556, '1f403':2557, '1f404':2558, '1f405':2547, '1f406':2548, '1f407':2579, '1f408-200d-2b1b':2544, '1f408':2543, '1f409':2618, '1f40a':2613, '1f40b':2622, '1f40c':2632, '1f40d':2616, '1f40e':2550, '1f40f':2563, '1f410':2565, '1f411':2564, '1f412':2531, '1f413':2596, '1f414':2595, '1f415-200d-1f9ba':2537, '1f415':2535, '1f416':2560, '1f417':2561, '1f418':2570, '1f419':2629, '1f41a':2630, '1f41b':2634, '1f41c':2635, '1f41d':2636, '1f41e':2638, '1f41f':2625, '1f420':2626, '1f421':2627, '1f422':2614, '1f423':2597, '1f424':2598, '1f425':2599, '1f426':2600, '1f427':2601, '1f428':2586, '1f429':2538, '1f42a':2566, '1f42b':2567, '1f42c':2623, '1f42d':2574, '1f42e':2555, '1f42f':2546, '1f430':2578, '1f431':2542, '1f432':2617, '1f433':2621, '1f434':2549, '1f435':2530, '1f436':2534, '1f437':2559, '1f438':2612, '1f439':2577, '1f43a':2539, '1f43b-200d-2744':2585, '1f43b':2584, '1f43c':2587, '1f43d':2562, '1f43e':2593, '1f43f':2580, '1f440':1381, '1f441-200d-1f5e8':1159, '1f441':1382, '1f442':1373, '1f443':1375, '1f444':1384, '1f445':1383, '1f446':1347, '1f447':1349, '1f448':1345, '1f449':1346, '1f44a':1355, '1f44b':1327, '1f44c':1336, '1f44d':1352, '1f44e':1353, '1f44f':1358, '1f450':1361, '1f451':61144, '1f452':61145, '1f453':61110, '1f454':61115, '1f455':61116, '1f456':61117, '1f457':61122, '1f458':61123, '1f459':61128, '1f45a':61129, '1f45b':61130, '1f45c':61131, '1f45d':61132, '1f45e':61136, '1f45f':61137, '1f460':61140, '1f461':61141, '1f462':61143, '1f463':1687, '1f464':1684, '1f465':1685, '1f466':1388, '1f467':1389, '1f468-200d-1f33e':1457, '1f468-200d-1f373':1460, '1f468-200d-1f37c':1524, '1f468-200d-1f393':1448, '1f468-200d-1f3a4':1478, '1f468-200d-1f3a8':1481, '1f468-200d-1f3eb':1451, '1f468-200d-1f3ed':1466, '1f468-200d-1f466-200d-1f466':1674, '1f468-200d-1f466':1673, '1f468-200d-1f467-200d-1f466':1676, '1f468-200d-1f467-200d-1f467':1677, '1f468-200d-1f467':1675, '1f468-200d-1f468-200d-1f466':1663, '1f468-200d-1f468-200d-1f466-200d-1f466':1666, '1f468-200d-1f468-200d-1f467':1664, '1f468-200d-1f468-200d-1f467-200d-1f466':1665, '1f468-200d-1f468-200d-1f467-200d-1f467':1667, '1f468-200d-1f469-200d-1f466':1658, '1f468-200d-1f469-200d-1f466-200d-1f466':1661, '1f468-200d-1f469-200d-1f467':1659, '1f468-200d-1f469-200d-1f467-200d-1f466':1660, '1f468-200d-1f469-200d-1f467-200d-1f467':1662, '1f468-200d-1f4bb':1475, '1f468-200d-1f4bc':1469, '1f468-200d-1f527':1463, '1f468-200d-1f52c':1472, '1f468-200d-1f680':1487, '1f468-200d-1f692':1490, '1f468-200d-1f9af':1574, '1f468-200d-1f9b0':1396, '1f468-200d-1f9b1':1397, '1f468-200d-1f9b2':1399, '1f468-200d-1f9b3':1398, '1f468-200d-1f9bc':1577, '1f468-200d-1f9bd':1580, '1f468-200d-2695':1445, '1f468-200d-2696':1454, '1f468-200d-2708':1484, '1f468-200d-2764-200d-1f468':1655, '1f468-200d-2764-200d-1f48b-200d-1f468':1651, '1f468':1392, '1f469-200d-1f33e':1458, '1f469-200d-1f373':1461, '1f469-200d-1f37c':1523, '1f469-200d-1f393':1449, '1f469-200d-1f3a4':1479, '1f469-200d-1f3a8':1482, '1f469-200d-1f3eb':1452, '1f469-200d-1f3ed':1467, '1f469-200d-1f466-200d-1f466':1679, '1f469-200d-1f466':1678, '1f469-200d-1f467-200d-1f466':1681, '1f469-200d-1f467-200d-1f467':1682, '1f469-200d-1f467':1680, '1f469-200d-1f469-200d-1f466':1668, '1f469-200d-1f469-200d-1f466-200d-1f466':1671, '1f469-200d-1f469-200d-1f467':1669, '1f469-200d-1f469-200d-1f467-200d-1f466':1670, '1f469-200d-1f469-200d-1f467-200d-1f467':1672, '1f469-200d-1f4bb':1476, '1f469-200d-1f4bc':1470, '1f469-200d-1f527':1464, '1f469-200d-1f52c':1473, '1f469-200d-1f680':1488, '1f469-200d-1f692':1491, '1f469-200d-1f9af':1575, '1f469-200d-1f9b0':1401, '1f469-200d-1f9b1':1403, '1f469-200d-1f9b2':1407, '1f469-200d-1f9b3':1405, '1f469-200d-1f9bc':1578, '1f469-200d-1f9bd':1581, '1f469-200d-2695':1446, '1f469-200d-2696':1455, '1f469-200d-2708':1485, '1f469-200d-2764-200d-1f468':1654, '1f469-200d-2764-200d-1f469':1656, '1f469-200d-2764-200d-1f48b-200d-1f468':1650, '1f469-200d-2764-200d-1f48b-200d-1f469':1652, '1f469':1400, '1f46a':1657, '1f46b':1647, '1f46c':1648, '1f46d':1646, '1f46e-200d-2640':1494, '1f46e-200d-2642':1493, '1f46e':1492, '1f46f-200d-2640':1590, '1f46f-200d-2642':1589, '1f46f':1588, '1f470-200d-2640':1518, '1f470-200d-2642':1517, '1f470':1516, '1f471-200d-2640':1409, '1f471-200d-2642':1410, '1f471':1391, '1f472':1511, '1f473-200d-2640':1510, '1f473-200d-2642':1509, '1f473':1508, '1f474':1412, '1f475':1413, '1f476':1386, '1f477-200d-2640':1504, '1f477-200d-2642':1503, '1f477':1502, '1f478':1507, '1f479':1109, '1f47a':1110, '1f47b':1111, '1f47c':1526, '1f47d':1112, '1f47e':1113, '1f47f':1104, '1f480':1105, '1f481-200d-2640':1428, '1f481-200d-2642':1427, '1f481':1426, '1f482-200d-2640':1500, '1f482-200d-2642':1499, '1f482':1498, '1f483':1585, '1f484':61152, '1f485':1366, '1f486-200d-2640':1560, '1f486-200d-2642':1559, '1f486':1558, '1f487-200d-2640':1563, '1f487-200d-2642':1562, '1f487':1561, '1f488':4870, '1f489':61326, '1f48a':61328, '1f48b':1127, '1f48c':1128, '1f48d':61153, '1f48e':61154, '1f48f':1649, '1f490':2648, '1f491':1653, '1f492':4846, '1f493':1133, '1f494':1138, '1f495':1135, '1f496':1131, '1f497':1132, '1f498':1129, '1f499':1145, '1f49a':1144, '1f49b':1143, '1f49c':1146, '1f49d':1130, '1f49e':1134, '1f49f':1136, '1f4a0':62946, '1f4a1':61214, '1f4a2':1151, '1f4a3':1157, '1f4a4':1163, '1f4a5':1152, '1f4a6':1154, '1f4a7':41022, '1f4a8':1155, '1f4a9':1107, '1f4aa':1368, '1f4ab':1153, '1f4ac':1158, '1f4ad':1162, '1f4ae':2650, '1f4af':1150, '1f4b0':61235, '1f4b1':62841, '1f4b2':62842, '1f4b3':61242, '1f4b4':61237, '1f4b5':61238, '1f4b6':61239, '1f4b7':61240, '1f4b8':61241, '1f4b9':61244, '1f4ba':4936, '1f4bb':61191, '1f4bc':61265, '1f4bd':61197, '1f4be':61198, '1f4bf':61199, '1f4c0':61200, '1f4c1':61266, '1f4c2':61267, '1f4c3':61227, '1f4c4':61229, '1f4c5':61269, '1f4c6':61270, '1f4c7':61273, '1f4c8':61274, '1f4c9':61275, '1f4ca':61276, '1f4cb':61277, '1f4cc':61278, '1f4cd':61279, '1f4ce':61280, '1f4cf':61282, '1f4d0':61283, '1f4d1':61232, '1f4d2':61226, '1f4d3':61225, '1f4d4':61218, '1f4d5':61219, '1f4d6':61220, '1f4d7':61221, '1f4d8':61222, '1f4d9':61223, '1f4da':61224, '1f4db':62847, '1f4dc':61228, '1f4dd':61264, '1f4de':61185, '1f4df':61186, '1f4e0':61187, '1f4e1':61325, '1f4e2':61159, '1f4e3':61160, '1f4e4':61249, '1f4e5':61250, '1f4e6':61251, '1f4e7':61246, '1f4e8':61247, '1f4e9':61248, '1f4ea':61253, '1f4eb':61252, '1f4ec':61254, '1f4ed':61255, '1f4ee':61256, '1f4ef':61161, '1f4f0':61230, '1f4f1':61182, '1f4f2':61183, '1f4f3':62823, '1f4f4':62824, '1f4f5':62751, '1f4f6':62822, '1f4f7':61207, '1f4f8':61208, '1f4f9':61209, '1f4fa':61206, '1f4fb':61172, '1f4fc':61210, '1f4fd':61204, '1f4ff':61151, '1f500':62801, '1f501':62802, '1f502':62803, '1f503':62769, '1f504':62770, '1f505':62820, '1f506':62821, '1f507':61155, '1f508':61156, '1f509':61157, '1f50a':61158, '1f50b':61188, '1f50c':61190, '1f50d':61211, '1f50e':61212, '1f50f':61290, '1f510':61291, '1f511':61292, '1f512':61288, '1f513':61289, '1f514':61162, '1f515':61163, '1f516':61233, '1f517':61313, '1f518':62947, '1f519':62771, '1f51a':62772, '1f51b':62773, '1f51c':62774, '1f51d':62775, '1f51e':62752, '1f51f':62876, '1f520':62877, '1f521':62878, '1f522':62879, '1f523':62880, '1f524':62881, '1f525':41021, '1f526':61215, '1f527':61306, '1f528':61294, '1f529':61308, '1f52a':3803, '1f52b':61301, '1f52c':61323, '1f52d':61324, '1f52e':51082, '1f52f':62787, '1f530':62848, '1f531':62846, '1f532':62949, '1f533':62948, '1f534':62916, '1f535':62920, '1f536':62940, '1f537':62941, '1f538':62942, '1f539':62943, '1f53a':62944, '1f53b':62945, '1f53c':62811, '1f53d':62813, '1f549':62778, '1f54a':2602, '1f54b':4854, '1f54c':4850, '1f54d':4852, '1f54e':62786, '1f550':4955, '1f551':4957, '1f552':4959, '1f553':4961, '1f554':4963, '1f555':4965, '1f556':4967, '1f557':4969, '1f558':4971, '1f559':4973, '1f55a':4975, '1f55b':4953, '1f55c':4956, '1f55d':4958, '1f55e':4960, '1f55f':4962, '1f560':4964, '1f561':4966, '1f562':4968, '1f563':4970, '1f564':4972, '1f565':4974, '1f566':4976, '1f567':4954, '1f56f':61213, '1f570':4952, '1f573':1156, '1f574':1587, '1f575-200d-2640':1497, '1f575-200d-2642':1496, '1f575':1495, '1f576':61111, '1f577':2641, '1f578':2642, '1f579':51087, '1f57a':1586, '1f587':61281, '1f58a':61261, '1f58b':61260, '1f58c':61262, '1f58d':61263, '1f590':1329, '1f595':1348, '1f596':1331, '1f5a4':1148, '1f5a5':61192, '1f5a8':61193, '1f5b1':61195, '1f5b2':61196, '1f5bc':51104, '1f5c2':61268, '1f5c3':61285, '1f5c4':61286, '1f5d1':61287, '1f5d2':61271, '1f5d3':61272, '1f5dc':61310, '1f5dd':61293, '1f5de':61231, '1f5e1':61299, '1f5e3':1683, '1f5e8':1160, '1f5ef':1161, '1f5f3':61257, '1f5fa':4810, '1f5fb':4816, '1f5fc':4847, '1f5fd':4848, '1f5fe':4811, '1f5ff':61362, '1f600':11, '1f601':14, '1f602':18, '1f603':12, '1f604':13, '1f605':16, '1f606':15, '1f607':114, '1f608':1103, '1f609':112, '1f60a':113, '1f60b':124, '1f60c':150, '1f60d':116, '1f60e':170, '1f60f':144, '1f610':139, '1f611':140, '1f612':145, '1f613':195, '1f614':151, '1f615':173, '1f616':192, '1f617':119, '1f618':118, '1f619':122, '1f61a':121, '1f61b':125, '1f61c':126, '1f61d':128, '1f61e':194, '1f61f':175, '1f620':1101, '1f621':1100, '1f622':189, '1f623':193, '1f624':199, '1f625':188, '1f626':184, '1f627':185, '1f628':186, '1f629':196, '1f62a':152, '1f62b':197, '1f62c':147, '1f62d':190, '1f62e-200d-1f4a8':148, '1f62e':178, '1f62f':179, '1f630':187, '1f631':191, '1f632':180, '1f633':181, '1f634':154, '1f635-200d-1f4ab':165, '1f635':164, '1f636-200d-1f32b':143, '1f636':141, '1f637':155, '1f638':1116, '1f639':1117, '1f63a':1115, '1f63b':1118, '1f63c':1119, '1f63d':1120, '1f63e':1123, '1f63f':1122, '1f640':1121, '1f641':176, '1f642':19, '1f643':110, '1f644':146, '1f645-200d-2640':1422, '1f645-200d-2642':1421, '1f645':1420, '1f646-200d-2640':1425, '1f646-200d-2642':1424, '1f646':1423, '1f647-200d-2640':1437, '1f647-200d-2642':1436, '1f647':1435, '1f648':1124, '1f649':1125, '1f64a':1126, '1f64b-200d-2640':1431, '1f64b-200d-2642':1430, '1f64b':1429, '1f64c':1359, '1f64d-200d-2640':1416, '1f64d-200d-2642':1415, '1f64d':1414, '1f64e-200d-2640':1419, '1f64e-200d-2642':1418, '1f64e':1417, '1f64f':1364, '1f680':4942, '1f681':4937, '1f682':4872, '1f683':4873, '1f684':4874, '1f685':4875, '1f686':4876, '1f687':4877, '1f688':4878, '1f689':4879, '1f68a':4880, '1f68b':4883, '1f68c':4884, '1f68d':4885, '1f68e':4886, '1f68f':4911, '1f690':4887, '1f691':4888, '1f692':4889, '1f693':4890, '1f694':4891, '1f695':4892, '1f696':4893, '1f697':4894, '1f698':4895, '1f699':4896, '1f69a':4898, '1f69b':4899, '1f69c':4900, '1f69d':4881, '1f69e':4882, '1f69f':4938, '1f6a0':4939, '1f6a1':4940, '1f6a2':4930, '1f6a3-200d-2640':1609, '1f6a3-200d-2642':1608, '1f6a3':1607, '1f6a4':4926, '1f6a5':4918, '1f6a6':4919, '1f6a7':4921, '1f6a8':4917, '1f6a9':71587, '1f6aa':61333, '1f6ab':62745, '1f6ac':61358, '1f6ad':62747, '1f6ae':62730, '1f6af':62748, '1f6b0':62731, '1f6b1':62749, '1f6b2':4907, '1f6b3':62746, '1f6b4-200d-2640':1621, '1f6b4-200d-2642':1620, '1f6b4':1619, '1f6b5-200d-2640':1624, '1f6b5-200d-2642':1623, '1f6b5':1622, '1f6b6-200d-2640':1566, '1f6b6-200d-2642':1565, '1f6b6':1564, '1f6b7':62750, '1f6b8':62743, '1f6b9':62733, '1f6ba':62734, '1f6bb':62735, '1f6bc':62736, '1f6bd':61340, '1f6be':62737, '1f6bf':61342, '1f6c0':1643, '1f6c1':61343, '1f6c2':62738, '1f6c3':62739, '1f6c4':62740, '1f6c5':62741, '1f6cb':61338, '1f6cc':1644, '1f6cd':61133, '1f6ce':4944, '1f6cf':61337, '1f6d0':62776, '1f6d1':4920, '1f6d2':61357, '1f6d5':4851, '1f6d6':4828, '1f6d7':61334, '1f6e0':61298, '1f6e1':61304, '1f6e2':4914, '1f6e3':4912, '1f6e4':4913, '1f6e5':4929, '1f6e9':4932, '1f6eb':4933, '1f6ec':4934, '1f6f0':4941, '1f6f3':4927, '1f6f4':4908, '1f6f5':4903, '1f6f6':4925, '1f6f7':51076, '1f6f8':4943, '1f6f9':4909, '1f6fa':4906, '1f6fb':4897, '1f6fc':4910, '1f7e0':62917, '1f7e1':62918, '1f7e2':62919, '1f7e3':62921, '1f7e4':62922, '1f7e5':62925, '1f7e6':62929, '1f7e7':62926, '1f7e8':62927, '1f7e9':62928, '1f7ea':62930, '1f7eb':62931, '1f90c':1337, '1f90d':1149, '1f90e':1147, '1f90f':1338, '1f910':137, '1f911':129, '1f912':156, '1f913':171, '1f914':135, '1f915':157, '1f916':1114, '1f917':130, '1f918':1343, '1f919':1344, '1f91a':1328, '1f91b':1356, '1f91c':1357, '1f91d':1363, '1f91e':1340, '1f91f':1342, '1f920':167, '1f921':1108, '1f922':158, '1f923':17, '1f924':153, '1f925':149, '1f926-200d-2640':1440, '1f926-200d-2642':1439, '1f926':1438, '1f927':160, '1f928':138, '1f929':117, '1f92a':127, '1f92b':134, '1f92c':1102, '1f92d':131, '1f92e':159, '1f92f':166, '1f930':1519, '1f931':1522, '1f932':1362, '1f933':1367, '1f934':1506, '1f935-200d-2640':1515, '1f935-200d-2642':1514, '1f935':1513, '1f936':1528, '1f937-200d-2640':1443, '1f937-200d-2642':1442, '1f937':1441, '1f938-200d-2640':1627, '1f938-200d-2642':1626, '1f938':1625, '1f939-200d-2640':1639, '1f939-200d-2642':1638, '1f939':1637, '1f93a':1597, '1f93c-200d-2640':1630, '1f93c-200d-2642':1629, '1f93c':1628, '1f93d-200d-2640':1633, '1f93d-200d-2642':1632, '1f93d':1631, '1f93e-200d-2640':1636, '1f93e-200d-2642':1635, '1f93e':1634, '1f93f':51073, '1f940':2654, '1f941':61180, '1f942':3791, '1f943':3792, '1f944':3802, '1f945':51069, '1f947':51048, '1f948':51049, '1f949':51050, '1f94a':51067, '1f94b':51068, '1f94c':51077, '1f94d':51064, '1f94e':51053, '1f94f':51059, '1f950':3710, '1f951':3693, '1f952':3700, '1f953':3721, '1f954':3695, '1f955':3696, '1f956':3711, '1f957':3738, '1f958':3734, '1f959':3730, '1f95a':3732, '1f95b':3780, '1f95c':3706, '1f95d':3689, '1f95e':3715, '1f95f':3757, '1f960':3758, '1f961':3759, '1f962':3799, '1f963':3737, '1f964':3794, '1f965':3692, '1f966':3702, '1f967':3773, '1f968':3713, '1f969':3720, '1f96a':3726, '1f96b':3742, '1f96c':3701, '1f96d':3681, '1f96e':3755, '1f96f':3714, '1f970':115, '1f971':198, '1f972':123, '1f973':168, '1f974':163, '1f975':161, '1f976':162, '1f977':1501, '1f978':169, '1f97a':182, '1f97b':61124, '1f97c':61113, '1f97d':61112, '1f97e':61138, '1f97f':61139, '1f980':3760, '1f981':2545, '1f982':2643, '1f983':2594, '1f984':2551, '1f985':2603, '1f986':2604, '1f987':2583, '1f988':2628, '1f989':2606, '1f98a':2540, '1f98b':2633, '1f98c':2553, '1f98d':2532, '1f98e':2615, '1f98f':2572, '1f990':3762, '1f991':3763, '1f992':2569, '1f993':2552, '1f994':2582, '1f995':2619, '1f996':2620, '1f997':2639, '1f998':2591, '1f999':2568, '1f99a':2610, '1f99b':2573, '1f99c':2611, '1f99d':2541, '1f99e':3761, '1f99f':2644, '1f9a0':2647, '1f9a1':2592, '1f9a2':2605, '1f9a3':2571, '1f9a4':2607, '1f9a5':2588, '1f9a6':2589, '1f9a7':2533, '1f9a8':2590, '1f9a9':2609, '1f9aa':3764, '1f9ab':2581, '1f9ac':2554, '1f9ad':2624, '1f9ae':2536, '1f9af':61312, '1f9b4':1380, '1f9b5':1371, '1f9b6':1372, '1f9b7':1379, '1f9b8-200d-2640':1532, '1f9b8-200d-2642':1531, '1f9b8':1530, '1f9b9-200d-2640':1535, '1f9b9-200d-2642':1534, '1f9b9':1533, '1f9ba':61114, '1f9bb':1374, '1f9bc':4905, '1f9bd':4904, '1f9be':1369, '1f9bf':1370, '1f9c0':3717, '1f9c1':3772, '1f9c2':3741, '1f9c3':3796, '1f9c4':3703, '1f9c5':3704, '1f9c6':3731, '1f9c7':3716, '1f9c8':3740, '1f9c9':3797, '1f9ca':3798, '1f9cb':3795, '1f9cd-200d-2640':1569, '1f9cd-200d-2642':1568, '1f9cd':1567, '1f9ce-200d-2640':1572, '1f9ce-200d-2642':1571, '1f9ce':1570, '1f9cf-200d-2640':1434, '1f9cf-200d-2642':1433, '1f9cf':1432, '1f9d0':172, '1f9d1-200d-1f33e':1456, '1f9d1-200d-1f373':1459, '1f9d1-200d-1f37c':1525, '1f9d1-200d-1f384':1529, '1f9d1-200d-1f393':1447, '1f9d1-200d-1f3a4':1477, '1f9d1-200d-1f3a8':1480, '1f9d1-200d-1f3eb':1450, '1f9d1-200d-1f3ed':1465, '1f9d1-200d-1f4bb':1474, '1f9d1-200d-1f4bc':1468, '1f9d1-200d-1f527':1462, '1f9d1-200d-1f52c':1471, '1f9d1-200d-1f680':1486, '1f9d1-200d-1f692':1489, '1f9d1-200d-1f91d-200d-1f9d1':1645, '1f9d1-200d-1f9af':1573, '1f9d1-200d-1f9b0':1402, '1f9d1-200d-1f9b1':1404, '1f9d1-200d-1f9b2':1408, '1f9d1-200d-1f9b3':1406, '1f9d1-200d-1f9bc':1576, '1f9d1-200d-1f9bd':1579, '1f9d1-200d-2695':1444, '1f9d1-200d-2696':1453, '1f9d1-200d-2708':1483, '1f9d1':1390, '1f9d2':1387, '1f9d3':1411, '1f9d4-200d-2640':1395, '1f9d4-200d-2642':1394, '1f9d4':1393, '1f9d5':1512, '1f9d6-200d-2640':1593, '1f9d6-200d-2642':1592, '1f9d6':1591, '1f9d7-200d-2640':1596, '1f9d7-200d-2642':1595, '1f9d7':1594, '1f9d8-200d-2640':1642, '1f9d8-200d-2642':1641, '1f9d8':1640, '1f9d9-200d-2640':1538, '1f9d9-200d-2642':1537, '1f9d9':1536, '1f9da-200d-2640':1541, '1f9da-200d-2642':1540, '1f9da':1539, '1f9db-200d-2640':1544, '1f9db-200d-2642':1543, '1f9db':1542, '1f9dc-200d-2640':1547, '1f9dc-200d-2642':1546, '1f9dc':1545, '1f9dd-200d-2640':1550, '1f9dd-200d-2642':1549, '1f9dd':1548, '1f9de-200d-2640':1553, '1f9de-200d-2642':1552, '1f9de':1551, '1f9df-200d-2640':1556, '1f9df-200d-2642':1555, '1f9df':1554, '1f9e0':1376, '1f9e1':1142, '1f9e2':61148, '1f9e3':61118, '1f9e4':61119, '1f9e5':61120, '1f9e6':61121, '1f9e7':51039, '1f9e8':51028, '1f9e9':51090, '1f9ea':61320, '1f9eb':61321, '1f9ec':61322, '1f9ed':4812, '1f9ee':61201, '1f9ef':61356, '1f9f0':61316, '1f9f1':4825, '1f9f2':61317, '1f9f3':4945, '1f9f4':61346, '1f9f5':51106, '1f9f6':51108, '1f9f7':61347, '1f9f8':51091, '1f9f9':61348, '1f9fa':61349, '1f9fb':61350, '1f9fc':61352, '1f9fd':61355, '1f9fe':61243, '1f9ff':51084, '1fa70':61142, '1fa71':61125, '1fa72':61126, '1fa73':61127, '1fa74':61135, '1fa78':61327, '1fa79':61329, '1fa7a':61331, '1fa80':51079, '1fa81':51080, '1fa82':4935, '1fa83':61302, '1fa84':51083, '1fa85':51092, '1fa86':51094, '1fa90':4993, '1fa91':61339, '1fa92':61345, '1fa93':61295, '1fa94':61217, '1fa95':61179, '1fa96':61149, '1fa97':61174, '1fa98':61181, '1fa99':61236, '1fa9a':61305, '1fa9b':61307, '1fa9c':61318, '1fa9d':61315, '1fa9e':61335, '1fa9f':61336, '1faa0':61341, '1faa1':51107, '1faa2':51109, '1faa3':61351, '1faa4':61344, '1faa5':61354, '1faa6':61360, '1faa7':61363, '1faa8':4826, '1fab0':2645, '1fab1':2646, '1fab2':2637, '1fab3':2640, '1fab4':2660, '1fab5':4827, '1fab6':2608, '1fac0':1377, '1fac1':1378, '1fac2':1686, '1fad0':3688, '1fad1':3699, '1fad2':3691, '1fad3':3712, '1fad4':3729, '1fad5':3736, '1fad6':3782, '203c':62834, '21a9':62765, '21aa':62766, '231a':4948, '231b':4946, '23cf':62818, '23e9':62805, '23ea':62809, '23eb':62812, '23ec':62814, '23ed':62806, '23ee':62810, '23ef':62807, '23f0':4949, '23f1':4950, '23f2':4951, '23f3':4947, '23f8':62815, '23f9':62816, '23fa':62817, '24c2':62890, '25aa':62938, '25ab':62939, '25b6':62804, '25c0':62808, '25fb':62935, '25fc':62934, '25fd':62937, '25fe':62936, '260e':61184, '261d':1350, '262a':62784, '262e':62785, '262f':62781, '263a':120, '264a':62790, '264b':62791, '264c':62792, '264d':62793, '264e':62794, '264f':62795, '265f':51099, '267b':62844, '267e':62833, '267f':62732, '269b':62777, '269c':62845, '26a0':62742, '26a1':41016, '26a7':62827, '26aa':62924, '26ab':62923, '26b0':61359, '26b1':61361, '26bd':51051, '26be':51052, '26c4':41019, '26c5':4999, '26c8':41000, '26ce':62800, '26cf':61296, '26d1':61150, '26d3':61314, '26d4':62744, '26e9':4853, '26ea':4849, '26f0':4814, '26f1':41015, '26f2':4855, '26f3':51070, '26f4':4928, '26f5':4924, '26f7':1599, '26f8':51071, '26f9-200d-2640':1615, '26f9-200d-2642':1614, '26f9':1613, '26fa':4856, '26fd':4915, '270a':1354, '270b':1330, '270c':1339, '270d':1365, '270f':61258, '271d':62782, '274c':62853, '274e':62854, '2764-200d-1f525':1139, '2764-200d-1fa79':1140, '27a1':62757, '27b0':62855, '27bf':62856, '2b05':62761, '2b06':62755, '2b07':62759, '2b1b':62932, '2b1c':62933, '2b50':4994, '2b55':62849, '303d':62857, '1f385-1f3fb':0, '1f385-1f3fc':0, '1f385-1f3fd':0, '1f385-1f3fe':0, '1f385-1f3ff':0, '1f3c2-1f3fb':0, '1f3c2-1f3fc':0, '1f3c2-1f3fd':0, '1f3c2-1f3fe':0, '1f3c2-1f3ff':0, '1f3c3-1f3fb-200d-2640':0, '1f3c3-1f3fc-200d-2640':0, '1f3c3-1f3fd-200d-2640':0, '1f3c3-1f3fe-200d-2640':0, '1f3c3-1f3ff-200d-2640':0, '1f3c3-1f3fb-200d-2642':0, '1f3c3-1f3fc-200d-2642':0, '1f3c3-1f3fd-200d-2642':0, '1f3c3-1f3fe-200d-2642':0, '1f3c3-1f3ff-200d-2642':0, '1f3c3-1f3fb':0, '1f3c3-1f3fc':0, '1f3c3-1f3fd':0, '1f3c3-1f3fe':0, '1f3c3-1f3ff':0, '1f3c4-1f3fb-200d-2640':0, '1f3c4-1f3fc-200d-2640':0, '1f3c4-1f3fd-200d-2640':0, '1f3c4-1f3fe-200d-2640':0, '1f3c4-1f3ff-200d-2640':0, '1f3c4-1f3fb-200d-2642':0, '1f3c4-1f3fc-200d-2642':0, '1f3c4-1f3fd-200d-2642':0, '1f3c4-1f3fe-200d-2642':0, '1f3c4-1f3ff-200d-2642':0, '1f3c4-1f3fb':0, '1f3c4-1f3fc':0, '1f3c4-1f3fd':0, '1f3c4-1f3fe':0, '1f3c4-1f3ff':0, '1f3c7-1f3fb':0, '1f3c7-1f3fc':0, '1f3c7-1f3fd':0, '1f3c7-1f3fe':0, '1f3c7-1f3ff':0, '1f3ca-1f3fb-200d-2640':0, '1f3ca-1f3fc-200d-2640':0, '1f3ca-1f3fd-200d-2640':0, '1f3ca-1f3fe-200d-2640':0, '1f3ca-1f3ff-200d-2640':0, '1f3ca-1f3fb-200d-2642':0, '1f3ca-1f3fc-200d-2642':0, '1f3ca-1f3fd-200d-2642':0, '1f3ca-1f3fe-200d-2642':0, '1f3ca-1f3ff-200d-2642':0, '1f3ca-1f3fb':0, '1f3ca-1f3fc':0, '1f3ca-1f3fd':0, '1f3ca-1f3fe':0, '1f3ca-1f3ff':0, '1f3cb-1f3fb-200d-2640':0, '1f3cb-1f3fc-200d-2640':0, '1f3cb-1f3fd-200d-2640':0, '1f3cb-1f3fe-200d-2640':0, '1f3cb-1f3ff-200d-2640':0, '1f3cb-1f3fb-200d-2642':0, '1f3cb-1f3fc-200d-2642':0, '1f3cb-1f3fd-200d-2642':0, '1f3cb-1f3fe-200d-2642':0, '1f3cb-1f3ff-200d-2642':0, '1f3cb-1f3fb':0, '1f3cb-1f3fc':0, '1f3cb-1f3fd':0, '1f3cb-1f3fe':0, '1f3cb-1f3ff':0, '1f3cc-1f3fb-200d-2640':0, '1f3cc-1f3fc-200d-2640':0, '1f3cc-1f3fd-200d-2640':0, '1f3cc-1f3fe-200d-2640':0, '1f3cc-1f3ff-200d-2640':0, '1f3cc-1f3fb-200d-2642':0, '1f3cc-1f3fc-200d-2642':0, '1f3cc-1f3fd-200d-2642':0, '1f3cc-1f3fe-200d-2642':0, '1f3cc-1f3ff-200d-2642':0, '1f3cc-1f3fb':0, '1f3cc-1f3fc':0, '1f3cc-1f3fd':0, '1f3cc-1f3fe':0, '1f3cc-1f3ff':0, '1f442-1f3fb':0, '1f442-1f3fc':0, '1f442-1f3fd':0, '1f442-1f3fe':0, '1f442-1f3ff':0, '1f443-1f3fb':0, '1f443-1f3fc':0, '1f443-1f3fd':0, '1f443-1f3fe':0, '1f443-1f3ff':0, '1f446-1f3fb':0, '1f446-1f3fc':0, '1f446-1f3fd':0, '1f446-1f3fe':0, '1f446-1f3ff':0, '1f447-1f3fb':0, '1f447-1f3fc':0, '1f447-1f3fd':0, '1f447-1f3fe':0, '1f447-1f3ff':0, '1f448-1f3fb':0, '1f448-1f3fc':0, '1f448-1f3fd':0, '1f448-1f3fe':0, '1f448-1f3ff':0, '1f449-1f3fb':0, '1f449-1f3fc':0, '1f449-1f3fd':0, '1f449-1f3fe':0, '1f449-1f3ff':0, '1f44a-1f3fb':0, '1f44a-1f3fc':0, '1f44a-1f3fd':0, '1f44a-1f3fe':0, '1f44a-1f3ff':0, '1f44b-1f3fb':0, '1f44b-1f3fc':0, '1f44b-1f3fd':0, '1f44b-1f3fe':0, '1f44b-1f3ff':0, '1f44c-1f3fb':0, '1f44c-1f3fc':0, '1f44c-1f3fd':0, '1f44c-1f3fe':0, '1f44c-1f3ff':0, '1f44d-1f3fb':0, '1f44d-1f3fc':0, '1f44d-1f3fd':0, '1f44d-1f3fe':0, '1f44d-1f3ff':0, '1f44e-1f3fb':0, '1f44e-1f3fc':0, '1f44e-1f3fd':0, '1f44e-1f3fe':0, '1f44e-1f3ff':0, '1f44f-1f3fb':0, '1f44f-1f3fc':0, '1f44f-1f3fd':0, '1f44f-1f3fe':0, '1f44f-1f3ff':0, '1f450-1f3fb':0, '1f450-1f3fc':0, '1f450-1f3fd':0, '1f450-1f3fe':0, '1f450-1f3ff':0, '1f466-1f3fb':0, '1f466-1f3fc':0, '1f466-1f3fd':0, '1f466-1f3fe':0, '1f466-1f3ff':0, '1f467-1f3fb':0, '1f467-1f3fc':0, '1f467-1f3fd':0, '1f467-1f3fe':0, '1f467-1f3ff':0, '1f468-1f3fb-200d-1f33e':0, '1f468-1f3fc-200d-1f33e':0, '1f468-1f3fd-200d-1f33e':0, '1f468-1f3fe-200d-1f33e':0, '1f468-1f3ff-200d-1f33e':0, '1f468-1f3fb-200d-1f373':0, '1f468-1f3fc-200d-1f373':0, '1f468-1f3fd-200d-1f373':0, '1f468-1f3fe-200d-1f373':0, '1f468-1f3ff-200d-1f373':0, '1f468-1f3fb-200d-1f37c':0, '1f468-1f3fc-200d-1f37c':0, '1f468-1f3fd-200d-1f37c':0, '1f468-1f3fe-200d-1f37c':0, '1f468-1f3ff-200d-1f37c':0, '1f468-1f3fb-200d-1f393':0, '1f468-1f3fc-200d-1f393':0, '1f468-1f3fd-200d-1f393':0, '1f468-1f3fe-200d-1f393':0, '1f468-1f3ff-200d-1f393':0, '1f468-1f3fb-200d-1f3a4':0, '1f468-1f3fc-200d-1f3a4':0, '1f468-1f3fd-200d-1f3a4':0, '1f468-1f3fe-200d-1f3a4':0, '1f468-1f3ff-200d-1f3a4':0, '1f468-1f3fb-200d-1f3a8':0, '1f468-1f3fc-200d-1f3a8':0, '1f468-1f3fd-200d-1f3a8':0, '1f468-1f3fe-200d-1f3a8':0, '1f468-1f3ff-200d-1f3a8':0, '1f468-1f3fb-200d-1f3eb':0, '1f468-1f3fc-200d-1f3eb':0, '1f468-1f3fd-200d-1f3eb':0, '1f468-1f3fe-200d-1f3eb':0, '1f468-1f3ff-200d-1f3eb':0, '1f468-1f3fb-200d-1f3ed':0, '1f468-1f3fc-200d-1f3ed':0, '1f468-1f3fd-200d-1f3ed':0, '1f468-1f3fe-200d-1f3ed':0, '1f468-1f3ff-200d-1f3ed':0, '1f468-1f3fb-200d-1f4bb':0, '1f468-1f3fc-200d-1f4bb':0, '1f468-1f3fd-200d-1f4bb':0, '1f468-1f3fe-200d-1f4bb':0, '1f468-1f3ff-200d-1f4bb':0, '1f468-1f3fb-200d-1f4bc':0, '1f468-1f3fc-200d-1f4bc':0, '1f468-1f3fd-200d-1f4bc':0, '1f468-1f3fe-200d-1f4bc':0, '1f468-1f3ff-200d-1f4bc':0, '1f468-1f3fb-200d-1f527':0, '1f468-1f3fc-200d-1f527':0, '1f468-1f3fd-200d-1f527':0, '1f468-1f3fe-200d-1f527':0, '1f468-1f3ff-200d-1f527':0, '1f468-1f3fb-200d-1f52c':0, '1f468-1f3fc-200d-1f52c':0, '1f468-1f3fd-200d-1f52c':0, '1f468-1f3fe-200d-1f52c':0, '1f468-1f3ff-200d-1f52c':0, '1f468-1f3fb-200d-1f680':0, '1f468-1f3fc-200d-1f680':0, '1f468-1f3fd-200d-1f680':0, '1f468-1f3fe-200d-1f680':0, '1f468-1f3ff-200d-1f680':0, '1f468-1f3fb-200d-1f692':0, '1f468-1f3fc-200d-1f692':0, '1f468-1f3fd-200d-1f692':0, '1f468-1f3fe-200d-1f692':0, '1f468-1f3ff-200d-1f692':0, '1f468-1f3fb-200d-1f9af':0, '1f468-1f3fc-200d-1f9af':0, '1f468-1f3fd-200d-1f9af':0, '1f468-1f3fe-200d-1f9af':0, '1f468-1f3ff-200d-1f9af':0, '1f468-1f3fb-200d-1f9b0':0, '1f468-1f3fc-200d-1f9b0':0, '1f468-1f3fd-200d-1f9b0':0, '1f468-1f3fe-200d-1f9b0':0, '1f468-1f3ff-200d-1f9b0':0, '1f468-1f3fb-200d-1f9b1':0, '1f468-1f3fc-200d-1f9b1':0, '1f468-1f3fd-200d-1f9b1':0, '1f468-1f3fe-200d-1f9b1':0, '1f468-1f3ff-200d-1f9b1':0, '1f468-1f3fb-200d-1f9b2':0, '1f468-1f3fc-200d-1f9b2':0, '1f468-1f3fd-200d-1f9b2':0, '1f468-1f3fe-200d-1f9b2':0, '1f468-1f3ff-200d-1f9b2':0, '1f468-1f3fb-200d-1f9b3':0, '1f468-1f3fc-200d-1f9b3':0, '1f468-1f3fd-200d-1f9b3':0, '1f468-1f3fe-200d-1f9b3':0, '1f468-1f3ff-200d-1f9b3':0, '1f468-1f3fb-200d-1f9bc':0, '1f468-1f3fc-200d-1f9bc':0, '1f468-1f3fd-200d-1f9bc':0, '1f468-1f3fe-200d-1f9bc':0, '1f468-1f3ff-200d-1f9bc':0, '1f468-1f3fb-200d-1f9bd':0, '1f468-1f3fc-200d-1f9bd':0, '1f468-1f3fd-200d-1f9bd':0, '1f468-1f3fe-200d-1f9bd':0, '1f468-1f3ff-200d-1f9bd':0, '1f468-1f3fb-200d-2695':0, '1f468-1f3fc-200d-2695':0, '1f468-1f3fd-200d-2695':0, '1f468-1f3fe-200d-2695':0, '1f468-1f3ff-200d-2695':0, '1f468-1f3fb-200d-2696':0, '1f468-1f3fc-200d-2696':0, '1f468-1f3fd-200d-2696':0, '1f468-1f3fe-200d-2696':0, '1f468-1f3ff-200d-2696':0, '1f468-1f3fb-200d-2708':0, '1f468-1f3fc-200d-2708':0, '1f468-1f3fd-200d-2708':0, '1f468-1f3fe-200d-2708':0, '1f468-1f3ff-200d-2708':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fb':0, '1f468-1f3fc':0, '1f468-1f3fd':0, '1f468-1f3fe':0, '1f468-1f3ff':0, '1f469-1f3fb-200d-1f33e':0, '1f469-1f3fc-200d-1f33e':0, '1f469-1f3fd-200d-1f33e':0, '1f469-1f3fe-200d-1f33e':0, '1f469-1f3ff-200d-1f33e':0, '1f469-1f3fb-200d-1f373':0, '1f469-1f3fc-200d-1f373':0, '1f469-1f3fd-200d-1f373':0, '1f469-1f3fe-200d-1f373':0, '1f469-1f3ff-200d-1f373':0, '1f469-1f3fb-200d-1f37c':0, '1f469-1f3fc-200d-1f37c':0, '1f469-1f3fd-200d-1f37c':0, '1f469-1f3fe-200d-1f37c':0, '1f469-1f3ff-200d-1f37c':0, '1f469-1f3fb-200d-1f393':0, '1f469-1f3fc-200d-1f393':0, '1f469-1f3fd-200d-1f393':0, '1f469-1f3fe-200d-1f393':0, '1f469-1f3ff-200d-1f393':0, '1f469-1f3fb-200d-1f3a4':0, '1f469-1f3fc-200d-1f3a4':0, '1f469-1f3fd-200d-1f3a4':0, '1f469-1f3fe-200d-1f3a4':0, '1f469-1f3ff-200d-1f3a4':0, '1f469-1f3fb-200d-1f3a8':0, '1f469-1f3fc-200d-1f3a8':0, '1f469-1f3fd-200d-1f3a8':0, '1f469-1f3fe-200d-1f3a8':0, '1f469-1f3ff-200d-1f3a8':0, '1f469-1f3fb-200d-1f3eb':0, '1f469-1f3fc-200d-1f3eb':0, '1f469-1f3fd-200d-1f3eb':0, '1f469-1f3fe-200d-1f3eb':0, '1f469-1f3ff-200d-1f3eb':0, '1f469-1f3fb-200d-1f3ed':0, '1f469-1f3fc-200d-1f3ed':0, '1f469-1f3fd-200d-1f3ed':0, '1f469-1f3fe-200d-1f3ed':0, '1f469-1f3ff-200d-1f3ed':0, '1f469-1f3fb-200d-1f4bb':0, '1f469-1f3fc-200d-1f4bb':0, '1f469-1f3fd-200d-1f4bb':0, '1f469-1f3fe-200d-1f4bb':0, '1f469-1f3ff-200d-1f4bb':0, '1f469-1f3fb-200d-1f4bc':0, '1f469-1f3fc-200d-1f4bc':0, '1f469-1f3fd-200d-1f4bc':0, '1f469-1f3fe-200d-1f4bc':0, '1f469-1f3ff-200d-1f4bc':0, '1f469-1f3fb-200d-1f527':0, '1f469-1f3fc-200d-1f527':0, '1f469-1f3fd-200d-1f527':0, '1f469-1f3fe-200d-1f527':0, '1f469-1f3ff-200d-1f527':0, '1f469-1f3fb-200d-1f52c':0, '1f469-1f3fc-200d-1f52c':0, '1f469-1f3fd-200d-1f52c':0, '1f469-1f3fe-200d-1f52c':0, '1f469-1f3ff-200d-1f52c':0, '1f469-1f3fb-200d-1f680':0, '1f469-1f3fc-200d-1f680':0, '1f469-1f3fd-200d-1f680':0, '1f469-1f3fe-200d-1f680':0, '1f469-1f3ff-200d-1f680':0, '1f469-1f3fb-200d-1f692':0, '1f469-1f3fc-200d-1f692':0, '1f469-1f3fd-200d-1f692':0, '1f469-1f3fe-200d-1f692':0, '1f469-1f3ff-200d-1f692':0, '1f469-1f3fb-200d-1f9af':0, '1f469-1f3fc-200d-1f9af':0, '1f469-1f3fd-200d-1f9af':0, '1f469-1f3fe-200d-1f9af':0, '1f469-1f3ff-200d-1f9af':0, '1f469-1f3fb-200d-1f9b0':0, '1f469-1f3fc-200d-1f9b0':0, '1f469-1f3fd-200d-1f9b0':0, '1f469-1f3fe-200d-1f9b0':0, '1f469-1f3ff-200d-1f9b0':0, '1f469-1f3fb-200d-1f9b1':0, '1f469-1f3fc-200d-1f9b1':0, '1f469-1f3fd-200d-1f9b1':0, '1f469-1f3fe-200d-1f9b1':0, '1f469-1f3ff-200d-1f9b1':0, '1f469-1f3fb-200d-1f9b2':0, '1f469-1f3fc-200d-1f9b2':0, '1f469-1f3fd-200d-1f9b2':0, '1f469-1f3fe-200d-1f9b2':0, '1f469-1f3ff-200d-1f9b2':0, '1f469-1f3fb-200d-1f9b3':0, '1f469-1f3fc-200d-1f9b3':0, '1f469-1f3fd-200d-1f9b3':0, '1f469-1f3fe-200d-1f9b3':0, '1f469-1f3ff-200d-1f9b3':0, '1f469-1f3fb-200d-1f9bc':0, '1f469-1f3fc-200d-1f9bc':0, '1f469-1f3fd-200d-1f9bc':0, '1f469-1f3fe-200d-1f9bc':0, '1f469-1f3ff-200d-1f9bc':0, '1f469-1f3fb-200d-1f9bd':0, '1f469-1f3fc-200d-1f9bd':0, '1f469-1f3fd-200d-1f9bd':0, '1f469-1f3fe-200d-1f9bd':0, '1f469-1f3ff-200d-1f9bd':0, '1f469-1f3fb-200d-2695':0, '1f469-1f3fc-200d-2695':0, '1f469-1f3fd-200d-2695':0, '1f469-1f3fe-200d-2695':0, '1f469-1f3ff-200d-2695':0, '1f469-1f3fb-200d-2696':0, '1f469-1f3fc-200d-2696':0, '1f469-1f3fd-200d-2696':0, '1f469-1f3fe-200d-2696':0, '1f469-1f3ff-200d-2696':0, '1f469-1f3fb-200d-2708':0, '1f469-1f3fc-200d-2708':0, '1f469-1f3fd-200d-2708':0, '1f469-1f3fe-200d-2708':0, '1f469-1f3ff-200d-2708':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fb':0, '1f469-1f3fc':0, '1f469-1f3fd':0, '1f469-1f3fe':0, '1f469-1f3ff':0, '1f46b-1f3fb':0, '1f46b-1f3fc':0, '1f46b-1f3fd':0, '1f46b-1f3fe':0, '1f46b-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46c-1f3fb':0, '1f46c-1f3fc':0, '1f46c-1f3fd':0, '1f46c-1f3fe':0, '1f46c-1f3ff':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46d-1f3fb':0, '1f46d-1f3fc':0, '1f46d-1f3fd':0, '1f46d-1f3fe':0, '1f46d-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe':0, '1f46e-1f3fb-200d-2640':0, '1f46e-1f3fc-200d-2640':0, '1f46e-1f3fd-200d-2640':0, '1f46e-1f3fe-200d-2640':0, '1f46e-1f3ff-200d-2640':0, '1f46e-1f3fb-200d-2642':0, '1f46e-1f3fc-200d-2642':0, '1f46e-1f3fd-200d-2642':0, '1f46e-1f3fe-200d-2642':0, '1f46e-1f3ff-200d-2642':0, '1f46e-1f3fb':0, '1f46e-1f3fc':0, '1f46e-1f3fd':0, '1f46e-1f3fe':0, '1f46e-1f3ff':0, '1f470-1f3fb-200d-2640':0, '1f470-1f3fc-200d-2640':0, '1f470-1f3fd-200d-2640':0, '1f470-1f3fe-200d-2640':0, '1f470-1f3ff-200d-2640':0, '1f470-1f3fb-200d-2642':0, '1f470-1f3fc-200d-2642':0, '1f470-1f3fd-200d-2642':0, '1f470-1f3fe-200d-2642':0, '1f470-1f3ff-200d-2642':0, '1f470-1f3fb':0, '1f470-1f3fc':0, '1f470-1f3fd':0, '1f470-1f3fe':0, '1f470-1f3ff':0, '1f471-1f3fb-200d-2640':0, '1f471-1f3fc-200d-2640':0, '1f471-1f3fd-200d-2640':0, '1f471-1f3fe-200d-2640':0, '1f471-1f3ff-200d-2640':0, '1f471-1f3fb-200d-2642':0, '1f471-1f3fc-200d-2642':0, '1f471-1f3fd-200d-2642':0, '1f471-1f3fe-200d-2642':0, '1f471-1f3ff-200d-2642':0, '1f471-1f3fb':0, '1f471-1f3fc':0, '1f471-1f3fd':0, '1f471-1f3fe':0, '1f471-1f3ff':0, '1f472-1f3fb':0, '1f472-1f3fc':0, '1f472-1f3fd':0, '1f472-1f3fe':0, '1f472-1f3ff':0, '1f473-1f3fb-200d-2640':0, '1f473-1f3fc-200d-2640':0, '1f473-1f3fd-200d-2640':0, '1f473-1f3fe-200d-2640':0, '1f473-1f3ff-200d-2640':0, '1f473-1f3fb-200d-2642':0, '1f473-1f3fc-200d-2642':0, '1f473-1f3fd-200d-2642':0, '1f473-1f3fe-200d-2642':0, '1f473-1f3ff-200d-2642':0, '1f473-1f3fb':0, '1f473-1f3fc':0, '1f473-1f3fd':0, '1f473-1f3fe':0, '1f473-1f3ff':0, '1f474-1f3fb':0, '1f474-1f3fc':0, '1f474-1f3fd':0, '1f474-1f3fe':0, '1f474-1f3ff':0, '1f475-1f3fb':0, '1f475-1f3fc':0, '1f475-1f3fd':0, '1f475-1f3fe':0, '1f475-1f3ff':0, '1f476-1f3fb':0, '1f476-1f3fc':0, '1f476-1f3fd':0, '1f476-1f3fe':0, '1f476-1f3ff':0, '1f477-1f3fb-200d-2640':0, '1f477-1f3fc-200d-2640':0, '1f477-1f3fd-200d-2640':0, '1f477-1f3fe-200d-2640':0, '1f477-1f3ff-200d-2640':0, '1f477-1f3fb-200d-2642':0, '1f477-1f3fc-200d-2642':0, '1f477-1f3fd-200d-2642':0, '1f477-1f3fe-200d-2642':0, '1f477-1f3ff-200d-2642':0, '1f477-1f3fb':0, '1f477-1f3fc':0, '1f477-1f3fd':0, '1f477-1f3fe':0, '1f477-1f3ff':0, '1f478-1f3fb':0, '1f478-1f3fc':0, '1f478-1f3fd':0, '1f478-1f3fe':0, '1f478-1f3ff':0, '1f47c-1f3fb':0, '1f47c-1f3fc':0, '1f47c-1f3fd':0, '1f47c-1f3fe':0, '1f47c-1f3ff':0, '1f481-1f3fb-200d-2640':0, '1f481-1f3fc-200d-2640':0, '1f481-1f3fd-200d-2640':0, '1f481-1f3fe-200d-2640':0, '1f481-1f3ff-200d-2640':0, '1f481-1f3fb-200d-2642':0, '1f481-1f3fc-200d-2642':0, '1f481-1f3fd-200d-2642':0, '1f481-1f3fe-200d-2642':0, '1f481-1f3ff-200d-2642':0, '1f481-1f3fb':0, '1f481-1f3fc':0, '1f481-1f3fd':0, '1f481-1f3fe':0, '1f481-1f3ff':0, '1f482-1f3fb-200d-2640':0, '1f482-1f3fc-200d-2640':0, '1f482-1f3fd-200d-2640':0, '1f482-1f3fe-200d-2640':0, '1f482-1f3ff-200d-2640':0, '1f482-1f3fb-200d-2642':0, '1f482-1f3fc-200d-2642':0, '1f482-1f3fd-200d-2642':0, '1f482-1f3fe-200d-2642':0, '1f482-1f3ff-200d-2642':0, '1f482-1f3fb':0, '1f482-1f3fc':0, '1f482-1f3fd':0, '1f482-1f3fe':0, '1f482-1f3ff':0, '1f483-1f3fb':0, '1f483-1f3fc':0, '1f483-1f3fd':0, '1f483-1f3fe':0, '1f483-1f3ff':0, '1f485-1f3fb':0, '1f485-1f3fc':0, '1f485-1f3fd':0, '1f485-1f3fe':0, '1f485-1f3ff':0, '1f486-1f3fb-200d-2640':0, '1f486-1f3fc-200d-2640':0, '1f486-1f3fd-200d-2640':0, '1f486-1f3fe-200d-2640':0, '1f486-1f3ff-200d-2640':0, '1f486-1f3fb-200d-2642':0, '1f486-1f3fc-200d-2642':0, '1f486-1f3fd-200d-2642':0, '1f486-1f3fe-200d-2642':0, '1f486-1f3ff-200d-2642':0, '1f486-1f3fb':0, '1f486-1f3fc':0, '1f486-1f3fd':0, '1f486-1f3fe':0, '1f486-1f3ff':0, '1f487-1f3fb-200d-2640':0, '1f487-1f3fc-200d-2640':0, '1f487-1f3fd-200d-2640':0, '1f487-1f3fe-200d-2640':0, '1f487-1f3ff-200d-2640':0, '1f487-1f3fb-200d-2642':0, '1f487-1f3fc-200d-2642':0, '1f487-1f3fd-200d-2642':0, '1f487-1f3fe-200d-2642':0, '1f487-1f3ff-200d-2642':0, '1f487-1f3fb':0, '1f487-1f3fc':0, '1f487-1f3fd':0, '1f487-1f3fe':0, '1f487-1f3ff':0, '1f48f-1f3fb':0, '1f48f-1f3fc':0, '1f48f-1f3fd':0, '1f48f-1f3fe':0, '1f48f-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f491-1f3fb':0, '1f491-1f3fc':0, '1f491-1f3fd':0, '1f491-1f3fe':0, '1f491-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe':0, '1f4aa-1f3fb':0, '1f4aa-1f3fc':0, '1f4aa-1f3fd':0, '1f4aa-1f3fe':0, '1f4aa-1f3ff':0, '1f574-1f3fb':0, '1f574-1f3fc':0, '1f574-1f3fd':0, '1f574-1f3fe':0, '1f574-1f3ff':0, '1f575-1f3fb-200d-2640':0, '1f575-1f3fc-200d-2640':0, '1f575-1f3fd-200d-2640':0, '1f575-1f3fe-200d-2640':0, '1f575-1f3ff-200d-2640':0, '1f575-1f3fb-200d-2642':0, '1f575-1f3fc-200d-2642':0, '1f575-1f3fd-200d-2642':0, '1f575-1f3fe-200d-2642':0, '1f575-1f3ff-200d-2642':0, '1f575-1f3fb':0, '1f575-1f3fc':0, '1f575-1f3fd':0, '1f575-1f3fe':0, '1f575-1f3ff':0, '1f57a-1f3fb':0, '1f57a-1f3fc':0, '1f57a-1f3fd':0, '1f57a-1f3fe':0, '1f57a-1f3ff':0, '1f590-1f3fb':0, '1f590-1f3fc':0, '1f590-1f3fd':0, '1f590-1f3fe':0, '1f590-1f3ff':0, '1f595-1f3fb':0, '1f595-1f3fc':0, '1f595-1f3fd':0, '1f595-1f3fe':0, '1f595-1f3ff':0, '1f596-1f3fb':0, '1f596-1f3fc':0, '1f596-1f3fd':0, '1f596-1f3fe':0, '1f596-1f3ff':0, '1f645-1f3fb-200d-2640':0, '1f645-1f3fc-200d-2640':0, '1f645-1f3fd-200d-2640':0, '1f645-1f3fe-200d-2640':0, '1f645-1f3ff-200d-2640':0, '1f645-1f3fb-200d-2642':0, '1f645-1f3fc-200d-2642':0, '1f645-1f3fd-200d-2642':0, '1f645-1f3fe-200d-2642':0, '1f645-1f3ff-200d-2642':0, '1f645-1f3fb':0, '1f645-1f3fc':0, '1f645-1f3fd':0, '1f645-1f3fe':0, '1f645-1f3ff':0, '1f646-1f3fb-200d-2640':0, '1f646-1f3fc-200d-2640':0, '1f646-1f3fd-200d-2640':0, '1f646-1f3fe-200d-2640':0, '1f646-1f3ff-200d-2640':0, '1f646-1f3fb-200d-2642':0, '1f646-1f3fc-200d-2642':0, '1f646-1f3fd-200d-2642':0, '1f646-1f3fe-200d-2642':0, '1f646-1f3ff-200d-2642':0, '1f646-1f3fb':0, '1f646-1f3fc':0, '1f646-1f3fd':0, '1f646-1f3fe':0, '1f646-1f3ff':0, '1f647-1f3fb-200d-2640':0, '1f647-1f3fc-200d-2640':0, '1f647-1f3fd-200d-2640':0, '1f647-1f3fe-200d-2640':0, '1f647-1f3ff-200d-2640':0, '1f647-1f3fb-200d-2642':0, '1f647-1f3fc-200d-2642':0, '1f647-1f3fd-200d-2642':0, '1f647-1f3fe-200d-2642':0, '1f647-1f3ff-200d-2642':0, '1f647-1f3fb':0, '1f647-1f3fc':0, '1f647-1f3fd':0, '1f647-1f3fe':0, '1f647-1f3ff':0, '1f64b-1f3fb-200d-2640':0, '1f64b-1f3fc-200d-2640':0, '1f64b-1f3fd-200d-2640':0, '1f64b-1f3fe-200d-2640':0, '1f64b-1f3ff-200d-2640':0, '1f64b-1f3fb-200d-2642':0, '1f64b-1f3fc-200d-2642':0, '1f64b-1f3fd-200d-2642':0, '1f64b-1f3fe-200d-2642':0, '1f64b-1f3ff-200d-2642':0, '1f64b-1f3fb':0, '1f64b-1f3fc':0, '1f64b-1f3fd':0, '1f64b-1f3fe':0, '1f64b-1f3ff':0, '1f64c-1f3fb':0, '1f64c-1f3fc':0, '1f64c-1f3fd':0, '1f64c-1f3fe':0, '1f64c-1f3ff':0, '1f64d-1f3fb-200d-2640':0, '1f64d-1f3fc-200d-2640':0, '1f64d-1f3fd-200d-2640':0, '1f64d-1f3fe-200d-2640':0, '1f64d-1f3ff-200d-2640':0, '1f64d-1f3fb-200d-2642':0, '1f64d-1f3fc-200d-2642':0, '1f64d-1f3fd-200d-2642':0, '1f64d-1f3fe-200d-2642':0, '1f64d-1f3ff-200d-2642':0, '1f64d-1f3fb':0, '1f64d-1f3fc':0, '1f64d-1f3fd':0, '1f64d-1f3fe':0, '1f64d-1f3ff':0, '1f64e-1f3fb-200d-2640':0, '1f64e-1f3fc-200d-2640':0, '1f64e-1f3fd-200d-2640':0, '1f64e-1f3fe-200d-2640':0, '1f64e-1f3ff-200d-2640':0, '1f64e-1f3fb-200d-2642':0, '1f64e-1f3fc-200d-2642':0, '1f64e-1f3fd-200d-2642':0, '1f64e-1f3fe-200d-2642':0, '1f64e-1f3ff-200d-2642':0, '1f64e-1f3fb':0, '1f64e-1f3fc':0, '1f64e-1f3fd':0, '1f64e-1f3fe':0, '1f64e-1f3ff':0, '1f64f-1f3fb':0, '1f64f-1f3fc':0, '1f64f-1f3fd':0, '1f64f-1f3fe':0, '1f64f-1f3ff':0, '1f6a3-1f3fb-200d-2640':0, '1f6a3-1f3fc-200d-2640':0, '1f6a3-1f3fd-200d-2640':0, '1f6a3-1f3fe-200d-2640':0, '1f6a3-1f3ff-200d-2640':0, '1f6a3-1f3fb-200d-2642':0, '1f6a3-1f3fc-200d-2642':0, '1f6a3-1f3fd-200d-2642':0, '1f6a3-1f3fe-200d-2642':0, '1f6a3-1f3ff-200d-2642':0, '1f6a3-1f3fb':0, '1f6a3-1f3fc':0, '1f6a3-1f3fd':0, '1f6a3-1f3fe':0, '1f6a3-1f3ff':0, '1f6b4-1f3fb-200d-2640':0, '1f6b4-1f3fc-200d-2640':0, '1f6b4-1f3fd-200d-2640':0, '1f6b4-1f3fe-200d-2640':0, '1f6b4-1f3ff-200d-2640':0, '1f6b4-1f3fb-200d-2642':0, '1f6b4-1f3fc-200d-2642':0, '1f6b4-1f3fd-200d-2642':0, '1f6b4-1f3fe-200d-2642':0, '1f6b4-1f3ff-200d-2642':0, '1f6b4-1f3fb':0, '1f6b4-1f3fc':0, '1f6b4-1f3fd':0, '1f6b4-1f3fe':0, '1f6b4-1f3ff':0, '1f6b5-1f3fb-200d-2640':0, '1f6b5-1f3fc-200d-2640':0, '1f6b5-1f3fd-200d-2640':0, '1f6b5-1f3fe-200d-2640':0, '1f6b5-1f3ff-200d-2640':0, '1f6b5-1f3fb-200d-2642':0, '1f6b5-1f3fc-200d-2642':0, '1f6b5-1f3fd-200d-2642':0, '1f6b5-1f3fe-200d-2642':0, '1f6b5-1f3ff-200d-2642':0, '1f6b5-1f3fb':0, '1f6b5-1f3fc':0, '1f6b5-1f3fd':0, '1f6b5-1f3fe':0, '1f6b5-1f3ff':0, '1f6b6-1f3fb-200d-2640':0, '1f6b6-1f3fc-200d-2640':0, '1f6b6-1f3fd-200d-2640':0, '1f6b6-1f3fe-200d-2640':0, '1f6b6-1f3ff-200d-2640':0, '1f6b6-1f3fb-200d-2642':0, '1f6b6-1f3fc-200d-2642':0, '1f6b6-1f3fd-200d-2642':0, '1f6b6-1f3fe-200d-2642':0, '1f6b6-1f3ff-200d-2642':0, '1f6b6-1f3fb':0, '1f6b6-1f3fc':0, '1f6b6-1f3fd':0, '1f6b6-1f3fe':0, '1f6b6-1f3ff':0, '1f6c0-1f3fb':0, '1f6c0-1f3fc':0, '1f6c0-1f3fd':0, '1f6c0-1f3fe':0, '1f6c0-1f3ff':0, '1f6cc-1f3fb':0, '1f6cc-1f3fc':0, '1f6cc-1f3fd':0, '1f6cc-1f3fe':0, '1f6cc-1f3ff':0, '1f90c-1f3fb':0, '1f90c-1f3fc':0, '1f90c-1f3fd':0, '1f90c-1f3fe':0, '1f90c-1f3ff':0, '1f90f-1f3fb':0, '1f90f-1f3fc':0, '1f90f-1f3fd':0, '1f90f-1f3fe':0, '1f90f-1f3ff':0, '1f918-1f3fb':0, '1f918-1f3fc':0, '1f918-1f3fd':0, '1f918-1f3fe':0, '1f918-1f3ff':0, '1f919-1f3fb':0, '1f919-1f3fc':0, '1f919-1f3fd':0, '1f919-1f3fe':0, '1f919-1f3ff':0, '1f91a-1f3fb':0, '1f91a-1f3fc':0, '1f91a-1f3fd':0, '1f91a-1f3fe':0, '1f91a-1f3ff':0, '1f91b-1f3fb':0, '1f91b-1f3fc':0, '1f91b-1f3fd':0, '1f91b-1f3fe':0, '1f91b-1f3ff':0, '1f91c-1f3fb':0, '1f91c-1f3fc':0, '1f91c-1f3fd':0, '1f91c-1f3fe':0, '1f91c-1f3ff':0, '1f91d-1f3fb':0, '1f91d-1f3fc':0, '1f91d-1f3fd':0, '1f91d-1f3fe':0, '1f91d-1f3ff':0, '1f91e-1f3fb':0, '1f91e-1f3fc':0, '1f91e-1f3fd':0, '1f91e-1f3fe':0, '1f91e-1f3ff':0, '1f91f-1f3fb':0, '1f91f-1f3fc':0, '1f91f-1f3fd':0, '1f91f-1f3fe':0, '1f91f-1f3ff':0, '1f926-1f3fb-200d-2640':0, '1f926-1f3fc-200d-2640':0, '1f926-1f3fd-200d-2640':0, '1f926-1f3fe-200d-2640':0, '1f926-1f3ff-200d-2640':0, '1f926-1f3fb-200d-2642':0, '1f926-1f3fc-200d-2642':0, '1f926-1f3fd-200d-2642':0, '1f926-1f3fe-200d-2642':0, '1f926-1f3ff-200d-2642':0, '1f926-1f3fb':0, '1f926-1f3fc':0, '1f926-1f3fd':0, '1f926-1f3fe':0, '1f926-1f3ff':0, '1f930-1f3fb':0, '1f930-1f3fc':0, '1f930-1f3fd':0, '1f930-1f3fe':0, '1f930-1f3ff':0, '1f931-1f3fb':0, '1f931-1f3fc':0, '1f931-1f3fd':0, '1f931-1f3fe':0, '1f931-1f3ff':0, '1f932-1f3fb':0, '1f932-1f3fc':0, '1f932-1f3fd':0, '1f932-1f3fe':0, '1f932-1f3ff':0, '1f933-1f3fb':0, '1f933-1f3fc':0, '1f933-1f3fd':0, '1f933-1f3fe':0, '1f933-1f3ff':0, '1f934-1f3fb':0, '1f934-1f3fc':0, '1f934-1f3fd':0, '1f934-1f3fe':0, '1f934-1f3ff':0, '1f935-1f3fb-200d-2640':0, '1f935-1f3fc-200d-2640':0, '1f935-1f3fd-200d-2640':0, '1f935-1f3fe-200d-2640':0, '1f935-1f3ff-200d-2640':0, '1f935-1f3fb-200d-2642':0, '1f935-1f3fc-200d-2642':0, '1f935-1f3fd-200d-2642':0, '1f935-1f3fe-200d-2642':0, '1f935-1f3ff-200d-2642':0, '1f935-1f3fb':0, '1f935-1f3fc':0, '1f935-1f3fd':0, '1f935-1f3fe':0, '1f935-1f3ff':0, '1f936-1f3fb':0, '1f936-1f3fc':0, '1f936-1f3fd':0, '1f936-1f3fe':0, '1f936-1f3ff':0, '1f937-1f3fb-200d-2640':0, '1f937-1f3fc-200d-2640':0, '1f937-1f3fd-200d-2640':0, '1f937-1f3fe-200d-2640':0, '1f937-1f3ff-200d-2640':0, '1f937-1f3fb-200d-2642':0, '1f937-1f3fc-200d-2642':0, '1f937-1f3fd-200d-2642':0, '1f937-1f3fe-200d-2642':0, '1f937-1f3ff-200d-2642':0, '1f937-1f3fb':0, '1f937-1f3fc':0, '1f937-1f3fd':0, '1f937-1f3fe':0, '1f937-1f3ff':0, '1f938-1f3fb-200d-2640':0, '1f938-1f3fc-200d-2640':0, '1f938-1f3fd-200d-2640':0, '1f938-1f3fe-200d-2640':0, '1f938-1f3ff-200d-2640':0, '1f938-1f3fb-200d-2642':0, '1f938-1f3fc-200d-2642':0, '1f938-1f3fd-200d-2642':0, '1f938-1f3fe-200d-2642':0, '1f938-1f3ff-200d-2642':0, '1f938-1f3fb':0, '1f938-1f3fc':0, '1f938-1f3fd':0, '1f938-1f3fe':0, '1f938-1f3ff':0, '1f939-1f3fb-200d-2640':0, '1f939-1f3fc-200d-2640':0, '1f939-1f3fd-200d-2640':0, '1f939-1f3fe-200d-2640':0, '1f939-1f3ff-200d-2640':0, '1f939-1f3fb-200d-2642':0, '1f939-1f3fc-200d-2642':0, '1f939-1f3fd-200d-2642':0, '1f939-1f3fe-200d-2642':0, '1f939-1f3ff-200d-2642':0, '1f939-1f3fb':0, '1f939-1f3fc':0, '1f939-1f3fd':0, '1f939-1f3fe':0, '1f939-1f3ff':0, '1f93d-1f3fb-200d-2640':0, '1f93d-1f3fc-200d-2640':0, '1f93d-1f3fd-200d-2640':0, '1f93d-1f3fe-200d-2640':0, '1f93d-1f3ff-200d-2640':0, '1f93d-1f3fb-200d-2642':0, '1f93d-1f3fc-200d-2642':0, '1f93d-1f3fd-200d-2642':0, '1f93d-1f3fe-200d-2642':0, '1f93d-1f3ff-200d-2642':0, '1f93d-1f3fb':0, '1f93d-1f3fc':0, '1f93d-1f3fd':0, '1f93d-1f3fe':0, '1f93d-1f3ff':0, '1f93e-1f3fb-200d-2640':0, '1f93e-1f3fc-200d-2640':0, '1f93e-1f3fd-200d-2640':0, '1f93e-1f3fe-200d-2640':0, '1f93e-1f3ff-200d-2640':0, '1f93e-1f3fb-200d-2642':0, '1f93e-1f3fc-200d-2642':0, '1f93e-1f3fd-200d-2642':0, '1f93e-1f3fe-200d-2642':0, '1f93e-1f3ff-200d-2642':0, '1f93e-1f3fb':0, '1f93e-1f3fc':0, '1f93e-1f3fd':0, '1f93e-1f3fe':0, '1f93e-1f3ff':0, '1f977-1f3fb':0, '1f977-1f3fc':0, '1f977-1f3fd':0, '1f977-1f3fe':0, '1f977-1f3ff':0, '1f9b5-1f3fb':0, '1f9b5-1f3fc':0, '1f9b5-1f3fd':0, '1f9b5-1f3fe':0, '1f9b5-1f3ff':0, '1f9b6-1f3fb':0, '1f9b6-1f3fc':0, '1f9b6-1f3fd':0, '1f9b6-1f3fe':0, '1f9b6-1f3ff':0, '1f9b8-1f3fb-200d-2640':0, '1f9b8-1f3fc-200d-2640':0, '1f9b8-1f3fd-200d-2640':0, '1f9b8-1f3fe-200d-2640':0, '1f9b8-1f3ff-200d-2640':0, '1f9b8-1f3fb-200d-2642':0, '1f9b8-1f3fc-200d-2642':0, '1f9b8-1f3fd-200d-2642':0, '1f9b8-1f3fe-200d-2642':0, '1f9b8-1f3ff-200d-2642':0, '1f9b8-1f3fb':0, '1f9b8-1f3fc':0, '1f9b8-1f3fd':0, '1f9b8-1f3fe':0, '1f9b8-1f3ff':0, '1f9b9-1f3fb-200d-2640':0, '1f9b9-1f3fc-200d-2640':0, '1f9b9-1f3fd-200d-2640':0, '1f9b9-1f3fe-200d-2640':0, '1f9b9-1f3ff-200d-2640':0, '1f9b9-1f3fb-200d-2642':0, '1f9b9-1f3fc-200d-2642':0, '1f9b9-1f3fd-200d-2642':0, '1f9b9-1f3fe-200d-2642':0, '1f9b9-1f3ff-200d-2642':0, '1f9b9-1f3fb':0, '1f9b9-1f3fc':0, '1f9b9-1f3fd':0, '1f9b9-1f3fe':0, '1f9b9-1f3ff':0, '1f9bb-1f3fb':0, '1f9bb-1f3fc':0, '1f9bb-1f3fd':0, '1f9bb-1f3fe':0, '1f9bb-1f3ff':0, '1f9cd-1f3fb-200d-2640':0, '1f9cd-1f3fc-200d-2640':0, '1f9cd-1f3fd-200d-2640':0, '1f9cd-1f3fe-200d-2640':0, '1f9cd-1f3ff-200d-2640':0, '1f9cd-1f3fb-200d-2642':0, '1f9cd-1f3fc-200d-2642':0, '1f9cd-1f3fd-200d-2642':0, '1f9cd-1f3fe-200d-2642':0, '1f9cd-1f3ff-200d-2642':0, '1f9cd-1f3fb':0, '1f9cd-1f3fc':0, '1f9cd-1f3fd':0, '1f9cd-1f3fe':0, '1f9cd-1f3ff':0, '1f9ce-1f3fb-200d-2640':0, '1f9ce-1f3fc-200d-2640':0, '1f9ce-1f3fd-200d-2640':0, '1f9ce-1f3fe-200d-2640':0, '1f9ce-1f3ff-200d-2640':0, '1f9ce-1f3fb-200d-2642':0, '1f9ce-1f3fc-200d-2642':0, '1f9ce-1f3fd-200d-2642':0, '1f9ce-1f3fe-200d-2642':0, '1f9ce-1f3ff-200d-2642':0, '1f9ce-1f3fb':0, '1f9ce-1f3fc':0, '1f9ce-1f3fd':0, '1f9ce-1f3fe':0, '1f9ce-1f3ff':0, '1f9cf-1f3fb-200d-2640':0, '1f9cf-1f3fc-200d-2640':0, '1f9cf-1f3fd-200d-2640':0, '1f9cf-1f3fe-200d-2640':0, '1f9cf-1f3ff-200d-2640':0, '1f9cf-1f3fb-200d-2642':0, '1f9cf-1f3fc-200d-2642':0, '1f9cf-1f3fd-200d-2642':0, '1f9cf-1f3fe-200d-2642':0, '1f9cf-1f3ff-200d-2642':0, '1f9cf-1f3fb':0, '1f9cf-1f3fc':0, '1f9cf-1f3fd':0, '1f9cf-1f3fe':0, '1f9cf-1f3ff':0, '1f9d1-1f3fb-200d-1f33e':0, '1f9d1-1f3fc-200d-1f33e':0, '1f9d1-1f3fd-200d-1f33e':0, '1f9d1-1f3fe-200d-1f33e':0, '1f9d1-1f3ff-200d-1f33e':0, '1f9d1-1f3fb-200d-1f373':0, '1f9d1-1f3fc-200d-1f373':0, '1f9d1-1f3fd-200d-1f373':0, '1f9d1-1f3fe-200d-1f373':0, '1f9d1-1f3ff-200d-1f373':0, '1f9d1-1f3fb-200d-1f37c':0, '1f9d1-1f3fc-200d-1f37c':0, '1f9d1-1f3fd-200d-1f37c':0, '1f9d1-1f3fe-200d-1f37c':0, '1f9d1-1f3ff-200d-1f37c':0, '1f9d1-1f3fb-200d-1f384':0, '1f9d1-1f3fc-200d-1f384':0, '1f9d1-1f3fd-200d-1f384':0, '1f9d1-1f3fe-200d-1f384':0, '1f9d1-1f3ff-200d-1f384':0, '1f9d1-1f3fb-200d-1f393':0, '1f9d1-1f3fc-200d-1f393':0, '1f9d1-1f3fd-200d-1f393':0, '1f9d1-1f3fe-200d-1f393':0, '1f9d1-1f3ff-200d-1f393':0, '1f9d1-1f3fb-200d-1f3a4':0, '1f9d1-1f3fc-200d-1f3a4':0, '1f9d1-1f3fd-200d-1f3a4':0, '1f9d1-1f3fe-200d-1f3a4':0, '1f9d1-1f3ff-200d-1f3a4':0, '1f9d1-1f3fb-200d-1f3a8':0, '1f9d1-1f3fc-200d-1f3a8':0, '1f9d1-1f3fd-200d-1f3a8':0, '1f9d1-1f3fe-200d-1f3a8':0, '1f9d1-1f3ff-200d-1f3a8':0, '1f9d1-1f3fb-200d-1f3eb':0, '1f9d1-1f3fc-200d-1f3eb':0, '1f9d1-1f3fd-200d-1f3eb':0, '1f9d1-1f3fe-200d-1f3eb':0, '1f9d1-1f3ff-200d-1f3eb':0, '1f9d1-1f3fb-200d-1f3ed':0, '1f9d1-1f3fc-200d-1f3ed':0, '1f9d1-1f3fd-200d-1f3ed':0, '1f9d1-1f3fe-200d-1f3ed':0, '1f9d1-1f3ff-200d-1f3ed':0, '1f9d1-1f3fb-200d-1f4bb':0, '1f9d1-1f3fc-200d-1f4bb':0, '1f9d1-1f3fd-200d-1f4bb':0, '1f9d1-1f3fe-200d-1f4bb':0, '1f9d1-1f3ff-200d-1f4bb':0, '1f9d1-1f3fb-200d-1f4bc':0, '1f9d1-1f3fc-200d-1f4bc':0, '1f9d1-1f3fd-200d-1f4bc':0, '1f9d1-1f3fe-200d-1f4bc':0, '1f9d1-1f3ff-200d-1f4bc':0, '1f9d1-1f3fb-200d-1f527':0, '1f9d1-1f3fc-200d-1f527':0, '1f9d1-1f3fd-200d-1f527':0, '1f9d1-1f3fe-200d-1f527':0, '1f9d1-1f3ff-200d-1f527':0, '1f9d1-1f3fb-200d-1f52c':0, '1f9d1-1f3fc-200d-1f52c':0, '1f9d1-1f3fd-200d-1f52c':0, '1f9d1-1f3fe-200d-1f52c':0, '1f9d1-1f3ff-200d-1f52c':0, '1f9d1-1f3fb-200d-1f680':0, '1f9d1-1f3fc-200d-1f680':0, '1f9d1-1f3fd-200d-1f680':0, '1f9d1-1f3fe-200d-1f680':0, '1f9d1-1f3ff-200d-1f680':0, '1f9d1-1f3fb-200d-1f692':0, '1f9d1-1f3fc-200d-1f692':0, '1f9d1-1f3fd-200d-1f692':0, '1f9d1-1f3fe-200d-1f692':0, '1f9d1-1f3ff-200d-1f692':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fb-200d-1f9af':0, '1f9d1-1f3fc-200d-1f9af':0, '1f9d1-1f3fd-200d-1f9af':0, '1f9d1-1f3fe-200d-1f9af':0, '1f9d1-1f3ff-200d-1f9af':0, '1f9d1-1f3fb-200d-1f9b0':0, '1f9d1-1f3fc-200d-1f9b0':0, '1f9d1-1f3fd-200d-1f9b0':0, '1f9d1-1f3fe-200d-1f9b0':0, '1f9d1-1f3ff-200d-1f9b0':0, '1f9d1-1f3fb-200d-1f9b1':0, '1f9d1-1f3fc-200d-1f9b1':0, '1f9d1-1f3fd-200d-1f9b1':0, '1f9d1-1f3fe-200d-1f9b1':0, '1f9d1-1f3ff-200d-1f9b1':0, '1f9d1-1f3fb-200d-1f9b2':0, '1f9d1-1f3fc-200d-1f9b2':0, '1f9d1-1f3fd-200d-1f9b2':0, '1f9d1-1f3fe-200d-1f9b2':0, '1f9d1-1f3ff-200d-1f9b2':0, '1f9d1-1f3fb-200d-1f9b3':0, '1f9d1-1f3fc-200d-1f9b3':0, '1f9d1-1f3fd-200d-1f9b3':0, '1f9d1-1f3fe-200d-1f9b3':0, '1f9d1-1f3ff-200d-1f9b3':0, '1f9d1-1f3fb-200d-1f9bc':0, '1f9d1-1f3fc-200d-1f9bc':0, '1f9d1-1f3fd-200d-1f9bc':0, '1f9d1-1f3fe-200d-1f9bc':0, '1f9d1-1f3ff-200d-1f9bc':0, '1f9d1-1f3fb-200d-1f9bd':0, '1f9d1-1f3fc-200d-1f9bd':0, '1f9d1-1f3fd-200d-1f9bd':0, '1f9d1-1f3fe-200d-1f9bd':0, '1f9d1-1f3ff-200d-1f9bd':0, '1f9d1-1f3fb-200d-2695':0, '1f9d1-1f3fc-200d-2695':0, '1f9d1-1f3fd-200d-2695':0, '1f9d1-1f3fe-200d-2695':0, '1f9d1-1f3ff-200d-2695':0, '1f9d1-1f3fb-200d-2696':0, '1f9d1-1f3fc-200d-2696':0, '1f9d1-1f3fd-200d-2696':0, '1f9d1-1f3fe-200d-2696':0, '1f9d1-1f3ff-200d-2696':0, '1f9d1-1f3fb-200d-2708':0, '1f9d1-1f3fc-200d-2708':0, '1f9d1-1f3fd-200d-2708':0, '1f9d1-1f3fe-200d-2708':0, '1f9d1-1f3ff-200d-2708':0, '1f9d1-1f3fb':0, '1f9d1-1f3fc':0, '1f9d1-1f3fd':0, '1f9d1-1f3fe':0, '1f9d1-1f3ff':0, '1f9d2-1f3fb':0, '1f9d2-1f3fc':0, '1f9d2-1f3fd':0, '1f9d2-1f3fe':0, '1f9d2-1f3ff':0, '1f9d3-1f3fb':0, '1f9d3-1f3fc':0, '1f9d3-1f3fd':0, '1f9d3-1f3fe':0, '1f9d3-1f3ff':0, '1f9d4-1f3fb-200d-2640':0, '1f9d4-1f3fc-200d-2640':0, '1f9d4-1f3fd-200d-2640':0, '1f9d4-1f3fe-200d-2640':0, '1f9d4-1f3ff-200d-2640':0, '1f9d4-1f3fb-200d-2642':0, '1f9d4-1f3fc-200d-2642':0, '1f9d4-1f3fd-200d-2642':0, '1f9d4-1f3fe-200d-2642':0, '1f9d4-1f3ff-200d-2642':0, '1f9d4-1f3fb':0, '1f9d4-1f3fc':0, '1f9d4-1f3fd':0, '1f9d4-1f3fe':0, '1f9d4-1f3ff':0, '1f9d5-1f3fb':0, '1f9d5-1f3fc':0, '1f9d5-1f3fd':0, '1f9d5-1f3fe':0, '1f9d5-1f3ff':0, '1f9d6-1f3fb-200d-2640':0, '1f9d6-1f3fc-200d-2640':0, '1f9d6-1f3fd-200d-2640':0, '1f9d6-1f3fe-200d-2640':0, '1f9d6-1f3ff-200d-2640':0, '1f9d6-1f3fb-200d-2642':0, '1f9d6-1f3fc-200d-2642':0, '1f9d6-1f3fd-200d-2642':0, '1f9d6-1f3fe-200d-2642':0, '1f9d6-1f3ff-200d-2642':0, '1f9d6-1f3fb':0, '1f9d6-1f3fc':0, '1f9d6-1f3fd':0, '1f9d6-1f3fe':0, '1f9d6-1f3ff':0, '1f9d7-1f3fb-200d-2640':0, '1f9d7-1f3fc-200d-2640':0, '1f9d7-1f3fd-200d-2640':0, '1f9d7-1f3fe-200d-2640':0, '1f9d7-1f3ff-200d-2640':0, '1f9d7-1f3fb-200d-2642':0, '1f9d7-1f3fc-200d-2642':0, '1f9d7-1f3fd-200d-2642':0, '1f9d7-1f3fe-200d-2642':0, '1f9d7-1f3ff-200d-2642':0, '1f9d7-1f3fb':0, '1f9d7-1f3fc':0, '1f9d7-1f3fd':0, '1f9d7-1f3fe':0, '1f9d7-1f3ff':0, '1f9d8-1f3fb-200d-2640':0, '1f9d8-1f3fc-200d-2640':0, '1f9d8-1f3fd-200d-2640':0, '1f9d8-1f3fe-200d-2640':0, '1f9d8-1f3ff-200d-2640':0, '1f9d8-1f3fb-200d-2642':0, '1f9d8-1f3fc-200d-2642':0, '1f9d8-1f3fd-200d-2642':0, '1f9d8-1f3fe-200d-2642':0, '1f9d8-1f3ff-200d-2642':0, '1f9d8-1f3fb':0, '1f9d8-1f3fc':0, '1f9d8-1f3fd':0, '1f9d8-1f3fe':0, '1f9d8-1f3ff':0, '1f9d9-1f3fb-200d-2640':0, '1f9d9-1f3fc-200d-2640':0, '1f9d9-1f3fd-200d-2640':0, '1f9d9-1f3fe-200d-2640':0, '1f9d9-1f3ff-200d-2640':0, '1f9d9-1f3fb-200d-2642':0, '1f9d9-1f3fc-200d-2642':0, '1f9d9-1f3fd-200d-2642':0, '1f9d9-1f3fe-200d-2642':0, '1f9d9-1f3ff-200d-2642':0, '1f9d9-1f3fb':0, '1f9d9-1f3fc':0, '1f9d9-1f3fd':0, '1f9d9-1f3fe':0, '1f9d9-1f3ff':0, '1f9da-1f3fb-200d-2640':0, '1f9da-1f3fc-200d-2640':0, '1f9da-1f3fd-200d-2640':0, '1f9da-1f3fe-200d-2640':0, '1f9da-1f3ff-200d-2640':0, '1f9da-1f3fb-200d-2642':0, '1f9da-1f3fc-200d-2642':0, '1f9da-1f3fd-200d-2642':0, '1f9da-1f3fe-200d-2642':0, '1f9da-1f3ff-200d-2642':0, '1f9da-1f3fb':0, '1f9da-1f3fc':0, '1f9da-1f3fd':0, '1f9da-1f3fe':0, '1f9da-1f3ff':0, '1f9db-1f3fb-200d-2640':0, '1f9db-1f3fc-200d-2640':0, '1f9db-1f3fd-200d-2640':0, '1f9db-1f3fe-200d-2640':0, '1f9db-1f3ff-200d-2640':0, '1f9db-1f3fb-200d-2642':0, '1f9db-1f3fc-200d-2642':0, '1f9db-1f3fd-200d-2642':0, '1f9db-1f3fe-200d-2642':0, '1f9db-1f3ff-200d-2642':0, '1f9db-1f3fb':0, '1f9db-1f3fc':0, '1f9db-1f3fd':0, '1f9db-1f3fe':0, '1f9db-1f3ff':0, '1f9dc-1f3fb-200d-2640':0, '1f9dc-1f3fc-200d-2640':0, '1f9dc-1f3fd-200d-2640':0, '1f9dc-1f3fe-200d-2640':0, '1f9dc-1f3ff-200d-2640':0, '1f9dc-1f3fb-200d-2642':0, '1f9dc-1f3fc-200d-2642':0, '1f9dc-1f3fd-200d-2642':0, '1f9dc-1f3fe-200d-2642':0, '1f9dc-1f3ff-200d-2642':0, '1f9dc-1f3fb':0, '1f9dc-1f3fc':0, '1f9dc-1f3fd':0, '1f9dc-1f3fe':0, '1f9dc-1f3ff':0, '1f9dd-1f3fb-200d-2640':0, '1f9dd-1f3fc-200d-2640':0, '1f9dd-1f3fd-200d-2640':0, '1f9dd-1f3fe-200d-2640':0, '1f9dd-1f3ff-200d-2640':0, '1f9dd-1f3fb-200d-2642':0, '1f9dd-1f3fc-200d-2642':0, '1f9dd-1f3fd-200d-2642':0, '1f9dd-1f3fe-200d-2642':0, '1f9dd-1f3ff-200d-2642':0, '1f9dd-1f3fb':0, '1f9dd-1f3fc':0, '1f9dd-1f3fd':0, '1f9dd-1f3fe':0, '1f9dd-1f3ff':0, '261d-1f3fb':0, '261d-1f3fc':0, '261d-1f3fd':0, '261d-1f3fe':0, '261d-1f3ff':0, '26f9-1f3fb-200d-2640':0, '26f9-1f3fc-200d-2640':0, '26f9-1f3fd-200d-2640':0, '26f9-1f3fe-200d-2640':0, '26f9-1f3ff-200d-2640':0, '26f9-1f3fb-200d-2642':0, '26f9-1f3fc-200d-2642':0, '26f9-1f3fd-200d-2642':0, '26f9-1f3fe-200d-2642':0, '26f9-1f3ff-200d-2642':0, '26f9-1f3fb':0, '26f9-1f3fc':0, '26f9-1f3fd':0, '26f9-1f3fe':0, '26f9-1f3ff':0, '270a-1f3fb':0, '270a-1f3fc':0, '270a-1f3fd':0, '270a-1f3fe':0, '270a-1f3ff':0, '270b-1f3fb':0, '270b-1f3fc':0, '270b-1f3fd':0, '270b-1f3fe':0, '270b-1f3ff':0, '270c-1f3fb':0, '270c-1f3fc':0, '270c-1f3fd':0, '270c-1f3fe':0, '270c-1f3ff':0, '270d-1f3fb':0, '270d-1f3fc':0, '270d-1f3fd':0, '270d-1f3fe':0, '270d-1f3ff':0}};\n\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\nfor(const version in EmojiVersions) {\n if(version) {\n Object.assign(Emoji, EmojiVersions[version as EMOJI_VERSION]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || navigator.maxTouchPoints > 0) && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LatinizeMap from '../config/latinizeMap';\n\nexport const badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nconst C2L: {[k: string]: string} = {\n 'й': 'q',\n 'ц': 'w',\n 'у': 'e',\n 'к': 'r',\n 'е': 't',\n 'н': 'y',\n 'г': 'u',\n 'ш': 'i',\n 'щ': 'o',\n 'з': 'p',\n 'х': '[',\n 'ъ': ']',\n 'ф': 'a',\n 'ы': 's',\n 'в': 'd',\n 'а': 'f',\n 'п': 'g',\n 'р': 'h',\n 'о': 'j',\n 'л': 'k',\n 'д': 'l',\n 'ж': ';',\n 'э': '\\'',\n 'я': 'z',\n 'ч': 'x',\n 'с': 'c',\n 'м': 'v',\n 'и': 'b',\n 'т': 'n',\n 'ь': 'm',\n 'б': ',',\n 'ю': '.',\n '.': '/'\n};\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function fixCyrillic(text: string) {\n return text.toLowerCase().replace(/[\\wа-я]/g, (ch) => {\n const latinizeCh = C2L[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = LatinizeMap[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n return processSearchText(text, {\n clearBadChars: true,\n latinize,\n ignoreCase: true\n });\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n const originalText = text;\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n if(options.latinize) text += '\\x01' + fixCyrillic(originalText);\n return text;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\n\nconst FILENAME_JOINER = '_';\n\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\n fileName: string,\n downloadId: string\n}>) {\n const fileName = '';// (options?.fileName || '').split('.');\n const ext = fileName[fileName.length - 1] || '';\n\n let str: string;\n switch(location._) {\n case 'inputPhotoFileLocation': {\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputDocumentFileLocation': {\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputPeerPhotoFileLocation':\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\n break;\n\n case 'inputStickerSetThumb': {\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\n location.stickerset._;\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputFileLocation': {\n str = [location.volume_id, location.local_id].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputWebFileLocation': {\n str = ['webFile', location.url].join(FILENAME_JOINER);\n break;\n }\n\n default: {\n console.error('Unrecognized location:', location);\n str = '';\n break;\n }\n }\n\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\n}\n\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\n // console.log('getFileURL', location);\n // const perf = performance.now();\n const encoded = encodeURIComponent(JSON.stringify(options));\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\n\n return /* '/' + */type + '/' + encoded;\n}\n","import {RestrictionReason} from '../layer';\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach((reason) => {\n ignore.add(reason);\n });\n}\n","import isObject from '../../../../helpers/object/isObject';\nimport {InputChannel, InputPeer, Peer} from '../../../../layer';\nimport {NULL_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | InputChannel | PeerId | string): PeerId {\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\n // if(typeof(peerId) === 'number') return peerId;\n else if(isObject(peerId)) {\n const userId = (peerId as Peer.peerUser).user_id;\n if(userId !== undefined) {\n return userId.toPeerId(false);\n }\n\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\n if(chatId !== undefined) {\n return chatId.toPeerId(true);\n }\n\n return NULL_PEER_ID; // maybe it is an inputPeerSelf\n // } else if(!peerId) return 'u0';\n } else if(!peerId) return NULL_PEER_ID;\n\n const isUser = (peerId as string).charAt(0) === 'u';\n const peerParams = (peerId as string).substr(1).split('_');\n\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","import type ENVIRONMENT from '.';\n\nlet environment: typeof ENVIRONMENT;\nexport function getEnvironment() {\n return environment;\n}\n\nexport function setEnvironment(env: typeof environment) {\n return environment = env;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\nimport type {Dialog, ForumTopic, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport type {MTAppConfig} from './mtproto/appConfig';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n 'chat_toggle_forum': {chatId: ChatId, enabled: boolean},\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, threadId?: number, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': {peerId: PeerId, threadId?: number},\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog | ForumTopic, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog | ForumTopic},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': Dialog | ForumTopic,\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog | ForumTopic,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map}>,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n\n 'contacts_update': UserId,\n 'avatar_update': {peerId: PeerId, threadId?: number},\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n // 'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n\n 'background_change': void,\n\n 'privacy_update': Update.updatePrivacy,\n\n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n\n 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': void,\n\n 'media_play': void,\n\n 'emoji_recent': AppEmoji,\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\n\n 'premium_toggle': boolean,\n 'premium_toggle_private': {isNew: boolean, isPremium: boolean},\n\n 'config': Config,\n 'app_config': MTAppConfig\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle_private', ({isNew, isPremium}) => {\n this.premium = isPremium;\n\n if(!isNew) {\n this.dispatchEventSingle('premium_toggle', isPremium);\n }\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {State} from '../../config/state';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport setDeepProperty from '../../helpers/object/setDeepProperty';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\n\nexport class AppStateManager {\n private state: State = {} as any;\n private storage = stateStorage;\n\n // ! for mtproto worker use only\n public newVersion: string;\n public oldVersion: string;\n public userId: UserId;\n\n public getState() {\n return Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n\n const first = key.split('.')[0] as keyof State;\n if(first === 'settings') {\n rootScope.dispatchEvent('settings_updated', {key, value, settings: this.state.settings});\n }\n\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true, onlyLocal?: boolean) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value, onlyLocal);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key], onlyLocal?: boolean) {\n MTProtoMessagePort.getInstance().invokeVoid('mirror', {name: 'state', key, value});\n\n this.storage.set({\n [key]: value\n }, onlyLocal);\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\nconst appStateManager = new AppStateManager();\nexport default appStateManager;\n","import getDeepProperty from './getDeepProperty';\n\nexport default function setDeepProperty(object: any, key: string, value: any) {\n const splitted = key.split('.');\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from '../../../helpers/schedulers/pause';\nimport {DcId} from '../../../types';\nimport {logger, LogTypes} from '../../logger';\nimport type MTPNetworker from '../networker';\nimport MTTransport from './transport';\nimport Modes from '../../../config/modes';\n\n \nimport transportController from './controller';\n// import networkStats from '../networkStats';\n \n\nexport default class HTTP implements MTTransport {\n public networker: MTPNetworker;\n private log: ReturnType;\n\n private pending: Array<{\n resolve: (body: Uint8Array) => void,\n reject: any,\n body: Uint8Array\n }> = [];\n private releasing: boolean;\n\n public connected: boolean;\n private destroyed: boolean;\n private debug: boolean;\n\n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\n this.debug = Modes.debug && false;\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n\n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connected = false;\n }\n\n public _send(body: Uint8Array, mode?: RequestMode) {\n const length = body.length;\n this.debug && this.log.debug('-> body length to send:', length);\n\n // networkStats.addSent(this.dcId, length);\n return fetch(this.url, {method: 'POST', body, mode}).then((response) => {\n if(response.status !== 200 && !mode) {\n response.arrayBuffer().then((buffer) => {\n this.log.error('not 200',\n new TextDecoder('utf-8').decode(new Uint8Array(buffer)));\n });\n\n throw response;\n }\n\n this.setConnected(true);\n\n // * test resending by dropping random request\n // if(Math.random() > .5) {\n // throw 'asd';\n // }\n\n return response.arrayBuffer().then((buffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n return new Uint8Array(buffer);\n });\n }, (err) => {\n this.setConnected(false);\n throw err;\n });\n }\n\n private setConnected(connected: boolean) {\n if(this.connected === connected || this.destroyed) {\n return;\n }\n\n this.connected = connected;\n\n \n transportController.setTransportValue('https', connected);\n \n }\n\n public destroy() {\n this.setConnected(false);\n this.destroyed = true;\n this.pending.forEach((pending) => pending.reject());\n this.pending.length = 0;\n }\n\n public send(body: Uint8Array) {\n if(this.networker) {\n return this._send(body);\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending() {\n if(this.releasing) return;\n\n this.releasing = true;\n // this.log('-> messages to send:', this.pending.length);\n for(let i = 0; i < this.pending.length; ++i) {\n const pending = this.pending[i];\n const {body, resolve} = pending;\n\n try {\n const result = await this._send(body);\n resolve(result);\n this.pending.splice(i, 1);\n } catch(err) {\n this.log.error('Send plain request error:', err);\n await pause(5000);\n }\n\n --i;\n }\n\n this.releasing = false;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {logger, LogTypes} from '../../logger';\nimport Modes from '../../../config/modes';\nimport EventListenerBase from '../../../helpers/eventListenerBase';\nimport {MTConnection} from './transport';\n\n// let closeSocketBefore = Date.now() + 30e3;\n// let closeSocketAfter = Date.now() + 10e3;\n\nexport default class Socket extends EventListenerBase<{\n open: () => void,\n message: (buffer: ArrayBuffer) => any,\n close: () => void,\n}> implements MTConnection {\n private ws: WebSocket;\n private log: ReturnType;\n private debug = Modes.debug && false;\n\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\n super();\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n this.connect();\n\n return this;\n }\n\n private removeListeners() {\n if(!this.ws) {\n return;\n }\n\n this.ws.removeEventListener('open', this.handleOpen);\n this.ws.removeEventListener('close', this.handleClose);\n this.ws.removeEventListener('error', this.handleError);\n this.ws.removeEventListener('message', this.handleMessage);\n this.ws = undefined;\n }\n\n private connect() {\n this.ws = new WebSocket(this.url, 'binary');\n this.ws.binaryType = 'arraybuffer';\n this.ws.addEventListener('open', this.handleOpen);\n this.ws.addEventListener('close', this.handleClose);\n this.ws.addEventListener('error', this.handleError);\n this.ws.addEventListener('message', this.handleMessage);\n\n // if(Date.now() < closeSocketBefore) {\n // if(Date.now() >= closeSocketAfter) {\n // this.ws.close();\n // }\n }\n\n public close() {\n if(!this.ws) {\n return;\n }\n\n this.log('close execution');\n\n try {\n this.ws.close();\n } catch(err) {\n\n }\n this.handleClose();\n }\n\n private handleOpen = () => {\n this.log('opened');\n\n this.debug && this.log.debug('sending init packet');\n this.dispatchEvent('open');\n };\n\n private handleError = (e: Event) => {\n this.log.error('handleError', e);\n this.close();\n };\n\n private handleClose = (e?: CloseEvent) => {\n this.log('closed', e/* , this.pending, this.ws.bufferedAmount */);\n\n this.removeListeners();\n this.dispatchEvent('close');\n };\n\n private handleMessage = (event: MessageEvent) => {\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\n\n this.dispatchEvent('message', event.data as ArrayBuffer);\n };\n\n public send = (body: Uint8Array) => {\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n this.ws.send(body);\n };\n}\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n\n return arr;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import aesjs from 'aes-js';\nimport randomize from '../../../helpers/array/randomize';\nimport cryptoMessagePort from '../../crypto/cryptoMessagePort';\nimport {Codec} from './codec';\n\n/*\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\n*/\nexport default class Obfuscation {\n /* private enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\n private dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\n\n private id: number;\n private idPromise: Promise;\n private process: (data: Uint8Array, operation: 'encrypt' | 'decrypt') => ReturnType;\n\n // private cryptoEncKey: CryptoKey;\n // private cryptoDecKey: CryptoKey;\n // private cryptoKey: CryptoKey;\n\n // private encIv: Uint8Array;\n // private decIv: Uint8Array;\n\n // private decIvCounter: Counter;\n\n public async init(codec: Codec) {\n if(this.idPromise !== undefined) {\n this.release();\n }\n\n const initPayload = new Uint8Array(64);\n randomize(initPayload);\n\n while(true) {\n const val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | initPayload[0];\n const val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | initPayload[4];\n if(initPayload[0] !== 0xef &&\n val !== 0x44414548 &&\n val !== 0x54534f50 &&\n val !== 0x20544547 &&\n val !== 0x4954504f &&\n val !== 0xeeeeeeee &&\n val !== 0xdddddddd &&\n val2 !== 0x00000000) {\n // initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\n break;\n }\n randomize(initPayload);\n }\n\n // //////////////////////initPayload.subarray(60, 62).hex = dcId;\n /* initPayload.set(new Uint8Array([161, 208, 67, 71, 118, 109, 20, 111, 113, 255, 134, 10, 159, 241, 7, 44, 217, 82, 187, 76, 108, 131, 200, 186, 33, 57, 177, 251, 52, 34, 18, 54, 65, 105, 37, 89, 38, 20, 47, 168, 126, 181, 24, 138, 212, 68, 60, 150, 225, 37, 181, 4, 201, 50, 72, 151, 168, 143, 204, 169, 81, 187, 241, 23]));\n console.log('initPayload', initPayload); */\n\n const reversedPayload = initPayload.slice().reverse();\n\n const encKey = initPayload.slice(8, 40);\n const encIv = /* this.encIv = */initPayload.slice(40, 56);\n const decKey = reversedPayload.slice(8, 40);\n const decIv = /* this.decIv = */reversedPayload.slice(40, 56);\n\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\n\n // console.log('encKey', encKey.hex, encIv.hex);\n // console.log('decKey', decKey.hex, decIv.hex);\n\n const idPromise = this.idPromise = cryptoMessagePort.invokeCrypto('aes-ctr-prepare', {\n encKey,\n encIv,\n decKey,\n decIv\n });\n\n this.process = async(data, operation) => {\n await idPromise;\n return this._process(data, operation);\n };\n\n this.id = await idPromise;\n\n this.process = this._process;\n\n // this.decIvCounter = new Counter(this.decIv);\n /* const key = this.cryptoEncKey = await subtle.importKey(\n 'raw',\n encKey,\n {name: 'AES-CTR'},\n false,\n ['encrypt']\n ); */\n\n // this.cryptoDecKey = await subtle.importKey(\n // 'raw',\n // decKey,\n // {name: 'AES-CTR'},\n // false,\n // ['encrypt']\n // );\n\n // this.cryptoKey = await subtle.importKey(\n // 'raw',\n // encKey,\n // {name: 'AES-CTR'},\n // false,\n // ['encrypt', 'decrypt']\n // );\n\n initPayload.set(codec.obfuscateTag, 56);\n const encrypted = await this.encode(initPayload.slice());\n\n // console.log('encrypted', encrypted);\n\n initPayload.set(encrypted.slice(56, 64), 56);\n\n return initPayload;\n }\n\n /* public encode(payload: Uint8Array) {\n let startTime = performance.now();\n let res = this.enc.encrypt(payload);\n let time = performance.now() - startTime;\n\n try {\n startTime = performance.now();\n let arr = this.encNew.encrypt(payload);\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\n let resNew = new Uint8Array(bytesFromWordss(arr));\n let time2 = performance.now() - startTime;\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\n } catch(err) {\n console.error('Obfuscation: error:', err);\n }\n\n return res;\n }\n\n public decode(payload: Uint8Array) {\n let res = this.dec.encrypt(payload);\n\n try {\n let arr = this.decNew.decrypt(payload);\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\n let resNew = new Uint8Array(bytesFromWordss(arr));\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\n } catch(err) {\n console.error('Obfuscation: error:', err);\n }\n\n return res;\n } */\n\n private _process = (data: Uint8Array, operation: 'encrypt' | 'decrypt') => {\n return cryptoMessagePort.invokeCryptoNew({\n method: 'aes-ctr-process',\n args: [{id: this.id, data, operation}],\n transfer: [data.buffer]\n }) as Promise;\n };\n\n public encode(payload: Uint8Array) {\n /* return subtle.encrypt({\n name: 'AES-CTR',\n counter: this.encIv,\n length: 64\n },\n this.cryptoEncKey,\n payload\n ); */\n return this.process(payload, 'encrypt');\n }\n\n public decode(payload: Uint8Array) {\n return this.process(payload, 'decrypt');\n }\n\n public async release() {\n const idPromise = this.idPromise;\n if(idPromise === undefined) {\n return;\n }\n\n this.id = undefined;\n this.idPromise = undefined;\n\n const id = await idPromise;\n cryptoMessagePort.invokeCrypto('aes-ctr-destroy', id);\n }\n\n public destroy() {\n this.release();\n }\n\n // public encode(payload: Uint8Array) {\n // let res = this.encNew.encrypt(payload);\n // let bytes = new Uint8Array(bytesFromWordss(res));\n\n // return bytes;\n // }\n\n // public async decode(payload: Uint8Array) {\n // const counter = this.decIvCounter.counter.slice();\n // this.decIvCounter.increment();\n\n // const n: ArrayBuffer = await subtle.encrypt({\n // name: 'AES-CTR',\n // counter: counter,\n // length: 64\n // },\n // this.cryptoDecKey,\n // payload\n // );\n\n // const decoded = this.decNew.update(payload);\n\n // console.log('decode', bytesToHex(decoded), 'new', n, bytesToHex(new Uint8Array(n)));\n\n // return decoded;\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { bytesFromHex, addPadding } from \"../../bin_utils\";\nimport {Codec} from './codec';\n\nclass AbridgedPacketCodec implements Codec {\n public tag = 0xef;\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\n\n public encodePacket(data: Uint8Array) {\n const len = data.byteLength >> 2;\n let header: Uint8Array;\n if(len < 127) {\n header = new Uint8Array([len]);\n } else { // Length: payload length, divided by four, and encoded as 3 length bytes (little endian)\n // header = new Uint8Array([0x7f, ...addPadding(bytesFromHex(len.toString(16)).reverse(), 3, true)/* .reverse() */]);\n header = new Uint8Array([0x7f, len & 0xFF, (len >> 8) & 0xFF, (len >> 16) & 0xFF]);\n // console.log('got nobody cause im braindead', header, len);\n }\n\n return header.concat(data);\n // return new Uint8Array([...header, ...data]);\n }\n\n public readPacket(data: Uint8Array) {\n let length = data[0];\n if(length >= 127) { // 0x7f\n length = data[1] | (data[2] << 8) | (data[3] << 16);\n\n return data.slice(4, length << 2 + 1); // need +1\n }\n\n return data.slice(1, length << 2 + 1); // need +1\n }\n}\n\nexport default new AbridgedPacketCodec();\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../../../config/modes';\nimport {logger, LogTypes} from '../../logger';\nimport MTPNetworker from '../networker';\nimport Obfuscation from './obfuscation';\nimport MTTransport, {MTConnection, MTConnectionConstructable} from './transport';\n// import intermediatePacketCodec from './intermediate';\nimport abridgedPacketCodec from './abridged';\n// import paddedIntermediatePacketCodec from './padded';\nimport {ConnectionStatus} from '../connectionStatus';\n\n \nimport transportController from './controller';\nimport bytesToHex from '../../../helpers/bytes/bytesToHex';\n// import networkStats from '../networkStats';\nimport ctx from '../../../environment/ctx';\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = abridgedPacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType;\n public connected = false;\n private lastCloseTime: number;\n public connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n private releasingPending: boolean;\n\n // private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(\n private Connection: MTConnectionConstructable,\n private dcId: number,\n private url: string,\n private logSuffix: string,\n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connect();\n }\n\n private onOpen = async() => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = await this.obfuscation.init(this.codec);\n if(!this.connected) {\n return;\n }\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n }/* else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n } */\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = async(buffer: ArrayBuffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n\n let data = await this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n // this.pending = this.pending.filter((p) => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then((response) => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n // this.releasePending();\n }).catch((err) => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n // this.dd();\n return;\n }\n\n // console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', bytesToHex(data));\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n\n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n\n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = ctx.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n \n if(this.connected) {\n transportController.setTransportClosed('websocket');\n }\n \n\n this.connected = false;\n\n if(this.connection) {\n this.connection.removeEventListener('open', this.onOpen);\n this.connection.removeEventListener('close', this.onClose);\n this.connection.removeEventListener('message', this.onMessage);\n this.connection = undefined;\n }\n }\n\n /**\n * invoke only when closed\n */\n public reconnect = () => {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n if(this.connection) {\n return;\n }\n\n this.log('trying to reconnect...');\n this.lastCloseTime = Date.now();\n\n if(!this.networker) {\n for(const pending of this.pending) {\n if(pending.bodySent) {\n pending.bodySent = false;\n }\n }\n } else {\n this.networker.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.connect();\n }\n\n public forceReconnect() {\n this.close();\n this.reconnect();\n }\n\n public destroy() {\n this.setAutoReconnect(false);\n this.close();\n\n if(this.obfuscation) {\n this.obfuscation.destroy();\n }\n\n this.pending.forEach((pending) => {\n if(pending.reject) {\n pending.reject();\n }\n });\n this.pending.length = 0;\n }\n\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n public changeUrl(url: string) {\n if(this.url === url) {\n return;\n }\n\n this.url = url;\n this.forceReconnect();\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n // this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n // this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = /* this.connected ? this.encodeBody(body) : */undefined;\n\n // return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending(/* tt = false */) {\n if(!this.connected || this.releasingPending) {\n // this.connect();\n return;\n }\n\n this.releasingPending = true;\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n // this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n let sent = false;\n // for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n if(!pending) {\n break;\n }\n\n const {body, bodySent} = pending;\n if(body && !bodySent) {\n // this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n // if(!encoded) {\n // encoded = pending.encoded = this.encodeBody(body);\n // }\n\n const encoded = pending.encoded ??= await this.encodeBody(body);\n if(!this.connected) {\n break;\n }\n\n // networkStats.addSent(this.dcId, encoded.byteLength);\n this.connection.send(encoded);\n\n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n sent = true;\n // delete pending.body;\n }\n }\n\n this.releasingPending = undefined;\n\n if(this.pending.length && sent) {\n this.releasePending();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport MTTransport, {MTConnectionConstructable} from './transports/transport';\nimport Modes from '../../config/modes';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\n\n \nimport HTTP from './transports/http';\n \n\n \nimport Socket from './transports/websocket';\nimport TcpObfuscated from './transports/tcpObfuscated';\nimport {IS_WEB_WORKER} from '../../helpers/context';\nimport {DcId} from '../../types';\nimport {getEnvironment} from '../../environment/utils';\n\n \n \n \n\n \n\nexport type TransportType = 'websocket' | 'https' | 'http';\nexport type ConnectionType = 'client' | 'download' | 'upload';\ntype Servers = {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTTransport[]\n }\n }\n};\n\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\nconst PREMIUM_SUFFIX = '_premium';\n\nexport function getTelegramConnectionSuffix(connectionType: ConnectionType) {\n return connectionType === 'client' ? '' : '-1';\n}\n\n \nexport function constructTelegramWebSocketUrl(dcId: DcId, connectionType: ConnectionType, premium?: boolean) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const path = connectionType !== 'client' ? 'apiws' + TEST_SUFFIX + (premium ? PREMIUM_SUFFIX : '') : ('apiws' + TEST_SUFFIX);\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\n\n return chosenServer;\n}\n \n\nexport class DcConfigurator {\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\n\n private dcOptions = Modes.test ?\n [\n {id: 1, host: '149.154.175.10', port: 80},\n {id: 2, host: '149.154.167.40', port: 80},\n {id: 3, host: '149.154.175.117', port: 80}\n ] :\n [\n {id: 1, host: '149.154.175.50', port: 80},\n {id: 2, host: '149.154.167.50', port: 80},\n {id: 3, host: '149.154.175.100', port: 80},\n {id: 4, host: '149.154.167.91', port: 80},\n {id: 5, host: '149.154.171.5', port: 80}\n ];\n\n public chosenServers: Servers = {} as any;\n\n \n private transportSocket = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n const chosenServer = constructTelegramWebSocketUrl(dcId, connectionType, premium);\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\n\n let oooohLetMeLive: MTConnectionConstructable;\n \n oooohLetMeLive = Socket;\n \n \n \n\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\n };\n \n\n \n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n let chosenServer: string;\n if(Modes.ssl || !Modes.http) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const subdomain = this.sslSubdomains[dcId - 1] + suffix;\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\n } else {\n for(const dcOption of this.dcOptions) {\n if(dcOption.id === dcId) {\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\n break;\n }\n }\n }\n\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n return new HTTP(dcId, chosenServer, logSuffix);\n };\n \n\n public chooseServer(\n dcId: DcId,\n connectionType: ConnectionType = 'client',\n transportType: TransportType = Modes.transport,\n reuse = true,\n premium?: boolean\n ) {\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\n connectionType = 'client';\n } */\n\n if(!this.chosenServers.hasOwnProperty(transportType)) {\n this.chosenServers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const servers = this.chosenServers[transportType][connectionType];\n\n if(!(dcId in servers)) {\n servers[dcId] = [];\n }\n\n const transports = servers[dcId];\n\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\n let transport: MTTransport;\n\n \n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, premium);\n \n \n \n \n \n\n if(!transport) {\n console.error('No chosenServer!', dcId);\n return null;\n }\n\n if(reuse) {\n transports.push(transport);\n }\n\n return transport;\n }\n\n return transports[0];\n }\n\n public static removeTransport(obj: any, transport: T) {\n for(const transportType in obj) {\n // @ts-ignore\n for(const connectionType in obj[transportType]) {\n // @ts-ignore\n for(const dcId in obj[transportType][connectionType]) {\n // @ts-ignore\n const transports: T[] = obj[transportType][connectionType][dcId];\n indexOfAndSplice(transports, transport);\n }\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../../config/app';\nimport deferredPromise from '../../../helpers/cancellablePromise';\nimport EventListenerBase from '../../../helpers/eventListenerBase';\nimport pause from '../../../helpers/schedulers/pause';\nimport {TransportType, DcConfigurator} from '../dcConfigurator';\nimport type HTTP from './http';\nimport type TcpObfuscated from './tcpObfuscated';\nimport MTTransport from './transport';\n\nexport class MTTransportController extends EventListenerBase<{\n change: (opened: MTTransportController['opened']) => void,\n transport: (type: TransportType) => void\n}> {\n private opened: Map;\n private transports: {[k in TransportType]?: MTTransport};\n private pinging: boolean;\n private dcConfigurator: DcConfigurator;\n\n constructor() {\n super(true);\n\n this.opened = new Map();\n /* this.addEventListener('change', (opened) => {\n this.dispatchEvent('transport', opened.get('websocket') || !opened.get('https') ? 'websocket' : 'https');\n }); */\n\n this.addEventListener('change', (opened) => {\n if(!opened.get('websocket')) {\n this.waitForWebSocket();\n }\n });\n\n // setTimeout(() => {\n // this.waitForWebSocket();\n // }, 200); // wait for first transport so won't have delay for first WS\n }\n\n public async pingTransports() {\n const dcConfigurator = this.dcConfigurator ??= new DcConfigurator();\n const timeout = 2000;\n const transports: {[k in TransportType]?: MTTransport} = this.transports = {\n https: dcConfigurator.chooseServer(App.baseDcId, 'client', 'https', false),\n websocket: dcConfigurator.chooseServer(App.baseDcId, 'client', 'websocket', false)\n };\n\n const httpPromise = deferredPromise();\n ((this.transports.https as HTTP)._send(new Uint8Array(), 'no-cors') as any as Promise)\n .then(() => httpPromise.resolve(true), () => httpPromise.resolve(false));\n setTimeout(() => httpPromise.resolve(false), timeout);\n\n const websocketPromise = deferredPromise();\n const socket = transports.websocket as TcpObfuscated;\n socket.setAutoReconnect(false);\n socket.connection.addEventListener('close', () => websocketPromise.resolve(false), {once: true});\n socket.connection.addEventListener('open', () => websocketPromise.resolve(true), {once: true});\n setTimeout(() => {\n if(websocketPromise.isFulfilled || websocketPromise.isRejected) {\n return;\n }\n\n if(socket.connection) {\n socket.connection.close();\n }\n\n websocketPromise.resolve(false);\n }, timeout);\n\n const [isHttpAvailable, isWebSocketAvailable] = await Promise.all([httpPromise, websocketPromise]);\n\n for(const transportType in transports) {\n const transport = transports[transportType as TransportType];\n transport.destroy();\n }\n\n const result = {\n https: isHttpAvailable || this.opened.get('https') > 0,\n websocket: isWebSocketAvailable || this.opened.get('websocket') > 0\n };\n\n // result.websocket = false;\n return result;\n }\n\n public async waitForWebSocket() {\n if(this.pinging) return;\n this.pinging = true;\n\n while(true) {\n const {https, websocket} = await this.pingTransports();\n if(https || websocket) {\n this.dispatchEvent('transport', websocket || !https ? 'websocket' : 'https');\n }\n\n if(websocket) {\n break;\n }\n\n await pause(10000);\n }\n\n this.pinging = false;\n }\n\n public setTransportValue(type: TransportType, value: boolean) {\n let length = this.opened.get(type) || 0;\n length += value ? 1 : -1;\n\n this.opened.set(type, length);\n this.dispatchEvent('change', this.opened);\n }\n\n public setTransportOpened(type: TransportType) {\n return this.setTransportValue(type, true);\n }\n\n public setTransportClosed(type: TransportType) {\n return this.setTransportValue(type, false);\n }\n}\n\nconst transportController = new MTTransportController();\nexport default transportController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise, {CancellablePromise} from '../../../../helpers/cancellablePromise';\nimport type {StoragesResults} from './loadStorages';\n\nconst RESET_STORAGES_PROMISE: CancellablePromise> = deferredPromise();\nexport default RESET_STORAGES_PROMISE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {CryptoMessagePort} from '../crypto/cryptoMessagePort';\nimport type {ApiFileManager} from '../mtproto/apiFileManager';\nimport type {ApiManager} from '../mtproto/apiManager';\nimport type {Authorizer} from '../mtproto/authorizer';\nimport type {DcConfigurator} from '../mtproto/dcConfigurator';\nimport type {NetworkerFactory} from '../mtproto/networkerFactory';\nimport type {PasswordManager} from '../mtproto/passwordManager';\nimport type {ReferenceDatabase} from '../mtproto/referenceDatabase';\nimport type {TimeManager} from '../mtproto/timeManager';\nimport type {RootScope} from '../rootScope';\nimport type DialogsStorage from '../storages/dialogs';\nimport type FiltersStorage from '../storages/filters';\nimport type PeersStorage from '../storages/peers';\nimport type ThumbsStorage from '../storages/thumbs';\nimport type {ApiUpdatesManager} from './apiUpdatesManager';\nimport type {AppAvatarsManager} from './appAvatarsManager';\nimport type {AppCallsManager} from './appCallsManager';\nimport type {AppChatsManager} from './appChatsManager';\nimport type {AppDocsManager} from './appDocsManager';\nimport type {AppDraftsManager} from './appDraftsManager';\nimport type {AppEmojiManager} from './appEmojiManager';\nimport type {AppGroupCallsManager} from './appGroupCallsManager';\nimport type {AppInlineBotsManager} from './appInlineBotsManager';\nimport type {AppMessagesIdsManager} from './appMessagesIdsManager';\nimport type {AppMessagesManager} from './appMessagesManager';\nimport type {AppNotificationsManager} from './appNotificationsManager';\nimport type AppPaymentsManager from './appPaymentsManager';\nimport type {AppPeersManager} from './appPeersManager';\nimport type {AppPhotosManager} from './appPhotosManager';\nimport type {AppPollsManager} from './appPollsManager';\nimport type {AppPrivacyManager} from './appPrivacyManager';\nimport type {AppProfileManager} from './appProfileManager';\nimport type {AppReactionsManager} from './appReactionsManager';\nimport type {AppStateManager} from './appStateManager';\nimport type {AppStickersManager} from './appStickersManager';\nimport type {AppStoragesManager} from './appStoragesManager';\nimport type {AppUsersManager} from './appUsersManager';\nimport type AppWebDocsManager from './appWebDocsManager';\nimport type {AppWebPagesManager} from './appWebPagesManager';\nimport type AppAttachMenuBotsManager from './appAttachMenuBotsManager';\nimport type AppSeamlessLoginManager from './appSeamlessLoginManager';\nimport type AppThemesManager from './appThemesManager';\nimport type {AppManagers} from './managers';\n\nexport class AppManager {\n protected appPeersManager: AppPeersManager;\n protected appChatsManager: AppChatsManager;\n protected appDocsManager: AppDocsManager;\n protected appPhotosManager: AppPhotosManager;\n protected appPollsManager: AppPollsManager;\n protected appUsersManager: AppUsersManager;\n protected appWebPagesManager: AppWebPagesManager;\n protected appDraftsManager: AppDraftsManager;\n protected appProfileManager: AppProfileManager;\n protected appNotificationsManager: AppNotificationsManager;\n protected apiUpdatesManager: ApiUpdatesManager;\n protected appAvatarsManager: AppAvatarsManager;\n protected appGroupCallsManager: AppGroupCallsManager;\n protected appCallsManager: AppCallsManager;\n protected appReactionsManager: AppReactionsManager;\n protected appMessagesManager: AppMessagesManager;\n protected appMessagesIdsManager: AppMessagesIdsManager;\n protected appPrivacyManager: AppPrivacyManager;\n protected appInlineBotsManager: AppInlineBotsManager;\n protected appStickersManager: AppStickersManager;\n protected referenceDatabase: ReferenceDatabase;\n protected appEmojiManager: AppEmojiManager;\n protected dialogsStorage: DialogsStorage;\n protected filtersStorage: FiltersStorage;\n protected apiManager: ApiManager;\n // protected apiManager: ApiManagerProxy;\n protected passwordManager: PasswordManager;\n protected cryptoWorker: CryptoMessagePort;\n protected apiFileManager: ApiFileManager;\n protected peersStorage: PeersStorage;\n protected thumbsStorage: ThumbsStorage;\n protected networkerFactory: NetworkerFactory;\n protected rootScope: RootScope;\n protected authorizer: Authorizer;\n protected dcConfigurator: DcConfigurator;\n protected timeManager: TimeManager;\n protected appStoragesManager: AppStoragesManager;\n protected appStateManager: AppStateManager;\n protected appWebDocsManager: AppWebDocsManager;\n protected appPaymentsManager: AppPaymentsManager;\n protected appAttachMenuBotsManager: AppAttachMenuBotsManager;\n protected appSeamlessLoginManager: AppSeamlessLoginManager;\n protected appThemesManager: AppThemesManager;\n\n public clear: (init?: boolean) => void;\n\n public setManagers(managers: AppManagers) {\n Object.assign(this, managers);\n // this.after();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type{Chat} from '../../../../layer';\nimport type{Dialog} from '../../appMessagesManager';\nimport type{User} from '../../appUsersManager';\nimport type {StoragesStorages} from './createStorages';\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\nimport {Awaited} from '../../../../types';\nimport {logger} from '../../../logger';\nimport RESET_STORAGES_PROMISE from './resetStoragesPromise';\n\nexport type StoragesResults = Awaited>;\n\nasync function loadStoragesInner(storages: StoragesStorages) {\n const recordPromise = recordPromiseBound(logger('STORAGES-LOADER'));\n const storagesKeys = Object.keys(storages) as Array;\n const storagesPromises: Promise[] = storagesKeys.map((key) => {\n const promise = storages[key].getAll();\n return recordPromise(promise, 'storage ' + (key as any as string));\n });\n\n const storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n const arr = await Promise.all(storagesPromises);\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n const resetStorages = await RESET_STORAGES_PROMISE;\n if(resetStorages.size) {\n for(const key of resetStorages) {\n storagesResults[key].length = 0;\n }\n\n resetStorages.clear();\n }\n\n return storagesResults;\n}\n\nlet promise: ReturnType;\nexport default function loadStorages(storages: StoragesStorages) {\n return promise ??= loadStoragesInner(storages);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {logger} from '../logger';\nimport {AppManager} from './manager';\nimport createStorages from './utils/storages/createStorages';\nimport loadStorages from './utils/storages/loadStorages';\n\nexport class AppStoragesManager extends AppManager {\n private storages: ReturnType;\n\n // private loadPromise: CancellablePromise;\n\n private log: ReturnType;\n\n constructor() {\n super();\n\n this.log = logger('STORAGES');\n this.storages = createStorages();\n // this.loadPromise = deferredPromise();\n }\n\n public loadStorages() {\n return loadStorages(this.storages);\n // loadStorages(this.storages).then((storagesResults) => {\n // this.loadPromise.resolve(storagesResults);\n // });\n\n // return this.loadPromise;\n }\n\n // public setStoragesResults(storagesResults: StoragesResults) {\n // this.loadPromise.resolve(storagesResults);\n // }\n\n public async loadStorage(name: T) {\n return this.loadStorages().then((storagesResults) => {\n return {\n storage: this.storages[name],\n results: storagesResults[name]\n };\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Chat} from '../../../../layer';\nimport type {Dialog} from '../../appMessagesManager';\nimport type {User} from '../../appUsersManager';\nimport DATABASE_STATE from '../../../../config/databases/state';\nimport AppStorage from '../../../storage';\n\nexport type StoragesStorages = {\n users: AppStorage, typeof DATABASE_STATE>,\n chats: AppStorage, typeof DATABASE_STATE>,\n dialogs: AppStorage, typeof DATABASE_STATE>\n};\n\nexport default function createStorages() {\n const names: (keyof StoragesStorages)[] = ['users', 'chats', 'dialogs'];\n const storages: StoragesStorages = {} as any;\n for(const name of names) {\n // @ts-ignore\n storages[name] = new AppStorage(DATABASE_STATE, name);\n }\n\n return storages;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\nimport randomize from '../../helpers/array/randomize';\nimport {AppManager} from '../appManagers/manager';\n\nexport class PasswordManager extends AppManager {\n public getState(): Promise {\n return this.apiManager.invokeApi('account.getPassword').then((result) => {\n return result;\n });\n }\n\n public updateSettings(settings: {\n hint?: string,\n email?: string,\n newPassword?: string,\n currentPassword?: string\n } = {}) {\n // state = Object.assign({}, state);\n // state.new_algo = Object.assign({}, state.new_algo);\n\n return this.getState().then((state) => {\n let currentHashPromise: Promise;\n let newHashPromise: Promise;\n const params: AccountUpdatePasswordSettings = {\n password: null,\n new_settings: {\n _: 'account.passwordInputSettings',\n hint: settings.hint,\n email: settings.email\n }\n };\n\n if(settings.currentPassword) {\n currentHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\n } else {\n currentHashPromise = Promise.resolve({\n _: 'inputCheckPasswordEmpty'\n });\n }\n\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\n randomize(salt1);\n salt1.set(newAlgo.salt1, 0);\n newAlgo.salt1 = salt1;\n\n if(settings.newPassword) {\n newHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\n } else {\n newHashPromise = Promise.resolve(new Uint8Array());\n }\n\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\n params.password = hashes[0];\n params.new_settings.new_algo = newAlgo;\n params.new_settings.new_password_hash = hashes[1];\n\n return this.apiManager.invokeApi('account.updatePasswordSettings', params);\n });\n });\n }\n\n public getInputCheckPassword(password: string, state: AccountPassword) {\n return this.cryptoWorker.invokeCrypto('computeSRP', password, state, false) as Promise;\n }\n\n public check(password: string, state: AccountPassword, options: any = {}) {\n return this.getInputCheckPassword(password, state).then((inputCheckPassword) => {\n // console.log('SRP', inputCheckPassword);\n return this.apiManager.invokeApi('auth.checkPassword', {\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\n }, options).then((auth) => {\n if(auth._ === 'auth.authorization') {\n this.apiManager.setUser(auth.user);\n }\n\n return auth;\n });\n });\n }\n\n public confirmPasswordEmail(code: string) {\n return this.apiManager.invokeApi('account.confirmPasswordEmail', {code});\n }\n\n public resendPasswordEmail() {\n return this.apiManager.invokeApi('account.resendPasswordEmail');\n }\n\n public cancelPasswordEmail() {\n return this.apiManager.invokeApi('account.cancelPasswordEmail');\n }\n\n /* public requestRecovery(options: any = {}) {\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\n }\n\n public recover(code: any, options: any = {}) {\n return apiManager.invokeApi('auth.recoverPassword', {\n code\n }, options);\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Photo, WallPaper} from '../../layer';\nimport {logger} from '../logger';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport {AppManager} from '../appManagers/manager';\nimport makeError from '../../helpers/makeError';\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage | ReferenceContext.referenceContextEmojiesSounds | ReferenceContext.referenceContextReactions | ReferenceContext.referenceContextUserFull | ReferenceContext.referenceContextCustomEmoji | ReferenceContext.referenceContextAttachMenuBotIcon | ReferenceContext.referenceContextWallPaper;\nexport namespace ReferenceContext {\n export type referenceContextProfilePhoto = {\n type: 'profilePhoto',\n peerId: PeerId\n };\n\n export type referenceContextMessage = {\n type: 'message',\n peerId: PeerId,\n messageId: number\n };\n\n export type referenceContextEmojiesSounds = {\n type: 'emojiesSounds'\n };\n\n export type referenceContextReactions = {\n type: 'reactions'\n };\n\n export type referenceContextUserFull = {\n type: 'userFull',\n userId: UserId\n };\n\n export type referenceContextCustomEmoji = {\n type: 'customEmoji',\n docId: DocId\n };\n\n export type referenceContextAttachMenuBotIcon = {\n type: 'attachMenuBotIcon',\n botId: BotId\n };\n\n export type referenceContextWallPaper = {\n type: 'wallPaper',\n wallPaperId: WallPaper['id']\n };\n}\n\nexport type ReferenceBytes = Photo.photo['file_reference'];\nexport type ReferenceContexts = Set;\n\n// type ReferenceBytes = Uint8Array;\n\nexport class ReferenceDatabase extends AppManager {\n private contexts: Map = new Map();\n // private references: Map = new Map();\n private links: {[hex: string]: ReferenceBytes} = {};\n private log = logger('RD', undefined, true);\n private refreshEmojiesSoundsPromise: Promise;\n\n // constructor() {\n // super();\n\n // apiManager.addTaskListener('refreshReference', (task: RefreshReferenceTask) => {\n // const originalPayload = task.payload;\n\n // assumeType(task);\n // task.originalPayload = originalPayload;\n\n // this.refreshReference(originalPayload).then((bytes) => {\n // task.payload = bytes;\n // }, (err) => {\n // task.error = err;\n // }).then(() => apiManager.postMessage(task));\n // });\n // }\n\n public saveContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(!contexts) {\n contexts = new Set();\n this.contexts.set(reference, contexts);\n }\n\n this.links[bytesToHex(reference)] = reference;\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n return;\n }\n }\n\n contexts.add(context);\n }\n\n public getReferenceByLink(reference: ReferenceBytes) {\n return this.links[bytesToHex(reference)];\n }\n\n public getContexts(reference: ReferenceBytes): [ReferenceContexts, ReferenceBytes] {\n const contexts = this.contexts.get(reference) || (reference = this.getReferenceByLink(reference) || reference, this.contexts.get(reference));\n return [contexts, reference];\n }\n\n public getContext(reference: ReferenceBytes): [ReferenceContext, ReferenceBytes] {\n const contexts = this.getContexts(reference);\n return contexts[0] ? [contexts[0].values().next().value, contexts[1]] : undefined;\n }\n\n public deleteContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(contexts) {\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n contexts.delete(_context);\n if(!contexts.size) {\n this.contexts.delete(reference);\n delete this.links[bytesToHex(reference)];\n }\n return true;\n }\n }\n }\n\n return false;\n }\n\n public refreshReference(reference: ReferenceBytes, context?: ReferenceContext): Promise {\n this.log('refreshReference: start', reference.slice(), context);\n if(!context) {\n const c = this.getContext(reference);\n if(!c) {\n this.log('refreshReference: got no context for reference:', reference.slice());\n return Promise.reject('NO_CONTEXT');\n }\n\n [context, reference] = c;\n }\n\n let promise: Promise;\n switch(context?.type) {\n case 'message': {\n promise = this.appMessagesManager.reloadMessages(context.peerId, context.messageId, true);\n break;\n // .then(() => {\n // console.log('FILE_REFERENCE_EXPIRED: got message', context, appMessagesManager.getMessage((context as ReferenceContext.referenceContextMessage).messageId).media, reference);\n // });\n }\n\n case 'emojiesSounds': {\n promise = this.refreshEmojiesSoundsPromise || this.appStickersManager.getAnimatedEmojiSounds(true).then(() => {\n this.refreshEmojiesSoundsPromise = undefined;\n });\n break;\n }\n\n case 'userFull': {\n promise = Promise.resolve(this.appProfileManager.getProfile(context.userId, true));\n break;\n }\n\n case 'customEmoji': {\n promise = this.appEmojiManager.getCustomEmojiDocuments([context.docId]);\n break;\n }\n\n case 'attachMenuBotIcon': {\n promise = this.appAttachMenuBotsManager.getAttachMenuBot(context.botId, true) as any;\n break;\n }\n\n case 'wallPaper': {\n promise = this.appThemesManager.getWallPaperById(context.wallPaperId);\n break;\n }\n\n default: {\n this.log.warn('refreshReference: not implemented context', context);\n return Promise.reject();\n }\n }\n\n const hex = bytesToHex(reference);\n this.log('refreshReference: refreshing reference:', hex);\n return promise.then(() => {\n const newHex = bytesToHex(reference);\n this.log('refreshReference: refreshed, reference before:', hex, 'after:', newHex);\n if(hex !== newHex) {\n return reference;\n }\n\n this.deleteContext(reference, context);\n\n const newContext = this.getContext(reference);\n if(newContext) {\n return this.refreshReference(reference, newContext[0]);\n }\n\n this.log.error('refreshReference: no new context, reference before:', hex, 'after:', newHex, context);\n\n throw makeError('NO_NEW_CONTEXT');\n });\n }\n\n /* public replaceReference(oldReference: ReferenceBytes, newReference: ReferenceBytes) {\n const contexts = this.contexts.get(oldReference);\n if(contexts) {\n this.contexts.delete(oldReference);\n this.contexts.set(newReference, contexts);\n }\n } */\n}\n","export default function safeReplaceObject(wasObject: any, newObject: any) {\n if(!wasObject) {\n return newObject;\n }\n\n for(var key in wasObject) {\n if(!newObject.hasOwnProperty(key)) {\n delete wasObject[key];\n }\n }\n\n for(var key in newObject) {\n // if (newObject.hasOwnProperty(key)) { // useless\n wasObject[key] = newObject[key];\n // }\n }\n\n return wasObject;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message, MessageAction, MessageMedia} from '../../../../layer';\nimport getPeerId from '../peers/getPeerId';\n\nexport default function getPeerIdsFromMessage(message: Message.message | Message.messageService) {\n const peerIds: number[] = [\n message.fromId,\n message.viaBotId,\n (message as Message.message).fwdFromId\n ];\n\n const media = (message as Message.message).media;\n if(media) {\n const contactUserId = (media as MessageMedia.messageMediaContact).user_id;\n if(contactUserId !== undefined) {\n peerIds.push(contactUserId.toPeerId());\n }\n\n const results = (media as MessageMedia.messageMediaPoll).results;\n const recentVoters = results?.recent_voters;\n if(recentVoters?.length) {\n peerIds.push(...recentVoters.map((userId) => userId.toPeerId()));\n }\n }\n\n const recentReactions = ((message as Message.message).reactions)?.recent_reactions;\n if(recentReactions?.length) {\n peerIds.push(...recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n const action = (message as Message.messageService).action;\n if(action) {\n const userIds: UserId[] = [\n ...((action as MessageAction.messageActionChatAddUser).users || []),\n (action as MessageAction.messageActionChatDeleteUser).user_id,\n (action as MessageAction.messageActionChatJoinedByLink).inviter_id\n ];\n peerIds.push(...userIds.filter(Boolean).map((userId) => userId.toPeerId()));\n\n const chatIds: ChatId[] = [\n (action as MessageAction.messageActionChatMigrateTo).channel_id,\n (action as MessageAction.messageActionChannelMigrateFrom).chat_id\n ];\n peerIds.push(...chatIds.filter(Boolean).map((chatId) => chatId.toPeerId(true)));\n }\n\n const recentRepliers = ((message as Message.message).replies)?.recent_repliers;\n if(recentRepliers?.length) {\n peerIds.push(...recentRepliers.map((reply) => getPeerId(reply)));\n }\n\n return new Set(peerIds.filter(Boolean));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ForumTopic} from '../../../../layer';\nimport type {Dialog} from '../../appMessagesManager';\nimport type getDialogIndexKey from './getDialogIndexKey';\n\nexport default function setDialogIndex(\n dialog: Dialog | ForumTopic.forumTopic,\n indexKey: ReturnType,\n index: number\n) {\n return (dialog as Dialog)[indexKey] = index;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {Chat, ForumTopic as MTForumTopic, DialogPeer, Message, MessageAction, MessageMedia, MessagesForumTopics, MessagesPeerDialogs, Update} from '../../layer';\nimport type {Dialog, ForumTopic, MyMessage} from '../appManagers/appMessagesManager';\nimport tsNow from '../../helpers/tsNow';\nimport SearchIndex from '../searchIndex';\nimport {SliceEnd} from '../../helpers/slicedArray';\nimport {MyDialogFilter} from './filters';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, NULL_PEER_ID, REAL_FOLDERS, REAL_FOLDER_ID} from '../mtproto/mtproto_config';\nimport {MaybePromise, NoneToVoidFunction} from '../../types';\nimport ctx from '../../environment/ctx';\nimport AppStorage from '../storage';\nimport type DATABASE_STATE from '../../config/databases/state';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport getServerMessageId from '../appManagers/utils/messageId/getServerMessageId';\nimport generateMessageId from '../appManagers/utils/messageId/generateMessageId';\nimport {AppManager} from '../appManagers/manager';\nimport getDialogIndexKey from '../appManagers/utils/dialogs/getDialogIndexKey';\nimport isObject from '../../helpers/object/isObject';\nimport getDialogIndex from '../appManagers/utils/dialogs/getDialogIndex';\nimport getPeerIdsFromMessage from '../appManagers/utils/messages/getPeerIdsFromMessage';\nimport {AppStoragesManager} from '../appManagers/appStoragesManager';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport setDialogIndex from '../appManagers/utils/dialogs/setDialogIndex';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\nimport {BroadcastEvents} from '../rootScope';\nimport assumeType from '../../helpers/assumeType';\nimport makeError from '../../helpers/makeError';\nimport callbackify from '../../helpers/callbackify';\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: (Dialog | ForumTopic)[],\n id: number,\n unreadMessagesCount: number,\n unreadPeerIds: Set,\n unreadUnmutedPeerIds: Set,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: REAL_FOLDER_ID = undefined;\n\n// let spentTime = 0;\nexport default class DialogsStorage extends AppManager {\n private storage: AppStoragesManager['storages']['dialogs'];\n\n private dialogs: {[peerId: PeerId]: Dialog};\n\n private folders: {[folderId: number]: Folder};\n\n private allDialogsLoaded: {[folder_id: number]: boolean};\n private dialogsOffsetDate: {[folder_id: number]: number};\n private pinnedOrders: {[folder_id: number]: PeerId[]};\n private dialogsNum: number;\n\n private dialogsIndex: SearchIndex;\n\n private cachedResults: {\n query: string,\n count: number,\n dialogs: Dialog[],\n folderId: number\n };\n\n private forumTopics: Map,\n deletedTopics: Set,\n getTopicPromises: Map>,\n getTopicsPromise?: Promise\n }>;\n\n protected after() {\n this.clear(true);\n\n this.rootScope.addEventListener('language_change', () => {\n const peerId = this.appUsersManager.getSelf().id.toPeerId(false);\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n });\n\n const onFilterUpdate = (filter: MyDialogFilter) => {\n const dialogs = this.getCachedDialogs(false);\n for(let i = 0; i < dialogs.length; ++i) {\n this.processDialogForFilter(dialogs[i], filter);\n }\n };\n\n this.rootScope.addEventListener('filter_order', () => {\n const dialogs = this.getCachedDialogs(false);\n // const indexKeys: ReturnType[] = [];\n for(const filterId in this.folders) {\n if(+filterId > 1) {\n delete this.folders[filterId];\n }\n\n // indexKeys.push(this.getDialogIndexKey(+filterId));\n }\n\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n // for(const indexKey of indexKeys) {\n // delete dialog[indexKey];\n // }\n\n this.processDialogForFilters(dialog);\n }\n });\n\n this.rootScope.addEventListener('filter_update', onFilterUpdate);\n this.rootScope.addEventListener('filter_new', onFilterUpdate);\n\n this.rootScope.addEventListener('filter_delete', (filter) => {\n const dialogs = this.getCachedDialogs(false);\n\n const indexKey = this.getDialogIndexKeyByFilterId(filter.id);\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n delete dialog[indexKey];\n }\n\n delete this.folders[filter.id];\n });\n\n this.rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.processChangedUnreadOrUnmuted(dialog.peerId);\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if((chat as Chat.chat).pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n this.rootScope.addEventListener('chat_toggle_forum', ({chatId, enabled}) => {\n const peerId = chatId.toPeerId(true);\n if(!enabled) {\n this.flushForumTopicsCache(peerId);\n }\n\n this.processChangedUnreadOrUnmuted(peerId);\n });\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updateChannelPinnedTopic: this.onUpdateChannelPinnedTopic,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs,\n\n updateChannelPinnedTopics: this.onUpdateChannelPinnedTopics\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('dialogs')\n ]).then(([state, {results: dialogs, storage}]) => {\n this.storage = storage;\n this.dialogs = this.storage.getCache();\n\n for(const folderId of REAL_FOLDERS) {\n const order = state.pinnedOrders[folderId];\n if(!order) {\n continue;\n }\n\n const _order = this.getPinnedOrders(folderId);\n _order.splice(0, _order.length, ...order);\n }\n\n if(dialogs.length) {\n AppStorage.freezeSaving(this.setDialogsFromState.bind(this, dialogs), ['chats', 'dialogs', 'messages', 'users']);\n }\n\n this.allDialogsLoaded = state.allDialogsLoaded || {};\n\n if(dialogs.length) {\n this.appDraftsManager.addMissedDialogs();\n }\n });\n }\n\n private setDialogsFromState(dialogs: Dialog[]) {\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n if(!dialog) {\n continue;\n }\n\n // if(dialog.peerId !== SERVICE_PEER_ID) {\n dialog.top_message = getServerMessageId(dialog.top_message); // * fix outgoing message to avoid copying dialog\n // }\n\n if(dialog.topMessage) {\n this.appMessagesManager.saveMessages([dialog.topMessage]);\n }\n\n for(let i = 0; i <= 21; ++i) {\n const indexKey: ReturnType = `index_${i}` as any;\n delete dialog[indexKey];\n }\n // delete dialog.indexes;\n\n this.saveDialog({\n dialog,\n ignoreOffsetDate: true\n });\n\n // ! WARNING, убрать это когда нужно будет делать чтобы pending сообщения сохранялись\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(!message) {\n this.appMessagesManager.reloadConversation(dialog.peerId);\n }\n }\n }\n\n public isDialogsLoaded(folderId: number) {\n return !!this.allDialogsLoaded[folderId];\n }\n\n public setDialogsLoaded(folderId: number, loaded: boolean) {\n const isForum = this.isFilterIdForForum(folderId);\n\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[FOLDER_ID_ALL] = loaded;\n this.allDialogsLoaded[FOLDER_ID_ARCHIVE] = loaded;\n } else {\n if(isForum) {\n defineNotNumerableProperties(this.allDialogsLoaded, [folderId]);\n }\n\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(isForum) {\n return;\n }\n\n if(Array.from(REAL_FOLDERS).every((folderId) => this.allDialogsLoaded[folderId])) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.saveAllDialogsLoaded();\n }\n\n private saveAllDialogsLoaded() {\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear = (init = false) => {\n if(!init) {\n this.storage.clear();\n\n this.allDialogsLoaded = {};\n this.saveAllDialogsLoaded();\n\n // * clear not numerable properties\n this.pinnedOrders = Object.assign({}, this.pinnedOrders);\n for(const folderId of REAL_FOLDERS) {\n this.resetPinnedOrder(folderId);\n }\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n this.pinnedOrders = {};\n for(const folderId of REAL_FOLDERS) {\n this.pinnedOrders[folderId] = [];\n }\n }\n\n this.forumTopics = new Map();\n this.folders = {};\n this.dialogsOffsetDate = {};\n this.dialogsNum = 0;\n this.dialogsIndex = new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n this.cachedResults = {\n query: '',\n count: 0,\n dialogs: [],\n folderId: 0\n };\n };\n\n public handleDialogUnpinning(dialog: Dialog | ForumTopic, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.getPinnedOrders(folderId), this.isFilterIdForForum(folderId) ? (dialog as ForumTopic).id : dialog.peerId);\n this.savePinnedOrders();\n }\n\n public savePinnedOrders() {\n this.appStateManager.pushToState('pinnedOrders', this.pinnedOrders);\n }\n\n public resetPinnedOrder(folderId: number) {\n this.getPinnedOrders(folderId).length = 0;\n }\n\n public getPinnedOrders(folderId: number) {\n let orders = this.pinnedOrders[folderId];\n if(!orders && this.isFilterIdForForum(folderId)) {\n defineNotNumerableProperties(this.pinnedOrders, [folderId]);\n orders = this.pinnedOrders[folderId] = [];\n }\n\n return orders;\n }\n\n public isDialogPinned(peerId: PeerId, folderId: number) {\n const filter = this.filtersStorage.getFilter(folderId);\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(peerId) !== -1;\n } else {\n isPinned = !!this.getDialogOnly(peerId).pFlags.pinned;\n }\n\n return isPinned;\n }\n\n public getOffsetDate(folderId: number): number {\n const offsetDate = this.dialogsOffsetDate[folderId] || 0;\n if(folderId === GLOBAL_FOLDER_ID && !offsetDate) { // make request not from beginning if we have loaded some dialogs\n return Math.min(...Array.from(REAL_FOLDERS).sort((a, b) => a - b));\n }\n\n return offsetDate;\n }\n\n private generateFolder(id: number) {\n const folder: Folder = {\n dialogs: [],\n id,\n unreadMessagesCount: 0,\n unreadPeerIds: new Set(),\n unreadUnmutedPeerIds: new Set()\n };\n\n defineNotNumerableProperties(folder, ['dispatchUnreadTimeout']);\n\n return folder;\n }\n\n public getFolder(id: number) {\n return this.folders[id] ??= this.generateFolder(id);\n }\n\n public isFilterIdForForum(filterId: number) {\n return filterId && filterId < 0;\n }\n\n public getFilterIdForForum(forumTopic: ForumTopic) {\n return forumTopic.peerId;\n }\n\n public getDialogKey(dialog: Dialog | ForumTopic) {\n return this.isTopic(dialog) ? dialog.id : dialog.peerId;\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Folder['dialogs'] {\n if(id === GLOBAL_FOLDER_ID) { // * it won't be sorted\n return this.getCachedDialogs(skipMigrated);\n }\n\n const folder = this.getFolder(id);\n if(this.isFilterIdForForum(id)) {\n return skipMigrated ? folder.dialogs.filter((forumTopic) => !(forumTopic as ForumTopic).pFlags.hidden) : folder.dialogs;\n }\n\n return skipMigrated ? folder.dialogs.filter((dialog) => (dialog as Dialog).migratedTo === undefined) : folder.dialogs;\n }\n\n public getNextDialog(currentPeerId: PeerId, next: boolean, filterId: number) {\n const folder = this.getFolderDialogs(filterId, true);\n let dialog: Folder['dialogs'][0];\n if(!currentPeerId) {\n if(next) {\n dialog = folder[0];\n }\n } else {\n const idx = folder.findIndex((dialog) => dialog.peerId === currentPeerId);\n if(idx !== -1) {\n const nextIndex = next ? idx + 1 : idx - 1;\n dialog = folder[nextIndex];\n }\n }\n\n return dialog;\n }\n\n public getDialogIndexKeyByFilterId(filterId: number) {\n if(this.isFilterIdForForum(filterId)) return getDialogIndexKey();\n if(REAL_FOLDERS.has(filterId)) return getDialogIndexKey(filterId as REAL_FOLDER_ID);\n const filter = this.filtersStorage.getFilter(filterId);\n return getDialogIndexKey(filter.localId);\n }\n\n private isDialogUnmuted(dialog: Dialog | ForumTopic) {\n return !this.appNotificationsManager.isPeerLocalMuted({\n peerId: dialog.peerId,\n respectType: true,\n threadId: this.isTopic(dialog) ? (dialog as ForumTopic).id : undefined\n });\n }\n\n public getFolderUnreadCount(filterId: number) {\n const folder = this.getFolder(filterId);\n return {unreadUnmutedCount: folder.unreadUnmutedPeerIds.size, unreadCount: folder.unreadPeerIds.size};\n }\n\n public getCachedDialogs(skipMigrated?: boolean) {\n const arrays = Array.from(REAL_FOLDERS).map((folderId) => this.getFolderDialogs(folderId, skipMigrated));\n return [].concat(...arrays) as Dialog[];\n }\n\n private setDialogIndexInFilter(\n dialog: Dialog | ForumTopic,\n indexKey: ReturnType,\n filter?: MyDialogFilter\n ) {\n // if(this.isTopic(dialog)) {\n // return dialog['index_0'];\n // }\n\n let index: number;\n\n const isTopic = this.isTopic(dialog);\n const isRealFolder = isTopic || REAL_FOLDERS.has(filter.id);\n /* if(isRealFolder) {\n // index = getDialogIndex(dialog, indexKey);\n index = this.generateIndexForDialog(dialog, true);\n } else */if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIds = isTopic ?\n this.getPinnedOrders(this.getFilterIdForForum(dialog)) :\n filter.pinnedPeerIds;\n\n const pinnedKey = this.getDialogKey(dialog);\n const pinnedIndex = pinnedIds.indexOf(pinnedKey);\n\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(pinnedIds.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned || isRealFolder) {\n index = this.generateIndexForDialog(dialog, true, undefined, !isRealFolder);\n } else {\n index = getDialogIndex(dialog) ?? this.generateIndexForDialog(dialog, true);\n }\n }\n\n // if(!dialog.hasOwnProperty(indexKey)) {\n // defineNotNumerableProperties(dialog, [indexKey]);\n // }\n\n return setDialogIndex(dialog, indexKey, index);\n }\n\n public getDialog(peerId: PeerId, folderId?: number, topicId?: number, skipMigrated = true): [Folder['dialogs'][0], number] | [] {\n const folders: Folder['dialogs'][] = [];\n\n if(topicId) {\n folderId = peerId;\n // skipMigrated = false;\n }\n\n if(folderId === undefined) {\n folders.push(...Array.from(REAL_FOLDERS).map((folderId) => this.getFolder(folderId).dialogs as Dialog[]));\n } else {\n folders.push(this.getFolderDialogs(folderId, false) as Dialog[]);\n }\n\n const verify: (d: Folder['dialogs'][0]) => boolean = topicId ?\n (d) => (d as ForumTopic).id === topicId :\n (d) => (d as Dialog).peerId === peerId;\n for(const folder of folders) {\n let i = 0, skipped = 0;\n for(let length = folder.length; i < length; ++i) {\n const dialog = folder[i];\n if(verify(dialog)) {\n return [dialog, i - skipped];\n } else if(skipMigrated && ((dialog as ForumTopic).pFlags.hidden || (dialog as Dialog).migratedTo !== undefined)) {\n ++skipped;\n }\n }\n }\n\n return [];\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogs[peerId];\n }\n\n public getDialogOrTopic(peerId: PeerId, topicId?: number) {\n return topicId ? this.getForumTopic(peerId, topicId) : this.dialogs[peerId];\n }\n\n public getDialogIndex(\n peerId: PeerId | Parameters[0],\n indexKey: ReturnType,\n topicId?: number\n ) {\n const dialog = isObject(peerId) ? peerId : this.getDialogOrTopic(peerId, topicId);\n return getDialogIndex(dialog, indexKey);\n }\n\n /*\n var date = Date.now() / 1000 | 0;\n var m = date * 0x10000;\n\n var k = (date + 1) * 0x10000;\n k - m;\n 65536\n */\n public generateDialogIndex(date?: number, isPinned?: boolean) {\n date ??= tsNow(true) + this.timeManager.getServerTimeOffset();\n return (date * 0x10000) + (isPinned ? 0 : (++this.dialogsNum & 0xFFFF));\n }\n\n // public makeFilterForTopics(id: number): MyDialogFilter {\n // return {\n // _: 'dialogFilter',\n // id,\n\n // };\n // }\n\n public isTopic(dialog: Dialog | ForumTopic): dialog is ForumTopic {\n return 'id' in dialog;\n }\n\n public processDialogForFilters(dialog: Dialog | ForumTopic, noIndex?: boolean) {\n // let perf = performance.now();\n if(this.isTopic(dialog)) {\n this.processDialogForFilter(dialog, undefined, noIndex);\n return;\n }\n\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter, noIndex);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(\n dialog: Dialog | ForumTopic,\n filter?: MyDialogFilter,\n noIndex?: boolean\n ) {\n const isTopic = this.isTopic(dialog);\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : filter.id;\n\n const indexKey = isTopic ? 'index_0' : this.getDialogIndexKeyByFilterId(folderId);\n const folder = this.getFolder(folderId);\n const dialogs = folder.dialogs;\n\n const cmp: (d: typeof dialog) => boolean = isTopic ?\n ((d: ForumTopic) => d.id === dialog.id) as any :\n ((d: Dialog) => d.peerId === dialog.peerId) as any;\n const wasIndex = dialogs.findIndex(cmp);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = this.getDialogIndex(wasDialog, indexKey);\n\n if(noIndex && folderId > FOLDER_ID_ARCHIVE) {\n noIndex = undefined;\n }\n\n const newDialogIndex = noIndex ? undefined : this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return false;\n }\n\n if(!!wasDialogIndex !== !!newDialogIndex) {\n this.prepareFolderUnreadCountModifyingByDialog(folderId, dialog, !!newDialogIndex);\n }\n\n if(wasIndex !== -1) {\n dialogs.splice(wasIndex, 1);\n }\n\n if(newDialogIndex) {\n insertInDescendSortedArray(dialogs, dialog, (dialog) => this.getDialogIndex(dialog, indexKey), -1);\n }\n\n return true;\n }\n\n public prepareDialogUnreadCountModifying(dialog: Dialog | ForumTopic, toggle?: boolean) {\n const isTopic = this.isTopic(dialog);\n const callbacks: NoneToVoidFunction[] = [];\n\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : dialog.folder_id;\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(folderId, dialog, toggle));\n\n if(!isTopic) {\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog, toggle));\n }\n }\n }\n\n return () => !toggle && callbacks.forEach((callback) => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog | ForumTopic, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const wasUnmuted = this.isDialogUnmuted(dialog);\n\n if(toggle !== undefined) {\n const addMessagesCount = toggle ? wasUnreadCount : -wasUnreadCount;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!wasUnreadCount, wasUnreadCount && wasUnmuted, dialog);\n return;\n }\n\n return () => {\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const newUnmuted = this.isDialogUnmuted(dialog);\n\n const addMessagesCount = newUnreadCount - wasUnreadCount;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!newUnreadCount, newUnreadCount && newUnmuted, dialog);\n };\n }\n\n public modifyFolderUnreadCount(\n folderId: number,\n addMessagesCount: number,\n toggleDialog: boolean,\n toggleUnmuted: boolean,\n dialog: Dialog | ForumTopic\n ) {\n const {peerId} = dialog;\n const isForum = this.appPeersManager.isForum(peerId);\n const isTopic = this.isTopic(dialog);\n if(isForum && !isTopic) {\n const forumUnreadCount = this.getForumUnreadCount(peerId);\n if(forumUnreadCount instanceof Promise) {\n forumUnreadCount.then(({count, hasUnmuted}) => {\n dialog = this.getDialogOnly(peerId);\n const folder = this.getFolder(folderId);\n if(\n !dialog ||\n !this.appPeersManager.isForum(peerId) ||\n !folder ||\n !folder.dialogs.some((dialog) => dialog.peerId === peerId)\n ) {\n return;\n }\n\n this.modifyFolderUnreadCount(folderId, 0, false, false, dialog);\n });\n\n return;\n } else {\n addMessagesCount = 0;\n toggleDialog = forumUnreadCount.count > 0;\n toggleUnmuted = forumUnreadCount.hasUnmuted;\n }\n }\n\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n\n const key = this.getDialogKey(dialog);\n if(toggleDialog) {\n folder.unreadPeerIds.add(key);\n } else {\n folder.unreadPeerIds.delete(key);\n }\n\n if(toggleUnmuted) {\n folder.unreadUnmutedPeerIds.add(key);\n } else {\n folder.unreadUnmutedPeerIds.delete(key);\n }\n\n folder.dispatchUnreadTimeout ??= ctx.setTimeout(() => {\n folder.dispatchUnreadTimeout = undefined;\n const _folder = {...folder};\n delete _folder.dialogs;\n this.rootScope.dispatchEvent('folder_unread', _folder);\n\n if(isTopic) { // * refresh forum dialog unread count\n this.processChangedUnreadOrUnmuted(peerId);\n }\n }, 0);\n }\n\n public processChangedUnreadOrUnmuted(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n this.processDialogForFilters(dialog);\n this.prepareDialogUnreadCountModifying(dialog)();\n this.rootScope.dispatchEvent('dialog_unread', {\n peerId,\n dialog\n });\n }\n }\n\n public generateIndexForDialog(\n dialog: Dialog | ForumTopic,\n justReturn?: boolean,\n message?: MyMessage,\n noPinnedOrderUpdate?: boolean\n ) {\n if(!justReturn/* && !isTopic */) {\n return;\n }\n\n const isTopic = this.isTopic(dialog);\n let topDate = 0, isPinned: boolean;\n if((dialog as ForumTopic).pFlags.hidden) { // general topic must be first\n topDate = this.generateDialogPinnedDateByIndex(0xFFF);\n isPinned = true;\n } else if(dialog.pFlags.pinned && !noPinnedOrderUpdate) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n message ||= this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n\n topDate = (message as Message.message)?.date || topDate;\n\n if(!isTopic) {\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n }\n\n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n topDate ||= tsNow(true);\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n const indexKey = getDialogIndexKey((dialog as Dialog).folder_id);\n setDialogIndex(dialog, indexKey, index);\n }\n\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - потому что в папках может быть бесконечное число пиннедов\n }\n\n public generateDialogPinnedDate(dialog: Dialog | ForumTopic) {\n const isTopic = this.isTopic(dialog);\n const order = this.getPinnedOrders(isTopic ? this.getFilterIdForForum(dialog) : dialog.folder_id);\n\n const dialogKey = this.getDialogKey(dialog);\n let pinnedIndex = order.indexOf(dialogKey);\n if(pinnedIndex === -1) {\n order.unshift(dialogKey);\n pinnedIndex = 0;\n\n if(!isTopic) {\n this.savePinnedOrders();\n }\n }\n\n return this.generateDialogPinnedDateByIndex(order.length - 1 - pinnedIndex);\n }\n\n /* public generateDialog(peerId: PeerId) {\n const dialog: Dialog = {\n _: 'dialog',\n pFlags: {},\n peer: this.appPeersManager.getOutputPeer(peerId),\n top_message: 0,\n read_inbox_max_id: 0,\n read_outbox_max_id: 0,\n unread_count: 0,\n unread_mentions_count: 0,\n notify_settings: {\n _: 'peerNotifySettings',\n },\n };\n\n return dialog;\n } */\n\n public setDialogToState(dialog: Dialog | ForumTopic) {\n if(this.isTopic(dialog)) {\n return;\n }\n\n const {peerId, pts} = dialog;\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const messagesStorage = this.appMessagesManager.getHistoryMessagesStorage(peerId);\n const history = historyStorage.history.slice;\n let incomingMessage: MyMessage;\n for(let i = 0, length = history.length; i < length; ++i) {\n const mid = history[i];\n const message: MyMessage = this.appMessagesManager.getMessageFromStorage(messagesStorage, mid);\n if(message && !message.pFlags.is_outgoing/* || peerId === SERVICE_PEER_ID */) {\n incomingMessage = message;\n\n const peerIds = getPeerIdsFromMessage(message);\n this.peersStorage.requestPeersForKey(peerIds, `topMessage_${peerId}`);\n\n break;\n }\n }\n\n dialog.topMessage = incomingMessage;\n\n // DO NOT TOUCH THESE LINES, SOME REAL MAGIC HERE.\n // * Read service chat when refreshing page with outgoing & getting new service outgoing message\n /* if(incomingMessage && dialog.read_inbox_max_id >= dialog.top_message) {\n dialog.unread_count = 0;\n }\n\n dialog.read_inbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_outbox_max_id); */\n // CAN TOUCH NOW\n\n if(peerId.isAnyChat() && pts) {\n const newPts = this.apiUpdatesManager.getChannelState(peerId.toChatId(), pts).pts;\n dialog.pts = newPts;\n }\n\n this.storage.set({\n [peerId]: dialog\n });\n\n this.peersStorage.requestPeer(peerId, 'dialog');\n\n /* for(let id in this.filtersStorage.filters) {\n const filter = this.filtersStorage.filters[id];\n\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n\n }\n } */\n }\n\n public pushDialog({dialog, offsetDate, ignoreOffsetDate, saveGlobalOffset}: {\n dialog: Dialog | ForumTopic,\n offsetDate?: number,\n ignoreOffsetDate?: boolean,\n saveGlobalOffset?: boolean\n }) {\n const isTopic = this.isTopic(dialog);\n const {folder_id, peerId} = dialog as Dialog;\n\n if(isTopic) {\n const forumTopics = this.getForumTopicsCache(peerId);\n forumTopics.topics.set(dialog.id, dialog);\n } else {\n this.dialogs[peerId] = dialog;\n }\n\n offsetDate ??= this.getDialogOffsetDate(dialog);\n\n // if(!isTopic) {\n this.processDialogForFilters(dialog);\n // }\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(!isTopic && saveGlobalOffset) {\n const savedGlobalOffsetDate = this.dialogsOffsetDate[GLOBAL_FOLDER_ID];\n if(!savedGlobalOffsetDate || offsetDate < savedGlobalOffsetDate) {\n this.dialogsOffsetDate[GLOBAL_FOLDER_ID] = offsetDate;\n }\n }\n\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : folder_id;\n const savedOffsetDate = this.dialogsOffsetDate[folderId];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folderId)) {\n this.dropDialog(peerId, isTopic ? this.getDialogKey(dialog) : undefined, true);\n return;\n }\n\n this.dialogsOffsetDate[folderId] = offsetDate;\n }\n }\n\n this.setDialogToState(dialog);\n\n // if(pos === -1) {\n // this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\n // }\n\n // const indexKey = getDialogIndexKey(folder_id);\n // /* const newPos = */insertInDescendSortedArray(dialogs, dialog, (dialog) => getDialogIndex(dialog, indexKey), -1);\n /* if(pos !== -1 && pos !== newPos) {\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\n } */\n }\n\n public dropDialogFromFolders(peerId: PeerId, topicId?: number) {\n const foundDialog = this.getDialog(peerId, undefined, topicId, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n const filterId = topicId ?\n this.getFilterIdForForum(dialog as ForumTopic) :\n (dialog as Dialog).folder_id;\n\n // const folder = this.getFolder(filterId);\n // folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.getPinnedOrders(filterId), this.getDialogKey(dialog)) !== undefined;\n\n this.processDialogForFilters(dialog, true);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n }\n\n return foundDialog;\n }\n\n public dropDialog(peerId: PeerId, topicId?: number, keepLocal?: boolean) {\n const dialog = this.getDialogOrTopic(peerId, topicId);\n const foundDialog = this.dropDialogFromFolders(peerId, topicId);\n if(dialog) {\n if(!keepLocal) {\n if(topicId) {\n this.getForumTopicsCache(peerId).topics.delete(topicId);\n } else {\n delete this.dialogs[peerId];\n }\n }\n\n this.clearDialogFromState(dialog, keepLocal);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog | ForumTopic, keepLocal: boolean) {\n if(dialog._ === 'forumTopic') {\n return;\n }\n\n const {peerId} = dialog;\n this.peersStorage.requestPeersForKey([], `topMessage_${peerId}`);\n this.peersStorage.releasePeer(peerId, 'dialog');\n this.storage.delete(peerId, keepLocal);\n }\n\n public dropDialogWithEvent(peerId: PeerId, topicId?: number) {\n const dropped = this.dropDialog(peerId, topicId);\n if(dropped.length) {\n this.rootScope.dispatchEvent('dialog_drop', dropped[0]);\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId, topicId?: number) {\n this.dropDialogWithEvent(peerId, topicId);\n this.rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(result: MessagesPeerDialogs | MessagesForumTopics, peerId?: PeerId) {\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\n\n const isForum = result._ === 'messages.forumTopics';\n const items = (result as MessagesPeerDialogs).dialogs || (result as MessagesForumTopics).topics;\n if(!isForum) {\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(result.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n result.dialogs.splice(idx, 1);\n }\n });\n } else {\n this.processTopics(peerId, result);\n }\n\n assumeType(items);\n\n this.appUsersManager.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n this.appMessagesManager.saveMessages(result.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const getUpdateCache = (peerId: PeerId) => {\n let cache = updatedDialogs.get(peerId);\n if(!cache) {\n updatedDialogs.set(peerId, cache = {});\n }\n\n return cache;\n };\n\n items.forEach((dialog) => {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n let topMid = dialog.top_message;\n\n const topPendingMid = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMid) {\n const topPendingMessage = this.appMessagesManager.getMessageByPeer(peerId, topPendingMid) as MyMessage;\n const topMessage = this.appMessagesManager.getMessageByPeer(peerId, topMid) as MyMessage;\n if(!topMid || (topPendingMessage && (!topMessage || topPendingMessage?.date > topMessage?.date))) {\n dialog.top_message = topMid = topPendingMid;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMid;\n }\n }\n\n /* const d = Object.assign({}, dialog);\n if(peerId === 239602833) {\n this.log.error('applyConversation lun', dialog, d);\n } */\n\n if(topMid || dialog.draft?._ === 'draftMessage') {\n if(this.saveDialog({dialog})) {\n const cache = getUpdateCache(peerId);\n\n if(isForum) {\n (cache.topics ??= new Map()).set(\n (dialog as ForumTopic).id,\n dialog as ForumTopic\n );\n } else {\n cache.dialog = dialog as Dialog;\n }\n }\n } else {\n this.dropDialogWithEvent(peerId, isForum ? this.getDialogKey(dialog) : undefined);\n }\n\n const key = this.appMessagesManager.getUpdateAfterReloadKey(peerId, isForum ? this.getDialogKey(dialog) : undefined);\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[key];\n if(updates !== undefined) {\n for(const update of updates) {\n updates.delete(update);\n this.apiUpdatesManager.saveUpdate(update);\n }\n\n if(!updates.size) {\n delete this.appMessagesManager.newUpdatesAfterReloadToHandle[key];\n }\n }\n });\n\n if(updatedDialogs.size) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n private getDialogOffsetDate(dialog: Dialog | ForumTopic) {\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n return message?.date || 0;\n }\n\n public canSaveDialogByPeerId(peerId: PeerId) {\n if(peerId.isAnyChat()) {\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\n // ! chatForbidden stays for chat where you're kicked\n if(\n chat._ === 'channelForbidden' ||\n // || chat._ === 'chatForbidden'\n (chat as Chat.chat).pFlags.left\n // || (chat as any).pFlags.kicked\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog({\n dialog,\n folderId,\n ignoreOffsetDate,\n saveGlobalOffset\n }: {\n dialog: Dialog | ForumTopic,\n folderId?: REAL_FOLDER_ID,\n ignoreOffsetDate?: boolean,\n saveGlobalOffset?: boolean\n }) {\n const isTopic = this.isTopic(dialog);\n const isDialog = !isTopic;\n\n const topicId = isTopic ? dialog.id = generateMessageId(dialog.id) : undefined;\n if(!isTopic) {\n folderId ??= dialog.folder_id ?? FOLDER_ID_ALL;\n }\n\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return false;\n }\n\n if(!isTopic && dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n\n if(isDialog && !this.canSaveDialogByPeerId(peerId)) {\n return false;\n }\n\n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\n if(isDialog) {\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n\n const wasDialogBefore = this.getDialogOrTopic(peerId, topicId);\n\n let mid: number, message: MyMessage;\n if(dialog.top_message) {\n mid = generateMessageId(dialog.top_message);// dialog.top_message;\n\n // preserve outgoing message\n const wasTopMessage = wasDialogBefore?.top_message && this.appMessagesManager.getMessageByPeer(peerId, wasDialogBefore.top_message) as MyMessage;\n if(wasTopMessage?.pFlags?.is_outgoing && wasDialogBefore.top_message >= mid) {\n mid = wasDialogBefore.top_message;\n }\n\n message = this.appMessagesManager.getMessageByPeer(peerId, mid);\n } else {\n mid = this.appMessagesManager.generateTempMessageId(peerId);\n message = {\n _: 'message',\n id: mid,\n mid,\n from_id: this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(false)),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n deleted: true,\n pFlags: {out: true},\n date: 0,\n message: ''\n };\n this.appMessagesManager.saveMessages([message], {isOutgoing: true});\n }\n\n if(!message?.pFlags) {\n this.appMessagesManager.log.error('saveConversation no message:', dialog, message);\n }\n\n if(isDialog && !channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\n const migratedToPeer = this.appPeersManager.getPeerId(chat.migrated_to);\n this.appMessagesManager.migratedFromTo[peerId] = migratedToPeer;\n this.appMessagesManager.migratedToFrom[migratedToPeer] = peerId;\n dialog.migratedTo = migratedToPeer;\n // return;\n }\n }\n\n dialog.top_message = mid;\n // dialog.unread_count = wasDialogBefore && dialog.read_inbox_max_id === getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\n dialog.read_inbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\n\n if(isDialog && dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\n dialog.folder_id = wasDialogBefore ? (wasDialogBefore as typeof dialog).folder_id : folderId;\n }/* else if(dialog._ === 'dialogFolder') {\n dialog.folder_id = dialog.folder.id;\n } */\n }\n\n dialog.draft = this.appDraftsManager.saveDraft({peerId, threadId: topicId, draft: dialog.draft});\n dialog.peerId = peerId;\n // dialog.indexes ??= {} as any;\n\n // Because we saved message without dialog present\n if(message && message.pFlags.is_outgoing) {\n const isOut = message.pFlags.out;\n if(mid > dialog[isOut ? 'read_outbox_max_id' : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n\n if(!dialog.unread_count && !isOut) {\n ++dialog.unread_count;\n }\n } else {\n delete message.pFlags.unread;\n }\n }\n\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId, topicId);\n const slice = historyStorage.history.slice;\n /* if(historyStorage === undefined) { // warning\n historyStorage.history.push(mid);\n } else */if(!slice.length) {\n historyStorage.history.unshift(mid);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n } else if(!slice.isEnd(SliceEnd.Bottom)) { // * this will probably never happen, however, if it does, then it will fix slice with top_message\n const slice = historyStorage.history.insertSlice([mid]);\n slice.setEnd(SliceEnd.Bottom);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n historyStorage.maxId = mid;\n historyStorage.readMaxId = dialog.read_inbox_max_id;\n historyStorage.readOutboxMaxId = dialog.read_outbox_max_id;\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n threadId: isTopic ? dialog.id : undefined,\n settings: dialog.notify_settings\n });\n\n if(isDialog && channelId && dialog.pts) {\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\n }\n\n this.generateIndexForDialog(dialog);\n\n if(wasDialogBefore) {\n // fix unread count\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(wasDialogBefore);\n safeReplaceObject(wasDialogBefore, dialog);\n releaseUnreadCount();\n }\n\n this.pushDialog({\n dialog,\n offsetDate: message?.date,\n ignoreOffsetDate,\n saveGlobalOffset\n });\n\n if(isTopic) {\n this.processTopicUpdate(dialog, wasDialogBefore as ForumTopic);\n }\n\n return true;\n }\n\n public processTopicUpdate(topic: ForumTopic, oldTopic?: ForumTopic) {\n if(!oldTopic) {\n return;\n }\n\n const {peerId, id: threadId} = topic;\n const isIconChanged = topic.icon_emoji_id !== (oldTopic as ForumTopic).icon_emoji_id;\n const isTitleChanged = topic.title !== (oldTopic as ForumTopic).title;\n const isChanged = isIconChanged || isTitleChanged;\n\n if(isIconChanged) {\n this.rootScope.dispatchEvent('avatar_update', {peerId, threadId});\n }\n\n if(isChanged) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId, threadId});\n }\n }\n\n public getDialogs(options: {\n query?: string,\n offsetIndex?: number,\n limit?: number,\n filterId?: number,\n skipMigrated?: boolean\n }): MaybePromise<{\n dialogs: Folder['dialogs'],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }> {\n const {\n query = '',\n offsetIndex,\n limit = 20,\n filterId = FOLDER_ID_ALL,\n skipMigrated = false\n } = options;\n\n const isForum = this.isFilterIdForForum(filterId);\n if(!isForum && !REAL_FOLDERS.has(filterId)) {\n const promises: Promise[] = [];\n\n const fillContactsResult = this.appUsersManager.fillContacts();\n if(!fillContactsResult.cached) {\n promises.push(fillContactsResult.promise);\n }\n\n const reloadMissingDialogsPromise = this.filtersStorage.reloadMissingPeerIds(filterId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n return Promise.all(promises).then(() => {\n return this.getDialogs(options);\n });\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId/* : REAL_FOLDER_ID */ =\n (!REAL_FOLDERS.has(filterId) || this.getOffsetDate(filterId)) && !isForum ?\n GLOBAL_FOLDER_ID :\n filterId/* as REAL_FOLDER_ID */;\n let curDialogStorage = this.getFolderDialogs(filterId, skipMigrated);\n\n const indexKey = this.getDialogIndexKeyByFilterId(filterId);\n\n if(query && !isForum) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== filterId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = filterId;\n\n const results = this.dialogsIndex.search(query);\n\n const dialogs: Dialog[] = [];\n for(const peerId in this.dialogs) {\n const dialog = this.dialogs[peerId];\n if(results.has(dialog.peerId) && dialog.folder_id === filterId) {\n dialogs.push(dialog);\n }\n }\n\n dialogs.sort((d1, d2) => this.getDialogIndex(d2, indexKey) - this.getDialogIndex(d1, indexKey));\n this.cachedResults.dialogs = dialogs;\n this.cachedResults.count = dialogs.length;\n }\n\n curDialogStorage = this.cachedResults.dialogs;\n } else {\n this.cachedResults.query = '';\n }\n\n let offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\n break;\n }\n }\n }\n\n const loadedAll = this.isDialogsLoaded(realFolderId);\n const isEnoughDialogs = curDialogStorage.length >= (offset + limit);\n if(query || loadedAll || isEnoughDialogs) {\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: loadedAll ? curDialogStorage.length : null,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\n };\n }\n\n return this.appMessagesManager.getTopMessages({limit, folderId: realFolderId}).then((result) => {\n // const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(filterId, skipMigrated);\n }\n\n offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\n break;\n }\n }\n }\n\n // this.log.warn(offset, offset + limit, curDialogStorage.dialogs.length, this.dialogs.length);\n\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: result.count === undefined ? curDialogStorage.length : result.count,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\n isEnd: result.isEnd\n };\n });\n }\n\n // * FORUMS SECTION\n\n public flushForumTopicsCache(peerId: PeerId) {\n const cache = this.forumTopics.get(peerId);\n if(!cache) {\n return;\n }\n\n const folder = this.folders[peerId];\n if(folder) {\n if(folder.dispatchUnreadTimeout) {\n clearTimeout(folder.dispatchUnreadTimeout);\n }\n\n delete this.allDialogsLoaded[peerId];\n delete this.pinnedOrders[peerId];\n delete this.dialogsOffsetDate[peerId];\n delete this.folders[peerId];\n }\n\n cache.topics.clear();\n\n // for permanent delete\n // this.forumTopics.delete(peerId);\n }\n\n public getForumTopicsCache(peerId: PeerId) {\n let forumTopics = this.forumTopics.get(peerId);\n if(!forumTopics) {\n forumTopics = {\n topics: new Map(),\n deletedTopics: new Set(),\n getTopicPromises: new Map()\n };\n\n this.forumTopics.set(peerId, forumTopics);\n }\n\n return forumTopics;\n }\n\n public getForumTopicById(peerId: PeerId, topicId?: number): Promise {\n if(!this.appPeersManager.isForum(peerId)) {\n return Promise.reject(makeError('CHANNEL_FORUM_MISSING'));\n }\n\n const cache = this.getForumTopicsCache(peerId);\n let promise: CancellablePromise;\n if(topicId) {\n promise = cache.getTopicPromises.get(topicId);\n if(promise) {\n return promise;\n }\n\n if(cache.deletedTopics.has(topicId)) {\n return Promise.resolve(undefined);\n }\n\n cache.getTopicPromises.set(topicId, promise = deferredPromise());\n }\n\n cache.getTopicsPromise ??= pause(0).then(() => {\n const promises: {[topicId: number]: typeof promise} = {};\n const ids: number[] = [];\n for(const [topicId, promise] of cache.getTopicPromises) {\n promises[topicId] = promise;\n ids.push(getServerMessageId(topicId));\n }\n\n cache.getTopicPromises.clear();\n\n const fullfillLeft = () => {\n for(const topicId in promises) {\n promises[topicId].resolve(undefined);\n cache.deletedTopics.add(+topicId);\n }\n };\n\n if(this.getForumTopicsCache(peerId) !== cache) {\n fullfillLeft();\n return;\n }\n\n return this.apiManager.invokeApi('channels.getForumTopicsByID', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n topics: ids\n }).then((messagesForumTopics) => {\n if(this.getForumTopicsCache(peerId) !== cache) {\n return;\n }\n\n this.applyDialogs(messagesForumTopics, peerId);\n\n messagesForumTopics.topics.forEach((forumTopic) => {\n if(forumTopic._ === 'forumTopic') {\n promises[forumTopic.id].resolve(forumTopic);\n delete promises[peerId];\n }\n });\n\n return messagesForumTopics;\n }, () => {}).then(() => {\n fullfillLeft();\n\n cache.getTopicsPromise = undefined;\n if(cache.getTopicPromises.size) {\n this.getForumTopicById(peerId);\n }\n });\n });\n\n return promise || cache.getTopicsPromise;\n }\n\n // public getForumTopicById(peerId: PeerId, topicId: number) {\n // return this.getForumTopicsByID(peerId, topicId).then((result) => result.topics[0]);\n // }\n\n public getForumTopic(peerId: PeerId, topicId: number) {\n const forumTopics = this.forumTopics.get(peerId);\n return forumTopics?.topics?.get(topicId);\n }\n\n public getForumTopicOrReload(peerId: PeerId, topicId: number) {\n const forumTopic = this.getForumTopic(peerId, topicId);\n if(forumTopic) {\n return forumTopic;\n }\n\n const cache = this.getForumTopicsCache(peerId);\n return cache?.deletedTopics?.has(topicId) ? undefined : this.getForumTopicById(peerId, topicId);\n }\n\n public processTopics>(peerId: PeerId, result: T) {\n return callbackify(result, (result) => {\n if('pts' in result) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), result.pts);\n }\n\n const peer = this.appPeersManager.getOutputPeer(peerId);\n result.topics = result.topics.map((topic) => {\n if(topic._ === 'forumTopicDeleted') {\n return;\n }\n\n (topic as ForumTopic).peer = peer;\n topic.id = generateMessageId(topic.id);\n return topic;\n }).filter(Boolean);\n\n return result;\n });\n }\n\n public processTopicsPromise[1]>>(peerId: PeerId, promise: T): T {\n return promise.then((result) => {\n this.processTopics(peerId, result);\n return result;\n }) as any;\n }\n\n public getForumUnreadCount(peerId: PeerId) {\n if(!this.appPeersManager.isForum(peerId)) {\n return;\n }\n\n const folder = this.getFolder(peerId);\n\n const f = folder.dialogs.length >= 20 || this.isDialogsLoaded(peerId) ?\n folder.dialogs.slice(0, 20) :\n callbackify(this.getDialogs({filterId: peerId, limit: 20}), (result) => {\n return result.dialogs;\n });\n\n return callbackify(f, (dialogs) => {\n return {\n count: dialogs.reduce((acc, v) => acc + +!!v.unread_count, 0),\n hasUnmuted: dialogs.some((dialog) => dialog.unread_count && this.isDialogUnmuted(dialog))\n };\n });\n }\n\n // * FORUMS SECTION END\n\n private handleDialogTogglePinned(dialog: Dialog | ForumTopic, pinned: boolean, folderId: number) {\n if(dialog) {\n if(!pinned) {\n this.handleDialogUnpinning(dialog, folderId);\n } else { // means set\n dialog.pFlags.pinned = true;\n }\n\n this.generateIndexForDialog(dialog);\n }\n\n this.appMessagesManager.scheduleHandleNewDialogs(dialog.peerId, dialog);\n }\n\n private handleDialogsPinned(folderId: number, order: (Dialog['peerId'] | ForumTopic['id'])[]) {\n const isForum = this.isFilterIdForForum(folderId);\n this.resetPinnedOrder(folderId);\n this.getPinnedOrders(folderId).push(...order);\n this.savePinnedOrders();\n order.reverse(); // index must be higher\n const newPinned: {[id: typeof order[0]]: true} = {};\n order.forEach((id) => {\n newPinned[id] = true;\n\n const peerId = isForum ? folderId : id;\n const topicId = isForum ? id : undefined;\n\n const dialog = this.getDialogOrTopic(peerId, topicId);\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n if(!dialog) {\n return;\n }\n\n dialog.pFlags.pinned = true;\n this.generateIndexForDialog(dialog);\n });\n\n const dialogs = this.getFolderDialogs(folderId, false);\n for(const dialog of dialogs) {\n if(!dialog.pFlags.pinned) {\n break;\n }\n\n if(!newPinned[this.getDialogKey(dialog)]) {\n delete dialog.pFlags.pinned;\n this.generateIndexForDialog(dialog);\n this.appMessagesManager.scheduleHandleNewDialogs(dialog.peerId, dialog);\n }\n }\n }\n\n // only 0 and 1 folders\n private onUpdateFolderPeers = (update: Update.updateFolderPeers) => {\n // this.log('updateFolderPeers', update);\n const peers = update.folder_peers;\n\n peers.forEach((folderPeer) => {\n const {folder_id, peer} = folderPeer;\n\n const peerId = this.appPeersManager.getPeerId(peer);\n const dialog = this.dropDialog(peerId)[0];\n if(dialog) {\n if(dialog.pFlags?.pinned) {\n this.handleDialogUnpinning(dialog, folder_id);\n }\n\n (dialog as Dialog).folder_id = folder_id as REAL_FOLDER_ID;\n this.generateIndexForDialog(dialog);\n this.pushDialog({dialog}); // need for simultaneously updatePinnedDialogs\n }\n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n });\n };\n\n private onUpdateDialogPinned = (update: Update.updateDialogPinned) => {\n const folderId = update.folder_id ?? FOLDER_ID_ALL;\n // this.log('updateDialogPinned', update);\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n // этот код внизу никогда не сработает, в папках за пиннед отвечает updateDialogFilter\n /* if(update.folder_id > 1) {\n const filter = this.filtersStorage.filters[update.folder_id];\n if(update.pFlags.pinned) {\n filter.pinned_peers.unshift(peerId);\n } else {\n filter.pinned_peers.findAndSplice((p) => p === peerId);\n }\n } */\n\n this.handleDialogTogglePinned(dialog, update.pFlags.pinned, folderId);\n };\n\n private onUpdateChannelPinnedTopic = (update: Update.updateChannelPinnedTopic) => {\n const peerId = update.channel_id.toPeerId(true);\n const topicId = generateMessageId(update.topic_id);\n const topic = this.getForumTopic(peerId, topicId);\n if(!topic) {\n return;\n }\n\n this.handleDialogTogglePinned(topic, update.pFlags.pinned, this.getFilterIdForForum(topic));\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? FOLDER_ID_ALL;\n\n if(update.order) {\n this.handleDialogsPinned(folderId, update.order.map((peer) => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer)));\n } else {\n this.apiManager.invokeApi('messages.getPinnedDialogs', {\n folder_id: folderId\n }).then((dialogsResult) => {\n // * for test reordering and rendering\n // dialogsResult.dialogs.reverse();\n\n this.applyDialogs(dialogsResult);\n\n this.handleDialogsPinned(folderId, dialogsResult.dialogs.map((d) => d.peerId));\n });\n }\n };\n\n private onUpdateChannelPinnedTopics = async(update: Update.updateChannelPinnedTopics) => {\n const peerId = update.channel_id.toPeerId(true);\n const forumTopics = this.forumTopics.get(peerId);\n if(!forumTopics) {\n return;\n }\n\n const filterId = peerId;\n if(update.order) {\n const order = update.order.map((topicId) => generateMessageId(topicId));\n this.handleDialogsPinned(filterId, order);\n } else {\n const limit = await this.apiManager.getLimit('topicPin', true);\n\n const promise = this.apiManager.invokeApi('channels.getForumTopics', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n limit,\n offset_date: 0,\n offset_id: 0,\n offset_topic: 0\n });\n\n const result = await this.processTopics(peerId, promise);\n\n const topics = result.topics as ForumTopic[];\n const pinned = topics.filter((topic) => topic.pFlags.pinned);\n this.handleDialogsPinned(filterId, pinned.map((topic) => topic.id));\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {DialogFilter, ForumTopic, Update} from '../../layer';\nimport type {Dialog} from '../appManagers/appMessagesManager';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport copy from '../../helpers/object/copy';\nimport {AppManager} from '../appManagers/manager';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport assumeType from '../../helpers/assumeType';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS, REAL_FOLDER_ID, START_LOCAL_ID} from '../mtproto/mtproto_config';\nimport makeError from '../../helpers/makeError';\n\nexport type MyDialogFilter = DialogFilter.dialogFilter;\n\nconst convertment = [\n ['pinned_peers', 'pinnedPeerIds'],\n ['exclude_peers', 'excludePeerIds'],\n ['include_peers', 'includePeerIds']\n] as ['pinned_peers' | 'exclude_peers' | 'include_peers', 'pinnedPeerIds' | 'excludePeerIds' | 'includePeerIds'][];\n\nconst PREPENDED_FILTERS = REAL_FOLDERS.size;\n\nconst LOCAL_FILTER: MyDialogFilter = {\n _: 'dialogFilter',\n pFlags: {},\n flags: 0,\n id: 0,\n title: '',\n exclude_peers: [],\n include_peers: [],\n pinned_peers: [],\n excludePeerIds: [],\n includePeerIds: [],\n pinnedPeerIds: []\n};\n\nexport default class FiltersStorage extends AppManager {\n private filters: {[filterId: string]: MyDialogFilter};\n private filtersArr: Array;\n private localFilters: {[filterId: string]: MyDialogFilter};\n private localId: number;\n private reloadedPeerIds: Set;\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: this.onUpdateDialogFilters,\n\n updateDialogFilterOrder: this.onUpdateDialogFilterOrder\n });\n\n // delete peers when dialog is being dropped\n /* rootScope.addEventListener('peer_deleted', (peerId) => {\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n let modified = false;\n [filter.pinned_peers, filter.include_peers, filter.exclude_peers].forEach((arr) => {\n forEachReverse(arr, (inputPeer, idx) => {\n if(getPeerId(inputPeer) === peerId) {\n arr.splice(idx, 1);\n modified = true;\n }\n });\n });\n\n if(modified) {\n this.saveDialogFilter(filter, true);\n }\n }\n }); */\n\n this.rootScope.addEventListener('premium_toggle', () => {\n this.onUpdateDialogFilters({_: 'updateDialogFilters'});\n });\n\n return this.appStateManager.getState().then((state) => {\n const filtersArr = this.prependFilters(state.filtersArr);\n filtersArr.map((filter) => {\n this.saveDialogFilter(filter, false, true);\n });\n });\n }\n\n /**\n * ! use it only with saving\n */\n private prependFilters(filters: DialogFilter[]) {\n filters = filters.slice();\n\n const allChatsFilter = this.localFilters[FOLDER_ID_ALL];\n const archiveFilter = this.localFilters[FOLDER_ID_ARCHIVE];\n\n const allChatsFilterIndex = filters.findIndex((filter) => filter._ === 'dialogFilterDefault' || filter.id === FOLDER_ID_ALL);\n if(allChatsFilterIndex !== -1) filters[allChatsFilterIndex] = allChatsFilter;\n else filters.unshift(allChatsFilter);\n\n findAndSplice(filters, (filter) => (filter as MyDialogFilter).id === FOLDER_ID_ARCHIVE);\n filters.splice(/* 1 */filters[0] === allChatsFilter ? 1 : 0, 0, archiveFilter);\n\n this.localId = START_LOCAL_ID;\n filters.forEach((filter) => {\n delete filter.localId;\n });\n\n return filters;\n }\n\n private generateLocalFilter(id: REAL_FOLDER_ID) {\n const filter: MyDialogFilter = {...copy(LOCAL_FILTER), id};\n if(id === FOLDER_ID_ALL) {\n filter.pFlags.exclude_archived = true;\n } else if(id === FOLDER_ID_ARCHIVE) {\n filter.pFlags.exclude_unarchived = true;\n }\n\n if(REAL_FOLDERS.has(id)) {\n filter.pinnedPeerIds = this.dialogsStorage.getPinnedOrders(id);\n }\n\n return filter;\n }\n\n // private getLocalFilter(id: number) {\n // return this.filters[id] ??= this.generateLocalFilter(id);\n // }\n\n public clear = (init?: boolean) => {\n if(!init) {\n // safeReplaceObject(this.filters, {});\n this.reloadedPeerIds.clear();\n this.clearFilters();\n } else {\n this.filters = {};\n this.filtersArr = [];\n this.reloadedPeerIds = new Set();\n\n this.localFilters = {};\n for(const filterId of REAL_FOLDERS) {\n this.localFilters[filterId] = this.generateLocalFilter(filterId as REAL_FOLDER_ID);\n }\n }\n\n this.localId = START_LOCAL_ID;\n };\n\n private onUpdateDialogFilter = (update: Update.updateDialogFilter) => {\n if(update.filter) {\n this.saveDialogFilter(update.filter as any);\n } else if(this.filters[update.id]) { // Папка удалена\n // this.getDialogFilters(true);\n this.rootScope.dispatchEvent('filter_delete', this.filters[update.id]);\n delete this.filters[update.id];\n findAndSplice(this.filtersArr, (filter) => (filter as DialogFilter.dialogFilter).id === update.id);\n }\n\n this.pushToState();\n };\n\n private onUpdateDialogFilters = (update: Update.updateDialogFilters) => {\n // console.warn('updateDialogFilters', update);\n\n const oldFilters = copy(this.filters);\n\n this.getDialogFilters(true).then((filters) => {\n for(const _filterId in oldFilters) {\n const filterId = +_filterId;\n if(!filters.find((filter) => filter.id === filterId)) { // * deleted\n this.onUpdateDialogFilter({_: 'updateDialogFilter', id: filterId});\n }\n }\n\n this.onUpdateDialogFilterOrder({_: 'updateDialogFilterOrder', order: filters.map((filter) => filter.id)});\n });\n };\n\n private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n // console.log('updateDialogFilterOrder', update);\n\n const order = update.order.slice();\n if(!order.includes(FOLDER_ID_ARCHIVE)) {\n order.splice(order[0] === FOLDER_ID_ALL ? 1 : 0, 0, FOLDER_ID_ARCHIVE);\n }\n\n this.localId = START_LOCAL_ID;\n order.forEach((filterId) => {\n const filter = this.filters[filterId];\n delete filter.localId;\n this.setLocalId(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', order);\n\n this.pushToState();\n };\n\n private pushToState() {\n this.appStateManager.pushToState('filtersArr', this.filtersArr);\n }\n\n public testDialogForFilter(dialog: Dialog | ForumTopic.forumTopic, filter?: MyDialogFilter) {\n if(!filter) {\n return true;\n }\n\n if(REAL_FOLDERS.has(filter.id)) {\n return (dialog as Dialog).folder_id === filter.id && this.dialogsStorage.canSaveDialogByPeerId(dialog.peerId);\n }\n\n const peerId = dialog.peerId;\n\n // * check whether dialog exists\n if(!this.appMessagesManager.getDialogOnly(peerId)) {\n return false;\n }\n\n // exclude_peers\n if(filter.excludePeerIds.includes(peerId)) {\n return false;\n }\n\n // include_peers\n if(filter.includePeerIds.includes(peerId)) {\n return true;\n }\n\n const pFlags = filter.pFlags;\n\n // exclude_archived\n if(pFlags.exclude_archived && (dialog as Dialog).folder_id === FOLDER_ID_ARCHIVE) {\n return false;\n }\n\n // exclude_read\n if(pFlags.exclude_read && !this.appMessagesManager.isDialogUnread(dialog)) {\n return false;\n }\n\n // exclude_muted\n if(pFlags.exclude_muted && this.appNotificationsManager.isPeerLocalMuted({peerId}) && !(dialog.unread_mentions_count && dialog.unread_count)) {\n return false;\n }\n\n if(this.appPeersManager.isAnyChat(peerId)) {\n // broadcasts\n if(pFlags.broadcasts && this.appPeersManager.isBroadcast(peerId)) {\n return true;\n }\n\n // groups\n if(pFlags.groups && this.appPeersManager.isAnyGroup(peerId)) {\n return true;\n }\n } else {\n const userId = peerId.toUserId();\n\n // bots\n if(this.appUsersManager.isBot(userId)) {\n return !!pFlags.bots;\n }\n\n // non_contacts\n if(pFlags.non_contacts && !this.appUsersManager.isContact(userId)) {\n return true;\n }\n\n // contacts\n if(pFlags.contacts && this.appUsersManager.isContact(userId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public testDialogForFilterId(dialog: Dialog, filterId: number) {\n return this.testDialogForFilter(dialog, this.filters[filterId]);\n }\n\n public getFilter(filterId: number) {\n return this.filters[filterId];\n }\n\n public getFilters() {\n return this.filters;\n }\n\n public clearFilters() {\n const filters = this.getFilters();\n for(const filterId in filters) { // delete filters\n if(REAL_FOLDERS.has(+filterId)) {\n continue;\n }\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: +filterId\n });\n }\n }\n\n public async toggleDialogPin(peerId: PeerId, filterId: number) {\n const filter = this.filters[filterId];\n\n const index = filter.pinnedPeerIds.indexOf(peerId);\n const wasPinned = index !== -1;\n\n if(wasPinned) {\n filter.pinned_peers.splice(index, 1);\n filter.pinnedPeerIds.splice(index, 1);\n }\n\n if(!wasPinned) {\n if(filter.pinned_peers.length >= (await this.apiManager.getConfig()).pinned_infolder_count_max) {\n return Promise.reject(makeError('PINNED_DIALOGS_TOO_MUCH'));\n }\n\n filter.pinned_peers.unshift(this.appPeersManager.getInputPeerById(peerId));\n filter.pinnedPeerIds.unshift(peerId);\n }\n\n return this.updateDialogFilter(filter);\n }\n\n public createDialogFilter(filter: MyDialogFilter, prepend?: boolean) {\n const maxId = Math.max(1, ...Object.keys(this.filters).map((i) => +i));\n filter = copy(filter);\n filter.id = maxId + 1;\n return this.updateDialogFilter(filter, undefined, prepend);\n }\n\n public updateDialogFilter(filter: MyDialogFilter, remove = false, prepend = false) {\n const flags = remove ? 0 : 1;\n\n return this.apiManager.invokeApi('messages.updateDialogFilter', {\n flags,\n id: filter.id,\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\n }).then((bool) => { // возможно нужна проверка и откат, если результат не ТРУ\n // console.log('updateDialogFilter bool:', bool);\n\n /* if(!this.filters[filter.id]) {\n this.saveDialogFilter(filter);\n }\n\n rootScope.$broadcast('filter_update', filter); */\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: filter.id,\n filter: remove ? undefined : filter as any\n });\n\n if(prepend) {\n const f: MyDialogFilter[] = [];\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n ++filter.localId;\n f.push(filter);\n }\n\n filter.localId = START_LOCAL_ID;\n\n const order = f.sort((a, b) => a.localId - b.localId).map((filter) => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n });\n }\n\n public updateDialogFiltersOrder(order: number[]) {\n return this.apiManager.invokeApi('messages.updateDialogFiltersOrder', {\n order\n }).then(() => {\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n });\n }\n\n public getOutputDialogFilter(filter: MyDialogFilter) {\n const c = copy(filter);\n /* convertment.forEach(([from, to]) => {\n c[from] = c[to].map((peerId) => this.appPeersManager.getInputPeerById(peerId));\n }); */\n\n this.filterIncludedPinnedPeers(filter);\n\n return c;\n }\n\n private filterIncludedPinnedPeers(filter: MyDialogFilter) {\n forEachReverse(filter.includePeerIds, (peerId, idx) => {\n if(filter.pinnedPeerIds.includes(peerId)) {\n filter.include_peers.splice(idx, 1);\n filter.includePeerIds.splice(idx, 1);\n }\n });\n }\n\n // private spliceMissingPeerIds(filterId: number, type: ArgumentTypes[1], missingPeerIds: PeerId[]) {\n // const filter = this.getFilter(filterId);\n // const peers = filter && filter[type];\n // if(!peers?.length) {\n // return;\n // }\n\n // let spliced = false;\n // missingPeerIds.forEach((peerId) => {\n // const inputPeer = findAndSplice(peers, (inputPeer) => getPeerId(inputPeer) === peerId);\n // if(inputPeer) {\n // spliced = true;\n // }\n // });\n\n // if(spliced) {\n // this.onUpdateDialogFilter({\n // _: 'updateDialogFilter',\n // id: filterId,\n // filter\n // });\n // }\n // }\n\n public reloadMissingPeerIds(\n filterId: number,\n type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers'\n ) {\n const filter = this.getFilter(filterId);\n const peers = filter?.[type];\n if(!peers?.length) {\n return;\n }\n\n // const missingPeerIds: PeerId[] = [];\n const reloadDialogs = peers.filter((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const isAlreadyReloaded = this.reloadedPeerIds.has(peerId);\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\n // if(isAlreadyReloaded && !dialog) {\n // missingPeerIds.push(peerId);\n // }\n\n const reload = !isAlreadyReloaded && !dialog;\n return reload;\n });\n\n if(!reloadDialogs.length) {\n // if(missingPeerIds.length) {\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n // }\n\n return;\n }\n\n const reloadPromises = reloadDialogs.map((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer)\n .then((dialog) => {\n this.reloadedPeerIds.add(peerId);\n\n return dialog ? undefined : peerId;\n });\n\n return promise;\n });\n\n const reloadPromise = Promise.all(reloadPromises).then((missingPeerIds) => {\n missingPeerIds = missingPeerIds.filter(Boolean);\n if(!missingPeerIds.length) {\n return;\n }\n\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n });\n\n return reloadPromise;\n }\n\n public async getDialogFilters(overwrite = false): Promise {\n const keys = Object.keys(this.filters);\n if(keys.length > PREPENDED_FILTERS && !overwrite) {\n return keys.map((filterId) => this.filters[filterId]).sort((a, b) => a.localId - b.localId);\n }\n\n const filters = await this.apiManager.invokeApiSingle('messages.getDialogFilters');\n const prepended = this.prependFilters(filters);\n return prepended.map((filter) => this.saveDialogFilter(filter, overwrite)).filter(Boolean);\n }\n\n public getSuggestedDialogsFilters() {\n return this.apiManager.invokeApi('messages.getSuggestedDialogFilters');\n }\n\n public saveDialogFilter(filter: DialogFilter, update = true, silent?: boolean) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n if(filter._ === 'dialogFilterDefault') {\n filter = this.localFilters[FOLDER_ID_ALL];\n }\n\n assumeType(filter);\n if(!REAL_FOLDERS.has(filter.id)) {\n convertment.forEach(([from, to]) => {\n assumeType(filter);\n filter[to] = filter[from].map((peer) => this.appPeersManager.getPeerId(peer));\n });\n\n this.filterIncludedPinnedPeers(filter);\n\n filter.include_peers = filter.pinned_peers.concat(filter.include_peers);\n filter.includePeerIds = filter.pinnedPeerIds.concat(filter.includePeerIds);\n }\n\n const oldFilter = this.filters[filter.id];\n if(oldFilter) {\n Object.assign(oldFilter, filter);\n } else {\n this.filters[filter.id] = filter;\n }\n\n this.setLocalId(filter);\n\n if(!silent) {\n if(update) {\n this.rootScope.dispatchEvent('filter_update', filter);\n } else if(!oldFilter) {\n this.rootScope.dispatchEvent('filter_new', filter);\n }\n }\n\n return filter;\n }\n\n private setLocalId(filter: MyDialogFilter) {\n if(filter.localId !== undefined) {\n if(filter.localId >= this.localId) {\n this.localId = filter.localId + 1;\n }\n } else {\n filter.localId = this.localId++ as MyDialogFilter['localId'];\n findAndSplice(this.filtersArr, (_filter) => _filter.id === filter.id);\n this.filtersArr.push(filter);\n this.pushToState();\n }\n }\n\n public async isFilterIdAvailable(filterId: number) {\n if(REAL_FOLDERS.has(filterId)) {\n return true;\n }\n\n const limit = await this.apiManager.getLimit('folders');\n const isFolderAvailable = this.filtersArr.filter((filter) => !REAL_FOLDERS.has(filter.id)).slice(0, limit).some((filter) => filter.id === filterId);\n\n return isFolderAvailable;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function applyMixins(derivedCtor: any, constructors: any[]) {\n // const callbacks: Array<(...args: any[]) => any> = [];\n\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n const value: PropertyDescriptor = Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null);\n /* if(name === '_constructor') {\n callbacks.push(value.value);\n return;\n } else */if(name === 'constructor') {\n return;\n }\n\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n value\n );\n });\n });\n\n // if(callbacks.length) {\n // function c(...args: any[]): any {\n // callbacks.forEach((cb, idx) => {\n // // @ts-ignore\n // cb.apply(this, args[idx] || []);\n // });\n // };\n\n // Object.defineProperty(derivedCtor.prototype, 'superConstructor', {\n // configurable: true,\n // enumerable: true,\n // value: c,\n // writable: true\n // });\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport DEBUG from '../../config/debug';\nimport {ConstructorDeclMap, Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates} from '../../layer';\nimport {logger, LogTypes} from '../logger';\nimport assumeType from '../../helpers/assumeType';\nimport App from '../../config/app';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport {AppManager} from './manager';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport ctx from '../../environment/ctx';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport applyMixins from '../../helpers/applyMixins';\n\ntype UpdatesState = {\n pendingPtsUpdates: (Update & {pts: number, pts_count: number})[],\n pendingSeqUpdates?: {[seq: number]: {seq: number, date: number, updates: any[]}},\n syncPending: {\n seqAwaiting?: number,\n ptsAwaiting?: boolean,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: number,\n lastDifferenceTime?: number\n};\n\nconst SYNC_DELAY = 6;\n\nclass ApiUpdatesManager {\n public updatesState: UpdatesState = {\n pendingPtsUpdates: [],\n pendingSeqUpdates: {},\n syncPending: null,\n syncLoading: null\n };\n\n private channelStates: {[channelId: ChatId]: UpdatesState} = {};\n private attached = false;\n\n private log = logger('UPDATES', LogTypes.Error | LogTypes.Warn | LogTypes.Log/* | LogTypes.Debug */);\n private debug = DEBUG;\n\n private subscriptions: {[channelId: ChatId]: {count: number, interval?: number}} = {};\n\n constructor() {\n this._constructor(false);\n }\n\n private setProxy() {\n const self = this;\n this.updatesState = new Proxy(this.updatesState, {\n set: function(target: ApiUpdatesManager['updatesState'], key: keyof ApiUpdatesManager['updatesState'], value: ApiUpdatesManager['updatesState'][typeof key]) {\n // @ts-ignore\n target[key] = value;\n self.saveUpdatesState();\n return true;\n }\n });\n }\n\n public saveUpdatesState() {\n const us = this.updatesState;\n this.appStateManager.pushToState('updates', {\n seq: us.seq,\n pts: us.pts,\n date: us.date\n });\n }\n\n private popPendingSeqUpdate() {\n const state = this.updatesState;\n const nextSeq = state.seq + 1;\n const pendingUpdatesData = state.pendingSeqUpdates[nextSeq];\n if(!pendingUpdatesData) {\n return false;\n }\n\n const updates = pendingUpdatesData.updates;\n for(let i = 0, length = updates.length; i < length; ++i) {\n this.saveUpdate(updates[i]);\n }\n\n state.seq = pendingUpdatesData.seq;\n if(pendingUpdatesData.date && state.date < pendingUpdatesData.date) {\n state.date = pendingUpdatesData.date;\n }\n delete state.pendingSeqUpdates[nextSeq];\n\n if(!this.popPendingSeqUpdate() &&\n state.syncPending?.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n this.clearStatePendingSync(state);\n } else {\n delete state.syncPending.seqAwaiting;\n }\n }\n\n return true;\n }\n\n private popPendingPtsUpdate(channelId: ChatId) {\n const curState = channelId ? this.getChannelState(channelId) : this.updatesState;\n if(!curState.pendingPtsUpdates.length) {\n return false;\n }\n\n curState.pendingPtsUpdates.sort((a, b) => {\n return a.pts - b.pts;\n });\n // this.log('pop update', channelId, curState.pendingPtsUpdates)\n\n let curPts = curState.pts;\n let goodPts = 0;\n let goodIndex = 0;\n for(let i = 0, length = curState.pendingPtsUpdates.length; i < length; ++i) {\n const update = curState.pendingPtsUpdates[i];\n curPts += update.pts_count;\n if(curPts >= update.pts) {\n goodPts = update.pts;\n goodIndex = i;\n }\n }\n\n if(!goodPts) {\n return false;\n }\n\n this.debug && this.log.debug('pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1));\n\n curState.pts = goodPts;\n for(let i = 0; i <= goodIndex; ++i) {\n const update = curState.pendingPtsUpdates[i];\n\n // @ts-ignore\n this.saveUpdate(update);\n }\n curState.pendingPtsUpdates.splice(0, goodIndex + 1);\n\n if(!curState.pendingPtsUpdates.length && curState.syncPending) {\n if(!curState.syncPending.seqAwaiting) {\n this.clearStatePendingSync(curState);\n } else {\n delete curState.syncPending.ptsAwaiting;\n }\n }\n\n return true;\n }\n\n public forceGetDifference() {\n if(!this.updatesState.syncLoading) {\n this.getDifference();\n }\n }\n\n public processLocalUpdate(update: Update) {\n this.processUpdateMessage({\n _: 'updateShort',\n update\n } as Updates);\n }\n\n public processUpdateMessage = (updateMessage: any, options: Partial<{\n override: boolean\n }> = {}) => {\n // return forceGetDifference()\n const processOpts = {\n date: updateMessage.date,\n seq: updateMessage.seq,\n seqStart: updateMessage.seq_start\n // ignoreSyncLoading: options.ignoreSyncLoading\n };\n\n this.debug && this.log.debug('processUpdateMessage', updateMessage);\n\n switch(updateMessage._) {\n case 'updatesTooLong':\n case 'new_session_created':\n this.forceGetDifference();\n break;\n\n case 'updateShort':\n this.processUpdate(updateMessage.update, processOpts);\n break;\n\n case 'updateShortMessage':\n case 'updateShortChatMessage': {\n assumeType(updateMessage);\n this.debug && this.log.debug('updateShortMessage | updateShortChatMessage', {...updateMessage});\n const isOut = updateMessage.pFlags.out;\n const fromId = (updateMessage as Updates.updateShortChatMessage).from_id || (isOut ? this.appPeersManager.peerId : (updateMessage as Updates.updateShortMessage).user_id);\n const toId = (updateMessage as Updates.updateShortChatMessage).chat_id ?\n (updateMessage as Updates.updateShortChatMessage).chat_id.toPeerId(true) :\n ((updateMessage as Updates.updateShortMessage).user_id.toPeerId(false) || this.appPeersManager.peerId);\n\n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: this.appPeersManager.getOutputPeer(fromId.toPeerId()),\n peer_id: this.appPeersManager.getOutputPeer(toId),\n date: updateMessage.date,\n message: updateMessage.message,\n fwd_from: updateMessage.fwd_from,\n reply_to: updateMessage.reply_to,\n entities: updateMessage.entities\n },\n pts: updateMessage.pts,\n pts_count: updateMessage.pts_count\n }, processOpts);\n break;\n }\n\n case 'updatesCombined':\n case 'updates':\n this.appUsersManager.saveApiUsers(updateMessage.users, options.override);\n this.appChatsManager.saveApiChats(updateMessage.chats, options.override);\n\n updateMessage.updates.forEach((update: Update) => {\n this.processUpdate(update, processOpts);\n });\n break;\n\n default:\n this.log.warn('Unknown update message', updateMessage);\n }\n };\n\n private getDifference(first = false): Promise {\n // this.trace('Get full diff')\n const updatesState = this.updatesState;\n const wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n\n this.clearStatePendingSync(updatesState);\n\n const promise = this.apiManager.invokeApi('updates.getDifference', {\n pts: updatesState.pts,\n pts_total_limit: first /* && false */? /* 50 */1200 : undefined,\n date: updatesState.date,\n qts: -1\n }, {\n timeout: 0x7fffffff\n }).then((differenceResult) => {\n this.debug && this.log.debug('Get diff result', differenceResult);\n\n if(differenceResult._ === 'updates.differenceEmpty') {\n this.debug && this.log.debug('apply empty diff', differenceResult.seq);\n updatesState.date = differenceResult.date;\n updatesState.seq = differenceResult.seq;\n return;\n }\n\n // ! SORRY I'M SORRY I'M SORRY\n if(first) {\n this.rootScope.dispatchEvent('state_synchronizing');\n }\n\n if(differenceResult._ !== 'updates.differenceTooLong') {\n this.appUsersManager.saveApiUsers(differenceResult.users);\n this.appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n // this.log('applying', differenceResult.other_updates.length, 'other updates')\n\n differenceResult.other_updates.forEach((update) => {\n switch(update._) {\n case 'updateChannelTooLong':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n this.processUpdate(update);\n return;\n }\n\n this.saveUpdate(update);\n });\n\n // this.log('applying', differenceResult.new_messages.length, 'new messages')\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewMessage',\n message: apiMessage,\n pts: updatesState.pts,\n pts_count: 0\n });\n });\n\n const nextState = differenceResult._ === 'updates.difference' ? differenceResult.state : differenceResult.intermediate_state;\n updatesState.seq = nextState.seq;\n updatesState.pts = nextState.pts;\n updatesState.date = nextState.date;\n } else {\n updatesState.pts = differenceResult.pts;\n updatesState.date = (Date.now() / 1000 | 0) + this.timeManager.getServerTimeOffset();\n delete updatesState.seq;\n\n this.channelStates = {};\n\n this.log.warn('getDifference:', differenceResult._);\n this.onDifferenceTooLong();\n }\n\n // this.log('apply diff', updatesState.seq, updatesState.pts)\n\n if(differenceResult._ === 'updates.differenceSlice') {\n return this.getDifference();\n } else {\n this.debug && this.log.debug('finished get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(updatesState, promise);\n }\n\n return promise;\n }\n\n private clearStatePendingSync(state: UpdatesState) {\n if(state.syncPending) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\n }\n }\n\n private getChannelDifference(channelId: ChatId): Promise {\n const channelState = this.getChannelState(channelId);\n const wasSyncing = channelState.syncLoading;\n if(!wasSyncing) {\n channelState.pendingPtsUpdates = [];\n }\n\n this.clearStatePendingSync(channelState);\n\n const log = this.debug ? this.log.bindPrefix('getChannelDifference-' + channelId) : undefined;\n // this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\n const promise = this.apiManager.invokeApi('updates.getChannelDifference', {\n channel: this.appChatsManager.getChannelInput(channelId),\n filter: {_: 'channelMessagesFilterEmpty'},\n pts: channelState.pts,\n limit: 1000\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n log?.debug('diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n channelState.lastDifferenceTime = Date.now();\n\n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n // log?.debug('apply channel empty diff', differenceResult);\n return;\n }\n\n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n // log?.debug('channel diff too long', differenceResult);\n delete this.channelStates[channelId];\n\n this.saveUpdate({_: 'updateChannelReload', channel_id: channelId});\n return;\n }\n\n this.appUsersManager.saveApiUsers(differenceResult.users);\n this.appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n log?.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n\n log?.debug('applying', differenceResult.new_messages.length, 'channel new messages');\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewChannelMessage',\n message: apiMessage,\n pts: channelState.pts,\n pts_count: 0\n });\n });\n\n log?.debug('apply channel diff', channelState.pts);\n\n if(differenceResult._ === 'updates.channelDifference' &&\n !differenceResult.pFlags.final) {\n return this.getChannelDifference(channelId);\n } else {\n log?.debug('finished channel get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(channelState, promise, channelId);\n }\n\n return promise;\n }\n\n private onDifferenceTooLong() {\n this.appUsersManager.clear();\n this.appChatsManager.clear();\n this.appMessagesManager.clear();\n\n this.rootScope.dispatchEvent('state_cleared');\n }\n\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\n state.syncLoading = promise;\n this.rootScope.dispatchEvent('state_synchronizing', channelId);\n\n promise.then(() => {\n state.syncLoading = null;\n this.rootScope.dispatchEvent('state_synchronized', channelId);\n }, () => {\n state.syncLoading = null;\n });\n }\n\n public addChannelState(channelId: ChatId, pts: number) {\n if(!pts) {\n throw new Error('Add channel state without pts ' + channelId);\n }\n\n return this.channelStates[channelId] ??= {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\n }\n\n public getChannelState(channelId: ChatId, pts?: number) {\n if(this.channelStates[channelId] === undefined) {\n this.addChannelState(channelId, pts);\n }\n\n return this.channelStates[channelId];\n }\n\n private processUpdate(update: Update, options: Partial<{\n date: number,\n seq: number,\n seqStart: number/* ,\n ignoreSyncLoading: boolean */\n }> = {}) {\n let channelId: ChatId;\n switch(update._) {\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n channelId = this.appPeersManager.getPeerId(update.message.peer_id).toChatId();\n break;\n /* case 'updateDeleteChannelMessages':\n channelId = update.channel_id;\n break; */\n case 'updateChannelTooLong':\n channelId = update.channel_id;\n if(!(channelId in this.channelStates)) {\n return false;\n }\n break;\n default:\n if('channel_id' in update && 'pts' in update) {\n channelId = update.channel_id;\n }\n break;\n }\n\n const {pts, pts_count} = update as Update.updateNewMessage;\n const curState = channelId ? this.getChannelState(channelId, pts) : this.updatesState;\n\n // this.log.log('process', channelId, curState.pts, update)\n\n if(curState.syncLoading/* && !options.ignoreSyncLoading */) {\n return false;\n }\n\n if(update._ === 'updateChannelTooLong') {\n if(!curState.lastPtsUpdateTime ||\n curState.lastPtsUpdateTime < (Date.now() - SYNC_DELAY)) {\n // this.log.trace('channel too long, get diff', channelId, update)\n this.getChannelDifference(channelId);\n }\n return false;\n }\n\n if(update._ === 'updateNewMessage' ||\n update._ === 'updateEditMessage' ||\n update._ === 'updateNewChannelMessage' ||\n update._ === 'updateEditChannelMessage') {\n const message = update.message as Message.message;\n const toPeerId = this.appPeersManager.getPeerId(message.peer_id);\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\n let reason: string;\n if(message.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !this.appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\n toPeerId.isUser() && !this.appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\n toPeerId.isAnyChat() && !this.appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\n if(channelId && this.appChatsManager.hasChat(channelId)) {\n this.getChannelDifference(channelId);\n } else {\n this.forceGetDifference();\n }\n return false;\n }\n } else if(channelId && !this.appChatsManager.hasChat(channelId)) {\n // this.log.log('skip update, missing channel', channelId, update)\n return false;\n }\n\n let popPts: boolean;\n let popSeq: boolean;\n\n if(pts) {\n const newPts = curState.pts + (pts_count || 0);\n if(newPts < pts) {\n this.debug && this.log.warn('Pts hole', curState, update, channelId && this.appChatsManager.getChat(channelId));\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\n if(!curState.syncPending && !curState.syncLoading) {\n curState.syncPending = {\n timeout: ctx.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n if(channelId) {\n this.getChannelDifference(channelId);\n } else {\n this.getDifference();\n }\n }, SYNC_DELAY)\n };\n }\n\n curState.syncPending.ptsAwaiting = true;\n return false;\n }\n\n if(pts > curState.pts) {\n curState.pts = pts;\n popPts = true;\n\n curState.lastPtsUpdateTime = Date.now();\n } else if(pts_count) {\n // this.log.warn('Duplicate update', update)\n return false;\n }\n\n if(channelId && options.date && this.updatesState.date < options.date) {\n this.updatesState.date = options.date;\n }\n } else if(!channelId && options.seq > 0) {\n const seq = options.seq;\n const seqStart = options.seqStart || seq;\n\n if(seqStart !== curState.seq + 1) {\n if(seqStart > curState.seq) {\n this.debug && this.log.warn('Seq hole', curState, curState.syncPending?.seqAwaiting);\n\n curState.pendingSeqUpdates[seqStart] ??= {seq, date: options.date, updates: []};\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n\n if(!curState.syncPending) {\n curState.syncPending = {\n timeout: ctx.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n this.getDifference();\n }, SYNC_DELAY)\n };\n }\n\n if(!curState.syncPending.seqAwaiting ||\n curState.syncPending.seqAwaiting < seqStart) {\n curState.syncPending.seqAwaiting = seqStart;\n }\n return false;\n }\n }\n\n if(curState.seq !== seq) {\n curState.seq = seq;\n if(options.date && curState.date < options.date) {\n curState.date = options.date;\n }\n\n popSeq = true;\n }\n }\n\n this.saveUpdate(update);\n\n if(popPts) {\n this.popPendingPtsUpdate(channelId);\n } else if(popSeq) {\n this.popPendingSeqUpdate();\n }\n }\n\n public saveUpdate(update: Update) {\n // this.debug && this.log('saveUpdate', update);\n this.dispatchEvent(update._, update as any);\n }\n\n public subscribeToChannelUpdates(channelId: ChatId) {\n const subscription = this.subscriptions[channelId] ??= {count: 0};\n ++subscription.count;\n\n const cb = () => {\n const state = this.getChannelState(channelId);\n if(!state.syncLoading && (!state.lastDifferenceTime || (Date.now() - state.lastDifferenceTime) > 2500)) {\n this.getChannelDifference(channelId);\n }\n };\n\n subscription.interval ??= ctx.setInterval(cb, 3000);\n cb();\n }\n\n public unsubscribeFromChannelUpdates(channelId: ChatId, force?: boolean) {\n const subscription = this.subscriptions[channelId];\n if(!subscription?.interval || (--subscription.count && !force)) {\n return;\n }\n\n clearInterval(subscription.interval);\n subscription.interval = undefined;\n delete this.subscriptions[channelId];\n }\n\n public attach(langCode?: string) {\n if(this.attached) return;\n\n // return;\n\n this.log('attach');\n\n this.attached = true;\n\n this.appStateManager.getState().then(({updates: state}) => {\n const newVersion = this.appStateManager.newVersion/* || '1.6.0' */;\n\n // rootScope.broadcast('state_synchronizing');\n if(!state || !state.pts || !state.date/* || !state.seq */) { // seq can be undefined because of updates.differenceTooLong\n this.log('will get new state');\n\n this.updatesState.syncLoading = new Promise((resolve) => {\n this.apiManager.invokeApi('updates.getState', {}, {noErrorBox: true}).then((stateResult) => {\n this.updatesState.seq = stateResult.seq;\n this.updatesState.pts = stateResult.pts;\n this.updatesState.date = stateResult.date;\n this.saveUpdatesState();\n // setTimeout(() => {\n this.updatesState.syncLoading = null;\n resolve();\n // rootScope.broadcast('state_synchronized');\n // }, 1000);\n\n // ! for testing\n // updatesState.seq = 1\n // updatesState.pts = stateResult.pts - 5000\n // updatesState.date = 1\n // getDifference()\n });\n });\n } else {\n // ! for testing\n /* state.seq = 1;\n state.pts = state.pts - 15;\n state.date = 1; */\n // state.pts -= 100;\n\n // state.date = 1628623682;\n // state.pts = 2007500;\n // state.seq = 503;\n\n Object.assign(this.updatesState, state);\n\n this.log('will get difference', Object.assign({}, state));\n\n this.getDifference(true)/* .finally(() => {\n if(this.updatesState.syncLoading) {\n rootScope.broadcast('state_synchronizing');\n }\n }) */;\n }\n\n this.apiManager.setUpdatesProcessor(this.processUpdateMessage);\n\n // this.updatesState.syncLoading.then(() => {\n this.setProxy();\n // });\n\n if(newVersion) {\n this.updatesState.syncLoading.then(async() => {\n const strs: Record = {\n en: 'was updated to version',\n ru: 'обновлён до версии'\n };\n\n const getChangelog = (lang: string) => {\n fetch(`changelogs/${lang}_${newVersion.split(' ')[0]}.md`)\n .then((res) => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then((text) => {\n const langStr = strs[lang] || strs.en;\n const pre = `**Telegram Web${App.suffix} ${langStr} ${newVersion}**\\n\\n`;\n\n text = pre + text;\n\n const entities: MessageEntity[] = [];\n const message = parseMarkdown(text, entities);\n\n const update: Update.updateServiceNotification = {\n _: 'updateServiceNotification',\n entities,\n message,\n type: 'local',\n pFlags: {},\n inbox_date: Date.now() / 1000 | 0,\n media: undefined\n };\n\n this.processLocalUpdate(update);\n });\n };\n\n const languages = filterUnique([langCode, 'en']);\n for(const language of languages) {\n try {\n await getChangelog(language);\n break;\n } catch(err) {\n\n }\n }\n });\n }\n });\n }\n}\n\ninterface ApiUpdatesManager extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n}>, AppManager {}\napplyMixins(ApiUpdatesManager, [EventListenerBase, AppManager]);\n\nexport {ApiUpdatesManager};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {UserProfilePhoto, ChatPhoto, InputFileLocation} from '../../layer';\nimport {DownloadOptions} from '../mtproto/apiFileManager';\nimport {AppManager} from './manager';\n\nexport type PeerPhotoSize = 'photo_small' | 'photo_big';\n\nexport class AppAvatarsManager extends AppManager {\n private savedAvatarURLs: {\n [peerId: PeerId]: {\n [size in PeerPhotoSize]?: string | Promise\n }\n } = {};\n\n protected after() {\n this.rootScope.addEventListener('avatar_update', ({peerId, threadId}) => {\n if(threadId) {\n return;\n }\n\n this.removeFromAvatarsCache(peerId);\n });\n }\n\n public isAvatarCached(peerId: PeerId, size?: PeerPhotoSize) {\n const saved = this.savedAvatarURLs[peerId];\n if(size === undefined) {\n return !!saved;\n }\n\n return !!(saved && saved[size] && !(saved[size] instanceof Promise));\n }\n\n public removeFromAvatarsCache(peerId: PeerId) {\n if(this.savedAvatarURLs[peerId]) {\n delete this.savedAvatarURLs[peerId];\n }\n }\n\n public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) {\n const saved = this.savedAvatarURLs[peerId] ??= {};\n if(!saved[size]) {\n // console.warn('will invoke downloadSmallFile:', peerId);\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\n _: 'inputPeerPhotoFileLocation',\n pFlags: {},\n peer: this.appPeersManager.getInputPeerById(peerId),\n photo_id: photo.photo_id\n };\n\n const downloadOptions: DownloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\n if(size === 'photo_big') {\n peerPhotoFileLocation.pFlags.big = true;\n downloadOptions.limitPart = 512 * 1024;\n }\n\n /* let str: string;\n const time = Date.now();\n if(peerId === 0) {\n str = `download avatar ${peerId}`;\n } */\n\n const promise = this.apiFileManager.download(downloadOptions);\n return saved[size] = promise.then((blob) => {\n return saved[size] = URL.createObjectURL(blob);\n\n /* if(str) {\n console.log(str, Date.now() / 1000, Date.now() - time);\n } */\n });\n } else {\n return saved[size];\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getEnvironment} from '../../environment/utils';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {nextRandomUint} from '../../helpers/random';\nimport {InputPhoneCall, MessagesDhConfig, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, PhonePhoneCall} from '../../layer';\nimport {AppManager} from './manager';\n\nexport type CallId = PhoneCall['id'];\n\nexport type MyPhoneCall = Exclude;\n\nexport class AppCallsManager extends AppManager {\n private calls: Map;\n\n protected after() {\n this.calls = new Map();\n\n if(!getEnvironment().IS_CALL_SUPPORTED) {\n return;\n }\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updatePhoneCall: (update) => {\n this.saveCall(update.phone_call);\n },\n\n updatePhoneCallSignalingData: (update) => {\n this.rootScope.dispatchEvent('call_signaling', {callId: update.phone_call_id, data: update.data});\n }\n });\n }\n\n public computeKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n return this.cryptoWorker.invokeCrypto('compute-dh-key', g_b, a, p);\n }\n\n public saveCall(call: PhoneCall) {\n const isDiscarded = call._ === 'phoneCallDiscarded';\n const oldCall = this.calls.get(call.id);\n if(oldCall) {\n // if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n // }\n\n if(isDiscarded) {\n this.calls.delete(call.id);\n }\n\n call = oldCall;\n } else if(!isDiscarded) {\n this.calls.set(call.id, call as any);\n }\n\n this.rootScope.dispatchEvent('call_update', call);\n\n return call;\n }\n\n public getCall(callId: CallId) {\n return this.calls.get(callId);\n }\n\n public getCallInput(id: CallId): InputPhoneCall {\n const call = this.getCall(id);\n return {\n _: 'inputPhoneCall',\n id: call.id,\n access_hash: call.access_hash\n };\n }\n\n public savePhonePhoneCall(phonePhoneCall: PhonePhoneCall) {\n this.appUsersManager.saveApiUsers(phonePhoneCall.users);\n return this.saveCall(phonePhoneCall.phone_call);\n }\n\n public generateDh() {\n return this.apiManager.invokeApi('messages.getDhConfig', {\n version: 0,\n random_length: 256\n }).then((dhConfig) => {\n return this.cryptoWorker.invokeCrypto('generate-dh', dhConfig as MessagesDhConfig.messagesDhConfig);\n });\n }\n\n // private verifyProtocolCompatibility(protocol: PhoneCallProtocol) {\n // const my = getCallProtocol();\n // const myVersion = my.library_versions[0];\n // return !protocol.library_versions.find((version) => {\n // return compareVersion(myVersion, version) > 0;\n // });\n // }\n\n public async requestCall(userId: UserId, protocol: PhoneCallProtocol, g_a_hash: Uint8Array, video?: boolean) {\n const phonePhoneCall = await this.apiManager.invokeApi('phone.requestCall', {\n user_id: this.appUsersManager.getUserInput(userId),\n protocol: protocol,\n video: video,\n random_id: nextRandomUint(32),\n g_a_hash: g_a_hash\n });\n\n return this.savePhonePhoneCall(phonePhoneCall);\n }\n\n public async discardCall(callId: CallId, duration: number, reason: PhoneCallDiscardReason['_'], video?: boolean) {\n if(!this.getCall(callId)) {\n return;\n }\n\n const updates = await this.apiManager.invokeApi('phone.discardCall', {\n video,\n peer: this.getCallInput(callId),\n duration,\n reason: {\n _: reason\n },\n connection_id: '0'\n });\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport deepEqual from '../../helpers/object/deepEqual';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {ChannelParticipant, ChannelsCreateChannel, Chat, ChatAdminRights, ChatBannedRights, ChatInvite, ChatPhoto, ChatReactions, InputChannel, InputChatPhoto, InputFile, InputPeer, MessagesSponsoredMessages, SponsoredMessage, Update, Updates} from '../../layer';\nimport {isRestricted} from '../../helpers/restrictions';\nimport {AppManager} from './manager';\nimport hasRights from './utils/chats/hasRights';\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\nimport {AppStoragesManager} from './appStoragesManager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport {randomLong} from '../../helpers/random';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport type Channel = Chat.channel;\nexport type ChatRights = keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags'] | 'change_type' | 'change_permissions' | 'delete_chat' | 'view_participants';\n\nexport class AppChatsManager extends AppManager {\n private storage: AppStoragesManager['storages']['chats'];\n\n private chats: {[id: ChatId]: Exclude};\n // private usernames: any;\n // private channelAccess: any;\n // private megagroups: {[id: number]: true};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n /* updateChannel: (update) => {\n const channelId = update.channel_id;\n //console.log('updateChannel:', update);\n rootScope.broadcast('channel_settings', {channelId});\n }, */\n\n updateChannelParticipant: (update) => {\n this.apiManager.clearCache('channels.getParticipants', (params) => {\n return (params.channel as InputChannel.inputChannel).channel_id === update.channel_id;\n });\n },\n\n updateChatDefaultBannedRights: (update) => {\n const chatId = this.appPeersManager.getPeerId(update.peer).toChatId();\n const chat = this.chats[chatId] as Chat.chat;\n if(chat) {\n chat.default_banned_rights = update.default_banned_rights;\n this.rootScope.dispatchEvent('chat_update', chatId);\n }\n }\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('chats')\n ]).then(([state, {results: chats, storage}]) => {\n this.storage = storage;\n\n this.saveApiChats(chats);\n\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\n if(peerId.isUser() || this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.set({\n [peerId.toChatId()]: this.getChat(peerId.toChatId())\n });\n });\n\n this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\n if(peerId.isUser() || !this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.delete(peerId.toChatId());\n });\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n for(const chatId in this.chats) {\n if(!chatId) continue;\n if(!this.peersStorage.isPeerNeeded(chatId.toPeerId(true))) {\n const chat = this.chats[chatId];\n this.appUsersManager.modifyUsernamesCache(chat, false);\n\n this.storage.delete(chatId);\n delete this.chats[chatId];\n }\n }\n } else {\n this.chats = {};\n }\n };\n\n public saveApiChats(apiChats: any[], override?: boolean) {\n if((apiChats as any).saved) return;\n (apiChats as any).saved = true;\n apiChats.forEach((chat) => this.saveApiChat(chat, override));\n }\n\n public saveApiChat(chat: Chat, override?: boolean) {\n if(!chat || chat._ === 'chatEmpty') return;\n /* if(chat._ !== 'chat' && chat._ !== 'channel') {\n return;\n } */\n\n // * exclude from state\n // defineNotNumerableProperties(chat, ['rTitle', 'initials']);\n\n const oldChat = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n (chat as Chat.chat).pFlags ??= {};\n\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\n return;\n }\n\n if(chat._ === 'channel' &&\n chat.participants_count === undefined &&\n oldChat !== undefined &&\n (oldChat as Chat.channel).participants_count) {\n chat.participants_count = (oldChat as Chat.channel).participants_count;\n }\n\n if((chat as Chat.channel).photo?._ === 'chatPhotoEmpty') {\n delete (chat as Chat.channel).photo;\n }\n\n const changedUsername = this.appUsersManager.setUsernameToCache(chat, oldChat);\n\n /* if(chat.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n const peerId = chat.id.toPeerId(true);\n if(oldChat === undefined) {\n this.chats[chat.id] = chat;\n } else {\n const oldPhotoId = ((oldChat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n const newPhotoId = ((chat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n const toggledForum = (oldChat as Chat.channel).pFlags.forum !== (chat as Chat.channel).pFlags.forum;\n const changedPhoto = oldPhotoId !== newPhotoId || toggledForum;\n\n const changedTitle = oldChat.title !== chat.title || changedUsername;\n\n const changedAnyBadge = (oldChat as Chat.channel).pFlags.verified !== (chat as Chat.channel).pFlags.verified ||\n (oldChat as Chat.channel).pFlags.scam !== (chat as Chat.channel).pFlags.scam ||\n (oldChat as Chat.channel).pFlags.fake !== (chat as Chat.channel).pFlags.fake;\n\n safeReplaceObject(oldChat, chat);\n this.rootScope.dispatchEvent('chat_update', chat.id);\n\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', {peerId});\n }\n\n if(changedTitle || changedAnyBadge) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId});\n }\n\n if(toggledForum) {\n this.rootScope.dispatchEvent('chat_toggle_forum', {chatId: chat.id, enabled: !!(chat as Chat.channel).pFlags.forum});\n }\n }\n\n if(this.peersStorage.isPeerNeeded(peerId)) {\n this.storage.set({\n [chat.id]: chat\n });\n }\n }\n\n public getChat(id: ChatId) {\n return this.chats[id];\n }\n\n /**\n * Check the user's ability to do an action in chat\n * @param id\n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread\n * @returns\n */\n public hasRights(id: ChatId, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n return hasRights(this.getChat(id), action, rights, isThread);\n }\n\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\n const chat = this.getChat(id) as Chat.chat;\n if(chat.default_banned_rights) {\n if(chat.default_banned_rights.until_date === banned_rights.until_date && deepEqual(chat.default_banned_rights.pFlags, banned_rights.pFlags)) {\n return Promise.resolve();\n }\n }\n\n return this.apiManager.invokeApi('messages.editChatDefaultBannedRights', {\n peer: this.appPeersManager.getInputPeerById(id.toPeerId(true)),\n banned_rights\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n /* public resolveUsername(username: string) {\n return this.usernames[username] || 0;\n } */\n\n /* public saveChannelAccess(id: ChatId, accessHash: string) {\n this.channelAccess[id] = accessHash;\n } */\n\n /* public saveIsMegagroup(id: ChatId) {\n this.megagroups[id] = true;\n } */\n\n public isChannel(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */);\n }\n\n public isMegagroup(id: ChatId) {\n /* if(this.megagroups[id]) {\n return true;\n } */\n\n const chat: Chat = this.chats[id];\n return !!(chat as Chat.channel)?.pFlags?.megagroup;\n }\n\n public isForum(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat as Chat.channel)?.pFlags?.forum;\n }\n\n public isBroadcast(id: ChatId) {\n return this.isChannel(id) && !this.isMegagroup(id);\n }\n\n public isInChat(id: ChatId) {\n let good = true;\n const chat: Chat = this.getChat(id);\n if(!chat ||\n chat._ === 'channelForbidden' ||\n chat._ === 'chatForbidden' ||\n (chat as any as Chat.chatEmpty)._ === 'chatEmpty' ||\n (chat as Chat.chat).pFlags.left ||\n // || (chat as any).pFlags.kicked\n (chat as Chat.chat).pFlags.deactivated) {\n good = false;\n }\n\n return good;\n }\n\n public getChannelInput(id: ChatId): InputChannel {\n const chat: Chat = this.getChat(id);\n if(!chat || !(chat as Chat.channel).access_hash) {\n return {\n _: 'inputChannelEmpty'\n };\n } else {\n return {\n _: 'inputChannel',\n channel_id: id,\n access_hash: (chat as Chat.channel).access_hash/* || this.channelAccess[id] */ || '0'\n };\n }\n }\n\n public getInputPeer(id: ChatId) {\n return this.isChannel(id) ? this.getChannelInputPeer(id) : this.getChatInputPeer(id);\n }\n\n public getChatInputPeer(id: ChatId): InputPeer.inputPeerChat {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n\n public getChannelInputPeer(id: ChatId): InputPeer.inputPeerChannel {\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: (this.getChat(id) as Chat.channel).access_hash/* || this.channelAccess[id] */ || 0\n };\n }\n\n public hasChat(id: ChatId, allowMin?: true) {\n const chat = this.chats[id];\n return isObject(chat) && (allowMin || !(chat as Chat.channel).pFlags.min);\n }\n\n public getChatString(id: ChatId) {\n const chat = this.getChat(id);\n if(this.isChannel(id)) {\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + (chat as Chat.channel).access_hash;\n }\n return 'g' + id;\n }\n\n /* public wrapForFull(id: number, fullChat: any) {\n const chatFull = copy(fullChat);\n const chat = this.getChat(id);\n\n if(!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n\n if(chatFull.participants &&\n chatFull.participants._ === 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n\n if(chatFull.about) {\n chatFull.rAbout = wrapRichText(chatFull.about, {noLinebreaks: true});\n }\n\n //chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n\n return chatFull;\n }\n\n public wrapParticipants(id: number, participants: any[]) {\n const chat = this.getChat(id);\n const myId = appUsersManager.getSelf().id;\n if(this.isChannel(id)) {\n const isAdmin = chat.pFlags.creator;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = isAdmin && participant._ === 'channelParticipant';\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n } else {\n const isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = !participant.canLeave && (\n chat.pFlags.creator ||\n participant._ === 'chatParticipant' && (isAdmin || myId === participant.inviter_id)\n );\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n }\n\n return participants;\n } */\n\n public createChannel(options: ChannelsCreateChannel): Promise {\n return this.apiManager.invokeApi('channels.createChannel', options).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const channelId = (updates as any).chats[0].id;\n return channelId;\n });\n }\n\n public inviteToChannel(id: ChatId, userIds: UserId[]) {\n const input = this.getChannelInput(id);\n const usersInputs = userIds.map((u) => this.appUsersManager.getUserInput(u));\n\n return this.apiManager.invokeApi('channels.inviteToChannel', {\n channel: input,\n users: usersInputs\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public createChat(title: string, userIds: UserId[]): Promise {\n return this.apiManager.invokeApi('messages.createChat', {\n users: userIds.map((u) => this.appUsersManager.getUserInput(u)),\n title\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const chatId = (updates as any as Updates.updates).chats[0].id;\n return chatId;\n });\n }\n\n private onChatUpdated = (chatId: ChatId, updates?: Updates) => {\n // console.log('onChatUpdated', chatId, updates);\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n if((updates as Updates.updates)?.updates?.length && this.isChannel(chatId)) {\n this.rootScope.dispatchEvent('invalidate_participants', chatId);\n }\n };\n\n public leaveChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.leaveChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public joinChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.joinChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public addChatUser(id: ChatId, userId: UserId, fwdLimit = 100) {\n return this.apiManager.invokeApi('messages.addChatUser', {\n chat_id: id,\n user_id: this.appUsersManager.getUserInput(userId),\n fwd_limit: fwdLimit\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChatUser(id: ChatId, userId: UserId) {\n return this.apiManager.invokeApi('messages.deleteChatUser', {\n chat_id: id,\n user_id: this.appUsersManager.getUserInput(userId)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public leaveChat(id: ChatId) {\n return this.deleteChatUser(id, this.appUsersManager.getSelf().id);\n }\n\n public leave(id: ChatId) {\n return this.isChannel(id) ? this.leaveChannel(id) : this.leaveChat(id);\n }\n\n public delete(id: ChatId) {\n return this.isChannel(id) ? this.deleteChannel(id) : this.deleteChat(id);\n }\n\n public deleteChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.deleteChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChat(id: ChatId) {\n // return this.leaveChat(id).then(() => {\n return this.apiManager.invokeApi('messages.deleteChat', {\n chat_id: id\n });\n // });\n }\n\n public migrateChat(id: ChatId): Promise {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channel') return Promise.resolve(chat.id);\n return this.apiManager.invokeApi('messages.migrateChat', {\n chat_id: id\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n const update: Update.updateChannel = (updates as Updates.updates).updates.find((u) => u._ === 'updateChannel') as any;\n return update.channel_id;\n });\n }\n\n public updateUsername(id: ChatId, username: string, doNotRefresh?: boolean) {\n const promise = this.apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n });\n\n return this.refreshChatAfterRequest(id, promise, doNotRefresh);\n }\n\n public editPhoto(id: ChatId, inputFile: InputFile) {\n const inputChatPhoto: InputChatPhoto = {\n _: 'inputChatUploadedPhoto',\n file: inputFile\n };\n\n let promise: any;\n if(this.isChannel(id)) {\n promise = this.apiManager.invokeApi('channels.editPhoto', {\n channel: this.getChannelInput(id),\n photo: inputChatPhoto\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatPhoto', {\n chat_id: id,\n photo: inputChatPhoto\n });\n }\n\n return promise.then(this.onChatUpdated.bind(this, id));\n }\n\n public editTitle(id: ChatId, title: string) {\n let promise: any;\n\n if(this.isChannel(id)) {\n promise = this.apiManager.invokeApi('channels.editTitle', {\n channel: this.getChannelInput(id),\n title\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatTitle', {\n chat_id: id,\n title\n });\n }\n\n return promise.then(this.onChatUpdated.bind(this, id));\n }\n\n public editAbout(id: ChatId, about: string) {\n const peerId = id.toPeerId(true);\n return this.apiManager.invokeApi('messages.editChatAbout', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n about\n }).then((bool) => {\n if(bool) {\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return bool;\n });\n }\n\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\n const peerId = typeof(participant) !== 'object' ? participant : getParticipantPeerId(participant);\n return this.apiManager.invokeApi('channels.editBanned', {\n channel: this.getChannelInput(id),\n participant: this.appPeersManager.getInputPeerById(peerId),\n banned_rights\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n\n if(typeof(participant) === 'object') {\n const timestamp = Date.now() / 1000 | 0;\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelParticipant',\n channel_id: id,\n date: timestamp,\n actor_id: undefined,\n qts: undefined,\n user_id: peerId,\n prev_participant: participant,\n new_participant: Object.keys(banned_rights.pFlags).length ? {\n _: 'channelParticipantBanned',\n date: timestamp,\n banned_rights,\n kicked_by: this.appUsersManager.getSelf().id,\n peer: this.appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } : undefined\n });\n }\n });\n }\n\n public clearChannelParticipantBannedRights(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {}\n });\n }\n\n public kickFromChannel(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {\n view_messages: true\n }\n });\n }\n\n public kickFromChat(id: ChatId, participant: PeerId | ChannelParticipant) {\n if(this.isChannel(id)) return this.kickFromChannel(id, participant);\n else return this.deleteChatUser(id, (participant as PeerId).toUserId());\n }\n\n public resolveChannel(id: ChatId) {\n return this.apiManager.invokeApiSingle('channels.getChannels', {\n id: [{\n _: 'inputChannel',\n channel_id: id,\n access_hash: '0'\n }]\n }).then((messagesChats) => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public togglePreHistoryHidden(id: ChatId, enabled: boolean) {\n return this.migrateChat(id).then((channelId) => {\n return this.apiManager.invokeApi('channels.togglePreHistoryHidden', {\n channel: this.getChannelInput(channelId),\n enabled\n }).then(this.onChatUpdated.bind(this, channelId));\n });\n }\n\n public toggleSignatures(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('channels.toggleSignatures', {\n channel: this.getChannelInput(id),\n enabled\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public toggleNoForwards(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('messages.toggleNoForwards', {\n peer: this.getInputPeer(id),\n enabled\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public setChatAvailableReactions(id: ChatId, reactions: ChatReactions) {\n const chatFull = this.appProfileManager.getCachedFullChat(id);\n if(chatFull) {\n chatFull.available_reactions = reactions;\n this.rootScope.dispatchEvent('chat_full_update', id);\n }\n\n return this.apiManager.invokeApi('messages.setChatAvailableReactions', {\n peer: this.getInputPeer(id),\n available_reactions: reactions\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public getSendAs(channelId: ChatId) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getSendAs',\n params: {\n peer: this.getChannelInputPeer(channelId)\n },\n processResult: (sendAsPeers) => {\n this.appUsersManager.saveApiUsers(sendAsPeers.users);\n this.saveApiChats(sendAsPeers.chats);\n\n return sendAsPeers.peers;\n }\n });\n }\n\n public importChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.importChatInvite', {hash})\n .then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n const chat = (updates as Updates.updates).chats[0];\n return chat.id;\n });\n }\n\n public checkUsername(chatId: ChatId, username: string) {\n return this.apiManager.invokeApi('channels.checkUsername', {\n channel: this.getChannelInput(chatId),\n username\n });\n }\n\n public getSponsoredMessage(chatId: ChatId) {\n // const s: MessagesSponsoredMessages.messagesSponsoredMessages = {\n // '_': 'messages.sponsoredMessages',\n // 'messages': [\n // {\n // '_': 'sponsoredMessage',\n // 'pFlags': {},\n // 'flags': 9,\n // 'random_id': new Uint8Array([\n // 80,\n // 5,\n // 249,\n // 174,\n // 44,\n // 73,\n // 173,\n // 14,\n // 246,\n // 81,\n // 187,\n // 182,\n // 223,\n // 5,\n // 4,\n // 128\n // ]),\n // 'from_id': {\n // '_': 'peerUser',\n // 'user_id': 983000232\n // },\n // 'start_param': 'GreatMinds',\n // 'message': 'This is a long sponsored message. In fact, it has the maximum length allowed on the platform – 160 characters 😬😬. It\\'s promoting a bot with a start parameter.' + chatId\n // }\n // ],\n // 'chats': [],\n // 'users': [\n // {\n // '_': 'user',\n // 'pFlags': {\n // 'bot': true,\n // 'verified': true,\n // 'apply_min_photo': true\n // },\n // 'flags': 34226219,\n // 'id': 983000232,\n // 'access_hash': '-294959558742535650',\n // 'first_name': 'Quiz Bot',\n // 'username': 'QuizBot',\n // 'photo': {\n // '_': 'userProfilePhoto',\n // 'pFlags': {},\n // 'flags': 2,\n // 'photo_id': '4221953848856651689',\n // 'stripped_thumb': new Uint8Array([\n // 1,\n // 8,\n // 8,\n // 155,\n // 247,\n // 95,\n // 103,\n // 255,\n // 0,\n // 110,\n // 138,\n // 40,\n // 174,\n // 132,\n // 142,\n // 6,\n // 238,\n // 127\n // ]),\n // 'dc_id': 2\n // },\n // 'bot_info_version': 11,\n // 'bot_inline_placeholder': 'Search a quiz...',\n // 'sortName': 'quiz bot'\n // }\n // ]\n // };\n\n // const promise = Promise.resolve(s);\n const promise = this.apiManager.invokeApiCacheable('channels.getSponsoredMessages', {\n channel: this.getChannelInput(chatId)\n }, {cacheSeconds: 300});\n\n return promise.then((sponsoredMessages) => {\n if(sponsoredMessages._ === 'messages.sponsoredMessages') {\n this.appUsersManager.saveApiUsers(sponsoredMessages.users);\n this.appChatsManager.saveApiChats(sponsoredMessages.chats);\n\n const sponsoredMessage = sponsoredMessages.messages.shift();\n sponsoredMessages.messages.push(sponsoredMessage);\n }\n\n return sponsoredMessages;\n });\n }\n\n public viewSponsoredMessage(chatId: ChatId, randomId: SponsoredMessage['random_id']) {\n return this.apiManager.invokeApiSingle('channels.viewSponsoredMessage', {\n channel: this.getChannelInput(chatId),\n random_id: randomId\n });\n }\n\n public checkChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.checkChatInvite', {\n hash: hash\n }).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n return chatInvite;\n });\n }\n\n public toggleUsername(chatId: ChatId, username: string, active: boolean) {\n const promise = this.apiManager.invokeApi('channels.toggleUsername', {\n channel: this.getChannelInput(chatId),\n username,\n active\n });\n\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public reorderUsernames(chatId: ChatId, order: string[]) {\n const promise = this.apiManager.invokeApi('channels.reorderUsernames', {\n channel: this.getChannelInput(chatId),\n order\n });\n\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public deactivateAllUsernames(chatId: ChatId, doNotRefresh?: boolean) {\n const promise = this.apiManager.invokeApi('channels.deactivateAllUsernames', {\n channel: this.getChannelInput(chatId)\n });\n\n return this.refreshChatAfterRequest(chatId, promise, doNotRefresh);\n }\n\n public makeChannelPrivate(chatId: ChatId) {\n const promises: Promise[] = [\n this.updateUsername(chatId, '', true),\n this.deactivateAllUsernames(chatId, true)\n ];\n\n const promise = Promise.all(promises).then(() => true);\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public refreshChatAfterRequest>(chatId: ChatId, promise: T, doNotRefresh?: boolean): T {\n if(doNotRefresh) {\n return promise;\n }\n\n return promise.then((value) => {\n return this.getChannels([chatId]).then(() => value);\n }) as T;\n }\n\n public getChannels(chatIds: ChatId[]) {\n return this.apiManager.invokeApi('channels.getChannels', {\n id: chatIds.map((chatId) => this.getChannelInput(chatId))\n }).then((messagesChats) => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public toggleForum(chatId: ChatId, enabled: boolean) {\n return this.migrateChat(chatId).then((channelId) => {\n return this.apiManager.invokeApi('channels.toggleForum', {\n channel: this.getChannelInput(channelId),\n enabled\n }).then(this.onChatUpdated.bind(this, channelId));\n });\n }\n\n public editForumTopic(options: {\n chatId: ChatId,\n topicId: number,\n title?: string,\n iconEmojiId?: DocId,\n closed?: boolean,\n hidden?: boolean\n }) {\n const {chatId, topicId, title, iconEmojiId, closed, hidden} = options;\n return this.apiManager.invokeApi('channels.editForumTopic', {\n channel: this.getChannelInput(chatId),\n topic_id: getServerMessageId(topicId),\n title,\n icon_emoji_id: iconEmojiId,\n closed,\n hidden\n }).then(this.onChatUpdated.bind(this, chatId));\n }\n\n public async createForumTopic(options: {\n chatId: ChatId,\n title: string,\n iconColor: number,\n iconEmojiId: DocId\n }) {\n const {chatId, title, iconColor, iconEmojiId} = options;\n\n const channelFull = await this.appProfileManager.getChannelFull(chatId);\n const sendAsInputPeer = channelFull.default_send_as && this.appPeersManager.getInputPeerById(this.appPeersManager.getPeerId(channelFull.default_send_as));\n\n return this.apiManager.invokeApi('channels.createForumTopic', {\n channel: this.getChannelInput(chatId),\n title,\n icon_color: iconColor,\n icon_emoji_id: iconEmojiId,\n random_id: randomLong(),\n send_as: sendAsInputPeer\n }).then((updates) => {\n this.onChatUpdated(chatId, updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateNewChannelMessage') as Update.updateNewChannelMessage;\n return generateMessageId(update.message.id);\n });\n }\n\n public updatePinnedForumTopic(chatId: ChatId, topicId: number, pinned: boolean) {\n return this.apiManager.invokeApi('channels.updatePinnedForumTopic', {\n channel: this.getChannelInput(chatId),\n topic_id: getServerMessageId(topicId),\n pinned\n }).then(this.onChatUpdated.bind(this, chatId));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\nimport {setDirection} from '../helpers/dom/setInnerHTML';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n 'messageActionBotAllowed': 'Chat.Service.BotPermissionAllowed'\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n export let isRTL = false;\n\n export function setRTL(rtl: boolean) {\n isRTL = rtl;\n }\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n rootScope.dispatchEvent('language_change', currentLangCode);\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n out.push(string.slice(lastIndex, offset));\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n out.push(a);\n } else if(args) {\n pushNextArgument(out, args, indexHolder);\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map((item) => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.textContent = '';\n this.element.append(...format(this.key, false, this.args) as any);\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n }\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n setDirection(this.element);\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n const arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n return arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n const joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type addAnchorListener from '../../helpers/addAnchorListener';\nimport {PHONE_NUMBER_REG_EXP} from '.';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport matchUrlProtocol from './matchUrlProtocol';\nimport {T_ME_PREFIXES} from '../mtproto/mtproto_config';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean) {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n const out: {url: string, onclick?: Parameters[0]['name']} = {url};\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: typeof out['onclick'];\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?(?:(.+?)\\.)?(?:(?:web|k|z)\\.)?t(?:elegram)?\\.me(?:\\/(.+))?/))) {\n const u = new URL(url);\n let prefix = tgMeMatch[1];\n if(prefix && T_ME_PREFIXES.has(tgMeMatch[1])) {\n prefix = undefined;\n }\n\n if(prefix) {\n u.pathname = prefix + (u.pathname === '/' ? '' : u.pathname);\n }\n\n const fullPath = u.pathname.slice(1);\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n } else if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) { // second regexp is for phone numbers (t.me/+38050...)\n onclick = 'joinchat';\n } else switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'addemoji':\n case 'voicechat':\n case 'invoice':\n if(path.length !== 1 && !prefix) {\n onclick = path[0];\n break;\n }\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1] as any;\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n\n out.onclick = onclick;\n return out;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.wrapUrl = wrapUrl);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import I18n from '../../lib/langPack';\n\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment | Element) {\n setDirection(elem);\n if(typeof(html) === 'string') {\n if(!html) elem.replaceChildren();\n else elem.innerHTML = html;\n } else {\n elem.replaceChildren(html);\n }\n}\n\nexport function setDirection(elem: Element) {\n // if(!I18n.isRTL) {\n elem.setAttribute('dir', 'auto');\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport I18n, {i18n} from '../lib/langPack';\n\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const ONE_DAY = 86400;\n\n// https://stackoverflow.com/a/6117889\nexport const getWeekNumber = (date: Date) => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\n};\n\nexport function formatDateAccordingToTodayNew(time: Date) {\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n const options: Intl.DateTimeFormatOptions = {};\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\n options.hour = options.minute = '2-digit';\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\n options.year = options.day = 'numeric';\n options.month = '2-digit';\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\n options.weekday = 'short';\n } else { // same year\n options.month = 'short';\n options.day = 'numeric';\n }\n\n return new I18n.IntlDateElement({\n date: time,\n options\n }).element;\n}\n\nexport function formatFullSentTimeRaw(timestamp: number, options: {\n capitalize?: boolean\n} = {}) {\n const date = new Date();\n const time = new Date(timestamp * 1000);\n const now = date.getTime() / 1000;\n\n const timeEl = formatTime(time);\n\n let dateEl: Node | string;\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\n\n if(options.capitalize) {\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\n }\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\n } else {\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\n }\n\n return {dateEl, timeEl};\n}\n\nexport function formatFullSentTime(timestamp: number) {\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\n capitalize: true\n });\n\n const fragment = document.createDocumentFragment();\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\n return fragment;\n}\n\nexport function formatTime(date: Date) {\n return new I18n.IntlDateElement({\n date,\n options: {\n hour: '2-digit',\n minute: '2-digit'\n }\n }).element;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\n\nexport const getFullDate = (date: Date, options: Partial<{\n noTime: true,\n noSeconds: true,\n monthAsNumber: true,\n leadingZero: true\n}> = {}) => {\n const joiner = options.monthAsNumber ? '.' : ' ';\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\n\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\n joiner + date.getFullYear() +\n (options.noTime ? '' : ', ' + time);\n};\n\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\nconst minYear = 2013;\nconst yearPattern = new RegExp('20[0-9]{1,2}');\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nexport type DateData = {\n title: string,\n minDate: number,\n maxDate: number,\n};\nexport function fillTipDates(query: string, dates: DateData[]) {\n const q = query.trim().toLowerCase();\n\n if(q.length < 3) {\n return;\n }\n\n if('today'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: 'Today',\n minDate,\n maxDate\n });\n return;\n }\n\n if('yesterday'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime() - 86400000;\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 86400001;\n dates.push({\n title: 'Yesterday',\n minDate,\n maxDate\n });\n return;\n }\n\n const dayOfWeek = getDayOfWeek(q);\n if(dayOfWeek >= 0) {\n const date = new Date();\n const now = date.getTime();\n const currentDay = date.getDay();\n const distance = dayOfWeek - currentDay;\n date.setDate(date.getDate() + distance);\n if(date.getTime() > now) {\n date.setTime(date.getTime() - 604800000);\n }\n const year = date.getFullYear()\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatWeekLong(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n let matches: any[];\n if((matches = shortDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const k = parseInt(g1);\n const k1 = parseInt(g2);\n if(k > 0 && k <= 31) {\n if(k1 >= minYear && k <= 12) {\n const selectedYear = k1;\n const month = k - 1;\n createForMonthYear(dates, month, selectedYear);\n return;\n } else if(k1 <= 12) {\n const day = k - 1;\n const month = k1 - 1;\n createForDayMonth(dates, day, month);\n }\n } else if(k >= minYear && k1 <= 12) {\n const selectedYear = k;\n const month = k1 - 1;\n createForMonthYear(dates, month, selectedYear);\n }\n\n return;\n }\n\n if((matches = longDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const g3 = matches[5];\n if(!matches[2] === matches[4]) {\n return;\n }\n\n const day = parseInt(g1);\n const month = parseInt(g2) - 1;\n let year = parseInt(g3);\n if(year >= 10 && year <= 99) {\n year += 2000;\n }\n\n const currentYear = new Date().getFullYear();\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\n const date = new Date();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n return;\n }\n\n if((matches = yearPattern.exec(q)) !== null) {\n let selectedYear = +q;\n const currentYear = new Date().getFullYear();\n if(selectedYear < minYear) {\n selectedYear = minYear;\n for(let i = currentYear; i >= selectedYear; i--) {\n const date = new Date();\n date.setFullYear(i, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(i + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + i,\n minDate,\n maxDate\n });\n }\n } else if(selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(selectedYear + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + selectedYear,\n minDate,\n maxDate\n });\n }\n\n return;\n }\n\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g1);\n if(month >= 0) {\n const k = +g2;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n return;\n }\n }\n }\n\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g2);\n if(month >= 0) {\n const k = +g1;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n }\n }\n }\n}\n\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n if(selectedYear >= minYear && selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, month, 1);\n date.setHours(0, 0, 0);\n const minDate = date.getTime();\n if(minDate > today) {\n return;\n }\n date.setMonth(date.getMonth() + 1);\n const maxDate = date.getTime() - 1;\n\n dates.push({\n title: formatterMonthYear(minDate),\n minDate,\n maxDate\n });\n }\n}\n\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\n if(validDateForMonth(day, month)) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n\n for(let i = currentYear; i >= minYear; i--) {\n if(month === 1 && day === 28 && !isLeapYear(i)) {\n continue;\n }\n\n const date = new Date();\n date.setFullYear(i, month, day + 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n if(minDate > today) {\n continue;\n }\n\n date.setFullYear(i, month, day + 2);\n date.setHours(0, 0, 0);\n const maxDate = date.getTime() - 1;\n if(i === currentYear) {\n dates.push({\n title: formatterDayMonth(minDate),\n minDate,\n maxDate\n });\n } else {\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n }\n }\n }\n}\n\nfunction formatterMonthYear(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\n}\n\nfunction formatterDayMonth(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\n}\n\nfunction formatterYearMax(timestamp: number) {\n const date = new Date(timestamp);\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\n}\n\nfunction formatWeekLong(timestamp: number) {\n const date = new Date(timestamp);\n return days[date.getDay()];\n}\n\nfunction validDateForMonth(day: number, month: number) {\n if(month >= 0 && month < 12) {\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLeapYear(year: number) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n}\n\nfunction getMonth(q: string) {\n /* String[] months = new String[]{\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\n }; */\n\n /* String[] monthsEng = new String[12];\n Calendar c = Calendar.getInstance();\n for (int i = 1; i <= 12; i++) {\n c.set(0, 0, 0, 0, 0, 0);\n c.set(Calendar.MONTH, i);\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\n } */\n\n q = q.toLowerCase();\n for(let i = 0; i < 12; i++) {\n const month = months[i].toLowerCase();\n if(month.indexOf(q) === 0) {\n return i;\n }\n }\n return -1;\n}\n\nfunction getDayOfWeek(q: string) {\n const c = new Date();\n if(q.length <= 3) {\n return -1;\n }\n\n for(let i = 0; i < 7; i++) {\n c.setDate(c.getDate() + 1);\n\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\n return c.getDay();\n }\n }\n return -1;\n}\n\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\n","/**\n * Will be used for FILE_REFERENCE_EXPIRED\n * @param key\n * @param wasObject\n * @param newObject\n */\nexport default function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\n if('byteLength' in newObject[key]) { // Uint8Array\n newObject[key] = [...newObject[key]];\n }\n\n if(wasObject && wasObject[key] !== newObject[key]) {\n wasObject[key].length = newObject[key].length;\n (newObject[key] as any[]).forEach((v, i) => {\n wasObject[key][i] = v;\n });\n\n /* wasObject[key].set(newObject[key]); */\n newObject[key] = wasObject[key];\n }\n}\n","export const EXTENSION_MIME_TYPE_MAP: {[ext in MTFileExtension]: MTMimeType} = {\n pdf: 'application/pdf',\n tgv: 'application/x-tgwallpattern',\n tgs: 'application/x-tgsticker',\n json: 'application/json',\n wav: 'audio/wav',\n mp3: 'audio/mpeg',\n ogg: 'audio/ogg',\n jpeg: 'image/jpeg',\n jpg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n mp4: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n svg: 'image/svg+xml'\n};\n\nexport const MIME_TYPE_EXTENSION_MAP: {[mimeType in MTMimeType]?: MTFileExtension} = {};\n\nfor(const ext in EXTENSION_MIME_TYPE_MAP) {\n MIME_TYPE_EXTENSION_MAP[EXTENSION_MIME_TYPE_MAP[ext as MTFileExtension]] = ext as MTFileExtension;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {ThumbCache} from '../storages/thumbs';\nimport {AccountWallPapers, Document, DocumentAttribute, MessagesSavedGifs, PhotoSize, WallPaper} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {getFullDate} from '../../helpers/date';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\nimport {AppManager} from './manager';\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\nimport assumeType from '../../helpers/assumeType';\nimport {getEnvironment} from '../../environment/utils';\nimport {isServiceWorkerOnline} from '../mtproto/mtproto.worker';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport getDocumentInputFileLocation from './utils/docs/getDocumentInputFileLocation';\nimport getDocumentURL from './utils/docs/getDocumentURL';\nimport makeError from '../../helpers/makeError';\nimport {EXTENSION_MIME_TYPE_MAP} from '../../environment/mimeTypeMap';\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n\nexport type MyDocument = Document.document;\n\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\n\ntype WallPaperId = WallPaper.wallPaper['id'];\n\nlet uploadWallPaperTempId = 0;\n\nexport class AppDocsManager extends AppManager {\n private docs: {[docId: DocId]: MyDocument};\n\n private stickerCachedThumbs: {[docId: DocId]: {[toneIndex: number]: {url: string, w: number, h: number}}};\n\n private uploadingWallPapers: {[id: WallPaperId]: {cacheContext: ThumbCache, file: File}};\n\n protected after() {\n this.docs = {};\n this.stickerCachedThumbs = {};\n this.uploadingWallPapers = {};\n\n MTProtoMessagePort.getInstance().addEventListener('serviceWorkerOnline', (online) => {\n if(!online) {\n this.onServiceWorkerFail();\n }\n });\n }\n\n private onServiceWorkerFail = () => {\n for(const id in this.docs) {\n const doc = this.docs[id];\n\n if(doc.supportsStreaming) {\n delete doc.supportsStreaming;\n this.thumbsStorage.deleteCacheContext(doc);\n }\n }\n };\n\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\n if(!doc || doc._ === 'documentEmpty') {\n return;\n }\n\n const oldDoc = this.docs[doc.id];\n\n if(doc.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldDoc, doc);\n this.referenceDatabase.saveContext(doc.file_reference, context);\n }\n\n // console.log('saveDoc', apiDoc, this.docs[apiDoc.id]);\n // if(oldDoc) {\n // //if(doc._ !== 'documentEmpty' && doc._ === d._) {\n // if(doc.thumbs) {\n // if(!oldDoc.thumbs) oldDoc.thumbs = doc.thumbs;\n // /* else if(apiDoc.thumbs[0].bytes && !d.thumbs[0].bytes) {\n // d.thumbs.unshift(apiDoc.thumbs[0]);\n // } else if(d.thumbs[0].url) { // fix for converted thumb in safari\n // apiDoc.thumbs[0] = d.thumbs[0];\n // } */\n // }\n\n // //}\n\n // return oldDoc;\n\n // //return Object.assign(d, apiDoc, context);\n // //return context ? Object.assign(d, context) : d;\n // }\n\n if(!oldDoc) {\n this.docs[doc.id] = doc;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(doc, [/* 'thumbs', */'type', 'h', 'w', 'file_name',\n // 'file', 'duration', 'downloaded', 'url', 'audioTitle',\n // 'audioPerformer', 'sticker', 'stickerEmoji', 'stickerEmojiRaw',\n // 'stickerSetInput', 'stickerThumbConverted', 'animated', 'supportsStreaming']);\n\n for(let i = 0, length = doc.attributes.length; i < length; ++i) {\n const attribute = doc.attributes[i];\n switch(attribute._) {\n case 'documentAttributeFilename': {\n doc.file_name = wrapPlainText(attribute.file_name);\n break;\n }\n\n case 'documentAttributeAudio': {\n if(doc.type === 'round') {\n break;\n }\n\n doc.duration = attribute.duration;\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n break;\n }\n\n case 'documentAttributeVideo': {\n doc.duration = attribute.duration;\n doc.w = attribute.w;\n doc.h = attribute.h;\n // apiDoc.supportsStreaming = attribute.pFlags?.supports_streaming/* && apiDoc.size > 524288 */;\n if(/* apiDoc.thumbs && */attribute.pFlags.round_message) {\n doc.type = 'round';\n } else /* if(apiDoc.thumbs) */ {\n doc.type = 'video';\n }\n break;\n }\n\n case 'documentAttributeCustomEmoji':\n case 'documentAttributeSticker': {\n if(attribute.alt !== undefined) {\n doc.stickerEmojiRaw = attribute.alt;\n }\n\n if(attribute.stickerset) {\n if(attribute.stickerset._ === 'inputStickerSetEmpty') {\n delete attribute.stickerset;\n } else if(attribute.stickerset._ === 'inputStickerSetID') {\n doc.stickerSetInput = attribute.stickerset;\n }\n }\n\n // * there can be no thumbs, then it is a document\n if(/* apiDoc.thumbs && */doc.mime_type === 'image/webp' && (doc.thumbs || getEnvironment().IS_WEBP_SUPPORTED)) {\n doc.type = 'sticker';\n doc.sticker = 1;\n } else if(doc.mime_type === 'video/webm') {\n if(!getEnvironment().IS_WEBM_SUPPORTED) {\n break;\n }\n\n doc.type = 'sticker';\n doc.sticker = 3;\n doc.animated = true;\n }\n break;\n }\n\n case 'documentAttributeImageSize': {\n doc.type = 'photo';\n doc.w = attribute.w;\n doc.h = attribute.h;\n break;\n }\n\n case 'documentAttributeAnimated': {\n if((doc.mime_type === 'image/gif' || doc.mime_type === 'video/mp4')/* && apiDoc.thumbs */) {\n doc.type = 'gif';\n }\n\n doc.animated = true;\n break;\n }\n }\n }\n\n if(!doc.mime_type) {\n const ext = (doc.file_name || '').split('.').pop();\n // @ts-ignore\n const mappedMimeType = ext && EXTENSION_MIME_TYPE_MAP[ext.toLowerCase()];\n if(mappedMimeType) {\n doc.mime_type = mappedMimeType;\n } else {\n switch(doc.type) {\n case 'gif':\n case 'video':\n case 'round':\n doc.mime_type = 'video/mp4';\n break;\n case 'sticker':\n doc.mime_type = 'image/webp';\n break;\n case 'audio':\n doc.mime_type = 'audio/mpeg';\n break;\n case 'voice':\n doc.mime_type = 'audio/ogg';\n break;\n default:\n doc.mime_type = 'application/octet-stream';\n break;\n }\n }\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.pdf) {\n doc.type = 'pdf';\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.gif) {\n doc.type = 'gif';\n } else if(doc.mime_type === 'application/x-tgsticker' && doc.file_name === 'AnimatedSticker.tgs') {\n doc.type = 'sticker';\n doc.animated = true;\n doc.sticker = 2;\n }\n\n if(doc.type === 'voice' || doc.type === 'round') {\n // browser will identify extension\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeFilename') as DocumentAttribute.documentAttributeFilename;\n const ext = attribute && attribute.file_name.split('.').pop();\n const date = getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n doc.file_name = `${doc.type}_${date}${ext ? '.' + ext : ''}`;\n }\n\n if(isServiceWorkerOnline() && ((doc.type === 'gif' && doc.size > 8e6) || doc.type === 'audio' || doc.type === 'video')/* || doc.mime_type.indexOf('video/') === 0 */) {\n doc.supportsStreaming = true;\n\n const cacheContext = this.thumbsStorage.getCacheContext(doc);\n if(!cacheContext.url) {\n this.thumbsStorage.setCacheContextURL(doc, undefined, getDocumentURL(doc), 0);\n }\n } else {\n doc.supportsStreaming = false;\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n\n doc.file_name ||= '';\n\n /* if(!doc.url) {\n doc.url = this.getFileURL(doc);\n } */\n\n if(oldDoc) {\n return Object.assign(oldDoc, doc);\n }\n\n return doc;\n }\n\n public getDoc(docId: DocId | MyDocument): MyDocument {\n return isObject(docId) ? docId : this.docs[docId];\n }\n\n public downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean) {\n return this.apiFileManager.downloadMedia({\n media: doc,\n queueId,\n onlyCache\n });\n }\n\n public getLottieCachedThumb(docId: DocId, toneIndex: number) {\n const cached = this.stickerCachedThumbs[docId];\n return cached && cached[toneIndex];\n }\n\n public saveLottiePreview(docId: DocId, blob: Blob, width: number, height: number, toneIndex: number) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const cached = this.stickerCachedThumbs[doc.id] ??= {};\n\n const thumb = cached[toneIndex];\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n cached[toneIndex] = {\n url: URL.createObjectURL(blob),\n w: width,\n h: height\n };\n }\n\n public saveWebPConvertedStrippedThumb(docId: DocId, bytes: Uint8Array) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const thumb = doc.thumbs && doc.thumbs.find((thumb) => thumb._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n if(!thumb) {\n return;\n }\n\n doc.pFlags.stickerThumbConverted = true;\n thumb.bytes = bytes;\n }\n\n public prepareWallPaperUpload(file: File) {\n const id = 'wallpaper-upload-' + ++uploadWallPaperTempId;\n\n const thumb = {\n _: 'photoSize',\n h: 0,\n w: 0,\n location: {} as any,\n size: file.size,\n type: THUMB_TYPE_FULL\n } as PhotoSize.photoSize;\n let document: MyDocument = {\n _: 'document',\n access_hash: '',\n attributes: [],\n dc_id: 0,\n file_reference: [],\n id,\n mime_type: file.type as MTMimeType,\n size: file.size,\n date: Date.now() / 1000,\n pFlags: {},\n thumbs: [thumb],\n file_name: file.name\n };\n\n document = this.saveDoc(document);\n\n const cacheContext = this.thumbsStorage.setCacheContextURL(document, undefined, URL.createObjectURL(file), file.size);\n\n const wallpaper: WallPaper.wallPaper = {\n _: 'wallPaper',\n access_hash: '',\n document: document,\n id,\n slug: id,\n pFlags: {}\n };\n\n this.uploadingWallPapers[id] = {\n cacheContext,\n file\n };\n\n return wallpaper;\n }\n\n public uploadWallPaper(id: WallPaperId) {\n const {cacheContext, file} = this.uploadingWallPapers[id];\n delete this.uploadingWallPapers[id];\n\n const upload = this.apiFileManager.upload({file, fileName: file.name});\n return upload.then((inputFile) => {\n return this.apiManager.invokeApi('account.uploadWallPaper', {\n file: inputFile,\n mime_type: file.type,\n settings: {\n _: 'wallPaperSettings'\n\n }\n }).then((wallPaper) => {\n assumeType(wallPaper);\n wallPaper.document = this.saveDoc(wallPaper.document);\n this.thumbsStorage.setCacheContextURL(wallPaper.document, undefined, cacheContext.url, cacheContext.downloaded);\n\n return wallPaper;\n });\n });\n }\n\n public getGifs() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getSavedGifs',\n processResult: (res) => {\n assumeType(res);\n return res.gifs.map((doc) => this.saveDoc(doc));\n }\n });\n }\n\n public requestDocPart(docId: DocId, dcId: number, offset: number, limit: number) {\n const doc = this.getDoc(docId);\n if(!doc) return Promise.reject(makeError('NO_DOC'));\n return this.apiFileManager.requestFilePart(dcId, getDocumentInputFileLocation(doc), offset, limit);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {FileURLType, getFileURL} from '../../../../helpers/fileName';\nimport {Document, PhotoSize} from '../../../../layer';\nimport getDocumentDownloadOptions from './getDocumentDownloadOptions';\n\nexport default function getDocumentURL(doc: Document.document, download = false, thumb?: PhotoSize.photoSize) {\n let type: FileURLType;\n if(download) {\n type = 'download';\n } else if(thumb) {\n type = 'thumb';\n } else if(doc.supportsStreaming) {\n type = 'stream';\n } else {\n type = 'document';\n }\n\n return getFileURL(type, getDocumentDownloadOptions(doc, thumb));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MessageEntity, DraftMessage, MessagesSaveDraft} from '../../layer';\nimport tsNow from '../../helpers/tsNow';\nimport stateStorage from '../stateStorage';\nimport assumeType from '../../helpers/assumeType';\nimport {AppManager} from './manager';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport draftsAreEqual from './utils/drafts/draftsAreEqual';\n\nexport type MyDraftMessage = DraftMessage.draftMessage;\n\nexport class AppDraftsManager extends AppManager {\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\n private getAllDraftPromise: Promise;\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateDraftMessage: (update) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n this.saveDraft({\n peerId,\n threadId: update.threadId,\n draft: update.draft,\n notify: true\n });\n }\n });\n\n /* return */stateStorage.get('drafts').then((drafts) => {\n this.drafts = drafts || {};\n });\n }\n\n private getKey(peerId: PeerId, threadId?: number) {\n return '' + peerId + (threadId ? '_' + threadId : '');\n }\n\n public getDraft(peerId: PeerId, threadId?: number) {\n return this.drafts[this.getKey(peerId, threadId)];\n }\n\n public addMissedDialogs() {\n return this.getAllDrafts().then(() => {\n for(const key in this.drafts) {\n if(key.indexOf('_') !== -1) { // exclude threads\n continue;\n }\n\n const peerId = key.toPeerId();\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\n if(!dialog) {\n this.appMessagesManager.reloadConversation(peerId);\n /* const dialog = appMessagesManager.generateDialog(peerId);\n dialog.draft = this.drafts[key];\n appMessagesManager.saveConversation(dialog);\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\n appMessagesManager.scheduleHandleNewDialogs(); */\n }\n }\n });\n }\n\n private getAllDrafts() {\n return this.getAllDraftPromise ??= this.apiManager.invokeApi('messages.getAllDrafts')\n .then((updates) => {\n const p = this.apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\n p.then(() => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n });\n }\n\n public saveDraft({peerId, threadId, draft: apiDraft, notify, force}: {\n peerId: PeerId,\n threadId?: number,\n draft: DraftMessage,\n notify?: boolean,\n force?: boolean\n }) {\n const draft = this.processApiDraft(apiDraft);\n\n const key = this.getKey(peerId, threadId);\n if(draft) {\n this.drafts[key] = draft;\n } else {\n delete this.drafts[key];\n }\n\n stateStorage.set({\n drafts: this.drafts\n });\n\n if(notify) {\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\n this.rootScope.dispatchEvent('draft_updated', {\n peerId,\n threadId,\n draft,\n force\n });\n }\n\n return draft;\n }\n\n private isEmptyDraft(draft: DraftMessage) {\n if(draft?._ !== 'draftMessage') {\n return true;\n }\n\n if(draft.reply_to_msg_id !== undefined && draft.reply_to_msg_id > 0) {\n return false;\n }\n\n if(!draft.message.length) {\n return true;\n }\n\n return false;\n }\n\n private processApiDraft(draft: DraftMessage): MyDraftMessage {\n if(!draft || draft._ !== 'draftMessage') {\n return undefined;\n }\n\n if(draft.reply_to_msg_id) {\n draft.reply_to_msg_id = generateMessageId(draft.reply_to_msg_id);\n }\n\n return draft;\n }\n\n public syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\n // console.warn(dT(), 'sync draft', peerID)\n const serverDraft = this.getDraft(peerId, threadId);\n if(draftsAreEqual(serverDraft, localDraft)) {\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\n return true;\n }\n\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\n const params: MessagesSaveDraft = {\n peer: this.appPeersManager.getInputPeerById(peerId),\n message: ''\n };\n\n let draftObj: DraftMessage;\n if(this.isEmptyDraft(localDraft)) {\n draftObj = {_: 'draftMessageEmpty'};\n } else {\n assumeType(localDraft);\n const message = localDraft.message;\n const entities: MessageEntity[] = localDraft.entities;\n\n if(localDraft.reply_to_msg_id) {\n params.reply_to_msg_id = getServerMessageId(localDraft.reply_to_msg_id);\n }\n\n if(entities?.length) {\n params.entities = this.appMessagesManager.getInputEntities(entities);\n }\n\n if(localDraft.pFlags.no_webpage) {\n params.no_webpage = localDraft.pFlags.no_webpage;\n }\n\n params.message = message;\n }\n\n if(threadId) {\n params.top_msg_id = getServerMessageId(threadId);\n }\n\n const saveLocalDraft = draftObj || localDraft;\n saveLocalDraft.date = tsNow(true) + this.timeManager.getServerTimeOffset();\n\n this.saveDraft({\n peerId,\n threadId,\n draft: saveLocalDraft,\n notify: true,\n force\n });\n\n if(saveOnServer) {\n return this.apiManager.invokeApi('messages.saveDraft', params);\n }\n\n return true;\n }\n\n public clearAllDrafts() {\n return this.apiManager.invokeApi('messages.clearAllDrafts').then((bool) => {\n if(!bool) {\n return;\n }\n\n for(const combined in this.drafts) {\n const [peerId, threadId] = combined.split('_');\n this.rootScope.dispatchEvent('draft_updated', {\n peerId: peerId.toPeerId(),\n threadId: threadId ? +threadId : undefined,\n draft: undefined\n });\n }\n });\n }\n\n public clearDraft(peerId: PeerId, threadId: number) {\n const emptyDraft: DraftMessage.draftMessageEmpty = {\n _: 'draftMessageEmpty'\n };\n\n if(threadId) {\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\n } else {\n this.saveDraft({\n peerId,\n threadId,\n draft: emptyDraft,\n notify: true,\n force: true\n });\n }\n }\n\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\n const draft: DraftMessage.draftMessage = {\n _: 'draftMessage',\n date: Date.now() / 1000 | 0,\n message,\n pFlags: {},\n entities\n };\n\n if(threadId) {\n this.syncDraft(peerId, threadId, draft, false, true);\n } else {\n this.saveDraft({\n peerId,\n threadId,\n draft,\n notify: true,\n force: true\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from './appDocsManager';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport isObject from '../../helpers/object/isObject';\nimport validateInitObject from '../../helpers/object/validateInitObject';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport SearchIndex from '../searchIndex';\nimport stateStorage from '../stateStorage';\nimport {AppManager} from './manager';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\n\ntype EmojiLangPack = {\n keywords: {\n [keyword: string]: string[],\n },\n version: number,\n langCode: string\n};\n\nconst EMOJI_LANG_PACK: EmojiLangPack = {\n keywords: {},\n version: 0,\n langCode: App.langPackCode\n};\n\nconst RECENT_MAX_LENGTH = 32;\n\ntype EmojiType = 'native' | 'custom';\n\nexport class AppEmojiManager extends AppManager {\n private static POPULAR_EMOJI = ['😂', '😘', '❤️', '😍', '😊', '😁', '👍', '☺️', '😔', '😄', '😭', '💋', '😒', '😳', '😜', '🙈', '😉', '😃', '😢', '😝', '😱', '😡', '😏', '😞', '😅', '😚', '🙊', '😌', '😀', '😋', '😆', '👌', '😐', '😕'];\n private keywordLangPacks: {\n [langCode: string]: EmojiLangPack\n } = {};\n\n private index: SearchIndex;\n private indexedLangPacks: {[langCode: string]: boolean} = {};\n\n private getKeywordsPromises: {[langCode: string]: Promise} = {};\n\n private recent: {native?: string[], custom?: DocId[]} = {};\n private getRecentEmojisPromises: {native?: Promise, custom?: Promise} = {};\n\n private getCustomEmojiDocumentsPromise: Promise;\n private getCustomEmojiDocumentPromises: Map> = new Map();\n\n /* public getPopularEmoji() {\n return stateStorage.get('emojis_popular').then((popEmojis) => {\n var result = []\n if (popEmojis && popEmojis.length) {\n for (var i = 0, len = popEmojis.length; i < len; i++) {\n result.push({code: popEmojis[i][0], rate: popEmojis[i][1]})\n }\n callback(result)\n return\n }\n\n return stateStorage.get('emojis_recent').then((recentEmojis) => {\n recentEmojis = recentEmojis || popular || []\n var shortcut\n var code\n for (var i = 0, len = recentEmojis.length; i < len; i++) {\n shortcut = recentEmojis[i]\n if (Array.isArray(shortcut)) {\n shortcut = shortcut[0]\n }\n if (shortcut && typeof shortcut === 'string') {\n if (shortcut.charAt(0) == ':') {\n shortcut = shortcut.substr(1, shortcut.length - 2)\n }\n if (code = shortcuts[shortcut]) {\n result.push({code: code, rate: 1})\n }\n }\n }\n callback(result)\n });\n });\n }\n\n function pushPopularEmoji (code) {\n getPopularEmoji(function (popularEmoji) {\n var exists = false\n var count = popularEmoji.length\n var result = []\n for (var i = 0; i < count; i++) {\n if (popularEmoji[i].code == code) {\n exists = true\n popularEmoji[i].rate++\n }\n result.push([popularEmoji[i].code, popularEmoji[i].rate])\n }\n if (exists) {\n result.sort(function (a, b) {\n return b[1] - a[1]\n })\n } else {\n if (result.length > 41) {\n result = result.slice(0, 41)\n }\n result.push([code, 1])\n }\n ConfigStorage.set({emojis_popular: result})\n })\n } */\n\n public getEmojiKeywords(langCode: string = App.langPackCode) {\n const promise = this.getKeywordsPromises[langCode];\n if(promise) {\n return promise;\n }\n\n const storageKey: any = 'emojiKeywords_' + langCode;\n return this.getKeywordsPromises[langCode] = stateStorage.get(storageKey).then((pack: EmojiLangPack) => {\n if(!isObject(pack)) {\n pack = {} as any;\n }\n\n validateInitObject(EMOJI_LANG_PACK, pack);\n\n // important\n pack.langCode = langCode;\n this.keywordLangPacks[langCode] = pack;\n\n return this.apiManager.invokeApi('messages.getEmojiKeywordsDifference', {\n lang_code: pack.langCode,\n from_version: pack.version\n }).then((keywordsDifference) => {\n pack.version = keywordsDifference.version;\n\n const packKeywords = pack.keywords;\n const keywords = keywordsDifference.keywords;\n for(let i = 0, length = keywords.length; i < length; ++i) {\n const {keyword, emoticons} = keywords[i];\n packKeywords[keyword] = emoticons;\n }\n\n stateStorage.set({\n [storageKey]: pack\n });\n\n return pack;\n }, () => {\n return pack;\n });\n });\n }\n\n public getBothEmojiKeywords() {\n const promises: Promise[] = [\n this.getEmojiKeywords()\n ];\n\n if(this.networkerFactory.language !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(this.networkerFactory.language));\n }\n\n if(!this.recent.native) {\n promises.push(this.getRecentEmojis('native'));\n }\n\n return Promise.all(promises);\n }\n\n private indexEmojis() {\n if(!this.index) {\n this.index = new SearchIndex(undefined, 2);\n }\n\n for(const langCode in this.keywordLangPacks) {\n if(this.indexedLangPacks[langCode]) {\n continue;\n }\n\n const pack = this.keywordLangPacks[langCode];\n const keywords = pack.keywords;\n\n for(const keyword in keywords) {\n const emoticons = keywords[keyword];\n this.index.indexObject(emoticons, keyword);\n }\n\n this.indexedLangPacks[langCode] = true;\n }\n }\n\n public searchEmojis(q: string) {\n this.indexEmojis();\n\n q = q.toLowerCase().replace(/_/g, ' ');\n\n // const perf = performance.now();\n let emojis: Array;\n if(q.trim()) {\n const set = this.index.search(q);\n emojis = Array.from(set).reduce((acc, v) => acc.concat(v), []);\n } else {\n emojis = this.recent.native.concat(AppEmojiManager.POPULAR_EMOJI).slice(0, RECENT_MAX_LENGTH);\n }\n\n emojis = Array.from(new Set(emojis));\n // console.log('searchEmojis', q, 'time', performance.now() - perf);\n\n /* for(let i = 0, length = emojis.length; i < length; ++i) {\n if(emojis[i].includes(zeroWidthJoiner) && !emojis[i].includes('\\ufe0f')) {\n emojis[i] += '\\ufe0f';\n }\n } */\n\n return emojis;\n }\n\n public getRecentEmojis(type: 'custom'): Promise;\n public getRecentEmojis(type: 'native'): Promise;\n public getRecentEmojis(type: T): Promise {\n const promises = this.getRecentEmojisPromises;\n return promises[type] ??= this.appStateManager.getState().then((state) => {\n let recent: string[] | DocId[] = [];\n if(type === 'native') {\n const {recentEmoji} = state;\n recent = Array.isArray(recentEmoji) && recentEmoji.length ? recentEmoji : AppEmojiManager.POPULAR_EMOJI;\n } else {\n const {recentCustomEmoji} = state;\n recent = Array.isArray(recentCustomEmoji) && recentCustomEmoji.length ? recentCustomEmoji : [];\n }\n\n return this.recent[type] = recent as any;\n }) as any;\n }\n\n public pushRecentEmoji(emoji: AppEmoji) {\n const type: EmojiType = emoji.docId ? 'custom' : 'native';\n emoji.emoji = fixEmoji(emoji.emoji);\n // @ts-ignore\n this.getRecentEmojis(type).then((recent) => {\n const i = emoji.docId || emoji.emoji;\n indexOfAndSplice(recent, i);\n recent.unshift(i);\n recent.splice(RECENT_MAX_LENGTH, recent.length - RECENT_MAX_LENGTH);\n\n this.appStateManager.pushToState(type === 'custom' ? 'recentCustomEmoji' : 'recentEmoji', recent);\n this.rootScope.dispatchEvent('emoji_recent', emoji);\n });\n }\n\n public getCustomEmojiDocuments(docIds: DocId[]) {\n if(!docIds.length) return Promise.resolve([] as MyDocument[]);\n return this.apiManager.invokeApi('messages.getCustomEmojiDocuments', {document_id: docIds}).then((documents) => {\n return documents.map((doc) => {\n return this.appDocsManager.saveDoc(doc, {\n type: 'customEmoji',\n docId: doc.id\n });\n });\n });\n }\n\n public getCachedCustomEmojiDocuments(docIds: DocId[]) {\n return docIds.map((docId) => this.appDocsManager.getDoc(docId));\n }\n\n private setDebouncedGetCustomEmojiDocuments() {\n if(this.getCustomEmojiDocumentsPromise || !this.getCustomEmojiDocumentPromises.size) {\n return;\n }\n\n this.getCustomEmojiDocumentsPromise = pause(0).then(() => {\n const allIds = [...this.getCustomEmojiDocumentPromises.keys()];\n const promises: Promise[] = [];\n do {\n const ids = allIds.splice(0, 100);\n const promise = this.getCustomEmojiDocuments(ids).then((docs) => {\n docs.forEach((doc, idx) => {\n const docId = ids[idx];\n const deferred = this.getCustomEmojiDocumentPromises.get(docId);\n this.getCustomEmojiDocumentPromises.delete(docId);\n deferred.resolve(doc);\n });\n });\n\n promises.push(promise);\n } while(allIds.length);\n\n return Promise.all(promises);\n }).finally(() => {\n this.getCustomEmojiDocumentsPromise = undefined;\n this.setDebouncedGetCustomEmojiDocuments();\n });\n }\n\n public getCustomEmojiDocument(id: DocId) {\n let promise = this.getCustomEmojiDocumentPromises.get(id);\n if(promise) {\n return promise;\n }\n\n const doc = this.appDocsManager.getDoc(id);\n if(doc) {\n return doc;\n }\n\n promise = deferredPromise();\n this.getCustomEmojiDocumentPromises.set(id, promise);\n\n this.setDebouncedGetCustomEmojiDocuments();\n\n return promise;\n }\n\n public getCustomEmojis() {\n return this.appStickersManager.getEmojiStickers();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport type GroupCallConnectionInstance from '../calls/groupCallConnectionInstance';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {nextRandomUint} from '../../helpers/random';\nimport {DataJSON, GroupCall, GroupCallParticipant, GroupCallParticipantVideoSourceGroup, InputGroupCall, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update, Updates} from '../../layer';\nimport {logger} from '../logger';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\n\nexport type GroupCallId = GroupCall['id'];\nexport type MyGroupCall = GroupCall | InputGroupCall;\n\nexport type GroupCallConnectionType = 'main' | 'presentation';\n\nexport type JoinGroupCallJsonPayload = {\n fingerprints: {\n fingerprint: string;\n setup: string;\n hash: string;\n }[];\n pwd: string;\n ssrc: number;\n 'ssrc-groups': GroupCallParticipantVideoSourceGroup.groupCallParticipantVideoSourceGroup[];\n ufrag: string;\n};\n\nconst GET_PARTICIPANTS_LIMIT = 100;\n\nexport type GroupCallOutputSource = 'main' | 'presentation' | number;\n\nexport class AppGroupCallsManager extends AppManager {\n private log: ReturnType;\n\n private groupCalls: Map;\n private participants: Map>;\n private nextOffsets: Map;\n\n // private doNotDispatchParticipantUpdate: PeerId;\n\n protected after() {\n this.log = logger('GROUP-CALLS');\n\n this.groupCalls = new Map();\n this.participants = new Map();\n this.nextOffsets = new Map();\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateGroupCall: (update) => {\n this.saveGroupCall(update.call, update.chat_id);\n },\n\n updateGroupCallParticipants: (update) => {\n this.saveGroupCall(update.call);\n\n // this.getGroupCallFull(update.call.id, true); // ! WARNING TEMP\n\n const groupCallId = update.call.id;\n this.saveApiParticipants(groupCallId, update.participants);\n }\n });\n\n this.rootScope.addEventListener('group_call_update', (groupCall) => {\n if(groupCall._ === 'groupCallDiscarded') {\n this.participants.delete(groupCall.id);\n }\n });\n }\n\n public getCachedParticipants(groupCallId: GroupCallId) {\n let participants = this.participants.get(groupCallId);\n if(!participants) {\n this.participants.set(groupCallId, participants = new Map());\n }\n\n return participants;\n }\n\n private prepareToSavingNextOffset(groupCallId: GroupCallId) {\n const nextOffsetsMap = this.nextOffsets;\n\n const setNextOffset = (newNextOffset: string) => {\n if(nextOffsetsMap.get(groupCallId) === nextOffset) {\n nextOffsetsMap.set(groupCallId, newNextOffset);\n }\n };\n\n const nextOffset = nextOffsetsMap.get(groupCallId);\n return {\n nextOffset,\n setNextOffset\n };\n }\n\n public saveApiParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, skipCounterUpdating?: boolean) {\n const participants = this.getCachedParticipants(groupCallId);\n\n const peerId = getPeerId(participant.peer);\n\n const oldParticipant = participants.get(peerId);\n const hasLeft = participant.pFlags.left;\n if(!oldParticipant && hasLeft) {\n return;\n }\n\n // * fix missing flag\n if(!participant.pFlags.muted && !participant.pFlags.can_self_unmute) {\n participant.pFlags.can_self_unmute = true;\n }\n\n if(oldParticipant) {\n safeReplaceObject(oldParticipant, participant);\n participant = oldParticipant;\n } else {\n participants.set(peerId, participant);\n }\n\n // if(!skipCounterUpdating) {\n const groupCall = this.getGroupCall(groupCallId);\n if(groupCall?._ === 'groupCall') {\n let modified = false;\n if(hasLeft) {\n --groupCall.participants_count;\n modified = true;\n } else if(participant.pFlags.just_joined && !oldParticipant && !participant.pFlags.self) {\n ++groupCall.participants_count;\n modified = true;\n }\n\n if(modified) {\n this.rootScope.dispatchEvent('group_call_update', groupCall);\n }\n }\n // }\n\n if(hasLeft) {\n participants.delete(peerId);\n }\n\n if(oldParticipant || true/* && this.doNotDispatchParticipantUpdate !== peerId */) {\n this.rootScope.dispatchEvent('group_call_participant', {\n groupCallId,\n participant\n });\n }\n }\n\n public saveApiParticipants(groupCallId: GroupCallId, apiParticipants: GroupCallParticipant[], skipCounterUpdating?: boolean) {\n if((apiParticipants as any).saved) return;\n (apiParticipants as any).saved = true;\n apiParticipants.forEach((p) => this.saveApiParticipant(groupCallId, p, skipCounterUpdating));\n }\n\n public async editParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n this.saveApiParticipant(groupCallId, participant);\n\n const peerId = participant.pFlags.self ? NULL_PEER_ID : getPeerId(participant.peer);\n const updates = await this.apiManager.invokeApiSingle('phone.editGroupCallParticipant', {\n call: this.getGroupCallInput(groupCallId),\n participant: peerId === NULL_PEER_ID ? this.appPeersManager.getInputPeerSelf() : this.appPeersManager.getInputPeerById(peerId),\n muted: options.muted,\n volume: options.volume,\n raise_hand: options.raiseHand,\n video_paused: options.videoPaused,\n video_stopped: options.videoStopped,\n presentation_paused: options.presentationPaused\n });\n\n // do not replace with peerId because it can be null\n // if(!processUpdate) this.doNotDispatchParticipantUpdate = getPeerId(participant.peer);\n this.apiUpdatesManager.processUpdateMessage(updates);\n // if(!processUpdate) this.doNotDispatchParticipantUpdate = undefined;\n }\n\n public getGroupCall(id: GroupCallId) {\n return this.groupCalls.get(id);\n }\n\n public async getGroupCallFull(id: GroupCallId, override?: boolean): Promise {\n const call = this.getGroupCall(id);\n if(call && call._ !== 'inputGroupCall' && !override) {\n return call;\n }\n\n const limit = this.getCachedParticipants(id).size ? 0 : GET_PARTICIPANTS_LIMIT;\n return this.apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupCall',\n params: {\n call: this.getGroupCallInput(id),\n limit\n },\n processResult: (groupCall) => {\n // ? maybe I should save group call after participants so I can avoid passing the 'skipCounterUpdating' flag ?\n this.appUsersManager.saveApiUsers(groupCall.users);\n this.appChatsManager.saveApiChats(groupCall.chats);\n this.saveApiParticipants(id, groupCall.participants, true);\n const call = this.saveGroupCall(groupCall.call) as GroupCall;\n\n if(limit && this.nextOffsets.get(id) === undefined) {\n this.nextOffsets.set(id, groupCall.participants_next_offset);\n }\n\n return call;\n }\n });\n }\n\n public saveGroupCall(call: MyGroupCall, chatId?: ChatId) {\n const oldCall = this.groupCalls.get(call.id);\n const shouldUpdate = call._ !== 'inputGroupCall' && (!oldCall || oldCall._ !== 'groupCallDiscarded');\n if(oldCall) {\n if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n }\n\n call = oldCall;\n } else {\n this.groupCalls.set(call.id, call);\n }\n\n if(shouldUpdate) {\n this.rootScope.dispatchEvent('group_call_update', call as any);\n }\n\n return call;\n }\n\n public async createGroupCall(chatId: ChatId, scheduleDate?: number, title?: string) {\n const updates = await this.apiManager.invokeApi('phone.createGroupCall', {\n peer: this.appPeersManager.getInputPeerById(chatId.toPeerId(true)),\n random_id: nextRandomUint(32),\n schedule_date: scheduleDate,\n title\n });\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCall') as Update.updateGroupCall;\n return update.call;\n }\n\n public getGroupCallInput(id: GroupCallId): InputGroupCall {\n const groupCall = this.getGroupCall(id);\n return {\n _: 'inputGroupCall',\n id: groupCall.id,\n access_hash: groupCall.access_hash\n };\n }\n\n // public generateSelfParticipant(): GroupCallParticipant {\n // const mainSources = this.currentGroupCall.connections.main.sources;\n // const presentationSources = this.currentGroupCall.connections.presentation?.sources;\n // return {\n // _: 'groupCallParticipant',\n // pFlags: {\n // can_self_unmute: true,\n // self: true\n // },\n // source: mainSources.audio.source,\n // video: this.generateSelfVideo(mainSources.video),\n // presentation: presentationSources && this.generateSelfVideo(presentationSources.video, presentationSources.audio?.source),\n // date: tsNow(true),\n // peer: this.appPeersManager.getOutputPeer(rootScope.myId)\n // };\n // }\n\n public async getGroupCallParticipants(id: GroupCallId) {\n const {nextOffset, setNextOffset} = this.prepareToSavingNextOffset(id);\n\n if(nextOffset !== '') {\n await this.apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupParticipants',\n params: {\n call: this.getGroupCallInput(id),\n ids: [],\n sources: [],\n offset: nextOffset || '',\n limit: GET_PARTICIPANTS_LIMIT\n },\n processResult: (groupCallParticipants) => {\n const newNextOffset = groupCallParticipants.count === groupCallParticipants.participants.length ? '' : groupCallParticipants.next_offset;\n\n this.appChatsManager.saveApiChats(groupCallParticipants.chats);\n this.appUsersManager.saveApiUsers(groupCallParticipants.users);\n this.saveApiParticipants(id, groupCallParticipants.participants);\n\n setNextOffset(newNextOffset);\n }\n });\n }\n\n return {\n participants: this.getCachedParticipants(id),\n isEnd: this.nextOffsets.get(id) === ''\n };\n }\n\n public hangUp(id: GroupCallId, discard?: boolean | number) {\n const groupCallInput = this.getGroupCallInput(id);\n let promise: Promise;\n if(typeof(discard) === 'boolean' && discard) {\n promise = this.apiManager.invokeApi('phone.discardGroupCall', {\n call: groupCallInput\n });\n } else if(typeof(discard) === 'number') {\n promise = this.apiManager.invokeApi('phone.leaveGroupCall', {\n call: groupCallInput,\n source: discard\n });\n } else {\n promise = this.apiManager.invokeApi('phone.joinGroupCall', {\n call: groupCallInput,\n join_as: this.appPeersManager.getInputPeerSelf(),\n muted: true,\n video_stopped: true,\n params: {\n _: 'dataJSON',\n data: ''\n }\n });\n }\n\n return promise.then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public async joinGroupCall(groupCallId: GroupCallId, params: DataJSON, options: GroupCallConnectionInstance['options']) {\n const groupCallInput = this.getGroupCallInput(groupCallId);\n let promise: Promise;\n if(options.type === 'main') {\n const request: PhoneJoinGroupCall = {\n call: groupCallInput,\n join_as: this.appPeersManager.getInputPeerSelf(),\n params,\n muted: options.isMuted,\n video_stopped: !options.joinVideo\n };\n\n promise = this.apiManager.invokeApi('phone.joinGroupCall', request);\n this.log(`[api] joinGroupCall id=${groupCallId}`, request);\n } else {\n const request: PhoneJoinGroupCallPresentation = {\n call: groupCallInput,\n params\n };\n\n promise = this.apiManager.invokeApi('phone.joinGroupCallPresentation', request);\n this.log(`[api] joinGroupCallPresentation id=${groupCallId}`, request);\n }\n\n const updates = await promise;\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCallConnection') as Update.updateGroupCallConnection;\n return update;\n }\n\n public leaveGroupCallPresentation(groupCallId: GroupCallId) {\n return this.apiManager.invokeApi('phone.leaveGroupCallPresentation', {\n call: this.getGroupCallInput(groupCallId)\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputPhoto} from '../../../../layer';\nimport {MyPhoto} from '../../appPhotosManager';\n\nexport default function getPhotoInput(photo: MyPhoto): InputPhoto.inputPhoto {\n return {\n _: 'inputPhoto',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputMedia} from '../../../../layer';\nimport {MyPhoto} from '../../appPhotosManager';\nimport getPhotoInput from './getPhotoInput';\n\nexport default function getPhotoMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\n return {\n _: 'inputMediaPhoto',\n id: getPhotoInput(photo),\n ttl_seconds: 0\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Document, InputMedia} from '../../../../layer';\n\nexport default function getMediaInput(doc: Document.document): InputMedia.inputMediaDocument {\n return {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n },\n ttl_seconds: 0\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {MyDocument} from './appDocsManager';\nimport type {MyPhoto} from './appPhotosManager';\nimport type {MyTopPeer} from './appUsersManager';\nimport type {AppMessagesManager, MessageSendingParams} from './appMessagesManager';\nimport {BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessageMedia, MessagesBotResults, ReplyMarkup} from '../../layer';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport {AppManager} from './manager';\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport generateQId from './utils/inlineBots/generateQId';\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\n\nexport class AppInlineBotsManager extends AppManager {\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\n private setHash: {\n [botId: UserId]: {\n peerId: PeerId,\n time: number\n }\n } = {};\n\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\n return geo._ === 'geoPoint' ? {\n _: 'inputGeoPoint',\n lat: geo.lat,\n long: geo.long,\n accuracy_radius: geo.accuracy_radius\n } : {\n _: 'inputGeoPointEmpty'\n };\n }\n\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\n return this.apiManager.invokeApi('messages.getInlineBotResults', {\n bot: this.appUsersManager.getUserInput(botId),\n peer: this.appPeersManager.getInputPeerById(peerId),\n query,\n geo_point: geo ? this.getGeoInput(geo) : undefined,\n offset\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((botResults) => {\n const queryId = botResults.query_id;\n\n /* if(botResults.switch_pm) {\n botResults.switch_pm.rText = wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\n } */\n\n botResults.results.forEach((result) => {\n if(result._ === 'botInlineMediaResult') {\n if(result.document) {\n result.document = this.appDocsManager.saveDoc(result.document);\n }\n\n if(result.photo) {\n result.photo = this.appPhotosManager.savePhoto(result.photo);\n }\n }\n\n this.inlineResults[generateQId(queryId, result.id)] = result;\n });\n\n return botResults;\n });\n }\n\n private pushPopularBot(botId: BotId) {\n this.appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\n const botPeerId = botId.toPeerId();\n const index = topPeers.findIndex((topPeer) => topPeer.id === botPeerId);\n let topPeer: MyTopPeer;\n if(index !== -1) {\n topPeer = topPeers[index];\n } else {\n topPeer = {\n id: botPeerId,\n rating: 0\n };\n }\n\n ++topPeer.rating;\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\n\n this.appStateManager.setKeyValueToStorage('topPeersCache');\n\n // rootScope.$broadcast('inline_bots_popular')\n });\n }\n\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\n return this.appMessagesManager.startBot(botId, undefined, startParam);\n }\n\n /*\n function resolveInlineMention (username) {\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\n if (peerId.isUser()) {\n var bot = AppUsersManager.getUser(peerId)\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\n var resolvedBot = {\n username: username,\n id: peerId,\n placeholder: bot.bot_inline_placeholder\n }\n if (bot.pFlags.bot_inline_geo &&\n GeoLocationManager.isAvailable()) {\n return checkGeoLocationAccess(peerId).then(function () {\n return GeoLocationManager.getPosition().then(function (coords) {\n resolvedBot.geo = coords\n return qSync.when(resolvedBot)\n })\n })['catch'](function () {\n return qSync.when(resolvedBot)\n })\n }\n return qSync.when(resolvedBot)\n }\n }\n return $q.reject()\n }, function (error) {\n error.handled = true\n return $q.reject(error)\n })\n }\n\n function regroupWrappedResults (results, rowW, rowH) {\n if (!results ||\n !results[0] ||\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\n return\n }\n var ratios = []\n angular.forEach(results, function (result) {\n var w\n var h, doc\n var photo\n if (result._ === 'botInlineMediaResult') {\n if (doc = result.document) {\n w = result.document.w\n h = result.document.h\n }\n else if (photo = result.photo) {\n var photoSize = (photo.sizes || [])[0]\n w = photoSize && photoSize.w\n h = photoSize && photoSize.h\n }\n }else {\n w = result.w\n h = result.h\n }\n if (!w || !h) {\n w = h = 1\n }\n ratios.push(w / h)\n })\n\n var rows = []\n var curCnt = 0\n var curW = 0\n angular.forEach(ratios, function (ratio) {\n var w = ratio * rowH\n curW += w\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\n curCnt++\n } else {\n rows.push(curCnt)\n curCnt = 1\n curW = w\n }\n })\n if (curCnt) {\n rows.push(curCnt)\n }\n\n var i = 0\n var thumbs = []\n var lastRowI = rows.length - 1\n angular.forEach(rows, function (rowCnt, rowI) {\n var lastRow = rowI === lastRowI\n var curRatios = ratios.slice(i, i + rowCnt)\n var sumRatios = 0\n angular.forEach(curRatios, function (ratio) {\n sumRatios += ratio\n })\n angular.forEach(curRatios, function (ratio, j) {\n var thumbH = rowH\n var thumbW = rowW * ratio / sumRatios\n var realW = thumbH * ratio\n if (lastRow && thumbW > realW) {\n thumbW = realW\n }\n var result = results[i + j]\n result.thumbW = Math.floor(thumbW) - 2\n result.thumbH = Math.floor(thumbH) - 2\n })\n\n i += rowCnt\n })\n } */\n\n public async checkSwitchReturn(botId: BotId) {\n const bot = this.appUsersManager.getUser(botId);\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\n return;\n }\n\n const peerData = this.setHash[botId];\n if(peerData) {\n delete this.setHash[botId];\n if((Date.now() - peerData.time) < 3600e3) {\n return peerData.peerId;\n }\n }\n }\n\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\n this.appDraftsManager.setDraft(peerId, threadId, '@' + this.appPeersManager.getPeerUsername(botId.toPeerId()) + ' ' + query);\n }\n\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\n return this.apiManager.invokeApi('messages.getBotCallbackAnswer', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid),\n data: button.data\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true});\n }\n\n /* function gameButtonClick (id) {\n var message = AppMessagesManager.getMessage(id)\n var peerId = AppMessagesManager.getMessagePeer(message)\n\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\n peer: AppPeersManager.getInputPeerByID(peerId),\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\n if (typeof callbackAnswer.message === 'string' &&\n callbackAnswer.message.length) {\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\n }\n else if (typeof callbackAnswer.url === 'string') {\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\n }\n })\n } */\n\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n replyMarkup: ReplyMarkup,\n entities: MessageEntity[],\n clearDraft: true,\n geoPoint: GeoPoint\n }> = {}) {\n const inlineResult = this.inlineResults[queryAndResultIds];\n if(!inlineResult) {\n return;\n }\n\n this.pushPopularBot(botId);\n const splitted = queryAndResultIds.split('_');\n const queryID = splitted.shift();\n const resultID = splitted.join('_');\n options.viaBotId = botId;\n options.queryId = queryID;\n options.resultId = resultID;\n if(inlineResult.send_message.reply_markup) {\n options.replyMarkup = inlineResult.send_message.reply_markup;\n }\n\n if(inlineResult.send_message._ === 'botInlineMessageText') {\n options.entities = inlineResult.send_message.entities;\n this.appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\n } else {\n let caption = '';\n let inputMedia: Parameters[1], messageMedia: MessageMedia;\n const sendMessage = inlineResult.send_message;\n switch(sendMessage._) {\n case 'botInlineMessageMediaAuto': {\n caption = sendMessage.message;\n\n if(inlineResult._ === 'botInlineMediaResult') {\n const {document, photo} = inlineResult;\n if(document) {\n inputMedia = getDocumentMediaInput(document as MyDocument);\n } else {\n inputMedia = getPhotoMediaInput(photo as MyPhoto);\n }\n }\n\n break;\n }\n\n case 'botInlineMessageMediaGeo': {\n inputMedia = {\n _: 'inputMediaGeoPoint',\n geo_point: this.getGeoInput(sendMessage.geo)\n };\n\n options.geoPoint = sendMessage.geo;\n\n break;\n }\n\n case 'botInlineMessageMediaVenue': {\n inputMedia = {\n _: 'inputMediaVenue',\n geo_point: this.getGeoInput(sendMessage.geo),\n title: sendMessage.title,\n address: sendMessage.address,\n provider: sendMessage.provider,\n venue_id: sendMessage.venue_id,\n venue_type: sendMessage.venue_type\n };\n\n options.geoPoint = sendMessage.geo;\n\n break;\n }\n\n case 'botInlineMessageMediaContact': {\n inputMedia = {\n _: 'inputMediaContact',\n phone_number: sendMessage.phone_number,\n first_name: sendMessage.first_name,\n last_name: sendMessage.last_name,\n vcard: sendMessage.vcard\n };\n\n break;\n }\n\n case 'botInlineMessageMediaInvoice': {\n // const photo = sendMessage.photo;\n // inputMedia = {\n // _: 'inputMediaInvoice',\n // description: sendMessage.description,\n // title: sendMessage.title,\n // photo: photo && {\n // _: 'inputWebDocument',\n // attributes: photo.attributes,\n // mime_type: photo.mime_type,\n // size: photo.size,\n // url: photo.url\n // },\n // invoice: undefined,\n // payload: undefined,\n // provider: undefined,\n // provider_data: undefined,\n // start_param: undefined\n // };\n\n messageMedia = {\n _: 'messageMediaInvoice',\n title: sendMessage.title,\n description: sendMessage.description,\n photo: sendMessage.photo,\n currency: sendMessage.currency,\n total_amount: sendMessage.total_amount,\n pFlags: {\n shipping_address_requested: sendMessage.pFlags.shipping_address_requested,\n test: sendMessage.pFlags.test\n },\n start_param: undefined\n };\n\n break;\n }\n }\n\n if(!inputMedia && messageMedia) {\n inputMedia = {\n _: 'messageMediaPending',\n messageMedia\n };\n }\n\n this.appMessagesManager.sendOther(peerId, inputMedia, options);\n }\n }\n\n /* function checkGeoLocationAccess (botID) {\n var key = 'bot_access_geo' + botID\n return Storage.get(key).then(function (geoAccess) {\n if (geoAccess && geoAccess.granted) {\n return true\n }\n return ErrorService.confirm({\n type: 'BOT_ACCESS_GEO_INLINE'\n }).then(function () {\n var setHash = {}\n setHash[key] = {granted: true, time: tsNow()}\n Storage.set(setHash)\n return true\n }, function () {\n var setHash = {}\n setHash[key] = {denied: true, time: tsNow()}\n Storage.set(setHash)\n return $q.reject()\n })\n })\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MESSAGE_ID_INCREMENT} from './utils/messageId';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport class AppMessagesIdsManager {\n private tempNum = 0;\n\n public generateTempMessageId(messageId: number) {\n const num = ++this.tempNum;\n return generateMessageId(messageId) + (num & (MESSAGE_ID_INCREMENT - 1));\n }\n}\n","export default function splitStringByLength(str: string, maxLength: number) {\n if(str.length < maxLength) return [str];\n let length = 0, lastSliceStartIndex = 0, arrayIndex = 0;\n const delimiter = ' ';// '\\n';\n const out: string[] = [];\n\n const cut = (end?: number) => {\n let part = str.slice(lastSliceStartIndex, end);\n const _arrayIndex = arrayIndex++;\n if(part.length > maxLength) {\n const overflowPart = part.slice(maxLength);\n const splitted = splitStringByLength(overflowPart, maxLength);\n splitted.forEach((part) => {\n out[arrayIndex++] = part;\n });\n\n part = part.slice(0, maxLength);\n }\n\n lastSliceStartIndex = end;\n length = 0;\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\n };\n\n let lastIndex = 0;\n do {\n let index = str.indexOf(delimiter, lastIndex);\n if(index === -1) {\n if(lastIndex !== (str.length - 1)) {\n cut();\n }\n\n break;\n }\n\n index += delimiter.length;\n\n const partLength = index - lastIndex;\n if((length + partLength) > maxLength) {\n cut(length);\n }\n\n lastIndex = index;\n length += partLength;\n } while(true);\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {TabState} from '../mtproto/mtprotoworker';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\n\ntype Tab = {\n source: MessageEventSource,\n state: TabState\n};\n\nexport class AppTabsManager {\n private tabs: Map;\n\n constructor() {\n this.tabs = new Map();\n }\n\n public start() {\n const port = MTProtoMessagePort.getInstance();\n\n port.addEventListener('tabState', (state, source) => {\n const tab = this.tabs.get(source);\n tab.state = state;\n });\n }\n\n public getTabs() {\n return [...this.tabs.values()].filter((tab) => !!tab.state);\n }\n\n public addTab(source: MessageEventSource) {\n const tab: Tab = {\n source,\n state: undefined\n };\n\n this.tabs.set(source, tab);\n }\n\n public deleteTab(source: MessageEventSource) {\n this.tabs.delete(source);\n }\n}\n\nconst appTabsManager = new AppTabsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appTabsManager = appTabsManager);\nexport default appTabsManager;\n","import {InputDocument} from '../../../../layer';\nimport type {MyDocument} from '../../appDocsManager';\n\nexport default function getDocumentInput(doc: MyDocument): InputDocument {\n return {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n };\n}\n","export default function setBooleanFlag(obj: T, key: keyof T, value: boolean) {\n // @ts-ignore\n if(value) obj[key] = true;\n else delete obj[key];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {ApiFileManager} from '../mtproto/apiFileManager';\nimport type {MediaSize} from '../../helpers/mediaSize';\nimport type {Progress} from './appDownloadManager';\nimport type {VIDEO_MIME_TYPE} from '../../environment/videoMimeTypesSupport';\nimport LazyLoadQueueBase from '../../components/lazyLoadQueueBase';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport tsNow from '../../helpers/tsNow';\nimport {randomLong} from '../../helpers/random';\nimport {Chat, ChatFull, Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageFwdHeader, MessageMedia, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MethodDeclMap, NotifyPeer, PeerNotifySettings, PhotoSize, SendMessageAction, Update, Photo, Updates, ReplyMarkup, InputPeer, InputPhoto, InputDocument, InputGeoPoint, WebPage, GeoPoint, ReportReason, MessagesGetDialogs, InputChannel, InputDialogPeer, ReactionCount, MessagePeerReaction, MessagesSearchCounter, Peer, MessageReactions, Document, InputFile, Reaction, ForumTopic as MTForumTopic, MessagesForumTopics, MessagesGetReplies, MessagesGetHistory, MessagesAffectedHistory, UrlAuthResult} from '../../layer';\nimport {ArgumentTypes, InvokeApiOptions} from '../../types';\nimport {logger, LogTypes} from '../logger';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport DialogsStorage, {GLOBAL_FOLDER_ID} from '../storages/dialogs';\nimport {ChatRights} from './appChatsManager';\nimport {MyDocument} from './appDocsManager';\nimport {MyPhoto} from './appPhotosManager';\nimport {getFileNameByLocation} from '../../helpers/fileName';\nimport DEBUG from '../../config/debug';\nimport SlicedArray, {Slice, SliceEnd} from '../../helpers/slicedArray';\nimport {FOLDER_ID_ALL, GENERAL_TOPIC_ID, MUTE_UNTIL, NULL_PEER_ID, REAL_FOLDER_ID, REPLIES_HIDDEN_CHANNEL_ID, REPLIES_PEER_ID, SERVICE_PEER_ID, THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n// import telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport {getMiddleware} from '../../helpers/middleware';\nimport assumeType from '../../helpers/assumeType';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport splitStringByLength from '../../helpers/string/splitStringByLength';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {AppManager} from './manager';\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport mergeEntities from '../richTextProcessor/mergeEntities';\nimport parseEntities from '../richTextProcessor/parseEntities';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport filterMessagesByInputFilter from './utils/messages/filterMessagesByInputFilter';\nimport ctx from '../../environment/ctx';\nimport {getEnvironment} from '../../environment/utils';\nimport getDialogIndex from './utils/dialogs/getDialogIndex';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\nimport getDocumentInputFileName from './utils/docs/getDocumentInputFileName';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport noop from '../../helpers/noop';\nimport appTabsManager from './appTabsManager';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport getAlbumText from './utils/messages/getAlbumText';\nimport pause from '../../helpers/schedulers/pause';\nimport makeError from '../../helpers/makeError';\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\nimport getDocumentInput from './utils/docs/getDocumentInput';\nimport reactionsEqual from './utils/reactions/reactionsEqual';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\nimport {BroadcastEvents} from '../rootScope';\nimport setBooleanFlag from '../../helpers/object/setBooleanFlag';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\n\n// console.trace('include');\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\n\nexport type SendFileDetails = {\n file: File | Blob | MyDocument,\n} & Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n strippedBytes: PhotoSize.photoStrippedSize['bytes'],\n spoiler: boolean\n}>;\n\nexport type HistoryStorage = {\n count: number | null,\n history: SlicedArray,\n\n maxId?: number,\n readPromise?: Promise,\n readMaxId?: number,\n readOutboxMaxId?: number,\n triedToReadMaxId?: number,\n\n maxOutId?: number,\n replyMarkup?: Exclude\n};\n\nexport type HistoryResult = {\n count: number,\n history: number[],\n isEnd: ReturnType['getEnds']>,\n offsetIdOffset?: number,\n};\n\nexport type Dialog = MTDialog.dialog;\nexport type ForumTopic = MTForumTopic.forumTopic;\n\nexport type MyMessage = Message.message | Message.messageService;\nexport type MyInputMessagesFilter = 'inputMessagesFilterEmpty'\n | 'inputMessagesFilterPhotos'\n | 'inputMessagesFilterPhotoVideo'\n | 'inputMessagesFilterVideo'\n | 'inputMessagesFilterDocument'\n | 'inputMessagesFilterVoice'\n | 'inputMessagesFilterRoundVoice'\n | 'inputMessagesFilterRoundVideo'\n | 'inputMessagesFilterMusic'\n | 'inputMessagesFilterUrl'\n | 'inputMessagesFilterMyMentions'\n | 'inputMessagesFilterChatPhotos'\n | 'inputMessagesFilterPinned';\n\nexport type PinnedStorage = Partial<{\n promise: Promise,\n count: number,\n maxId: number\n}>;\nexport type MessagesStorage = Map & {peerId: PeerId, type: MessagesStorageType, key: MessagesStorageKey};\nexport type MessagesStorageType = 'scheduled' | 'history' | 'grouped';\nexport type MessagesStorageKey = `${PeerId}_${MessagesStorageType}`;\n\nexport type MyMessageActionType = Message.messageService['action']['_'];\n\ntype PendingAfterMsg = Partial;\n\ntype MapValueType = A extends Map ? V : never;\n\nexport type BatchUpdates = {\n 'messages_reactions': AppMessagesManager['batchUpdateReactions'],\n 'messages_views': AppMessagesManager['batchUpdateViews']\n};\n\ntype PendingMessageDetails = {\n peerId: PeerId,\n tempId: number,\n threadId: number,\n storage: MessagesStorage,\n sequential?: boolean\n};\n\nconst processAfter = (cb: () => void) => {\n // setTimeout(cb, 0);\n cb();\n};\n\nconst UPDATE_STICKERSET_ORDER = true;\n\nexport type MessageSendingParams = Partial<{\n threadId: number,\n replyToMsgId: number,\n scheduleDate: number,\n silent: boolean,\n sendAsPeerId: number,\n}>;\n\nexport class AppMessagesManager extends AppManager {\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\n private groupedMessagesStorage: {[groupId: string]: MessagesStorage}; // will be used for albums\n private scheduledMessagesStorage: {[peerId: PeerId]: MessagesStorage};\n private historiesStorage: {\n [peerId: PeerId]: HistoryStorage\n };\n private threadsStorage: {\n [peerId: PeerId]: {\n [threadId: string]: HistoryStorage\n }\n };\n private searchesStorage: {\n [peerId: PeerId]: Partial<{\n [inputFilter in MyInputMessagesFilter]: {\n count?: number,\n history: number[]\n }\n }>\n };\n private pinnedMessages: {[key: string]: PinnedStorage};\n\n private threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\n private threadsToReplies: {\n [peerId_threadId: string]: string;\n };\n\n private pendingByRandomId: {\n [randomId: string]: PendingMessageDetails\n } = {};\n private pendingByMessageId: {[mid: string]: Long} = {};\n private pendingAfterMsgs: {[peerId: PeerId]: PendingAfterMsg} = {};\n public pendingTopMsgs: {[peerId: PeerId]: number} = {};\n private tempFinalizeCallbacks: {\n [tempId: string]: {\n [callbackName: string]: Partial<{\n deferred: CancellablePromise,\n callback: (message: MyMessage) => Promise\n }>\n }\n } = {};\n\n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\n\n private needSingleMessages: Map>> = new Map();\n private fetchSingleMessagesPromise: Promise;\n private extendedMedia: Map>> = new Map();\n\n private maxSeenId = 0;\n\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\n\n private newDialogsHandlePromise: Promise;\n private newDialogsToHandle: Map}> = new Map();\n public newUpdatesAfterReloadToHandle: {[key: string]: Set} = {};\n\n private notificationsHandlePromise: number;\n private notificationsToHandle: {[key: string]: {\n fwdCount: number,\n fromId: PeerId,\n topMessage?: MyMessage\n }} = {};\n\n private reloadConversationsPromise: Promise;\n private reloadConversationsPeers: Map}> = new Map();\n\n public log = logger('MESSAGES', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\n\n private groupedTempId = 0;\n\n private typings: {[key: string]: {action: SendMessageAction, timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[key: string]: SlicedArray} = {};\n private goToNextMentionPromises: {[key: string]: Promise} = {};\n\n private batchUpdates: {\n [k in keyof BatchUpdates]?: {\n callback: BatchUpdates[k],\n batch: ArgumentTypes[0]\n }\n } = {};\n private batchUpdatesDebounced: () => Promise;\n\n private uploadFilePromises: {[fileName: string]: CancellablePromise};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateMessageID: this.onUpdateMessageId,\n\n updateNewDiscussionMessage: this.onUpdateNewMessage,\n updateNewMessage: this.onUpdateNewMessage,\n updateNewChannelMessage: this.onUpdateNewMessage,\n\n updateDialogUnreadMark: this.onUpdateDialogUnreadMark,\n\n updateEditMessage: this.onUpdateEditMessage,\n updateEditChannelMessage: this.onUpdateEditMessage,\n\n updateMessageReactions: this.onUpdateMessageReactions,\n\n updateReadChannelDiscussionInbox: this.onUpdateReadHistory,\n updateReadChannelDiscussionOutbox: this.onUpdateReadHistory,\n updateReadHistoryInbox: this.onUpdateReadHistory,\n updateReadHistoryOutbox: this.onUpdateReadHistory,\n updateReadChannelInbox: this.onUpdateReadHistory,\n updateReadChannelOutbox: this.onUpdateReadHistory,\n\n updateChannelReadMessagesContents: this.onUpdateReadMessagesContents,\n updateReadMessagesContents: this.onUpdateReadMessagesContents,\n\n updateChannelAvailableMessages: this.onUpdateChannelAvailableMessages,\n\n updateDeleteMessages: this.onUpdateDeleteMessages,\n updateDeleteChannelMessages: this.onUpdateDeleteMessages,\n\n updateChannel: this.onUpdateChannel,\n\n updateChannelReload: this.onUpdateChannelReload,\n\n updateChannelMessageViews: this.onUpdateChannelMessageViews,\n\n updateServiceNotification: this.onUpdateServiceNotification,\n\n updatePinnedMessages: this.onUpdatePinnedMessages,\n updatePinnedChannelMessages: this.onUpdatePinnedMessages,\n\n updateNotifySettings: this.onUpdateNotifySettings,\n\n updateNewScheduledMessage: this.onUpdateNewScheduledMessage,\n\n updateDeleteScheduledMessages: this.onUpdateDeleteScheduledMessages,\n\n updateMessageExtendedMedia: this.onUpdateMessageExtendedMedia\n });\n\n // ! Invalidate notify settings, can optimize though\n this.rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\n let filterFunc: (dialog: typeof dialogs[0]) => boolean;\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => this.appPeersManager.isBroadcast(dialog.peerId);\n else filterFunc = (dialog) => this.appPeersManager.isAnyGroup(dialog.peerId);\n\n dialogs\n .filter(filterFunc)\n .forEach((dialog) => {\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n });\n });\n\n this.rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\n msgs.forEach(({peerId, mid, isScheduled}) => {\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n if(!message) return;\n message.media = {\n _: 'messageMediaWebPage',\n webpage: this.appWebPagesManager.getCachedWebPage(id)\n };\n\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n });\n });\n\n this.rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(dialog) {\n dialog.draft = draft;\n\n let drop = false;\n if(!draft && !getServerMessageId(dialog.top_message)) {\n this.dialogsStorage.dropDialog(peerId);\n drop = true;\n } else {\n this.dialogsStorage.generateIndexForDialog(dialog);\n this.dialogsStorage.pushDialog({dialog});\n }\n\n this.rootScope.dispatchEvent('dialog_draft', {\n peerId,\n dialog,\n drop,\n draft\n });\n } else if(threadId) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(!chat) {\n this.reloadConversation(peerId);\n } else if((chat as Chat.channel).pFlags.forum) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n }\n } else {\n this.reloadConversation(peerId);\n }\n });\n\n this.rootScope.addEventListener('poll_update', ({poll}) => {\n const set = this.appPollsManager.pollToMessages[poll.id];\n if(set) {\n for(const key of set) {\n const [peerId, mid] = key.split('_');\n\n const message = this.getMessageByPeer(peerId.toPeerId(), +mid);\n if(message) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n }\n }\n });\n\n // * clear forum cache\n this.rootScope.addEventListener('chat_toggle_forum', ({chatId, enabled}) => {\n const peerId = chatId.toPeerId(true);\n if(!enabled) {\n delete this.threadsStorage[peerId];\n\n for(const key in this.pinnedMessages) {\n if(+key === peerId && key.startsWith(peerId + '_')) {\n delete this.pinnedMessages[key];\n }\n }\n }\n });\n\n this.batchUpdatesDebounced = debounce(() => {\n for(const event in this.batchUpdates) {\n const details = this.batchUpdates[event as keyof BatchUpdates];\n delete this.batchUpdates[event as keyof BatchUpdates];\n\n // @ts-ignore\n const result = details.callback(details.batch);\n if(result && (!(result instanceof Array) || result.length)) {\n // @ts-ignore\n rootScope.dispatchEvent(event as keyof BatchUpdates, result);\n }\n }\n }, 33, false, true);\n\n return this.appStateManager.getState().then((state) => {\n if(state.maxSeenMsgId) {\n this.maxSeenId = state.maxSeenMsgId;\n }\n });\n }\n\n public clear = (init?: boolean) => {\n if(this.middleware) {\n this.middleware.clean();\n } else {\n this.middleware = getMiddleware();\n this.uploadFilePromises = {};\n }\n\n this.messagesStorageByPeerId = {};\n this.groupedMessagesStorage = {};\n this.scheduledMessagesStorage = {};\n this.historiesStorage = {};\n this.threadsStorage = {};\n this.searchesStorage = {};\n this.pinnedMessages = {};\n this.threadsServiceMessagesIdsStorage = {};\n this.threadsToReplies = {};\n\n this.dialogsStorage && this.dialogsStorage.clear(init);\n this.filtersStorage && this.filtersStorage.clear(init);\n };\n\n public getInputEntities(entities: MessageEntity[]) {\n const sendEntites = copy(entities);\n sendEntites.forEach((entity) => {\n if(entity._ === 'messageEntityMentionName') {\n (entity as any as MessageEntity.inputMessageEntityMentionName)._ = 'inputMessageEntityMentionName';\n (entity as any as MessageEntity.inputMessageEntityMentionName).user_id = this.appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n }\n\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: MyMessage) => Promise) {\n const finalize = this.tempFinalizeCallbacks[tempId] ??= {};\n const obj = finalize[callbackName] ??= {deferred: deferredPromise()};\n\n obj.callback = callback;\n\n return obj.deferred;\n }\n\n public editMessage(message: any, text: string, options: Partial<{\n noWebPage: true,\n newMedia: any,\n scheduleDate: number,\n entities: MessageEntity[]\n }> = {}): Promise {\n /* if(!this.canEditMessage(messageId)) {\n return Promise.reject({type: 'MESSAGE_EDIT_FORBIDDEN'});\n } */\n\n const {mid, peerId} = message;\n\n if(message.pFlags.is_outgoing) {\n return this.invokeAfterMessageIsSent(mid, 'edit', (message) => {\n // this.log('invoke editMessage callback', message);\n return this.editMessage(message, text, options);\n });\n }\n\n const entities = options.entities || [];\n if(text) {\n text = parseMarkdown(text, entities);\n }\n\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\n return this.apiManager.invokeApi('messages.editMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: message.id,\n message: text,\n media: options.newMedia,\n entities: entities.length ? this.getInputEntities(entities) : undefined,\n no_webpage: options.noWebPage,\n schedule_date\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n this.log.error('editMessage error:', error);\n\n if(error && error.type === 'MESSAGE_NOT_MODIFIED') {\n error.handled = true;\n return;\n }\n if(error && error.type === 'MESSAGE_EMPTY') {\n error.handled = true;\n }\n return Promise.reject(error);\n });\n }\n\n public async sendText(peerId: PeerId, text: string, options: MessageSendingParams & Partial<{\n entities: MessageEntity[],\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n }> = {}): Promise {\n if(!text.trim()) {\n return;\n }\n\n options.entities ??= [];\n\n // this.checkSendOptions(options);\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n const config = await this.apiManager.getConfig();\n const MAX_LENGTH = config.message_length_max;\n const splitted = splitStringByLength(text, MAX_LENGTH);\n text = splitted[0];\n if(splitted.length > 1) {\n if(options.webPage?._ === 'webPage' && !text.includes(options.webPage.url)) {\n delete options.webPage;\n }\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n const entities = options.entities;\n if(!options.viaBotId) {\n text = parseMarkdown(text, entities);\n // entities = mergeEntities(entities, parseEntities(text));\n }\n\n let sendEntites = this.getInputEntities(entities);\n if(!sendEntites.length) {\n sendEntites = undefined;\n }\n\n const message = this.generateOutgoingMessage(peerId, options);\n message.entities = entities;\n message.message = text;\n\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n const isChannel = this.appPeersManager.isChannel(peerId);\n\n if(options.webPage) {\n message.media = {\n _: 'messageMediaWebPage',\n webpage: options.webPage\n };\n }\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError();\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n let apiPromise: any;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMessage', {\n no_webpage: options.noWebPage,\n peer: this.appPeersManager.getInputPeerById(peerId),\n message: text,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n entities: sendEntites,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate || undefined,\n silent: options.silent,\n send_as: sendAs,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }, sentRequestOptions);\n }\n\n /* function is(value: any, condition: boolean): value is T {\n return condition;\n } */\n\n // this.log('sendText', message.mid);\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates: Updates) => {\n // this.log('sendText sent', message.mid);\n // if(is(updates, updates._ === 'updateShortSentMessage')) {\n if(updates._ === 'updateShortSentMessage') {\n // assumeType(updates);\n\n // * fix copying object with promise\n const promise = message.promise;\n delete message.promise;\n const newMessage = copy(message);\n defineNotNumerableProperties(message, ['promise']);\n message.promise = promise;\n\n newMessage.date = updates.date;\n newMessage.id = updates.id;\n newMessage.media = updates.media;\n newMessage.entities = updates.entities;\n this.wrapMessageEntities(newMessage);\n if(updates.pFlags.out) {\n newMessage.pFlags.out = true;\n }\n\n // * override with new updates\n updates = {\n _: 'updates',\n users: [],\n chats: [],\n seq: 0,\n date: undefined,\n updates: [{\n _: 'updateMessageID',\n random_id: message.random_id,\n id: newMessage.id\n }, {\n _: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),\n message: newMessage,\n pts: updates.pts,\n pts_count: updates.pts_count\n }]\n };\n } else if((updates as Updates.updates).updates) {\n (updates as Updates.updates).updates.forEach((update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n // this.reloadConversation(peerId);\n\n // setTimeout(() => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n // }, 5000);\n message.promise.resolve();\n }, (error: ApiError) => {\n toggleError(error);\n message.promise.reject(error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n threadId: options.threadId,\n clearDraft: options.clearDraft,\n sequential: true\n });\n\n const promises: ReturnType[] = [message.promise];\n for(let i = 1; i < splitted.length; ++i) {\n promises.push(this.sendText(peerId, splitted[i], options));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public sendFile(peerId: PeerId, options: MessageSendingParams & SendFileDetails & Partial<{\n isRoundMessage: boolean,\n isVoiceMessage: boolean,\n isGroupedItem: boolean,\n isMedia: boolean,\n\n groupId: string,\n caption: string,\n entities: MessageEntity[],\n background: boolean,\n clearDraft: boolean,\n noSound: boolean,\n\n waveform: Uint8Array,\n\n // ! only for internal use\n processAfter?: typeof processAfter\n }>) {\n const file = options.file;\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n // this.checkSendOptions(options);\n\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let attachType: 'document' | 'audio' | 'video' | 'voice' | 'photo', apiFileName: string;\n\n const fileType = 'mime_type' in file ? file.mime_type : file.type;\n const fileName = file instanceof File ? file.name : '';\n const isDocument = !(file instanceof File) && !(file instanceof Blob);\n let caption = options.caption || '';\n\n this.log('sendFile', file, fileType);\n\n const entities = options.entities || [];\n if(caption) {\n caption = parseMarkdown(caption, entities);\n }\n\n const attributes: DocumentAttribute[] = [];\n\n const isPhoto = getEnvironment().IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\n\n const strippedPhotoSize: PhotoSize.photoStrippedSize = options.strippedBytes && {\n _: 'photoStrippedSize',\n bytes: options.strippedBytes,\n type: 'i'\n };\n\n let photo: MyPhoto, document: MyDocument;\n\n let actionName: Extract;\n if(isDocument) { // maybe it's a sticker or gif\n attachType = 'document';\n apiFileName = '';\n } else if(fileType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(fileType) >= 0) {\n attachType = 'audio';\n apiFileName = 'audio.' + (fileType.split('/')[1] === 'ogg' ? 'ogg' : 'mp3');\n actionName = 'sendMessageUploadAudioAction';\n\n if(options.isVoiceMessage) {\n attachType = 'voice';\n message.pFlags.media_unread = true;\n }\n\n const attribute: DocumentAttribute.documentAttributeAudio = {\n _: 'documentAttributeAudio',\n pFlags: {\n voice: options.isVoiceMessage || undefined\n },\n waveform: options.waveform,\n duration: options.duration || 0\n };\n\n attributes.push(attribute);\n } else if(!options.isMedia) {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n } else if(isPhoto) {\n attachType = 'photo';\n apiFileName = 'photo.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadPhotoAction';\n\n const photoSize = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: THUMB_TYPE_FULL,\n location: null,\n size: file.size\n } as PhotoSize.photoSize;\n\n photo = {\n _: 'photo',\n id: '' + message.id,\n sizes: [photoSize],\n w: options.width,\n h: options.height\n } as any;\n\n if(strippedPhotoSize) {\n photo.sizes.unshift(strippedPhotoSize);\n }\n\n const cacheContext = this.thumbsStorage.getCacheContext(photo, photoSize.type);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n\n photo = this.appPhotosManager.savePhoto(photo);\n } else if(getEnvironment().VIDEO_MIME_TYPES_SUPPORTED.has(fileType as VIDEO_MIME_TYPE)) {\n attachType = 'video';\n apiFileName = 'video.mp4';\n actionName = 'sendMessageUploadVideoAction';\n\n const videoAttribute: DocumentAttribute.documentAttributeVideo = {\n _: 'documentAttributeVideo',\n pFlags: {\n round_message: options.isRoundMessage || undefined,\n supports_streaming: true\n },\n duration: options.duration,\n w: options.width,\n h: options.height\n };\n\n attributes.push(videoAttribute);\n\n // * must follow after video attribute\n if(options.noSound &&\n file.size > (10 * 1024) &&\n file.size < (10 * 1024 * 1024)) {\n attributes.push({\n _: 'documentAttributeAnimated'\n });\n }\n } else {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n }\n\n attributes.push({_: 'documentAttributeFilename', file_name: fileName || apiFileName});\n\n if((['document', 'video', 'audio', 'voice'] as (typeof attachType)[]).indexOf(attachType) !== -1 && !isDocument) {\n const thumbs: PhotoSize[] = [];\n document = {\n _: 'document',\n id: '' + message.id,\n duration: options.duration,\n attributes,\n w: options.width,\n h: options.height,\n thumbs,\n mime_type: fileType,\n size: file.size\n } as any;\n\n if(options.objectURL) {\n const cacheContext = this.thumbsStorage.getCacheContext(document);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL;\n }\n\n let thumb: PhotoSize.photoSize;\n if(isPhoto) {\n attributes.push({\n _: 'documentAttributeImageSize',\n w: options.width,\n h: options.height\n });\n\n thumb = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: THUMB_TYPE_FULL,\n size: file.size\n };\n } else if(attachType === 'video') {\n if(options.thumb) {\n thumb = {\n _: 'photoSize',\n w: options.thumb.size.width,\n h: options.thumb.size.height,\n type: 'local-thumb',\n size: options.thumb.blob.size\n };\n\n const thumbCacheContext = this.thumbsStorage.getCacheContext(document, thumb.type);\n thumbCacheContext.downloaded = thumb.size;\n thumbCacheContext.url = options.thumb.url;\n }\n }\n\n if(thumb) {\n thumbs.push(thumb);\n }\n\n if(strippedPhotoSize) {\n thumbs.unshift(strippedPhotoSize);\n }\n\n /* if(thumbs.length) {\n const thumb = thumbs[0] as PhotoSize.photoSize;\n const docThumb = appPhotosManager.getDocumentCachedThumb(document.id);\n docThumb.downloaded = thumb.size;\n docThumb.url = thumb.url;\n } */\n\n document = this.appDocsManager.saveDoc(document);\n }\n\n this.log('sendFile', attachType, apiFileName, file.type, options);\n\n const sentDeferred = deferredPromise();\n // sentDeferred.cancel = () => {\n // const error = new Error('Download canceled');\n // error.name = 'AbortError';\n // sentDeferred.reject(error);\n\n // if(uploadPromise?.cancel) {\n // uploadPromise.cancel();\n // }\n // };\n\n const media: MessageMedia = isDocument ? undefined : {\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\n pFlags: {},\n // preloader,\n photo,\n document\n };\n\n if(media) {\n defineNotNumerableProperties(media as any, ['promise']);\n (media as any).promise = sentDeferred;\n\n if(options.spoiler) {\n (media as MessageMedia.messageMediaPhoto).pFlags.spoiler = true;\n }\n }\n\n message.entities = entities;\n message.message = caption;\n message.media = isDocument ? {\n _: 'messageMediaDocument',\n pFlags: {},\n document: file\n } as MessageMedia.messageMediaDocument : media;\n\n const uploadingFileName = !isDocument ? getFileNameForUpload(file) : undefined;\n message.uploadingFileName = uploadingFileName;\n\n if(uploadingFileName) {\n this.uploadFilePromises[uploadingFileName] = sentDeferred;\n }\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n let uploaded = false,\n uploadPromise: ReturnType = null;\n\n message.send = () => {\n if(isDocument) {\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: getDocumentInput(file)\n };\n\n sentDeferred.resolve(inputMedia);\n } else if(file instanceof File || file instanceof Blob) {\n const load = () => {\n if(!uploaded || message.error) {\n uploaded = false;\n\n uploadPromise = this.apiFileManager.upload({file, fileName: uploadingFileName});\n uploadPromise.catch((err) => {\n if(!uploaded) {\n this.log('cancelling upload', media);\n\n this.cancelPendingMessage(message.random_id);\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n sentDeferred.reject(err);\n }\n });\n\n uploadPromise.addNotifyListener((progress: Progress) => {\n /* if(DEBUG) {\n this.log('upload progress', progress);\n } */\n\n const percents = Math.max(1, Math.floor(100 * progress.done / progress.total));\n if(actionName) {\n this.setTyping(peerId, {_: actionName, progress: percents | 0}, undefined, options.threadId);\n }\n sentDeferred.notifyAll(progress);\n });\n\n sentDeferred.notifyAll({done: 0, total: file.size});\n }\n\n let thumbUploadPromise: typeof uploadPromise;\n if(attachType === 'video' && options.objectURL && options.thumb?.blob) {\n thumbUploadPromise = this.apiFileManager.upload({file: options.thumb.blob});\n }\n\n uploadPromise && uploadPromise.then(async(inputFile) => {\n /* if(DEBUG) {\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\n } */\n\n inputFile.name = apiFileName;\n uploaded = true;\n let inputMedia: InputMedia;\n switch(attachType) {\n case 'photo':\n inputMedia = {\n _: 'inputMediaUploadedPhoto',\n file: inputFile,\n pFlags: {\n spoiler: options.spoiler || undefined\n }\n };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument',\n file: inputFile,\n mime_type: fileType,\n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' || undefined,\n spoiler: options.spoiler || undefined\n // nosound_video: options.noSound ? true : undefined\n },\n attributes\n };\n }\n\n if(thumbUploadPromise) {\n try {\n const inputFile = await thumbUploadPromise;\n (inputMedia as InputMedia.inputMediaUploadedDocument).thumb = inputFile;\n } catch(err) {\n this.log.error('sendFile thumb upload error:', err);\n }\n }\n\n sentDeferred.resolve(inputMedia);\n }, (error: ApiError) => {\n toggleError(error);\n throw error;\n });\n\n return sentDeferred;\n };\n\n if(options.isGroupedItem) {\n load();\n } else {\n this.sendSmthLazyLoadQueue.push({\n load\n });\n }\n }\n\n return sentDeferred;\n };\n\n this.beforeMessageSending(message, {\n isGroupedItem: options.isGroupedItem,\n isScheduled: !!options.scheduleDate || undefined,\n threadId: options.threadId,\n clearDraft: options.clearDraft,\n processAfter: options.processAfter\n });\n\n if(!options.isGroupedItem) {\n sentDeferred.then((inputMedia) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n\n return this.apiManager.invokeApi('messages.sendMedia', {\n background: options.background,\n peer: this.appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n message: caption,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n entities,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n if(attachType === 'photo' &&\n error.code === 400 &&\n (error.type === 'PHOTO_INVALID_DIMENSIONS' ||\n error.type === 'PHOTO_SAVE_FILE_INVALID')) {\n error.handled = true;\n attachType = 'document';\n message.send();\n return;\n }\n\n toggleError(error);\n throw error;\n });\n });\n\n sentDeferred.then(message.promise.resolve, message.promise.reject);\n }\n\n const ret: {\n message: typeof message,\n promise: typeof sentDeferred\n } = {\n message\n } as any;\n\n defineNotNumerableProperties(ret, ['promise']);\n ret.promise = sentDeferred;\n\n return ret;\n }\n\n public async sendAlbum(peerId: PeerId, options: MessageSendingParams & {\n isMedia?: boolean,\n entities?: MessageEntity[],\n caption?: string,\n sendFileDetails: SendFileDetails[],\n clearDraft?: boolean\n }) {\n // this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(options.sendFileDetails.length === 1) {\n return this.sendFile(peerId, {...options, ...options.sendFileDetails[0]});\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let caption = options.caption || '';\n let entities = options.entities || [];\n if(caption) {\n caption = parseMarkdown(caption, entities);\n }\n\n this.log('sendAlbum', options);\n\n const groupId = '' + ++this.groupedTempId;\n\n const callbacks: Array<() => void> = [];\n const processAfter = (cb: () => void) => {\n callbacks.push(cb);\n };\n\n const messages = options.sendFileDetails.map((details, idx) => {\n const o: Parameters[1] = {\n isGroupedItem: true,\n isMedia: options.isMedia,\n scheduleDate: options.scheduleDate,\n silent: options.silent,\n replyToMsgId,\n threadId: options.threadId,\n sendAsPeerId: options.sendAsPeerId,\n groupId,\n processAfter,\n ...details\n };\n\n if(idx === 0) {\n o.caption = caption;\n o.entities = entities;\n // o.replyToMsgId = replyToMsgId;\n }\n\n return this.sendFile(peerId, o).message;\n });\n\n if(options.clearDraft) {\n callbacks.push(() => {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n });\n }\n\n callbacks.forEach((callback) => {\n callback();\n });\n\n // * test pending\n // return;\n\n const toggleError = (message: Message.message, error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\n const invoke = (multiMedia: InputSingleMedia[]) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n\n const deferred = deferredPromise();\n this.sendSmthLazyLoadQueue.push({\n load: () => {\n return this.apiManager.invokeApi('messages.sendMultiMedia', {\n peer: inputPeer,\n multi_media: multiMedia,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n }, (error: ApiError) => {\n messages.forEach((message) => toggleError(message, error));\n deferred.reject(error);\n });\n }\n });\n\n return deferred;\n };\n\n const promises: Promise[] = messages.map((message) => {\n return (message.send() as Promise).then((inputMedia) => {\n return Promise.all([\n inputMedia,\n this.apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n })\n ]);\n })\n .then(([originalInputMedia, messageMedia]) => {\n let inputMedia: InputMedia;\n if(messageMedia._ === 'messageMediaPhoto') {\n const photo = this.appPhotosManager.savePhoto(messageMedia.photo);\n inputMedia = getPhotoMediaInput(photo);\n } else if(messageMedia._ === 'messageMediaDocument') {\n const doc = this.appDocsManager.saveDoc(messageMedia.document);\n inputMedia = getDocumentMediaInput(doc);\n }\n\n // copy original flags\n const copyProperties: (keyof InputMedia.inputMediaPhoto)[] = [\n 'pFlags',\n 'ttl_seconds'\n ];\n\n copyProperties.forEach((property) => {\n // @ts-ignore\n inputMedia[property] = originalInputMedia[property] ?? inputMedia[property];\n });\n\n const inputSingleMedia: InputSingleMedia = {\n _: 'inputSingleMedia',\n media: inputMedia,\n random_id: message.random_id,\n message: caption,\n entities\n };\n\n // * only 1 caption for all inputs\n if(caption) {\n caption = '';\n entities = [];\n }\n\n return inputSingleMedia;\n }).catch((err: ApiError) => {\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, err);\n throw err;\n });\n });\n\n return Promise.all(promises).then((inputs) => {\n return invoke(inputs.filter(Boolean));\n });\n }\n\n public sendContact(peerId: PeerId, contactPeerId: PeerId) {\n return this.sendOther(peerId, this.appUsersManager.getContactMediaInput(contactPeerId));\n }\n\n public sendOther(\n peerId: PeerId,\n inputMedia: InputMedia | {_: 'messageMediaPending', messageMedia: MessageMedia},\n options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n geoPoint: GeoPoint\n }> = {}\n ) {\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n // this.checkSendOptions(options);\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let media: MessageMedia;\n switch(inputMedia._) {\n case 'inputMediaPoll': {\n const pollId = '' + message.id;\n inputMedia.poll.id = pollId;\n this.appPollsManager.savePoll(inputMedia.poll, {\n _: 'pollResults',\n flags: 4,\n total_voters: 0,\n pFlags: {},\n recent_voters: []\n });\n\n const {poll, results} = this.appPollsManager.getPoll(pollId);\n media = {\n _: 'messageMediaPoll',\n poll,\n results\n };\n\n break;\n }\n\n case 'inputMediaPhoto': {\n media = {\n _: 'messageMediaPhoto',\n photo: this.appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id)\n };\n break;\n }\n\n case 'inputMediaDocument': {\n const doc = this.appDocsManager.getDoc((inputMedia.id as InputDocument.inputDocument).id);\n /* if(doc.sticker && doc.stickerSetInput) {\n appStickersManager.pushPopularSticker(doc.id);\n } */\n media = {\n _: 'messageMediaDocument',\n document: doc\n };\n break;\n }\n\n case 'inputMediaContact': {\n media = {\n _: 'messageMediaContact',\n phone_number: inputMedia.phone_number,\n first_name: inputMedia.first_name,\n last_name: inputMedia.last_name,\n user_id: inputMedia.user_id ?? '0',\n vcard: inputMedia.vcard\n };\n break;\n }\n\n case 'inputMediaGeoPoint': {\n media = {\n _: 'messageMediaGeo',\n geo: options.geoPoint\n };\n break;\n }\n\n case 'inputMediaVenue': {\n media = {\n _: 'messageMediaVenue',\n geo: options.geoPoint,\n title: inputMedia.title,\n address: inputMedia.address,\n provider: inputMedia.provider,\n venue_id: inputMedia.venue_id,\n venue_type: inputMedia.venue_type\n };\n break;\n }\n\n case 'messageMediaPending': {\n media = (inputMedia as any).messageMedia;\n break;\n }\n }\n\n message.media = media;\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined;\n let apiPromise: Promise;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMedia', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n media: inputMedia as InputMedia,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n message: '',\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }, sentRequestOptions);\n }\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates) => {\n if(updates.updates) {\n updates.updates.forEach((update: Update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n toggleError(error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n threadId: options.threadId,\n clearDraft: options.clearDraft,\n sequential: true\n });\n\n return message.promise;\n }\n\n /* private checkSendOptions(options: Partial<{\n scheduleDate: number\n }>) {\n if(options.scheduleDate) {\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(options.scheduleDate <= minTimestamp) {\n delete options.scheduleDate;\n }\n }\n } */\n\n private beforeMessageSending(message: Message.message, options: Pick & Partial<{\n isGroupedItem: boolean,\n isScheduled: boolean,\n clearDraft: boolean,\n sequential: boolean,\n processAfter?: (cb: () => void) => void\n }> = {}) {\n const messageId = message.id;\n const peerId = this.getMessagePeer(message);\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n message.storageKey = storage.key;\n const callbacks: Array<() => void> = [];\n if(options.isScheduled) {\n // if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\n callbacks.push(() => {\n this.rootScope.dispatchEvent('scheduled_new', message);\n });\n } else {\n /* if(options.threadId && this.threadsStorage[peerId]) {\n delete this.threadsStorage[peerId][options.threadId];\n } */\n const storages: HistoryStorage[] = [\n this.getHistoryStorage(peerId),\n options.threadId ? this.getHistoryStorage(peerId, options.threadId) : undefined\n ];\n\n for(const storage of storages) {\n if(storage) {\n storage.history.unshift(messageId);\n }\n }\n\n this.saveMessages([message], {storage, isOutgoing: true});\n this.setDialogTopMessage(message);\n\n if(options.threadId) {\n const forumTopic = this.dialogsStorage.getForumTopic(peerId, options.threadId);\n if(forumTopic) {\n this.setDialogTopMessage(message, forumTopic);\n }\n }\n\n callbacks.push(() => {\n this.rootScope.dispatchEvent('history_append', {storageKey: storage.key, message});\n });\n }\n\n const pending: PendingMessageDetails = this.pendingByRandomId[message.random_id] = {\n peerId,\n tempId: messageId,\n threadId: options.threadId,\n storage,\n sequential: options.sequential\n };\n\n this.pendingTopMsgs[peerId] = messageId;\n\n if(!options.isGroupedItem && message.send) {\n callbacks.push(() => {\n if(options.clearDraft) {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n }\n\n message.send();\n });\n }\n\n if(callbacks.length) {\n (options.processAfter || processAfter)(() => {\n for(const callback of callbacks) {\n callback();\n }\n });\n }\n\n return pending;\n }\n\n private generateOutgoingMessage(peerId: PeerId, options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n groupId: string,\n replyMarkup: ReplyMarkup,\n }>) {\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n let postAuthor: string;\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\n if(isBroadcast) {\n const chat = this.appPeersManager.getPeer(peerId) as Chat.channel;\n if(chat.pFlags.signatures) {\n const user = this.appUsersManager.getSelf();\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n postAuthor = fullName;\n }\n }\n\n const message: Message.message = {\n _: 'message',\n id: this.generateTempMessageId(peerId),\n from_id: options.sendAsPeerId ? this.appPeersManager.getOutputPeer(options.sendAsPeerId) : this.generateFromId(peerId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n post_author: postAuthor,\n pFlags: this.generateFlags(peerId),\n date: options.scheduleDate || (tsNow(true) + this.timeManager.getServerTimeOffset()),\n message: '',\n grouped_id: options.groupId,\n random_id: randomLong(),\n reply_to: this.generateReplyHeader(peerId, options.replyToMsgId, options.threadId),\n via_bot_id: options.viaBotId,\n reply_markup: options.replyMarkup,\n replies: this.generateReplies(peerId),\n views: isBroadcast && 1,\n pending: true\n };\n\n defineNotNumerableProperties(message, ['send', 'promise']);\n if(options.groupId === undefined) {\n message.promise = deferredPromise();\n }\n\n return message;\n }\n\n private generateReplyHeader(peerId: PeerId, replyToMsgId: number, replyToTopId?: number) {\n const isForum = this.appPeersManager.isForum(peerId);\n if(isForum && !replyToTopId) {\n const originalMessage = this.getMessageByPeer(peerId, replyToMsgId);\n if(originalMessage) {\n replyToTopId = getMessageThreadId(originalMessage, true);\n }\n }\n\n const header: MessageReplyHeader = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId,\n pFlags: {}\n };\n\n if(replyToTopId && isForum && GENERAL_TOPIC_ID !== replyToTopId) {\n header.pFlags.forum_topic = true;\n }\n\n if(replyToTopId && header.reply_to_msg_id !== replyToTopId) {\n header.reply_to_top_id = replyToTopId;\n }\n\n return header;\n }\n\n private generateReplies(peerId: PeerId) {\n let replies: MessageReplies.messageReplies;\n if(this.appPeersManager.isBroadcast(peerId)) {\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n if(channelFull?.linked_chat_id) {\n replies = {\n _: 'messageReplies',\n flags: 1,\n pFlags: {\n comments: true\n },\n channel_id: channelFull.linked_chat_id,\n replies: 0,\n replies_pts: 0\n };\n }\n }\n\n return replies;\n }\n\n /**\n * Generate correct from_id according to anonymous or broadcast\n */\n private generateFromId(peerId: PeerId) {\n if(this.appPeersManager.isAnyChat(peerId) && (this.appPeersManager.isBroadcast(peerId) || this.isAnonymousSending(peerId))) {\n return undefined;\n } else {\n return this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId());\n }\n }\n\n private generateFlags(peerId: PeerId) {\n const pFlags: Message.message['pFlags'] = {};\n const fromId = this.appUsersManager.getSelf().id;\n if(peerId !== fromId) {\n pFlags.out = true;\n\n if(!this.appPeersManager.isChannel(peerId) && !this.appUsersManager.isBot(peerId)) {\n pFlags.unread = true;\n }\n }\n\n if(this.appPeersManager.isBroadcast(peerId)) {\n pFlags.post = true;\n }\n\n return pFlags;\n }\n\n private generateForwardHeader(peerId: PeerId, originalMessage: Message.message) {\n const myId = this.appUsersManager.getSelf().id.toPeerId();\n const fromId = originalMessage.fromId;\n if(fromId === myId && originalMessage.peerId === myId && !originalMessage.fwd_from) {\n return;\n }\n\n const fwdHeader: MessageFwdHeader.messageFwdHeader = {\n _: 'messageFwdHeader',\n flags: 0,\n date: originalMessage.date\n };\n\n let isUserHidden = false;\n if(originalMessage.fwd_from) {\n fwdHeader.from_id = originalMessage.fwd_from.from_id;\n fwdHeader.from_name = originalMessage.fwd_from.from_name;\n fwdHeader.post_author = originalMessage.fwd_from.post_author;\n } else {\n fwdHeader.post_author = originalMessage.post_author;\n\n if(fromId.isUser()) {\n const userFull = this.appProfileManager.getCachedFullUser(fromId.toUserId());\n if(userFull?.private_forward_name) {\n fwdHeader.from_name = userFull.private_forward_name;\n isUserHidden = true;\n }\n }\n\n if(!isUserHidden) {\n fwdHeader.from_id = this.appPeersManager.getOutputPeer(fromId);\n }\n }\n\n if(this.appPeersManager.isBroadcast(originalMessage.peerId)) {\n if(originalMessage.post_author) {\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n fwdHeader.channel_post = originalMessage.id;\n }\n\n if(peerId === myId && !isUserHidden) {\n fwdHeader.saved_from_msg_id = originalMessage.id;\n fwdHeader.saved_from_peer = this.appPeersManager.getOutputPeer(originalMessage.peerId);\n }\n\n return fwdHeader;\n }\n\n public generateFakeAvatarMessage(peerId: PeerId, photo: Photo) {\n const maxId = Number.MAX_SAFE_INTEGER;\n const message: Message.messageService = {\n _: 'messageService',\n pFlags: {},\n action: {\n _: 'messageActionChannelEditPhoto',\n photo\n },\n id: maxId,\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n mid: maxId,\n peerId,\n date: (photo as Photo.photo).date,\n fromId: peerId\n };\n\n this.getHistoryMessagesStorage(peerId).set(maxId, message);\n return message;\n }\n\n public getUploadPromise(uploadFileName: string) {\n return this.uploadFilePromises[uploadFileName];\n }\n\n public isAnonymousSending(peerId: PeerId): boolean {\n if(!peerId.isAnyChat()) {\n return false;\n }\n\n const chat = this.appPeersManager.getPeer(peerId);\n return (chat as Chat.channel).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(\n message: MyMessage,\n dialog: MTDialog.dialog | ForumTopic = this.getDialogOnly(message.peerId)\n ) {\n if(!dialog) {\n return;\n }\n\n dialog.top_message = message.mid;\n\n const historyStorage = this.getHistoryStorage(message.peerId, dialog._ === 'forumTopic' ? dialog.id : undefined);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\n }\n\n public cancelPendingMessage(randomId: string) {\n const pendingData = this.pendingByRandomId[randomId];\n\n /* if(DEBUG) {\n this.log('cancelPendingMessage', randomId, pendingData);\n } */\n\n if(pendingData) {\n const {peerId, tempId, storage} = pendingData;\n const historyStorage = this.getHistoryStorage(peerId);\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: [tempId],\n pts: undefined,\n pts_count: undefined\n });\n\n historyStorage.history.delete(tempId);\n\n delete this.pendingByRandomId[randomId];\n storage.delete(tempId);\n\n return true;\n }\n\n return false;\n }\n\n /* public async refreshConversations() {\n const limit = 200, outDialogs: Dialog[] = [];\n for(let folderId = 0; folderId < 2; ++folderId) {\n let offsetDate = 0;\n for(;;) {\n const {dialogs, isEnd} = await this.getTopMessages(limit, folderId, offsetDate);\n\n if(dialogs.length) {\n outDialogs.push(...dialogs as Dialog[]);\n const dialog = dialogs[dialogs.length - 1];\n\n // * get peerId and mid manually, because dialog can be migrated peer and it won't be saved\n const peerId = getPeerId(dialog.peer);\n const mid = generateMessageId(dialog.top_message);\n offsetDate = this.getMessageByPeer(peerId, mid).date;\n\n if(!offsetDate) {\n console.error('refreshConversations: got no offsetDate', dialog);\n break;\n }\n }\n\n if(isEnd) {\n break;\n }\n }\n }\n\n let obj: {[peerId: string]: Dialog} = {};\n outDialogs.forEach((dialog) => {\n obj[dialog.peerId] = dialog;\n });\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n\n return outDialogs;\n } */\n\n public async fillConversations(folderId = GLOBAL_FOLDER_ID): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(folderId)) {\n const result = await this.getTopMessages({limit: 100, folderId});\n if(!middleware() || result.isEnd) {\n break;\n }\n }\n }\n\n /* public async getConversationsAll(query = '', folderId = 0) {\n const limit = 200, outDialogs: Dialog[] = [];\n for(; folderId < 2; ++folderId) {\n let offsetIndex = 0;\n for(;;) {\n const {dialogs} = await appMessagesManager.getConversations(query, offsetIndex, limit, folderId).promise;\n\n if(dialogs.length) {\n outDialogs.push(...dialogs);\n offsetIndex = dialogs[dialogs.length - 1].index || 0;\n } else {\n break;\n }\n }\n }\n\n return outDialogs;\n } */\n\n public getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId && !this.appChatsManager.isForum(peerId.toChatId())) {\n const chatHistoryStorage = this.getHistoryStorage(peerId);\n const readMaxId = Math.max(chatHistoryStorage.readMaxId ?? 0, historyStorage.readMaxId);\n const message = this.getMessageByPeer(peerId, historyStorage.maxId); // usually message is missing, so pFlags.out won't be there anyway\n return !message?.pFlags?.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n } else {\n const message = this.getMessageByPeer(peerId, historyStorage.maxId);\n const readMaxId = peerId.isUser() ? Math.max(historyStorage.readMaxId, historyStorage.readOutboxMaxId) : historyStorage.readMaxId;\n // readMaxId can be 4294967295 (0)\n return !message?.pFlags?.out && readMaxId < historyStorage.maxId && getServerMessageId(readMaxId) ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages({limit, folderId}: {\n limit: number,\n folderId: number\n }) {\n // const dialogs = this.dialogsStorage.getFolder(folderId);\n const offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n let offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n if(offsetDate) {\n offsetIndex = offsetDate * 0x10000;\n offsetDate += this.timeManager.getServerTimeOffset();\n }\n\n const useLimit = 100;\n const middleware = this.middleware.get();\n const peerId = this.dialogsStorage.isFilterIdForForum(folderId) ? folderId : undefined;\n\n const processResult = (result: MessagesDialogs | MessagesForumTopics) => {\n if(!middleware() || result._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', result);\n }\n\n // can reset pinned order here\n if(!peerId && !offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!peerId && !offsetDate) {\n // telegramMeWebManager.setAuthorized(true);\n this.appDraftsManager.addMissedDialogs();\n }\n\n this.appUsersManager.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n this.saveMessages(result.messages);\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const setFolderId: REAL_FOLDER_ID = folderId === GLOBAL_FOLDER_ID ? FOLDER_ID_ALL : folderId as REAL_FOLDER_ID;\n const saveGlobalOffset = !!peerId || folderId === GLOBAL_FOLDER_ID;\n const items: Array =\n (result as MessagesDialogs.messagesDialogsSlice).dialogs as Dialog[] ||\n (result as MessagesForumTopics).topics as ForumTopic[];\n forEachReverse(items, (dialog) => {\n if(!dialog) {\n return;\n }\n\n // const d = Object.assign({}, dialog);\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\n if(!peerId) {\n (dialog as Dialog).folder_id ??= setFolderId;\n }\n\n this.dialogsStorage.saveDialog({\n dialog,\n ignoreOffsetDate: true,\n saveGlobalOffset\n });\n\n if(dialog.peerId === undefined) {\n this.log.error('bugged dialog?', dialog);\n debugger;\n return;\n }\n\n if(!maxSeenIdIncremented &&\n !this.appPeersManager.isChannel(dialog.peerId || this.appPeersManager.getPeerId(dialog.peer))) {\n this.incrementMaxSeenId(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n\n // if(!folderId && !dialog.folder_id) {\n // this.lolSet.add(dialog.peerId);\n // }\n\n if(offsetIndex && getDialogIndex(dialog) > offsetIndex) {\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\n hasPrepend = true;\n }\n\n // ! это может случиться, если запрос идёт не по папке 0, а по 1. почему-то read'ов нет\n // ! в итоге, чтобы получить 1 диалог, делается первый запрос по папке 0, потом запрос для архивных по папке 1, и потом ещё перезагрузка архивного диалога\n if(!peerId && !getServerMessageId(dialog.read_inbox_max_id) && !getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs.set(dialog.peerId, {dialog: dialog as Dialog});\n\n this.log.error('noIdsDialogs', dialog, params);\n } else if(dialog.top_message) { // * fix sending status\n const topMessage = this.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(topMessage) {\n this.setMessageUnreadByDialog(topMessage, dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n });\n\n if(noIdsDialogs.size) {\n // setTimeout(() => { // test bad situation\n const peerIds = [...noIdsDialogs.keys()];\n const promises = peerIds.map((peerId) => this.reloadConversation(peerId));\n Promise.all(promises).then(() => {\n this.rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\n\n for(let i = 0; i < peerIds.length; ++i) {\n const peerId = peerIds[i];\n this.rootScope.dispatchEvent('dialog_unread', {\n peerId,\n dialog: this.getDialogOnly(peerId)\n });\n }\n });\n // }, 10e3);\n }\n\n const count = (result as MessagesDialogs.messagesDialogsSlice).count;\n\n // exclude empty draft dialogs\n const folderDialogs = this.dialogsStorage.getFolderDialogs(folderId, false);\n let dialogsLength = 0;\n for(let i = 0, length = folderDialogs.length; i < length; ++i) {\n const dialog = folderDialogs[i];\n if(getServerMessageId(dialog.top_message)) {\n ++dialogsLength;\n } else {\n this.log.error('something strange with dialog', dialog);\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */\n !count ||\n dialogsLength >= count ||\n !items.length;\n if(isEnd) {\n this.dialogsStorage.setDialogsLoaded(folderId, true);\n }\n\n if(hasPrepend) {\n this.scheduleHandleNewDialogs();\n } else {\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map());\n }\n\n const dialogs = items;\n const slicedDialogs = limit === useLimit ? dialogs : dialogs.slice(0, limit);\n return {\n isEnd: isEnd && slicedDialogs[slicedDialogs.length - 1] === dialogs[dialogs.length - 1],\n count,\n dialogs: slicedDialogs\n };\n };\n\n let promise: Promise>, params: any;\n if(peerId) {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'channels.getForumTopics',\n params: params = {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n limit: useLimit,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_topic: 0\n },\n options: {\n // timeout: APITIMEOUT,\n noErrorBox: true\n },\n processResult: (result) => {\n result = this.dialogsStorage.processTopics(peerId, result);\n return processResult(result);\n }\n });\n } else {\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'messages.getDialogs',\n params: params = {\n folder_id: folderId,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\n limit: useLimit,\n hash: '0'\n },\n options: {\n // timeout: APITIMEOUT,\n noErrorBox: true\n },\n processResult\n });\n }\n\n return promise;\n }\n\n public async forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: MessageSendingParams & Partial<{\n withMyScore: true,\n dropAuthor: boolean,\n dropCaptions: boolean\n }> = {}) {\n delete options.replyToMsgId;\n delete options.threadId;\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n mids = mids.slice().sort((a, b) => a - b);\n\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\n if(originalMessage.pFlags.is_outgoing) { // this can happen when forwarding a changelog\n this.sendText(peerId, originalMessage.message, {\n entities: originalMessage.entities,\n scheduleDate: options.scheduleDate,\n silent: options.silent\n });\n\n mids.splice(i--, 1);\n --length;\n }\n }\n\n if(!mids.length) {\n return Promise.resolve();\n }\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\n\n if(options.dropCaptions) {\n options.dropAuthor = true;\n }\n\n const groups: {\n [groupId: string]: {\n tempId: string,\n messages: Message.message[]\n }\n } = {};\n\n const newMids: number[] = [];\n const newMessages = mids.map((mid) => {\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\n newMids.push(message.id);\n\n const keys: Array = [\n 'entities',\n 'media'\n // 'reply_markup'\n ];\n\n if(!options.dropAuthor) {\n message.fwd_from = this.generateForwardHeader(peerId, originalMessage);\n keys.push('views', 'forwards');\n\n if(message.fwd_from?.from_name && peerId === this.appPeersManager.peerId) {\n delete message.from_id;\n }\n }\n\n if(!options.dropCaptions || !originalMessage.media) {\n keys.push('message');\n }\n\n const replyToMid = originalMessage.reply_to?.reply_to_msg_id;\n const replyToMessageIdx = mids.indexOf(replyToMid);\n if(replyToMid && replyToMessageIdx !== -1) {\n const newReplyToMid = newMids[replyToMessageIdx];\n message.reply_to = {\n _: 'messageReplyHeader',\n reply_to_msg_id: newReplyToMid\n };\n\n /* this.invokeAfterMessageIsSent(newReplyToMid, 'reply', async(originalMessage) => {\n message.reply_to.reply_to_msg_id = originalMessage.mid;\n }); */\n }\n\n keys.forEach((key) => {\n // @ts-ignore\n message[key] = copy(originalMessage[key]);\n });\n\n const document = (message.media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n const types: MyDocument['type'][] = ['round', 'voice'];\n if(types.includes(document.type)) {\n (message as MyMessage).pFlags.media_unread = true;\n }\n\n if(document.sticker && !this.rootScope.premium) {\n const effectThumb = getStickerEffectThumb(document);\n if(effectThumb) {\n (message.media as MessageMedia.messageMediaDocument).pFlags.nopremium = true;\n }\n }\n }\n\n if(originalMessage.grouped_id) {\n const group = groups[originalMessage.grouped_id] ??= {tempId: '' + ++this.groupedTempId, messages: []};\n group.messages.push(message);\n }\n\n return message;\n });\n\n for(const groupId in groups) {\n const group = groups[groupId];\n if(group.messages.length > 1) {\n group.messages.forEach((message) => {\n message.grouped_id = group.tempId;\n });\n }\n }\n\n newMessages.forEach((message) => {\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n sequential: true\n });\n });\n\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const promise = /* true ? Promise.resolve() : */this.apiManager.invokeApiAfter('messages.forwardMessages', {\n from_peer: this.appPeersManager.getInputPeerById(fromPeerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n random_id: newMessages.map((message) => message.random_id),\n to_peer: this.appPeersManager.getInputPeerById(peerId),\n with_my_score: options.withMyScore,\n silent: options.silent,\n schedule_date: options.scheduleDate,\n drop_author: options.dropAuthor,\n drop_media_captions: options.dropCaptions,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }, sentRequestOptions).then((updates) => {\n this.log('forwardMessages updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n this.onMessagesSendError(newMessages, error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.forwardMessages(peerId, fromPeerId, overflowMids, options));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public generateEmptyMessage(mid: number): Message.message | Message.messageService {\n return undefined;\n // return {\n // _: 'messageEmpty',\n // id: getServerMessageId(mid),\n // mid,\n // deleted: true,\n // pFlags: {}\n // };\n }\n\n private onMessagesSendError(messages: Message.message[], error?: ApiError) {\n messages.forEach((message) => {\n if(message.error === error) {\n return;\n }\n\n if(error) {\n message.error = error;\n this.rootScope.dispatchEvent('message_error', {storageKey: message.storageKey, tempId: message.mid, error});\n\n const dialog = this.getDialogOnly(message.peerId);\n if(dialog) {\n this.rootScope.dispatchEvent('dialog_unread', {peerId: message.peerId, dialog});\n }\n } else {\n delete message.error;\n }\n });\n }\n\n public getMessagesStorageByKey(key: MessagesStorageKey) {\n const s = key.split('_');\n const peerId: PeerId = +s[0];\n const type: MessagesStorageType = s[1] as any;\n return type === 'scheduled' ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n }\n\n public getMessageFromStorage(storage: MessagesStorage | MessagesStorageKey, mid: number) {\n if(typeof(storage) === 'string') {\n storage = this.getMessagesStorageByKey(storage);\n }\n\n return storage && storage.get(mid)/* || this.generateEmptyMessage(mid) */;\n }\n\n private createMessageStorage(peerId: PeerId, type: MessagesStorageType) {\n const storage: MessagesStorage = new Map() as any;\n storage.peerId = peerId;\n storage.type = type;\n storage.key = `${peerId}_${type}`;\n\n /* let num = 0;\n Object.defineProperty(storage, 'num', {\n get: () => ++num,\n set: (_num: number) => num = _num,\n enumerable: false\n });\n\n Object.defineProperty(storage, 'generateIndex', {\n value: (message: any) => {\n if(message.index === undefined) {\n message.index = (message.date * 0x10000) + (storage.num & 0xFFFF);\n }\n },\n enumerable: false\n }); */\n\n return storage;\n }\n\n public getHistoryMessagesStorage(peerId: PeerId) {\n return this.messagesStorageByPeerId[peerId] ??= this.createMessageStorage(peerId, 'history');\n }\n\n public getMessagesStorage(key: MessagesStorageKey | MessagesStorage): MessagesStorage {\n if(typeof(key) === 'object') {\n return key;\n } else {\n return this.getMessagesStorageByKey(key);\n }\n }\n\n public getMessageById(messageId: number) {\n for(const peerId in this.messagesStorageByPeerId) {\n if(this.appPeersManager.isChannel(peerId.toPeerId())) {\n continue;\n }\n\n const message = this.messagesStorageByPeerId[peerId].get(messageId);\n if(message) {\n return message;\n }\n }\n\n return this.getMessageFromStorage(null, messageId);\n }\n\n public getMessageByPeer(peerId: PeerId, messageId: number) {\n if(!peerId) {\n return this.getMessageById(messageId);\n }\n\n return this.getMessageFromStorage(this.getHistoryMessagesStorage(peerId), messageId);\n }\n\n public getMessagePeer(message: any): PeerId {\n const toId = message.peer_id && this.appPeersManager.getPeerId(message.peer_id) || NULL_PEER_ID;\n\n return toId;\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogsStorage.getDialogOnly(peerId);\n }\n\n public cantForwardDeleteMids(storageKey: MessagesStorageKey, mids: number[]) {\n const storage = this.getMessagesStorage(storageKey);\n let cantForward = !mids.length, cantDelete = !mids.length;\n for(const mid of mids) {\n const message = this.getMessageFromStorage(storage, mid);\n if(!cantForward) {\n cantForward = !this.canForward(message);\n }\n\n if(!cantDelete) {\n cantDelete = !this.canDeleteMessage(message);\n }\n\n if(cantForward && cantDelete) break;\n }\n\n return {cantForward, cantDelete};\n }\n\n public reloadConversationOrTopic(peerId: PeerId, threadId?: number) {\n if(threadId) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n this.reloadConversation(peerId);\n }\n }\n\n public reloadConversation(inputPeer?: PeerId | InputPeer): CancellablePromise;\n public reloadConversation(inputPeer: PeerId | InputPeer) {\n let promise: CancellablePromise;\n if(inputPeer !== undefined) {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n this.log.warn('reloadConversation', peerId);\n\n let obj = this.reloadConversationsPeers.get(peerId);\n if(obj) {\n promise = obj.promise;\n }\n\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n this.reloadConversationsPeers.set(peerId, obj = {\n inputDialogPeer: this.appPeersManager.getInputDialogPeerById(inputPeer),\n promise\n });\n }\n\n if(this.reloadConversationsPromise) {\n return promise || this.reloadConversationsPromise;\n }\n\n this.reloadConversationsPromise = pause(0).then(() => {\n const inputDialogPeers: InputDialogPeer[] = [];\n const promises: {[peerId: string]: typeof promise} = {};\n for(const [peerId, {inputDialogPeer, promise}] of this.reloadConversationsPeers) {\n inputDialogPeers.push(inputDialogPeer);\n promises[peerId] = promise;\n }\n\n const fullfillLeft = () => {\n for(const peerId in promises) {\n this.reloadConversationsPeers.delete(+peerId);\n promises[peerId].resolve(undefined);\n }\n };\n\n const invoke = async() => {\n for(;;) {\n const result = await this.apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers});\n const currentState = this.apiUpdatesManager.updatesState;\n const {state} = result;\n if(currentState.pts && currentState.pts !== state.pts) {\n await pause(500);\n continue;\n }\n\n return result;\n }\n };\n\n return invoke().then((result) => {\n for(const peerId in promises) {\n this.reloadConversationsPeers.delete(+peerId);\n }\n\n this.dialogsStorage.applyDialogs(result);\n\n result.dialogs.forEach((dialog) => {\n const peerId = dialog.peerId;\n if(peerId) {\n promises[peerId].resolve(dialog as Dialog);\n delete promises[peerId];\n }\n });\n }, noop).then(() => {\n fullfillLeft();\n\n this.reloadConversationsPromise = null;\n if(this.reloadConversationsPeers.size) {\n this.reloadConversation();\n }\n });\n });\n\n return promise || this.reloadConversationsPromise;\n }\n\n private doFlushHistory(peerId: PeerId, just_clear?: boolean, revoke?: boolean, threadId?: number): Promise {\n let promise: Promise;\n const processResult = (affectedHistory: MessagesAffectedHistory) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n return true;\n }\n\n return this.doFlushHistory(peerId, just_clear, revoke, threadId);\n };\n\n if(!threadId) {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'messages.deleteHistory',\n params: {\n just_clear,\n revoke,\n peer: this.appPeersManager.getInputPeerById(peerId),\n max_id: 0\n },\n processResult\n });\n } else {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'channels.deleteTopicHistory',\n params: {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n top_msg_id: getServerMessageId(threadId)\n },\n processResult\n });\n }\n\n return promise;\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean, threadId?: number) {\n if(this.appPeersManager.isChannel(peerId) && !threadId) {\n const promise = this.getHistory(peerId, 0, 1);\n\n const historyResult = await promise;\n\n const channelId = peerId.toChatId();\n const maxId = historyResult.history[0] || 0;\n return this.apiManager.invokeApiSingle('channels.deleteHistory', {\n channel: this.appChatsManager.getChannelInput(channelId),\n max_id: getServerMessageId(maxId)\n }).then((bool) => {\n if(bool) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelAvailableMessages',\n channel_id: channelId,\n available_min_id: maxId\n });\n }\n\n return bool;\n });\n }\n\n return this.doFlushHistory(peerId, justClear, revoke, threadId).then(() => {\n if(!threadId) {\n this.flushStoragesByPeerId(peerId);\n }\n\n if(justClear) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog: this.getDialogOnly(peerId)});\n } else {\n const key = this.getTypingKey(peerId, threadId);\n delete this.notificationsToHandle[key];\n delete this.typings[key];\n\n if(!threadId) {\n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId, threadId);\n }\n });\n }\n\n private flushStoragesByPeerId(peerId: PeerId) {\n [\n this.historiesStorage,\n this.threadsStorage,\n this.searchesStorage,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach((s) => {\n delete s[peerId];\n });\n\n for(const key in this.pinnedMessages) {\n if(+key === peerId || key.startsWith(peerId + '_')) {\n delete this.pinnedMessages[key];\n }\n }\n\n const needSingleMessages = this.needSingleMessages.get(peerId);\n if(needSingleMessages) {\n for(const [mid, promise] of needSingleMessages) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n\n needSingleMessages.clear();\n }\n\n [\n this.messagesStorageByPeerId,\n this.scheduledMessagesStorage\n ].forEach((s) => {\n const ss = s[peerId];\n if(ss) {\n ss.clear();\n }\n });\n\n this.dialogsStorage.flushForumTopicsCache(peerId);\n }\n\n public hidePinnedMessages(peerId: PeerId) {\n return Promise.all([\n this.appStateManager.getState(),\n this.getPinnedMessage(peerId)\n ])\n .then(([state, pinned]) => {\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\n this.rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\n });\n }\n\n public getPinnedMessagesKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n public getPinnedMessage(peerId: PeerId, threadId?: number) {\n const p = this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)] ??= {};\n if(p.promise) return p.promise;\n else if(p.maxId) return Promise.resolve(p);\n\n return p.promise = this.getSearch({\n peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: 0,\n limit: 1,\n threadId\n }).then((result) => {\n p.count = result.count;\n p.maxId = result.history[0]?.mid;\n return p;\n }).finally(() => {\n delete p.promise;\n });\n }\n\n public getPinnedMessagesCount(peerId: PeerId, threadId?: number) {\n return this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)]?.count;\n }\n\n public getPinnedMessagesMaxId(peerId: PeerId, threadId?: number) {\n return this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)]?.maxId;\n }\n\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\n return this.apiManager.invokeApi('messages.updatePinnedMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n unpin,\n silent,\n pm_oneside,\n id: getServerMessageId(mid)\n }).then((updates) => {\n // this.log('pinned updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public unpinAllMessages(peerId: PeerId): Promise {\n return this.apiManager.invokeApiSingle('messages.unpinAllMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId)\n }).then((affectedHistory) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n const storage = this.getHistoryMessagesStorage(peerId);\n storage.forEach((message) => {\n if((message as Message.message).pFlags.pinned) {\n delete (message as Message.message).pFlags.pinned;\n }\n });\n\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\n delete this.pinnedMessages[this.getPinnedMessagesKey(peerId)];\n\n return true;\n }\n\n return this.unpinAllMessages(peerId);\n });\n }\n\n public getAlbumText(grouped_id: string) {\n const group = this.groupedMessagesStorage[grouped_id];\n return getAlbumText(Array.from(group.values()) as Message.message[]);\n }\n\n public getGroupsFirstMessage(message: Message.message) {\n if(!message?.grouped_id) return message;\n\n const storage = this.groupedMessagesStorage[message.grouped_id];\n let minMid = Number.MAX_SAFE_INTEGER;\n for(const [mid, message] of storage) {\n if(message.mid < minMid) {\n minMid = message.mid;\n }\n }\n\n return this.getMessageFromStorage(storage, minMid) as Message.message;\n }\n\n public getMidsByAlbum(groupedId: string, sort: 'asc' | 'desc' = 'asc') {\n return getObjectKeysAndSort(this.groupedMessagesStorage[groupedId], sort);\n }\n\n public getMessagesByAlbum(groupedId: string) {\n const mids = this.getMidsByAlbum(groupedId, 'asc');\n const storage = this.groupedMessagesStorage[groupedId];\n return mids.map((mid) => this.getMessageFromStorage(storage, mid) as Message.message);\n }\n\n public getMidsByMessage(message: Message) {\n if(!message) return [];\n else if((message as Message.message).grouped_id) return this.getMidsByAlbum((message as Message.message).grouped_id);\n else return [message.mid];\n }\n\n public filterMessages(message: MyMessage, verify: (message: MyMessage) => boolean) {\n const out: MyMessage[] = [];\n if((message as Message.message).grouped_id) {\n const storage = this.groupedMessagesStorage[(message as Message.message).grouped_id];\n for(const [mid, message] of storage) {\n if(verify(message)) {\n out.push(message);\n }\n }\n } else {\n if(verify(message)) {\n out.push(message);\n }\n }\n\n return out;\n }\n\n public generateTempMessageId(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n return this.appMessagesIdsManager.generateTempMessageId(dialog?.top_message || 0);\n }\n\n public setMessageUnreadByDialog(message: MyMessage, dialog: Dialog | ForumTopic = this.getDialogOnly(message.peerId)) {\n if(dialog && message.mid) {\n if(message.mid > dialog[message.pFlags.out ?\n 'read_outbox_max_id' :\n 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n }\n }\n }\n\n public saveMessage(message: Message, options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n // isNew: boolean, // * new - from update\n }> = {}) {\n if(!message || message._ === 'messageEmpty') {\n return;\n }\n\n message.pFlags ??= {};\n\n // * exclude from state\n // defineNotNumerableProperties(message, ['rReply', 'mid', 'savedFrom', 'fwdFromId', 'fromId', 'peerId', 'reply_to_mid', 'viaBotId']);\n\n const peerId = this.getMessagePeer(message);\n const storage = options.storage || this.getHistoryMessagesStorage(peerId);\n const isChannel = message.peer_id._ === 'peerChannel';\n const isBroadcast = isChannel && this.appChatsManager.isBroadcast(peerId.toChatId());\n const isMessage = message._ === 'message';\n\n if(options.isOutgoing) {\n message.pFlags.is_outgoing = true;\n }\n\n const mid = generateMessageId(message.id);\n message.mid = mid;\n\n if(isMessage) {\n if(options.isScheduled) {\n message.pFlags.is_scheduled = true;\n }\n\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id] ??= this.createMessageStorage(peerId, 'grouped');\n storage.set(mid, message);\n }\n\n if(message.via_bot_id) {\n // ! WARNING\n message.viaBotId = message.via_bot_id as any;\n }\n }\n\n // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n const replyTo = message.reply_to;\n if(replyTo) {\n if(replyTo.reply_to_msg_id) {\n replyTo.reply_to_msg_id = message.reply_to_mid = generateMessageId(replyTo.reply_to_msg_id);\n }\n\n if(replyTo.reply_to_top_id) {\n replyTo.reply_to_top_id = generateMessageId(replyTo.reply_to_top_id);\n }\n }\n\n const replies = isMessage && message.replies;\n if(replies) {\n if(replies.max_id) replies.max_id = generateMessageId(replies.max_id);\n if(replies.read_max_id) replies.read_max_id = generateMessageId(replies.read_max_id);\n }\n\n const overwriting = !!peerId;\n if(!overwriting) {\n message.date -= this.timeManager.getServerTimeOffset();\n }\n\n // storage.generateIndex(message);\n const myId = this.appPeersManager.peerId;\n\n const fwdHeader = isMessage && (message as Message.message).fwd_from;\n\n message.peerId = peerId;\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\n message.fromId = fwdHeader ? (fwdHeader.from_id ? this.appPeersManager.getPeerId(fwdHeader.from_id) : NULL_PEER_ID) : myId;\n } else {\n // message.fromId = message.pFlags.post || (!message.pFlags.out && !message.from_id) ? peerId : appPeersManager.getPeerId(message.from_id);\n message.fromId = message.pFlags.post || !message.from_id ? peerId : this.appPeersManager.getPeerId(message.from_id);\n }\n\n this.setMessageUnreadByDialog(message);\n\n if(fwdHeader) {\n // if(peerId === myID) {\n if(fwdHeader.saved_from_msg_id) fwdHeader.saved_from_msg_id = generateMessageId(fwdHeader.saved_from_msg_id);\n if(fwdHeader.channel_post) fwdHeader.channel_post = generateMessageId(fwdHeader.channel_post);\n\n const peer = fwdHeader.saved_from_peer || fwdHeader.from_id;\n const msgId = fwdHeader.saved_from_msg_id || fwdHeader.channel_post;\n if(peer && msgId) {\n const savedFromPeerId = this.appPeersManager.getPeerId(peer);\n const savedFromMid = generateMessageId(msgId);\n message.savedFrom = savedFromPeerId + '_' + savedFromMid;\n }\n\n /* if(peerId.isAnyChat() || peerId === myID) {\n message.fromId = appPeersManager.getPeerID(!message.from_id || deepEqual(message.from_id, fwdHeader.from_id) ? fwdHeader.from_id : message.from_id);\n } */\n /* } else {\n apiMessage.fwdPostID = fwdHeader.channel_post;\n } */\n\n message.fwdFromId = this.appPeersManager.getPeerId(fwdHeader.from_id);\n\n if(!overwriting) {\n fwdHeader.date -= this.timeManager.getServerTimeOffset();\n }\n }\n\n const mediaContext: ReferenceContext = {\n type: 'message',\n peerId,\n messageId: mid\n };\n\n /* if(isMessage) {\n const entities = message.entities;\n if(entities && entities.find((entity) => entity._ === 'messageEntitySpoiler')) {\n message.media = {_: 'messageMediaUnsupported'};\n }\n } */\n\n let unsupported = false;\n const media = isMessage && message.media;\n if(media) {\n switch(media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(media.ttl_seconds) {\n unsupported = true;\n } else {\n media.photo = this.appPhotosManager.savePhoto(media.photo, mediaContext);\n }\n\n if(!(media as MessageMedia.messageMediaPhoto).photo) { // * found this bug on test DC\n delete message.media;\n }\n\n break;\n }\n\n case 'messageMediaPoll': {\n const result = this.appPollsManager.savePoll(media.poll, media.results, message);\n media.poll = result.poll;\n media.results = result.results;\n break;\n }\n\n case 'messageMediaDocument': {\n if(media.ttl_seconds) {\n unsupported = true;\n } else {\n const originalDoc = media.document;\n media.document = this.appDocsManager.saveDoc(originalDoc, mediaContext); // 11.04.2020 warning\n\n if(!media.document && originalDoc._ !== 'documentEmpty') {\n unsupported = true;\n }\n }\n\n break;\n }\n\n case 'messageMediaWebPage': {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\n media.webpage = this.appWebPagesManager.saveWebPage(media.webpage, messageKey, mediaContext);\n\n if(!media.webpage) {\n delete message.media;\n }\n\n break;\n }\n\n /* case 'messageMediaGame':\n AppGamesManager.saveGame(apiMessage.media.game, apiMessage.mid, mediaContext);\n apiMessage.media.handleMessage = true;\n break; */\n\n case 'messageMediaInvoice': {\n media.photo = this.appWebDocsManager.saveWebDocument(media.photo);\n const extendedMedia = media.extended_media;\n if(extendedMedia?._ === 'messageExtendedMedia') {\n const extendedMediaMedia = extendedMedia.media;\n (extendedMediaMedia as MessageMedia.messageMediaPhoto).photo = this.appPhotosManager.savePhoto((extendedMediaMedia as MessageMedia.messageMediaPhoto).photo, mediaContext);\n (extendedMediaMedia as MessageMedia.messageMediaDocument).document = this.appDocsManager.saveDoc((extendedMediaMedia as MessageMedia.messageMediaDocument).document, mediaContext);\n }\n break;\n }\n\n case 'messageMediaUnsupported': {\n unsupported = true;\n break;\n }\n }\n }\n\n // if(isMessage && !unsupported && message.entities) {\n // unsupported = message.entities.some((entity) => entity._ === 'messageEntityCustomEmoji');\n // }\n\n if(isMessage && unsupported) {\n message.media = {_: 'messageMediaUnsupported'};\n message.message = '';\n delete message.entities;\n delete message.totalEntities;\n }\n\n if(!isMessage && message.action) {\n const action = message.action as MessageAction;\n const suffix = message.fromId === this.appUsersManager.getSelf().id ? 'You' : '';\n let migrateFrom: PeerId, migrateTo: PeerId;\n\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\n (action as MessageAction.messageActionChatEditPhoto).photo = this.appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\n }\n\n if((action as any).document) {\n (action as any).document = this.appDocsManager.saveDoc((action as any).photo, mediaContext);\n }\n\n switch(action._) {\n // case 'messageActionChannelEditPhoto':\n case 'messageActionChatEditPhoto':\n // action.photo = appPhotosManager.savePhoto(action.photo, mediaContext);\n if((action.photo as Photo.photo)?.video_sizes) {\n // @ts-ignore\n action._ = isBroadcast ? 'messageActionChannelEditVideo' : 'messageActionChatEditVideo';\n } else {\n if(isBroadcast) { // ! messageActionChannelEditPhoto не существует в принципе, это используется для перевода.\n // @ts-ignore\n action._ = 'messageActionChannelEditPhoto';\n }\n }\n break;\n\n case 'messageActionGroupCall': {\n // assumeType(action);\n\n this.appGroupCallsManager.saveGroupCall(action.call);\n\n let type: string;\n if(action.duration === undefined) {\n type = 'started';\n } else {\n type = 'ended'\n }\n\n if(!isBroadcast) {\n type += '_by' + suffix;\n }\n\n // @ts-ignore\n action.type = type;\n\n break;\n }\n\n case 'messageActionChatEditTitle':\n /* if(options.isNew) {\n const chat = appChatsManager.getChat(peerId.toChatId());\n chat.title = action.title;\n appChatsManager.saveApiChat(chat, true);\n } */\n\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelEditTitle';\n }\n break;\n\n case 'messageActionChatDeletePhoto':\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelDeletePhoto';\n }\n break;\n\n case 'messageActionChatAddUser':\n if(action.users.length === 1) {\n // @ts-ignore\n action.user_id = action.users[0];\n // @ts-ignore\n if(message.fromId === action.user_id) {\n if(isChannel) {\n // @ts-ignore\n action._ = 'messageActionChatJoined' + suffix;\n } else {\n // @ts-ignore\n action._ = 'messageActionChatReturn' + suffix;\n }\n }\n } else if(action.users.length > 1) {\n // @ts-ignore\n action._ = 'messageActionChatAddUsers';\n }\n break;\n\n case 'messageActionChatDeleteUser':\n if(message.fromId === action.user_id) {\n // @ts-ignore\n action._ = 'messageActionChatLeave' + suffix;\n }\n break;\n\n case 'messageActionChannelMigrateFrom':\n migrateFrom = action.chat_id.toPeerId(true);\n migrateTo = peerId;\n break\n\n case 'messageActionChatMigrateTo':\n migrateFrom = peerId;\n migrateTo = action.channel_id.toPeerId(true);\n break;\n\n case 'messageActionHistoryClear':\n // apiMessage.deleted = true;\n message.clear_history = true;\n delete message.pFlags.out;\n delete message.pFlags.unread;\n break;\n\n case 'messageActionPhoneCall':\n // @ts-ignore\n action.type =\n (action.pFlags.video ? 'video_' : '') +\n (action.duration !== undefined ? (message.pFlags.out ? 'out_' : 'in_') : '') +\n (\n action.duration !== undefined ? 'ok' : (\n action.reason._ === 'phoneCallDiscardReasonMissed' ?\n 'missed' :\n 'cancelled'\n )\n );\n break;\n }\n\n if(migrateFrom &&\n migrateTo &&\n !this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo]) {\n this.migrateChecks(migrateFrom, migrateTo);\n }\n }\n\n /* if(message.grouped_id) {\n if(!groups) {\n groups = new Set();\n }\n\n groups.add(message.grouped_id);\n } else {\n message.rReply = this.getRichReplyText(message);\n } */\n\n if(isMessage && message.message.length && !message.totalEntities) {\n this.wrapMessageEntities(message);\n }\n\n storage.set(mid, message);\n\n return message;\n }\n\n public saveMessages(messages: any[], options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n // isNew: boolean, // * new - from update\n }> = {}): (Message.message | Message.messageService)[] {\n if((messages as any).saved) return messages;\n (messages as any).saved = true;\n messages.forEach((message, idx, arr) => {\n arr[idx] = this.saveMessage(message, options);\n });\n\n return messages;\n }\n\n public async getFirstMessageToEdit(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n let goodMessage: Message.message | Message.messageService;\n const myPeerId = this.appPeersManager.peerId;\n for(const mid of slice) {\n const message = this.getMessageByPeer(peerId, mid);\n const good = myPeerId === peerId ? message.fromId === myPeerId : message.pFlags.out;\n\n if(good) {\n if(await this.canEditMessage(message, 'text')) {\n goodMessage = message;\n break;\n }\n\n // * this check will allow editing only last message\n // break;\n }\n }\n\n return goodMessage;\n }\n }\n\n private wrapMessageEntities(message: Message.message) {\n const apiEntities = message.entities ? message.entities.slice() : [];\n message.message = fixEmoji(message.message, apiEntities);\n\n const myEntities = parseEntities(message.message);\n message.totalEntities = mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n }\n\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\n return this.apiManager.invokeApiSingle('messages.report', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n reason: {\n _: reason\n },\n message\n });\n }\n\n public startBot(botId: BotId, chatId?: ChatId, startParam?: string) {\n const peerId = chatId ? chatId.toPeerId(true) : botId.toPeerId();\n if(startParam) {\n const randomId = randomLong();\n\n return this.apiManager.invokeApi('messages.startBot', {\n bot: this.appUsersManager.getUserInput(botId),\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: randomId,\n start_param: startParam\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n const str = '/start';\n if(chatId) {\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.appChatsManager.inviteToChannel(chatId, [botId]);\n } else {\n promise = this.appChatsManager.addChatUser(chatId, botId, 0);\n }\n\n return promise.catch((error: ApiError) => {\n if(error?.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n return this.sendText(peerId, str + '@' + this.appPeersManager.getPeerUsername(botId.toPeerId()));\n });\n }\n\n return this.sendText(peerId, str);\n }\n\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\n this.apiManager.invokeApi('folders.editPeerFolders', {\n folder_peers: peerIds.map((peerId) => {\n return {\n _: 'inputFolderPeer',\n peer: this.appPeersManager.getInputPeerById(peerId),\n folder_id: folderId\n };\n })\n }).then((updates) => {\n // this.log('editPeerFolders updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates); // WARNING! возможно тут нужно добавлять channelId, и вызывать апдейт для каждого канала отдельно\n });\n }\n\n public getFilter(filterId: number) {\n return this.filtersStorage.getFilter(filterId);\n }\n\n public async toggleDialogPin(options: {\n peerId: PeerId,\n filterId?: number,\n topicId?: number\n }) {\n const {peerId, topicId, filterId = topicId ? peerId : undefined} = options;\n if(filterId === undefined) {\n throw new Error('No filterId');\n }\n\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, topicId);\n if(!dialog) throw undefined;\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const max = await this.apiManager.getLimit(topicId ? 'topicPin' : (filterId === 1 ? 'folderPin' : 'pin'));\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n throw makeError(topicId ? 'PINNED_TOO_MUCH' : 'PINNED_DIALOGS_TOO_MUCH');\n }\n }\n\n if(topicId) {\n return this.appChatsManager.updatePinnedForumTopic(peerId.toChatId(), topicId, pinned);\n }\n\n return this.apiManager.invokeApi('messages.toggleDialogPin', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then((bool) => {\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\n this.apiUpdatesManager.saveUpdate({\n _: 'updateDialogPinned',\n peer: this.appPeersManager.getDialogPeer(peerId),\n folder_id: filterId,\n pFlags\n });\n });\n }\n\n public markDialogUnread(peerId: PeerId, read?: true) {\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const unread = read || dialog.pFlags?.unread_mark ? undefined : true;\n return this.apiManager.invokeApi('messages.markDialogUnread', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n unread\n }).then((bool) => {\n if(bool) {\n const pFlags: Update.updateDialogUnreadMark['pFlags'] = unread ? {unread} : {};\n this.onUpdateDialogUnreadMark({\n _: 'updateDialogUnreadMark',\n peer: this.appPeersManager.getDialogPeer(peerId),\n pFlags\n });\n }\n });\n }\n\n public migrateChecks(migrateFrom: PeerId, migrateTo: PeerId) {\n if(!this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo] &&\n this.appChatsManager.hasChat(migrateTo.toChatId())) {\n const fromChat = this.appChatsManager.getChat(migrateFrom.toChatId()) as Chat.chat;\n if(fromChat?.migrated_to && (fromChat.migrated_to as InputChannel.inputChannel).channel_id === migrateTo.toChatId()) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n\n this.rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\n\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\n }\n }\n }\n\n private canMessageBeEdited(message: Message, kind: 'text' | 'poll') {\n if((message as Message.message)?.pFlags?.is_outgoing) {\n return false;\n }\n\n const goodMedias = [\n 'messageMediaPhoto',\n 'messageMediaDocument',\n 'messageMediaWebPage'\n ];\n\n if(kind === 'poll') {\n goodMedias.push('messageMediaPoll');\n }\n\n if(!message ||\n message._ !== 'message' ||\n message.deleted ||\n message.fwd_from ||\n message.via_bot_id ||\n message.media && goodMedias.indexOf(message.media._) === -1 ||\n message.fromId && this.appUsersManager.isBot(message.fromId)) {\n return false;\n }\n\n if(message.media?._ === 'messageMediaDocument' &&\n ((message.media.document as Document.document).sticker || (message.media.document as Document.document).type === 'round')) {\n return false;\n }\n\n return true;\n }\n\n public async canEditMessage(message: Message.message | Message.messageService, kind: 'text' | 'poll' = 'text') {\n if(!message || !this.canMessageBeEdited(message, kind)) {\n return false;\n }\n\n // * second rule for saved messages, because there is no 'out' flag\n if(/* message.pFlags.out || */this.getMessagePeer(message) === this.appUsersManager.getSelf().id) {\n return true;\n }\n\n const canEditMessageInPeer = this.appPeersManager.isBroadcast(message.peerId) ?\n this.appChatsManager.hasRights(message.peerId.toChatId(), 'edit_messages') :\n message.pFlags.out;\n\n if(\n !canEditMessageInPeer || (\n message.peer_id._ !== 'peerChannel' &&\n message.date < (tsNow(true) - (await this.apiManager.getConfig()).edit_time_limit) &&\n (message as Message.message).media?._ !== 'messageMediaPoll'\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n public canDeleteMessage(message: MyMessage) {\n return message && (\n message.peerId.isUser() ||\n message.pFlags.out ||\n this.appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' ||\n this.appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\n ) && (!message.pFlags.is_outgoing || !!message.error);\n }\n\n public getReplyKeyboard(peerId: PeerId) {\n return this.getHistoryStorage(peerId).replyMarkup;\n }\n\n public mergeReplyKeyboard(historyStorage: HistoryStorage, message: Message.messageService | Message.message) {\n // this.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n if(!message) {\n return false;\n }\n\n const messageReplyMarkup = (message as Message.message).reply_markup;\n if(!messageReplyMarkup &&\n !message.pFlags?.out &&\n !(message as Message.messageService).action) {\n return false;\n }\n\n if(messageReplyMarkup?._ === 'replyInlineMarkup') {\n return false;\n }\n\n const lastReplyMarkup = historyStorage.replyMarkup;\n if(messageReplyMarkup) {\n if(lastReplyMarkup && lastReplyMarkup.mid >= message.mid) {\n return false;\n }\n\n if(messageReplyMarkup.pFlags.selective) {\n return false;\n }\n\n if(historyStorage.maxOutId &&\n message.mid < historyStorage.maxOutId &&\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.single_use) {\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.hidden = true;\n }\n\n messageReplyMarkup.mid = message.mid;\n /* messageReplyMarkup = Object.assign({\n mid: message.mid\n }, messageReplyMarkup); */\n\n if(messageReplyMarkup._ !== 'replyKeyboardHide') {\n messageReplyMarkup.fromId = this.appPeersManager.getPeerId(message.from_id);\n }\n\n historyStorage.replyMarkup = messageReplyMarkup;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n if(message.pFlags.out) {\n if(lastReplyMarkup) {\n assumeType(lastReplyMarkup);\n if(lastReplyMarkup.pFlags.single_use &&\n !lastReplyMarkup.pFlags.hidden &&\n (message.mid > lastReplyMarkup.mid || message.pFlags.is_outgoing) &&\n (message as Message.message).message) {\n lastReplyMarkup.pFlags.hidden = true;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n } else if(!historyStorage.maxOutId ||\n message.mid > historyStorage.maxOutId) {\n historyStorage.maxOutId = message.mid;\n }\n }\n\n assumeType(message);\n if(message.action?._ === 'messageActionChatDeleteUser' &&\n (lastReplyMarkup ?\n message.action.user_id === (lastReplyMarkup as ReplyMarkup.replyKeyboardMarkup).fromId :\n this.appUsersManager.isBot(message.action.user_id)\n )\n ) {\n historyStorage.replyMarkup = {\n _: 'replyKeyboardHide',\n mid: message.mid,\n pFlags: {}\n };\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n return false;\n }\n\n public getSearchStorage(peerId: PeerId, inputFilter: MyInputMessagesFilter) {\n if(!this.searchesStorage[peerId]) this.searchesStorage[peerId] = {};\n if(!this.searchesStorage[peerId][inputFilter]) this.searchesStorage[peerId][inputFilter] = {history: []};\n return this.searchesStorage[peerId][inputFilter];\n }\n\n public getSearchCounters(\n peerId: PeerId,\n filters: MessagesFilter[],\n canCache = true,\n threadId?: number\n ): Promise {\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return Promise.resolve(filters.map((filter) => {\n return {\n _: 'messages.searchCounter',\n pFlags: {},\n filter: filter,\n count: 0\n };\n }));\n }\n\n const func = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n return func('messages.getSearchCounters', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n filters,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n });\n }\n\n public filterMessagesByInputFilterFromStorage(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage | MessagesStorageKey, limit: number) {\n const _storage = this.getMessagesStorage(storage);\n return filterMessagesByInputFilter(inputFilter, history.map((mid) => _storage.get(mid)), limit);\n }\n\n public getSearch({peerId, query, inputFilter, maxId, limit, nextRate, backLimit, threadId, folderId, minDate, maxDate}: {\n peerId?: PeerId,\n maxId?: number,\n limit?: number,\n nextRate?: number,\n backLimit?: number,\n threadId?: number,\n folderId?: number,\n query?: string,\n inputFilter?: {\n _: MyInputMessagesFilter\n },\n minDate?: number,\n maxDate?: number\n }): Promise<{\n count: number,\n next_rate: number,\n offset_id_offset: number,\n history: MyMessage[]\n }> {\n if(this.appPeersManager.isPeerRestricted(peerId)/* || true */) {\n return Promise.resolve({\n count: 0,\n offset_id_offset: 0,\n next_rate: undefined,\n history: []\n });\n }\n\n if(!query) query = '';\n if(!inputFilter) inputFilter = {_: 'inputMessagesFilterEmpty'};\n if(limit === undefined) limit = 20;\n if(!nextRate) nextRate = 0;\n if(!backLimit) backLimit = 0;\n\n minDate = minDate ? minDate / 1000 | 0 : 0;\n maxDate = maxDate ? maxDate / 1000 | 0 : 0;\n\n let foundMsgs: MyMessage[] = [];\n\n // this.log('search', maxId);\n\n if(backLimit) {\n limit += backLimit;\n }\n\n // const beta = inputFilter._ === 'inputMessagesFilterPinned' && !backLimit;\n const beta = false;\n\n let storage: {\n count?: number;\n history: SlicedArray;\n };\n\n // * костыль для limit 1, если нужно и получить сообщение, и узнать количество сообщений\n if(peerId && !backLimit && !maxId && !query && limit !== 1 && !threadId/* && inputFilter._ !== 'inputMessagesFilterPinned' */) {\n storage = beta ?\n this.getSearchStorage(peerId, inputFilter._) as any :\n this.getHistoryStorage(peerId);\n foundMsgs = this.filterMessagesByInputFilterFromStorage(inputFilter._, storage.history.slice, this.getHistoryMessagesStorage(peerId), limit);\n }\n\n if(foundMsgs.length) {\n if(foundMsgs.length < limit && (beta ? storage.count !== storage.history.length : true)) {\n maxId = foundMsgs[foundMsgs.length - 1].mid;\n limit = limit - foundMsgs.length;\n } else {\n return Promise.resolve({\n count: beta ? storage.count : 0,\n next_rate: 0,\n offset_id_offset: 0,\n history: foundMsgs\n });\n }\n } else if(beta && storage?.count) {\n return Promise.resolve({\n count: storage.count,\n next_rate: 0,\n offset_id_offset: 0,\n history: []\n });\n }\n\n const canCache = false && (['inputMessagesFilterChatPhotos', 'inputMessagesFilterPinned'] as MyInputMessagesFilter[]).includes(inputFilter._);\n const method = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n\n let apiPromise: Promise;\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\n apiPromise = method('messages.search', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n q: query || '',\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n limit,\n offset_id: getServerMessageId(maxId) || 0,\n add_offset: backLimit ? -backLimit : 0,\n max_id: 0,\n min_id: 0,\n hash: '',\n top_msg_id: getServerMessageId(threadId) || 0\n }, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n });\n } else {\n // var offsetDate = 0;\n let offsetPeerId: PeerId;\n let offsetId = 0;\n const offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\n\n if(offsetMessage && offsetMessage.date) {\n // offsetDate = offsetMessage.date + timeManager.getServerTimeOffset();\n offsetId = offsetMessage.id;\n offsetPeerId = this.getMessagePeer(offsetMessage);\n }\n\n apiPromise = method('messages.searchGlobal', {\n q: query,\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n offset_rate: nextRate,\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\n offset_id: offsetId,\n limit,\n folder_id: folderId\n }, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n });\n }\n\n return apiPromise.then((searchResult: any) => {\n this.appUsersManager.saveApiUsers(searchResult.users);\n this.appChatsManager.saveApiChats(searchResult.chats);\n this.saveMessages(searchResult.messages);\n\n /* if(beta && storage && (!maxId || storage.history[storage.history.length - 1] === maxId)) {\n const storage = this.getSearchStorage(peerId, inputFilter._);\n const add = (searchResult.messages.map((m: any) => m.mid) as number[]).filter((mid) => storage.history.indexOf(mid) === -1);\n storage.history.push(...add);\n storage.history.sort((a, b) => b - a);\n storage.count = searchResult.count;\n } */\n\n if(DEBUG) {\n this.log('getSearch result:', inputFilter, searchResult);\n }\n\n const foundCount: number = searchResult.count || (foundMsgs.length + searchResult.messages.length);\n\n searchResult.messages.forEach((message: MyMessage) => {\n const peerId = this.getMessagePeer(message);\n if(peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n if(chat.migrated_to) {\n this.migrateChecks(peerId, (chat.migrated_to as InputChannel.inputChannel).channel_id.toPeerId(true));\n }\n }\n\n foundMsgs.push(message);\n });\n\n return {\n count: foundCount,\n offset_id_offset: searchResult.offset_id_offset || 0,\n next_rate: searchResult.next_rate,\n history: foundMsgs\n };\n });\n }\n\n public subscribeRepliesThread(peerId: PeerId, mid: number) {\n const repliesKey = peerId + '_' + mid;\n for(const threadKey in this.threadsToReplies) {\n if(this.threadsToReplies[threadKey] === repliesKey) return;\n }\n\n this.getDiscussionMessage(peerId, mid);\n }\n\n public generateThreadServiceStartMessage(message: Message.message | Message.messageService) {\n const threadKey = message.peerId + '_' + message.mid;\n if(this.threadsServiceMessagesIdsStorage[threadKey]) return;\n\n const maxMessageId = getServerMessageId(Math.max(...this.getMidsByMessage(message)));\n const serviceStartMessage: Message.messageService = {\n _: 'messageService',\n pFlags: {\n is_single: true\n },\n id: this.appMessagesIdsManager.generateTempMessageId(maxMessageId),\n date: message.date,\n from_id: {_: 'peerUser', user_id: NULL_PEER_ID}/* message.from_id */,\n peer_id: message.peer_id,\n action: {\n _: 'messageActionDiscussionStarted'\n },\n reply_to: this.generateReplyHeader(message.peerId, message.id)\n };\n\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\n }\n\n public getThreadServiceMessageId(peerId: PeerId, threadId: number) {\n return this.threadsServiceMessagesIdsStorage[peerId + '_' + threadId];\n }\n\n public getDiscussionMessage(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApiSingle('messages.getDiscussionMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((result) => {\n this.appChatsManager.saveApiChats(result.chats);\n this.appUsersManager.saveApiUsers(result.users);\n this.saveMessages(result.messages);\n\n const message = this.getMessageWithReplies(result.messages[0] as Message.message);\n const threadKey = message.peerId + '_' + message.mid;\n\n this.generateThreadServiceStartMessage(message);\n\n const historyStorage = this.getHistoryStorage(message.peerId, message.mid);\n const newMaxId = result.max_id = generateMessageId(result.max_id) || 0;\n result.read_inbox_max_id = historyStorage.readMaxId = generateMessageId(result.read_inbox_max_id ?? message.mid);\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = generateMessageId(result.read_outbox_max_id) || 0;\n\n const first = historyStorage.history.first;\n if(historyStorage.maxId && historyStorage.maxId < newMaxId && first.isEnd(SliceEnd.Bottom)) {\n first.unsetEnd(SliceEnd.Bottom);\n }\n historyStorage.maxId = newMaxId;\n\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\n\n return message;\n });\n }\n\n private handleNewMessage(message: MyMessage) {\n this.rootScope.dispatchEvent('history_multiappend', message);\n }\n\n private handleNewDialogs = () => {\n let newMaxSeenId = 0;\n const updateMap: BroadcastEvents['dialogs_multiupdate']= new Map();\n\n const processDialog = (dialog: MTDialog.dialog | ForumTopic) => {\n const {peerId} = dialog;\n this.dialogsStorage.pushDialog({dialog});\n if(!this.appPeersManager.isChannel(peerId)) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\n }\n\n let cache = updateMap.get(peerId);\n if(!cache) {\n updateMap.set(peerId, cache = {});\n }\n\n if(dialog._ === 'forumTopic') {\n (cache.topics ??= new Map()).set(dialog.id, dialog);\n } else {\n cache.dialog = dialog;\n }\n };\n\n for(const [peerId, obj] of this.newDialogsToHandle) {\n const isDialogDefined = 'dialog' in obj;\n const {dialog, topics} = obj;\n\n if(isDialogDefined) {\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n } else if(this.dialogsStorage.getDialogOnly(peerId)) { // * can be already dropped\n processDialog(dialog);\n }\n }\n\n if(topics) {\n topics?.forEach((topic, id) => {\n if(!topic) {\n this.dialogsStorage.getForumTopicById(peerId, id);\n } else if(this.dialogsStorage.getForumTopic(peerId, id)) { // * can be already dropped\n processDialog(topic);\n }\n });\n }\n }\n\n // this.log('after order:', this.dialogsStorage[0].map((d) => d.peerId));\n\n if(newMaxSeenId !== 0) {\n this.incrementMaxSeenId(newMaxSeenId);\n }\n\n this.rootScope.dispatchEvent('dialogs_multiupdate', updateMap);\n this.newDialogsToHandle.clear();\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog | ForumTopic | ForumTopic['id']) {\n if(peerId !== undefined) {\n let obj = this.newDialogsToHandle.get(peerId);\n if(!obj) {\n this.newDialogsToHandle.set(peerId, obj = {});\n }\n\n const isObject = typeof(dialog) === 'object';\n if(!dialog || (isObject && dialog._ === 'dialog')) {\n obj.dialog = dialog as Dialog;\n } else {\n obj.topics ??= new Map();\n if(isObject) {\n obj.topics.set((dialog as ForumTopic).id, dialog as ForumTopic);\n } else {\n obj.topics.set(dialog as number, undefined);\n }\n }\n }\n\n return this.newDialogsHandlePromise ??= pause(0).then(() => {\n this.newDialogsHandlePromise = undefined;\n this.handleNewDialogs();\n });\n }\n\n public async deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\n let promise: Promise;\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\n\n const localMessageIds = mids.map((mid) => getServerMessageId(mid));\n\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\n if(!channel.pFlags.creator && !channel.admin_rights?.pFlags?.delete_messages) {\n mids = mids.filter((mid) => {\n const message = this.getMessageByPeer(peerId, mid);\n return !!message.pFlags.out;\n });\n\n if(!mids.length) {\n return;\n }\n }\n\n promise = this.apiManager.invokeApi('channels.deleteMessages', {\n channel: this.appChatsManager.getChannelInput(channelId),\n id: localMessageIds\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteChannelMessages',\n channel_id: channelId,\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n } else {\n promise = this.apiManager.invokeApi('messages.deleteMessages', {\n revoke,\n id: localMessageIds\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n }\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.deleteMessages(peerId, overflowMids, revoke));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public readHistory(peerId: PeerId, maxId = 0, threadId?: number, force = false) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n // console.trace('start read')\n this.log('readHistory:', peerId, maxId, threadId);\n const readMaxId = this.getReadMaxIdIfUnread(peerId, threadId);\n if(!readMaxId) {\n if(threadId && !force) {\n const forumTopic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(!getServerMessageId(forumTopic.read_inbox_max_id)) {\n force = true;\n }\n }\n\n if(!force) {\n const dialog = this.appChatsManager.isForum(peerId.toChatId()) && threadId ?\n this.dialogsStorage.getForumTopic(peerId, threadId) :\n this.getDialogOnly(peerId);\n if(dialog && this.isDialogUnread(dialog)) {\n force = true;\n }\n }\n\n if(!force) {\n this.log('readHistory: isn\\'t unread');\n return Promise.resolve();\n }\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(historyStorage.triedToReadMaxId >= maxId) {\n return Promise.resolve();\n }\n\n let apiPromise: Promise;\n if(threadId) {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('messages.readDiscussion', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(threadId),\n read_max_id: getServerMessageId(maxId)\n });\n // apiPromise = new Promise((resolve) => resolve());\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelDiscussionInbox',\n channel_id: peerId.toChatId(),\n top_msg_id: threadId,\n read_max_id: maxId\n });\n } else if(this.appPeersManager.isChannel(peerId)) {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('channels.readHistory', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n max_id: getServerMessageId(maxId)\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelInbox',\n max_id: maxId,\n channel_id: peerId.toChatId(),\n still_unread_count: undefined,\n pts: undefined\n });\n } else {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('messages.readHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n max_id: getServerMessageId(maxId)\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadHistoryInbox',\n max_id: maxId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n still_unread_count: undefined,\n pts: undefined,\n pts_count: undefined\n });\n }\n\n this.rootScope.dispatchEvent('notification_reset', this.appPeersManager.getPeerString(peerId));\n\n if(historyStorage.readPromise) {\n return historyStorage.readPromise;\n }\n\n historyStorage.triedToReadMaxId = maxId;\n\n apiPromise.finally(() => {\n delete historyStorage.readPromise;\n\n const {readMaxId} = historyStorage;\n this.log('readHistory: promise finally', maxId, readMaxId);\n\n if(readMaxId > maxId) {\n this.readHistory(peerId, readMaxId, threadId, true);\n }\n });\n\n return historyStorage.readPromise = apiPromise;\n }\n\n public readAllHistory(peerId: PeerId, threadId?: number, force = false) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(historyStorage.maxId) {\n this.readHistory(peerId, historyStorage.maxId, threadId, force); // lol\n }\n }\n\n private getUnreadMentionsKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? `_${threadId}` : '');\n }\n\n private fixDialogUnreadMentionsIfNoMessage(peerId: PeerId, threadId?: number) {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversationOrTopic(peerId);\n }\n }\n\n private modifyCachedMentions(peerId: PeerId, mid: number, add: boolean, threadId?: number) {\n const slicedArray = this.unreadMentions[this.getUnreadMentionsKey(peerId, threadId)];\n if(!slicedArray) return;\n\n if(add) {\n if(slicedArray.first.isEnd(SliceEnd.Top)) {\n slicedArray.insertSlice([mid]);\n }\n } else {\n slicedArray.delete(mid);\n }\n }\n\n private fixUnreadMentionsCountIfNeeded(peerId: PeerId, slicedArray: SlicedArray, threadId?: number) {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(!slicedArray.length && dialog?.unread_mentions_count) {\n this.reloadConversationOrTopic(peerId);\n }\n }\n\n public goToNextMention(peerId: PeerId, threadId?: number) {\n /* this.getUnreadMentions(peerId, 1, 2, 0).then((messages) => {\n console.log(messages);\n }); */\n\n const key = this.getUnreadMentionsKey(peerId, threadId);\n const promise = this.goToNextMentionPromises[key];\n if(promise) {\n return promise;\n }\n\n const slicedArray = this.unreadMentions[peerId] ??= new SlicedArray();\n const length = slicedArray.length;\n const isTopEnd = slicedArray.first.isEnd(SliceEnd.Top);\n if(!length && isTopEnd) {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray, threadId);\n return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId, threadId);\n }\n\n return this.goToNextMentionPromises[key] = loadNextPromise.then(() => {\n const last = slicedArray.last;\n const mid = last && last[last.length - 1];\n if(mid) {\n slicedArray.delete(mid);\n return mid;\n } else {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray, threadId);\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[key];\n });\n }\n\n private loadNextMentions(peerId: PeerId, threadId?: number) {\n const slicedArray = this.unreadMentions[peerId];\n const maxId = slicedArray.first[0] || 1;\n\n const backLimit = 50;\n const add_offset = -backLimit;\n const limit = backLimit;\n return this.getUnreadMentions(peerId, maxId, add_offset, limit, undefined, undefined, threadId)\n .then((messages) => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n private getUnreadMentions(\n peerId: PeerId,\n offsetId: number,\n add_offset: number,\n limit: number,\n maxId = 0,\n minId = 0,\n threadId?: number\n ) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getUnreadMentions',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: getServerMessageId(offsetId),\n add_offset,\n limit,\n max_id: getServerMessageId(maxId),\n min_id: getServerMessageId(minId),\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n },\n processResult: (messagesMessages) => {\n assumeType>(messagesMessages);\n this.appUsersManager.saveApiUsers(messagesMessages.users);\n this.appChatsManager.saveApiChats(messagesMessages.chats);\n this.saveMessages(messagesMessages.messages);\n\n return messagesMessages;\n }\n });\n }\n\n public readMessages(peerId: PeerId, msgIds: number[]) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n if(!msgIds.length) {\n return Promise.resolve();\n }\n\n msgIds = msgIds.map((mid) => getServerMessageId(mid));\n let promise: Promise, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n\n update = {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelId,\n messages: msgIds\n };\n\n promise = this.apiManager.invokeApi('channels.readMessageContents', {\n channel: this.appChatsManager.getChannelInput(channelId),\n id: msgIds\n });\n } else {\n update = {\n _: 'updateReadMessagesContents',\n messages: msgIds,\n pts: undefined,\n pts_count: undefined\n };\n\n promise = this.apiManager.invokeApi('messages.readMessageContents', {\n id: msgIds\n }).then((affectedMessages) => {\n (update as Update.updateReadMessagesContents).pts = affectedMessages.pts;\n (update as Update.updateReadMessagesContents).pts_count = affectedMessages.pts_count;\n this.apiUpdatesManager.processLocalUpdate(update);\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate(update);\n\n return promise;\n }\n\n public getHistoryStorage(peerId: PeerId, threadId?: number) {\n if(threadId) {\n // threadId = this.getLocalMessageId(threadId);\n return (this.threadsStorage[peerId] ??= {})[threadId] ??= {count: null, history: new SlicedArray()};\n }\n\n return this.historiesStorage[peerId] ??= {count: null, history: new SlicedArray()};\n }\n\n public getHistoryStorageTransferable(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const {\n count,\n history,\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n } = historyStorage;\n\n return {\n count,\n history: undefined as HistoryStorage,\n historySerialized: history.toJSON(),\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n };\n }\n\n private getNotifyPeerSettings(peerId: PeerId, threadId?: number) {\n const inputNotifyPeer = this.appPeersManager.getInputNotifyPeerById({peerId, ignorePeerId: true, threadId});\n return Promise.all([\n this.appNotificationsManager.getNotifyPeerTypeSettings(),\n this.appNotificationsManager.getNotifySettings(inputNotifyPeer)\n ]).then(([_, peerTypeNotifySettings]) => {\n return {\n muted: this.appNotificationsManager.isPeerLocalMuted({peerId, respectType: true, threadId}),\n peerTypeNotifySettings\n };\n });\n }\n\n private handleNotifications = () => {\n ctx.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = undefined;\n\n // var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n // const timeout = 1000;\n\n for(const key in this.notificationsToHandle) {\n const [peerId, threadId] = key.split('_');\n // if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n // continue;\n // }\n\n const notifyPeerToHandle = this.notificationsToHandle[key];\n this.getNotifyPeerSettings(peerId.toPeerId(), threadId ? +threadId : undefined)\n .then(({muted, peerTypeNotifySettings}) => {\n const topMessage = notifyPeerToHandle.topMessage;\n if((muted && !topMessage.pFlags.mentioned) || !topMessage.pFlags.unread) {\n return;\n }\n\n // setTimeout(() => {\n if(topMessage.pFlags.unread) {\n this.notifyAboutMessage(topMessage, {\n fwdCount: notifyPeerToHandle.fwdCount,\n peerTypeNotifySettings\n });\n }\n // }, timeout);\n });\n }\n\n this.notificationsToHandle = {};\n };\n\n public getUpdateAfterReloadKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n private handleNewUpdateAfterReload(peerId: PeerId, update: Update, threadId?: number) {\n const set = this.newUpdatesAfterReloadToHandle[this.getUpdateAfterReloadKey(peerId, threadId)] ??= new Set();\n if(set.has(update)) {\n this.log.error('here we go again', peerId);\n return;\n }\n\n (update as any).ignoreExisting = true;\n set.add(update);\n this.scheduleHandleNewDialogs(peerId, threadId);\n }\n\n private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n if(!pendingData) {\n return;\n }\n\n const mid = generateMessageId(update.id);\n this.pendingByMessageId[mid] = randomId;\n // const {storage} = pendingData;\n // const message = this.getMessageFromStorage(storage, mid);\n // if(message) { // if message somehow already exists\n // this.checkPendingMessage(message);\n // }\n };\n\n private onUpdateNewMessage = (update: Update.updateNewDiscussionMessage | Update.updateNewMessage | Update.updateNewChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const storage = this.getHistoryMessagesStorage(peerId);\n\n // * local update\n const isLocalThreadUpdate = update._ === 'updateNewDiscussionMessage';\n\n // * temporary save the message for info (peerId, reply mids...)\n this.saveMessages([message], {storage: this.createMessageStorage(peerId, 'history')});\n\n // * check if sent message is already in storage\n // const oldMessage = this.getMessageFromStorage(storage, message.mid);\n // if(\n // (message as Message.message).pFlags.is_outgoing &&\n // oldMessage &&\n // !(oldMessage as Message.message).pFlags.is_outgoing\n // ) {\n // this.checkPendingMessage(message);\n // return;\n // }\n\n const isForum = this.appPeersManager.isForum(peerId);\n const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if((!dialog || this.reloadConversationsPeers.has(peerId)) && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = this.appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n this.handleNewUpdateAfterReload(peerId, update);\n return;\n }\n\n // return;\n }\n\n if(threadId && !isLocalThreadUpdate) {\n const threadStorage = this.threadsStorage[peerId]?.[threadId];\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n if(this.appChatsManager.isForum(peerId.toChatId()) && !this.dialogsStorage.getForumTopic(peerId, threadId)) {\n // this.dialogsStorage.getForumTopicById(peerId, threadId);\n this.handleNewUpdateAfterReload(peerId, update, threadId);\n } else if(threadStorage) {\n this.onUpdateNewMessage(update);\n }\n }\n\n if(message._ === 'messageService') {\n const {action} = message;\n if(action._ === 'messageActionPaymentSent' && message.reply_to) {\n this.rootScope.dispatchEvent('payment_sent', {\n peerId: message.reply_to.reply_to_peer_id ?\n this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) :\n message.peerId,\n mid: message.reply_to_mid,\n receiptMessage: message\n });\n }\n\n if(action._ === 'messageActionTopicEdit' && !isLocalThreadUpdate) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(!topic) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n const oldTopic = copy(topic);\n\n if(action.title !== undefined) {\n topic.title = action.title;\n }\n\n if(action.closed !== undefined) {\n setBooleanFlag(topic.pFlags, 'closed', action.closed);\n }\n\n if(action.hidden !== undefined) {\n setBooleanFlag(topic.pFlags, 'hidden', action.hidden);\n }\n\n if(action.icon_emoji_id !== undefined) {\n topic.icon_emoji_id = action.icon_emoji_id;\n }\n\n this.scheduleHandleNewDialogs(peerId, topic);\n\n this.dialogsStorage.processTopicUpdate(topic, oldTopic);\n }\n }\n }\n\n /* if(update._ === 'updateNewChannelMessage') {\n const chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.pFlags && (chat.pFlags.left || chat.pFlags.kicked)) {\n return;\n }\n } */\n\n this.saveMessages([message], {storage});\n // this.log.warn(dT(), 'message unread', message.mid, message.pFlags.unread)\n\n /* if((message as Message.message).grouped_id) {\n this.log('updateNewMessage', message);\n } */\n\n this.checkPendingMessage(message);\n const historyStorage = this.getHistoryStorage(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if(!isLocalThreadUpdate) {\n this.updateMessageRepliesIfNeeded(message);\n }\n\n // * so message can exist if reloadConversation came back earlier with mid\n const ignoreExisting: boolean = (update as any).ignoreExisting;\n const isExisting = !!historyStorage.history.findSlice(message.mid);\n if(isExisting) {\n if(!ignoreExisting) {\n return false;\n }\n } else {\n // * catch situation with disconnect. if message's id is lower than we already have (in bottom end slice), will sort it\n const firstSlice = historyStorage.history.first;\n if(firstSlice.isEnd(SliceEnd.Bottom)) {\n let i = 0;\n for(const length = firstSlice.length; i < length; ++i) {\n if(message.mid > firstSlice[i]) {\n break;\n }\n }\n\n firstSlice.splice(i, 0, message.mid);\n } else {\n historyStorage.history.unshift(message.mid);\n }\n\n if(historyStorage.count !== null) {\n ++historyStorage.count;\n }\n }\n\n if(!historyStorage.maxId || message.mid > historyStorage.maxId) {\n historyStorage.maxId = message.mid;\n }\n\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n\n const fromId = message.fromId;\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\n this.appUsersManager.forceUserOnline(fromId, message.date);\n\n const action: SendMessageAction = {\n _: 'sendMessageCancelAction'\n };\n\n let update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping;\n if(peerId.isUser()) {\n update = {\n _: 'updateUserTyping',\n action,\n user_id: fromId\n };\n } else if(this.appPeersManager.isChannel(peerId)) {\n update = {\n _: 'updateChannelUserTyping',\n action,\n channel_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId),\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n };\n } else {\n update = {\n _: 'updateChatUserTyping',\n action,\n chat_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId)\n };\n }\n\n this.apiUpdatesManager.processLocalUpdate(update);\n }\n\n // commented to render the message if it's been sent faster than history_append came to main thread\n // if(!pendingMessage) {\n this.handleNewMessage(message);\n // }\n\n const isTopic = dialog?._ === 'forumTopic';\n if((isLocalThreadUpdate && !isTopic) || !dialog) {\n return;\n }\n\n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n\n {\n if(inboxUnread && message.mid > dialog.top_message) {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n ++dialog.unread_count;\n if(message.pFlags.mentioned) {\n ++dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, true, isTopic ? threadId : undefined);\n }\n\n releaseUnreadCount();\n }\n\n if(message.mid >= dialog.top_message) {\n this.setDialogTopMessage(message, dialog);\n }\n }\n\n if(((!isLocalThreadUpdate && !isForum) || isTopic) && inboxUnread) {\n const notifyPeer = threadKey || peerId;\n const notifyPeerToHandle = this.notificationsToHandle[notifyPeer] ??= {\n fwdCount: 0,\n fromId: NULL_PEER_ID\n };\n\n if(notifyPeerToHandle.fromId !== fromId) {\n notifyPeerToHandle.fromId = fromId;\n notifyPeerToHandle.fwdCount = 0;\n }\n\n if((message as Message.message).fwd_from) {\n ++notifyPeerToHandle.fwdCount;\n }\n\n notifyPeerToHandle.topMessage = message;\n\n this.notificationsHandlePromise ??= ctx.setTimeout(this.handleNotifications, 0);\n }\n };\n\n private onUpdateMessageReactions = (update: Update.updateMessageReactions) => {\n const {peer, msg_id, reactions} = update;\n const mid = generateMessageId(msg_id);\n const peerId = this.appPeersManager.getPeerId(peer);\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n\n if(message?._ !== 'message') {\n return;\n }\n\n const recentReactions = reactions?.recent_reactions;\n if(recentReactions?.length && message.pFlags.out) {\n const recentReaction = recentReactions[recentReactions.length - 1];\n const previousReactions = message.reactions;\n const previousRecentReactions = previousReactions?.recent_reactions;\n if(\n this.appPeersManager.getPeerId(recentReaction.peer_id) !== this.appPeersManager.peerId && (\n !previousRecentReactions ||\n previousRecentReactions.length <= recentReactions.length\n ) && (\n !previousRecentReactions ||\n !deepEqual(recentReaction, previousRecentReactions[previousRecentReactions.length - 1])\n )\n ) {\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\n if(/* muted || */!peerTypeNotifySettings.show_previews) return;\n this.notifyAboutMessage(message, {\n peerReaction: recentReaction,\n peerTypeNotifySettings\n });\n });\n }\n }\n\n const key = message.peerId + '_' + message.mid;\n this.pushBatchUpdate('messages_reactions', this.batchUpdateReactions, key, () => copy(message.reactions));\n\n message.reactions = reactions;\n\n if(!update.local) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\n // this.log('updateDialogUnreadMark', update);\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n if(!dialog) {\n this.scheduleHandleNewDialogs(peerId);\n } else {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(!update.pFlags.unread) {\n delete dialog.pFlags.unread_mark;\n } else {\n dialog.pFlags.unread_mark = true;\n }\n\n releaseUnreadCount();\n this.dialogsStorage.setDialogToState(dialog);\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, {dialog}]]));\n }\n };\n\n private onUpdateEditMessage = (update: Update.updateEditMessage | Update.updateEditChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const mid = generateMessageId(message.id);\n const storage = this.getHistoryMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n // console.trace(dT(), 'edit message', message)\n\n const oldMessage: Message = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage});\n const newMessage: Message = this.getMessageFromStorage(storage, mid);\n\n this.handleEditedMessage(oldMessage, newMessage, storage);\n\n const dialog = this.getDialogOnly(peerId);\n\n // if sender erased mention\n /* if(dialog.unread_mentions_count && (oldMessage as Message.message)?.pFlags?.mentioned && !message.pFlags.mentioned) {\n --dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, mid, false);\n } */\n\n const isTopMessage = dialog?.top_message === mid;\n if((message as Message.messageService).clear_history) {\n if(isTopMessage) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog});\n }\n } else {\n let dispatchEditEvent = true;\n // no sense in dispatching message_edit since only reactions have changed\n if(oldMessage?._ === 'message' && !deepEqual(oldMessage.reactions, (newMessage as Message.message).reactions)) {\n const newReactions = (newMessage as Message.message).reactions;\n (newMessage as Message.message).reactions = oldMessage.reactions;\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: this.appPeersManager.getOutputPeer(peerId),\n msg_id: message.id,\n reactions: newReactions\n });\n\n dispatchEditEvent = false;\n }\n\n dispatchEditEvent && this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n\n if(isTopMessage) {\n this.dialogsStorage.setDialogToState(dialog);\n }\n\n const map: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const getUpdateCache = () => {\n let cache = map.get(peerId);\n if(!cache) {\n map.set(peerId, cache = {});\n }\n\n return cache;\n };\n\n if((isTopMessage || (message as Message.message).grouped_id) && dialog) {\n getUpdateCache().dialog = dialog;\n }\n\n const threadKey = this.getThreadKey(message);\n if(threadKey) {\n const topicId = +threadKey.split('_')[1];\n const topic = this.dialogsStorage.getForumTopic(peerId, topicId);\n if(topic) {\n (getUpdateCache().topics ??= new Map()).set(topicId, topic);\n }\n }\n\n if(map.size) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', map);\n }\n }\n };\n\n private onUpdateReadHistory = (update: Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox\n | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox\n | Update.updateReadChannelInbox | Update.updateReadChannelOutbox) => {\n const channelId = (update as Update.updateReadChannelInbox).channel_id;\n const maxId = generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\n const threadId = generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\n const peerId = channelId ? channelId.toPeerId(true) : this.appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' ||\n update._ === 'updateReadChannelOutbox' ||\n update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const isForum = channelId ? this.appChatsManager.isForum(channelId) : false;\n const storage = this.getHistoryMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = threadId && isForum ?\n this.dialogsStorage.getForumTopic(peerId, threadId) :\n this.getDialogOnly(peerId);\n const stillUnreadCount = (update as Update.updateReadChannelInbox).still_unread_count;\n let newUnreadCount = 0;\n let newUnreadMentionsCount = 0;\n let foundAffected = false;\n\n // this.log.warn(dT(), 'read', peerId, isOut ? 'out' : 'in', maxId)\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(peerId.isUser() && isOut) {\n this.appUsersManager.forceUserOnline(peerId.toUserId());\n }\n\n if(threadId) {\n const repliesKey = this.threadsToReplies[peerId + '_' + threadId];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n\n const releaseUnreadCount = foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n const readMaxId = this.getReadMaxIdIfUnread(peerId, threadId);\n\n for(let i = 0, length = history.length; i < length; i++) {\n const mid = history[i];\n if(mid > maxId) {\n continue;\n }\n\n const message: MyMessage = storage.get(mid);\n\n if(message.pFlags.out !== isOut) {\n continue;\n }\n\n const messageThreadId = getMessageThreadId(message, isForum);\n if(threadId && messageThreadId !== threadId) {\n continue;\n }\n\n const isUnread = message.pFlags.unread || (readMaxId && readMaxId < mid);\n\n if(!isUnread) {\n break;\n }\n\n // this.log.warn('read', messageId, isUnread, message)\n delete message.pFlags.unread;\n foundAffected ||= true;\n\n if(!message.pFlags.out && foundDialog) {\n if(stillUnreadCount === undefined) {\n newUnreadCount = --foundDialog.unread_count;\n }\n\n if(message.pFlags.mentioned) {\n newUnreadMentionsCount = --foundDialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, false);\n }\n }\n\n this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\n }\n\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(foundDialog) {\n if(isOut) foundDialog.read_outbox_max_id = maxId;\n else foundDialog.read_inbox_max_id = maxId;\n\n if(!isOut) {\n let setCount: number;\n if(stillUnreadCount !== undefined) {\n setCount = stillUnreadCount;\n } else if(\n newUnreadCount < 0 ||\n maxId >= foundDialog.top_message ||\n !readMaxId\n ) {\n setCount = 0;\n } else if(newUnreadCount && foundDialog.top_message > maxId) {\n setCount = newUnreadCount;\n }\n\n if(setCount !== undefined) {\n foundDialog.unread_count = setCount;\n }\n\n if(newUnreadMentionsCount < 0 || !foundDialog.unread_count) {\n foundDialog.unread_mentions_count = 0;\n }\n }\n\n releaseUnreadCount?.();\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog: foundDialog});\n this.dialogsStorage.setDialogToState(foundDialog);\n\n if(!foundAffected && stillUnreadCount === undefined && !isOut && foundDialog.unread_count) {\n if(foundDialog._ === 'forumTopic') {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n this.reloadConversation(peerId);\n }\n }\n }\n\n if(foundAffected) {\n this.rootScope.dispatchEvent('messages_read');\n }\n\n if(!threadId && channelId) {\n const threadKeyPart = peerId + '_';\n for(const threadKey in this.threadsToReplies) {\n if(threadKey.indexOf(threadKeyPart) === 0) {\n const [peerId, mid] = this.threadsToReplies[threadKey].split('_');\n this.rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid) as Message.message);\n }\n }\n }\n };\n\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\n const topMsgId = (update as Update.updateChannelReadMessagesContents).top_msg_id;\n const threadId = topMsgId ? generateMessageId(topMsgId) : undefined;\n const mids = (update as Update.updateReadMessagesContents).messages.map((id) => generateMessageId(id));\n const peerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(mids);\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n if(message) {\n if(message.pFlags.media_unread) {\n delete message.pFlags.media_unread;\n this.setDialogToStateIfMessageIsTop(message);\n\n if(!message.pFlags.out && message.pFlags.mentioned) {\n this.modifyCachedMentions(peerId, mid, false, threadId);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId, threadId);\n }\n }\n\n this.rootScope.dispatchEvent('messages_media_read', {peerId, mids});\n };\n\n private onUpdateChannelAvailableMessages = (update: Update.updateChannelAvailableMessages) => {\n const peerId = update.channel_id.toPeerId(true);\n const history = this.getHistoryStorage(peerId).history.slice;\n const availableMinId = generateMessageId(update.available_min_id);\n const messages = history.filter((mid) => mid <= availableMinId);\n\n (update as any as Update.updateDeleteChannelMessages).messages = messages;\n this.onUpdateDeleteMessages(update as any as Update.updateDeleteChannelMessages);\n };\n\n private onUpdateDeleteMessages = (update: Update.updateDeleteMessages | Update.updateDeleteChannelMessages) => {\n const channelId = (update as Update.updateDeleteChannelMessages).channel_id;\n // const messages = (update as any as Update.updateDeleteChannelMessages).messages;\n const messages = (update as any as Update.updateDeleteChannelMessages).messages.map((id) => generateMessageId(id));\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(messages);\n\n if(!peerId) {\n return;\n }\n\n this.apiManager.clearCache('messages.getSearchCounters', (params) => {\n return this.appPeersManager.getPeerId(params.peer) === peerId;\n });\n\n const threadKeys: Set = new Set(), topics: Map = new Map();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(!threadKey) {\n continue;\n }\n\n const threadId = +threadKey.split('_')[1];\n if(this.threadsStorage[peerId]?.[threadId]) {\n threadKeys.add(threadKey);\n\n if(!topics.has(threadId)) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(topic) {\n topics.set(threadId, topic);\n }\n }\n }\n }\n\n const historyUpdated = this.handleDeletedMessages(\n peerId,\n this.getHistoryMessagesStorage(peerId),\n messages\n );\n\n const threadsStorages = Array.from(threadKeys).map((threadKey) => {\n const [peerId, mid] = threadKey.split('_');\n return this.getHistoryStorage(peerId.toPeerId(), +mid);\n });\n\n const historyStorages = [\n this.getHistoryStorage(peerId),\n ...threadsStorages\n ];\n historyStorages.forEach((historyStorage) => {\n for(const mid of historyUpdated.msgs) {\n historyStorage.history.delete(mid);\n }\n\n if(historyUpdated.count && historyStorage.count) {\n historyStorage.count = Math.max(0, historyStorage.count - historyUpdated.count);\n }\n });\n\n this.rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\n\n const dialogs: (MTDialog.dialog | ForumTopic)[] = [\n ...topics.values()\n ];\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialogs.unshift(dialog);\n }\n\n dialogs.forEach((dialog) => {\n const isTopic = dialog._ === 'forumTopic';\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(historyUpdated.unread) {\n dialog.unread_count = Math.max(0, dialog.unread_count - historyUpdated.unread);\n }\n\n if(historyUpdated.unreadMentions) {\n dialog.unread_mentions_count = !dialog.unread_count ? 0 : Math.max(0, dialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(affected) {\n releaseUnreadCount();\n\n if(!isTopic) {\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog});\n }\n }\n\n if(historyUpdated.msgs.has(dialog.top_message)) {\n const historyStorage = this.getHistoryStorage(dialog.peerId, isTopic ? dialog.id : undefined);\n const slice = historyStorage.history.first;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n const mid = slice[0];\n const message = this.getMessageByPeer(peerId, mid);\n this.setDialogTopMessage(message, dialog);\n } else if(isTopic) {\n this.dialogsStorage.getForumTopicById(peerId, dialog.id);\n } else {\n this.reloadConversation(peerId);\n }\n }\n });\n };\n\n private onUpdateChannel = (update: Update.updateChannel) => {\n const channelId = update.channel_id;\n const peerId = channelId.toPeerId(true);\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\n\n const needDialog = this.appChatsManager.isInChat(channelId);\n\n const canViewHistory = !!getPeerActiveUsernames(channel)[0] || !channel.pFlags.left;\n const hasHistory = this.historiesStorage[peerId] !== undefined;\n\n if(canViewHistory !== hasHistory) {\n delete this.historiesStorage[peerId];\n this.rootScope.dispatchEvent('history_forbidden', peerId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!!dialog !== needDialog) {\n if(needDialog) {\n this.reloadConversation(peerId);\n } else {\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n }\n\n this.rootScope.dispatchEvent('channel_update', channelId);\n };\n\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\n const peerId = update.channel_id.toPeerId(true);\n\n // if(this.appPeersManager.isForum(peerId)) {\n // const cache = this.dialogsStorage.getForumTopicsCache(peerId);\n // if(cache.topics.size) {\n\n // }\n // }\n\n this.flushStoragesByPeerId(peerId);\n Promise.all([\n this.reloadConversation(peerId)\n ]).then(() => {\n this.rootScope.dispatchEvent('history_reload', peerId);\n });\n };\n\n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\n const views = update.views;\n const peerId = update.peerId ?? update.channel_id.toPeerId(true);\n const mid = generateMessageId(update.id);\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(message?.views !== undefined && message.views < views) {\n message.views = views;\n this.pushBatchUpdate('messages_views', this.batchUpdateViews, message.peerId + '_' + message.mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\n // this.log('updateServiceNotification', update);\n if(update.pFlags?.popup) {\n this.rootScope.dispatchEvent('service_notification', update);\n return;\n }\n\n const fromId = SERVICE_PEER_ID;\n const peerId = fromId;\n const messageId = this.generateTempMessageId(peerId);\n const message: Message.message = {\n _: 'message',\n id: messageId,\n from_id: this.appPeersManager.getOutputPeer(fromId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n pFlags: {unread: true},\n date: (update.inbox_date || tsNow(true)) + this.timeManager.getServerTimeOffset(),\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if(!this.appUsersManager.hasUser(fromId)) {\n this.appUsersManager.saveApiUsers([{\n _: 'user',\n id: fromId,\n pFlags: {verified: true},\n access_hash: '0',\n first_name: 'Telegram',\n phone: '42777'\n }]);\n }\n this.saveMessages([message], {isOutgoing: true});\n\n if(update.inbox_date) {\n this.pendingTopMsgs[peerId] = messageId;\n this.onUpdateNewMessage({\n _: 'updateNewMessage',\n message,\n pts: undefined,\n pts_count: undefined\n });\n }\n };\n\n private onUpdatePinnedMessages = (update: Update.updatePinnedMessages | Update.updatePinnedChannelMessages) => {\n const channelId = update._ === 'updatePinnedChannelMessages' ? update.channel_id : undefined;\n const peerId = channelId ? channelId.toPeerId(true) : this.appPeersManager.getPeerId((update as Update.updatePinnedMessages).peer);\n\n /* const storage = this.getSearchStorage(peerId, 'inputMessagesFilterPinned');\n if(storage.count !== storage.history.length) {\n if(storage.count !== undefined) {\n delete this.searchesStorage[peerId]['inputMessagesFilterPinned'];\n }\n\n rootScope.broadcast('peer_pinned_messages', peerId);\n break;\n } */\n\n const messages = update.messages.map((id) => generateMessageId(id));\n\n const storage = this.getHistoryMessagesStorage(peerId);\n const missingMessages = messages.filter((mid) => !storage.has(mid));\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map((mid) => this.reloadMessages(peerId, mid))) : Promise.resolve();\n getMissingPromise.finally(() => {\n const werePinned = update.pFlags?.pinned;\n if(werePinned) {\n for(const mid of messages) {\n // storage.history.push(mid);\n const message = storage.get(mid) as Message.message;\n message.pFlags.pinned = true;\n }\n\n /* if(this.pinnedMessages[peerId]?.maxId) {\n const maxMid = Math.max(...messages);\n this.pinnedMessages\n } */\n\n // storage.history.sort((a, b) => b - a);\n } else {\n for(const mid of messages) {\n // storage.history.findAndSplice((_mid) => _mid === mid);\n const message = storage.get(mid) as Message.message;\n delete message.pFlags.pinned;\n }\n }\n\n /* const info = this.pinnedMessages[peerId];\n if(info) {\n info.count += messages.length * (werePinned ? 1 : -1);\n } */\n\n delete this.pinnedMessages[this.getPinnedMessagesKey(peerId)];\n this.appStateManager.getState().then((state) => {\n delete state.hiddenPinnedMessages[peerId];\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, mids: messages, pinned: werePinned});\n });\n });\n };\n\n private onUpdateNotifySettings = (update: Update.updateNotifySettings) => {\n const {peer, notify_settings} = update;\n const isTopic = peer._ === 'notifyForumTopic';\n const isPeerType = peer._ === 'notifyPeer' || isTopic;\n if(!isPeerType) {\n return;\n }\n\n const peerId = this.appPeersManager.getPeerId(peer.peer);\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, isTopic ? generateMessageId(peer.top_msg_id) : undefined);\n if(!dialog) {\n return;\n }\n\n dialog.notify_settings = notify_settings;\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\n };\n\n private onUpdateNewScheduledMessage = (update: Update.updateNewScheduledMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(!storage) {\n return;\n }\n\n const mid = generateMessageId(message.id);\n\n const oldMessage = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage, isScheduled: true});\n const newMessage = this.getMessageFromStorage(storage, mid);\n\n if(oldMessage) {\n this.handleEditedMessage(oldMessage, newMessage, storage);\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId, mid: message.mid, message});\n } else {\n const pendingMessage = this.checkPendingMessage(message);\n if(!pendingMessage) {\n this.rootScope.dispatchEvent('scheduled_new', message as Message.message);\n }\n }\n };\n\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mids = update.messages.map((id) => generateMessageId(id));\n this.handleDeletedMessages(peerId, storage, mids);\n\n this.rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\n }\n };\n\n private onUpdateMessageExtendedMedia = (update: Update.updateMessageExtendedMedia) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n const mid = generateMessageId(update.msg_id);\n const storage = this.getHistoryMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n const messageMedia = message.media as MessageMedia.messageMediaInvoice;\n if(messageMedia.extended_media?._ === 'messageExtendedMedia') {\n return;\n }\n\n messageMedia.extended_media = update.extended_media;\n this.onUpdateEditMessage({\n _: 'updateEditMessage',\n message,\n pts: 0,\n pts_count: 0\n });\n };\n\n public setDialogToStateIfMessageIsTop(message: MyMessage) {\n if(this.isMessageIsTopMessage(message)) {\n this.dialogsStorage.setDialogToState(this.getDialogOnly(message.peerId));\n }\n }\n\n public isMessageIsTopMessage(message: MyMessage) {\n const dialog = this.getDialogOnly(message.peerId);\n return dialog && dialog.top_message === message.mid;\n }\n\n private updateMessageRepliesIfNeeded(threadMessage: MyMessage) {\n try { // * на всякий случай, скорее всего это не понадобится\n const threadKey = this.getThreadKey(threadMessage);\n if(threadKey) {\n const repliesKey = this.threadsToReplies[threadKey];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n } catch(err) {\n this.log.error('incrementMessageReplies err', err, threadMessage);\n }\n }\n\n private getThreadKey(threadMessage: MyMessage) {\n let threadKey = '';\n if(threadMessage?.peerId?.isAnyChat()) {\n const threadId = getMessageThreadId(threadMessage, this.appChatsManager.isForum(threadMessage.peerId.toChatId()));\n if(threadId) {\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.reloadMessages(peerId, mid, true).then(() => {\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(!message) {\n return;\n }\n\n if(broadcastEventName) {\n this.rootScope.dispatchEvent(broadcastEventName, message);\n }\n\n return message;\n });\n\n return promise;\n }\n\n private checkPendingMessage(message: MyMessage) {\n const randomId = this.pendingByMessageId[message.mid];\n let pendingMessage: ReturnType;\n if(randomId) {\n const pendingData = this.pendingByRandomId[randomId];\n if(pendingMessage = this.finalizePendingMessage(randomId, message)) {\n this.rootScope.dispatchEvent('history_update', {\n storageKey: pendingData.storage.key,\n message,\n sequential: pendingData.sequential\n });\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(options: {peerId: PeerId, muteUntil: number, threadId?: number}) {\n if(!(options = this.appNotificationsManager.validatePeerSettings(options))) {\n return;\n }\n\n const {peerId, muteUntil, threadId} = options;\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n settings.mute_until = muteUntil;\n\n const peer = this.appPeersManager.getInputPeerById(peerId);\n return this.appNotificationsManager.updateNotifySettings(threadId ? {\n _: 'inputNotifyForumTopic',\n peer,\n top_msg_id: getServerMessageId(threadId)\n } : {\n _: 'inputNotifyPeer',\n peer\n }, settings);\n }\n\n public togglePeerMute({peerId, mute, threadId}: {peerId: PeerId, mute?: boolean, threadId?: number}) {\n if(mute === undefined) {\n mute = !this.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false, threadId});\n }\n\n return this.mutePeer({peerId, muteUntil: mute ? MUTE_UNTIL : 0, threadId});\n }\n\n private findPeerIdByMids(mids: number[]) {\n for(let length = mids.length, i = length - 1; i >= 0; --i) {\n const mid = mids[i];\n const message = this.getMessageById(mid);\n if(message) {\n return message.peerId;\n }\n }\n }\n\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return false;\n }\n\n if(peerId.isAnyChat()) {\n const chatId = peerId.toChatId();\n if(threadId) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(topic?.pFlags?.closed && !this.appChatsManager.hasRights(chatId, 'manage_topics')) {\n return false;\n }\n }\n\n // const isChannel = appPeersManager.isChannel(peerId);\n const chat = this.appChatsManager.getChat(chatId) as Chat.chat;\n const hasRights = /* isChannel && */this.appChatsManager.hasRights(chatId, action, undefined, !!threadId);\n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\n } else {\n return this.appUsersManager.canSendToUser(peerId);\n }\n }\n\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\n const pendingData = this.pendingByRandomId[randomId];\n if(!pendingData) {\n return;\n }\n\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [\n this.getHistoryStorage(peerId),\n threadId ? this.getHistoryStorage(peerId, threadId) : undefined\n ]\n .filter(Boolean)\n .forEach((storage) => {\n storage.history.delete(tempId);\n });\n\n // this.log('pending', randomID, historyStorage.pending)\n\n const tempMessage: MyMessage = this.getMessageFromStorage(storage, tempId);\n if(tempMessage) {\n delete finalMessage.pFlags.is_outgoing;\n delete finalMessage.pending;\n delete finalMessage.error;\n delete finalMessage.random_id;\n delete finalMessage.send;\n }\n\n this.rootScope.dispatchEvent('messages_pending');\n\n delete this.pendingByRandomId[randomId];\n\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\n\n return tempMessage;\n }\n\n public finalizePendingMessageCallbacks(storage: MessagesStorage, tempId: number, message: MyMessage) {\n const callbacks = this.tempFinalizeCallbacks[tempId];\n // this.log.warn(callbacks, tempId);\n if(callbacks !== undefined) {\n for(const name in callbacks) {\n const {deferred, callback} = callbacks[name];\n // this.log(`finalizePendingMessageCallbacks: will invoke ${name} callback`);\n callback(message).then(deferred.resolve, deferred.reject);\n }\n\n delete this.tempFinalizeCallbacks[tempId];\n }\n\n // set cached url to media\n if((message as Message.message).media) {\n assumeType(message);\n const {photo: newPhoto, document: newDoc} = message.media as any;\n if(newPhoto) {\n const photo = this.appPhotosManager.getPhoto('' + tempId);\n if(/* photo._ !== 'photoEmpty' */photo) {\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\n const cacheContext = this.thumbsStorage.getCacheContext(newPhoto, newPhotoSize.type);\n const oldCacheContext = this.thumbsStorage.getCacheContext(photo, THUMB_TYPE_FULL);\n Object.assign(cacheContext, oldCacheContext);\n\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\n\n const downloadOptions = getPhotoDownloadOptions(newPhoto, photoSize);\n const fileName = getFileNameByLocation(downloadOptions.location);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n } else if(newDoc) {\n const oldDoc = this.appDocsManager.getDoc('' + tempId);\n if(oldDoc) {\n const oldCacheContext = this.thumbsStorage.getCacheContext(oldDoc);\n if(\n /* doc._ !== 'documentEmpty' && */\n oldDoc.type &&\n oldDoc.type !== 'sticker' &&\n oldDoc.mime_type !== 'image/gif' &&\n oldCacheContext.url\n ) {\n const cacheContext = this.thumbsStorage.getCacheContext(newDoc);\n Object.assign(cacheContext, oldCacheContext);\n\n const fileName = getDocumentInputFileName(newDoc);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n }\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\n delete this.appPollsManager.polls[tempId];\n delete this.appPollsManager.results[tempId];\n }\n }\n\n const tempMessage = this.getMessageFromStorage(storage, tempId);\n storage.delete(tempId);\n\n if(!(tempMessage as Message.message).reply_markup && (message as Message.message).reply_markup) {\n setTimeout(() => { // TODO: refactor it to normal buttons adding\n if(!this.getMessageFromStorage(storage, message.mid)) {\n return;\n }\n\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId: message.peerId, mid: message.mid, message});\n }, 0);\n }\n\n this.handleReleasingMessage(tempMessage, storage);\n\n this.rootScope.dispatchEvent('message_sent', {storageKey: storage.key, tempId, tempMessage, mid: message.mid, message});\n }\n\n public incrementMaxSeenId(maxId: number) {\n if(!maxId || !(!this.maxSeenId || maxId > this.maxSeenId)) {\n return false;\n }\n\n this.maxSeenId = maxId;\n this.appStateManager.pushToState('maxSeenMsgId', maxId);\n\n this.apiManager.invokeApi('messages.receivedMessages', {\n max_id: getServerMessageId(maxId)\n });\n }\n\n public async getMessageReactionsListAndReadParticipants(\n message: Message.message,\n limit?: number,\n reaction?: Reaction,\n offset?: string,\n skipReadParticipants?: boolean,\n skipReactionsList?: boolean\n ) {\n const emptyMessageReactionsList = {\n reactions: [] as MessagePeerReaction[],\n count: 0,\n next_offset: undefined as string\n };\n\n const canViewMessageReadParticipants = await this.canViewMessageReadParticipants(message);\n if(canViewMessageReadParticipants && limit === undefined) {\n limit = 100;\n } else if(limit === undefined) {\n limit = 50;\n }\n\n return Promise.all([\n canViewMessageReadParticipants && !reaction && !skipReadParticipants ? this.getMessageReadParticipants(message.peerId, message.mid).catch(() => [] as UserId[]) : [] as UserId[],\n\n message.reactions?.recent_reactions?.length && !skipReactionsList ? this.appReactionsManager.getMessageReactionsList(message.peerId, message.mid, limit, reaction, offset).catch((err) => emptyMessageReactionsList) : emptyMessageReactionsList\n ]).then(([userIds, messageReactionsList]) => {\n const readParticipantsPeerIds = userIds.map((userId) => userId.toPeerId());\n\n const filteredReadParticipants = readParticipantsPeerIds.slice();\n forEachReverse(filteredReadParticipants, (peerId, idx, arr) => {\n if(messageReactionsList.reactions.some((reaction) => this.appPeersManager.getPeerId(reaction.peer_id) === peerId)) {\n arr.splice(idx, 1);\n }\n });\n\n let combined: {peerId: PeerId, reaction?: Reaction}[] = messageReactionsList.reactions.map((reaction) => ({peerId: this.appPeersManager.getPeerId(reaction.peer_id), reaction: reaction.reaction}));\n combined = combined.concat(filteredReadParticipants.map((readPeerId) => ({peerId: readPeerId})));\n\n return {\n reactions: messageReactionsList.reactions,\n reactionsCount: messageReactionsList.count,\n readParticipants: readParticipantsPeerIds,\n combined: combined,\n nextOffset: messageReactionsList.next_offset\n };\n });\n }\n\n public getMessageReadParticipants(peerId: PeerId, mid: number): Promise {\n return this.apiManager.invokeApiSingle('messages.getMessageReadParticipants', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((userIds) => { // ! convert long to number\n return userIds.map((userId) => userId.toUserId());\n });\n }\n\n public async canViewMessageReadParticipants(message: Message) {\n if(\n message?._ !== 'message' ||\n message.pFlags.is_outgoing ||\n !message.pFlags.out ||\n !this.appPeersManager.isAnyGroup(message.peerId)\n ) {\n return false;\n }\n\n const chat = this.appChatsManager.getChat(message.peerId.toChatId()) as Chat.chat | Chat.channel;\n const appConfig = await this.apiManager.getAppConfig();\n return chat.participants_count <= appConfig.chat_read_mark_size_threshold &&\n (tsNow(true) - message.date) < appConfig.chat_read_mark_expire_period;\n }\n\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\n if(!mids.length) {\n return;\n }\n\n return this.apiManager.invokeApiSingle('messages.getMessagesViews', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n increment: true\n }).then((views) => {\n const updates: Update[] = new Array(mids.length);\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: NULL_PEER_ID,\n peerId,\n id: mids[i],\n views: views.views[i].views\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates,\n chats: views.chats,\n users: views.users\n });\n });\n }\n\n private notifyAboutMessage(message: MyMessage, options: Partial<{\n fwdCount: number,\n peerReaction: MessagePeerReaction,\n peerTypeNotifySettings: PeerNotifySettings\n }> = {}) {\n const peerId = this.getMessagePeer(message);\n\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return;\n }\n\n const tabs = appTabsManager.getTabs();\n let tab = tabs.find((tab) => {\n const {chatPeerIds} = tab.state;\n return chatPeerIds[chatPeerIds.length - 1] === peerId;\n });\n\n if(!tab && tabs.length) {\n tabs.sort((a, b) => a.state.idleStartTime - b.state.idleStartTime);\n tab = !tabs[0].state.idleStartTime ? tabs[0] : tabs[tabs.length - 1];\n }\n\n const port = MTProtoMessagePort.getInstance();\n port.invokeVoid('notificationBuild', {\n message,\n ...options\n }, tab?.source);\n }\n\n public getScheduledMessagesStorage(peerId: PeerId) {\n return this.scheduledMessagesStorage[peerId] ??= this.createMessageStorage(peerId, 'scheduled');\n }\n\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\n }\n\n public getScheduledMessages(peerId: PeerId) {\n if(!this.canSendToPeer(peerId)) return;\n\n const storage = this.getScheduledMessagesStorage(peerId);\n if(storage.size) {\n return [...storage.keys()];\n }\n\n return this.apiManager.invokeApiSingle('messages.getScheduledHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n hash: ''\n }).then((historyResult) => {\n if(historyResult._ !== 'messages.messagesNotModified') {\n this.appUsersManager.saveApiUsers(historyResult.users);\n this.appChatsManager.saveApiChats(historyResult.chats);\n\n const storage = this.getScheduledMessagesStorage(peerId);\n this.saveMessages(historyResult.messages, {storage, isScheduled: true});\n return [...storage.keys()];\n }\n\n return [];\n });\n }\n\n public sendScheduledMessages(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApi('messages.sendScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApi('messages.deleteScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getMessageWithReplies(message: Message.message) {\n return this.filterMessages(message, (message) => !!(message as Message.message).replies)[0] as any;\n }\n\n public getMessageWithCommentReplies(message: Message.message) {\n if(message.peerId !== REPLIES_PEER_ID) {\n message = this.getMessageWithReplies(message);\n const replies = message?.replies;\n if(!(replies && replies.pFlags.comments && replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)) {\n return;\n }\n }\n\n return message;\n }\n\n public isFetchIntervalNeeded(peerId: PeerId) {\n return peerId.isAnyChat() && (\n !this.appChatsManager.isInChat(peerId.toChatId()) ||\n this.appChatsManager.isForum(peerId.toChatId())\n );\n }\n\n public async getNewHistory(peerId: PeerId, threadId?: number) {\n if(!this.isFetchIntervalNeeded(peerId)) {\n return;\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(!slice.isEnd(SliceEnd.Bottom)) {\n return;\n }\n\n delete historyStorage.maxId;\n slice.unsetEnd(SliceEnd.Bottom);\n\n // if there is no id - then request by first id because cannot request by id 0 with backLimit\n const historyResult = await this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\n this.handleNewMessage(this.getMessageByPeer(peerId, historyResult.history[i]));\n }\n\n return {isBottomEnd: historyStorage.history.slice.isEnd(SliceEnd.Bottom)};\n }\n\n /**\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\n */\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: false): Promise | HistoryResult;\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: true): HistoryResult;\n public getHistory(peerId: PeerId, maxId: number = 0, limit?: number, backLimit?: number, threadId?: number/* , onlyCache?: boolean */): Promise | HistoryResult {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n const first = historyStorage.history.first;\n first.setEnd(SliceEnd.Both);\n\n const slice = first.slice(0, 0);\n slice.setEnd(SliceEnd.Both);\n\n return {\n count: 0,\n history: Array.from(slice),\n isEnd: slice.getEnds(),\n offsetIdOffset: 0\n };\n }\n\n let offset = 0;\n /*\n let offsetFound = true;\n\n if(maxId) {\n offsetFound = false;\n for(; offset < historyStorage.history.length; offset++) {\n if(maxId > historyStorage.history.slice[offset]) {\n offsetFound = true;\n break;\n }\n }\n }\n\n if(offsetFound && (\n historyStorage.count !== null && historyStorage.history.length === historyStorage.count ||\n historyStorage.history.length >= offset + limit\n )) {\n if(backLimit) {\n backLimit = Math.min(offset, backLimit);\n offset = Math.max(0, offset - backLimit);\n limit += backLimit;\n } else {\n limit = limit;\n }\n\n const history = historyStorage.history.slice.slice(offset, offset + limit);\n return {\n count: historyStorage.count,\n history: history,\n offsetIdOffset: offset\n };\n }\n\n if(offsetFound) {\n offset = 0;\n } */\n\n if(backLimit) {\n offset = -backLimit;\n limit += backLimit;\n\n /* return this.requestHistory(reqPeerId, maxId, limit, offset, undefined, threadId).then((historyResult) => {\n historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;\n\n const history = (historyResult.messages as MyMessage[]).map((message) => message.mid);\n return {\n count: historyStorage.count,\n history,\n offsetIdOffset: (historyResult as MessagesMessages.messagesMessagesSlice).offset_id_offset || 0\n };\n }); */\n }\n\n const haveSlice = historyStorage.history.sliceMe(maxId, offset, limit);\n if(haveSlice && (haveSlice.slice.length === limit || (haveSlice.fulfilled & SliceEnd.Both) === SliceEnd.Both)) {\n return {\n count: historyStorage.count,\n history: Array.from(haveSlice.slice),\n isEnd: haveSlice.slice.getEnds(),\n offsetIdOffset: haveSlice.offsetIdOffset\n };\n }\n\n // if(onlyCache) {\n // return;\n // }\n\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\n const f = slice?.slice || historyStorage.history.constructSlice();\n return {\n count: historyStorage.count,\n history: Array.from(f),\n isEnd: f.getEnds(),\n offsetIdOffset: slice?.offsetIdOffset || historyStorage.count\n };\n });\n }\n\n public isHistoryResultEnd(historyResult: Exclude, limit: number, add_offset: number) {\n const {offset_id_offset, messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n\n const count = (historyResult as MessagesMessages.messagesMessagesSlice).count || messages.length;\n const offsetIdOffset = offset_id_offset || 0;\n\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\n\n const isTopEnd = offsetIdOffset >= (count - topWasMeantToLoad) || count < topWasMeantToLoad;\n const isBottomEnd = !offsetIdOffset || (add_offset < 0 && (offsetIdOffset + add_offset) <= 0);\n\n return {count, offsetIdOffset, isTopEnd, isBottomEnd};\n }\n\n public mergeHistoryResult(\n slicedArray: SlicedArray,\n historyResult: Parameters[0],\n offset_id: number,\n limit: number,\n add_offset: number\n ) {\n const {messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n const isEnd = this.isHistoryResultEnd(historyResult, limit, add_offset);\n const {count, offsetIdOffset, isTopEnd, isBottomEnd} = isEnd;\n const mids = messages.map((message) => {\n return (message as MyMessage).mid;\n });\n\n // * add bound manually.\n // * offset_id will be inclusive only if there is 'add_offset' <= -1 (-1 - will only include the 'offset_id')\n // * check that offset_id is not 0\n if(offset_id && getServerMessageId(offset_id) && !mids.includes(offset_id) && offsetIdOffset < count) {\n let i = 0;\n for(const length = mids.length; i < length; ++i) {\n if(offset_id > mids[i]) {\n break;\n }\n }\n\n mids.splice(i, 0, offset_id);\n }\n\n const slice = slicedArray.insertSlice(mids) || slicedArray.slice;\n if(isTopEnd) {\n slice.setEnd(SliceEnd.Top);\n }\n\n if(isBottomEnd) {\n slice.setEnd(SliceEnd.Bottom);\n }\n\n return {slice, mids, messages, ...isEnd};\n }\n\n public fillHistoryStorage(peerId: PeerId, offset_id: number, limit: number, add_offset: number, historyStorage: HistoryStorage, threadId?: number): Promise {\n const wasMaxId = historyStorage.maxId;\n return this.requestHistory(peerId, offset_id, limit, add_offset, undefined, threadId).then((historyResult) => {\n const {count, isBottomEnd, slice, messages} = this.mergeHistoryResult(historyStorage.history, historyResult, offset_id, limit, add_offset);\n\n historyStorage.count = count;\n\n /* if(!maxId && historyResult.messages.length) {\n maxId = this.incrementMessageId((historyResult.messages[0] as MyMessage).mid, 1);\n }\n\n const wasTotalCount = historyStorage.history.length; */\n\n for(let i = 0, length = messages.length; i < length; ++i) {\n const message = messages[i] as MyMessage;\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n if(isBottomEnd) {\n const newMaxId = slice[0];\n\n if(historyStorage.maxId === wasMaxId) {\n const first = historyStorage.history.first;\n if(first !== slice) {\n historyStorage.history.deleteSlice(first);\n }\n\n if(historyStorage.maxId !== newMaxId) {\n historyStorage.maxId = slice[0]; // ! WARNING\n\n this.reloadConversation(peerId); // when top_message is deleted but cached\n }\n }\n }\n\n /* const isBackLimit = offset < 0 && -offset !== fullLimit;\n if(isBackLimit) {\n return;\n }\n\n const totalCount = historyStorage.history.length;\n fullLimit -= (totalCount - wasTotalCount);\n\n const migratedNextPeer = this.migratedFromTo[peerId];\n const migratedPrevPeer = this.migratedToFrom[peerId]\n const isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\n\n if(isMigrated) {\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\n }\n\n if(fullLimit > 0) {\n maxId = historyStorage.history.slice[totalCount - 1];\n if(isMigrated) {\n if(!historyResult.messages.length) {\n if(migratedPrevPeer) {\n maxId = 0;\n peerId = migratedPrevPeer;\n } else {\n historyStorage.count = totalCount;\n return true;\n }\n }\n\n return this.fillHistoryStorage(peerId, maxId, fullLimit, historyStorage, threadId);\n } else if(totalCount < historyStorage.count) {\n return this.fillHistoryStorage(peerId, maxId, fullLimit, offset, historyStorage, threadId);\n }\n } */\n });\n }\n\n public requestHistory(peerId: PeerId, maxId: number, limit = 0, offset = 0, offsetDate = 0, threadId = 0): Promise> {\n // console.trace('requestHistory', peerId, maxId, limit, offset);\n\n // rootScope.broadcast('history_request');\n\n const options: MessagesGetReplies | MessagesGetHistory = {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: getServerMessageId(maxId) || 0,\n offset_date: offsetDate,\n add_offset: offset,\n limit,\n max_id: 0,\n min_id: 0,\n hash: 0\n };\n\n if(threadId) {\n (options as MessagesGetReplies).msg_id = getServerMessageId(threadId) || 0;\n }\n\n const promise: ReturnType = this.apiManager.invokeApiSingle(threadId ? 'messages.getReplies' : 'messages.getHistory', options, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n }) as any;\n\n return promise.then((historyResult) => {\n if(DEBUG) {\n this.log('requestHistory result:', peerId, historyResult, maxId, limit, offset);\n }\n\n this.appUsersManager.saveApiUsers(historyResult.users);\n this.appChatsManager.saveApiChats(historyResult.chats);\n this.saveMessages(historyResult.messages);\n\n if('pts' in historyResult) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), historyResult.pts);\n }\n\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\n if(length && !historyResult.messages[length - 1]) {\n historyResult.messages.splice(length - 1, 1);\n length--;\n count--;\n }\n\n // will load more history if last message is album grouped (because it can be not last item)\n // historyResult.messages: desc sorted\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const oldestMessage: Message.message = historyResult.messages[length - 1] as any;\n if(length && oldestMessage.grouped_id) {\n const foundSlice = historyStorage.history.findSlice(oldestMessage.mid);\n if(foundSlice && (foundSlice.slice.length + historyResult.messages.length) < count) {\n return this.requestHistory(peerId, oldestMessage.mid, 10, 0, offsetDate, threadId).then((_historyResult) => {\n return historyResult;\n });\n }\n }\n\n return historyResult;\n }, (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = this.appChatsManager.getChat(peerId.toChatId());\n if(channel._ === 'channel') {\n channel = {\n _: 'channelForbidden',\n id: peerId.toChatId(),\n access_hash: channel.access_hash,\n title: channel.title,\n pFlags: channel.pFlags\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: peerId.toChatId()\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n });\n }\n\n public fetchSingleMessages() {\n if(this.fetchSingleMessagesPromise) {\n return this.fetchSingleMessagesPromise;\n }\n\n return this.fetchSingleMessagesPromise = pause(0).then(() => {\n const requestPromises: Promise[] = [];\n\n for(const [peerId, map] of this.needSingleMessages) {\n const mids = [...map.keys()];\n const msgIds: InputMessage[] = mids.map((mid) => {\n return {\n _: 'inputMessageID',\n id: getServerMessageId(mid)\n };\n });\n\n let promise: Promise;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n promise = this.apiManager.invokeApiSingle('channels.getMessages', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n id: msgIds\n });\n } else {\n promise = this.apiManager.invokeApiSingle('messages.getMessages', {\n id: msgIds\n });\n }\n\n const after = promise.then((getMessagesResult) => {\n assumeType>(getMessagesResult);\n\n this.appUsersManager.saveApiUsers(getMessagesResult.users);\n this.appChatsManager.saveApiChats(getMessagesResult.chats);\n const messages = this.saveMessages(getMessagesResult.messages);\n\n for(let i = 0; i < messages.length; ++i) {\n const message = messages[i];\n if(!message) {\n continue;\n }\n\n const mid = generateMessageId(message.id);\n const promise = map.get(mid);\n promise.resolve(message);\n map.delete(mid);\n }\n\n if(map.size) {\n for(const [mid, promise] of map) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n }\n }).finally(() => {\n this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\n });\n\n requestPromises.push(after);\n }\n\n this.needSingleMessages.clear();\n\n return Promise.all(requestPromises).then(noop, noop).then(() => {\n this.fetchSingleMessagesPromise = undefined;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n });\n });\n }\n\n public reloadMessages(peerId: PeerId, mid: number, overwrite?: boolean): Promise;\n public reloadMessages(peerId: PeerId, mid: number[], overwrite?: boolean): Promise;\n public reloadMessages(peerId: PeerId, mid: number | number[], overwrite?: boolean): Promise {\n if(Array.isArray(mid)) {\n return Promise.all(mid.map((mid) => {\n return this.reloadMessages(peerId, mid, overwrite);\n }));\n }\n\n const message = this.getMessageByPeer(peerId, mid);\n if(message && !overwrite) {\n this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids: [mid]});\n return Promise.resolve(message);\n } else {\n let map = this.needSingleMessages.get(peerId);\n if(!map) {\n this.needSingleMessages.set(peerId, map = new Map());\n }\n\n let promise = map.get(mid);\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n map.set(mid, promise);\n this.fetchSingleMessages();\n return promise;\n }\n }\n\n public getExtendedMedia(peerId: PeerId, mids: number[]) {\n let map = this.extendedMedia.get(peerId);\n if(!map) {\n this.extendedMedia.set(peerId, map = new Map());\n }\n\n const deferred = deferredPromise();\n const toRequest: number[] = [];\n const promises = mids.map((mid) => {\n let promise = map.get(mid);\n if(!promise) {\n map.set(mid, promise = deferred);\n toRequest.push(mid);\n\n promise.then(() => {\n map.delete(mid);\n if(!map.size && this.extendedMedia.get(peerId) === map) {\n this.extendedMedia.delete(peerId);\n }\n });\n }\n\n return promise;\n });\n\n if(!toRequest.length) {\n deferred.resolve();\n } else {\n this.apiManager.invokeApi('messages.getExtendedMedia', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: toRequest.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n });\n }\n\n return Promise.all(promises);\n }\n\n public fetchMessageReplyTo(message: MyMessage) {\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\n const replyToPeerId = message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.reloadMessages(replyToPeerId, message.reply_to_mid).then((originalMessage) => {\n if(!originalMessage) { // ! break the infinite loop\n message = this.getMessageByPeer(message.peerId, message.mid); // message can come from other thread\n delete message.reply_to_mid; // ! WARNING!\n }\n\n if(message._ === 'messageService') {\n const peerId = message.peerId;\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: `${peerId}_history`,\n peerId: peerId,\n mid: message.mid,\n message\n });\n\n if(this.isMessageIsTopMessage(message)) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, {dialog: this.getDialogOnly(peerId)}]]));\n }\n }\n\n return originalMessage;\n });\n }\n\n private getTypingKey(peerId: PeerId, threadId?: number) {\n return threadId ? `${peerId}_${threadId}` : peerId;\n }\n\n public setTyping(\n peerId: PeerId,\n action: SendMessageAction,\n force?: boolean,\n threadId?: number\n ): Promise {\n if(threadId && !this.appPeersManager.isForum(peerId)) {\n threadId = undefined;\n }\n\n const key = this.getTypingKey(peerId, threadId);\n let typing = this.typings[key];\n if(\n !peerId ||\n !this.canSendToPeer(peerId) ||\n peerId === this.appPeersManager.peerId ||\n // (!force && deepEqual(typing?.action, action))\n (!force && typing?.action?._ === action._)\n ) {\n return Promise.resolve(false);\n }\n\n if(typing?.timeout) {\n clearTimeout(typing.timeout);\n }\n\n typing = this.typings[key] = {\n action\n };\n\n return this.apiManager.invokeApi('messages.setTyping', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n action,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n }).finally(() => {\n if(typing === this.typings[key]) {\n typing.timeout = ctx.setTimeout(() => {\n delete this.typings[key];\n }, 6000);\n }\n });\n }\n\n private handleReleasingMessage(message: MyMessage, storage: MessagesStorage) {\n const media = (message as Message.message).media;\n if(media) {\n const c = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || media as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument;\n const smth: Photo.photo | MyDocument = (c as MessageMedia.messageMediaPhoto).photo as any || (c as MessageMedia.messageMediaDocument).document as any;\n\n if(smth?.file_reference) {\n this.referenceDatabase.deleteContext(smth.file_reference, {type: 'message', peerId: message.peerId, messageId: message.mid});\n }\n\n if('webpage' in media && media.webpage) {\n const isScheduled = this.getScheduledMessagesStorage(message.peerId) === storage;\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\n this.appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\n }\n\n if((media as MessageMedia.messageMediaPoll).poll) {\n this.appPollsManager.updatePollToMessage(message as Message.message, false);\n }\n }\n }\n\n private handleDeletedMessages(peerId: PeerId, storage: MessagesStorage, messages: number[]) {\n const history: {\n count: number,\n unread: number,\n unreadMentions: number,\n msgs: Set,\n albums?: {[groupId: string]: Set},\n } = {\n count: 0,\n unread: 0,\n unreadMentions: 0,\n msgs: new Set()\n };\n\n for(const mid of messages) {\n const message: MyMessage = this.getMessageFromStorage(storage, mid);\n if(!message) {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n continue;\n }\n\n this.handleReleasingMessage(message, storage);\n\n this.updateMessageRepliesIfNeeded(message);\n\n if(!message.pFlags.out && !message.pFlags.is_outgoing && message.pFlags.unread) {\n ++history.unread;\n this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\n\n if(message.pFlags.mentioned) {\n ++history.unreadMentions;\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n\n ++history.count;\n history.msgs.add(mid);\n\n message.deleted = true;\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const groupedStorage = this.groupedMessagesStorage[groupedId];\n if(groupedStorage) {\n groupedStorage.delete(mid);\n\n if(!history.albums) history.albums = {};\n (history.albums[groupedId] || (history.albums[groupedId] = new Set())).add(mid);\n\n if(!groupedStorage.size) {\n delete history.albums;\n delete this.groupedMessagesStorage[groupedId];\n }\n }\n }\n\n storage.delete(mid);\n }\n\n if(history.albums) {\n for(const groupedId in history.albums) {\n this.dispatchAlbumEdit(groupedId, storage, [...history.albums[groupedId]]);\n /* const mids = this.getMidsByAlbum(groupId);\n if(mids.length) {\n const mid = Math.max(...mids);\n rootScope.$broadcast('message_edit', {peerId, mid, justMedia: false});\n } */\n }\n }\n\n return history;\n }\n\n private handleEditedMessage(oldMessage: Message, newMessage: Message, storage: MessagesStorage) {\n if(oldMessage._ === 'message') {\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\n this.appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\n }\n\n const groupedId = oldMessage.grouped_id;\n if(groupedId) {\n this.dispatchAlbumEdit(groupedId, storage, []);\n }\n }\n }\n\n private dispatchAlbumEdit(groupedId: string, storage: MessagesStorage, deletedMids?: number[]) {\n const mids = this.getMidsByAlbum(groupedId);\n const messages = mids.map((mid) => this.getMessageFromStorage(storage, mid)) as Message.message[];\n this.rootScope.dispatchEvent('album_edit', {peerId: messages[0].peerId, groupId: groupedId, deletedMids: deletedMids || [], messages});\n }\n\n public getDialogUnreadCount(dialog: Dialog | ForumTopic) {\n let unreadCount = dialog.unread_count;\n if(!this.dialogsStorage.isTopic(dialog) && this.appPeersManager.isForum(dialog.peerId)) {\n const forumUnreadCount = this.dialogsStorage.getForumUnreadCount(dialog.peerId);\n if(forumUnreadCount instanceof Promise) {\n unreadCount = 0;\n } else {\n unreadCount = forumUnreadCount.count;\n }\n }\n\n return unreadCount || +!!(dialog as Dialog).pFlags?.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog | ForumTopic) {\n return !!this.getDialogUnreadCount(dialog);\n }\n\n public canForward(message: Message.message | Message.messageService) {\n return message?._ === 'message' && !(message as Message.message).pFlags.noforwards && !this.appPeersManager.noForwards(message.peerId);\n }\n\n private pushBatchUpdate(\n event: E,\n callback: C,\n key: string,\n getElementCallback?: () => MapValueType[0]>\n ) {\n let details = this.batchUpdates[event];\n if(!details) {\n // @ts-ignore\n details = this.batchUpdates[event] = {\n callback,\n batch: new Map()\n };\n }\n\n if(!details.batch.has(key)) {\n // @ts-ignore\n details.batch.set(key, getElementCallback ? getElementCallback() : undefined);\n this.batchUpdatesDebounced();\n }\n }\n\n private getMessagesFromMap>(map: T) {\n const newMap: Map> = new Map();\n for(const [key, value] of map) {\n const [peerIdStr, mid] = key.split('_');\n const message = this.getMessageByPeer(peerIdStr.toPeerId(), +mid) as Message.message;\n if(!message) {\n continue;\n }\n\n newMap.set(message, value);\n }\n\n return newMap;\n }\n\n private batchUpdateViews = (batch: Map) => {\n const toDispatch: {peerId: PeerId, mid: number, views: number}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message] of map) {\n toDispatch.push({\n peerId: message.peerId,\n mid: message.mid,\n views: message.views\n })\n }\n\n return toDispatch;\n };\n\n private batchUpdateReactions = (batch: Map) => {\n const toDispatch: {message: Message.message, changedResults: ReactionCount.reactionCount[]}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message, previousReactions] of map) {\n const results = message.reactions?.results ?? [];\n const previousResults = previousReactions?.results ?? [];\n const changedResults = results.filter((reactionCount) => {\n const previousReactionCount = previousResults.find((_reactionCount) => reactionsEqual(_reactionCount.reaction, reactionCount.reaction));\n return (\n message.pFlags.out && (\n !previousReactionCount ||\n reactionCount.count > previousReactionCount.count\n )\n ) || (\n reactionCount.chosen_order !== undefined && (\n !previousReactionCount ||\n previousReactionCount.chosen_order === undefined\n )\n );\n });\n\n toDispatch.push({message, changedResults});\n }\n\n return toDispatch;\n };\n\n public saveDefaultSendAs(peerId: PeerId, sendAsPeerId: PeerId) {\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n channelFull.default_send_as = this.appPeersManager.getOutputPeer(sendAsPeerId);\n return this.apiManager.invokeApi('messages.saveDefaultSendAs', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n send_as: this.appPeersManager.getInputPeerById(sendAsPeerId)\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getFileNameByLocation} from '../../../../helpers/fileName';\nimport {Document} from '../../../../layer';\nimport getDocumentInputFileLocation from './getDocumentInputFileLocation';\n\nexport default function getDocumentInputFileName(doc: Document.document, thumbSize?: string) {\n return getFileNameByLocation(getDocumentInputFileLocation(doc, thumbSize), {fileName: doc.file_name});\n}\n","export default function convertInputKeyToKey(inputKey: string) {\n const str = inputKey.replace('input', '');\n return (str[0].toLowerCase() + str.slice(1)) as T;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport tsNow from '../../helpers/tsNow';\nimport {InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update} from '../../layer';\nimport {MUTE_UNTIL} from '../mtproto/mtproto_config';\nimport throttle from '../../helpers/schedulers/throttle';\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\nimport {AppManager} from './manager';\nimport ctx from '../../environment/ctx';\nimport assumeType from '../../helpers/assumeType';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\ntype ImSadAboutIt = Promise | PeerNotifySettings;\ntype MyNotifyPeer = Exclude;\ntype MyInputNotifyPeer = Exclude;\nexport class AppNotificationsManager extends AppManager {\n private peerSettings = {\n notifyPeer: {} as {[peerId: string]: ImSadAboutIt},\n notifyUsers: null as ImSadAboutIt,\n notifyChats: null as ImSadAboutIt,\n notifyBroadcasts: null as ImSadAboutIt,\n notifyForumTopic: {} as {[peerId_threadId: string]: ImSadAboutIt}\n };\n // private exceptions: {[peerId: string]: PeerNotifySettings} = {};\n\n private getNotifyPeerTypePromise: Promise;\n\n private checkMuteUntilTimeout: number;\n private checkMuteUntilThrottled: () => void;\n\n private notifyContactsSignUp: Promise;\n\n protected after() {\n this.checkMuteUntilThrottled = throttle(this.checkMuteUntil, 1000, false);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateNotifySettings: (update) => {\n const {peer} = update;\n const isTopic = peer._ === 'notifyForumTopic';\n const isPeerType = peer._ === 'notifyPeer' || isTopic;\n const peerId = isPeerType && this.appPeersManager.getPeerId(peer.peer);\n const key = !isPeerType ? peer._ : undefined;\n this.savePeerSettings({\n key,\n peerId,\n threadId: isTopic ? generateMessageId(peer.top_msg_id) : undefined,\n settings: update.notify_settings\n });\n this.rootScope.dispatchEvent('notify_settings', update);\n }\n });\n\n return this.appStateManager.getState().then((state) => {\n if(state.notifySettings) {\n for(const key in state.notifySettings) {\n assumeType(key);\n this.savePeerSettings({\n key,\n settings: state.notifySettings[key]\n });\n }\n }\n });\n }\n\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\n let key: any = convertInputKeyToKey(peer._);\n let obj: any = this.peerSettings[key as MyNotifyPeer];\n\n let peerId: PeerId;\n if(peer._ === 'inputNotifyPeer') {\n peerId = key = this.appPeersManager.getPeerId(peer.peer);\n obj = obj[key];\n }\n\n if(obj) {\n return obj;\n }\n\n return (obj || this.peerSettings)[key] = this.apiManager.invokeApi('account.getNotifySettings', {peer})\n .then((settings) => {\n this.savePeerSettings({\n key,\n peerId,\n settings\n });\n\n return settings;\n });\n }\n\n public getNotifyPeerTypeSettings() {\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\n\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as MyInputNotifyPeer[])\n .map((inputKey) => {\n return this.getNotifySettings({_: inputKey});\n });\n\n return this.getNotifyPeerTypePromise = Promise.all(promises);\n }\n\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\n // this.savePeerSettings(peerId, settings);\n\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\n inputSettings._ = 'inputPeerNotifySettings'; */\n\n return this.apiManager.invokeApi('account.updateNotifySettings', {\n peer,\n settings\n }).then((value) => {\n if(value) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateNotifySettings',\n peer: {\n ...peer as any,\n _: convertInputKeyToKey(peer._)\n },\n notify_settings: { // ! WOW, IT WORKS !\n ...settings,\n _: 'peerNotifySettings'\n }\n });\n }\n });\n }\n\n // public getNotifyExceptions() {\n // apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\n // .then((updates) => {\n // apiUpdatesManager.processUpdateMessage(updates);\n // });\n // }\n\n public getContactSignUpNotification() {\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\n return this.notifyContactsSignUp = this.apiManager.invokeApi('account.getContactSignUpNotification');\n }\n\n public setContactSignUpNotification(silent: boolean) {\n this.apiManager.invokeApi('account.setContactSignUpNotification', {silent})\n .then((value) => {\n this.notifyContactsSignUp = Promise.resolve(!silent);\n });\n }\n\n private checkMuteUntil = () => {\n if(this.checkMuteUntilTimeout !== undefined) {\n clearTimeout(this.checkMuteUntilTimeout);\n this.checkMuteUntilTimeout = undefined;\n }\n\n const timestamp = tsNow(true);\n let closestMuteUntil = MUTE_UNTIL;\n\n const p = (peerNotifySettings: ImSadAboutIt): peerNotifySettings is PeerNotifySettings => {\n if(peerNotifySettings instanceof Promise) {\n return false;\n }\n\n const muteUntil = peerNotifySettings.mute_until;\n if(!muteUntil) {\n return false;\n }\n\n if(muteUntil <= timestamp) {\n // ! do not delete it because peer's unique settings will be overwritten in getPeerLocalSettings with type's settings\n peerNotifySettings.mute_until = 0;\n return true;\n } else if(muteUntil < closestMuteUntil) {\n closestMuteUntil = muteUntil;\n }\n\n return false;\n };\n\n [\n 'notifyPeer' as const,\n 'notifyForumTopic' as const\n ].forEach((typeKey) => {\n for(const key in this.peerSettings[typeKey]) {\n const peerNotifySettings = this.peerSettings[typeKey][key];\n if(p(peerNotifySettings)) {\n const [peerId, topicId] = key.split('_');\n const peer = this.appPeersManager.getOutputPeer(peerId.toPeerId());\n this.apiUpdatesManager.saveUpdate({\n _: 'updateNotifySettings',\n peer: topicId ? {\n _: 'notifyForumTopic',\n peer,\n top_msg_id: +topicId\n } : {\n _: 'notifyPeer',\n peer\n },\n notify_settings: peerNotifySettings\n });\n }\n }\n });\n\n const timeout = Math.min(1800e3, (closestMuteUntil - timestamp) * 1000);\n this.checkMuteUntilTimeout = ctx.setTimeout(this.checkMuteUntil, timeout);\n };\n\n public getPeerKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n public savePeerSettings({key, peerId, threadId, settings}: {\n key?: Exclude,\n peerId?: PeerId,\n threadId?: number,\n settings: PeerNotifySettings\n }) {\n let obj: any;\n if(peerId) {\n key = this.getPeerKey(peerId, threadId) as any;\n obj = this.peerSettings[threadId ? 'notifyForumTopic' : 'notifyPeer'];\n }\n\n (obj || this.peerSettings)[key] = settings;\n\n if(!peerId) {\n this.rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\n this.appStateManager.getState().then((state) => {\n const notifySettings = state.notifySettings;\n notifySettings[key] = settings;\n this.appStateManager.pushToState('notifySettings', notifySettings);\n });\n } else {\n this.checkMuteUntilThrottled();\n }\n\n // rootScope.broadcast('notify_settings', {peerId: peerId});\n }\n\n public isMuted(peerNotifySettings: PeerNotifySettings) {\n return peerNotifySettings._ === 'peerNotifySettings' &&\n (peerNotifySettings.silent || (peerNotifySettings.mute_until !== undefined && (peerNotifySettings.mute_until * 1000) > tsNow()));\n }\n\n private getPeerMuted(peerId: PeerId) {\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: this.appPeersManager.getInputPeerById(peerId)});\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\n }\n\n private getPeerLocalSettings({\n peerId,\n respectType = true,\n threadId\n }: {\n peerId: PeerId,\n respectType?: boolean,\n threadId?: number\n }): PeerNotifySettings {\n const n: PeerNotifySettings = {\n _: 'peerNotifySettings'\n };\n\n const peerKey = this.getPeerKey(peerId, threadId);\n const notifySettings = this.peerSettings[threadId ? 'notifyForumTopic' : 'notifyPeer'][peerKey];\n // if(!notifySettings || (notifySettings instanceof Promise)) return false;\n if(notifySettings && !(notifySettings instanceof Promise)) {\n Object.assign(n, notifySettings);\n }\n\n if(respectType) {\n const inputNotify = this.appPeersManager.getInputNotifyPeerById({peerId, ignorePeerId: true, threadId});\n const key = convertInputKeyToKey(inputNotify._);\n const typeNotifySettings = this.peerSettings[key as MyNotifyPeer];\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\n for(const i in typeNotifySettings) {\n // @ts-ignore\n if(n[i] === undefined) {\n // @ts-ignore\n n[i] = typeNotifySettings[i];\n }\n }\n }\n }\n\n return n;\n }\n\n public validatePeerSettings[0]>(options: T): T {\n if(options.peerId === this.appPeersManager.peerId) return;\n if(options.threadId && !this.appPeersManager.isForum(options.peerId)) options.threadId = undefined;\n return options;\n }\n\n public isPeerLocalMuted(options: Parameters[0]): boolean {\n if(!(options = this.validatePeerSettings(options))) return false;\n\n if(options.threadId) {\n const notifySettings = this.getPeerLocalSettings({...options, respectType: false});\n if(notifySettings.silent !== undefined || notifySettings.mute_until !== undefined) {\n return this.isMuted(notifySettings);\n } else {\n return this.isPeerLocalMuted({...options, threadId: undefined});\n }\n }\n\n const notifySettings = this.getPeerLocalSettings(options);\n const isMuted = this.isMuted(notifySettings);\n return isMuted;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto} from '../../layer';\nimport type {LangPackKey} from '../langPack';\nimport {getRestrictionReason} from '../../helpers/restrictions';\nimport isObject from '../../helpers/object/isObject';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\nimport isUser from './utils/peers/isUser';\nimport isAnyChat from './utils/peers/isAnyChat';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\nimport isPeerRestricted from './utils/peers/isPeerRestricted';\nimport getPeerPhoto from './utils/peers/getPeerPhoto';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\nexport class AppPeersManager extends AppManager {\n public get peerId() {\n return this.appUsersManager.userId.toPeerId();\n }\n /* public savePeerInstance(peerId: PeerId, instance: any) {\n if(peerId < 0) appChatsManager.saveApiChat(instance);\n else appUsersManager.saveApiUser(instance);\n } */\n\n public canPinMessage(peerId: PeerId) {\n return peerId.isUser() || this.appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\n }\n\n public getPeerPhoto(peerId: PeerId) {\n const peer = this.getPeer(peerId) as User.user | Chat.channel;\n return getPeerPhoto(peer);\n }\n\n public getPeerMigratedTo(peerId: PeerId) {\n if(peerId.isUser()) {\n return false;\n }\n\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n const migratedTo = chat?.migrated_to;\n if(migratedTo && chat.pFlags.deactivated) {\n return getPeerId(migratedTo);\n }\n\n return false;\n }\n\n public getOutputPeer(peerId: PeerId): Peer {\n if(peerId.isUser()) {\n return {_: 'peerUser', user_id: peerId.toUserId()};\n }\n\n const chatId = peerId.toChatId();\n if(this.appChatsManager.isChannel(chatId)) {\n return {_: 'peerChannel', channel_id: chatId};\n }\n\n return {_: 'peerChat', chat_id: chatId};\n }\n\n public getPeerString(peerId: PeerId) {\n if(peerId.isUser()) {\n return this.appUsersManager.getUserString(peerId.toUserId());\n }\n return this.appChatsManager.getChatString(peerId.toChatId());\n }\n\n public getPeerUsername(peerId: PeerId) {\n return this.getPeerActiveUsernames(peerId)[0] || '';\n }\n\n public getPeerActiveUsernames(peerId: PeerId) {\n const peer = this.getPeer(peerId);\n return getPeerActiveUsernames(peer);\n }\n\n public getPeer(peerId: PeerId) {\n return peerId.isUser() ?\n this.appUsersManager.getUser(peerId.toUserId()) :\n this.appChatsManager.getChat(peerId.toChatId());\n }\n\n public getPeerId(peerId: Parameters[0]) {\n return getPeerId(peerId) || (isObject(peerId) && peerId._ === 'inputPeerSelf' && this.peerId) || NULL_PEER_ID;\n }\n\n public getDialogPeer(peerId: PeerId): DialogPeer {\n return {\n _: 'dialogPeer',\n peer: this.getOutputPeer(peerId)\n };\n }\n\n public isChannel(peerId: PeerId): boolean {\n return !peerId.isUser() && this.appChatsManager.isChannel(peerId.toChatId());\n }\n\n public isMegagroup(peerId: PeerId) {\n return !peerId.isUser() && this.appChatsManager.isMegagroup(peerId.toChatId());\n }\n\n public isForum(peerId: PeerId) {\n return !peerId.isUser() && this.appChatsManager.isForum(peerId.toChatId());\n }\n\n public isAnyGroup(peerId: PeerId): boolean {\n return !peerId.isUser() && !this.appChatsManager.isBroadcast(peerId.toChatId());\n }\n\n public isBroadcast(peerId: PeerId): boolean {\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\n }\n\n public isBot(peerId: PeerId): boolean {\n return peerId.isUser() && this.appUsersManager.isBot(peerId.toUserId());\n }\n\n public isContact(peerId: PeerId): boolean {\n return peerId.isUser() && this.appUsersManager.isContact(peerId.toUserId());\n }\n\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\n return isUser(peerId);\n }\n\n public isAnyChat(peerId: PeerId) {\n return isAnyChat(peerId);\n }\n\n public isPeerRestricted(peerId: PeerId) {\n return isPeerRestricted(this.getPeer(peerId));\n }\n\n public getRestrictionReasonText(peerId: PeerId) {\n const peer = this.getPeer(peerId) as Chat.channel | User.user;\n const reason = peer.restriction_reason ? getRestrictionReason(peer.restriction_reason) : undefined;\n if(reason) {\n return reason.text;\n } else {\n return peerId.isUser() ? 'This user is restricted' : 'This chat is restricted';\n }\n }\n\n /* public getInputPeer(peerString: string): InputPeer {\n var firstChar = peerString.charAt(0);\n var peerParams = peerString.substr(1).split('_');\n let id = +peerParams[0];\n\n if(firstChar === 'u') {\n //appUsersManager.saveUserAccess(id, peerParams[1]);\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: peerParams[1]\n };\n } else if(firstChar === 'c' || firstChar === 's') {\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\n if(firstChar === 's') {\n appChatsManager.saveIsMegagroup(id);\n }\n\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: peerParams[1] || '0'\n };\n } else {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n } */\n\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude;\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\n public getInputNotifyPeerById({\n peerId,\n ignorePeerId,\n threadId\n }: T): T['ignorePeerId'] extends true ? Exclude : (T['threadId'] extends number ? InputNotifyPeer.inputNotifyForumTopic : InputNotifyPeer.inputNotifyPeer) {\n if(ignorePeerId) {\n if(peerId.isUser()) {\n return {_: 'inputNotifyUsers'} as any;\n } else {\n if(this.isBroadcast(peerId)) {\n return {_: 'inputNotifyBroadcasts'} as any;\n } else {\n return {_: 'inputNotifyChats'} as any;\n }\n }\n } else if(threadId) {\n return {\n _: 'inputNotifyForumTopic',\n peer: this.getInputPeerById(peerId),\n top_msg_id: getServerMessageId(threadId)\n } as any;\n } else {\n return {\n _: 'inputNotifyPeer',\n peer: this.getInputPeerById(peerId)\n } as any;\n }\n }\n\n public getInputPeerById(peerId: PeerId): InputPeer {\n if(!peerId) {\n return {_: 'inputPeerEmpty'};\n }\n\n if(!peerId.isUser()) {\n const chatId = peerId.toChatId();\n return this.appChatsManager.getInputPeer(chatId);\n }\n\n const userId = peerId.toUserId();\n return this.appUsersManager.getUserInputPeer(userId);\n }\n\n /**\n * ! use it only in safe places like requests\n */\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\n return {_: 'inputPeerSelf'};\n }\n\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\n return {\n _: 'inputDialogPeer',\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\n };\n }\n\n public getPeerSearchText(peerId: PeerId) {\n let text: string;\n if(this.isUser(peerId)) {\n text = '%pu ' + this.appUsersManager.getUserSearchText(peerId.toUserId());\n } else {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n text = '%pg ' + (chat.title || '');\n }\n\n return text;\n }\n\n public getDialogType(peerId: PeerId): PeerType {\n if(this.isMegagroup(peerId)) {\n return 'megagroup';\n } else if(this.isChannel(peerId)) {\n return 'channel';\n } else if(!this.isUser(peerId)) {\n return 'group';\n } else {\n return peerId === this.peerId ? 'saved' : 'chat';\n }\n }\n\n public getDeleteButtonText(peerId: PeerId): Extract {\n switch(this.getDialogType(peerId)) {\n case 'channel':\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\n\n case 'megagroup':\n case 'group':\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\n\n default:\n return 'ChatList.Context.DeleteChat';\n }\n }\n\n public noForwards(peerId: PeerId) {\n if(peerId.isUser()) return false;\n else {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n return !!(chat as Chat.chat).pFlags?.noforwards;\n }\n }\n}\n\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Photo, PhotoSize, PhotosPhotos} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\nimport {AppManager} from './manager';\n\nexport type MyPhoto = Photo.photo;\n\n// TIMES = 2 DUE TO SIDEBAR AND CHAT\n// let TEST_FILE_REFERENCE = \"5440692274120994569\", TEST_FILE_REFERENCE_TIMES = 2;\n\nexport class AppPhotosManager extends AppManager {\n private photos: {\n [id: string]: MyPhoto\n } = {};\n\n public savePhoto(photo: Photo, context?: ReferenceContext) {\n if(!photo || photo._ === 'photoEmpty') return;\n\n /* if(photo.id === TEST_FILE_REFERENCE) {\n console.warn('Testing FILE_REFERENCE_EXPIRED');\n const bytes = [2, 67, 175, 43, 190, 0, 0, 20, 62, 95, 111, 33, 45, 99, 220, 116, 218, 11, 167, 127, 213, 18, 127, 32, 243, 202, 117, 80, 30];\n //photo.file_reference = new Uint8Array(bytes);\n photo.file_reference = bytes;\n if(!--TEST_FILE_REFERENCE_TIMES) {\n TEST_FILE_REFERENCE = '';\n }\n } */\n\n const oldPhoto = this.photos[photo.id];\n if(photo.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldPhoto, photo);\n this.referenceDatabase.saveContext(photo.file_reference, context);\n }\n\n if(photo.sizes?.length) {\n // * sometimes photoStrippedSize can be the last item\n photo.sizes.sort((a, b) => {\n return ((a as PhotoSize.photoSize).size || ((a as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0)) - ((b as PhotoSize.photoSize).size || ((b as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0));\n });\n\n const size = photo.sizes[photo.sizes.length - 1];\n if(size._ === 'photoSizeProgressive') {\n size.size = size.sizes[size.sizes.length - 1];\n }\n }\n\n if(oldPhoto) {\n return Object.assign(oldPhoto, photo);\n }\n\n return this.photos[photo.id] = photo;\n }\n\n public getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\n const inputUser = this.appUsersManager.getUserInput(userId);\n return this.apiManager.invokeApiCacheable('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit,\n max_id: maxId\n }, {cacheSeconds: 60}).then((photosResult) => {\n this.appUsersManager.saveApiUsers(photosResult.users);\n const photoIds = photosResult.photos.map((photo, idx) => {\n photosResult.photos[idx] = this.savePhoto(photo, {type: 'profilePhoto', peerId: userId.toPeerId()});\n return photo.id;\n });\n\n // ! WARNING !\n if(maxId !== '0' && maxId) {\n const idx = photoIds.indexOf(maxId);\n if(idx !== -1) {\n photoIds.splice(idx, 1);\n }\n }\n\n return {\n count: (photosResult as PhotosPhotos.photosPhotosSlice).count || photoIds.length,\n photos: photoIds\n };\n });\n }\n\n /* public getPhotoURL(photo: MTPhoto | MTMyDocument, photoSize: MTPhotoSize) {\n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize);\n\n return {url: getFileURL('photo', downloadOptions), location: downloadOptions.location};\n } */\n\n /* public isDownloaded(media: any) {\n const isPhoto = media._ === 'photo';\n const photo = isPhoto ? this.getPhoto(media.id) : null;\n let isDownloaded: boolean;\n if(photo) {\n isDownloaded = photo.downloaded > 0;\n } else {\n const cachedThumb = this.getDocumentCachedThumb(media.id);\n isDownloaded = cachedThumb?.downloaded > 0;\n }\n\n return isDownloaded;\n } */\n\n public getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport copy from '../../helpers/object/copy';\nimport {InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults} from '../../layer';\nimport {logger, LogTypes} from '../logger';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\ntype PollId = Poll['id'];\n\nexport class AppPollsManager extends AppManager {\n public polls: {[id: PollId]: Poll} = {};\n public results: {[id: PollId]: PollResults} = {};\n public pollToMessages: {[id: PollId]: Set} = {};\n\n private log = logger('POLLS', LogTypes.Error);\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateMessagePoll: (update) => {\n this.log('updateMessagePoll:', update);\n\n let poll: Poll = update.poll || this.polls[update.poll_id];\n if(!poll) {\n return;\n }\n\n let results = update.results;\n const ret = this.savePoll(poll, results as any);\n poll = ret.poll;\n results = ret.results;\n\n this.rootScope.dispatchEvent('poll_update', {poll, results: results as any});\n }\n });\n }\n\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\n if(message) {\n this.updatePollToMessage(message, true);\n }\n\n const id = poll.id;\n if(this.polls[id]) {\n poll = Object.assign(this.polls[id], poll);\n results = this.saveResults(poll, results);\n } else {\n this.polls[id] = poll;\n\n poll.chosenIndexes = [];\n results = this.saveResults(poll, results);\n }\n\n return {poll, results};\n }\n\n public saveResults(poll: Poll, results: PollResults) {\n if(this.results[poll.id]) {\n results = Object.assign(this.results[poll.id], results);\n } else {\n this.results[poll.id] = results;\n }\n\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\n poll.chosenIndexes.length = 0;\n if(results?.results?.length) {\n results.results.forEach((answer, idx) => {\n if(answer.pFlags?.chosen) {\n poll.chosenIndexes.push(idx);\n }\n });\n }\n }\n\n return results;\n }\n\n public getPoll(pollId: PollId): {poll: Poll, results: PollResults} {\n return {\n poll: this.polls[pollId],\n results: this.results[pollId]\n };\n }\n\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\n if(solution) {\n if(!solutionEntities) {\n solutionEntities = [];\n }\n\n solution = parseMarkdown(solution, solutionEntities);\n } else {\n solution = undefined; // can be string here\n }\n\n return {\n _: 'inputMediaPoll',\n poll,\n correct_answers: correctAnswers,\n solution,\n solution_entities: solution ? solutionEntities : undefined\n };\n }\n\n public updatePollToMessage(message: Message.message, add: boolean) {\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\n let set = this.pollToMessages[id];\n\n if(!add && !set) {\n return;\n }\n\n if(!set) {\n set = this.pollToMessages[id] = new Set();\n }\n\n const key = message.peerId + '_' + message.mid;\n if(add) set.add(key);\n else set.delete(key);\n\n if(!add && !set.size) {\n delete this.polls[id];\n delete this.results[id];\n delete this.pollToMessages[id];\n }\n }\n\n public sendVote(message: Message.message, optionIds: number[]): Promise {\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\n\n const options: Uint8Array[] = optionIds.map((index) => {\n return poll.answers[index].option;\n });\n\n const messageId = message.mid;\n const peerId = message.peerId;\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\n\n if(message.pFlags.is_outgoing) {\n return this.appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\n this.log('invoke sendVote callback');\n return this.sendVote(message as Message.message, optionIds);\n });\n }\n\n return this.apiManager.invokeApi('messages.sendVote', {\n peer: inputPeer,\n msg_id: getServerMessageId(message.mid),\n options\n }).then((updates) => {\n this.log('sendVote updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getResults(message: Message.message) {\n const inputPeer = this.appPeersManager.getInputPeerById(message.peerId);\n\n return this.apiManager.invokeApi('messages.getPollResults', {\n peer: inputPeer,\n msg_id: getServerMessageId(message.mid)\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n this.log('getResults updates:', updates);\n });\n }\n\n public getVotes(message: Message.message, option?: Uint8Array, offset?: string, limit = 20) {\n return this.apiManager.invokeApi('messages.getPollVotes', {\n peer: this.appPeersManager.getInputPeerById(message.peerId),\n id: getServerMessageId(message.mid),\n option,\n offset,\n limit\n }).then((votesList) => {\n this.log('getPollVotes messages:', votesList);\n\n this.appUsersManager.saveApiUsers(votesList.users);\n\n return votesList;\n });\n }\n\n public stopPoll(message: Message.message) {\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\n\n if(poll.pFlags.closed) return Promise.resolve();\n\n const newPoll = copy(poll);\n newPoll.pFlags.closed = true;\n return this.appMessagesManager.editMessage(message, undefined, {\n newMedia: this.getInputMediaPoll(newPoll)\n }).then(() => {\n // console.log('stopped poll');\n }, err => {\n this.log.error('stopPoll error:', err);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputPrivacyKey, InputPrivacyRule, PrivacyRule, PrivacyKey, GlobalPrivacySettings} from '../../layer';\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\nimport {AppManager} from './manager';\n\nexport class AppPrivacyManager extends AppManager {\n private privacy: Partial<{\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\n }> = {};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updatePrivacy: (update) => {\n const key = update.key._;\n this.privacy[key] = update.rules;\n this.rootScope.dispatchEvent('privacy_update', update);\n }\n });\n }\n\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\n return this.apiManager.invokeApi('account.setPrivacy', {\n key: {\n _: inputKey\n },\n rules\n }).then((privacyRules) => {\n this.appUsersManager.saveApiUsers(privacyRules.users);\n this.appChatsManager.saveApiChats(privacyRules.chats);\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updatePrivacy',\n key: {\n _: convertInputKeyToKey(inputKey)\n },\n rules: rules.map((inputRule) => {\n const rule: PrivacyRule = {} as any;\n Object.assign(rule, inputRule);\n rule._ = convertInputKeyToKey(rule._) as any;\n return rule;\n })\n });\n\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\n\n return privacyRules.rules;\n });\n }\n\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\n const rules = this.privacy[privacyKey];\n if(rules) {\n return Promise.resolve(rules);\n }\n\n return this.privacy[privacyKey] = this.apiManager.invokeApi('account.getPrivacy', {\n key: {\n _: inputKey\n }\n }).then((privacyRules) => {\n this.appUsersManager.saveApiUsers(privacyRules.users);\n this.appChatsManager.saveApiChats(privacyRules.chats);\n\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\n\n return this.privacy[privacyKey] = privacyRules.rules;\n });\n }\n\n public getGlobalPrivacySettings() {\n return this.apiManager.invokeApi('account.getGlobalPrivacySettings');\n }\n\n public setGlobalPrivacySettings(settings: GlobalPrivacySettings) {\n return this.apiManager.invokeApi('account.setGlobalPrivacySettings', {settings});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {MyTopPeer} from './appUsersManager';\nimport tsNow from '../../helpers/tsNow';\nimport {ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, SendMessageAction, Update, UserFull, Photo, PhotoSize, Updates} from '../../layer';\nimport SearchIndex from '../searchIndex';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport getPhotoInput from './utils/photos/getPhotoInput';\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\nimport ctx from '../../environment/ctx';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\n\nconst PEER_FULL_TTL = 3 * 60e3;\n\nexport class AppProfileManager extends AppManager {\n // private botInfos: any = {};\n private usersFull: {[id: UserId]: UserFull.userFull} = {};\n private chatsFull: {[id: ChatId]: ChatFull} = {};\n private fullExpiration: {[peerId: PeerId]: number} = {};\n private typingsInPeer: {[key: string]: UserTyping[]};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateChatParticipants: (update) => {\n const participants = update.participants;\n if(participants._ === 'chatParticipants') {\n const chatId = participants.chat_id;\n const chatFull = this.chatsFull[chatId] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n chatFull.participants = participants;\n this.rootScope.dispatchEvent('chat_full_update', chatId);\n }\n }\n },\n\n updateChatParticipantAdd: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n return;\n }\n }\n\n participants.push({\n _: 'chatParticipant',\n user_id: update.user_id,\n inviter_id: update.inviter_id,\n date: tsNow(true)\n });\n\n _participants.version = update.version;\n this.rootScope.dispatchEvent('chat_full_update', update.chat_id);\n }\n },\n\n updateChatParticipantDelete: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n participants.splice(i, 1);\n _participants.version = update.version;\n this.rootScope.dispatchEvent('chat_full_update', update.chat_id);\n return;\n }\n }\n }\n },\n\n updateUserTyping: this.onUpdateUserTyping,\n updateChatUserTyping: this.onUpdateUserTyping,\n updateChannelUserTyping: this.onUpdateUserTyping,\n\n updatePeerBlocked: this.onUpdatePeerBlocked\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const fullChat = this.chatsFull[chatId];\n const chat: Chat.chat | Chat.channel | Chat.chatForbidden | Chat.channelForbidden = this.appChatsManager.getChat(chatId);\n if(!fullChat || !chat) {\n return;\n }\n\n let updated = false;\n if(!!fullChat.call !== !!(chat as Chat.chat).pFlags?.call_active) {\n updated = true;\n }\n\n const {photo} = chat as Chat.chat;\n if(photo) {\n const hasChatPhoto = photo._ !== 'chatPhotoEmpty';\n const hasFullChatPhoto = !!(fullChat.chat_photo && fullChat.chat_photo._ !== 'photoEmpty'); // chat_photo can be missing\n if(\n hasChatPhoto !== hasFullChatPhoto || (\n hasChatPhoto &&\n photo.photo_id !== fullChat.chat_photo?.id\n )\n ) {\n updated = true;\n }\n }\n\n if(updated) {\n this.refreshFullPeer(chatId.toPeerId(true));\n }\n });\n\n this.rootScope.addEventListener('channel_update', (chatId) => {\n this.refreshFullPeer(chatId.toPeerId(true));\n });\n\n // * genius\n this.rootScope.addEventListener('chat_full_update', (chatId) => {\n this.rootScope.dispatchEvent('peer_full_update', chatId.toPeerId(true));\n });\n\n // * genius\n this.rootScope.addEventListener('user_full_update', (userId) => {\n this.rootScope.dispatchEvent('peer_full_update', userId.toPeerId(false));\n });\n\n this.rootScope.addEventListener('invalidate_participants', (chatId) => {\n this.invalidateChannelParticipants(chatId);\n });\n\n this.typingsInPeer = {};\n }\n\n /* public saveBotInfo(botInfo: any) {\n const botId = botInfo && botInfo.user_id;\n if(!botId) {\n return null;\n }\n\n const commands: any = {};\n botInfo.commands.forEach((botCommand: any) => {\n commands[botCommand.command] = botCommand.description;\n });\n\n return this.botInfos[botId] = {\n id: botId,\n version: botInfo.version,\n shareText: botInfo.share_text,\n description: botInfo.description,\n commands: commands\n };\n } */\n\n public getProfile(id: UserId, override?: true) {\n if(this.usersFull[id] && !override && Date.now() < this.fullExpiration[id.toPeerId()]) {\n return this.usersFull[id];\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'users.getFullUser',\n params: {\n id: this.appUsersManager.getUserInput(id)\n },\n processResult: (usersUserFull) => {\n this.appChatsManager.saveApiChats(usersUserFull.chats, true);\n this.appUsersManager.saveApiUsers(usersUserFull.users);\n\n const userFull = usersUserFull.full_user;\n const peerId = id.toPeerId(false);\n if(userFull.profile_photo) {\n userFull.profile_photo = this.appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\n }\n\n const botInfo = userFull.bot_info;\n if(botInfo) {\n const referenceContext: ReferenceContext = {type: 'userFull', userId: id};\n botInfo.description_document = this.appDocsManager.saveDoc(botInfo.description_document, referenceContext);\n botInfo.description_photo = this.appPhotosManager.savePhoto(botInfo.description_photo, referenceContext);\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: userFull.notify_settings\n });\n\n this.usersFull[id] = userFull;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n\n /* if(userFull.bot_info) {\n userFull.bot_info = this.saveBotInfo(userFull.bot_info) as any;\n } */\n\n // appMessagesManager.savePinnedMessage(id, userFull.pinned_msg_id);\n\n this.rootScope.dispatchEvent('user_full_update', id);\n return userFull;\n }\n });\n }\n\n public getProfileByPeerId(peerId: PeerId, override?: true) {\n if(this.appPeersManager.isAnyChat(peerId)) return this.getChatFull(peerId.toChatId(), override);\n else return this.getProfile(peerId.toUserId(), override);\n }\n\n public getCachedFullChat(chatId: ChatId) {\n return this.chatsFull[chatId];\n }\n\n public getCachedFullUser(userId: UserId) {\n return this.usersFull[userId];\n }\n\n public getCachedProfileByPeerId(peerId: PeerId) {\n return peerId.isUser() ? this.getCachedFullUser(peerId.toUserId()) : this.getCachedFullChat(peerId.toChatId());\n }\n\n public async getFullPhoto(peerId: PeerId) {\n const profile = await this.getProfileByPeerId(peerId);\n switch(profile._) {\n case 'userFull':\n return profile.profile_photo;\n case 'channelFull':\n case 'chatFull':\n return profile.chat_photo;\n }\n }\n\n /* public getPeerBots(peerId: PeerId) {\n var peerBots: any[] = [];\n if(peerId >= 0 && !appUsersManager.isBot(peerId) ||\n (appPeersManager.isChannel(peerId) && !appPeersManager.isMegagroup(peerId))) {\n return Promise.resolve(peerBots);\n }\n if(peerId >= 0) {\n return this.getProfile(peerId).then((userFull: any) => {\n var botInfo = userFull.bot_info;\n if(botInfo && botInfo._ !== 'botInfoEmpty') {\n peerBots.push(botInfo);\n }\n return peerBots;\n });\n }\n\n return this.getChatFull(peerId.toChatId()).then((chatFull: any) => {\n chatFull.bot_info.forEach((botInfo: any) => {\n peerBots.push(this.saveBotInfo(botInfo))\n });\n return peerBots;\n });\n } */\n\n public getChatFull(id: ChatId, override?: true) {\n if(this.appChatsManager.isChannel(id)) {\n return this.getChannelFull(id, override);\n }\n\n const peerId = id.toPeerId(true);\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override && Date.now() < this.fullExpiration[peerId]) {\n const chat = this.appChatsManager.getChat(id) as Chat.chat;\n if(\n chat.pFlags.left ||\n chat.pFlags.deactivated ||\n chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version\n ) {\n return fullChat as ChatFull;\n }\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getFullChat',\n params: {\n chat_id: id\n },\n processResult: (result) => {\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const chatFull = result.full_chat as ChatFull.chatFull;\n if(chatFull && chatFull.chat_photo && chatFull.chat_photo.id) {\n chatFull.chat_photo = this.appPhotosManager.savePhoto(chatFull.chat_photo, {type: 'profilePhoto', peerId});\n }\n\n if(chatFull.call) {\n this.appGroupCallsManager.saveGroupCall(chatFull.call, id);\n }\n\n // appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: chatFull.notify_settings\n });\n\n this.chatsFull[id] = chatFull;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return chatFull;\n }\n });\n }\n\n public async getChatInviteLink(id: ChatId, force?: boolean) {\n const chatFull = await this.getChatFull(id);\n if(!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n\n return this.apiManager.invokeApi('messages.exportChatInvite', {\n peer: this.appPeersManager.getInputPeerById(id.toPeerId(true))\n }).then((exportedInvite) => {\n if(this.chatsFull[id] !== undefined) {\n this.chatsFull[id].exported_invite = exportedInvite;\n }\n\n return (exportedInvite as ExportedChatInvite.chatInviteExported).link;\n });\n }\n\n public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\n if(filter._ === 'channelParticipantsRecent') {\n const chat = this.appChatsManager.getChat(id);\n if(chat?.pFlags && (\n // chat.pFlags.kicked ||\n (chat as Chat.channel).pFlags.broadcast &&\n !(chat as Chat.channel).pFlags.creator &&\n !(chat as Chat.channel).admin_rights\n )) {\n return Promise.reject();\n }\n }\n\n return this.apiManager.invokeApiCacheable('channels.getParticipants', {\n channel: this.appChatsManager.getChannelInput(id),\n filter,\n offset,\n limit,\n hash: '0'\n }, {cacheSeconds: 60}).then((result) => {\n this.appUsersManager.saveApiUsers((result as ChannelsChannelParticipants.channelsChannelParticipants).users);\n return result as ChannelsChannelParticipants.channelsChannelParticipants;\n });\n /* let maybeAddSelf = (participants: any[]) => {\n let chat = appChatsManager.getChat(id);\n let selfMustBeFirst = filter._ === 'channelParticipantsRecent' &&\n !offset &&\n !chat.pFlags.kicked &&\n !chat.pFlags.left;\n\n if(selfMustBeFirst) {\n participants = copy(participants);\n let myID = appUsersManager.getSelf().id;\n let myIndex = participants.findIndex((p) => p.user_id === myID);\n let myParticipant;\n\n if(myIndex !== -1) {\n myParticipant = participants[myIndex];\n participants.splice(myIndex, 1);\n } else {\n myParticipant = {_: 'channelParticipantSelf', user_id: myID};\n }\n\n participants.unshift(myParticipant);\n }\n\n return participants;\n } */\n }\n\n public getChannelParticipant(id: ChatId, peerId: PeerId) {\n return this.apiManager.invokeApiSingle('channels.getParticipant', {\n channel: this.appChatsManager.getChannelInput(id),\n participant: this.appPeersManager.getInputPeerById(peerId)\n }).then((channelParticipant) => {\n this.appUsersManager.saveApiUsers(channelParticipant.users);\n return channelParticipant.participant;\n });\n }\n\n public getChannelFull(id: ChatId, override?: true) {\n const peerId = id.toPeerId(true);\n if(this.chatsFull[id] !== undefined && !override && Date.now() < this.fullExpiration[peerId]) {\n return this.chatsFull[id] as ChatFull.channelFull;\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getFullChannel',\n params: {\n channel: this.appChatsManager.getChannelInput(id)\n },\n processResult: (result) => {\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const fullChannel = result.full_chat as ChatFull.channelFull;\n if(fullChannel && fullChannel.chat_photo.id) {\n fullChannel.chat_photo = this.appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\n // appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n\n if(fullChannel.call) {\n this.appGroupCallsManager.saveGroupCall(fullChannel.call, id);\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: fullChannel.notify_settings\n });\n\n this.chatsFull[id] = fullChannel;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChannel;\n },\n processError: (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n const channel = this.appChatsManager.getChat(id) as Chat.channel | Chat.channelForbidden;\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n }],\n chats: [channel._ === 'channelForbidden' ? channel : {\n _: 'channelForbidden',\n id,\n access_hash: channel.access_hash,\n title: channel.title,\n pFlags: channel.pFlags\n }],\n users: []\n } as Updates.updates);\n break;\n }\n\n throw error;\n }\n });\n }\n\n public getMentions(chatId: ChatId, query: string, threadId?: number): Promise {\n const processUserIds = (topPeers: MyTopPeer[]) => {\n const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n /* const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n\n const index = new SearchIndex(!startsWithAt, !startsWithAt); */\n const index = new SearchIndex({\n ignoreCase: true\n });\n\n const ratingMap: Map = new Map();\n topPeers.forEach((peer) => {\n index.indexObject(peer.id, this.appUsersManager.getUserSearchText(peer.id));\n ratingMap.set(peer.id, peer.rating);\n });\n\n const peerIds = Array.from(index.search(query));\n peerIds.sort((a, b) => ratingMap.get(b) - ratingMap.get(a));\n return peerIds;\n };\n\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.getChannelParticipants(chatId, {\n _: 'channelParticipantsMentions',\n q: query,\n top_msg_id: getServerMessageId(threadId)\n }, 50, 0).then((cP) => {\n return cP.participants.map((p) => getParticipantPeerId(p));\n });\n } else if(chatId) {\n promise = Promise.resolve(this.getChatFull(chatId)).then((chatFull) => {\n return ((chatFull as ChatFull.chatFull).participants as ChatParticipants.chatParticipants).participants.map((p) => p.user_id.toPeerId());\n });\n } else {\n promise = Promise.resolve([]);\n }\n\n return Promise.all([\n // [],\n this.appUsersManager.getTopPeers('bots_inline').catch(() => [] as MyTopPeer[]),\n promise\n ]).then((results) => {\n const peers = results[0].concat(results[1].map((peerId) => ({id: peerId, rating: 0})));\n\n return processUserIds(peers);\n });\n }\n\n private invalidateChannelParticipants(id: ChatId) {\n this.apiManager.clearCache('channels.getParticipants', (params) => (params.channel as InputChannel.inputChannel).channel_id === id);\n this.refreshFullPeer(id.toPeerId(true));\n }\n\n private refreshFullPeer(peerId: PeerId) {\n if(peerId.isUser()) {\n const userId = peerId.toUserId();\n delete this.usersFull[userId];\n this.rootScope.dispatchEvent('user_full_update', userId);\n } else {\n const chatId = peerId.toChatId();\n delete this.chatsFull[chatId];\n this.rootScope.dispatchEvent('chat_full_update', chatId);\n }\n\n // ! эта строчка будет создавать race condition:\n // ! запрос вернёт chat с установленным флагом call_not_empty, хотя сам апдейт уже будет применён\n // this.getProfileByPeerId(peerId, true);\n }\n\n public updateProfile(first_name?: string, last_name?: string, about?: string) {\n return this.apiManager.invokeApi('account.updateProfile', {\n first_name,\n last_name,\n about\n }).then((user) => {\n this.appUsersManager.saveApiUser(user);\n\n if(about !== undefined) {\n const peerId = user.id.toPeerId();\n const userFull = this.usersFull[user.id];\n if(userFull) {\n userFull.about = about;\n }\n\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return this.getProfile(user.id, true);\n });\n }\n\n public uploadProfilePhoto(inputFile: InputFile) {\n return this.apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then((updateResult) => {\n // ! sometimes can have no user in users\n const photo = updateResult.photo as Photo.photo;\n if(!updateResult.users.length) {\n const strippedThumb = photo.sizes.find((size) => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n updateResult.users.push({\n ...this.appUsersManager.getSelf(),\n photo: {\n _: 'userProfilePhoto',\n dc_id: photo.dc_id,\n photo_id: photo.id,\n stripped_thumb: strippedThumb?.bytes,\n pFlags: {\n\n }\n }\n });\n }\n this.appUsersManager.saveApiUsers(updateResult.users);\n\n const myId = this.appPeersManager.peerId;\n this.appPhotosManager.savePhoto(updateResult.photo, {\n type: 'profilePhoto',\n peerId: myId\n });\n\n const userId = myId.toUserId();\n // this.apiUpdatesManager.processLocalUpdate({\n // _: 'updateUserPhoto',\n // user_id: userId,\n // date: tsNow(true),\n // photo: this.appUsersManager.getUser(userId).photo,\n // previous: true\n // });\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateUser',\n user_id: userId\n });\n });\n }\n\n public deletePhotos(photoIds: string[]) {\n return this.apiManager.invokeApiSingle('photos.deletePhotos', {\n id: photoIds.map((photoId) => {\n const photo = this.appPhotosManager.getPhoto(photoId);\n return getPhotoInput(photo);\n })\n }).then((deletedList) => {\n\n });\n }\n\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\n const user = this.appUsersManager.getUser(participant.user_id);\n return !!(user && user.status && user.status._ === 'userStatusOnline');\n }\n\n private reduceParticipantsForOnlineCount(participants: {user_id: UserId}[]) {\n return participants.reduce((acc, participant) => {\n return acc + +this.verifyParticipantForOnlineCount(participant);\n }, 0);\n }\n\n public async getOnlines(id: ChatId): Promise {\n const minOnline = 1;\n if(this.appChatsManager.isBroadcast(id)) {\n return minOnline;\n }\n\n const chatInfo = await this.getChatFull(id);\n if(this.appChatsManager.isMegagroup(id)) {\n if((chatInfo as ChatFull.channelFull).participants_count <= 100) {\n const channelParticipants = await this.getChannelParticipants(id, {_: 'channelParticipantsRecent'}, 100);\n return this.reduceParticipantsForOnlineCount(channelParticipants.participants as ChannelParticipant.channelParticipant[]);\n }\n\n const res = await this.apiManager.invokeApiCacheable('messages.getOnlines', {\n peer: this.appChatsManager.getChannelInputPeer(id)\n }, {cacheSeconds: 60});\n\n const onlines = res.onlines ?? minOnline;\n return onlines;\n }\n\n const _participants = (chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants;\n if(_participants?.participants) {\n return this.reduceParticipantsForOnlineCount(_participants.participants);\n } else {\n return minOnline;\n }\n }\n\n private getTypingsKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? `_${threadId}` : '');\n }\n\n private onUpdateUserTyping = (update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping) => {\n const fromId = (update as Update.updateUserTyping).user_id ?\n (update as Update.updateUserTyping).user_id.toPeerId() :\n this.appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id);\n if(this.appPeersManager.peerId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n\n const topMsgId = (update as Update.updateChannelUserTyping).top_msg_id;\n const threadId = topMsgId ? generateMessageId(topMsgId) : undefined;\n const peerId = this.appPeersManager.getPeerId(update);\n const key = this.getTypingsKey(peerId, threadId);\n const typings = this.typingsInPeer[key] ??= [];\n let typing = typings.find((t) => t.userId === fromId);\n\n const cancelAction = () => {\n delete typing.timeout;\n // typings.findAndSplice((t) => t === typing);\n const idx = typings.indexOf(typing);\n if(idx !== -1) {\n typings.splice(idx, 1);\n }\n\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[key];\n }\n };\n\n if(typing?.timeout !== undefined) {\n clearTimeout(typing.timeout);\n }\n\n if(update.action._ === 'sendMessageCancelAction') {\n if(!typing) {\n return;\n }\n\n cancelAction();\n return;\n }\n\n if(!typing) {\n typing = {\n userId: fromId\n };\n\n typings.push(typing);\n }\n\n // console.log('updateChatUserTyping', update, typings);\n\n typing.action = update.action;\n\n const hasUser = this.appUsersManager.hasUser(fromId);\n if(!hasUser) {\n // let's load user here\n if(update._ === 'updateChatUserTyping') {\n if(update.chat_id && this.appChatsManager.hasChat(update.chat_id) && !this.appChatsManager.isChannel(update.chat_id)) {\n Promise.resolve(this.getChatFull(update.chat_id)).then(() => {\n if(typing.timeout !== undefined && this.appUsersManager.hasUser(fromId)) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n }\n });\n }\n }\n\n // return;\n } else {\n this.appUsersManager.forceUserOnline(fromId);\n }\n\n typing.timeout = ctx.setTimeout(cancelAction, 6000);\n if(hasUser) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = this.appPeersManager.getPeerId(update.peer_id);\n if(this.appPeersManager.isUser(peerId)) {\n const userId = peerId.toUserId();\n const userFull = this.usersFull[userId];\n if(userFull) {\n if(update.blocked) userFull.pFlags.blocked = true;\n else delete userFull.pFlags.blocked;\n }\n\n this.rootScope.dispatchEvent('user_full_update', userId);\n }\n\n this.rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\n };\n\n public getPeerTypings(peerId: PeerId, threadId?: number) {\n return this.typingsInPeer[this.getTypingsKey(peerId, threadId)];\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Awaited} from '../types';\n\nexport default function callbackifyAll(\n values: T,\n callback: (result: { -readonly [P in keyof T]: Awaited }) => R\n): Promise> | R {\n if(values.some((value) => value instanceof Promise)) {\n return Promise.all(values).then(callback as any);\n } else {\n return callback(values as any);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport assumeType from '../../helpers/assumeType';\nimport callbackify from '../../helpers/callbackify';\nimport callbackifyAll from '../../helpers/callbackifyAll';\nimport copy from '../../helpers/object/copy';\nimport pause from '../../helpers/schedulers/pause';\nimport {AvailableReaction, Message, MessagePeerReaction, MessagesAvailableReactions, Reaction, ReactionCount, Update, Updates} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport reactionsEqual from './utils/reactions/reactionsEqual';\n\nconst SAVE_DOC_KEYS = [\n 'static_icon' as const,\n 'appear_animation' as const,\n 'select_animation' as const,\n 'activate_animation' as const,\n 'effect_animation' as const,\n 'around_animation' as const,\n 'center_icon' as const\n];\n\nconst REFERENCE_CONTEXT: ReferenceContext = {\n type: 'reactions'\n};\n\nexport class AppReactionsManager extends AppManager {\n private availableReactions: AvailableReaction[];\n private sendReactionPromises: Map>;\n private lastSendingTimes: Map;\n\n protected after() {\n this.rootScope.addEventListener('language_change', () => {\n this.availableReactions = undefined;\n this.getAvailableReactions();\n });\n\n this.sendReactionPromises = new Map();\n this.lastSendingTimes = new Map();\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n Promise.resolve(this.getAvailableReactions()).then(async(availableReactions) => {\n for(const availableReaction of availableReactions) {\n await Promise.all([\n availableReaction.around_animation && this.apiFileManager.downloadMedia({media: availableReaction.around_animation}),\n availableReaction.static_icon && this.apiFileManager.downloadMedia({media: availableReaction.static_icon}),\n availableReaction.appear_animation && this.apiFileManager.downloadMedia({media: availableReaction.appear_animation}),\n availableReaction.center_icon && this.apiFileManager.downloadMedia({media: availableReaction.center_icon})\n ]);\n\n await pause(1000);\n }\n });\n }, 7.5e3);\n });\n }\n\n public getAvailableReactions() {\n if(this.availableReactions) return this.availableReactions;\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAvailableReactions',\n processResult: (messagesAvailableReactions) => {\n assumeType(messagesAvailableReactions);\n\n const availableReactions = this.availableReactions = messagesAvailableReactions.reactions;\n for(const reaction of availableReactions) {\n for(const key of SAVE_DOC_KEYS) {\n if(!reaction[key]) {\n continue;\n }\n\n reaction[key] = this.appDocsManager.saveDoc(reaction[key], REFERENCE_CONTEXT);\n }\n }\n\n return availableReactions;\n },\n params: {\n hash: 0\n }\n });\n }\n\n public getActiveAvailableReactions() {\n return callbackify(this.getAvailableReactions(), (availableReactions) => {\n return availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive);\n });\n }\n\n public getAvailableReactionsForPeer(peerId: PeerId) {\n const activeAvailableReactions = this.getActiveAvailableReactions();\n if(peerId.isUser()) {\n return this.unshiftQuickReaction(activeAvailableReactions);\n }\n\n const chatFull = this.appProfileManager.getChatFull(peerId.toChatId());\n return callbackifyAll([activeAvailableReactions, chatFull, this.getQuickReaction()], ([activeAvailableReactions, chatFull, quickReaction]) => {\n const chatAvailableReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n\n let filteredChatAvailableReactions: AvailableReaction[] = [];\n if(chatAvailableReactions._ === 'chatReactionsAll') {\n filteredChatAvailableReactions = activeAvailableReactions;\n } else if(chatAvailableReactions._ === 'chatReactionsSome') {\n filteredChatAvailableReactions = chatAvailableReactions.reactions.map((reaction) => {\n return activeAvailableReactions.find((availableReaction) => availableReaction.reaction === (reaction as Reaction.reactionEmoji).emoticon);\n }).filter(Boolean);\n }\n\n return this.unshiftQuickReactionInner(filteredChatAvailableReactions, quickReaction);\n });\n }\n\n private unshiftQuickReactionInner(availableReactions: AvailableReaction[], quickReaction: Reaction | AvailableReaction) {\n if(quickReaction && quickReaction._ !== 'reactionEmoji' && quickReaction._ !== 'availableReaction') return availableReactions;\n const emoticon = (quickReaction as Reaction.reactionEmoji).emoticon || (quickReaction as AvailableReaction).reaction;\n const availableReaction = findAndSplice(availableReactions, (availableReaction) => availableReaction.reaction === emoticon);\n if(availableReaction) {\n availableReactions.unshift(availableReaction);\n }\n\n return availableReactions;\n }\n\n private unshiftQuickReaction(\n availableReactions: AvailableReaction[] | PromiseLike,\n quickReaction: ReturnType = this.getQuickReaction()\n ) {\n return callbackifyAll([\n availableReactions,\n quickReaction\n ], ([availableReactions, quickReaction]) => {\n return this.unshiftQuickReactionInner(availableReactions, quickReaction);\n });\n }\n\n public getAvailableReactionsByMessage(message: Message.message) {\n if(!message) return [];\n const peerId = (message.fwd_from?.channel_post && this.appPeersManager.isMegagroup(message.peerId) && message.fwdFromId) || message.peerId;\n return this.getAvailableReactionsForPeer(peerId);\n }\n\n public isReactionActive(reaction: string) {\n if(!this.availableReactions) return false;\n return !!this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getQuickReaction() {\n return callbackifyAll([\n this.apiManager.getConfig(),\n this.getAvailableReactions()\n ], ([config, availableReactions]) => {\n const reaction = config.reactions_default;\n if(reaction?._ === 'reactionEmoji') {\n return availableReactions.find((availableReaction) => availableReaction.reaction === reaction.emoticon);\n }\n\n return reaction as Reaction.reactionCustomEmoji;\n });\n }\n\n public getReactionCached(reaction: string) {\n return this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getReaction(reaction: string) {\n return callbackify(this.getAvailableReactions(), () => {\n return this.getReactionCached(reaction);\n });\n }\n\n public getMessagesReactions(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessagesReactions',\n params: {\n id: mids.map((mid) => getServerMessageId(mid)),\n peer: this.appPeersManager.getInputPeerById(peerId)\n },\n processResult: (updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n // const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateMessageReactions') as Update.updateMessageReactions;\n // return update.reactions;\n }\n });\n }\n\n public getMessageReactionsList(peerId: PeerId, mid: number, limit: number, reaction?: Reaction, offset?: string) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessageReactionsList',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: getServerMessageId(mid),\n limit,\n reaction,\n offset\n },\n processResult: (messageReactionsList) => {\n this.appUsersManager.saveApiUsers(messageReactionsList.users);\n return messageReactionsList;\n }\n });\n }\n\n public setDefaultReaction(reaction: Reaction) {\n return this.apiManager.invokeApi('messages.setDefaultReaction', {reaction}).then(async(value) => {\n if(value) {\n const appConfig = await this.apiManager.getConfig();\n if(appConfig) {\n appConfig.reactions_default = reaction;\n }/* else { // if no config or loading it - overwrite\n this.apiManager.getAppConfig(true);\n } */\n\n this.rootScope.dispatchEvent('quick_reaction', reaction);\n }\n\n return value;\n });\n }\n\n public async sendReaction(message: Message.message, reaction?: Reaction | AvailableReaction, onlyLocal?: boolean) {\n if(reaction._ === 'availableReaction') {\n reaction = {\n _: 'reactionEmoji',\n emoticon: reaction.reaction\n };\n }\n\n const limit = await this.apiManager.getLimit('reactions');\n\n const lastSendingTimeKey = message.peerId + '_' + message.mid;\n const lastSendingTime = this.lastSendingTimes.get(lastSendingTimeKey);\n if(lastSendingTime) {\n return;\n } else {\n this.lastSendingTimes.set(lastSendingTimeKey, Date.now());\n setTimeout(() => {\n this.lastSendingTimes.delete(lastSendingTimeKey);\n }, 333);\n }\n\n const {peerId, mid} = message;\n const myPeerId = this.appPeersManager.peerId;\n\n const unsetReactionCount = (reactionCount: ReactionCount) => {\n --reactionCount.count;\n delete reactionCount.chosen_order;\n\n if(reactionsEqual(reaction as Reaction, reactionCount.reaction)) {\n reaction = undefined as Reaction;\n }\n\n if(!reactionCount.count) {\n indexOfAndSplice(reactions.results, reactionCount);\n }/* else {\n insertInDescendSortedArray(reactions.results, chosenReaction, 'count', chosenReactionIdx);\n } */\n\n if(reactions.recent_reactions) {\n findAndSplice(reactions.recent_reactions, (recentReaction) => reactionsEqual(recentReaction.reaction, reactionCount.reaction) && this.appPeersManager.getPeerId(recentReaction.peer_id) === myPeerId);\n }\n\n if(!reactions.results.length) {\n reactions = undefined;\n }\n };\n\n const canSeeList = message.reactions?.pFlags?.can_see_list || !this.appPeersManager.isBroadcast(message.peerId) || message.peerId.isUser();\n if(!message.reactions) {\n message.reactions = {\n _: 'messageReactions',\n results: [],\n recent_reactions: canSeeList ? [] : undefined,\n pFlags: {\n can_see_list: canSeeList || undefined\n }\n };\n }\n\n let reactions = onlyLocal ? message.reactions : copy(message.reactions);\n const chosenReactions = reactions.results.filter((reactionCount) => reactionCount.chosen_order !== undefined);\n chosenReactions.sort((a, b) => b.chosen_order - a.chosen_order);\n const unsetReactions: ReactionCount[] = [];\n const chosenReactionIdx = chosenReactions.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\n if(chosenReactionIdx !== -1) unsetReactions.push(...chosenReactions.splice(chosenReactionIdx, 1));\n unsetReactions.push(...chosenReactions.splice(limit - +(chosenReactionIdx === -1)));\n unsetReactions.forEach((reactionCount) => {\n chosenReactions.forEach((chosenReactionCount) => {\n if(chosenReactionCount.chosen_order > reactionCount.chosen_order) {\n --chosenReactionCount.chosen_order;\n }\n });\n\n unsetReactionCount(reactionCount);\n });\n\n const chosenReactionsLength = chosenReactions.length;\n chosenReactions.forEach((reactionCount, idx) => {\n reactionCount.chosen_order = chosenReactionsLength - 1 - idx;\n });\n\n if(reaction) {\n if(!reactions) {\n reactions/* = message.reactions */ = {\n _: 'messageReactions',\n results: [],\n pFlags: {}\n };\n\n if(canSeeList) {\n reactions.pFlags.can_see_list = true;\n }\n }\n\n let reactionCountIdx = reactions.results.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\n let reactionCount = reactionCountIdx !== -1 && reactions.results[reactionCountIdx];\n if(!reactionCount) {\n reactionCount = {\n _: 'reactionCount',\n count: 0,\n reaction\n };\n\n reactionCountIdx = reactions.results.push(reactionCount) - 1;\n }\n\n ++reactionCount.count;\n reactionCount.chosen_order = chosenReactions.length ? chosenReactions[0].chosen_order + 1 : 0;\n chosenReactions.unshift(reactionCount);\n\n if(!reactions.recent_reactions && canSeeList) {\n reactions.recent_reactions = [];\n }\n\n if(reactions.recent_reactions) {\n const peerReaction: MessagePeerReaction = {\n _: 'messagePeerReaction',\n reaction,\n peer_id: this.appPeersManager.getOutputPeer(myPeerId)\n };\n\n if(!this.appPeersManager.isMegagroup(peerId) && false) {\n reactions.recent_reactions.push(peerReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(-3);\n } else {\n reactions.recent_reactions.unshift(peerReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(0, 3);\n }\n }\n\n // insertInDescendSortedArray(reactions.results, reactionCount, 'count', reactionCountIdx);\n }\n\n const availableReactions = this.availableReactions;\n if(reactions && availableReactions?.length) {\n const indexes: Map = new Map();\n availableReactions.forEach((availableReaction, idx) => {\n indexes.set(availableReaction.reaction, idx);\n });\n\n reactions.results.sort((a, b) => {\n const id1 = (a.reaction as Reaction.reactionCustomEmoji).document_id || (a.reaction as Reaction.reactionEmoji).emoticon;\n const id2 = (b.reaction as Reaction.reactionCustomEmoji).document_id || (b.reaction as Reaction.reactionEmoji).emoticon;\n return (b.count - a.count) || ((indexes.get(id1) ?? 0) - (indexes.get(id2) ?? 0));\n });\n }\n\n if(onlyLocal) {\n message.reactions = reactions;\n this.rootScope.dispatchEvent('messages_reactions', [{message, changedResults: []}]);\n return Promise.resolve();\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: message.peer_id,\n msg_id: message.id,\n reactions: reactions,\n local: true\n });\n\n const promiseKey = [peerId, mid].join('-');\n const msgId = getServerMessageId(mid);\n const promise = this.apiManager.invokeApi('messages.sendReaction', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: msgId,\n reaction: chosenReactions.map((reactionCount) => reactionCount.reaction)\n }).then((updates) => {\n assumeType(updates);\n\n const editMessageUpdateIdx = updates.updates.findIndex((update) => update._ === 'updateEditMessage' || update._ === 'updateEditChannelMessage');\n if(editMessageUpdateIdx !== -1) {\n const editMessageUpdate = updates.updates[editMessageUpdateIdx] as Update.updateEditMessage | Update.updateEditChannelMessage;\n updates.updates[editMessageUpdateIdx] = {\n _: 'updateMessageReactions',\n msg_id: msgId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n reactions: (editMessageUpdate.message as Message.message).reactions,\n pts: editMessageUpdate.pts,\n pts_count: editMessageUpdate.pts_count\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }).catch((err) => {\n if(err.type === 'REACTION_INVALID' && this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReaction(message, chosenReactions[0]?.reaction, true);\n }\n }).finally(() => {\n if(this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReactionPromises.delete(promiseKey);\n }\n });\n\n this.sendReactionPromises.set(promiseKey, promise);\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from './appDocsManager';\nimport type {DownloadOptions} from '../mtproto/apiFileManager';\nimport {Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFavedStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered, Update} from '../../layer';\nimport {Modify} from '../../types';\nimport AppStorage from '../storage';\nimport DATABASE_STATE from '../../config/databases/state';\nimport assumeType from '../../helpers/assumeType';\nimport fixBase64String from '../../helpers/fixBase64String';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport {AppManager} from './manager';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport ctx from '../../environment/ctx';\nimport {getEnvironment} from '../../environment/utils';\nimport getDocumentInput from './utils/docs/getDocumentInput';\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\n\nconst CACHE_TIME = 3600e3;\n\ntype LOCAL_STICKER_SET_ID = Extract<\n InputStickerSet['_'],\n 'inputStickerSetAnimatedEmoji' | 'inputStickerSetAnimatedEmojiAnimations' |\n 'inputStickerSetPremiumGifts' | 'inputStickerSetEmojiGenericAnimations' |\n 'inputStickerSetEmojiDefaultStatuses' | 'inputStickerSetEmojiDefaultTopicIcons'\n>;\n\ntype LOCAL_ID = 'EMOJI' | 'EMOJI_ANIMATIONS' | 'PREMIUM_GIFTS' | 'GENERIC_ANIMATIONS' | 'DEFAULT_STATUSES' | 'DEFAULT_TOPIC_ICONS';\n\nconst LOCAL_IDS: {[key in LOCAL_ID]: LOCAL_STICKER_SET_ID} = {\n EMOJI: 'inputStickerSetAnimatedEmoji',\n EMOJI_ANIMATIONS: 'inputStickerSetAnimatedEmojiAnimations',\n PREMIUM_GIFTS: 'inputStickerSetPremiumGifts',\n GENERIC_ANIMATIONS: 'inputStickerSetEmojiGenericAnimations',\n DEFAULT_STATUSES: 'inputStickerSetEmojiDefaultStatuses',\n DEFAULT_TOPIC_ICONS: 'inputStickerSetEmojiDefaultTopicIcons'\n}\n\nconst LOCAL_IDS_SET: Set = new Set(Object.values(LOCAL_IDS) as any);\n\n// let TEST_FILE_REFERENCE_REFRESH = true;\n\nexport type MyStickerSetInput = {\n id: StickerSet.stickerSet['id'],\n access_hash?: StickerSet.stickerSet['access_hash']\n};\n\nexport type MyMessagesStickerSet = MessagesStickerSet.messagesStickerSet;\n\nexport class AppStickersManager extends AppManager {\n private storage = new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'stickerSets');\n\n private getStickerSetPromises: {[setId: Long]: Promise};\n private getStickersByEmoticonsPromises: {[emoticon: string]: Promise};\n\n private greetingStickers: MyDocument[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise;\n\n private sounds: Record;\n private getAnimatedEmojiSoundsPromise: Promise;\n\n private favedStickers: MyDocument[];\n private recentStickers: MyDocument[];\n\n private names: Record;\n\n protected after() {\n this.getStickerSetPromises = {};\n this.getStickersByEmoticonsPromises = {};\n this.sounds = {};\n this.names = {};\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n this.getAnimatedEmojiStickerSet();\n // this.getFavedStickersStickers();\n }, 1000);\n\n if(!this.getGreetingStickersPromise && this.getGreetingStickersTimeout === undefined) {\n this.getGreetingStickersTimeout = ctx.setTimeout(() => {\n this.getGreetingStickersTimeout = undefined;\n this.getGreetingSticker(true);\n }, 5000);\n }\n });\n\n this.rootScope.addEventListener('app_config', () => this.onStickersUpdated('faved', true));\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateNewStickerSet: (update) => {\n const stickerSet = update.stickerset as MyMessagesStickerSet;\n this.saveStickerSet(stickerSet, stickerSet.set.id);\n this.rootScope.dispatchEvent('stickers_installed', stickerSet.set);\n },\n\n updateRecentStickers: () => this.onStickersUpdated('recent', true),\n\n updateFavedStickers: () => this.onStickersUpdated('faved', true),\n\n updateMoveStickerSetToTop: (update) => {\n this.rootScope.dispatchEvent('stickers_top', update.stickerset);\n }\n });\n }\n\n private async onStickersUpdated(type: 'faved' | 'recent', overwrite: boolean) {\n const stickers = await (type === 'faved' ? this.getFavedStickersStickers(overwrite) : this.getRecentStickersStickers(overwrite));\n this.rootScope.dispatchEvent('stickers_updated', {\n type,\n stickers\n });\n }\n\n public getGreetingSticker(justPreload = false) {\n if(this.getGreetingStickersTimeout) {\n clearTimeout(this.getGreetingStickersTimeout);\n this.getGreetingStickersTimeout = undefined;\n }\n\n if(!this.getGreetingStickersPromise) {\n this.getGreetingStickersPromise = this.getStickersByEmoticon('👋⭐️', false).then((docs) => {\n if(!docs.length) throw 'NO_STICKERS';\n this.greetingStickers = docs.slice() as Document.document[];\n this.greetingStickers.sort((a, b) => Math.random() - Math.random());\n });\n }\n\n return this.getGreetingStickersPromise.then(() => {\n let doc: Document.document;\n if(!justPreload) {\n doc = this.greetingStickers.shift();\n this.greetingStickers.push(doc);\n }\n\n this.apiFileManager.downloadMedia({media: this.greetingStickers[0]}); // preload next sticker\n\n return doc;\n });\n }\n\n private saveStickers(docs: Document[]) {\n forEachReverse(docs, (doc, idx) => {\n doc = this.appDocsManager.saveDoc(doc);\n\n if(!doc) docs.splice(idx, 1);\n else docs[idx] = doc;\n });\n }\n\n private canUseStickerSetCache(set: MyMessagesStickerSet, useCache?: boolean) {\n return set && set.documents?.length && ((Date.now() - set.refreshTime) < CACHE_TIME || useCache);\n }\n\n public getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise | MyMessagesStickerSet {\n let {id} = set;\n if(!set.access_hash) {\n set = this.names[id] || set;\n id = set.id;\n }\n\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n if(!params.overwrite) {\n const cachedSet = this.storage.getFromCache(id);\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\n return cachedSet;\n }\n }\n\n const promise = this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n const cachedSet = await this.storage.get(id);\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n\n if(this.getStickerSetPromises[id] === promise) {\n delete this.getStickerSetPromises[id];\n }\n\n return;\n }\n }\n\n try {\n const stickerSet = await this.apiManager.invokeApi('messages.getStickerSet', {\n stickerset: this.getStickerSetInput(set),\n hash: 0\n }) as MyMessagesStickerSet;\n\n const saveById = params.saveById ? id : stickerSet.set.id;\n this.saveStickerSet(stickerSet, saveById);\n\n resolve(stickerSet);\n } catch(err) {\n resolve(null);\n }\n\n if(this.getStickerSetPromises[id] === promise) {\n delete this.getStickerSetPromises[id];\n }\n });\n\n return promise;\n }\n\n public getLocalStickerSet(id: LOCAL_STICKER_SET_ID) {\n return this.getStickerSet({id}, {saveById: true});\n }\n\n public getAnimatedEmojiStickerSet() {\n return Promise.all([\n this.getLocalStickerSet(LOCAL_IDS.EMOJI),\n this.getLocalStickerSet(LOCAL_IDS.EMOJI_ANIMATIONS),\n this.getAnimatedEmojiSounds()\n ]).then(([emoji, animations]) => {\n return {emoji, animations};\n });\n }\n\n public getAnimatedEmojiSounds(overwrite?: boolean) {\n if(this.getAnimatedEmojiSoundsPromise && !overwrite) return this.getAnimatedEmojiSoundsPromise;\n const promise = this.getAnimatedEmojiSoundsPromise = Promise.all([\n this.apiManager.getAppConfig(overwrite),\n this.apiManager.getConfig()\n ]).then(([appConfig, config]) => {\n if(this.getAnimatedEmojiSoundsPromise !== promise) {\n return;\n }\n\n for(const emoji in appConfig.emojies_sounds) {\n const sound = appConfig.emojies_sounds[emoji];\n const bytesStr = atob(fixBase64String(sound.file_reference_base64, false));\n const bytes = new Uint8Array(bytesStr.length);\n for(let i = 0, length = bytes.length; i < length; ++i) {\n bytes[i] = bytesStr[i].charCodeAt(0);\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // bytes[0] = bytes[1] = bytes[2] = bytes[3] = bytes[4] = 0;\n // sound.access_hash += '999';\n // }\n\n const doc = this.appDocsManager.saveDoc({\n _: 'document',\n pFlags: {},\n flags: 0,\n id: sound.id,\n access_hash: sound.access_hash,\n attributes: [{\n _: 'documentAttributeAudio',\n duration: 1,\n pFlags: {\n voice: true\n }\n }],\n date: 0,\n dc_id: config.this_dc,\n file_reference: bytes,\n mime_type: 'audio/ogg'\n // size: 101010 // test loading everytime\n }, {\n type: 'emojiesSounds'\n });\n\n this.sounds[emoji] = doc;\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // TEST_FILE_REFERENCE_REFRESH = false;\n // }\n });\n\n return promise;\n }\n\n public async getRecentStickers(overwrite?: boolean): Promise> {\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.getRecentStickers',\n processResult: (res) => {\n assumeType(res);\n\n this.recentStickers = res.stickers as MyDocument[];\n this.saveStickers(res.stickers);\n return res;\n },\n overwrite\n });\n\n return res;\n }\n\n public getRecentStickersStickers(overwrite?: boolean) {\n if(overwrite) this.recentStickers = undefined;\n else if(this.recentStickers) return this.recentStickers;\n return this.getRecentStickers(overwrite).then(() => this.recentStickers);\n }\n\n public saveRecentSticker(docId: DocId, unsave?: boolean, attached?: boolean) {\n const doc = this.appDocsManager.getDoc(docId);\n\n findAndSplice(this.recentStickers, (_doc) => _doc.id === docId);\n if(!unsave) {\n this.recentStickers.unshift(doc);\n\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\n for(const emoticon in this.getStickersByEmoticonsPromises) {\n const promise = this.getStickersByEmoticonsPromises[emoticon];\n promise.then((stickers) => {\n const _doc = findAndSplice(stickers, (_doc) => _doc.id === doc.id);\n if(_doc) {\n stickers.unshift(_doc);\n } else if(emoticon.includes(docEmoticon)) {\n stickers.unshift(doc);\n }\n });\n }\n }\n\n this.rootScope.dispatchEvent('sticker_updated', {type: 'recent', faved: !unsave, document: doc});\n\n if(unsave) {\n this.onStickersUpdated('recent', false);\n }\n\n return this.apiManager.invokeApi('messages.saveRecentSticker', {\n id: getDocumentInput(doc),\n unsave,\n attached\n });\n }\n\n private cleanEmoji(emoji: string) {\n return emoji.replace(/\\ufe0f/g, '').replace(/🏻|🏼|🏽|🏾|🏿/g, '');\n }\n\n public getAnimatedEmojiSticker(emoji: string, isAnimation?: boolean) {\n const id = isAnimation ? LOCAL_IDS.EMOJI_ANIMATIONS : LOCAL_IDS.EMOJI;\n const stickerSet = this.storage.getFromCache(id);\n // const stickerSet = await this.getStickerSet({id});\n if(!stickerSet?.documents) return;\n\n if(isAnimation) {\n if(['🧡', '💛', '💚', '💙', '💜', '🖤', '🤍', '🤎'].includes(emoji)) {\n emoji = '❤️';\n }\n }\n\n emoji = this.cleanEmoji(emoji);\n const pack = stickerSet.packs.find((p) => p.emoticon === emoji);\n return pack ? this.appDocsManager.getDoc(pack.documents[0]) : undefined;\n }\n\n public getAnimatedEmojiSoundDocument(emoji: string) {\n return this.sounds[this.cleanEmoji(emoji)];\n }\n\n public preloadAnimatedEmojiSticker(emoji: string) {\n const preloadEmojiPromise = this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji);\n });\n\n return Promise.all([\n preloadEmojiPromise,\n this.preloadAnimatedEmojiStickerAnimation(emoji)\n ]).then(([doc, a]) => {\n return {\n doc: doc,\n animation: a?.doc,\n sound: a?.sound\n };\n });\n }\n\n public preloadAnimatedEmojiStickerAnimation(emoji: string) {\n return this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji, true);\n }).then((doc) => {\n if(!doc) {\n return;\n }\n\n const sound = this.getAnimatedEmojiSoundDocument(emoji);\n return Promise.all([\n this.preloadSticker(doc.id),\n sound ? this.preloadSticker(sound.id) : undefined\n ]).then(() => {\n return {doc, sound};\n });\n });\n }\n\n public preloadSticker(docId: DocId, isPremiumEffect?: boolean) {\n const doc = this.appDocsManager.getDoc(docId);\n return this.apiFileManager.downloadMedia({media: doc, thumb: isPremiumEffect ? doc.video_thumbs?.[0] : undefined});\n }\n\n private saveStickerSet(res: Omit, id: DocId) {\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[],\n keywords: res.keywords\n };\n\n let stickerSet = this.storage.getFromCache(id);\n if(stickerSet) {\n Object.assign(stickerSet, newSet);\n } else {\n stickerSet = this.storage.setToCache(id, newSet);\n }\n\n if(stickerSet.set.short_name) {\n this.names[stickerSet.set.short_name] = this.getStickerSetInput(newSet.set) as any;\n }\n\n this.saveStickers(res.documents);\n\n // console.log('stickers wrote', this.stickerSets);\n const needSave = stickerSet.set.installed_date || LOCAL_IDS_SET.has(id as any);\n stickerSet.refreshTime = Date.now();\n this.storage.set({[id]: stickerSet}, !needSave);\n }\n\n public getStickerSetThumbDownloadOptions(stickerSet: StickerSet.stickerSet): DownloadOptions {\n const thumb = stickerSet.thumbs.find((thumb) => thumb._ === 'photoSize') as PhotoSize.photoSize;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: InputFileLocation.inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n thumb_version: stickerSet.thumb_version\n };\n\n return {dcId, location: input, size: thumb.size, mimeType: isAnimated ? 'application/x-tgsticker' : 'image/webp'};\n }\n\n /* public getStickerSetThumbURL(stickerSet: MTStickerSet) {\n const thumb = stickerSet.thumb;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n volume_id: thumb.location.volume_id,\n local_id: thumb.location.local_id\n };\n\n const url = getFileURL('document', this.getStickerSetThumbDownloadOptions(stickerSet));\n return url;\n\n //return promise;\n } */\n\n public getStickerSetInput(set: MyStickerSetInput): InputStickerSet {\n if(LOCAL_IDS_SET.has(set.id as any)) {\n return {\n _: set.id as any\n };\n } else if(!set.access_hash) {\n return {\n _: 'inputStickerSetShortName',\n short_name: '' + set.id\n };\n } else {\n return {\n _: 'inputStickerSetID',\n id: set.id,\n access_hash: set.access_hash\n };\n }\n }\n\n public async getFeaturedStickers() {\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.getFeaturedStickers',\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n return res.sets;\n }\n\n public getPromoPremiumStickers() {\n return this.getStickersByEmoticon('⭐️⭐️', false);\n }\n\n public getPremiumStickers() {\n return this.getStickersByEmoticon('📂⭐️', false);\n }\n\n public getFavedStickers(overwrite?: boolean) {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getFavedStickers',\n processResult: (favedStickers) => {\n assumeType(favedStickers);\n this.saveStickers(favedStickers.stickers);\n this.favedStickers = favedStickers.stickers as MyDocument[];\n return favedStickers;\n },\n overwrite\n });\n }\n\n public getFavedStickersStickers(overwrite?: boolean) {\n if(overwrite) this.favedStickers = undefined;\n else if(this.favedStickers) return this.favedStickers;\n return this.getFavedStickers(overwrite).then(() => this.favedStickers);\n }\n\n public getFavedStickersLimit() {\n return this.apiManager.getLimit('favedStickers');\n }\n\n public async faveSticker(docId: DocId, unfave?: boolean) {\n if(!this.favedStickers) {\n await this.getFavedStickersStickers();\n }\n\n const limit = await this.getFavedStickersLimit();\n\n const doc = this.appDocsManager.getDoc(docId);\n findAndSplice(this.favedStickers, (_doc) => _doc.id === doc.id);\n\n if(!unfave) {\n this.favedStickers.unshift(doc);\n const spliced = this.favedStickers.splice(limit, this.favedStickers.length - limit);\n }\n\n this.rootScope.dispatchEvent('sticker_updated', {type: 'faved', faved: !unfave, document: doc});\n\n return this.apiManager.invokeApi('messages.faveSticker', {\n id: getDocumentInput(doc),\n unfave\n }).then(() => {\n if(unfave) {\n this.onStickersUpdated('faved', true);\n }\n });\n }\n\n public async toggleStickerSet(set: StickerSet.stickerSet) {\n set = this.storage.getFromCache(set.id).set;\n\n if(set.installed_date) {\n const res = await this.apiManager.invokeApi('messages.uninstallStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n\n if(res) {\n delete set.installed_date;\n this.rootScope.dispatchEvent('stickers_deleted', set);\n this.storage.delete(set.id, true);\n return true;\n }\n } else {\n const res = await this.apiManager.invokeApi('messages.installStickerSet', {\n stickerset: this.getStickerSetInput(set),\n archived: false\n });\n\n if(res) {\n set.installed_date = Date.now() / 1000 | 0;\n this.rootScope.dispatchEvent('stickers_installed', set);\n return true;\n }\n }\n\n return false;\n }\n\n public toggleStickerSets(sets: StickerSet.stickerSet[]) {\n return Promise.all(sets.map((set) => this.toggleStickerSet(set)));\n }\n\n public async searchStickerSets(query: string, excludeFeatured = true) {\n const flags = excludeFeatured ? 1 : 0;\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.searchStickerSets',\n params: {\n flags,\n exclude_featured: excludeFeatured || undefined,\n q: query\n },\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(const id in cache) {\n const {set} = cache[id];\n\n if(set.title.toLowerCase().includes(query.toLowerCase()) && !res.sets.find((c) => c.set.id === set.id)) {\n foundSaved.push({_: 'stickerSetCovered', set, cover: null});\n }\n }\n\n return res.sets.concat(foundSaved);\n }\n\n private processAllStickersResult = (allStickers: MessagesAllStickers) => {\n assumeType(allStickers);\n\n forEachReverse(allStickers.sets, (stickerSet, idx, arr) => {\n if(stickerSet.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n return allStickers;\n };\n\n public getAllStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getAllStickers',\n processResult: this.processAllStickersResult\n });\n }\n\n public getEmojiStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getEmojiStickers',\n processResult: this.processAllStickersResult\n });\n }\n\n public preloadStickerSets() {\n return this.getAllStickers().then((allStickers) => {\n return Promise.all((allStickers as MessagesAllStickers.messagesAllStickers).sets.map((set) => this.getStickerSet(set, {useCache: true})));\n });\n }\n\n // TODO: detect \"🤷\" by \"🤷‍♂️\"\n public getStickersByEmoticon(emoticon: string, includeOurStickers = true) {\n emoticon = fixEmoji(emoticon);\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\n\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\n this.apiManager.invokeApiHashable({\n method: 'messages.getStickers',\n params: {\n emoticon\n },\n processResult: (stickers) => stickers\n }),\n includeOurStickers ? this.preloadStickerSets() : [],\n includeOurStickers ? this.getRecentStickers() : undefined\n ]).then(([messagesStickers, installedSets, recentStickers]) => {\n const foundStickers = (messagesStickers as MessagesStickers.messagesStickers).stickers.map((sticker) => this.appDocsManager.saveDoc(sticker));\n const cachedStickersAnimated: Document.document[] = [], cachedStickersStatic: Document.document[] = [];\n\n // console.log('getStickersByEmoticon', messagesStickers, installedSets, recentStickers);\n\n const iteratePacks = (packs: StickerPack.stickerPack[]) => {\n for(const pack of packs) {\n const packEmoticon = fixEmoji(pack.emoticon);\n if(packEmoticon.includes(emoticon)) {\n for(const docId of pack.documents) {\n const doc = this.appDocsManager.getDoc(docId);\n (doc.animated ? cachedStickersAnimated : cachedStickersStatic).push(doc);\n }\n }\n }\n };\n\n if(recentStickers) {\n iteratePacks(recentStickers.packs);\n const stickers = recentStickers.stickers;\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\n s.sort((a, b) => stickers.indexOf(a) - stickers.indexOf(b));\n });\n }\n\n for(const set of installedSets) {\n iteratePacks(set.packs);\n }\n\n /* const entities = parseEntities(emoticon);\n if(entities.length === 1) {\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\n forEachReverse(s, (doc, idx) => {\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\n if(docEmoticon !== emoticon) {\n s.splice(idx, 1);\n }\n });\n });\n } */\n\n const stickers = [...new Set(cachedStickersAnimated.concat(cachedStickersStatic, foundStickers))]/* .filter((doc) => !doc.animated) */;\n\n forEachReverse(stickers, (sticker, idx, arr) => {\n if((sticker.sticker === 3 && !getEnvironment().IS_WEBM_SUPPORTED) ||\n (!this.rootScope.premium && getStickerEffectThumb(sticker))) {\n arr.splice(idx, 1);\n }\n });\n\n return stickers;\n });\n }\n\n public clearRecentStickers() {\n if(this.recentStickers) {\n this.recentStickers.length = 0;\n this.onStickersUpdated('recent', false);\n }\n\n return this.apiManager.invokeApi('messages.clearRecentStickers');\n }\n}\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport filterUnique from '../../helpers/array/filterUnique';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport cleanSearchText from '../../helpers/cleanSearchText';\nimport cleanUsername from '../../helpers/cleanUsername';\nimport tsNow from '../../helpers/tsNow';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {isRestricted} from '../../helpers/restrictions';\nimport {Chat, ContactsResolvedPeer, InputContact, InputGeoPoint, InputMedia, InputPeer, InputUser, User as MTUser, UserProfilePhoto, UserStatus} from '../../layer';\nimport parseEntities from '../richTextProcessor/parseEntities';\nimport wrapUrl from '../richTextProcessor/wrapUrl';\nimport SearchIndex from '../searchIndex';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\nimport canSendToUser from './utils/users/canSendToUser';\nimport {AppStoragesManager} from './appStoragesManager';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\n\nexport type User = MTUser.user;\nexport type TopPeerType = 'correspondents' | 'bots_inline';\nexport type MyTopPeer = {id: PeerId, rating: number};\n\nexport class AppUsersManager extends AppManager {\n private storage: AppStoragesManager['storages']['users'];\n\n private users: {[userId: UserId]: User};\n private usernames: {[username: string]: PeerId};\n private contactsIndex: SearchIndex;\n private contactsFillPromise: CancellablePromise;\n private contactsList: Set;\n private updatedContactsList: boolean;\n\n private getTopPeersPromises: {[type in TopPeerType]?: Promise};\n\n protected after() {\n this.clear(true);\n\n setInterval(this.updateUsersStatuses, 60000);\n\n this.rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateUserStatus: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n user.status = update.status;\n if(user.status) {\n if('expires' in user.status) {\n user.status.expires -= this.timeManager.getServerTimeOffset();\n }\n\n if('was_online' in user.status) {\n user.status.was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', userId);\n this.setUserToStateIfNeeded(user);\n } // ////else console.warn('No user by id:', userId);\n },\n\n // updateUserPhoto: (update) => {\n // const userId = update.user_id;\n // const user = this.users[userId];\n // if(user) {\n // if((user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id === (update.photo as UserProfilePhoto.userProfilePhoto)?.photo_id) {\n // return;\n // }\n\n // this.forceUserOnline(userId, update.date);\n\n // if(update.photo._ === 'userProfilePhotoEmpty') {\n // delete user.photo;\n // } else {\n // user.photo = safeReplaceObject(user.photo, update.photo);\n // }\n\n // this.setUserToStateIfNeeded(user);\n\n // this.rootScope.dispatchEvent('user_update', userId);\n // this.rootScope.dispatchEvent('avatar_update', userId.toPeerId());\n // } else console.warn('No user by id:', userId);\n // },\n\n updateUserName: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n this.forceUserOnline(userId);\n\n this.saveApiUser({\n ...user,\n first_name: update.first_name,\n last_name: update.last_name,\n username: undefined,\n usernames: update.usernames\n }, true);\n }\n }\n });\n\n /* case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\n break; */\n\n this.rootScope.addEventListener('language_change', (e) => {\n const userId = this.getSelf().id;\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('users')\n ]).then(([state, {results: users, storage}]) => {\n this.storage = storage;\n\n this.saveApiUsers(users);\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(!user) {\n continue;\n }\n\n if(state.contactsListCachedTime && (user.pFlags.contact || user.pFlags.mutual_contact)) {\n this.pushContact(user.id);\n\n if(!this.contactsFillPromise) {\n this.contactsFillPromise = deferredPromise();\n this.contactsFillPromise.resolve(this.contactsList);\n }\n }\n }\n\n // const contactsList = state.contactsList;\n // if(Array.isArray(contactsList)) {\n // contactsList.forEach((userId) => {\n // this.pushContact(userId);\n // });\n\n // if(contactsList.length) {\n // this.contactsFillPromise = deferredPromise();\n // this.contactsFillPromise.resolve(this.contactsList);\n // }\n // }\n\n const recentSearch = state.recentSearch || [];\n for(let i = 0, length = recentSearch.length; i < length; ++i) {\n this.peersStorage.requestPeer(recentSearch[i], 'recentSearch');\n }\n\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\n if(!this.appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(!this.storage.getFromCache(userId)) {\n this.storage.set({\n [userId]: this.getUser(userId)\n });\n }\n });\n\n this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\n if(!this.appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(this.storage.getFromCache(userId)) {\n this.storage.delete(userId);\n }\n });\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n for(const userId in this.users) {\n // const userId = +userId;\n if(!userId) continue;\n const peerId = userId.toPeerId();\n if(!this.peersStorage.isPeerNeeded(peerId)) {\n const user = this.users[userId];\n this.modifyUsernamesCache(user, false);\n\n this.storage.delete(userId);\n delete this.users[userId];\n }\n }\n } else {\n this.users = {};\n this.usernames = {};\n }\n\n this.getTopPeersPromises = {};\n this.contactsIndex = this.createSearchIndex();\n this.contactsFillPromise = undefined;\n this.contactsList = new Set();\n this.updatedContactsList = false;\n };\n\n public get userId() {\n return this.rootScope.myId.toUserId();\n }\n\n private onContactsModified(fromServer?: boolean) {\n // const contactsList = [...this.contactsList];\n // this.appStateManager.pushToState('contactsList', contactsList);\n\n if(fromServer) {\n this.appStateManager.pushToState('contactsListCachedTime', tsNow(true));\n }\n }\n\n public pushRecentSearch(peerId: PeerId) {\n return this.appStateManager.getState().then((state) => {\n const recentSearch = state.recentSearch || [];\n if(recentSearch[0] !== peerId) {\n indexOfAndSplice(recentSearch, peerId);\n recentSearch.unshift(peerId);\n if(recentSearch.length > 20) {\n recentSearch.length = 20;\n }\n\n this.appStateManager.pushToState('recentSearch', recentSearch);\n for(const peerId of recentSearch) {\n this.peersStorage.requestPeer(peerId, 'recentSearch');\n }\n }\n });\n }\n\n public clearRecentSearch() {\n return this.appStateManager.getState().then((state) => {\n const recentSearch = state.recentSearch || [];\n for(const peerId of recentSearch) {\n this.peersStorage.releasePeer(peerId, 'recentSearch');\n }\n\n recentSearch.length = 0;\n this.appStateManager.pushToState('recentSearch', recentSearch);\n });\n }\n\n public fillContacts() {\n if(this.contactsFillPromise && this.updatedContactsList) {\n return {\n cached: this.contactsFillPromise.isFulfilled,\n promise: this.contactsFillPromise\n };\n }\n\n this.updatedContactsList = true;\n\n const promise = deferredPromise>();\n this.apiManager.invokeApi('contacts.getContacts').then((result) => {\n if(result._ === 'contacts.contacts') {\n this.contactsList.clear();\n\n this.saveApiUsers(result.users);\n\n result.contacts.forEach((contact) => {\n this.pushContact(contact.user_id);\n });\n\n this.onContactsModified(true);\n\n this.contactsFillPromise = promise;\n }\n\n promise.resolve(this.contactsList);\n }, () => {\n this.updatedContactsList = false;\n });\n\n return {\n cached: this.contactsFillPromise?.isFulfilled,\n promise: this.contactsFillPromise ||= promise\n };\n }\n\n public resolveUsername(username: string): Promise | Chat | User {\n if(username[0] === '@') {\n username = username.slice(1);\n }\n\n username = username.toLowerCase();\n const peerId = this.usernames[username];\n if(peerId) {\n return this.appPeersManager.getPeer(peerId);\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'contacts.resolveUsername',\n params: {username},\n processResult: (resolvedPeer) => this.processResolvedPeer(resolvedPeer)\n });\n }\n\n private processResolvedPeer(resolvedPeer: ContactsResolvedPeer.contactsResolvedPeer) {\n this.saveApiUsers(resolvedPeer.users);\n this.appChatsManager.saveApiChats(resolvedPeer.chats);\n\n return this.appPeersManager.getPeer(getPeerId(resolvedPeer.peer)) as Chat | User;\n }\n\n public resolvePhone(phone: string) {\n return this.apiManager.invokeApi('contacts.resolvePhone', {phone}).then((resolvedPeer) => {\n return this.processResolvedPeer(resolvedPeer) as User;\n });\n }\n\n private pushContact(id: UserId) {\n this.contactsList.add(id);\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\n this.peersStorage.requestPeer(id.toPeerId(), 'contact');\n }\n\n private popContact(id: UserId) {\n this.contactsList.delete(id);\n this.contactsIndex.indexObject(id, ''); // delete search index\n this.peersStorage.releasePeer(id.toPeerId(), 'contact');\n }\n\n public getUserSearchText(id: UserId) {\n const user = this.users[id];\n if(!user) {\n return '';\n }\n\n const arr: string[] = [\n user.first_name,\n user.last_name,\n user.phone,\n ...getPeerActiveUsernames(user),\n // user.pFlags.self ? I18n.format('SavedMessages', true) : '',\n user.pFlags.self ? 'Saved Messages' : ''\n ];\n\n return arr.filter(Boolean).join(' ');\n }\n\n public getContacts(query?: string, includeSaved = false, sortBy: 'name' | 'online' | 'none' = 'name') {\n return this.fillContacts().promise.then((_contactsList) => {\n let contactsList = [..._contactsList];\n if(query) {\n const results = this.contactsIndex.search(query);\n const filteredContactsList = [...contactsList].filter((id) => results.has(id));\n\n contactsList = filteredContactsList;\n }\n\n if(sortBy === 'name') {\n contactsList.sort((userId1, userId2) => {\n const sortName1 = (this.users[userId1] || {}).sortName || '';\n const sortName2 = (this.users[userId2] || {}).sortName || '';\n return sortName1.localeCompare(sortName2);\n });\n } else if(sortBy === 'online') {\n contactsList.sort((userId1, userId2) => {\n const status1 = this.getUserStatusForSort(this.getUser(userId1).status);\n const status2 = this.getUserStatusForSort(this.getUser(userId2).status);\n return status2 - status1;\n });\n }\n\n const myUserId = this.userId;\n indexOfAndSplice(contactsList, myUserId);\n if(includeSaved) {\n if(this.testSelfSearch(query)) {\n contactsList.unshift(myUserId);\n }\n }\n\n return contactsList;\n });\n }\n\n public getContactsPeerIds(\n query?: Parameters[0],\n includeSaved?: Parameters[1],\n sortBy?: Parameters[2],\n limit?: number\n ) {\n return this.getContacts(query, includeSaved, sortBy).then((userIds) => {\n const peerIds = userIds.map((userId) => userId.toPeerId(false));\n if(limit) {\n return peerIds.slice(0, limit);\n }\n\n return peerIds;\n });\n }\n\n public toggleBlock(peerId: PeerId, block: boolean) {\n return this.apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\n id: this.appPeersManager.getInputPeerById(peerId)\n }).then((value) => {\n if(value) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updatePeerBlocked',\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n blocked: block\n });\n }\n\n return value;\n });\n }\n\n public testSelfSearch(query: string) {\n const user = this.getSelf();\n const index = this.createSearchIndex();\n index.indexObject(user.id, this.getUserSearchText(user.id));\n return index.search(query).has(user.id);\n }\n\n private createSearchIndex() {\n return new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n }\n\n public saveApiUsers(apiUsers: MTUser[], override?: boolean) {\n if((apiUsers as any).saved) return;\n (apiUsers as any).saved = true;\n apiUsers.forEach((user) => this.saveApiUser(user, override));\n }\n\n public modifyUsernamesCache(peer: Parameters[0], save: boolean) {\n const usernames = getPeerActiveUsernames(peer);\n if(!usernames.length) {\n return;\n }\n\n const cleanedUsernames = usernames.map((username) => cleanUsername(username));\n if(save) {\n cleanedUsernames.forEach((searchUsername) => {\n this.usernames[searchUsername] = peer.id.toPeerId(peer._ !== 'user');\n });\n } else {\n cleanedUsernames.forEach((searchUsername) => {\n delete this.usernames[searchUsername];\n });\n }\n }\n\n public setUsernameToCache(peer: Parameters[0], oldPeer?: typeof peer) {\n if(\n !oldPeer ||\n (oldPeer as MTUser.user).username !== (peer as MTUser.user).username ||\n !deepEqual((oldPeer as MTUser.user).usernames, (peer as MTUser.user).usernames)\n ) {\n this.modifyUsernamesCache(oldPeer, false);\n this.modifyUsernamesCache(peer, true);\n\n return true;\n }\n\n return false;\n }\n\n public saveApiUser(user: MTUser, override?: boolean) {\n if(!user || user._ === 'userEmpty') return;\n\n const userId = user.id;\n const oldUser = this.users[userId];\n\n // ! commented block can affect performance !\n // if(oldUser && !override) {\n // console.log('saveApiUser same');\n // return;\n // }\n\n user.pFlags ??= {};\n\n if(user.pFlags.min && oldUser !== undefined) {\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(user, ['initials', 'num', 'rFirstName', 'rFullName', 'rPhone', 'sortName', 'sortStatus']);\n\n const changedUsername = this.setUsernameToCache(user, oldUser);\n\n if(!oldUser ||\n oldUser.sortName === undefined ||\n oldUser.first_name !== user.first_name ||\n oldUser.last_name !== user.last_name) {\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n\n user.sortName = user.pFlags.deleted ? '' : cleanSearchText(fullName, false);\n } else {\n user.sortName = oldUser.sortName;\n }\n\n if(user.status) {\n if((user.status as UserStatus.userStatusOnline).expires) {\n (user.status as UserStatus.userStatusOnline).expires -= this.timeManager.getServerTimeOffset();\n }\n\n if((user.status as UserStatus.userStatusOffline).was_online) {\n (user.status as UserStatus.userStatusOffline).was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n if((user as User).photo?._ === 'userProfilePhotoEmpty') {\n delete (user as User).photo;\n }\n\n // user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n // if(!user.username && user.usernames) {\n // user.username = user.usernames.find((username) => username.pFlags.active).username;\n // }\n\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n const changedTitle = user.first_name !== oldUser.first_name ||\n user.last_name !== oldUser.last_name ||\n changedUsername;\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const changedPhoto = oldPhotoId !== newPhotoId;\n\n const changedAnyBadge = oldUser.pFlags.premium !== user.pFlags.premium ||\n oldUser.pFlags.verified !== user.pFlags.verified ||\n oldUser.pFlags.scam !== user.pFlags.scam ||\n oldUser.pFlags.fake !== user.pFlags.fake;\n\n /* if(user.pFlags.bot && user.bot_info_version !== oldUser.bot_info_version) {\n\n } */\n\n const wasContact = !!oldUser.pFlags.contact;\n const newContact = !!user.pFlags.contact;\n\n safeReplaceObject(oldUser, user);\n this.rootScope.dispatchEvent('user_update', userId);\n\n if(wasContact !== newContact) {\n this.onContactUpdated(userId, newContact, wasContact);\n }\n\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', {peerId: user.id.toPeerId()});\n }\n\n if(changedTitle || changedAnyBadge) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId: user.id.toPeerId()});\n }\n }\n\n this.checkPremium(user, oldUser);\n this.setUserToStateIfNeeded(user);\n }\n\n private checkPremium(user: User, oldUser: User) {\n if(user.pFlags.self) {\n const isPremium = !!user.pFlags.premium;\n if(this.rootScope.premium !== isPremium) {\n this.rootScope.dispatchEvent('premium_toggle_private', {isNew: !oldUser, isPremium});\n }\n }\n }\n\n private setUserToStateIfNeeded(user: User) {\n if(this.peersStorage.isPeerNeeded(user.id.toPeerId())) {\n this.storage.set({\n [user.id]: user\n });\n }\n }\n\n public isUserOnlineVisible(id: UserId) {\n return this.getUserStatusForSort(id) > 3;\n }\n\n public getUserStatusForSort(status: User['status'] | UserId) {\n if(typeof(status) !== 'object') {\n const user = this.getUser(status);\n status = user?.status;\n }\n\n if(status) {\n const expires = status._ === 'userStatusOnline' ? status.expires : (status._ === 'userStatusOffline' ? status.was_online : 0);\n if(expires) {\n return expires;\n }\n\n /* const timeNow = tsNow(true);\n switch(status._) {\n case 'userStatusRecently':\n return timeNow - 86400 * 3;\n case 'userStatusLastWeek':\n return timeNow - 86400 * 7;\n case 'userStatusLastMonth':\n return timeNow - 86400 * 30;\n } */\n switch(status._) {\n case 'userStatusRecently':\n return 3;\n case 'userStatusLastWeek':\n return 2;\n case 'userStatusLastMonth':\n return 1;\n }\n }\n\n return 0;\n }\n\n public getUser(id: User | UserId) {\n if(isObject(id)) {\n return id;\n }\n\n return this.users[id];\n }\n\n public getUserStatus(id: UserId) {\n return this.isRegularUser(id) && !this.users[id].pFlags.self && this.users[id].status;\n }\n\n public async getUserPhone(id: UserId) {\n const user = this.getUser(id);\n if(!user?.phone) {\n return;\n }\n\n const appConfig = await this.apiManager.getAppConfig();\n return {\n phone: user.phone,\n isAnonymous: appConfig.fragment_prefixes.some((prefix) => user.phone.startsWith(prefix))\n };\n }\n\n public getSelf() {\n return this.getUser(this.userId);\n }\n\n public isBot(id: UserId) {\n return this.users[id] && !!this.users[id].pFlags.bot;\n }\n\n public isAttachMenuBot(id: UserId) {\n return this.isBot(id) && !!this.users[id].pFlags.bot_attach_menu;\n }\n\n public isContact(id: UserId) {\n return this.contactsList.has(id) || !!(this.users[id] && this.users[id].pFlags.contact);\n }\n\n public isRegularUser(id: UserId) {\n const user = this.users[id];\n return user && !this.isBot(id) && !user.pFlags.deleted && !user.pFlags.support;\n }\n\n public isNonContactUser(id: UserId) {\n return this.isRegularUser(id) && !this.isContact(id) && id !== this.userId;\n }\n\n public hasUser(id: UserId, allowMin?: boolean) {\n const user = this.users[id];\n return isObject(user) && (allowMin || !user.pFlags.min);\n }\n\n public getUserString(id: UserId) {\n const user = this.getUser(id);\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\n }\n\n public getUserInput(id: UserId): InputUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputUserSelf'};\n }\n\n return {\n _: 'inputUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getUserInputPeer(id: UserId): InputPeer.inputPeerSelf | InputPeer.inputPeerUser {\n const user = this.getUser(id);\n // ! do not use it, there are places that don't support it. need explicit peer id\n // if(user.pFlags?.self) {\n // return {_: 'inputPeerSelf'};\n // }\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getContactMediaInput(id: UserId): InputMedia.inputMediaContact {\n const user = this.getUser(id);\n\n return {\n _: 'inputMediaContact',\n first_name: user.first_name,\n last_name: user.last_name,\n phone_number: user.phone,\n vcard: '',\n user_id: id\n };\n }\n\n private updateUsersStatuses = () => {\n const timestampNow = tsNow(true);\n for(const i in this.users) {\n const user = this.users[i];\n this.updateUserStatus(user, timestampNow);\n }\n };\n\n private updateUserStatus(user: MTUser.user, timestampNow = tsNow(true)) {\n if(user.status &&\n user.status._ === 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = {_: 'userStatusOffline', was_online: user.status.expires};\n this.rootScope.dispatchEvent('user_update', user.id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public forceUserOnline(id: UserId, eventTimestamp?: number) {\n if(this.isBot(id)) {\n return;\n }\n\n const timestamp = tsNow(true);\n const onlineTimeFor = 60;\n if(eventTimestamp) {\n if((timestamp - eventTimestamp) >= onlineTimeFor) {\n return;\n }\n } else if(this.apiUpdatesManager.updatesState.syncLoading) {\n return;\n }\n\n const user = this.getUser(id);\n if(user?.status &&\n user.status._ !== 'userStatusOnline' &&\n user.status._ !== 'userStatusEmpty' &&\n !user.pFlags.support &&\n !user.pFlags.deleted) {\n user.status = {\n _: 'userStatusOnline',\n expires: timestamp + onlineTimeFor\n };\n\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public importContact(first_name: string, last_name: string, phone: string) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]).then((userIds) => {\n if(!userIds.length) {\n const error = new Error();\n (error as any).type = 'NO_USER';\n throw error;\n }\n\n return userIds[0];\n });\n }\n\n public importContacts(contacts: {phones: string[], first_name: string, last_name: string}[]) {\n const inputContacts: InputContact[] = [];\n\n for(let i = 0; i < contacts.length; ++i) {\n for(let j = 0; j < contacts[i].phones.length; ++j) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n });\n }\n }\n\n return this.apiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts\n }).then((importedContactsResult) => {\n this.saveApiUsers(importedContactsResult.users);\n\n const userIds = importedContactsResult.imported.map((importedContact) => {\n this.onContactUpdated(importedContact.user_id, true);\n return importedContact.user_id;\n });\n\n return userIds;\n });\n }\n\n public getTopPeers(type: TopPeerType) {\n if(this.getTopPeersPromises[type]) return this.getTopPeersPromises[type];\n\n return this.getTopPeersPromises[type] = this.appStateManager.getState().then((state) => {\n const cached = state.topPeersCache[type];\n if(cached && (cached.cachedTime + 86400e3) > Date.now() && cached.peers) {\n return cached.peers;\n }\n\n return this.apiManager.invokeApi('contacts.getTopPeers', {\n [type]: true,\n offset: 0,\n limit: 15,\n hash: '0'\n }).then((result) => {\n let topPeers: MyTopPeer[] = [];\n if(result._ === 'contacts.topPeers') {\n // console.log(result);\n this.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n\n if(result.categories.length) {\n topPeers = result.categories[0].peers.map((topPeer) => {\n const peerId = getPeerId(topPeer.peer);\n this.peersStorage.requestPeer(peerId, 'topPeer');\n return {id: peerId, rating: topPeer.rating};\n });\n }\n }\n\n state.topPeersCache[type] = {\n peers: topPeers,\n cachedTime: Date.now()\n };\n this.appStateManager.pushToState('topPeersCache', state.topPeersCache);\n\n return topPeers;\n });\n });\n }\n\n public getBlocked(offset = 0, limit = 0) {\n return this.apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then((contactsBlocked) => {\n this.saveApiUsers(contactsBlocked.users);\n this.appChatsManager.saveApiChats(contactsBlocked.chats);\n const count = contactsBlocked._ === 'contacts.blocked' ? contactsBlocked.users.length + contactsBlocked.chats.length : contactsBlocked.count;\n\n const peerIds: PeerId[] = contactsBlocked.users.map((u) => u.id.toPeerId()).concat(contactsBlocked.chats.map((c) => c.id.toPeerId(true)));\n\n return {count, peerIds};\n });\n }\n\n public getLocated(\n lat: number,\n long: number,\n accuracy_radius: number,\n background: boolean = false,\n self_expires: number = 0\n ) {\n const geo_point: InputGeoPoint = {\n _: 'inputGeoPoint',\n lat,\n long,\n accuracy_radius\n };\n\n return this.apiManager.invokeApi('contacts.getLocated', {\n geo_point,\n background\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n return updates;\n });\n }\n\n /* public searchContacts(query: string, limit = 20) {\n return Promise.all([\n this.getContacts(query),\n apiManager.invokeApi('contacts.search', {\n q: query,\n limit\n })\n ]).then((results) => {\n const [myContacts, peers] = results;\n\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n // * contacts.search returns duplicates in my_results\n const myResults = new Set(myContacts.concat(peers.my_results.map((p) => appPeersManager.getPeerID(p))));\n\n const out = {\n my_results: [...myResults].slice(0, limit),\n results: peers.results.map((p) => appPeersManager.getPeerID(p))\n };\n\n return out;\n });\n } */\n public searchContacts(query: string, limit = 20) {\n // handle 't.me/username' as 'username'\n const entities = parseEntities(query);\n if(entities.length && entities[0].length === query.trim().length && entities[0]._ === 'messageEntityUrl') {\n try {\n const url = new URL(wrapUrl(query).url);\n const path = url.pathname.slice(1);\n if(path) {\n query = path;\n }\n } catch(err) {}\n }\n\n return this.apiManager.invokeApiCacheable('contacts.search', {\n q: query,\n limit\n }, {cacheSeconds: 60}).then((peers) => {\n this.saveApiUsers(peers.users);\n this.appChatsManager.saveApiChats(peers.chats);\n\n const out = {\n my_results: filterUnique(peers.my_results.map((p) => getPeerId(p))), // ! contacts.search returns duplicates in my_results\n results: peers.results.map((p) => getPeerId(p))\n };\n\n return out;\n });\n }\n\n private onContactUpdated(userId: UserId, isContact: boolean, curIsContact = this.isContact(userId)) {\n if(isContact !== curIsContact) {\n if(isContact) {\n this.pushContact(userId);\n } else {\n this.popContact(userId);\n }\n\n this.onContactsModified();\n\n this.rootScope.dispatchEvent('contacts_update', userId);\n }\n }\n\n public updateUsername(username: string) {\n return this.apiManager.invokeApi('account.updateUsername', {\n username\n }).then((user) => {\n this.saveApiUser(user);\n });\n }\n\n public setUserStatus(userId: UserId, offline: boolean) {\n if(this.isBot(userId)) {\n return;\n }\n\n const user = this.users[userId];\n if(user) {\n const status: UserStatus = offline ? {\n _: 'userStatusOffline',\n was_online: tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: tsNow(true) + 50\n };\n\n user.status = status;\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', userId);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public updateMyOnlineStatus(offline: boolean) {\n this.setUserStatus(this.getSelf().id, offline);\n return this.apiManager.invokeApiSingle('account.updateStatus', {offline});\n }\n\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, addPhonePrivacyException?: boolean) {\n /* if(!userId) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]);\n } */\n\n return this.apiManager.invokeApi('contacts.addContact', {\n id: this.getUserInput(userId),\n first_name,\n last_name,\n phone,\n add_phone_privacy_exception: addPhonePrivacyException\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n this.onContactUpdated(userId, true);\n });\n }\n\n public deleteContacts(userIds: UserId[]) {\n return this.apiManager.invokeApi('contacts.deleteContacts', {\n id: userIds.map((userId) => this.getUserInput(userId))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n userIds.forEach((userId) => {\n this.onContactUpdated(userId, false);\n });\n });\n }\n\n public checkUsername(username: string) {\n return this.apiManager.invokeApi('account.checkUsername', {username});\n }\n\n public toggleUsername(username: string, active: boolean) {\n return this.apiManager.invokeApi('account.toggleUsername', {username, active});\n }\n\n public reorderUsernames(usernames: string[]) {\n return this.apiManager.invokeApi('account.reorderUsernames', {order: usernames});\n }\n\n public canSendToUser(userId: UserId) {\n return canSendToUser(this.getUser(userId));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function cleanUsername(username: string) {\n return username && username.toLowerCase() || '';\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {WebPage} from '../../layer';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {AppManager} from './manager';\n\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\n\ntype WebPageMessageKey = `${PeerId}_${number}`;\n\nexport class AppWebPagesManager extends AppManager {\n private webpages: {\n [webPageId: string]: WebPage\n } = {};\n private pendingWebPages: {\n [webPageId: string]: Set\n } = {};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateWebPage: (update) => {\n this.saveWebPage(update.webpage);\n }\n });\n }\n\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\n if(apiWebPage._ === 'webPageNotModified' || apiWebPage._ === 'webPageEmpty') return;\n const {id} = apiWebPage;\n\n const oldWebPage = this.webpages[id];\n const isUpdated = oldWebPage &&\n oldWebPage._ === apiWebPage._ &&\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\n\n if(apiWebPage._ === 'webPage') {\n if(apiWebPage.photo?._ === 'photo') {\n apiWebPage.photo = this.appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\n } else {\n delete apiWebPage.photo;\n }\n\n if(apiWebPage.document?._ === 'document') {\n apiWebPage.document = this.appDocsManager.saveDoc(apiWebPage.document, mediaContext);\n } else {\n if(apiWebPage.type === 'document') {\n delete apiWebPage.type;\n }\n\n delete apiWebPage.document;\n }\n\n const siteName = apiWebPage.site_name;\n const shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\n if(siteName && shortTitle === siteName) {\n delete apiWebPage.site_name;\n }\n\n // delete apiWebPage.description\n\n if(!photoTypeSet.has(apiWebPage.type) &&\n !apiWebPage.description &&\n apiWebPage.photo) {\n apiWebPage.type = 'photo';\n }\n }\n\n let pendingSet = this.pendingWebPages[id];\n if(messageKey) {\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\n pendingSet.add(messageKey);\n }\n\n if(oldWebPage === undefined) {\n this.webpages[id] = apiWebPage;\n } else {\n safeReplaceObject(oldWebPage, apiWebPage);\n }\n\n if(!messageKey && pendingSet !== undefined && isUpdated) {\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\n pendingSet.forEach((value) => {\n const [peerId, mid, isScheduled] = value.split('_');\n msgs.push({\n peerId: peerId.toPeerId(),\n mid: +mid,\n isScheduled: !!isScheduled\n });\n });\n\n this.rootScope.dispatchEvent('webpage_updated', {\n id,\n msgs\n });\n }\n\n return apiWebPage;\n }\n\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\n }\n\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\n const id = (webPage as WebPage.webPage).id;\n if(!id) return;\n\n const set = this.pendingWebPages[id];\n if(set && set.has(messageKey)) {\n set.delete(messageKey);\n\n if(!set.size) {\n delete this.pendingWebPages[id];\n }\n }\n }\n\n public getCachedWebPage(id: WebPage.webPage['id']) {\n return this.webpages[id];\n }\n\n public getWebPage(url: string) {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getWebPage',\n processResult: (webPage) => {\n return this.saveWebPage(webPage);\n },\n params: {\n url\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","export default function fileNameRFC(fileName: string) {\n // Make filename RFC5987 compatible\n return encodeURIComponent(fileName).replace(/['()]/g, escape).replace(/\\*/g, '%2A');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getServiceMessagePort} from '../mtproto/mtproto.worker';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport StreamWriter from './streamWriter';\n\nexport default class DownloadWriter implements StreamWriter {\n constructor(\n private serviceMessagePort: ServiceMessagePort,\n private downloadId: string\n ) {\n this.serviceMessagePort = getServiceMessagePort();\n }\n\n public async write(part: Uint8Array, offset?: number) {\n return this.serviceMessagePort.invoke('downloadChunk', {\n id: this.downloadId,\n chunk: part\n });\n }\n\n public finalize(saveToStorage?: boolean): Promise {\n return this.serviceMessagePort.invoke('downloadFinalize', this.downloadId).then(() => undefined);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport makeError from '../../helpers/makeError';\nimport fileNameRFC from '../../helpers/string/fileNameRFC';\nimport {getServiceMessagePort} from '../mtproto/mtproto.worker';\nimport DownloadWriter from './downloadWriter';\nimport FileStorage from './fileStorage';\n\nexport default class DownloadStorage implements FileStorage {\n public getFile(fileName: string): Promise {\n return Promise.reject(makeError('NO_ENTRY_FOUND'));\n }\n\n public prepareWriting({fileName, downloadId, size}: {\n fileName: string,\n downloadId: string,\n size: number\n }) {\n const headers = {\n 'Content-Type': 'application/octet-stream; charset=utf-8',\n 'Content-Disposition': 'attachment; filename*=UTF-8\\'\\'' + fileNameRFC(fileName),\n ...(size ? {'Content-Length': size} : {})\n };\n\n const serviceMessagePort = getServiceMessagePort();\n const promise = serviceMessagePort.invoke('download', {\n headers,\n id: downloadId\n });\n\n const deferred = deferredPromise();\n deferred.cancel = () => {\n deferred.reject(makeError('DOWNLOAD_CANCELED'));\n };\n\n deferred.catch(() => {\n getServiceMessagePort().invoke('downloadCancel', downloadId);\n });\n\n promise.then(deferred.resolve, deferred.reject);\n\n return {\n deferred,\n getWriter: () => {\n return new DownloadWriter(serviceMessagePort, downloadId);\n }\n };\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {ReferenceBytes} from './referenceDatabase';\nimport Modes from '../../config/modes';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {randomLong} from '../../helpers/random';\nimport {Document, InputFile, InputFileLocation, InputWebFileLocation, Photo, PhotoSize, UploadFile, UploadWebFile, VideoSize, WebDocument} from '../../layer';\nimport {DcId} from '../../types';\nimport CacheStorageController from '../files/cacheStorage';\nimport {logger, LogTypes} from '../logger';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport readBlobAsArrayBuffer from '../../helpers/blob/readBlobAsArrayBuffer';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport fixFirefoxSvg from '../../helpers/fixFirefoxSvg';\nimport {AppManager} from '../appManagers/manager';\nimport {getEnvironment} from '../../environment/utils';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport type {Progress} from '../appManagers/appDownloadManager';\nimport getDownloadMediaDetails from '../appManagers/utils/download/getDownloadMediaDetails';\n// import networkStats from './networkStats';\nimport getDownloadFileNameFromOptions from '../appManagers/utils/download/getDownloadFileNameFromOptions';\nimport StreamWriter from '../files/streamWriter';\nimport FileStorage from '../files/fileStorage';\nimport {MAX_FILE_SAVE_SIZE} from './mtproto_config';\nimport throttle from '../../helpers/schedulers/throttle';\nimport makeError from '../../helpers/makeError';\nimport readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\nimport DownloadStorage from '../files/downloadStorage';\nimport copy from '../../helpers/object/copy';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {EXTENSION_MIME_TYPE_MAP, MIME_TYPE_EXTENSION_MAP} from '../../environment/mimeTypeMap';\nimport {getServiceMessagePort} from './mtproto.worker';\n\ntype Delayed = {\n offset: number,\n writePromise: CancellablePromise,\n writeDeferred: CancellablePromise\n};\n\nexport type DownloadOptions = {\n dcId: DcId,\n location: InputFileLocation | InputWebFileLocation,\n size?: number,\n fileName?: string,\n mimeType?: MTMimeType,\n limitPart?: number,\n queueId?: number,\n onlyCache?: boolean,\n downloadId?: string\n // getFileMethod: Parameters[1]\n};\n\nexport type DownloadMediaOptions = {\n media: Photo.photo | Document.document | WebDocument,\n thumb?: PhotoSize | VideoSize,\n queueId?: number,\n onlyCache?: boolean,\n downloadId?: string\n};\n\ntype DownloadPromise = CancellablePromise;\n\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\n\n// export interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\n// type: 'refreshReference',\n// payload: ReferenceBytes,\n// };\n\n// export interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\n// type: 'refreshReference',\n// payload: ReferenceBytes,\n// originalPayload: ReferenceBytes\n// };\n\nconst MAX_DOWNLOAD_FILE_PART_SIZE = 1 * 1024 * 1024;\nconst MAX_UPLOAD_FILE_PART_SIZE = 512 * 1024;\nconst MIN_PART_SIZE = 128 * 1024;\nconst AVG_PART_SIZE = 512 * 1024;\n\nconst REGULAR_DOWNLOAD_DELTA = (9 * 512 * 1024) / MIN_PART_SIZE;\n// const PREMIUM_DOWNLOAD_DELTA = REGULAR_DOWNLOAD_DELTA * 2;\nconst PREMIUM_DOWNLOAD_DELTA = (56 * 512 * 1024) / MIN_PART_SIZE;\n\nconst IGNORE_ERRORS: Set = new Set([\n 'DOWNLOAD_CANCELED',\n 'UPLOAD_CANCELED',\n 'UNKNOWN',\n 'NO_NEW_CONTEXT'\n]);\n\nexport class ApiFileManager extends AppManager {\n private cacheStorage = new CacheStorageController('cachedFiles');\n private downloadStorage = new DownloadStorage();\n\n private downloadPromises: {\n [fileName: string]: DownloadPromise\n } = {};\n\n // private downloadToDiscPromises: {\n // [fileName: string]: DownloadPromise\n // } = {};\n\n private uploadPromises: {\n [fileName: string]: CancellablePromise\n } = {};\n\n private downloadPulls: {\n [dcId: string]: Array<{\n id: number,\n queueId: number,\n cb: () => Promise,\n deferred: {\n resolve: (...args: any[]) => void,\n reject: (...args: any[]) => void\n },\n activeDelta: number\n }>\n } = {};\n private downloadActives: {[dcId: string]: number} = {};\n\n public refreshReferencePromises: {\n [referenceHex: string]: {\n deferred: CancellablePromise,\n timeout?: number\n }\n } = {};\n\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\n private tempId = 0;\n private queueId = 0;\n private debug = Modes.debug;\n\n private maxUploadParts = 4000;\n private maxDownloadParts = 8000;\n private webFileDcId: DcId;\n\n protected after() {\n setInterval(() => { // clear old promises\n for(const hex in this.refreshReferencePromises) {\n const {deferred} = this.refreshReferencePromises[hex];\n if(deferred.isFulfilled || deferred.isRejected) {\n delete this.refreshReferencePromises[hex];\n }\n }\n }, 1800e3);\n\n this.rootScope.addEventListener('config', (config) => {\n this.webFileDcId = config.webfile_dc_id;\n });\n\n this.rootScope.addEventListener('app_config', (appConfig) => {\n this.maxUploadParts = this.rootScope.premium ? appConfig.upload_max_fileparts_premium : appConfig.upload_max_fileparts_default;\n this.maxDownloadParts = appConfig.upload_max_fileparts_premium;\n });\n }\n\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\n if(this.downloadPulls[dcId] === undefined) {\n this.downloadPulls[dcId] = [];\n this.downloadActives[dcId] = 0;\n }\n\n const downloadPull = this.downloadPulls[dcId];\n\n const promise = new Promise((resolve, reject) => {\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\n });\n\n setTimeout(() => {\n this.downloadCheck(dcId);\n }, 0);\n\n return promise;\n }\n\n private downloadCheck(dcId: string | number) {\n const downloadPull = this.downloadPulls[dcId];\n const downloadLimit = /* dcId === 'upload' ? 24 : */(this.rootScope.premium ? PREMIUM_DOWNLOAD_DELTA : REGULAR_DOWNLOAD_DELTA);\n // const downloadLimit = Infinity;\n\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull?.length) {\n return false;\n }\n\n // const data = downloadPull.shift();\n const data = findAndSplice(downloadPull, (d) => d.queueId === 0) || findAndSplice(downloadPull, (d) => d.queueId === this.queueId) || downloadPull.shift();\n const activeDelta = data.activeDelta || 1;\n\n this.downloadActives[dcId] += activeDelta;\n\n const promise = data.cb();\n // const networkPromise = networkStats.waitForChunk(dcId as DcId, activeDelta * MIN_PART_SIZE);\n /* Promise.race([\n promise\n // networkPromise\n ]) */promise.then(() => {\n this.downloadActives[dcId] -= activeDelta;\n this.downloadCheck(dcId);\n\n // networkPromise.resolve();\n }, (error: ApiError) => {\n if(!error?.type || !IGNORE_ERRORS.has(error.type)) {\n this.log.error('downloadCheck error:', error);\n }\n\n this.downloadActives[dcId] -= activeDelta;\n this.downloadCheck(dcId);\n\n // networkPromise.reject(error);\n }).finally(() => {\n promise.then(data.deferred.resolve, data.deferred.reject);\n });\n }\n\n public setQueueId(queueId: number) {\n // this.log.error('setQueueId', queueId);\n this.queueId = queueId;\n }\n\n private getFileStorage() {\n return this.cacheStorage;\n }\n\n public cancelDownload(fileName: string) {\n const promises = [this.downloadPromises[fileName], this.uploadPromises[fileName]].filter(Boolean);\n let canceled = false;\n for(let i = 0, length = promises.length; i < length; ++i) {\n const promise = promises[i];\n if(promise && !promise.isRejected && !promise.isFulfilled) {\n promise.cancel();\n canceled = true;\n }\n }\n\n return canceled;\n }\n\n public requestWebFilePart(\n dcId: DcId,\n location: InputWebFileLocation,\n offset: number,\n limit: number,\n id = 0,\n queueId = 0,\n checkCancel?: () => void\n ) {\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\n checkCancel?.();\n\n if('url' in location) {\n const url = location.url;\n if(this.isLocalWebFile(url)) {\n return fetch(url)\n .then((response) => response.arrayBuffer())\n .then((arrayBuffer) => {\n const extension = url.split('.').pop() as MTFileExtension;\n const mimeType = EXTENSION_MIME_TYPE_MAP[extension] || 'application/octet-stream';\n return {\n _: 'upload.webFile',\n size: arrayBuffer.byteLength,\n mime_type: mimeType,\n file_type: {_: 'storage.fileUnknown'},\n mtime: 0,\n bytes: new Uint8Array(arrayBuffer)\n };\n });\n }\n }\n\n return this.apiManager.invokeApi('upload.getWebFile', {\n location,\n offset,\n limit\n }, {\n dcId,\n fileDownload: true\n });\n }, this.getDelta(limit), queueId);\n }\n\n public requestFilePart(\n dcId: DcId,\n location: InputFileLocation,\n offset: number,\n limit: number,\n id = 0,\n queueId = 0,\n checkCancel?: () => void\n ) {\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\n checkCancel?.();\n\n const invoke = async(): Promise => {\n checkCancel?.(); // do not remove async, because checkCancel will throw an error\n\n // * IMPORTANT: reference can be changed in previous request\n const reference = (location as InputFileLocation.inputDocumentFileLocation).file_reference?.slice();\n\n const promise = // pause(offset > (100 * 1024 * 1024) ? 10000000 : 0).then(() =>\n this.apiManager.invokeApi('upload.getFile', {\n location,\n offset,\n limit\n }, {\n dcId,\n fileDownload: true\n }) as Promise/* ) */;\n\n return promise.catch((err: ApiError) => {\n checkCancel?.();\n\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\n return this.refreshReference(location as InputFileLocation.inputDocumentFileLocation, reference).then(invoke);\n }\n\n throw err;\n });\n };\n\n assumeType(location);\n const reference = location.file_reference;\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\n location.checkedReference = true;\n const hex = bytesToHex(reference);\n if(this.refreshReferencePromises[hex]) {\n return this.refreshReference(location, reference).then(invoke);\n }\n }\n\n return invoke();\n }, this.getDelta(limit), queueId);\n }\n\n /* private convertBlobToBytes(blob: Blob) {\n return blob.arrayBuffer().then((buffer) => new Uint8Array(buffer));\n } */\n\n private getDelta(bytes: number) {\n return bytes / MIN_PART_SIZE;\n }\n\n private getLimitPart(size: number, isUpload: boolean): number {\n if(!size) { // * sometimes size can be 0 (e.g. avatars, webDocuments)\n return AVG_PART_SIZE;\n }\n\n // return 1 * 1024 * 1024;\n\n let bytes = MIN_PART_SIZE;\n\n const maxParts = isUpload ? this.maxUploadParts : this.maxDownloadParts;\n const maxPartSize = isUpload ? MAX_UPLOAD_FILE_PART_SIZE : MAX_DOWNLOAD_FILE_PART_SIZE;\n // usually it will stick to 512Kb size if the file is too big\n while((size / bytes) > maxParts && bytes < maxPartSize) {\n bytes *= 2;\n }\n /* if(size < 1e6 || !size) bytes = 512;\n else if(size < 3e6) bytes = 256;\n else bytes = 128; */\n\n return bytes;\n }\n\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\n return this.cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, false) as Promise;\n };\n\n private uncompressTGV = (bytes: Uint8Array, fileName: string) => {\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\n const buffer = bytes.slice().buffer;\n if(getEnvironment().IS_FIREFOX) {\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, true).then((text) => {\n return fixFirefoxSvg(text as string);\n }).then((text) => {\n const textEncoder = new TextEncoder();\n return textEncoder.encode(text);\n });\n }\n\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, false) as Promise;\n };\n\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\n const instance = MTProtoMessagePort.getInstance();\n return instance.invoke('convertWebp', {fileName, bytes});\n };\n\n private convertOpus = (bytes: Uint8Array, fileName: string) => {\n const instance = MTProtoMessagePort.getInstance();\n return instance.invoke('convertOpus', {fileName, bytes});\n };\n\n private refreshReference(\n inputFileLocation: InputFileLocation.inputDocumentFileLocation,\n reference: typeof inputFileLocation['file_reference'],\n hex = bytesToHex(reference)\n ) {\n let r = this.refreshReferencePromises[hex];\n if(!r) {\n const deferred = deferredPromise();\n\n r = this.refreshReferencePromises[hex] = {\n deferred\n\n // ! I don't remember what it was for...\n // timeout: ctx.setTimeout(() => {\n // this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\n // deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\n // }, 60000)\n };\n\n // deferred.catch(noop).finally(() => {\n // clearTimeout(r.timeout);\n // });\n\n this.referenceDatabase.refreshReference(reference).then((reference) => {\n if(hex === bytesToHex(reference)) {\n deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\n }\n\n deferred.resolve(reference);\n }, deferred.reject);\n }\n\n // have to replace file_reference in any way, because location can be different everytime if it's stream\n return r.deferred.then((reference) => {\n inputFileLocation.file_reference = reference;\n });\n }\n\n public isDownloading(fileName: string) {\n return !!this.downloadPromises[fileName];\n }\n\n public getDownload(fileName: string) {\n return this.downloadPromises[fileName];\n }\n\n public getUpload(fileName: string) {\n return this.uploadPromises[fileName];\n }\n\n private getConvertMethod(mimeType: MTMimeType) {\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\n if(mimeType === 'application/x-tgwallpattern') {\n process = this.uncompressTGV;\n mimeType = 'image/svg+xml';\n } else if(mimeType === 'image/webp' && !getEnvironment().IS_WEBP_SUPPORTED) {\n process = this.convertWebp;\n mimeType = 'image/png';\n } else if(mimeType === 'application/x-tgsticker') {\n process = this.uncompressTGS;\n mimeType = 'application/json';\n } else if(mimeType === 'audio/ogg' && !getEnvironment().IS_OPUS_SUPPORTED) {\n process = this.convertOpus;\n mimeType = 'audio/wav';\n }\n\n return {mimeType, process};\n }\n\n private allocateDeferredPromises(startOffset: number, size: number, limitPart: number) {\n const delayed: Delayed[] = [];\n let offset = startOffset;\n let writePromise: CancellablePromise = Promise.resolve(),\n writeDeferred: CancellablePromise;\n do {\n writeDeferred = deferredPromise();\n delayed.push({offset, writePromise, writeDeferred});\n writePromise = writeDeferred;\n offset += limitPart;\n } while(offset < size);\n\n return delayed;\n }\n\n private isLocalWebFile(url: string) {\n return url.startsWith('assets/');\n }\n\n public download(options: DownloadOptions): DownloadPromise {\n const size = options.size ?? 0;\n const {dcId, location} = options;\n let {downloadId} = options;\n if(downloadId && !getServiceMessagePort()) {\n this.log.error('download fallback to blob', options);\n downloadId = undefined;\n }\n\n const originalMimeType = options.mimeType;\n const convertMethod = this.getConvertMethod(originalMimeType);\n const {process} = convertMethod;\n options.mimeType = convertMethod.mimeType || 'image/jpeg';\n\n const fileName = getDownloadFileNameFromOptions(options);\n const cacheFileName = downloadId ? getDownloadFileNameFromOptions({...copy(options), downloadId: undefined}) : fileName;\n const cacheStorage: FileStorage = this.getFileStorage();\n const downloadStorage: FileStorage = downloadId ? this.downloadStorage : undefined;\n let deferred: DownloadPromise = downloadId ? undefined : this.downloadPromises[fileName];\n\n this.debug && this.log('downloadFile', fileName, options);\n\n if(deferred) {\n return deferred;\n }\n\n // if(deferred) {\n // if(size) {\n // return deferred.then(async(blob) => {\n // if(blob instanceof Blob && blob.size < size) {\n // this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\n\n // try {\n // await this.delete(fileName);\n // } finally {\n // return this.download(options);\n // }\n // } else {\n // return blob;\n // }\n // });\n // } else {\n // return deferred;\n // }\n // }\n\n const errorHandler = (item: typeof cachePrepared, error: ApiError) => {\n if(item?.error) {\n return;\n }\n\n for(const p of prepared) {\n if(item && item !== p) {\n continue;\n }\n\n p.error = error;\n p.deferred.reject(error);\n }\n };\n\n const isWebFile = location._ === 'inputWebFileLocation';\n const isLocalWebFile = isWebFile && this.isLocalWebFile(location.url);\n const id = this.tempId++;\n const limitPart = isLocalWebFile ?\n size :\n options.limitPart || this.getLimitPart(size, false);\n\n let getFile: FileStorage['getFile'] = cacheStorage.getFile.bind(cacheStorage);\n\n let cachePrepared: ReturnType & {writer?: StreamWriter, error?: ApiError},\n downloadPrepared: typeof cachePrepared;\n const prepared: (typeof cachePrepared)[] = [];\n const possibleSize = size || limitPart;\n\n const getErrorsCount = () => prepared.reduce((acc, item) => acc + +!!item.error, 0);\n\n const attach = (item: typeof cachePrepared, fileName: string) => {\n const {deferred} = item;\n const _errorHandler = errorHandler.bind(null, item);\n\n deferred.cancel = () => deferred.reject(makeError('DOWNLOAD_CANCELED'));\n deferred.catch((error) => {\n _errorHandler(error);\n item.writer?.truncate?.();\n }).finally(() => {\n if(this.downloadPromises[fileName] === deferred) {\n delete this.downloadPromises[fileName];\n }\n\n delete item.writer;\n // indexOfAndSplice(prepared, item);\n });\n\n this.downloadPromises[fileName] = deferred;\n\n prepared.push(item);\n };\n\n if(cacheStorage && (!downloadStorage || possibleSize <= MAX_FILE_SAVE_SIZE)) {\n cachePrepared = cacheStorage.prepareWriting(cacheFileName, possibleSize, options.mimeType)\n attach(cachePrepared, cacheFileName);\n }\n\n if(downloadStorage) {\n let downloadFileName = options.fileName; // it's doc file_name\n if(!downloadFileName) {\n downloadFileName = cacheFileName;\n const ext = MIME_TYPE_EXTENSION_MAP[options.mimeType];\n if(ext) {\n downloadFileName += '.' + ext;\n }\n }\n\n downloadPrepared = downloadStorage.prepareWriting({\n fileName: downloadFileName,\n downloadId,\n size: possibleSize\n });\n attach(downloadPrepared, fileName);\n\n if(cachePrepared) { // cancel cache too\n downloadPrepared.deferred.catch((err) => cachePrepared.deferred.reject(err));\n }\n\n // this.downloadToDiscPromises[cacheFileName] = deferred;\n // deferred.catch(noop).finally(() => {\n // if(this.downloadToDiscPromises[cacheFileName] === deferred) {\n // delete this.downloadToDiscPromises[cacheFileName];\n // }\n // });\n }\n\n deferred = downloadPrepared?.deferred ?? cachePrepared.deferred;\n\n if(downloadStorage && process) { // then have to load file again\n getFile = downloadStorage.getFile.bind(downloadStorage);\n }\n\n getFile(cacheFileName).then(async(blob: Blob) => {\n checkCancel();\n\n // if(blob.size < size) {\n // if(!options.onlyCache) {\n // await this.delete(cacheFileName);\n // checkCancel();\n // }\n\n // throw makeError('NO_ENTRY_FOUND');\n // }\n\n if(downloadPrepared) {\n const writer = downloadPrepared.writer = downloadPrepared.getWriter();\n checkCancel();\n\n const arr = await readBlobAsUint8Array(blob);\n checkCancel();\n await writer.write(arr);\n checkCancel();\n\n downloadPrepared.deferred.resolve(await writer.finalize());\n }\n\n if(cachePrepared) {\n cachePrepared.deferred.resolve(blob);\n }\n }).catch(async(err: ApiError) => {\n if(options.onlyCache) {\n errorHandler(null, err);\n return;\n }\n\n prepared.forEach((p) => {\n p.writer = p.getWriter();\n });\n\n const maxRequests = Infinity;\n\n const requestPart = (isWebFile ? this.requestWebFilePart : this.requestFilePart).bind(this);\n\n if(isWebFile && this.webFileDcId === undefined && !isLocalWebFile) {\n await this.apiManager.getConfig();\n checkCancel();\n }\n\n const delayed = this.allocateDeferredPromises(0, size, limitPart);\n\n const progress: Progress = {done: 0, offset: 0, total: size, fileName};\n const dispatchProgress = () => {\n try {\n checkCancel();\n progress.done = done;\n this.rootScope.dispatchEvent('download_progress', progress);\n } catch(err) {}\n };\n\n const throttledDispatchProgress = throttle(dispatchProgress, 50, true);\n\n let done = 0;\n const superpuper = async() => {\n const {offset, writePromise, writeDeferred} = delayed.shift();\n try {\n checkCancel();\n\n const requestPerf = performance.now();\n const result = await requestPart(dcId, location as any, offset, limitPart, id, options.queueId, checkCancel);\n const requestTime = performance.now() - requestPerf;\n\n const bytes = result.bytes;\n\n if(delayed.length) {\n superpuper();\n }\n\n const byteLength = bytes.byteLength;\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\n const isFinal = (offset + limitPart) >= size || !byteLength;\n if(byteLength) {\n done += byteLength;\n\n if(isFinal) {\n dispatchProgress();\n } else {\n throttledDispatchProgress();\n }\n\n const writeQueuePerf = performance.now();\n await writePromise;\n checkCancel();\n const writeQueueTime = performance.now() - writeQueuePerf;\n\n const perf = performance.now();\n await Promise.all(prepared.map(({writer}) => writer?.write(bytes, offset)));\n checkCancel();\n // downloadId && this.log('write time', performance.now() - perf, 'request time', requestTime, 'queue time', writeQueueTime);\n }\n\n if(isFinal) {\n if(!size || done < size) {\n prepared.forEach(({writer}) => writer?.trim?.(done));\n }\n }\n\n if(isFinal && process) {\n const promises = prepared\n .filter(({writer}) => writer?.getParts && writer.replaceParts)\n .map(async({writer}) => {\n const bytes = writer.getParts();\n const processedResult = await process(bytes, cacheFileName);\n writer.replaceParts(processedResult);\n });\n\n await Promise.all(promises);\n checkCancel();\n }\n\n writeDeferred.resolve();\n\n if(isFinal) {\n const saveToStorage = done <= MAX_FILE_SAVE_SIZE;\n prepared.forEach((item) => {\n const {deferred, writer} = item;\n if(deferred.isFulfilled || deferred.isRejected || !writer) {\n return;\n }\n\n const result = writer.finalize(saveToStorage);\n deferred.resolve(result);\n });\n }\n } catch(err) {\n errorHandler(null, err as ApiError);\n }\n };\n\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\n superpuper();\n }\n }).catch(noop);\n\n const checkCancel = () => {\n if(getErrorsCount() === prepared.length) {\n throw prepared[0].error;\n }\n };\n\n return deferred;\n }\n\n public downloadMedia(options: DownloadMediaOptions): DownloadPromise {\n let {media, thumb} = options;\n const isPhoto = media._ === 'photo';\n if(isPhoto && !thumb) {\n return Promise.reject('preloadPhoto photoEmpty!');\n }\n\n // get original instance with correct file_reference instead of using copies\n const isDocument = media._ === 'document';\n // const isWebDocument = media._ === 'webDocument';\n if(isDocument) media = this.appDocsManager.getDoc((media as Document.document).id);\n else if(isPhoto) media = this.appPhotosManager.getPhoto((media as Photo.photo).id);\n\n const {fileName, downloadOptions} = getDownloadMediaDetails(options);\n\n let promise = this.getDownload(fileName);\n if(!promise) {\n promise = this.download(downloadOptions);\n\n if(isDocument && !thumb) {\n this.rootScope.dispatchEvent('document_downloading', (media as Document.document).id);\n promise.then(() => {\n this.rootScope.dispatchEvent('document_downloaded', (media as Document.document).id);\n }).catch(noop);\n }\n }\n\n return promise;\n }\n\n public downloadMediaURL(options: DownloadMediaOptions): Promise {\n const {media, thumb} = options;\n\n let cacheContext = this.thumbsStorage.getCacheContext(media as any, thumb?.type);\n if((thumb ? (cacheContext.downloaded >= ('size' in thumb ? thumb.size : 0)) : true) && cacheContext.url) {\n return Promise.resolve(cacheContext.url);\n }\n\n return this.downloadMedia(options).then((blob) => {\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\n const url = URL.createObjectURL(blob);\n cacheContext = this.thumbsStorage.setCacheContextURL(media as any, cacheContext.type, url, blob.size);\n }\n\n return cacheContext.url;\n });\n }\n\n public downloadMediaVoid(options: DownloadMediaOptions) {\n return this.downloadMedia(options).then(noop);\n }\n\n private delete(fileName: string) {\n delete this.downloadPromises[fileName];\n return this.getFileStorage().delete(fileName);\n }\n\n public upload({file, fileName}: {file: Blob | File, fileName?: string}) {\n fileName ||= getFileNameForUpload(file);\n\n const fileSize = file.size;\n const isBigFile = fileSize >= 10485760;\n const partSize = this.getLimitPart(fileSize, true);\n const activeDelta = this.getDelta(partSize);\n const totalParts = Math.ceil(fileSize / partSize);\n const fileId = randomLong();\n const resultInputFile: InputFile = {\n _: isBigFile ? 'inputFileBig' : 'inputFile',\n id: fileId as any,\n parts: totalParts,\n name: fileName,\n md5_checksum: ''\n };\n\n const deferred = deferredPromise();\n if(totalParts > this.maxUploadParts) {\n deferred.reject(makeError('FILE_TOO_BIG'));\n return deferred;\n }\n\n let canceled = false, resolved = false;\n let errorHandler = (error: ApiError) => {\n if(error?.type !== 'UPLOAD_CANCELED') {\n this.log.error('Up Error', error);\n }\n\n deferred.reject(error);\n canceled = true;\n errorHandler = noop;\n };\n\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\n const id = this.tempId++;\n\n const self = this;\n function* generator() {\n let _part = 0, doneParts = 0;\n for(let offset = 0; offset < fileSize; offset += partSize) {\n const part = _part++; // 0, 1\n yield self.downloadRequest('upload', id, async() => {\n checkCancel();\n\n const blob = file.slice(offset, offset + partSize);\n const buffer = await readBlobAsArrayBuffer(blob);\n checkCancel();\n\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\n\n return self.apiManager.invokeApi(method, {\n file_id: fileId,\n file_part: part,\n file_total_parts: totalParts,\n bytes: buffer\n } as any, {\n fileUpload: true\n }).then(() => {\n if(canceled) {\n return;\n }\n\n ++doneParts;\n const progress: Progress = {done: doneParts * partSize, offset, total: fileSize, fileName};\n deferred.notify(progress);\n\n if(doneParts >= totalParts) {\n deferred.resolve(resultInputFile);\n resolved = true;\n }\n }, errorHandler);\n }, activeDelta).catch(errorHandler);\n }\n }\n\n const it = generator();\n const process = () => {\n if(canceled) return;\n const r = it.next();\n if(r.done || canceled) return;\n (r.value as Promise).then(process);\n };\n\n const maxRequests = Infinity;\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\n process();\n }\n\n const checkCancel = () => {\n if(canceled) {\n throw makeError('UPLOAD_CANCELED');\n }\n };\n\n deferred.cancel = () => {\n if(!canceled && !resolved) {\n canceled = true;\n errorHandler(makeError('UPLOAD_CANCELED'));\n }\n };\n\n deferred.notify = (progress: Progress) => {\n this.rootScope.dispatchEvent('download_progress', progress);\n };\n\n deferred.finally(() => {\n if(this.uploadPromises[fileName] === deferred) {\n delete this.uploadPromises[fileName];\n }\n });\n\n return this.uploadPromises[fileName] = deferred;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function fixFirefoxSvg(text: string) {\n const svgIndex = text.indexOf('/, ` width=\"${width}\" height=\"${height}\">`).replace(/[^\\x00-\\x7F]/g, '');\n return text;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsArrayBuffer from './readBlobAsArrayBuffer';\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from '../../environment/ctx';\nimport callbackify from '../../helpers/callbackify';\nimport {ignoreRestrictionReasons} from '../../helpers/restrictions';\nimport {Config, MethodDeclMap, User} from '../../layer';\nimport {InvokeApiOptions} from '../../types';\nimport {AppManager} from '../appManagers/manager';\nimport {MTAppConfig} from './appConfig';\nimport {UserAuth} from './mtproto_config';\nimport {MTMessage} from './networker';\n\ntype HashResult = {\n hash: number,\n result: any\n};\n\ntype HashOptions = {\n [queryJSON: string]: HashResult\n};\n\nexport type ApiLimitType = 'pin' | 'folderPin' | 'folders' |\n 'favedStickers' | 'reactions' | 'bio' | 'topicPin' | 'caption';\n\nexport default abstract class ApiManagerMethods extends AppManager {\n private afterMessageIdTemp: number;\n private hashes: {[method: string]: HashOptions} = {};\n private apiPromisesSingleProcess: {\n [q: string]: Map>\n } = {};\n private apiPromisesSingle: {\n [q: string]: Promise\n } = {};\n private apiPromisesCacheable: {\n [method: string]: {\n [queryJSON: string]: {\n timestamp: number,\n promise: Promise,\n fulfilled: boolean,\n timeout?: number,\n params: any\n }\n }\n } = {};\n\n protected config: Config;\n protected appConfig: MTAppConfig;\n\n constructor() {\n super();\n this.afterMessageIdTemp = 0;\n }\n\n abstract setUserAuth(userAuth: UserAuth | UserId): Promise;\n\n public setUser(user: User) {\n // appUsersManager.saveApiUser(user);\n return this.setUserAuth(user.id);\n }\n\n abstract invokeApi(method: T, params?: MethodDeclMap[T]['req'], options?: InvokeApiOptions): Promise;\n\n public invokeApiAfter(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n let o = options;\n o.prepareTempMessageId = '' + ++this.afterMessageIdTemp;\n\n o = {...options};\n (options as MTMessage).messageId = o.prepareTempMessageId;\n\n // console.log('will invokeApi:', method, params, options);\n return this.invokeApi(method, params, o);\n }\n\n public invokeApiHashable(o: {\n method: T,\n processResult?: (response: MethodDeclMap[T]['res']) => R,\n processError?: (error: ApiError) => any,\n params?: Omit,\n options?: InvokeApiOptions & {cacheKey?: string},\n overwrite?: boolean\n }) {\n // @ts-ignore\n o.params ??= {};\n o.options ??= {};\n // console.log('will invokeApi:', method, params, options);\n\n const {params, options, method, overwrite} = o;\n\n const queryJSON = JSON.stringify(params);\n let cached: HashResult;\n if(this.hashes[method]) {\n cached = this.hashes[method][queryJSON];\n if(cached) {\n if(overwrite) {\n delete this.hashes[method][queryJSON];\n cached = undefined;\n } else {\n (params as any).hash = cached.hash;\n }\n }\n }\n\n return this.invokeApiSingleProcess({\n method,\n processResult: (result) => {\n if(result._.includes('NotModified')) {\n // this.debug && this.log.warn('NotModified saved!', method, queryJSON);\n return cached.result;\n }\n\n if(result.hash/* || result.messages */) {\n const hash = result.hash/* || this.computeHash(result.messages) */;\n\n if(!this.hashes[method]) this.hashes[method] = {};\n cached = this.hashes[method][queryJSON] = {\n hash,\n result\n };\n }\n\n if(o.processResult) {\n const newResult = o.processResult(result);\n return cached ? cached.result = newResult : newResult;\n }\n\n return result;\n },\n params,\n options\n });\n }\n\n public invokeApiSingle(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions = {}): Promise {\n const q = method + '-' + JSON.stringify(params);\n const cache = this.apiPromisesSingle;\n if(cache[q]) {\n return cache[q];\n }\n\n return cache[q] = this.invokeApi(method, params, options).finally(() => {\n delete cache[q];\n });\n }\n\n public invokeApiSingleProcess(o: {\n method: T,\n processResult: (response: MethodDeclMap[T]['res']) => R,\n processError?: (error: ApiError) => any,\n params?: MethodDeclMap[T]['req'],\n options?: InvokeApiOptions & {cacheKey?: string, overwrite?: boolean}\n }): Promise> {\n o.params ??= {};\n o.options ??= {};\n\n const {method, processResult, processError, params, options} = o;\n const cache = this.apiPromisesSingleProcess;\n const cacheKey = options.cacheKey || JSON.stringify(params);\n const map = cache[method] ?? (cache[method] = new Map());\n const oldPromise = map.get(cacheKey);\n if(oldPromise) {\n return oldPromise;\n }\n\n const getNewPromise = () => {\n const promise = map.get(cacheKey);\n return promise === p ? undefined : promise;\n }\n\n const originalPromise = this.invokeApi(method, params, options);\n const newPromise: Promise> = originalPromise.then((result) => {\n return getNewPromise() || processResult(result);\n }, (error) => {\n const promise = getNewPromise();\n if(promise) {\n return promise;\n }\n\n if(!processError) {\n throw error;\n }\n\n return processError(error);\n });\n\n const p = newPromise.finally(() => {\n if(map.get(cacheKey) !== p) {\n return;\n }\n\n map.delete(cacheKey);\n if(!map.size) {\n delete cache[method];\n }\n });\n\n map.set(cacheKey, p);\n return p;\n }\n\n public invokeApiCacheable(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions & Partial<{cacheSeconds: number, override: boolean}> = {}): Promise {\n const cache = this.apiPromisesCacheable[method] ?? (this.apiPromisesCacheable[method] = {});\n const queryJSON = JSON.stringify(params);\n const item = cache[queryJSON];\n if(item && (!options.override || !item.fulfilled)) {\n return item.promise;\n }\n\n if(options.override) {\n if(item && item.timeout) {\n clearTimeout(item.timeout);\n delete item.timeout;\n }\n\n delete options.override;\n }\n\n let timeout: number;\n if(options.cacheSeconds) {\n timeout = ctx.setTimeout(() => {\n delete cache[queryJSON];\n }, options.cacheSeconds * 1000);\n delete options.cacheSeconds;\n }\n\n const promise = this.invokeApi(method, params, options);\n\n cache[queryJSON] = {\n timestamp: Date.now(),\n fulfilled: false,\n timeout,\n promise,\n params\n };\n\n return promise;\n }\n\n public clearCache(method: T, verify: (params: MethodDeclMap[T]['req']) => boolean) {\n const cache = this.apiPromisesCacheable[method];\n if(cache) {\n for(const queryJSON in cache) {\n const item = cache[queryJSON];\n try {\n if(verify(item.params)) {\n if(item.timeout) {\n clearTimeout(item.timeout);\n }\n\n delete cache[queryJSON];\n }\n } catch(err) {\n // this.log.error('clearCache error:', err, queryJSON, item);\n }\n }\n }\n }\n\n public getConfig(overwrite?: boolean) {\n if(this.config && !overwrite) {\n return this.config;\n }\n\n return this.invokeApiSingleProcess({\n method: 'help.getConfig',\n params: {},\n processResult: (config) => {\n this.config = config;\n this.rootScope.dispatchEvent('config', config);\n return config;\n },\n options: {overwrite}\n });\n }\n\n public getAppConfig(overwrite?: boolean) {\n if(this.appConfig && !overwrite) {\n return this.appConfig;\n }\n\n return this.invokeApiSingleProcess({\n method: 'help.getAppConfig',\n params: {},\n processResult: (config: MTAppConfig) => {\n this.appConfig = config;\n ignoreRestrictionReasons(config.ignore_restriction_reasons ?? []);\n this.rootScope.dispatchEvent('app_config', config);\n return config;\n },\n options: {overwrite}\n });\n }\n\n public getLimit(type: ApiLimitType, isPremium?: boolean) {\n return callbackify(this.getAppConfig(), (appConfig) => {\n const map: {[type in ApiLimitType]: [keyof MTAppConfig, keyof MTAppConfig] | keyof MTAppConfig} = {\n pin: ['dialogs_pinned_limit_default', 'dialogs_pinned_limit_premium'],\n folderPin: ['dialogs_folder_pinned_limit_default', 'dialogs_folder_pinned_limit_premium'],\n folders: ['dialog_filters_limit_default', 'dialog_filters_limit_premium'],\n favedStickers: ['stickers_faved_limit_default', 'stickers_faved_limit_premium'],\n reactions: ['reactions_user_max_default', 'reactions_user_max_premium'],\n bio: ['about_length_limit_default', 'about_length_limit_premium'],\n topicPin: 'topics_pinned_limit',\n caption: ['caption_length_limit_default', 'caption_length_limit_premium']\n };\n\n isPremium ??= this.rootScope.premium;\n\n const a = map[type];\n const key = Array.isArray(a) ? a[isPremium ? 1 : 0] : a;\n return appConfig[key] as number;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from './transports/controller';\nimport MTTransport from './transports/transport';\n \n\nimport type {UserAuth} from './mtproto_config';\nimport type {DcAuthKey, DcId, DcServerSalt, InvokeApiOptions} from '../../types';\nimport type {MethodDeclMap} from '../../layer';\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport sessionStorage from '../sessionStorage';\nimport MTPNetworker, {MTMessage} from './networker';\nimport {ConnectionType, constructTelegramWebSocketUrl, DcConfigurator, TransportType} from './dcConfigurator';\nimport {logger} from '../logger';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IDB} from '../files/idb';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport ctx from '../../environment/ctx';\nimport noop from '../../helpers/noop';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport pause from '../../helpers/schedulers/pause';\nimport ApiManagerMethods from './api_methods';\nimport {getEnvironment} from '../../environment/utils';\nimport toggleStorages from '../../helpers/toggleStorages';\n\n/* class RotatableArray {\n public array: Array = [];\n private lastIndex = -1;\n\n public get() {\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\n return this.array[this.lastIndex];\n }\n} */\n\nconst PREMIUM_FILE_NETWORKERS_COUNT = 6;\nconst REGULAR_FILE_NETWORKERS_COUNT = 3;\n\nexport class ApiManager extends ApiManagerMethods {\n private cachedNetworkers: {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTPNetworker[]\n }\n }\n };\n\n private cachedExportPromise: {[x: number]: Promise};\n private gettingNetworkers: {[dcIdAndType: string]: Promise};\n private baseDcId: DcId;\n\n // public telegramMeNotified = false;\n\n private log: ReturnType;\n\n private afterMessageTempIds: {\n [tempId: string]: {\n messageId: string,\n promise: Promise\n }\n };\n\n private transportType: TransportType;\n\n private updatesProcessor: (obj: any) => void;\n\n private loggingOut: boolean;\n\n constructor() {\n super();\n this.log = logger('API');\n\n this.cachedNetworkers = {} as any;\n this.cachedExportPromise = {};\n this.gettingNetworkers = {};\n this.baseDcId = 0;\n this.afterMessageTempIds = {};\n\n this.transportType = Modes.transport;\n\n \n transportController.addEventListener('transport', (transportType) => {\n this.changeTransportType(transportType);\n });\n \n\n // * Make sure that the used autologin_token is no more than 10000 seconds old\n // * https://core.telegram.org/api/url-authorization\n const REFRESH_APP_CONFIG_INTERVAL = (10000 - 30) * 1000;\n setInterval(() => {\n this.getAppConfig(true);\n }, REFRESH_APP_CONFIG_INTERVAL);\n }\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateConfig: () => {\n this.getConfig(true);\n this.getAppConfig(true);\n }\n });\n\n this.rootScope.addEventListener('user_auth', () => {\n if(this.config) { // refresh configs if had a config during authorization\n this.apiUpdatesManager.processLocalUpdate({_: 'updateConfig'});\n }\n });\n\n this.rootScope.addEventListener('premium_toggle', (isPremium) => {\n this.iterateNetworkers(({networker, connectionType, dcId, transportType}) => {\n if(connectionType === 'client' || transportType !== 'websocket') {\n return;\n }\n\n const transport = networker.transport;\n if(!transport) {\n this.log.error('wow what, no transport?', networker);\n return;\n }\n\n if((transport as TcpObfuscated).connection) {\n const url = constructTelegramWebSocketUrl(dcId, connectionType, isPremium);\n (transport as TcpObfuscated).changeUrl(url);\n }\n });\n });\n }\n\n // private lol = false;\n\n // constructor() {\n // MtpSingleInstanceService.start();\n\n /* AppStorage.get('dc').then((dcId) => {\n if(dcId) {\n this.baseDcId = dcId;\n }\n }); */\n // }\n\n /* public telegramMeNotify(newValue: boolean) {\n if(this.telegramMeNotified !== newValue) {\n this.telegramMeNotified = newValue;\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\n }\n } */\n\n private getTransportType(connectionType: ConnectionType) {\n \n \n \n \n \n // @ts-ignore\n const transportType: TransportType = this.transportType;\n \n\n return transportType;\n }\n\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\n for(const transportType in this.cachedNetworkers) {\n const connections = this.cachedNetworkers[transportType as TransportType];\n for(const connectionType in connections) {\n const dcs = connections[connectionType as ConnectionType];\n for(const dcId in dcs) {\n const networkers = dcs[dcId as any as DcId];\n networkers.forEach((networker, idx, arr) => {\n callback({\n networker,\n dcId: +dcId as DcId,\n connectionType: connectionType as ConnectionType,\n transportType: transportType as TransportType,\n index: idx,\n array: arr\n });\n });\n }\n }\n }\n }\n\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\n return this.dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client', this.rootScope.premium);\n }\n\n public changeTransportType(transportType: TransportType) {\n const oldTransportType = this.transportType;\n if(oldTransportType === transportType) {\n return;\n }\n\n this.log('changing transport from', oldTransportType, 'to', transportType);\n\n const oldObject = this.cachedNetworkers[oldTransportType];\n const newObject = this.cachedNetworkers[transportType];\n this.cachedNetworkers[transportType] = oldObject;\n this.cachedNetworkers[oldTransportType] = newObject;\n\n this.transportType = transportType;\n\n for(const oldGetKey in this.gettingNetworkers) {\n const promise = this.gettingNetworkers[oldGetKey];\n delete this.gettingNetworkers[oldGetKey];\n\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\n this.gettingNetworkers[newGetKey] = promise;\n\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\n }\n\n this.iterateNetworkers((info) => {\n const transportType = this.getTransportType(info.connectionType);\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\n this.changeNetworkerTransport(info.networker, transport);\n });\n }\n\n public async getBaseDcId() {\n if(this.baseDcId) {\n return this.baseDcId;\n }\n\n const baseDcId = await sessionStorage.get('dc');\n if(!this.baseDcId) {\n if(!baseDcId) {\n this.setBaseDcId(App.baseDcId);\n } else {\n this.baseDcId = baseDcId;\n }\n }\n\n return this.baseDcId;\n }\n\n public async setUserAuth(userAuth: UserAuth | UserId) {\n if(typeof(userAuth) === 'string' || typeof(userAuth) === 'number') {\n userAuth = {dcID: 0, date: Date.now() / 1000 | 0, id: userAuth.toPeerId(false)};\n }\n\n this.rootScope.dispatchEvent('user_auth', userAuth);\n\n if(!userAuth.dcID) {\n const baseDcId = await this.getBaseDcId();\n userAuth.dcID = baseDcId;\n }\n\n sessionStorage.set({\n user_auth: userAuth\n });\n\n // this.telegramMeNotify(true);\n }\n\n public setBaseDcId(dcId: DcId) {\n const wasDcId = this.baseDcId;\n if(wasDcId) { // if migrated set ondrain\n this.getNetworker(wasDcId).then((networker) => {\n this.setOnDrainIfNeeded(networker);\n });\n }\n\n this.baseDcId = dcId;\n\n sessionStorage.set({\n dc: this.baseDcId\n });\n }\n\n public async logOut() {\n if(this.loggingOut) {\n return;\n }\n\n this.loggingOut = true;\n const storageKeys: Array = [];\n\n const prefix = 'dc';\n for(let dcId = 1; dcId <= 5; dcId++) {\n storageKeys.push(prefix + dcId + '_auth_key' as any);\n }\n\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\n const storageResult = await Promise.all(storageKeys.map((key) => sessionStorage.get(key)));\n\n const logoutPromises: Promise[] = [];\n for(let i = 0; i < storageResult.length; i++) {\n if(storageResult[i]) {\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\n }\n }\n\n const clear = async() => {\n this.baseDcId = undefined;\n // this.telegramMeNotify(false);\n await toggleStorages(false, true);\n IDB.closeDatabases();\n this.rootScope.dispatchEvent('logging_out');\n };\n\n setTimeout(clear, 1e3);\n\n // return;\n\n return Promise.all(logoutPromises).catch((error) => {\n error.handled = true;\n }).finally(clear)/* .then(() => {\n location.pathname = '/';\n }) */;\n }\n\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\n return [dcId, transportType, connectionType].join('-');\n }\n\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\n // const connectionType: ConnectionType = 'client';\n\n const transportType = this.getTransportType(connectionType);\n if(!this.cachedNetworkers[transportType]) {\n this.cachedNetworkers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const cache = this.cachedNetworkers[transportType][connectionType];\n if(!(dcId in cache)) {\n cache[dcId] = [];\n }\n\n const networkers = cache[dcId];\n // @ts-ignore\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (this.rootScope.premium ? PREMIUM_FILE_NETWORKERS_COUNT : REGULAR_FILE_NETWORKERS_COUNT);\n if(networkers.length >= maxNetworkers) {\n let i = maxNetworkers - 1, found = false;\n for(; i >= 0; --i) {\n if(networkers[i].isOnline) {\n found = true;\n break;\n }\n }\n\n const networker = networkers.splice(found ? i : maxNetworkers - 1, 1)[0];\n networkers.unshift(networker);\n return Promise.resolve(networker);\n }\n\n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\n if(this.gettingNetworkers[getKey]) {\n return this.gettingNetworkers[getKey];\n }\n\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\n\n let transport = this.chooseServer(dcId, connectionType, transportType);\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map((key) => sessionStorage.get(key)))\n .then(async([authKeyHex, serverSaltHex]) => {\n let networker: MTPNetworker, error: any;\n if(authKeyHex && authKeyHex.length === 512) {\n if(!serverSaltHex || serverSaltHex.length !== 16) {\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\n }\n\n const authKey = bytesFromHex(authKeyHex);\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1', authKey)).slice(-8);\n const serverSalt = bytesFromHex(serverSaltHex);\n\n networker = this.networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\n } else {\n try { // if no saved state\n const auth = await this.authorizer.auth(dcId);\n\n sessionStorage.set({\n [ak]: bytesToHex(auth.authKey),\n [ss]: bytesToHex(auth.serverSalt)\n });\n\n networker = this.networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\n } catch(_error) {\n error = _error;\n }\n }\n\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\n const newTransportType = this.getTransportType(connectionType);\n if(newTransportType !== transportType) {\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\n transport.destroy();\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, transport);\n\n if(networker) {\n transport = this.chooseServer(dcId, connectionType, newTransportType);\n }\n\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\n }\n\n /* networker.onConnectionStatusChange = (online) => {\n console.log('status:', online);\n }; */\n\n delete this.gettingNetworkers[getKey];\n\n if(error) {\n this.log('get networker error', error, (error as Error).stack);\n throw error;\n }\n\n this.changeNetworkerTransport(networker, transport);\n networkers.unshift(networker);\n this.setOnDrainIfNeeded(networker);\n return networker;\n });\n }\n\n public getNetworkerVoid(dcId: DcId) {\n return this.getNetworker(dcId).then(noop, noop);\n }\n\n private changeNetworkerTransport(networker: MTPNetworker, transport?: MTTransport) {\n const oldTransport = networker.transport;\n if(oldTransport) {\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, oldTransport);\n }\n\n networker.changeTransport(transport);\n }\n\n private onNetworkerDrain(networker: MTPNetworker) {\n this.log('networker drain', networker.dcId);\n networker.onDrain = undefined;\n this.changeNetworkerTransport(networker);\n networker.destroy();\n this.networkerFactory.removeNetworker(networker);\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\n }\n\n public setOnDrainIfNeeded(networker: MTPNetworker) {\n if(networker.onDrain) {\n return;\n }\n\n const checkPromise: Promise = networker.isFileNetworker ?\n Promise.resolve(true) :\n this.getBaseDcId().then((baseDcId) => networker.dcId !== baseDcId);\n checkPromise.then((canRelease) => {\n if(networker.onDrain) {\n return;\n }\n\n if(canRelease) {\n networker.onDrain = () => this.onNetworkerDrain(networker);\n networker.setDrainTimeout();\n }\n });\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n this.networkerFactory.setUpdatesProcessor(callback);\n }\n\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\n // /////this.log('Invoke api', method, params, options);\n\n /* if(!this.lol) {\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\n this.lol = true;\n } */\n\n const deferred = deferredPromise();\n\n let {afterMessageId, prepareTempMessageId} = options;\n if(prepareTempMessageId) {\n deferred.then(() => {\n delete this.afterMessageTempIds[prepareTempMessageId];\n });\n }\n\n if(MOUNT_CLASS_TO) {\n const startTime = Date.now();\n const interval = ctx.setInterval(() => {\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\n }\n // this.cachedUploadNetworkers[2].requestMessageStatus();\n }, 5e3);\n\n deferred.catch(noop).finally(() => {\n clearInterval(interval);\n });\n }\n\n const rejectPromise = async(error: ApiError) => {\n if(!error) {\n error = {type: 'ERROR_EMPTY'};\n } else if(!isObject(error)) {\n error = {message: error};\n }\n\n if((error.code === 401 && error.type === 'SESSION_REVOKED') ||\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\n this.logOut();\n }\n\n if(options.ignoreErrors) {\n throw error;\n }\n\n if(error.code === 406) {\n error.handled = true;\n }\n\n if(!options.noErrorBox) {\n error.input = method;\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\n setTimeout(() => {\n if(!error.handled) {\n if(error.code === 401) {\n this.logOut();\n } else {\n // ErrorService.show({error: error}); // WARNING\n }\n\n error.handled = true;\n }\n }, 100);\n }\n\n throw error;\n };\n\n let dcId: DcId;\n\n let cachedNetworker: MTPNetworker;\n const stack = (new Error()).stack || 'empty stack';\n const performRequest = (): Promise => {\n if(afterMessageId) {\n const after = this.afterMessageTempIds[afterMessageId];\n if(after) {\n options.afterMessageId = after.messageId;\n }\n }\n\n const promise = cachedNetworker.wrapApiCall(method, params, options);\n\n if(prepareTempMessageId) {\n this.afterMessageTempIds[prepareTempMessageId] = {\n messageId: (options as MTMessage).messageId,\n promise: deferred\n };\n }\n\n return promise.catch((error: ApiError) => {\n // if(!options.ignoreErrors) {\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\n }\n\n if(error.code === 401 && this.baseDcId === dcId) {\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\n sessionStorage.delete('dc')\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\n // this.telegramMeNotify(false);\n }\n\n throw error;\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\n if(this.cachedExportPromise[dcId] === undefined) {\n const promise = new Promise((exportResolve, exportReject) => {\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\n this.invokeApi('auth.importAuthorization', {\n id: exportedAuth.id,\n bytes: exportedAuth.bytes\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\n }, exportReject);\n });\n\n this.cachedExportPromise[dcId] = promise;\n }\n\n return this.cachedExportPromise[dcId].then(() => performRequest());\n } else if(error.code === 303) {\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n if(options.dcId) {\n options.dcId = newDcId;\n } else {\n this.setBaseDcId(newDcId);\n }\n\n return this.invokeApi(method, params, options);\n }\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n options.dcId = newDcId;\n return this.invokeApi(method, params, options);\n } else {\n throw error;\n }\n } else if(error.code === 400 && error.type === 'CONNECTION_NOT_INITED') {\n this.networkerFactory.unsetConnectionInited();\n return performRequest();\n } else if(!options.rawError && error.code === 420) {\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\n\n if(waitTime > (options.floodMaxTimeout ?? 60) && !options.prepareTempMessageId) {\n throw error;\n }\n\n return pause(waitTime/* (waitTime + 5) */ * 1000).then(() => performRequest());\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\n const after = this.afterMessageTempIds[afterMessageId];\n\n afterMessageId = undefined;\n delete options.afterMessageId;\n\n if(after) return after.promise.then(() => performRequest());\n else return performRequest();\n } else if(!options.rawError && error.code === 500) {\n const now = Date.now();\n if(options.stopTime) {\n if(now >= options.stopTime) {\n throw error;\n }\n }\n\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\n return pause(options.waitTime * 1000).then(() => performRequest());\n } else if(error.type === 'UNKNOWN' || error.type === 'MTPROTO_CLUSTER_INVALID') { // cluster invalid - request from regular user to premium endpoint\n return pause(1000).then(() => performRequest());\n } else {\n throw error;\n }\n });\n }\n\n let p: Promise;\n if(dcId = (options.dcId || this.baseDcId)) {\n p = this.getNetworker(dcId, options);\n } else {\n p = this.getBaseDcId().then((baseDcId) => this.getNetworker(dcId = baseDcId, options));\n }\n\n p.then((networker) => {\n cachedNetworker = networker;\n const promise = performRequest();\n cachedNetworker.attachPromise(deferred, options as MTMessage);\n return promise;\n })\n .then(deferred.resolve)\n .catch(rejectPromise)\n .catch(deferred.reject);\n\n return deferred;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport applyMixins from '../../helpers/applyMixins';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {AppManager} from '../appManagers/manager';\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\n\ntype PeersStorageKey = `${StatePeerType}_${string | PeerId}` | StatePeerType;\n\nclass PeersStorage {\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map> = new Map();\n\n constructor() {\n this._constructor(false);\n }\n\n protected after() {\n this.rootScope.addEventListener('user_auth', () => {\n this.requestPeer(this.appPeersManager.peerId, 'self');\n });\n }\n\n public requestPeer(peerId: PeerId, key: PeersStorageKey) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(key)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(key);\n\n this.dispatchEvent('peerNeeded', peerId);\n }\n\n public releasePeer(peerId: PeerId, key: PeersStorageKey) {\n const set = this.neededPeers.get(peerId);\n if(!set) {\n return;\n }\n\n set.delete(key);\n\n if(!set.size) {\n this.neededPeers.delete(peerId);\n this.dispatchEvent('peerUnneeded', peerId);\n }\n }\n\n public requestPeersForKey(peerIds: Set | number[], key: PeersStorageKey) {\n if(Array.isArray(peerIds)) {\n peerIds = new Set(peerIds);\n }\n\n let set = this.singlePeerMap.get(key);\n if(set) {\n for(const peerId of set) {\n if(peerIds.has(peerId)) {\n continue;\n }\n\n this.releasePeer(peerId, key);\n set.delete(peerId);\n }\n\n if(!set.size && !peerIds.size) {\n this.singlePeerMap.delete(key);\n return;\n }\n }\n\n if(peerIds.size) {\n if(!set) {\n set = new Set();\n this.singlePeerMap.set(key, set);\n }\n\n for(const peerId of peerIds) {\n if(set.has(peerId)) {\n continue;\n }\n\n this.requestPeer(peerId, key);\n set.add(peerId);\n }\n }\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n}\n\ninterface PeersStorage extends EventListenerBase<{\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void,\n}>, AppManager {}\napplyMixins(PeersStorage, [EventListenerBase, AppManager]);\n\nexport default PeersStorage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WebDocument} from '../../layer';\nimport type {MyDocument} from '../appManagers/appDocsManager';\nimport type {MyPhoto} from '../appManagers/appPhotosManager';\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n\nexport type ThumbCache = {\n downloaded: number,\n url: string,\n type: string\n};\n\nexport type ThumbsCache = {\n [key: string]: {\n [size: string]: ThumbCache\n }\n};\n\nconst thumbFullSize = THUMB_TYPE_FULL;\n\nexport type ThumbStorageMedia = MyPhoto | MyDocument | WebDocument;\n\nexport default class ThumbsStorage {\n private thumbsCache: ThumbsCache = {};\n\n private getKey(media: ThumbStorageMedia) {\n return media._ + ((media as MyPhoto).id ?? (media as WebDocument).url);\n }\n\n public getCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize): ThumbCache {\n /* if(media._ === 'photo' && thumbSize !== 'i') {\n thumbSize = thumbFullSize;\n } */\n\n const cache = this.thumbsCache[this.getKey(media)] ??= {};\n return cache[thumbSize] ??= {downloaded: 0, url: '', type: thumbSize};\n }\n\n public setCacheContextURL(media: ThumbStorageMedia, thumbSize: string = thumbFullSize, url: string, downloaded: number = 0) {\n const cacheContext = this.getCacheContext(media, thumbSize);\n cacheContext.url = url;\n cacheContext.downloaded = downloaded;\n return cacheContext;\n }\n\n public deleteCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize) {\n const cache = this.thumbsCache[this.getKey(media)];\n if(cache) {\n delete cache[thumbSize];\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type MTProtoConstructor = {\n id: number,\n predicate: string,\n params: Array<{\n name: string,\n type: string\n }>,\n type: string\n};\n\nexport type MTProtoMethod = {\n id: number,\n method: string,\n params: Array<{\n name: string,\n type: string\n }>,\n type: string\n};\n\n// eslint-disable-next-line quotes, comma-spacing\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":-994444869,\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":1450380236,\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":2134579434,\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":2107670217,\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-208488460,\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":-181407105,\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-1771768449,\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.2?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":-1279654347,\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-104578748,\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":-122978821,\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":480546647,\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":-968723890,\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"InputChatPhoto\"},{\"id\":-1991004873,\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":-457104426,\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":1210199983,\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"InputGeoPoint\"},{\"id\":483901197,\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":1001634122,\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":-539317279,\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1432995067,\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1086091090,\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":8322574,\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-891180321,\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":172975040,\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1373745011,\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1384777335,\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1258941372,\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1278304028,\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":276907596,\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-742634630,\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"User\"},{\"id\":1326562017,\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":-2100168954,\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"personal\",\"type\":\"flags.2?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":164646985,\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-306628279,\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":9203775,\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":693512293,\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Chat\"},{\"id\":1103884886,\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.25?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":1704108455,\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":-908914376,\"predicate\":\"chatFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_set_username\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.13?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"flags.3?Vector\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"call\",\"type\":\"flags.12?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.15?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.16?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.17?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.17?Vector\"},{\"name\":\"available_reactions\",\"type\":\"flags.18?ChatReactions\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-2023500831,\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":1018991608,\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":935395612,\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":476978193,\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"ChatPhoto\"},{\"id\":-1868117372,\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"peer_id\",\"type\":\"flags.0?Peer\"}],\"type\":\"Message\"},{\"id\":940666592,\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"edit_hide\",\"type\":\"flags.21?true\"},{\"name\":\"pinned\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"forwards\",\"type\":\"flags.10?int\"},{\"name\":\"replies\",\"type\":\"flags.23?MessageReplies\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"},{\"name\":\"reactions\",\"type\":\"flags.20?MessageReactions\"},{\"name\":\"restriction_reason\",\"type\":\"flags.22?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":721967202,\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":1038967584,\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":1766936791,\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.3?true\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1457575028,\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":1882335561,\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageMedia\"},{\"id\":-1618676578,\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":-1230047312,\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1119368275,\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1247687078,\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":2144015272,\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-1780220945,\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":365886720,\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1539362612,\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-712374074,\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"unread_mark\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"unread_reactions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"},{\"name\":\"folder_id\",\"type\":\"flags.4?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.5?int\"}],\"type\":\"Dialog\"},{\"id\":590459437,\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":-82216347,\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"},{\"name\":\"video_sizes\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"Photo\"},{\"id\":236446268,\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":1976012384,\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":35527382,\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":286776671,\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":-1297942941,\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"GeoPoint\"},{\"id\":1577067778,\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":872119224,\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"setup_password_required\",\"type\":\"flags.1?true\"},{\"name\":\"otherwise_relogin_days\",\"type\":\"flags.1?int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":-1271602504,\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1195615476,\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":423314455,\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":1251338318,\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-551616469,\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?NotificationSound\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1472527322,\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"ios_sound\",\"type\":\"flags.3?NotificationSound\"},{\"name\":\"android_sound\",\"type\":\"flags.4?NotificationSound\"},{\"name\":\"other_sound\",\"type\":\"flags.5?NotificationSound\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-1525149427,\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"},{\"name\":\"add_contact\",\"type\":\"flags.1?true\"},{\"name\":\"block_contact\",\"type\":\"flags.2?true\"},{\"name\":\"share_contact\",\"type\":\"flags.3?true\"},{\"name\":\"need_contacts_exception\",\"type\":\"flags.4?true\"},{\"name\":\"report_geo\",\"type\":\"flags.5?true\"},{\"name\":\"autoarchived\",\"type\":\"flags.7?true\"},{\"name\":\"invite_members\",\"type\":\"flags.8?true\"},{\"name\":\"request_chat_broadcast\",\"type\":\"flags.10?true\"},{\"name\":\"geo_distance\",\"type\":\"flags.6?int\"},{\"name\":\"request_chat_title\",\"type\":\"flags.9?string\"},{\"name\":\"request_chat_date\",\"type\":\"flags.9?int\"}],\"type\":\"PeerSettings\"},{\"id\":-1539849235,\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"pattern\",\"type\":\"flags.3?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"Document\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1490799288,\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":505595789,\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":777640226,\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1376497949,\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1041980751,\"predicate\":\"inputReportReasonOther\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-120378643,\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"can_pin_message\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.12?true\"},{\"name\":\"video_calls_available\",\"type\":\"flags.13?true\"},{\"name\":\"voice_messages_forbidden\",\"type\":\"flags.20?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"personal_photo\",\"type\":\"flags.21?Photo\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"fallback_photo\",\"type\":\"flags.22?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"common_chats_count\",\"type\":\"int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.15?string\"},{\"name\":\"private_forward_name\",\"type\":\"flags.16?string\"},{\"name\":\"bot_group_admin_rights\",\"type\":\"flags.17?ChatAdminRights\"},{\"name\":\"bot_broadcast_admin_rights\",\"type\":\"flags.18?ChatAdminRights\"},{\"name\":\"premium_gifts\",\"type\":\"flags.19?Vector\"}],\"type\":\"UserFull\"},{\"id\":341499403,\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":-1052885936,\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":383348795,\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":-1219778094,\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":-353862078,\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Contacts\"},{\"id\":2010127419,\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector\"},{\"name\":\"popular_invites\",\"type\":\"Vector\"},{\"name\":\"retry_contacts\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":182326673,\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":-513392236,\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":364538944,\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":1910543603,\"predicate\":\"messages.dialogsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1938715001,\"predicate\":\"messages.messages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":978610270,\"predicate\":\"messages.messagesSlice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"next_rate\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-438840932,\"predicate\":\"messages.chatFull\",\"params\":[{\"name\":\"full_chat\",\"type\":\"ChatFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1269012015,\"predicate\":\"messages.affectedHistory\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1474492012,\"predicate\":\"inputMessagesFilterEmpty\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1777752804,\"predicate\":\"inputMessagesFilterPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1614803355,\"predicate\":\"inputMessagesFilterVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1458172132,\"predicate\":\"inputMessagesFilterPhotoVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1629621880,\"predicate\":\"inputMessagesFilterDocument\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":2129714567,\"predicate\":\"inputMessagesFilterUrl\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-3644025,\"predicate\":\"inputMessagesFilterGif\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":522914557,\"predicate\":\"updateNewMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1318109142,\"predicate\":\"updateMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1576161051,\"predicate\":\"updateDeleteMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1071741569,\"predicate\":\"updateUserTyping\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-2092401936,\"predicate\":\"updateChatUserTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":125178264,\"predicate\":\"updateChatParticipants\",\"params\":[{\"name\":\"participants\",\"type\":\"ChatParticipants\"}],\"type\":\"Update\"},{\"id\":-440534818,\"predicate\":\"updateUserStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"Update\"},{\"id\":-1484486364,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"usernames\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1519637954,\"predicate\":\"updates.state\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"}],\"type\":\"updates.State\"},{\"id\":1567990072,\"predicate\":\"updates.differenceEmpty\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":16030880,\"predicate\":\"updates.difference\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-1459938943,\"predicate\":\"updates.differenceSlice\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"intermediate_state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-484987010,\"predicate\":\"updatesTooLong\",\"params\":[],\"type\":\"Updates\"},{\"id\":826001400,\"predicate\":\"updateShortMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":1299050149,\"predicate\":\"updateShortChatMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":2027216577,\"predicate\":\"updateShort\",\"params\":[{\"name\":\"update\",\"type\":\"Update\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1918567619,\"predicate\":\"updatesCombined\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq_start\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1957577280,\"predicate\":\"updates\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1916114267,\"predicate\":\"photos.photos\",\"params\":[{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":352657236,\"predicate\":\"photos.photosSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":539045032,\"predicate\":\"photos.photo\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photo\"},{\"id\":157948117,\"predicate\":\"upload.file\",\"params\":[{\"name\":\"type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.File\"},{\"id\":414687501,\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"this_port_only\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":589653676,\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"force_try_ipv6\",\"type\":\"flags.14?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"reactions_default\",\"type\":\"flags.15?Reaction\"}],\"type\":\"Config\"},{\"id\":-1910892683,\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":-860107216,\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"sticker\",\"type\":\"flags.3?Document\"}],\"type\":\"help.AppUpdate\"},{\"id\":-1000708810,\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":415997816,\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":314359194,\"predicate\":\"updateNewEncryptedMessage\",\"params\":[{\"name\":\"message\",\"type\":\"EncryptedMessage\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":386986326,\"predicate\":\"updateEncryptedChatTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1264392051,\"predicate\":\"updateEncryption\",\"params\":[{\"name\":\"chat\",\"type\":\"EncryptedChat\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":956179895,\"predicate\":\"updateEncryptedMessagesRead\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1417756512,\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":1722964307,\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":1223809356,\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1643173063,\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":505183301,\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"history_deleted\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":-247351839,\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":-1038136962,\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":-1476358952,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":406307684,\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":1690108678,\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1511503333,\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-317144808,\"predicate\":\"encryptedMessage\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"EncryptedMessage\"},{\"id\":594758406,\"predicate\":\"encryptedMessageService\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"EncryptedMessage\"},{\"id\":-1058912715,\"predicate\":\"messages.dhConfigNotModified\",\"params\":[{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":740433629,\"predicate\":\"messages.dhConfig\",\"params\":[{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":1443858741,\"predicate\":\"messages.sentEncryptedMessage\",\"params\":[{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-1802240206,\"predicate\":\"messages.sentEncryptedFile\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1037718609,\"predicate\":\"updateChatParticipantAdd\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-483443337,\"predicate\":\"updateChatParticipantDelete\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1906403213,\"predicate\":\"updateDcOptions\",\"params\":[{\"name\":\"dc_options\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1530447553,\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"force_file\",\"type\":\"flags.4?true\"},{\"name\":\"spoiler\",\"type\":\"flags.5?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":860303448,\"predicate\":\"inputMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"},{\"name\":\"query\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nopremium\",\"type\":\"flags.3?true\"},{\"name\":\"spoiler\",\"type\":\"flags.4?true\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1928391342,\"predicate\":\"inputDocumentEmpty\",\"params\":[],\"type\":\"InputDocument\"},{\"id\":448771445,\"predicate\":\"inputDocument\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputDocument\"},{\"id\":-1160743548,\"predicate\":\"inputDocumentFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":-1881881384,\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector\"},{\"name\":\"video_thumbs\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"Document\"},{\"id\":398898678,\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":-1613493288,\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":-1261946036,\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1073230141,\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"id\":381645902,\"predicate\":\"sendMessageTypingAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-44119819,\"predicate\":\"sendMessageCancelAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1584933265,\"predicate\":\"sendMessageRecordVideoAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-378127636,\"predicate\":\"sendMessageUploadVideoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-718310409,\"predicate\":\"sendMessageRecordAudioAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-212740181,\"predicate\":\"sendMessageUploadAudioAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-774682074,\"predicate\":\"sendMessageUploadPhotoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1441998364,\"predicate\":\"sendMessageUploadDocumentAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":393186209,\"predicate\":\"sendMessageGeoLocationAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":1653390447,\"predicate\":\"sendMessageChooseContactAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1290580579,\"predicate\":\"contacts.found\",\"params\":[{\"name\":\"my_results\",\"type\":\"Vector\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Found\"},{\"id\":-337352679,\"predicate\":\"updateServiceNotification\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"inbox_date\",\"type\":\"flags.1?int\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"MessageMedia\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-496024847,\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":129960444,\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":2011940674,\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-298113238,\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1335282456,\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1137792208,\"predicate\":\"privacyKeyStatusTimestamp\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":218751099,\"predicate\":\"inputPrivacyValueAllowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":407582158,\"predicate\":\"inputPrivacyValueAllowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":320652927,\"predicate\":\"inputPrivacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":195371015,\"predicate\":\"inputPrivacyValueDisallowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-697604407,\"predicate\":\"inputPrivacyValueDisallowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-1877932953,\"predicate\":\"inputPrivacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-123988,\"predicate\":\"privacyValueAllowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":1698855810,\"predicate\":\"privacyValueAllowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1198497870,\"predicate\":\"privacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-125240806,\"predicate\":\"privacyValueDisallowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1955338397,\"predicate\":\"privacyValueDisallowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-463335103,\"predicate\":\"privacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1352683077,\"predicate\":\"account.privacyRules\",\"params\":[{\"name\":\"rules\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1194283041,\"predicate\":\"accountDaysTTL\",\"params\":[{\"name\":\"days\",\"type\":\"int\"}],\"type\":\"AccountDaysTTL\"},{\"id\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1815593308,\"predicate\":\"documentAttributeImageSize\",\"params\":[{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":297109817,\"predicate\":\"documentAttributeAnimated\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1662637586,\"predicate\":\"documentAttributeSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"mask\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"DocumentAttribute\"},{\"id\":250621158,\"predicate\":\"documentAttributeVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"round_message\",\"type\":\"flags.0?true\"},{\"name\":\"supports_streaming\",\"type\":\"flags.1?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1739392570,\"predicate\":\"documentAttributeAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"voice\",\"type\":\"flags.10?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"},{\"name\":\"waveform\",\"type\":\"flags.2?bytes\"}],\"type\":\"DocumentAttribute\"},{\"id\":358154344,\"predicate\":\"documentAttributeFilename\",\"params\":[{\"name\":\"file_name\",\"type\":\"string\"}],\"type\":\"DocumentAttribute\"},{\"id\":-244016606,\"predicate\":\"messages.stickersNotModified\",\"params\":[],\"type\":\"messages.Stickers\"},{\"id\":816245886,\"predicate\":\"messages.stickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.Stickers\"},{\"id\":313694676,\"predicate\":\"stickerPack\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerPack\"},{\"id\":-395967805,\"predicate\":\"messages.allStickersNotModified\",\"params\":[],\"type\":\"messages.AllStickers\"},{\"id\":-843329861,\"predicate\":\"messages.allStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.AllStickers\"},{\"id\":-1667805217,\"predicate\":\"updateReadHistoryInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":791617983,\"predicate\":\"updateReadHistoryOutbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-350980120,\"predicate\":\"webPageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"WebPage\"},{\"id\":-981018084,\"predicate\":\"webPagePending\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-392411726,\"predicate\":\"webPage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"display_url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"type\",\"type\":\"flags.0?string\"},{\"name\":\"site_name\",\"type\":\"flags.1?string\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"embed_url\",\"type\":\"flags.5?string\"},{\"name\":\"embed_type\",\"type\":\"flags.5?string\"},{\"name\":\"embed_width\",\"type\":\"flags.6?int\"},{\"name\":\"embed_height\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"author\",\"type\":\"flags.8?string\"},{\"name\":\"document\",\"type\":\"flags.9?Document\"},{\"name\":\"cached_page\",\"type\":\"flags.10?Page\"},{\"name\":\"attributes\",\"type\":\"flags.12?Vector\"}],\"type\":\"WebPage\"},{\"id\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"id\":-1392388579,\"predicate\":\"authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.0?true\"},{\"name\":\"official_app\",\"type\":\"flags.1?true\"},{\"name\":\"password_pending\",\"type\":\"flags.2?true\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.3?true\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.4?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"app_name\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"Authorization\"},{\"id\":1275039392,\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"},{\"name\":\"authorizations\",\"type\":\"Vector\"}],\"type\":\"account.Authorizations\"},{\"id\":-1787080453,\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"},{\"name\":\"pending_reset_date\",\"type\":\"flags.5?int\"},{\"name\":\"login_email_pattern\",\"type\":\"flags.6?string\"}],\"type\":\"account.Password\"},{\"id\":-1705233435,\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1036572727,\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":326715557,\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":-1052959727,\"predicate\":\"inputMediaVenue\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":784356159,\"predicate\":\"messageMediaVenue\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1551583367,\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":179611673,\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.0?true\"},{\"name\":\"permanent\",\"type\":\"flags.5?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"start_date\",\"type\":\"flags.4?int\"},{\"name\":\"expire_date\",\"type\":\"flags.1?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.2?int\"},{\"name\":\"usage\",\"type\":\"flags.3?int\"},{\"name\":\"requested\",\"type\":\"flags.7?int\"},{\"name\":\"title\",\"type\":\"flags.8?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1516793212,\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":806110401,\"predicate\":\"chatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"flags.0?true\"},{\"name\":\"broadcast\",\"type\":\"flags.1?true\"},{\"name\":\"public\",\"type\":\"flags.2?true\"},{\"name\":\"megagroup\",\"type\":\"flags.3?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"flags.5?string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector\"}],\"type\":\"ChatInvite\"},{\"id\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-4838507,\"predicate\":\"inputStickerSetEmpty\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1645763991,\"predicate\":\"inputStickerSetID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputStickerSet\"},{\"id\":-2044933984,\"predicate\":\"inputStickerSetShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":768691932,\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"videos\",\"type\":\"flags.6?true\"},{\"name\":\"emojis\",\"type\":\"flags.7?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumbs\",\"type\":\"flags.4?Vector\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_version\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_document_id\",\"type\":\"flags.8?long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":1846886166,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"keywords\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":-1885878744,\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"apply_min_photo\",\"type\":\"flags.25?true\"},{\"name\":\"fake\",\"type\":\"flags.26?true\"},{\"name\":\"bot_attach_menu\",\"type\":\"flags.27?true\"},{\"name\":\"premium\",\"type\":\"flags.28?true\"},{\"name\":\"attach_menu_enabled\",\"type\":\"flags.29?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"},{\"name\":\"emoji_status\",\"type\":\"flags.30?EmojiStatus\"},{\"name\":\"usernames\",\"type\":\"flags2.0?Vector\"}],\"type\":\"User\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":-1892676777,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"flags.0?long\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"description_photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"description_document\",\"type\":\"flags.5?Document\"},{\"name\":\"commands\",\"type\":\"flags.2?Vector\"},{\"name\":\"menu_button\",\"type\":\"flags.3?BotMenuButton\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":2002815875,\"predicate\":\"keyboardButtonRow\",\"params\":[{\"name\":\"buttons\",\"type\":\"Vector\"}],\"type\":\"KeyboardButtonRow\"},{\"id\":-1606526075,\"predicate\":\"replyKeyboardHide\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2035021048,\"predicate\":\"replyKeyboardForceReply\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2049074735,\"predicate\":\"replyKeyboardMarkup\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"resize\",\"type\":\"flags.0?true\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"persistent\",\"type\":\"flags.4?true\"},{\"name\":\"rows\",\"type\":\"Vector\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":-1148011883,\"predicate\":\"messageEntityUnknown\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-100378723,\"predicate\":\"messageEntityMention\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1868782349,\"predicate\":\"messageEntityHashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1827637959,\"predicate\":\"messageEntityBotCommand\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1859134776,\"predicate\":\"messageEntityUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1692693954,\"predicate\":\"messageEntityEmail\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1117713463,\"predicate\":\"messageEntityBold\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-2106619040,\"predicate\":\"messageEntityItalic\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":681706865,\"predicate\":\"messageEntityCode\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1938967520,\"predicate\":\"messageEntityPre\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":1990644519,\"predicate\":\"messageEntityTextUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":-1877614335,\"predicate\":\"updateShortSentMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":-292807034,\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":-212145112,\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-2094689180,\"predicate\":\"channel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"verified\",\"type\":\"flags.7?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"restricted\",\"type\":\"flags.9?true\"},{\"name\":\"signatures\",\"type\":\"flags.11?true\"},{\"name\":\"min\",\"type\":\"flags.12?true\"},{\"name\":\"scam\",\"type\":\"flags.19?true\"},{\"name\":\"has_link\",\"type\":\"flags.20?true\"},{\"name\":\"has_geo\",\"type\":\"flags.21?true\"},{\"name\":\"slowmode_enabled\",\"type\":\"flags.22?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"fake\",\"type\":\"flags.25?true\"},{\"name\":\"gigagroup\",\"type\":\"flags.26?true\"},{\"name\":\"noforwards\",\"type\":\"flags.27?true\"},{\"name\":\"join_to_send\",\"type\":\"flags.28?true\"},{\"name\":\"join_request\",\"type\":\"flags.29?true\"},{\"name\":\"forum\",\"type\":\"flags.30?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.13?long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"flags.6?string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.9?Vector\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"banned_rights\",\"type\":\"flags.15?ChatBannedRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"},{\"name\":\"participants_count\",\"type\":\"flags.17?int\"},{\"name\":\"usernames\",\"type\":\"flags2.0?Vector\"}],\"type\":\"Chat\"},{\"id\":399807445,\"predicate\":\"channelForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"until_date\",\"type\":\"flags.16?int\"}],\"type\":\"Chat\"},{\"id\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-231385849,\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.20?true\"},{\"name\":\"blocked\",\"type\":\"flags.22?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"name\":\"can_delete_channel\",\"type\":\"flags2.0?true\"},{\"name\":\"antispam\",\"type\":\"flags2.1?true\"},{\"name\":\"participants_hidden\",\"type\":\"flags2.2?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.23?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?long\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?long\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"stats_dc\",\"type\":\"flags.12?int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"call\",\"type\":\"flags.21?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.24?int\"},{\"name\":\"pending_suggestions\",\"type\":\"flags.25?Vector\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.26?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.27?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.28?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.28?Vector\"},{\"name\":\"default_send_as\",\"type\":\"flags.29?Peer\"},{\"name\":\"available_reactions\",\"type\":\"flags.30?ChatReactions\"}],\"type\":\"ChatFull\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":-948520370,\"predicate\":\"messages.channelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"topics\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":277713951,\"predicate\":\"updateChannelTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1666927625,\"predicate\":\"updateChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1656358105,\"predicate\":\"updateNewChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1842450928,\"predicate\":\"updateReadChannelInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1020437742,\"predicate\":\"updateDeleteChannelMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-232346616,\"predicate\":\"updateChannelMessageViews\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1041346555,\"predicate\":\"updates.channelDifferenceEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1531132162,\"predicate\":\"updates.channelDifferenceTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"dialog\",\"type\":\"Dialog\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":543450958,\"predicate\":\"updates.channelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1798033689,\"predicate\":\"channelMessagesFilterEmpty\",\"params\":[],\"type\":\"ChannelMessagesFilter\"},{\"id\":-847783593,\"predicate\":\"channelMessagesFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_new_messages\",\"type\":\"flags.1?true\"},{\"name\":\"ranges\",\"type\":\"Vector\"}],\"type\":\"ChannelMessagesFilter\"},{\"id\":-1072953408,\"predicate\":\"channelParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":900251559,\"predicate\":\"channelParticipantSelf\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"via_request\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":803602899,\"predicate\":\"channelParticipantCreator\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.0?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":-566281095,\"predicate\":\"channelParticipantsRecent\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1268741783,\"predicate\":\"channelParticipantsAdmins\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1548400251,\"predicate\":\"channelParticipantsKicked\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1699676497,\"predicate\":\"channels.channelParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-541588713,\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":-462696732,\"predicate\":\"chatParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"ChatParticipant\"},{\"id\":-1600962725,\"predicate\":\"chatParticipantAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-674602590,\"predicate\":\"updateChatParticipantAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"is_admin\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-519864430,\"predicate\":\"messageActionChatMigrateTo\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-365344535,\"predicate\":\"messageActionChannelMigrateFrom\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":2013922064,\"predicate\":\"help.termsOfService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"DataJSON\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"min_age_confirm\",\"type\":\"flags.1?int\"}],\"type\":\"help.TermsOfService\"},{\"id\":1753886890,\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":196268545,\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":834816008,\"predicate\":\"updateStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"}],\"type\":\"Update\"},{\"id\":-402498398,\"predicate\":\"messages.savedGifsNotModified\",\"params\":[],\"type\":\"messages.SavedGifs\"},{\"id\":-2069878259,\"predicate\":\"messages.savedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"gifs\",\"type\":\"Vector\"}],\"type\":\"messages.SavedGifs\"},{\"id\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"id\":864077702,\"predicate\":\"inputBotInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1036876423,\"predicate\":\"inputBotInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-2000710887,\"predicate\":\"inputBotInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?InputWebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?InputWebDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1984755728,\"predicate\":\"botInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1937807902,\"predicate\":\"botInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":295067450,\"predicate\":\"botInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?WebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1803769784,\"predicate\":\"messages.botResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"next_offset\",\"type\":\"flags.1?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.2?InlineBotSwitchPM\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.BotResults\"},{\"id\":1232025500,\"predicate\":\"updateBotInlineQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"peer_type\",\"type\":\"flags.1?InlineQueryPeerType\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":317794823,\"predicate\":\"updateBotInlineSend\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"flags.1?InputBotInlineMessageID\"}],\"type\":\"Update\"},{\"id\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1571494644,\"predicate\":\"exportedMessageLink\",\"params\":[{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"html\",\"type\":\"string\"}],\"type\":\"ExportedMessageLink\"},{\"id\":1601666510,\"predicate\":\"messageFwdHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"imported\",\"type\":\"flags.7?true\"},{\"name\":\"from_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"from_name\",\"type\":\"flags.5?string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"post_author\",\"type\":\"flags.3?string\"},{\"name\":\"saved_from_peer\",\"type\":\"flags.4?Peer\"},{\"name\":\"saved_from_msg_id\",\"type\":\"flags.4?int\"},{\"name\":\"psa_type\",\"type\":\"flags.6?string\"}],\"type\":\"MessageFwdHeader\"},{\"id\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1923290508,\"predicate\":\"auth.codeTypeSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1948046307,\"predicate\":\"auth.codeTypeCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":577556219,\"predicate\":\"auth.codeTypeFlashCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1035688326,\"predicate\":\"auth.sentCodeTypeApp\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1073693790,\"predicate\":\"auth.sentCodeTypeSms\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1398007207,\"predicate\":\"auth.sentCodeTypeCall\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1425815847,\"predicate\":\"auth.sentCodeTypeFlashCall\",\"params\":[{\"name\":\"pattern\",\"type\":\"string\"}],\"type\":\"auth.SentCodeType\"},{\"id\":629866245,\"predicate\":\"keyboardButtonUrl\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":901503851,\"predicate\":\"keyboardButtonCallback\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requires_password\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"KeyboardButton\"},{\"id\":-1318425559,\"predicate\":\"keyboardButtonRequestPhone\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-59151553,\"predicate\":\"keyboardButtonRequestGeoLocation\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":90744648,\"predicate\":\"keyboardButtonSwitchInline\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"same_peer\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"ReplyMarkup\"},{\"id\":911761060,\"predicate\":\"messages.botCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"has_url\",\"type\":\"flags.3?true\"},{\"name\":\"native_ui\",\"type\":\"flags.4?true\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-1177566067,\"predicate\":\"updateBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1768777083,\"predicate\":\"inputBotInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1098628881,\"predicate\":\"inputBotInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1494368259,\"predicate\":\"inputBotInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":85477117,\"predicate\":\"botInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1970903652,\"predicate\":\"botInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":416402882,\"predicate\":\"botInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1462213465,\"predicate\":\"inputBotInlineResultPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"InputPhoto\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-459324,\"predicate\":\"inputBotInlineResultDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":400266251,\"predicate\":\"botInlineMediaResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":1763610706,\"predicate\":\"updateInlineBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"msg_id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":1008755359,\"predicate\":\"inlineBotSwitchPM\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InlineBotSwitchPM\"},{\"id\":863093588,\"predicate\":\"messages.peerDialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-305282981,\"predicate\":\"topPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"rating\",\"type\":\"double\"}],\"type\":\"TopPeer\"},{\"id\":-1419371685,\"predicate\":\"topPeerCategoryBotsPM\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":344356834,\"predicate\":\"topPeerCategoryBotsInline\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":104314861,\"predicate\":\"topPeerCategoryCorrespondents\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1122524854,\"predicate\":\"topPeerCategoryGroups\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":371037736,\"predicate\":\"topPeerCategoryChannels\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-75283823,\"predicate\":\"topPeerCategoryPeers\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"TopPeerCategoryPeers\"},{\"id\":-567906571,\"predicate\":\"contacts.topPeersNotModified\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":1891070632,\"predicate\":\"contacts.topPeers\",\"params\":[{\"name\":\"categories\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.TopPeers\"},{\"id\":-595914432,\"predicate\":\"messageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":546203849,\"predicate\":\"inputMessageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"MessageEntity\"},{\"id\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1218471511,\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":457829485,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"id\":453805082,\"predicate\":\"draftMessageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"flags.0?int\"}],\"type\":\"DraftMessage\"},{\"id\":-40996577,\"predicate\":\"draftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"DraftMessage\"},{\"id\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-1103615738,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"},{\"name\":\"unread\",\"type\":\"Vector\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":186120336,\"predicate\":\"messages.recentStickersNotModified\",\"params\":[],\"type\":\"messages.RecentStickers\"},{\"id\":-1999405994,\"predicate\":\"messages.recentStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"dates\",\"type\":\"Vector\"}],\"type\":\"messages.RecentStickers\"},{\"id\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1338747336,\"predicate\":\"messages.archivedStickers\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":946083368,\"predicate\":\"messages.stickerSetInstallResultSuccess\",\"params\":[],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":904138920,\"predicate\":\"messages.stickerSetInstallResultArchive\",\"params\":[{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":1678812626,\"predicate\":\"stickerSetCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"cover\",\"type\":\"Document\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":-440664550,\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.1?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.1?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":872932635,\"predicate\":\"stickerSetMultiCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"covers\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1361650766,\"predicate\":\"maskCoords\",\"params\":[{\"name\":\"n\",\"type\":\"int\"},{\"name\":\"x\",\"type\":\"double\"},{\"name\":\"y\",\"type\":\"double\"},{\"name\":\"zoom\",\"type\":\"double\"}],\"type\":\"MaskCoords\"},{\"id\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1251549527,\"predicate\":\"inputStickeredMediaPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputStickeredMedia\"},{\"id\":70813275,\"predicate\":\"inputStickeredMediaDocument\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"}],\"type\":\"InputStickeredMedia\"},{\"id\":-1107729093,\"predicate\":\"game\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"}],\"type\":\"Game\"},{\"id\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":53231223,\"predicate\":\"inputGameID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGame\"},{\"id\":-1020139510,\"predicate\":\"inputGameShortName\",\"params\":[{\"name\":\"bot_id\",\"type\":\"InputUser\"},{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputGame\"},{\"id\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1940093419,\"predicate\":\"highScore\",\"params\":[{\"name\":\"pos\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"HighScore\"},{\"id\":-1707344487,\"predicate\":\"messages.highScores\",\"params\":[{\"name\":\"scores\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.HighScores\"},{\"id\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":791390623,\"predicate\":\"updateChannelWebPage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-599948721,\"predicate\":\"textEmpty\",\"params\":[],\"type\":\"RichText\"},{\"id\":1950782688,\"predicate\":\"textPlain\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":1730456516,\"predicate\":\"textBold\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-653089380,\"predicate\":\"textItalic\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1054465340,\"predicate\":\"textUnderline\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1678197867,\"predicate\":\"textStrike\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1816074681,\"predicate\":\"textFixed\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1009288385,\"predicate\":\"textUrl\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"}],\"type\":\"RichText\"},{\"id\":-564523562,\"predicate\":\"textEmail\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":2120376535,\"predicate\":\"textConcat\",\"params\":[{\"name\":\"texts\",\"type\":\"Vector\"}],\"type\":\"RichText\"},{\"id\":324435594,\"predicate\":\"pageBlockUnsupported\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":1890305021,\"predicate\":\"pageBlockTitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1879401953,\"predicate\":\"pageBlockSubtitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1162877472,\"predicate\":\"pageBlockAuthorDate\",\"params\":[{\"name\":\"author\",\"type\":\"RichText\"},{\"name\":\"published_date\",\"type\":\"int\"}],\"type\":\"PageBlock\"},{\"id\":-1076861716,\"predicate\":\"pageBlockHeader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-248793375,\"predicate\":\"pageBlockSubheader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1182402406,\"predicate\":\"pageBlockParagraph\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1066346178,\"predicate\":\"pageBlockPreformatted\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":1216809369,\"predicate\":\"pageBlockFooter\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-618614392,\"predicate\":\"pageBlockDivider\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":-837994576,\"predicate\":\"pageBlockAnchor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":-454524911,\"predicate\":\"pageBlockList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":641563686,\"predicate\":\"pageBlockBlockquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1329878739,\"predicate\":\"pageBlockPullquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":391759200,\"predicate\":\"pageBlockPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"},{\"name\":\"url\",\"type\":\"flags.0?string\"},{\"name\":\"webpage_id\",\"type\":\"flags.0?long\"}],\"type\":\"PageBlock\"},{\"id\":2089805750,\"predicate\":\"pageBlockVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autoplay\",\"type\":\"flags.0?true\"},{\"name\":\"loop\",\"type\":\"flags.1?true\"},{\"name\":\"video_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":972174080,\"predicate\":\"pageBlockCover\",\"params\":[{\"name\":\"cover\",\"type\":\"PageBlock\"}],\"type\":\"PageBlock\"},{\"id\":-1468953147,\"predicate\":\"pageBlockEmbed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"full_width\",\"type\":\"flags.0?true\"},{\"name\":\"allow_scrolling\",\"type\":\"flags.3?true\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"html\",\"type\":\"flags.2?string\"},{\"name\":\"poster_photo_id\",\"type\":\"flags.4?long\"},{\"name\":\"w\",\"type\":\"flags.5?int\"},{\"name\":\"h\",\"type\":\"flags.5?int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-229005301,\"predicate\":\"pageBlockEmbedPost\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"author_photo_id\",\"type\":\"long\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1705048653,\"predicate\":\"pageBlockCollage\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":52401552,\"predicate\":\"pageBlockSlideshow\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-2048646399,\"predicate\":\"phoneCallDiscardReasonMissed\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-527056480,\"predicate\":\"phoneCallDiscardReasonDisconnect\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1471006352,\"predicate\":\"phoneCallDiscardReasonHangup\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-84416311,\"predicate\":\"phoneCallDiscardReasonBusy\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1852826908,\"predicate\":\"updateDialogPinned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-99664734,\"predicate\":\"updatePinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":-2095595325,\"predicate\":\"updateBotWebhookJSON\",\"params\":[{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-1684914010,\"predicate\":\"updateBotWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"},{\"name\":\"timeout\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":1048946971,\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"recurring\",\"type\":\"flags.9?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"},{\"name\":\"max_tip_amount\",\"type\":\"flags.8?long\"},{\"name\":\"suggested_tip_amounts\",\"type\":\"flags.8?Vector\"},{\"name\":\"recurring_terms_url\",\"type\":\"flags.9?string\"}],\"type\":\"Invoice\"},{\"id\":-1900697899,\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"flags.1?string\"},{\"name\":\"extended_media\",\"type\":\"flags.2?InputMedia\"}],\"type\":\"InputMedia\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":-156940077,\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"},{\"name\":\"extended_media\",\"type\":\"flags.4?MessageExtendedMedia\"}],\"type\":\"MessageMedia\"},{\"id\":512535275,\"predicate\":\"postAddress\",\"params\":[{\"name\":\"street_line1\",\"type\":\"string\"},{\"name\":\"street_line2\",\"type\":\"string\"},{\"name\":\"city\",\"type\":\"string\"},{\"name\":\"state\",\"type\":\"string\"},{\"name\":\"country_iso2\",\"type\":\"string\"},{\"name\":\"post_code\",\"type\":\"string\"}],\"type\":\"PostAddress\"},{\"id\":-1868808300,\"predicate\":\"paymentRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"flags.0?string\"},{\"name\":\"phone\",\"type\":\"flags.1?string\"},{\"name\":\"email\",\"type\":\"flags.2?string\"},{\"name\":\"shipping_address\",\"type\":\"flags.3?PostAddress\"}],\"type\":\"PaymentRequestedInfo\"},{\"id\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1776926890,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"invoice_slug\",\"type\":\"flags.0?string\"}],\"type\":\"MessageAction\"},{\"id\":-842892769,\"predicate\":\"paymentSavedCredentialsCard\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentSavedCredentials\"},{\"id\":475467473,\"predicate\":\"webDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":-1678949555,\"predicate\":\"inputWebDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"InputWebDocument\"},{\"id\":-1036396922,\"predicate\":\"inputWebFileLocation\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWebFileLocation\"},{\"id\":568808380,\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":-1610250415,\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"additional_methods\",\"type\":\"flags.6?Vector\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentForm\"},{\"id\":-784000893,\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":1314881805,\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1891958275,\"predicate\":\"payments.paymentReceipt\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.2?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping\",\"type\":\"flags.1?ShippingOption\"},{\"name\":\"tip_amount\",\"type\":\"flags.3?long\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"credentials_title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-74456004,\"predicate\":\"payments.savedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_saved_credentials\",\"type\":\"flags.1?true\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"}],\"type\":\"payments.SavedInfo\"},{\"id\":-1056001329,\"predicate\":\"inputPaymentCredentialsSaved\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"tmp_password\",\"type\":\"bytes\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":873977640,\"predicate\":\"inputPaymentCredentials\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-614138572,\"predicate\":\"account.tmpPassword\",\"params\":[{\"name\":\"tmp_password\",\"type\":\"bytes\"},{\"name\":\"valid_until\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":-1239335713,\"predicate\":\"shippingOption\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"}],\"type\":\"ShippingOption\"},{\"id\":-1246823043,\"predicate\":\"updateBotShippingQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"shipping_address\",\"type\":\"PostAddress\"}],\"type\":\"Update\"},{\"id\":-1934976362,\"predicate\":\"updateBotPrecheckoutQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-6249322,\"predicate\":\"inputStickerSetItem\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"emoji\",\"type\":\"string\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"InputStickerSetItem\"},{\"id\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":506920429,\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":1399245077,\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":-987599081,\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":347139340,\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":912311057,\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":-1770029977,\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":1355435489,\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":-1665063993,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"tcp\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":-58224696,\"predicate\":\"phoneCallProtocol\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"udp_p2p\",\"type\":\"flags.0?true\"},{\"name\":\"udp_reflector\",\"type\":\"flags.1?true\"},{\"name\":\"min_layer\",\"type\":\"int\"},{\"name\":\"max_layer\",\"type\":\"int\"},{\"name\":\"library_versions\",\"type\":\"Vector\"}],\"type\":\"PhoneCallProtocol\"},{\"id\":-326966976,\"predicate\":\"phone.phoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.PhoneCall\"},{\"id\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":-2132731265,\"predicate\":\"messageActionPhoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call_id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"MessageAction\"},{\"id\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-242427324,\"predicate\":\"upload.fileCdnRedirect\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"encryption_key\",\"type\":\"bytes\"},{\"name\":\"encryption_iv\",\"type\":\"bytes\"},{\"name\":\"file_hashes\",\"type\":\"Vector\"}],\"type\":\"upload.File\"},{\"id\":-290921362,\"predicate\":\"upload.cdnFileReuploadNeeded\",\"params\":[{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1449145777,\"predicate\":\"upload.cdnFile\",\"params\":[{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-914167110,\"predicate\":\"cdnPublicKey\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"CdnPublicKey\"},{\"id\":1462101002,\"predicate\":\"cdnConfig\",\"params\":[{\"name\":\"public_keys\",\"type\":\"Vector\"}],\"type\":\"CdnConfig\"},{\"id\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":-892239370,\"predicate\":\"langPackString\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":1816636575,\"predicate\":\"langPackStringPluralized\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"zero_value\",\"type\":\"flags.0?string\"},{\"name\":\"one_value\",\"type\":\"flags.1?string\"},{\"name\":\"two_value\",\"type\":\"flags.2?string\"},{\"name\":\"few_value\",\"type\":\"flags.3?string\"},{\"name\":\"many_value\",\"type\":\"flags.4?string\"},{\"name\":\"other_value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":695856818,\"predicate\":\"langPackStringDeleted\",\"params\":[{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":-209337866,\"predicate\":\"langPackDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"strings\",\"type\":\"Vector\"}],\"type\":\"LangPackDifference\"},{\"id\":-288727837,\"predicate\":\"langPackLanguage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"official\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.2?true\"},{\"name\":\"beta\",\"type\":\"flags.3?true\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"native_name\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"base_lang_code\",\"type\":\"flags.1?string\"},{\"name\":\"plural_code\",\"type\":\"string\"},{\"name\":\"strings_count\",\"type\":\"int\"},{\"name\":\"translated_count\",\"type\":\"int\"},{\"name\":\"translations_url\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":885242707,\"predicate\":\"channelParticipantAdmin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_edit\",\"type\":\"flags.0?true\"},{\"name\":\"self\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"flags.1?long\"},{\"name\":\"promoted_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.2?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":1844969806,\"predicate\":\"channelParticipantBanned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"left\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"kicked_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-421545947,\"predicate\":\"channelAdminLogEventActionChangeTitle\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1427671598,\"predicate\":\"channelAdminLogEventActionChangeAbout\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1783299128,\"predicate\":\"channelAdminLogEventActionChangeUsername\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1129042607,\"predicate\":\"channelAdminLogEventActionChangePhoto\",\"params\":[{\"name\":\"prev_photo\",\"type\":\"Photo\"},{\"name\":\"new_photo\",\"type\":\"Photo\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":460916654,\"predicate\":\"channelAdminLogEventActionToggleInvites\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":648939889,\"predicate\":\"channelAdminLogEventActionToggleSignatures\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-370660328,\"predicate\":\"channelAdminLogEventActionUpdatePinned\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1889215493,\"predicate\":\"channelAdminLogEventActionEditMessage\",\"params\":[{\"name\":\"prev_message\",\"type\":\"Message\"},{\"name\":\"new_message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1121994683,\"predicate\":\"channelAdminLogEventActionDeleteMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":405815507,\"predicate\":\"channelAdminLogEventActionParticipantJoin\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-124291086,\"predicate\":\"channelAdminLogEventActionParticipantLeave\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-484690728,\"predicate\":\"channelAdminLogEventActionParticipantInvite\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-422036098,\"predicate\":\"channelAdminLogEventActionParticipantToggleBan\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-714643696,\"predicate\":\"channelAdminLogEventActionParticipantToggleAdmin\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":531458253,\"predicate\":\"channelAdminLogEvent\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"ChannelAdminLogEventAction\"}],\"type\":\"ChannelAdminLogEvent\"},{\"id\":-309659827,\"predicate\":\"channels.adminLogResults\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-368018716,\"predicate\":\"channelAdminLogEventsFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join\",\"type\":\"flags.0?true\"},{\"name\":\"leave\",\"type\":\"flags.1?true\"},{\"name\":\"invite\",\"type\":\"flags.2?true\"},{\"name\":\"ban\",\"type\":\"flags.3?true\"},{\"name\":\"unban\",\"type\":\"flags.4?true\"},{\"name\":\"kick\",\"type\":\"flags.5?true\"},{\"name\":\"unkick\",\"type\":\"flags.6?true\"},{\"name\":\"promote\",\"type\":\"flags.7?true\"},{\"name\":\"demote\",\"type\":\"flags.8?true\"},{\"name\":\"info\",\"type\":\"flags.9?true\"},{\"name\":\"settings\",\"type\":\"flags.10?true\"},{\"name\":\"pinned\",\"type\":\"flags.11?true\"},{\"name\":\"edit\",\"type\":\"flags.12?true\"},{\"name\":\"delete\",\"type\":\"flags.13?true\"},{\"name\":\"group_call\",\"type\":\"flags.14?true\"},{\"name\":\"invites\",\"type\":\"flags.15?true\"},{\"name\":\"send\",\"type\":\"flags.16?true\"},{\"name\":\"forums\",\"type\":\"flags.17?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1634752813,\"predicate\":\"messages.favedStickersNotModified\",\"params\":[],\"type\":\"messages.FavedStickers\"},{\"id\":750063767,\"predicate\":\"messages.favedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-366410403,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1759532989,\"predicate\":\"inputMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"stopped\",\"type\":\"flags.0?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.2?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"}],\"type\":\"InputMedia\"},{\"id\":-1186937242,\"predicate\":\"messageMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.1?int\"}],\"type\":\"MessageMedia\"},{\"id\":1189204285,\"predicate\":\"recentMeUrlUnknown\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1188296222,\"predicate\":\"recentMeUrlUser\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1294306862,\"predicate\":\"recentMeUrlChat\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-347535331,\"predicate\":\"recentMeUrlChatInvite\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_invite\",\"type\":\"ChatInvite\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1140172836,\"predicate\":\"recentMeUrlStickerSet\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"set\",\"type\":\"StickerSetCovered\"}],\"type\":\"RecentMeUrl\"},{\"id\":235081943,\"predicate\":\"help.recentMeUrls\",\"params\":[{\"name\":\"urls\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":482797855,\"predicate\":\"inputSingleMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.0?Vector\"}],\"type\":\"InputSingleMedia\"},{\"id\":-1493633966,\"predicate\":\"webAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"domain\",\"type\":\"string\"},{\"name\":\"browser\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"WebAuthorization\"},{\"id\":-313079300,\"predicate\":\"account.webAuthorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.WebAuthorizations\"},{\"id\":-1502174430,\"predicate\":\"inputMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-1160215659,\"predicate\":\"inputMessageReplyTo\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-2037963464,\"predicate\":\"inputMessagePinned\",\"params\":[],\"type\":\"InputMessage\"},{\"id\":-1687559349,\"predicate\":\"messageEntityPhone\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1280209983,\"predicate\":\"messageEntityCashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":223655517,\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1963942446,\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":-207944868,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":-104284986,\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":1968737087,\"predicate\":\"inputClientProxy\",\"params\":[{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"}],\"type\":\"InputClientProxy\"},{\"id\":-483352705,\"predicate\":\"help.termsOfServiceUpdateEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":686618977,\"predicate\":\"help.termsOfServiceUpdate\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"terms_of_service\",\"type\":\"help.TermsOfService\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":859091184,\"predicate\":\"inputSecureFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"InputSecureFile\"},{\"id\":1399317950,\"predicate\":\"inputSecureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputSecureFile\"},{\"id\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":2097791614,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":-1964327229,\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":2103482845,\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":569137759,\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":-1658158621,\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":1034709504,\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":115615172,\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1596951477,\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1717268701,\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-874308058,\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-63531698,\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1995211763,\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1954007928,\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1713143702,\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-368907213,\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1289704741,\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1908627474,\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":411017418,\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":-618540889,\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":-316748368,\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":-391902247,\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":12467706,\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2037765467,\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-449327402,\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":2054162547,\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":1717706985,\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":871426631,\"predicate\":\"secureCredentialsEncrypted\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureCredentialsEncrypted\"},{\"id\":-1389486888,\"predicate\":\"account.authorizationForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"required_types\",\"type\":\"Vector\"},{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"errors\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"privacy_policy_url\",\"type\":\"flags.0?string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-2128640689,\"predicate\":\"account.sentEmailCode\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"account.SentEmailCode\"},{\"id\":455635795,\"predicate\":\"messageActionSecureValuesSentMe\",\"params\":[{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"MessageAction\"},{\"id\":-648257196,\"predicate\":\"messageActionSecureValuesSent\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":1722786150,\"predicate\":\"help.deepLinkInfoEmpty\",\"params\":[],\"type\":\"help.DeepLinkInfo\"},{\"id\":1783556146,\"predicate\":\"help.deepLinkInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"update_app\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":289586518,\"predicate\":\"savedPhoneContact\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"SavedContact\"},{\"id\":1304052993,\"predicate\":\"account.takeout\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"account.Takeout\"},{\"id\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1625153079,\"predicate\":\"inputWebFileGeoPointLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"}],\"type\":\"InputWebFileLocation\"},{\"id\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":4883767,\"predicate\":\"securePasswordKdfAlgoUnknown\",\"params\":[],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-1141711456,\"predicate\":\"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-2042159726,\"predicate\":\"securePasswordKdfAlgoSHA512\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":354925740,\"predicate\":\"secureSecretSettings\",\"params\":[{\"name\":\"secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_secret\",\"type\":\"bytes\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureSecretSettings\"},{\"id\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"id\":-1736378792,\"predicate\":\"inputCheckPasswordEmpty\",\"params\":[],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-763367294,\"predicate\":\"inputCheckPasswordSRP\",\"params\":[{\"name\":\"srp_id\",\"type\":\"long\"},{\"name\":\"A\",\"type\":\"bytes\"},{\"name\":\"M1\",\"type\":\"bytes\"}],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-2036501105,\"predicate\":\"secureValueError\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-1592506512,\"predicate\":\"secureValueErrorTranslationFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":878931416,\"predicate\":\"secureValueErrorTranslationFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2103600678,\"predicate\":\"secureRequiredType\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"native_names\",\"type\":\"flags.0?true\"},{\"name\":\"selfie_required\",\"type\":\"flags.1?true\"},{\"name\":\"translation_required\",\"type\":\"flags.2?true\"},{\"name\":\"type\",\"type\":\"SecureValueType\"}],\"type\":\"SecureRequiredType\"},{\"id\":41187252,\"predicate\":\"secureRequiredTypeOneOf\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"SecureRequiredType\"},{\"id\":-1078332329,\"predicate\":\"help.passportConfigNotModified\",\"params\":[],\"type\":\"help.PassportConfig\"},{\"id\":-1600596305,\"predicate\":\"help.passportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"countries_langs\",\"type\":\"DataJSON\"}],\"type\":\"help.PassportConfig\"},{\"id\":488313413,\"predicate\":\"inputAppEvent\",\"params\":[{\"name\":\"time\",\"type\":\"double\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"peer\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"JSONValue\"}],\"type\":\"InputAppEvent\"},{\"id\":-1059185703,\"predicate\":\"jsonObjectValue\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"JSONValue\"}],\"type\":\"JSONObjectValue\"},{\"id\":1064139624,\"predicate\":\"jsonNull\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":-952869270,\"predicate\":\"jsonBool\",\"params\":[{\"name\":\"value\",\"type\":\"Bool\"}],\"type\":\"JSONValue\"},{\"id\":736157604,\"predicate\":\"jsonNumber\",\"params\":[{\"name\":\"value\",\"type\":\"double\"}],\"type\":\"JSONValue\"},{\"id\":-1222740358,\"predicate\":\"jsonString\",\"params\":[{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"JSONValue\"},{\"id\":-146520221,\"predicate\":\"jsonArray\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1715350371,\"predicate\":\"jsonObject\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-311786236,\"predicate\":\"textSubscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-939827711,\"predicate\":\"textSuperscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":55281185,\"predicate\":\"textMarked\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":483104362,\"predicate\":\"textPhone\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":136105807,\"predicate\":\"textImage\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"RichText\"},{\"id\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":878078826,\"predicate\":\"pageTableCell\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"header\",\"type\":\"flags.0?true\"},{\"name\":\"align_center\",\"type\":\"flags.3?true\"},{\"name\":\"align_right\",\"type\":\"flags.4?true\"},{\"name\":\"valign_middle\",\"type\":\"flags.5?true\"},{\"name\":\"valign_bottom\",\"type\":\"flags.6?true\"},{\"name\":\"text\",\"type\":\"flags.7?RichText\"},{\"name\":\"colspan\",\"type\":\"flags.1?int\"},{\"name\":\"rowspan\",\"type\":\"flags.2?int\"}],\"type\":\"PageTableCell\"},{\"id\":-524237339,\"predicate\":\"pageTableRow\",\"params\":[{\"name\":\"cells\",\"type\":\"Vector\"}],\"type\":\"PageTableRow\"},{\"id\":-1085412734,\"predicate\":\"pageBlockTable\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bordered\",\"type\":\"flags.0?true\"},{\"name\":\"striped\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1869903447,\"predicate\":\"pageCaption\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"credit\",\"type\":\"RichText\"}],\"type\":\"PageCaption\"},{\"id\":-1188055347,\"predicate\":\"pageListItemText\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListItem\"},{\"id\":635466748,\"predicate\":\"pageListItemBlocks\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListItem\"},{\"id\":1577484359,\"predicate\":\"pageListOrderedItemText\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1730311882,\"predicate\":\"pageListOrderedItemBlocks\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1702174239,\"predicate\":\"pageBlockOrderedList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1987480557,\"predicate\":\"pageBlockDetails\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"open\",\"type\":\"flags.0?true\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1282352120,\"predicate\":\"pageRelatedArticle\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"photo_id\",\"type\":\"flags.2?long\"},{\"name\":\"author\",\"type\":\"flags.3?string\"},{\"name\":\"published_date\",\"type\":\"flags.4?int\"}],\"type\":\"PageRelatedArticle\"},{\"id\":370236054,\"predicate\":\"pageBlockRelatedArticles\",\"params\":[{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"articles\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":-1538310410,\"predicate\":\"pageBlockMap\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-1738178803,\"predicate\":\"page\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"part\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.1?true\"},{\"name\":\"v2\",\"type\":\"flags.2?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"},{\"name\":\"views\",\"type\":\"flags.3?int\"}],\"type\":\"Page\"},{\"id\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":-1945767479,\"predicate\":\"help.supportName\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"help.SupportName\"},{\"id\":-206688531,\"predicate\":\"help.userInfoEmpty\",\"params\":[],\"type\":\"help.UserInfo\"},{\"id\":32192344,\"predicate\":\"help.userInfo\",\"params\":[{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"help.UserInfo\"},{\"id\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1398708869,\"predicate\":\"updateMessagePoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"poll\",\"type\":\"flags.0?Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"Update\"},{\"id\":1823064809,\"predicate\":\"pollAnswer\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"option\",\"type\":\"bytes\"}],\"type\":\"PollAnswer\"},{\"id\":-2032041631,\"predicate\":\"poll\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"closed\",\"type\":\"flags.0?true\"},{\"name\":\"public_voters\",\"type\":\"flags.1?true\"},{\"name\":\"multiple_choice\",\"type\":\"flags.2?true\"},{\"name\":\"quiz\",\"type\":\"flags.3?true\"},{\"name\":\"question\",\"type\":\"string\"},{\"name\":\"answers\",\"type\":\"Vector\"},{\"name\":\"close_period\",\"type\":\"flags.4?int\"},{\"name\":\"close_date\",\"type\":\"flags.5?int\"}],\"type\":\"Poll\"},{\"id\":997055186,\"predicate\":\"pollAnswerVoters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"correct\",\"type\":\"flags.1?true\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"voters\",\"type\":\"int\"}],\"type\":\"PollAnswerVoters\"},{\"id\":-591909213,\"predicate\":\"pollResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"results\",\"type\":\"flags.1?Vector\"},{\"name\":\"total_voters\",\"type\":\"flags.2?int\"},{\"name\":\"recent_voters\",\"type\":\"flags.3?Vector\"},{\"name\":\"solution\",\"type\":\"flags.4?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.4?Vector\"}],\"type\":\"PollResults\"},{\"id\":261416433,\"predicate\":\"inputMediaPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"correct_answers\",\"type\":\"flags.0?Vector\"},{\"name\":\"solution\",\"type\":\"flags.1?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"InputMedia\"},{\"id\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":1605510357,\"predicate\":\"chatAdminRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"change_info\",\"type\":\"flags.0?true\"},{\"name\":\"post_messages\",\"type\":\"flags.1?true\"},{\"name\":\"edit_messages\",\"type\":\"flags.2?true\"},{\"name\":\"delete_messages\",\"type\":\"flags.3?true\"},{\"name\":\"ban_users\",\"type\":\"flags.4?true\"},{\"name\":\"invite_users\",\"type\":\"flags.5?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.7?true\"},{\"name\":\"add_admins\",\"type\":\"flags.9?true\"},{\"name\":\"anonymous\",\"type\":\"flags.10?true\"},{\"name\":\"manage_call\",\"type\":\"flags.11?true\"},{\"name\":\"other\",\"type\":\"flags.12?true\"},{\"name\":\"manage_topics\",\"type\":\"flags.13?true\"}],\"type\":\"ChatAdminRights\"},{\"id\":-1626209256,\"predicate\":\"chatBannedRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"view_messages\",\"type\":\"flags.0?true\"},{\"name\":\"send_messages\",\"type\":\"flags.1?true\"},{\"name\":\"send_media\",\"type\":\"flags.2?true\"},{\"name\":\"send_stickers\",\"type\":\"flags.3?true\"},{\"name\":\"send_gifs\",\"type\":\"flags.4?true\"},{\"name\":\"send_games\",\"type\":\"flags.5?true\"},{\"name\":\"send_inline\",\"type\":\"flags.6?true\"},{\"name\":\"embed_links\",\"type\":\"flags.7?true\"},{\"name\":\"send_polls\",\"type\":\"flags.8?true\"},{\"name\":\"change_info\",\"type\":\"flags.10?true\"},{\"name\":\"invite_users\",\"type\":\"flags.15?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.17?true\"},{\"name\":\"manage_topics\",\"type\":\"flags.18?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-433014407,\"predicate\":\"inputWallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":1913199744,\"predicate\":\"inputWallPaperSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputWallPaper\"},{\"id\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":771095562,\"predicate\":\"channelAdminLogEventActionDefaultBannedRights\",\"params\":[{\"name\":\"prev_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"new_banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1895328189,\"predicate\":\"channelAdminLogEventActionStopPoll\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":471437699,\"predicate\":\"account.wallPapersNotModified\",\"params\":[],\"type\":\"account.WallPapers\"},{\"id\":-842824308,\"predicate\":\"account.wallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"account.WallPapers\"},{\"id\":-1973130814,\"predicate\":\"codeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"current_number\",\"type\":\"flags.1?true\"},{\"name\":\"allow_app_hash\",\"type\":\"flags.4?true\"},{\"name\":\"allow_missed_call\",\"type\":\"flags.5?true\"},{\"name\":\"logout_tokens\",\"type\":\"flags.6?Vector\"}],\"type\":\"CodeSettings\"},{\"id\":499236004,\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"second_background_color\",\"type\":\"flags.4?int\"},{\"name\":\"third_background_color\",\"type\":\"flags.5?int\"},{\"name\":\"fourth_background_color\",\"type\":\"flags.6?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"},{\"name\":\"rotation\",\"type\":\"flags.4?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":-1896171181,\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"long\"},{\"name\":\"file_size_max\",\"type\":\"long\"},{\"name\":\"video_upload_maxbitrate\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":1674235686,\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":-709641735,\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":594408994,\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":1556570557,\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":-1519029347,\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":-1275374751,\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1075322878,\"predicate\":\"inputPhotoFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-667654413,\"predicate\":\"inputPhotoLegacyFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":925204121,\"predicate\":\"inputPeerPhotoFileLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1652231205,\"predicate\":\"inputStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb_version\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":-11252123,\"predicate\":\"folder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autofill_new_broadcasts\",\"type\":\"flags.0?true\"},{\"name\":\"autofill_public_groups\",\"type\":\"flags.1?true\"},{\"name\":\"autofill_new_correspondents\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.3?ChatPhoto\"}],\"type\":\"Folder\"},{\"id\":1908216652,\"predicate\":\"dialogFolder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"folder\",\"type\":\"Folder\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"unread_muted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_muted_messages_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_messages_count\",\"type\":\"int\"}],\"type\":\"Dialog\"},{\"id\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":-70073706,\"predicate\":\"inputFolderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputFolderPeer\"},{\"id\":-373643672,\"predicate\":\"folderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"FolderPeer\"},{\"id\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1468331492,\"predicate\":\"inputPeerUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1121318848,\"predicate\":\"inputPeerChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-398136321,\"predicate\":\"messages.searchCounter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.SearchCounter\"},{\"id\":280464681,\"predicate\":\"keyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"KeyboardButton\"},{\"id\":-802258988,\"predicate\":\"inputKeyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.1?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":-1831650802,\"predicate\":\"urlAuthResultRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"User\"},{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1886646706,\"predicate\":\"urlAuthResultAccepted\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1445536993,\"predicate\":\"urlAuthResultDefault\",\"params\":[],\"type\":\"UrlAuthResult\"},{\"id\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-1672577397,\"predicate\":\"messageEntityUnderline\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1090087980,\"predicate\":\"messageEntityStrike\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":34469328,\"predicate\":\"messageEntityBlockquote\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":-1078612597,\"predicate\":\"channelLocationEmpty\",\"params\":[],\"type\":\"ChannelLocation\"},{\"id\":547062491,\"predicate\":\"channelLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"GeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"ChannelLocation\"},{\"id\":-901375139,\"predicate\":\"peerLocated\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":967122427,\"predicate\":\"updateNewScheduledMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"Update\"},{\"id\":-1870238482,\"predicate\":\"updateDeleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-797791052,\"predicate\":\"restrictionReason\",\"params\":[{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RestrictionReason\"},{\"id\":1012306921,\"predicate\":\"inputTheme\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputTheme\"},{\"id\":-175567375,\"predicate\":\"inputThemeSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputTheme\"},{\"id\":-1609668650,\"predicate\":\"theme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"for_chat\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?Document\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"},{\"name\":\"emoticon\",\"type\":\"flags.6?string\"},{\"name\":\"installs_count\",\"type\":\"flags.4?int\"}],\"type\":\"Theme\"},{\"id\":-199313886,\"predicate\":\"account.themesNotModified\",\"params\":[],\"type\":\"account.Themes\"},{\"id\":-1707242387,\"predicate\":\"account.themes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"themes\",\"type\":\"Vector\"}],\"type\":\"account.Themes\"},{\"id\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"id\":1654593920,\"predicate\":\"auth.loginToken\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":110008598,\"predicate\":\"auth.loginTokenMigrateTo\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":957176926,\"predicate\":\"auth.loginTokenSuccess\",\"params\":[{\"name\":\"authorization\",\"type\":\"auth.Authorization\"}],\"type\":\"auth.LoginToken\"},{\"id\":1474462241,\"predicate\":\"account.contentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"},{\"name\":\"sensitive_can_change\",\"type\":\"flags.1?true\"}],\"type\":\"account.ContentSettings\"},{\"id\":-1456996667,\"predicate\":\"messages.inactiveChats\",\"params\":[{\"name\":\"dates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.InactiveChats\"},{\"id\":-1012849566,\"predicate\":\"baseThemeClassic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-69724536,\"predicate\":\"baseThemeDay\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1212997976,\"predicate\":\"baseThemeNight\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1834973166,\"predicate\":\"baseThemeTinted\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1527845466,\"predicate\":\"baseThemeArctic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":-528465642,\"predicate\":\"wallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":-1881255857,\"predicate\":\"inputThemeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?InputWallPaper\"},{\"name\":\"wallpaper_settings\",\"type\":\"flags.1?WallPaperSettings\"}],\"type\":\"InputThemeSettings\"},{\"id\":-94849324,\"predicate\":\"themeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?WallPaper\"}],\"type\":\"ThemeSettings\"},{\"id\":1421174295,\"predicate\":\"webPageAttributeTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"documents\",\"type\":\"flags.0?Vector\"},{\"name\":\"settings\",\"type\":\"flags.1?ThemeSettings\"}],\"type\":\"WebPageAttribute\"},{\"id\":274961865,\"predicate\":\"updateMessagePollVote\",\"params\":[{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":886196148,\"predicate\":\"messageUserVote\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":1017491692,\"predicate\":\"messageUserVoteInputOption\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":-1973033641,\"predicate\":\"messageUserVoteMultiple\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":136574537,\"predicate\":\"messages.votesList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"votes\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.VotesList\"},{\"id\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-177732982,\"predicate\":\"bankCardOpenUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"BankCardOpenUrl\"},{\"id\":1042605427,\"predicate\":\"payments.bankCardData\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"open_urls\",\"type\":\"Vector\"}],\"type\":\"payments.BankCardData\"},{\"id\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":1949890536,\"predicate\":\"dialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"non_contacts\",\"type\":\"flags.1?true\"},{\"name\":\"groups\",\"type\":\"flags.2?true\"},{\"name\":\"broadcasts\",\"type\":\"flags.3?true\"},{\"name\":\"bots\",\"type\":\"flags.4?true\"},{\"name\":\"exclude_muted\",\"type\":\"flags.11?true\"},{\"name\":\"exclude_read\",\"type\":\"flags.12?true\"},{\"name\":\"exclude_archived\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"emoticon\",\"type\":\"flags.25?string\"},{\"name\":\"pinned_peers\",\"type\":\"Vector\"},{\"name\":\"include_peers\",\"type\":\"Vector\"},{\"name\":\"exclude_peers\",\"type\":\"Vector\"}],\"type\":\"DialogFilter\"},{\"id\":2004110666,\"predicate\":\"dialogFilterSuggested\",\"params\":[{\"name\":\"filter\",\"type\":\"DialogFilter\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"DialogFilterSuggested\"},{\"id\":654302845,\"predicate\":\"updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Update\"},{\"id\":-1512627963,\"predicate\":\"updateDialogFilterOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":889491791,\"predicate\":\"updateDialogFilters\",\"params\":[],\"type\":\"Update\"},{\"id\":-1237848657,\"predicate\":\"statsDateRangeDays\",\"params\":[{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"StatsDateRangeDays\"},{\"id\":-884757282,\"predicate\":\"statsAbsValueAndPrev\",\"params\":[{\"name\":\"current\",\"type\":\"double\"},{\"name\":\"previous\",\"type\":\"double\"}],\"type\":\"StatsAbsValueAndPrev\"},{\"id\":-875679776,\"predicate\":\"statsPercentValue\",\"params\":[{\"name\":\"part\",\"type\":\"double\"},{\"name\":\"total\",\"type\":\"double\"}],\"type\":\"StatsPercentValue\"},{\"id\":1244130093,\"predicate\":\"statsGraphAsync\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1092839390,\"predicate\":\"statsGraphError\",\"params\":[{\"name\":\"error\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1901828938,\"predicate\":\"statsGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"json\",\"type\":\"DataJSON\"},{\"name\":\"zoom_token\",\"type\":\"flags.0?string\"}],\"type\":\"StatsGraph\"},{\"id\":-1387279939,\"predicate\":\"messageInteractionCounters\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"MessageInteractionCounters\"},{\"id\":-1107852396,\"predicate\":\"stats.broadcastStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"followers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"views_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"shares_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"enabled_notifications\",\"type\":\"StatsPercentValue\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"followers_graph\",\"type\":\"StatsGraph\"},{\"name\":\"mute_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"iv_interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"views_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_followers_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"recent_message_interactions\",\"type\":\"Vector\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":-1728664459,\"predicate\":\"help.promoDataEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.PromoData\"},{\"id\":-1942390465,\"predicate\":\"help.promoData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"proxy\",\"type\":\"flags.0?true\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"psa_type\",\"type\":\"flags.1?string\"},{\"name\":\"psa_message\",\"type\":\"flags.2?string\"}],\"type\":\"help.PromoData\"},{\"id\":-567037804,\"predicate\":\"videoSize\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"video_start_ts\",\"type\":\"flags.0?double\"}],\"type\":\"VideoSize\"},{\"id\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"id\":-1660637285,\"predicate\":\"statsGroupTopPoster\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"int\"},{\"name\":\"avg_chars\",\"type\":\"int\"}],\"type\":\"StatsGroupTopPoster\"},{\"id\":-682079097,\"predicate\":\"statsGroupTopAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"deleted\",\"type\":\"int\"},{\"name\":\"kicked\",\"type\":\"int\"},{\"name\":\"banned\",\"type\":\"int\"}],\"type\":\"StatsGroupTopAdmin\"},{\"id\":1398765469,\"predicate\":\"statsGroupTopInviter\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"invitations\",\"type\":\"int\"}],\"type\":\"StatsGroupTopInviter\"},{\"id\":-276825834,\"predicate\":\"stats.megagroupStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"members\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"messages\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"viewers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"posters\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"members_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_members_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"messages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"actions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"weekdays_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_posters\",\"type\":\"Vector\"},{\"name\":\"top_admins\",\"type\":\"Vector\"},{\"name\":\"top_inviters\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-1096616924,\"predicate\":\"globalPrivacySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archive_and_mute_new_noncontact_peers\",\"type\":\"flags.0?Bool\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":1667228533,\"predicate\":\"phoneConnectionWebrtc\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"turn\",\"type\":\"flags.0?true\"},{\"name\":\"stun\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"string\"}],\"type\":\"PhoneConnection\"},{\"id\":1107543535,\"predicate\":\"help.countryCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"country_code\",\"type\":\"string\"},{\"name\":\"prefixes\",\"type\":\"flags.0?Vector\"},{\"name\":\"patterns\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.CountryCode\"},{\"id\":-1014526429,\"predicate\":\"help.country\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hidden\",\"type\":\"flags.0?true\"},{\"name\":\"iso2\",\"type\":\"string\"},{\"name\":\"default_name\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"flags.1?string\"},{\"name\":\"country_codes\",\"type\":\"Vector\"}],\"type\":\"help.Country\"},{\"id\":-1815339214,\"predicate\":\"help.countriesListNotModified\",\"params\":[],\"type\":\"help.CountriesList\"},{\"id\":-2016381538,\"predicate\":\"help.countriesList\",\"params\":[{\"name\":\"countries\",\"type\":\"Vector\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":1163625789,\"predicate\":\"messageViews\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"views\",\"type\":\"flags.0?int\"},{\"name\":\"forwards\",\"type\":\"flags.1?int\"},{\"name\":\"replies\",\"type\":\"flags.2?MessageReplies\"}],\"type\":\"MessageViews\"},{\"id\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"}],\"type\":\"PhotoSize\"},{\"id\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.MessageViews\"},{\"id\":-693004986,\"predicate\":\"updateReadChannelDiscussionInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"},{\"name\":\"broadcast_id\",\"type\":\"flags.0?long\"},{\"name\":\"broadcast_post\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1767677564,\"predicate\":\"updateReadChannelDiscussionOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1506535550,\"predicate\":\"messages.discussionMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"max_id\",\"type\":\"flags.0?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"flags.1?int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"flags.2?int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-1495959709,\"predicate\":\"messageReplyHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_to_scheduled\",\"type\":\"flags.2?true\"},{\"name\":\"forum_topic\",\"type\":\"flags.3?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"reply_to_peer_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"reply_to_top_id\",\"type\":\"flags.1?int\"}],\"type\":\"MessageReplyHeader\"},{\"id\":-2083123262,\"predicate\":\"messageReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"comments\",\"type\":\"flags.0?true\"},{\"name\":\"replies\",\"type\":\"int\"},{\"name\":\"replies_pts\",\"type\":\"int\"},{\"name\":\"recent_repliers\",\"type\":\"flags.1?Vector\"},{\"name\":\"channel_id\",\"type\":\"flags.0?long\"},{\"name\":\"max_id\",\"type\":\"flags.2?int\"},{\"name\":\"read_max_id\",\"type\":\"flags.3?int\"}],\"type\":\"MessageReplies\"},{\"id\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"id\":-1937192669,\"predicate\":\"updateChannelUserTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"ChannelParticipant\"},{\"id\":-531931925,\"predicate\":\"channelParticipantsMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-309990731,\"predicate\":\"updatePinnedMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1538885128,\"predicate\":\"updatePinnedChannelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":2004925620,\"predicate\":\"groupCallDiscarded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"duration\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-711498484,\"predicate\":\"groupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join_muted\",\"type\":\"flags.1?true\"},{\"name\":\"can_change_join_muted\",\"type\":\"flags.2?true\"},{\"name\":\"join_date_asc\",\"type\":\"flags.6?true\"},{\"name\":\"schedule_start_subscribed\",\"type\":\"flags.8?true\"},{\"name\":\"can_start_video\",\"type\":\"flags.9?true\"},{\"name\":\"record_video_active\",\"type\":\"flags.11?true\"},{\"name\":\"rtmp_stream\",\"type\":\"flags.12?true\"},{\"name\":\"listeners_hidden\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.3?string\"},{\"name\":\"stream_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"record_start_date\",\"type\":\"flags.5?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.7?int\"},{\"name\":\"unmuted_video_count\",\"type\":\"flags.10?int\"},{\"name\":\"unmuted_video_limit\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-659913713,\"predicate\":\"inputGroupCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGroupCall\"},{\"id\":2047704898,\"predicate\":\"messageActionGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"duration\",\"type\":\"flags.0?int\"}],\"type\":\"MessageAction\"},{\"id\":1345295095,\"predicate\":\"messageActionInviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-341428482,\"predicate\":\"groupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.1?true\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.2?true\"},{\"name\":\"just_joined\",\"type\":\"flags.4?true\"},{\"name\":\"versioned\",\"type\":\"flags.5?true\"},{\"name\":\"min\",\"type\":\"flags.8?true\"},{\"name\":\"muted_by_you\",\"type\":\"flags.9?true\"},{\"name\":\"volume_by_admin\",\"type\":\"flags.10?true\"},{\"name\":\"self\",\"type\":\"flags.12?true\"},{\"name\":\"video_joined\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"active_date\",\"type\":\"flags.3?int\"},{\"name\":\"source\",\"type\":\"int\"},{\"name\":\"volume\",\"type\":\"flags.7?int\"},{\"name\":\"about\",\"type\":\"flags.11?string\"},{\"name\":\"raise_hand_rating\",\"type\":\"flags.13?long\"},{\"name\":\"video\",\"type\":\"flags.6?GroupCallParticipantVideo\"},{\"name\":\"presentation\",\"type\":\"flags.14?GroupCallParticipantVideo\"}],\"type\":\"GroupCallParticipant\"},{\"id\":-124097970,\"predicate\":\"updateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-219423922,\"predicate\":\"updateGroupCallParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":347227392,\"predicate\":\"updateGroupCall\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"call\",\"type\":\"GroupCall\"}],\"type\":\"Update\"},{\"id\":-1636664659,\"predicate\":\"phone.groupCall\",\"params\":[{\"name\":\"call\",\"type\":\"GroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"participants_next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCall\"},{\"id\":-193506890,\"predicate\":\"phone.groupParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":813821341,\"predicate\":\"inlineQueryPeerTypeSameBotPM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-2093215828,\"predicate\":\"inlineQueryPeerTypePM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-681130742,\"predicate\":\"inlineQueryPeerTypeChat\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1589952067,\"predicate\":\"inlineQueryPeerTypeMegagroup\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1664413338,\"predicate\":\"inlineQueryPeerTypeBroadcast\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":589338437,\"predicate\":\"channelAdminLogEventActionStartGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-610299584,\"predicate\":\"channelAdminLogEventActionDiscardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-115071790,\"predicate\":\"channelAdminLogEventActionParticipantMute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-431740480,\"predicate\":\"channelAdminLogEventActionParticipantUnmute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1456906823,\"predicate\":\"channelAdminLogEventActionToggleGroupCallSetting\",\"params\":[{\"name\":\"join_muted\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":1578088377,\"predicate\":\"messages.historyImportParsed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pm\",\"type\":\"flags.0?true\"},{\"name\":\"group\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"flags.2?string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-275956116,\"predicate\":\"messages.affectedFoundMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1007897979,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"auto_setting_from\",\"type\":\"flags.0?long\"}],\"type\":\"MessageAction\"},{\"id\":-1147422299,\"predicate\":\"updatePeerHistoryTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":-796432838,\"predicate\":\"updateChatParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChatParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChatParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1738720581,\"predicate\":\"updateChannelParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChannelParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-997782967,\"predicate\":\"updateBotStopped\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"stopped\",\"type\":\"Bool\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1940201511,\"predicate\":\"chatInviteImporter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"flags.2?string\"},{\"name\":\"approved_by\",\"type\":\"flags.1?long\"}],\"type\":\"ChatInviteImporter\"},{\"id\":-1111085620,\"predicate\":\"messages.exportedChatInvites\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"invites\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":410107472,\"predicate\":\"messages.exportedChatInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":572915951,\"predicate\":\"messages.exportedChatInviteReplaced\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-2118733814,\"predicate\":\"messages.chatInviteImporters\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"importers\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-219353309,\"predicate\":\"chatAdminWithInvites\",\"params\":[{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"invites_count\",\"type\":\"int\"},{\"name\":\"revoked_invites_count\",\"type\":\"int\"}],\"type\":\"ChatAdminWithInvites\"},{\"id\":-1231326505,\"predicate\":\"messages.chatAdminsWithInvites\",\"params\":[{\"name\":\"admins\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":1557846647,\"predicate\":\"channelAdminLogEventActionParticipantJoinByInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1515256996,\"predicate\":\"channelAdminLogEventActionExportedInviteDelete\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1091179342,\"predicate\":\"channelAdminLogEventActionExportedInviteRevoke\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-384910503,\"predicate\":\"channelAdminLogEventActionExportedInviteEdit\",\"params\":[{\"name\":\"prev_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1048537159,\"predicate\":\"channelAdminLogEventActionParticipantVolume\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1855199800,\"predicate\":\"channelAdminLogEventActionChangeHistoryTTL\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":93890858,\"predicate\":\"inputGroupCallStream\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"time_ms\",\"type\":\"long\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"video_channel\",\"type\":\"flags.0?int\"},{\"name\":\"video_quality\",\"type\":\"flags.0?int\"}],\"type\":\"InputFileLocation\"},{\"id\":-1343921601,\"predicate\":\"phone.joinAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":541839704,\"predicate\":\"phone.exportedGroupCallInvite\",\"params\":[{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":-672693723,\"predicate\":\"inputBotInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":894081801,\"predicate\":\"botInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-592373577,\"predicate\":\"groupCallParticipantVideoSourceGroup\",\"params\":[{\"name\":\"semantics\",\"type\":\"string\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"GroupCallParticipantVideoSourceGroup\"},{\"id\":1735736008,\"predicate\":\"groupCallParticipantVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"paused\",\"type\":\"flags.0?true\"},{\"name\":\"endpoint\",\"type\":\"string\"},{\"name\":\"source_groups\",\"type\":\"Vector\"},{\"name\":\"audio_source\",\"type\":\"flags.1?int\"}],\"type\":\"GroupCallParticipantVideo\"},{\"id\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-2046910401,\"predicate\":\"stickers.suggestedShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":795652779,\"predicate\":\"botCommandScopeDefault\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1011811544,\"predicate\":\"botCommandScopeUsers\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1877059713,\"predicate\":\"botCommandScopeChats\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-1180016534,\"predicate\":\"botCommandScopeChatAdmins\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-610432643,\"predicate\":\"botCommandScopePeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":1071145937,\"predicate\":\"botCommandScopePeerAdmins\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":169026035,\"predicate\":\"botCommandScopePeerUser\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotCommandScope\"},{\"id\":-478701471,\"predicate\":\"account.resetPasswordFailedWait\",\"params\":[{\"name\":\"retry_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-370148227,\"predicate\":\"account.resetPasswordRequestedWait\",\"params\":[{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-383330754,\"predicate\":\"account.resetPasswordOk\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":981691896,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recommended\",\"type\":\"flags.5?true\"},{\"name\":\"show_peer_photo\",\"type\":\"flags.6?true\"},{\"name\":\"random_id\",\"type\":\"bytes\"},{\"name\":\"from_id\",\"type\":\"flags.3?Peer\"},{\"name\":\"chat_invite\",\"type\":\"flags.4?ChatInvite\"},{\"name\":\"chat_invite_hash\",\"type\":\"flags.4?string\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"start_param\",\"type\":\"flags.0?string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"SponsoredMessage\"},{\"id\":-907141753,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"posts_between\",\"type\":\"flags.0?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":215889721,\"predicate\":\"inputStickerSetAnimatedEmojiAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":630664139,\"predicate\":\"sendMessageEmojiInteraction\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"interaction\",\"type\":\"DataJSON\"}],\"type\":\"SendMessageAction\"},{\"id\":-1234857938,\"predicate\":\"sendMessageEmojiInteractionSeen\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"SendMessageAction\"},{\"id\":-1227287081,\"predicate\":\"inputBotInlineMessageID64\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"owner_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":-911191137,\"predicate\":\"searchResultsCalendarPeriod\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"max_msg_id\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"SearchResultsCalendarPeriod\"},{\"id\":343859772,\"predicate\":\"messages.searchResultsCalendar\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.1?int\"},{\"name\":\"periods\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":2137295719,\"predicate\":\"searchResultPosition\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"SearchResultsPosition\"},{\"id\":1404185519,\"predicate\":\"messages.searchResultsPositions\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"positions\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":-339958837,\"predicate\":\"messageActionChatJoinedByRequest\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1885586395,\"predicate\":\"updatePendingJoinRequests\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"requests_pending\",\"type\":\"int\"},{\"name\":\"recent_requesters\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":299870598,\"predicate\":\"updateBotChatInviteRequester\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1347021750,\"predicate\":\"channelAdminLogEventActionParticipantJoinByRequest\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"approved_by\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-376962181,\"predicate\":\"inputKeyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":814112961,\"predicate\":\"keyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"KeyboardButton\"},{\"id\":-191450938,\"predicate\":\"channels.sendAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-886388890,\"predicate\":\"channelAdminLogEventActionToggleNoForwards\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-738646805,\"predicate\":\"messages.stickerSetNotModified\",\"params\":[],\"type\":\"messages.StickerSet\"},{\"id\":997004590,\"predicate\":\"users.userFull\",\"params\":[{\"name\":\"full_user\",\"type\":\"UserFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"users.UserFull\"},{\"id\":1753266509,\"predicate\":\"messages.peerSettings\",\"params\":[{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.PeerSettings\"},{\"id\":663693416,\"predicate\":\"channelAdminLogEventActionSendMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-702884114,\"predicate\":\"auth.codeTypeMissedCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-2113903484,\"predicate\":\"auth.sentCodeTypeMissedCall\",\"params\":[{\"name\":\"prefix\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1012759713,\"predicate\":\"auth.loggedOut\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"future_auth_token\",\"type\":\"flags.0?bytes\"}],\"type\":\"auth.LoggedOut\"},{\"id\":1578843320,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":-1546531968,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen_order\",\"type\":\"flags.0?int\"},{\"name\":\"reaction\",\"type\":\"Reaction\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"ReactionCount\"},{\"id\":1328256121,\"predicate\":\"messageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"can_see_list\",\"type\":\"flags.2?true\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"recent_reactions\",\"type\":\"flags.1?Vector\"}],\"type\":\"MessageReactions\"},{\"id\":834488621,\"predicate\":\"messages.messageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-1065882623,\"predicate\":\"availableReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"premium\",\"type\":\"flags.2?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"static_icon\",\"type\":\"Document\"},{\"name\":\"appear_animation\",\"type\":\"Document\"},{\"name\":\"select_animation\",\"type\":\"Document\"},{\"name\":\"activate_animation\",\"type\":\"Document\"},{\"name\":\"effect_animation\",\"type\":\"Document\"},{\"name\":\"around_animation\",\"type\":\"flags.1?Document\"},{\"name\":\"center_icon\",\"type\":\"flags.1?Document\"}],\"type\":\"AvailableReaction\"},{\"id\":-1626924713,\"predicate\":\"messages.availableReactionsNotModified\",\"params\":[],\"type\":\"messages.AvailableReactions\"},{\"id\":1989032621,\"predicate\":\"messages.availableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":852137487,\"predicate\":\"messageEntitySpoiler\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1102180616,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChatReactions\"},{\"name\":\"new_value\",\"type\":\"ChatReactions\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1741309751,\"predicate\":\"messages.translateNoResult\",\"params\":[],\"type\":\"messages.TranslatedText\"},{\"id\":-1575684144,\"predicate\":\"messages.translateResultText\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":-1319698788,\"predicate\":\"messagePeerReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"unread\",\"type\":\"flags.1?true\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reaction\",\"type\":\"Reaction\"}],\"type\":\"MessagePeerReaction\"},{\"id\":-2132064081,\"predicate\":\"groupCallStreamChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"last_timestamp_ms\",\"type\":\"long\"}],\"type\":\"GroupCallStreamChannel\"},{\"id\":-790330702,\"predicate\":\"phone.groupCallStreamChannels\",\"params\":[{\"name\":\"channels\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":177124030,\"predicate\":\"inputReportReasonIllegalDrugs\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1631091139,\"predicate\":\"inputReportReasonPersonalDetails\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":767505458,\"predicate\":\"phone.groupCallStreamRtmpUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":1165423600,\"predicate\":\"attachMenuBotIconColor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"color\",\"type\":\"int\"}],\"type\":\"AttachMenuBotIconColor\"},{\"id\":-1297663893,\"predicate\":\"attachMenuBotIcon\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"icon\",\"type\":\"Document\"},{\"name\":\"colors\",\"type\":\"flags.0?Vector\"}],\"type\":\"AttachMenuBotIcon\"},{\"id\":-928371502,\"predicate\":\"attachMenuBot\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"has_settings\",\"type\":\"flags.1?true\"},{\"name\":\"request_write_access\",\"type\":\"flags.2?true\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"peer_types\",\"type\":\"Vector\"},{\"name\":\"icons\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBot\"},{\"id\":-237467044,\"predicate\":\"attachMenuBotsNotModified\",\"params\":[],\"type\":\"AttachMenuBots\"},{\"id\":1011024320,\"predicate\":\"attachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bots\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBots\"},{\"id\":-1816172929,\"predicate\":\"attachMenuBotsBot\",\"params\":[{\"name\":\"bot\",\"type\":\"AttachMenuBot\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":397910539,\"predicate\":\"updateAttachMenuBots\",\"params\":[],\"type\":\"Update\"},{\"id\":202659196,\"predicate\":\"webViewResultUrl\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"WebViewResult\"},{\"id\":-2010155333,\"predicate\":\"simpleWebViewResultUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":211046684,\"predicate\":\"webViewMessageSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"msg_id\",\"type\":\"flags.0?InputBotInlineMessageID\"}],\"type\":\"WebViewMessageSent\"},{\"id\":361936797,\"predicate\":\"updateWebViewResultSent\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":326529584,\"predicate\":\"keyboardButtonWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1598009252,\"predicate\":\"keyboardButtonSimpleWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1205698681,\"predicate\":\"messageActionWebViewDataSentMe\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1262252875,\"predicate\":\"messageActionWebViewDataSent\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":347625491,\"predicate\":\"updateBotMenuButton\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Update\"},{\"id\":1966318984,\"predicate\":\"botMenuButtonDefault\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":1113113093,\"predicate\":\"botMenuButtonCommands\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":-944407322,\"predicate\":\"botMenuButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"BotMenuButton\"},{\"id\":-67704655,\"predicate\":\"account.savedRingtonesNotModified\",\"params\":[],\"type\":\"account.SavedRingtones\"},{\"id\":-1041683259,\"predicate\":\"account.savedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"ringtones\",\"type\":\"Vector\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1960361625,\"predicate\":\"updateSavedRingtones\",\"params\":[],\"type\":\"Update\"},{\"id\":-1746354498,\"predicate\":\"notificationSoundDefault\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":1863070943,\"predicate\":\"notificationSoundNone\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":-2096391452,\"predicate\":\"notificationSoundLocal\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"NotificationSound\"},{\"id\":-9666487,\"predicate\":\"notificationSoundRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"NotificationSound\"},{\"id\":-1222230163,\"predicate\":\"account.savedRingtone\",\"params\":[],\"type\":\"account.SavedRingtone\"},{\"id\":523271863,\"predicate\":\"account.savedRingtoneConverted\",\"params\":[{\"name\":\"document\",\"type\":\"Document\"}],\"type\":\"account.SavedRingtone\"},{\"id\":2104224014,\"predicate\":\"attachMenuPeerTypeSameBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-1020528102,\"predicate\":\"attachMenuPeerTypeBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-247016673,\"predicate\":\"attachMenuPeerTypePM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":84480319,\"predicate\":\"attachMenuPeerTypeChat\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":2080104188,\"predicate\":\"attachMenuPeerTypeBroadcast\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-317687113,\"predicate\":\"chatInvitePublicJoinRequests\",\"params\":[],\"type\":\"ExportedChatInvite\"},{\"id\":-977967015,\"predicate\":\"inputInvoiceMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"InputInvoice\"},{\"id\":-1020867857,\"predicate\":\"inputInvoiceSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputInvoice\"},{\"id\":-1362048039,\"predicate\":\"payments.exportedInvoice\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":8703322,\"predicate\":\"updateTranscribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-1821037486,\"predicate\":\"messages.transcribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":909284270,\"predicate\":\"dialogFilterDefault\",\"params\":[],\"type\":\"DialogFilter\"},{\"id\":1395946908,\"predicate\":\"help.premiumPromo\",\"params\":[{\"name\":\"status_text\",\"type\":\"string\"},{\"name\":\"status_entities\",\"type\":\"Vector\"},{\"name\":\"video_sections\",\"type\":\"Vector\"},{\"name\":\"videos\",\"type\":\"Vector\"},{\"name\":\"period_options\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.PremiumPromo\"},{\"id\":-925956616,\"predicate\":\"messageEntityCustomEmoji\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":-48981863,\"predicate\":\"documentAttributeCustomEmoji\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"free\",\"type\":\"flags.0?true\"},{\"name\":\"text_color\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"DocumentAttribute\"},{\"id\":1087454222,\"predicate\":\"stickerSetFullCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"keywords\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1502273946,\"predicate\":\"inputStorePaymentPremiumSubscription\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"restore\",\"type\":\"flags.0?true\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":1634697192,\"predicate\":\"inputStorePaymentGiftPremium\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":-1415514682,\"predicate\":\"messageActionGiftPremium\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"months\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1958953753,\"predicate\":\"premiumGiftOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumGiftOption\"},{\"id\":-930399486,\"predicate\":\"inputStickerSetPremiumGifts\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-78886548,\"predicate\":\"updateReadFeaturedEmojiStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1360618136,\"predicate\":\"inputPrivacyKeyVoiceMessages\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":110621716,\"predicate\":\"privacyKeyVoiceMessages\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1996951013,\"predicate\":\"paymentFormMethod\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentFormMethod\"},{\"id\":-193992412,\"predicate\":\"inputWebFileAudioAlbumThumbLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"small\",\"type\":\"flags.2?true\"},{\"name\":\"document\",\"type\":\"flags.0?InputDocument\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"}],\"type\":\"InputWebFileLocation\"},{\"id\":769727150,\"predicate\":\"emojiStatusEmpty\",\"params\":[],\"type\":\"EmojiStatus\"},{\"id\":-1835310691,\"predicate\":\"emojiStatus\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"EmojiStatus\"},{\"id\":-97474361,\"predicate\":\"emojiStatusUntil\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"until\",\"type\":\"int\"}],\"type\":\"EmojiStatus\"},{\"id\":674706841,\"predicate\":\"updateUserEmojiStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Update\"},{\"id\":821314523,\"predicate\":\"updateRecentEmojiStatuses\",\"params\":[],\"type\":\"Update\"},{\"id\":-796072379,\"predicate\":\"account.emojiStatusesNotModified\",\"params\":[],\"type\":\"account.EmojiStatuses\"},{\"id\":-1866176559,\"predicate\":\"account.emojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"statuses\",\"type\":\"Vector\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":2046153753,\"predicate\":\"reactionEmpty\",\"params\":[],\"type\":\"Reaction\"},{\"id\":455247544,\"predicate\":\"reactionEmoji\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Reaction\"},{\"id\":-1992950669,\"predicate\":\"reactionCustomEmoji\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Reaction\"},{\"id\":-352570692,\"predicate\":\"chatReactionsNone\",\"params\":[],\"type\":\"ChatReactions\"},{\"id\":1385335754,\"predicate\":\"chatReactionsAll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_custom\",\"type\":\"flags.0?true\"}],\"type\":\"ChatReactions\"},{\"id\":1713193015,\"predicate\":\"chatReactionsSome\",\"params\":[{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"ChatReactions\"},{\"id\":-1334846497,\"predicate\":\"messages.reactionsNotModified\",\"params\":[],\"type\":\"messages.Reactions\"},{\"id\":-352454890,\"predicate\":\"messages.reactions\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.Reactions\"},{\"id\":1870160884,\"predicate\":\"updateRecentReactions\",\"params\":[],\"type\":\"Update\"},{\"id\":-2030252155,\"predicate\":\"updateMoveStickerSetToTop\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"stickerset\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1511364673,\"predicate\":\"auth.sentCodeTypeEmailCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"},{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"next_phone_login_date\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1521934870,\"predicate\":\"auth.sentCodeTypeSetUpEmailRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1128644211,\"predicate\":\"emailVerifyPurposeLoginSetup\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"EmailVerifyPurpose\"},{\"id\":1383932651,\"predicate\":\"emailVerifyPurposeLoginChange\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1141565819,\"predicate\":\"emailVerifyPurposePassport\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1842457175,\"predicate\":\"emailVerificationCode\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-611279166,\"predicate\":\"emailVerificationGoogle\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-1764723459,\"predicate\":\"emailVerificationApple\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":731303195,\"predicate\":\"account.emailVerified\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.EmailVerified\"},{\"id\":-507835039,\"predicate\":\"account.emailVerifiedLogin\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"sent_code\",\"type\":\"auth.SentCode\"}],\"type\":\"account.EmailVerified\"},{\"id\":-1225711938,\"predicate\":\"premiumSubscriptionOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.1?true\"},{\"name\":\"can_purchase_upgrade\",\"type\":\"flags.2?true\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumSubscriptionOption\"},{\"id\":80008398,\"predicate\":\"inputStickerSetEmojiGenericAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":701560302,\"predicate\":\"inputStickerSetEmojiDefaultStatuses\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1206095820,\"predicate\":\"sendAsPeer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium_required\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"SendAsPeer\"},{\"id\":-1386050360,\"predicate\":\"messageExtendedMediaPreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"w\",\"type\":\"flags.0?int\"},{\"name\":\"h\",\"type\":\"flags.0?int\"},{\"name\":\"thumb\",\"type\":\"flags.1?PhotoSize\"},{\"name\":\"video_duration\",\"type\":\"flags.2?int\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":-297296796,\"predicate\":\"messageExtendedMedia\",\"params\":[{\"name\":\"media\",\"type\":\"MessageMedia\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":1517529484,\"predicate\":\"updateMessageExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"extended_media\",\"type\":\"MessageExtendedMedia\"}],\"type\":\"Update\"},{\"id\":-50416996,\"predicate\":\"stickerKeyword\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"keyword\",\"type\":\"Vector\"}],\"type\":\"StickerKeyword\"},{\"id\":-1274595769,\"predicate\":\"username\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"editable\",\"type\":\"flags.0?true\"},{\"name\":\"active\",\"type\":\"flags.1?true\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Username\"},{\"id\":-263212119,\"predicate\":\"channelAdminLogEventActionChangeUsernames\",\"params\":[{\"name\":\"prev_value\",\"type\":\"Vector\"},{\"name\":\"new_value\",\"type\":\"Vector\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":46949251,\"predicate\":\"channelAdminLogEventActionToggleForum\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1483767080,\"predicate\":\"channelAdminLogEventActionCreateTopic\",\"params\":[{\"name\":\"topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-261103096,\"predicate\":\"channelAdminLogEventActionEditTopic\",\"params\":[{\"name\":\"prev_topic\",\"type\":\"ForumTopic\"},{\"name\":\"new_topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1374254839,\"predicate\":\"channelAdminLogEventActionDeleteTopic\",\"params\":[{\"name\":\"topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1569535291,\"predicate\":\"channelAdminLogEventActionPinTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"prev_topic\",\"type\":\"flags.0?ForumTopic\"},{\"name\":\"new_topic\",\"type\":\"flags.1?ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":37687451,\"predicate\":\"forumTopicDeleted\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ForumTopic\"},{\"id\":1903173033,\"predicate\":\"forumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"my\",\"type\":\"flags.1?true\"},{\"name\":\"closed\",\"type\":\"flags.2?true\"},{\"name\":\"pinned\",\"type\":\"flags.3?true\"},{\"name\":\"short\",\"type\":\"flags.5?true\"},{\"name\":\"hidden\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.0?long\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"unread_reactions_count\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"draft\",\"type\":\"flags.4?DraftMessage\"}],\"type\":\"ForumTopic\"},{\"id\":913709011,\"predicate\":\"messages.forumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"order_by_create_date\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"topics\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"messages.ForumTopics\"},{\"id\":228168278,\"predicate\":\"messageActionTopicCreate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.0?long\"}],\"type\":\"MessageAction\"},{\"id\":-1064024032,\"predicate\":\"messageActionTopicEdit\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.1?long\"},{\"name\":\"closed\",\"type\":\"flags.2?Bool\"},{\"name\":\"hidden\",\"type\":\"flags.3?Bool\"}],\"type\":\"MessageAction\"},{\"id\":422509539,\"predicate\":\"updateChannelPinnedTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"topic_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1548122514,\"predicate\":\"inputNotifyForumTopic\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"InputNotifyPeer\"},{\"id\":577659656,\"predicate\":\"notifyForumTopic\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"NotifyPeer\"},{\"id\":1153562857,\"predicate\":\"inputStickerSetEmojiDefaultTopicIcons\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":406407439,\"predicate\":\"messages.sponsoredMessagesEmpty\",\"params\":[],\"type\":\"messages.SponsoredMessages\"},{\"id\":-31881726,\"predicate\":\"updateChannelPinnedTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":1135897376,\"predicate\":\"defaultHistoryTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"DefaultHistoryTTL\"},{\"id\":116234636,\"predicate\":\"auth.codeTypeFragmentSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-648651719,\"predicate\":\"auth.sentCodeTypeFragmentSms\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1103040667,\"predicate\":\"exportedContactToken\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ExportedContactToken\"},{\"id\":1693675004,\"predicate\":\"channelAdminLogEventActionToggleAntiSpam\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1474192222,\"predicate\":\"messageActionSuggestProfilePhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-404267113,\"predicate\":\"messageActionAttachMenuBotAllowed\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":2008112412,\"predicate\":\"stickerSetNoCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"}],\"type\":\"StickerSetCovered\"},{\"id\":542282808,\"predicate\":\"updateUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Update\"}],\"methods\":[{\"id\":-878758099,\"method\":\"invokeAfterMsg\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":1036301552,\"method\":\"invokeAfterMsgs\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1502141361,\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":-2131827673,\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1923962543,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"flags.0?string\"},{\"name\":\"email_verification\",\"type\":\"flags.1?EmailVerification\"}],\"type\":\"auth.Authorization\"},{\"id\":1047706137,\"method\":\"auth.logOut\",\"params\":[],\"type\":\"auth.LoggedOut\"},{\"id\":-1616179942,\"method\":\"auth.resetAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-440401971,\"method\":\"auth.exportAuthorization\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1518699091,\"method\":\"auth.importAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":-841733627,\"method\":\"auth.bindTempAuthKey\",\"params\":[{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"},{\"name\":\"encrypted_message\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-326762118,\"method\":\"account.registerDevice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_muted\",\"type\":\"flags.0?true\"},{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"app_sandbox\",\"type\":\"Bool\"},{\"name\":\"secret\",\"type\":\"bytes\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1779249670,\"method\":\"account.unregisterDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2067899501,\"method\":\"account.updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"},{\"name\":\"settings\",\"type\":\"InputPeerNotifySettings\"}],\"type\":\"Bool\"},{\"id\":313765169,\"method\":\"account.getNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-612493497,\"method\":\"account.resetNotifySettings\",\"params\":[],\"type\":\"Bool\"},{\"id\":2018596725,\"method\":\"account.updateProfile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"first_name\",\"type\":\"flags.0?string\"},{\"name\":\"last_name\",\"type\":\"flags.1?string\"},{\"name\":\"about\",\"type\":\"flags.2?string\"}],\"type\":\"User\"},{\"id\":1713919532,\"method\":\"account.updateStatus\",\"params\":[{\"name\":\"offline\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":127302966,\"method\":\"account.getWallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.WallPapers\"},{\"id\":-977650298,\"method\":\"account.reportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":227648840,\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1240508136,\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"users.UserFull\"},{\"id\":2061264541,\"method\":\"contacts.getContactIDs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":-995929106,\"method\":\"contacts.getStatuses\",\"params\":[],\"type\":\"Vector\"},{\"id\":1574346258,\"method\":\"contacts.getContacts\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.Contacts\"},{\"id\":746589157,\"method\":\"contacts.importContacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":157945344,\"method\":\"contacts.deleteContacts\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":269745566,\"method\":\"contacts.deleteByPhones\",\"params\":[{\"name\":\"phones\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1758204945,\"method\":\"contacts.block\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1096393392,\"method\":\"contacts.unblock\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-176409329,\"method\":\"contacts.getBlocked\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Blocked\"},{\"id\":1673946374,\"method\":\"messages.getMessages\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1594569905,\"method\":\"messages.getDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Dialogs\"},{\"id\":1143203525,\"method\":\"messages.getHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1593989278,\"method\":\"messages.search\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"from_id\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":238054714,\"method\":\"messages.readHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-1332768214,\"method\":\"messages.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"just_clear\",\"type\":\"flags.0?true\"},{\"name\":\"revoke\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"flags.2?int\"},{\"name\":\"max_date\",\"type\":\"flags.3?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-443640366,\"method\":\"messages.deleteMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":94983360,\"method\":\"messages.receivedMessages\",\"params\":[{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1486110434,\"method\":\"messages.setTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Bool\"},{\"id\":482476935,\"method\":\"messages.sendMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1967638886,\"method\":\"messages.sendMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-966673468,\"method\":\"messages.forwardMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"with_my_score\",\"type\":\"flags.8?true\"},{\"name\":\"drop_author\",\"type\":\"flags.11?true\"},{\"name\":\"drop_media_captions\",\"type\":\"flags.12?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"from_peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"random_id\",\"type\":\"Vector\"},{\"name\":\"to_peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-820669733,\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-270948702,\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1991005362,\"method\":\"messages.report\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1240027791,\"method\":\"messages.getChats\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1364194508,\"method\":\"messages.getFullChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"messages.ChatFull\"},{\"id\":1937260541,\"method\":\"messages.editChatTitle\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":903730804,\"method\":\"messages.editChatPhoto\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":-230206493,\"method\":\"messages.addChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"fwd_limit\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1575461717,\"method\":\"messages.deleteChatUser\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":3450904,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":-304838614,\"method\":\"updates.getState\",\"params\":[],\"type\":\"updates.State\"},{\"id\":630429265,\"method\":\"updates.getDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_total_limit\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":473782614,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"fallback\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"fallback\",\"type\":\"flags.3?true\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":-2016444625,\"method\":\"photos.deletePhotos\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1101843010,\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"cdn_supported\",\"type\":\"flags.1?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":-990308245,\"method\":\"help.getConfig\",\"params\":[],\"type\":\"Config\"},{\"id\":531836966,\"method\":\"help.getNearestDc\",\"params\":[],\"type\":\"NearestDc\"},{\"id\":1378703997,\"method\":\"help.getAppUpdate\",\"params\":[{\"name\":\"source\",\"type\":\"string\"}],\"type\":\"help.AppUpdate\"},{\"id\":1295590211,\"method\":\"help.getInviteText\",\"params\":[],\"type\":\"help.InviteText\"},{\"id\":-1848823128,\"method\":\"photos.getUserPhotos\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"photos.Photos\"},{\"id\":651135312,\"method\":\"messages.getDhConfig\",\"params\":[{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random_length\",\"type\":\"int\"}],\"type\":\"messages.DhConfig\"},{\"id\":-162681021,\"method\":\"messages.requestEncryption\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1035731989,\"method\":\"messages.acceptEncryption\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":-208425312,\"method\":\"messages.discardEncryption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":2031374829,\"method\":\"messages.setEncryptedTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"typing\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2135648522,\"method\":\"messages.readEncryptedHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1157265941,\"method\":\"messages.sendEncrypted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1431914525,\"method\":\"messages.sendEncryptedFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":852769188,\"method\":\"messages.sendEncryptedService\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1436924774,\"method\":\"messages.receivedQueue\",\"params\":[{\"name\":\"max_qts\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1259113487,\"method\":\"messages.reportEncryptedSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"}],\"type\":\"Bool\"},{\"id\":-562337987,\"method\":\"upload.saveBigFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"file_total_parts\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1043505495,\"method\":\"initConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"system_lang_code\",\"type\":\"string\"},{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"proxy\",\"type\":\"flags.0?InputClientProxy\"},{\"name\":\"params\",\"type\":\"flags.1?JSONValue\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":655677548,\"method\":\"account.checkUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1040964988,\"method\":\"account.updateUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":301470424,\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"id\":-623130288,\"method\":\"account.getPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-906486552,\"method\":\"account.setPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1564422284,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"flags.0?InputCheckPasswordSRP\"}],\"type\":\"Bool\"},{\"id\":150761757,\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":608323678,\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":-627372787,\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-113456221,\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-2108208411,\"method\":\"account.sendChangePhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1891839707,\"method\":\"account.changePhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-710552671,\"method\":\"messages.getStickers\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Stickers\"},{\"id\":-1197432408,\"method\":\"messages.getAllStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1738800940,\"method\":\"auth.importBotAuthorization\",\"params\":[{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"bot_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"MessageMedia\"},{\"id\":-484392616,\"method\":\"account.getAuthorizations\",\"params\":[],\"type\":\"account.Authorizations\"},{\"id\":-545786948,\"method\":\"account.resetAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1418342645,\"method\":\"account.getPassword\",\"params\":[],\"type\":\"account.Password\"},{\"id\":-1663767815,\"method\":\"account.getPasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1516564433,\"method\":\"account.updatePasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"new_settings\",\"type\":\"account.PasswordInputSettings\"}],\"type\":\"Bool\"},{\"id\":-779399914,\"method\":\"auth.checkPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"auth.Authorization\"},{\"id\":-661144474,\"method\":\"auth.requestPasswordRecovery\",\"params\":[],\"type\":\"auth.PasswordRecovery\"},{\"id\":923364464,\"method\":\"auth.recoverPassword\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"code\",\"type\":\"string\"},{\"name\":\"new_settings\",\"type\":\"flags.0?account.PasswordInputSettings\"}],\"type\":\"auth.Authorization\"},{\"id\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1607670315,\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"legacy_revoke_permanent\",\"type\":\"flags.2?true\"},{\"name\":\"request_needed\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1051570619,\"method\":\"messages.checkChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"ChatInvite\"},{\"id\":1817183516,\"method\":\"messages.importChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-928977804,\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-946871200,\"method\":\"messages.installStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"archived\",\"type\":\"Bool\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":-110209570,\"method\":\"messages.uninstallStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-421563528,\"method\":\"messages.startBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1468322785,\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"messages.MessageViews\"},{\"id\":-871347913,\"method\":\"channels.readHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-2067661490,\"method\":\"channels.deleteMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-196443371,\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1383294429,\"method\":\"channels.getMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":2010044880,\"method\":\"channels.getParticipants\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelParticipantsFilter\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-1599378234,\"method\":\"channels.getParticipant\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":176122811,\"method\":\"channels.getChannels\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":141781513,\"method\":\"channels.getFullChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1862244601,\"method\":\"channels.createChannel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.0?true\"},{\"name\":\"megagroup\",\"type\":\"flags.1?true\"},{\"name\":\"for_import\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"geo_point\",\"type\":\"flags.2?InputGeoPoint\"},{\"name\":\"address\",\"type\":\"flags.2?string\"},{\"name\":\"ttl_period\",\"type\":\"flags.4?int\"}],\"type\":\"Updates\"},{\"id\":-751007486,\"method\":\"channels.editAdmin\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1450044624,\"method\":\"channels.editTitle\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-248621111,\"method\":\"channels.editPhoto\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":283557164,\"method\":\"channels.checkUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":890549214,\"method\":\"channels.updateUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":615851205,\"method\":\"channels.joinChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-130635115,\"method\":\"channels.leaveChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":429865580,\"method\":\"channels.inviteToChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-1072619549,\"method\":\"channels.deleteChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":51854712,\"method\":\"updates.getChannelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelMessagesFilter\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1470377534,\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1568189671,\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1271290010,\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":2016638777,\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1309538785,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1559270965,\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.SavedGifs\"},{\"id\":846868683,\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1364105629,\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":-346119674,\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":-738468661,\"method\":\"messages.sendInlineBotResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"hide_via\",\"type\":\"flags.11?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-432034325,\"method\":\"channels.exportMessageLink\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"grouped\",\"type\":\"flags.0?true\"},{\"name\":\"thread\",\"type\":\"flags.1?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ExportedMessageLink\"},{\"id\":527021574,\"method\":\"channels.toggleSignatures\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1056025023,\"method\":\"auth.resendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":520357240,\"method\":\"auth.cancelCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-39416522,\"method\":\"messages.getMessageEditData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"messages.MessageEditData\"},{\"id\":1224152952,\"method\":\"messages.editMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.15?int\"}],\"type\":\"Updates\"},{\"id\":-2091549254,\"method\":\"messages.editInlineBotMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":-1824339449,\"method\":\"messages.getBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"game\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"password\",\"type\":\"flags.2?InputCheckPasswordSRP\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-712043766,\"method\":\"messages.setBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-1758168906,\"method\":\"contacts.getTopPeers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"correspondents\",\"type\":\"flags.0?true\"},{\"name\":\"bots_pm\",\"type\":\"flags.1?true\"},{\"name\":\"bots_inline\",\"type\":\"flags.2?true\"},{\"name\":\"phone_calls\",\"type\":\"flags.3?true\"},{\"name\":\"forward_users\",\"type\":\"flags.4?true\"},{\"name\":\"forward_chats\",\"type\":\"flags.5?true\"},{\"name\":\"groups\",\"type\":\"flags.10?true\"},{\"name\":\"channels\",\"type\":\"flags.15?true\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.TopPeers\"},{\"id\":451113900,\"method\":\"contacts.resetTopPeerRating\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1271718337,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":1782549861,\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":1685588756,\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1527873830,\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1649852357,\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.RecentStickers\"},{\"id\":958863608,\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1986437075,\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":1475442322,\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":457157256,\"method\":\"account.sendConfirmPhoneCode\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1596029123,\"method\":\"account.confirmPhone\",\"params\":[{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-122669393,\"method\":\"channels.getAdminedPublicChannels\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"by_location\",\"type\":\"flags.0?true\"},{\"name\":\"check_limit\",\"type\":\"flags.1?true\"}],\"type\":\"messages.Chats\"},{\"id\":1678738104,\"method\":\"messages.getMaskStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-866424884,\"method\":\"messages.getAttachedStickers\",\"params\":[{\"name\":\"media\",\"type\":\"InputStickeredMedia\"}],\"type\":\"Vector\"},{\"id\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1896289088,\"method\":\"messages.setGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":363700068,\"method\":\"messages.setInlineGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-400399203,\"method\":\"messages.getGameHighScores\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":258170395,\"method\":\"messages.getInlineGameHighScores\",\"params\":[{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":-468934396,\"method\":\"messages.getCommonChats\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-2023787330,\"method\":\"messages.getAllChats\",\"params\":[{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":852135825,\"method\":\"messages.getWebPage\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-1489903017,\"method\":\"messages.toggleDialogPin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":991616823,\"method\":\"messages.reorderPinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"int\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-692498958,\"method\":\"messages.getPinnedDialogs\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1440257555,\"method\":\"bots.sendCustomRequest\",\"params\":[{\"name\":\"custom_method\",\"type\":\"string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"DataJSON\"},{\"id\":-434028723,\"method\":\"bots.answerWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":924093883,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"payments.PaymentForm\"},{\"id\":611897804,\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-1228345045,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":755192367,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"},{\"name\":\"tip_amount\",\"type\":\"flags.2?long\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":578650699,\"method\":\"payments.getSavedInfo\",\"params\":[],\"type\":\"payments.SavedInfo\"},{\"id\":-667062079,\"method\":\"payments.clearSavedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"credentials\",\"type\":\"flags.0?true\"},{\"name\":\"info\",\"type\":\"flags.1?true\"}],\"type\":\"Bool\"},{\"id\":-436833542,\"method\":\"messages.setBotShippingResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"Bool\"},{\"id\":163765653,\"method\":\"messages.setBotPrecheckoutResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"}],\"type\":\"Bool\"},{\"id\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?true\"},{\"name\":\"videos\",\"type\":\"flags.4?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"software\",\"type\":\"flags.3?string\"}],\"type\":\"messages.StickerSet\"},{\"id\":-143257775,\"method\":\"stickers.removeStickerFromSet\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":-4795190,\"method\":\"stickers.changeStickerPosition\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"},{\"name\":\"position\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-2041315650,\"method\":\"stickers.addStickerToSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"sticker\",\"type\":\"InputStickerSetItem\"}],\"type\":\"messages.StickerSet\"},{\"id\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":1430593449,\"method\":\"phone.getCallConfig\",\"params\":[],\"type\":\"DataJSON\"},{\"id\":1124046573,\"method\":\"phone.requestCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":1003664544,\"method\":\"phone.acceptCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":788404002,\"method\":\"phone.confirmCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":399855457,\"method\":\"phone.receivedCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"}],\"type\":\"Bool\"},{\"id\":-1295269440,\"method\":\"phone.discardCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"reason\",\"type\":\"PhoneCallDiscardReason\"},{\"name\":\"connection_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1508562471,\"method\":\"phone.setCallRating\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_initiative\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"rating\",\"type\":\"int\"},{\"name\":\"comment\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":662363518,\"method\":\"phone.saveCallDebug\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"debug\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":962554330,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1691921240,\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector\"},{\"id\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":-219008246,\"method\":\"langpack.getLangPack\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackDifference\"},{\"id\":-269862909,\"method\":\"langpack.getStrings\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"keys\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-845657435,\"method\":\"langpack.getDifference\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"LangPackDifference\"},{\"id\":1120311183,\"method\":\"langpack.getLanguages\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1763259007,\"method\":\"channels.editBanned\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":870184064,\"method\":\"channels.getAdminLog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"events_filter\",\"type\":\"flags.0?ChannelAdminLogEventsFilter\"},{\"name\":\"admins\",\"type\":\"flags.1?Vector\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"min_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-1847836879,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":-914493408,\"method\":\"messages.sendScreenshotNotification\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":82946729,\"method\":\"messages.getFavedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-1174420133,\"method\":\"messages.faveSticker\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unfave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":-251140208,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1683319225,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"for_everyone\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":921026381,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1881817312,\"method\":\"messages.getRecentLocations\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1225713124,\"method\":\"messages.sendMultiMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"multi_media\",\"type\":\"Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1347929239,\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"id\":405695855,\"method\":\"account.getWebAuthorizations\",\"params\":[],\"type\":\"account.WebAuthorizations\"},{\"id\":755087855,\"method\":\"account.resetWebAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1747789204,\"method\":\"account.resetWebAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":896555914,\"method\":\"messages.searchStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_featured\",\"type\":\"flags.0?true\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1856595926,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":-1299661699,\"method\":\"account.getAllSecureValues\",\"params\":[],\"type\":\"Vector\"},{\"id\":1936088002,\"method\":\"account.getSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1986010339,\"method\":\"account.saveSecureValue\",\"params\":[{\"name\":\"value\",\"type\":\"InputSecureValue\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureValue\"},{\"id\":-1199522741,\"method\":\"account.deleteSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1456907910,\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-202552205,\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":-1516022023,\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1305716726,\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1730136133,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":53322959,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"verification\",\"type\":\"EmailVerification\"}],\"type\":\"account.EmailVerified\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-1896617296,\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?long\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector\"},{\"id\":911373810,\"method\":\"invokeWithMessagesRange\",\"params\":[{\"name\":\"range\",\"type\":\"MessageRange\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1398145746,\"method\":\"invokeWithTakeout\",\"params\":[{\"name\":\"takeout_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1031349873,\"method\":\"messages.markDialogUnread\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":585256482,\"method\":\"messages.getDialogUnreadMarks\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1735311088,\"method\":\"help.getAppConfig\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":1862465352,\"method\":\"help.saveAppLog\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-966677240,\"method\":\"help.getPassportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.PassportConfig\"},{\"id\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":-760547348,\"method\":\"messages.updatePinnedMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"unpin\",\"type\":\"flags.1?true\"},{\"name\":\"pm_oneside\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1881204448,\"method\":\"account.confirmPasswordEmail\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":2055154197,\"method\":\"account.resendPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1043606090,\"method\":\"account.cancelPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-748624084,\"method\":\"help.getSupportName\",\"params\":[],\"type\":\"help.SupportName\"},{\"id\":59377875,\"method\":\"help.getUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"help.UserInfo\"},{\"id\":1723407216,\"method\":\"help.editUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"help.UserInfo\"},{\"id\":-1626880216,\"method\":\"account.getContactSignUpNotification\",\"params\":[],\"type\":\"Bool\"},{\"id\":-806076575,\"method\":\"account.setContactSignUpNotification\",\"params\":[{\"name\":\"silent\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1398240377,\"method\":\"account.getNotifyExceptions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"compare_sound\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"flags.0?InputNotifyPeer\"}],\"type\":\"Updates\"},{\"id\":283795844,\"method\":\"messages.sendVote\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"options\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1941660731,\"method\":\"messages.getPollResults\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1848369232,\"method\":\"messages.getOnlines\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ChatOnlines\"},{\"id\":-554301545,\"method\":\"messages.editChatAbout\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1517917375,\"method\":\"messages.editChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":-57811990,\"method\":\"account.getWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"}],\"type\":\"WallPaper\"},{\"id\":-578472351,\"method\":\"account.uploadWallPaper\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1817860919,\"method\":\"account.saveWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"unsave\",\"type\":\"Bool\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-18000023,\"method\":\"account.installWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-1153722364,\"method\":\"account.resetWallPapers\",\"params\":[],\"type\":\"Bool\"},{\"id\":1457130303,\"method\":\"account.getAutoDownloadSettings\",\"params\":[],\"type\":\"account.AutoDownloadSettings\"},{\"id\":1995661875,\"method\":\"account.saveAutoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"low\",\"type\":\"flags.0?true\"},{\"name\":\"high\",\"type\":\"flags.1?true\"},{\"name\":\"settings\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"Bool\"},{\"id\":899735650,\"method\":\"messages.getEmojiKeywords\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":352892591,\"method\":\"messages.getEmojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":1318675378,\"method\":\"messages.getEmojiKeywordsLanguages\",\"params\":[{\"name\":\"lang_codes\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-709817306,\"method\":\"messages.getEmojiURL\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":1749536939,\"method\":\"folders.editPeerFolders\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":472471681,\"method\":\"folders.deleteFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":11435201,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"filters\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-170208392,\"method\":\"channels.getGroupsForDiscussion\",\"params\":[],\"type\":\"messages.Chats\"},{\"id\":1079520178,\"method\":\"channels.setDiscussionGroup\",\"params\":[{\"name\":\"broadcast\",\"type\":\"InputChannel\"},{\"name\":\"group\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":428848198,\"method\":\"messages.requestUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1322487515,\"method\":\"messages.acceptUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":1336717624,\"method\":\"messages.hidePeerSettingsBar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-386636848,\"method\":\"contacts.addContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"add_phone_privacy_exception\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-130964977,\"method\":\"contacts.acceptContact\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"Updates\"},{\"id\":-750207932,\"method\":\"contacts.getLocated\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"background\",\"type\":\"flags.1?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"self_expires\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":1491484525,\"method\":\"channels.editLocation\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304832784,\"method\":\"channels.toggleSlowMode\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"seconds\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-183077365,\"method\":\"messages.getScheduledHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1111817116,\"method\":\"messages.getScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1120369398,\"method\":\"messages.sendScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1504586518,\"method\":\"messages.deleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":473805619,\"method\":\"account.uploadTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.0?InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1697530880,\"method\":\"account.createTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":737414348,\"method\":\"account.updateTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"slug\",\"type\":\"flags.0?string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":-229175188,\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-953697477,\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"},{\"name\":\"format\",\"type\":\"flags.2?string\"},{\"name\":\"base_theme\",\"type\":\"flags.3?BaseTheme\"}],\"type\":\"Bool\"},{\"id\":978872812,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"}],\"type\":\"Theme\"},{\"id\":1913054296,\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1210022402,\"method\":\"auth.exportLoginToken\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"auth.LoginToken\"},{\"id\":-1783866140,\"method\":\"auth.importLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":-392909491,\"method\":\"auth.acceptLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"Authorization\"},{\"id\":-1250643605,\"method\":\"account.setContentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1952756306,\"method\":\"account.getContentSettings\",\"params\":[],\"type\":\"account.ContentSettings\"},{\"id\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1200736242,\"method\":\"messages.getPollVotes\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"option\",\"type\":\"flags.0?bytes\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.VotesList\"},{\"id\":-1257951254,\"method\":\"messages.toggleStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"uninstall\",\"type\":\"flags.0?true\"},{\"name\":\"archive\",\"type\":\"flags.1?true\"},{\"name\":\"unarchive\",\"type\":\"flags.2?true\"},{\"name\":\"stickersets\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"id\":-241247891,\"method\":\"messages.getDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":-1566780372,\"method\":\"messages.getSuggestedDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":450142282,\"method\":\"messages.updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Bool\"},{\"id\":-983318044,\"method\":\"messages.updateDialogFiltersOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1421720550,\"method\":\"stats.getBroadcastStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":1646092192,\"method\":\"stats.loadAsyncGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"x\",\"type\":\"flags.0?long\"}],\"type\":\"StatsGraph\"},{\"id\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":2127598753,\"method\":\"messages.getOldFeaturedStickers\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":-183649631,\"method\":\"help.dismissSuggestion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"suggestion\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1935116200,\"method\":\"help.getCountriesList\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":584962828,\"method\":\"messages.getReplies\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":1147761405,\"method\":\"messages.getDiscussionMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-147740172,\"method\":\"messages.readDiscussion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":698914348,\"method\":\"contacts.blockFromReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_message\",\"type\":\"flags.0?true\"},{\"name\":\"delete_history\",\"type\":\"flags.1?true\"},{\"name\":\"report_spam\",\"type\":\"flags.2?true\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1445996571,\"method\":\"stats.getMessagePublicForwards\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1226791947,\"method\":\"stats.getMessageStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"stats.MessageStats\"},{\"id\":-299714136,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"rtmp_stream\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"schedule_date\",\"type\":\"flags.1?int\"}],\"type\":\"Updates\"},{\"id\":-1322057861,\"method\":\"phone.joinGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"video_stopped\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"},{\"name\":\"invite_hash\",\"type\":\"flags.1?string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":1342404601,\"method\":\"phone.leaveGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"source\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":2067345760,\"method\":\"phone.inviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":2054648117,\"method\":\"phone.discardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1958458429,\"method\":\"phone.toggleGroupCallSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reset_invite_hash\",\"type\":\"flags.1?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_muted\",\"type\":\"flags.0?Bool\"}],\"type\":\"Updates\"},{\"id\":68699611,\"method\":\"phone.getGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupCall\"},{\"id\":-984033109,\"method\":\"phone.getGroupParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"ids\",\"type\":\"Vector\"},{\"name\":\"sources\",\"type\":\"Vector\"},{\"name\":\"offset\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":-1248003721,\"method\":\"phone.checkGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":1540419152,\"method\":\"messages.deleteChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-104078327,\"method\":\"messages.deletePhoneCallHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1140726259,\"method\":\"messages.checkHistoryImport\",\"params\":[{\"name\":\"import_head\",\"type\":\"string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":873008187,\"method\":\"messages.initHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"media_count\",\"type\":\"int\"}],\"type\":\"messages.HistoryImport\"},{\"id\":713433234,\"method\":\"messages.uploadImportedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-1271008444,\"method\":\"messages.startHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-1565154314,\"method\":\"messages.getExportedChatInvites\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"},{\"name\":\"offset_date\",\"type\":\"flags.2?int\"},{\"name\":\"offset_link\",\"type\":\"flags.2?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":1937010524,\"method\":\"messages.getExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-1110823051,\"method\":\"messages.editExportedChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"request_needed\",\"type\":\"flags.3?Bool\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":1452833749,\"method\":\"messages.deleteRevokedExportedChatInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":-731601877,\"method\":\"messages.deleteExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":958457583,\"method\":\"messages.getAdminsWithInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-553329330,\"method\":\"messages.getChatInviteImporters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"},{\"name\":\"q\",\"type\":\"flags.2?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_user\",\"type\":\"InputUser\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-1207017500,\"method\":\"messages.setHistoryTTL\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-91437323,\"method\":\"account.reportProfilePhoto\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"InputPhoto\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-248985848,\"method\":\"phone.toggleGroupCallRecord\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"start\",\"type\":\"flags.0?true\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"video_portrait\",\"type\":\"flags.2?Bool\"}],\"type\":\"Updates\"},{\"id\":-1524155713,\"method\":\"phone.editGroupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"muted\",\"type\":\"flags.0?Bool\"},{\"name\":\"volume\",\"type\":\"flags.1?int\"},{\"name\":\"raise_hand\",\"type\":\"flags.2?Bool\"},{\"name\":\"video_stopped\",\"type\":\"flags.3?Bool\"},{\"name\":\"video_paused\",\"type\":\"flags.4?Bool\"},{\"name\":\"presentation_paused\",\"type\":\"flags.5?Bool\"}],\"type\":\"Updates\"},{\"id\":480685066,\"method\":\"phone.editGroupCallTitle\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-277077702,\"method\":\"phone.getGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":-425040769,\"method\":\"phone.exportGroupCallInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.0?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":563885286,\"method\":\"phone.toggleGroupCallStartSubscription\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"subscribed\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1451287362,\"method\":\"phone.startScheduledGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1465786252,\"method\":\"phone.saveDefaultGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-873829436,\"method\":\"phone.joinGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":475058500,\"method\":\"phone.leaveGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":676017721,\"method\":\"stickers.checkShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1303364867,\"method\":\"stickers.suggestShortName\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":1032708345,\"method\":\"bots.resetBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-481554986,\"method\":\"bots.getBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-700916087,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1095836780,\"method\":\"channels.viewSponsoredMessage\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"random_id\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-333377601,\"method\":\"channels.getSponsoredMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":745510839,\"method\":\"messages.getMessageReadParticipants\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1240514025,\"method\":\"messages.getSearchResultsCalendar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":1855292323,\"method\":\"messages.getSearchResultsPositions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":2145904661,\"method\":\"messages.hideChatJoinRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-528091926,\"method\":\"messages.hideAllChatJoinRequests\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"}],\"type\":\"Updates\"},{\"id\":-1323389022,\"method\":\"messages.toggleNoForwards\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-855777386,\"method\":\"messages.saveDefaultSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"send_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":231174382,\"method\":\"channels.getSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-1081501024,\"method\":\"account.setAuthorizationTTL\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1089766498,\"method\":\"account.changeAuthorizationSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.0?Bool\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.1?Bool\"}],\"type\":\"Bool\"},{\"id\":913655003,\"method\":\"channels.deleteParticipantHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-754091820,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.1?true\"},{\"name\":\"add_to_recent\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Vector\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1176190792,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Reaction\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-21928079,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"ChatReactions\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":1330094102,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"Reaction\"}],\"type\":\"Bool\"},{\"id\":617508334,\"method\":\"messages.translateText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"text\",\"type\":\"flags.1?string\"},{\"name\":\"from_lang\",\"type\":\"flags.2?string\"},{\"name\":\"to_lang\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":841173339,\"method\":\"messages.getUnreadReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":1420459918,\"method\":\"messages.readReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-1963375804,\"method\":\"contacts.resolvePhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":447879488,\"method\":\"phone.getGroupCallStreamChannels\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":-558650433,\"method\":\"phone.getGroupCallStreamRtmpUrl\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"revoke\",\"type\":\"Bool\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":276705696,\"method\":\"messages.searchSentMedia\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":385663691,\"method\":\"messages.getAttachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"AttachMenuBots\"},{\"id\":1998676370,\"method\":\"messages.getAttachMenuBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":1777704297,\"method\":\"messages.toggleBotInAttachMenu\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":395003915,\"method\":\"messages.requestWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"from_bot_menu\",\"type\":\"flags.4?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"start_param\",\"type\":\"flags.3?string\"},{\"name\":\"theme_params\",\"type\":\"flags.2?DataJSON\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"WebViewResult\"},{\"id\":2146648841,\"method\":\"messages.prolongWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Bool\"},{\"id\":698084494,\"method\":\"messages.requestSimpleWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"},{\"name\":\"platform\",\"type\":\"string\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":172168437,\"method\":\"messages.sendWebViewResultMessage\",\"params\":[{\"name\":\"bot_query_id\",\"type\":\"string\"},{\"name\":\"result\",\"type\":\"InputBotInlineResult\"}],\"type\":\"WebViewMessageSent\"},{\"id\":-603831608,\"method\":\"messages.sendWebViewData\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"button_text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1157944655,\"method\":\"bots.setBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Bool\"},{\"id\":-1671369944,\"method\":\"bots.getBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotMenuButton\"},{\"id\":-510647672,\"method\":\"account.getSavedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1038768899,\"method\":\"account.saveRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"account.SavedRingtone\"},{\"id\":-2095414366,\"method\":\"account.uploadRingtone\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":2021942497,\"method\":\"bots.setBotBroadcastDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"},{\"id\":-1839281686,\"method\":\"bots.setBotGroupDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"},{\"id\":1092913030,\"method\":\"phone.saveCallLog\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"file\",\"type\":\"InputFile\"}],\"type\":\"Bool\"},{\"id\":-456419968,\"method\":\"channels.toggleJoinToSend\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1277789622,\"method\":\"channels.toggleJoinRequest\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":261206117,\"method\":\"payments.exportInvoice\",\"params\":[{\"name\":\"invoice_media\",\"type\":\"InputMedia\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":647928393,\"method\":\"messages.transcribeAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":2132608815,\"method\":\"messages.rateTranscribedAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"good\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-2131921795,\"method\":\"payments.assignAppStoreTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"bytes\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-537046829,\"method\":\"payments.assignPlayMarketTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"DataJSON\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-1614700874,\"method\":\"payments.canPurchasePremium\",\"params\":[{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Bool\"},{\"id\":-1206152236,\"method\":\"help.getPremiumPromo\",\"params\":[],\"type\":\"help.PremiumPromo\"},{\"id\":-643100844,\"method\":\"messages.getCustomEmojiDocuments\",\"params\":[{\"name\":\"document_id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-67329649,\"method\":\"messages.getEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":248473398,\"method\":\"messages.getFeaturedEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-70001045,\"method\":\"account.updateEmojiStatus\",\"params\":[{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Bool\"},{\"id\":-696962170,\"method\":\"account.getDefaultEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":257392901,\"method\":\"account.getRecentEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":404757166,\"method\":\"account.clearRecentEmojiStatuses\",\"params\":[],\"type\":\"Bool\"},{\"id\":1063567478,\"method\":\"messages.reportReaction\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction_peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1149164102,\"method\":\"messages.getTopReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":960896434,\"method\":\"messages.getRecentReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":-1644236876,\"method\":\"messages.clearRecentReactions\",\"params\":[],\"type\":\"Bool\"},{\"id\":-2064119788,\"method\":\"messages.getExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":767062953,\"method\":\"auth.importWebTokenAuthorization\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"web_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-279966037,\"method\":\"account.reorderUsernames\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1490465654,\"method\":\"account.toggleUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"active\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1268978403,\"method\":\"channels.reorderUsernames\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1358053637,\"method\":\"channels.toggleUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"active\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":170155475,\"method\":\"channels.deactivateAllUsernames\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":-1540781271,\"method\":\"channels.toggleForum\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-200539612,\"method\":\"channels.createForumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"flags.0?int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.3?long\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"send_as\",\"type\":\"flags.2?InputPeer\"}],\"type\":\"Updates\"},{\"id\":233136337,\"method\":\"channels.getForumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_topic\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ForumTopics\"},{\"id\":-1333584199,\"method\":\"channels.getForumTopicsByID\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topics\",\"type\":\"Vector\"}],\"type\":\"messages.ForumTopics\"},{\"id\":-186670715,\"method\":\"channels.editForumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topic_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.1?long\"},{\"name\":\"closed\",\"type\":\"flags.2?Bool\"},{\"name\":\"hidden\",\"type\":\"flags.3?Bool\"}],\"type\":\"Updates\"},{\"id\":1814925350,\"method\":\"channels.updatePinnedForumTopic\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topic_id\",\"type\":\"int\"},{\"name\":\"pinned\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":876830509,\"method\":\"channels.deleteTopicHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":693150095,\"method\":\"channels.reorderPinnedForumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1760814315,\"method\":\"channels.toggleAntiSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-1471109485,\"method\":\"channels.reportAntiSpamFalsePositive\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-1632299963,\"method\":\"messages.setDefaultHistoryTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1703637384,\"method\":\"messages.getDefaultHistoryTTL\",\"params\":[],\"type\":\"DefaultHistoryTTL\"},{\"id\":-127582169,\"method\":\"contacts.exportContactToken\",\"params\":[],\"type\":\"ExportedContactToken\"},{\"id\":318789512,\"method\":\"contacts.importContactToken\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-1189444673,\"method\":\"photos.uploadContactProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"suggest\",\"type\":\"flags.3?true\"},{\"name\":\"save\",\"type\":\"flags.4?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":1785624660,\"method\":\"channels.toggleParticipantsHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"}]},\"layer\":151} as {\n MTProto: {\n constructors: MTProtoConstructor[],\n methods: MTProtoMethod[],\n constructorsIndex?: {[id: number]: number}\n },\n API: {\n constructors: MTProtoConstructor[],\n methods: MTProtoMethod[],\n constructorsIndex?: {[id: number]: number}\n },\n layer: number,\n};\n","export default function intToUint(val: number) {\n // return val < 0 ? val + 4294967296 : val; // 0 <= val <= Infinity\n return val >>> 0; // (4294967296 >>> 0) === 0; 0 <= val <= 4294967295\n}\n","import bigInt from 'big-integer';\nimport intToUint from '../number/intToUint';\n\nexport default function ulongFromInts(high: number, low: number) {\n high = intToUint(high), low = intToUint(low);\n return bigInt(high).shiftLeft(32).add(bigInt(low));\n}\n","import bigInt from 'big-integer';\n\nexport const safeBigInt = bigInt(Number.MAX_SAFE_INTEGER);\nexport const ulongBigInt = bigInt(bigInt[2]).pow(64);\nexport const longBigInt = ulongBigInt.divide(bigInt[2]);\n","import bigInt from 'big-integer';\nimport { longBigInt, ulongBigInt } from './bigIntConstants';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n\nexport function bigIntToSigned(bigInt: bigInt.BigInteger) {\n return bigInt.greater(longBigInt) ? bigInt.minus(ulongBigInt) : bigInt;\n}\n\nexport function bigIntToUnsigned(bigInt: bigInt.BigInteger) {\n return bigInt.isNegative() ? ulongBigInt.add(bigInt) : bigInt;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Schema, {MTProtoConstructor} from './schema';\nimport {JSONValue} from '../../layer';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport bigInt from 'big-integer';\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\nimport {safeBigInt} from '../../helpers/bigInt/bigIntConstants';\nimport {bigIntToSigned, bigIntToUnsigned} from '../../helpers/bigInt/bigIntConversion';\n\nconst boolFalse = +Schema.API.constructors.find((c) => c.predicate === 'boolFalse').id;\nconst boolTrue = +Schema.API.constructors.find((c) => c.predicate === 'boolTrue').id;\nconst vector = +Schema.API.constructors.find((c) => c.predicate === 'vector').id;\nconst gzipPacked = +Schema.MTProto.constructors.find((c) => c.predicate === 'gzip_packed').id;\n\n// * using slice to have a new buffer, otherwise the buffer will be copied to main thread\nconst sliceMethod: 'slice' | 'subarray' = 'slice'; // subarray\n\nclass TLSerialization {\n private maxLength = 2048; // 2Kb\n private offset = 0; // in bytes\n private mtproto = false;\n private debug = false;// Modes.debug;\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n\n public createBuffer() {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n }\n\n public getArray() {\n const resultBuffer = new ArrayBuffer(this.offset);\n\n // let perf = performance.now();\n /* const resultUint8: any = new Uint8Array(resultBuffer);\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\n // console.log('perf uint8', performance.now() - perf);\n\n // perf = performance.now();\n const resultInt32 = new Int32Array(resultBuffer);\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\n // console.log('perf int32', performance.now() - perf);\n\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\n console.error(resultUint8, resultInt32);\n } */\n\n return resultInt32;\n }\n\n public getBuffer() {\n return this.getArray().buffer;\n }\n\n public getBytes(typed: true): Uint8Array;\n public getBytes(typed?: false): number[];\n public getBytes(typed: boolean = true): number[] | Uint8Array {\n if(typed) {\n const resultBuffer = new ArrayBuffer(this.offset);\n const resultArray = new Uint8Array(resultBuffer);\n\n resultArray.set(this.byteView.subarray(0, this.offset));\n\n return resultArray;\n }\n\n const bytes: number[] = new Array(this.offset);\n for(let i = 0; i < this.offset; ++i) {\n bytes[i] = this.byteView[i];\n }\n return bytes;\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public checkLength(needBytes: number) {\n if(this.offset + needBytes < this.maxLength) {\n return;\n }\n\n // console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n const previousBuffer = this.buffer;\n // const previousByteView = this.byteView;\n const previousArray = new Int32Array(previousBuffer);\n\n this.createBuffer();\n\n new Int32Array(this.buffer).set(previousArray);\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32),\n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\n }\n\n public writeInt(i: number, field: string) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n\n const offset = this.offset / 4;\n this.checkLength(4);\n this.intView[offset] = i;\n this.offset += 4;\n\n return offset;\n }\n\n public storeInt(i: number, field?: string) {\n return this.writeInt(i, (field || '') + ':int');\n }\n\n public storeBool(i: boolean, field?: string) {\n if(i) {\n this.writeInt(boolTrue, (field || '') + ':bool');\n } else {\n this.writeInt(boolFalse, (field || '') + ':bool');\n }\n }\n\n public storeLongP(iHigh: number, iLow: number, field?: string) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n }\n\n public storeLong(sLong: Array | string | number, field?: string) {\n if(Array.isArray(sLong)) {\n if(sLong.length === 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n } else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n\n const _bigInt = bigIntToUnsigned(bigInt(sLong as string));\n const {quotient, remainder} = _bigInt.divmod(0x100000000);\n const high = quotient.toJSNumber();\n const low = remainder.toJSNumber();\n\n this.writeInt(low, (field || '') + ':long[low]');\n this.writeInt(high, (field || '') + ':long[high]');\n }\n\n public storeDouble(f: any, field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n\n doubleView[0] = f;\n\n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n }\n\n public storeString(s: string, field?: string) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n\n if(s === undefined) {\n s = '';\n }\n const sUTF8 = unescape(encodeURIComponent(s));\n\n this.checkLength(sUTF8.length + 8);\n\n const len = sUTF8.length;\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for(let i = 0; i < len; ++i) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n\n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n\n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n } else if(bytes === undefined) {\n bytes = [];\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\n\n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\n const len = (bytes as Uint8Array).length;\n this.checkLength(len + 8);\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n\n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n\n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n\n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = (bytes as Uint8Array).length;\n if((bits % 32) || (len * 8) !== bits) {\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\n console.error(error, bytes, field);\n throw error;\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\n this.checkLength(len);\n\n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n }\n\n public storeRawBytes(bytes: ArrayLike, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = bytes.length;\n\n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n\n this.byteView.set(bytes, this.offset);\n this.offset += len;\n }\n\n public storeMethod(methodName: string, params: any) {\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const methodData = schema.methods.find((m) => m.method === methodName);\n\n if(!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n\n this.storeInt(methodData.id, methodName + '[id]');\n\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\n const flagsOffsets: {[paramName: string]: number} = {};\n // console.log('storeMethod', len, methodData);\n for(const param of methodData.params) {\n let type = param.type;\n\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\n // console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\n params[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n // console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\n type = condType[1];\n }\n\n // console.log('storeMethod', methodName, param.name, params[param.name], type);\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n\n if(type === '#') {\n params[param.name] = params[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(const paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = params[paramName];\n }\n\n return methodData.type;\n }\n\n public storeObject(obj: any, type: string, field?: string) {\n // console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\n switch(type) {\n case '#':\n obj = obj || 0;\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return\n }\n\n if(Array.isArray(obj)) {\n if(type.substr(0, 6) === 'Vector') {\n this.writeInt(vector, field + '[id]');\n } else if(type.substr(0, 6) !== 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n this.writeInt(obj.length, field + '[count]');\n for(let i = 0; i < obj.length; ++i) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n\n return true;\n } else if(type.substr(0, 6).toLowerCase() === 'vector') {\n throw new Error('Invalid vector object');\n }\n\n if(!isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const predicate = obj['_'];\n let isBare = false;\n const constructorData: MTProtoConstructor = schema.constructors.find((c) => c.predicate === predicate);\n\n if(isBare = (type.charAt(0) === '%')) {\n type = type.substr(1);\n }\n\n if(!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n\n if(predicate === type) {\n isBare = true;\n }\n\n if(!isBare) {\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\n }\n\n const pFlags = obj.pFlags;\n const flagsOffsets: {[paramName: string]: number} = {};\n // console.log('storeObject', len, constructorData);\n for(const param of constructorData.params) {\n let type = param.type;\n\n // console.log('storeObject', param, type);\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n // console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\n\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\n // console.log('storeObject autocompleting', param.name, obj[param.name], type);\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n type = condType[1];\n }\n // console.log('storeObject', param, type);\n\n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n\n if(type === '#') {\n obj[param.name] = obj[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(const paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = obj[paramName];\n }\n\n return constructorData.type;\n }\n}\n\nclass TLDeserialization {\n private offset = 0; // in bytes\n private override: {[key: string]: (result: any, field: string) => void};\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n // this.debug =\n private mtproto: boolean = false;\n private debug: boolean;\n\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\n // buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\n if(buffer instanceof ArrayBuffer) {\n this.buffer = buffer;\n this.intView = new Int32Array(buffer);\n this.byteView = new Uint8Array(this.buffer);\n } else {\n this.buffer = buffer.buffer;\n this.intView = new Int32Array(buffer.buffer);\n this.byteView = buffer;\n }\n\n // console.log(this.intView);\n\n this.override = options.override || {};\n this.mtproto = !!options.mtproto;\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\n }\n\n /* public setMtproto(mtproto: boolean) {\n this.mtproto = mtproto;\n } */\n\n private readInt(field: string) {\n // if(this.offset >= this.intView.length * 4) {\n if((this.byteView.length - this.offset) < 4) {\n console.error(this.byteView, this.offset);\n throw new Error('Nothing to fetch: ' + field);\n }\n\n const i = this.intView[this.offset / 4];\n // const i = new Uint32Array(this.byteView.buffer.slice(this.offset, this.offset + 4))[0];\n\n this.debug &&/* || field.includes('[dialog][read_outbox_max_id]') */\n console.log('<<<', i.toString(16), i, field,\n this.byteView.slice(this.offset - 16, this.offset + 16),\n bytesToHex(this.byteView.slice(this.offset - 16, this.offset + 16)));\n\n this.offset += 4;\n\n return i;\n }\n\n public fetchInt(field?: string) {\n return this.readInt((field || '') + ':int');\n }\n\n public fetchDouble(field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n\n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n\n return doubleView[0];\n }\n\n // ! it should've been signed\n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n\n let ulong = ulongFromInts(iHigh, iLow);\n if(/* !unsigned && */!this.mtproto) { // make it signed\n ulong = bigIntToSigned(ulong);\n }\n\n if(!this.mtproto) {\n if(safeBigInt.greaterOrEquals(ulong.abs())) {\n // @ts-ignore\n return ulong.toJSNumber();\n }\n }\n\n // @ts-ignore\n return ulong.toString(10);\n }\n\n public fetchBool(field?: string): boolean {\n const i = this.readInt((field || '') + ':bool');\n if(i === boolTrue) {\n return true;\n } else if(i === boolFalse) {\n return false;\n }\n\n this.offset -= 4;\n return this.fetchObject('Object', field);\n }\n\n public fetchString(field?: string): string {\n let len = this.byteView[this.offset++];\n\n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n\n let sUTF8 = '';\n for(let i = 0; i < len; ++i) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n\n // Padding\n while(this.offset % 4) {\n ++this.offset;\n }\n\n let s: string;\n try {\n s = decodeURIComponent(escape(sUTF8));\n } catch(e) {\n s = sUTF8;\n }\n\n this.debug && console.log('<<<', s, (field || '') + ':string');\n\n return s;\n }\n\n public fetchBytes(field?: string) {\n let len = this.byteView[this.offset++];\n\n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n\n const bytes = this.byteView[sliceMethod](this.offset, this.offset + len);\n this.offset += len;\n\n // Padding\n while(this.offset % 4) {\n ++this.offset;\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\n\n return bytes;\n }\n\n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\n if(bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n\n const len = bits / 8;\n if(typed) {\n const result = this.byteView[sliceMethod](this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n\n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; ++i) {\n bytes[i] = this.byteView[this.offset++];\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\n\n return bytes;\n }\n\n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\n if(len === false) {\n len = this.readInt((field || '') + '_length');\n if(len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n\n if(typed) {\n const bytes = new Uint8Array(len);\n bytes.set(this.byteView[sliceMethod](this.offset, this.offset + len));\n this.offset += len;\n return bytes;\n }\n\n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; ++i) {\n bytes[i] = this.byteView[this.offset++];\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\n\n return bytes;\n }\n\n private fetchVector(type: string, field?: string) {\n const len = this.readInt(field + '[count]');\n const result: any[] = new Array(len);\n if(len > 0) {\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n for(let i = 0; i < len; ++i) {\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\n }\n }\n\n return result;\n }\n\n public fetchObject(type: string, field?: string): any {\n switch(type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, true, field);\n case 'int256':\n return this.fetchIntBytes(256, true, field);\n case 'int512':\n return this.fetchIntBytes(512, true, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n\n field = field || type || 'Object';\n\n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\n return this.fetchVector(type, field);\n }\n\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n let constructorData: MTProtoConstructor = null;\n let fallback = false;\n\n if(type.charAt(0) === '%') {\n const checkType = type.substr(1);\n constructorData = schema.constructors.find((c) => c.type === checkType);\n if(!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n constructorData = schema.constructors.find((c) => c.predicate === type);\n if(!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n } */ else {\n const constructorCmp = this.readInt(field + '[id]');\n\n if(constructorCmp === gzipPacked) { // Gzip packed\n const compressed = this.fetchBytes(field + '[packed_string]');\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\n\n return newDeserializer.fetchObject(type, field);\n }\n\n if(constructorCmp === vector) {\n return this.fetchVector(type, field);\n }\n\n let index = schema.constructorsIndex;\n if(!index) {\n schema.constructorsIndex = index = {};\n for(let i = 0, len = schema.constructors.length; i < len; ++i) {\n index[schema.constructors[i].id] = i;\n }\n }\n\n const i = index[constructorCmp];\n if(i !== undefined) {\n constructorData = schema.constructors[i];\n }\n\n if(!constructorData && this.mtproto) {\n const schemaFallback = Schema.API;\n for(let i = 0, len = schemaFallback.constructors.length; i < len; ++i) {\n if(+schemaFallback.constructors[i].id === constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n\n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n\n if(!constructorData) {\n console.error('Constructor not found:', constructorCmp);\n\n let int1: number, int2: number;\n try {\n int1 = this.fetchInt(field);\n int2 = this.fetchInt(field);\n } catch(err) {\n\n }\n\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\n }\n }\n\n const predicate = constructorData.predicate;\n\n const result: any = {'_': predicate};\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n if(this.override[overrideKey]) {\n this.override[overrideKey](result, field + '[' + predicate + ']');\n } else {\n for(let i = 0, len = constructorData.params.length; i < len; ++i) {\n const param = constructorData.params[i];\n let type = param.type;\n\n if(type === '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n\n const isCond = type.indexOf('?') !== -1;\n if(isCond) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\n continue;\n }\n\n type = condType[1];\n }\n\n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n\n if(isCond && type === 'true') {\n result.pFlags[param.name] = value;\n } else {\n result[param.name] = value;\n }\n }\n }\n\n if(fallback) {\n this.mtproto = true;\n }\n\n if(type === 'JSONValue') {\n return this.formatJSONValue(result);\n }\n\n return result;\n }\n\n private formatJSONValue(jsonValue: JSONValue): any {\n if(!jsonValue._) return jsonValue;\n switch(jsonValue._) {\n case 'jsonNull':\n return null;\n case 'jsonObject': {\n const out: any = {};\n const objectValues = jsonValue.value;\n for(let i = 0, length = objectValues.length; i < length; ++i) {\n const objectValue = objectValues[i];\n out[objectValue.key] = this.formatJSONValue(objectValue.value);\n }\n return out;\n }\n default:\n return jsonValue.value;\n }\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public setOffset(offset: number) {\n this.offset = offset;\n }\n\n /* public fetchEnd() {\n if(this.offset !== this.byteView.length) {\n throw new Error('Fetch end with non-empty buffer');\n }\n\n return true;\n } */\n}\n\nMOUNT_CLASS_TO.TLDeserialization = TLDeserialization;\nMOUNT_CLASS_TO.TLSerialization = TLSerialization;\nexport {TLDeserialization, TLSerialization};\n","// export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n// export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n // console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n // console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","import randomize from '../array/randomize';\nimport bufferConcats from './bufferConcats';\n\nexport default function addPadding(\n bytes: T,\n blockSize: number = 16,\n zeroes?: boolean,\n blockSizeAsTotalLength = false,\n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n // //console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n randomize(padding);\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport {NetworkerFactory} from './networkerFactory';\nimport {logger, LogTypes} from '../logger';\nimport {InvokeApiOptions} from '../../types';\nimport longToBytes from '../../helpers/long/longToBytes';\nimport MTTransport from './transports/transport';\nimport {nextRandomUint, randomLong} from '../../helpers/random';\nimport App from '../../config/app';\nimport DEBUG from '../../config/debug';\nimport Modes from '../../config/modes';\nimport noop from '../../helpers/noop';\n\n \nimport HTTP from './transports/http';\n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport bigInt from 'big-integer';\nimport {ConnectionStatus} from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport isObject from '../../helpers/object/isObject';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport sortLongsArray from '../../helpers/long/sortLongsArray';\nimport randomize from '../../helpers/array/randomize';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\nimport {getEnvironment} from '../../environment/utils';\nimport {TimeManager} from './timeManager';\n\n// console.error('networker included!', new Error().stack);\n\nexport type MTMessageOptions = InvokeApiOptions & Partial<{\n noResponse: true, // http_wait\n longPoll: true,\n\n notContentRelated: true, // ACK\n noSchedule: true,\n // withResult: true,\n messageId: MTLong,\n}>;\n\nexport type MTMessage = InvokeApiOptions & MTMessageOptions & {\n msg_id: MTLong,\n seq_no: number,\n body?: Uint8Array | number[],\n isAPI?: boolean,\n // only these four are important\n\n acked?: boolean,\n\n deferred?: CancellablePromise,\n\n container?: boolean,\n inner?: MTLong[],\n\n // below - options\n\n notContentRelated?: true,\n noSchedule?: true,\n\n resultType?: string,\n\n longPoll?: true,\n noResponse?: true, // only with http (http_wait for longPoll)\n};\n\nconst DRAIN_TIMEOUT = 10000;\nconst delays: {\n [k in 'client' | 'file']: {\n disconnectDelayMin: number,\n disconnectDelayMax: number,\n pingInterval: number,\n pingMaxTime: number,\n connectionTimeout: number\n }\n} = {\n client: {\n disconnectDelayMin: 7,\n disconnectDelayMax: 20,\n pingInterval: 2000,\n pingMaxTime: 5,\n connectionTimeout: 5000\n },\n file: {\n disconnectDelayMin: 10,\n disconnectDelayMax: 24,\n pingInterval: 3000,\n pingMaxTime: 7,\n connectionTimeout: 7500\n }\n};\nconst RESEND_OPTIONS: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true\n};\nlet invokeAfterMsgConstructor: number;\nlet networkerTempId = 0;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array = [];\n private pendingResendReq: MTLong[] = [];\n // private pendingResendAnsReq: MTLong[] = [];\n public connectionInited: boolean;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n\n \n private longPollInterval: number;\n private longPollPending: number;\n private checkConnectionRetryAt: number;\n private checkConnectionTimeout: number;\n private checkConnectionPeriod = 0;\n private sleepAfter: number;\n private offline = false;\n private sendingLongPoll: boolean;\n \n\n private seqNo: number;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n reqMsgId: MTLong,\n msgIds: MTPNetworker['pendingResendReq']\n };\n // private lastResendAnsReq: MTPNetworker['lastResendReq'];\n\n private name: string;\n private log: ReturnType;\n\n public isOnline = false;\n private status: ConnectionStatus = ConnectionStatus.Closed;\n private lastResponseTime = 0;\n\n private debug = DEBUG /* && false */ || Modes.debug;\n\n public activeRequests = 0;\n\n public onDrain: () => void;\n private onDrainTimeout: number;\n\n public transport: MTTransport;\n\n \n private pingDelayDisconnectDeferred: CancellablePromise;\n private pingPromise: Promise;\n // private pingInterval: number;\n private lastPingTime: number;\n private lastPingStartTime: number;\n private lastPingDelayDisconnectId: string;\n \n // public onConnectionStatusChange: (online: boolean) => void;\n\n // private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n private delays: typeof delays[keyof typeof delays];\n // private getNewTimeOffset: boolean;\n\n constructor(\n private networkerFactory: NetworkerFactory,\n private timeManager: TimeManager,\n public dcId: number,\n private authKey: Uint8Array,\n private authKeyId: Uint8Array,\n serverSalt: Uint8Array,\n options: InvokeApiOptions = {}\n ) {\n this.authKeyUint8 = convertToUint8Array(this.authKey);\n this.serverSalt = convertToUint8Array(serverSalt);\n\n this.isFileUpload = !!options.fileUpload;\n this.isFileDownload = !!options.fileDownload;\n this.isFileNetworker = this.isFileUpload || this.isFileDownload;\n this.delays = this.isFileNetworker ? delays.file : delays.client;\n\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n // this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name + (suffix ? '' : '-C') + '-' + networkerTempId++, LogTypes.Log/* | LogTypes.Debug */ | LogTypes.Error | LogTypes.Warn);\n this.log('constructor'/* , this.authKey, this.authKeyID, this.serverSalt */);\n\n // Test resend after bad_server_salt\n /* if(this.dcId === 2 && this.upload) {\n //timeManager.applyServerTime((Date.now() / 1000 - 86400) | 0);\n this.serverSalt[0] = 0;\n } */\n\n this.updateSession();\n\n // if(!NetworkerFactory.offlineInited) {\n // NetworkerFactory.offlineInited = true;\n // /* rootScope.offline = true\n // rootScope.offlineConnecting = true */\n // }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = randomize(new Uint8Array(8));\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n\n sentMessage.msg_id = this.timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n if(this.debug) {\n this.log(`updateSentMessage, old=${sentMessageId}, new=${sentMessage.msg_id}`);\n }\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n\n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n\n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n\n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n\n serializer.storeMethod(method, params);\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n\n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n\n return this.pushMessage(message, options);\n }\n\n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n\n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n\n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n\n if(!this.connectionInited) { // this will call once for each new session\n // /////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find((m) => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n\n const initConnection = Schema.API.methods.find((m) => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n\n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(getEnvironment().USER_AGENT || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(this.networkerFactory.language, 'lang_code');\n // serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n\n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find((m) => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n\n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n\n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n\n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n\n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n\n return this.pushMessage(message, options);\n }\n\n public changeTransport(transport?: MTTransport) {\n const oldTransport = this.transport;\n if(oldTransport) {\n oldTransport.destroy();\n\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n this.connectionInited = false;\n\n \n if(this.longPollInterval !== undefined) {\n clearInterval(this.longPollInterval);\n this.longPollInterval = undefined;\n }\n\n this.clearCheckConnectionTimeout();\n \n }\n\n this.log('change transport', transport, oldTransport);\n\n \n this.clearPingDelayDisconnect();\n\n // if(this.pingInterval !== undefined) {\n // clearInterval(this.pingInterval);\n // this.pingInterval = undefined;\n // }\n\n // this.clearPing();\n \n\n this.transport = transport;\n if(!transport) {\n return;\n }\n\n transport.networker = this;\n\n \n \n if(transport instanceof HTTP) {\n \n this.longPollInterval = ctx.setInterval(this.checkLongPoll, 10000);\n this.checkLongPoll();\n this.checkConnection('changed transport');\n \n }\n \n \n\n \n // * handle outcoming dead socket, server will close the connection\n if((transport as TcpObfuscated).connection) {\n // this.sendPingDelayDisconnect();\n\n if(transport.connected) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n // this.pingInterval = ctx.setInterval(this.sendPing, PING_INTERVAL);\n // this.sendPing();\n }\n \n\n this.resend();\n }\n\n public destroy() {\n this.log('destroy');\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n } else {\n this.resend();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n } else {\n this.checkConnection('force reconnect');\n }\n }\n\n /* private clearPing() {\n if(this.pingPromise) {\n this.pingPromise = undefined;\n }\n\n this.lastPingTime = undefined;\n }\n\n private sendPing = () => {\n // return;\n\n // if(!(this.transport as TcpObfuscated).connected) {\n // this.clearPing();\n // return;\n // }\n\n if(this.pingPromise) {\n return;\n }\n\n const startTime = Date.now();\n this.log('sendPing: ping', startTime);\n const promise = this.pingPromise = this.wrapMtpCall('ping', {\n ping_id: randomLong()\n }, {\n notContentRelated: true\n }).then(() => {\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.log('sendPing: pong', elapsedTime);\n\n setTimeout(() => {\n if(this.pingPromise !== promise) {\n return;\n }\n\n this.pingPromise = undefined;\n this.sendPing();\n }, Math.max(0, PING_INTERVAL - elapsedTime));\n });\n }; */\n\n private clearPingDelayDisconnect() {\n const deferred = this.pingDelayDisconnectDeferred;\n this.pingDelayDisconnectDeferred = undefined;\n this.lastPingDelayDisconnectId = undefined;\n\n if(deferred) {\n deferred.reject();\n }\n }\n\n private sendPingDelayDisconnect = () => {\n // return;\n\n if(this.pingDelayDisconnectDeferred || !this.transport || !this.transport.connected) return;\n\n /* if(!this.isOnline) {\n if((this.transport as TcpObfuscated).connected) {\n (this.transport as TcpObfuscated).connection.close();\n }\n\n return;\n } */\n\n const deferred = this.pingDelayDisconnectDeferred = deferredPromise();\n const delays = this.delays;\n const pingMaxTime = this.delays.pingMaxTime;\n const lastPingTime = Math.min(this.lastPingTime ?? 0, pingMaxTime);\n const disconnectDelay = Math.round(delays.disconnectDelayMin + lastPingTime / pingMaxTime * (delays.disconnectDelayMax - delays.disconnectDelayMin));\n const timeoutTime = disconnectDelay * 1000;\n const startTime = this.lastPingStartTime = Date.now();\n const pingId = this.lastPingDelayDisconnectId = randomLong();\n const options: MTMessageOptions = {notContentRelated: true};\n this.wrapMtpCall('ping_delay_disconnect', {\n ping_id: pingId,\n disconnect_delay: disconnectDelay\n }, options);\n\n const log = this.log.bindPrefix('sendPingDelayDisconnect');\n this.debug && log.debug(`ping, timeout=${timeoutTime}, lastPingTime=${this.lastPingTime}, msgId=${options.messageId}, pingId=${pingId}`);\n const rejectTimeout = ctx.setTimeout(deferred.reject, timeoutTime);\n\n const onResolved = (reason: string) => {\n clearTimeout(rejectTimeout);\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.debug && log.debug(`pong, reason='${reason}', time=${lastPingTime}, msgId=${options.messageId}`);\n if(elapsedTime > timeoutTime) {\n throw undefined;\n } else {\n return pause(Math.max(0, this.delays.pingInterval - elapsedTime/* timeoutTime - elapsedTime - PING_INTERVAL */));\n }\n };\n\n const onTimeout = () => {\n clearTimeout(rejectTimeout);\n const transport = this.transport as TcpObfuscated;\n if(this.pingDelayDisconnectDeferred !== deferred || !transport?.connection) {\n return;\n }\n\n log.error('catch, closing connection', this.lastPingTime, options.messageId);\n transport.connection.close();\n };\n\n const onFinally = () => {\n if(this.pingDelayDisconnectDeferred !== deferred) {\n return;\n }\n\n this.pingDelayDisconnectDeferred = undefined;\n this.sendPingDelayDisconnect();\n };\n\n deferred\n .then(onResolved)\n .catch(onTimeout)\n .finally(onFinally);\n };\n\n \n private checkLongPoll = () => {\n const isClean = this.cleanupSent();\n // this.log.error('Check lp', this.longPollPending, this.dcId, isClean, this);\n if((this.longPollPending && Date.now() < this.longPollPending) ||\n this.offline ||\n this.isStopped() ||\n this.isFileNetworker) {\n // this.log('No lp this time');\n return false;\n }\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(isClean && (\n baseDcId !== this.dcId ||\n (this.sleepAfter && Date.now() > this.sleepAfter)\n )) {\n // console.warn(dT(), 'Send long-poll for DC is delayed', this.dcId, this.sleepAfter);\n return;\n }\n\n this.sendLongPoll();\n });\n };\n\n private sendLongPoll() {\n if(this.sendingLongPoll) return;\n this.sendingLongPoll = true;\n const maxWait = 25000;\n\n this.longPollPending = Date.now() + maxWait;\n this.debug && this.log.debug('sendLongPoll', this.longPollPending);\n\n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n // notContentRelated: true,\n longPoll: true\n }).then(() => {\n this.longPollPending = undefined;\n setTimeout(this.checkLongPoll, 0);\n }, (error: ErrorEvent) => {\n this.log('Long-poll failed', error);\n }).finally(() => {\n this.sendingLongPoll = undefined;\n });\n }\n\n private checkConnection = (event: Event | string) => {\n this.debug && this.log('Check connection', event);\n this.clearCheckConnectionTimeout();\n\n if(!this.transport) {\n this.log.warn('No transport for checkConnection');\n return;\n }\n\n const serializer = new TLSerialization({mtproto: true});\n const pingId = randomLong();\n\n serializer.storeMethod('ping', {\n ping_id: pingId\n });\n\n const pingMessage = {\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes(true)\n };\n\n if(this.offline) {\n this.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.sendEncryptedRequest(pingMessage).then(() => {\n this.toggleOffline(false);\n }, () => {\n this.debug && this.log('Delay', this.checkConnectionPeriod * 1000);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from failed checkConnection request'), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(60, this.checkConnectionPeriod * 1.5);\n });\n };\n\n private clearCheckConnectionTimeout() {\n if(this.checkConnectionTimeout !== undefined) {\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = undefined;\n }\n }\n\n private toggleOffline(offline: boolean) {\n if(this.offline !== offline) {\n this.offline = offline;\n\n this.clearCheckConnectionTimeout();\n if(offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n if(this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n\n const delay = this.checkConnectionPeriod * 1000 | 0;\n this.checkConnectionRetryAt = Date.now() + delay;\n this.setConnectionStatus(ConnectionStatus.Closed, this.checkConnectionRetryAt);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from toggleOfline'), delay);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n\n \n \n \n \n } else {\n this.setConnectionStatus(ConnectionStatus.Connected);\n this.checkLongPoll();\n\n this.scheduleRequest();\n\n \n \n \n \n }\n }\n\n this.setConnectionStatus(offline ? ConnectionStatus.Closed : ConnectionStatus.Connected, offline ? this.checkConnectionRetryAt : undefined);\n }\n\n private handleSentEncryptedRequestHTTP(promise: ReturnType, message: MTMessage, noResponseMsgs: string[]) {\n // let timeout = setTimeout(() => {\n // this.log.error('handleSentEncryptedRequestHTTP timeout', promise, message, noResponseMsgs);\n // }, 5e3);\n\n promise.then((result) => {\n this.toggleOffline(false);\n // this.log('parse for', message);\n return this.parseResponse(result).then((response) => {\n this.debug && this.log.debug('Server response', response);\n\n this.processMessage(response.response, response.messageId, response.sessionId);\n\n this.checkLongPoll();\n this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod));\n\n return true;\n });\n }, (error) => {\n this.log.error('Encrypted request failed', error, message);\n\n this.pushResend(message.msg_id);\n this.toggleOffline(true);\n\n return false;\n }).then((shouldResolve) => {\n // clearTimeout(timeout);\n const sentMessages = this.sentMessages;\n noResponseMsgs.forEach((msgId) => {\n const sentMessage = sentMessages[msgId];\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n delete sentMessages[msgId];\n delete this.pendingMessages[msgId];\n shouldResolve ? deferred.resolve() : deferred.reject();\n }\n });\n });\n }\n \n\n // тут можно сделать таймаут и выводить дисконнект\n private pushMessage(message: {\n msg_id: string,\n seq_no: number,\n body: Uint8Array | number[],\n isAPI?: boolean\n }, options: MTMessageOptions) {\n let promise: CancellablePromise;\n if(!options.notContentRelated || options.noResponse) {\n promise = deferredPromise();\n }\n\n this.sentMessages[message.msg_id] = Object.assign(\n message,\n options,\n promise ? {deferred: promise} : undefined\n );\n\n // this.log.error('Networker pushMessage:', this.sentMessages[message.msg_id]);\n\n this.pendingMessages[message.msg_id] = 0;\n\n if(!options.noSchedule) {\n this.scheduleRequest();\n }\n\n if(isObject(options)) {\n options.messageId = message.msg_id;\n }\n\n return promise;\n }\n\n public attachPromise(promise: Promise, message: MTMessage) {\n const canIncrement = true;\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < this.delays.connectionTimeout) {\n return;\n }\n\n this.log.error('timeout', message);\n if(this.isOnline) {\n this.setConnectionStatus(ConnectionStatus.TimedOut);\n }\n\n /* this.getEncryptedOutput(message).then((bytes) => {\n this.log.error('timeout encrypted', bytes);\n }); */\n }, this.delays.connectionTimeout);\n\n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n if(canIncrement) {\n --this.activeRequests;\n this.setDrainTimeout();\n }\n });\n\n if(canIncrement) {\n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = ctx.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(this.networkerFactory.onConnectionStatusChange) {\n this.networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n if((this.transport as TcpObfuscated)?.connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n\n // this.getNewTimeOffset = true;\n }\n /* if(this.onConnectionStatusChange) {\n this.onConnectionStatusChange(this.isOnline);\n } */\n }\n\n private pushResend(messageId: string, delay = 100) {\n const value = delay ? Date.now() + delay : 0;\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage.container) {\n for(const innerMsgId of sentMessage.inner) {\n this.pendingMessages[innerMsgId] = value;\n }\n } else {\n this.pendingMessages[messageId] = value;\n }\n\n if(sentMessage.acked) {\n this.log.error('pushResend: acked message?', sentMessage);\n }\n\n if(this.debug) {\n this.log.debug('pushResend:', messageId, sentMessage, this.pendingMessages, delay);\n }\n\n this.scheduleRequest(delay);\n }\n\n // * correct, fully checked\n private async getMsgKey(dataWithPadding: Uint8Array, isOut: boolean) {\n const x = isOut ? 0 : 8;\n const msgKeyLargePlain = bufferConcats(this.authKeyUint8.subarray(88 + x, 88 + x + 32), dataWithPadding);\n\n const msgKeyLarge = await CryptoWorker.invokeCrypto('sha256', msgKeyLargePlain);\n const msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n };\n\n // * correct, fully checked\n private getAesKeyIv(msgKey: Uint8Array, isOut: boolean): Promise<[Uint8Array, Uint8Array]> {\n const x = isOut ? 0 : 8;\n const sha2aText = new Uint8Array(52);\n const sha2bText = new Uint8Array(52);\n const promises: Array> = [];\n\n sha2aText.set(msgKey, 0);\n sha2aText.set(this.authKeyUint8.subarray(x, x + 36), 16);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2aText));\n\n sha2bText.set(this.authKeyUint8.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n\n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n\n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n\n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return this.networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n if(this.isStopped()) {\n return false;\n }\n\n if(this.pendingAcks.length) {\n const ackMsgIds = this.pendingAcks.slice();\n\n // this.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIds\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n\n const pendingResendReqLength = this.pendingResendReq.length;\n if(pendingResendReqLength) {\n const options: MTMessageOptions = {...RESEND_OPTIONS};\n const msgIds = this.pendingResendReq.splice(0, pendingResendReqLength);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: msgIds\n }, options);\n\n this.log('resend: resending requests', options.messageId, msgIds);\n /* this.lastResendReq = {\n reqMsgId: options.messageId,\n msgIds: msgIds\n }; */\n\n // this.pendingResendReq.length = 0;\n }\n\n // if(this.pendingResendAnsReq.length) {\n // const options: MTMessageOptions = {...RESEND_OPTIONS};\n // const msgIds = this.pendingResendAnsReq.slice();\n // this.wrapMtpMessage({\n // _: 'msg_resend_ans_req',\n // msg_ids: msgIds\n // }, options);\n\n // this.log('resend: requesting answers', options.messageId, msgIds);\n // this.lastResendAnsReq = {\n // reqMsgId: options.messageId,\n // msgIds: msgIds\n // };\n\n // // this.pendingResendAnsReq.length = 0;\n // }\n\n let outMessage: MTMessage;\n const messages: typeof outMessage[] = [];\n\n // const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n let hasApiCall = false;\n let hasHttpWait = false;\n \n\n let lengthOverflow = false;\n\n // * Сюда никогда не попадут контейнеры, так как их не будет в pendingMessages\n const keys = sortLongsArray(Object.keys(this.pendingMessages));\n for(const messageId of keys) {\n // const value = this.pendingMessages[messageId];\n\n // if(!value || value <= currentTime) {\n const message = this.sentMessages[messageId];\n if(message && message.body) {\n /* if(message.fileUpload) {\n this.log('performScheduledRequest message:', message, message.body.length, (message.body as Uint8Array).byteLength, (message.body as Uint8Array).buffer.byteLength);\n } */\n\n const messageByteLength = message.body.length + 32;\n\n if((messagesByteLen + messageByteLength) > 655360) { // 640 Kb\n this.log.warn('lengthOverflow', message, messages);\n lengthOverflow = true;\n\n if(outMessage) { // if it's not a first message\n break;\n }\n }\n\n messages.push(message);\n messagesByteLen += messageByteLength;\n\n \n if(message.isAPI) {\n hasApiCall = true;\n } else if(message.longPoll) {\n hasHttpWait = true;\n }\n \n\n outMessage = message;\n } else {\n // this.log(message, messageId)\n }\n\n delete this.pendingMessages[messageId];\n // }\n }\n\n \n \n if(this.transport instanceof HTTP)\n \n if(hasApiCall && !hasHttpWait) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n\n messages.push({\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes(true)\n });\n }\n \n\n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n\n \n const noResponseMsgs: Array = messages.filter((message) => message.noResponse).map((message) => message.msg_id);\n \n\n if(messages.length > 1) {\n const container = this.generateContainerMessage(messagesByteLen, messages);\n outMessage = container.messageWithBody;\n\n this.sentMessages[outMessage.msg_id] = container.message;\n } else {\n this.sentMessages[outMessage.msg_id] = outMessage;\n }\n\n this.pendingAcks = [];\n\n const promise = this.sendEncryptedRequest(outMessage);\n\n \n \n if(this.transport instanceof HTTP)\n \n this.handleSentEncryptedRequestHTTP(promise, outMessage, noResponseMsgs);\n \n\n \n \n if(!(this.transport instanceof HTTP))\n \n this.cleanupSent(); // ! WARNING\n \n\n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message)\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n\n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n\n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */randomize(new Uint8Array(paddingLength))/* .fill(0) */;\n /* const padding = [167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157,\n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150,\n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28, 167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157,\n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150,\n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28].slice(0, paddingLength); */\n\n // (message as any).padding = padding;\n\n const dataWithPadding = bufferConcats(dataBuffer, padding);\n // this.log('Adding padding', dataBuffer, padding, dataWithPadding)\n // this.log('auth_key_id', bytesToHex(self.authKeyID))\n\n /* if(dataWithPadding.byteLength % 16) {\n this.log.error('aaa', dataWithPadding, paddingLength);\n }\n\n if(message.fileUpload) {\n this.log('Send encrypted: body length:', (message.body as ArrayBuffer).byteLength, paddingLength, dataWithPadding);\n } */\n\n // * full next block is correct\n return this.getEncryptedMessage(dataWithPadding).then((encryptedResult) => {\n /* if(DEBUG) {\n this.log('Got encrypted out message', encryptedResult);\n } */\n\n const request = new TLSerialization({\n startMaxLength: encryptedResult.bytes.length + 256\n });\n request.storeIntBytes(this.authKeyId, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n\n const requestData = request.getBytes(true);\n\n // if(this.isFileNetworker) {\n // //this.log('Send encrypted: requestData length:', requestData.length, requestData.length % 16, paddingLength % 16, paddingLength, data.offset, encryptedResult.msgKey.length % 16, encryptedResult.bytes.length % 16);\n // //this.log('Send encrypted: messageId:', message.msg_id, requestData.length);\n // //this.log('Send encrypted:', message, new Uint8Array(bufferConcat(des.buffer, padding)), requestData, this.serverSalt.hex, this.sessionId.hex/* new Uint8Array(des.buffer) */);\n // this.debugRequests.push({before: new Uint8Array(bufferConcat(des.buffer, padding)), after: requestData});\n // }\n\n return requestData;\n });\n }\n\n private async sendEncryptedRequest(message: MTMessage) {\n const requestData = await this.getEncryptedOutput(message);\n\n if(!this.transport) {\n this.log.error('trying to send something when offline', this.transport, this);\n }\n\n this.debug && this.log.debug('sending:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise = this.transport ? this.transport.send(requestData) as any : Promise.reject({});\n // this.debug && this.log.debug('sendEncryptedRequest: launched message into space:', message, promise);\n\n \n \n \n\n \n if(!(this.transport instanceof HTTP)) return promise;\n \n\n const baseError: ApiError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n // @ts-ignore\n transport: this.transport\n };\n\n return promise.then((result) => {\n if(!result?.byteLength) {\n throw baseError;\n }\n\n // this.debug && this.log.debug('sendEncryptedRequest: got response for:', message, [message.msg_id].concat(message.inner || []));\n return result;\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n\n throw error;\n });\n \n }\n\n public parseResponse(responseBuffer: Uint8Array) {\n // const perf = performance.now();\n /* if(this.debug) {\n this.log.debug('Start parsing response', responseBuffer);\n } */\n\n this.lastResponseTime = Date.now();\n\n const deserializer = new TLDeserialization(responseBuffer);\n\n const authKeyId = deserializer.fetchIntBytes(64, true, 'auth_key_id');\n if(!bytesCmp(authKeyId, this.authKeyId)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + bytesToHex(authKeyId));\n }\n\n const msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n const encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n\n return this.getDecryptedMessage(msgKey, encryptedData).then((dataWithPadding) => {\n // this.log('after decrypt')\n return this.getMsgKey(dataWithPadding, false).then((calcMsgKey) => {\n if(!bytesCmp(msgKey, calcMsgKey)) {\n this.log.warn('[MT] msg_keys', msgKey, calcMsgKey);\n this.updateSession(); // fix 28.01.2020\n throw new Error('[MT] server msgKey mismatch, updating session');\n }\n // this.log('after msgKey check')\n\n let deserializer = new TLDeserialization(dataWithPadding, {mtproto: true});\n\n /* const salt = */deserializer.fetchIntBytes(64, true, 'salt'); // need\n const sessionId = deserializer.fetchIntBytes(64, true, 'session_id');\n const messageId = deserializer.fetchLong('message_id');\n\n if(!bytesCmp(sessionId, this.sessionId) &&\n (!this.prevSessionId || !bytesCmp(sessionId, this.prevSessionId))) {\n this.log.warn('Sessions', sessionId, this.sessionId, this.prevSessionId, dataWithPadding);\n // this.updateSession();\n // this.sessionID = sessionID;\n throw new Error('[MT] Invalid server session_id: ' + bytesToHex(sessionId));\n }\n\n const seqNo = deserializer.fetchInt('seq_no');\n\n const totalLength = dataWithPadding.byteLength;\n\n const messageBodyLength = deserializer.fetchInt('message_data[length]');\n let offset = deserializer.getOffset();\n\n if((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n const messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n\n offset = deserializer.getOffset();\n const paddingLength = totalLength - offset;\n if(paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n\n // let buffer = bytesToArrayBuffer(messageBody);\n deserializer = new TLDeserialization(/* buffer */messageBody, {\n mtproto: true,\n override: {\n mt_message: (result: any, field: string) => {\n result.msg_id = deserializer.fetchLong(field + '[msg_id]');\n result.seqno = deserializer.fetchInt(field + '[seqno]');\n result.bytes = deserializer.fetchInt(field + '[bytes]');\n\n const offset = deserializer.getOffset();\n\n // self.log('mt_message!!!!!', result, field);\n\n try {\n result.body = deserializer.fetchObject('Object', field + '[body]');\n } catch(e) {\n this.log.error('parse error', (e as Error).message, (e as Error).stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n\n if(deserializer.getOffset() !== offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // this.log(result)\n deserializer.setOffset(offset + result.bytes);\n }\n // this.log('override message', result)\n },\n mt_rpc_result: (result: any, field: any) => {\n result.req_msg_id = deserializer.fetchLong(field + '[req_msg_id]');\n\n const sentMessage = this.sentMessages[result.req_msg_id];\n const type = sentMessage && sentMessage.resultType || 'Object';\n\n if(result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n\n // deserializer.setMtproto(false);\n result.result = deserializer.fetchObject(type, field + '[result]');\n // deserializer.setMtproto(true);\n // self.log(dT(), 'override rpc_result', sentMessage, type, result);\n }\n }\n });\n\n const response = deserializer.fetchObject('', 'INPUT');\n // this.log.error('Parse response time:', performance.now() - perf);\n return {\n response,\n messageId,\n sessionId,\n seqNo\n };\n });\n });\n }\n\n private applyServerSalt(newServerSalt: string) {\n const serverSalt = longToBytes(newServerSalt);\n\n sessionStorage.set({\n ['dc' + this.dcId + '_server_salt']: bytesToHex(serverSalt)\n });\n\n this.serverSalt = new Uint8Array(serverSalt);\n }\n\n // ! таймаут очень сильно тормозит скорость работы сокета (даже нулевой)\n public scheduleRequest(delay?: number) {\n /* if(!this.isOnline) {\n return;\n } */\n\n \n \n if(this.transport instanceof HTTP) {\n \n if(this.offline) {\n this.checkConnection('forced schedule');\n }\n\n delay ||= 0; // set zero timeout to pack other messages too\n \n }\n \n \n\n const nextReq = Date.now() + (delay || 0);\n if(this.nextReq && (delay === undefined || this.nextReq <= nextReq)) {\n // this.debug && this.log('scheduleRequest: nextReq', this.nextReq, nextReq);\n return;\n }\n\n // this.debug && this.log('scheduleRequest: delay', delay);\n\n /* if(this.nextReqTimeout) {\n return;\n } */\n\n // const perf = performance.now();\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n }\n\n const cb = () => {\n // this.debug && this.log('scheduleRequest: timeout delay was:', performance.now() - perf);\n\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n \n \n if(this.transport instanceof HTTP)\n \n if(this.offline) {\n // this.log('Cancel scheduled');\n return;\n }\n \n\n this.performScheduledRequest();\n };\n\n this.nextReq = nextReq;\n\n if(delay !== undefined) {\n this.nextReqTimeout = ctx.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n let delay: number;\n\n \n \n if(this.transport instanceof HTTP)\n \n delay = 30000;\n \n\n this.scheduleRequest(delay);\n }\n\n private reqResend(msgId: MTLong/* , isAnswer?: boolean */) {\n if(this.debug) {\n this.log.debug('Req resend', msgId/* , isAnswer */);\n }\n\n // (isAnswer ? this.pendingResendAnsReq : this.pendingResendReq).push(msgId);\n this.pendingResendReq.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n const sentMessages = this.sentMessages;\n // this.log('clean start', this.dcId/*, sentMessages*/)\n Object.keys(sentMessages).forEach((msgId) => {\n const message = sentMessages[msgId];\n\n // this.log('clean iter', msgID, message)\n if(message.notContentRelated && this.pendingMessages[msgId] === undefined) {\n // this.log('clean notContentRelated', msgID)\n delete sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n\n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n // delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}): ApiError {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n\n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] as any || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n const sentMessages = this.sentMessages;\n for(const id in sentMessages) {\n const msg = sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n\n if((this.transport as TcpObfuscated).connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n }\n\n /* public requestMessageStatus() {\n const ids: string[] = [];\n for(const id in this.sentMessages) {\n const message = this.sentMessages[id];\n if(message.isAPI && message.fileUpload) {\n ids.push(message.msg_id);\n }\n }\n\n this.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: ids\n }, {\n notContentRelated: true\n }).then((res) => {\n this.log('status', res);\n });\n } */\n\n private applyServerTime(messageId: string) {\n const serverTime = bigInt(messageId).shiftRight(32).toJSNumber();\n this.log('applying server time', serverTime);\n return this.timeManager.applyServerTime(serverTime);\n }\n\n // * https://core.telegram.org/mtproto/service_messages_about_messages#notice-of-ignored-error-message\n public processMessage(message: any, messageId: MTLong, sessionId: Uint8Array | number[]) {\n if(message._ === 'messageEmpty') {\n this.log.warn('processMessage: messageEmpty', message, messageId);\n return;\n }\n\n // messageId = messageId.toString();\n\n const msgidInt = parseInt(messageId.substr(0, -10), 10);\n if(msgidInt % 2) {\n this.log.warn('Server even message id: ', messageId, message);\n return;\n }\n\n if(this.debug) {\n this.log.debug('process message', message, messageId);\n }\n\n if(this.pingDelayDisconnectDeferred) {\n this.pingDelayDisconnectDeferred.resolve('any message');\n }\n\n // let changedTimeOffset: boolean;\n // if(this.getNewTimeOffset) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // this.getNewTimeOffset = undefined;\n // }\n\n switch(message._) {\n case 'msg_container': {\n for(const innerMessage of message.messages) {\n this.processMessage(innerMessage, innerMessage.msg_id, sessionId);\n }\n\n break;\n }\n\n case 'bad_server_salt': {\n this.log('Bad server salt', message);\n\n this.applyServerSalt(message.new_server_salt);\n\n if(this.sentMessages[message.bad_msg_id]) {\n this.pushResend(message.bad_msg_id);\n }\n\n this.ackMessage(messageId);\n\n // simulate disconnect\n /* try {\n this.log('networker state:', this);\n // @ts-ignore\n this.transport.ws.close(1000);\n } catch(err) {\n this.log.error('transport', this.transport, err);\n } */\n\n break;\n }\n\n case 'bad_msg_notification': {\n this.log.error('Bad msg notification', message);\n\n switch(message.error_code) {\n case 16: // * msg_id too low\n case 17: // * msg_id too high\n case 32: // * msg_seqno too low\n case 33: // * msg_seqno too high\n case 64: { // * invalid container\n // if(changedTimeOffset === undefined) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // }\n\n const changedTimeOffset = this.applyServerTime(messageId);\n if(message.error_code === 17 || changedTimeOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n // this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n\n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n\n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n // this.updateSession();\n\n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && this.networkerFactory.updatesProcessor) {\n this.networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n\n case 'msgs_ack': {\n this.debug && this.log('got acks', message.msg_ids);\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n\n case 'msg_detailed_info': {\n const sentMessage = this.sentMessages[message.msg_id];\n if(!sentMessage) {\n this.ackMessage(message.answer_msg_id);\n break;\n }/* else if(sentMessage.acked) {\n this.reqResend(message.answer_msg_id, true);\n }\n\n break; */\n }\n\n case 'msg_new_detailed_info': {\n if(this.pendingAcks.indexOf(message.answer_msg_id) !== -1) {\n break;\n }\n\n this.reqResend(message.answer_msg_id);\n break;\n }\n\n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n const arr = [\n [this.lastResendReq, this.pendingResendReq] as const\n // [this.lastResendAnsReq, this.pendingResendAnsReq] as const\n ];\n\n for(const [lastResend, pendingResend] of arr) {\n if(lastResend?.reqMsgId === message.req_msg_id && pendingResend.length) {\n for(const badMsgId of lastResend.msgIds) {\n const pos = pendingResend.indexOf(badMsgId);\n if(pos !== -1) {\n pendingResend.splice(pos, 1);\n }\n }\n }\n }\n\n break;\n }\n\n case 'rpc_result': {\n this.ackMessage(messageId);\n\n const sentMessageId = message.req_msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n if(this.debug) {\n this.log('Rpc response', message.result, sentMessage);\n }\n\n this.processMessageAck(sentMessageId);\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n if(message.result._ === 'rpc_error') {\n const error = this.processError(message.result);\n this.log('Rpc error', error);\n if(deferred) {\n deferred.reject(error);\n }\n } else {\n if(deferred) {\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n }\n }\n\n delete this.sentMessages[sentMessageId];\n } else {\n if(this.debug) {\n this.log('Rpc result for unknown message:', sentMessageId, message);\n }\n }\n\n break;\n }\n\n case 'pong': { // * https://core.telegram.org/mtproto/service_messages#ping-messages-pingpong - These messages don't require acknowledgments\n /* const sentMessageId = message.msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n if(sentMessage) {\n sentMessage.deferred.resolve(message);\n delete this.sentMessages[sentMessageId];\n } */\n const pingId = message.ping_id;\n if(this.lastPingDelayDisconnectId === pingId) {\n const deferred = this.pingDelayDisconnectDeferred;\n if(deferred) {\n deferred.resolve('pong');\n } else {\n this.log('ping deferred deleted', pingId);\n }\n }\n\n break;\n }\n\n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n\n if(this.networkerFactory.updatesProcessor !== null) {\n this.networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","import bigInt from 'big-integer';\n\nexport default function sortLongsArray(arr: string[]) {\n return arr.map((long) => {\n return bigInt(long);\n }).sort((a, b) => {\n return a.compare(b);\n }).map((bigInt) => {\n return bigInt.toString(10);\n });\n}\n","import addPadding from '../bytes/addPadding';\nimport bigInt from 'big-integer';\nimport {bigIntToBytes} from '../bigInt/bigIntConversion';\n\nexport default function longToBytes(sLong: string) {\n const bigIntBytes = bigIntToBytes(bigInt(sLong)).reverse();\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n // console.log('longToBytes', bytes, bigIntBytes);\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {ConnectionStatusChange} from './connectionStatus';\nimport MTPNetworker from './networker';\nimport {InvokeApiOptions} from '../../types';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {AppManager} from '../appManagers/manager';\n\nexport class NetworkerFactory extends AppManager {\n private networkers: MTPNetworker[] = [];\n public language = navigator.language || App.langPackCode;\n public updatesProcessor: (obj: any) => void = null;\n // public onConnectionStatusChange: (status: ConnectionStatusChange) => void = null;\n public akStopped = false;\n\n public onConnectionStatusChange(status: ConnectionStatusChange) {\n this.rootScope.dispatchEvent('connection_status_change', status);\n // ({type: 'connectionStatusChange', payload: status});\n }\n\n public removeNetworker(networker: MTPNetworker) {\n indexOfAndSplice(this.networkers, networker);\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n }\n\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\n // console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\n const networker = new MTPNetworker(this, this.timeManager, dcId, authKey, authKeyId, serverSalt, options);\n this.networkers.push(networker);\n return networker;\n }\n\n public startAll() {\n if(this.akStopped) {\n const stoppedNetworkers = this.networkers.filter((networker) => networker.isStopped());\n\n this.akStopped = false;\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\n\n for(const networker of stoppedNetworkers) {\n networker.scheduleRequest();\n }\n }\n }\n\n public stopAll() {\n this.akStopped = true;\n }\n\n public setLanguage(langCode: string) {\n this.language = langCode;\n for(const networker of this.networkers) {\n if(!networker.isFileNetworker) {\n networker.connectionInited = false;\n }\n }\n }\n\n public unsetConnectionInited() {\n for(const networker of this.networkers) {\n networker.connectionInited = false;\n }\n }\n\n public forceReconnectTimeout() {\n for(const networker of this.networkers) {\n networker.forceReconnectTimeout();\n }\n }\n\n public forceReconnect() {\n for(const networker of this.networkers) {\n if(!networker.isFileNetworker) {\n networker.forceReconnect();\n break;\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {TLSerialization} from './tl_utils';\nimport cryptoWorker from '../crypto/cryptoMessagePort';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport bigInt from 'big-integer';\n\nexport type RSAPublicKeyHex = {\n modulus: string,\n exponent: string\n};\n\nexport class RSAKeysManager {\n /**\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\n *\n *\n * -----BEGIN RSA PUBLIC KEY-----\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\n * -----END RSA PUBLIC KEY-----\n *\n * -----BEGIN RSA PUBLIC KEY-----\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\n * -----END RSA PUBLIC KEY-----\n *\n * Bytes can be got via\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\n * $ openssl rsa -pubin -in pub.pem -text -noout\n */\n\n /* private publisKeysHex = [{\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\n exponent: '010001'\n }, {\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\n exponent: '010001'\n }, {\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\n exponent: '010001'\n }, {\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\n exponent: '010001'\n }, {\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\n exponent: '010001'\n }]; */\n\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\n exponent: '010001'\n }];\n\n private publisKeysHex: RSAPublicKeyHex[] = [{\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\n exponent: '010001'\n }];\n\n private publicKeysParsed: {\n [hex: string]: RSAPublicKeyHex\n } = {};\n private prepared = false;\n private preparePromise: Promise = null;\n\n constructor() {\n if(Modes.test) {\n this.publisKeysHex = this.testPublicKeysHex;\n }\n }\n\n public prepare(): Promise {\n if(this.preparePromise) return this.preparePromise;\n else if(this.prepared) {\n return Promise.resolve();\n }\n\n return this.preparePromise = Promise.all(this.publisKeysHex.map((keyParsed) => {\n const RSAPublicKey = new TLSerialization();\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\n\n const buffer = RSAPublicKey.getBuffer();\n\n return cryptoWorker.invokeCrypto('sha1', buffer).then((bytes) => {\n const fingerprintBytes = bytes.slice(-8);\n fingerprintBytes.reverse();\n\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\n modulus: keyParsed.modulus,\n exponent: keyParsed.exponent\n };\n });\n })).then(() => {\n this.prepared = true;\n\n // console.log('[MT] Prepared keys');\n this.preparePromise = null;\n });\n }\n\n public async select(fingerprints: Array) {\n await this.prepare();\n\n for(let i = 0; i < fingerprints.length; ++i) {\n let fingerprintHex = bigInt(fingerprints[i]).toString(16).toLowerCase();\n\n if(fingerprintHex.length < 16) {\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\n }\n\n // console.log(fingerprintHex, this.publicKeysParsed);\n const foundKey = this.publicKeysParsed[fingerprintHex];\n if(foundKey) {\n return Object.assign({\n fingerprint: fingerprints[i]\n }, foundKey);\n }\n }\n }\n}\n\nexport default new RSAKeysManager();\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from './transports/controller';\n \n\nimport {TLSerialization, TLDeserialization} from './tl_utils';\nimport {TransportType} from './dcConfigurator';\nimport rsaKeysManager from './rsaKeysManager';\n\nimport CryptoWorker from '../crypto/cryptoMessagePort';\n\nimport {logger, LogTypes} from '../logger';\nimport DEBUG from '../../config/debug';\nimport {Awaited, DcId} from '../../types';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport bytesXor from '../../helpers/bytes/bytesXor';\nimport {bigIntFromBytes} from '../../helpers/bigInt/bigIntConversion';\nimport bigInt from 'big-integer';\nimport randomize from '../../helpers/array/randomize';\nimport {AppManager} from '../appManagers/manager';\n\n/* let fNewNonce: any = bytesFromHex('8761970c24cb2329b5b2459752c502f3057cb7e8dbab200e526e8767fdc73b3c').reverse();\nlet fNonce: any = bytesFromHex('b597720d11faa5914ef485c529cde414').reverse();\nlet fResult: any = new Uint8Array(bytesFromHex('000000000000000001b473a0661b285e480000006324160514e4cd29c585f44e91a5fa110d7297b5c0c4134c84893db5715ecd56af5ed618082182053cc5de91cd00000015c4b51c02000000a5b7f709355fc30b216be86c022bb4c3'));\n\nfNewNonce = false;\nfNonce = false;\nfResult = false; */\n\ntype AuthOptions = {\n dcId: number,\n nonce: Uint8Array,\n\n serverNonce?: Uint8Array,\n pq?: Uint8Array,\n fingerprints?: string[],\n publicKey?: {\n modulus: string,\n exponent: string,\n fingerprint: string\n },\n\n // good\n p?: Uint8Array,\n q?: Uint8Array,\n\n newNonce?: Uint8Array,\n\n retry?: number,\n\n b?: Uint8Array,\n g?: number,\n gA?: Uint8Array,\n dhPrime?: Uint8Array,\n\n tmpAesKey?: Uint8Array,\n tmpAesIv?: Uint8Array,\n\n authKeyId?: Uint8Array,\n authKey?: Uint8Array,\n serverSalt?: Uint8Array,\n\n localTime?: number,\n serverTime?: any,\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer extends AppManager {\n private cached: {\n [dcId: DcId]: Promise\n };\n\n private log: ReturnType;\n\n private transportType: TransportType;\n\n \n private getTransportTypePromise: Promise;\n \n\n protected after() {\n this.cached = {};\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n\n private sendPlainRequest(dcId: DcId, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n\n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(this.timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n\n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = this.dcConfigurator.chooseServer(dcId, 'client', this.transportType);\n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE'\n };\n\n if(DEBUG) {\n this.log('mtpSendPlainRequest: creating requestPromise');\n }\n\n const promise = transport.send(resultArray) as any as Promise;\n return promise.then((result) => {\n if(DEBUG) {\n this.log('mtpSendPlainRequest: in good sector', result);\n }\n\n if(!result || !result.byteLength) {\n throw baseError;\n }\n\n try {\n /* result = fResult ? fResult : result;\n fResult = new Uint8Array(0); */\n\n const deserializer = new TLDeserialization(result, {mtproto: true});\n\n if(result.length === 4) {\n const errorCode = deserializer.fetchInt();\n this.log.error('mtpSendPlainRequest: wrong response, error code:', errorCode);\n throw errorCode;\n }\n\n const auth_key_id = deserializer.fetchLong('auth_key_id');\n if(auth_key_id !== '0') this.log.error('auth_key_id !== 0', auth_key_id);\n\n const msg_id = deserializer.fetchLong('msg_id');\n if(msg_id === '0') this.log.error('msg_id === 0', msg_id);\n\n const msg_len = deserializer.fetchInt('msg_len');\n if(!msg_len) this.log.error('no msg_len', msg_len);\n\n return deserializer;\n } catch(e) {\n this.log.error('mtpSendPlainRequest: deserialization went bad', e);\n const error = Object.assign(baseError, {originalError: e});\n throw error;\n }\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n\n throw error;\n });\n }\n\n private async sendReqPQ(auth: AuthOptions) {\n const request = new TLSerialization({mtproto: true});\n\n request.storeMethod('req_pq_multi', {nonce: auth.nonce});\n\n if(DEBUG) {\n this.log('Send req_pq', bytesToHex(auth.nonce));\n }\n\n let deserializer: Awaited>;\n try {\n const promise = this.sendPlainRequest(auth.dcId, request.getBytes(true));\n rsaKeysManager.prepare();\n deserializer = await promise;\n } catch(error) {\n this.log.error('req_pq error', (error as Error).message);\n throw error;\n }\n\n const response: ResPQ = deserializer.fetchObject('ResPQ');\n\n if(response._ !== 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n this.log.error(auth.nonce, response.nonce);\n throw new Error('[MT] resPQ nonce mismatch');\n }\n\n auth.serverNonce = response.server_nonce; // need\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n\n if(DEBUG) {\n this.log('Got ResPQ', bytesToHex(auth.serverNonce), bytesToHex(auth.pq), auth.fingerprints);\n }\n\n const publicKey = await rsaKeysManager.select(auth.fingerprints);\n if(!publicKey) {\n throw new Error('[MT] No public key found');\n }\n\n auth.publicKey = publicKey;\n\n if(DEBUG) {\n this.log('PQ factorization start', auth.pq);\n }\n\n // let pAndQ: Awaited>;\n try {\n var pAndQ = await CryptoWorker.invokeCrypto('factorize', auth.pq);\n } catch(error) {\n this.log.error('worker error factorize', error);\n throw error;\n }\n\n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n\n if(DEBUG) {\n this.log('PQ factorization done', pAndQ);\n }\n\n return this.sendReqDhParams(auth);\n }\n\n private async sendReqDhParams(auth: AuthOptions): Promise {\n auth.newNonce = randomize(new Uint8Array(32));\n\n const p_q_inner_data_dc: P_Q_inner_data = {\n _: 'p_q_inner_data_dc',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce,\n dc: 0\n };\n\n const pQInnerDataSerialization = new TLSerialization({mtproto: true});\n pQInnerDataSerialization.storeObject(p_q_inner_data_dc, 'P_Q_inner_data', 'DECRYPTED_DATA');\n\n const data = pQInnerDataSerialization.getBytes(true);\n if(data.length > 144) {\n throw 'DH_params: data is more than 144 bytes!';\n }\n\n const dataWithPadding = addPadding(data, 192, false, true, false);\n const dataPadReversed = dataWithPadding.slice().reverse();\n\n const getKeyAesEncrypted = async() => {\n for(;;) {\n const tempKey = randomize(new Uint8Array(32));\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256', tempKey.concat(dataWithPadding)));\n if(dataWithHash.length !== 224) {\n throw 'DH_params: dataWithHash !== 224 bytes!';\n }\n\n const aesEncrypted = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, tempKey, new Uint8Array([0]));\n const tempKeyXor = bytesXor(tempKey, await CryptoWorker.invokeCrypto('sha256', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = bigIntFromBytes(keyAesEncrypted);\n const publicKeyModulusBigInt = bigInt(auth.publicKey.modulus, 16);\n\n if(keyAesEncryptedBigInt.compare(publicKeyModulusBigInt) === -1) {\n return keyAesEncrypted;\n }\n }\n };\n\n const keyAesEncrypted = await getKeyAesEncrypted();\n const encryptedData = addPadding(await CryptoWorker.invokeCrypto('rsa-encrypt', keyAesEncrypted, auth.publicKey), 256, true, true, true);\n\n const req_DH_params: req_DH_params = {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: encryptedData\n };\n\n const request = new TLSerialization({mtproto: true});\n request.storeMethod('req_DH_params', req_DH_params);\n\n const requestBytes = request.getBytes(true);\n\n if(DEBUG) {\n this.log('Send req_DH_params', req_DH_params/* , requestBytes.hex */);\n }\n\n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, requestBytes);\n } catch(error) {\n this.log.error('Send req_DH_params FAIL!', error);\n throw error;\n }\n\n const response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n\n if(DEBUG) {\n this.log('Sent req_DH_params, response:', response);\n }\n\n if(response._ !== 'server_DH_params_fail' && response._ !== 'server_DH_params_ok') {\n throw new Error('[MT] Server_DH_Params response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Server_DH_Params nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Server_DH_Params server_nonce mismatch');\n }\n\n if(response._ === 'server_DH_params_fail') {\n const newNonceHash = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce)).slice(-16);\n if(!bytesCmp(newNonceHash, response.new_nonce_hash)) {\n throw new Error('[MT] server_DH_params_fail new_nonce_hash mismatch');\n }\n\n throw new Error('[MT] server_DH_params_fail');\n }\n\n // fill auth object\n try {\n await this.decryptServerDhDataAnswer(auth, response.encrypted_answer);\n } catch(e) {\n this.log.error('mtpDecryptServerDhDataAnswer FAILED!', e);\n throw e;\n }\n\n // console.log(dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n\n return this.sendSetClientDhParams(auth);\n }\n\n private async decryptServerDhDataAnswer(auth: AuthOptions, encryptedAnswer: any) {\n auth.localTime = Date.now();\n\n // ! can't concat Array with Uint8Array!\n auth.tmpAesKey = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n\n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.newNonce)), auth.newNonce.slice(0, 4));\n\n const answerWithHash = new Uint8Array(await CryptoWorker.invokeCrypto('aes-decrypt', encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv));\n\n const hash = answerWithHash.slice(0, 20);\n const answerWithPadding = answerWithHash.slice(20);\n\n const deserializer = new TLDeserialization(answerWithPadding, {mtproto: true});\n const response = deserializer.fetchObject('Server_DH_inner_data');\n\n if(response._ !== 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n\n if(DEBUG) {\n this.log('Done decrypting answer');\n }\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n\n this.verifyDhParams(auth.g, auth.dhPrime, auth.gA);\n\n const offset = deserializer.getOffset();\n\n if(!bytesCmp(hash, await CryptoWorker.invokeCrypto('sha1', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1 mismatch');\n }\n\n this.timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n\n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n\n const gABigInt = bigIntFromBytes(gA);\n const dhPrimeBigInt = bigInt(dhPrimeHex, 16);\n\n if(gABigInt.compare(bigInt.one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(gABigInt.compare(dhPrimeBigInt.subtract(bigInt.one)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n\n if(DEBUG) {\n this.log('1 < gA < dhPrime-1 OK');\n }\n\n const twoPow = bigInt(2).pow(2048 - 64);\n\n if(gABigInt.compare(twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(gABigInt.compare(dhPrimeBigInt.subtract(twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n\n if(DEBUG) {\n this.log('2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n }\n\n return true;\n }\n\n private async sendSetClientDhParams(auth: AuthOptions): Promise {\n const gBytes = bytesFromHex(auth.g.toString(16));\n\n auth.b = randomize(new Uint8Array(256));\n // MTProto.secureRandom.nextBytes(auth.b);\n\n // let gB: Awaited>;\n try {\n var gB = await CryptoWorker.invokeCrypto('mod-pow', gBytes, auth.b, auth.dhPrime);\n } catch(error) {\n throw error;\n }\n\n const data = new TLSerialization({mtproto: true});\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n\n const dataWithHash = (await CryptoWorker.invokeCrypto('sha1', data.getBuffer())).concat(data.getBytes(true));\n const encryptedData = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n\n const request = new TLSerialization({mtproto: true});\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n\n if(DEBUG) {\n this.log('Send set_client_DH_params');\n }\n\n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, request.getBytes(true));\n } catch(err) {\n throw err;\n }\n\n const response = deserializer.fetchObject('Set_client_DH_params_answer');\n\n if(response._ !== 'dh_gen_ok' && response._ !== 'dh_gen_retry' && response._ !== 'dh_gen_fail') {\n throw new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer server_nonce mismatch');\n }\n\n // let authKey: Uint8Array;\n try {\n var authKey = await CryptoWorker.invokeCrypto('mod-pow', auth.gA, auth.b, auth.dhPrime);\n } catch(err) {\n throw authKey;\n }\n\n const authKeyHash = await CryptoWorker.invokeCrypto('sha1', authKey),\n authKeyAux = authKeyHash.slice(0, 8),\n authKeyId = authKeyHash.slice(-8);\n\n if(DEBUG) {\n this.log('Got Set_client_DH_params_answer', response._, authKey);\n }\n switch(response._) {\n case 'dh_gen_ok': {\n const newNonceHash1 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([1], authKeyAux))).slice(-16);\n\n if(!bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n this.log.error('Set_client_DH_params_answer new_nonce_hash1 mismatch', newNonceHash1, response);\n throw new Error('new_nonce_hash1 mismatch');\n }\n\n const serverSalt = bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n if(DEBUG) {\n this.log('Auth successfull!', authKeyId, authKey, serverSalt);\n }\n\n auth.authKeyId = authKeyId;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n\n return auth;\n }\n\n case 'dh_gen_retry': {\n const newNonceHash2 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([2], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch');\n }\n\n return this.sendSetClientDhParams(auth);\n }\n\n case 'dh_gen_fail': {\n const newNonceHash3 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([3], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch');\n }\n\n throw new Error('[MT] Set_client_DH_params_answer fail');\n }\n }\n }\n\n \n private getTransportType() {\n if(this.getTransportTypePromise) return this.getTransportTypePromise;\n return this.getTransportTypePromise = transportController.pingTransports().then(({websocket}) => {\n this.transportType = websocket ? 'websocket' : 'https';\n this.log('will use transport:', this.transportType);\n });\n }\n \n\n public auth(dcId: DcId) {\n let promise = this.cached[dcId];\n if(promise) {\n return promise;\n }\n\n promise = new Promise(async(resolve, reject) => {\n \n await this.getTransportType();\n \n\n let error: ApiError;\n let _try = 1;\n while(_try++ <= 3) {\n try {\n const auth: AuthOptions = {\n dcId,\n nonce: randomize(new Uint8Array(16))\n };\n\n const promise = this.sendReqPQ(auth);\n resolve(await promise);\n return;\n } catch(err) {\n error = err;\n }\n }\n\n reject(error);\n });\n\n return this.cached[dcId] = promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport sessionStorage from '../sessionStorage';\nimport {nextRandomUint} from '../../helpers/random';\nimport {WorkerTaskVoidTemplate} from '../../types';\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\nimport {AppManager} from '../appManagers/manager';\n\n/*\nlet lol: any = {};\nfor(var i = 0; i < 100; i++) {\n timeManager.generateId();\n}\n*/\n\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\n type: 'applyServerTimeOffset',\n payload: TimeManager['timeOffset']\n};\n\nexport class TimeManager extends AppManager {\n private lastMessageId: [number, number];\n private timeOffset: number;\n\n /* private midnightNoOffset: number;\n private midnightOffseted: Date;\n\n private midnightOffset: number; */\n\n /* private timeParams: {\n midnightOffset: number,\n serverTimeOffset: number\n }; */\n\n protected after() {\n this.lastMessageId = [0, 0];\n this.timeOffset = 0;\n\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n\n\n // * migrated from ServerTimeManager\n /* const timestampNow = tsNow(true);\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\n this.midnightOffseted = new Date();\n this.midnightOffseted.setHours(0, 0, 0, 0);\n\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\n\n /* this.timeParams = {\n midnightOffset: this.midnightOffset,\n serverTimeOffset: this.serverTimeOffset\n }; */\n }\n\n public getServerTimeOffset() {\n return this.timeOffset;\n }\n\n public generateId(): string {\n const timeTicks = Date.now(),\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\n timeMSec = timeTicks % 1000,\n random = nextRandomUint(16);\n\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if(this.lastMessageId[0] > messageId[0] ||\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\n }\n\n this.lastMessageId = messageId;\n\n const ret = ulongFromInts(messageId[0], messageId[1]).toString(10);\n\n // if(lol[ret]) {\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\n // }\n // lol[ret] = true;\n\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\n\n return ret\n }\n\n public applyServerTime(serverTime: number, localTime?: number) {\n localTime = (localTime || Date.now()) / 1000 | 0;\n const newTimeOffset = serverTime - localTime;\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n this.lastMessageId = [0, 0];\n\n if(this.timeOffset !== newTimeOffset) {\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.timeOffset = newTimeOffset;\n }\n\n // console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n return changed;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {DocumentAttribute, WebDocument} from '../../layer';\n\nexport default class AppWebDocsManager {\n public saveWebDocument(webDocument: WebDocument) {\n if(!webDocument) {\n return;\n }\n\n const attribute: DocumentAttribute.documentAttributeImageSize = webDocument.attributes.find((attribute) => attribute._ === 'documentAttributeImageSize') as any;\n if(attribute) {\n webDocument.w = attribute.w;\n webDocument.h = attribute.h;\n }\n\n return webDocument;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputInvoice, InputPaymentCredentials, PaymentRequestedInfo, PaymentsPaymentForm} from '../../layer';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppPaymentsManager extends AppManager {\n public getInputInvoiceBySlug(slug: string): InputInvoice.inputInvoiceSlug {\n return {\n _: 'inputInvoiceSlug',\n slug\n };\n }\n\n public getInputInvoiceByPeerId(peerId: PeerId, mid: number): InputInvoice.inputInvoiceMessage {\n return {\n _: 'inputInvoiceMessage',\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n };\n }\n\n public getPaymentForm(invoice: InputInvoice) {\n return this.apiManager.invokeApi('payments.getPaymentForm', {\n invoice\n }).then((paymentForm) => {\n this.appUsersManager.saveApiUsers(paymentForm.users);\n\n return paymentForm;\n });\n }\n\n public getPaymentReceipt(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApi('payments.getPaymentReceipt', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((paymentForm) => {\n this.appUsersManager.saveApiUsers(paymentForm.users);\n\n return paymentForm;\n });\n }\n\n public validateRequestedInfo(invoice: InputInvoice, info: PaymentRequestedInfo, save?: boolean) {\n return this.apiManager.invokeApi('payments.validateRequestedInfo', {\n save,\n invoice,\n info\n });\n }\n\n public sendPaymentForm(\n invoice: InputInvoice,\n formId: PaymentsPaymentForm['form_id'],\n requestedInfoId: string,\n shippingOptionId: string,\n credentials: InputPaymentCredentials,\n tipAmount?: number\n ) {\n return this.apiManager.invokeApi('payments.sendPaymentForm', {\n form_id: formId,\n invoice,\n requested_info_id: requestedInfoId,\n shipping_option_id: shippingOptionId,\n credentials,\n tip_amount: tipAmount || undefined\n }).then((result) => {\n if(result._ === 'payments.paymentResult') {\n this.apiUpdatesManager.processUpdateMessage(result.updates);\n }\n\n return result;\n });\n }\n\n public clearSavedInfo(info?: boolean, credentials?: boolean) {\n return this.apiManager.invokeApi('payments.clearSavedInfo', {\n info,\n credentials\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MessageSendingParams} from './appMessagesManager';\nimport {AppManager} from './manager';\nimport {AttachMenuBots, AttachMenuBot, Update, DataJSON} from '../../layer';\nimport assumeType from '../../helpers/assumeType';\nimport makeError from '../../helpers/makeError';\nimport getAttachMenuBotIcon from './utils/attachMenuBots/getAttachMenuBotIcon';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppAttachMenuBotsManager extends AppManager {\n private attachMenuBots: Map;\n private attachMenuBotsArr: AttachMenuBot[];\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateAttachMenuBots: this.onUpdateAttachMenuBots\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n this.attachMenuBots.clear();\n this.attachMenuBotsArr = undefined;\n } else {\n this.attachMenuBots = new Map();\n }\n };\n\n private onUpdateAttachMenuBots = (update: Update.updateAttachMenuBots) => {\n this.clear();\n this.getAttachMenuBots();\n };\n\n public saveAttachMenuBot(attachMenuBot: AttachMenuBot) {\n this.attachMenuBots.set(attachMenuBot.bot_id, attachMenuBot);\n const icon = getAttachMenuBotIcon(attachMenuBot);\n icon.icon = this.appDocsManager.saveDoc(icon.icon, {type: 'attachMenuBotIcon', botId: attachMenuBot.bot_id});\n return attachMenuBot;\n }\n\n public saveAttachMenuBots(attachMenuBots: AttachMenuBot[]) {\n if((attachMenuBots as any).saved) return;\n (attachMenuBots as any).saved = true;\n attachMenuBots.forEach((user) => this.saveAttachMenuBot(user));\n }\n\n public getAttachMenuBots() {\n return this.attachMenuBotsArr ?? this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAttachMenuBots',\n processResult: (attachMenuBots) => {\n assumeType(attachMenuBots);\n this.appUsersManager.saveApiUsers(attachMenuBots.users);\n this.saveAttachMenuBots(attachMenuBots.bots);\n // ! temporary\n return this.attachMenuBotsArr = attachMenuBots.bots.slice(0, 0);\n }\n });\n }\n\n public getAttachMenuBotCached(botId: BotId) {\n return this.attachMenuBots.get(botId);\n }\n\n public getAttachMenuBot(botId: BotId, overwrite?: boolean) {\n if(!this.appUsersManager.isAttachMenuBot(botId) || true) {\n throw makeError('BOT_INVALID');\n }\n\n return (!overwrite && this.getAttachMenuBotCached(botId)) ?? this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAttachMenuBot',\n params: {\n bot: this.appUsersManager.getUserInput(botId)\n },\n processResult: (attachMenuBotsBot) => {\n this.appUsersManager.saveApiUsers(attachMenuBotsBot.users);\n const attachMenuBot = this.saveAttachMenuBot(attachMenuBotsBot.bot);\n return attachMenuBot;\n }\n });\n }\n\n public requestWebView(options: MessageSendingParams & {\n botId: BotId,\n peerId: PeerId,\n // platform: string,\n startParam?: string,\n fromBotMenu?: boolean,\n url?: string,\n themeParams?: DataJSON\n }) {\n const {\n botId,\n peerId,\n url,\n fromBotMenu,\n themeParams,\n // platform,\n replyToMsgId,\n silent,\n sendAsPeerId,\n startParam,\n threadId\n } = options;\n\n const platform = 'web';\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.requestWebView',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n bot: this.appUsersManager.getUserInput(botId),\n silent,\n platform,\n url,\n reply_to_msg_id: replyToMsgId ? getServerMessageId(replyToMsgId) : undefined,\n from_bot_menu: fromBotMenu,\n theme_params: themeParams,\n send_as: sendAsPeerId ? this.appPeersManager.getInputPeerById(sendAsPeerId) : undefined,\n start_param: startParam,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n },\n processResult: (result) => {\n console.log(result);\n return result;\n }\n });\n }\n\n public prolongWebView(options: MessageSendingParams & {\n peerId: PeerId,\n botId: BotId,\n queryId: string | number\n }) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.prolongWebView',\n params: {\n peer: this.appPeersManager.getInputPeerById(options.peerId),\n bot: this.appUsersManager.getUserInput(options.botId),\n query_id: options.queryId,\n silent: options.silent,\n reply_to_msg_id: options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined,\n top_msg_id: options.threadId ? getServerMessageId(options.threadId) : undefined\n },\n processResult: (result) => {\n console.log(result);\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {UrlAuthResult} from '../../layer';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppSeamlessLoginManager extends AppManager {\n public requestUrlAuth(url: string, peerId?: PeerId, mid?: number, buttonId?: number) {\n return this.apiManager.invokeApi('messages.requestUrlAuth', {\n button_id: buttonId,\n msg_id: mid ? getServerMessageId(mid) : undefined,\n peer: peerId ? this.appPeersManager.getInputPeerById(peerId) : undefined,\n url\n }).then((urlAuthResult) => {\n if(urlAuthResult._ === 'urlAuthResultRequest') {\n this.appUsersManager.saveApiUser(urlAuthResult.bot);\n }\n\n return urlAuthResult;\n });\n }\n\n public acceptUrlAuth(url: string, peerId?: PeerId, mid?: number, buttonId?: number, writeAllowed?: boolean) {\n return this.apiManager.invokeApi('messages.acceptUrlAuth', {\n button_id: buttonId,\n msg_id: mid ? getServerMessageId(mid) : undefined,\n peer: peerId ? this.appPeersManager.getInputPeerById(peerId) : undefined,\n url,\n write_allowed: writeAllowed\n }).then((urlAuthResult) => {\n return urlAuthResult as Exclude;\n });\n }\n\n public getWebAuthorizations() {\n return this.apiManager.invokeApi('account.getWebAuthorizations').then((webAuthorizations) => {\n this.appUsersManager.saveApiUsers(webAuthorizations.users);\n return webAuthorizations.authorizations;\n });\n }\n\n public resetWebAuthorization(hash: Long) {\n return this.apiManager.invokeApi('account.resetWebAuthorization', {\n hash\n });\n }\n\n public resetWebAuthorizations() {\n return this.apiManager.invokeApi('account.resetWebAuthorizations');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport assumeType from '../../helpers/assumeType';\nimport {AccountThemes, AccountWallPapers, InputWallPaper, WallPaper} from '../../layer';\nimport {AppManager} from './manager';\n\ntype WallPaperId = WallPaper['id'];\n\nexport default class AppThemesManager extends AppManager {\n private wallPapers: {[id: WallPaperId]: WallPaper};\n\n protected after() {\n this.wallPapers = {};\n }\n\n private saveWallPaper(wallPaper: WallPaper) {\n // const oldWallPaper = this.wallPapers[wallPaper.id];\n\n // ! IT'S BROKEN NOW. SERVER RETURNS SAME ID FOR DIFFERENT WALLPAPERS\n // if(oldWallPaper) {\n // console.log('rewrite', {...oldWallPaper}, {...wallPaper});\n // }\n\n if(wallPaper._ !== 'wallPaperNoFile') {\n wallPaper.document = this.appDocsManager.saveDoc(wallPaper.document, {type: 'wallPaper', wallPaperId: wallPaper.id});\n }\n\n // if(oldWallPaper) {\n // return Object.assign(oldWallPaper, wallPaper);\n // } else {\n this.wallPapers[wallPaper.id] = wallPaper;\n // }\n\n return wallPaper;\n }\n\n public getWallPaper(inputWallPaper: InputWallPaper) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'account.getWallPaper',\n params: {wallpaper: inputWallPaper},\n processResult: (wallPaper) => {\n return this.saveWallPaper(wallPaper);\n }\n });\n }\n\n public getInputWallPaper(wallPaper: WallPaper | string): InputWallPaper {\n if(typeof(wallPaper) === 'string') {\n return {_: 'inputWallPaperSlug', slug: wallPaper};\n } else if(wallPaper._ === 'wallPaperNoFile') {\n return {_: 'inputWallPaperNoFile', id: wallPaper.id};\n } else {\n return {_: 'inputWallPaper', id: wallPaper.id, access_hash: wallPaper.access_hash};\n }\n }\n\n public getWallPaperById(id: WallPaperId) {\n const wallPaper = this.wallPapers[id];\n return this.getWallPaper(this.getInputWallPaper(wallPaper));\n }\n\n public getThemes() {\n return this.apiManager.invokeApiSingleProcess({\n method: 'account.getThemes',\n params: {format: 'macos', hash: 0},\n processResult: (accountThemes) => {\n assumeType(accountThemes);\n\n accountThemes.themes.forEach((theme) => {\n if(!theme.settings) {\n return;\n }\n\n theme.settings.forEach((themeSettings) => {\n themeSettings.wallpaper = this.saveWallPaper(themeSettings.wallpaper);\n });\n });\n\n return accountThemes.themes;\n }\n });\n }\n\n public getWallPapers() {\n return this.apiManager.invokeApiHashable({method: 'account.getWallPapers'}).then((accountWallpapers) => {\n const wallPapers = (accountWallpapers as AccountWallPapers.accountWallPapers).wallpapers;\n wallPapers.forEach((wallPaper, idx, arr) => {\n arr[idx] = this.saveWallPaper(wallPaper);\n });\n\n return wallPapers;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport callbackify from '../../helpers/callbackify';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport appStateManager from './appStateManager';\nimport {AppStoragesManager} from './appStoragesManager';\nimport createManagers from './createManagers';\n\ntype Managers = Awaited>;\n\nexport class AppManagersManager {\n private managers: Managers | Promise;\n private cryptoWorkersURLs: string[];\n private cryptoPortsAttached: number;\n private cryptoPortPromise: CancellablePromise;\n\n constructor() {\n this.cryptoWorkersURLs = [];\n this.cryptoPortsAttached = 0;\n this.cryptoPortPromise = deferredPromise();\n this.cryptoPortPromise.then(() => {\n this.cryptoPortPromise = undefined;\n });\n }\n\n public start() {\n const port = MTProtoMessagePort.getInstance();\n\n port.addEventListener('manager', ({name, method, args}) => {\n return callbackify(this.getManagers(), (managers) => {\n // @ts-ignore\n const manager = managers[name];\n return manager[method].apply(manager, args);\n });\n });\n\n port.addEventListener('cryptoPort', (payload, source, event) => {\n const port = event.ports[0];\n if(this.cryptoPortsAttached >= this.cryptoWorkersURLs.length) {\n port.close();\n return;\n }\n\n ++this.cryptoPortsAttached;\n cryptoMessagePort.attachPort(port);\n this.cryptoPortPromise?.resolve();\n });\n\n port.addEventListener('createProxyWorkerURLs', ({originalUrl, blob}) => {\n let length = this.cryptoWorkersURLs.length;\n if(!length) {\n this.cryptoWorkersURLs.push(originalUrl);\n ++length;\n }\n\n const maxLength = App.cryptoWorkers;\n if(length === maxLength) {\n return this.cryptoWorkersURLs;\n }\n\n const newURLs = new Array(maxLength - length).fill(undefined).map(() => URL.createObjectURL(blob));\n this.cryptoWorkersURLs.push(...newURLs);\n return this.cryptoWorkersURLs;\n });\n }\n\n public async createManagers() {\n const appStoragesManager = new AppStoragesManager();\n\n await Promise.all([\n // new Promise(() => {}),\n appStoragesManager.loadStorages(),\n this.cryptoPortPromise\n ]);\n\n const managers = await createManagers(appStoragesManager, appStateManager.userId);\n return this.managers = managers;\n }\n\n public getManagers() {\n return this.managers ??= this.createManagers();\n }\n}\n\nconst appManagersManager = new AppManagersManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appManagersManager = appManagersManager);\nexport default appManagersManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PasswordManager} from '../mtproto/passwordManager';\nimport {ReferenceDatabase} from '../mtproto/referenceDatabase';\nimport DialogsStorage from '../storages/dialogs';\nimport FiltersStorage from '../storages/filters';\nimport {ApiUpdatesManager} from './apiUpdatesManager';\nimport {AppAvatarsManager} from './appAvatarsManager';\nimport {AppCallsManager} from './appCallsManager';\nimport {AppChatsManager} from './appChatsManager';\nimport {AppDocsManager} from './appDocsManager';\nimport {AppDraftsManager} from './appDraftsManager';\nimport {AppEmojiManager} from './appEmojiManager';\nimport {AppGroupCallsManager} from './appGroupCallsManager';\nimport {AppInlineBotsManager} from './appInlineBotsManager';\nimport {AppMessagesIdsManager} from './appMessagesIdsManager';\nimport {AppMessagesManager} from './appMessagesManager';\nimport {AppNotificationsManager} from './appNotificationsManager';\nimport {AppPeersManager} from './appPeersManager';\nimport {AppPhotosManager} from './appPhotosManager';\nimport {AppPollsManager} from './appPollsManager';\nimport {AppPrivacyManager} from './appPrivacyManager';\nimport {AppProfileManager} from './appProfileManager';\nimport {AppReactionsManager} from './appReactionsManager';\nimport {AppStickersManager} from './appStickersManager';\nimport {AppUsersManager} from './appUsersManager';\nimport {AppWebPagesManager} from './appWebPagesManager';\nimport {ApiFileManager} from '../mtproto/apiFileManager';\nimport {ApiManager} from '../mtproto/apiManager';\nimport ctx from '../../environment/ctx';\nimport PeersStorage from '../storages/peers';\nimport ThumbsStorage from '../storages/thumbs';\nimport {NetworkerFactory} from '../mtproto/networkerFactory';\nimport {RootScope} from '../rootScope';\nimport {Authorizer} from '../mtproto/authorizer';\nimport {DcConfigurator} from '../mtproto/dcConfigurator';\nimport {TimeManager} from '../mtproto/timeManager';\nimport {AppStoragesManager} from './appStoragesManager';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport appStateManager from './appStateManager';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport AppWebDocsManager from './appWebDocsManager';\nimport AppPaymentsManager from './appPaymentsManager';\nimport AppAttachMenuBotsManager from './appAttachMenuBotsManager';\nimport AppSeamlessLoginManager from './appSeamlessLoginManager';\nimport AppThemesManager from './appThemesManager';\n\nexport default function createManagers(appStoragesManager: AppStoragesManager, userId: UserId) {\n const managers = {\n appPeersManager: new AppPeersManager,\n appChatsManager: new AppChatsManager,\n appDocsManager: new AppDocsManager,\n appPhotosManager: new AppPhotosManager,\n appPollsManager: new AppPollsManager,\n appUsersManager: new AppUsersManager,\n appWebPagesManager: new AppWebPagesManager,\n appDraftsManager: new AppDraftsManager,\n appProfileManager: new AppProfileManager,\n appNotificationsManager: new AppNotificationsManager,\n apiUpdatesManager: new ApiUpdatesManager,\n appAvatarsManager: new AppAvatarsManager,\n appGroupCallsManager: new AppGroupCallsManager,\n appCallsManager: new AppCallsManager,\n appReactionsManager: new AppReactionsManager,\n appMessagesManager: new AppMessagesManager,\n appMessagesIdsManager: new AppMessagesIdsManager,\n appPrivacyManager: new AppPrivacyManager,\n appInlineBotsManager: new AppInlineBotsManager,\n appStickersManager: new AppStickersManager,\n referenceDatabase: new ReferenceDatabase,\n appEmojiManager: new AppEmojiManager,\n filtersStorage: new FiltersStorage,\n dialogsStorage: new DialogsStorage,\n apiManager: new ApiManager,\n cryptoWorker: cryptoMessagePort,\n passwordManager: new PasswordManager,\n apiFileManager: new ApiFileManager,\n peersStorage: new PeersStorage,\n thumbsStorage: new ThumbsStorage,\n networkerFactory: new NetworkerFactory,\n rootScope: new RootScope,\n authorizer: new Authorizer,\n dcConfigurator: new DcConfigurator,\n timeManager: new TimeManager,\n appStoragesManager: appStoragesManager,\n appStateManager: appStateManager,\n appWebDocsManager: new AppWebDocsManager,\n appPaymentsManager: new AppPaymentsManager,\n appAttachMenuBotsManager: new AppAttachMenuBotsManager,\n appSeamlessLoginManager: new AppSeamlessLoginManager,\n appThemesManager: new AppThemesManager\n };\n\n type T = typeof managers;\n\n for(const name in managers) {\n const manager = managers[name as keyof T];\n if(!manager) {\n continue;\n }\n\n if((manager as AppMessagesManager).setManagers) {\n (manager as AppMessagesManager).setManagers(managers as any);\n delete (manager as AppMessagesManager).setManagers;\n }\n\n // @ts-ignore\n ctx[name] = manager;\n }\n\n const promises: Array void) | void> | void>[] = [];\n let names = Object.keys(managers) as (keyof T)[];\n names.unshift('appUsersManager', 'appChatsManager', 'appNotificationsManager', 'appMessagesManager', 'dialogsStorage');\n names = filterUnique(names);\n for(const name of names) {\n const manager = managers[name];\n if((manager as any)?.after) {\n // console.log('injecting after', name);\n const result = (manager as any).after();\n promises.push(result);\n\n // if(result instanceof Promise) {\n // result.then(() => {\n // console.log('injected after', name);\n // });\n // }\n }\n }\n\n if(userId) {\n managers.apiManager.setUserAuth(userId);\n }\n\n return Promise.all(promises).then(() => managers);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// just to include\nimport '../polyfill';\nimport '../../helpers/peerIdPolyfill';\n\nimport cryptoWorker from '../crypto/cryptoMessagePort';\nimport {setEnvironment} from '../../environment/utils';\nimport appStateManager from '../appManagers/appStateManager';\nimport transportController from './transports/controller';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport RESET_STORAGES_PROMISE from '../appManagers/utils/storages/resetStoragesPromise';\nimport appManagersManager from '../appManagers/appManagersManager';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport {logger} from '../logger';\nimport {State} from '../../config/state';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport appTabsManager from '../appManagers/appTabsManager';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport callbackify from '../../helpers/callbackify';\n\nlet _isServiceWorkerOnline = true;\nexport function isServiceWorkerOnline() {\n return _isServiceWorkerOnline;\n}\n\nlet serviceMessagePort: ServiceMessagePort, _serviceMessagePort: MessagePort;\nexport function getServiceMessagePort() {\n return _isServiceWorkerOnline ? serviceMessagePort : undefined;\n}\n\nconst log = logger('MTPROTO');\n// let haveState = false;\n\nconst port = new MTProtoMessagePort();\nport.addMultipleEventsListeners({\n environment: (environment) => {\n setEnvironment(environment);\n\n transportController.waitForWebSocket();\n },\n\n crypto: ({method, args}) => {\n return cryptoWorker.invokeCrypto(method as any, ...args as any);\n },\n\n state: ({state, resetStorages, pushedKeys, newVersion, oldVersion, userId}) => {\n // if(haveState) {\n // return;\n // }\n\n log('got state', state, pushedKeys);\n\n appStateManager.userId = userId;\n appStateManager.newVersion = newVersion;\n appStateManager.oldVersion = oldVersion;\n\n (Object.keys(state) as any as (keyof State)[]).forEach((key) => {\n appStateManager.pushToState(key, state[key], true, !pushedKeys.includes(key));\n });\n\n RESET_STORAGES_PROMISE.resolve(resetStorages);\n // haveState = true;\n },\n\n toggleStorages: ({enabled, clearWrite}) => {\n return toggleStorages(enabled, clearWrite);\n },\n\n event: (payload, source) => {\n log('will redirect event', payload, source);\n port.invokeExceptSource('event', payload, source);\n },\n\n serviceWorkerOnline: (online) => {\n _isServiceWorkerOnline = online;\n },\n\n serviceWorkerPort: (payload, source, event) => {\n if(serviceMessagePort) {\n serviceMessagePort.detachPort(_serviceMessagePort);\n _serviceMessagePort = undefined;\n } else {\n serviceMessagePort = new ServiceMessagePort();\n serviceMessagePort.addMultipleEventsListeners({\n requestFilePart: (payload) => {\n return callbackify(appManagersManager.getManagers(), (managers) => {\n const {docId, dcId, offset, limit} = payload;\n return managers.appDocsManager.requestDocPart(docId, dcId, offset, limit);\n });\n }\n });\n }\n\n // * port can be undefined in the future\n if(_serviceMessagePort = event.ports[0]) {\n serviceMessagePort.attachPort(_serviceMessagePort);\n }\n },\n\n createObjectURL: (blob) => {\n return URL.createObjectURL(blob);\n }\n\n // socketProxy: (task) => {\n // const socketTask = task.payload;\n // const id = socketTask.id;\n\n // const socketProxied = socketsProxied.get(id);\n // if(socketTask.type === 'message') {\n // socketProxied.dispatchEvent('message', socketTask.payload);\n // } else if(socketTask.type === 'open') {\n // socketProxied.dispatchEvent('open');\n // } else if(socketTask.type === 'close') {\n // socketProxied.dispatchEvent('close');\n // socketsProxied.delete(id);\n // }\n // },\n});\n\nlog('MTProto start');\n\nappManagersManager.start();\nappManagersManager.getManagers();\nappTabsManager.start();\n\n// let sentHello = false;\nlistenMessagePort(port, (source) => {\n appTabsManager.addTab(source);\n\n // port.invokeVoid('hello', undefined, source);\n // if(!sentHello) {\n // port.invokeVoid('hello', undefined, source);\n // sentHello = true;\n // }\n}, (source) => {\n appTabsManager.deleteTab(source);\n});\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter} from '../storages/filters';\n\n/**\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\n */\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\nexport type REAL_FOLDER_ID = 0 | 1;\n\nexport const NULL_PEER_ID: PeerId = 0;\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\nexport const SERVICE_PEER_ID: PeerId = 777000;\nexport const MUTE_UNTIL = 0x7FFFFFFF;\nexport const BOT_START_PARAM = '';\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\nexport const THUMB_TYPE_FULL = '';\nexport const TOPIC_COLORS = [0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, 0xFB6F5F];\nexport const ATTACH_MENU_BOT_ICON_NAME = 'default_static';\nexport const GENERAL_TOPIC_ID = 4295032831;\nexport const T_ME_PREFIXES = new Set(['web', 'k', 'z']);\n\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n// const markdownTestRegExp = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\n 'Telegram': 'tg://search_hashtag?hashtag={1}',\n 'Twitter': 'https://twitter.com/hashtag/{1}',\n 'Instagram': 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\n/* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n} */\n\n\n/* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n} */\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\n\nexport function encodeEmoji(emojiText: string) {\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\n return codepoints;\n}\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\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\n\nexport function toCodePoints(unicodeSurrogates: string): Array {\n const points = [];\n let char = 0;\n let previous = 0;\n let i = 0;\n while(i < unicodeSurrogates.length) {\n char = unicodeSurrogates.charCodeAt(i++);\n if(previous) {\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\n previous = 0;\n } else if(char > 0xd800 && char <= 0xdbff) {\n previous = char;\n } else {\n points.push(char.toString(16));\n }\n }\n\n if(points.length && points[0].length === 2) {\n points[0] = '00' + points[0];\n }\n\n return points;\n}\n\nexport function getEmojiToneIndex(input: string) {\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\n}\n\nconst VIRTUAL_COUNTRIES_EMOJIS: Map = new Map([\n ['FT', '🏴‍☠']\n]);\n\nexport function getCountryEmoji(iso2: string) {\n return VIRTUAL_COUNTRIES_EMOJIS.get(iso2) ??\n String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\n}\n\nexport function emojiFromCodePoints(codePoints: string) {\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,539,85,946], () => (__webpack_require__(9092)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 85) return \"85.952a9f12a6b3dcdd3f0e.bundle.js\";\n\tif (chunkId === 946) return \"946.e994ab75ad6a5d27ca15.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + ({\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] || chunkId) + \".\" + {\"8\":\"570e6da51a125009c156\",\"104\":\"e24e7fdd92837aca2688\",\"211\":\"780c206f3e1257ccad6a\",\"301\":\"42dc636f96a62f6a08c8\",\"539\":\"17a0b07b4e6476f19654\",\"642\":\"fd1ade69544ad78671c6\",\"699\":\"85f88e27b023cbb2ca51\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t678: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","EmojiVersions","Emoji","version","Object","assign","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","undefined","badCharsRe","trimRe","C2L","cleanSearchText","text","latinize","processSearchText","clearBadChars","ignoreCase","options","hasTag","includeTag","charAt","originalText","replace","clearBadCharsAndTrim","ch","latinizeCh","latinizeString","fixCyrillic","FILENAME_JOINER","getFileNameByLocation","location","ext","length","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","downloadId","getFileURL","type","encodeURIComponent","JSON","stringify","platforms","Set","ignore","getRestrictionReason","reasons","find","reason","has","isRestricted","ignoreRestrictionReasons","clear","forEach","add","getPeerId","peerId","isPeerId","userId","user_id","toPeerId","chatId","channel_id","chat_id","isUser","peerParams","substr","split","IDB","constructor","db","this","name","storageIsAvailable","log","openDatabase","INSTANCES","push","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","Array","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","request","indexedDB","open","Promise","reject","message","finished","setTimeout","onerror","resolve","onsuccess","event","result","calledNew","onclose","e","onabort","transaction","target","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","instance","preserve","storage","IDBStorage","storeName","idb","create","delete","entryName","isArray","concat","getObjectStore","map","save","value","idx","put","get","mode","callback","perf","performance","now","then","onError","clearTimeout","timeout","onComplete","results","requests","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","i","getAll","environment","getEnvironment","setEnvironment","env","RootScope","super","myId","connectionStatus","premium","addEventListener","isNew","isPremium","dispatchEventSingle","status","dispatchEvent","args","invokeVoid","settings","getConnectionStatus","getPremium","state","stateStorage","getState","setByKey","key","object","splitted","getDeepProperty","slice","pop","setDeepProperty","first","pushToState","direct","onlyLocal","setKeyValueToStorage","set","HTTP","dcId","logSuffix","pending","debug","logTypes","Log","logger","connected","_send","body","fetch","method","response","arrayBuffer","buffer","TextDecoder","decode","Uint8Array","setConnected","err","destroyed","destroy","send","networker","promise","releasePending","releasing","splice","pause","Socket","handleOpen","handleError","handleClose","removeListeners","handleMessage","data","byteLength","ws","connect","removeEventListener","WebSocket","binaryType","randomize","arr","crypto","Error","getRandomValues","Obfuscation","_process","operation","cryptoMessagePort","transfer","init","codec","idPromise","release","initPayload","val","val2","reversedPayload","reverse","encKey","encIv","decKey","decIv","process","obfuscateTag","encrypted","encode","payload","tag","encodePacket","len","header","readPacket","bytesToHex","bytes","toString","TcpObfuscated","Connection","retryTimeout","abridged","obfuscation","autoReconnect","onOpen","connection","setConnectionStatus","cleanupSent","resend","onMessage","parseResponse","processMessage","messageId","sessionId","catch","shift","onClose","needTimeout","retryAt","time","Date","diff","lastCloseTime","isNaN","reconnectTimeout","ctx","reconnect","bodySent","forceReconnect","setAutoReconnect","once","enable","changeUrl","encodeBody","toEncode","encoded","releasingPending","sent","TEST_SUFFIX","getTelegramConnectionSuffix","connectionType","constructTelegramWebSocketUrl","suffix","path","DcConfigurator","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","chosenServer","oooohLetMeLive","transportHTTP","dcOption","chooseServer","transportType","reuse","hasOwnProperty","client","download","upload","servers","transports","transport","obj","indexOfAndSplice","MTTransportController","opened","Map","waitForWebSocket","pingTransports","dcConfigurator","https","websocket","httpPromise","websocketPromise","socket","isFulfilled","isRejected","isHttpAvailable","isWebSocketAvailable","all","pinging","setTransportValue","setTransportOpened","setTransportClosed","AppManager","setManagers","managers","loadStorages","storages","recordPromise","storagesKeys","keys","storagesPromises","storagesResults","resetStorages","size","loadStoragesInner","AppStoragesManager","names","createStorages","loadStorage","PasswordManager","apiManager","invokeApi","updateSettings","currentHashPromise","newHashPromise","params","password","new_settings","hint","email","currentPassword","cryptoWorker","invokeCrypto","newAlgo","new_algo","salt1","newPassword","hashes","new_password_hash","getInputCheckPassword","check","inputCheckPassword","auth","setUser","user","confirmPasswordEmail","code","resendPasswordEmail","cancelPasswordEmail","ReferenceDatabase","contexts","links","saveContext","reference","context","getContexts","_context","deepEqual","getReferenceByLink","getContext","values","deleteContext","refreshReference","c","appMessagesManager","reloadMessages","refreshEmojiesSoundsPromise","appStickersManager","getAnimatedEmojiSounds","appProfileManager","getProfile","appEmojiManager","getCustomEmojiDocuments","docId","appAttachMenuBotsManager","getAttachMenuBot","botId","appThemesManager","getWallPaperById","wallPaperId","hex","newHex","newContext","makeError","safeReplaceObject","wasObject","newObject","getPeerIdsFromMessage","peerIds","fromId","viaBotId","fwdFromId","media","contactUserId","recentVoters","recent_voters","recentReactions","recent_reactions","reaction","peer_id","action","userIds","users","inviter_id","chatIds","recentRepliers","recent_repliers","reply","setDialogIndex","dialog","indexKey","GLOBAL_FOLDER_ID","DialogsStorage","allDialogsLoaded","pinnedOrders","folderId","saveAllDialogsLoaded","resetPinnedOrder","savePinnedOrders","forumTopics","folders","dialogsOffsetDate","dialogsNum","dialogsIndex","cachedResults","query","count","dialogs","onUpdateFolderPeers","update","folder_peers","folderPeer","folder_id","peer","appPeersManager","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","getDialogOnly","handleDialogTogglePinned","onUpdateChannelPinnedTopic","topicId","generateMessageId","topic_id","topic","getForumTopic","getFilterIdForForum","onUpdatePinnedDialogs","order","handleDialogsPinned","dialogsResult","applyDialogs","d","onUpdateChannelPinnedTopics","filterId","limit","getLimit","channel","appChatsManager","getChannelInput","toChatId","offset_date","offset_id","offset_topic","processTopics","topics","after","rootScope","appUsersManager","getSelf","peerText","getPeerSearchText","indexObject","onFilterUpdate","getCachedDialogs","processDialogForFilter","processDialogForFilters","getDialogIndexKeyByFilterId","processChangedUnreadOrUnmuted","chat","getChat","dropDialogOnDeletion","enabled","flushForumTopicsCache","apiUpdatesManager","addMultipleEventsListeners","updateFolderPeers","updateDialogPinned","updateChannelPinnedTopic","updatePinnedDialogs","updateChannelPinnedTopics","appStateManager","appStoragesManager","getCache","_order","getPinnedOrders","setDialogsFromState","bind","appDraftsManager","addMissedDialogs","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","ignoreOffsetDate","getMessageByPeer","reloadConversation","isDialogsLoaded","setDialogsLoaded","loaded","isForum","isFilterIdForForum","defineNotNumerableProperties","every","orders","isDialogPinned","filtersStorage","getFilter","isPinned","pinnedPeerIds","getOffsetDate","offsetDate","Math","min","sort","a","b","generateFolder","folder","unreadMessagesCount","unreadPeerIds","unreadUnmutedPeerIds","getFolder","forumTopic","getDialogKey","isTopic","getFolderDialogs","skipMigrated","hidden","migratedTo","getNextDialog","currentPeerId","findIndex","getDialogIndexKey","localId","isDialogUnmuted","appNotificationsManager","isPeerLocalMuted","respectType","threadId","getFolderUnreadCount","unreadUnmutedCount","unreadCount","arrays","setDialogIndexInFilter","isRealFolder","testDialogForFilter","pinnedIds","pinnedKey","pinnedIndex","generateDialogIndex","generateDialogPinnedDateByIndex","getDialogIndex","getDialog","verify","skipped","getDialogOrTopic","isObject","date","tsNow","timeManager","getServerTimeOffset","noIndex","filters","getFilters","cmp","wasIndex","wasDialog","wasDialogIndex","newDialogIndex","prepareFolderUnreadCountModifyingByDialog","insertInDescendSortedArray","prepareDialogUnreadCountModifying","toggle","callbacks","wasUnreadCount","getDialogUnreadCount","wasUnmuted","newUnreadCount","newUnmuted","addMessagesCount","modifyFolderUnreadCount","toggleDialog","toggleUnmuted","forumUnreadCount","getForumUnreadCount","hasUnmuted","some","max","dispatchUnreadTimeout","_folder","justReturn","noPinnedOrderUpdate","topDate","generateDialogPinnedDate","channelId","isChannel","draft","dialogKey","unshift","setDialogToState","pts","historyStorage","getHistoryStorage","messagesStorage","getHistoryMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","peersStorage","requestPeersForKey","isAnyChat","newPts","getChannelState","requestPeer","saveGlobalOffset","getForumTopicsCache","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","dropDialogFromFolders","foundDialog","wasPinned","keepLocal","clearDialogFromState","releasePeer","dropDialogWithEvent","dropped","items","forEachReverse","assumeType","saveApiUsers","saveApiChats","chats","messages","updatedDialogs","topMid","topPendingMid","pendingTopMsgs","topPendingMessage","maxId","cache","getUpdateCache","getUpdateAfterReloadKey","updates","newUpdatesAfterReloadToHandle","saveUpdate","canSaveDialogByPeerId","isDialog","wasDialogBefore","wasTopMessage","generateTempMessageId","from_id","getOutputPeer","deleted","out","isOutgoing","migrated_to","deactivated","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","saveDraft","isOut","unread","unread_count","isEnd","insertSlice","setEnd","mergeReplyKeyboard","readMaxId","readOutboxMaxId","savePeerSettings","notify_settings","addChannelState","releaseUnreadCount","dialogsStorage","processTopicUpdate","oldTopic","isIconChanged","icon_emoji_id","isTitleChanged","title","isChanged","getDialogs","offsetIndex","promises","fillContactsResult","fillContacts","cached","reloadMissingDialogsPromise","reloadMissingPeerIds","realFolderId","curDialogStorage","d1","d2","offset","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","deletedTopics","getTopicPromises","getForumTopicById","getTopicsPromise","ids","fullfillLeft","messagesForumTopics","getForumTopicOrReload","callbackify","processTopicsPromise","f","reduce","acc","v","newPinned","convertment","PREPENDED_FILTERS","LOCAL_FILTER","flags","exclude_peers","include_peers","pinned_peers","excludePeerIds","includePeerIds","FiltersStorage","filtersArr","reloadedPeerIds","localFilters","generateLocalFilter","clearFilters","onUpdateDialogFilter","saveDialogFilter","findAndSplice","onUpdateDialogFilters","oldFilters","copy","getDialogFilters","_filterId","onUpdateDialogFilterOrder","includes","setLocalId","updateDialogFilter","updateDialogFilters","updateDialogFilterOrder","prependFilters","allChatsFilter","archiveFilter","allChatsFilterIndex","exclude_archived","exclude_unarchived","exclude_read","isDialogUnread","exclude_muted","unread_mentions_count","broadcasts","isBroadcast","groups","isAnyGroup","toUserId","isBot","bots","non_contacts","isContact","contacts","testDialogForFilterId","toggleDialogPin","getConfig","pinned_infolder_count_max","getInputPeerById","createDialogFilter","prepend","remove","getOutputDialogFilter","bool","updateDialogFiltersOrder","filterIncludedPinnedPeers","peers","reloadDialogs","inputPeer","isAlreadyReloaded","reloadPromises","missingPeerIds","overwrite","invokeApiSingle","getSuggestedDialogsFilters","silent","to","oldFilter","_filter","isFilterIdAvailable","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","getOwnPropertyDescriptor","defineProperty","ApiUpdatesManager","updatesState","pendingPtsUpdates","pendingSeqUpdates","syncPending","syncLoading","channelStates","attached","subscriptions","processUpdateMessage","updateMessage","processOpts","seq","seqStart","seq_start","forceGetDifference","processUpdate","toId","fwd_from","reply_to","entities","pts_count","override","_constructor","setProxy","Proxy","saveUpdatesState","us","popPendingSeqUpdate","nextSeq","pendingUpdatesData","seqAwaiting","ptsAwaiting","clearStatePendingSync","popPendingPtsUpdate","curState","curPts","goodPts","goodIndex","getDifference","processLocalUpdate","wasSyncing","pts_total_limit","qts","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","onDifferenceTooLong","justAName","getChannelDifference","channelState","bindPrefix","lastDifferenceTime","final","lastPtsUpdateTime","fwdHeader","hasUser","post","hasChat","popPts","popSeq","subscribeToChannelUpdates","subscription","cb","interval","unsubscribeFromChannelUpdates","force","clearInterval","attach","langCode","noErrorBox","stateResult","setUpdatesProcessor","strs","en","ru","getChangelog","lang","res","ok","langStr","parseMarkdown","inbox_date","languages","filterUnique","language","AppAvatarsManager","savedAvatarURLs","removeFromAvatarsCache","isAvatarCached","saved","loadAvatar","photo","peerPhotoFileLocation","downloadOptions","dc_id","limitPart","apiFileManager","blob","URL","createObjectURL","AppCallsManager","calls","IS_CALL_SUPPORTED","updatePhoneCall","saveCall","phone_call","updatePhoneCallSignalingData","callId","phone_call_id","computeKey","g_b","p","call","isDiscarded","oldCall","getCall","getCallInput","access_hash","savePhonePhoneCall","phonePhoneCall","generateDh","random_length","dhConfig","requestCall","protocol","g_a_hash","video","getUserInput","random_id","discardCall","duration","connection_id","AppChatsManager","isPeerNeeded","modifyUsernamesCache","onChatUpdated","updateChannelParticipant","clearCache","updateChatDefaultBannedRights","default_banned_rights","getFromCache","apiChats","saveApiChat","oldChat","participants_count","changedUsername","setUsernameToCache","oldPhotoId","newPhotoId","toggledForum","forum","changedPhoto","changedTitle","changedAnyBadge","verified","scam","fake","hasRights","rights","isThread","editChatDefaultBannedRights","banned_rights","until_date","isMegagroup","megagroup","isInChat","good","getInputPeer","getChannelInputPeer","getChatInputPeer","allowMin","getChatString","createChannel","inviteToChannel","input","usersInputs","u","createChat","leaveChannel","joinChannel","addChatUser","fwdLimit","fwd_limit","deleteChatUser","leaveChat","leave","deleteChannel","deleteChat","migrateChat","updateUsername","username","doNotRefresh","refreshChatAfterRequest","editPhoto","inputFile","inputChatPhoto","file","editTitle","editAbout","about","editBanned","participant","getParticipantPeerId","timestamp","actor_id","prev_participant","new_participant","kicked_by","clearChannelParticipantBannedRights","kickFromChannel","view_messages","kickFromChat","resolveChannel","messagesChats","togglePreHistoryHidden","toggleSignatures","toggleNoForwards","setChatAvailableReactions","reactions","chatFull","getCachedFullChat","available_reactions","getSendAs","invokeApiSingleProcess","processResult","sendAsPeers","importChatInvite","hash","checkUsername","getSponsoredMessage","invokeApiCacheable","cacheSeconds","sponsoredMessages","sponsoredMessage","viewSponsoredMessage","randomId","checkChatInvite","chatInvite","toggleUsername","active","reorderUsernames","deactivateAllUsernames","makeChannelPrivate","getChannels","toggleForum","editForumTopic","iconEmojiId","closed","createForumTopic","iconColor","channelFull","getChannelFull","sendAsInputPeer","default_send_as","icon_color","send_as","updatePinnedForumTopic","wrapUrl","unsafe","matchUrlProtocol","tgMeMatch","telescoPeMatch","tgMatch","onclick","prefix","pathname","fullPath","I18n","pluralRules","cacheLangPackPromise","setLangCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","timeFormat","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","langSign","countries","strings","formatLocalStrings","default","saveLangPack","from_version","lang_code","local","loadLangPack","web","requestedServerLanguage","lang_pack","polyfillPromise","pushTo","langPack","appVersion","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","document","querySelectorAll","element","weakMap","superFormatter","indexHolder","lastIndex","p1","p2","p3","p4","createElement","append","lastIndexOf","wrappedUrl","href","setAttribute","DocumentFragment","firstChild","textContent","arg","pushNextArgument","plain","select","item","Node","isRTL","setRTL","rtl","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","l","_Intl","WeakMap","IntlElementBase","classList","property","IntlElement","safeAssign","formatted","dataset","compareAndUpdate","json","DateTimeFormat","hours","getHours","getMinutes","capitalizeFirstLetter","i18n","i18n_","_i18n","months","days","getWeekNumber","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","today","year","day","month","weekday","minYear","yearPattern","RegExp","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","createForMonthYear","dates","selectedYear","currentYear","setFullYear","minDate","setMonth","maxDate","formatterMonthYear","createForDayMonth","validDateForMonth","formatterDayMonth","formatterYearMax","formatWeekLong","getDay","q","safeReplaceArrayInObject","trim","dayOfWeek","setDate","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","g3","parseInt","k1","EXTENSION_MIME_TYPE_MAP","pdf","tgv","tgs","wav","mp3","ogg","jpeg","jpg","png","gif","webp","mp4","webm","mov","svg","MIME_TYPE_EXTENSION_MAP","uploadWallPaperTempId","AppDocsManager","onServiceWorkerFail","docs","doc","supportsStreaming","thumbsStorage","deleteCacheContext","stickerCachedThumbs","uploadingWallPapers","online","saveDoc","oldDoc","file_reference","referenceDatabase","attributes","attribute","file_name","wrapPlainText","voice","mime_type","w","h","round_message","alt","stickerEmojiRaw","stickerSetInput","thumbs","IS_WEBP_SUPPORTED","sticker","IS_WEBM_SUPPORTED","animated","mappedMimeType","joiner","monthAsNumber","noSeconds","getSeconds","leadingZero","noTime","getFullDate","isServiceWorkerOnline","getCacheContext","setCacheContextURL","thumb","getDocumentDownloadOptions","getDocumentURL","getDoc","downloadDoc","queueId","onlyCache","downloadMedia","getLottieCachedThumb","toneIndex","saveLottiePreview","width","height","saveWebPConvertedStrippedThumb","stickerThumbConverted","prepareWallPaperUpload","cacheContext","wallpaper","slug","uploadWallPaper","fileName","wallPaper","downloaded","getGifs","invokeApiHashable","gifs","requestDocPart","requestFilePart","getDocumentInputFileLocation","AppDraftsManager","drafts","updateDraftMessage","notify","getKey","getDraft","getAllDrafts","getAllDraftPromise","apiDraft","processApiDraft","isEmptyDraft","reply_to_msg_id","syncDraft","localDraft","saveOnServer","serverDraft","draftsAreEqual","draftObj","getInputEntities","no_webpage","top_msg_id","saveLocalDraft","clearAllDrafts","combined","clearDraft","emptyDraft","setDraft","EMOJI_LANG_PACK","keywords","AppEmojiManager","keywordLangPacks","indexedLangPacks","getKeywordsPromises","recent","getRecentEmojisPromises","getCustomEmojiDocumentPromises","getEmojiKeywords","storageKey","pack","validateInitObject","keywordsDifference","packKeywords","keyword","emoticons","getBothEmojiKeywords","networkerFactory","native","getRecentEmojis","indexEmojis","searchEmojis","emojis","POPULAR_EMOJI","recentEmoji","recentCustomEmoji","pushRecentEmoji","emoji","fixEmoji","docIds","document_id","documents","appDocsManager","getCachedCustomEmojiDocuments","setDebouncedGetCustomEmojiDocuments","getCustomEmojiDocumentsPromise","allIds","getCustomEmojiDocument","getCustomEmojis","getEmojiStickers","AppGroupCallsManager","groupCalls","participants","nextOffsets","updateGroupCall","saveGroupCall","updateGroupCallParticipants","groupCallId","saveApiParticipants","groupCall","getCachedParticipants","prepareToSavingNextOffset","nextOffsetsMap","nextOffset","setNextOffset","newNextOffset","saveApiParticipant","skipCounterUpdating","oldParticipant","hasLeft","muted","can_self_unmute","getGroupCall","modified","just_joined","apiParticipants","editParticipant","getGroupCallInput","getInputPeerSelf","volume","raise_hand","raiseHand","video_paused","videoPaused","video_stopped","videoStopped","presentation_paused","presentationPaused","getGroupCallFull","participants_next_offset","shouldUpdate","createGroupCall","scheduleDate","schedule_date","getGroupCallParticipants","sources","groupCallParticipants","next_offset","hangUp","discard","groupCallInput","source","join_as","joinGroupCall","isMuted","joinVideo","leaveGroupCallPresentation","getPhotoInput","getPhotoMediaInput","ttl_seconds","getMediaInput","AppInlineBotsManager","inlineResults","setHash","getGeoInput","geo","lat","long","accuracy_radius","getInlineResults","bot","geo_point","stopTime","botResults","queryId","query_id","appPhotosManager","savePhoto","generateQId","pushPopularBot","getTopPeers","topPeers","botPeerId","topPeer","rating","switchToPM","fromPeerId","startParam","startBot","checkSwitchReturn","getUser","bot_inline_placeholder","peerData","switchInlineQuery","getPeerUsername","callbackButtonClick","button","msg_id","sendInlineResult","queryAndResultIds","inlineResult","queryID","resultID","resultId","send_message","reply_markup","replyMarkup","sendText","inputMedia","messageMedia","caption","sendMessage","geoPoint","address","provider","venue_id","venue_type","phone_number","first_name","last_name","vcard","description","currency","total_amount","shipping_address_requested","start_param","sendOther","AppMessagesIdsManager","tempNum","num","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","cut","end","part","_arrayIndex","partLength","appTabsManager","tabs","start","getTabs","tab","addTab","deleteTab","getDocumentInput","setBooleanFlag","processAfter","UPDATE_STICKERSET_ORDER","AppMessagesManager","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","extendedMedia","maxSeenId","newDialogsToHandle","notificationsToHandle","reloadConversationsPeers","groupedTempId","typings","unreadMentions","goToNextMentionPromises","batchUpdates","middleware","clean","uploadFilePromises","messagesStorageByPeerId","groupedMessagesStorage","scheduledMessagesStorage","historiesStorage","threadsStorage","searchesStorage","pinnedMessages","threadsServiceMessagesIdsStorage","threadsToReplies","handleNewDialogs","newMaxSeenId","updateMap","processDialog","isDialogDefined","incrementMaxSeenId","handleNotifications","notificationsHandlePromise","notifyPeerToHandle","getNotifyPeerSettings","peerTypeNotifySettings","mentioned","notifyAboutMessage","fwdCount","onUpdateMessageId","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","createMessageStorage","threadKey","getThreadKey","handleNewUpdateAfterReload","threadStorage","reply_to_peer_id","reply_to_mid","receiptMessage","checkPendingMessage","updateMessageRepliesIfNeeded","ignoreExisting","findSlice","firstSlice","forceUserOnline","handleNewMessage","inboxUnread","modifyCachedMentions","setDialogTopMessage","notifyPeer","onUpdateMessageReactions","recentReaction","previousReactions","previousRecentReactions","show_previews","peerReaction","pushBatchUpdate","batchUpdateReactions","setDialogToStateIfMessageIsTop","onUpdateDialogUnreadMark","unread_mark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","dispatchEditEvent","newReactions","grouped_id","onUpdateReadHistory","max_id","read_max_id","getObjectKeysAndSort","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","getReadMaxIdIfUnread","messageThreadId","getMessageThreadId","setCount","threadKeyPart","onUpdateReadMessagesContents","topMsgId","mids","findPeerIdByMids","media_unread","fixDialogUnreadMentionsIfNoMessage","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","getPeerActiveUsernames","onUpdateChannelReload","flushStoragesByPeerId","onUpdateChannelMessageViews","views","batchUpdateViews","onUpdateServiceNotification","popup","phone","onUpdatePinnedMessages","missingMessages","werePinned","getPinnedMessagesKey","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","isScheduled","onUpdateDeleteScheduledMessages","onUpdateMessageExtendedMedia","extended_media","batch","toDispatch","getMessagesFromMap","previousResults","changedResults","reactionCount","previousReactionCount","_reactionCount","reactionsEqual","chosen_order","updateMessageID","updateNewDiscussionMessage","updateNewMessage","updateNewChannelMessage","updateDialogUnreadMark","updateEditMessage","updateEditChannelMessage","updateMessageReactions","updateReadChannelDiscussionInbox","updateReadChannelDiscussionOutbox","updateReadHistoryInbox","updateReadHistoryOutbox","updateReadChannelInbox","updateReadChannelOutbox","updateChannelReadMessagesContents","updateReadMessagesContents","updateChannelAvailableMessages","updateDeleteMessages","updateDeleteChannelMessages","updateChannel","updateChannelReload","updateChannelMessageViews","updateServiceNotification","updatePinnedMessages","updatePinnedChannelMessages","updateNotifySettings","updateNewScheduledMessage","updateDeleteScheduledMessages","updateMessageExtendedMedia","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getCachedWebPage","drop","poll","appPollsManager","pollToMessages","startsWith","batchUpdatesDebounced","debounce","details","maxSeenMsgId","sendEntites","entity","invokeAfterMessageIsSent","tempId","callbackName","finalize","editMessage","is_scheduled","newMedia","noWebPage","handled","replyToMsgId","MAX_LENGTH","message_length_max","webPage","getPeerMigratedTo","generateOutgoingMessage","toggleError","onMessagesSendError","sentRequestOptions","afterMessageId","sendAs","sendAsPeerId","apiPromise","invokeApiAfter","clear_draft","update_stickersets_order","wrapMessageEntities","beforeMessageSending","sequential","noop","sendFile","attachType","apiFileName","fileType","File","isDocument","Blob","isPhoto","IMAGE_MIME_TYPES_SUPPORTED","strippedPhotoSize","strippedBytes","actionName","isVoiceMessage","waveform","isMedia","photoSize","sizes","objectURL","VIDEO_MIME_TYPES_SUPPORTED","videoAttribute","isRoundMessage","supports_streaming","noSound","thumbCacheContext","sentDeferred","spoiler","uploadingFileName","getFileNameForUpload","uploaded","uploadPromise","load","thumbUploadPromise","cancelPendingMessage","setTyping","addNotifyListener","progress","percents","floor","done","total","notifyAll","force_file","isGroupedItem","background","ret","sendAlbum","sendFileDetails","groupId","o","invoke","multiMedia","multi_media","originalInputMedia","inputSingleMedia","inputs","sendContact","contactPeerId","getContactMediaInput","pollId","savePoll","total_voters","getPoll","getPhoto","postAuthor","getPeer","signatures","generateFromId","post_author","generateFlags","generateReplyHeader","via_bot_id","replies","generateReplies","replyToTopId","originalMessage","forum_topic","reply_to_top_id","linked_chat_id","comments","replies_pts","isAnonymousSending","generateForwardHeader","isUserHidden","from_name","userFull","getCachedFullUser","private_forward_name","channel_post","saved_from_msg_id","saved_from_peer","generateFakeAvatarMessage","Number","MAX_SAFE_INTEGER","getUploadPromise","uploadFileName","admin_rights","anonymous","pendingData","fillConversations","chatHistoryStorage","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","setMessageUnreadByDialog","folderDialogs","dialogsLength","slicedDialogs","offset_peer","offsetPeerId","forwardMessages","config","overflowMids","forwarded_count_max","dropCaptions","dropAuthor","newMids","newMessages","replyToMid","replyToMessageIdx","newReplyToMid","getStickerEffectThumb","nopremium","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","getMessagesStorageByKey","s","getMessagesStorage","getMessageById","cantForwardDeleteMids","cantForward","cantDelete","canForward","canDeleteMessage","reloadConversationOrTopic","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","currentState","doFlushHistory","just_clear","revoke","affectedHistory","flushHistory","justClear","getHistory","historyResult","getTypingKey","ss","hidePinnedMessages","getPinnedMessage","getSearch","inputFilter","getPinnedMessagesCount","getPinnedMessagesMaxId","updatePinnedMessage","unpin","pm_oneside","unpinAllMessages","unpinAll","getAlbumText","getGroupsFirstMessage","minMid","getMidsByAlbum","groupedId","getMessagesByAlbum","getMidsByMessage","filterMessages","appMessagesIdsManager","saveMessage","isMessage","replyTo","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","mediaContext","unsupported","originalDoc","messageKey","getMessageKeyForPendingWebPage","saveWebPage","appWebDocsManager","saveWebDocument","extendedMediaMedia","totalEntities","migrateFrom","migrateTo","video_sizes","appGroupCallsManager","migrateChecks","getFirstMessageToEdit","goodMessage","myPeerId","canEditMessage","apiEntities","myEntities","parseEntities","mergeEntities","reportMessages","editPeerFolders","getDialogPeer","markDialogUnread","read","fromChat","canMessageBeEdited","kind","goodMedias","edit_time_limit","getReplyKeyboard","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","getSearchStorage","getSearchCounters","canCache","isPeerRestricted","func","filterMessagesByInputFilterFromStorage","_storage","filterMessagesByInputFilter","nextRate","backLimit","offset_id_offset","next_rate","foundMsgs","min_date","max_date","add_offset","min_id","offsetId","offsetMessage","offset_rate","searchResult","foundCount","subscribeRepliesThread","getDiscussionMessage","generateThreadServiceStartMessage","maxMessageId","serviceStartMessage","is_single","getThreadServiceMessageId","getMessageWithReplies","newMaxId","unsetEnd","newDialogsHandlePromise","deleteMessages","localMessageIds","creator","delete_messages","affectedMessages","readHistory","triedToReadMaxId","readPromise","getPeerString","readAllHistory","getUnreadMentionsKey","slicedArray","fixUnreadMentionsCountIfNeeded","goToNextMention","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","readMessages","msgIds","getHistoryStorageTransferable","historySerialized","toJSON","inputNotifyPeer","getInputNotifyPeerById","ignorePeerId","getNotifyPeerTypeSettings","getNotifySettings","isMessageIsTopMessage","threadMessage","broadcastEventName","pendingMessage","finalizePendingMessage","mutePeer","validatePeerSettings","muteUntil","mute_until","togglePeerMute","mute","canSendToPeer","canSendToUser","finalMessage","tempMessage","finalizePendingMessageCallbacks","newPhoto","newDoc","newPhotoSize","oldCacheContext","getPhotoDownloadOptions","thumbSize","polls","handleReleasingMessage","getMessageReactionsListAndReadParticipants","skipReadParticipants","skipReactionsList","emptyMessageReactionsList","canViewMessageReadParticipants","getMessageReadParticipants","appReactionsManager","getMessageReactionsList","messageReactionsList","readParticipantsPeerIds","filteredReadParticipants","readPeerId","reactionsCount","readParticipants","appConfig","getAppConfig","chat_read_mark_size_threshold","chat_read_mark_expire_period","incrementMessageViews","increment","chatPeerIds","idleStartTime","getScheduledMessageByPeer","getScheduledMessages","sendScheduledMessages","deleteScheduledMessages","getMessageWithCommentReplies","isFetchIntervalNeeded","getNewHistory","isBottomEnd","getEnds","offsetIdOffset","haveSlice","sliceMe","fulfilled","fillHistoryStorage","constructSlice","isHistoryResultEnd","topWasMeantToLoad","wasMaxId","requestHistory","deleteSlice","oldestMessage","foundSlice","_historyResult","fetchSingleMessages","fetchSingleMessagesPromise","requestPromises","getMessagesResult","getExtendedMedia","toRequest","fetchMessageReplyTo","replyToPeerId","typing","smth","deleteWebPageFromPending","updatePollToMessage","groupedStorage","albums","dispatchAlbumEdit","deletedMids","noforwards","noForwards","getElementCallback","newMap","peerIdStr","saveDefaultSendAs","convertInputKeyToKey","inputKey","AppNotificationsManager","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","notifyForumTopic","checkMuteUntil","checkMuteUntilTimeout","closestMuteUntil","peerNotifySettings","typeKey","checkMuteUntilThrottled","throttle","isPeerType","notifySettings","getNotifyPeerTypePromise","getContactSignUpNotification","notifyContactsSignUp","setContactSignUpNotification","getPeerKey","getPeerMuted","getPeerLocalSettings","n","peerKey","typeNotifySettings","AppPeersManager","canPinMessage","getPeerPhoto","getUserString","getRestrictionReasonText","restriction_reason","getUserInputPeer","getUserSearchText","getDialogType","getDeleteButtonText","AppPhotosManager","photos","oldPhoto","Infinity","getUserPhotos","inputUser","photosResult","photoIds","photoId","AppPollsManager","updateMessagePoll","poll_id","saveResults","chosenIndexes","answer","chosen","getInputMediaPoll","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","sendVote","optionIds","answers","option","getResults","getVotes","votesList","stopPoll","newPoll","AppPrivacyManager","privacy","updatePrivacy","rules","setPrivacy","privacyRules","inputRule","rule","getPrivacy","privacyKey","getGlobalPrivacySettings","setGlobalPrivacySettings","PEER_FULL_TTL","AppProfileManager","usersFull","chatsFull","fullExpiration","onUpdateUserTyping","getTypingsKey","typingsInPeer","t","cancelAction","getChatFull","onUpdatePeerBlocked","blocked","updateChatParticipants","updateChatParticipantAdd","_participants","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","hasChatPhoto","chat_photo","refreshFullPeer","invalidateChannelParticipants","usersUserFull","full_user","profile_photo","botInfo","bot_info","referenceContext","description_document","description_photo","getProfileByPeerId","getCachedProfileByPeerId","getFullPhoto","profile","full_chat","getChatInviteLink","exported_invite","link","exportedInvite","getChannelParticipants","broadcast","getChannelParticipant","channelParticipant","fullChannel","processError","getMentions","processUserIds","ratingMap","cP","updateProfile","saveApiUser","uploadProfilePhoto","updateResult","strippedThumb","stripped_thumb","deletePhotos","deletedList","verifyParticipantForOnlineCount","reduceParticipantsForOnlineCount","getOnlines","chatInfo","channelParticipants","onlines","getPeerTypings","callbackifyAll","SAVE_DOC_KEYS","REFERENCE_CONTEXT","AppReactionsManager","availableReactions","getAvailableReactions","sendReactionPromises","lastSendingTimes","availableReaction","around_animation","static_icon","appear_animation","center_icon","messagesAvailableReactions","getActiveAvailableReactions","inactive","getAvailableReactionsForPeer","activeAvailableReactions","unshiftQuickReaction","getQuickReaction","quickReaction","chatAvailableReactions","filteredChatAvailableReactions","unshiftQuickReactionInner","getAvailableReactionsByMessage","isReactionActive","reactions_default","getReactionCached","getReaction","getMessagesReactions","setDefaultReaction","sendReaction","lastSendingTimeKey","unsetReactionCount","canSeeList","can_see_list","chosenReactions","unsetReactions","chosenReactionIdx","chosenReactionCount","chosenReactionsLength","reactionCountIdx","id1","id2","promiseKey","editMessageUpdateIdx","editMessageUpdate","LOCAL_IDS","EMOJI","EMOJI_ANIMATIONS","PREMIUM_GIFTS","GENERIC_ANIMATIONS","DEFAULT_STATUSES","DEFAULT_TOPIC_ICONS","LOCAL_IDS_SET","AppStickersManager","processAllStickersResult","allStickers","sets","stickerSet","videos","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","getGreetingStickersPromise","getGreetingStickersTimeout","getGreetingSticker","onStickersUpdated","updateNewStickerSet","saveStickerSet","updateRecentStickers","updateFavedStickers","updateMoveStickerSetToTop","stickers","getFavedStickersStickers","getRecentStickersStickers","justPreload","getStickersByEmoticon","greetingStickers","random","saveStickers","canUseStickerSetCache","useCache","refreshTime","getStickerSet","cachedSet","getStickerSetInput","saveById","getLocalStickerSet","animations","getAnimatedEmojiSoundsPromise","emojies_sounds","sound","bytesStr","atob","file_reference_base64","charCodeAt","this_dc","getRecentStickers","recentStickers","saveRecentSticker","unsave","_doc","docEmoticon","faved","cleanEmoji","getAnimatedEmojiSticker","isAnimation","packs","getAnimatedEmojiSoundDocument","preloadAnimatedEmojiSticker","preloadEmojiPromise","preloadAnimatedEmojiStickerAnimation","animation","preloadSticker","isPremiumEffect","video_thumbs","newSet","setToCache","needSave","installed_date","getStickerSetThumbDownloadOptions","thumb_dc_id","isAnimated","mimeType","getFeaturedStickers","covered","getPromoPremiumStickers","getPremiumStickers","getFavedStickers","favedStickers","getFavedStickersLimit","faveSticker","unfave","toggleStickerSet","archived","toggleStickerSets","searchStickerSets","excludeFeatured","exclude_featured","foundSaved","cover","getAllStickers","preloadStickerSets","includeOurStickers","messagesStickers","installedSets","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","clearRecentStickers","AppUsersManager","usernames","getTopPeersPromises","contactsIndex","createSearchIndex","contactsFillPromise","contactsList","updatedContactsList","updateUsersStatuses","timestampNow","updateUserStatus","setInterval","expires","was_online","setUserToStateIfNeeded","updateUserName","contactsListCachedTime","contact","mutual_contact","pushContact","recentSearch","onContactsModified","fromServer","pushRecentSearch","clearRecentSearch","resolveUsername","resolvedPeer","processResolvedPeer","resolvePhone","popContact","getContacts","includeSaved","sortBy","_contactsList","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","testSelfSearch","getContactsPeerIds","toggleBlock","block","apiUsers","cleanedUsernames","cleanUsername","searchUsername","oldPeer","oldUser","fullName","wasContact","newContact","onContactUpdated","checkPremium","isUserOnlineVisible","getUserStatus","isRegularUser","getUserPhone","isAnonymous","fragment_prefixes","isAttachMenuBot","bot_attach_menu","support","isNonContactUser","eventTimestamp","importContact","importContacts","phones","inputContacts","j","client_id","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","categories","getBlocked","contactsBlocked","getLocated","self_expires","searchContacts","my_results","curIsContact","setUserStatus","offline","updateMyOnlineStatus","addContact","addPhonePrivacyException","add_phone_privacy_exception","deleteContacts","photoTypeSet","AppWebPagesManager","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","pendingSet","getWebPage","readBlobAsArrayBuffer","readBlobAs","fileNameRFC","escape","DownloadWriter","serviceMessagePort","getServiceMessagePort","write","chunk","saveToStorage","DownloadStorage","getFile","prepareWriting","headers","cancel","getWriter","MIN_PART_SIZE","IGNORE_ERRORS","ApiFileManager","cacheStorage","downloadStorage","downloadPromises","uploadPromises","downloadPulls","downloadActives","refreshReferencePromises","maxUploadParts","maxDownloadParts","uncompressTGS","uncompressTGV","svgIndex","__","fixFirefoxSvg","TextEncoder","convertWebp","convertOpus","webFileDcId","webfile_dc_id","upload_max_fileparts_premium","upload_max_fileparts_default","downloadRequest","activeDelta","downloadPull","downloadCheck","downloadLimit","setQueueId","getFileStorage","cancelDownload","canceled","requestWebFilePart","checkCancel","isLocalWebFile","extension","file_type","mtime","fileDownload","getDelta","checkedReference","getLimitPart","isUpload","maxParts","maxPartSize","inputFileLocation","isDownloading","getDownload","getUpload","getConvertMethod","IS_OPUS_SUPPORTED","allocateDeferredPromises","startOffset","delayed","writeDeferred","writePromise","originalMimeType","convertMethod","getDownloadFileNameFromOptions","cacheFileName","errorHandler","prepared","isWebFile","cachePrepared","downloadPrepared","possibleSize","_errorHandler","writer","truncate","downloadFileName","readBlobAsUint8Array","requestPart","dispatchProgress","throttledDispatchProgress","superpuper","isFinal","getParts","replaceParts","processedResult","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","fileSize","isBigFile","partSize","totalParts","fileId","resultInputFile","parts","md5_checksum","resolved","it","_part","doneParts","file_id","file_part","file_total_parts","fileUpload","generator","ApiManagerMethods","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","afterMessageIdTemp","setUserAuth","prepareTempMessageId","queryJSON","newResult","cacheKey","oldPromise","getNewPromise","newPromise","ignore_restriction_reasons","pin","folderPin","bio","topicPin","ApiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","baseDcId","afterMessageTempIds","changeTransportType","updateConfig","iterateNetworkers","getTransportType","connections","dcs","array","oldTransportType","oldObject","oldGetKey","newGetKey","info","changeNetworkerTransport","getBaseDcId","sessionStorage","setBaseDcId","userAuth","dcID","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","dc","logOut","loggingOut","storageKeys","storageResult","logoutPromises","ignoreErrors","toggleStorages","generateNetworkerGetKey","networkers","maxNetworkers","found","isOnline","ak","authKeyHex","serverSaltHex","authKey","bytesFromHex","authKeyId","serverSalt","authorizer","_error","newTransportType","removeTransport","stack","getNetworkerVoid","oldTransport","changeTransport","onNetworkerDrain","onDrain","removeNetworker","isFileNetworker","canRelease","setDrainTimeout","updatesProcessor","cachedNetworker","startTime","isStopped","performRequest","wrapApiCall","exportResolve","exportReject","exportedAuth","newDcId","unsetConnectionInited","rawError","waitTime","floodMaxTimeout","attachPromise","originalError","PeersStorage","neededPeers","singlePeerMap","thumbFullSize","ThumbsStorage","thumbsCache","intToUint","ulongFromInts","high","low","shiftLeft","safeBigInt","ulongBigInt","pow","longBigInt","divide","bigIntFromBytes","base","boolFalse","predicate","boolTrue","vector","gzipPacked","sliceMethod","TLSerialization","mtproto","startMaxLength","createBuffer","ArrayBuffer","intView","Int32Array","byteView","getArray","resultBuffer","resultInt32","subarray","getBuffer","getBytes","typed","resultArray","getOffset","checkLength","needBytes","previousBuffer","previousArray","writeInt","field","storeInt","storeBool","storeLongP","iHigh","iLow","storeLong","sLong","storeIntBytes","_bigInt","bigInt","isNegative","quotient","remainder","divmod","toJSNumber","storeDouble","Float64Array","storeString","sUTF8","unescape","storeBytes","bits","storeRawBytes","storeMethod","methodName","methodData","methods","m","flagsOffsets","param","condType","fieldBit","storeObject","paramName","itemType","schema","isBare","constructorData","TLDeserialization","readInt","fetchInt","fetchDouble","doubleView","fetchLong","ulong","greater","minus","greaterOrEquals","abs","fetchBool","fetchObject","fetchString","String","fromCharCode","decodeURIComponent","fetchBytes","fetchIntBytes","fetchRawBytes","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","setOffset","addPadding","blockSize","zeroes","blockSizeAsTotalLength","needPadding","padding","bufferConcats","delays","disconnectDelayMin","disconnectDelayMax","pingInterval","pingMaxTime","connectionTimeout","RESEND_OPTIONS","noSchedule","notContentRelated","invokeAfterMsgConstructor","networkerTempId","MTPNetworker","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResendReq","nextReq","checkConnectionPeriod","lastResponseTime","activeRequests","sendPingDelayDisconnect","pingDelayDisconnectDeferred","lastPingTime","disconnectDelay","round","timeoutTime","lastPingStartTime","pingId","lastPingDelayDisconnectId","wrapMtpCall","ping_id","disconnect_delay","rejectTimeout","elapsedTime","checkLongPoll","isClean","longPollPending","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","serializer","pingMessage","generateId","seq_no","generateSeqNo","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","authKeyUint8","convertToUint8Array","isFileUpload","isFileDownload","updateSession","seqNo","prevSessionId","updateSentMessage","sentMessageId","sentMessage","container","inner","innerSentMessageId","innerSentMessage","pushMessage","wrapMtpMessage","connectionInited","invokeWithLayer","initConnection","resultType","isAPI","nextReqTimeout","longPollInterval","clearPingDelayDisconnect","forceReconnectTimeout","sendingLongPoll","max_delay","wait_after","max_wait","noResponse","longPoll","delay","checkConnectionRetryAt","scheduleRequest","handleSentEncryptedRequestHTTP","noResponseMsgs","sqrt","pushResend","shouldResolve","onDrainTimeout","willChange","onConnectionStatusChange","innerMsgId","acked","getMsgKey","dataWithPadding","x","msgKeyLargePlain","msgKeyLarge","getAesKeyIv","msgKey","sha2aText","sha2bText","aesKey","aesIv","sha2a","sha2b","akStopped","performScheduledRequest","ackMsgIds","msg_ids","pendingResendReqLength","outMessage","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","compare","messageByteLength","generateContainerMessage","messageWithBody","innerMessages","getEncryptedMessage","keyIv","getDecryptedMessage","encryptedData","getEncryptedOutput","dataBuffer","paddingLength","encryptedResult","requestData","baseError","responseBuffer","deserializer","bytesCmp","calcMsgKey","totalLength","messageBodyLength","messageBody","mt_message","seqno","mt_rpc_result","req_msg_id","applyServerSalt","newServerSalt","toArray","ackMessage","reqResend","notEmpty","processMessageAck","error_message","error_code","msg","applyServerTime","serverTime","shiftRight","innerMessage","new_server_salt","bad_msg_id","changedTimeOffset","badMessage","first_msg_id","server_salt","answer_msg_id","lastResendReq","lastResend","pendingResend","reqMsgId","badMsgId","pos","NetworkerFactory","startAll","stoppedNetworkers","stopAll","setLanguage","testPublicKeysHex","modulus","exponent","publisKeysHex","publicKeysParsed","preparePromise","prepare","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","fingerprintHex","fill","foundKey","fingerprint","bytesXor","bytes1","bytes2","Authorizer","sendPlainRequest","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","sendReqPQ","nonce","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","publicKey","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","keyAesEncryptedBigInt","publicKeyModulusBigInt","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","newNonceHash","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","localTime","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","g","dhPrime","dh_prime","gA","g_a","server_time","retry","verifyDhParams","dhPrimeHex","gABigInt","dhPrimeBigInt","subtract","twoPow","gBytes","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","newNonceHash2","new_nonce_hash2","newNonceHash3","new_nonce_hash3","getTransportTypePromise","_try","TimeManager","lastMessageId","timeOffset","timeTicks","newTimeOffset","changed","server_time_offset","AppWebDocsManager","webDocument","AppPaymentsManager","getInputInvoiceBySlug","getInputInvoiceByPeerId","getPaymentForm","invoice","paymentForm","getPaymentReceipt","validateRequestedInfo","sendPaymentForm","formId","requestedInfoId","shippingOptionId","credentials","tipAmount","form_id","requested_info_id","shipping_option_id","tip_amount","clearSavedInfo","AppAttachMenuBotsManager","attachMenuBots","attachMenuBotsArr","onUpdateAttachMenuBots","getAttachMenuBots","updateAttachMenuBots","saveAttachMenuBot","attachMenuBot","bot_id","icon","getAttachMenuBotIcon","saveAttachMenuBots","getAttachMenuBotCached","requestWebView","fromBotMenu","themeParams","from_bot_menu","theme_params","prolongWebView","AppSeamlessLoginManager","requestUrlAuth","buttonId","button_id","urlAuthResult","acceptUrlAuth","writeAllowed","write_allowed","getWebAuthorizations","webAuthorizations","authorizations","resetWebAuthorization","resetWebAuthorizations","AppThemesManager","wallPapers","saveWallPaper","getWallPaper","inputWallPaper","getInputWallPaper","getThemes","accountThemes","themes","theme","themeSettings","getWallPapers","accountWallpapers","wallpapers","appManagersManager","cryptoWorkersURLs","cryptoPortsAttached","cryptoPortPromise","getManagers","manager","apply","ports","originalUrl","newURLs","createManagers","appAvatarsManager","appCallsManager","appPrivacyManager","appInlineBotsManager","passwordManager","appPaymentsManager","appSeamlessLoginManager","_serviceMessagePort","_isServiceWorkerOnline","pushedKeys","clearWrite","invokeExceptSource","serviceWorkerOnline","serviceWorkerPort","detachPort","attachPort","messagePort","onConnect","onDisconnect","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","listenMessagePort","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","ATTACH_MENU_BOT_ICON_NAME","GENERAL_TOPIC_ID","T_ME_PREFIXES","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","START_LOCAL_ID","ALPHA_CHARS_REG_EXP","ALPHA_NUMERIC_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","USERNAME_REG_EXP","BOT_COMMAND_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","encodeEmoji","emojiText","unicodeSurrogates","points","char","previous","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","__webpack_exports__","O","chunkIds","fn","priority","notFulfilled","getter","__esModule","definition","enumerable","chunkId","miniCssF","globalThis","Function","prop","Symbol","toStringTag","nmd","paths","children","scriptUrl","importScripts","currentScript","src","scripts","getElementsByTagName","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file diff --git a/public/report.html b/public/report.html index f471e4c3..e8b87f62 100644 --- a/public/report.html +++ b/public/report.html @@ -3,7 +3,7 @@ - tweb [25 Jan 2023 at 18:54] + tweb [28 Jan 2023 at 15:53] diff --git a/public/style-desktop.7ec8ed3b19fabb19d057.css b/public/style-desktop.7ec8ed3b19fabb19d057.css new file mode 100644 index 00000000..4a107c52 --- /dev/null +++ b/public/style-desktop.7ec8ed3b19fabb19d057.css @@ -0,0 +1,2 @@ +@media only screen and (min-width:721px){#auth-pages .tabs-container:after,#auth-pages .tabs-container:before{background:var(--surface-color);bottom:0;content:" ";left:-100%;position:absolute;right:0;top:0;width:100%;z-index:1}#auth-pages .tabs-container:after{left:100%}} +/*# sourceMappingURL=style-desktop.7ec8ed3b19fabb19d057.css.map*/ \ No newline at end of file diff --git a/public/style-desktop.7ec8ed3b19fabb19d057.css.map b/public/style-desktop.7ec8ed3b19fabb19d057.css.map new file mode 100644 index 00000000..a76f6acd --- /dev/null +++ b/public/style-desktop.7ec8ed3b19fabb19d057.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack://tweb/style-desktop.7ec8ed3b19fabb19d057.css"],"names":[],"mappings":"AAAA,yCAAyC,qEAAqE,gCAAgC,SAAS,YAAY,WAAW,kBAAkB,QAAQ,MAAM,WAAW,UAAU,kCAAkC","file":"style-desktop.7ec8ed3b19fabb19d057.css","sourcesContent":["@media only screen and (min-width:721px){#auth-pages .tabs-container:after,#auth-pages .tabs-container:before{background:var(--surface-color);bottom:0;content:\" \";left:-100%;position:absolute;right:0;top:0;width:100%;z-index:1}#auth-pages .tabs-container:after{left:100%}}"],"sourceRoot":""} \ No newline at end of file diff --git a/public/style-desktop.de205d0ae0e0c2493363.css b/public/style-desktop.de205d0ae0e0c2493363.css deleted file mode 100644 index 355df163..00000000 --- a/public/style-desktop.de205d0ae0e0c2493363.css +++ /dev/null @@ -1,2 +0,0 @@ -@media only screen and (min-width:721px){#auth-pages .tabs-container:after,#auth-pages .tabs-container:before{background:#fff;background:var(--surface-color);bottom:0;content:" ";left:-100%;position:absolute;right:0;top:0;width:100%;z-index:1}#auth-pages .tabs-container:after{left:100%}} -/*# sourceMappingURL=style-desktop.de205d0ae0e0c2493363.css.map*/ \ No newline at end of file diff --git a/public/style-desktop.de205d0ae0e0c2493363.css.map b/public/style-desktop.de205d0ae0e0c2493363.css.map deleted file mode 100644 index ed3e0cc6..00000000 --- a/public/style-desktop.de205d0ae0e0c2493363.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack://tweb/style-desktop.de205d0ae0e0c2493363.css"],"names":[],"mappings":"AAAA,yCAAyC,qEAAqE,gBAAgB,gCAAgC,SAAS,YAAY,WAAW,kBAAkB,QAAQ,MAAM,WAAW,UAAU,kCAAkC","file":"style-desktop.de205d0ae0e0c2493363.css","sourcesContent":["@media only screen and (min-width:721px){#auth-pages .tabs-container:after,#auth-pages .tabs-container:before{background:#fff;background:var(--surface-color);bottom:0;content:\" \";left:-100%;position:absolute;right:0;top:0;width:100%;z-index:1}#auth-pages .tabs-container:after{left:100%}}"],"sourceRoot":""} \ No newline at end of file diff --git a/public/sw.ba14f2a9396f7e4e1890.chunk.js b/public/sw.04ffa51e8d749197145b.chunk.js similarity index 99% rename from public/sw.ba14f2a9396f7e4e1890.chunk.js rename to public/sw.04ffa51e8d749197145b.chunk.js index 7bbb70d5..14f1a7f5 100644 --- a/public/sw.ba14f2a9396f7e4e1890.chunk.js +++ b/public/sw.04ffa51e8d749197145b.chunk.js @@ -1,2 +1,2 @@ (()=>{"use strict";var e,t,n={410:(e,t,n)=>{n.d(t,{GO:()=>r,ZP:()=>s});const o=n(1267).Z.debug,r="undefined"!=typeof window?window:self,s=o},4762:(e,t,n)=>{n.d(t,{IS_FIREFOX:()=>i,IS_MOBILE:()=>a,IS_SAFARI:()=>s});var o=n(6761);const r=navigator?navigator.userAgent:null,s=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&o.Z.MSStream,!!("safari"in o.Z)||!(!r||!(/\b(iPad|iPhone|iPod)\b/.test(r)||r.match("Safari")&&!r.match("Chrome")))),i=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,a=(void 0===navigator.maxTouchPoints||navigator.maxTouchPoints>0)&&-1!=navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},1352:(e,t,n)=>{n.d(t,{FK:()=>i,N5:()=>r,SU:()=>o,kC:()=>s});const o="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!o,s=r||o,i=()=>self.clients.matchAll({includeUncontrolled:!1,type:"window"}),a=(e,...t)=>{try{e.postMessage(...t)}catch(e){console.error("[worker] postMessage error:",e,t)}},c=(e,...t)=>{i().then((n=>{n.length&&n.slice(e?0:-1).forEach((e=>{a(e,...t)}))}))};o&&c.bind(null,!1),o&&c.bind(null,!0)},5003:(e,t,n)=>{n.d(t,{kg:()=>f,v9:()=>o});var o,r=n(410),s=n(4762),i=n(1352),a=n(5289);!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(o||(o={}));const c=[o.None,o.Error,o.Warn,o.Log,o.Debug],l=!(s.IS_SAFARI||s.IS_FIREFOX),u="",h="",d=[["debug",o.Debug],["info",o.Log],["warn",o.Warn],["error",o.Error],["assert",o.Error],["trace",o.Log],["group",o.Log],["groupCollapsed",o.Log],["groupEnd",o.Log]];function f(e,t=o.Log|o.Warn|o.Error,n=!1,s=""){let g;r.ZP||n||(t=o.Error),l?s||(i.SU?s=u:i.N5&&(s=h)):s="";const p=s;s=s?`%s ${s}%s`:"%s";const m=function(...n){return t&o.Log&&console.log(s,(0,a.Z)(),e,...n)};return d.forEach((([n,o])=>{m[n]=function(...r){return t&o&&console[n](s,(0,a.Z)(),e,...r)}})),m.setPrefix=function(t){g=t,e="["+t+"]"},m.setPrefix(e),m.setLevel=function(e){t=c.slice(0,e+1).reduce(((e,t)=>e|t),0)},m.bindPrefix=function(e){return f(`${g}] [${e}`,t,n,p)},m}},8592:(e,t,n)=>{n.d(t,{Vp:()=>H,cM:()=>X,j6:()=>ee});var o=n(5003);function r(e){return new Promise((t=>{setTimeout(t,e)}))}const s=self,i="cachedAssets";function a(e){return e.ok&&200===e.status}function c(e){return Promise.race([e,r(1e4).then((()=>Promise.reject()))])}function l(){}function u(){const e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach((e=>e(...t)))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise(((n,o)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,n(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,o(...e))}}));return t.catch(l).finally((()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=l)})),Object.assign(t,e),t}var h=n(6761),d=n(1267);function f(e,t=""){Array.isArray(e)||(e=[e]);const n=function(e){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","audio/wav","application/json","application/pdf"].indexOf(e)?"application/octet-stream":e}(t);return new Blob(e,{type:n})}class g{constructor(e,t,n){this.mimeType=e,this.size=t,this.saveFileCallback=n,this.bytes=new Uint8Array(t)}write(e,t){return n=this,o=void 0,s=function*(){const n=t+e.byteLength;if(n>this.bytes.byteLength){const e=new Uint8Array(n);e.set(this.bytes,0),this.bytes=e}this.bytes.set(e,t)},new((r=void 0)||(r=Promise))((function(e,t){function i(e){try{c(s.next(e))}catch(e){t(e)}}function a(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(i,a)}c((s=s.apply(n,o||[])).next())}));var n,o,r,s}truncate(){this.bytes=new Uint8Array}trim(e){this.bytes=this.bytes.slice(0,e)}finalize(e=!0){const t=f(this.bytes,this.mimeType);return e&&this.saveFileCallback&&this.saveFileCallback(t),t}getParts(){return this.bytes}replaceParts(e){this.bytes=e}}var p=n(5471);class m{constructor(e){this.dbName=e,this.useStorage=!0,d.Z.test&&(this.dbName+="_test"),m.STORAGES.length&&(this.useStorage=m.STORAGES[0].useStorage),this.openDatabase(),m.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation((t=>t.delete("/"+e)))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation((t=>t.match("/"+e)))}save(e,t){return this.timeoutOperation((n=>n.put("/"+e,t)))}getFile(e,t="blob"){return this.get(e).then((e=>{if(!e)throw(0,p.Z)("NO_ENTRY_FOUND");return e[t]()}))}saveFile(e,t){t instanceof Blob||(t=f(t));const n=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,n).then((()=>t))}timeoutOperation(e){return this.useStorage?new Promise(((t,n)=>{return o=this,r=void 0,i=function*(){let o=!1;const r=setTimeout((()=>{n(),o=!0}),15e3);try{const n=yield this.openDatabase();if(!n)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const r=yield e(n);if(o)return;t(r)}catch(e){n(e)}clearTimeout(r)},new((s=void 0)||(s=Promise))((function(e,t){function n(e){try{c(i.next(e))}catch(e){t(e)}}function a(e){try{c(i.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof s?o:new s((function(e){e(o)}))).then(n,a)}c((i=i.apply(o,r||[])).next())}));var o,r,s,i})):Promise.reject((0,p.Z)("STORAGE_OFFLINE"))}prepareWriting(e,t,n){return{deferred:u(),getWriter:()=>new g(n,t,(t=>this.saveFile(e,t).catch((()=>t))))}}static toggleStorage(e,t){return Promise.all(this.STORAGES.map((n=>{if(n.useStorage=e,t)return e?void 0:n.deleteAll()})))}}m.STORAGES=[];const v=new Map,w=new m("cachedStreamChunks"),b="Time-Cached";setInterval((()=>w.timeoutOperation((e=>e.keys().then((t=>{const n=new Map,o=Date.now()/1e3|0;for(const e of t){const t=e.url.match(/\/(\d+?)\?/);t&&!n.has(t[1])&&n.set(t[1],e)}const r=[];for(const[t,s]of n){const n=e.match(s).then((n=>{if(+n.headers.get(b)+86400<=o)return X("will delete stream chunk:",t),e.delete(s,{ignoreSearch:!0,ignoreVary:!0})}));r.push(n)}return Promise.all(r)}))))),18e5),setInterval((()=>{const e=H();for(const[t,n]of v)if(t!==e){for(const e in n)n[e].reject();v.delete(t)}}),12e4);const y=new Map;class S{constructor(e){this.info=e,this.loadedOffsets=new Set,this.destroy=()=>{y.delete(this.id)},this.id=S.getId(e),y.set(this.id,this),this.limitPart=e.size>78643200?O:P,this.destroyDebounced=function(e,t,n=!0,o=!0){let r,s,i,a,c=!1;const u=t=>{const n=i,o=a;try{n(e.apply(null,t))}catch(e){console.error("debounce error",e),o(e)}},d=(...e)=>{s||(s=new Promise(((e,t)=>(i=e,a=t)))),r?(clearTimeout(r),c=!0,a(),s=new Promise(((e,t)=>(i=e,a=t)))):n&&(u(e),c=!1);const d=h.Z.setTimeout((()=>{!o||n&&!c||u(e),r===d&&(r=s=i=a=void 0,c=!1)}),t);return r=d,s.catch(l),s};return d.clearTimeout=()=>{r&&(h.Z.clearTimeout(r),a(),r=s=i=a=void 0,c=!1)},d.isDebounced=()=>!!r,d}(this.destroy,15e4,!1,!0)}requestFilePartFromWorker(e,t,n=!1){return o=this,r=void 0,i=function*(){const o={docId:this.id,dcId:this.info.dcId,offset:e,limit:t},r=JSON.stringify(o),s=H();let i=v.get(s);i||v.set(s,i={});let a=i[r];if(a)return a.then((e=>e.bytes));this.loadedOffsets.add(e),a=i[r]=u(),ee.invoke("requestFilePart",o,void 0,s).then(a.resolve,a.reject).finally((()=>{i[r]===a&&(delete i[r],Object.keys(i).length||v.delete(s))}));const c=a.then((e=>e.bytes));return this.saveChunkToCache(c,e,t),!n&&this.preloadChunks(e,e+15*this.limitPart),c},new((s=void 0)||(s=Promise))((function(e,t){function n(e){try{c(i.next(e))}catch(e){t(e)}}function a(e){try{c(i.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof s?o:new s((function(e){e(o)}))).then(n,a)}c((i=i.apply(o,r||[])).next())}));var o,r,s,i}requestFilePartFromCache(e,t,n){const o=this.getChunkKey(e,t);return w.getFile(o).then((e=>n?new Uint8Array:function(e){return function(e){return function(e,t){return new Promise((t=>{const n=new FileReader;n.addEventListener("loadend",(e=>{t(e.target.result)})),n.readAsArrayBuffer(e)}))}(e)}(e).then((e=>new Uint8Array(e)))}(e)),(e=>{e.type}))}requestFilePart(e,t,n){return this.requestFilePartFromCache(e,t,n).then((o=>o||this.requestFilePartFromWorker(e,t,n)))}saveChunkToCache(e,t,n){return e.then((e=>{const o=this.getChunkKey(t,n),r=new Response(e,{headers:{"Content-Length":""+e.length,"Content-Type":"application/octet-stream",[b]:""+(Date.now()/1e3|0)}});return w.save(o,r)}))}preloadChunk(e){this.loadedOffsets.has(e)||(this.loadedOffsets.add(e),this.requestFilePart(e,this.limitPart,!0))}preloadChunks(e,t){if(t>this.info.size&&(t=this.info.size),e)for(;e{n===s&&o===s+r||(e=e.slice(n-s,o-s+1));const t={"Accept-Ranges":"bytes","Content-Range":`bytes ${n}-${n+e.byteLength-1}/${this.info.size||"*"}`,"Content-Length":`${e.byteLength}`};return this.info.mimeType&&(t["Content-Type"]=this.info.mimeType),new Response(e,{status:206,statusText:"Partial Content",headers:t})}))}getChunkKey(e,t){return this.id+"?offset="+e+"&limit="+t}static get(e){var t;return null!==(t=y.get(this.getId(e)))&&void 0!==t?t:new S(e)}static getId(e){return e.location.id}}const P=524288,O=1048576;function k(e,t=2048){return e-e%t}var A=n(4762);function C(e,t){const n=Object.keys,o=typeof e;return e&&t&&"object"===o&&o===typeof t?n(e).length===n(t).length&&n(e).every((n=>C(e[n],t[n]))):e===t}class E{constructor(e){!function(e,t){if(t)for(const n in t)void 0!==t[n]&&(e[n]=t[n])}(this,e),d.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,o.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),E.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var n;const o=Array.from(e.indexNames);for(const t of o)e.deleteIndex(t);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const n of t.indexes)e.indexNames.contains(n.indexName)||e.createIndex(n.indexName,n.keyPath,n.objectParameters)};try{var n=indexedDB.open(this.name,this.version);if(!n)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let o=!1;return setTimeout((()=>{o||n.onerror((0,p.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,r)=>{n.onsuccess=t=>{o=!0;const s=n.result;let i=!1;this.log("Opened"),s.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},s.onclose=e=>{this.log.error("closed:",e),!i&&this.openDatabase()},s.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(i=!0),t.onerror&&t.onerror(e),s.close()},s.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=s)},n.onerror=e=>{o=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},n.onupgradeneeded=e=>{o=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const n=e.target,r=n.result;this.stores.forEach((e=>{if(r.objectStoreNames.contains(e.name)){const o=n.transaction.objectStore(e.name);t(o,e)}else((e,n)=>{const o=e.createObjectStore(n.name);t(o,n)})(r,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new E(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}E.INSTANCES=[];class T{constructor(e,t){this.storeName=t,this.log=(0,o.kg)(["IDB",e.name,t].join("-")),this.idb=E.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,n){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(n=>e.map(((e,o)=>n.put(t[o],e)))),"",n)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,n,o=this.storeName){let r;return n&&(r=performance.now(),this.log(n+": start")),this.idb.openDatabase().then((s=>new Promise(((i,a)=>{const c=s.transaction([o],e),l=()=>{clearTimeout(d),a(c.error)},u=()=>{clearTimeout(d),n&&this.log(n+": end",performance.now()-r);const e=p.map((e=>e.result));i(g?e:e[0])};c.onerror=l;const h="readwrite"===e;h&&(c.oncomplete=()=>u());const d=setTimeout((()=>{this.log.error("transaction not finished",c,n)}),1e4),f=t(c.objectStore(o)),g=Array.isArray(f),p=g?f:[].concat(f);if(h)return;const m=p.length;let v=m;const w=()=>{c.error||--v||u()};for(let e=0;ee.getAll()),"",e)}}const j=self,x=location.protocol+"//"+location.hostname+location.pathname.split("/").slice(0,-1).join("/")+"/";let I=0,_=!A.IS_MOBILE;const D={push_mute_until:0,push_lang:{push_message_nopreview:"You have a new message",push_action_mute1d:"Mute for 24H",push_action_settings:"Settings"},push_settings:{}},F=new class{constructor(e,t,n){this.defaults=n,this.cache={},this.storage=new T(e,t)}getDefault(e){const t=this.defaults[e];return"function"==typeof t?t():t}get(e){return this.cache.hasOwnProperty(e)?this.cache[e]:this.storage.get(e).then((e=>e),(()=>{})).then((t=>this.cache.hasOwnProperty(e)?this.cache[e]:(null!=t||(t=this.getDefault(e)),this.cache[e]=t)))}getCached(e){const t=this.get(e);if(t instanceof Promise)throw"no property";return t}set(e,t){var n,o,r,s,i;return o=this,r=void 0,i=function*(){if(!C(null!==(n=this.cache[e])&&void 0!==n?n:this.defaults[e],t)){this.cache[e]=t;try{this.storage.save(e,t)}catch(e){}}},new((s=void 0)||(s=Promise))((function(e,t){function n(e){try{c(i.next(e))}catch(e){t(e)}}function a(e){try{c(i.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof s?o:new s((function(e){e(o)}))).then(n,a)}c((i=i.apply(o,r||[])).next())}))}}({name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]},"session",D);for(const e in D)F.get(e);j.addEventListener("push",(e=>{const t=e.data.json();X("push",Object.assign({},t));try{if(!t.badge)throw"no badge";const[n,o,r]=[F.getCached("push_mute_until"),F.getCached("push_settings"),F.getCached("push_lang")],s=Date.now();if(L()&&n&&s{X.error("Show notification promise",e)}))}(t,o,r);e.waitUntil(i)}catch(e){X(e)}})),j.addEventListener("notificationclick",(e=>{const t=e.notification;X("On notification click: ",t.tag),t.close();const n=e.action;if("mute1d"===n&&L())return X("[SW] mute for 1d"),void F.set("push_mute_until",Date.now()+864e5);const o=t.data;if(!o)return;const r=j.clients.matchAll({type:"window"}).then((e=>{o.action=n,R=o;for(let t=0;tj.clients.openWindow(e.baseUrl||x)))})).catch((e=>{X.error("Clients.matchAll error",e)}));e.waitUntil(r)})),j.addEventListener("notificationclose",(function(e){var t;t=e.notification,N.delete(t)}));const N=new Set;let R;function L(){return A.IS_FIREFOX}var W=n(153),M=n(410);class q extends W.Z{constructor(){super("SERVICE"),M.GO&&(M.GO.serviceMessagePort=this)}}var Z=n(1352);const U=new Map,G=(0,p.Z)("UNKNOWN");self.downloadMap=U;const B={download:e=>{const{id:t}=e;if(U.has(t))return Promise.reject(G);const n=new CountQueuingStrategy({highWaterMark:1}),o=u();let r;o.then((()=>{setTimeout((()=>{U.delete(t)}),5e3)}),(()=>{U.delete(t)}));const s=new ReadableStream({start:e=>{r=e},cancel:e=>{o.reject(G)}},n),i=Object.assign(Object.assign({},e),{readableStream:s,promise:o,controller:r});return U.set(t,i),o.catch((()=>{throw G}))},downloadChunk:({id:e,chunk:t})=>{const n=U.get(e);return n?n.controller.enqueue(t):Promise.reject()},downloadFinalize:e=>{const t=U.get(e);return t?(t.promise.resolve(),t.controller.close()):Promise.reject()},downloadCancel:e=>{const t=U.get(e);if(t)return t.promise.reject(),t.controller.error()}};function z(e,t){const n=r(100).then((()=>{const e=U.get(t);if(!e||e.used)return;e.used=!0;const n=e.readableStream;return new Response(n,{headers:e.headers})}));e.respondWith(n)}function $(){if(U.size)for(const[e,t]of U)t.controller.error()}const V={};function K(e,t){const n=e.request.formData().then((t=>(function(e,t){var n,o,r,s,i;o=this,r=void 0,i=function*(){try{X("share data",e);const o=function(e){return{files:e.getAll("files"),title:e.get("title"),text:e.get("text"),url:e.get("url")}}(e);(null!==(n=V[t])&&void 0!==n?n:V[t]=[]).push(o)}catch(e){X.warn("something wrong with the data",e)}},new((s=void 0)||(s=Promise))((function(e,t){function n(e){try{c(i.next(e))}catch(e){t(e)}}function a(e){try{c(i.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof s?o:new s((function(e){e(o)}))).then(n,a)}c((i=i.apply(o,r||[])).next())}))}(t,e.resultingClientId),Response.redirect(".."))));e.respondWith(n)}const X=(0,o.kg)("SW",o.v9.Error|o.v9.Debug|o.v9.Log|o.v9.Warn,!0),J=self;let Y;const H=()=>Y,Q=e=>{X("window connected",e.id,"windows before",oe.size),"none"!==e.frameType?(X("windows",Array.from(oe)),ee.invokeVoid("hello",void 0,e),(e=>{oe.size||Y||(X("sending message port for mtproto"),(e=>{const t=new MessageChannel;ee.attachPort(Y=t.port1),ee.invokeVoid("port",void 0,e,[t.port2])})(e))})(e),oe.set(e.id,e),function(e){const t=V[e.id];t&&(delete V[e.id],X("releasing share events to client:",e.id,"length:",t.length),t.forEach((t=>{ee.invokeVoid("share",t,e)})))}(e)):X.warn("maybe a bugged Safari starting window",e.id)},ee=new q;ee.addMultipleEventsListeners({notificationsClear:function(e){for(const e of N)try{e.close()}catch(e){}let t;return t="getNotifications"in j.registration?j.registration.getNotifications({tag:e}).then((e=>{for(let t=0,n=e.length;t{X.error("Offline register SW error",e)})):Promise.resolve(),N.clear(),t},toggleStorages:({enabled:e,clearWrite:t})=>{m.toggleStorage(e,t)},pushPing:(e,t)=>{!function(e,t){I=Date.now(),_=e.localNotifications,R&&t&&(ee.invokeVoid("pushClick",R,t),R=void 0),e.lang&&F.set("push_lang",e.lang),e.settings&&F.set("push_settings",e.settings)}(e,t)},hello:(e,t)=>{Q(t)}});const{onDownloadFetch:te,onClosedWindows:ne}=function(e){return e.addMultipleEventsListeners(B),{onDownloadFetch:z,onClosedWindows:$}}(ee);(0,Z.FK)().then((e=>{X(`got ${e.length} windows from the start`),e.forEach((e=>{Q(e)}))}));const oe=new Map;self.connectedWindows=oe,function(e,t,n){const o=(t,n)=>{e.attachListenPort(t),n&&e.attachSendPort(n)};e.setOnPortDisconnect((e=>{X("something has disconnected",e),e instanceof WindowClient&&oe.has(e.id)?(oe.delete(e.id),X("window disconnected, left",oe.size),oe.size||(X.warn("no windows left"),Y&&(ee.detachPort(Y),Y=void 0),ne())):X.warn("it is not a window")})),"undefined"!=typeof SharedWorkerGlobalScope?h.Z.addEventListener("connect",(e=>o(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?o(h.Z,null):o(h.Z,h.Z)}(ee);const re=e=>{if(!A.IS_SAFARI&&0===e.request.url.indexOf(location.origin+"/")&&e.request.url.match(/\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\?.*)?$/))return e.respondWith(function(e){return t=this,n=void 0,r=function*(){try{const t=yield c(s.caches.open(i)),n=yield c(t.match(e.request,{ignoreVary:!0}));if(n&&a(n))return n;const o={Vary:"*"};let r=yield fetch(e.request,{headers:o});if(a(r))t.put(e.request,r.clone());else if(304===r.status){const n=e.request.url.replace(/\?.+$/,"")+"?"+(1e5*Math.random()|0);r=yield fetch(n,{headers:o}),a(r)&&t.put(e.request,r.clone())}return r}catch(t){return fetch(e.request)}},new((o=void 0)||(o=Promise))((function(e,s){function i(e){try{c(r.next(e))}catch(e){s(e)}}function a(e){try{c(r.throw(e))}catch(e){s(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,a)}c((r=r.apply(t,n||[])).next())}));var t,n,o,r}(e));try{const[t,n]=e.request.url.split("/").slice(-2);switch(t){case"stream":!function(e,t){const n=function(e){if(!e)return[0,0];const[,t]=e.split("="),n=t.split(", "),[o,r]=n[0].split("-");return[+o,+r||0]}(e.request.headers.get("Range")),o=JSON.parse(decodeURIComponent(t)),r=S.get(o);e.respondWith(Promise.race([(45e3,new Promise((e=>{setTimeout((()=>{e(new Response("",{status:408,statusText:"Request timed out."}))}),45e3)}))),r.requestRange(n)]))}(e,n);break;case"download":te(e,n);break;case"share":K(e);break;case"ping":e.respondWith(new Response("pong"))}}catch(t){X.error("fetch error",t),e.respondWith(new Response("",{status:500,statusText:"Internal Server Error",headers:{"Cache-Control":"no-cache"}}))}},se=()=>{J.onfetch=re};J.addEventListener("install",(e=>{X("installing"),e.waitUntil(J.skipWaiting().then((()=>X("skipped waiting"))))})),J.addEventListener("activate",(e=>{X("activating",J),e.waitUntil(J.caches.delete(i).then((()=>X("cleared assets cache")))),e.waitUntil(J.clients.claim().then((()=>X("claimed clients"))))})),J.onoffline=J.ononline=se,se()}},o={};function r(e){var t=o[e];if(void 0!==t)return t.exports;var s=o[e]={exports:{}};return n[e](s,s.exports,r),s.exports}r.m=n,r.x=()=>{var e=r.O(void 0,[85],(()=>r(8592)));return r.O(e)},e=[],r.O=(t,n,o,s)=>{if(!n){var i=1/0;for(u=0;u=s)&&Object.keys(r.O).every((e=>r.O[e](n[c])))?n.splice(c--,1):(a=!1,s0&&e[u-1][2]>s;u--)e[u]=e[u-1];e[u]=[n,o,s]},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((t,n)=>(r.f[n](e,t),t)),[])),r.u=e=>e+".952a9f12a6b3dcdd3f0e.bundle.js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e;r.g.importScripts&&(e=r.g.location+"");var t=r.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),r.p=e})(),(()=>{if(void 0!==r){var e=r.u,t=r.e,n={},o={};r.u=function(t){return e(t)+(n.hasOwnProperty(t)?"?"+n[t]:"")},r.e=function(s){return t(s).catch((function(t){var i=o.hasOwnProperty(s)?o[s]:999999;if(i<1){var a=e(s);throw t.message="Loading chunk "+s+" failed after 999999 retries.\n("+a+")",t.request=a,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();n[s]=t,o[s]=i-1,e(r.e(s))}),3e3)}))}))}}})(),(()=>{var e={670:1};r.f.i=(t,n)=>{e[t]||importScripts(r.p+r.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],n=t.push.bind(t);t.push=t=>{var[o,s,i]=t;for(var a in s)r.o(s,a)&&(r.m[a]=s[a]);for(i&&i(r);o.length;)e[o.pop()]=1;n(t)}})(),t=r.x,r.x=()=>r.e(85).then(t),r.x()})(); -//# sourceMappingURL=sw.ba14f2a9396f7e4e1890.chunk.js.map \ No newline at end of file +//# sourceMappingURL=sw.04ffa51e8d749197145b.chunk.js.map \ No newline at end of file diff --git a/public/sw.ba14f2a9396f7e4e1890.chunk.js.map b/public/sw.04ffa51e8d749197145b.chunk.js.map similarity index 99% rename from public/sw.ba14f2a9396f7e4e1890.chunk.js.map rename to public/sw.04ffa51e8d749197145b.chunk.js.map index 80faeb55..1d2971fd 100644 --- a/public/sw.ba14f2a9396f7e4e1890.chunk.js.map +++ b/public/sw.04ffa51e8d749197145b.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"sw.ba14f2a9396f7e4e1890.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/lib/serviceWorker/cache.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/lib/files/memoryWriter.ts","webpack://tweb/./src/lib/files/cacheStorage.ts","webpack://tweb/./src/lib/serviceWorker/stream.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/lib/serviceWorker/push.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/lib/serviceWorker/serviceMessagePort.ts","webpack://tweb/./src/lib/serviceWorker/download.ts","webpack://tweb/./src/lib/serviceWorker/share.ts","webpack://tweb/./src/lib/serviceWorker/index.service.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/serviceWorker/timeout.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn __webpack_require__.e(85).then(next);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || navigator.maxTouchPoints > 0) && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// в SW может быть сразу две переменных TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n // level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","export default function pause(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from '../../helpers/schedulers/pause';\n\nconst ctx = self as any as ServiceWorkerGlobalScope;\nexport const CACHE_ASSETS_NAME = 'cachedAssets';\n\nfunction isCorrectResponse(response: Response) {\n return response.ok && response.status === 200;\n}\n\nfunction timeoutRace>(promise: T) {\n return Promise.race([\n promise,\n pause(10000).then(() => Promise.reject())\n ]);\n}\n\nexport async function requestCache(event: FetchEvent) {\n try {\n // const cache = await ctx.caches.open(CACHE_ASSETS_NAME);\n const cache = await timeoutRace(ctx.caches.open(CACHE_ASSETS_NAME));\n const file = await timeoutRace(cache.match(event.request, {ignoreVary: true}));\n\n if(file && isCorrectResponse(file)) {\n return file;\n }\n\n const headers: HeadersInit = {'Vary': '*'};\n let response = await fetch(event.request, {headers});\n if(isCorrectResponse(response)) {\n cache.put(event.request, response.clone());\n } else if(response.status === 304) { // possible fix for 304 in Safari\n const url = event.request.url.replace(/\\?.+$/, '') + '?' + (Math.random() * 100000 | 0);\n response = await fetch(url, {headers});\n if(isCorrectResponse(response)) {\n cache.put(event.request, response.clone());\n }\n }\n\n return response;\n } catch(err) {\n return fetch(event.request);\n }\n}\n","export default function noop() {}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from './noop';\n\nexport interface CancellablePromise extends Promise {\n resolve?: (value: T) => void,\n reject?: (...args: any[]) => void,\n cancel?: (reason?: any) => void,\n\n notify?: (...args: any[]) => void,\n notifyAll?: (...args: any[]) => void,\n lastNotify?: any,\n listeners?: Array<(...args: any[]) => void>,\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\n\n isFulfilled?: boolean,\n isRejected?: boolean\n}\n\nexport default function deferredPromise() {\n const deferredHelper: any = {\n isFulfilled: false,\n isRejected: false,\n\n notify: () => {},\n notifyAll: (...args: any[]) => {\n deferredHelper.lastNotify = args;\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\n },\n\n listeners: [],\n addNotifyListener: (callback: (...args: any[]) => void) => {\n if(deferredHelper.lastNotify) {\n callback(...deferredHelper.lastNotify);\n }\n\n deferredHelper.listeners.push(callback);\n }\n };\n\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\n deferredHelper.resolve = (value: T) => {\n if(deferred.isFulfilled || deferred.isRejected) return;\n\n deferred.isFulfilled = true;\n resolve(value);\n };\n\n deferredHelper.reject = (...args: any[]) => {\n if(deferred.isRejected || deferred.isFulfilled) return;\n\n deferred.isRejected = true;\n reject(...args);\n };\n });\n\n // @ts-ignore\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\n const n = deferredPromise>();\n\n }; */\n\n deferred.catch(noop).finally(() => {\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\n deferred.listeners.length = 0;\n\n if(deferred.cancel) {\n deferred.cancel = noop;\n }\n });\n\n Object.assign(deferred, deferredHelper);\n\n return deferred;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from './blobSafeMimeType';\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n const safeMimeType = blobSafeMimeType(mimeType);\n const blob = new Blob(blobParts, {type: safeMimeType});\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport StreamWriter from './streamWriter';\n\nexport default class MemoryWriter implements StreamWriter {\n private bytes: Uint8Array;\n\n constructor(\n private mimeType: string,\n private size: number,\n private saveFileCallback?: (blob: Blob) => Promise\n ) {\n this.bytes = new Uint8Array(size);\n }\n\n public async write(part: Uint8Array, offset: number) {\n // sometimes file size can be bigger than the prov\n const endOffset = offset + part.byteLength;\n if(endOffset > this.bytes.byteLength) {\n const newBytes = new Uint8Array(endOffset);\n newBytes.set(this.bytes, 0);\n this.bytes = newBytes;\n }\n\n this.bytes.set(part, offset);\n };\n\n public truncate() {\n this.bytes = new Uint8Array();\n }\n\n public trim(size: number) {\n this.bytes = this.bytes.slice(0, size);\n }\n\n public finalize(saveToStorage = true) {\n const blob = blobConstruct(this.bytes, this.mimeType);\n\n if(saveToStorage && this.saveFileCallback) {\n this.saveFileCallback(blob);\n }\n\n return blob;\n }\n\n public getParts() {\n return this.bytes;\n }\n\n public replaceParts(parts: Uint8Array) {\n this.bytes = parts;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../../config/modes';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport MemoryWriter from './memoryWriter';\nimport FileManager from './memoryWriter';\nimport FileStorage from './fileStorage';\nimport makeError from '../../helpers/makeError';\nimport deferredPromise from '../../helpers/cancellablePromise';\n\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\n\nexport default class CacheStorageController implements FileStorage {\n private static STORAGES: CacheStorageController[] = [];\n private openDbPromise: Promise;\n\n private useStorage = true;\n\n // private log: ReturnType = logger('CS');\n\n constructor(private dbName: CacheStorageDbName) {\n if(Modes.test) {\n this.dbName += '_test';\n }\n\n if(CacheStorageController.STORAGES.length) {\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\n }\n\n this.openDatabase();\n CacheStorageController.STORAGES.push(this);\n }\n\n private openDatabase(): Promise {\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\n }\n\n public delete(entryName: string) {\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\n }\n\n public deleteAll() {\n return caches.delete(this.dbName);\n }\n\n public get(entryName: string) {\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\n }\n\n public save(entryName: string, response: Response) {\n // return new Promise((resolve) => {}); // DEBUG\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\n }\n\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\n /* if(method === 'blob') {\n return Promise.reject();\n } */\n\n // const str = `get fileName: ${fileName}`;\n // console.time(str);\n return this.get(fileName).then((response) => {\n if(!response) {\n // console.warn('getFile:', response, fileName);\n throw makeError('NO_ENTRY_FOUND');\n }\n\n const promise = response[method]();\n // promise.then(() => {\n // console.timeEnd(str);\n // });\n return promise;\n });\n }\n\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct(blob);\n }\n\n const response = new Response(blob, {\n headers: {\n 'Content-Length': '' + blob.size\n }\n });\n\n return this.save(fileName, response).then(() => blob as Blob);\n }\n\n public timeoutOperation(callback: (cache: Cache) => Promise) {\n if(!this.useStorage) {\n return Promise.reject(makeError('STORAGE_OFFLINE'));\n }\n\n return new Promise(async(resolve, reject) => {\n let rejected = false;\n const timeout = setTimeout(() => {\n reject();\n // console.warn('CACHESTORAGE TIMEOUT');\n rejected = true;\n }, 15e3);\n\n try {\n const cache = await this.openDatabase();\n if(!cache) {\n this.useStorage = false;\n this.openDbPromise = undefined;\n throw 'no cache?';\n }\n\n const res = await callback(cache);\n\n if(rejected) return;\n resolve(res);\n } catch(err) {\n reject(err);\n }\n\n clearTimeout(timeout);\n });\n }\n\n public prepareWriting(fileName: string, fileSize: number, mimeType: string) {\n return {\n deferred: deferredPromise(),\n getWriter: () => {\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\n return this.saveFile(fileName, blob).catch(() => blob);\n });\n\n return writer;\n }\n };\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n return storage.deleteAll();\n }\n }));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {InputFileLocation} from '../../layer';\nimport CacheStorageController from '../files/cacheStorage';\nimport {DownloadOptions, MyUploadFile} from '../mtproto/apiFileManager';\nimport {getMtprotoMessagePort, log, serviceMessagePort} from './index.service';\nimport {ServiceRequestFilePartTaskPayload} from './serviceMessagePort';\nimport timeout from './timeout';\n\nconst deferredPromises: Map}> = new Map();\nconst cacheStorage = new CacheStorageController('cachedStreamChunks');\nconst CHUNK_TTL = 86400;\nconst CHUNK_CACHED_TIME_HEADER = 'Time-Cached';\nconst USE_CACHE = true;\n\nconst clearOldChunks = () => {\n return cacheStorage.timeoutOperation((cache) => {\n return cache.keys().then((requests) => {\n const filtered: Map = new Map();\n const timestamp = Date.now() / 1000 | 0;\n for(const request of requests) {\n const match = request.url.match(/\\/(\\d+?)\\?/);\n if(match && !filtered.has(match[1])) {\n filtered.set(match[1], request);\n }\n }\n\n const promises: Promise[] = [];\n for(const [id, request] of filtered) {\n const promise = cache.match(request).then((response) => {\n if((+response.headers.get(CHUNK_CACHED_TIME_HEADER) + CHUNK_TTL) <= timestamp) {\n log('will delete stream chunk:', id);\n return cache.delete(request, {ignoreSearch: true, ignoreVary: true});\n }\n });\n\n promises.push(promise);\n }\n\n return Promise.all(promises);\n });\n });\n};\n\nsetInterval(clearOldChunks, 1800e3);\nsetInterval(() => {\n const mtprotoMessagePort = getMtprotoMessagePort();\n for(const [messagePort, promises] of deferredPromises) {\n if(messagePort !== mtprotoMessagePort) {\n for(const taskId in promises) {\n const promise = promises[taskId];\n promise.reject();\n }\n\n deferredPromises.delete(messagePort);\n }\n }\n}, 120e3);\n\ntype StreamRange = [number, number];\ntype StreamId = DocId;\nconst streams: Map = new Map();\nclass Stream {\n private destroyDebounced: () => void;\n private id: StreamId;\n private limitPart: number;\n private loadedOffsets: Set = new Set();\n\n constructor(private info: DownloadOptions) {\n this.id = Stream.getId(info);\n streams.set(this.id, this);\n\n // ! если грузить очень большое видео чанками по 512Кб в мобильном Safari, то стрим не запустится\n this.limitPart = info.size > (75 * 1024 * 1024) ? STREAM_CHUNK_UPPER_LIMIT : STREAM_CHUNK_MIDDLE_LIMIT;\n this.destroyDebounced = debounce(this.destroy, 150000, false, true);\n }\n\n private destroy = () => {\n streams.delete(this.id);\n };\n\n private async requestFilePartFromWorker(alignedOffset: number, limit: number, fromPreload = false) {\n const payload: ServiceRequestFilePartTaskPayload = {\n docId: this.id,\n dcId: this.info.dcId,\n offset: alignedOffset,\n limit\n };\n\n const taskId = JSON.stringify(payload);\n\n const mtprotoMessagePort = getMtprotoMessagePort();\n let promises = deferredPromises.get(mtprotoMessagePort);\n if(!promises) {\n deferredPromises.set(mtprotoMessagePort, promises = {});\n }\n\n let deferred = promises[taskId];\n if(deferred) {\n return deferred.then((uploadFile) => uploadFile.bytes);\n }\n\n this.loadedOffsets.add(alignedOffset);\n\n deferred = promises[taskId] = deferredPromise();\n\n serviceMessagePort.invoke('requestFilePart', payload, undefined, mtprotoMessagePort)\n .then(deferred.resolve, deferred.reject).finally(() => {\n if(promises[taskId] === deferred) {\n delete promises[taskId];\n\n if(!Object.keys(promises).length) {\n deferredPromises.delete(mtprotoMessagePort);\n }\n }\n });\n\n const bytesPromise = deferred.then((uploadFile) => uploadFile.bytes);\n\n if(USE_CACHE) {\n this.saveChunkToCache(bytesPromise, alignedOffset, limit);\n !fromPreload && this.preloadChunks(alignedOffset, alignedOffset + (this.limitPart * 15));\n }\n\n return bytesPromise;\n }\n\n private requestFilePartFromCache(alignedOffset: number, limit: number, fromPreload?: boolean) {\n if(!USE_CACHE) {\n return Promise.resolve();\n }\n\n const key = this.getChunkKey(alignedOffset, limit);\n return cacheStorage.getFile(key).then((blob: Blob) => {\n return fromPreload ? new Uint8Array() : readBlobAsUint8Array(blob);\n }, (error: ApiError) => {\n if(error.type === 'NO_ENTRY_FOUND') {\n return;\n }\n });\n }\n\n private requestFilePart(alignedOffset: number, limit: number, fromPreload?: boolean) {\n return this.requestFilePartFromCache(alignedOffset, limit, fromPreload).then((bytes) => {\n return bytes || this.requestFilePartFromWorker(alignedOffset, limit, fromPreload);\n });\n }\n\n private saveChunkToCache(deferred: Promise, alignedOffset: number, limit: number) {\n return deferred.then((bytes) => {\n const key = this.getChunkKey(alignedOffset, limit);\n const response = new Response(bytes, {\n headers: {\n 'Content-Length': '' + bytes.length,\n 'Content-Type': 'application/octet-stream',\n [CHUNK_CACHED_TIME_HEADER]: '' + (Date.now() / 1000 | 0)\n }\n });\n\n return cacheStorage.save(key, response);\n });\n }\n\n private preloadChunk(offset: number) {\n if(this.loadedOffsets.has(offset)) {\n return;\n }\n\n this.loadedOffsets.add(offset);\n this.requestFilePart(offset, this.limitPart, true);\n }\n\n private preloadChunks(offset: number, end: number) {\n if(end > this.info.size) {\n end = this.info.size;\n }\n\n if(!offset) { // load last chunk for bounds\n this.preloadChunk(alignOffset(offset, this.limitPart));\n } else { // don't preload next chunks before the start\n for(; offset < end; offset += this.limitPart) {\n this.preloadChunk(offset);\n }\n }\n }\n\n public requestRange(range: StreamRange) {\n this.destroyDebounced();\n\n const possibleResponse = responseForSafariFirstRange(range, this.info.mimeType, this.info.size);\n if(possibleResponse) {\n return possibleResponse;\n }\n\n let [offset, end] = range;\n\n /* if(info.size > limitPart && isSafari && offset === limitPart) {\n //end = info.size - 1;\n //offset = info.size - 1 - limitPart;\n offset = info.size - (info.size % limitPart);\n } */\n\n const limit = end && end < this.limitPart ? alignLimit(end - offset + 1) : this.limitPart;\n const alignedOffset = alignOffset(offset, limit);\n\n if(!end) {\n end = Math.min(offset + limit, this.info.size - 1);\n }\n\n return this.requestFilePart(alignedOffset, limit).then((ab) => {\n // log.debug('[stream] requestFilePart result:', result);\n\n // if(isSafari) {\n if(offset !== alignedOffset || end !== (alignedOffset + limit)) {\n ab = ab.slice(offset - alignedOffset, end - alignedOffset + 1);\n }\n\n const headers: Record = {\n 'Accept-Ranges': 'bytes',\n 'Content-Range': `bytes ${offset}-${offset + ab.byteLength - 1}/${this.info.size || '*'}`,\n 'Content-Length': `${ab.byteLength}`\n };\n\n if(this.info.mimeType) {\n headers['Content-Type'] = this.info.mimeType;\n }\n\n // simulate slow connection\n // setTimeout(() => {\n return new Response(ab, {\n status: 206,\n statusText: 'Partial Content',\n headers\n });\n // }, 2.5e3);\n });\n }\n\n private getChunkKey(alignedOffset: number, limit: number) {\n return this.id + '?offset=' + alignedOffset + '&limit=' + limit;\n }\n\n public static get(info: DownloadOptions) {\n return streams.get(this.getId(info)) ?? new Stream(info);\n }\n\n private static getId(info: DownloadOptions) {\n return (info.location as InputFileLocation.inputDocumentFileLocation).id;\n }\n}\n\nexport default function onStreamFetch(event: FetchEvent, params: string) {\n const range = parseRange(event.request.headers.get('Range'));\n const info: DownloadOptions = JSON.parse(decodeURIComponent(params));\n const stream = Stream.get(info);\n\n // log.debug('[stream]', url, offset, end);\n\n event.respondWith(Promise.race([\n timeout(45 * 1000),\n stream.requestRange(range)\n ]));\n}\n\nfunction responseForSafariFirstRange(range: StreamRange, mimeType: string, size: number): Response {\n if(range[0] === 0 && range[1] === 1) {\n return new Response(new Uint8Array(2).buffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: {\n 'Accept-Ranges': 'bytes',\n 'Content-Range': `bytes 0-1/${size || '*'}`,\n 'Content-Length': '2',\n 'Content-Type': mimeType || 'video/mp4'\n }\n });\n }\n\n return null;\n}\n\n/* const STREAM_CHUNK_UPPER_LIMIT = 256 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 256 * 4; */\n/* const STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 1024 * 4; */\nconst STREAM_CHUNK_MIDDLE_LIMIT = 512 * 1024;\nconst STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 512 * 4;\n\nfunction parseRange(header: string): StreamRange {\n if(!header) return [0, 0];\n const [, chunks] = header.split('=');\n const ranges = chunks.split(', ');\n const [offset, end] = ranges[0].split('-');\n\n return [+offset, +end || 0];\n}\n\nfunction alignOffset(offset: number, base = SMALLEST_CHUNK_LIMIT) {\n return offset - (offset % base);\n}\n\nfunction alignLimit(limit: number) {\n return 2 ** Math.ceil(Math.log(limit) / Math.log(2));\n}\n","// * Jolly Cobra's schedulers\n\nimport ctx from '../../environment/ctx';\nimport {AnyFunction, Awaited} from '../../types';\nimport noop from '../noop';\n\nexport type DebounceReturnType = {\n (...args: Parameters): Promise>>;\n clearTimeout(): void;\n isDebounced(): boolean;\n};\n\nexport default function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true\n): DebounceReturnType {\n let waitingTimeout: number;\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\n let hadNewCall = false;\n\n const invoke = (args: Parameters) => {\n const _resolve = resolve, _reject = reject;\n try {\n const result = fn.apply(null, args);\n _resolve(result);\n } catch(err) {\n console.error('debounce error', err);\n // @ts-ignore\n _reject(err);\n }\n };\n\n const debounce = (...args: Parameters) => {\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\n\n if(waitingTimeout) {\n clearTimeout(waitingTimeout);\n hadNewCall = true;\n reject();\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\n } else if(shouldRunFirst) {\n invoke(args);\n hadNewCall = false;\n }\n\n const _waitingTimeout = ctx.setTimeout(() => {\n // will run if should run last or first but with new call\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\n invoke(args);\n }\n\n // if debounce was called during invoking\n if(waitingTimeout === _waitingTimeout) {\n waitingTimeout = waitingPromise = resolve = reject = undefined;\n hadNewCall = false;\n }\n }, ms);\n\n waitingTimeout = _waitingTimeout;\n waitingPromise.catch(noop);\n return waitingPromise;\n };\n\n debounce.clearTimeout = () => {\n if(waitingTimeout) {\n ctx.clearTimeout(waitingTimeout);\n reject();\n waitingTimeout = waitingPromise = resolve = reject = undefined;\n hadNewCall = false;\n }\n };\n\n debounce.isDebounced = () => !!waitingTimeout;\n\n return debounce;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsArrayBuffer from './readBlobAsArrayBuffer';\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(const i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport DATABASE_STATE from '../../config/databases/state';\nimport {IS_FIREFOX, IS_MOBILE} from '../../environment/userAgent';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport IDBStorage from '../files/idb';\nimport {log, serviceMessagePort} from './index.service';\nimport {ServicePushPingTaskPayload} from './serviceMessagePort';\n\nconst ctx = self as any as ServiceWorkerGlobalScope;\nconst defaultBaseUrl = location.protocol + '//' + location.hostname + location.pathname.split('/').slice(0, -1).join('/') + '/';\n\n// as in webPushApiManager.ts\nconst PING_PUSH_TIMEOUT = 10000 + 1500;\nlet lastPingTime = 0;\nlet localNotificationsAvailable = !IS_MOBILE;\n\nexport type PushNotificationObject = {\n loc_key: string,\n loc_args: string[],\n // user_id: number, // should be number\n custom: {\n channel_id?: string, // should be number\n chat_id?: string, // should be number\n from_id?: string, // should be number\n msg_id: string,\n peerId?: string, // should be number\n silent?: string // can be '1'\n },\n sound?: string,\n random_id: number,\n badge?: string, // should be number\n description: string,\n mute: string, // should be number\n title: string,\n message?: string,\n\n action?: 'mute1d' | 'push_settings', // will be set before postMessage to main thread\n};\n\nclass SomethingGetter, Storage extends Record> {\n private cache: Partial = {};\n private storage: IDBStorage;\n\n constructor(\n db: T,\n storeName: typeof db['stores'][number]['name'],\n private defaults: {\n [Property in keyof Storage]: ((value: Storage[Property]) => Storage[Property]) | Storage[Property]\n }\n ) {\n this.storage = new IDBStorage(db, storeName);\n }\n\n private getDefault(key: T) {\n const callback = this.defaults[key];\n return typeof(callback) === 'function' ? callback() : callback;\n }\n\n public get(key: T) {\n if(this.cache.hasOwnProperty(key)) {\n return this.cache[key];\n }\n\n const promise = this.storage.get(key as string) as Promise;\n return promise.then((value) => value, () => undefined as Storage[T]).then((value) => {\n if(this.cache.hasOwnProperty(key)) {\n return this.cache[key];\n }\n\n value ??= this.getDefault(key);\n\n return this.cache[key] = value;\n });\n }\n\n public getCached(key: T) {\n const value = this.get(key);\n if(value instanceof Promise) {\n throw 'no property';\n }\n\n return value;\n }\n\n public async set(key: T, value: Storage[T]) {\n const cached = this.cache[key] ?? this.defaults[key];\n if(deepEqual(cached, value)) {\n return;\n }\n\n this.cache[key] = value;\n\n try {\n this.storage.save(key as string, value);\n } catch(err) {\n\n }\n }\n}\n\ntype PushStorage = {\n push_mute_until: number,\n push_lang: Partial\n push_settings: Partial\n};\n\nconst defaults: PushStorage = {\n push_mute_until: 0,\n push_lang: {\n push_message_nopreview: 'You have a new message',\n push_action_mute1d: 'Mute for 24H',\n push_action_settings: 'Settings'\n },\n push_settings: {}\n};\n\nconst getter = new SomethingGetter(DATABASE_STATE, 'session', defaults);\n\n// fill cache\nfor(const i in defaults) {\n getter.get(i as keyof PushStorage);\n}\n\nctx.addEventListener('push', (event) => {\n const obj: PushNotificationObject = event.data.json();\n log('push', {...obj});\n\n try {\n if(!obj.badge) {\n throw 'no badge';\n }\n\n const [muteUntil, settings, lang] = [\n getter.getCached('push_mute_until'),\n getter.getCached('push_settings'),\n getter.getCached('push_lang')\n ];\n\n const nowTime = Date.now();\n if(\n userInvisibleIsSupported() &&\n muteUntil &&\n nowTime < muteUntil\n ) {\n throw `Supress notification because mute for ${Math.ceil((muteUntil - nowTime) / 60000)} min`;\n }\n\n const hasActiveWindows = (Date.now() - lastPingTime) <= PING_PUSH_TIMEOUT && localNotificationsAvailable;\n if(hasActiveWindows) {\n throw 'Supress notification because some instance is alive';\n }\n\n const notificationPromise = fireNotification(obj, settings, lang);\n event.waitUntil(notificationPromise);\n } catch(err) {\n log(err);\n }\n});\n\nctx.addEventListener('notificationclick', (event) => {\n const notification = event.notification;\n log('On notification click: ', notification.tag);\n notification.close();\n\n const action = event.action as PushNotificationObject['action'];\n if(action === 'mute1d' && userInvisibleIsSupported()) {\n log('[SW] mute for 1d');\n getter.set('push_mute_until', Date.now() + 86400e3);\n return;\n }\n\n const data: PushNotificationObject = notification.data;\n if(!data) {\n return;\n }\n\n const promise = ctx.clients.matchAll({\n type: 'window'\n }).then((clientList) => {\n data.action = action;\n pendingNotification = data;\n for(let i = 0; i < clientList.length; i++) {\n const client = clientList[i];\n if('focus' in client) {\n client.focus();\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, client);\n pendingNotification = undefined;\n return;\n }\n }\n\n if(ctx.clients.openWindow) {\n return Promise.resolve(getter.get('push_settings')).then((settings) => {\n return ctx.clients.openWindow(settings.baseUrl || defaultBaseUrl);\n });\n }\n }).catch((error) => {\n log.error('Clients.matchAll error', error);\n })\n\n event.waitUntil(promise);\n});\n\nctx.addEventListener('notificationclose', onCloseNotification);\n\nconst notifications: Set = new Set();\nlet pendingNotification: PushNotificationObject;\nfunction pushToNotifications(notification: Notification) {\n if(!notifications.has(notification)) {\n notifications.add(notification);\n // @ts-ignore\n notification.onclose = onCloseNotification;\n }\n}\n\nfunction onCloseNotification(event: NotificationEvent) {\n removeFromNotifications(event.notification)\n}\n\nfunction removeFromNotifications(notification: Notification) {\n notifications.delete(notification);\n}\n\nexport function closeAllNotifications(tag?: string) {\n for(const notification of notifications) {\n try {\n notification.close();\n } catch(e) {}\n }\n\n let promise: Promise;\n if('getNotifications' in ctx.registration) {\n promise = ctx.registration.getNotifications({tag}).then((notifications) => {\n for(let i = 0, len = notifications.length; i < len; ++i) {\n try {\n notifications[i].close();\n } catch(e) {}\n }\n }).catch((error) => {\n log.error('Offline register SW error', error);\n });\n } else {\n promise = Promise.resolve();\n }\n\n notifications.clear();\n\n return promise;\n}\n\nfunction userInvisibleIsSupported() {\n return IS_FIREFOX;\n}\n\nfunction fireNotification(obj: PushNotificationObject, settings: PushStorage['push_settings'], lang: PushStorage['push_lang']) {\n const icon = 'assets/img/logo_filled_rounded.png';\n const badge = 'assets/img/masked.svg';\n let title = obj.title || 'Telegram';\n let body = obj.description || '';\n let peerId: string;\n\n if(obj.custom) {\n if(obj.custom.channel_id) {\n peerId = '' + -obj.custom.channel_id;\n } else if(obj.custom.chat_id) {\n peerId = '' + -obj.custom.chat_id;\n } else {\n peerId = obj.custom.from_id || '';\n }\n }\n\n obj.custom.peerId = '' + peerId;\n let tag = 'peer' + peerId;\n\n if(settings?.nopreview) {\n title = 'Telegram';\n body = lang.push_message_nopreview;\n tag = 'unknown_peer';\n }\n\n log('show notify', title, body, icon, obj);\n\n const actions: (Omit & {action: PushNotificationObject['action']})[] = [{\n action: 'mute1d',\n title: lang.push_action_mute1d\n }/* , {\n action: 'push_settings',\n title: lang.push_action_settings || 'Settings'\n } */];\n\n const notificationPromise = ctx.registration.showNotification(title, {\n body,\n icon,\n tag,\n data: obj,\n actions,\n badge,\n silent: obj.custom.silent === '1'\n });\n\n return notificationPromise.catch((error) => {\n log.error('Show notification promise', error);\n });\n}\n\nexport function onPing(payload: ServicePushPingTaskPayload, source?: MessageEventSource) {\n lastPingTime = Date.now();\n localNotificationsAvailable = payload.localNotifications;\n\n if(pendingNotification && source) {\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, source);\n pendingNotification = undefined;\n }\n\n if(payload.lang) {\n getter.set('push_lang', payload.lang);\n }\n\n if(payload.settings) {\n getter.set('push_settings', payload.settings);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Database} from '.';\nimport type {IDBIndex} from '../../lib/files/idb';\n\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\n name: 'tweb',\n version: 7,\n stores: [{\n name: 'session'\n }, {\n name: 'stickerSets'\n }, {\n name: 'users'\n }, {\n name: 'chats'\n }, {\n name: 'dialogs'\n // indexes: [\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\n // const name = `index_${idx}`;\n // const index: IDBIndex = {\n // indexName: name,\n // keyPath: name,\n // objectParameters: {}\n // };\n\n // return index\n // })\n // ]\n }, {\n name: 'messages'\n }]\n};\n\nexport default DATABASE_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WebPushApiManager} from '../mtproto/webPushApiManager';\nimport type {PushNotificationObject} from './push';\nimport type {MyUploadFile} from '../mtproto/apiFileManager';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport type ServicePushPingTaskPayload = {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n};\n\nexport type ServiceRequestFilePartTaskPayload = {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n};\n\nexport type ServiceDownloadTaskPayload = {\n headers: any,\n id: string\n};\n\nexport type ServiceEvent = {\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\n};\n\nexport default class ServiceMessagePort extends SuperMessagePort<{\n // from main thread to service worker\n notificationsClear: () => void,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => void,\n pushPing: (payload: ServicePushPingTaskPayload, source: MessageEventSource, event: MessageEvent) => void,\n hello: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n\n // from mtproto worker\n download: (payload: ServiceDownloadTaskPayload) => void,\n downloadChunk: (payload: {id: ServiceDownloadTaskPayload['id'], chunk: Uint8Array}) => void\n downloadFinalize: (payload: ServiceDownloadTaskPayload['id']) => void,\n downloadCancel: (payload: ServiceDownloadTaskPayload['id']) => void\n}, {\n // to main thread\n pushClick: (payload: PushNotificationObject) => void,\n hello: (payload: void, source: MessageEventSource) => void,\n share: (payload: ShareData) => void,\n\n // to mtproto worker\n requestFilePart: (payload: ServiceRequestFilePartTaskPayload) => Promise | MyUploadFile\n} & ServiceEvent, Master> {\n constructor() {\n super('SERVICE');\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.serviceMessagePort = this);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ServiceDownloadTaskPayload} from './serviceMessagePort';\nimport type ServiceMessagePort from './serviceMessagePort';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport makeError from '../../helpers/makeError';\nimport pause from '../../helpers/schedulers/pause';\n\ntype DownloadType = Uint8Array;\ntype DownloadItem = ServiceDownloadTaskPayload & {\n // transformStream: TransformStream,\n readableStream: ReadableStream,\n // writableStream: WritableStream,\n // writer: WritableStreamDefaultWriter,\n // controller: TransformStreamDefaultController,\n controller: ReadableStreamController,\n promise: CancellablePromise,\n // downloadPromise: Promise,\n used?: boolean\n};\nconst downloadMap: Map = new Map();\nconst DOWNLOAD_ERROR = makeError('UNKNOWN');\nconst DOWNLOAD_TEST = false;\n\n(self as any).downloadMap = downloadMap;\n\ntype A = Parameters['addMultipleEventsListeners']>[0];\n\nconst events: A = {\n download: (payload) => {\n const {id} = payload;\n if(downloadMap.has(id)) {\n return Promise.reject(DOWNLOAD_ERROR);\n }\n\n // const y = (20 * 1024 * 1024) / payload.limitPart;\n // const strategy = new ByteLengthQueuingStrategy({highWaterMark: y});\n // let controller: TransformStreamDefaultController;\n const strategy = new CountQueuingStrategy({highWaterMark: 1});\n // const transformStream = new TransformStream(/* {\n // start: (_controller) => controller = _controller,\n // }, */undefined, strategy, strategy);\n\n // const {readable, writable} = transformStream;\n // const writer = writable.getWriter();\n\n const promise = deferredPromise();\n promise.then(() => {\n setTimeout(() => {\n downloadMap.delete(id);\n }, 5e3);\n }, () => {\n downloadMap.delete(id);\n });\n\n // writer.closed.then(promise.resolve, promise.reject);\n\n let controller: ReadableStreamController;\n const readable = new ReadableStream({\n start: (_controller) => {\n controller = _controller;\n },\n\n cancel: (reason) => {\n promise.reject(DOWNLOAD_ERROR);\n }\n }, strategy);\n\n // writer.closed.catch(noop).finally(() => {\n // log.error('closed writer');\n // onEnd();\n // });\n\n // const downloadPromise = writer.closed.catch(() => {throw DOWNLOAD_ERROR;});\n const item: DownloadItem = {\n ...payload,\n // transformStream,\n readableStream: readable,\n // writableStream: writable,\n // writer,\n // downloadPromise,\n promise,\n controller\n };\n\n downloadMap.set(id, item);\n\n // return downloadPromise;\n return promise.catch(() => {throw DOWNLOAD_ERROR});\n },\n\n downloadChunk: ({id, chunk}) => {\n const item = downloadMap.get(id);\n if(!item) {\n return Promise.reject();\n }\n\n // return item.controller.enqueue(chunk);\n // return item.writer.write(chunk);\n // @ts-ignore\n return item.controller.enqueue(chunk);\n },\n\n downloadFinalize: (id) => {\n const item = downloadMap.get(id);\n if(!item) {\n return Promise.reject();\n }\n\n item.promise.resolve();\n // return item.controller.terminate();\n // return item.writer.close();\n return item.controller.close();\n },\n\n downloadCancel: (id) => {\n const item = downloadMap.get(id);\n if(!item) {\n return;\n }\n\n item.promise.reject();\n // return item.controller.error();\n // return item.writer.abort();\n return item.controller.error();\n }\n};\n\nexport default function handleDownload(serviceMessagePort: ServiceMessagePort) {\n serviceMessagePort.addMultipleEventsListeners(events);\n\n return {\n onDownloadFetch,\n onClosedWindows: cancelAllDownloads\n };\n}\n\nfunction onDownloadFetch(event: FetchEvent, params: string) {\n const promise = pause(100).then(() => {\n const item = downloadMap.get(params);\n if(!item || (item.used && !DOWNLOAD_TEST)) {\n return;\n }\n\n item.used = true;\n const stream = item.readableStream;\n const response = new Response(stream, {headers: item.headers});\n return response;\n });\n\n event.respondWith(promise);\n}\n\nfunction cancelAllDownloads() {\n if(downloadMap.size) {\n for(const [id, item] of downloadMap) {\n // item.writer.abort().catch(noop);\n item.controller.error();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {log, serviceMessagePort} from './index.service';\n\nconst deferred: {[id: string]: ShareData[]} = {};\n\nfunction parseFormData(formData: FormData): ShareData {\n return {\n files: formData.getAll('files') as File[],\n title: formData.get('title') as string,\n text: formData.get('text') as string,\n url: formData.get('url') as string\n };\n}\n\nasync function processShareEvent(formData: FormData, clientId: string) {\n try {\n log('share data', formData);\n const data = parseFormData(formData);\n (deferred[clientId] ??= []).push(data);\n } catch(err) {\n log.warn('something wrong with the data', err);\n }\n};\n\nexport function checkWindowClientForDeferredShare(windowClient: WindowClient) {\n const arr = deferred[windowClient.id];\n if(!arr) {\n return;\n }\n\n delete deferred[windowClient.id];\n\n log('releasing share events to client:', windowClient.id, 'length:', arr.length);\n arr.forEach((data) => {\n serviceMessagePort.invokeVoid('share', data, windowClient);\n });\n}\n\nexport default function onShareFetch(event: FetchEvent, params: string) {\n const promise = event.request.formData()\n .then((formData) => {\n processShareEvent(formData, event.resultingClientId)\n return Response.redirect('..');\n });\n\n event.respondWith(promise);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n \n \n \n\nimport {logger, LogTypes} from '../logger';\nimport {CACHE_ASSETS_NAME, requestCache} from './cache';\nimport onStreamFetch from './stream';\nimport {closeAllNotifications, onPing} from './push';\nimport CacheStorageController from '../files/cacheStorage';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport ServiceMessagePort from './serviceMessagePort';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport {getWindowClients} from '../../helpers/context';\nimport {MessageSendPort} from '../mtproto/superMessagePort';\nimport handleDownload from './download';\nimport onShareFetch, {checkWindowClientForDeferredShare} from './share';\n\nexport const log = logger('SW', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn, true);\nconst ctx = self as any as ServiceWorkerGlobalScope;\n\n \nlet _mtprotoMessagePort: MessagePort;\nexport const getMtprotoMessagePort = () => _mtprotoMessagePort;\n\nconst sendMessagePort = (source: MessageSendPort) => {\n const channel = new MessageChannel();\n serviceMessagePort.attachPort(_mtprotoMessagePort = channel.port1);\n serviceMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\n};\n\nconst sendMessagePortIfNeeded = (source: MessageSendPort) => {\n if(!connectedWindows.size && !_mtprotoMessagePort) {\n log('sending message port for mtproto');\n sendMessagePort(source);\n }\n};\n\nconst onWindowConnected = (source: WindowClient) => {\n log('window connected', source.id, 'windows before', connectedWindows.size);\n\n if(source.frameType === 'none') {\n log.warn('maybe a bugged Safari starting window', source.id);\n return;\n }\n\n log('windows', Array.from(connectedWindows));\n serviceMessagePort.invokeVoid('hello', undefined, source);\n sendMessagePortIfNeeded(source);\n connectedWindows.set(source.id, source);\n\n checkWindowClientForDeferredShare(source);\n};\n\nexport const serviceMessagePort = new ServiceMessagePort();\nserviceMessagePort.addMultipleEventsListeners({\n notificationsClear: closeAllNotifications,\n\n toggleStorages: ({enabled, clearWrite}) => {\n CacheStorageController.toggleStorage(enabled, clearWrite);\n },\n\n pushPing: (payload, source) => {\n onPing(payload, source);\n },\n\n hello: (payload, source) => {\n onWindowConnected(source as any as WindowClient);\n }\n});\n\nconst {\n onDownloadFetch,\n onClosedWindows: onDownloadClosedWindows\n} = handleDownload(serviceMessagePort);\n\n// * service worker can be killed, so won't get 'hello' event\ngetWindowClients().then((windowClients) => {\n log(`got ${windowClients.length} windows from the start`);\n windowClients.forEach((windowClient) => {\n onWindowConnected(windowClient);\n });\n});\n\nconst connectedWindows: Map = new Map();\n(self as any).connectedWindows = connectedWindows;\nlistenMessagePort(serviceMessagePort, undefined, (source) => {\n log('something has disconnected', source);\n const isWindowClient = source instanceof WindowClient;\n if(!isWindowClient || !connectedWindows.has(source.id)) {\n log.warn('it is not a window');\n return;\n }\n\n connectedWindows.delete(source.id);\n log('window disconnected, left', connectedWindows.size);\n if(!connectedWindows.size) {\n log.warn('no windows left');\n\n if(_mtprotoMessagePort) {\n serviceMessagePort.detachPort(_mtprotoMessagePort);\n _mtprotoMessagePort = undefined;\n }\n\n onDownloadClosedWindows();\n }\n});\n \n\nconst onFetch = (event: FetchEvent): void => {\n \n if(\n !IS_SAFARI &&\n event.request.url.indexOf(location.origin + '/') === 0 &&\n event.request.url.match(/\\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\\?.*)?$/)\n ) {\n return event.respondWith(requestCache(event));\n }\n \n\n try {\n // const [, url, scope, params] = /http[:s]+\\/\\/.*?(\\/(.*?)(?:$|\\/(.*)$))/.exec(event.request.url) || [];\n const [scope, params] = event.request.url.split('/').slice(-2);\n\n // log.debug('[fetch]:', event);\n\n switch(scope) {\n case 'stream': {\n onStreamFetch(event, params);\n break;\n }\n\n case 'download': {\n onDownloadFetch(event, params);\n break;\n }\n\n case 'share': {\n onShareFetch(event, params);\n break;\n }\n\n case 'ping': {\n event.respondWith(new Response('pong'));\n break;\n }\n }\n } catch(err) {\n log.error('fetch error', err);\n event.respondWith(new Response('', {\n status: 500,\n statusText: 'Internal Server Error',\n headers: {'Cache-Control': 'no-cache'}\n }));\n }\n};\n\nconst onChangeState = () => {\n ctx.onfetch = onFetch;\n};\n\nctx.addEventListener('install', (event) => {\n log('installing');\n event.waitUntil(ctx.skipWaiting().then(() => log('skipped waiting'))); // Activate worker immediately\n});\n\nctx.addEventListener('activate', (event) => {\n log('activating', ctx);\n event.waitUntil(ctx.caches.delete(CACHE_ASSETS_NAME).then(() => log('cleared assets cache')));\n event.waitUntil(ctx.clients.claim().then(() => log('claimed clients')));\n});\n\n// ctx.onerror = (error) => {\n// log.error('error:', error);\n// };\n\n// ctx.onunhandledrejection = (error) => {\n// log.error('onunhandledrejection:', error);\n// };\n\nctx.onoffline = ctx.ononline = onChangeState;\n\nonChangeState();\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\n }\n}\n","export default function timeout(delay: number): Promise {\n return new Promise(((resolve) => {\n setTimeout(() => {\n resolve(new Response('', {\n status: 408,\n statusText: 'Request timed out.'\n }));\n }, delay);\n }));\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [85], () => (__webpack_require__(8592)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + \"952a9f12a6b3dcdd3f0e\" + \".bundle.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t670: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","IS_MOBILE","undefined","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","getWindowClients","clients","matchAll","includeUncontrolled","type","postMessage","listener","args","err","console","error","notifyServiceWorker","all","then","listeners","length","slice","forEach","bind","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","pause","ms","Promise","resolve","setTimeout","ctx","CACHE_ASSETS_NAME","isCorrectResponse","response","ok","status","timeoutRace","promise","race","reject","noop","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","callback","addNotifyListener","push","value","catch","finally","cancel","Object","assign","blobConstruct","blobParts","mimeType","Array","isArray","safeMimeType","blobSafeMimeType","Blob","MemoryWriter","constructor","size","saveFileCallback","this","bytes","Uint8Array","write","part","offset","endOffset","byteLength","newBytes","set","truncate","trim","finalize","saveToStorage","blob","getParts","replaceParts","parts","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","save","put","getFile","fileName","makeError","saveFile","Response","headers","rejected","timeout","res","clearTimeout","prepareWriting","fileSize","getWriter","static","enabled","clearWrite","map","storage","deferredPromises","Map","cacheStorage","CHUNK_CACHED_TIME_HEADER","setInterval","keys","requests","filtered","timestamp","Date","now","request","url","has","promises","id","ignoreSearch","ignoreVary","mtprotoMessagePort","getMtprotoMessagePort","messagePort","taskId","streams","Stream","info","loadedOffsets","Set","destroy","getId","limitPart","STREAM_CHUNK_UPPER_LIMIT","STREAM_CHUNK_MIDDLE_LIMIT","destroyDebounced","fn","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","_resolve","_reject","apply","debounce","_waitingTimeout","isDebounced","requestFilePartFromWorker","alignedOffset","limit","fromPreload","payload","docId","dcId","JSON","stringify","uploadFile","add","serviceMessagePort","bytesPromise","saveChunkToCache","preloadChunks","requestFilePartFromCache","key","getChunkKey","reader","FileReader","addEventListener","e","target","result","readBlobAs","readBlobAsArrayBuffer","buffer","readBlobAsUint8Array","requestFilePart","preloadChunk","end","alignOffset","requestRange","range","possibleResponse","statusText","responseForSafariFirstRange","Math","ceil","alignLimit","min","ab","location","base","deepEqual","x","y","tx","every","IDB","db","object","fromObject","i","safeAssign","name","storageIsAvailable","join","INSTANCES","isAvailable","createNew","createIndexes","os","store","indexNames","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","indexedDB","version","message","finished","onerror","onsuccess","event","calledNew","onclose","onabort","transaction","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","find","instance","preserve","IDBStorage","storeName","idb","create","concat","getObjectStore","clear","idx","mode","perf","performance","onError","onComplete","results","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","defaultBaseUrl","protocol","hostname","pathname","split","lastPingTime","localNotificationsAvailable","defaults","push_mute_until","push_lang","push_message_nopreview","push_action_mute1d","push_action_settings","push_settings","getter","getDefault","hasOwnProperty","getCached","obj","data","json","badge","muteUntil","settings","lang","nowTime","userInvisibleIsSupported","notificationPromise","icon","peerId","title","body","description","custom","channel_id","chat_id","from_id","tag","nopreview","actions","action","registration","showNotification","silent","fireNotification","waitUntil","notification","clientList","pendingNotification","client","focus","invokeVoid","openWindow","baseUrl","notifications","ServiceMessagePort","super","downloadMap","DOWNLOAD_ERROR","events","download","strategy","CountQueuingStrategy","highWaterMark","controller","readable","ReadableStream","start","_controller","reason","item","readableStream","downloadChunk","chunk","enqueue","downloadFinalize","downloadCancel","onDownloadFetch","params","used","stream","respondWith","cancelAllDownloads","onShareFetch","formData","clientId","files","text","parseFormData","processShareEvent","resultingClientId","redirect","_mtprotoMessagePort","onWindowConnected","source","connectedWindows","frameType","channel","MessageChannel","attachPort","port1","port2","sendMessagePort","sendMessagePortIfNeeded","windowClient","arr","checkWindowClientForDeferredShare","addMultipleEventsListeners","notificationsClear","getNotifications","len","toggleStorages","toggleStorage","pushPing","localNotifications","onPing","hello","onClosedWindows","onDownloadClosedWindows","handleDownload","windowClients","onConnect","onDisconnect","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","WindowClient","detachPort","listenMessagePort","onFetch","origin","file","fetch","clone","replace","random","requestCache","scope","header","chunks","ranges","parseRange","parse","decodeURIComponent","onStreamFetch","onChangeState","onfetch","skipWaiting","claim","onoffline","ononline","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","__webpack_exports__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","splice","d","definition","o","defineProperty","enumerable","f","chunkId","u","miniCssF","g","globalThis","Function","prop","prototype","call","scriptUrl","importScripts","document","currentScript","src","scripts","getElementsByTagName","p","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime","pop"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"sw.04ffa51e8d749197145b.chunk.js","mappings":"uBAAIA,ECAAC,E,4CCQG,MACMC,E,QAAoB,QAEpBC,EADuB,oBAAb,OAA2BC,OAASC,KAE3D,G,yFCJO,MAAMC,EAAaC,UAAYA,UAAUC,UAAY,KAU/CC,GATWF,UAAUC,UAAUE,OAAO,yBACzBH,UAAUC,UAAUG,cAAcC,QAAQ,WACzC,SAASC,KAAKN,UAAUC,YAAc,aAAaK,KAAKN,UAAUO,SAG7D,mBAAmBD,KAAKN,UAAUQ,WACxC,aAAvBR,UAAUQ,UAA2BR,UAAUS,eAAiB,IAC/D,gBAEwB,oBAAuBV,KAAe,yBAAyBO,KAAKP,IAAkBA,EAAWW,MAAM,YAAcX,EAAWW,MAAM,aACrJC,EAAaX,UAAUC,UAAUG,cAAcC,QAAQ,YAAc,EAIrEO,QAA0CC,IAA7Bb,UAAUS,gBAAgCT,UAAUS,eAAiB,KAAuJ,GAAjJT,UAAUC,UAAUE,OAAO,iH,8DChBzH,MAAMW,EAAwD,oBAA7BC,0BAA4CjB,gBAAgBiB,yBACvFC,EAA6C,oBAAtBC,mBAAqCnB,gBAAgBmB,oBAAsBH,EAClGI,EAAYF,GAAiBF,EAE7BK,EAAmB,IACtBrB,KACPsB,QACAC,SAAS,CAACC,qBAAqB,EAAOC,KAAM,WAKzCC,EAAc,CAACC,KAAwDC,KAC3E,IAEED,EAASD,eAAeE,E,CACxB,MAAMC,GACNC,QAAQC,MAAM,8BAA+BF,EAAKD,E,GAIhDI,EAAsB,CAACC,KAAiBL,KAC5CP,IAAmBa,MAAMC,IACnBA,EAAUC,QAKdD,EAAUE,MAAMJ,EAAM,GAAK,GAAGK,SAASX,IACrCD,EAAYC,KAAaC,EAAK,GAC9B,GACF,EASyBZ,GAAoBgB,EAAoBO,KAAK,MAAM,GACvDvB,GAAoBgB,EAAoBO,KAAK,MAAM,E,gDCrChEC,E,wCAAZ,SAAYA,GACV,mBACA,qBACA,mBACA,iBACA,oBACD,CAND,CAAYA,IAAAA,EAAQ,KAQb,MAAMC,EAAa,CAACD,EAASE,KAAMF,EAASG,MAAOH,EAASI,KAAMJ,EAASK,IAAKL,EAASM,OAmB1FC,IAjBY,EAAA3C,WAAa,EAAAS,YA8BlBmC,EAaD,QAbCA,EAgBH,QAiCJC,EAA0I,CAC9I,CAAC,QAAST,EAASM,OACnB,CAAC,OAAQN,EAASK,KAClB,CAAC,OAAQL,EAASI,MAClB,CAAC,QAASJ,EAASG,OACnB,CAAC,SAAUH,EAASG,OACpB,CAAC,QAASH,EAASK,KACnB,CAAC,QAASL,EAASK,KACnB,CAAC,iBAAkBL,EAASK,KAC5B,CAAC,WAAYL,EAASK,MAIjB,SAASK,EAAOC,EAAgB1B,EAAiBe,EAASK,IAAML,EAASI,KAAOJ,EAASG,MAAOS,GAAmB,EAAOC,EAAQ,IACvI,IAAIC,EACA,MAAUF,IACZ3B,EAAOe,EAASG,OAGdI,EAEOM,IACN,KAAmBA,EAAQL,EACtB,OAAeK,EAAQL,IAH/BK,EAAQ,GAMV,MAAME,EAAgBF,EACZA,EAAPA,EAAe,MAAMA,MACX,KAIb,MAAMG,EAAc,YAAY5B,GAC9B,OAAOH,EAAOe,EAASK,KAAOf,QAAQ0B,IAAIH,GAAO,SAAMF,KAA0CvB,EACnG,EAuBA,OArBAqB,EAAQX,SAAQ,EAAEmB,EAAQC,MACxBF,EAAIC,GAAU,YAAY7B,GACxB,OAAOH,EAAOiC,GAAW5B,QAAQ2B,GAAQJ,GAAO,SAAMF,KAA0CvB,EAClG,CAAC,IAGH4B,EAAIG,UAAY,SAASC,GACvBN,EAAiBM,EACjBT,EAAS,IAAMS,EAAY,GAC7B,EAEAJ,EAAIG,UAAUR,GAEdK,EAAIK,SAAW,SAASC,GACtBrC,EAAOgB,EAAWJ,MAAM,EAAGyB,EAAQ,GAAGC,QAAO,CAACC,EAAKC,IAAMD,EAAMC,GAAG,EACpE,EAEAT,EAAIU,WAAa,SAASf,GACxB,OAAOD,EAAO,GAAGI,OAAoBH,IAAU1B,EAAM2B,EAAkBG,EACzE,EAEOC,CACT,C,oEC9Je,SAASW,EAAMC,GAC5B,OAAO,IAAIC,SAAeC,IACxBC,WAAWD,EAASF,EAAG,GAE3B,CCIA,MAAMI,EAAMxE,KACCyE,EAAoB,eAEjC,SAASC,EAAkBC,GACzB,OAAOA,EAASC,IAA0B,MAApBD,EAASE,MACjC,CAEA,SAASC,EAAoCC,GAC3C,OAAOV,QAAQW,KAAK,CAClBD,EACAZ,EAAM,KAAOjC,MAAK,IAAMmC,QAAQY,YAEpC,CCpBe,SAASC,IAAQ,CCuBjB,SAASC,IACtB,MAAMC,EAAsB,CAC1BC,aAAa,EACbC,YAAY,EAEZC,OAAQ,OACRC,UAAW,IAAI5D,KACbwD,EAAeK,WAAa7D,EAC5BwD,EAAejD,UAAUG,SAASoD,GAAkBA,KAAY9D,IAAM,EAGxEO,UAAW,GACXwD,kBAAoBD,IACfN,EAAeK,YAChBC,KAAYN,EAAeK,YAG7BL,EAAejD,UAAUyD,KAAKF,EAAS,GAIrC/F,EAAkC,IAAI0E,SAAW,CAACC,EAASW,KAC/DG,EAAed,QAAWuB,IACrBlG,EAAS0F,aAAe1F,EAAS2F,aAEpC3F,EAAS0F,aAAc,EACvBf,EAAQuB,GAAM,EAGhBT,EAAeH,OAAS,IAAIrD,KACvBjC,EAAS2F,YAAc3F,EAAS0F,cAEnC1F,EAAS2F,YAAa,EACtBL,KAAUrD,GAAK,CAChB,IAoBH,OAXAjC,EAASmG,MAAMZ,GAAMa,SAAQ,KAC3BpG,EAAS4F,OAAS5F,EAAS6F,UAAY7F,EAAS8F,WAAa,KAC7D9F,EAASwC,UAAUC,OAAS,EAEzBzC,EAASqG,SACVrG,EAASqG,OAASd,E,IAItBe,OAAOC,OAAOvG,EAAUyF,GAEjBzF,CACT,C,wBCjEe,SAASwG,EAA6CC,EAAyBC,EAAmB,IAC3GC,MAAMC,QAAQH,KAChBA,EAAY,CAACA,IAGf,MAAMI,ECNO,SAA0BH,GACvC,OAgByB,IAhBtB,CACD,aACA,YACA,YACA,gBACA,aACA,YACA,YACA,aACA,kBACA,YACA,aACA,YACA,YACA,mBACA,mBACA9F,QAAQ8F,GACD,2BAGFA,CACT,CDhBuBI,CAAiBJ,GAEtC,OADa,IAAIK,KAAKN,EAAW,CAAC3E,KAAM+E,GAE1C,CEZe,MAAMG,EAGnBC,YACUP,EACAQ,EACAC,GAFA,KAAAT,SAAAA,EACA,KAAAQ,KAAAA,EACA,KAAAC,iBAAAA,EAERC,KAAKC,MAAQ,IAAIC,WAAWJ,EAC9B,CAEaK,MAAMC,EAAkBC,G,qCAEnC,MAAMC,EAAYD,EAASD,EAAKG,WAChC,GAAGD,EAAYN,KAAKC,MAAMM,WAAY,CACpC,MAAMC,EAAW,IAAIN,WAAWI,GAChCE,EAASC,IAAIT,KAAKC,MAAO,GACzBD,KAAKC,MAAQO,C,CAGfR,KAAKC,MAAMQ,IAAIL,EAAMC,EACvB,E,+RAEOK,WACLV,KAAKC,MAAQ,IAAIC,UACnB,CAEOS,KAAKb,GACVE,KAAKC,MAAQD,KAAKC,MAAM3E,MAAM,EAAGwE,EACnC,CAEOc,SAASC,GAAgB,GAC9B,MAAMC,EAAO1B,EAAcY,KAAKC,MAAOD,KAAKV,UAM5C,OAJGuB,GAAiBb,KAAKD,kBACvBC,KAAKD,iBAAiBe,GAGjBA,CACT,CAEOC,WACL,OAAOf,KAAKC,KACd,CAEOe,aAAaC,GAClBjB,KAAKC,MAAQgB,CACf,E,cCxCa,MAAMC,EAQnBrB,YAAoBsB,GAAA,KAAAA,OAAAA,EAJZ,KAAAC,YAAa,EAKhB,WACDpB,KAAKmB,QAAU,SAGdD,EAAuBG,SAAShG,SACjC2E,KAAKoB,WAAaF,EAAuBG,SAAS,GAAGD,YAGvDpB,KAAKsB,eACLJ,EAAuBG,SAASxC,KAAKmB,KACvC,CAEQsB,e,MACN,OAAyB,QAAlB,EAAAtB,KAAKuB,qBAAa,QAAKvB,KAAKuB,cAAgBC,OAAOC,KAAKzB,KAAKmB,OACtE,CAEOO,OAAOC,GACZ,OAAO3B,KAAK4B,kBAAkBC,GAAUA,EAAMH,OAAO,IAAMC,IAC7D,CAEOG,YACL,OAAON,OAAOE,OAAO1B,KAAKmB,OAC5B,CAEOY,IAAIJ,GACT,OAAO3B,KAAK4B,kBAAkBC,GAAUA,EAAMhI,MAAM,IAAM8H,IAC5D,CAEOK,KAAKL,EAAmB/D,GAE7B,OAAOoC,KAAK4B,kBAAkBC,GAAUA,EAAMI,IAAI,IAAMN,EAAW/D,IACrE,CAEOsE,QAAQC,EAAkBzF,EAAmC,QAOlE,OAAOsD,KAAK+B,IAAII,GAAUhH,MAAMyC,IAC9B,IAAIA,EAEF,MAAM,EAAAwE,EAAA,GAAU,kBAOlB,OAJgBxE,EAASlB,IAIX,GAElB,CAEO2F,SAASF,EAAkBrB,GAE3BA,aAAgBnB,OACnBmB,EAAO1B,EAAc0B,IAGvB,MAAMlD,EAAW,IAAI0E,SAASxB,EAAM,CAClCyB,QAAS,CACP,iBAAkB,GAAKzB,EAAKhB,QAIhC,OAAOE,KAAKgC,KAAKG,EAAUvE,GAAUzC,MAAK,IAAM2F,GAClD,CAEOc,iBAAoBjD,GACzB,OAAIqB,KAAKoB,WAIF,IAAI9D,SAAW,CAAMC,EAASW,KAAW,O,EAAA,K,OAAA,E,EAAA,YAC9C,IAAIsE,GAAW,EACf,MAAMC,EAAUjF,YAAW,KACzBU,IAEAsE,GAAW,CAAI,GACd,MAEH,IACE,MAAMX,QAAc7B,KAAKsB,eACzB,IAAIO,EAGF,MAFA7B,KAAKoB,YAAa,EAClBpB,KAAKuB,mBAAgBvH,EACf,YAGR,MAAM0I,QAAY/D,EAASkD,GAE3B,GAAGW,EAAU,OACbjF,EAAQmF,E,CACR,MAAM5H,GACNoD,EAAOpD,E,CAGT6H,aAAaF,EACf,E,YAzBgD,K,6QAyB9C,IA5BOnF,QAAQY,QAAO,EAAAkE,EAAA,GAAU,mBA6BpC,CAEOQ,eAAeT,EAAkBU,EAAkBvD,GACxD,MAAO,CACL1G,SAAUwF,IACV0E,UAAW,IACM,IAAIlD,EAAaN,EAAUuD,GAAW/B,GAC5Cd,KAAKqC,SAASF,EAAUrB,GAAM/B,OAAM,IAAM+B,MAMzD,CAEOiC,qBAAqBC,EAAkBC,GAC5C,OAAO3F,QAAQpC,IAAI8E,KAAKqB,SAAS6B,KAAKC,IAGpC,GAFAA,EAAQ/B,WAAa4B,EAEjBC,EAIJ,OAAID,OAAJ,EACSG,EAAQrB,W,IAGrB,EAvIe,EAAAT,SAAqC,GCDtD,MAAM+B,EAA2F,IAAIC,IAC/FC,EAAe,IAAIpC,EAAuB,sBAE1CqC,EAA2B,cAgCjCC,aA7BuB,IACdF,EAAa1B,kBAAkBC,GAC7BA,EAAM4B,OAAOtI,MAAMuI,IACxB,MAAMC,EAAmC,IAAIN,IACvCO,EAAYC,KAAKC,MAAQ,IAAO,EACtC,IAAI,MAAMC,KAAWL,EAAU,CAC7B,MAAM7J,EAAQkK,EAAQC,IAAInK,MAAM,cAC7BA,IAAU8J,EAASM,IAAIpK,EAAM,KAC9B8J,EAASlD,IAAI5G,EAAM,GAAIkK,E,CAI3B,MAAMG,EAA2B,GACjC,IAAI,MAAOC,EAAIJ,KAAYJ,EAAU,CACnC,MAAM3F,EAAU6D,EAAMhI,MAAMkK,GAAS5I,MAAMyC,IACzC,IAAKA,EAAS2E,QAAQR,IAAIwB,GAnBlB,OAmB4DK,EAElE,OADAnH,EAAI,4BAA6B0H,GAC1BtC,EAAMH,OAAOqC,EAAS,CAACK,cAAc,EAAMC,YAAY,G,IAIlEH,EAASrF,KAAKb,E,CAGhB,OAAOV,QAAQpC,IAAIgJ,EAAS,OAKN,MAC5BV,aAAY,KACV,MAAMc,EAAqBC,IAC3B,IAAI,MAAOC,EAAaN,KAAad,EACnC,GAAGoB,IAAgBF,EAAoB,CACrC,IAAI,MAAMG,KAAUP,EACFA,EAASO,GACjBvG,SAGVkF,EAAiB1B,OAAO8C,E,IAG3B,MAIH,MAAME,EAAiC,IAAIrB,IAC3C,MAAMsB,EAMJ9E,YAAoB+E,GAAA,KAAAA,KAAAA,EAFZ,KAAAC,cAA6B,IAAIC,IAWjC,KAAAC,QAAU,KAChBL,EAAQhD,OAAO1B,KAAKmE,GAAG,EATvBnE,KAAKmE,GAAKQ,EAAOK,MAAMJ,GACvBF,EAAQjE,IAAIT,KAAKmE,GAAInE,MAGrBA,KAAKiF,UAAYL,EAAK9E,KAAO,SAAqBoF,EAA2BC,EAC7EnF,KAAKoF,iBCrEM,SACbC,EACAhI,EACAiI,GAAiB,EACjBC,GAAgB,GAEhB,IAAIC,EACAC,EAAiDlI,EAAgCW,EACjFwH,GAAa,EAEjB,MAAMC,EAAU9K,IACd,MAAM+K,EAAWrI,EAASsI,EAAU3H,EACpC,IAEE0H,EADeP,EAAGS,MAAM,KAAMjL,G,CAE9B,MAAMC,GACNC,QAAQC,MAAM,iBAAkBF,GAEhC+K,EAAQ/K,E,GAINiL,EAAW,IAAIlL,KACf4K,IAAgBA,EAAiB,IAAInI,SAAQ,CAACsI,EAAUC,KAAatI,EAAUqI,EAAU1H,EAAS2H,MAEnGL,GACD7C,aAAa6C,GACbE,GAAa,EACbxH,IACAuH,EAAiB,IAAInI,SAAQ,CAACsI,EAAUC,KAAatI,EAAUqI,EAAU1H,EAAS2H,MAC1EP,IACRK,EAAO9K,GACP6K,GAAa,GAGf,MAAMM,EAAkB,gBAAe,MAElCT,GAAmBD,IAAkBI,GACtCC,EAAO9K,GAIN2K,IAAmBQ,IACpBR,EAAiBC,EAAiBlI,EAAUW,OAASlE,EACrD0L,GAAa,E,GAEdrI,GAIH,OAFAmI,EAAiBQ,EACjBP,EAAe1G,MAAMZ,GACdsH,CAAc,EAcvB,OAXAM,EAASpD,aAAe,KACnB6C,IACD,iBAAiBA,GACjBtH,IACAsH,EAAiBC,EAAiBlI,EAAUW,OAASlE,EACrD0L,GAAa,E,EAIjBK,EAASE,YAAc,MAAQT,EAExBO,CACT,CDI4BA,CAAS/F,KAAK+E,QAAS,MAAQ,GAAO,EAChE,CAMcmB,0BAA0BC,EAAuBC,EAAeC,GAAc,G,qCAC1F,MAAMC,EAA6C,CACjDC,MAAOvG,KAAKmE,GACZqC,KAAMxG,KAAK4E,KAAK4B,KAChBnG,OAAQ8F,EACRC,SAGI3B,EAASgC,KAAKC,UAAUJ,GAExBhC,EAAqBC,IAC3B,IAAIL,EAAWd,EAAiBrB,IAAIuC,GAChCJ,GACFd,EAAiB3C,IAAI6D,EAAoBJ,EAAW,CAAC,GAGvD,IAAItL,EAAWsL,EAASO,GACxB,GAAG7L,EACD,OAAOA,EAASuC,MAAMwL,GAAeA,EAAW1G,QAGlDD,KAAK6E,cAAc+B,IAAIT,GAEvBvN,EAAWsL,EAASO,GAAUrG,IAE9ByI,GAAmBlB,OAAO,kBAAmBW,OAAStM,EAAWsK,GAChEnJ,KAAKvC,EAAS2E,QAAS3E,EAASsF,QAAQc,SAAQ,KAC5CkF,EAASO,KAAY7L,WACfsL,EAASO,GAEZvF,OAAOuE,KAAKS,GAAU7I,QACxB+H,EAAiB1B,OAAO4C,G,IAK9B,MAAMwC,EAAelO,EAASuC,MAAMwL,GAAeA,EAAW1G,QAO9D,OAJED,KAAK+G,iBAAiBD,EAAcX,EAAeC,IAClDC,GAAerG,KAAKgH,cAAcb,EAAeA,EAAkC,GAAjBnG,KAAKiF,WAGnE6B,CACT,E,+RAEQG,yBAAyBd,EAAuBC,EAAeC,GAKrE,MAAMa,EAAMlH,KAAKmH,YAAYhB,EAAeC,GAC5C,OAAO9C,EAAapB,QAAQgF,GAAK/L,MAAM2F,GAC9BuF,EAAc,IAAInG,WErIhB,SAA8BY,GAC3C,OCDa,SAA+BA,GAC5C,OCGa,SAAoBA,EAAYpE,GAE7C,OAAO,IAAIY,SAAcC,IACvB,MAAM6J,EAAS,IAAIC,WACnBD,EAAOE,iBAAiB,WAAYC,IAElChK,EAAQgK,EAAEC,OAAOC,OAAO,IAE1BL,EAAa,kBAAEtG,EAAK,GAExB,CDbS4G,CAAW5G,EACpB,CDDS6G,CAAsB7G,GAAM3F,MAAMyM,GAAW,IAAI1H,WAAW0H,IACrE,CFmI8CC,CAAqB/G,KAC3D9F,IACCA,EAAMN,I,GAIb,CAEQoN,gBAAgB3B,EAAuBC,EAAeC,GAC5D,OAAOrG,KAAKiH,yBAAyBd,EAAeC,EAAOC,GAAalL,MAAM8E,GACrEA,GAASD,KAAKkG,0BAA0BC,EAAeC,EAAOC,IAEzE,CAEQU,iBAAiBnO,EAA+BuN,EAAuBC,GAC7E,OAAOxN,EAASuC,MAAM8E,IACpB,MAAMiH,EAAMlH,KAAKmH,YAAYhB,EAAeC,GACtCxI,EAAW,IAAI0E,SAASrC,EAAO,CACnCsC,QAAS,CACP,iBAAkB,GAAKtC,EAAM5E,OAC7B,eAAgB,2BAChB,CAACkI,GAA2B,IAAMM,KAAKC,MAAQ,IAAO,MAI1D,OAAOR,EAAatB,KAAKkF,EAAKtJ,EAAS,GAE3C,CAEQmK,aAAa1H,GAChBL,KAAK6E,cAAcZ,IAAI5D,KAI1BL,KAAK6E,cAAc+B,IAAIvG,GACvBL,KAAK8H,gBAAgBzH,EAAQL,KAAKiF,WAAW,GAC/C,CAEQ+B,cAAc3G,EAAgB2H,GAKpC,GAJGA,EAAMhI,KAAK4E,KAAK9E,OACjBkI,EAAMhI,KAAK4E,KAAK9E,MAGdO,EAGF,KAAMA,EAAS2H,EAAK3H,GAAUL,KAAKiF,UACjCjF,KAAK+H,aAAa1H,QAHpBL,KAAK+H,aAAaE,EAAY5H,EAAQL,KAAKiF,WAM/C,CAEOiD,aAAaC,GAClBnI,KAAKoF,mBAEL,MAAMgD,EA2EV,SAAqCD,EAAoB7I,EAAkBQ,GACzE,OAAgB,IAAbqI,EAAM,IAAyB,IAAbA,EAAM,GAClB,IAAI7F,SAAS,IAAIpC,WAAW,GAAG0H,OAAQ,CAC5C9J,OAAQ,IACRuK,WAAY,kBACZ9F,QAAS,CACP,gBAAiB,QACjB,gBAAiB,aAAazC,GAAQ,MACtC,iBAAkB,IAClB,eAAgBR,GAAY,eAK3B,IACT,CA1F6BgJ,CAA4BH,EAAOnI,KAAK4E,KAAKtF,SAAUU,KAAK4E,KAAK9E,MAC1F,GAAGsI,EACD,OAAOA,EAGT,IAAK/H,EAAQ2H,GAAOG,EAQpB,MAAM/B,EAAQ4B,GAAOA,EAAMhI,KAAKiF,UAoGpC,SAAoBmB,GAClB,OAAO,WAAKmC,KAAKC,KAAKD,KAAK9L,IAAI2J,GAASmC,KAAK9L,IAAI,IACnD,CAtGgDgM,CAAWT,EAAM3H,EAAS,GAAKL,KAAKiF,UAC1EkB,EAAgB8B,EAAY5H,EAAQ+F,GAM1C,OAJI4B,IACFA,EAAMO,KAAKG,IAAIrI,EAAS+F,EAAOpG,KAAK4E,KAAK9E,KAAO,IAG3CE,KAAK8H,gBAAgB3B,EAAeC,GAAOjL,MAAMwN,IAInDtI,IAAW8F,GAAiB6B,IAAS7B,EAAgBC,IACtDuC,EAAKA,EAAGrN,MAAM+E,EAAS8F,EAAe6B,EAAM7B,EAAgB,IAG9D,MAAM5D,EAAkC,CACtC,gBAAiB,QACjB,gBAAiB,SAASlC,KAAUA,EAASsI,EAAGpI,WAAa,KAAKP,KAAK4E,KAAK9E,MAAQ,MACpF,iBAAkB,GAAG6I,EAAGpI,cAS1B,OANGP,KAAK4E,KAAKtF,WACXiD,EAAQ,gBAAkBvC,KAAK4E,KAAKtF,UAK/B,IAAIgD,SAASqG,EAAI,CACtB7K,OAAQ,IACRuK,WAAY,kBACZ9F,WACA,GAGN,CAEQ4E,YAAYhB,EAAuBC,GACzC,OAAOpG,KAAKmE,GAAK,WAAagC,EAAgB,UAAYC,CAC5D,CAEOrD,WAAW6B,G,MAChB,OAAoC,QAA7B,EAAAF,EAAQ3C,IAAI/B,KAAKgF,MAAMJ,WAAM,QAAI,IAAID,EAAOC,EACrD,CAEQ7B,aAAa6B,GACnB,OAAQA,EAAKgE,SAAyDzE,EACxE,EAqCF,MAAMgB,EAA4B,OAC5BD,EAA2B,QAYjC,SAAS+C,EAAY5H,EAAgBwI,EAXR,MAY3B,OAAOxI,EAAUA,EAASwI,CAC5B,C,cKnTe,SAASC,EAAUC,EAAQC,GACxC,MAAMnL,EAAKqB,OAAOuE,KAAMwF,SAAYF,EACpC,OAAOA,GAAKC,GAAY,WAAPC,GAAmBA,WADeD,EAEjDnL,EAAGkL,GAAG1N,SAAWwC,EAAGmL,GAAG3N,QACrBwC,EAAGkL,GAAGG,OAAOhC,GAAQ4B,EAAUC,EAAE7B,GAAM8B,EAAE9B,MACxC6B,IAAMC,CACb,CCkCO,MAAMG,EAUXtJ,YAAYuJ,IClDC,SAAuBC,EAAWC,GAC/C,GAAGA,EACD,IAAI,MAAMC,KAAKD,OACQtP,IAAlBsP,EAAWC,KAEZF,EAAOE,GAAKD,EAAWC,GAM/B,CDwCIC,CAAWxJ,KAAMoJ,GAEd,WACDpJ,KAAKyJ,MAAQ,SAGfzJ,KAAK0J,oBAAqB,EAC1B1J,KAAKvD,KAAM,EAAAN,EAAA,IAAO,CAAC,MAAOiN,EAAGK,MAAME,KAAK,MACxC3J,KAAKvD,IAAI,eAETuD,KAAKsB,cAAa,GAElB6H,EAAIS,UAAU/K,KAAKmB,KACrB,CAEO6J,cACL,OAAO7J,KAAK0J,kBACd,CAEOpI,aAAawI,GAAY,GAC9B,GAAG9J,KAAKuB,gBAAkBuI,EACxB,OAAO9J,KAAKuB,cAGd,MAAMwI,EAAgB,CAACC,EAAoBC,K,MACzC,MAAMC,EAAa3K,MAAM4K,KAAKH,EAAGE,YACjC,IAAI,MAAME,KAAaF,EACrBF,EAAGK,YAAYD,GAGjB,GAAiB,QAAb,EAAAH,EAAMK,eAAO,eAAEjP,OAInB,IAAI,MAAMkP,KAASN,EAAMK,QACpBN,EAAGE,WAAWM,SAASD,EAAMH,YAIhCJ,EAAGS,YAAYF,EAAMH,UAAWG,EAAMG,QAASH,EAAMI,iB,EASzD,IACE,IAAI5G,EAAU6G,UAAUnJ,KAAKzB,KAAKyJ,KAAMzJ,KAAK6K,SAE7C,IAAI9G,EACF,OAAOzG,QAAQY,Q,CAEjB,MAAMlD,GAGN,OAFAgF,KAAKvD,IAAIzB,MAAM,mBAAqBA,EAAgB8P,SACpD9K,KAAK0J,oBAAqB,EACnBpM,QAAQY,OAAOlD,E,CAGxB,IAAI+P,GAAW,EAOf,OANAvN,YAAW,KACLuN,GACFhH,EAAQiH,SAAQ,EAAA5I,EAAA,GAAU,sB,GAE3B,KAEIpC,KAAKuB,cAAgB,IAAIjE,SAAqB,CAACC,EAASW,KAC7D6F,EAAQkH,UAAaC,IACnBH,GAAW,EACX,MAAM3B,EAAKrF,EAAQ0D,OACnB,IAAI0D,GAAY,EAEhBnL,KAAKvD,IAAI,UAET2M,EAAG4B,QAAWhQ,IACZgF,KAAK0J,oBAAqB,EAC1B1J,KAAKvD,IAAIzB,MAAM,8CAA+CA,GAC9DkD,EAAOlD,EAAM,EAGfoO,EAAGgC,QAAW7D,IACZvH,KAAKvD,IAAIzB,MAAM,UAAWuM,IACzB4D,GAAanL,KAAKsB,cAAc,EAGnC8H,EAAGiC,QAAW9D,IACZvH,KAAKvD,IAAIzB,MAAM,SAAUuM,GACzB,MAAM+D,EAAc/D,EAAEC,OAEtBxH,KAAKsB,aAAa6J,GAAY,GAE3BG,EAAYN,SACbM,EAAYN,QAAQzD,GAGtB6B,EAAGmC,OAAO,EAGZnC,EAAGoC,gBAAmBjE,IACpBvH,KAAKvD,IAAIzB,MAAM,wBAAwB,EAGzCuC,EAAQyC,KAAKoJ,GAAKA,EAAG,EAGvBrF,EAAQiH,QAAWE,IACjBH,GAAW,EACX/K,KAAK0J,oBAAqB,EAC1B1J,KAAKvD,IAAIzB,MAAM,8CAA+CkQ,GAC9DhN,EAAOgN,EAAM,EAGfnH,EAAQ0H,gBAAmBP,IACzBH,GAAW,EACX/K,KAAKvD,IAAIiP,KAAK,8BAA+BR,EAAMS,WAAY,KAAMT,EAAMU,YAE3E,MAAMpE,EAAS0D,EAAM1D,OACf4B,EAAK5B,EAAOC,OAClBzH,KAAK6L,OAAOtQ,SAAS0O,IAOnB,GAAIb,EAAG0C,iBAAiBtB,SAASP,EAAMR,MAEhC,CACL,MACMO,EADMxC,EAAO8D,YACJS,YAAY9B,EAAMR,MACjCM,EAAcC,EAAIC,E,KAxFA,EAACb,EAAiBa,KAC1C,MAAMD,EAAKZ,EAAG4C,kBAAkB/B,EAAMR,MACtCM,EAAcC,EAAIC,EAAM,EAkFlB+B,CAAkB5C,EAAIa,E,GAMxB,CACH,GAEL,CAEOlH,cAAuCqG,G,MAC5C,OAAmE,QAA5D,EAAApJ,KAAK4J,UAAUqC,MAAMC,GAAaA,EAASzC,OAASL,EAAGK,cAAK,QAAI,IAAIN,EAAIC,EACjF,CAEOrG,sBAAsBoJ,GAC3BnM,KAAK4J,UAAUrO,SAAS4H,IACtB,GAAGgJ,GAAYA,IAAahJ,EAC1B,OAGF,MAAMiG,EAAKjG,EAAQiG,GAChBA,IACDA,EAAGgC,QAAU,OACbhC,EAAGmC,Q,GAGT,EApKe,EAAA3B,UAAmB,GAuKrB,MAAMwC,EAKnBvM,YAAYuJ,EAAOiD,GACjBrM,KAAKqM,UAAYA,EACjBrM,KAAKvD,KAAM,EAAAN,EAAA,IAAO,CAAC,MAAOiN,EAAGK,KAAM4C,GAAW1C,KAAK,MACnD3J,KAAKsM,IAAMnD,EAAIoD,OAAOnD,EACxB,CAoCO1H,OAAOC,EAA8B0K,GAM1C,OAJI9M,MAAMC,QAAQmC,KAChBA,EAAY,GAAG6K,OAAO7K,IAGjB3B,KAAKyM,eAAe,aAAcV,GAC/BpK,EAAuBuB,KAAKvB,GAAcoK,EAAYrK,OAAOC,MACxB,GAAI0K,EACrD,CAEOK,MAAML,GACX,OAAOrM,KAAKyM,eAAe,aAAcV,GAAgBA,EAAYW,SAA2B,GAAIL,EACtG,CAEOrK,KAAKL,EAA8B7C,EAAoBuN,GAiB5D,OALI9M,MAAMC,QAAQmC,KAChBA,EAAY,GAAG6K,OAAO7K,GACtB7C,EAAQ,GAAG0N,OAAO1N,IAGbkB,KAAKyM,eAAe,aAAcV,GAC/BpK,EAAuBuB,KAAI,CAACvB,EAAWgL,IAAQZ,EAAY9J,IAAInD,EAAM6N,GAAMhL,MACxC,GAAI0K,EACnD,CA6EOtK,IAAOJ,EAA8B0K,GAO1C,OAJI9M,MAAMC,QAAQmC,KAChBA,EAAY,GAAG6K,OAAO7K,IAGpBA,EAAUtG,OAIP2E,KAAKyM,eAAkB,YAAaV,GACjCpK,EAAuBuB,KAAKvB,GAAcoK,EAAYhK,IAAIJ,MACxB,GAAI0K,GALvC/O,QAAQC,QAAQ,GAM3B,CAEQkP,eACNG,EACAjO,EACAlC,EACA4P,EAAYrM,KAAKqM,WAEjB,IAAIQ,EAOJ,OALGpQ,IACDoQ,EAAOC,YAAYhJ,MACnB9D,KAAKvD,IAAIA,EAAM,YAGVuD,KAAKsM,IAAIhL,eAAenG,MAAMiO,GAC5B,IAAI9L,SAAW,CAACC,EAASW,KAK9B,MAAMoN,EAAclC,EAAGkC,YAAY,CAACe,GAAYO,GAE1CG,EAAU,KACdpK,aAAaF,GACbvE,EAAOoN,EAAYtQ,MAAM,EAIrBgS,EAAa,KACjBrK,aAAaF,GAEVhG,GACDuD,KAAKvD,IAAIA,EAAM,QAASqQ,YAAYhJ,MAAQ+I,GAQ9C,MAAMI,EAAUvJ,EAASR,KAAKgK,GAAMA,EAAEzF,SACtClK,EAAQiC,EAAUyN,EAAUA,EAAQ,GAAG,EAGzC3B,EAAYN,QAAU+B,EAGtB,MAAMI,EAAsC,cAATP,EAChCO,IACD7B,EAAY8B,WAAa,IAAMJ,KAGjC,MAAMvK,EAAUjF,YAAW,KACzBwC,KAAKvD,IAAIzB,MAAM,2BAA4BsQ,EAAa7O,EAAI,GAC3D,KAOG4Q,EAAiB1O,EAAS2M,EAAYS,YAAYM,IAElD7M,EAAUD,MAAMC,QAAQ6N,GACxB3J,EAAyBlE,EAAU6N,EAAiB,GAAGb,OAAOa,GAEpE,GAAGF,EACD,OAGF,MAAM9R,EAASqI,EAASrI,OACxB,IAAIiS,EAAOjS,EAEX,MAAMkS,EAAoB,KACrBjC,EAAYtQ,SAITsS,GACJN,G,EAIJ,IAAI,IAAIzD,EAAI,EAAGA,EAAIlO,IAAUkO,EAAG,CAC9B,MAAMxF,EAAUL,EAAS6F,GACzBxF,EAAQiH,QAAU+B,EAClBhJ,EAAQkH,UAAYsC,C,MAI5B,CAEOC,OAAUnB,GACf,OAAOrM,KAAKyM,eAAoB,YAAaV,GAAgBA,EAAYyB,UAA6B,GAAInB,EAC5G,EEvcF,MAAM,EAAMpT,KACNwU,EAAiB7E,SAAS8E,SAAW,KAAO9E,SAAS+E,SAAW/E,SAASgF,SAASC,MAAM,KAAKvS,MAAM,GAAI,GAAGqO,KAAK,KAAO,IAI5H,IAAImE,EAAe,EACfC,GAA+B,EAAAhU,UA4FnC,MAAMiU,EAAwB,CAC5BC,gBAAiB,EACjBC,UAAW,CACTC,uBAAwB,yBACxBC,mBAAoB,eACpBC,qBAAsB,YAExBC,cAAe,CAAC,GAGZC,EAAS,IA7Ef,MAIE1O,YACEuJ,EACAiD,EACQ2B,GAAA,KAAAA,SAAAA,EANF,KAAAnM,MAA0B,CAAC,EAUjC7B,KAAKmD,QAAU,IAAIiJ,EAAchD,EAAIiD,EACvC,CAEQmC,WAAoCtH,GAC1C,MAAMvI,EAAWqB,KAAKgO,SAAS9G,GAC/B,MAA4B,mBAAf,EAA4BvI,IAAaA,CACxD,CAEOoD,IAA6BmF,GAClC,OAAGlH,KAAK6B,MAAM4M,eAAevH,GACpBlH,KAAK6B,MAAMqF,GAGJlH,KAAKmD,QAAQpB,IAAImF,GAClB/L,MAAM2D,GAAUA,IAAO,KAA6B,IAAE3D,MAAM2D,GACtEkB,KAAK6B,MAAM4M,eAAevH,GACpBlH,KAAK6B,MAAMqF,IAGpBpI,UAAAA,EAAUkB,KAAKwO,WAAWtH,IAEnBlH,KAAK6B,MAAMqF,GAAOpI,IAE7B,CAEO4P,UAAmCxH,GACxC,MAAMpI,EAAQkB,KAAK+B,IAAImF,GACvB,GAAGpI,aAAiBxB,QAClB,KAAM,cAGR,OAAOwB,CACT,CAEa2B,IAA6ByG,EAAQpI,G,mDAEhD,IAAGgK,EAD2B,QAAf,EAAA9I,KAAK6B,MAAMqF,UAAI,QAAIlH,KAAKgO,SAAS9G,GAC3BpI,GAArB,CAIAkB,KAAK6B,MAAMqF,GAAOpI,EAElB,IACEkB,KAAKmD,QAAQnB,KAAKkF,EAAepI,E,CACjC,MAAMhE,G,yRChG6F,CACvG2O,KAAM,OACNoB,QAAS,EACTgB,OAAQ,CAAC,CACPpC,KAAM,WACL,CACDA,KAAM,eACL,CACDA,KAAM,SACL,CACDA,KAAM,SACL,CACDA,KAAM,WAaL,CACDA,KAAM,cD4F6E,UAAWuE,GAGlG,IAAI,MAAMzE,KAAKyE,EACbO,EAAOxM,IAAIwH,GAGb,EAAIjC,iBAAiB,QAAS4D,IAC5B,MAAMyD,EAA8BzD,EAAM0D,KAAKC,OAC/CpS,EAAI,OAAQ,OAAF,UAAMkS,IAEhB,IACE,IAAIA,EAAIG,MACN,KAAM,WAGR,MAAOC,EAAWC,EAAUC,GAAQ,CAClCV,EAAOG,UAAU,mBACjBH,EAAOG,UAAU,iBACjBH,EAAOG,UAAU,cAGbQ,EAAUrL,KAAKC,MACrB,GACEqL,KACAJ,GACAG,EAAUH,EAEV,KAAM,yCAAyCxG,KAAKC,MAAMuG,EAAYG,GAAW,WAInF,GAD0BrL,KAAKC,MAAQgK,GAvIjB,OAuIuDC,EAE3E,KAAM,sDAGR,MAAMqB,EAsGV,SAA0BT,EAA6BK,EAAwCC,GAC7F,MAAMI,EAAO,qCAEb,IAEIC,EAFAC,EAAQZ,EAAIY,OAAS,WACrBC,EAAOb,EAAIc,aAAe,GAG3Bd,EAAIe,SAEHJ,EADCX,EAAIe,OAAOC,WACH,IAAMhB,EAAIe,OAAOC,WAClBhB,EAAIe,OAAOE,QACV,IAAMjB,EAAIe,OAAOE,QAEjBjB,EAAIe,OAAOG,SAAW,IAInClB,EAAIe,OAAOJ,OAAS,GAAKA,EACzB,IAAIQ,EAAM,OAASR,GAEhBN,aAAQ,EAARA,EAAUe,aACXR,EAAQ,WACRC,EAAOP,EAAKd,uBACZ2B,EAAM,gBAGRrT,EAAI,cAAe8S,EAAOC,EAAMH,EAAMV,GAEtC,MAAMqB,EAA+F,CAAC,CACpGC,OAAQ,SACRV,MAAON,EAAKb,qBAgBd,OAV4B,EAAI8B,aAAaC,iBAAiBZ,EAAO,CACnEC,OACAH,OACAS,MACAlB,KAAMD,EACNqB,UACAlB,MAxCY,wBAyCZsB,OAA8B,MAAtBzB,EAAIe,OAAOU,SAGMrR,OAAO/D,IAChCyB,EAAIzB,MAAM,4BAA6BA,EAAM,GAEjD,CAvJgCqV,CAAiB1B,EAAKK,EAAUC,GAC5D/D,EAAMoF,UAAUlB,E,CAChB,MAAMtU,GACN2B,EAAI3B,E,KAIR,EAAIwM,iBAAiB,qBAAsB4D,IACzC,MAAMqF,EAAerF,EAAMqF,aAC3B9T,EAAI,0BAA2B8T,EAAaT,KAC5CS,EAAahF,QAEb,MAAM0E,EAAS/E,EAAM+E,OACrB,GAAc,WAAXA,GAAuBd,IAGxB,OAFA1S,EAAI,yBACJ8R,EAAO9N,IAAI,kBAAmBoD,KAAKC,MAAQ,OAI7C,MAAM8K,EAA+B2B,EAAa3B,KAClD,IAAIA,EACF,OAGF,MAAM5Q,EAAU,EAAIzD,QAAQC,SAAS,CACnCE,KAAM,WACLS,MAAMqV,IACP5B,EAAKqB,OAASA,EACdQ,EAAsB7B,EACtB,IAAI,IAAIrF,EAAI,EAAGA,EAAIiH,EAAWnV,OAAQkO,IAAK,CACzC,MAAMmH,EAASF,EAAWjH,GAC1B,GAAG,UAAWmH,EAIZ,OAHAA,EAAOC,QACP9J,GAAmB+J,WAAW,YAAaH,EAAqBC,QAChED,OAAsBzW,E,CAK1B,GAAG,EAAIO,QAAQsW,WACb,OAAOvT,QAAQC,QAAQgR,EAAOxM,IAAI,kBAAkB5G,MAAM6T,GACjD,EAAIzU,QAAQsW,WAAW7B,EAAS8B,SAAWrD,I,IAGrD1O,OAAO/D,IACRyB,EAAIzB,MAAM,yBAA0BA,EAAM,IAG5CkQ,EAAMoF,UAAUtS,EAAQ,IAG1B,EAAIsJ,iBAAiB,qBAYrB,SAA6B4D,GAI7B,IAAiCqF,IAHPrF,EAAMqF,aAI9BQ,EAAcrP,OAAO6O,EAHvB,IAZA,MAAMQ,EAAmC,IAAIjM,IAC7C,IAAI2L,EA4CJ,SAAStB,IACP,OAAO,EAAArV,UACT,C,sBEjOe,MAAMkX,UAA2D,IAqB9EnR,cACEoR,MAAM,WAEN,OAAmB,wBAAoCjR,KACzD,E,cCvCF,MAAMkR,EAAyC,IAAI7N,IAC7C8N,GAAiB,EAAA/O,EAAA,GAAU,WAGhCnJ,KAAaiY,YAAcA,EAI5B,MAAME,EAAY,CAChBC,SAAW/K,IACT,MAAM,GAACnC,GAAMmC,EACb,GAAG4K,EAAYjN,IAAIE,GACjB,OAAO7G,QAAQY,OAAOiT,GAMxB,MAAMG,EAAW,IAAIC,qBAAqB,CAACC,cAAe,IAQpDxT,EAAUI,IAWhB,IAAIqT,EAVJzT,EAAQ7C,MAAK,KACXqC,YAAW,KACT0T,EAAYxP,OAAOyC,EAAG,GACrB,IAAI,IACN,KACD+M,EAAYxP,OAAOyC,EAAG,IAMxB,MAAMuN,EAAW,IAAIC,eAAe,CAClCC,MAAQC,IACNJ,EAAaI,CAAW,EAG1B5S,OAAS6S,IACP9T,EAAQE,OAAOiT,EAAe,GAE/BG,GAQGS,EAAI,+BACLzL,GAAO,CAEV0L,eAAgBN,EAIhB1T,UACAyT,eAMF,OAHAP,EAAYzQ,IAAI0D,EAAI4N,GAGb/T,EAAQe,OAAM,KAAO,MAAMoS,CAAc,GAAE,EAGpDc,cAAe,EAAE9N,KAAI+N,YACnB,MAAMH,EAAOb,EAAYnP,IAAIoC,GAC7B,OAAI4N,EAOGA,EAAKN,WAAWU,QAAQD,GANtB5U,QAAQY,QAMoB,EAGvCkU,iBAAmBjO,IACjB,MAAM4N,EAAOb,EAAYnP,IAAIoC,GAC7B,OAAI4N,GAIJA,EAAK/T,QAAQT,UAGNwU,EAAKN,WAAWlG,SANdjO,QAAQY,QAMa,EAGhCmU,eAAiBlO,IACf,MAAM4N,EAAOb,EAAYnP,IAAIoC,GAC7B,GAAI4N,EAOJ,OAHAA,EAAK/T,QAAQE,SAGN6T,EAAKN,WAAWzW,OAAO,GAalC,SAASsX,EAAgBpH,EAAmBqH,GAC1C,MAAMvU,EAAUZ,EAAM,KAAKjC,MAAK,KAC9B,MAAM4W,EAAOb,EAAYnP,IAAIwQ,GAC7B,IAAIR,GAASA,EAAKS,KAChB,OAGFT,EAAKS,MAAO,EACZ,MAAMC,EAASV,EAAKC,eAEpB,OADiB,IAAI1P,SAASmQ,EAAQ,CAAClQ,QAASwP,EAAKxP,SACtC,IAGjB2I,EAAMwH,YAAY1U,EACpB,CAEA,SAAS2U,IACP,GAAGzB,EAAYpR,KACb,IAAI,MAAOqE,EAAI4N,KAASb,EAEtBa,EAAKN,WAAWzW,OAGtB,CC5JA,MAAMpC,EAAwC,CAAC,EAmChC,SAASga,EAAa1H,EAAmBqH,GACtD,MAAMvU,EAAUkN,EAAMnH,QAAQ8O,WAC7B1X,MAAM0X,IA1BT,SAAiCA,EAAoBC,G,4CACnD,IACErW,EAAI,aAAcoW,GAClB,MAAMjE,EAZV,SAAuBiE,GACrB,MAAO,CACLE,MAAOF,EAASrF,OAAO,SACvB+B,MAAOsD,EAAS9Q,IAAI,SACpBiR,KAAMH,EAAS9Q,IAAI,QACnBiC,IAAK6O,EAAS9Q,IAAI,OAEtB,CAKiBkR,CAAcJ,IACT,QAAlB,EAACja,EAASka,UAAQ,QAAjBla,EAASka,GAAc,IAAIjU,KAAK+P,E,CACjC,MAAM9T,GACN2B,EAAIiP,KAAK,gCAAiC5Q,E,sRAqB1CoY,CAAkBL,EAAU3H,EAAMiI,mBAC3B7Q,SAAS8Q,SAAS,SAG3BlI,EAAMwH,YAAY1U,EACpB,CC5BO,MAAMvB,GAAM,EAAAN,EAAA,IAAO,KAAM,WAAiB,WAAiB,KAAAL,IAAe,WAAe,GAC1F,EAAM7C,KAGZ,IAAIoa,EACG,MAAM9O,EAAwB,IAAM8O,EAerCC,EAAqBC,IACzB9W,EAAI,mBAAoB8W,EAAOpP,GAAI,iBAAkBqP,GAAiB1T,MAE9C,SAArByT,EAAOE,WAKVhX,EAAI,UAAW8C,MAAM4K,KAAKqJ,KAC1B3M,GAAmB+J,WAAW,aAAS5W,EAAWuZ,GAhBpB,CAACA,IAC3BC,GAAiB1T,MAASuT,IAC5B5W,EAAI,oCARgB,CAAC8W,IACvB,MAAMG,EAAU,IAAIC,eACpB9M,GAAmB+M,WAAWP,EAAsBK,EAAQG,OAC5DhN,GAAmB+J,WAAW,YAAQ5W,EAAWuZ,EAAQ,CAACG,EAAQI,OAAO,EAMvEC,CAAgBR,G,EAclBS,CAAwBT,GACxBC,GAAiB/S,IAAI8S,EAAOpP,GAAIoP,GDzB3B,SAA2CU,GAChD,MAAMC,EAAMtb,EAASqb,EAAa9P,IAC9B+P,WAIGtb,EAASqb,EAAa9P,IAE7B1H,EAAI,oCAAqCwX,EAAa9P,GAAI,UAAW+P,EAAI7Y,QACzE6Y,EAAI3Y,SAASqT,IACX/H,GAAmB+J,WAAW,QAAShC,EAAMqF,EAAa,IAE9D,CCeEE,CAAkCZ,IAThC9W,EAAIiP,KAAK,wCAAyC6H,EAAOpP,GASlB,EAG9B0C,GAAqB,IAAImK,EACtCnK,GAAmBuN,2BAA2B,CAC5CC,mBL6KK,SAA+BvE,GACpC,IAAI,MAAMS,KAAgBQ,EACxB,IACER,EAAahF,OACJ,CAAT,MAAMhE,GAAG,CAGb,IAAIvJ,EAiBJ,OAfEA,EADC,qBAAsB,EAAIkS,aACjB,EAAIA,aAAaoE,iBAAiB,CAACxE,QAAM3U,MAAM4V,IACvD,IAAI,IAAIxH,EAAI,EAAGgL,EAAMxD,EAAc1V,OAAQkO,EAAIgL,IAAOhL,EACpD,IACEwH,EAAcxH,GAAGgC,OACR,CAAT,MAAMhE,GAAG,C,IAEZxI,OAAO/D,IACRyB,EAAIzB,MAAM,4BAA6BA,EAAM,IAGrCsC,QAAQC,UAGpBwT,EAAcrE,QAEP1O,CACT,EKpMEwW,eAAgB,EAAExR,UAASC,iBACzB/B,EAAuBuT,cAAczR,EAASC,EAAW,EAG3DyR,SAAU,CAACpO,EAASiN,MLyPf,SAAgBjN,EAAqCiN,GAC1DzF,EAAejK,KAAKC,MACpBiK,EAA8BzH,EAAQqO,mBAEnClE,GAAuB8C,IACxB1M,GAAmB+J,WAAW,YAAaH,EAAqB8C,GAChE9C,OAAsBzW,GAGrBsM,EAAQ2I,MACTV,EAAO9N,IAAI,YAAa6F,EAAQ2I,MAG/B3I,EAAQ0I,UACTT,EAAO9N,IAAI,gBAAiB6F,EAAQ0I,SAExC,CKxQI4F,CAAOtO,EAASiN,EAAO,EAGzBsB,MAAO,CAACvO,EAASiN,KACfD,EAAkBC,EAA8B,IAIpD,MACEjB,gBAAe,GACfwC,gBAAiBC,IFsDJ,SAAwBlO,GAGrC,OAFAA,EAAmBuN,2BAA2BhD,GAEvC,CACLkB,kBACAwC,gBAAiBnC,EAErB,CE5DIqC,CAAenO,KAGnB,UAAmB1L,MAAM8Z,IACvBxY,EAAI,OAAOwY,EAAc5Z,iCACzB4Z,EAAc1Z,SAAS0Y,IACrBX,EAAkBW,EAAa,GAC/B,IAGJ,MAAMT,GAA8C,IAAInQ,IACvDpK,KAAaua,iBAAmBA,GCjFlB,SACbhP,EACA0Q,EACAC,GAEA,MAAMvB,EAAa,CAACwB,EAAiBC,KACnC7Q,EAAY8Q,iBAAiBF,GAC7BC,GAAY7Q,EAAY+Q,eAAeF,EAChB,EAGzB7Q,EAAYgR,qBDuEoCjC,IAChD9W,EAAI,6BAA8B8W,GACXA,aAAkBkC,cAClBjC,GAAiBvP,IAAIsP,EAAOpP,KAKnDqP,GAAiB9R,OAAO6R,EAAOpP,IAC/B1H,EAAI,4BAA6B+W,GAAiB1T,MAC9C0T,GAAiB1T,OACnBrD,EAAIiP,KAAK,mBAEN2H,IACDxM,GAAmB6O,WAAWrC,GAC9BA,OAAsBrZ,GAGxB+a,OAdAtY,EAAIiP,KAAK,qB,ICzE4B,oBAA9B,wBACN,qBAAwD,WAAYnE,GAAMqM,EAAWrM,EAAEgM,OAAQhM,EAAEgM,UACrD,oBAA/B,yBACdK,EAAW,IAAK,MAEhBA,EAAW,IAAK,IAEpB,CD8DA+B,CAAkB9O,IAuBlB,MAAM+O,GAAW1K,IAEf,IACG,EAAA7R,WACoD,IAArD6R,EAAMnH,QAAQC,IAAIxK,QAAQoP,SAASiN,OAAS,MAC5C3K,EAAMnH,QAAQC,IAAInK,MAAM,oFAExB,OAAOqR,EAAMwH,YpBnGV,SAA4BxH,G,qCACjC,IAEE,MAAMrJ,QAAc9D,EAAYN,EAAI+D,OAAOC,KAAK/D,IAC1CoY,QAAa/X,EAAY8D,EAAMhI,MAAMqR,EAAMnH,QAAS,CAACM,YAAY,KAEvE,GAAGyR,GAAQnY,EAAkBmY,GAC3B,OAAOA,EAGT,MAAMvT,EAAuB,CAAC,KAAQ,KACtC,IAAI3E,QAAiBmY,MAAM7K,EAAMnH,QAAS,CAACxB,YAC3C,GAAG5E,EAAkBC,GACnBiE,EAAMI,IAAIiJ,EAAMnH,QAASnG,EAASoY,cAC7B,GAAuB,MAApBpY,EAASE,OAAgB,CACjC,MAAMkG,EAAMkH,EAAMnH,QAAQC,IAAIiS,QAAQ,QAAS,IAAM,KAAuB,IAAhB1N,KAAK2N,SAAoB,GACrFtY,QAAiBmY,MAAM/R,EAAK,CAACzB,YAC1B5E,EAAkBC,IACnBiE,EAAMI,IAAIiJ,EAAMnH,QAASnG,EAASoY,Q,CAItC,OAAOpY,C,CACP,MAAM9C,GACN,OAAOib,MAAM7K,EAAMnH,Q,CAEvB,E,+RoByE6BoS,CAAajL,IAIxC,IAEE,MAAOkL,EAAO7D,GAAUrH,EAAMnH,QAAQC,IAAI6J,MAAM,KAAKvS,OAAO,GAI5D,OAAO8a,GACL,IAAK,Ub8HI,SAAuBlL,EAAmBqH,GACvD,MAAMpK,EAqCR,SAAoBkO,GAClB,IAAIA,EAAQ,MAAO,CAAC,EAAG,GACvB,MAAO,CAAEC,GAAUD,EAAOxI,MAAM,KAC1B0I,EAASD,EAAOzI,MAAM,OACrBxN,EAAQ2H,GAAOuO,EAAO,GAAG1I,MAAM,KAEtC,MAAO,EAAExN,GAAS2H,GAAO,EAC3B,CA5CgBwO,CAAWtL,EAAMnH,QAAQxB,QAAQR,IAAI,UAC7C6C,EAAwB6B,KAAKgQ,MAAMC,mBAAmBnE,IACtDE,EAAS9N,EAAO5C,IAAI6C,GAI1BsG,EAAMwH,YAAYpV,QAAQW,KAAK,EACrB,KezQH,IAAIX,SAAUC,IACnBC,YAAW,KACTD,EAAQ,IAAI+E,SAAS,GAAI,CACvBxE,OAAQ,IACRuK,WAAY,uBACX,GfoQG,KelQT,KfmQCoK,EAAOvK,aAAaC,KAExB,CaxIQwO,CAAczL,EAAOqH,GACrB,MAGF,IAAK,WACH,GAAgBrH,EAAOqH,GACvB,MAGF,IAAK,QACHK,EAAa1H,GACb,MAGF,IAAK,OACHA,EAAMwH,YAAY,IAAIpQ,SAAS,S,CAInC,MAAMxH,GACN2B,EAAIzB,MAAM,cAAeF,GACzBoQ,EAAMwH,YAAY,IAAIpQ,SAAS,GAAI,CACjCxE,OAAQ,IACRuK,WAAY,wBACZ9F,QAAS,CAAC,gBAAiB,c,GAK3BqU,GAAgB,KACpB,EAAIC,QAAUjB,EAAO,EAGvB,EAAItO,iBAAiB,WAAY4D,IAC/BzO,EAAI,cACJyO,EAAMoF,UAAU,EAAIwG,cAAc3b,MAAK,IAAMsB,EAAI,qBAAoB,IAGvE,EAAI6K,iBAAiB,YAAa4D,IAChCzO,EAAI,aAAc,GAClByO,EAAMoF,UAAU,EAAI9O,OAAOE,OAAOhE,GAAmBvC,MAAK,IAAMsB,EAAI,2BACpEyO,EAAMoF,UAAU,EAAI/V,QAAQwc,QAAQ5b,MAAK,IAAMsB,EAAI,qBAAoB,IAWzE,EAAIua,UAAY,EAAIC,SAAWL,GAE/BA,I,GG1LIM,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBpd,IAAjBqd,EACH,OAAOA,EAAaC,QAGrB,IAAIC,EAASL,EAAyBE,GAAY,CAGjDE,QAAS,CAAC,GAOX,OAHAE,EAAoBJ,GAAUG,EAAQA,EAAOD,QAASH,GAG/CI,EAAOD,OACf,CAGAH,EAAoBM,EAAID,EAGxBL,EAAoBpO,EAAI,KAGvB,IAAI2O,EAAsBP,EAAoBQ,OAAE3d,EAAW,CAAC,KAAK,IAAOmd,EAAoB,QAE5F,OADsBA,EAAoBQ,EAAED,EAClB,E9BjCvB9e,EAAW,GACfue,EAAoBQ,EAAI,CAAClQ,EAAQmQ,EAAUvS,EAAIwS,KAC9C,IAAGD,EAAH,CAMA,IAAIE,EAAeC,IACnB,IAASxO,EAAI,EAAGA,EAAI3Q,EAASyC,OAAQkO,IAAK,CAGzC,IAFA,IAAKqO,EAAUvS,EAAIwS,GAAYjf,EAAS2Q,GACpCyO,GAAY,EACPC,EAAI,EAAGA,EAAIL,EAASvc,OAAQ4c,MACpB,EAAXJ,GAAsBC,GAAgBD,IAAa3Y,OAAOuE,KAAK0T,EAAoBQ,GAAGzO,OAAOhC,GAASiQ,EAAoBQ,EAAEzQ,GAAK0Q,EAASK,MAC9IL,EAASM,OAAOD,IAAK,IAErBD,GAAY,EACTH,EAAWC,IAAcA,EAAeD,IAG7C,GAAGG,EAAW,CACbpf,EAASsf,OAAO3O,IAAK,GACrB,IAAI2D,EAAI7H,SACErL,IAANkT,IAAiBzF,EAASyF,EAC/B,CACD,CACA,OAAOzF,CAnBP,CAJCoQ,EAAWA,GAAY,EACvB,IAAI,IAAItO,EAAI3Q,EAASyC,OAAQkO,EAAI,GAAK3Q,EAAS2Q,EAAI,GAAG,GAAKsO,EAAUtO,IAAK3Q,EAAS2Q,GAAK3Q,EAAS2Q,EAAI,GACrG3Q,EAAS2Q,GAAK,CAACqO,EAAUvS,EAAIwS,EAqBjB,E+BzBdV,EAAoBgB,EAAI,CAACb,EAASc,KACjC,IAAI,IAAIlR,KAAOkR,EACXjB,EAAoBkB,EAAED,EAAYlR,KAASiQ,EAAoBkB,EAAEf,EAASpQ,IAC5EhI,OAAOoZ,eAAehB,EAASpQ,EAAK,CAAEqR,YAAY,EAAMxW,IAAKqW,EAAWlR,IAE1E,ECNDiQ,EAAoBqB,EAAI,CAAC,EAGzBrB,EAAoB5P,EAAKkR,GACjBnb,QAAQpC,IAAIgE,OAAOuE,KAAK0T,EAAoBqB,GAAGxb,QAAO,CAACkH,EAAUgD,KACvEiQ,EAAoBqB,EAAEtR,GAAKuR,EAASvU,GAC7BA,IACL,KCNJiT,EAAoBuB,EAAKD,GAEZA,EAAL,kCCFRtB,EAAoBwB,SAAYF,IAEf,ECHjBtB,EAAoByB,EAAI,WACvB,GAA0B,iBAAfC,WAAyB,OAAOA,WAC3C,IACC,OAAO7Y,MAAQ,IAAI8Y,SAAS,cAAb,EAGhB,CAFE,MAAOvR,GACR,GAAsB,iBAAXvO,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBme,EAAoBkB,EAAI,CAAC1J,EAAKoK,IAAU7Z,OAAO8Z,UAAUvK,eAAewK,KAAKtK,EAAKoK,G,MCAlF,IAAIG,EACA/B,EAAoByB,EAAEO,gBAAeD,EAAY/B,EAAoByB,EAAEhQ,SAAW,IACtF,IAAIwQ,EAAWjC,EAAoByB,EAAEQ,SACrC,IAAKF,GAAaE,IACbA,EAASC,gBACZH,EAAYE,EAASC,cAAcC,MAC/BJ,GAAW,CACf,IAAIK,EAAUH,EAASI,qBAAqB,UACzCD,EAAQle,SAAQ6d,EAAYK,EAAQA,EAAQle,OAAS,GAAGie,IAC5D,CAID,IAAKJ,EAAW,MAAM,IAAItd,MAAM,yDAChCsd,EAAYA,EAAUjD,QAAQ,OAAQ,IAAIA,QAAQ,QAAS,IAAIA,QAAQ,YAAa,KACpFkB,EAAoBsC,EAAIP,C,KCfxB,MACE,QAAmC,IAAxB/B,EAAqC,CAC9C,IAAIuC,EAAevC,EAAoBuB,EACnCiB,EAAgBxC,EAAoB5P,EACpCqS,EAAW,CAAC,EACZC,EAAW,CAAC,EAIhB1C,EAAoBuB,EAAI,SAAUD,GAEhC,OADaiB,EAAajB,IAGvBmB,EAASnL,eAAegK,GAAW,IAAMmB,EAASnB,GAAW,GAElE,EACAtB,EAAoB5P,EAAI,SAAUkR,GAEhC,OADakB,EAAclB,GACb1Z,OAAM,SAAU/D,GAC5B,IAAI8e,EAAUD,EAASpL,eAAegK,GAClCoB,EAASpB,GACT,OACJ,GAAIqB,EAAU,EAAG,CACf,IAAIC,EAAUL,EAAajB,GAQ3B,MAPAzd,EAAM8P,QACJ,iBACA2N,EACA,mCACAsB,EACA,IACF/e,EAAM+I,QAAUgW,EACV/e,CACR,CACA,OAAO,IAAIsC,SAAQ,SAAUC,GAE3BC,YAAW,WACT,IACIwc,EACKnW,KAAKC,MAGd8V,EAASnB,GAAWuB,EACpBH,EAASpB,GAAWqB,EAAU,EAC9Bvc,EAAQ4Z,EAAoB5P,EAAEkR,GAChC,GArCG,IAsCL,GACF,GACF,CACF,CACD,EAjDD,G,MCIA,IAAIwB,EAAkB,CACrB,IAAK,GAgBN9C,EAAoBqB,EAAEjP,EAAI,CAACkP,EAASvU,KAE/B+V,EAAgBxB,IAElBU,cAAchC,EAAoBsC,EAAItC,EAAoBuB,EAAED,GAE9D,EAGD,IAAIyB,EAAqBla,KAAuB,iBAAIA,KAAuB,kBAAK,GAC5Ema,EAA6BD,EAAmBrb,KAAKrD,KAAK0e,GAC9DA,EAAmBrb,KAvBC+P,IACnB,IAAKgJ,EAAUwC,EAAaC,GAAWzL,EACvC,IAAI,IAAIwI,KAAYgD,EAChBjD,EAAoBkB,EAAE+B,EAAahD,KACrCD,EAAoBM,EAAEL,GAAYgD,EAAYhD,IAIhD,IADGiD,GAASA,EAAQlD,GACdS,EAASvc,QACd4e,EAAgBrC,EAAS0C,OAAS,EACnCH,EAA2BvL,EAAK,C,KtCnB7B/V,EAAOse,EAAoBpO,EAC/BoO,EAAoBpO,EAAI,IAChBoO,EAAoB5P,EAAE,IAAIpM,KAAKtC,GuCDbse,EAAoBpO,G","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/lib/serviceWorker/cache.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/lib/files/memoryWriter.ts","webpack://tweb/./src/lib/files/cacheStorage.ts","webpack://tweb/./src/lib/serviceWorker/stream.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/lib/serviceWorker/push.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/lib/serviceWorker/serviceMessagePort.ts","webpack://tweb/./src/lib/serviceWorker/download.ts","webpack://tweb/./src/lib/serviceWorker/share.ts","webpack://tweb/./src/lib/serviceWorker/index.service.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/serviceWorker/timeout.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn __webpack_require__.e(85).then(next);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || navigator.maxTouchPoints > 0) && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// в SW может быть сразу две переменных TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n // level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","export default function pause(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from '../../helpers/schedulers/pause';\n\nconst ctx = self as any as ServiceWorkerGlobalScope;\nexport const CACHE_ASSETS_NAME = 'cachedAssets';\n\nfunction isCorrectResponse(response: Response) {\n return response.ok && response.status === 200;\n}\n\nfunction timeoutRace>(promise: T) {\n return Promise.race([\n promise,\n pause(10000).then(() => Promise.reject())\n ]);\n}\n\nexport async function requestCache(event: FetchEvent) {\n try {\n // const cache = await ctx.caches.open(CACHE_ASSETS_NAME);\n const cache = await timeoutRace(ctx.caches.open(CACHE_ASSETS_NAME));\n const file = await timeoutRace(cache.match(event.request, {ignoreVary: true}));\n\n if(file && isCorrectResponse(file)) {\n return file;\n }\n\n const headers: HeadersInit = {'Vary': '*'};\n let response = await fetch(event.request, {headers});\n if(isCorrectResponse(response)) {\n cache.put(event.request, response.clone());\n } else if(response.status === 304) { // possible fix for 304 in Safari\n const url = event.request.url.replace(/\\?.+$/, '') + '?' + (Math.random() * 100000 | 0);\n response = await fetch(url, {headers});\n if(isCorrectResponse(response)) {\n cache.put(event.request, response.clone());\n }\n }\n\n return response;\n } catch(err) {\n return fetch(event.request);\n }\n}\n","export default function noop() {}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from './noop';\n\nexport interface CancellablePromise extends Promise {\n resolve?: (value: T) => void,\n reject?: (...args: any[]) => void,\n cancel?: (reason?: any) => void,\n\n notify?: (...args: any[]) => void,\n notifyAll?: (...args: any[]) => void,\n lastNotify?: any,\n listeners?: Array<(...args: any[]) => void>,\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\n\n isFulfilled?: boolean,\n isRejected?: boolean\n}\n\nexport default function deferredPromise() {\n const deferredHelper: any = {\n isFulfilled: false,\n isRejected: false,\n\n notify: () => {},\n notifyAll: (...args: any[]) => {\n deferredHelper.lastNotify = args;\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\n },\n\n listeners: [],\n addNotifyListener: (callback: (...args: any[]) => void) => {\n if(deferredHelper.lastNotify) {\n callback(...deferredHelper.lastNotify);\n }\n\n deferredHelper.listeners.push(callback);\n }\n };\n\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\n deferredHelper.resolve = (value: T) => {\n if(deferred.isFulfilled || deferred.isRejected) return;\n\n deferred.isFulfilled = true;\n resolve(value);\n };\n\n deferredHelper.reject = (...args: any[]) => {\n if(deferred.isRejected || deferred.isFulfilled) return;\n\n deferred.isRejected = true;\n reject(...args);\n };\n });\n\n // @ts-ignore\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\n const n = deferredPromise>();\n\n }; */\n\n deferred.catch(noop).finally(() => {\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\n deferred.listeners.length = 0;\n\n if(deferred.cancel) {\n deferred.cancel = noop;\n }\n });\n\n Object.assign(deferred, deferredHelper);\n\n return deferred;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from './blobSafeMimeType';\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n const safeMimeType = blobSafeMimeType(mimeType);\n const blob = new Blob(blobParts, {type: safeMimeType});\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport StreamWriter from './streamWriter';\n\nexport default class MemoryWriter implements StreamWriter {\n private bytes: Uint8Array;\n\n constructor(\n private mimeType: string,\n private size: number,\n private saveFileCallback?: (blob: Blob) => Promise\n ) {\n this.bytes = new Uint8Array(size);\n }\n\n public async write(part: Uint8Array, offset: number) {\n // sometimes file size can be bigger than the prov\n const endOffset = offset + part.byteLength;\n if(endOffset > this.bytes.byteLength) {\n const newBytes = new Uint8Array(endOffset);\n newBytes.set(this.bytes, 0);\n this.bytes = newBytes;\n }\n\n this.bytes.set(part, offset);\n };\n\n public truncate() {\n this.bytes = new Uint8Array();\n }\n\n public trim(size: number) {\n this.bytes = this.bytes.slice(0, size);\n }\n\n public finalize(saveToStorage = true) {\n const blob = blobConstruct(this.bytes, this.mimeType);\n\n if(saveToStorage && this.saveFileCallback) {\n this.saveFileCallback(blob);\n }\n\n return blob;\n }\n\n public getParts() {\n return this.bytes;\n }\n\n public replaceParts(parts: Uint8Array) {\n this.bytes = parts;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../../config/modes';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport MemoryWriter from './memoryWriter';\nimport FileManager from './memoryWriter';\nimport FileStorage from './fileStorage';\nimport makeError from '../../helpers/makeError';\nimport deferredPromise from '../../helpers/cancellablePromise';\n\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\n\nexport default class CacheStorageController implements FileStorage {\n private static STORAGES: CacheStorageController[] = [];\n private openDbPromise: Promise;\n\n private useStorage = true;\n\n // private log: ReturnType = logger('CS');\n\n constructor(private dbName: CacheStorageDbName) {\n if(Modes.test) {\n this.dbName += '_test';\n }\n\n if(CacheStorageController.STORAGES.length) {\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\n }\n\n this.openDatabase();\n CacheStorageController.STORAGES.push(this);\n }\n\n private openDatabase(): Promise {\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\n }\n\n public delete(entryName: string) {\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\n }\n\n public deleteAll() {\n return caches.delete(this.dbName);\n }\n\n public get(entryName: string) {\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\n }\n\n public save(entryName: string, response: Response) {\n // return new Promise((resolve) => {}); // DEBUG\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\n }\n\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\n /* if(method === 'blob') {\n return Promise.reject();\n } */\n\n // const str = `get fileName: ${fileName}`;\n // console.time(str);\n return this.get(fileName).then((response) => {\n if(!response) {\n // console.warn('getFile:', response, fileName);\n throw makeError('NO_ENTRY_FOUND');\n }\n\n const promise = response[method]();\n // promise.then(() => {\n // console.timeEnd(str);\n // });\n return promise;\n });\n }\n\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct(blob);\n }\n\n const response = new Response(blob, {\n headers: {\n 'Content-Length': '' + blob.size\n }\n });\n\n return this.save(fileName, response).then(() => blob as Blob);\n }\n\n public timeoutOperation(callback: (cache: Cache) => Promise) {\n if(!this.useStorage) {\n return Promise.reject(makeError('STORAGE_OFFLINE'));\n }\n\n return new Promise(async(resolve, reject) => {\n let rejected = false;\n const timeout = setTimeout(() => {\n reject();\n // console.warn('CACHESTORAGE TIMEOUT');\n rejected = true;\n }, 15e3);\n\n try {\n const cache = await this.openDatabase();\n if(!cache) {\n this.useStorage = false;\n this.openDbPromise = undefined;\n throw 'no cache?';\n }\n\n const res = await callback(cache);\n\n if(rejected) return;\n resolve(res);\n } catch(err) {\n reject(err);\n }\n\n clearTimeout(timeout);\n });\n }\n\n public prepareWriting(fileName: string, fileSize: number, mimeType: string) {\n return {\n deferred: deferredPromise(),\n getWriter: () => {\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\n return this.saveFile(fileName, blob).catch(() => blob);\n });\n\n return writer;\n }\n };\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n return storage.deleteAll();\n }\n }));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {InputFileLocation} from '../../layer';\nimport CacheStorageController from '../files/cacheStorage';\nimport {DownloadOptions, MyUploadFile} from '../mtproto/apiFileManager';\nimport {getMtprotoMessagePort, log, serviceMessagePort} from './index.service';\nimport {ServiceRequestFilePartTaskPayload} from './serviceMessagePort';\nimport timeout from './timeout';\n\nconst deferredPromises: Map}> = new Map();\nconst cacheStorage = new CacheStorageController('cachedStreamChunks');\nconst CHUNK_TTL = 86400;\nconst CHUNK_CACHED_TIME_HEADER = 'Time-Cached';\nconst USE_CACHE = true;\n\nconst clearOldChunks = () => {\n return cacheStorage.timeoutOperation((cache) => {\n return cache.keys().then((requests) => {\n const filtered: Map = new Map();\n const timestamp = Date.now() / 1000 | 0;\n for(const request of requests) {\n const match = request.url.match(/\\/(\\d+?)\\?/);\n if(match && !filtered.has(match[1])) {\n filtered.set(match[1], request);\n }\n }\n\n const promises: Promise[] = [];\n for(const [id, request] of filtered) {\n const promise = cache.match(request).then((response) => {\n if((+response.headers.get(CHUNK_CACHED_TIME_HEADER) + CHUNK_TTL) <= timestamp) {\n log('will delete stream chunk:', id);\n return cache.delete(request, {ignoreSearch: true, ignoreVary: true});\n }\n });\n\n promises.push(promise);\n }\n\n return Promise.all(promises);\n });\n });\n};\n\nsetInterval(clearOldChunks, 1800e3);\nsetInterval(() => {\n const mtprotoMessagePort = getMtprotoMessagePort();\n for(const [messagePort, promises] of deferredPromises) {\n if(messagePort !== mtprotoMessagePort) {\n for(const taskId in promises) {\n const promise = promises[taskId];\n promise.reject();\n }\n\n deferredPromises.delete(messagePort);\n }\n }\n}, 120e3);\n\ntype StreamRange = [number, number];\ntype StreamId = DocId;\nconst streams: Map = new Map();\nclass Stream {\n private destroyDebounced: () => void;\n private id: StreamId;\n private limitPart: number;\n private loadedOffsets: Set = new Set();\n\n constructor(private info: DownloadOptions) {\n this.id = Stream.getId(info);\n streams.set(this.id, this);\n\n // ! если грузить очень большое видео чанками по 512Кб в мобильном Safari, то стрим не запустится\n this.limitPart = info.size > (75 * 1024 * 1024) ? STREAM_CHUNK_UPPER_LIMIT : STREAM_CHUNK_MIDDLE_LIMIT;\n this.destroyDebounced = debounce(this.destroy, 150000, false, true);\n }\n\n private destroy = () => {\n streams.delete(this.id);\n };\n\n private async requestFilePartFromWorker(alignedOffset: number, limit: number, fromPreload = false) {\n const payload: ServiceRequestFilePartTaskPayload = {\n docId: this.id,\n dcId: this.info.dcId,\n offset: alignedOffset,\n limit\n };\n\n const taskId = JSON.stringify(payload);\n\n const mtprotoMessagePort = getMtprotoMessagePort();\n let promises = deferredPromises.get(mtprotoMessagePort);\n if(!promises) {\n deferredPromises.set(mtprotoMessagePort, promises = {});\n }\n\n let deferred = promises[taskId];\n if(deferred) {\n return deferred.then((uploadFile) => uploadFile.bytes);\n }\n\n this.loadedOffsets.add(alignedOffset);\n\n deferred = promises[taskId] = deferredPromise();\n\n serviceMessagePort.invoke('requestFilePart', payload, undefined, mtprotoMessagePort)\n .then(deferred.resolve, deferred.reject).finally(() => {\n if(promises[taskId] === deferred) {\n delete promises[taskId];\n\n if(!Object.keys(promises).length) {\n deferredPromises.delete(mtprotoMessagePort);\n }\n }\n });\n\n const bytesPromise = deferred.then((uploadFile) => uploadFile.bytes);\n\n if(USE_CACHE) {\n this.saveChunkToCache(bytesPromise, alignedOffset, limit);\n !fromPreload && this.preloadChunks(alignedOffset, alignedOffset + (this.limitPart * 15));\n }\n\n return bytesPromise;\n }\n\n private requestFilePartFromCache(alignedOffset: number, limit: number, fromPreload?: boolean) {\n if(!USE_CACHE) {\n return Promise.resolve();\n }\n\n const key = this.getChunkKey(alignedOffset, limit);\n return cacheStorage.getFile(key).then((blob: Blob) => {\n return fromPreload ? new Uint8Array() : readBlobAsUint8Array(blob);\n }, (error: ApiError) => {\n if(error.type === 'NO_ENTRY_FOUND') {\n return;\n }\n });\n }\n\n private requestFilePart(alignedOffset: number, limit: number, fromPreload?: boolean) {\n return this.requestFilePartFromCache(alignedOffset, limit, fromPreload).then((bytes) => {\n return bytes || this.requestFilePartFromWorker(alignedOffset, limit, fromPreload);\n });\n }\n\n private saveChunkToCache(deferred: Promise, alignedOffset: number, limit: number) {\n return deferred.then((bytes) => {\n const key = this.getChunkKey(alignedOffset, limit);\n const response = new Response(bytes, {\n headers: {\n 'Content-Length': '' + bytes.length,\n 'Content-Type': 'application/octet-stream',\n [CHUNK_CACHED_TIME_HEADER]: '' + (Date.now() / 1000 | 0)\n }\n });\n\n return cacheStorage.save(key, response);\n });\n }\n\n private preloadChunk(offset: number) {\n if(this.loadedOffsets.has(offset)) {\n return;\n }\n\n this.loadedOffsets.add(offset);\n this.requestFilePart(offset, this.limitPart, true);\n }\n\n private preloadChunks(offset: number, end: number) {\n if(end > this.info.size) {\n end = this.info.size;\n }\n\n if(!offset) { // load last chunk for bounds\n this.preloadChunk(alignOffset(offset, this.limitPart));\n } else { // don't preload next chunks before the start\n for(; offset < end; offset += this.limitPart) {\n this.preloadChunk(offset);\n }\n }\n }\n\n public requestRange(range: StreamRange) {\n this.destroyDebounced();\n\n const possibleResponse = responseForSafariFirstRange(range, this.info.mimeType, this.info.size);\n if(possibleResponse) {\n return possibleResponse;\n }\n\n let [offset, end] = range;\n\n /* if(info.size > limitPart && isSafari && offset === limitPart) {\n //end = info.size - 1;\n //offset = info.size - 1 - limitPart;\n offset = info.size - (info.size % limitPart);\n } */\n\n const limit = end && end < this.limitPart ? alignLimit(end - offset + 1) : this.limitPart;\n const alignedOffset = alignOffset(offset, limit);\n\n if(!end) {\n end = Math.min(offset + limit, this.info.size - 1);\n }\n\n return this.requestFilePart(alignedOffset, limit).then((ab) => {\n // log.debug('[stream] requestFilePart result:', result);\n\n // if(isSafari) {\n if(offset !== alignedOffset || end !== (alignedOffset + limit)) {\n ab = ab.slice(offset - alignedOffset, end - alignedOffset + 1);\n }\n\n const headers: Record = {\n 'Accept-Ranges': 'bytes',\n 'Content-Range': `bytes ${offset}-${offset + ab.byteLength - 1}/${this.info.size || '*'}`,\n 'Content-Length': `${ab.byteLength}`\n };\n\n if(this.info.mimeType) {\n headers['Content-Type'] = this.info.mimeType;\n }\n\n // simulate slow connection\n // setTimeout(() => {\n return new Response(ab, {\n status: 206,\n statusText: 'Partial Content',\n headers\n });\n // }, 2.5e3);\n });\n }\n\n private getChunkKey(alignedOffset: number, limit: number) {\n return this.id + '?offset=' + alignedOffset + '&limit=' + limit;\n }\n\n public static get(info: DownloadOptions) {\n return streams.get(this.getId(info)) ?? new Stream(info);\n }\n\n private static getId(info: DownloadOptions) {\n return (info.location as InputFileLocation.inputDocumentFileLocation).id;\n }\n}\n\nexport default function onStreamFetch(event: FetchEvent, params: string) {\n const range = parseRange(event.request.headers.get('Range'));\n const info: DownloadOptions = JSON.parse(decodeURIComponent(params));\n const stream = Stream.get(info);\n\n // log.debug('[stream]', url, offset, end);\n\n event.respondWith(Promise.race([\n timeout(45 * 1000),\n stream.requestRange(range)\n ]));\n}\n\nfunction responseForSafariFirstRange(range: StreamRange, mimeType: string, size: number): Response {\n if(range[0] === 0 && range[1] === 1) {\n return new Response(new Uint8Array(2).buffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: {\n 'Accept-Ranges': 'bytes',\n 'Content-Range': `bytes 0-1/${size || '*'}`,\n 'Content-Length': '2',\n 'Content-Type': mimeType || 'video/mp4'\n }\n });\n }\n\n return null;\n}\n\n/* const STREAM_CHUNK_UPPER_LIMIT = 256 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 256 * 4; */\n/* const STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 1024 * 4; */\nconst STREAM_CHUNK_MIDDLE_LIMIT = 512 * 1024;\nconst STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 512 * 4;\n\nfunction parseRange(header: string): StreamRange {\n if(!header) return [0, 0];\n const [, chunks] = header.split('=');\n const ranges = chunks.split(', ');\n const [offset, end] = ranges[0].split('-');\n\n return [+offset, +end || 0];\n}\n\nfunction alignOffset(offset: number, base = SMALLEST_CHUNK_LIMIT) {\n return offset - (offset % base);\n}\n\nfunction alignLimit(limit: number) {\n return 2 ** Math.ceil(Math.log(limit) / Math.log(2));\n}\n","// * Jolly Cobra's schedulers\n\nimport ctx from '../../environment/ctx';\nimport {AnyFunction, Awaited} from '../../types';\nimport noop from '../noop';\n\nexport type DebounceReturnType = {\n (...args: Parameters): Promise>>;\n clearTimeout(): void;\n isDebounced(): boolean;\n};\n\nexport default function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true\n): DebounceReturnType {\n let waitingTimeout: number;\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\n let hadNewCall = false;\n\n const invoke = (args: Parameters) => {\n const _resolve = resolve, _reject = reject;\n try {\n const result = fn.apply(null, args);\n _resolve(result);\n } catch(err) {\n console.error('debounce error', err);\n // @ts-ignore\n _reject(err);\n }\n };\n\n const debounce = (...args: Parameters) => {\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\n\n if(waitingTimeout) {\n clearTimeout(waitingTimeout);\n hadNewCall = true;\n reject();\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\n } else if(shouldRunFirst) {\n invoke(args);\n hadNewCall = false;\n }\n\n const _waitingTimeout = ctx.setTimeout(() => {\n // will run if should run last or first but with new call\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\n invoke(args);\n }\n\n // if debounce was called during invoking\n if(waitingTimeout === _waitingTimeout) {\n waitingTimeout = waitingPromise = resolve = reject = undefined;\n hadNewCall = false;\n }\n }, ms);\n\n waitingTimeout = _waitingTimeout;\n waitingPromise.catch(noop);\n return waitingPromise;\n };\n\n debounce.clearTimeout = () => {\n if(waitingTimeout) {\n ctx.clearTimeout(waitingTimeout);\n reject();\n waitingTimeout = waitingPromise = resolve = reject = undefined;\n hadNewCall = false;\n }\n };\n\n debounce.isDebounced = () => !!waitingTimeout;\n\n return debounce;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsArrayBuffer from './readBlobAsArrayBuffer';\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(const i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport DATABASE_STATE from '../../config/databases/state';\nimport {IS_FIREFOX, IS_MOBILE} from '../../environment/userAgent';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport IDBStorage from '../files/idb';\nimport {log, serviceMessagePort} from './index.service';\nimport {ServicePushPingTaskPayload} from './serviceMessagePort';\n\nconst ctx = self as any as ServiceWorkerGlobalScope;\nconst defaultBaseUrl = location.protocol + '//' + location.hostname + location.pathname.split('/').slice(0, -1).join('/') + '/';\n\n// as in webPushApiManager.ts\nconst PING_PUSH_TIMEOUT = 10000 + 1500;\nlet lastPingTime = 0;\nlet localNotificationsAvailable = !IS_MOBILE;\n\nexport type PushNotificationObject = {\n loc_key: string,\n loc_args: string[],\n // user_id: number, // should be number\n custom: {\n channel_id?: string, // should be number\n chat_id?: string, // should be number\n from_id?: string, // should be number\n msg_id: string,\n peerId?: string, // should be number\n silent?: string // can be '1'\n },\n sound?: string,\n random_id: number,\n badge?: string, // should be number\n description: string,\n mute: string, // should be number\n title: string,\n message?: string,\n\n action?: 'mute1d' | 'push_settings', // will be set before postMessage to main thread\n};\n\nclass SomethingGetter, Storage extends Record> {\n private cache: Partial = {};\n private storage: IDBStorage;\n\n constructor(\n db: T,\n storeName: typeof db['stores'][number]['name'],\n private defaults: {\n [Property in keyof Storage]: ((value: Storage[Property]) => Storage[Property]) | Storage[Property]\n }\n ) {\n this.storage = new IDBStorage(db, storeName);\n }\n\n private getDefault(key: T) {\n const callback = this.defaults[key];\n return typeof(callback) === 'function' ? callback() : callback;\n }\n\n public get(key: T) {\n if(this.cache.hasOwnProperty(key)) {\n return this.cache[key];\n }\n\n const promise = this.storage.get(key as string) as Promise;\n return promise.then((value) => value, () => undefined as Storage[T]).then((value) => {\n if(this.cache.hasOwnProperty(key)) {\n return this.cache[key];\n }\n\n value ??= this.getDefault(key);\n\n return this.cache[key] = value;\n });\n }\n\n public getCached(key: T) {\n const value = this.get(key);\n if(value instanceof Promise) {\n throw 'no property';\n }\n\n return value;\n }\n\n public async set(key: T, value: Storage[T]) {\n const cached = this.cache[key] ?? this.defaults[key];\n if(deepEqual(cached, value)) {\n return;\n }\n\n this.cache[key] = value;\n\n try {\n this.storage.save(key as string, value);\n } catch(err) {\n\n }\n }\n}\n\ntype PushStorage = {\n push_mute_until: number,\n push_lang: Partial\n push_settings: Partial\n};\n\nconst defaults: PushStorage = {\n push_mute_until: 0,\n push_lang: {\n push_message_nopreview: 'You have a new message',\n push_action_mute1d: 'Mute for 24H',\n push_action_settings: 'Settings'\n },\n push_settings: {}\n};\n\nconst getter = new SomethingGetter(DATABASE_STATE, 'session', defaults);\n\n// fill cache\nfor(const i in defaults) {\n getter.get(i as keyof PushStorage);\n}\n\nctx.addEventListener('push', (event) => {\n const obj: PushNotificationObject = event.data.json();\n log('push', {...obj});\n\n try {\n if(!obj.badge) {\n throw 'no badge';\n }\n\n const [muteUntil, settings, lang] = [\n getter.getCached('push_mute_until'),\n getter.getCached('push_settings'),\n getter.getCached('push_lang')\n ];\n\n const nowTime = Date.now();\n if(\n userInvisibleIsSupported() &&\n muteUntil &&\n nowTime < muteUntil\n ) {\n throw `Supress notification because mute for ${Math.ceil((muteUntil - nowTime) / 60000)} min`;\n }\n\n const hasActiveWindows = (Date.now() - lastPingTime) <= PING_PUSH_TIMEOUT && localNotificationsAvailable;\n if(hasActiveWindows) {\n throw 'Supress notification because some instance is alive';\n }\n\n const notificationPromise = fireNotification(obj, settings, lang);\n event.waitUntil(notificationPromise);\n } catch(err) {\n log(err);\n }\n});\n\nctx.addEventListener('notificationclick', (event) => {\n const notification = event.notification;\n log('On notification click: ', notification.tag);\n notification.close();\n\n const action = event.action as PushNotificationObject['action'];\n if(action === 'mute1d' && userInvisibleIsSupported()) {\n log('[SW] mute for 1d');\n getter.set('push_mute_until', Date.now() + 86400e3);\n return;\n }\n\n const data: PushNotificationObject = notification.data;\n if(!data) {\n return;\n }\n\n const promise = ctx.clients.matchAll({\n type: 'window'\n }).then((clientList) => {\n data.action = action;\n pendingNotification = data;\n for(let i = 0; i < clientList.length; i++) {\n const client = clientList[i];\n if('focus' in client) {\n client.focus();\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, client);\n pendingNotification = undefined;\n return;\n }\n }\n\n if(ctx.clients.openWindow) {\n return Promise.resolve(getter.get('push_settings')).then((settings) => {\n return ctx.clients.openWindow(settings.baseUrl || defaultBaseUrl);\n });\n }\n }).catch((error) => {\n log.error('Clients.matchAll error', error);\n })\n\n event.waitUntil(promise);\n});\n\nctx.addEventListener('notificationclose', onCloseNotification);\n\nconst notifications: Set = new Set();\nlet pendingNotification: PushNotificationObject;\nfunction pushToNotifications(notification: Notification) {\n if(!notifications.has(notification)) {\n notifications.add(notification);\n // @ts-ignore\n notification.onclose = onCloseNotification;\n }\n}\n\nfunction onCloseNotification(event: NotificationEvent) {\n removeFromNotifications(event.notification)\n}\n\nfunction removeFromNotifications(notification: Notification) {\n notifications.delete(notification);\n}\n\nexport function closeAllNotifications(tag?: string) {\n for(const notification of notifications) {\n try {\n notification.close();\n } catch(e) {}\n }\n\n let promise: Promise;\n if('getNotifications' in ctx.registration) {\n promise = ctx.registration.getNotifications({tag}).then((notifications) => {\n for(let i = 0, len = notifications.length; i < len; ++i) {\n try {\n notifications[i].close();\n } catch(e) {}\n }\n }).catch((error) => {\n log.error('Offline register SW error', error);\n });\n } else {\n promise = Promise.resolve();\n }\n\n notifications.clear();\n\n return promise;\n}\n\nfunction userInvisibleIsSupported() {\n return IS_FIREFOX;\n}\n\nfunction fireNotification(obj: PushNotificationObject, settings: PushStorage['push_settings'], lang: PushStorage['push_lang']) {\n const icon = 'assets/img/logo_filled_rounded.png';\n const badge = 'assets/img/masked.svg';\n let title = obj.title || 'Telegram';\n let body = obj.description || '';\n let peerId: string;\n\n if(obj.custom) {\n if(obj.custom.channel_id) {\n peerId = '' + -obj.custom.channel_id;\n } else if(obj.custom.chat_id) {\n peerId = '' + -obj.custom.chat_id;\n } else {\n peerId = obj.custom.from_id || '';\n }\n }\n\n obj.custom.peerId = '' + peerId;\n let tag = 'peer' + peerId;\n\n if(settings?.nopreview) {\n title = 'Telegram';\n body = lang.push_message_nopreview;\n tag = 'unknown_peer';\n }\n\n log('show notify', title, body, icon, obj);\n\n const actions: (Omit & {action: PushNotificationObject['action']})[] = [{\n action: 'mute1d',\n title: lang.push_action_mute1d\n }/* , {\n action: 'push_settings',\n title: lang.push_action_settings || 'Settings'\n } */];\n\n const notificationPromise = ctx.registration.showNotification(title, {\n body,\n icon,\n tag,\n data: obj,\n actions,\n badge,\n silent: obj.custom.silent === '1'\n });\n\n return notificationPromise.catch((error) => {\n log.error('Show notification promise', error);\n });\n}\n\nexport function onPing(payload: ServicePushPingTaskPayload, source?: MessageEventSource) {\n lastPingTime = Date.now();\n localNotificationsAvailable = payload.localNotifications;\n\n if(pendingNotification && source) {\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, source);\n pendingNotification = undefined;\n }\n\n if(payload.lang) {\n getter.set('push_lang', payload.lang);\n }\n\n if(payload.settings) {\n getter.set('push_settings', payload.settings);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Database} from '.';\nimport type {IDBIndex} from '../../lib/files/idb';\n\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\n name: 'tweb',\n version: 7,\n stores: [{\n name: 'session'\n }, {\n name: 'stickerSets'\n }, {\n name: 'users'\n }, {\n name: 'chats'\n }, {\n name: 'dialogs'\n // indexes: [\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\n // const name = `index_${idx}`;\n // const index: IDBIndex = {\n // indexName: name,\n // keyPath: name,\n // objectParameters: {}\n // };\n\n // return index\n // })\n // ]\n }, {\n name: 'messages'\n }]\n};\n\nexport default DATABASE_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WebPushApiManager} from '../mtproto/webPushApiManager';\nimport type {PushNotificationObject} from './push';\nimport type {MyUploadFile} from '../mtproto/apiFileManager';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport type ServicePushPingTaskPayload = {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n};\n\nexport type ServiceRequestFilePartTaskPayload = {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n};\n\nexport type ServiceDownloadTaskPayload = {\n headers: any,\n id: string\n};\n\nexport type ServiceEvent = {\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\n};\n\nexport default class ServiceMessagePort extends SuperMessagePort<{\n // from main thread to service worker\n notificationsClear: () => void,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => void,\n pushPing: (payload: ServicePushPingTaskPayload, source: MessageEventSource, event: MessageEvent) => void,\n hello: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n\n // from mtproto worker\n download: (payload: ServiceDownloadTaskPayload) => void,\n downloadChunk: (payload: {id: ServiceDownloadTaskPayload['id'], chunk: Uint8Array}) => void\n downloadFinalize: (payload: ServiceDownloadTaskPayload['id']) => void,\n downloadCancel: (payload: ServiceDownloadTaskPayload['id']) => void\n}, {\n // to main thread\n pushClick: (payload: PushNotificationObject) => void,\n hello: (payload: void, source: MessageEventSource) => void,\n share: (payload: ShareData) => void,\n\n // to mtproto worker\n requestFilePart: (payload: ServiceRequestFilePartTaskPayload) => Promise | MyUploadFile\n} & ServiceEvent, Master> {\n constructor() {\n super('SERVICE');\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.serviceMessagePort = this);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ServiceDownloadTaskPayload} from './serviceMessagePort';\nimport type ServiceMessagePort from './serviceMessagePort';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport makeError from '../../helpers/makeError';\nimport pause from '../../helpers/schedulers/pause';\n\ntype DownloadType = Uint8Array;\ntype DownloadItem = ServiceDownloadTaskPayload & {\n // transformStream: TransformStream,\n readableStream: ReadableStream,\n // writableStream: WritableStream,\n // writer: WritableStreamDefaultWriter,\n // controller: TransformStreamDefaultController,\n controller: ReadableStreamController,\n promise: CancellablePromise,\n // downloadPromise: Promise,\n used?: boolean\n};\nconst downloadMap: Map = new Map();\nconst DOWNLOAD_ERROR = makeError('UNKNOWN');\nconst DOWNLOAD_TEST = false;\n\n(self as any).downloadMap = downloadMap;\n\ntype A = Parameters['addMultipleEventsListeners']>[0];\n\nconst events: A = {\n download: (payload) => {\n const {id} = payload;\n if(downloadMap.has(id)) {\n return Promise.reject(DOWNLOAD_ERROR);\n }\n\n // const y = (20 * 1024 * 1024) / payload.limitPart;\n // const strategy = new ByteLengthQueuingStrategy({highWaterMark: y});\n // let controller: TransformStreamDefaultController;\n const strategy = new CountQueuingStrategy({highWaterMark: 1});\n // const transformStream = new TransformStream(/* {\n // start: (_controller) => controller = _controller,\n // }, */undefined, strategy, strategy);\n\n // const {readable, writable} = transformStream;\n // const writer = writable.getWriter();\n\n const promise = deferredPromise();\n promise.then(() => {\n setTimeout(() => {\n downloadMap.delete(id);\n }, 5e3);\n }, () => {\n downloadMap.delete(id);\n });\n\n // writer.closed.then(promise.resolve, promise.reject);\n\n let controller: ReadableStreamController;\n const readable = new ReadableStream({\n start: (_controller) => {\n controller = _controller;\n },\n\n cancel: (reason) => {\n promise.reject(DOWNLOAD_ERROR);\n }\n }, strategy);\n\n // writer.closed.catch(noop).finally(() => {\n // log.error('closed writer');\n // onEnd();\n // });\n\n // const downloadPromise = writer.closed.catch(() => {throw DOWNLOAD_ERROR;});\n const item: DownloadItem = {\n ...payload,\n // transformStream,\n readableStream: readable,\n // writableStream: writable,\n // writer,\n // downloadPromise,\n promise,\n controller\n };\n\n downloadMap.set(id, item);\n\n // return downloadPromise;\n return promise.catch(() => {throw DOWNLOAD_ERROR});\n },\n\n downloadChunk: ({id, chunk}) => {\n const item = downloadMap.get(id);\n if(!item) {\n return Promise.reject();\n }\n\n // return item.controller.enqueue(chunk);\n // return item.writer.write(chunk);\n // @ts-ignore\n return item.controller.enqueue(chunk);\n },\n\n downloadFinalize: (id) => {\n const item = downloadMap.get(id);\n if(!item) {\n return Promise.reject();\n }\n\n item.promise.resolve();\n // return item.controller.terminate();\n // return item.writer.close();\n return item.controller.close();\n },\n\n downloadCancel: (id) => {\n const item = downloadMap.get(id);\n if(!item) {\n return;\n }\n\n item.promise.reject();\n // return item.controller.error();\n // return item.writer.abort();\n return item.controller.error();\n }\n};\n\nexport default function handleDownload(serviceMessagePort: ServiceMessagePort) {\n serviceMessagePort.addMultipleEventsListeners(events);\n\n return {\n onDownloadFetch,\n onClosedWindows: cancelAllDownloads\n };\n}\n\nfunction onDownloadFetch(event: FetchEvent, params: string) {\n const promise = pause(100).then(() => {\n const item = downloadMap.get(params);\n if(!item || (item.used && !DOWNLOAD_TEST)) {\n return;\n }\n\n item.used = true;\n const stream = item.readableStream;\n const response = new Response(stream, {headers: item.headers});\n return response;\n });\n\n event.respondWith(promise);\n}\n\nfunction cancelAllDownloads() {\n if(downloadMap.size) {\n for(const [id, item] of downloadMap) {\n // item.writer.abort().catch(noop);\n item.controller.error();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {log, serviceMessagePort} from './index.service';\n\nconst deferred: {[id: string]: ShareData[]} = {};\n\nfunction parseFormData(formData: FormData): ShareData {\n return {\n files: formData.getAll('files') as File[],\n title: formData.get('title') as string,\n text: formData.get('text') as string,\n url: formData.get('url') as string\n };\n}\n\nasync function processShareEvent(formData: FormData, clientId: string) {\n try {\n log('share data', formData);\n const data = parseFormData(formData);\n (deferred[clientId] ??= []).push(data);\n } catch(err) {\n log.warn('something wrong with the data', err);\n }\n};\n\nexport function checkWindowClientForDeferredShare(windowClient: WindowClient) {\n const arr = deferred[windowClient.id];\n if(!arr) {\n return;\n }\n\n delete deferred[windowClient.id];\n\n log('releasing share events to client:', windowClient.id, 'length:', arr.length);\n arr.forEach((data) => {\n serviceMessagePort.invokeVoid('share', data, windowClient);\n });\n}\n\nexport default function onShareFetch(event: FetchEvent, params: string) {\n const promise = event.request.formData()\n .then((formData) => {\n processShareEvent(formData, event.resultingClientId)\n return Response.redirect('..');\n });\n\n event.respondWith(promise);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n \n \n \n\nimport {logger, LogTypes} from '../logger';\nimport {CACHE_ASSETS_NAME, requestCache} from './cache';\nimport onStreamFetch from './stream';\nimport {closeAllNotifications, onPing} from './push';\nimport CacheStorageController from '../files/cacheStorage';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport ServiceMessagePort from './serviceMessagePort';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport {getWindowClients} from '../../helpers/context';\nimport {MessageSendPort} from '../mtproto/superMessagePort';\nimport handleDownload from './download';\nimport onShareFetch, {checkWindowClientForDeferredShare} from './share';\n\nexport const log = logger('SW', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn, true);\nconst ctx = self as any as ServiceWorkerGlobalScope;\n\n \nlet _mtprotoMessagePort: MessagePort;\nexport const getMtprotoMessagePort = () => _mtprotoMessagePort;\n\nconst sendMessagePort = (source: MessageSendPort) => {\n const channel = new MessageChannel();\n serviceMessagePort.attachPort(_mtprotoMessagePort = channel.port1);\n serviceMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\n};\n\nconst sendMessagePortIfNeeded = (source: MessageSendPort) => {\n if(!connectedWindows.size && !_mtprotoMessagePort) {\n log('sending message port for mtproto');\n sendMessagePort(source);\n }\n};\n\nconst onWindowConnected = (source: WindowClient) => {\n log('window connected', source.id, 'windows before', connectedWindows.size);\n\n if(source.frameType === 'none') {\n log.warn('maybe a bugged Safari starting window', source.id);\n return;\n }\n\n log('windows', Array.from(connectedWindows));\n serviceMessagePort.invokeVoid('hello', undefined, source);\n sendMessagePortIfNeeded(source);\n connectedWindows.set(source.id, source);\n\n checkWindowClientForDeferredShare(source);\n};\n\nexport const serviceMessagePort = new ServiceMessagePort();\nserviceMessagePort.addMultipleEventsListeners({\n notificationsClear: closeAllNotifications,\n\n toggleStorages: ({enabled, clearWrite}) => {\n CacheStorageController.toggleStorage(enabled, clearWrite);\n },\n\n pushPing: (payload, source) => {\n onPing(payload, source);\n },\n\n hello: (payload, source) => {\n onWindowConnected(source as any as WindowClient);\n }\n});\n\nconst {\n onDownloadFetch,\n onClosedWindows: onDownloadClosedWindows\n} = handleDownload(serviceMessagePort);\n\n// * service worker can be killed, so won't get 'hello' event\ngetWindowClients().then((windowClients) => {\n log(`got ${windowClients.length} windows from the start`);\n windowClients.forEach((windowClient) => {\n onWindowConnected(windowClient);\n });\n});\n\nconst connectedWindows: Map = new Map();\n(self as any).connectedWindows = connectedWindows;\nlistenMessagePort(serviceMessagePort, undefined, (source) => {\n log('something has disconnected', source);\n const isWindowClient = source instanceof WindowClient;\n if(!isWindowClient || !connectedWindows.has(source.id)) {\n log.warn('it is not a window');\n return;\n }\n\n connectedWindows.delete(source.id);\n log('window disconnected, left', connectedWindows.size);\n if(!connectedWindows.size) {\n log.warn('no windows left');\n\n if(_mtprotoMessagePort) {\n serviceMessagePort.detachPort(_mtprotoMessagePort);\n _mtprotoMessagePort = undefined;\n }\n\n onDownloadClosedWindows();\n }\n});\n \n\nconst onFetch = (event: FetchEvent): void => {\n \n if(\n !IS_SAFARI &&\n event.request.url.indexOf(location.origin + '/') === 0 &&\n event.request.url.match(/\\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\\?.*)?$/)\n ) {\n return event.respondWith(requestCache(event));\n }\n \n\n try {\n // const [, url, scope, params] = /http[:s]+\\/\\/.*?(\\/(.*?)(?:$|\\/(.*)$))/.exec(event.request.url) || [];\n const [scope, params] = event.request.url.split('/').slice(-2);\n\n // log.debug('[fetch]:', event);\n\n switch(scope) {\n case 'stream': {\n onStreamFetch(event, params);\n break;\n }\n\n case 'download': {\n onDownloadFetch(event, params);\n break;\n }\n\n case 'share': {\n onShareFetch(event, params);\n break;\n }\n\n case 'ping': {\n event.respondWith(new Response('pong'));\n break;\n }\n }\n } catch(err) {\n log.error('fetch error', err);\n event.respondWith(new Response('', {\n status: 500,\n statusText: 'Internal Server Error',\n headers: {'Cache-Control': 'no-cache'}\n }));\n }\n};\n\nconst onChangeState = () => {\n ctx.onfetch = onFetch;\n};\n\nctx.addEventListener('install', (event) => {\n log('installing');\n event.waitUntil(ctx.skipWaiting().then(() => log('skipped waiting'))); // Activate worker immediately\n});\n\nctx.addEventListener('activate', (event) => {\n log('activating', ctx);\n event.waitUntil(ctx.caches.delete(CACHE_ASSETS_NAME).then(() => log('cleared assets cache')));\n event.waitUntil(ctx.clients.claim().then(() => log('claimed clients')));\n});\n\n// ctx.onerror = (error) => {\n// log.error('error:', error);\n// };\n\n// ctx.onunhandledrejection = (error) => {\n// log.error('onunhandledrejection:', error);\n// };\n\nctx.onoffline = ctx.ononline = onChangeState;\n\nonChangeState();\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\n }\n}\n","export default function timeout(delay: number): Promise {\n return new Promise(((resolve) => {\n setTimeout(() => {\n resolve(new Response('', {\n status: 408,\n statusText: 'Request timed out.'\n }));\n }, delay);\n }));\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [85], () => (__webpack_require__(8592)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + \"952a9f12a6b3dcdd3f0e\" + \".bundle.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t670: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","IS_MOBILE","undefined","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","getWindowClients","clients","matchAll","includeUncontrolled","type","postMessage","listener","args","err","console","error","notifyServiceWorker","all","then","listeners","length","slice","forEach","bind","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","pause","ms","Promise","resolve","setTimeout","ctx","CACHE_ASSETS_NAME","isCorrectResponse","response","ok","status","timeoutRace","promise","race","reject","noop","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","callback","addNotifyListener","push","value","catch","finally","cancel","Object","assign","blobConstruct","blobParts","mimeType","Array","isArray","safeMimeType","blobSafeMimeType","Blob","MemoryWriter","constructor","size","saveFileCallback","this","bytes","Uint8Array","write","part","offset","endOffset","byteLength","newBytes","set","truncate","trim","finalize","saveToStorage","blob","getParts","replaceParts","parts","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","save","put","getFile","fileName","makeError","saveFile","Response","headers","rejected","timeout","res","clearTimeout","prepareWriting","fileSize","getWriter","static","enabled","clearWrite","map","storage","deferredPromises","Map","cacheStorage","CHUNK_CACHED_TIME_HEADER","setInterval","keys","requests","filtered","timestamp","Date","now","request","url","has","promises","id","ignoreSearch","ignoreVary","mtprotoMessagePort","getMtprotoMessagePort","messagePort","taskId","streams","Stream","info","loadedOffsets","Set","destroy","getId","limitPart","STREAM_CHUNK_UPPER_LIMIT","STREAM_CHUNK_MIDDLE_LIMIT","destroyDebounced","fn","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","_resolve","_reject","apply","debounce","_waitingTimeout","isDebounced","requestFilePartFromWorker","alignedOffset","limit","fromPreload","payload","docId","dcId","JSON","stringify","uploadFile","add","serviceMessagePort","bytesPromise","saveChunkToCache","preloadChunks","requestFilePartFromCache","key","getChunkKey","reader","FileReader","addEventListener","e","target","result","readBlobAs","readBlobAsArrayBuffer","buffer","readBlobAsUint8Array","requestFilePart","preloadChunk","end","alignOffset","requestRange","range","possibleResponse","statusText","responseForSafariFirstRange","Math","ceil","alignLimit","min","ab","location","base","deepEqual","x","y","tx","every","IDB","db","object","fromObject","i","safeAssign","name","storageIsAvailable","join","INSTANCES","isAvailable","createNew","createIndexes","os","store","indexNames","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","indexedDB","version","message","finished","onerror","onsuccess","event","calledNew","onclose","onabort","transaction","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","find","instance","preserve","IDBStorage","storeName","idb","create","concat","getObjectStore","clear","idx","mode","perf","performance","onError","onComplete","results","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","defaultBaseUrl","protocol","hostname","pathname","split","lastPingTime","localNotificationsAvailable","defaults","push_mute_until","push_lang","push_message_nopreview","push_action_mute1d","push_action_settings","push_settings","getter","getDefault","hasOwnProperty","getCached","obj","data","json","badge","muteUntil","settings","lang","nowTime","userInvisibleIsSupported","notificationPromise","icon","peerId","title","body","description","custom","channel_id","chat_id","from_id","tag","nopreview","actions","action","registration","showNotification","silent","fireNotification","waitUntil","notification","clientList","pendingNotification","client","focus","invokeVoid","openWindow","baseUrl","notifications","ServiceMessagePort","super","downloadMap","DOWNLOAD_ERROR","events","download","strategy","CountQueuingStrategy","highWaterMark","controller","readable","ReadableStream","start","_controller","reason","item","readableStream","downloadChunk","chunk","enqueue","downloadFinalize","downloadCancel","onDownloadFetch","params","used","stream","respondWith","cancelAllDownloads","onShareFetch","formData","clientId","files","text","parseFormData","processShareEvent","resultingClientId","redirect","_mtprotoMessagePort","onWindowConnected","source","connectedWindows","frameType","channel","MessageChannel","attachPort","port1","port2","sendMessagePort","sendMessagePortIfNeeded","windowClient","arr","checkWindowClientForDeferredShare","addMultipleEventsListeners","notificationsClear","getNotifications","len","toggleStorages","toggleStorage","pushPing","localNotifications","onPing","hello","onClosedWindows","onDownloadClosedWindows","handleDownload","windowClients","onConnect","onDisconnect","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","WindowClient","detachPort","listenMessagePort","onFetch","origin","file","fetch","clone","replace","random","requestCache","scope","header","chunks","ranges","parseRange","parse","decodeURIComponent","onStreamFetch","onChangeState","onfetch","skipWaiting","claim","onoffline","ononline","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","__webpack_exports__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","splice","d","definition","o","defineProperty","enumerable","f","chunkId","u","miniCssF","g","globalThis","Function","prop","prototype","call","scriptUrl","importScripts","document","currentScript","src","scripts","getElementsByTagName","p","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime","pop"],"sourceRoot":""} \ No newline at end of file diff --git a/public/version b/public/version index 4d75cd3e..f4d3e8a7 100644 --- a/public/version +++ b/public/version @@ -1 +1 @@ -1.7.1 (293) \ No newline at end of file +1.7.1 (294) \ No newline at end of file